ProcessInstanceSimpleViewer.vue 5.7 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
  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. ) {
  88. simpleModel.activityStatus = TaskStatusEnum.NOT_START
  89. if (rejectedTaskActivityIds.includes(simpleModel.id)) {
  90. simpleModel.activityStatus = TaskStatusEnum.REJECT
  91. } else if (unfinishedTaskActivityIds.includes(simpleModel.id)) {
  92. simpleModel.activityStatus = TaskStatusEnum.RUNNING
  93. } else if (finishedActivityIds.includes(simpleModel.id)) {
  94. simpleModel.activityStatus = TaskStatusEnum.APPROVE
  95. }
  96. // TODO 是不是还缺一个 cancel 的状态
  97. }
  98. // 抄送节点
  99. if (simpleModel.type === NodeType.COPY_TASK_NODE) {
  100. // 抄送节点,只有通过和未执行状态
  101. if (finishedActivityIds.includes(simpleModel.id)) {
  102. simpleModel.activityStatus = TaskStatusEnum.APPROVE
  103. } else {
  104. simpleModel.activityStatus = TaskStatusEnum.NOT_START
  105. }
  106. }
  107. // 延迟器节点
  108. if (simpleModel.type === NodeType.DELAY_TIMER_NODE) {
  109. // 延迟器节点,只有通过和未执行状态
  110. if (finishedActivityIds.includes(simpleModel.id)) {
  111. simpleModel.activityStatus = TaskStatusEnum.APPROVE
  112. } else {
  113. simpleModel.activityStatus = TaskStatusEnum.NOT_START
  114. }
  115. }
  116. // 触发器节点
  117. if (simpleModel.type === NodeType.TRIGGER_NODE) {
  118. // 触发器节点,只有通过和未执行状态
  119. if (finishedActivityIds.includes(simpleModel.id)) {
  120. simpleModel.activityStatus = TaskStatusEnum.APPROVE
  121. } else {
  122. simpleModel.activityStatus = TaskStatusEnum.NOT_START
  123. }
  124. }
  125. // 条件节点对应 SequenceFlow
  126. if (simpleModel.type === NodeType.CONDITION_NODE) {
  127. // 条件节点,只有通过和未执行状态
  128. if (finishedSequenceFlowActivityIds.includes(simpleModel.id)) {
  129. simpleModel.activityStatus = TaskStatusEnum.APPROVE
  130. } else {
  131. simpleModel.activityStatus = TaskStatusEnum.NOT_START
  132. }
  133. }
  134. // 网关节点
  135. if (
  136. simpleModel.type === NodeType.CONDITION_BRANCH_NODE ||
  137. simpleModel.type === NodeType.PARALLEL_BRANCH_NODE ||
  138. simpleModel.type === NodeType.INCLUSIVE_BRANCH_NODE ||
  139. simpleModel.type === NodeType.ROUTER_BRANCH_NODE
  140. ) {
  141. // 网关节点。只有通过和未执行状态
  142. if (finishedActivityIds.includes(simpleModel.id)) {
  143. simpleModel.activityStatus = TaskStatusEnum.APPROVE
  144. } else {
  145. simpleModel.activityStatus = TaskStatusEnum.NOT_START
  146. }
  147. simpleModel.conditionNodes?.forEach((node) => {
  148. setSimpleModelNodeTaskStatus(
  149. node,
  150. processStatus,
  151. rejectedTaskActivityIds,
  152. unfinishedTaskActivityIds,
  153. finishedActivityIds,
  154. finishedSequenceFlowActivityIds
  155. )
  156. })
  157. }
  158. setSimpleModelNodeTaskStatus(
  159. simpleModel.childNode,
  160. processStatus,
  161. rejectedTaskActivityIds,
  162. unfinishedTaskActivityIds,
  163. finishedActivityIds,
  164. finishedSequenceFlowActivityIds
  165. )
  166. }
  167. </script>
  168. <style lang="scss" scoped>
  169. </style>