hc-data.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549
  1. <template>
  2. <div class="hc-layout-box">
  3. <HcTabsSimple :no-drop-shadow="showTaskReviewModal" :cur="sbTableKey" :datas="sbTableData" @tab-click="sbTableClick">
  4. <template #tab-key1>
  5. <TableCard
  6. v-if="sbTableKey === 'key1'" :contract-id="contractId"
  7. :contract-list="contractList"
  8. :project-id="projectId" :table-key="sbTableKey"
  9. @batch-approval="batchApprovalTaskClick" @row-task-name="rowTaskName"
  10. @sign-rules="setSignRulesClick"
  11. />
  12. </template>
  13. <template #tab-key2>
  14. <TableCard
  15. v-if="sbTableKey === 'key2'" :contract-id="contractId"
  16. :contract-list="contractList"
  17. :project-id="projectId" :table-key="sbTableKey"
  18. @batch-approval="batchApprovalTaskClick" @row-task-name="rowTaskName"
  19. @sign-rules="setSignRulesClick"
  20. />
  21. </template>
  22. <template #tab-key3>
  23. <TableCard
  24. v-if="sbTableKey === 'key3'" :contract-id="contractId"
  25. :contract-list="contractList"
  26. :project-id="projectId" :table-key="sbTableKey"
  27. @batch-approval="batchApprovalTaskClick" @row-task-name="rowTaskName"
  28. @sign-rules="setSignRulesClick"
  29. />
  30. </template>
  31. </HcTabsSimple>
  32. <!-- 任务审核 -->
  33. <el-dialog
  34. v-model="showTaskReviewModal" class="hc-modal-border hc-modal-table" destroy-on-close draggable
  35. width="98vw"
  36. >
  37. <template #header="{ titleId, titleClass }">
  38. <div class="hc-card-header flex items-center">
  39. <div :id="titleId" :class="titleClass">
  40. 任务审核 【已开启电签】
  41. </div>
  42. <div v-if="taskReviewType === '1'" class="ml-6 font-bold text-main">
  43. 任务名称:{{ taskReviewInfo.taskName }}
  44. </div>
  45. </div>
  46. </template>
  47. <div class="hc-card-body-flex">
  48. <div v-if="batchPdfUrl" class="flex-iframe">
  49. <!-- <HcPdf :src="batchPdfUrl" @change="changeSealStrategy" /> -->
  50. <HcPdf v-if="pdfItem.pdfUrl" :sign="logoName" :src="pdfItem.pdfUrl" :dom="pdfItem.hcSignImageArr" :batch="isBatch" @change="pdfChange" />
  51. </div>
  52. <div v-else class="flex-iframe hc-no-table-form">
  53. <div class="table-form-no">
  54. <img :src="notableform" alt="">
  55. <div class="desc">
  56. 暂无 PDF 数据
  57. </div>
  58. </div>
  59. </div>
  60. <div :class="sbTableKey === 'key1' ? '' : 'vh'" class="flex-table">
  61. <el-button v-if="sbTableKey === 'key1' && !isBatch && isShowDqBtn" hc-btn type="warning" class=" mb-4" @click="BatchClick(true)">
  62. 批量电签
  63. </el-button>
  64. <el-button v-if="sbTableKey === 'key1' && isBatch && isShowDqBtn" hc-btn type="warning" class=" mb-4" @click="BatchClick(false)">
  65. 取消批量签名/章
  66. </el-button>
  67. <div v-if="taskReviewType === '1'" class="data-table taskReviewData">
  68. <HcTable :column="taskReviewColumns" :datas="taskReviewData" is-new :index-style="{ width: 60 }" @row-click="rowTaskReviewClick" />
  69. </div>
  70. <div v-if="taskReviewType === '2'" class="data-table checkedRowsRef">
  71. <HcTable :column="checkedRowsColumns" :datas="checkedRowsRef" is-new :index-style="{ width: 60 }" @row-click="rowTaskReviewClick" />
  72. </div>
  73. <div v-if="sbTableKey === 'key1'" class="radio-group-box">
  74. <span class="label">审批操作:</span>
  75. <el-radio-group v-model="taskReviewForm.flag">
  76. <el-radio label="OK">
  77. 同意
  78. </el-radio>
  79. <el-radio label="NO">
  80. 废除任务
  81. </el-radio>
  82. </el-radio-group>
  83. </div>
  84. <div v-if="sbTableKey === 'key1'" class="textarea-box">
  85. <el-input
  86. v-model="taskReviewForm.comment" :autosize="{ minRows: 3, maxRows: 5 }"
  87. placeholder="请输入审核意见"
  88. type="textarea"
  89. />
  90. </div>
  91. </div>
  92. </div>
  93. <template v-if="sbTableKey === 'key1'" #footer>
  94. <div class="dialog-footer">
  95. <el-button size="large" @click="showTaskReviewModal = false">
  96. 取消
  97. </el-button>
  98. <el-button :loading="SMSAuthLoading" hc-btn type="primary" @click="ConfirmApprovalClick">
  99. 确认审批
  100. </el-button>
  101. </div>
  102. </template>
  103. </el-dialog>
  104. <!-- 设置重签规则 -->
  105. <el-dialog
  106. v-model="showSetSignRulesModal" class="hc-modal-border" destroy-on-close draggable
  107. title="设置重签规则"
  108. width="38rem"
  109. >
  110. <div class="text-orange mb-10">
  111. <span
  112. class="mr-4"
  113. >提示:设置默认时长,在任务被废除需要重签的时候,规定的重签上报时间提示时间段内,系统提示用户重签信息,但是超过处理时间,系统可默认自动授权重签</span>
  114. <el-checkbox v-model="setPactVal" label="Option 1" size="large">
  115. <span class="text-main">《授权系统自动电签协议》</span>
  116. </el-checkbox>
  117. </div>
  118. <div class="obj-item-cell">
  119. <div class="label">
  120. 默认处理时间(时)
  121. </div>
  122. <HcCounter v-model="formReport.date" @update:model-value="dateUpdateValue" />
  123. </div>
  124. <div class="obj-item-cell">
  125. <div class="label">
  126. 开启系统自动电签
  127. </div>
  128. <el-switch v-model="formReport.active" />
  129. </div>
  130. <template #footer>
  131. <div class="dialog-footer">
  132. <el-button size="large" @click="showSetSignRulesModal = false">
  133. 取消
  134. </el-button>
  135. <el-button hc-btn type="primary">
  136. 保存
  137. </el-button>
  138. </div>
  139. </template>
  140. </el-dialog>
  141. <!-- 短信认证 -->
  142. <HcSmsAuth :loading="SMSAuthLoading" :show="SMSAuthShow" @cancel="SMSAuthCancel" @confirm="SMSAuthConfirm" />
  143. </div>
  144. </template>
  145. <script setup>
  146. import { nextTick, onMounted, ref } from 'vue'
  147. import { useAppStore } from '~src/store'
  148. import { useRoute, useRouter } from 'vue-router'
  149. import TableCard from './components/TableCard.vue'
  150. import notableform from '~src/assets/view/notableform.svg'
  151. import { getContractInfo } from '~api/other'
  152. import tasksFlowApi from '~api/tasks/flow'
  153. import { arrToKey, getArrValue, getUUID, isString } from 'js-fast-way'
  154. import tasksApi from '~api/tasks/data'
  155. import dayjs from 'dayjs'
  156. import HcPdf from './components/hc-pdf1.vue'
  157. import userApi from '~api/userInfo/index'
  158. //初始变量
  159. const router = useRouter()
  160. const useRoutes = useRoute()
  161. const useAppState = useAppStore()
  162. //路由参数
  163. const routerQuery = useRoutes?.query
  164. const activeName = routerQuery?.active || 'key1'
  165. //全局变量
  166. const projectId = ref(useAppState.getProjectId)
  167. const contractId = ref(useAppState.getContractId)
  168. const projectInfo = ref(useAppState.getProjectInfo)
  169. //渲染完成
  170. onMounted(() => {
  171. checkSmsCode()
  172. getContractInfoList()
  173. })
  174. //pdf
  175. //合同段信息
  176. const contractList = ref([])
  177. const getContractInfoList = async ()=>{
  178. const { error, code, data } = await getContractInfo({
  179. pid: projectId.value,
  180. })
  181. if (!error && code === 200) {
  182. contractList.value = getArrValue(data)
  183. } else {
  184. contractList.value = []
  185. }
  186. }
  187. //类型处理
  188. const sbTableKey = ref(activeName)
  189. const sbTableData = ref([
  190. { icon: 'time', label: '待办任务', key: 'key1' },
  191. { icon: 'calendar-check', label: '已办任务', key: 'key2' },
  192. { icon: 'user-shared', label: '我发起的', key: 'key3' },
  193. ])
  194. const sbTableClick = (key) => {
  195. sbTableKey.value = key
  196. router.push({
  197. path: useRoutes.path,
  198. query: { active: key },
  199. })
  200. }
  201. //审批页详情
  202. const showTaskReviewModal = ref(false)
  203. const taskReviewType = ref('1')
  204. const taskReviewInfo = ref({})
  205. const taskReviewData = ref([])
  206. const batchPdfUrl = ref('')
  207. const taskReviewForm = ref({ flag: 'OK', comment: '' })
  208. const taskReviewColumns = ref([
  209. { key: 'fileName', name: '文件名称' },
  210. ])
  211. const pdfItem = ref({})
  212. const pdfIndex = ref(-1)
  213. const logoName = ref('')
  214. //获取用户信息
  215. const queryCurrentUserData = async () => {
  216. const { error, code, data } = await userApi.queryCurrentUserData()
  217. if (!error && code === 200) {
  218. logoName.value = data?.signatureUrl || ''
  219. } else {
  220. logoName.value = ''
  221. }
  222. }
  223. const pdfDataClick = (item, index) => {
  224. pdfItem.value = {}
  225. pdfIndex.value = index
  226. nextTick(() => {
  227. pdfItem.value = item
  228. })
  229. }
  230. const signArr = ref([])
  231. //签章数据改变
  232. const pdfChange = (data) => {
  233. // pdfData.value[pdfIndex.value].hcSignImageArr = data
  234. if (taskReviewType.value === '2') {
  235. checkedRowsRef.value.forEach((ele)=>{
  236. if (ele.id === pdfIndex.value) {
  237. ele.hcSignImageArr = data
  238. }
  239. })
  240. } else {
  241. signArr.value = data
  242. }
  243. console.log('签章数据', data)
  244. }
  245. const isBatch = ref(false)
  246. const BatchClick = (val)=>{
  247. isBatch.value = val
  248. }
  249. const isShowDqBtn = ref(true)
  250. //任务审核
  251. const rowTaskName = async (row) => {
  252. // if (row.id && row.type !== 2) {
  253. if (row.type !== 2) {
  254. isShowDqBtn.value = true
  255. } else {
  256. isShowDqBtn.value = false
  257. }
  258. taskReviewInfo.value = row
  259. const { error, code, data } = await tasksApi.queryTaskInfo({
  260. taskIds:row.id,
  261. type:row.type,
  262. })
  263. if (!error && code === 200) {
  264. const approvalFileList = getArrValue(data)
  265. taskReviewData.value = approvalFileList
  266. if (approvalFileList.length > 0) {
  267. batchPdfUrl.value = approvalFileList[0].pdfUrl
  268. if (sbTableKey.value === 'key1' && row.type !== 2) {
  269. queryCurrentUserData()
  270. } else {
  271. logoName.value = ''
  272. }
  273. pdfItem.value.pdfUrl = approvalFileList[0].pdfUrl
  274. }
  275. taskReviewType.value = '1'
  276. showTaskReviewModal.value = true
  277. isBatch.value = false
  278. } else {
  279. taskReviewData.value = []
  280. batchPdfUrl.value = ''
  281. }
  282. // } else {
  283. // taskReviewInfo.value = {}
  284. // taskReviewData.value = []
  285. // batchPdfUrl.value = ''
  286. // // window?.$message?.warning('此数据异常')
  287. // }
  288. }
  289. //批量审批
  290. const checkedRowsColumns = ref([
  291. { key: 'taskName', name: '任务名称' },
  292. ])
  293. const checkedRowsRef = ref([])
  294. const taskId = ref([])
  295. const batchApprovalTaskClick = (rows) => {
  296. //不同任务类型不能一起批量审批
  297. let types = arrToKey(rows, 'type', ',').split(',')
  298. let newTypes = Array.from(new Set(types))
  299. if (newTypes.length > 1) {
  300. window.$message.warning('不同任务类型不能一起批量审批')
  301. } else {
  302. taskReviewType.value = '2'
  303. showTaskReviewModal.value = true
  304. isBatch.value = false
  305. checkedRowsRef.value = rows
  306. let taskids = []
  307. rows.forEach((item) => {
  308. taskids.push(item.id)
  309. })
  310. taskids = taskids.join()
  311. queryTaskInfo(rows[0], taskids)
  312. }
  313. }
  314. //行被点击
  315. const rowTaskReviewClick = async ({ row }) => {
  316. console.log(row, 'rpw')
  317. const type = taskReviewType.value
  318. if (type === '1') {
  319. batchPdfUrl.value = row.pdfUrl
  320. } else if (row['hc_batchPdfUrl']) {
  321. batchPdfUrl.value = row['hc_batchPdfUrl']
  322. } else {
  323. queryTaskInfo(row)
  324. }
  325. pdfDataClick(row, row.id)
  326. }
  327. //默认点击
  328. //获取PDF数据
  329. const queryTaskInfo = async (row, taskids) => {
  330. taskId.value = taskids && taskids.length > 0 ? taskids : row['id']
  331. //验收任务类型传2,不能盖章
  332. // if (row.type !== 2) {
  333. if (row.type !== 2) {
  334. isShowDqBtn.value = true
  335. } else {
  336. isShowDqBtn.value = false
  337. }
  338. const { error, code, data } = await tasksApi.queryTaskInfo({
  339. taskIds: taskids && taskids.length > 0 ? taskids : row['id'],
  340. type:row.type,
  341. })
  342. //处理数据
  343. if (!error && code === 200) {
  344. const alldata = getArrValue(data)
  345. let approvalFileList = alldata
  346. if (approvalFileList.length > 0) {
  347. // await queryCurrentUserData()
  348. if (row['type'] !== 2) {
  349. await queryCurrentUserData()
  350. }
  351. pdfDataClick(row, row.id)
  352. pdfItem.value.pdfUrl = approvalFileList[0].pdfUrl
  353. batchPdfUrl.value = approvalFileList[0].pdfUrl
  354. row['pdfUrl'] = approvalFileList[0].pdfUrl
  355. } else {
  356. batchPdfUrl.value = ''
  357. row['pdfUrl'] = ''
  358. window?.$message?.warning('PDF获取异常')
  359. }
  360. } else {
  361. batchPdfUrl.value = ''
  362. row['pdfUrl'] = ''
  363. window?.$message?.warning(data.msg || 'PDF异常')
  364. }
  365. // } else {
  366. // batchPdfUrl.value = ''
  367. // row['pdfUrl'] = ''
  368. // }
  369. }
  370. const finalArr = ref([])
  371. //确认审批
  372. const ConfirmApprovalClick = async () => {
  373. const formData = taskReviewForm.value
  374. let objarr = []
  375. if (taskReviewType.value === '1') {
  376. //单个废除任务
  377. console.log(111111)
  378. console.log( checkedRowsRef.value, ' checkedRowsRef.value')
  379. objarr.push({
  380. taskId:taskReviewInfo.value.id,
  381. comment:formData.comment,
  382. flag:formData.flag,
  383. sealStrategy:signArr.value,
  384. })
  385. console.log(objarr, 'objarr')
  386. finalArr.value = objarr
  387. } else if (taskReviewType.value === '2') {
  388. //上报任务
  389. if (formData.flag === 'NO' && !formData.comment) {
  390. window?.$message?.warning('请先输入审核意见')
  391. } else {
  392. formData.taskId = taskId.value
  393. console.log(checkedRowsRef.value, 'checkedRowsRef.value')
  394. checkedRowsRef.value.forEach((ele)=>{
  395. objarr.push({
  396. taskId:ele.id,
  397. comment:formData.comment,
  398. flag:formData.flag,
  399. sealStrategy:ele.hcSignImageArr,
  400. })
  401. })
  402. console.log(objarr, 'objarr')
  403. finalArr.value = objarr
  404. }
  405. }
  406. SMSAuthLoading.value = true
  407. // const { error, code, msg, data } = await tasksApi.batchApproval({}, false)
  408. //判断数据
  409. SMSAuthLoading.value = false
  410. const ShowAuth = isCheckSmsCodeTime()
  411. SMSAuthShow.value = ShowAuth
  412. //免短信验证
  413. if (!ShowAuth) {
  414. SMSAuthConfirm()
  415. }
  416. }
  417. //短信验证有效期
  418. const smsCodeTime = ref('')
  419. const checkSmsCode = async () => {
  420. const { error, code, data } = await tasksApi.checkSmsCode()
  421. //处理数据
  422. if (!error && code === 200) {
  423. smsCodeTime.value = isString(data) ? data : ''
  424. } else {
  425. smsCodeTime.value = ''
  426. }
  427. }
  428. //验证短信有效期
  429. const isCheckSmsCodeTime = () => {
  430. const smsTime = smsCodeTime.value
  431. if (!smsTime) {
  432. return true
  433. } else {
  434. const toDayTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss')
  435. return dayjs(smsTime).isBefore(toDayTime)
  436. }
  437. }
  438. //短信验证
  439. const SMSAuthLoading = ref(false)
  440. const SMSAuthShow = ref(false)
  441. const SMSAuthConfirm = () => {
  442. const type = taskReviewType.value
  443. if (type === '1') {
  444. saveCompleteApprovalTask()
  445. } else {
  446. batchCompleteApprovalTask()
  447. }
  448. checkSmsCode()
  449. }
  450. const SMSAuthCancel = () => {
  451. SMSAuthShow.value = false
  452. }
  453. //单个审批
  454. const saveCompleteApprovalTask = async () => {
  455. SMSAuthLoading.value = true
  456. const { error, code, msg, data } = await tasksApi.batchApproval({ taskArchiveDtoList:finalArr.value, projectId:projectId.value, contractId:contractId.value }, false)
  457. //处理数据
  458. SMSAuthLoading.value = false
  459. if (!error && code === 200) {
  460. SMSAuthShow.value = false
  461. showTaskReviewModal.value = false
  462. window?.$message?.success('审批成功')
  463. setTimeout(() => {
  464. window?.location?.reload() //刷新页面
  465. }, 3000)
  466. } else if (code === 400) {
  467. window?.$message?.error(msg)
  468. } else {
  469. window?.$message?.warning('审批异常')
  470. }
  471. }
  472. //批量审批
  473. const batchCompleteApprovalTask = async () => {
  474. SMSAuthLoading.value = true
  475. const { error, code, msg, data } = await tasksApi.batchApproval({ taskArchiveDtoList:finalArr.value, projectId:projectId.value, contractId:contractId.value }, false)
  476. //处理数据
  477. SMSAuthLoading.value = false
  478. if (!error && code === 200) {
  479. SMSAuthShow.value = false
  480. showTaskReviewModal.value = false
  481. window?.$message?.success('审批成功')
  482. setTimeout(() => {
  483. window?.location?.reload() //刷新页面
  484. }, 3000)
  485. } else if (code === 400) {
  486. window?.$message?.error(msg)
  487. } else {
  488. window?.$message?.warning('审批出错')
  489. }
  490. }
  491. //设置重签规则
  492. const showSetSignRulesModal = ref(false)
  493. const setPactVal = ref(true)
  494. const formReport = ref({ date: 1, active: true })
  495. const setSignRulesClick = () => {
  496. showSetSignRulesModal.value = true
  497. }
  498. const dateUpdateValue = (val) => {
  499. formReport.value.date = val
  500. }
  501. </script>
  502. <style lang="scss" scoped>
  503. @import '../../styles/tasks/hc-data.scss';
  504. </style>