From 7b6cad3a3fc3a4dcfc7944be62220e931491c268 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期二, 04 三月 2025 16:43:48 +0800
Subject: [PATCH] 监控计划搬迁80%

---
 src/views/CNAS/process/ensureResults/ensureResultsValidity/index.vue                       |  670 +++++++
 src/views/CNAS/process/ensureResults/ensureResultsValidity/components/evaluateDialog.vue   |  334 +++
 src/api/cnas/process/ensureResults/ensureResultsValidity.js                                |  176 ++
 src/views/CNAS/process/ensureResults/ensureResultsValidity/components/carryOutDialog.vue   |  324 +++
 src/api/cnas/process/reportResults.js                                                      |   47 
 src/views/CNAS/process/nonconformingWork/nonconformingDistribution/components/formDia.vue  |  232 ++
 src/views/CNAS/process/nonconformingWork/nonconformingItem/index.vue                       |  196 ++
 src/api/cnas/process/ensureResults/qualityControlPlan.js                                   |    0 
 src/views/CNAS/process/ensureResults/qualityControlPlan/index.vue                          |    0 
 src/views/CNAS/process/uncertainty/index.vue                                               |  328 +++
 src/api/cnas/process/sampleDisposal.js                                                     |   74 
 src/views/CNAS/process/nonconformingWork/nonconformingDistribution/index.vue               |  237 ++
 src/components/Table/lims-table.vue                                                        |    2 
 src/api/system/user.js                                                                     |    8 
 src/views/CNAS/process/sampleDisposal/index.vue                                            |  609 +++++++
 public/index.html                                                                          |    1 
 src/api/cnas/process/complaint.js                                                          |   57 
 src/api/cnas/process/nonconformingWork.js                                                  |   85 
 src/views/CNAS/process/reportResults/index.vue                                             |  409 ++++
 src/views/CNAS/process/complaint/index.vue                                                 |  629 +++++++
 src/main.js                                                                                |    1 
 src/views/CNAS/process/nonconformingWork/nonconformingItem/components/qualityInfo.vue      |  322 +++
 src/api/cnas/process/uncertainty.js                                                        |   39 
 src/views/CNAS/process/ensureResults/ensureResultsValidity/components/detailFormDialog.vue |  150 +
 src/views/CNAS/process/ensureResults/ensureResultsValidity/components/ViewRecord.vue       |  171 +
 25 files changed, 5,100 insertions(+), 1 deletions(-)

diff --git a/public/index.html b/public/index.html
index 7a42a58..0a54df5 100644
--- a/public/index.html
+++ b/public/index.html
@@ -227,4 +227,5 @@
   </body>
   <script src="<%= BASE_URL %>luckysheet/plugins/js/plugin.js"></script>
   <script src="<%= BASE_URL %>luckysheet/luckysheet.umd.js"></script>
+  <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.16.105/pdf.min.js"></script>
 </html>
diff --git a/src/api/cnas/process/complaint.js b/src/api/cnas/process/complaint.js
new file mode 100644
index 0000000..cd93e8d
--- /dev/null
+++ b/src/api/cnas/process/complaint.js
@@ -0,0 +1,57 @@
+// 鎶曡瘔姹囨�昏〃鐩稿叧鎺ュ彛
+import request from "@/utils/request";
+
+// 鎶曡瘔澶勭悊鏂板
+export function addProcessComplain(data) {
+  return request({
+    url: "/processComplain/addProcessComplain",
+    method: "post",
+    data: data,
+  });
+}
+
+//鎶曡瘔澶勭悊璇︽儏
+export function getProcessComplain(query) {
+  return request({
+    url: "/processComplain/getProcessComplain",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鎶曡瘔澶勭悊淇敼
+export function doProcessComplain(data) {
+  return request({
+    url: "/processComplain/doProcessComplain",
+    method: "post",
+    data: data,
+  });
+}
+
+//鎶曡瘔澶勭悊瀵煎嚭
+export function exportProcessComplain(query) {
+  return request({
+    url: "/processComplain/exportProcessComplain",
+    method: "get",
+    responseType: "blob",
+    params: query,
+  });
+}
+
+//鎶曡瘔澶勭悊鍒嗛〉
+export function pageProcessComplain(query) {
+  return request({
+    url: "/processComplain/pageProcessComplain",
+    method: "get",
+    params: query,
+  });
+}
+
+//鎶曡瘔澶勭悊鍒犻櫎
+export function delProcessComplain(query) {
+  return request({
+    url: "/processComplain/delProcessComplain",
+    method: "delete",
+    params: query,
+  });
+}
diff --git a/src/api/cnas/process/ensureResults/ensureResultsValidity.js b/src/api/cnas/process/ensureResults/ensureResultsValidity.js
new file mode 100644
index 0000000..76d3052
--- /dev/null
+++ b/src/api/cnas/process/ensureResults/ensureResultsValidity.js
@@ -0,0 +1,176 @@
+// 璐ㄩ噺鐩戞帶璁″垝椤甸潰鐩稿叧鎺ュ彛
+import request from "@/utils/request";
+
+//鐩戞帶骞村害璁″垝鍒楄〃
+export function pageQualityMonitor(query) {
+  return request({
+    url: "/qualityMonitor/pageQualityMonitor",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鐩戞帶璁″垝瀹℃牳
+export function examineQualityMonitor(data) {
+  return request({
+    url: "/qualityMonitor/examineQualityMonitor",
+    method: "post",
+    data: data,
+  });
+}
+
+// 鐩戞帶璁″垝鎵瑰噯
+export function ratifyQualityMonitor(data) {
+  return request({
+    url: "/qualityMonitor/ratifyQualityMonitor",
+    method: "post",
+    data: data,
+  });
+}
+
+//瀵煎嚭鐩戞帶璁″垝
+export function exportQualityMonitorDetail(query) {
+  return request({
+    url: "/qualityMonitor/exportQualityMonitorDetail",
+    method: "get",
+    responseType: "blob",
+    params: query,
+  });
+}
+
+//鐩戞帶璁″垝鍒犻櫎
+export function delQualitySupervise(query) {
+  return request({
+    url: "/qualityMonitor/delQualitySupervise",
+    method: "delete",
+    params: query,
+  });
+}
+
+//鐩戞帶璁″垝璇︽儏鍒楄〃
+export function pageQualityMonitorDetail(query) {
+  return request({
+    url: "/qualityMonitor/pageQualityMonitorDetail",
+    method: "get",
+    params: query,
+  });
+}
+
+//璐ㄩ噺鐩戞帶瀹炴柦璁″垝瀵煎嚭
+export function exportQualityMonitorRatify(query) {
+  return request({
+    url: "/qualityMonitor/exportQualityMonitorRatify",
+    method: "get",
+    responseType: "blob",
+    params: query,
+  });
+}
+
+//璐ㄩ噺鐩戞帶璇勪环瀵煎嚭
+export function exportQualityMonitorEvaluate(query) {
+  return request({
+    url: "/qualityMonitor/exportQualityMonitorEvaluate",
+    method: "get",
+    responseType: "blob",
+    params: query,
+  });
+}
+
+//鍒犻櫎鐩戞帶璁″垝璇︽儏
+export function delQualityMonitorDetail(query) {
+  return request({
+    url: "/qualityMonitor/delQualityMonitorDetail",
+    method: "delete",
+    params: query,
+  });
+}
+
+//鏌ヨ鐩戞帶璁″垝璇︽儏瀹炴柦淇℃伅
+export function getQualityMonitorRatify(query) {
+  return request({
+    url: "/qualityMonitor/getQualityMonitorRatify",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鏂板鐩戞帶璁″垝璇︽儏瀹炴柦淇℃伅
+export function addQualityMonitorRatify(data) {
+  return request({
+    url: "/qualityMonitor/addQualityMonitorRatify",
+    method: "post",
+    data: data,
+  });
+}
+
+// 鎻愪氦鐩戞帶璁″垝璇︽儏鎵瑰噯鎰忚
+export function addQualityMonitorRatifyOpinion(data) {
+  return request({
+    url: "/qualityMonitor/addQualityMonitorRatifyOpinion",
+    method: "post",
+    data: data,
+  });
+}
+
+// 鏂板鐩戞帶璁″垝璇︽儏
+export function addQualityMonitorDetail(data) {
+  return request({
+    url: "/qualityMonitor/addQualityMonitorDetail",
+    method: "post",
+    data: data,
+  });
+}
+
+// 淇敼鐩戞帶璁″垝璇︽儏
+export function updateQualityMonitorDetail(data) {
+  return request({
+    url: "/qualityMonitor/updateQualityMonitorDetail",
+    method: "post",
+    data: data,
+  });
+}
+
+//鏌ヨ鐩戞帶璇勪环
+export function getQualityMonitorEvaluate(query) {
+  return request({
+    url: "/qualityMonitor/getQualityMonitorEvaluate",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鏂板鐩戞帶璇勪环鎵瑰噯
+export function addMonitorEvaluateOpinion(data) {
+  return request({
+    url: "/qualityMonitor/addMonitorEvaluateOpinion",
+    method: "post",
+    data: data,
+  });
+}
+
+// 鏂板鐩戞帶璇勪环
+export function addQualityMonitorEvaluate(data) {
+  return request({
+    url: "/qualityMonitor/addQualityMonitorEvaluate",
+    method: "post",
+    data: data,
+  });
+}
+
+//鍒犻櫎鐩戞帶璇勪环闄勪欢鍒楄〃
+export function delVerifyEvaluateFileList(query) {
+  return request({
+    url: "/qualityMonitor/delVerifyEvaluateFileList",
+    method: "delete",
+    params: query,
+  });
+}
+
+//鏌ヨ鐩戞帶璇勪环闄勪欢鍒楄〃
+export function getEvaluateFileList(query) {
+  return request({
+    url: "/qualityMonitor/getEvaluateFileList",
+    method: "get",
+    params: query,
+  });
+}
diff --git a/src/api/cnas/process/ensureResults/qualityControlPlan.js b/src/api/cnas/process/ensureResults/qualityControlPlan.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/api/cnas/process/ensureResults/qualityControlPlan.js
diff --git a/src/api/cnas/process/nonconformingWork.js b/src/api/cnas/process/nonconformingWork.js
new file mode 100644
index 0000000..ff6b2a4
--- /dev/null
+++ b/src/api/cnas/process/nonconformingWork.js
@@ -0,0 +1,85 @@
+// 涓嶇鍚堝伐浣滅浉鍏虫帴鍙�
+import request from "@/utils/request";
+
+//鏌ヨ鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭垪琛�
+export function pageSuperviseDetailAccording(query) {
+  return request({
+    url: "/qualitySupervise/pageSuperviseDetailAccording",
+    method: "get",
+    params: query,
+  });
+}
+
+//瀵煎嚭涓嶇鍚堥」
+export function superviseDetailAccordingExport(query) {
+  return request({
+    url: "/qualitySupervise/superviseDetailAccordingExport",
+    method: "get",
+    responseType: "blob",
+    params: query,
+  });
+}
+
+//鏌ヨ鐩戠潱璁板綍涓嶇鍚堟帶鍒朵俊鎭�
+export function getSuperviseDetailAccording(query) {
+  return request({
+    url: "/qualitySupervise/getSuperviseDetailAccording",
+    method: "get",
+    params: query,
+  });
+}
+
+//涓嶇鍚堥」鐨勫垎甯冨垎椤垫煡璇�
+export function pageInconsistentDistribution(query) {
+  return request({
+    url: "/inconsistentDistribution/pageInconsistentDistribution",
+    method: "get",
+    params: query,
+  });
+}
+
+//涓嶇鍚堥」鐨勫垎甯冨垹闄�
+export function delInconsistentDistribution(query) {
+  return request({
+    url: "/inconsistentDistribution/delInconsistentDistribution",
+    method: "delete",
+    params: query,
+  });
+}
+
+//瀵煎嚭涓嶇鍚堥」鐨勫垎甯�
+export function exportInconsistentDistribution(query) {
+  return request({
+    url: "/inconsistentDistribution/exportInconsistentDistribution",
+    method: "get",
+    responseType: "blob",
+    params: query,
+  });
+}
+
+//涓嶇鍚堥」鐨勫垎甯冭鎯�
+export function getInconsistentDistributionOne(query) {
+  return request({
+    url: "/inconsistentDistribution/getInconsistentDistributionOne",
+    method: "get",
+    params: query,
+  });
+}
+
+// 涓嶇鍚堥」鐨勫垎甯冩柊澧�
+export function addInconsistentDistribution(data) {
+  return request({
+    url: "/inconsistentDistribution/addInconsistentDistribution",
+    method: "post",
+    data: data,
+  });
+}
+
+// 涓嶇鍚堥」鐨勫垎甯冧慨鏀�
+export function updateInconsistentDistribution(data) {
+  return request({
+    url: "/inconsistentDistribution/updateInconsistentDistribution",
+    method: "post",
+    data: data,
+  });
+}
diff --git a/src/api/cnas/process/reportResults.js b/src/api/cnas/process/reportResults.js
new file mode 100644
index 0000000..a7f25d6
--- /dev/null
+++ b/src/api/cnas/process/reportResults.js
@@ -0,0 +1,47 @@
+// 鎶ュ憡缁撴灉鐩稿叧鎺ュ彛
+import request from "@/utils/request";
+
+//8鎶ュ憡缁撴灉-瀵煎嚭
+export function exportProcessReport(data) {
+  return request({
+    url: "/processReport/exportProcessReport",
+    method: "post",
+    data: data,
+  });
+}
+
+// 8鎶ュ憡缁撴灉-鏂板
+export function addProcessReport(data) {
+  return request({
+    url: "/processReport/addProcessReport",
+    method: "post",
+    data: data,
+  });
+}
+
+// 8鎶ュ憡缁撴灉-淇敼
+export function doProcessReport(data) {
+  return request({
+    url: "/processReport/doProcessReport",
+    method: "post",
+    data: data,
+  });
+}
+
+//8鎶ュ憡缁撴灉-鍒犻櫎
+export function delProcessReport(query) {
+  return request({
+    url: "/processReport/delProcessReport",
+    method: "delete",
+    params: query,
+  });
+}
+
+//8鎶ュ憡缁撴灉-鍒楄〃
+export function pageProcessReport(query) {
+  return request({
+    url: "/processReport/pageProcessReport",
+    method: "get",
+    params: query,
+  });
+}
diff --git a/src/api/cnas/process/sampleDisposal.js b/src/api/cnas/process/sampleDisposal.js
new file mode 100644
index 0000000..a763edd
--- /dev/null
+++ b/src/api/cnas/process/sampleDisposal.js
@@ -0,0 +1,74 @@
+// 妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�
+import request from "@/utils/request";
+
+// 淇敼
+export function doProcessDeal(data) {
+  return request({
+    url: "/processDeal/doProcessDeal",
+    method: "post",
+    data: data,
+  });
+}
+
+// 鏂板
+export function addProcessDeal(data) {
+  return request({
+    url: "/processDeal/addProcessDeal",
+    method: "post",
+    data: data,
+  });
+}
+
+// 鎻愪氦鍘嗗彶  浼犲弬id
+export function submitProcessTotaldeal(data) {
+  return request({
+    url: "/processTotaldeal/submitProcessTotaldeal",
+    method: "post",
+    data: data,
+  });
+}
+
+//鏌ヨ璇︽儏  鍒嗛〉鏌ヨ閲岄潰totaldealId  浼犲弬鍘嗗彶鐨刬d
+export function pageProcessDeal(query) {
+  return request({
+    url: "/processDeal/pageProcessDeal",
+    method: "get",
+    params: query,
+  });
+}
+
+// 瀹℃牳  浼犲弬id鍜岄�氳繃涓嶉�氳繃state(涓枃)
+export function checkProcessTotaldeal(data) {
+  return request({
+    url: "/processTotaldeal/checkProcessTotaldeal",
+    method: "post",
+    data: data,
+  });
+}
+
+// 鎵瑰噯  浼犲弬id鍜岄�氳繃涓嶉�氳繃state(涓枃)
+export function ratifyProcessTotaldeal(data) {
+  return request({
+    url: "/processTotaldeal/ratifyProcessTotaldeal",
+    method: "post",
+    data: data,
+  });
+}
+
+//鍒犻櫎
+export function delProcessDeal(query) {
+  return request({
+    url: "/processDeal/delProcessDeal",
+    method: "delete",
+    params: query,
+  });
+}
+
+//鏌ョ湅鍘嗗彶
+export function pageProcessTotaldeal(query) {
+  return request({
+    url: "/processTotaldeal/pageProcessTotaldeal",
+    method: "get",
+    params: query,
+  });
+}
diff --git a/src/api/cnas/process/uncertainty.js b/src/api/cnas/process/uncertainty.js
new file mode 100644
index 0000000..7223cc1
--- /dev/null
+++ b/src/api/cnas/process/uncertainty.js
@@ -0,0 +1,39 @@
+// 涓嶇‘瀹氬害璇勫畾鐩稿叧鎺ュ彛
+import request from "@/utils/request";
+
+//瀵煎嚭
+export function exportProcessEvaluate(query) {
+  return request({
+    url: "/processEvaluate/exportProcessEvaluate",
+    method: "get",
+    responseType: "blob",
+    params: query,
+  });
+}
+
+// 濉啓 (涓昏涓婁紶id鍜屽娉╪ote灏卞ソ浜�)
+export function doProcessEvaluate(data) {
+  return request({
+    url: "/processEvaluate/doProcessEvaluate",
+    method: "post",
+    data: data,
+  });
+}
+
+//鍒犻櫎
+export function delProcessEvaluate(query) {
+  return request({
+    url: "/processEvaluate/delProcessEvaluate",
+    method: "delete",
+    params: query,
+  });
+}
+
+//鍒嗛〉
+export function pageProcessEvaluate(query) {
+  return request({
+    url: "/processEvaluate/pageProcessEvaluate",
+    method: "get",
+    params: query,
+  });
+}
diff --git a/src/api/system/user.js b/src/api/system/user.js
index bd2c924..57ed6d5 100644
--- a/src/api/system/user.js
+++ b/src/api/system/user.js
@@ -189,3 +189,11 @@
     params: query,
   });
 }
+
+// 鑾峰彇褰撳墠鐧诲綍浜哄憳閮ㄩ棬
+export function selectUserDepartmentLimsName(query) {
+  return request({
+    url: "/system/newUser/selectUserDepartmentLimsName",
+    method: "get",
+  });
+}
diff --git a/src/components/Table/lims-table.vue b/src/components/Table/lims-table.vue
index f111ab2..0a2f204 100644
--- a/src/components/Table/lims-table.vue
+++ b/src/components/Table/lims-table.vue
@@ -110,7 +110,7 @@
         </template>
       </el-table-column>
     </el-table>
-    <pagination v-show="page.total > 0" :total="page.total" :layout="page.layout" :page.sync="page.current"
+    <pagination v-if="page" v-show="page.total > 0" :total="page.total" :layout="page.layout" :page.sync="page.current"
       :limit.sync="page.size" @pagination="pagination" />
   </div>
 </template>
diff --git a/src/main.js b/src/main.js
index 870a586..49208a3 100644
--- a/src/main.js
+++ b/src/main.js
@@ -71,6 +71,7 @@
 Vue.prototype.uploadHeader = {
   Authorization: "Bearer " + getToken(),
 };
+
 // 瑙e喅el-radio-group鍗曢�夋鑷韩鐨刡ug
 Vue.directive("removeAriaHidden", {
   bind(el, binding) {
diff --git a/src/views/CNAS/process/complaint/index.vue b/src/views/CNAS/process/complaint/index.vue
new file mode 100644
index 0000000..5a998b3
--- /dev/null
+++ b/src/views/CNAS/process/complaint/index.vue
@@ -0,0 +1,629 @@
+<template>
+  <div class="Complaint">
+    <div class="search">
+      <div class="search_thing">
+        <div class="search_label">鏍峰搧缂栧彿锛�</div>
+        <div class="search_input"><el-input v-model="queryParams.sampleCode" clearable placeholder="璇疯緭鍏�" size="small"
+            @keyup.enter.native="refreshTable()"></el-input></div>
+      </div>
+      <div class="search_thing">
+        <div class="search_label">鎶曡瘔鍚嶇О锛�</div>
+        <div class="search_input">
+          <el-input v-model="queryParams.complainName" clearable placeholder="璇疯緭鍏�" size="small"
+            @keyup.enter.native="refreshTable()"></el-input>
+        </div>
+      </div>
+      <div class="search_thing" style="padding-left: 30px;">
+        <el-button size="small" @click="refresh()">閲� 缃�</el-button>
+        <el-button size="small" type="primary" @click="refreshTable()">鏌� 璇�</el-button>
+      </div>
+      <div class="btn">
+        <el-button :loading="outLoading" size="small" type="primary" @click="handleDown">瀵煎嚭</el-button>
+        <el-button size="small" type="primary" @click="openAdd">鏂板</el-button>
+      </div>
+    </div>
+    <div class="table">
+      <lims-table :tableData="tableData" :column="column" :tableLoading="tableLoading" :height="'calc(100vh - 290px)'"
+        :page="page" @pagination="pagination"></lims-table>
+    </div>
+    <el-dialog :visible.sync="addDialogVisible" title="鏂板" width="400px">
+      <el-row>
+        <el-col :span="24" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">鎶曡瘔鏂瑰悕绉帮細</div>
+            <div class="search_input"><el-input v-model="addInfo.complainName" clearable placeholder="璇疯緭鍏�"
+                size="small"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="24" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">妫�楠屾姤鍛婄紪鍙凤細</div>
+            <div class="search_input">
+              <el-input v-model="addInfo.code" clearable placeholder="璇疯緭鍏�" size="small"></el-input>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="24" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">鏍峰搧缂栧彿锛�</div>
+            <div class="search_input"><el-input v-model="addInfo.sampleCode" clearable placeholder="璇疯緭鍏�"
+                size="small"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="24">
+          <div class="search_thing">
+            <div class="search_label">鎶曡瘔鏂瑰紡锛�</div>
+            <div class="search_input"><el-input v-model="addInfo.complainMethod" clearable placeholder="璇疯緭鍏�"
+                size="small"></el-input></div>
+          </div>
+        </el-col>
+      </el-row>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="addDialogVisible = false">鍙� 娑�</el-button>
+        <el-button :loading="addLoading" type="primary" @click="handleAdd">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog :class="{ downPdf: title == '瀵煎嚭' }" :modal="title != '瀵煎嚭'" :title="title"
+      :visible.sync="handleDialogVisible" width="800px">
+      <div class="dialog-body">
+        <div id="dialogBody">
+          <h4 style="display: flex;align-items: center;flex-direction: column;justify-content: center;">
+            <span style="font-size: 20px;">瀹㈡埛鎶曡瘔鍙楃悊鍗�</span>
+            <span>Customer complaint receipts</span>
+          </h4>
+          <p style="display: flex;justify-content: space-between;margin-top: 16px;">
+            <span>{{ currentInfo0.complainNo }}</span>
+            <span>NO:</span>
+          </p>
+          <table border="1" cellpadding="10" class="tables">
+            <tr>
+              <td colspan="3">
+                <p>鎶曡瘔鏂瑰悕绉�</p>
+                <p class="en">Name of the complaining party</p>
+              </td>
+              <td colspan="3">{{ currentInfo0.complainName }}</td>
+            </tr>
+            <tr>
+              <td>
+                <p>妫�娴嬫姤鍛婄紪鍙�</p>
+                <p class="en">Test report number</p>
+              </td>
+              <td colspan="3">{{ currentInfo0.code }}</td>
+              <td>
+                <p>鏍峰搧缂栧彿</p>
+                <p class="en">Sample number</p>
+              </td>
+              <td>{{ currentInfo0.sampleCode }}</td>
+            </tr>
+            <tr>
+              <td>
+                <p>鎶曡瘔浜�</p>
+                <p class="en">Complainant</p>
+              </td>
+              <td>{{ currentInfo0.createUser }}</td>
+              <td>
+                <p>鐢佃瘽</p>
+                <p class="en">Phone</p>
+              </td>
+              <td>{{ currentInfo0.phone }}</td>
+              <td>
+                <p>E-Mail</p>
+                <p class="en">E-mail</p>
+              </td>
+              <td>{{ currentInfo0.email }}</td>
+            </tr>
+            <tr>
+              <td>
+                <p>鎶曡瘔鏂瑰紡</p>
+                <p class="en">Complaint method</p>
+              </td>
+              <td colspan="3">{{ currentInfo0.complainMethod }}</td>
+              <td>
+                <p>鎶曡瘔鏃ユ湡</p>
+                <p class="en">Date of complaint</p>
+              </td>
+              <td>{{ currentInfo0.createTime ? currentInfo0.createTime.split(' ')[0] : '' }}</td>
+            </tr>
+            <tr>
+              <td>
+                <p>闂璁板綍</p>
+                <p class="en">Problem logging</p>
+              </td>
+              <td colspan="5">
+                <div class="user-content">
+                  <el-input v-if="title == '澶勭悊鎶曡瘔'" v-model="currentInfo0.problemRecords" :rows="3" placeholder="璇疯緭鍏ュ唴瀹�"
+                    type="textarea">
+                  </el-input>
+                  <p v-else style="text-align: left;line-height: 26px;">{{ currentInfo0.problemRecords }}</p>
+                </div>
+                <div v-if="title != '澶勭悊鎶曡瘔'" class="user-info">
+                  <div style="width: 200px;margin-right: 10px;">
+                    <p style="text-align: end;">璐ㄩ噺璐熻矗浜�:</p>
+                    <p class="en" style="text-align: end;">Quality Manager:</p>
+                  </div>
+                  <span>{{ currentInfo0.problemRecordsUserName }}</span>
+                  <div style="width: 70px;">
+                    <p>鏃ユ湡:</p>
+                    <p class="en">Date:</p>
+                  </div>
+                  <span style="margin-right: 16px;">{{ currentInfo0.problemRecordsTime }}</span>
+                </div>
+              </td>
+            </tr>
+            <tr>
+              <td>
+                <p>璐d换褰掑睘鍙婃姇璇夋槸鍚︽垚绔�</p>
+                <p class="en">Attribution of responsibility and whether the complaint is established</p>
+              </td>
+              <td colspan="5">
+                <div class="user-content">
+                  <el-input v-if="title == '澶勭悊鎶曡瘔'" v-model="currentInfo0.dutyOwnership" :rows="3" placeholder="璇疯緭鍏ュ唴瀹�"
+                    type="textarea">
+                  </el-input>
+                  <p v-else style="text-align: left;line-height: 26px;">{{ currentInfo0.dutyOwnership }}</p>
+                </div>
+                <div v-if="title != '澶勭悊鎶曡瘔'" class="user-info">
+                  <div style="width: 200px;margin-right: 10px;">
+                    <p style="text-align: end;">璐ㄩ噺璐熻矗浜�:</p>
+                    <p class="en" style="text-align: end;">Quality Manager:</p>
+                  </div>
+                  <span>{{ currentInfo0.dutyOwnershipUserName }}</span>
+                  <div style="width: 70px;">
+                    <p>鏃ユ湡:</p>
+                    <p class="en">Date:</p>
+                  </div>
+                  <span style="margin-right: 16px;">{{ currentInfo0.dutyOwnershipTime }}</span>
+                </div>
+              </td>
+            </tr>
+            <tr>
+              <td>
+                <p>鍘熷洜鍒嗘瀽</p>
+                <p class="en">Cause analysis</p>
+              </td>
+              <td colspan="5">
+                <div class="user-content">
+                  <el-input v-if="title == '澶勭悊鎶曡瘔'" v-model="currentInfo0.causeAnalysis" :rows="3" placeholder="璇疯緭鍏ュ唴瀹�"
+                    type="textarea">
+                  </el-input>
+                  <p v-else style="text-align: left;line-height: 26px;">{{ currentInfo0.causeAnalysis }}</p>
+                </div>
+                <div v-if="title != '澶勭悊鎶曡瘔'" class="user-info">
+                  <div style="width: 200px;margin-right: 10px;">
+                    <p style="text-align: end;">璐d换閮ㄩ棬璐熻矗浜�:</p>
+                    <p class="en" style="text-align: end;">Head of Responsible Department:</p>
+                  </div>
+                  <span>{{ currentInfo0.causeAnalysisUserName }}</span>
+                  <div style="width: 70px;">
+                    <p>鏃ユ湡:</p>
+                    <p class="en">Date:</p>
+                  </div>
+                  <span style="margin-right: 16px;">{{ currentInfo0.causeAnalysisTime }}</span>
+                </div>
+              </td>
+            </tr>
+            <tr>
+              <td>
+                <p>绾犳鎺柦</p>
+                <p class="en">Corrective actions</p>
+              </td>
+              <td colspan="5">
+                <div class="user-content">
+                  <el-input v-if="title == '澶勭悊鎶曡瘔'" v-model="currentInfo0.correctiveAction" :rows="3" placeholder="璇疯緭鍏ュ唴瀹�"
+                    type="textarea">
+                  </el-input>
+                  <p v-else style="text-align: left;line-height: 26px;">{{ currentInfo0.correctiveAction }}</p>
+                </div>
+                <div v-if="title != '澶勭悊鎶曡瘔'" class="user-info">
+                  <div style="width: 200px;margin-right: 10px;">
+                    <p style="text-align: end;">璐d换閮ㄩ棬璐熻矗浜�:</p>
+                    <p class="en" style="text-align: end;">Head of Responsible Department:</p>
+                  </div>
+                  <span>{{ currentInfo0.correctiveActionUserName }}</span>
+                  <div style="width: 70px;">
+                    <p>鏃ユ湡:</p>
+                    <p class="en">Date:</p>
+                  </div>
+                  <span style="margin-right: 16px;">{{ currentInfo0.correctiveActionTime }}</span>
+                </div>
+              </td>
+            </tr>
+            <tr>
+              <td>
+                <p>绾犳鎺柦纭</p>
+                <p class="en">Corrective actions confirmation</p>
+              </td>
+              <td colspan="5">
+                <div class="user-content">
+                  <el-input v-if="title == '澶勭悊鎶曡瘔'" v-model="currentInfo0.correctiveActionConfirmation" :rows="3"
+                    placeholder="璇疯緭鍏ュ唴瀹�" type="textarea">
+                  </el-input>
+                  <p v-else style="text-align: left;line-height: 26px;">{{ currentInfo0.correctiveActionConfirmation }}
+                  </p>
+                </div>
+                <div v-if="title != '澶勭悊鎶曡瘔'" class="user-info">
+                  <div style="width: 200px;margin-right: 10px;">
+                    <p style="text-align: end;">璐ㄩ噺璐熻矗浜�:</p>
+                    <p class="en" style="text-align: end;">Quality Manager:</p>
+                  </div>
+                  <span>{{ currentInfo0.correctiveActionConfirmationUserName }}</span>
+                  <div style="width: 70px;">
+                    <p>鏃ユ湡:</p>
+                    <p class="en">Date:</p>
+                  </div>
+                  <span style="margin-right: 16px;">{{ currentInfo0.correctiveActionConfirmationTime }}</span>
+                </div>
+              </td>
+            </tr>
+          </table>
+        </div>
+      </div>
+      <span v-if="title == '澶勭悊鎶曡瘔'" slot="footer" class="dialog-footer">
+        <el-button @click="handleDialogVisible = false">鍙� 娑�</el-button>
+        <el-button :loading="addLoading" type="primary" @click="submit">鎻� 浜�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import limsTable from "@/components/Table/lims-table.vue";
+import { getYearAndMonthAndDays } from '@/utils/date'
+import { exportHtmlToPDF } from '@/utils/downHtmlToPDF'
+import {
+  addProcessComplain,
+  getProcessComplain,
+  doProcessComplain,
+  exportProcessComplain,
+  pageProcessComplain,
+  delProcessComplain
+} from '@/api/cnas/process/complaint.js'
+import { mapGetters } from "vuex";
+export default {
+  components: {
+    limsTable
+  },
+  data() {
+    return {
+      addPower: false,
+      outLoading: false,
+      addDialogVisible: false,
+      addLoading: false,
+      handleDialogVisible: false,
+      title: '澶勭悊鎶曡瘔',
+      addInfo: {},//鏂板淇℃伅
+      currentInfo: null,//鎺ュ彛璇锋眰鍥炴潵鐨勪俊鎭�
+      currentInfo0: {},//鐢ㄦ埛缂栬緫杩囧悗鐨勪俊鎭�
+      outPower: false,
+      queryParams: {},
+      tableData: [],
+      column: [
+        { label: "鎶曡瘔鍚嶇О", prop: "complainName" },
+        { label: "鎶曡瘔浜�", prop: "complainant" },
+        { label: "鎶曡瘔鏃ユ湡", prop: "createTime" },
+        {
+          dataType: "action",
+          fixed: "right",
+          label: "鎿嶄綔",
+          operation: [
+            {
+              name: "鏌ョ湅",
+              type: "text",
+              clickFun: (row) => {
+                this.handleLook(row);
+              },
+            },
+            {
+              name: "澶勭悊",
+              type: "text",
+              clickFun: (row) => {
+                this.handleWork(row);
+              },
+            },
+            {
+              name: "瀵煎嚭",
+              type: "text",
+              clickFun: (row) => {
+                this.handleOut(row);
+              },
+            },
+            {
+              name: "鍒犻櫎",
+              type: "text",
+              clickFun: (row) => {
+                this.handleDelete(row);
+              },
+            },
+          ],
+        },
+      ],
+      page: {
+        total: 0,
+        size: 10,
+        current: 0,
+      },
+    };
+  },
+  computed: {
+    ...mapGetters(["userId"]),
+  },
+  mounted() {
+    // this.entityCopy = this.HaveJson(this.componentData.entity);
+    this.getList()
+  },
+  methods: {
+    // 鏉冮檺鍒嗛厤
+    getPower() {
+      let power = JSON.parse(sessionStorage.getItem('power'))
+      let up = false
+      let del = false
+      let add = false
+      let out = false
+      for (var i = 0; i < power.length; i++) {
+        if (power[i].menuMethod == 'doProcessComplain') {
+          up = true
+        }
+        if (power[i].menuMethod == 'addProcessComplain') {
+          add = true
+        }
+        if (power[i].menuMethod == 'delProcessComplain') {
+          del = true
+        }
+        if (power[i].menuMethod == 'exportProcessComplain') {
+          out = true
+        }
+      }
+      if (!up) {
+        this.componentData.do.splice(2, 1)
+      }
+      if (!del) {
+        this.componentData.do.splice(1, 1)
+      }
+      this.outPower = out
+      this.addPower = add
+    },
+    openAdd() {
+      this.addInfo = {}
+      this.addDialogVisible = true
+    },
+    handleAdd() {
+      this.addLoading = true
+      addProcessComplain(this.addInfo).then((res) => {
+        this.addLoading = false
+        if (res.code == 201) {
+          this.$message({
+            type: 'error',
+            message: '鏂板澶辫触'
+          })
+          return
+        }
+        this.$message({
+          type: 'success',
+          message: '鏂板鎴愬姛'
+        })
+        this.addDialogVisible = false
+        this.refresh()
+      })
+    },
+    // 澶勭悊鎶曡瘔
+    handleWork(row) {
+      getProcessComplain({ id: row.id }).then((res) => {
+        this.currentInfo = res.data
+        this.currentInfo0 = this.HaveJson(res.data)
+        this.title = '澶勭悊鎶曡瘔'
+        this.handleDialogVisible = true
+      })
+    },
+    submit() {
+      this.handleParam('problemRecords')
+      this.handleParam('dutyOwnership')
+      this.handleParam('causeAnalysis')
+      this.handleParam('correctiveAction')
+      this.handleParam('correctiveActionConfirmation')
+      this.addLoading = true
+      for (let i in this.currentInfo0) {
+        if (!this.currentInfo0[i]) {
+          delete this.currentInfo0[i]
+        }
+      }
+      doProcessComplain(this.currentInfo0).then((res) => {
+        this.addLoading = false
+        if (res.code == 201) {
+          this.$message({
+            type: 'error',
+            message: '鎻愪氦澶辫触'
+          })
+          return
+        }
+        this.$message({
+          type: 'success',
+          message: '鎻愪氦鎴愬姛'
+        })
+        this.handleDialogVisible = false
+        this.refresh()
+      })
+    },
+    /**
+     * 澶勭悊鍙傛暟
+     *
+     * @param {string} type - 闇�瑕佸鐞嗙殑鍙傛暟绫诲瀷
+     */
+    handleParam(type) {
+      if (this.currentInfo0[type] != this.currentInfo[type]) {
+        this.currentInfo0[type + 'User'] = this.userId
+        this.currentInfo0[type + 'Time'] = getYearAndMonthAndDays()
+      }
+    },
+    // 鏌ョ湅鎶曡瘔
+    handleLook(row) {
+      addProcessComplain({ id: row.id }).then((res) => {
+        this.currentInfo = res.data
+        this.currentInfo0 = this.HaveJson(res.data)
+        this.title = '鏌ョ湅鎶曡瘔'
+        this.handleDialogVisible = true
+      })
+    },
+    getList() {
+      this.tableLoading = true;
+      let param = { ...this.queryParams, ...this.page };
+      delete param.total;
+      pageProcessComplain({ ...param })
+        .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;
+        });
+    },
+    pagination({ page, limit }) {
+      this.page.current = page;
+      this.page.size = limit;
+      this.getList();
+    },
+    refresh() {
+      this.queryParams = {};
+      this.page.current = 1;
+      this.getList();
+    },
+    refreshTable() {
+      this.page.current = 1;
+      this.getList();
+    },
+    handleDown() {
+      this.outLoading = true
+      exportProcessComplain(this.queryParams).then(res => {
+        this.outLoading = false
+        if (res.code == 201) {
+          return
+        }
+        const blob = new Blob([res], { type: 'application/octet-stream' });
+        this.$download.saveAs(blob, '鎶曡瘔鎯呭喌姹囨�昏〃.xlsx');
+      })
+    },
+    handleOut(row) {
+      getProcessComplain({ id: row.id }).then((res) => {
+        if (res.code == 201) {
+          return
+        }
+        this.currentInfo = res.data
+        this.currentInfo0 = this.HaveJson(res.data)
+        this.title = '瀵煎嚭'
+        this.handleDialogVisible = true
+        setTimeout(() => {
+          this.$nextTick(() => {
+            const element = document.getElementById("dialogBody");
+            exportHtmlToPDF(element, '鎶曡瘔璇︽儏').then(res => {
+              this.handleDialogVisible = false
+            })
+          })
+        }, 500);
+      })
+    },
+    handleDelete(row) {
+      this.$confirm("鏄惁鍒犻櫎璇ユ潯鏁版嵁?", "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning",
+      })
+        .then(() => {
+          delProcessComplain({ id: row.id }).then((res) => {
+            if (res.code == 201) return;
+            this.$message.success("鍒犻櫎鎴愬姛");
+            this.refresh();
+          });
+        })
+        .catch(() => { });
+    },
+  },
+}
+</script>
+
+<style scoped>
+.title {
+  height: 60px;
+  line-height: 60px;
+}
+
+.search {
+  background-color: #fff;
+  height: 80px;
+  display: flex;
+  align-items: center;
+  position: relative;
+}
+
+.search_thing {
+  width: 350px;
+  display: flex;
+  align-items: center;
+}
+
+.search_label {
+  width: 110px;
+  font-size: 14px;
+  text-align: right;
+}
+
+.search_input {
+  width: calc(100% - 110px);
+}
+
+.table {
+  background-color: #fff;
+  height: calc(100% - 60px - 80px - 10px - 40px);
+  padding: 20px;
+}
+
+.dialog-body {
+  max-height: 75vh;
+  overflow-y: auto;
+}
+
+.tables {
+  table-layout: fixed;
+  width: 100%;
+}
+
+.tables td {
+  height: 40px;
+  width: 100px;
+  text-align: center;
+  font-size: 14px;
+  word-wrap: break-word;
+  white-space: normal;
+}
+
+.en {
+  font-size: 12px;
+  word-break: break-word;
+  /* 鑷姩鏂 */
+  overflow-wrap: break-word;
+  /* 闃叉婧㈠嚭 */
+  white-space: normal;
+  /* 榛樿鎹㈣ */
+}
+
+.user-info {
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+}
+
+.user-content {
+  min-height: 60px;
+}
+
+.downPdf {
+  opacity: 0 !important;
+}
+
+.btn {
+  position: absolute;
+  top: 16px;
+  right: 20px;
+}
+</style>
diff --git a/src/views/CNAS/process/ensureResults/ensureResultsValidity/components/ViewRecord.vue b/src/views/CNAS/process/ensureResults/ensureResultsValidity/components/ViewRecord.vue
new file mode 100644
index 0000000..0db2c44
--- /dev/null
+++ b/src/views/CNAS/process/ensureResults/ensureResultsValidity/components/ViewRecord.vue
@@ -0,0 +1,171 @@
+<template>
+  <div>
+    <el-dialog :visible.sync="filesDialogVisible" title="闄勪欢涓婁紶" width="80%" @closed="closeFilesLook">
+      <div style="display: flex;justify-content: space-between;">
+        <el-upload ref='upload' :action="fileAction" :auto-upload="true" :before-upload="fileBeforeUpload"
+          :data="{ detailsEvaluateId: info.detailsEvaluateId }" :headers="uploadHeader" :on-error="onError"
+          :on-success="handleSuccessUp" :show-file-list="false"
+          accept='.jpg,.jpeg,.png,.gif,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.zip,.rar' style="width: 80px !important;">
+          <el-button size="small" style="height: 38px" type="primary">闄勪欢涓婁紶</el-button>
+        </el-upload>
+      </div>
+      <div>
+        <limsTable ref="yearTable" :column="columnData" :height="'calc(100vh - 47em)'" :highlightCurrentRow="true"
+          :table-data="tableData" :table-loading="tableLoading" style="margin-top: 0.5em;">
+        </limsTable>
+      </div>
+    </el-dialog>
+    <el-dialog :visible.sync="lookDialogVisible" fullscreen title="鏌ョ湅闄勪欢" width="800px">
+      <filePreview v-if="lookDialogVisible" :currentFile="{}" :fileUrl="javaApi + '/word/' + currentInfo.fileUrl"
+        style="height: 90vh;overflow-y: auto;top: 0" />
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import limsTable from "@/components/Table/lims-table.vue";
+import filePreview from "@/components/Preview/filePreview.vue";
+import {
+  delVerifyEvaluateFileList,
+  getEvaluateFileList,
+} from '@/api/cnas/process/ensureResults/ensureResultsValidity.js'
+export default {
+  name: 'ViewRecord',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { filePreview, limsTable },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      filesDialogVisible: false,
+      tableLoading: false,
+      filesLookInfo: {},
+      columnData: [
+        {
+          label: '鏂囦欢鍚嶇О',
+          prop: 'fileName',
+          minWidth: '150px'
+        },
+        {
+          dataType: 'action',
+          minWidth: '100',
+          label: '鎿嶄綔',
+          fixed: 'right',
+          operation: [
+            {
+              name: '棰勮',
+              type: 'text',
+              clickFun: (row) => {
+                this.handleLook(row)
+              }
+            },
+            {
+              name: '涓嬭浇',
+              type: 'text',
+              clickFun: (row) => {
+                this.upload(row)
+              }
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              color: '#f56c6c',
+              clickFun: (row) => {
+                this.delete(row)
+              }
+            }
+          ]
+        }
+      ],
+      tableData: [],
+      info: {},
+      currentInfo: {},
+      lookDialogVisible: false,
+    };
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    openDia(row) {
+      this.filesDialogVisible = true
+      console.log(1111, row)
+      this.info = row
+      this.searchTableList()
+    },
+    // 鏌ヨ闄勪欢鍒楄〃
+    searchTableList() {
+      this.tableLoading = true
+      getEvaluateFileList({ detailsEvaluateId: this.info.detailsEvaluateId }).then(res => {
+        this.tableLoading = false
+        if (res.code === 201) return
+        this.tableData = res.data
+      }).catch(err => {
+        this.tableLoading = false
+        console.log('err---', err);
+      })
+    },
+    closeFilesLook() {
+      this.filesDialogVisible = false
+    },
+    // 涓嬭浇
+    upload(row) {
+      let url = '';
+      if (row.type == 1) {
+        url = this.javaApi + '/img/' + row.fileUrl
+        this.$download.saveAs(url, row.fileName)
+      } else {
+        url = this.javaApi + '/word/' + row.fileUrlrow.fileName;
+        link.click();
+        this.$download.saveAs(url, row.fileName)
+      }
+    },
+    // 鍒犻櫎
+    delete(row) {
+      this.tableLoading = true
+      delVerifyEvaluateFileList({ evaluateFileId: row.evaluateFileId }).then(res => {
+        this.tableLoading = false
+        if (res.code === 201) return
+        this.$message.success('鍒犻櫎鎴愬姛')
+        this.searchTableList()
+      }).catch(err => {
+        this.tableLoading = false
+        console.log('err---', err);
+      })
+    },
+    // 涓婁紶楠岃瘉
+    fileBeforeUpload(file) {
+      let flag = true
+      if (file.size > 1024 * 1024 * 10) {
+        this.$message.error('涓婁紶鏂囦欢涓嶈秴杩�10M');
+        this.$refs.upload.clearFiles()
+        flag = false
+      }
+      if (!flag) {
+        return Promise.reject(flag); //姝g‘鐨勭粓姝�
+      }
+    },
+    onError(err, file, fileList, type) {
+      this.$message.error('涓婁紶澶辫触')
+      this.$refs.upload.clearFiles()
+    },
+    handleSuccessUp(response,) {
+      this.upLoading = false;
+      if (response.code == 200) {
+        this.$message.success('涓婁紶鎴愬姛');
+        this.searchTableList()
+      }
+    },
+    // 鏌ョ湅鏂囦欢
+    handleLook(row) {
+      this.currentInfo = row
+      this.lookDialogVisible = true
+    },
+  },
+  computed: {
+    fileAction() {
+      return this.javaApi + '/qualityMonitor/uploadEvaluateFile'
+
+    }
+  },
+};
+</script>
+
+<style scoped></style>
diff --git a/src/views/CNAS/process/ensureResults/ensureResultsValidity/components/carryOutDialog.vue b/src/views/CNAS/process/ensureResults/ensureResultsValidity/components/carryOutDialog.vue
new file mode 100644
index 0000000..d3911c7
--- /dev/null
+++ b/src/views/CNAS/process/ensureResults/ensureResultsValidity/components/carryOutDialog.vue
@@ -0,0 +1,324 @@
+<template>
+  <div>
+    <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :visible.sync="formDia" title="瀹炴柦"
+      width="60%" @close="closeCarryOutDia">
+      <el-steps :active="currentStep" align-center finish-status="success">
+        <el-step title="瀹炴柦"></el-step>
+        <el-step title="鎵瑰噯"></el-step>
+      </el-steps>
+      <div style="height: 620px;overflow-y: auto">
+        <table border="1" cellspacing="10" class="tables">
+          <tr>
+            <td class="td-title">
+              <p>鐩戞帶椤圭洰锛�</p>
+            </td>
+            <td colspan="3">
+              <el-input v-if="currentStep == 0" v-model="form.monitorProject" placeholder="璇疯緭鍏ュ唴瀹�" size="small">
+              </el-input>
+              <span v-else class="td-info"> {{ form.monitorProject }}</span>
+            </td>
+            <td class="td-title">
+              <p>鐩戞帶鏃堕棿锛�</p>
+            </td>
+            <td colspan="3">
+              <el-input v-if="currentStep == 0" v-model="form.monitorData" placeholder="璇疯緭鍏ュ唴瀹�" size="small">
+              </el-input>
+              <span v-else class="td-info"> {{ form.monitorData }}</span>
+            </td>
+          </tr>
+          <tr>
+            <td colspan="8">
+              <div>
+                <p>鐩戞帶鐩殑锛�</p>
+              </div>
+              <div>
+                <el-input v-if="currentStep == 0" v-model="form.monitorPurpose" :rows="3" placeholder="璇疯緭鍏ュ唴瀹�"
+                  size="small" type="textarea">
+                </el-input>
+                <span v-else class="td-info2"> {{ form.monitorPurpose }}</span>
+              </div>
+            </td>
+          </tr>
+          <tr>
+            <td colspan="8">
+              <div>
+                <p>鐩戞帶鏂规硶锛�</p>
+              </div>
+              <div>
+                <el-input v-if="currentStep == 0" v-model="form.monitorMethod" :rows="4" placeholder="璇疯緭鍏ュ唴瀹�"
+                  size="small" type="textarea">
+                </el-input>
+                <span v-else class="td-info2"> {{ form.monitorMethod }}</span>
+              </div>
+            </td>
+          </tr>
+          <tr>
+            <td colspan="8">
+              <div>
+                <p>鍙傚姞浜哄憳锛�</p>
+              </div>
+              <div>
+                <el-input v-if="currentStep == 0" v-model="form.participant" :rows="3" placeholder="璇疯緭鍏ュ唴瀹�" size="small"
+                  type="textarea">
+                </el-input>
+                <span v-else class="td-info2"> {{ form.participant }}</span>
+              </div>
+            </td>
+          </tr>
+          <tr>
+            <td colspan="8">
+              <div>
+                <p>杩囩▼鎺у埗锛�</p>
+              </div>
+              <div>
+                <el-input v-if="currentStep == 0" v-model="form.processControl" :rows="3" placeholder="璇疯緭鍏ュ唴瀹�"
+                  size="small" type="textarea">
+                </el-input>
+                <span v-else class="td-info2"> {{ form.processControl }}</span>
+              </div>
+            </td>
+          </tr>
+          <tr>
+            <td colspan="8">
+              <div>
+                <p>缁撴灉璇勪环鏍囧噯锛堝浣曡瘎浠凤級锛�</p>
+              </div>
+              <div>
+                <el-input v-if="currentStep == 0" v-model="form.howEvaluate" :rows="3" placeholder="璇疯緭鍏ュ唴瀹�" size="small"
+                  type="textarea">
+                </el-input>
+                <span v-else class="td-info2"> {{ form.howEvaluate }}</span>
+              </div>
+            </td>
+          </tr>
+          <tr>
+            <td colspan="8">
+              <div>
+                <p>缁忚垂棰勭畻锛�</p>
+              </div>
+              <div>
+                <el-input v-if="currentStep == 0" v-model="form.budget" placeholder="璇疯緭鍏ュ唴瀹�" size="small">
+                </el-input>
+                <span v-else class="td-info2"> {{ form.budget }}</span>
+              </div>
+            </td>
+          </tr>
+          <tr>
+            <td colspan="4">
+              <div>
+                <p>妫�娴嬮儴闂細</p>
+              </div>
+              <div>
+                <el-input v-if="currentStep == 0" v-model="form.inspectionDepartment" placeholder="璇疯緭鍏ュ唴瀹�" size="small">
+                </el-input>
+                <span v-else class="td-info2"> {{ form.inspectionDepartment }}</span>
+              </div>
+            </td>
+            <td colspan="4">
+              <div v-if="currentStep == 0">
+                <div>閫夋嫨鎵瑰噯浜猴細</div>
+                <div>
+                  <el-select v-if="currentStep == 0" v-model="form.ratifyUserId" clearable filterable placeholder="璇烽�夋嫨"
+                    size="small">
+                    <el-option v-for="(item, i) in personList" :key="i" :label="item.label" :value="item.value">
+                    </el-option>
+                  </el-select>
+                  <span v-else class="td-info2"> {{ form.ratifyName }}</span>
+                </div>
+              </div>
+              <div v-else>
+                <div>
+                  <p>鎵瑰噯鎰忚锛�</p>
+                </div>
+                <div>
+                  <el-input v-if="currentStep == 1" v-model="form.ratifyOpinion" :rows="3" placeholder="璇疯緭鍏ュ唴瀹�"
+                    size="small" type="textarea">
+                  </el-input>
+                  <span v-if="currentStep == 2" class="td-info2"> {{ form.ratifyOpinion }}</span>
+                  <span v-if="currentStep == 2" class="td-info3"> {{ '鎵瑰噯浜猴細' + form.ratifyName }}</span>
+                </div>
+              </div>
+            </td>
+          </tr>
+        </table>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="closeCarryOutDia">鍙� 娑�</el-button>
+        <el-button v-if="currentStep != 2" :loading="editLoad" type="primary" @click="handleEdit">鎻� 浜�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  getQualityMonitorRatify,
+  addQualityMonitorRatify,
+  addQualityMonitorRatifyOpinion,
+} from '@/api/cnas/process/ensureResults/ensureResultsValidity.js'
+import { selectUserCondition } from "@/api/system/user";
+export default {
+  name: 'carryOutDialog',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      formDia: false,
+      currentStep: 0,
+      form: {
+        monitorProject: '',
+        monitorData: '',
+        monitorPurpose: '',
+        monitorMethod: '',
+        participant: '',
+        processControl: '',
+        howEvaluate: '',
+        budget: '',
+        inspectionDepartment: '',
+        ratifyUserId: '',
+        ratifyOpinion: '',
+        qualityMonitorDetailsId: '',
+        ratifyName: '',
+      },
+      personList: [],
+      editLoad: false,
+      isCarryOut: false, // 鏄惁涓哄疄鏂�
+    };
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    openDia(row) {
+      this.formDia = true
+      this.searchInfo(row)
+      this.getAuthorizedPerson()
+    },
+    // 鏌ヨ鐩戞帶璁″垝璇︽儏瀹炴柦淇℃伅
+    searchInfo(row) {
+      getQualityMonitorRatify({ qualityMonitorDetailsId: row.qualityMonitorDetailsId }).then(res => {
+        if (res.code === 201) return
+        // 鏈塪etailsRatifyId鍒欒鏄庢彁浜よ繃瀹炴柦淇℃伅
+        if (res.data.detailsRatifyId) {
+          // 鏄惁缁撴潫0:鏈粨鏉�, 1:宸茬粨鏉�
+          if (res.data.isFinish == 0) {
+            this.currentStep = 1
+          } else if (res.data.isFinish == 1) {
+            this.currentStep = 2
+          }
+        } else {
+          this.currentStep = 0
+        }
+        this.form = res.data
+      }).catch(err => {
+        console.log('err---', err);
+      })
+    },
+    // 鎻愪氦
+    handleEdit() {
+      this.editLoad = true
+      if (this.currentStep == 0) {
+        this.addInfo()
+      } else {
+        this.editInfo()
+      }
+    },
+    // 鎻愪氦瀹炴柦
+    addInfo() {
+      addQualityMonitorRatify(this.form).then(res => {
+        this.editLoad = false
+        if (res.code === 201) return
+        this.$message.success('鎿嶄綔鎴愬姛')
+        this.closeCarryOutDia()
+      }).catch(err => {
+        console.log('err---', err);
+        this.editLoad = false
+      })
+    },
+    // 鎻愪氦鎵瑰噯
+    editInfo() {
+      addQualityMonitorRatifyOpinion(this.form).then(res => {
+        this.editLoad = false
+        if (res.code === 201) return
+        this.$message.success('鎿嶄綔鎴愬姛')
+        this.closeCarryOutDia()
+      }).catch(err => {
+        console.log('err---', err);
+        this.editLoad = false
+      })
+    },
+    // 鍏抽棴寮规
+    closeCarryOutDia() {
+      this.formDia = false
+      this.$emit('closeCarryOutDia')
+    },
+    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: 20px auto 50px !important;
+}
+
+.tables {
+  table-layout: fixed;
+  width: 100%;
+  margin-top: 10px;
+}
+
+.td-title {
+  height: 40px;
+  width: 100px;
+  text-align: center;
+  font-size: 14px;
+  word-wrap: break-word;
+  white-space: normal;
+  padding: 6px;
+}
+
+.td-info {
+  display: inline-block;
+  width: 100%;
+  text-align: center;
+  font-size: 14px;
+  word-wrap: break-word;
+  white-space: normal;
+}
+
+.td-info2 {
+  display: inline-block;
+  width: 90%;
+  text-align: left;
+  font-size: 16px;
+  word-wrap: break-word;
+  white-space: normal;
+  margin-left: 20px;
+}
+
+.tables td {
+  height: 40px;
+  width: 100px;
+  font-size: 14px;
+  word-wrap: break-word;
+  white-space: normal;
+  padding: 6px;
+}
+
+.td-info3 {
+  width: 90%;
+  display: inline-block;
+  text-align: right;
+}
+</style>
diff --git a/src/views/CNAS/process/ensureResults/ensureResultsValidity/components/detailFormDialog.vue b/src/views/CNAS/process/ensureResults/ensureResultsValidity/components/detailFormDialog.vue
new file mode 100644
index 0000000..9d99c93
--- /dev/null
+++ b/src/views/CNAS/process/ensureResults/ensureResultsValidity/components/detailFormDialog.vue
@@ -0,0 +1,150 @@
+<template>
+  <div>
+    <el-dialog title="缂栬緫" :visible.sync="formDia" :close-on-click-modal="false" :close-on-press-escape="false"
+      width="80%" @close="closeDia">
+      <el-form :model="form" :rules="rules" ref="form" label-width="140px">
+        <el-col :span="12">
+          <el-form-item label="鐩戞帶鐩殑" prop="monitorPurpose">
+            <el-input v-model="form.monitorPurpose" size="small" clearable></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="璁″垝寮�灞曟椂闂�" prop="plannedTime">
+            <el-input v-model="form.plannedTime" size="small" clearable></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鐩戞帶椤圭洰" prop="monitorProject">
+            <el-input v-model="form.monitorProject" size="small" clearable></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鍙傚姞鍗曚綅锛堜汉鍛橈級" prop="participant">
+            <el-input v-model="form.participant" size="small" clearable></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="棰勭畻锛堝厓锛�" prop="budget">
+            <el-input v-model="form.budget" size="small" clearable></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="缁勭粐浜哄憳" prop="organization">
+            <el-input v-model="form.organization" size="small" clearable></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鐩戞帶鏂瑰紡" prop="monitorWay">
+            <el-input v-model="form.monitorWay" size="small" clearable></el-input>
+          </el-form-item>
+        </el-col>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="closeDia">鍙� 娑�</el-button>
+        <el-button type="primary" @click="submitForm" :loading="upLoad">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  addQualityMonitorDetail,
+  updateQualityMonitorDetail,
+} from '@/api/cnas/process/ensureResults/ensureResultsValidity.js'
+export default {
+  name: 'detailFormDialog',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {},
+  props: ['qualityMonitorId'],
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      formDia: false,
+      form: {
+        qualityMonitorDetailsId: '',
+        monitorPurpose: '',
+        plannedTime: '',
+        monitorProject: '',
+        participant: '',
+        budget: '',
+        organization: '',
+        monitorWay: '',
+      },
+      rules: {
+        monitorPurpose: [{ required: true, message: '璇疯緭鍏ョ洃鎺х洰鐨�', trigger: 'blur' }],
+        monitorProject: [{ required: true, message: '璇疯緭鍏ョ洃鎺ч」鐩�', trigger: 'blur' }],
+      },
+      upLoad: false,
+      operationType: '',
+    };
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    openDia(type, row) {
+      this.formDia = true
+      this.operationType = type
+      if (type === 'edit') {
+        this.searchInfo(row)
+      }
+    },
+    searchInfo(row) {
+      this.form = { ...row }
+    },
+    // 鎻愪氦琛ㄥ崟
+    submitForm() {
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          if (this.operationType === 'add') {
+            this.handleAdd()
+          } else {
+            this.handleEdit()
+          }
+        }
+      })
+    },
+    // 鎻愪氦鏂板
+    handleAdd() {
+      let entity = this.HaveJson(this.form)
+      entity.qualityMonitorId = this.qualityMonitorId
+      this.upLoad = true
+      addQualityMonitorDetail(entity).then(res => {
+        this.upLoad = false
+        if (res.code === 201) return
+        this.$message.success('鏂板鎴愬姛')
+        this.closeDia()
+      }).catch(err => {
+        console.log('err---', err);
+        this.upLoad = false
+      })
+    },
+    // 鎻愪氦淇敼
+    handleEdit() {
+      const entity = this.HaveJson(this.form)
+      this.upLoad = true
+      updateQualityMonitorDetail(entity).then(res => {
+        this.upLoad = false
+        if (res.code === 201) return
+        this.$message.success('淇敼鎴愬姛')
+        this.closeDia()
+      }).catch(err => {
+        console.log('err---', err);
+        this.upLoad = false
+      })
+    },
+    // 鍏抽棴寮规
+    closeDia() {
+      this.$refs.form.resetFields();
+      this.formDia = false
+      this.$emit('closeDia')
+    },
+  }
+};
+</script>
+
+<style scoped>
+>>>.el-dialog__body {
+  max-height: 720px;
+  overflow-y: auto;
+}
+</style>
diff --git a/src/views/CNAS/process/ensureResults/ensureResultsValidity/components/evaluateDialog.vue b/src/views/CNAS/process/ensureResults/ensureResultsValidity/components/evaluateDialog.vue
new file mode 100644
index 0000000..aae2b99
--- /dev/null
+++ b/src/views/CNAS/process/ensureResults/ensureResultsValidity/components/evaluateDialog.vue
@@ -0,0 +1,334 @@
+<template>
+  <div>
+    <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :visible.sync="formDia" title="璐ㄩ噺鐩戞帶璇勪环"
+      width="60%" @close="closeEvaDia">
+      <div style="text-align: right">
+        <el-button size="small" type="primary" @click="viewTestRecord">闄勪欢涓婁紶</el-button>
+      </div>
+      <el-steps :active="currentStep" align-center finish-status="success">
+        <el-step title="鐩戞帶璁″垝瀹炴柦鎯呭喌" @click.native="setStep(0)"></el-step>
+        <el-step title="鐩戞帶缁撴灉璇勪环" @click.native="setStep(1)"></el-step>
+        <el-step title="璇勫缁撹锛堟槸鍚﹂噰鍙栨帾鏂斤級" @click.native="setStep(2)"></el-step>
+      </el-steps>
+      <div>
+        <table border="1" cellspacing="10" class="tables">
+          <tr v-if="showStep === 0">
+            <td class="td-title">
+              <p><span class="required-span">* </span>璇勫鐩殑锛�</p>
+            </td>
+            <td class="td-info" colspan="3">
+              <el-input v-if="showStep === 0 && currentStep === 0" v-model="form.reviewPurpose" placeholder="璇疯緭鍏ュ唴瀹�"
+                size="small">
+              </el-input>
+              <span v-if="showStep === 0 && currentStep !== 0" class="td-info1"> {{ form.reviewPurpose }}</span>
+            </td>
+          </tr>
+          <tr v-if="showStep === 0">
+            <td class="td-title">
+              <p><span class="required-span">* </span>璇勫浜哄憳锛�</p>
+            </td>
+            <td class="td-info" colspan="3">
+              <el-input v-if="showStep === 0 && currentStep === 0" v-model="form.reviewUser" placeholder="璇疯緭鍏ュ唴瀹�"
+                size="small">
+              </el-input>
+              <span v-if="showStep === 0 && currentStep !== 0" class="td-info1"> {{ form.reviewUser }}</span>
+            </td>
+          </tr>
+          <tr v-if="showStep === 0">
+            <td class="td-title">
+              <p><span class="required-span">* </span>璇勫鏃ユ湡锛�</p>
+            </td>
+            <td class="td-info" colspan="3">
+              <el-input v-if="showStep === 0 && currentStep === 0" v-model="form.reviewTime" placeholder="璇疯緭鍏ュ唴瀹�"
+                size="small">
+              </el-input>
+              <span v-if="showStep === 0 && currentStep !== 0" class="td-info1"> {{ form.reviewTime }}</span>
+            </td>
+          </tr>
+          <tr v-if="showStep === 0">
+            <td class="td-title">
+              <p><span class="required-span">* </span>鐩戞帶璁″垝瀹炴柦鎯呭喌锛�</p>
+            </td>
+            <td class="td-info" colspan="3">
+              <el-input v-if="showStep === 0 && currentStep === 0" v-model="form.implementCondition" :rows="5"
+                placeholder="璇疯緭鍏ュ唴瀹�" size="small" type="textarea">
+              </el-input>
+              <span v-if="showStep === 0 && currentStep !== 0" class="td-info1"> {{ form.implementCondition }}</span>
+            </td>
+          </tr>
+          <tr v-if="showStep === 0">
+            <td class="td-title">
+              <p>瀹炴柦閮ㄩ棬锛�</p>
+            </td>
+            <td class="td-info">
+              <span> {{ form.implementDepartment }}</span>
+            </td>
+            <td v-if="currentStep === 0" class="td-title">
+              <p>璇烽�夋嫨涓嬩竴姝ヨ礋璐d汉锛�</p>
+            </td>
+            <td v-if="currentStep === 0" class="td-info">
+              <el-select v-model="form.implementUserId" clearable filterable placeholder="璇烽�夋嫨" size="small">
+                <el-option v-for="(item, i) in personList" :key="i" :label="item.label" :value="item.value">
+                </el-option>
+              </el-select>
+            </td>
+          </tr>
+          <tr v-if="showStep === 1">
+            <td class="td-title">
+              <p>鐩戞帶缁撴灉璇勪环锛�</p>
+            </td>
+            <td class="td-info" colspan="4">
+              <el-input v-if="showStep === 1 && currentStep === 1" v-model="form.implementResult" :rows="5"
+                placeholder="璇疯緭鍏ュ唴瀹�" size="small" type="textarea">
+              </el-input>
+              <span v-if="showStep === 1 && currentStep !== 1" class="td-info1"> {{ form.implementResult }}</span>
+            </td>
+          </tr>
+          <tr v-if="showStep === 1">
+            <td class="td-title">
+              <p>褰撳墠璐熻矗浜猴細</p>
+            </td>
+            <td class="td-info" colspan="4">
+              {{ form.implementName }}
+            </td>
+          </tr>
+          <tr v-if="showStep === 1">
+            <td v-if="currentStep === 1" class="td-title">
+              <p>璇烽�夋嫨涓嬩竴姝ヨ礋璐d汉锛�</p>
+            </td>
+            <td v-if="currentStep === 1" class="td-info" colspan="4">
+              <el-select v-model="form.ratifyUserId" clearable filterable placeholder="璇烽�夋嫨" size="small">
+                <el-option v-for="(item, i) in personList" :key="i" :label="item.label" :value="item.value">
+                </el-option>
+              </el-select>
+            </td>
+          </tr>
+          <tr v-if="showStep === 2">
+            <td class="td-title">
+              <p>璇勫缁撹锛堟槸鍚﹂噰鍙栨帾鏂斤級锛�</p>
+            </td>
+            <td class="td-info" colspan="4">
+              <el-input v-if="showStep === 2 && currentStep === 2" v-model="form.ratifyOpinion" :rows="5"
+                placeholder="璇疯緭鍏ュ唴瀹�" size="small" type="textarea">
+              </el-input>
+              <span v-if="showStep === 2 && currentStep !== 2" class="td-info1"> {{ form.ratifyOpinion }}</span>
+            </td>
+          </tr>
+          <tr v-if="showStep === 2">
+            <td class="td-title">
+              <p>褰撳墠璐熻矗浜猴細</p>
+            </td>
+            <td class="td-info" colspan="4">
+              {{ form.ratifyUserName }}
+            </td>
+          </tr>
+          <tr v-if="showStep === 2">
+            <td class="td-title">
+              <p>瀹℃壒鏃ユ湡锛�</p>
+            </td>
+            <td class="td-info" colspan="4">
+              {{ form.ratifyTime }}
+            </td>
+          </tr>
+        </table>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="closeEvaDia">鍙� 娑�</el-button>
+        <el-button v-if="currentStep !== 3" :loading="editLoad" type="primary" @click="handleEdit">鎻� 浜�</el-button>
+      </span>
+    </el-dialog>
+    <view-record v-if="ViewRecord" ref="ViewRecord"></view-record>
+  </div>
+</template>
+
+<script>
+import ViewRecord from './ViewRecord.vue';
+import {
+  getQualityMonitorEvaluate,
+  addMonitorEvaluateOpinion,
+  addQualityMonitorEvaluate,
+} from '@/api/cnas/process/ensureResults/ensureResultsValidity.js'
+import { selectUserCondition } from "@/api/system/user";
+import { selectUserDepartmentLimsName } from "@/api/system/user";
+export default {
+  name: 'evaluateDialog',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { ViewRecord },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      formDia: false,
+      currentStep: 0,
+      showStep: 0,
+      form: {
+        implementDepartment: '',
+        reviewPurpose: '',
+        reviewUser: '',
+        reviewTime: '',
+        implementCondition: '',
+        implementName: '',
+        implementUserId: '',
+        implementResult: '',
+        ratifyUserName: '',
+        ratifyUserId: '',
+        ratifyOpinion: '',
+        qualityMonitorDetailsId: '',
+        ratifyTime: '',
+        detailsEvaluateId: '',
+      },
+      editLoad: false,
+      personList: [],
+      ViewRecord: false,
+    };
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    openDia(row) {
+      this.formDia = true
+      this.searchInfo(row)
+      this.getAuthorizedPerson()
+      this.getDepartment()
+    },
+    // 鏌ヨ鐩戞帶璁″垝璇︽儏瀹炴柦淇℃伅
+    searchInfo(row) {
+      this.form.qualityMonitorDetailsId = row.qualityMonitorDetailsId
+      getQualityMonitorEvaluate({ qualityMonitorDetailsId: row.qualityMonitorDetailsId }).then(res => {
+        if (res.code === 201) return
+        if (res.data === null) {
+          this.showStep = 0
+          this.currentStep = 0
+        } else {
+          this.form = res.data
+          if (res.data.isFinish === 0) {
+            if (res.data.implementUserId && !res.data.ratifyUserId) {
+              this.showStep = 1
+              this.currentStep = 1
+            } else if (res.data.implementUserId && res.data.ratifyUserId) {
+              this.showStep = 2
+              this.currentStep = 2
+            }
+          } else {
+            this.currentStep = 3
+            this.showStep = 2
+          }
+        }
+      }).catch(err => {
+        console.log('err---', err);
+      })
+    },
+    // 鎻愪氦
+    handleEdit() {
+      if (this.currentStep === 2) {
+        addMonitorEvaluateOpinion(this.form).then(res => {
+          this.editLoad = false
+          if (res.code === 201) return
+          this.$message.success('鎿嶄綔鎴愬姛')
+          this.closeEvaDia()
+        }).catch(err => {
+          console.log('err---', err);
+          this.editLoad = false
+        })
+      } else {
+        if (!this.form.reviewPurpose) {
+          this.$message.warning('璇峰~鍐欒瘎瀹$洰鐨�')
+          return
+        }
+        if (!this.form.reviewUser) {
+          this.$message.warning('璇峰~鍐欒瘎瀹′汉鍛�')
+          return
+        }
+        if (!this.form.reviewTime) {
+          this.$message.warning('璇峰~鍐欒瘎瀹℃棩鏈�')
+          return
+        }
+        if (!this.form.implementCondition) {
+          this.$message.warning('璇峰~鍐欑洃鎺ц鍒掑疄鏂芥儏鍐�')
+          return
+        }
+        if (!this.form.implementUserId) {
+          this.$message.warning('璇烽�夋嫨涓嬩竴姝ヨ礋璐d汉')
+          return
+        }
+        if (this.currentStep === 1) {
+          if (!this.form.ratifyUserId) {
+            this.$message.warning('璇烽�夋嫨涓嬩竴姝ヨ礋璐d汉')
+            return
+          }
+        }
+        addQualityMonitorEvaluate(this.form).then(res => {
+          this.editLoad = false
+          if (res.code === 201) return
+          this.$message.success('鎿嶄綔鎴愬姛')
+          this.closeEvaDia()
+        }).catch(err => {
+          console.log('err---', err);
+          this.editLoad = false
+        })
+      }
+    },
+    // 鍏抽棴寮规
+    closeEvaDia() {
+      this.formDia = false
+      this.$emit('closeEvaDia')
+    },
+    setStep(step) {
+      this.showStep = step
+    },
+    viewTestRecord() {
+      this.ViewRecord = true
+      this.$nextTick(() => {
+        this.$refs.ViewRecord.openDia(this.form)
+      })
+    },
+    getAuthorizedPerson() {
+      selectUserCondition().then(res => {
+        let data = []
+        res.data.forEach(a => {
+          data.push({
+            label: a.name,
+            value: a.id
+          })
+        })
+        this.personList = data
+      })
+    },
+    getDepartment() {
+      selectUserDepartmentLimsName().then(res => {
+        if (res.code === 201) return
+        this.form.implementDepartment = res.data
+      })
+    },
+  }
+};
+</script>
+
+<style scoped>
+.tables {
+  table-layout: fixed;
+  width: 100%;
+  margin-top: 10px;
+}
+
+.td-title {
+  height: 40px;
+  width: 170px;
+  text-align: center;
+  font-size: 14px;
+  word-wrap: break-word;
+  white-space: normal;
+  padding: 6px;
+}
+
+.td-info {
+  padding: 6px;
+}
+
+.td-info1 {
+  display: inline-block;
+  width: 100%;
+  text-align: left;
+  font-size: 14px;
+  word-wrap: break-word;
+  white-space: normal;
+}
+</style>
diff --git a/src/views/CNAS/process/ensureResults/ensureResultsValidity/index.vue b/src/views/CNAS/process/ensureResults/ensureResultsValidity/index.vue
new file mode 100644
index 0000000..98fafe1
--- /dev/null
+++ b/src/views/CNAS/process/ensureResults/ensureResultsValidity/index.vue
@@ -0,0 +1,670 @@
+<template>
+  <!--  7.7璐ㄩ噺鐩戞帶璁″垝-->
+  <div>
+    <div class="table-card">
+      <TableCard title="骞村害璁″垝琛�" style="margin-top: 10px;">
+        <template v-slot:form>
+          <div class="items_center">
+            <span>璁″垝鍚嶇О锛�</span>
+            <el-input v-model="yearForm.monitorName" class="search" placeholder="璇疯緭鍏�" size="small"></el-input>
+            <el-button size="small" type="primary" @click="getYearPlanList">鏌ヨ</el-button>
+            <el-button size="small" @click="clearYear">閲嶇疆</el-button>
+          </div>
+          <div>
+            <el-upload ref='upload' :action="action" :before-upload="beforeUpload" :headers="uploadHeader"
+              :on-error="onError" :data="uploadData" :on-success="handleSuccessUp" :show-file-list="false"
+              accept='.jpg,.jpeg,.png,.gif,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.zip,.rar'>
+              <el-button :loading="upLoading" size="small" type="primary">瀵煎叆</el-button>
+            </el-upload>
+          </div>
+        </template>
+        <template v-slot:table>
+          <limsTable ref="yearTable" :column="yearColumnData" :height="'28vh'" :highlightCurrentRow="true"
+            :rowClick="rowClick" :table-data="yearTableData" :table-loading="yearLoading"
+            style="margin-top: 0.5em;padding: 0 15px;" :page="yearPage">
+          </limsTable>
+        </template>
+      </TableCard>
+    </div>
+    <div class="table-card">
+      <TableCard title="骞村害璁″垝鏄庣粏琛�" style="margin-top: 10px;">
+        <template v-slot:form>
+          <div class="items_center">
+            <span>鐩戞帶鐩殑锛�</span>
+            <el-input v-model="yearDetailForm.monitorPurpose" class="search" placeholder="璇疯緭鍏�" size="small"></el-input>
+            <span>鐩戞帶椤圭洰锛�</span>
+            <el-input v-model="yearDetailForm.monitorProject" class="search" placeholder="璇疯緭鍏�" size="small"></el-input>
+            <el-button size="small" type="primary" @click="getYearDetailPlanList">鏌ヨ</el-button>
+            <el-button size="small" @click="clearDetail">閲嶇疆</el-button>
+          </div>
+          <div>
+            <el-button size="small" type="primary" @click="showDialog('add')">鏂板</el-button>
+          </div>
+        </template>
+        <template v-slot:table>
+          <limsTable :column="yearDetailColumnData" :height="'28vh'" :table-data="yearDetailTableData"
+            :table-loading="yearDetailLoading" style="margin-top: 18px; padding: 0 15px;" :page="yearDetailPage">
+          </limsTable>
+        </template>
+      </TableCard>
+    </div>
+    <!--鏂板淇敼寮规-->
+    <detail-form-dialog v-if="formDia" ref="formDia" :qualityMonitorId="qualityMonitorId"
+      @closeDia="closeDia"></detail-form-dialog>
+    <!--瀹炴柦娴佺▼寮规-->
+    <carry-out-dialog v-if="carryOutDia" ref="carryOutDia" :qualityMonitorId="qualityMonitorId"
+      @closeDia="closeCarryOutDia"></carry-out-dialog>
+    <!--璇勪环娴佺▼寮规-->
+    <evaluate-dialog v-if="evaluateDialog" ref="evaluateDialog" @closeEvaDia="closeEvaDia"></evaluate-dialog>
+    <el-dialog :visible.sync="examineDialog" title="瀹℃牳" width="30%" @close="closeExamineDia">
+      <span>
+        瀹℃牳澶囨敞锛�
+        <el-input v-model="examineInfo.examineRemark" type="textarea"></el-input>
+      </span>
+      <span slot="footer" class="dialog-footer">
+        <el-button :loading="examineLoading" @click="handleReview(0)">涓嶉�氳繃</el-button>
+        <el-button :loading="examineLoading" type="primary" @click="handleReview(1)">閫� 杩�</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog :visible.sync="ratifyDialog" title="鎵瑰噯" width="30%" @close="closeRatifyDia">
+      <span>
+        鎵瑰噯澶囨敞锛�
+        <el-input v-model="ratifyInfo.ratifyRemark" type="textarea"></el-input>
+      </span>
+      <span slot="footer" class="dialog-footer">
+        <el-button :loading="ratifyLoading" @click="handleRatify(0)">涓嶆壒鍑�</el-button>
+        <el-button :loading="ratifyLoading" type="primary" @click="handleRatify(1)">鎵� 鍑�</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog :visible.sync="downloadDialog" title="瀵煎嚭" width="600px">
+      <span>
+        <el-button plain type="primary" @click="controlDown">瀹炴柦璁″垝瀵煎嚭</el-button>
+        <el-button plain type="primary" @click="processingDown">璇勪环瀵煎嚭</el-button>
+      </span>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="downloadDialog = false">鍙� 娑�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import TableCard from '@/components/TableCard/index.vue';
+import limsTable from "@/components/Table/lims-table.vue";
+import DetailFormDialog from './components/detailFormDialog.vue';
+import CarryOutDialog from './components/carryOutDialog.vue';
+import EvaluateDialog from './components/evaluateDialog.vue';
+import {
+  pageQualityMonitor,
+  examineQualityMonitor,
+  ratifyQualityMonitor,
+  exportQualityMonitorDetail,
+  delQualitySupervise,
+  pageQualityMonitorDetail,
+  exportQualityMonitorRatify,
+  exportQualityMonitorEvaluate,
+  delQualityMonitorDetail,
+} from '@/api/cnas/process/ensureResults/ensureResultsValidity.js'
+
+export default {
+  name: 'a7-Ensure-results-validity',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { EvaluateDialog, CarryOutDialog, DetailFormDialog, limsTable, TableCard },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      uploadData: {},
+      yearForm: {
+        monitorName: '',
+      },
+      yearPage: {
+        current: 1,
+        size: 20,
+        total: 0
+      },
+      yearColumnData: [
+        {
+          label: '璁″垝鍚嶇О',
+          prop: 'monitorName',
+          minWidth: '150px'
+        }, {
+          label: '缂栧埗浜�',
+          prop: 'writeName',
+          minWidth: '100'
+        }, {
+          label: '缂栧埗鏃ユ湡',
+          prop: 'writeTime',
+          minWidth: '160'
+        }, {
+          dataType: 'tag',
+          label: '瀹℃牳鐘舵��',
+          prop: 'examineStatus',
+          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;
+            }
+          }
+        }, {
+          label: '瀹℃牳鍐呭',
+          prop: 'examineRemark',
+          minWidth: '100'
+        }, {
+          label: '瀹℃牳浜�',
+          prop: 'examineName',
+          minWidth: '100'
+        }, {
+          label: '瀹℃牳鏃ユ湡',
+          prop: 'examineTime',
+          minWidth: '160'
+        }, {
+          dataType: 'tag',
+          label: '鎵瑰噯鐘舵��',
+          prop: 'ratifyStatus',
+          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;
+            }
+          }
+        }, {
+          label: '鎵瑰噯鍐呭',
+          prop: 'ratifyRemark',
+          minWidth: '100'
+        }, {
+          label: '鎵瑰噯浜�',
+          prop: 'ratifyName',
+          minWidth: '100'
+        }, {
+          label: '鎵瑰噯鏃ユ湡',
+          prop: 'ratifyTime',
+          minWidth: '160'
+        }, {
+          label: '鍒涘缓鏃ユ湡',
+          prop: 'createTime',
+          minWidth: '160'
+        }, {
+          label: '鍒涘缓浜�',
+          prop: 'createUser',
+          minWidth: '100'
+        }, {
+          dataType: 'action',
+          minWidth: '170',
+          label: '鎿嶄綔',
+          fixed: 'right',
+          operation: [
+            {
+              name: '瀹℃牳',
+              type: 'text',
+              disabled: (row) => {
+                if (row.examineStatus === 1) {
+                  return true
+                } else {
+                  return false
+                }
+              },
+              clickFun: (row) => {
+                this.examinePlan(row)
+              }
+            },
+            {
+              name: '鎵瑰噯',
+              type: 'text',
+              disabled: (row) => {
+                if (row.ratifyStatus === 1 || row.examineStatus !== 1) {
+                  return true
+                } else {
+                  return false
+                }
+              },
+              clickFun: (row) => {
+                this.approvalPlan(row)
+              }
+            },
+            {
+              name: '瀵煎嚭',
+              type: 'text',
+              clickFun: (row) => {
+                this.handleDown(row)
+              }
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              color: '#f56c6c',
+              clickFun: (row) => {
+                this.delPlan(row)
+              }
+            }
+          ]
+        }],
+      yearTableData: [],  // 骞磋〃
+      yearLoading: false,
+      yearDetailForm: {
+        monitorPurpose: '',
+        monitorProject: ''
+      },
+      yearDetailColumnData: [
+        {
+          label: '鐩戞帶鐩殑',
+          prop: 'monitorPurpose',
+          width: '150px',
+          showOverflowTooltip: true,
+        }, {
+          label: '璁″垝寮�灞曟椂闂�',
+          prop: 'plannedTime',
+          minWidth: '150px'
+        }, {
+          label: '鐩戞帶椤圭洰',
+          prop: 'monitorProject',
+          minWidth: '150px'
+        }, {
+          label: '鍙傚姞鍗曚綅锛堜汉鍛橈級',
+          prop: 'participant',
+          minWidth: '150px'
+        }, {
+          label: '棰勭畻锛堝厓锛�',
+          prop: 'budget',
+          minWidth: '150px'
+        }, {
+          label: '缁勭粐浜哄憳',
+          prop: 'organization',
+          minWidth: '150px'
+        }, {
+          label: '鐩戞帶鏂瑰紡',
+          prop: 'monitorWay',
+          minWidth: '150px'
+        }, {
+          dataType: 'action',
+          width: '180',
+          label: '鎿嶄綔',
+          fixed: 'right',
+          operation: [
+            {
+              name: '缂栬緫',
+              type: 'text',
+              clickFun: (row) => {
+                this.showDialog('edit', row)
+              }
+            },
+            {
+              name: '瀹炴柦',
+              type: 'text',
+              clickFun: (row) => {
+                this.carryOut(row)
+              }
+            },
+            {
+              name: '璇勪环',
+              type: 'text',
+              clickFun: (row) => {
+                this.evaluate(row)
+              }
+            },
+            {
+              name: '瀵煎嚭',
+              type: 'text',
+              clickFun: (row) => {
+                this.downLoadPost(row);
+              },
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              color: '#f56c6c',
+              clickFun: (row) => {
+                this.delYearPlanDetail(row)
+              }
+            }
+          ]
+        }
+      ],
+      yearDetailTableData: [], // 骞存槑缁嗚〃
+      yearDetailLoading: false,
+      yearDetailPage: {
+        current: 1,
+        size: 20,
+        total: 0
+      },
+      formDia: false,
+      qualityMonitorId: '',
+      carryOutDia: false,
+      evaluateDialog: false,
+      examineDialog: false,
+      examineLoading: false,
+      ratifyDialog: false,
+      ratifyLoading: false,
+      examineInfo: {},
+      ratifyInfo: {},
+      upLoading: false,
+      downloadDialog: false,
+      download: {},
+    };
+  },
+  mounted() {
+    this.getYearPlanList()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鏌ヨ骞村害璁″垝琛�
+    getYearPlanList() {
+      const entity = {
+        monitorName: this.yearForm.monitorName,
+      }
+      const page = this.yearPage
+      this.yearLoading = true
+      pageQualityMonitor({ ...entity, ...page }).then(res => {
+        this.yearLoading = false
+        if (res.code === 201) return
+        this.yearTableData = res.data.records
+        this.yearPage.total = res.data.total
+        if (this.yearTableData.length > 0) {
+          this.rowClick(this.yearTableData[0])
+        }
+      }).catch(err => {
+        console.log('err---', err);
+        this.yearLoading = false
+      })
+    },
+    clearYear() {
+      this.yearForm.monitorName = ''
+      this.getYearPlanList()
+    },
+    // 瀵煎叆娴佺▼
+    beforeUpload(file) {
+      if (file.size > 1024 * 1024 * 10) {
+        this.$message.error('涓婁紶鏂囦欢涓嶈秴杩�10M');
+        this.$refs.upload.clearFiles()
+        return false;
+      } else {
+        this.upLoading = true;
+        let list = file.name.split(".")
+        let suffix = list[list.length - 1]
+        this.$set(this.uploadData, 'suffix', suffix)
+        return true;
+      }
+    },
+    onError(err, file, fileList) {
+      this.$message.error('涓婁紶澶辫触')
+      this.$refs.upload.clearFiles()
+    },
+    handleSuccessUp(response) {
+      this.upLoading = false;
+      if (response.code == 200) {
+        this.$message.success('涓婁紶鎴愬姛');
+        this.getYearPlanList()
+      }
+    },
+    // 瀹℃牳
+    examinePlan(row) {
+      this.examineDialog = true
+      this.examineInfo = row
+    },
+    handleReview(examineStatus) {
+      // 瀹℃牳鐘舵�� , 0 涓嶉�氳繃, 1閫氳繃
+      this.examineInfo.examineStatus = examineStatus
+      this.examineLoading = true
+      examineQualityMonitor(this.examineInfo).then(res => {
+        this.examineLoading = false
+        if (res.code === 201) return
+        this.$message.success('鎿嶄綔鎴愬姛')
+        this.closeExamineDia()
+      }).catch(err => {
+        console.log('err---', err);
+        this.examineLoading = false
+      })
+    },
+    closeExamineDia() {
+      this.examineDialog = false
+      this.examineInfo.examineRemark = ''
+      this.getYearPlanList()
+    },
+    // 鎵瑰噯
+    approvalPlan(row) {
+      this.ratifyDialog = true
+      this.ratifyInfo = row
+    },
+    handleRatify(ratifyStatus) {
+      // 鎵瑰噯鐘舵�� , 0 涓嶉�氳繃, 1閫氳繃
+      this.ratifyInfo.ratifyStatus = ratifyStatus
+      this.ratifyLoading = true
+      ratifyQualityMonitor(this.ratifyInfo).then(res => {
+        this.ratifyLoading = false
+        if (res.code === 201) return
+        this.$message.success('鎿嶄綔鎴愬姛')
+        this.closeRatifyDia()
+      }).catch(err => {
+        console.log('err---', err);
+        this.ratifyLoading = false
+      })
+    },
+    closeRatifyDia() {
+      this.ratifyDialog = false
+      this.ratifyInfo.ratifyRemark = ''
+      this.getYearPlanList()
+    },
+    // 瀵煎嚭
+    handleDown(row) {
+      exportQualityMonitorDetail({ qualityMonitorId: row.qualityMonitorId }).then(res => {
+        this.outLoading = false
+        const blob = new Blob([res], { type: 'application/msword' });
+        this.$download.saveAs(blob, row.monitorName + '.docx')
+      })
+    },
+    // 鍒犻櫎杩涘害璁″垝琛�
+    delPlan(row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.yearLoading = true
+        delQualitySupervise({ qualityMonitorId: row.qualityMonitorId }).then(res => {
+          this.yearLoading = false
+          if (res.code === 201) return
+          this.$message.success('鍒犻櫎鎴愬姛')
+          this.getYearPlanList();
+
+        }).catch(err => {
+          this.yearLoading = false
+          console.log('err---', err);
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+    // 骞村害璁″垝琛ㄦ牸锛岀偣鍑昏鏁版嵁鍚庡埛鏂拌鎯�
+    rowClick(row) {
+      this.qualityMonitorId = row.qualityMonitorId
+      this.getYearDetailPlanList()
+    },
+    // 鑾峰彇骞村害鏄庣粏琛�
+    getYearDetailPlanList() {
+      const entity = {
+        qualityMonitorId: this.qualityMonitorId,
+        monitorPurpose: this.yearDetailForm.monitorPurpose,
+        monitorProject: this.yearDetailForm.monitorProject,
+      }
+      const page = this.yearDetailPage
+      this.yearDetailLoading = true
+      pageQualityMonitorDetail({ ...entity, ...page }).then(res => {
+        this.yearDetailLoading = false
+        if (res.code === 201) return
+        this.yearDetailTableData = res.data.records
+        this.yearDetailPage.total = res.data.total
+      }).catch(err => {
+        console.log('err---', err);
+        this.yearDetailLoading = false
+      })
+    },
+    // 閲嶇疆鏄庣粏琛�
+    clearDetail() {
+      this.yearDetailForm = {
+        monitorPurpose: '',
+        monitorProject: ''
+      }
+      this.getYearDetailPlanList()
+    },
+    // 鏄庣粏琛ㄥ疄鏂�
+    carryOut(row) {
+      this.carryOutDia = true
+      this.$nextTick(() => {
+        this.$refs.carryOutDia.openDia(row)
+      })
+    },
+    closeCarryOutDia() {
+      this.carryOutDia = false
+      this.getYearDetailPlanList()
+    },
+    // 鎵撳紑璇勪环寮规
+    evaluate(row) {
+      this.evaluateDialog = true
+      this.$nextTick(() => {
+        this.$refs.evaluateDialog.openDia(row)
+      })
+    },
+    closeEvaDia() {
+      this.evaluateDialog = false
+      this.getYearDetailPlanList()
+    },
+    // 鎵撳紑瀵煎嚭寮规
+    downLoadPost(row) {
+      this.downloadDialog = true
+      this.download = row
+    },
+    // 鎵撳紑骞村害鏄庣粏鏂板銆佷慨鏀瑰脊妗�
+    showDialog(type, row) {
+      this.formDia = true
+      this.$nextTick(() => {
+        this.$refs.formDia.openDia(type, row)
+      })
+    },
+    closeDia() {
+      this.formDia = false
+      this.getYearDetailPlanList()
+    },
+    // 鎺у埗鍗曞鍑�
+    controlDown() {
+      exportQualityMonitorRatify({
+        qualityMonitorDetailsId: this.download.qualityMonitorDetailsId
+      }).then(res => {
+        this.outLoading = false
+        const blob = new Blob([res], { type: 'application/msword' });
+        this.$download.saveAs(blob, '璐ㄩ噺鐩戞帶瀹炴柦璁″垝.docx')
+      })
+    },
+    // 澶勭悊鍗曞鍑�
+    processingDown() {
+      exportQualityMonitorEvaluate({ qualityMonitorDetailsId: this.download.qualityMonitorDetailsId }).then(res => {
+        this.outLoading = false
+        const blob = new Blob([res], { type: 'application/msword' });
+        this.$download.saveAs(blob, '璐ㄩ噺鐩戞帶璇勪环.docx')
+      })
+    },
+    delYearPlanDetail(row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.yearDetailLoading = true
+        delQualityMonitorDetail({ qualityMonitorDetailsId: row.qualityMonitorDetailsId }).then(res => {
+          this.yearDetailLoading = false
+          if (res.code === 201) return
+          this.$message.success('鍒犻櫎鎴愬姛')
+          this.getYearDetailPlanList()
+        }).catch(err => {
+          this.yearDetailLoading = false
+          console.log('err---', err);
+        })
+      })
+    },
+    // 骞磋鍒掑垎椤�
+    handleYearCurrent(page) {
+      this.yearPage.current = page
+      this.getYearPlanList()
+    },
+    handleYearSizeChange(size) {
+      this.yearPage.size = size
+      this.getYearPlanList()
+    },
+    // 骞存槑缁嗚鍒掑垎椤�
+    handleYearDetailCurrent(page) {
+      this.yearDetailPage.current = page
+      this.getYearDetailPlanList()
+    },
+    handleYearDetailSizeChange(size) {
+      this.yearDetailPage.size = size
+      this.getYearDetailPlanList()
+    },
+  },
+  // 鐢ㄤ簬涓婁紶鏂囦欢鐨勪俊鎭�
+  computed: {
+    action() {
+      return this.javaApi + '/qualityMonitor/importQualityMonitor'
+    }
+  },
+};
+</script>
+
+<style scoped>
+.table-card {
+  background-color: #ffffff;
+}
+
+.flex_column {
+  display: flex;
+  height: 80vh;
+  flex-direction: column;
+  overflow: auto;
+  justify-content: space-between;
+}
+
+.pagination {
+  display: flex;
+  justify-content: space-between
+}
+
+.items_center {
+  display: flex;
+  align-items: center;
+}
+
+.date_box {
+  margin: 0 5px;
+}
+
+.search {
+  width: 150px;
+  padding: 0 16px;
+}
+</style>
diff --git a/src/views/CNAS/process/ensureResults/qualityControlPlan/index.vue b/src/views/CNAS/process/ensureResults/qualityControlPlan/index.vue
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/views/CNAS/process/ensureResults/qualityControlPlan/index.vue
diff --git a/src/views/CNAS/process/nonconformingWork/nonconformingDistribution/components/formDia.vue b/src/views/CNAS/process/nonconformingWork/nonconformingDistribution/components/formDia.vue
new file mode 100644
index 0000000..84509e0
--- /dev/null
+++ b/src/views/CNAS/process/nonconformingWork/nonconformingDistribution/components/formDia.vue
@@ -0,0 +1,232 @@
+<template>
+  <div>
+    <el-dialog v-loading="diaLoading" :close-on-click-modal="false" :close-on-press-escape="false"
+      :visible.sync="formDia" title="涓嶇鍚堥」鐨勫垎甯�" width="90%" @close="closeDia">
+      <table border="1" cellspacing="10" class="table">
+        <tr>
+          <td>绔犺妭鍙�</td>
+          <th class="div-with-line">
+            <span style="float: left;">瑕佺礌</span>
+            <span style="float: right;">閮ㄩ棬</span>
+          </th>
+          <th>涓讳换</th>
+          <th>鎶�鏈礋璐d汉</th>
+          <th>璐ㄩ噺璐熻矗浜�</th>
+          <th>缁煎悎瀹�</th>
+          <th>璇曢獙瀹�</th>
+          <th>鍚堣</th>
+          <th>鍗�%</th>
+        </tr>
+        <tr v-for="(item, index) in distributionDetailList" :key="item.value">
+          <td>{{ item.chapterNumber }}</td>
+          <th>{{ item.essentials }}</th>
+          <th>
+            <el-input-number v-model="item.director" :precision="0" clearable size="small"></el-input-number>
+          </th>
+          <th>
+            <el-input-number v-model="item.technology" :precision="0" clearable size="small"></el-input-number>
+          </th>
+          <th>
+            <el-input-number v-model="item.quality" :precision="0" clearable size="small"></el-input-number>
+          </th>
+          <th>
+            <el-input-number v-model="item.comprehensive" :precision="0" clearable size="small"></el-input-number>
+          </th>
+          <th>
+            <el-input-number v-model="item.testing" :precision="0" clearable size="small"></el-input-number>
+          </th>
+          <th>
+            {{ item.total }}
+          </th>
+          <th>
+            {{ (item.proportion ? item.proportion : 0) + '%' }}
+          </th>
+        </tr>
+        <tr>
+          <td> </td>
+          <th>
+            鍗犳瘮
+          </th>
+          <th>
+            {{ (distributionProportion.director ? distributionProportion.director : 0) + '%' }}
+          </th>
+          <th>
+            {{ (distributionProportion.technology ? distributionProportion.technology : 0) + '%' }}
+          </th>
+          <th>
+            {{ (distributionProportion.quality ? distributionProportion.quality : 0) + '%' }}
+          </th>
+          <th>
+            {{ (distributionProportion.comprehensive ? distributionProportion.comprehensive : 0) + '%' }}
+          </th>
+          <th>
+            {{ (distributionProportion.testing ? distributionProportion.testing : 0) + '%' }}
+          </th>
+          <th>
+            {{ distributionProportion.total ? distributionProportion.total : 0 }}
+          </th>
+          <th> </th>
+        </tr>
+      </table>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="closeDia">鍙� 娑�</el-button>
+        <el-button :loading="loading" type="primary" @click="handleEdit">鎻� 浜�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  getInconsistentDistributionOne,
+  addInconsistentDistribution,
+  updateInconsistentDistribution
+} from '@/api/cnas/process/nonconformingWork.js'
+export default {
+  name: 'formDia',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      formDia: false,
+      diaLoading: false,
+      loading: false,
+      distributionDetailList: [],
+      form: {
+
+      },
+      distributionProportion: {}
+    };
+  },
+  mounted() {
+
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鎵撳紑寮规
+    openDia(type, row) {
+      this.formDia = true
+      this.operationType = type
+      if (type !== 'add') {
+        this.searchInfo(row)
+      } else {
+        this.selectEnumByCategory()
+      }
+    },
+    // 鏌ヨ璇︽儏
+    searchInfo(row) {
+      this.diaLoading = true
+      getInconsistentDistributionOne({ distributionId: row.distributionId }).then(res => {
+        this.diaLoading = false
+        if (res.code === 201) return
+        this.form = res.data
+        this.distributionDetailList = this.form.distributionDetailList
+        this.distributionProportion = this.form.distributionProportion
+      }).catch(err => {
+        console.log(err)
+        this.diaLoading = false
+      })
+    },
+    // 鎻愪氦寮规鏁版嵁
+    handleEdit() {
+      const date = new Date();
+      const year = date.getFullYear();
+      this.loading = true
+      const internalPlan = this.HaveJson(this.form)
+      internalPlan.distributionYear = year
+      internalPlan.distributionDetailList = this.HaveJson(this.distributionDetailList)
+      if (this.operationType === 'add') {
+        addInconsistentDistribution(internalPlan).then(res => {
+          this.loading = false
+          if (res.code === 201) return
+          this.$message.success('鎿嶄綔鎴愬姛')
+          this.closeDia()
+        }).catch(err => {
+          console.log('err---', err);
+          this.loading = false
+        })
+      } else if (this.operationType === 'edit') {
+        updateInconsistentDistribution(internalPlan).then(res => {
+          this.loading = false
+          if (res.code === 201) return
+          this.$message.success('鎿嶄綔鎴愬姛')
+          this.closeDia()
+        }).catch(err => {
+          console.log('err---', err);
+          this.loading = false
+        })
+      }
+    },
+    closeDia() {
+      this.formDia = false
+      this.$emit('closeDia')
+    },
+    selectEnumByCategory() {
+      this.distributionDetailList = []
+      // 瑕佺礌
+      this.getDicts("essential").then((response) => {
+        let arr = this.dictToValue(response.data)
+        arr.map((item) => {
+          const obj = Object.assign({
+            essentials: item.label,
+            chapterNumber: item.value,
+          })
+          this.distributionDetailList.push(obj)
+        })
+      });
+    },
+  }
+};
+</script>
+
+<style scoped>
+>>>.el-dialog {
+  margin: 6vh auto 50px !important;
+}
+
+>>>.el-dialog__body {
+  max-height: 68vh;
+  overflow-y: auto;
+}
+
+>>>.is-required {
+  margin-bottom: 6px;
+}
+
+.table {
+  width: 100%;
+  margin-top: 20px;
+}
+
+.table td {
+  width: 30px;
+  text-align: center;
+}
+
+.table th {
+  width: 70px;
+  height: 70px;
+  text-align: center;
+}
+
+.div-with-line {
+  width: 70px;
+  height: 70px;
+  position: relative;
+  /*overflow: hidden; /* 闅愯棌婧㈠嚭鍐呭 */
+}
+
+.div-with-line::after {
+  content: '';
+  position: absolute;
+  bottom: 0;
+  height: 1px;
+  background-color: #000000;
+  left: 50%;
+  transform: translateX(-50%) rotate(45deg);
+  transform-origin: center 50%;
+  top: 50%;
+  width: 100px;
+}
+</style>
diff --git a/src/views/CNAS/process/nonconformingWork/nonconformingDistribution/index.vue b/src/views/CNAS/process/nonconformingWork/nonconformingDistribution/index.vue
new file mode 100644
index 0000000..8a39ebc
--- /dev/null
+++ b/src/views/CNAS/process/nonconformingWork/nonconformingDistribution/index.vue
@@ -0,0 +1,237 @@
+<template>
+  <div>
+    <div>
+      <!-- <div class="view-title">
+        <span>涓嶇鍚堥」鐨勫垎甯�</span>
+        <span>
+          <el-button size="medium" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button>
+        </span>
+      </div> -->
+      <div class="search-background">
+        <span class="search-group">
+          <span style="width: 120px">骞翠唤锛�</span>
+          <el-input v-model="searchForm.distributionYear" clearable size="small"></el-input>
+        </span>
+        <span class="search-group">
+          <el-button size="medium" @click="resetSearchForm">閲� 缃�</el-button>
+          <el-button size="medium" type="primary" @click="searchList">鏌� 璇�</el-button>
+        </span>
+        <div class="btn">
+          <el-button size="medium" type="primary" @click="openFormDia('add')">鏂� 澧�</el-button>
+        </div>
+      </div>
+      <div class="table">
+        <div>
+          <TableCard :showForm="false" :showTitle="false">
+            <template v-slot:table>
+              <limsTable :column="tableColumn" :height="'calc(100vh - 19em)'" :table-data="tableData"
+                :table-loading="tableLoading" style="padding: 0 15px;margin-bottom: 16px" :page="page"
+                @pagination="pagination">
+              </limsTable>
+            </template>
+          </TableCard>
+        </div>
+      </div>
+    </div>
+    <form-dia v-if="formDia" ref="formDia" @closeDia="closeDia"></form-dia>
+  </div>
+</template>
+
+<script>
+import limsTable from "@/components/Table/lims-table.vue";
+import TableCard from '@/components/TableCard/index.vue';
+import FormDia from './components/formDia.vue';
+import {
+  pageInconsistentDistribution,
+  delInconsistentDistribution,
+  exportInconsistentDistribution,
+} from '@/api/cnas/process/nonconformingWork.js'
+
+export default {
+  name: 'a7-distribution-of-nonconforming',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { FormDia, TableCard, limsTable },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      searchForm: {
+        distributionYear: '',
+      },
+      tableColumn: [
+        {
+          label: '骞翠唤',
+          prop: 'distributionYear',
+          minWidth: '100'
+        },
+        {
+          label: '鍒涘缓浜�',
+          prop: 'createUserName',
+          minWidth: '100'
+        },
+        {
+          label: '鍒涘缓鏃堕棿',
+          prop: 'createTime',
+          minWidth: '100'
+        },
+        {
+          label: '淇敼浜�',
+          prop: 'updateUserName',
+          minWidth: '100'
+        },
+        {
+          label: '淇敼鏃堕棿',
+          prop: 'updateTime',
+          minWidth: '100'
+        },
+        {
+          dataType: 'action',
+          minWidth: '220',
+          label: '鎿嶄綔',
+          operation: [
+            {
+              name: '缂栬緫',
+              type: 'text',
+              clickFun: (row) => {
+                this.openFormDia('edit', row);
+              },
+            },
+            {
+              name: '瀵煎嚭',
+              type: 'text',
+              clickFun: (row) => {
+                this.handleDown(row)
+              }
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              color: '#f56c6c',
+              clickFun: (row) => {
+                this.delPlan(row)
+              },
+            }
+          ]
+        }
+      ],
+      tableData: [],
+      tableLoading: false,
+      page: {
+        size: 20,
+        current: 1,
+        total: 0,
+      },
+      formDia: false,
+    };
+  },
+  mounted() {
+    this.searchList()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鏌ヨ鍒楄〃
+    searchList() {
+      const entity = this.searchForm
+      const page = this.page
+      this.tableLoading = true
+      pageInconsistentDistribution({ ...entity, ...page }).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
+      })
+    },
+    // 鍒犻櫎
+    delPlan(row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.tableLoading = true
+        delInconsistentDistribution({ distributionId: row.distributionId }).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: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+    // 鏂板锛岀紪杈戯紝鎵瑰噯寮规
+    openFormDia(type, row) {
+      this.formDia = true
+      this.$nextTick(() => {
+        this.$refs.formDia.openDia(type, row)
+      })
+    },
+    // 瀵煎嚭
+    handleDown(row) {
+      exportInconsistentDistribution({ distributionId: row.distributionId }).then(res => {
+        this.outLoading = false
+        const blob = new Blob([res], { type: 'application/msword' });
+        this.$download.saveAs(blob, '涓嶇鍚堥」鐨勫垎甯�' + '.docx');
+      })
+    },
+    closeDia() {
+      this.formDia = false
+      this.searchList()
+    },
+    // 閲嶇疆鏌ヨ鏉′欢
+    resetSearchForm() {
+      this.searchForm.distributionYear = '';
+      this.searchList()
+    },
+    // 鍒嗛〉
+    pagination({ page, limit }) {
+      this.page.current = page;
+      this.page.size = limit;
+      this.searchList();
+    },
+  }
+};
+</script>
+
+<style scoped>
+.view-title {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  height: 60px;
+  padding-left: 20px;
+}
+
+.search-background {
+  width: 100%;
+  height: 80px;
+  line-height: 80px;
+  background-color: #ffffff;
+  display: flex;
+  position: relative;
+}
+
+.search-group {
+  display: flex;
+  align-items: center;
+  margin: 0 20px;
+}
+
+.table {
+  background-color: #ffffff;
+}
+
+.btn {
+  position: absolute;
+  right: 20px;
+  top: 16px;
+}
+</style>
diff --git a/src/views/CNAS/process/nonconformingWork/nonconformingItem/components/qualityInfo.vue b/src/views/CNAS/process/nonconformingWork/nonconformingItem/components/qualityInfo.vue
new file mode 100644
index 0000000..7ef970d
--- /dev/null
+++ b/src/views/CNAS/process/nonconformingWork/nonconformingItem/components/qualityInfo.vue
@@ -0,0 +1,322 @@
+<template>
+  <div>
+    <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :visible.sync="formDia" title="涓嶇鍚堝伐浣滄帶鍒跺崟"
+      width="80%" @close="closeProcessingDia">
+      <div style="height: 660px; overflow-y: auto">
+        <table border="1" cellspacing="10" class="tables">
+          <tr>
+            <td class="first-title" rowspan="8">
+              <p>涓嶇鍚堝伐浣滄儏鍐佃褰�</p>
+            </td>
+          </tr>
+          <tr>
+            <td class="td-title">
+              <p>鍙戠敓閮ㄩ棬锛�</p>
+            </td>
+            <td class="td-info">
+              <span class="td-info1"> {{ form.occurrenceDepartment }}</span>
+            </td>
+            <td class="td-title">
+              <p>閮ㄩ棬璐熻矗浜猴細</p>
+            </td>
+            <td class="td-info">
+              <span class="td-info1"> {{ form.headDepartment }}</span>
+            </td>
+          </tr>
+          <tr>
+            <td class="td-title">
+              <p>涓嶇鍚堝伐浣滃彂鐜伴�斿緞锛�</p>
+            </td>
+            <td class="td-info" colspan="3">
+              <el-radio-group v-model="form.findWay" v-removeAriaHidden disabled>
+                <el-radio :label="0">绠$悊璇勫</el-radio>
+                <el-radio :label="1">鍐呴儴瀹℃牳</el-radio>
+                <el-radio :label="2">妫�娴嬭繃绋嬫帶鍒�</el-radio>
+                <el-radio :label="3">鍐呴儴璐ㄩ噺鎺у埗</el-radio>
+                <el-radio :label="4">鍐呴儴鐩戠潱</el-radio>
+                <el-radio :label="5">澶栭儴璇勫</el-radio>
+                <el-radio :label="6">澶栭儴鎶曡瘔</el-radio>
+                <el-radio :label="7">鍏朵粬</el-radio>
+              </el-radio-group>
+            </td>
+          </tr>
+          <tr>
+            <td class="td-title">
+              <p>涓嶇鍚堝伐浣滅殑璇︾粏璁板綍锛�</p>
+            </td>
+            <td class="td-info" colspan="3">
+              <span class="td-info1"> {{ form.recordDetail }}</span>
+            </td>
+          </tr>
+          <tr>
+            <td class="td-title">
+              <p>涓嶇鍚堝伐浣滅殑浠ュ強鍙婃潯娆惧彿锛�</p>
+            </td>
+            <td class="td-info" colspan="3">
+              <span class="td-info1"> {{ form.recordAccording }}</span>
+            </td>
+          </tr>
+          <tr>
+            <td class="td-title">
+              <p>琚洃鐫d汉锛�</p>
+            </td>
+            <td class="td-info">
+              <span class="td-info1"> {{ form.supervisedUserName }}</span>
+            </td>
+            <td class="td-title">
+              <p>琚洃鐫f棩鏈燂細</p>
+            </td>
+            <td class="td-info">
+              <span class="td-info1"> {{ form.supervisedTime }}</span>
+            </td>
+          </tr>
+          <tr>
+            <td class="td-title">
+              <p>鍙戠幇閮ㄩ棬锛�</p>
+            </td>
+            <td class="td-info">
+              {{ form.foundDepartment }}
+            </td>
+            <td class="td-title">
+              <p>鏃堕棿锛�</p>
+            </td>
+            <td class="td-info">
+              {{ form.recordTime }}
+            </td>
+          </tr>
+          <tr>
+            <td class="td-title">
+              <p>璁板綍浜猴細</p>
+            </td>
+            <td class="td-info">
+              {{ form.recordUserName }}
+            </td>
+            <td class="td-title">
+              <p>璁板綍鏃堕棿锛�</p>
+            </td>
+            <td class="td-info">
+              {{ form.recordTime }}
+            </td>
+          </tr>
+          <tr>
+            <td class="first-title" rowspan="3">
+              <p>澶勭悊鎺柦</p>
+            </td>
+          </tr>
+          <tr>
+            <td class="td-title">
+              <p>娑堥櫎涓嶇鍚堝伐浣滄墍閲囧彇鐨勬帾鏂斤細</p>
+            </td>
+            <td class="td-info" colspan="3">
+              <span class="td-info1"> {{ form.eliminateMeasure }}</span>
+            </td>
+          </tr>
+          <tr>
+            <td class="td-title">
+              <p>璐熻矗浜猴細</p>
+            </td>
+            <td class="td-info">
+              {{ form.actionsUserName }}
+            </td>
+            <td class="td-title">
+              <p>澶勭悊鏃堕棿锛�</p>
+            </td>
+            <td class="td-info">
+              {{ form.actionsTime }}
+            </td>
+          </tr>
+          <tr>
+            <td class="first-title" rowspan="4">
+              <p>绾犳鎺柦</p>
+            </td>
+          </tr>
+          <tr>
+            <td class="td-title">
+              <p>鏄惁闇�瑕侀噰鍙栫籂姝f帾鏂斤細</p>
+            </td>
+            <td class="td-info" colspan="3">
+              <el-radio-group v-model="form.isCorrect" v-removeAriaHidden disabled>
+                <el-radio :label="0">鍚�</el-radio>
+                <el-radio :label="1">鏄�</el-radio>
+              </el-radio-group>
+            </td>
+          </tr>
+          <tr>
+            <td class="td-title">
+              <p>绾犳鎺柦澶勭悊鍗曡窡韪細</p>
+            </td>
+            <td class="td-info" colspan="3">
+              <span class="td-info1"> {{ form.correctContent }}</span>
+            </td>
+          </tr>
+          <tr>
+            <td class="td-title">
+              <p>璐熻矗浜猴細</p>
+            </td>
+            <td class="td-info">
+              {{ form.correctUserName }}
+            </td>
+            <td class="td-title">
+              <p>澶勭悊鏃堕棿锛�</p>
+            </td>
+            <td class="td-info">
+              {{ form.correctTime }}
+            </td>
+          </tr>
+          <tr>
+            <td class="first-title" rowspan="4">
+              <p>鏄惁閫氱煡瀹㈡埛鍙婂彲鎭㈠宸ヤ綔</p>
+            </td>
+          </tr>
+          <tr>
+            <td class="td-title">
+              <p>閫氱煡瀹㈡埛锛�</p>
+            </td>
+            <td class="td-info" colspan="3">
+              <el-radio-group v-model="form.notifyCustomer" v-removeAriaHidden disabled>
+                <el-radio :label="0">鍚�</el-radio>
+                <el-radio :label="1">鏄�</el-radio>
+              </el-radio-group>
+            </td>
+          </tr>
+          <tr>
+            <td class="td-title">
+              <p>鎭㈠宸ヤ綔锛�</p>
+            </td>
+            <td class="td-info" colspan="3">
+              <el-radio-group v-model="form.backToWork" v-removeAriaHidden disabled>
+                <el-radio :label="0">鍚�</el-radio>
+                <el-radio :label="1">鏄�</el-radio>
+              </el-radio-group>
+            </td>
+          </tr>
+          <tr>
+            <td class="td-title">
+              <p>璐熻矗浜猴細</p>
+            </td>
+            <td class="td-info">
+              {{ form.qualityManagerUserName }}
+            </td>
+            <td class="td-title">
+              <p>澶勭悊鏃堕棿锛�</p>
+            </td>
+            <td class="td-info">
+              {{ form.qualityManagerTime }}
+            </td>
+          </tr>
+        </table>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  getSuperviseDetailAccording
+} from '@/api/cnas/process/nonconformingWork.js'
+export default {
+  name: 'qualityInfo',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      formDia: false,
+      form: {
+        occurrenceDepartment: '',
+        headDepartment: '',
+        findWay: '',
+        recordDetail: '',
+        recordAccording: '',
+        supervisedUserName: '',
+        supervisedTime: '',
+        actionsUserName: '',
+        eliminateMeasure: '',
+        correctUserName: '',
+        isCorrect: '',
+        correctContent: '',
+        recordUserName: '',
+        recordTime: '',
+        foundDepartment: '',
+        actionsTime: '',
+        correctTime: '',
+        notifyCustomer: '',
+        backToWork: '',
+        qualityManagerUserName: '',
+        qualityManagerTime: '',
+      },
+    };
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    openDia(row) {
+      this.formDia = true
+      this.searchInfo(row)
+    },
+    // 鏌ヨ鐩戞帶璁″垝璇︽儏瀹炴柦淇℃伅
+    searchInfo(row) {
+      this.form.qualityMonitorDetailsId = row.qualityMonitorDetailsId
+      getSuperviseDetailAccording({ superviseDetailsId: row.superviseDetailsId }).then(res => {
+        if (res.code === 201) return
+        this.form = res.data
+      }).catch(err => {
+        console.log('err---', err);
+      })
+    },
+    // 鍏抽棴寮规
+    closeProcessingDia() {
+      this.formDia = false
+    },
+  }
+};
+</script>
+
+<style scoped>
+>>>.el-dialog {
+  margin: 5vh auto 50px !important;
+}
+
+.tables {
+  table-layout: fixed;
+  width: 100%;
+  margin-top: 10px;
+}
+
+.first-title {
+  display: table-cell;
+  width: 100px;
+  /* 璁剧疆涓�涓浐瀹氬搴� */
+  height: 200px;
+  /* 璁剧疆涓�涓浐瀹氶珮搴� */
+  text-align: center;
+  /* 姘村钩灞呬腑 */
+  vertical-align: middle;
+  /* 鍨傜洿灞呬腑 */
+  writing-mode: vertical-rl;
+  /* 鏂囧瓧绔栫洿鎺掑垪 */
+  padding: 10px 0;
+}
+
+.td-title {
+  height: 40px;
+  width: 170px;
+  text-align: center;
+  font-size: 14px;
+  word-wrap: break-word;
+  white-space: normal;
+  padding: 6px;
+}
+
+.td-info {
+  padding: 10px;
+}
+
+.td-info1 {
+  display: inline-block;
+  width: 100%;
+  text-align: left;
+  font-size: 14px;
+  word-wrap: break-word;
+  white-space: normal;
+}
+</style>
diff --git a/src/views/CNAS/process/nonconformingWork/nonconformingItem/index.vue b/src/views/CNAS/process/nonconformingWork/nonconformingItem/index.vue
new file mode 100644
index 0000000..4c0e60b
--- /dev/null
+++ b/src/views/CNAS/process/nonconformingWork/nonconformingItem/index.vue
@@ -0,0 +1,196 @@
+<template>
+  <div>
+    <div>
+      <div class="search-background">
+        <span class="search-group">
+          <span style="width: 120px">鍙戠敓閮ㄩ棬锛�</span>
+          <el-input v-model="searchForm.occurrenceDepartment" clearable size="small"></el-input>
+        </span>
+        <span class="search-group">
+          <el-button size="medium" @click="resetSearchForm">閲� 缃�</el-button>
+          <el-button size="medium" type="primary" @click="searchList">鏌� 璇�</el-button>
+        </span>
+      </div>
+      <div class="table">
+        <div>
+          <TableCard :showForm="false" :showTitle="false">
+            <template v-slot:table>
+              <limsTable :column="tableColumn" :height="'calc(100vh - 19em)'" :table-data="tableData"
+                :table-loading="tableLoading" style="padding: 0 15px;margin-bottom: 16px" :page="page"
+                @pagination="pagination">
+              </limsTable>
+            </template>
+          </TableCard>
+        </div>
+      </div>
+    </div>
+    <quality-info v-if="qualityInfo" ref="qualityInfo"></quality-info>
+  </div>
+</template>
+
+<script>
+import limsTable from "@/components/Table/lims-table.vue";
+import TableCard from '@/components/TableCard/index.vue';
+import QualityInfo from './components/qualityInfo.vue';
+import {
+  pageSuperviseDetailAccording,
+  superviseDetailAccordingExport
+} from '@/api/cnas/process/nonconformingWork.js'
+
+export default {
+  name: 'a7-nonconforming-item',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { QualityInfo, TableCard, limsTable },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      searchForm: {
+        occurrenceDepartment: '',
+      },
+      tableColumn: [
+        {
+          label: '鍙戠敓閮ㄩ棬',
+          prop: 'occurrenceDepartment',
+          minWidth: '100'
+        },
+        {
+          label: '閮ㄩ棬璐熻矗浜�',
+          prop: 'headDepartment',
+          minWidth: '100'
+        },
+        {
+          label: '鍙戠幇閫斿緞',
+          prop: 'findWay',
+          minWidth: '100'
+        },
+        {
+          label: '璇︾粏璁板綍',
+          prop: 'recordDetail',
+          minWidth: '100'
+        },
+        {
+          label: '渚濇嵁鍜屾潯娆惧彿',
+          prop: 'recordAccording',
+          minWidth: '100'
+        },
+        {
+          label: '鍙戠幇閮ㄩ棬',
+          prop: 'foundDepartment',
+          minWidth: '100'
+        },
+        {
+          label: '琚洃鐫d汉',
+          prop: 'supervisedUserName',
+          minWidth: '100'
+        },
+        {
+          dataType: 'action',
+          minWidth: '60',
+          label: '鎿嶄綔',
+          operation: [
+            {
+              name: '鏌ョ湅',
+              type: 'text',
+              clickFun: (row) => {
+                this.viewInfo(row);
+              },
+            },
+            {
+              name: '瀵煎嚭',
+              type: 'text',
+              clickFun: (row) => {
+                this.openDownloadDia(row);
+              },
+            },
+          ]
+        }
+      ],
+      tableData: [],
+      tableLoading: false,
+      page: {
+        size: 20,
+        current: 1,
+        total: 0,
+      },
+      qualityInfo: false,
+    };
+  },
+  mounted() {
+    this.searchList()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鏌ヨ鍒楄〃
+    searchList() {
+      const entity = {
+        occurrenceDepartment: this.searchForm.occurrenceDepartment,
+      }
+      const page = this.page
+      this.tableLoading = true
+      pageSuperviseDetailAccording({ ...entity, ...page }).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
+      })
+    },
+    // 閲嶇疆鏌ヨ鏉′欢
+    resetSearchForm() {
+      this.searchForm.occurrenceDepartment = '';
+      this.searchList()
+    },
+    viewInfo(row) {
+      this.qualityInfo = true
+      this.$nextTick(() => {
+        this.$refs.qualityInfo.openDia(row)
+      })
+    },
+    // 瀵煎嚭
+    openDownloadDia(row) {
+      superviseDetailAccordingExport({ superviseDetailsId: row.superviseDetailsId }).then(res => {
+        const blob = new Blob([res], { type: 'application/msword' });
+        this.$download.saveAs(blob, '涓嶇鍚堥」瀵煎嚭' + '.docx');
+      }).catch(err => {
+        console.log('err---', err);
+      })
+    },
+    // 鍒嗛〉
+    pagination({ page, limit }) {
+      this.page.current = page;
+      this.page.size = limit;
+      this.searchList();
+    },
+  }
+};
+</script>
+
+<style scoped>
+.view-title {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  height: 60px;
+  padding-left: 20px;
+}
+
+.search-background {
+  width: 100%;
+  height: 80px;
+  line-height: 80px;
+  background-color: #ffffff;
+  display: flex;
+}
+
+.search-group {
+  display: flex;
+  align-items: center;
+  margin: 0 20px;
+}
+
+.table {
+  background-color: #ffffff;
+}
+</style>
diff --git a/src/views/CNAS/process/reportResults/index.vue b/src/views/CNAS/process/reportResults/index.vue
new file mode 100644
index 0000000..66ae2ea
--- /dev/null
+++ b/src/views/CNAS/process/reportResults/index.vue
@@ -0,0 +1,409 @@
+<template>
+  <div class="report-results">
+    <div class="search">
+      <div class="search_thing">
+        <div class="search_label">妫�楠屾姤鍛婄紪鍙凤細</div>
+        <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="queryParams.insReportCode"
+            @keyup.enter.native="refreshTable()"></el-input></div>
+      </div>
+      <div class="search_thing" style="padding-left: 30px;">
+        <el-button size="small" @click="refresh()">閲� 缃�</el-button>
+        <el-button size="small" type="primary" @click="refreshTable()">鏌� 璇�</el-button>
+      </div>
+      <div class="btn">
+        <el-button size="medium" type="primary" @click="handleDown" :loading="outLoading" v-if="outPower">瀵煎嚭</el-button>
+        <el-button size="medium" type="primary" @click="openAdd" v-if="addPower">鏂板</el-button>
+      </div>
+    </div>
+    <div class="table">
+      <lims-table :tableData="tableData" :column="column" :tableLoading="tableLoading" :height="'calc(100vh - 270px)'"
+        :page="page" @pagination="pagination" :isSelection="true"
+        :handleSelectionChange="handleSelectionChange"></lims-table>
+    </div>
+    <el-dialog :title="title" :visible.sync="addDialogVisible" width="400px" top="6vh">
+      <el-row>
+        <el-col :span="24" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">妫�楠屾姤鍛婄紪鍙凤細</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable
+                v-model="addInfo.insReportCode"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="24" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">椤垫暟锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable
+                v-model="addInfo.pages"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="24" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">鍙戦�佷唤鏁帮細</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable
+                v-model="addInfo.number"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="24" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">鍙戝線浣曞锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable
+                v-model="addInfo.send"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="24" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">鍙戦�佹柟寮忥細</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable
+                v-model="addInfo.method"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="24" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">鍙戦�佹棩鏈燂細</div>
+            <div class="search_input">
+              <el-date-picker v-model="addInfo.sendTime" type="date" size="small" placeholder="閫夋嫨鏃ユ湡" format="yyyy-MM-dd"
+                value-format="yyyy-MM-dd" style="width: 100%;">
+              </el-date-picker>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="24" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">鍙戦�佷汉锛�</div>
+            <div class="search_input">
+              <el-select v-model="addInfo.sendUser" placeholder="璇烽�夋嫨" size="small" style="width: 100%;">
+                <el-option v-for="item in personList" :key="item.value" :label="item.label" :value="item.value">
+                </el-option>
+              </el-select>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="24" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">绛炬敹浜猴細</div>
+            <div class="search_input">
+              <el-select v-model="addInfo.signatory" placeholder="璇烽�夋嫨" size="small" style="width: 100%;" multiple>
+                <el-option v-for="item in personList" :key="item.value" :label="item.label" :value="item.value">
+                </el-option>
+              </el-select>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="24" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">澶囨敞锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable v-model="addInfo.remark"
+                type="textarea" :rows="2"></el-input></div>
+          </div>
+        </el-col>
+      </el-row>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="addDialogVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="handleAdd" :loading="addLoading">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import limsTable from "@/components/Table/lims-table.vue";
+import {
+  exportProcessReport,
+  doProcessReport,
+  addProcessReport,
+  pageProcessReport,
+  delProcessReport
+} from '@/api/cnas/process/reportResults.js'
+import {
+  selectUserCondition,
+} from "@/api/system/user.js";
+export default {
+  components: {
+    limsTable
+  },
+  data() {
+    return {
+      outLoading: false,
+      addPower: true,
+      outPower: true,
+      personList: [],
+      title: '鏂板',
+      addDialogVisible: false,
+      addInfo: {
+        signatory: []
+      },
+      addLoading: false,
+      mutilSelect: [],
+      queryParams: {},
+      tableData: [],
+      column: [
+        { label: "妫�楠屾姤鍛婄紪鍙�", prop: "insReportCode" },
+        { label: "椤垫暟", prop: "pages", width: "120px" },
+        {
+          label: "鍙戦�佷唤鏁�",
+          prop: "number",
+        },
+        { label: "鍙戝線浣曞", prop: "send" },
+        { label: "鍙戦�佹柟寮�", prop: "method" },
+        { label: "鍙戦�佹棩鏈�", prop: "sendTime" },
+        { label: "鍙戦�佷汉", prop: "sendUserName" },
+        { label: "绛炬敹浜�", prop: "signatoryName" },
+        { label: "澶囨敞", prop: "remark" },
+        {
+          dataType: "action",
+          fixed: "right",
+          label: "鎿嶄綔",
+          operation: [
+            {
+              name: "缂栬緫",
+              type: "text",
+              clickFun: (row) => {
+                this.handleWork(row);
+              },
+            },
+            {
+              name: "鍒犻櫎",
+              type: "text",
+              clickFun: (row) => {
+                this.handleDelete(row);
+              },
+            },
+          ],
+        },
+      ],
+      page: {
+        total: 0,
+        size: 10,
+        current: 0,
+      },
+      tableLoading: false,
+    }
+  },
+  mounted() {
+    // this.entityCopy = this.HaveJson(this.componentData.entity);
+    this.getList()
+    this.getAuthorizedPerson()
+  },
+  methods: {
+    getPower() {
+      let power = JSON.parse(sessionStorage.getItem('power'))
+      let up = false
+      let del = false
+      let add = false
+      let out = false
+      for (var i = 0; i < power.length; i++) {
+        if (power[i].menuMethod == 'doProcessReport') {
+          up = true
+        }
+        if (power[i].menuMethod == 'addProcessReport') {
+          add = true
+        }
+        if (power[i].menuMethod == 'delProcessReport') {
+          del = true
+        }
+        if (power[i].menuMethod == 'exportProcessReport') {
+          out = true
+        }
+      }
+      if (!up) {
+        this.componentData.do.splice(1, 1)
+      }
+      if (!del) {
+        this.componentData.do.splice(0, 1)
+      }
+      this.outPower = out
+      this.addPower = add
+    },
+    handleDown() {
+      if (this.mutilSelect.length == 0) {
+        this.$message.warning('璇烽�夋嫨瑕佸鍑虹殑鏁版嵁')
+        return
+      }
+      this.outLoading = true
+      exportProcessReport({ ids: this.mutilSelect.map(m => m.id) }).then(res => {
+        this.outLoading = false
+        if (res.code === 201) return
+        const url = this.javaApi + '/word/' + res.data;
+        this.$download.saveAs(url, "鎶ュ憡缁撴灉");
+      })
+    },
+    openAdd() {
+      this.title = '鏂板'
+      this.addInfo = {
+        signatory: []
+      }
+      this.addDialogVisible = true;
+    },
+    getList() {
+      this.tableLoading = true;
+      let param = { ...this.queryParams, ...this.page };
+      delete param.total;
+      pageProcessReport({ ...param })
+        .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;
+        });
+    },
+    pagination({ page, limit }) {
+      this.page.current = page;
+      this.page.size = limit;
+      this.getList();
+    },
+    refresh() {
+      this.queryParams = {};
+      this.page.current = 1;
+      this.getList();
+    },
+    refreshTable() {
+      this.page.current = 1;
+      this.getList();
+    },
+    handleSelectionChange(val) {
+      this.mutilSelect = val
+    },
+    getAuthorizedPerson() {
+      selectUserCondition().then(res => {
+        let data = []
+        res.data.forEach(a => {
+          data.push({
+            label: a.name,
+            value: a.id
+          })
+        })
+        this.personList = data
+      })
+    },
+    handleAdd() {
+      this.addLoading = true
+      delete this.addInfo.createTime
+      delete this.addInfo.createUser
+      delete this.addInfo.updateTime
+      delete this.addInfo.signatoryUrl
+      delete this.addInfo.updateUserer
+      delete this.addInfo.sendUserName
+      let addInfo = this.HaveJson(this.addInfo)
+      addInfo.signatory = addInfo.signatory.join(',')
+      if (this.title == '鏂板') {
+        addProcessReport(addInfo).then(res => {
+          this.addLoading = false
+          if (res.code == 201) {
+            return
+          }
+          this.addDialogVisible = false
+          this.$message({
+            type: 'success',
+            message: '鎿嶄綔鎴愬姛!'
+          });
+          this.refreshTable()
+        }).catch(err => { })
+      } else {
+        doProcessReport(addInfo).then(res => {
+          this.addLoading = false
+          if (res.code == 201) {
+            return
+          }
+          this.addDialogVisible = false
+          this.$message({
+            type: 'success',
+            message: '鎿嶄綔鎴愬姛!'
+          });
+          this.refreshTable()
+        }).catch(err => { })
+      }
+    },
+    handleWork(row) {
+      this.title = '淇敼'
+      this.addInfo = row
+      console.log(this.addInfo)
+      this.addInfo.signatory = this.addInfo.signatory ? this.addInfo.signatory.split(',').map(m => Number(m)) : []
+      this.addDialogVisible = true;
+    },
+    handleChangeTask(list) {
+      this.mutilSelect = list
+    },
+    handleDelete(row) {
+      this.$confirm("鏄惁鍒犻櫎璇ユ潯鏁版嵁?", "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning",
+      })
+        .then(() => {
+          delProcessReport({ id: row.id }).then((res) => {
+            if (res.code == 201) return;
+            this.$message.success("鍒犻櫎鎴愬姛");
+            this.refresh();
+          });
+        })
+        .catch(() => { });
+    },
+  }
+}
+</script>
+
+<style scoped>
+.search {
+  background-color: #fff;
+  height: 80px;
+  display: flex;
+  align-items: center;
+  position: relative;
+}
+
+.search_thing {
+  width: 350px;
+  display: flex;
+  align-items: center;
+}
+
+.search_label {
+  width: 110px;
+  font-size: 14px;
+  text-align: right;
+}
+
+.search_input {
+  width: calc(100% - 110px);
+}
+
+.table {
+  background-color: #fff;
+  height: calc(100% - 60px - 80px - 10px - 40px);
+  padding: 20px;
+}
+
+.tables {
+  table-layout: fixed;
+  width: 100%;
+}
+
+.tables td {
+  height: 40px;
+  width: 100px;
+  text-align: center;
+  font-size: 14px;
+  word-wrap: break-word;
+  white-space: normal;
+}
+
+.en {
+  font-size: 12px;
+  word-break: break-word;
+  /* 鑷姩鏂 */
+  overflow-wrap: break-word;
+  /* 闃叉婧㈠嚭 */
+  white-space: normal;
+  /* 榛樿鎹㈣ */
+}
+
+.btn {
+  position: absolute;
+  top: 16px;
+  right: 20px;
+}
+</style>
diff --git a/src/views/CNAS/process/sampleDisposal/index.vue b/src/views/CNAS/process/sampleDisposal/index.vue
new file mode 100644
index 0000000..f56ae44
--- /dev/null
+++ b/src/views/CNAS/process/sampleDisposal/index.vue
@@ -0,0 +1,609 @@
+<template>
+  <div class="sample-disposal">
+    <el-tabs type="border-card" v-model="activeName" style="height: 100%;" @tab-click="queryParams.totaldealId = ''">
+      <el-tab-pane label="濉啓" name="濉啓" style="height: 100%;" :key="1">
+        <el-button size="small" type="primary" @click="handleAdd0" style="margin-left: 20px;">鏂板</el-button>
+        <div class="table" style="height: calc(100% - 200px)" v-if="activeName == '濉啓'">
+          <lims-table :tableData="tableData" :column="column" :tableLoading="tableLoading"
+            :height="'calc(100vh - 290px)'" :page="page" @pagination="pagination"></lims-table>
+        </div>
+      </el-tab-pane>
+      <el-tab-pane label="鍘嗗彶璁板綍" name="鍘嗗彶璁板綍" style="height: 100%;" :key="2">
+        <div class="search">
+          <div class="search_thing">
+            <div class="search_label">骞存湀锛�</div>
+            <div class="search_input">
+              <el-date-picker v-model="queryParams0.month" type="month" placeholder="閫夋嫨鏈�" format="yyyy-MM"
+                value-format="yyyy-MM" size="small" @change="refreshTable()">
+              </el-date-picker>
+            </div>
+          </div>
+          <div class="search_thing" style="padding-left: 30px;">
+            <el-button size="small" @click="refresh()">閲� 缃�</el-button>
+            <el-button size="small" type="primary" @click="refreshTable()">鏌� 璇�</el-button>
+          </div>
+        </div>
+        <div class="table">
+          <lims-table :tableData="tableData0" :column="column0" :tableLoading="tableLoading"
+            :height="'calc(100vh - 300px)'" :page="page0" @pagination="pagination0"></lims-table>
+        </div>
+      </el-tab-pane>
+    </el-tabs>
+    <!-- 鏂板鏍峰搧 -->
+    <el-dialog :title="title" :visible.sync="addDialogVisible" width="400px">
+      <el-row>
+        <el-col :span="24" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">鏍峰搧鍚嶇О锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable
+                v-model="addInfo.sampleName"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="24" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">鏍峰搧缂栧彿锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable
+                v-model="addInfo.sampleCode"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="24" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">渚涙牱鍗曚綅锛�</div>
+            <div class="search_input">
+              <el-select v-model="addInfo.sampleSupplier" size="small">
+                <el-option :label="item.company" :value="item.company" v-for="(item, index) in customPageList"
+                  :key="item.id"></el-option>
+              </el-select>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="24" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">鏁伴噺锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable
+                v-model="addInfo.num"></el-input>
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="24" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">澶勭悊鏂瑰紡锛�</div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable
+                v-model="addInfo.dealMethod"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="24" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">鏃堕棿锛�</div>
+            <div class="search_input">
+              <el-date-picker v-model="addInfo.dealTime" type="date" size="small" placeholder="閫夋嫨鏃ユ湡" format="yyyy-MM-dd"
+                value-format="yyyy-MM-dd" style="width: 100%;">
+              </el-date-picker>
+            </div>
+          </div>
+        </el-col>
+      </el-row>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="addDialogVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="submitAdd" :loading="addLoading">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+    <!-- 璇︽儏/涓嬭浇/瀹℃牳/鎵瑰噯 -->
+    <el-dialog :title="title0" :visible.sync="lookDialogVisible" width="800px" :class="{ downPdf: title0 == '涓嬭浇' }"
+      :modal="title0 != '涓嬭浇'" top="5vh">
+      <filePreview v-if="lookDialogVisible" :fileUrl="javaApi + '/word/' + currentInfo.url" :currentFile="{}"
+        style="max-height: 70vh;overflow-y: auto;" />
+      <span slot="footer" class="dialog-footer" v-if="title0 == '瀹℃牳' || title0 == '鎵瑰噯'">
+        <el-button @click="submitCheck('涓嶉�氳繃')" :loading="noCheckLoading">涓嶉�氳繃</el-button>
+        <el-button type="primary" @click="submitCheck('閫氳繃')" :loading="checkLoading">閫� 杩�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import limsTable from "@/components/Table/lims-table.vue";
+import filePreview from "@/components/Preview/filePreview.vue";
+import { selectCustomPageList } from "@/api/system/customer";
+import {
+  doProcessDeal,
+  addProcessDeal,
+  submitProcessTotaldeal,
+  pageProcessDeal,
+  checkProcessTotaldeal,
+  ratifyProcessTotaldeal,
+  delProcessDeal,
+  pageProcessTotaldeal,
+} from "@/api/cnas/process/sampleDisposal";
+export default {
+  components: {
+    limsTable,
+    filePreview,
+  },
+  name: "SampleDisposal",
+  data() {
+    return {
+      activeName: '濉啓',
+      title: '鏂板',
+      addDialogVisible: false,
+      addLoading: false,
+      outLoading: false,
+      editDialogVisible: false,
+      lookDialogVisible: false,
+      title0: '鏌ョ湅',
+      noCheckLoading: false,
+      checkLoading: false,
+      // 鍘嗗彶鍒楄〃
+      addInfo: {},//鏂板鏍峰搧
+      customPageList: [],
+      currentInfo: {
+        arr: []
+      },//鏌ョ湅鐨勮鎯�
+      outPower: false,
+      addPower: false,
+      queryParams: {},
+      tableData: [],
+      column: [
+        { label: "鏍峰搧鍚嶇О", prop: "sampleName" },
+        { label: "鏍峰搧缂栧彿", prop: "sampleCode" },
+        { label: "渚涙牱鍗曚綅", prop: "sampleSupplier" },
+        { label: "鏁伴噺", prop: "num" },
+        { label: "澶勭悊鏂瑰紡", prop: "dealMethod" },
+        { label: "鏃堕棿", prop: "dealTime" },
+        {
+          dataType: "action",
+          fixed: "right",
+          label: "鎿嶄綔",
+          operation: [
+            {
+              name: "缂栬緫",
+              type: "text",
+              clickFun: (row) => {
+                this.handleAdd0(row);
+              },
+            },
+            {
+              name: "鍒犻櫎",
+              type: "text",
+              clickFun: (row) => {
+                this.handleDelete(row);
+              },
+            },
+          ],
+        },
+      ],
+      page: {
+        total: 0,
+        size: 10,
+        current: 0,
+      },
+      tableLoading: false,
+      queryParams0: {},
+      tableData0: [],
+      column0: [
+        { label: "鏈堜唤", prop: "month" },
+        { label: "鎬绘暟閲�", prop: "totalNum" },
+        { label: "鎻愪氦浜�", prop: "submitUserName" },
+        { label: "瀹℃牳浜�", prop: "examineUserName" },
+        { label: "鎵瑰噯浜�", prop: "ratifyUserName" },
+        {
+          dataType: "action",
+          fixed: "right",
+          label: "鎿嶄綔",
+          operation: [
+            {
+              name: "鏌ョ湅",
+              type: "text",
+              clickFun: (row) => {
+                this.handleLook(row);
+              },
+            },
+            {
+              name: "涓嬭浇",
+              type: "text",
+              clickFun: (row) => {
+                this.handleDown0(row);
+              },
+              disabled: (row) => {
+                return !row.url
+              }
+            },
+            {
+              name: "鎻愪氦",
+              type: "text",
+              clickFun: (row) => {
+                this.handleSubmit(row);
+              },
+              disabled: (row) => {
+                return !!row.submitState && row.submitState != '寰呮彁浜�'
+              }
+            },
+            {
+              name: "瀹℃牳",
+              type: "text",
+              clickFun: (row) => {
+                this.handleCheck(row);
+              },
+              disabled: (row) => {
+                return row.examineState == '閫氳繃' || row.submitState == '寰呮彁浜�'
+              }
+            },
+            {
+              name: "鎵瑰噯",
+              type: "text",
+              clickFun: (row) => {
+                this.handleApproval(row);
+              },
+              disabled: (row) => {
+                return row.ratifyState == '閫氳繃' || row.submitState == '寰呮彁浜�'
+              }
+            },
+          ],
+        },
+      ],
+      page0: {
+        total: 0,
+        size: 10,
+        current: 0,
+      },
+    };
+  },
+  mounted() {
+    // this.entityCopy = this.HaveJson(this.componentData.entity);
+    this.getCustomPageList()
+    this.getList()
+    this.getList0()
+  },
+  methods: {
+    getPower() {
+      let power = JSON.parse(sessionStorage.getItem('power'))
+      let add = false
+      let out = false
+      let submitProcessTotaldeal = false
+      let checkProcessTotaldeal = false
+      let ratifyProcessTotaldeal = false
+      for (var i = 0; i < power.length; i++) {
+        if (power[i].menuMethod == 'addProcessDeal') {
+          add = true
+        }
+        // if (power[i].menuMethod == 'exportProcessEvaluate') {
+        //   out = true
+        // }
+        if (power[i].menuMethod == 'submitProcessTotaldeal') {
+          submitProcessTotaldeal = true
+        }
+        if (power[i].menuMethod == 'checkProcessTotaldeal') {
+          checkProcessTotaldeal = true
+        }
+        if (power[i].menuMethod == 'ratifyProcessTotaldeal') {
+          ratifyProcessTotaldeal = true
+        }
+      }
+      if (!ratifyProcessTotaldeal) {
+        this.componentData.do.splice(4, 1)
+      }
+      if (!checkProcessTotaldeal) {
+        this.componentData.do.splice(3, 1)
+      }
+      if (!submitProcessTotaldeal) {
+        this.componentData.do.splice(2, 1)
+      }
+      if (!add) {
+        this.componentData0.do.splice(1, 1)
+        this.componentData0.do.splice(0, 1)
+      }
+      this.addPower = add
+    },
+    // 鑾峰彇閫佹牱鍗曚綅鍒楄〃
+    getCustomPageList() {
+      selectCustomPageList({
+        current: -1,
+        size: -1
+      }).then(res => {
+        this.customPageList = res.data.records
+      }).catch(err => { });
+    },
+    handleDown() { },
+    getList() {
+      this.tableLoading = true;
+      let param = { ...this.queryParams, ...this.page };
+      delete param.total;
+      pageProcessDeal({ ...param })
+        .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;
+        });
+    },
+    pagination({ page, limit }) {
+      this.page.current = page;
+      this.page.size = limit;
+      this.getList();
+    },
+    refresh() {
+      this.queryParams0 = {};
+      this.page0.current = 1;
+      this.getList0();
+    },
+    refreshTable() {
+      this.page0.current = 1;
+      this.getList0();
+    },
+    getList0() {
+      this.tableLoading = true;
+      let param = { ...this.queryParams0, ...this.page };
+      delete param.total;
+      pageProcessTotaldeal({ ...param })
+        .then((res) => {
+          this.tableLoading = false;
+          if (res.code === 200) {
+            this.tableData0 = res.data.records;
+            this.page0.total = res.data.total;
+          }
+        })
+        .catch((err) => {
+          this.tableLoading = false;
+        });
+    },
+    pagination0({ page, limit }) {
+      this.page0.current = page;
+      this.page0.size = limit;
+      this.getList0();
+    },
+    // 濉啓
+    // handleAdd(row){
+    //   this.componentData0.entity.totaldealId = row.id
+    //   this.editDialogVisible = true
+    // },
+    // 鎵撳紑鏂板鐣岄潰
+    handleAdd0(row) {
+      if (row) {
+        this.addInfo = this.HaveJson(row)
+        this.title = '缂栬緫'
+      } else {
+        this.title = '鏂板'
+        this.addInfo = {}
+      }
+      this.addDialogVisible = true
+    },
+    // 鎻愪氦鏂板
+    submitAdd() {
+      if (this.addInfo.id) {
+        // 缂栬緫
+        this.addLoading = true
+        doProcessDeal({
+          totaldealId: this.queryParams.totaldealId,
+          ...this.addInfo
+        }).then(res => {
+          this.addLoading = false
+          if (res.code === 201) return
+          this.addDialogVisible = false
+          this.$message({
+            type: 'success',
+            message: '缂栬緫鎴愬姛!'
+          });
+          this.page.current = 0;
+          this.getList();
+        }).catch(err => { });
+      } else {
+        // 鏂板
+        this.addLoading = true
+        addProcessDeal({
+          totaldealId: this.queryParams.totaldealId,
+          ...this.addInfo
+        }).then(res => {
+          this.addLoading = false
+          if (res.code === 201) return
+          this.addDialogVisible = false
+          this.$message({
+            type: 'success',
+            message: '鏂板鎴愬姛!'
+          });
+          this.page.current = 0;
+          this.getList();
+        }).catch(err => { });
+      }
+    },
+    // 鎻愪氦
+    handleSubmit(row) {
+      this.$confirm('鏄惁鎻愪氦 ' + row.month + ' 鏈堜唤鐨勬暟鎹�', '鎻愪氦', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        submitProcessTotaldeal({
+          id: row.id
+        }).then(res => {
+          if (res.code === 201) return
+          this.$message({
+            type: 'success',
+            message: '鎻愪氦鎴愬姛!'
+          });
+          this.refreshTable()
+        }).catch(err => { });
+      })
+    },
+    // 鏌ョ湅
+    handleLook(row) {
+      // console.log(row)
+      // this.title0 = '鏌ョ湅'
+      // this.commonFun(row)
+      this.activeName = '濉啓'
+      this.queryParams.totaldealId = row.id
+      this.$nextTick(() => {
+        this.page.current = 0;
+        this.getList();
+      })
+    },
+    commonFun(row, callbanck) {
+      this.currentInfo = row
+      this.queryParams.totaldealId = row.id
+      pageProcessDeal({
+        current: -1,
+        size: -1, ...this.queryParams
+      }).then(res => {
+        this.lookDialogVisible = true
+        this.currentInfo.arr = res.data.records
+        if (callbanck) {
+          callbanck()
+        }
+      }).catch(err => { });
+    },
+    // 瀹℃牳
+    handleCheck(row) {
+      this.title0 = '瀹℃牳'
+      this.commonFun(row)
+    },
+    // 鎵瑰噯
+    handleApproval(row) {
+      this.title0 = '鎵瑰噯'
+      this.commonFun(row)
+    },
+    // 鎻愪氦瀹℃牳/鎵瑰噯
+    submitCheck(state) {
+      if (state == '閫氳繃') {
+        this.checkLoading = true
+      } else {
+        this.noCheckLoading = true
+      }
+      if (this.title0 == '瀹℃牳') {
+        checkProcessTotaldeal({
+          id: this.currentInfo.id,
+          state: state
+        }).then(res => {
+          this.checkLoading = false
+          this.noCheckLoading = false
+          if (res.code === 201) return
+          this.$message({
+            type: 'success',
+            message: '鎿嶄綔鎴愬姛!'
+          });
+          this.refreshTable()
+          this.lookDialogVisible = false
+        }).catch(err => { });
+      } else if (this.title0 == '鎵瑰噯') {
+        ratifyProcessTotaldeal({
+          id: this.currentInfo.id,
+          state: state
+        }).then(res => {
+          this.checkLoading = false
+          this.noCheckLoading = false
+          if (res.code === 201) return
+          this.$message({
+            type: 'success',
+            message: '鎿嶄綔鎴愬姛!'
+          });
+          this.refreshTable()
+          this.lookDialogVisible = false
+        }).catch(err => { });
+      }
+    },
+    // 瀵煎嚭璇︽儏
+    handleDown0(row) {
+      // 鍚庣涓嬭浇
+      let url = this.javaApi + '/word/' + row.url
+      this.$download.saveAs(url, row.month + ' 鏍峰搧澶勭悊鐢宠琛�');
+    },
+    handleDelete(row) {
+      this.$confirm("鏄惁鍒犻櫎璇ユ潯鏁版嵁?", "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning",
+      })
+        .then(() => {
+          delProcessDeal({ id: row.id }).then((res) => {
+            if (res.code == 201) return;
+            this.$message.success("鍒犻櫎鎴愬姛");
+            this.refresh();
+          });
+        })
+        .catch(() => { });
+    },
+  },
+}
+</script>
+
+<style scoped>
+.title {
+  height: 60px;
+  line-height: 60px;
+}
+
+.search {
+  background-color: #fff;
+  height: 40px;
+  display: flex;
+  align-items: center;
+  position: relative;
+}
+
+.search_thing {
+  width: 350px;
+  display: flex;
+  align-items: center;
+}
+
+.search_label {
+  width: 110px;
+  font-size: 14px;
+  text-align: right;
+}
+
+.search_input {
+  width: calc(100% - 110px);
+}
+
+.table {
+  background-color: #fff;
+  height: calc(100% - 60px - 140px);
+  padding: 20px;
+}
+
+.downPdf {
+  opacity: 0 !important;
+}
+
+.tables {
+  table-layout: fixed;
+  width: 100%;
+}
+
+.tables td {
+  height: 40px;
+  width: 100px;
+  text-align: center;
+  font-size: 14px;
+  word-wrap: break-word;
+  white-space: normal;
+}
+
+.en {
+  font-size: 12px;
+  word-break: break-word;
+  /* 鑷姩鏂 */
+  overflow-wrap: break-word;
+  /* 闃叉婧㈠嚭 */
+  white-space: normal;
+  /* 榛樿鎹㈣ */
+}
+
+.user-info {
+  display: flex;
+  align-items: center;
+  justify-content: space-evenly;
+  margin-top: 20px;
+}
+
+.user-info .el-button {
+  margin: 0;
+}
+
+>>>.el-tabs__content {
+  height: 100%;
+}
+</style>
diff --git a/src/views/CNAS/process/uncertainty/index.vue b/src/views/CNAS/process/uncertainty/index.vue
new file mode 100644
index 0000000..053008b
--- /dev/null
+++ b/src/views/CNAS/process/uncertainty/index.vue
@@ -0,0 +1,328 @@
+<template>
+  <div class="uncertainty-evaluation">
+    <div class="search">
+      <div class="search_thing">
+        <div class="search_label">鎶ュ憡鍚嶇О锛�</div>
+        <div class="search_input"><el-input v-model="queryParams.reportName" clearable placeholder="璇疯緭鍏�" size="small"
+            @keyup.enter.native="refreshTable()"></el-input></div>
+      </div>
+      <div class="search_thing" style="padding-left: 30px;">
+        <el-button size="small" @click="refresh()">閲� 缃�</el-button>
+        <el-button size="small" type="primary" @click="refreshTable()">鏌� 璇�</el-button>
+      </div>
+      <div class="btn">
+        <el-button :loading="outLoading" size="small" style="margin-right: 16px;margin-top: 3px;" type="primary"
+          @click="handleDown0">瀵煎嚭</el-button>
+        <el-upload ref='upload' :action="action" :headers="uploadHeader" :on-change="beforeUpload" :on-error="onError"
+          :on-success="handleSuccessUp" :show-file-list="false"
+          accept='.jpg,.jpeg,.png,.gif,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.zip,.rar'>
+          <el-button :loading="upLoading" size="small" type="primary">瀵煎叆</el-button></el-upload>
+      </div>
+    </div>
+    <div class="table">
+      <lims-table :tableData="tableData" :column="column" :tableLoading="tableLoading" :height="'calc(100vh - 270px)'"
+        :page="page" @pagination="pagination"></lims-table>
+    </div>
+    <el-dialog :visible.sync="addDialogVisible" title="璇勪环" width="400px">
+      <el-row>
+        <el-col :span="24" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">璇勪环锛�</div>
+            <div class="search_input"><el-input v-model="addInfo.note" clearable placeholder="璇疯緭鍏�"
+                size="small"></el-input></div>
+          </div>
+        </el-col>
+        <el-col :span="24" style="margin-bottom: 16px;">
+          <div class="search_thing">
+            <div class="search_label">鏃ユ湡锛�</div>
+            <div class="search_input">
+              <el-date-picker v-model="addInfo.evaluateTime" format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡" size="small"
+                style="width: 100%;" type="date" value-format="yyyy-MM-dd">
+              </el-date-picker>
+            </div>
+          </div>
+        </el-col>
+      </el-row>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="addDialogVisible = false">鍙� 娑�</el-button>
+        <el-button :loading="addLoading" type="primary" @click="handleAdd">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog :visible.sync="lookDialogVisible" fullscreen title="鏌ョ湅闄勪欢" top="5vh" width="800px">
+      <filePreview v-if="lookDialogVisible" :currentFile="{}" :fileUrl="javaApi + '/word/' + currentInfo.reportUrl"
+        style="max-height: 90vh;overflow-y: auto;" />
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import limsTable from "@/components/Table/lims-table.vue";
+import filePreview from "@/components/Preview/filePreview.vue";
+import {
+  exportProcessEvaluate,
+  doProcessEvaluate,
+  delProcessEvaluate,
+  pageProcessEvaluate,
+} from '@/api/cnas/process/uncertainty.js'
+import { mapGetters } from "vuex";
+export default {
+  components: {
+    limsTable,
+    filePreview
+  },
+  data() {
+    return {
+      addPower: false,
+      outPower: false,
+      outLoading: false,
+      upLoading: false,
+      addDialogVisible: false,
+      addInfo: {},
+      addLoading: false,
+      currentInfo: {},
+      lookDialogVisible: false,
+      queryParams: {},
+      tableData: [],
+      column: [
+        { label: "鎶ュ憡鍚嶇О", prop: "reportName" },
+        { label: "璇勪环浜�", prop: "evaluateUserName" },
+        { label: "璇勪环鏃ユ湡", prop: "evaluateTime" },
+        { label: "澶囨敞", prop: "note" },
+        {
+          dataType: "action",
+          fixed: "right",
+          label: "鎿嶄綔",
+          operation: [
+            {
+              name: "璇勪环",
+              type: "text",
+              clickFun: (row) => {
+                this.handleTell(row);
+              },
+            },
+            {
+              name: "鍒犻櫎",
+              type: "text",
+              clickFun: (row) => {
+                this.handleDelete(row);
+              },
+            },
+            {
+              name: "涓嬭浇",
+              type: "text",
+              clickFun: (row) => {
+                this.handleDown(row);
+              },
+            },
+            {
+              name: "鏌ョ湅闄勪欢",
+              type: "text",
+              clickFun: (row) => {
+                this.handleLook(row);
+              },
+            },
+          ],
+        },
+      ],
+      page: {
+        total: 0,
+        size: 10,
+        current: 0,
+      },
+      tableLoading: false,
+    }
+  },
+  // 鐢ㄤ簬涓婁紶鏂囦欢鐨勪俊鎭�
+  computed: {
+    ...mapGetters(["userId"]),
+    action() {
+      return this.javaApi + '/processEvaluate/addProcessEvaluate'
+    }
+  },
+  mounted() {
+    // this.entityCopy = this.HaveJson(this.componentData.entity);
+    this.getList()
+  },
+  methods: {
+    getPower() {
+      let power = JSON.parse(sessionStorage.getItem('power'))
+      let up = false
+      let del = false
+      let add = false
+      let out = false
+      for (var i = 0; i < power.length; i++) {
+        if (power[i].menuMethod == 'doProcessEvaluate') {
+          up = true
+        }
+        if (power[i].menuMethod == 'addProcessEvaluate') {
+          add = true
+        }
+        if (power[i].menuMethod == 'delProcessEvaluate') {
+          del = true
+        }
+        if (power[i].menuMethod == 'exportProcessEvaluate') {
+          out = true
+        }
+      }
+      if (!del) {
+        this.componentData.do.splice(1, 1)
+      }
+      if (!up) {
+        this.componentData.do.splice(0, 1)
+      }
+      this.outPower = out
+      this.addPower = add
+    },
+    handleDown0() {
+      this.outLoading = true
+      exportProcessEvaluate(this.queryParams).then(res => {
+        this.outLoading = false
+        if (res.code === 201) return
+        const blob = new Blob([res], { type: 'application/octet-stream' });
+        this.$download.saveAs(blob, '娴嬮噺涓嶇‘瀹氬害鐨勮瘎瀹�.xlsx');
+      })
+    },
+    handleDown(row) {
+      let url = this.javaApi + '/word/' + row.reportUrl
+      this.$download.saveAs(url, row.reportName);
+    },
+    beforeUpload(file) {
+      if (file.size > 1024 * 1024 * 10) {
+        this.$message.error('涓婁紶鏂囦欢涓嶈秴杩�10M');
+        this.$refs.upload.clearFiles()
+        return false;
+      } else {
+        // this.upLoading = true;
+        return true;
+      }
+    },
+    onError(err, file, fileList) {
+      this.$message.error('涓婁紶澶辫触')
+      this.$refs.upload.clearFiles()
+    },
+    handleSuccessUp(response) {
+      this.upLoading = false;
+      if (response.code == 200) {
+        this.$message.success('涓婁紶鎴愬姛');
+        this.refreshTable()
+      }
+    },
+    handleTell(row) {
+      this.addInfo = row;
+      this.addDialogVisible = true;
+    },
+    handleAdd() {
+      this.addLoading = true;
+      doProcessEvaluate({
+        id: this.addInfo.id,
+        note: this.addInfo.note,
+        evaluateTime: this.addInfo.evaluateTime,
+        evaluateUser: this.userId
+      }).then((res) => {
+        this.addLoading = false;
+        if (res.code == 201) {
+          this.$message.error('璇勪环澶辫触');
+          return;
+        }
+        this.$message.success('璇勪环鎴愬姛');
+        this.addDialogVisible = false;
+        this.refreshTable()
+      })
+    },
+    getList() {
+      this.tableLoading = true;
+      let param = { ...this.queryParams, ...this.page };
+      delete param.total;
+      pageProcessEvaluate({ ...param })
+        .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;
+        });
+    },
+    pagination({ page, limit }) {
+      this.page.current = page;
+      this.page.size = limit;
+      this.getList();
+    },
+    refresh() {
+      this.queryParams = {};
+      this.page.current = 1;
+      this.getList();
+    },
+    refreshTable() {
+      this.page.current = 1;
+      this.getList();
+    },
+    handleLook(row) {
+      this.currentInfo = row;
+      this.lookDialogVisible = true;
+    },
+    handleDelete(row) {
+      this.$confirm("鏄惁鍒犻櫎璇ユ潯鏁版嵁?", "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning",
+      })
+        .then(() => {
+          delProcessEvaluate({ id: row.id }).then((res) => {
+            if (res.code == 201) return;
+            this.$message.success("鍒犻櫎鎴愬姛");
+            this.refresh();
+          });
+        })
+        .catch(() => { });
+    },
+  }
+}
+</script>
+
+<style scoped>
+.title {
+  height: 60px;
+  line-height: 60px;
+}
+
+.search {
+  background-color: #fff;
+  height: 80px;
+  display: flex;
+  align-items: center;
+  position: relative;
+}
+
+.search_thing {
+  width: 350px;
+  display: flex;
+  align-items: center;
+}
+
+.search_label {
+  width: 80px;
+  font-size: 14px;
+  text-align: right;
+}
+
+.search_input {
+  width: calc(100% - 80px);
+}
+
+.table {
+  background-color: #fff;
+  height: calc(100% - 60px - 80px - 10px - 40px);
+  padding: 20px;
+}
+
+.btn {
+  position: absolute;
+  top: 16px;
+  right: 20px;
+  display: flex;
+  align-items: center;
+}
+</style>

--
Gitblit v1.9.3