Browse Source

Merge branch 'zhangyong/feature-20260402144402-现金4期' into milestone-20260402-现金4期

jiangcheng/feature-20260402142510-现金四期
ZhangYong 5 days ago
parent
commit
0fb98e0466
  1. 10
      src/api/cash/cash.js
  2. 28
      src/assets/SvgIcons/wallet_management.svg
  3. 2
      src/components/locales/lang/en.js
  4. 4
      src/components/locales/lang/zh-CN.js
  5. 0
      src/static/common.js
  6. 4
      src/utils/menuUtils.js
  7. 3
      src/views/moneyManage/financialAccount/performanceAttribution.vue
  8. 309
      src/views/walletManage/WalletBalance.vue
  9. 257
      src/views/walletManage/components/WalletDetailTemplate.vue
  10. 2
      src/views/walletManage/walletDetail/BJWallet.vue
  11. 2
      src/views/walletManage/walletDetail/CAWallet.vue
  12. 3
      src/views/walletManage/walletDetail/HKWallet.vue
  13. 2
      src/views/walletManage/walletDetail/MyWallet.vue
  14. 2
      src/views/walletManage/walletDetail/SGWalletCM.vue
  15. 2
      src/views/walletManage/walletDetail/SGWalletHC.vue
  16. 2
      src/views/walletManage/walletDetail/THWalletHA.vue
  17. 2
      src/views/walletManage/walletDetail/THWalletHS.vue
  18. 2
      src/views/walletManage/walletDetail/VNWallet.vue

10
src/api/cash/cash.js

@ -0,0 +1,10 @@
import http from '@/util/http.js'
// 查询钱包记录
export const selectWalletRecords = (data) => {
return http({
method: 'POST',
url: '/cashCollection/selectWalletRecords',
data
})
}

28
src/assets/SvgIcons/wallet_management.svg

@ -1 +1,27 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1775116665367" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5512" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M512 512m-512 0a512 512 0 1 0 1024 0 512 512 0 1 0-1024 0Z" fill="#E84F4F" p-id="5513"></path><path d="M486.810394 1023.36001L228.926423 766.848018 800.467493 295.085389 1023.912001 517.191919c-2.805956 280.355619-230.904392 506.778082-511.928001 506.778081-8.445868 0-16.837737-0.215997-25.181606-0.61799l0.008 0.008z" fill="#D14747" p-id="5514"></path><path d="M268.16181 270.889767h485.350416c31.909501 0 57.781097 25.867596 57.781098 57.781098V656.089749c0 31.909501-25.867596 57.781097-57.781098 57.781097H268.16181c-31.909501 0-57.781097-25.867596-57.781097-57.781097V328.668865c0.002-31.911501 25.871596-57.779097 57.781097-57.779098z" fill="#F5C013" p-id="5515"></path><path d="M271.98975 288.785488L740.256433 246.196153l34.151467 438.42315-490.730332 40.343369-11.693818-436.181184 0.006 0.004z" fill="#E6E6E6" p-id="5516"></path><path d="M272.363744 293.871408l486.4004-12.261808 16.02575 408.105623-490.730332 40.33737-11.695818-436.181185z" fill="#FFFFFF" p-id="5517"></path><path d="M210.382713 328.662865h564.321182c20.125686 0 36.589428 16.463743 36.589429 36.589428V735.048515c0 20.125686-16.463743 36.589428-36.589429 36.589428h-527.731754c-20.125686 0-36.589428-16.463743-36.589428-36.589428V328.662865z" fill="#FFD630" p-id="5518"></path><path d="M801.625475 340.544679c5.991906 6.523898 9.667849 15.211762 9.667849 24.713614v369.796222c0 20.131685-16.463743 36.589428-36.589429 36.589428H246.980141c-10.277839 0-19.599694-4.293933-26.26759-11.177825l580.920923-419.923439h-0.007999v0.002z" fill="#FFC919" p-id="5519"></path><path d="M210.382713 735.048515V365.258293h546.495461c11.097827 0 20.183685 9.077858 20.183684 20.183684v329.430853c0 11.097827-9.077858 20.183685-20.183684 20.183685H210.382713v-0.008z" fill="#F5BE18" p-id="5520"></path><path d="M210.382713 719.174763V381.132045h531.463696c11.729817 0 21.325667 8.30187 21.325666 18.449712v301.141294c0 10.149841-9.59585 18.443712-21.325666 18.443712H210.382713v0.008z" fill="#FFD630" p-id="5521"></path><path d="M700.127061 474.530585h110.516273c10.011844 0 18.197716 8.243871 18.197715 18.197716v65.684974c0 9.947845-8.243871 18.197716-18.197715 18.197715h-110.516273c-28.017562 0-51.033203-22.967641-51.033203-51.033202v-0.008c0-28.067561 22.959641-51.033203 51.033203-51.033203v-0.006z" fill="#FFF490" p-id="5522"></path><path d="M704.214997 526.305776m-31.115514 0a31.115514 31.115514 0 1 0 62.231027 0 31.115514 31.115514 0 1 0-62.231027 0Z" fill="#F5BE18" p-id="5523"></path><path d="M704.214997 526.305776m-25.433603 0a25.433603 25.433603 0 1 0 50.867205 0 25.433603 25.433603 0 1 0-50.867205 0Z" fill="#E6E6E6" p-id="5524"></path></svg>
<svg width="31" height="31" viewBox="0 0 31 31" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.74612 0.375959C11.6259 0.0545255 15.0739 -0.278254 20.0466 0.375959C25.0192 1.03017 28.1825 3.79754 29.2367 7.13376C30.2909 10.47 30.2144 16.9942 29.826 20.258C29.507 24.1645 27.2331 28.7886 21.7954 29.5942C16.3576 30.3997 9.67485 30.1849 6.99417 29.2304C4.3135 28.2758 0.763355 26.2434 0.299165 20.5505C-0.165026 14.8577 -0.471763 7.2173 2.42497 4.11929C4.43352 1.73288 7.86631 0.697393 9.74612 0.375959Z" fill="#FFE2F4"/>
<g filter="url(#filter0_d_2049_43228)">
<path d="M22.1043 26.6488H7.99325C7.54074 26.649 7.09261 26.5594 6.67449 26.3852C6.25636 26.211 5.87643 25.9555 5.55638 25.6334C5.23634 25.3113 4.98246 24.9288 4.80924 24.5079C4.63603 24.0869 4.54687 23.6358 4.54688 23.1801V6.90912C4.54687 6.45348 4.63603 6.00231 4.80924 5.58137C4.98246 5.16044 5.23634 4.77799 5.55638 4.45587C5.87643 4.13376 6.25636 3.87828 6.67449 3.70405C7.09261 3.52982 7.54074 3.44024 7.99325 3.44043H20.2205L25.5449 8.73726V23.1801C25.5446 24.0992 25.1821 24.9806 24.5371 25.6309C23.892 26.2812 23.0171 26.6473 22.1043 26.6488Z" fill="url(#paint0_linear_2049_43228)"/>
</g>
<path d="M21.0781 12.1216H9.74479C9.3766 12.1216 9.07812 12.4201 9.07812 12.7882V20.1216C9.07812 20.4898 9.3766 20.7882 9.74479 20.7882H21.0781C21.4463 20.7882 21.7448 20.4898 21.7448 20.1216V12.7882C21.7448 12.4201 21.4463 12.1216 21.0781 12.1216Z" stroke="white" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M21.7422 14.4546H15.7422V18.1213H21.7422V14.4546Z" stroke="white" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M21.7422 13.7881V18.7881" stroke="white" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M18.0781 12.1216C18.0781 10.4549 16.9115 10.1216 16.4115 10.1216C15.3004 10.1216 12.7781 10.1216 11.5781 10.1216C10.3781 10.1216 10.0781 11.0768 10.0781 11.5544V12.1216" stroke="white" stroke-width="1.33333" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M18.5781 16.7881C18.8543 16.7881 19.0781 16.5642 19.0781 16.2881C19.0781 16.0119 18.8543 15.7881 18.5781 15.7881C18.302 15.7881 18.0781 16.0119 18.0781 16.2881C18.0781 16.5642 18.302 16.7881 18.5781 16.7881Z" fill="white"/>
<path d="M20.0195 3.44043V7.76966C20.0195 8.08702 20.1465 8.39137 20.3726 8.61577C20.5987 8.84017 20.9053 8.96624 21.2251 8.96624H25.5453V8.85939L20.0195 3.44043Z" fill="#EED2FF"/>
<defs>
<filter id="filter0_d_2049_43228" x="3.54688" y="2.44043" width="23" height="25.2085" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset/>
<feGaussianBlur stdDeviation="0.5"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.0745098 0 0 0 0 0.74902 0 0 0 0 0.52549 0 0 0 0.3 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_2049_43228"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_2049_43228" result="shape"/>
</filter>
<linearGradient id="paint0_linear_2049_43228" x1="36.044" y1="15.0446" x2="12.9513" y2="-5.84872" gradientUnits="userSpaceOnUse">
<stop stop-color="#4C02B3"/>
<stop offset="1" stop-color="#E992FF"/>
</linearGradient>
</defs>
</svg>

2
src/components/locales/lang/en.js

@ -424,6 +424,7 @@ export default {
// Common List Fields
common_list: {
marketName: "Region",
id: "No.",
originalChinese: "Chinese",
english: "English",
@ -941,6 +942,7 @@ export default {
other: "Other",
currentBalance: "Current Balance",
transactionType: "Type",
transactionCurrency: "Currency",
transactionDesc: "Desc",
transactionOrderNo: "Order No.",
transactionStatus: "Status",

4
src/components/locales/lang/zh-CN.js

@ -424,6 +424,7 @@ export default {
// 通用列表字段组
common_list: {
marketName: "所属地区",
id: "序号",
originalChinese: "原始中文",
english: "英文",
@ -948,9 +949,10 @@ export default {
other: "其他",
currentBalance: "当前余额",
transactionType: "交易类型",
transactionCurrency: "交易币种",
transactionDesc: "交易说明",
transactionOrderNo: "交易单号",
transactionStatus: "交易状态",
transactionStatus: "状态",
exceptionData: "异常数据",
time: "时间",
market: {

0
src/static/common.js

4
src/utils/menuUtils.js

@ -92,8 +92,8 @@ export const getRoutePath = (menu) => {
"152": "/walletManage/walletDetail", // 钱包明细
"153": "/walletManage/walletDetail/hkWallet", // 香港钱包
"154": "/walletManage/walletDetail/sgWalletHC", // 新加坡HC钱包
"155": "/walletManage/walletDetail/sgWalletCM", // 新加坡CM钱包
"156": "/walletManage/walletDetail/myWallet", // 马来西亚钱包
"156": "/walletManage/walletDetail/sgWalletCM", // 新加坡CM钱包
"155": "/walletManage/walletDetail/myWallet", // 马来西亚钱包
"157": "/walletManage/walletDetail/caWallet", // 加拿大钱包
"158": "/walletManage/walletDetail/thWalletHS", // 泰国HS钱包
"159": "/walletManage/walletDetail/thWalletHA", // 泰国HA钱包

3
src/views/moneyManage/financialAccount/performanceAttribution.vue

@ -622,6 +622,7 @@ onMounted( async() => {
cursor: pointer;
border: none;
background-color: #7349ad;
margin-left: auto;
}
.table-card {
@ -662,7 +663,7 @@ onMounted( async() => {
position: relative;
width: 100%;
height: 50px; /* Set a fixed height to make diagonal line work well */
background: linear-gradient(to bottom right, transparent 49.5%, #dcdfe6 49.5%, #dcdfe6 50.5%, transparent 50.5%);
background: linear-gradient(to top right, transparent 49.5%, #dcdfe6 49.5%, #dcdfe6 50.5%, transparent 50.5%);
}
.diagonal-header .top-right {
position: absolute;

309
src/views/walletManage/WalletBalance.vue

@ -6,7 +6,7 @@ import { findMenuById, permissionMapping } from "@/utils/menuTreePermission.js"
const adminStore = useAdminStore()
const { adminData, menuTree, flag } = storeToRefs(adminStore)
// flag()
watch(flag, (newFlag, oldFlag) => {
watch(flag, (newFlag, oldFlag) => {
// flag
if (newFlag !== oldFlag) {
console.log('员工数据flag状态改变,重新加载数据', newFlag)
@ -211,31 +211,31 @@ const cellClick = function (row, column) {
console.log('cellClick', column)
const walletId = propToWalletId[column.property];
const propToMarketName = {
historyGold: t('clientCount.market.historyGold'),
hkGold: t('clientCount.market.hkGold'),
sgHcGold: t('clientCount.market.sgHcGold'),
myGold: t('clientCount.market.myGold'),
sgGold: t('clientCount.market.sgCmGold'),
caGold: t('clientCount.market.caGold'),
thHsGold: t('clientCount.market.thHsGold'),
thHaGold: t('clientCount.market.thHaGold'),
vnGold: t('clientCount.market.vnGold'),
bjGold: t('clientCount.market.bjGold')
historyGold: t('clientCount.market.historyGold'),
hkGold: t('clientCount.market.hkGold'),
sgHcGold: t('clientCount.market.sgHcGold'),
myGold: t('clientCount.market.myGold'),
sgGold: t('clientCount.market.sgCmGold'),
caGold: t('clientCount.market.caGold'),
thHsGold: t('clientCount.market.thHsGold'),
thHaGold: t('clientCount.market.thHaGold'),
vnGold: t('clientCount.market.vnGold'),
bjGold: t('clientCount.market.bjGold')
}
const marketName = propToMarketName[column.property]
if (marketName && walletId) {
currentWalletInfo.value = {
userName: row.name,
jwcode: row.jwcode,
marketName: row.market, //
walletName: marketName + t('clientCount.wallet'), //
currentBalance: row[column.property] || 0,
walletId: walletId
}
const marketName = propToMarketName[column.property]
if (marketName && walletId) {
currentWalletInfo.value = {
userName: row.name,
jwcode: row.jwcode,
marketName: row.market, //
walletName: marketName + t('clientCount.wallet'), //
currentBalance: row[column.property] || 0,
walletId: walletId
}
walletDetailQuery.value.pageNum = 1
getWalletDetail()
walletDetailVisible.value = true
walletDetailQuery.value.pageNum = 1
getWalletDetail()
walletDetailVisible.value = true
}
}
@ -283,17 +283,17 @@ const getWalletDetail = async () => {
})
if (result.code === 200) {
walletDetailList.value = result.data.list.map(item => ({
time: moment(item.createTime).format('YYYY-MM-DD HH:mm:ss'),
type: getWalletRecordTypeText(item),
amount: Number(item.amount) || 0,
desc: item.description || '',
orderNo: item.orderCode,
status: item.status === 0 ? 1 : 2
}))
walletDetailTotal.value = result.data.total
walletDetailList.value = result.data.list.map(item => ({
time: moment(item.createTime).format('YYYY-MM-DD HH:mm:ss'),
type: getWalletRecordTypeText(item),
amount: Number(item.amount) || 0,
desc: item.description || '',
orderNo: item.orderCode,
status: item.status === 0 ? 1 : 2
}))
walletDetailTotal.value = result.data.total
} else {
ElMessage.error(result.msg || t('elmessage.getDetailFailed'))
ElMessage.error(result.msg || t('elmessage.getDetailFailed'))
}
} catch (error) {
console.error(error)
@ -629,102 +629,106 @@ const format3 = (num) => {
</script>
<template>
<el-card class="card1" style="margin-bottom: 1vh;">
<div class="head-card">
<div class="head-card-element">
<el-text class="mx-1" size="large">{{ $t('common.jwcode') }}</el-text>
<el-input v-model="selectData.jwcode" style="width: 160px" :placeholder="$t('common.jwcodePlaceholder')" clearable />
<div style="display: flex; flex-direction: column; height: 95vh;">
<el-card class="card1" style="margin-bottom: 1vh;">
<div class="head-card">
<div class="head-card-element">
<el-text class="mx-1" size="large">{{ $t('common.jwcode') }}</el-text>
<el-input v-model="selectData.jwcode" style="width: 160px" :placeholder="$t('common.jwcodePlaceholder')"
clearable />
</div>
<div class="head-card-element">
<el-text class="mx-1" size="large">{{ $t('common.market') }}</el-text>
<el-cascader v-model="selectedMarketPath" :options="markets" :placeholder="$t('common.marketPlaceholder')"
clearable style="width:180px" @change="handleMarketChange" />
</div>
<div class="head-card-element">
<!-- <el-checkbox v-model="showEmployeeData" @change="search()">员工数据</el-checkbox> -->
</div>
<el-button type="primary" @click="search()">{{ $t('common.search') }}</el-button>
<el-button @click="reset" type="success">{{ $t('common.reset') }}</el-button>
<el-button type="primary" @click="exportExcel()">{{ $t('common.exportExcel') }}</el-button>
<!-- <el-button type="primary" @click="selectWallet()">{{ $t('common.exportCompanyWalletDetail') }}</el-button> -->
<el-button type="primary" @click="openExportList">{{ $t('common.viewExportList') }}</el-button>
</div>
<div class="head-card-element">
<el-text class="mx-1" size="large">{{ $t('common.market') }}</el-text>
<el-cascader v-model="selectedMarketPath" :options="markets" :placeholder="$t('common.marketPlaceholder')" clearable style="width:180px"
@change="handleMarketChange" />
<!-- </div> -->
</el-card>
<el-card class="card2">
<!-- 设置表格容器的高度和滚动样式 -->
<div style="height: 85vh; overflow-y: auto">
<el-table ref="tableRef" :data="tableData" @cellClick="cellClick" style="width: 100%; height: 85vh"
@sort-change="handleSortChange" :row-style="{ height: '50px' }">
<el-table-column type="index" :label="$t('common_list.id')" width="100px" fixed="left">
<template #default="scope">
<span>{{
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
}}</span>
</template>
</el-table-column>
<el-table-column prop="name" :label="$t('common_list.name')" width="140" />
<el-table-column prop="jwcode" :label="$t('common_list.jwcode')" width="140" />
<el-table-column prop="market" :label="$t('common_list.market')" width="140" />
<el-table-column prop="historyGold" :label="$t('clientCount.market.historyGold')" sortable="custom"
min-width="140">
<template #default="scope">
<span>{{ (scope.row.historyGold || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="hkGold" :label="$t('clientCount.market.hkGold')" sortable="custom" min-width="140">
<template #default="scope">
<span>{{ (scope.row.hkGold || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="sgHcGold" :label="$t('clientCount.market.sgHcGold')" sortable="custom" min-width="150">
<template #default="scope">
<span>{{ (scope.row.sgHcGold || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="myGold" :label="$t('clientCount.market.myGold')" sortable="custom" min-width="120">
<template #default="scope">
<span>{{ (scope.row.myGold || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="sgGold" :label="$t('clientCount.market.sgCmGold')" sortable="custom" min-width="150">
<template #default="scope">
<span>{{ (scope.row.sgGold || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="caGold" :label="$t('clientCount.market.caGold')" sortable="custom" min-width="120">
<template #default="scope">
<span>{{ (scope.row.caGold || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="thHsGold" :label="$t('clientCount.market.thHsGold')" sortable="custom" min-width="140">
<template #default="scope">
<span>{{ (scope.row.thHsGold || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="thHaGold" :label="$t('clientCount.market.thHaGold')" sortable="custom" min-width="140">
<template #default="scope">
<span>{{ (scope.row.thHaGold || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="vnGold" :label="$t('clientCount.market.vnGold')" sortable="custom" min-width="120">
<template #default="scope">
<span>{{ (scope.row.vnGold || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="bjGold" :label="$t('clientCount.market.bjGold')" sortable="custom" min-width="120">
<template #default="scope">
<span>{{ (scope.row.bjGold || 0) }}</span>
</template>
</el-table-column>
</el-table>
</div>
<div class="head-card-element">
<!-- <el-checkbox v-model="showEmployeeData" @change="search()">员工数据</el-checkbox> -->
<!-- 分页 -->
<div class="pagination" style="margin-top: 20px">
<el-pagination background :current-page="getObj.pageNum" :page-size="getObj.pageSize"
:page-sizes="[5, 10, 20, 50, 100]" layout="total, sizes, prev, pager, next, jumper" :total="total"
@size-change="handlePageSizeChange" @current-change="handleCurrentChange"></el-pagination>
</div>
<el-button type="primary" @click="search()">{{ $t('common.search') }}</el-button>
<el-button @click="reset" type="success">{{ $t('common.reset') }}</el-button>
<el-button type="primary" @click="exportExcel()">{{ $t('common.exportExcel') }}</el-button>
<el-button type="primary" @click="selectWallet()">{{ $t('common.exportCompanyWalletDetail') }}</el-button>
<el-button type="primary" @click="openExportList">{{ $t('common.viewExportList') }}</el-button>
</div>
<!-- </div> -->
</el-card>
<el-card class="card2">
<!-- 设置表格容器的高度和滚动样式 -->
<div style="height: 69vh; overflow-y: auto">
<el-table ref="tableRef" :data="tableData" @cellClick="cellClick" style="width: 100%; height: 69vh"
@sort-change="handleSortChange" :row-style="{ height: '50px' }">
<el-table-column type="index" :label="$t('common_list.id')" width="100px" fixed="left">
<template #default="scope">
<span>{{
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
}}</span>
</template>
</el-table-column>
<el-table-column prop="name" :label="$t('common_list.name')" width="140" />
<el-table-column prop="jwcode" :label="$t('common_list.jwcode')" width="140" />
<el-table-column prop="market" :label="$t('common_list.market')" width="140" />
<el-table-column prop="historyGold" :label="$t('clientCount.market.historyGold')" sortable="custom" min-width="140">
<template #default="scope">
<span>{{ (scope.row.historyGold || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="hkGold" :label="$t('clientCount.market.hkGold')" sortable="custom" min-width="140">
<template #default="scope">
<span>{{ (scope.row.hkGold || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="sgHcGold" :label="$t('clientCount.market.sgHcGold')" sortable="custom" min-width="150">
<template #default="scope">
<span>{{ (scope.row.sgHcGold || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="myGold" :label="$t('clientCount.market.myGold')" sortable="custom" min-width="120">
<template #default="scope">
<span>{{ (scope.row.myGold || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="sgGold" :label="$t('clientCount.market.sgCmGold')" sortable="custom" min-width="150">
<template #default="scope">
<span>{{ (scope.row.sgGold || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="caGold" :label="$t('clientCount.market.caGold')" sortable="custom" min-width="120">
<template #default="scope">
<span>{{ (scope.row.caGold || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="thHsGold" :label="$t('clientCount.market.thHsGold')" sortable="custom" min-width="140">
<template #default="scope">
<span>{{ (scope.row.thHsGold || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="thHaGold" :label="$t('clientCount.market.thHaGold')" sortable="custom" min-width="140">
<template #default="scope">
<span>{{ (scope.row.thHaGold || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="vnGold" :label="$t('clientCount.market.vnGold')" sortable="custom" min-width="120">
<template #default="scope">
<span>{{ (scope.row.vnGold || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="bjGold" :label="$t('clientCount.market.bjGold')" sortable="custom" min-width="120">
<template #default="scope">
<span>{{ (scope.row.bjGold || 0) }}</span>
</template>
</el-table-column>
</el-table>
</div>
<!-- 分页 -->
<div class="pagination" style="margin-top: 20px">
<el-pagination background :current-page="getObj.pageNum" :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
</div>
</el-card>
</el-card>
</div>
<el-dialog v-model="exportListVisible" :title="$t('common_export.exportList')" width="80%">
<el-table :data="exportList" style="width: 100% ;height: 60vh;" :loading="exportListLoading">
<el-table-column prop="fileName" :label="$t('common_export.fileName')" />
@ -756,10 +760,11 @@ const format3 = (num) => {
</template>
</el-dialog>
<el-dialog v-model="selectWalletVisible" width="30%" top="20%" :before-close="closeSelectWallet">
<el-form :model="selectWalletForm" :rules="selectWalletRules" ref="selectWalletFormRef" label-width="120px">
<el-dialog v-model="selectWalletVisible" width="30%" top="20%" :before-close="closeSelectWallet">
<el-form :model="selectWalletForm" :rules="selectWalletRules" ref="selectWalletFormRef" label-width="120px">
<el-form-item :label="$t('common_list.companyWallet')" prop="companyWalletId" style="margin-top: 30px;">
<el-select v-model="selectWalletForm.companyWalletId" :placeholder="$t('common_list.companyWalletPlaceholder')" style="width: 80%;">
<el-select v-model="selectWalletForm.companyWalletId" :placeholder="$t('common_list.companyWalletPlaceholder')"
style="width: 80%;">
<el-option v-for="item in companyWalletList" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
@ -773,19 +778,24 @@ const format3 = (num) => {
<el-dialog v-model="walletDetailVisible" width="70%" top="20vh">
<template #header>
<div class="wallet-detail-header" style="display: flex; gap: 40px; justify-content: space-between; align-items: center; font-size: 16px;">
<div class="wallet-detail-header"
style="display: flex; gap: 40px; justify-content: space-between; align-items: center; font-size: 16px;">
<span style="font-weight: bold; color: #F56C6C;">* {{ currentWalletInfo.walletName }}</span>
<span><span style="color: #F56C6C;">*</span> {{ $t('clientCount.user') }}: {{ currentWalletInfo.userName }} (ID: {{ currentWalletInfo.jwcode }})</span>
<span><span style="color: #F56C6C;">*</span> {{ $t('common.market') }}: {{ currentWalletInfo.marketName }}</span>
<span><span style="color: #F56C6C;">*</span> {{ $t('clientCount.user') }}: {{ currentWalletInfo.userName }} (ID:
{{ currentWalletInfo.jwcode }})</span>
<span><span style="color: #F56C6C;">*</span> {{ $t('common.market') }}: {{ currentWalletInfo.marketName
}}</span>
</div>
<div style="margin-top: 15px; font-size: 16px;">
<span style="color: #F56C6C; font-weight: bold;">* {{ $t('clientCount.currentBalance') }}: {{ format3(currentWalletInfo.currentBalance || 0) }} {{ $t('common.goldCoin') }}</span>
<span style="color: #F56C6C; font-weight: bold;">* {{ $t('clientCount.currentBalance') }}: {{
format3(currentWalletInfo.currentBalance || 0) }} {{ $t('common.goldCoin') }}</span>
</div>
</template>
<el-table :data="walletDetailList" v-loading="walletDetailLoading" style="width: 100%; height: 50vh; overflow-y: auto;" border stripe>
<el-table :data="walletDetailList" v-loading="walletDetailLoading"
style="width: 100%; height: 50vh; overflow-y: auto;" border stripe>
<el-table-column prop="time" :label="$t('clientCount.time')" align="center" width="180">
<template #default="scope">{{ scope.row.time }}</template>
<template #default="scope">{{ scope.row.time }}</template>
</el-table-column>
<el-table-column prop="type" :label="$t('clientCount.transactionType')" align="center" width="120" />
<el-table-column prop="amount" :label="$t('common_list.money')" align="center" width="120">
@ -797,10 +807,13 @@ const format3 = (num) => {
</el-table-column>
<el-table-column prop="desc" :label="$t('clientCount.transactionDesc')" align="center" />
<el-table-column prop="orderNo" :label="$t('clientCount.transactionOrderNo')" align="center" width="220" />
<el-table-column prop="status" :label="$t('clientCount.transactionStatus')" align="center" width="220" fixed="right">
<el-table-column prop="status" :label="$t('clientCount.transactionStatus')" align="center" width="220"
fixed="right">
<template #default="scope">
<el-tag :type="scope.row.status === 1 ? 'success' : scope.row.status === 2 ? 'danger' : 'info'" :effect="scope.row.status === 1 ? 'light' : 'plain'">
{{ scope.row.status === 1 ? t('common_list.normal') : scope.row.status === 2 ? t('common_list.refunded') : t('clientCount.exceptionData') }}
<el-tag :type="scope.row.status === 1 ? 'success' : scope.row.status === 2 ? 'danger' : 'info'"
:effect="scope.row.status === 1 ? 'light' : 'plain'">
{{ scope.row.status === 1 ? t('common_list.normal') : scope.row.status === 2 ? t('common_list.refunded') :
t('clientCount.exceptionData') }}
</el-tag>
</template>
</el-table-column>
@ -809,16 +822,9 @@ const format3 = (num) => {
<template #footer>
<div class="dialog-footer" style="display: flex; justify-content: space-between; align-items: center;">
<div class="pagination-container">
<el-pagination
background
:current-page="walletDetailQuery.pageNum"
:page-size="walletDetailQuery.pageSize"
:page-sizes="[10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper"
:total="walletDetailTotal"
@size-change="handleWalletDetailSizeChange"
@current-change="handleWalletDetailCurrentChange"
/>
<el-pagination background :current-page="walletDetailQuery.pageNum" :page-size="walletDetailQuery.pageSize"
:page-sizes="[10, 20, 50, 100]" layout="total, sizes, prev, pager, next, jumper" :total="walletDetailTotal"
@size-change="handleWalletDetailSizeChange" @current-change="handleWalletDetailCurrentChange" />
</div>
<div>
<el-button type="primary" @click="exportWalletDetail">{{ $t('common.exportExcel') }}</el-button>
@ -842,7 +848,7 @@ const format3 = (num) => {
display: flex;
flex-direction: column;
:deep(.el-card__body) {
:deep(.el-card__body) {
padding: 20px;
flex: 1;
display: flex;
@ -850,6 +856,7 @@ const format3 = (num) => {
overflow: hidden;
}
}
//
:deep(.el-table__header-wrapper),
:deep(.el-table__body-wrapper),

257
src/views/walletManage/components/WalletDetailTemplate.vue

@ -7,6 +7,14 @@ import moment from 'moment'
import { useI18n } from 'vue-i18n'
import { useAdminStore } from "@/store/index.js"
import { storeToRefs } from "pinia"
import { selectWalletRecords } from "@/api/cash/cash.js"
const props = defineProps({
type: {
type: Number,
required: true
}
})
const { t } = useI18n()
const route = useRoute()
@ -16,10 +24,12 @@ const { flag } = storeToRefs(adminStore)
const tableData = ref([])
const total = ref(0)
const loading = ref(false)
const marketLists = ref([])
const selectedMarketPath = ref([])
const selectData = ref({
jwcode: '',
walletId: ''
walletId: '',
market: ''
})
const getObj = ref({
@ -61,6 +71,7 @@ const format3 = (num) => {
//
const getWalletData = async () => {
console.log('walletId:', selectData.value.walletId)
if (!selectData.value.walletId) return;
if (selectData.value.jwcode) {
@ -78,15 +89,12 @@ const getWalletData = async () => {
pageSize: getObj.value.pageSize,
userWalletRecord: {
walletId: selectData.value.walletId,
jwcode: selectData.value.jwcode ? Number(selectData.value.jwcode) : null
market: selectData.value.market,
jwcode: selectData.value.jwcode
}
}
const result = await API({
url: '/cashCollection/selectWalletRecords',
method: 'post',
data: params
})
const result = await selectWalletRecords(params)
if (result.code === 200) {
tableData.value = result.data.list.map(item => ({
@ -123,6 +131,8 @@ const search = function () {
//
const reset = function () {
selectData.value.jwcode = ''
selectData.value.market = ''
selectedMarketPath.value = []
getObj.value.pageNum = 1
getWalletData()
}
@ -144,9 +154,9 @@ watch(flag, (newFlag, oldFlag) => {
}
})
//
// props
watch(
() => route.query.type,
() => props.type,
(newType) => {
if (newType) {
selectData.value.walletId = newType
@ -156,37 +166,187 @@ watch(
},
{ immediate: true }
)
// ==================== ====================
const exportListVisible = ref(false)
const exportList = ref([])
const exportListLoading = ref(false)
const exportExcelOnlyOne = async function () {
if (!selectData.value.walletId) {
ElMessage.error(t('elmessage.selectCompanyWallet'))
return
}
const params = {
pageNum: 1, //
pageSize: 10000, //
userWalletRecord: {
walletId: selectData.value.walletId,
jwcode: selectData.value.jwcode ? Number(selectData.value.jwcode) : null
}
}
try {
const res = await API({
url: '/export/exportUserWalletRecord',
method: 'post',
data: params
})
if (res.code === 200) {
ElMessage.success(t('elmessage.exportSuccess'))
} else {
ElMessage.error(res.msg || t('elmessage.exportFailed'))
}
} catch (error) {
console.error('导出失败:', error)
ElMessage.error(t('elmessage.exportFailed'))
}
}
//
const openExportList = () => {
getExportList()
exportListVisible.value = true
}
//
const getExportList = async () => {
exportListLoading.value = true
try {
const result = await API({ url: '/export/export' })
if (result.code === 200) {
// type 16 17 WalletBalance
const filteredData = result.data.filter(item => {
return item.type === 16 || item.type === 17;
});
exportList.value = filteredData
} else {
ElMessage.error(result.msg || t('elmessage.getExportListError'))
}
} catch (error) {
console.error('获取导出列表出错:', error)
ElMessage.error(t('elmessage.getExportListError'))
} finally {
exportListLoading.value = false
}
}
//
const downloadExportFile = (item) => {
if (item.state === 2) {
const link = document.createElement('a')
link.href = item.url
link.download = item.fileName
link.click()
} else {
ElMessage.warning(t('elmessage.exportingInProgress'))
}
}
//
const getTagType = (state) => {
switch (state) {
case 0: return 'info';
case 1: return 'primary';
case 2: return 'success';
case 3: return 'danger';
default: return 'info';
}
}
//
const getTagText = (state) => {
switch (state) {
case 0: return t('elmessage.pendingExecution');
case 1: return t('elmessage.executing');
case 2: return t('elmessage.executed');
case 3: return t('elmessage.errorExecution');
default: return t('elmessage.unknownStatus');
}
}
const transformTree = (nodes) => {
//
const allChildren = nodes.flatMap(node => node.children || []);
return allChildren.map(child => {
const grandchildren = child.children && child.children.length
? transformTree([child]) //
: null;
return {
value: child.id,
label: child.name,
children: grandchildren
};
});
};
const selectMarket = async function () {
try {
const selectMarketResult = await API({ url: '/market/selectMarket' });
marketLists.value = transformTree(selectMarketResult.data)
console.log('转换后的地区树==============:', marketLists.value);
} catch (error) {
console.error('获取地区树失败:', error);
return {};
}
};
const handleMarketChange = (value) => {
if (value && value.length > 0) {
// id id
const lastValueId = value[value.length - 1];
selectData.value.market = lastValueId;
} else {
selectData.value.market = '';
}
};
onMounted(() => {
selectData.value.walletId = props.type
selectMarket()
})
</script>
<template>
<div style="display: flex; flex-direction: column; height: 100%;">
<div style="display: flex; flex-direction: column; height: 95vh;">
<el-card class="card1" style="margin-bottom: 1vh;">
<div class="head-card">
<div class="head-card-element">
<el-text class="mx-1" size="large">{{ $t('common_list.jwcode') }}</el-text>
<el-input v-model="selectData.jwcode" style="width: 240px" :placeholder="$t('common_list.jwcodePlaceholder')" clearable />
<el-input v-model="selectData.jwcode" style="width: 12.5vw" placeholder="请输入精网号" clearable />
</div>
<div class="head-card-element">
<el-text class="mx-1" size="large">{{ $t('common.market') }}</el-text>
<el-cascader v-model="selectedMarketPath" :options="marketLists" :placeholder="$t('common.marketPlaceholder')"
clearable style="width:180px" @change="handleMarketChange" />
</div>
<div class="head-card-btn">
<el-button type="default" @click="reset">{{ $t('common.reset') }}</el-button>
<el-button type="success" @click="reset">{{ $t('common.reset') }}</el-button>
<el-button type="primary" @click="search">{{ $t('common.search') }}</el-button>
<el-button type="primary" @click="exportExcelOnlyOne">{{ $t('common.exportExcel') }}</el-button>
<el-button type="primary" @click="openExportList">{{ $t('common.viewExportList') }}</el-button>
</div>
</div>
</el-card>
<el-card class="card2">
<div style="height: 69vh; overflow-y: auto">
<el-table ref="tableRef" :data="tableData" v-loading="loading" style="width: 100%; height: 69vh" :row-style="{ height: '50px' }">
<div style="height: 85vh; overflow-y: auto">
<el-table ref="tableRef" :data="tableData" v-loading="loading" style="width: 100%; height: 85vh"
:row-style="{ height: '50px' }">
<el-table-column type="index" :label="$t('common_list.id')" width="80px" fixed="left">
<template #default="scope">
<span>{{ scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize }}</span>
</template>
</el-table-column>
<el-table-column prop="userName" :label="$t('common_list.name')" width="140" />
<el-table-column prop="jwcode" :label="$t('common_list.jwcode')" width="140" />
<el-table-column prop="time" :label="$t('clientCount.time')" align="center" width="180">
<template #default="scope">{{ scope.row.time }}</template>
</el-table-column>
<el-table-column prop="userName" :label="$t('common_list.name')" width="140" />
<el-table-column prop="marketName" :label="$t('common_list.marketName')" width="140" />
<el-table-column prop="typeText" :label="$t('clientCount.transactionType')" align="center" width="120" />
<el-table-column prop="transactionCurrency" :label="$t('clientCount.transactionCurrency')" align="center"
width="120" />
<el-table-column prop="amount" :label="$t('common_list.money')" align="center" width="120">
<template #default="scope">
<span :style="{ color: scope.row.amount >= 0 ? '#67C23A' : '#F56C6C', fontWeight: 'bold' }">
@ -194,25 +354,62 @@ watch(
</span>
</template>
</el-table-column>
<el-table-column prop="desc" :label="$t('clientCount.transactionDesc')" align="center" min-width="150" />
<el-table-column prop="orderNo" :label="$t('clientCount.transactionOrderNo')" align="center" width="220" />
<el-table-column prop="status" :label="$t('clientCount.transactionStatus')" align="center" width="150" fixed="right">
<el-table-column prop="desc" :label="$t('clientCount.transactionDesc')" align="center" min-width="150" />
<el-table-column prop="status" :label="$t('clientCount.transactionStatus')" align="center" width="150">
<template #default="scope">
<el-tag :type="scope.row.status === 1 ? 'success' : scope.row.status === 2 ? 'danger' : 'info'" :effect="scope.row.status === 1 ? 'light' : 'plain'">
{{ scope.row.status === 1 ? t('common_list.normal') : scope.row.status === 2 ? t('common_list.refunded') : t('clientCount.exceptionData') }}
<el-tag :type="scope.row.status === 1 ? 'success' : scope.row.status === 2 ? 'danger' : 'info'"
:effect="scope.row.status === 1 ? 'light' : 'plain'">
{{ scope.row.status === 1 ? t('common_list.normal') : scope.row.status === 2 ? t('common_list.refunded')
: t('clientCount.exceptionData') }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="time" :label="$t('clientCount.time')" align="center" width="180">
<template #default="scope">{{ scope.row.time }}</template>
</el-table-column>
</el-table>
</div>
<!-- 分页 -->
<div class="pagination" style="margin-top: 20px">
<el-pagination background :current-page="getObj.pageNum" :page-size="getObj.pageSize" :page-sizes="[10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
<el-pagination background :current-page="getObj.pageNum" :page-size="getObj.pageSize"
:page-sizes="[10, 20, 50, 100]" layout="total, sizes, prev, pager, next, jumper" :total="total"
@size-change="handlePageSizeChange" @current-change="handleCurrentChange"></el-pagination>
</div>
</el-card>
<!-- 导出列表弹窗 -->
<el-dialog v-model="exportListVisible" :title="$t('common_export.exportList')" width="80%">
<el-table :data="exportList" style="width: 100% ;height: 60vh;" :loading="exportListLoading">
<el-table-column prop="fileName" :label="$t('common_export.fileName')" />
<el-table-column prop="state" :label="$t('common_export.status')">
<template #default="scope">
<el-tag :type="getTagType(scope.row.state)" :effect="scope.row.state === 3 ? 'light' : 'plain'">
{{ getTagText(scope.row.state) }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="createTime" :label="$t('common_export.createTime')">
<template #default="scope">
{{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column :label="$t('common_export.operation')">
<template #default="scope">
<el-button type="primary" size="small" @click="downloadExportFile(scope.row)"
:disabled="scope.row.state !== 2">
{{ $t('common_export.download') }}
</el-button>
</template>
</el-table-column>
</el-table>
<template #footer>
<div class="dialog-footer">
<el-button text @click="exportListVisible = false">{{ $t('common_export.close') }}</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
@ -227,7 +424,7 @@ watch(
display: flex;
flex-direction: column;
:deep(.el-card__body) {
:deep(.el-card__body) {
padding: 20px;
flex: 1;
display: flex;
@ -261,6 +458,12 @@ watch(
.head-card-element {
margin-right: 20px;
white-space: nowrap;
.mx-1 {
font-size: 16px;
margin: 0 10px;
}
}
.head-card-btn {

2
src/views/walletManage/walletDetail/BJWallet.vue

@ -1,7 +1,7 @@
<!-- 北京钱包界面 -->
<template>
<div>
<WalletDetailTemplate type="bj" />
<WalletDetailTemplate :type="10" />
</div>
</template>
<script setup>

2
src/views/walletManage/walletDetail/CAWallet.vue

@ -1,7 +1,7 @@
<!-- 加拿大钱包界面 -->
<template>
<div>
<WalletDetailTemplate type="ca" />
<WalletDetailTemplate :type="6" />
</div>
</template>
<script setup>

3
src/views/walletManage/walletDetail/HKWallet.vue

@ -1,8 +1,7 @@
<!-- 初始界面 -->
<template>
<div>
111
<WalletDetailTemplate type="hk" />
<WalletDetailTemplate :type="2" />
</div>
</template>
<script setup>

2
src/views/walletManage/walletDetail/MyWallet.vue

@ -1,7 +1,7 @@
<!-- 马来钱包界面 -->
<template>
<div>
<WalletDetailTemplate type="my" />
<WalletDetailTemplate :type="4" />
</div>
</template>
<script setup>

2
src/views/walletManage/walletDetail/SGWalletCM.vue

@ -1,7 +1,7 @@
<!-- 新加坡CM钱包界面 -->
<template>
<div>
<WalletDetailTemplate type="sg_cm" />
<WalletDetailTemplate :type="5" />
</div>
</template>
<script setup>

2
src/views/walletManage/walletDetail/SGWalletHC.vue

@ -1,7 +1,7 @@
<!-- 新加坡HC钱包界面 -->
<template>
<div>
<WalletDetailTemplate type="sg_hc" />
<WalletDetailTemplate :type="3" />
</div>
</template>
<script setup>

2
src/views/walletManage/walletDetail/THWalletHA.vue

@ -1,7 +1,7 @@
<!-- 泰国HA钱包界面 -->
<template>
<div>
<WalletDetailTemplate type="th_ha" />
<WalletDetailTemplate :type="8" />
</div>
</template>
<script setup>

2
src/views/walletManage/walletDetail/THWalletHS.vue

@ -1,7 +1,7 @@
<!-- 泰国HS钱包界面 -->
<template>
<div>
<WalletDetailTemplate type="th_hs" />
<WalletDetailTemplate :type="7" />
</div>
</template>
<script setup>

2
src/views/walletManage/walletDetail/VNWallet.vue

@ -1,7 +1,7 @@
<!-- 越南钱包界面 -->
<template>
<div>
<WalletDetailTemplate type="vn" />
<WalletDetailTemplate :type="9" />
</div>
</template>
<script setup>

Loading…
Cancel
Save