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