WorkflowEdit.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. <script setup lang="ts">
  2. import { ElMessage } from 'element-plus'
  3. import { addFlow, getFlow, putFlow, getExecuteFlow } from '@/api/workflow'
  4. import { useWorkflow } from '@/stores/workflow'
  5. const workFlow = useWorkflow()
  6. const emits = defineEmits(['click-change', 'previous-step'])
  7. const tipList = ref<any>([])
  8. let tipVisible = ref(false)
  9. let islook = ref(false)
  10. let nowVal = ref(100)
  11. let processConfig = ref<any>({
  12. nodeConfig: {
  13. nodeName: '流程发起',
  14. nodeType: 0,
  15. priorityLevel: '',
  16. approvalType: 'or',
  17. subjects: [],
  18. copyTo: [],
  19. settype: '',
  20. directorLevel: '',
  21. examineMode: '',
  22. noHanderAction: '',
  23. ccSelfSelectFlag: '',
  24. condGroup: {
  25. type: 'and',
  26. items: []
  27. },
  28. nodeUserList: [],
  29. childNode: {},
  30. conditionNodes: []
  31. }
  32. })
  33. let nodeConfig = ref({})
  34. let workflowId = ref('')
  35. let state = ref<any>('')
  36. let operateShow = ref(false)
  37. const init = (row: any) => {
  38. workflowId = row.id
  39. state = row.state
  40. if (row.state == 1 || !row.state) {
  41. // 新增流程
  42. let { nodeConfig: nodes } = processConfig.value
  43. nodeConfig.value = nodes
  44. } else if (row.state == 2) {
  45. operateShow.value = row.operateShow
  46. islook.value = row.islook
  47. getFlow({
  48. workflowId: workflowId
  49. }).then((res: any) => {
  50. processConfig.value = JSON.parse(res.flowExpr)
  51. let { nodeConfig: nodes } = JSON.parse(res.flowExpr)
  52. nodeConfig.value = nodes
  53. })
  54. } else if (row.state == 3) {
  55. operateShow.value = row.operateShow
  56. islook.value = row.islook
  57. getExecuteFlow({
  58. workflowExecuteId: workflowId
  59. }).then((res: any) => {
  60. processConfig.value = JSON.parse(res.flowExpr)
  61. let { nodeConfig: nodes } = JSON.parse(res.flowExpr)
  62. nodeConfig.value = nodes
  63. })
  64. }
  65. }
  66. const reErr = (childNode: any) => {
  67. if (childNode) {
  68. let { nodeType, error, nodeName, conditionNodes } = childNode
  69. if (nodeType == 1 || nodeType == 4) {
  70. if (error) {
  71. tipList.value.push({
  72. name: nodeName,
  73. type: ['', '审核人', '抄送人'][nodeType]
  74. })
  75. }
  76. reErr(childNode)
  77. } else if (nodeType == 3) {
  78. reErr(childNode)
  79. } else if (nodeType == 2) {
  80. reErr(childNode)
  81. for (var i = 0; i < conditionNodes.length; i++) {
  82. if (conditionNodes[i].error) {
  83. tipList.value.push({ name: conditionNodes[i].nodeName, type: '条件' })
  84. }
  85. reErr(conditionNodes[i])
  86. }
  87. }
  88. } else {
  89. childNode = null
  90. }
  91. }
  92. const saveSet = async () => {
  93. workFlow.setIsTried(true)
  94. tipList.value = []
  95. reErr(nodeConfig.value)
  96. if (tipList.value.length != 0) {
  97. tipVisible.value = true
  98. return
  99. }
  100. processConfig.value.nodeConfig = nodeConfig.value
  101. if (state == 1 || !state) {
  102. addFlow({
  103. workflowId: workflowId,
  104. firstNode: processConfig.value.nodeConfig.childNode,
  105. flowExpr: JSON.stringify(processConfig.value)
  106. }).then((res: any) => {
  107. ElMessage({
  108. type: 'success',
  109. message: res.msg
  110. })
  111. closeDialog()
  112. emits('click-change')
  113. })
  114. } else {
  115. putFlow({
  116. workflowId: workflowId,
  117. firstNode: processConfig.value.nodeConfig.childNode,
  118. flowExpr: JSON.stringify(processConfig.value)
  119. }).then((res: any) => {
  120. ElMessage({
  121. type: 'success',
  122. message: res.msg
  123. })
  124. closeDialog()
  125. emits('click-change')
  126. })
  127. }
  128. }
  129. const zoomSize = (type: any) => {
  130. if (type == 1) {
  131. if (nowVal.value == 50) {
  132. return
  133. }
  134. nowVal.value -= 10
  135. } else {
  136. if (nowVal.value == 300) {
  137. return
  138. }
  139. nowVal.value += 10
  140. }
  141. }
  142. const resetForm = (formEl: any | undefined) => {
  143. emits('previous-step')
  144. }
  145. const closeDialog = () => {
  146. processConfig.value = {
  147. nodeConfig: {
  148. nodeName: '流程发起',
  149. nodeType: 0,
  150. priorityLevel: '',
  151. approvalType: 'or',
  152. subjects: [],
  153. copyTo: [],
  154. settype: '',
  155. directorLevel: '',
  156. examineMode: '',
  157. noHanderAction: '',
  158. ccSelfSelectFlag: '',
  159. condGroup: {
  160. type: 'and',
  161. items: []
  162. },
  163. nodeUserList: [],
  164. childNode: {},
  165. conditionNodes: []
  166. }
  167. }
  168. }
  169. defineExpose({
  170. init
  171. })
  172. </script>
  173. <template>
  174. <div class="m-t-10">
  175. <div style="height: 800px">
  176. <section class="dingflow-design">
  177. <div class="zoom">
  178. <div class="zoom-out" :class="nowVal == 50 && 'disabled'" @click="zoomSize(1)"></div>
  179. <span>{{ nowVal }}%</span>
  180. <div class="zoom-in" :class="nowVal == 300 && 'disabled'" @click="zoomSize(2)"></div>
  181. </div>
  182. <div class="box-scale" :style="`transform: scale(${nowVal / 100});`">
  183. <nodeWrap v-model:nodeConfig="nodeConfig" :operateShow="operateShow" />
  184. <div class="end-node">
  185. <div class="end-node-circle"></div>
  186. <div class="end-node-text">
  187. <el-button type="primary">流程结束</el-button>
  188. </div>
  189. </div>
  190. </div>
  191. </section>
  192. </div>
  193. <errorDialog v-model:visible="tipVisible" :list="tipList" />
  194. <approverDrawer :operateShow="operateShow" />
  195. <copyerDrawer :operateShow="operateShow" />
  196. <conditionDrawer :workflowId="workflowId" :operateShow="operateShow" :islook="islook" />
  197. <div class="flex justify-end w-full m-t-10" v-if="!operateShow">
  198. <el-button size="default" @click="resetForm">上一步</el-button>
  199. <el-button size="default" type="primary" @click="saveSet">确认</el-button>
  200. </div>
  201. </div>
  202. </template>
  203. <style lang="scss" scoped>
  204. .error-modal-list {
  205. width: 455px;
  206. }
  207. </style>