hc-data.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. <template>
  2. <div class="hc-layout-box">
  3. <HcTabsSimple :no-drop-shadow="showTaskReviewModal" :cur="sbTableKey" :datas="sbTableData" @tabClick="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. @batchApproval="batchApprovalTaskClick" @rowTaskName="rowTaskName"
  10. @signRules="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. @batchApproval="batchApprovalTaskClick" @rowTaskName="rowTaskName"
  19. @signRules="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. @batchApproval="batchApprovalTaskClick" @rowTaskName="rowTaskName"
  28. @signRules="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="80vw"
  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" hc-btn type="warning" class=" mb-4" @click="BatchClick(true)">
  62. 批量电签
  63. </el-button>
  64. <el-button v-if="sbTableKey === 'key1' && isBatch" 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" @row-click="rowTaskReviewClick" />
  69. </div>
  70. <div v-if="taskReviewType === '2'" class="data-table checkedRowsRef">
  71. <HcTable :column="checkedRowsColumns" :datas="checkedRowsRef" @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:modelValue="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. //任务审核
  250. const rowTaskName = async (row) => {
  251. if (row.id) {
  252. taskReviewInfo.value = row
  253. const { error, code, data } = await tasksApi.queryTaskInfo({
  254. taskIds:row.id,
  255. })
  256. if (!error && code === 200) {
  257. const approvalFileList = getArrValue(data)
  258. taskReviewData.value = approvalFileList
  259. if (approvalFileList.length > 0) {
  260. batchPdfUrl.value = approvalFileList[0].pdfUrl
  261. await queryCurrentUserData()
  262. pdfItem.value.pdfUrl = approvalFileList[0].pdfUrl
  263. }
  264. taskReviewType.value = '1'
  265. showTaskReviewModal.value = true
  266. isBatch.value = false
  267. } else {
  268. taskReviewData.value = []
  269. batchPdfUrl.value = ''
  270. }
  271. } else {
  272. taskReviewInfo.value = {}
  273. taskReviewData.value = []
  274. batchPdfUrl.value = ''
  275. window?.$message?.warning('此数据异常')
  276. }
  277. }
  278. //批量审批
  279. const checkedRowsColumns = ref([
  280. { key: 'taskName', name: '任务名称' },
  281. ])
  282. const checkedRowsRef = ref([])
  283. const taskId = ref([])
  284. const batchApprovalTaskClick = (rows) => {
  285. taskReviewType.value = '2'
  286. showTaskReviewModal.value = true
  287. isBatch.value = false
  288. checkedRowsRef.value = rows
  289. let taskids = []
  290. rows.forEach((item) => {
  291. taskids.push(item.id)
  292. })
  293. taskids = taskids.join()
  294. queryTaskInfo(rows[0], taskids)
  295. }
  296. //行被点击
  297. const rowTaskReviewClick = async ({ row }) => {
  298. console.log(row, 'rpw')
  299. const type = taskReviewType.value
  300. if (type === '1') {
  301. batchPdfUrl.value = row.pdfUrl
  302. } else if (row['hc_batchPdfUrl']) {
  303. batchPdfUrl.value = row['hc_batchPdfUrl']
  304. } else {
  305. queryTaskInfo(row)
  306. }
  307. pdfDataClick(row, row.id)
  308. }
  309. //默认点击
  310. //获取PDF数据
  311. const queryTaskInfo = async (row, taskids) => {
  312. taskId.value = taskids && taskids.length > 0 ? taskids : row['id']
  313. const { error, code, data } = await tasksApi.queryTaskInfo({
  314. taskIds: taskids && taskids.length > 0 ? taskids : row['id'],
  315. })
  316. //处理数据
  317. if (!error && code === 200) {
  318. const alldata = getArrValue(data)
  319. let approvalFileList = alldata
  320. if (approvalFileList.length > 0) {
  321. await queryCurrentUserData()
  322. pdfDataClick(row, row.id)
  323. pdfItem.value.pdfUrl = approvalFileList[0].pdfUrl
  324. batchPdfUrl.value = approvalFileList[0].pdfUrl
  325. row['pdfUrl'] = approvalFileList[0].pdfUrl
  326. } else {
  327. batchPdfUrl.value = ''
  328. row['pdfUrl'] = ''
  329. window?.$message?.warning('PDF获取异常')
  330. }
  331. } else {
  332. batchPdfUrl.value = ''
  333. row['pdfUrl'] = ''
  334. window?.$message?.warning(data.msg || 'PDF异常')
  335. }
  336. }
  337. const finalArr = ref([])
  338. //确认审批
  339. const ConfirmApprovalClick = async () => {
  340. const formData = taskReviewForm.value
  341. let objarr = []
  342. if (taskReviewType.value === '1') {
  343. //单个废除任务
  344. console.log(111111)
  345. console.log( checkedRowsRef.value, ' checkedRowsRef.value')
  346. objarr.push({
  347. taskId:taskReviewInfo.value.id,
  348. comment:formData.comment,
  349. flag:formData.flag,
  350. sealStrategy:signArr.value,
  351. })
  352. console.log(objarr, 'objarr')
  353. finalArr.value = objarr
  354. } else if (taskReviewType.value === '2') {
  355. //上报任务
  356. if (formData.flag === 'NO' && !formData.comment) {
  357. window?.$message?.warning('请先输入审核意见')
  358. } else {
  359. formData.taskId = taskId.value
  360. console.log(checkedRowsRef.value, 'checkedRowsRef.value')
  361. checkedRowsRef.value.forEach((ele)=>{
  362. objarr.push({
  363. taskId:ele.id,
  364. comment:formData.comment,
  365. flag:formData.flag,
  366. sealStrategy:ele.hcSignImageArr,
  367. })
  368. })
  369. console.log(objarr, 'objarr')
  370. finalArr.value = objarr
  371. }
  372. }
  373. SMSAuthLoading.value = true
  374. // const { error, code, msg, data } = await tasksApi.batchApproval({}, false)
  375. //判断数据
  376. SMSAuthLoading.value = false
  377. const ShowAuth = isCheckSmsCodeTime()
  378. SMSAuthShow.value = ShowAuth
  379. //免短信验证
  380. if (!ShowAuth) {
  381. SMSAuthConfirm()
  382. }
  383. }
  384. //短信验证有效期
  385. const smsCodeTime = ref('')
  386. const checkSmsCode = async () => {
  387. const { error, code, data } = await tasksApi.checkSmsCode()
  388. //处理数据
  389. if (!error && code === 200) {
  390. smsCodeTime.value = isString(data) ? data : ''
  391. } else {
  392. smsCodeTime.value = ''
  393. }
  394. }
  395. //验证短信有效期
  396. const isCheckSmsCodeTime = () => {
  397. const smsTime = smsCodeTime.value
  398. if (!smsTime) {
  399. return true
  400. } else {
  401. const toDayTime = dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss')
  402. return dayjs(smsTime).isBefore(toDayTime)
  403. }
  404. }
  405. //短信验证
  406. const SMSAuthLoading = ref(false)
  407. const SMSAuthShow = ref(false)
  408. const SMSAuthConfirm = () => {
  409. const type = taskReviewType.value
  410. if (type === '1') {
  411. saveCompleteApprovalTask()
  412. } else {
  413. batchCompleteApprovalTask()
  414. }
  415. checkSmsCode()
  416. }
  417. const SMSAuthCancel = () => {
  418. SMSAuthShow.value = false
  419. }
  420. //单个审批
  421. const saveCompleteApprovalTask = async () => {
  422. SMSAuthLoading.value = true
  423. const { error, code, msg, data } = await tasksApi.batchApproval({ taskArchiveDtoList:finalArr.value }, false)
  424. //处理数据
  425. SMSAuthLoading.value = false
  426. if (!error && code === 200) {
  427. SMSAuthShow.value = false
  428. showTaskReviewModal.value = false
  429. window?.$message?.success('审批成功')
  430. setTimeout(() => {
  431. window?.location?.reload() //刷新页面
  432. }, 3000)
  433. } else if (code === 400) {
  434. window?.$message?.error(msg)
  435. } else {
  436. window?.$message?.warning('审批异常')
  437. }
  438. }
  439. //批量审批
  440. const batchCompleteApprovalTask = async () => {
  441. SMSAuthLoading.value = true
  442. const { error, code, msg, data } = await tasksApi.batchApproval({ taskArchiveDtoList:finalArr.value }, false)
  443. //处理数据
  444. SMSAuthLoading.value = false
  445. if (!error && code === 200) {
  446. SMSAuthShow.value = false
  447. showTaskReviewModal.value = false
  448. window?.$message?.success('审批成功')
  449. setTimeout(() => {
  450. window?.location?.reload() //刷新页面
  451. }, 3000)
  452. } else if (code === 400) {
  453. window?.$message?.error(msg)
  454. } else {
  455. window?.$message?.warning('审批出错')
  456. }
  457. }
  458. //设置重签规则
  459. const showSetSignRulesModal = ref(false)
  460. const setPactVal = ref(true)
  461. const formReport = ref({ date: 1, active: true })
  462. const setSignRulesClick = () => {
  463. showSetSignRulesModal.value = true
  464. }
  465. const dateUpdateValue = (val) => {
  466. formReport.value.date = val
  467. }
  468. </script>
  469. <style lang="scss" scoped>
  470. @import '../../styles/tasks/hc-data.scss';
  471. </style>