sign-admin.vue 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. <template>
  2. <div class="hc-layout-box">
  3. <HcNewCard :scrollbar="false" action-size="lg">
  4. <template #header>
  5. <div class="w-64">
  6. <el-input v-model="searchForm.evisaUserName" block clearable placeholder="请输入用户名称检索" @keyup="keyUpEvent" />
  7. </div>
  8. <div class="w-32 ml-3">
  9. <el-select v-model="searchForm.contractId" block clearable placeholder="合同段" @change="ContractIdChange">
  10. <el-option v-for="item in contractList" :key="item.id" :label="item.name" :value="item.id" />
  11. </el-select>
  12. </div>
  13. <div class="w-32 ml-3">
  14. <el-select v-model="searchForm.visaStatus" block placeholder="电签状态" @change="visaStatusChange">
  15. <el-option label="电签失败" :value="1" />
  16. <el-option label="电签成功" :value="2" />
  17. </el-select>
  18. </div>
  19. <div class="w-64 ml-3">
  20. <HcDatePicker :dates="betweenTime" clearable @change="betweenTimeUpdate" />
  21. </div>
  22. <div class="w-56 ml-3">
  23. <el-input v-model="searchForm.queryValue" block clearable placeholder="请输入名称关键词检索" @keyup="keyUpEvent" />
  24. </div>
  25. <div class="ml-2">
  26. <el-button type="primary" @click="searchClick">
  27. <HcIcon name="search-2" />
  28. <span>搜索</span>
  29. </el-button>
  30. </div>
  31. </template>
  32. <template #extra>
  33. <HcTooltip keys="tasks_sign_key_renewal">
  34. <el-button hc-btn type="primary" :loading="resignLoading" :disabled="tableCheckedKeys.length == 0" @click="resignClick">
  35. <HcIcon name="restart" />
  36. <span>一键重签</span>
  37. </el-button>
  38. </HcTooltip>
  39. </template>
  40. <HcTable
  41. ref="tableListRef" :column="tableListColumn" :datas="tableData" :loading="tableLoading"
  42. is-new :index-style="{ width: 60 }" is-check :check-style="{ width: 29 }"
  43. @selection-change="tableSelectionChange"
  44. >
  45. <template #taskName="{ row }">
  46. <span class="text-link" @click="rowTaskName(row)">{{ row?.taskName }}</span>
  47. </template>
  48. <template #taskStatusName="{ row }">
  49. <el-tag
  50. v-if="row?.taskStatusName"
  51. :type="`${row.taskStatusName === '已审批' ? 'success' : row.taskStatusName === '已废除' ? 'warning' : 'info'}`" class="mx-1" effect="dark"
  52. >
  53. {{ row.taskStatusName }}
  54. </el-tag>
  55. </template>
  56. <template #taskApproveUserNamesList="{ row }">
  57. <template v-for="item in row.taskApproveUserNamesList">
  58. <el-tag
  59. v-if="item.taskUserName"
  60. :type="`${item.evisaStatus === 2 ? 'success' : item.evisaStatus === 3 ? 'warning' : item.evisaStatus === 999 ? 'danger' : 'info'}`" class="mx-1" effect="dark"
  61. >
  62. {{ item.taskUserName }}
  63. </el-tag>
  64. </template>
  65. </template>
  66. </HcTable>
  67. <template #action>
  68. <HcPages :pages="searchForm" :sizes="[10, 20, 30, 40, 50, 200]" @change="pageChange" />
  69. </template>
  70. </HcNewCard>
  71. <!-- 一键重签弹窗 -->
  72. <hc-new-dialog v-model="resignModal" title="一键重签" widths="38rem" :loading="resignLoading" @close="cancelresign" @save="saveResign">
  73. <div>
  74. 是否重新生成pdf:
  75. <el-radio-group v-model="resignModalRadio">
  76. <el-radio :value="0">否</el-radio>
  77. <el-radio :value="1">是</el-radio>
  78. </el-radio-group>
  79. </div>
  80. </hc-new-dialog>
  81. </div>
  82. </template>
  83. <script setup>
  84. import { onMounted, ref } from 'vue'
  85. import { useAppStore } from '~src/store'
  86. import { arrToId, getArrValue, getObjValue } from 'js-fast-way'
  87. import signApi from '~api/tasks/sign'
  88. import { toPdfPage } from '~uti/btn-auth'
  89. //变量
  90. const useAppState = useAppStore()
  91. const projectId = ref(useAppState.getProjectId)
  92. const contractId = ref(useAppState.getContractId)
  93. const projectInfo = ref(useAppState.getProjectInfo)
  94. const contractInfo = ref(useAppState.getContractInfo)
  95. //渲染完成
  96. onMounted(() => {
  97. const project = getObjValue(projectInfo.value)
  98. contractList.value = getArrValue(project['contractInfoList'])
  99. const { contractType } = contractInfo.value
  100. searchForm.value.contractId = contractId.value
  101. contractTypeTabKey.value = contractType === 2 ? '2' : '1'
  102. getTableData()
  103. })
  104. const tasksData = ref([])
  105. const statusData = ref([])
  106. const contractTypeTabKey = ref('1')
  107. //合同段
  108. const contractList = ref([])
  109. const ContractIdChange = (id) => {
  110. const list = contractList.value
  111. for (let i = 0; i < list.length; i++) {
  112. if (list[i].id === id) {
  113. contractTypeTabKey.value = list[i].contractType === 2 ? '2' : '1'
  114. break
  115. }
  116. }
  117. console.log(contractTypeTabKey.value)
  118. getTableData()
  119. }
  120. const visaStatusChange = () => {
  121. getTableData()
  122. }
  123. //日期时间被选择
  124. const betweenTime = ref(null)
  125. const betweenTimeUpdate = ({ val, arr }) => {
  126. betweenTime.value = arr
  127. searchForm.value.startTimeValue = val['start']
  128. searchForm.value.endTimeValue = val['end']
  129. }
  130. //搜索表单
  131. const searchForm = ref({
  132. queryValue: null, evisaUserName: null, contractId: null, startTimeValue: null, endTimeValue: null,
  133. current: 1, size: 200, total: 0, visaStatus:1,
  134. })
  135. //回车搜索
  136. const keyUpEvent = (e) => {
  137. if (e.key === 'Enter') {
  138. searchForm.value.current = 1
  139. getTableData()
  140. }
  141. }
  142. //重新搜索数据
  143. const searchClick = () => {
  144. searchForm.value.current = 1
  145. getTableData()
  146. }
  147. //分页被点击
  148. const pageChange = ({ current, size }) => {
  149. searchForm.value.current = current
  150. searchForm.value.size = size
  151. getTableData()
  152. }
  153. //获取数据
  154. const tableLoading = ref(false)
  155. const tableData = ref([])
  156. const getTableData = async () => {
  157. tableLoading.value = true
  158. const { error, code, data } = await signApi.eVisaFailedPage({
  159. ...searchForm.value,
  160. })
  161. //判断状态
  162. tableLoading.value = false
  163. if (!error && code === 200) {
  164. tableData.value = getArrValue(data['records'])
  165. searchForm.value.total = data['total'] || 0
  166. } else {
  167. tableData.value = []
  168. searchForm.value.total = 0
  169. }
  170. }
  171. //多选
  172. const tableListRef = ref(null)
  173. const tableCheckedKeys = ref([])
  174. const tableSelectionChange = (rows) => {
  175. tableCheckedKeys.value = rows.filter((item) => {
  176. return (item ?? '') !== ''
  177. })
  178. }
  179. const tableListColumn = ref([
  180. { key: 'taskName', name: '流程名称' },
  181. { key: 'taskStatusName', name: '任务状态' },
  182. { key: 'evisaStatusName', name: '电签状态' },
  183. { key: 'startTime', name: '开始时间' },
  184. { key: 'endTime', name: '限定时间' },
  185. { key: 'evisaUpdateDate', name: '审批时间' },
  186. { key: 'evisaFailedInfo', name: '电签失败原因' },
  187. { key: 'taskReportUserName', name: '上报人' },
  188. { key: 'taskApproveUserNamesList', name: '电签任务人' },
  189. ])
  190. //一键重签
  191. const resignModal = ref(false)
  192. const resignModalRadio = ref(0)
  193. const resignLoading = ref(false)
  194. const resignClick = async ()=>{
  195. resignModal.value = true
  196. }
  197. const saveResign = async ()=>{
  198. const taskIds = arrToId(tableCheckedKeys.value)
  199. resignLoading.value = true
  200. const { error, code, msg } = await signApi.reSigningEVisa({
  201. contractId:searchForm.value.contractId,
  202. projectId:projectId.value,
  203. taskIds:taskIds,
  204. classifyType: contractTypeTabKey.value,
  205. type:resignModalRadio.value,
  206. })
  207. //判断状态
  208. resignLoading.value = false
  209. if (!error && code === 200) {
  210. window.$message.success(msg)
  211. getTableData()
  212. }
  213. resignModal.value = false
  214. }
  215. const cancelresign = ()=>{
  216. resignModalRadio.value = 0
  217. resignModal.value = false
  218. }
  219. const rowTaskName = (row)=>{
  220. if (row?.sigPdf) {
  221. toPdfPage(row.sigPdf)
  222. //window.open(row.sigPdf, '_blank')
  223. } else {
  224. window?.$message.warning('暂无文档')
  225. }
  226. }
  227. </script>
  228. <style lang="scss" scoped>
  229. .hc-layout-box {
  230. position: relative;
  231. height: 100%;
  232. }
  233. </style>