tuqin
2 天以前 6e19fdd9c8bd9220d1f4f3cd6d034779001d5ff9
fix(bpm): BPMN 画布设计器默认生成「发起人 → 审批人 → 结束」

问题:流程模型有两个设计器——Simple 设计器(表单式)和 BPMN 设计器(画布式)。
Simple 已修好,但 BPMN 画布打开仍是空白:
defaultEmpty.js 原本只生成一个空的 bpmn2:process,没有任何节点,
客户反馈「没有流程模型,需要配置一下」。

改动(移植自 dev_新疆_中亿装配):
1. defaultEmpty.js:默认 XML 从空 process 改为可用的最小流程骨架
发起人(StartEvent) → 审批人(UserTask) → 结束(EndEvent),
含完整 BPMNDiagram 图形坐标;并补充 flowable/camunda 扩展命名空间声明。
审批节点故意不预置办理人,由客户在右侧属性面板选择。

2. PropertiesPanel.vue:挂上「审批人」配置面板(UserTask 组件)。
此前该组件从未被挂到面板上,导致画布上选中用户任务后根本看不到审批人配置项,
发布时必然报「用户任务(xxx)未配置审批人」。

数据现状:北方科技 21 个模型中 16 个没有 XML(会走默认模板),
2 个已有节点,无「有 XML 但空节点」的情况。
已修改2个文件
68 ■■■■■ 文件已修改
src/views/bpm/components/bpmn-process-designer/package/designer/plugins/defaultEmpty.js 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/bpm/components/bpmn-process-designer/package/penal/PropertiesPanel.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/bpm/components/bpmn-process-designer/package/designer/plugins/defaultEmpty.js
@@ -1,8 +1,24 @@
/**
 * 生成默认的 BPMN 流程图 XML
 *
 * 历史问题:这里原本只生成一个空的 <bpmn2:process>,没有任何节点,
 * 打开「流程模型 → 修改 → 流程设计」时画布一片空白,客户反馈「没有流程模型,需要配置一下」。
 *
 * 现改为生成一个可用的最小流程骨架:发起人 → 审批人 → 结束,
 * 客户打开即可在画布上直接选中节点配置审批人,或继续增删节点。
 * 注意:审批节点故意不预置办理人,由客户在右侧属性面板里选择。
 */
function defaultEmpty(key, name, type) {
  if (!type) type = 'camunda';
  const TYPE_TARGET = {
    activiti: 'http://activiti.org/bpmn',
    camunda: 'http://bpmn.io/schema/bpmn',
    flowable: 'http://flowable.org/bpmn',
  };
  // 扩展属性(如 flowable:assignee)的命名空间,camunda 与 bpmn.io 的 targetNamespace 不同
  const TYPE_EXTENSION_NS = {
    activiti: 'http://activiti.org/bpmn',
    camunda: 'http://camunda.org/schema/1.0/bpmn',
    flowable: 'http://flowable.org/bpmn',
  };
  return `<?xml version="1.0" encoding="UTF-8"?>
@@ -12,12 +28,49 @@
  xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
  xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
  xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
  xmlns:${type}="${TYPE_EXTENSION_NS[type]}"
  id="diagram_${key}"
  targetNamespace="${TYPE_TARGET[type]}">
  <bpmn2:process id="${key}" name="${name}" isExecutable="true">
    <bpmn2:startEvent id="StartEvent_1" name="发起人">
      <bpmn2:outgoing>Flow_1</bpmn2:outgoing>
    </bpmn2:startEvent>
    <bpmn2:sequenceFlow id="Flow_1" sourceRef="StartEvent_1" targetRef="Activity_1" />
    <bpmn2:userTask id="Activity_1" name="审批人">
      <bpmn2:incoming>Flow_1</bpmn2:incoming>
      <bpmn2:outgoing>Flow_2</bpmn2:outgoing>
    </bpmn2:userTask>
    <bpmn2:sequenceFlow id="Flow_2" sourceRef="Activity_1" targetRef="EndEvent_1" />
    <bpmn2:endEvent id="EndEvent_1" name="结束">
      <bpmn2:incoming>Flow_2</bpmn2:incoming>
    </bpmn2:endEvent>
  </bpmn2:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="${key}">
      <bpmndi:BPMNShape id="StartEvent_1_di" bpmnElement="StartEvent_1">
        <dc:Bounds x="180" y="160" width="36" height="36" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="187" y="203" width="22" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="Activity_1_di" bpmnElement="Activity_1">
        <dc:Bounds x="280" y="138" width="100" height="80" />
        <bpmndi:BPMNLabel />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="EndEvent_1_di" bpmnElement="EndEvent_1">
        <dc:Bounds x="432" y="160" width="36" height="36" />
        <bpmndi:BPMNLabel>
          <dc:Bounds x="439" y="203" width="22" height="14" />
        </bpmndi:BPMNLabel>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="Flow_1_di" bpmnElement="Flow_1">
        <di:waypoint x="216" y="178" />
        <di:waypoint x="280" y="178" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="Flow_2_di" bpmnElement="Flow_2">
        <di:waypoint x="380" y="178" />
        <di:waypoint x="432" y="178" />
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn2:definitions>`;
src/views/bpm/components/bpmn-process-designer/package/penal/PropertiesPanel.vue
@@ -20,6 +20,10 @@
import SignalAndMassage from './signal-message/SignalAndMessage.vue';
import { getTaskCollapseItemName, isTaskCollapseItemShow } from './task/data';
import ElementTask from './task/ElementTask.vue';
// 审批人配置(规则类型:指定成员/角色/岗位/部门负责人/发起人本人…)
// 注意:这个组件此前没有被挂到面板上,导致流程设计里根本看不到审批人配置项,
// 保存后在「发布」时必然报「用户任务(xxx)未配置审批人」。
import UserTask from './task/task-components/UserTask.vue';
import TimeEventConfig from './time-event-config/TimeEventConfig.vue';
defineOptions({ name: 'MyPropertiesPanel' });
@@ -329,6 +333,17 @@
        </template>
        <ElementTask :id="elementId" :type="elementType" />
      </CollapsePanel>
      <!-- 审批人:用户任务必须配置,否则「发布」时报「用户任务(xxx)未配置审批人」 -->
      <CollapsePanel
        key="candidate"
        header="审批人"
        v-if="elementType === 'UserTask'"
      >
        <template #extra>
          <IconifyIcon icon="ep:user-filled" />
        </template>
        <UserTask :id="elementId" :type="elementType" />
      </CollapsePanel>
      <CollapsePanel
        key="multiInstance"
        header="多人审批方式"