|  | @@ -1,58 +1,103 @@
 | 
	
		
			
				|  |  |  <template>
 | 
	
		
			
				|  |  |    <!-- 开始节点 -->
 | 
	
		
			
				|  |  |    <StartEventNode
 | 
	
		
			
				|  |  | -        v-if="currentNode && currentNode.type === NodeType.START_EVENT_NODE" 
 | 
	
		
			
				|  |  | -        :flow-node ="currentNode" 
 | 
	
		
			
				|  |  | -        @update:model-value="handleModelValueUpdate" />
 | 
	
		
			
				|  |  | +    v-if="currentNode && currentNode.type === NodeType.START_EVENT_NODE"
 | 
	
		
			
				|  |  | +    :flow-node="currentNode"
 | 
	
		
			
				|  |  | +    @update:model-value="handleModelValueUpdate"
 | 
	
		
			
				|  |  | +  />
 | 
	
		
			
				|  |  |    <!-- 审批节点 -->
 | 
	
		
			
				|  |  | -  <UserTaskNode 
 | 
	
		
			
				|  |  | -        v-if="currentNode && currentNode.type === NodeType.USER_TASK_NODE" 
 | 
	
		
			
				|  |  | -        :flow-node ="currentNode" @update:model-value="handleModelValueUpdate"/>
 | 
	
		
			
				|  |  | +  <UserTaskNode
 | 
	
		
			
				|  |  | +    v-if="currentNode && currentNode.type === NodeType.USER_TASK_NODE"
 | 
	
		
			
				|  |  | +    :flow-node="currentNode"
 | 
	
		
			
				|  |  | +    @update:model-value="handleModelValueUpdate"
 | 
	
		
			
				|  |  | +    @find:parent-node="findFromParentNode"
 | 
	
		
			
				|  |  | +  />
 | 
	
		
			
				|  |  |    <!-- 抄送节点 -->
 | 
	
		
			
				|  |  |    <CopyTaskNode
 | 
	
		
			
				|  |  | -        v-if="currentNode && currentNode.type === NodeType.COPY_TASK_NODE" 
 | 
	
		
			
				|  |  | -        :flow-node ="currentNode" @update:model-value="handleModelValueUpdate"/>
 | 
	
		
			
				|  |  | +    v-if="currentNode && currentNode.type === NodeType.COPY_TASK_NODE"
 | 
	
		
			
				|  |  | +    :flow-node="currentNode"
 | 
	
		
			
				|  |  | +    @update:model-value="handleModelValueUpdate"
 | 
	
		
			
				|  |  | +  />
 | 
	
		
			
				|  |  |    <!-- 条件节点 -->
 | 
	
		
			
				|  |  | -  <ExclusiveNode 
 | 
	
		
			
				|  |  | -        v-if="currentNode && currentNode.type === NodeType.EXCLUSIVE_NODE" 
 | 
	
		
			
				|  |  | -        :flow-node ="currentNode" @update:model-value="handleModelValueUpdate"/>
 | 
	
		
			
				|  |  | +  <ExclusiveNode
 | 
	
		
			
				|  |  | +    v-if="currentNode && currentNode.type === NodeType.EXCLUSIVE_NODE"
 | 
	
		
			
				|  |  | +    :flow-node="currentNode"
 | 
	
		
			
				|  |  | +    @update:model-value="handleModelValueUpdate"
 | 
	
		
			
				|  |  | +    @find:parent-node="findFromParentNode"
 | 
	
		
			
				|  |  | +  />
 | 
	
		
			
				|  |  |    <!-- 递归显示孩子节点  -->
 | 
	
		
			
				|  |  | -  <ProcessNodeTree v-if="currentNode && currentNode.childNode"  v-model:flow-node="currentNode.childNode"/>
 | 
	
		
			
				|  |  | +  <ProcessNodeTree
 | 
	
		
			
				|  |  | +    v-if="currentNode && currentNode.childNode"
 | 
	
		
			
				|  |  | +    v-model:flow-node="currentNode.childNode"
 | 
	
		
			
				|  |  | +    :parent-node= "currentNode"
 | 
	
		
			
				|  |  | +    @find:recursive-find-parent-node="recursiveFindParentNode"
 | 
	
		
			
				|  |  | +  />
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    <!-- 结束节点 -->
 | 
	
		
			
				|  |  | -  <EndEventNode v-if="currentNode && currentNode.type === NodeType.END_EVENT_NODE"/>
 | 
	
		
			
				|  |  | +  <EndEventNode v-if="currentNode && currentNode.type === NodeType.END_EVENT_NODE" />
 | 
	
		
			
				|  |  |  </template>
 | 
	
		
			
				|  |  | -<script setup lang='ts'>
 | 
	
		
			
				|  |  | -import StartEventNode from './nodes/StartEventNode.vue';
 | 
	
		
			
				|  |  | -import EndEventNode from './nodes/EndEventNode.vue';
 | 
	
		
			
				|  |  | -import UserTaskNode from './nodes/UserTaskNode.vue';
 | 
	
		
			
				|  |  | -import CopyTaskNode from './nodes/CopyTaskNode.vue';
 | 
	
		
			
				|  |  | -import ExclusiveNode from './nodes/ExclusiveNode.vue';
 | 
	
		
			
				|  |  | -import { SimpleFlowNode, NodeType }  from './consts';
 | 
	
		
			
				|  |  | +<script setup lang="ts">
 | 
	
		
			
				|  |  | +import StartEventNode from './nodes/StartEventNode.vue'
 | 
	
		
			
				|  |  | +import EndEventNode from './nodes/EndEventNode.vue'
 | 
	
		
			
				|  |  | +import UserTaskNode from './nodes/UserTaskNode.vue'
 | 
	
		
			
				|  |  | +import CopyTaskNode from './nodes/CopyTaskNode.vue'
 | 
	
		
			
				|  |  | +import ExclusiveNode from './nodes/ExclusiveNode.vue'
 | 
	
		
			
				|  |  | +import { SimpleFlowNode, NodeType } from './consts'
 | 
	
		
			
				|  |  |  defineOptions({
 | 
	
		
			
				|  |  |    name: 'ProcessNodeTree'
 | 
	
		
			
				|  |  |  })
 | 
	
		
			
				|  |  |  const props = defineProps({
 | 
	
		
			
				|  |  | -  flowNode : {
 | 
	
		
			
				|  |  | +  parentNode: {
 | 
	
		
			
				|  |  |      type: Object as () => SimpleFlowNode,
 | 
	
		
			
				|  |  | -    default: () => null 
 | 
	
		
			
				|  |  | +    default: () => null
 | 
	
		
			
				|  |  | +  },
 | 
	
		
			
				|  |  | +  flowNode: {
 | 
	
		
			
				|  |  | +    type: Object as () => SimpleFlowNode,
 | 
	
		
			
				|  |  | +    default: () => null
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  })
 | 
	
		
			
				|  |  | -const emits = defineEmits(['update:flowNode'])
 | 
	
		
			
				|  |  | +const emits = defineEmits<{
 | 
	
		
			
				|  |  | +  'update:flowNode',
 | 
	
		
			
				|  |  | +  'find:recursiveFindParentNode': [nodeList: SimpleFlowNode[], curentNode: SimpleFlowNode, nodeType: number]
 | 
	
		
			
				|  |  | +}>()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -const currentNode = ref<SimpleFlowNode>(props.flowNode);
 | 
	
		
			
				|  |  | +const currentNode = ref<SimpleFlowNode>(props.flowNode)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // 重要:监控节点变化. 重新绘制节点
 | 
	
		
			
				|  |  | -watch(() => props.flowNode, (newValue) => {  
 | 
	
		
			
				|  |  | -  currentNode.value = newValue;  
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -);
 | 
	
		
			
				|  |  | +watch(
 | 
	
		
			
				|  |  | +  () => props.flowNode,
 | 
	
		
			
				|  |  | +  (newValue) => {
 | 
	
		
			
				|  |  | +    currentNode.value = newValue
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  const handleModelValueUpdate = (updateValue) => {
 | 
	
		
			
				|  |  |    console.log('Process Node Tree handleModelValueUpdate', updateValue)
 | 
	
		
			
				|  |  | -  emits('update:flowNode', updateValue);
 | 
	
		
			
				|  |  | -} 
 | 
	
		
			
				|  |  | -</script>
 | 
	
		
			
				|  |  | -<style lang='scss' scoped>
 | 
	
		
			
				|  |  | +  emits('update:flowNode', updateValue)
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -</style>
 | 
	
		
			
				|  |  | +const findFromParentNode = (
 | 
	
		
			
				|  |  | +  nodeList: SimpleFlowNode[],
 | 
	
		
			
				|  |  | +  nodeType: number
 | 
	
		
			
				|  |  | +) => {
 | 
	
		
			
				|  |  | +  emits('find:recursiveFindParentNode', nodeList, props.parentNode, nodeType)
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// 递归从父节点中查询匹配的节点
 | 
	
		
			
				|  |  | +const recursiveFindParentNode = (
 | 
	
		
			
				|  |  | +  nodeList: SimpleFlowNode[],
 | 
	
		
			
				|  |  | +  findNode: SimpleFlowNode,
 | 
	
		
			
				|  |  | +  nodeType: number
 | 
	
		
			
				|  |  | +) => {
 | 
	
		
			
				|  |  | +  if (!findNode || findNode.type === NodeType.START_EVENT_NODE) {
 | 
	
		
			
				|  |  | +    return
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if (findNode.type === nodeType) {
 | 
	
		
			
				|  |  | +    nodeList.push(findNode)
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  emits('find:recursiveFindParentNode', nodeList, props.parentNode, nodeType)
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +</script>
 | 
	
		
			
				|  |  | +<style lang="scss" scoped></style>
 |