From 077a9af4717bed36efcf1a6fc420de2b679cf467 Mon Sep 17 00:00:00 2001
From: zouyu <2723363702@qq.com>
Date: 星期三, 12 三月 2025 15:39:17 +0800
Subject: [PATCH] Merge branch 'dev' of http://114.132.189.42:9002/r/center-lims-before-ruoyi into dev

---
 src/components/Table/lims-table.vue                                                         |   13 
 src/api/cnas/resourceDemand/device.js                                                       |  641 +----------
 src/views/CNAS/resourceDemand/device/index.vue                                              |    6 
 src/views/CNAS/resourceDemand/device/component/files.vue                                    |    5 
 src/views/CNAS/resourceDemand/device/component/check-and-accept.vue                         |   35 
 src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelInformation/index.vue |   25 
 src/views/CNAS/resourceDemand/device/component/check.vue                                    |   61 
 src/views/business/reportPreparation/index.vue                                              | 1919 ++++++++++++++++++++++++++++++++++++
 src/views/CNAS/resourceDemand/device/component/calibration.vue                              |   66 -
 src/views/business/reportPreparation/onlyoffice.vue                                         |  207 +++
 src/api/business/reportPreparation.js                                                       |  156 ++
 src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelList/index.vue        |   20 
 src/main.js                                                                                 |    2 
 src/api/cnas/personnel/personnelInfo.js                                                     |    2 
 14 files changed, 2,466 insertions(+), 692 deletions(-)

diff --git a/src/api/business/reportPreparation.js b/src/api/business/reportPreparation.js
new file mode 100644
index 0000000..4bef502
--- /dev/null
+++ b/src/api/business/reportPreparation.js
@@ -0,0 +1,156 @@
+import resquest from '@/utils/request'
+
+
+export function pageInsReport(params) {
+    return resquest({
+        url: '/insReport/pageInsReport',
+        method: 'get',
+        params: params
+    })
+}
+
+export function inReport(data) {
+    return resquest({
+        url: '/insReport/inReport',
+        method: 'post',
+        data: data
+    })
+}
+
+export function upAll(data) {
+    return resquest({
+        url: '/insReport/upAll',
+        method: 'post',
+        data: data
+    })
+}
+
+export function getLaboratoryByReportId(params) {
+    return resquest({
+        url: '/insReport/getLaboratoryByReportId',
+        method: 'get',
+        params: params
+    })
+}
+
+export function withdraw(data) {
+    return resquest({
+        url: '/insReport/withdraw',
+        method: 'post',
+        data: data
+    })
+}
+
+export function updateApproveConfig(data) {
+    return resquest({
+        url: '/approveConfig/updateApproveConfig',
+        method: 'post',
+        data: data
+    })
+}
+
+export function getUserList(params) {
+    return resquest({
+        url: '/approveConfig/getUserList',
+        method: 'get',
+        params: params
+    })
+}
+
+export function getApproveConfigList(params) {
+    return resquest({
+        url: '/approveConfig/getApproveConfigList',
+        method: 'get',
+        params: params
+    })
+}
+
+export function batchApprovalReport(data) {
+    return resquest({
+        url: '/insReport/batchApprovalReport',
+        method: 'post',
+        data: data
+    })
+}
+
+export function downAll(params) {
+    return resquest({
+        url: '/insReport/downAll',
+        method: 'get',
+        params: params
+    })
+}
+
+export function getBatchApprovalProgress(params) {
+    return resquest({
+        url: '/insReport/getBatchApprovalProgress',
+        method: 'get',
+        params: params
+    })
+}
+
+export function getReportCountInfo(params) {
+    return resquest({
+        url: '/insReport/getReportCountInfo',
+        method: 'get',
+        params: params
+    })
+}
+
+export function downReport(params) {
+    return resquest({
+        url: '/insReport/downReport',
+        method: 'get',
+        params: params
+    })
+}
+
+export function upReportUrl(data) {
+    return resquest({
+        url: '/insReport/upReportUrl',
+        method: 'post',
+        params: data
+    })
+}
+
+export function examineReport(data) {
+    return resquest({
+        url: '/insReport/examineReport',
+        method: 'post',
+        data: data
+    })
+}
+
+export function ratifyReport(data) {
+    return resquest({
+        url: '/insReport/ratifyReport',
+        method: 'post',
+        data: data
+    })
+}
+
+export function writeReport(data) {
+    return resquest({
+        url: '/insReport/writeReport',
+        method: 'post',
+        params: data
+    })
+}
+
+
+export function downLoad(params) {
+    return resquest({
+        url: '/file/attachmentType/downLoad',
+        method: 'get',
+        params: params,
+        responseType: 'blob'
+    })
+}
+
+export function getReportInfo(params) {
+    return resquest({
+        url: '/file/attachmentType/getMIME',
+        method: 'get',
+        params: params
+    })
+}
\ No newline at end of file
diff --git a/src/api/cnas/personnel/personnelInfo.js b/src/api/cnas/personnel/personnelInfo.js
index 9b0f117..c9d6eaf 100644
--- a/src/api/cnas/personnel/personnelInfo.js
+++ b/src/api/cnas/personnel/personnelInfo.js
@@ -57,7 +57,7 @@
 // 淇敼浜哄憳鏄庣粏鎵�鍦ㄧ粍缁囨灦鏋�
 export function upUserDepardLimsId(data) {
   return request({
-    url: "/user/upUserDepardLimsId",
+    url: "/system/newUser/upUserDepardLimsId",
     method: "post",
     data: data,
   });
diff --git a/src/api/cnas/resourceDemand/device.js b/src/api/cnas/resourceDemand/device.js
index 635890a..b82cf37 100644
--- a/src/api/cnas/resourceDemand/device.js
+++ b/src/api/cnas/resourceDemand/device.js
@@ -119,499 +119,6 @@
   });
 }
 
-//璁惧鏍″噯璁″垝鍒楄〃鏌ヨ
-export function pageDeviceCalibrationPlan(query) {
-  return request({
-    url: "/deviceCalibrationPlan/pageDeviceCalibrationPlan",
-    method: "get",
-    params: query,
-  });
-}
-
-// 鎻愪氦鎵瑰噯閫氱煡
-export function submiatRatifyDeviceCalibrationPlan(data) {
-  return request({
-    url: "/deviceCalibrationPlan/submiatRatifyDeviceCalibrationPlan",
-    method: "post",
-    data: data,
-  });
-}
-
-//璁惧鏍″噯璁″垝瀵煎嚭
-export function exportDeviceCalibrationPlanDetail(query) {
-  return request({
-    url: "/deviceCalibrationPlan/exportDeviceCalibrationPlanDetail",
-    method: "get",
-    responseType: "blob",
-    params: query,
-  });
-}
-
-// 璁惧鏍″噯 鏂板 鏇存柊
-export function addOrUpdateDeviceMetricRecord(data) {
-  return request({
-    url: "/deviceMetricRecord/addOrUpdateDeviceMetricRecord",
-    method: "post",
-    data: data,
-  });
-}
-
-//璁惧鏍″噯璁″垝鍒犻櫎
-export function delDeviceCalibrationPlan(query) {
-  return request({
-    url: "/deviceCalibrationPlan/delDeviceCalibrationPlan",
-    method: "delete",
-    params: query,
-  });
-}
-
-//璁惧鏍″噯璁″垝璇︽儏鍒犻櫎
-export function delDeviceCalibrationPlanDetail(query) {
-  return request({
-    url: "/deviceCalibrationPlan/delDeviceCalibrationPlanDetail",
-    method: "delete",
-    params: query,
-  });
-}
-
-//璁惧鏍″噯璁″垝璇︽儏鍒楄〃
-export function pageDeviceCalibrationPlanDetail(query) {
-  return request({
-    url: "/deviceCalibrationPlan/pageDeviceCalibrationPlanDetail",
-    method: "get",
-    params: query,
-  });
-}
-
-// 鏂板璁惧鏍″噯璁″垝璇︽儏
-export function addDeviceCalibrationPlanDetail(data) {
-  return request({
-    url: "/deviceCalibrationPlan/addDeviceCalibrationPlanDetail",
-    method: "post",
-    data: data,
-  });
-}
-
-// 淇敼璁惧鏍″噯璁″垝璇︽儏
-export function updateDeviceCalibrationPlanDetail(data) {
-  return request({
-    url: "/deviceCalibrationPlan/updateDeviceCalibrationPlanDetail",
-    method: "post",
-    data: data,
-  });
-}
-
-// 璁惧鏍″噯璁″垝鎵瑰噯
-export function ratifyDeviceCalibrationPlan(data) {
-  return request({
-    url: "/deviceCalibrationPlan/ratifyDeviceCalibrationPlan",
-    method: "post",
-    data: data,
-  });
-}
-
-//鏌ヨ璁惧鏍″噯璁″垝璇︽儏
-export function getDeviceCalibrationPlan(query) {
-  return request({
-    url: "/deviceCalibrationPlan/getDeviceCalibrationPlan",
-    method: "get",
-    params: query,
-  });
-}
-
-// 鏂板璁惧鏍″噯璁″垝
-export function addDeviceCalibrationPlan(data) {
-  return request({
-    url: "/deviceCalibrationPlan/addDeviceCalibrationPlan",
-    method: "post",
-    data: data,
-  });
-}
-
-// 淇敼璁惧鏍″噯璁″垝
-export function updateDeviceCalibrationPlan(data) {
-  return request({
-    url: "/deviceCalibrationPlan/updateDeviceCalibrationPlan",
-    method: "post",
-    data: data,
-  });
-}
-
-//閫氳繃璁惧鍒嗙被鑾峰彇璁惧鍒楄〃
-export function deviceScopeSearch(query) {
-  return request({
-    url: "/deviceScope/search",
-    method: "get",
-    params: query,
-  });
-}
-
-//鏌ヨ璁惧鏍告煡璁″垝璇︽儏
-export function getDeviceExaminePlan(query) {
-  return request({
-    url: "/deviceExaminePlan/getDeviceExaminePlan",
-    method: "get",
-    params: query,
-  });
-}
-
-// 娣诲姞璁惧鏍告煡璁″垝
-export function addDeviceExaminePlan(data) {
-  return request({
-    url: "/deviceExaminePlan/addDeviceExaminePlan",
-    method: "post",
-    data: data,
-  });
-}
-
-// 璁惧鏍告煡璁″垝鎵归噺缂栬緫
-export function updateDeviceExaminePlan(data) {
-  return request({
-    url: "/deviceExaminePlan/updateDeviceExaminePlan",
-    method: "post",
-    data: data,
-  });
-}
-
-//璁惧鏍告煡璁″垝鍒犻櫎
-export function delDeviceExaminePlan(query) {
-  return request({
-    url: "/deviceExaminePlan/delDeviceExaminePlan",
-    method: "delete",
-    params: query,
-  });
-}
-
-//璁惧鏍告煡璁″垝鍒楄〃
-export function pageDeviceExaminePlan(query) {
-  return request({
-    url: "/deviceExaminePlan/pageDeviceExaminePlan",
-    method: "get",
-    params: query,
-  });
-}
-
-// 璁惧鏍告煡璁″垝鎻愪氦鎵瑰噯閫氱煡
-export function submitRatifyDeviceExaminePlan(data) {
-  return request({
-    url: "/deviceExaminePlan/submitRatifyDeviceExaminePlan",
-    method: "post",
-    data: data,
-  });
-}
-
-//瀵煎嚭璁惧鏍告煡璁″垝
-export function exportDeviceExaminePlanDetail(query) {
-  return request({
-    url: "/deviceExaminePlan/exportDeviceExaminePlanDetail",
-    method: "get",
-    responseType: "blob",
-    params: query,
-  });
-}
-
-//鍒犻櫎璁惧鏍告煡璁″垝璇︽儏
-export function delDeviceExaminePlanDetail(query) {
-  return request({
-    url: "/deviceExaminePlan/delDeviceExaminePlanDetail",
-    method: "delete",
-    params: query,
-  });
-}
-
-//璁惧鏍告煡璁″垝璇︽儏鍒楄〃
-export function pageDeviceExaminePlanDetail(query) {
-  return request({
-    url: "/deviceExaminePlan/pageDeviceExaminePlanDetail",
-    method: "get",
-    params: query,
-  });
-}
-
-// 鏂板璁惧鏍告煡璁″垝璇︽儏
-export function addDeviceExaminePlanDetail(data) {
-  return request({
-    url: "/deviceExaminePlan/addDeviceExaminePlanDetail",
-    method: "post",
-    data: data,
-  });
-}
-
-// 淇敼璁惧鏍告煡璁″垝璇︽儏
-export function updateDeviceExaminePlanDetail(data) {
-  return request({
-    url: "/deviceExaminePlan/updateDeviceExaminePlanDetail",
-    method: "post",
-    data: data,
-  });
-}
-
-// 璁惧鏍告煡璁″垝鎵瑰噯
-export function ratifyDeviceExaminePlan(data) {
-  return request({
-    url: "/deviceExaminePlan/ratifyDeviceExaminePlan",
-    method: "post",
-    data: data,
-  });
-}
-
-//鏍告煡璁板綍瀵煎嚭
-export function exportReviewExamineRecordDetail(query) {
-  return request({
-    url: "/deviceExaminePlan/exportReviewExamineRecordDetail",
-    method: "get",
-    responseType: "blob",
-    params: query,
-  });
-}
-
-//鏍告煡瀵规瘮瀵煎嚭
-export function exportReviewExamineRecordContrast(query) {
-  return request({
-    url: "/deviceExaminePlan/exportReviewExamineRecordContrast",
-    method: "get",
-    responseType: "blob",
-    params: query,
-  });
-}
-
-//鏌ヨ鏍告煡瀵规瘮璁板綍
-export function getExamineRecordContrast(query) {
-  return request({
-    url: "/deviceExaminePlan/getExamineRecordContrast",
-    method: "get",
-    params: query,
-  });
-}
-
-// 瀹℃牳鏍告煡瀵规瘮璁板綍
-export function reviewExamineRecordContrast(data) {
-  return request({
-    url: "/deviceExaminePlan/reviewExamineRecordContrast",
-    method: "post",
-    data: data,
-  });
-}
-
-// 鏂板鏍告煡瀵规瘮璁板綍
-export function addExamineRecordContrast(data) {
-  return request({
-    url: "/deviceExaminePlan/addExamineRecordContrast",
-    method: "post",
-    data: data,
-  });
-}
-
-//鏌ヨ鏍告煡璁板綍
-export function getExamineRecord(query) {
-  return request({
-    url: "/deviceExaminePlan/getExamineRecord",
-    method: "get",
-    params: query,
-  });
-}
-
-// 鏂板鏍告煡璁板綍
-export function addExamineRecord(data) {
-  return request({
-    url: "/deviceExaminePlan/addExamineRecord",
-    method: "post",
-    data: data,
-  });
-}
-
-// 澶嶆牳鏍告煡璁板綍
-export function reviewExamineRecord(data) {
-  return request({
-    url: "/deviceExaminePlan/reviewExamineRecord",
-    method: "post",
-    data: data,
-  });
-}
-
-//鍒嗛〉鏌ヨ璁惧淇濆吇璁″垝
-export function selectDeviceMaintenancePlanByPage(query) {
-  return request({
-    url: "/deviceMaintenancePlan/selectDeviceMaintenancePlanByPage",
-    method: "get",
-    params: query,
-  });
-}
-
-// 璁惧淇濆吇璁″垝鎻愪氦瀹℃牳
-export function submitReviewMaintenancePlanStatus(data) {
-  return request({
-    url: "/deviceMaintenancePlan/submitReviewMaintenancePlanStatus",
-    method: "post",
-    data: data,
-  });
-}
-
-//鏌ヨ璁惧淇濆吇璁″垝璇︽儏
-export function getMaintenancePlanDetail(query) {
-  return request({
-    url: "/deviceMaintenancePlan/getMaintenancePlanDetail",
-    method: "get",
-    params: query,
-  });
-}
-
-// 鏂板璁惧淇濆吇璁″垝
-export function addMaintenancePlan(data) {
-  return request({
-    url: "/deviceMaintenancePlan/addMaintenancePlan",
-    method: "post",
-    data: data,
-  });
-}
-
-// 淇敼璁惧淇濆吇璁″垝
-export function updateMaintenancePlan(data) {
-  return request({
-    url: "/deviceMaintenancePlan/updateMaintenancePlan",
-    method: "post",
-    data: data,
-  });
-}
-
-//瀵煎嚭璁惧淇濆吇璁″垝
-export function exportDeviceMaintenancePlan(query) {
-  return request({
-    url: "/deviceMaintenancePlan/exportDeviceMaintenancePlan",
-    method: "get",
-    responseType: "blob",
-    params: query,
-  });
-}
-
-//鍒犻櫎璁惧淇濆吇璁″垝
-export function deleteMaintenancePlan(query) {
-  return request({
-    url: "/deviceMaintenancePlan/deleteMaintenancePlan",
-    method: "delete",
-    params: query,
-  });
-}
-
-//鍒嗛〉鏌ヨ閲忓�兼函婧愯鍒�
-export function selectDeviceTraceabilityManagementByPage(query) {
-  return request({
-    url: "/deviceTraceabilityManagement/selectDeviceTraceabilityManagementByPage",
-    method: "get",
-    params: query,
-  });
-}
-
-// 閲忓�兼函婧愯鍒掓彁浜ゆ壒鍑�
-export function submitReviewTraceabilityManagementStatus(data) {
-  return request({
-    url: "/deviceTraceabilityManagement/submitReviewTraceabilityManagementStatus",
-    method: "post",
-    data: data,
-  });
-}
-
-//鏌ヨ閲忓�兼函婧愯鍒掕鎯�
-export function getTraceabilityManagementDetail(query) {
-  return request({
-    url: "/deviceTraceabilityManagement/getTraceabilityManagementDetail",
-    method: "get",
-    params: query,
-  });
-}
-
-// 鏂板閲忓�兼函婧愯鍒�
-export function addTraceabilityManagement(data) {
-  return request({
-    url: "/deviceTraceabilityManagement/addTraceabilityManagement",
-    method: "post",
-    data: data,
-  });
-}
-
-// 淇敼閲忓�兼函婧愯鍒�
-export function updateTraceabilityManagement(data) {
-  return request({
-    url: "/deviceTraceabilityManagement/updateTraceabilityManagement",
-    method: "post",
-    data: data,
-  });
-}
-
-// 閲忓�兼函婧愯鍒掑鏍哥姸鎬佷慨鏀�
-export function reviewTraceabilityManagementStatus(data) {
-  return request({
-    url: "/deviceTraceabilityManagement/reviewTraceabilityManagementStatus",
-    method: "post",
-    data: data,
-  });
-}
-
-//瀵煎嚭閲忓�兼函婧愯鍒�
-export function exportDeviceTraceabilityManagement(query) {
-  return request({
-    url: "/deviceTraceabilityManagement/exportDeviceTraceabilityManagement",
-    method: "get",
-    responseType: "blob",
-    params: query,
-  });
-}
-
-//鍒犻櫎閲忓�兼函婧愯鍒�
-export function deleteTraceabilityManagement(query) {
-  return request({
-    url: "/deviceTraceabilityManagement/deleteTraceabilityManagement",
-    method: "delete",
-    params: query,
-  });
-}
-
-//鍒╃敤澶栭儴璁惧鐢宠鍒楄〃
-export function pageDeviceExternalApply(query) {
-  return request({
-    url: "/deviceExternalApply/pageDeviceExternalApply",
-    method: "get",
-    params: query,
-  });
-}
-
-//鍊熺敤澶栭儴浠櫒-瀵煎嚭
-export function exportDeviceExternalApply(query) {
-  return request({
-    url: "/deviceExternalApply/exportDeviceExternalApply",
-    method: "get",
-    responseType: "blob",
-    params: query,
-  });
-}
-
-//鍒犻櫎鍒╃敤澶栭儴璁惧鐢宠
-export function delDeviceExternalApply(query) {
-  return request({
-    url: "/deviceExternalApply/delDeviceExternalApply",
-    method: "delete",
-    params: query,
-  });
-}
-
-//鏌ヨ鍒╃敤澶栭儴璁惧鐢宠
-export function getDeviceExternalApply(query) {
-  return request({
-    url: "/deviceExternalApply/getDeviceExternalApply",
-    method: "get",
-    params: query,
-  });
-}
-
-// 鏂板鍒╃敤澶栭儴璁惧鐢宠
-export function addDeviceExternalApply(data) {
-  return request({
-    url: "/deviceExternalApply/addDeviceExternalApply",
-    method: "post",
-    data: data,
-  });
-}
-
 //cnas璁惧浣跨敤璁板綍鍒嗛〉鏌ヨ
 export function deviceRecordPage(query) {
   return request({
@@ -660,7 +167,7 @@
 //鏂板璁惧妗f
 export function addDocument(data) {
   return request({
-    url: "/deviceDocuments/addDocument",
+    url: "/documents/add",
     method: "post",
     data: data,
   });
@@ -669,7 +176,7 @@
 // 鑾峰彇鐩稿叧鏂囨。鏁版嵁鐨刟pi-鏇存柊
 export function updateDocument(data) {
   return request({
-    url: "/deviceDocuments/updateDocument",
+    url: "/documents/updateDocument",
     method: "post",
     data: data,
   });
@@ -678,7 +185,7 @@
 //鍒犻櫎璁惧妗f
 export function deleteDocumentById(query) {
   return request({
-    url: "/deviceDocuments/deleteDocumentById",
+    url: "/documents/delete",
     method: "delete",
     params: query,
   });
@@ -766,8 +273,15 @@
     params: query,
   });
 }
-
-//璁惧鏍″噯 鏂板 鏇存柊
+// 璁惧鏍″噯 鏂板 鏇存柊-鏍″噯璁板綍
+export function addOrUpdateDeviceMetricRecord(data) {
+  return request({
+    url: "/deviceMetricRecord/addOrUpdateDeviceMetricRecord",
+    method: "post",
+    data: data,
+  });
+}
+//璁惧鏍″噯 鏂板 鏇存柊-鎻愪氦椤圭洰鏍″噯缁存姢
 export function saveOrUpdateDeviceMetric(data) {
   return request({
     url: "/deviceMetrics/saveOrUpdateDeviceMetric",
@@ -793,39 +307,10 @@
     params: query,
   });
 }
-
 //璁惧鏍″噯 瀵煎嚭
 export function deviceMetricRecordExport(query) {
   return request({
     url: "/deviceMetricRecord/deviceMetricRecordExport",
-    method: "get",
-    responseType: "blob",
-    params: query,
-  });
-}
-
-//鍒犻櫎鏂囦欢
-export function deleteCNASFile(query) {
-  return request({
-    url: "/personBasicInfo/deleteCNASFile",
-    method: "delete",
-    params: query,
-  });
-}
-
-//鏌ヨ璁惧妗f鍒楄〃
-export function getAllDocuments(query) {
-  return request({
-    url: `/deviceDocuments/getAllDocuments`,
-    method: "get",
-    params: query,
-  });
-}
-
-//璁惧妗f瀵煎嚭
-export function exportDeviceFile(query) {
-  return request({
-    url: "/deviceScope/exportDeviceFile",
     method: "get",
     responseType: "blob",
     params: query,
@@ -846,6 +331,59 @@
   return request({
     url: "/deviceMetrics/deleteDeviceMetrics",
     method: "delete",
+    params: query,
+  });
+}
+//鍒犻櫎 璁惧鏍″噯-闄勪欢
+export function delDeviceCalibrationFile(query) {
+  return request({
+    url: "/personBasicInfo/delDeviceCalibrationFile",
+    method: "delete",
+    params: query,
+  });
+}
+//璁惧鏍″噯鏌ヨ-闄勪欢
+export function getDeviceCalibrationFile(query) {
+  return request({
+    url: "/personBasicInfo/getDeviceCalibrationFile",
+    method: "get",
+    params: query,
+  });
+}
+//璁惧鏍″噯瀵煎嚭-闄勪欢
+export function downLoadDeviceCalibrationFile(query) {
+  return request({
+    url: "/personBasicInfo/downLoadDeviceCalibrationFile",
+    method: "get",
+    params: query,
+    responseType: "blob"
+  });
+}
+
+//鍒犻櫎鏂囦欢
+export function deleteCNASFile(query) {
+  return request({
+    url: "/personBasicInfo/deleteCNASFile",
+    method: "delete",
+    params: query,
+  });
+}
+
+//鏌ヨ璁惧妗f鍒楄〃
+export function getListByDId(query) {
+  return request({
+    url: '/documents/getListByDId',
+    method: "get",
+    params: query,
+  });
+}
+
+//璁惧妗f瀵煎嚭
+export function exportDeviceFile(query) {
+  return request({
+    url: "/deviceScope/exportDeviceFile",
+    method: "get",
+    responseType: "blob",
     params: query,
   });
 }
@@ -1283,10 +821,10 @@
     params: query,
   });
 }
-//璁惧棰勭害鎺ュ彛
+// 璁惧杩愯鎬昏-鏍规嵁id鑾峰彇璁惧鏁呴殰鏁版嵁
 export function device(query) {
   return request({
-    url: "/api/device-faults/device",
+    url: "/deviceFaults/device",
     method: "get",
     params: query,
   });
@@ -1294,7 +832,15 @@
 //璁惧楠屾敹涓洓涓猼able琛ㄦ牸鐨勫垹闄ゅ姛鑳�
 export function deleteIncidentReportAll(query) {
   return request({
-    url: "/incident-report/deleteIncidentReportAll",
+    url: "/incidentReport/deleteIncidentReportAll",
+    method: "delete",
+    params: query,
+  });
+}
+//璁惧楠屾敹涓洓涓猼able琛ㄦ牸鐨勫垹闄ゅ姛鑳�
+export function deleteIncidentReport(query) {
+  return request({
+    url: "/incidentReport/deleteIncidentReport",
     method: "delete",
     params: query,
   });
@@ -1303,7 +849,7 @@
 //璁惧楠屾敹 淇濆瓨锛屾彁浜わ紝椹冲洖锛岄�氳繃鎺ュ彛
 export function saveIncidentReportData(query) {
   return request({
-    url: "/incident-report/saveIncidentReportData",
+    url: "/incidentReport/saveIncidentReportData",
     method: "post",
     data: query,
   });
@@ -1311,7 +857,7 @@
 //璁惧楠屾敹 淇濆瓨锛屾彁浜わ紝椹冲洖锛岄�氳繃鎺ュ彛
 export function incidentReportPage(query) {
   return request({
-    url: "/incident-report/incidentReportPage",
+    url: "/incidentReport/incidentReportPage",
     method: "get",
     params: query,
   });
@@ -1319,7 +865,7 @@
 //璁惧楠屾敹 淇濆瓨锛屾彁浜わ紝椹冲洖锛岄�氳繃鎺ュ彛
 export function getShowIncidentReport(query) {
   return request({
-    url: "/incident-report/getShowIncidentReport",
+    url: "/incidentReport/getShowIncidentReport",
     method: "get",
     params: query,
   });
@@ -1327,7 +873,7 @@
 //璁惧楠屾敹瀵煎嚭
 export function incidentReportExport(query) {
   return request({
-    url: "/incident-report/incidentReportExport",
+    url: "/incidentReport/incidentReportExport",
     method: "get",
     params: query,
     responseType: "blob"
@@ -1358,15 +904,7 @@
     responseType: "blob"
   });
 }
-//璁惧鏍″噯瀵煎嚭
-export function downLoadDeviceCalibrationFile(query) {
-  return request({
-    url: "/personBasicInfo/downLoadDeviceCalibrationFile",
-    method: "get",
-    params: query,
-    responseType: "blob"
-  });
-}
+
 //鍒犻櫎 璁惧鏁呴殰
 export function deleteDeviceFaultOne(query) {
   return request({
@@ -1375,19 +913,4 @@
     params: query,
   });
 }
-//鍒犻櫎 璁惧鏍″噯
-export function delDeviceCalibrationFile(query) {
-  return request({
-    url: "/personBasicInfo/delDeviceCalibrationFile",
-    method: "delete",
-    params: query,
-  });
-}
-//璁惧鏍″噯鏌ヨ
-export function getDeviceCalibrationFile(query) {
-  return request({
-    url: "/personBasicInfo/getDeviceCalibrationFile",
-    method: "get",
-    params: query,
-  });
-}
+
diff --git a/src/components/Table/lims-table.vue b/src/components/Table/lims-table.vue
index 0251a1f..b267378 100644
--- a/src/components/Table/lims-table.vue
+++ b/src/components/Table/lims-table.vue
@@ -192,16 +192,10 @@
               >{{ o.name }}
             </el-button>
             <el-upload
-              :action="
-                javaApi +
-                o.url +
-                '?id=' +
-                (o.uploadIdFun ? o.uploadIdFun(scope.row) : scope.row.id)
-              "
+              :action="javaApi + o.url"
               size="mini"
               ref="upload"
               :multiple="o.multiple ? o.multiple : false"
-              :limit="1"
               :disabled="o.disabled ? o.disabled(scope.row) : false"
               :accept="
                 o.accept
@@ -211,6 +205,10 @@
               v-if="o.type == 'upload' && o.url"
               style="display: inline-block; width: 50px"
               v-show="o.showHide ? o.showHide(scope.row) : true"
+              :data="o.data ? o.data(scope.row) : {}"
+              :before-upload="
+                o.beforeUpload ? o.beforeUpload(scope.row) : () => true
+              "
               :headers="uploadHeader"
               :on-error="onError"
               :on-exceed="onExceed"
@@ -508,6 +506,7 @@
           this.$message.success("涓婁紶鎴愬姛");
         }
       }
+      this.$refs.upload.clearFiles();
     },
     onError(err, file, fileList) {
       this.$message.error("涓婁紶澶辫触");
diff --git a/src/main.js b/src/main.js
index f6ae7f3..59caa2b 100644
--- a/src/main.js
+++ b/src/main.js
@@ -67,7 +67,7 @@
 };
 Vue.prototype.javaApi = process.env.VUE_APP_BASE_API
   ? process.env.VUE_APP_BASE_API
-  : "http://192.168.0.104:8002";
+  : "http://127.0.0.1:8002";
 Vue.prototype.checkPermi = checkPermi;
 Vue.prototype.uploadHeader = {
   Authorization: "Bearer " + getToken(),
diff --git a/src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelInformation/index.vue b/src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelInformation/index.vue
index 7b60dff..a6cd688 100644
--- a/src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelInformation/index.vue
+++ b/src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelInformation/index.vue
@@ -787,17 +787,15 @@
       })
     },
     beforeAvatarUpload(file) {
-      const isJPGorPNG = file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/gif';
-      const isLt2MB = file.size / 1024 / 1024 < 2;
-      if (!isJPGorPNG) {
-        this.$message.error('涓婁紶鍥剧墖鍙兘鏄� JPG/PNG 鏍煎紡!');
-        return false;
+      let flag = true
+      if (file.size > 1024 * 1024 * 10) {
+        this.$message.error('涓婁紶鏂囦欢涓嶈秴杩�10M');
+        this.$refs.upload.clearFiles()
+        flag = false
       }
-      // if (!isLt2MB) {
-      //   this.$message.error('涓婁紶鍥剧墖澶у皬涓嶈兘瓒呰繃 2MB!');
-      // }
-      // 鏍¢獙閫氳繃鎵嶈繑鍥� true锛屽厑璁告枃浠朵笂浼�
-      return isJPGorPNG && isLt2MB;
+      if (!flag) {
+        return Promise.reject(flag); //姝g‘鐨勭粓姝�
+      }
     },
     downloadFile(fileName) {
       this.$download.saveAs(fileName, fileName)
@@ -849,8 +847,11 @@
     },
     // 鍙栦汉鍛樺垎绫荤殑瀛楀吀
     getComparisonList() {
-      tthis.personnelClassification = this.dict.type.personnl_type;
-      this.checkList = this.form.personnelClassification.split('锛�')
+      // 鏂囦欢鐘舵��
+      this.getDicts("personnl_type").then((response) => {
+        this.personnelClassification = this.dictToValue(response.data);
+        this.checkList = this.form.personnelClassification ? this.form.personnelClassification.split('锛�') : []
+      });
     },
     clickPersonnelClassificationSure() {
       this.dialogVisible = false
diff --git a/src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelList/index.vue b/src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelList/index.vue
index 65aaa66..04e8033 100644
--- a/src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelList/index.vue
+++ b/src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelList/index.vue
@@ -58,17 +58,17 @@
     </div>
     <el-dialog :visible.sync="selectUserDia" title="閫夋嫨鐢ㄦ埛" width="70%">
       <div class="search" style="margin-bottom: 9px;">
-        <div class="search_thing">
+        <div class="search_thing" style="display: flex;">
           <div class="search_label">鐢ㄦ埛鍚嶏細</div>
           <div class="search_input">
             <el-input v-model="queryParams.name" clearable placeholder="璇疯緭鍏�" size="small"
-              @keyup.enter.native="getList()" style="width: 200px;"></el-input>
+              @keyup.enter.native="getList()" style="width: 150px;"></el-input>
           </div>
         </div>
       </div>
       <div v-if="selectUserDia" class="body" style="height: 60vh;">
-        <lims-table :tableData="tableData" :column="column" :tableLoading="tableLoading" :height="'calc(100vh - 290px)'"
-          :page="personPage" @pagination="pagination" :isSelection="true"
+        <lims-table :tableData="personTableData" :column="column" :tableLoading="tableLoading"
+          :height="'calc(100vh - 290px)'" :page="personPage" :isSelection="true"
           :handleSelectionChange="handleSelectionChange"></lims-table>
       </div>
       <span slot="footer" class="dialog-footer">
@@ -139,7 +139,7 @@
       queryParams: {
         name: ''
       },
-      tableData: [],
+      personTableData: [],
       column: [
         { label: "濮撳悕", prop: "name" },
         { label: "璐﹀彿", prop: "account" },
@@ -210,8 +210,10 @@
     refreshTable(entity, type) {
       try {
         this.tableLoading = true;
-        this.entity.departLimsId = this.departId;
-        basicInformationOfPersonnelSelectPage({ ...this.page, ...this.entit }).then(res => {
+        this.entity.departmentId = this.departId;
+        let params = { ...this.page, ...this.entity }
+        delete params.total
+        basicInformationOfPersonnelSelectPage(params).then(res => {
           this.tableLoading = false;
           if (res.code === 201) {
             return;
@@ -297,8 +299,7 @@
         .then((res) => {
           this.tableLoading = false;
           if (res.code === 200) {
-            this.tableData = res.data.records;
-            this.personPage.total = res.data.total;
+            this.personTableData = res.data;
           }
         })
         .catch((err) => {
@@ -313,7 +314,6 @@
     handleDown() {
       this.outLoading = true;
       let entity = this.HaveJson(this.entity)
-      delete entity.orderBy;
       exportPersonBasicInfo(entity).then(res => {
         this.outLoading = false;
         if (res.code === 201) {
diff --git a/src/views/CNAS/resourceDemand/device/component/calibration.vue b/src/views/CNAS/resourceDemand/device/component/calibration.vue
index c522343..5f4fd0e 100644
--- a/src/views/CNAS/resourceDemand/device/component/calibration.vue
+++ b/src/views/CNAS/resourceDemand/device/component/calibration.vue
@@ -233,23 +233,6 @@
                 </el-date-picker>
               </el-form-item>
             </el-col>
-            <!-- <el-col :span="17">
-              <el-form-item label="闄勪欢锛�" prop="fileName">
-                <el-input v-model="calibrationRecord.fileName" :style="`width: ${operationType === 'add' ? '85%' : '100%'};}`" disabled
-                          size="small">
-                  <el-button v-if="operationType === 'add'" slot="append" icon="el-icon-delete-solid"
-                             @click="deleteFile"></el-button>
-                </el-input>
-                <el-upload v-if="operationType === 'add'" ref="upload" :action="action" :before-upload="beforeUpload" :headers="headers"
-                           :limit="1" :on-error="onError" :on-success="handleSuccessUp"
-                           :show-file-list="false"
-                           style="float: right;">
-                  <el-button :loading="upLoading" size="small" style="position: relative; top: -4px;"
-                             type="primary">闄勪欢涓婁紶
-                  </el-button>
-                </el-upload>
-              </el-form-item>
-            </el-col> -->
             <el-col :span="24">
               <el-form-item label="澶囨敞:">
                 <el-input v-model="calibrationRecord.remark" :disabled="operationType === 'view'" :rows="3" size="small" style="width: 96%"
@@ -299,20 +282,6 @@
             </template>
           </el-table-column>
         </el-table>
-        <!-- 鎿嶄綔鏃ュ織 -->
-        <!--        <h4>-->
-        <!--          <div style="display: flex;-->
-        <!--      align-items: center;">-->
-        <!--            <span class="line"></span><span>鏈褰曠姸鎬佸拰鎿嶄綔鏃ュ織</span>-->
-        <!--          </div>-->
-        <!--        </h4>-->
-        <!--        <el-table :data="tableDataOperate" style="width: 100%">-->
-        <!--          <el-table-column type="index" label="搴忓彿" width="100"></el-table-column>-->
-        <!--          <el-table-column prop="operator" label="鎿嶄綔浜�" width="120"></el-table-column>-->
-        <!--          <el-table-column prop="operationTime" label="鎿嶄綔鏃堕棿" width="180"></el-table-column>-->
-        <!--          <el-table-column prop="operationType" label="鎿嶄綔绫诲瀷" width="120"></el-table-column>-->
-        <!--          <el-table-column prop="operationContent" label="鎿嶄綔鍐呭"></el-table-column>-->
-        <!--        </el-table>-->
       </div>
       <span slot="footer" class="dialog-footer">
         <el-button v-if="operationType === 'add'" @click="dialogVisible1 = false">鍙� 娑�</el-button>
@@ -423,7 +392,7 @@
   computed: {
     ...mapGetters(["nickName"]),
     action() {
-      return this.javaApi + '/personBasicInfo/saveCNASFile'
+      return this.javaApi + '/personBasicInfo/saveDeviceCalibrationFile'
     }
   },
   mounted() {
@@ -530,7 +499,7 @@
       this.dialogVisible1 = true
       this.getXmsg()
     },
-    // 鏌ョ湅璇︽儏
+    // 鏌ョ湅缂栬緫璇︽儏
     handleViewClick(type, row) {
       showDeviceMetricsCopy({ id: row.id, type: 'calibrate' }).then(res => {
         this.calibrateParams = res.data
@@ -569,27 +538,6 @@
         this.$download.saveAs(blob, '璁惧鏍″噯.xlsx')
       })
     },
-    deleteFile() {
-      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎鏂囦欢, 鏄惁缁х画?', '鎻愮ず', {
-        confirmButtonText: '纭畾',
-        cancelButtonText: '鍙栨秷',
-        type: 'warning'
-      }).then(() => {
-        deleteCNASFile({ fileName: this.calibrationRecord.systemFileName }).then(res => {
-          this.calibrationRecord.fileName = ''
-          this.$refs.upload.clearFiles()
-          if (res.code == 200) {
-            this.$message.success('鍒犻櫎鎴愬姛锛�')
-          }
-        })
-      }).catch((err) => {
-        console.log('err----', err)
-        this.$message({
-          type: 'info',
-          message: '宸插彇娑堝垹闄�'
-        });
-      });
-    },
     // 鏍″噯椤圭洰缁存姢
     calibrationMaintenance() {
       this.dialogVisible0 = true
@@ -627,6 +575,7 @@
         this.$message.info('宸插彇娑堝垹闄�');
       })
     },
+    // 鎻愪氦椤圭洰鏍″噯缁存姢
     addCalibrate() {
       this.$refs['form0'].validate((valid) => {
         if (valid) {
@@ -644,6 +593,8 @@
             }
             this.calibrateParamsLoading = false
             this.addCalibrateLoading = false
+          }).catch(() => {
+            this.addCalibrateLoading = false
           })
         } else {
           this.addCalibrateLoading = false
@@ -651,6 +602,7 @@
         }
       })
     },
+    // 鎻愪氦鏍″噯璁板綍
     addRecord() {
       this.$refs['calibrationRecord'].validate((valid) => {
         if (valid) {
@@ -668,6 +620,10 @@
             this.calibrationRecord.createUser = this.nickName
             this.calibrationRecord.type = 'calibrate'
             this.calibrationRecord.deviceMetricsCopyList = this.calibrateParams
+            this.calibrationRecord.deviceMetricsCopyList.forEach(m => {
+              delete m.creationTime
+            })
+            delete this.calibrationRecord.createTime
             addOrUpdateDeviceMetricRecord(this.calibrationRecord).then(res => {
               if (res.code == 200) {
                 this.$message.success('娣诲姞鎴愬姛')
@@ -675,6 +631,8 @@
                 this.getTableList(this.clickNodeVal.value)
               }
               this.addRecordLoading = false
+            }).catch((err) => {
+              this.addRecordLoading = false
             })
           } catch (e) {
             console.log('addRecord---', e)
diff --git a/src/views/CNAS/resourceDemand/device/component/check-and-accept.vue b/src/views/CNAS/resourceDemand/device/component/check-and-accept.vue
index e940152..26680b7 100644
--- a/src/views/CNAS/resourceDemand/device/component/check-and-accept.vue
+++ b/src/views/CNAS/resourceDemand/device/component/check-and-accept.vue
@@ -17,7 +17,7 @@
       </div>
     </div>
     <div class="tables" style="margin-top: 10px;">
-      <el-table ref="table" :data="tableDataAlist" height="100%">
+      <el-table ref="table" :data="tableDataAlist" height="100%" v-loading="tableLoading">
         <el-table-column label="搴忓彿" type="index" width="60">
           <template v-slot="scope">
             <span>{{ (search.current - 1) * search.size + scope.$index + 1 }}</span>
@@ -468,12 +468,13 @@
 import { dateFormat } from '@/utils/date'
 import file from "@/utils/file";
 import {
-  deleteCNASFile,
+  deleteCNASFile, deleteIncidentReport,
   deleteIncidentReportAll, getShowIncidentReport, incidentReportExport, incidentReportPage,
   saveIncidentReportData,
   selectDeviceByCode
 } from "@/api/cnas/resourceDemand/device";
 import {selectUserCondition} from "@/api/system/user";
+import {mapGetters} from "vuex";
 
 export default {
   props: {
@@ -488,6 +489,7 @@
     return {
       //浜嬫晠璁惧淇℃伅
       tableDataAlist: [], // 鏇存敼鍙橀噺鍚嶇О
+      tableLoading: false,
       dialogVisible: false,
       rules: {
         quantity: [{ required: true, message: '璇疯緭鍏ユ暟閲�', trigger: 'blur' }],
@@ -517,7 +519,8 @@
   computed: {
     action() {
       return this.javaApi + '/personBasicInfo/saveCNASFile'
-    }
+    },
+    ...mapGetters(["nickName"]),
   },
   mounted() {
     // 鑾峰彇璁惧浜嬫晠淇℃伅
@@ -661,32 +664,31 @@
       this.$refs.form.validate((valid) => {
         if (valid === true || saveState !== '1submit') {
           // 缁欏綋鍓嶇幆鑺傝缃垱寤轰汉涓庢椂闂�
-          let user = JSON.parse(localStorage.getItem('user'))
           const dateTime = dateFormat(new Date())
           // 鑾峰彇褰撳墠鐜妭鎿嶄綔浜轰笌鏃ユ湡
           switch (this.currentStep) {
             case 0:
-              this.form.submitOperatingPersonnel = user.name
+              this.form.submitOperatingPersonnel = this.nickName
               this.form.submitDate = dateTime
               break
             case 1:
-              this.form.unpackingOperatingPersonnel = user.name
+              this.form.unpackingOperatingPersonnel = this.nickName
               this.form.unpackingDate = dateTime
               break
             case 2:
-              this.form.installOperatingPersonnel = user.name
+              this.form.installOperatingPersonnel = this.nickName
               this.form.installDate = dateTime
               break
             case 3:
-              this.form.installationAcceptanceOperatingPersonnel = user.name
+              this.form.installationAcceptanceOperatingPersonnel = this.nickName
               this.form.installationAcceptanceDate = dateTime
               break
             case 4:
-              this.form.acceptanceCheckOperatingPersonnel = user.name
+              this.form.acceptanceCheckOperatingPersonnel = this.nickName
               this.form.acceptanceCheckDate = dateTime
               break
             case 5:
-              this.form.acceptanceAuditOperatingPersonnel = user.name
+              this.form.acceptanceAuditOperatingPersonnel = this.nickName
               this.form.acceptanceAuditDate = dateTime
               break
             default:
@@ -765,19 +767,21 @@
     },
     // 鑾峰彇璁惧浜嬫晠淇℃伅(鏍规嵁浠巚uex涓幏鍙栧埌鐨勮澶囧悕绉癷d杩涜鏁版嵁鏌ヨ)
     getDeviceAList(deviceId) {
+      this.tableLoading = true
       incidentReportPage({deviceId: deviceId, size:this.search.size, current:this.search.current, processNumber: this.search.processNumber}).then(res => {
+        this.tableLoading = false
         if (res.code == 200) {
           this.tableDataAlist = res.data.records
           this.search.total = res.data.total
         }
+      }).catch(err => {
+        this.tableLoading = false
       })
     },
     //table 浜嬩欢澶勭悊寮�濮嬪
+    // 涓嬭浇闄勪欢
     handleAttachmentClick(row) {
-      // 妯℃嫙涓嬭浇闄勪欢
-      const imageUrl = this.javaApi+'/img/'+row.systemFileName; // 鍥剧墖 URL
-      // downloadImage(imageUrl);
-      file.downloadIamge(imageUrl,row.fileName)
+      this.$download.saveAs(row.systemFileName, row.fileName)
     },
     handleViewClick(row) {
       getShowIncidentReport({id: row.id}).then(res => {
@@ -797,7 +801,7 @@
         cancelButtonText: '鍙栨秷',
         type: 'warning'
       }).then(() => {
-        deleteIncidentReportAll({id: row.id}).then(res => {
+        deleteIncidentReport({id: row.id}).then(res => {
           if (res.code == 200) {
             this.$message.success('鍒犻櫎鎴愬姛')
             this.getDeviceAList(this.clickNodeVal.value);
@@ -870,6 +874,7 @@
 }
 
 .search {
+  margin-top: 10px;
   background-color: #fff;
   height: 40px;
   display: flex;
diff --git a/src/views/CNAS/resourceDemand/device/component/check.vue b/src/views/CNAS/resourceDemand/device/component/check.vue
index 40e0de3..2097352 100644
--- a/src/views/CNAS/resourceDemand/device/component/check.vue
+++ b/src/views/CNAS/resourceDemand/device/component/check.vue
@@ -181,7 +181,7 @@
                   <el-button v-if="operationType === 'add'" slot="append" icon="el-icon-delete-solid"
                              @click="deleteFile"></el-button>
                 </el-input>
-                <el-upload v-if="operationType === 'add'" ref="upload" :action="action" :before-upload="beforeUpload" :headers="headers"
+                <el-upload v-if="operationType === 'add'" ref="upload" :action="action" :before-upload="beforeUpload" :headers="uploadHeader"
                            :limit="1" :on-error="onError" :on-success="handleSuccessUp"
                            :show-file-list="false"
                            style="float: right;">
@@ -252,7 +252,13 @@
 <script>
 import file from '@/utils/file';
 import { mapGetters } from "vuex";
-import {deviceMetricRecordExport} from "@/api/cnas/resourceDemand/device";
+import {
+  addOrUpdateDeviceMetricRecord, deleteCNASFile, deleteDeviceMetricRecord, deleteDeviceMetrics,
+  deviceMetricRecordExport,
+  deviceMetricRecordPage,
+  saveOrUpdateDeviceMetric,
+  selectDeviceMetric, showDeviceMetricsCopy
+} from "@/api/cnas/resourceDemand/device";
 export default {
   components: {},
   props: {
@@ -336,7 +342,7 @@
   computed: {
     ...mapGetters(["nickName"]),
     action() {
-      return this.javaApi + this.$api.personnel.saveCNASFile
+      return this.javaApi + '/personBasicInfo/saveCNASFile'
     }
   },
   mounted() {
@@ -375,7 +381,7 @@
     async getXmsg() {
       this.calibrateParamsLoading = true
       try {
-        await this.$axios.get(this.$api.deviceCheck.selectDeviceMetric + "?deviceId=" + this.clickNodeVal.value + "&type=examine").then(res => {
+        await selectDeviceMetric({deviceId: this.clickNodeVal.value, type: 'examine'}).then(res => {
           if (res.code == 200) {
             this.calibrateParams = res.data
           }
@@ -399,11 +405,7 @@
           this.form0.deviceId = this.clickNodeVal.value;
           this.form0.createdBy = this.nickName;
           this.form0.type = 'examine'
-          this.$axios.post(this.$api.deviceCheck.saveOrUpdateDeviceMetric, this.form0, {
-            headers: {
-              'Content-Type': 'application/json'
-            }
-          }).then(res => {
+          saveOrUpdateDeviceMetric(this.form0).then(res => {
             if (res.code == 200) {
               this.$message.success('淇濆瓨鎴愬姛')
               this.$refs['form0'].resetFields()
@@ -420,7 +422,7 @@
     },
     // 鏌ヨ璁惧鏍告煡鍒楄〃
     getTableList(deviceId) {
-      this.$axios.get(this.$api.deviceCheck.deviceMetricRecordPage + '?deviceId=' + deviceId + "&size=" + this.search.size + "&current=" + this.search.current + "&type=examine").then(res => {
+      deviceMetricRecordPage({deviceId: deviceId, size: this.search.size, current: this.search.current, type: 'examine'}).then(res => {
         this.tableData = res.data.records
         this.search.total = res.data.total
       })
@@ -442,12 +444,11 @@
             this.calibrationRecord.deviceId = this.clickNodeVal.value;
             this.calibrationRecord.createUser = this.nickName
             this.calibrationRecord.deviceMetricsCopyList = this.calibrateParams
+            this.calibrationRecord.deviceMetricsCopyList.forEach(ele => {
+              delete ele.creationTime
+            })
             this.calibrationRecord.type = 'examine'
-            this.$axios.post(this.$api.deviceCheck.addOrUpdateDeviceMetricRecord, this.calibrationRecord, {
-              headers: {
-                'Content-Type': 'application/json'
-              }
-            }).then(res => {
+            addOrUpdateDeviceMetricRecord(this.calibrationRecord).then(res => {
               if (res.code == 200) {
                 this.$message.success('娣诲姞鎴愬姛')
                 this.dialogVisible1 = false
@@ -463,6 +464,22 @@
           this.$message.warning('鏈夊繀濉」鏈~');
         }
       })
+    },
+    handleClose(done) {
+      this. calibrationRecord = {
+        unitOfMeasure: '', // 鏍告煡浜�
+        calibrationDate: '', // 鏍告煡鏃ユ湡
+        nextCalibrationDate: '', // 涓嬫鏍告煡鏃ユ湡
+        calculatingApparatus: '', // 鏍告煡鍣ㄥ叿
+        standardRange: '', // 鏍告煡鏍囧噯閲忕▼
+        calibrationStandardUncertainty: '', // 鏍告煡鏍囧噯涓嶇‘瀹氬害
+        byDocument: '', // 鏍告煡鎸囧涔�
+        certificateSerialNumber: '', // 妫�鏌ユ姤鍛婃寚瀵间功
+        fileName: '', // 闄勪欢
+        status: '', // 鏍告煡鎬荤粨璁�
+        remark: '', // 澶囨敞
+      }
+      this.dialogVisible1 = false
     },
     resetcalibrationRecord() {
       this.$refs.calibrationRecord.resetFields()
@@ -498,7 +515,7 @@
         cancelButtonText: '鍙栨秷',
         type: 'warning'
       }).then(() => {
-        this.$axios.delete(this.$api.personnel.deleteCNASFile + "?fileName=" + this.form.systemFileName).then(res => {
+        deleteCNASFile({fileName: this.form.systemFileName}).then(res => {
           if (res.code == 200) {
             this.$message.success('鍒犻櫎鎴愬姛锛�')
           }
@@ -512,10 +529,7 @@
     },
     // end
     handleAttachmentClick(row) {
-      // 妯℃嫙涓嬭浇闄勪欢
-      const imageUrl = this.javaApi + '/img/' + row.systemFileName; // 鍥剧墖 URL
-      file.downloadIamge(imageUrl, row.fileName)
-      // downloadImage(imageUrl, row.fileName);
+      this.$download.saveAs(row.systemFileName, row.fileName)
     },
     // 娣诲姞鏍告煡璁板綍
     add(type) {
@@ -525,7 +539,7 @@
     },
     // 鏌ョ湅璇︽儏
     handleViewClick(type, row) {
-      this.$axios.get(this.$api.deviceCheck.showDeviceMetricsCopy + "?id=" + row.id + "&type=examine").then(res => {
+      showDeviceMetricsCopy({id: row.id, type: 'examine'}).then(res => {
         this.calibrateParams = res.data
       })
       this.calibrationRecord = { ...row }
@@ -540,7 +554,7 @@
         cancelButtonText: '鍙栨秷',
         type: 'warning'
       }).then(() => {
-        this.$axios.delete(this.$api.deviceCheck.deleteDeviceMetricRecord + "?id=" + row.id).then(res => {
+        deleteDeviceMetricRecord({id: row.id}).then(res => {
           this.getTableList(this.clickNodeVal.value) // 鑾峰彇璁惧鏍″噯鍒楄〃鏁版嵁
           this.$message.success('鍒犻櫎鎴愬姛锛�')
         })
@@ -557,7 +571,7 @@
         cancelButtonText: '鍙栨秷',
         type: 'warning'
       }).then(() => {
-        this.$axios.delete(this.$api.deviceCheck.deleteDeviceMetrics + "?id=" + row.id).then(res => {
+        deleteDeviceMetrics({id: row.id}).then(res => {
           this.getXmsg();
           this.$message.success('鍒犻櫎鎴愬姛锛�')
         })
@@ -636,6 +650,7 @@
 
 .btns {
   text-align: right;
+  margin-top: 10px;
 }
 
 h4 {
diff --git a/src/views/CNAS/resourceDemand/device/component/files.vue b/src/views/CNAS/resourceDemand/device/component/files.vue
index feabc51..1850918 100644
--- a/src/views/CNAS/resourceDemand/device/component/files.vue
+++ b/src/views/CNAS/resourceDemand/device/component/files.vue
@@ -470,11 +470,10 @@
   updateDocument,
   addDocument,
   deleteDocumentById,
-  getAllDocuments,
   selectDeviceByCode,
   upDeviceParameter,
   exportDeviceFile,
-  getInsProduction,
+  getInsProduction, getListByDId,
 } from '@/api/cnas/resourceDemand/device.js'
 import { selectUserCondition } from "@/api/system/user";
 import {
@@ -719,7 +718,7 @@
     },
     // 鑾峰彇鐩稿叧鏂囨。鏁版嵁鐨刟pi
     getPage() {
-      getAllDocuments({ deviceId: this.clickNodeVal.value }).then(res => {
+      getListByDId({ id: this.clickNodeVal.value }).then(res => {
         if (res.code == 200)
           this.tableDataA = res.data
       })
diff --git a/src/views/CNAS/resourceDemand/device/index.vue b/src/views/CNAS/resourceDemand/device/index.vue
index 8206ced..a12de51 100644
--- a/src/views/CNAS/resourceDemand/device/index.vue
+++ b/src/views/CNAS/resourceDemand/device/index.vue
@@ -47,7 +47,7 @@
       <div v-if="!isShowAll" style="height: 100%;">
         <el-tabs v-model="tabListActiveName" class="main_right" type="border-card" @tab-click="handleClick">
           <el-tab-pane label="璁惧杩愯鎬昏" name="璁惧杩愯鎬昏">
-            <operationOverview v-if="tabListActiveName == '璁惧杩愯鎬昏'" :clickNodeVal="clickNodeVal"/>
+            <operationOverview view v-if="tabListActiveName == '璁惧杩愯鎬昏'" :clickNodeVal="clickNodeVal"/>
           </el-tab-pane>
           <el-tab-pane label="璁惧妗f" name="璁惧妗f">
             <files v-if="tabListActiveName == '璁惧妗f'" :clickNodeVal="clickNodeVal" />
@@ -123,7 +123,7 @@
       isShowAll: true,
       deviceName: "", // 渚ц竟鏍忔悳绱�
       loading: false,
-      tabListActiveName: '璁惧妗f',
+      tabListActiveName: '璁惧杩愯鎬昏',
       menuListActiveName: '璁惧鎬昏',
       list: [],
       clickNodeVal: {}
@@ -200,7 +200,7 @@
 .device-right {
   background: #fff;
   width: calc(100% - 250px);
-  height: calc(100vh - 100px);
+  height: calc(100vh - 40px);
   border-radius: 16px;
   box-sizing: border-box;
   padding: 10px;
diff --git a/src/views/business/reportPreparation/index.vue b/src/views/business/reportPreparation/index.vue
index dc7e6a8..c5df9d9 100644
--- a/src/views/business/reportPreparation/index.vue
+++ b/src/views/business/reportPreparation/index.vue
@@ -1,9 +1,1920 @@
+<style scoped>
+.title {
+  height: 60px;
+  line-height: 60px;
+}
+
+.search {
+  background-color: #fff;
+  height: 80px;
+  display: flex;
+  align-items: center;
+}
+
+.search_thing {
+  display: flex;
+  align-items: center;
+  height: 50px;
+  width: 230px;
+}
+
+.search_label {
+  width: 90px;
+  font-size: 14px;
+  text-align: right;
+}
+
+.search_input {
+  width: calc(100% - 90px);
+}
+
+.table {
+  margin-top: 10px;
+  background-color: #fff;
+  width: calc(100% - 40px);
+  height: calc(100% - 60px - 80px - 10px - 40px);
+  padding: 20px;
+}
+
+.el-form-item {
+  margin-bottom: 16px;
+}
+
+.full-screen {
+  position: absolute;
+  right: 52px;
+  top: 22px;
+}
+
+.btns {
+  position: absolute;
+  right: 40px;
+  top: 50%;
+  transform: translate(0, -50%);
+  display: flex;
+  align-items: center;
+}
+
+.fullscreen {
+  height: 82vh;
+}
+.custom-upload >>> .el-upload-list--text {
+  max-height: 20vh;
+  overflow-y: scroll;
+}
+</style>
+
 <template>
-  <div>鎶ュ憡缂栧埗</div>
+  <div class="inspection_order">
+    <div style="width: 100%; height: 100%">
+      <div>
+        <el-row class="title">
+          <el-col :span="12" style="padding-left: 20px; text-align: left"
+            >鎶ュ憡缂栧埗</el-col
+          >
+        </el-row>
+      </div>
+      <div class="search" :style="`height: ${more ? 130 : 80}px;`">
+        <el-row :gutter="10" style="width: 100%">
+          <el-col :span="16" style="display: flex; flex-wrap: wrap">
+            <div class="search_thing" v-if="maxNum >= 1">
+              <div class="search_label">鎶ュ憡缂栧彿锛�</div>
+              <div class="search_input">
+                <el-input
+                  size="small"
+                  placeholder="璇疯緭鍏�"
+                  clearable
+                  v-model="entity.code"
+                  @keyup.enter.native="refreshTable()"
+                ></el-input>
+              </div>
+            </div>
+            <div class="search_thing" v-if="maxNum >= 2">
+              <div class="search_label">涓婁紶鐘舵�侊細</div>
+              <div class="search_input">
+                <el-select
+                  size="small"
+                  clearable
+                  @clear="refreshTable()"
+                  @change="refreshTable()"
+                  v-model="entity.isUpload"
+                >
+                  <el-option
+                    v-for="(item, index) in tagField.isUpload.select"
+                    :value="item.value"
+                    :label="item.label"
+                    :key="index"
+                  ></el-option>
+                </el-select>
+              </div>
+            </div>
+            <div class="search_thing" v-if="maxNum >= 3">
+              <div class="search_label">鎻愪氦鐘舵�侊細</div>
+              <div class="search_input">
+                <el-select
+                  size="small"
+                  clearable
+                  @clear="refreshTable()"
+                  @change="refreshTable()"
+                  v-model="entity.state"
+                >
+                  <el-option
+                    v-for="(item, index) in tagField.state.select"
+                    :value="item.value"
+                    :label="item.label"
+                    :key="index"
+                  ></el-option>
+                </el-select>
+              </div>
+            </div>
+            <div
+              class="search_thing"
+              v-if="maxNum >= 4 || (maxNum < 4 && more)"
+            >
+              <div class="search_label">瀹℃牳鐘舵�侊細</div>
+              <div class="search_input">
+                <el-select
+                  size="small"
+                  clearable
+                  @clear="refreshTable()"
+                  @change="refreshTable()"
+                  v-model="entity.isExamine"
+                >
+                  <el-option
+                    v-for="(item, index) in tagField.isExamine.select"
+                    :value="item.value"
+                    :label="item.label"
+                    :key="index"
+                  ></el-option>
+                </el-select>
+              </div>
+            </div>
+            <div class="search_thing" v-if="maxNum >= 5 || more">
+              <div class="search_label">鎵瑰噯鐘舵�侊細</div>
+              <div class="search_input">
+                <el-select
+                  size="small"
+                  clearable
+                  @clear="refreshTable()"
+                  @change="refreshTable()"
+                  v-model="entity.isRatify"
+                >
+                  <el-option
+                    v-for="(item, index) in tagField.isRatify.select"
+                    :value="item.value"
+                    :label="item.label"
+                    :key="index"
+                  ></el-option>
+                </el-select>
+              </div>
+            </div>
+            <div class="search_thing" v-if="maxNum >= 6 || more">
+              <div class="search_label">鍒涘缓鏃堕棿锛�</div>
+              <div class="search_input">
+                <el-date-picker
+                  size="small"
+                  clearable
+                  @clear="refreshTable()"
+                  @change="refreshTable()"
+                  v-model="entity.createTimeRange"
+                  type="daterange"
+                  value-format="yyyy-MM-dd[T]HH:mm:ss"
+                  range-separator="鑷�"
+                  start-placeholder="寮�濮嬫棩鏈�"
+                  end-placeholder="缁撴潫鏃ユ湡"
+                  :default-time="['00:00:00', '23:59:59']"
+                >
+                </el-date-picker>
+              </div>
+            </div>
+          </el-col>
+          <el-col :span="8">
+            <div class="search_thing">
+              <el-button
+                v-if="maxNum < 5"
+                type="text"
+                :icon="!more ? 'el-icon-arrow-down' : 'el-icon-arrow-up'"
+                style="color: #3a7bfa"
+                @click="more = !more"
+                >{{ !more ? "鏇村" : "鏀惰捣" }}</el-button
+              >
+              <div class="search_thing" style="padding-left: 20px">
+                <el-button
+                  size="small"
+                  @click="refresh()"
+                  style="margin-right: 6px"
+                  >閲� 缃�</el-button
+                >
+                <el-button
+                  size="small"
+                  type="primary"
+                  @click="refreshTable()"
+                  style="margin-right: 6px"
+                  >鏌� 璇�</el-button
+                >
+                <template>
+                  <el-dropdown
+                    @command="handleCommand"
+                    style="margin-left: 10px"
+                  >
+                    <el-button type="primary" size="small">
+                      鏇村鎿嶄綔<i class="el-icon-arrow-down el-icon--right"></i>
+                    </el-button>
+                    <el-dropdown-menu slot="dropdown">
+                      <el-dropdown-item
+                        icon="el-icon-download"
+                        command="batchDownload"
+                        >鎵归噺涓嬭浇</el-dropdown-item
+                      >
+                      <el-dropdown-item
+                        icon="el-icon-upload"
+                        command="batchUpload"
+                        >鎵归噺涓婁紶</el-dropdown-item
+                      >
+                      <el-dropdown-item
+                        icon="el-icon-s-check"
+                        command="oneClickApproval"
+                        >涓�閿鎵�</el-dropdown-item
+                      >
+                      <el-dropdown-item
+                        icon="el-icon-setting"
+                        command="approvalConfig"
+                        >瀹℃壒绛惧悕閰嶇疆</el-dropdown-item
+                      >
+                    </el-dropdown-menu>
+                  </el-dropdown>
+                </template>
+                <template>
+                  <el-button
+                    size="small"
+                    type="primary"
+                    @click="handleDowns"
+                    :loading="outLoading"
+                    style="margin-right: 6px"
+                    >鎵归噺涓嬭浇</el-button
+                  >
+                  <el-button
+                    size="small"
+                    type="primary"
+                    @click="openBatchUploadDia()"
+                    :loading="inLoading"
+                    >鎵归噺涓婁紶</el-button
+                  >
+                  <el-button
+                    size="small"
+                    type="primary"
+                    @click="oneClickApproval()"
+                    :loading="approvalLoading"
+                    >涓�閿鎵�</el-button
+                  >
+                  <el-button
+                    size="small"
+                    type="primary"
+                    @click="openApprovalConfig()"
+                    :loading="approvalConfigLoading"
+                    >瀹℃壒绛惧悕閰嶇疆</el-button
+                  >
+                </template>
+              </div>
+              <!-- <div class="btns">
+              <el-button size="small" type="primary" @click="handleDowns" :loading="outLoading" style="margin-right: 16px;">鎵归噺涓嬭浇</el-button>
+              <el-button size="small" type="primary" @click="openBatchUploadDia()" :loading="inLoading">鎵归噺涓婁紶</el-button>
+            </div> -->
+            </div>
+          </el-col>
+        </el-row>
+      </div>
+      <div class="table">
+        <div
+          style="
+            width: 100%;
+            display: flex;
+            flex-wrap: nowrap;
+            font-size: 13px;
+            flex-direction: row;
+            justify-content: flex-end;
+            align-items: center;
+          "
+        >
+          <p style="margin-left: 15px">
+            寰呮彁浜ゆ暟閲�:&nbsp;<span
+              style="font-size: 16px; color: rgb(58, 123, 250)"
+              >{{ unSubmitCount }}</span
+            >
+          </p>
+          <p style="margin-left: 15px">
+            寰呭鏍告暟閲�:&nbsp;<span
+              style="font-size: 16px; color: rgb(58, 123, 250)"
+              >{{ unExamineCount }}</span
+            >
+          </p>
+          <p style="margin-left: 15px">
+            寰呮壒鍑嗘暟閲�:&nbsp;<span
+              style="font-size: 16px; color: rgb(58, 123, 250)"
+              >{{ unRatifyCount }}</span
+            >
+          </p>
+        </div>
+        <lims-table
+          :tableData="tableData"
+          :column="column"
+          :tableLoading="tableLoading"
+          :height="'calc(100vh - 270px)'"
+          :page="page"
+          @pagination="pagination"
+        ></lims-table>
+      </div>
+    </div>
+    <!--鎶ュ憡鏌ョ湅-->
+    <el-dialog
+      :fullscreen="fullscreen"
+      top="5vh"
+      :modal-append-to-body="false"
+      :visible.sync="viewIssuedVisible"
+      title="鎶ュ憡鏌ョ湅"
+      width="80vw"
+    >
+      <div class="full-screen">
+        <i
+          v-if="!fullscreen"
+          class="el-icon-full-screen"
+          style="cursor: pointer; font-size: 18px"
+          @click="fullscreen = true"
+        ></i>
+        <!-- <img
+          v-else
+          alt=""
+          src="../../../static/img/no-full.svg"
+          style="cursor: pointer"
+          @click="fullscreen = false"
+        /> -->
+      </div>
+      <div v-if="viewIssuedVisible" style="height: 80vh">
+        <onlyoffice
+          ref="onlyoffice"
+          :options="option"
+          style="width: 100%; height: 100%"
+        />
+      </div>
+    </el-dialog>
+    <el-dialog
+      title="鍦ㄧ嚎缂栧埗"
+      :visible.sync="claimVisible"
+      width="22cm"
+      :modal-append-to-body="false"
+      :fullscreen="fullscreen"
+    >
+      <div class="full-screen">
+        <i
+          class="el-icon-full-screen"
+          style="cursor: pointer; font-size: 18px"
+          @click="fullscreen = true"
+          v-if="!fullscreen"
+        ></i>
+        <!-- <img
+          src="../../../static/img/no-full.svg"
+          alt=""
+          v-else
+          style="cursor: pointer"
+          @click="fullscreen = false"
+        /> -->
+      </div>
+      <Word
+        style="height: 70vh"
+        :class="{ fullscreen: fullscreen }"
+        v-if="claimVisible"
+        ref="Word"
+        :value="value"
+      />
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="claimVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="confirmClaim">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog
+      title="鎶ュ憡瀹℃牳"
+      top="5vh"
+      :visible.sync="issuedVisible"
+      width="80vw"
+      :modal-append-to-body="false"
+      :fullscreen="fullscreen"
+    >
+      <div class="full-screen">
+        <i
+          class="el-icon-full-screen"
+          style="cursor: pointer; font-size: 18px"
+          @click="fullscreen = true"
+          v-if="!fullscreen"
+        ></i>
+        <!-- <img
+          src="../../../static/img/no-full.svg"
+          alt=""
+          v-else
+          style="cursor: pointer"
+          @click="fullscreen = false"
+        /> -->
+      </div>
+      <div style="height: 75vh" v-if="issuedVisible">
+        <onlyoffice
+          ref="onlyoffice"
+          :options="option"
+          style="width: 100%; height: 100%"
+        />
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="issuedReasonVisible = true" :disabled="loadingIssued"
+          >涓嶉�氳繃</el-button
+        >
+        <el-button type="primary" @click="subIssued" :loading="loadingIssued"
+          >閫� 杩�</el-button
+        >
+      </span>
+    </el-dialog>
+    <el-dialog
+      title="涓嶉�氳繃鍘熷洜"
+      top="5vh"
+      :visible.sync="issuedReasonVisible"
+      width="400px"
+      :modal-append-to-body="false"
+    >
+      <div class="search_thing">
+        <div class="search_label">涓嶉�氳繃鍘熷洜锛�</div>
+        <div class="search_input">
+          <el-input
+            size="small"
+            placeholder="璇疯緭鍏�"
+            clearable
+            v-model="reason"
+          ></el-input>
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button
+          @click="issuedReasonVisible = false"
+          :disabled="loadingIssuedReason"
+          >鍙栨秷</el-button
+        >
+        <el-button
+          type="primary"
+          @click="handleIssuedReason"
+          :loading="loadingIssuedReason"
+          >纭畾</el-button
+        >
+      </span>
+    </el-dialog>
+    <el-dialog
+      title="鎶ュ憡鎵瑰噯"
+      top="5vh"
+      :visible.sync="approveVisible"
+      width="80vw"
+      :modal-append-to-body="false"
+      :fullscreen="fullscreen"
+    >
+      <div class="full-screen">
+        <i
+          class="el-icon-full-screen"
+          style="cursor: pointer; font-size: 18px"
+          @click="fullscreen = true"
+          v-if="!fullscreen"
+        ></i>
+        <!-- <img
+          src="../../../static/img/no-full.svg"
+          alt=""
+          v-else
+          style="cursor: pointer"
+          @click="fullscreen = false"
+        /> -->
+      </div>
+      <div style="height: 75vh" v-if="approveVisible">
+        <onlyoffice
+          ref="onlyoffice"
+          :options="option"
+          style="width: 100%; height: 100%"
+        />
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button
+          @click="approveReasonVisible = true"
+          :disabled="loadingApprove"
+          >涓嶆壒鍑�</el-button
+        >
+        <el-button type="primary" @click="subApprove" :loading="loadingApprove"
+          >鎵� 鍑�</el-button
+        >
+      </span>
+    </el-dialog>
+    <el-dialog
+      title="涓嶆壒鍑嗗師鍥�"
+      :visible.sync="approveReasonVisible"
+      width="400px"
+      :modal-append-to-body="false"
+    >
+      <div class="search_thing">
+        <div class="search_label">涓嶆壒鍑嗗師鍥狅細</div>
+        <div class="search_input">
+          <el-input
+            size="small"
+            placeholder="璇疯緭鍏�"
+            clearable
+            v-model="reason"
+          ></el-input>
+        </div>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button
+          @click="approveReasonVisible = false"
+          :disabled="loadingApproveReason"
+          >鍙栨秷</el-button
+        >
+        <el-button
+          type="primary"
+          @click="handleApproveReason"
+          :loading="loadingApproveReason"
+          >纭畾</el-button
+        >
+      </span>
+    </el-dialog>
+    <el-dialog
+      :visible.sync="batchUploadDia"
+      title="鎶ュ憡鎵归噺涓婁紶"
+      width="30%"
+      :close-on-click-modal="false"
+      top="5vh"
+    >
+      <div>
+        <!-- <el-upload
+            class="upload-demo"
+            :action="action"
+            :headers="headers"
+            :show-file-list="false"
+            accept=".doc,.docx"
+            :limit="1"
+            :before-upload="beforeUpload"
+            :on-success="handleSuccess"
+            ref="upload"
+            :on-error="onError">
+          </el-upload> -->
+        <el-upload
+          ref="upload"
+          class="upload-demo custom-upload"
+          drag
+          show-file-list
+          accept=".doc,.docx"
+          :action="action"
+          :headers="headers"
+          :on-error="onError"
+          :before-upload="beforeUpload"
+          :file-list="fileList"
+          :auto-upload="false"
+          :limit="100"
+          :on-exceed="uploadExceed"
+          :on-success="handleSuccess"
+          multiple
+        >
+          <i class="el-icon-upload"></i>
+          <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+          <div class="el-upload__tip" slot="tip">
+            鍙兘涓婁紶.doc/.docx鏂囦欢锛屼笖鍗曚釜鏂囦欢涓嶈秴杩�10MB
+          </div>
+        </el-upload>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="small" type="primary" @click="submitUpload"
+          >纭涓婁紶</el-button
+        >
+      </span>
+    </el-dialog>
+    <!-- 鎶ュ憡鎵归噺瀹℃壒寮规 -->
+    <el-dialog
+      :visible.sync="oneClickApprovalDialog"
+      title="鎶ュ憡鎵归噺瀹℃壒"
+      width="40%"
+      :close-on-click-modal="false"
+      top="5vh"
+    >
+      <div>
+        <el-result
+          icon="error"
+          v-show="progressData.hasException != null"
+          title="閿欒淇℃伅"
+          :subTitle="progressData.hasException"
+        ></el-result>
+        <el-result
+          icon="success"
+          v-show="isSuccess && progressData.hasException == null"
+          title="鎴愬姛淇℃伅"
+          subTitle="鎶ュ憡瀹℃壒瀹屾垚"
+        ></el-result>
+        <el-progress
+          :percentage="progressData.hasNum"
+          :color="customColors"
+        ></el-progress>
+        <el-statistic title="鍓╀綑鎶ュ憡鏁伴噺">
+          <template slot="formatter">
+            {{ progressData.surplus }}/{{ progressData.hasCount }}
+          </template>
+        </el-statistic>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <!-- <el-button size="small" type="primary" @click="confirmApproval"
+          >纭</el-button
+        > -->
+      </span>
+    </el-dialog>
+    <!-- 鎾ゅ洖寮规 -->
+    <el-dialog
+      title="璇烽�夋嫨闇�瑕佹挙鍥炵殑璇曢獙瀹�"
+      :visible.sync="withdrawDialogVisible"
+      width="30%"
+      :before-close="handleClose"
+    >
+      <el-select
+        v-model="laboratory"
+        multiple
+        clearable
+        style="width: 100%; margin-bottom: 20px"
+        placeholder="璇烽�夋嫨璇曢獙瀹�"
+      >
+        <el-option
+          v-for="(item, i) in laboratorys"
+          :key="i"
+          :label="item.label"
+          :value="item.value"
+        ></el-option>
+      </el-select>
+
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="handleClose">鍙� 娑�</el-button>
+        <el-button type="primary" @click="withdrawOperation">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+
+    <!-- 瀹℃壒绛惧悕閰嶇疆寮规 -->
+    <el-dialog
+      :visible.sync="approvalConfigDialog"
+      title="瀹℃壒绛惧悕閰嶇疆"
+      width="55%"
+      :close-on-click-modal="false"
+      top="5vh"
+    >
+      <div v-if="approvalConfigListTX.editor != null">
+        <el-divider content-position="left">閫氫俊浜у搧瀹為獙瀹�</el-divider>
+        <el-form
+          size="mini"
+          :model="approvalConfigListTX"
+          inline
+          label-position="right"
+        >
+          <el-row>
+            <el-col :span="8">
+              <el-form-item label="缂栧埗浜�:" prop="editor">
+                <el-select
+                  v-model="approvalConfigListTX.editor"
+                  placeholder="璇烽�夋嫨"
+                  style="width: 100%"
+                  filterable
+                >
+                  <el-option-group
+                    v-for="(item, index) in Object.keys(personList)"
+                    :key="index"
+                    :label="item"
+                  >
+                    <el-option
+                      v-for="op in personList[item]"
+                      :key="op.id"
+                      :label="op.name"
+                      :value="op.id"
+                    >
+                    </el-option>
+                  </el-option-group>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="瀹℃牳浜�:" prop="examiner">
+                <el-select
+                  v-model="approvalConfigListTX.examiner"
+                  placeholder="璇烽�夋嫨"
+                  style="width: 100%"
+                  filterable
+                >
+                  <el-option-group
+                    v-for="(item, index) in Object.keys(personList)"
+                    :key="index"
+                    :label="item"
+                  >
+                    <el-option
+                      v-for="op in personList[item]"
+                      :key="op.id"
+                      :label="op.name"
+                      :value="op.id"
+                    >
+                    </el-option>
+                  </el-option-group>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="鎵瑰噯浜�:" prop="approver">
+                <el-select
+                  v-model="approvalConfigListTX.approver"
+                  placeholder="璇烽�夋嫨"
+                  style="width: 100%"
+                  filterable
+                >
+                  <el-option-group
+                    v-for="(item, index) in Object.keys(personList)"
+                    :key="index"
+                    :label="item"
+                  >
+                    <el-option
+                      v-for="op in personList[item]"
+                      :key="op.id"
+                      :label="op.name"
+                      :value="op.id"
+                    >
+                    </el-option>
+                  </el-option-group>
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+      </div>
+      <br />
+      <div v-if="approvalConfigListDL.editor != null">
+        <el-divider content-position="left">鐢靛姏浜у搧瀹為獙瀹�</el-divider>
+        <el-form
+          size="mini"
+          :model="approvalConfigListDL"
+          inline
+          label-position="right"
+        >
+          <el-row>
+            <el-col :span="8">
+              <el-form-item label="缂栧埗浜�:" prop="editor">
+                <el-select
+                  v-model="approvalConfigListDL.editor"
+                  placeholder="璇烽�夋嫨"
+                  style="width: 100%"
+                  filterable
+                >
+                  <el-option-group
+                    v-for="(item, index) in Object.keys(personList)"
+                    :key="index"
+                    :label="item"
+                  >
+                    <el-option
+                      v-for="op in personList[item]"
+                      :key="op.id"
+                      :label="op.name"
+                      :value="op.id"
+                    >
+                    </el-option>
+                  </el-option-group>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="瀹℃牳浜�:" prop="examiner">
+                <el-select
+                  v-model="approvalConfigListDL.examiner"
+                  placeholder="璇烽�夋嫨"
+                  style="width: 100%"
+                  filterable
+                >
+                  <el-option-group
+                    v-for="(item, index) in Object.keys(personList)"
+                    :key="index"
+                    :label="item"
+                  >
+                    <el-option
+                      v-for="op in personList[item]"
+                      :key="op.id"
+                      :label="op.name"
+                      :value="op.id"
+                    >
+                    </el-option>
+                  </el-option-group>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8">
+              <el-form-item label="鎵瑰噯浜�:" prop="approver">
+                <el-select
+                  v-model="approvalConfigListDL.approver"
+                  placeholder="璇烽�夋嫨"
+                  style="width: 100%"
+                  filterable
+                >
+                  <el-option-group
+                    v-for="(item, index) in Object.keys(personList)"
+                    :key="index"
+                    :label="item"
+                  >
+                    <el-option
+                      v-for="op in personList[item]"
+                      :key="op.id"
+                      :label="op.name"
+                      :value="op.id"
+                    >
+                    </el-option>
+                  </el-option-group>
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button size="small" type="primary" @click="confirmApprovalConfig"
+          >纭</el-button
+        >
+      </span>
+    </el-dialog>
+  </div>
 </template>
 
 <script>
-export default {};
-</script>
+import limsTable from "@/components/Table/lims-table.vue";
+import onlyoffice from "../reportPreparation/onlyoffice.vue";
+import {
+  pageInsReport,
+  inReport,
+  upAll,
+  getLaboratoryByReportId,
+  withdraw,
+  updateApproveConfig,
+  getUserList,
+  getApproveConfigList,
+  downAll,
+  getBatchApprovalProgress,
+  getReportCountInfo,
+  downReport,
+  upReportUrl,
+  ratifyReport,
+  writeReport,
+  examineReport,
+  downLoad,
+  getReportInfo,
+} from "../../../api/business/reportPreparation";
 
-<style></style>
+export default {
+  components: {
+    limsTable,
+    onlyoffice,
+  },
+  data() {
+    return {
+      tagField: {
+        isUpload: {
+          select: [
+            {
+              value: 0,
+              type: "danger",
+              label: "鏈笂浼�",
+            },
+            {
+              value: 1,
+              type: "success",
+              label: "宸蹭笂浼�",
+            },
+          ],
+        },
+        isRatify: {
+          select: [
+            {
+              value: -9,
+              type: "info",
+              label: "鏈壒鍑�",
+            },
+            {
+              value: 0,
+              type: "danger",
+              label: "涓嶆壒鍑�",
+            },
+            {
+              value: 1,
+              type: "success",
+              label: "鎵瑰噯",
+            },
+          ],
+        },
+        isExamine: {
+          select: [
+            {
+              value: -9,
+              type: "info",
+              label: "鏈鏍�",
+            },
+            {
+              value: 0,
+              type: "danger",
+              label: "涓嶉�氳繃",
+            },
+            {
+              value: 1,
+              type: "success",
+              label: "閫氳繃",
+            },
+          ],
+        },
+        state: {
+          select: [
+            {
+              value: 0,
+              type: "danger",
+              label: "寰呮彁浜�",
+            },
+            {
+              value: 1,
+              type: "success",
+              label: "宸叉彁浜�",
+            },
+          ],
+        },
+      },
+      entity: {
+        isUpload: null,
+        entrustCode: null,
+        state: null,
+        isExamine: null,
+        isRatify: null,
+        code: null,
+        createTimeRange: [],
+      },
+      withdrawDialogVisible: false,
+      laboratory: [],
+      laboratorys: [],
+      isSuccess: false,
+      time: null,
+      //瀹℃壒杩涘害瀵硅薄
+      progressData: {
+        hasProgress: false,
+        hasNum: 0,
+        hasCount: 0,
+        hasException: null,
+        surplus: 0,
+      },
+      personList: [],
+      approvalConfigListTX: {
+        editor: null,
+        examiner: null,
+        approver: null,
+      }, //瀹℃壒绛惧悕閰嶇疆鍒楄〃
+      approvalConfigListDL: {
+        editor: null,
+        examiner: null,
+        approver: null,
+      }, //瀹℃壒绛惧悕閰嶇疆鍒楄〃
+      approvalConfigDialog: false,
+      approvalConfigLoading: false,
+      surplusReportNum: 0,
+      percentage: 0,
+      customColors: [
+        { color: "#f56c6c", percentage: 20 },
+        { color: "#e6a23c", percentage: 40 },
+        { color: "#5cb87a", percentage: 60 },
+        { color: "#1989fa", percentage: 80 },
+        { color: "#6f7ad3", percentage: 100 },
+      ],
+      oneClickApprovalDialog: false,
+      approvalLoading: false,
+      isShowMore: false,
+      more: false,
+      fileList: [],
+      batchUploadDia: false,
+      viewIssuedVisible: false,
+      tableData: [],
+      column: [
+        {
+          label: "鎶ュ憡缂栧彿",
+          prop: "code",
+        },
+        {
+          label: "涓婁紶鐘舵��",
+          prop: "isUpload",
+          dataType: "tag",
+          formatData: (params) => {
+            return params == 1 ? "宸蹭笂浼�" : "鏈笂浼�";
+          },
+          formatType: (params) => {
+            return params == 1 ? "success" : "danger";
+          },
+        },
+        {
+          label: "鍒涘缓鏃堕棿",
+          prop: "createTime",
+        },
+        {
+          label: "鎻愪氦浜�",
+          prop: "writeUserName",
+        },
+        {
+          label: "鎻愪氦鐘舵��",
+          prop: "state",
+          dataType: "tag",
+          formatData: (params) => {
+            return params == 1 ? "宸叉彁浜�" : "寰呮彁浜�";
+          },
+          formatType: (params) => {
+            return params == 1 ? "success" : "danger";
+          },
+        },
+        {
+          label: "鎻愪氦鏃堕棿",
+          prop: "writeTime",
+        },
+        {
+          label: "瀹℃牳浜�",
+          prop: "examineUser",
+        },
+        {
+          label: "瀹℃牳鐘舵��",
+          prop: "isExamine",
+          dataType: "tag",
+          formatData: (params) => {
+            let farmat = "";
+            if (params == 0) {
+              farmat = "涓嶉�氳繃";
+            } else if (params == 1) {
+              farmat = "閫氳繃";
+            } else {
+              farmat = "鏈鏍�";
+            }
+            return farmat;
+          },
+          formatType: (params) => {
+            let farmat = "";
+            if (params == 0) {
+              farmat = "danger";
+            } else if (params == 1) {
+              farmat = "success";
+            } else {
+              farmat = "info";
+            }
+            return farmat;
+          },
+        },
+        {
+          label: "瀹℃牳澶囨敞",
+          prop: "examineTell",
+        },
+        {
+          label: "瀹℃牳鏃堕棿",
+          prop: "examineTime",
+        },
+        {
+          label: "鎵瑰噯浜�",
+          prop: "ratifyUser",
+        },
+        {
+          label: "鎵瑰噯鐘舵��",
+          prop: "isRatify",
+          dataType: "tag",
+          formatData: (params) => {
+            let farmat = "";
+            if (params == 0) {
+              farmat = "涓嶆壒鍑�";
+            } else if (params == 1) {
+              farmat = "鎵瑰噯";
+            } else {
+              farmat = "鏈壒鍑�";
+            }
+            return farmat;
+          },
+          formatType: (params) => {
+            let farmat = "";
+            if (params == 0) {
+              farmat = "danger";
+            } else if (params == 1) {
+              farmat = "sucess";
+            } else {
+              farmat = "info";
+            }
+            return farmat;
+          },
+        },
+        {
+          label: "鎵瑰噯澶囨敞",
+          prop: "ratifyTell",
+        },
+        {
+          label: "鎵瑰噯鏃堕棿",
+          prop: "ratifyTime",
+        },
+        {
+          dataType: "action",
+          fixed: "right",
+          label: "鎿嶄綔",
+          operation: [
+            {
+              name: "缂栧埗",
+              type: "text",
+              clickFun: (row) => {
+                this.handleWeave(row);
+              },
+              disabled: (row) => {
+                return row.isExamine != -9;
+              },
+            },
+            {
+              name: "涓嬭浇",
+              type: "text",
+              clickFun: (row) => {
+                this.download(row);
+              },
+            },
+            {
+              name: "涓婁紶",
+              type: "upload",
+              url: "/file/attachmentType/upload",
+              data: (row) => {
+                return {
+                  id: row.id,
+                  type: 1,
+                };
+              },
+              uploadIdFun: (row) => {
+                return row.id;
+              },
+              disabled: (row) => {
+                return row.isExamine != -9;
+              },
+            },
+            {
+              name: "杩樺師",
+              type: "text",
+              clickFun: (row) => {
+                this.handleRestore(row);
+              },
+              disabled: (row) => {
+                return row.isExamine != -9;
+              },
+            },
+            {
+              name: "鎻愪氦",
+              type: "text",
+              clickFun: (row) => {
+                this.handleSubmit(row);
+              },
+              disabled: (row) => {
+                return row.state != 0;
+              },
+            },
+            {
+              name: "瀹℃牳",
+              type: "text",
+              clickFun: (row) => {
+                this.handleIssued(row);
+              },
+              disabled: (row) => {
+                return (
+                  row.state == null || row.state == 0 || row.isExamine == 1
+                );
+              },
+            },
+            {
+              name: "鎵瑰噯",
+              type: "text",
+              clickFun: (row) => {
+                this.handleApprove(row);
+              },
+              disabled: (row) => {
+                return (
+                  row.state == null ||
+                  row.state == 0 ||
+                  row.isExamine == 0 ||
+                  row.isExamine == -9 ||
+                  row.isRatify == 1
+                );
+              },
+            },
+            {
+              name: "鎾ゅ洖",
+              type: "text",
+              clickFun: (row) => {
+                this.withdraw(row);
+              },
+              disabled: (row) => {
+                return row.state == 1;
+              },
+            },
+          ],
+        },
+      ],
+      page: {
+        total: 0,
+        size: 10,
+        current: 1,
+      },
+      tableLoading: false,
+      entityCopy: {},
+      upIndex: 0,
+      statusList: [],
+      claimVisible: false,
+      issuedVisible: false,
+      issuedReasonVisible: false,
+      approveVisible: false,
+      approveReasonVisible: false,
+      fullscreen: false,
+      loadingApproveReason: false,
+      loadingApprove: false,
+      loadingIssuedReason: false,
+      loadingIssued: false,
+      value: ``,
+      reason: "",
+      currentInfo: null,
+      option: null,
+      mutiList: [],
+      outLoading: false,
+      inLoading: false,
+      maxNum: 1,
+      unSubmitCount: 0,
+      unRatifyCount: 0,
+      unExamineCount: 0,
+    };
+  },
+  computed: {
+    headers() {
+      return {
+        token: sessionStorage.getItem("token"),
+      };
+    },
+    action() {
+      return "";
+    },
+  },
+  created() {
+    this.getAuthorizedPerson();
+    this.handleResize();
+    // 鐩戝惉绐楀彛澶у皬鏀瑰彉浜嬩欢
+    window.addEventListener("resize", this.handleResize);
+  },
+  beforeDestroy() {
+    if (this.time != null) {
+      clearInterval(this.time);
+      this.time = null;
+    }
+    this.progressData = {
+      hasProgress: false,
+      hasNum: 0,
+      hasCount: 0,
+      hasException: null,
+      surplus: 0,
+    };
+    window.removeEventListener("resize", this.handleResize);
+  },
+  mounted() {
+    this.entityCopy = this.HaveJson(this.entity);
+    this.getList();
+    this.getReportCountInfo();
+  },
+  watch: {
+    batchUploadDia(newVal) {
+      if (!newVal) {
+        this.$refs.upload.clearFiles();
+        this.fileList = [];
+      }
+    },
+    progressData(newVal) {
+      if (newVal && newVal.hasNum == 100) {
+        clearInterval(this.time);
+        this.$message.success("鎶ュ憡瀹℃壒瀹屾垚");
+        this.isSuccess = true;
+        this.mutiList = [];
+        this.refresh();
+      } else if (
+        newVal &&
+        newVal.hasException != null &&
+        newVal.hasException != ""
+      ) {
+        clearInterval(this.time);
+      }
+    },
+    oneClickApprovalDialog(newVal) {
+      if (!newVal) {
+        this.isSuccess = false;
+        this.progressData = {
+          hasProgress: false,
+          hasNum: 0,
+          hasCount: 0,
+          hasException: null,
+          surplus: 0,
+        };
+      }
+    },
+  },
+  methods: {
+    // 杩斿洖鍒嗛〉鍊�
+    pagination({ page, limit }) {
+      this.page.current = page;
+      this.page.size = limit;
+      this.getList();
+    },
+    getList() {
+      this.tableLoading = true;
+      if (!this.entity.createTimeRange) {
+        this.entity.createTimeRange = [];
+      }
+      const data = { ...this.page, ...this.entity };
+      pageInsReport(data)
+        .then((res) => {
+          this.tableData = res.data.records;
+          this.page.total = res.data.total;
+          this.tableLoading = false;
+        })
+        .catch((error) => {
+          console.error(error);
+          this.tableLoading = false;
+        });
+    },
+    // 鎾ゅ洖 寮规
+    withdraw(row) {
+      getLaboratoryByReportId(row.id).then((res) => {
+        this.laboratorys = res.data;
+        this.reportId = row.id;
+        this.withdrawDialogVisible = true;
+      });
+    },
+    withdrawOperation() {
+      if (this.laboratory.length == 0) {
+        this.$message.error("璇烽�夋嫨闇�瑕佹挙鍥炵殑璇曢獙瀹�");
+        return;
+      }
+      let data = {
+        laboratory: JSON.stringify(this.laboratory),
+        id: this.reportId,
+      };
+      withdraw(data).then((res) => {
+        if (res.code == 200) {
+          this.$message.success("鎾ゅ洖鎴愬姛");
+          this.withdrawDialogVisible = false;
+          this.refresh();
+        }
+      });
+    },
+
+    handleCommand(command) {
+      switch (command) {
+        case "batchDownload":
+          //鎵归噺涓嬭浇
+          this.handleDowns();
+          break;
+        case "batchUpload":
+          //鎵归噺涓婁紶
+          this.openBatchUploadDia();
+          break;
+        case "oneClickApproval":
+          //涓�閿鎵�
+          this.oneClickApproval();
+          break;
+        case "approvalConfig":
+          //瀹℃壒绛惧悕閰嶇疆
+          this.openApprovalConfig();
+          break;
+      }
+    },
+    //纭鏇存柊瀹℃壒绛惧悕閰嶇疆
+    confirmApprovalConfig() {
+      let data = [];
+      if (this.approvalConfigListTX.id) {
+        data.push(this.approvalConfigListTX);
+      }
+      if (this.approvalConfigListDL.id) {
+        data.push(this.approvalConfigListDL);
+      }
+      updateApproveConfig({ configList: data })
+        .then((res) => {
+          if (res.code == 200) {
+            this.$message.success("鏇存柊鎴愬姛");
+            this.approvalConfigDialog = false;
+          }
+        })
+        .catch((error) => {
+          console.error(error);
+        });
+    },
+    //鑾峰彇浜哄憳淇℃伅
+    getAuthorizedPerson() {
+      getUserList()
+        .then((res) => {
+          this.personList = res.data;
+        })
+        .catch((error) => {
+          console.error(error);
+        });
+    },
+    //鎵撳紑瀹℃壒绛惧悕閰嶇疆寮规
+    openApprovalConfig() {
+      getApproveConfigList()
+        .then((res) => {
+          if (res.code !== 201) {
+            res.data.forEach((ele) => {
+              if (ele.laboratory == "閫氫俊浜у搧瀹為獙瀹�") {
+                this.approvalConfigListTX = { ...ele };
+              }
+              if (ele.laboratory == "鐢靛姏浜у搧瀹為獙瀹�") {
+                this.approvalConfigListDL = { ...ele };
+              }
+            });
+          }
+        })
+        .catch((error) => {
+          console.error(error);
+        });
+      this.$nextTick(() => {
+        this.approvalConfigDialog = true;
+      });
+    },
+    //纭瀹℃壒
+    confirmApproval() {},
+    //涓�閿鎵规寜閽�
+    oneClickApproval() {
+      if (this.mutiList.length == 0) {
+        this.$message.error("璇烽�夋嫨瑕佸鎵圭殑鎶ュ憡");
+        return;
+      }
+      //鎵ц瀹℃壒
+      if (!this.progressData.hasProgress) {
+        //鏈鎵圭殑鎶ュ憡
+        let unApprovalList = this.mutiList.filter(
+          (ele) => ele.isExamine == -9 || ele.isRatify == -9
+        );
+        let entity = this.entity;
+        //鏍规嵁鏌ヨ鏉′欢杩囨护宸查�夋嫨鐨勬暟鎹�
+        let ids = unApprovalList
+          .filter((f) =>
+            entity.isExamine != null && entity.isExamine !== ""
+              ? f.isExamine === entity.isExamine
+              : true
+          )
+          .filter((f) =>
+            entity.isRatify != null && entity.isRatify !== ""
+              ? f.isRatify === entity.isRatify
+              : true
+          )
+          .filter((f) =>
+            entity.isUpload != null && entity.isUpload !== ""
+              ? f.isUpload === entity.isUpload
+              : true
+          )
+          .filter((f) =>
+            entity.code != null && entity.code !== ""
+              ? f.code.indexOf(entity.code) >= 0
+              : true
+          )
+          .filter((f) =>
+            entity.state != null && entity.state !== ""
+              ? f.state === entity.state
+              : true
+          )
+          .map((ele) => ele.id);
+        batchApprovalReport({ ids: ids })
+          .then((res) => {
+            if (res.code != 201) {
+              //鏌ヨ瀹℃壒杩涘害
+              this.time = setInterval(() => {
+                this.getProgress();
+              }, 500);
+            }
+          })
+          .catch((error) => {
+            console.error(error);
+            clearInterval(this.time);
+          });
+      }
+      // this.getProgress();
+      this.$nextTick(() => {
+        this.oneClickApprovalDialog = true;
+      });
+    },
+    getProgress() {
+      getBatchApprovalProgress().then((res) => {
+        this.progressData = res.data;
+      });
+    },
+    // 瀹氫箟涓�涓嚱鏁版潵澶勭悊瑙嗗彛瀹藉害鍙樺寲
+    handleResize() {
+      //瑙嗗彛瀹藉害
+      let windowWidth = window.innerWidth;
+      //鍑忓幓宸﹁竟鑿滃崟鏍忓搴�92锛岄〉杈硅窛40,鍙宠竟鐨勬搷浣滄寜閽搴iewportWidth*33.33333%
+      let viewportWidth = windowWidth - 92 - 40;
+      //鎼滅储琛ㄥ崟鏈�澶у搴�
+      let formMaxWidth = viewportWidth - viewportWidth * 0.3333333;
+      //鍗曚釜鎼滅储妗嗗搴︿负230
+      this.maxNum = formMaxWidth / 230;
+    },
+    //鎵归噺涓婁紶鎶ュ憡
+    openBatchUploadDia() {
+      this.batchUploadDia = true;
+    },
+    // 鏌ョ湅鎶ュ憡
+    viewIssued(row) {
+      this.currentInfo = row;
+      console.log(`output->row`, row);
+      let fileName = row.urlS === null || row.urlS === "" ? row.url : row.urlS;
+      let fileType = "docx";
+      if (row.tempUrlPdf != null || row.tempUrlPdf === "") {
+        fileName = row.tempUrlPdf;
+        fileType = "pdf";
+      }
+      fileName = fileName.replace("/word/", "");
+      const userName = JSON.parse(localStorage.getItem("user")).name;
+      this.option = {
+        url: this.javaApi + "/word/" + fileName,
+        isEdit: false,
+        fileType: fileType,
+        title: fileName,
+        lang: "zh-CN",
+        isPrint: false,
+        user_id: 1,
+        user_name: userName,
+        editUrl:
+          this.javaApi + "/insReport/onlyOffice/save?fileName=" + fileName,
+      };
+      console.log(this.javaApi + "/word/" + fileName);
+      this.viewIssuedVisible = true;
+    },
+    handleChange(arr) {
+      this.mutiList = arr;
+    },
+    handleDowns() {
+      if (this.mutiList.length == 0) {
+        this.$message.error("璇烽�夋嫨鎶ュ憡");
+        return;
+      }
+      let entity = this.entity;
+      //鏍规嵁鏌ヨ鏉′欢杩囨护宸查�夋嫨鐨勬暟鎹�
+      let str = this.mutiList
+        .filter((f) =>
+          entity.isExamine != null && entity.isExamine !== ""
+            ? f.isExamine === entity.isExamine
+            : true
+        )
+        .filter((f) =>
+          entity.isRatify != null && entity.isRatify !== ""
+            ? f.isRatify === entity.isRatify
+            : true
+        )
+        .filter((f) =>
+          entity.isUpload != null && entity.isUpload !== ""
+            ? f.isUpload === entity.isUpload
+            : true
+        )
+        .filter((f) =>
+          entity.code != null && entity.code !== ""
+            ? f.code.indexOf(entity.code) >= 0
+            : true
+        )
+        .filter((f) =>
+          entity.state != null && entity.state !== ""
+            ? f.state === entity.state
+            : true
+        )
+        .map((m) => m.id)
+        .join(",");
+      if (str === "" || str == null) {
+        this.$message.error("娌℃湁绗﹀悎鏉′欢鐨勬暟鎹�!");
+        return;
+      }
+      this.outLoading = true;
+      downAll({ ids: str }).then((res) => {
+        this.outLoading = false;
+        this.$message.success("瀵煎嚭鎴愬姛");
+        // const blob = new Blob([res],{ type: 'application/octet-stream' });
+        // const url = URL.createObjectURL(blob);
+        // const link = document.createElement('a');
+        // link.href = url;
+        // link.download = '鎶ュ憡.zip';
+        // link.click();
+        const link = document.createElement("a");
+        link.href = this.javaApi + res.message;
+        link.target = "_blank";
+        document.body.appendChild(link);
+        link.click();
+        //涓嬭浇瀹屾垚锛岄噸缃〃鏍�
+        this.$nextTick(() => {
+          this.refresh();
+        });
+      });
+    },
+    uploadExceed(file, fileList) {
+      this.$message.error("鍚屾椂涓婁紶鏂囦欢鏁扮洰鏈�澶т负100锛岃閲嶈瘯");
+    },
+    submitUpload() {
+      this.$refs.upload.submit();
+    },
+    beforeUpload(file) {
+      const docxType = [
+        "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
+        "application/msword",
+      ];
+      if (!docxType.includes(file.type)) {
+        this.$message.error("鍙兘涓婁紶绫诲瀷涓�.doc/.docx鐨勬枃浠�");
+        return false;
+      }
+      const maxSize = 10 * 1024 * 1024; //鍗曚釜鏂囦欢鏈�澶т笂浼犲ぇ灏�10MB
+      if (file.size > maxSize) {
+        this.$message.error("鏂囦欢" + file.name + "澶у皬瓒呰繃10MB");
+        return false;
+      }
+      return true;
+      // const isZip = file.type === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' || file.name.endsWith('.zip');
+      // if (!isZip) {
+      //   this.$message.error('涓婁紶鏂囦欢鍙兘鏄� ZIP 鏍煎紡!');
+      // }
+      // if(isZip){
+      //   this.inLoading = true;
+      // }
+      // return isZip;
+    },
+    handleSuccess(response) {
+      this.inLoading = false;
+      if (response.code == 200) {
+        this.$message.success("瀵煎叆鎴愬姛");
+        this.refreshTable();
+        this.$refs.upload.clearFiles();
+        this.fileList = [];
+      } else {
+        this.$message.error(response.message);
+      }
+    },
+    onError(err, file, fileList, type) {
+      this.$message.error("涓婁紶澶辫触");
+      this.$refs.upload.clearFiles();
+      this.fileList = [];
+    },
+    refreshTable(e) {
+      if (!this.entity.createTimeRange) {
+        this.entity.createTimeRange = [];
+      }
+      this.getList();
+      this.getReportCountInfo();
+    },
+    getReportCountInfo() {
+      if (!this.entity.createTimeRange) {
+        this.entity.createTimeRange = [];
+      }
+      console.log("entity", this.entity);
+      getReportCountInfo(this.entity)
+        .then((res) => {
+          this.unSubmitCount = res.data.unSubmitCount;
+          this.unRatifyCount = res.data.unRatifyCount;
+          this.unExamineCount = res.data.unExamineCount;
+        })
+        .catch((error) => {
+          console.error(error);
+        });
+    },
+    refresh() {
+      this.entity = this.HaveJson(this.entityCopy);
+      this.upIndex++;
+      this.mutiList = [];
+      this.getReportCountInfo();
+    },
+    async handleWeave(row) {
+      let fileName = row.urlS === null || row.urlS === "" ? row.url : row.urlS;
+      fileName = fileName.replace("/word/", "");
+      const userName = this.$store.state.user.name;
+      //鍙傝�僾abOnlyOffice缁勪欢鍙傛暟閰嶇疆
+      const { href } = this.$router.resolve({
+        path: `/wordEdit`,
+        query: {
+          url: this.javaApi + "/word/" + fileName,
+          isEdit: true,
+          fileType: "docx",
+          title: fileName,
+          lang: "zh-CN",
+          isPrint: true,
+          user_id: 1,
+          user_name: userName,
+          editUrl:
+            this.javaApi + "/insReport/onlyOffice/save?fileName=" + fileName,
+        },
+      });
+      window.open(href, "_blank");
+    },
+    confirmClaim() {
+      // console.log(this.$refs.Word.getValue())
+    },
+    async selectAllByOne(row) {
+      const userName = JSON.parse(localStorage.getItem("user")).name;
+      //鍙傝�僾abOnlyOffice缁勪欢鍙傛暟閰嶇疆
+      const { href } = this.$router.resolve({
+        path: `/wordEdit`,
+        query: {
+          url: this.javaApi + "/word/" + row.entrustCode + ".docx",
+          isEdit: "false",
+          fileType: "docx",
+          title: row.entrustCode + ".docx",
+          lang: "zh-CN",
+          isPrint: true,
+          user_id: 1,
+          user_name: userName,
+        },
+      });
+      window.open(href, "_blank");
+      console.log(`output->row`, row);
+    },
+    download(row) {
+      getReportInfo({ id: row.id, type: 1,suffix:'.docx' }).then((response) => {
+        if (response.data && response.data.contentType) {
+          downLoad({ id: row.id, type: 1, code: row.code,suffix: '.docx' })
+            .then((res) => {
+              // 鑾峰彇鏂囦欢鍚�
+              const blob = new Blob([res], { type: response.data.contentType });
+              const url = URL.createObjectURL(blob);
+              let link = document.createElement("a");
+              link.href = url;
+              link.download = row.code;
+              document.body.appendChild(link);
+              link.click();
+              document.body.removeChild(link);
+              URL.revokeObjectURL(url);
+            })
+            .catch((error) => {
+              this.$message.error(error);
+            });
+        } else {
+          this.$message.error("鏈壘鍒版枃浠�");
+        }
+      });
+    },
+    // 杩樺師鎿嶄綔
+    handleRestore(row) {
+      this.$confirm("鏄惁杩樺師褰撳墠鎶ュ憡?", "杩樺師", {
+        confirmButtonText: "杩樺師",
+        cancelButtonText: "鍙栨秷",
+        type: "warning",
+      })
+        .then(() => {
+          upReportUrl({ id: row.id,type:1 }).then((res) => {
+            if (res.code === 200) {
+              this.$message.success("鎿嶄綔鎴愬姛");
+              this.refreshTable("page");
+            }
+          });
+        })
+        .catch({}());
+    },
+    handleIssued(row) {
+      this.currentInfo = row;
+      let fileName = row.urlS === null || row.urlS === "" ? row.url : row.urlS;
+      fileName = fileName.replace("/word/", "");
+      const userName = JSON.parse(localStorage.getItem("user")).name;
+      this.option = {
+        url: this.javaApi + "/word/" + fileName,
+        isEdit: false,
+        fileType: "docx",
+        title: fileName,
+        lang: "zh-CN",
+        isPrint: false,
+        user_id: 1,
+        user_name: userName,
+        editUrl:
+          this.javaApi + "/insReport/onlyOffice/save?fileName=" + fileName,
+      };
+      this.issuedVisible = true;
+    },
+    // 瀹℃牳閫氳繃
+    subIssued() {
+      this.loadingIssued = true;
+      examineReport({ id: this.currentInfo.id, isExamine: 1 })
+        .then((res) => {
+          this.loadingIssued = false;
+          if (res.code === 201) {
+            return;
+          }
+          this.$message.success("鎻愪氦鎴愬姛");
+          this.refreshTable("page");
+          this.currentInfo = null;
+          this.issuedVisible = false;
+        })
+        .catch((e) => {
+          this.$message.error("鎻愪氦澶辫触");
+          this.loadingIssued = false;
+        });
+    },
+    handleApprove(row) {
+      this.currentInfo = row;
+      let fileName = row.urlS === null || row.urlS === "" ? row.url : row.urlS;
+      fileName = fileName.replace("/word/", "");
+      const userName = JSON.parse(localStorage.getItem("user")).name;
+      this.option = {
+        url: this.javaApi + "/word/" + fileName,
+        isEdit: false,
+        fileType: "docx",
+        title: fileName,
+        lang: "zh-CN",
+        isPrint: false,
+        user_id: 1,
+        user_name: userName,
+        editUrl:
+          this.javaApi + "/insReport/onlyOffice/save?fileName=" + fileName,
+      };
+      this.approveVisible = true;
+    },
+    // 鎵瑰噯閫氳繃
+    subApprove() {
+      this.loadingApprove = true;
+      ratifyReport({ id: this.currentInfo.id, isRatify: 1 }).then((res) => {
+        this.loadingApprove = false;
+        if (res.code == 201) {
+          this.$message.error("鎵瑰噯澶辫触");
+          return;
+        }
+        this.$message.success("宸叉壒鍑�");
+        this.refreshTable("page");
+        this.currentInfo = null;
+        this.approveVisible = false;
+      });
+    },
+    // 鎻愪氦鎿嶄綔
+    handleSubmit(row) {
+      this.$confirm("鏄惁鎻愪氦褰撳墠鎶ュ憡?", "鎻愪氦", {
+        confirmButtonText: "鎻愪氦",
+        cancelButtonText: "鍙栨秷",
+        type: "warning",
+      })
+        .then(() => {
+          writeReport({ id: row.id })
+            .then((res) => {
+              if (res.code === 201) {
+                return;
+              }
+              this.$message.success("鎻愪氦鎴愬姛");
+              this.refreshTable("page");
+            })
+            .catch((e) => {
+              this.$message.error("鎻愪氦澶辫触");
+            });
+        })
+        .catch(() => {});
+    },
+    // 瀹℃牳涓嶉�氳繃鍘熷洜鎻愪氦
+    handleIssuedReason() {
+      if (!this.reason) {
+        return this.$message.error("璇疯緭鍏ュ師鍥�");
+      }
+      this.loadingIssuedReason = true;
+      examineReport({
+        id: this.currentInfo.id,
+        isExamine: 0,
+        examineTell: this.reason,
+      })
+        .then((res) => {
+          this.loadingIssuedReason = false;
+          if (res.code === 201) {
+            return;
+          }
+          this.$message.success("鎿嶄綔鎴愬姛");
+          this.refreshTable("page");
+          this.currentInfo = null;
+          this.reason = "";
+          this.issuedVisible = false;
+          this.issuedReasonVisible = false;
+        })
+        .catch((e) => {
+          this.$message.error("鎿嶄綔澶辫触");
+          this.loadingIssuedReason = false;
+        });
+    },
+    // 涓嶆壒鍑嗗師鍥犳彁浜�
+    handleApproveReason() {
+      if (!this.reason) {
+        return this.$message.error("璇疯緭鍏ュ師鍥�");
+      }
+      this.loadingApproveReason = true;
+      examineReport({
+        id: this.currentInfo.id,
+        isRatify: 0,
+        ratifyTell: this.reason,
+      })
+        .then((res) => {
+          this.loadingApproveReason = false;
+          if (res.code === 201) {
+            return;
+          }
+          this.$message.success("鎿嶄綔鎴愬姛");
+          this.refreshTable("page");
+          this.currentInfo = null;
+          this.reason = "";
+          this.issuedVisible = false;
+          this.issuedReasonVisible = false;
+        })
+        .catch((e) => {
+          this.$message.error("鎿嶄綔澶辫触");
+          this.loadingIssuedReason = false;
+        });
+    },
+    handleClose() {
+      this.withdrawDialogVisible = false;
+      this.laboratory = [];
+    },
+    getStyle() {
+      return "height: calc(100% - " + (this.more ? "94" : "44") + "px)";
+    },
+  },
+};
+</script>
diff --git a/src/views/business/reportPreparation/onlyoffice.vue b/src/views/business/reportPreparation/onlyoffice.vue
new file mode 100644
index 0000000..c9a6e33
--- /dev/null
+++ b/src/views/business/reportPreparation/onlyoffice.vue
@@ -0,0 +1,207 @@
+<!--onlyoffice 缂栬緫鍣�-->
+<template>
+    <div id="vabOnlyOffice"></div>
+  </template>
+  
+  <script>
+  export default {
+    name: "VabOnlyOffice",
+    props: ['options'],
+    data() {
+      return {
+        doctype: "",
+        docEditor: null,
+        //鍙傝�僾abOnlyOffice缁勪欢鍙傛暟閰嶇疆
+        option: {
+          url: "",
+          isEdit: false,
+          fileType: "",
+          title: "",
+          lang: "zh-CN",
+          isPrint: true,
+          user: {},
+          editUrl: ""
+        }
+      };
+    },
+    created() {
+      if(this.options){
+        const option = this.options
+        this.option.url = option.url
+        this.option.isEdit = option.isEdit === "true" ? true : false
+        this.option.fileType = option.fileType
+        this.option.title = option.title
+        this.option.lang = option.lang
+        this.option.isPrint = option.isPrint
+        this.option.user.id = option.user_id
+        this.option.user.name = option.user_name
+        this.option.editUrl = option.editUrl
+      }else{
+        const option = this.$route.query
+        this.option.url = option.url
+        this.option.isEdit = option.isEdit === "true" ? true : false
+        this.option.fileType = option.fileType
+        this.option.title = option.title
+        this.option.lang = option.lang
+        this.option.isPrint = option.isPrint
+        this.option.user.id = option.user_id
+        this.option.user.name = option.user_name
+        this.option.editUrl = option.editUrl
+      }
+    },
+    beforeDestroy() {
+      if (this.docEditor !== null) {
+        this.docEditor.destroyEditor();
+        this.docEditor = null;
+      }
+    },
+    watch: {
+      option: {
+        handler: function(n) {
+          this.setEditor(n);
+          this.doctype = this.getFileType(n.fileType);
+        },
+        deep: true
+      }
+    },
+    mounted() {
+      if (this.option.url) {
+        this.setEditor(this.option);
+      }
+    },
+    methods: {
+      async setEditor(option) {
+        if (this.docEditor !== null) {
+          this.docEditor.destroyEditor();
+          this.docEditor = null;
+        }
+        this.doctype = this.getFileType(option.fileType);
+        let config = {
+          document: {
+            //鍚庣紑
+            fileType: option.fileType,
+            key: option.key || "",
+            title: option.title,
+            permissions: {
+              edit: option.isEdit, //鏄惁鍙互缂栬緫: 鍙兘鏌ョ湅锛屼紶false
+              print: option.isPrint,
+              download: false
+              // "fillForms": true,//鏄惁鍙互濉啓琛ㄦ牸锛屽鏋滃皢mode鍙傛暟璁剧疆涓篹dit锛屽垯濉啓琛ㄥ崟浠呭鏂囨。缂栬緫鍣ㄥ彲鐢ㄣ�� 榛樿鍊间笌edit鎴杛eview鍙傛暟鐨勫�间竴鑷淬��
+              // "review": true //璺熻釜鍙樺寲
+            },
+            url: option.url
+          },
+          documentType: this.doctype,
+          editorConfig: {
+            callbackUrl: option.editUrl, //"缂栬緫word鍚庝繚瀛樻椂鍥炶皟鐨勫湴鍧�锛岃繖涓猘pi闇�瑕佽嚜宸卞啓浜嗭紝灏嗙紪杈戝悗鐨勬枃浠堕�氳繃杩欎釜api淇濆瓨鍒拌嚜宸辨兂瑕佺殑浣嶇疆
+            lang: option.lang, //璇█璁剧疆
+            //瀹氬埗
+            customization: {
+              autosave: true, //鏄惁鑷姩淇濆瓨
+              chat: true,
+              comments: false,
+              help: false,
+              "hideRightMenu": false,//瀹氫箟鍦ㄧ涓�娆″姞杞芥椂鏄樉绀鸿繕鏄殣钘忓彸渚ц彍鍗曘�� 榛樿鍊间负false
+              //鏄惁鏄剧ず鎻掍欢
+              plugins: false
+            },
+            user: {
+              id: option.user.id,
+              name: option.user.name
+            },
+            mode: option.model ? option.model : "edit"
+          },
+          width: "100%",
+          height: "100%",
+          token: option.token || ""
+        };
+  
+        // eslint-disable-next-line no-undef,no-unused-vars
+        this.docEditor = new DocsAPI.DocEditor("vabOnlyOffice", config);
+      },
+      getFileType(fileType) {
+        let docType = "";
+        let fileTypesDoc = [
+          "doc",
+          "docm",
+          "docx",
+          "dot",
+          "dotm",
+          "dotx",
+          "epub",
+          "fodt",
+          "htm",
+          "html",
+          "mht",
+          "odt",
+          "ott",
+          "pdf",
+          "rtf",
+          "txt",
+          "djvu",
+          "xps"
+        ];
+        let fileTypesCsv = [
+          "csv",
+          "fods",
+          "ods",
+          "ots",
+          "xls",
+          "xlsm",
+          "xlsx",
+          "xlt",
+          "xltm",
+          "xltx"
+        ];
+        let fileTypesPPt = [
+          "fodp",
+          "odp",
+          "otp",
+          "pot",
+          "potm",
+          "potx",
+          "pps",
+          "ppsm",
+          "ppsx",
+          "ppt",
+          "pptm",
+          "pptx"
+        ];
+        if (fileTypesDoc.includes(fileType)) {
+          docType = "text";
+        }
+        if (fileTypesCsv.includes(fileType)) {
+          docType = "spreadsheet";
+        }
+        if (fileTypesPPt.includes(fileType)) {
+          docType = "presentation";
+        }
+        return docType;
+      }
+    }
+  };
+  </script>
+  
+  <style>
+  html,
+  body {
+    height: 100%;
+  }
+  #app {
+    font-family: Avenir, Helvetica, Arial, sans-serif;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+    text-align: center;
+    color: #2c3e50;
+    height: 100%;
+  }
+  .qualityManual-container {
+    padding: 0 !important;
+    height: 100%;
+  }
+  .qualityManual-container-office {
+    width: 100%;
+    height: calc(100% - 55px);
+  }
+  </style>
+  
\ No newline at end of file

--
Gitblit v1.9.3