hrp-ui-base 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/dist/components.cjs +1 -1
  2. package/dist/components.es.js +4 -4
  3. package/dist/index.cjs +1 -1
  4. package/dist/index.es.js +83 -67
  5. package/dist/style.css +1 -1
  6. package/package.json +15 -4
  7. package/packages/approval-process/.eslintrc +7 -0
  8. package/packages/approval-process/README.md +130 -0
  9. package/packages/approval-process/index.ts +65 -0
  10. package/packages/approval-process/package.json +17 -0
  11. package/packages/approval-process/packages/components/choose-member/BO/departBo.ts +8 -0
  12. package/packages/approval-process/packages/components/choose-member/BO/memberBo.ts +14 -0
  13. package/packages/approval-process/packages/components/choose-member/BO/role.svg +1 -0
  14. package/packages/approval-process/packages/components/choose-member/BO/roleBo.ts +16 -0
  15. package/packages/approval-process/packages/components/choose-member/index.vue +497 -0
  16. package/packages/approval-process/packages/components/choose-member/styles/common.scss +134 -0
  17. package/packages/approval-process/packages/components/comment/assets/avatar.svg +1 -0
  18. package/packages/approval-process/packages/components/comment/assets/download.svg +4 -0
  19. package/packages/approval-process/packages/components/comment/assets/mp3.svg +11 -0
  20. package/packages/approval-process/packages/components/comment/assets/mp4.svg +11 -0
  21. package/packages/approval-process/packages/components/comment/assets/other.svg +11 -0
  22. package/packages/approval-process/packages/components/comment/assets/pdf.svg +11 -0
  23. package/packages/approval-process/packages/components/comment/assets/ppt.svg +11 -0
  24. package/packages/approval-process/packages/components/comment/assets/preview.svg +4 -0
  25. package/packages/approval-process/packages/components/comment/assets/remove.png +0 -0
  26. package/packages/approval-process/packages/components/comment/assets/word.svg +11 -0
  27. package/packages/approval-process/packages/components/comment/assets/xls.svg +11 -0
  28. package/packages/approval-process/packages/components/comment/index.vue +843 -0
  29. package/packages/approval-process/packages/components/comment/modules/previewMp.vue +54 -0
  30. package/packages/approval-process/packages/components/comment/styles/comment-style.scss +304 -0
  31. package/packages/approval-process/packages/components/image-cropper/index.vue +202 -0
  32. package/packages/approval-process/packages/components/sign/index.vue +766 -0
  33. package/packages/approval-process/packages/components/sign/modules/full-screen-sign.vue +20 -0
  34. package/packages/approval-process/packages/components/urge-dialog/index.vue +121 -0
  35. package/packages/approval-process/packages/components/vue-esign/index.vue +289 -0
  36. package/packages/approval-process/packages/flow/approve-component/approve-success.vue +82 -0
  37. package/packages/approval-process/packages/flow/approve-component/route-params-error.vue +49 -0
  38. package/packages/approval-process/packages/flow/approve-component/submit-success.vue +59 -0
  39. package/packages/approval-process/packages/flow/examine-approve-itr.vue +978 -0
  40. package/packages/approval-process/packages/flow/examine-approve.vue +1065 -0
  41. package/packages/approval-process/packages/flow/form-component/associated-approval-form/README.md +38 -0
  42. package/packages/approval-process/packages/flow/form-component/associated-approval-form/assets/avatar.svg +1 -0
  43. package/packages/approval-process/packages/flow/form-component/associated-approval-form/index.vue +159 -0
  44. package/packages/approval-process/packages/flow/form-component/associated-approval-form/modules/associated-approval-form-mobile.vue +297 -0
  45. package/packages/approval-process/packages/flow/form-component/associated-approval-form/modules/associated-approval-form-pc.vue +314 -0
  46. package/packages/approval-process/packages/flow/form-component/associated-approval-form/style/curd-area-mobile.scss +110 -0
  47. package/packages/approval-process/packages/flow/form-component/associated-approval-form/style/curd-area.scss +96 -0
  48. package/packages/approval-process/packages/flow/form-component/associated-approval-form/style/out-put.scss +48 -0
  49. package/packages/approval-process/packages/flow/form-component/show-sign.vue +27 -0
  50. package/packages/approval-process/packages/flow/styles/common.scss +134 -0
  51. package/packages/approval-process/packages/flow/styles/examine-approve-pc.scss +465 -0
  52. package/packages/approval-process/packages/flow/styles/examine-approve-phone.scss +293 -0
  53. package/packages/approval-process/packages/flow/styles/submit-approve-pc.scss +379 -0
  54. package/packages/approval-process/packages/flow/styles/submit-approve-phone.scss +337 -0
  55. package/packages/approval-process/packages/flow/submit-approve-itr.vue +623 -0
  56. package/packages/approval-process/packages/flow/submit-approve.vue +628 -0
  57. package/packages/approval-process/packages/flow/systemCom/BO/departBo.ts +8 -0
  58. package/packages/approval-process/packages/flow/systemCom/BO/memberBo.ts +14 -0
  59. package/packages/approval-process/packages/flow/systemCom/BO/role.svg +1 -0
  60. package/packages/approval-process/packages/flow/systemCom/BO/roleBo.ts +16 -0
  61. package/packages/approval-process/packages/flow/systemCom/choose-depart.vue +399 -0
  62. package/packages/approval-process/packages/flow/systemCom/choose-member-phone.vue +515 -0
  63. package/packages/approval-process/packages/flow/systemCom/choose-member.vue +565 -0
  64. package/packages/approval-process/packages/flow/systemCom/choose-role.vue +301 -0
  65. package/packages/approval-process/packages/styles/common.scss +134 -0
  66. package/packages/approval-process/packages/styles/flex-common.scss +118 -0
  67. package/packages/approval-process/packages/styles/flexCommon.scss +73 -0
  68. package/packages/approval-process/packages/styles/main.css +216 -0
  69. package/packages/approval-process/packages/styles/router-page.scss +371 -0
  70. package/packages/approval-process/packages/styles/style-set.ts +207 -0
  71. package/packages/approval-process/packages/types.d.ts +4 -0
  72. package/packages/approval-process/packages/utils/base.ts +15 -0
  73. package/packages/approval-process/packages/utils/crypto.ts +67 -0
  74. package/packages/approval-process/packages/utils/ddUtils.ts +56 -0
  75. package/packages/approval-process/packages/utils/debounce.ts +36 -0
  76. package/packages/approval-process/packages/utils/des.js +1107 -0
  77. package/packages/approval-process/packages/utils/download.ts +38 -0
  78. package/packages/approval-process/packages/utils/editor.ts +37 -0
  79. package/packages/approval-process/packages/utils/getEnv.ts +36 -0
  80. package/packages/approval-process/packages/utils/os.ts +20 -0
  81. package/packages/approval-process/packages/utils/path-util.ts +31 -0
  82. package/packages/approval-process/packages/utils/routerUtil.ts +304 -0
  83. package/packages/approval-process/packages/utils/string-utils.ts +13 -0
  84. package/packages/approval-process/packages/utils/throttle.ts +44 -0
  85. package/packages/approval-process/packages/utils/validate.ts +92 -0
  86. package/packages/approval-process/packages/utils/ws.ts +218 -0
  87. package/packages/approval-process/tsconfig.json +72 -0
  88. package/packages/approval-process/vite.config.ts +56 -0
  89. package/src/api/bms/flow/FlowCommentController.ts +50 -0
  90. package/src/api/bms/flow/FlowInstanceController.ts +167 -0
  91. package/src/api/bms/flow/FlowProcessController.ts +55 -0
  92. package/src/api/bms/flow/FlowSheetController.ts +27 -0
  93. package/src/api/bms/flow/FlowSignController.ts +76 -0
  94. package/src/api/bms/flow/bo/AssociatedApprovalBO.ts +15 -0
  95. package/src/api/bms/flow/bo/AssociatedApprovalVO.ts +35 -0
  96. package/src/api/bms/flow/bo/AuditBaseInfo.ts +39 -0
  97. package/src/api/bms/flow/bo/ButtonVo.ts +7 -0
  98. package/src/api/bms/flow/bo/DingCallbackBo.ts +13 -0
  99. package/src/api/bms/flow/bo/FlowCommentBO.ts +12 -0
  100. package/src/api/bms/flow/bo/FlowCommentVO.ts +23 -0
  101. package/src/api/bms/flow/bo/FlowInstanceBO.ts +14 -0
  102. package/src/api/bms/flow/bo/FlowNodeVO.ts +24 -0
  103. package/src/api/bms/flow/bo/FlowNoticeBO.ts +17 -0
  104. package/src/api/bms/flow/bo/FlowProcessBO.ts +13 -0
  105. package/src/api/bms/flow/bo/FlowProcessVO.ts +9 -0
  106. package/src/api/bms/flow/bo/FlowReplyVO.ts +23 -0
  107. package/src/api/bms/flow/bo/FlowSheetVO.ts +16 -0
  108. package/src/api/bms/flow/bo/InstanceBackBO.ts +9 -0
  109. package/src/api/bms/flow/bo/InstanceNodeBO.ts +13 -0
  110. package/src/api/bms/flow/bo/InstanceNodeVO.ts +21 -0
  111. package/src/api/bms/flow/bo/NodeShowVo.ts +19 -0
  112. package/src/api/bms/flow/bo/ReviewBO.ts +11 -0
  113. package/src/api/bms/flow/bo/SheetSearchBO.ts +11 -0
  114. package/src/api/bms/flow/bo/SystemVO.ts +7 -0
  115. package/src/api/bms/flow/bo/TransmitBO.ts +9 -0
  116. package/src/api/bms/flow/bo/UrgeFlowBO.ts +7 -0
  117. package/src/api/bms/flow/bo/UserBaseInfoVo.ts +13 -0
  118. package/src/api/bms/flow/bo/UserInfoVo.ts +44 -0
  119. package/src/api/bms/flow/bo/UserResultVo.ts +17 -0
  120. package/src/api/bms/flow/bo/ValueMapBo.ts +7 -0
  121. package/src/api/bms/home/HomeController.ts +106 -0
  122. package/src/api/bms/home/bo/CollectedMenuBo.ts +9 -0
  123. package/src/api/bms/home/bo/DeptBaseVo.ts +9 -0
  124. package/src/api/bms/home/bo/DomainVO.ts +13 -0
  125. package/src/api/bms/home/bo/FunPermission.ts +17 -0
  126. package/src/api/bms/home/bo/GroupVO.ts +10 -0
  127. package/src/api/bms/home/bo/HomeMenu.ts +22 -0
  128. package/src/api/bms/home/bo/HomeMenuVo.ts +11 -0
  129. package/src/api/bms/home/bo/PersonalizationBo.ts +17 -0
  130. package/src/api/bms/home/bo/PersonalizationVo.ts +19 -0
  131. package/src/api/bms/home/bo/PhoneMenu.ts +14 -0
  132. package/src/api/bms/home/bo/SearchMenuVo.ts +10 -0
  133. package/src/api/bms/home/bo/UserBaseInfoVo.ts +11 -0
  134. package/src/api/hrms/dept/bo/DeptBaseVo.ts +6 -0
  135. package/src/api/hrms/dept/bo/DeptTreeVo.ts +23 -0
  136. package/src/api/hrms/dept/bo/DeptUserVo.ts +9 -0
  137. package/src/api/hrms/dept/bo/DeptUsersVo.ts +10 -0
  138. package/src/api/hrms/dept/bo/DeptVo.ts +19 -0
  139. package/src/api/hrms/dept/bo/UserBaseInfoVo.ts +8 -0
  140. package/src/api/hrms/dept/deptController.ts +100 -0
  141. package/src/api/hrms/role/bo/RoleBaseVo.ts +6 -0
  142. package/src/api/hrms/role/bo/RoleGroupVo.ts +11 -0
  143. package/src/api/hrms/role/bo/RoleVo.ts +22 -0
  144. package/src/api/hrms/role/roleController.ts +19 -0
  145. package/src/api/hrms/user/bo/UserBaseInfoVo.ts +11 -0
  146. package/src/api/hrms/user/bo/UserCardVO.ts +14 -0
  147. package/src/api/hrms/user/bo/UserDeptBO.ts +13 -0
  148. package/src/api/hrms/user/bo/UserRoleBO.ts +11 -0
  149. package/src/api/hrms/user/bo/UserVO.ts +23 -0
  150. package/src/api/hrms/user/userController.ts +86 -0
  151. package/src/api/work-order-pc/flow/Bo/ValueMapBo.ts +7 -0
  152. package/src/api/work-order-pc/flow/ItrFlowProcessController.ts +42 -0
  153. package/src/api/work-order-pc/flow/Vo/FlowNodeVO.ts +24 -0
  154. package/src/api/work-order-pc/flow/Vo/UserInfoVo.ts +44 -0
  155. package/src/assets/process/agree.png +0 -0
  156. package/src/assets/process/defaultAvatar.png +0 -0
  157. package/src/assets/process/drawer/departManagerJump.png +0 -0
  158. package/src/assets/process/drawer/manyLevel1close.svg +10 -0
  159. package/src/assets/process/drawer/manyLevel1open.svg +7 -0
  160. package/src/assets/process/drawer/manyLevel2close.svg +7 -0
  161. package/src/assets/process/drawer/manyLevel2open.svg +7 -0
  162. package/src/assets/process/inProcess.png +0 -0
  163. package/src/assets/process/manyPeople.png +0 -0
  164. package/src/assets/process/manyPeople2.png +0 -0
  165. package/src/assets/process/reject.png +0 -0
  166. package/src/assets/process/revoke.png +0 -0
  167. package/src/components/annex-img-upload/index.vue +4 -4
  168. package/src/components/annex-img-upload/modules/previewMp.vue +1 -1
  169. package/src/components/annex-upload/index.vue +4 -4
  170. package/src/components/annex-upload/modules/previewMp.vue +1 -1
  171. package/src/components/annex-upload-weijian/index.vue +4 -4
  172. package/src/components/annex-upload-weijian/modules/previewMp.vue +1 -1
  173. package/src/components/list-search-content/components/search-date-range.vue +1 -1
  174. package/src/components/list-search-content/components/search-date-time-range.vue +1 -1
  175. package/src/components/list-search-content/components/search-date.vue +1 -1
  176. package/src/components/list-search-content/components/search-input-number.vue +1 -1
  177. package/src/components/list-search-content/components/search-input.vue +1 -1
  178. package/src/components/list-search-content/components/search-multiple_select.vue +1 -1
  179. package/src/components/list-search-content/components/search-select.vue +1 -1
  180. package/src/components/list-search-content/index.vue +6 -6
  181. package/src/components/list-search-content/modules/add-views-package-dialog.vue +3 -3
  182. package/src/components/list-search-content/modules/search-condition-area.vue +2 -2
  183. package/src/components/list-search-content/modules/views-package-manage-dialog.vue +5 -5
  184. package/src/index.ts +1 -0
  185. package/src/utils/dd-utils.ts +1 -1
  186. package/src/utils/get-dict.ts +2 -2
  187. package/src/utils/permit-utils.ts +2 -2
  188. package/src/api/bms/dict/bo/TotalDictSearchBO.ts +0 -8
  189. package/src/api/bms/file/FileExportController.ts +0 -18
  190. package/src/api/bms/file/bo/FileExportVO.ts +0 -17
@@ -0,0 +1,1065 @@
1
+ <!-- 审批页面 适配移动端并且要有插槽,同时对插槽的数据可以进行读取 -->
2
+ <template>
3
+ <div class="examine-big-box">
4
+ <div class="page-box" v-if="!haveSubmit">
5
+ <!-- 顶部标题状态id部门等信息 -->
6
+ <div class="page-inner-box"
7
+ :style="(((buttonList && Array.isArray(buttonList) && buttonList.length > 0) || formBaseInfo.ifUrging) ? { height: 'calc(100% - 80px)' } : { height: '100%' })">
8
+ <div class="inner-page-top-box" v-if="props.taskId && props.taskId !== 'importData'">
9
+ <div class="inner-page-top-dept-top flex-row-start-center">
10
+ <el-icon style="font-size: 16px;cursor: pointer;" @click="backList">
11
+ <ArrowLeft />
12
+ </el-icon>
13
+ <div class="submit-back" @click="backList">返回</div>
14
+ <div class="inner-page-divide"></div>
15
+ <div class="inner-page-top-dept-title">{{ props.formTitle ? props.formTitle : '审批单' }}
16
+ </div>
17
+ </div>
18
+ <div class="inner-page-top-header-box flex-column-start">
19
+ <!-- 头像以及标题部分 -->
20
+ <div class="top-header-name-left flex-row-start-center">
21
+ <img :src="formBaseInfo.formUserAvatar" alt="头像" v-if="formBaseInfo.formUserAvatar">
22
+ <img src="hrp-ui-base/assets/process/defaultAvatar.png" alt="" v-else>
23
+ <div class="top-header-name-left-name">{{ formBaseInfo.formUser }}提交的{{ props.formTitle ? props.formTitle
24
+ : '' }}</div>
25
+ </div>
26
+ <div class="header-status-box flex-row-start">
27
+
28
+ <div class="flex-column-start header-statu-item">
29
+ <div class="header-item-name">当前状态</div>
30
+ <div class="header-item-button-value" :style="formBaseInfo.nodeStatus == '审批中' || formBaseInfo.nodeStatus == '已被拒'
31
+ ?
32
+ {
33
+ 'background-color': 'rgba(255, 146, 0, .12)',
34
+ 'color': '#ff9200'
35
+ } : {
36
+ 'background-color': 'rgba(0,176,66,.12)',
37
+ 'color': '#00b042'
38
+ }">{{ formBaseInfo.nodeStatus }}</div>
39
+ </div>
40
+
41
+ <div class="flex-column-start header-statu-item">
42
+ <div class="header-item-name">发起人</div>
43
+ <el-tooltip effect="dark" :content="formBaseInfo.formUser" placement="left">
44
+ <div class="header-item-value "> {{ formBaseInfo.formUser + (formBaseInfo.agentUserName ? '(由' +
45
+ formBaseInfo.agentUserName + '代提交)' : '') }}</div>
46
+ </el-tooltip>
47
+ </div>
48
+
49
+ <div class="flex-column-start header-statu-item">
50
+ <div class="header-item-name">表单id</div>
51
+
52
+ <el-tooltip effect="dark" :content="props.formId" placement="left">
53
+ <div class="header-item-value ">{{ props.formId }}</div>
54
+ </el-tooltip>
55
+
56
+ </div>
57
+ <!-- 单据打印 -->
58
+ <div style="position: absolute;right: 0;top: 0;"
59
+ v-if="props.showPrint && formBaseInfo.nodeStatus === '已通过'">
60
+ <el-button type="primary" @click="openOrderPrint" icon="Printer">单据打印</el-button>
61
+ </div>
62
+ </div>
63
+ </div>
64
+ </div>
65
+ <div class="inner-page-box">
66
+ <!-- 中部表单盒子 -->
67
+ <div class="inner-page-item">
68
+ <div class="formBox">
69
+ <slot></slot>
70
+ </div>
71
+ </div>
72
+ <!-- 审批流盒子 -->
73
+ <div class="process-box" v-if="props.taskId && props.taskId !== 'importData'">
74
+ <div class="inner-page-item-header" @click="ceshiactive">审批进度</div>
75
+ <div class="processBox">
76
+ <el-timeline>
77
+ <el-timeline-item v-for="(item, index) in activities" :key="index"
78
+ :type="item.nodeStatus ? 'primary' : 'info'" size="large">
79
+ <div class="timeLineTtem flexRowStart" style="flex-wrap: nowrap;">
80
+ <div style="min-width:40px;width:40px;min-height:40px;height:40px;margin-right: 12px;">
81
+ <img :src="item.userList[0].avatar" alt="头像"
82
+ v-if="item.userList && Array.isArray(item.userList) && item.userList.length == 1 && item.userList[0].avatar">
83
+ <img src="hrp-ui-base/assets/process/defaultAvatar.png" alt="头像"
84
+ v-else-if="item.userList && Array.isArray(item.userList) && item.userList.length == 1 && !item.userList[0].avatar">
85
+ <div class="flexRowAroundWrap imgbox" v-else>
86
+ <img src="hrp-ui-base/assets/process/manyPeople2.png" alt="头像"
87
+ style="margin-right: 0;width: 35px;height: 25px;" />
88
+ </div>
89
+ </div>
90
+
91
+ <div class="flexColumnStart porcessTime">
92
+ <div class="flexRowStart">
93
+ <div class="porcessTimeNodeNameBig">{{ item.nodeName }}</div>
94
+ <!-- 节点状态 节点长度为1时 -->
95
+ <div class="porcessTimeNodeName"
96
+ v-if="item.userList && Array.isArray(item.userList) && item.userList.length == 1"
97
+ :style="item.userList[0].result == '同意' ? { color: '#66bc5c', 'font-weight': 600 } : { color: '#9b9b9b' }">
98
+ {{ item.userList[0].result ? item.userList[0].result : '待处理' }}
99
+ </div>
100
+ <!-- 节点状态 节点长度>1时 -->
101
+ <div class="porcessTimeNodeName"
102
+ v-if="item.userList && Array.isArray(item.userList) && item.userList.length > 1"
103
+ :style="item.nodeStatus == '已完成' ? { color: '#66bc5c', 'font-weight': 600 } : { color: '#9b9b9b' }">
104
+ {{ item.nodeStatus ? item.nodeStatus : '待处理' }}
105
+ </div>
106
+ </div>
107
+ <div class="flexRowStart " style="width:100%">
108
+ <!-- 审批人的名字 或 N位审批人 -->
109
+ <div class="porcessTimeName flexRowStart" style="width: max-content;">
110
+ {{
111
+ item.userList && Array.isArray(item.userList) &&
112
+ item.userList.length > 1 ? item.userList.length + '位' + (item.nodeType ==
113
+ 'Approver' ? '审批人' : item.nodeType == 'Ccto' ? '抄送人' : item.nodeType ==
114
+ 'Executor' ? '执行人' : '') : item.userList && Array.isArray(item.userList) &&
115
+ item.userList.length > 0 ?
116
+ item.userList[0].userName :
117
+ ''
118
+ }}
119
+ </div>
120
+ <div class="porcessTimeNodeStatus" :style="{ color: '#ff9200' }"
121
+ v-if="item.userList && item.userList.length > 1 && item.multipleAuditType && (item.nodeType == 'Approver' || item.nodeType == 'Executor')">
122
+ {{
123
+ '(' + item.multipleAuditType + ')' }}</div>
124
+ </div>
125
+ <!-- 当节点长度>1 时的 审批处理时间 -->
126
+ <div class="porcessTimeTime" v-if="!(item.userList && item.userList.length > 1) && item.nodeTime">
127
+ {{ item.nodeTime }}</div>
128
+
129
+
130
+ <!-- 节点状态 节点长度为0时 无审批处理人 -->
131
+ <div class="porcessTimeNodeName"
132
+ v-if="(!item.userList) || (item.userList && Array.isArray(item.userList) && item.userList.length == 0)">
133
+ {{ "当前节点暂无处理人" }}
134
+ </div>
135
+
136
+ <div class="porcessTimeNodeName"
137
+ v-if="item.userList && Array.isArray(item.userList) && item.userList.length == 1 && item.userList[0].comments">
138
+ {{
139
+ item.userList[0].comments ? '审批意见:' + item.userList[0].comments : '审批意见:-' }}</div>
140
+ <div class="porcessTimeNodeName"
141
+ v-if="item.userList && Array.isArray(item.userList) && item.userList.length == 1 && item.userList[0].operation"
142
+ style="color:red">
143
+ {{
144
+ item.userList[0].operation ? item.userList[0].operation : '-' }}</div>
145
+ <ShowSign :src="item.userList[0].signatureUrl" :preview-src-list="[item.userList[0].signatureUrl]"
146
+ fit="contain"
147
+ v-if="item.userList && Array.isArray(item.userList) && item.userList.length == 1 && item.userList[0].signatureUrl">
148
+ </ShowSign>
149
+
150
+ <!-- 子节点 -->
151
+ <div class="sonItemBox flexColumnStart"
152
+ v-if="item.userList && Array.isArray(item.userList) && item.userList.length > 1">
153
+ <div class="sonItem flexRowStart" v-for="(sonItem, sonIndex) in item.userList" :key="sonIndex"
154
+ style="flex-wrap: nowarp;width: 100%;">
155
+ <div>
156
+ <img :src="sonItem.avatar" alt="头像" v-if="sonItem.avatar">
157
+ <img src="hrp-ui-base/assets/process/defaultAvatar.png" alt="头像" v-else>
158
+ </div>
159
+ <div class="flexColumnStart porcessTime">
160
+ <div class="flexRowStartCenter">
161
+ <div class="porcessTimeName flexRowStart" style="width:max-content;margin-right: 8px;">{{
162
+ sonItem.userName }}</div>
163
+ <div class="porcessTimeNodeName"
164
+ :style="sonItem.result == '同意' ? { color: '#66bc5c' } : sonItem.result == '拒绝' ? { color: '#f89898' } : { color: '#9b9b9b' }">
165
+ {{ sonItem.result ? sonItem.result : '待处理' }}</div>
166
+ </div>
167
+ <div class="porcessTimeTime" v-if="sonItem.submitTime && sonItem.result">{{
168
+ sonItem.submitTime }}
169
+ </div>
170
+
171
+ <div class="porcessTimeNodeName" v-if="sonItem.comments">
172
+ {{ '审批意见:' + sonItem.comments }}</div>
173
+ <div class="porcessTimeNodeName" v-if="sonItem.operation" style="color:red">
174
+ {{ sonItem.operation }}</div>
175
+ <ShowSign :src="sonItem.signatureUrl" :preview-src-list="[sonItem.signatureUrl]"
176
+ fit="contain" v-if="sonItem && sonItem.signatureUrl" style="margin-left: 0;">
177
+ </ShowSign>
178
+ </div>
179
+
180
+ </div>
181
+ </div>
182
+ </div>
183
+ </div>
184
+ </el-timeline-item>
185
+ </el-timeline>
186
+
187
+ </div>
188
+ </div>
189
+ <!-- 评论功能 -->
190
+ <CommentAreaComponent ref="CommentAreaComponentRef" :formId="props.formId" v-show="formBaseInfo.ifComment">
191
+ </CommentAreaComponent>
192
+ <!-- <div style="height:80px" v-if="((formBaseInfo.auditorStatus ||formBaseInfo.ifUrging ) && props.taskId && props.taskId !== 'importData' && !haveSubmit)"></div> -->
193
+ </div>
194
+ </div>
195
+
196
+ <div class="submit-button-box"
197
+ v-if="((formBaseInfo.auditorStatus || formBaseInfo.ifUrging) && props.taskId && props.taskId !== 'importData' && !haveSubmit)">
198
+ <div class="audit-button-agree-refuse-box" style="width:150px">
199
+ <!-- 审批人 -->
200
+ <el-button type="primary" size="default" @click="openDialog('1')"
201
+ v-if="((formBaseInfo.nodeType == 'Approver' || formBaseInfo.nodeType == 'Executor' || formBaseInfo.nodeType == 'Create') && buttonList.some(item => item.buttonType == '同意' || item.buttonType == 'agree'))">{{
202
+ buttonList.find((item: any) => item.buttonType === '同意' || item.buttonType === 'agree')?.buttonShowName
203
+ }}</el-button>
204
+ <el-button size="default" @click="openDialog('2')"
205
+ v-if="formBaseInfo.nodeType == 'Approver' && buttonList.some(item => item.buttonType === '拒绝')">{{
206
+ buttonList.find((item: any) => { return item.buttonType === '拒绝' })?.buttonShowName
207
+ }}</el-button>
208
+ </div>
209
+ <div class="audit-button-left-box">
210
+ <!-- 催办 -->
211
+ <div class="column-button-item" v-if="formBaseInfo.ifUrging" @click="openUrgeDialog">
212
+ <el-icon size="30">
213
+ <Bell />
214
+ </el-icon>
215
+ <span>催办</span>
216
+ </div>
217
+ <!-- 撤销 -->
218
+ <div class="column-button-item" @click="buttonRevoke"
219
+ v-if="buttonList.some(item => item.buttonType === 'revoke')">
220
+ <el-icon size="30">
221
+ <RefreshLeft />
222
+ </el-icon>
223
+ <span>{{buttonList.find((item: any) => {
224
+ return item.buttonType === 'revoke'
225
+ })?.buttonShowName }}</span>
226
+ </div>
227
+ <!-- 转交 -->
228
+ <div class="column-button-item" @click="openDialog('3')"
229
+ v-if="((formBaseInfo.nodeType == 'Approver' || formBaseInfo.nodeType == 'Executor') && buttonList.some(item => item.buttonType === '转交'))">
230
+ <el-icon size="30">
231
+ <Avatar />
232
+ </el-icon>
233
+ <span>{{buttonList.find((item: any) => {
234
+ return item.buttonType === '转交'
235
+ })?.buttonShowName
236
+ }}</span>
237
+ </div>
238
+ <!-- 退回 -->
239
+ <div class="column-button-item" @click="openDialog('4')"
240
+ v-if="((formBaseInfo.nodeType == 'Approver' || formBaseInfo.nodeType == 'Executor') && buttonList.some(item => item.buttonType === '退回'))">
241
+ <el-icon size="30">
242
+ <Back />
243
+ </el-icon>
244
+ <span>{{buttonList.find((item: any) => {
245
+ return item.buttonType === '退回'
246
+ })?.buttonShowName
247
+ }}</span>
248
+ </div>
249
+
250
+
251
+
252
+
253
+ </div>
254
+ </div>
255
+
256
+ </div>
257
+
258
+ <ApproveSuccess v-if="haveSubmit" @next="nextAudit" @backList="backList"></ApproveSuccess>
259
+ <!-- centerDialogVisible -->
260
+ <el-dialog v-model="centerDialogVisible" :width="isPc ? '40%' : '800'" center
261
+ :style="isPc ? { width: '800px' } : { width: '200px' }" :title="'审批'"
262
+ v-if="isPc && currentPageWidth && currentPageWidth >= 800">
263
+ <div class="flexColumnStart processPcAuditCurrentPageBox">
264
+ <div v-if="dialogType == '3'">{{ '转交对象' }}</div>
265
+ <ChooseMember v-model="transmittedObj" :multiple="false" v-if="dialogType == '3'"></ChooseMember>
266
+ <div v-if="dialogType == '4'">{{ '退回节点' }}</div>
267
+ <div v-if="dialogType == '4'">
268
+ <div class="my-2 flex items-center text-sm">
269
+ <el-radio-group v-model="backTaskId" class=" ml-4 flexColumnStart">
270
+ <el-radio :value="item.nodeId" size="default" v-for="(item, index) in finishTaskList" :key="item.nodeId"
271
+ :label="item.nodeId" style="margin-top:8px">
272
+ <div class="flexRowStartCenter">
273
+ <div>{{ item.nodeName ? item.nodeName : "-" }}</div>
274
+ <div v-if="item.userList && Array.isArray(item.userList) && item.userList.length == 1"
275
+ style="width:30px;height: 30px;margin: 0 18px;"><img :src="item.userList[0].avatar"
276
+ style="width:30px;height: 30px;border-radius: 8px;" alt=""></div>
277
+
278
+ <div v-if="item.userList && Array.isArray(item.userList) && item.userList.length > 1"
279
+ style="width:30px;height: 30px;margin:0 18px;"><img src="hrp-ui-base/assets/process/manyPeople2.png"
280
+ style="width: 35px;height: 25px;border-radius: 8px;" alt=""></div>
281
+ <div>{{ getNames(item.userList) }}</div>
282
+ <div v-if="item.userList && Array.isArray(item.userList) && item.userList.length > 1"
283
+ style="margin-left:18px">{{ '多人审批方式:' + item.multipleAuditType }}</div>
284
+ </div>
285
+ </el-radio>
286
+ </el-radio-group>
287
+ </div>
288
+ </div>
289
+ <div>{{ dialogType == '3' ? '转交理由' : dialogType == '4' ? '退回意见' : '审批意见' }}</div>
290
+ <el-input v-model="textarea" type="textarea" placeholder="请输入..." style="width:100%" autosize maxlength="200"
291
+ show-word-limit />
292
+ <div v-if="props.formBaseInfo && props.formBaseInfo.ifSignature">签名:</div>
293
+ <SignConmpent ref="signConmpentRef" v-model="uploadImg" v-if="props.formBaseInfo && props.formBaseInfo.ifSignature"
294
+ @uploadUploadImgId="uploadUploadImgId" :uploadImgId="uploadImgId">
295
+ </SignConmpent>
296
+ <!-- 同意推荐回复区域 -->
297
+ <div class="recommend-reply-section" v-if="dialogType == '1' && agreeRecommendReplyList.length > 0">
298
+ <div class="recommend-reply-title">推荐回复</div>
299
+ <div class="recommend-reply-list">
300
+ <span
301
+ class="recommend-reply-item"
302
+ v-for="(reply, index) in agreeRecommendReplyList"
303
+ :key="index"
304
+ @click="handleRecommendReplyClick(reply)"
305
+ >{{ reply }}</span>
306
+ </div>
307
+ </div>
308
+ <!-- 拒绝推荐回复区域 -->
309
+ <div class="recommend-reply-section" v-if="dialogType == '2' && refuseRecommendReplyList.length > 0">
310
+ <div class="recommend-reply-title">推荐回复</div>
311
+ <div class="recommend-reply-list">
312
+ <span
313
+ class="recommend-reply-item"
314
+ v-for="(reply, index) in refuseRecommendReplyList"
315
+ :key="index"
316
+ @click="handleRecommendReplyClick(reply)"
317
+ >{{ reply }}</span>
318
+ </div>
319
+ </div>
320
+ </div>
321
+ <template #footer>
322
+ <span class="dialog-footer">
323
+ <el-button @click="centerDialogVisible = false">取消</el-button>
324
+ <el-button type="primary" @click="submitResult">
325
+ 确认
326
+ </el-button>
327
+ </span>
328
+ </template>
329
+ </el-dialog>
330
+ <van-popup v-model:show="centerDialogVisible" position="bottom"
331
+ :style="{ height: '80%', padding: '20px', width: '100%' }"
332
+ v-if="!isPc || !currentPageWidth || currentPageWidth < 800">
333
+ <div class="popupBody">
334
+
335
+ <div class="flexColumnStart popupContent">
336
+ <div v-if="dialogType == '3'">{{ '转交对象' }}</div>
337
+ <ChooseMemberPhone v-model="transmittedObj" :multiple="false" v-if="dialogType == '3'" :posBottom="0">
338
+ </ChooseMemberPhone>
339
+ <div v-if="dialogType == '4'">{{ '退回节点' }}</div>
340
+ <div v-if="dialogType == '4'">
341
+ <div class="my-2 flex items-center text-sm">
342
+ <el-radio-group v-model="backTaskId" class=" ml-4 flexColumnStart">
343
+ <el-radio :value="item.nodeId" size="default" v-for="(item, index) in finishTaskList" :key="item.nodeId"
344
+ :label="item.nodeId" style="margin-top:8px">
345
+ <div class="flexRowStartCenter">
346
+ <div>{{ item.nodeType ? item.nodeType == 'Approver' ? '审批人节点' : item.nodeType ==
347
+ 'Executor'
348
+ ?
349
+ '执行人节点' : item.nodeType == 'Ccto' ? '抄送人节点' : item.nodeType == 'Create' ? '再次提交' :
350
+ item.nodeType : '' }}</div>
351
+ <div v-if="item.userList && Array.isArray(item.userList) && item.userList.length == 1"
352
+ style="width:30px;height: 30px;margin: 0 18px;"><img :src="item.userList[0].avatar"
353
+ style="width:30px;height: 30px;border-radius: 8px;" alt=""></div>
354
+
355
+ <div v-if="item.userList && Array.isArray(item.userList) && item.userList.length > 1"
356
+ style="width:30px;height: 30px;margin:0 18px;"><img src="hrp-ui-base/assets/process/manyPeople2.png"
357
+ style="width: 35px;height: 25px;border-radius: 8px;" alt=""></div>
358
+ <div>{{ getNames(item.userList) }}</div>
359
+ <div v-if="item.userList && Array.isArray(item.userList) && item.userList.length > 1"
360
+ style="margin-left:18px">{{ '多人审批方式:' + item.multipleAuditType }}</div>
361
+ </div>
362
+ </el-radio>
363
+ </el-radio-group>
364
+ </div>
365
+ </div>
366
+ <div style="position:sticky;top:0;z-index:10;background:#fff;padding-bottom:8px;width:100%;">
367
+ <div>{{ dialogType == '3' ? '转交理由' : dialogType == '4' ? '退回意见' : '审批意见' }}</div>
368
+ <el-input v-model="textarea" type="textarea" placeholder="请输入..." style="width:100%" autosize maxlength="200"
369
+ show-word-limit />
370
+ </div>
371
+ <div v-if="props.formBaseInfo && props.formBaseInfo.ifSignature">签名:</div>
372
+ <SignConmpent v-model="uploadImg" v-if="props.formBaseInfo && props.formBaseInfo.ifSignature"
373
+ @uploadUploadImgId="uploadUploadImgId" :uploadImgId="uploadImgId">
374
+ </SignConmpent>
375
+ <!-- 同意推荐回复区域 -->
376
+ <div class="recommend-reply-section" v-if="dialogType == '1' && agreeRecommendReplyList.length > 0">
377
+ <div class="recommend-reply-title">推荐回复</div>
378
+ <div style="display:flex;flex-wrap:wrap;gap:8px;max-height:150px;overflow-y:auto;">
379
+ <span
380
+ class="recommend-reply-item"
381
+ v-for="(reply, index) in agreeRecommendReplyList"
382
+ :key="index"
383
+ @click="handleRecommendReplyClick(reply)"
384
+ >{{ reply }}</span>
385
+ </div>
386
+ </div>
387
+ <!-- 拒绝推荐回复区域 -->
388
+ <div class="recommend-reply-section" v-if="dialogType == '2' && refuseRecommendReplyList.length > 0">
389
+ <div class="recommend-reply-title">推荐回复</div>
390
+ <div style="display:flex;flex-wrap:wrap;gap:8px;max-height:150px;overflow-y:auto;">
391
+ <span
392
+ class="recommend-reply-item"
393
+ v-for="(reply, index) in refuseRecommendReplyList"
394
+ :key="index"
395
+ @click="handleRecommendReplyClick(reply)"
396
+ >{{ reply }}</span>
397
+ </div>
398
+ </div>
399
+ <div class="blankBox"></div>
400
+ </div>
401
+ <div class="popupbuttonBox flexRowCenter">
402
+ <el-button @click="centerDialogVisible = false" size="large" style="width:48%">取消</el-button>
403
+ <el-button type="primary" @click="submitResult" size="large" style="width:48%">
404
+ 确认
405
+ </el-button>
406
+ </div>
407
+ </div>
408
+ </van-popup>
409
+ <UrgeDialog ref="UrgeDialogRef" @success="urgeDialogSuccess" :title="formBaseInfo.formUser + '提交的' + (props.formTitle ? props.formTitle
410
+ : '')"></UrgeDialog>
411
+ </div>
412
+ </template>
413
+ <script lang="ts" setup>
414
+ import { onMounted, ref, watch, onActivated, PropType } from "vue";
415
+ import { MoreFilled } from '@element-plus/icons-vue'
416
+ import { ElLoading, ElMessage } from "element-plus";
417
+ import { IsPhone } from '../utils/getEnv'
418
+ import ApproveSuccess from "./approve-component/approve-success.vue"
419
+ import _ from "lodash"
420
+ // import RouteParamsError from "./approve-component/route-params-error.vue"
421
+ import SignConmpent from "../components/sign/index.vue"
422
+ import ShowSign from './form-component/show-sign.vue'
423
+ import ChooseMember from './systemCom/choose-member.vue'
424
+ import ChooseMemberPhone from './systemCom/choose-member-phone.vue'
425
+ import UrgeDialog from "../components/urge-dialog/index.vue"
426
+ // import { StorageEnum } from "../enum/system/StorageEnum";
427
+ import throttle from "../utils/throttle";
428
+ // import { getUploadFileMsg } from '../utils/base'
429
+ import CommentAreaComponent from "../components/comment/index.vue"
430
+ /** controller 以及 bo */
431
+ import FlowInstanceController from "hrp-ui-base/api/bms/flow/FlowInstanceController";
432
+ // bo
433
+ import NodeShowVo from "hrp-ui-base/api/bms/flow/bo/NodeShowVo";
434
+ import ReviewBO from "hrp-ui-base/api/bms/flow/bo/ReviewBO";
435
+ import TransmitBO from "hrp-ui-base/api/bms/flow/bo/TransmitBO";
436
+ import InstanceBackBO from "hrp-ui-base/api/bms/flow/bo/InstanceBackBO";
437
+ import AuditBaseInfo from "hrp-ui-base/api/bms/flow/bo/AuditBaseInfo";
438
+ import UserBaseInfoVo from "hrp-ui-base/api/bms/flow/bo/UserBaseInfoVo";
439
+ import FlowSignController from "hrp-ui-base/api/bms/flow/FlowSignController";
440
+
441
+ const props = defineProps({
442
+ // 流程节点信息
443
+ 'activities': {
444
+ type: Array as PropType<any>,
445
+ required: false,
446
+ default: () => { return {} }
447
+ },
448
+ // 节点任务id
449
+ 'taskId': {
450
+ type: String,
451
+ required: false,
452
+ default: ''
453
+ },
454
+ // 表单id
455
+ 'formId': {
456
+ type: String,
457
+ required: true,
458
+ default: ''
459
+ },
460
+ // 表单内展示的基础信息
461
+ 'formBaseInfo': {
462
+ type: Object as PropType<AuditBaseInfo>,
463
+ required: false,
464
+ default: () => { return {} }
465
+ },
466
+ // 表单提交的原始数据
467
+ 'oldRuleForm': {
468
+ type: Object as PropType<any>,
469
+ required: false,
470
+ default: () => { return {} }
471
+ },
472
+ // 表单提交的最新数据
473
+ 'ruleForm': {
474
+ type: Object as PropType<any>,
475
+ required: false,
476
+ default: () => { return {} }
477
+ },
478
+ // 当前页面是否经过了表单校验可以提交
479
+ 'canSubmit': {
480
+ type: Boolean,
481
+ required: true,
482
+ default: false
483
+ },
484
+ // 当前的表单的标题
485
+ 'formTitle': {
486
+ type: String,
487
+ required: false,
488
+ default: ''
489
+ },
490
+ // 当前是否可以编辑
491
+ 'canEdit': {
492
+ type: Boolean,
493
+ required: true,
494
+ default: false
495
+ },
496
+ // 提交的审批节点列表信息
497
+ 'submitProcess': {
498
+ type: Function as PropType<() => Promise<any>>,
499
+ required: true,
500
+ default: () => { }
501
+ },
502
+ // 返回跳转的列表地址
503
+ "listPath": {
504
+ type: String,
505
+ required: false,
506
+ default: ''
507
+ },
508
+ //是否展示单据打印按钮
509
+ "showPrint": {
510
+ type: Boolean,
511
+ required: false,
512
+ default: false
513
+ },
514
+ // 自定义撤销方法,传入后撤销按钮将调用该方法而非默认的流程撤销
515
+ "customRevoke": {
516
+ type: Function as PropType<() => void>,
517
+ required: false,
518
+ default: null
519
+ }
520
+
521
+ })
522
+
523
+ // validateForm 校验表单的回调 backList 返回列表的方法 nextAudit 跳转下一条的回调
524
+ const emits = defineEmits(['validateForm', 'backList', 'nextAudit', 'openOrderPrint'])
525
+ const nextAudit = (data: any) => {
526
+ emits('nextAudit', data)
527
+ }
528
+
529
+
530
+ const buttonList = ref<{ buttonShowName: string; buttonType: string }[]>([])
531
+ const haveSubmit = ref(false)
532
+ const formBaseInfo = ref<AuditBaseInfo>(new AuditBaseInfo())
533
+ let isPc = !IsPhone()
534
+ // const token111 = localStorage.getItem(StorageEnum.登录鉴权)
535
+ const currentPageWidth = ref<number>()
536
+ const activeName = ref('评论')
537
+ // 1 同意弹窗 2 拒绝弹窗 3 转交弹窗 4 退回弹窗 5加签弹窗
538
+ const dialogType = ref('1')
539
+ const centerDialogVisible = ref(false)
540
+ const textarea = ref('')
541
+ const uploadImg = ref<string>('')
542
+ const uploadImgId = ref<string>('')
543
+ const uploadUploadImgId = (str: string) => {
544
+ uploadImgId.value = str
545
+ }
546
+ // 获取的已完成任务的节点
547
+ const finishTaskList = ref<NodeShowVo[]>([])
548
+ // 退回节点选择
549
+ const backTaskId = ref<string>('')
550
+ // 同意推荐回复列表
551
+ const agreeRecommendReplyList = ref<string[]>([])
552
+ // 拒绝推荐回复列表
553
+ const refuseRecommendReplyList = ref<string[]>([])
554
+ // 点击推荐回复
555
+ const handleRecommendReplyClick = (reply: string) => {
556
+ textarea.value = reply
557
+ }
558
+ // 选择转交人
559
+ const transmittedObj = ref<any>([])
560
+ // 用数组换名字
561
+ const getNames = (list: any[]) => {
562
+ if (list && Array.isArray(list) && list.length > 0) {
563
+ let str = ''
564
+ list.forEach((item, index) => {
565
+ if (index == (list.length - 1)) {
566
+ str += item.userName
567
+ } else {
568
+ str += item.userName + ','
569
+ }
570
+ })
571
+
572
+ if (list.length == 1) {
573
+ return str
574
+ } else {
575
+ return str
576
+ }
577
+ }
578
+ }
579
+ const openDialog = async (type: string) => {
580
+ //获取最新签名
581
+ await FlowSignController.gerPersonalSign().then(data => {
582
+ if (data.code === 200 && data.res) {
583
+ uploadImg.value = data.res.url
584
+ uploadImgId.value = data.res.fileId
585
+ } else {
586
+ console.log("获取最新签名失败")
587
+ }
588
+ })
589
+ // 1 同意弹窗 2 拒绝弹窗 3 转交弹窗 4 退回弹窗 5加签弹窗
590
+ emits('validateForm', type)
591
+ dialogType.value = type
592
+ textarea.value = type == '1' ? props.formBaseInfo.nodeType === 'Executor' ? '已执行' : '同意' : type == '2' ? '拒绝' : type == '3' ? '转交' : type == '4' ? '退回' : type == '5' ? '加签' : ''
593
+ // centerDialogVisible.value = true
594
+ // 同意时获取同意推荐回复列表
595
+ if (type == '1') {
596
+ agreeRecommendReplyList.value = []
597
+ FlowInstanceController.getRecommendReplyList(props.formId, 'agree')
598
+ .then((data) => {
599
+ if (data.code == 200 && data.res) {
600
+ agreeRecommendReplyList.value = data.res
601
+ }
602
+ })
603
+ .catch(() => {
604
+ agreeRecommendReplyList.value = []
605
+ })
606
+ }
607
+ // 拒绝时获取拒绝推荐回复列表
608
+ if (type == '2') {
609
+ refuseRecommendReplyList.value = []
610
+ FlowInstanceController.getRecommendReplyList(props.formId, 'refuse')
611
+ .then((data) => {
612
+ if (data.code == 200 && data.res) {
613
+ refuseRecommendReplyList.value = data.res
614
+ }
615
+ })
616
+ .catch(() => {
617
+ refuseRecommendReplyList.value = []
618
+ })
619
+ }
620
+ if (type == '4') {
621
+ const loadingInstance = ElLoading.service({
622
+ lock: true,
623
+ text: '加载中...',
624
+ });
625
+ await FlowInstanceController.getFinishNodeList(props.formId).then(data => {
626
+ if (data.res && data.code == 200) {
627
+ finishTaskList.value = data.res
628
+ }
629
+ }).finally(() => {
630
+ loadingInstance.close();
631
+ })
632
+ }
633
+ if (props.canSubmit) {
634
+ centerDialogVisible.value = true
635
+ }
636
+ }
637
+ // 审批弹窗确定按钮触发的功能
638
+ const handleSubmit = async (obj: any, successMessage: string, apiFunc: Function) => {
639
+ const loadingInstance = ElLoading.service({
640
+ lock: true,
641
+ text: '加载中...',
642
+ });
643
+
644
+ try {
645
+ const data = await apiFunc(obj);
646
+ if (data.code === 200) {
647
+ ElMessage({ message: successMessage, type: 'success' });
648
+ centerDialogVisible.value = false;
649
+ textarea.value = '';
650
+ haveSubmit.value = true;
651
+ }
652
+ } finally {
653
+ loadingInstance.close();
654
+ }
655
+ };
656
+
657
+ const checkFormChanges = () => {
658
+ for (let j in props.oldRuleForm) {
659
+ for (let i in props.ruleForm) {
660
+ if (i === j) {
661
+ if (typeof props.ruleForm[i] === 'string' || typeof props.ruleForm[i] === 'number' || props.ruleForm[i] === null || props.ruleForm[i] === undefined) {
662
+ if (props.ruleForm[i] !== props.oldRuleForm[j]) return true;
663
+ } else if (Array.isArray(props.ruleForm[i])) {
664
+ const arr1 = JSON.parse(JSON.stringify(props.ruleForm[i])).sort();
665
+ const arr2 = JSON.parse(JSON.stringify(props.oldRuleForm[i])).sort();
666
+ if (JSON.stringify(arr1) !== JSON.stringify(arr2)) return true;
667
+ } else if (_.isObject(props.ruleForm[i]) && _.isObject(props.oldRuleForm[i])) {
668
+ if (!_.isEqual(props.ruleForm[i], props.oldRuleForm[i])) return true;
669
+ } else {
670
+ console.log('比较ruleForm 跟 oldRuleForm 发现其他情况', props.ruleForm[i], props.oldRuleForm[j]);
671
+ return true;
672
+ }
673
+ }
674
+ }
675
+ }
676
+ return false;
677
+ };
678
+
679
+ const submitResult = new throttle().use(async () => {
680
+ // 表单验证
681
+ if (!textarea.value) {
682
+ ElMessage({ message: '请输入审批意见', type: 'error' });
683
+ return;
684
+ }
685
+ if (!uploadImg.value && props.formBaseInfo?.ifSignature && !uploadImgId.value) {
686
+ ElMessage({ message: '请进行签字或对签字进行确认保存', type: 'warning' });
687
+ return;
688
+ }
689
+ if (dialogType.value === '3' && (!transmittedObj.value || transmittedObj.value.length < 1)) {
690
+ ElMessage({ message: '请选择转交对象后在进行转交操作', type: 'warning' });
691
+ return;
692
+ }
693
+ if (dialogType.value === '4' && !backTaskId.value) {
694
+ ElMessage({ message: '请选择退回节点后在进行转交操作', type: 'warning' });
695
+ return;
696
+ }
697
+ const havaRuleFormChange = checkFormChanges();
698
+ console.log('props.ruleForm', havaRuleFormChange)
699
+
700
+ let saveSuccess = false;
701
+
702
+ if (havaRuleFormChange) {
703
+ if (dialogType.value === '1' || dialogType.value === '2') {
704
+ const result = await props.submitProcess();
705
+ if (result === 'success') saveSuccess = true;
706
+ } else {
707
+ saveSuccess = true;
708
+ }
709
+ }
710
+
711
+ if (!havaRuleFormChange || saveSuccess) {
712
+ switch (dialogType.value) {
713
+ case '1':
714
+ case '2':
715
+ await handleSubmit(
716
+ {
717
+ nodeId: props.taskId,
718
+ comment: textarea.value,
719
+ result: dialogType.value === '1' ? 'agree' : 'refuse',
720
+ signatureUrl: props.formBaseInfo?.ifSignature && uploadImgId.value !== undefined ? uploadImgId.value : ""
721
+ },
722
+ '审批成功',
723
+ FlowInstanceController.submitReview
724
+ );
725
+ break;
726
+
727
+ case '3':
728
+ await handleSubmit(
729
+ {
730
+ nodeId: props.taskId,
731
+ comment: textarea.value,
732
+ takeOverUserId: transmittedObj.value[0].userId
733
+ },
734
+ '转交成功',
735
+ FlowInstanceController.transmittedHandleNode
736
+ );
737
+ break;
738
+
739
+ case '4':
740
+ await handleSubmit(
741
+ {
742
+ nodeId: props.taskId,
743
+ comment: textarea.value,
744
+ backNodeId: backTaskId.value
745
+ },
746
+ '退回成功',
747
+ FlowInstanceController.instanceBack
748
+ );
749
+ break;
750
+ }
751
+ }
752
+ }, 1000, true);
753
+ // 当发起人重新提交
754
+ const buttonSubmit = async () => {
755
+ let havaRuleFormChange = false
756
+ console.log('props.ruleForm', props.oldRuleForm)
757
+ console.log('props.ruleForm', props.ruleForm)
758
+ for (let j in props.oldRuleForm) {
759
+ for (let i in props.ruleForm) {
760
+ if (i == j) {
761
+ if (typeof props.ruleForm[i] == 'string' || typeof props.ruleForm[i] == 'number' || props.ruleForm[i] === null || props.ruleForm[i] === undefined) {
762
+ if (props.ruleForm[i] !== props.oldRuleForm[j]) {
763
+ havaRuleFormChange = true
764
+ }
765
+ } else if (Array.isArray(props.ruleForm[i])) {
766
+ let arr1 = JSON.parse(JSON.stringify(props.ruleForm[i]))
767
+ let arr2 = JSON.parse(JSON.stringify(props.oldRuleForm[i]))
768
+ let str1 = JSON.stringify(arr1.sort())
769
+ let str2 = JSON.stringify(arr2.sort())
770
+ if (str1 != str2) {
771
+ havaRuleFormChange = true
772
+ }
773
+ } else if (Object.prototype.toString.call(props.ruleForm[i]) === '[object Object]' && Object.prototype.toString.call(props.oldRuleForm[i]) === '[object Object]') {
774
+ for (let m in props.ruleForm[i]) {
775
+ let currenKeyHave = false
776
+ let havaFindObjectDiffInner = false
777
+ for (let n in props.oldRuleForm[i]) {
778
+ if (m == n) {
779
+ currenKeyHave = true
780
+ if (props.ruleForm[i][m] !== props.oldRuleForm[j][n]) {
781
+ havaFindObjectDiffInner = true
782
+ break;
783
+ }
784
+ }
785
+ }
786
+ if (!currenKeyHave || havaFindObjectDiffInner) {
787
+ havaRuleFormChange = true
788
+ break;
789
+ }
790
+ }
791
+ } else {
792
+ console.log('比较ruleForm 跟 oldRuleForm 发现其他情况', props.ruleForm[i], props.oldRuleForm[j])
793
+ havaRuleFormChange = true
794
+ }
795
+ }
796
+ if (havaRuleFormChange) break
797
+ }
798
+ if (havaRuleFormChange) break
799
+ }
800
+ let saveSuccess = false
801
+ if (havaRuleFormChange) {
802
+ await props.submitProcess().then((data: any) => {
803
+ console.error(data)
804
+ if (data == 'success') {
805
+ saveSuccess = true
806
+ }
807
+ })
808
+ }
809
+ if (!havaRuleFormChange || saveSuccess) {
810
+ const loadingInstance = ElLoading.service({
811
+ lock: true,
812
+ text: '加载中...',
813
+ });
814
+ let obj: ReviewBO = {
815
+ "nodeId": props.taskId,
816
+ "comment": '提交',
817
+ "result": 'agree',
818
+ "signatureUrl": ''
819
+ }
820
+
821
+ FlowInstanceController.submitReview(obj).then((data) => {
822
+ console.log(data)
823
+ if (data.code == 200) {
824
+ ElMessage({ message: '提交成功', type: 'success' })
825
+ centerDialogVisible.value = false
826
+ textarea.value = ''
827
+ haveSubmit.value = true
828
+ }
829
+ }).finally(() => {
830
+ loadingInstance.close()
831
+ })
832
+
833
+ }
834
+
835
+ }
836
+ watch(() => { return props.canSubmit }, (newVal) => {
837
+ if (newVal) {
838
+ centerDialogVisible.value = true
839
+ } else {
840
+ centerDialogVisible.value = false
841
+ }
842
+ }, { deep: true })
843
+ const handleTabClick = () => {
844
+ console.log(1)
845
+ }
846
+
847
+
848
+ const activities = ref<any[]>([])
849
+ const ceshiactive = () => {
850
+ console.log(activities.value)
851
+ }
852
+
853
+ // 若有处理中,则取第一个处理中的节点类型,若没有处理中,则取第一个待处理的节点
854
+ const currentNodeType = ref<string>('Ccto')
855
+ const getCurrentNodeType = () => {
856
+ let haveFindProcessing = false
857
+ let findNodeTypeProcessing = ''
858
+ let haveFindPending = false
859
+ let findNodeTypePending = ''
860
+
861
+ for (let i = 0; i < activities.value.length; i++) {
862
+ if (activities.value[i].nodeStatus == '处理中') {
863
+ haveFindProcessing = true
864
+ findNodeTypeProcessing = activities.value[i].nodeType
865
+ break
866
+ }
867
+ }
868
+ for (let i = 0; i < activities.value.length; i++) {
869
+ if (activities.value[i].nodeStatus == '待处理') {
870
+ haveFindPending = true
871
+ findNodeTypePending = activities.value[i].nodeType
872
+ break
873
+ }
874
+ }
875
+ if (haveFindProcessing && findNodeTypeProcessing) {
876
+ currentNodeType.value = findNodeTypeProcessing
877
+ } else if (haveFindPending && findNodeTypePending) {
878
+ currentNodeType.value = findNodeTypePending
879
+ } else {
880
+ console.error('467行,当前未寻找到待处理或者处理中数据')
881
+ currentNodeType.value = 'Ccto'
882
+ }
883
+ }
884
+ // button 处理事件
885
+
886
+ const buttonNotUse = () => {
887
+ ElMessage({ message: '功能正在开发中', type: 'error' })
888
+ }
889
+ // 撤销
890
+ const buttonRevoke = () => {
891
+ // 如果传入了自定义撤销方法,使用自定义方法
892
+ if (props.customRevoke) {
893
+ props.customRevoke()
894
+ return
895
+ }
896
+ const loadingInstance = ElLoading.service({
897
+ lock: true,
898
+ text: '加载中...',
899
+ });
900
+ FlowInstanceController.revokeInstance(props.taskId).then(data => {
901
+ if (data.code == 200) {
902
+ ElMessage({
903
+ message: '撤销成功',
904
+ type: 'success'
905
+ })
906
+ haveSubmit.value = true
907
+ }
908
+ }).finally(() => {
909
+ loadingInstance.close()
910
+ })
911
+ }
912
+ watch(() => { return props.activities }, () => {
913
+ activities.value = props.activities
914
+ }, { deep: true, immediate: true })
915
+ watch(() => { return props.formBaseInfo }, () => {
916
+ formBaseInfo.value = props.formBaseInfo
917
+ buttonList.value = props.formBaseInfo.buttonList && Array.isArray(props.formBaseInfo.buttonList) ? props.formBaseInfo.buttonList : []
918
+ uploadImg.value = props.formBaseInfo.signatureHistoryUrl ? props.formBaseInfo.signatureHistoryUrl : ''
919
+ uploadImgId.value = props.formBaseInfo.fileId ? props.formBaseInfo.fileId : ''
920
+ if (props.formId) {
921
+
922
+ setCommentProps()
923
+ }
924
+ }, { deep: true, immediate: true })
925
+ const signConmpentRef = ref()
926
+
927
+ watch(centerDialogVisible, (newVal, oldVal) => {
928
+ setTimeout(async () => {
929
+ if (newVal === false) {
930
+ signConmpentRef.value.dialogClose()
931
+ }
932
+ })
933
+ })
934
+
935
+ onMounted(() => {
936
+ currentPageWidth.value = window.innerWidth
937
+ window.addEventListener("resize", () => {
938
+ console.log(window.innerWidth)
939
+ currentPageWidth.value = window.innerWidth
940
+ })
941
+
942
+ console.log(isPc, props.taskId, props.formId)
943
+ })
944
+
945
+ // 评论区域ref
946
+ const CommentAreaComponentRef = ref()
947
+ // 设置评论的必要参数
948
+ const setCommentProps = () => {
949
+ CommentAreaComponentRef.value?.setCommentProps({
950
+ formId: props.formId
951
+ })
952
+ }
953
+ /** 催办 */
954
+ const UrgeDialogRef = ref()
955
+ const openUrgeDialog = () => {
956
+ UrgeDialogRef.value?.open(props.formId, props.taskId)
957
+ }
958
+ const urgeDialogSuccess = () => {
959
+ console.log("催办成功的回调")
960
+ }
961
+ //进入页面后关闭弹框
962
+ onActivated(() => {
963
+ haveSubmit.value = false
964
+ })
965
+ // 返回列表
966
+ const backList = () => {
967
+ emits('backList')
968
+ }
969
+ //单据打印按钮
970
+ const openOrderPrint = () => {
971
+ emits('openOrderPrint')
972
+ }
973
+ </script>
974
+ <style lang="scss" scoped>
975
+ @use './styles/common.scss';
976
+ @use './styles/examine-approve-pc.scss';
977
+ @use './styles/examine-approve-phone.scss';
978
+
979
+ .popupBody {
980
+ position: relative;
981
+ height: 100%;
982
+ width: 100%;
983
+ overflow-y: hidden;
984
+ }
985
+
986
+ .popupContent {
987
+ overflow-y: auto;
988
+ height: 100%;
989
+ width: 100%;
990
+
991
+ .blankBox {
992
+ height: 60px;
993
+ width: 100%;
994
+ min-height: 60px;
995
+ max-height: 60px;
996
+ }
997
+ }
998
+
999
+ .popupbuttonBox {
1000
+ padding-top: 8px;
1001
+ margin-top: 18px;
1002
+ position: absolute;
1003
+ bottom: 0;
1004
+ border-top: 1px solid #e4e7ed;
1005
+ width: 100%;
1006
+ height: 50px;
1007
+ box-shadow: 0px 0px 12px #90939930;
1008
+ background: #fff;
1009
+ }
1010
+
1011
+ .processPcAuditCurrentPageBox {
1012
+ .el-textarea__inner {
1013
+ height: 37px;
1014
+ min-height: 37px !important;
1015
+ }
1016
+ }
1017
+
1018
+ // 推荐回复样式
1019
+ .recommend-reply-section {
1020
+ width: 100%;
1021
+ margin-bottom: 12px;
1022
+
1023
+ .recommend-reply-title {
1024
+ font-size: 14px;
1025
+ color: #ff6b00;
1026
+ margin-bottom: 10px;
1027
+ }
1028
+
1029
+ .recommend-reply-list {
1030
+ display: flex;
1031
+ flex-wrap: wrap;
1032
+ gap: 8px;
1033
+ }
1034
+
1035
+ .recommend-reply-item {
1036
+ display: inline-block;
1037
+ padding: 6px 14px;
1038
+ background: #f5f5f5;
1039
+ border-radius: 16px;
1040
+ font-size: 13px;
1041
+ color: #333;
1042
+ cursor: pointer;
1043
+ max-width: 100%;
1044
+ word-break: break-all;
1045
+ overflow-wrap: break-word;
1046
+
1047
+ &:hover {
1048
+ background: #e8e8e8;
1049
+ }
1050
+
1051
+ &:active {
1052
+ background: #e0e0e0;
1053
+ }
1054
+ }
1055
+ }
1056
+ </style>
1057
+ <style lang="scss">
1058
+ .processPcAuditCurrentPageBox {
1059
+ .el-textarea__inner {
1060
+ height: 37px;
1061
+ min-height: 37px !important;
1062
+ }
1063
+ }
1064
+
1065
+ </style>