Bladeren bron

feat:流程新增操作,下载流程文件接口配置

韩帛霖 1 jaar geleden
bovenliggende
commit
c3819d19ef

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

@@ -59,9 +59,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,
   })
 }

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

@@ -64,10 +64,12 @@
           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,7 +83,8 @@
           size="mini"
           @click="handleAdd"
           v-hasPermi="['system:process:add']"
-          >新增</el-button
+        >新增
+        </el-button
         >
       </el-col>
       <el-col :span="1.5">
@@ -93,7 +96,8 @@
           :disabled="single"
           @click="handleUpdate"
           v-hasPermi="['system:process:edit']"
-          >修改</el-button
+        >修改
+        </el-button
         >
       </el-col>
       <el-col :span="1.5">
@@ -105,7 +109,8 @@
           :disabled="multiple"
           @click="handleDelete"
           v-hasPermi="['system:process:remove']"
-          >删除</el-button
+        >删除
+        </el-button
         >
       </el-col>
       <el-col :span="1.5">
@@ -116,7 +121,8 @@
           size="mini"
           @click="handleExport"
           v-hasPermi="['system:process:export']"
-          >导出</el-button
+        >导出
+        </el-button
         >
       </el-col>
       <el-col :span="1.5">
@@ -127,7 +133,8 @@
           size="mini"
           @click="handleFileExport"
           v-hasPermi="['system:process:export']"
-          >导出</el-button
+        >导出流程文件
+        </el-button
         >
       </el-col>
       <right-toolbar
@@ -141,16 +148,16 @@
       :data="processList"
       @selection-change="handleSelectionChange"
     >
-      <el-table-column type="selection" width="55" align="center" />
-      <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 type="selection" width="55" align="center"/>
+      <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="processType"/>
       <el-table-column
         label="流程部署时间"
         align="center"
@@ -159,8 +166,8 @@
       >
         <template slot-scope="scope">
           <span>{{
-            parseTime(scope.row.processDeployTime, "{y}-{m}-{d}")
-          }}</span>
+              parseTime(scope.row.processDeployTime, "{y}-{m}-{d}")
+            }}</span>
         </template>
       </el-table-column>
       <el-table-column
@@ -168,15 +175,15 @@
         align="center"
         prop="startEventType"
       />
-      <el-table-column label="版本注释" align="center" prop="note" />
-      <el-table-column label="版本状态" align="center" prop="processVersion" />
+      <el-table-column label="版本注释" align="center" prop="note"/>
+      <el-table-column label="版本状态" align="center" prop="processVersion"/>
       <!-- <el-table-column label="节点json串" align="center" prop="processJson" /> -->
       <!-- <el-table-column
         label="xml文件存放地址"
         align="center"
         prop="processXmlPath"
       /> -->
-      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="备注" align="center" prop="remark"/>
       <el-table-column
         label="操作"
         align="center"
@@ -189,43 +196,54 @@
             </el-button>
             <el-dropdown-menu slot="dropdown">
               <el-dropdown-item
-                ><el-button
+              >
+                <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-button
+                >
+              </el-dropdown-item
               >
               <el-dropdown-item
-                ><el-button
+              >
+                <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-button
+                >
+              </el-dropdown-item
               >
               <el-dropdown-item
-                ><el-button
+              >
+                <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-button
+                >
+              </el-dropdown-item
               >
               <el-dropdown-item
-                ><el-button
+              >
+                <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>
@@ -246,10 +264,10 @@
     <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="processName">
-          <el-input v-model="form.processName" placeholder="请输入流程名称" />
+          <el-input v-model="form.processName" placeholder="请输入流程名称"/>
         </el-form-item>
         <el-form-item label="流程别名" prop="processKey">
-          <el-input v-model="form.processKey" placeholder="请输入流程别名" />
+          <el-input v-model="form.processKey" placeholder="请输入流程别名"/>
         </el-form-item>
         <el-form-item label="流程开启状态" prop="processOpneState">
           <el-input
@@ -287,10 +305,10 @@
           />
         </el-form-item>
         <el-form-item label="删除标志" prop="delFlag">
-          <el-input v-model="form.delFlag" placeholder="请输入删除标志" />
+          <el-input v-model="form.delFlag" placeholder="请输入删除标志"/>
         </el-form-item>
         <el-form-item label="备注" prop="remark">
-          <el-input v-model="form.remark" placeholder="请输入备注" />
+          <el-input v-model="form.remark" placeholder="请输入备注"/>
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
@@ -490,7 +508,8 @@ export default {
           }
         },
       })
-        .then(({ value }) => {})
+        .then(({value}) => {
+        })
         .catch(() => {
           this.$message({
             type: "info",
@@ -530,7 +549,8 @@ export default {
           this.getList();
           this.$modal.msgSuccess("删除成功");
         })
-        .catch(() => {});
+        .catch(() => {
+        });
     },
     /** 导出按钮操作 */
     handleExport() {
@@ -542,10 +562,32 @@ export default {
         `process_${new Date().getTime()}.xlsx`
       );
     },
-    handleFileExport(){
-      exportFileProcess(this.ids).then(()=>{
-
-      })
+    handleFileExport() {
+      if (this.ids.length != 0) {
+        exportFileProcess(this.ids).then(res => {
+          const content = res;
+          const blob = new Blob([content], {type: "application/zip"})
+          const fileName = "流程文件"
+          if ("download" in document.createElement("a")) {
+            // 非IE下载
+            const elink = document.createElement("a");
+            elink.download = fileName;
+            elink.style.display = "none";
+            elink.href = URL.createObjectURL(blob);
+            document.body.appendChild(elink);
+            elink.click();
+            URL.revokeObjectURL(elink.href); // 释放URL 对象
+            document.body.removeChild(elink);
+            this.loading = false
+          } else {
+            // IE10+下载
+            navigator.msSaveBlob(blob, fileName);
+            this.loading = false
+          }
+        });
+      }else{
+        this.$message.warning("请勾选流程数据条!")
+      }
     }
   },
 };

+ 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);
         }