lucw 9 месяцев назад
Родитель
Сommit
bd95e64df7
2 измененных файлов с 536 добавлено и 471 удалено
  1. 534 469
      src/components/bpmnProcessDesigner/package/designer/ProcessViewer.vue
  2. 2 2
      vue.config.js

+ 534 - 469
src/components/bpmnProcessDesigner/package/designer/ProcessViewer.vue

@@ -7,520 +7,585 @@
 </template>
 
 <script>
-import BpmnViewer from "bpmn-js/lib/Viewer";
-import DefaultEmptyXML from "./plugins/defaultEmpty";
-import dictMixins from '@/mixins/dictMixins';
+  import BpmnViewer from 'bpmn-js/lib/Viewer';
+  import DefaultEmptyXML from './plugins/defaultEmpty';
+  import dictMixins from '@/mixins/dictMixins';
 
-export default {
-  name: "MyProcessViewer",
-  componentName: "MyProcessViewer",
-  mixins: [dictMixins],
+  export default {
+    name: 'MyProcessViewer',
+    componentName: 'MyProcessViewer',
+    mixins: [dictMixins],
 
-  props: {
-    value: {  // BPMN XML 字符串
-      type: String,
-    },
-    prefix: { // 使用哪个引擎
-      type: String,
-      default: "camunda",
-    },
-    activityData: { // 活动的数据。传递时,可高亮流程
-      type: Array,
-      default: () => [],
-    },
-    processInstanceData: { // 流程实例的数据。传递时,可展示流程发起人等信息
-      type: Object,
+    props: {
+      value: {
+        // BPMN XML 字符串
+        type: String
+      },
+      prefix: {
+        // 使用哪个引擎
+        type: String,
+        default: 'camunda'
+      },
+      activityData: {
+        // 活动的数据。传递时,可高亮流程
+        type: Array,
+        default: () => []
+      },
+      processInstanceData: {
+        // 流程实例的数据。传递时,可展示流程发起人等信息
+        type: Object
+      },
+      taskData: {
+        // 任务实例的数据。传递时,可展示 UserTask 审核相关的信息
+        type: Array,
+        default: () => []
+      }
     },
-    taskData: { // 任务实例的数据。传递时,可展示 UserTask 审核相关的信息
-      type: Array,
-      default: () => [],
-    }
-  },
-  data() {
-    return {
-      xml: '',
-      activityList: [],
-      processInstance: undefined,
-      taskList: [],
-    };
-  },
-  created(){
-    this.requestDict('流程实例的结果');
-
-  },
-  mounted() {
-    this.xml = this.value;
-    this.activityList = this.activityData;
-    // 初始化
-    this.initBpmnModeler();
-    this.createNewDiagram(this.xml);
-    this.$once("hook:beforeDestroy", () => {
-      if (this.bpmnModeler) this.bpmnModeler.destroy();
-      this.$emit("destroy", this.bpmnModeler);
-      this.bpmnModeler = null;
-    });
-    // 初始模型的监听器
-    this.initModelListeners();
-  },
-  watch: {
-    value: function (newValue) { // 在 xmlString 发生变化时,重新创建,从而绘制流程图
-      this.xml = newValue;
-      this.createNewDiagram(this.xml);
+    data() {
+      return {
+        xml: '',
+        activityList: [],
+        processInstance: null,
+        taskList: []
+      };
     },
-    activityData: function (newActivityData) {
-      this.activityList = newActivityData;
-      this.createNewDiagram(this.xml);
+    created() {
+      this.requestDict('流程实例的结果');
     },
-    processInstanceData: function (newProcessInstanceData) {
-      this.processInstance = newProcessInstanceData;
+    mounted() {
+      this.xml = this.value;
+      this.activityList = this.activityData;
+      // 初始化
+      this.initBpmnModeler();
       this.createNewDiagram(this.xml);
+      this.$once('hook:beforeDestroy', () => {
+        if (this.bpmnModeler) this.bpmnModeler.destroy();
+        this.$emit('destroy', this.bpmnModeler);
+        this.bpmnModeler = null;
+      });
+      // 初始模型的监听器
+      this.initModelListeners();
     },
-    taskData: function (newTaskListData) {
-      this.taskList = newTaskListData;
-      this.createNewDiagram(this.xml);
-    }
-  },
-  methods: {
-    initBpmnModeler() {
-      if (this.bpmnModeler) return;
-      this.bpmnModeler = new BpmnViewer({
-        container: this.$refs["bpmn-canvas"],
-        bpmnRenderer: {
-        }
-      })
-    },
-    /* 创建新的流程图 */
-    async createNewDiagram(xml) {
-      // 将字符串转换成图显示出来
-      let newId = `Process_${new Date().getTime()}`;
-      let newName = `业务流程_${new Date().getTime()}`;
-      let xmlString = xml || DefaultEmptyXML(newId, newName, this.prefix);
-      try {
-        // console.log(this.bpmnModeler.importXML);
-        let { warnings } = await this.bpmnModeler.importXML(xmlString);
-        if (warnings && warnings.length) {
-          warnings.forEach(warn => console.warn(warn));
-        }
-        // 高亮流程图
-        await this.highlightDiagram();
-        const canvas = this.bpmnModeler.get('canvas');
-        canvas.zoom("fit-viewport", "auto");
-      } catch (e) {
-        console.error(e);
-        // console.error(`[Process Designer Warn]: ${e?.message || e}`);
+    watch: {
+      value: function (newValue) {
+        // 在 xmlString 发生变化时,重新创建,从而绘制流程图
+        this.xml = newValue;
+        this.createNewDiagram(this.xml);
+      },
+      activityData: function (newActivityData) {
+        this.activityList = newActivityData;
+        this.createNewDiagram(this.xml);
+      },
+      processInstanceData: function (newProcessInstanceData) {
+        this.processInstance = newProcessInstanceData;
+        this.createNewDiagram(this.xml);
+      },
+      taskData: function (newTaskListData) {
+        this.taskList = newTaskListData;
+        this.createNewDiagram(this.xml);
       }
     },
-    /* 高亮流程图 */
-    // TODO 芋艿:如果多个 endActivity 的话,目前的逻辑可能有一定的问题。https://www.jdon.com/workflow/multi-events.html
-    async highlightDiagram() {
-      const activityList = this.activityList;
-      if (activityList.length === 0) {
-        return;
-      }
-      // 参考自 https://gitee.com/tony2y/RuoYi-flowable/blob/master/ruoyi-ui/src/components/Process/index.vue#L222 实现
-      // 再次基础上,增加不同审批结果的颜色等等
-      let canvas = this.bpmnModeler.get('canvas');
-      let todoActivity = activityList.find(m => !m.endTime) // 找到待办的任务
-      let endActivity = activityList[activityList.length - 1] // 获得最后一个任务
-      // debugger
-      // console.log(this.bpmnModeler.getDefinitions().rootElements[0].flowElements);
-      this.bpmnModeler.getDefinitions().rootElements[0].flowElements?.forEach(n => {
-        let activity = activityList.find(m => m.key === n.id) // 找到对应的活动
-        if (!activity) {
+    methods: {
+      initBpmnModeler() {
+        if (this.bpmnModeler) return;
+        this.bpmnModeler = new BpmnViewer({
+          container: this.$refs['bpmn-canvas'],
+          bpmnRenderer: {}
+        });
+      },
+      /* 创建新的流程图 */
+      async createNewDiagram(xml) {
+        // 将字符串转换成图显示出来
+        let newId = `Process_${new Date().getTime()}`;
+        let newName = `业务流程_${new Date().getTime()}`;
+        let xmlString = xml || DefaultEmptyXML(newId, newName, this.prefix);
+        try {
+          // console.log(this.bpmnModeler.importXML);
+          let { warnings } = await this.bpmnModeler.importXML(xmlString);
+          if (warnings && warnings.length) {
+            warnings.forEach((warn) => console.warn(warn));
+          }
+          // 高亮流程图
+          await this.highlightDiagram();
+          const canvas = this.bpmnModeler.get('canvas');
+          canvas.zoom('fit-viewport', 'auto');
+        } catch (e) {
+          console.error(e);
+          // console.error(`[Process Designer Warn]: ${e?.message || e}`);
+        }
+      },
+      /* 高亮流程图 */
+      // TODO 芋艿:如果多个 endActivity 的话,目前的逻辑可能有一定的问题。https://www.jdon.com/workflow/multi-events.html
+      async highlightDiagram() {
+        const activityList = this.activityList;
+        if (activityList.length === 0) {
           return;
         }
-        if (n.$type === 'bpmn:UserTask') { // 用户任务
-          // 处理用户任务的高亮
-          const task = this.taskList.find(m => m.id === activity.taskId); // 找到活动对应的 taskId
-          if (!task) {
-            return;
-          }
-          // 高亮任务
-          canvas.addMarker(n.id, this.getResultCss(task.result));
+        // 参考自 https://gitee.com/tony2y/RuoYi-flowable/blob/master/ruoyi-ui/src/components/Process/index.vue#L222 实现
+        // 再次基础上,增加不同审批结果的颜色等等
+        let canvas = this.bpmnModeler.get('canvas');
+        let todoActivity = activityList.find((m) => !m.endTime); // 找到待办的任务
+        let endActivity = activityList[activityList.length - 1]; // 获得最后一个任务
+        // debugger
+        // console.log(this.bpmnModeler.getDefinitions().rootElements[0].flowElements);
+        this.bpmnModeler
+          .getDefinitions()
+          .rootElements[0].flowElements?.forEach((n) => {
+            let activity = activityList.find((m) => m.key === n.id); // 找到对应的活动
+            if (!activity) {
+              return;
+            }
+            if (n.$type === 'bpmn:UserTask') {
+              // 用户任务
+              // 处理用户任务的高亮
+              const task = this.taskList.find((m) => m.id === activity.taskId); // 找到活动对应的 taskId
+              if (!task) {
+                return;
+              }
+              // 高亮任务
+              canvas.addMarker(n.id, this.getResultCss(task.result));
 
-          // 如果非通过,就不走后面的线条了
-          if (task.result !== 2) {
-            return;
-          }
-          // 处理 outgoing 出线
-          const outgoing = this.getActivityOutgoing(activity);
-          outgoing?.forEach(nn => {
-            // debugger
-            let targetActivity = activityList.find(m => m.key === nn.targetRef.id)
-            // 如果目标活动存在,则根据该活动是否结束,进行【bpmn:SequenceFlow】连线的高亮设置
-            if (targetActivity) {
-              canvas.addMarker(nn.id, targetActivity.endTime ? 'highlight' : 'highlight-todo');
-            } else if (nn.targetRef.$type === 'bpmn:ExclusiveGateway') { // TODO 芋艿:这个流程,暂时没走到过
-              canvas.addMarker(nn.id, activity.endTime ? 'highlight' : 'highlight-todo');
-              canvas.addMarker(nn.targetRef.id, activity.endTime ? 'highlight' : 'highlight-todo');
-            } else if (nn.targetRef.$type === 'bpmn:EndEvent') { // TODO 芋艿:这个流程,暂时没走到过
-              if (!todoActivity && endActivity.key === n.id) {
-                canvas.addMarker(nn.id, 'highlight');
-                canvas.addMarker(nn.targetRef.id, 'highlight');
+              // 如果非通过,就不走后面的线条了
+              if (task.result !== 2) {
+                return;
               }
-              if (!activity.endTime) {
-                canvas.addMarker(nn.id, 'highlight-todo');
-                canvas.addMarker(nn.targetRef.id, 'highlight-todo');
+              // 处理 outgoing 出线
+              const outgoing = this.getActivityOutgoing(activity);
+              outgoing?.forEach((nn) => {
+                // debugger
+                let targetActivity = activityList.find(
+                  (m) => m.key === nn.targetRef.id
+                );
+                // 如果目标活动存在,则根据该活动是否结束,进行【bpmn:SequenceFlow】连线的高亮设置
+                if (targetActivity) {
+                  canvas.addMarker(
+                    nn.id,
+                    targetActivity.endTime ? 'highlight' : 'highlight-todo'
+                  );
+                } else if (nn.targetRef.$type === 'bpmn:ExclusiveGateway') {
+                  // TODO 芋艿:这个流程,暂时没走到过
+                  canvas.addMarker(
+                    nn.id,
+                    activity.endTime ? 'highlight' : 'highlight-todo'
+                  );
+                  canvas.addMarker(
+                    nn.targetRef.id,
+                    activity.endTime ? 'highlight' : 'highlight-todo'
+                  );
+                } else if (nn.targetRef.$type === 'bpmn:EndEvent') {
+                  // TODO 芋艿:这个流程,暂时没走到过
+                  if (!todoActivity && endActivity.key === n.id) {
+                    canvas.addMarker(nn.id, 'highlight');
+                    canvas.addMarker(nn.targetRef.id, 'highlight');
+                  }
+                  if (!activity.endTime) {
+                    canvas.addMarker(nn.id, 'highlight-todo');
+                    canvas.addMarker(nn.targetRef.id, 'highlight-todo');
+                  }
+                }
+              });
+            } else if (n.$type === 'bpmn:ExclusiveGateway') {
+              // 排它网关
+              // 设置【bpmn:ExclusiveGateway】排它网关的高亮
+              canvas.addMarker(n.id, this.getActivityHighlightCss(activity));
+              // 查找需要高亮的连线
+              let matchNN = undefined;
+              let matchActivity = undefined;
+              n.outgoing?.forEach((nn) => {
+                let targetActivity = activityList.find(
+                  (m) => m.key === nn.targetRef.id
+                );
+                if (!targetActivity) {
+                  return;
+                }
+                // 特殊判断 endEvent 类型的原因,ExclusiveGateway 可能后续连有 2 个路径:
+                //  1. 一个是 UserTask => EndEvent
+                //  2. 一个是 EndEvent
+                // 在选择路径 1 时,其实 EndEvent 可能也存在,导致 1 和 2 都高亮,显然是不正确的。
+                // 所以,在 matchActivity 为 EndEvent 时,需要进行覆盖~~
+                if (!matchActivity || matchActivity.type === 'endEvent') {
+                  matchNN = nn;
+                  matchActivity = targetActivity;
+                }
+              });
+              if (matchNN && matchActivity) {
+                canvas.addMarker(
+                  matchNN.id,
+                  this.getActivityHighlightCss(matchActivity)
+                );
+              }
+            } else if (n.$type === 'bpmn:ParallelGateway') {
+              // 并行网关
+              // 设置【bpmn:ParallelGateway】并行网关的高亮
+              canvas.addMarker(n.id, this.getActivityHighlightCss(activity));
+              n.outgoing?.forEach((nn) => {
+                // 获得连线是否有指向目标。如果有,则进行高亮
+                const targetActivity = activityList.find(
+                  (m) => m.key === nn.targetRef.id
+                );
+                if (targetActivity) {
+                  canvas.addMarker(
+                    nn.id,
+                    this.getActivityHighlightCss(targetActivity)
+                  ); // 高亮【bpmn:SequenceFlow】连线
+                  // 高亮【...】目标。其中 ... 可以是 bpm:UserTask、也可以是其它的。当然,如果是 bpm:UserTask 的话,其实不做高亮也没问题,因为上面有逻辑做了这块。
+                  canvas.addMarker(
+                    nn.targetRef.id,
+                    this.getActivityHighlightCss(targetActivity)
+                  );
+                }
+              });
+            } else if (n.$type === 'bpmn:StartEvent') {
+              // 开始节点
+              n.outgoing?.forEach((nn) => {
+                // outgoing 例如说【bpmn:SequenceFlow】连线
+                // 获得连线是否有指向目标。如果有,则进行高亮
+                let targetActivity = activityList.find(
+                  (m) => m.key === nn.targetRef.id
+                );
+                if (targetActivity) {
+                  canvas.addMarker(nn.id, 'highlight'); // 高亮【bpmn:SequenceFlow】连线
+                  canvas.addMarker(n.id, 'highlight'); // 高亮【bpmn:StartEvent】开始节点(自己)
+                }
+              });
+            } else if (n.$type === 'bpmn:EndEvent') {
+              // 结束节点
+              if (!this.processInstance || this.processInstance.result === 1) {
+                return;
+              }
+              canvas.addMarker(
+                n.id,
+                this.getResultCss(this.processInstance.result)
+              );
+            } else if (n.$type === 'bpmn:ServiceTask') {
+              //服务任务
+              if (activity.startTime > 0 && activity.endTime === 0) {
+                //进入执行,标识进行色
+                canvas.addMarker(n.id, this.getResultCss(1));
+              }
+              if (activity.endTime > 0) {
+                // 执行完成,节点标识完成色, 所有outgoing标识完成色。
+                canvas.addMarker(n.id, this.getResultCss(2));
+                const outgoing = this.getActivityOutgoing(activity);
+                outgoing?.forEach((out) => {
+                  canvas.addMarker(out.id, this.getResultCss(2));
+                });
               }
             }
           });
-        } else if (n.$type === 'bpmn:ExclusiveGateway') { // 排它网关
-          // 设置【bpmn:ExclusiveGateway】排它网关的高亮
-          canvas.addMarker(n.id, this.getActivityHighlightCss(activity));
-          // 查找需要高亮的连线
-          let matchNN = undefined;
-          let matchActivity = undefined;
-          n.outgoing?.forEach(nn => {
-            let targetActivity = activityList.find(m => m.key === nn.targetRef.id);
-            if (!targetActivity) {
-              return;
-            }
-            // 特殊判断 endEvent 类型的原因,ExclusiveGateway 可能后续连有 2 个路径:
-            //  1. 一个是 UserTask => EndEvent
-            //  2. 一个是 EndEvent
-            // 在选择路径 1 时,其实 EndEvent 可能也存在,导致 1 和 2 都高亮,显然是不正确的。
-            // 所以,在 matchActivity 为 EndEvent 时,需要进行覆盖~~
-            if (!matchActivity || matchActivity.type === 'endEvent') {
-              matchNN = nn;
-              matchActivity = targetActivity;
-            }
-          })
-          if (matchNN && matchActivity) {
-            canvas.addMarker(matchNN.id, this.getActivityHighlightCss(matchActivity));
-          }
-        } else if (n.$type === 'bpmn:ParallelGateway') { // 并行网关
-          // 设置【bpmn:ParallelGateway】并行网关的高亮
-          canvas.addMarker(n.id, this.getActivityHighlightCss(activity));
-          n.outgoing?.forEach(nn => {
-            // 获得连线是否有指向目标。如果有,则进行高亮
-            const targetActivity = activityList.find(m => m.key === nn.targetRef.id)
-            if (targetActivity) {
-              canvas.addMarker(nn.id, this.getActivityHighlightCss(targetActivity)); // 高亮【bpmn:SequenceFlow】连线
-              // 高亮【...】目标。其中 ... 可以是 bpm:UserTask、也可以是其它的。当然,如果是 bpm:UserTask 的话,其实不做高亮也没问题,因为上面有逻辑做了这块。
-              canvas.addMarker(nn.targetRef.id, this.getActivityHighlightCss(targetActivity));
-            }
-          })
-        } else if (n.$type === 'bpmn:StartEvent') { // 开始节点
-          n.outgoing?.forEach(nn => { // outgoing 例如说【bpmn:SequenceFlow】连线
-            // 获得连线是否有指向目标。如果有,则进行高亮
-            let targetActivity = activityList.find(m => m.key === nn.targetRef.id);
-            if (targetActivity) {
-              canvas.addMarker(nn.id, 'highlight'); // 高亮【bpmn:SequenceFlow】连线
-              canvas.addMarker(n.id, 'highlight'); // 高亮【bpmn:StartEvent】开始节点(自己)
-            }
-          });
-        } else if (n.$type === 'bpmn:EndEvent') { // 结束节点
-          if (!this.processInstance || this.processInstance.result === 1) {
+      },
+      getActivityHighlightCss(activity) {
+        return activity.endTime ? 'highlight' : 'highlight-todo';
+      },
+      getResultCss(result) {
+        if (result === 1) {
+          // 审批中
+          return 'highlight-todo';
+        } else if (result === 2) {
+          // 已通过
+          return 'highlight';
+        } else if (result === 3) {
+          // 不通过
+          return 'highlight-reject';
+        } else if (result === 4) {
+          // 已取消
+          return 'highlight-cancel';
+        } else if (result === 5) {
+          // 已退回
+          return 'highlight-back';
+        } else if (result === 6) {
+          // 已委派
+          return 'highlight-todo';
+        }
+        return '';
+      },
+      getActivityOutgoing(activity) {
+        // 如果有 outgoing,则直接使用它
+        if (activity.outgoing && activity.outgoing.length > 0) {
+          return activity.outgoing;
+        }
+        // 如果没有,则遍历获得起点为它的【bpmn:SequenceFlow】节点们。原因是:bpmn-js 的 UserTask 拿不到 outgoing
+        const flowElements =
+          this.bpmnModeler.getDefinitions().rootElements[0].flowElements;
+        const outgoing = [];
+        flowElements.forEach((item) => {
+          if (item.$type !== 'bpmn:SequenceFlow') {
             return;
           }
-          canvas.addMarker(n.id, this.getResultCss(this.processInstance.result));
-        } else if (n.$type === 'bpmn:ServiceTask'){ //服务任务
-          if(activity.startTime>0 && activity.endTime===0){//进入执行,标识进行色
-            canvas.addMarker(n.id, this.getResultCss(1));
-          }
-          if(activity.endTime>0){// 执行完成,节点标识完成色, 所有outgoing标识完成色。
-            canvas.addMarker(n.id, this.getResultCss(2));
-            const outgoing = this.getActivityOutgoing(activity)
-            outgoing?.forEach(out=>{
-              canvas.addMarker(out.id,this.getResultCss(2))
-            })
+          if (item.sourceRef.id === activity.key) {
+            outgoing.push(item);
           }
-        }
-      })
-    },
-    getActivityHighlightCss(activity) {
-      return activity.endTime ? 'highlight' : 'highlight-todo';
-    },
-    getResultCss(result) {
-      if (result === 1) { // 审批中
-        return 'highlight-todo';
-      } else if (result === 2) { // 已通过
-        return 'highlight';
-      } else if (result === 3) { // 不通过
-        return 'highlight-reject';
-      } else if (result === 4) { // 已取消
-        return 'highlight-cancel';
-      } else if (result === 5) { // 已退回
-        return 'highlight-back';
-      } else if (result === 6) { // 已委派
-        return 'highlight-todo';
-      }
-      return '';
-    },
-    getActivityOutgoing(activity) {
-      // 如果有 outgoing,则直接使用它
-      if (activity.outgoing && activity.outgoing.length > 0) {
-        return activity.outgoing;
-      }
-      // 如果没有,则遍历获得起点为它的【bpmn:SequenceFlow】节点们。原因是:bpmn-js 的 UserTask 拿不到 outgoing
-      const flowElements = this.bpmnModeler.getDefinitions().rootElements[0].flowElements;
-      const outgoing = [];
-      flowElements.forEach(item => {
-        if (item.$type !== 'bpmn:SequenceFlow') {
+        });
+        return outgoing;
+      },
+      initModelListeners() {
+        const EventBus = this.bpmnModeler.get('eventBus');
+        const that = this;
+        // 注册需要的监听事件
+        EventBus.on('element.hover', function (eventObj) {
+          let element = eventObj ? eventObj.element : null;
+          that.elementHover(element);
+        });
+        EventBus.on('element.out', function (eventObj) {
+          let element = eventObj ? eventObj.element : null;
+          that.elementOut(element);
+        });
+      },
+      // 流程图的元素被 hover
+      elementHover(element) {
+        this.element = element;
+        !this.elementOverlayIds && (this.elementOverlayIds = {});
+        !this.overlays && (this.overlays = this.bpmnModeler.get('overlays'));
+        // 展示信息
+        const activity = this.activityList.find((m) => m.key === element.id);
+        if (!activity) {
           return;
         }
-        if (item.sourceRef.id === activity.key) {
-          outgoing.push(item);
-        }
-      });
-      return outgoing;
-    },
-    initModelListeners() {
-      const EventBus = this.bpmnModeler.get("eventBus");
-      const that = this;
-      // 注册需要的监听事件
-      EventBus.on('element.hover', function(eventObj) {
-        let element = eventObj ? eventObj.element : null;
-        that.elementHover(element);
-      });
-      EventBus.on('element.out', function(eventObj) {
-        let element = eventObj ? eventObj.element : null;
-        that.elementOut(element);
-      });
-    },
-    // 流程图的元素被 hover
-    elementHover(element) {
-      this.element = element;
-      !this.elementOverlayIds && (this.elementOverlayIds = {});
-      !this.overlays && (this.overlays = this.bpmnModeler.get("overlays"));
-      // 展示信息
-      const activity = this.activityList.find(m => m.key === element.id);
-      if (!activity) {
-        return;
-      }
-      if (!this.elementOverlayIds[element.id] && element.type !== "bpmn:Process") {
-        let html = `<div class="element-overlays">
+        if (
+          !this.elementOverlayIds[element.id] &&
+          element.type !== 'bpmn:Process'
+        ) {
+          let html = `<div class="element-overlays">
             <p>Elemet id: ${element.id}</p>
             <p>Elemet type: ${element.type}</p>
           </div>`; // 默认值
-        if (element.type === 'bpmn:StartEvent' && this.processInstance) {
-          html = `<p>发起人:${this.processInstance.startUser.nickname}</p>
+          if (element.type === 'bpmn:StartEvent' && this.processInstance) {
+            html = `<p>发起人:${this.processInstance.startUser.nickname}</p>
                   <p>部门:${this.processInstance.startUser.deptName}</p>
                   <p>创建时间:${this.processInstance.createTime}`;
-        } else if (element.type === 'bpmn:UserTask') {
-          // debugger
-          let task = this.taskList.find(m => m.id === activity.taskId); // 找到活动对应的 taskId
-          if (!task) {
-            return;
-          }
-          html = `<p>审批人:${task.assigneeUser.nickname}</p>
+          } else if (element.type === 'bpmn:UserTask') {
+            // debugger
+            let task = this.taskList.find((m) => m.id === activity.taskId); // 找到活动对应的 taskId
+            if (!task) {
+              return;
+            }
+            html = `<p>审批人:${task.assigneeUser.nickname}</p>
                   <p>部门:${task.assigneeUser.deptName}</p>
-                  <p>结果:${this.getDictValue('流程实例的结果', task.result)}</p>
+                  <p>结果:${this.getDictValue(
+                    '流程实例的结果',
+                    task.result
+                  )}</p>
                   <p>创建时间:${task.createTime}</p>`;
-          if (task.endTime) {
-            html += `<p>结束时间:${task.endTime}</p>`
-          }
-          if (task.reason) {
-            html += `<p>审批建议:${task.reason}</p>`
-          }
-        } else if (element.type === 'bpmn:ServiceTask' && this.processInstance) {
-          if(activity.startTime>0){
-            html = `<p>创建时间:${activity.startTime}</p>`;
-          }
-          if(activity.endTime>0){
-            html += `<p>结束时间:${activity.endTime}</p>`
-          }
-          console.log(html)
-        } else if (element.type === 'bpmn:EndEvent' && this.processInstance) {
-          html = `<p>结果:${this.getDictValue('流程实例的结果', this.processInstance.result)}</p>`;
-          if (this.processInstance.endTime) {
-            html += `<p>结束时间:${this.processInstance.endTime}</p>`
+            if (task.endTime) {
+              html += `<p>结束时间:${task.endTime}</p>`;
+            }
+            if (task.reason) {
+              html += `<p>审批建议:${task.reason}</p>`;
+            }
+          } else if (
+            element.type === 'bpmn:ServiceTask' &&
+            this.processInstance
+          ) {
+            if (activity.startTime > 0) {
+              html = `<p>创建时间:${activity.startTime}</p>`;
+            }
+            if (activity.endTime > 0) {
+              html += `<p>结束时间:${activity.endTime}</p>`;
+            }
+            console.log(html);
+          } else if (element.type === 'bpmn:EndEvent' && this.processInstance) {
+            html = `<p>结果:${this.getDictValue(
+              '流程实例的结果',
+              this.processInstance.result.toString()
+            )}</p>`;
+            if (this.processInstance.endTime) {
+              html += `<p>结束时间:${this.processInstance.endTime}</p>`;
+            }
           }
+          this.elementOverlayIds[element.id] = this.overlays.add(element, {
+            position: { left: 0, bottom: 0 },
+            html: `<div class="element-overlays">${html}</div>`
+          });
         }
-        this.elementOverlayIds[element.id] = this.overlays.add(element, {
-          position: { left: 0, bottom: 0 },
-          html: `<div class="element-overlays">${html}</div>`
-        });
+      },
+      // 流程图的元素被 out
+      elementOut(element) {
+        this.overlays.remove({ element });
+        this.elementOverlayIds[element.id] = null;
       }
-    },
-    // 流程图的元素被 out
-    elementOut(element) {
-      this.overlays.remove({ element });
-      this.elementOverlayIds[element.id] = null;
-    },
-  }
-};
+    }
+  };
 </script>
 
 <style>
-.bjs-powered-by{
-  display: none;
-}
-/** 处理中 */
-.highlight-todo.djs-connection > .djs-visual > path {
-  stroke: #1890ff !important;
-  stroke-dasharray: 4px !important;
-  fill-opacity: 0.2 !important;
-}
-.highlight-todo.djs-shape .djs-visual > :nth-child(1) {
-  fill: #1890ff !important;
-  stroke: #1890ff !important;
-  stroke-dasharray: 4px !important;
-  fill-opacity: 0.2 !important;
-}
+  .bjs-powered-by {
+    display: none;
+  }
+  /** 处理中 */
+  .highlight-todo.djs-connection > .djs-visual > path {
+    stroke: #1890ff !important;
+    stroke-dasharray: 4px !important;
+    fill-opacity: 0.2 !important;
+  }
+  .highlight-todo.djs-shape .djs-visual > :nth-child(1) {
+    fill: #1890ff !important;
+    stroke: #1890ff !important;
+    stroke-dasharray: 4px !important;
+    fill-opacity: 0.2 !important;
+  }
 
-:deep(.highlight-todo.djs-connection > .djs-visual > path) {
-  stroke: #1890ff !important;
-  stroke-dasharray: 4px !important;
-  fill-opacity: 0.2 !important;
-  marker-end: url(#sequenceflow-end-_E7DFDF-_E7DFDF-803g1kf6zwzmcig1y2ulm5egr);
-}
-:deep(.highlight-todo.djs-shape .djs-visual > :nth-child(1)) {
-  fill: #1890ff !important;
-  stroke: #1890ff !important;
-  stroke-dasharray: 4px !important;
-  fill-opacity: 0.2 !important;
-}
+  :deep(.highlight-todo.djs-connection > .djs-visual > path) {
+    stroke: #1890ff !important;
+    stroke-dasharray: 4px !important;
+    fill-opacity: 0.2 !important;
+    marker-end: url(#sequenceflow-end-_E7DFDF-_E7DFDF-803g1kf6zwzmcig1y2ulm5egr);
+  }
+  :deep(.highlight-todo.djs-shape .djs-visual > :nth-child(1)) {
+    fill: #1890ff !important;
+    stroke: #1890ff !important;
+    stroke-dasharray: 4px !important;
+    fill-opacity: 0.2 !important;
+  }
 
-/** 通过 */
-.highlight.djs-shape .djs-visual > :nth-child(1) {
-  fill: green !important;
-  stroke: green !important;
-  fill-opacity: 0.2 !important;
-}
-.highlight.djs-shape .djs-visual > :nth-child(2) {
-  fill: green !important;
-}
-.highlight.djs-shape .djs-visual > path {
-  fill: green !important;
-  fill-opacity: 0.2 !important;
-  stroke: green !important;
-}
-.highlight.djs-connection > .djs-visual > path {
-  stroke: green !important;
-}
+  /** 通过 */
+  .highlight.djs-shape .djs-visual > :nth-child(1) {
+    fill: green !important;
+    stroke: green !important;
+    fill-opacity: 0.2 !important;
+  }
+  .highlight.djs-shape .djs-visual > :nth-child(2) {
+    fill: green !important;
+  }
+  .highlight.djs-shape .djs-visual > path {
+    fill: green !important;
+    fill-opacity: 0.2 !important;
+    stroke: green !important;
+  }
+  .highlight.djs-connection > .djs-visual > path {
+    stroke: green !important;
+  }
 
-.highlight:not(.djs-connection) .djs-visual > :nth-child(1) {
-  fill: green !important; /* color elements as green */
-}
+  .highlight:not(.djs-connection) .djs-visual > :nth-child(1) {
+    fill: green !important; /* color elements as green */
+  }
 
-:deep(.highlight.djs-shape .djs-visual > :nth-child(1)) {
-  fill: green !important;
-  stroke: green !important;
-  fill-opacity: 0.2 !important;
-}
-:deep(.highlight.djs-shape .djs-visual > :nth-child(2)) {
-  fill: green !important;
-}
-:deep(.highlight.djs-shape .djs-visual > path) {
-  fill: green !important;
-  fill-opacity: 0.2 !important;
-  stroke: green !important;
-}
-:deep(.highlight.djs-connection > .djs-visual > path) {
-  stroke: green !important;
-}
+  :deep(.highlight.djs-shape .djs-visual > :nth-child(1)) {
+    fill: green !important;
+    stroke: green !important;
+    fill-opacity: 0.2 !important;
+  }
+  :deep(.highlight.djs-shape .djs-visual > :nth-child(2)) {
+    fill: green !important;
+  }
+  :deep(.highlight.djs-shape .djs-visual > path) {
+    fill: green !important;
+    fill-opacity: 0.2 !important;
+    stroke: green !important;
+  }
+  :deep(.highlight.djs-connection > .djs-visual > path) {
+    stroke: green !important;
+  }
 
-/** 不通过 */
-.highlight-reject.djs-shape .djs-visual > :nth-child(1) {
-  fill: red !important;
-  stroke: red !important;
-  fill-opacity: 0.2 !important;
-}
-.highlight-reject.djs-shape .djs-visual > :nth-child(2) {
-  fill: red !important;
-}
-.highlight-reject.djs-shape .djs-visual > path {
-  fill: red !important;
-  fill-opacity: 0.2 !important;
-  stroke: red !important;
-}
-.highlight-reject.djs-connection > .djs-visual > path {
-  stroke: red !important;
-}
+  /** 不通过 */
+  .highlight-reject.djs-shape .djs-visual > :nth-child(1) {
+    fill: red !important;
+    stroke: red !important;
+    fill-opacity: 0.2 !important;
+  }
+  .highlight-reject.djs-shape .djs-visual > :nth-child(2) {
+    fill: red !important;
+  }
+  .highlight-reject.djs-shape .djs-visual > path {
+    fill: red !important;
+    fill-opacity: 0.2 !important;
+    stroke: red !important;
+  }
+  .highlight-reject.djs-connection > .djs-visual > path {
+    stroke: red !important;
+  }
 
-.highlight-reject:not(.djs-connection) .djs-visual > :nth-child(1) {
-  fill: red !important; /* color elements as green */
-}
+  .highlight-reject:not(.djs-connection) .djs-visual > :nth-child(1) {
+    fill: red !important; /* color elements as green */
+  }
 
-:deep(.highlight-reject.djs-shape .djs-visual > :nth-child(1)) {
-  fill: red !important;
-  stroke: red !important;
-  fill-opacity: 0.2 !important;
-}
-:deep(.highlight-reject.djs-shape .djs-visual > :nth-child(2)) {
-  fill: red !important;
-}
-:deep(.highlight-reject.djs-shape .djs-visual > path) {
-  fill: red !important;
-  fill-opacity: 0.2 !important;
-  stroke: red !important;
-}
-:deep(.highlight-reject.djs-connection > .djs-visual > path) {
-  stroke: red !important;
-}
+  :deep(.highlight-reject.djs-shape .djs-visual > :nth-child(1)) {
+    fill: red !important;
+    stroke: red !important;
+    fill-opacity: 0.2 !important;
+  }
+  :deep(.highlight-reject.djs-shape .djs-visual > :nth-child(2)) {
+    fill: red !important;
+  }
+  :deep(.highlight-reject.djs-shape .djs-visual > path) {
+    fill: red !important;
+    fill-opacity: 0.2 !important;
+    stroke: red !important;
+  }
+  :deep(.highlight-reject.djs-connection > .djs-visual > path) {
+    stroke: red !important;
+  }
 
-/** 已取消 */
-.highlight-cancel.djs-shape .djs-visual > :nth-child(1) {
-  fill: grey !important;
-  stroke: grey !important;
-  fill-opacity: 0.2 !important;
-}
-.highlight-cancel.djs-shape .djs-visual > :nth-child(2) {
-  fill: grey !important;
-}
-.highlight-cancel.djs-shape .djs-visual > path {
-  fill: grey !important;
-  fill-opacity: 0.2 !important;
-  stroke: grey !important;
-}
-.highlight-cancel.djs-connection > .djs-visual > path {
-  stroke: grey !important;
-}
+  /** 已取消 */
+  .highlight-cancel.djs-shape .djs-visual > :nth-child(1) {
+    fill: grey !important;
+    stroke: grey !important;
+    fill-opacity: 0.2 !important;
+  }
+  .highlight-cancel.djs-shape .djs-visual > :nth-child(2) {
+    fill: grey !important;
+  }
+  .highlight-cancel.djs-shape .djs-visual > path {
+    fill: grey !important;
+    fill-opacity: 0.2 !important;
+    stroke: grey !important;
+  }
+  .highlight-cancel.djs-connection > .djs-visual > path {
+    stroke: grey !important;
+  }
 
-.highlight-cancel:not(.djs-connection) .djs-visual > :nth-child(1) {
-  fill: grey !important; /* color elements as green */
-}
+  .highlight-cancel:not(.djs-connection) .djs-visual > :nth-child(1) {
+    fill: grey !important; /* color elements as green */
+  }
 
-:deep(.highlight-cancel.djs-shape .djs-visual > :nth-child(1)) {
-  fill: grey !important;
-  stroke: grey !important;
-  fill-opacity: 0.2 !important;
-}
-:deep(.highlight-cancel.djs-shape .djs-visual > :nth-child(2)) {
-  fill: grey !important;
-}
-:deep(.highlight-cancel.djs-shape .djs-visual > path) {
-  fill: grey !important;
-  fill-opacity: 0.2 !important;
-  stroke: grey !important;
-}
-:deep(.highlight-cancel.djs-connection > .djs-visual > path) {
-  stroke: grey !important;
-}
-/**驳回 */
-.highlight-back.djs-connection > .djs-visual > path {
-  stroke: #FFBA00 !important;
-  stroke-dasharray: 4px !important;
-  fill-opacity: 0.2 !important;
-}
+  :deep(.highlight-cancel.djs-shape .djs-visual > :nth-child(1)) {
+    fill: grey !important;
+    stroke: grey !important;
+    fill-opacity: 0.2 !important;
+  }
+  :deep(.highlight-cancel.djs-shape .djs-visual > :nth-child(2)) {
+    fill: grey !important;
+  }
+  :deep(.highlight-cancel.djs-shape .djs-visual > path) {
+    fill: grey !important;
+    fill-opacity: 0.2 !important;
+    stroke: grey !important;
+  }
+  :deep(.highlight-cancel.djs-connection > .djs-visual > path) {
+    stroke: grey !important;
+  }
+  /**驳回 */
+  .highlight-back.djs-connection > .djs-visual > path {
+    stroke: #ffba00 !important;
+    stroke-dasharray: 4px !important;
+    fill-opacity: 0.2 !important;
+  }
 
-.highlight-back.djs-shape .djs-visual > :nth-child(1) {
-  fill: #FFBA00 !important;
-  stroke: #FFBA00 !important;
-  stroke-dasharray: 4px !important;
-  fill-opacity: 0.2 !important;
-}
+  .highlight-back.djs-shape .djs-visual > :nth-child(1) {
+    fill: #ffba00 !important;
+    stroke: #ffba00 !important;
+    stroke-dasharray: 4px !important;
+    fill-opacity: 0.2 !important;
+  }
 
-:deep(.highlight-back.djs-connection > .djs-visual > path) {
-  stroke: #FFBA00 !important;
-  stroke-dasharray: 4px !important;
-  fill-opacity: 0.2 !important;
-  marker-end: url(#sequenceflow-end-_E7DFDF-_E7DFDF-803g1kf6zwzmcig1y2ulm5egr);
-}
+  :deep(.highlight-back.djs-connection > .djs-visual > path) {
+    stroke: #ffba00 !important;
+    stroke-dasharray: 4px !important;
+    fill-opacity: 0.2 !important;
+    marker-end: url(#sequenceflow-end-_E7DFDF-_E7DFDF-803g1kf6zwzmcig1y2ulm5egr);
+  }
 
-:deep(.highlight-back.djs-shape .djs-visual > :nth-child(1)) {
-  fill: #FFBA00 !important;
-  stroke: #FFBA00 !important;
-  stroke-dasharray: 4px !important;
-  fill-opacity: 0.2 !important;
-}
-.element-overlays {
-  box-sizing: border-box;
-  padding: 8px;
-  background: rgba(0, 0, 0, 0.6);
-  border-radius: 4px;
-  color: #fafafa;
-  width: 200px;
-}
+  :deep(.highlight-back.djs-shape .djs-visual > :nth-child(1)) {
+    fill: #ffba00 !important;
+    stroke: #ffba00 !important;
+    stroke-dasharray: 4px !important;
+    fill-opacity: 0.2 !important;
+  }
+  .element-overlays {
+    box-sizing: border-box;
+    padding: 8px;
+    background: rgba(0, 0, 0, 0.6);
+    border-radius: 4px;
+    color: #fafafa;
+    width: 200px;
+  }
 </style>

+ 2 - 2
vue.config.js

@@ -35,10 +35,10 @@ module.exports = {
         // target: 'http://192.168.1.103:18086',
         // target: 'http://192.168.1.158:18086',
         // target: 'http://192.168.158:18086',
-        target: 'http://192.168.1.251:18086',
+        // target: 'http://192.168.1.251:18086',
         // target: 'http://192.168.1.144:18086',
         // target: 'http://192.168.1.211:18086',
-        // target: 'http://192.168.1.251:18186',
+        target: 'http://192.168.1.251:18186',
 
         // target: 'http://192.168.1.125:18086',