|
|
@@ -4,7 +4,7 @@
|
|
|
<view class="content-container">
|
|
|
<!-- 动态字段列表 -->
|
|
|
<view class="content-title">
|
|
|
- <cwg-header :title="t('Documentary.TundManagement.item8')" />
|
|
|
+ <cwg-header :title="t('Documentary.TundManagement.item11')" />
|
|
|
<view class="content-title-btns">
|
|
|
<view class="btn-primary btn-primary1" @click="getCustomLoginDownLogin()">
|
|
|
<cwg-icon icon="crm-plus" :size="16" color="#fff" />
|
|
|
@@ -54,12 +54,12 @@
|
|
|
<view class="account-grid-item">
|
|
|
<view class="sub" v-t="'Label.Balance'"></view>
|
|
|
<view class="num">
|
|
|
- {{ numberFormat(item.dealBalance) }}
|
|
|
+ {{ numberFormat(item.dealBalance || 0) }}
|
|
|
</view>
|
|
|
</view>
|
|
|
<view class="account-grid-item">
|
|
|
<view class="sub" v-t="'Label.Equity'"></view>
|
|
|
- <view class="num">{{ numberFormat(item.dealEquity) }}</view>
|
|
|
+ <view class="num">{{ numberFormat(item.dealEquity || 0) }}</view>
|
|
|
</view>
|
|
|
<view class="account-grid-item">
|
|
|
<view class="sub" v-t="'Documentary.TundManagement.item14'"></view>
|
|
|
@@ -104,7 +104,7 @@
|
|
|
<view class="delete-row">
|
|
|
<view class="delete-item">
|
|
|
<text class="delete-label">{{ t('Documentary.console.item7') }}</text>
|
|
|
- <text class="delete-value">{{ numberFormat(dialogFllowDataDelete.dealBalance) }}</text>
|
|
|
+ <text class="delete-value">{{ numberFormat(dialogFllowDataDelete.dealBalance || 0) }}</text>
|
|
|
</view>
|
|
|
<view class="delete-item">
|
|
|
<text class="delete-label">{{ t('Label.AccountType') }}</text>
|
|
|
@@ -129,7 +129,7 @@
|
|
|
<view class="delete-row">
|
|
|
<view class="delete-item">
|
|
|
<text class="delete-label">{{ t('Label.Credit') }}</text>
|
|
|
- <text class="delete-value">{{ numberFormat(dialogFllowDataDelete.dealCredit) }}</text>
|
|
|
+ <text class="delete-value">{{ numberFormat(dialogFllowDataDelete.dealCredit || 0) }}</text>
|
|
|
</view>
|
|
|
<view class="delete-item">
|
|
|
<text class="delete-label">{{ t('Documentary.tradingCenter.item31') }}</text>
|
|
|
@@ -540,32 +540,8 @@ const userStore = useUserStore();
|
|
|
const userInfo = computed(() => userStore.userInfo);
|
|
|
import { useFilters } from '@/composables/useFilters'
|
|
|
const { numberFormat, numberDecimal } = useFilters()
|
|
|
-const search = ref({
|
|
|
- type: 1
|
|
|
-})
|
|
|
-const getInfoAgentTransfer = computed(() => userInfo.value.customInfo?.agentTransfer)
|
|
|
-const typeMap = [
|
|
|
- { value: 'MT4', text: 'MT4' },
|
|
|
- { value: 'MT5', text: 'MT5' }]
|
|
|
const isZh = computed(() => ['cn', 'zh', 'zhHant'].includes(locale.value));
|
|
|
|
|
|
-// 账户类型映射
|
|
|
-const accountTypeMap = {
|
|
|
- 1: 'AccountType.ClassicAccount',
|
|
|
- 2: 'AccountType.SeniorAccount',
|
|
|
- 5: 'AccountType.SpeedAccount',
|
|
|
- 6: 'AccountType.SpeedAccount',
|
|
|
- 7: 'AccountType.StandardAccount',
|
|
|
- 8: 'AccountType.CentAccount'
|
|
|
-}
|
|
|
-// 拒绝原因映射(示例)
|
|
|
-const reasons = ref({})
|
|
|
-// 动态传入筛选字段配置
|
|
|
-const filterFields = computed(() => [
|
|
|
- { key: 'followPlatform', type: 'select', label: t('Label.Platform'), placeholder: t('placeholder.choose'), options: typeMap, defaultValue: 1 },
|
|
|
- !isSubscribeLoading.value && { key: 'followLogin', type: 'select', label: t('Documentary.console.item28'), placeholder: t('placeholder.choose'), options: SubscribeDownData.value },
|
|
|
- { key: 'date', label: t('placeholder.Start') + ' - ' + t('placeholder.End'), type: 'daterange' }
|
|
|
-])
|
|
|
const formRef = ref(null)
|
|
|
const rules = {
|
|
|
password: {
|
|
|
@@ -831,154 +807,12 @@ const getSubscribeLoginDown = async () => {
|
|
|
const onAgreeChange = (e) => {
|
|
|
dialogFllowDataApply.agree = e.detail.value.length > 0
|
|
|
}
|
|
|
-const searchParams = ref({})
|
|
|
-const tableRef = ref(null)
|
|
|
-const handleSearch = (params) => {
|
|
|
- search.value = params
|
|
|
- nextTick(() => {
|
|
|
- tableRef.value.refreshTable()
|
|
|
- })
|
|
|
-}
|
|
|
|
|
|
-const handleReset = (params) => {
|
|
|
- search.value = params
|
|
|
- nextTick(() => {
|
|
|
- tableRef.value.refreshTable()
|
|
|
- })
|
|
|
-}
|
|
|
-// 当前列配置
|
|
|
-const currentColumns = computed(() => [
|
|
|
- {
|
|
|
- prop: 'dealPlatform',
|
|
|
- label: t('Label.Platform'),
|
|
|
- align: 'center',
|
|
|
- formatter: ({ row }) => row.dealPlatform || '--'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'followLogin',
|
|
|
- label: t('Documentary.TundManagement.item25'),
|
|
|
- align: 'center',
|
|
|
- formatter: ({ row }) => row.followLogin || '--'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'followType',
|
|
|
- label: t('Documentary.TundManagement.item19'),
|
|
|
- align: 'center',
|
|
|
- slot: 'followType' // 使用插槽显示跟单类型(正向/反向/混合)
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'followValue',
|
|
|
- label: t('Documentary.TundManagement.item20'),
|
|
|
- align: 'center',
|
|
|
- slot: 'followValue' // 使用插槽显示跟单数值(手数/比例/--)
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'followLeverage',
|
|
|
- label: t('Label.Leverage'),
|
|
|
- align: 'center',
|
|
|
- formatter: ({ row }) => row.followLeverage ? `1:${row.followLeverage}` : '--'
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'balanceEquity',
|
|
|
- label: t('Label.Balance'),
|
|
|
- align: 'center',
|
|
|
- children: [ // 嵌套子列
|
|
|
- {
|
|
|
- prop: 'followBalance',
|
|
|
- label: t('Label.Equity'),
|
|
|
- align: 'center',
|
|
|
- slot: 'balanceEquity' // 使用插槽显示余额和净值(上下两行)
|
|
|
- }
|
|
|
- ]
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'timeRange',
|
|
|
- label: t('Documentary.TundManagement.item26'),
|
|
|
- align: 'center',
|
|
|
- children: [ // 嵌套子列
|
|
|
- {
|
|
|
- prop: 'startTime',
|
|
|
- label: t('Documentary.TundManagement.item27'),
|
|
|
- align: 'center',
|
|
|
- slot: 'timeRange' // 使用插槽显示开始时间和结束时间(上下两行)
|
|
|
- }
|
|
|
- ]
|
|
|
- },
|
|
|
- {
|
|
|
- prop: 'followProfit',
|
|
|
- label: t('Documentary.TundManagement.item21'),
|
|
|
- align: 'center',
|
|
|
- formatter: ({ row }) => NumberFormat(row.followProfit || 0)
|
|
|
- }
|
|
|
-])
|
|
|
-// 获取状态文本
|
|
|
-const getStatusText = (row: any) => {
|
|
|
- const status = row.status
|
|
|
- // 根据不同记录类型处理状态
|
|
|
- if (search.value.type === 1) {
|
|
|
- if (status === 1) return t('State.ToBeProcessed')
|
|
|
- if (status === 2 && row.accountStatus === 2) return t('State.Completed')
|
|
|
- if (status === 2 && (row.accountStatus === 1 || !row.accountStatus)) return t('State.InTheProcessing')
|
|
|
- if (status === 3) return t('State.Refused')
|
|
|
- } else if (search.value.type === 2) {
|
|
|
- if (status === 1) return t('State.ToBeProcessed')
|
|
|
- if (status === 2 && row.leverageStatus === 2) return t('State.Completed')
|
|
|
- if (status === 2 && row.leverageStatus === 1) return t('State.InTheProcessing')
|
|
|
- if (status === 3) return t('State.Refused')
|
|
|
- } else if (search.value.type === 3 || search.value.type === 5) {
|
|
|
- if (status === 1) return t('State.ToBeProcessed')
|
|
|
- if (status === 2 && row.withdrawStatus === 2 && row.depositStatus === 2) return t('State.Completed')
|
|
|
- if (status === 2 && (row.withdrawStatus === 1 || row.depositStatus === 1)) return t('State.InTheProcessing')
|
|
|
- if (status === 3 || row.withdrawStatus === 3 || row.depositStatus === 3) return t('State.Refused')
|
|
|
- } else {
|
|
|
- // 活动申请等
|
|
|
- if (status === 1) return t('State.ToBeProcessed')
|
|
|
- if (status === 2) return t('State.Completed')
|
|
|
- if (status === 3) return t('State.Refused')
|
|
|
- }
|
|
|
- return ''
|
|
|
-}
|
|
|
-// 获取状态样式类
|
|
|
-const getStatusClass = (status: number) => {
|
|
|
- const classMap: Record<number, string> = {
|
|
|
- 1: 'status-pending',
|
|
|
- 2: 'status-success',
|
|
|
- 3: 'status-processing',
|
|
|
- 4: 'status-danger'
|
|
|
- }
|
|
|
- return classMap[status] || ''
|
|
|
-}
|
|
|
-// 获取账户类型文本
|
|
|
-const getAccountTypeText = (type: number) => {
|
|
|
- const key = accountTypeMap[type as keyof typeof accountTypeMap]
|
|
|
- return key ? t(key) : '--'
|
|
|
-}
|
|
|
-// 格式化数字
|
|
|
-const formatNumber = (value: string | number) => {
|
|
|
- if (!value) return '--'
|
|
|
- const num = Number(value)
|
|
|
- return isNaN(num) ? '--' : num.toFixed(2)
|
|
|
-}
|
|
|
-// 格式化备注
|
|
|
-const formatNote = (approveDesc: string) => {
|
|
|
- if (!approveDesc) return '--'
|
|
|
- const reason = reasons.value[approveDesc as keyof typeof reasons.value]
|
|
|
- if (reason) {
|
|
|
- return isZh.value ? reason.content : reason.enContent
|
|
|
- }
|
|
|
- return approveDesc
|
|
|
-}
|
|
|
// 单位类型
|
|
|
function groupCurrency(type) {
|
|
|
const map = { GBP: ': £', USD: ': $', EUR: ': €', USC: ': ¢' }
|
|
|
return map[type] || ': $'
|
|
|
}
|
|
|
-// 单位类型
|
|
|
-function groupCurrency1(type) {
|
|
|
- const map = { GBP: '£', USD: '$', EUR: '€', USC: '¢' }
|
|
|
- return map[type] || '$'
|
|
|
-}
|
|
|
-
|
|
|
|
|
|
// 账户类型
|
|
|
function groupTypeName(type) {
|
|
|
@@ -1469,15 +1303,19 @@ onMounted(() => {
|
|
|
|
|
|
|
|
|
.fllow-title {
|
|
|
- margin: px2rpx(10) 0 px2rpx(16);
|
|
|
- padding-left: px2rpx(8);
|
|
|
- border-left: 4px solid #dc3545;
|
|
|
- border-bottom: none;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ border-bottom: 1px solid #eee;
|
|
|
+ padding-bottom: 10px;
|
|
|
+ margin-bottom: 10px;
|
|
|
|
|
|
.title {
|
|
|
- font-size: px2rpx(16);
|
|
|
- font-weight: 600;
|
|
|
- color: #343a40;
|
|
|
+ font-weight: bold;
|
|
|
+ color: #333;
|
|
|
+ padding-left: 8px;
|
|
|
+ border-left: 4px solid #eb3f57;
|
|
|
+ font-size: 16px;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -1486,8 +1324,13 @@ onMounted(() => {
|
|
|
}
|
|
|
|
|
|
.delete-row {
|
|
|
- display: flex;
|
|
|
+ display: grid;
|
|
|
+ grid-template-columns: 1fr 1fr;
|
|
|
gap: px2rpx(12);
|
|
|
+
|
|
|
+ @media screen and (max-width: 768px) {
|
|
|
+ grid-template-columns: 1fr;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
.delete-item {
|