index.vue 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911
  1. <template>
  2. <div
  3. id="review_Email"
  4. v-loading="pictLoading"
  5. class="view"
  6. element-loading-background="rgba(43, 48, 67, 0.65)"
  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-select>
  22. </el-form-item>
  23. <el-form-item style="margin-right: 10px">
  24. <el-input
  25. v-if="search.tag == 1"
  26. v-model.trim="search.cId"
  27. class="crm-border-left-no crm-border-radius-no"
  28. clearable
  29. :placeholder="$t('Placeholder.Input')"
  30. @keyup.enter="toSearch"
  31. ></el-input>
  32. <el-input
  33. v-if="search.tag == 2"
  34. v-model.trim="search.mobile"
  35. class="crm-border-left-no crm-border-radius-no"
  36. clearable
  37. :placeholder="$t('Placeholder.Input')"
  38. @keyup.enter="toSearch"
  39. ></el-input>
  40. <el-input
  41. v-if="search.tag == 3"
  42. v-model.trim="search.email"
  43. class="crm-border-left-no crm-border-radius-no"
  44. clearable
  45. :placeholder="$t('Placeholder.Input')"
  46. @keyup.enter="toSearch"
  47. ></el-input>
  48. <el-select
  49. v-if="search.tag == 4"
  50. v-model="search.type"
  51. class="crm-border-left-no crm-border-radius-no"
  52. clearable
  53. :placeholder="$t('Placeholder.Choose')"
  54. @change="toSearch"
  55. >
  56. <el-option :label="$t('Ucard.KycAuth.t1')" :value="0"></el-option>
  57. <el-option :label="$t('Ucard.KycAuth.t2')" :value="1"></el-option>
  58. <el-option :label="$t('Ucard.KycAuth.t3')" :value="2"></el-option>
  59. <el-option :label="$t('Ucard.KycAuth.t4')" :value="3"></el-option>
  60. </el-select>
  61. </el-form-item>
  62. <el-form-item style="margin-right: 10px">
  63. <el-select
  64. v-model="search.kycStatus"
  65. class="crm-border-radius-no"
  66. clearable
  67. :placeholder="$t('card.Info.s42')"
  68. @change="toSearch"
  69. >
  70. <el-option :label="$t('card.Info.t10')" :value="1"></el-option>
  71. <el-option :label="$t('Ucard.KycAuth.t7')" :value="2"></el-option>
  72. </el-select>
  73. </el-form-item>
  74. <el-form-item style="margin-right: 10px">
  75. <el-select
  76. v-model="search.photoStatus"
  77. class="crm-border-radius-no"
  78. clearable
  79. :placeholder="$t('card.New1.f4')"
  80. @change="toSearch"
  81. >
  82. <el-option :label="$t('Yes')" :value="1"></el-option>
  83. <el-option :label="$t('No')" :value="2"></el-option>
  84. </el-select>
  85. </el-form-item>
  86. <el-form-item>
  87. <el-select
  88. v-model="search.status"
  89. class="crm-border-radius-no"
  90. clearable
  91. :placeholder="$t('Ucard.KycAuth.s2')"
  92. @change="toSearch"
  93. >
  94. <el-option :label="$t('Ucard.KycAuth.t6')" :value="1"></el-option>
  95. <el-option :label="$t('Ucard.KycAuth.t7')" :value="2"></el-option>
  96. <el-option :label="$t('Ucard.KycAuth.t8')" :value="3"></el-option>
  97. </el-select>
  98. </el-form-item>
  99. <el-form-item>
  100. <el-button class="crm-border-radius-no crm-border-left-no" @click="toSearch">
  101. <el-icon><Search /></el-icon>
  102. </el-button>
  103. </el-form-item>
  104. </el-col>
  105. </el-row>
  106. <el-form-item>
  107. <el-button
  108. v-if="display['R-KycAuth-Export'] && display['R-KycAuth-Export']?.show"
  109. type="primary"
  110. style="margin-left: 8px"
  111. @click="exportAgents"
  112. >
  113. <span>{{ $t('Btn.Export') }}</span>
  114. </el-button>
  115. </el-form-item>
  116. </el-form>
  117. <div class="card-mock-demo" style="margin: 30px 0">
  118. <el-table :data="mock_tableData" stripe style="margin-top: 20px; width: 100%">
  119. <el-table-column prop="" align="left" :label="$t('Label.CidAccount')">
  120. <template #default="scope">
  121. <span
  122. v-if="scope.row.cId && display['R-KycAuth-Single']?.show"
  123. class="crm-text-underline"
  124. @click="accountOpen(scope.row.cId)"
  125. >{{ scope.row.cId || '--' }}</span
  126. >
  127. <span v-else>{{ scope.row.cId || '--' }}</span>
  128. </template>
  129. </el-table-column>
  130. <el-table-column prop="" align="left" :label="$t('Label.Name')">
  131. <template #default="scope">
  132. <span v-if="scope.row.firstName">{{ scope.row.firstName + ' ' }}</span>
  133. <span v-if="scope.row.lastName">{{ scope.row.lastName }}</span>
  134. <span v-if="!scope.row.firstName && !scope.row.lastName">{{ '--' }}</span>
  135. </template>
  136. </el-table-column>
  137. <el-table-column prop="mobile" align="left" :label="$t('Ucard.KycAuth.item2')">
  138. <template #default="scope"> {{ scope.row.areaCode }} {{ scope.row.mobile }} </template>
  139. </el-table-column>
  140. <el-table-column prop="email" align="left" :label="$t('Ucard.KycAuth.item3')" />
  141. <el-table-column prop="kycStatus" align="left" :label="$t('card.Info.s42')">
  142. <template #default="scope">
  143. <span v-if="scope.row.kycStatus === 2" class="state crm_state_blue">{{
  144. $t('Ucard.KycAuth.t7')
  145. }}</span>
  146. <span v-else-if="scope.row.kycStatus === 3" class="state crm_state_gray">{{
  147. $t('Ucard.KycAuth.t8')
  148. }}</span>
  149. <span v-else class="state crm_state_yellow">{{ $t('card.Info.t10') }}</span>
  150. </template>
  151. </el-table-column>
  152. <el-table-column prop="balance" :label="$t('card.New1.f4')">
  153. <template #default="scope">
  154. <span v-if="scope.row.photoStatus == '1'" class="state crm_state_blue">{{
  155. $t('State.Yes')
  156. }}</span>
  157. <span v-if="scope.row.photoStatus != '1'" class="state crm_state_red">{{
  158. $t('State.No')
  159. }}</span>
  160. </template>
  161. </el-table-column>
  162. <el-table-column prop="status" align="left" :label="$t('Ucard.KycAuth.item6')">
  163. <template #default="scope">
  164. <span v-if="scope.row.status === -1" class="state crm_state_yellow">{{
  165. $t('Ucard.KycAuth.t5')
  166. }}</span>
  167. <span v-if="scope.row.status === 1" class="state crm_state_orange">{{
  168. $t('Ucard.KycAuth.t6')
  169. }}</span>
  170. <span v-if="scope.row.status === 2" class="state crm_state_blue">{{
  171. $t('Ucard.KycAuth.t7')
  172. }}</span>
  173. <span v-if="scope.row.status === 3" class="state crm_state_gray">{{
  174. $t('Ucard.KycAuth.t8')
  175. }}</span>
  176. </template>
  177. </el-table-column>
  178. <el-table-column prop="" align="center" :label="$t('Label.Action')">
  179. <template #default="scope">
  180. <el-dropdown trigger="click" @command="handleCommand">
  181. <span class="el-dropdown-link crm-cursor">
  182. <i style="font-weight: bold; font-size: 20px" class="iconfont iconcaidan"></i>
  183. </span>
  184. <template #dropdown>
  185. <el-dropdown-menu>
  186. <el-dropdown-item
  187. v-if="display['R-KycAuth-Single']?.show"
  188. :command="{ type: 4, row: scope.row }"
  189. >
  190. <el-icon><Operation /></el-icon>
  191. <span>{{ $t('R-Hire-Check') }}</span>
  192. </el-dropdown-item>
  193. <el-dropdown-item
  194. v-if="display['R-KycAuth-Btn1']?.show && scope.row.status == '1'"
  195. :command="{ type: 5, row: scope.row }"
  196. >
  197. <el-icon><Operation /></el-icon>
  198. <span>{{ $t('R-KycAuth-Btn1') }}</span>
  199. </el-dropdown-item>
  200. <el-dropdown-item
  201. v-if="display['R-KycAuth-Btn2']?.show && scope.row.status == '2'"
  202. :command="{ type: 12, row: scope.row }"
  203. >
  204. <el-icon><Operation /></el-icon>
  205. <span>{{ $t('R-KycAuth-Btn2') }}</span>
  206. </el-dropdown-item>
  207. </el-dropdown-menu>
  208. </template>
  209. </el-dropdown>
  210. </template>
  211. </el-table-column>
  212. </el-table>
  213. </div>
  214. </div>
  215. <div v-if="pagerInfo.rowTotal" class="crm_pagination">
  216. <div class="crm_page_total">
  217. <span>{{ $t('Page.total.item1') }}</span>
  218. <span>{{ pagerInfo.rowTotal }}</span>
  219. <span>{{ $t('Page.total.item2') }}</span>
  220. </div>
  221. <el-pagination
  222. class="page"
  223. background
  224. layout="sizes, prev, pager, next"
  225. :page-sizes="[10, 20, 50, 100]"
  226. :page-size="pagerInfo.row"
  227. :total="pagerInfo.rowTotal"
  228. @current-change="handleCurrentChange"
  229. @size-change="handleSizeChange"
  230. >
  231. </el-pagination>
  232. </div>
  233. <detailed-info-cid
  234. :dialog-info-cid="dialogInfoCid"
  235. :form-info="formInfo"
  236. :is-trading="true"
  237. @close="close"
  238. >
  239. </detailed-info-cid>
  240. <div v-if="dialogInfoCid" class="crm_verified_info_mask" @click="closeDia"></div>
  241. <ViewCardSingle
  242. :dialog-info-trading-single="dialogInfoTradingSingle"
  243. :form-list="formSingle"
  244. :editor-type="editorType"
  245. @close-single="closeSingle"
  246. >
  247. </ViewCardSingle>
  248. <div v-if="dialogInfoTradingSingle" class="crm_verified_info_mask" @click="closeSingle"></div>
  249. <trading-info-add
  250. :dialog-info-trading-add="dialogInfoTradingAdd"
  251. :editor="editor"
  252. :add-type="addType"
  253. :my-info="myInfo"
  254. :form-list="formList"
  255. @confirm-to-reload="confirmToReload"
  256. @close-add="closeAdd"
  257. ></trading-info-add>
  258. <div v-if="dialogInfoTradingAdd" class="crm_verified_info_mask" @click="closeDiaAdd"></div>
  259. <el-dialog
  260. v-model="approveDialogVisible"
  261. :title="addType == 5 ? $t('R-Review-Dialog-Title') : $t('R-VerifiedUser-Single')"
  262. width="800px"
  263. :close-on-click-modal="false"
  264. >
  265. <el-form
  266. ref="approveFormRef"
  267. :disable="addType == 4"
  268. :model="approveForm"
  269. :rules="approveRules"
  270. label-width="120px"
  271. >
  272. <!-- 展示字段 -->
  273. <h3 class="info-title">{{ $t('card.New2.p7') }}</h3>
  274. <el-form-item label="cId" prop="cId">
  275. <el-input v-model="approveForm.cId" disabled :placeholder="$t('R-Review-CId')">
  276. </el-input>
  277. </el-form-item>
  278. <el-form-item :label="$t('R-Review-Name')" prop="name">
  279. <el-input v-model="approveForm.infoName" disabled :placeholder="$t('R-Review-Name')">
  280. </el-input>
  281. </el-form-item>
  282. <el-form-item :label="$t('R-Review-Email')" prop="email">
  283. <el-input v-model="approveForm.email" disabled :placeholder="$t('R-Review-Email')">
  284. </el-input>
  285. </el-form-item>
  286. <el-form-item :label="$t('R-Review-Phone')" prop="mobile">
  287. <el-input v-model="approveForm.phone" disabled :placeholder="$t('R-Review-Phone')">
  288. </el-input>
  289. </el-form-item>
  290. <el-form-item :label="$t('Apply_info.BasicInfo.IdentityNumber')" prop="identityNumber">
  291. <el-input
  292. v-model="approveForm.identity"
  293. disabled
  294. :placeholder="$t('Apply_info.BasicInfo.IdentityNumber')"
  295. >
  296. </el-input>
  297. </el-form-item>
  298. <el-form-item :label="$t('Label.IdPhoto')" prop="image">
  299. <div class="image-preview">
  300. <div v-if="approveForm.images1 && approveForm.images1.length > 0" class="image-gallery">
  301. <div class="image-grid">
  302. <div v-for="(image, index) in approveForm.images1" :key="index" class="image-item">
  303. <el-image
  304. :src="imgUrl + image.path"
  305. :preview-src-list="approveForm.images1.map((img) => imgUrl + img.path)"
  306. :initial-index="index"
  307. style="width: 100%; height: 100%; object-fit: contain"
  308. fit="contain"
  309. preview-teleported
  310. >
  311. <template #error>
  312. <div class="image-slot">
  313. <el-icon><Picture /></el-icon>
  314. </div>
  315. </template>
  316. </el-image>
  317. </div>
  318. </div>
  319. </div>
  320. <span v-else>{{ $t('Label.IdPhoto') }}</span>
  321. </div>
  322. </el-form-item>
  323. <h3 class="info-title">{{ $t('card.New2.p8') }}</h3>
  324. <el-form-item :label="$t('R-Review-Name')" prop="name">
  325. <el-input v-model="approveForm.cardName" disabled :placeholder="$t('R-Review-Name')">
  326. </el-input>
  327. </el-form-item>
  328. <el-form-item :label="$t('R-Review-Phone')" prop="mobile">
  329. <el-input v-model="approveForm.mobile" disabled :placeholder="$t('R-Review-Phone')">
  330. </el-input>
  331. </el-form-item>
  332. <el-form-item prop="idType" :label="$t('card.Form.f16')">
  333. <el-select v-model="approveForm.idType" disabled :placeholder="$t('card.vaildate.v14')">
  334. <el-option
  335. v-for="(item, index) in idTypeList"
  336. :key="index"
  337. :label="$t(item.name)"
  338. :value="item.value"
  339. />
  340. </el-select>
  341. </el-form-item>
  342. <el-form-item :label="$t('Apply_info.BasicInfo.IdentityNumber')" prop="identityNumber">
  343. <el-input
  344. v-model="approveForm.idNumber"
  345. disabled
  346. :placeholder="$t('Apply_info.BasicInfo.IdentityNumber')"
  347. >
  348. </el-input>
  349. </el-form-item>
  350. <el-form-item :label="$t('card.Form.f19')" prop="identityNumber">
  351. <el-input
  352. v-model="approveForm.issueDate"
  353. disabled
  354. :placeholder="$t('Apply_info.BasicInfo.IdentityNumber')"
  355. >
  356. </el-input>
  357. </el-form-item>
  358. <el-form-item :label="$t('card.Form.f20')" prop="identityNumber">
  359. <el-input
  360. v-model="approveForm.idNoExpiryDate"
  361. disabled
  362. :placeholder="$t('Apply_info.BasicInfo.IdentityNumber')"
  363. >
  364. </el-input>
  365. </el-form-item>
  366. <el-form-item :label="$t('Label.IdPhoto')" prop="image">
  367. <div class="image-preview">
  368. <div
  369. v-if="approveForm.cardFiles && approveForm.cardFiles.length > 0"
  370. class="image-gallery"
  371. >
  372. <div class="image-grid">
  373. <div
  374. v-for="(image, index) in approveForm.cardFiles"
  375. :key="index"
  376. class="image-item"
  377. >
  378. <el-image
  379. :src="imgUrl + image.path"
  380. :preview-src-list="approveForm.cardFiles.map((img) => imgUrl + img.path)"
  381. :initial-index="index"
  382. style="width: 100%; height: 100%; object-fit: contain"
  383. fit="contain"
  384. preview-teleported
  385. >
  386. <template #error>
  387. <div class="image-slot">
  388. <el-icon><Picture /></el-icon>
  389. </div>
  390. </template>
  391. </el-image>
  392. </div>
  393. </div>
  394. </div>
  395. <span v-else>{{ $t('Label.IdPhoto') }}</span>
  396. </div>
  397. </el-form-item>
  398. <h3 class="info-title">{{ $t('card.New2.p9') }}</h3>
  399. <el-form-item :label="$t('Apply_info.BasicInfo.KycIdNumber')" prop="kycIdNumber">
  400. <el-input
  401. v-model="approveForm.kycIdNumber"
  402. disabled
  403. :placeholder="$t('Apply_info.BasicInfo.KycIdNumber')"
  404. >
  405. </el-input>
  406. </el-form-item>
  407. <el-form-item :label="$t('Apply_info.BasicInfo.KycNumber')" prop="kycNumber">
  408. <el-input
  409. v-model="approveForm.kycNumber"
  410. disabled
  411. :placeholder="$t('Apply_info.BasicInfo.KycNumber')"
  412. >
  413. </el-input>
  414. </el-form-item>
  415. <el-form-item :label="$t('Apply_info.BasicInfo.KycName')" prop="kycName">
  416. <el-input
  417. v-model="approveForm.kycName"
  418. disabled
  419. :placeholder="$t('Apply_info.BasicInfo.KycName')"
  420. >
  421. </el-input>
  422. </el-form-item>
  423. <el-form-item :label="$t('Label.IdPhoto')" prop="image">
  424. <div class="image-preview">
  425. <div v-if="approveForm.images && approveForm.images.length > 0" class="image-gallery">
  426. <div class="image-grid">
  427. <div v-for="(image, index) in approveForm.images" :key="index" class="image-item">
  428. <el-image
  429. :src="imgUrl + image.path"
  430. :preview-src-list="approveForm.images.map((img) => imgUrl + img.path)"
  431. :initial-index="index"
  432. style="width: 100%; height: 100%; object-fit: contain"
  433. fit="contain"
  434. preview-teleported
  435. >
  436. <template #error>
  437. <div class="image-slot">
  438. <el-icon><Picture /></el-icon>
  439. </div>
  440. </template>
  441. </el-image>
  442. </div>
  443. </div>
  444. </div>
  445. <span v-else>{{ $t('Label.IdPhoto') }}</span>
  446. </div>
  447. </el-form-item>
  448. <template v-if="addType == 5">
  449. <el-form-item :label="$t('R-Review-Status')" prop="status">
  450. <el-select v-model="approveForm.status" :placeholder="$t('R-Review-Status-Select')">
  451. <el-option :value="2" :label="$t('R-Review-Status-Approve')"></el-option>
  452. <el-option :value="3" :label="$t('R-Review-Status-Reject')"></el-option>
  453. </el-select>
  454. </el-form-item>
  455. <el-form-item
  456. v-if="approveForm.status == 3"
  457. prop="approveDesc"
  458. :label="$t('Label.Descr') + ':'"
  459. >
  460. <el-select
  461. v-model="approveForm.approveDesc"
  462. filterable
  463. class="crm_search_down"
  464. :placeholder="$t('Placeholder.Choose')"
  465. allow-create
  466. >
  467. <el-option
  468. v-for="item in reasons"
  469. :key="item.id"
  470. :label="Session.get('lang') == 'cn' ? item.content : item.enContent"
  471. :value="item.id"
  472. ></el-option>
  473. </el-select>
  474. </el-form-item>
  475. </template>
  476. </el-form>
  477. <template #footer>
  478. <div v-if="addType == 5" class="dialog-footer">
  479. <el-button @click="approveDialogVisible = false">{{ $t('Btn.Cancel') }}</el-button>
  480. <el-button type="primary" :loading="approveLoading" @click="kycSubmit">{{
  481. $t('Btn.Confirm')
  482. }}</el-button>
  483. </div>
  484. <div v-if="addType == 4" class="dialog-footer">
  485. <el-button @click="approveDialogVisible = false">{{ $t('Btn.Close') }}</el-button>
  486. </div>
  487. </template>
  488. </el-dialog>
  489. </div>
  490. </template>
  491. <script setup>
  492. import { ref, reactive, computed, onMounted, watch, inject } from 'vue'
  493. import { useRouter } from 'vue-router'
  494. import Service from '@/service/ucard'
  495. import Service1 from '@/service/customer'
  496. import Config from '@/config/index'
  497. import ViewCardSingle from '@/views/components/ViewCardSingle'
  498. import DetailedInfoCid from '@/views/components/DetailedInfoCid'
  499. import TradingInfoAdd from '@/views/components/VirtualCard'
  500. import Service2 from '@/service/apply'
  501. import { exportExcel } from '@/utils/export'
  502. import { useI18n } from 'vue-i18n'
  503. import { Operation, Picture, Search } from '@element-plus/icons-vue'
  504. const { t } = useI18n()
  505. const router = useRouter()
  506. const { Code } = Config
  507. const pigeon = inject('pigeon')
  508. const Session = inject('session')
  509. // Refs
  510. const formRef = ref(null)
  511. const approveFormRef = ref(null)
  512. const imgUrl = Config.Host85
  513. const pictLoading = ref(false)
  514. const dialogInfoTradingAdd = ref(false)
  515. const approveLoading = ref(false)
  516. const dialogInfoTradingSingle = ref(false)
  517. const dialogInfoCid = ref(false)
  518. const approveDialogVisible = ref(false)
  519. // Reactive data
  520. const search = reactive({
  521. tag: 1,
  522. mobile: '',
  523. type: '',
  524. cId: '',
  525. email: '',
  526. status: '',
  527. })
  528. const mock_tableData = ref([])
  529. const formInfo = ref({})
  530. const formSingle = ref({})
  531. const editor = ref('')
  532. const editorType = ref(2)
  533. const addType = ref('')
  534. const myInfo = ref({})
  535. const formList = ref({})
  536. const pagerInfo = reactive({ row: 10, current: 1, pageTotal: 0, rowTotal: 0 })
  537. const idTypeList = ref([
  538. { name: 'card.Form.v4', value: 'PASSPORT' },
  539. { name: 'card.Form.v3', value: 'HK_HKID' },
  540. { name: 'card.Form.v5', value: 'DLN' },
  541. { name: 'card.Form.v6', value: 'GOVERNMENT_ISSUED_ID_CARD' },
  542. ])
  543. const approveForm = reactive({
  544. id: null,
  545. cId: '',
  546. name: '',
  547. email: '',
  548. mobile: '',
  549. idNumber: '',
  550. kycIdNumber: '',
  551. kycNumber: '',
  552. kycName: '',
  553. images: [],
  554. images1: [],
  555. status: 2,
  556. approveDesc: '',
  557. })
  558. const approveRules = reactive({
  559. status: [
  560. {
  561. required: true,
  562. message: t('R-Review-Status-Select'),
  563. trigger: 'change',
  564. },
  565. ],
  566. approveDesc: [
  567. {
  568. required: true,
  569. message: t('R-Review-Desc-Input'),
  570. trigger: 'blur',
  571. },
  572. ],
  573. })
  574. const reasons = ref({})
  575. const dInfo = ref({})
  576. // Computed
  577. const display = computed(() => {
  578. return JSON.parse(Session.Get('display', true) || '{}')
  579. })
  580. const user = computed(() => {
  581. return JSON.parse(Session.Get('user', true) || '{}')
  582. })
  583. // Methods
  584. //导出
  585. const exportAgents = async () => {
  586. exportExcel(pigeon, '/wasabi/merchant/kyc/list/export', { ...search }, 'KYC_Verification')
  587. }
  588. const getDetail = async (row) => {
  589. try {
  590. let res = await Service.merchantList({
  591. cId: row.cId,
  592. page: {
  593. current: pagerInfo.current,
  594. row: pagerInfo.row,
  595. },
  596. })
  597. dInfo.value = res.data
  598. } catch (error) {
  599. pigeon.MessageError(t('Msg.SearchFail'))
  600. }
  601. }
  602. const handleCommand = async (command) => {
  603. switch (command.type) {
  604. case 4:
  605. addType.value = 4
  606. openApproveDialog(command.row)
  607. break
  608. case 5:
  609. addType.value = 5
  610. openApproveDialog(command.row)
  611. break
  612. case 12:
  613. await getDetail(command.row)
  614. addType.value = 12
  615. formList.value = { ...command.row, ...dInfo.value }
  616. dialogInfoTradingAdd.value = true
  617. break
  618. }
  619. }
  620. const openApproveDialog = async (row) => {
  621. pictLoading.value = true
  622. try {
  623. let res = await Service.kycSearchSingle({ id: row.id })
  624. if (res.code == Code.StatusOK) {
  625. const detailData = res.data
  626. approveForm.id = row.id
  627. approveForm.cId = detailData.cId || row.cId || ''
  628. approveForm.areaCodeMobile =
  629. detailData.areaCode + ' ' + detailData.mobile || row.areaCode + ' ' + row.mobile || ''
  630. approveForm.infoName = detailData.infoName || ''
  631. approveForm.phone = detailData.phone
  632. approveForm.email = detailData.email || ''
  633. approveForm.identity = detailData.identity
  634. approveForm.images1 = detailData.infoFiles || []
  635. approveForm.cardName = detailData.cardName || ''
  636. approveForm.idType = detailData.idType || ''
  637. approveForm.idNumber = detailData.idNumber
  638. approveForm.mobile = detailData.mobile || ''
  639. approveForm.issueDate = detailData.issueDate
  640. approveForm.idNoExpiryDate = detailData.idNoExpiryDate
  641. approveForm.cardFiles = detailData.cardFiles || []
  642. approveForm.kycIdNumber = detailData.kycIdNumber || ''
  643. approveForm.kycNumber = detailData.kycNumber || ''
  644. approveForm.kycName = detailData.kycName || ''
  645. approveForm.images = detailData.kycFiles || []
  646. approveForm.status = 2
  647. approveForm.approveDesc = ''
  648. approveDialogVisible.value = true
  649. } else {
  650. pigeon.MessageError(res.msg)
  651. }
  652. } catch (error) {
  653. console.log(error)
  654. pigeon.MessageError(t('Msg.SearchFail'))
  655. } finally {
  656. pictLoading.value = false
  657. }
  658. }
  659. // 确认审核
  660. const kycSubmit = async () => {
  661. approveFormRef.value.validate(async (valid) => {
  662. if (valid) {
  663. approveLoading.value = true
  664. try {
  665. let res = await Service.kycSubmit({
  666. ...approveForm,
  667. cId: user.value.cId,
  668. })
  669. if (res.code == Code.StatusOK) {
  670. approveDialogVisible.value = false
  671. pigeon.MessageOK('审核成功')
  672. searchFunc()
  673. } else {
  674. pigeon.MessageError(res.msg)
  675. }
  676. } catch (error) {
  677. pigeon.MessageError(t('Msg.SaveFail'))
  678. } finally {
  679. approveLoading.value = false
  680. }
  681. }
  682. })
  683. }
  684. //详细信息cid
  685. const accountOpen = (cId) => {
  686. router.push({ name: 'R-CustomerDetail', params: { cId: cId } })
  687. }
  688. const searchSingleCid = async (cId) => {
  689. let res = await Service1.cidRealSingle({
  690. id: cId,
  691. })
  692. if (res.code == Code.StatusOK) {
  693. if (editor.value) {
  694. formList.value = res.data
  695. // dialogInfoAdd.value = true
  696. } else {
  697. formInfo.value = res.data
  698. searchRealAll(cId)
  699. }
  700. } else {
  701. pigeon.MessageError(res.msg)
  702. }
  703. }
  704. //获取cid下的真实账户信息
  705. const searchRealAll = async (cId) => {
  706. let res = await Service1.realCustomerListAll({
  707. cId: cId,
  708. page: {
  709. current: 1,
  710. row: 1,
  711. },
  712. })
  713. if (res.code == Code.StatusOK) {
  714. formInfo.value.realList = res.data
  715. dialogInfoCid.value = true
  716. } else {
  717. pigeon.MessageError(res.msg)
  718. }
  719. }
  720. //获取详细数据pibno
  721. const searchSinglePIbNo = async (pIbNo) => {
  722. let res = await Service1.pIbNoRealSingle({
  723. ibNo: pIbNo,
  724. })
  725. if (res.code == Code.StatusOK) {
  726. // formInfoPib.value = res.data
  727. // dialogInfoPIbNo.value = true
  728. } else {
  729. pigeon.MessageError(res.msg)
  730. }
  731. }
  732. //详细信息pibno
  733. const agentOpen = (pIbNo) => {
  734. searchSinglePIbNo(pIbNo)
  735. }
  736. //详细信息关闭cid/pibno
  737. const closeDia = () => {
  738. dialogInfoCid.value = false
  739. }
  740. const close = (val) => {
  741. dialogInfoCid.value = val
  742. }
  743. // 查询KYC认证状态
  744. const kycStatus = async ({ uniqueId, cardTypeId }) => {
  745. let res = await Service.kycStatus({
  746. uniqueId,
  747. cardTypeId,
  748. cId: user.value.cId,
  749. })
  750. if (res.code == Code.StatusOK) {
  751. pigeon.MessageOK(t('Msg.Success8'))
  752. searchFunc()
  753. } else {
  754. pigeon.MessageError(res.msg)
  755. }
  756. }
  757. const closeSingle = () => {
  758. dialogInfoTradingSingle.value = false
  759. }
  760. const closeAdd = (val) => {
  761. formList.value = {}
  762. dialogInfoTradingAdd.value = val
  763. }
  764. //获取原因列表
  765. const searchReasons = async () => {
  766. let res = await Service2.reasonsRefusalList({ type: 15 })
  767. if (res.code == Code.StatusOK) {
  768. if (res.data == null) {
  769. reasons.value = {}
  770. } else {
  771. reasons.value = res.data
  772. }
  773. } else {
  774. pigeon.MessageError(res.msg)
  775. }
  776. }
  777. const closeDiaAdd = () => {
  778. formList.value = {}
  779. dialogInfoTradingAdd.value = false
  780. }
  781. const confirmToReload = () => {
  782. closeDiaAdd()
  783. searchFunc()
  784. }
  785. const toSearch = () => {
  786. pagerInfo.current = 1
  787. searchFunc()
  788. }
  789. // 列表
  790. const searchFunc = async () => {
  791. pictLoading.value = true
  792. console.log(display.value, 'display')
  793. if (!display.value['R-KycAuth-Search']?.show) {
  794. pigeon.MessageWarning(t('Msg.NotDisplay'))
  795. pictLoading.value = false
  796. return
  797. }
  798. let res = await Service.kycList({
  799. ...search,
  800. page: {
  801. current: pagerInfo.current,
  802. row: pagerInfo.row,
  803. },
  804. })
  805. if (res.code == Code.StatusOK) {
  806. mock_tableData.value = res.data
  807. if (res.page != null) {
  808. pagerInfo.rowTotal = res.page.rowTotal
  809. pagerInfo.pageTotal = res.page.pageTotal
  810. } else {
  811. pagerInfo.rowTotal = 0
  812. }
  813. pigeon.MessageOK(t('Msg.SearchSuccess'))
  814. } else {
  815. pigeon.MessageError(res.msg)
  816. }
  817. pictLoading.value = false
  818. }
  819. const handleSizeChange = (val) => {
  820. pagerInfo.row = val
  821. searchFunc()
  822. }
  823. const handleCurrentChange = (val) => {
  824. pagerInfo.current = val
  825. searchFunc()
  826. }
  827. // 生命周期
  828. onMounted(() => {
  829. searchReasons()
  830. searchFunc()
  831. })
  832. // Watchers
  833. watch(
  834. () => search.tag,
  835. () => {
  836. search.mobile = ''
  837. search.email = ''
  838. search.cId = ''
  839. search.type = ''
  840. search.status = ''
  841. }
  842. )
  843. </script>
  844. <style scoped lang="scss">
  845. #review_Email {
  846. .crm_search {
  847. .search_action_btn {
  848. .delete {
  849. background-color: #a1a1a1;
  850. }
  851. .delete.active {
  852. background-color: #368fec;
  853. }
  854. }
  855. }
  856. .el-table .state {
  857. display: inline-block;
  858. min-width: 80px;
  859. max-width: 150px;
  860. box-sizing: border-box;
  861. line-height: 1.5;
  862. border-radius: 2px;
  863. padding: 2px 10px;
  864. color: #ffffff;
  865. }
  866. }
  867. </style>
  868. <style lang="scss">
  869. @import 'index.scss';
  870. </style>