diff --git a/src/api/modules/capital/rechangeChanl.ts b/src/api/modules/capital/rechangeChanl.ts index 63189d4..196842b 100644 --- a/src/api/modules/capital/rechangeChanl.ts +++ b/src/api/modules/capital/rechangeChanl.ts @@ -16,3 +16,13 @@ export const editChannel = (params: any) => { export const delChannel = (params: any) => { return request.post('/channel/delChannel', { ...params }) } + +// 获取用户充值渠道列表 +export const getRechargeChannelList = () => { + return request.get('/user/regchargeChannel') +} + +// 用户充值 +export const rechargeApi = (params: any) => { + return request.post('/user/recharge', { ...params }) +} diff --git a/src/api/modules/user.ts b/src/api/modules/user.ts index 9b79257..af5edde 100644 --- a/src/api/modules/user.ts +++ b/src/api/modules/user.ts @@ -61,3 +61,28 @@ export async function logoutApi(params: { device_no: string }) { export async function sendCodeApi(params: SendCodeParams) { return request.post('/sendCode', params); } + +/** + * 调整用户金额 + * @param params 调整金额参数(目标用户ID/调整金额) + * @returns Promise 调整成功返回true + */ +export async function updateCapitalApi(params: { target_user_id: number; amount: string }) { + return request.post('/user/updateCapital', params); +} + +/** + * 修改用户信息 + * @param params 修改用户参数(用户ID/风控模板ID/手续费模板ID/用户名/是否升级/状态) + * @returns Promise 修改成功返回true + */ +export async function editUserApi(params: { + user_id: number; + risk_control_id?: string | number; + fee_setting_id?: string | number; + username?: string; + is_levelup?: number | null; + status?: number; +}) { + return request.post('/user/editUser', params); +} diff --git a/src/assets/styles/element.scss b/src/assets/styles/element.scss new file mode 100644 index 0000000..7a47181 --- /dev/null +++ b/src/assets/styles/element.scss @@ -0,0 +1,8 @@ +.el-drawer__body { + display: flex; + flex-direction: column; + padding: 20px; + overflow: hidden; + height: 100%; + max-height: 100%; +} \ No newline at end of file diff --git a/src/assets/styles/global.scss b/src/assets/styles/global.scss index 301b604..cd314a3 100644 --- a/src/assets/styles/global.scss +++ b/src/assets/styles/global.scss @@ -1,5 +1,6 @@ @use './user.scss'; @use './system.scss'; +@use './element.scss'; * { margin: 0; diff --git a/src/components/common/Search.vue b/src/components/common/Search.vue index f39d670..f6863ac 100644 --- a/src/components/common/Search.vue +++ b/src/components/common/Search.vue @@ -3,60 +3,38 @@ @@ -137,20 +115,34 @@ const handleBlur = () => { .el-form { display: flex; + flex-wrap: wrap; width: 100%; - - .el-form-item { - flex: 1 1 auto; - } + row-gap: 8px; } :deep(.el-form-item) { margin-bottom: 0; margin-right: 16px; + flex: 1 1 auto; + min-width: 200px; } :deep(.el-button) { margin-left: 8px; + white-space: nowrap; + } + + :deep(.el-form-item:last-child) { + display: flex; + width: fit-content; + flex: 0 0 auto; + flex-wrap: wrap; + gap: 8px; + + .el-form-item__content { + justify-content: flex-start; + row-gap: 4px; + } } } \ No newline at end of file diff --git a/src/components/common/Table.vue b/src/components/common/Table.vue index cd9a87e..7b2147f 100644 --- a/src/components/common/Table.vue +++ b/src/components/common/Table.vue @@ -142,7 +142,7 @@ defineExpose({ diff --git a/src/components/layout/Header.vue b/src/components/layout/Header.vue index 1d79f70..84d2add 100644 --- a/src/components/layout/Header.vue +++ b/src/components/layout/Header.vue @@ -21,8 +21,8 @@ @@ -249,7 +249,7 @@ const dialogVisible = ref(false) const dialogTitle = ref('') const dialogType = ref('add') -const accountList = ref([]) +const accountList = ref([]) const getAccoundList = async () => { const res = await getAllAccount({ username: '' }) console.log(res) @@ -432,6 +432,18 @@ const handleSetting = (id: string) => { dialogType.value = 'setting' } +/** + * @description: 修改杠杆 + */ +const handleChangeToLeverage = () => { + // 切换到杠杆表单时,设置默认值为当前账户的杠杆值 + const currentAccount = accountList.value.find((item: any) => item.account_id === account_id) + if (currentAccount?.wallets_trade?.lever) { + subAccountForm.value.leverage = currentAccount.wallets_trade.lever + } + dialogType.value = 'leverage' +} + /** * @description: 复制推广二维码和推广链接方法 */ diff --git a/src/views/order/history/index.vue b/src/views/order/history/index.vue index 2760caa..5192a2f 100644 --- a/src/views/order/history/index.vue +++ b/src/views/order/history/index.vue @@ -35,18 +35,27 @@ import { search, tradeOrderTableColumns, positionOrderTableColumns } from './opt import { getCustomTradeOrderListApi, getSubAccountListApi } from '@/api/modules/agent/customerTradeOrder' // 本地存储 import { getStorage } from '@/utils/storage' +// 日期处理 +import dayjs from 'dayjs' // 公用方法 /** * @description: 定义搜索数据 */ +// 获取近一周的时间范围 +const dateRange = { + start: dayjs().subtract(7, 'day').format('YYYY-MM-DD'), + end: dayjs().format('YYYY-MM-DD'), +} const searchForm = ref({ accountName: '', orderId: '2', tradeType: '', - startTime: '', - endTime: '', + start_time: dateRange.start, + end_time: dateRange.end, + startTime: dateRange.start, + endTime: dateRange.end, subAccountName: '', }) const searchOptions = ref(search) @@ -78,8 +87,8 @@ const getCustomerTradeOrderList = async () => { account_id: searchForm.value.subAccountName, order_no: '', type: searchForm.value.tradeType, - start_time: '', - end_time: '', + start_time: dateRange.start, + end_time: dateRange.end, } console.log(params) const data: any = await getCustomTradeOrderListApi(params) @@ -94,6 +103,7 @@ const getCustomerTradeOrderList = async () => { quantity: item.num, openPrice: item.build_price, closePrice: item.close_price, + closeProfitLoss: item.profit_loss, amount: item.amount, createdTime: item.created_at, })) @@ -147,8 +157,10 @@ const handleReset = () => { accountName: '', orderId: '', tradeType: '', - startTime: '', - endTime: '', + startTime: dateRange.start, + endTime: dateRange.end, + start_time: dateRange.start, + end_time: dateRange.end, subAccountName: '', } getCustomerTradeOrderList() diff --git a/src/views/order/history/options.ts b/src/views/order/history/options.ts index da425c3..a2fc802 100644 --- a/src/views/order/history/options.ts +++ b/src/views/order/history/options.ts @@ -110,7 +110,7 @@ export const positionOrderTableColumns = [ //平仓价格 { label: '平仓价格', prop: 'closePrice' }, //金额 - { label: '金额', prop: 'amount' }, + { label: '平仓盈亏', prop: 'closeProfitLoss', align: 'center' as const, width: '150px' }, //创建时间 { label: '创建时间', prop: 'createdTime' }, ] \ No newline at end of file diff --git a/src/views/profile/agent/index.vue b/src/views/profile/agent/index.vue index 068f599..69f2f09 100644 --- a/src/views/profile/agent/index.vue +++ b/src/views/profile/agent/index.vue @@ -1,99 +1,107 @@ @@ -113,6 +121,8 @@ import { search, tableColumns, marginRatioTableColumns, commissionRatioFormItem // 接口 import { getSelfVarietyPointDiffConfigApi, editCustomerApi } from '@/api/modules/agent/customerList' +import { updateCapitalApi, editUserApi } from '@/api/modules/user' +import { getFeeTemplateOptionsApi, getRiskTemplateOptionsApi } from '@/api/modules/account/client' import { getAgentListApi } from '@/api/modules/profile/agent.ts' // 公用方法 @@ -212,6 +222,59 @@ const commissionRatioFormRules = { const commissionRatioFormItemOptions = ref(commissionRatioFormItem) const selectId = ref('') +/** + * @description 定义修改客户弹窗数据 + */ +const editCustomerVisible = ref(false) +const editCustomerFormRef = ref() +const editCustomerUserId = ref(0) +const editCustomerForm = ref({ + feeSettingId: '', + riskControlId: '', + username: '', + status: 1, + roleId: 0, +}) +const editCustomerRules = { + feeSettingId: [{ required: true, message: '请选择手续费模板', trigger: 'change' }], + riskControlId: [{ required: true, message: '请选择风控模板', trigger: 'change' }], + status: [{ required: true, message: '请选择状态', trigger: 'change' }], +} +const feeTemplateOptions = ref([]) +const riskTemplateOptions = ref([]) +const templateOptionsFetched = ref(false) + +/** + * @description 定义调整金额弹窗数据 + */ +const adjustAmountVisible = ref(false) +const adjustAmountFormRef = ref() +const adjustUserId = ref(0) +const adjustAmountForm = ref({ + username: '', + currency: '', + currentBalance: '', + adjustAmount: '', + afterBalance: '', +}) +const adjustAmountRules = { + adjustAmount: [ + { required: true, message: '请输入调整金额', trigger: 'blur' }, + { + validator: (rule: any, value: any, callback: any) => { + if (value === '' || value === null || value === undefined) { + callback(new Error('请输入调整金额')) + } else if (!/^-?\d+(\.\d{1,5})?$/.test(value)) { + callback(new Error('请输入有效的金额格式,最多五位小数')) + } else { + callback() + } + }, + trigger: 'blur', + }, + ], +} + /** * @description: 角色映射方法 */ @@ -355,10 +418,10 @@ const handleGetSubList = async (row: any) => { children: item.role_id === 5 ? [ - { - hasChildren: true, - }, - ] + { + hasChildren: true, + }, + ] : undefined, })) } @@ -435,6 +498,131 @@ const handleClose = () => { /** * @description: 定义弹窗表格方法 */ + +/** + * @description 调整金额相关方法 + */ +// 打开调整金额弹窗 +const handleAdjustAmount = (row: any) => { + adjustAmountVisible.value = true + adjustUserId.value = row.userId + const balance = row.balance || row.wallet_capital?.amount || '0' + adjustAmountForm.value = { + username: row.accountName, + currency: 'USDT', + currentBalance: balance, + adjustAmount: '', + afterBalance: balance, + } +} + +// 调整金额输入变化时计算调整后余额 +const handleAdjustAmountInput = () => { + const currentBalance = parseFloat(adjustAmountForm.value.currentBalance) || 0 + const adjustAmount = parseFloat(adjustAmountForm.value.adjustAmount) || 0 + const afterBalance = currentBalance + adjustAmount + adjustAmountForm.value.afterBalance = afterBalance.toFixed(5) +} + +// 提交调整金额 +const handleAdjustAmountSubmit = async () => { + try { + await adjustAmountFormRef.value?.validate() + await updateCapitalApi({ + target_user_id: adjustUserId.value, + amount: adjustAmountForm.value.adjustAmount, + }) + await getCustomerList() + adjustAmountVisible.value = false + } catch (err) { + console.error('调整金额表单验证失败', err) + } +} + +// 取消调整金额 +const handleAdjustAmountCancel = () => { + adjustAmountVisible.value = false +} + +// 关闭调整金额弹窗 +const handleAdjustAmountClose = () => { + adjustAmountVisible.value = false +} + +/** + * @description 修改客户相关方法 + */ +// 获取模板选项 +const getTemplateOptions = async () => { + if (templateOptionsFetched.value) return + + try { + const [feeTemplateRes, riskTemplateRes] = await Promise.all([ + getFeeTemplateOptionsApi(), + getRiskTemplateOptionsApi(), + ]) + + feeTemplateOptions.value = Object.entries(feeTemplateRes as Record).map( + ([label, value]) => ({ + label, + value, + }), + ) + riskTemplateOptions.value = Object.entries(riskTemplateRes as Record).map( + ([label, value]) => ({ + label, + value, + }), + ) + + templateOptionsFetched.value = true + } catch (error) { + console.error('获取模板选项失败:', error) + } +} + +// 打开修改客户弹窗 +const handleEditCustomer = async (row: any) => { + await getTemplateOptions() + editCustomerVisible.value = true + editCustomerUserId.value = row.userId + editCustomerForm.value = { + feeSettingId: row.feeSettingId || '', + riskControlId: row.riskControlId || '', + username: row.accountName || '', + status: row.status === '正常' ? 1 : 2, + roleId: row.role_id, + } +} + +// 提交修改客户 +const handleEditCustomerSubmit = async () => { + try { + await editCustomerFormRef.value?.validate() + await editUserApi({ + user_id: editCustomerUserId.value, + fee_setting_id: editCustomerForm.value.feeSettingId, + risk_control_id: editCustomerForm.value.riskControlId, + username: editCustomerForm.value.username, + is_levelup: null, + status: editCustomerForm.value.status, + }) + await getCustomerList() + editCustomerVisible.value = false + } catch (err) { + console.error('修改客户表单验证失败', err) + } +} + +// 取消修改客户 +const handleEditCustomerCancel = () => { + editCustomerVisible.value = false +} + +// 关闭修改客户弹窗 +const handleEditCustomerClose = () => { + editCustomerVisible.value = false +} diff --git a/src/views/profile/business/options.ts b/src/views/profile/business/options.ts index 4b1d37c..90ca9d3 100644 --- a/src/views/profile/business/options.ts +++ b/src/views/profile/business/options.ts @@ -57,45 +57,35 @@ export const marketTableColumns = [ //做市商添加配置 export const marketFormItem = [ - //邮箱或手机号 - { prop: 'phoneOrEmail', label: '', type: 'slot' as const, slotName: 'phoneOrEmail' }, - //账户名称 - { label: '账户名称', prop: 'accountName', type: 'input' as const, placeholder: '请输入账户名称' }, - //级别 - { label: '级别', prop: 'level', type: 'select' as const, placeholder: '请选择级别' }, - //所属上级 - { - label: '所属上级', - prop: 'parentAccountName', - type: 'select' as const, - placeholder: '请选择所属上级账户名称', - }, - // 风控模板 - { - label: '风控模板', - prop: 'riskControlTemplate', - type: 'select' as const, - placeholder: '请选择风控模板', - }, - //头寸 - { label: '头寸', prop: 'positionRatio', type: 'input' as const, placeholder: '请输入头寸' }, - //手续费 - { label: '手续费', prop: 'commissionRatio', type: 'input' as const, placeholder: '请输入手续费' }, + //邮箱或手机号 + { prop: 'phoneOrEmail', label: '', type: 'slot' as const, slotName: 'phoneOrEmail' }, + //账户名称 + { label: '账户名称', prop: 'accountName', type: 'input' as const, placeholder: '请输入账户名称', }, + //级别 + { label: '级别', prop: 'level', type: 'select' as const, placeholder: '请选择级别' }, + //所属上级 + { label: '所属上级', prop: 'parentAccountName', type: 'select' as const, placeholder: '请选择所属上级账户名称', }, + // 风控模板 + { label: '风控模板', prop: 'riskControlTemplate', type: 'select' as const, placeholder: '请选择风控模板' }, + //头寸 + { label: '头寸', prop: 'positionRatio', type: 'input' as const, placeholder: '请输入头寸', }, + //手续费 + { label: '手续费', prop: 'commissionRatio', type: 'input' as const, placeholder: '请输入手续费', }, ] // 国家码选项 interface CountryItem { - name: string - code: string + name: string + code: string } export const countryOptions = ref([ - { name: '中国', code: '+86' }, - { name: '中国台湾', code: '+886' }, - { name: '中国香港', code: '+852' }, - { name: '中国澳门', code: '+853' }, - { name: '韩国', code: '+82' }, - { name: '美国', code: '+1' }, - { name: '新加坡', code: '+65' }, + { name: '中国', code: '+86' }, + { name: '中国台湾', code: '+886' }, + { name: '中国香港', code: '+852' }, + { name: '中国澳门', code: '+853' }, + { name: '韩国', code: '+82' }, + { name: '美国', code: '+1' }, + { name: '新加坡', code: '+65' } ]) //编辑点差表格列配置 diff --git a/src/views/profile/personalCenter/index.vue b/src/views/profile/personalCenter/index.vue index 3ab914b..653c241 100644 --- a/src/views/profile/personalCenter/index.vue +++ b/src/views/profile/personalCenter/index.vue @@ -377,6 +377,8 @@ const handleEditConfirm = async () => { const params: EditUsernameParams = { username: editForm.value }; await editUsernameApi(params); userInfo.username = editForm.value; + // 更新全局用户信息 + userStore.updateUserInfo({ username: editForm.value }); } if (editField.value === 'mobile') { const mobile = editForm.countryCode + editForm.value; diff --git a/src/views/profile/user/index.vue b/src/views/profile/user/index.vue index 822a617..4fe9eec 100644 --- a/src/views/profile/user/index.vue +++ b/src/views/profile/user/index.vue @@ -23,6 +23,9 @@ 修改 + + 调整金额 + @@ -92,6 +95,38 @@ + + + + + + + + + + + + + + + + + + + + +