From dbb368d910c38781d862dc394e13a7779183bd01 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 27 二月 2025 17:56:28 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev

---
 src/api/cnas/systemManagement/documentControl.js                                                    |    2 
 src/views/CNAS/externalService/serviceAndSupplyPro/component/Edit.vue                               |  252 ++++++
 src/views/CNAS/externalService/serviceAndSupplyPro/component/ConsumableList.vue                     |  240 ++++++
 src/views/CNAS/externalService/serviceAndSupplyPro/component/Store.vue                              |  468 ++++++++++++
 src/views/CNAS/process/sampleDisposal/index.vue                                                     |  238 +++---
 src/views/CNAS/systemManagement/measuresDealRisks/components/hazardIdentificationRiskAssessment.vue |    4 
 src/views/CNAS/externalService/serviceAndSupplyPro/component/AddProject.vue                         |   97 ++
 src/views/CNAS/systemManagement/documentControl/components/FileList.vue                             |   25 
 src/views/CNAS/systemManagement/documentControl/components/ControlledFileApplication.vue            |   29 
 src/views/CNAS/externalService/serviceAndSupplyPro/component/ConsumableProject.vue                  |  164 ++++
 src/utils/file.js                                                                                   |   69 +
 src/views/business/inspectionTask/index.vue                                                         |   12 
 src/api/cnas/externalService/serviceAndSupplyPro/serviceAndSupplyPro.js                             |  220 +++++
 src/components/UpPdfStamp/index.vue                                                                 |    4 
 src/views/CNAS/systemManagement/measuresDealRisks/components/listRiskAnalysisControlPlans.vue       |    2 
 src/views/CNAS/externalService/serviceAndSupplyPro/component/ConsumableOverview.vue                 |    1 
 package.json                                                                                        |    1 
 src/api/cnas/process/sampleDisposal.js                                                              |    9 
 src/views/CNAS/externalService/serviceAndSupplyPro/component/contents.vue                           |  312 ++++++++
 src/views/CNAS/externalService/serviceAndSupplyPro/index.vue                                        |   53 
 src/views/performance/class/index.vue                                                               |    2 
 src/views/CNAS/systemManagement/correctiveAction/index.vue                                          |    4 
 22 files changed, 1,998 insertions(+), 210 deletions(-)

diff --git a/package.json b/package.json
index a4ff793..2b89237 100644
--- a/package.json
+++ b/package.json
@@ -55,6 +55,7 @@
     "jspdf": "^3.0.0",
     "mammoth": "^1.9.0",
     "nprogress": "0.2.0",
+    "pako": "^2.1.0",
     "print-js": "^1.6.0",
     "quill": "2.0.2",
     "screenfull": "5.0.2",
diff --git a/src/api/cnas/externalService/serviceAndSupplyPro/serviceAndSupplyPro.js b/src/api/cnas/externalService/serviceAndSupplyPro/serviceAndSupplyPro.js
index 890fb4e..2a0d5ca 100644
--- a/src/api/cnas/externalService/serviceAndSupplyPro/serviceAndSupplyPro.js
+++ b/src/api/cnas/externalService/serviceAndSupplyPro/serviceAndSupplyPro.js
@@ -8,3 +8,223 @@
     params: query
   })
 }
+
+export function deleteProcurementSuppliesList(query) {
+  return request({
+    url: '/procurementSuppliesList/deleteProcurementSuppliesList',
+    method: 'delete',
+    params: query
+  })
+}
+
+export function exportProcurementSuppliesList(query) {
+  return request({
+    url: "/procurementSuppliesList/exportProcurementSuppliesList",
+    method: "get",
+    responseType: "blob",
+    params: query,
+  });
+}
+
+export function addProcurementSuppliesList(query) {
+  return request({
+    url: '/procurementSuppliesList/addProcurementSuppliesList',
+    method: 'post',
+    data: query,
+  })
+}
+
+export function selectEnumByCategory(query) {
+  return request({
+    url: '/enum/selectEnumByCategory',
+    method: 'post',
+    data: query,
+  })
+}
+
+export function updateProcurementSuppliesList(query) {
+  return request({
+    url: '/procurementSuppliesList/updateProcurementSuppliesList',
+    method: 'post',
+    data: query,
+  })
+}
+
+// 鏈嶅姟鍜屼緵搴斿搧閲囪喘
+export function selectSupplierManagementAll(query) {
+  return request({
+    url: '/supplierManagement/selectSupplierManagementAll',
+    method: 'get',
+    params: query
+  })
+}
+
+export function addProcurementSuppliesExpends(query) {
+  return request({
+    url: '/procurementSuppliesExpends/addProcurementSuppliesExpends',
+    method: 'post',
+    data: query,
+  })
+}
+
+export function deleteProcurementSuppliesExpends(query) {
+  return request({
+    url: '/procurementSuppliesExpends/deleteProcurementSuppliesExpends',
+    method: 'delete',
+    params: query
+  })
+}
+
+export function procurementSuppliesExpendlist(query) {
+  return request({
+    url: '/procurementSuppliesExpends/procurementSuppliesExpendlist/',
+    method: 'get',
+    params: query
+  })
+}
+
+export function exportProcurementSuppliesStoreExcel(query) {
+  return request({
+    url: '/procurementSuppliesStore/exportExcel',
+    method: "get",
+    responseType: "blob",
+    params: query,
+  })
+}
+
+// 鏂板鑺傜偣
+export function addSuppliersDirectoryContents(query) {
+  return request({
+    url: '/suppliersDirectoryContents/addSuppliersDirectoryContents',
+    method: 'post',
+    data: query,
+  })
+}
+
+// 缂栬緫鑺傜偣
+export function updateSuppliersDirectoryContents(query) {
+  return request({
+    url: '/suppliersDirectoryContents/updateSuppliersDirectoryContents',
+    method: 'post',
+    data: query,
+  })
+}
+
+// 鍒犻櫎鑺傜偣
+export function deleteSuppliersDirectoryContentsById(query) {
+  return request({
+    url: '/suppliersDirectoryContents/deleteSuppliersDirectoryContentsById',
+    method: 'delete',
+    params: query
+  })
+}
+
+// 閲囪喘鐗╄祫鐩綍鍒犻櫎
+export function deleteProcurementSuppliesContentById(query) {
+  return request({
+    url: '/procurementSuppliesContents/deleteProcurementSuppliesContentById',
+    method: 'delete',
+    params: query
+  })
+}
+
+// 鏌ヨ鎵�鏈夎妭鐐�
+export function getSuppliersDirectoryContentsNodeNames(query) {
+  return request({
+    url: '/suppliersDirectoryContents/getSuppliersDirectoryContentsNodeNames',
+    method: 'get',
+    params: query
+  })
+}
+
+// 閲囪喘鐗╄祫鐩綍鑾峰彇鑺傜偣鍚嶇О
+export function getProcurementSuppliesContentsNodeNames(query) {
+  return request({
+    url: '/procurementSuppliesContents/getNodeNames',
+    method: 'get',
+    params: query
+  })
+}
+
+//鑾峰彇鐢ㄦ埛鍒楄〃
+export function selectUserCondition(query) {
+  return request({
+    url: "/system/newUser/selectUserCondition",
+    method: "get",
+    params: query,
+  });
+}
+
+// 閲囪喘鐗╄祫鐩綍璇︽儏
+export function selectProcurementSuppliesContentById(query) {
+  return request({
+    url: "/procurementSuppliesContents/selectProcurementSuppliesContentById",
+    method: "get",
+    params: query,
+  });
+}
+
+// 閲囪喘鐗╄祫鐩綍鍒楄〃
+export function directoryListing(query) {
+  return request({
+    url: "/procurementSuppliesContents/directoryListing",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鑰楁潗鍏ュ簱淇敼
+export function updateStore(query) {
+  return request({
+    url: '/procurementSuppliesStore/updateStore',
+    method: 'post',
+    data: query,
+  })
+}
+
+// 鑰楁潗鍏ュ簱鏂板
+export function addStore(query) {
+  return request({
+    url: '/procurementSuppliesStore/addStore',
+    method: 'post',
+    data: query,
+  })
+}
+
+// 鏍规嵁id鏌ヨ鑰楁潗鍏ュ簱
+export function selectStoreById(query) {
+  return request({
+    url: "/procurementSuppliesStore/selectStoreById",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鑰楁潗鍏ュ簱鍒楄〃
+export function storeList(query) {
+  return request({
+    url: "/procurementSuppliesStore/storeList",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鑰楁潗鍏ュ簱鍒犻櫎
+export function deleteStore(query) {
+  return request({
+    url: '/procurementSuppliesStore/deleteStore',
+    method: 'delete',
+    params: query
+  })
+}
+
+// 閲囪喘鐗╄祫鐩綍鏂板
+export function addProcurementSuppliesContents(query) {
+  return request({
+    url: '/procurementSuppliesContents/addProcurementSuppliesContents',
+    method: 'post',
+    data: query,
+  })
+}
+
+
diff --git a/src/api/cnas/process/sampleDisposal.js b/src/api/cnas/process/sampleDisposal.js
index 9eef314..a763edd 100644
--- a/src/api/cnas/process/sampleDisposal.js
+++ b/src/api/cnas/process/sampleDisposal.js
@@ -63,3 +63,12 @@
     params: query,
   });
 }
+
+//鏌ョ湅鍘嗗彶
+export function pageProcessTotaldeal(query) {
+  return request({
+    url: "/processTotaldeal/pageProcessTotaldeal",
+    method: "get",
+    params: query,
+  });
+}
diff --git a/src/api/cnas/systemManagement/documentControl.js b/src/api/cnas/systemManagement/documentControl.js
index 3fc97b7..9a322b4 100644
--- a/src/api/cnas/systemManagement/documentControl.js
+++ b/src/api/cnas/systemManagement/documentControl.js
@@ -120,7 +120,7 @@
   return request({
     url: "/manageDocumentIssueRecycle/addManageDocumentIssueRecycle",
     method: "post",
-    responseType: "blob",
+    headers: { "Content-Type": "application/x-www-form-urlencoded" },
     data: data,
   });
 }
diff --git a/src/components/UpPdfStamp/index.vue b/src/components/UpPdfStamp/index.vue
index e348eab..9b8fe8c 100644
--- a/src/components/UpPdfStamp/index.vue
+++ b/src/components/UpPdfStamp/index.vue
@@ -12,6 +12,7 @@
 
 <script>
 import jsPDF from "jspdf";
+import file from '@/utils/file.js'
 export default {
   props: ['isUpFile'],
   data() {
@@ -142,8 +143,7 @@
       }
       const pdf = new jsPDF("p", "mm", "a4");
       for (let i = 0; i < this.contextList.length; i++) {
-        console.log(2222, this.contextList.length, this.$refs.pdfCanvas[i])
-        const imgData = this.$refs.pdfCanvas[i].toDataURL('image/jpeg', 1.0);
+        const imgData = this.$refs.pdfCanvas[i].toDataURL('image/jpeg', 0.7);
         const pdfWidth = pdf.internal.pageSize.getWidth();
         const pdfHeight = (this.$refs.pdfCanvas[i].height * pdfWidth) / this.$refs.pdfCanvas[i].width;
         pdf.addImage(imgData, "JPEG", 0, 0, pdfWidth, pdfHeight); // 灏嗗浘鐗囨坊鍔犲埌 PDF
diff --git a/src/utils/file.js b/src/utils/file.js
index c3a3e7b..9c7e99e 100644
--- a/src/utils/file.js
+++ b/src/utils/file.js
@@ -1,48 +1,55 @@
-import { convertToHtml } from 'mammoth';
-import Vue from 'vue'
+import { convertToHtml } from "mammoth";
+import pako from "pako";
+import Vue from "vue";
 
 export default {
   async convertFileToHtml(url) {
     var xhr = new XMLHttpRequest();
-    xhr.open('GET', Vue.prototype.javaApi+url, true);//鑾峰彇鏂囦欢娴佺殑鎺ュ彛
+    xhr.open("GET", Vue.prototype.javaApi + url, true); //鑾峰彇鏂囦欢娴佺殑鎺ュ彛
     xhr.send();
-    xhr.responseType = "blob";//涓嶈兘婕�
+    xhr.responseType = "blob"; //涓嶈兘婕�
     let xhrPromise = new Promise((resolve, reject) => {
       xhr.onload = async function () {
         if (this.status === 200) {
           // 杩斿洖鐨勬枃浠舵祦锛岃浆鎹㈡垚blob瀵硅薄
-          var blob = new Blob([this.response],{ type:'application/vnd.openxmlformats-officedocument.wordprocessingml.document' });
+          var blob = new Blob([this.response], {
+            type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
+          });
           // 浣跨敤mammoth灏哤ord杞崲涓篐TML
           let reader = new FileReader();
           reader.readAsArrayBuffer(blob);
           let htmlContentPromise = new Promise((resolve, reject) => {
             reader.onload = async function () {
               var arrayBuffer = xhr.response; //arrayBuffer
-              const result = await convertToHtml({ arrayBuffer: arrayBuffer })
-              let html = result.value.replace(/飪�/g, '')
-              .replace('<h1>', '<h1 style="text-align: center;">')
-              .replace(/<table>/g, '<table style="border-collapse: collapse;border: 1px solid #000;">')
-              .replace(/<tr>/g, '<tr style="height: 30px;">')
-              .replace(/<td>/g, '<td style="border: 1px solid #000;">')
-              .replace(/<p>/g, '<p style="text-indent: 2em;">')
-              .replace(/<a [^>]*>/g, "")
-              .replace(/<\/a>/g, "")
+              const result = await convertToHtml({ arrayBuffer: arrayBuffer });
+              let html = result.value
+                .replace(/飪�/g, "")
+                .replace("<h1>", '<h1 style="text-align: center;">')
+                .replace(
+                  /<table>/g,
+                  '<table style="border-collapse: collapse;border: 1px solid #000;">'
+                )
+                .replace(/<tr>/g, '<tr style="height: 30px;">')
+                .replace(/<td>/g, '<td style="border: 1px solid #000;">')
+                .replace(/<p>/g, '<p style="text-indent: 2em;">')
+                .replace(/<a [^>]*>/g, "")
+                .replace(/<\/a>/g, "");
               // .replace(/em/g, "cm");
-              resolve(html)
+              resolve(html);
             };
-          })
-          resolve(await htmlContentPromise)
+          });
+          resolve(await htmlContentPromise);
         }
-
-      }
-    })
-    return await xhrPromise
+      };
+    });
+    return await xhrPromise;
   },
-  downloadIamge(imgsrc, name) {//涓嬭浇鍥剧墖鍦板潃鍜屽浘鐗囧悕
+  downloadIamge(imgsrc, name) {
+    //涓嬭浇鍥剧墖鍦板潃鍜屽浘鐗囧悕
     var image = new Image();
     // 瑙e喅璺ㄥ煙 Canvas 姹℃煋闂
     image.setAttribute("crossOrigin", "anonymous");
-    image.onload = function() {
+    image.onload = function () {
       var canvas = document.createElement("canvas");
       canvas.width = image.width;
       canvas.height = image.height;
@@ -57,5 +64,19 @@
       a.dispatchEvent(event); // 瑙﹀彂a鐨勫崟鍑讳簨浠�
     };
     image.src = imgsrc;
-  }
+  },
+  // 鍘嬬缉blob
+  compressBlob(blob) {
+    const reader = new FileReader();
+    reader.readAsArrayBuffer(blob);
+    return new Promise((resolve) => {
+      reader.onload = () => {
+        const arrayBuffer = reader.result;
+        const uint8Array = new Uint8Array(arrayBuffer);
+        const compressedData = pako.deflate(uint8Array);
+        const compressedBlob = new Blob([compressedData], { type: blob.type });
+        resolve(compressedBlob);
+      };
+    });
+  },
 };
diff --git a/src/views/CNAS/externalService/serviceAndSupplyPro/component/AddProject.vue b/src/views/CNAS/externalService/serviceAndSupplyPro/component/AddProject.vue
new file mode 100644
index 0000000..326d5f4
--- /dev/null
+++ b/src/views/CNAS/externalService/serviceAndSupplyPro/component/AddProject.vue
@@ -0,0 +1,97 @@
+<template>
+  <el-dialog
+    :title="dialogTitle"
+    width="60%"
+    :visible.sync="dialogVisible"
+  >
+    <el-form :model="model" label-width="100px">
+      <el-col :span="12">
+        <el-form-item label="椤圭洰鍚嶇О">
+          <el-select
+            v-model="model.name"
+            placeholder="璇烽�夋嫨椤圭洰鍚嶇О"
+            style="width: 100%"
+            :disabled="row ? true:false"
+            @change="handleSelect"
+          >
+            <el-option
+              v-for="(v, i) in consumableOptions"
+              :label="v.consumablesName"
+              :value="v"
+              :key="i"
+            />
+          </el-select>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="娑堣�楁暟閲�">
+          <el-input-number v-model="model.amount" :min="0" :step="1" placeholder="璇疯緭鍏ユ秷鑰楁暟閲�"></el-input-number>
+        </el-form-item>
+      </el-col>
+    </el-form>
+    <span slot="footer" class="dialog-footer">
+            <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
+            <el-button type="primary" @click="sumbit">纭� 瀹�</el-button>
+        </span>
+  </el-dialog>
+</template>
+
+<script>
+
+import {
+  addProcurementSuppliesExpends,
+  procurementSuppliesList
+} from "@/api/cnas/externalService/serviceAndSupplyPro/serviceAndSupplyPro";
+
+export default {
+  data() {
+    return {
+      dialogTitle: "",
+      dialogVisible: false,
+      model: {
+        listId: undefined,
+        name: ""
+      },
+      consumableOptions: [],
+      row: undefined
+    }
+  },
+  created() {
+    this.fetchConsumableOptions()
+  },
+  methods: {
+    fetchConsumableOptions() {
+      procurementSuppliesList().then(res => {
+        if (res.code === 200) {
+          this.consumableOptions = res.data.records
+        }
+      })
+    },
+    openDialog(row) {
+      if(row) {
+        console.log(row, 'true')
+        this.dialogTitle = `${row.consumablesName}娣诲姞娑堣�楅」`
+        this.row = row
+        this.model.listId = row.id
+        this.model.name = row.consumablesName
+      } else {
+        this.dialogTitle = '娣诲姞娑堣�楅」'
+      }
+      this.dialogVisible = true
+    },
+    handleSelect(item) {
+      console.log(item)
+      this.model.listId = item.id
+      this.model.name = item.consumablesName
+    },
+    sumbit() {
+      addProcurementSuppliesExpends(this.model).then(res => {
+        if (res.code === 200) {
+          this.dialogVisible = false
+          this.$emit('submit')
+        }
+      })
+    }
+    }
+  }
+</script>
diff --git a/src/views/CNAS/externalService/serviceAndSupplyPro/component/ConsumableList.vue b/src/views/CNAS/externalService/serviceAndSupplyPro/component/ConsumableList.vue
new file mode 100644
index 0000000..189ccd3
--- /dev/null
+++ b/src/views/CNAS/externalService/serviceAndSupplyPro/component/ConsumableList.vue
@@ -0,0 +1,240 @@
+<template>
+  <div>
+    <TableCard :showTitle="false">
+      <template slot="form">
+        <div class="action-box">
+          <div></div>
+          <div class="flex">
+            <el-button icon="el-icon-plus" size="small" type="primary" @click="showDialog(undefined)">
+              鏂板缓
+            </el-button>
+            <el-button icon="el-icon-upload2" size="small" @click="exportExcel">
+              瀵煎嚭Excel
+            </el-button>
+          </div>
+        </div>
+      </template>
+      <template v-slot:table>
+        <limsTable
+          :column="columns"
+          :currentChange="rowClick"
+          :height="'25vh'"
+          :highlightCurrentRow="true"
+          :isSelection="false"
+          :rowStyle="tableRowStyle"
+          :table-data="tableData"
+          rowKey="id"
+          style="margin-top: 18px; padding: 0 15px;"
+        >
+          <template v-slot:consumablesTypeSlot="{row}">
+            {{ findType(row.consumablesType) }}
+          </template>
+          <template v-slot:operation="scope">
+            <el-button size="small" type="text" @click="showDialog(scope.row)">缂栬緫</el-button>
+            <el-button size="small" style="color: #f56c6c" type="text" @click="handleDelete(scope.row)">鍒犻櫎</el-button>
+          </template>
+        </limsTable>
+        <div class="pagination">
+          <div></div>
+          <el-pagination
+            :page-size="pagination.pageSize"
+            :page-sizes="[10, 20, 30, 40]"
+            :total="pagination.total"
+            layout="total, sizes, prev, pager, next, jumper"
+            @current-change="handleCurrent"
+            @size-change="handleSize"
+          >
+          </el-pagination>
+        </div>
+      </template>
+    </TableCard>
+    <el-divider></el-divider>
+    <div>
+      <ConsumableProject ref="consumableProject"></ConsumableProject>
+    </div>
+    <Edit ref="editRef" :contentsId="contentsId" @submit="fetchData"/>
+  </div>
+</template>
+
+<script>
+import TableCard from './index.vue';
+import Edit from "./Edit.vue"
+import limsTable from '@/components/Table/lims-table.vue'
+import {
+  deleteProcurementSuppliesList,
+  procurementSuppliesList,
+  exportProcurementSuppliesList
+} from "@/api/cnas/externalService/serviceAndSupplyPro/serviceAndSupplyPro";
+import ConsumableProject from "./ConsumableProject.vue"
+
+export default {
+  dicts: ["consumables_type"],
+  components: {
+    TableCard, limsTable,Edit, ConsumableProject
+  },
+  props: {
+    contentsId: {
+      type: Number,
+      required: true,
+    }
+  },
+  watch: {
+    contentsId(newVal, oldVal) {
+      if (newVal !== 0) {
+        this.fetchData()
+      }
+    }
+  },
+  data() {
+    return {
+      columns: [
+        {
+          label: "璐у彿",
+          prop: "itemNumber"
+        },
+        {
+          label: "绫诲埆",
+          prop: "consumablesType",
+          dataType: "slot",
+          slot: "consumablesTypeSlot"
+        },
+        {
+          label: "鍚嶇О",
+          prop: "consumablesName"
+        },
+        {
+          label: "瑙勬牸",
+          prop: "specifications"
+        },
+        {
+          label: "鍙傝�冧緵搴斿晢",
+          prop: "supplierName"
+        },
+        {
+          label: "搴撳瓨涓嬮檺",
+          prop: "lowerLimit"
+        },
+        {
+          label: "褰撳墠搴撳瓨",
+          prop: "currentAmount"
+        },
+        {
+          label: "璁¢噺鍗曚綅",
+          prop: "unit"
+        },
+        {
+          label: "澶囨敞",
+          prop: "remark"
+        },
+        {
+          label: "璐熻矗浜�",
+          prop: "personInChargeName"
+        },
+        {
+          label: "鏈�杩戞洿鏂颁汉",
+          prop: "updateUserName"
+        },
+        {
+          label: "鏈�杩戞洿鏂版棩鏈�",
+          prop: "updateTime"
+        },
+        {
+          fixed: 'right',
+          label: "鎿嶄綔",
+          width: 120,
+          dataType: "slot",
+          slot: "operation"
+        }
+      ],
+      tableData: [],
+      pagination: {
+        current: 1,
+        pageSize: 20,
+        total: 0
+      },
+      options: [],
+    }
+  },
+  mounted() {
+    this.fetchData()
+    this.options = this.dict.type.consumables_type;
+  },
+  methods: {
+    async fetchData() {
+      procurementSuppliesList({ contentId: this.contentsId}).then(res => {
+        if (res.code === 200) {
+          this.tableData = res.data.records
+          if (this.tableData.length > 0) {
+            this.rowClick(this.tableData[0])
+          }
+        }
+      })
+    },
+    findType(val) {
+      this.$nextTick()
+      let res
+      const e = this.options.find(item => item.value == val)
+      if(e) {
+        res = e.label
+      } else {
+        res = '-'
+      }
+      return res
+    },
+    showDialog(row) {
+      this.$refs.editRef.openDialog(row);
+    },
+    async exportExcel() {
+      exportProcurementSuppliesList({parentId:this.contentsId}).then(res => {
+        const blob = new Blob([res], {type: 'application/octet-stream'});
+        this.$download.saveAs(blob, '鑰楁潗鍒楄〃.xlsx')
+        this.$message.success('瀵煎嚭鎴愬姛')
+      })
+    },
+    handleCurrent() {
+    },
+    handleSize() {
+    },
+    handleDelete(row) {
+      deleteProcurementSuppliesList({ id:row.id }).then(res => {
+        if (res.code === 200) {
+          this.$message.success('鍒犻櫎鎴愬姛')
+          this.fetchData()
+        }
+      })
+    },
+    rowClick(row) {
+      this.$refs.consumableProject.fetchListId(row)
+    },
+    tableRowStyle({row}) {
+      if(row.currentAmount <= row.lowerLimit) {
+        return { background: '#ffcaca' }
+      } else {
+        return {}
+      }
+    }
+  }
+}
+</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/serviceAndSupplyPro/component/ConsumableOverview.vue b/src/views/CNAS/externalService/serviceAndSupplyPro/component/ConsumableOverview.vue
index 6c465f3..6ac65b9 100644
--- a/src/views/CNAS/externalService/serviceAndSupplyPro/component/ConsumableOverview.vue
+++ b/src/views/CNAS/externalService/serviceAndSupplyPro/component/ConsumableOverview.vue
@@ -29,7 +29,6 @@
 import TableCard from './index.vue';
 import { procurementSuppliesList } from "@/api/cnas/externalService/serviceAndSupplyPro/serviceAndSupplyPro"
 import limsTable from '@/components/Table/lims-table.vue'
-import axios from "axios";
 
 export default {
     components: { CardPanel, TableCard, limsTable },
diff --git a/src/views/CNAS/externalService/serviceAndSupplyPro/component/ConsumableProject.vue b/src/views/CNAS/externalService/serviceAndSupplyPro/component/ConsumableProject.vue
new file mode 100644
index 0000000..1f2ed15
--- /dev/null
+++ b/src/views/CNAS/externalService/serviceAndSupplyPro/component/ConsumableProject.vue
@@ -0,0 +1,164 @@
+<template>
+  <div>
+    <TableCard :showTitle="false">
+      <template slot="form">
+        <div class="action-box">
+          <div></div>
+          <div class="flex">
+            <el-button icon="el-icon-plus" size="small" type="primary" @click="showDialog">
+              娣诲姞椤圭洰
+            </el-button>
+            <el-button icon="el-icon-upload2" size="small" @click="exportExcel">
+              瀵煎嚭
+            </el-button>
+          </div>
+        </div>
+      </template>
+      <template v-slot:table>
+        <limsTable
+          :column="columns"
+          :height="'25vh'"
+          :isSelection="true"
+          :table-data="tableData"
+          style="margin-top: 18px; padding: 0 15px;"
+        >
+          <template v-slot:operation="scope">
+            <el-button size="small" type="text" @click="deleteData(scope.row)">鍒犻櫎</el-button>
+          </template>
+        </limsTable>
+        <div class="pagination">
+          <div></div>
+          <el-pagination
+            :page-size="pagination.pageSize"
+            :page-sizes="[10, 20, 30, 40]"
+            :total="pagination.total"
+            layout="total, sizes, prev, pager, next, jumper"
+            @current-change="handleCurrent"
+            @size-change="handleSize"
+          >
+          </el-pagination>
+        </div>
+      </template>
+    </TableCard>
+    <AddProject ref="AddProjectRef" @submit="fetchData"/>
+  </div>
+</template>
+
+<script>
+import TableCard from './index.vue';
+import limsTable from '@/components/Table/lims-table.vue'
+import Edit from "./Edit.vue"
+import AddProject from './AddProject.vue';
+import {
+  deleteProcurementSuppliesExpends,
+  procurementSuppliesExpendlist
+} from "@/api/cnas/externalService/serviceAndSupplyPro/serviceAndSupplyPro";
+
+export default {
+  components: {
+    TableCard, limsTable, Edit, AddProject
+  },
+  data() {
+    return {
+      columns: [
+        // {
+        //   label: "缂栧彿"
+        // },
+        {
+          label: "椤圭洰鍚嶇О",
+          prop: "listName"
+        },
+        {
+          label: "娑堣�楁暟閲�",
+          prop: "amount"
+        },
+        {
+          label: "褰曞叆浜�",
+          prop: "enterUserName"
+        },
+        {
+          label: "鏈�杩戞洿鏂颁汉",
+          prop: "updateUserName"
+        },
+        {
+          label: "鏈�杩戞洿鏂版棩鏈�",
+          prop: "updateTime"
+        },
+        {
+          label: "鎿嶄綔",
+          dataType: "slot",
+          slot: "operation"
+        }
+      ],
+      tableData: [],
+      pagination: {
+        current: 1,
+        pageSize: 20,
+        total: 0
+      },
+      listId: 0,
+      row: undefined
+    }
+  },
+  mounted() {
+    this.fetchData()
+  },
+  methods: {
+    fetchListId(row) {
+      if(row) {
+        this.listId = row.id
+        this.row = row
+      }
+      this.fetchData()
+    },
+    async fetchData() {
+      if (this.listId === 0) return
+      procurementSuppliesExpendlist({
+        procurementSuppliesListId:this.listId
+      }).then(res => {
+        if (res.code === 200) {
+          this.tableData = res.data
+        }
+      })
+    },
+    showDialog() {
+      this.$refs.AddProjectRef.openDialog(this.row);
+    },
+    deleteData(row) {
+      deleteProcurementSuppliesExpends({ expendId:row.expendId}).then(res => {
+        if (res.code === 200) {
+          this.$message.success('鍒犻櫎鎴愬姛')
+          this.fetchData()
+        }
+      })
+    },
+    handleCurrent() {
+    },
+    handleSize() {
+    },
+    exportExcel() {
+    }
+  }
+}
+</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/serviceAndSupplyPro/component/Edit.vue b/src/views/CNAS/externalService/serviceAndSupplyPro/component/Edit.vue
new file mode 100644
index 0000000..5e7f431
--- /dev/null
+++ b/src/views/CNAS/externalService/serviceAndSupplyPro/component/Edit.vue
@@ -0,0 +1,252 @@
+<template>
+  <el-dialog
+    :visible.sync="dialogVisible"
+    title="娣诲姞鑰楁潗椤圭洰淇℃伅"
+    width="70%"
+  >
+    <el-form ref="modelForm" :model="model" :rules="rules" label-width="100px">
+      <el-col :span="12">
+        <el-form-item label="鑰楁潗绫诲瀷" prop="consumablesType">
+          <el-select v-model="model.consumablesType" placeholder="璇烽�夋嫨鑰楁潗绫诲瀷" size="small" style="width: 100%">
+            <el-option v-for="(v, i) in dict.type.consumables_type" :key="i" :label="v.label" :value="v.value"></el-option>
+          </el-select>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="璐у彿">
+          <el-input v-model="model.itemNumber" placeholder="璇疯緭鍏ヨ揣鍙�" size="small"></el-input>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="鑰楁潗鍚嶇О">
+          <el-input v-model="model.consumablesName" placeholder="璇疯緭鍏ヨ�楁潗鍚嶇О" size="small"></el-input>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="瑙勬牸">
+          <el-input v-model="model.specifications" placeholder="璇疯緭鍏ヨ鏍�" size="small"></el-input>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="璁¢噺鍗曚綅">
+          <el-input v-model="model.unit" placeholder="璇疯緭鍏ヨ閲忓崟浣�" size="small"></el-input>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="鍙傝�冧环鏍�">
+          <el-input-number v-model="model.referencePrice" :min="0" :precision="2" :step="0.01" placeholder="璇疯緭鍏ュ弬鑰冧环鏍�"
+                           size="small"></el-input-number>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="瀛樻斁浣嶇疆">
+          <el-select v-model="model.contentId" placeholder="璇烽�夋嫨瀛樻斁浣嶇疆" size="small" style="width: 100%">
+            <el-option v-for="(v, i) in procurementSuppliesContentOptions" :key="i" :label="v.nodeName"
+                       :value="v.id"></el-option>
+          </el-select>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="璐熻矗浜�">
+          <el-select v-model="model.personInCharge" placeholder="璇烽�夋嫨璐熻矗浜�" size="small" style="width: 100%">
+            <el-option v-for="(v, i) in userOptions" :key="i" :label="v.name" :value="v.id"></el-option>
+          </el-select>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="搴撳瓨涓婇檺">
+          <el-input-number v-model="model.upperLimit" :min="0" :step="1" placeholder="璇疯緭鍏ュ簱瀛樹笂闄�" size="small"></el-input-number>
+        </el-form-item>
+      </el-col>
+      <el-col :span="12">
+        <el-form-item label="搴撳瓨涓嬮檺">
+          <el-input-number v-model="model.lowerLimit" :min="0" :step="1" placeholder="璇疯緭鍏ュ簱瀛樹笅闄�" size="small"></el-input-number>
+        </el-form-item>
+      </el-col>
+      <el-col :span="24">
+        <el-form-item label="渚涘簲鍟�">
+          <el-select v-model="model.supplier" placeholder="璇烽�夋嫨渚涘簲鍟�" size="small" style="width: 100%">
+            <el-option v-for="(v, i) in supplierOptions" :key="i" :label="v.supplierName"
+                       :value="v.supplierManagementId"></el-option>
+          </el-select>
+        </el-form-item>
+      </el-col>
+      <el-col :span="24">
+        <el-form-item label="鑰楁潗鍥炬爣">
+          <div class="rows">
+            <el-input v-model="model.consumablesIcon" placeholder="璇疯緭鍏ヨ�楁潗鍥炬爣" size="small" style="width: 90%;"/>
+            <el-upload
+              ref="upload"
+              :action="action"
+              :headers="uploadHeader"
+              :on-success="onSuccessIcon"
+              :show-file-list="false"
+              style="float: left; margin: 0 12px 0 20px;"
+            >
+              <el-button slot="trigger" class="uploadFile" size="small" type="primary">娴忚</el-button>
+            </el-upload>
+          </div>
+        </el-form-item>
+      </el-col>
+      <el-col :span="24">
+        <el-form-item label="鑰楁潗闄勪欢">
+          <div class="rows">
+            <el-input v-model="model.attachment" placeholder="璇疯緭鍏ヨ�楁潗闄勪欢" size="small" style="width: 90%;"/>
+            <el-upload
+              ref="upload"
+              :action="action"
+              :on-success="onSuccessFile"
+              :show-file-list="false"
+              :headers="uploadHeader"
+              style="float: left; margin: 0 12px 0 20px;"
+            >
+              <el-button slot="trigger" class="uploadFile" size="small" type="primary">娴忚</el-button>
+            </el-upload>
+          </div>
+        </el-form-item>
+      </el-col>
+      <el-col :span="24">
+        <el-form-item label="澶囨敞">
+          <el-input
+            v-model="model.remark"
+            :rows="2"
+            placeholder="璇疯緭鍏ュ娉�"
+            size="small"
+            type="textarea"
+          >
+          </el-input>
+        </el-form-item>
+      </el-col>
+    </el-form>
+    <span slot="footer" class="dialog-footer">
+            <el-button @click="resetForm">鍙� 娑�</el-button>
+            <el-button type="primary" @click="submit">淇� 瀛�</el-button>
+        </span>
+  </el-dialog>
+</template>
+
+<script>
+import {
+  addProcurementSuppliesList,
+  updateProcurementSuppliesList,
+  selectSupplierManagementAll,
+  getProcurementSuppliesContentsNodeNames,
+  selectUserCondition
+} from '@/api/cnas/externalService/serviceAndSupplyPro/serviceAndSupplyPro'
+export default {
+  data() {
+    return {
+      dialogVisible: false,
+      model: {
+        consumablesType: undefined,
+        consumablesIcon: undefined,
+        attachment: undefined,
+      },
+      procurementSuppliesContentOptions: [],
+      userOptions: [],
+      supplierOptions: [],
+      rules: {
+        consumablesType: [{ required: true, message: '璇烽�夋嫨鑰楁潗绫诲瀷', trigger: 'blur' }],
+      },
+    }
+  },
+  dicts: ["consumables_type"],
+  props: {
+    contentsId: {
+      type: Number,
+      required: true,
+    }
+  },
+  computed: {
+    action() {
+      return this.javaApi + '/personBasicInfo/saveCNASFile'
+    }
+  },
+  mounted() {
+    this.findProcurementSuppliesContentOptions()
+    this.findUserOptions()
+    this.findSupplierOptions()
+  },
+  methods: {
+    // 閲嶇疆琛ㄥ崟
+    resetForm() {
+      this.$refs.modelForm.resetFields();
+      this.dialogVisible = false
+    },
+    openDialog(row) {
+      if (row) {
+        console.log("row", row)
+        this.model = row
+      } else {
+        this.model = {}
+      }
+      this.dialogVisible = true
+    },
+    findProcurementSuppliesContentOptions() {
+      getProcurementSuppliesContentsNodeNames().then(res => {
+        if (res.code === 200) {
+          this.procurementSuppliesContentOptions = res.data
+        }
+      })
+    },
+    findUserOptions() {
+      selectUserCondition().then(res => {
+        if (res.code === 200) {
+          this.userOptions = res.data
+        }
+      })
+    },
+    findSupplierOptions() {
+      selectSupplierManagementAll().then(res => {
+        if (res.code === 200) {
+          this.supplierOptions = res.data
+        }
+      })
+    },
+    async onSuccessIcon(response) {
+      this.$set(this.model, "consumablesIcon", response.data)
+    },
+    async onSuccessFile(response) {
+      this.$set(this.model, "attachment", response.data)
+    },
+    submit() {
+      this.$refs.modelForm.validate((valid) => {
+        if (valid) {
+          if (this.model.id) {
+            updateProcurementSuppliesList(this.model).then(res => {
+              if (res.code === 200) {
+                this.dialogVisible = false
+              }
+            })
+          } else {
+            addProcurementSuppliesList(this.model).then(res => {
+              if (res.code === 200) {
+                this.dialogVisible = false
+                this.$emit('submit')
+              }
+            })
+          }
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+>>>.el-dialog {
+  margin: 6vh auto 50px !important;
+}
+>>> .el-dialog__body {
+  max-height: 42em;
+  overflow-y: auto;
+}
+.rows {
+  width: 100%;
+  display: flex;
+  justify-content: space-between;
+}
+>>>.el-form-item__content {
+  line-height: 39px;
+}
+</style>
diff --git a/src/views/CNAS/externalService/serviceAndSupplyPro/component/Store.vue b/src/views/CNAS/externalService/serviceAndSupplyPro/component/Store.vue
new file mode 100644
index 0000000..1951036
--- /dev/null
+++ b/src/views/CNAS/externalService/serviceAndSupplyPro/component/Store.vue
@@ -0,0 +1,468 @@
+<template>
+  <div>
+    <div style="
+        display: flex;
+        justify-content: flex-end;
+        margin-right: 20px;
+        margin-bottom: 20px;
+      ">
+      <el-button icon="el-icon-plus" size="small" type="primary" @click="addOrUpdateStore('add')">娣诲姞
+      </el-button>
+      <el-button icon="el-icon-download" size="small" @click="importExcel">
+        瀵煎嚭excel
+      </el-button>
+    </div>
+    <div class="table">
+      <limsTable
+        :column="tableColumn"
+        :height="'calc(100vh - 20em)'"
+        :table-data="storageTableData"
+        :table-loading="tableLoading"
+        style="padding: 0 10px;margin-bottom: 16px"
+        :page="page"
+        @pagination="pagination">
+      </limsTable>
+    </div>
+
+    <!-- 缂栬緫-鏂板寮规 -->
+    <el-dialog :before-close="handleClose" :close-on-click-modal="false"
+               :close-on-press-escape="false" :title="title"
+               :visible.sync="dialogVisible" width="70%">
+      <!-- 鍏ュ簱鍗� -->
+      <div>
+        <div style="display: flex; align-items: center">
+          <span style="margin-left: 10px">鍏ュ簱鍗�</span>
+        </div>
+        <el-form ref="formModel" :model="form" label-width="auto">
+          <el-col :span="12">
+            <el-form-item label="鍏ュ簱鍗曞彿">
+              <el-input v-model="form.oddNumbers" placeholder="璇疯緭鍏ュ叆搴撳崟鍙�" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍏ュ簱搴撳瓨">
+              <el-input v-model="form.inventory" placeholder="璇疯緭鍏ュ叆搴撳簱瀛�" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍏ュ簱鎬婚噾棰�">
+              <el-input v-model="form.totalAmount" placeholder="璇疯緭鍏ュ叆搴撴�婚噾棰�" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍏ュ簱鏃ユ湡">
+              <el-date-picker v-model="form.storageTime" format="yyyy-MM-dd"
+                              placeholder="閫夋嫨鏃ユ湡"
+                              size="small"
+                              style="width: 100%" type="date" value-format="yyyy-MM-dd"></el-date-picker>
+            </el-form-item>
+          </el-col>
+            <el-col :span="12">
+              <el-form-item label="鍏ュ簱浜�">
+                <el-select v-model="form.storageUser" size="small" style="width: 100%">
+                  <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id"></el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍏ュ簱璇存槑">
+              <el-input v-model="form.remark" :rows="2" placeholder="璇疯緭鍏ュ唴瀹�" type="textarea">
+              </el-input>
+            </el-form-item>
+          </el-col>
+        </el-form>
+      </div>
+      <!-- 鍏ュ簱鏄庣粏 -->
+      <div>
+        <div>鍏ュ簱鏄庣粏</div>
+        <div class="input-form">
+          <div>
+            <div>
+              <span>鑰楁潗鍚嶇О:</span>
+              <el-select v-model="formTwo.id" filterable placeholder="璇烽�夋嫨鑰楁潗鍚嶇О" size="small" style="width: 70%">
+                <el-option v-for="(v, i) in consumableOptions" :key="i" :label="v.consumablesName"
+                  :value="v.id"></el-option>
+              </el-select>
+            </div>
+          </div>
+          <div>
+            <div>
+              <span>鍗曚环:</span>
+              <el-input v-model="formTwo.unitPrice" placeholder="璇疯緭鍏ュ崟浠�" size="small" style="width: 70%">
+              </el-input>
+            </div>
+          </div>
+          <div>
+            <div>
+              <span>鍏ュ簱鏁伴噺:</span>
+              <el-input v-model="formTwo.storeNumber" placeholder="璇疯緭鍏ュ叆搴撴暟閲�" size="small" style="width: 70%">
+              </el-input>
+            </div>
+          </div>
+          <div>
+            <div>
+              <span>鎬讳环:</span>
+              <el-input v-model="formTwo.totalPrice" placeholder="璇疯緭鍏ユ�讳环" size="small" style="width: 70%">
+              </el-input>
+            </div>
+          </div>
+          <el-button size="mini" type="primary"
+            @click="addTableData">娣诲姞
+          </el-button>
+        </div>
+        <el-table :data="consumables" style="margin-top: 10px">
+          <el-table-column label="缂栧彿" type="index" width="120px"></el-table-column>
+          <el-table-column label="璐у彿" prop="itemNumber"></el-table-column>
+          <el-table-column label="绫诲埆" prop="type"></el-table-column>
+          <el-table-column label="鍚嶇О" prop="consumablesName"></el-table-column>
+          <el-table-column label="瑙勬牸" prop="specifications"></el-table-column>
+          <el-table-column label="鍙傝�冧緵搴斿晢" prop="supplier"></el-table-column>
+          <el-table-column label="璁¢噺鍗曚綅" prop="unit"></el-table-column>
+          <el-table-column label="鍗曚环" prop="unitPrice"></el-table-column>
+          <el-table-column label="鍏ュ簱鏁伴噺" prop="storeNumber"></el-table-column>
+          <el-table-column label="鎬讳环" prop="totalPrice"></el-table-column>
+          <el-table-column label="鎿嶄綔" width="80px">
+            <template slot-scope="scope">
+              <el-button size="mini" style="color: #f56c6c" type="text" @click="deleteTableData(scope.$index)">鍒犻櫎
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="handleClose">鍙� 娑�</el-button>
+        <el-button type="primary" :loading="saveLoading" @click="save">淇� 瀛�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  addStore,
+  deleteStore,
+  exportProcurementSuppliesStoreExcel,
+  procurementSuppliesList,
+  selectStoreById,
+  selectUserCondition,
+  storeList,
+  updateStore
+} from '@/api/cnas/externalService/serviceAndSupplyPro/serviceAndSupplyPro'
+import limsTable from '@/components/Table/lims-table.vue'
+
+export default {
+  computed: {
+    title() {
+      return this.dialogType == "add" ? "鏂板缓鍏ュ簱" : "缂栬緫鍏ュ簱";
+    },
+  },
+  dicts: ["consumables_type"],
+  props: {
+    contentsId: {
+      type: Number,
+      default: 0
+    }
+  },
+  watch: {
+
+  },
+  data() {
+    return {
+      mutiList: [],
+      consumables: [],
+      users: [],
+      form: {
+        oddNumbers: null,
+        inventory: null,
+        totalAmount: null,
+        storageTime: null,
+        storageUser: null,
+        remark: null,
+      },
+      formTwo: {
+        consumablesName: null,
+        unitPrice: null,
+        storeNumber: null,
+        totalPrice: null,
+      },
+      dialogVisible: false,
+      dialogType: "",
+      upIndex: 0,
+      tableColumn: [
+        {
+          label: '鍏ュ簱鍗曞彿',
+          prop: 'oddNumbers',
+          minWidth: '100'
+        },
+        {
+          label: '鑰楁潗鍚嶇О',
+          prop: 'consumablesName',
+          minWidth: '100'
+        },
+        {
+          label: '鍏ュ簱鏁伴噺',
+          prop: 'storeNumber',
+          minWidth: '100'
+        },
+        {
+          label: '鍏ュ簱鎬讳环',
+          prop: 'totalPrice',
+          minWidth: '100'
+        },
+        {
+          label: '鍏ュ簱浜�',
+          prop: 'storageUserName',
+          minWidth: '100'
+        }, {
+          label: '鍏ュ簱鏃ユ湡',
+          prop: 'storageTime',
+          minWidth: '100'
+        }, {
+          label: '璇存槑',
+          prop: 'remark',
+          minWidth: '100'
+        }, {
+          label: '鐧昏浜�',
+          prop: 'registrantName',
+          minWidth: '160'
+        },{
+          label: '鐧昏鏃ユ湡',
+          prop: 'registrantTime',
+          minWidth: '100'
+        },
+        {
+          dataType: 'action',
+          fixed: 'right',
+          minWidth: '120',
+          label: '鎿嶄綔',
+          operation: [
+            {
+              name: '缂栬緫',
+              type: 'text',
+              clickFun: (row) => {
+                this.addOrUpdateStore('edit', row);
+              },
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              color: '#f56c6c',
+              clickFun: (row) => {
+                this.deleteStore(row)
+              },
+            }
+          ]
+        }
+      ],
+      tableLoading: false,
+      page: {
+        total: 0,
+        size: 10,
+        current: 1
+      },
+      consumableOptions: [],
+      options: [],
+      storageTableData: [],
+      searchForm: {
+        orderBy: {
+          field: "id",
+          order: "desc",
+        },
+      },
+      saveLoading: false,
+    };
+  },
+  components: {
+    limsTable,
+  },
+  mounted() {
+    this.searchList();
+    this.getUserList();
+    this.fetchListOptions()
+    this.options = this.dict.type.consumables_type
+  },
+  methods: {
+    // 淇濆瓨
+    save() {
+      let data = {
+        store: this.form,
+        consumables: this.consumables,
+      };
+      this.saveLoading = true;
+      if (this.dialogType === "update") {
+        updateStore(data).then((res) => {
+          this.saveLoading = false
+          if (res.code == 200) {
+            this.$message.success("淇敼鎴愬姛");
+            this.handleClose();
+            // this.$refs.selectList()
+            this.searchList()
+          }
+        }).catch((err) => {
+          this.saveLoading = false
+        })
+      } else {
+        addStore(data).then((res) => {
+          this.saveLoading = false
+          if (res.code == 200) {
+            this.$message.success("鏂板鎴愬姛");
+            this.handleClose();
+            // this.$refs.selectList()
+            this.searchList()
+          }
+        }).catch((err) => {
+          this.saveLoading = false
+        })
+      }
+    },
+    findType(val) {
+      console.log(val)
+      return this.options.find(item => item.value === val).label
+    },
+    // 娣诲姞琛ㄦ牸鏁版嵁
+    addTableData() {
+      this.$nextTick()
+      console.log('this.consumableOptions',this.consumableOptions)
+      this.consumableOptions.forEach(item => {
+        if (item.id === this.formTwo.id) {
+          this.consumables.push({
+            itemNumber: null,
+            type: this.findType(item.consumablesType),
+            consumablesName: item.consumablesName,
+            specifications: item.specifications,
+            supplier: item.supplierName,
+            unit: item.unit,
+            unitPrice: this.formTwo.unitPrice,
+            storeNumber: this.formTwo.storeNumber,
+            totalPrice: this.formTwo.totalPrice,
+          });
+        }
+      })
+    },
+    deleteTableData(index) {
+      this.consumables.splice(index, 1);
+    },
+    // 鎵撳紑寮规
+    addOrUpdateStore(type,row) {
+      if (type === 'edit') {
+        this.dialogType = "update";
+        selectStoreById({id:row.id}).then(res => {
+          if (res.code === 201) return
+          this.consumables = res.data.consumables
+          this.form = {...res.data.store}
+        }).catch(err => {
+          console.log('err---', err);
+        })
+      } else {
+        this.dialogType = "add";
+      }
+      this.dialogVisible = true;
+    },
+    // 鏌ヨ鍒楄〃
+    searchList () {
+      this.tableLoading = true
+      storeList({...this.page,...this.searchForm}).then(res => {
+        this.tableLoading = false
+        if (res.code === 200){
+          this.storageTableData = res.data.records
+          this.page.total = res.data.total
+        }
+      }).catch(err => {
+        console.log('err---', err);
+        this.tableLoading = false
+      })
+    },
+    // 瀵煎嚭excel
+    async importExcel() {
+      exportProcurementSuppliesStoreExcel({parentId:this.contentsId}).then(res => {
+        const blob = new Blob([res], {type: 'application/octet-stream'});
+        this.$download.saveAs(blob, '鑰楁潗鍏ュ簱.xlsx')
+        this.$message.success('瀵煎嚭鎴愬姛')
+      })
+    },
+    handleClose() {
+      this.form = {
+        oddNumbers: null,
+        inventory: null,
+        totalAmount: null,
+        storageTime: null,
+        storageUser: null,
+        remark: null,
+      };
+      this.formTwo = {
+        consumablesName: null,
+        unitPrice: null,
+        storeNumber: null,
+        totalPrice: null,
+      };
+      this.consumables = [];
+      this.dialogVisible = false;
+    },
+    viewIssued(row) {
+      console.log(row);
+    },
+    // 鑾峰彇鎵�鏈夌敤鎴�
+    getUserList() {
+      selectUserCondition().then((res) => {
+          this.users = res.data;
+        });
+    },
+    async fetchListOptions() {
+      procurementSuppliesList({contentsId: this.contentsId}).then(res => {
+        if (res.code === 200) {
+          this.consumableOptions = res.data.records
+        }
+      })
+
+    },
+    // 鍒犻櫎
+    deleteStore (row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.tableLoading = true
+        console.log('row>>>>>>>>>>>>>>s',row)
+        deleteStore({
+          id:row.id,
+          consumablesId:row.consumablesId
+        }).then(res => {
+          this.tableLoading = false
+          if (res.code === 200){
+            this.$message.success('鍒犻櫎鎴愬姛')
+            this.searchList()
+          }
+        }).catch(err => {
+          this.tableLoading = false
+          console.log('err---', err);
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+
+    pagination(page) {
+      this.page.size = page.limit
+      this.searchList();
+    },
+  },
+};
+</script>
+
+<style scoped>
+.el-dialog {
+  margin: 6vh auto 50px !important;
+}
+.el-dialog__body {
+  max-height: 42em;
+  overflow-y: auto;
+}
+.input-form {
+  display: flex;
+  margin: 10px 0;
+}
+</style>
diff --git a/src/views/CNAS/externalService/serviceAndSupplyPro/component/contents.vue b/src/views/CNAS/externalService/serviceAndSupplyPro/component/contents.vue
new file mode 100644
index 0000000..2d17786
--- /dev/null
+++ b/src/views/CNAS/externalService/serviceAndSupplyPro/component/contents.vue
@@ -0,0 +1,312 @@
+<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-item label="鏇存柊浜�">
+        <el-select v-model="form.updateUser">
+          <el-option
+            v-for="item in users"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鏇存柊鏃堕棿">
+        <el-input
+          v-model="form.updateTime"
+          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-select v-model="addForm.parentId">
+              <el-option v-for="(item,index) in nodeNames" :key="index" :label="item.nodeName" :value="item.id"></el-option>
+            </el-select> -->
+          <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 {
+  addSuppliersDirectoryContents,
+  updateSuppliersDirectoryContents,
+  deleteSuppliersDirectoryContentsById,
+  getSuppliersDirectoryContentsNodeNames,
+  selectUserCondition,
+  selectProcurementSuppliesContentById,
+  getProcurementSuppliesContentsNodeNames,
+  addProcurementSuppliesContents, deleteProcurementSuppliesContentById
+} from '@/api/cnas/externalService/serviceAndSupplyPro/serviceAndSupplyPro'
+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: "",
+        updateUser: "",
+        updateTime: "",
+      },
+      addForm: {
+        nodeName: "",
+        code: "",
+        updateUser: "",
+        updateTime: "",
+        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() {
+      selectProcurementSuppliesContentById({id:this.id})
+        .then((res) => {
+          if (res.data == null) {
+            this.form = {
+              nodeName: "",
+              code: "",
+              updateUser: "",
+              updateTime: "",
+            };
+            return;
+          }
+          this.form = res.data;
+        });
+    },
+    // 鏂板缓
+    addContents() {
+      this.dialogVisible = true;
+      this.resetForm();
+    },
+    resetForm() {
+      this.addForm = {
+        nodeName: "",
+        code: "",
+        updateUser: "",
+        updateTime: "",
+        parentId: null,
+      };
+    },
+    async 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;
+      }
+      try {
+        let res = null
+        console.log('this.from',this.from)
+        if(this.from == '鑰楁潗鏍�' ){
+          console.log('111')
+          res = await addProcurementSuppliesContents(this.addForm)
+        }else {
+          console.log('222')
+          res = await addSuppliersDirectoryContents(this.addForm)
+        }
+        if (res.code === 200) {
+          this.$message.success("娣诲姞鎴愬姛");
+          this.dialogVisible = false;
+          this.$emit("contentsUpdate", res.data);
+          this.getContentsDetail();
+        }
+      }catch (error){
+        this.$message.error("娣诲姞澶辫触");
+      }
+    },
+    // 鏇存柊
+    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(() => {
+        if(this.from == '鑰楁潗鏍�'){
+          deleteProcurementSuppliesContentById({id:this.form.id}).then((res) => {
+            if (res.code == 200) {
+              this.$message.success("鍒犻櫎鎴愬姛");
+              this.$emit("contentsUpdate", this.form.parentId, true);
+              this.getContentsDetail();
+            }
+          });
+        }else {
+          deleteSuppliersDirectoryContentsById({id:this.form.id}).then((res) => {
+            if (res.code == 200) {
+              this.$message.success("鍒犻櫎鎴愬姛");
+              this.$emit("contentsUpdate", this.form.parentId, true);
+              this.getContentsDetail();
+            }
+          });
+        }
+      });
+    },
+    // 鑾峰彇鎵�鏈夌洰褰曡妭鐐�
+    getNodeNames() {
+      if(this.from == '鑰楁潗鏍�'){
+        getProcurementSuppliesContentsNodeNames().then(res => {
+          this.nodeNames = res.data;
+        })
+      }else {
+        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/serviceAndSupplyPro/index.vue b/src/views/CNAS/externalService/serviceAndSupplyPro/index.vue
index 36ec5c0..9efac6d 100644
--- a/src/views/CNAS/externalService/serviceAndSupplyPro/index.vue
+++ b/src/views/CNAS/externalService/serviceAndSupplyPro/index.vue
@@ -27,30 +27,33 @@
         <el-tab-pane label="鑰楁潗鎬昏" name="first" :lazy="true">
           <ConsumableOverview v-if="activeName == 'first'" :contentsId="contentsId"></ConsumableOverview>
         </el-tab-pane>
-<!--        <el-tab-pane label="鑰楁潗鍒楄〃" name="second" :lazy="true">-->
-<!--          <ConsumableList v-if="activeName == 'second'" :contentsId="contentsId"></ConsumableList>-->
-<!--        </el-tab-pane>-->
-<!--        <el-tab-pane label="鑰楁潗鍏ュ簱" name="third" :lazy="true">-->
-<!--          <Store v-if="activeName == 'third'" :contentsId="contentsId"></Store>-->
-<!--        </el-tab-pane>-->
-<!--        <el-tab-pane label="鐩綍缁存姢" name="fourth" :lazy="true">-->
-<!--          <Contents-->
-<!--            v-if="activeName == 'fourth'"-->
-<!--            :id="contentsId"-->
-<!--            @contentsUpdate="contentsUpdate"-->
-<!--            :treeData="treeData"-->
-<!--            from="鑰楁潗鏍�"-->
-<!--          ></Contents>-->
-<!--        </el-tab-pane>-->
+        <el-tab-pane label="鑰楁潗鍒楄〃" name="second" :lazy="true">
+          <ConsumableList v-if="activeName == 'second'" :contentsId="contentsId"></ConsumableList>
+        </el-tab-pane>
+        <el-tab-pane label="鑰楁潗鍏ュ簱" name="third" :lazy="true">
+          <Store v-if="activeName == 'third'" :contentsId="contentsId"></Store>
+        </el-tab-pane>
+        <el-tab-pane label="鐩綍缁存姢" name="fourth" :lazy="true">
+          <Contents
+            v-if="activeName == 'fourth'"
+            :id="contentsId"
+            @contentsUpdate="contentsUpdate"
+            :treeData="treeData"
+            from="鑰楁潗鏍�"
+          ></Contents>
+        </el-tab-pane>
       </el-tabs>
     </div>
   </div>
 </template>
 <script>
-// import Contents from "@/tabs/do/a6.service-and-supply-purchase/contents.vue";
-// import Store from "@/tabs/do/a6.service-and-supply-purchase/store.vue";
-import ConsumableOverview from "../serviceAndSupplyPro/component/ConsumableOverview.vue";
-// import ConsumableList from "@/tabs/do/a6.service-and-supply-purchase/ConsumableList.vue"
+import Contents from "./component/contents.vue";
+import Store from "./component/Store.vue";
+import ConsumableOverview from "./component/ConsumableOverview.vue";
+import ConsumableList from "./component/ConsumableList.vue"
+import {
+  directoryListing
+} from '@/api/cnas/externalService/serviceAndSupplyPro/serviceAndSupplyPro'
 
 export default {
   data() {
@@ -70,10 +73,10 @@
     };
   },
   components: {
-    // Contents,
-    // Store,
-    ConsumableOverview
-    // ConsumableList
+    Contents,
+    Store,
+    ConsumableOverview,
+    ConsumableList
   },
   watch: {
     contentsId(newVal, oldVal) {
@@ -129,9 +132,7 @@
     },
     // 鏌ヨ鎵�鏈夌洰褰�
     getTreeData() {
-      this.$axios
-        .get(this.$api.procurementSuppliesContents.directoryListing)
-        .then((res) => {
+      directoryListing().then((res) => {
           this.treeData = res.data;
         });
     },
diff --git a/src/views/CNAS/process/sampleDisposal/index.vue b/src/views/CNAS/process/sampleDisposal/index.vue
index 705000e..0d12c66 100644
--- a/src/views/CNAS/process/sampleDisposal/index.vue
+++ b/src/views/CNAS/process/sampleDisposal/index.vue
@@ -1,20 +1,11 @@
 <template>
   <div class="sample-disposal">
-    <el-row class="title">
-      <el-col :span="20" style="padding-left: 20px;text-align: left;">妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�</el-col>
-      <el-col :span="4" style="text-align: right;">
-        <!-- <el-button size="medium" type="primary" @click="handleDown" v-loading="outLoading" style="margin-right: 16px;">瀵煎嚭</el-button> -->
-      </el-col>
-    </el-row>
     <el-tabs type="border-card" v-model="activeName" style="height: 100%;" @tab-click="queryParams.totaldealId = ''">
       <el-tab-pane label="濉啓" name="濉啓" style="height: 100%;" :key="1">
-        <el-button size="small" type="primary" @click="handleAdd0" style="margin-left: 20px;"
-          v-if="addPower">鏂板</el-button>
+        <el-button size="small" type="primary" @click="handleAdd0" style="margin-left: 20px;">鏂板</el-button>
         <div class="table" style="height: calc(100% - 200px)" v-if="activeName == '濉啓'">
           <lims-table :tableData="tableData" :column="column" :tableLoading="tableLoading"
             :height="'calc(100vh - 290px)'" :page="page" @pagination="pagination"></lims-table>
-          <!-- <ValueTable ref="ValueTable0" :url="$api.processTotaldeal.pageProcessDeal" :componentData="componentData0"
-            :key="upIndex0" :delUrl="$api.processTotaldeal.delProcessDeal" /> -->
         </div>
       </el-tab-pane>
       <el-tab-pane label="鍘嗗彶璁板綍" name="鍘嗗彶璁板綍" style="height: 100%;" :key="2">
@@ -22,7 +13,7 @@
           <div class="search_thing">
             <div class="search_label">骞存湀锛�</div>
             <div class="search_input">
-              <el-date-picker v-model="componentData.entity.month" type="month" placeholder="閫夋嫨鏈�" format="yyyy-MM"
+              <el-date-picker v-model="queryParams0.month" type="month" placeholder="閫夋嫨鏈�" format="yyyy-MM"
                 value-format="yyyy-MM" size="small" @change="refreshTable()">
               </el-date-picker>
             </div>
@@ -33,8 +24,8 @@
           </div>
         </div>
         <div class="table">
-          <!-- <ValueTable ref="ValueTable" :url="$api.processTotaldeal.pageProcessTotaldeal" :componentData="componentData"
-            :key="upIndex" /> -->
+          <lims-table :tableData="tableData0" :column="column0" :tableLoading="tableLoading"
+            :height="'calc(100vh - 300px)'" :page="page0" @pagination="pagination0"></lims-table>
         </div>
       </el-tab-pane>
     </el-tabs>
@@ -122,6 +113,7 @@
   checkProcessTotaldeal,
   ratifyProcessTotaldeal,
   delProcessDeal,
+  pageProcessTotaldeal,
 } from "@/api/cnas/process/sampleDisposal";
 export default {
   components: {
@@ -142,105 +134,6 @@
       noCheckLoading: false,
       checkLoading: false,
       // 鍘嗗彶鍒楄〃
-      componentData: {
-        entity: {
-          month: null,
-          orderBy: {
-            field: 'id',
-            order: 'desc'
-          }
-        },
-        isIndex: true,
-        showSelect: false,
-        select: false,
-        do: [{
-          id: 'handleLook',
-          font: '鏌ョ湅',
-          type: 'text',
-          method: 'handleLook',
-        }, {
-          id: 'handleDown0',
-          font: '涓嬭浇',
-          type: 'text',
-          method: 'handleDown0',
-          disabFun: (row, index) => {
-            return !row.url
-          }
-        },
-        // {
-        //   id: 'handleAdd',
-        //   font: '濉啓',
-        //   type: 'text',
-        //   method: 'handleAdd',
-        //   disabFun: (row, index) => {
-        //     return row.submitState=='宸叉彁浜�'
-        //   }
-        // },
-        {
-          id: 'handleSubmit',
-          font: '鎻愪氦',
-          type: 'text',
-          method: 'handleSubmit',
-          disabFun: (row, index) => {
-            return !!row.submitState && row.submitState != '寰呮彁浜�'
-          }
-        }, {
-          id: 'handleCheck',
-          font: '瀹℃牳',
-          type: 'text',
-          method: 'handleCheck',
-          disabFun: (row, index) => {
-            return row.examineState == '閫氳繃' || row.submitState == '寰呮彁浜�'
-          }
-        }, {
-          id: 'handleApproval',
-          font: '鎵瑰噯',
-          type: 'text',
-          method: 'handleApproval',
-          disabFun: (row, index) => {
-            return row.ratifyState == '閫氳繃' || row.submitState == '寰呮彁浜�'
-          }
-        }],
-        tagField: {},
-        selectField: {},
-        requiredAdd: [],
-        requiredUp: [],
-        needSort: [],
-        inputType: ''
-      },
-      // 鏍峰搧鍒楄〃
-      componentData0: {
-        entity: {
-          totaldealId: null,
-          orderBy: {
-            field: 'id',
-            order: 'desc'
-          }
-        },
-        isIndex: true,
-        showSelect: false,
-        select: false,
-        do: [{
-          id: 'handleAdd0',
-          font: '淇敼',
-          type: 'text',
-          method: 'handleAdd0'
-        }, {
-          id: 'delete',
-          font: '鍒犻櫎',
-          type: 'text',
-          method: 'doDiy'
-        }],
-        tagField: {},
-        selectField: {},
-        requiredAdd: [],
-        requiredUp: [],
-        needSort: [],
-        inputType: ''
-      },
-      upIndex0: 100,
-      entityCopy: {},
-      upIndex: 0,
       addInfo: {},//鏂板鏍峰搧
       customPageList: [],
       currentInfo: {
@@ -285,12 +178,81 @@
         current: 0,
       },
       tableLoading: false,
+      queryParams0: {},
+      tableData0: [],
+      column0: [
+        { label: "鏈堜唤", prop: "month" },
+        { label: "鎬绘暟閲�", prop: "totalNum" },
+        { label: "鎻愪氦浜�", prop: "submitUserName" },
+        { label: "瀹℃牳浜�", prop: "examineUserName" },
+        { label: "鎵瑰噯浜�", prop: "ratifyUserName" },
+        {
+          dataType: "action",
+          fixed: "right",
+          label: "鎿嶄綔",
+          operation: [
+            {
+              name: "鏌ョ湅",
+              type: "text",
+              clickFun: (row) => {
+                this.handleLook(row);
+              },
+            },
+            {
+              name: "涓嬭浇",
+              type: "text",
+              clickFun: (row) => {
+                this.handleDown0(row);
+              },
+              disabled: (row) => {
+                return !row.url
+              }
+            },
+            {
+              name: "鎻愪氦",
+              type: "text",
+              clickFun: (row) => {
+                this.handleSubmit(row);
+              },
+              disabled: (row) => {
+                return !!row.submitState && row.submitState != '寰呮彁浜�'
+              }
+            },
+            {
+              name: "瀹℃牳",
+              type: "text",
+              clickFun: (row) => {
+                this.handleCheck(row);
+              },
+              disabled: (row) => {
+                return row.examineState == '閫氳繃' || row.submitState == '寰呮彁浜�'
+              }
+            },
+            {
+              name: "鎵瑰噯",
+              type: "text",
+              clickFun: (row) => {
+                this.handleApproval(row);
+              },
+              disabled: (row) => {
+                return row.ratifyState == '閫氳繃' || row.submitState == '寰呮彁浜�'
+              }
+            },
+          ],
+        },
+      ],
+      page0: {
+        total: 0,
+        size: 10,
+        current: 0,
+      },
     };
   },
   mounted() {
     // this.entityCopy = this.HaveJson(this.componentData.entity);
     this.getCustomPageList()
-    // this.getPower()
+    this.getList()
+    this.getList0()
   },
   methods: {
     getPower() {
@@ -364,13 +326,34 @@
       this.getList();
     },
     refresh() {
-      this.queryParams = {};
-      this.page.current = 1;
-      this.getList();
+      this.queryParams0 = {};
+      this.page0.current = 1;
+      this.getList0();
     },
     refreshTable() {
-      this.page.current = 1;
-      this.getList();
+      this.page0.current = 1;
+      this.getList0();
+    },
+    getList0() {
+      this.tableLoading = true;
+      let param = { ...this.queryParams0, ...this.page };
+      delete param.total;
+      pageProcessTotaldeal({ ...param })
+        .then((res) => {
+          this.tableLoading = false;
+          if (res.code === 200) {
+            this.tableData0 = res.data.records;
+            this.page0.total = res.data.total;
+          }
+        })
+        .catch((err) => {
+          this.tableLoading = false;
+        });
+    },
+    pagination0({ page, limit }) {
+      this.page0.current = page;
+      this.page0.size = limit;
+      this.getList0();
     },
     // 濉啓
     // handleAdd(row){
@@ -404,7 +387,8 @@
             type: 'success',
             message: '缂栬緫鎴愬姛!'
           });
-          this.$refs.ValueTable0.selectList()
+          this.page.current = 0;
+          this.getList();
         }).catch(err => { });
       } else {
         // 鏂板
@@ -420,7 +404,8 @@
             type: 'success',
             message: '鏂板鎴愬姛!'
           });
-          this.$refs.ValueTable0.selectList()
+          this.page.current = 0;
+          this.getList();
         }).catch(err => { });
       }
     },
@@ -439,7 +424,7 @@
             type: 'success',
             message: '鎻愪氦鎴愬姛!'
           });
-          this.$refs['ValueTable'].selectList()
+          this.refreshTable()
         }).catch(err => { });
       })
     },
@@ -451,7 +436,8 @@
       this.activeName = '濉啓'
       this.queryParams.totaldealId = row.id
       this.$nextTick(() => {
-        this.$refs['ValueTable0'].selectList()
+        this.page.current = 0;
+        this.getList();
       })
     },
     commonFun(row, callbanck) {
@@ -461,8 +447,8 @@
         current: -1,
         size: -1, ...this.queryParams
       }).then(res => {
-        this.currentInfo.arr = res.data.body.records
         this.lookDialogVisible = true
+        this.currentInfo.arr = res.data.records
         if (callbanck) {
           callbanck()
         }
@@ -497,7 +483,7 @@
             type: 'success',
             message: '鎿嶄綔鎴愬姛!'
           });
-          this.$refs['ValueTable'].selectList()
+          this.refreshTable()
           this.lookDialogVisible = false
         }).catch(err => { });
       } else if (this.title0 == '鎵瑰噯') {
@@ -512,7 +498,7 @@
             type: 'success',
             message: '鎿嶄綔鎴愬姛!'
           });
-          this.$refs['ValueTable'].selectList()
+          this.refreshTable()
           this.lookDialogVisible = false
         }).catch(err => { });
       }
@@ -574,7 +560,6 @@
 
 .table {
   background-color: #fff;
-  width: calc(100% - 40px);
   height: calc(100% - 60px - 140px);
   padding: 20px;
 }
@@ -586,7 +571,6 @@
 .tables {
   table-layout: fixed;
   width: 100%;
-  margin-top: 10px;
 }
 
 .tables td {
diff --git a/src/views/CNAS/systemManagement/correctiveAction/index.vue b/src/views/CNAS/systemManagement/correctiveAction/index.vue
index 6e92fbd..bb41fae 100644
--- a/src/views/CNAS/systemManagement/correctiveAction/index.vue
+++ b/src/views/CNAS/systemManagement/correctiveAction/index.vue
@@ -109,8 +109,8 @@
       page: {
         size: 20,
         current: 1,
+        total: 0,
       },
-      total: 0,
       correctiveInfo: false,
       viewTestRecordDialog: false,
     };
@@ -131,7 +131,7 @@
         this.tableLoading = false
         if (res.code === 201) return
         this.tableData = res.data.records
-        this.total = res.data.total
+        this.page.total = res.data.total
       }).catch(err => {
         console.log('err---', err);
         this.tableLoading = false
diff --git a/src/views/CNAS/systemManagement/documentControl/components/ControlledFileApplication.vue b/src/views/CNAS/systemManagement/documentControl/components/ControlledFileApplication.vue
index 81b5f6a..1a25201 100644
--- a/src/views/CNAS/systemManagement/documentControl/components/ControlledFileApplication.vue
+++ b/src/views/CNAS/systemManagement/documentControl/components/ControlledFileApplication.vue
@@ -470,18 +470,25 @@
       formData.append('state', this.type); // 鏂囦欢鍚嶅瓧娈�
       formData.append('writer', this.currentInfo.writer); // 鏂囦欢鍚嶅瓧娈�
 
-      let res = await checkManageDocumentControlled(formData)
-      this.checkLoading = false
-      this.noCheckLoading = false
-      if (res.code == 200) {
-        this.$message({ message: '鎿嶄綔鎴愬姛', type: 'success' });
-        this.checkDialogVisible = false;
-        this.refreshTable()
-        return true
-      } else {
-        this.$message({ message: '鎿嶄綔澶辫触', type: 'error' });
-        return false
+      try {
+        let res = await checkManageDocumentControlled(formData)
+        this.checkLoading = false
+        this.noCheckLoading = false
+        if (res.code == 200) {
+          this.$message({ message: '鎿嶄綔鎴愬姛', type: 'success' });
+          this.checkDialogVisible = false;
+          this.refreshTable()
+          return true
+        } else {
+          this.$message({ message: '鎿嶄綔澶辫触', type: 'error' });
+          return false
+        }
+      } catch (e) {
+        this.checkLoading = false
+        this.noCheckLoading = false
       }
+
+
     },
     handleCheckSub(type) {
       this.type = type
diff --git a/src/views/CNAS/systemManagement/documentControl/components/FileList.vue b/src/views/CNAS/systemManagement/documentControl/components/FileList.vue
index 7a88db6..765c0d3 100644
--- a/src/views/CNAS/systemManagement/documentControl/components/FileList.vue
+++ b/src/views/CNAS/systemManagement/documentControl/components/FileList.vue
@@ -334,17 +334,22 @@
       formData.append('file', pdfBlob, fileName); // 鏂囦欢瀛楁
       formData.append('id', this.currentInfo.id); // 鏂囦欢鍚嶅瓧娈�
 
-      let res = await uploadFileManageDocumentList(formData)
-      this.addLoading = false
-      if (res.code == 200) {
-        this.$message({ message: '涓婁紶鎴愬姛', type: 'success' });
-        this.addDialogVisible = false;
-        this.refreshTable()
-        return true
-      } else {
-        this.$message({ message: '涓婁紶澶辫触', type: 'error' });
-        return false
+      try {
+        let res = await uploadFileManageDocumentList(formData)
+        this.addLoading = false
+        if (res.code == 200) {
+          this.$message({ message: '涓婁紶鎴愬姛', type: 'success' });
+          this.addDialogVisible = false;
+          this.refreshTable()
+          return true
+        } else {
+          this.$message({ message: '涓婁紶澶辫触', type: 'error' });
+          return false
+        }
+      } catch (e) {
+        this.addLoading = false
       }
+
     },
     handleDelete(row) {
       this.$confirm("鏄惁鍒犻櫎璇ユ潯鏁版嵁?", "鎻愮ず", {
diff --git a/src/views/CNAS/systemManagement/measuresDealRisks/components/hazardIdentificationRiskAssessment.vue b/src/views/CNAS/systemManagement/measuresDealRisks/components/hazardIdentificationRiskAssessment.vue
index 07629ec..b0c63c5 100644
--- a/src/views/CNAS/systemManagement/measuresDealRisks/components/hazardIdentificationRiskAssessment.vue
+++ b/src/views/CNAS/systemManagement/measuresDealRisks/components/hazardIdentificationRiskAssessment.vue
@@ -13,7 +13,7 @@
         <el-button size="small" @click="openDownloadDia">瀵煎嚭</el-button>
       </div>
     </div>
-    <el-table :data="tableData" style="width: 100%" height="calc(100vh - 18em)">
+    <el-table :data="tableData" style="width: 100%" height="calc(100vh - 18em)" key="table1">
       <el-table-column type="index" label="搴忓彿" width="120">
         <template v-slot="scope">
           <span>{{ (page.current - 1) * page.size + scope.$index + 1 }}</span>
@@ -142,7 +142,7 @@
       page: {
         total: 0,
         size: 10,
-        current: 0,
+        current: 1,
       },
       tableData: [],
       loading: false
diff --git a/src/views/CNAS/systemManagement/measuresDealRisks/components/listRiskAnalysisControlPlans.vue b/src/views/CNAS/systemManagement/measuresDealRisks/components/listRiskAnalysisControlPlans.vue
index 33adb1f..ca6e916 100644
--- a/src/views/CNAS/systemManagement/measuresDealRisks/components/listRiskAnalysisControlPlans.vue
+++ b/src/views/CNAS/systemManagement/measuresDealRisks/components/listRiskAnalysisControlPlans.vue
@@ -13,7 +13,7 @@
         <el-button size="small" @click="openDownloadDia">瀵煎嚭</el-button>
       </div>
     </div>
-    <el-table :data="tableData" style="width: 100%" height="calc(100vh - 18em)">
+    <el-table :data="tableData" style="width: 100%" height="calc(100vh - 18em)" key="table0">
       <el-table-column type="index" label="搴忓彿" width="120">
         <template v-slot="scope">
           <span>{{ (search.current - 1) * search.size + scope.$index + 1 }}</span>
diff --git a/src/views/business/inspectionTask/index.vue b/src/views/business/inspectionTask/index.vue
index 600e362..e10d812 100644
--- a/src/views/business/inspectionTask/index.vue
+++ b/src/views/business/inspectionTask/index.vue
@@ -518,10 +518,18 @@
           prop: "insResult",
           dataType: "tag",
           formatData: (params) => {
-            return this.insResultList.find((m) => m.value == params).label;
+            let obj = this.insResultList.find((m) => m.value == params)
+            if (obj) {
+              return this.insResultList.find((m) => m.value == params).label;
+            } else {
+              return ''
+            }
           },
           formatType: (params) => {
-            return this.insResultList.find((m) => m.value == params).type;
+            let obj = this.insResultList.find((m) => m.value == params)
+            if (obj) {
+              return this.insResultList.find((m) => m.value == params).type;
+            }
           },
         },
         {
diff --git a/src/views/performance/class/index.vue b/src/views/performance/class/index.vue
index d5a7a4a..31ac64c 100644
--- a/src/views/performance/class/index.vue
+++ b/src/views/performance/class/index.vue
@@ -808,7 +808,7 @@
       }
     },
     getUsers() {
-      selectUserCondition().then((res) => {
+      selectUserCondition({ type: 1 }).then((res) => {
         if (res.code === 201) {
           return;
         }

--
Gitblit v1.9.3