From ae5a56abad5cade3427d8ccac8588de9ce209ef3 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期五, 07 三月 2025 13:38:00 +0800
Subject: [PATCH] 搬迁供应商管理80%

---
 src/views/CNAS/externalService/supplierManage/component/Contents.vue           |  211 +++++++++++
 src/views/CNAS/externalService/supplierManage/index.vue                        |  149 +++++++
 src/views/CNAS/process/complaint/index.vue                                     |    2 
 src/views/CNAS/resourceDemand/standardMaterialAccept/component/AddRecord.vue   |   39 -
 src/views/CNAS/systemManagement/correctiveAction/components/correctiveInfo.vue |   21 -
 src/api/cnas/resourceDemand/externalService/supplierManage/supplierManage.js   |  121 ++++-
 src/views/CNAS/externalService/supplierManage/component/CardPanel.vue          |   75 +++
 src/views/CNAS/externalService/supplierManage/component/ConsumableOverview.vue |  125 ++++++
 src/views/CNAS/externalService/supplierManage/component/Edit.vue               |  217 +++++++++++
 src/views/CNAS/externalService/supplierManage/component/QualifiedSuppliers.vue |  172 +++++++++
 src/api/cnas/systemManagement/correctiveAction.js                              |    4 
 11 files changed, 1,051 insertions(+), 85 deletions(-)

diff --git a/src/api/cnas/resourceDemand/externalService/supplierManage/supplierManage.js b/src/api/cnas/resourceDemand/externalService/supplierManage/supplierManage.js
index c28b538..4b6264d 100644
--- a/src/api/cnas/resourceDemand/externalService/supplierManage/supplierManage.js
+++ b/src/api/cnas/resourceDemand/externalService/supplierManage/supplierManage.js
@@ -1,52 +1,109 @@
-import request from '@/utils/request'
+import request from "@/utils/request";
 
-// 鍒嗛〉鏌ヨ
+// 渚涘簲鏍�
+export function suppliersDirectoryContentsListing(query) {
+  return request({
+    url: "/suppliersDirectoryContents/suppliersDirectoryContentsListing",
+    method: "get",
+    params: query,
+  });
+}
+
+// 渚涘簲鍟嗙洰褰曡鎯�
+export function selectSuppliersDirectoryContentsById(query) {
+  return request({
+    url: "/suppliersDirectoryContents/selectSuppliersDirectoryContentsById",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鏂板鑺傜偣
+export function addSuppliersDirectoryContents(data) {
+  return request({
+    url: "/suppliersDirectoryContents/addSuppliersDirectoryContents",
+    method: "post",
+    data: data,
+  });
+}
+
+// 缂栬緫鑺傜偣
+export function updateSuppliersDirectoryContents(data) {
+  return request({
+    url: "/suppliersDirectoryContents/updateSuppliersDirectoryContents",
+    method: "post",
+    data: data,
+  });
+}
+
+//鍒犻櫎鑺傜偣
+export function deleteSuppliersDirectoryContentsById(query) {
+  return request({
+    url: "/suppliersDirectoryContents/deleteSuppliersDirectoryContentsById",
+    method: "delete",
+    params: query,
+  });
+}
+
+// 鏌ヨ鎵�鏈夎妭鐐�
+export function getSuppliersDirectoryContentsNodeNames(query) {
+  return request({
+    url: "/suppliersDirectoryContents/getSuppliersDirectoryContentsNodeNames",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鍒嗛〉鏌ヨ鍚堟牸渚涙柟鍚�
 export function selectQualifiedSupplierManagementPage(query) {
   return request({
-    url: '/supplierManagement/selectQualifiedSupplierManagementPage',
-    method: 'get',
-    params: query
-  })
+    url: "/supplierManagement/selectQualifiedSupplierManagementPage",
+    method: "get",
+    params: query,
+  });
 }
 
-// 缂栬緫渚涘簲鍟�
-export function updateSupplierManagement(query) {
+//鍒犻櫎渚涘簲鍟�
+export function delSupplierManagement(query) {
   return request({
-    url: '/supplierManagement/updateSupplierManagement',
-    method: 'post',
-    data: query
-  })
-}
-
-// 鏂板渚涘簲鍟�
-export function addSupplierManagement(query) {
-  return request({
-    url: '/supplierManagement/addSupplierManagement',
-    method: 'post',
-    data: query
-  })
+    url: "/supplierManagement/delSupplierManagement/" + query,
+    method: "delete",
+    // params: query,
+  });
 }
 
 // 瀵煎嚭渚涘簲鍟�
 export function exportSupplierManagement(query) {
   return request({
-    url: "/supplierManagement/exportSupplierManagement",
+    url: "/supplierManagement/exportSupplierManagement/" + query,
     method: "get",
     responseType: "blob",
-    params: query,
   });
 }
 
-// 鍒犻櫎渚涘簲鍟�
-export function delSupplierManagement(query) {
+// 鏂板渚涘簲鍟�
+export function addSupplierManagement(data) {
   return request({
-    url: '/supplierManagement/delSupplierManagement',
-    method: 'delete',
-    params: query
-  })
+    url: "/supplierManagement/addSupplierManagement",
+    method: "post",
+    data: data,
+  });
 }
 
+// 缂栬緫渚涘簲鍟�
+export function updateSupplierManagement(data) {
+  return request({
+    url: "/supplierManagement/updateSupplierManagement",
+    method: "post",
+    data: data,
+  });
+}
 
-
-
-
+// 鍒嗛〉鏌ヨ渚涙柟鍚嶅綍
+export function selectSupplierManagementByParentId(query) {
+  return request({
+    url: "/supplierManagement/selectSupplierManagementByParentId/" + query,
+    method: "get",
+    // params: query,
+  });
+}
diff --git a/src/api/cnas/systemManagement/correctiveAction.js b/src/api/cnas/systemManagement/correctiveAction.js
index ebd9f5c..6602ae3 100644
--- a/src/api/cnas/systemManagement/correctiveAction.js
+++ b/src/api/cnas/systemManagement/correctiveAction.js
@@ -15,9 +15,7 @@
   return request({
     url: "/qualitySupervise/exportSuperviseDetaillCorrect",
     method: "get",
-    headers: {
-      responseType: "blob",
-    },
+    responseType: "blob",
     params: query,
   });
 }
diff --git a/src/views/CNAS/externalService/supplierManage/component/CardPanel.vue b/src/views/CNAS/externalService/supplierManage/component/CardPanel.vue
new file mode 100644
index 0000000..1e8324d
--- /dev/null
+++ b/src/views/CNAS/externalService/supplierManage/component/CardPanel.vue
@@ -0,0 +1,75 @@
+<template>
+  <div class="card-container" @click="handleCard">
+    <div class="card-panel" :class="[isActive == index ? 'isActive' : '']">
+      <el-image style="width: 80%; height: 70px" :src="javaApi + '/img/' + data.logo" fit="scale-down" />
+    </div>
+    <div class="title">
+      {{ data.supplierName }}
+    </div>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    data: {
+      type: Object,
+      default: () => { },
+    },
+    index: {
+      type: Number,
+      default: -1,
+    },
+    isActive: {
+      type: Number,
+      default: -1,
+    },
+  },
+  data() {
+    return {};
+  },
+  methods: {
+    handleCard() {
+      this.$emit("handleCard", this.data, this.index);
+    },
+  },
+};
+</script>
+<style scoped>
+.card-container {
+  margin: 10px 10px 10px 0;
+  text-align: center;
+}
+
+.card-panel {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 90%;
+  height: 90px;
+  box-shadow: 0px 0px 20px 0px #0000001a;
+  cursor: pointer;
+  border-radius: 5px;
+  border: 1px solid transparent;
+}
+
+.card-panel:hover {
+  border: 1px solid #409eff;
+  //background: #1D56C50D;
+}
+
+.isActive {
+  border: 1px solid #409eff;
+  //background: #1D56C50D;
+}
+
+.title {
+  margin-top: 15px;
+  margin-left: 10px;
+  width: 80%;
+  height: 30px;
+  font-size: 13px;
+  white-space: normal;
+  word-break: break-all;
+  overflow-wrap: break-word;
+}
+</style>
diff --git a/src/views/CNAS/externalService/supplierManage/component/ConsumableOverview.vue b/src/views/CNAS/externalService/supplierManage/component/ConsumableOverview.vue
new file mode 100644
index 0000000..8425c3b
--- /dev/null
+++ b/src/views/CNAS/externalService/supplierManage/component/ConsumableOverview.vue
@@ -0,0 +1,125 @@
+<template>
+  <div>
+    <el-row class="card-box">
+      <el-col :span="4" v-for="(item, index) in cardList" :key="index">
+        <CardPanel :isActive="isActive" :data="item" :index="index" @handleCard="handleCard" />
+      </el-col>
+    </el-row>
+    <TableCard title="渚涘簲鍟嗕俊鎭�" :showForm="false" style="margin-top: 5px">
+      <template v-slot:table>
+        <limsTable style="margin-top: 18px; padding: 0 15px" :height="'150px'" :column="columns"
+          :table-data="tableData">
+          <div slot="action" slot-scope="scope">
+            <el-button type="text" @click="showDialog(scope)">鏌ョ湅</el-button>
+          </div>
+        </limsTable>
+      </template>
+    </TableCard>
+    <Edit ref="editRef" @submit="getTableData" />
+  </div>
+</template>
+<script>
+import CardPanel from "./CardPanel.vue";
+import TableCard from "@/components/TableCard/index.vue";
+import limsTable from "@/components/Table/lims-table.vue";
+import Edit from "./Edit.vue";
+import {
+  selectSupplierManagementByParentId,
+} from "@/api/cnas/resourceDemand/externalService/supplierManage/supplierManage.js";
+
+export default {
+  components: { CardPanel, TableCard, limsTable, Edit },
+  props: {
+    contentsId: {
+      type: Number,
+      default: 0,
+    },
+  },
+  data() {
+    return {
+      columns: [
+        {
+          label: "渚涘簲鍟嗙紪鍙�",
+          prop: "supplierRef",
+        },
+        {
+          label: "渚涘簲鍟嗗悕绉�",
+          prop: "supplierName",
+        },
+        {
+          label: "鍦板潃",
+          prop: "adress",
+        },
+        {
+          label: "鑱旂郴浜�",
+          prop: "contacts",
+        },
+        {
+          label: "鑱旂郴鐢佃瘽",
+          prop: "phone",
+        },
+        {
+          label: "浼犵湡",
+          prop: "fax",
+        },
+        {
+          label: "缃戝潃",
+          prop: "website",
+        },
+        {
+          label: "閭",
+          prop: "email",
+        },
+        {
+          label: "涓婃鏇存柊鏃堕棿",
+          prop: "updateTime",
+        },
+        {
+          fixed: "right",
+          dataType: "slot",
+          slot: "action",
+          label: "鎿嶄綔",
+        },
+      ],
+      cardList: [],
+      tableData: [],
+      isActive: -1,
+    };
+  },
+  watch: {
+    contentsId(newVal) {
+      if (newVal !== 0) {
+        this.getTableData();
+      }
+    },
+  },
+  mounted() {
+    this.getTableData(this.contentsId);
+  },
+  methods: {
+    // 鑾峰彇琛ㄦ牸鏁版嵁
+    async getTableData() {
+      const { code, data } = await selectSupplierManagementByParentId(this.contentsId);
+      if (code == 200) {
+        this.cardList = data;
+      }
+    },
+    handleCard(data, index) {
+      this.isActive = index;
+      this.tableData = [data];
+    },
+    showDialog(row) {
+      this.$refs.editRef.openDialog(row);
+    },
+  },
+};
+</script>
+<style scoped>
+.card-box {
+  width: 100%;
+  padding-left: 5px;
+  padding-right: 5px;
+  height: 45vh;
+  overflow-y: auto;
+}
+</style>
diff --git a/src/views/CNAS/externalService/supplierManage/component/Contents.vue b/src/views/CNAS/externalService/supplierManage/component/Contents.vue
new file mode 100644
index 0000000..c9c7501
--- /dev/null
+++ b/src/views/CNAS/externalService/supplierManage/component/Contents.vue
@@ -0,0 +1,211 @@
+<template>
+  <div class="parent-class">
+    <div style="display: flex; justify-content: flex-end; margin-right: 20px">
+      <el-button type="primary" @click="addContents" size="small" icon="el-icon-plus">娣诲姞瀛愯妭鐐�</el-button>
+      <el-button type="danger" @click="deletetContents" size="small" icon="el-icon-delete">鍒犻櫎瀛愯妭鐐�</el-button>
+      <el-button type="warning" @click="updateContents" size="small" icon="el-icon-edit">鏇存柊瀛愯妭鐐�</el-button>
+    </div>
+    <el-form label-width="100px">
+      <el-form-item label="鑺傜偣鍚嶇О">
+        <el-input v-model="form.nodeName" style="width: 200px" size="small"></el-input>
+      </el-form-item>
+      <el-form-item label="浠e彿">
+        <el-input v-model="form.code" style="width: 200px" size="small"></el-input>
+      </el-form-item>
+    </el-form>
+
+    <!-- 鏂板寮规 -->
+    <el-dialog title="娣诲姞鑺傜偣" :visible.sync="dialogVisible" width="40%">
+      <el-form label-width="100px" :model="addForm" ref="addForm" :rules="rules">
+        <el-form-item label="鐖惰妭鐐瑰悕绉�">
+          <el-cascader v-model="addForm.parentId" :options="treeData"
+            :props="{ checkStrictly: true, value: 'id', label: 'nodeName' }" clearable></el-cascader>
+        </el-form-item>
+        <el-form-item label="鑺傜偣鍚嶇О" prop="nodeName">
+          <el-input v-model="addForm.nodeName" style="width: 200px" size="small"></el-input>
+        </el-form-item>
+        <el-form-item label="浠e彿">
+          <el-input v-model="addForm.code" style="width: 200px" size="small"></el-input>
+        </el-form-item>
+      </el-form>
+
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import {
+  selectSuppliersDirectoryContentsById,
+  addSuppliersDirectoryContents,
+  updateSuppliersDirectoryContents,
+  deleteSuppliersDirectoryContentsById,
+  getSuppliersDirectoryContentsNodeNames,
+} from "@/api/cnas/resourceDemand/externalService/supplierManage/supplierManage.js";
+import { selectUserCondition } from "@/api/system/user";
+export default {
+  props: {
+    id: {
+      type: Number,
+      default: 0,
+    },
+    treeData: {
+      type: Array,
+      default: () => [],
+    },
+    from: {
+      type: String,
+      default: ""
+    }
+  },
+  data() {
+    return {
+      nodeNames: [],
+      users: [],
+      dialogVisible: false,
+      form: {
+        nodeName: "",
+        code: "",
+      },
+      addForm: {
+        nodeName: "",
+        code: "",
+        parentId: null,
+      },
+      rules: {
+        nodeName: [
+          { required: true, message: "璇疯緭鍏ヨ妭鐐瑰悕绉�", trigger: "blur" },
+        ],
+      },
+    };
+  },
+  mounted() {
+    if (this.id !== 0) {
+      this.getContentsDetail();
+    }
+    this.getNodeNames();
+    this.getUserList();
+  },
+  watch: {
+    id(newVal, oldVal) {
+      if (newVal !== 0) {
+        console.log(newVal, oldVal);
+        this.getContentsDetail();
+      }
+    },
+  },
+  methods: {
+    // 鑾峰彇鐩綍璇︽儏
+    getContentsDetail() {
+      selectSuppliersDirectoryContentsById({ id: this.id }).then((res) => {
+        if (res.data == null) {
+          this.form = {
+            nodeName: "",
+            code: "",
+          };
+          return;
+        }
+        this.form = res.data;
+      });
+    },
+    // 鏂板缓
+    addContents() {
+      this.dialogVisible = true;
+      this.resetForm();
+    },
+    resetForm() {
+      this.addForm = {
+        nodeName: "",
+        code: "",
+        parentId: null,
+      };
+    },
+    submitForm() {
+      let flag = true;
+      this.$refs.addForm.validate((valid) => {
+        if (!valid) {
+          flag = false;
+          return false;
+        }
+      });
+      if (this.addForm.parentId) {
+        this.addForm.parentId =
+          this.addForm.parentId[this.addForm.parentId.length - 1];
+      }
+      if (!flag) {
+        return;
+      }
+
+      addSuppliersDirectoryContents(this.addForm).then((res) => {
+        if (res.code === 200) {
+          this.$message.success("娣诲姞鎴愬姛");
+          this.dialogVisible = false;
+          this.$emit("contentsUpdate", res.data);
+          this.getContentsDetail();
+        }
+      });
+    },
+    // 鏇存柊
+    updateContents() {
+      Object.keys(this.form).forEach((key) => {
+        if (key == "children") {
+          delete this.form[key];
+        }
+      });
+      updateSuppliersDirectoryContents(this.form).then((res) => {
+        if (res.code === 200) {
+          this.$message.success("鏇存柊鎴愬姛");
+          this.$emit("contentsUpdate", this.id);
+          this.dialogVisible = false;
+          this.getContentsDetail();
+        }
+      });
+    },
+    // 鍒犻櫎
+    deletetContents() {
+      if (
+        this.form.id == null ||
+        this.form.id == "" ||
+        this.form.id == undefined
+      ) {
+        this.$message.error("璇烽�夋嫨瑕佸垹闄ょ殑鑺傜偣");
+        return;
+      }
+      this.$confirm("姝ゆ搷浣滃皢鍒犻櫎璇ヨ妭鐐�, 鏄惁缁х画?", "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning",
+      }).then(() => {
+        deleteSuppliersDirectoryContentsById({ id: this.form.id }).then((res) => {
+          if (res.code == 200) {
+            this.$message.success("鍒犻櫎鎴愬姛");
+            this.$emit("contentsUpdate", this.form.parentId, true);
+            this.getContentsDetail();
+          }
+        });
+      });
+    },
+    // 鑾峰彇鎵�鏈夌洰褰曡妭鐐�
+    getNodeNames() {
+      getSuppliersDirectoryContentsNodeNames().then((res) => {
+        this.nodeNames = res.data;
+      });
+    },
+    // 鑾峰彇鎵�鏈夌敤鎴�
+    getUserList() {
+      selectUserCondition().then((res) => {
+        this.users = res.data;
+      });
+    },
+  },
+  created() { },
+};
+</script>
+
+<style scoped>
+.parent-class {
+  margin-top: 20px;
+}
+</style>
diff --git a/src/views/CNAS/externalService/supplierManage/component/Edit.vue b/src/views/CNAS/externalService/supplierManage/component/Edit.vue
new file mode 100644
index 0000000..628cb74
--- /dev/null
+++ b/src/views/CNAS/externalService/supplierManage/component/Edit.vue
@@ -0,0 +1,217 @@
+<template>
+  <el-dialog title="渚涘簲鍟嗚鎯�" width="40%" :visible.sync="dialogVisible">
+    <el-form :model="model" label-width="auto">
+      <el-row>
+        <el-col :span="12">
+          <el-form-item label="渚涘簲鍟�">
+            <el-input v-model="model.supplierName" placeholder="璇疯緭鍏�" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="缂栧彿">
+            <el-input v-model="model.supplierRef" placeholder="璇疯緭鍏�" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="24">
+          <el-form-item label="渚涘簲鍟嗙墿鍝佹湇鍔″悕绉�">
+            <el-input v-model="model.supplierItemServiceName" placeholder="璇疯緭鍏�" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="12">
+          <el-form-item label="閭紪">
+            <el-input v-model="model.postalCode" placeholder="璇疯緭鍏�" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鍦板潃">
+            <el-input v-model="model.adress" placeholder="璇疯緭鍏�" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="24">
+          <el-form-item label="logo">
+            <div class="rows">
+              <el-input placeholder="璇疯緭鍏�" v-model="model.logo" style="width: 100%" />
+              <el-upload ref="upload" style="float: left; margin: 0 12px 0 20px" :action="action"
+                :show-file-list="false" :on-success="onSuccess">
+                <el-button class="uploadFile" slot="trigger" type="primary">娴忚</el-button>
+              </el-upload>
+            </div>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="12">
+          <el-form-item label="鑱旂郴浜�">
+            <el-input v-model="model.contacts" placeholder="璇疯緭鍏�" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鑱旂郴鐢佃瘽">
+            <el-input v-model="model.phone" placeholder="璇疯緭鍏�" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="12">
+          <el-form-item label="鎴峰悕">
+            <el-input v-model="model.householdName" placeholder="璇疯緭鍏�" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="浼犵湡">
+            <el-input v-model="model.fax" placeholder="璇疯緭鍏�" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="12">
+          <el-form-item label="寮�鎴疯">
+            <el-input v-model="model.openingName" placeholder="璇疯緭鍏�" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="缃戝潃">
+            <el-input v-model="model.website" placeholder="璇疯緭鍏�" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="12">
+          <el-form-item label="璐﹀彿">
+            <el-input v-model="model.accountName" placeholder="璇疯緭鍏�" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="Email">
+            <el-input v-model="model.email" placeholder="璇疯緭鍏�" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <span slot="footer">
+      <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
+      <el-button type="primary" @click="submit">淇� 瀛�</el-button>
+    </span>
+  </el-dialog>
+</template>
+
+<script>
+import {
+  addSupplierManagement,
+  updateSupplierManagement,
+} from "@/api/cnas/resourceDemand/externalService/supplierManage/supplierManage.js";
+export default {
+  props: {
+    contentsId: {
+      type: Number,
+      default: 0,
+    },
+  },
+  data() {
+    return {
+      dialogVisible: false,
+      model: {
+        parentId: null,
+        supplierManagementId: undefined,
+        supplierName: undefined, // 渚涘簲鍟�
+        supplierRef: undefined, // 缂栧彿
+        supplierItemServiceName: undefined, // 渚涘簲鍟嗙墿鍝佹湇鍔″悕绉�
+        postalCode: undefined, // 閭紪
+        adress: undefined, // 鍦板潃
+        logo: undefined, // logo
+        contacts: undefined, // 鑱旂郴浜�
+        phone: undefined, // 鑱旂郴鐢佃瘽
+        householdName: undefined, // 鎴峰悕
+        fax: undefined, // 浼犵湡
+        openingName: undefined, // 寮�鎴疯
+        website: undefined, // 缃戝潃
+        accountName: undefined, // 璐﹀彿
+        email: undefined, // Email
+      },
+    };
+  },
+  computed: {
+    action() {
+      return `${this.javaApi}/personBasicInfo/saveCNASFile`;
+    },
+  },
+  methods: {
+    openDialog(form) {
+      console.log("12--", this.contentsId);
+      if (form) {
+        this.model.supplierManagementId = form.row.supplierManagementId;
+        this.model.supplierName = form.row.supplierName;
+        this.model.supplierRef = form.row.supplierRef;
+        this.model.supplierItemServiceName = form.row.supplierItemServiceName;
+        this.model.postalCode = form.row.postalCode;
+        this.model.adress = form.row.adress;
+        this.model.logo = form.row.logo;
+        this.model.contacts = form.row.contacts;
+        this.model.phone = form.row.phone;
+        this.model.householdName = form.row.householdName;
+        this.model.fax = form.row.fax;
+        this.model.openingName = form.row.openingName;
+        this.model.website = form.row.website;
+        this.model.accountName = form.row.accountName;
+        this.model.email = form.row.email;
+        this.model.parentId = form.row.parentId;
+      } else {
+        this.model = {
+          parentId: this.contentsId,
+          supplierManagementId: undefined,
+          supplierName: undefined, // 渚涘簲鍟�
+          supplierRef: undefined, // 缂栧彿
+          supplierItemServiceName: undefined, // 渚涘簲鍟嗙墿鍝佹湇鍔″悕绉�
+          postalCode: undefined, // 閭紪
+          adress: undefined, // 鍦板潃
+          logo: undefined, // logo
+          contacts: undefined, // 鑱旂郴浜�
+          phone: undefined, // 鑱旂郴鐢佃瘽
+          householdName: undefined, // 鎴峰悕
+          fax: undefined, // 浼犵湡
+          openingName: undefined, // 寮�鎴疯
+          website: undefined, // 缃戝潃
+          accountName: undefined, // 璐﹀彿
+          email: undefined, // Email
+        };
+      }
+      // this.model.parentId = this.contentsId;
+      this.dialogVisible = true;
+    },
+    async submit() {
+      if (this.model.supplierManagementId) {
+        const { code } = await updateSupplierManagement(this.model);
+        if (code == 200) {
+          this.$message.success("淇敼鎴愬姛");
+          this.$emit("submit");
+          this.dialogVisible = false;
+        }
+      } else {
+        const { code } = await addSupplierManagement(this.model);
+        if (code == 200) {
+          this.$message.success("鏂板鎴愬姛");
+          this.$emit("submit");
+          this.dialogVisible = false;
+        }
+      }
+    },
+    async onSuccess(response) {
+      this.$set(this.model, "logo", response.data);
+    },
+  },
+};
+</script>
+
+<style scoped>
+.rows {
+  width: 100%;
+  display: flex;
+  justify-content: space-between;
+}
+</style>
diff --git a/src/views/CNAS/externalService/supplierManage/component/QualifiedSuppliers.vue b/src/views/CNAS/externalService/supplierManage/component/QualifiedSuppliers.vue
new file mode 100644
index 0000000..19ad28b
--- /dev/null
+++ b/src/views/CNAS/externalService/supplierManage/component/QualifiedSuppliers.vue
@@ -0,0 +1,172 @@
+<template>
+  <div>
+    <TableCard :showTitle="false">
+      <template slot="form">
+        <div class="action-box">
+          <div></div>
+          <div class="flex">
+            <el-button :disabled="contentsId == 0" icon="el-icon-plus" type="primary" @click="showDialog()">
+              鏂板缓
+            </el-button>
+            <el-button icon="el-icon-upload2" @click="exportExcel">
+              瀵煎嚭Excel
+            </el-button>
+          </div>
+        </div>
+      </template>
+      <template v-slot:table>
+        <limsTable :column="columns" :height="'calc(100vh - 300px)'" :isSelection="true" :table-data="tableData"
+          style="margin-top: 18px; padding: 0 15px;" :page="page" @pagination="pagination">
+          <div slot="action" slot-scope="scope">
+            <el-button type="text" @click="showDialog(scope)">缂栬緫</el-button>
+            <el-button type="text" @click="delRow(scope)">
+              <span style="color: #F56C6C">鍒犻櫎</span>
+            </el-button>
+          </div>
+        </limsTable>
+      </template>
+    </TableCard>
+    <Edit ref="editRef" :contentsId="contentsId" @submit="getTableData" />
+  </div>
+</template>
+
+<script>
+import TableCard from '@/components/TableCard/index.vue';
+import limsTable from "@/components/Table/lims-table.vue";
+import Edit from "./Edit.vue"
+import {
+  selectQualifiedSupplierManagementPage,
+  delSupplierManagement,
+  exportSupplierManagement,
+} from "@/api/cnas/resourceDemand/externalService/supplierManage/supplierManage.js";
+
+export default {
+  components: {
+    TableCard, limsTable, Edit
+  },
+  props: {
+    contentsId: {
+      type: Number,
+      default: 0
+    }
+  },
+  data() {
+    return {
+      columns: [
+        {
+          label: "渚涘簲鍟嗙紪鍙�",
+          prop: "supplierRef"
+        },
+        {
+          label: "渚涘簲鍟�",
+          prop: "supplierName"
+        },
+        {
+          label: "渚涘簲鐗╁搧(鏈嶅姟)鍚嶇О",
+          prop: "supplierItemServiceName"
+        },
+        {
+          label: "鍦板潃",
+          prop: "adress"
+        },
+        {
+          label: "鑱旂郴鐢佃瘽",
+          prop: "phone"
+        },
+        {
+          fixed: "right",
+          dataType: "slot",
+          slot: "action",
+          label: "鎿嶄綔"
+        }
+      ],
+      tableData: [],
+      page: {
+        current: 1,
+        size: 20,
+        total: 0
+      },
+    }
+  },
+  mounted() {
+    this.getTableData()
+  },
+  watch: {
+    contentsId(newVal) {
+      if (newVal !== 0) {
+        this.getTableData();
+      }
+    },
+  },
+  methods: {
+    // 鑾峰彇琛ㄦ牸鏁版嵁
+    async getTableData() {
+      const { code, data } = await selectQualifiedSupplierManagementPage({
+        ...this.page,
+        parentId: this.contentsId
+      })
+      if (code == 200) {
+        this.tableData = data.records;
+        this.page.total = data.total;
+        this.page.current = data.current;
+        this.page.size = data.size;
+      }
+    },
+    showDialog(scope) {
+      this.$refs.editRef.openDialog(scope)
+    },
+    pagination({ page, limit }) {
+      this.page.current = page;
+      this.page.size = limit;
+      this.getTableData();
+    },
+    // 鍒犻櫎鏁版嵁
+    delRow(scope) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ枃浠�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(async () => {
+        const { code } = await delSupplierManagement(scope.row.supplierManagementId)
+        if (code == 200) {
+          this.$message.success('鍒犻櫎鎴愬姛')
+          this.getTableData()
+        } else {
+          this.$message.error('鍒犻櫎澶辫触')
+        }
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      })
+    },
+    async exportExcel() {
+      const res = await exportSupplierManagement(this.contentsId)
+      const blob = new Blob([res], { type: 'application/octet-stream' });
+      this.$download.saveAs(blob, '鍚堟牸渚涘簲鍟�.xlsx')
+    }
+  }
+}
+</script>
+
+<style scoped>
+.flex {
+  display: flex;
+}
+
+.action-box {
+  width: 100%;
+  padding-top: 10px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+
+.pagination {
+  padding-top: 15px;
+  padding-right: 10px;
+  display: flex;
+  justify-content: space-between
+}
+</style>
diff --git a/src/views/CNAS/externalService/supplierManage/index.vue b/src/views/CNAS/externalService/supplierManage/index.vue
new file mode 100644
index 0000000..b723092
--- /dev/null
+++ b/src/views/CNAS/externalService/supplierManage/index.vue
@@ -0,0 +1,149 @@
+<template>
+  <div class="purchase-page">
+    <div class="purchase-left">
+      <el-input v-model="form.nodeName" placeholder="璇疯緭鍏ヨ妭鐐瑰悕绉�" suffix-icon="el-icon-search" size="small" clearable
+        @keyup.enter.native="searchFilter(treeData)" @blur="searchFilter(treeData)" @clear="searchFilter(treeData)">
+      </el-input>
+      <el-tree ref="tree" highlight-current :data="treeData" :props="defaultProps" @node-click="handleNodeClick"
+        :default-expanded-keys="expandedKeys" node-key="id">
+      </el-tree>
+    </div>
+    <div class="purchase-right">
+      <el-tabs v-model="activeName" @tab-click="handleClick" style="height: 100%">
+        <el-tab-pane label="鎬昏" name="1" style="height: 100%">
+          <ConsumableOverview v-if="activeName == '1'" ref="consumableOverviewRef" :contentsId="contentsId"
+            style="height: 100%"></ConsumableOverview>
+        </el-tab-pane>
+        <el-tab-pane label="鍚堟牸渚涙柟鍚嶅綍" name="2">
+          <QualifiedSuppliers v-if="activeName == '2'" :contentsId="contentsId"></QualifiedSuppliers>
+        </el-tab-pane>
+        <el-tab-pane label="鐩綍缁存姢" name="3">
+          <Contents v-if="activeName == '3'" :id="contentsId" :treeData="treeData" @contentsUpdate="contentsUpdate"
+            from="渚涘簲鏍�"></Contents>
+        </el-tab-pane>
+      </el-tabs>
+    </div>
+  </div>
+</template>
+<script>
+import Contents from "./component/Contents.vue";
+import ConsumableOverview from "./component/ConsumableOverview.vue";
+import QualifiedSuppliers from "./component/QualifiedSuppliers.vue";
+import { suppliersDirectoryContentsListing } from "@/api/cnas/resourceDemand/externalService/supplierManage/supplierManage.js";
+export default {
+  components: {
+    ConsumableOverview,
+    QualifiedSuppliers,
+    Contents,
+  },
+  data() {
+    return {
+      contentsId: 0,
+      activeName: "1",
+      form: {
+        nodeName: "",
+      },
+      treeData: [],
+      expandedKeys: [],
+      defaultProps: {
+        children: "children",
+        label: "nodeName",
+      },
+    };
+  },
+  mounted() {
+    this.getTreeData();
+  },
+  methods: {
+    searchFilter() {
+      this.treeData = JSON.parse(JSON.stringify(this.treeData));
+      this.expandedKeys = [];
+      if (this.form.nodeName == "") {
+        return;
+      }
+      const findNodesWithFiber = (nodes) => {
+        nodes.forEach((node) => {
+          if (node.nodeName && node.nodeName.includes(this.form.nodeName)) {
+            this.expandedKeys.push(node.id);
+          }
+          if (node.children && node.children.length > 0) {
+            findNodesWithFiber(node.children);
+          }
+        });
+      };
+      findNodesWithFiber(this.treeData);
+    },
+    // 鐩綍缁存姢鏇存柊
+    contentsUpdate(val, flag = false) {
+      if (val) {
+        this.getTreeData();
+        this.expandedKeys = [];
+        if (flag) {
+          const findNodesWithFiber = (nodes) => {
+            nodes.forEach((item) => {
+              if (item.parentId == val) {
+                this.expandedKeys.push(item.id);
+              }
+              if (item.children && item.children.length > 0) {
+                findNodesWithFiber(item.children);
+              }
+            });
+          };
+          findNodesWithFiber(this.treeData);
+          this.expandedKeys = this.expandedKeys.filter((item) => item !== val);
+        } else {
+          this.expandedKeys.push(val);
+        }
+      } else {
+        this.getTreeData();
+      }
+    },
+    // 鏌ヨ鎵�鏈夌洰褰�
+    getTreeData() {
+      suppliersDirectoryContentsListing().then((res) => {
+        this.treeData = res.data;
+      });
+    },
+    // 鐐瑰嚮鏍戣妭鐐�
+    handleNodeClick(data) {
+      this.contentsId = data.id;
+      // this.$refs.consumableOverviewRef.getTableData(data.id)
+    },
+    handleClick(tab, event) { },
+  },
+};
+</script>
+
+<style scoped>
+.purchase-left {
+  width: 250px;
+  height: 100%;
+  background: #fff;
+  margin-right: 10px;
+  border-radius: 16px;
+  box-sizing: border-box;
+  padding: 10px 16px;
+  flex-shrink: 0;
+}
+
+.purchase-right {
+  background: #fff;
+  width: calc(100% - 15em);
+  height: 100%;
+  border-radius: 16px;
+  box-sizing: border-box;
+  padding: 10px 16px;
+}
+
+.purchase-page {
+  display: flex;
+  padding-top: 10px;
+  padding-bottom: 10px;
+  box-sizing: border-box;
+  width: 100%;
+}
+
+>>>.el-tabs__content {
+  height: calc(100% - 40px);
+}
+</style>
diff --git a/src/views/CNAS/process/complaint/index.vue b/src/views/CNAS/process/complaint/index.vue
index 5a998b3..e41a61d 100644
--- a/src/views/CNAS/process/complaint/index.vue
+++ b/src/views/CNAS/process/complaint/index.vue
@@ -456,7 +456,7 @@
     },
     // 鏌ョ湅鎶曡瘔
     handleLook(row) {
-      addProcessComplain({ id: row.id }).then((res) => {
+      getProcessComplain({ id: row.id }).then((res) => {
         this.currentInfo = res.data
         this.currentInfo0 = this.HaveJson(res.data)
         this.title = '鏌ョ湅鎶曡瘔'
diff --git a/src/views/CNAS/resourceDemand/standardMaterialAccept/component/AddRecord.vue b/src/views/CNAS/resourceDemand/standardMaterialAccept/component/AddRecord.vue
index dc48446..4a762ab 100644
--- a/src/views/CNAS/resourceDemand/standardMaterialAccept/component/AddRecord.vue
+++ b/src/views/CNAS/resourceDemand/standardMaterialAccept/component/AddRecord.vue
@@ -10,14 +10,8 @@
         <el-form-item label="鐩稿叧闄勪欢" prop="file">
           <div class="table-between">
             <el-input v-model="acceptance.file" style="width: 80%;" disabled></el-input>
-            <el-upload
-              ref="upload"
-              style="float: right;"
-              :headers="uploadHeader"
-              :action="action"
-              :show-file-list="false"
-              :on-success="onSuccess"
-            >
+            <el-upload ref="upload" style="float: right;" :headers="uploadHeader" :action="action"
+              :show-file-list="false" :on-success="onSuccess">
               <el-button type="primary">
                 闄勪欢涓婁紶
               </el-button>
@@ -46,28 +40,17 @@
         </el-form-item>
       </el-col>
       <el-col :span="12">
-        <el-form-item label="娓呭崟" prop="substanceId"
-                      :rule="[{ required: true, message: '璇烽�夋嫨娓呭崟', trigger: 'change' }]">
+        <el-form-item label="娓呭崟" prop="substanceId" :rule="[{ required: true, message: '璇烽�夋嫨娓呭崟', trigger: 'change' }]">
           <el-select v-model="acceptance.substanceId" placeholder="璇烽�夋嫨" style="width: 100%">
-            <el-option
-              v-for="item in options"
-              :key="item.value"
-              :label="item.name"
-              :value="item.id">
+            <el-option v-for="item in options" :key="item.value" :label="item.name" :value="item.id">
             </el-option>
           </el-select>
         </el-form-item>
       </el-col>
       <el-col :span="12">
         <el-form-item label="鍒拌揣鏃ユ湡" prop="arriveDate">
-          <el-date-picker
-            v-model="acceptance.arriveDate"
-            align="right"
-            type="date"
-            placeholder="閫夋嫨鏃ユ湡"
-            style="width: 100%"
-            value-format="yyyy-MM-dd"
-          >
+          <el-date-picker v-model="acceptance.arriveDate" align="right" type="date" placeholder="閫夋嫨鏃ユ湡"
+            style="width: 100%" value-format="yyyy-MM-dd">
           </el-date-picker>
         </el-form-item>
       </el-col>
@@ -169,7 +152,7 @@
   },
   methods: {
     openDialog(id) {
-      if(id) {
+      if (id) {
         this.getDetail(id)
       } else {
         this.clearForm()
@@ -178,7 +161,7 @@
     },
     getDetail(id) {
       this.loading = true
-      getAcceptanceDetails({id: id}).then(res => {
+      getAcceptanceDetails({ id: id }).then(res => {
         this.acceptance = res.data.acceptance
         this.list = res.data.list
         this.loading = false
@@ -224,8 +207,8 @@
       }
       this.acceptance.list = this.HaveJson(this.list)
       this.submitLoading = true
-      if(this.acceptance.id) {
-        updateAcceptance({acceptance: this.acceptance, list: this.list}).then(res => {
+      if (this.acceptance.id) {
+        updateAcceptance({ acceptance: this.acceptance, list: this.list }).then(res => {
           this.$message.success('缂栬緫鎴愬姛')
           this.submitLoading = false
           this.closeDialog()
@@ -234,7 +217,7 @@
           this.submitLoading = false
         })
       } else {
-        addAcceptance({acceptance: this.acceptance, list: this.list}).then(res => {
+        addAcceptance({ acceptance: this.acceptance, list: this.list }).then(res => {
           this.$message.success('鏂板鎴愬姛')
           this.closeDialog()
           this.$emit('submit')
diff --git a/src/views/CNAS/systemManagement/correctiveAction/components/correctiveInfo.vue b/src/views/CNAS/systemManagement/correctiveAction/components/correctiveInfo.vue
index 16d0d92..9243bb0 100644
--- a/src/views/CNAS/systemManagement/correctiveAction/components/correctiveInfo.vue
+++ b/src/views/CNAS/systemManagement/correctiveAction/components/correctiveInfo.vue
@@ -6,19 +6,6 @@
         <table border="1" cellspacing="10" class="tables">
           <tr>
             <td class="td-title">
-              <p>鍩硅璁″垝锛�</p>
-            </td>
-            <td class="td-info" colspan="3">
-              <el-select v-model="form.personTrainingDetailedId" clearable filterable style="width: 100%" disabled
-                placeholder="璇烽�夋嫨" size="small">
-                <el-option v-for="item in yearTrainingDetailed" :key="item.id" :label="item.trainingObjectives"
-                  :value="item.id">
-                </el-option>
-              </el-select>
-            </td>
-          </tr>
-          <tr>
-            <td class="td-title">
               <p>涓嶅悎鏍兼垨鍋忕浜嬪疄鐨勬弿杩帮細</p>
             </td>
             <td class="td-info" colspan="3">
@@ -154,7 +141,6 @@
 <script>
 import {
   getSuperviseDetailCorrect,
-  getThisYearTrainingDetailed,
 } from '@/api/cnas/systemManagement/correctiveAction.js'
 export default {
   name: 'correctiveInfo',
@@ -164,7 +150,6 @@
     // 杩欓噷瀛樻斁鏁版嵁
     return {
       formDia: false,
-      yearTrainingDetailed: [],
       form: {
         superviseDetailsId: '',
         raiseResult: '',
@@ -197,7 +182,6 @@
       this.formDia = true
       this.searchInfo(row)
       this.form.superviseDetailsId = row.superviseDetailsId
-      this.getYearTrainingDetailed() // 鑾峰彇鍩硅璁″垝
     },
     // 鏌ヨ鐩戞帶璁″垝璇︽儏瀹炴柦淇℃伅
     searchInfo(row) {
@@ -207,11 +191,6 @@
         this.form = res.data
       }).catch(err => {
         console.log('err---', err);
-      })
-    },
-    getYearTrainingDetailed() {
-      getThisYearTrainingDetailed().then(res => {
-        this.yearTrainingDetailed = res.data
       })
     },
     // 鍏抽棴寮规

--
Gitblit v1.9.3