deposit.vue 81 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917
  1. <template>
  2. <cwg-page-wrapper class="create-page" :isHeaderFixed="true">
  3. <cwg-header :title="t('Home.page_customer.item2')" />
  4. <view class="custom-deposit">
  5. <!-- 步骤1:选择账户 -->
  6. <view class="box box-step1">
  7. <view class="b-card">
  8. <view class="card-top">
  9. <text class="tit"><text class="iconfont icon-caret-right"></text>{{ t('Custom.Deposit.Title1')
  10. }}</text>
  11. <cwg-combox :clearable="false" v-model:value="loginValue" :options="loginComboxOptions"
  12. :placeholder="t('placeholder.choose')" @change="onAccountChange" />
  13. </view>
  14. </view>
  15. </view>
  16. <!-- 步骤2:支付通道列表(卡片布局) -->
  17. <view class="box box-step2" v-if="step2">
  18. <view class="b-card">
  19. <view class="card-top">
  20. <text class="tit"><text class="iconfont icon-caret-right"></text>{{ t('Custom.Deposit.Title2')
  21. }}</text>
  22. <view v-for="(group, index) in sortedTableData" :key="index">
  23. <view class="channelType" v-if="group.length" v-t="groupTitleMap[group[0].type]" />
  24. <PaymentMethodsList :list="group" @select="isShowStep3" />
  25. </view>
  26. <view v-if="step3" class="reselect-btn">
  27. <button class="s-btn reselect" type="primary" @click="showTable">{{
  28. t('Custom.Deposit.Reselect') }}</button>
  29. </view>
  30. </view>
  31. </view>
  32. </view>
  33. <!-- 步骤3:填写入金信息 -->
  34. <view class="box box-step3" v-if="step3">
  35. <view class="b-card">
  36. <view class="card-top">
  37. <!-- 注意事项(第一步确认) -->
  38. <view v-if="!isStep3">
  39. <view class="step3-attention">
  40. <rich-text class="attention"
  41. :nodes="(locale === 'cn' || locale === 'zhHant') ? introduce.introduce : introduce.enIntroduce"></rich-text>
  42. <view class="btn-bottom">
  43. <text class="btn crm-cursor" @click="isStep3Open()">{{ t('Btn.Confirm') }}</text>
  44. </view>
  45. </view>
  46. </view>
  47. <!-- 表单(确认后显示) -->
  48. <uni-forms v-if="isStep3" ref="baseForm" :model="params" labelWidth="200" label-position="top"
  49. class="base-info-form">
  50. <uni-row class="demo-uni-row uni-row1">
  51. <!-- 信用卡选择 -->
  52. <uni-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8"
  53. v-if="channelData.confirmCreditCard == 1">
  54. <view class="add-back">
  55. <text>{{ t('PersonalManagement.Label.addCreditCard') }}</text>
  56. <text class="add-btn crm-cursor" @click="openAddBankCard">{{
  57. t('Custom.Withdraw.addBank1') }}</text>
  58. </view>
  59. <uni-forms-item :label="t('PersonalManagement.Label.addCreditCard')">
  60. <cwg-combox :clearable="false" v-model:value="myId" :options="creditCardOptions"
  61. :placeholder="t('placeholder.choose')" @change="onCreditCardChange" />
  62. </uni-forms-item>
  63. </uni-col>
  64. <!-- 银行选择(如有) -->
  65. <uni-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8" v-if="bankDate.length">
  66. <uni-forms-item :label="t('news_add_field.Label.Title4')">
  67. <cwg-combox :clearable="false" v-model:value="selectedBankIndex"
  68. :options="bankOptions" :placeholder="t('placeholder.choose')"
  69. @change="onBankChange" />
  70. </uni-forms-item>
  71. </uni-col>
  72. <!-- 特别提示(B2BINPAY) -->
  73. <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24"
  74. v-if="bankDate.length && channelData.code == 'B2BINPAY'">
  75. <text class="tit"><text class="iconfont iconi"></text>{{ t('Custom.Deposit.Des')
  76. }}</text>
  77. </uni-col>
  78. <!-- 电汇信息展示 -->
  79. <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24"
  80. v-if="['UNION_PAY_TELEGRAPHIC', 'UNION_PAY_TELEGRAPHIC_SPECIAL', 'UNION_PAY_TELEGRAPHIC_TWO'].includes(channelData.code)">
  81. <text class="tit"><text class="iconfont icon-caret-right"></text>{{
  82. t('Custom.Deposit.Title5') }}</text>
  83. <view class="wire-transfer-account">
  84. <view class="row"><text class="label SpecialColor">{{
  85. t('Custom.Deposit.bankUname')
  86. }}</text><text class="content SpecialColor">{{
  87. WireTransferAccount.bankUname
  88. ||
  89. '--' }}</text></view>
  90. <view class="row"><text class="label">{{ t('Custom.Deposit.bankName')
  91. }}</text><text class="content">{{ WireTransferAccount.bankName || '--'
  92. }}</text></view>
  93. <view class="row"><text class="label SpecialColor">{{
  94. t('Custom.Deposit.bankCardNum')
  95. }}</text><text class="content SpecialColor">{{
  96. WireTransferAccount.bankCardNum
  97. || '--' }}</text></view>
  98. <view class="row"><text class="label">{{ t('Custom.Deposit.bankAddr')
  99. }}</text><text class="content">{{ WireTransferAccount.bankAddr || '--'
  100. }}</text></view>
  101. <view class="row"><text class="label SpecialColor">{{
  102. t('Custom.Deposit.swiftCode')
  103. }}</text><text class="content SpecialColor">{{
  104. WireTransferAccount.swiftCode
  105. ||
  106. '--' }}</text></view>
  107. <view class="row"><text class="label">{{ t('Custom.Deposit.bankCode')
  108. }}</text><text class="content">{{ WireTransferAccount.bankCode || '--'
  109. }}</text></view>
  110. <view class="row"><text class="label SpecialColor">{{ t('Custom.Recording.Note')
  111. }}</text><text class="content SpecialColor">{{
  112. WireTransferAccount.bankMsg
  113. ||
  114. '--' }}</text></view>
  115. </view>
  116. </uni-col>
  117. <!-- 数字货币信息展示 -->
  118. <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24"
  119. v-if="channelData.code && channelData.code.indexOf('DIGITAL_PAY_TYPE_KEY') === 0">
  120. <text class="tit"><text class="iconfont icon-caret-right"></text>{{
  121. t('Custom.Deposit.DigitalAcc') }}</text>
  122. <view class="wire-transfer-account">
  123. <view class="row"><text class="label SpecialColor">{{
  124. t('Custom.Deposit.DigitalName')
  125. }}</text><text class="content SpecialColor">{{ WireTransferAccount.name
  126. +
  127. '-' +
  128. WireTransferAccount.type }}</text></view>
  129. <view class="row"><text class="label">{{ t('Custom.Withdraw.Title6')
  130. }}</text><text class="content">{{ WireTransferAccount.address || '--'
  131. }}</text></view>
  132. <view class="row"><text class="label">QR Code</text>
  133. <image :src="Host85 + WireTransferAccount.url" mode="aspectFit"
  134. style="width: 100rpx; height: 100rpx;" />
  135. </view>
  136. </view>
  137. </uni-col>
  138. <!-- 表单字段:金额、预估金额、上传凭证、优惠码 -->
  139. <uni-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
  140. <text class="tit"><text class="iconfont icon-caret-right"></text>{{
  141. t('Custom.Deposit.Title3')
  142. }}</text>
  143. </uni-col>
  144. <uni-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
  145. <uni-forms-item
  146. :label="t('Custom.Deposit.Title3') + '(' + channelData.currency + ')'">
  147. <uni-easyinput type="number" v-model="params.amount" @input="onAmountInput"
  148. :placeholder="t('placeholder.input')" />
  149. <text class="error" v-if="amountError">{{ amountError }}</text>
  150. </uni-forms-item>
  151. </uni-col>
  152. <uni-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8" v-if="channelData.rate">
  153. <uni-forms-item>
  154. <template #label>
  155. <view class="label-with-icon">
  156. <text>{{ t('Custom.Deposit.EstimatedAmount') + '(' +
  157. channelData.transformCurrency + ')' }}</text>
  158. <text class="help-icon" @click="showEstimateHelp">?</text>
  159. </view>
  160. </template>
  161. <uni-easyinput v-model="params.amount1" disabled
  162. :placeholder="t('placeholder.input')" />
  163. </uni-forms-item>
  164. </uni-col>
  165. <uni-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8" v-if="needUploadVoucher">
  166. <uni-forms-item :label="t('Custom.Deposit.UploadRemittanceVoucher')">
  167. <view class="upload-box">
  168. <button class="btn-upload" @click="chooseImage">{{ t('upload') }}</button>
  169. <image v-if="imageUrl" :src="imageUrl" mode="aspectFit"
  170. class="img-preview" />
  171. </view>
  172. </uni-forms-item>
  173. </uni-col>
  174. <uni-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
  175. <uni-forms-item>
  176. <template #label>
  177. <view class="label-with-icon">
  178. <text v-t="'Custom.Deposit.PromoCode'" />
  179. <uni-tooltip placement="top" class="tooltip-content">
  180. <view class="item">?</view>
  181. <template #content>
  182. <text v-t="'news_add_field.Des.item3'"></text>
  183. </template>
  184. </uni-tooltip>
  185. </view>
  186. </template>
  187. <uni-easyinput v-model="params.promoCode"
  188. :placeholder="t('placeholder.input')" />
  189. </uni-forms-item>
  190. </uni-col>
  191. </uni-row>
  192. <!-- 活动勾选区域(完整保留所有原逻辑) -->
  193. <view class="activities">
  194. <!-- 10%赠金/普通活动(原代码中第一个大块) -->
  195. <view
  196. v-if="!tableData4Flag && !tableData4TwoFlag && !tableDataNewListFlag && (country != 'CN' || (country == 'CN' && (ACCType == 1 || ACCType == 2 || ACCType == 7 || ACCType == 5 || ACCType == 6 || ACCType == 8))) && ACCType != 3">
  197. <template v-if="isSupportedCountry && (ACCType == 2 || ACCType == 7)">
  198. <label class="checkbox">
  199. <checkbox :checked="params.agree2"
  200. @click="params.agree2 = !params.agree2" />
  201. <text>{{ t('news_add_field1.deposit.item2_1') }}</text>
  202. </label>
  203. <view style="line-height: 1.5; font-size: 14px" v-if="country == 'CN'">
  204. <p style="margin-bottom: 15px" v-if="isGuoQin">
  205. <span>{{ t('Custom.Deposit.agree21') }}</span>
  206. <span class="clause crm-cursor">
  207. <a :href="`pdf/pdf4/100Bonus-en.pdf`" style="color: black">{{
  208. t('Custom.Deposit.agree22_2') }}</a>
  209. </span>
  210. <span>{{ t('Custom.Deposit.agree23_2') }}</span>
  211. </p>
  212. <p style="margin-bottom: 15px" v-else>
  213. <span>{{ t('Custom.Deposit.agree21') }}</span>
  214. <span class="clause crm-cursor">
  215. <a :href="`pdf/pdf4/100Bonus-en.pdf`" style="color: black">{{
  216. t('Custom.Deposit.agree22_2') }}</a>
  217. </span>
  218. <span>{{ t('Custom.Deposit.agree23_2') }}</span>
  219. </p>
  220. </view>
  221. <view style="line-height: 1.5; font-size: 14px" v-if="country != 'CN'">
  222. <p style="margin-bottom: 15px">
  223. <span>{{ t('Custom.Deposit.agree21') }}</span>
  224. <span class="clause crm-cursor">
  225. <a :href="`pdf/pdf4/100Bonus-en.pdf`" style="color: black">{{
  226. t('Custom.Deposit.agree22_2') }}</a>
  227. </span>
  228. <span>{{ t('Custom.Deposit.agree23_2') }}</span>
  229. </p>
  230. </view>
  231. </template>
  232. <template v-if="!isSupportedCountry && ACCType != 8 && !isAfterSeptember30()">
  233. <label class="checkbox">
  234. <checkbox :checked="params.agree2"
  235. @click="params.agree2 = !params.agree2" />
  236. <text>{{ t('news_add_field1.deposit.item1') }}</text>
  237. </label>
  238. <view style="line-height: 1.5; font-size: 14px" v-if="country == 'CN'">
  239. <p style="margin-bottom: 15px" v-if="isGuoQin">
  240. <span>{{ t('Custom.Deposit.agree21') }}</span>
  241. <span class="clause crm-cursor">
  242. <a :href="`pdf/pdf4/${locale}.pdf`" style="color: black">{{
  243. t('Custom.Deposit.agree22') }}</a>
  244. </span>
  245. <span>{{ t('Custom.Deposit.agree23_1') }}</span>
  246. </p>
  247. <p style="margin-bottom: 15px" v-else>
  248. <span>{{ t('Custom.Deposit.agree21') }}</span>
  249. <span class="clause crm-cursor">
  250. <a :href="`pdf/pdf4/${locale}.pdf`" style="color: black">{{
  251. t('Custom.Deposit.agree22') }}</a>
  252. </span>
  253. <span>{{ t('Custom.Deposit.agree23') }}</span>
  254. </p>
  255. </view>
  256. <view style="line-height: 1.5; font-size: 14px" v-if="country != 'CN'">
  257. <p style="margin-bottom: 15px">
  258. <span>{{ t('Custom.Deposit.agree21') }}</span>
  259. <span class="clause crm-cursor">
  260. <a :href="`pdf/pdf4/${locale}.pdf`" style="color: black">{{
  261. t('Custom.Deposit.agree22') }}</a>
  262. </span>
  263. <span>{{ t('Custom.Deposit.agree23_1') }}</span>
  264. </p>
  265. </view>
  266. </template>
  267. </view>
  268. <!-- 10%赠金-年中赠金 -->
  269. <view v-if="tableData4Flag">
  270. <label class="checkbox">
  271. <checkbox :checked="params.agree4" @click="params.agree4 = !params.agree4" />
  272. <text>{{ t('news_add_field1.activitiesNZ.itemDeposit1') }}</text>
  273. </label>
  274. <view style="line-height: 1.5; font-size: 14px">
  275. <p style="margin-bottom: 15px">
  276. <span>{{ t('news_add_field1.activitiesNZ.itemDeposit2') }}</span>
  277. <span class="clause crm-cursor" @click="dialogClauseNZ = true">{{
  278. t('news_add_field1.activitiesNZ.itemDeposit3') }}</span>
  279. <span>{{ t('news_add_field1.activitiesNZ.itemDeposit4') }}</span>
  280. </p>
  281. </view>
  282. </view>
  283. <!-- 20%赠金-年中赠金 -->
  284. <view v-if="tableData4TwoFlag">
  285. <label class="checkbox">
  286. <checkbox :checked="params.agree5" @click="params.agree5 = !params.agree5" />
  287. <text>{{ t('news_add_field1.activitiesNZTwo.itemDeposit1') }}</text>
  288. </label>
  289. <view style="line-height: 1.5; font-size: 14px">
  290. <p style="margin-bottom: 15px">
  291. <span>{{ t('news_add_field1.activitiesNZTwo.itemDeposit2') }}</span>
  292. <span class="clause crm-cursor" @click="dialogClauseNZTwo = true">{{
  293. t('news_add_field1.activitiesNZTwo.itemDeposit3') }}</span>
  294. <span>{{ t('news_add_field1.activitiesNZTwo.itemDeposit4') }}</span>
  295. </p>
  296. </view>
  297. </view>
  298. <!-- 赠送活动 -->
  299. <view v-if="tableDataNewListFlag">
  300. <label class="checkbox">
  301. <checkbox :checked="params.agree6" @click="params.agree6 = !params.agree6" />
  302. <text>{{ tableDataNewList.title }}</text>
  303. </label>
  304. <view style="line-height: 1.5; font-size: 14px">
  305. <p style="margin-bottom: 15px">
  306. <span>{{ t('news_add_field1.activitiesNewList.item1') }}</span>
  307. <span class="clause crm-cursor" @click="dialogClauseNewList = true">{{
  308. tableDataNewList.title }}</span>
  309. <span>{{ t('news_add_field1.activitiesNewList.item2') }}</span>
  310. </p>
  311. </view>
  312. </view>
  313. <!-- 20%赠金申请 -->
  314. <view
  315. v-if="(ACCType == 1 || ACCType == 2 || ACCType == 5 || ACCType == 6 || ACCType == 7) && anshiClose">
  316. <label class="checkbox">
  317. <checkbox :checked="params.agree3" @click="params.agree3 = !params.agree3"
  318. :disabled="CheckExistSuccess" />
  319. <text>{{ t('news_add_field1.deposit.item3') }}</text>
  320. </label>
  321. <view style="line-height: 1.5; font-size: 14px">
  322. <p style="margin-bottom: 15px">
  323. <span>{{ t('news_add_field1.deposit.item4') }}</span>
  324. <span class="clause crm-cursor" @click="dialogClause1 = true">{{
  325. t('news_add_field1.deposit.item5')
  326. }}</span>
  327. <span>{{ t('news_add_field1.deposit.item6') }}</span>
  328. </p>
  329. </view>
  330. </view>
  331. </view>
  332. <button class="s-btn" type="primary" @click="submitConfirm">{{ t('Btn.Submit') }}</button>
  333. </uni-forms>
  334. </view>
  335. </view>
  336. </view>
  337. <!-- 弹窗组件(使用 uni-popup) -->
  338. <uni-popup ref="popupRef" type="center" :mask-click="false">
  339. <view class="popup-content" v-if="popupType === 'confirm'">
  340. <text class="popup-title">{{ t('Home.page_customer.item2') }}</text>
  341. <view class="popup-form">
  342. <view class="popup-row"><text class="label">{{ t('Custom.Deposit.Title1') }}:</text><text>{{
  343. selectedAccountLabel }}</text></view>
  344. <view class="popup-row"><text class="label">{{ t('Custom.Deposit.Title2') }}:</text><text>{{
  345. locale ==
  346. 'cn' ? channelData.name : channelData.enName }}</text></view>
  347. <view class="popup-row" v-if="code"><text class="label">{{ t('news_add_field.Label.Title4')
  348. }}:</text><text>{{ selectCodes }}</text></view>
  349. <view class="popup-row"><text class="label">{{ t('Custom.Deposit.Title3') }}:</text><text>{{
  350. params.amount
  351. }}({{ channelData.currency }})</text></view>
  352. <view class="popup-row" v-if="channelData.confirmName"><text class="label">{{ t('Label.Name')
  353. }}:</text><text>{{ userName }}</text></view>
  354. <view class="popup-row" v-if="channelData.confirmAreaCode">
  355. <text class="label">{{ t('placeholder.phone') }}:</text>
  356. <input class="small-input" v-model="dialogConfirmForm.confirmAreaCode" />
  357. <text>-</text>
  358. <input class="small-input" v-model="dialogConfirmForm.confirmPhone" />
  359. </view>
  360. </view>
  361. <view class="popup-buttons">
  362. <button @click="closePopup">{{ t('Btn.Cancel') }}</button>
  363. <button type="primary" @click="submitDeposit">{{ t('Btn.Confirm') }}</button>
  364. </view>
  365. </view>
  366. <view class="popup-content" v-else-if="popupType === 'result'">
  367. <view class="result-icon" v-if="dialogSuccess"><text class="iconfont iconchenggong"></text></view>
  368. <view class="result-icon" v-else><text class="iconfont iconjingshi"></text></view>
  369. <text class="popup-text">{{ dialogMessage }}</text>
  370. <view class="popup-buttons">
  371. <button type="primary" @click="closeResultPopup">{{ t('Btn.Confirm') }}</button>
  372. <button v-if="!dialogSuccess" @click="closeResultPopup">{{ t('Btn.Cancel') }}</button>
  373. </view>
  374. </view>
  375. <view class="popup-content" v-else-if="popupType === 'wait'">
  376. <text class="iconfont icondengdai"></text>
  377. <text class="popup-text">{{ t('ApplicationDialog.Des38') }}</text>
  378. </view>
  379. </uni-popup>
  380. <!-- 其他弹窗(越南提示、年中赠金协议等)用 uni-popup 或 uni.showModal 模拟,因原结构复杂,保留基础 -->
  381. <!-- 越南用户提示弹窗 -->
  382. <uni-popup ref="vietnamPopup" type="center">
  383. <view class="popup-content" style="width: 600rpx;">
  384. <text class="popup-title">{{ t('Home.page_customer.item2') }}</text>
  385. <view class="popup-text" style="text-align: left; font-size: 24rpx; line-height: 1.6;">
  386. <p><strong>Quý khách hàng thân mến:</strong></p>
  387. <p>Trước khi giao dịch, chúng tôi xin nhắc nhở bạn rằng:</p>
  388. <p>1. Vì có những rủi ro nhất định trong giao dịch, bạn nên đầu tư thích hợp theo kinh nghiệm
  389. giao
  390. dịch và
  391. thu nhập liên quan của mình, thay vì sử dụng tiền vay từ người khác.</p>
  392. <p>2. Dựa trên sự điều chỉnh đối với hệ thống kiểm soát rủi ro của ngân hàng, kênh nạp tiền có
  393. thể
  394. không
  395. được hỗ trợ hoặc hạn mức giao dịch có thể không chính xác khi bạn sẵn sàng nạp tiền (đặc
  396. biệt là
  397. vào ban
  398. đêm tại địa phương của bạn), vì vậy bạn nên sắp xếp vị thế giao dịch của mình và khoảng thời
  399. gian nạp
  400. tiền sao cho hợp lý để tránh những tổn thất không đáng có do bất kỳ sự chậm trễ nào trong
  401. việc
  402. nhận tiền
  403. nạp.</p>
  404. <p>Không bao giờ tiết lộ thông tin cá nhân nhạy cảm cho người gọi đến. CWG sẽ không bao giờ yêu
  405. cầu
  406. bất kỳ
  407. thông tin cá nhân nhạy cảm nào từ bạn qua điện thoại hoặc email cũng như không cung cấp bất
  408. kỳ
  409. lời
  410. khuyên đầu tư nào.</p>
  411. <p>Trong trường hợp có bất kỳ vấn đề gì với khoản tiền nạp của bạn, vui lòng liên hệ với trung
  412. tâm
  413. dịch vụ
  414. khách hàng chính thức của chúng tôi bất kỳ lúc nào.</p>
  415. <p>Trân trọng,</p>
  416. </view>
  417. <view class="popup-buttons">
  418. <button type="primary" @click="closeVietnamPopup">{{ t('Btn.Confirm') }}</button>
  419. </view>
  420. </view>
  421. </uni-popup>
  422. <!-- 中国网银提示弹窗 -->
  423. <uni-popup ref="chinaUnionPayPopup" type="center">
  424. <view class="popup-content">
  425. <text class="popup-text">{{ t('news_add_field1.deposit.item64') }}</text>
  426. <view class="popup-buttons">
  427. <button type="primary" @click="closeChinaUnionPayPopup">{{ t('Btn.Confirm') }}</button>
  428. <button @click="closeChinaUnionPayPopup">{{ t('Btn.Cancel') }}</button>
  429. </view>
  430. </view>
  431. </uni-popup>
  432. <!-- 不参加活动弹窗 -->
  433. <uni-popup ref="dontActivePopupRef" type="center">
  434. <view class="popup-content">
  435. <text class="popup-text">{{ t('Custom.Withdraw.item9') }}</text>
  436. <view class="popup-buttons">
  437. <button type="primary" @click="confirmDontActive">{{ t('Btn.Confirm') }}</button>
  438. <button @click="closeDontActivePopup">{{ t('Btn.Cancel') }}</button>
  439. </view>
  440. </view>
  441. </uni-popup>
  442. <!-- 20%赠金协议 -->
  443. <uni-popup ref="clausePopup" type="center">
  444. <view class="popup-content" style="width: 700rpx;">
  445. <text class="popup-title">{{ locale === 'cn' ? 'CWG 20%赠金入会礼' : '20% CASH BACK BONUS' }}</text>
  446. <scroll-view scroll-y style="height: 400rpx;">
  447. <rich-text :nodes="clauseContent" class="popup-text"></rich-text>
  448. </scroll-view>
  449. <view class="popup-buttons">
  450. <button @click="closeClausePopup">{{ t('Btn.Cancel') }}</button>
  451. <button type="primary" @click="closeClausePopup">{{ t('Btn.Confirm') }}</button>
  452. </view>
  453. </view>
  454. </uni-popup>
  455. <!-- 抽屉组件 -->
  456. <drawer :dialogInfoTradingAdd="dialogInfoTradingAdd" :addType="openType" @closeAdd="closeAdd"
  457. @confirmToReload="confirmToReload" />
  458. <view class="crm_verified_info_mask" v-if="dialogInfoTradingAdd" @click="closeDiaAdd"></view>
  459. </view>
  460. </cwg-page-wrapper>
  461. </template>
  462. <script setup>
  463. import { ref, reactive, computed, onMounted, watch, nextTick } from 'vue'
  464. import { onLoad } from '@dcloudio/uni-app'
  465. import { useI18n } from 'vue-i18n'
  466. import useUserStore from '@/stores/use-user-store'
  467. // import Drawer from '@/components/Drawer.vue'
  468. import { customApi } from '@/service/custom'
  469. import { financialApi } from '@/service/financial'
  470. import { activityApi } from '@/service/activity'
  471. import Config from '@/config/index'
  472. // import tool from '@/global/tool'
  473. import { initLink } from '@/utils/setUrl'
  474. import isImageType from '@/global/isImageType'
  475. import PaymentMethodsList from './components/PaymentMethodsList.vue'
  476. const { t, locale } = useI18n()
  477. const { Code, Host80, Host04 } = Config
  478. const imgUrl = Host80
  479. const Host85 = Host80
  480. // 用户信息
  481. const userStore = useUserStore()
  482. const userInfo = computed(() => userStore.userInfo)
  483. // 工具函数
  484. const Session = {
  485. get: (key, parse = false) => {
  486. const val = uni.getStorageSync(key)
  487. return parse ? JSON.parse(val) : val
  488. },
  489. set: (key, val) => uni.setStorageSync(key, val)
  490. }
  491. // 国家和地区列表(完整)
  492. const countries = [
  493. "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",
  494. "BH", "IR", "IQ", "IL", "JO", "KW", "LB", "OM", "PS", "QA", "SA", "SY", "TR", "AE", "YE",
  495. "AR", "BO", "BR", "CL", "CO", "EC", "GY", "PY", "PE", "SR", "UY", "VE", "BZ", "CR", "SV", "GT", "HN", "NI", "PA",
  496. "AU", "CA",
  497. "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"
  498. ]
  499. const groupTitleMap = {
  500. 1: 'Custom.Deposit.Channel1',
  501. 2: 'Custom.Deposit.Channel2',
  502. 3: 'Custom.Deposit.Channel3',
  503. 4: 'Custom.Deposit.Channel4',
  504. 5: 'card.title'
  505. }
  506. // 响应式数据
  507. const loginOptions = ref([])
  508. const selectedAccountIndex = ref(-1)
  509. const selectedAccountLabel = ref('')
  510. const loginValue = ref(null)
  511. const step2 = ref(false)
  512. const step3 = ref(false)
  513. const isStep3 = ref(false)
  514. const tableData = reactive({
  515. International_Transfer: [],
  516. China_UnionPay: [],
  517. Digital_Currency: [],
  518. Electronic_Wallet: [],
  519. Ucard_Wallet: []
  520. })
  521. const channelData = ref({})
  522. const introduce = ref({ introduce: '', enIntroduce: '' })
  523. const bankDate = ref([])
  524. const selectedBankIndex = ref(-1)
  525. const selectedBankLabel = ref('')
  526. const ruleForm = reactive({
  527. bankCredit: []
  528. })
  529. const params = reactive({
  530. amount: '',
  531. amount1: '',
  532. promoCode: '',
  533. agree2: false,
  534. agree3: false,
  535. agree4: false,
  536. agree5: false,
  537. agree6: false
  538. })
  539. const mAmount = reactive({ minAmount: '', maxAmount: '' })
  540. const isChannel = ref(true)
  541. const pictLoading = ref(false)
  542. const dialogInfoTradingAdd = ref(false)
  543. const openType = ref('')
  544. const myId = ref(null)
  545. const code = ref('')
  546. const selectCodes = ref('')
  547. const WireTransferAccount = ref({})
  548. const imageUrl = ref('')
  549. const imageUrl1 = ref('')
  550. const requiteVoucherUrl = ref('')
  551. const pictLoadingImg = ref(false)
  552. const flag = ref(false)
  553. const dialogSuccess = ref(false)
  554. const dialogMessage = ref('')
  555. const goPayLink = ref('')
  556. const popupType = ref('')
  557. const popupRef = ref(null)
  558. const vietnamPopupRef = ref(null)
  559. const chinaUnionPayPopupRef = ref(null)
  560. const dontActivePopupRef = ref(null)
  561. const clausePopupRef = ref(null)
  562. const dialogConfirmForm = reactive({ confirmAreaCode: '', confirmPhone: '' })
  563. const limitedStatus = ref(null)
  564. const limitedStatusCheck = ref(false)
  565. const ACCType = ref(null)
  566. const CheckExistSuccess = ref(false)
  567. const tableData4Flag = ref(false)
  568. const tableData4 = ref({})
  569. const tableData4TwoFlag = ref(false)
  570. const tableData4Two = ref({})
  571. const tableDataNewListFlag = ref(false)
  572. const tableDataNewList = ref({})
  573. const giveLoginJoin = ref('')
  574. const anshiClose = ref(true)
  575. const dialogChinaUnionPay = ref(false)
  576. const dialogVietnamNotice = ref(false)
  577. const tableDataNewYear24Flag = ref(false)
  578. const tableDataNewYear24 = ref(false)
  579. const NewYear24Data = reactive({ balance: 0, income: 0, rate: 0, index: 0 })
  580. const amountError = ref('')
  581. const selectedCreditIndex = ref(-1)
  582. const selectedCreditLabel = ref('')
  583. const loginComboxOptions = computed(() => {
  584. return loginOptions.value.map((item) => ({
  585. text: item.label,
  586. value: item.login
  587. }))
  588. })
  589. const creditCardOptions = computed(() => {
  590. return ruleForm.bankCredit.map((item, index) => ({
  591. text: `${item.bankUname}-${item.bankCardNum}`,
  592. value: item.id
  593. }))
  594. })
  595. const bankOptions = computed(() => {
  596. return bankDate.value.map((item, index) => ({
  597. text: (locale.value === 'cn' || locale.value === 'zhHant') ? item.name : item.enName,
  598. value: index
  599. }))
  600. })
  601. // 计算属性
  602. const country = computed(() => userInfo.value?.customInfo?.country || '')
  603. const userName = computed(() => {
  604. const info = userInfo.value?.customInfo
  605. if (!info) return ''
  606. return [info.firstName, info.middle, info.lastName].filter(Boolean).join(' ')
  607. })
  608. const areaCode = computed(() => userInfo.value?.customInfo?.areaCode)
  609. const phone = computed(() => userInfo.value?.customInfo?.phone)
  610. const isSupportedCountry = computed(() => {
  611. try {
  612. return countries.includes(country.value)
  613. } catch {
  614. return false
  615. }
  616. })
  617. const isGuoQin = computed(() => {
  618. // 国庆活动时间判断(保留原逻辑,时间判断需实现)
  619. let flag = false
  620. const startTime1 = "2024/10/01 00:00:00"
  621. const endTime1 = "2024/10/07 23:59:59"
  622. const timezone = 8
  623. const offset_GMT = new Date().getTimezoneOffset()
  624. const nowDate = new Date().getTime()
  625. const now = new Date(nowDate + offset_GMT * 60 * 1000 + timezone * 60 * 60 * 1000).getTime()
  626. const start = new Date(startTime1).getTime()
  627. const end = new Date(endTime1).getTime()
  628. if (now > start && now < end) flag = true
  629. return flag
  630. })
  631. const sortedTableData = computed(() => {
  632. const order = [
  633. tableData.Digital_Currency,
  634. tableData.China_UnionPay,
  635. tableData.Electronic_Wallet,
  636. tableData.International_Transfer,
  637. tableData.Ucard_Wallet
  638. ]
  639. return order.filter(item => item && item.length)
  640. })
  641. const needUploadVoucher = computed(() => {
  642. const codeVal = channelData.value.code
  643. return ['UNION_PAY_TELEGRAPHIC', 'UNION_PAY_TELEGRAPHIC_SPECIAL', 'UNION_PAY_TELEGRAPHIC_TWO'].includes(codeVal) ||
  644. (codeVal && codeVal.indexOf('DIGITAL_PAY_TYPE_KEY') === 0)
  645. })
  646. // 辅助函数
  647. const groupTypeName = (type) => {
  648. const map = {
  649. '1': 'AccountType.ClassicAccount',
  650. '2': 'AccountType.SeniorAccount',
  651. '5': 'AccountType.SpeedAccount',
  652. '6': 'AccountType.SpeedAccount',
  653. '7': 'AccountType.StandardAccount',
  654. '8': 'AccountType.CentAccount'
  655. }
  656. return t(map[type] || '')
  657. }
  658. const groupCurrency = (type) => {
  659. const symbol = { GBP: '£', USD: '$', EUR: '€', USC: '¢' }[type] || '$'
  660. return `: ${symbol}`
  661. }
  662. const isAfterSeptember30 = () => {
  663. // 原逻辑,根据实际情况
  664. return true
  665. }
  666. // 接口调用(完整保留)
  667. const getDateList = async () => {
  668. const res = await customApi.CustomDropdown({ platform: '' })
  669. if (res.code === Code.StatusOK) {
  670. loginOptions.value = res.data.map(item => ({
  671. ...item,
  672. label: `${item.login} - ${groupTypeName(item.type)} - ${t('Custom.Deposit.AvailableBalance')}${groupCurrency(item.currency)}${item.balance}`
  673. }))
  674. const pages = getCurrentPages()
  675. const route = pages[pages.length - 1].$page?.options || {}
  676. if (route.login) {
  677. const found = loginOptions.value.find(opt => opt.login === Number(route.login))
  678. if (found) {
  679. selectedAccountIndex.value = loginOptions.value.indexOf(found)
  680. selectedAccountLabel.value = found.label
  681. loginValue.value = found.login
  682. step2.value = true
  683. get23nianzhongTwoLogin(loginValue.value)
  684. getActivityExtensionGiveLogin(loginValue.value)
  685. getActivityExtensionGiveLoginJoin(loginValue.value)
  686. ACCType.value = found.type
  687. }
  688. }
  689. } else {
  690. uni.showToast({ title: res.msg, icon: 'none' })
  691. }
  692. }
  693. const getDepositList = async () => {
  694. pictLoading.value = true
  695. const res = await financialApi.RemittanceChannelList({})
  696. if (res.code === Code.StatusOK) {
  697. tableData.International_Transfer = []
  698. tableData.China_UnionPay = []
  699. tableData.Digital_Currency = []
  700. tableData.Electronic_Wallet = []
  701. tableData.Ucard_Wallet = []
  702. res.data.forEach(item => {
  703. if (item.type == 1) tableData.International_Transfer.push(item)
  704. if (item.type == 2) tableData.China_UnionPay.push(item)
  705. if (item.type == 3) tableData.Digital_Currency.push(item)
  706. if (item.type == 4) tableData.Electronic_Wallet.push(item)
  707. if (item.type == 5) tableData.Ucard_Wallet.push(item)
  708. })
  709. pictLoading.value = false
  710. } else {
  711. uni.showToast({ title: res.msg, icon: 'none' })
  712. pictLoading.value = false
  713. }
  714. }
  715. const getBankList = async (row) => {
  716. const res = await financialApi.BankList({ channelCode: row.code })
  717. if (res.code === Code.StatusOK) {
  718. const data = res.data.map(j => ({
  719. ...j,
  720. minAmount: j.minAmount ?? row.minAmount,
  721. maxAmount: j.maxAmount ?? row.maxAmount,
  722. bankValid: row.bankValid,
  723. requestUrl: row.requestUrl
  724. }))
  725. bankDate.value = data
  726. } else {
  727. uni.showToast({ title: res.msg, icon: 'none' })
  728. }
  729. }
  730. const getBankInfo = async () => {
  731. const res = await financialApi.customBankList({})
  732. if (res.code === Code.StatusOK) {
  733. ruleForm.bankCredit = []
  734. res.data.forEach(item => {
  735. if (item.type == 3) {
  736. item.customBankCode = item.bankCode
  737. item.bankCode = null
  738. ruleForm.bankCredit.push(item)
  739. if (item.defaultBank) {
  740. myId.value = item.id
  741. // 填充表单(如需要)
  742. }
  743. }
  744. })
  745. } else {
  746. uni.showToast({ title: res.msg, icon: 'none' })
  747. }
  748. }
  749. const getCheckExistSuccess = async () => {
  750. const res = await financialApi.depositCheckExistSuccess({})
  751. if (res.code == Code.StatusOK) CheckExistSuccess.value = res.data
  752. else uni.showToast({ title: res.msg, icon: 'none' })
  753. }
  754. const get23nianzhongTwoLogin = async (login) => {
  755. const res = await activityApi.Activity23nianzhongTwoLogin({ login })
  756. if (res.code == Code.StatusOK) {
  757. tableData4Two.value = res.data
  758. tableData4TwoFlag.value = res.data.show == 1
  759. } else {
  760. uni.showToast({ title: res.msg, icon: 'none' })
  761. }
  762. }
  763. const getActivityExtensionGiveLogin = async (login) => {
  764. const res = await activityApi.ActivityExtensionGiveLogin({ login })
  765. if (res.code == Code.StatusOK) {
  766. tableDataNewList.value = res.data
  767. tableDataNewListFlag.value = res.data.show == 1
  768. } else {
  769. uni.showToast({ title: res.msg, icon: 'none' })
  770. }
  771. }
  772. const getActivityExtensionGiveLoginJoin = async (login) => {
  773. const res = await activityApi.ActivityExtensionGiveLoginJoin({ login })
  774. if (res.code == Code.StatusOK) giveLoginJoin.value = res.data
  775. else uni.showToast({ title: res.msg, icon: 'none' })
  776. }
  777. const Activity24nianzhongInfo = async () => {
  778. const res = await activityApi.Activity23nianzhongInfo({})
  779. if (res.code == Code.StatusOK) {
  780. tableData4.value = res.data
  781. // 根据 show 和 useApply 设置 tableData4Flag,原逻辑有注释,按实际需要
  782. tableData4Flag.value = (res.data.show == 1 && res.data.useApply == 1)
  783. } else {
  784. uni.showToast({ title: res.msg, icon: 'none' })
  785. }
  786. }
  787. const Activity24nianzhongTwoInfo = async () => {
  788. const res = await activityApi.Activity23nianzhongTwoInfo({})
  789. if (res.code == Code.StatusOK) {
  790. tableData4Two.value = res.data
  791. tableData4TwoFlag.value = (res.data.show == 1 && res.data.useApply == 1)
  792. } else {
  793. uni.showToast({ title: res.msg, icon: 'none' })
  794. }
  795. }
  796. const ActivityRequiteInfo = async () => {
  797. const res = await activityApi.ActivityRequiteInfo({})
  798. if (res.code == Code.StatusOK) limitedStatus.value = res.data
  799. }
  800. const ActivityNewYear24 = async () => {
  801. const res = await activityApi.ActivityNewYear24({})
  802. if (res.code == Code.StatusOK) {
  803. tableDataNewYear24.value = res.data
  804. if (typeof res.data == 'object') {
  805. toIncome()
  806. }
  807. } else {
  808. uni.showToast({ title: res.msg, icon: 'none' })
  809. }
  810. }
  811. const toIncome = () => {
  812. const balance = Number(tableDataNewYear24.value.balance) || 0
  813. const details = tableDataNewYear24.value.details || []
  814. for (let i = 0; i < details.length; i++) {
  815. const item = details[i]
  816. if (balance > item.min && balance <= item.max) {
  817. NewYear24Data.rate = item.rate
  818. NewYear24Data.index = i
  819. NewYear24Data.balance = (details[i + 1]?.min - balance).toFixed(2)
  820. NewYear24Data.income = (((details[i + 1]?.min * details[i + 1]?.rate) / 100 / 365) * 365).toFixed(2)
  821. tableDataNewYear24Flag.value = true
  822. break
  823. } else if (balance > item.min && balance >= item.max && item.max == 0) {
  824. tableDataNewYear24Flag.value = false
  825. }
  826. }
  827. }
  828. const isNewYear24Open = () => {
  829. const endTime1 = "2025/3/31 23:59:59"
  830. const startTime1 = "2025/1/1 00:00:00"
  831. const timezone = 2
  832. const offset_GMT = new Date().getTimezoneOffset()
  833. const nowDate = new Date().getTime()
  834. const now = new Date(nowDate + offset_GMT * 60 * 1000 + timezone * 60 * 60 * 1000).getTime()
  835. const start = new Date(startTime1).getTime()
  836. const end = new Date(endTime1).getTime()
  837. if (now < end && start < now) {
  838. ActivityNewYear24()
  839. }
  840. }
  841. const is20Open = () => {
  842. const endTime1 = "2023/04/30 23:59:59"
  843. const timezone = 2
  844. const offset_GMT = new Date().getTimezoneOffset()
  845. const nowDate = new Date().getTime()
  846. const now = new Date(nowDate + offset_GMT * 60 * 1000 + timezone * 60 * 60 * 1000).getTime()
  847. const end = new Date(endTime1).getTime()
  848. if (now > end) anshiClose.value = false
  849. }
  850. // 事件处理
  851. const onAccountChange = (val) => {
  852. const item = loginOptions.value.find(opt => opt.login === val)
  853. if (item) {
  854. selectedAccountIndex.value = loginOptions.value.indexOf(item)
  855. selectedAccountLabel.value = item.label
  856. loginValue.value = item.login
  857. step2.value = true
  858. showTable()
  859. get23nianzhongTwoLogin(loginValue.value)
  860. getActivityExtensionGiveLogin(loginValue.value)
  861. getActivityExtensionGiveLoginJoin(loginValue.value)
  862. ACCType.value = item.type
  863. }
  864. }
  865. const showTable = () => {
  866. myId.value = null
  867. step3.value = false
  868. isStep3.value = false
  869. isChannel.value = true
  870. params.amount = ''
  871. params.amount1 = ''
  872. params.agree2 = false
  873. params.agree3 = false
  874. params.agree4 = false
  875. params.agree5 = false
  876. params.agree6 = false
  877. params.promoCode = ''
  878. imageUrl.value = ''
  879. imageUrl1.value = ''
  880. bankDate.value = []
  881. code.value = ''
  882. WireTransferAccount.value = {}
  883. introduce.value = { introduce: '', enIntroduce: '' }
  884. getDepositList()
  885. }
  886. const doShowStep3 = (row) => {
  887. if (row.confirmCreditCard == 1) {
  888. getBankInfo()
  889. }
  890. getCheckExistSuccess()
  891. if (row.bankValid && isChannel.value) {
  892. getBankList(row)
  893. isChannel.value = false
  894. step3.value = true
  895. channelData.value = row
  896. mAmount.minAmount = row.minAmount
  897. mAmount.maxAmount = row.maxAmount
  898. } else {
  899. step3.value = true
  900. bankDate.value = []
  901. channelData.value = row
  902. mAmount.minAmount = row.minAmount
  903. mAmount.maxAmount = row.maxAmount
  904. }
  905. // 重置 tableData 为当前选中项
  906. const typeMap = {
  907. 1: 'International_Transfer',
  908. 2: 'China_UnionPay',
  909. 3: 'Digital_Currency',
  910. 4: 'Electronic_Wallet',
  911. 5: 'Ucard_Wallet'
  912. }
  913. const key = typeMap[row.type]
  914. if (key) {
  915. tableData[key] = [row]
  916. // 清空其他
  917. Object.keys(tableData).forEach(k => { if (k !== key) tableData[k] = [] })
  918. }
  919. introduce.value = { introduce: row.introduce, enIntroduce: row.enIntroduce }
  920. // 处理电汇/数字货币特有信息
  921. if (['UNION_PAY_TELEGRAPHIC', 'UNION_PAY_TELEGRAPHIC_SPECIAL', 'UNION_PAY_TELEGRAPHIC_TWO', 'DIGITAL_PAY_TYPE_KEY'].some(prefix => row.code?.startsWith(prefix))) {
  922. let pro = []
  923. if (row.property) {
  924. try {
  925. pro = JSON.parse(row.property)
  926. } catch (e) {
  927. pro = JSON.parse('[' + row.property + ']')
  928. }
  929. }
  930. if (pro.length) {
  931. const index = Math.floor(Math.random() * pro.length)
  932. WireTransferAccount.value = pro[index]
  933. } else {
  934. WireTransferAccount.value = {}
  935. }
  936. }
  937. }
  938. const isShowStep3 = (row) => {
  939. if (row.kycChannel != 1) {
  940. doShowStep3(row)
  941. } else {
  942. // KYC 验证,原逻辑会调用 qrCode 方法,这里简化直接调用 doShowStep3(实际应实现验证)
  943. doShowStep3(row)
  944. }
  945. }
  946. const onBankChange = (idx) => {
  947. const item = bankDate.value[idx]
  948. if (item) {
  949. selectedBankIndex.value = idx
  950. selectedBankLabel.value = (locale.value === 'cn' || locale.value === 'zhHant') ? item.name : item.enName
  951. selectCodes.value = selectedBankLabel.value
  952. code.value = item.code
  953. mAmount.minAmount = item.minAmount || mAmount.minAmount
  954. mAmount.maxAmount = item.maxAmount || mAmount.maxAmount
  955. channelData.value.rate = item.rate || channelData.value.rate
  956. channelData.value.transformCurrency = item.currency || channelData.value.transformCurrency
  957. }
  958. }
  959. const onCreditCardChange = (val) => {
  960. const item = ruleForm.bankCredit.find(i => i.id === val)
  961. if (item) {
  962. selectedCreditIndex.value = ruleForm.bankCredit.indexOf(item)
  963. selectedCreditLabel.value = `${item.bankUname}-${item.bankCardNum}`
  964. myId.value = item.id
  965. // 填充表单(原 chooseBank 逻辑)
  966. }
  967. }
  968. const onAmountInput = (e) => {
  969. console.log(e, e.detail.value);
  970. const val = e.detail.value
  971. params.amount = val
  972. if (val && channelData.value.rate) {
  973. params.amount1 = (val * channelData.value.rate).toFixed(2)
  974. }
  975. // 金额校验
  976. if (val && (val < mAmount.minAmount || val > mAmount.maxAmount)) {
  977. amountError.value = `${t('vaildate.amount.amount')}${mAmount.minAmount} - ${mAmount.maxAmount}`
  978. } else if (val && !/^[1-9]\d*$/.test(val)) {
  979. amountError.value = t('vaildate.amount.format1')
  980. } else {
  981. amountError.value = ''
  982. }
  983. }
  984. const showEstimateHelp = () => {
  985. uni.showModal({ title: t('Custom.Deposit.des'), content: '', showCancel: false })
  986. }
  987. const chooseImage = () => {
  988. uni.chooseImage({
  989. count: 1,
  990. sizeType: ['compressed'],
  991. sourceType: ['album', 'camera'],
  992. success: (res) => {
  993. const tempFilePath = res.tempFilePaths[0]
  994. const ext = tempFilePath.split('.').pop().toLowerCase()
  995. if (!['jpg', 'jpeg', 'png', 'gif', 'bmp'].includes(ext)) {
  996. uni.showToast({ title: t('Msg.JPG'), icon: 'none' })
  997. return
  998. }
  999. uni.getFileInfo({
  1000. filePath: tempFilePath,
  1001. success: (info) => {
  1002. if (info.size > 3 * 1024 * 1024) {
  1003. uni.showToast({ title: t('Msg.3IMG'), icon: 'none' })
  1004. return
  1005. }
  1006. pictLoadingImg.value = true
  1007. uni.uploadFile({
  1008. url: Config.Host80 + '/common/upload',
  1009. filePath: tempFilePath,
  1010. name: 'file',
  1011. header: { 'Access-Token': Session.get('access_token') },
  1012. success: (uploadRes) => {
  1013. const resData = JSON.parse(uploadRes.data)
  1014. if (resData.code == 200) {
  1015. uni.showToast({ title: resData.msg, icon: 'success' })
  1016. imageUrl.value = resData.data
  1017. requiteVoucherUrl.value = resData.data
  1018. } else {
  1019. uni.showToast({ title: resData.msg, icon: 'none' })
  1020. }
  1021. },
  1022. fail: () => {
  1023. uni.showToast({ title: t('Msg.Fail'), icon: 'none' })
  1024. },
  1025. complete: () => {
  1026. pictLoadingImg.value = false
  1027. }
  1028. })
  1029. }
  1030. })
  1031. }
  1032. })
  1033. }
  1034. const isStep3Open = () => {
  1035. isStep3.value = true
  1036. if (tableData.China_UnionPay.length && tableData.China_UnionPay[0].type == 2) {
  1037. const now = new Date()
  1038. const hours = now.getHours()
  1039. if (hours < 8 || hours >= 22) {
  1040. chinaUnionPayPopupRef.value?.open()
  1041. }
  1042. }
  1043. }
  1044. const openAddBankCard = () => {
  1045. if (ruleForm.bankCredit.length == 2) {
  1046. uni.showModal({
  1047. title: t('Msg.SystemPrompt'),
  1048. content: t('Msg.WireTransfers'),
  1049. showCancel: true,
  1050. confirmText: t('Btn.Confirm'),
  1051. cancelText: t('Btn.Cancel')
  1052. })
  1053. } else {
  1054. openType.value = 'add_CreditCard'
  1055. dialogInfoTradingAdd.value = true
  1056. }
  1057. }
  1058. const closeAdd = (val) => { dialogInfoTradingAdd.value = val }
  1059. const confirmToReload = () => {
  1060. dialogInfoTradingAdd.value = false
  1061. getBankInfo()
  1062. }
  1063. const closeDiaAdd = () => { dialogInfoTradingAdd.value = false }
  1064. // 提交确认逻辑
  1065. const submitConfirm = () => {
  1066. console.log(params, 121212);
  1067. // 原 openDontActive 逻辑,先判断活动冲突,然后打开确认弹窗
  1068. if (!tableData4Flag.value && !tableData4TwoFlag.value && !tableDataNewListFlag.value &&
  1069. (country.value != 'CN' || (country.value == 'CN' && (ACCType.value == 1 || ACCType.value == 2 || ACCType.value == 7))) &&
  1070. ACCType.value != 3 && params.agree2) {
  1071. // 已勾选普通活动,直接进入确认
  1072. openConfirmDialog()
  1073. return
  1074. }
  1075. if (tableData4Flag.value && params.agree4) {
  1076. openConfirmDialog()
  1077. return
  1078. }
  1079. if (tableData4TwoFlag.value && params.agree5) {
  1080. openConfirmDialog()
  1081. return
  1082. }
  1083. if (tableDataNewListFlag.value && params.agree6) {
  1084. openConfirmDialog()
  1085. return
  1086. }
  1087. if (limitedStatus.value && limitedStatusCheck.value) {
  1088. openConfirmDialog()
  1089. return
  1090. }
  1091. if ((ACCType.value == 1 || ACCType.value == 2 || ACCType.value == 5 || ACCType.value == 6 || ACCType.value == 7) && anshiClose.value && params.agree3) {
  1092. openConfirmDialog()
  1093. return
  1094. }
  1095. // 否则显示不参加活动弹窗
  1096. dontActivePopupRef.value?.open()
  1097. }
  1098. const openConfirmDialog = () => {
  1099. if (channelData.value.confirmCreditCard == 1 && !myId.value) {
  1100. uni.showToast({ title: t('PersonalManagement.Label.selectCreditCard'), icon: 'none' })
  1101. return
  1102. }
  1103. if (channelData.value.bankValid == 1 && !code.value) {
  1104. uni.showToast({ title: t('vaildate.depositCurrency.empty'), icon: 'none' })
  1105. return
  1106. }
  1107. if (needUploadVoucher.value && !imageUrl.value) {
  1108. uni.showToast({ title: t('vaildate.depositVoucher.empty'), icon: 'none' })
  1109. return
  1110. }
  1111. if (params.promoCode && (params.agree2 || params.agree3 || params.agree4 || params.agree5 || params.agree6)) {
  1112. uni.showToast({ title: t('news_add_field.Des.item2'), icon: 'none' })
  1113. return
  1114. }
  1115. if (!params.amount) {
  1116. uni.showToast({ title: t('vaildate.input.empty'), icon: 'none' })
  1117. return
  1118. }
  1119. if (amountError.value) {
  1120. uni.showToast({ title: amountError.value, icon: 'none' })
  1121. return
  1122. }
  1123. dialogConfirmForm.confirmAreaCode = areaCode.value
  1124. dialogConfirmForm.confirmPhone = phone.value
  1125. popupType.value = 'confirm'
  1126. popupRef.value?.open()
  1127. }
  1128. const confirmDontActive = () => {
  1129. dontActivePopupRef.value?.close()
  1130. openConfirmDialog()
  1131. }
  1132. const closeDontActivePopup = () => {
  1133. dontActivePopupRef.value?.close()
  1134. }
  1135. const closePopup = () => popupRef.value?.close()
  1136. const submitDeposit = () => {
  1137. popupRef.value?.close()
  1138. submit()
  1139. }
  1140. const submit = async () => {
  1141. if (flag.value) return
  1142. flag.value = true
  1143. popupType.value = 'wait'
  1144. popupRef.value?.open()
  1145. try {
  1146. let res = null
  1147. if (['UNION_PAY_TELEGRAPHIC', 'UNION_PAY_TELEGRAPHIC_SPECIAL', 'UNION_PAY_TELEGRAPHIC_TWO'].includes(channelData.value.code)) {
  1148. res = await financialApi.telegraphicPay({
  1149. requiteVoucherUrl: imageUrl1.value,
  1150. amount: params.amount,
  1151. login: loginValue.value,
  1152. voucherUrl: imageUrl.value,
  1153. activityDeposit: params.agree2 ? 1 : 0,
  1154. activityPercentageGive: params.agree3 ? 1 : 0,
  1155. activityMidyearTenPercentGive: params.agree4 ? 1 : 0,
  1156. activityTwoPercentGive: params.agree5 ? 1 : 0,
  1157. activityGive: params.agree6 ? 1 : 0,
  1158. promoCode: params.promoCode,
  1159. code: channelData.value.code,
  1160. bankMsg: WireTransferAccount.value.bankMsg || '',
  1161. name: channelData.value.confirmName ? userName.value : null,
  1162. areaCode: channelData.value.confirmAreaCode ? dialogConfirmForm.confirmAreaCode : null,
  1163. phone: channelData.value.confirmPhone ? dialogConfirmForm.confirmPhone : null,
  1164. ip: sessionStorage.getItem('CLIENT')
  1165. })
  1166. } else if (channelData.value.code && channelData.value.code.indexOf('DIGITAL_PAY_TYPE_KEY') === 0) {
  1167. res = await financialApi.digitalPay({
  1168. requiteVoucherUrl: imageUrl1.value,
  1169. amount: params.amount,
  1170. login: loginValue.value,
  1171. voucherUrl: imageUrl.value,
  1172. activityDeposit: params.agree2 ? 1 : 0,
  1173. activityPercentageGive: params.agree3 ? 1 : 0,
  1174. activityMidyearTenPercentGive: params.agree4 ? 1 : 0,
  1175. activityTwoPercentGive: params.agree5 ? 1 : 0,
  1176. activityGive: params.agree6 ? 1 : 0,
  1177. promoCode: params.promoCode,
  1178. ip: sessionStorage.getItem('CLIENT')
  1179. })
  1180. } else {
  1181. let url = channelData.value.bankValid == 1
  1182. ? `${channelData.value.requestUrl}/${loginValue.value}/${params.amount}/${code.value}/${params.agree2 ? 1 : 0}`
  1183. : `${channelData.value.requestUrl}/${loginValue.value}/${params.amount}/${params.agree2 ? 1 : 0}`
  1184. res = await financialApi.PayBankCode(url, {
  1185. requiteVoucherUrl: imageUrl1.value,
  1186. promoCode: params.promoCode,
  1187. name: channelData.value.confirmName ? userName.value : null,
  1188. areaCode: channelData.value.confirmAreaCode ? dialogConfirmForm.confirmAreaCode : null,
  1189. phone: channelData.value.confirmPhone ? dialogConfirmForm.confirmPhone : null,
  1190. activityPercentageGive: params.agree3 ? 1 : 0,
  1191. activityMidyearTenPercentGive: params.agree4 ? 1 : 0,
  1192. activityTwoPercentGive: params.agree5 ? 1 : 0,
  1193. activityGive: params.agree6 ? 1 : 0,
  1194. ip: sessionStorage.getItem('CLIENT')
  1195. })
  1196. }
  1197. popupRef.value?.close()
  1198. if (res.code == Code.StatusOK) {
  1199. const data = res.data
  1200. if (data.type == 1) {
  1201. goPayLink.value = data.result
  1202. window.open(data.result)
  1203. showResult(true, t('ApplicationDialog.Des1'))
  1204. } else if (data.type == 2) {
  1205. let token = Session.get('access_token')
  1206. // token = tool.tokenReplace(token)
  1207. goPayLink.value = Host04 + `/finance/deposit/get?serial=${data.result}&Access-Token=${token}`
  1208. window.open(goPayLink.value)
  1209. showResult(true, t('ApplicationDialog.Des1'))
  1210. } else if (data.type == 5) {
  1211. uni.showModal({
  1212. title: t('Msg.SystemPrompt'),
  1213. content: t('PersonalManagement.Label.item2'),
  1214. showCancel: true,
  1215. confirmText: t('Btn.Cancel'),
  1216. cancelText: t('Btn.Confirm'),
  1217. success: (modalRes) => {
  1218. if (modalRes.cancel) {
  1219. goPayLink.value = data.result
  1220. window.open(goPayLink.value)
  1221. showResult(true, t('ApplicationDialog.Des1'))
  1222. }
  1223. }
  1224. })
  1225. } else if (data.type == 8) {
  1226. goPayLink.value = Host04 + data.result
  1227. window.open(goPayLink.value)
  1228. showResult(true, t('ApplicationDialog.Des1'))
  1229. } else if (data.type == 9) {
  1230. goPayLink.value = setCardUrl(data.result)
  1231. window.open(goPayLink.value)
  1232. showResult(true, t('ApplicationDialog.Des1'))
  1233. } else if (data.type == 10) {
  1234. goPayLink.value = Host80 + '/pay/onchainpay.html?params=' + data.result
  1235. window.open(goPayLink.value)
  1236. showResult(true, t('ApplicationDialog.Des1'))
  1237. } else {
  1238. showResult(true, t('ApplicationDialog.Des1'))
  1239. }
  1240. } else {
  1241. showResult(false, res.msg)
  1242. }
  1243. } catch (err) {
  1244. popupRef.value?.close()
  1245. showResult(false, t('Msg.Fail'))
  1246. }
  1247. flag.value = false
  1248. }
  1249. const setCardUrl = (serial) => {
  1250. const token = Session.get('access_token')
  1251. const params = `${token}/${locale.value}/${serial}/1/pay`
  1252. return initLink({ link: imgUrl + '/pay/paycard.html', params })
  1253. }
  1254. const showResult = (success, msg) => {
  1255. dialogSuccess.value = success
  1256. dialogMessage.value = msg
  1257. popupType.value = 'result'
  1258. popupRef.value?.open()
  1259. }
  1260. const closeResultPopup = () => {
  1261. popupRef.value?.close()
  1262. if (dialogSuccess.value) {
  1263. showTable()
  1264. step2.value = false
  1265. step3.value = false
  1266. isStep3.value = false
  1267. selectedAccountIndex.value = -1
  1268. selectedAccountLabel.value = ''
  1269. loginValue.value = null
  1270. }
  1271. }
  1272. const closeVietnamPopup = () => vietnamPopupRef.value?.close()
  1273. const closeChinaUnionPayPopup = () => chinaUnionPayPopupRef.value?.close()
  1274. const closeClausePopup = () => clausePopupRef.value?.close()
  1275. const clauseContent = computed(() => {
  1276. // 根据语言返回协议内容,原代码有大量 html,此处简化,实际应保留
  1277. return `<div>协议内容...</div>`
  1278. })
  1279. // 越南用户提示
  1280. const showVietnamNotice = () => {
  1281. if (country.value === 'VN') {
  1282. vietnamPopupRef.value?.open()
  1283. }
  1284. }
  1285. // 监听账户切换(watch value 原代码,改为 watch loginValue)
  1286. watch(() => loginValue.value, (newVal) => {
  1287. if (newVal) {
  1288. step2.value = true
  1289. showTable()
  1290. }
  1291. })
  1292. watch(() => params.amount, (newVal) => {
  1293. if (newVal && channelData.value.rate) {
  1294. params.amount1 = (newVal * channelData.value.rate).toFixed(2)
  1295. }
  1296. })
  1297. watch(() => params.agree3, (newVal) => {
  1298. if (newVal) {
  1299. params.agree2 = false
  1300. params.agree4 = false
  1301. params.agree5 = false
  1302. params.agree6 = false
  1303. }
  1304. })
  1305. watch(() => params.agree2, (newVal) => {
  1306. if (newVal) {
  1307. params.agree3 = false
  1308. params.agree4 = false
  1309. params.agree5 = false
  1310. params.agree6 = false
  1311. }
  1312. })
  1313. watch(() => params.agree4, (newVal) => {
  1314. if (newVal) {
  1315. params.agree2 = false
  1316. params.agree3 = false
  1317. params.agree5 = false
  1318. params.agree6 = false
  1319. }
  1320. })
  1321. watch(() => params.agree5, (newVal) => {
  1322. if (newVal) {
  1323. params.agree2 = false
  1324. params.agree3 = false
  1325. params.agree4 = false
  1326. params.agree6 = false
  1327. }
  1328. })
  1329. watch(() => params.agree6, (newVal) => {
  1330. if (newVal) {
  1331. params.agree2 = false
  1332. params.agree3 = false
  1333. params.agree4 = false
  1334. params.agree5 = false
  1335. if (giveLoginJoin.value?.flag == false) {
  1336. let tips = ''
  1337. if (giveLoginJoin.value?.promptType == 1) {
  1338. tips = t('surplusList.item10')
  1339. } else {
  1340. tips = t('surplusList.item11')
  1341. }
  1342. if (giveLoginJoin.value?.activityCategory == 1) {
  1343. uni.showModal({
  1344. title: t('Msg.SystemPrompt'),
  1345. content: tips,
  1346. showCancel: true,
  1347. confirmText: t('surplusList.item12'),
  1348. cancelText: t('Home.msg.item3'),
  1349. success: (modalRes) => {
  1350. if (modalRes.confirm) {
  1351. uni.showModal({
  1352. title: t('Msg.SystemPrompt'),
  1353. content: t('surplusList.item13'),
  1354. showCancel: true,
  1355. confirmText: t('Btn.Confirm'),
  1356. cancelText: t('Btn.Cancel'),
  1357. success: async (res) => {
  1358. if (res.confirm) {
  1359. const cancelRes = await activityApi.ActivityGiveCancel({ login: loginValue.value })
  1360. if (cancelRes.code == Code.StatusOK) {
  1361. uni.showToast({ title: cancelRes.msg || t('Msg.Success'), icon: 'success' })
  1362. } else {
  1363. uni.showToast({ title: cancelRes.msg, icon: 'none' })
  1364. }
  1365. } else {
  1366. params.agree6 = false
  1367. }
  1368. }
  1369. })
  1370. } else {
  1371. params.agree6 = false
  1372. }
  1373. }
  1374. })
  1375. } else if (giveLoginJoin.value?.activityCategory == 2) {
  1376. uni.showModal({
  1377. title: t('Msg.SystemPrompt'),
  1378. content: tips,
  1379. showCancel: true,
  1380. confirmText: '跳转',
  1381. cancelText: t('Btn.Cancel'),
  1382. success: (modalRes) => {
  1383. if (modalRes.confirm) {
  1384. uni.showModal({
  1385. title: t('Msg.SystemPrompt'),
  1386. content: '是否跳转到对应活动取消',
  1387. showCancel: true,
  1388. confirmText: t('Btn.Confirm'),
  1389. cancelText: t('Btn.Cancel'),
  1390. success: (res) => {
  1391. if (res.confirm) {
  1392. uni.navigateTo({ url: '/pages/customer/monthly/list' })
  1393. } else {
  1394. params.agree6 = false
  1395. }
  1396. }
  1397. })
  1398. } else {
  1399. params.agree6 = false
  1400. }
  1401. }
  1402. })
  1403. } else {
  1404. uni.showModal({
  1405. title: t('Msg.SystemPrompt'),
  1406. content: tips,
  1407. showCancel: true,
  1408. confirmText: t('Btn.Confirm'),
  1409. cancelText: t('Btn.Cancel')
  1410. })
  1411. }
  1412. }
  1413. }
  1414. })
  1415. // 生命周期
  1416. onLoad(() => {
  1417. getDateList()
  1418. getDepositList()
  1419. is20Open()
  1420. isNewYear24Open()
  1421. ActivityRequiteInfo()
  1422. Activity24nianzhongInfo()
  1423. Activity24nianzhongTwoInfo()
  1424. showVietnamNotice()
  1425. })
  1426. </script>
  1427. <style lang="scss" scoped>
  1428. @import "@/uni.scss";
  1429. .custom-deposit {
  1430. .crm-title-box {
  1431. margin-bottom: px2rpx(20);
  1432. .tit {
  1433. font-size: px2rpx(20);
  1434. font-weight: 700;
  1435. color: var(--color-navy-900);
  1436. }
  1437. }
  1438. .box {
  1439. margin-bottom: px2rpx(20);
  1440. .b-card {
  1441. background: #fff;
  1442. border-radius: px2rpx(12);
  1443. padding: px2rpx(20);
  1444. box-shadow: 0 px2rpx(4) px2rpx(12) rgba(0, 0, 0, 0.03);
  1445. .card-top {
  1446. .tit {
  1447. font-size: px2rpx(16);
  1448. font-weight: 600;
  1449. margin-bottom: px2rpx(16);
  1450. display: flex;
  1451. align-items: center;
  1452. color: var(--color-navy-900);
  1453. position: relative;
  1454. padding-left: 20px;
  1455. &:after {
  1456. content: '';
  1457. position: absolute;
  1458. left: 0;
  1459. top: 50%;
  1460. transform: translateY(-50%);
  1461. width: 0;
  1462. height: 0;
  1463. border-top: 6px solid transparent;
  1464. border-bottom: 6px solid transparent;
  1465. border-left: 8px solid currentColor;
  1466. }
  1467. }
  1468. }
  1469. .channelType {
  1470. font-size: px2rpx(15);
  1471. font-weight: 600;
  1472. margin: px2rpx(24) 0 px2rpx(12);
  1473. color: var(--color-navy-700);
  1474. padding-left: px2rpx(8);
  1475. border-left: px2rpx(4) solid var(--color-primary);
  1476. }
  1477. }
  1478. }
  1479. .reselect-btn {
  1480. margin-top: px2rpx(20);
  1481. display: flex;
  1482. justify-content: flex-end;
  1483. .reselect {
  1484. background-color: var(--color-zinc-100);
  1485. color: var(--color-navy-700);
  1486. border: none;
  1487. font-size: px2rpx(14);
  1488. padding: px2rpx(8) px2rpx(20);
  1489. border-radius: px2rpx(8);
  1490. &:active {
  1491. background-color: var(--color-zinc-200);
  1492. }
  1493. }
  1494. }
  1495. .s-btn[type="primary"] {
  1496. width: 100%;
  1497. height: px2rpx(48);
  1498. background: var(--color-navy-900);
  1499. color: #fff;
  1500. border-radius: px2rpx(12);
  1501. font-size: px2rpx(16);
  1502. font-weight: 600;
  1503. display: flex;
  1504. align-items: center;
  1505. justify-content: center;
  1506. border: none;
  1507. margin-top: px2rpx(30);
  1508. transition: all 0.2s;
  1509. &:active {
  1510. transform: scale(0.98);
  1511. background: var(--color-navy-800);
  1512. }
  1513. }
  1514. .add-back {
  1515. display: flex;
  1516. justify-content: space-between;
  1517. align-items: center;
  1518. margin-bottom: px2rpx(12);
  1519. padding: px2rpx(12) px2rpx(16);
  1520. background: var(--color-zinc-100);
  1521. border-radius: px2rpx(8);
  1522. text {
  1523. font-size: px2rpx(14);
  1524. color: var(--color-navy-700);
  1525. font-weight: 500;
  1526. }
  1527. .add-btn {
  1528. color: var(--color-primary);
  1529. font-weight: 600;
  1530. text-decoration: underline;
  1531. &:active {
  1532. opacity: 0.7;
  1533. }
  1534. }
  1535. }
  1536. .wire-transfer-account {
  1537. background: var(--color-zinc-50);
  1538. padding: px2rpx(16);
  1539. border-radius: px2rpx(12);
  1540. margin: px2rpx(16) 0;
  1541. .row {
  1542. display: flex;
  1543. margin-bottom: px2rpx(12);
  1544. font-size: px2rpx(14);
  1545. &:last-child {
  1546. margin-bottom: 0;
  1547. }
  1548. .label {
  1549. width: px2rpx(120);
  1550. color: var(--color-zinc-500);
  1551. }
  1552. .content {
  1553. flex: 1;
  1554. color: var(--color-navy-900);
  1555. font-weight: 500;
  1556. }
  1557. .SpecialColor {
  1558. color: var(--color-error);
  1559. }
  1560. }
  1561. }
  1562. .activities {
  1563. margin: px2rpx(24) 0;
  1564. .checkbox {
  1565. display: flex;
  1566. align-items: flex-start;
  1567. gap: px2rpx(8);
  1568. margin-bottom: px2rpx(12);
  1569. :deep(uni-checkbox .uni-checkbox-input) {
  1570. border-radius: px2rpx(4);
  1571. width: px2rpx(18);
  1572. height: px2rpx(18);
  1573. }
  1574. text {
  1575. font-size: px2rpx(14);
  1576. color: var(--color-navy-700);
  1577. font-weight: 500;
  1578. line-height: 1.5;
  1579. }
  1580. }
  1581. .clause-text {
  1582. font-size: px2rpx(13);
  1583. color: var(--color-zinc-500);
  1584. line-height: 1.6;
  1585. padding-left: px2rpx(26);
  1586. .clause {
  1587. color: var(--color-primary);
  1588. text-decoration: underline;
  1589. }
  1590. }
  1591. }
  1592. .step3-attention {
  1593. background: var(--color-error-50, #fff1f0);
  1594. border-radius: px2rpx(12);
  1595. padding: px2rpx(16);
  1596. margin-bottom: px2rpx(20);
  1597. .attention {
  1598. font-size: px2rpx(14);
  1599. color: var(--color-error-600, #cf1322);
  1600. line-height: 1.6;
  1601. }
  1602. .btn-bottom {
  1603. margin-top: px2rpx(20);
  1604. display: flex;
  1605. justify-content: center;
  1606. .btn {
  1607. background: var(--color-error-600, #cf1322);
  1608. color: #fff;
  1609. padding: px2rpx(10) px2rpx(48);
  1610. border-radius: px2rpx(24);
  1611. font-size: px2rpx(15);
  1612. font-weight: 700;
  1613. box-shadow: 0 px2rpx(4) px2rpx(10) rgba(207, 19, 34, 0.2);
  1614. transition: all 0.2s;
  1615. &:active {
  1616. transform: scale(0.96);
  1617. opacity: 0.8;
  1618. }
  1619. }
  1620. }
  1621. }
  1622. .upload-box {
  1623. display: flex;
  1624. align-items: center;
  1625. gap: px2rpx(12);
  1626. .btn-upload {
  1627. background: var(--color-zinc-100);
  1628. border: px2rpx(1) dashed var(--color-zinc-300);
  1629. border-radius: px2rpx(8);
  1630. height: px2rpx(44);
  1631. font-size: px2rpx(14);
  1632. color: var(--color-zinc-600);
  1633. display: flex;
  1634. align-items: center;
  1635. justify-content: center;
  1636. padding: 0 px2rpx(20);
  1637. }
  1638. .img-preview {
  1639. width: px2rpx(44);
  1640. height: px2rpx(44);
  1641. border-radius: px2rpx(4);
  1642. object-fit: cover;
  1643. }
  1644. }
  1645. .label-with-icon {
  1646. font-size: px2rpx(14);
  1647. color: #606266;
  1648. box-sizing: border-box;
  1649. display: flex;
  1650. align-items: center;
  1651. padding: 0 0 8px;
  1652. height: px2rpx(36);
  1653. line-height: 1.5715;
  1654. text-align: left;
  1655. /* #ifndef APP-NVUE */
  1656. white-space: initial;
  1657. /* #endif */
  1658. .help-icon {
  1659. margin-left: px2rpx(8);
  1660. width: px2rpx(16);
  1661. height: px2rpx(16);
  1662. background: var(--color-zinc-200);
  1663. border-radius: 50%;
  1664. display: flex;
  1665. align-items: center;
  1666. justify-content: center;
  1667. font-size: px2rpx(12);
  1668. color: var(--color-zinc-600);
  1669. cursor: pointer;
  1670. }
  1671. }
  1672. .tooltip-content {
  1673. :deep(.uni-tooltip-popup) {
  1674. background-color: #fff !important;
  1675. box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1) !important;
  1676. width: px2rpx(300) !important;
  1677. color: var(--color-zinc-500);
  1678. line-height: 1.6;
  1679. }
  1680. }
  1681. .error {
  1682. color: var(--color-error);
  1683. font-size: px2rpx(12);
  1684. margin-top: px2rpx(4);
  1685. display: block;
  1686. }
  1687. :deep(.base-info-form) {
  1688. .uni-row1 {
  1689. .uni-col {
  1690. padding: 0 px2rpx(10) !important;
  1691. }
  1692. .uni-forms-item {
  1693. min-height: px2rpx(79);
  1694. margin-bottom: px2rpx(10);
  1695. position: relative;
  1696. }
  1697. .uni-select,
  1698. .uni-combox,
  1699. .uni-easyinput__content,
  1700. .uni-date-editor--x {
  1701. border: none !important;
  1702. background-color: var(--color-zinc-100) !important;
  1703. border-radius: px2rpx(8) !important;
  1704. }
  1705. .uni-easyinput__content-input {
  1706. height: px2rpx(44) !important;
  1707. }
  1708. }
  1709. }
  1710. .popup-content {
  1711. background: #fff;
  1712. border-radius: px2rpx(20);
  1713. padding: px2rpx(24);
  1714. width: px2rpx(320);
  1715. text-align: center;
  1716. .popup-title {
  1717. font-size: px2rpx(18);
  1718. font-weight: 700;
  1719. margin-bottom: px2rpx(20);
  1720. color: var(--color-navy-900);
  1721. display: block;
  1722. }
  1723. .popup-text {
  1724. font-size: px2rpx(14);
  1725. line-height: 1.6;
  1726. color: var(--color-zinc-600);
  1727. margin-bottom: px2rpx(20);
  1728. display: block;
  1729. }
  1730. .popup-form {
  1731. background: var(--color-zinc-50);
  1732. border-radius: px2rpx(12);
  1733. padding: px2rpx(16);
  1734. margin-bottom: px2rpx(24);
  1735. text-align: left;
  1736. .popup-row {
  1737. display: flex;
  1738. justify-content: space-between;
  1739. margin-bottom: px2rpx(12);
  1740. font-size: px2rpx(14);
  1741. &:last-child {
  1742. margin-bottom: 0;
  1743. }
  1744. .label {
  1745. color: var(--color-zinc-500);
  1746. font-weight: 500;
  1747. }
  1748. text:not(.label) {
  1749. color: var(--color-navy-900);
  1750. font-weight: 500;
  1751. }
  1752. .small-input {
  1753. width: px2rpx(60);
  1754. background: #fff;
  1755. border: px2rpx(1) solid var(--color-zinc-200);
  1756. border-radius: px2rpx(4);
  1757. padding: 0 px2rpx(4);
  1758. height: px2rpx(24);
  1759. font-size: px2rpx(12);
  1760. }
  1761. }
  1762. }
  1763. .popup-buttons {
  1764. display: flex;
  1765. gap: px2rpx(12);
  1766. button {
  1767. flex: 1;
  1768. height: px2rpx(44);
  1769. border-radius: px2rpx(10);
  1770. font-size: px2rpx(15);
  1771. font-weight: 600;
  1772. display: flex;
  1773. align-items: center;
  1774. justify-content: center;
  1775. border: none;
  1776. &[type="primary"] {
  1777. background: var(--color-navy-900);
  1778. color: #fff;
  1779. }
  1780. &:not([type="primary"]) {
  1781. background: var(--color-zinc-100);
  1782. color: var(--color-zinc-600);
  1783. }
  1784. }
  1785. }
  1786. .result-icon {
  1787. display: flex;
  1788. justify-content: center;
  1789. margin-bottom: px2rpx(16);
  1790. .iconfont {
  1791. font-size: px2rpx(48);
  1792. &.iconchenggong {
  1793. color: #52c41a;
  1794. }
  1795. &.iconjingshi {
  1796. color: #faad14;
  1797. }
  1798. &.icondengdai {
  1799. color: var(--color-primary);
  1800. animation: rotate 2s linear infinite;
  1801. }
  1802. }
  1803. }
  1804. }
  1805. @keyframes rotate {
  1806. from {
  1807. transform: rotate(0deg);
  1808. }
  1809. to {
  1810. transform: rotate(360deg);
  1811. }
  1812. }
  1813. }
  1814. </style>