From cf0fb9a6395d78bd808190a0506d1f003cc6fc31 Mon Sep 17 00:00:00 2001
From: 曹睿 <360930172@qq.com>
Date: 星期二, 25 二月 2025 14:24:51 +0800
Subject: [PATCH] Merge branch 'dev' of http://114.132.189.42:9002/r/lims-ruoyi-before into dev

---
 src/api/cnas/systemManagement/documentControl.js                                            |   13 
 src/components/Table/lims-table.vue                                                         |    6 
 src/views/CNAS/externalService/supplierManage/component/formDia.vue                         |  188 +++
 src/api/cnas/externalService/supplierManage/supplierManage.js                               |   52 +
 src/views/CNAS/systemManagement/documentControl/components/DistributionCollectionRecord.vue |   52 
 src/views/standard/standardLibrary/index.vue                                                |   35 
 src/views/CNAS/systemManagement/managementReview/components/reviewReport.vue                |  291 +++++
 src/views/CNAS/systemManagement/documentRecords/approvalRecord.vue                          |    2 
 src/views/CNAS/systemManagement/managementReview/components/meetingRecordsDia.vue           |  158 +++
 src/views/CNAS/systemManagement/managementReview/components/managementReviewPlan.vue        |  339 ++++++
 src/views/business/finishedProductSampling/components/addQuarterItem.vue                    |  296 +++++
 src/views/CNAS/resourceDemand/standardMaterial/index.vue                                    |   27 
 src/api/business/finishedProductSampling.js                                                 |   35 
 src/views/CNAS/systemManagement/managementReview/components/meetingRecords.vue              |  221 ++++
 src/api/cnas/systemManagement/measuresDealRisks.js                                          |    8 
 src/api/cnas/systemManagement/internalAuditManagement.js                                    |   24 
 src/utils/request.js                                                                        |    3 
 src/views/CNAS/externalService/supplierManage/index.vue                                     |  189 +++
 src/views/CNAS/systemManagement/managementReview/components/reviewReportDia.vue             |  259 ++++
 src/views/CNAS/systemManagement/managementReview/components/managementFormDIa.vue           |  246 ++++
 src/views/CNAS/systemManagement/managementReview/index.vue                                  |   48 
 src/views/business/finishedProductSampling/index.vue                                        |  448 ++++++++
 src/views/performance/manHour/workTimeConfig.vue                                            |    4 
 src/api/cnas/systemManagement/managementReview.js                                           |  159 +++
 24 files changed, 2,999 insertions(+), 104 deletions(-)

diff --git a/src/api/business/finishedProductSampling.js b/src/api/business/finishedProductSampling.js
new file mode 100644
index 0000000..e2de844
--- /dev/null
+++ b/src/api/business/finishedProductSampling.js
@@ -0,0 +1,35 @@
+// 鎴愬搧鎶芥牱璇︽儏椤甸潰鐩稿叧鎺ュ彛
+import request from '@/utils/request'
+
+// 鍘熸潗鏂欐牴鎹甶d鎶ユ
+export function getIfsStock(query) {
+  return request({
+    url: '/finishProductSpotCheck/getIfsStock',
+    method: 'post',
+    data: query
+  })
+}
+// 瀛e害鎶芥鏌ョ湅璇︽儏
+export function getQuarter(query) {
+  return request({
+    url: '/finishProductSpotCheck/getQuarter',
+    method: 'get',
+    params: query
+  })
+}
+// 鎻愪氦瀛e害鎶芥牱
+export function addQuarter(query) {
+  return request({
+    url: '/finishProductSpotCheck/addQuarter',
+    method: 'post',
+    data: query
+  })
+}
+// 缂栬緫瀛e害妫�楠�
+export function updateQuarterOnOrder(query) {
+  return request({
+    url: '/finishProductSpotCheck/updateQuarterOnOrder',
+    method: 'post',
+    data: query
+  })
+}
diff --git a/src/api/cnas/externalService/supplierManage/supplierManage.js b/src/api/cnas/externalService/supplierManage/supplierManage.js
new file mode 100644
index 0000000..c28b538
--- /dev/null
+++ b/src/api/cnas/externalService/supplierManage/supplierManage.js
@@ -0,0 +1,52 @@
+import request from '@/utils/request'
+
+// 鍒嗛〉鏌ヨ
+export function selectQualifiedSupplierManagementPage(query) {
+  return request({
+    url: '/supplierManagement/selectQualifiedSupplierManagementPage',
+    method: 'get',
+    params: query
+  })
+}
+
+// 缂栬緫渚涘簲鍟�
+export function updateSupplierManagement(query) {
+  return request({
+    url: '/supplierManagement/updateSupplierManagement',
+    method: 'post',
+    data: query
+  })
+}
+
+// 鏂板渚涘簲鍟�
+export function addSupplierManagement(query) {
+  return request({
+    url: '/supplierManagement/addSupplierManagement',
+    method: 'post',
+    data: query
+  })
+}
+
+// 瀵煎嚭渚涘簲鍟�
+export function exportSupplierManagement(query) {
+  return request({
+    url: "/supplierManagement/exportSupplierManagement",
+    method: "get",
+    responseType: "blob",
+    params: query,
+  });
+}
+
+// 鍒犻櫎渚涘簲鍟�
+export function delSupplierManagement(query) {
+  return request({
+    url: '/supplierManagement/delSupplierManagement',
+    method: 'delete',
+    params: query
+  })
+}
+
+
+
+
+
diff --git a/src/api/cnas/systemManagement/documentControl.js b/src/api/cnas/systemManagement/documentControl.js
index 2d35c9e..3fc97b7 100644
--- a/src/api/cnas/systemManagement/documentControl.js
+++ b/src/api/cnas/systemManagement/documentControl.js
@@ -63,9 +63,7 @@
   return request({
     url: "/manageDocumentControlled/checkManageDocumentControlledPdf",
     method: "get",
-    headers: {
-      responseType: "blob",
-    },
+    responseType: "blob",
     params: query,
   });
 }
@@ -112,6 +110,7 @@
   return request({
     url: "/manageDocumentIssueRecycle/exportManageDocumentIssueRecycle",
     method: "get",
+    responseType: "blob",
     params: query,
   });
 }
@@ -121,7 +120,7 @@
   return request({
     url: "/manageDocumentIssueRecycle/addManageDocumentIssueRecycle",
     method: "post",
-    headers: { "Content-Type": "application/x-www-form-urlencoded" },
+    responseType: "blob",
     data: data,
   });
 }
@@ -167,7 +166,7 @@
   return request({
     url: "/manageDocumentAlter/exportManageDocumentAlter",
     method: "get",
-    headers: { responseType: "blob" },
+    responseType: "blob",
     params: query,
   });
 }
@@ -197,7 +196,7 @@
   return request({
     url: "/manageDocumentAlter/checkManageDocumentAlterPdf",
     method: "get",
-    headers: { responseType: "blob" },
+    responseType: "blob",
     params: query,
   });
 }
@@ -262,7 +261,7 @@
   return request({
     url: "/manageDocumentCancel/exportManageDocumentCancel",
     method: "get",
-    headers: { responseType: "blob" },
+    responseType: "blob",
     params: query,
   });
 }
diff --git a/src/api/cnas/systemManagement/internalAuditManagement.js b/src/api/cnas/systemManagement/internalAuditManagement.js
index e7ae621..4e22f4f 100644
--- a/src/api/cnas/systemManagement/internalAuditManagement.js
+++ b/src/api/cnas/systemManagement/internalAuditManagement.js
@@ -24,9 +24,7 @@
   return request({
     url: "/internalPlan/exportInternalPlan",
     method: "get",
-    headers: {
-      responseType: "blob",
-    },
+    responseType: "blob",
     params: query,
   });
 }
@@ -99,9 +97,7 @@
   return request({
     url: "/internalImplement/exportInternalImplement",
     method: "get",
-    headers: {
-      responseType: "blob",
-    },
+    responseType: "blob",
     params: query,
   });
 }
@@ -165,9 +161,7 @@
   return request({
     url: "/internalMeeting/exportInternalMeeting",
     method: "get",
-    headers: {
-      responseType: "blob",
-    },
+    responseType: "blob",
     params: query,
   });
 }
@@ -222,9 +216,7 @@
   return request({
     url: "/internalCheck/exportInternalCheck",
     method: "get",
-    headers: {
-      responseType: "blob",
-    },
+    responseType: "blob",
     params: query,
   });
 }
@@ -279,9 +271,7 @@
   return request({
     url: "/internalCorrect/exportInternalCorrect",
     method: "get",
-    headers: {
-      responseType: "blob",
-    },
+    responseType: "blob",
     params: query,
   });
 }
@@ -327,9 +317,7 @@
   return request({
     url: "/internalReport/exportInternalReport",
     method: "get",
-    headers: {
-      responseType: "blob",
-    },
+    responseType: "blob",
     params: query,
   });
 }
diff --git a/src/api/cnas/systemManagement/managementReview.js b/src/api/cnas/systemManagement/managementReview.js
new file mode 100644
index 0000000..5d410d3
--- /dev/null
+++ b/src/api/cnas/systemManagement/managementReview.js
@@ -0,0 +1,159 @@
+// 绠$悊璇勫鐩稿叧鎺ュ彛
+import request from "@/utils/request";
+
+// 绠$悊璁″垝-涓婁紶闄勪欢
+export function addReviewProgramFile(data) {
+  return request({
+    url: "/manageReviewProgramFile/addReviewProgramFile",
+    method: "post",
+    headers: { "Content-Type": "application/x-www-form-urlencoded" },
+    data: data,
+  });
+}
+
+//绠$悊璁″垝-闄勪欢鍒楄〃
+export function selectReviewProgramFile(query) {
+  return request({
+    url: "/manageReviewProgramFile/selectReviewProgramFile",
+    method: "get",
+    params: query,
+  });
+}
+
+//绠$悊璁″垝-鏌ヨ绠$悊璇勫璁″垝
+export function getPageReviewProgram(query) {
+  return request({
+    url: "/manageReviewProgram/getPageReviewProgram",
+    method: "get",
+    params: query,
+  });
+}
+
+//绠$悊璁″垝-鍒犻櫎绠$悊璇勫璁″垝
+export function deleteReviewProgram(query) {
+  return request({
+    url: "/manageReviewProgram/deleteReviewProgram",
+    method: "delete",
+    params: query,
+  });
+}
+
+//绠$悊璁″垝
+export function exportReviewProgram(query) {
+  return request({
+    url: "/manageReviewProgram/exportReviewProgram",
+    method: "get",
+    responseType: "blob",
+    params: query,
+  });
+}
+
+// 绠$悊璁″垝-缂栬緫绠$悊璇勫璁″垝
+export function modifyReviewProgram(data) {
+  return request({
+    url: "/manageReviewProgram/modifyReviewProgram",
+    method: "post",
+    data: data,
+  });
+}
+
+//浼氳璁板綍-鏌ヨ绠$悊璇勫浼氳璁板綍
+export function getPageMeeting(query) {
+  return request({
+    url: "/manageMeeting/getPageMeeting",
+    method: "get",
+    params: query,
+  });
+}
+
+//浼氳璁板綍-鍒犻櫎绠$悊璇勫浼氳璁板綍
+export function deleteMeeting(query) {
+  return request({
+    url: "/manageMeeting/deleteMeeting",
+    method: "delete",
+    params: query,
+  });
+}
+
+//浼氳璁板綍-涓嬭浇绠$悊璇勫浼氳璁板綍
+export function exportMeeting(query) {
+  return request({
+    url: "/manageMeeting/exportMeeting",
+    method: "get",
+    responseType: "blob",
+    params: query,
+  });
+}
+
+// 绠$悊璁″垝-鏂板绠$悊璇勫浼氳璁板綍
+export function addMeeting(data) {
+  return request({
+    url: "/manageMeeting/addMeeting",
+    method: "post",
+    data: data,
+  });
+}
+
+// 绠$悊璁″垝-淇敼绠$悊璇勫浼氳璁板綍
+export function modifyMeeting(data) {
+  return request({
+    url: "/manageMeeting/modifyMeeting",
+    method: "post",
+    data: data,
+  });
+}
+
+//璇勫浼氳鎶ュ憡-鏌ヨ绠$悊璇勫浼氳鎶ュ憡
+export function getPageReviewReport(query) {
+  return request({
+    url: "/manageReviewReport/getPageReviewReport",
+    method: "get",
+    params: query,
+  });
+}
+
+//璇勫浼氳鎶ュ憡-鍒犻櫎绠$悊璇勫浼氳鎶ュ憡
+export function deleteReviewReport(query) {
+  return request({
+    url: "/manageReviewReport/deleteReviewReport",
+    method: "delete",
+    params: query,
+  });
+}
+
+//璇勫浼氳鎶ュ憡-涓嬭浇
+export function exportReviewReport(query) {
+  return request({
+    url: "/manageReviewReport/exportReviewReport",
+    method: "get",
+    responseType: "blob",
+    params: query,
+  });
+}
+
+// 璇勫浼氳鎶ュ憡-缂栬緫绠$悊璇勫浼氳鎶ュ憡
+export function modifyReviewReport(data) {
+  return request({
+    url: "/manageReviewReport/modifyReviewReport",
+    method: "post",
+    data: data,
+  });
+}
+
+// 璇勫浼氳鎶ュ憡-鏂板绠$悊璇勫浼氳鎶ュ憡
+export function addReviewReport(data) {
+  return request({
+    url: "/manageReviewReport/addReviewReport",
+    method: "post",
+    data: data,
+  });
+}
+
+// 璇勫浼氳鎶ュ憡-鏂板绠$悊璇勫璁″垝
+export function addReviewProgram(data) {
+  return request({
+    url: "/manageReviewProgram/addReviewProgram",
+    method: "post",
+    data: data,
+  });
+}
diff --git a/src/api/cnas/systemManagement/measuresDealRisks.js b/src/api/cnas/systemManagement/measuresDealRisks.js
index 2649410..268b1a0 100644
--- a/src/api/cnas/systemManagement/measuresDealRisks.js
+++ b/src/api/cnas/systemManagement/measuresDealRisks.js
@@ -51,9 +51,7 @@
   return request({
     url: "/manageRiskAssessmentResults/exportHazardFactorIdentification",
     method: "get",
-    headers: {
-      responseType: "blob",
-    },
+    responseType: "blob",
     params: query,
   });
 }
@@ -108,9 +106,7 @@
   return request({
     url: "/manageControlPlanList/exportSignificantRiskFactors",
     method: "get",
-    headers: {
-      responseType: "blob",
-    },
+    responseType: "blob",
     params: query,
   });
 }
diff --git a/src/components/Table/lims-table.vue b/src/components/Table/lims-table.vue
index 05e1d85..bd77bc9 100644
--- a/src/components/Table/lims-table.vue
+++ b/src/components/Table/lims-table.vue
@@ -64,7 +64,8 @@
           <!-- 鎸夐挳 -->
           <div v-else-if="item.dataType == 'action'">
             <template v-for="(o, key) in item.operation">
-              <el-button v-if="o.type != 'upload'" size="mini" v-show="o.showHide ? o.showHide(scope.row) : true"
+              <el-button v-show="o.type != 'upload'" size="mini"
+                         v-if="o.showHide ? o.showHide(scope.row) : true"
                 :disabled="o.disabled ? o.disabled(scope.row) : false" :icon="iconFn(o)" :plain="o.plain"
                 :style="{ color: o.name === '鍒犻櫎' ? '#f56c6c' : o.color }" :type="o.type | typeFn(scope.row)"
                 @click="o.clickFun(scope.row)" :key="key">
@@ -79,7 +80,8 @@
                 :disabled="o.disabled ? o.disabled(scope.row) : false" :accept="o.accept
                   ? o.accept
                   : '.jpg,.jpeg,.png,.gif,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.zip,.rar'
-                  " v-if="o.type == 'upload'" style="display: inline-block; width: 50px"
+                  "
+                v-if="o.type == 'upload'" style="display: inline-block; width: 50px"
                 v-show="o.showHide ? o.showHide(scope.row) : true"
                 :headers="uploadHeader"
                 :on-error="onError"
diff --git a/src/utils/request.js b/src/utils/request.js
index 1a89ee8..dc2024b 100644
--- a/src/utils/request.js
+++ b/src/utils/request.js
@@ -36,6 +36,9 @@
       url = url.slice(0, -1);
       config.params = {};
       config.url = url;
+      config.headers["responseType"] = config.headers["responseType"]
+        ? config.headers["responseType"]
+        : ""; // 璁╂瘡涓姹傛惡甯﹁嚜瀹氫箟token 璇锋牴鎹疄闄呮儏鍐佃嚜琛屼慨鏀�
     }
     if (
       !isRepeatSubmit &&
diff --git a/src/views/CNAS/externalService/supplierManage/component/formDia.vue b/src/views/CNAS/externalService/supplierManage/component/formDia.vue
new file mode 100644
index 0000000..410ae63
--- /dev/null
+++ b/src/views/CNAS/externalService/supplierManage/component/formDia.vue
@@ -0,0 +1,188 @@
+<template>
+  <div>
+    <el-dialog :close-on-click-modal="false" :close-on-press-escape="false"
+               :title="operationType === 'edit' ? '缂栬緫' : '鏂板'"
+               :visible.sync="formDia"
+               width="90%" @close="closeDia">
+      <el-form :model="model" ref="modelForm" label-width="150px" :rules="rules">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="渚涘簲鍟�" prop="supplierName">
+              <el-input v-model="model.supplierName" placeholder="璇疯緭鍏�" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="缂栧彿" prop="supplierRef">
+              <el-input v-model="model.supplierRef" placeholder="璇疯緭鍏�" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="渚涘簲鍟嗙墿鍝佹湇鍔″悕绉�" prop="supplierItemServiceName">
+              <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="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="closeDia">鍙� 娑�</el-button>
+            <el-button type="primary" @click="submit" :loading="editLoad">淇� 瀛�</el-button>
+        </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  addSupplierManagement,
+  updateSupplierManagement
+} from '@/api/cnas/externalService/supplierManage/supplierManage'
+
+export default {
+  name: "formDia",
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      operationType: '',
+      formDia: false,
+      model: {
+        supplierName: '',
+        supplierRef: '',
+        supplierItemServiceName: '',
+        postalCode: '',
+        adress: '',
+        contacts: '',
+        phone: '',
+        householdName: '',
+        fax: '',
+        openingName: '',
+        website: '',
+        accountName: '',
+        email: '',
+        supplierManagementId: '',
+      },
+      rules: {
+        supplierName: [{ required: true, message: '璇疯緭鍏ヤ緵搴斿晢', trigger: 'blur' }],
+        supplierRef: [{ required: true, message: '璇疯緭鍏ヤ緵搴斿晢缂栧彿', trigger: 'blur' }],
+
+      },
+      editLoad: false,
+    }
+  },
+  mounted() {
+
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    openDialog (type, row) {
+      this.operationType = type
+      this.formDia = true
+      if (this.operationType === 'edit') {
+        this.model = this.HaveJson(row)
+      }
+    },
+    // 鎻愪氦琛ㄥ崟
+    submit () {
+      this.$refs.modelForm.validate((valid) => {
+        if (valid) {
+          this.editLoad = true
+          if (this.operationType === 'edit') {
+            updateSupplierManagement(this.model).then(res => {
+              this.editLoad = false
+              if (res.code === 200){
+                this.$message.success('淇敼鎴愬姛')
+                this.closeDia()
+              }
+            }).catch(err => {
+              console.log('err---', err);
+              this.editLoad = false
+            })
+          } else {
+            addSupplierManagement(this.model).then(res => {
+              this.editLoad = false
+              if (res.code === 200){
+                this.$message.success('鏂板鎴愬姛')
+                this.closeDia()
+              }
+            }).catch(err => {
+              console.log('err---', err);
+              this.editLoad = false
+            })
+          }
+        }
+      })
+    },
+    closeDia () {
+      this.$refs.modelForm.resetFields()
+      this.formDia = false
+      this.$emit('closeDia')
+    }
+  },
+}
+</script>
+
+<style scoped>
+</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..5480937
--- /dev/null
+++ b/src/views/CNAS/externalService/supplierManage/index.vue
@@ -0,0 +1,189 @@
+<template>
+  <div class="capacity-scope">
+    <div class="search">
+      <div>
+        <el-form :model="searchForm" ref="searchForm" size="small" :inline="true">
+          <el-form-item label="鍚嶇О" prop="supplierName">
+            <el-input v-model="searchForm.supplierName" clearable size="small"></el-input>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" icon="el-icon-search" size="mini" @click="getTableData">鏌� 璇�</el-button>
+            <el-button icon="el-icon-refresh" size="mini" @click="resetSearchForm">閲� 缃�</el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+      <div>
+        <el-button size="medium" @click="exportExcel">瀵� 鍑�</el-button>
+        <el-button size="medium" type="primary" @click="showDialog('add')">鏂� 澧�</el-button>
+      </div>
+    </div>
+    <div class="table">
+      <lims-table :tableData="tableData" :column="tableColumn" :height="'calc(100vh - 250px)'" @pagination="pagination"
+                  :page="page" :tableLoading="tableLoading"></lims-table>
+    </div>
+    <form-dia ref="formDia" v-if="formDia" @closeDia="closeDia"></form-dia>
+  </div>
+</template>
+
+<script>
+// import ZTTable from "../caorui/ZTTable/index.vue";
+// import TableCard from "../caorui/TableCard/index.vue";
+// import axios from "axios";
+import FormDia from "../supplierManage/component/formDia.vue";
+import limsTable from '@/components/Table/lims-table.vue'
+import {
+  selectQualifiedSupplierManagementPage,
+  exportSupplierManagement,
+  delSupplierManagement
+} from '@/api/cnas/externalService/supplierManage/supplierManage'
+
+export default {
+  name: "a6-supplier-manage-new",
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {
+    limsTable,
+    FormDia
+  },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      searchForm: {
+        supplierName: ''
+      },
+      tableLoading: false,
+      tableColumn: [
+        {
+          label: "渚涘簲鍟嗙紪鍙�",
+          prop: "supplierRef"
+        },
+        {
+          label: "渚涘簲鍟�",
+          prop: "supplierName"
+        },
+        {
+          label: "渚涘簲鐗╁搧(鏈嶅姟)鍚嶇О",
+          prop: "supplierItemServiceName"
+        },
+        {
+          label: "鍦板潃",
+          prop: "adress"
+        },
+        {
+          label: "鑱旂郴鐢佃瘽",
+          prop: "phone"
+        },
+        {
+          dataType: 'action',
+          fixed: "right",
+          minWidth: '60',
+          label: '鎿嶄綔',
+          operation: [
+            {
+              name: '缂栬緫',
+              type: 'text',
+              clickFun: (row) => {
+                this.showDialog('edit', row);
+              },
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              color: '#f56c6c',
+              clickFun: (row) => {
+                this.deleteRow(row);
+              },
+            }
+
+          ]
+        }
+      ],
+      tableData: [],
+      page: {
+        total: 0,
+        size: 10,
+        current: 1
+      },
+      formDia: false,
+    }
+  },
+  mounted() {
+    this.getTableData()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鑾峰彇琛ㄦ牸鏁版嵁
+    async getTableData() {
+      this.tableLoading = true;
+      selectQualifiedSupplierManagementPage(this.searchForm).then(res => {
+          this.tableLoading = false;
+          if(res.code === 200) {
+            this.tableData = res.data.records;
+            this.page.total = res.data.total
+          }
+      }).catch(err => {
+        this.tableLoading = false
+      })
+    },
+    // 閲嶇疆
+    resetSearchForm () {
+      this.pagination.current = 1
+      this.pagination.pageSize = 20
+      this.searchForm.supplierName = ''
+      this.getTableData()
+    },
+    // 鍒嗛〉鍒囨崲
+    pagination(page) {
+      this.page.size = page.limit
+      this.getTableData();
+    },
+    // 鎵撳紑鏂板寮规
+    showDialog(type, row) {
+      this.formDia = true
+      this.$nextTick(() => {
+        this.$refs.formDia.openDialog(type, row)
+      })
+    },
+    // 鍏抽棴寮规
+    closeDia () {
+      this.formDia = false
+      this.getTableData()
+    },
+    // 鍒犻櫎璁板綍
+    deleteRow (row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ枃浠�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        delSupplierManagement({supplierManagementId:row.supplierManagementId}).then(res => {
+          if (res.code === 200) {
+            this.$message.success('鍒犻櫎鎴愬姛锛�')
+            this.getTableData()
+          }
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+    // 瀵煎嚭excel
+    async exportExcel() {
+      exportSupplierManagement({deviceId:this.clickNodeVal.value}).then(res => {
+        const blob = new Blob([res], { type: 'application/octet-stream' });
+        this.$download.saveAs(blob, '鍚堟牸渚涘簲鍟�.xlsx')
+        this.$message.success('瀵煎嚭鎴愬姛')
+      })
+    }
+  },
+}
+</script>
+
+<style scoped>
+.search {
+  height: 46px;
+  display: flex;
+  justify-content: space-between;
+}
+</style>
diff --git a/src/views/CNAS/resourceDemand/standardMaterial/index.vue b/src/views/CNAS/resourceDemand/standardMaterial/index.vue
index 6483368..e75f44f 100644
--- a/src/views/CNAS/resourceDemand/standardMaterial/index.vue
+++ b/src/views/CNAS/resourceDemand/standardMaterial/index.vue
@@ -191,31 +191,8 @@
       exportOfStandardSubstanceList(this.searchForm).then(res =>{
         this.outLoading = false
         const blob = new Blob([res], {type: 'application/octet-stream'},false);
-        let reader = new FileReader();
-        reader.readAsText(blob, 'utf-8');
-        reader.onload = () => {
-          try {
-            let result = JSON.parse(reader.result);
-            if (result.message) {
-              this.$message.error(result.message);
-            } else {
-              const url = URL.createObjectURL(blob);
-              const link = document.createElement('a');
-              link.href = url;
-              link.download = '鏍囧噯鐗╄川娓呭崟.xlsx';
-              link.click();
-              this.$message.success('瀵煎嚭鎴愬姛')
-            }
-          } catch (err) {
-            console.log(err);
-            const url = URL.createObjectURL(blob);
-            const link = document.createElement('a');
-            link.href = url;
-            link.download = '鏍囧噯鐗╄川娓呭崟.xlsx';
-            link.click();
-            this.$message.success('瀵煎嚭鎴愬姛')
-          }
-        }
+        this.$download.saveAs(blob, '鏍囧噯鐗╄川娓呭崟.xlsx')
+        this.$message.success('瀵煎嚭鎴愬姛')
       })
     },
     // 鏌ヨ鍒楄〃
diff --git a/src/views/CNAS/systemManagement/documentControl/components/DistributionCollectionRecord.vue b/src/views/CNAS/systemManagement/documentControl/components/DistributionCollectionRecord.vue
index 1aba02d..0548ea4 100644
--- a/src/views/CNAS/systemManagement/documentControl/components/DistributionCollectionRecord.vue
+++ b/src/views/CNAS/systemManagement/documentControl/components/DistributionCollectionRecord.vue
@@ -394,33 +394,33 @@
       exportManageDocumentIssueRecycle(this.queryParams).then(res => {
         this.outLoading = false
         const blob = new Blob([res], { type: 'application/octet-stream' });
-        this.$download.saveAs(blob, '鍙戞斁鍥炴敹璁板綍.xlsx')
+        // this.$download.saveAs(blob, '鍙戞斁鍥炴敹璁板綍.xlsx')
         //灏咮lob 瀵硅薄杞崲鎴愬瓧绗︿覆
-        // let reader = new FileReader();
-        // reader.readAsText(blob, 'utf-8');
-        // reader.onload = () => {
-        //   try {
-        //     let result = JSON.parse(reader.result);
-        //     if (result.message) {
-        //       this.$message.error(result.message);
-        //     } else {
-        //       const url = URL.createObjectURL(blob);
-        //       const link = document.createElement('a');
-        //       link.href = url;
-        //       link.download = '鍙戞斁鍥炴敹璁板綍.xlsx';
-        //       link.click();
-        //       this.$message.success('瀵煎嚭鎴愬姛')
-        //     }
-        //   } catch (err) {
-        //     console.log(err);
-        //     const url = URL.createObjectURL(blob);
-        //     const link = document.createElement('a');
-        //     link.href = url;
-        //     link.download = '鍙戞斁鍥炴敹璁板綍.xlsx';
-        //     link.click();
-        //     this.$message.success('瀵煎嚭鎴愬姛')
-        //   }
-        // }
+        let reader = new FileReader();
+        reader.readAsText(blob, 'utf-8');
+        reader.onload = () => {
+          try {
+            let result = JSON.parse(reader.result);
+            if (result.message) {
+              this.$message.error(result.message);
+            } else {
+              const url = URL.createObjectURL(blob);
+              const link = document.createElement('a');
+              link.href = url;
+              link.download = '鍙戞斁鍥炴敹璁板綍.xlsx';
+              link.click();
+              this.$message.success('瀵煎嚭鎴愬姛')
+            }
+          } catch (err) {
+            console.log(err);
+            const url = URL.createObjectURL(blob);
+            const link = document.createElement('a');
+            link.href = url;
+            link.download = '鍙戞斁鍥炴敹璁板綍.xlsx';
+            link.click();
+            this.$message.success('瀵煎嚭鎴愬姛')
+          }
+        }
       })
     },
     changeFileList(e) {
diff --git a/src/views/CNAS/systemManagement/documentRecords/approvalRecord.vue b/src/views/CNAS/systemManagement/documentRecords/approvalRecord.vue
index 7e956bd..8431ad9 100644
--- a/src/views/CNAS/systemManagement/documentRecords/approvalRecord.vue
+++ b/src/views/CNAS/systemManagement/documentRecords/approvalRecord.vue
@@ -285,7 +285,7 @@
         this.outLoading = false
         if (res.code == 201) return this.$message.error('瀵煎嚭澶辫触')
         this.$message.success('瀵煎嚭鎴愬姛')
-        let url = this.javaApi + 'word/' + res.message
+        let url = this.javaApi + '/word/' + res.message
         this.$download.saveAs(url, '鏂囦欢瀹℃壒璁板綍')
       })
     },
diff --git a/src/views/CNAS/systemManagement/managementReview/components/managementFormDIa.vue b/src/views/CNAS/systemManagement/managementReview/components/managementFormDIa.vue
new file mode 100644
index 0000000..5f1d57a
--- /dev/null
+++ b/src/views/CNAS/systemManagement/managementReview/components/managementFormDIa.vue
@@ -0,0 +1,246 @@
+<template>
+  <div>
+    <el-dialog v-loading="diaLoading" :close-on-click-modal="false" :close-on-press-escape="false"
+      :visible.sync="formDia" title="绠$悊璇勫璁″垝" width="80%" @close="closeImplementDia">
+      <el-form ref="form" :model="form" :rules="rules" label-position="right" label-width="auto">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="璇勫鏃堕棿" prop="reviewTime">
+              <el-date-picker v-model="form.reviewTime" :disabled="operationType === 'ratify'" clearable
+                format="yyyy-MM-dd HH:mm:ss" placeholder="閫夋嫨鏃ユ湡" size="small" style="width: 100%" type="datetime"
+                value-format="yyyy-MM-dd HH:mm:ss">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="璇勫鍦扮偣" prop="judgingLocation">
+              <el-input v-model="form.judgingLocation" :disabled="operationType === 'ratify'" clearable
+                size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="璇勫鐩殑" prop="judgingPurpose">
+              <el-input v-model="form.judgingPurpose" :disabled="operationType === 'ratify'" clearable
+                size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="璇勫鏂瑰紡" prop="judgingMethod">
+              <el-input v-model="form.judgingMethod" :disabled="operationType === 'ratify'" clearable
+                size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="鍙傚姞浜哄憳" prop="participants">
+              <!-- <el-input v-model="form.participants" :disabled="operationType === 'ratify'" clearable size="small"></el-input> -->
+              <el-select v-model="form.participants" size="small" style="width: 100%;" filterable
+                :disabled="operationType === 'ratify'" clearable multiple>
+                <el-option v-for="item in personList" :key="item.value" :label="item.label" :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="璇勫鑼冨洿" prop="judgingScope">
+              <el-input v-model="form.judgingScope" :disabled="operationType === 'ratify'" clearable
+                size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="璇勫渚濇嵁" prop="judgingBasis">
+              <el-input v-model="form.judgingBasis" :disabled="operationType === 'ratify'" :rows="3" clearable
+                size="small" type="textarea"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="璇勫涓昏鍐呭" prop="mainContext">
+              <el-input v-model="form.mainContext" :disabled="operationType === 'ratify'" :rows="3" clearable
+                size="small" type="textarea"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="鍑嗗宸ヤ綔瑕佹眰" prop="preparationRequirements">
+              <el-input v-model="form.preparationRequirements" :disabled="operationType === 'ratify'" :rows="3"
+                clearable size="small" type="textarea"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="closeImplementDia">鍙� 娑�</el-button>
+        <el-button v-if="operationType === 'ratify'" :loading="loading" type="primary" @click="handleApproval(1)">鎵�
+          鍑�</el-button>
+        <el-button v-if="operationType !== 'ratify'" :loading="loading" type="primary" @click="handleEdit">鎻�
+          浜�</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog :visible.sync="approvalDialog" title="鎵瑰噯" width="30%" @close="approvalDialog = false">
+      <span>
+        鎵瑰噯澶囨敞锛�
+        <el-input v-model="qualityRemark" type="textarea"></el-input>
+      </span>
+      <span slot="footer" class="dialog-footer">
+        <el-button :loading="approvalLoading" @click="approvalDialog = false">鍙� 娑�</el-button>
+        <el-button :loading="approvalLoading" type="primary" @click="handleApproval(0)">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  addReviewProgram,
+  modifyReviewProgram,
+} from '@/api/cnas/systemManagement/managementReview.js'
+import { dateFormat } from '@/utils/date'
+import {
+  selectUserCondition,
+} from "@/api/business/inspectionTask.js";
+import { mapGetters } from "vuex";
+export default {
+  name: 'managementFormDIa',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      formDia: false,
+      diaLoading: false,
+      loading: false,
+      form: {
+        id: '',
+        reviewTime: '',
+        judgingLocation: '',
+        judgingPurpose: '',
+        judgingMethod: '',
+        participants: [],
+        judgingScope: '',
+        judgingBasis: '',
+        mainContext: '',
+        preparationRequirements: '',
+      },
+      rules: {
+        reviewTime: [{ required: true, message: '璇烽�夋嫨璇勫鏃堕棿', trigger: 'blur' }],
+        judgingLocation: [{ required: true, message: '璇峰~鍐欒瘎瀹″湴鐐�', trigger: 'blur' }],
+        judgingPurpose: [{ required: true, message: '璇峰~鍐欒瘎瀹$洰鐨�', trigger: 'blur' }],
+        judgingMethod: [{ required: true, message: '璇峰~鍐欒瘎瀹℃柟寮�', trigger: 'blur' }],
+        participants: [{ required: true, message: '璇峰~鍐欏弬鍔犱汉鍛�', trigger: 'change' }],
+        judgingScope: [{ required: true, message: '璇峰~鍐欒瘎瀹¤寖鍥�', trigger: 'blur' }],
+        judgingBasis: [{ required: true, message: '璇峰~鍐欒瘎瀹′緷鎹�', trigger: 'blur' }],
+        mainContext: [{ required: true, message: '璇峰~鍐欒瘎瀹′富瑕佸唴瀹�', trigger: 'blur' }],
+        preparationRequirements: [{ required: true, message: '璇峰~鍐欏噯澶囧伐浣滆姹�', trigger: 'blur' }],
+      },
+      operationType: '',
+      approvalDialog: false,
+      approvalLoading: false,
+      qualityRemark: '',
+      personList: [],
+    };
+  },
+  computed: {
+    ...mapGetters(['nickName'])
+  },
+  mounted() {
+    this.getAuthorizedPerson()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鎵撳紑寮规
+    openDia(type, row) {
+      this.formDia = true
+      this.operationType = type
+      if (type !== 'add') {
+        this.form = row
+        this.form.participants = row.participants ? row.participants.split(',').map(m => Number(m)) : []
+      }
+    },
+    // 鏌ヨ璇︽儏
+    // searchInfo (row) {
+    //   this.diaLoading = true
+    //   this.$axios(this.$api.internalReport.getInternalReportOne + '?reportId=' + row.reportId).then(res => {
+    //     this.diaLoading = false
+    //     if (res.code === 201) return
+    //     this.form = res.data
+    //   }).catch(err => {
+    //     console.log(err)
+    //     this.diaLoading = false
+    //   })
+    // },
+    // 鎻愪氦寮规鏁版嵁
+    handleEdit() {
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          this.loading = true
+          const internalReport = this.HaveJson(this.form)
+          internalReport.participants = internalReport.participants.join(',')
+          if (this.operationType === 'add') {
+            addReviewProgram(internalReport).then(res => {
+              this.loading = false
+              if (res.code === 201) return
+              this.$message.success('鎿嶄綔鎴愬姛')
+              this.closeImplementDia()
+            }).catch(err => {
+              console.log('err---', err);
+              this.loading = false
+            })
+          } else if (this.operationType === 'edit') {
+            modifyReviewProgram(internalReport).then(res => {
+              this.loading = false
+              if (res.code === 201) return
+              this.$message.success('鎿嶄綔鎴愬姛')
+              this.closeImplementDia()
+            }).catch(err => {
+              console.log('err---', err);
+              this.loading = false
+            })
+          }
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    // 鎻愪氦鎵瑰噯淇℃伅
+    handleApproval(qualityStatus) {
+      this.approvalLoading = true
+      const internalReport = this.HaveJson(this.form)
+      internalReport.approve = this.nickName
+      internalReport.approveDate = dateFormat(new Date())
+      internalReport.participants = internalReport.participants.join(',')
+      modifyReviewProgram(internalReport).then(res => {
+        if (res.code === 200) {
+          this.$message.success('鎻愪氦鎴愬姛锛�');
+          this.approvalDialog = false
+          this.closeImplementDia(this.departId);
+        }
+        this.approvalLoading = false
+      }).catch(() => {
+        this.approvalLoading = false
+      })
+    },
+    closeImplementDia() {
+      this.$refs.form.resetFields();
+      this.formDia = false
+      this.$emit('closeImplementDia')
+    },
+    getAuthorizedPerson() {
+      selectUserCondition().then(res => {
+        let data = []
+        res.data.forEach(a => {
+          data.push({
+            label: a.name,
+            value: a.id
+          })
+        })
+        this.personList = data
+      })
+    },
+  }
+};
+</script>
+
+<style scoped>
+>>>.el-dialog {
+  margin: 6vh auto 50px !important;
+}
+</style>
diff --git a/src/views/CNAS/systemManagement/managementReview/components/managementReviewPlan.vue b/src/views/CNAS/systemManagement/managementReview/components/managementReviewPlan.vue
new file mode 100644
index 0000000..db15a30
--- /dev/null
+++ b/src/views/CNAS/systemManagement/managementReview/components/managementReviewPlan.vue
@@ -0,0 +1,339 @@
+<template>
+  <div>
+    <div class="search-background">
+      <span class="search-group">
+        <span style="width: 160px">璇勫鍦扮偣锛�</span>
+        <el-input v-model="searchForm.judgingLocation" clearable size="small"></el-input>
+        <el-button size="medium" style="margin-left: 10px" @click="resetSearchForm">閲� 缃�</el-button>
+        <el-button size="medium" type="primary" @click="searchList">鏌� 璇�</el-button>
+      </span>
+      <span class="search-group">
+        <el-button size="medium" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button>
+      </span>
+    </div>
+    <div class="table">
+      <limsTable :column="tableColumn" :height="'calc(100vh - 23em)'" :table-data="tableData"
+        :table-loading="tableLoading" style="padding: 0 10px;margin-bottom: 16px" :page="page" @pagination="pagination">
+      </limsTable>
+    </div>
+    <management-form-d-ia v-if="managementFormDIa" ref="managementFormDIa"
+      @closeImplementDia="closeImplementDia"></management-form-d-ia>
+    <el-dialog :visible.sync="listDialogVisible" title="鏂囦欢鏌ョ湅" top="15vh" width="400px">
+      <div style="max-height:60vh;overflow-y: auto;">
+        <p v-for="(item, index) in fileList" :key="index">
+          <span>{{ item.fileName }}</span>
+          <el-button icon="el-icon-view" size="small" style="margin-left: 20px;" type="text"
+            @click="lookFile(item.url, item.fileName)">棰勮</el-button>
+          <el-button icon="el-icon-bottom" size="small" style="margin-left: 20px;" type="text"
+            @click="handleDown0(item.url, item.fileName)">涓嬭浇</el-button>
+        </p>
+      </div>
+    </el-dialog>
+    <el-dialog :visible.sync="lookDialogVisible" fullscreen title="鏌ョ湅闄勪欢" top="5vh" width="800px">
+      <filePreview v-if="lookDialogVisible" :currentFile="{}" :fileUrl="javaApi + '/word/' + currentInfo.url"
+        style="height: 90vh;overflow-y: auto;" />
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import limsTable from "@/components/Table/lims-table.vue";
+import ManagementFormDIa from './managementFormDIa.vue';
+import filePreview from "@/components/Preview/filePreview.vue";
+import {
+  addReviewProgramFile,
+  selectReviewProgramFile,
+  getPageReviewProgram,
+  deleteReviewProgram,
+  exportReviewProgram,
+} from '@/api/cnas/systemManagement/managementReview.js'
+
+export default {
+  name: 'managementReviewPlan',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { ManagementFormDIa, limsTable, filePreview },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      searchForm: {
+        judgingLocation: '',
+      },
+      listDialogVisible: false,
+      lookDialogVisible: false,
+      fileList: [],
+      currentInfo: {},
+      tableColumn: [
+        {
+          label: '璇勫鏃堕棿',
+          prop: 'reviewTime',
+        },
+        {
+          label: '璇勫鍦扮偣',
+          prop: 'judgingLocation',
+        },
+        {
+          label: '璇勫鐩殑',
+          prop: 'judgingPurpose',
+        },
+        {
+          label: '璇勫鏂瑰紡',
+          prop: 'judgingMethod',
+        },
+        {
+          label: '璇勫鑼冨洿',
+          prop: 'judgingScope',
+        },
+        // {
+        //   dataType: 'tag',
+        //   label: '鎵瑰噯鐘舵��',
+        //   prop: 'approve',
+        //   minWidth: '100',
+        //   formatData: (params) => {
+        //     if (params === 0) {
+        //       return '涓嶉�氳繃';
+        //     } else if (params === 1) {
+        //       return '閫氳繃';
+        //     } else {
+        //       return null;
+        //     }
+        //   },
+        //   formatType: (params) => {
+        //     if (params === 0) {
+        //       return 'danger';
+        //     } else if (params === 1) {
+        //       return 'success';
+        //     } else {
+        //       return null;
+        //     }
+        //   }
+        // },
+        {
+          dataType: 'action',
+          minWidth: '110',
+          label: '鎿嶄綔',
+          operation: [
+            {
+              name: '缂栬緫',
+              type: 'text',
+              clickFun: (row) => {
+                this.openFormDia('edit', row);
+              },
+              disabled: (row) => {
+                return !!row.approve
+              },
+            },
+            {
+              name: '涓婁紶',
+              type: 'upload',
+              multiple: true,
+              limit: 20,
+              accept: '.doc,.docx,.xls,.xlsx,.jpg,.jpeg,.png,.pdf',
+              clickFun: async (row, file, fileList) => {
+                const formData = new FormData();
+                formData.append('file', file.raw); // 鏂囦欢瀛楁
+                formData.append('id', row.id); // 鏂囦欢鍚嶅瓧娈�
+                let res = await addReviewProgramFile(formData)
+                if (res.code == 200) {
+                  this.$message({ message: '涓婁紶鎴愬姛', type: 'success' });
+                  // this.searchList()
+                  return
+                } else {
+                  this.$message({ message: '涓婁紶澶辫触', type: 'error' });
+                  return
+                }
+              },
+              disabled: (row) => {
+                return !!row.approve
+              },
+            },
+            {
+              name: '鏌ョ湅闄勪欢',
+              type: 'text',
+              clickFun: (row) => {
+                selectReviewProgramFile({ id: row.id }).then(res => {
+                  this.listDialogVisible = true;
+                  this.fileList = res.data.fileList
+                });
+              },
+            },
+            {
+              name: '鎵瑰噯',
+              type: 'text',
+              clickFun: (row) => {
+                this.openFormDia('ratify', row);
+              },
+              disabled: (row) => {
+                return !!row.approve
+              },
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              color: '#f56c6c',
+              clickFun: (row) => {
+                this.delPlan(row)
+              },
+              disabled: (row) => {
+                if (row.qualityStatus === 1) {
+                  return true
+                } else {
+                  return false
+                }
+              },
+            },
+            {
+              name: '涓嬭浇',
+              type: 'text',
+              clickFun: (row) => {
+                this.handleDown(row)
+              }
+            },
+          ]
+        }
+      ],
+      tableData: [],
+      tableLoading: false,
+      page: {
+        size: 20,
+        current: 1,
+        total: 0,
+      },
+      managementFormDIa: false,
+    };
+  },
+  mounted() {
+    this.searchList()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鏌ヨ鍒楄〃
+    searchList() {
+      this.tableLoading = true
+      getPageReviewProgram({
+        judgingLocation: this.searchForm.judgingLocation,
+        pages: this.page.current,
+        size: this.page.size
+      }).then(res => {
+        this.tableLoading = false
+        if (res.code === 201) return
+        this.tableData = res.data.records
+        this.page.total = res.data.total
+      }).catch(err => {
+        console.log('err---', err);
+        this.tableLoading = false
+      })
+    },
+    // 鏂板锛岀紪杈戯紝鎵瑰噯寮规
+    openFormDia(type, row) {
+      this.managementFormDIa = true
+      this.$nextTick(() => {
+        this.$refs.managementFormDIa.openDia(type, row)
+      })
+    },
+    closeImplementDia() {
+      this.managementFormDIa = false
+      this.searchList()
+    },
+    // 閲嶇疆鏌ヨ鏉′欢
+    resetSearchForm() {
+      this.searchForm.judgingLocation = '';
+      this.searchList()
+    },
+    // 鍒犻櫎
+    delPlan(row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.tableLoading = true
+        deleteReviewProgram({ id: row.id }).then(res => {
+          this.tableLoading = false
+          if (res.code === 201) return
+          this.$message.success('鍒犻櫎鎴愬姛')
+          this.searchList()
+        }).catch(err => {
+          this.tableLoading = false
+          console.log('err---', err);
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+    // 鍒嗛〉
+    pagination({ page, limit }) {
+      this.page.current = page;
+      this.page.size = limit;
+      this.searchList();
+    },
+    handleDown(row) {
+      exportReviewProgram({ id: row.id }).then(res => {
+        if (res.code == 201) {
+          this.$message.error(res.message)
+          return
+        }
+        const blob = new Blob([res], { type: 'application/octet-stream' });
+        //灏咮lob 瀵硅薄杞崲鎴愬瓧绗︿覆
+        let reader = new FileReader();
+        reader.readAsText(blob, 'utf-8');
+        reader.onload = () => {
+          try {
+            let result = JSON.parse(reader.result);
+            if (result.message) {
+              this.$message.error(result.message);
+            } else {
+              const url = URL.createObjectURL(blob);
+              const link = document.createElement('a');
+              link.href = url;
+              link.download = '璇勫璁″垝.docx';
+              link.click();
+              this.$download.saveAs(blob, name)
+              this.$message.success('瀵煎嚭鎴愬姛')
+            }
+          } catch (err) {
+            console.log(err);
+            const url = URL.createObjectURL(blob);
+            const link = document.createElement('a');
+            link.href = url;
+            link.download = '璇勫璁″垝.docx';
+            link.click();
+            this.$message.success('瀵煎嚭鎴愬姛')
+          }
+        }
+      })
+    },
+    lookFile(url, name) {
+      this.currentInfo.url = url
+      this.currentInfo.name = name
+      this.lookDialogVisible = true
+    },
+    handleDown0(url, name) {
+      if (!url) return this.$message.warning('鏂囦欢鏈笂浼�')
+      let url0 = this.javaApi + '/word/' + url
+      const link = document.createElement('a');
+      link.href = url0;
+      link.target = '_blank';
+      link.click();
+    }
+  }
+};
+</script>
+
+<style scoped>
+.search-background {
+  width: 100%;
+  height: 60px;
+  line-height: 60px;
+  display: flex;
+  justify-content: space-between;
+}
+
+.search-group {
+  display: flex;
+  align-items: center;
+  margin: 0 20px;
+}
+</style>
diff --git a/src/views/CNAS/systemManagement/managementReview/components/meetingRecords.vue b/src/views/CNAS/systemManagement/managementReview/components/meetingRecords.vue
new file mode 100644
index 0000000..819fa92
--- /dev/null
+++ b/src/views/CNAS/systemManagement/managementReview/components/meetingRecords.vue
@@ -0,0 +1,221 @@
+<template>
+  <div>
+    <div class="search-background">
+      <span class="search-group">
+        <span style="width: 160px">浼氳鍦扮偣锛�</span>
+        <el-input v-model="searchForm.place" clearable size="small"></el-input>
+        <el-button size="medium" style="margin-left: 10px" @click="resetSearchForm">閲� 缃�</el-button>
+        <el-button size="medium" type="primary" @click="searchList">鏌� 璇�</el-button>
+      </span>
+      <span class="search-group">
+        <el-button size="medium" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button>
+      </span>
+    </div>
+    <div class="table">
+      <limsTable :column="tableColumn" :height="'calc(100vh - 23em)'" :table-data="tableData"
+        :table-loading="tableLoading" style="padding: 0 10px;margin-bottom: 16px" :page="page" @pagination="pagination">
+      </limsTable>
+    </div>
+    <meeting-records-dia v-if="meetingRecordsDia" ref="meetingRecordsDia"
+      @closeYearDia="closeYearDia"></meeting-records-dia>
+  </div>
+</template>
+
+<script>
+import limsTable from "@/components/Table/lims-table.vue";
+import MeetingRecordsDia from './meetingRecordsDia.vue';
+import ManagementFormDIa from './managementFormDIa.vue';
+import {
+  getPageMeeting,
+  deleteMeeting,
+  exportMeeting,
+} from '@/api/cnas/systemManagement/managementReview.js'
+
+export default {
+  name: 'meetingRecords',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { ManagementFormDIa, MeetingRecordsDia, limsTable },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      searchForm: {
+        place: '',
+      },
+      tableColumn: [
+        {
+          label: '鏃堕棿',
+          prop: 'meetingTime',
+          minWidth: '100'
+        },
+        {
+          label: '涓绘寔浜�',
+          prop: 'compere',
+          minWidth: '100'
+        },
+        {
+          label: '浼氳鍦扮偣',
+          prop: 'place',
+          minWidth: '100'
+        },
+        {
+          label: '浼氳鍐呭鎽樿',
+          prop: 'content',
+          minWidth: '100'
+        },
+        {
+          dataType: 'action',
+          minWidth: '120',
+          label: '鎿嶄綔',
+          operation: [
+            {
+              name: '缂栬緫',
+              type: 'text',
+              clickFun: (row) => {
+                this.openFormDia('edit', row);
+              },
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              color: '#f56c6c',
+              clickFun: (row) => {
+                this.delPlan(row)
+              }
+            },
+            {
+              name: '涓嬭浇',
+              type: 'text',
+              clickFun: (row) => {
+                this.handleDown(row)
+              }
+            },
+          ]
+        }
+      ],
+      tableData: [],
+      tableLoading: false,
+      page: {
+        size: 20,
+        current: 1,
+        total: 0,
+      },
+      meetingRecordsDia: false
+    };
+  },
+  mounted() {
+    this.searchList()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鏌ヨ鍒楄〃
+    searchList() {
+      this.tableLoading = true
+      getPageMeeting({ place: this.searchForm.place, pages: this.page.current, size: this.page.size }).then(res => {
+        this.tableLoading = false
+        if (res.code === 201) return
+        this.tableData = res.data.records
+        this.page.total = res.data.total
+      }).catch(err => {
+        console.log('err---', err);
+        this.tableLoading = false
+      })
+    },
+    // 鏂板锛岀紪杈戝脊妗�
+    openFormDia(type, row) {
+      this.meetingRecordsDia = true
+      this.$nextTick(() => {
+        this.$refs.meetingRecordsDia.openDia(type, row)
+      })
+    },
+    closeYearDia() {
+      this.meetingRecordsDia = false
+      this.searchList()
+    },
+    // 閲嶇疆鏌ヨ鏉′欢
+    resetSearchForm() {
+      this.searchForm.place = '';
+      this.searchList()
+    },
+    // 鍒犻櫎
+    delPlan(row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.tableLoading = true
+        deleteMeeting({ id: row.id }).then(res => {
+          this.tableLoading = false
+          if (res.code === 201) return
+          this.$message.success('鍒犻櫎鎴愬姛')
+          this.searchList()
+        }).catch(err => {
+          this.tableLoading = false
+          console.log('err---', err);
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+    pagination({ page, limit }) {
+      this.page.current = page;
+      this.page.size = limit;
+      this.searchList();
+    },
+    handleDown(row) {
+      exportMeeting({ id: row.id }).then(res => {
+        if (res.code == 201) {
+          this.$message.error(res.message)
+          return
+        }
+        const blob = new Blob([res], { type: 'application/octet-stream' });
+        //灏咮lob 瀵硅薄杞崲鎴愬瓧绗︿覆
+        let reader = new FileReader();
+        reader.readAsText(blob, 'utf-8');
+        reader.onload = () => {
+          try {
+            let result = JSON.parse(reader.result);
+            if (result.message) {
+              this.$message.error(result.message);
+            } else {
+              const url = URL.createObjectURL(blob);
+              const link = document.createElement('a');
+              link.href = url;
+              link.download = '浼氳璁板綍.docx';
+              link.click();
+              this.$message.success('瀵煎嚭鎴愬姛')
+            }
+          } catch (err) {
+            console.log(err);
+            const url = URL.createObjectURL(blob);
+            const link = document.createElement('a');
+            link.href = url;
+            link.download = '浼氳璁板綍.docx';
+            link.click();
+            this.$message.success('瀵煎嚭鎴愬姛')
+          }
+        }
+      })
+    },
+  }
+};
+</script>
+
+<style scoped>
+.search-background {
+  width: 100%;
+  height: 60px;
+  line-height: 60px;
+  display: flex;
+  justify-content: space-between;
+}
+
+.search-group {
+  display: flex;
+  align-items: center;
+  margin: 0 20px;
+}
+</style>
diff --git a/src/views/CNAS/systemManagement/managementReview/components/meetingRecordsDia.vue b/src/views/CNAS/systemManagement/managementReview/components/meetingRecordsDia.vue
new file mode 100644
index 0000000..835e5e4
--- /dev/null
+++ b/src/views/CNAS/systemManagement/managementReview/components/meetingRecordsDia.vue
@@ -0,0 +1,158 @@
+<template>
+  <div>
+    <el-dialog v-loading="diaLoading" :close-on-click-modal="false" :close-on-press-escape="false"
+      :visible.sync="formDia" title="绠$悊璇勫浼氳璁板綍" width="1000px" @close="closeYearDia">
+      <el-form ref="form" :model="form" :rules="rules" label-position="top" label-width="auto">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鏃堕棿" prop="meetingTime">
+              <el-date-picker v-model="form.meetingTime" clearable format="yyyy-MM-dd HH:mm:ss" placeholder="閫夋嫨鏃ユ湡"
+                size="small" style="width: 100%" type="datetime" value-format="yyyy-MM-dd HH:mm:ss">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍦扮偣" prop="place">
+              <el-input v-model="form.place" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="涓绘寔浜�" prop="compere">
+              <el-input v-model="form.compere" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="浼氳鍐呭鎽樿" prop="content">
+              <el-input v-model="form.content" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="鍙備細浜哄憳" prop="participant">
+              <el-select v-model="form.participant" clearable filterable multiple placeholder="璇烽�夋嫨" size="small"
+                style="width: 100%;">
+                <el-option v-for="(item, i) in personList" :key="i" :label="item.label" :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="closeYearDia">鍙� 娑�</el-button>
+        <el-button :loading="loading" type="primary" @click="handleEdit">鎻� 浜�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  addMeeting,
+  modifyMeeting,
+} from '@/api/cnas/systemManagement/managementReview.js'
+import {
+  selectUserCondition,
+} from "@/api/business/inspectionTask.js";
+export default {
+  name: 'meetingRecordsDia',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      formDia: false,
+      diaLoading: false,
+      loading: false,
+      form: {
+        id: '',
+        meetingTime: '',
+        compere: '',
+        place: '',
+        content: '',
+        participant: [],
+      },
+      rules: {
+        meetingTime: [{ required: true, message: '璇峰~鍐欎細璁椂闂�', trigger: 'blur' }],
+        compere: [{ required: true, message: '璇峰~鍐欎富鎸佷汉', trigger: 'blur' }],
+        place: [{ required: true, message: '璇峰~鍐欏湴鐐�', trigger: 'blur' }],
+        content: [{ required: true, message: '璇峰~鍐欎細璁唴瀹规憳瑕�', trigger: 'blur' }],
+        participant: [{ required: true, message: '璇烽�夋嫨鍙傚姞浜哄憳', trigger: 'change' }],
+      },
+      operationType: '',
+      personList: []
+    };
+  },
+  mounted() {
+
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鎵撳紑寮规
+    openDia(type, row) {
+      this.operationType = type
+      this.getAuthorizedPerson()
+      if (type !== 'add') {
+        this.form = row
+        this.form.participant = row.participant.split(',').map(a => {
+          a = Number(a)
+          return a
+        })
+      }
+      this.formDia = true
+    },
+    // 鎻愪氦寮规鏁版嵁
+    handleEdit() {
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          this.loading = true
+          const internalMeeting = this.HaveJson(this.form)
+          internalMeeting.participant = internalMeeting.participant.join(',')
+          if (this.operationType === 'add') {
+            addMeeting(internalMeeting).then(res => {
+              this.loading = false
+              if (res.code === 201) return
+              this.$message.success('鎿嶄綔鎴愬姛')
+              this.closeYearDia()
+            }).catch(err => {
+              console.log('err---', err);
+              this.loading = false
+            })
+          } else if (this.operationType === 'edit') {
+            modifyMeeting(internalMeeting).then(res => {
+              this.loading = false
+              if (res.code === 201) return
+              this.$message.success('鎿嶄綔鎴愬姛')
+              this.closeYearDia()
+            }).catch(err => {
+              console.log('err---', err);
+              this.loading = false
+            })
+          }
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    closeYearDia() {
+      this.$refs.form.resetFields();
+      this.formDia = false
+      this.$emit('closeYearDia')
+    },
+    getAuthorizedPerson() {
+      selectUserCondition().then(res => {
+        let data = []
+        res.data.forEach(a => {
+          data.push({
+            label: a.name,
+            value: a.id
+          })
+        })
+        this.personList = data
+      })
+    },
+  }
+};
+</script>
+
+<style scoped></style>
diff --git a/src/views/CNAS/systemManagement/managementReview/components/reviewReport.vue b/src/views/CNAS/systemManagement/managementReview/components/reviewReport.vue
new file mode 100644
index 0000000..72a90bc
--- /dev/null
+++ b/src/views/CNAS/systemManagement/managementReview/components/reviewReport.vue
@@ -0,0 +1,291 @@
+<template>
+  <div>
+    <div class="search-background">
+      <span class="search-group">
+        <span style="width: 160px">鍦扮偣锛�</span>
+        <el-input v-model="searchForm.place" clearable size="small"></el-input>
+        <el-button size="medium" style="margin-left: 10px" @click="resetSearchForm">閲� 缃�</el-button>
+        <el-button size="medium" type="primary" @click="searchList">鏌� 璇�</el-button>
+      </span>
+      <span class="search-group">
+        <el-button size="medium" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button>
+      </span>
+    </div>
+    <div class="table">
+      <limsTable :column="tableColumn" :height="'calc(100vh - 23em)'" :table-data="tableData"
+        :table-loading="tableLoading" style="padding: 0 10px;margin-bottom: 16px" :page="page" @pagination="pagination">
+      </limsTable>
+    </div>
+    <review-report-dia v-if="reviewReportDia" ref="reviewReportDia" @closeYearDia="closeYearDia"></review-report-dia>
+  </div>
+</template>
+
+<script>
+import limsTable from "@/components/Table/lims-table.vue";
+import ReviewReportDia from './reviewReportDia.vue';
+import {
+  getPageReviewReport,
+  deleteReviewReport,
+  exportReviewReport,
+  modifyReviewReport,
+} from '@/api/cnas/systemManagement/managementReview.js'
+import { mapGetters } from "vuex";
+export default {
+  name: 'reviewReport',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { ReviewReportDia, limsTable },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      searchForm: {
+        place: '',
+      },
+      tableColumn: [
+        {
+          label: '鐩殑',
+          prop: 'objective',
+          minWidth: '100'
+        },
+        {
+          label: '鍦扮偣',
+          prop: 'place',
+          minWidth: '100'
+        },
+        {
+          label: '涓绘寔浜�',
+          prop: 'compere',
+          minWidth: '100'
+        },
+        {
+          label: '璁板綍浜�',
+          prop: 'recordPeople',
+          minWidth: '100'
+        },
+        {
+          label: '鏃ユ湡',
+          prop: 'date',
+          minWidth: '100'
+        },
+        {
+          label: '椤垫',
+          prop: 'page',
+          minWidth: '100'
+        },
+        {
+          label: '璇勫鏂瑰紡',
+          prop: 'judgingMethod',
+          minWidth: '100'
+        },
+        {
+          label: '璇勫渚濇嵁',
+          prop: 'reviewBasis',
+          minWidth: '100'
+        },
+        {
+          dataType: 'action',
+          minWidth: '160',
+          label: '鎿嶄綔',
+          operation: [
+            {
+              name: '缂栬緫',
+              type: 'text',
+              clickFun: (row) => {
+                this.openFormDia('edit', row);
+              },
+              disabled: (row) => {
+                return !!row.audit || !!row.approval
+              }
+            },
+            {
+              name: '瀹℃牳',
+              type: 'text',
+              clickFun: (row) => {
+                this.$confirm('纭畾瀹℃牳閫氳繃?', '鎻愮ず', {
+                  confirmButtonText: '纭畾',
+                  cancelButtonText: '鍙栨秷',
+                  type: 'warning'
+                }).then(() => {
+                  this.submit('audit', row)
+                }).catch(() => {
+                });
+              },
+              disabled: (row) => {
+                return !!row.audit
+              }
+            },
+            {
+              name: '鎵瑰噯',
+              type: 'text',
+              clickFun: (row) => {
+                this.$confirm('纭畾鎵瑰噯閫氳繃?', '鎻愮ず', {
+                  confirmButtonText: '纭畾',
+                  cancelButtonText: '鍙栨秷',
+                  type: 'warning'
+                }).then(() => {
+                  this.submit('approval', row)
+                }).catch(() => {
+                });
+              },
+              disabled: (row) => {
+                return !row.audit || !!row.approval
+              }
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              color: '#f56c6c',
+              clickFun: (row) => {
+                this.delPlan(row)
+              }
+            },
+            {
+              name: '涓嬭浇',
+              type: 'text',
+              clickFun: (row) => {
+                this.handleDown(row)
+              }
+            },
+          ]
+        }
+      ],
+      tableData: [],
+      tableLoading: false,
+      page: {
+        size: 20,
+        current: 1,
+        total: 0,
+      },
+      reviewReportDia: false,
+    };
+  },
+  computed: {
+    ...mapGetters(['nickName'])
+  },
+  mounted() {
+    this.searchList()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鏌ヨ鍒楄〃
+    searchList() {
+      this.tableLoading = true
+      getPageReviewReport({ place: this.searchForm.place, pages: this.page.current, size: this.page.size }).then(res => {
+        this.tableLoading = false
+        if (res.code === 201) return
+        this.tableData = res.data.records
+        this.page.total = res.data.total
+      }).catch(err => {
+        console.log('err---', err);
+        this.tableLoading = false
+      })
+    },
+    // 鏂板锛岀紪杈戝脊妗�
+    openFormDia(type, row) {
+      this.reviewReportDia = true
+      this.$nextTick(() => {
+        this.$refs.reviewReportDia.openDia(type, row)
+      })
+    },
+    closeYearDia() {
+      this.reviewReportDia = false
+      this.searchList()
+    },
+    // 閲嶇疆鏌ヨ鏉′欢
+    resetSearchForm() {
+      this.searchForm.place = '';
+      this.searchList()
+    },
+    // 鍒犻櫎
+    delPlan(row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.tableLoading = true
+        deleteReviewReport({ id: row.id }).then(res => {
+          this.tableLoading = false
+          if (res.code === 201) return
+          this.$message.success('鍒犻櫎鎴愬姛')
+          this.searchList()
+        }).catch(err => {
+          this.tableLoading = false
+          console.log('err---', err);
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+    pagination({ page, limit }) {
+      this.page.current = page;
+      this.page.size = limit;
+      this.searchList();
+    },
+    handleDown(row) {
+      exportReviewReport({ id: row.id }).then(res => {
+        if (res.code == 201) {
+          this.$message.error(res.message)
+          return
+        }
+        const blob = new Blob([res], { type: 'application/octet-stream' });
+        //灏咮lob 瀵硅薄杞崲鎴愬瓧绗︿覆
+        let reader = new FileReader();
+        reader.readAsText(blob, 'utf-8');
+        reader.onload = () => {
+          try {
+            let result = JSON.parse(reader.result);
+            if (result.message) {
+              this.$message.error(result.message);
+            } else {
+              const url = URL.createObjectURL(blob);
+              const link = document.createElement('a');
+              link.href = url;
+              link.download = '璇勫鎶ュ憡.docx';
+              link.click();
+              this.$message.success('瀵煎嚭鎴愬姛')
+            }
+          } catch (err) {
+            console.log(err);
+            const url = URL.createObjectURL(blob);
+            const link = document.createElement('a');
+            link.href = url;
+            link.download = '璇勫鎶ュ憡.docx';
+            link.click();
+            this.$message.success('瀵煎嚭鎴愬姛')
+          }
+        }
+      })
+    },
+    submit(type, row) {
+      let obj = row
+      obj[type] = this.nickNamee;
+      modifyReviewReport(obj).then(res => {
+        if (res.code === 201) return
+        this.$message.success('鎿嶄綔鎴愬姛')
+        this.searchList()
+      }).catch(err => {
+        console.log('err---', err);
+      })
+    }
+  }
+};
+</script>
+
+<style scoped>
+.search-background {
+  width: 100%;
+  height: 60px;
+  line-height: 60px;
+  display: flex;
+  justify-content: space-between;
+}
+
+.search-group {
+  display: flex;
+  align-items: center;
+  margin: 0 20px;
+}
+</style>
diff --git a/src/views/CNAS/systemManagement/managementReview/components/reviewReportDia.vue b/src/views/CNAS/systemManagement/managementReview/components/reviewReportDia.vue
new file mode 100644
index 0000000..b8afafc
--- /dev/null
+++ b/src/views/CNAS/systemManagement/managementReview/components/reviewReportDia.vue
@@ -0,0 +1,259 @@
+<template>
+  <div>
+    <el-dialog v-loading="diaLoading" :close-on-click-modal="false" :close-on-press-escape="false"
+      :visible.sync="formDia" title="绠$悊璇勫浼氳璁板綍" width="1000px" @close="closeYearDia">
+      <el-form ref="form" :model="form" :rules="rules" label-position="top" label-width="auto">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鐩殑" prop="objective">
+              <el-input v-model="form.objective" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍦扮偣" prop="place">
+              <el-input v-model="form.place" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="涓绘寔浜�" prop="compere">
+              <el-input v-model="form.compere" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="璁板綍浜�" prop="recordPeople">
+              <el-input v-model="form.recordPeople" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鏃ユ湡" prop="date">
+              <el-date-picker v-model="form.date" clearable format="yyyy-MM-dd HH:mm:ss" placeholder="閫夋嫨鏃ユ湡" size="small"
+                style="width: 100%" type="datetime" value-format="yyyy-MM-dd HH:mm:ss">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="椤垫" prop="page">
+              <el-input v-model="form.page" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="璇勫鏂瑰紡" prop="judgingMethod">
+              <el-input v-model="form.judgingMethod" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="璇勫渚濇嵁" prop="reviewBasis">
+              <el-input v-model="form.reviewBasis" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="鍑哄腑浜哄憳" prop="attendess">
+              <!-- <el-input v-model="form.attendess	" clearable size="small"></el-input> -->
+              <el-select v-model="form.attendess" size="small" style="width: 100%;" filterable clearable multiple>
+                <el-option v-for="item in personList" :key="item.value" :label="item.label" :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="璇勫杈撳叆鎯呭喌" prop="reviewInputs">
+              <el-input v-model="form.reviewInputs" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="璇勫杩囩▼姒傚喌" prop="reviewProcess">
+              <el-input v-model="form.reviewProcess" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="涓昏璁姒傝堪" prop="mainTopic">
+              <el-input v-model="form.mainTopic" :rows="5" clearable placeholder="璇疯緭鍏ュ唴瀹癸紝鍙緭鍏ュ嚑鍗冨瓧" size="small"
+                type="textarea">
+              </el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="浜嬮」" prop="matters">
+              <el-input v-model="form.matters" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="璐熻矗浜�" prop="head">
+              <el-input v-model="form.head" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="瀹屾垚鏃ユ湡" prop="completionDate">
+              <el-date-picker v-model="form.completionDate" clearable format="yyyy-MM-dd HH:mm:ss" placeholder="閫夋嫨鏃ユ湡"
+                size="small" style="width: 100%" type="datetime" value-format="yyyy-MM-dd HH:mm:ss">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="璺熻釜纭浜�" prop="trackingConfirmed">
+              <el-input v-model="form.trackingConfirmed" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="璺熻釜鎯呭喌纭璁板綍" prop="follerUp">
+              <el-input v-model="form.follerUp" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="浣撶郴璇勪环" prop="overallEvaluation">
+              <el-input v-model="form.overallEvaluation" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="closeYearDia">鍙� 娑�</el-button>
+        <el-button :loading="loading" type="primary" @click="handleEdit">鎻� 浜�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  addReviewReport,
+  modifyReviewReport,
+} from '@/api/cnas/systemManagement/managementReview.js'
+import {
+  selectUserCondition,
+} from "@/api/business/inspectionTask.js";
+export default {
+  name: 'reviewReportDia',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      formDia: false,
+      diaLoading: false,
+      loading: false,
+      form: {
+        id: '',
+        objective: '',
+        place: '',
+        compere: '',
+        recordPeople: '',
+        date: '',
+        page: '',
+        judgingMethod: '',
+        reviewBasis: '',
+        attendess: [],
+        reviewInputs: '',
+        reviewProcess: '',
+        mainTopic: '',
+        matters: '',
+        head: '',
+        completionDate: '',
+        trackingConfirmed: '',
+        follerUp: '',
+        overallEvaluation: '',
+      },
+      rules: {
+        objective: [{ required: true, message: '璇峰~鍐欑洰鐨�', trigger: 'blur' }],
+        place: [{ required: true, message: '璇峰~鍐欏湴鐐�', trigger: 'blur' }],
+        compere: [{ required: true, message: '璇峰~鍐欎富鎸佷汉', trigger: 'blur' }],
+        recordPeople: [{ required: true, message: '璇峰~鍐欒褰曚汉', trigger: 'blur' }],
+        date: [{ required: true, message: '璇烽�夋嫨鏃ユ湡', trigger: 'change' }],
+        completionDate: [{ required: true, message: '璇烽�夋嫨瀹屾垚鏃ユ湡', trigger: 'change' }],
+        page: [{ required: true, message: '璇峰~鍐欓〉娆�', trigger: 'blur' }],
+        judgingMethod: [{ required: true, message: '璇峰~鍐欒瘎瀹℃柟寮�', trigger: 'blur' }],
+        reviewBasis: [{ required: true, message: '璇峰~鍐欒瘎瀹′緷鎹�', trigger: 'blur' }],
+        attendess: [{ required: true, message: '璇峰~鍐欏嚭甯汉鍛�', trigger: 'change' }],
+        reviewInputs: [{ required: true, message: '璇峰~鍐欒瘎瀹¤緭鍏ユ儏鍐�', trigger: 'blur' }],
+        reviewProcess: [{ required: true, message: '璇峰~鍐欒瘎瀹¤緭鍏ユ儏鍐�', trigger: 'blur' }],
+        mainTopic: [{ required: true, message: '璇峰~鍐欎富瑕佽棰樻杩�', trigger: 'blur' }],
+        matters: [{ required: true, message: '璇峰~鍐欎富瑕佽棰樻杩�', trigger: 'blur' }],
+        head: [{ required: true, message: '璇峰~鍐欒礋璐d汉', trigger: 'blur' }],
+        trackingConfirmed: [{ required: true, message: '璇峰~鍐欒窡韪‘璁や汉', trigger: 'blur' }],
+        follerUp: [{ required: true, message: '璇峰~鍐欒窡韪‘璁や汉', trigger: 'blur' }],
+        overallEvaluation: [{ required: true, message: '璇峰~鍐欎綋绯昏瘎浠�', trigger: 'blur' }],
+      },
+      operationType: '',
+      personList: []
+    };
+  },
+  mounted() {
+
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鎵撳紑寮规
+    openDia(type, row) {
+      this.formDia = true
+      this.operationType = type
+      this.getAuthorizedPerson()
+      if (type !== 'add') {
+        this.form = row
+        this.form.attendess = this.form.attendess ? this.form.attendess.split(',').map(m => Number(m)) : []
+      }
+    },
+    // 鎻愪氦寮规鏁版嵁
+    handleEdit() {
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          this.loading = true
+          const internalMeeting = this.HaveJson(this.form)
+          internalMeeting.attendess = internalMeeting.attendess ? internalMeeting.attendess.join(',') : ''
+          if (this.operationType === 'add') {
+            addReviewReport(internalMeeting).then(res => {
+              this.loading = false
+              if (res.code === 201) return
+              this.$message.success('鎿嶄綔鎴愬姛')
+              this.closeYearDia()
+            }).catch(err => {
+              console.log('err---', err);
+              this.loading = false
+            })
+          } else if (this.operationType === 'edit') {
+            modifyReviewReport(internalMeeting).then(res => {
+              this.loading = false
+              if (res.code === 201) return
+              this.$message.success('鎿嶄綔鎴愬姛')
+              this.closeYearDia()
+            }).catch(err => {
+              console.log('err---', err);
+              this.loading = false
+            })
+          }
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    closeYearDia() {
+      this.$refs.form.resetFields();
+      this.formDia = false
+      this.$emit('closeYearDia')
+    },
+    getAuthorizedPerson() {
+      selectUserCondition().then(res => {
+        let data = []
+        res.data.forEach(a => {
+          data.push({
+            label: a.name,
+            value: a.id
+          })
+        })
+        this.personList = data
+      })
+    },
+  }
+};
+</script>
+
+<style scoped>
+>>>.el-dialog {
+  margin: 4vh auto 50px !important;
+}
+
+>>>.el-dialog__body {
+  max-height: 600px;
+  overflow-y: auto;
+}
+</style>
diff --git a/src/views/CNAS/systemManagement/managementReview/index.vue b/src/views/CNAS/systemManagement/managementReview/index.vue
new file mode 100644
index 0000000..9111484
--- /dev/null
+++ b/src/views/CNAS/systemManagement/managementReview/index.vue
@@ -0,0 +1,48 @@
+<template>
+  <div class="main">
+    <el-tabs v-model="activeName" class="tab-panel" type="border-card">
+      <el-tab-pane label="绠$悊璇勫璁″垝" name="yearPlan">
+        <management-review-plan></management-review-plan>
+      </el-tab-pane>
+      <el-tab-pane label="浼氳璁板綍" name="implementationPlan">
+        <meeting-records></meeting-records>
+      </el-tab-pane>
+      <el-tab-pane label="璇勫鎶ュ憡" name="meetingSignIn">
+        <review-report></review-report>
+      </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+
+<script>
+import ManagementReviewPlan from './components/managementReviewPlan.vue';
+import MeetingRecords from './components/meetingRecords.vue';
+import ReviewReport from './components/reviewReport.vue';
+
+export default {
+  name: 'a9-management-review',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { ReviewReport, MeetingRecords, ManagementReviewPlan },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      activeName: 'yearPlan',
+    };
+  },
+  mounted() {
+
+  },
+  // 鏂规硶闆嗗悎
+  methods: {}
+};
+</script>
+
+<style scoped>
+.main {
+  padding: 15px 0;
+}
+
+.tab-panel {
+  background: #fff;
+}
+</style>
diff --git a/src/views/business/finishedProductSampling/components/addQuarterItem.vue b/src/views/business/finishedProductSampling/components/addQuarterItem.vue
new file mode 100644
index 0000000..63e6888
--- /dev/null
+++ b/src/views/business/finishedProductSampling/components/addQuarterItem.vue
@@ -0,0 +1,296 @@
+<template>
+  <div>
+    <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :visible.sync="quarterSampleDia" title="瀛e害鎶芥牱" width="90%" @close="quarterSampleDia = false">
+      <div style="display: flex;align-items: center;justify-content: space-between;margin-bottom: 10px">
+        <div style="width: 30%;display: flex;align-items: center;" >
+          <span style="width: 50px">缂栧彿锛�</span>
+          <el-input v-model="quarterSampleForm.quarterNo" :disabled="operationType !== 'add'" size="small"></el-input>
+        </div>
+        <div v-if="operationType === 'add'">
+          <el-button size="small" type="primary" @click="addQuarter">娣诲姞</el-button>
+          <el-button size="small" type="danger" @click="clearTable">娓呯┖</el-button>
+        </div>
+      </div>
+      <div>
+        <el-table v-loading="tableLoading" :data="quarterItems" border height="420" style="width: 100%">
+          <el-table-column label="浜у搧绫诲瀷" prop="productType" width="200">
+            <template slot-scope="{row}">
+              <template>
+                <el-input v-model="row.productType" size="small"/>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column label="璐d换浜�" prop="dutyUser" width="100"></el-table-column>
+          <el-table-column label="鍨嬪彿" prop="productModel" width="120">
+            <template slot-scope="{row}">
+              <template>
+                <el-input v-model="row.productModel" size="small" :disabled="operationType === 'view'"/>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column label="鎶芥牱鏁伴噺" min-width="340" prop="spotCheckNumber">
+            <template slot-scope="{row}">
+              <template>
+                <el-input v-model="row.spotCheckNumber" size="small" :disabled="operationType === 'view'"/>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column v-if="operationType === 'add'" label="鏁伴噺" min-width="120" prop="number">
+            <template slot-scope="{row}">
+              <template>
+                <el-input v-model="row.number" size="small" :disabled="operationType === 'view'"/>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column v-if="operationType !== 'add'" label="鎶芥牱鏃堕棿" prop="spotCheckTime" width="160">
+            <template slot-scope="{row}">
+              <template>
+                <el-date-picker v-model="row.spotCheckTime"
+                                format="yyyy-MM-dd"
+                                :disabled="operationType === 'view'"
+                                placeholder="閫夋嫨鏃ユ湡"
+                                size="small"
+                                clearable
+                                style="width:100%"
+                                type="date"
+                                value-format="yyyy-MM-dd">
+                </el-date-picker>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column v-if="operationType !== 'add'" label="璇曟牱缁撹" prop="result" width="130">
+            <template v-slot="scope">
+              <el-select v-model="scope.row.result" placeholder="璇烽�夋嫨" size="small" clearable :disabled="operationType === 'view'">
+                <el-option label="鍚堟牸" value="鍚堟牸"></el-option>
+                <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�"></el-option>
+              </el-select>
+            </template>
+          </el-table-column>
+          <el-table-column v-if="operationType !== 'add'" label="鍙栨牱浜哄憳" prop="samplingUser" width="120">
+            <template slot-scope="{row}">
+              <template>
+                <el-input v-model="row.samplingUser" size="small" :disabled="operationType === 'view'"/>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column label="澶囨敞" prop="itemRemark" width="200">
+            <template slot-scope="{row}">
+              <template>
+                <el-input v-model="row.itemRemark" size="small" :disabled="operationType === 'view'"/>
+              </template>
+            </template>
+          </el-table-column>
+          <el-table-column v-if="operationType !== 'view'" fixed="right" label="鎿嶄綔" width="100">
+            <template slot-scope="scope">
+              <el-button size="small" style="color: #f56c6c" type="text" @click="deleteScope(scope.$index)">鍒犻櫎</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+      <div style="display: flex;align-items: center;margin: 10px 0">
+        <span style="width: 70px">澶囨敞锛�</span>
+        <el-input v-model="quarterSampleForm.remark" :disabled="operationType === 'view'" size="small" style="width: 43%" type="textarea"></el-input>
+      </div>
+      <div v-if="operationType !== 'add'">
+        <el-form ref="form" :model="editForm" label-width="70px">
+          <el-col :span="12">
+            <el-form-item label="缂栧埗浜猴細">
+              <el-select v-model="editForm.writeUser" :disabled="operationType !=='edit'" placeholder="璇烽�夋嫨" size="small" style="width: 100%">
+                <el-option v-for="item in userList" :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-select v-model="editForm.countersignUser" :disabled="operationType !=='edit'" multiple placeholder="璇烽�夋嫨" size="small" style="width: 100%">
+                <el-option v-for="item in userList" :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-select v-model="editForm.examineUser" :disabled="operationType !=='edit'" placeholder="璇烽�夋嫨" size="small" style="width: 100%">
+                <el-option v-for="item in userList" :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-select v-model="editForm.ratifyUser" :disabled="operationType !=='edit'" placeholder="璇烽�夋嫨" size="small" style="width: 100%">
+                <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-form>
+      </div>
+      <span v-if="operationType !== 'view'" slot="footer" class="dialog-footer">
+        <el-button v-if="operationType !== 'add'" @click="quarterSampleDia = false">鍙� 娑�</el-button>
+        <el-button v-if="operationType === 'add'" @click="quarterSampleDia = false">淇� 瀛�</el-button>
+        <el-button type="primary" @click="handleSample">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {addQuarter, getQuarter, updateQuarterOnOrder} from "@/api/business/finishedProductSampling";
+import {selectUserCondition} from "@/api/business/inspectionTask";
+import {mapGetters} from "vuex";
+
+export default {
+  name: "addQuarterItem",
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      tableLoading: false,
+      quarterSampleDia: false, // 瀛e害鎶芥牱寮规
+      quarterSampleForm: {
+        quarterNo: '', // 缂栧彿
+      },
+      quarterItems: [],
+      quarterTemItems: [],
+      operationType: '',
+      editForm: {
+        quarterId: '',
+        writeUser: '', // 缂栧埗浜�
+        countersignUser: [], // 浼氱浜�
+        examineUser: '', // 瀹℃牳浜�
+        ratifyUser: '', // 鎵瑰噯浜�
+      },
+      userList: [],
+      quarterRow: {},
+    }
+  },
+  computed: {
+    ...mapGetters(["nickName"]),
+  },
+  mounted() {
+    this.getUserList()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    openDia (quarterTemItems, type) {
+      this.quarterSampleDia = true
+      this.operationType = type
+      if (type === 'add') {
+        if (quarterTemItems.length > 0) {
+          this.quarterItems = quarterTemItems
+        }
+        this.quarterSampleForm.quarterNo = getCurrentMonthTwoDigits()
+      } else {
+        this.tableLoading = true
+        this.quarterRow = quarterTemItems
+        getQuarter({quarterId: quarterTemItems.quarterId}).then(res => {
+          this.tableLoading = false
+          if (res.code === 200) {
+            this.quarterItems = res.data.quarterItems
+            this.quarterSampleForm.quarterNo = res.data.quarterNo
+            this.quarterSampleForm.remark = res.data.remark
+            this.editForm.quarterId = res.data.quarterId
+            this.editForm.writeUser = res.data.writeUser
+            this.editForm.examineUser = res.data.examineUser
+            this.editForm.ratifyUser = res.data.ratifyUser
+            if (res.data.countersignUser) {
+              this.editForm.countersignUser = res.data.countersignUser.split(",").map(Number)
+            }
+          }
+        }).catch(err => {
+          this.tableLoading = false
+        })
+      }
+    },
+    // 鎵嬪姩娣诲姞
+    addQuarter () {
+      this.quarterItems.push({
+        productType: '',
+        dutyUser: this.nickName,
+        productModel: '',
+        spotCheckNumber: '',
+        number: '',
+        spotCheckTime: '',
+        result: '',
+        samplingUser: '',
+        itemRemark: '',
+      })
+    },
+    // 鎻愪氦瀛e害鎶芥牱
+    handleSample () {
+      this.$confirm('鏄惁鎻愪氦璇ユ暟鎹�', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        if (this.operationType === 'add') {
+          this.quarterSampleForm.quarterItems = JSON.parse(JSON.stringify(this.quarterItems))
+          this.quarterSampleForm.quarterItems.forEach(item => {
+            item.spotCheckNumber = item.spotCheckNumber + ' ' + (item.number == null ? "" : item.number)
+          })
+          addQuarter(this.quarterSampleForm).then(res => {
+            if (res.code == 200) {
+              this.$message.success('鎻愪氦鎴愬姛')
+              this.quarterItems = []
+              this.$parent.quarterTemItems = []
+              this.closeQuarterSampleDia()
+            }
+          })
+        } else {
+          const params = {...this.editForm}
+          if (params.countersignUser.length > 0) {
+            params.countersignUser = params.countersignUser.join(',')
+          } else {
+            params.countersignUser = ''
+          }
+          params.quarterItems = JSON.parse(JSON.stringify(this.quarterItems))
+          updateQuarterOnOrder(params).then(res => {
+            if (res.code == 200) {
+              this.$message.success('鎻愪氦鎴愬姛')
+              this.quarterItems = []
+              this.closeQuarterSampleDia()
+            }
+          })
+        }
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑�'
+        });
+      });
+
+    },
+    // 娓呯┖鎶芥牱璁″垝
+    clearTable () {
+      this.quarterItems = []
+      this.$parent.quarterTemItems = []
+    },
+    // 鎵嬪姩鍒犻櫎
+    deleteScope (index) {
+      this.quarterItems.splice(index, 1)
+    },
+    // 鍏抽棴瀛e害鎶芥牱寮规
+    closeQuarterSampleDia () {
+      this.quarterSampleDia = false
+      if (this.operationType === 'add') {
+        this.$parent.handleStockList()
+      } else {
+        this.$parent.refreshTable('page')
+      }
+    },
+    getUserList(){
+      selectUserCondition({ type: 0 }).then((res) => {
+        this.userList = res.data;
+      })
+    },
+  },
+}
+function getCurrentMonthTwoDigits() {
+  const currentDate = new Date();
+  const year = currentDate.getFullYear();
+  const currentMonth = currentDate.getMonth() + 1;
+  return year + currentMonth.toString().padStart(2, '0');
+}
+</script>
+
+<style scoped>
+</style>
diff --git a/src/views/business/finishedProductSampling/index.vue b/src/views/business/finishedProductSampling/index.vue
new file mode 100644
index 0000000..b4f9986
--- /dev/null
+++ b/src/views/business/finishedProductSampling/index.vue
@@ -0,0 +1,448 @@
+<!--鎴愬搧鎶芥牱椤甸潰-->
+<template>
+  <div style="padding: 10px 0">
+    <div class="card">
+      <div class="title">
+        <el-button size="small" type="primary" @click="addTemQuarter">鏂板</el-button>
+        <el-button size="small" type="primary" @click="quarterSample">瀛e害鎶芥牱</el-button>
+        <el-button size="small" type="primary" @click="handleStockList">鍒锋柊</el-button>
+      </div>
+      <el-table
+        ref="finishedproducttransferTable"
+        v-loading="tableLoading"
+        :data="stockList"
+        :header-cell-style="lineSideWarehouseTableHeaderCellStyle"
+        :row-class-name="lineSideWarehouseTableRowClassName"
+        class="finishedproducttransfer-table"
+        height="calc(100vh - 240px)"
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="45"></el-table-column>
+        <el-table-column
+          :show-overflow-tooltip="true"
+          align="center"
+          label="瀹㈡埛璁㈠崟缂栧彿"
+          prop="customerOrderNo"
+          width="140"
+        >
+          <template slot="header" slot-scope="scope">
+            <div style="line-height: 14px;margin-bottom: 6px">瀹㈡埛璁㈠崟缂栧彿</div>
+            <div class="th" @click.stop>
+              <el-input
+                v-model="queryParamOne.customerOrderNo"
+                clearable
+                size="mini"
+                type="text"
+                @clear="handleStockList"
+                @keyup.enter.native="handleStockList"
+              ></el-input>
+            </div>
+          </template>
+          <template slot-scope="scope">
+            <span>{{ scope.row.customerOrderNo }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="鎴愬搧闆朵欢鍙�"
+          prop="partNo"
+          width="140"
+        >
+          <template slot="header" slot-scope="scope">
+            <div style="line-height: 14px;margin-bottom: 6px">鎴愬搧闆朵欢鍙�</div>
+            <div class="th" @click.stop>
+              <el-input
+                v-model="queryParamOne.partNo"
+                clearable
+                size="mini"
+                type="text"
+                @clear="handleStockList"
+                @keyup.enter.native="handleStockList"
+              ></el-input>
+            </div>
+          </template>
+          <template slot-scope="scope">
+            <span>{{ scope.row.partNo }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="闆朵欢鍚嶇О"
+          prop="partName"
+          width="140"
+        >
+          <template slot="header" slot-scope="scope">
+            <div style="line-height: 14px;margin-bottom: 6px">闆朵欢鍚嶇О</div>
+            <div class="th" @click.stop>
+              <el-input
+                v-model="queryParamOne.partName"
+                clearable
+                size="mini"
+                type="text"
+                @clear="handleStockList"
+                @keyup.enter.native="handleStockList"
+              ></el-input>
+            </div>
+          </template>
+          <template slot-scope="scope">
+            <span>{{ scope.row.partName }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          :show-overflow-tooltip="true"
+          align="center"
+          label="浠撳簱"
+          prop="warehouseName"
+          width="140"
+        >
+          <template slot="header" slot-scope="scope">
+            <div style="line-height: 14px;margin-bottom: 6px">浠撳簱</div>
+            <div class="th" @click.stop>
+              <el-input
+                v-model="queryParamOne.warehouseName"
+                clearable
+                size="mini"
+                type="text"
+                @clear="handleStockList"
+                @keyup.enter.native="handleStockList"
+              ></el-input>
+            </div>
+          </template>
+          <template slot-scope="scope">
+            <span>{{ scope.row.warehouseName }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          :show-overflow-tooltip="true"
+          align="center"
+          label="搴撲綅鍙�"
+          prop="locationNo"
+          width="140"
+        >
+          <template slot="header" slot-scope="scope">
+            <div style="line-height: 14px;margin-bottom: 6px">搴撲綅鍙�</div>
+            <div class="th" @click.stop>
+              <el-input
+                v-model="queryParamOne.locationNo"
+                clearable
+                size="mini"
+                type="text"
+                @clear="handleStockList"
+                @keyup.enter.native="handleStockList"
+              ></el-input>
+            </div>
+          </template>
+          <template slot-scope="scope">
+            <span>{{ scope.row.locationNo }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          :show-overflow-tooltip="true"
+          align="center"
+          label="搴撲綅鍚嶇О"
+          prop="locationName"
+          width="140"
+        >
+          <template slot="header" slot-scope="scope">
+            <div style="line-height: 14px;margin-bottom: 6px">搴撲綅鍚嶇О</div>
+            <div class="th" @click.stop>
+              <el-input
+                v-model="queryParamOne.locationName"
+                clearable
+                size="mini"
+                type="text"
+                @clear="handleStockList"
+                @keyup.enter.native="handleStockList"
+              ></el-input>
+            </div>
+          </template>
+          <template slot-scope="scope">
+            <span>{{ scope.row.locationName }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="鎵规鍙�"
+          prop="partBatchNo"
+          width="140"
+        >
+          <template slot="header" slot-scope="scope">
+            <div style="line-height: 14px;margin-bottom: 6px">鎵规鍙�</div>
+            <div class="th" @click.stop>
+              <el-input
+                v-model="queryParamOne.partBatchNo"
+                clearable
+                size="mini"
+                type="text"
+                @clear="handleStockList"
+                @keyup.enter.native="handleStockList"
+              ></el-input>
+            </div>
+          </template>
+          <template slot-scope="scope">
+            <span>{{ scope.row.partBatchNo }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="鍏ュ簱鏉ユ簮"
+          prop="inSource"
+          width="140"
+        >
+          <template slot="header" slot-scope="scope">
+            <div style="line-height: 14px;margin-bottom: 6px">鍏ュ簱鏉ユ簮</div>
+            <div class="th" @click.stop>
+              <el-input
+                v-model="queryParamOne.inSource"
+                clearable
+                size="mini"
+                type="text"
+                @clear="handleStockList"
+                @keyup.enter.native="handleStockList"
+              ></el-input>
+            </div>
+          </template>
+          <template slot-scope="scope">
+            <span>{{ scope.row.inSource }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="澶栨姢棰滆壊"
+          prop="outerColor"
+          width="140"
+        >
+          <template slot="header" slot-scope="scope">
+            <div style="line-height: 14px;margin-bottom: 6px">澶栨姢棰滆壊</div>
+            <div class="th" @click.stop>
+              <el-input
+                v-model="queryParamOne.outerColor"
+                clearable
+                size="mini"
+                type="text"
+                @clear="handleStockList"
+                @keyup.enter.native="handleStockList"
+              ></el-input>
+            </div>
+          </template>
+          <template slot-scope="scope">
+            <span>{{ scope.row.outerColor }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="搴撳瓨鏁伴噺"
+          prop="stockQuantity"
+          width="140"
+        >
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="鍙敤搴撳瓨鏁伴噺"
+          prop="availableStockQuantity"
+          width="140"
+        >
+          <template slot-scope="scope">
+            <span>{{ scope.row.availableStockQuantity }}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="pagin-page" style="margin-top: 0;margin-bottom: 0;">
+        <el-pagination
+          background
+          :current-page="queryReport.current"
+          :page-size="queryReport.size"
+          :page-sizes="[10, 15, 20, 50, 100]"
+          :total="queryReport.total"
+          layout="total, sizes, prev, pager, next, jumper"
+          style="text-align:right;padding: 20px 16px;"
+          @size-change="handleSizeChangeReport"
+          @current-change="handleCurrentChangeReport"
+        >
+        </el-pagination>
+      </div>
+    </div>
+    <add-quarter-item ref="addQuarterItem"></add-quarter-item>
+  </div>
+</template>
+
+<script>
+
+import AddQuarterItem from "./components/addQuarterItem.vue";
+import {getIfsStock} from "@/api/business/finishedProductSampling";
+import {mapGetters} from "vuex";
+
+export default {
+  data() {
+    return {
+      stockList: [],
+      queryParamOne: {
+        partNo: null,
+        partName: null,
+        warehouseName: null,
+        locationName: null,
+        locationNo: null,
+        partBatchNo: null,
+        stockQuantity: null,
+        availableStockQuantity: null,
+        outerColor: null,
+        customerOrderNo: null,
+        inSource: null,
+      },
+      queryReport: {
+        current: 1,
+        size: 20,
+        total: 0
+      },
+      tableLoading: false,
+      multipleSelection: [], // table鎵�閫変腑鐨勫璞�
+      showEditForm: false,
+      showMoveForm: false,
+      showMoveAllForm: false,
+      erpfinishstock: {},
+      isAvaliable: false,
+      isPackage: false,
+      quarterTemItems: [],
+      operationType: ''
+    }
+  },
+  components: {AddQuarterItem},
+  mounted() {
+    this.getIfsStock()
+  },
+  updated() {
+    this.$nextTick(() => {
+      this.$refs.finishedproducttransferTable.doLayout()
+    })
+  },
+  computed: {
+    ...mapGetters(["nickName"]),
+  },
+  methods: {
+    // 瀛e害鎶芥牱
+    quarterSample () {
+      this.$refs.addQuarterItem.openDia(this.quarterTemItems, 'add')
+    },
+    addTemQuarter () {
+      if (this.multipleSelection.length > 0) {
+        const multipleSelection = JSON.parse(JSON.stringify(this.multipleSelection))
+        if (multipleSelection.length > 0) {
+          multipleSelection.forEach(item => {
+            if (item.partName.includes(' ')) {
+              const list = item.partName.match(/^(\S+)\s(.*)/).slice(1)
+              console.log('list', list)
+              item.productType = list[0]
+              item.spotCheckNumber = list[1]
+            }
+            item.dutyUser = this.nickName
+            item.itemRemark = item.partBatchNo;
+            this.quarterTemItems.push(item)
+          })
+        }
+        this.$message.success('鏆傚瓨鎴愬姛')
+        this.$refs.finishedproducttransferTable.clearSelection()
+      } else {
+        this.$message.warning('璇烽�夋嫨鏁版嵁')
+      }
+    },
+    // 鑾峰彇鏁版嵁鍒楄〃
+    getIfsStock() {
+      this.tableLoading = true
+      this.stockList = []
+      const newReqParam = this.getFinalParam()
+      getIfsStock(newReqParam)
+        .then((response) => {
+          const resData = response.data
+          this.queryReport.total = resData.total
+          const resStockList = resData.data
+          resStockList.forEach((item) => {
+            this.stockList.push({
+              partNo: item.PART_NO,
+              partName: item.PART_DESC,
+              warehouseName: item.WAREHOUSE_ID,
+              locationName: item.LOCATION_DESC,
+              locationNo: item.LOCATION_NO,
+              partBatchNo: item.LOT_BATCH_NO,
+              stockQuantity: item.QTY_ONHAND,
+              availableStockQuantity: item.QTY_AVAILABLE,
+              outerColor: item.ATTR4,
+              customerOrderNo: item.ATTR6,
+              inSource: item.ATTR23,
+            })
+          })
+          this.tableLoading = false
+        })
+        .catch(() => {
+          this.tableLoading = false
+        })
+    },
+    getFinalParam() {
+      const newReqParam = {
+        partNo: this.queryParamOne.partNo,
+        partDescription: this.queryParamOne.partName,
+        warehouse: this.queryParamOne.warehouseName
+          ? this.queryParamOne.warehouseName + '%'
+          : null,
+        locDesc: this.queryParamOne.locationName,
+        locNo: this.queryParamOne.locationNo,
+        lotBatchNo: this.queryParamOne.partBatchNo,
+        quantityFlag: this.queryParamOne.stockQuantity,
+        outerColor: this.queryParamOne.outerColor,
+        otcOrderNo: this.queryParamOne.customerOrderNo,
+        availableStockQuantity: this.queryParamOne.availableStockQuantity,
+        inSource: this.queryParamOne.inSource,
+        page: this.queryReport.current,
+        limit: this.queryReport.size
+      }
+      return newReqParam
+    },
+    lineSideWarehouseTableHeaderCellStyle({row, column, rowIndex, columnIndex}) {
+      let headerStyle = 'background:#FAFAFA;color:#666;'
+      if (columnIndex === 0) {
+        headerStyle += 'border-radius: 6px 0px 0px 0px;'
+      } else if (columnIndex === 13) {
+        headerStyle += 'border-radius: 0px 6px 0px 0px;'
+      }
+      return headerStyle
+    },
+    lineSideWarehouseTableRowClassName({ row, rowIndex }) {
+      if (rowIndex % 2 === 1) {
+        return 'stripe-row'
+      } else {
+        return ''
+      }
+    },
+    handleSizeChangeReport(val) {
+      this.queryReport.size = val
+      this.queryReport.current = 1
+      this.getIfsStock()
+    },
+    handleCurrentChangeReport(val) {
+      this.queryReport.current = val
+      this.getIfsStock()
+    },
+    handleStockList() {
+      this.queryReport.current = 1
+      this.getIfsStock()
+    },
+    handleSelectionChange(val) {
+      this.multipleSelection = val
+    }
+  }
+}
+</script>
+
+<style scoped>
+>>>.el-table__header {
+  height: 70px;
+}
+.card {
+  height: calc(100% - 40px);
+  background: #ffffff;
+  padding: 10px;
+}
+.title {
+  text-align: right;
+  margin-bottom: 10px;
+}
+</style>
diff --git a/src/views/performance/manHour/workTimeConfig.vue b/src/views/performance/manHour/workTimeConfig.vue
index 5364c89..4fcad16 100644
--- a/src/views/performance/manHour/workTimeConfig.vue
+++ b/src/views/performance/manHour/workTimeConfig.vue
@@ -30,8 +30,8 @@
         v-if="checkPermi(['performance:manHour:workTimeConfig:add'])">鏂� 澧�</el-button>
     </div>
     <div class="table">
-      <lims-table :tableData="tableData" :column="column" :page="page" :tableLoading="tableLoading"
-        :height="'calc(100vh - 290px)'" @pagination="pagination"></lims-table>
+      <lims-table :tableData="tableData" :column="column" :tableLoading="tableLoading" :height="'calc(100vh - 290px)'"
+        :page="page" @pagination="pagination"></lims-table>
     </div>
     <!-- 鏂板/缂栬緫 -->
     <el-dialog :title="title" :visible.sync="timeDia" width="500px">
diff --git a/src/views/standard/standardLibrary/index.vue b/src/views/standard/standardLibrary/index.vue
index 4ead05c..180ad2c 100644
--- a/src/views/standard/standardLibrary/index.vue
+++ b/src/views/standard/standardLibrary/index.vue
@@ -212,10 +212,10 @@
             <el-col :class="{ sort: node.level > 3 }" :span="19" :title="data.label" style="text-align: left">
               <span>
                 <i :class="`node_i ${data.children != undefined
-                    ? data.code === '[1]'
-                      ? 'el-icon-folder-opened'
-                      : 'el-icon-folder'
-                    : 'el-icon-tickets'
+                  ? data.code === '[1]'
+                    ? 'el-icon-folder-opened'
+                    : 'el-icon-folder'
+                  : 'el-icon-tickets'
                   }`"></i>
                 {{ data.label }}
               </span>
@@ -225,7 +225,7 @@
               (node.data.children === null ||
                 node.data.children === undefined)
             " :span="2" style="text-align: right">
-              <el-button size="mini" type="text" @click="editTreeName(node.data)">
+              <el-button size="mini" type="text" @click.stop="editTreeName(node.data)">
                 <i class="el-icon-edit"></i>
               </el-button>
             </el-col>
@@ -286,8 +286,8 @@
             <template slot-scope="scope">
               <el-input v-if="
                 checkPermi(['standard:standardLibrary:upStandardProduct'])
-              " v-model="scope.row.ask" :autosize="{ minRows: 1, maxRows: 3 }" clearable placeholder="瑕佹眰鍊�"
-                size="small" type="textarea" @change="(value) => upStandardProductList(value, scope.row.id)"></el-input>
+              " v-model="scope.row.ask" :autosize="{ minRows: 1, maxRows: 3 }" clearable placeholder="瑕佹眰鍊�" size="small"
+                type="textarea" @change="(value) => upStandardProductList(value, scope.row.id)"></el-input>
               <span v-else>{{ scope.row.ask }}</span>
             </template>
           </el-table-column>
@@ -306,7 +306,7 @@
               <el-select v-if="
                 checkPermi(['standard:standardLibrary:upStandardProduct'])
               " v-model="scope.row.methodS" clearable placeholder="璇曢獙鏂规硶" size="small" @change="(value) => upStandardProductListOfMethodS(value, scope.row.id)
-                  ">
+                ">
                 <el-option v-for="(a, i) in scope.row.method &&
                   JSON.parse(scope.row.method)" :key="i" :label="a" :value="a"></el-option>
               </el-select>
@@ -318,7 +318,7 @@
               <el-select v-if="
                 checkPermi(['standard:standardLibrary:upStandardProduct'])
               " v-model="scope.row.radius" clearable placeholder="鏉′欢" size="small" @change="(value) => upStandardProductListOfRadius(value, scope.row.id)
-                  ">
+                ">
                 <el-option v-for="(a, i) in scope.row.radiusList &&
                   JSON.parse(scope.row.radiusList)" :key="i" :label="a" :value="a"></el-option>
               </el-select>
@@ -331,7 +331,7 @@
               <el-input v-if="
                 checkPermi(['standard:standardLibrary:upStandardProduct'])
               " v-model="scope.row.price" placeholder="鍗曚环(鍏�)" size="small" @change="(value) => upStandardProductListOfPrice(value, scope.row.id)
-                  ">
+                ">
               </el-input>
               <span v-else>{{ scope.row.price }}</span>
             </template>
@@ -341,7 +341,7 @@
               <el-input v-if="
                 checkPermi(['standard:standardLibrary:upStandardProduct'])
               " v-model="scope.row.manHour" placeholder="鍗曚环(鍏�)" size="small" @change="(value) => upStandardProductListOfManHour(value, scope.row.id)
-                  ">
+                ">
               </el-input>
               <span v-else>{{ scope.row.manHour }}</span>
             </template>
@@ -351,7 +351,7 @@
             <template slot-scope="scope">
               <el-select v-model="scope.row.templateId" :disabled="!checkPermi(['standard:standardLibrary:upStandardProduct'])
                 " filterable size="small" @change="(value) =>
-                    upStandardProductListOfTemplate(value, scope.row.id)
+                  upStandardProductListOfTemplate(value, scope.row.id)
                   ">
                 <el-option v-for="(a, ai) in templateList" :key="ai" :label="a.name" :value="a.id"></el-option>
               </el-select>
@@ -367,10 +367,10 @@
             </template>
           </el-table-column>
         </el-table>
-        <el-pagination :current-page="currentPage" :page-size="300" :total="total"
-          layout="total, prev, pager, next, jumper" style="position: absolute; right: 16px; bottom: 1px"
-          @current-change="handleCurrentChange">
-        </el-pagination>
+        <!-- <el-pagination :current-page="currentPage" :page-size="300" :total="total" layout="total"
+          style="position: absolute; right: 16px; bottom: 1px" @current-change="handleCurrentChange">
+        </el-pagination> -->
+        <p style="text-align: right;margin-right: 20px;color: #333;">鍏眥{ total }}鏉�</p>
       </el-row>
     </div>
 
@@ -897,7 +897,8 @@
             return;
           }
           this.$message.success("娣诲姞鎴愬姛");
-          this.selectStandardTreeList();
+          this.$tab.refreshPage();
+          // this.selectStandardTreeList();
           this.updateDia = false;
           this.updateLoad = false;
         })

--
Gitblit v1.9.3