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

---
 src/components/bpmnProcessDesigner/package/penal/signal-message/SignalAndMessage.vue |  264 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 264 insertions(+), 0 deletions(-)

diff --git a/src/components/bpmnProcessDesigner/package/penal/signal-message/SignalAndMessage.vue b/src/components/bpmnProcessDesigner/package/penal/signal-message/SignalAndMessage.vue
new file mode 100644
index 0000000..7dad24a
--- /dev/null
+++ b/src/components/bpmnProcessDesigner/package/penal/signal-message/SignalAndMessage.vue
@@ -0,0 +1,264 @@
+<template>
+  <div class="panel-tab__content">
+    <div class="panel-tab__content--title">
+      <span><Icon icon="ep:menu" style="margin-right: 8px; color: #555" />娑堟伅鍒楄〃</span>
+      <XButton type="primary" title="鍒涘缓鏂版秷鎭�" preIcon="ep:plus" @click="openModel('message')" />
+    </div>
+    <el-table :data="messageList" border>
+      <el-table-column type="index" label="搴忓彿" width="60px" />
+      <el-table-column label="娑堟伅ID" prop="id" min-width="120px" show-overflow-tooltip />
+      <el-table-column label="娑堟伅鍚嶇О" prop="name" min-width="120px" show-overflow-tooltip />
+      <el-table-column label="鎿嶄綔" width="110px">
+        <!-- 琛ュ厖鈥滅紪杈戔�濄�佲�滅Щ闄も�濆姛鑳姐�傜浉鍏� issue锛歨ttps://github.com/YunaiV/yudao-cloud/issues/270 -->
+        <template #default="scope">
+          <el-button link @click="openEditModel('message', scope.row, scope.$index)" size="small">
+            缂栬緫
+          </el-button>
+          <el-divider direction="vertical" />
+          <el-button
+            link
+            size="small"
+            style="color: #ff4d4f"
+            @click="removeObject('message', scope.row)"
+          >
+            绉婚櫎
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div
+      class="panel-tab__content--title"
+      style="padding-top: 8px; margin-top: 8px; border-top: 1px solid #eee"
+    >
+      <span><Icon icon="ep:menu" style="margin-right: 8px; color: #555" />淇″彿鍒楄〃</span>
+      <XButton type="primary" title="鍒涘缓鏂颁俊鍙�" preIcon="ep:plus" @click="openModel('signal')" />
+    </div>
+    <el-table :data="signalList" border>
+      <el-table-column type="index" label="搴忓彿" width="60px" />
+      <el-table-column label="淇″彿ID" prop="id" min-width="120px" show-overflow-tooltip />
+      <el-table-column label="淇″彿鍚嶇О" prop="name" min-width="120px" show-overflow-tooltip />
+      <el-table-column label="鎿嶄綔" width="110px">
+        <template #default="scope">
+          <el-button link @click="openEditModel('signal', scope.row, scope.$index)" size="small">
+            缂栬緫
+          </el-button>
+          <el-divider direction="vertical" />
+          <el-button
+            link
+            size="small"
+            style="color: #ff4d4f"
+            @click="removeObject('signal', scope.row)"
+          >
+            绉婚櫎
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <el-dialog
+      v-model="dialogVisible"
+      :title="modelConfig.title"
+      :close-on-click-modal="false"
+      width="400px"
+      append-to-body
+      destroy-on-close
+    >
+      <el-form :model="modelObjectForm" label-width="90px">
+        <el-form-item :label="modelConfig.idLabel">
+          <el-input v-model="modelObjectForm.id" clearable />
+        </el-form-item>
+        <el-form-item :label="modelConfig.nameLabel">
+          <el-input v-model="modelObjectForm.name" clearable />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="addNewObject">淇� 瀛�</el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+<script lang="ts" setup>
+import { ElMessageBox } from 'element-plus'
+defineOptions({ name: 'SignalAndMassage' })
+
+const message = useMessage()
+const signalList = ref<any[]>([])
+const messageList = ref<any[]>([])
+const dialogVisible = ref(false)
+const modelType = ref('')
+const modelObjectForm = ref<any>({})
+const rootElements = ref()
+const messageIdMap = ref()
+const signalIdMap = ref()
+const editingIndex = ref(-1) // 姝e湪缂栬緫鐨勭储寮曪紝-1 琛ㄧず鏂板缓
+const modelConfig = computed(() => {
+  const isEdit = editingIndex.value !== -1
+  if (modelType.value === 'message') {
+    return {
+      title: isEdit ? '缂栬緫娑堟伅' : '鍒涘缓娑堟伅',
+      idLabel: '娑堟伅ID',
+      nameLabel: '娑堟伅鍚嶇О'
+    }
+  } else {
+    return {
+      title: isEdit ? '缂栬緫淇″彿' : '鍒涘缓淇″彿',
+      idLabel: '淇″彿ID',
+      nameLabel: '淇″彿鍚嶇О'
+    }
+  }
+})
+const bpmnInstances = () => (window as any)?.bpmnInstances
+
+// 鐢熸垚瑙勮寖鍖栫殑ID
+const generateStandardId = (type: string): string => {
+  const prefix = type === 'message' ? 'Message_' : 'Signal_'
+  const timestamp = Date.now()
+  const random = Math.random().toString(36).substring(2, 6).toUpperCase()
+  return `${prefix}${timestamp}_${random}`
+}
+
+const initDataList = () => {
+  console.log(window, 'window')
+  rootElements.value = bpmnInstances().modeler.getDefinitions().rootElements
+  messageIdMap.value = {}
+  signalIdMap.value = {}
+  messageList.value = []
+  signalList.value = []
+  rootElements.value.forEach((el) => {
+    if (el.$type === 'bpmn:Message') {
+      messageIdMap.value[el.id] = true
+      messageList.value.push({ ...el })
+    }
+    if (el.$type === 'bpmn:Signal') {
+      signalIdMap.value[el.id] = true
+      signalList.value.push({ ...el })
+    }
+  })
+}
+const openModel = (type) => {
+  modelType.value = type
+  editingIndex.value = -1
+  modelObjectForm.value = {
+    id: generateStandardId(type),
+    name: ''
+  }
+  dialogVisible.value = true
+}
+
+const openEditModel = (type, row, index) => {
+  modelType.value = type
+  editingIndex.value = index
+  modelObjectForm.value = { ...row }
+  dialogVisible.value = true
+}
+const addNewObject = () => {
+  if (modelType.value === 'message') {
+    // 缂栬緫妯″紡
+    if (editingIndex.value !== -1) {
+      const targetMessage = messageList.value[editingIndex.value]
+      // 鏌ユ壘 rootElements 涓殑鍘熷瀵硅薄
+      const rootMessage = rootElements.value.find(
+        (el) => el.$type === 'bpmn:Message' && el.id === targetMessage.id
+      )
+      if (rootMessage) {
+        rootMessage.id = modelObjectForm.value.id
+        rootMessage.name = modelObjectForm.value.name
+      }
+    } else {
+      // 鏂板缓妯″紡
+      if (messageIdMap.value[modelObjectForm.value.id]) {
+        message.error('璇ユ秷鎭凡瀛樺湪锛岃淇敼id鍚庨噸鏂颁繚瀛�')
+        return
+      }
+      const messageRef = bpmnInstances().moddle.create('bpmn:Message', modelObjectForm.value)
+      rootElements.value.push(messageRef)
+    }
+  } else {
+    // 缂栬緫妯″紡
+    if (editingIndex.value !== -1) {
+      const targetSignal = signalList.value[editingIndex.value]
+      // 鏌ユ壘 rootElements 涓殑鍘熷瀵硅薄
+      const rootSignal = rootElements.value.find(
+        (el) => el.$type === 'bpmn:Signal' && el.id === targetSignal.id
+      )
+      if (rootSignal) {
+        rootSignal.id = modelObjectForm.value.id
+        rootSignal.name = modelObjectForm.value.name
+      }
+    } else {
+      // 鏂板缓妯″紡
+      if (signalIdMap.value[modelObjectForm.value.id]) {
+        message.error('璇ヤ俊鍙峰凡瀛樺湪锛岃淇敼id鍚庨噸鏂颁繚瀛�')
+        return
+      }
+      const signalRef = bpmnInstances().moddle.create('bpmn:Signal', modelObjectForm.value)
+      rootElements.value.push(signalRef)
+    }
+  }
+  dialogVisible.value = false
+  // 瑙﹀彂寤烘ā鍣ㄦ洿鏂颁互淇濆瓨鏇存敼
+  saveChanges()
+  initDataList()
+}
+
+const removeObject = (type, row) => {
+  ElMessageBox.confirm(`纭绉婚櫎璇�${type === 'message' ? '娑堟伅' : '淇″彿'}鍚楋紵`, '鎻愮ず', {
+    confirmButtonText: '纭� 璁�',
+    cancelButtonText: '鍙� 娑�'
+  })
+    .then(() => {
+      // 浠� rootElements 涓Щ闄�
+      const targetType = type === 'message' ? 'bpmn:Message' : 'bpmn:Signal'
+      const elementIndex = rootElements.value.findIndex(
+        (el) => el.$type === targetType && el.id === row.id
+      )
+      if (elementIndex !== -1) {
+        rootElements.value.splice(elementIndex, 1)
+      }
+      // 瑙﹀彂寤烘ā鍣ㄦ洿鏂颁互淇濆瓨鏇存敼
+      saveChanges()
+      // 鍒锋柊鍒楄〃
+      initDataList()
+      message.success('绉婚櫎鎴愬姛')
+    })
+    .catch(() => console.info('鎿嶄綔鍙栨秷'))
+}
+
+// 瑙﹀彂寤烘ā鍣ㄦ洿鏂颁互淇濆瓨鏇存敼
+const saveChanges = () => {
+  const modeler = bpmnInstances().modeler
+  if (!modeler) return
+
+  try {
+    // 鑾峰彇 canvas锛岄�氳繃瀹冩潵瑙﹀彂鍥捐〃鐨勯噸鏂版覆鏌�
+    const canvas = modeler.get('canvas')
+
+    // 鑾峰彇鏍瑰厓绱狅紙Process锛�
+    const rootElement = canvas.getRootElement()
+
+    // 瑙﹀彂 changed 浜嬩欢锛岄�氱煡寤烘ā鍣ㄦ暟鎹凡鏇存敼
+    const eventBus = modeler.get('eventBus')
+    if (eventBus) {
+      eventBus.fire('root.added', { element: rootElement })
+      eventBus.fire('elements.changed', { elements: [rootElement] })
+    }
+
+    // 鏍囪寤烘ā鍣ㄤ负宸蹭慨鏀圭姸鎬�
+    const commandStack = modeler.get('commandStack')
+    if (commandStack && commandStack._stack) {
+      // 娣诲姞涓�涓┖鍛戒护浠ユ爣璁颁负宸蹭慨鏀�
+      commandStack.execute('element.updateProperties', {
+        element: rootElement,
+        properties: {}
+      })
+    }
+  } catch (error) {
+    console.warn('淇濆瓨鏇存敼鏃跺嚭閿�:', error)
+  }
+}
+
+onMounted(() => {
+  initDataList()
+})
+</script>

--
Gitblit v1.8.0