diff --git a/src/components/SimpleProcessDesignerV2/src/SimpleProcessDesigner.vue b/src/components/SimpleProcessDesignerV2/src/SimpleProcessDesigner.vue index 6b5ff997..bc952d74 100644 --- a/src/components/SimpleProcessDesignerV2/src/SimpleProcessDesigner.vue +++ b/src/components/SimpleProcessDesignerV2/src/SimpleProcessDesigner.vue @@ -38,12 +38,21 @@ import * as UserGroupApi from '@/api/bpm/userGroup' defineOptions({ name: 'SimpleProcessDesigner' }) + const emits = defineEmits(['success']) // 保存成功事件 const props = defineProps({ modelId: { type: String, - required: true + required: false + }, + modelKey: { + type: String, + required: false + }, + modelName: { + type: String, + required: false } }) @@ -69,6 +78,33 @@ const message = useMessage() // 国际化 const processNodeTree = ref() const errorDialogVisible = ref(false) let errorNodes: SimpleFlowNode[] = [] + +// 添加更新模型的方法 +const updateModel = (key?: string, name?: string) => { + if (!processNodeTree.value) { + processNodeTree.value = { + name: name || '发起人', + type: NodeType.START_USER_NODE, + id: NodeId.START_USER_NODE_ID, + childNode: { + id: NodeId.END_EVENT_NODE_ID, + name: '结束', + type: NodeType.END_EVENT_NODE + } + } + } else if (name) { + // 更新现有模型的名称 + processNodeTree.value.name = name + } +} + +// 监听属性变化 +watch([() => props.modelKey, () => props.modelName], ([newKey, newName]) => { + if (!props.modelId && newKey && newName) { + updateModel(newKey, newName) + } +}, { immediate: true, deep: true }) + const saveSimpleFlowModel = async (simpleModelNode: SimpleFlowNode) => { if (!simpleModelNode) { message.error('模型数据为空') @@ -76,21 +112,28 @@ const saveSimpleFlowModel = async (simpleModelNode: SimpleFlowNode) => { } try { loading.value = true - const data = { - id: props.modelId, - simpleModel: simpleModelNode - } - const result = await updateBpmSimpleModel(data) - if (result) { - message.success('修改成功') - emits('success') + if (props.modelId) { + // 编辑模式 + const data = { + id: props.modelId, + simpleModel: simpleModelNode + } + const result = await updateBpmSimpleModel(data) + if (result) { + message.success('修改成功') + emits('success') + } else { + message.alert('修改失败') + } } else { - message.alert('修改失败') + // 新建模式,直接返回数据 + emits('success', simpleModelNode) } } finally { loading.value = false } } + // 校验节点设置。 暂时以 showText 为空 未节点错误配置 const validateNode = (node: SimpleFlowNode | undefined, errorNodes: SimpleFlowNode[]) => { if (node) { @@ -134,12 +177,14 @@ onMounted(async () => { try { loading.value = true // 获取表单字段 - const bpmnModel = await getModel(props.modelId) - if (bpmnModel) { - formType.value = bpmnModel.formType - if (formType.value === 10) { - const bpmnForm = (await getForm(bpmnModel.formId)) as unknown as FormVO - formFields.value = bpmnForm?.fields + if (props.modelId) { + const bpmnModel = await getModel(props.modelId) + if (bpmnModel) { + formType.value = bpmnModel.formType + if (formType.value === 10) { + const bpmnForm = (await getForm(bpmnModel.formId)) as unknown as FormVO + formFields.value = bpmnForm?.fields + } } } // 获得角色列表 @@ -155,14 +200,18 @@ onMounted(async () => { // 获取用户组列表 userGroupOptions.value = await UserGroupApi.getUserGroupSimpleList() - //获取 SIMPLE 设计器模型 - const result = await getBpmSimpleModel(props.modelId) - if (result) { - processNodeTree.value = result - } else { - // 初始值 + if (props.modelId) { + //获取 SIMPLE 设计器模型 + const result = await getBpmSimpleModel(props.modelId) + if (result) { + processNodeTree.value = result + } + } + + // 如果没有现有模型,创建初始模型 + if (!processNodeTree.value) { processNodeTree.value = { - name: '发起人', + name: props.modelName || '发起人', type: NodeType.START_USER_NODE, id: NodeId.START_USER_NODE_ID, childNode: { diff --git a/src/components/UserSelectForm/index.vue b/src/components/UserSelectForm/index.vue index 801489b6..5ed99f86 100644 --- a/src/components/UserSelectForm/index.vue +++ b/src/components/UserSelectForm/index.vue @@ -39,7 +39,7 @@ + + diff --git a/src/views/bpm/model/ModelForm.vue b/src/views/bpm/model/ModelForm.vue index 16d3c1d6..6d8b9e21 100644 --- a/src/views/bpm/model/ModelForm.vue +++ b/src/views/bpm/model/ModelForm.vue @@ -123,29 +123,69 @@ - + - + + + +
+
+ + + {{ user.nickname.substring(0, 1) }} + + {{ user.nickname }} + +
+ + 选择人员 + +
- - - + + + + + +
+
+ + + {{ user.nickname.substring(0, 1) }} + + {{ user.nickname }} + +
+ + 选择人员 + +
+ + + diff --git a/src/views/bpm/model/editor/index.vue b/src/views/bpm/model/editor/index.vue index 3e773691..322a00e9 100644 --- a/src/views/bpm/model/editor/index.vue +++ b/src/views/bpm/model/editor/index.vue @@ -3,7 +3,6 @@ () + +const emit = defineEmits(['success']) const message = useMessage() // 国际化 -const xmlString = ref(undefined) // BPMN XML -const modeler = ref(null) // BPMN Modeler +const xmlString = ref('') // BPMN XML +const modeler = shallowRef() // BPMN Modeler +const processDesigner = ref() +const isModelerReady = ref(false) const controlForm = ref({ simulation: true, labelEditing: false, @@ -50,60 +58,142 @@ const controlForm = ref({ }) const model = ref() // 流程模型的信息 +// 初始化 bpmnInstances +const initBpmnInstances = () => { + if (!modeler.value) return false + try { + const instances = { + modeler: modeler.value, + modeling: modeler.value.get('modeling'), + moddle: modeler.value.get('moddle'), + eventBus: modeler.value.get('eventBus'), + bpmnFactory: modeler.value.get('bpmnFactory'), + elementFactory: modeler.value.get('elementFactory'), + elementRegistry: modeler.value.get('elementRegistry'), + replace: modeler.value.get('replace'), + selection: modeler.value.get('selection') + } + + // 检查所有实例是否都存在 + return Object.values(instances).every(instance => instance) + } catch (error) { + console.error('初始化 bpmnInstances 失败:', error) + return false + } +} + /** 初始化 modeler */ -const initModeler = (item) => { - setTimeout(() => { +const initModeler = async (item) => { + try { modeler.value = item - }, 10) + // 等待 modeler 初始化完成 + await nextTick() + + // 确保 modeler 的所有实例都已经准备好 + if (initBpmnInstances()) { + isModelerReady.value = true + if (!props.modelId && props.modelKey && props.modelName) { + await updateModelData(props.modelKey, props.modelName) + } + } else { + console.error('modeler 实例未完全初始化') + } + } catch (error) { + console.error('初始化 modeler 失败:', error) + } +} + +/** 获取默认的BPMN XML */ +const getDefaultBpmnXml = (key: string, name: string) => { + return ` + + + + + +` } /** 添加/修改模型 */ const save = async (bpmnXml: string) => { - const data = { - ...model.value, - bpmnXml: bpmnXml // bpmnXml 只是初始化流程图,后续修改无法通过它获得 - } as unknown as ModelApi.ModelVO - // 提交 - if (data.id) { - await ModelApi.updateModelBpmn(data) - message.success('修改成功') - } else { - await ModelApi.updateModelBpmn(data) - message.success('新增成功') + try { + if (props.modelId) { + // 编辑模式 + const data = { + ...model.value, + bpmnXml: bpmnXml + } as unknown as ModelApi.ModelVO + await ModelApi.updateModelBpmn(data) + emit('success') + } else { + // 新建模式,直接返回XML + emit('success', bpmnXml) + } + } catch (error) { + console.error('保存失败:', error) + message.error('保存失败') } - // 跳转回去 - close() -} - -/** 关闭按钮 */ -const close = () => { - router.push({ path: '/bpm/manager/model' }) } /** 初始化 */ onMounted(async () => { - const modelId = query.modelId as unknown as number - if (!modelId) { - message.error('缺少模型 modelId 编号') - return + try { + if (props.modelId) { + // 编辑模式 + // 查询模型 + const data = await ModelApi.getModel(props.modelId) + model.value = { + ...data, + bpmnXml: undefined // 清空 bpmnXml 属性 + } + xmlString.value = data.bpmnXml || getDefaultBpmnXml(data.key, data.name) + } else if (props.modelKey && props.modelName) { + // 新建模式 + xmlString.value = getDefaultBpmnXml(props.modelKey, props.modelName) + model.value = { + key: props.modelKey, + name: props.modelName + } as ModelApi.ModelVO + } + } catch (error) { + console.error('初始化失败:', error) + message.error('初始化失败') } - // 查询模型 - const data = await ModelApi.getModel(modelId) - if (!data.bpmnXml) { - // 首次创建的 Model 模型,它是没有 bpmnXml,此时需要给它一个默认的 - data.bpmnXml = ` - - - - - -` +}) + +// 更新模型数据 +const updateModelData = async (key?: string, name?: string) => { + if (key && name) { + xmlString.value = getDefaultBpmnXml(key, name) + model.value = { + ...model.value, + key: key, + name: name + } as ModelApi.ModelVO + // 确保更新后重新渲染 + await nextTick() + if (processDesigner.value?.refresh) { + processDesigner.value.refresh() + } } - model.value = { - ...data, - bpmnXml: undefined // 清空 bpmnXml 属性 +} + +// 监听key和name的变化 +watch([() => props.modelKey, () => props.modelName], async ([newKey, newName]) => { + if (!props.modelId && newKey && newName && modeler.value) { + await updateModelData(newKey, newName) + } +}, { immediate: true, deep: true }) + +// 在组件卸载时清理 +onBeforeUnmount(() => { + isModelerReady.value = false + modeler.value = null + // 清理全局实例 + const w = window as any + if (w.bpmnInstances) { + w.bpmnInstances = null } - xmlString.value = data.bpmnXml })