From dedbadd96ab7e1533572b25511fd201678c64dad Mon Sep 17 00:00:00 2001
From: ludc
Date: 星期四, 17 十月 2024 09:56:18 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 Source/UBCS-WEB/src/views/modeling/cycle.vue |  518 ++++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 345 insertions(+), 173 deletions(-)

diff --git a/Source/UBCS-WEB/src/views/modeling/cycle.vue b/Source/UBCS-WEB/src/views/modeling/cycle.vue
index 0e86d37..5194d87 100644
--- a/Source/UBCS-WEB/src/views/modeling/cycle.vue
+++ b/Source/UBCS-WEB/src/views/modeling/cycle.vue
@@ -1,201 +1,373 @@
 <template>
-  <el-container>
-  <el-aside width="240px">
-    <basic-container style="margin-top: 10px">
-      <avue-tree id="basic" :data="treeData" :option="treeOption" @node-click="nodeClick"  >
-      </avue-tree>
-    </basic-container>
-  </el-aside>
-  <basic-container >
-    <el-button type="primary" @click="dialogTableVisible=true" size="small">鍒涘缓妯℃澘</el-button>
-    <el-button type="primary"  size="small">缂栬緫妯℃澘</el-button>
-    <el-button type="primary" size="small" @click="$refs.flow.addNode('娴嬭瘯鑺傜偣')">娣诲姞鑺傜偣</el-button>
-    <br/><br/>
-    <avue-flow ref="flow" v-model="form" :height="703" :option="option" :width="1500">
-      <template slot="header" slot-scope="scope">
-        <i class="el-icon-delete" @click="$refs.flow.deleteNode(scope.node.id)" style="margin-top: 8px"></i>
+  <basic-container class="">
+    <avue-crud
+      :data="data"
+      :option="option"
+      :page="page"
+      :table-loading="loading"
+      :permission="permissionList"
+      selection
+      @size-change="search('size', ...arguments)"
+      @current-change="search('current', ...arguments)"
+      @refresh-change="search"
+      @search-change="search('search', ...arguments)"
+      @search-reset="search('reset', ...arguments)"
+      @selection-change="selectionChange"
+    >
+      <template slot-scope="scope" slot="menuLeft">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="small"
+          v-if="permissionList.addBtn"
+          @click="openDialog('add', {})"
+          >鏂板</el-button
+        >
+        <el-button
+          type="danger"
+          icon="el-icon-delete"
+          size="small"
+          @click="batchDel()"
+          v-if="selectedData.length > 0"
+          :loading="delLoading"
+          >鍒犻櫎</el-button
+        >
       </template>
-      <div slot-scope="{node}">
-        <span>鑷畾涔墈{ (node || {}).name }}</span>
-      </div>
-    </avue-flow>
-    <!--    鍒涘缓瀵硅瘽妗�-->
-    <el-dialog title="鍒涘缓妯℃澘" :visible.sync="dialogTableVisible" append-to-body>
-      <avue-form :data="addData" :option="addoption" v-model="forms">
-
-        <template slot="filetype">
-          <el-select v-model="forms.select" slot="prepend" placeholder="璇烽�夋嫨" style="max-width: 300px">
-            <el-option label="娴嬭瘯1" value="1"></el-option>
-            <el-option label="娴嬭瘯2" value="2"></el-option>
-            <el-option label="娴嬭瘯3" value="3"></el-option>
-          </el-select>
-          <el-button  type="primary" @click="handelLife" style="display: inline-block;margin-left: 5px">
-            娣诲姞璧峰鐘舵��
-          </el-button>
-        </template>
-      </avue-form>
+      <template slot-scope="{ row, index }" slot="menu">
+        <el-button
+          type="text"
+          icon="el-icon-edit"
+          size="mini"
+          v-if="permissionList.editBtn"
+          :loading="row.editLoading"
+          @click="openDialog('edit', row)"
+          >缂栬緫</el-button
+        >
+        <el-button
+          type="text"
+          icon="el-icon-view"
+          size="mini"
+          v-if="permissionList.openBtn"
+          :loading="row.detailLoading"
+          @click="openDialog('detail', row)"
+          >棰勮</el-button
+        >
+        <el-button
+          class="btn_link_del"
+          type="text"
+          icon="el-icon-delete"
+          size="mini"
+          v-if="permissionList.delBtn"
+          :loading="row.delLoading"
+          @click="rowDel(row)"
+          >鍒犻櫎</el-button
+        >
+      </template></avue-crud
+    >
+    <el-dialog
+      :visible="visible"
+      :width="dialogWidth"
+      :title="title"
+      append-to-body
+      :before-close="
+        () => {
+          visible = false;
+        }
+      "
+      top="10vh"
+    >
+      <CycleFlow
+        v-if="visible"
+        class="cycle_flow"
+        :type="type"
+        :chart-data="nodesEdgesData"
+        :chart-data-node-items="flowChartNodeItems"
+        :rowData="rowData"
+        ref="vueFlowchartEditor"
+        @save-data="save"
+      />
+      <template #footer v-if="type !== 'detail'">
+        <el-button
+          type="primary"
+          size="mini"
+          @click="submit"
+          :loading="submitLoading"
+          >淇濆瓨</el-button
+        >
+        <el-button type="" size="mini" @click="visible = false">鍙栨秷</el-button>
+      </template>
     </el-dialog>
   </basic-container>
-
-
-  </el-container>
-
 </template>
 
 <script>
+import API from "@/api/modeling/cycle";
+import CycleFlow from "@/components/flow-cycle/flowchartEditor.vue";
+import {mapGetters} from "vuex";
 export default {
   name: "cycle.vue",
+  components: { CycleFlow },
   data() {
     return {
-      //妯℃澘瀵硅瘽妗�
-      dialogTableVisible:false,
-      forms:{
-        select:""
+      form: {},
+      page: {
+        pageSize: 10,
+        total: 0,
+        currentPage: 1,
+        layout: "total, sizes, prev, pager, next, jumper",
       },
-      addData:[],
-      addoption:{
-        formslot:true,
-        column:[
+      option: {
+        height:'auto',
+        calcHeight:20,
+        columnBtn:false,
+        tip:false,
+        selection: true,
+        searchMenuSpan: 6,
+        searchMenuPosition: "right",
+        border: true,
+        align: "center",
+        menuAlign: "center",
+        menu: true,
+        delBtn: false,
+        editBtn: false,
+        addBtn: false,
+        column: [
           {
-            label:"鍚嶇О",
-            prop:"name"
+            label: "缂栧彿",
+            prop: "id",
+            search: true,
           },
           {
-            label:"鏍囩",
-            prop:"tag"
+            label: "鍚嶇О",
+            prop: "name",
+            search: true,
           },
           {
-            label:"璧峰鐘舵��",
-            prop:"filetype",
-            formslot: true,
-            span:24
-            // type:"select",
-            // dicData:[
-            //   {
-            //     label:"娴嬭瘯1",
-            //     value:0
-            //   },
-            //   {
-            //     label:"娴嬭瘯2",
-            //     value:1
-            //   },
-            //   {
-            //     label:"娴嬭瘯3",
-            //     value:2
-            //   },
-            // ]
+            label: "璧峰鐘舵��",
+            prop: "startStatus",
+            search: true,
           },
           {
             label: "鎻忚堪",
-            prop:"desc",
-            type:"textarea",
-            span:13
-          }
-        ]
-      },
-      count: 0,
-      form: {},
-      treeData: [{
-        value: 0,
-        label: '鐢熷懡鍛ㄦ湡妯℃澘鍒楄〃',
-        children: [
-          {
-            value: 1,
-            label: 'A',
+            prop: "description",
           },
-          {
-            value: 2,
-            label: 'B',
-          },
-          {
-            value: 3,
-            label: 'C',
-          },
-          {
-            value: 4,
-            label: 'D',
-          },
-          {
-            value: 5,
-            label: 'E',
-          }
-        ]
-      }],
-      treeOption: {
-        defaultExpandAll: true,
-      },
-      option: {
-        "nodeList": [
-          {
-            "id": "nodeA",
-            "name": "娴佺▼A-鑺傜偣A",
-            "left": 39,
-            "top": 110,
-          },
-          {
-            "id": "nodeB",
-            "name": "娴佺▼A-鑺傜偣B",
-            "left": 340,
-            "top": 161,
-          },
-          {
-            "id": "nodeC",
-            "name": "娴佺▼A-鑺傜偣C",
-            "left": 739,
-            "top": 161,
-          },
-          {
-            "id": "nodeD",
-            "name": "鑺傜偣D",
-            "left": 739,
-            "top": 20,
-          }
         ],
-        "lineList": [
-          {
-            "from": "nodeA",
-            "to": "nodeB"
-          },
-          {
-            "from": "nodeB",
-            "to": "nodeC"
-          },
-          {
-            "from": "nodeC",
-            "to": "nodeD"
-          }
-        ]
       },
-      computed: {
-        nodeList() {
-          return this.option.nodeList
-        }
-      },
-      mounted() {
-        this.form = this.nodeList[this.count].id;
-      },
-      methods: {
-        handleClick(node) {
-          this.$message.success(JSON.stringify(node))
-          console.log(node)
-        },
-        addHandler(){
-          this.dialogTableVisible=true
-          console.log(1)
-
-        },
-        deleteNode(id){
-          console.log(id)
-        }
+      data: [],
+      title: "棰勮鐢熷懡鍛ㄦ湡娴佺▼鍥�",
+      visible: false,
+      flowChartNodeItems: [],
+      rowData: {},
+      nodesEdgesData: {},
+      dialogWidth: "50%",
+      type: "detail",
+      loading: false,
+      delLoading: false,
+      submitLoading: false,
+      selectedData: [],
+    };
+  },
+  computed:{
+    ...mapGetters(["permission"]),
+    permissionList(){
+      return{
+        addBtn: this.vaildData(this.permission.modeling_cycle.cycle_add,false),
+        delBtn: this.vaildData(this.permission.modeling_cycle.cycle_delete,false),
+        editBtn: this.vaildData(this.permission.modeling_cycle.cycle_edit,false),
+        openBtn: this.vaildData(this.permission.modeling_cycle.cycle_open,false),
       }
-    }
-  }
-}
+    },
+  },
+  created() {
+    this.search("search", {});
+  },
+  methods: {
+    search(type, params, done) {
+      if (type === "search") {
+        this.page.currentPage = 1;
+      } else if (type === "reset") {
+        this.page = {
+          pageSize: 10,
+          total: 0,
+          currentPage: 1,
+        };
+      } else if (type === "size") {
+        this.page.pageSize = params;
+      } else if (type === "current") {
+        this.page.currentPage = params;
+      }
+      this.loading = true;
+      API.getList(
+        Object.assign({}, params, {
+          size: this.page.pageSize,
+          current: this.page.currentPage,
+        })
+      ).then((res) => {
+        this.loading = false;
+        this.data = res.data.data.records;
+        this.page.total = res.data.data.total;
+        this.loading = false;
+        done && done();
+      });
+    },
+    openDialog(type, row) {
+      this.type = type;
+      if (type === "edit") {
+        this.$set(row, "editLoading", true);
+        this.title = "缂栬緫鐢熷懡鍛ㄦ湡娴佺▼鍥�";
+        this.dialogWidth = "95%";
+      } else if (type === "detail") {
+        this.$set(row, "detailLoading", true);
+        this.title = "棰勮鐢熷懡鍛ㄦ湡娴佺▼鍥�";
+        this.dialogWidth = "50%";
+      }
+      if (type !== "add") {
+        API.detail({ id: row.id }).then((res) => {
+          this.$set(row, "detailLoading", false);
+          this.$set(row, "editLoading", false);
+          this.rowData = row;
+          const nodes = res.data.data.nodes.map((item) => {
+            item.label = item.id;
+            item.index = item.indexNum;
+            item.x = Number(item.x);
+            item.y = Number(item.y);
+            return item;
+          });
+          const edges = res.data.data.edges.map((item) => {
+            item.label = item.name;
+            item.width = 80;
+            item.height = 48;
+            item.index = 1;
+            item.index = item.indexNum;
+            return item;
+          });
+          this.nodesEdgesData = { nodes, edges };
+          this.visible = true;
+          console.log('nodesEdgesData',this.nodesEdgesData)
+        });
+      } else {
+        this.nodesEdgesData = {};
+        this.rowData = {};
+        this.title = "鏂板鐢熷懡鍛ㄦ湡娴佺▼鍥�";
+        this.dialogWidth = "95%";
+        this.visible = true;
+      }
+    },
+    // 閫変腑鏁版嵁
+    selectionChange(selectedData) {
+      this.selectedData = selectedData;
+    },
+    // 鍒犻櫎
+    rowDel(row) {
+      this.$confirm("纭鍒犻櫎璇ユ潯鏁版嵁?", "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning",
+      }).then(() => {
+        this.$set(row, "delLoading", true);
+        API.del({ oid: row.oid, id: row.id })
+          .then((res) => {
+            this.$set(row, "delLoading", false);
+            if (res.data.code === 200) {
+              this.$message.success("鍒犻櫎鎴愬姛锛�");
+              this.search();
+            }
+          })
+          .catch(() => {
+            this.$set(row, "delLoading", false);
+          });
+      });
+    },
+    batchDel() {
+      this.$confirm("纭鍒犻櫎鎵�閫夋暟鎹�?", "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning",
+      }).then(() => {
+        const data = this.selectedData.map((item) => {
+          return {
+            id: item.id,
+            oid: item.oid,
+          };
+        });
+        this.delLoading = true;
+        API.del(data, true)
+          .then((res) => {
+            this.delLoading = false;
+            if (res.data.code === 200) {
+              this.$message.success("鍒犻櫎鎴愬姛锛�");
+              this.search();
+            }
+          })
+          .catch(() => {
+            this.delLoading = false;
+          });
+      });
+    },
+    async submit() {
+      const newRowData = await this.$refs.vueFlowchartEditor.getNewRowData();
+      if (!newRowData) {
+        return;
+      }
+      // const edgeEvents = this.$refs.vueFlowchartEditor.getEdgesEvents();
+      const flowData = await this.$refs.vueFlowchartEditor.getFlowData();
+      if (Array.isArray(flowData.nodes)) {
+        flowData.nodes = flowData.nodes.map((item) => {
+          item.name = item.id;
+          item.indexNum = item.index;
+          return item;
+        });
+      }
+      if (Array.isArray(flowData.edges)) {
+        flowData.edges = flowData.edges.map((item) => {
+          item.name = item.label;
+          item.indexNum = item.index;
+          // item.events = edgeEvents[item.id] || [];
+          return item;
+        });
+      }
+      let params = {
+        ...newRowData,
+        ...flowData,
+      };
+
+      this.submitLoading = true;
+      let APIFun = API.add;
+      if (this.type === "edit") {
+        APIFun = API.edit;
+        // this.$delete(params, "id");
+      }
+      APIFun(params)
+        .then((res) => {
+          this.submitLoading = false;
+          if (res.data.code === 200) {
+            this.$message.success(
+              this.type === "edit" ? "淇敼鎴愬姛锛�" : "鏂板鎴愬姛锛�"
+            );
+            this.visible = false;
+            this.search();
+          }
+        })
+        .catch(() => {
+          this.submitLoading = false;
+        });
+    },
+  },
+};
 </script>
 
-<style lang="scss">
-#basic {
-  height: 761px;
-  border-radius: 10px;
+<style lang="scss" scoped>
+/deep/ .el-dialog__body {
+  padding: 0 20px;
+}
+.cycle_flow {
+  height: 600px !important;
+  display: flex;
+  flex-direction: column;
+  margin: 0;
+  padding: 0;
+}
+.btn_link_del {
+  color: red;
 }
 </style>

--
Gitblit v1.9.3