Handy_Cao 1 년 전
부모
커밋
21e8317c89
24개의 변경된 파일1367개의 추가작업 그리고 34개의 파일을 삭제
  1. 56 1
      oem/tss/locales/extras/en-US.json
  2. 58 3
      oem/tss/locales/extras/th-TH.json
  3. 57 5
      oem/tss/locales/extras/zh-CN.json
  4. 59 4
      oem/tss/locales/extras/zh-TW.json
  5. 9 1
      src/packages/mobile/views/bank/wallet/components/deposit/Index.vue
  6. 2 2
      src/packages/tss/router/index.ts
  7. 3 3
      src/packages/tss/views/bank/capital/index.vue
  8. 114 0
      src/packages/tss/views/bank/sign/Index.vue
  9. 261 0
      src/packages/tss/views/bank/sign/components/edit/Index.vue
  10. 79 0
      src/packages/tss/views/bank/sign/components/edit/search-bank/index.vue
  11. 68 0
      src/packages/tss/views/bank/sign/components/edit/select-bank/index.vue
  12. 19 0
      src/packages/tss/views/bank/sign/index.less
  13. 42 0
      src/packages/tss/views/bank/wallet/Index.vue
  14. 180 0
      src/packages/tss/views/bank/wallet/components/deposit/Index.vue
  15. 65 0
      src/packages/tss/views/bank/wallet/components/deposit/index.less
  16. 77 0
      src/packages/tss/views/bank/wallet/components/inoutapply/Index.vue
  17. 165 0
      src/packages/tss/views/bank/wallet/components/withdraw/Index.vue
  18. 29 0
      src/packages/tss/views/bank/wallet/components/withdraw/index.less
  19. 6 6
      src/packages/tss/views/order/delivery/Index.vue
  20. 7 0
      src/packages/tss/views/order/delivery/components/aftersale/Index.vue
  21. 3 3
      src/packages/tss/views/order/list/Index.vue
  22. 5 4
      src/packages/tss/views/order/list/prepayment/Index.vue
  23. 1 1
      src/packages/tss/views/order/position/Index.vue
  24. 2 1
      src/types/model/order.d.ts

+ 56 - 1
oem/tss/locales/extras/en-US.json

@@ -18,8 +18,12 @@
         "order": "Reservation"
     },
     "account": {
+        "netWorth": "Balance ",
+        "inamount": "CashInToday ",
+        "outamount": "CashOutToday ",
+        "paycharge": "OrderServiceFee ",
         "closepl": "CLosePL",
-        "profitLoss": "ProfitLoss",
+        "profitLoss": "IncreaseOrDecrease ",
         "freezeMargin2": "Deposit"
     },
     "quote": {
@@ -59,7 +63,16 @@
             "title1": "Unsubscribe Detail"
         }
     },
+    "delivery": {
+        "title1": "全款提货",
+        "title2": "预付款提货",
+        "title3": "预付款交货",
+        "title4": "退换货"
+    },
     "order": {
+        "title1": "历史订单",
+        "title2": "全款订单",
+        "title3": "预付款订单",
         "feeTotal": "ServiceCharge:",
         "goodsorder": {
             "buyorsell": "Choice"
@@ -74,6 +87,7 @@
         }
     },
     "position": {
+        "goodscode": "GoodsCode:",
         "transfer": {
             "transferqty":"ReservationQty"
         },
@@ -113,9 +127,48 @@
         }
     },
     "banksign": {
+        "title": "Banks Management",
+        "cancel": "Unbind BankCard",
+        "addbanksign": "Add BankCard",
+        "modifybanksign": "Modify BankCard",
         "capital": {
+            "title2": "Account Info",
             "totalprofit": "TotalProfit:",
             "totalcharge": "TotalCharge:"
+        },
+        "wallet": {
+            "title": "CashIn/CashOut",
+            "cashin": "Cash In",
+            "cashout": "Cash Out",
+            "deposit": {
+                "subtitle": "CashIn Platform",
+                "subtitle1": "CashIn Time",
+                "inamount": "InAmount",
+                "pleaseenterinamount": "Enter in-amount",
+                "time": "Payment time: Working day ",
+                "platformdepositbankname": "PlatformDepositBankName",
+                "platformdepositaccountno": "PlatformDepositAccountNo",
+                "platformdepositaccount": "PlatformDepositAccount",
+                "platformdepositsub-branch": "PlatformDepositSub-Branch",
+                "goldisnotwithinthetimeframe": "Gold is not within the time frame",
+                "notice": "Holidays to the notice, announcement shall prevail, non-working days do not operate!",
+                "whetherthedeposittransferhasbeenmadeatthebankend": "Is golden on bank account transfer?"
+            },
+            "withdraw": {
+                "subtitle": "CashOut Time",
+                "outamount": "OutAmount",
+                "pleaseenteroutamount": "Enter out-amount",
+                "time": "Payment time: Working day ",
+                "theamountavailableis0": "The amount available is 0",
+                "exceedingthepayableamount": "Exceeding the payable amount",
+                "goldisnotwithinthetimeframe": "Gold is not within the time frame",
+                "notice": "Holidays to the notice, announcement shall prevail, non-working days do not operate!",
+                "availableoutmoney": "Available "
+            },
+            "inoutapply": {
+                "title": "Recharge/WithDrawal Logs",
+                "charge": "OrderServiceFee"
+            }
         }
     },
     "report": {
@@ -131,6 +184,8 @@
         }
     },
     "mine": {
+        "fundsinfo": "Account Info",
+        "banksign": "My Banks",
         "delivery": "Delivery",
         "cashin": "Cash In",
         "cashout": "Cash Out",

+ 58 - 3
oem/tss/locales/extras/th-TH.json

@@ -18,8 +18,12 @@
         "order": "การจอง"
     },
     "account": {
-        "closepl": "ส่วนต่างวันนี้",
-        "profitLoss": "ส่วนต่างลอยตัว",
+        "netWorth": "ความสมดุล",
+        "inamount": "เติมเงินวันนี้",
+        "outamount": "ถอนเงินวันนี้",
+        "paycharge": "บริการของคำสั่ง",
+        "closepl": "วันนี้ มีค่ามากขึ้น และลดลง",
+        "profitLoss": "ค่าเพิ่ม และลด",
         "freezeMargin2": "เงินทุน"
     },
     "quote": {
@@ -59,7 +63,16 @@
             "title1": "รายละเอียดการส่งคืน"
         }
     },
+    "delivery": {
+        "title1": "全款提货",
+        "title2": "预付款提货",
+        "title3": "预付款交货",
+        "title4": "退换货"
+    },
     "order": {
+        "title1": "历史订单",
+        "title2": "全款订单",
+        "title3": "预付款订单",
         "feeTotal": "ค่าธรรมเนียม:",
         "goodsorder": {
             "buyorsell": "เลือก"
@@ -74,6 +87,7 @@
         }
     },
     "position": {
+        "goodscode": "商品代码:",
         "transfer": {
             "transferqty":"ปริมาณการยกเลิก"
         },
@@ -113,9 +127,48 @@
         }
     },
     "banksign": {
+        "title": "การจัดการบัตรธนาคาร",
+        "cancel": "แก้มัดบัตรธนาคาร",
+        "addbanksign": "เพิ่มบัตรธนาคาร",
+        "modifybanksign": "แก้ไขบัตรธนาคาร",
         "capital": {
+            "title2": "ข้อมูลบัญชีผู้ใช้",
             "totalprofit": "รายละเอียดส่วนต่าง:",
             "totalcharge": "รายละเอียดค่าธรรมเนียม:"
+        },
+        "wallet": {
+            "title": "เติมเงิน/ถอนเงิน",
+            "cashin": "เติมเงิน",
+            "cashout": "ถอนเงิน",
+            "deposit": {
+                "subtitle": "ไป ที่แพลตฟอร์มทองคำ",
+                "subtitle1": "เวลาทอง",
+                "inamount": "จำนวนเงิน",
+                "pleaseenterinamount": "โปรดกรอกในจำนวนเงิน",
+                "time": "เวลาทอง: วันทำงาน",
+                "platformdepositbankname": "ในธนาคารทองคำ",
+                "platformdepositaccountno": "แพลตฟอร์มเข้าสู่บัญชีผู้ใช้",
+                "platformdepositaccount": "แพลตฟอร์มเข้าสู่บัญชีผู้ใช้",
+                "platformdepositsub-branch": "แพลตฟอร์มสู่คิม",
+                "goldisnotwithinthetimeframe": "มันอยู่นอกกรอบเวลา",
+                "notice": "ห้ามทำการใด ๆ ในวันหยุดโดยมีการแจ้งให้ทราบ และประกาศ",
+                "whetherthedeposittransferhasbeenmadeatthebankend": "มีการโอนเงินเข้าสู่ระบบธนาคาร หรือไม่?"
+            },
+            "withdraw": {
+                "subtitle": "เมื่อเวลาผ่านไป",
+                "outamount": "การจ่ายเงินสด",
+                "pleaseenteroutamount": "กรุณาเติมเงิน",
+                "time": "เวลาออก: วันทำงาน",
+                "theamountavailableis0": "จำนวนเงิน ที่ออกมาเป็น 0",
+                "exceedingthepayableamount": "มากกว่า จำนวนเงิน ที่ใช้ได้",
+                "goldisnotwithinthetimeframe": "ออกจากระยะเวลา",
+                "notice": "ห้ามทำการใด ๆ ในวันหยุดโดยมีการแจ้งให้ทราบ และประกาศ",
+                "availableoutmoney": "จำนวนเงิน"
+            },
+            "inoutapply": {
+                "title": "เติมเงิน/ถอนเงิน",
+                "charge": "บริการของคำสั่ง"
+            }
         }
     },
     "report": {
@@ -131,8 +184,10 @@
         }
     },
     "mine": {
+        "fundsinfo": "ข้อมูลบัญชีผู้ใช้",
+        "banksign": "บัตรธนาคารของฉัน",
         "delivery": "รับสินค้า",
-        "cashin": "ฝากเงิน",
+        "cashin": "เติมเงิน",
         "cashout": "ถอนเงิน",
         "myposition": "ของฉัน",
         "myorder": "สถานะของฉัน",

+ 57 - 5
oem/tss/locales/extras/zh-CN.json

@@ -18,8 +18,12 @@
         "order": "预订"
     },
     "account": {
-        "closepl": "今日差额",
-        "profitLoss": "浮动差额",
+        "netWorth": "余额",
+        "inamount": "今日充值",
+        "outamount": "今日提现",
+        "paycharge": "订单服务费",
+        "closepl": "今日货值增减",
+        "profitLoss": "货值增减",
         "freezeMargin2": "履约准备金"
     },
     "quote": {
@@ -60,9 +64,15 @@
         }
     },
     "delivery": {
-        
+        "title1": "全款提货",
+        "title2": "预付款提货",
+        "title3": "预付款交货",
+        "title4": "退换货"
     },
     "order": {
+        "title1": "历史订单",
+        "title2": "全款订单",
+        "title3": "预付款订单",
         "feeTotal": "服务费:",
         "goodsorder": {
             "buyorsell": "选择"
@@ -77,6 +87,7 @@
         }
     },
     "position": {
+        "goodscode": "商品代码:",
         "transfer": {
             "transferqty":"退订量"
         },
@@ -116,9 +127,48 @@
         }
     },
     "banksign": {
+        "title": "银行卡管理",
+        "cancel": "解绑银行卡",
+        "addbanksign": "添加银行卡",
+        "modifybanksign": "修改银行卡",
         "capital": {
+            "title2": "账户信息",
             "totalprofit": "差额汇总:",
             "totalcharge": "服务费汇总:"
+        },
+        "wallet": {
+            "title": "充值/提现",
+            "cashin": "充值",
+            "cashout": "提现",
+            "deposit": {
+                "subtitle": "充值平台",
+                "subtitle1": "充值时间",
+                "inamount": "充值金额",
+                "pleaseenterinamount": "请填写充值金额",
+                "time": "充值时间:工作日 ",
+                "platformdepositbankname": "平台充值银行",
+                "platformdepositaccountno": "平台充值账号",
+                "platformdepositaccount": "平台充值账户",
+                "platformdepositsub-branch": "平台充值支行",
+                "goldisnotwithinthetimeframe": "充值不在时间范围内",
+                "notice": "節假日以通知、公告爲準,非工作日請勿操作!",
+                "whetherthedeposittransferhasbeenmadeatthebankend": "是否已在银行端进行充值转账?"
+            },
+            "withdraw": {
+                "subtitle": "提现时间",
+                "outamount": "提现金额",
+                "pleaseenteroutamount": "请填写提现金额",
+                "time": "提现时间:工作日 ",
+                "theamountavailableis0": "可提现额为0",
+                "exceedingthepayableamount": "超过可提现金额",
+                "goldisnotwithinthetimeframe": "提现不在时间范围内",
+                "notice": "節假日以通知、公告爲準,非工作日請勿操作!",
+                "availableoutmoney": "可提现金额"
+            },
+            "inoutapply": {
+                "title": "充值/提现记录",
+                "charge": "订单服务费"
+            }
         }
     },
     "report": {
@@ -134,9 +184,11 @@
         }
     },
     "mine": {
+        "fundsinfo": "账户信息",
+        "banksign": "我的银行卡",
         "delivery": "交货提货",
-        "cashin": "入金",
-        "cashout": "出金",
+        "cashin": "充值",
+        "cashout": "提现",
         "myposition": "我的订单",
         "myorder": "订单详情",
         "setting": {

+ 59 - 4
oem/tss/locales/extras/zh-TW.json

@@ -18,8 +18,12 @@
         "order": "預訂"
     },
     "account": {
-        "closepl": "今日差額",
-        "profitLoss": "浮動差額",
+        "netWorth": "餘額",
+        "inamount": "今日充值",
+        "outamount": "今日提現",
+        "paycharge": "訂單服務費",
+        "closepl": "今日貨值增減",
+        "profitLoss": "貨值增減",
         "freezeMargin2": "履約準備金"
     },
     "quote": {
@@ -59,7 +63,16 @@
             "title1": "回購詳情"
         }
     },
+    "delivery": {
+        "title1": "全款提货",
+        "title2": "预付款提货",
+        "title3": "预付款交货",
+        "title4": "退换货"
+    },
     "order": {
+        "title1": "历史订单",
+        "title2": "全款订单",
+        "title3": "预付款订单",
         "feeTotal": "服務費:",
         "goodsorder": {
             "buyorsell": "選擇"
@@ -74,6 +87,7 @@
         }
     },
     "position": {
+        "goodscode": "商品代碼:",
         "transfer": {
             "transferqty":"退訂量"
         },
@@ -113,9 +127,48 @@
         }
     },
     "banksign": {
+        "title": "銀行卡管理",
+        "cancel": "解綁銀行卡",
+        "addbanksign": "添加銀行卡",
+        "modifybanksign": "修改銀行卡",
         "capital": {
+            "title2": "賬戶信息",
             "totalprofit": "差額彙總:",
             "totalcharge": "服務費彙總:"
+        },
+        "wallet": {
+            "title": "充值/提現",
+            "cashin": "充值",
+            "cashout": "提現",
+            "deposit": {
+                "subtitle": "充值平臺",
+                "subtitle1": "充值時間",
+                "inamount": "充值金額",
+                "pleaseenterinamount": "請填寫充值金額",
+                "time": "充值時間:工作日 ",
+                "platformdepositbankname": "平臺充值銀行",
+                "platformdepositaccountno": "平臺充值賬號",
+                "platformdepositaccount": "平臺充值賬戶",
+                "platformdepositsub-branch": "平臺充值支行",
+                "goldisnotwithinthetimeframe": "充值不在時間範圍內",
+                "notice": "節假日以通知、公告爲準,非工作日請勿操作!",
+                "whetherthedeposittransferhasbeenmadeatthebankend": "是否已在銀行端進行充值轉賬?"
+            },
+            "withdraw": {
+                "subtitle": "提現時間",
+                "outamount": "提現金額",
+                "pleaseenteroutamount": "請填寫提現金額",
+                "time": "提現時間:工作日 ",
+                "theamountavailableis0": "可提現額爲0",
+                "exceedingthepayableamount": "超過可提現金額",
+                "goldisnotwithinthetimeframe": "提現不在時間範圍內",
+                "notice": "節假日以通知、公告爲準,非工作日請勿操作!",
+                "availableoutmoney": "可提現金額"
+            },
+            "inoutapply": {
+                "title": "充值/提現記錄",
+                "charge": "訂單服務費"
+            }
         }
     },
     "report": {
@@ -131,9 +184,11 @@
         }
     },
     "mine": {
+        "fundsinfo": "賬戶信息",
+        "banksign": "我的銀行卡",
         "delivery": "交貨提貨",
-        "cashin": "入金",
-        "cashout": "出金",
+        "cashin": "充值",
+        "cashout": "提現",
         "myposition": "我的訂單",
         "myorder": "訂單詳情",
         "setting": {

+ 9 - 1
src/packages/mobile/views/bank/wallet/components/deposit/Index.vue

@@ -4,6 +4,11 @@
             <CellGroup inset v-if="cusBank?.caninamount === 1">
                 <Field type="number" v-model="formData.Amount" :label="$t('banksign.wallet.deposit.inamount')" :placeholder="$t('banksign.wallet.deposit.pleaseenterinamount')"
                     :rules="formRules.Amount" />
+                <Field :label="$t('mine.balance')" readonly >
+                    <template #input>
+                        <span>{{ currentAccount.currentbalance?.toFixed(2) }}</span>
+                    </template>
+                </Field>
                 <Field :label="$t('banksign.wallet.deposit.credit')" :rules="formRules.filePath">
                     <template #input>
                         <app-uploader @success="onUploadSuccess" />
@@ -60,7 +65,7 @@ import { fullloading, dialog } from '@/utils/vant'
 import { useNavigation } from '@mobile/router/navigation'
 import { useDoDeposit, useDoCusBankExtendConfigs } from '@/business/bank'
 import { getServerTime } from '@/services/api/common'
-import { useUserStore, i18n } from '@/stores'
+import { useUserStore, useAccountStore, i18n } from '@/stores'
 import AppUploader from '@mobile/components/base/uploader/index.vue'
 import moment from 'moment'
 
@@ -73,6 +78,9 @@ const certificate_photo_url = ref('')
 const userStore = useUserStore()
 const { global: { t }} = i18n
 
+const accountStore = useAccountStore()
+const { currentAccount } = accountStore.$toRefs()
+
 const msg_320 = getSystemParamValue('320')
 const msg_321 = getSystemParamValue('321')
 const msg_322 = getSystemParamValue('322')

+ 2 - 2
src/packages/tss/router/index.ts

@@ -183,12 +183,12 @@ const routes: Array<RouteRecordRaw> = [
       {
         path: 'wallet',
         name: 'bank-wallet',
-        component: () => import('@mobile/views/bank/wallet/Index.vue'),
+        component: () => import('../views/bank/wallet/Index.vue'),
       },
       {
         path: 'sign',
         name: 'bank-sign',
-        component: () => import('@mobile/views/bank/sign/Index.vue'),
+        component: () => import('../views/bank/sign/Index.vue'),
       },
       {
         path: 'capital',

+ 3 - 3
src/packages/tss/views/bank/capital/index.vue

@@ -5,11 +5,11 @@
         </template>
         <CellGroup v-for="(item, index) in accountStore.accountComputedList" :key="index">
             <Cell :title="$t('account.accountid')" :value="item.accountid" />
-            <Cell :title="$t('account.balance2')" :value="formatDecimal(item.balance)" />
-            <Cell :title="$t('account.currentbalance')" :value="formatDecimal(item.currentbalance)" />
+            <!-- <Cell :title="$t('account.balance2')" :value="formatDecimal(item.balance)" />
+            <Cell :title="$t('account.currentbalance')" :value="formatDecimal(item.currentbalance)" /> -->
             <Cell :title="$t('account.netWorth')" :value="formatDecimal(item.netvalue)" />
             <Cell :title="$t('account.availableFunds2')" :value="formatDecimal(item.avaiableMoney)" />
-            <Cell :title="$t('account.usedMargin2')" :value="formatDecimal(item.usedmargin)" />
+            <!-- <Cell :title="$t('account.usedMargin2')" :value="formatDecimal(item.usedmargin)" /> -->
             <Cell :title="$t('account.freezeMargin2')" :value="formatDecimal(item.freezeMargin)" />
             <Cell :title="$t('account.profitLoss')">
                 <template #value>

+ 114 - 0
src/packages/tss/views/bank/sign/Index.vue

@@ -0,0 +1,114 @@
+<template>
+    <app-view class="bank-sign g-form">
+        <template #header>
+            <app-navbar :title="$t('banksign.title')" />
+        </template>
+        <div class="bank-sign__container" v-if="bankInfo">
+            <CellGroup>
+                <Cell :title="$t('banksign.bankname')" :value="bankInfo.bankname" />
+                <Cell :title="$t('banksign.bankaccountno')" :value="bankInfo.bankaccountno" />
+                <template v-if="bankInfo.signstatus === SignStatus.Signed">
+                    <Cell :title="$t('banksign.bankaccountname')" :value="bankInfo.bankaccountname" />
+                    <Cell :title="$t('banksign.mobilephone')" :value="bankInfo.mobilephone" v-if="bankInfo.mobilephone" />
+                </template>
+                <Cell :title="$t('banksign.branchbankname')" v-if="bankInfo.branchbankname != ''" :value="bankInfo.branchbankname" />
+                <Cell :title="$t('banksign.remark')" v-if="bankInfo.dealstatus === 5 && bankInfo.remark != ''" :value="bankInfo.remark" />
+                <Cell :title="$t('banksign.signstatus')" :value="getSignStatusName(bankInfo.signstatus)" />
+            </CellGroup>
+        </div>
+        <div class="bank-sign__empty" v-else-if="isloaded">
+            <Empty :description="$t('banksign.youhavenotaddedasignedaccount')" />
+            <Button type="danger" @click="showComponent(false)" round>{{ $t('banksign.addbanksign') }}</Button>
+        </div>
+        <template #footer>
+            <div class="g-form__footer inset" v-if="bankInfo">
+                <Button type="danger" round block @click="showComponent(true)"
+                    v-if="[SignStatus.Refuse, SignStatus.Rescinded].includes(bankInfo.signstatus)">{{ $t('banksign.signagain') }}</Button>
+                <Button type="warning" round block @click="formSubmit"
+                    v-if="bankInfo.signstatus === SignStatus.Signed && cusBank?.canrelease === 1">{{ $t('banksign.cancel') }}</Button>
+                <Button type="danger" round block @click="beforeShowComponent"
+                    v-if="bankInfo.signstatus === SignStatus.Signed && cusBank?.canmodifysigninfo === 1">{{ $t('banksign.modify') }}</Button>
+                <Button type="danger" round block @click="showComponent(false)"
+                    v-if="bankInfo.signstatus === SignStatus.Unsigned && cusBank?.cansign === 1">{{ $t('banksign.addbanksign') }}</Button>
+            </div>
+        </template>
+        <component ref="componentRef" v-bind="{ isedit }" :is="componentMap.get(componentId)" @closed="closeComponent"
+            v-if="componentId" />
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { defineAsyncComponent, ref } from 'vue'
+import { CellGroup, Cell, Button, Empty, showFailToast } from 'vant'
+import { fullloading, dialog } from '@/utils/vant'
+import { useComponent } from '@/hooks/component'
+import { getSignStatusName, SignStatus } from '@/constants/bank'
+import { useDoCancelBankSign } from '@/business/bank'
+import { useNavigation } from '@mobile/router/navigation'
+import { useRequest } from '@/hooks/request'
+import { queryCusBankSignBank } from '@/services/api/bank'
+import { shallowRef } from 'vue'
+import { i18n } from "@/stores"
+
+const componentMap = new Map<string, unknown>([
+    ['edit', defineAsyncComponent(() => import('./components/edit/Index.vue'))],
+])
+
+const { t } = i18n.global
+
+const cusBank = shallowRef<Model.CusBankSignBankRsp>()
+const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => formRefresh())
+const { cancelSubmit, formRefresh, bankInfo, isloaded } = useDoCancelBankSign()
+const { router } = useNavigation()
+/// 是否修改
+const isedit = ref(false)
+
+/// 查询托管银行信息
+useRequest(queryCusBankSignBank, {
+    onSuccess: (res) => {
+        /// 签约状态
+        if (res.data.length != 0) {
+            cusBank.value = res.data[0]
+        }
+    }
+})
+
+const formSubmit = () => {
+    dialog({
+        message: t('banksign.tips12'),
+        showCancelButton: true
+    }).then(() => {
+        fullloading((hideLoading) => {
+            cancelSubmit().then(() => {
+                hideLoading()
+                dialog(t('banksign.tips13')).then(() => {
+                    router.back()
+                })
+            }).catch((err) => {
+                showFailToast(err)
+            })
+        })
+    })
+}
+
+const showComponent = (isEdit: boolean) => {
+    isedit.value = isEdit
+    openComponent('edit')
+}
+
+const beforeShowComponent = () => {
+    if (bankInfo.value?.cusbankid === 'jdjs') {
+        dialog(t('banksign.tips9')).then(() => {
+            showComponent(true)
+        })
+    } else {
+        showComponent(true)
+    }
+}
+
+formRefresh()
+</script>
+
+<style lang="less">
+@import './index.less';
+</style>

+ 261 - 0
src/packages/tss/views/bank/sign/components/edit/Index.vue

@@ -0,0 +1,261 @@
+<template>
+    <app-modal direction="right-top" height="100%" width="100%" v-model:show="showModal" :refresh="refresh">
+        <app-view class="g-form">
+            <template #header>
+                <app-navbar :title="isedit ? $t('banksign.modifybanksign') : $t('banksign.addbanksign')"
+                    @back="closed" />
+            </template>
+            <Form ref="formRef" class="g-form__container" @submit="formSubmit">
+                <CellGroup inset>
+                    <Field name="OpenBankAccId" :label="$t('banksign.bankname')" v-model="selectedBankName"
+                        :placeholder="$t('banksign.Pleaseselectyourbank')" :rules="formRules.OpenBankAccId"
+                        @click-input="showSelect = true" readonly is-link />
+                    <Field type="number" name="BankNo" :label="$t('banksign.bankaccountno')"
+                        :readonly="bankaccount != ''" maxlength="30" v-model.trim="formData.BankAccountNo"
+                        :placeholder="$t('banksign.Pleaseenterbankaccountno')" :rules="formRules.BankAccountNo" />
+                    <Field name="AccountName" :label="$t('banksign.bankaccountname')" readonly
+                        v-model="formData.AccountName" :placeholder="$t('banksign.Pleaseenterbankaccountname')"
+                        :rules="formRules.AccountName" />
+                    <Field name="MobilePhone" :label="$t('banksign.mobilephone')" :readonly="mobile2 != ''"
+                        maxlength="50" v-model="formData.MobilePhone"
+                        :placeholder="$t('banksign.Pleaseenteryourmobilephonenumber')" :rules="formRules.MobilePhone" />
+                    <template v-for="(item, index) in configs" :key="index">
+                        <template v-if="(item.fieldcode === 'verify_code')">
+                            <Field v-if="(bankInfo === undefined) && showExtendInfo(item)" v-model="item.value"
+                                type="digit" name="vcode" :label="item.fieldname" :placeholder="$t('common.required')"
+                                autocomplete="off">
+                                <template #button>
+                                    <Button size="small" type="danger" :disabled="isCountdown" @click="sendVerifyCode">
+                                        <span v-if="isCountdown">{{ $t('banksign.sendagain') }}({{ currentTime.seconds
+                                            }})</span>
+                                        <span v-else>{{ $t('banksign.verificationcode') }}</span>
+                                    </Button>
+                                </template>
+                            </Field>
+                        </template>
+                        <template v-else-if="(item.fieldcode === 'bank_branch_name')">
+                            <Field v-if="showExtendInfo(item)" name="OpenBankName" :label="item.fieldname"
+                                v-model="item.value" maxlength="100" right-icon="search"
+                                :placeholder="$t('common.pleaseenter') + `${item.fieldname}`"
+                                :rules="formRules.OpenBankName" @click-right-icon="showSearch = true" />
+                        </template>
+                        <template v-else-if="(item.fieldcode === '100')">
+                            <Field v-if="showExtendInfo(item)" type="number" name="OpenBankNo" :label="item.fieldname"
+                                v-model="item.value" maxlength="50"
+                                :placeholder="$t('common.pleaseenter') + `${item.fieldname}`"
+                                :rules="formRules.OpenBankNo" />
+                        </template>
+                        <template v-else>
+                            <Field v-if="showExtendInfo(item)" :name="item.fieldcode" :label="item.fieldname"
+                                :readonly="item.fieldcode === 'legal_name' && legalpersonname != ''"
+                                v-model="item.value" maxlength="50"
+                                :placeholder="$t('common.pleaseenter') + `${item.fieldname}`" />
+                        </template>
+                    </template>
+                </CellGroup>
+            </Form>
+            <template #footer>
+                <div class="g-form__footer inset">
+                    <Button type="danger" round block @click="formRef?.submit()">{{ bankInfo ? $t('operation.modify') :
+                        $t('operation.submit') }}</Button>
+                </div>
+            </template>
+            <SelectBank v-model:show="showSelect" :data-list="banklist" @change="onSelectBankChange" />
+            <SearchBank v-model:show="showSearch" @change="onSearchBankChange" />
+        </app-view>
+    </app-modal>
+</template>
+
+<script lang="ts" setup>
+
+import { shallowRef, ref, computed, defineAsyncComponent } from 'vue'
+import { CellGroup, Button, Field, Form, FormInstance, FieldRule, showFailToast } from 'vant'
+import { fullloading, dialog } from '@/utils/vant'
+import { useDoBankSign, useDoCusBankExtendConfigs } from '@/business/bank'
+import { validateRules } from '@/constants/regex'
+import { useCountDown } from '@vant/use'
+import { useUserStore, i18n } from '@/stores'
+import AppModal from '@/components/base/modal/index.vue'
+
+// 选择银行
+const SelectBank = defineAsyncComponent(() => import('./select-bank/index.vue'))
+// 搜索支行
+const SearchBank = defineAsyncComponent(() => import('./search-bank/index.vue'))
+
+const { formData, onSubmit, banklist, bankInfo, system_1010, smsVerificationCode } = useDoBankSign()
+const showModal = shallowRef(true)
+const refresh = shallowRef(false) // 是否刷新父组件数据
+const formRef = shallowRef<FormInstance>()
+const showSelect = shallowRef(false) // 弹出客户选择界面
+const showSearch = shallowRef(false) // 弹出客户搜索界面
+const selectedBankName = shallowRef('') // 选中的银行名称
+const { configs } = useDoCusBankExtendConfigs(1)
+const userStore = useUserStore()
+const { legalpersonname, mobile2, bankaccount, userinfotype } = userStore.userInfo
+
+const { global: { t } } = i18n
+/// 短信验证码交易中心信息
+const CenterErrMsg = shallowRef('')
+// 倒计时函数
+const countdown = useCountDown({
+    time: 60 * 1000,
+    onFinish: () => {
+        countdown.reset()
+        isCountdown.value = false
+    }
+})
+const isCountdown = ref(false) // 是否正在倒计时
+// 倒计时剩余时间
+const currentTime = computed(() => countdown.current.value)
+
+const props = defineProps({
+    isedit: {
+        type: Boolean,
+        required: true,
+    }
+})
+
+/// 是否显示拓展信息
+const showExtendInfo = (item: Model.BankCusBankExtendConfigRsp) => {
+    return (item.usabletype === 1) ||
+        (item.usabletype === 2 && userinfotype === 2) ||
+        (item.usabletype === 3 && userinfotype === 1)
+}
+
+// 发送手机验证码
+const sendVerifyCode = () => {
+    formRef.value?.validate('MobilePhone').then(() => {
+        smsVerificationCode().then((res) => {
+            if (res.CenterErrMsg != '') {
+                CenterErrMsg.value = res.CenterErrMsg ?? ''
+            }
+            isCountdown.value = true
+            countdown.start()
+        }).catch(() => {
+            showFailToast(t('banksign.sendfailure'))
+        })
+    })
+}
+
+const onSelectBankChange = (item: Model.BankInfoRsp) => {
+    selectedBankName.value = item.bankname
+    formData.OpenBankAccId = item.bankid
+}
+
+const onSearchBankChange = (item: Model.BankBranChnumInfoRsp) => {
+    configs.value.forEach((e) => {
+        switch (e.fieldcode) {
+            case 'bank_branch_name':
+                e.value = item.branchname
+                break
+            case '100':
+                e.value = item.branchnum
+                break
+            case '101':
+                e.value = item.branchprovince
+                break
+            case '102':
+                e.value = item.branchcity
+                break
+        }
+    })
+}
+
+// 表单验证规则
+const formRules: { [key in keyof Proto.t2bBankSignReq]?: FieldRule[] } = {
+    OpenBankAccId: [{
+        message: t('banksign.tips11'),
+        validator: () => {
+            return !!formData.OpenBankAccId
+        }
+    }],
+    BankAccountNo: [{
+        required: true,
+        message: t('banksign.Pleaseenterbankaccountno')
+    }],
+    AccountName: [{
+        required: true,
+        message: t('banksign.Pleaseenterbankaccountname')
+    }],
+    MobilePhone: [{
+        required: true,
+        message: t('banksign.Pleaseenteryourmobilephonenumber'),
+        validator: (val) => {
+            /// 值为”0“ 时 只校验长度20位,不限字符
+            if (system_1010.value === '0') {
+                if (val.length <= 20) {
+                    return true
+                }
+                return t('banksign.tips6')
+            } else {
+                /// 不存在或值为空或”1“时,根据国内手机号校验11位
+                if (validateRules.phone.validate(val)) {
+                    return true
+                }
+                return validateRules.phone.message
+            }
+        }
+    }],
+    OpenBankName: [{
+        required: true,
+        message: t('banksign.Pleaseenterbranchbankname'),
+    }],
+    OpenBankNo: [{
+        required: true,
+        message: t('banksign.Pleaseenterbranchbankno'),
+    }]
+}
+
+const formSubmit = () => {
+    fullloading((hideLoading) => {
+        const obj: { [key: string]: unknown } = Object.create({})
+        configs.value.forEach((e) => {
+            if (e.value) {
+                obj[e.fieldcode] = e.value
+            }
+            if (e.fieldcode === 'bank_branch_name') {
+                formData.OpenBankName = e.value
+            }
+            if (e.fieldcode === '100') {
+                formData.OpenBankNo = e.value
+            }
+            if (e.fieldcode === '101') {
+                formData.BankProvince = e.value
+            }
+            if (e.fieldcode === '102') {
+                formData.BankCity = e.value
+            }
+        })
+        /// 如果需要短信验证码
+        if (CenterErrMsg.value != '') {
+            obj['smsSerialNo'] = CenterErrMsg.value
+        }
+        formData.extendInfo = JSON.stringify(obj)
+
+        onSubmit().then(() => {
+            hideLoading()
+            dialog(props.isedit ? t('banksign.submitsuccess1') : t('banksign.submitsuccess2')).then(() => {
+                closed(true)
+            })
+        }).catch((err) => {
+            hideLoading(err, 'fail')
+        })
+    })
+}
+
+// 关闭弹窗
+const closed = (isRefresh = false) => {
+    refresh.value = isRefresh
+    if (showSearch.value || showSelect.value) {
+        showSearch.value = false
+        showSelect.value = false
+    } else {
+        showModal.value = false
+    }
+}
+
+// 暴露组件属性给父组件调用
+defineExpose({
+    closed,
+})
+</script>

+ 79 - 0
src/packages/tss/views/bank/sign/components/edit/search-bank/index.vue

@@ -0,0 +1,79 @@
+<template>
+    <app-modal direction="right-top" height="100%" width="100%" v-model:show="showModal">
+        <app-view class="g-form">
+            <template #header>
+                <app-navbar :title="$t('banksign.search.title')">
+                    <template #footer>
+                        <Form action="/">
+                            <Search :placeholder="$t('banksign.search.Pleaseenterbranchbankname')" v-model="keyword" @search="onSearch" />
+                        </Form>
+                    </template>
+                </app-navbar>
+            </template>
+            <RadioGroup v-model="checked" style="padding-bottom: 50px;" v-if="dataList.length">
+                <CellGroup :title="$t('banksign.search.choicebranchbank')">
+                    <template v-for="(item, index) in dataList" :key="index">
+                        <Cell :title="item.branchname" :label="item.branchnum" clickable @click="onChange(item)">
+                            <template #icon>
+                                <Radio :name="item" style="padding: 0 10px;" />
+                            </template>
+                        </Cell>
+                    </template>
+                </CellGroup>
+            </RadioGroup>
+            <Empty :description="$t('banksign.search.nodatas')" v-else />
+        </app-view>
+    </app-modal>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, computed,toRaw } from 'vue'
+import { Form, Search, Empty, Cell, CellGroup, RadioGroup, Radio } from 'vant'
+import { fullloading } from '@/utils/vant'
+import { useRequest } from '@/hooks/request'
+import { queryBankBranChnumInfo } from '@/services/api/bank'
+import AppModal from '@/components/base/modal/index.vue'
+
+const props = defineProps({
+    show: {
+        type: Boolean,
+        default: false
+    }
+})
+
+const emit = defineEmits(['update:show', 'change'])
+const keyword = shallowRef('')
+const checked = shallowRef<Model.BankBranChnumInfoRsp>()
+
+const showModal = computed({
+    get: () => props.show,
+    set: (val) => emit('update:show', val)
+})
+
+const { dataList, runAsync } = useRequest(queryBankBranChnumInfo, {
+    manual: true,
+    params: {
+        pagesize: 30
+    }
+})
+
+const onSearch = (val: string) => {
+    if (val) {
+        fullloading((hideLoading) => {
+            runAsync({
+                branchname: val
+            }).then((res) => {
+                dataList.value = res.data
+            }).finally(() => {
+                hideLoading()
+            })
+        }, '搜索中...')
+    }
+}
+
+const onChange = (item: Model.BankBranChnumInfoRsp) => {
+    checked.value = item
+    showModal.value = false
+    emit('change', toRaw(item))
+}
+</script>

+ 68 - 0
src/packages/tss/views/bank/sign/components/edit/select-bank/index.vue

@@ -0,0 +1,68 @@
+<template>
+    <app-modal direction="right-top" height="100%" width="100%" v-model:show="showModal">
+        <app-view class="g-form">
+            <template #header>
+                <app-navbar :title="$t('banksign.tips14')">
+                    <template #footer>
+                        <Form action="/">
+                            <Search :placeholder="$t('banksign.tips15')" v-model="keyword" />
+                        </Form>
+                    </template>
+                </app-navbar>
+            </template>
+            <RadioGroup v-model="checked" style="padding-bottom: 50px;" v-if="bankList.length">
+                <CellGroup :title="$t('banksign.tips15')">
+                    <template v-for="(item, index) in bankList" :key="index">
+                        <Cell :title="item.bankname" :label="item.bankid" clickable @click="onChange(item)">
+                            <template #icon>
+                                <Radio :name="item" style="padding: 0 10px;" />
+                            </template>
+                        </Cell>
+                    </template>
+                </CellGroup>
+            </RadioGroup>
+            <Empty :description="$t('banksign.search.nodatas')" v-else />
+        </app-view>
+    </app-modal>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, computed, toRaw, PropType } from 'vue'
+import { Form, Search, Empty, Cell, CellGroup, RadioGroup, Radio } from 'vant'
+import AppModal from '@/components/base/modal/index.vue'
+
+const props = defineProps({
+    show: {
+        type: Boolean,
+        default: false
+    },
+    dataList: {
+        type: Array as PropType<Model.BankInfoRsp[]>,
+        default: () => []
+    }
+})
+
+const emit = defineEmits(['update:show', 'change'])
+const keyword = shallowRef('')
+const checked = shallowRef<Model.BankInfoRsp>()
+
+const showModal = computed({
+    get: () => props.show,
+    set: (val) => emit('update:show', val)
+})
+
+const bankList = computed(() => {
+    const filteredList = props.dataList.filter(e => {
+        const a = e.bankname.toLowerCase()
+        const b = keyword.value.toLowerCase()
+        return !b || a.includes(b)
+    })
+    return filteredList.slice(0, 30)
+})
+
+const onChange = (item: Model.BankInfoRsp) => {
+    checked.value = item
+    showModal.value = false
+    emit('change', toRaw(item))
+}
+</script>

+ 19 - 0
src/packages/tss/views/bank/sign/index.less

@@ -0,0 +1,19 @@
+.bank-sign {
+    &__container {
+        padding-top: 10px;
+
+        .van-cell {
+            &__title {
+                flex: initial;
+            }
+        }
+    }
+
+    &__empty {
+        text-align: center;
+
+        .van-button {
+            width: 50%;
+        }
+    }
+}

+ 42 - 0
src/packages/tss/views/bank/wallet/Index.vue

@@ -0,0 +1,42 @@
+<template>
+    <app-view>
+        <template #header>
+            <app-navbar :title="$t('banksign.wallet.title')" >
+                <template #right>
+                    <div class="button-more" @click="openComponent('inoutapply')">
+                        <span>{{ $t('banksign.wallet.applys') }}</span>
+                    </div>
+                </template>
+            </app-navbar>
+        </template>
+        <Tabs v-model:active="active">
+            <Tab :title="$t('banksign.wallet.cashin')">
+                <app-deposit />
+            </Tab>
+            <Tab :title="$t('banksign.wallet.cashout')">
+                <app-withdraw />
+            </Tab>
+        </Tabs>
+        <component ref="componentRef" :is="componentMap.get(componentId)" @closed="closeComponent"
+            v-if="componentId" />
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, defineAsyncComponent } from 'vue'
+import { Tab, Tabs } from 'vant'
+import { useNavigation } from '@mobile/router/navigation'
+import AppDeposit from './components/deposit/Index.vue'
+import AppWithdraw from './components/withdraw/Index.vue'
+import { useComponent } from '@/hooks/component'
+
+const componentMap = new Map<string, unknown>([
+    ['inoutapply', defineAsyncComponent(() => import('./components/inoutapply/Index.vue'))], // 申请流水
+])
+
+const { componentRef, componentId, openComponent, closeComponent } = useComponent()
+
+const { getQueryStringToNumber } = useNavigation()
+
+const active = shallowRef(getQueryStringToNumber('tab'))
+</script>

+ 180 - 0
src/packages/tss/views/bank/wallet/components/deposit/Index.vue

@@ -0,0 +1,180 @@
+<template>
+    <app-view class="g-form bank-wallet-deposit">
+        <Form ref="formRef" class="g-form__container" @submit="doDepositWarning">
+            <CellGroup inset v-if="cusBank?.caninamount === 1">
+                <Field type="number" v-model="formData.Amount" :label="$t('banksign.wallet.deposit.inamount')" :placeholder="$t('banksign.wallet.deposit.pleaseenterinamount')"
+                    :rules="formRules.Amount" />
+                <Field :label="$t('mine.balance')" readonly >
+                    <template #input>
+                        <span>{{ currentAccount.currentbalance?.toFixed(2) }}</span>
+                    </template>
+                </Field>
+                <template v-for="(item, index) in configs" :key="index">
+                    <Field v-if="item.usabletype === 1 || item.usabletype === userStore.userInfo?.userinfotype"
+                        :name="item.fieldcode" :label="item.fieldname" v-model="item.value"
+                        :placeholder="$t('common.pleaseenter')+`${item.fieldname}`" />
+                </template>
+            </CellGroup>
+            <div class="tips_time">
+                <span class="tips">{{ $t('banksign.wallet.deposit.time') }} {{ startTime }} - {{ endTime }}</span>
+                <span class="tips"><br>{{ $t('banksign.wallet.deposit.notice') }}</span>
+            </div>
+            <div class="tips_bank">
+                <div class="tips_bank_row" v-if="msg_320">
+                    <span class="tips_bank_row__label">{{ $t('banksign.wallet.deposit.platformdepositbankname') }}</span>
+                    <span class="msg_tips" :data-clipboard-text="msg_320" v-copy="onCopy">{{ msg_320 }}</span>
+                </div>
+                <div class="tips_bank_row" v-if="msg_321">
+                    <span class="tips_bank_row__label">{{ $t('banksign.wallet.deposit.platformdepositaccountno') }}</span>
+                    <span class="msg_tips" :data-clipboard-text="msg_321" v-copy="onCopy">{{ msg_321 }}</span>
+                </div>
+                <div class="tips_bank_row" v-if="msg_322">
+                    <span class="tips_bank_row__label">{{ $t('banksign.wallet.deposit.platformdepositaccount') }}</span>
+                    <span class="msg_tips" :data-clipboard-text="msg_322" v-copy="onCopy">{{ msg_322 }}</span>
+                </div>
+                <div class="tips_bank_row" v-if="msg_323">
+                    <span class="tips_bank_row__label">{{ $t('banksign.wallet.deposit.platformdepositsub-branch') }}</span>
+                    <span class="msg_tips" :data-clipboard-text="msg_323" v-copy="onCopy">{{ msg_323 }}</span>
+                </div>
+            </div>
+            <CellGroup inset v-if="msg_324">
+                <Cell :title="$t('common.tips')">
+                    <template #label>
+                        <p v-html="msg_324" />
+                    </template>
+                </Cell>
+            </CellGroup>
+        </Form>
+        <template #footer v-if="cusBank?.caninamount === 1">
+            <div class="g-form__footer inset">
+                <Button round block type="danger" @click="formRef?.submit()">{{ $t('operation.confirm') }}</Button>
+            </div>
+        </template>
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, ref } from 'vue'
+import { Form, Field, Cell, CellGroup, Button, FieldRule, FormInstance, showToast, showFailToast } from 'vant'
+import { fullloading, dialog } from '@/utils/vant'
+import { useNavigation } from '@mobile/router/navigation'
+import { useDoDeposit, useDoCusBankExtendConfigs } from '@/business/bank'
+import { getServerTime } from '@/services/api/common'
+import { useUserStore, useAccountStore, i18n } from '@/stores'
+import moment from 'moment'
+
+const formRef = shallowRef<FormInstance>()
+const { formData, onSubmit } = useDoDeposit()
+const { router } = useNavigation()
+const { getSystemParamValue } = useUserStore()
+const { configs, cusBank, startTime, endTime } = useDoCusBankExtendConfigs(2)
+const certificate_photo_url = ref('')
+const userStore = useUserStore()
+const { global: { t }} = i18n
+
+const accountStore = useAccountStore()
+const { currentAccount } = accountStore.$toRefs()
+
+const msg_320 = getSystemParamValue('320')
+const msg_321 = getSystemParamValue('321')
+const msg_322 = getSystemParamValue('322')
+const msg_323 = getSystemParamValue('323')
+const msg_324 = getSystemParamValue('324')
+
+// 表单验证规则
+const formRules: { [key: string]: FieldRule[] } = {
+    Amount: [{
+        required: true,
+        message: t('banksign.wallet.deposit.pleaseenterinamount'),
+    }],
+    filePath: [{
+        message: t('banksign.wallet.deposit.pleaseuploadthetransfervoucher'),
+        validator: () => {
+            /// 是否非必填
+            const ismandatory = Number(getSystemParamValue('316'))
+            return ismandatory === 0 ? true : !!certificate_photo_url.value
+        }
+    }]
+}
+
+/// 提示信息
+const doDepositWarning = () => {
+    fullloading((hideLoading) => {
+        getServerTime().then((res) => {
+            const n = moment(res.data)
+            const s = moment(startTime.value, 'HH:mm')
+            const e = moment(endTime.value, 'HH:mm')
+            if (n.isSameOrAfter(s) && n.isBefore(e)) {
+                dialog({ message: t('banksign.wallet.deposit.whetherthedeposittransferhasbeenmadeatthebankend'), showCancelButton: true, confirmButtonText: t('operation.confirm'), cancelButtonText: t('operation.cancel'), }).then(() => {
+                    /// 提交
+                    formSubmit()
+                }).catch(() => {
+                    /// 返回上一层
+                    router.back()
+                })
+            } else {
+                dialog({
+                    title: t('common.tips'),
+                    message: t('banksign.wallet.deposit.goldisnotwithinthetimeframe'),
+                    confirmButtonText: t('common.ikonw')
+                })
+            }
+        }).catch(() => {
+            hideLoading(t('banksign.wallet.deposit.failedtogetservertime'), 'fail')
+        }).finally(() => {
+            hideLoading()
+        })
+    })
+}
+
+const onCopy = (status: boolean) => {
+    if (status) {
+        showToast({ message: t('banksign.wallet.deposit.paste') })
+    } else {
+        showFailToast(t('banksign.wallet.deposit.pastefailure'))
+    }
+}
+
+const formSubmit = () => {
+    fullloading((hideLoading) => {
+        const obj: { [key: string]: unknown } = Object.create({})
+        configs.value.forEach((e) => {
+            if (e.value) {
+                obj[e.fieldcode] = e.value
+            }
+        })
+        obj['certificate_photo_url'] = certificate_photo_url.value
+        formData.extendInfo = JSON.stringify(obj)
+
+        let isComplete = false // 请求是否结束
+        const complete = () => {
+            isComplete = true
+            dialog('提交成功,请稍后确认结果').then(() => {
+                router.back()
+            })
+        }
+
+        // 请求等待可能会超过30秒导致请求超时,所以2秒内没回应直接提示成功
+        const t = setTimeout(() => complete(), 2000)
+
+        onSubmit().then(() => {
+            if (!isComplete) {
+                complete()
+            }
+        }).catch((err) => {
+            if (!isComplete) {
+                dialog(t('common.submitfailure') + err).then(() => {
+                    formData.Amount = undefined
+                })
+            }
+        }).finally(() => {
+            window.clearTimeout(t)
+            hideLoading()
+        })
+    })
+}
+</script>
+
+<style lang="less">
+@import './index.less';
+</style>

+ 65 - 0
src/packages/tss/views/bank/wallet/components/deposit/index.less

@@ -0,0 +1,65 @@
+.bank-wallet-deposit {
+    .g-form__bank {
+        padding: 16px;
+
+        table {
+            width: 100%;
+            font-size: 12px;
+            border: 1px dashed #ddd;
+            border-radius: 5px;
+
+            td {
+                &:not(:first-child) {
+                    text-align: right;
+                }
+
+                span {
+                    &:first-child {
+                        color: #999;
+                    }
+                }
+
+                button {
+                    background-color: #e1e1e1;
+                    border-radius: 5px;
+                    padding: 1px 10px;
+                }
+            }
+        }
+    }
+
+    .msg_tips {
+        color: #0099FF;
+        padding-left: 14px;
+        height: 35px;
+    }
+
+    .tips {
+        color: #993333; 
+        font-size: 12px;
+    }
+
+    .tips_time {
+        background-color: white; 
+        border-radius: 5px; 
+        margin: 10px 15px; 
+        padding: 10px 15px;
+    }
+
+    .tips_bank {
+        display: flex;
+        flex-direction: column;
+        background-color: white; 
+        margin: 0px 15px 10px 15px; 
+        padding: 10px 15px;
+        border-radius: 5px; 
+
+        .tips_bank_row {
+            height: 30px;
+            &__label {
+                font-size: 14px; 
+                color: #333;
+            }
+        }
+    }
+}

+ 77 - 0
src/packages/tss/views/bank/wallet/components/inoutapply/Index.vue

@@ -0,0 +1,77 @@
+<!-- 出入金- 申请流水 -->
+<template>
+    <app-modal direction="right-top" height="100%" width="100%" v-model:show="showModal" :refresh="refresh">
+        <app-view class="g-form">
+            <template #header>
+                <app-navbar :title="$t('banksign.wallet.inoutapply.title')" @back="closed" />
+            </template>
+            <app-pull-refresh ref="pullRefreshRef" v-model:loading="loading" v-model:error="error"
+                v-model:pageIndex="pageIndex" :page-count="pageCount" @refresh="onRefresh">
+                <div class="g-order-list">
+                    <div class="g-order-list__box" v-for="(item, index) in dataList" :key="index">
+                        <div class="g-order-list__titlebar">
+                            <div class="left">
+                                <h4>{{ formatDecimal(item.amount) }}</h4>
+                            </div>
+                            <div class="right">
+                                <span>{{ getInOutApplyStatusName(item.applystatus) }}</span>
+                            </div>
+                        </div>
+                        <div class="g-order-list__content">
+                            <ul>
+                                <li>
+                                    <span>{{ $t('banksign.wallet.inoutapply.charge') }}</span>
+                                    <span>{{ formatDecimal(item.charge) }}</span>
+                                </li>
+                                <li>
+                                    <span>{{ $t('banksign.wallet.inoutapply.executetype') }}</span>
+                                    <span>{{ getInOutExecuteTypeName(item.executetype) }}</span>
+                                </li>
+                                <li>
+                                    <span>{{ $t('banksign.wallet.inoutapply.extoperateid') }}</span>
+                                    <span>{{ handleNoneValue(item.extoperateid) }}</span>
+                                </li>
+                                <li>
+                                    <span>{{ $t('banksign.wallet.inoutapply.updatetime') }}</span>
+                                    <span>{{ formatDate(item.updatetime, 'MM/DD HH:mm:ss') }}</span>
+                                </li>
+                            </ul>
+                        </div>
+                    </div>
+                </div>
+            </app-pull-refresh>
+        </app-view>
+    </app-modal>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import { useRequest } from '@/hooks/request'
+import { queryAccountInOutApply } from '@/services/api/bank'
+import { getInOutApplyStatusName, getInOutExecuteTypeName } from '@/constants/order'
+import AppModal from '@/components/base/modal/index.vue'
+import AppPullRefresh from '@mobile/components/base/pull-refresh/index.vue'
+import { formatDecimal, handleNoneValue, formatDate } from '@/filters'
+
+const showModal = shallowRef(true)
+const error = shallowRef(false)
+const pullRefreshRef = shallowRef()
+const refresh = shallowRef(false) // 是否刷新父组件数据
+
+const { loading, pageIndex, pageCount, run, dataList } = useRequest(queryAccountInOutApply)
+
+const onRefresh = () => {
+    run()
+}
+
+// 关闭弹窗
+const closed = (isRefresh = false) => {
+    refresh.value = isRefresh
+    showModal.value = false
+}
+
+// 暴露组件属性给父组件调用
+defineExpose({
+    closed,
+})
+</script>

+ 165 - 0
src/packages/tss/views/bank/wallet/components/withdraw/Index.vue

@@ -0,0 +1,165 @@
+<template>
+    <app-view class="g-form bank-wallet-withdraw">
+        <Form ref="formRef" class="g-form__container" @submit="doWithDrawWarning">
+            <CellGroup inset v-if="cusBank?.canoutamount === 1">
+                <Field class="form-field" type="number" :label="$t('banksign.wallet.withdraw.outamount')" v-model="formData.Amount"
+                    :rules="formRules.Amount">
+                    <template #input>
+                        <input v-model="formData.Amount" :placeholder="$t('banksign.wallet.withdraw.pleaseenteroutamount')" />
+                        <span class="form-field__tips">{{ $t('banksign.wallet.withdraw.availableoutmoney') }}{{ fund.AvailableOutMoney }}</span>
+                    </template>
+                </Field>
+                <Field :label="$t('banksign.wallet.withdraw.bankname')">
+                    <template #input>
+                        {{ sign.bankname }}
+                    </template>
+                </Field>
+                <Field :label="$t('banksign.wallet.withdraw.bankaccountno')">
+                    <template #input>
+                        {{ sign.bankaccountno }}
+                    </template>
+                </Field>
+                <Field :label="$t('banksign.wallet.withdraw.bankaccountname')">
+                    <template #input>
+                        {{ sign.bankaccountname }}
+                    </template>
+                </Field>
+                <template v-for="(item, index) in configs" :key="index">
+                    <Field v-if="item.usabletype === 1 || item.usabletype === userStore.userInfo?.userinfotype"
+                        :name="item.fieldcode" :label="item.fieldname" v-model="item.value"
+                        :placeholder="$t('common.pleaseenter')+`${item.fieldname}`" />
+                </template>
+            </CellGroup>
+            <div class="tips_time">
+                <span class="msg_tips">{{ $t('banksign.wallet.withdraw.time') }} {{ startTime }} - {{ endTime }}</span>
+                <span class="msg_tips"><br>{{ $t('banksign.wallet.withdraw.notice') }}</span>
+            </div>
+            <CellGroup inset v-if="msg_317">
+                <Cell :title="$t('common.tips')">
+                    <template #label>
+                        <p v-html="msg_317" />
+                    </template>
+                </Cell>
+            </CellGroup>
+            <CellGroup inset v-if="cusBank?.canoutamount === 0">
+                <Cell>
+                    <template #label>
+                        <p v-html="msg"></p>
+                    </template>
+                </Cell>
+            </CellGroup>
+        </Form>
+        <template #footer v-if="cusBank?.canoutamount === 1">
+            <div class="g-form__footer inset">
+                <Button round block type="danger" @click="formRef?.submit()">{{ $t('operation.confirm') }}</Button>
+            </div>
+        </template>
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef } from 'vue'
+import { Form, Field, Cell, CellGroup, FormInstance, Button, FieldRule } from 'vant'
+import { fullloading, dialog, } from '@/utils/vant'
+import { useDoWithdraw, useAccountFundInfo, useDoCusBankExtendConfigs } from '@/business/bank'
+import { getServerTime } from '@/services/api/common'
+import { useNavigation } from '@mobile/router/navigation'
+import { useUserStore, i18n } from '@/stores'
+import moment from 'moment'
+
+const { formData, onSubmit, sign } = useDoWithdraw()
+const { configs, cusBank, startTime, endTime } = useDoCusBankExtendConfigs(3)
+/// 资金账户信息
+const { fund } = useAccountFundInfo()
+const { router } = useNavigation()
+const formRef = shallowRef<FormInstance>()
+const { getSystemParamValue } = useUserStore()
+const msg = getSystemParamValue('302')
+const msg_317 = getSystemParamValue('317')
+const userStore = useUserStore()
+const { global: { t }} = i18n
+
+// 表单验证规则
+const formRules: { [key: string]: FieldRule[] } = {
+    Amount: [{
+        required: true,
+        message: t('banksign.wallet.withdraw.pleaseenteroutamount'),
+        validator: (val) => {
+            if (val <= (fund.value.AvailableOutMoney ?? 0.0) && val > 0.0) {
+                return true
+            } else if (fund.value.AvailableOutMoney === 0.0) {
+                return t('banksign.wallet.withdraw.theamountavailableis0')
+            } else {
+                return t('banksign.wallet.withdraw.exceedingthepayableamount')
+            }
+        }
+    }]
+}
+
+/// 提示信息
+const doWithDrawWarning = () => {
+    fullloading((hideLoading) => {
+        getServerTime().then((res) => {
+            const n = moment(res.data)
+            const s = moment(startTime.value, 'HH:mm')
+            const e = moment(endTime.value, 'HH:mm')
+            // 出金时间必须在开始和结束时间之间
+            if (n.isSameOrAfter(s) && n.isBefore(e)) {
+                /// 提交
+                formSubmit()
+            } else {
+                dialog({
+                    title: t('common.tips'),
+                    message: t('banksign.wallet.withdraw.goldisnotwithinthetimeframe'),
+                    confirmButtonText: t('common.ikonw')
+                })
+            }
+        }).catch(() => {
+            hideLoading(t('banksign.wallet.withdraw.failedtogetservertime'), 'fail')
+        }).finally(() => {
+            hideLoading()
+        })
+    })
+}
+
+const formSubmit = () => {
+    const obj: { [key: string]: unknown } = Object.create({})
+    configs.value.forEach((e) => {
+        if (e.value) {
+            obj[e.fieldcode] = e.value
+        }
+    })
+    formData.extendInfo = JSON.stringify(obj)
+    fullloading((hideLoading) => {
+        let isComplete = false // 请求是否结束
+        const complete = () => {
+            isComplete = true
+            dialog('提交成功,请勿重复提交,稍后确认结果').then(() => {
+                router.back()
+            })
+        }
+
+        // 请求等待可能会超过30秒导致请求超时,所以2秒内没回应直接提示成功
+        const t = setTimeout(() => complete(), 2000)
+
+        onSubmit().then(() => {
+            if (!isComplete) {
+                complete()
+            }
+        }).catch((err) => {
+            if (!isComplete) {
+                dialog(t('common.submitfailure') + err).then(() => {
+                    formData.Amount = undefined
+                })
+            }
+        }).finally(() => {
+            window.clearTimeout(t)
+            hideLoading()
+        })
+    })
+}
+</script>
+
+<style lang="less">
+@import './index.less';
+</style>

+ 29 - 0
src/packages/tss/views/bank/wallet/components/withdraw/index.less

@@ -0,0 +1,29 @@
+.bank-wallet-withdraw {
+    .form-field {
+        .van-field__control {
+            display: flex;
+            flex-direction: column;
+            align-items: flex-start;
+        }
+
+        &__tips {
+            font-size: 12px;
+        }
+    }
+
+    .g-form__bank {
+        padding: 16px;
+    }
+
+    .msg_tips {
+        color: #993333; 
+        font-size: 12px;
+    }
+
+    .tips_time {
+        background-color: white; 
+        border-radius: 10px; 
+        margin: 10px 15px; 
+        padding: 10px 15px;
+    }
+}

+ 6 - 6
src/packages/tss/views/order/delivery/Index.vue

@@ -23,23 +23,23 @@ const { global: { t } } = i18n
 const components = [
     {
         name: 'offline',
-        title: "全款提货",
+        title: t('delivery.title1'),
         component: defineAsyncComponent(() => import('./components/offline/Index.vue'))
     },
     {
         name: 'online',
-        title: "预付款提货",
+        title: t('delivery.title2'),
         component: defineAsyncComponent(() => import('./components/online/Index.vue')),
     },
     {
         name: 'spot',
-        title: "预付款交货",
+        title: t('delivery.title3'),
         component: defineAsyncComponent(() => import('./components/spot/Index.vue')),
     },
     {
-        name: 'spot',
-        title: "退换货",
-        component: defineAsyncComponent(() => import('./components/spot/Index.vue')),
+        name: 'aftersale',
+        title: t('delivery.title4'),
+        component: defineAsyncComponent(() => import('./components/aftersale/Index.vue')),
     }
 ]
 

+ 7 - 0
src/packages/tss/views/order/delivery/components/aftersale/Index.vue

@@ -0,0 +1,7 @@
+<!-- 交收提货-退换货 -->
+<template>
+    <span></span>
+</template>
+
+<script lang="ts" setup>
+</script>

+ 3 - 3
src/packages/tss/views/order/list/Index.vue

@@ -1,7 +1,7 @@
 <template>
     <app-view>
         <template #header>
-            <app-navbar title="历史订单" />
+            <app-navbar :title="$t('order.title1')" />
         </template>
         <Tabs class="van-tabs--list" v-model:active="active" :swipe-threshold="4">
             <template v-for="(item, index) in components" :key="index">
@@ -23,12 +23,12 @@ const { global: { t } } = i18n
 const components = [
     {
         name: 'fullpayment',
-        title: "全款订单",
+        title: t('order.title2'),
         component: defineAsyncComponent(() => import('./fullpayment/Index.vue')),
     },
     {
         name: 'prepayment',
-        title: "预付款订单",
+        title: t('order.title3'),
         component: defineAsyncComponent(() => import('./prepayment/Index.vue')),
     }
 ]

+ 5 - 4
src/packages/tss/views/order/list/prepayment/Index.vue

@@ -14,9 +14,9 @@
                 </div>
                 <div class="g-order-list__content">
                     <ul>
-                        <!-- <li class="left">
+                        <li class="left">
                             <Image width="100" height="100" radius="4" :src="getImageUrl(item.thumurls)" />
-                        </li> -->
+                        </li>
                         <li>
                             <span>订单重量</span>
                             <span>
@@ -86,13 +86,14 @@ const dataList = shallowRef<Model.TradeHolderDetailExRsp[]>([])
 const { loading, pageIndex, pageCount, run } = useRequest(queryTradeHolderDetailEx, {
     params: {
         pagesize: 20,
-        marketids: '10101'
+        marketids: '10101',
+        holderqty: 0
     },
     onSuccess: (res) => {
         if (pageIndex.value === 1) {
             dataList.value = []
         }
-        dataList.value.push(...res.data.filter(e => e.holderqty === 0))
+        dataList.value.push(...res.data)
     },
     onError: () => {
         error.value = true

+ 1 - 1
src/packages/tss/views/order/position/Index.vue

@@ -32,7 +32,7 @@
                         <div class="right">
                             <ul>
                                 <li>
-                                    <span>商品代码:</span>
+                                    <span>{{ $t('position.goodscode') }}:</span>
                                     <span>{{ item.goodsCode }}</span>
                                 </li>
                                 <li>

+ 2 - 1
src/types/model/order.d.ts

@@ -1771,7 +1771,8 @@ declare namespace Model {
         holderqty?: number; // 持仓数量
         page?: number; // 页码
         pagesize?: number; // 每页条数
-        marketids?: string
+        marketids?: string, // 目标市场ID列表,格式 1,2,3
+        holderqty?: number // 持仓数量 
     }
 
     /** 查询我的订单 响应 */