From a1d7e81859f554f3a53680cc35f0f49bf1f77098 Mon Sep 17 00:00:00 2001
From: wwf <1971391498@qq.com>
Date: 星期四, 14 五月 2026 14:37:02 +0800
Subject: [PATCH] 导入项目

---
 src/views/bpm/processInstance/detail/ProcessInstanceSimpleViewer.vue |  174 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 174 insertions(+), 0 deletions(-)

diff --git a/src/views/bpm/processInstance/detail/ProcessInstanceSimpleViewer.vue b/src/views/bpm/processInstance/detail/ProcessInstanceSimpleViewer.vue
new file mode 100644
index 0000000..87f8119
--- /dev/null
+++ b/src/views/bpm/processInstance/detail/ProcessInstanceSimpleViewer.vue
@@ -0,0 +1,174 @@
+<template>
+  <div v-loading="loading" class="process-viewer-container">
+    <SimpleProcessViewer
+      :flow-node="simpleModel"
+      :tasks="tasks"
+      :process-instance="processInstance"
+    />
+  </div>
+</template>
+<script lang="ts" setup>
+import { propTypes } from '@/utils/propTypes'
+import { TaskStatusEnum } from '@/api/bpm/task'
+import { SimpleFlowNode, NodeType } from '@/components/SimpleProcessDesignerV2/src/consts'
+import { SimpleProcessViewer } from '@/components/SimpleProcessDesignerV2/src/'
+defineOptions({ name: 'BpmProcessInstanceSimpleViewer' })
+
+const props = defineProps({
+  loading: propTypes.bool.def(false), // 鏄惁鍔犺浇涓�
+  modelView: propTypes.object,
+  simpleJson: propTypes.string // Simple 妯″瀷缁撴瀯鏁版嵁 (json 鏍煎紡)
+})
+const simpleModel = ref<any>({})
+// 鐢ㄦ埛浠诲姟
+const tasks = ref([])
+// 娴佺▼瀹炰緥
+const processInstance = ref()
+
+/** 鐩戞帶妯″瀷瑙嗗浘 鍖呮嫭浠诲姟鍒楄〃銆佽繘琛屼腑鐨勬椿鍔ㄨ妭鐐圭紪鍙风瓑 */
+watch(
+  () => props.modelView,
+  async (newModelView) => {
+    if (newModelView) {
+      tasks.value = newModelView.tasks
+      processInstance.value = newModelView.processInstance
+      // 宸茬粡鎷掔粷鐨勬椿鍔ㄨ妭鐐圭紪鍙烽泦鍚堬紝鍙寘鎷� UserTask
+      const rejectedTaskActivityIds: string[] = newModelView.rejectedTaskActivityIds
+      // 杩涜涓殑娲诲姩鑺傜偣缂栧彿闆嗗悎锛� 鍙寘鎷� UserTask
+      const unfinishedTaskActivityIds: string[] = newModelView.unfinishedTaskActivityIds
+      // 宸茬粡瀹屾垚鐨勬椿鍔ㄨ妭鐐圭紪鍙烽泦鍚堬紝 鍖呮嫭 UserTask銆丟ateway 绛�
+      const finishedActivityIds: string[] = newModelView.finishedTaskActivityIds
+      // 宸茬粡瀹屾垚鐨勮繛绾胯妭鐐圭紪鍙烽泦鍚堬紝鍙寘鎷� SequenceFlow
+      const finishedSequenceFlowActivityIds: string[] = newModelView.finishedSequenceFlowActivityIds
+      setSimpleModelNodeTaskStatus(
+        newModelView.simpleModel,
+        newModelView.processInstance?.status,
+        rejectedTaskActivityIds,
+        unfinishedTaskActivityIds,
+        finishedActivityIds,
+        finishedSequenceFlowActivityIds
+      )
+      simpleModel.value = newModelView.simpleModel ? newModelView.simpleModel : {}
+    }
+  }
+)
+/** 鐩戞帶妯″瀷缁撴瀯鏁版嵁 */
+watch(
+  () => props.simpleJson,
+  async (value) => {
+    if (value) {
+      simpleModel.value = JSON.parse(value)
+    }
+  }
+)
+const setSimpleModelNodeTaskStatus = (
+  simpleModel: SimpleFlowNode | undefined,
+  processStatus: number,
+  rejectedTaskActivityIds: string[],
+  unfinishedTaskActivityIds: string[],
+  finishedActivityIds: string[],
+  finishedSequenceFlowActivityIds: string[]
+) => {
+  if (!simpleModel) {
+    return
+  }
+  // 缁撴潫鑺傜偣
+  if (simpleModel.type === NodeType.END_EVENT_NODE) {
+    if (finishedActivityIds.includes(simpleModel.id)) {
+      simpleModel.activityStatus = processStatus
+    } else {
+      simpleModel.activityStatus = TaskStatusEnum.NOT_START
+    }
+    return
+  }
+  // 瀹℃壒鑺傜偣
+  if (
+    simpleModel.type === NodeType.START_USER_NODE ||
+    simpleModel.type === NodeType.USER_TASK_NODE ||
+    simpleModel.type === NodeType.TRANSACTOR_NODE ||
+    simpleModel.type === NodeType.CHILD_PROCESS_NODE
+  ) {
+    simpleModel.activityStatus = TaskStatusEnum.NOT_START
+    if (rejectedTaskActivityIds.includes(simpleModel.id)) {
+      simpleModel.activityStatus = TaskStatusEnum.REJECT
+    } else if (unfinishedTaskActivityIds.includes(simpleModel.id)) {
+      simpleModel.activityStatus = TaskStatusEnum.RUNNING
+    } else if (finishedActivityIds.includes(simpleModel.id)) {
+      simpleModel.activityStatus = TaskStatusEnum.APPROVE
+    }
+    // TODO 鏄笉鏄繕缂轰竴涓� cancel 鐨勭姸鎬�
+  }
+  // 鎶勯�佽妭鐐�
+  if (simpleModel.type === NodeType.COPY_TASK_NODE) {
+    // 鎶勯�佽妭鐐�,鍙湁閫氳繃鍜屾湭鎵ц鐘舵��
+    if (finishedActivityIds.includes(simpleModel.id)) {
+      simpleModel.activityStatus = TaskStatusEnum.APPROVE
+    } else {
+      simpleModel.activityStatus = TaskStatusEnum.NOT_START
+    }
+  }
+  // 寤惰繜鍣ㄨ妭鐐�
+  if (simpleModel.type === NodeType.DELAY_TIMER_NODE) {
+    // 寤惰繜鍣ㄨ妭鐐�,鍙湁閫氳繃鍜屾湭鎵ц鐘舵��
+    if (finishedActivityIds.includes(simpleModel.id)) {
+      simpleModel.activityStatus = TaskStatusEnum.APPROVE
+    } else {
+      simpleModel.activityStatus = TaskStatusEnum.NOT_START
+    }
+  }
+  // 瑙﹀彂鍣ㄨ妭鐐�
+  if (simpleModel.type === NodeType.TRIGGER_NODE) {
+    // 瑙﹀彂鍣ㄨ妭鐐�,鍙湁閫氳繃鍜屾湭鎵ц鐘舵��
+    if (finishedActivityIds.includes(simpleModel.id)) {
+      simpleModel.activityStatus = TaskStatusEnum.APPROVE
+    } else {
+      simpleModel.activityStatus = TaskStatusEnum.NOT_START
+    }
+  }
+
+  // 鏉′欢鑺傜偣瀵瑰簲 SequenceFlow
+  if (simpleModel.type === NodeType.CONDITION_NODE) {
+    // 鏉′欢鑺傜偣,鍙湁閫氳繃鍜屾湭鎵ц鐘舵��
+    if (finishedSequenceFlowActivityIds.includes(simpleModel.id)) {
+      simpleModel.activityStatus = TaskStatusEnum.APPROVE
+    } else {
+      simpleModel.activityStatus = TaskStatusEnum.NOT_START
+    }
+  }
+  // 缃戝叧鑺傜偣
+  if (
+    simpleModel.type === NodeType.CONDITION_BRANCH_NODE ||
+    simpleModel.type === NodeType.PARALLEL_BRANCH_NODE ||
+    simpleModel.type === NodeType.INCLUSIVE_BRANCH_NODE ||
+    simpleModel.type === NodeType.ROUTER_BRANCH_NODE
+  ) {
+    // 缃戝叧鑺傜偣銆傚彧鏈夐�氳繃鍜屾湭鎵ц鐘舵��
+    if (finishedActivityIds.includes(simpleModel.id)) {
+      simpleModel.activityStatus = TaskStatusEnum.APPROVE
+    } else {
+      simpleModel.activityStatus = TaskStatusEnum.NOT_START
+    }
+    simpleModel.conditionNodes?.forEach((node) => {
+      setSimpleModelNodeTaskStatus(
+        node,
+        processStatus,
+        rejectedTaskActivityIds,
+        unfinishedTaskActivityIds,
+        finishedActivityIds,
+        finishedSequenceFlowActivityIds
+      )
+    })
+  }
+
+  setSimpleModelNodeTaskStatus(
+    simpleModel.childNode,
+    processStatus,
+    rejectedTaskActivityIds,
+    unfinishedTaskActivityIds,
+    finishedActivityIds,
+    finishedSequenceFlowActivityIds
+  )
+}
+</script>
+
+<style lang="scss" scoped></style>

--
Gitblit v1.8.0