zhb 1 miesiąc temu
rodzic
commit
ce4d5efa11

+ 3 - 3
composables/useMenuSplit.ts

@@ -184,8 +184,8 @@ export function useMenuSplit() {
             label: 'vu.item6',
             icon: 'crm-payment',
             children: [
-                { path: '/pages/customer/deposit', label: 'Home.page_customer.item2', icon: 'icon-deposit' },
-                { path: '/pages/customer/withdrawal', label: 'Home.page_customer.item3', icon: 'icon-withdrawal' },
+                { path: '/pages/customer/deposit-select', label: 'Home.page_customer.item2', icon: 'icon-deposit' },
+                { path: '/pages/customer/withdrawal-select', label: 'Home.page_customer.item3', icon: 'icon-withdrawal' },
                 { path: '/pages/customer/payment-history', label: 'Home.page_customer.item4', icon: 'icon-payment' },
                 { path: '/pages/customer/transfer', label: 'Custom.Index.Transfer', icon: 'icon-transfer' },
             ],
@@ -268,7 +268,7 @@ export function useMenuSplit() {
             icon: 'crm-payment',
             children: [
                 { path: '/pages/ib/transfer', label: 'Home.page_ib.item4', icon: 'icon-payment' },
-                { path: '/pages/ib/withdraw', label: 'Home.page_ib.item5', icon: 'icon-transfer' },
+                { path: '/pages/ib/withdraw-select', label: 'Home.page_ib.item5', icon: 'icon-transfer' },
                 { path: '/pages/ib/agent-transfer', label: 'Home.page_ib.item9', icon: 'icon-transfer' },
                 { path: '/pages/ib/recording', label: 'Home.page_ib.item7', icon: 'icon-application' },
             ],

+ 21 - 0
pages.json

@@ -156,6 +156,20 @@
         "navigationStyle": "custom"
       }
     },
+    {
+      "path": "pages/customer/deposit-select",
+      "style": {
+        "navigationBarTitleText": "",
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/customer/withdrawal-select",
+      "style": {
+        "navigationBarTitleText": "",
+        "navigationStyle": "custom"
+      }
+    },
     {
       "path": "pages/customer/deposit",
       "style": {
@@ -254,6 +268,13 @@
         "navigationStyle": "custom"
       }
     },
+    {
+      "path": "pages/ib/withdraw-select",
+      "style": {
+        "navigationBarTitleText": "",
+        "navigationStyle": "custom"
+      }
+    },
     {
       "path": "pages/ib/withdraw",
       "style": {

+ 3 - 3
pages/activities/composables/useActivityActions.ts

@@ -12,7 +12,7 @@ export function useActivityActions(
     tableDataCptFlagCode: any,
     refreshCallback?: () => void
 ) {
-    const { t, locale} = useI18n()
+    const { t, locale } = useI18n()
 
     // ==================== 弹窗状态 ====================
     const dialogChinaUnionPay = ref(false)
@@ -118,11 +118,11 @@ export function useActivityActions(
     }
 
     const toDeposit = () => {
-        uni.navigateTo({ url: '/pages/customer/deposit' })
+        uni.navigateTo({ url: '/pages/customer/deposit-select' })
     }
 
     const toActivity24nianzhong = () => {
-        uni.navigateTo({ url: '/pages/customer/deposit' })
+        uni.navigateTo({ url: '/pages/customer/deposit-select' })
     }
 
     const toActivity24Trading = () => {

+ 2 - 2
pages/customer/components/AccountCard copy.vue

@@ -282,10 +282,10 @@ const copy = (text: string) => {
 };
 // 按钮对应的操作方法
 const toDeposit = () => {
-    router.push(`/pages/customer/deposit?login=${accountInfo.value.login}&type=${accountInfo.value.type}&balance=${accountInfo.value.balance}&currency=${accountInfo.value.currency}`)
+    router.push(`/pages/customer/deposit-select?login=${accountInfo.value.login}&type=${accountInfo.value.type}&balance=${accountInfo.value.balance}&currency=${accountInfo.value.currency}`)
 }
 const toWithdraw = () => {
-    router.push(`/pages/customer/withdrawal?login=${accountInfo.value.login}&type=${accountInfo.value.type}&balance=${accountInfo.value.balance}&currency=${accountInfo.value.currency}`)
+    router.push(`/pages/customer/withdrawal-select?login=${accountInfo.value.login}&type=${accountInfo.value.type}&balance=${accountInfo.value.balance}&currency=${accountInfo.value.currency}`)
 }
 const toTransfer = () => {
     router.push(`/pages/customer/transfer?login=${accountInfo.value.login}&type=${accountInfo.value.type}&balance=${accountInfo.value.balance}&currency=${accountInfo.value.currency}`)

+ 3 - 2
pages/customer/components/AccountCardDesktop.vue

@@ -282,10 +282,10 @@ const toPaymentHistory = () => {
 }
 // 按钮对应的操作方法
 const toDeposit = () => {
-    router.push(`/pages/customer/deposit?login=${accountInfo.value.login}&type=${accountInfo.value.type}&balance=${accountInfo.value.balance}&currency=${accountInfo.value.currency}`)
+    router.push(`/pages/customer/deposit-select?login=${accountInfo.value.login}&type=${accountInfo.value.type}&balance=${accountInfo.value.balance}&currency=${accountInfo.value.currency}`)
 }
 const toWithdraw = () => {
-    router.push(`/pages/customer/withdrawal?login=${accountInfo.value.login}&type=${accountInfo.value.type}&balance=${accountInfo.value.balance}&currency=${accountInfo.value.currency}`)
+    router.push(`/pages/customer/withdrawal-select?login=${accountInfo.value.login}&type=${accountInfo.value.type}&balance=${accountInfo.value.balance}&currency=${accountInfo.value.currency}`)
 }
 const toTransfer = () => {
     router.push(`/pages/customer/transfer?login=${accountInfo.value.login}&type=${accountInfo.value.type}&balance=${accountInfo.value.balance}&currency=${accountInfo.value.currency}`)
@@ -382,6 +382,7 @@ onBeforeUnmount(() => {
             line-height: 1.3;
             cursor: pointer;
             color: #2e3a47;
+
             &:hover {
                 color: #1e2a3a;
             }

+ 2 - 2
pages/customer/components/AccountCardMobile.vue

@@ -222,10 +222,10 @@ const toPaymentHistory = () => {
 }
 // 按钮对应的操作方法
 const toDeposit = () => {
-    router.push(`/pages/customer/deposit?login=${accountInfo.value.login}&type=${accountInfo.value.type}&balance=${accountInfo.value.balance}&currency=${accountInfo.value.currency}`)
+    router.push(`/pages/customer/deposit-select?login=${accountInfo.value.login}&type=${accountInfo.value.type}&balance=${accountInfo.value.balance}&currency=${accountInfo.value.currency}`)
 }
 const toWithdraw = () => {
-    router.push(`/pages/customer/withdrawal?login=${accountInfo.value.login}&type=${accountInfo.value.type}&balance=${accountInfo.value.balance}&currency=${accountInfo.value.currency}`)
+    router.push(`/pages/customer/withdrawal-select?login=${accountInfo.value.login}&type=${accountInfo.value.type}&balance=${accountInfo.value.balance}&currency=${accountInfo.value.currency}`)
 }
 const toTransfer = () => {
     router.push(`/pages/customer/transfer?login=${accountInfo.value.login}&type=${accountInfo.value.type}&balance=${accountInfo.value.balance}&currency=${accountInfo.value.currency}`)

+ 1 - 1
pages/customer/components/CheckPopup.vue

@@ -67,7 +67,7 @@ const CopyShareLink = (link) => {
     data: props.goPayLink,
     success: function () {
       uni.showToast({
-        title: t('Ib.Index.CopySuccess'),
+        title: t('Btn.item8'),
         icon: 'success',
         duration: 2000
       });

+ 2486 - 0
pages/customer/deposit-select.vue

@@ -0,0 +1,2486 @@
+<template>
+    <cwg-page-wrapper class="create-page" :isHeaderFixed="true">
+        <cwg-header :title="t('Home.page_customer.item2')" />
+        <view class="custom-deposit">
+            <!-- 步骤1:选择账户 -->
+            <view class="box box-step1">
+                <view class="b-card">
+                    <view class="card-top">
+                        <text class="tit"><text class="iconfont icon-caret-right"></text>{{ t('Custom.Deposit.Title1')
+                        }}</text>
+                        <cwg-combox :clearable="false" v-model:value="loginValue" :options="loginComboxOptions"
+                            :placeholder="t('placeholder.choose')" />
+                    </view>
+                </view>
+            </view>
+            <!-- 步骤2:支付通道列表(卡片布局) -->
+            <view class="box box-step2" v-if="step2">
+                <view class="b-card">
+                    <view class="card-top">
+                        <text class="tit"><text class="iconfont icon-caret-right"></text>{{ t('Custom.Deposit.Title2')
+                        }}</text>
+                        <cwg-asset-tabs v-if="tabsConfig.length > 0" v-model="activeTab" :tabs="tabsConfig" />
+                        <uni-loading v-if="currentTableData.length == 0" />
+                        <view v-if="currentTableData.length">
+                            <PaymentMethodsList :list="currentTableData" @select="isShowStep3" />
+                        </view>
+                        <!-- <view v-if="step3" class="reselect-btn">
+                            <button class="s-btn reselect" type="primary" @click="showTable">{{
+                                t('Custom.Deposit.Reselect') }}</button>
+                        </view> -->
+                    </view>
+                </view>
+            </view>
+
+            <!-- 步骤3:填写入金信息 -->
+            <view class="box box-step3" v-if="step3">
+                <view class="b-card">
+                    <view class="card-top">
+                        <!-- 注意事项(第一步确认) -->
+                        <view v-if="!isStep3" class="step3-attention">
+                            <view class="tips" v-if="(introduce.introduce || introduce.enIntroduce)">
+                                <view>
+                                    <rich-text class="attention"
+                                        :nodes="isZh ? introduce.introduce : introduce.enIntroduce"></rich-text>
+
+                                </view>
+                            </view>
+                            <view class="btn-bottom">
+                                <text class="btn crm-cursor" @click="isStep3Open()">{{ t('Btn.Confirm')
+                                    }}</text>
+                            </view>
+
+                        </view>
+
+                        <!-- 表单(确认后显示) -->
+                        <uni-forms v-if="isStep3" ref="formRef" :model="params" :rules="rules" label-position="top"
+                            validate-trigger="submit" :label-width="300" class="base-info-form">
+                            <uni-row class="demo-uni-row uni-row1">
+                                <!-- 信用卡选择区域 -->
+                                <template v-if="isStep3 && channelData.confirmCreditCard == 1">
+                                    <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                                        <view
+                                            style="display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap;">
+                                            <text class="tit"><text class="iconfont icon-caret-right"></text>{{
+                                                t('PersonalManagement.Label.selectCreditCard') }}</text>
+                                            <view class="add-back">
+                                                <text>{{ t('PersonalManagement.Label.addCreditCard') }}</text>
+                                                <text class="add-btn crm-cursor" @click="openAddBankCard">{{
+                                                    t('Custom.Withdraw.addBank1') }}</text>
+                                            </view>
+                                        </view>
+                                    </uni-col>
+                                    <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                                        <uni-forms-item>
+                                            <cwg-combox :clearable="false" v-model:value="myId"
+                                                :options="creditCardOptions" :placeholder="t('placeholder.choose')"
+                                                @change="selectCode" />
+                                        </uni-forms-item>
+                                    </uni-col>
+                                </template>
+
+
+                                <!-- 银行选择(如有) -->
+                                <template v-if="isStep3 && bankOptions.length">
+                                    <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                                        <text class="tit"><text class="iconfont icon-caret-right"></text>{{
+                                            t('news_add_field.Label.Title4')
+                                            }}</text>
+                                    </uni-col>
+                                    <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                                        <uni-forms-item>
+                                            <cwg-combox :clearable="false" v-model:value="code" :options="bankOptions"
+                                                :placeholder="t('placeholder.choose')" @change="selectCode" />
+                                        </uni-forms-item>
+                                    </uni-col>
+                                </template>
+                                <!-- 特别提示(B2BINPAY) -->
+                                <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24"
+                                    v-if="isStep3 && bankOptions.length && channelData.code == 'B2BINPAY'">
+                                    <text class="tit" style="margin: 10px 0 20px"><text class="iconfont iconi"></text>{{
+                                        t('Custom.Deposit.Des') }}</text>
+                                </uni-col>
+
+                                <!-- 电汇信息展示 -->
+                                <template
+                                    v-if="isStep3 && ['UNION_PAY_TELEGRAPHIC', 'UNION_PAY_TELEGRAPHIC_SPECIAL', 'UNION_PAY_TELEGRAPHIC_TWO'].includes(channelData.code)">
+                                    <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                                        <text class="tit"><text class="iconfont icon-caret-right"></text>{{
+                                            t('Custom.Deposit.Title5') }}</text>
+                                    </uni-col>
+
+                                    <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                                        <view class="wire-transfer-account">
+                                            <view class="row"><text class="label SpecialColor">{{
+                                                t('Custom.Deposit.bankUname') }}</text><text
+                                                    class="content SpecialColor">{{
+                                                        WireTransferAccount.bankUname || '--'
+                                                    }}</text></view>
+                                            <view class="row"><text class="label">{{ t('Custom.Deposit.bankName')
+                                                    }}</text><text class="content">{{ WireTransferAccount.bankName ||
+                                                        '--'
+                                                    }}</text></view>
+                                            <view class="row"><text class="label SpecialColor">{{
+                                                t('Custom.Deposit.bankCardNum') }}</text><text
+                                                    class="content SpecialColor">{{
+                                                        WireTransferAccount.bankCardNum || '--'
+                                                    }}</text></view>
+                                            <view class="row"><text class="label">{{ t('Custom.Deposit.bankAddr')
+                                                    }}</text><text class="content">{{ WireTransferAccount.bankAddr ||
+                                                        '--'
+                                                    }}</text></view>
+                                            <view class="row"><text class="label SpecialColor">{{
+                                                t('Custom.Deposit.swiftCode') }}</text><text
+                                                    class="content SpecialColor">{{
+                                                        WireTransferAccount.swiftCode || '--'
+                                                    }}</text></view>
+                                            <view class="row"><text class="label">{{ t('Custom.Deposit.bankCode')
+                                                    }}</text><text class="content">{{ WireTransferAccount.bankCode ||
+                                                        '--'
+                                                    }}</text></view>
+                                            <view class="row"><text class="label SpecialColor">{{
+                                                t('Custom.Recording.Note')
+                                                    }}</text><text class="content SpecialColor">{{
+                                                        WireTransferAccount.bankMsg || '--' }}</text></view>
+                                        </view>
+                                    </uni-col>
+                                </template>
+
+
+                                <!-- 数字货币信息展示 -->
+                                <template
+                                    v-if="isStep3 && channelData.code && channelData.code.indexOf('DIGITAL_PAY_TYPE_KEY') === 0">
+                                    <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                                        <text class="tit"><text class="iconfont icon-caret-right"></text>{{
+                                            t('Custom.Deposit.DigitalAcc') }}</text>
+                                    </uni-col>
+                                    <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                                        <view class="wire-transfer-account">
+                                            <view class="row"><text class="label SpecialColor">{{
+                                                t('Custom.Deposit.DigitalName') }}</text><text
+                                                    class="content SpecialColor">{{ WireTransferAccount.name
+                                                        + '-' +
+                                                        WireTransferAccount.type }}</text></view>
+                                            <view class="row"><text class="label">{{ t('Custom.Withdraw.Title6')
+                                                    }}</text><text class="content">{{ WireTransferAccount.address ||
+                                                        '--'
+                                                    }}</text></view>
+                                            <view class="row"><text class="label">QR Code</text>
+                                                <image :src="Host85 + WireTransferAccount.url" mode="aspectFit"
+                                                    style="width: 100rpx; height: 100rpx;" />
+                                            </view>
+                                        </view>
+                                    </uni-col>
+                                </template>
+
+
+                                <!-- 表单区域(含金额、预估金额、上传凭证、优惠码) -->
+                                <template v-if="isStep3">
+                                    <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                                        <text class="tit"><text class="iconfont icon-caret-right"></text>{{
+                                            t('Custom.Deposit.Title3') }}</text>
+                                    </uni-col>
+                                    <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-loading="pictLoadingImg">
+
+                                        <!-- 金额输入 -->
+                                        <uni-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
+                                            <uni-forms-item
+                                                :label="t('Custom.Deposit.Title3') + '(' + channelData.currency + ')'"
+                                                name="amount" :error-message="amountErrorMessage">
+                                                <uni-easyinput type="number" v-model="params.amount"
+                                                    :placeholder="t('placeholder.input')" @blur="validateAmount" />
+                                            </uni-forms-item>
+                                        </uni-col>
+
+                                        <!-- 预估金额(若有汇率) -->
+                                        <uni-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8" v-if="channelData.rate">
+                                            <uni-forms-item>
+                                                <template #label>
+                                                    <view class="label-with-icon">
+                                                        <text>{{ t('Custom.Deposit.EstimatedAmount') + '(' +
+                                                            channelData.transformCurrency + ')' }}</text>
+                                                        <uni-tooltip placement="top">
+                                                            <view class="item">?</view>
+                                                            <template #content>
+                                                                <text>{{ t('Custom.Deposit.des') }}</text>
+                                                            </template>
+                                                        </uni-tooltip>
+                                                    </view>
+                                                </template>
+                                                <uni-easyinput v-model="params.amount1" disabled
+                                                    :placeholder="t('placeholder.input')" />
+                                            </uni-forms-item>
+                                        </uni-col>
+                                        <!-- 优惠码 -->
+                                        <uni-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
+                                            <uni-forms-item name="promoCode">
+                                                <template #label>
+                                                    <view class="label-with-icon">
+                                                        <text>{{ t('Custom.Deposit.PromoCode') }}</text>
+                                                        <uni-tooltip placement="top">
+                                                            <view class="item">?</view>
+                                                            <template #content>
+                                                                <text>{{ t('news_add_field.Des.item3') }}</text>
+                                                            </template>
+                                                        </uni-tooltip>
+                                                    </view>
+                                                </template>
+                                                <uni-easyinput v-model="params.promoCode"
+                                                    :placeholder="t('placeholder.input')" />
+                                            </uni-forms-item>
+                                        </uni-col>
+                                        <!-- 上传汇款凭证(特定渠道) -->
+                                        <uni-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8" v-if="
+                                            channelData.code == 'UNION_PAY_TELEGRAPHIC' ||
+                                            channelData.code == 'UNION_PAY_TELEGRAPHIC_SPECIAL' ||
+                                            channelData.code && channelData.code.indexOf('DIGITAL_PAY_TYPE_KEY') === 0 ||
+                                            channelData.code == 'UNION_PAY_TELEGRAPHIC_TWO'
+                                        ">
+                                            <uni-forms-item :label="t('Custom.Deposit.UploadRemittanceVoucher')">
+                                                <cwg-file-picker-wrapper v-model="imageUrl" :limit="1" :editable="true"
+                                                    :fileMediatype="'all'" uploadUrl="/wasabi/upload/file"
+                                                    :baseUrl="Host80" />
+                                            </uni-forms-item>
+                                        </uni-col>
+
+
+
+                                        <!-- 电汇提示 -->
+                                        <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24"
+                                            v-if="isStep3 && ['UNION_PAY_TELEGRAPHIC', 'UNION_PAY_TELEGRAPHIC_SPECIAL', 'UNION_PAY_TELEGRAPHIC_TWO'].includes(channelData.code)">
+                                            <text>{{ t('Custom.Deposit.Tips') }}</text>
+                                        </uni-col>
+
+                                        <!-- ========== 赠金活动部分 ========== -->
+                                        <!-- 10%赠金(年中赠金) -->
+                                        <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="tableData4Flag">
+                                            <uni-forms-item class="agree" name="agree4">
+                                                <label class="checkbox">
+                                                    <checkbox :checked="params.agree4"
+                                                        @click="params.agree4 = !params.agree4" />
+                                                    <text>{{ t('news_add_field1.activitiesNZ.itemDeposit1') }}</text>
+                                                </label>
+                                                <view style="line-height: 1.5; font-size: 14px">
+                                                    <text>{{ t('news_add_field1.activitiesNZ.itemDeposit2') }}</text>
+                                                    <text class="clause crm-cursor" @click="dialogClauseNZ = true">{{
+                                                        t('news_add_field1.activitiesNZ.itemDeposit3')
+                                                    }}</text>
+                                                    <text>{{ t('news_add_field1.activitiesNZ.itemDeposit4') }}</text>
+                                                </view>
+                                            </uni-forms-item>
+
+                                        </uni-col>
+
+                                        <!-- 20%赠金(年中赠金) -->
+                                        <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="tableData4TwoFlag">
+                                            <uni-forms-item class="agree" name="agree5">
+                                                <label class="checkbox">
+                                                    <checkbox :checked="params.agree5"
+                                                        @click="params.agree5 = !params.agree5" />
+                                                    <text>{{ t('news_add_field1.activitiesNZTwo.itemDeposit1') }}</text>
+                                                </label>
+                                                <view style="line-height: 1.5; font-size: 14px">
+                                                    <text>{{ t('news_add_field1.activitiesNZTwo.itemDeposit2') }}</text>
+                                                    <text class="clause crm-cursor" @click="dialogClauseNZTwo = true">{{
+                                                        t('news_add_field1.activitiesNZTwo.itemDeposit3') }}</text>
+                                                    <text>{{ t('news_add_field1.activitiesNZTwo.itemDeposit4') }}</text>
+                                                </view>
+                                            </uni-forms-item>
+
+                                        </uni-col>
+
+                                        <!-- 赠送活动(动态) -->
+                                        <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24"
+                                            v-if="tableDataNewListFlag">
+                                            <uni-forms-item class="agree" name="agree6">
+                                                <label>
+                                                    <checkbox :checked="params.agree6"
+                                                        @click="params.agree6 = !params.agree6" />
+                                                    <text>{{ tableDataNewList.title }}</text>
+                                                </label>
+                                                <view style="line-height: 1.5; font-size: 14px">
+                                                    <text>{{ t('news_add_field1.activitiesNewList.item1') }}</text>
+                                                    <text class="clause crm-cursor"
+                                                        @click="dialogClauseNewList = true">{{
+                                                            tableDataNewList.title }}</text>
+                                                    <text>{{ t('news_add_field1.activitiesNewList.item2') }}</text>
+                                                </view>
+                                            </uni-forms-item>
+
+                                        </uni-col>
+
+                                        <!-- 20%赠金申请(特定账户类型) -->
+                                        <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24"
+                                            v-if="(ACCType == 1 || ACCType == 2 || ACCType == 5 || ACCType == 6 || ACCType == 7) && anshiClose">
+                                            <uni-forms-item class="agree" name="agree3">
+                                                <label class="checkbox">
+                                                    <checkbox :checked="params.agree3"
+                                                        @click="params.agree3 = !params.agree3" />
+                                                    <text>{{ t('news_add_field1.deposit.item3') }}</text>
+                                                </label>
+                                                <view style="line-height: 1.5; font-size: 14px">
+                                                    <text>{{ t('news_add_field1.deposit.item4') }}</text>
+                                                    <text class="clause crm-cursor" @click="dialogClause1 = true">{{
+                                                        t('news_add_field1.deposit.item5') }}</text>
+                                                    <text>{{ t('news_add_field1.deposit.item6') }}</text>
+                                                </view>
+                                            </uni-forms-item>
+
+                                        </uni-col>
+
+                                        <!-- 普通10%赠金(非年中、非特定账户) -->
+                                        <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24"
+                                            v-if="!tableData4Flag && !tableData4TwoFlag && !tableDataNewListFlag && (country != 'CN' || (country == 'CN' && (ACCType == 1 || ACCType == 2 || ACCType == 7 || ACCType == 5 || ACCType == 6 || ACCType == 8))) && ACCType != 3">
+                                            <template v-if="isSupportedCountry && (ACCType == 2 || ACCType == 7)">
+                                                <uni-forms-item class="agree" name="agree2">
+                                                    <label>
+                                                        <checkbox :checked="params.agree2"
+                                                            @click="params.agree2 = !params.agree2" />
+                                                        <text>{{ t('news_add_field1.deposit.item2_1') }}</text>
+                                                    </label>
+                                                    <view style="line-height: 1.5; font-size: 14px">
+                                                        <text>{{ t('Custom.Deposit.agree21') }}</text>
+                                                        <cwg-link type="pdf" title="Custom.Deposit.agree22_2"
+                                                            :url="`pdf/pdf4/100Bonus-en.pdf`" style="color: black" />
+                                                        <text>{{ t('Custom.Deposit.agree23_2') }}</text>
+                                                    </view>
+                                                </uni-forms-item>
+
+                                            </template>
+                                            <template
+                                                v-else-if="!isSupportedCountry && ACCType != 8 && !isAfterSeptember30()">
+                                                <uni-forms-item class="agree" name="agree2">
+                                                    <label>
+                                                        <checkbox :checked="params.agree2"
+                                                            @click="params.agree2 = !params.agree2" />
+                                                        <text>{{ t('news_add_field1.deposit.item1') }}</text>
+                                                    </label>
+                                                    <view style="line-height: 1.5; font-size: 14px">
+                                                        <text>{{ t('Custom.Deposit.agree21') }}</text>
+                                                        <cwg-link type="pdf" title="Custom.Deposit.agree22"
+                                                            :url="`pdf/pdf4/${langCN}.pdf`" style="color: black" />
+                                                        <text>{{ t('Custom.Deposit.agree23_1') }}</text>
+                                                    </view>
+                                                </uni-forms-item>
+
+                                            </template>
+                                        </uni-col>
+                                    </uni-col>
+                                </template>
+
+                            </uni-row>
+                            <button class="s-btn" type="primary" @click="submitConfirm">{{ t('Btn.Submit') }}</button>
+                        </uni-forms>
+                    </view>
+                </view>
+            </view>
+            <!-- 不参加活动弹出框 -->
+            <cwg-dont-active-popup v-model:visible="dialogDontActive" :showFooters="true" @confirm="tosubmitConfirm" />
+            <!-- 新年24用户提示弹窗 -->
+            <NewYear24Popup v-model:visible="tableDataNewYear24Flag" />
+            <!-- 越南用户提示弹窗 -->
+            <VietnamNoticePopup v-model:visible="dialogVietnamNotice" />
+            <!-- 提交后确认弹窗 -->
+            <cwg-check-confirm-popup v-model:visible="dialogCheckConfirm" :title="t('Home.page_customer.item2')"
+                :channelData="channelData" :code="code" :selectCodes="selectCodes" :params="params" :userName="userName"
+                :login="loginValue" :loginDoc="loginValueDoc" @confirm="submit" />
+            <!--提交后的弹出框-->
+            <CheckPopup v-model:visible="dialogCheckSuccess" :goPayLink="goPayLink" @close="closeDia" />
+            <!-- 提交后失败弹窗 -->
+            <cwg-error-popup v-model:visible="dialogCheckError" :responseMessage="RES" />
+            <!-- 最后失败弹窗 -->
+            <cwg-error-popup v-model:visible="dialogError" @confirm="closeDia" :responseMessage="RES" />
+            <!-- 最后成功弹窗 -->
+            <cwg-success-popup v-model:visible="dialogSuccess" @confirm="closeDia" />
+            <!-- 等待弹窗 -->
+            <cwg-wait-popup v-model:visible="dialogCheckWait" :showFooters="false" />
+            <!-- 赠金协议 -->
+            <ClausePopup v-model:visible="dialogClause" country="CN" :isGuoQin="isGuoQin" />
+            <!-- 赠金协议20 -->
+            <Clause20Popup v-model:visible="dialogClause1" />
+            <!--  赠金协议10年中 -->
+            <ClauseNZPopup v-model:visible="dialogClauseNZ" :title="t('news_add_field1.activitiesNZ.item6')"
+                :startDate="tableData4.applicationStartTime" :endDate="tableData4.applicationEndTime" />
+            <!-- 赠金协议20年中 -->
+            <ClauseNZTwoPopup v-model:visible="dialogClauseNZTwo" :title="t('news_add_field1.activitiesNZTwo.item6')"
+                :startDate="tableData4Two.applicationStartTime" :endDate="tableData4Two.applicationEndTime" />
+            <!-- 赠送活动详情-协议 -->
+            <ClauseNewListPopup v-model:visible="dialogClauseNewList" :content="tableDataNewList.content"
+                :title="tableDataNewList.title" />
+            <!--提交后完成弹出框-->
+            <ChinaUnionPayPopup v-model:visible="dialogChinaUnionPay" />
+            <!-- 重新提交弹窗 -->
+            <DealResultPopup v-model:visible="dialogDealResult" :responseMessage="responseMessage"
+                :title="dialogDealResultTitle" :initialData="dialogDealResult_form" :type="DealResultType"
+                @confirm="submitDealResult" />
+            <!-- KYC成功弹窗 -->
+            <cwg-kyc-popup v-model:visible="dialogKyc" :qrText="text1" />
+        </view>
+    </cwg-page-wrapper>
+</template>
+
+<script setup>
+import { ref, reactive, computed, watch, onMounted, nextTick } from 'vue'
+import { useI18n } from 'vue-i18n'
+const { t, locale } = useI18n()
+import useUserStore from '@/stores/use-user-store'
+import { customApi } from '@/service/custom'
+import { financialApi } from '@/service/financial'
+import { activityApi } from '@/service/activity'
+import Config from '@/config/index'
+const { Code, Host80, Host04 } = Config
+import { initLink } from '@/utils/setUrl'
+import isImageType from '@/global/isImageType'
+import PaymentMethodsList from './components/PaymentMethodsList.vue'
+import CwgKycPopup from './components/KycPopup.vue'
+import DealResultPopup from './components/DealResultPopup.vue'
+import ChinaUnionPayPopup from './components/ChinaUnionPayPopup.vue'
+import ClauseNewListPopup from './components/ClauseNewListPopup.vue'
+import ClauseNZTwoPopup from './components/ClauseNZTwoPopup.vue'
+import ClauseNZPopup from './components/ClauseNZPopup.vue'
+import Clause20Popup from './components/Clause20Popup.vue'
+import ClausePopup from './components/ClausePopup.vue'
+import CheckPopup from './components/CheckPopup.vue'
+import CwgCheckConfirmPopup from './components/DepositCheckConfirmPopup.vue'
+import VietnamNoticePopup from './components/VietnamNoticePopup.vue'
+import NewYear24Popup from './components/NewYear24Popup.vue'
+import useRouter from '@/hooks/useRouter'
+const router = useRouter()
+// 假设原有导入路径保持不变
+import tool from "@/global/tool"
+import { object } from 'uview-plus/libs/function/test'
+// import { createUploadRequest } from "@/lib/upload"
+
+// 常量
+const countries = [
+    "DZ", "AO", "BJ", "BW", "BF", "CM", "CG", "CD", "CI", "DJ", "EG", "ET", "GA", "GM", "GH", "GN", "KE", "MG", "MW", "ML", "MR", "MA", "MZ", "NA", "NE", "NG", "RW", "SN", "SL", "SO", "ZA", "SS", "SD", "TZ", "TG", "TN", "UG", "ZM", "ZW", "LS", "BH", "IR", "IQ", "IL", "JO", "KW", "LB", "OM", "PS", "QA", "SA", "SY", "TR", "AE", "YE", "AR", "BO", "BR", "CL", "CO", "EC", "GY", "PY", "PE", "SR", "UY", "VE", "BZ", "CR", "SV", "GT", "HN", "NI", "PA", "AU", "CA", "AL", "AD", "AM", "AT", "AZ", "BY", "BE", "BA", "BG", "HR", "CY", "CZ", "DK", "EE", "FI", "FR", "GE", "DE", "GR", "HU", "IS", "IE", "IT", "XK", "LV", "LI", "LT", "LU", "MT", "MD", "MC", "ME", "NL", "MK", "NO", "PL", "PT", "RO", "RU", "SM", "RS", "SK", "SI", "ES", "SE", "CH", "UA", "VA",
+]
+// 用户信息
+const userStore = useUserStore()
+const userInfo = computed(() => userStore.userInfo)
+// 获取全局 Session 等,假设它们挂载在 uni 或 global 上
+const Session = {
+    Get: (key, parse = false) => {
+        const val = uni.getStorageSync(key)
+        return parse ? JSON.parse(val) : val
+    }
+}
+const handleFileUpdate = (val, type) => {
+    if (type == '1') {
+        params.requiteVoucherUrl = val
+    }
+}
+const isZh = computed(() => ['cn', 'zhHant'].includes(locale.value))
+function isPdf(url, image) {
+    let res = !!url
+    if (image) {
+        return res && url.substr(-3, 3) == 'pdf' &&
+            url.substr(-3, 3) == 'PDF'
+    }
+    return res && (url.substr(-3, 3) == 'pdf' ||
+        url.substr(-3, 3) == 'PDF')
+}
+const $pigeon = {
+    MessageError: (msg) => uni.showToast({ title: msg, icon: 'none' }),
+    MessageOK: (msg) => uni.showToast({ title: msg, icon: 'success' }),
+    MessageWarning: (msg) => uni.showToast({ title: msg, icon: 'none' }),
+    MessageConfirm: (msg, title, confirmText, cancelText, onConfirm, onCancel, options = {}) => {
+        uni.showModal({
+            title,
+            content: msg,
+            confirmText,
+            cancelText,
+            success: (res) => {
+                if (res.confirm) onConfirm && onConfirm()
+                else if (res.cancel) onCancel && onCancel()
+            }
+        })
+    }
+}
+const $route = { query: {} } // 需从外部注入
+
+// 响应式数据
+const loginValue = ref("")
+const loginValueDoc = ref("")
+const metaInfo = ref(null)
+const text1 = ref("")
+const dialogKyc = ref(false)
+const requiteVoucherUrl = ref("")
+const limitedStatus = ref(null)
+const limitedStatusCheck = ref(false)
+const pictLoadingImg = ref(false)
+const flag = ref(false)
+const RES = ref("")
+const imgUrl = ref(Host80)
+const Host85 = ref(Config.Host05)
+const loginOptions = ref([])
+const code = ref("")
+const selectCodes = ref("")
+const bankValid = ref("")
+const requestUrl = ref("")
+const isStep3 = ref(false)
+const step2 = ref(false)
+const step3 = ref(false)
+const value = ref("")
+const giveLoginJoin = ref("")
+
+const openType = ref("")
+const dialogInfoTradingAdd = ref(false)
+const ruleForm = reactive({
+    bankInfo: [],
+    bankWrit: [],
+    bankCredit: []
+})
+const bankInfoList = ref([])
+const bank = ref("")
+const myId = ref(null)
+const bankPayType = ref("")
+const form = reactive({})
+const dialogDealResult = ref(false)
+const dialogDealResult_form = reactive({})
+const DealResultType = ref(null)
+const DealResultResult = ref("")
+const dialogDealResultTitle = ref("")
+const anshiClose = ref(true)
+const isChannel = ref(true)
+const pictLoading = ref(false)
+const tableData = reactive({
+    International_Transfer: [],
+    China_UnionPay: [],
+    Digital_Currency: [],
+    Electronic_Wallet: [],
+    Ucard_Wallet: []
+})
+const tableData1 = reactive({
+    International_Transfer: [],
+    China_UnionPay: [],
+    Digital_Currency: [],
+    Electronic_Wallet: [],
+    Ucard_Wallet: []
+})
+//通道table-选择前后
+const activeTab = ref(1)
+// 🔥 自动过滤掉空数据的 tab
+const tabsConfig = computed(() => {
+    const allTabs = [
+        { text: t('Custom.Deposit.Channel3'), value: 1, type: 'Digital_Currency' },
+        { text: t('Custom.Deposit.Channel2'), value: 2, type: 'China_UnionPay' },
+        { text: t('Custom.Deposit.Channel4'), value: 3, type: 'Electronic_Wallet' },
+        { text: t('Custom.Deposit.Channel1'), value: 4, type: 'International_Transfer' },
+        { text: t('card.title'), value: 5, type: 'Ucard_Wallet' },
+    ]
+    // ✅ 只保留有数据的 tab
+    return allTabs.filter(tab => {
+        console.log(tableData1[tab.type], tab.type);
+        return tableData1[tab.type]?.length > 0
+    })
+})
+// 当前选中的 tab 项
+const currentTab = computed(() => tabsConfig.value.find(t => t.value === activeTab.value))
+
+// 当前要渲染的表格数据
+const currentTableData = computed(() => {
+    const type = currentTab.value?.type
+    return type ? tableData[type] || [] : []
+})
+// ✅ 监听 tab 变化,自动选中第一个有数据的 tab
+watch(
+    tabsConfig,
+    (newTabs) => {
+        if (newTabs.length > 0) {
+            activeTab.value = newTabs[0].value // 选中第一个
+        }
+    },
+    { immediate: true }
+)
+watch(
+    currentTab,
+    (newTabs) => {
+        showTable()
+    },
+    { immediate: true }
+)
+const bankDate = ref([])
+const channelData = reactive({})
+const WireTransferAccount = reactive({})
+const actionAdd1 = ref("")
+const actionAdd2 = ref(Host04 + "/activity/requite/voucher/upload")
+const imageUrl = ref("")
+const imageUrl1 = ref("")
+const introduce = reactive({
+    introduce: "",
+    enIntroduce: ""
+})
+const params = reactive({
+    amount: "",
+    amount1: "",
+    promoCode: "",
+    agree: false,
+    agree2: false,
+    agree3: false,
+    agree4: false,
+    agree5: false,
+    agree6: false
+})
+const resetForm = () => {
+    //表单重置后,需要手动重置一些状态
+    params.amount = ""
+    params.amount1 = ""
+    params.promoCode = ""
+    params.agree = false
+    params.agree2 = false
+    params.agree3 = false
+    params.agree4 = false
+    params.agree5 = false
+    params.agree6 = false
+    form.bankUname = undefined
+    form.bankCardNum = undefined
+    form.cvv = undefined
+    form.expiryMonth = undefined
+    form.expiryYear = undefined
+    form.pin = undefined
+    amountErrorMessage.value = ""
+}
+const formRef = ref(null)
+const mAmount = reactive({
+    minAmount: "",
+    maxAmount: ""
+})
+const dialogCheck = ref(false)
+const dialogVisible = ref(false)
+const dialogCheckWait = ref(false)
+const dialogCheckOK = ref(false)
+const goPayLink = ref("")
+const dialogCheckConfirm = ref(false)
+const dialogCheckConfirm_form = reactive({
+    confirmName: "",
+    confirmAreaCode: "",
+    confirmPhone: ""
+})
+const dialogClause = ref(false)
+const dialogClause1 = ref(false)
+const dialogClauseNZ = ref(false)
+const dialogClauseNZTwo = ref(false)
+const dialogClauseNewList = ref(false)
+const ACCType = ref(null)
+const CheckExistSuccess = ref(false)
+const dialogChinaUnionPay = ref(false)
+const tableData4Flag = ref(false)
+const tableData4 = reactive({})
+const tableData4TwoFlag = ref(false)
+const tableData4Two = reactive({})
+const tableDataNewListFlag = ref(false)
+const tableDataNewList = reactive({})
+const dialogDontActive = ref(false)
+const dialogVietnamNotice = ref(false)
+const tableDataNewYear24Flag = ref(false)
+const tableDataNewYear24 = ref(false)
+
+const rules = computed(() => ({
+    amount: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.amount.format1'),
+            },
+            {
+                validateFunction: (rule, value, data, callback) => {
+                    // 空值处理:直接报格式错误
+                    if (!value) {
+                        callback(t('vaildate.amount.format1'))
+                        return false
+                    }
+                    // 范围校验
+                    if (
+                        mAmount.minAmount &&
+                        mAmount.maxAmount &&
+                        (Number(mAmount.minAmount) > Number(value) ||
+                            Number(mAmount.maxAmount) < Number(value))
+                    ) {
+                        callback(
+                            t('vaildate.amount.amount') +
+                            mAmount.minAmount +
+                            ' - ' +
+                            mAmount.maxAmount
+                        )
+                        return false
+                    }
+                    // 正整数校验(原正则)
+                    if (!/^[1-9]\d*$/.test(value)) {
+                        callback(t('vaildate.amount.format1'))
+                        return false
+                    }
+                    return true
+                },
+                trigger: 'change',
+            },
+        ],
+    },
+    agree: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.agree.empty'),
+                trigger: 'change',
+            },
+        ],
+    },
+    confirmAreaCode: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.input.empty'),
+                trigger: 'blur',
+            },
+        ],
+    },
+    confirmPhone: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.input.empty'),
+                trigger: 'blur',
+            },
+        ],
+    },
+    myId: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.select.empty'),
+                trigger: 'change',
+            },
+        ],
+    },
+    pin: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('PersonalManagement.Label.item1'),
+                trigger: 'blur',
+            },
+        ],
+    },
+    phone: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.input.empty'),
+                trigger: 'blur',
+            },
+        ],
+    },
+    otp: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.input.empty'),
+                trigger: 'blur',
+            },
+        ],
+    },
+    state: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.input.empty'),
+                trigger: 'blur',
+            },
+        ],
+    },
+    city: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.input.empty'),
+                trigger: 'blur',
+            },
+        ],
+    },
+    country: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.select.empty'),
+                trigger: 'change',
+            },
+        ],
+    },
+    address: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.input.empty'),
+                trigger: 'blur',
+            },
+        ],
+    },
+    zipCode: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.input.empty'),
+                trigger: 'blur',
+            },
+        ],
+    },
+}))
+const amountErrorMessage = ref('')
+const validateAmount = (value) => {
+    const amount = params.amount
+    if (!amount && amount !== 0) {
+        amountErrorMessage.value = t('vaildate.amount.format1')
+        return false
+    }
+    if (mAmount.minAmount && mAmount.maxAmount) {
+        const min = Number(mAmount.minAmount);
+        const max = Number(mAmount.maxAmount);
+        const numValue = Number(amount);
+        if (numValue < min || numValue > max) {
+            amountErrorMessage.value = t('vaildate.amount.amount') + min + '-' + max
+            return false
+        }
+    }
+    if (!/^[1-9]\d*$/.test(amount)) {
+        amountErrorMessage.value = t('vaildate.amount.format1')
+        return false
+    }
+    amountErrorMessage.value = ''
+    return true
+}
+const NewYear24Data = reactive({
+    balance: 0,
+    income: 0,
+    rate: 0,
+    index: 0
+})
+const AccessToken = computed(() => ({
+    "Access-Token": Session.Get("access_token")
+}))
+const lang = computed(() => {
+    return locale.value == "en" && document.body.clientWidth < 1200
+})
+const langCN = computed(() => locale.value)
+const isSupportedCountry = computed(() => {
+    try {
+        const country = userInfo.value.customInfo.country
+        return countries.includes(country)
+    } catch {
+        return false
+    }
+})
+const country = computed(() => {
+    return userInfo.value.customInfo.country
+})
+const userName = computed(() => {
+    let first = userInfo.value.customInfo.firstName
+    let last = userInfo.value.customInfo.lastName
+    let middle = userInfo.value.customInfo.middle
+    if (!first && !last && !middle) return false
+    return (first ? first + " " : "") + (middle ? middle + " " : "") + (last ? last : "")
+})
+const areaCode = computed(() => userInfo.value.customInfo.areaCode)
+const phone = computed(() => userInfo.value.customInfo.phone)
+// 是否是国庆节
+const isGuoQin = computed(() => {
+    let flag = false
+    let startTime1 = "2024/10/01 00:00:00"
+    let endTime1 = "2024/10/07 23:59:59"
+    let timezone = 8
+    let offset_GMT = new Date().getTimezoneOffset()
+    let nowDate = new Date().getTime()
+    let now = new Date(nowDate + offset_GMT * 60 * 1000 + timezone * 60 * 60 * 1000).getTime()
+    let end = new Date(endTime1).getTime()
+    let start = new Date(startTime1).getTime()
+    if (now > start && now < end) flag = true
+    return flag
+})
+const groupTitleMap = {
+    1: 'Custom.Deposit.Channel1',
+    2: 'Custom.Deposit.Channel2',
+    3: 'Custom.Deposit.Channel3',
+    4: 'Custom.Deposit.Channel4',
+    5: 'card.title'
+}
+// 排序表格数据
+const sortedTableData = computed(() => {
+    const order = [
+        tableData.Digital_Currency,
+        tableData.China_UnionPay,
+        tableData.Electronic_Wallet,
+        tableData.International_Transfer,
+        tableData.Ucard_Wallet
+    ]
+    return order.filter(item => item && item.length > 0)
+})
+
+
+
+// 方法
+const isAfterJuly21 = () => {
+    const currentDate = new Date()
+    const july21 = new Date(currentDate.getFullYear(), 6, 21)
+    return currentDate >= july21
+}
+// 货币
+const groupCurrency = (type) => {
+    if (type == "GBP") return ": £"
+    else if (type == "USD") return ": $"
+    else if (type == "EUR") return ": €"
+    else if (type == "USC") return ": ¢"
+    else return ": $"
+}
+// 货币符号
+const groupCurrency1 = (type) => {
+    if (type == "GBP") return "£"
+    else if (type == "USD") return "$"
+    else if (type == "EUR") return "€"
+    else if (type == "USC") return "¢"
+    else return "$"
+}
+// 选择银行
+const selectCode = (codeVal) => {
+    bankDate.value.forEach(item => {
+        if (item.code == codeVal) {
+            selectCodes.value = lang.value == "cn" ? item.name : item.enName
+            mAmount.minAmount = item.minAmount || mAmount.minAmount
+            mAmount.maxAmount = item.maxAmount || mAmount.maxAmount
+            channelData.rate = item.rate || channelData.rate
+            channelData.transformCurrency = item.currency || channelData.transformCurrency
+        }
+    })
+}
+// 账户类型
+const groupTypeName = (type) => {
+    if (type == "1") return t("AccountType.ClassicAccount")
+    else if (type == "2") return t("AccountType.SeniorAccount")
+    else if (type == "5") return t("AccountType.SpeedAccount")
+    else if (type == "6") return t("AccountType.SpeedAccount")
+    else if (type == "7") return t("AccountType.StandardAccount")
+    else if (type == "8") return t("AccountType.CentAccount")
+}
+const selectChange = () => {
+    // 强制更新,在 Vue 3 中通常不需要
+}
+const handleProgress1 = () => {
+    pictLoadingImg.value = true
+}
+const handleAvatarError1 = (err) => {
+    let errorMessage = t("Msg.Fail")
+    if (err && err.status) {
+        switch (err.status) {
+            case 400: errorMessage = t("Msg.UploadInvalidFormat"); break
+            case 401: errorMessage = t("Msg.UploadUnauthorized"); break
+            case 403: errorMessage = t("Msg.UploadForbidden"); break
+            case 413: errorMessage = t("Msg.UploadFileTooLarge"); break
+            case 500: errorMessage = t("Msg.UploadServerError"); break
+            case 502:
+            case 503:
+            case 504: errorMessage = t("Msg.UploadNetworkError"); break
+            default:
+                if (err.message) errorMessage = err.message
+                else if (err.response && err.response.data && err.response.data.msg) errorMessage = err.response.data.msg
+        }
+    } else if (err && err.message) {
+        if (err.message.includes("Network Error") || err.message.includes("timeout")) errorMessage = t("Msg.UploadNetworkError")
+        else if (err.message.includes("File too large")) errorMessage = t("Msg.UploadFileTooLarge")
+        else errorMessage = err.message
+    }
+    $pigeon.MessageError(errorMessage)
+    pictLoadingImg.value = false
+}
+const handleAvatarSuccess1 = (res) => {
+    if (res.code == Code.StatusOK) {
+        $pigeon.MessageOK(res.msg)
+        imageUrl1.value = res.data
+        requiteVoucherUrl.value = res.data
+    } else {
+        $pigeon.MessageError(res.msg)
+    }
+    pictLoadingImg.value = false
+}
+// 上传凭证前校验
+const beforeAvatarUpload1 = (file) => {
+    const isJPG = isImageType.checkFile(file.type)
+    const isLt2M = isImageType.checkSize(file.size)
+    if (!isJPG) $pigeon.MessageError(t("Msg.JPG"))
+    if (!isLt2M) $pigeon.MessageError(t("Msg.3IMG"))
+    return isJPG && isLt2M
+}
+// 上传凭证进度
+const handleProgress = () => {
+    pictLoadingImg.value = true
+}
+// 上传凭证失败
+const handleAvatarError = (err) => {
+    let errorMessage = t("Msg.Fail")
+    if (err && err.status) {
+        switch (err.status) {
+            case 400: errorMessage = t("Msg.UploadInvalidFormat"); break
+            case 401: errorMessage = t("Msg.UploadUnauthorized"); break
+            case 403: errorMessage = t("Msg.UploadForbidden"); break
+            case 413: errorMessage = t("Msg.UploadFileTooLarge"); break
+            case 500: errorMessage = t("Msg.UploadServerError"); break
+            case 502:
+            case 503:
+            case 504: errorMessage = t("Msg.UploadNetworkError"); break
+            default:
+                if (err.message) errorMessage = err.message
+                else if (err.response && err.response.data && err.response.data.msg) errorMessage = err.response.data.msg
+        }
+    } else if (err && err.message) {
+        if (err.message.includes("Network Error") || err.message.includes("timeout")) errorMessage = t("Msg.UploadNetworkError")
+        else if (err.message.includes("File too large")) errorMessage = t("Msg.UploadFileTooLarge")
+        else errorMessage = err.message
+    }
+    $pigeon.MessageError(errorMessage)
+    pictLoadingImg.value = false
+}
+// 上传凭证
+const handleUploadDeposit = (options) => {
+    const originalUrl = actionAdd1.value || Config.Host80 + "/common/upload"
+    return createUploadRequest(originalUrl, AccessToken.value, 1)(options)
+}
+// 上传凭证成功
+const handleAvatarSuccess = (res) => {
+    if (res.code == Code.StatusOK) {
+        $pigeon.MessageOK(res.msg)
+        imageUrl.value = res.data
+        requiteVoucherUrl.value = res.data
+    } else {
+        $pigeon.MessageError(res.msg)
+    }
+    pictLoadingImg.value = false
+}
+// 上传凭证前校验
+const beforeAvatarUpload = (file) => {
+    const isJPG = isImageType.checkFile(file.type)
+    const isLt2M = isImageType.checkSize(file.size)
+    if (!isJPG) $pigeon.MessageError(t("Msg.JPG"))
+    if (!isLt2M) $pigeon.MessageError(t("Msg.3IMG"))
+    return isJPG && isLt2M
+}
+// 打开添加银行弹窗
+const openAddBankCard = () => {
+    if (ruleForm.bankCredit.length == 2) {
+        $pigeon.MessageConfirm(
+            t("Msg.WireTransfers"),
+            t("Msg.SystemPrompt"),
+            t("Btn.Confirm"),
+            t("Btn.Cancel"),
+            async () => { },
+            () => { }
+        )
+    } else {
+        openType.value = "add_CreditCard"
+        dialogInfoTradingAdd.value = true
+    }
+}
+
+const closeDiaAdd = () => {
+    dialogInfoTradingAdd.value = false
+}
+// 关闭添加银行弹窗
+const closeAdd = (val) => {
+    dialogInfoTradingAdd.value = val
+}
+// 确认重新加载银行信息
+const confirmToReload = () => {
+    dialogInfoTradingAdd.value = false
+    getBankInfo()
+}
+// 获取银行信息
+const getBankInfo = async () => {
+    let res = await financialApi.customBankList({})
+    if (res.code == Code.StatusOK) {
+        ruleForm.bankCredit = []
+        res.data.forEach(item => {
+            if (item.type == 3) {
+                item.customBankCode = item.bankCode
+                item.bankCode = null
+                ruleForm.bankCredit.push(item)
+            }
+            if (item.defaultBank && item.type == 3) {
+                myId.value = item.id
+                form.bankUname = item.bankUname
+                form.bankCardNum = item.bankCardNum
+                form.cvv = item.cvv
+                form.expiryMonth = item.expiryMonth
+                form.expiryYear = item.expiryYear
+                form.pin = item.pin
+            }
+        })
+    } else {
+        $pigeon.MessageError(res.msg)
+    }
+}
+// 选择银行
+const chooseBank = (item) => {
+    if (formRef.value) formRef.value.clearValidate()
+    form.bankUname = item.bankUname
+    form.bankCardNum = item.bankCardNum
+    form.cvv = item.cvv
+    form.expiryMonth = item.expiryMonth
+    form.expiryYear = item.expiryYear
+    form.pin = item.pin
+}
+
+// 返回首页
+const toHome = () => {
+    uni.switchTab({ url: "/pages/customer/index" })
+}
+// 提交确认信息弹窗
+const submitConfirm = async () => {
+    console.log(params.requiteVoucherUrl, 1212);
+
+    if (channelData.confirmCreditCard == 1 && !myId.value) {
+        $pigeon.MessageWarning(t("PersonalManagement.Label.selectCreditCard"))
+        return
+    }
+    if (channelData.bankValid == 1 && !code.value) {
+        $pigeon.MessageWarning(t("vaildate.depositCurrency.empty"))
+        return
+    }
+    if ((channelData.code == "UNION_PAY_TELEGRAPHIC" || channelData.code == "UNION_PAY_TELEGRAPHIC_SPECIAL" || channelData.code == "UNION_PAY_TELEGRAPHIC_TWO") && !imageUrl.value) {
+        $pigeon.MessageWarning(t("vaildate.depositVoucher.empty"))
+        return
+    }
+    if (params.promoCode && params.agree2) {
+        $pigeon.MessageWarning(t("news_add_field.Des.item2"))
+        return
+    }
+    if (params.promoCode && params.agree3) {
+        $pigeon.MessageWarning(t("news_add_field.Des.item2"))
+        return
+    }
+    if (params.promoCode && params.agree4) {
+        $pigeon.MessageWarning(t("news_add_field.Des.item2"))
+        return
+    }
+    if (params.promoCode && params.agree5) {
+        $pigeon.MessageWarning(t("news_add_field.Des.item2"))
+        return
+    }
+    if (params.promoCode && params.agree6) {
+        $pigeon.MessageWarning(t("news_add_field.Des.item2"))
+        return
+    }
+    if (channelData.code && channelData.code.indexOf('DIGITAL_PAY_TYPE_KEY') === 0 && !imageUrl.value) {
+        $pigeon.MessageWarning(t("vaildate.depositVoucher.empty"))
+        return
+    }
+
+    try {
+        if (formRef.value) {
+            await formRef.value.validate()
+            openDontActive()
+        }
+    } catch (error) {
+        if (error instanceof Array) {
+            uni.showToast({ title: error[0].errorMessage, icon: 'none' });
+            return
+        } else {
+            responseMessage.value = error.msg;
+        }
+    }
+
+}
+// 打开不参加活动弹窗
+const openDontActive = () => {
+    if (!tableData4Flag.value && !tableData4TwoFlag.value && !tableDataNewListFlag.value && (country.value != "CN" || (country.value == "CN" && (ACCType.value == 1 || ACCType.value == 2 || ACCType.value == 7))) && ACCType.value != 3 && params.agree2) {
+        tosubmitConfirm()
+        return
+    }
+    if (tableData4Flag.value && params.agree4) {
+        tosubmitConfirm()
+        return
+    }
+    if (tableData4TwoFlag.value && params.agree5) {
+        tosubmitConfirm()
+        return
+    }
+    if (tableDataNewListFlag.value && params.agree6) {
+        tosubmitConfirm()
+        return
+    }
+    if (limitedStatus.value && limitedStatusCheck.value) {
+        tosubmitConfirm()
+        return
+    }
+    if ((ACCType.value == 1 || ACCType.value == 2 || ACCType.value == 5 || ACCType.value == 6 || ACCType.value == 7) && anshiClose.value && params.agree3) {
+        tosubmitConfirm()
+        return
+    }
+    tosubmitConfirm()
+}
+// 打开提交前信息弹窗
+const tosubmitConfirm = () => {
+    dialogDontActive.value = false
+    dialogCheckConfirm_form.confirmAreaCode = areaCode.value
+    dialogCheckConfirm_form.confirmPhone = phone.value
+    dialogCheckConfirm.value = true
+}
+// 最后确认
+const dialogSuccess = computed(() => dialogCheckOK.value && dialogVisible.value)
+// 最后失败
+const dialogError = computed(() => dialogCheckOK.value && !dialogVisible.value)
+// 提交后确认
+const dialogCheckSuccess = computed(() => dialogCheck.value && dialogVisible.value)
+// 提交后失败
+const dialogCheckError = computed(() => dialogCheck.value && !dialogVisible.value)
+
+// 提交申请
+const submit = async () => {
+    if (flag.value) return
+    flag.value = true
+    dialogCheckConfirm.value = false
+    dialogCheckWait.value = true
+    try {
+        if (channelData.code == "UNION_PAY_TELEGRAPHIC" || channelData.code == "UNION_PAY_TELEGRAPHIC_SPECIAL" || channelData.code == "UNION_PAY_TELEGRAPHIC_TWO") {
+            let res = await financialApi.telegraphicPay({
+                requiteVoucherUrl: imageUrl1.value,
+                amount: params.amount,
+                login: $route.query.login,
+                voucherUrl: imageUrl.value,
+                activityDeposit: params.agree2 ? 1 : 0,
+                activityPercentageGive: params.agree3 ? 1 : 0,
+                activityMidyearTenPercentGive: params.agree4 ? 1 : 0,
+                activityTwoPercentGive: params.agree5 ? 1 : 0,
+                activityGive: params.agree6 ? 1 : 0,
+                promoCode: params.promoCode,
+                code: channelData.code,
+                bankMsg: WireTransferAccount.bankMsg || "",
+                name: channelData.confirmName ? userName.value : null,
+                areaCode: channelData.confirmAreaCode ? dialogCheckConfirm_form.confirmAreaCode : null,
+                phone: channelData.confirmPhone ? dialogCheckConfirm_form.confirmPhone : null,
+                ip: uni.getStorageSync("CLIENT")
+            })
+            dialogCheckWait.value = false
+            if (res.code == Code.StatusOK) {
+                imageUrl1.value = ""
+                limitedStatusCheck.value = false
+                dialogCheckOK.value = true
+                dialogVisible.value = true
+                flag.value = false
+            } else {
+                RES.value = res.msg
+                dialogCheckOK.value = true
+                dialogVisible.value = false
+                flag.value = false
+            }
+        } else if (channelData.code && channelData.code.indexOf('DIGITAL_PAY_TYPE_KEY') === 0) {
+            let res = await financialApi.digitalPay({
+                requiteVoucherUrl: imageUrl1.value,
+                amount: params.amount,
+                login: $route.query.login,
+                voucherUrl: imageUrl.value,
+                activityDeposit: params.agree2 ? 1 : 0,
+                activityPercentageGive: params.agree3 ? 1 : 0,
+                activityMidyearTenPercentGive: params.agree4 ? 1 : 0,
+                activityTwoPercentGive: params.agree5 ? 1 : 0,
+                activityGive: params.agree6 ? 1 : 0,
+                promoCode: params.promoCode,
+                ip: uni.getStorageSync("CLIENT")
+            })
+            dialogCheckWait.value = false
+            if (res.code == Code.StatusOK) {
+                dialogCheckOK.value = true
+                dialogVisible.value = true
+                flag.value = false
+            } else {
+                RES.value = res.msg
+                dialogCheckOK.value = true
+                dialogVisible.value = false
+                flag.value = false
+            }
+        } else {
+            let par = ""
+            if (channelData.bankValid == 1) {
+                par = `${channelData.requestUrl}/${loginValue.value}/${params.amount}/${code.value}/${(params.agree2 ? 1 : 0)}`
+            } else {
+                par = `${channelData.requestUrl}/${loginValue.value}/${params.amount}/${(params.agree2 ? 1 : 0)}`
+            }
+            let res = await financialApi.PayBankCode(par, {
+                requiteVoucherUrl: imageUrl1.value,
+                promoCode: params.promoCode,
+                name: channelData.confirmName ? userName.value : null,
+                areaCode: channelData.confirmAreaCode ? dialogCheckConfirm_form.confirmAreaCode : null,
+                phone: channelData.confirmPhone ? dialogCheckConfirm_form.confirmPhone : null,
+                activityPercentageGive: params.agree3 ? 1 : 0,
+                activityMidyearTenPercentGive: params.agree4 ? 1 : 0,
+                activityTwoPercentGive: params.agree5 ? 1 : 0,
+                activityGive: params.agree6 ? 1 : 0,
+                ip: uni.getStorageSync("CLIENT"),
+                ...form
+            })
+            dialogCheckWait.value = false
+            if (res.code == Code.StatusOK) {
+                if (res.data && (res.data.type == 3 || res.data.type == 4 || res.data.type == 6 || res.data.type == 7)) {
+                    dealResult(res.data)
+                } else {
+                    if (res.data.type == 1) {
+                        goPayLink.value = res.data.result
+                        window.open(res.data.result)
+                    } else if (res.data.type == 2) {
+                        let token = AccessToken.value["Access-Token"]
+                        token = tool.tokenReplace(token)
+                        goPayLink.value = `${Host04}/finance/deposit/get?serial=${res.data.result}&Access-Token=${token}`
+                        window.open(goPayLink.value)
+                    } else if (res.data.type == 5) {
+                        $pigeon.MessageConfirm(
+                            t("PersonalManagement.Label.item2"),
+                            t("Msg.SystemPrompt"),
+                            t("Btn.Cancel"),
+                            t("Btn.Confirm"),
+                            async () => { },
+                            () => {
+                                goPayLink.value = res.data.result
+                                dialogCheck.value = true
+                                dialogVisible.value = true
+                                window.open(res.data.result)
+                            }
+                        )
+                    } else if (res.data.type == 8) {
+                        goPayLink.value = Host04 + res.data.result
+                        window.open(goPayLink.value)
+                    } else if (res.data.type == 9) {
+                        goPayLink.value = setCardUrl(res.data.result)
+                        window.open(goPayLink.value)
+                    } else if (res.data.type == 10) {
+                        goPayLink.value = Host80 + '/pay/onchainpay.html?params=' + res.data.result
+                        window.open(goPayLink.value)
+                    }
+                    if (res.data.type != 5) {
+                        dialogCheck.value = true
+                        dialogVisible.value = true
+                    }
+                }
+                flag.value = false
+            } else {
+                RES.value = res.msg
+                dialogCheck.value = true
+                dialogVisible.value = false
+                flag.value = false
+            }
+        }
+    } catch (error) {
+        dialogCheckWait.value = false
+        flag.value = false
+        dialogCheckOK.value = true
+        dialogVisible.value = false
+        RES.value = error.msg
+    }
+}
+const setCardUrl = (serial) => {
+    let params = `${AccessToken.value["Access-Token"]}/${locale.value}/${serial}/1/pay`
+    return initLink({ link: imgUrl.value + '/pay/paycard.html', params })
+}
+//处理申请返回result
+const dealResult = (data) => {
+    DealResultType.value = data.type
+    DealResultResult.value = data.result
+    if (data.type == 3) {
+        dialogDealResult_form.pin = ""
+    } else if (data.type == 4) {
+        dialogDealResult_form.otp = ""
+    } else if (data.type == 6) {
+        dialogDealResult_form.state = userInfo.value.state
+        dialogDealResult_form.city = userInfo.value.city
+        dialogDealResult_form.country = (["cn", "zhHant"].indexOf(locale.value) != -1) ? userInfo.value.countryName : userInfo.value.countryEnName
+        dialogDealResult_form.address = (userInfo.value.addressLines && userInfo.value.addressLines[0]) || ""
+        dialogDealResult_form.zipCode = userInfo.value.zipCode
+        dialogDealResultTitle.value = t("PersonalManagement.Label.item3")
+    } else if (data.type == 7) {
+        dialogDealResult_form.phone = userInfo.value.phone
+        dialogDealResultTitle.value = t("PersonalManagement.Label.item4")
+    }
+    dialogDealResult.value = true
+}
+//重新提交
+const submitDealResult = async () => {
+    if (flag.value) return
+    flag.value = true
+    dialogCheckConfirm.value = false
+    dialogCheckWait.value = true
+    let par = Host04 + DealResultResult.value
+    let dataList = {}
+    if (DealResultType.value == 3) dataList = { pin: dialogDealResult_form.pin }
+    else if (DealResultType.value == 4) dataList = { otp: dialogDealResult_form.otp }
+    else if (DealResultType.value == 6) {
+        dataList = {
+            state: dialogDealResult_form.state,
+            city: dialogDealResult_form.city,
+            country: dialogDealResult_form.country,
+            address: dialogDealResult_form.address,
+            zipCode: dialogDealResult_form.zipCode
+        }
+    } else if (DealResultType.value == 7) dataList = { phone: dialogDealResult_form.phone }
+    let res = await financialApi.PayDealResult(par, dataList)
+    dialogCheckWait.value = false
+    dialogDealResult.value = false
+    if (res.code == Code.StatusOK) {
+        if (res.data && (res.data.type == 3 || res.data.type == 4 || res.data.type == 6 || res.data.type == 7)) {
+            dealResult(res.data)
+        } else {
+            if (res.data.type == 1) {
+                goPayLink.value = res.data.result
+                window.open(res.data.result)
+            } else if (res.data.type == 2) {
+                let token = AccessToken.value["Access-Token"]
+                token = tool.tokenReplace(token)
+                goPayLink.value = `${Host04}/finance/deposit/get?serial=${res.data.result}&Access-Token=${token}`
+                window.open(goPayLink.value)
+            } else if (res.data.type == 5) {
+                $pigeon.MessageConfirm(
+                    t("PersonalManagement.Label.item2"),
+                    t("Msg.SystemPrompt"),
+                    t("Btn.Cancel"),
+                    t("Btn.Confirm"),
+                    async () => { },
+                    () => {
+                        goPayLink.value = res.data.result
+                        dialogCheck.value = true
+                        dialogVisible.value = true
+                        window.open(res.data.result)
+                    }
+                )
+            } else if (res.data.type == 8) {
+                goPayLink.value = Host04 + res.data.result
+                window.open(goPayLink.value)
+            } else if (res.data.type == 9) {
+                dialogCheckOK.value = true
+                dialogVisible.value = true
+                flag.value = false
+                return
+            }
+            if (res.data.type != 5) {
+                dialogCheck.value = true
+                dialogVisible.value = true
+            }
+        }
+        flag.value = false
+    } else {
+        RES.value = res.msg
+        dialogCheck.value = true
+        dialogVisible.value = false
+        flag.value = false
+        dialogDealResult.value = false
+    }
+}
+const closeDia = () => {
+    dialogCheck.value = false
+    dialogVisible.value = false
+    dialogCheckOK.value = false
+    isStep3.value = false
+    step2.value = false
+    showTable()
+    loginValue.value = ""
+}
+const isStep3Open = () => {
+    isStep3.value = true
+    //中国网银弹窗
+    if (tableData.China_UnionPay.length && tableData.China_UnionPay[0].type == 2) {
+        let timezone = 8
+        let offset_GMT = new Date().getTimezoneOffset()
+        let nowDate = new Date().getTime()
+        let now = new Date(nowDate + offset_GMT * 60 * 1000 + timezone * 60 * 60 * 1000)
+        let newTime = now.getHours().toString()
+        if ((newTime.length == 1 && newTime >= 0 && newTime < 8) || (newTime.length == 2 && newTime >= 22 && newTime < 24)) {
+            dialogChinaUnionPay.value = true
+        }
+    }
+}
+// 判断是否在9月30日晚上12点之后,用于隐藏特定活动
+const isAfterSeptember30 = () => {
+    // const currentDate = new Date();
+    // const september30 = new Date(
+    //   currentDate.getFullYear(),
+    //   8,
+    //   30,
+    //   23,
+    //   59,
+    //   59
+    // ); // 月份从0开始,8表示9月,设置为23:59:59
+    // return currentDate > september30;
+    return true
+}
+const getMetaInfo = () => {
+    metaInfo.value = window.getMetaInfo()
+    metaInfo.value = { ...metaInfo.value, deviceType: "h5" }
+}
+//获取kyc二维码
+const qrCode = async (depositChannelCode, row) => {
+    getMetaInfo()
+    let res = await activityApi.getWebsdkLink({
+        depositChannelCode,
+        metaInfo: metaInfo.value
+    })
+    if (res.code == Code.StatusOK) {
+        if (res.data) {
+            text1.value = JSON.parse(res.data).url
+            dialogKyc.value = true
+            flag.value = false
+        } else {
+            doShowStep3(row)
+        }
+    } else {
+        flag.value = false
+        uni.showToast({ title: res.msg, icon: 'none' })
+    }
+}
+const doShowStep3 = (row) => {
+    if (row.confirmCreditCard == 1) getBankInfo()
+    getCheckExistSuccess()
+    if (row.bankValid && isChannel.value) {
+        getBankList(row)
+        isChannel.value = false
+        step3.value = true
+        Object.assign(channelData, row)
+        mAmount.minAmount = row.minAmount
+        mAmount.maxAmount = row.maxAmount
+    } else {
+        step3.value = true
+        bankDate.value = []
+        Object.assign(channelData, row)
+        mAmount.minAmount = row.minAmount
+        mAmount.maxAmount = row.maxAmount
+    }
+    tableData.International_Transfer = []
+    tableData.China_UnionPay = []
+    tableData.Digital_Currency = []
+    tableData.Electronic_Wallet = []
+    tableData.Ucard_Wallet = []
+    if (row.type == 1) tableData.International_Transfer[0] = row
+    if (row.type == 2) tableData.China_UnionPay[0] = row
+    if (row.type == 3) tableData.Digital_Currency[0] = row
+    if (row.type == 4) tableData.Electronic_Wallet[0] = row
+    if (row.type == 5) tableData.Ucard_Wallet[0] = row
+    introduce.introduce = row.introduce
+    introduce.enIntroduce = row.enIntroduce
+    if (row.code == "UNION_PAY_TELEGRAPHIC" || row.code == "UNION_PAY_TELEGRAPHIC_SPECIAL" || row.code == "UNION_PAY_TELEGRAPHIC_TWO" || (row.code && row.code.indexOf('DIGITAL_PAY_TYPE_KEY') === 0)) {
+        let pro = []
+        if (row.property && row.property.substring(0, 1) == "[") {
+            pro = JSON.parse(row.property)
+        } else if (row.property && row.property.substring(0, 1) != "[") {
+            let proper = "[" + row.property + "]"
+            pro = JSON.parse(proper)
+        }
+        let ind = pro.length
+        if (ind) {
+            let index = parseInt(Math.random() * ind + 1)
+            Object.assign(WireTransferAccount, pro[index - 1])
+            actionAdd1.value = Host80 + "/common/upload"
+        } else {
+            Object.assign(WireTransferAccount, {})
+            actionAdd1.value = Host80 + "/common/upload"
+        }
+    }
+}
+//选择支付方式
+const isShowStep3 = (row) => {
+    router.push(`/pages/customer/deposit?login=${loginValue.value}`)
+    userStore.savePaymentChannel(row.id)
+    userStore.saveChannelList(tableData)
+
+    return
+    if (row.kycChannel != 1) {
+        doShowStep3(row)
+    } else {
+        qrCode(row.code, row)
+    }
+}
+//更换支付方式
+const showTable = () => {
+    resetForm();
+    dialogCheckWait.value = false;
+    dialogVisible.value = false;
+    flag.value = false;
+    form.bankUname = undefined
+    form.bankCardNum = undefined
+    form.cvv = undefined
+    form.expiryMonth = undefined
+    form.expiryYear = undefined
+    form.pin = undefined
+    myId.value = null
+    step3.value = false
+    isStep3.value = false
+    params.amount = ""
+    params.amount1 = ""
+    params.agree = false
+    params.agree2 = false
+    params.agree3 = false
+    params.agree4 = false
+    params.agree5 = false
+    params.agree6 = false
+    params.promoCode = ""
+    isChannel.value = true
+    imageUrl.value = ""
+    bankDate.value = []
+    code.value = ""
+    WireTransferAccount.bankMsg = ""
+    introduce.introduce = ""
+    introduce.enIntroduce = ""
+    Object.assign(tableData, tableData1)
+}
+const loginComboxOptions = computed(() => {
+    return loginOptions.value.map((item) => ({
+        text: item.label,
+        value: item.login
+    }))
+})
+const creditCardOptions = computed(() => {
+    return ruleForm.bankCredit.map((item, index) => ({
+        text: `${item.bankUname}-${item.bankCardNum}`,
+        value: item.id
+    }))
+})
+
+const bankOptions = computed(() => {
+    return bankDate.value.map((item, index) => ({
+        text: (locale.value === 'cn' || locale.value === 'zhHant') ? item.name : item.enName,
+        value: item.code
+    }))
+})
+
+// 获取账户信息
+const getDateList = async () => {
+    let res = await customApi.CustomDropdown({ platform: "" })
+    if (res.code == Code.StatusOK) {
+        loginOptions.value = res.data.map(item => ({
+            ...item,
+            label: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${item.balance}`
+        }))
+        const pages = getCurrentPages()
+        const route = pages[pages.length - 1].$page?.options || {}
+        if (route.login) {
+            const found = loginOptions.value.find(opt => opt.login === Number(route.login))
+            loginValue.value = found.login
+            loginValueDoc.value = found.label
+            step2.value = true
+        }
+    } else {
+        $pigeon.MessageError(res.msg)
+    }
+}
+//获取入金通道
+const getDepositList = async () => {
+    pictLoading.value = true
+    tableData.International_Transfer = []
+    tableData.China_UnionPay = []
+    tableData.Digital_Currency = []
+    tableData.Electronic_Wallet = []
+    tableData.Ucard_Wallet = []
+    let res = await financialApi.RemittanceChannelList({})
+    if (res.code == Code.StatusOK) {
+        res.data.forEach(item => {
+            if (item.type == 1) tableData.International_Transfer.push(item), tableData1.International_Transfer.push(item)
+            if (item.type == 2) tableData.China_UnionPay.push(item), tableData1.China_UnionPay.push(item)
+            if (item.type == 3) tableData.Digital_Currency.push(item), tableData1.Digital_Currency.push(item)
+            if (item.type == 4) tableData.Electronic_Wallet.push(item), tableData1.Electronic_Wallet.push(item)
+            if (item.type == 5) tableData.Ucard_Wallet.push(item), tableData1.Ucard_Wallet.push(item)
+        })
+        pictLoading.value = false
+    } else {
+        $pigeon.MessageError(res.msg)
+        pictLoading.value = false
+    }
+}
+//获取银行列表
+const getBankList = async (row) => {
+    let res = await financialApi.BankList({ channelCode: row.code })
+    try {
+        if (res.code == Code.StatusOK) {
+            let bank = res.data
+            let data = []
+            bank.forEach(j => {
+                if (!j.minAmount && j.minAmount != 0) j.minAmount = row.minAmount
+                if (!j.maxAmount && j.maxAmount != 0) j.maxAmount = row.maxAmount
+                j.bankValid = row.bankValid
+                j.requestUrl = row.requestUrl
+                data.push(j)
+            })
+            bankDate.value = data
+        } else {
+            uni.showToast({ title: res.msg, icon: 'none' })
+        }
+    } catch (error) {
+        uni.showToast({ title: error.msg, icon: 'none' })
+    }
+}
+
+//获取20赠金活动信息
+const getCheckExistSuccess = async () => {
+    let res = await financialApi.depositCheckExistSuccess({})
+    if (res.code == Code.StatusOK) {
+        CheckExistSuccess.value = res.data
+    } else {
+        $pigeon.MessageError(res.msg)
+    }
+}
+//20赠金是否到期-4月30号23:59:59的时候关闭申请
+const is20Open = () => {
+    let endTime1 = "2023/04/30 23:59:59"
+    let timezone = 2
+    let offset_GMT = new Date().getTimezoneOffset()
+    let nowDate = new Date().getTime()
+    let now = new Date(nowDate + offset_GMT * 60 * 1000 + timezone * 60 * 60 * 1000).getTime()
+    let end = new Date(endTime1).getTime()
+    if (now > end) anshiClose.value = false
+}
+//限时活动
+const ActivityRequiteInfo = async () => {
+    let res = await activityApi.ActivityRequiteInfo({})
+    if (res.code == Code.StatusOK) {
+        limitedStatus.value = res.data
+    } else {
+        $pigeon.MessageError(res.msg)
+    }
+}
+//2023年中赠金活动数据-10
+const Activity24nianzhongInfo = async () => {
+    let res = await activityApi.Activity23nianzhongInfo({})
+    if (res.code == Code.StatusOK) {
+        Object.assign(tableData4, res.data)
+        // const Data4 = {
+        //     "activityEndTime": null,
+        //     "activityStartTime": null,
+        //     "applicationEndTime": null,
+        //     "applicationStartTime": null,
+        //     "loginTypes": [5, 6],
+        //     "show": 1,
+        //     "useApply": 1
+        // };
+        // Object.assign(tableData4, Data4)
+        // tableData4Flag.value = tableData4.show == 1 && tableData4.useApply == 1
+    } else {
+        $pigeon.MessageError(res.msg)
+    }
+}
+//2023年中赠金活动数据-20
+const Activity24nianzhongTwoInfo = async () => {
+    let res = await activityApi.Activity23nianzhongTwoInfo({})
+    if (res.code == Code.StatusOK) {
+        Object.assign(tableData4Two, res.data)
+        // const Data4 = {
+        //     "activityEndTime": null,
+        //     "activityStartTime": null,
+        //     "applicationEndTime": null,
+        //     "applicationStartTime": null,
+        //     "loginTypes": [5, 6],
+        //     "show": 1,
+        //     "useApply": 1
+        // };
+        // Object.assign(tableData4Two, Data4)
+        // tableData4Flag.value = tableData4Two.show == 1 && tableData4Two.useApply == 1
+    } else {
+        $pigeon.MessageError(res.msg)
+    }
+}
+//2023年中赠金活动权限
+const get23nianzhongTwoLogin = async (newVal) => {
+    let res = await activityApi.Activity23nianzhongTwoLogin({ login: newVal })
+    if (res.code == Code.StatusOK) {
+        Object.assign(tableData4Two, res.data)
+        tableData4TwoFlag.value = tableData4Two.show == 1
+    } else {
+        $pigeon.MessageError(res.msg)
+    }
+}
+const getActivityExtensionGiveLogin = async (newVal) => {
+    let res = await activityApi.ActivityExtensionGiveLogin({ login: newVal })
+    if (res.code == Code.StatusOK) {
+        Object.assign(tableDataNewList, res.data)
+        tableDataNewListFlag.value = tableDataNewList.show == 1
+    } else {
+        $pigeon.MessageError(res.msg)
+    }
+}
+const getActivityExtensionGiveLoginJoin = async (newVal) => {
+    let res = await activityApi.ActivityExtensionGiveLoginJoin({ login: newVal })
+    if (res.code == Code.StatusOK) {
+        giveLoginJoin.value = res.data
+    } else {
+        $pigeon.MessageError(res.msg)
+        giveLoginJoin.value = ""
+    }
+}
+//24新年庆典   开始
+const isNewYear24Open = () => {
+    let endTime1 = "2025/3/31 23:59:59"
+    let startTime1 = "2025/1/1 00:00:00"
+    let timezone = 2
+    let offset_GMT = new Date().getTimezoneOffset()
+    let nowDate = new Date().getTime()
+    let now = new Date(nowDate + offset_GMT * 60 * 1000 + timezone * 60 * 60 * 1000).getTime()
+    let end = new Date(endTime1).getTime()
+    let start = new Date(startTime1).getTime()
+    if (now < end && start < now) ActivityNewYear24()
+}
+const ActivityNewYear24 = async () => {
+    let res = await activityApi.ActivityNewYear24({})
+    if (res.code == Code.StatusOK) {
+        tableDataNewYear24.value = res.data
+        if (typeof tableDataNewYear24.value == "object") toIncome()
+    } else {
+        $pigeon.MessageError(res.msg)
+    }
+}
+const toIncome = () => {
+    let balance = Number(tableDataNewYear24.value.balance) || 0
+    tableDataNewYear24.value.details.forEach((item, index) => {
+        if (balance > item.min && balance <= item.max) {
+            NewYear24Data.rate = item.rate
+            NewYear24Data.index = item.index
+            NewYear24Data.balance = (Number(tableDataNewYear24.value.details[index + 1].min) - balance).toFixed(2)
+            NewYear24Data.income = ((Number(tableDataNewYear24.value.details[index + 1].min) * Number(tableDataNewYear24.value.details[index + 1].rate) / 100 / 365) * 365).toFixed(2)
+            tableDataNewYear24Flag.value = true
+        } else if (balance > item.min && balance >= item.max && item.max == 0) {
+            tableDataNewYear24Flag.value = false
+        }
+    })
+}
+//24新年庆典   结束
+
+// 生命周期
+onMounted(() => {
+    console.log(userInfo.value.customInfo.countryEnName, userInfo.value.customInfo, 12341)
+    if (country.value === "VN") dialogVietnamNotice.value = true
+    is20Open()
+    getDateList()
+    // Activity24nianzhongInfo();
+    // Activity24nianzhongTwoInfo();
+    // dealResult({ "type": 7, "result": "/krad/pin?serial=123123" })
+    isNewYear24Open()
+    ActivityRequiteInfo()
+})
+watch(isStep3, async (newVal) => {
+    if (newVal) {
+        await nextTick();
+        formRef.value?.clearValidate();   // 先清除旧错误
+        resetForm();                      // 再重置数据(重置数据可能触发新校验)
+        await nextTick();
+        formRef.value?.clearValidate();   // 再次清除可能因数据重置产生的新错误
+    }
+});
+// Watch
+watch(loginValue, (login) => {
+    if (login) {
+        step2.value = true
+        getDepositList()
+        get23nianzhongTwoLogin(login)
+        getActivityExtensionGiveLogin(login)
+        getActivityExtensionGiveLoginJoin(login)
+        loginOptions.value.forEach(item => {
+            if (item.login == login) ACCType.value = item.type
+        })
+        const found = loginOptions.value.find(opt => opt.login === Number(login))
+        loginValueDoc.value = found.label
+    }
+})
+watch(() => params.amount, (newVal) => {
+    if (newVal && channelData.rate) {
+        params.amount1 = (newVal * channelData.rate).toFixed(2)
+    }
+})
+watch(() => imageUrl, (newVal) => {
+    console.log(newVal, 12);
+}, { deep: true })
+watch(() => params.agree3, (newVal) => {
+    if (newVal) {
+        params.agree2 = false
+        params.agree4 = false
+        params.agree5 = false
+        params.agree6 = false
+    }
+})
+watch(() => params.agree2, (newVal) => {
+    if (newVal) {
+        params.agree3 = false
+        params.agree4 = false
+        params.agree5 = false
+        params.agree6 = false
+    }
+})
+watch(() => params.agree4, (newVal) => {
+    if (newVal) {
+        params.agree3 = false
+        params.agree2 = false
+        params.agree5 = false
+        params.agree6 = false
+    }
+})
+watch(() => params.agree5, (newVal) => {
+    if (newVal) {
+        params.agree3 = false
+        params.agree2 = false
+        params.agree4 = false
+        params.agree6 = false
+    }
+})
+watch(() => params.agree6, (newVal) => {
+    if (newVal) {
+        params.agree3 = false
+        params.agree2 = false
+        params.agree4 = false
+        params.agree5 = false
+        if (giveLoginJoin.value.flag == false) {
+            let tips = ""
+            if (giveLoginJoin.value.promptType == 1) tips = t("surplusList.item10")
+            else tips = t("surplusList.item11")
+            if (giveLoginJoin.value.activityCategory == 1) {
+                $pigeon.MessageConfirm(
+                    tips,
+                    t("Msg.SystemPrompt"),
+                    t("surplusList.item12"),
+                    t("Home.msg.item3"),
+                    () => {
+                        $pigeon.MessageConfirm(
+                            t("surplusList.item13"),
+                            t("Msg.SystemPrompt"),
+                            t("Btn.Confirm"),
+                            t("Btn.Cancel"),
+                            async () => {
+                                try {
+                                    const res = await activityApi.ActivityGiveCancel({ login: $route.query.login })
+                                    if (res.code == Code.StatusOK) $pigeon.MessageOK(res.msg || t("Msg.Success"))
+                                    else $pigeon.MessageError(res.msg)
+                                } catch (error) {
+                                    $pigeon.MessageError(t("Msg.Fail"))
+                                }
+                            },
+                            () => { params.agree6 = false }
+                        )
+                    },
+                    () => { },
+                    { showCancelButton: true }
+                )
+            } else if (giveLoginJoin.value.activityCategory == 2) {
+                $pigeon.MessageConfirm(
+                    tips,
+                    t("Msg.SystemPrompt"),
+                    "跳转",
+                    t("Btn.Cancel"),
+                    () => {
+                        $pigeon.MessageConfirm(
+                            "是否跳转到对应活动取消",
+                            t("Msg.SystemPrompt"),
+                            t("Btn.Confirm"),
+                            t("Btn.Cancel"),
+                            () => {
+                                uni.navigateTo({ url: "/pages/customer/monthly/list" })
+                            },
+                            () => { params.agree6 = false }
+                        )
+                    },
+                    () => { },
+                    { showCancelButton: false }
+                )
+            } else {
+                $pigeon.MessageConfirm(
+                    tips,
+                    t("Msg.SystemPrompt"),
+                    t("Btn.Confirm"),
+                    t("Btn.Cancel")
+                )
+            }
+        }
+    }
+})
+</script>
+
+<style lang="scss" scoped>
+@import "@/uni.scss";
+
+.custom-deposit {
+
+    .crm-title-box {
+        margin-bottom: px2rpx(20);
+
+        .tit {
+            font-size: px2rpx(20);
+            font-weight: 700;
+            color: var(--color-navy-900);
+        }
+    }
+
+    .box {
+        margin-bottom: px2rpx(20);
+
+        .b-card {
+            background: #fff;
+            border-radius: px2rpx(12);
+            padding: px2rpx(20);
+            box-shadow: 0 px2rpx(4) px2rpx(12) rgba(0, 0, 0, 0.03);
+
+            .card-top {
+                .tit {
+                    font-size: px2rpx(16);
+                    font-weight: 600;
+                    margin-bottom: px2rpx(16);
+                    display: flex;
+                    align-items: center;
+                    color: var(--color-navy-900);
+
+                    position: relative;
+                    padding-left: 20px;
+
+                    &:after {
+                        content: '';
+                        position: absolute;
+                        left: 0;
+                        top: 50%;
+                        transform: translateY(-50%);
+                        width: 0;
+                        height: 0;
+                        border-top: 6px solid transparent;
+                        border-bottom: 6px solid transparent;
+                        border-left: 8px solid currentColor;
+                    }
+                }
+            }
+
+            .channelType {
+                font-size: px2rpx(15);
+                font-weight: 600;
+                margin: px2rpx(24) 0 px2rpx(12);
+                color: var(--color-navy-700);
+                padding-left: px2rpx(8);
+                border-left: px2rpx(4) solid var(--color-primary);
+            }
+        }
+    }
+
+    .reselect-btn {
+        margin-top: px2rpx(20);
+        display: flex;
+        justify-content: flex-end;
+
+        .reselect {
+            background-color: var(--color-zinc-100);
+            color: var(--color-navy-700);
+            border: none;
+            font-size: px2rpx(14);
+            padding: px2rpx(8) px2rpx(20);
+            border-radius: px2rpx(8);
+
+            &:active {
+                background-color: var(--color-zinc-200);
+            }
+        }
+    }
+
+    .s-btn[type="primary"] {
+        width: 100%;
+        height: px2rpx(48);
+        background-color: #cf1322;
+        color: #fff;
+        border-radius: px2rpx(12);
+        font-size: px2rpx(16);
+        font-weight: 600;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        border: none;
+        margin-top: px2rpx(30);
+        transition: all 0.2s;
+
+        &:active {
+            transform: scale(0.98);
+            background: var(--color-navy-800);
+        }
+    }
+
+    .add-back {
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        margin-bottom: px2rpx(12);
+        padding: px2rpx(12) px2rpx(16);
+        background: var(--color-zinc-100);
+        border-radius: px2rpx(8);
+
+        text {
+            font-size: px2rpx(14);
+            color: var(--color-navy-700);
+            font-weight: 500;
+        }
+
+        .add-btn {
+            color: var(--color-primary);
+            font-weight: 600;
+            text-decoration: underline;
+
+            &:active {
+                opacity: 0.7;
+            }
+        }
+    }
+
+    .wire-transfer-account {
+        background: var(--color-zinc-50);
+        padding: px2rpx(16);
+        border-radius: px2rpx(12);
+        margin: px2rpx(16) 0;
+
+        .row {
+            display: flex;
+            margin-bottom: px2rpx(12);
+            font-size: px2rpx(14);
+
+            &:last-child {
+                margin-bottom: 0;
+            }
+
+            .label {
+                width: px2rpx(120);
+                color: var(--color-zinc-500);
+            }
+
+            .content {
+                flex: 1;
+                color: var(--color-navy-900);
+                font-weight: 500;
+            }
+
+            .SpecialColor {
+                color: var(--color-error);
+            }
+        }
+    }
+
+    .activities {
+        margin: px2rpx(24) 0;
+
+        .checkbox {
+            display: flex;
+            align-items: flex-start;
+            gap: px2rpx(8);
+            margin-bottom: px2rpx(12);
+
+            :deep(uni-checkbox .uni-checkbox-input) {
+                border-radius: px2rpx(4);
+                width: px2rpx(18);
+                height: px2rpx(18);
+            }
+
+            text {
+                font-size: px2rpx(14);
+                color: var(--color-navy-700);
+                font-weight: 500;
+                line-height: 1.5;
+            }
+        }
+
+        .clause-text {
+            font-size: px2rpx(13);
+            color: var(--color-zinc-500);
+            line-height: 1.6;
+            padding-left: px2rpx(26);
+
+            .clause {
+                color: var(--color-primary);
+                text-decoration: underline;
+            }
+        }
+    }
+
+    .step3-attention {
+        // background: var(--color-error-50, #fff1f0);
+        border-radius: px2rpx(12);
+        margin-bottom: px2rpx(20);
+
+        .tips {
+            line-height: 1.8;
+            font-size: px2rpx(12);
+            color: #909399;
+            background-color: #f9f9f9;
+            padding: px2rpx(12);
+            border-radius: px2rpx(4);
+            border-left: px2rpx(2) solid #409eff;
+
+            .title {
+                font-weight: 600;
+                margin-bottom: px2rpx(6);
+                color: #606266;
+            }
+        }
+
+        .attention {
+            font-size: px2rpx(14);
+            //  color: var(--color-error-600, #cf1322);
+            line-height: 1.6;
+        }
+
+        .btn-bottom {
+            margin-top: px2rpx(20);
+            display: flex;
+            justify-content: center;
+
+            .btn {
+                background: var(--color-error-600, #cf1322);
+                color: #fff;
+                padding: px2rpx(10) px2rpx(48);
+                border-radius: px2rpx(24);
+                font-size: px2rpx(15);
+                font-weight: 700;
+                box-shadow: 0 px2rpx(4) px2rpx(10) rgba(207, 19, 34, 0.2);
+                transition: all 0.2s;
+
+                &:active {
+                    transform: scale(0.96);
+                    opacity: 0.8;
+                }
+            }
+        }
+    }
+
+    .upload-box {
+        display: flex;
+        align-items: center;
+        gap: px2rpx(12);
+
+        .btn-upload {
+            background: var(--color-zinc-100);
+            border: px2rpx(1) dashed var(--color-zinc-300);
+            border-radius: px2rpx(8);
+            height: px2rpx(44);
+            font-size: px2rpx(14);
+            color: var(--color-zinc-600);
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            padding: 0 px2rpx(20);
+        }
+
+        .img-preview {
+            width: px2rpx(44);
+            height: px2rpx(44);
+            border-radius: px2rpx(4);
+            object-fit: cover;
+        }
+    }
+
+    .label-with-icon {
+        font-size: px2rpx(14);
+        color: #606266;
+        box-sizing: border-box;
+        display: flex;
+        align-items: center;
+        padding: 0 0 8px;
+        height: px2rpx(36);
+        line-height: 1.5715;
+        text-align: left;
+        /* #ifndef APP-NVUE */
+        white-space: initial;
+        /* #endif */
+
+        .help-icon {
+            margin-left: px2rpx(8);
+            width: px2rpx(16);
+            height: px2rpx(16);
+            background: var(--color-zinc-200);
+            border-radius: 50%;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            font-size: px2rpx(12);
+            color: var(--color-zinc-600);
+            cursor: pointer;
+        }
+    }
+
+    .tooltip-content {
+        :deep(.uni-tooltip-popup) {
+            background-color: #fff !important;
+            box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1) !important;
+            width: px2rpx(300) !important;
+            color: var(--color-zinc-500);
+            line-height: 1.6;
+        }
+    }
+
+    .error {
+        color: var(--color-error);
+        font-size: px2rpx(12);
+        margin-top: px2rpx(4);
+        display: block;
+    }
+
+    :deep(.base-info-form) {
+        .uni-row1 {
+            .uni-col {
+                padding: 0 px2rpx(10) !important;
+            }
+
+            .uni-forms-item {
+                min-height: px2rpx(79);
+                margin-bottom: px2rpx(10);
+                position: relative;
+            }
+
+            .uni-select,
+            .uni-combox,
+            .uni-easyinput__content,
+            .uni-date-editor--x {
+                border: none !important;
+                background-color: var(--color-zinc-100) !important;
+                border-radius: px2rpx(8) !important;
+            }
+
+            .uni-easyinput__content-input {
+                height: px2rpx(35) !important;
+            }
+        }
+    }
+
+    .popup-content {
+        background: #fff;
+        border-radius: px2rpx(20);
+        padding: px2rpx(24);
+        width: px2rpx(320);
+        text-align: center;
+
+        .popup-title {
+            font-size: px2rpx(18);
+            font-weight: 700;
+            margin-bottom: px2rpx(20);
+            color: var(--color-navy-900);
+            display: block;
+        }
+
+        .popup-text {
+            font-size: px2rpx(14);
+            line-height: 1.6;
+            color: var(--color-zinc-600);
+            margin-bottom: px2rpx(20);
+            display: block;
+        }
+
+        .popup-form {
+            background: var(--color-zinc-50);
+            border-radius: px2rpx(12);
+            padding: px2rpx(16);
+            margin-bottom: px2rpx(24);
+            text-align: left;
+
+            .popup-row {
+                display: flex;
+                justify-content: space-between;
+                margin-bottom: px2rpx(12);
+                font-size: px2rpx(14);
+
+                &:last-child {
+                    margin-bottom: 0;
+                }
+
+                .label {
+                    color: var(--color-zinc-500);
+                    font-weight: 500;
+                }
+
+                text:not(.label) {
+                    color: var(--color-navy-900);
+                    font-weight: 500;
+                }
+
+                .small-input {
+                    width: px2rpx(60);
+                    background: #fff;
+                    border: px2rpx(1) solid var(--color-zinc-200);
+                    border-radius: px2rpx(4);
+                    padding: 0 px2rpx(4);
+                    height: px2rpx(24);
+                    font-size: px2rpx(12);
+                }
+            }
+        }
+
+        .popup-buttons {
+            display: flex;
+            gap: px2rpx(12);
+
+            button {
+                flex: 1;
+                height: px2rpx(44);
+                border-radius: px2rpx(10);
+                font-size: px2rpx(15);
+                font-weight: 600;
+                display: flex;
+                align-items: center;
+                justify-content: center;
+                border: none;
+
+                &[type="primary"] {
+                    background-color: #cf1322;
+                    color: #fff;
+                }
+
+                &:not([type="primary"]) {
+                    background: var(--color-zinc-100);
+                    color: var(--color-zinc-600);
+                }
+            }
+        }
+
+        .result-icon {
+            display: flex;
+            justify-content: center;
+            margin-bottom: px2rpx(16);
+
+            .iconfont {
+                font-size: px2rpx(48);
+
+                &.iconchenggong {
+                    color: #52c41a;
+                }
+
+                &.iconjingshi {
+                    color: #faad14;
+                }
+
+                &.icondengdai {
+                    color: var(--color-primary);
+                    animation: rotate 2s linear infinite;
+                }
+            }
+        }
+    }
+
+    @keyframes rotate {
+        from {
+            transform: rotate(0deg);
+        }
+
+        to {
+            transform: rotate(360deg);
+        }
+    }
+
+    .avatar-uploader {
+        border: 1px dashed;
+        width: px2rpx(200);
+        height: px2rpx(150);
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        justify-content: center;
+        /*float: left;*/
+        //overflow: hidden;
+
+    }
+
+    :deep(.files-button) {
+        .file-item {
+
+            .icon,
+            .avatar {
+                width: px2rpx(200);
+                height: px2rpx(150);
+            }
+        }
+    }
+
+
+
+}
+</style>

+ 279 - 190
pages/customer/deposit.vue

@@ -1,64 +1,51 @@
 <template>
     <cwg-page-wrapper class="create-page" :isHeaderFixed="true">
         <cwg-header :title="t('Home.page_customer.item2')" />
-        <view class="custom-deposit">
-            <!-- 步骤1:选择账户 -->
-            <view class="box box-step1">
-                <view class="b-card">
-                    <view class="card-top">
-                        <text class="tit"><text class="iconfont icon-caret-right"></text>{{ t('Custom.Deposit.Title1')
-                        }}</text>
-                        <cwg-combox :clearable="false" v-model:value="loginValue" :options="loginComboxOptions"
-                            :placeholder="t('placeholder.choose')" />
+
+        <uni-loading v-if="loading" />
+        <view class="custom-deposit-container" v-else>
+            <view class="custom-deposit">
+                <!-- 步骤1:选择账户 -->
+                <view class="box">
+                    <view class="b-card">
+                        <view class="card-top">
+                            <text class="tit"><text class="iconfont icon-caret-right"></text>{{
+                                t('Custom.Deposit.Title1')
+                            }}</text>
+                            <cwg-combox :clearable="false" v-model:value="loginValue" :options="loginComboxOptions"
+                                :placeholder="t('placeholder.choose')" />
+                        </view>
                     </view>
                 </view>
-            </view>
-            <!-- 步骤2:支付通道列表(卡片布局) -->
-            <view class="box box-step2" v-if="step2">
-                <view class="b-card">
-                    <view class="card-top">
-                        <text class="tit"><text class="iconfont icon-caret-right"></text>{{ t('Custom.Deposit.Title2')
-                        }}</text>
-                        <cwg-asset-tabs v-if="tabsConfig.length > 0" v-model="activeTab" :tabs="tabsConfig" />
-                        <uni-loading v-if="currentTableData.length == 0" />
-                        <view v-if="currentTableData.length">
-                            <PaymentMethodsList :list="currentTableData" @select="isShowStep3" />
+                <!-- 步骤2:支付通道列表(卡片布局) -->
+                <view class="box" v-if="step2">
+                    <view class="b-card">
+                        <view class="card-top">
+                            <text class="tit"><text class="iconfont icon-caret-right"></text>{{
+                                t('Custom.Deposit.Title2')
+                            }}</text>
+                            <cwg-combox :clearable="false" v-model:value="channelId" :options="channelListOptions"
+                                :placeholder="t('placeholder.choose')">
+                            </cwg-combox>
                         </view>
-                        <!-- <view v-if="step3" class="reselect-btn">
-                            <button class="s-btn reselect" type="primary" @click="showTable">{{
-                                t('Custom.Deposit.Reselect') }}</button>
-                        </view> -->
                     </view>
                 </view>
-            </view>
 
-            <!-- 步骤3:填写入金信息 -->
-            <view class="box box-step3" v-if="step3">
-                <view class="b-card">
-                    <view class="card-top">
-                        <!-- 注意事项(第一步确认) -->
-                        <view v-if="!isStep3" class="step3-attention">
-                            <view class="tips" v-if="(introduce.introduce || introduce.enIntroduce)">
-                                <view>
-                                    <rich-text class="attention"
-                                        :nodes="isZh ? introduce.introduce : introduce.enIntroduce"></rich-text>
+                <!-- 步骤3:填写入金信息 -->
+                <view class="box box-step3" v-if="step3">
+                    <view class="b-card">
+                        <view class="card-top">
+                            <!-- 表单(确认后显示) -->
+                            <uni-forms v-if="isStep3" ref="formRef" :model="params" :rules="rules" label-position="top"
+                                validate-trigger="submit" :label-width="300" class="base-info-form">
+                                <uni-row class="demo-uni-row uni-row1 uni-row2">
 
-                                </view>
-                            </view>
-                            <view class="btn-bottom">
-                                <text class="btn crm-cursor" @click="isStep3Open()">{{ t('Btn.Confirm')
-                                    }}</text>
-                            </view>
 
-                        </view>
+                                </uni-row>
 
-                        <!-- 表单(确认后显示) -->
-                        <uni-forms v-if="isStep3" ref="formRef" :model="params" :rules="rules" label-position="top"
-                            validate-trigger="submit" :label-width="300" class="base-info-form">
-                            <uni-row class="demo-uni-row uni-row1">
                                 <!-- 信用卡选择区域 -->
                                 <template v-if="isStep3 && channelData.confirmCreditCard == 1">
-                                    <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                                    <view>
                                         <view
                                             style="display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap;">
                                             <text class="tit"><text class="iconfont icon-caret-right"></text>{{
@@ -69,47 +56,46 @@
                                                     t('Custom.Withdraw.addBank1') }}</text>
                                             </view>
                                         </view>
-                                    </uni-col>
-                                    <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                                    </view>
+                                    <view>
                                         <uni-forms-item>
                                             <cwg-combox :clearable="false" v-model:value="myId"
                                                 :options="creditCardOptions" :placeholder="t('placeholder.choose')"
                                                 @change="selectCode" />
                                         </uni-forms-item>
-                                    </uni-col>
+                                    </view>
                                 </template>
 
 
                                 <!-- 银行选择(如有) -->
                                 <template v-if="isStep3 && bankOptions.length">
-                                    <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                                    <view>
                                         <text class="tit"><text class="iconfont icon-caret-right"></text>{{
                                             t('news_add_field.Label.Title4')
-                                            }}</text>
-                                    </uni-col>
-                                    <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                                        }}</text>
+                                    </view>
+                                    <view>
                                         <uni-forms-item>
                                             <cwg-combox :clearable="false" v-model:value="code" :options="bankOptions"
                                                 :placeholder="t('placeholder.choose')" @change="selectCode" />
                                         </uni-forms-item>
-                                    </uni-col>
+                                    </view>
                                 </template>
                                 <!-- 特别提示(B2BINPAY) -->
-                                <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24"
-                                    v-if="isStep3 && bankOptions.length && channelData.code == 'B2BINPAY'">
+                                <view v-if="isStep3 && bankOptions.length && channelData.code == 'B2BINPAY'">
                                     <text class="tit" style="margin: 10px 0 20px"><text class="iconfont iconi"></text>{{
                                         t('Custom.Deposit.Des') }}</text>
-                                </uni-col>
+                                </view>
 
                                 <!-- 电汇信息展示 -->
                                 <template
                                     v-if="isStep3 && ['UNION_PAY_TELEGRAPHIC', 'UNION_PAY_TELEGRAPHIC_SPECIAL', 'UNION_PAY_TELEGRAPHIC_TWO'].includes(channelData.code)">
-                                    <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                                    <view>
                                         <text class="tit"><text class="iconfont icon-caret-right"></text>{{
                                             t('Custom.Deposit.Title5') }}</text>
-                                    </uni-col>
+                                    </view>
 
-                                    <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                                    <view>
                                         <view class="wire-transfer-account">
                                             <view class="row"><text class="label SpecialColor">{{
                                                 t('Custom.Deposit.bankUname') }}</text><text
@@ -117,7 +103,8 @@
                                                         WireTransferAccount.bankUname || '--'
                                                     }}</text></view>
                                             <view class="row"><text class="label">{{ t('Custom.Deposit.bankName')
-                                                    }}</text><text class="content">{{ WireTransferAccount.bankName ||
+                                            }}</text><text class="content">{{ WireTransferAccount.bankName
+                                                        ||
                                                         '--'
                                                     }}</text></view>
                                             <view class="row"><text class="label SpecialColor">{{
@@ -126,7 +113,8 @@
                                                         WireTransferAccount.bankCardNum || '--'
                                                     }}</text></view>
                                             <view class="row"><text class="label">{{ t('Custom.Deposit.bankAddr')
-                                                    }}</text><text class="content">{{ WireTransferAccount.bankAddr ||
+                                            }}</text><text class="content">{{ WireTransferAccount.bankAddr
+                                                        ||
                                                         '--'
                                                     }}</text></view>
                                             <view class="row"><text class="label SpecialColor">{{
@@ -135,7 +123,8 @@
                                                         WireTransferAccount.swiftCode || '--'
                                                     }}</text></view>
                                             <view class="row"><text class="label">{{ t('Custom.Deposit.bankCode')
-                                                    }}</text><text class="content">{{ WireTransferAccount.bankCode ||
+                                            }}</text><text class="content">{{ WireTransferAccount.bankCode
+                                                        ||
                                                         '--'
                                                     }}</text></view>
                                             <view class="row"><text class="label SpecialColor">{{
@@ -143,18 +132,18 @@
                                                     }}</text><text class="content SpecialColor">{{
                                                         WireTransferAccount.bankMsg || '--' }}</text></view>
                                         </view>
-                                    </uni-col>
+                                    </view>
                                 </template>
 
 
                                 <!-- 数字货币信息展示 -->
                                 <template
                                     v-if="isStep3 && channelData.code && channelData.code.indexOf('DIGITAL_PAY_TYPE_KEY') === 0">
-                                    <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                                    <view>
                                         <text class="tit"><text class="iconfont icon-caret-right"></text>{{
                                             t('Custom.Deposit.DigitalAcc') }}</text>
-                                    </uni-col>
-                                    <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                                    </view>
+                                    <view>
                                         <view class="wire-transfer-account">
                                             <view class="row"><text class="label SpecialColor">{{
                                                 t('Custom.Deposit.DigitalName') }}</text><text
@@ -162,7 +151,7 @@
                                                         + '-' +
                                                         WireTransferAccount.type }}</text></view>
                                             <view class="row"><text class="label">{{ t('Custom.Withdraw.Title6')
-                                                    }}</text><text class="content">{{ WireTransferAccount.address ||
+                                            }}</text><text class="content">{{ WireTransferAccount.address ||
                                                         '--'
                                                     }}</text></view>
                                             <view class="row"><text class="label">QR Code</text>
@@ -170,30 +159,28 @@
                                                     style="width: 100rpx; height: 100rpx;" />
                                             </view>
                                         </view>
-                                    </uni-col>
+                                    </view>
                                 </template>
-
-
                                 <!-- 表单区域(含金额、预估金额、上传凭证、优惠码) -->
                                 <template v-if="isStep3">
-                                    <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                                    <view>
                                         <text class="tit"><text class="iconfont icon-caret-right"></text>{{
                                             t('Custom.Deposit.Title3') }}</text>
-                                    </uni-col>
-                                    <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-loading="pictLoadingImg">
-
+                                    </view>
+                                    <view v-loading="pictLoadingImg">
                                         <!-- 金额输入 -->
-                                        <uni-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
+                                        <view class="amount-box">
                                             <uni-forms-item
                                                 :label="t('Custom.Deposit.Title3') + '(' + channelData.currency + ')'"
-                                                name="amount" :error-message="amountErrorMessage">
+                                                name="amount" :error-message="amountErrorMessage" class="amount-input">
                                                 <uni-easyinput type="number" v-model="params.amount"
                                                     :placeholder="t('placeholder.input')" @blur="validateAmount" />
                                             </uni-forms-item>
-                                        </uni-col>
+                                            <view class="btn" v-t="'State.All'" @click="setAllAmount"></view>
+                                        </view>
 
                                         <!-- 预估金额(若有汇率) -->
-                                        <uni-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8" v-if="channelData.rate">
+                                        <view v-if="channelData.rate">
                                             <uni-forms-item>
                                                 <template #label>
                                                     <view class="label-with-icon">
@@ -210,9 +197,9 @@
                                                 <uni-easyinput v-model="params.amount1" disabled
                                                     :placeholder="t('placeholder.input')" />
                                             </uni-forms-item>
-                                        </uni-col>
+                                        </view>
                                         <!-- 优惠码 -->
-                                        <uni-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
+                                        <view>
                                             <uni-forms-item name="promoCode">
                                                 <template #label>
                                                     <view class="label-with-icon">
@@ -228,9 +215,9 @@
                                                 <uni-easyinput v-model="params.promoCode"
                                                     :placeholder="t('placeholder.input')" />
                                             </uni-forms-item>
-                                        </uni-col>
+                                        </view>
                                         <!-- 上传汇款凭证(特定渠道) -->
-                                        <uni-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8" v-if="
+                                        <view v-if="
                                             channelData.code == 'UNION_PAY_TELEGRAPHIC' ||
                                             channelData.code == 'UNION_PAY_TELEGRAPHIC_SPECIAL' ||
                                             channelData.code && channelData.code.indexOf('DIGITAL_PAY_TYPE_KEY') === 0 ||
@@ -241,57 +228,62 @@
                                                     :fileMediatype="'all'" uploadUrl="/wasabi/upload/file"
                                                     :baseUrl="Host80" />
                                             </uni-forms-item>
-                                        </uni-col>
+                                        </view>
 
 
 
                                         <!-- 电汇提示 -->
-                                        <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24"
+                                        <view
                                             v-if="isStep3 && ['UNION_PAY_TELEGRAPHIC', 'UNION_PAY_TELEGRAPHIC_SPECIAL', 'UNION_PAY_TELEGRAPHIC_TWO'].includes(channelData.code)">
                                             <text>{{ t('Custom.Deposit.Tips') }}</text>
-                                        </uni-col>
+                                        </view>
 
                                         <!-- ========== 赠金活动部分 ========== -->
                                         <!-- 10%赠金(年中赠金) -->
-                                        <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="tableData4Flag">
+                                        <view v-if="tableData4Flag">
                                             <uni-forms-item class="agree" name="agree4">
                                                 <label class="checkbox">
                                                     <checkbox :checked="params.agree4"
                                                         @click="params.agree4 = !params.agree4" />
-                                                    <text>{{ t('news_add_field1.activitiesNZ.itemDeposit1') }}</text>
+                                                    <text>{{ t('news_add_field1.activitiesNZ.itemDeposit1')
+                                                    }}</text>
                                                 </label>
                                                 <view style="line-height: 1.5; font-size: 14px">
-                                                    <text>{{ t('news_add_field1.activitiesNZ.itemDeposit2') }}</text>
+                                                    <text>{{ t('news_add_field1.activitiesNZ.itemDeposit2')
+                                                    }}</text>
                                                     <text class="clause crm-cursor" @click="dialogClauseNZ = true">{{
                                                         t('news_add_field1.activitiesNZ.itemDeposit3')
                                                     }}</text>
-                                                    <text>{{ t('news_add_field1.activitiesNZ.itemDeposit4') }}</text>
+                                                    <text>{{ t('news_add_field1.activitiesNZ.itemDeposit4')
+                                                    }}</text>
                                                 </view>
                                             </uni-forms-item>
 
-                                        </uni-col>
+                                        </view>
 
                                         <!-- 20%赠金(年中赠金) -->
-                                        <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="tableData4TwoFlag">
+                                        <view v-if="tableData4TwoFlag">
                                             <uni-forms-item class="agree" name="agree5">
                                                 <label class="checkbox">
                                                     <checkbox :checked="params.agree5"
                                                         @click="params.agree5 = !params.agree5" />
-                                                    <text>{{ t('news_add_field1.activitiesNZTwo.itemDeposit1') }}</text>
+                                                    <text>{{ t('news_add_field1.activitiesNZTwo.itemDeposit1')
+                                                    }}</text>
                                                 </label>
                                                 <view style="line-height: 1.5; font-size: 14px">
-                                                    <text>{{ t('news_add_field1.activitiesNZTwo.itemDeposit2') }}</text>
+                                                    <text>{{ t('news_add_field1.activitiesNZTwo.itemDeposit2')
+                                                    }}</text>
                                                     <text class="clause crm-cursor" @click="dialogClauseNZTwo = true">{{
                                                         t('news_add_field1.activitiesNZTwo.itemDeposit3') }}</text>
-                                                    <text>{{ t('news_add_field1.activitiesNZTwo.itemDeposit4') }}</text>
+                                                    <text>{{ t('news_add_field1.activitiesNZTwo.itemDeposit4')
+                                                    }}</text>
                                                 </view>
                                             </uni-forms-item>
 
-                                        </uni-col>
+                                        </view>
 
                                         <!-- 赠送活动(动态) -->
-                                        <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24"
-                                            v-if="tableDataNewListFlag">
+                                        <view v-if="tableDataNewListFlag">
                                             <uni-forms-item class="agree" name="agree6">
                                                 <label>
                                                     <checkbox :checked="params.agree6"
@@ -307,10 +299,10 @@
                                                 </view>
                                             </uni-forms-item>
 
-                                        </uni-col>
+                                        </view>
 
                                         <!-- 20%赠金申请(特定账户类型) -->
-                                        <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24"
+                                        <view
                                             v-if="(ACCType == 1 || ACCType == 2 || ACCType == 5 || ACCType == 6 || ACCType == 7) && anshiClose">
                                             <uni-forms-item class="agree" name="agree3">
                                                 <label class="checkbox">
@@ -326,10 +318,10 @@
                                                 </view>
                                             </uni-forms-item>
 
-                                        </uni-col>
+                                        </view>
 
                                         <!-- 普通10%赠金(非年中、非特定账户) -->
-                                        <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24"
+                                        <view
                                             v-if="!tableData4Flag && !tableData4TwoFlag && !tableDataNewListFlag && (country != 'CN' || (country == 'CN' && (ACCType == 1 || ACCType == 2 || ACCType == 7 || ACCType == 5 || ACCType == 6 || ACCType == 8))) && ACCType != 3">
                                             <template v-if="isSupportedCountry && (ACCType == 2 || ACCType == 7)">
                                                 <uni-forms-item class="agree" name="agree2">
@@ -364,63 +356,74 @@
                                                 </uni-forms-item>
 
                                             </template>
-                                        </uni-col>
-                                    </uni-col>
+                                        </view>
+                                    </view>
                                 </template>
+                                <button class="s-btn" type="primary" @click="submitConfirm">{{ t('Btn.Submit')
+                                }}</button>
+                            </uni-forms>
+                        </view>
+                    </view>
+                </view>
+                <!-- 不参加活动弹出框 -->
+                <cwg-dont-active-popup v-model:visible="dialogDontActive" :showFooters="true"
+                    @confirm="tosubmitConfirm" />
+                <!-- 新年24用户提示弹窗 -->
+                <NewYear24Popup v-model:visible="tableDataNewYear24Flag" />
+                <!-- 越南用户提示弹窗 -->
+                <VietnamNoticePopup v-model:visible="dialogVietnamNotice" />
+                <!-- 提交后确认弹窗 -->
+                <cwg-check-confirm-popup v-model:visible="dialogCheckConfirm" :title="t('Home.page_customer.item2')"
+                    :channelData="channelData" :code="code" :selectCodes="selectCodes" :params="params"
+                    :userName="userName" :login="loginValue" :loginDoc="loginValueDoc" @confirm="submit" />
+                <!--提交后的弹出框-->
+                <CheckPopup v-model:visible="dialogCheckSuccess" :goPayLink="goPayLink" @close="closeDia" />
+                <!-- 提交后失败弹窗 -->
+                <cwg-error-popup v-model:visible="dialogCheckError" :responseMessage="RES" />
+                <!-- 最后失败弹窗 -->
+                <cwg-error-popup v-model:visible="dialogError" @confirm="closeDia" :responseMessage="RES" />
+                <!-- 最后成功弹窗 -->
+                <cwg-success-popup v-model:visible="dialogSuccess" @confirm="closeDia" />
+                <!-- 等待弹窗 -->
+                <cwg-wait-popup v-model:visible="dialogCheckWait" :showFooters="false" />
+                <!-- 赠金协议 -->
+                <ClausePopup v-model:visible="dialogClause" country="CN" :isGuoQin="isGuoQin" />
+                <!-- 赠金协议20 -->
+                <Clause20Popup v-model:visible="dialogClause1" />
+                <!--  赠金协议10年中 -->
+                <ClauseNZPopup v-model:visible="dialogClauseNZ" :title="t('news_add_field1.activitiesNZ.item6')"
+                    :startDate="tableData4.applicationStartTime" :endDate="tableData4.applicationEndTime" />
+                <!-- 赠金协议20年中 -->
+                <ClauseNZTwoPopup v-model:visible="dialogClauseNZTwo"
+                    :title="t('news_add_field1.activitiesNZTwo.item6')" :startDate="tableData4Two.applicationStartTime"
+                    :endDate="tableData4Two.applicationEndTime" />
+                <!-- 赠送活动详情-协议 -->
+                <ClauseNewListPopup v-model:visible="dialogClauseNewList" :content="tableDataNewList.content"
+                    :title="tableDataNewList.title" />
+                <!--提交后完成弹出框-->
+                <ChinaUnionPayPopup v-model:visible="dialogChinaUnionPay" />
+                <!-- 重新提交弹窗 -->
+                <DealResultPopup v-model:visible="dialogDealResult" :responseMessage="responseMessage"
+                    :title="dialogDealResultTitle" :initialData="dialogDealResult_form" :type="DealResultType"
+                    @confirm="submitDealResult" />
+                <!-- KYC成功弹窗 -->
+                <cwg-kyc-popup v-model:visible="dialogKyc" :qrText="text1" />
+            </view>
 
-                            </uni-row>
-                            <button class="s-btn" type="primary" @click="submitConfirm">{{ t('Btn.Submit') }}</button>
-                        </uni-forms>
+            <view class="step3-attention">
+                <view class="tips" v-if="(introduce.introduce || introduce.enIntroduce)">
+                    <view>
+                        <rich-text class="attention"
+                            :nodes="isZh ? introduce.introduce : introduce.enIntroduce"></rich-text>
                     </view>
                 </view>
             </view>
-            <!-- 不参加活动弹出框 -->
-            <cwg-dont-active-popup v-model:visible="dialogDontActive" :showFooters="true" @confirm="tosubmitConfirm" />
-            <!-- 新年24用户提示弹窗 -->
-            <NewYear24Popup v-model:visible="tableDataNewYear24Flag" />
-            <!-- 越南用户提示弹窗 -->
-            <VietnamNoticePopup v-model:visible="dialogVietnamNotice" />
-            <!-- 提交后确认弹窗 -->
-            <cwg-check-confirm-popup v-model:visible="dialogCheckConfirm" :title="t('Home.page_customer.item2')"
-                :channelData="channelData" :code="code" :selectCodes="selectCodes" :params="params" :userName="userName"
-                :login="loginValue" :loginDoc="loginValueDoc" @confirm="submit" />
-            <!--提交后的弹出框-->
-            <CheckPopup v-model:visible="dialogCheckSuccess" :goPayLink="goPayLink" @close="closeDia" />
-            <!-- 提交后失败弹窗 -->
-            <cwg-error-popup v-model:visible="dialogCheckError" :responseMessage="RES" />
-            <!-- 最后失败弹窗 -->
-            <cwg-error-popup v-model:visible="dialogError" @confirm="closeDia" :responseMessage="RES" />
-            <!-- 最后成功弹窗 -->
-            <cwg-success-popup v-model:visible="dialogSuccess" @confirm="closeDia" />
-            <!-- 等待弹窗 -->
-            <cwg-wait-popup v-model:visible="dialogCheckWait" :showFooters="false" />
-            <!-- 赠金协议 -->
-            <ClausePopup v-model:visible="dialogClause" country="CN" :isGuoQin="isGuoQin" />
-            <!-- 赠金协议20 -->
-            <Clause20Popup v-model:visible="dialogClause1" />
-            <!--  赠金协议10年中 -->
-            <ClauseNZPopup v-model:visible="dialogClauseNZ" :title="t('news_add_field1.activitiesNZ.item6')"
-                :startDate="tableData4.applicationStartTime" :endDate="tableData4.applicationEndTime" />
-            <!-- 赠金协议20年中 -->
-            <ClauseNZTwoPopup v-model:visible="dialogClauseNZTwo" :title="t('news_add_field1.activitiesNZTwo.item6')"
-                :startDate="tableData4Two.applicationStartTime" :endDate="tableData4Two.applicationEndTime" />
-            <!-- 赠送活动详情-协议 -->
-            <ClauseNewListPopup v-model:visible="dialogClauseNewList" :content="tableDataNewList.content"
-                :title="tableDataNewList.title" />
-            <!--提交后完成弹出框-->
-            <ChinaUnionPayPopup v-model:visible="dialogChinaUnionPay" />
-            <!-- 重新提交弹窗 -->
-            <DealResultPopup v-model:visible="dialogDealResult" :responseMessage="responseMessage"
-                :title="dialogDealResultTitle" :initialData="dialogDealResult_form" :type="DealResultType"
-                @confirm="submitDealResult" />
-            <!-- KYC成功弹窗 -->
-            <cwg-kyc-popup v-model:visible="dialogKyc" :qrText="text1" />
         </view>
     </cwg-page-wrapper>
 </template>
 
 <script setup>
-import { ref, reactive, computed, watch, onMounted, nextTick } from 'vue'
+import { ref, reactive, computed, watch, onMounted, nextTick, onUnmounted } from 'vue'
 import { useI18n } from 'vue-i18n'
 const { t, locale } = useI18n()
 import useUserStore from '@/stores/use-user-store'
@@ -593,7 +596,7 @@ watch(
 watch(
     currentTab,
     (newTabs) => {
-        showTable()
+        // showTable()
     },
     { immediate: true }
 )
@@ -1575,8 +1578,6 @@ const doShowStep3 = (row) => {
 }
 //选择支付方式
 const isShowStep3 = (row) => {
-    console.log(row, 2222);
-
     if (row.kycChannel != 1) {
         doShowStep3(row)
     } else {
@@ -1596,8 +1597,6 @@ const showTable = () => {
     form.expiryYear = undefined
     form.pin = undefined
     myId.value = null
-    step3.value = false
-    isStep3.value = false
     params.amount = ""
     params.amount1 = ""
     params.agree = false
@@ -1614,7 +1613,6 @@ const showTable = () => {
     WireTransferAccount.bankMsg = ""
     introduce.introduce = ""
     introduce.enIntroduce = ""
-    Object.assign(tableData, tableData1)
 }
 const loginComboxOptions = computed(() => {
     return loginOptions.value.map((item) => ({
@@ -1638,6 +1636,7 @@ const bankOptions = computed(() => {
 
 // 获取账户信息
 const getDateList = async () => {
+    loading.value = true
     let res = await customApi.CustomDropdown({ platform: "" })
     if (res.code == Code.StatusOK) {
         loginOptions.value = res.data.map(item => ({
@@ -1655,6 +1654,7 @@ const getDateList = async () => {
     } else {
         $pigeon.MessageError(res.msg)
     }
+    loading.value = false
 }
 //获取入金通道
 const getDepositList = async () => {
@@ -1835,40 +1835,85 @@ const toIncome = () => {
 }
 //24新年庆典   结束
 
+// 新改内容
+userStore.paymentChannel.value
+userStore.channelList.value
+const channel = computed(() => userStore.paymentChannel)
+const channelList = computed(() => userStore.channelList)
+const channelListOptions = ref([])
+const channelId = ref(null)
+const loading = ref(false)
+const setAllAmount = () => {
+    const found = loginOptions.value.find(opt => opt.login === Number(loginValue.value))
+    params.amount = parseInt(found.balance)
+    validateAmount()
+}
+const allTabs = computed(() => {
+    return {
+        "Digital_Currency": t('Custom.Deposit.Channel3'),
+        "China_UnionPay": t('Custom.Deposit.Channel2'),
+        "Electronic_Wallet": t('Custom.Deposit.Channel4'),
+        "International_Transfer": t('Custom.Deposit.Channel1'),
+        "Ucard_Wallet": t('card.title'),
+    }
+})
+function formatChannels(data) {
+    const result = []
+    // 遍历每个分类
+    for (const key in data) {
+        const list = data[key] || []
+        // 插入分类标题(禁用项)
+        if (list.length) {
+            result.push({
+                text: allTabs.value[key],
+                value: key,
+                disable: true
+            })
+        }
+        list.forEach(item => {
+            result.push({
+                ...item,
+                text: item.name,
+                value: item.id
+            })
+        })
+    }
+    return result
+}
 // 生命周期
 onMounted(() => {
-    console.log(userInfo.value.customInfo.countryEnName, userInfo.value.customInfo, 12341)
-    if (country.value === "VN") dialogVietnamNotice.value = true
-    is20Open()
+    if (channelList.value) {
+        channelListOptions.value = formatChannels(channelList.value)
+    }
+    channelId.value = channel.value
     getDateList()
-    // Activity24nianzhongInfo();
-    // Activity24nianzhongTwoInfo();
-    // dealResult({ "type": 7, "result": "/krad/pin?serial=123123" })
-    isNewYear24Open()
-    ActivityRequiteInfo()
+    isStep3Open()
 })
+onUnmounted(() => {
+    // userStore.savePaymentChannel('')
+    // userStore.saveChannelList('')
+})
+
+watch(channelId, async (newVal) => {
+    if (newVal) {
+        showTable()
+        let row = channelListOptions.value.find(item => item.id == newVal)
+        isShowStep3(row)
+    }
+});
 watch(isStep3, async (newVal) => {
     if (newVal) {
         await nextTick();
-        formRef.value?.clearValidate();   // 先清除旧错误
-        resetForm();                      // 再重置数据(重置数据可能触发新校验)
+        formRef.value?.clearValidate();
+        resetForm();
         await nextTick();
-        formRef.value?.clearValidate();   // 再次清除可能因数据重置产生的新错误
+        formRef.value?.clearValidate();
     }
 });
 // Watch
 watch(loginValue, (login) => {
     if (login) {
-        step2.value = true
-        getDepositList()
-        get23nianzhongTwoLogin(login)
-        getActivityExtensionGiveLogin(login)
-        getActivityExtensionGiveLoginJoin(login)
-        loginOptions.value.forEach(item => {
-            if (item.login == login) ACCType.value = item.type
-        })
-        const found = loginOptions.value.find(opt => opt.login === Number(login))
-        loginValueDoc.value = found.label
+        step3.value = true
     }
 })
 watch(() => params.amount, (newVal) => {
@@ -1986,6 +2031,8 @@ watch(() => params.agree6, (newVal) => {
 @import "@/uni.scss";
 
 .custom-deposit {
+    width: px2rpx(566);
+    flex-shrink: 0;
 
     .crm-title-box {
         margin-bottom: px2rpx(20);
@@ -2001,10 +2048,10 @@ watch(() => params.agree6, (newVal) => {
         margin-bottom: px2rpx(20);
 
         .b-card {
-            background: #fff;
-            border-radius: px2rpx(12);
-            padding: px2rpx(20);
-            box-shadow: 0 px2rpx(4) px2rpx(12) rgba(0, 0, 0, 0.03);
+            // background: #fff;
+            // border-radius: px2rpx(12);
+            // padding: px2rpx(20);
+            // box-shadow: 0 px2rpx(4) px2rpx(12) rgba(0, 0, 0, 0.03);
 
             .card-top {
                 .tit {
@@ -2312,15 +2359,6 @@ watch(() => params.agree6, (newVal) => {
                 position: relative;
             }
 
-            .uni-select,
-            .uni-combox,
-            .uni-easyinput__content,
-            .uni-date-editor--x {
-                border: none !important;
-                background-color: var(--color-zinc-100) !important;
-                border-radius: px2rpx(8) !important;
-            }
-
             .uni-easyinput__content-input {
                 height: px2rpx(35) !important;
             }
@@ -2476,5 +2514,56 @@ watch(() => params.agree6, (newVal) => {
 
 
 
+}
+
+.amount-box {
+    display: flex;
+    align-items: center;
+    gap: px2rpx(12);
+
+    .amount-input {
+        flex: 1;
+    }
+
+    .btn {
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        font-size: px2rpx(14);
+        color: var(--color-zinc-600);
+        margin-bottom: px2rpx(12);
+        height: px2rpx(35);
+        background-color: #cf1322;
+        color: #fff;
+        border-radius: px2rpx(4);
+        font-weight: 600;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        border: none;
+        padding: 0 px2rpx(20);
+        margin-top: px2rpx(21);
+        cursor: pointer;
+    }
+}
+
+.custom-deposit-container {
+    width: 100%;
+    display: flex;
+    gap: px2rpx(60);
+    justify-content: space-between;
+}
+
+@media (max-width: 992px) {
+    .custom-deposit {
+        width: 100%;
+        margin-top: px2rpx(20);
+    }
+
+    .custom-deposit-container {
+        display: flex;
+        gap: px2rpx(30);
+        flex-wrap: wrap;
+    }
 }
 </style>

+ 2044 - 0
pages/customer/withdrawal-select.vue

@@ -0,0 +1,2044 @@
+<template>
+  <cwg-page-wrapper class="create-page" :isHeaderFixed="true">
+    <cwg-header :title="t('Custom.Withdraw.Title')" />
+    <view class="custom-withdraw">
+      <!-- 步骤1:选择账户 -->
+      <view class="box box-step1">
+        <view class="b-card">
+          <view class="card-top">
+            <text class="tit"><text class="iconfont icon-caret-right"></text>{{ t('Custom.Deposit.Title11') }}</text>
+            <view class="base-info-form">
+              <view class="uni-row2">
+                <cwg-combox :clearable="false" v-model:value="loginValue" :options="loginComboxOptions"
+                  :placeholder="t('placeholder.choose')" @change="onAccountChange" />
+              </view>
+            </view>
+          </view>
+        </view>
+      </view>
+
+      <!-- 步骤2:支付通道列表 -->
+      <view class="box box-step2" v-if="step2">
+        <view class="b-card">
+          <view class="card-top">
+            <text class="tit"><text class="iconfont icon-caret-right"></text>{{ t('Custom.Deposit.Title22') }}</text>
+            <cwg-asset-tabs v-if="tabsConfig.length > 0" v-model="activeTab" :tabs="tabsConfig" />
+            <uni-loading v-if="currentTableData.length == 0" />
+            <view v-if="currentTableData.length">
+              <PaymentMethodsList :list="currentTableData" @select="isShowStep3" />
+            </view>
+            <view v-if="step3" class="reselect-btn">
+              <button class="s-btn reselect" type="primary" @click="showTable">{{ t('Custom.Deposit.Reselect')
+                }}</button>
+            </view>
+          </view>
+        </view>
+      </view>
+
+      <!-- 步骤3:填写出金信息 -->
+      <view class="box box-step3" v-if="step3">
+        <view class="b-card">
+          <view class="card-top">
+            <!-- 注意事项 -->
+            <view v-if="!isStep3" class="step3-attention">
+              {{ introduce.value }}
+              <view class="tips" v-if="(introduce.introduce || introduce.enIntroduce)">
+                <view>
+                  <rich-text class="attention" :nodes="isZh ? introduce.introduce : introduce.enIntroduce" />
+                </view>
+              </view>
+              <view class="btn-bottom">
+                <text class="btn crm-cursor" @click="isStep3 = true">{{ t('Btn.Confirm') }}</text>
+              </view>
+            </view>
+            <!-- 表单 -->
+            <uni-forms ref="formRef" :model="form" :rules="rules" labelWidth="200" label-position="top" v-show="isStep3"
+              class="base-info-form" validate-trigger="submit">
+              <uni-row class="demo-uni-row uni-row1">
+                <!-- 银行选择(针对有银行列表的通道) -->
+                <uni-col :span="24" v-if="bankDate.length">
+                  <view class="tit">
+                    <text>{{ t('Custom.Withdraw.Title5') }}</text>
+                  </view>
+                </uni-col>
+                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" v-if="bankDate.length">
+                  <uni-forms-item name="bankCode">
+                    <cwg-combox :clearable="false" v-model:value="form.bankCode" :options="bankOptions"
+                      :placeholder="t('placeholder.choose')" @change="selectCode" />
+                  </uni-forms-item>
+                </uni-col>
+
+                <!-- 电子钱包地址输入 -->
+                <uni-col :span="24"
+                  v-if="['CHANNEL_TYPE_WALLET', 'CHANNEL_TYPE_ALI_WALLET'].includes(channelData.type)">
+                  <view class="tit">
+                    <text>{{ getWalletLabel }}</text>
+                  </view>
+                </uni-col>
+                <!-- 电子钱包地址输入 -->
+                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                  v-if="['CHANNEL_TYPE_WALLET', 'CHANNEL_TYPE_ALI_WALLET'].includes(channelData.type)">
+                  <uni-forms-item name="address">
+                    <uni-easyinput :clearable="false" v-model="form.address" :placeholder="t('placeholder.input')" />
+                  </uni-forms-item>
+                </uni-col>
+
+                <!-- 数字货币选择(从已保存地址中选择) -->
+                <template v-if="channelData.type === 'DIGITAL_CURRENCY'">
+                  <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" v-if="channelData.type === 'DIGITAL_CURRENCY'">
+                    <view style="display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap;">
+                      <view class="tit">
+
+                        <text>{{ t('Custom.Withdraw.Title6') }}</text>
+                      </view>
+                      <view class="add-back">
+                        <text>{{
+                          t('blockchain.item10') }}</text>
+                        <text class="add-btn crm-cursor" @click="openAddBankCard('add_bankBlockchain')">
+                          {{ t('Custom.Withdraw.addBank1') }}
+                        </text>
+                      </view>
+                    </view>
+                    <uni-forms-item>
+                      <cwg-combox :clearable="false" v-model:value="myId" :options="digitalOptions"
+                        :placeholder="t('placeholder.choose')" @change="onDigitalCurrencyChange"
+                        :disabled="!ruleForm.bankBlockchain.length" />
+                    </uni-forms-item>
+                  </uni-col>
+                  <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+                    <uni-forms-item :label="t('blockchain.item3')">
+                      <uni-easyinput disabled v-model="form.addressName" />
+                    </uni-forms-item>
+                  </uni-col>
+                  <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+                    <uni-forms-item :label="t('blockchain.item4')">
+                      <uni-easyinput disabled v-model="form.address" />
+                    </uni-forms-item>
+                  </uni-col>
+                  <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" v-if="form.addressProve">
+                    <uni-forms-item :label="t('blockchain.item5')">
+                      <view class="proof">
+                        <template v-if="form.addressProve && (form.addressProve.slice(-3).toLowerCase() === 'pdf')">
+                          <cwg-link type="pdf1" :url="imgUrl + form.addressProve" target="_blank"
+                            class="state crm_state_blue">PDF</cwg-link>
+                        </template>
+                        <image v-else :src="imgUrl + form.addressProve" mode="aspectFit"
+                          style="width: 100rpx; height: 100rpx;" @click="previewImage(imgUrl + form.addressProve)" />
+                      </view>
+                    </uni-forms-item>
+                  </uni-col>
+                  <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+                    <text class="tit"><text class="iconfont iconi"></text>{{ t('Custom.Deposit.Des') }}</text>
+                  </uni-col>
+
+                </template>
+
+                <uni-col :span="24" class="card-tit"
+                  v-if="isStep3 && (channelData.type == 'BANK_TELEGRAPHIC' || channelData.type == 'BANK' || channelData.type == 'CHANNEL_TYPE_CARD')">
+                  <div style="display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap;">
+                    <view class="tit">
+
+                      <text>{{ t('Custom.Withdraw.Title4') }}</text>
+                    </view>
+                    <div class="add-back">
+                      <text v-if="channelData.type == 'BANK_TELEGRAPHIC'">{{
+                        t('Custom.Withdraw.addWire') }}</text>
+                      <text v-if="channelData.type == 'BANK_TELEGRAPHIC'" class="add-btn crm-cursor"
+                        @click="openAddBankCard('add_wireTransfer')">
+                        {{ t('Custom.Withdraw.addBank1') }}
+                      </text>
+                      <text v-if="channelData.type == 'BANK'">{{
+                        t('Custom.Withdraw.addBank')
+                        }}</text>
+                      <text v-if="channelData.type == 'BANK'" class="add-btn crm-cursor"
+                        @click="openAddBankCard('add_bankCard')">
+                        {{ t('Custom.Withdraw.addBank1') }}
+                      </text>
+                      <text v-if="channelData.type == 'CHANNEL_TYPE_CARD'">{{
+                        t('PersonalManagement.Label.addCreditCard') }}</text>
+                      <text v-if="channelData.type == 'CHANNEL_TYPE_CARD'" class="add-btn crm-cursor"
+                        @click="openAddBankCard('add_CreditCard')">
+                        {{ t('Custom.Withdraw.addBank1') }}
+                      </text>
+                    </div>
+                  </div>
+                </uni-col>
+                <!-- 银行卡/信用卡选择 -->
+                <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24"
+                  v-if="['BANK', 'BANK_TELEGRAPHIC', 'CHANNEL_TYPE_CARD'].includes(channelData.type)">
+                  <uni-forms-item>
+                    <cwg-combox :clearable="false" v-model:value="myId" :options="bankCardOptions" @change="chooseBank"
+                      :placeholder="t('placeholder.choose')" />
+                  </uni-forms-item>
+                </uni-col>
+                <!-- 通用银行信息展示 -->
+                <template v-if="channelData.type == 'BANK'">
+                  <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+                    <uni-forms-item :label="t('Custom.Withdraw.UserName')">
+                      <uni-easyinput disabled v-model="form.bankUname" />
+                    </uni-forms-item>
+                  </uni-col>
+                  <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+                    <uni-forms-item :label="t('Custom.Withdraw.BankCardNum')">
+                      <uni-easyinput disabled v-model="form.bankCardNum" />
+                    </uni-forms-item>
+                  </uni-col>
+                  <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+                    <uni-forms-item :label="t('Custom.Withdraw.BankName')">
+                      <uni-easyinput disabled v-model="form.bankName" />
+                    </uni-forms-item>
+                  </uni-col>
+                  <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+                    <uni-forms-item :label="t('Custom.Withdraw.bankBranchName')">
+                      <uni-easyinput disabled v-model="form.bankBranchName" />
+                    </uni-forms-item>
+                  </uni-col>
+                </template>
+                <!-- 信用卡信息展示(针对有信用卡列表的通道) -->
+                <template v-if="channelData.type == 'CHANNEL_TYPE_CARD'">
+                  <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+                    <uni-forms-item :label="t('PersonalManagement.Label.CreditCardAccountName')">
+                      <uni-easyinput disabled v-model="form.bankUname" />
+                    </uni-forms-item>
+                  </uni-col>
+                  <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+                    <uni-forms-item :label="t('PersonalManagement.Label.CreditCardAccount')">
+                      <uni-easyinput disabled v-model="form.bankCardNum" />
+                    </uni-forms-item>
+                  </uni-col>
+                  <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+                    <uni-forms-item label="CVV">
+                      <uni-easyinput disabled v-model="form.cvv" />
+                    </uni-forms-item>
+                  </uni-col>
+                  <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+                    <uni-forms-item :label="t('PersonalManagement.Label.ExpirationYear')">
+                      <uni-easyinput disabled v-model="form.expiryYearMonth" />
+                    </uni-forms-item>
+                  </uni-col>
+                </template>
+                <!-- 银行电汇转账信息展示(针对有银行转账列表的通道) -->
+                <template v-if="channelData.type == 'BANK_TELEGRAPHIC'">
+                  <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+                    <uni-forms-item :label="t('Custom.Withdraw.UserName')">
+                      <uni-easyinput disabled v-model="form.bankUname" />
+                    </uni-forms-item>
+                  </uni-col>
+                  <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+                    <uni-forms-item :label="t('Custom.Withdraw.BankCardNum')">
+                      <uni-easyinput disabled v-model="form.bankCardNum" />
+                    </uni-forms-item>
+                  </uni-col>
+                  <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+                    <uni-forms-item :label="t('Custom.Withdraw.BankName')">
+                      <uni-easyinput disabled v-model="form.bankName" />
+                    </uni-forms-item>
+                  </uni-col>
+                  <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+                    <uni-forms-item :label="t('Custom.Withdraw.swiftCode')">
+                      <uni-easyinput disabled v-model="form.swiftCode" />
+                    </uni-forms-item>
+                  </uni-col>
+                  <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+                    <uni-forms-item :label="t('Custom.Withdraw.bankCode')">
+                      <uni-easyinput disabled v-model="form.customBankCode" />
+                    </uni-forms-item>
+                  </uni-col>
+                  <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+                    <uni-forms-item :label="t('Custom.Withdraw.bankAddr')">
+                      <uni-easyinput disabled v-model="form.bankAddr" />
+                    </uni-forms-item>
+                  </uni-col>
+                  <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+                    <uni-forms-item label="Account Agency NO" name="agencyNo"
+                      v-if="channelData.code == 'PAY_RETAILER_REMIT_PAY_KEY_BRW'">
+                      <uni-easyinput v-model="form.agencyNo" />
+                    </uni-forms-item>
+                    <uni-forms-item label="Account Agency NO" v-else>
+                      <uni-easyinput v-model="form.agencyNo" />
+                    </uni-forms-item>
+                  </uni-col>
+                  <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                    v-if="channelData.code == 'PAY_RETAILER_REMIT_PAY_KEY_BRW'">
+                    <uni-forms-item label="CPF" name="cpf">
+                      <uni-easyinput v-model="form.cpf" />
+                    </uni-forms-item>
+                  </uni-col>
+                </template>
+                <!-- 出金金额 -->
+                <uni-col :span="24" v-if="channelData.type == 'BANK_TELEGRAPHIC' && isStep3">
+                  <view class="tit">
+                    <text>{{ t('Custom.Withdraw.Title3') }}</text>
+                  </view>
+                </uni-col>
+                <uni-col :span="24" v-if="channelData.type != 'BANK_TELEGRAPHIC' && isStep3">
+                  <view class="tit">
+                    <text>{{ t('Custom.Withdraw.Title3') + '(' + channelData.currency + ')'
+                      }}</text>
+                  </view>
+                </uni-col>
+                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" v-if="channelData.type !== 'BANK_TELEGRAPHIC'">
+                  <uni-forms-item name="amount" :error-message="amountErrorMessage">
+                    <uni-easyinput v-model="form.amount" type="number" @blur="validateAmount" />
+                  </uni-forms-item>
+                </uni-col>
+                <template v-else>
+                  <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+                    <uni-forms-item :label="t('Custom.Withdraw.CurrencyType')">
+                      <cwg-combox :clearable="false" v-model:value="form.currency"
+                        :options="[{ text: 'USD', value: 'USD' }]" @change="(val) => form.currency = val" />
+                    </uni-forms-item>
+                  </uni-col>
+                  <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
+                    <uni-forms-item :label="t('Custom.Withdraw.amount')" name="amount"
+                      :error-message="amountErrorMessage">
+                      <uni-easyinput v-model="form.amount" type="number" @blur="validateAmount" />
+                    </uni-forms-item>
+                  </uni-col>
+                </template>
+              </uni-row>
+              <!-- 协议同意 -->
+              <view class="agree">
+                <uni-forms-item name="agree2">
+                  <checkbox-group :value="form.agree2 ? ['1'] : []" @change="onAgree2Change">
+                    <label class="checkbox">
+                      <checkbox value="1" :checked="form.agree2" />
+                      <text class="crm-cursor" style="text-decoration: underline;"
+                        @click.stop="dialogCheckTip = true">{{
+                          t('Custom.Withdraw.Des') }}</text>
+                    </label>
+                  </checkbox-group>
+                </uni-forms-item>
+              </view>
+              <view class="agree" v-if="dialogTipsIsShow">
+                <uni-forms-item name="agree3">
+                  <checkbox-group :value="form.agree3 ? ['1'] : []" @change="onAgree3Change">
+                    <label class="checkbox">
+                      <checkbox value="1" :checked="form.agree3" />
+                      <text>* {{ t('Custom.Withdraw.item1') }}<br>{{ t('Custom.Withdraw.item1_1') }}<br>{{
+                        t('Custom.Withdraw.item1_2') }}</text>
+                    </label>
+                  </checkbox-group>
+                </uni-forms-item>
+              </view>
+              <button class="s-btn" type="primary" @click="openTips">{{ t('Btn.Submit') }}</button>
+            </uni-forms>
+          </view>
+        </view>
+      </view>
+      <!-- 提示弹窗 -->
+      <cwg-tips-popup v-model:visible="dialogTips" content="Custom.Withdraw.item2" @confirm="closeTipsConfirm" />
+      <!-- 弹窗:确认信息 -->
+      <cwg-check-confirm-popup v-model:visible="dialogCheckConfirm" :title="t('Home.page_customer.item3')"
+        :channelData="channelData" :code="code" :selectCodes="selectCodes" :params="form" :FreeNumber="FreeNumber"
+        :userName="userName" :dialogCheckConfirm_form="dialogCheckConfirm_form" :login="loginValue"
+        :loginDoc="loginValueDoc" @confirm="submit" />
+      <!-- 协议弹窗 -->
+      <cwg-tips-popup v-model:visible="dialogCheckTip"
+        :introduce="isZh ? introduce.introduce : introduce.enIntroduce" />
+      <!-- 等待弹窗 -->
+      <cwg-wait-popup v-model:visible="dialogCheckWait" type="center" :mask-click="false" :showFooters="false" />
+      <!-- 最后失败弹窗 -->
+      <cwg-error-popup v-model:visible="dialogError" @confirm="closeDia" :responseMessage="RES" />
+      <!-- 最后成功弹窗 -->
+      <cwg-success-popup v-model:visible="dialogSuccess" @confirm="closeDia" />
+      <!-- kyc成功弹窗 -->
+      <cwg-kyc-popup v-model:visible="dialogKyc" :qrText="text1" />
+      <!--验证码-->
+      <cwg-email-code-popup v-model:visible="dialogDealResult" @confirm="submitCode" :api="emailCodeApi" />
+      <!-- 新增银行弹窗 -->
+      <add-bank-dialog ref="addBankDialogRef" @success="addSuccess" />
+    </view>
+  </cwg-page-wrapper>
+
+</template>
+
+<script setup>
+import { ref, reactive, computed, onMounted, nextTick, watch, getCurrentInstance } from 'vue'
+import { onLoad } from '@dcloudio/uni-app'
+import { showToast } from "@/utils/toast";
+import { isAfterJuly28 } from '@/utils/dateUtils'
+// import Drawer from "@/views/global/Drawer"
+import { customApi } from "@/service/custom"
+import { financialApi } from "@/service/financial"
+import { activityApi } from "@/service/activity"
+import Config from "@/config/index"
+import Decimal from "decimal.js"
+import QrCode from "@/components/QRCode.vue"
+// import logoImage from "@/assets/images/MTBG.jpg"
+import AddBankDialog from '@/components/AddBankDialog.vue';
+import PaymentMethodsList from './components/PaymentMethodsList.vue'
+import CwgCheckConfirmPopup from './components/WithdrawCheckConfirmPopup.vue'
+import CwgKycPopup from './components/KycPopup.vue'
+let { Code, Host80 } = Config
+import { useI18n } from 'vue-i18n'
+const { t, locale } = useI18n()
+
+const isZh = computed(() => ['cn', 'zhHant'].includes(locale.value))
+// 获取组件实例,用于访问全局挂载的属性和方法(替代 this)
+const { proxy } = getCurrentInstance()
+
+// -------------------- data --------------------
+const loginValue = ref("")
+const loginValueDoc = ref("")
+const hiddenSelect = ref(false)
+const metaInfo = ref(null)
+const text1 = ref("")
+// const logoImageRef = logoImage 
+const dialogCheck1 = ref(false)
+const flag = ref(false)
+const RES = ref("")
+//银行
+const openType = ref("") //弹出类别
+const dialogInfoTradingAdd = ref(false) //新增
+const ruleForm = reactive({
+  bankInfo: [], //银行信息
+  bankWrit: [], //电汇信息
+  xykInfo: [], //信用卡信息
+  bankBlockchain: [], //区块链
+})
+
+const imgUrl = Host80 //图片地址
+const loginOptions = ref([])
+const value = ref("") //账号
+const code = ref("") //通道code
+const bankValid = ref("") //通道是否有银行
+const requestUrl = ref("") //通道地址
+const isStep3 = ref(false)
+const step2 = ref(false)
+const step3 = ref(false)
+const dialogCheckTip = ref(false)
+
+const isChannel = ref(true)
+const pictLoading = ref(false)
+const tableData = reactive({
+
+  Digital_Currency: [],
+  China_UnionPay: [],
+  Electronic_Wallet: [],
+  International_Transfer: [],
+  CHANNEL_TYPE_CARD: [],
+  CHANNEL_TYPE_ALI_WALLET: [],
+  Ucard_Wallet: [],
+})
+//通道table-选择前后
+const activeTab = ref(1)
+// 🔥 自动过滤掉空数据的 tab
+const tabsConfig = computed(() => {
+
+  const allTabs = [
+    { text: t('Custom.Deposit.Channel3'), value: 1, type: 'Digital_Currency' },
+    { text: t('Custom.Deposit.Channel2'), value: 2, type: 'China_UnionPay' },
+    { text: t('Custom.Deposit.Channel4'), value: 3, type: 'Electronic_Wallet' },
+    { text: t('Custom.Deposit.Channel1'), value: 4, type: 'International_Transfer' },
+    { text: t('PersonalManagement.Label.CreditCard'), value: 5, type: 'CHANNEL_TYPE_CARD' },
+    { text: t('card.title'), value: 6, type: 'Ucard_Wallet' },
+    { text: t('Label.Ali'), value: 7, type: 'CHANNEL_TYPE_ALI_WALLET' },
+  ]
+  // ✅ 只保留有数据的 tab
+  return allTabs.filter(tab => {
+    console.log(tableData[tab.type], tab.type);
+    return tableData[tab.type]?.length > 0
+  })
+})
+// 当前选中的 tab 项
+const currentTab = computed(() => tabsConfig.value.find(t => t.value === activeTab.value))
+
+// 当前要渲染的表格数据
+const currentTableData = computed(() => {
+  const type = currentTab.value?.type
+  return type ? tableData[type] || [] : []
+})
+// ✅ 监听 tab 变化,自动选中第一个有数据的 tab
+watch(
+  tabsConfig,
+  (newTabs) => {
+    if (newTabs.length > 0) {
+      activeTab.value = newTabs[0].value // 选中第一个
+    }
+  },
+  { immediate: true }
+)
+const bankDate = ref([]) //通道下的银行列表
+const channelData = ref({}) //当前选择的通道信息
+const WireTransferAccount = ref({}) //银行电汇信息
+//表单
+const form = reactive({
+  currency: "USD",
+  amount: "",
+  amount1: "",
+  bankCode: '',           // 银行代码(普通银行通道选择)
+  address: '',           // 电子钱包地址 / 数字货币地址(输入/展示)
+  addressName: '',       // 数字货币地址名称(展示)
+  addressProve: '',      // 数字货币地址证明文件路径(仅展示))
+  bankUname: '',         // 持卡人姓名
+  bankCardNum: '',       // 银行卡号
+  bankName: '',          // 银行名称
+  bankBranchName: '',    // 支行名称
+  swiftCode: '',         // SWIFT代码
+  customBankCode: '',    // 自定义银行代码
+  bankAddr: '',          // 银行地址
+  agencyNo: '',          // 代理机构编号(电汇专用,可编辑)
+  cpf: '',               // CPF号码(电汇专用,可编辑)
+  cvv: '',               // CVV码(电汇专用,可编辑)
+  expiryYearMonth: '',   // 过期年(电汇专用,可编辑)
+  agree2: false,         // 协议勾选2
+  agree3: false          // 协议勾选3(当dialogTipsIsShow为true时显示)
+})
+const formRef = ref(null)
+const resetForm = () => {
+  //表单重置后,需要手动重置一些状态
+  form.amount = ""
+  form.amount1 = ""
+  form.bankCode = ""
+  form.address = ""
+  form.addressName = ""
+  form.addressProve = ""
+  form.bankUname = ""
+  form.bankCardNum = ""
+  form.swiftCode = ""
+  form.customBankCode = ""
+  form.bankAddr = ""
+  form.agencyNo = ""
+  form.bankName = ""
+  form.cpf = ""
+  form.bankBranchName = ""
+  form.cpf = ""
+  form.cvv = ""
+  form.expiryYearMonth = ""
+  form.agree2 = false
+  form.agree3 = false
+  amountErrorMessage.value = ""
+}
+//数量区间
+const mAmount = reactive({
+  minAmount: "",
+  maxAmount: "",
+})
+const introduce = reactive({
+  introduce: "",
+  enIntroduce: "",
+})
+
+//银行列表
+const bankInfoList = ref([])
+const bank = ref("")
+const myId = ref(null) //银行列表id
+const bankPayType = ref("") //临时放置通道code
+
+//银联/数字货币
+const step3_bank_cur = ref("")
+
+const agree2 = ref(false) //条款
+//数字表单
+const form1 = ref({})
+
+const dialogCheck = ref(false)
+const dialogKyc = ref(false)
+const dialogVisible = ref(false)
+const dialogCheckWait = ref(false)
+
+//新建银行弹窗
+const dialogNewBank = ref(false)
+const params = reactive({
+  bankCardNum: "",
+  bankUname: "",
+  bankName: "",
+  bankBranchName: "",
+  bankAddr: "",
+  swiftCode: "",
+  bankFront: "",
+  bankBack: "",
+  defaultBank: false,
+})
+
+const dialogDealResult = ref(false)
+const emailCodeApi = ref(financialApi.withdrawCode)
+
+const dialogDealResult_form = reactive({
+  emailCode: "", //数字货币出金,验证码
+})
+
+const dialogTips = ref(false) //提交时的确认弹窗
+const dialogTipsIsShow = ref(true) //提交时的确认弹窗-是否显示
+
+const dialogFreeNumber = ref(false) //可减免手续费用次数弹窗
+const FreeNumber = ref(0)
+
+const dialogCheckConfirm = ref(false)
+const dialogCheckConfirm_form = reactive({
+  amount: "",
+  feeAmount: "",
+})
+
+const tableDataNewYear24Flag = ref(false) //24新年庆典
+const tableDataNewYear24 = ref(false) //24新年庆典
+const NewYear24Data = reactive({
+  balance: 0,
+  income: 0,
+  rate: 0,
+})
+const rules = computed(() => ({
+  myId: {
+    rules: [
+      {
+        required: true,
+        errorMessage: t('vaildate.select.empty'),
+        trigger: 'change',
+      },
+    ],
+  },
+  bankUname: {
+    rules: [
+      {
+        required: true,
+        errorMessage: t('vaildate.select.empty'),
+        trigger: 'change',
+      },
+    ],
+  },
+  bankCode: {
+    rules: [
+      {
+        required: true,
+        errorMessage: t('vaildate.select.empty'),
+        trigger: 'change',
+      },
+    ],
+  },
+  address: {
+    rules: [
+      {
+        required: true,
+        errorMessage: t('vaildate.input.empty'),
+        trigger: 'blur',
+      },
+    ],
+  },
+  amount: {
+    rules: [
+      {
+        required: true,
+        errorMessage: t('vaildate.amount.format'),
+      },
+      {
+        validateFunction: (rule, value, data, callback) => {
+          if (
+            !!value &&
+            (mAmount.minAmount > value || mAmount.maxAmount < value)
+          ) {
+            callback(
+              t('vaildate.amount.amount') +
+              mAmount.minAmount +
+              ' - ' +
+              mAmount.maxAmount
+            );
+            return false;
+          }
+          if (/^[0-9]+([.]{1}[0-9]{1,2})?$/.test(value)) {
+            return true;
+          } else {
+            callback(t('vaildate.amount.format'));
+            return false;
+          }
+        },
+        trigger: 'blur',
+      },
+    ],
+  },
+  agree2: {
+    rules: [
+      {
+        validateFunction: (rule, value, data, callback) => {
+          if (form.agree2) {
+            return true;
+          } else {
+            callback(t('vaildate.agree.empty'));
+            return false;
+          }
+        },
+        trigger: 'change',
+      },
+    ],
+  },
+  agree3: {
+    rules: [
+      {
+        validateFunction: (rule, value, data, callback) => {
+
+          if (form.agree3) {
+            return true;
+          } else {
+            callback(t('vaildate.agree.empty'));
+            return false;
+          }
+        },
+        trigger: 'change',
+      },
+    ],
+  },
+  agencyNo: {
+    rules: [
+      {
+        required: true,
+        errorMessage: t('vaildate.input.empty'),
+        trigger: 'blur',
+      },
+    ],
+  },
+  cpf: {
+    rules: [
+      {
+        required: true,
+        errorMessage: t('vaildate.input.empty'),
+        trigger: 'blur',
+      },
+    ],
+  },
+  emailCode: {
+    rules: [
+      {
+        required: true,
+        errorMessage: t('vaildate.code.empty'),
+        trigger: 'blur',
+      },
+    ],
+  },
+}));
+// 验证金额
+const amountErrorMessage = ref('')
+const validateAmount = () => {
+  const amount = form.amount
+  if (!amount && amount !== 0) {
+    amountErrorMessage.value = t('vaildate.amount.format')
+    return false
+  }
+  if (mAmount.minAmount && mAmount.maxAmount) {
+    const min = Number(mAmount.minAmount);
+    const max = Number(mAmount.maxAmount);
+    const numValue = Number(amount);
+    if (numValue < min || numValue > max) {
+      amountErrorMessage.value = t('vaildate.amount.amount') + min + '-' + max
+      return false
+    }
+  }
+  if (!/^[0-9]+([.]{1}[0-9]{1,2})?$/.test(amount)) {
+    amountErrorMessage.value = t('vaildate.amount.format')
+    return false
+  }
+  amountErrorMessage.value = ''
+  return true
+}
+// 分组标题映射
+const groupTitleMap = {
+  'Ucard_Wallet': 'card.title',
+  'Digital_Currency': 'Custom.Deposit.Channel3',
+  'China_UnionPay': 'Custom.Deposit.Channel2',
+  'Electronic_Wallet': 'Custom.Deposit.Channel4',
+  'International_Transfer': 'Custom.Deposit.Channel1',
+  'CHANNEL_TYPE_CARD': 'PersonalManagement.Label.CreditCard',
+  'CHANNEL_TYPE_ALI_WALLET': 'Label.Ali'
+}
+// -------------------- computed --------------------
+const getWalletLabel = computed(() => {
+  if (channelData.value.type === 'CHANNEL_TYPE_WALLET') return t('Custom.Withdraw.Title7')
+  if (channelData.value.type === 'UCARD_WALLET') return t('card.title')
+  if (channelData.value.type === 'CHANNEL_TYPE_ALI_WALLET') return t('Label.AliAccout')
+  return ''
+})
+// 最后确认
+const dialogSuccess = computed(() => dialogCheck.value && dialogVisible.value)
+// 最后失败
+const dialogError = computed(() => dialogCheck.value && !dialogVisible.value)
+const loginComboxOptions = computed(() => {
+  return loginOptions.value.map((item, index) => ({
+    text: item.label,
+    value: item.login
+  }))
+})
+
+const bankOptions = computed(() => {
+  return bankDate.value.map((item, index) => ({
+    text: isZh.value ? item.name : item.enName,
+    value: item.code
+  }))
+})
+
+const digitalOptions = computed(() => {
+  return ruleForm.bankBlockchain.map((item, index) => ({
+    text: `${item.addressName}-${item.address}`,
+    value: item.id,
+    disable: item.authStatus == 0,
+  }))
+})
+
+const bankCardOptions = computed(() => {
+  return bankList.value.map((item, index) => ({
+    text: getBankLabel(item),
+    value: item.id
+  }))
+})
+const getBankLabel = (item) => {
+  if (channelData.value.type === 'BANK' || channelData.value.type === 'BANK_TELEGRAPHIC') {
+    return `${item.bankName}-${item.bankCardNum}`
+  } else if (channelData.value.type === 'CHANNEL_TYPE_CARD') {
+    return item.bankCardNum
+  }
+  return ''
+}
+const bankList = computed(() => {
+  if (channelData.value.type === 'BANK') return ruleForm.bankInfo
+  if (channelData.value.type === 'BANK_TELEGRAPHIC') return ruleForm.bankWrit
+  if (channelData.value.type === 'CHANNEL_TYPE_CARD') return ruleForm.xykInfo
+  if (channelData.value.type === 'DIGITAL_CURRENCY') return ruleForm.bankBlockchain
+  return []
+})
+const isFree = computed(() => {
+  let flag = false;
+  let startTime1 = "2024/11/01 00:00:00";
+
+  let timezone = 2; //目标时区时间,东3区   东时区正数 西市区负数
+  let offset_GMT = new Date().getTimezoneOffset(); // 本地时间和格林威治的时间差,单位为分钟
+  let nowDate = new Date().getTime(); // 本地时间距 1970 年 1 月 1 日午夜(GMT 时间)之间的毫秒数
+
+  let now = new Date(
+    nowDate + offset_GMT * 60 * 1000 + timezone * 60 * 60 * 1000
+  ).getTime();
+  let start = new Date(startTime1).getTime();
+
+  if (now > start) {
+    flag = true;
+  }
+  return flag;
+})
+
+// -------------------- methods --------------------
+const groupCurrency = (type) => {
+  const symbol = { GBP: '£', USD: '$', EUR: '€', USC: '¢' }[type] || '$'
+  return `: ${symbol}`
+}
+const groupCurrency1 = (type) => {
+  const symbol = { GBP: '£', USD: '$', EUR: '€', USC: '¢' }[type] || '$'
+  return `${symbol}`
+}
+
+function groupTypeName(type) {
+  if (type == "1") {
+    return t("AccountType.ClassicAccount");
+  } else if (type == "2") {
+    return t("AccountType.SeniorAccount");
+  } else if (type == "3") {
+    return isAfterJuly28() ? "--" : t("AccountType.AgencyAccount");
+  } else if (type == "5") {
+    return t("AccountType.SpeedAccount");
+  } else if (type == "6") {
+    return t("AccountType.SpeedAccount");
+  } else if (type == "7") {
+    return t("AccountType.StandardAccount");
+  } else if (type == "8") {
+    return t("AccountType.CentAccount");
+  }
+}
+//回显
+const onAgree3Change = (e) => {
+  form.agree3 = e.detail.value.length > 0
+}
+const onAgree2Change = (e) => {
+  form.agree2 = e.detail.value.length > 0
+}
+function selectChange() {
+  // proxy.$forceUpdate();
+}
+//新增
+// function openAddBankCard(type) {
+//   if (type == "add_bankCard") {
+//     if (ruleForm.bankInfo.length == 2) {
+//       proxy.$pigeon.MessageConfirm(
+//         t("Msg.UnionPayCARDS"),
+//         t("Msg.SystemPrompt"),
+//         t("Btn.Confirm"),
+//         t("Btn.Cancel"),
+//         async function () { },
+//         function () { }
+//       );
+//     } else {
+//       openType.value = "add_bankCard";
+//       dialogInfoTradingAdd.value = true;
+//     }
+//   } else if (type == "add_wireTransfer") {
+//     if (ruleForm.bankWrit.length == 2) {
+//       proxy.$pigeon.MessageConfirm(
+//         t("Msg.WireTransfers"),
+//         t("Msg.SystemPrompt"),
+//         t("Btn.Confirm"),
+//         t("Btn.Cancel"),
+//         async function () { },
+//         function () { }
+//       );
+//     } else {
+//       openType.value = "add_wireTransfer";
+//       dialogInfoTradingAdd.value = true;
+//     }
+//   } else if (type == "add_CreditCard") {
+//     openType.value = "add_CreditCard";
+//     dialogInfoTradingAdd.value = true;
+//   } else if (type == "add_bankBlockchain") {
+//     if (ruleForm.bankBlockchain.length == 2) {
+//       proxy.$pigeon.MessageConfirm(
+//         t("blockchain.item9"),
+//         t("Msg.SystemPrompt"),
+//         t("Btn.Confirm"),
+//         t("Btn.Cancel"),
+//         async function () { },
+//         function () { }
+//       );
+//     } else {
+//       openType.value = "add_bankBlockchain";
+//       dialogInfoTradingAdd.value = true;
+//     }
+//   }
+// }
+// 新增银行信息
+const addBankDialogRef = ref(null);
+function openAddBankCard(type) {
+  console.log(type, 121212)
+  switch (type) {
+    case 'add_bankBlockchain':
+      openAddCrypto()
+      break;
+    case 'add_bankCard':
+      openAddUnionpay()
+      break;
+    case 'add_wireTransfer':
+      openAddBank()
+      break;
+    case 'add_CreditCard':
+      openAddCredit()
+      break;
+  }
+}
+function openAddCrypto() {
+  const wallets = bankCardOptions.value || []
+  // 1️⃣ 没有钱包
+  if (wallets.length === 0) {
+    addBankDialogRef.value?.open(4);
+    return;
+  }
+  // 2️⃣ 是否存在未认证钱包
+  const hasUnAuth = wallets.some(
+    item => item.authStatus === 0 || item.approveStatus === 1
+  );
+  if (hasUnAuth) {
+    uni.showToast({
+      title: "加密钱包未认证",
+      icon: "none"
+    });
+    return;
+  }
+  // 3️⃣ 是否达到上限
+  if (wallets.length >= 2) {
+    uni.showToast({
+      title: t('blockchain.item9'),
+      icon: "none"
+    });
+    return;
+  }
+  // 4️⃣ 正常打开
+  addBankDialogRef.value?.open(4);
+}
+function openAddUnionpay() {
+  const wallets = bankCardOptions.value || []
+  if (wallets.length === 0) {
+    addBankDialogRef.value?.open(1);
+    return;
+  }
+  if (wallets.length >= 2) {
+    uni.showToast({
+      title: t('Msg.UnionPayCARDS'),
+      icon: "none"
+    });
+    return;
+  }
+  addBankDialogRef.value?.open(1);
+}
+function openAddBank() {
+  const wallets = bankCardOptions.value || []
+  if (wallets.length === 0) {
+    addBankDialogRef.value?.open(2);
+    return;
+  }
+  if (wallets.length >= 2) {
+    uni.showToast({
+      title: t('Msg.WireTransfers'),
+      icon: "none"
+    });
+    return;
+  }
+  addBankDialogRef.value?.open(2);
+}
+function openAddCredit() {
+  const wallets = bankCardOptions.value || []
+  if (wallets.length === 0) {
+    addBankDialogRef.value?.open(3);
+    return;
+  }
+  addBankDialogRef.value?.open(3);
+}
+// 新增银行信息成功回调
+const addSuccess = (e) => {
+  getBankInfo();
+}
+function closeDiaAdd() {
+  dialogInfoTradingAdd.value = false;
+}
+function closeAdd(val) {
+  dialogInfoTradingAdd.value = val;
+}
+function confirmToReload() {
+  dialogInfoTradingAdd.value = false;
+  getBankInfo();
+}
+const getBankInfo = async () => {
+  const res = await financialApi.customBankList({})
+  if (res.code === Code.StatusOK) {
+    ruleForm.bankInfo = []
+    ruleForm.bankWrit = []
+    ruleForm.xykInfo = []
+    ruleForm.bankBlockchain = []
+    res.data.forEach(item => {
+      item.customBankCode = item.bankCode
+      item.bankCode = null
+      if (item.type === 1) ruleForm.bankInfo.push(item)
+      else if (item.type === 2) ruleForm.bankWrit.push(item)
+      else if (item.type === 3) {
+        item.expiryYearMonth = `${item.expiryYear}/${item.expiryMonth}`
+        ruleForm.xykInfo.push(item)
+      } else if (item.type === 4) ruleForm.bankBlockchain.push(item)
+    })
+    // 如果有默认选中
+    const findDefault = (list, type) => list.find(b => b.defaultBank && b.type === type)
+
+
+    const defaultBank = findDefault(ruleForm.bankInfo, 1)
+    const defaultWire = findDefault(ruleForm.bankWrit, 2)
+    const defaultCard = findDefault(ruleForm.xykInfo, 3)
+    const defaultDigital = findDefault(ruleForm.bankBlockchain, 4)
+    if (channelData.value.type === 'BANK' && defaultBank) selectBankCard(defaultBank)
+    if (channelData.value.type === 'BANK_TELEGRAPHIC' && defaultWire) selectBankCard(defaultWire)
+    if (channelData.value.type === 'CHANNEL_TYPE_CARD' && defaultCard) selectBankCard(defaultCard)
+    if (channelData.value.type === 'DIGITAL_CURRENCY' && defaultDigital && defaultDigital.authStatus === 1) selectDigital(defaultDigital)
+  } else {
+    uni.showToast({ title: res.msg, icon: 'none' })
+  }
+}
+
+const selectBankCard = (item) => {
+  const index = bankList.value.findIndex(b => b.id === item.id)
+  if (index !== -1) {
+    myId.value = item.id
+    nextTick(() => {
+      Object.assign(form, item)
+    })
+
+
+  }
+}
+
+const selectDigital = (item) => {
+  const index = ruleForm.bankBlockchain.findIndex(b => b.id === item.id)
+  if (index !== -1) {
+    selectedDigitalIndex.value = item.id
+    form.addressName = item.addressName
+    form.address = item.address
+    form.addressProve = item.addressProve
+  }
+}
+const onDigitalCurrencyChange = (val) => {
+  const item = ruleForm.bankBlockchain.find(b => b.id === val)
+  chooseBank(item.id)
+}
+
+function chooseBank(id) {
+  const item = bankList.value.find(b => b.id === id)
+  if (channelData.value.type == "DIGITAL_CURRENCY") {
+    if (item.authStatus == 0) {
+      showToast(t("Msg.item11"));
+      return;
+    }
+  }
+
+  let codeTmp = "";
+  if (form.bankCode) {
+    codeTmp = form.bankCode;
+  }
+  Object.assign(form, item);
+  form.agree2 = false;
+  form.agree3 = false;
+  if (channelData.value.type == "BANK_TELEGRAPHIC") {
+    form.currency = "USD";
+    if (codeTmp) {
+      form.bankCode = codeTmp;
+    }
+  }
+}
+
+function selectCode(codeVal) {
+  bankDate.value.forEach((item) => {
+    if (item.code == codeVal) {
+      // item.rate = 1
+      // mAmount.minAmount = item.minAmount || mAmount.minAmount;
+      // mAmount.maxAmount = item.maxAmount || mAmount.maxAmount;
+      channelData.value.rate = item.rate || channelData.value.rate;
+      channelData.value.transformCurrency =
+        item.currency || channelData.value.transformCurrency;
+      channelData.value.feeTypeBank = item.feeType || null;
+      channelData.value.freeBank = item.free || 0;
+      channelData.value.feeAmountBank = item.feeAmount || null;
+    }
+  });
+}
+
+//关闭提交后的弹出框
+function closeDia() {
+  resetForm()
+  isStep3.value = false;
+  step2.value = false;
+  showTable();
+  loginValue.value = "";
+  dialogCheck.value = false;
+  dialogVisible.value = false;
+
+}
+
+//取消
+function cancelCode() {
+  dialogDealResult.value = false;
+}
+
+//提交前弹窗确认
+async function openTips() {
+  if (channelData.value.type == "BANK_TELEGRAPHIC" && !myId.value) {
+    showToast(t("vaildate.withdrawBank.empty"));
+    return;
+  }
+  if (channelData.value.type == "BANK" && !myId.value) {
+    showToast(t("vaildate.withdrawBank.empty"));
+    return;
+  }
+  if (channelData.value.type == "CHANNEL_TYPE_CARD" && !myId.value) {
+    showToast(t("vaildate.withdrawBank.empty"));
+    return;
+  }
+  if (channelData.value.type == "DIGITAL_CURRENCY" && !myId.value) {
+    showToast(t("blockchain.item11"));
+    return;
+  }
+  try {
+    if (formRef.value) {
+      const valid = await formRef.value.validate()
+      console.log(valid, 1212);
+
+      if (dialogTipsIsShow.value) {
+        dialogTips.value = true;
+      } else {
+        submit("form");
+      }
+    }
+  } catch (error) {
+    if (error instanceof Array) {
+      showToast(error[0].errorMessage);
+      return
+    } else {
+      RES.value = error.msg;
+    }
+  }
+}
+// 提示同意提交出金
+function closeTipsConfirm() {
+  if (isFree.value) {
+    dialogTips.value = false;
+    if (channelData.value.feeTypeBank) {
+      if (channelData.value.feeTypeBank == 1) {
+        dialogCheckConfirm_form.feeAmount =
+          Number(form.amount || 0) *
+          (Number(channelData.value.freeBank || 0) / 100);
+      } else if (channelData.value.feeTypeBank == 2) {
+        dialogCheckConfirm_form.feeAmount = Number(
+          channelData.value.feeAmountBank || 0
+        );
+      }
+    } else {
+      if (channelData.value.feeType == 1) {
+        dialogCheckConfirm_form.feeAmount =
+          Number(form.amount || 0) *
+          (Number(channelData.value.free || 0) / 100);
+      } else if (channelData.value.feeType == 2) {
+        dialogCheckConfirm_form.feeAmount = Number(
+          channelData.value.feeAmount || 0
+        );
+      }
+    }
+
+    if (FreeNumber.value > 0) {
+      dialogCheckConfirm_form.amount = new Decimal(
+        Number(form.amount || 0)
+      )
+        .mul(new Decimal(Number(channelData.value.rate || 0)))
+        .toNumber();
+    } else {
+      dialogCheckConfirm_form.amount = new Decimal(
+        Number(form.amount || 0)
+      )
+        .sub(
+          new Decimal(Number(dialogCheckConfirm_form.feeAmount || 0))
+        )
+        .mul(new Decimal(Number(channelData.value.rate || 0)))
+        .toNumber();
+    }
+    if (
+      ["CNY", "THB", "VND"].indexOf(channelData.value.transformCurrency) > -1
+    ) {
+      dialogCheckConfirm_form.feeAmount = parseInt(
+        dialogCheckConfirm_form.feeAmount
+      );
+      dialogCheckConfirm_form.amount = parseInt(
+        dialogCheckConfirm_form.amount
+      );
+    }
+    dialogCheckConfirm.value = true;
+  } else {
+    dialogTips.value = false;
+    submit("form");
+  }
+}
+
+function getMetaInfo() {
+  metaInfo.value = window.getMetaInfo();
+  metaInfo.value = { ...metaInfo.value, deviceType: "h5" };
+}
+
+async function qrCode(serial) {
+  // if (getInfoStatus.kycType == 3) {
+  //   getMetaInfo();
+  // }
+  getMetaInfo()
+  let res = await customApi.getWebsdkLink({
+    serial,
+    metaInfo: metaInfo.value,
+  });
+  if (res.code == Code.StatusOK) {
+    text1.value = JSON.parse(res.data).url;
+    dialogKyc.value = true;
+    flag.value = false;
+  } else {
+    flag.value = false;
+  }
+}
+const submitCode = async (code) => {
+  if (channelData.value.type == "DIGITAL_CURRENCY") {
+    dialogDealResult_form.emailCode = code;
+    submit("form");
+  }
+}
+
+//提交
+async function submit(formName) {
+  if (channelData.value.type == "BANK_TELEGRAPHIC" && !myId.value) {
+    showToast(t("vaildate.withdrawBank.empty"));
+    return;
+  }
+  if (channelData.value.type == "BANK" && !myId.value) {
+    showToast(t("vaildate.withdrawBank.empty"));
+    return;
+  }
+  if (channelData.value.type == "CHANNEL_TYPE_CARD" && !myId.value) {
+    showToast(t("vaildate.withdrawBank.empty"));
+    return;
+  }
+  if (channelData.value.type == "DIGITAL_CURRENCY" && !myId.value) {
+    showToast(t("blockchain.item11"));
+    return;
+  }
+  try {
+    if (formRef.value) {
+      await formRef.value.validate()
+      if (
+        channelData.value.type == "DIGITAL_CURRENCY" &&
+        !dialogDealResult_form.emailCode
+      ) {
+        // let res = await financialApi.withdrawCode({});
+        // if (res.code == Code.StatusOK) {
+        //   dialogDealResult = true;
+        // } else {
+        //   $pigeon.MessageWarning(res.msg);
+        // }
+        dialogDealResult.value = true;
+        return;
+      }
+      // 检查活动参与情况
+      // let selectedAccount = loginOptions.find(item => item.login === value);
+      // if (selectedAccount) {
+      //   let activityRes = await activityApi.ActivityGiveLoginParticipate({
+      //     login: value,
+      //     platform: selectedAccount.platform,
+      //     amount: form.amount
+      //   });
+      //   
+      //   if (activityRes.code == Code.StatusOK && activityRes.data === false) {
+      //     // 使用 Promise 包装确认对话框,等待用户选择
+      //     try {
+      //       await new Promise((resolve, reject) => {
+      //         $pigeon.MessageConfirm(
+      //           "您参加的活动正在进行中,发起申请后结束活动",
+      //           $i18n.t("Msg.SystemPrompt"),
+      //           $i18n.t("Btn.Confirm"),
+      //           $i18n.t("Btn.Cancel"),
+      //           () => {
+      //             resolve(); // 确认时继续执行
+      //           },
+      //           () => {
+      //             reject(); // 取消时阻止执行
+      //           }
+      //         );
+      //       });
+      //     } catch {
+      //       return; // 用户点击取消,阻止执行
+      //     }
+      //   }
+      // }
+
+      if (flag.value) {
+        return;
+      } else {
+        flag.value = true;
+      }
+      dialogCheckWait.value = true;
+      if (channelData.value.type == "DIGITAL_CURRENCY") {
+        let res = await financialApi.WithdrawAapplyDigitalCurrency(
+          channelData.value.requestUrl,
+          {
+            login: loginValue.value,
+            payType: channelData.value.code,
+            emailCode: dialogDealResult_form.emailCode,
+            ...form,
+          }
+        );
+        if (res.code == Code.StatusOK) {
+          flag.value = false;
+          dialogCheck.value = true;
+          dialogVisible.value = true;
+          // qrCode(res.data)
+        } else {
+          RES.value = res.msg;
+          dialogCheck.value = true;
+          dialogVisible.value = false;
+          flag.value = false;
+        }
+        cancelCode();
+      } else if (
+        channelData.value.type == "CHANNEL_TYPE_WALLET" ||
+        channelData.value.type == "UCARD_WALLET" ||
+        channelData.value.type == "CHANNEL_TYPE_ALI_WALLET"
+      ) {
+        let res = await financialApi.WithdrawAapplyDigitalCurrency(
+          channelData.value.requestUrl,
+          {
+            login: loginValue.value,
+            payType: channelData.value.code,
+            ...form,
+          }
+        );
+        if (res.code == Code.StatusOK) {
+          flag.value = false;
+          dialogCheck.value = true;
+          dialogVisible.value = true;
+          // qrCode(res.data)
+        } else {
+          RES.value = res.msg;
+          dialogCheck.value = true;
+          dialogVisible.value = false;
+          flag.value = false;
+        }
+
+        console.log(res, 'res', RES.value);
+      } else if (channelData.value.type == "BANK") {
+        let res = await financialApi.WithdrawApplyBank(
+          channelData.value.requestUrl,
+          {
+            login: loginValue.value,
+            payType: channelData.value.code,
+            ...form,
+          }
+        );
+        if (res.code == Code.StatusOK) {
+          flag.value = false;
+          dialogCheck.value = true;
+          dialogVisible.value = true;
+          // qrCode(res.data)
+        } else {
+          RES.value = res.msg;
+          dialogCheck.value = true;
+          dialogVisible.value = false;
+          flag.value = false;
+        }
+      } else if (channelData.value.type == "BANK_TELEGRAPHIC") {
+        let res = await financialApi.WithdrawApplyBank(
+          channelData.value.requestUrl,
+          {
+            login: loginValue.value,
+            payType: channelData.value.code,
+            ...form,
+          }
+        );
+
+        if (res.code == Code.StatusOK) {
+          flag.value = false;
+          dialogCheck.value = true;
+          dialogVisible.value = true;
+          // qrCode(res.data)
+        } else {
+          RES.value = res.msg;
+          dialogCheck.value = true;
+          dialogVisible.value = false;
+          flag.value = false;
+        }
+      } else if (channelData.value.type == "CHANNEL_TYPE_CARD") {
+        let res = await financialApi.WithdrawApplyBank(
+          channelData.value.requestUrl,
+          {
+            login: loginValue.value,
+            payType: channelData.value.code,
+            ...form,
+          }
+        );
+        if (res.code == Code.StatusOK) {
+          flag.value = false;
+          dialogCheck.value = true;
+          dialogVisible.value = true;
+          // qrCode(res.data)
+        } else {
+          RES.value = res.msg;
+          dialogCheck.value = true;
+          dialogVisible.value = false;
+          flag.value = false;
+        }
+      }
+      dialogCheckWait.value = false;
+    }
+  } catch (error) {
+    if (error instanceof Array) {
+      showToast(error[0].errorMessage);
+      return
+    } else {
+      RES.value = error.msg;
+      dialogCheck.value = true;
+      dialogCheckWait.value = false;
+      dialogVisible.value = false;
+      flag.value = false;
+    }
+  }
+}
+
+//初始化
+function Initialize() {
+  loginValue.value = "";
+  isStep3.value = false;
+  step2.value = false;
+  step3.value = false;
+  showTable();
+}
+
+//手续费减免次数接口
+async function getFreeNumber() {
+  if (!isFree.value) {
+    return;
+  }
+  dialogFreeNumber.value = true;
+  let res = await financialApi.remainingReductionNumber({});
+  if (res.code == Code.StatusOK) {
+    FreeNumber.value = res.data || 0;
+  } else {
+    showToast(res.msg);
+  }
+}
+function toShop() {
+  // $router.push({ path: "/shop/home" }).catch((arr) => arr);
+  // uni-app 中可能需要使用 uni.navigateTo,此处保留原逻辑但注释掉,因为原代码是 Vue Router
+  // 若需要可以改为 uni.navigateTo
+}
+
+//选择支付方式
+function isShowStep3(row) {
+  console.log(row, 222);
+  dialogCheckWait.value = false;
+  dialogVisible.value = false;
+  flag.value = false;
+  //判断是否有bank
+  if (row.bankValid && isChannel.value) {
+    getBankList(row);
+    isChannel.value = false;
+    step3.value = true;
+    channelData.value = row;
+    mAmount.minAmount = row.minAmount;
+    mAmount.maxAmount = row.maxAmount;
+  } else {
+    step3.value = true;
+    bankDate.value = [];
+    channelData.value = row;
+    mAmount.minAmount = row.minAmount;
+    mAmount.maxAmount = row.maxAmount;
+  }
+  if (row.code == "UNION_PAY_TELEGRAPHIC") {
+    WireTransferAccount.value = JSON.parse(row.property);
+  }
+  if (['BANK', 'BANK_TELEGRAPHIC', 'CHANNEL_TYPE_CARD', 'DIGITAL_CURRENCY'].includes(row.type)) {
+    getBankInfo();
+    step3_bank_cur.value = "bank";
+    form.login = loginValue.value;
+    form.payType = row.code;
+    bankPayType.value = row.code;
+  }
+  tableData.Ucard_Wallet = []
+  tableData.Digital_Currency = []
+  tableData.China_UnionPay = []
+  tableData.Electronic_Wallet = []
+  tableData.International_Transfer = []
+  tableData.CHANNEL_TYPE_CARD = []
+  tableData.CHANNEL_TYPE_ALI_WALLET = []
+  if (row.type === 'UCARD_WALLET') tableData.Ucard_Wallet = [row]
+  if (row.type === 'DIGITAL_CURRENCY') tableData.Digital_Currency = [row]
+  if (row.type === 'BANK') tableData.China_UnionPay = [row]
+  if (row.type === 'CHANNEL_TYPE_WALLET') tableData.Electronic_Wallet = [row]
+  if (row.type === 'BANK_TELEGRAPHIC') tableData.International_Transfer = [row]
+  if (row.type === 'CHANNEL_TYPE_CARD') tableData.CHANNEL_TYPE_CARD = [row]
+  if (row.type === 'CHANNEL_TYPE_ALI_WALLET') tableData.CHANNEL_TYPE_ALI_WALLET = [row]
+  introduce.introduce = row.introduce
+  introduce.enIntroduce = row.enIntroduce
+
+
+
+
+}
+//更换支付方式
+function showTable() {
+  resetForm()
+  myId.value = null;
+  step3.value = false;
+  isStep3.value = false;
+  isChannel.value = true;
+
+  getDepositList();
+
+
+  form.currency = "USD";
+}
+
+//获取账户信息
+async function getDateList() {
+  let res = await customApi.CustomDropdown({ platform: "" });
+  if (res.code == Code.StatusOK) {
+    loginOptions.value = res.data.map(item => ({
+      ...item,
+      label: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${item.balance}`
+    }))
+    const route = getCurrentPages().pop().$page.options
+    if (route.login) {
+      const found = loginOptions.value.find(opt => opt.login === Number(route.login))
+      loginValue.value = found.login
+      loginValueDoc.value = found.label
+      step2.value = true;
+      // showTable();
+    }
+  } else {
+    showToast(res.msg);
+  }
+}
+//获取出金通道
+async function getDepositList() {
+  pictLoading.value = true;
+  tableData.Ucard_Wallet = [];
+  tableData.Digital_Currency = [];
+  tableData.China_UnionPay = [];
+  tableData.Electronic_Wallet = [];
+  tableData.International_Transfer = [];
+  tableData.CHANNEL_TYPE_CARD = [];
+  tableData.CHANNEL_TYPE_ALI_WALLET = [];
+  let res = await financialApi.RemitChannelList({});
+  if (res.code == Code.StatusOK) {
+    res.data.forEach(item => {
+      if (item.type === 'UCARD_WALLET') tableData.Ucard_Wallet.push(item)
+      if (item.type === 'DIGITAL_CURRENCY') tableData.Digital_Currency.push(item)
+      if (item.type === 'BANK') tableData.China_UnionPay.push(item)
+      if (item.type === 'CHANNEL_TYPE_WALLET') tableData.Electronic_Wallet.push(item)
+      if (item.type === 'BANK_TELEGRAPHIC') tableData.International_Transfer.push(item)
+      if (item.type === 'CHANNEL_TYPE_CARD') tableData.CHANNEL_TYPE_CARD.push(item)
+      if (item.type === 'CHANNEL_TYPE_ALI_WALLET') tableData.CHANNEL_TYPE_ALI_WALLET.push(item)
+    })
+    pictLoading.value = false;
+  } else {
+    showToast(res.msg);
+    pictLoading.value = false;
+  }
+}
+//获取出金通道银行列表
+async function getBankList(row) {
+  let res = await financialApi.BankList({
+    channelCode: row.code,
+  });
+  if (res.code == Code.StatusOK) {
+    let bank = res.data;
+    let data = [];
+    bank.forEach((j) => {
+      if (!j.minAmount && j.minAmount != 0) {
+        j.minAmount = row.minAmount;
+      }
+      if (!j.maxAmount && j.maxAmount != 0) {
+        j.maxAmount = row.maxAmount;
+      }
+      j.payType = row.code;
+      data.push(j);
+    });
+    bankDate.value = data;
+  } else {
+    showToast(res.msg);
+  }
+}
+
+//取消
+function cancelBank() {
+  dialogNewBank.value = false;
+}
+
+//24新年庆典
+//是否到期-2023-11-25 00:00:00-2023-12-31 23:59:59
+function isNewYear24Open() {
+  let endTime1 = "2025/3/31 23:59:59";
+  let startTime1 = "2025/1/1 00:00:00";
+
+  let timezone = 2; //目标时区时间,东3区   东时区正数 西市区负数
+  let offset_GMT = new Date().getTimezoneOffset(); // 本地时间和格林威治的时间差,单位为分钟
+  let nowDate = new Date().getTime(); // 本地时间距 1970 年 1 月 1 日午夜(GMT 时间)之间的毫秒数
+
+  let now = new Date(
+    nowDate + offset_GMT * 60 * 1000 + timezone * 60 * 60 * 1000
+  ).getTime();
+  let end = new Date(endTime1).getTime();
+  let start = new Date(startTime1).getTime();
+
+  if (now < end && start < now) {
+    ActivityNewYear24();
+  }
+}
+async function ActivityNewYear24() {
+  let res = await activityApi.ActivityNewYear24({});
+  if (res.code == Code.StatusOK) {
+    tableDataNewYear24.value = res.data;
+    if (typeof tableDataNewYear24.value == "object") {
+      toIncome();
+    }
+  } else {
+    showToast(res.msg);
+  }
+}
+function toIncome() {
+  NewYear24Data.balance = Number(tableDataNewYear24.value.balance) || 0;
+  // let rate = 0;
+  tableDataNewYear24.value.details.forEach((item) => {
+    if (
+      NewYear24Data.balance > item.min &&
+      NewYear24Data.balance <= item.max
+    ) {
+      NewYear24Data.rate = item.rate;
+    } else if (
+      NewYear24Data.balance > item.min &&
+      NewYear24Data.balance >= item.max &&
+      item.max == 0
+    ) {
+      NewYear24Data.rate = item.rate;
+    }
+  });
+  // console.log(NewYear24Data);
+  NewYear24Data.income = (
+    ((NewYear24Data.balance * NewYear24Data.rate) / 100 / 365) *
+    NewYear24RemainingTime()
+  ).toFixed(2);
+  tableDataNewYear24Flag.value = true;
+}
+function NewYear24RemainingTime() {
+  // let endTime1 = '2025/3/31 23:59:59';
+  // let startTime1 = '2025/1/1 00:00:00';
+
+  let timezone = 2; //目标时区时间,东3区   东时区正数 西市区负数
+  let offset_GMT = new Date().getTimezoneOffset(); // 本地时间和格林威治的时间差,单位为分钟
+  let nowDate = new Date().getTime(); // 本地时间距 1970 年 1 月 1 日午夜(GMT 时间)之间的毫秒数
+
+  let now = new Date(
+    nowDate + offset_GMT * 60 * 1000 + timezone * 60 * 60 * 1000
+  ).getTime();
+
+  // 获取当前月份的最后一天
+  let lastDayOfMonth = getFirstDayOfNextMonth();
+  // console.log(lastDayOfMonth);
+  let end = new Date(lastDayOfMonth).getTime();
+
+  // let now = new Date('2025/1/31 21:59:59').getTime();
+  // let end = new Date('2025/1/31 23:59:59').getTime();
+
+  let time = (end - now) / 60 / 60 / 1000 / 24;
+  time = Math.ceil(time);
+
+  return time;
+}
+function getFirstDayOfNextMonth() {
+  let timezone = 2; //目标时区时间,东3区   东时区正数 西市区负数
+  let offset_GMT = new Date().getTimezoneOffset(); // 本地时间和格林威治的时间差,单位为分钟
+  let nowDate = new Date().getTime(); // 本地时间距 1970 年 1 月 1 日午夜(GMT 时间)之间的毫秒数
+
+  let now = new Date(
+    nowDate + offset_GMT * 60 * 1000 + timezone * 60 * 60 * 1000
+  );
+
+  let lastDayOfMonth = new Date(now.getFullYear(), now.getMonth() + 1, 0);
+  // console.log(lastDayOfMonth);
+  return lastDayOfMonth;
+  // const nextMonth = now.getMonth() + 1; // 当前月份加1
+  // const nextYear = now.getFullYear(); // 获取当前年份
+  // // 如果下个月大于11(即12月),年份需要增加1
+  // if (nextMonth > 11) {
+  //   return new Date(nextYear + 1, 0, 1); // 下一年的1月1日
+  // } else {
+  //   return new Date(nextYear, nextMonth, 1); // 下个月的1日
+  // }
+}
+
+// -------------------- watch --------------------
+watch(loginValue, (newVal) => {
+  if (newVal) {
+    step2.value = true;
+    const found = loginOptions.value.find(opt => opt.login === Number(newVal))
+    loginValueDoc.value = found.label
+    showTable();
+  }
+});
+watch(isStep3, async (newVal) => {
+  if (newVal) {
+    await nextTick();
+    formRef.value?.clearValidate();   // 先清除旧错误
+    await nextTick();
+    formRef.value?.clearValidate();   // 再次清除可能因数据重置产生的新错误
+  }
+});
+
+watch(() => form.amount, (newVal) => {
+  if (newVal && channelData.value.rate) {
+    // form.amount1 = (newVal * channelData.rate).toFixed(2);
+    if (isFree.value) {
+      let feeAmount = 0;
+      if (channelData.value.feeTypeBank) {
+        if (channelData.value.feeTypeBank == 1) {
+          feeAmount =
+            Number(newVal || 0) *
+            (Number(channelData.value.freeBank || 0) / 100);
+        } else if (channelData.value.feeTypeBank == 2) {
+          feeAmount = Number(channelData.value.feeAmountBank || 0);
+        }
+      } else {
+        if (channelData.value.feeType == 1) {
+          feeAmount =
+            Number(newVal || 0) *
+            (Number(channelData.value.free || 0) / 100);
+        } else if (channelData.value.feeType == 2) {
+          feeAmount = Number(channelData.value.feeAmount || 0);
+        }
+      }
+
+      if (FreeNumber.value > 0) {
+        form.amount1 = new Decimal(Number(newVal || 0))
+          .mul(new Decimal(Number(channelData.value.rate || 0)))
+          .toNumber();
+      } else {
+        form.amount1 = new Decimal(Number(newVal || 0))
+          .sub(new Decimal(Number(feeAmount || 0)))
+          .mul(new Decimal(Number(channelData.value.rate || 0)))
+          .toNumber();
+      }
+    } else {
+      form.amount1 = (newVal * channelData.value.rate).toFixed(2);
+    }
+    if (
+      ["CNY", "THB", "VND"].indexOf(channelData.value.transformCurrency) > -1
+    ) {
+      form.amount1 = parseInt(form.amount1);
+    }
+  }
+});
+
+// -------------------- lifecycle --------------------
+onMounted(() => {
+  getDateList();
+  //调用手续费减免次数接口
+  getFreeNumber();
+  isNewYear24Open();
+});
+
+
+</script>
+
+<style lang="scss" scoped>
+@import "@/uni.scss";
+
+.custom-withdraw {
+
+  .box {
+    margin-bottom: px2rpx(20);
+
+    .b-card {
+      background: #fff;
+      border-radius: px2rpx(12);
+      padding: px2rpx(20);
+      box-shadow: 0 px2rpx(4) px2rpx(12) rgba(0, 0, 0, 0.03);
+
+      .card-top {
+        .tit {
+          font-size: px2rpx(16);
+          font-weight: 600;
+          margin-bottom: px2rpx(16);
+          display: flex;
+          align-items: center;
+          color: var(--color-navy-900);
+          position: relative;
+          padding-left: 20px;
+
+          &:after {
+            content: '';
+            position: absolute;
+            left: 0;
+            top: 50%;
+            transform: translateY(-50%);
+            width: 0;
+            height: 0;
+            border-top: 6px solid transparent;
+            border-bottom: 6px solid transparent;
+            border-left: 8px solid currentColor;
+          }
+
+          .iconfont {
+            margin-right: px2rpx(8);
+            color: var(--color-primary);
+            font-size: px2rpx(18);
+          }
+        }
+      }
+
+      .channelType {
+        font-size: px2rpx(15);
+        font-weight: 600;
+        margin: px2rpx(24) 0 px2rpx(12);
+        color: var(--color-navy-700);
+        padding-left: px2rpx(8);
+        border-left: px2rpx(4) solid var(--color-primary);
+      }
+    }
+  }
+
+  .reselect-btn {
+    margin-top: px2rpx(20);
+    display: flex;
+    justify-content: flex-end;
+  }
+
+  .s-btn {
+    &.reselect {
+      background-color: var(--color-zinc-100);
+      color: var(--color-navy-700);
+      border: none;
+      font-size: px2rpx(14);
+      padding: px2rpx(8) px2rpx(20);
+      border-radius: px2rpx(8);
+
+      &:active {
+        background-color: var(--color-zinc-200);
+      }
+    }
+
+    &[type="primary"] {
+      width: 100%;
+      height: px2rpx(48);
+      background-color: #cf1322;
+      color: #fff;
+      border-radius: px2rpx(12);
+      font-size: px2rpx(16);
+      font-weight: 600;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      border: none;
+      margin-top: px2rpx(30);
+      transition: all 0.2s;
+
+      &:active {
+        transform: scale(0.98);
+        background: var(--color-navy-800);
+      }
+    }
+  }
+
+  .add-back {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: px2rpx(12);
+    padding: px2rpx(12) px2rpx(16);
+    background: var(--color-zinc-100);
+    border-radius: px2rpx(8);
+
+    text {
+      font-size: px2rpx(14);
+      color: var(--color-navy-700);
+      font-weight: 500;
+    }
+
+    .add-btn {
+      color: var(--color-primary);
+      font-weight: 600;
+      text-decoration: underline;
+
+      &:active {
+        opacity: 0.7;
+      }
+    }
+  }
+
+  .proof {
+    margin-top: px2rpx(8);
+    border: px2rpx(1) dashed var(--color-zinc-300);
+    border-radius: px2rpx(8);
+    padding: px2rpx(8);
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    background: var(--color-zinc-50);
+
+    .state {
+      padding: px2rpx(4) px2rpx(12);
+      border-radius: px2rpx(4);
+      font-size: px2rpx(12);
+      font-weight: bold;
+    }
+  }
+
+  .agree {
+    margin: px2rpx(24) 0;
+    display: flex;
+    align-items: flex-start;
+
+    .checkbox {
+      display: flex;
+      align-items: flex-start;
+      gap: px2rpx(8);
+
+      :deep(uni-checkbox .uni-checkbox-input) {
+        border-radius: px2rpx(4);
+        width: px2rpx(18);
+        height: px2rpx(18);
+      }
+
+      text {
+        font-size: px2rpx(13);
+        color: var(--color-zinc-500);
+        line-height: 1.5;
+      }
+    }
+  }
+
+  .step3-attention {
+    // background: var(--color-error-50, #fff1f0);
+    border-radius: px2rpx(12);
+    margin-bottom: px2rpx(20);
+
+    .tips {
+      line-height: 1.8;
+      font-size: px2rpx(12);
+      color: #909399;
+      padding: px2rpx(12);
+      border-radius: px2rpx(4);
+      border-left: px2rpx(2) solid #409eff;
+
+      .title {
+        font-weight: 600;
+        margin-bottom: px2rpx(6);
+        color: #606266;
+      }
+    }
+
+    .attention {
+      font-size: px2rpx(14);
+      //  color: var(--color-error-600, #cf1322);
+      line-height: 1.6;
+    }
+
+    .btn-bottom {
+      margin-top: px2rpx(20);
+      display: flex;
+      justify-content: center;
+
+      .btn {
+        background: var(--color-error-600, #cf1322);
+        color: #fff;
+        padding: px2rpx(10) px2rpx(48);
+        border-radius: px2rpx(24);
+        font-size: px2rpx(15);
+        font-weight: 700;
+        box-shadow: 0 px2rpx(4) px2rpx(10) rgba(207, 19, 34, 0.2);
+        transition: all 0.2s;
+
+        &:active {
+          transform: scale(0.96);
+          opacity: 0.8;
+        }
+      }
+    }
+  }
+
+  :deep(.base-info-form) {
+    .uni-row1 {
+      .uni-col {
+        padding: 0 px2rpx(10) !important;
+      }
+
+      .uni-forms-item {
+        min-height: px2rpx(36);
+        margin-bottom: px2rpx(28);
+      }
+
+      .uni-select,
+      .uni-combox,
+      .uni-easyinput__content,
+      .uni-date-editor--x {
+        border: none !important;
+        background-color: var(--color-zinc-100) !important;
+        border-radius: px2rpx(8) !important;
+      }
+
+      .uni-date-x {
+        border: none !important;
+        background-color: rgba(195, 195, 195, 0) !important;
+      }
+
+      .uni-easyinput__content-input {
+        height: px2rpx(35) !important;
+      }
+    }
+  }
+
+  @keyframes rotate {
+    from {
+      transform: rotate(0deg);
+    }
+
+    to {
+      transform: rotate(360deg);
+    }
+  }
+}
+</style>

+ 1735 - 0
pages/ib/withdraw-select.vue

@@ -0,0 +1,1735 @@
+<template>
+    <cwg-page-wrapper class="create-page" :isHeaderFixed="true">
+        <cwg-header :title="t('Home.page_ib.item5')" />
+        <view class="custom-withdraw">
+            <!-- 步骤2:支付通道列表 -->
+            <view class="box box-step2">
+                <view class="b-card">
+                    <view class="card-top">
+                        <text class="tit">{{ t('Custom.Deposit.Title22')
+                            }}</text>
+                        <cwg-asset-tabs v-if="tabsConfig.length > 0" v-model="activeTab" :tabs="tabsConfig" />
+                        <uni-loading v-if="currentTableData.length == 0" />
+                        <view v-if="currentTableData.length">
+                            <PaymentMethodsList :list="currentTableData" @select="isShowStep3" />
+                        </view>
+                        <view v-if="step3" class="reselect-btn">
+                            <button class="s-btn reselect" type="primary" @click="showTable">{{
+                                t('Custom.Deposit.Reselect')
+                                }}</button>
+                        </view>
+                    </view>
+                </view>
+            </view>
+
+            <!-- 步骤3:填写出金信息 -->
+            <view class="box box-step3" v-if="step3">
+                <view class="b-card">
+                    <view class="card-top">
+                        <!-- 注意事项 -->
+                        <view v-if="!isStep3" class="step3-attention">
+                            <view class="tips" v-if="(introduce.introduce || introduce.enIntroduce)">
+                                <view>
+                                    <rich-text class="attention"
+                                        :nodes="isZh ? introduce.introduce : introduce.enIntroduce" />
+                                </view>
+                            </view>
+                            <view class="btn-bottom">
+                                <text class="btn crm-cursor" @click="isStep3 = true">{{ t('Btn.Confirm') }}</text>
+                            </view>
+                        </view>
+                        <!-- 表单 -->
+                        <uni-forms ref="formRef" :model="form" :rules="rules" label-width="200" label-position="top"
+                            v-if="isStep3" class="form base-info-form" validate-trigger="submit">
+                            <uni-row class="demo-uni-row uni-row1">
+                                <!-- 银行选择区域(当有银行列表时) -->
+                                <uni-col :span="24" v-if="bankDate.length && isStep3">
+                                    <view class="tit">
+                                        <text>{{ t('Custom.Withdraw.Title5') }}</text>
+                                    </view>
+                                </uni-col>
+                                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" v-if="bankDate.length && isStep3">
+                                    <uni-forms-item name="bankCode">
+                                        <cwg-combox filterable v-model:value="form.bankCode" :options="bankOptions"
+                                            :placeholder="t('placeholder.choose')" />
+                                    </uni-forms-item>
+                                </uni-col>
+
+                                <!-- 电子钱包标题 -->
+                                <uni-col :span="24"
+                                    v-if="['CHANNEL_TYPE_WALLET', 'CHANNEL_TYPE_ALI_WALLET'].includes(channelData.type)">
+                                    <view class="tit">
+                                        <text>{{ getWalletLabel }}</text>
+                                    </view>
+                                </uni-col>
+
+                                <!-- 电子钱包地址输入 -->
+                                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                                    v-if="(channelData.type == 'CHANNEL_TYPE_WALLET' || channelData.type == 'CHANNEL_TYPE_ALI_WALLET') && isStep3">
+                                    <uni-forms-item name="address">
+                                        <uni-easyinput v-model="form.address" :placeholder="t('placeholder.input')"
+                                            autocomplete="off" />
+                                    </uni-forms-item>
+                                </uni-col>
+
+                                <!-- 数字货币区域 -->
+                                <uni-col :span="24" class="card-tit"
+                                    v-if="channelData.type == 'DIGITAL_CURRENCY' && isStep3">
+                                    <div
+                                        style="display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap;">
+                                        <view class="tit">
+
+                                            <text>{{ t('Custom.Withdraw.Title6') }}</text>
+                                        </view>
+                                        <div class="add-back">
+                                            <text>{{ t('blockchain.item10') }}</text>
+                                            <text class="add-btn crm-cursor"
+                                                @click="openAddBankCard('add_bankBlockchain')">
+                                                {{ t('Custom.Withdraw.addBank1') }}
+                                            </text>
+                                        </div>
+                                    </div>
+                                </uni-col>
+                                <uni-col :span="24" v-if="channelData.type == 'DIGITAL_CURRENCY' && isStep3">
+                                    <uni-forms-item>
+                                        <cwg-combox filterable v-model:value="myId" :options="digitalOptions"
+                                            :placeholder="t('placeholder.choose')" @change="onDigitalCurrencyChange"
+                                            :disabled="!ruleForm.bankBlockchain.length" />
+                                    </uni-forms-item>
+                                </uni-col>
+                                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                                    v-if="channelData.type == 'DIGITAL_CURRENCY' && isStep3">
+                                    <uni-forms-item :label="t('blockchain.item3')">
+                                        <uni-easyinput disabled v-model="form.addressName" />
+                                    </uni-forms-item>
+                                </uni-col>
+                                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                                    v-if="channelData.type == 'DIGITAL_CURRENCY' && isStep3">
+                                    <uni-forms-item :label="t('blockchain.item4')">
+                                        <uni-easyinput disabled v-model="form.address" />
+                                    </uni-forms-item>
+                                </uni-col>
+                                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                                    v-if="channelData.type == 'DIGITAL_CURRENCY' && isStep3 && form.addressProve">
+                                    <uni-forms-item :label="t('blockchain.item5')">
+                                        <div style="height: 100%; width: 100%" v-if="form.addressProve">
+                                            <cwg-link type="pdf1"
+                                                v-if="form.addressProve && (form.addressProve.slice(-3).toLowerCase() === 'pdf')"
+                                                :url="imgUrl + form.addressProve" target="_blank"
+                                                style="text-decoration: none; min-width: auto; width: auto; color: #ffffff; padding: 5px 10px;"
+                                                class="state crm_state_blue">
+                                                PDF
+                                            </cwg-link>
+                                            <image v-else style="width: 50px; height: 50px"
+                                                :src="imgUrl + form.addressProve" mode="aspectFill"
+                                                @click="previewImage(imgUrl + form.addressProve)" />
+                                        </div>
+                                    </uni-forms-item>
+                                </uni-col>
+                                <uni-col :span="24" v-if="channelData.type == 'DIGITAL_CURRENCY' && isStep3">
+                                    <view class="tit" style="margin: 0 0 20px">
+                                        <i class="iconfont iconi"></i>
+                                        <text>{{ t('Custom.Deposit.Des') }}</text>
+                                    </view>
+                                </uni-col>
+
+                                <!-- 银行卡/电汇/信用卡区域 -->
+                                <uni-col :span="24" class="card-tit"
+                                    v-if="isStep3 && (channelData.type == 'BANK_TELEGRAPHIC' || channelData.type == 'BANK' || channelData.type == 'CHANNEL_TYPE_CARD')">
+                                    <div
+                                        style="display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap;">
+                                        <view class="tit">
+
+                                            <text>{{ t('Custom.Withdraw.Title4') }}</text>
+                                        </view>
+                                        <div class="add-back">
+                                            <text v-if="channelData.type == 'BANK_TELEGRAPHIC'">{{
+                                                t('Custom.Withdraw.addWire') }}</text>
+                                            <text v-if="channelData.type == 'BANK_TELEGRAPHIC'"
+                                                class="add-btn crm-cursor" @click="openAddBankCard('add_wireTransfer')">
+                                                {{ t('Custom.Withdraw.addBank1') }}
+                                            </text>
+                                            <text v-if="channelData.type == 'BANK'">{{
+                                                t('Custom.Withdraw.addBank')
+                                                }}</text>
+                                            <text v-if="channelData.type == 'BANK'" class="add-btn crm-cursor"
+                                                @click="openAddBankCard('add_bankCard')">
+                                                {{ t('Custom.Withdraw.addBank1') }}
+                                            </text>
+                                            <text v-if="channelData.type == 'CHANNEL_TYPE_CARD'">{{
+                                                t('PersonalManagement.Label.addCreditCard') }}</text>
+                                            <text v-if="channelData.type == 'CHANNEL_TYPE_CARD'"
+                                                class="add-btn crm-cursor" @click="openAddBankCard('add_CreditCard')">
+                                                {{ t('Custom.Withdraw.addBank1') }}
+                                            </text>
+                                        </div>
+                                    </div>
+                                </uni-col>
+
+                                <!-- 网银支付信息(BANK) -->
+                                <uni-col :span="24" v-if="channelData.type == 'BANK' && isStep3">
+                                    <uni-forms-item>
+                                        <cwg-combox v-model:value="myId" :options="bankCardOptions"
+                                            :placeholder="t('placeholder.choose')" @change="chooseBank" />
+                                    </uni-forms-item>
+                                </uni-col>
+                                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                                    v-if="channelData.type == 'BANK' && isStep3">
+                                    <uni-forms-item :label="t('Custom.Withdraw.UserName')">
+                                        <uni-easyinput disabled v-model="form.bankUname" />
+                                    </uni-forms-item>
+                                </uni-col>
+                                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                                    v-if="channelData.type == 'BANK' && isStep3">
+                                    <uni-forms-item :label="t('Custom.Withdraw.BankCardNum')">
+                                        <uni-easyinput disabled v-model="form.bankCardNum" />
+                                    </uni-forms-item>
+                                </uni-col>
+                                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                                    v-if="channelData.type == 'BANK' && isStep3">
+                                    <uni-forms-item :label="t('Custom.Withdraw.BankName')">
+                                        <uni-easyinput disabled v-model="form.bankName" />
+                                    </uni-forms-item>
+                                </uni-col>
+                                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                                    v-if="channelData.type == 'BANK' && isStep3">
+                                    <uni-forms-item :label="t('Custom.Withdraw.bankBranchName')">
+                                        <uni-easyinput disabled v-model="form.bankBranchName" />
+                                    </uni-forms-item>
+                                </uni-col>
+
+                                <!-- 信用卡信息 -->
+                                <uni-col :span="24" v-if="channelData.type == 'CHANNEL_TYPE_CARD' && isStep3">
+                                    <uni-forms-item>
+                                        <cwg-combox v-model:value="myId" :options="bankCardOptions"
+                                            :placeholder="t('placeholder.choose')" @change="chooseBank" />
+                                    </uni-forms-item>
+                                </uni-col>
+                                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                                    v-if="channelData.type == 'CHANNEL_TYPE_CARD' && isStep3">
+                                    <uni-forms-item :label="t('PersonalManagement.Label.CreditCardAccountName')">
+                                        <uni-easyinput disabled v-model="form.bankUname" />
+                                    </uni-forms-item>
+                                </uni-col>
+                                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                                    v-if="channelData.type == 'CHANNEL_TYPE_CARD' && isStep3">
+                                    <uni-forms-item :label="t('PersonalManagement.Label.CreditCardAccount')">
+                                        <uni-easyinput disabled v-model="form.bankCardNum" />
+                                    </uni-forms-item>
+                                </uni-col>
+                                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                                    v-if="channelData.type == 'CHANNEL_TYPE_CARD' && isStep3">
+                                    <uni-forms-item label="CVV">
+                                        <uni-easyinput disabled v-model="form.cvv" />
+                                    </uni-forms-item>
+                                </uni-col>
+                                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                                    v-if="channelData.type == 'CHANNEL_TYPE_CARD' && isStep3">
+                                    <uni-forms-item :label="t('PersonalManagement.Label.ExpirationYear')">
+                                        <uni-easyinput disabled v-model="form.expiryYearMonth" />
+                                    </uni-forms-item>
+                                </uni-col>
+
+                                <!-- 电汇信息 -->
+                                <uni-col :span="24" v-if="channelData.type == 'BANK_TELEGRAPHIC' && isStep3">
+                                    <uni-forms-item>
+                                        <cwg-combox v-model:value="myId" :options="bankCardOptions"
+                                            :placeholder="t('placeholder.choose')" @change="chooseBank" />
+                                    </uni-forms-item>
+                                </uni-col>
+                                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                                    v-if="channelData.type == 'BANK_TELEGRAPHIC' && isStep3">
+                                    <uni-forms-item :label="t('Custom.Withdraw.UserName')">
+                                        <uni-easyinput disabled v-model="form.bankUname" />
+                                    </uni-forms-item>
+                                </uni-col>
+                                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                                    v-if="channelData.type == 'BANK_TELEGRAPHIC' && isStep3">
+                                    <uni-forms-item :label="t('Custom.Withdraw.BankCardNum')">
+                                        <uni-easyinput disabled v-model="form.bankCardNum" />
+                                    </uni-forms-item>
+                                </uni-col>
+                                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                                    v-if="channelData.type == 'BANK_TELEGRAPHIC' && isStep3">
+                                    <uni-forms-item :label="t('Custom.Withdraw.BankName')">
+                                        <uni-easyinput disabled v-model="form.bankName" />
+                                    </uni-forms-item>
+                                </uni-col>
+                                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                                    v-if="channelData.type == 'BANK_TELEGRAPHIC' && isStep3">
+                                    <uni-forms-item :label="t('Custom.Withdraw.swiftCode')">
+                                        <uni-easyinput disabled v-model="form.swiftCode" />
+                                    </uni-forms-item>
+                                </uni-col>
+                                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                                    v-if="channelData.type == 'BANK_TELEGRAPHIC' && isStep3">
+                                    <uni-forms-item :label="t('Custom.Withdraw.bankCode')">
+                                        <uni-easyinput disabled v-model="form.customBankCode" />
+                                    </uni-forms-item>
+                                </uni-col>
+                                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                                    v-if="channelData.type == 'BANK_TELEGRAPHIC' && isStep3">
+                                    <uni-forms-item :label="t('Custom.Withdraw.bankAddr')">
+                                        <uni-easyinput disabled v-model="form.bankAddr" />
+                                    </uni-forms-item>
+                                </uni-col>
+                                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                                    v-if="channelData.type == 'BANK_TELEGRAPHIC' && isStep3">
+                                    <!-- Account Agency NO -->
+                                    <uni-forms-item :label="'Account Agency NO'" name="agencyNo">
+                                        <uni-easyinput v-model="form.agencyNo" />
+                                    </uni-forms-item>
+                                </uni-col>
+                                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                                    v-if="channelData.type == 'BANK_TELEGRAPHIC' && isStep3 && channelData.code == 'PAY_RETAILER_REMIT_PAY_KEY_BRW'">
+                                    <uni-forms-item label="CPF" name="cpf">
+                                        <uni-easyinput v-model="form.cpf" />
+                                    </uni-forms-item>
+                                </uni-col>
+
+                                <!-- 电汇金额区域 -->
+                                <uni-col :span="24" v-if="channelData.type == 'BANK_TELEGRAPHIC' && isStep3">
+                                    <view class="tit">
+                                        <text>{{ t('Custom.Withdraw.Title3') }}</text>
+                                    </view>
+                                </uni-col>
+                                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                                    v-if="channelData.type == 'BANK_TELEGRAPHIC' && isStep3">
+                                    <uni-forms-item :label="t('Custom.Withdraw.CurrencyType')" name="currency">
+                                        <cwg-combox filterable v-model:value="form.currency"
+                                            :options="[{ text: 'USD', value: 'USD' }]" />
+                                    </uni-forms-item>
+                                </uni-col>
+                                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                                    v-if="channelData.type == 'BANK_TELEGRAPHIC' && isStep3">
+                                    <uni-forms-item :label="t('Custom.Withdraw.amount')" name="amount"
+                                        :error-message="amountErrorMessage">
+                                        <uni-easyinput v-model.trim="form.amount" type="number"
+                                            @blur="validateAmount" />
+                                    </uni-forms-item>
+                                </uni-col>
+
+                                <!-- 非电汇的金额区域 -->
+                                <uni-col :span="24" v-if="channelData.type != 'BANK_TELEGRAPHIC' && isStep3">
+                                    <view class="tit">
+                                        <text>{{ t('Custom.Withdraw.Title3') + '(' + channelData.currency + ')'
+                                            }}</text>
+                                    </view>
+                                </uni-col>
+                                <uni-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"
+                                    v-if="channelData.type != 'BANK_TELEGRAPHIC' && isStep3">
+                                    <uni-forms-item name="amount" :error-message="amountErrorMessage">
+                                        <uni-easyinput v-model.trim="form.amount" autocomplete="off" type="number"
+                                            @blur="validateAmount" />
+                                    </uni-forms-item>
+                                </uni-col>
+                            </uni-row>
+                            <view class="agree">
+                                <uni-forms-item name="agree2">
+                                    <checkbox-group :value="form.agree2 ? ['1'] : []" @change="onAgree2Change">
+                                        <label class="checkbox">
+                                            <checkbox value="1" :checked="form.agree2" />
+                                            <view class="crm-cursor"
+                                                style="text-decoration: underline; display: inline-block; margin-left: 10px;"
+                                                @click.stop="dialogCheckTip = true">
+                                                {{ t('Custom.Withdraw.Des') }}
+                                            </view>
+                                        </label>
+                                    </checkbox-group>
+                                </uni-forms-item>
+                            </view>
+                            <view class="agree" v-if="dialogTipsIsShow">
+                                <uni-forms-item name="agree3">
+                                    <checkbox-group :value="form.agree3 ? ['1'] : []" @change="onAgree3Change">
+                                        <label class="checkbox">
+                                            <checkbox value="1" :checked="form.agree3" />
+                                            <view class="crm-cursor" style="display: inline-block; margin-left: 10px;">
+                                                * {{ t('Custom.Withdraw.item1') }}<br />
+                                                {{ t('Custom.Withdraw.item1_1') }}<br />
+                                                {{ t('Custom.Withdraw.item1_2') }}
+                                            </view>
+                                        </label>
+                                    </checkbox-group>
+                                </uni-forms-item>
+                            </view>
+                            <button class="s-btn" type="primary" @click="openTips">{{ t('Btn.Submit') }}</button>
+
+                        </uni-forms>
+                    </view>
+                </view>
+            </view>
+            <!-- 提示弹窗 -->
+            <cwg-tips-popup v-model:visible="dialogTips" content="Custom.Withdraw.item2" @confirm="closeTipsConfirm" />
+            <cwg-tips-popup v-model:visible="dialogCheckInto" content="ApplicationDialog.Des42_1"
+                title="ApplicationDialog.Des41_1" @confirm="closeTipsConfirm" />
+            <cwg-tips-popup v-model:visible="dialogCheckInto1" content="ApplicationDialog.Des42"
+                title="ApplicationDialog.Des41" @confirm="closeTipsConfirm" />
+            <!-- 弹窗:确认信息 -->
+            <cwg-check-confirm-popup v-model:visible="dialogCheckConfirm" :title="t('Home.page_customer.item3')"
+                :channelData="channelData" :code="code" :selectCodes="selectCodes" :params="form"
+                :FreeNumber="FreeNumber" :userName="userName" :dialogCheckConfirm_form="dialogCheckConfirm_form"
+                :login="loginValue" type="IB" @confirm="submit" />
+            <!-- 协议弹窗 -->
+            <cwg-tips-popup v-model:visible="dialogCheckTip"
+                :introduce="isZh ? introduce.introduce : introduce.enIntroduce" />
+            <!-- 等待弹窗 -->
+            <cwg-wait-popup v-model:visible="dialogCheckWait" type="center" :mask-click="false" :showFooters="false" />
+            <!-- 最后失败弹窗 -->
+            <cwg-error-popup v-model:visible="dialogError" @confirm="closeDia" :responseMessage="RES" />
+            <!-- 最后成功弹窗 -->
+            <cwg-success-popup v-model:visible="dialogSuccess" @confirm="closeDia" />
+            <!-- 功能关闭弹出 -->
+            <cwg-function-disabled-popup v-model:visible="InfoStatus5" :showFooters="false" @confirm="toHome" />
+            <!-- kyc成功弹窗 -->
+            <cwg-kyc-popup v-model:visible="dialogKyc" :qrText="text1" />
+            <!--验证码-->
+            <!-- 新增银行弹窗 -->
+            <add-bank-dialog ref="addBankDialogRef" @success="addSuccess" />
+        </view>
+    </cwg-page-wrapper>
+</template>
+
+<script setup>
+import { ref, reactive, computed, onMounted, nextTick, watch } from 'vue'
+import { onLoad } from '@dcloudio/uni-app'
+import { showToast } from "@/utils/toast";
+import useUserStore from '@/stores/use-user-store'
+import { customApi } from "@/service/custom"
+import { financialApi } from "@/service/financial"
+import Config from "@/config/index"
+import AddBankDialog from '@/components/AddBankDialog.vue';
+import CwgCheckConfirmPopup from '../customer/components/WithdrawCheckConfirmPopup.vue'
+import CwgKycPopup from '../customer/components/KycPopup.vue'
+import PaymentMethodsList from '../customer/components/PaymentMethodsList.vue'
+import { useI18n } from 'vue-i18n'
+
+const { t, locale } = useI18n()
+const { Code, Host80 } = Config
+
+const isZh = computed(() => ['cn', 'zhHant'].includes(locale.value))
+// ---------- 辅助函数:替代原 this.Session ----------
+
+// 弹窗辅助(替代原 this.$pigeon)
+const $pigeon = {
+    MessageError(msg) {
+        uni.showToast({ title: msg, icon: 'none' })
+    },
+    MessageWarning(msg) {
+        uni.showToast({ title: msg, icon: 'none' })
+    },
+    MessageConfirm(content, title, confirmText, cancelText, confirmCallback, cancelCallback) {
+        uni.showModal({
+            title,
+            content,
+            confirmText,
+            cancelText,
+            success(res) {
+                if (res.confirm) confirmCallback && confirmCallback()
+                else cancelCallback && cancelCallback()
+            }
+        })
+    }
+}
+
+// 获取 metaInfo(用于二维码)
+const getMetaInfo = () => {
+    const systemInfo = uni.getSystemInfoSync()
+    return {
+        userAgent: systemInfo.platform,
+        screenWidth: systemInfo.screenWidth,
+        screenHeight: systemInfo.screenHeight,
+        deviceType: 'h5'
+    }
+}
+
+// ---------- 响应式数据(完全保留原 data 结构) ----------
+const dialogFreeNumber = ref(false)
+const FreeNumber = ref(0)
+const InfoStatus5 = ref(false)
+const metaInfo = ref(null)
+const text1 = ref("")
+const flag = ref(false)
+const RES = ref("")
+const openType = ref("")
+const dialogInfoTradingAdd = ref(false)
+const ruleForm = reactive({
+    bankInfo: [],
+    bankWrit: [],
+    xykInfo: [],
+    bankBlockchain: []
+})
+const imgUrl = Host80
+const loginOptions = ref([])
+const loginValue = ref("")
+const code = ref("")
+const bankValid = ref("")
+const requestUrl = ref("")
+const isStep3 = ref(false)
+const step2 = ref(false)
+const step3 = ref(false)
+const dialogCheckTip = ref(false)
+const isChannel = ref(true)
+const pictLoading = ref(false)
+const tableData = reactive({
+    International_Transfer: [],
+    China_UnionPay: [],
+    Digital_Currency: [],
+    CHANNEL_TYPE_CARD: [],
+    Electronic_Wallet: [],
+    CHANNEL_TYPE_ALI_WALLET: [],
+    UCARD_WALLET: []
+})
+
+//通道table-选择前后
+const activeTab = ref(1)
+// 🔥 自动过滤掉空数据的 tab
+const tabsConfig = computed(() => {
+    const allTabs = [
+        { text: t('Custom.Deposit.Channel3'), value: 1, type: 'Digital_Currency' },
+        { text: t('Custom.Deposit.Channel2'), value: 2, type: 'China_UnionPay' },
+        { text: t('Custom.Deposit.Channel4'), value: 3, type: 'Electronic_Wallet' },
+        { text: t('Custom.Deposit.Channel1'), value: 4, type: 'International_Transfer' },
+        { text: t('PersonalManagement.Label.CreditCard'), value: 5, type: 'CHANNEL_TYPE_CARD' },
+        { text: t('card.title'), value: 6, type: 'UCARD_WALLET' },
+        { text: t('Label.Ali'), value: 7, type: 'CHANNEL_TYPE_ALI_WALLET' },
+    ]
+    // ✅ 只保留有数据的 tab
+    return allTabs.filter(tab => {
+        console.log(tableData[tab.type], tab.type);
+        return tableData[tab.type]?.length > 0
+    })
+})
+// 当前选中的 tab 项
+const currentTab = computed(() => tabsConfig.value.find(t => t.value === activeTab.value))
+
+// 当前要渲染的表格数据
+const currentTableData = computed(() => {
+    const type = currentTab.value?.type
+    return type ? tableData[type] || [] : []
+})
+// ✅ 监听 tab 变化,自动选中第一个有数据的 tab
+watch(
+    tabsConfig,
+    (newTabs) => {
+        if (newTabs.length > 0) {
+            activeTab.value = newTabs[0].value // 选中第一个
+        }
+    },
+    { immediate: true }
+)
+const bankDate = ref([])
+const channelData = ref({})
+const WireTransferAccount = ref({})
+const formRef = ref(null)
+const form = reactive({
+    currency: "USD",
+    amount: "",
+    bankCode: '',           // 银行代码(普通银行通道选择)
+    address: '',           // 电子钱包地址 / 数字货币地址(输入/展示)
+    addressName: '',       // 数字货币地址名称(展示)
+    addressProve: '',      // 数字货币地址证明文件路径(仅展示))
+    bankUname: '',         // 持卡人姓名
+    bankCardNum: '',       // 银行卡号
+    bankName: '',          // 银行名称
+    bankBranchName: '',    // 支行名称
+    swiftCode: '',         // SWIFT代码
+    customBankCode: '',    // 自定义银行代码
+    bankAddr: '',          // 银行地址
+    agencyNo: '',          // 代理机构编号(电汇专用,可编辑)
+    cpf: '',               // CPF号码(电汇专用,可编辑)
+    cvv: '',               // CVV码(电汇专用,可编辑)
+    expiryYearMonth: '',   // 过期年(电汇专用,可编辑)
+    agree2: false,
+    agree3: false,
+
+})
+const mAmount = reactive({
+    minAmount: "",
+    maxAmount: ""
+})
+const introduce = reactive({
+    introduce: "",
+    enIntroduce: ""
+})
+const bankInfoList = ref([])
+const bank = ref("")
+const myId = ref("")
+const bankPayType = ref("")
+const step3_bank_cur = ref("")
+const agree2 = ref(false)
+const form1 = ref({})
+const dialogCheck = ref(false)
+const dialogKyc = ref(false)
+const dialogVisible = ref(false)
+const dialogCheckWait = ref(false)
+const dialogCheckInto = ref(false)
+const dialogCheckInto1 = ref(false)
+const dialogNewBank = ref(false)
+const params = reactive({
+    bankCardNum: "",
+    bankUname: "",
+    bankName: "",
+    bankBranchName: "",
+    bankAddr: "",
+    swiftCode: "",
+    bankFront: "",
+    bankBack: "",
+    defaultBank: false
+})
+const resetForm = async () => {
+    await nextTick();
+    formRef.value?.clearValidate();   // 再次清除可能因数据重置产生的新错误
+    params.bankCardNum = ""
+    params.bankUname = ""
+    params.bankName = ""
+    params.bankBranchName = ""
+    params.bankAddr = ""
+    params.swiftCode = ""
+    params.bankFront = ""
+    params.bankBack = ""
+    params.defaultBank = false
+    form.amount = ""
+    form.amount1 = ""
+    form.bankCode = ""
+    form.address = ""
+    form.addressName = ""
+    form.addressProve = ""
+    form.bankUname = ""
+    form.bankCardNum = ""
+    form.swiftCode = ""
+    form.customBankCode = ""
+    form.bankAddr = ""
+    form.agencyNo = ""
+    form.bankName = ""
+    form.cpf = ""
+    form.bankBranchName = ""
+    form.cpf = ""
+    form.cvv = ""
+    form.expiryYearMonth = ""
+    form.agree2 = false
+    form.agree3 = false
+    amountErrorMessage.value = ""
+    flag.value = false
+    loginValue.value = ""
+    dialogCheck.value = false
+    dialogVisible.value = false
+}
+const dialogTips = ref(false)
+const dialogTipsIsShow = ref(true)
+const dialogCheckConfirm = ref(false)
+const dialogCheckConfirm_form = reactive({
+    amount: "",
+    feeAmount: ""
+})
+// 验证规则(保留原结构,实际验证需配合表单组件)
+const rules = computed(() => ({
+    bankCardNum: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.input.empty'),
+                trigger: 'blur',
+            },
+        ],
+    },
+    bankUname: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.input.empty'),
+                trigger: 'blur',
+            },
+        ],
+    },
+    bankName: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.input.empty'),
+                trigger: 'blur',
+            },
+        ],
+    },
+    bankBranchName: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.input.empty'),
+                trigger: 'blur',
+            },
+        ],
+    },
+    bankAddr: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.input.empty'),
+                trigger: 'blur',
+            },
+        ],
+    },
+    swiftCode: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.input.empty'),
+                trigger: 'blur',
+            },
+        ],
+    },
+    defaultBank: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.select.empty'),
+                trigger: 'change',
+            },
+        ],
+    },
+    bankCode: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.select.empty'),
+                trigger: 'change',
+            },
+        ],
+    },
+    message: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.input.empty'),
+                trigger: 'blur',
+            },
+        ],
+    },
+    address: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.input.empty'),
+                trigger: 'blur',
+            },
+        ],
+    },
+    amount: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.amount.format'),
+            },
+            {
+                validateFunction: (rule, value, data, callback) => {
+                    if (value && (Number(mAmount.minAmount) > Number(value) || Number(mAmount.maxAmount) < Number(value))) {
+                        callback(t('vaildate.amount.amount') + mAmount.minAmount + ' - ' + mAmount.maxAmount);
+                        return false;
+                    }
+                    if (/^[0-9]+([.]{1}[0-9]{1,2})?$/.test(value)) {
+                        return true;
+                    } else {
+                        callback(t('vaildate.amount.format'));
+                        return false;
+                    }
+                },
+                trigger: 'blur',
+            },
+        ],
+    },
+    agree2: {
+        rules: [
+            {
+                validateFunction: (rule, value, data, callback) => {
+                    if (form.agree2) {
+                        return true;
+                    } else {
+                        callback(t('vaildate.agree.empty'));
+                        return false;
+                    }
+                },
+                trigger: 'change',
+            },
+        ],
+    },
+    agree3: {
+        rules: [
+            {
+                validateFunction: (rule, value, data, callback) => {
+                    if (form.agree3) {
+                        return true;
+                    } else {
+                        callback(t('vaildate.agree.empty'));
+                        return false;
+                    }
+                },
+                trigger: 'change',
+            },
+        ],
+    },
+    agencyNo: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.input.empty'),
+                trigger: 'blur',
+            },
+        ],
+    },
+    cpf: {
+        rules: [
+            {
+                required: true,
+                errorMessage: t('vaildate.input.empty'),
+                trigger: 'blur',
+            },
+        ],
+    },
+}));
+const amountErrorMessage = ref('')
+const validateAmount = () => {
+    const amount = form.amount
+    if (!amount && amount !== 0) {
+        amountErrorMessage.value = t('vaildate.amount.format')
+        return false
+    }
+    if (mAmount.minAmount && mAmount.maxAmount) {
+        const min = Number(mAmount.minAmount);
+        const max = Number(mAmount.maxAmount);
+        const numValue = Number(amount);
+        if (numValue < min || numValue > max) {
+            amountErrorMessage.value = t('vaildate.amount.amount') + min + '-' + max
+            return false
+        }
+    }
+    if (!/^[0-9]+([.]{1}[0-9]{1,2})?$/.test(amount)) {
+        amountErrorMessage.value = t('vaildate.amount.format')
+        return false
+    }
+    amountErrorMessage.value = ''
+    return true
+}
+// ---------- 计算属性 ----------
+const loginComboxOptions = computed(() => {
+    return loginOptions.value.map((item, index) => ({
+        text: item.label,
+        value: item.login
+    }))
+})
+const digitalOptions = computed(() => {
+    return ruleForm.bankBlockchain.map((item, index) => ({
+        text: `${item.addressName}-${item.address}`,
+        value: item.id
+    }))
+})
+const groupTitleMap = {
+    'Ucard_Wallet': 'card.title',
+    'Digital_Currency': 'Custom.Deposit.Channel3',
+    'China_UnionPay': 'Custom.Deposit.Channel2',
+    'Electronic_Wallet': 'Custom.Deposit.Channel4',
+    'International_Transfer': 'Custom.Deposit.Channel1',
+    'CHANNEL_TYPE_CARD': 'PersonalManagement.Label.CreditCard',
+    'CHANNEL_TYPE_ALI_WALLET': 'Label.Ali'
+}
+const getWalletLabel = computed(() => {
+    if (channelData.value.type === 'CHANNEL_TYPE_WALLET') return t('Custom.Withdraw.Title7')
+    if (channelData.value.type === 'CHANNEL_TYPE_ALI_WALLET') return t('Label.AliAccout')
+    return ''
+})
+const bankCardOptions = computed(() => {
+    return bankList.value.map((item, index) => ({
+        text: getBankLabel(item),
+        value: item.id
+    }))
+})
+const getBankLabel = (item) => {
+    if (channelData.value.type === 'BANK' || channelData.value.type === 'BANK_TELEGRAPHIC') {
+        return `${item.bankName}-${item.bankCardNum}`
+    } else if (channelData.value.type === 'CHANNEL_TYPE_CARD') {
+        return item.bankCardNum
+    }
+    return ''
+}
+const bankList = computed(() => {
+    if (channelData.value.type === 'BANK') return ruleForm.bankInfo
+    if (channelData.value.type === 'BANK_TELEGRAPHIC') return ruleForm.bankWrit
+    if (channelData.value.type === 'CHANNEL_TYPE_CARD') return ruleForm.xykInfo
+    return []
+})
+const bankOptions = computed(() => {
+    return bankDate.value.map((item, index) => ({
+        text: (locale.value === 'cn' || locale.value === 'zhHant') ? item.name : item.enName,
+        value: item.code
+    }))
+})
+// 最后确认
+const dialogSuccess = computed(() => dialogCheck.value && dialogVisible.value)
+// 最后失败
+const dialogError = computed(() => dialogCheck.value && !dialogVisible.value)
+const userStore = useUserStore()
+const ibInfo = computed(() => {
+    return userStore?.userInfo?.ibInfo || {}
+})
+const getInfoStatus5 = computed(() => {
+    if (ibInfo.value.closeFunctions && ibInfo.value.closeFunctions.length > 0) {
+        return ibInfo.value.closeFunctions.indexOf("8") !== -1
+    }
+    return false
+})
+
+
+const isFree = computed(() => {
+    let flagVal = false
+    const startTime1 = "2024/11/01 00:00:00"
+    const timezone = 2 // 目标时区偏移小时数
+    const now = new Date()
+    const utc = now.getTime() + now.getTimezoneOffset() * 60000
+    const targetTime = new Date(utc + timezone * 3600000).getTime()
+    const start = new Date(startTime1).getTime()
+    if (targetTime > start) flagVal = true
+    return flagVal
+})
+
+// ---------- 方法 ----------
+const getFreeNumber = async () => {
+    if (!isFree.value) return
+    if (getInfoStatus5.value === false) {
+        dialogFreeNumber.value = true
+    }
+    const res = await financialApi.remainingReductionNumber({})
+    if (res.code === Code.StatusOK) {
+        FreeNumber.value = res.data || 0
+    } else {
+        $pigeon.MessageError(res.msg)
+    }
+}
+
+const toHome = () => {
+    uni.reLaunch({ url: "/pages/ib/index" })
+    InfoStatus5.value = false
+}
+
+const isShowDialog = () => {
+    const startTime1 = "2025/2/15 00:00:00"
+    const timezone = 8
+    const now = new Date()
+    const utc = now.getTime() + now.getTimezoneOffset() * 60000
+    const targetTime = new Date(utc + timezone * 3600000).getTime()
+    const start = new Date(startTime1).getTime()
+    if (targetTime > start) {
+        dialogCheckInto.value = false
+        // dialogCheckInto1.value = true
+    } else {
+        dialogCheckInto.value = true
+        dialogCheckInto1.value = false
+    }
+}
+const onAgree3Change = (e) => {
+    form.agree3 = e.detail.value.length > 0
+}
+const onAgree2Change = (e) => {
+    form.agree2 = e.detail.value.length > 0
+}
+const selectChange = () => {
+    // 强制更新视图
+}
+
+// const openAddBankCard = (type) => {
+//     if (type === "add_bankCard") {
+//         if (ruleForm.bankInfo.length === 2) {
+//             $pigeon.MessageConfirm(
+//                 t("Msg.UnionPayCARDS"),
+//                 t("Msg.SystemPrompt"),
+//                 t("Btn.Confirm"),
+//                 t("Btn.Cancel"),
+//                 async () => { },
+//                 () => { }
+//             )
+//         } else {
+//             openType.value = "add_bankCard"
+//             dialogInfoTradingAdd.value = true
+//         }
+//     } else if (type === "add_wireTransfer") {
+//         if (ruleForm.bankWrit.length === 2) {
+//             $pigeon.MessageConfirm(
+//                 t("Msg.WireTransfers"),
+//                 t("Msg.SystemPrompt"),
+//                 t("Btn.Confirm"),
+//                 t("Btn.Cancel"),
+//                 async () => { },
+//                 () => { }
+//             )
+//         } else {
+//             openType.value = "add_wireTransfer"
+//             dialogInfoTradingAdd.value = true
+//         }
+//     } else if (type === "add_CreditCard") {
+//         openType.value = "add_CreditCard"
+//         dialogInfoTradingAdd.value = true
+//     } else if (type === "add_bankBlockchain") {
+//         if (ruleForm.bankBlockchain.length === 2) {
+//             $pigeon.MessageConfirm(
+//                 t("blockchain.item9"),
+//                 t("Msg.SystemPrompt"),
+//                 t("Btn.Confirm"),
+//                 t("Btn.Cancel"),
+//                 async () => { },
+//                 () => { }
+//             )
+//         } else {
+//             openType.value = "add_bankBlockchain"
+//             dialogInfoTradingAdd.value = true
+//         }
+//     }
+// }
+// 新增银行信息
+const addBankDialogRef = ref(null);
+function openAddBankCard(type) {
+    console.log(type, 121212)
+    switch (type) {
+        case 'add_bankBlockchain':
+            openAddCrypto()
+            break;
+        case 'add_bankCard':
+            openAddUnionpay()
+            break;
+        case 'add_wireTransfer':
+            openAddBank()
+            break;
+        case 'add_CreditCard':
+            openAddCredit()
+            break;
+    }
+}
+function openAddCrypto() {
+    const wallets = bankCardOptions.value || []
+    console.log(wallets, 12121212);
+    // 1️⃣ 没有钱包
+    if (wallets.length === 0) {
+        addBankDialogRef.value?.open(4);
+        return;
+    }
+    // 2️⃣ 是否存在未认证钱包
+    const hasUnAuth = wallets.some(
+        item => item.authStatus === 0 || item.approveStatus === 1
+    );
+    if (hasUnAuth) {
+        uni.showToast({
+            title: "加密钱包未认证",
+            icon: "none"
+        });
+        return;
+    }
+    // 3️⃣ 是否达到上限
+    if (wallets.length >= 2) {
+        uni.showToast({
+            title: t('blockchain.item9'),
+            icon: "none"
+        });
+        return;
+    }
+    // 4️⃣ 正常打开
+    addBankDialogRef.value?.open(4);
+}
+function openAddUnionpay() {
+    const wallets = bankCardOptions.value || []
+    console.log(wallets, 12121212);
+
+    if (wallets.length === 0) {
+        addBankDialogRef.value?.open(1);
+        return;
+    }
+    if (wallets.length >= 2) {
+        uni.showToast({
+            title: t('Msg.UnionPayCARDS'),
+            icon: "none"
+        });
+        return;
+    }
+    addBankDialogRef.value?.open(1);
+}
+function openAddBank() {
+    const wallets = bankCardOptions.value || []
+    console.log(wallets, 121212)
+    if (wallets.length === 0) {
+        addBankDialogRef.value?.open(2);
+        return;
+    }
+    if (wallets.length >= 2) {
+        uni.showToast({
+            title: t('Msg.WireTransfers'),
+            icon: "none"
+        });
+        return;
+    }
+    addBankDialogRef.value?.open(2);
+}
+function openAddCredit() {
+    const wallets = bankCardOptions.value || []
+    console.log(wallets, 12121212);
+    if (wallets.length === 0) {
+        addBankDialogRef.value?.open(3);
+        return;
+    }
+    addBankDialogRef.value?.open(3);
+}
+// 新增银行信息成功回调
+const addSuccess = (e) => {
+    getBankInfo();
+}
+
+const closeDiaAdd = () => {
+    dialogInfoTradingAdd.value = false
+}
+
+const closeAdd = (val) => {
+    dialogInfoTradingAdd.value = val
+}
+
+const confirmToReload = () => {
+    dialogInfoTradingAdd.value = false
+    getBankInfo()
+}
+
+const getBankInfo = async () => {
+    const res = await financialApi.customBankList({})
+    if (res.code === Code.StatusOK) {
+        ruleForm.bankInfo = []
+        ruleForm.bankWrit = []
+        ruleForm.xykInfo = []
+        ruleForm.bankBlockchain = []
+        res.data.forEach(item => {
+            if (item.type === 1) {
+                item.customBankCode = item.bankCode
+                item.bankCode = null
+                ruleForm.bankInfo.push(item)
+            } else if (item.type === 2) {
+                item.customBankCode = item.bankCode
+                item.bankCode = null
+                ruleForm.bankWrit.push(item)
+            } else if (item.type === 3) {
+                item.customBankCode = item.bankCode
+                item.bankCode = null
+                item.expiryYearMonth = (item.expiryYear || "") + "/" + (item.expiryMonth || "")
+                ruleForm.xykInfo.push(item)
+            } else if (item.type === 4) {
+                item.customBankCode = item.bankCode
+                item.bankCode = null
+                ruleForm.bankBlockchain.push(item)
+            }
+            if (channelData.value.type === "BANK" && item.defaultBank && item.type === 1) {
+                Object.assign(form, item)
+                myId.value = form.id
+            }
+            if (channelData.value.type === "BANK_TELEGRAPHIC" && item.defaultBank && item.type === 2) {
+                Object.assign(form, item)
+                myId.value = form.id
+            }
+            if (channelData.value.type === "CHANNEL_TYPE_CARD" && item.defaultBank && item.type === 3) {
+                myId.value = item.id
+                Object.assign(form, item)
+            }
+            if (channelData.value.type === "DIGITAL_CURRENCY" && item.defaultBank && item.type === 4) {
+                myId.value = item.id
+                Object.assign(form, item)
+            }
+        })
+    } else {
+        $pigeon.MessageError(res.msg)
+    }
+}
+const onDigitalCurrencyChange = (val) => {
+    const item = ruleForm.bankBlockchain.find(b => b.id === val)
+    chooseBank(item.id)
+}
+const chooseBank = (id) => {
+    const item = bankList.value.find(b => b.id === id)
+    // if (!item) {
+    //     showToast(t("Msg.item11"));
+    //     return;
+    // }
+    let codeCache = ""
+    if (form.bankCode) codeCache = form.bankCode
+    Object.assign(form, item)
+    form.agree2 = false
+    form.agree3 = false
+    if (channelData.value.type === "BANK_TELEGRAPHIC") {
+        form.currency = "USD"
+        if (codeCache) form.bankCode = codeCache
+    }
+}
+
+const openTips = async () => {
+    if (channelData.value.type === "BANK_TELEGRAPHIC" && !myId.value) {
+        $pigeon.MessageWarning(t("vaildate.withdrawBank.empty"))
+        return
+    }
+    if (channelData.value.type === "BANK" && !myId.value) {
+        $pigeon.MessageWarning(t("vaildate.withdrawBank.empty"))
+        return
+    }
+    if (channelData.value.type === "CHANNEL_TYPE_CARD" && !myId.value) {
+        $pigeon.MessageWarning(t("vaildate.withdrawBank.empty"))
+        return
+    }
+    if (channelData.value.type === "DIGITAL_CURRENCY" && !myId.value) {
+        $pigeon.MessageWarning(t("blockchain.item11"))
+        return
+    }
+    // 此处模拟表单验证,实际应调用 uni-forms 的 validate
+    try {
+        if (formRef.value) {
+            const valid = await formRef.value.validate()
+            if (dialogTipsIsShow.value) {
+                dialogTips.value = true
+            } else {
+                submit("form")
+            }
+        }
+    } catch (error) {
+        if (error instanceof Array) {
+            showToast(error[0].errorMessage);
+            return
+        } else {
+            RES.value = error.msg;
+        }
+    }
+}
+
+const openTipsConfirm = () => {
+    dialogCheckConfirm.value = false
+    submit("form")
+}
+
+const closeTipsConfirm = () => {
+    dialogTips.value = false
+    dialogCheckConfirm.value = true
+}
+
+const closeDia = () => {
+    resetForm()
+    isStep3.value = false
+    step2.value = false
+    dialogCheck.value = false
+    dialogVisible.value = false
+    showTable()
+}
+
+const qrCode = async (serial) => {
+    metaInfo.value = getMetaInfo()
+    const res = await customApi.getWebsdkLink1({
+        serial,
+        metaInfo: metaInfo.value
+    })
+    if (res.code === Code.StatusOK) {
+        text1.value = JSON.parse(res.data).url
+        dialogKyc.value = true
+        flag.value = false
+    } else {
+        flag.value = false
+    }
+}
+
+const submit = async (formName) => {
+    if (channelData.value.type === "BANK_TELEGRAPHIC" && !myId.value) {
+        $pigeon.MessageWarning(t("vaildate.withdrawBank.empty"))
+        return
+    }
+    if (channelData.value.type === "BANK" && !myId.value) {
+        $pigeon.MessageWarning(t("vaildate.withdrawBank.empty"))
+        return
+    }
+    if (channelData.value.type === "CHANNEL_TYPE_CARD" && !myId.value) {
+        $pigeon.MessageWarning(t("vaildate.withdrawBank.empty"))
+        return
+    }
+    if (channelData.value.type === "DIGITAL_CURRENCY" && !myId.value) {
+        $pigeon.MessageWarning(t("blockchain.item11"))
+        return
+    }
+    // 模拟表单验证
+    try {
+        if (formRef.value) {
+            await formRef.value.validate()
+            if (flag.value) return
+            flag.value = true
+            dialogCheckWait.value = true
+            form.amount = Number(form.amount)
+            let res
+            if (channelData.value.type === "DIGITAL_CURRENCY") {
+                res = await financialApi.ibWithdrawAapplyDigitalCurrency(channelData.value.requestUrl, {
+                    // login: loginValue.value,
+                    payType: channelData.value.code,
+                    ...form
+                })
+            } else if (["CHANNEL_TYPE_WALLET", "UCARD_WALLET", "CHANNEL_TYPE_ALI_WALLET"].includes(channelData.value.type)) {
+                res = await financialApi.ibWithdrawAapplyDigitalCurrency(channelData.value.requestUrl, {
+                    // login: loginValue.value,
+                    payType: channelData.value.code,
+                    ...form
+                })
+            } else if (channelData.value.type === "BANK" || channelData.value.type === "BANK_TELEGRAPHIC") {
+                res = await financialApi.ibWithdrawApplyBank(channelData.value.requestUrl, {
+                    // login: loginValue.value,
+                    payType: channelData.value.code,
+                    ...form
+                })
+            } else if (channelData.value.type === "CHANNEL_TYPE_CARD") {
+                res = await financialApi.WithdrawApplyBank(channelData.value.requestUrl, {
+                    // login: loginValue.value,
+                    payType: channelData.value.code,
+                    ...form
+                })
+            }
+
+            if (res && res.code === Code.StatusOK) {
+                dialogCheck.value = true
+                dialogVisible.value = true
+                // qrCode(res.data)
+                flag.value = false
+            } else {
+                RES.value = res?.msg || "error"
+                dialogCheck.value = true
+                dialogVisible.value = false
+                flag.value = false
+            }
+            dialogCheckWait.value = false
+        }
+    } catch (error) {
+        if (error instanceof Array) {
+            showToast(error[0].errorMessage);
+            return
+        } else {
+            RES.value = error.msg;
+            dialogCheck.value = true;
+            dialogCheckWait.value = false;
+            dialogVisible.value = false;
+            flag.value = false;
+        }
+    }
+
+
+}
+
+const Initialize = () => {
+    loginValue.value = ""
+    isStep3.value = false
+    step2.value = false
+    step3.value = false
+    showTable()
+}
+
+const isShowStep3 = (row) => {
+    
+    return
+
+    if (row.bankValid && isChannel.value) {
+        getBankList(row)
+        isChannel.value = false
+        step3.value = true
+        channelData.value = row
+        mAmount.minAmount = row.minAmount
+        mAmount.maxAmount = row.maxAmount
+    } else {
+        step3.value = true
+        bankDate.value = []
+        channelData.value = row
+        mAmount.minAmount = row.minAmount
+        mAmount.maxAmount = row.maxAmount
+    }
+    if (row.code === "UNION_PAY_TELEGRAPHIC") {
+        WireTransferAccount.value = JSON.parse(row.property)
+    }
+    if (["BANK", "BANK_TELEGRAPHIC", "CHANNEL_TYPE_CARD", "DIGITAL_CURRENCY"].includes(row.type)) {
+        getBankInfo()
+        step3_bank_cur.value = "bank"
+        form.login = loginValue.value
+        form.payType = row.code
+        bankPayType.value = row.code
+    }
+    // 重置 tableData
+    tableData.International_Transfer = []
+    tableData.China_UnionPay = []
+    tableData.Digital_Currency = []
+    tableData.CHANNEL_TYPE_CARD = []
+    tableData.Electronic_Wallet = []
+    tableData.CHANNEL_TYPE_ALI_WALLET = []
+    tableData.UCARD_WALLET = []
+    if (row.type === "BANK_TELEGRAPHIC") tableData.International_Transfer[0] = row
+    if (row.type === "BANK") tableData.China_UnionPay[0] = row
+    if (row.type === "DIGITAL_CURRENCY") tableData.Digital_Currency[0] = row
+    if (row.type === "CHANNEL_TYPE_WALLET") tableData.Electronic_Wallet[0] = row
+    if (row.type === "UCARD_WALLET") tableData.UCARD_WALLET[0] = row
+    if (row.type === "CHANNEL_TYPE_CARD") tableData.CHANNEL_TYPE_CARD[0] = row
+    if (row.type === "CHANNEL_TYPE_ALI_WALLET") tableData.CHANNEL_TYPE_ALI_WALLET[0] = row
+    introduce.introduce = row.introduce
+    introduce.enIntroduce = row.enIntroduce
+}
+
+const showTable = () => {
+    resetForm()
+    myId.value = null
+    step3.value = false
+    isStep3.value = false
+    isChannel.value = true
+    getDepositList()
+    // 重置表单
+    form.currency = "USD"
+    // 其他重置...
+}
+
+const getDateList = async () => {
+    const res = await customApi.CustomDropdown({ platform: "" })
+    if (res.code === Code.StatusOK) {
+        loginOptions.value = res.data
+    } else {
+        $pigeon.MessageError(res.msg)
+    }
+}
+
+const getDepositList = async () => {
+    pictLoading.value = true
+    tableData.International_Transfer = []
+    tableData.China_UnionPay = []
+    tableData.Digital_Currency = []
+    tableData.CHANNEL_TYPE_CARD = []
+    tableData.Electronic_Wallet = []
+    tableData.CHANNEL_TYPE_ALI_WALLET = []
+    tableData.UCARD_WALLET = []
+    const res = await financialApi.RemitChannelList({})
+    if (res.code === Code.StatusOK) {
+        res.data.forEach(item => {
+            if (item.type === "BANK_TELEGRAPHIC") tableData.International_Transfer.push(item)
+            if (item.type === "BANK") tableData.China_UnionPay.push(item)
+            if (item.type === "DIGITAL_CURRENCY") tableData.Digital_Currency.push(item)
+            if (item.type === "CHANNEL_TYPE_WALLET") tableData.Electronic_Wallet.push(item)
+            if (item.type === "UCARD_WALLET") tableData.UCARD_WALLET.push(item)
+            if (item.type === "CHANNEL_TYPE_CARD") tableData.CHANNEL_TYPE_CARD.push(item)
+            if (item.type === "CHANNEL_TYPE_ALI_WALLET") tableData.CHANNEL_TYPE_ALI_WALLET.push(item)
+        })
+        pictLoading.value = false
+    } else {
+        $pigeon.MessageError(res.msg)
+        pictLoading.value = false
+    }
+}
+
+const getBankList = async (row) => {
+    const res = await financialApi.BankList({ channelCode: row.code })
+    if (res.code === Code.StatusOK) {
+        const bank = res.data
+        const data = []
+        bank.forEach(j => {
+            if (!j.minAmount && j.minAmount !== 0) j.minAmount = row.minAmount
+            if (!j.maxAmount && j.maxAmount !== 0) j.maxAmount = row.maxAmount
+            j.payType = row.code
+            data.push(j)
+        })
+        bankDate.value = data
+    } else {
+        $pigeon.MessageError(res.msg)
+    }
+}
+
+const cancelBank = () => {
+    dialogNewBank.value = false
+    // 重置 params 表单
+    Object.assign(params, {
+        bankCardNum: "",
+        bankUname: "",
+        bankName: "",
+        bankBranchName: "",
+        bankAddr: "",
+        swiftCode: "",
+        bankFront: "",
+        bankBack: "",
+        defaultBank: false
+    })
+}
+
+// ---------- 生命周期 ----------
+onMounted(() => {
+    if (getInfoStatus5.value) {
+        InfoStatus5.value = true
+        return
+    }
+    getFreeNumber()
+    isShowDialog()
+    // getDateList()
+    getDepositList()
+})
+
+// 监听 value 变化
+watch(loginValue, (newVal) => {
+    if (newVal) {
+        step2.value = true
+        showTable()
+    }
+})
+
+// 监听 form.amount 变化
+watch(() => form.amount, (newVal) => {
+    if (newVal && channelData.value.rate) {
+        form.amount1 = (newVal * channelData.value.rate).toFixed(2)
+    }
+})
+</script>
+
+<style lang="scss" scoped>
+@import "@/uni.scss";
+
+.custom-withdraw {
+
+    .box {
+        margin-bottom: px2rpx(20);
+
+        .b-card {
+            background: #fff;
+            border-radius: px2rpx(12);
+            padding: px2rpx(20);
+            box-shadow: 0 px2rpx(4) px2rpx(12) rgba(0, 0, 0, 0.03);
+
+            .card-top {
+                .tit {
+                    font-size: px2rpx(16);
+                    font-weight: 600;
+                    margin-bottom: px2rpx(16);
+                    display: flex;
+                    align-items: center;
+                    color: var(--color-navy-900);
+                    position: relative;
+                    padding-left: 20px;
+
+                    &:after {
+                        content: '';
+                        position: absolute;
+                        left: 0;
+                        top: 50%;
+                        transform: translateY(-50%);
+                        width: 0;
+                        height: 0;
+                        border-top: 6px solid transparent;
+                        border-bottom: 6px solid transparent;
+                        border-left: 8px solid currentColor;
+                    }
+
+                    .iconfont {
+                        margin-right: px2rpx(8);
+                        color: var(--color-primary);
+                        font-size: px2rpx(18);
+                    }
+                }
+            }
+
+            .channelType {
+                font-size: px2rpx(15);
+                font-weight: 600;
+                margin: px2rpx(24) 0 px2rpx(12);
+                color: var(--color-navy-700);
+                padding-left: px2rpx(8);
+                border-left: px2rpx(4) solid var(--color-primary);
+            }
+        }
+    }
+
+    .reselect-btn {
+        margin-top: px2rpx(20);
+        display: flex;
+        justify-content: flex-end;
+    }
+
+    .s-btn {
+        &.reselect {
+            background-color: var(--color-zinc-100);
+            color: var(--color-navy-700);
+            border: none;
+            font-size: px2rpx(14);
+            padding: px2rpx(8) px2rpx(20);
+            border-radius: px2rpx(8);
+
+            &:active {
+                background-color: var(--color-zinc-200);
+            }
+        }
+
+        &[type="primary"] {
+            width: 100%;
+            height: px2rpx(48);
+            background-color: #cf1322;
+            color: #fff;
+            border-radius: px2rpx(12);
+            font-size: px2rpx(16);
+            font-weight: 600;
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            border: none;
+            margin-top: px2rpx(30);
+            transition: all 0.2s;
+
+            &:active {
+                transform: scale(0.98);
+                background: var(--color-navy-800);
+            }
+        }
+    }
+
+    .add-back {
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        margin-bottom: px2rpx(12);
+        padding: px2rpx(12) px2rpx(16);
+        background: var(--color-zinc-100);
+        border-radius: px2rpx(8);
+
+        text {
+            font-size: px2rpx(14);
+            color: var(--color-navy-700);
+            font-weight: 500;
+        }
+
+        .add-btn {
+            color: var(--color-primary);
+            font-weight: 600;
+            text-decoration: underline;
+
+            &:active {
+                opacity: 0.7;
+            }
+        }
+    }
+
+    .proof {
+        margin-top: px2rpx(8);
+        border: px2rpx(1) dashed var(--color-zinc-300);
+        border-radius: px2rpx(8);
+        padding: px2rpx(8);
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        background: var(--color-zinc-50);
+
+        .state {
+            padding: px2rpx(4) px2rpx(12);
+            border-radius: px2rpx(4);
+            font-size: px2rpx(12);
+            font-weight: bold;
+        }
+    }
+
+    .agree {
+        margin: px2rpx(24) 0;
+        display: flex;
+        align-items: flex-start;
+
+        .checkbox {
+            display: flex;
+            align-items: flex-start;
+            gap: px2rpx(8);
+
+            :deep(uni-checkbox .uni-checkbox-input) {
+                border-radius: px2rpx(4);
+                width: px2rpx(18);
+                height: px2rpx(18);
+            }
+
+            text {
+                font-size: px2rpx(13);
+                color: var(--color-zinc-500);
+                line-height: 1.5;
+            }
+        }
+    }
+
+    .step3-attention {
+        // background: var(--color-error-50, #fff1f0);
+        border-radius: px2rpx(12);
+        margin-bottom: px2rpx(20);
+
+        .tips {
+            line-height: 1.8;
+            font-size: px2rpx(12);
+            color: #909399;
+            background-color: #f9f9f9;
+            padding: px2rpx(12);
+            border-radius: px2rpx(4);
+            border-left: px2rpx(2) solid #409eff;
+
+            .title {
+                font-weight: 600;
+                margin-bottom: px2rpx(6);
+                color: #606266;
+            }
+        }
+
+        .attention {
+            font-size: px2rpx(14);
+            //  color: var(--color-error-600, #cf1322);
+            line-height: 1.6;
+        }
+
+        .btn-bottom {
+            margin-top: px2rpx(20);
+            display: flex;
+            justify-content: center;
+
+            .btn {
+                background: var(--color-error-600, #cf1322);
+                color: #fff;
+                padding: px2rpx(10) px2rpx(48);
+                border-radius: px2rpx(24);
+                font-size: px2rpx(15);
+                font-weight: 700;
+                box-shadow: 0 px2rpx(4) px2rpx(10) rgba(207, 19, 34, 0.2);
+                transition: all 0.2s;
+
+                &:active {
+                    transform: scale(0.96);
+                    opacity: 0.8;
+                }
+            }
+        }
+    }
+
+    :deep(.base-info-form) {
+        .uni-row1 {
+            .uni-col {
+                padding: 0 px2rpx(10) !important;
+            }
+
+            .uni-forms-item {
+                min-height: px2rpx(36);
+                margin-bottom: px2rpx(28);
+            }
+
+            .uni-select,
+            .uni-combox,
+            .uni-easyinput__content,
+            .uni-date-editor--x {
+                border: none !important;
+                background-color: var(--color-zinc-100) !important;
+                border-radius: px2rpx(8) !important;
+            }
+
+            .uni-date-x {
+                border: none !important;
+                background-color: rgba(195, 195, 195, 0) !important;
+            }
+
+            .uni-easyinput__content-input {
+                height: px2rpx(35) !important;
+            }
+        }
+    }
+
+    @keyframes rotate {
+        from {
+            transform: rotate(0deg);
+        }
+
+        to {
+            transform: rotate(360deg);
+        }
+    }
+}
+</style>

+ 8 - 0
static/svg-icons-lib.js

@@ -71,6 +71,10 @@ const collections = {
         "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 640\"><!--!Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2026 Fonticons, Inc.--><path fill=\"#22ac38\" d=\"M335.9 84.2c-9.8-5.6-21.9-5.6-31.8 0l-224 128c-12.6 7.2-18.8 22-15.1 36S81.5 272 96 272h32v208l-51.2 38.4c-8.1 6-12.8 15.5-12.8 25.6 0 17.7 14.3 32 32 32h448c17.7 0 32-14.3 32-32 0-10.1-4.7-19.6-12.8-25.6L512 480V272h32c14.5 0 27.2-9.8 30.9-23.8s-2.5-28.8-15.1-36l-224-128zM464 272v208h-64V272zm-112 0v208h-64V272zm-112 0v208h-64V272zm80-112c17.7 0 32 14.3 32 32s-14.3 32-32 32-32-14.3-32-32 14.3-32 32-32\"/></svg>",
         2
       ],
+      "crm-card": [
+        "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"#22ac38\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"tabler-icon tabler-icon-layout-grid\" viewBox=\"0 0 24 24\"><path d=\"M4 5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1zm10 0a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1zM4 15a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1zm10 0a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v4a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1z\"/></svg>",
+        2
+      ],
       "crm-caret-right": [
         "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 640\"><!--!Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2026 Fonticons, Inc.--><path fill=\"#22ac38\" d=\"M441.3 299.8c10.2 12.6 9.5 31.1-2.2 42.8l-128 128c-9.2 9.2-22.9 11.9-34.9 6.9s-19.7-16.6-19.7-29.5V192c0-12.9 7.8-24.6 19.8-29.6s25.7-2.2 34.9 6.9l128 128 2.2 2.4z\"/></svg>",
         2
@@ -167,6 +171,10 @@ const collections = {
         "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 640\"><!--!Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2026 Fonticons, Inc.--><path fill=\"#22ac38\" d=\"M535.3 70.7c6.4-6.1 15.7-8.3 24.3-5.5C569.4 68.5 576 77.7 576 88v186.9C576 406.1 467.9 512 337.2 512c-77 0-143.4-49.5-167.5-118.7C134.3 424.1 112 469.4 112 520c0 13.3-10.7 24-24 24s-24-10.7-24-24c0-74.9 38.2-140.9 96.1-179.7C195.4 316.7 237.5 304 280 304h80c13.3 0 24-10.7 24-24s-10.7-24-24-24h-80c-39.7 0-77.3 8.8-111 24.5 23.3-70 89.2-120.5 167-120.5 66.4 0 115.8-22.1 148.7-44 19.2-12.8 35.5-28.1 50.7-45.3z\"/></svg>",
         2
       ],
+      "crm-list": [
+        "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"#22ac38\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" class=\"tabler-icon tabler-icon-list\" viewBox=\"0 0 24 24\"><path d=\"M9 6h11M9 12h11M9 18h11M5 6v.01M5 12v.01M5 18v.01\"/></svg>",
+        2
+      ],
       "crm-lock": [
         "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 640\"><!--!Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2026 Fonticons, Inc.--><path fill=\"#22ac38\" d=\"M256 160v64h128v-64c0-35.3-28.7-64-64-64s-64 28.7-64 64m-64 64v-64c0-70.7 57.3-128 128-128s128 57.3 128 128v64c35.3 0 64 28.7 64 64v224c0 35.3-28.7 64-64 64H192c-35.3 0-64-28.7-64-64V288c0-35.3 28.7-64 64-64\"/></svg>",
         2

+ 55 - 6
stores/use-user-store.ts

@@ -16,20 +16,42 @@ export interface AccountInfo {
   password: string;
   rememberPassword: boolean;
 }
-const STORAGE_KEY = "user";
-const ACCOUNT_INFO_KEY = "accountInfo";
-const ID_TYPE_OPTIONS_KEY = "reasonsOptions";
-const APP_VERSION = 'appVersion'
-const PROBLEM_DETAILS_KEY = "problemDetails";
-const LOGIN_OPTIONS_KEY = "loginOptions";
+const STORAGE_KEY = "USER";
+const ACCOUNT_INFO_KEY = "ACCOUNT_INFO_KEY";
+const ID_TYPE_OPTIONS_KEY = "ID_TYPE_OPTIONS_KEY";
+const APP_VERSION = 'APP_VERSION'
+const PROBLEM_DETAILS_KEY = "PROBLEM_DETAILS_KEY";
+const LOGIN_OPTIONS_KEY = "LOGIN_OPTIONS_KEY";
+const PAYMENT_CHANNEL_KEY = "PAYMENT_CHANNEL_KEY";
+const CHANNEL_LIST_KEY = "CHANNEL_LIST_KEY";
 const useUserStore = defineStore("userStore", () => {
   const userInfo = ref<UserInfo | null>(null);
   const accountInfo = ref<AccountInfo | null>(null);
   const isLoggedIn = ref(false);
   const reasonsOptions = ref<any>(null);
   const loginOptions = ref<any>(null);
+  const paymentChannel = ref<any>(null);
+  const channelList = ref<any>(null);
   const appVersion = ref<any>(null);
   const problemDetails = ref<any>(null);
+  const initChannel = () => {
+    const encryptedInfo = ls.get(PAYMENT_CHANNEL_KEY);
+    if (encryptedInfo) {
+      const decryptedInfo = crypt.decrypt(encryptedInfo);
+      if (decryptedInfo) {
+        paymentChannel.value = JSON.parse(decryptedInfo);
+      }
+    }
+  };
+  const initChannelList = () => {
+    const encryptedInfo = ls.get(CHANNEL_LIST_KEY);
+    if (encryptedInfo) {
+      const decryptedInfo = crypt.decrypt(encryptedInfo);
+      if (decryptedInfo) {
+        channelList.value = JSON.parse(decryptedInfo);
+      }
+    }
+  };
   const initUserInfo = () => {
     const encryptedInfo = ls.get(STORAGE_KEY);
     if (encryptedInfo) {
@@ -95,6 +117,16 @@ const useUserStore = defineStore("userStore", () => {
     const encryptedInfo = crypt.encrypt(JSON.stringify(info));
     ls.set(STORAGE_KEY, encryptedInfo);
   };
+  const savePaymentChannel = (info: any) => {
+    paymentChannel.value = info;
+    const encryptedInfo = crypt.encrypt(JSON.stringify(info));
+    ls.set(PAYMENT_CHANNEL_KEY, encryptedInfo);
+  };
+  const saveChannelList = (info: any) => {
+    channelList.value = info;
+    const encryptedInfo = crypt.encrypt(JSON.stringify(info));
+    ls.set(CHANNEL_LIST_KEY, encryptedInfo);
+  };
   const saveLoginOptions = (info: any) => {
     loginOptions.value = info;
     const encryptedInfo = crypt.encrypt(JSON.stringify(info));
@@ -126,7 +158,18 @@ const useUserStore = defineStore("userStore", () => {
     userToken.value = "";
     reasonsOptions.value = null;
     loginOptions.value = null;
+    paymentChannel.value = null;
+    channelList.value = null;
+    
     ls.remove(STORAGE_KEY);
+    ls.remove(PAYMENT_CHANNEL_KEY);
+    ls.remove(CHANNEL_LIST_KEY);
+    ls.remove(LOGIN_OPTIONS_KEY);
+    ls.remove(PROBLEM_DETAILS_KEY);
+    ls.remove(APP_VERSION);
+    ls.remove(ID_TYPE_OPTIONS_KEY);
+    ls.remove(ACCOUNT_INFO_KEY);
+
   };
 
   initReasonsOptions();
@@ -135,6 +178,8 @@ const useUserStore = defineStore("userStore", () => {
   initAppVersion();
   initLoginOptions();
   initProblemDetails();
+  initChannel();
+  initChannelList();
   return {
     userInfo,
     accountInfo,
@@ -143,6 +188,10 @@ const useUserStore = defineStore("userStore", () => {
     loginOptions,
     appVersion,
     problemDetails,
+    paymentChannel,
+    channelList,
+    savePaymentChannel,
+    saveChannelList,
     saveProblemDetails,
     saveLoginOptions,
     saveAppVersion,