Procházet zdrojové kódy

Merge branch 'master' of http://49.233.37.222:3000/wjm/mec-cloud_IntelligentManufacturing_CRM

Zn před 1 rokem
rodič
revize
a9e246d872

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

@@ -80,3 +80,23 @@ export function enableProcess(data) {
   })
 }
 
+
+// 新增流程配置
+export function addConfiguration(data) {
+  return request({
+    url: '/system/configuration',
+    method: 'post',
+    data: data,
+    baseURL: process.env.VUE_APP_BASE_API4,
+  })
+}
+
+// 修改流程配置
+export function updateConfiguration(data) {
+  return request({
+    url: '/system/configuration',
+    method: 'put',
+    data: data,
+    baseURL: process.env.VUE_APP_BASE_API4,
+  })
+}

+ 14 - 10
ruoyi-ui/src/assets/styles/bpmn-properties-theme.scss

@@ -1,5 +1,5 @@
 .bpp-properties-panel {
-  background-color: rgba(27, 31, 35, .05);
+  background-color: rgba(27, 31, 35, 0.05);
   // border-color: rgba(0, 0, 0, 0.09);
   box-shadow: 0 2px 8px rgba(0, 0, 0, 0.09);
 }
@@ -13,7 +13,7 @@
   color: #fff;
 }
 
-.bpp-properties-header>.label {
+.bpp-properties-header > .label {
   color: #0e88eb;
   font-size: 16px;
 }
@@ -22,28 +22,28 @@
   font-size: 12px;
 }
 
-ul.bpp-properties-tabs-links>li.bpp-active a {
+ul.bpp-properties-tabs-links > li.bpp-active a {
   border-top: 2px solid #0e88eb;
   color: #0e88eb;
 }
 
-ul.bpp-properties-tabs-links>li>a {
+ul.bpp-properties-tabs-links > li > a {
   border: 1px solid #0e88eb;
   border-radius: 2px 2px 0 0;
 }
 
-.bpp-properties-group:hover>.group-toggle {
+.bpp-properties-group:hover > .group-toggle {
   background-color: #0e88eb;
 }
 
-.bpp-properties-group>.group-label {
+.bpp-properties-group > .group-label {
   font-size: 16px;
   color: #0e88eb;
   border-bottom: 2px solid #0e88eb;
   font-style: normal;
 }
 
-.bpp-properties-panel [type=text],
+.bpp-properties-panel [type="text"],
 .bpp-properties-panel [contenteditable],
 .bpp-properties-panel textarea,
 .bpp-properties-panel select {
@@ -95,10 +95,14 @@ ul.bpp-properties-tabs-links>li>a {
   border-color: #0e88eb;
 }
 
-.bpp-properties-group+.bpp-properties-group {
+.bpp-properties-group + .bpp-properties-group {
   border-top: 1px dotted #0e88eb;
 }
 
-.bpp-checkbox input{
+.bpp-checkbox input {
   margin-right: 2px;
-}
+}
+
+.bjs-powered-by {
+  display: none;
+}

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 820 - 41
ruoyi-ui/src/components/updateModule/bpmn-js/lib/BaseViewer.js


+ 54 - 0
ruoyi-ui/src/views/system/bpmnPro/components/Panel/components/ElementAfterNode.vue

@@ -0,0 +1,54 @@
+<template>
+  <el-collapse-item name="element-after-node">
+    <template #title>
+      <collapse-title title="节点后">
+        <lucide-icon name="User" />
+      </collapse-title>
+    </template>
+    <div class="element-after-node">
+      <edit-item label="节点后" :label-width="100">
+        <el-input
+          v-model="afterNodeValue"
+          maxlength="32"
+          @change="updateBeforeNodeValue"
+        />
+      </edit-item>
+    </div>
+  </el-collapse-item>
+</template>
+
+<script>
+import EventEmitter from "@utils/EventEmitter";
+import { setAfterNdoe, getAfterNdoe } from "@packages/bo-utils/myFieldUtil";
+import { getActive } from "@packages/bpmn-utils/BpmnDesignerUtils";
+
+export default {
+  name: "ElementAfterNode",
+  data() {
+    return {
+      afterNodeValue: "",
+    };
+  },
+
+  mounted() {
+    this.initFormData();
+    EventEmitter.on("element-update", () => {
+      this.initFormData();
+    });
+  },
+  methods: {
+    initFormData() {
+      this.afterNodeValue = getAfterNdoe(getActive()) || "";
+    },
+    updateBeforeNodeValue(value) {
+      setAfterNdoe(getActive(), value);
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+.exe_user_type_input {
+  display: flex;
+  padding-right: 25px;
+}
+</style>

+ 54 - 0
ruoyi-ui/src/views/system/bpmnPro/components/Panel/components/ElementBeforeNode.vue

@@ -0,0 +1,54 @@
+<template>
+  <el-collapse-item name="element-before-node">
+    <template #title>
+      <collapse-title title="节点前">
+        <lucide-icon name="User" />
+      </collapse-title>
+    </template>
+    <div class="element-before-node">
+      <edit-item label="节点前操作" :label-width="100">
+        <el-input
+          v-model="beforeNodeValue"
+          maxlength="32"
+          @change="updateBeforeNodeValue"
+        />
+      </edit-item>
+    </div>
+  </el-collapse-item>
+</template>
+
+<script>
+import EventEmitter from "@utils/EventEmitter";
+import { setBeforeNdoe, getBeforeNdoe } from "@packages/bo-utils/myFieldUtil";
+import { getActive } from "@packages/bpmn-utils/BpmnDesignerUtils";
+
+export default {
+  name: "ElementBeforeNode",
+  data() {
+    return {
+      beforeNodeValue: "",
+    };
+  },
+
+  mounted() {
+    this.initFormData();
+    EventEmitter.on("element-update", () => {
+      this.initFormData();
+    });
+  },
+  methods: {
+    initFormData() {
+      this.beforeNodeValue = getBeforeNdoe(getActive()) || "";
+    },
+    updateBeforeNodeValue(value) {
+      setBeforeNdoe(getActive(), value);
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+.exe_user_type_input {
+  display: flex;
+  padding-right: 25px;
+}
+</style>

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

@@ -1,69 +1,67 @@
 <template>
-  <div class="execute_wrapper">
-    <el-collapse-item name="element-execute-user">
-      <template #title>
-        <collapse-title title="执行用户">
-          <lucide-icon name="User" />
-        </collapse-title>
-      </template>
-      <div class="element-execute-user">
-        <edit-item label="用户类型" :label-width="100">
-          <!-- <el-input
+  <el-collapse-item name="element-execute-user">
+    <template #title>
+      <collapse-title title="执行用户">
+        <lucide-icon name="User" />
+      </collapse-title>
+    </template>
+    <div class="element-execute-user">
+      <edit-item label="用户类型" :label-width="100">
+        <!-- <el-input
           v-model="formKey"
           maxlength="32"
           @change="setExternalTaskPriority"
         /> -->
+        <el-select
+          v-model="exeUserType"
+          placeholder="请选择执行人类型"
+          clearable
+          filterable
+          @change="updateExeUserType"
+        >
+          <el-option
+            v-for="item in userTypeList"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select>
+      </edit-item>
+      <edit-item
+        v-show="exeUserTypeLabel"
+        :label="exeUserTypeLabel"
+        :label-width="100"
+      >
+        <div class="exe_user_type_input">
           <el-select
-            v-model="exeUserType"
+            v-scroll="scrollHandler"
+            v-model="exeUserValue"
             placeholder="请选择执行人类型"
+            :multiple="exeUserType == 2"
             clearable
             filterable
-            @change="updateExeUserType"
+            @change="updateExeUserValue"
           >
             <el-option
-              v-for="item in userTypeList"
+              v-for="item in exeUserValueList"
               :key="item.value"
               :label="item.label"
               :value="item.value"
             >
             </el-option>
           </el-select>
-        </edit-item>
-        <edit-item
-          v-show="exeUserTypeLabel"
-          :label="exeUserTypeLabel"
-          :label-width="100"
-        >
-          <div class="exe_user_type_input">
-            <el-select
-              v-scroll="scrollHandler"
-              v-model="exeUserValue"
-              placeholder="请选择执行人类型"
-              :multiple="exeUserType == 2"
-              clearable
-              filterable
-              @change="updateExeUserValue"
-            >
-              <el-option
-                v-for="item in exeUserValueList"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
-              >
-              </el-option>
-            </el-select>
-            <!-- <el-button
+          <!-- <el-button
               type="info"
               size="mini"
               icon="el-icon-user"
               @click="() => {}"
             >
             </el-button> -->
-          </div>
-        </edit-item>
-      </div>
-    </el-collapse-item>
-  </div>
+        </div>
+      </edit-item>
+    </div>
+  </el-collapse-item>
 </template>
 
 <script>

+ 11 - 1
ruoyi-ui/src/views/system/bpmnPro/components/Panel/index.vue

@@ -26,7 +26,11 @@ import { isExecutable } from "@packages/bo-utils/executionListenersUtil";
 import { isAsynchronous } from "@packages/bo-utils/asynchronousContinuationsUtil";
 import { isStartInitializable } from "@packages/bo-utils/initiatorUtil";
 import { getModeler } from "@packages/bpmn-utils/BpmnDesignerUtils";
-import { isTaskOrUserTask, isUserTask } from "@packages/bo-utils/myFieldUtil";
+import {
+  isTaskOrUserTask,
+  isUserTask,
+  isProcess,
+} from "@packages/bo-utils/myFieldUtil";
 import ElementGenerations from "@packages/Panel/components/ElementGenerations";
 import ElementDocumentations from "@packages/Panel/components/ElementDocumentations";
 import ElementConditional from "@packages/Panel/components/ElementConditional";
@@ -38,6 +42,8 @@ import ElementStartInitiator from "@packages/Panel/components/ElementStartInitia
 import ElementExtensionField from "@packages/Panel/components/ElementExtensionField";
 import ElementExecuteForm from "@packages/Panel/components/ElementExecuteForm";
 import ElementExecuteUser from "@packages/Panel/components/ElementExecuteUser";
+import ElementBeforeNode from "@packages/Panel/components/ElementBeforeNode";
+import ElementAfterNode from "@packages/Panel/components/ElementAfterNode";
 
 export default {
   name: "BpmnPanel",
@@ -54,6 +60,8 @@ export default {
     ElementExtensionField,
     ElementExecuteForm,
     ElementExecuteUser,
+    ElementBeforeNode,
+    ElementAfterNode,
   },
   data() {
     return {
@@ -151,6 +159,8 @@ export default {
       isTaskOrUserTask(element) &&
         this.renderComponents.push(ElementExecuteForm);
       isUserTask(element) && this.renderComponents.push(ElementExecuteUser);
+      !isProcess(element) && this.renderComponents.push(ElementBeforeNode);
+      !isProcess(element) && this.renderComponents.push(ElementAfterNode);
     },
   },
 };

+ 25 - 16
ruoyi-ui/src/views/system/bpmnPro/components/Toolbar/tools/Save.vue

@@ -1,28 +1,21 @@
 <template>
-  <el-button @click="saveHandler" type="primary" size="small"
-    >保存
-    <!-- <div class="button-list_column">
-        <el-button type="primary" size="small" @click="getProcessAsBpmn"
-          >导出为 Bpmn</el-button
-        >
-        <el-button type="primary" size="small" @click="getProcessAsXml"
-          >导出为 XML</el-button
-        >
-        <el-button type="primary" size="small" @click="getProcessAsSvg"
-          >导出为 SVG</el-button
-        >
-      </div> -->
-  </el-button>
+  <el-button @click="saveHandler" type="primary" size="small">保存 </el-button>
 </template>
 
 <script>
 import { downloadFile, setEncoded } from "@utils/files";
 import { mapGetters } from "vuex";
-import { addProcess, updateProcess } from "@/api/bpmprocess/process";
+import {
+  addProcess,
+  updateProcess,
+  addConfiguration,
+  updateConfiguration,
+} from "@/api/bpmprocess/process";
 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";
 export default {
   name: "BpmnSave",
   computed: {
@@ -98,7 +91,9 @@ export default {
       let _this = this;
       let formData = _this.formData() || {}; // 当前流程表单详细数据
       let processJsonObj = await this.getProcessJson(); // xml标签转换json
-      console.log(processJsonObj);
+      // console.log(processJsonObj);
+      // this.saveNodeMsg(processJsonObj);
+      // return;
       let validateRes = formDataValidate(processJsonObj);
       if (!validateRes.flag) {
         this.$message.error(validateRes.msg);
@@ -135,6 +130,7 @@ export default {
         updateProcess(subformData).then((res) => {
           if (res.code == 200) {
             _this.$message.success("修改成功");
+            this.saveNodeMsg(processJsonObj);
           } else {
             _this.$message.error("修改失败");
           }
@@ -143,12 +139,25 @@ export default {
         addProcess(subformData).then((res) => {
           if (res.code == 200) {
             _this.$message.success("保存成功");
+            this.saveNodeMsg(processJsonObj);
           } else {
             _this.$message.error("保存失败");
           }
         });
       }
     },
+    async saveNodeMsg(obj) {
+      let data = getNodeMsg(obj.warnings);
+      data.forEach((item) => {
+        item.createBy = this.$store.state.user.name;
+        item.nodeProcessKey = obj.rootElement.rootElements[0].id;
+      });
+      try {
+        let res = await addConfiguration(data);
+      } catch (error) {
+        console.log(error);
+      }
+    },
   },
 };
 </script>

+ 31 - 0
ruoyi-ui/src/views/system/bpmnPro/components/bo-utils/getNodeMsg.js

@@ -0,0 +1,31 @@
+
+function getSecondStr(str) {
+  return str.split(':')[1];
+}
+
+
+export function getNodeMsg(nodeList = []) {
+  if (!nodeList.length) return [];
+  let nodeObj = {};
+  nodeList.forEach(item => {
+    let nodeType = getSecondStr(item.element.$type);
+    let valueType = getSecondStr(item.property);
+    if (nodeObj[nodeType]) {
+      nodeObj[nodeType][valueType] = item.value;
+      nodeObj[nodeType].nodeKey = item.element.id;
+    } else {
+      nodeObj[nodeType] = {};
+      nodeObj[nodeType][valueType] = item.value;
+      nodeObj[nodeType].nodeKey = item.element.id;
+    }
+  })
+  let res = Object.keys(nodeObj).map((item) => {
+    let temp = {};
+    temp.nodeType = item;
+    Object.assign(temp, nodeObj[item])
+    return temp;
+
+  })
+
+  return res;
+}

+ 44 - 2
ruoyi-ui/src/views/system/bpmnPro/components/bo-utils/myFieldUtil.js

@@ -73,7 +73,7 @@ export function setFormKey(element, value) {
   const modeling = getModeler.getModeling();
   const businessObject = getBusinessObject(element);
   modeling.updateModdleProperties(element, businessObject, {
-    [`${prefix}:formKey`]: value
+    [`${prefix}:nodeFormKey`]: value
   });
 }
 
@@ -82,7 +82,7 @@ export function getFormKey(element) {
   const prefix = getProcessEngine();
   const businessObject = getBusinessObject(element);
 
-  return businessObject.get(`${prefix}:formKey`);
+  return businessObject.get(`${prefix}:nodeFormKey`);
 }
 
 // 执行用户
@@ -138,3 +138,45 @@ export function getExecuteUserDesc(element) {
   return businessObject.get(`${prefix}:executeUserDesc`);
 }
 
+//节点前
+
+export function isProcess(element) {
+  return is(element, 'bpmn:Process')
+}
+
+
+
+export function setBeforeNdoe(element, value) {
+  const prefix = getProcessEngine();
+  const modeling = getModeler.getModeling();
+  const businessObject = getBusinessObject(element);
+  modeling.updateModdleProperties(element, businessObject, {
+    [`${prefix}:nodeBefore`]: value
+  });
+}
+
+
+export function getBeforeNdoe(element) {
+  const prefix = getProcessEngine();
+  const businessObject = getBusinessObject(element);
+  return businessObject.get(`${prefix}:nodeBefore`);
+}
+
+// 节点后
+export function setAfterNdoe(element, value) {
+  const prefix = getProcessEngine();
+  const modeling = getModeler.getModeling();
+  const businessObject = getBusinessObject(element);
+  modeling.updateModdleProperties(element, businessObject, {
+    [`${prefix}:nodeAfter`]: value
+  });
+}
+
+
+export function getAfterNdoe(element) {
+  const prefix = getProcessEngine();
+  const businessObject = getBusinessObject(element);
+  return businessObject.get(`${prefix}:nodeAfter`);
+}
+
+

+ 2 - 2
ruoyi-ui/src/views/system/bpmnPro/components/theme/element-variables.scss

@@ -3,7 +3,7 @@ $--color-primary: #1890ff;
 $--color-danger: #ff4d4f;
 
 /* 改变 icon 字体路径变量,必需 */
-$--font-path: '~element-ui/lib/theme-chalk/fonts';
+$--font-path: "~element-ui/lib/theme-chalk/fonts";
 
 $--fade-linear-transition: opacity 100ms linear !default;
 
@@ -65,7 +65,7 @@ span:focus {
   width: 100%;
 }
 .el-divider:not(.el-divider--horizontal) {
-  margin: 0 8px ;
+  margin: 0 8px;
 }
 .el-divider.el-divider--horizontal {
   margin: 16px 0;

+ 5 - 3
ruoyi-ui/src/views/system/user/index.vue

@@ -230,6 +230,7 @@
           >
             <template slot-scope="scope">
               <el-switch
+                v-if="isShowHandlerBtn(scope.row)"
                 v-model="scope.row.status"
                 active-value="0"
                 inactive-value="1"
@@ -564,6 +565,7 @@ import {
 import { getToken } from "@/utils/auth";
 import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import { mapGetters } from "vuex";
 
 export default {
   name: "User",
@@ -631,6 +633,7 @@ export default {
         phonenumber: undefined,
         status: undefined,
         deptId: undefined,
+        userType: "01",
       },
       // 列信息
       columns: [
@@ -700,10 +703,9 @@ export default {
     });
   },
   computed: {
+    ...mapGetters(["name"]),
     isHasAdmin() {
-      return this.userList.some((item) => {
-        return item.admin;
-      });
+      return this.name == "admin";
     },
   },
   methods: {

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů