index.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. <!-- 签约账号管理 -->
  2. <template>
  3. <app-table :data="dataList" v-model:columns="tableColumns" :loading="loading" :row-key="rowKey"
  4. :expand-row-keys="expandKeys" @row-click="rowClick">
  5. <template #headerLeft>
  6. <template v-if="((hasAQAuth && hasSignContract) || !hasAQAuth) && [AuthStatus.Certified, AuthStatus.Submitted].includes(authStatus) && ![SignStatus.Audit, SignStatus.Signing, SignStatus.Signed].includes(signStatus)">
  7. <el-button type="primary" size="small"
  8. @click="showComponent('sign')">{{ t('banksign.addbanksign') }}</el-button>
  9. </template>
  10. <template v-if="[AuthStatus.Certified, AuthStatus.Submitted].includes(authStatus) && (hasAQAuth && !hasSignContract) ">
  11. <el-button type="primary" size="small" @click="showComponent('protocol')">{{ t('banksign.signagreement') }}</el-button>
  12. </template>
  13. <el-button type="warning" size="small" v-if="authStatus === AuthStatus.Uncertified"
  14. @click="openComponent('certification-aq')">{{ t('user.authentication.title') }}</el-button>
  15. </template>
  16. <!-- 证件类型 -->
  17. <template #cardtype="{ value }">
  18. {{ getCertificateTypeCodeName(Number(value)) }}
  19. </template>
  20. <!-- 状态 -->
  21. <template #signstatus="{ value }">
  22. {{ getSignStatusName(value) }}
  23. </template>
  24. <!-- 状态 -->
  25. <template #updatetime="{ value }">
  26. {{ formatDate(value) }}
  27. </template>
  28. <!-- 展开行 -->
  29. <template #expand="{ row }">
  30. <div class="buttonbar">
  31. <el-button v-if="row.signstatus === SignStatus.Signed && cusBank?.canrelease === 1" type="danger"
  32. size="small" @click="openComponent('cancel')">{{ t('banksign.cancel') }}</el-button>
  33. <el-button
  34. v-if="[SignStatus.Unsigned, SignStatus.Refuse, SignStatus.Rescinded].includes(row.signstatus) || (row.signstatus === SignStatus.Signed && cusBank?.canmodifysigninfo === 1)"
  35. type="primary" size="small" @click="showComponent('sign')">{{ t('operation.modify') }}</el-button>
  36. </div>
  37. </template>
  38. </app-table>
  39. <component ref="componentRef" v-bind="{ selectedRow }" :is="componentMap.get(componentId)" @closed="closeComponent"
  40. v-if="componentId" />
  41. </template>
  42. <script lang="ts" setup>
  43. import { shallowRef, defineAsyncComponent, onMounted, computed } from 'vue'
  44. import { ElMessageBox } from 'element-plus'
  45. import { useComponent } from '@/hooks/component'
  46. import { useComposeTable } from '@pc/components/base/table'
  47. import { useRequest } from '@/hooks/request'
  48. import { queryBankAccountSign, queryCusBankSignBank } from '@/services/api/bank'
  49. import { getSignStatusName, SignStatus } from '@/constants/bank'
  50. import { getCertificateTypeCodeName } from '@/constants/account'
  51. import { queryUserAccount, queryUsereSignRecords } from '@/services/api/account'
  52. import { AuthStatus } from '@/constants/account'
  53. import { useUserStore, i18n } from '@/stores'
  54. import { ElMessage } from 'element-plus'
  55. import { queryMdUserSwapProtocol } from '@/services/api/swap'
  56. import { getUserId, getMemberUserId } from '@/services/methods/user'
  57. import AppTable from '@pc/components/base/table/index.vue'
  58. import service from '@/services'
  59. import { formatDate } from '@/filters'
  60. const componentMap = new Map<string, unknown>([
  61. ['cancel', defineAsyncComponent(() => import('./components/cancel/index.vue'))],
  62. ['sign', defineAsyncComponent(() => import('./components/sign/index.vue'))],
  63. ['certification', defineAsyncComponent(() => import('./components/certification/index.vue'))], // 实名认证,
  64. ['certification-aq', defineAsyncComponent(() => import('./components/certification-aq/index.vue'))], // 实名认证
  65. ['protocol', defineAsyncComponent(() => import('./components/protocol/index.vue'))], // 合同签署
  66. ])
  67. const useStore = useUserStore()
  68. const authStatus = shallowRef(AuthStatus.Certified) // 实名认证状态
  69. const signStatus = shallowRef(SignStatus.Unsigned)
  70. const cusBank = shallowRef<Model.CusBankSignBankRsp>()
  71. const oem = service.getConfig('oem')
  72. const { t } = i18n.global
  73. const dataList = shallowRef<Model.BankAccountSignRsp[]>()
  74. const { rowKey, expandKeys, rowClick, selectedRow } = useComposeTable<Model.BankAccountSignRsp>({ rowKey: 'applyexchticket' })
  75. // 需求 #5692: 交易系统通用问题2024
  76. const { loading, run } = useRequest(queryBankAccountSign, {
  77. onSuccess: (res) => {
  78. /// 签约状态
  79. if (res.data.length != 0) {
  80. dataList.value = res.data.sort((a, b) => {
  81. return b.updatetime.localeCompare(a.updatetime)
  82. }).slice(0, 1)
  83. signStatus.value = dataList.value[0].signstatus
  84. }
  85. }
  86. })
  87. /// 查询用户掉期协议签署表
  88. const { dataList: protocolList } = useRequest(queryMdUserSwapProtocol, {
  89. defaultParams: {
  90. userId: getUserId()
  91. }
  92. })
  93. /// 查询爱签签约协议信息
  94. const { dataList: records} = useRequest(queryUsereSignRecords, {
  95. defaultParams: {
  96. userId: getUserId(),
  97. memberUserId: getMemberUserId(),
  98. }
  99. })
  100. /// 判断是否能签约
  101. const hasSignContract = computed(() => {
  102. if ( oem.toLowerCase() === 'tjmd' ) {
  103. return protocolList.value.some(e => { return e.protocolstatus === 4 })
  104. } else if ( oem.toLowerCase() === 'zrwyt' ) {
  105. return records.value.some(e => { return e.recordstatus === 3 && e.templatetype === 2 })
  106. } else if (oem.toLowerCase() === 'gcszt' ) {
  107. return !records.value.some(e => { return e.recordstatus != 3 })
  108. }
  109. return true
  110. })
  111. /// 是否爱签实名认证
  112. const hasAQAuth = computed(() => {
  113. if ( oem.toLowerCase() === 'tjmd' ) {
  114. return true
  115. } else if ( oem.toLowerCase() === 'zrwyt' ) {
  116. return records.value.some(e => { return e.recordstatus === 3 && e.templatetype === 1 })
  117. } else if ( oem.toLowerCase() === 'gcszt' ) {
  118. return true
  119. }
  120. return true
  121. })
  122. /// 查询托管银行信息
  123. useRequest(queryCusBankSignBank, {
  124. onSuccess: (res) => {
  125. /// 签约状态
  126. if (res.data.length != 0) {
  127. cusBank.value = res.data[0]
  128. }
  129. }
  130. })
  131. const { componentRef, componentId, openComponent, closeComponent } = useComponent(() => {
  132. run()
  133. })
  134. const showComponent = ((componentName: string) => {
  135. /// 认证请求中 不能操作
  136. if (authStatus.value === AuthStatus.Submitted) {
  137. ElMessage.error(t('banksign.tips8'))
  138. return
  139. }
  140. openComponent(componentName)
  141. })
  142. const tableColumns = shallowRef<Model.TableColumn[]>([
  143. { field: 'accountcode', label: 'banksign.wallet.inoutapply.accountcode' },
  144. { field: 'accountname', label: 'banksign.accountname' },
  145. { field: 'cardtype', label: 'banksign.cardtype' },
  146. { field: 'cardno', label: 'banksign.cardno' },
  147. { field: 'cusbankname', label: 'banksign.cusbankname' },
  148. { field: 'bankname', label: 'banksign.bankname' },
  149. { field: 'bankaccountno', label: 'banksign.bankaccountno1' },
  150. { field: 'currency', label: 'banksign.currency' },
  151. { field: 'signstatus', label: 'banksign.signstatus' },
  152. { field: 'remark', label: 'banksign.remark' },
  153. { field: 'updatetime', label: 'banksign.remark' },
  154. ])
  155. onMounted(() => {
  156. useStore.getUserData()
  157. // 获取用户账号信息----------------待处理,直接用useStore
  158. queryUserAccount().then((res) => {
  159. authStatus.value = res.data.hasauth
  160. })
  161. })
  162. </script>