index.vue 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893
  1. <template>
  2. <div
  3. id="review_Email"
  4. v-loading="pictLoading"
  5. class="view"
  6. :element-loading-background="loadingBackground"
  7. >
  8. <div class="crm_search">
  9. <el-form ref="formRef" label-position="" :model="search" label-width="">
  10. <el-row>
  11. <el-col :span="24" :md="24" :lg="24">
  12. <el-form-item>
  13. <el-select
  14. v-model="search.tag"
  15. class="crm_search_down crm-border-radius-no"
  16. :placeholder="$t('Placeholder.Choose')"
  17. >
  18. <el-option :label="$t('Label.CidAccount')" :value="1"></el-option>
  19. <el-option :label="$t('Ucard.KycAuth.item2')" :value="2"></el-option>
  20. <el-option :label="$t('Ucard.KycAuth.item3')" :value="3"></el-option>
  21. <el-option :label="$t('Ucard.VirtualCard.s1')" :value="4"></el-option>
  22. </el-select>
  23. </el-form-item>
  24. <el-form-item style="margin-right: 10px">
  25. <el-input
  26. v-if="search.tag == 1"
  27. v-model.trim="search.cId"
  28. class="crm-border-left-no crm-border-radius-no"
  29. clearable
  30. :placeholder="$t('Placeholder.Input')"
  31. @keyup.enter="toSearch"
  32. ></el-input>
  33. <el-input
  34. v-if="search.tag == 2"
  35. v-model.trim="search.mobile"
  36. class="crm-border-left-no crm-border-radius-no"
  37. clearable
  38. :placeholder="$t('Placeholder.Input')"
  39. @keyup.enter="toSearch"
  40. ></el-input>
  41. <el-input
  42. v-if="search.tag == 3"
  43. v-model.trim="search.email"
  44. class="crm-border-left-no crm-border-radius-no"
  45. clearable
  46. :placeholder="$t('Placeholder.Input')"
  47. @keyup.enter="toSearch"
  48. ></el-input>
  49. <el-input
  50. v-if="search.tag == 4"
  51. v-model.trim="search.cardNumber"
  52. class="crm-border-left-no crm-border-radius-no"
  53. clearable
  54. :placeholder="$t('Placeholder.Input')"
  55. @keyup.enter="toSearch"
  56. ></el-input>
  57. </el-form-item>
  58. <el-form-item style="margin-right: 10px">
  59. <el-select
  60. v-model="search.status"
  61. class="crm-border-radius-no"
  62. clearable
  63. :placeholder="$t('Ucard.VirtualCard.s2')"
  64. @change="toSearch"
  65. >
  66. <el-option :label="$t('Ucard.VirtualCard.t9')" value="unactivate"></el-option>
  67. <el-option :label="$t('Ucard.VirtualCard.t11')" value="wait_process"></el-option>
  68. <el-option :label="$t('Ucard.VirtualCard.t5')" value="processing"></el-option>
  69. <el-option :label="$t('Ucard.VirtualCard.t6')" value="success"></el-option>
  70. <el-option :label="$t('Ucard.VirtualCard.t10')" value="fail"></el-option>
  71. </el-select>
  72. </el-form-item>
  73. <el-form-item style="margin-right: 10px">
  74. <el-select
  75. v-model="search.freezeStatus"
  76. class="crm-border-radius-no"
  77. clearable
  78. :placeholder="$t('Ucard.VirtualCard.item6')"
  79. @change="toSearch"
  80. >
  81. <el-option :label="$t('Ucard.VirtualCard.t7')" :value="1"></el-option>
  82. <el-option :label="$t('card.Btn.b22')" :value="2"></el-option>
  83. <el-option :label="$t('Ucard.VirtualCard.t8')" :value="3"></el-option>
  84. <el-option :label="$t('card.Btn.b20')" :value="4"></el-option>
  85. <el-option :label="$t('card.Btn.b21')" :value="5"></el-option>
  86. <el-option :label="$t('card.Btn.b19')" :value="6"></el-option>
  87. </el-select>
  88. </el-form-item>
  89. <el-form-item style="margin-right: 10px">
  90. <el-select
  91. v-model="search.blockedStatus"
  92. class="crm-border-radius-no"
  93. clearable
  94. :placeholder="$t('card.Btn.b24')"
  95. @change="toSearch"
  96. >
  97. <el-option :label="$t('Ucard.VirtualCard.t7')" :value="1"></el-option>
  98. <el-option :label="$t('card.Btn.b18')" :value="2"></el-option>
  99. </el-select>
  100. </el-form-item>
  101. <el-form-item>
  102. <el-select
  103. v-model="search.cancelStatus"
  104. class="crm-border-radius-no"
  105. clearable
  106. :placeholder="$t('card.Btn.b23')"
  107. @change="toSearch"
  108. >
  109. <el-option
  110. v-for="(value, key) in cancelStatus"
  111. :key="key"
  112. :label="$t(value)"
  113. :value="key"
  114. ></el-option>
  115. </el-select>
  116. </el-form-item>
  117. <el-form-item>
  118. <el-button class="crm-border-radius-no crm-border-left-no" @click="toSearch">
  119. <el-icon><Search /></el-icon>
  120. </el-button>
  121. </el-form-item>
  122. </el-col>
  123. </el-row>
  124. <el-form-item>
  125. <el-button
  126. v-if="display['R-VirtualCard-Export'] && display['R-VirtualCard-Export'].show"
  127. type="primary"
  128. style="margin-left: 8px"
  129. @click="setExport"
  130. >{{ $t('Btn.Export') }}</el-button
  131. >
  132. </el-form-item>
  133. </el-form>
  134. <div class="card-mock-demo" style="margin: 30px 0">
  135. <el-table :data="mock_tableData" stripe style="margin-top: 20px; width: 100%">
  136. <el-table-column prop="" align="left" :label="$t('Label.CidAccount')">
  137. <template #default="scope">
  138. <span
  139. v-if="scope.row.cId && display['R-VirtualCard-Btn1'].show"
  140. class="crm-text-underline"
  141. @click="accountOpen(scope.row.cId)"
  142. >{{ scope.row.cId || '--' }}</span
  143. >
  144. <span v-else>{{ scope.row.cId || '--' }}</span>
  145. </template>
  146. </el-table-column>
  147. <el-table-column prop="" align="left" :label="$t('Label.Name')">
  148. <template #default="scope">
  149. <span v-if="scope.row.firstName">{{ scope.row.firstName + ' ' }}</span>
  150. <span v-if="scope.row.middle">{{ scope.row.middle + ' ' }}</span>
  151. <span v-if="scope.row.lastName">{{ scope.row.lastName }}</span>
  152. <span v-if="!scope.row.firstName && !scope.row.lastName && !scope.row.middle"
  153. >--</span
  154. >
  155. </template>
  156. </el-table-column>
  157. <el-table-column prop="" align="left" :label="$t('Label.Email')">
  158. <template #default="scope">
  159. {{ scope.row.email || '--' }}
  160. </template>
  161. </el-table-column>
  162. <el-table-column prop="mobile" align="left" :label="$t('Ucard.KycAuth.item2')">
  163. <template #default="scope"> {{ scope.row.areaCode }} {{ scope.row.mobile }} </template>
  164. </el-table-column>
  165. <el-table-column prop="cardNumber" align="left" :label="$t('Ucard.VirtualCard.item2')">
  166. <template #default="scope">
  167. <span
  168. v-if="scope.row.cardNumber"
  169. class="crm-text-underline"
  170. @click="cardOpen(scope.row.cardNumber)"
  171. >{{ scope.row.cardNumber || '--' }}</span
  172. >
  173. <span v-else>{{ scope.row.cardNumber || '--' }}</span>
  174. </template>
  175. </el-table-column>
  176. <el-table-column prop="expireDate" align="left" :label="$t('Ucard.VirtualCard.item3')" />
  177. <el-table-column prop="cvv" align="left" :label="$t('Ucard.VirtualCard.item4')">
  178. <template #default="scope">
  179. <span v-if="scope.row.expireDate" class="cvv" @click="getQueryCvv(scope.row.id)"
  180. >*** <el-icon><View /></el-icon
  181. ></span>
  182. </template>
  183. </el-table-column>
  184. <el-table-column prop="type" align="left" :label="$t('Ucard.KycAuth.item1')" />
  185. <el-table-column prop="status" align="left" :label="$t('Ucard.VirtualCard.item5')">
  186. <template #default="scope">
  187. <span v-if="scope.row.status === 'unactivate'" class="state crm_state_yellow">{{
  188. $t('Ucard.VirtualCard.t9')
  189. }}</span>
  190. <span v-else-if="scope.row.status === 'success'" class="state crm_state_blue">{{
  191. $t('Ucard.VirtualCard.t6')
  192. }}</span>
  193. <span v-else-if="scope.row.status === 'fail'" class="state crm_state_gray">{{
  194. $t('Ucard.VirtualCard.t10')
  195. }}</span>
  196. <span
  197. v-else-if="scope.row.status === 'wait_process'"
  198. class="state crm_state_yellow"
  199. >{{ $t('Ucard.VirtualCard.t11') }}</span
  200. >
  201. <span v-else class="state crm_state_orange">{{ $t('Ucard.VirtualCard.t5') }}</span>
  202. </template>
  203. </el-table-column>
  204. <el-table-column prop="freezeStatus" align="left" :label="$t('Ucard.VirtualCard.item6')">
  205. <template #default="scope">
  206. <template v-if="scope.row.freezeType == 1">
  207. <span v-if="scope.row.freezeStatus == 'success'" class="state crm_state_blue">{{
  208. $t('Ucard.VirtualCard.t7')
  209. }}</span>
  210. <span v-else-if="scope.row.freezeStatus == 'fail'" class="state crm_state_gray">{{
  211. $t('card.Btn.b19')
  212. }}</span>
  213. <span v-else class="state crm_state_orange">{{ $t('card.Btn.b21') }}</span>
  214. </template>
  215. <template v-else>
  216. <span v-if="scope.row.freezeStatus == 'success'" class="state crm_state_red">{{
  217. $t('Ucard.VirtualCard.t8')
  218. }}</span>
  219. <span v-else-if="scope.row.freezeStatus == 'fail'" class="state crm_state_gray">{{
  220. $t('card.Btn.b20')
  221. }}</span>
  222. <span v-else class="state crm_state_orange">{{ $t('card.Btn.b22') }}</span>
  223. </template>
  224. </template>
  225. </el-table-column>
  226. <el-table-column prop="blocked" align="left" :label="$t('card.Btn.b24')">
  227. <template #default="scope">
  228. <span v-if="!scope.row.blocked" class="state crm_state_blue">{{
  229. $t('Ucard.VirtualCard.t7')
  230. }}</span>
  231. <span v-else class="state crm_state_red">{{ $t('card.Btn.b18') }}</span>
  232. </template>
  233. </el-table-column>
  234. <el-table-column prop="cancelStatus" align="left" :label="$t('card.Btn.b23')">
  235. <template #default="scope">
  236. <span v-if="scope.row.cancelStatus == null" class="state crm_state_blue">
  237. {{ $t('Ucard.VirtualCard.t7') }}
  238. </span>
  239. <span v-else :class="`state ${getStatusColor(scope.row.cancelStatus)}`">
  240. {{ $t(cancelStatus[scope.row.cancelStatus]) }}
  241. </span>
  242. </template>
  243. </el-table-column>
  244. <el-table-column prop="" align="center" :label="$t('Label.Action')">
  245. <template #default="scope">
  246. <el-dropdown trigger="click" @command="handleCommand">
  247. <span class="el-dropdown-link crm-cursor">
  248. <i style="font-weight: bold; font-size: 20px" class="iconfont iconcaidan"></i>
  249. </span>
  250. <template #dropdown>
  251. <el-dropdown-menu>
  252. <el-dropdown-item
  253. v-if="display['R-VirtualCard-Btn1'].show"
  254. :command="{ type: 0, row: scope.row }"
  255. >
  256. <el-icon><Operation /></el-icon>
  257. <span>{{ $t('R-VirtualCard-Btn1') }}</span>
  258. </el-dropdown-item>
  259. <template v-if="scope.row.cancelStatus != 'success'">
  260. <el-dropdown-item
  261. v-if="
  262. display['R-VirtualCard-Btn3'].show &&
  263. scope.row.type == 'Physical' &&
  264. (scope.row.status === 'unactivate' || scope.row.status === 'fail')
  265. "
  266. :command="{ type: 9, row: scope.row }"
  267. >
  268. <el-icon><Operation /></el-icon>
  269. <span>{{ $t('R-VirtualCard-Btn3') }}</span>
  270. </el-dropdown-item>
  271. <el-dropdown-item
  272. v-if="
  273. display['R-VirtualCard-Btn10'].show && scope.row.status == 'processing'
  274. "
  275. :command="{ type: 11, row: scope.row }"
  276. >
  277. <el-icon><Operation /></el-icon>
  278. <span>{{ $t('R-VirtualCard-Btn10') }}</span>
  279. </el-dropdown-item>
  280. <el-dropdown-item
  281. v-if="
  282. display['R-VirtualCard-Btn8'].show &&
  283. (scope.row.status == 'unactivate' || scope.row.status == 'fail')
  284. "
  285. :command="{ type: 1, row: scope.row }"
  286. >
  287. <el-icon><Operation /></el-icon>
  288. <span>{{ $t('R-VirtualCard-Btn8') }}</span>
  289. </el-dropdown-item>
  290. <el-dropdown-item
  291. v-if="display['R-VirtualCard-Btn9'].show"
  292. :command="{ type: 10, row: scope.row }"
  293. >
  294. <el-icon><Refresh /></el-icon>
  295. <span>{{ $t('R-VirtualCard-Btn9') }}</span>
  296. </el-dropdown-item>
  297. <el-dropdown-item
  298. v-if="display['R-VirtualCard-Btn2'].show"
  299. :command="{ type: 2, row: scope.row }"
  300. >
  301. <el-icon><Operation /></el-icon>
  302. <span>{{ $t('R-VirtualCard-Btn2') }}</span>
  303. </el-dropdown-item>
  304. <el-dropdown-item
  305. v-if="display['R-VirtualCard-Btn11'].show"
  306. :command="{ type: 13, row: scope.row }"
  307. >
  308. <el-icon><Operation /></el-icon>
  309. <span>{{ $t('R-VirtualCard-Btn11') }}</span>
  310. </el-dropdown-item>
  311. <el-dropdown-item
  312. v-if="display['R-VirtualCard-Btn4'].show"
  313. :command="{ type: 5, row: scope.row }"
  314. >
  315. <el-icon><Refresh /></el-icon>
  316. <span>{{ $t('R-VirtualCard-Btn4') }}</span>
  317. </el-dropdown-item>
  318. <el-dropdown-item
  319. v-if="display['R-VirtualCard-Btn5'].show"
  320. :command="{ type: 6, row: scope.row }"
  321. >
  322. <el-icon><Operation /></el-icon>
  323. <span>{{ $t('R-VirtualCard-Btn5') }}</span>
  324. </el-dropdown-item>
  325. <el-dropdown-item
  326. v-if="display['R-VirtualCard-Btn6'].show"
  327. :command="{ type: 7, row: scope.row }"
  328. >
  329. <el-icon><Operation /></el-icon>
  330. <span>{{ $t('R-VirtualCard-Btn6') }}</span>
  331. </el-dropdown-item>
  332. <el-dropdown-item
  333. v-if="display['R-VirtualCard-Btn7'].show"
  334. :command="{ type: 8, row: scope.row }"
  335. >
  336. <el-icon><CircleCheck /></el-icon>
  337. <span>{{ $t('R-VirtualCard-Btn7') }}</span>
  338. </el-dropdown-item>
  339. <el-dropdown-item
  340. v-if="
  341. display['R-VirtualCard-Btn12'].show &&
  342. ['success', 'processing'].includes(scope.row.cancelStatus)
  343. "
  344. :command="{ type: 14, row: scope.row }"
  345. >
  346. <el-icon><Delete /></el-icon>
  347. <span>
  348. {{ $t('R-VirtualCard-Btn12') }}
  349. </span>
  350. </el-dropdown-item>
  351. </template>
  352. </el-dropdown-menu>
  353. </template>
  354. </el-dropdown>
  355. </template>
  356. </el-table-column>
  357. </el-table>
  358. </div>
  359. </div>
  360. <div v-if="pagerInfo.rowTotal" class="crm_pagination">
  361. <div class="crm_page_total">
  362. <span>{{ $t('Page.total.item1') }}</span>
  363. <span>{{ pagerInfo.rowTotal }}</span>
  364. <span>{{ $t('Page.total.item2') }}</span>
  365. </div>
  366. <el-pagination
  367. class="page"
  368. background
  369. layout="sizes, prev, pager, next"
  370. :page-sizes="[10, 20, 50, 100]"
  371. :page-size="pagerInfo.row"
  372. :total="pagerInfo.rowTotal"
  373. @current-change="handleCurrentChange"
  374. @size-change="handleSizeChange"
  375. >
  376. </el-pagination>
  377. </div>
  378. <trading-info-add
  379. :dialog-info-trading-add="dialogInfoTradingAdd"
  380. :editor="editor"
  381. :add-type="addType"
  382. :my-info="myInfo"
  383. :form-list="formList"
  384. @confirm-to-reload="confirmToReload"
  385. @close-add="closeAdd"
  386. ></trading-info-add>
  387. <div v-if="dialogInfoTradingAdd" class="crm_verified_info_mask" @click="closeDiaAdd"></div>
  388. <detailed-info-cid
  389. :dialog-info-cid="dialogInfoCid"
  390. :form-info="formInfo"
  391. :is-trading="true"
  392. @close="close"
  393. >
  394. </detailed-info-cid>
  395. <div v-if="dialogInfoCid" class="crm_verified_info_mask" @click="closeDia"></div>
  396. <el-dialog
  397. v-model="dialogCheck"
  398. :title="$t('Ucard.VirtualCard.d5')"
  399. center
  400. class="dialog_header_w"
  401. >
  402. <div class="dia-content">
  403. <el-table :data="formList.data" style="width: 100%">
  404. <el-table-column prop="currency" :label="$t('Ucard.VirtualCard.item9')">
  405. </el-table-column>
  406. <el-table-column prop="amount" :label="$t('Ucard.VirtualCard.item10')"> </el-table-column>
  407. </el-table>
  408. </div>
  409. <template #footer>
  410. <div class="dialog-footer">
  411. <el-button @click="cancel">{{ $t('Btn.Cancel') }}</el-button>
  412. </div>
  413. </template>
  414. </el-dialog>
  415. <el-dialog v-model="dialogCheckCvv" title="CVV" center class="dialog_header_w">
  416. <div class="dia-content">
  417. <el-form
  418. :rules="rules"
  419. :model="cvvForm"
  420. label-width="130px"
  421. label-position="right"
  422. class="business-edit-form"
  423. >
  424. <el-form-item prop="gaCode" :label="$t('getCode.R-GoogleSecretKey')">
  425. <el-input v-model="cvvForm.gaCode" :placeholder="$t('Placeholder.Input')"></el-input>
  426. </el-form-item>
  427. <el-form-item v-if="cvvForm.cvv" prop="cvv" label="CVV">
  428. <el-input v-model="cvvForm.cvv" :placeholder="$t('Placeholder.Input')"></el-input>
  429. </el-form-item>
  430. </el-form>
  431. </div>
  432. <template #footer>
  433. <div class="dialog-footer">
  434. <el-button @click="cancel1">{{ $t('Btn.Cancel') }}</el-button>
  435. <el-button v-if="!cvvForm.cvv" type="primary" @click="queryCvv()">{{
  436. $t('Btn.Confirm')
  437. }}</el-button>
  438. <el-button v-if="cvvForm.cvv" type="primary" @click="copy()">{{
  439. $t('Label.Copy')
  440. }}</el-button>
  441. </div>
  442. </template>
  443. </el-dialog>
  444. <el-dialog
  445. v-model="dialogCheckExport"
  446. :title="$t('getCode.R-GoogleSecretKey')"
  447. center
  448. class="dialog_header_w"
  449. >
  450. <div class="dia-content">
  451. <el-form
  452. :rules="rules"
  453. :model="cvvForm"
  454. label-width="130px"
  455. label-position="right"
  456. class="business-edit-form"
  457. >
  458. <el-form-item prop="gaCode" :label="$t('getCode.R-GoogleSecretKey')">
  459. <el-input v-model="cvvForm.gaCode" :placeholder="$t('Placeholder.Input')"></el-input>
  460. </el-form-item>
  461. </el-form>
  462. </div>
  463. <template #footer>
  464. <div class="dialog-footer">
  465. <el-button @click="cancel1">{{ $t('Btn.Cancel') }}</el-button>
  466. <el-button type="primary" @click="exportAgents()">{{ $t('Btn.Confirm') }}</el-button>
  467. </div>
  468. </template>
  469. </el-dialog>
  470. <ViewCardSingle
  471. :dialog-info-trading-single="dialogInfoTradingSingle"
  472. :form-list="formSingle"
  473. :editor-type="editorType"
  474. @close-single="closeSingle"
  475. >
  476. </ViewCardSingle>
  477. <div v-if="dialogInfoTradingSingle" class="crm_verified_info_mask" @click="closeSingle"></div>
  478. </div>
  479. </template>
  480. <script setup>
  481. import { ref, reactive, computed, onMounted, watch, inject } from 'vue'
  482. import { useRouter } from 'vue-router'
  483. import Service from '@/service/ucard'
  484. import TradingInfoAdd from '@/views/components/VirtualCard'
  485. import Config from '@/config/index'
  486. import Service1 from '@/service/customer'
  487. import DetailedInfoCid from '@/views/components/DetailedInfoCid'
  488. import ViewCardSingle from '@/views/components/ViewCardSingle'
  489. import { exportExcel } from '@/utils/export'
  490. import { CircleCheck, Delete, Operation, Refresh, Search } from '@element-plus/icons-vue'
  491. import { useI18n } from 'vue-i18n'
  492. import { copyText } from '@/utils/untils'
  493. import { cancelStatus } from '@/views/card/VirtualCard/const'
  494. import { getStatusColor } from '@/utils/getStatusColor'
  495. const { t } = useI18n()
  496. const router = useRouter()
  497. const Session = inject('session')
  498. const pigeon = inject('pigeon')
  499. const { Code } = Config
  500. // 响应式数据
  501. const pictLoading = ref(false)
  502. const dialogInfoTradingAdd = ref(false)
  503. const dialogInfoTradingSingle = ref(false)
  504. const formSingle = ref({})
  505. const editorType = ref(5)
  506. const dialogCheck = ref(false)
  507. const dialogCheckCvv = ref(false)
  508. const dialogCheckExport = ref(false)
  509. const formRef = ref(null)
  510. const search = reactive({
  511. tag: 1,
  512. cardNumber: '',
  513. email: '',
  514. mobile: '',
  515. cId: '',
  516. status: '',
  517. freezeStatus: '',
  518. blockedStatus: '',
  519. cancelStatus: '',
  520. })
  521. const editor = ref('')
  522. const addType = ref('')
  523. const myInfo = ref({})
  524. const formList = ref({})
  525. const mock_tableData = ref([])
  526. const pagerInfo = reactive({ row: 10, current: 1, pageTotal: 0, rowTotal: 0 })
  527. const dialogInfoCid = ref(false)
  528. const formInfo = ref({})
  529. const cvvForm = reactive({
  530. gaCode: undefined,
  531. cvv: undefined,
  532. id: undefined,
  533. })
  534. const rules = reactive({
  535. gaCode: [
  536. {
  537. required: true,
  538. message: t('vaildate.input.empty'),
  539. trigger: 'blur',
  540. },
  541. ],
  542. })
  543. const loadingBackground = 'rgba(43, 48, 67, 0.65)'
  544. // 计算属性
  545. const display = computed(() => {
  546. return JSON.parse(Session.Get('display', true))
  547. })
  548. const user = computed(() => {
  549. return JSON.parse(Session.Get('user', true))
  550. })
  551. // 方法
  552. const setExport = () => {
  553. cvvForm.gaCode = undefined
  554. dialogCheckExport.value = true
  555. }
  556. const exportAgents = async () => {
  557. exportExcel(pigeon, '/wasabi/card/list/export', { ...search }, 'Bank_Cards_List')
  558. }
  559. const accountOpen = (cId) => {
  560. router.push({ name: 'R-CustomerDetail', params: { cId: cId } })
  561. }
  562. const cardOpen = (cardNumber) => {
  563. router.push({
  564. name: 'R-CardDetail',
  565. params: { cardNumber: cardNumber },
  566. })
  567. }
  568. const searchSingleCid = async (cId) => {
  569. let res = await Service1.cidRealSingle({
  570. id: cId,
  571. })
  572. if (res.code == Code.StatusOK) {
  573. if (editor.value) {
  574. formList.value = res.data
  575. // dialogInfoAdd.value = true
  576. } else {
  577. formInfo.value = res.data
  578. searchRealAll(cId)
  579. }
  580. } else {
  581. pigeon.MessageError(res.msg)
  582. }
  583. }
  584. const tableRowClassName = ({ row }) => {
  585. if (row.cardStatus === 'cancel' || row.blocked) {
  586. return 'row-cancel'
  587. }
  588. return ''
  589. }
  590. const searchRealAll = async (cId) => {
  591. let res = await Service1.realCustomerListAll({
  592. cId: cId,
  593. page: {
  594. current: 1,
  595. row: 1,
  596. },
  597. })
  598. if (res.code == Code.StatusOK) {
  599. formInfo.value.realList = res.data
  600. dialogInfoCid.value = true
  601. } else {
  602. pigeon.MessageError(res.msg)
  603. }
  604. }
  605. const closeDia = () => {
  606. dialogInfoCid.value = false
  607. }
  608. const close = (val) => {
  609. dialogInfoCid.value = val
  610. }
  611. const cancel = () => {
  612. dialogCheck.value = false
  613. }
  614. const cancel1 = () => {
  615. dialogCheckCvv.value = false
  616. dialogCheckExport.value = false
  617. }
  618. const closeSingle = () => {
  619. dialogInfoTradingSingle.value = false
  620. }
  621. const cancelCard = async (row) => {
  622. console.log(row)
  623. const res = await Service.cancelCard({ cardNo: row.cardNo, cId: user.value.cId })
  624. if (res.code == Code.StatusOK) {
  625. pigeon.MessageOK(t('Msg.Success19'))
  626. searchFunc()
  627. } else {
  628. pigeon.MessageError(res.msg)
  629. }
  630. }
  631. const handleCommand = (command) => {
  632. if (
  633. command.row.status == 'unactivate' &&
  634. command.type != 1 &&
  635. command.type != 9 &&
  636. command.type != 0
  637. ) {
  638. pigeon.MessageOK(t('card.Info.t25'))
  639. return
  640. }
  641. if (command.type != 0 && command.row.cancelStatus == 'success') {
  642. pigeon.MessageOK(t('card.New2.p5'))
  643. return
  644. }
  645. if (command.type != 0 && command.row.blocked) {
  646. pigeon.MessageOK(t('card.New2.p6'))
  647. return
  648. }
  649. switch (command.type) {
  650. case 0:
  651. dialogInfoTradingSingle.value = true
  652. formSingle.value = command.row
  653. break
  654. case 1:
  655. if (command.row.status != 1) {
  656. addType.value = 1
  657. dialogInfoTradingAdd.value = true
  658. formList.value = command.row
  659. }
  660. break
  661. case 2:
  662. addType.value = 2
  663. dialogInfoTradingAdd.value = true
  664. formList.value = command.row
  665. break
  666. case 3:
  667. addType.value = 3
  668. dialogInfoTradingAdd.value = true
  669. formList.value = command.row
  670. break
  671. case 5:
  672. ucardBalance(command.row)
  673. break
  674. case 6:
  675. addType.value = 6
  676. dialogInfoTradingAdd.value = true
  677. formList.value = command.row
  678. break
  679. case 7:
  680. addType.value = 7
  681. dialogInfoTradingAdd.value = true
  682. formList.value = { ...command.row, clientRemark: '' }
  683. break
  684. case 8:
  685. addType.value = 8
  686. dialogInfoTradingAdd.value = true
  687. formList.value = { ...command.row, clientRemark: '' }
  688. break
  689. case 9:
  690. addType.value = 9
  691. dialogInfoTradingAdd.value = true
  692. formList.value = command.row
  693. break
  694. case 10:
  695. getCardInfo(command.row)
  696. break
  697. case 11:
  698. rechargeUpdate(command.row)
  699. break
  700. case 13:
  701. addType.value = 13
  702. dialogInfoTradingAdd.value = true
  703. formList.value = command.row
  704. break
  705. case 14:
  706. cancelCard(command.row)
  707. break
  708. }
  709. }
  710. const closeAdd = () => {
  711. formList.value = {}
  712. dialogInfoTradingAdd.value = false
  713. }
  714. const closeDiaAdd = () => {
  715. formList.value = {}
  716. dialogInfoTradingAdd.value = false
  717. }
  718. const confirmToReload = () => {
  719. closeDiaAdd()
  720. searchFunc()
  721. }
  722. const toSearch = () => {
  723. pagerInfo.current = 1
  724. searchFunc()
  725. }
  726. const ucardBalance = async ({ uniqueId, cardNo }) => {
  727. let res = await Service.ucardBalance({ uniqueId, cardNo })
  728. if (res.code == Code.StatusOK) {
  729. pigeon.MessageOK(t('Msg.SearchSuccess'))
  730. formList.value.data = [res.data]
  731. addType.value = 5
  732. dialogCheck.value = true
  733. } else {
  734. pigeon.MessageError(res.msg)
  735. }
  736. }
  737. const getCardInfo = async ({ id }) => {
  738. let res = await Service.getCardInfo({ id })
  739. if (res.code == Code.StatusOK) {
  740. toSearch()
  741. } else {
  742. pigeon.MessageError(res.msg)
  743. }
  744. }
  745. const getQueryCvv = (id) => {
  746. dialogCheckCvv.value = true
  747. Object.assign(cvvForm, {
  748. gaCode: undefined,
  749. cvv: undefined,
  750. id,
  751. })
  752. }
  753. const queryCvv = async () => {
  754. let res = await Service.queryCvv({ ...cvvForm })
  755. if (res.code == Code.StatusOK) {
  756. cvvForm.cvv = res.data
  757. } else {
  758. pigeon.MessageError(res.msg)
  759. }
  760. }
  761. const copy = () => {
  762. try {
  763. copyText(cvvForm.cvv)
  764. pigeon.MessageOK(t('Msg.Success15'))
  765. } catch (err) {
  766. pigeon.MessageError(t('Msg.Success16'))
  767. }
  768. }
  769. const rechargeUpdate = async ({ id }) => {
  770. let res = await Service.rechargeUpdate({ id })
  771. if (res.code == Code.StatusOK) {
  772. toSearch()
  773. } else {
  774. pigeon.MessageError(res.msg)
  775. }
  776. }
  777. const searchFunc = async () => {
  778. pictLoading.value = true
  779. if (!display.value['R-VirtualCard-Search'].show) {
  780. pigeon.MessageWarning(t('Msg.NotDisplay'))
  781. pictLoading.value = false
  782. return
  783. }
  784. let res = await Service.cardList({
  785. ...search,
  786. page: {
  787. current: pagerInfo.current,
  788. row: pagerInfo.row,
  789. },
  790. })
  791. if (res.code == Code.StatusOK) {
  792. mock_tableData.value = res.data
  793. if (res.page != null) {
  794. pagerInfo.rowTotal = res.page.rowTotal
  795. pagerInfo.pageTotal = res.page.pageTotal
  796. } else {
  797. pagerInfo.rowTotal = 0
  798. }
  799. pigeon.MessageOK(t('Msg.SearchSuccess'))
  800. } else {
  801. pigeon.MessageError(res.msg)
  802. }
  803. pictLoading.value = false
  804. }
  805. const handleSizeChange = (val) => {
  806. pagerInfo.row = val
  807. searchFunc()
  808. }
  809. const handleCurrentChange = (val) => {
  810. pagerInfo.current = val
  811. searchFunc()
  812. }
  813. // 监听器
  814. watch(
  815. () => search.tag,
  816. () => {
  817. search.cardNumber = ''
  818. search.status = ''
  819. search.mobile = ''
  820. search.email = ''
  821. search.cId = ''
  822. }
  823. )
  824. // 生命周期
  825. onMounted(() => {
  826. searchFunc()
  827. })
  828. </script>
  829. <style scoped lang="scss">
  830. @import 'index.scss';
  831. </style>
  832. <style lang="scss">
  833. #review_Email {
  834. .dialog_header_w {
  835. .crm_search_down {
  836. width: 400px;
  837. }
  838. }
  839. .row-cancel {
  840. /* background-color: #e20101 !important; */
  841. color: #e20101 !important;
  842. .el-dropdown {
  843. color: #e20101;
  844. }
  845. }
  846. .cvv {
  847. cursor: pointer;
  848. }
  849. /* .row-cancel:hover > td {
  850. background-color: #e20101 !important;
  851. } */
  852. }
  853. </style>