ProcessInstanceSimpleViewer.vue 5.4 KB

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