Переглянути джерело

Merge remote-tracking branch 'origin/master'

侯茂昌 1 рік тому
батько
коміт
9964e6bf86

+ 3 - 3
ruoyi-ui/.env.development

@@ -11,10 +11,10 @@ VUE_APP_BASE_API = '/dev-api'
 VUE_CLI_BABEL_TRANSPILE_MODULES = true
 
 #数据引擎模块IP
-VUE_APP_BASE_API2 = 'http://192.168.110.76:8099/'
+VUE_APP_BASE_API2 = 'http://192.168.110.59:8099/'
 
 #表单引擎模块IP
-VUE_APP_BASE_API3 = 'http://192.168.110.76:8088/'
+VUE_APP_BASE_API3 = 'http://192.168.110.59:8088/'
 
 #流程引擎模块IP
-VUE_APP_BASE_API4 = 'http://192.168.110.76:8055/'
+VUE_APP_BASE_API4 = 'http://192.168.110.59:8055/'

+ 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) {

+ 38 - 1
ruoyi-ui/src/views/bpmprocess/index.vue

@@ -51,7 +51,7 @@
         </el-date-picker>
       </el-form-item>
       <!-- <el-form-item label="版本状态" prop="processVersion">
-       
+
         <el-select
           v-model="queryParams.processVersion"
           value-key="value"
@@ -484,6 +484,43 @@ export default {
     },
     /** 重置按钮操作 */
     resetQuery() {
+
+      let endFormData = {
+        // 节点脚本关联表
+        BpmNodeExceptionList: [{
+          id:null,
+          nodeKey: null,           // 节点别名
+          scriptKey: null,         // 脚本别名
+          scriptTriggerType: null  // 脚本触发机制(0:手动 1:自动)
+        }],
+        // 节点操作人 -》 数据传输分两种情况:1.当前节点勾选了指定用户,就需要前端生成一个虚拟的角色编码、以及指定的用户id、真实的角色编码null即可
+        // 2.当前节点根据角色勾选的执行人,就需要存贮真实的角色权限字符 生成一个虚拟的角色编码,其他为null即可
+        // 节点处理人表
+        BpmNodeHandleUser: [{
+          id:null,
+          virtuallyRole: null,  // 前端生成的虚拟角色编码
+          realRole: null,       // 真实的角色编码  [1,2,3]/[1]
+          executeUserNo: null   // 用户编码  [1,2,3]/[1]
+        }],
+        // 所有节点表
+        BpmProcessConfigurationList: [{
+          id:null,
+          nodeKey: null,          // 节点别名
+          nodeName: null,         // 节点名称
+          nodeFormKey: null,      // 节点表单别名
+          nodeProcessKey: null,   // 流程别名
+          nodeType: null,         // 节点类型(判断节点、正常节点。。。)根据字典维护
+          nodeBefor: null,        // 节点前
+          nodeAfter: null,        // 节点后
+          nodeRolePermission: null,// 节点对应的角色权限字符(只存虚拟角色编码)
+          spare1: null,             // 备用列
+          spare2: null,
+          spare3: null,
+          createBy: null,            // 创建者
+          updateBy: null,            // 修改者
+          remark: null              // 节点描述
+        }]
+      }
       this.resetForm("queryForm");
       this.handleQuery();
     },

+ 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>

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

@@ -0,0 +1,134 @@
+<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() {
+      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 {
       }
     }

+ 150 - 76
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>
@@ -63,7 +63,18 @@
             <el-table-column prop="fieldDescription" label="字段描述">
               <template slot-scope="scope">
                 <!-- <el-form-item size="normal" prop="fieldDescription"> -->
-                <input  :class="{isNullDesc : scope.row.fieldDescription == ''&& scope.row.isShow && isInputInvalid ? true : false, ipt:true}" v-model="scope.row.fieldDescription" />
+                <input
+                  :class="{
+                    isNullDesc:
+                      scope.row.fieldDescription == '' &&
+                      scope.row.isShow &&
+                      isInputInvalid
+                        ? true
+                        : false,
+                    ipt: true,
+                  }"
+                  v-model="scope.row.fieldDescription"
+                />
 
                 <!-- <el-input v-model="scope.row.fieldDescription" /> -->
                 <!-- </el-form-item> -->
@@ -201,7 +212,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' }">
@@ -277,8 +288,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>
@@ -299,36 +314,45 @@
             >
               添加数据字段
             </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="dragTableStatisticList"
               border
               class="mb10"
+              style="width: 100%"
+            >
+              <!-- <el-table-column prop="number" label="序号" width="50"> -->
               style="width: 100%">
               <el-table-column
                 type="index"
                 label="序号"
                 width="50"
                 class-name="allowDrag"
-                >
+              >
               </el-table-column>
+              <!-- <el-table-column prop="datafield" label="数据字段" width="80"> -->
               <el-table-column
                 prop="statisticTitle"
                 label="统计标题"
-                width="83">
+                width="83"
+              >
               </el-table-column>
               <el-table-column
                 prop="statisticField"
                 label="统计数据"
-                width="80">
+                width="80"
+              >
               </el-table-column>
-              <el-table-column
-                prop="statisticType"
-                label="统计类型"
-                width="50">
+              <!-- <el-table-column prop="type" label="类型" width="50"> -->
+              <el-table-column prop="statisticType" label="统计类型" width="50">
+              </el-table-column>
+              <el-table-column prop="statuscode" label="状态码" width="70">
               </el-table-column>
+              <!-- <el-table-column prop="title" label="标题" width="83"> -->
               <!-- <el-table-column
                 prop="statuscode"
                 label="状态码"
@@ -337,15 +361,17 @@
               <el-table-column
                 prop="statisticDescription"
                 label="统计描述"
-                width="150">
+                width="150"
+              >
               </el-table-column>
+              <!-- <el-table-column prop="description" label="描述" width="150"> -->
               <el-table-column
                 prop="statisticObject"
                 label="统计对象"
-                width="150">
+                width="150"
+              >
               </el-table-column>
             </el-table>
-
           </el-tab-pane>
         </el-tabs>
       </el-col>
@@ -510,36 +536,70 @@
     <el-dialog
       title="添加统计数据字段"
       :visible.sync="isShowAddData"
-      width="30%">
+      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>
+      width="30%"> -->
 
-      <el-form 
-      label-width="100px" 
-      :model="dataCountFormData">
+      <el-form label-width="100px" :model="dataCountFormData">
         <el-form-item label="统计标题" prop="statisticTitle">
           <el-input v-model="dataCountFormData.statisticTitle"></el-input>
         </el-form-item>
 
         <el-form-item label="统计数据">
-          <el-select 
-          v-model="dataCountFormData.statisticField" 
-          placeholder="请选择统计字段">
-            <el-option 
-            v-for="item in dataArr"
-            :key="item.id"
-            :label="item.fieldName" 
-            :value="item.fieldName">
+          <el-select
+            v-model="dataCountFormData.statisticField"
+            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-option label="数量" value="num"></el-option>
+            <el-option label="状态" value="status"></el-option> -->
         <el-form-item label="统计类型">
-          <el-select 
-          v-model="dataCountFormData.statisticType" 
-          placeholder="请选择统计类型">
-            <el-option v-for="item in dataType" :key="item.dictCode" :label="item.dictLabel" :value="item.dictLabel"></el-option>
+          <el-select
+            v-model="dataCountFormData.statisticType"
+            placeholder="请选择统计类型"
+          >
+            <el-option
+              v-for="item in dataType"
+              :key="item.dictCode"
+              :label="item.dictLabel"
+              :value="item.dictLabel"
+            ></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.statisticType === 'status' ">
           <el-select 
           v-model="dataCountFormData.statuscode" 
@@ -547,7 +607,8 @@
             <el-option label="已完成" value="1"></el-option>
             <el-option label="未完成" value="0"></el-option>
           </el-select>
-        </el-form-item> -->
+        </el-form-item>
+        -->
 
         <el-form-item label="统计描述" prop="statisticDescription">
           <el-input v-model="dataCountFormData.statisticDescription"></el-input>
@@ -686,7 +747,7 @@ export default {
         isShowList: true,
         timeFormate: "",
         orderByColumn: "",
-        isAsc: "ASC",
+        isAsc: false,
         primaryKey: "",
       },
       rules: {
@@ -714,7 +775,7 @@ export default {
         pageNum: 1,
         pageSize: 10,
         orderByColumn: "",
-        isAsc: "DESC",
+        isAsc: false,
         basicMap: {
           sql: "",
         },
@@ -724,7 +785,7 @@ export default {
       editData: {},
       menuOrderNum: 0,
       // tab动态切换
-      activeName: 'menuedit', 
+      activeName: "menuedit",
       // 数据统计对象
       dataCountFormData: {},
       // 数据统计表格
@@ -733,13 +794,13 @@ export default {
       menudata: false,
       // 显示添加字段对话框
       isShowAddData: false,
-      dataType : [],
+      dataType: [],
     };
   },
   computed: {
     // 数据字段
-    dataArr(){
-      return this.tableFieldList.filter(item => item.isShow)
+    dataArr() {
+      return this.tableFieldList.filter((item) => item.isShow);
     },
     ...mapState({
       databaseName: (state) => state.user.dataSource.databaseName,
@@ -795,7 +856,6 @@ export default {
     },
   },
   methods: {
-
     // 字段描述验证规则
     // blurval(value){
     //   this.isInputInvalid = value == '' ?  true : false;
@@ -828,7 +888,7 @@ export default {
       console.log(data);
       // 获取当前表单结构信息
       getListName(data).then((res) => {
-        console.log(res)
+        console.log(res);
         this.tableFieldList = res.map((item, index) => {
           return {
             id: this.tableName + "_" + item.fieldName,
@@ -1311,7 +1371,7 @@ export default {
     async createHandle() {
       console.log(123);
       this.tableKey = uuidv4();
-      this.isInputInvalid = true
+      this.isInputInvalid = true;
       this.$refs.formData.validate(async (valid) => {
         if (valid) {
           // 检验表单合法性
@@ -1447,9 +1507,9 @@ export default {
               res = await addDragTable(data);
             }
 
-            console.log('res', res);
-            if(res.code == 200){
-              this.countHandle()
+            console.log("res", res);
+            if (res.code == 200) {
+              this.countHandle();
             }
             // 关闭当前页面
             if (this.tId) {
@@ -1545,38 +1605,52 @@ export default {
     },
     // tab切换
     tabhandleClick() {
-      this.menudata = this.activeName === 'datacount' ? true : false;
+      this.menudata = this.activeName === "datacount" ? true : false;
+    },
+    // 添加数据字段对话框
+    async addDataDialog() {
+      this.isShowAddData = true;
+      this.dataType = await this.getDicts("table_statistic_type");
+      this.dataType = this.dataType.data;
+      // console.log(this.dataType)
     },
     // 添加数据字段对话框
     async addDataDialog() {
-      this.isShowAddData = true
-      this.dataType = await this.getDicts("table_statistic_type")
-      this.dataType = this.dataType.data
+      this.isShowAddData = true;
+      this.dataType = await this.getDicts("table_statistic_type");
+      this.dataType = this.dataType.data;
       // console.log(this.dataType)
     },
     // 添加数据字段
-    addData(){
-      this.dataCountFormData.tableKey = this.tableKey
-      this.dragTableStatisticList.push(this.dataCountFormData)
-      console.log(this.dragTableStatisticList)
-      this.isShowAddData = false
-      this.dataCountFormData = {}
+    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 = {};
     },
     // 关闭添加数据字段
-    closeAddDialog(){
-      this.isShowAddData = false
-      this.dataCountFormData = {}
+    closeAddDialog() {
+      this.isShowAddData = false;
+      this.dataCountFormData = {};
     },
     // 确定统计
-    countHandle(){
-      if(this.dragTableStatisticList.length == 0){
+    // countHandle() {
+    //   if (this.datacountTable.length == 0) {
+    countHandle() {
+      if (this.dragTableStatisticList.length == 0) {
         this.$message.warning("请确定统计数据字段");
-        return
+        return;
       }
-      console.log('确定统计');
-
-      console.log(this.dragTableStatisticList);
-    }
+      console.log("确定统计");
+    },
   },
   created() {},
   async mounted() {
@@ -1592,7 +1666,7 @@ export default {
 </script>
 
 <style scoped lang="scss">
-.ipt{
+.ipt {
   height: 36px;
   line-height: 36px;
   font-size: 14px;
@@ -1600,16 +1674,16 @@ export default {
   outline: none;
   text-align: center;
   background-color: #fff;
-  border: 1px solid #DCDFE6;
+  border: 1px solid #dcdfe6;
   color: #606266;
   display: inline-block;
   border-radius: 4px;
 }
-.isNullDesc{
-  border-color: #FF4949 !important;
+.isNullDesc {
+  border-color: #ff4949 !important;
 }
 
-.ipt:focus{
+.ipt:focus {
   border-color: #1890ff;
 }
 ::v-deep .right_card {
@@ -1618,13 +1692,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>

+ 31 - 28
ruoyi-ui/src/views/tablelist/commonTable/listInfo.vue

@@ -41,7 +41,7 @@
             :underline="false"
             style="font-size: 12px; vertical-align: baseline"
             @click="importTemplate"
-            >下载模板
+          >下载模板
           </el-link>
         </div>
       </el-upload>
@@ -64,7 +64,7 @@
           icon="el-icon-plus"
           size="mini"
           @click="handleAdd"
-          >新增
+        >新增
         </el-button>
       </el-col>
       <el-col :span="1.5" v-if="false">
@@ -75,7 +75,7 @@
           size="mini"
           :disabled="single"
           @click="handleUpdate"
-          >修改
+        >修改
         </el-button>
       </el-col>
       <el-col :span="1.5">
@@ -86,7 +86,7 @@
           size="mini"
           :disabled="multiple"
           @click="handleDelete"
-          >删除
+        >删除
         </el-button>
       </el-col>
       <el-col :span="1.5">
@@ -95,7 +95,7 @@
           icon="el-icon-upload2"
           size="mini"
           @click="upload.open = true"
-          >导入
+        >导入
         </el-button>
       </el-col>
       <el-col :span="1.5">
@@ -105,7 +105,7 @@
           icon="el-icon-download"
           size="mini"
           @click="handleExport"
-          >导出
+        >导出
         </el-button>
       </el-col>
       <right-toolbar
@@ -153,7 +153,7 @@
                   type="text"
                   icon="el-icon-edit"
                   @click="handleUpdate(scope.row)"
-                  >修改
+                >修改
                 </el-button>
               </el-dropdown-item>
               <el-dropdown-item>
@@ -162,7 +162,7 @@
                   type="text"
                   icon="el-icon-delete"
                   @click="handleDelete(scope.row)"
-                  >删除
+                >删除
                 </el-button>
               </el-dropdown-item>
             </el-dropdown-menu>
@@ -211,14 +211,14 @@ import {
   addTableData,
   batchEdit,
 } from "@/api/tablelist/commonTable";
-import { getToken } from "@/utils/auth";
+import {getToken} from "@/utils/auth";
 import Queryfrom from "@/views/tablelist/commonTable/queryfrom.vue";
-import { camelCase } from "@/utils";
-import { inputDisableComplete } from "@/utils/other";
+import {camelCase} from "@/utils";
+import {inputDisableComplete} from "@/utils/other";
 
 export default {
   name: "listInfo",
-  components: { Queryfrom },
+  components: {Queryfrom},
   data() {
     return {
       // 遮罩层
@@ -257,18 +257,18 @@ export default {
         // 是否更新已经存在的数据
         updateSupport: 0,
         // 设置上传的请求头部
-        headers: { Authorization: "Bearer " + getToken() },
+        headers: {Authorization: "Bearer " + getToken()},
         // 上传的地址
         url: process.env.VUE_APP_BASE_API3 + "common/uploadData",
       },
       // 排序方式 默认降序
-      sortState: true,
+      sortOrder: true,
       // 共通查询参数接受子组件的参数
       queryParams: {
         pageNum: 1, // 第几页
         pageSize: 10, // 每页大小
         orderByColumn: "", // 根据某列排序
-        isAsc: this.sortState ? "DESC" : "ASC", // desc(降序)或 asc(升序)
+        isAsc: "", // desc(降序)或 asc(升序)
         // 基本查询参数
         basicMap: {
           tableName: "drag_form",
@@ -367,13 +367,15 @@ export default {
       // 序列化当前查询参数列表
       queryParams && (this.queryParams.queryMap = queryParams.queryMap);
       // 获取当前表单结构信息
-      dragTableInfo({ queryMap: { sqlkey: this.sqlkey } })
+      dragTableInfo({queryMap: {sqlkey: this.sqlkey}})
         .then((res) => {
           // 得到当前模版信息 --- sql columns queryWhere
           this.templateInfo = res.data.resultMap;
           this.queryParams.orderByColumn =
             res.data.resultMap.querySql.orderByColumn;
-          this.queryParams.isAsc = res.data.resultMap.querySql.sortOrder;
+          this.sortOrder = JSON.parse(res.data.resultMap.querySql.sortOrder);
+          // 根据拖拽时设置当前列表排列顺序
+          this.queryParams.isAsc = this.sortOrder ? "DESC" : "ASC"
           this.tableName = this.templateInfo.template.dtTableName;
           // 得到查询条件
           this.queryFromWhere = res.data.resultMap.where;
@@ -419,9 +421,9 @@ export default {
       this.$refs.mychild.pageList(
         row == undefined
           ? {
-              limit: this.queryParams.pageSize,
-              page: this.queryParams.pageNum,
-            }
+            limit: this.queryParams.pageSize,
+            page: this.queryParams.pageNum,
+          }
           : row
       );
     },
@@ -451,7 +453,7 @@ export default {
     handleAdd(row) {
       // this.reset();
       this.defaultValue = {};
-      getInfoBySqlKey(this.sqlkey).then(({ data }) => {
+      getInfoBySqlKey(this.sqlkey).then(({data}) => {
         if (!data || !data.dfVueTemplate) {
           this.$message.error("当前表格未绑定表单!");
           return;
@@ -468,7 +470,7 @@ export default {
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
-      getInfoBySqlKey(this.sqlkey).then(({ data }) => {
+      getInfoBySqlKey(this.sqlkey).then(({data}) => {
         if (!data || !data.dfVueTemplate) {
           this.$message.error("当前表格未绑定表单!");
           return;
@@ -547,7 +549,8 @@ export default {
           this.$refs.mychild.pageList();
           this.$modal.msgSuccess("删除成功");
         })
-        .catch(() => {});
+        .catch(() => {
+        });
     },
     /** 导出按钮操作 */
     handleExport() {
@@ -580,7 +583,7 @@ export default {
     importTemplate() {
       this.download(
         process.env.VUE_APP_BASE_API3 +
-          `common/exportTemplate?tableName=${this.tableName}&sqlkey=${this.sqlkey}`,
+        `common/exportTemplate?tableName=${this.tableName}&sqlkey=${this.sqlkey}`,
         {},
         `下载模版名称${new Date().getTime()}.xlsx`
       );
@@ -596,10 +599,10 @@ export default {
       this.$refs.upload.clearFiles();
       this.$alert(
         "<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
-          response.msg +
-          "</div>",
+        response.msg +
+        "</div>",
         "导入结果",
-        { dangerouslyUseHTMLString: true }
+        {dangerouslyUseHTMLString: true}
       );
       this.$refs.mychild.pageList({
         limit: this.queryParams.pageSize,
@@ -647,7 +650,7 @@ export default {
             updateData.conditionMap[this.templateInfo.template?.primaryKey] =
               this.defaultValue[
                 camelCase(this.templateInfo.template?.primaryKey)
-              ];
+                ];
             Object.keys(values).map((k) => {
               updateData.commMap[k] = values[k];
             });

+ 1 - 1
ruoyi-ui/vue.config.js

@@ -37,7 +37,7 @@ module.exports = {
     proxy: {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
-        target: `http://192.168.110.15:8080`,
+        target: `http://192.168.110.59:8080`,
         changeOrigin: true,
         pathRewrite: {
           ['^' + process.env.VUE_APP_BASE_API]: ''