deposit.vue 81 KB

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