Эх сурвалжийг харах

排序规则修改/处理流程修改数据和接口/分隔正常和异常字段处理方式

lph 1 жил өмнө
parent
commit
a69e1a2bc6

+ 9 - 0
ruoyi-ui/src/api/bpmprocess/process.js

@@ -101,6 +101,15 @@ export function updateConfiguration(data) {
     baseURL: process.env.VUE_APP_BASE_API4,
   })
 }
+// 查询流程节点详情
+export function getNodeData(processKey) {
+  return request({
+    url: '/system/configuration/selectByProcessByKey/' + processKey,
+    method: 'get',
+    baseURL: process.env.VUE_APP_BASE_API4,
+  })
+}
+
 
 // 查询流程节点脚本列表
 export function listScript(query) {

+ 42 - 22
ruoyi-ui/src/views/bpmprocess/scriptManage.vue

@@ -8,14 +8,14 @@
       v-show="showSearch"
       label-width="68px"
     >
-      <el-form-item label="脚本编码" prop="scriptKey">
+      <!-- <el-form-item label="脚本编码" prop="scriptKey">
         <el-input
           v-model="queryParams.scriptKey"
           placeholder="请输入脚本编码"
           clearable
           @keyup.enter.native="handleQuery"
         />
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item label="脚本方法名称" prop="scriptFunctionName">
         <el-input
           v-model="queryParams.scriptFunctionName"
@@ -32,14 +32,6 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="脚本描述" prop="scriptDescription">
-        <el-input
-          v-model="queryParams.scriptDescription"
-          placeholder="请输入脚本描述"
-          clearable
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
       <el-form-item>
         <el-button
           type="primary"
@@ -114,7 +106,7 @@
     >
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="编号" align="center" prop="id" />
-      <el-table-column label="脚本编码" align="center" prop="scriptKey" />
+      <!-- <el-table-column label="脚本编码" align="center" prop="scriptKey" /> -->
       <el-table-column
         label="脚本方法名称"
         align="center"
@@ -126,7 +118,11 @@
         align="center"
         prop="scriptFunctionCode"
       />
-      <el-table-column label="脚本类型" align="center" prop="scriptType" />
+      <el-table-column label="脚本类型" align="center" prop="scriptType">
+        <template slot-scope="scope">
+          {{ getDictLabel(scope.row.scriptType, dict.type.bpm_script_type) }}
+        </template>
+      </el-table-column>
       <el-table-column
         label="脚本描述"
         align="center"
@@ -169,34 +165,49 @@
     <!-- 添加或修改流程节点脚本对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="脚本编码" prop="scriptKey">
+        <!-- <el-form-item label="脚本编码:" prop="scriptKey">
           <el-input v-model="form.scriptKey" placeholder="请输入脚本编码" />
+        </el-form-item> -->
+        <el-form-item label="脚本名称:" prop="scriptName">
+          <el-input v-model="form.scriptName" placeholder="请输入脚本名称" />
+        </el-form-item>
+        <el-form-item label="脚本类型:" prop="scriptName">
+          <!-- <el-input v-model="form.scriptName" placeholder="请输入脚本名称" /> -->
+          <el-select
+            v-model="form.scriptType"
+            placeholder="请选择脚本类型"
+            clearable
+            filterable
+          >
+            <el-option
+              v-for="item in dict.type.bpm_script_type"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
         </el-form-item>
-        <el-form-item label="脚本方法名称" prop="scriptFunctionName">
+        <el-form-item label="方法名:" prop="scriptFunctionName">
           <el-input
             v-model="form.scriptFunctionName"
             placeholder="请输入脚本方法名称"
           />
         </el-form-item>
-        <el-form-item label="脚本名称" prop="scriptName">
-          <el-input v-model="form.scriptName" placeholder="请输入脚本名称" />
-        </el-form-item>
-        <el-form-item label="脚本方法体" prop="scriptFunctionCode">
+
+        <el-form-item label="方法体:" prop="scriptFunctionCode">
           <el-input
             v-model="form.scriptFunctionCode"
             type="textarea"
             placeholder="请输入内容"
           />
         </el-form-item>
-        <el-form-item label="脚本描述" prop="scriptDescription">
+        <el-form-item label="脚本描述:" prop="scriptDescription">
           <el-input
             v-model="form.scriptDescription"
             placeholder="请输入脚本描述"
           />
         </el-form-item>
-        <el-form-item label="删除标志" prop="delFlag">
-          <el-input v-model="form.delFlag" placeholder="请输入删除标志" />
-        </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm">确 定</el-button>
@@ -214,9 +225,11 @@ import {
   addScript,
   updateScript,
 } from "@/api/bpmprocess/process";
+import uuid from "@/utils/bpmn/uuid";
 
 export default {
   name: "Script",
+  dicts: ["bpm_script_type"],
   data() {
     return {
       // 遮罩层
@@ -333,6 +346,7 @@ export default {
               this.getList();
             });
           } else {
+            this.form.scriptKey = uuid();
             addScript(this.form).then((response) => {
               this.$modal.msgSuccess("新增成功");
               this.open = false;
@@ -366,6 +380,12 @@ export default {
         `script_${new Date().getTime()}.xlsx`
       );
     },
+    // 获取字典对应label
+    getDictLabel(value, dictLsit = []) {
+      return dictLsit.find((item) => {
+        return item.value == value;
+      })?.label;
+    },
   },
 };
 </script>

+ 7 - 7
ruoyi-ui/src/views/system/bpmnPro/components/Panel/components/ElementExecuteUser.vue

@@ -84,15 +84,15 @@ export default {
     return {
       userTypeList: [
         {
-          value: 1,
+          value: "1",
           label: "指定处理人",
         },
         {
-          value: 2,
+          value: "2",
           label: "批量处理人",
         },
         {
-          value: 3,
+          value: "3",
           label: "角色处理",
         },
       ],
@@ -130,7 +130,7 @@ export default {
   methods: {
     initFormData() {
       this.exeUserValue = getExecuteUser(getActive()) || "";
-      this.exeUserType = getExecuteUserType(getActive()) || "";
+      this.exeUserType = getExecuteUserType(getActive()) || "1";
       Object.assign(this.queryParams, {
         pageNum: 1,
         pageSize: 10,
@@ -140,8 +140,8 @@ export default {
     updateExeUserType(value) {
       setExecuteUserType(getActive(), value);
       value == 2
-        ? setExecuteUser(getActive(), [])
-        : setExecuteUser(getActive(), "");
+        ? setExecuteUser(getActive(), [], this.$route.query.id ? true : false)
+        : setExecuteUser(getActive(), "", this.$route.query.id ? true : false);
       this.exeUserValueList = [];
       this.exeUserValue = "";
       if (!value) return;
@@ -194,7 +194,7 @@ export default {
       }
     },
     updateExeUserValue(value) {
-      setExecuteUser(getActive(), value);
+      setExecuteUser(getActive(), value, this.$route.query.id ? true : false);
     },
     scrollHandler() {
       if (this.isArriveBoottom) return;

+ 12 - 3
ruoyi-ui/src/views/system/bpmnPro/components/Panel/components/ElementGenerations.vue

@@ -86,12 +86,12 @@
           </el-select>
         </edit-item>
 
-        <edit-item key="executable" label="可执行">
+        <!-- <edit-item key="executable" label="可执行">
           <el-switch
             v-model="elFormData.elementExecutable"
             @change="updateElementExecutable"
           />
-        </edit-item>
+        </edit-item> -->
       </template>
     </el-form>
   </el-collapse-item>
@@ -133,9 +133,10 @@ export default {
         startEventType: "",
         bpmType: "",
         nodeDescription: "",
+        elementExecutable: true,
+        scriptTriggerType: false,
       },
 
-      elementExecutable: true,
       isProcess: false,
       // rules: {
       //   elementId: [
@@ -227,3 +228,11 @@ export default {
   },
 };
 </script>
+
+<style lang="scss" scoped>
+.execute_type {
+  ::v-deep .edit-item_label {
+    width: 100px !important;
+  }
+}
+</style>

+ 135 - 0
ruoyi-ui/src/views/system/bpmnPro/components/Panel/components/ElementNormalTask.vue

@@ -0,0 +1,135 @@
+<template>
+  <el-collapse-item name="element-normal-task">
+    <template #title>
+      <collapse-title title="执行任务">
+        <lucide-icon name="FileSpreadsheet" />
+      </collapse-title>
+    </template>
+    <div class="element-normal-task">
+      <edit-item label="任务类型" :label-width="100">
+        <el-select
+          v-model="industryType"
+          value-key="value"
+          placeholder="请选择行业类型"
+          filterable
+          @change="updateIndustryType"
+        >
+          <el-option
+            v-for="{ label, value } in dict.type.industry_type"
+            :label="label"
+            :value="value"
+            :key="value"
+          />
+        </el-select>
+      </edit-item>
+      <edit-item label="选择任务" :label-width="100">
+        <!-- <el-input
+          v-model="industryType"
+          maxlength="32"
+          @change="setExternalTaskPriority"
+        /> -->
+        <el-select
+          v-model="normalScriptKey"
+          value-key="value"
+          placeholder="请选择执行任务"
+          clearable
+          filterable
+          @change="updateScriptKey"
+        >
+          <el-option
+            v-for="{ value, label } in scriptList"
+            :key="value"
+            :label="label"
+            :value="value"
+          >
+          </el-option>
+        </el-select>
+      </edit-item>
+      <edit-item label="触发方式" :label-width="100">
+        <!-- <el-input
+          v-model="industryType"
+          maxlength="32"
+          @change="setExternalTaskPriority"
+        /> -->
+        <el-select
+          v-model="scriptTriggerType"
+          value-key="value"
+          placeholder="请选择触发方式"
+          filterable
+          @change="updateScriptTriggerType"
+        >
+          <el-option
+            v-for="{ value, label } in dict.type.script_trigger_type"
+            :key="value"
+            :label="label"
+            :value="value"
+          >
+          </el-option>
+        </el-select>
+      </edit-item>
+    </div>
+  </el-collapse-item>
+</template>
+
+<script>
+import EventEmitter from "@utils/EventEmitter";
+import {
+  setIndustryType,
+  getIndustryType,
+  setNormalScriptKey,
+  getNormalScriptKey,
+  setNormalScriptTriggerType,
+  getNormalScriptTriggerType,
+} from "@packages/bo-utils/myFieldUtil";
+import { getActive } from "@packages/bpmn-utils/BpmnDesignerUtils";
+import { listScript } from "@/api/bpmprocess/process";
+
+export default {
+  name: "ElementNormalTask",
+  dicts: ["industry_type", "script_trigger_type"],
+  data() {
+    return {
+      scriptList: [],
+      industryType: "",
+      normalScriptKey: "",
+      scriptTriggerType: "0",
+    };
+  },
+
+  mounted() {
+    this.initFormData();
+    EventEmitter.on("element-update", () => {
+      this.initFormData();
+    });
+  },
+  methods: {
+    async initFormData() {
+      this.getScriptList();
+      this.industryType = getIndustryType(getActive());
+      this.normalScriptKey = getNormalScriptKey(getActive());
+      this.scriptTriggerType = getNormalScriptTriggerType(getActive());
+    },
+    updateIndustryType(value) {
+      setIndustryType(getActive(), value);
+    },
+    async getScriptList() {
+      let res = await listScript({ isEnablePaging: false, scriptType: 0 });
+      this.scriptList = res.rows.map((item) => ({
+        value: item.scriptKey,
+        label: item.scriptName,
+      }));
+    },
+    updateScriptKey(value) {
+      setNormalScriptKey(getActive(), value);
+    },
+    updateScriptTriggerType(value) {
+      setNormalScriptTriggerType(getActive(), value);
+    },
+  },
+};
+</script>
+<style scoped lang="scss">
+::v-deep .edit-item_label {
+  width: 80px !important;
+}
+</style>

+ 86 - 25
ruoyi-ui/src/views/system/bpmnPro/components/Panel/components/ElementUnusualTasks.vue

@@ -1,24 +1,47 @@
 <template>
   <el-collapse-item name="element-unusual-tasks">
     <template #title>
-      <collapse-title title="异常任务">
+      <collapse-title title="管道节点">
         <lucide-icon name="FileX2" />
       </collapse-title>
       <number-tag :value="listeners.length" margin-left="12px" />
     </template>
+    <el-form label-width="110px" :model="scriptForm">
+      <el-form-item label="脚本执行时机:">
+        <el-switch
+          active-text="节点后"
+          inactive-text="节点前"
+          v-model="scriptForm.scriptTriggerType"
+          @change="updateScriptTriggerType"
+        />
+      </el-form-item>
+    </el-form>
     <div class="element-unusual-tasks">
       <el-table border :data="listeners" style="width: 100%" height="200px">
         <el-table-column label="序号" type="index" width="50" />
         <el-table-column
           label="执行脚本"
-          prop="scriptKey"
+          prop="scriptName"
           show-overflow-tooltip
-        />
+        >
+          <!-- <template slot-scope="scope">
+            {{ getDictLabel(scope.row.scriptType, dict.type.bpm_script_type) }}
+          </template> -->
+        </el-table-column>
         <el-table-column
           label="触发方式"
           prop="scriptTriggerType"
           show-overflow-tooltip
-        />
+        >
+          <template slot-scope="scope">
+            {{
+              getDictLabel(
+                scope.row.scriptTriggerType,
+                dict.type.script_trigger_type
+              )
+            }}
+          </template>
+        </el-table-column>
         <el-table-column label="操作" width="140">
           <template slot-scope="{ row, $index }">
             <el-button type="text" @click="openScriptModel($index, row)"
@@ -37,13 +60,13 @@
         icon="el-icon-plus"
         @click="openScriptModel(-1)"
       >
-        添加执行监听
+        添加执行脚本
       </el-button>
     </div>
 
     <el-dialog
       :visible.sync="modelVisible"
-      title="添加可触发的异常任务"
+      title="添加可触发的脚本任务"
       width="640px"
       append-to-body
       destroy-on-close
@@ -55,26 +78,40 @@
         class="need-filled"
         aria-modal="true"
       >
-        <el-form-item path="scriptKey" label="任务脚本">
-          <el-select v-model="newUnusualTask.scriptKey">
+        <el-form-item path="industryType" label="行业类型">
+          <el-select v-model="newUnusualTask.industryType">
             <el-option
-              v-for="{ label, value } in scriptKeyList"
+              v-for="{ label, value } in dict.type.industry_type"
               :label="label"
               :value="value"
               :key="value"
             />
           </el-select>
         </el-form-item>
-        <el-form-item path="scriptTriggerType" label="事件触发类型">
-          <el-select v-model="newUnusualTask.scriptTriggerType">
+        <el-form-item path="scriptKey" label="任务脚本">
+          <el-select
+            v-model="newUnusualTask.scriptKey"
+            @change="scriptKeyChange"
+            :disabled="!newUnusualTask.industryType"
+          >
             <el-option
-              v-for="{ label, value } in scriptTriggerTypeList"
+              v-for="{ label, value } in scriptKeyList"
               :label="label"
               :value="value"
               :key="value"
             />
           </el-select>
         </el-form-item>
+        <el-form-item path="scriptTriggerType" label="事件触发机制">
+          <el-select v-model="newUnusualTask.scriptTriggerType">
+            <el-option
+              v-for="item in dict.type.script_trigger_type"
+              :label="item.label"
+              :value="item.value"
+              :key="item.value"
+            />
+          </el-select>
+        </el-form-item>
       </el-form>
       <template #footer>
         <el-button @click="modelVisible = false">取 消</el-button>
@@ -92,18 +129,25 @@ import {
   removeUnusualTask,
   updateUnusualTask,
   getUnusualTaskTableData,
+  getScriptTriggerType,
+  setScriptTriggerType,
 } from "@packages/bo-utils/myFieldUtil";
 import { getScriptType } from "@packages/bo-utils/scriptUtil";
 import EventEmitter from "@utils/EventEmitter";
 import { getActive } from "@packages/bpmn-utils/BpmnDesignerUtils";
+import { listScript } from "@/api/bpmprocess/process";
 
 export default {
   name: "ElementUnusualTasks",
+  dicts: ["script_trigger_type", "bpm_script_type", "industry_type"],
   data() {
     return {
       modelVisible: false,
       listeners: [],
       newUnusualTask: {},
+      scriptForm: {
+        scriptTriggerType: false,
+      },
       formRules: {
         scriptKey: {
           required: true,
@@ -113,19 +157,10 @@ export default {
         scriptTriggerType: {
           required: true,
           trigger: ["blur", "change"],
-          message: "任务触发方式不能为空",
+          message: "事件触发机制不能为空",
         },
       },
-      scriptKeyList: [
-        {
-          value: 1,
-          label: "缺货异常",
-        },
-        {
-          value: 2,
-          label: "人员异常",
-        },
-      ],
+      scriptKeyList: [],
       scriptTriggerTypeList: [
         {
           value: 0,
@@ -148,11 +183,14 @@ export default {
       this.modelVisible = false;
       this.newUnusualTask = {
         scriptKey: "",
-        scriptTriggerType: 0,
+        scriptTriggerType: "0",
+        industryType: "0",
+        scriptName: "",
         // event: getDefaultEvent(getActive()),
         // type: "class",
       };
       this._listenersRaw = getUnusualTasks(getActive());
+      this.scriptForm.scriptTriggerType = getScriptTriggerType(getActive());
 
       this.listeners = getUnusualTaskTableData(this._listenersRaw);
       console.log(this.listeners);
@@ -161,7 +199,7 @@ export default {
     updateScriptType(value) {
       this.newUnusualTask.script = {
         scriptFormat: this.newUnusualTask.script?.scriptFormat,
-        scriptType: value,
+        industryType: value,
       };
     },
     removeScript(index) {
@@ -171,6 +209,7 @@ export default {
     },
     async saveUnusualTask(index) {
       await this.$refs.formRef.validate();
+      console.log(this.newUnusualTask);
       this.activeIndex === -1
         ? addUnusualTask(getActive(), this.newUnusualTask)
         : updateUnusualTask(
@@ -183,11 +222,33 @@ export default {
 
     async openScriptModel(index, TaskData) {
       this.activeIndex = index;
+      console.log(TaskData);
       TaskData && (this.newUnusualTask = JSON.parse(JSON.stringify(TaskData)));
       this.modelVisible = true;
+      let res = await listScript({ isEnablePaging: false, scriptType: 0 });
+      this.scriptKeyList = res.rows.map((item) => ({
+        value: item.scriptKey,
+        label: item.scriptName,
+      }));
       await this.$nextTick();
       this.$refs.formRef && this.$refs.formRef.clearValidate();
     },
+    // 脚本名改变
+    scriptKeyChange(value) {
+      this.newUnusualTask.scriptName =
+        this.scriptKeyList.filter((item) => item.value == value)[0]?.label ||
+        "未命名脚本";
+    },
+
+    updateScriptTriggerType(value) {
+      setScriptTriggerType(getActive(), value);
+    },
+    // 获取字典对应label
+    getDictLabel(value, dictLsit = []) {
+      return dictLsit.find((item) => {
+        return item.value == value;
+      })?.label;
+    },
   },
 };
 </script>

+ 10 - 7
ruoyi-ui/src/views/system/bpmnPro/components/Panel/index.vue

@@ -45,6 +45,7 @@ import ElementExecuteUser from "@packages/Panel/components/ElementExecuteUser";
 import ElementBeforeNode from "@packages/Panel/components/ElementBeforeNode";
 import ElementAfterNode from "@packages/Panel/components/ElementAfterNode";
 import ElementUnusualTasks from "@packages/Panel/components/ElementUnusualTasks";
+import ElementNormalTask from "@packages/Panel/components/ElementNormalTask";
 
 export default {
   name: "BpmnPanel",
@@ -147,23 +148,25 @@ export default {
       // this.renderComponents.push(ElementDocumentations); //附加文档
       // isCanbeConditional(element) &&
       //   this.renderComponents.push(ElementConditional);
-      isJobExecutable(element) &&
-        this.renderComponents.push(ElementJobExecution);
+      // isJobExecutable(element) &&
+      //   this.renderComponents.push(ElementJobExecution);
       // this.renderComponents.push(ElementExtensionProperties); //扩展属性
-      isExecutable(element) &&
-        this.renderComponents.push(ElementExecutionListeners);
+      // isExecutable(element) &&
+      //   this.renderComponents.push(ElementExecutionListeners);
       // isAsynchronous(element) &&
       // this.renderComponents.push(ElementAsyncContinuations);
       isStartInitializable(element) &&
         this.renderComponents.push(ElementStartInitiator);
-      this.renderComponents.push(ElementExtensionField);
+      // this.renderComponents.push(ElementExtensionField);
       // 添加执行表单
       isTaskOrUserTask(element) &&
         this.renderComponents.push(ElementExecuteForm);
+      isTaskOrUserTask(element) &&
+        this.renderComponents.push(ElementNormalTask);
       !isProcess(element) && this.renderComponents.push(ElementUnusualTasks); //可处理异常
       isUserTask(element) && this.renderComponents.push(ElementExecuteUser);
-      !isProcess(element) && this.renderComponents.push(ElementBeforeNode);
-      !isProcess(element) && this.renderComponents.push(ElementAfterNode);
+      // !isProcess(element) && this.renderComponents.push(ElementBeforeNode);
+      // !isProcess(element) && this.renderComponents.push(ElementAfterNode);
     },
   },
 };

+ 15 - 8
ruoyi-ui/src/views/system/bpmnPro/components/Toolbar/tools/Save.vue

@@ -15,7 +15,7 @@ import xml from "highlight.js/lib/languages/xml";
 import { getProcessEngine } from "@packages/bpmn-utils/BpmnDesignerUtils";
 import EventEmitter from "@utils/EventEmitter";
 import { formDataValidate } from "@utils/formDataValidate";
-import { getNodeMsg } from "@packages/bo-utils/getNodeMsg";
+import { getNodeMsg, filterNodeMsg } from "@packages/bo-utils/getNodeMsg";
 
 import moment from "moment";
 export default {
@@ -27,6 +27,10 @@ export default {
     formData: {
       from: "formData",
     },
+    nodeData: {
+      from: "nodeData",
+      default: {},
+    },
   },
   methods: {
     async getProcess(type, name = "diagram") {
@@ -149,7 +153,7 @@ export default {
         updateProcess(subformData).then((res) => {
           if (res.code == 200) {
             _this.$message.success("修改成功");
-            this.saveNodeMsg(xmlObj);
+            this.updateNodeMsg(xmlObj);
           } else {
             _this.$message.error("修改失败");
           }
@@ -167,10 +171,12 @@ export default {
     },
     async saveNodeMsg(obj) {
       let data = getNodeMsg(obj);
+      // console.dir(obj.getElementsByTagName("bpmn:process")[0].id);
+      // return;
       if (!data.bpmProcessConfigurationList.length) return;
       data.bpmProcessConfigurationList.forEach((item) => {
         item.createBy = this.$store.state.user.name;
-        item.nodeProcessKey = obj.id;
+        item.nodeProcessKey = obj.getElementsByTagName("bpmn:process")[0].id;
         item.createTime = moment().format("YYYY-MM-DD HH:mm:ss");
       });
       try {
@@ -180,15 +186,16 @@ export default {
       }
     },
     async updateNodeMsg(obj) {
-      let data = getNodeMsg(obj.warnings);
-      if (!data.bpmProcessConfigurationList.length) return;
-      data.bpmProcessConfigurationList.forEach((item) => {
+      let data = getNodeMsg(obj);
+      let theData = filterNodeMsg(this.nodeData(), data);
+      if (!theData.bpmProcessConfigurationList.length) return;
+      theData.bpmProcessConfigurationList.forEach((item) => {
         item.updateBy = this.$store.state.user.name;
-        item.nodeProcessKey = obj.id || "";
+        item.nodeProcessKey = obj.getElementsByTagName("bpmn:process")[0].id;
         item.updateTime = moment().format("YYYY-MM-DD HH:mm:ss");
       });
       try {
-        let res = await updateConfiguration(data);
+        let res = await updateConfiguration(theData);
       } catch (error) {
         console.log(error);
       }

+ 57 - 13
ruoyi-ui/src/views/system/bpmnPro/components/bo-utils/getNodeMsg.js

@@ -35,23 +35,23 @@ export function getNodeMsg(xmlObj) {
   // let moddle = getModeler.getModdle();
   // console.log(moddle);
   // return;
+  console.dir(xmlObj);
   let prefix = getProcessEngine();
   let { attributes, childNodes } = xmlObj
     .getElementsByTagName("bpmn:process")[0];
-  let bpmProcessConfigurationList = [], bpmNodeHandleUserList = [], bpmNodeScriptRelevanceList = [], attributeArray = ['nodeKey', 'nodeFormKey', 'nodeProcessKey', 'nodeType', 'nodeBefore', 'nodeAfter', 'nodeRolePremission', 'spare1', 'spare2', 'spare3', 'createBy', 'updateBy', 'remark'];
+  let bpmProcessConfigurationList = [], bpmNodeHandleUserList = [], bpmNodeScriptRelevanceList = [], attributeArray = ['nodeKey', 'nodeFormKey', 'nodeProcessKey', 'nodeType', 'nodeRolePremission', 'spare1', 'spare2', 'spare3', 'createBy', 'updateBy', 'remark'];
   childNodes.forEach((node) => {
-    let uuid = uuidv4();
-    bpmNodeScriptRelevanceList = [...bpmNodeScriptRelevanceList, ...getNodeException(node)];//获取节点脚本数据
-    bpmNodeHandleUserList = [...bpmNodeHandleUserList, ...getBpmNodeHandleUser(node, uuid)]
+    // let uuid = uuidv4();
+
     let nodeObj = {
       nodeKey: '',
       nodeName: '',
       nodeFormKey: '', //节点表单别名
       nodeProcessKey: '', //流程别名
       nodeType: '',   //节点类型(判断节点,正常节点..)根据字典维护
-      nodeBefore: '',
-      nodeAfter: '',
-      nodeRolePremission: uuid, //节点对应的角色权限字符
+      nodeBefore: 'false',
+      nodeAfter: 'false',
+      nodeRolePremission: '', //节点对应的角色权限字符
       spare1: '',
       spare2: '',
       spare3: '',
@@ -59,12 +59,18 @@ export function getNodeMsg(xmlObj) {
       updateBy: '',  //修改者
       remark: '',    //节点描述
     }
+    let nodeExceptionList = getNodeException(node, nodeObj)
+    let bpmNodeHandleUser = getBpmNodeHandleUser(node, nodeObj)
+    bpmNodeScriptRelevanceList = [...bpmNodeScriptRelevanceList, ...nodeExceptionList];//获取节点脚本数据
+    bpmNodeHandleUserList = [...bpmNodeHandleUserList, ...bpmNodeHandleUser]
+    console.dir(node);
     attributeArray.forEach(attr => {
       let tempAttr = prefix + ':' + attr
       nodeObj[attr] = node.attributes[tempAttr]?.nodeValue || ''
     });
     nodeObj.nodeKey = node.id;
     nodeObj.nodeType = node.localName;
+    bpmNodeHandleUser.length && (nodeObj.nodeRolePermission = node.getAttribute(`${prefix}:virtuallyRole`));
     if (nodeObj.nodeType == "sequenceFlow") return;
     bpmProcessConfigurationList.push(nodeObj)
   })
@@ -75,11 +81,17 @@ export function getNodeMsg(xmlObj) {
   };
 }
 
-function getNodeException(node) {
-  // console.dir(node);
+function getNodeException(node, nodeObj) {
+  console.dir(node);
   let prefix = getProcessEngine();
   let res = []
   let { children } = node;
+  if (node.getAttribute(`${prefix}:NormalScriptKey`)) {
+    res.push({
+      scriptKey: node.getAttribute(`${prefix}:NormalScriptKey`),
+      scriptTriggerType: node.getAttribute(`${prefix}:NormalScriptTriggerType`)
+    })
+  }
   if (!children.length) return [];
   children = Array.from(children);//数组化
   let extensionElements = children.find((item) => item.nodeName == `bpmn:extensionElements`
@@ -98,17 +110,24 @@ function getNodeException(node) {
     item.nodeKey = node.id;
   })
   // console.log(res);
+  if (res.length) {
+    if (node.getAttribute(`${prefix}:scriptTriggerType`) == 'false') {
+      nodeObj.nodeBefore = 'true';
+    } else {
+      nodeObj.nodeAfter = 'true'
+    }
+  }
   return res;
 }
 
 
-function getBpmNodeHandleUser(node, uuid) {
+function getBpmNodeHandleUser(node, nodeObj) {
   if (node.localName !== 'userTask') return []
-  if (!node.attributes.length) return []
+  if (!node.attributes.length || !node.getAttribute('camunda:executeUser')) return []
   let res = {}, prefix = getProcessEngine();
+  let uuid = node.getAttribute(`${prefix}:virtuallyRole`)
   res.virtuallyRole = uuid;
-  console.dir(node);
-  console.log(node.getAttribute('camunda:executeUserType'), 'aaaa');
+  // nodeObj.nodeRolePremission = uuid
   let type = node.getAttribute('camunda:executeUserType');
   switch (type) {
     case '1':
@@ -125,4 +144,29 @@ function getBpmNodeHandleUser(node, uuid) {
   }
 
   return [res]
+}
+
+
+export function filterNodeMsg(oldMsg, newMsg) {
+  let keys = ['bpmProcessConfigurationList', 'bpmNodeScriptRelevanceList', 'bpmNodeHandleUserList']
+  newMsg[keys[0]].forEach(item => {
+    let sameNode = oldMsg[keys[0]].find((oldItem) => oldItem.nodeKey == item.nodeKey)
+    if (sameNode) {
+      item.id = sameNode.id;
+    }
+  })
+  newMsg[keys[1]].forEach(item => {
+    let sameNode = oldMsg[keys[1]].find((oldItem) => oldItem.nodeKey == item.nodeKey && oldItem.scriptKey == item.scriptKey)
+    if (sameNode) {
+      item.id = sameNode.id;
+    }
+  })
+  newMsg[keys[2]].forEach(item => {
+    let sameNode = oldMsg[keys[2]].find((oldItem) => oldItem.virtuallyRole == item.virtuallyRole)
+    if (sameNode) {
+      item.id = sameNode.id;
+    }
+  })
+
+  return newMsg;
 }

+ 90 - 7
ruoyi-ui/src/views/system/bpmnPro/components/bo-utils/myFieldUtil.js

@@ -7,7 +7,7 @@ import {
 } from "@packages/bpmn-utils/BpmnExtensionElements";
 import { getBusinessObject, is, isAny } from "bpmn-js/lib/util/ModelUtil";
 import { add as collectionAdd } from "diagram-js/lib/util/Collections";
-
+import { v4 as uuidv4 } from "uuid";
 
 // 版本描述
 export function getNoteValue(element) {
@@ -95,13 +95,18 @@ export function isUserTask(element) {
   return is(element, 'bpmn:UserTask');
 }
 
-export function setExecuteUser(element, value) {
+export function setExecuteUser(element, value, isUpdate) {
   const prefix = getProcessEngine();
   const modeling = getModeler.getModeling();
   const businessObject = getBusinessObject(element);
+  let uuid = uuidv4()
   modeling.updateModdleProperties(element, businessObject, {
     [`${prefix}:executeUser`]: value
   });
+  if (isUpdate) return
+  modeling.updateModdleProperties(element, businessObject, {
+    [`${prefix}:virtuallyRole`]: uuid
+  });
 }
 
 
@@ -185,7 +190,7 @@ export function getAfterNdoe(element) {
 }
 
 
-/* 异常任务 */
+/* 脚本任务 */
 
 export function getUnusualTasksContainer(element) {
   const businessObject = getBusinessObject(element);
@@ -205,10 +210,13 @@ export function addUnusualTask(element, props) {
 // 获取异常任务表数据
 export function getUnusualTaskTableData(moddleList = []) {
   const prefix = getProcessEngine();
+  console.log(moddleList);
   let res = moddleList.map(item => {
     return {
-      scriptKey: item?.$attrs[prefix + ':scriptKey'] || '',
-      scriptTriggerType: item?.$attrs[prefix + ':scriptTriggerType'] || 0
+      scriptKey: item?.$attrs.scriptKey || '',
+      scriptTriggerType: item?.$attrs.scriptTriggerType || '0',
+      scriptName: item?.$attrs.scriptName || '',
+      industryType: item?.$attrs.industryType || '0',
     }
   })
   return res
@@ -217,13 +225,15 @@ export function getUnusualTaskTableData(moddleList = []) {
 function updateTaskProperty(element, listener, props) {
   const modeling = getModeler.getModeling();
   const prefix = getProcessEngine();
-  const { scriptKey, scriptTriggerType } = props;
+  const { scriptKey, scriptTriggerType, scriptName, industryType } = props;
 
   const updateProperty = (key, value) =>
-    modeling.updateModdleProperties(element, listener, { [`${prefix}:${key}`]: value });
+    modeling.updateModdleProperties(element, listener, { [`${key}`]: value });
 
   scriptKey && updateProperty("scriptKey", scriptKey);
   scriptTriggerType && updateProperty("scriptTriggerType", scriptTriggerType);
+  scriptName && updateProperty('scriptName', scriptName);
+  industryType && updateProperty('industryType', industryType);
 }
 // 修改任务
 export function updateUnusualTask(element, props, listener) {
@@ -253,3 +263,76 @@ export function getUnusualTasksType(listener) {
   return "";
 }
 
+
+/* 脚本执行时机 */
+
+export function getScriptTriggerType(element) {
+  const prefix = getProcessEngine();
+  return element.businessObject.get(`${prefix}:scriptTriggerType`);
+}
+
+
+export function setScriptTriggerType(element, value) {
+
+  const modeling = getModeler.getModeling();
+  const prefix = getProcessEngine();
+
+  modeling.updateProperties(element, {
+    [`${prefix}:scriptTriggerType`]: value
+  });
+}
+
+
+
+/* 正常任务 */
+
+export function setIndustryType(element, value) {
+  const prefix = getProcessEngine();
+  const modeling = getModeler.getModeling();
+  const businessObject = getBusinessObject(element);
+  modeling.updateModdleProperties(element, businessObject, {
+    [`${prefix}:IndustryType`]: value
+  });
+}
+
+
+export function getIndustryType(element) {
+  const prefix = getProcessEngine();
+  const businessObject = getBusinessObject(element);
+
+  return businessObject.get(`${prefix}:IndustryType`);
+}
+
+
+export function setNormalScriptKey(element, value) {
+  const prefix = getProcessEngine();
+  const modeling = getModeler.getModeling();
+  const businessObject = getBusinessObject(element);
+  modeling.updateModdleProperties(element, businessObject, {
+    [`${prefix}:NormalScriptKey`]: value
+  });
+}
+
+
+export function getNormalScriptKey(element) {
+  const prefix = getProcessEngine();
+  const businessObject = getBusinessObject(element);
+
+  return businessObject.get(`${prefix}:NormalScriptKey`);
+}
+export function setNormalScriptTriggerType(element, value) {
+  const prefix = getProcessEngine();
+  const modeling = getModeler.getModeling();
+  const businessObject = getBusinessObject(element);
+  modeling.updateModdleProperties(element, businessObject, {
+    [`${prefix}:NormalScriptTriggerType`]: value
+  });
+}
+
+
+export function getNormalScriptTriggerType(element) {
+  const prefix = getProcessEngine();
+  const businessObject = getBusinessObject(element);
+
+  return businessObject.get(`${prefix}:NormalScriptTriggerType`);
+}

+ 7 - 1
ruoyi-ui/src/views/system/bpmnPro/index.vue

@@ -36,7 +36,7 @@ import "@bpmn-io/element-template-chooser/dist/element-template-chooser.css";
 import "bpmn-js-bpmnlint/dist/assets/css/bpmn-js-bpmnlint.css";
 import "bpmn-js-token-simulation/assets/css/bpmn-js-token-simulation.css";
 
-import { getProcess } from "@/api/bpmprocess/process";
+import { getProcess, getNodeData } from "@/api/bpmprocess/process";
 
 export default {
   name: "App",
@@ -51,6 +51,7 @@ export default {
     return {
       formData: undefined,
       xmlString: undefined,
+      nodeData: undefined,
     };
   },
   computed: {
@@ -59,6 +60,7 @@ export default {
   provide() {
     return {
       formData: () => this.formData,
+      nodeData: () => this.nodeData,
     };
   },
   methods: {
@@ -78,6 +80,10 @@ export default {
         if (this.getModeler) {
           this.getModeler.importXML(this.xmlString);
         }
+        let response = await getNodeData(this.formData.processKey);
+        if (response.code == 200) {
+          this.nodeData = response.data;
+        }
       } else {
       }
     }

+ 74 - 83
ruoyi-ui/src/views/tableMange/index.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="app-container">
     <el-row :gutter="20">
-      <el-col :span="18" :class="{edit: menudata}">
+      <el-col :span="18" :class="{ edit: menudata }">
         <el-card shadow="always" :body-style="{ padding: '20px' }">
           <template #header>
             <div>
@@ -194,7 +194,7 @@
           <!-- </el-form> -->
         </el-card>
       </el-col>
-      <el-col :span="6" :class="{menudata: menudata}">
+      <el-col :span="6" :class="{ menudata: menudata }">
         <el-tabs v-model="activeName" @tab-click="tabhandleClick">
           <el-tab-pane label="菜单编辑" name="menuedit">
             <el-card shadow="always" :body-style="{ padding: '10px' }">
@@ -270,8 +270,12 @@
                   </el-select>
                 </el-form-item>
                 <el-form-item label="排序方式" v-show="formData.orderByColumn">
-                  <el-radio v-model="formData.isAsc" label="ASC">升序</el-radio>
-                  <el-radio v-model="formData.isAsc" label="DESC">降序</el-radio>
+                  <el-radio v-model="formData.isAsc" :label="false"
+                    >升序</el-radio
+                  >
+                  <el-radio v-model="formData.isAsc" :label="true"
+                    >降序</el-radio
+                  >
                 </el-form-item>
                 <el-form-item>
                   <el-button size="mini" @click="previewHandle">预览</el-button>
@@ -292,46 +296,30 @@
             >
               添加数据字段
             </el-button>
-            
-            <el-button size="mini" type="primary" @click=countHandle>确定统计</el-button>
-         
+
+            <el-button size="mini" type="primary" @click="countHandle"
+              >确定统计</el-button
+            >
+
             <el-table
               :data="datacountTable"
               border
               class="mb10"
-              style="width: 100%">
-              <el-table-column
-                prop="number"
-                label="序号"
-                width="50">
+              style="width: 100%"
+            >
+              <el-table-column prop="number" label="序号" width="50">
               </el-table-column>
-              <el-table-column
-                prop="datafield"
-                label="数据字段"
-                width="80">
+              <el-table-column prop="datafield" label="数据字段" width="80">
               </el-table-column>
-              <el-table-column
-                prop="type"
-                label="类型"
-                width="50">
+              <el-table-column prop="type" label="类型" width="50">
               </el-table-column>
-              <el-table-column
-                prop="statuscode"
-                label="状态码"
-                width="70">
+              <el-table-column prop="statuscode" label="状态码" width="70">
               </el-table-column>
-              <el-table-column
-                prop="title"
-                label="标题"
-                width="83">
+              <el-table-column prop="title" label="标题" width="83">
               </el-table-column>
-              <el-table-column
-                prop="description"
-                label="描述"
-                width="150">
+              <el-table-column prop="description" label="描述" width="150">
               </el-table-column>
             </el-table>
-
           </el-tab-pane>
         </el-tabs>
       </el-col>
@@ -496,36 +484,38 @@
     <el-dialog
       title="添加统计数据字段"
       :visible.sync="isShowAddData"
-      width="30%">
-
-      <el-form 
-      label-width="100px" 
-      :model="dataCountFormData">
+      width="30%"
+    >
+      <el-form label-width="100px" :model="dataCountFormData">
         <el-form-item label="数据字段">
-          <el-select 
-          v-model="dataCountFormData.datafield" 
-          placeholder="请选择数据字段">
-            <el-option 
-            v-for="item in dataArr"
-            :key="item.id"
-            :label="item.fieldName" 
-            :value="item.fieldName">
-          </el-option>
+          <el-select
+            v-model="dataCountFormData.datafield"
+            placeholder="请选择数据字段"
+          >
+            <el-option
+              v-for="item in dataArr"
+              :key="item.id"
+              :label="item.fieldName"
+              :value="item.fieldName"
+            >
+            </el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="类型">
-          <el-select 
-          v-model="dataCountFormData.type" 
-          placeholder="请选择类型">
+          <el-select v-model="dataCountFormData.type" placeholder="请选择类型">
             <el-option label="数量" value="num"></el-option>
             <el-option label="状态" value="status"></el-option>
           </el-select>
         </el-form-item>
 
-        <el-form-item label="状态码" v-show="dataCountFormData.type === 'status' ">
-          <el-select 
-          v-model="dataCountFormData.statuscode" 
-          placeholder="请选择状态码">
+        <el-form-item
+          label="状态码"
+          v-show="dataCountFormData.type === 'status'"
+        >
+          <el-select
+            v-model="dataCountFormData.statuscode"
+            placeholder="请选择状态码"
+          >
             <el-option label="已完成" value="1"></el-option>
             <el-option label="未完成" value="0"></el-option>
           </el-select>
@@ -663,7 +653,7 @@ export default {
         isShowList: true,
         timeFormate: "",
         orderByColumn: "",
-        isAsc: "ASC",
+        isAsc: false,
         primaryKey: "",
       },
       rules: {
@@ -691,7 +681,7 @@ export default {
         pageNum: 1,
         pageSize: 10,
         orderByColumn: "",
-        isAsc: "DESC",
+        isAsc: false,
         basicMap: {
           sql: "",
         },
@@ -701,7 +691,7 @@ export default {
       editData: {},
       menuOrderNum: 0,
       // tab动态切换
-      activeName: 'menuedit', 
+      activeName: "menuedit",
       // 数据统计对象
       dataCountFormData: {},
       // 数据统计表格
@@ -709,13 +699,13 @@ export default {
       // 是否切换到数据统计
       menudata: false,
       // 显示添加字段对话框
-      isShowAddData: false
+      isShowAddData: false,
     };
   },
   computed: {
     // 数据字段
-    dataArr(){
-      return this.tableFieldList.filter(item => item.isShow)
+    dataArr() {
+      return this.tableFieldList.filter((item) => item.isShow);
     },
     ...mapState({
       databaseName: (state) => state.user.dataSource.databaseName,
@@ -1508,34 +1498,36 @@ export default {
     },
     // tab切换
     tabhandleClick() {
-      this.menudata = this.activeName === 'datacount' ? true : false;
+      this.menudata = this.activeName === "datacount" ? true : false;
     },
     // 添加数据字段
-    addData(){
-      this.dataCountFormData.number =  this.datacountTable.length + 1
-      console.log(this.dataCountFormData)
-      this.dataCountFormData.type = this.dataCountFormData.type == 'num' ? '数量' : '状态'
-      if(this.dataCountFormData.type == 'status'){
-        this.dataCountFormData.statuscode = this.dataCountFormData.type == '1' ? '已完成' : '未完成'
+    addData() {
+      this.dataCountFormData.number = this.datacountTable.length + 1;
+      console.log(this.dataCountFormData);
+      this.dataCountFormData.type =
+        this.dataCountFormData.type == "num" ? "数量" : "状态";
+      if (this.dataCountFormData.type == "status") {
+        this.dataCountFormData.statuscode =
+          this.dataCountFormData.type == "1" ? "已完成" : "未完成";
       }
-      
-      this.datacountTable.push(this.dataCountFormData)
-      this.isShowAddData = false
-      this.dataCountFormData = {}
+
+      this.datacountTable.push(this.dataCountFormData);
+      this.isShowAddData = false;
+      this.dataCountFormData = {};
     },
     // 关闭添加数据字段
-    closeAddDialog(){
-      this.isShowAddData = false
-      this.dataCountFormData = {}
+    closeAddDialog() {
+      this.isShowAddData = false;
+      this.dataCountFormData = {};
     },
     // 确定统计
-    countHandle(){
-      if(this.datacountTable.length == 0){
+    countHandle() {
+      if (this.datacountTable.length == 0) {
         this.$message.warning("请确定统计数据字段");
-        return
+        return;
       }
-      console.log('确定统计');
-    }
+      console.log("确定统计");
+    },
   },
   created() {},
   async mounted() {
@@ -1557,14 +1549,13 @@ export default {
 ::v-deep .vue-treeselect--has-value .vue-treeselect__input {
   vertical-align: middle !important;
 }
-.menudata{
+.menudata {
   width: 30% !important;
 }
-.edit{
+.edit {
   width: 70% !important;
 }
-.mb10{
+.mb10 {
   margin-top: 10px;
 }
-
 </style>