ProcessInstanceSimpleViewer.vue 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. <template>
  2. <div v-loading="loading" class="process-viewer-container">
  3. <SimpleProcessViewer
  4. :flow-node="simpleModel"
  5. :tasks="tasks"
  6. :process-instance="processInstance"
  7. />
  8. </div>
  9. </template>
  10. <script lang="ts" setup>
  11. import { propTypes } from '@/utils/propTypes'
  12. import { TaskStatusEnum } from '@/api/bpm/task'
  13. import { SimpleFlowNode, NodeType } from '@/components/SimpleProcessDesignerV2/src/consts'
  14. import { SimpleProcessViewer } from '@/components/SimpleProcessDesignerV2/src/'
  15. defineOptions({ name: 'BpmProcessInstanceSimpleViewer' })
  16. const props = defineProps({
  17. loading: propTypes.bool.def(false), // 是否加载中
  18. modelView: propTypes.object,
  19. simpleJson: propTypes.string // Simple 模型结构数据 (json 格式)
  20. })
  21. const simpleModel = ref<any>({})
  22. // 用户任务
  23. const tasks = ref([])
  24. // 流程实例
  25. const processInstance = ref()
  26. /** 监控模型视图 包括任务列表、进行中的活动节点编号等 */
  27. watch(
  28. () => props.modelView,
  29. async (newModelView) => {
  30. if (newModelView) {
  31. tasks.value = newModelView.tasks
  32. processInstance.value = newModelView.processInstance
  33. // 已经拒绝的活动节点编号集合,只包括 UserTask
  34. const rejectedTaskActivityIds: string[] = newModelView.rejectedTaskActivityIds
  35. // 进行中的活动节点编号集合, 只包括 UserTask
  36. const unfinishedTaskActivityIds: string[] = newModelView.unfinishedTaskActivityIds
  37. // 已经完成的活动节点编号集合, 包括 UserTask、Gateway 等
  38. const finishedActivityIds: string[] = newModelView.finishedTaskActivityIds
  39. // 已经完成的连线节点编号集合,只包括 SequenceFlow
  40. const finishedSequenceFlowActivityIds: string[] = newModelView.finishedSequenceFlowActivityIds
  41. setSimpleModelNodeTaskStatus(
  42. newModelView.simpleModel,
  43. newModelView.processInstance?.status,
  44. rejectedTaskActivityIds,
  45. unfinishedTaskActivityIds,
  46. finishedActivityIds,
  47. finishedSequenceFlowActivityIds
  48. )
  49. simpleModel.value = newModelView.simpleModel ? newModelView.simpleModel : {}
  50. }
  51. }
  52. )
  53. /** 监控模型结构数据 */
  54. watch(
  55. () => props.simpleJson,
  56. async (value) => {
  57. if (value) {
  58. simpleModel.value = JSON.parse(value)
  59. }
  60. }
  61. )
  62. const setSimpleModelNodeTaskStatus = (
  63. simpleModel: SimpleFlowNode | undefined,
  64. processStatus: number,
  65. rejectedTaskActivityIds: string[],
  66. unfinishedTaskActivityIds: string[],
  67. finishedActivityIds: string[],
  68. finishedSequenceFlowActivityIds: string[]
  69. ) => {
  70. if (!simpleModel) {
  71. return
  72. }
  73. // 结束节点
  74. if (simpleModel.type === NodeType.END_EVENT_NODE) {
  75. if (finishedActivityIds.includes(simpleModel.id)) {
  76. simpleModel.activityStatus = processStatus
  77. } else {
  78. simpleModel.activityStatus = TaskStatusEnum.NOT_START
  79. }
  80. return
  81. }
  82. // 审批节点
  83. if (
  84. simpleModel.type === NodeType.START_USER_NODE ||
  85. simpleModel.type === NodeType.USER_TASK_NODE ||
  86. simpleModel.type === NodeType.TRANSACTOR_NODE ||
  87. simpleModel.type === NodeType.CHILD_PROCESS_NODE
  88. ) {
  89. simpleModel.activityStatus = TaskStatusEnum.NOT_START
  90. if (rejectedTaskActivityIds.includes(simpleModel.id)) {
  91. simpleModel.activityStatus = TaskStatusEnum.REJECT
  92. } else if (unfinishedTaskActivityIds.includes(simpleModel.id)) {
  93. simpleModel.activityStatus = TaskStatusEnum.RUNNING
  94. } else if (finishedActivityIds.includes(simpleModel.id)) {
  95. simpleModel.activityStatus = TaskStatusEnum.APPROVE
  96. }
  97. // TODO 是不是还缺一个 cancel 的状态
  98. }
  99. // 抄送节点
  100. if (simpleModel.type === NodeType.COPY_TASK_NODE) {
  101. // 抄送节点,只有通过和未执行状态
  102. if (finishedActivityIds.includes(simpleModel.id)) {
  103. simpleModel.activityStatus = TaskStatusEnum.APPROVE
  104. } else {
  105. simpleModel.activityStatus = TaskStatusEnum.NOT_START
  106. }
  107. }
  108. // 延迟器节点
  109. if (simpleModel.type === NodeType.DELAY_TIMER_NODE) {
  110. // 延迟器节点,只有通过和未执行状态
  111. if (finishedActivityIds.includes(simpleModel.id)) {
  112. simpleModel.activityStatus = TaskStatusEnum.APPROVE
  113. } else {
  114. simpleModel.activityStatus = TaskStatusEnum.NOT_START
  115. }
  116. }
  117. // 触发器节点
  118. if (simpleModel.type === NodeType.TRIGGER_NODE) {
  119. // 触发器节点,只有通过和未执行状态
  120. if (finishedActivityIds.includes(simpleModel.id)) {
  121. simpleModel.activityStatus = TaskStatusEnum.APPROVE
  122. } else {
  123. simpleModel.activityStatus = TaskStatusEnum.NOT_START
  124. }
  125. }
  126. // 条件节点对应 SequenceFlow
  127. if (simpleModel.type === NodeType.CONDITION_NODE) {
  128. // 条件节点,只有通过和未执行状态
  129. if (finishedSequenceFlowActivityIds.includes(simpleModel.id)) {
  130. simpleModel.activityStatus = TaskStatusEnum.APPROVE
  131. } else {
  132. simpleModel.activityStatus = TaskStatusEnum.NOT_START
  133. }
  134. }
  135. // 网关节点
  136. if (
  137. simpleModel.type === NodeType.CONDITION_BRANCH_NODE ||
  138. simpleModel.type === NodeType.PARALLEL_BRANCH_NODE ||
  139. simpleModel.type === NodeType.INCLUSIVE_BRANCH_NODE ||
  140. simpleModel.type === NodeType.ROUTER_BRANCH_NODE
  141. ) {
  142. // 网关节点。只有通过和未执行状态
  143. if (finishedActivityIds.includes(simpleModel.id)) {
  144. simpleModel.activityStatus = TaskStatusEnum.APPROVE
  145. } else {
  146. simpleModel.activityStatus = TaskStatusEnum.NOT_START
  147. }
  148. simpleModel.conditionNodes?.forEach((node) => {
  149. setSimpleModelNodeTaskStatus(
  150. node,
  151. processStatus,
  152. rejectedTaskActivityIds,
  153. unfinishedTaskActivityIds,
  154. finishedActivityIds,
  155. finishedSequenceFlowActivityIds
  156. )
  157. })
  158. }
  159. setSimpleModelNodeTaskStatus(
  160. simpleModel.childNode,
  161. processStatus,
  162. rejectedTaskActivityIds,
  163. unfinishedTaskActivityIds,
  164. finishedActivityIds,
  165. finishedSequenceFlowActivityIds
  166. )
  167. }
  168. </script>
  169. <style lang="scss" scoped></style>