Kaynağa Gözat

修改冲突

Zn 1 yıl önce
ebeveyn
işleme
ac71f0e905

+ 4 - 2
ruoyi-ui/src/api/bpmprocess/process.js

@@ -60,9 +60,11 @@ export function bpmBackups(data) {
 
 // 导出流程文件
 export function exportFileProcess(processIds) {
+  console.log()
   return request({
-    url: '/system/process/exportProcessFile' + processIds,
+    url: '/system/process/exportProcessFile/' + processIds,
     method: 'get',
-    baseURL: process.env.VUE_APP_BASE_API4
+    responseType: 'blob',
+    baseURL: process.env.VUE_APP_BASE_API4,
   })
 }

+ 77 - 48
ruoyi-ui/src/views/bpmprocess/index.vue

@@ -64,11 +64,11 @@
           icon="el-icon-search"
           size="mini"
           @click="handleQuery"
-          >搜索</el-button
-        >
+          >搜索
+        </el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
-          >重置</el-button
-        >
+          >重置
+        </el-button>
       </el-form-item>
     </el-form>
 
@@ -81,8 +81,8 @@
           size="mini"
           @click="handleAdd"
           v-hasPermi="['system:process:add']"
-          >新增</el-button
-        >
+          >新增
+        </el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
@@ -93,8 +93,8 @@
           :disabled="single"
           @click="handleUpdate"
           v-hasPermi="['system:process:edit']"
-          >修改</el-button
-        >
+          >修改
+        </el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
@@ -105,8 +105,8 @@
           :disabled="multiple"
           @click="handleDelete"
           v-hasPermi="['system:process:remove']"
-          >删除</el-button
-        >
+          >删除
+        </el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
@@ -116,8 +116,8 @@
           size="mini"
           @click="handleExport"
           v-hasPermi="['system:process:export']"
-          >导出</el-button
-        >
+          >导出
+        </el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
@@ -127,8 +127,8 @@
           size="mini"
           @click="handleFileExport"
           v-hasPermi="['system:process:export']"
-          >导出流程文件</el-button
-        >
+          >导出流程文件
+        </el-button>
       </el-col>
       <right-toolbar
         :showSearch.sync="showSearch"
@@ -145,12 +145,20 @@
       <el-table-column label="主键" align="center" prop="processId" />
       <el-table-column label="流程名称" align="center" prop="processName" />
       <el-table-column label="流程别名" align="center" prop="processKey" />
-      <el-table-column
-        label="流程状态"
-        align="center"
-        prop="processOpneState"
-      />
-      <el-table-column label="流程类型" align="center" prop="processType" />
+      <el-table-column label="流程状态" align="center" prop="processOpneState">
+        <template slot-scope="scope">
+          <span>{{
+            getDictLabel(scope.row.processOpneState, dict.type.bpm_state)
+          }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="流程类型" align="center" prop="processType">
+        <template slot-scope="scope">
+          <span>{{
+            getDictLabel(scope.row.processType, dict.type.bpm_type)
+          }}</span>
+        </template>
+      </el-table-column>
       <el-table-column
         label="流程部署时间"
         align="center"
@@ -167,9 +175,25 @@
         label="启动事件类型"
         align="center"
         prop="startEventType"
-      />
+      >
+        <template slot-scope="scope">
+          <span>{{
+            getDictLabel(
+              scope.row.startEventType,
+              dict.type.bpm_start_event_type
+            )
+          }}</span>
+        </template>
+      </el-table-column>
+
       <el-table-column label="版本注释" align="center" prop="note" />
-      <el-table-column label="版本状态" align="center" prop="processVersion" />
+      <el-table-column label="版本状态" align="center" prop="processVersion">
+        <template slot-scope="scope">
+          <span>{{
+            getDictLabel(scope.row.processVersion, dict.type.bpm_version)
+          }}</span>
+        </template>
+      </el-table-column>
       <!-- <el-table-column label="节点json串" align="center" prop="processJson" /> -->
       <!-- <el-table-column
         label="xml文件存放地址"
@@ -188,45 +212,45 @@
               处理<i class="el-icon-arrow-down el-icon--right"></i>
             </el-button>
             <el-dropdown-menu slot="dropdown">
-              <el-dropdown-item
-                ><el-button
+              <el-dropdown-item>
+                <el-button
                   size="mini"
                   type="text"
                   icon="el-icon-edit"
                   @click="handleUpdate(scope.row)"
                   v-hasPermi="['system:user:edit']"
-                  >修改</el-button
-                ></el-dropdown-item
-              >
-              <el-dropdown-item
-                ><el-button
+                  >修改
+                </el-button>
+              </el-dropdown-item>
+              <el-dropdown-item>
+                <el-button
                   size="mini"
                   type="text"
                   icon="el-icon-edit"
                   @click="backupProcess(scope.row)"
                   v-hasPermi="['system:user:edit']"
-                  >备份流程图</el-button
-                ></el-dropdown-item
-              >
-              <el-dropdown-item
-                ><el-button
+                  >备份流程图
+                </el-button>
+              </el-dropdown-item>
+              <el-dropdown-item>
+                <el-button
                   size="mini"
                   type="text"
                   icon="el-icon-edit"
                   @click="handleEditbpmn(scope.row)"
                   v-hasPermi="['system:user:edit']"
-                  >编辑流程图</el-button
-                ></el-dropdown-item
-              >
-              <el-dropdown-item
-                ><el-button
+                  >编辑流程图
+                </el-button>
+              </el-dropdown-item>
+              <el-dropdown-item>
+                <el-button
                   size="mini"
                   type="text"
                   icon="el-icon-delete"
                   @click="handleDelete(scope.row)"
                   v-hasPermi="['system:user:remove']"
-                  >删除</el-button
-                >
+                  >删除
+                </el-button>
               </el-dropdown-item>
             </el-dropdown-menu>
           </el-dropdown>
@@ -309,11 +333,12 @@ import {
   addProcess,
   updateProcess,
   bpmBackups,
-  exportFileProcess
+  exportFileProcess,
 } from "@/api/bpmprocess/process";
 
 export default {
   name: "Process",
+  dicts: ["bpm_state", "bpm_type", "bpm_start_event_type", "bpm_version"],
   data() {
     return {
       // 遮罩层
@@ -535,18 +560,22 @@ export default {
     /** 导出按钮操作 */
     handleExport() {
       this.download(
-        "system/process/export",
+        process.env.VUE_APP_BASE_API4 + "system/process/export",
         {
           ...this.queryParams,
         },
         `process_${new Date().getTime()}.xlsx`
       );
     },
-    handleFileExport(){
-      exportFileProcess(this.ids).then(()=>{
-
-      })
-    }
+    handleFileExport() {
+      exportFileProcess(this.ids).then(() => {});
+    },
+    // 获取字典对应label
+    getDictLabel(value, dictLsit = []) {
+      return dictLsit.find((item) => {
+        return item.value == value;
+      })?.label;
+    },
   },
 };
 </script>

+ 0 - 1
ruoyi-ui/src/views/system/bpmnPro/components/Toolbar/index.vue

@@ -23,7 +23,6 @@ import BpmnSave from "./tools/Save.vue";
 import BpmnAligns from "./tools/Aligns";
 import BpmnScales from "./tools/Scales";
 import BpmnCommands from "./tools/Commands";
-
 import BpmnExternals from "./tools/Externals";
 export default {
   name: "BpmnToolbar",

+ 48 - 91
ruoyi-ui/src/views/system/bpmnPro/components/Toolbar/tools/Save.vue

@@ -1,6 +1,6 @@
 <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
@@ -16,9 +16,9 @@
 </template>
 
 <script>
-import { downloadFile, setEncoded } from "@utils/files";
-import { mapGetters } from "vuex";
-import { addProcess, updateProcess } from "@/api/bpmprocess/process";
+import {downloadFile, setEncoded} from "@utils/files";
+import {mapGetters} from "vuex";
+import {addProcess, updateProcess} from "@/api/bpmprocess/process";
 import xml from "highlight.js/lib/languages/xml";
 
 export default {
@@ -26,6 +26,11 @@ export default {
   computed: {
     ...mapGetters(["getModeler"]),
   },
+  inject: {
+    formData: {
+      from: 'formData'
+    }
+  },
   methods: {
     async getProcess(type, name = "diagram") {
       try {
@@ -34,7 +39,7 @@ export default {
         const modeler = this.getModeler;
         // 按需要类型创建文件并下载
         if (type === "xml" || type === "bpmn") {
-          const { err, xml } = await modeler.saveXML();
+          const {err, xml} = await modeler.saveXML();
           // 读取异常时抛出异常
           if (err) {
             console.error(`[Process Designer Warn ]: ${err.message || err}`);
@@ -44,7 +49,7 @@ export default {
           // downloadFile(href, filename);
           return xml;
         } else {
-          const { err, svg } = await modeler.saveSVG();
+          const {err, svg} = await modeler.saveSVG();
           // 读取异常时抛出异常
           if (err) {
             console.error(err);
@@ -73,7 +78,7 @@ export default {
       try {
         if (!this.getModeler)
           return this.$message.error("流程图引擎初始化失败");
-        const { xml } = await this.getModeler.saveXML({
+        const {xml} = await this.getModeler.saveXML({
           format: true,
           preamble: true,
         });
@@ -83,94 +88,46 @@ export default {
         catchError(e);
       }
     },
-    // xmlStr2XmlObj(xmlStr) {
-    //   var xmlObj = {};
-    //   if (document.all) {
-    //     var xmlDom = new ActiveXObject("Microsoft.XMLDOM");
-    //     xmlDom.loadXML(xmlStr);
-    //     xmlObj = xmlDom;
-    //   } else {
-    //     xmlObj = new DOMParser().parseFromString(xmlStr, "text/xml");
-    //   }
-    //   return xmlObj;
-    // },
-    getFileBinaryHandler() {},
     async saveHandler() {
       let _this = this;
-      let processJsonObj = await this.getProcessJson();
-      let { rootElements } = processJsonObj.rootElement;
-      let processKey = rootElements[0].id;
-      let processName = rootElements[0].name;
-      let processType = ""; //流程类型
-      let processXml = ""; //xml文件流
+      let formData = _this.formData() || {};  // 当前流程表单详细数据
+      let processJsonObj = await this.getProcessJson(); // xml标签转换json
+      formData.processJson = JSON.stringify(processJsonObj);
+      let {rootElements} = processJsonObj.rootElement;
+      formData.processKey = rootElements[0].id;// 流程编号
+      formData.processName = rootElements[0].name;// 流程名称
+      formData.processType = "0"; //流程类型
+      // 获取xml标签内容标签内容
       let xmlPro = await this.getProcess("xml");
-      let processXmlContent = xmlPro; //xml标签内容
-      // const buffer = Buffer.from(xmlPro, "utf-8");
-      // 将 Buffer 对象转换为二进制流
-      const blob = new Blob([xmlPro]);
-      blob.filename = processName + ".xml";
-
-      let reader = new FileReader();
-      reader.onloadend = function (da) {
-        processXml = new Uint8Array(da.target.result);
-        // console.log(
-        //   new File([processXml], processName + ".xml", {
-        //     type: "application/octet-stream",
-        //     lastModified: Date.now(),
-        //   })
-        // );
-        // return;
-        let data = {
-          bpmProcess: {
-            processKey,
-            processName,
-            processType,
-            processJson: JSON.stringify(processJsonObj),
-            // fileXML: undefined,
-          },
+      // 将asill码数组转换成文件格式
+      formData.fileXML = new File([xmlPro], formData.processKey + ".bpmn", {
+        type: "text/bpmn",
+      });
+      formData.processJson = JSON.stringify(processJsonObj);
+      // 最终提交data
+      const subformData = new FormData();
+      // 循环赋值
+      for (let key in formData) {
+        subformData.append(key, formData[key]);
+      }
+      if (formData?.processId) {
+        updateProcess(subformData).then((res) => {
+          if (res.code == 200) {
+            _this.$message.success("修改成功");
+          } else {
+            _this.$message.error("修改失败");
+          }
+        });
+      } else {
+        addProcess(subformData).then((res) => {
+          if (res.code == 200) {
+            _this.$message.success("保存成功");
+          } else {
+            _this.$message.error("保存失败");
+          }
+        });
+      }
 
-          // processXmlContent,
-        };
-        if (_this.$route.query?.id) {
-          data.bpmProcess.processId = _this.$route.query.id;
-          var file = new File([processXmlContent], processKey + ".bpmn", {
-            type: "text/xml",
-          });
-          const formData = new FormData();
-          formData.append("fileXML", file);
-          formData.append("processKey", processKey);
-          formData.append("processName", processName);
-          formData.append("processType", processType);
-          formData.append("processId", _this.$route.query.id);
-          formData.append("processJson", JSON.stringify(processJsonObj));
-          updateProcess(data).then((res) => {
-            if (res.code == 200) {
-              _this.$message.success("修改成功");
-            } else {
-              _this.$message.error("修改失败");
-            }
-          });
-        } else {
-          // 后台回传文件
-          var file = new File([processXmlContent], processKey + ".bpmn", {
-            type: "text/xml",
-          });
-          const formData = new FormData();
-          formData.append("fileXML", file);
-          formData.append("processKey", processKey);
-          formData.append("processName", processName);
-          formData.append("processType", processType);
-          formData.append("processJson", JSON.stringify(processJsonObj));
-          addProcess(formData).then((res) => {
-            if (res.code == 200) {
-              _this.$message.success("保存成功");
-            } else {
-              _this.$message.error("保存失败");
-            }
-          });
-        }
-      };
-      reader.readAsArrayBuffer(blob);
     },
   },
 };

+ 16 - 8
ruoyi-ui/src/views/system/bpmnPro/index.vue

@@ -1,21 +1,21 @@
 <template>
   <div id="app-bpmn">
-    <bpmn-toolbar v-if="getEditorConfig.toolbar" />
+    <bpmn-toolbar v-if="getEditorConfig.toolbar" :formData="formData"/>
     <div class="main-content">
-      <bpmn-designer :xml.sync="xmlString" />
-      <bpmn-panel v-if="getEditorConfig.penalMode === 'custom'" />
+      <bpmn-designer :xml.sync="xmlString"/>
+      <bpmn-panel v-if="getEditorConfig.penalMode === 'custom'"/>
       <div v-else class="camunda-panel" id="camunda-panel"></div>
     </div>
 
-    <bpmn-settings />
-    <bpmn-context-menu />
+    <bpmn-settings/>
+    <bpmn-context-menu/>
   </div>
 </template>
 
 <script>
 import BpmnDesigner from "./components/Designer";
 import BpmnSettings from "./components/Settings";
-import { mapGetters } from "vuex";
+import {mapGetters} from "vuex";
 import BpmnToolbar from "./components/Toolbar";
 import BpmnContextMenu from "./components/ContextMenu/ContextMenu";
 import BpmnPanel from "./components/Panel";
@@ -37,7 +37,8 @@ import "bpmn-js-bpmnlint/dist/assets/css/bpmn-js-bpmnlint.css";
 import "bpmn-js-token-simulation/assets/css/bpmn-js-token-simulation.css";
 
 import xmlStr from "./components/xmlStr";
-import { getProcess } from "@/api/bpmprocess/process";
+import {getProcess} from "@/api/bpmprocess/process";
+
 export default {
   name: "App",
   components: {
@@ -49,12 +50,18 @@ export default {
   },
   data() {
     return {
+      formData: undefined,
       xmlString: undefined,
     };
   },
   computed: {
     ...mapGetters(["getEditorConfig", "getModeler"]),
   },
+  provide(){
+    return {
+      formData:()=>this.formData,
+    }
+  },
   methods: {
     Provence(ev) {
       ev.preventDefault();
@@ -68,7 +75,8 @@ export default {
     if (this.$route.query?.id) {
       let res = await getProcess(this.$route.query?.id);
       if (res.code == 200) {
-        this.xmlString = res.data.processXmlContent;
+        this.formData = res.data;
+        this.xmlString = this.formData.processXmlContent;
         if (this.getModeler) {
           this.getModeler.importXML(this.xmlString);
         }