ProcessNodeTree.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <template>
  2. <!-- 发起人节点 -->
  3. <StartUserNode
  4. v-if="currentNode && currentNode.type === NodeType.START_USER_NODE"
  5. :flow-node="currentNode"
  6. />
  7. <!-- 审批节点 -->
  8. <UserTaskNode
  9. v-if="currentNode && currentNode.type === NodeType.USER_TASK_NODE"
  10. :flow-node="currentNode"
  11. @update:flow-node="handleModelValueUpdate"
  12. @find:parent-node="findFromParentNode"
  13. />
  14. <!-- 抄送节点 -->
  15. <CopyTaskNode
  16. v-if="currentNode && currentNode.type === NodeType.COPY_TASK_NODE"
  17. :flow-node="currentNode"
  18. @update:flow-node="handleModelValueUpdate"
  19. />
  20. <!-- 条件节点 -->
  21. <ExclusiveNode
  22. v-if="currentNode && currentNode.type === NodeType.CONDITION_BRANCH_NODE"
  23. :flow-node="currentNode"
  24. @update:model-value="handleModelValueUpdate"
  25. @find:parent-node="findFromParentNode"
  26. />
  27. <!-- 并行节点 -->
  28. <ParallelNode
  29. v-if="currentNode && currentNode.type === NodeType.PARALLEL_BRANCH_NODE"
  30. :flow-node="currentNode"
  31. @update:model-value="handleModelValueUpdate"
  32. @find:parent-node="findFromParentNode"
  33. />
  34. <!-- 包容分支节点 -->
  35. <InclusiveNode
  36. v-if="currentNode && currentNode.type === NodeType.INCLUSIVE_BRANCH_NODE"
  37. :flow-node="currentNode"
  38. @update:model-value="handleModelValueUpdate"
  39. @find:parent-node="findFromParentNode"
  40. />
  41. <!-- 递归显示孩子节点 -->
  42. <ProcessNodeTree
  43. v-if="currentNode && currentNode.childNode"
  44. v-model:flow-node="currentNode.childNode"
  45. :parent-node="currentNode"
  46. @find:recursive-find-parent-node="recursiveFindParentNode"
  47. />
  48. <!-- 结束节点 -->
  49. <EndEventNode
  50. v-if="currentNode && currentNode.type === NodeType.END_EVENT_NODE"
  51. :flow-node="currentNode"
  52. />
  53. </template>
  54. <script setup lang="ts">
  55. import StartUserNode from './nodes/StartUserNode.vue'
  56. import EndEventNode from './nodes/EndEventNode.vue'
  57. import UserTaskNode from './nodes/UserTaskNode.vue'
  58. import CopyTaskNode from './nodes/CopyTaskNode.vue'
  59. import ExclusiveNode from './nodes/ExclusiveNode.vue'
  60. import ParallelNode from './nodes/ParallelNode.vue'
  61. import InclusiveNode from './nodes/InclusiveNode.vue'
  62. import { SimpleFlowNode, NodeType } from './consts'
  63. import { useWatchNode } from './node'
  64. defineOptions({
  65. name: 'ProcessNodeTree'
  66. })
  67. const props = defineProps({
  68. parentNode: {
  69. type: Object as () => SimpleFlowNode,
  70. default: () => null
  71. },
  72. flowNode: {
  73. type: Object as () => SimpleFlowNode,
  74. default: () => null
  75. }
  76. })
  77. const emits = defineEmits<{
  78. 'update:flowNode': [node: SimpleFlowNode | undefined]
  79. 'find:recursiveFindParentNode': [
  80. nodeList: SimpleFlowNode[],
  81. curentNode: SimpleFlowNode,
  82. nodeType: number
  83. ]
  84. }>()
  85. const currentNode = useWatchNode(props)
  86. // 用于删除节点
  87. const handleModelValueUpdate = (updateValue) => {
  88. emits('update:flowNode', updateValue)
  89. }
  90. const findFromParentNode = (nodeList: SimpleFlowNode[], nodeType: number) => {
  91. emits('find:recursiveFindParentNode', nodeList, props.parentNode, nodeType)
  92. }
  93. // 递归从父节点中查询匹配的节点
  94. const recursiveFindParentNode = (
  95. nodeList: SimpleFlowNode[],
  96. findNode: SimpleFlowNode,
  97. nodeType: number
  98. ) => {
  99. if (!findNode) {
  100. return
  101. }
  102. if (findNode.type === NodeType.START_USER_NODE) {
  103. nodeList.push(findNode)
  104. return
  105. }
  106. if (findNode.type === nodeType) {
  107. nodeList.push(findNode)
  108. }
  109. emits('find:recursiveFindParentNode', nodeList, props.parentNode, nodeType)
  110. }
  111. </script>
  112. <style lang="scss" scoped></style>