Sfoglia il codice sorgente

feature: cwg卡充值

ljc 5 mesi fa
parent
commit
9b84ffa184

+ 117 - 92
src/i18n/locales/cn.json

@@ -1,7 +1,7 @@
 {
 {
   "Msg": {
   "Msg": {
-    "Withdrawal": "出金申请金额",
-    "Payment": "打款金额",
+    "Withdrawal":"出金申请金额",
+    "Payment":"打款金额",
     "DeleteConfirm": "是否删除",
     "DeleteConfirm": "是否删除",
     "SystemError": "系统错误,请稍后再试。",
     "SystemError": "系统错误,请稍后再试。",
     "LoginSuccess": "登录成功,马上进入系统。",
     "LoginSuccess": "登录成功,马上进入系统。",
@@ -82,6 +82,7 @@
     "OperationFailed": "操作失败",
     "OperationFailed": "操作失败",
     "InvalidLogin": "请输入正确的账户(纯数字)",
     "InvalidLogin": "请输入正确的账户(纯数字)",
     "PleaseSelectItem": "请先选择要删除的项目",
     "PleaseSelectItem": "请先选择要删除的项目",
+    "PleaseSelect": "请先选择项目",
     "ConfirmBatchDelete": "确定要批量删除选中的项目吗?",
     "ConfirmBatchDelete": "确定要批量删除选中的项目吗?",
     "ConfirmSendReport": "确定要发送该销售业绩报告吗?",
     "ConfirmSendReport": "确定要发送该销售业绩报告吗?",
     "SendReportSuccess": "报告发送成功",
     "SendReportSuccess": "报告发送成功",
@@ -222,6 +223,7 @@
     "CSV": "导出CSV",
     "CSV": "导出CSV",
     "XLS": "导出XLS",
     "XLS": "导出XLS",
     "Export": "导出",
     "Export": "导出",
+    "BatchClose": "批量关闭",
     "SendReport": "发送报告",
     "SendReport": "发送报告",
     "BalanceOperating": "余额操作",
     "BalanceOperating": "余额操作",
     "EditTemplate": "编辑模板",
     "EditTemplate": "编辑模板",
@@ -270,6 +272,9 @@
     "NoDeduction": "未扣款",
     "NoDeduction": "未扣款",
     "Deducted": "已扣款",
     "Deducted": "已扣款",
     "Cancelled": "已取消",
     "Cancelled": "已取消",
+    "CommissionTransfer": "佣金内转",
+    "AgentTransfer": "代理内转",
+    "IBAgentAccount": "IB代理账户",
     "NotCopied": "未拷贝",
     "NotCopied": "未拷贝",
     "CopyIn": "拷贝中",
     "CopyIn": "拷贝中",
     "OpenPosition": "待平仓",
     "OpenPosition": "待平仓",
@@ -302,7 +307,7 @@
     "Female": "女",
     "Female": "女",
     "NoSuccess": "未成功"
     "NoSuccess": "未成功"
   },
   },
-  "R-Cooperation": "合作模式",
+  "R-Cooperation":"合作模式",
   "R-Cooperation-Search": "列表",
   "R-Cooperation-Search": "列表",
   "R-Cooperation-Detailed": "详情",
   "R-Cooperation-Detailed": "详情",
   "R-Cooperation-Update": "编辑",
   "R-Cooperation-Update": "编辑",
@@ -316,10 +321,10 @@
   "R-System-actSpread-Editor": "编辑",
   "R-System-actSpread-Editor": "编辑",
   "R-System-actSpread-Delete": "删除",
   "R-System-actSpread-Delete": "删除",
   "R-System-amountDate": "账户免息配置",
   "R-System-amountDate": "账户免息配置",
-  "R-System-amountDate-Search": "列表",
-  "R-System-amountDate-Add": "新增",
-  "R-System-amountDate-Editor": "编辑",
-  "R-System-amountDate-Delete": "删除",
+  "R-System-amountDate-Search":"列表",
+  "R-System-amountDate-Add":"新增",
+  "R-System-amountDate-Editor":"编辑",
+  "R-System-amountDate-Delete":"删除",
   "R-System-amountDate-TradingAccount": "交易账号",
   "R-System-amountDate-TradingAccount": "交易账号",
   "R-System-amountDate-Platform": "平台",
   "R-System-amountDate-Platform": "平台",
   "R-System-amountDate-DayNumber": "免息天数",
   "R-System-amountDate-DayNumber": "免息天数",
@@ -330,23 +335,23 @@
   "R-System-amountDate-InputDayNumber": "请输入免息天数",
   "R-System-amountDate-InputDayNumber": "请输入免息天数",
   "R-System-amountDate-DeleteConfirm": "确定要删除该条记录吗?",
   "R-System-amountDate-DeleteConfirm": "确定要删除该条记录吗?",
   "R-System-amountDate-DeleteTitle": "删除确认",
   "R-System-amountDate-DeleteTitle": "删除确认",
-  "R-AmountFree-Search": "列表",
-  "R-AmountFree-Add": "新增",
-  "R-AmountFree-Editor": "编辑",
-  "R-AmountFree-Delete": "删除",
-  "R-exclude-Search": "列表",
-  "R-exclude-Add": "新增",
-  "R-exclude-Editor": "编辑",
-  "R-exclude-Delete": "删除",
-  "No": "第",
-  "Week": "周",
-  "R-dataRetrieval-Search": "列表",
-  "R-Bank-NoCertified": "未认证",
-  "R-Bank-ToCertified": "立即认证",
-  "R-dataRetrieval-Unseal": "解封",
-  "R-Bank-edit": "操作权限",
+  "R-AmountFree-Search":"列表",
+  "R-AmountFree-Add":"新增",
+  "R-AmountFree-Editor":"编辑",
+  "R-AmountFree-Delete":"删除",
+  "R-exclude-Search":"列表",
+  "R-exclude-Add":"新增",
+  "R-exclude-Editor":"编辑",
+  "R-exclude-Delete":"删除",
+    "No":"第",
+  "Week":"周",
+  "R-dataRetrieval-Search":"列表",
+  "R-Bank-NoCertified":"未认证",
+  "R-Bank-ToCertified":"立即认证",
+  "R-dataRetrieval-Unseal":"解封",
+  "R-Bank-edit":"操作权限",
   "R-Enter": "菜单",
   "R-Enter": "菜单",
-  "R-Real-Amount": "全部金额",
+  "R-Real-Amount":"全部金额",
   "R-Real-Disabled": "开户设置查看",
   "R-Real-Disabled": "开户设置查看",
   "R-Dashboard": "控制台",
   "R-Dashboard": "控制台",
   "R-CustomerDynamic": "客户动态",
   "R-CustomerDynamic": "客户动态",
@@ -406,12 +411,12 @@
   "R-VerifiedUser": "待核验用户",
   "R-VerifiedUser": "待核验用户",
   "R-LimitedActivities": "限时活动",
   "R-LimitedActivities": "限时活动",
   "R-Rebate": "活动返利",
   "R-Rebate": "活动返利",
-  "R-MonthlyList": "月赏礼遇活动",
+  "R-MonthlyList":"月赏礼遇活动",
   "R-UtaskList": "U币入金奖励活动",
   "R-UtaskList": "U币入金奖励活动",
   "R-surplusList": "月盈赠金活动",
   "R-surplusList": "月盈赠金活动",
   "R-surplusList-Search": "列表",
   "R-surplusList-Search": "列表",
   "R-surplusList-Complete": "完成任务",
   "R-surplusList-Complete": "完成任务",
-  "R-surplusList-Cancel": "取消任务",
+  "R-surplusList-Cancel": "取消任务", 
   "R-surplusList-Recover": "恢复信用",
   "R-surplusList-Recover": "恢复信用",
   "R-UtaskList-Search": "列表",
   "R-UtaskList-Search": "列表",
   "R-PendingAccount": "待审批账户",
   "R-PendingAccount": "待审批账户",
@@ -590,15 +595,15 @@
   "R-Trading-AdjustmentAttribution": "调整归属",
   "R-Trading-AdjustmentAttribution": "调整归属",
   "R-Trading-Rematch": "重新匹配",
   "R-Trading-Rematch": "重新匹配",
   "R-Trading-Export": "导出",
   "R-Trading-Export": "导出",
-  "R-EmailRecords-Export": "导出",
-  "R-Business-Export": "导出",
-  "R-KycAuth-Export": "导出",
-  "R-CardOrder-Export": "导出",
-  "R-VirtualCard-Export": "导出",
-  "R-Recharge-Export": "导出",
-  "R-Transactions-Export": "导出",
-  "R-UserOrder-Export": "导出",
-  "R-CardOperate-Export": "导出",
+  "R-EmailRecords-Export":"导出",
+  "R-Business-Export":"导出",
+  "R-KycAuth-Export":"导出",
+  "R-CardOrder-Export":"导出",
+  "R-VirtualCard-Export":"导出",
+  "R-Recharge-Export":"导出",
+  "R-Transactions-Export":"导出",
+  "R-UserOrder-Export":"导出",
+  "R-CardOperate-Export":"导出",
   "R-Trading-dayLimit": "每日出金限额",
   "R-Trading-dayLimit": "每日出金限额",
   "R-Agent-Search": "列表",
   "R-Agent-Search": "列表",
   "R-Agent-Single": "详情",
   "R-Agent-Single": "详情",
@@ -660,8 +665,7 @@
   "R-Agent-AdjustmentAttribution": "调整归属",
   "R-Agent-AdjustmentAttribution": "调整归属",
   "R-Agent-pammManagerValid": "PAMM申请",
   "R-Agent-pammManagerValid": "PAMM申请",
   "R-Agent-PAMMValid": "Money Manager申请",
   "R-Agent-PAMMValid": "Money Manager申请",
-  "R-Agent-Transfer": "代理内转",
-  "R-Agent-CloseFunction": "关闭功能",
+  "R-Agent-Transfer": "代理内转",  "R-Agent-CloseFunction": "关闭功能",
   "R-Agent-Level": "查询下级",
   "R-Agent-Level": "查询下级",
   "R-Agent-black": "固定加点",
   "R-Agent-black": "固定加点",
   "R-Agent-Export": "导出",
   "R-Agent-Export": "导出",
@@ -689,9 +693,11 @@
   "R-EmailRecords": "邮件记录",
   "R-EmailRecords": "邮件记录",
   "R-EmailRecords-Search": "列表",
   "R-EmailRecords-Search": "列表",
   "R-Reward-Details": "销售奖励详情",
   "R-Reward-Details": "销售奖励详情",
-  "R-Review": "审核kyc",
-  "R-DeleteList": "账户删除记录",
-  "R-DeleteList-Search": "列表",
+  "R-Review":"审核kyc",
+  "R-DeleteList":"账户删除记录",
+  "R-DeleteList-Search":"列表",
+  "R-Attribution":"修改归属记录",
+  "R-Attribution-Search":"列表",
   "R-AccountRetrieval-Search": "列表",
   "R-AccountRetrieval-Search": "列表",
   "R-UserRetrieval": "用户检索",
   "R-UserRetrieval": "用户检索",
   "R-UserRetrieval-Search": "列表",
   "R-UserRetrieval-Search": "列表",
@@ -880,7 +886,7 @@
   "R-Exclude-Delete": "删除",
   "R-Exclude-Delete": "删除",
   "R-Exclude-Update": "修改",
   "R-Exclude-Update": "修改",
   "R-Exclude-Add": "新增",
   "R-Exclude-Add": "新增",
-  "R-GoogleEmail": "Gmail管理",
+  "R-GoogleEmail":"Gmail管理",
   "R-GoogleEmail-Search": "列表",
   "R-GoogleEmail-Search": "列表",
   "R-GoogleEmail-Add": "新增",
   "R-GoogleEmail-Add": "新增",
   "R-GoogleEmail-Update": "修改",
   "R-GoogleEmail-Update": "修改",
@@ -1958,24 +1964,24 @@
       "ToBeProcessed": "待处理数",
       "ToBeProcessed": "待处理数",
       "Deposit": "存款申请",
       "Deposit": "存款申请",
       "TWithdraw": "取款申请",
       "TWithdraw": "取款申请",
-      "Commission": "佣金提取"
-    },
-    "Commission": {
-      "CId": "客户ID",
-      "PIbNo": "归属编号",
-      "WithdrawIbNo": "代理账户",
-      "Name": "姓名",
-      "WithdrawAmount": "转出金额",
-      "WithdrawCurrency": "货币",
-      "DepositIbNo": "转入账户",
-      "DepositAmount": "转入金额",
-      "DepositCurrency": "货币",
-      "AddTime": "申请时间",
-      "Status": "状态",
-      "Status-Processing": "处理中",
-      "Status-Approved": "已通过",
-      "Status-Rejected": "已拒绝"
-    },
+    "Commission": "佣金提取"
+  },
+  "Commission": {
+    "CId": "客户ID",
+    "PIbNo": "归属编号",
+    "WithdrawIbNo": "代理账户",
+    "Name": "姓名",
+    "WithdrawAmount": "转出金额",
+    "WithdrawCurrency": "货币",
+    "DepositIbNo": "转入账户",
+    "DepositAmount": "转入金额",
+    "DepositCurrency": "货币",
+    "AddTime": "申请时间",
+    "Status": "状态",
+    "Status-Processing": "处理中",
+    "Status-Approved": "已通过",
+    "Status-Rejected": "已拒绝"
+  },
     "Role": {
     "Role": {
       "item0": "超级管理员",
       "item0": "超级管理员",
       "item1": "客服",
       "item1": "客服",
@@ -2029,7 +2035,7 @@
     "type_dynamic2": "模拟账号申请",
     "type_dynamic2": "模拟账号申请",
     "type_dynamic3": "入金",
     "type_dynamic3": "入金",
     "type_dynamic4": "出金",
     "type_dynamic4": "出金",
-    "type_dynamic5": "代理佣金内转",
+    "type_dynamic5": "内",
     "type_dynamic6": "佣金",
     "type_dynamic6": "佣金",
     "type_dynamic7": "活动",
     "type_dynamic7": "活动",
     "type_dynamic8": "密码",
     "type_dynamic8": "密码",
@@ -2037,6 +2043,7 @@
     "type_dynamic10": "内转-出",
     "type_dynamic10": "内转-出",
     "type_dynamic11": "内转-入",
     "type_dynamic11": "内转-入",
     "type_dynamic12": "佣金内转",
     "type_dynamic12": "佣金内转",
+    "type_dynamic13": "佣金提取",
     "GoogleGroup": "Google组别",
     "GoogleGroup": "Google组别",
     "GroupEmail": "gmail组别",
     "GroupEmail": "gmail组别",
     "GroupName": "组别名称",
     "GroupName": "组别名称",
@@ -2509,15 +2516,15 @@
       "CUSTOM_KYC_SUCCESS_EN": "人脸认证审核通过(英)",
       "CUSTOM_KYC_SUCCESS_EN": "人脸认证审核通过(英)",
       "CUSTOM_KYC_FAIL_CN": "人脸认证审核失败(中)",
       "CUSTOM_KYC_FAIL_CN": "人脸认证审核失败(中)",
       "CUSTOM_KYC_FAIL_EN": "人脸认证审核失败(英)",
       "CUSTOM_KYC_FAIL_EN": "人脸认证审核失败(英)",
-      "CUSTOM_KYC_APPROVE": "人脸认证审核通知",
-      "AGENT_CUSTOM_ACTIVITY_REQUITE_SUCCESS_CN": "一级代理用户限时回馈活动结束通知(中)",
-      "AGENT_CUSTOM_ACTIVITY_REQUITE_SUCCESS_EN": "一级代理用户限时回馈活动结束通知(英)",
-      "CUSTOM_ACTIVITY_UCOIN_CN": "客户参加U币入金奖励活动通知",
-      "CUSTOM_ACTIVITY_UCOIN_EN": "客户参加U币入金奖励活动通知(英)",
-      "CUSTOM_ACTIVITY_UCOIN_END_CN": "客户参加U币入金奖励活动结束通知",
-      "CUSTOM_ACTIVITY_UCOIN_END_EN": "客户参加U币入金奖励活动结束通知(英)",
-      "IB_CUSTOM_ACTIVITY_UCOIN_CN": "代理用户参加U币入金奖励活动通知",
-      "IB_CUSTOM_ACTIVITY_UCOIN_EN": "代理用户参加U币入金奖励活动通知(英)",
+      "CUSTOM_KYC_APPROVE":"人脸认证审核通知",
+      "AGENT_CUSTOM_ACTIVITY_REQUITE_SUCCESS_CN":"一级代理用户限时回馈活动结束通知(中)",
+      "AGENT_CUSTOM_ACTIVITY_REQUITE_SUCCESS_EN":"一级代理用户限时回馈活动结束通知(英)",
+      "CUSTOM_ACTIVITY_UCOIN_CN":"客户参加U币入金奖励活动通知",
+      "CUSTOM_ACTIVITY_UCOIN_EN":"客户参加U币入金奖励活动通知(英)",
+      "CUSTOM_ACTIVITY_UCOIN_END_CN":"客户参加U币入金奖励活动结束通知",
+      "CUSTOM_ACTIVITY_UCOIN_END_EN":"客户参加U币入金奖励活动结束通知(英)",
+      "IB_CUSTOM_ACTIVITY_UCOIN_CN":"代理用户参加U币入金奖励活动通知",
+      "IB_CUSTOM_ACTIVITY_UCOIN_EN":"代理用户参加U币入金奖励活动通知(英)",
       "Lang": "语言",
       "Lang": "语言",
       "TemplateName": "模板名称",
       "TemplateName": "模板名称",
       "EmailTitle": "邮件标题",
       "EmailTitle": "邮件标题",
@@ -2852,6 +2859,8 @@
     "NewPwdConfirm": "新密码确认",
     "NewPwdConfirm": "新密码确认",
     "NewAttributionNumber": "新归属编号",
     "NewAttributionNumber": "新归属编号",
     "OldAttributionNumber": "原归属编号",
     "OldAttributionNumber": "原归属编号",
+    "OldIbNo": "修改前归属编码",
+    "NewIbNo": "修改后归属",
     "ActivityName": "活动名称",
     "ActivityName": "活动名称",
     "Platform": "平台",
     "Platform": "平台",
     "Deposit": "存款",
     "Deposit": "存款",
@@ -2945,8 +2954,9 @@
     "totalProfit": "平仓总盈亏",
     "totalProfit": "平仓总盈亏",
     "tradeCount": "订单数",
     "tradeCount": "订单数",
     "cptIdSelect": "请先选择比赛",
     "cptIdSelect": "请先选择比赛",
-    "SerialNumber": "流水号",
+    "SerialNumber": "流水号",  
     "Time": "时间",
     "Time": "时间",
+    "modifyTime": "编辑时间",
     "Floating": "浮动盈亏",
     "Floating": "浮动盈亏",
     "FloatingSum": "总盈亏",
     "FloatingSum": "总盈亏",
     "PaymentOrder": "支付单号",
     "PaymentOrder": "支付单号",
@@ -3156,7 +3166,7 @@
     "SwapLong": "买入隔夜利息",
     "SwapLong": "买入隔夜利息",
     "SwapShort": "卖出隔夜利息",
     "SwapShort": "卖出隔夜利息",
     "NetDepositAmount": "净入金金额",
     "NetDepositAmount": "净入金金额",
-
+   
     "WithdrawAmount": "出金金额",
     "WithdrawAmount": "出金金额",
     "AgentWithdrawAmount": "佣金提取金额",
     "AgentWithdrawAmount": "佣金提取金额",
     "AddCustomNum": "注册人数",
     "AddCustomNum": "注册人数",
@@ -3445,6 +3455,10 @@
   "R-Instructor-Add": "新增",
   "R-Instructor-Add": "新增",
   "R-Instructor-Delete": "删除",
   "R-Instructor-Delete": "删除",
   "R-Instructor-Update": "修改",
   "R-Instructor-Update": "修改",
+  "R-GiftList": "赠金列表",
+  "R-GiftList-Search": "列表",
+  "R-GiftList-Export": "导出",
+  "R-GiftList-Add": "新增",
   "R-Data-AccountActivity-Search": "账户活跃度列表",
   "R-Data-AccountActivity-Search": "账户活跃度列表",
   "R-Data-AccountActivity-Export": "账户活跃度导出",
   "R-Data-AccountActivity-Export": "账户活跃度导出",
   "R-Data-CommissionShares-Search": "销售股票佣金列表",
   "R-Data-CommissionShares-Search": "销售股票佣金列表",
@@ -3813,7 +3827,7 @@
     "R-PerformanceList-com": "交易量佣金明细",
     "R-PerformanceList-com": "交易量佣金明细",
     "R-PerformanceList-comD": "交易量佣金导出",
     "R-PerformanceList-comD": "交易量佣金导出",
     "R-Performance-Record": "薪资收支记录",
     "R-Performance-Record": "薪资收支记录",
-    "R-Sales-Dynamic": "销售动态绩效",
+    "R-Sales-Dynamic":"销售动态绩效",
     "Dynamic-basicSalary": "基本工资",
     "Dynamic-basicSalary": "基本工资",
     "Dynamic-salaryPerformance": "薪资绩效列表",
     "Dynamic-salaryPerformance": "薪资绩效列表",
     "Dynamic-basicPerformance": "底薪绩效列表",
     "Dynamic-basicPerformance": "底薪绩效列表",
@@ -3879,10 +3893,10 @@
       "item48": "团队",
       "item48": "团队",
       "item49": "工资货币类型",
       "item49": "工资货币类型",
       "item50": "备注",
       "item50": "备注",
-      "item51": "基本工资",
-      "item52": "实发工资",
-      "item53": "月份",
-      "item54": "活动奖励"
+      "item51":"基本工资",
+      "item52":"实发工资",
+      "item53":"月份",
+      "item54":"活动奖励"
     },
     },
     "R-SalaryAccount": "薪资账户",
     "R-SalaryAccount": "薪资账户",
     "R-SalaryAccount-list": "列表",
     "R-SalaryAccount-list": "列表",
@@ -4035,12 +4049,16 @@
       "item8": "兑换费率",
       "item8": "兑换费率",
       "item9": "充值时间",
       "item9": "充值时间",
       "item10": "充值状态",
       "item10": "充值状态",
+      "item11": "充值类型",
       "b1": "更新",
       "b1": "更新",
       "s1": "卡号",
       "s1": "卡号",
       "s2": "币种",
       "s2": "币种",
       "t1": "成功",
       "t1": "成功",
       "t2": "失败",
       "t2": "失败",
-      "t3": "处理中"
+      "t3": "处理中",
+      "r1": "系统充值默认金额",
+      "r2": "速汇退款",
+      "r3": "充值"
     },
     },
     "Transactions": {
     "Transactions": {
       "item1": "卡片类型ID",
       "item1": "卡片类型ID",
@@ -4056,6 +4074,7 @@
       "item11": "交易状态",
       "item11": "交易状态",
       "item12": "数据类型",
       "item12": "数据类型",
       "item13": "备注",
       "item13": "备注",
+      "item14": "交易时间",
       "b1": "更新",
       "b1": "更新",
       "s1": "卡号",
       "s1": "卡号",
       "s2": "交易币种",
       "s2": "交易币种",
@@ -4101,6 +4120,7 @@
       "item9": "币种",
       "item9": "币种",
       "item10": "余额",
       "item10": "余额",
       "item11": "手持护照和银行卡照图片",
       "item11": "手持护照和银行卡照图片",
+      "item12": "申请时间",
       "b1": "银行卡激活",
       "b1": "银行卡激活",
       "b2": "银行卡充值",
       "b2": "银行卡充值",
       "b3": "查询充值预估到账金额",
       "b3": "查询充值预估到账金额",
@@ -4142,6 +4162,7 @@
       "item7": "合作商用户ID",
       "item7": "合作商用户ID",
       "item8": "手续费状态",
       "item8": "手续费状态",
       "item9": "备注",
       "item9": "备注",
+      "item10": "申请时间",
       "b1": "更新",
       "b1": "更新",
       "b2": "查询开卡进度",
       "b2": "查询开卡进度",
       "s1": "卡号",
       "s1": "卡号",
@@ -4172,6 +4193,8 @@
       "item9": "姓名",
       "item9": "姓名",
       "item10": "邮箱",
       "item10": "邮箱",
       "item11": "手机号",
       "item11": "手机号",
+      "item12": "审核时间",
+      "item13": "申请时间",
       "b1": "查询KYC认证状态",
       "b1": "查询KYC认证状态",
       "b2": "提交KYC认证",
       "b2": "提交KYC认证",
       "b3": "申请开卡",
       "b3": "申请开卡",
@@ -4551,7 +4574,7 @@
       "deduction4": "退款处理中",
       "deduction4": "退款处理中",
       "deduction5": "退款成功",
       "deduction5": "退款成功",
       "deduction6": "退款失败",
       "deduction6": "退款失败",
-      "currencyTip": "预计转换后为",
+      "currencyTip":"预计转换后为",
       "CancelOrder": "取消订单",
       "CancelOrder": "取消订单",
       "ConfirmCancelOrder": "确定要取消订单吗?",
       "ConfirmCancelOrder": "确定要取消订单吗?",
       "CancelOrderSuccess": "取消成功",
       "CancelOrderSuccess": "取消成功",
@@ -4620,6 +4643,8 @@
       "item1": "商户名称",
       "item1": "商户名称",
       "item2": "描述",
       "item2": "描述",
       "item3": "值",
       "item3": "值",
+      "item4": "交易时间",
+      "item5": "过期时间",
       "s1": "3ds验证码",
       "s1": "3ds验证码",
       "s2": "交易授权响应url",
       "s2": "交易授权响应url",
       "s3": "激活码(实体卡)"
       "s3": "激活码(实体卡)"
@@ -5032,18 +5057,18 @@
       "tab3": "扣款记录"
       "tab3": "扣款记录"
     },
     },
     "CardFile": {
     "CardFile": {
-      "p1": "步骤列表",
-      "p2": "步骤",
-      "p3": "流程描述",
-      "p4": "请输入图片地址",
-      "p5": "请上传图片",
-      "p6": "视频列表",
-      "p7": "视频",
-      "p8": "请输入视频地址",
-      "p9": "请上传视频",
-      "p10": "PDF",
-      "p11": "PDF 密码",
-      "p12": "请上传PDF"
+      "p1":"步骤列表",
+      "p2":"步骤",
+      "p3":"流程描述",
+      "p4":"请输入图片地址",
+      "p5":"请上传图片",
+      "p6":"视频列表",
+      "p7":"视频",
+      "p8":"请输入视频地址",
+      "p9":"请上传视频",
+      "p10":"PDF",
+      "p11":"PDF 密码",
+      "p12":"请上传PDF"
     }
     }
   },
   },
   "global": {
   "global": {
@@ -7298,9 +7323,9 @@
     "GivePhone": "联系电话",
     "GivePhone": "联系电话",
     "GiftDetail": "申请礼物详情"
     "GiftDetail": "申请礼物详情"
   },
   },
-  "Statistical": "统计入金金额",
-  "StatisticalWithdraw": "统计出金金额",
-  "NoData": "暂无数据",
+  "Statistical":"统计入金金额",
+  "StatisticalWithdraw":"统计出金金额",
+  "NoData":"暂无数据",
   "PersonalManagement": {
   "PersonalManagement": {
     "Bank": "银行信息",
     "Bank": "银行信息",
     "Title": {
     "Title": {

+ 26 - 3
src/i18n/locales/en.json

@@ -81,7 +81,8 @@
     "OperationFailed": "Operation failed",
     "OperationFailed": "Operation failed",
     "ConfirmSendReport": "Are you sure you want to send this sales performance report?",
     "ConfirmSendReport": "Are you sure you want to send this sales performance report?",
     "SendReportSuccess": "Report sent successfully",
     "SendReportSuccess": "Report sent successfully",
-    "SendReportFailed": "Failed to send report"
+    "SendReportFailed": "Failed to send report",
+    "PleaseSelect": "Please select items first"
   },
   },
   "signin": {
   "signin": {
     "bar": {
     "bar": {
@@ -212,6 +213,7 @@
     "CSV": "export CSV",
     "CSV": "export CSV",
     "XLS": "export XLS",
     "XLS": "export XLS",
     "Export": "export",
     "Export": "export",
+    "BatchClose": "Batch Close",
     "BalanceOperating": "Balance Management",
     "BalanceOperating": "Balance Management",
     "EditTemplate": "Edit Template",
     "EditTemplate": "Edit Template",
     "More": "More",
     "More": "More",
@@ -260,6 +262,9 @@
     "NoDeduction": "No Deduction",
     "NoDeduction": "No Deduction",
     "Deducted": "Deducted",
     "Deducted": "Deducted",
     "Cancelled": "Cancelled",
     "Cancelled": "Cancelled",
+    "CommissionTransfer": "Commission Transfer",
+    "AgentTransfer": "Agent Transfer",
+    "IBAgentAccount": "IB Agent Account",
     "NotCopied": "Not Copied",
     "NotCopied": "Not Copied",
     "CopyIn": "Copy In",
     "CopyIn": "Copy In",
     "OpenPosition": "Open Position",
     "OpenPosition": "Open Position",
@@ -706,6 +711,8 @@
   "R-EmailRecords-Search": "List",
   "R-EmailRecords-Search": "List",
   "R-DeleteList": "Delete List",
   "R-DeleteList": "Delete List",
   "R-DeleteList-Search": "List",
   "R-DeleteList-Search": "List",
+  "R-Attribution": "Attribution Record",
+  "R-Attribution-Search": "List",
   "R-Reward-Details": "Sales Reward Details",
   "R-Reward-Details": "Sales Reward Details",
   "R-Review": "Review",
   "R-Review": "Review",
   "R-AccountRetrieval-Search": "List",
   "R-AccountRetrieval-Search": "List",
@@ -2036,7 +2043,7 @@
     "type_dynamic2": "Demo Account Application",
     "type_dynamic2": "Demo Account Application",
     "type_dynamic3": "Deposit",
     "type_dynamic3": "Deposit",
     "type_dynamic4": "Withdrawal",
     "type_dynamic4": "Withdrawal",
-    "type_dynamic5": "IB commission fund transfer",
+    "type_dynamic5": "Internal Transfer",
     "type_dynamic6": "Commission",
     "type_dynamic6": "Commission",
     "type_dynamic7": "Activity",
     "type_dynamic7": "Activity",
     "type_dynamic8": "Password",
     "type_dynamic8": "Password",
@@ -2044,6 +2051,7 @@
     "type_dynamic10": "Internal Transfer-Out",
     "type_dynamic10": "Internal Transfer-Out",
     "type_dynamic11": "Internal Transfer-Enter",
     "type_dynamic11": "Internal Transfer-Enter",
     "type_dynamic12": "Commission Transfer",
     "type_dynamic12": "Commission Transfer",
+    "type_dynamic13": "Commission Extract",
     "GoogleGroup": "Google Group",
     "GoogleGroup": "Google Group",
     "GroupEmail": "Group Email",
     "GroupEmail": "Group Email",
     "GroupName": "Group Name",
     "GroupName": "Group Name",
@@ -2839,6 +2847,8 @@
     "NewPwdConfirm": "New Password Confirmation",
     "NewPwdConfirm": "New Password Confirmation",
     "NewAttributionNumber": "New Affiliation Code",
     "NewAttributionNumber": "New Affiliation Code",
     "OldAttributionNumber": "Current Affiliation Code",
     "OldAttributionNumber": "Current Affiliation Code",
+    "OldIbNo": "Previous Attribution Code",
+    "NewIbNo": "New Attribution",
     "ActivityName": "Activity Name",
     "ActivityName": "Activity Name",
     "Platform": "Platform",
     "Platform": "Platform",
     "Deposit": "Deposit",
     "Deposit": "Deposit",
@@ -2934,6 +2944,7 @@
     "cptIdSelect": "Please select a competition first",
     "cptIdSelect": "Please select a competition first",
     "SerialNumber": "Serial Number",
     "SerialNumber": "Serial Number",
     "Time": "Time",
     "Time": "Time",
+    "modifyTime": "Modify Time",
     "Profit": "Profit",
     "Profit": "Profit",
     "Floating": "Floating Profit",
     "Floating": "Floating Profit",
     "FloatingSum": "Total Floating Profit",
     "FloatingSum": "Total Floating Profit",
@@ -3989,12 +4000,16 @@
       "item8": "Exchange Rate",
       "item8": "Exchange Rate",
       "item9": "Top-up Time",
       "item9": "Top-up Time",
       "item10": "Top-up Status",
       "item10": "Top-up Status",
+      "item11": "Recharge Type",
       "b1": "Update",
       "b1": "Update",
       "s1": "Card Number",
       "s1": "Card Number",
       "s2": "Currency",
       "s2": "Currency",
       "t1": "Success",
       "t1": "Success",
       "t2": "Failure",
       "t2": "Failure",
-      "t3": "Processing"
+      "t3": "Processing",
+      "r1": "System Recharge Default Amount",
+      "r2": "Express Transfer Refund",
+      "r3": "Recharge"
     },
     },
     "Transactions": {
     "Transactions": {
       "item1": "Card Type ID",
       "item1": "Card Type ID",
@@ -4010,6 +4025,7 @@
       "item11": "Transaction Status",
       "item11": "Transaction Status",
       "item12": "Data Type",
       "item12": "Data Type",
       "item13": "Remarks",
       "item13": "Remarks",
+      "item14": "Transaction Time",
       "b1": "Update",
       "b1": "Update",
       "s1": "Card Number",
       "s1": "Card Number",
       "s2": "Transaction Currency",
       "s2": "Transaction Currency",
@@ -4054,6 +4070,7 @@
       "item9": "Currency",
       "item9": "Currency",
       "item10": "Balance",
       "item10": "Balance",
       "item11": "Photo Holding Passport and Bank Card",
       "item11": "Photo Holding Passport and Bank Card",
+      "item12": "Application Time",
       "b1": "Activate Bank Card",
       "b1": "Activate Bank Card",
       "b2": "Top Up Bank Card",
       "b2": "Top Up Bank Card",
       "b3": "Estimate Recharge Arrival Amount",
       "b3": "Estimate Recharge Arrival Amount",
@@ -4091,6 +4108,8 @@
       "item6": "Card Description",
       "item6": "Card Description",
       "item7": "Partner User ID",
       "item7": "Partner User ID",
       "item8": "Fee Status",
       "item8": "Fee Status",
+      "item9": "Remark",
+      "item10": "Application Time",
       "b1": "Update",
       "b1": "Update",
       "b2": "Check Card Issuance Progress",
       "b2": "Check Card Issuance Progress",
       "s1": "Card Number",
       "s1": "Card Number",
@@ -4118,6 +4137,8 @@
       "item9": "Full Name",
       "item9": "Full Name",
       "item10": "Email",
       "item10": "Email",
       "item11": "Mobile Number",
       "item11": "Mobile Number",
+      "item12": "Review Time",
+      "item13": "Application Time",
       "b1": "Check KYC Status",
       "b1": "Check KYC Status",
       "b2": "Submit KYC",
       "b2": "Submit KYC",
       "b3": "Apply for Card",
       "b3": "Apply for Card",
@@ -4562,6 +4583,8 @@
       "item1": "Merchant Name",
       "item1": "Merchant Name",
       "item2": "Description",
       "item2": "Description",
       "item3": "Values",
       "item3": "Values",
+      "item4": "Transaction Time",
+      "item5": "Expiration Time",
       "s1": "3DS otp",
       "s1": "3DS otp",
       "s2": "Transaction Authorization Response URL",
       "s2": "Transaction Authorization Response URL",
       "s3": "Activation Code (Physical Card)"
       "s3": "Activation Code (Physical Card)"

+ 9 - 8
src/routers/modules/uCard.ts

@@ -184,14 +184,15 @@ const uCardRoute = {
       name: 'R-Card-WithdrawTransaction',
       name: 'R-Card-WithdrawTransaction',
       component: () => import('@/views/card/CardWithdrawTransaction/index.vue'),
       component: () => import('@/views/card/CardWithdrawTransaction/index.vue'),
     },
     },
-    //   {
-    //     meta: {
-    //       OnBreadCrumb: true,
-    //     },
-    //     path: 'recharge',
-    //     name: 'R-Recharge',
-    //     component: () => import(/* webpackChunkName: "Recharge" */ '@/views/card/Recharge.vue'),
-    //   },
+    {
+      meta: {
+        OnBreadCrumb: true,
+      },
+      path: 'recharge',
+      name: 'R-Recharge',
+      component: () =>
+        import(/* webpackChunkName: "Recharge" */ '@/views/card/CardRecharge/index.vue'),
+    },
     {
     {
       meta: {
       meta: {
         OnBreadCrumb: true,
         OnBreadCrumb: true,

+ 193 - 0
src/views/card/CardRecharge/components/add.vue

@@ -0,0 +1,193 @@
+<template>
+  <div id="TradingDetailedInfoAdd" class="InfoBox" :class="{ active: dialogInfoTradingAdd }">
+    <div class="header">
+      <div>
+        <span class="title">{{ t('R-Recharge-Btn3') }}</span>
+      </div>
+      <span class="close crm-cursor" @click="close">
+        <el-icon><Close /></el-icon>
+      </span>
+    </div>
+    <el-form ref="form" :rules="rules" :model="form" label-width="120PX">
+      <el-form-item :label="t('Ucard.KycAuth.item8') + ':'">
+        <el-input v-model="form.cId" disabled placeholder=""></el-input>
+      </el-form-item>
+      <el-form-item :label="t('Ucard.KycAuth.item9') + ':'">
+        <el-input
+          v-model="form.lastName"
+          disabled
+          style="width: 45%; display: inline-block"
+        ></el-input>
+        <el-input
+          v-model="form.firstName"
+          disabled
+          style="width: 45%; display: inline-block; margin-left: 10px"
+        ></el-input>
+      </el-form-item>
+      <el-form-item :label="t('Ucard.KycAuth.item10') + ':'">
+        <el-input v-model="form.email" disabled placeholder=""></el-input>
+      </el-form-item>
+      <el-form-item :label="t('Ucard.KycAuth.item11') + ':'">
+        <el-input v-model="form.mobile" disabled placeholder=""></el-input>
+      </el-form-item>
+      <el-form-item prop="status" :label="t('Label.CheckResults') + ':'">
+        <el-select
+          v-model="form.status"
+          class="crm_search_down"
+          :placeholder="t('Placeholder.Choose')"
+        >
+          <el-option :label="t('Apply_info.VerifiedUser.Agree')" :value="2"></el-option>
+          <el-option :label="t('Apply_info.VerifiedUser.Refused')" :value="3"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item v-if="form.status == 3" prop="approveDesc" :label="t('Label.Descr') + ':'">
+        <el-select
+          v-model="form.approveDesc"
+          filterable
+          class="crm_search_down"
+          :placeholder="t('Placeholder.Choose')"
+          allow-create
+        >
+          <el-option
+            v-for="item in reasons"
+            :key="item.id"
+            :label="Session.Get('lang') == 'cn' ? item.content : item.enContent"
+            :value="item.id"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+    </el-form>
+    <span class="btn crm-cursor" @click="confirm"
+      ><span>{{ t('Btn.Confirm') }}</span></span
+    >
+  </div>
+</template>
+
+<script setup lang="ts">
+  import { ref, reactive, computed, watch, onMounted, inject } from 'vue'
+  import { useI18n } from 'vue-i18n'
+  import type { FormInstance, FormRules } from 'element-plus'
+  import ServiceSalary from '@/service/salaryPerformance'
+  import ServiceMarket from '@/service/marketing'
+  import ServiceUser from '@/service/user'
+  import Config from '@/config/index'
+  import { Close } from '@element-plus/icons-vue'
+
+  const { Code } = Config
+  const { t } = useI18n()
+  const Session = inject('session')
+  const pigeon = inject('pigeon')
+
+  interface Props {
+    dialogInfoTradingAdd: boolean
+    editor?: string
+    myInfo?: any
+    formList?: any
+  }
+
+  const props = withDefaults(defineProps<Props>(), {
+    dialogInfoTradingAdd: false,
+    editor: '',
+    myInfo: null,
+    formList: null,
+  })
+
+  const emit = defineEmits<{
+    (e: 'update:dialogInfoTradingAdd', value: boolean): void
+    (e: 'confirmToReload'): void
+    (e: 'close'): void
+  }>()
+
+  // Refs
+  const formRef = ref<FormInstance>()
+
+  // Reactive data
+  const form = reactive({})
+  const rules = ref<FormRules>({
+    areaId: [
+      {
+        required: true,
+        message: t('Placeholder.Choose'),
+        trigger: 'change',
+      },
+    ],
+  })
+
+  const user = computed(() => {
+    return JSON.parse(Session.Get('user', true))
+  })
+  // Methods
+
+  // 提交
+  const confirm = () => {
+    if (!formRef.value) return
+
+    formRef.value.validate((valid) => {
+      if (valid) {
+        toConfirm()
+      } else {
+        return false
+      }
+    })
+  }
+  // 审核充值
+  const rechargeApprove = async () => {
+    try {
+      const res = await Service.rechargeApprove({
+        cardTypeId: form.cardTypeId,
+        cardNumber: form.cardNumber,
+        uniqueId: form.uniqueId,
+        approveDesc: form.approveDesc,
+        approveStatus: form.status,
+        ids: [form.id],
+        cId: user.value.cId,
+      })
+
+      if (res.code == Code.StatusOK) {
+        ElMessage.success(t('Msg.Success12'))
+        confirmToReload()
+      } else {
+        ElMessage.error(res.msg)
+      }
+    } catch (error) {
+      console.error('充值审核失败:', error)
+      ElMessage.error(t('Msg.SystemError'))
+    }
+  }
+
+  const toConfirm = () => {
+    Object.assign(form, {
+      cardNumber: form.cardNumber.replace(/\s+/g, ''),
+    })
+    rechargeApprove()
+  }
+
+  const close = () => {
+    emit('update:dialogInfoTradingAdd', false)
+    emit('close')
+  }
+
+  // Watch
+  watch(
+    () => props.formList,
+    (newVal) => {
+      if (newVal) {
+        Object.assign(form, newVal)
+      }
+    },
+    { immediate: true }
+  )
+  // Watch
+  watch(
+    () => props.dialogInfoTradingAdd,
+    (newVal) => {
+      if (!newVal && formRef.value) {
+        formRef.value?.resetFields()
+        Object.assign(form, {})
+      }
+    },
+    { immediate: true }
+  )
+</script>
+
+<style scoped lang="scss"></style>

+ 17 - 0
src/views/card/CardRecharge/const.ts

@@ -0,0 +1,17 @@
+export const approveStatusOptions = [
+  { label: 'Ucard.UserOrder.t11', value: 1 },
+  { label: 'Ucard.UserOrder.t12', value: 2 },
+  { label: 'Ucard.UserOrder.t13', value: 3 },
+]
+
+export const statusOptions = [
+  { label: 'Ucard.Recharge.t1', value: 'success' },
+  { label: 'Ucard.Recharge.t2', value: 'fail' },
+  { label: 'Ucard.VirtualCard.t11', value: 'wait_process' },
+  { label: 'Ucard.Recharge.t3', value: 'processing' },
+]
+
+export const checkResultOptions = [
+  { label: 'Apply_info.VerifiedUser.Agree', value: 2 },
+  { label: 'Apply_info.VerifiedUser.Refused', value: 3 },
+]

+ 869 - 0
src/views/card/CardRecharge/index.vue

@@ -0,0 +1,869 @@
+<template>
+  <div
+    id="review_Email"
+    v-loading="pictLoading"
+    class="view"
+    :element-loading-background="'rgba(43, 48, 67, 0.65)'"
+    :element-loading-spinner="'el-icon-loading'"
+  >
+    <div class="crm_search">
+      <el-form ref="formRef" :model="search" label-width="">
+        <el-row>
+          <el-col :span="24" :md="24" :lg="24">
+            <el-form-item style="margin-right: 10px">
+              <el-input
+                v-model.trim="search.cId"
+                class="crm-border-radius-no"
+                clearable
+                :placeholder="t('Label.CidAccount')"
+                @keyup.enter="toSearch"
+              ></el-input>
+            </el-form-item>
+            <el-form-item style="margin-right: 10px">
+              <el-input
+                v-model.trim="search.mobile"
+                class="crm-border-radius-no"
+                clearable
+                :placeholder="t('Ucard.KycAuth.item2')"
+                @keyup.enter="toSearch"
+              ></el-input>
+            </el-form-item>
+            <el-form-item style="margin-right: 10px">
+              <el-input
+                v-model.trim="search.email"
+                class="crm-border-radius-no"
+                clearable
+                :placeholder="t('Ucard.KycAuth.item3')"
+                @keyup.enter="toSearch"
+              ></el-input>
+            </el-form-item>
+            <el-form-item style="margin-right: 10px">
+              <el-input
+                v-model.trim="search.cardNumber"
+                class="crm-border-radius-no"
+                clearable
+                :placeholder="t('Ucard.Recharge.s1')"
+                @keyup.enter="toSearch"
+              ></el-input>
+            </el-form-item>
+            <el-form-item style="margin-right: 10px">
+              <el-select
+                v-model="search.approveStatus"
+                class="crm-border-radius-no"
+                clearable
+                :placeholder="t('R-Review-Status')"
+                @change="toSearch"
+              >
+                <el-option
+                  v-for="option in approveStatusOptions"
+                  :key="option.value"
+                  :label="t(option.label)"
+                  :value="option.value"
+                />
+              </el-select>
+            </el-form-item>
+            <el-form-item style="margin-right: 10px">
+              <el-select
+                v-model="search.rechargeType"
+                class="crm-border-radius-no"
+                clearable
+                :placeholder="t('Ucard.Recharge.item11')"
+                @change="toSearch"
+              >
+                <el-option
+                  v-for="(value, key) in rechargeTypes"
+                  :key="key"
+                  :label="t(value)"
+                  :value="key"
+                />
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-select
+                v-model="search.status"
+                class="crm-border-radius-no"
+                clearable
+                :placeholder="t('Ucard.Recharge.item10')"
+                @change="toSearch"
+              >
+                <el-option
+                  v-for="option in statusOptions"
+                  :key="option.value"
+                  :label="t(option.label)"
+                  :value="option.value"
+                />
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <el-button
+                class="crm-border-radius-no crm-border-left-no"
+                :icon="Search"
+                @click="toSearch"
+              ></el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item>
+          <el-button
+            v-if="display['R-Recharge-Export']?.show"
+            type="primary"
+            style="margin-left: 8px"
+            @click="exportAgents"
+          >
+            {{ t('Btn.Export') }}
+          </el-button>
+        </el-form-item>
+        <el-form-item v-if="display['R-Recharge-Btn2']?.show">
+          <div class="search_action_btn">
+            <span
+              v-if="multipleSelection.length"
+              class="crm-cursor delete active"
+              @click="approvalAll"
+            >
+              {{ t('R-Recharge-Btn4') }}
+            </span>
+            <span v-if="!multipleSelection.length" class="crm-cursor delete">
+              {{ t('R-Recharge-Btn4') }}
+            </span>
+          </div>
+        </el-form-item>
+      </el-form>
+
+      <div class="card-mock-demo" style="margin: 30px 0">
+        <el-table
+          :data="mock_tableData"
+          show-summary
+          :summary-method="getSummaries1"
+          stripe
+          style="margin-top: 20px; width: 100%"
+          @selection-change="handleSelectionChange"
+        >
+          <el-table-column align="left" type="selection" width="60" :selectable="checkSelectable">
+          </el-table-column>
+          <el-table-column prop="" align="left" :label="t('Label.CidAccount')">
+            <template #default="{ row }">
+              <span>{{ row.cId || '--' }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="" align="left" :label="t('Label.Name')">
+            <template #default="{ row }">
+              <span v-if="row.firstName">
+                {{ row.firstName + ' ' }}
+              </span>
+              <span v-if="row.middle">{{ row.middle + ' ' }}</span>
+              <span v-if="row.lastName">{{ row.lastName }}</span>
+              <span v-if="!row.firstName && !row.lastName && !row.middle">
+                {{ '--' }}
+              </span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="" align="left" :label="t('Label.Email')">
+            <template #default="{ row }">
+              {{ row.email || '--' }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="mobile" align="left" :label="t('Ucard.KycAuth.item2')">
+            <template #default="{ row }"> {{ row.areaCode }} {{ row.mobile }} </template>
+          </el-table-column>
+          <el-table-column prop="cardNumber" align="left" :label="t('Ucard.Recharge.item2')">
+            <template #default="{ row }">
+              <span
+                v-if="row.cardNumber"
+                class="crm-text-underline"
+                @click="cardOpen(row.cardNumber)"
+              >
+                {{ row.cardNumber || '--' }}
+              </span>
+              <span v-else>{{ row.cardNumber || '--' }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="currency" align="left" :label="t('Ucard.Recharge.item3')" />
+          <el-table-column
+            prop="amount"
+            width="120"
+            align="left"
+            :label="t('Ucard.Recharge.item4')"
+          />
+          <el-table-column prop="fee" width="120" align="left" :label="t('card.CardType.item23')" />
+          <el-table-column
+            prop="rechargeFee"
+            width="120"
+            align="left"
+            :label="t('Ucard.Recharge.item5')"
+          />
+          <el-table-column prop="receivedAmount" align="left" :label="t('Ucard.Recharge.item6')" />
+          <el-table-column
+            prop="receivedCurrency"
+            align="left"
+            :label="t('Ucard.Recharge.item7')"
+          />
+          <el-table-column prop="rechargeType" align="left" :label="t('Ucard.Recharge.item11')">
+            <template #default="{ row }">
+              {{ t(rechargeTypes[row.rechargeType]) }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="approveStatus" align="left" :label="t('R-Review-Status')">
+            <template #default="{ row }">
+              <span v-if="row.approveStatus == '2'" class="state crm_state_blue">
+                {{ t('Ucard.UserOrder.t12') }}
+              </span>
+              <span v-else-if="row.approveStatus == '3'" class="state crm_state_gray">
+                {{ t('Ucard.UserOrder.t13') }}
+              </span>
+              <span v-else class="state crm_state_yellow">
+                {{ t('Ucard.UserOrder.t11') }}
+              </span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="status" align="left" :label="t('Ucard.Recharge.item10')">
+            <template #default="{ row }">
+              <span v-if="row.status === 'success'" class="state crm_state_blue">
+                {{ t('Ucard.Recharge.t1') }}
+              </span>
+              <span v-else-if="row.status === 'fail'" class="state crm_state_gray">
+                {{ t('Ucard.Recharge.t2') }}
+              </span>
+              <span v-else-if="row.status === 'wait_process'" class="state crm_state_yellow">
+                {{ t('Ucard.VirtualCard.t11') }}
+              </span>
+              <span v-else class="state crm_state_orange">
+                {{ t('Ucard.Recharge.t3') }}
+              </span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="transactionTime" align="left" :label="t('Ucard.Recharge.item9')" />
+          <el-table-column prop="" align="center" :label="t('Label.Action')">
+            <template #default="{ row }">
+              <el-dropdown trigger="click" @command="handleCommand">
+                <span class="el-dropdown-link crm-cursor">
+                  <i style="font-weight: bold; font-size: 20px" class="iconfont iconcaidan"></i>
+                </span>
+                <template #dropdown>
+                  <el-dropdown-menu>
+                    <el-dropdown-item
+                      v-if="
+                        display['R-Recharge-Btn2']?.show &&
+                        (row.status == 'wait_process' ||
+                          row.status == 'processing' ||
+                          row.status == null) &&
+                        row.approveStatus == '2'
+                      "
+                      :command="{ type: 4, row: row }"
+                    >
+                      <el-icon><Operation /></el-icon>
+                      <span>{{ t('R-Recharge-Btn2') }}</span>
+                    </el-dropdown-item>
+                    <el-dropdown-item
+                      v-if="display['R-Recharge-Btn1']?.show"
+                      :command="{ type: 1, row: row }"
+                    >
+                      <el-icon><Operation /></el-icon>
+                      <span>{{ t('R-Recharge-Btn1') }}</span>
+                    </el-dropdown-item>
+                    <el-dropdown-item
+                      v-if="display['R-CardOrder-Btn3']?.show && row.approveStatus == '1'"
+                      :command="{ type: 3, row: row }"
+                    >
+                      <el-icon><Operation /></el-icon>
+                      <span>{{ t('R-Recharge-Btn3') }}</span>
+                    </el-dropdown-item>
+                  </el-dropdown-menu>
+                </template>
+              </el-dropdown>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+    </div>
+    <div v-if="pagerInfo.rowTotal" class="crm_pagination">
+      <div class="crm_page_total">
+        <span>{{ t('Page.total.item1') }}</span>
+        <span>{{ pagerInfo.rowTotal }}</span>
+        <span>{{ t('Page.total.item2') }}</span>
+      </div>
+      <el-pagination
+        v-model:current-page="pagerInfo.current"
+        class="page"
+        background
+        layout="sizes, prev, pager, next"
+        :page-sizes="[10, 20, 50, 100]"
+        :page-size="pagerInfo.row"
+        :total="pagerInfo.rowTotal"
+        @current-change="handleCurrentChange"
+        @size-change="handleSizeChange"
+      >
+      </el-pagination>
+    </div>
+
+    <!-- 组件引用 -->
+    <add
+      :dialog-info-trading-add="dialogInfoTradingAdd"
+      :editor="editor"
+      :my-info="myInfo"
+      :form-list="formList"
+      @confirm-to-reload="confirmToReload"
+      @close-add="closeAdd"
+    ></add>
+    <div v-if="dialogInfoTradingAdd" class="crm_verified_info_mask" @click="closeDiaAdd"></div>
+
+    <detailed-info-cid
+      :dialog-info-cid="dialogInfoCid"
+      :form-info="formInfo"
+      :is-trading="true"
+      @close="close"
+    >
+    </detailed-info-cid>
+    <div v-if="dialogInfoCid" class="crm_verified_info_mask" @click="closeDia"></div>
+
+    <ViewCardSingle
+      :dialog-info-trading-single="dialogInfoTradingSingle"
+      :form-list="formSingle"
+      :editor-type="editorType"
+      @close-single="closeSingle"
+    >
+    </ViewCardSingle>
+    <div v-if="dialogInfoTradingSingle" class="crm_verified_info_mask" @click="closeSingle"></div>
+
+    <!-- 批量审批弹窗 -->
+    <el-dialog v-model="approvalAllDialog" :title="t('R-Recharge-Btn4')" width="900px">
+      <el-form
+        :rules="rules"
+        :model="approvalForm"
+        label-width="130px"
+        label-position="right"
+        class="business-edit-form"
+      >
+        <el-form-item prop="amount" :label="t('Ucard.Recharge.item4') + ':'">
+          <el-input
+            v-model.trim="approvalForm.amount"
+            class="crm-border-radius-no"
+            disabled
+            clearable
+            :placeholder="t('Ucard.Recharge.item4')"
+          ></el-input>
+        </el-form-item>
+        <el-form-item prop="fee" :label="t('Ucard.Recharge.item5') + ':'">
+          <el-input
+            v-model.trim="approvalForm.fee"
+            class="crm-border-radius-no"
+            disabled
+            clearable
+            :placeholder="t('card.CardType.item23')"
+          ></el-input>
+        </el-form-item>
+        <el-form-item prop="status" :label="t('Label.CheckResults') + ':'">
+          <el-select
+            v-model="approvalForm.status"
+            class="crm_search_down"
+            :placeholder="t('Placeholder.Choose')"
+          >
+            <el-option
+              v-for="option in checkResultOptions"
+              :key="option.value"
+              :label="t(option.label)"
+              :value="option.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item
+          v-if="approvalForm.status == 3"
+          prop="approveDesc"
+          :label="t('Label.Descr') + ':'"
+        >
+          <el-select
+            v-model="approvalForm.approveDesc"
+            filterable
+            class="crm_search_down"
+            :placeholder="t('Placeholder.Choose')"
+            allow-create
+            @change="selectChange"
+          >
+            <el-option
+              v-for="item in reasonsList"
+              :key="item.id"
+              :label="langZh ? item.content : item.enContent"
+              :value="item.id"
+            />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button @click="approvalAllDialog = false">
+            {{ t('Ucard.Business.p32') }}
+          </el-button>
+          <el-button type="primary" @click="rechargeApprove">
+            {{ t('card.Btn.Confirm') }}
+          </el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+  import { ref, reactive, computed, onMounted, watch, inject, defineAsyncComponent } from 'vue'
+  import { useI18n } from 'vue-i18n'
+  import { useRouter } from 'vue-router'
+  import { ElMessage } from 'element-plus'
+  import Service from '@/service/ucard'
+  import Config from '@/config/index'
+  import Service1 from '@/service/customer'
+  import Service2 from '@/service/apply'
+  import { exportExcel } from '@/utils/export'
+  import { rechargeTypes } from '@/enum/card/recharge'
+  import { Operation, Search } from '@element-plus/icons-vue'
+  import {
+    approveStatusOptions,
+    checkResultOptions,
+    statusOptions,
+  } from '@/views/card/CardRecharge/const'
+  import Add from '@/views/card/CardRecharge/components/add.vue'
+
+  const { t } = useI18n()
+  const { Code } = Config
+  const router = useRouter()
+  const Session = inject('session')
+  const pigeon = inject('pigeon')
+
+  // 异步加载组件
+  const TradingInfoAdd = defineAsyncComponent(() => import('@/views/global/VirtualCard.vue'))
+  const DetailedInfoCid = defineAsyncComponent(() =>
+    import('@/views/components/DetailedInfoCid/index.vue')
+  )
+  const ViewCardSingle = defineAsyncComponent(() =>
+    import('@/views/components/ViewCardSingle/index.vue')
+  )
+
+  // 响应式数据
+  const pictLoading = ref(false)
+  const dialogInfoTradingAdd = ref(false)
+  const dialogInfoTradingSingle = ref(false)
+  const approvalAllDialog = ref(false)
+  const dialogInfoCid = ref(false)
+  const multipleSelection = ref([])
+  const mock_tableData = ref([])
+  const reasons = ref({})
+  const formRef = ref(null)
+
+  const search = reactive({
+    tag: 1,
+    cardNumber: '',
+    mobile: '',
+    cId: '',
+    email: '',
+    currency: '',
+    approveStatus: '',
+    rechargeType: '',
+    status: '',
+  })
+
+  const pagerInfo = reactive({
+    row: 10,
+    current: 1,
+    pageTotal: 0,
+    rowTotal: 0,
+  })
+
+  const allData = reactive({
+    fee: 0,
+    amount: 0,
+    rechargeFee: 0,
+  })
+
+  const formSingle = reactive({})
+  const editorType = ref(3)
+  const editor = ref('')
+  const addType = ref('')
+  const myInfo = ref({})
+  const formList = ref({})
+  const formInfo = ref({})
+
+  const approvalForm = reactive({
+    approveDesc: null,
+    status: null,
+    approveStatus: null,
+    fee: 0,
+    amount: 0,
+    rechargeFee: 0,
+  })
+
+  // 计算属性
+  const display = computed(() => {
+    return JSON.parse(Session.Get('display', true))
+  })
+
+  const user = computed(() => {
+    return JSON.parse(Session.Get('user', true))
+  })
+
+  const langZh = computed(() => {
+    return Session.Get('lang') === 'cn'
+  })
+
+  const reasonsList = computed(() => {
+    return Object.values(reasons.value)
+  })
+
+  const combined = computed(() => {
+    let fee = 0
+    let amount = 0
+    let rechargeFee = 0
+
+    if (!multipleSelection.value.length) {
+      return { ...allData }
+    }
+
+    mock_tableData.value.forEach((item) => {
+      if (multipleSelection.value.includes(item.id)) {
+        if (!isNaN(item.fee)) {
+          fee += Number(item.fee)
+        }
+        if (!isNaN(item.amount)) {
+          amount += Number(item.amount)
+        }
+        if (!isNaN(item.rechargeFee)) {
+          rechargeFee += Number(item.rechargeFee)
+        }
+      }
+    })
+
+    return {
+      fee: parseFloat(fee.toFixed(2)),
+      amount: parseFloat(amount.toFixed(2)),
+      rechargeFee: parseFloat(rechargeFee.toFixed(2)),
+    }
+  })
+
+  const rules = computed(() => ({
+    status: [
+      {
+        required: true,
+        message: t('vaildate.select.empty'),
+        trigger: 'blur',
+      },
+    ],
+    approveDesc: [
+      {
+        required: true,
+        message: t('vaildate.select.empty'),
+        trigger: 'blur',
+      },
+    ],
+  }))
+
+  // 方法
+  // 导出
+  const exportAgents = async () => {
+    try {
+      await exportExcel('/wasabi/card/recharge/list/export', { ...search }, 'CWG_Card_Recharges')
+    } catch (error) {
+      ElMessage.error(t('Msg.ExportFail'))
+    }
+  }
+
+  const getSummaries1 = () => {
+    return [
+      t('Label.Total'),
+      '',
+      '',
+      '',
+      '',
+      '',
+      '',
+      combined.value.amount ? NumberFormatAll(combined.value.amount) : 0,
+      combined.value.fee ? NumberFormatAll(combined.value.fee) : 0,
+      '',
+      '',
+      '',
+      '',
+      '',
+    ]
+  }
+
+  // 处理总计中的数据千分位
+  const NumberFormatAll = (value) => {
+    if (value === '***') {
+      return '***'
+    }
+
+    const numValue = Number(value)
+    if (isNaN(numValue)) {
+      return '0'
+    }
+
+    return new Intl.NumberFormat('en-US', {
+      minimumFractionDigits: 0,
+      maximumFractionDigits: 20,
+    }).format(numValue)
+  }
+
+  // 银行卡详情
+  const cardOpen = (cardNumber) => {
+    router.push({
+      name: 'R-CardDetail',
+      params: { cardNumber: cardNumber },
+    })
+  }
+
+  // 详细信息cid
+  const accountOpen = (cId) => {
+    router.push({ name: 'R-CustomerDetail', params: { cId: cId } })
+  }
+
+  const searchSingleCid = async (cId) => {
+    const res = await Service1.cidRealSingle({
+      id: cId,
+    })
+    if (res.code == Code.StatusOK) {
+      if (editor.value) {
+        formList.value = res.data
+        // 这里需要根据实际情况调整
+      } else {
+        formInfo.value = res.data
+        await searchRealAll(cId)
+      }
+    } else {
+      ElMessage.error(res.msg)
+    }
+  }
+
+  // 获取原因列表
+  const searchReasons = async () => {
+    const res = await Service2.reasonsRefusalList({ type: 15 })
+    if (res.code == Code.StatusOK) {
+      reasons.value = res.data || {}
+    } else {
+      ElMessage.error(res.msg)
+    }
+  }
+
+  // 选择多项
+  const handleSelectionChange = (val) => {
+    multipleSelection.value = val
+      .filter((item) => item.approveStatus !== '2' && item.approveStatus !== '3')
+      .map((item) => item.id)
+  }
+
+  const checkSelectable = (row) => {
+    return row.approveStatus == '1'
+  }
+
+  const approvalAll = () => {
+    searchReasons()
+    approvalAllDialog.value = true
+    Object.assign(approvalForm, combined.value)
+  }
+
+  // 审核充值
+  const rechargeApprove = async () => {
+    const res = await Service.rechargeApprove({
+      cId: user.value.cId,
+      approveDesc: approvalForm.approveDesc,
+      approveStatus: approvalForm.status,
+      ids: multipleSelection.value,
+    })
+    if (res.code == 200) {
+      Object.assign(approvalForm, {
+        approveDesc: null,
+        status: null,
+        approveStatus: null,
+        fee: 0,
+        amount: 0,
+        rechargeFee: 0,
+      })
+      approvalAllDialog.value = false
+      ElMessage.success('审核成功')
+      confirmToReload()
+    } else {
+      ElMessage.error(res.msg)
+    }
+  }
+
+  // 获取cid下的真实账户信息
+  const searchRealAll = async (cId) => {
+    const res = await Service1.realCustomerListAll({
+      cId: cId,
+      page: {
+        current: 1,
+        row: 1,
+      },
+    })
+    if (res.code == Code.StatusOK) {
+      formInfo.value.realList = res.data
+      dialogInfoCid.value = true
+    } else {
+      ElMessage.error(res.msg)
+    }
+  }
+
+  // 详细信息关闭cid/pibno
+  const closeDia = () => {
+    dialogInfoCid.value = false
+  }
+
+  // 查看
+  const closeSingle = () => {
+    dialogInfoTradingSingle.value = false
+  }
+
+  const close = (val) => {
+    dialogInfoCid.value = val
+  }
+
+  const handleCommand = (command) => {
+    switch (command.type) {
+      case 1:
+        dialogInfoTradingSingle.value = true
+        Object.assign(formSingle, command.row)
+        break
+      case 3:
+        addType.value = 11
+        dialogInfoTradingAdd.value = true
+        formList.value = { ...command.row }
+        break
+      case 4:
+        if (!(command.row.status == 'success' || command.row.status == 'fail')) {
+          ucardRechargeOrder(command.row)
+        }
+        break
+    }
+  }
+
+  const closeAdd = (val) => {
+    dialogInfoTradingAdd.value = val
+  }
+
+  // 新增
+  const closeDiaAdd = () => {
+    dialogInfoTradingAdd.value = false
+    editor.value = ''
+  }
+
+  const confirmToReload = () => {
+    closeDiaAdd()
+    searchFunc()
+  }
+
+  // 查询充值订单
+  const ucardRechargeOrder = async ({ merchantOrderNo }) => {
+    const res = await Service.ucardRechargeOrder({
+      merchantOrderNo,
+      cId: user.value.cId,
+    })
+    if (res.code == Code.StatusOK) {
+      ElMessage.success(t('Msg.SearchSuccess'))
+      searchFunc()
+    } else {
+      ElMessage.error(res.msg)
+    }
+  }
+
+  const toSearch = () => {
+    pagerInfo.current = 1
+    searchFunc()
+  }
+
+  // 列表
+  const searchFunc = async () => {
+    pictLoading.value = true
+    if (!display.value['R-Recharge-Search']?.show) {
+      ElMessage.warning(t('Msg.NotDisplay'))
+      pictLoading.value = false
+      return
+    }
+
+    const res = await Service.rechargeList({
+      ...search,
+      page: {
+        current: pagerInfo.current,
+        row: pagerInfo.row,
+      },
+    })
+
+    if (res.code == Code.StatusOK) {
+      mock_tableData.value = res.data
+      Object.assign(allData, res.sum || { fee: 0, amount: 0, rechargeFee: 0 })
+
+      if (res.page != null) {
+        pagerInfo.rowTotal = res.page.rowTotal
+        pagerInfo.pageTotal = res.page.pageTotal
+      } else {
+        pagerInfo.rowTotal = 0
+      }
+
+      ElMessage.success(t('Msg.SearchSuccess'))
+    } else {
+      ElMessage.error(res.msg)
+    }
+    pictLoading.value = false
+  }
+
+  const handleSizeChange = (val) => {
+    pagerInfo.row = val
+    searchFunc()
+  }
+
+  const handleCurrentChange = (val) => {
+    pagerInfo.current = val
+    searchFunc()
+  }
+
+  const selectChange = () => {
+    // Vue 3 中不需要 $forceUpdate
+  }
+
+  // 生命周期
+  onMounted(() => {
+    searchFunc()
+  })
+
+  // 监听器
+  watch(
+    () => search.tag,
+    () => {
+      search.mobile = ''
+      search.email = ''
+      search.cId = ''
+      search.cardNumber = ''
+      search.currency = ''
+      search.approveStatus = ''
+    }
+  )
+</script>
+
+<style scoped lang="scss">
+  #review_Email {
+    .crm_search {
+      .search_action_btn {
+        .delete {
+          background-color: #a1a1a1;
+        }
+
+        .delete.active {
+          background-color: #368fec;
+        }
+      }
+    }
+
+    .el-table .state {
+      display: inline-block;
+      min-width: 80px;
+      max-width: 150px;
+      box-sizing: border-box;
+      line-height: 1.5;
+      border-radius: 2px;
+      padding: 2px 10px;
+      color: #ffffff;
+    }
+  }
+</style>
+<style lang="scss">
+  #review_Email {
+    .dialog_header_w {
+      .crm_search_down {
+        width: 400px;
+      }
+    }
+  }
+</style>

+ 1 - 1
src/views/card/CardVirtualCard/index.vue

@@ -483,7 +483,7 @@
   import DetailedInfoCid from '@/views/components/DetailedInfoCid'
   import DetailedInfoCid from '@/views/components/DetailedInfoCid'
   import ViewCardSingle from '@/views/components/ViewCardSingle'
   import ViewCardSingle from '@/views/components/ViewCardSingle'
   import { exportExcel } from '@/utils/export'
   import { exportExcel } from '@/utils/export'
-  import { CircleCheck, Delete, Operation, Refresh, Search } from '@element-plus/icons-vue'
+  import { CircleCheck, Delete, Operation, Refresh, Search, View } from '@element-plus/icons-vue'
   import { useI18n } from 'vue-i18n'
   import { useI18n } from 'vue-i18n'
   import { copyText } from '@/utils/untils'
   import { copyText } from '@/utils/untils'
   import { cancelStatus } from '@/views/card/CardVirtualCard/const'
   import { cancelStatus } from '@/views/card/CardVirtualCard/const'

+ 14 - 2
src/views/components/ViewCardSingle/index.vue

@@ -65,6 +65,12 @@
             {{ formList.cardName }}
             {{ formList.cardName }}
           </span>
           </span>
         </div>
         </div>
+        <div class="detail-item">
+          <span class="label"> {{ $t('Ucard.CardOrder.item10') }}:</span>
+          <span class="value">
+            {{ formList.addTime || '--' }}
+          </span>
+        </div>
         <div class="detail-item">
         <div class="detail-item">
           <span class="label">{{ $t('Ucard.CardOrder.item5') }}:</span>
           <span class="label">{{ $t('Ucard.CardOrder.item5') }}:</span>
           <span class="value">
           <span class="value">
@@ -158,7 +164,13 @@
         </div>
         </div>
         <div class="detail-item">
         <div class="detail-item">
           <span class="label">{{ $t('Ucard.Recharge.item9') }}:</span>
           <span class="label">{{ $t('Ucard.Recharge.item9') }}:</span>
-          <span class="value">{{ formList.addTime || '--' }}</span>
+          <span class="value">{{ formList.transactionTime || '--' }}</span>
+        </div>
+        <div class="detail-item">
+          <span class="label">{{ $t('Ucard.Recharge.item11') }}:</span>
+          <span class="value">{{
+            formList.rechargeType ? $t(rechargeTypes[formList.rechargeType]) : '--'
+          }}</span>
         </div>
         </div>
         <div class="detail-item">
         <div class="detail-item">
           <span class="label">{{ $t('Ucard.Recharge.item10') }}:</span>
           <span class="label">{{ $t('Ucard.Recharge.item10') }}:</span>
@@ -223,7 +235,6 @@
             <span v-else-if="formList.type === 'verification'">{{
             <span v-else-if="formList.type === 'verification'">{{
               $t('Ucard.Transactions.t3')
               $t('Ucard.Transactions.t3')
             }}</span>
             }}</span>
-            <span v-else-if="formList.type === 'auth'">{{ $t('Ucard.Transactions.t4') }}</span>
             <span v-else-if="formList.type === 'withdraw'">{{ $t('R-VirtualCard-Btn11') }}</span>
             <span v-else-if="formList.type === 'withdraw'">{{ $t('R-VirtualCard-Btn11') }}</span>
             <span v-else-if="formList.type === 'maintain_fee'">{{
             <span v-else-if="formList.type === 'maintain_fee'">{{
               $t('Ucard.Transactions.t5')
               $t('Ucard.Transactions.t5')
@@ -464,6 +475,7 @@
   /* eslint-disable no-console */
   /* eslint-disable no-console */
   import Config from '@/config/index'
   import Config from '@/config/index'
   import { ref, defineProps, defineEmits, computed } from 'vue'
   import { ref, defineProps, defineEmits, computed } from 'vue'
+  import { rechargeTypes } from '@/enum/card/recharge'
   import { useI18n } from 'vue-i18n'
   import { useI18n } from 'vue-i18n'
   const { t } = useI18n()
   const { t } = useI18n()
 
 

+ 1 - 3
src/views/user/userRole/components/RoleAdd/index.vue

@@ -80,9 +80,7 @@
         </div>
         </div>
       </el-form-item>
       </el-form-item>
     </el-form>
     </el-form>
-    <el-button :loading="addLoading" class="btn crm-cursor" @click="confirm">{{
-      $t('Btn.Confirm')
-    }}</el-button>
+    <el-button :loading="addLoading" @click="confirm">{{ $t('Btn.Confirm') }}</el-button>
     <el-dialog
     <el-dialog
       v-model="dialogCheck"
       v-model="dialogCheck"
       :title="dialogCheck_form.title"
       :title="dialogCheck_form.title"