From a94874c773b96378ce3aaeee38c2175508d43360 Mon Sep 17 00:00:00 2001
From: XiaoRuby <3114200645@qq.com>
Date: 星期二, 22 八月 2023 09:43:22 +0800
Subject: [PATCH] 8-21基础数据完成

---
 src/api/basicData/index.js          |   75 ++++++
 src/views/basicData/index.vue       |  551 ++++++++++++++++++++++++++++++++++++++++++++++++++
 src/views/standardLibrary/index.vue |   26 ++
 3 files changed, 648 insertions(+), 4 deletions(-)

diff --git a/src/api/basicData/index.js b/src/api/basicData/index.js
new file mode 100644
index 0000000..4e00b7a
--- /dev/null
+++ b/src/api/basicData/index.js
@@ -0,0 +1,75 @@
+import request from '@/utils/request'
+
+const Api = {
+    addStandardProjectGroup: "/productModel/selectfather", // 娣诲姞鏍囧噯-->閫夋嫨椤圭洰鍒嗙粍
+    productModelSelectmater: "/productModel/selectmater", // 閫夋嫨鏍峰搧鍚嶇О
+    addproductModel: "/productModel/addproductModel", // 娣诲姞鏍囧噯
+    selectproductModel: "/productModel/selectproductModel", // 鏌ヨ鏍囧噯妯$増鍒楄〃
+    deleteProductModel: "/productModel/delproductModel", // 鍒犻櫎鏍囧噯妯$増
+    selectproductModelById: "/productModel/selectproductModelById", // 鏍规嵁id鏌ヨ
+    updateProductModel: "/productModel/writeproductModel", // 鏇存柊鏍囧噯 -->缂栬緫
+    deleteList: "/productModel/delAllproductModel", // 鎵归噺鍒犻櫎
+
+}
+
+export function addStandardProjectGroupApi() {
+    return request({
+        url: Api.addStandardProjectGroup,
+        method: 'get'
+    })
+}
+
+export function productModelSelectmaterApi() {
+    return request({
+        url: Api.productModelSelectmater,
+        method: "get"
+    })
+}
+
+export function addproductModelApi(formData) {
+    return request({
+        url: Api.addproductModel,
+        method: 'post',
+        data: formData
+    })
+}
+
+export function updateProductModelApi(formData) {
+    return request({
+        url: Api.updateProductModel + '?id=' + formData.id,
+        method: 'post',
+        data:  formData
+    })
+}
+
+export function selectproductModelApi(params) {
+    return request({
+        url: Api.selectproductModel,
+        method: "get",
+        params: params
+    })
+}
+
+export function deleteProductModelApi(id){
+    return request({
+        url: Api.deleteProductModel,
+        method: "post",
+        params: {id: id}
+    })
+}
+
+export function selectproductModelByIdApi(id){
+    return request({
+        url: Api.selectproductModelById,
+        method: "get",
+        params: {id: id}
+    })
+}
+
+export function deleteListApi(id){
+    return request({
+        url: Api.deleteList,
+        method: "post",
+        params:{ids: id.toString()}
+    })
+}
\ No newline at end of file
diff --git a/src/views/basicData/index.vue b/src/views/basicData/index.vue
new file mode 100644
index 0000000..576920a
--- /dev/null
+++ b/src/views/basicData/index.vue
@@ -0,0 +1,551 @@
+<template>
+  <div class="main_div">
+    <div class="top_div">
+      <span>鏍峰搧鍚嶇О锛�</span>
+      <el-select
+        v-model="params.material"
+        size="small"
+        placeholder="璇烽�夋嫨鏍峰搧鍚嶇О"
+      >
+        <el-option
+          v-for="item in productModelSelectmater"
+          :value="item"
+          :key="item.index"
+          :label="item"
+        ></el-option>
+      </el-select>
+      <span class="top_div_span">椤圭洰鍒嗙粍锛�</span>
+      <el-input
+        v-model="params.father"
+        placeholder="璇疯緭鍏ラ」鐩垎缁�"
+        style="width: 10%"
+        size="small "
+      ></el-input>
+      <span class="top_div_span">椤圭洰鍚嶇О锛�</span>
+      <el-input
+        v-model="params.name"
+        placeholder="璇疯緭鍏ラ」鐩悕绉�"
+        style="width: 10%"
+        size="small "
+      ></el-input>
+      <el-button
+        type="primary"
+        class="top_div_button"
+        size="small"
+        @click="selectProductModelTable"
+        >鏌ヨ</el-button
+      >
+      <el-button class="top_div_button" size="small" @click="params = {}"
+        >閲嶇疆</el-button
+      >
+      <div style="float: right">
+        <el-button
+          class="top_div_button"
+          type="primary"
+          size="small"
+          icon="el-icon-folder-add"
+          @click="centerDialogVisible = true"
+          >鏂板</el-button
+        >
+        <el-dialog
+          :visible.sync="centerDialogVisible"
+          width="30%"
+          right
+          :before-close="handleClose"
+        >
+          <template slot="title">
+            <div class="addTop">
+              <span>{{ isUpdate ? "鏇存柊" : "鏂板" }}鍩虹鏁版嵁</span>
+            </div>
+          </template>
+          <el-form :model="form" :rules="rules" ref="ruleForm" class="addForm">
+            <el-form-item prop="material" required>
+              <span>鏍峰搧鍚嶇О锛�</span>
+              <el-select
+                v-model="form.material"
+                style="width: 85%"
+                placeholder="璇烽�夋嫨鏍峰搧鍚嶇О"
+              >
+                <el-option
+                  v-for="(item, index) in productModelSelectmater"
+                  :key="index"
+                  :value="item"
+                  :label="item"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item>
+              <span>椤圭洰鍒嗙粍锛�</span>
+              <el-select
+                v-model="form.father"
+                style="width: 85%"
+                placeholder="璇烽�夋嫨椤圭洰鍒嗙粍"
+              >
+                <el-option
+                  v-for="(item, index) in projectGroupingOptions"
+                  :key="index"
+                  :value="item"
+                  :label="item"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+            <el-row :gutter="24">
+              <el-col :span="12"
+                ><el-form-item prop="name" required
+                  ><span>椤圭洰鍚嶇О锛�</span>
+                  <el-input
+                    style="width: 70%"
+                    v-model="form.name"
+                    placeholder="璇疯緭鍏ラ」鐩悕绉�"
+                  ></el-input></el-form-item
+              ></el-col>
+              <el-col :span="12">
+                <el-form-item prop="unit">
+                  <span
+                    v-html="'鍗�&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;浣嶏細'"
+                  ></span>
+                  <el-input
+                    style="width: 70%"
+                    v-model="form.unit"
+                    placeholder="璇疯緭鍏ュ崟浣�"
+                  ></el-input></el-form-item
+              ></el-col>
+            </el-row>
+          </el-form>
+
+          <span slot="footer" class="dialog-footer">
+            <el-button @click="centerDialogVisible = false" size="small "
+              >鍙� 娑�</el-button
+            >
+            <el-button type="primary" @click="submitAdd" size="small ">{{
+              isUpdate ? "鏇� 鏂�" : "淇� 瀛�"
+            }}</el-button>
+          </span>
+        </el-dialog>
+        <el-button
+          class="top_div_button"
+          icon="el-icon-delete-solid"
+          size="small"
+          style="color: #00a5ff"
+          @click="deleteListClick"
+          >鍒犻櫎</el-button
+        >
+      </div>
+    </div>
+    <div class="table_div">
+      <el-table
+        :data="tableData"
+        style="width: 100%; margin-bottom: 20px"
+        row-key="name"
+        border
+        height="calc(100vh - 250px)"
+        default-expand-all
+        ref="multipleTable"
+        @select="selectTr"
+        @select-all="selectAll"
+        :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
+      >
+        <el-table-column type="selection" label="搴忓彿"> </el-table-column>
+        <el-table-column
+          type="index"
+          width="50px"
+          label="搴忓彿"
+        ></el-table-column>
+        <el-table-column label="椤圭洰鍚嶇О" sortable>
+          <template scope="scope">
+            <el-tag
+              ><div
+                class="firstDiv"
+                :style="`color: ${
+                  scope.row.code == '[1]' ? '#16a7ff' : '#58c173'
+                }`"
+              >
+                {{ scope.row.code == "[1]" ? "01" : "02" }}
+              </div>
+              <span style="color: black">{{ scope.row.name }}</span></el-tag
+            >
+          </template>
+        </el-table-column>
+        <el-table-column prop="unit" label="鍗曚綅" sortable></el-table-column>
+        <el-table-column label="鎿嶄綔">
+          <template slot-scope="scope">
+            <div v-if="scope.row.code == '[2]' || scope.row.edit == true">
+              <el-button type="text" size="mini" @click="childrenClick(scope)"
+                >缂栬緫</el-button
+              >
+              <el-button
+                type="text"
+                size="mini"
+                @click="deleteTreeChildren(scope)"
+                >鍒犻櫎</el-button
+              >
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+  </div>
+</template>
+
+<script>
+import {
+  addStandardProjectGroupApi,
+  productModelSelectmaterApi,
+  addproductModelApi,
+  selectproductModelApi,
+  deleteProductModelApi,
+  selectproductModelByIdApi,
+  updateProductModelApi,
+  deleteListApi,
+} from "@/api/basicData/index";
+export default {
+  name: "BasicDataMessage",
+  data() {
+    return {
+      isAllSelect: false,
+      projectGroupingOptions: [],
+      productModelSelectmater: [],
+      value: "",
+      isUpdate: false,
+      projectName: "",
+      tableData: [],
+      centerDialogVisible: false,
+      deleteList: [],
+      form: {
+        material: "", // 鏍峰搧鍚嶇О
+        father: "", // 椤圭洰鍒嗙粍
+        name: "", // 椤圭洰鍚嶇О
+        unit: "", // 鍗曚綅
+      },
+      params: {
+        material: "",
+        father: "",
+        name: "",
+      },
+      rules: {
+        material: [
+          { required: true, message: "璇烽�夋嫨鏍峰搧鍚嶇О", trigger: "change" },
+        ],
+        name: [
+          { required: true, message: "璇疯緭鍏ラ」鐩悕绉�", trigger: "blur" },
+          {
+            min: 2,
+            max: 25,
+            message: "闀垮害鍦� 2 鍒� 25 涓瓧绗�",
+            trigger: "blur",
+          },
+        ],
+        unit: [
+          { required: true, message: "璇疯緭鍏ュ崟浣�", trigger: "blur" },
+          {
+            min: 1,
+            max: 25,
+            message: "闀垮害鍦� 1 鍒� 25 涓瓧绗�",
+            trigger: "blur",
+          },
+        ],
+      },
+    };
+  },
+  methods: {
+    submitAdd() {
+      if (!this.isUpdate) {
+        this.$refs.ruleForm.validate((valid) => {
+          if (valid) {
+            addproductModelApi(this.form).then((res) => {
+              this.centerDialogVisible = false;
+              this.$message({
+                message: res.message,
+                type: "success",
+              });
+              this.selectProductModelTable();
+            });
+          }
+        });
+      } else {
+        this.$refs.ruleForm.validate((valid) => {
+          if (valid) {
+            updateProductModelApi(this.form).then((res) => {
+              this.centerDialogVisible = false;
+              this.$message({
+                message: res.message,
+                type: "success",
+              });
+              this.selectProductModelTable();
+            });
+          }
+        });
+      }
+    },
+    async selectProductMaster() {
+      await productModelSelectmaterApi().then((res) => {
+        this.productModelSelectmater = res.data;
+      });
+    },
+    handleClose(done) {
+      this.$confirm("纭鍏抽棴锛�")
+        .then((_) => {
+          this.centerDialogVisible = false;
+          done();
+        })
+        .catch((_) => {});
+    },
+    selectProductModelTable() {
+      selectproductModelApi(this.params).then((res) => {
+        res.data.forEach((i) => {
+          if (i.name === undefined) {
+            i.name = i.children[0].name;
+            i.unit = i.children[0].unit;
+            i.id = i.children[0].id;
+            i.edit = true;
+            delete i.children;
+          }
+        });
+        this.tableData = res.data;
+        this.selectDataList();
+      });
+    },
+    childrenClick(scope) {
+      this.isUpdate = true;
+      let father = "";
+      selectproductModelByIdApi(scope.row.id).then((res) => {
+        let result = res.data;
+        this.form.name = result.name;
+        this.form.material = result.material;
+        this.form.father = result.father;
+        this.form.unit = result.unit;
+        this.form.id = scope.row.id;
+      });
+      this.centerDialogVisible = true;
+    },
+    selectDataList() {
+      this.tableData.forEach((a) => {
+        a.code = "[1]";
+        if (a.children != undefined) {
+          a.children.forEach((b) => {
+            b.code = "[2]";
+          });
+        }
+      });
+    },
+    deleteTreeChildren(scope) {
+      deleteProductModelApi(scope.row.id).then((res) => {
+        this.$message({
+          message: res.message,
+          type: "success",
+        });
+        this.selectProductModelTable();
+      });
+    },
+
+    // 琛ㄦ牸鏍戝叏閮ㄩ�変腑閰嶇疆
+    // 鍏ㄩ��/鍙栨秷閫夋搷浣�
+    selectAll(val) {
+      this.isAllSelect = !this.isAllSelect;
+      let data = this.tableData;
+      this.toggleSelect(data, this.isAllSelect, "all");
+      // 鑷畾涔�
+      if (this.isAllSelect) {
+        val.forEach((i) => {
+          let isExist = false;
+          this.deleteList.findIndex((c) => {
+            if (c === i.id) {
+              isExist = true;
+            }
+          });
+          if (!isExist && i.id !== undefined) {
+            this.deleteList.push(i.id);
+          }
+        });
+      } else {
+        this.deleteList.splice(0, this.deleteList.length);
+      }
+      // 鑷畾涔夌粨鏉�
+    },
+    //閫夋嫨鏌愯
+    selectTr(selection, row) {
+      this.$set(row, "isChecked", !row.isChecked);
+      this.$nextTick(() => {
+        this.isAllSelect = row.isChecked;
+        this.toggleSelect(row, row.isChecked, "tr");
+      });
+
+      if (row.isChecked === true) {
+        if (row.children !== undefined) {
+          row.children.forEach((i) => {
+            this.deleteList.push(i.id);
+          });
+        } else {
+          this.deleteList.push(row.id);
+        }
+      } else if (row.isChecked === false) {
+        if (row.children !== undefined) {
+          row.children.forEach((i) => {
+            this.deleteList.findIndex((c, index) => {
+              if (c === i.id) {
+                this.deleteList.splice(index, 1);
+                return;
+              }
+            });
+          });
+        }
+        this.deleteList.findIndex((c, index) => {
+          if (c === row.id) {
+            this.deleteList.splice(index, 1);
+            return;
+          }
+        });
+      }
+    },
+    //閫掑綊瀛愮骇
+    toggleSelect(data, flag, type) {
+      if (type === "all") {
+        if (data.length > 0) {
+          data.forEach((item) => {
+            this.toggleSelection(item, flag);
+            if (item.children && item.children.length > 0) {
+              this.toggleSelect(item.children, flag, type);
+            }
+          });
+        }
+      } else {
+        if (data.children && data.children.length > 0) {
+          data.children.forEach((item) => {
+            item.isChecked = !item.isChecked;
+            this.$refs.multipleTable.toggleRowSelection(item, flag);
+            this.toggleSelect(item, flag, type);
+          });
+        }
+      }
+    },
+    //鏀瑰彉閫変腑
+    toggleSelection(row, flag) {
+      this.$set(row, "isChecked", flag);
+      this.$nextTick(() => {
+        if (flag) {
+          this.$refs.multipleTable.toggleRowSelection(row, flag);
+        } else {
+          this.$refs.multipleTable.clearSelection();
+        }
+      });
+    },
+    // 琛ㄦ牸鏍戝叏閮ㄩ�変腑閰嶇疆  缁撴潫
+    deleteListClick() {
+      deleteListApi(this.deleteList).then((res) => {
+        this.$message({
+          message: res.message,
+          type: "success",
+        });
+        this.selectProductModelTable();
+      });
+    },
+  },
+  mounted() {
+    this.selectProductMaster().then((res) => {
+      this.params.material = this.productModelSelectmater[0];
+      this.selectProductModelTable();
+    });
+  },
+  watch: {
+    centerDialogVisible: {
+      handler(newVal, oldVal) {
+        if (newVal == true) {
+          addStandardProjectGroupApi().then((res) => {
+            this.projectGroupingOptions = res.data;
+          });
+        } else {
+          // 璇锋眰鎴愬姛娓呴櫎鏁版嵁
+          this.form = {};
+          // 鎻愪氦鎴愬姛娓呴櫎妫�楠�
+          this.$refs.ruleForm.resetFields();
+          this.isUpdate = false;
+        }
+      },
+    },
+  },
+};
+</script>
+
+<style>
+.el-tag.el-tag {
+  border-color: transparent;
+  background-color: transparent;
+}
+.el-tag.el-tag:hover {
+  border-color: transparent;
+  background-color: transparent;
+}
+.firstDiv {
+  float: left;
+  width: 20px;
+  height: 20px;
+  border-radius: 50%;
+  background-color: #eff5ff;
+  margin-top: 5px;
+  justify-content: center;
+  display: flex;
+  align-items: center;
+  margin-right: 8px;
+}
+.main_div {
+  width: 100%;
+  position: relative;
+  padding: 0 10px 10px 10px;
+}
+.el-dialog__header {
+  padding: 0;
+}
+.el-dialog__headerbtn {
+  top: 0;
+}
+.el-dialog__close {
+  padding: 8px 0;
+  color: #ffffff !important;
+}
+.addForm {
+  padding: 20px 20px 0 20px;
+}
+.addForm .el-form-item__error {
+  left: 66px;
+}
+.el-dialog {
+  border-radius: 10px;
+}
+.el-dialog__body {
+  padding: 30px 20px 0 20px;
+}
+.addTop {
+  border-top-left-radius: 10px;
+  border-top-right-radius: 10px;
+  background-color: #00a5ff;
+  color: #ffffff;
+  padding: 8px 20px;
+  float: left;
+  height: 30px;
+  width: 100%;
+}
+.addTop span {
+  font-size: 16px;
+  font-weight: 700;
+}
+.table_div {
+  margin-top: 10px;
+  width: 100%;
+  height: calc(100vh - 230px);
+  background-color: #ffffff;
+  padding: 10px;
+}
+
+.top_div {
+  height: 120px;
+  width: 100%;
+  padding: 30px 40px;
+  background-color: #ffffff;
+}
+.top_div_span {
+  margin-left: 50px;
+}
+.top_div_button {
+  margin-left: 20px;
+}
+</style>
diff --git a/src/views/standardLibrary/index.vue b/src/views/standardLibrary/index.vue
index 274125d..4a198f1 100644
--- a/src/views/standardLibrary/index.vue
+++ b/src/views/standardLibrary/index.vue
@@ -523,9 +523,26 @@
         this.isAllSelect = row.isChecked;
         this.toggleSelect(row, row.isChecked, "tr");
       });
+
       if (row.isChecked === true) {
-        this.deleteList.push(row.id);
+        if (row.children !== undefined) {
+          row.children.forEach((i) => {
+            this.deleteList.push(i.id);
+          });
+        } else {
+          this.deleteList.push(row.id);
+        }
       } else if (row.isChecked === false) {
+        if (row.children !== undefined) {
+          row.children.forEach((i) => {
+            this.deleteList.findIndex((c, index) => {
+              if (c === i.id) {
+                this.deleteList.splice(index, 1);
+                return;
+              }
+            });
+          });
+        }
         this.deleteList.findIndex((c, index) => {
           if (c === row.id) {
             this.deleteList.splice(index, 1);
@@ -533,7 +550,6 @@
           }
         });
       }
-      console.log(`output->this.deleteList`, this.deleteList);
     },
     //閫掑綊瀛愮骇
     toggleSelect(data, flag, type) {
@@ -574,6 +590,7 @@
           message: res.message,
           type: "success",
         });
+        this.selectProductModelTable();
       });
     },
   },
@@ -611,13 +628,14 @@
     .library-bom {
       // padding-right: 10px;
       width: 300px;
-      // height: 100%;
-      max-height: 100%;
+      height: 100%;
+      // max-height: 100%;
       // margin-right: 12px;
       // overflow-y: scroll;
       .el-tree {
         // margin-top:
         width: 100%;
+        overflow: scroll;
         ::v-deep .el-tree-node__content {
           height: 24px !important;
           font-size: 18px;

--
Gitblit v1.9.3