From 11af23e0c7976eed1211ba2ca0beae3a12e19310 Mon Sep 17 00:00:00 2001
From: lxp <1928192722@qq.com>
Date: 星期三, 12 三月 2025 15:37:47 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev

---
 cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceMetricsCopy.java                          |   73 
 cnas-require/src/main/java/com/ruoyi/requier/service/impl/DeviceMetricRecordServiceImpl.java      |   20 
 basic-server/src/main/resources/mapper/StandardProductListMapper.xml                              |    4 
 basic-server/src/main/java/com/ruoyi/basic/service/ProductService.java                            |    2 
 cnas-require/src/main/java/com/ruoyi/requier/dto/DeviceMetricRecordDto.java                       |   13 
 cnas-require/src/main/java/com/ruoyi/requier/controller/InstructionController.java                |  102 
 cnas-require/src/main/java/com/ruoyi/requier/service/IncidentAcceptanceCheckService.java          |    7 
 inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java                 |   35 
 cnas-require/src/main/java/com/ruoyi/requier/service/InstructionService.java                      |   22 
 cnas-require/src/main/java/com/ruoyi/requier/dto/BDto.java                                        |   14 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsUnPassServiceImpl.java             |   34 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/DepartmentLimsMapper.java                      |    2 
 cnas-require/src/main/java/com/ruoyi/requier/dto/DeviceDto.java                                   |   43 
 ruoyi-system/src/main/java/com/ruoyi/system/service/UserService.java                              |    4 
 cnas-require/src/main/resources/mapper/IncidentInstallMapper.xml                                  |   14 
 cnas-require/src/main/java/com/ruoyi/requier/mapper/InformationNotificationMapper.java            |   20 
 inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderService.java                       |    3 
 cnas-require/src/main/java/com/ruoyi/requier/handler/FiberConfigReportHandler.java                |  617 ++
 cnas-require/src/main/java/com/ruoyi/requier/mapper/IncidentReportMapper.java                     |   28 
 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPasswordService.java             |    2 
 cnas-require/src/main/java/com/ruoyi/requier/controller/IncidentReportController.java             |   73 
 cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceMetricMapper.java                       |    9 
 cnas-require/src/main/java/com/ruoyi/requier/service/impl/QrShowServiceImpl.java                  |  269 
 cnas-require/src/main/java/com/ruoyi/requier/service/IncidentInstallService.java                  |    7 
 cnas-require/src/main/java/com/ruoyi/requier/excel/IncidentReportExport.java                      |   31 
 cnas-require/src/main/resources/mapper/ReservationMapper.xml                                      |   40 
 cnas-require/src/main/resources/mapper/IncidentFileMapper.xml                                     |   13 
 cnas-require/src/main/java/com/ruoyi/requier/service/DeviceService.java                           |   65 
 basic-server/src/main/java/com/ruoyi/basic/mapper/ProductMapper.java                              |    2 
 cnas-require/src/main/java/com/ruoyi/requier/service/impl/DataConfigServiceImpl.java              |   66 
 cnas-require/src/main/java/com/ruoyi/requier/mapper/OperationInstructionMapper.java               |   20 
 cnas-require/src/main/java/com/ruoyi/requier/service/impl/DeviceServiceImpl.java                  | 1115 +++
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoMapper.java                |    3 
 cnas-require/src/main/java/com/ruoyi/requier/mapper/ReservationMapper.java                        |   23 
 cnas-require/src/main/java/com/ruoyi/requier/pojo/PkMaster.java                                   |   61 
 cnas-require/src/main/java/com/ruoyi/requier/service/impl/IncidentAcceptanceCheckServiceImpl.java |   11 
 cnas-require/src/main/java/com/ruoyi/requier/service/IncidentReportService.java                   |   33 
 cnas-require/src/main/java/com/ruoyi/requier/service/impl/InsOrderPlanServiceImpl.java            | 2784 +++++++++
 cnas-require/src/main/resources/mapper/IncidentSparePartsMapper.xml                               |   14 
 cnas-require/src/main/resources/mapper/PkSlaveMapper.xml                                          |   28 
 cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceMetricRecord.java                         |  115 
 cnas-require/src/main/java/com/ruoyi/requier/mapper/PkMasterMapper.java                           |   16 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisePlanMapper.java            |    3 
 cnas-require/src/main/java/com/ruoyi/requier/service/impl/DeviceMetricServiceImpl.java            |   11 
 cnas-require/src/main/java/com/ruoyi/requier/controller/DeviceMetricController.java               |   35 
 cnas-require/src/main/java/com/ruoyi/requier/service/IncidentFileService.java                     |    7 
 cnas-require/src/main/java/com/ruoyi/requier/pojo/PkSlave.java                                    |   75 
 cnas-require/src/main/resources/mapper/DeviceMetricRecordMapper.xml                               |   22 
 pom.xml                                                                                           |    2 
 ruoyi-framework/src/main/java/com/ruoyi/framework/util/MyUtil.java                                |  119 
 cnas-require/src/main/java/com/ruoyi/requier/dto/DeviceConfigDtoPage.java                         |   70 
 cnas-require/src/main/java/com/ruoyi/requier/dto/DeviceMaintenanceExport.java                     |   45 
 basic-server/src/main/java/com/ruoyi/basic/mapper/StandardTreeMapper.java                         |    2 
 cnas-require/src/main/java/com/ruoyi/requier/handler/ThermalCycleReportHandler.java               |  599 ++
 cnas-require/src/main/java/com/ruoyi/requier/pojo/Document.java                                   |   89 
 cnas-require/src/main/resources/mapper/IncidentReportMapper.xml                                   |  114 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java              |   53 
 cnas-require/src/main/java/com/ruoyi/requier/service/impl/ReservationServiceImpl.java             |  110 
 cnas-require/src/main/resources/mapper/DeviceMapper.xml                                           |  184 
 cnas-require/src/main/java/com/ruoyi/requier/dto/ReservationDto.java                              |   10 
 cnas-require/src/main/java/com/ruoyi/requier/mapper/InstructionMapper.java                        |   19 
 cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceFaultMapper.java                        |    9 
 cnas-require/src/main/java/com/ruoyi/requier/controller/DeviceController.java                     |  261 
 cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java        |    2 
 cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceMetric.java                               |   29 
 cnas-require/src/main/java/com/ruoyi/requier/mapper/IncidentAcceptanceCheckMapper.java            |   17 
 cnas-require/src/main/java/com/ruoyi/requier/service/DeviceMetricsCopyService.java                |   16 
 cnas-require/src/main/java/com/ruoyi/requier/pojo/Reservation.java                                |   84 
 cnas-require/src/main/java/com/ruoyi/requier/service/IDeviceMetricService.java                    |    7 
 cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceMetricRecordMapper.java                 |   16 
 cnas-require/src/main/java/com/ruoyi/requier/handler/PiperConfigReportHandler.java                |  388 +
 cnas-require/src/main/resources/mapper/OperationInstructionMapper.xml                             |   26 
 cnas-require/src/main/resources/mapper/InformationNotificationMapper.xml                          |   16 
 cnas-require/src/main/java/com/ruoyi/requier/dto/DeviceFaultOneDto.java                           |   17 
 cnas-require/src/main/java/com/ruoyi/requier/service/DeviceFaultService.java                      |   10 
 cnas-require/src/main/java/com/ruoyi/requier/service/impl/PkMasterServiceImpl.java                |  809 ++
 cnas-require/src/main/java/com/ruoyi/requier/handler/TemperatureTestReportHandler.java            |  367 +
 cnas-require/src/main/resources/mapper/DeviceMaintenanceMapper.xml                                |   22 
 cnas-require/src/main/java/com/ruoyi/requier/service/impl/OperationInstructionServiceImpl.java    |   27 
 cnas-require/src/main/resources/mapper/DataConfigMapper.xml                                       |   48 
 basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardTreeServiceImpl.java              |   12 
 cnas-require/src/main/resources/mapper/IncidentAcceptanceCheckMapper.xml                          |   16 
 cnas-require/src/main/java/com/ruoyi/requier/service/impl/IncidentReportServiceImpl.java          |  116 
 cnas-require/src/main/java/com/ruoyi/requier/service/DocumentService.java                         |    7 
 cnas-require/src/main/java/com/ruoyi/requier/service/impl/DeviceFaultServiceImpl.java             |  107 
 cnas-require/src/main/java/com/ruoyi/requier/pojo/InformationNotification.java                    |   69 
 cnas-require/src/main/java/com/ruoyi/requier/service/QrShowService.java                           |    9 
 cnas-require/src/main/java/com/ruoyi/requier/pojo/IncidentSpareParts.java                         |   44 
 cnas-require/pom.xml                                                                              |    5 
 ruoyi-framework/src/main/java/com/ruoyi/framework/util/RedisUtil.java                             |  631 ++
 cnas-require/src/main/java/com/ruoyi/requier/mapper/IncidentSparePartsMapper.java                 |   17 
 cnas-require/src/main/java/com/ruoyi/requier/pojo/IncidentInstall.java                            |   44 
 cnas-require/src/main/java/com/ruoyi/requier/pojo/OperationInstruction.java                       |   92 
 cnas-require/src/main/java/com/ruoyi/requier/handler/FiberOpticConnectorLossReportHandler.java    |  210 
 cnas-require/src/main/java/com/ruoyi/requier/service/DeviceMetricRecordService.java               |   16 
 cnas-require/src/main/java/com/ruoyi/requier/vo/OperationInstructionVo.java                       |   17 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java                 |    4 
 ruoyi-common/src/main/java/com/ruoyi/common/constant/ExchangeConstants.java                       |    7 
 cnas-require/src/main/java/com/ruoyi/requier/service/InformationNotificationService.java          |   32 
 cnas-require/src/main/java/com/ruoyi/requier/mapper/PkSlaveMapper.java                            |   20 
 cnas-require/src/main/java/com/ruoyi/requier/service/impl/InsReportServiceImpl.java               |  942 +++
 cnas-require/src/main/java/com/ruoyi/requier/handler/FiberOpticRibbonReportHandler.java           |  734 ++
 cnas-require/src/main/resources/mapper/DeviceMetricsCopyMapper.xml                                |   19 
 cnas-require/src/main/resources/mapper/PkMasterMapper.xml                                         |   19 
 inspect-server/src/main/java/com/ruoyi/inspect/comparater/CustomComparator.java                   |  100 
 inspect-server/src/main/java/com/ruoyi/inspect/service/InsUnPassService.java                      |   18 
 basic-server/src/main/resources/mapper/ProductMapper.xml                                          |    6 
 cnas-require/src/main/java/com/ruoyi/requier/service/ReservationService.java                      |   29 
 cnas-require/src/main/java/com/ruoyi/requier/service/DataConfigService.java                       |   23 
 cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceFault.java                                |   39 
 ruoyi-common/src/main/java/com/ruoyi/common/constant/RouterKeyConstants.java                      |   13 
 cnas-device/pom.xml                                                                               |   20 
 cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceMaintenance.java                          |   42 
 cnas-require/src/main/java/com/ruoyi/requier/dto/IncidentReportAddDto.java                        |   26 
 cnas-require/src/main/java/com/ruoyi/requier/handler/TemperatureCyclingReportHandler1.java        |  582 ++
 cnas-require/src/main/java/com/ruoyi/requier/pojo/IncidentAcceptanceCheck.java                    |   50 
 cnas-require/src/main/java/com/ruoyi/requier/service/impl/InstructionServiceImpl.java             |   66 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java                     |   11 
 cnas-require/src/main/java/com/ruoyi/requier/controller/ReservationController.java                |   74 
 cnas-require/src/main/java/com/ruoyi/requier/service/impl/DeviceMetricsCopyServiceImpl.java       |   20 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserServiceImpl.java                     |   23 
 ruoyi-system/src/main/resources/mapper/system/UserMapper.xml                                      |   46 
 cnas-require/src/main/java/com/ruoyi/requier/dto/OperationInstructionDto.java                     |   35 
 cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingMapper.java                 |    3 
 cnas-require/src/main/java/com/ruoyi/requier/pojo/IncidentReport.java                             |  142 
 cnas-require/src/main/java/com/ruoyi/requier/controller/DocumentController.java                   |   46 
 inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsSample.java                                |    6 
 cnas-require/src/main/java/com/ruoyi/requier/service/InsReportService.java                        |   56 
 cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceMapper.java                             |   43 
 cnas-require/src/main/java/com/ruoyi/requier/service/impl/IncidentSparePartsServiceImpl.java      |   11 
 basic-server/src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java                   |    5 
 cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceFaultOne.java                             |  125 
 cnas-require/src/main/java/com/ruoyi/requier/mapper/IncidentFileMapper.java                       |   17 
 cnas-require/src/main/java/com/ruoyi/requier/mapper/IncidentInstallMapper.java                    |   17 
 cnas-require/src/main/java/com/ruoyi/requier/pojo/IncidentFile.java                               |   40 
 cnas-require/src/main/java/com/ruoyi/requier/service/PkMasterService.java                         |   21 
 cnas-require/src/main/java/com/ruoyi/requier/dto/InformationNotificationDto.java                  |   11 
 cnas-require/src/main/java/com/ruoyi/requier/pojo/DataConfig.java                                 |   69 
 cnas-require/src/main/java/com/ruoyi/requier/dto/DataConfigDto.java                               |   39 
 inspect-server/src/main/java/com/ruoyi/inspect/service/InsBushingService.java                     |   21 
 cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceFaultOneMapper.java                     |   20 
 ruoyi-framework/src/main/java/com/ruoyi/framework/util/MatrixToImageWriter.java                   |   68 
 cnas-require/src/main/java/com/ruoyi/requier/service/IncidentSparePartsService.java               |    7 
 ruoyi-common/src/main/java/com/ruoyi/common/numgen/NumberGenerator.java                           |    1 
 cnas-require/src/main/java/com/ruoyi/requier/service/OperationInstructionService.java             |   20 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsBushingServiceImpl.java            |   80 
 cnas-require/src/main/java/com/ruoyi/requier/util/DataAcquisition.java                            |  792 ++
 cnas-require/src/main/java/com/ruoyi/requier/service/impl/DocumentServiceImpl.java                |   11 
 cnas-require/src/main/java/com/ruoyi/requier/handler/BasicReportHandler.java                      |  556 +
 cnas-require/src/main/java/com/ruoyi/requier/mapper/DataConfigMapper.java                         |   22 
 cnas-require/src/main/java/com/ruoyi/requier/pojo/Instruction.java                                |   64 
 cnas-require/src/main/java/com/ruoyi/requier/controller/DeviceMetricRecordController.java         |  134 
 cnas-require/src/main/java/com/ruoyi/requier/service/InsOrderPlanService.java                     |   78 
 basic-server/src/main/java/com/ruoyi/basic/mapper/StandardProductListMapper.java                  |    3 
 cnas-require/src/main/java/com/ruoyi/requier/dto/ADto.java                                        |   16 
 cnas-require/src/main/java/com/ruoyi/requier/pojo/Device.java                                     |  140 
 cnas-require/src/main/java/com/ruoyi/requier/service/impl/InformationNotificationServiceImpl.java |   95 
 cnas-require/src/main/java/com/ruoyi/requier/service/impl/IncidentFileServiceImpl.java            |   11 
 cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceMetricsCopyMapper.java                  |   16 
 cnas-require/src/main/java/com/ruoyi/requier/controller/DeviceFaultController.java                |   50 
 cnas-require/src/main/java/com/ruoyi/requier/dto/InstructionDto.java                              |   13 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserMapper.java                                |    4 
 cnas-require/src/main/java/com/ruoyi/requier/service/impl/IncidentInstallServiceImpl.java         |   11 
 inspect-server/src/main/java/com/ruoyi/inspect/controller/InsBushingController.java               |   35 
 cnas-require/src/main/resources/mapper/InstructionMapper.xml                                      |   27 
 inspect-server/src/main/java/com/ruoyi/inspect/dto/AddInsOrderDTO.java                            |   27 
 cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceMaintenanceMapper.java                  |   18 
 cnas-require/src/main/java/com/ruoyi/requier/mapper/DocumentDao.java                              |    9 
 cnas-require/src/main/resources/mapper/DeviceFaultOneMapper.xml                                   |   50 
 169 files changed, 16,973 insertions(+), 86 deletions(-)

diff --git a/basic-server/src/main/java/com/ruoyi/basic/mapper/ProductMapper.java b/basic-server/src/main/java/com/ruoyi/basic/mapper/ProductMapper.java
index 8fdbc4a..03f4375 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/mapper/ProductMapper.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/mapper/ProductMapper.java
@@ -17,6 +17,8 @@
 public interface ProductMapper extends BaseMapper<Product> {
 
     IPage<Product> selectProductListByObjectId(Page page, @Param("ew") QueryWrapper<ProductDTO1> ew, @Param("partNo") String partNo);
+
+    String getWordQrModel(Integer orderId);
 }
 
 
diff --git a/basic-server/src/main/java/com/ruoyi/basic/mapper/StandardProductListMapper.java b/basic-server/src/main/java/com/ruoyi/basic/mapper/StandardProductListMapper.java
index 2898c62..7311557 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/mapper/StandardProductListMapper.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/mapper/StandardProductListMapper.java
@@ -4,10 +4,10 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.ruoyi.basic.pojo.StandardProductList;
 import com.ruoyi.basic.vo.StandardProductVO;
+import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
-import java.util.Map;
 
 /**
 * @author Administrator
@@ -15,6 +15,7 @@
 * @createDate 2024-03-05 10:33:29
 * @Entity com.ruoyi.basic.pojo.StandardProductList
 */
+@Mapper
 public interface StandardProductListMapper extends BaseMapper<StandardProductList> {
 
     IPage<StandardProductList> standardProductListIPage(@Param("id") Integer id, @Param("tree") String tree, IPage<StandardProductList> page, @Param("laboratory") String laboratory, @Param("insItem") String insItem, @Param("insItems") String insItems);
diff --git a/basic-server/src/main/java/com/ruoyi/basic/mapper/StandardTreeMapper.java b/basic-server/src/main/java/com/ruoyi/basic/mapper/StandardTreeMapper.java
index ccb59a6..3718541 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/mapper/StandardTreeMapper.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/mapper/StandardTreeMapper.java
@@ -8,6 +8,7 @@
 import com.ruoyi.basic.pojo.StandardMethodList;
 import com.ruoyi.basic.pojo.StandardProductList;
 import com.ruoyi.basic.pojo.StandardTree;
+import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -18,6 +19,7 @@
  * @createDate 2024-03-01 15:06:44
  * @Entity com.ruoyi.basic.pojo.StandardTree
  */
+@Mapper
 public interface StandardTreeMapper extends BaseMapper<StandardTree> {
 
     List<FactoryDto> selectStandardTreeList();
diff --git a/basic-server/src/main/java/com/ruoyi/basic/service/ProductService.java b/basic-server/src/main/java/com/ruoyi/basic/service/ProductService.java
index 6fdc7c2..4afa8c8 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/service/ProductService.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/service/ProductService.java
@@ -25,4 +25,6 @@
     int delProduct(Integer id);
 
     void importPartExcel(List<StructureTestObjectData> list);
+
+    String getWordQrModel(Integer orderId);
 }
diff --git a/basic-server/src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java b/basic-server/src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java
index 217a86c..f6ec4d6 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java
@@ -178,4 +178,9 @@
             }
         });
     }
+
+    @Override
+    public String getWordQrModel(Integer orderId) {
+        return baseMapper.getWordQrModel(orderId);
+    }
 }
diff --git a/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardTreeServiceImpl.java b/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardTreeServiceImpl.java
index e0529ea..5394368 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardTreeServiceImpl.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/service/impl/StandardTreeServiceImpl.java
@@ -1,13 +1,8 @@
 package com.ruoyi.basic.service.impl;
 
-import cn.hutool.core.collection.CollUtil;
 import cn.hutool.poi.excel.ExcelUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.basic.dto.FactoryDto;
@@ -18,8 +13,9 @@
 import com.ruoyi.basic.pojo.StandardProductList;
 import com.ruoyi.basic.pojo.StandardTemplate;
 import com.ruoyi.basic.pojo.StandardTree;
-import com.ruoyi.basic.pojo.StructureTestObject;
-import com.ruoyi.basic.service.*;
+import com.ruoyi.basic.service.StandardMethodListService;
+import com.ruoyi.basic.service.StandardTemplateService;
+import com.ruoyi.basic.service.StandardTreeService;
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.framework.exception.ErrorException;
 import lombok.AllArgsConstructor;
@@ -60,7 +56,7 @@
         for (FactoryDto factoryDto : factoryDtos) {
             for (LaboratoryDto laboratoryDto : factoryDto.getChildren()) {
                 for (SampleTypeDto sampleTypeDto : laboratoryDto.getChildren()) {
-                    if (sampleTypeDto.getChildren().size() == 0) {
+                    if (sampleTypeDto.getChildren().isEmpty()) {
                         sampleTypeDto.setChildren(standardTreeMapper.getStandardTree3(sampleTypeDto.getValue()));
                     }
                 }
diff --git a/basic-server/src/main/resources/mapper/ProductMapper.xml b/basic-server/src/main/resources/mapper/ProductMapper.xml
index 78a1353..4b9c929 100644
--- a/basic-server/src/main/resources/mapper/ProductMapper.xml
+++ b/basic-server/src/main/resources/mapper/ProductMapper.xml
@@ -35,4 +35,10 @@
                 ${ew.customSqlSegment}
             </if>
     </select>
+
+    <select id="getWordQrModel" resultType="java.lang.String">
+        SELECT GROUP_CONCAT(DISTINCT isa.model) model
+        FROM ins_sample isa
+        where isa.ins_order_id = #{orderId}
+    </select>
 </mapper>
diff --git a/basic-server/src/main/resources/mapper/StandardProductListMapper.xml b/basic-server/src/main/resources/mapper/StandardProductListMapper.xml
index 7d06d0c..0a18129 100644
--- a/basic-server/src/main/resources/mapper/StandardProductListMapper.xml
+++ b/basic-server/src/main/resources/mapper/StandardProductListMapper.xml
@@ -75,7 +75,7 @@
         <if test="sample != null and sample != ''">
             and sample =#{sample}
         </if>
-            case when man_hour_group is NULL then 1
+        order by case when man_hour_group is NULL then 1
                       when man_hour_group ='' then 1  else 0 end,
                  CASE
                      WHEN man_hour_group REGEXP '^[0-9]' THEN CAST(man_hour_group AS UNSIGNED) -- 濡傛灉浠ユ暟瀛楀紑澶达紝鍒欐寜鐓ф暟瀛楀ぇ灏忔帓搴�
@@ -87,7 +87,7 @@
         where standard_method_list_id = #{standardMethodListId}
           and state =#{state}
           and tree =#{tree}
-        order by    case when man_hour_group is NULL then 1
+        order by case when man_hour_group is NULL then 1
                       when man_hour_group ='' then 1  else 0 end,
                  CASE
                      WHEN man_hour_group REGEXP '^[0-9]' THEN CAST(man_hour_group AS UNSIGNED) -- 濡傛灉浠ユ暟瀛楀紑澶达紝鍒欐寜鐓ф暟瀛楀ぇ灏忔帓搴�
diff --git a/cnas-device/pom.xml b/cnas-device/pom.xml
index ec0af39..d3aade0 100644
--- a/cnas-device/pom.xml
+++ b/cnas-device/pom.xml
@@ -11,17 +11,27 @@
 
     <artifactId>cnas-device</artifactId>
 
-    <properties>
-        <maven.compiler.source>8</maven.compiler.source>
-        <maven.compiler.target>8</maven.compiler.target>
-    </properties>
-
     <dependencies>
+
         <!--涓氬姟妯″潡-->
         <dependency>
             <groupId>com.ruoyi</groupId>
             <artifactId>inspect-server</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-system</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>ruoyi-framework</artifactId>
+        </dependency>
     </dependencies>
 
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+
 </project>
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java
index 015621a..34eee58 100644
--- a/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/controller/PersonBasicInfoController.java
@@ -63,7 +63,7 @@
 
     @ApiOperation(value = "浜哄憳鏄庣粏鍒嗛〉鏌ヨ")
     @GetMapping("basicInformationOfPersonnelSelectPage")
-    public Result<IPage<Map<String, Object>>> basicInformationOfPersonnelSelectPage(Page<List<PersonBasicInfoDetailsDto>> page, String name, Integer departmentId) {
+    public Result<IPage<Map<String, Object>>> basicInformationOfPersonnelSelectPage(Page page, String name, Integer departmentId) {
         return Result.success(personBasicInfoService.basicInformationOfPersonnelSelectPage(page, name, departmentId));
     }
 
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoMapper.java
index adb5fb7..aeff449 100644
--- a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoMapper.java
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonBasicInfoMapper.java
@@ -6,6 +6,7 @@
 import com.ruoyi.common.core.dto.DepartmentDto;
 import com.ruoyi.personnel.dto.PersonBasicInfoDto;
 import com.ruoyi.personnel.pojo.PersonBasicInfo;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
@@ -33,5 +34,5 @@
      * @param departmentId
      * @return
      */
-    IPage<Map<String, Object>> selectPersonBasecInfoAndUser(Page page, String name, Integer departmentId);
+    IPage<Map<String, Object>> selectPersonBasecInfoAndUser(Page page, @Param("name") String name, @Param("departmentId") Integer departmentId);
 }
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisePlanMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisePlanMapper.java
index 801e00a..50f5abc 100644
--- a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisePlanMapper.java
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonSupervisePlanMapper.java
@@ -5,6 +5,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.personnel.dto.PersonSupervisePlanDto;
 import com.ruoyi.personnel.pojo.PersonSupervisePlan;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -16,6 +17,6 @@
  */
 public interface PersonSupervisePlanMapper extends BaseMapper<PersonSupervisePlan> {
 
-    IPage<PersonSupervisePlanDto> pageByPerson(Page page, String organizationPerson,Integer departId);
+    IPage<PersonSupervisePlanDto> pageByPerson(Page page, @Param("organizationPerson") String organizationPerson, @Param("departId") Integer departId);
 
 }
diff --git a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingMapper.java b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingMapper.java
index 9563357..d2d238c 100644
--- a/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingMapper.java
+++ b/cnas-personnel/src/main/java/com/ruoyi/personnel/mapper/PersonTrainingMapper.java
@@ -5,6 +5,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.personnel.dto.PersonTrainingDto;
 import com.ruoyi.personnel.pojo.PersonTraining;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -16,5 +17,5 @@
  */
 public interface PersonTrainingMapper extends BaseMapper<PersonTraining> {
 
-    IPage<PersonTrainingDto> personTrainingSelect(Page page, String compilerName, Integer departLimsId);
+    IPage<PersonTrainingDto> personTrainingSelect(Page page, @Param("compilerName") String compilerName, @Param("departLimsId") Integer departLimsId);
 }
diff --git a/cnas-require/pom.xml b/cnas-require/pom.xml
index 32347b9..efe458d 100644
--- a/cnas-require/pom.xml
+++ b/cnas-require/pom.xml
@@ -34,6 +34,11 @@
             <groupId>com.ruoyi</groupId>
             <artifactId>inspect-server</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>cnas-process</artifactId>
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/controller/DeviceController.java b/cnas-require/src/main/java/com/ruoyi/requier/controller/DeviceController.java
new file mode 100644
index 0000000..4839fa0
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/controller/DeviceController.java
@@ -0,0 +1,261 @@
+package com.ruoyi.requier.controller;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.requier.dto.DataConfigDto;
+import com.ruoyi.requier.dto.DeviceDto;
+import com.ruoyi.requier.pojo.Device;
+import com.ruoyi.requier.pojo.PkMaster;
+import com.ruoyi.requier.service.DataConfigService;
+import com.ruoyi.requier.service.DeviceService;
+import com.ruoyi.requier.service.PkMasterService;
+import com.ruoyi.system.mapper.UserMapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 璁惧(DeviceController)琛ㄦ帶鍒跺眰
+ */
+@Api(tags = "璁惧")
+@RestController
+@RequestMapping("/deviceScope")
+public class DeviceController {
+
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private DeviceService deviceService;
+
+    @Value("${file.path}")
+    private String filePath;
+
+    @Autowired
+    private DataConfigService dataConfigService;
+
+    @Autowired
+    private PkMasterService pkMasterService;
+
+    /**
+     * 鑾峰彇浜哄憳淇℃伅
+     * @return
+     * @throws Exception
+     */
+    @GetMapping("/selectUserList")
+    public Result selectUserList() {
+        return  Result.success(deviceService.selectUserList());
+    }
+
+    /**
+     * 鏍规嵁departLimsId 鑾峰彇浜哄憳 (selectUserList鍓嶇璋冪敤鎺ュ彛澶 瀹规槗鎶ラ敊)
+     */
+    @GetMapping("/selectUserListByDepartLimsId")
+    public Result selectUserListByDepartLimsId(String departLimsId) {
+        return Result.success(deviceService.selectUserListByDepartLimsId(departLimsId));
+    }
+
+
+    @ApiOperation(value = "鏌ョ湅璁惧浜岀淮鐮佹寜閽�")
+    @GetMapping("/showDeviceQrCodeButton")
+    public void showDeviceQrCodeButton() { }
+
+    //璁惧宸ュ叿鏄庣粏
+    @ApiOperation(value = "鏌ヨ璁惧璇︽儏鍒楄〃")
+    @GetMapping("/selectDeviceParameter")
+    public Result selectDeviceParameter(Page page,DeviceDto deviceDto,Boolean laboratoryNameIsNull) {
+        return Result.success(deviceService.selectDeviceParameter(page, deviceDto, laboratoryNameIsNull));
+    }
+
+    @ApiOperation(value = "娣诲姞璁惧璇︽儏鍙傛暟")
+    @PostMapping("/addDeviceParameter")
+    public Result addDeviceParameter(@RequestBody Device itemParameter) {
+        return Result.success(deviceService.addDeviceParameter(itemParameter));
+    }
+
+    @ApiOperation(value = "鍒犻櫎璁惧璇︽儏鍙傛暟")
+    @DeleteMapping("/delDeviceParameter")
+    public Result<?> delDeviceParameter(Integer id) {
+        return Result.success(deviceService.delDeviceParameter(id));
+    }
+
+    @ApiOperation(value = "淇敼璁惧璇︽儏鍙傛暟")
+    @PostMapping("/upDeviceParameter")
+    public Result<?> upDeviceParameter(@RequestBody Device itemParameter) {
+        return Result.success(deviceService.upDeviceParameter(itemParameter));
+    }
+
+    @ApiOperation(value = "鏄惁鍏佽淇敼閲囬泦鍊�")
+    @DeleteMapping("/isItAllowedToModifyTheCollectedValues")
+    public Result<?> isItAllowedToModifyTheCollectedValues() {
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鑾峰彇璁惧鎬昏")
+    @GetMapping("/selectEquipmentOverview")
+    public Result selectEquipmentOverview() {
+        return Result.success(deviceService.selectEquipmentOverview());
+    }
+
+    @ApiOperation(value = "鑾峰彇琚巿鏉冧汉")
+    @GetMapping("/authorizedPerson")
+    public Result authorizedPerson() {
+        return Result.success(deviceService.authorizedPerson());
+    }
+
+    @ApiOperation(value = "鎼滅储")
+    @GetMapping("/search")
+    public Result search(Integer status, String deviceName, String specificationModel, String largeCategory) {
+        return Result.success(deviceService.search(status, deviceName, specificationModel, largeCategory));
+    }
+
+    //鍥剧墖涓婁紶
+    @ApiOperation(value = "璁惧鍥剧墖涓婁紶")
+    @PostMapping("/uploadFile")
+    public Result uploadFile(MultipartFile file) {
+
+        System.out.println(file);
+        String urlString;
+        String pathName;
+        String filename = file.getOriginalFilename();
+        try {
+            String path = filePath;
+            File realpath = new File(path);
+            if (!realpath.exists()) {
+                realpath.mkdirs();
+            }
+            pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMdd")) + "-" + file.getOriginalFilename();
+            urlString = realpath + "/" + pathName;
+            file.transferTo(new File(urlString));
+            HashMap<String, String> map = new HashMap<>();
+            map.put("name", filename);
+            map.put("url", pathName);
+            return Result.success(map);
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.err.println("鍥剧墖涓婁紶閿欒");
+            return null;
+        }
+    }
+
+    @ApiOperation(value = "鑾峰彇璁惧璐熻矗浜�")
+    @GetMapping("/selectDevicePrincipal")
+    public Result selectDevicePrincipal() {
+        return Result.success(deviceService.selectDevicePrincipal());
+    }
+
+    @ApiOperation(value = "閫氳繃椤圭洰鑾峰彇璁惧鍒楄〃")
+    @PostMapping("/selectDeviceByCategory")
+    public Result selectDeviceByCategory(String inspectionItem, String inspectionItemSubclass,String sonLaboratory) {
+        return Result.success(deviceService.selectDeviceByCategory(inspectionItem, inspectionItemSubclass,sonLaboratory));
+    }
+
+    @ApiOperation(value = "閫氳繃璁惧缂栧彿鑾峰彇璁惧鍒楄〃")
+    @GetMapping("/selectDeviceByCode")
+    public Result<DeviceDto> selectDeviceByCode(Integer id) {
+        return Result.success(deviceService.selectDeviceByCode(id));
+    }
+
+    /**
+     *
+     * @param request 鍙栬姹備腑鐨刬p
+     * @param id 妫�楠屾牱鍝� 涓婚敭id
+     * @param entrustCode 濮旀墭缂栧彿
+     * @param sampleCode 鏍峰搧缂栧彿
+     * @param fiberOpticRibbon 鍏夌氦甯︾紪鍙�
+     * @return
+     */
+    @ApiOperation("/鏁伴噰-鏁版嵁閲囬泦")
+    @GetMapping("/dataCollection")
+    public Result<?> dataAcquisition(HttpServletRequest request,
+                                     @RequestParam("id") Integer id,
+                                     @RequestParam("entrustCode") String entrustCode,
+                                     @RequestParam("sampleCode") String sampleCode,
+                                     @RequestParam(value = "fiberOpticRibbon", required = false) String fiberOpticRibbon) {
+        return deviceService.dataAcquisition(request, id, entrustCode, sampleCode, fiberOpticRibbon);
+    }
+
+    @ApiOperation(value = "鍒ゆ柇璇ヨ澶囨槸鍚﹀彲浠ユ暟閲�")
+    @GetMapping("/determineWhetherToCollectData")
+    public Result<?> determineWhetherToCollectData(@RequestParam("managementNumber") String managementNumber, HttpServletRequest request) {
+        return deviceService.determineWhetherToCollectData(managementNumber, request);
+    }
+
+    @ApiOperation(value = "缁存姢鏁伴噰閰嶇疆")
+    @PostMapping("/saveDataAcquisitionConfiguration")
+    public Result<?> saveDataAcquisitionConfiguration(@RequestParam(value = "deviceId") Integer deviceId, @RequestBody DataConfigDto dataConfigList) {
+        dataConfigService.saveDataAcquisitionConfiguration(deviceId, dataConfigList);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鏌ヨ鏁伴噰閰嶇疆")
+    @GetMapping("/queryDataAcquisitionConfiguration")
+    public Result<?> queryDataAcquisitionConfiguration(@RequestParam("deviceId") Integer deviceId,
+                                                       @RequestParam("isDevice") Boolean isDevice,
+                                                       @RequestParam(value = "inspectionItem", required = false) String inspectionItem,
+                                                       @RequestParam(value = "inspectionItemSubclass", required = false) String inspectionItemSubclass) {
+        return dataConfigService.queryDataAcquisitionConfiguration(deviceId, isDevice, inspectionItem, inspectionItemSubclass);
+    }
+
+    @ApiOperation(value = "鍒犻櫎鏁伴噰閰嶇疆")
+    @DeleteMapping("/deleteDataAcquisitionConfiguration")
+    public Result<?> deleteDataAcquisitionConfiguration(@RequestParam("ids") String ids) {
+        List<String> split = Arrays.asList(ids.split(","));
+        List<String> collect = split.stream().distinct().collect(Collectors.toList());
+        dataConfigService.removeBatchByIds(collect);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鑿滃崟")
+    @PostMapping("/menu")
+    public Result menu() {
+        return Result.success(deviceService.menu());
+    }
+
+
+    @ApiOperation(value = "娓╁害寰幆鏁伴噰")
+    @PostMapping("/temDataAcquisition")
+    public Result<?> temDataAcquisition(@RequestBody PkMaster pkMaster) {
+        return Result.success(pkMasterService.temDataAcquisition(pkMaster));
+    }
+
+    @ApiOperation(value = "宸︿晶璁惧鏍戝舰鏍�")
+    @GetMapping("/treeDevice")
+    public Result treeDevice(String deviceName) {
+        return Result.success(deviceService.treeDevice(deviceName));
+    }
+
+
+    @ApiOperation(value = "娓╁害寰幆鏁伴噰鎬讳綋")
+    @PostMapping("/temDataAcquisition2")
+    public Result<?> temDataAcquisition2(@RequestBody PkMaster pkMaster) {
+        return Result.success(pkMasterService.temDataAcquisition2(pkMaster));
+    }
+
+    @ApiOperation(value = "鍒楄〃缁熻瀵煎嚭")
+    @PostMapping("/export")
+    public void exportData(@RequestBody Map<String, Object> data, HttpServletResponse response) throws Exception {
+//        DeviceDto deviceDto = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), DeviceDto.class);
+//        deviceService.export(deviceDto,response);
+    }
+
+
+
+
+}
\ No newline at end of file
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/controller/DeviceFaultController.java b/cnas-require/src/main/java/com/ruoyi/requier/controller/DeviceFaultController.java
new file mode 100644
index 0000000..e9360ac
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/controller/DeviceFaultController.java
@@ -0,0 +1,50 @@
+package com.ruoyi.requier.controller;
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.requier.pojo.DeviceFault;
+import com.ruoyi.requier.service.DeviceFaultService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/deviceFaults")
+public class DeviceFaultController {
+
+    private final DeviceFaultService deviceFaultService;
+
+    @Autowired
+    public DeviceFaultController(DeviceFaultService deviceFaultService) {
+        this.deviceFaultService = deviceFaultService;
+    }
+
+    @GetMapping
+    public List<DeviceFault> getAllDeviceFaults() {
+        return deviceFaultService.list();
+    }
+
+    @PostMapping
+    public DeviceFault createDeviceFault(@RequestBody DeviceFault deviceFault) {
+        deviceFaultService.save(deviceFault);
+        return deviceFault;
+    }
+
+    @PutMapping("/{id}")
+    public DeviceFault updateDeviceFault(@PathVariable Integer id, @RequestBody DeviceFault deviceFault) {
+        deviceFault.setId(id);
+        deviceFaultService.updateById(deviceFault);
+        return deviceFault;
+    }
+
+    @DeleteMapping("/{id}")
+    public void deleteDeviceFault(@PathVariable Integer id) {
+        deviceFaultService.removeById(id);
+    }
+
+    @GetMapping("/device")
+    public Result<Map<String,Object>> getDeviceFaultsByDeviceId(Integer deviceId) {
+       return  Result.success(deviceFaultService.findByDeviceId(deviceId));
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/controller/DeviceMetricController.java b/cnas-require/src/main/java/com/ruoyi/requier/controller/DeviceMetricController.java
new file mode 100644
index 0000000..32fc8df
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/controller/DeviceMetricController.java
@@ -0,0 +1,35 @@
+package com.ruoyi.requier.controller;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.requier.pojo.DeviceMetric;
+import com.ruoyi.requier.service.IDeviceMetricService;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/deviceMetrics")
+public class DeviceMetricController {
+
+    @Autowired
+    private IDeviceMetricService deviceMetricService;
+
+    @PostMapping("/saveOrUpdateDeviceMetric")
+    public Result create(@RequestBody DeviceMetric deviceMetric) {
+        return Result.success(deviceMetricService.saveOrUpdate(deviceMetric));
+    }
+
+    @GetMapping("/selectDeviceMetric")
+    public Result read(@RequestParam("deviceId") Integer deviceId, @RequestParam("type") String type) {
+        return Result.success(deviceMetricService.list(Wrappers.<DeviceMetric>lambdaQuery()
+                .eq(DeviceMetric::getDeviceId,deviceId)
+                .eq(DeviceMetric::getType,type)));
+    }
+
+    @DeleteMapping("/deleteDeviceMetrics")
+    public Result delete(@RequestParam("id") Integer id) {
+      return   Result.success(deviceMetricService.removeById(id));
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/controller/DeviceMetricRecordController.java b/cnas-require/src/main/java/com/ruoyi/requier/controller/DeviceMetricRecordController.java
new file mode 100644
index 0000000..aac5dae
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/controller/DeviceMetricRecordController.java
@@ -0,0 +1,134 @@
+package com.ruoyi.requier.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.common.utils.FileSaveUtil;
+import com.ruoyi.requier.dto.DeviceMetricRecordDto;
+import com.ruoyi.requier.pojo.Device;
+import com.ruoyi.requier.pojo.DeviceMetricRecord;
+import com.ruoyi.requier.pojo.DeviceMetricsCopy;
+import com.ruoyi.requier.service.DeviceMetricRecordService;
+import com.ruoyi.requier.service.DeviceMetricsCopyService;
+import com.ruoyi.requier.service.DeviceService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:01
+ */
+@Api(tags = "璁惧 - 璁惧鏍″噯")
+@RestController
+@RequestMapping("/deviceMetricRecord")
+public class DeviceMetricRecordController {
+
+    @Autowired
+    private DeviceMetricRecordService deviceMetricRecordService;
+
+    @Autowired
+    private DeviceMetricsCopyService deviceMetricsCopyService;
+
+    @Autowired
+    private NumberGenerator<DeviceMetricRecord> numberGenerator;
+
+    @Autowired
+    private DeviceService deviceService;
+
+    @ApiOperation("璁惧鏍″噯鍒嗛〉鏌ヨ")
+    @GetMapping("/deviceMetricRecordPage")
+    public Result deviceMetricRecordPage(@RequestParam("deviceId") Integer deviceId, Page page, @RequestParam("type") String type) {
+        return Result.success(deviceMetricRecordService.page(page, Wrappers.<DeviceMetricRecord>lambdaQuery()
+                .eq(DeviceMetricRecord::getDeviceId, deviceId)
+                .eq(DeviceMetricRecord::getType, type)));
+    }
+
+    @ApiOperation("璁惧鏍″噯 鏂板 鏇存柊")
+    @PostMapping("/addOrUpdateDeviceMetricRecord")
+    public Result addOrUpdateDeviceMetricRecord(@RequestBody DeviceMetricRecordDto deviceMetricRecordDto) {
+        if (ObjectUtils.isEmpty(deviceMetricRecordDto.getProcessNumber())) {
+            String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
+            String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
+            String processNumber = numberGenerator.generateNumberWithPrefix(5, "SBJZ" + year + month, DeviceMetricRecord::getProcessNumber);
+            deviceMetricRecordDto.setProcessNumber(processNumber);
+        }
+        deviceMetricRecordService.saveOrUpdate(deviceMetricRecordDto);
+        if (deviceMetricRecordDto.getType().equals("calibrate")) {
+            deviceService.update(Wrappers.<Device>lambdaUpdate()
+                    .set(Device::getCalibrationServices,deviceMetricRecordDto.getUnitOfMeasure())
+                    .eq(Device::getId,deviceMetricRecordDto.getDeviceId()));
+        }
+        if (CollectionUtils.isNotEmpty(deviceMetricRecordDto.getDeviceMetricsCopyList())) {
+            deviceMetricRecordDto.getDeviceMetricsCopyList().forEach(i -> i.setDeviceMetricsId(deviceMetricRecordDto.getId()));
+            deviceMetricsCopyService.saveOrUpdateBatch(deviceMetricRecordDto.getDeviceMetricsCopyList());
+        }
+        return Result.success();
+    }
+
+    @ApiOperation("璁惧鏍″噯 鍒犻櫎")
+    @DeleteMapping("/deleteDeviceMetricRecord")
+    public Result deleteDeviceMetricRecord(@RequestParam("id") Integer id) {
+        DeviceMetricRecord deviceMetricRecord = deviceMetricRecordService.getById(id);
+        deviceMetricsCopyService.remove(Wrappers.<DeviceMetricsCopy>lambdaQuery()
+                .eq(DeviceMetricsCopy::getDeviceMetricsId, id));
+        // 鍒犻櫎鏂囦欢
+        FileSaveUtil.DeleteFile(deviceMetricRecord.getSystemFileName());
+        boolean b = deviceMetricRecordService.removeById(id);
+        // 淇敼璁惧鐨勬牎鍑嗘満鏋�
+        if (deviceMetricRecord.getType().equals("calibrate")) {
+            List<DeviceMetricRecord> list = deviceMetricRecordService.list(Wrappers.<DeviceMetricRecord>lambdaQuery()
+                    .eq(DeviceMetricRecord::getType,"calibrate")
+                    .eq(DeviceMetricRecord::getDeviceId, deviceMetricRecord.getDeviceId()));
+            int size = list.size();
+            // 璁剧疆璁惧涓殑鏍″噯鏈烘瀯涓轰笂娆$殑鏈烘瀯
+            deviceService.update(Wrappers.<Device>lambdaUpdate()
+                    .set(Device::getCalibrationServices,size == 0 ? null : list.get(size - 1).getUnitOfMeasure())
+                    .eq(Device::getId,deviceMetricRecord.getDeviceId()));
+        }
+        return Result.success(b);
+    }
+
+    @ApiOperation("璁惧鏍″噯 鏍″噯鏉$洰鏌ヨ")
+    @GetMapping("/showDeviceMetricsCopy")
+    public Result showDeviceMetricsCopy(@RequestParam("id") Integer id, @RequestParam("type") String type) {
+        return Result.success(deviceMetricsCopyService.list(Wrappers.<DeviceMetricsCopy>lambdaQuery()
+                .eq(DeviceMetricsCopy::getDeviceMetricsId, id)
+                .eq(DeviceMetricsCopy::getType, type)));
+    }
+
+    @GetMapping("/deviceMetricRecordExport")
+    public Result deviceMetricRecordExport(@RequestParam("deviceId") Integer deviceId, @RequestParam("type") String type, HttpServletResponse response) throws IOException {
+        List<DeviceMetricRecord> list = deviceMetricRecordService.page(new Page<>(-1,-1), Wrappers.<DeviceMetricRecord>lambdaQuery()
+                .eq(DeviceMetricRecord::getDeviceId, deviceId)
+                .eq(DeviceMetricRecord::getType, type)).getRecords();
+        list.forEach(i -> i.setStatus(i.getStatus().equals("0yes") ? "鍚堟牸" : "涓嶅悎鏍�"));
+        response.setHeader("requestType", "excel");
+        response.setHeader("Access-Control-Expose-Headers", "requestType");
+        // 璁剧疆鍗曞厓鏍兼牱寮�
+        // 淇濆瓨鍒扮涓�涓猻heet涓�
+        EasyExcel.write(response.getOutputStream())
+                .head(DeviceMetricRecord.class)
+                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 鑷�傚簲鍒楀
+                .sheet()
+                .doWrite(list);
+        return Result.success();
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/controller/DocumentController.java b/cnas-require/src/main/java/com/ruoyi/requier/controller/DocumentController.java
new file mode 100644
index 0000000..739496c
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/controller/DocumentController.java
@@ -0,0 +1,46 @@
+package com.ruoyi.requier.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.requier.pojo.Document;
+import com.ruoyi.requier.service.DocumentService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("/documents")
+public class DocumentController {
+
+    @Resource
+    private DocumentService documentService;
+
+    @PostMapping("add")
+    public Result createDocument(@RequestBody Document document) {
+        documentService.save(document);
+        return Result.success("ok");
+    }
+
+    @GetMapping("/id")
+    public Document getDocumentById(Integer id) {
+        return documentService.getById(id);
+    }
+
+    @PostMapping("updateDocument")
+    public Result updateDocument(@RequestBody Document document) {
+        return Result.success(documentService.updateById(document));
+    }
+
+    @DeleteMapping("/deleteDocumentById")
+    public Result deleteDocumentById( Integer id) {
+        return Result.success(documentService.removeById(id));
+    }
+
+    @GetMapping("/getListByDId")
+    public Result getAllDocuments(Integer id) {
+        LambdaQueryWrapper<Document> lambdaQueryWrapper=new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(Document::getDeviceId,id);
+        return Result.success(documentService.list(lambdaQueryWrapper));
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/controller/IncidentReportController.java b/cnas-require/src/main/java/com/ruoyi/requier/controller/IncidentReportController.java
new file mode 100644
index 0000000..b9de791
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/controller/IncidentReportController.java
@@ -0,0 +1,73 @@
+package com.ruoyi.requier.controller;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.requier.dto.IncidentReportAddDto;
+import com.ruoyi.requier.excel.IncidentReportExport;
+import com.ruoyi.requier.service.IncidentReportService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧楠屾敹娣诲姞楠屾敹瀛楁琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 03:54:49
+ */
+@RestController
+@RequestMapping("/incidentReport")
+public class IncidentReportController {
+    @Autowired
+    private IncidentReportService incidentReportService;
+
+    @PostMapping("saveIncidentReportData")
+    public Result saveIncidentReportData(@RequestBody IncidentReportAddDto incidentReportAddDto) {
+        incidentReportService.saveIncidentReportData(incidentReportAddDto);
+        return Result.success();
+    }
+
+    @GetMapping("/getShowIncidentReport")
+    public Result getShowIncidentReport(@RequestParam("id") Integer id) {
+        return Result.success(incidentReportService.getShowIncidentReport(id));
+    }
+
+    @DeleteMapping("/deleteIncidentReport")
+    public Result deleteIncidentReport(@RequestParam("id") Integer id) {
+        incidentReportService.deleteIncidentReport(id);
+        return Result.success();
+    }
+
+    @GetMapping("/incidentReportPage")
+    public Result incidentReportPage(@RequestParam("deviceId") Integer deviceId, Page page, String processNumber){
+        return Result.success(incidentReportService.getByDeviceId(deviceId, page, processNumber));
+    }
+
+    @DeleteMapping("deleteIncidentReportAll")
+    public Result deleteIncidentReport(Integer sparePartsId, Integer fileId, Integer installId, Integer acceptanceCheckId) {
+        incidentReportService.deleteIncidentReportAll(sparePartsId, fileId, installId, acceptanceCheckId);
+        return Result.success();
+    }
+
+    @GetMapping("/incidentReportExport")
+    public Result incidentReportPage(@RequestParam("deviceId") Integer deviceId, HttpServletResponse response) throws IOException {
+        List<IncidentReportExport> list = incidentReportService.incidentReportExport(deviceId);
+        response.setHeader("requestType", "excel");
+        response.setHeader("Access-Control-Expose-Headers", "requestType");
+        // 璁剧疆鍗曞厓鏍兼牱寮�
+        // 淇濆瓨鍒扮涓�涓猻heet涓�
+        EasyExcel.write(response.getOutputStream())
+                .head(IncidentReportExport.class)
+                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 鑷�傚簲鍒楀
+                .sheet()
+                .doWrite(list);
+        return Result.success();
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/controller/InstructionController.java b/cnas-require/src/main/java/com/ruoyi/requier/controller/InstructionController.java
new file mode 100644
index 0000000..d67ec17
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/controller/InstructionController.java
@@ -0,0 +1,102 @@
+package com.ruoyi.requier.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.requier.dto.InstructionDto;
+import com.ruoyi.requier.pojo.Instruction;
+import com.ruoyi.requier.pojo.OperationInstruction;
+import com.ruoyi.requier.service.InstructionService;
+import com.ruoyi.requier.service.OperationInstructionService;
+import com.ruoyi.requier.vo.OperationInstructionVo;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+@RestController
+@RequestMapping("/instruction")
+public class InstructionController {
+
+    @Autowired
+    private InstructionService instructionService;
+
+    @Autowired
+    private OperationInstructionService operationInstructionService;
+
+    @ApiOperation(value = "浣滀笟鎸囧涔� 鍒嗛〉")
+    @GetMapping("/pageByPageQueryOfHomeworkInstructions")
+    public Result<IPage<Instruction>> pageByPageQueryOfHomeworkInstructions(Page page){
+        return Result.success(instructionService.pageByPageQueryOfHomeworkInstructions(page));
+    }
+
+    @ApiOperation(value = "浣滀笟鎸囧涔︽柊澧�")
+    @PostMapping("/newHomeworkGuidebookAdded")
+    public Result newHomeworkGuidebookAdded(@RequestBody InstructionDto instructionDto){
+        instructionService.newHomeworkGuidebookAdded(instructionDto);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "浣滀笟鎸囧涔︾紪杈�")
+    @GetMapping("/homeworkGuidebookEditor")
+    public Result<Map<String, Object>> homeworkGuidebookEditor(Integer instructionId){
+        Instruction instruction = instructionService.getById(instructionId);
+        List<OperationInstructionVo> list = operationInstructionService.homeworkGuidebookEditor(instructionId);
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("list", list);
+        map.put("instruction", instruction);
+        return Result.success(map);
+    }
+
+    @ApiOperation(value = "浣滀笟鎸囧涔﹀彈鎺ф枃浠跺垹闄�")
+    @GetMapping("/deleteHomeworkGuidebook")
+    public Result deleteHomeworkGuidebook(String ids){
+        if (ObjectUtils.isNotEmpty(ids)) {
+            String[] idArray = ids.split(",");
+            operationInstructionService.removeBatchByIds(Arrays.asList(idArray));
+        }
+        return Result.success();
+    }
+
+    @ApiOperation(value = "浣滀笟鎸囧涔﹀垹闄�")
+    @DeleteMapping("/homeworkGuidebook")
+    public Result homeworkGuidebook(String id, String instructionId){
+        // 鍒犻櫎瀛愯〃鏁版嵁
+        operationInstructionService.removeById(id);
+        // 濡傛灉瀛愯〃鏁版嵁涓虹┖
+        long count = operationInstructionService.count(Wrappers.<OperationInstruction>lambdaQuery()
+                .eq(OperationInstruction::getInstructionId, instructionId));
+        // 閭d箞灏卞垹闄ょ埗琛ㄦ暟鎹�
+        if (count < 1) {
+            instructionService.removeById(id);
+        }
+        return Result.success();
+    }
+
+    @ApiOperation(value = "浣滀笟鎸囧涔﹀鎵�")
+    @PostMapping("/approvalOfHomeworkInstructionManual")
+    public Result approvalOfHomeworkInstructionManual(String id, Boolean status){
+        operationInstructionService.update(Wrappers.<OperationInstruction>lambdaUpdate()
+                .eq(OperationInstruction::getId, id)
+                .set(OperationInstruction::getStatus, status)
+                .set(OperationInstruction::getApproverId, SecurityUtils.getUserId())
+                .set(OperationInstruction::getEntryIntoForceTime, LocalDateTime.now()));
+        return Result.success();
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/controller/ReservationController.java b/cnas-require/src/main/java/com/ruoyi/requier/controller/ReservationController.java
new file mode 100644
index 0000000..85e691f
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/controller/ReservationController.java
@@ -0,0 +1,74 @@
+package com.ruoyi.requier.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.requier.dto.DeviceDto;
+import com.ruoyi.requier.pojo.Reservation;
+import com.ruoyi.requier.service.DeviceService;
+import com.ruoyi.requier.service.ReservationService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璧勬簮棰勫畾鏂板缓棰勫畾琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author baomidou
+ * @since 2024-09-14
+ */
+@RestController
+@RequestMapping("/reservation")
+public class ReservationController {
+    @Autowired
+    private ReservationService reservationService;
+
+    @Resource
+    private DeviceService deviceService;
+
+    @GetMapping("/selectDeviceParameter")
+    public Result selectDeviceParameter(Page page,DeviceDto itemParameter,
+                                        @RequestParam(value = "laboratoryNameIsNull", required = false) Boolean laboratoryNameIsNull,
+                                        @RequestParam(value = "starttime", required = false)String starttime,
+                                        @RequestParam(value = "endtime", required = false) String endtime) {
+        ArrayList<JSONObject> jsonObjects = reservationService.selectDeviceParameter(page, itemParameter, laboratoryNameIsNull, starttime, endtime);
+        return Result.success(jsonObjects);
+    }
+
+    @GetMapping("/selectReservationParameterPage")
+    public Result selectReservationParameterPage(@RequestParam String deviceId,@RequestParam String reservationTime,@RequestParam String specificTime){
+        return Result.success(reservationService.selectReservationParameterPage(deviceId,reservationTime,specificTime));
+    }
+
+    @GetMapping("/{id}")
+    public Result getList(@PathVariable Integer id) {
+        LambdaQueryWrapper<Reservation> lambdaQueryWrapper=new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(Reservation::getDeviceId,id);
+        return Result.success(reservationService.list(lambdaQueryWrapper));
+    }
+
+    @PostMapping("save")
+    public Result save(@RequestBody Reservation reservation){
+        reservation.setCreateDate(LocalDateTime.now());
+        reservationService.save(reservation);
+        return Result.success();
+    }
+
+
+    @DeleteMapping("/delete")
+    public Result deleteReservation(String ids) {
+        String[] idArray = ids.split(",");
+        reservationService.removeBatchByIds(Arrays.asList(idArray));
+        return Result.success();
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/dto/ADto.java b/cnas-require/src/main/java/com/ruoyi/requier/dto/ADto.java
new file mode 100644
index 0000000..74d174b
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/dto/ADto.java
@@ -0,0 +1,16 @@
+package com.ruoyi.requier.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class ADto {
+
+    private int k;
+    private String v;
+    private String i;
+    private String p;
+    private boolean self;
+    private List<BDto> c;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/dto/BDto.java b/cnas-require/src/main/java/com/ruoyi/requier/dto/BDto.java
new file mode 100644
index 0000000..dbadaba
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/dto/BDto.java
@@ -0,0 +1,14 @@
+package com.ruoyi.requier.dto;
+
+import lombok.Data;
+
+@Data
+public class BDto {
+
+    private int k;
+    private String v;
+    private String i;
+    private String u;
+    private String p;
+    private String g;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/dto/DataConfigDto.java b/cnas-require/src/main/java/com/ruoyi/requier/dto/DataConfigDto.java
new file mode 100644
index 0000000..abd37e0
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/dto/DataConfigDto.java
@@ -0,0 +1,39 @@
+package com.ruoyi.requier.dto;
+
+import com.ruoyi.requier.pojo.DataConfig;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class DataConfigDto {
+
+    private List<DataConfig> dataConfigList;
+
+    private Boolean isDevice;
+
+    @ApiModelProperty("鏂囦欢鍚庣紑")
+    private String fileType;
+
+    @ApiModelProperty("閲囬泦鍦板潃")
+    private String collectUrl;
+
+    @ApiModelProperty("瀛樺偍鍦板潃")
+    private String storageUrl;
+
+    @ApiModelProperty("璁惧IP")
+    private String ip;
+
+    @ApiModelProperty("鏁伴噰-濮旀墭瀛楁")
+    private String entrustCode;
+
+    @ApiModelProperty("鏁伴噰-鏍峰搧瀛楁")
+    private String sampleCode;
+
+    @ApiModelProperty("鏁伴噰-db锛宮db鏂囦欢鍚嶇О")
+    private String dbFileName;
+
+    @ApiModelProperty("鏁伴噰-db鏂囦欢 鍏夌氦甯︾紪鍙�")
+    private String fiberOpticRibbon;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/dto/DeviceConfigDtoPage.java b/cnas-require/src/main/java/com/ruoyi/requier/dto/DeviceConfigDtoPage.java
new file mode 100644
index 0000000..f09a3f4
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/dto/DeviceConfigDtoPage.java
@@ -0,0 +1,70 @@
+package com.ruoyi.requier.dto;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class DeviceConfigDtoPage {
+
+    @ApiModelProperty(value = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @ApiModelProperty(value = "鍒涘缓鐢ㄦ埛")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty(value = "鏂囦欢鍚庣紑")
+    private String fileType;
+
+    @ApiModelProperty(value = "閲囬泦鍦板潃")
+    private String collectUrl;
+
+    @ApiModelProperty(value = "瀛樺偍鍦板潃")
+    private String storageUrl;
+
+    @ApiModelProperty(value = "IP鍦板潃")
+    private String ip;
+
+    @ApiModelProperty(value = "妫�楠岄」")
+    private String inspectionItem;
+
+    @ApiModelProperty(value = "妫�楠岄」瀛愰」")
+    private String inspectionItemSubclass;
+
+    @ApiModelProperty(value = "鍏紡")
+    private String formula;
+
+    @ApiModelProperty(value = "鍙傜収X")
+    private String referx;
+
+    @ApiModelProperty(value = "X")
+    private String x;
+
+    @ApiModelProperty(value = "鍙傜収Y")
+    private String refery;
+
+    @ApiModelProperty(value = "Y")
+    private String y;
+
+    private Integer id;
+
+    @ApiModelProperty(value = "妫�楠屽璞�")
+    private String sample;
+
+    @ApiModelProperty(value = "妫�楠岄」鐩甶d")
+    private Integer structureItemParameterId;
+
+    @ApiModelProperty("鏁伴噰-濮旀墭瀛楁")
+    private String entrustCode;
+
+    @ApiModelProperty("鏁伴噰-鏍峰搧瀛楁")
+    private String sampleCode;
+
+    @ApiModelProperty("鏁伴噰-db锛宮db鏂囦欢鍚嶇О")
+    private String dbFileName;
+
+    @ApiModelProperty("鏁伴噰-db鏂囦欢 鍏夌氦甯︾紪鍙�")
+    private String fiberOpticRibbon;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/dto/DeviceDto.java b/cnas-require/src/main/java/com/ruoyi/requier/dto/DeviceDto.java
new file mode 100644
index 0000000..5e850c6
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/dto/DeviceDto.java
@@ -0,0 +1,43 @@
+package com.ruoyi.requier.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.ruoyi.requier.pojo.Device;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class DeviceDto extends Device {
+
+    @ApiModelProperty(value = "绠$悊浜�")
+    private String equipmentManagerUser;
+
+    @ApiModelProperty(value = "鎵�灞為儴闂�")
+    @JsonInclude(JsonInclude.Include.NON_NULL)
+    private String laboratoryName;
+
+    @ApiModelProperty(value = "妫�楠岄」鐩�")
+    private String insProductItem;
+
+    @ApiModelProperty(value = "绠$悊浜哄鍚�")
+    private String equipmentManagerName;
+
+    @ApiModelProperty(value = "琚巿鏉冧汉濮撳悕")
+    private String authorizedPersonName;
+
+    @ApiModelProperty(value = "鏍稿噯璇佷功缂栧彿")
+    private String calibrateNo;
+
+    @ApiModelProperty(value = "鏈�杩戞牎鍑嗘棩鏈�")
+    private LocalDateTime lastCalibrationDateTwo;
+
+    @ApiModelProperty(value = "涓嬫鏍″噯鏃ユ湡")
+    private LocalDateTime nextCalibrationDateTwo;
+
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/dto/DeviceFaultOneDto.java b/cnas-require/src/main/java/com/ruoyi/requier/dto/DeviceFaultOneDto.java
new file mode 100644
index 0000000..442893f
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/dto/DeviceFaultOneDto.java
@@ -0,0 +1,17 @@
+package com.ruoyi.requier.dto;
+
+import com.ruoyi.requier.pojo.DeviceFaultOne;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class DeviceFaultOneDto extends DeviceFaultOne {
+    @ApiModelProperty(value = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @ApiModelProperty(value = "瑙勬牸鍨嬪彿")
+    private String specificationModel;
+
+    @ApiModelProperty(value = "绠$悊缂栧彿")
+    private String managementNumber;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/dto/DeviceMaintenanceExport.java b/cnas-require/src/main/java/com/ruoyi/requier/dto/DeviceMaintenanceExport.java
new file mode 100644
index 0000000..d3421a0
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/dto/DeviceMaintenanceExport.java
@@ -0,0 +1,45 @@
+package com.ruoyi.requier.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Data;
+
+@Data
+public class DeviceMaintenanceExport {
+
+    @ColumnWidth(20)
+    @ExcelProperty("璁惧鍚嶇О")
+    private String deviceName;
+
+    @ColumnWidth(20)
+    @ExcelProperty("娴佺▼缂栧彿")
+    private String deviceNumber;
+
+    @ColumnWidth(20)
+    @ExcelProperty("绠$悊缂栧彿")
+    private String managementNumber;
+
+    @ColumnWidth(50)
+    @ExcelProperty("缁存姢鍐呭")
+    private String content;
+
+    @ColumnWidth(20)
+    @ExcelProperty("缁存姢鏃堕棿")
+    private String date;
+
+    @ColumnWidth(20)
+    @ExcelProperty("涓嬫缁存姢鏃堕棿")
+    private String nextDate;
+
+    @ColumnWidth(20)
+    @ExcelProperty("缁存姢绫诲瀷")
+    private String maintenanceType;
+
+    @ColumnWidth(20)
+    @ExcelProperty("缁存姢浜�")
+    private String name;
+
+    @ColumnWidth(50)
+    @ExcelProperty("澶囨敞")
+    private String comments;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/dto/DeviceMetricRecordDto.java b/cnas-require/src/main/java/com/ruoyi/requier/dto/DeviceMetricRecordDto.java
new file mode 100644
index 0000000..1f8493d
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/dto/DeviceMetricRecordDto.java
@@ -0,0 +1,13 @@
+package com.ruoyi.requier.dto;
+
+import com.ruoyi.requier.pojo.DeviceMetricRecord;
+import com.ruoyi.requier.pojo.DeviceMetricsCopy;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class DeviceMetricRecordDto extends DeviceMetricRecord {
+
+    private List<DeviceMetricsCopy> deviceMetricsCopyList;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/dto/IncidentReportAddDto.java b/cnas-require/src/main/java/com/ruoyi/requier/dto/IncidentReportAddDto.java
new file mode 100644
index 0000000..b0616cb
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/dto/IncidentReportAddDto.java
@@ -0,0 +1,26 @@
+package com.ruoyi.requier.dto;
+
+import com.ruoyi.requier.pojo.*;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class IncidentReportAddDto extends IncidentReport {
+    private List<IncidentSpareParts> sparePartsConfirmationList; // 澶囦欢纭List
+    private List<IncidentFile> fileClassConfirmationList; // 鏂囦欢纭List
+    private List<IncidentInstall> installationAcceptanceRecordList; // 瀹夎楠屾敹璁板綍
+    private List<IncidentAcceptanceCheck> acceptanceCheckRecordList; // 楠屾敹鏍告煡璁板綍
+
+    private String deviceName;
+
+    private String managementNumber;
+
+    private String submitUser;
+
+    private String saveState;
+
+    private String manufacturer;
+
+    private String specificationModel;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/dto/InformationNotificationDto.java b/cnas-require/src/main/java/com/ruoyi/requier/dto/InformationNotificationDto.java
new file mode 100644
index 0000000..11ced67
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/dto/InformationNotificationDto.java
@@ -0,0 +1,11 @@
+package com.ruoyi.requier.dto;
+
+import com.ruoyi.requier.pojo.InformationNotification;
+import lombok.Data;
+
+@Data
+public class InformationNotificationDto extends InformationNotification {
+    private String senderUser;
+
+    private String consigneeUser;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/dto/InstructionDto.java b/cnas-require/src/main/java/com/ruoyi/requier/dto/InstructionDto.java
new file mode 100644
index 0000000..66c9c93
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/dto/InstructionDto.java
@@ -0,0 +1,13 @@
+package com.ruoyi.requier.dto;
+
+import com.ruoyi.requier.pojo.Instruction;
+import com.ruoyi.requier.pojo.OperationInstruction;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class InstructionDto extends Instruction {
+
+    private List<OperationInstruction> feTempHumRecordList;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/dto/OperationInstructionDto.java b/cnas-require/src/main/java/com/ruoyi/requier/dto/OperationInstructionDto.java
new file mode 100644
index 0000000..18c2e72
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/dto/OperationInstructionDto.java
@@ -0,0 +1,35 @@
+package com.ruoyi.requier.dto;
+
+import com.ruoyi.requier.pojo.OperationInstruction;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class OperationInstructionDto extends OperationInstruction {
+    @ApiModelProperty("鐢宠缂栧彿")
+    private String applicationNumber;
+
+    @ApiModelProperty("鐢宠閮ㄩ棬")
+    private String applicationDepartment;
+
+    @ApiModelProperty("璐d换浜�")
+    private String personLiable;
+
+    @ApiModelProperty("鍙楁帶鐢宠璇存槑")
+    private String controlledApplicationDescription;
+
+    @ApiModelProperty("绠$悊缂栧彿")
+    private String deviceNumber;
+
+    @ApiModelProperty("鍨嬪彿")
+    private String deviceModel;
+
+    @ApiModelProperty("璁惧鍚嶇О")
+    private String deviceName;
+
+    @ApiModelProperty("涓婁紶浜�")
+    private String uploaderName;
+
+    @ApiModelProperty("瀹℃壒浜�")
+    private String approverName;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/dto/ReservationDto.java b/cnas-require/src/main/java/com/ruoyi/requier/dto/ReservationDto.java
new file mode 100644
index 0000000..d9e9712
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/dto/ReservationDto.java
@@ -0,0 +1,10 @@
+package com.ruoyi.requier.dto;
+
+import com.ruoyi.requier.pojo.Reservation;
+import lombok.Data;
+
+@Data
+public class ReservationDto extends Reservation {
+
+    private String name;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/excel/IncidentReportExport.java b/cnas-require/src/main/java/com/ruoyi/requier/excel/IncidentReportExport.java
new file mode 100644
index 0000000..4935314
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/excel/IncidentReportExport.java
@@ -0,0 +1,31 @@
+package com.ruoyi.requier.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+@Data
+public class IncidentReportExport {
+    @ExcelProperty(value = "娴佺▼缂栧彿")
+    private String processNumber;
+
+    @ExcelProperty(value = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @ExcelProperty(value = "绠$悊缂栧彿")
+    private String managementNumber;
+
+    @ExcelProperty(value = "搴忓垪鍙�")
+    private String serialNumber;
+
+    @ExcelProperty(value = "鎻愪氦鑰�")
+    private String submitUser;
+
+    @ExcelProperty(value = "鎻愪氦鏃ユ湡")
+    private String createTime;
+
+    @ExcelProperty(value = "褰撳墠鐘舵��")
+    private String saveState;
+
+    @ExcelProperty("褰撳墠璐熻矗浜�")
+    private String currentResponsible;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/handler/BasicReportHandler.java b/cnas-require/src/main/java/com/ruoyi/requier/handler/BasicReportHandler.java
new file mode 100644
index 0000000..7d07526
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/handler/BasicReportHandler.java
@@ -0,0 +1,556 @@
+package com.ruoyi.requier.handler;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.deepoove.poi.data.*;
+import com.deepoove.poi.data.style.*;
+import com.ruoyi.framework.util.MyUtil;
+import com.ruoyi.inspect.dto.SampleProductDto;
+import com.ruoyi.inspect.mapper.InsOrderMapper;
+import com.ruoyi.inspect.mapper.InsSampleMapper;
+import com.ruoyi.inspect.pojo.InsProduct;
+import com.ruoyi.inspect.pojo.InsReport;
+import com.ruoyi.requier.service.impl.InsOrderPlanServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
+import org.apache.poi.xwpf.usermodel.TableRowAlign;
+import org.apache.poi.xwpf.usermodel.XWPFTable;
+import org.apache.poi.xwpf.usermodel.XWPFTableCell;
+
+import java.text.Collator;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+/**
+ * 鍩虹鎶ュ憡澶勭悊绫�
+ */
+public class BasicReportHandler {
+
+    /**
+     * 榛樿琛ㄦ牸瀹藉害
+     */
+    private final static int[] DEFAULT_COL_WIDTHS = {650, 1600, 2000, 750, 2800, 1100, 1100};
+
+    /**
+     * 鍏夌氦琛ㄦ牸瀹藉害
+     */
+    private final static int[] FIBER_COL_WIDTHS = {650, 1700, 2000, 750, 2000, 1800, 1100};
+
+    private final InsOrderMapper baseMapper;
+
+    private final InsOrderPlanServiceImpl insOrderPlanServiceImpl;
+
+    private final InsSampleMapper insSampleMapper;
+
+    public BasicReportHandler(InsOrderMapper insOrderMapper, InsOrderPlanServiceImpl insOrderPlanServiceImpl, InsSampleMapper insSampleMapper){
+        this.baseMapper = insOrderMapper;
+        this.insOrderPlanServiceImpl = insOrderPlanServiceImpl;
+        this.insSampleMapper = insSampleMapper;
+    }
+
+    /**
+     * 鍐欏叆鏂规硶
+     * @param samples         鎵�鏈夋牱鍝�
+     * @param insReport       report瀵硅薄
+     * @param tables          妫�楠岄」琛ㄦ牸鏁版嵁
+     * @param standardMethod  鏍囧噯鏂规硶
+     * @param models          鎵�鏈夋牱鍝佺殑鍨嬪彿
+     * @param unEqualSet      鍘婚噸鐨勬墍鏈夋楠岄」鐩暟閲�
+     * @param modelDl         鐢靛姏鐗规畩鍨嬪彿澶勭悊
+     * @param deviceSet       鍘婚噸鐨勬墍鏈夋楠岄」浣跨敤璁惧鍒楄〃
+     */
+    public void doWrite(List<SampleProductDto> samples, InsReport insReport, List<Map<String,Object>> tables,
+                        Set<String> standardMethod, Set<String> models, Set<String> unEqualSet,
+                        List<String> modelDl, Set<String> deviceSet){
+        //澶勭悊鍏夌氦椤圭洰鍜屾澗濂楃,鎺掗櫎娓╁害寰幆
+        List<InsProduct> fiberList = new ArrayList<>();
+        samples.forEach(s->{
+            fiberList.addAll(s.getInsProduct().stream().filter(p->(p.getSonLaboratory().equals("鍏夌氦璇曢獙瀹�")&&Objects.isNull(p.getSpecialItemParentId())
+                    ||(p.getSonLaboratory().equals("鏉愭枡璇曢獙瀹�")&&Objects.nonNull(p.getInsFiberId()))
+                    ||(p.getInspectionItem().contains("鏉惧绠�")||p.getInspectionItemSubclass().contains("鏉惧绠�")))
+                    &&!p.getInspectionItem().equals("娓╁害寰幆")).collect(Collectors.toList()));
+        });
+        if(!fiberList.isEmpty()){
+            //鏍规嵁妫�楠岄」鍒嗙粍
+            Map<String, List<InsProduct>> groupMap = fiberList.stream().collect(Collectors.groupingBy(g -> MyUtil.joinChars("",g.getInspectionItem(),g.getInspectionItemSubclass())));
+            SampleProductDto sampleProductDto = new SampleProductDto();
+            List<InsProduct> handleProductList = new ArrayList<>();
+            for (String s : groupMap.keySet()) {
+                if(!groupMap.get(s).isEmpty()){
+                    List<String> lastValueList = groupMap.get(s).stream().map(InsProduct::getLastValue).map(String::trim).collect(Collectors.toList());
+                    String lastValue = "";
+                    boolean a = lastValueList.contains("绗﹀悎");
+                    if(lastValueList.contains("绗﹀悎") || lastValueList.contains("涓嶇鍚�") || lastValueList.contains("涓嶅垽瀹�")){
+                        long count1 = lastValueList.stream().filter(f->f.equals("绗﹀悎")).count();
+                        long count2 = lastValueList.stream().filter(f->f.equals("涓嶇鍚�")).count();
+                        if(count1>0&&count2==0){
+                            lastValue = "绗﹀悎";
+                        }else if(count2>0){
+                            lastValue = "涓嶇鍚�";
+                        }else{
+                            lastValue="涓嶅垽瀹�";
+                        }
+                    }else {
+                        double maxLastValue = lastValueList.stream().mapToDouble(Double::parseDouble).max().orElse(0);
+                        double minLastValue = lastValueList.stream().mapToDouble(Double::parseDouble).min().orElse(0);
+                        lastValue = minLastValue+"-"+maxLastValue;
+
+                    }
+                    InsProduct insProduct = groupMap.get(s).get(0);
+                    sampleProductDto.setModel(insProduct.getModel());
+                    insProduct.setLastValue(lastValue);
+                    handleProductList.add(insProduct);
+                }
+            }
+            handleProductList.sort((o1,o2)->{
+                //鏍规嵁妫�楠岄」鎺掑簭
+                if(!Objects.equals(o1.getInspectionItem(),o2.getInspectionItem())){
+                    List<String> specialItems = Arrays.asList("鑰愮幆澧冨簲鍔涘紑瑁�","鐑敹缂╃巼");
+                    if(specialItems.contains(o1.getInspectionItem()) && specialItems.contains(o2.getInspectionItem())){
+                        return Integer.MAX_VALUE;
+                    }
+                    Collator instance = Collator.getInstance(Locale.CHINA);
+                    return instance.compare(o1.getInspectionItem(),o2.getInspectionItem());
+                }
+                //妫�楠屽瓙椤规帓搴�
+                if(StringUtils.isNotBlank(o1.getInspectionItemSubclass())&& StringUtils.isNotBlank(o2.getInspectionItemSubclass())){
+                    if(!Objects.equals(o1.getInspectionItemSubclass(),o2.getInspectionItemSubclass())){
+                        Collator instance = Collator.getInstance(Locale.CHINA);
+                        return instance.compare(o1.getInspectionItemSubclass(),o2.getInspectionItemSubclass());
+                    }
+                }
+                return 0;
+            });
+            sampleProductDto.setInsProduct(handleProductList);
+            //鍐欏叆琛ㄦ牸
+            writeTableRow(sampleProductDto,insReport,tables,FIBER_COL_WIDTHS);
+        }
+        samples.forEach(a -> {
+            Set<Integer> set = new HashSet<>();
+            Map<Integer, String> map2 = new HashMap<>();
+            //娣诲姞鎵�鏈夋楠岄」
+            unEqualSet.addAll(a.getInsProduct().stream().map(m->m.getInspectionItem()+m.getInspectionItemSubclass()).collect(Collectors.toList()));
+            models.add(a.getModel());
+            standardMethod.add(baseMapper.getStandardMethodCode(a.getStandardMethodListId()));
+            insOrderPlanServiceImpl.getTemplateThing(set, map2, a.getInsProduct());
+            for (InsProduct b : a.getInsProduct()) {
+                if("鐢靛姏璇曢獙瀹�".equals(b.getSonLaboratory()) && Arrays.asList("閽㈡潗","閾濇潗").contains(b.getSample())){
+                    modelDl.add(b.getModel());
+                }
+                if (b.getInsProductResult() != null) {
+                    if (ObjectUtils.isNotEmpty(b.getInsProductResult().getEquipValue())) {
+                        List<JSONObject> jsonObjects = JSON.parseArray(b.getInsProductResult().getEquipValue(), JSONObject.class);
+                        for (JSONObject jsonObject : jsonObjects) {
+                            if (!(jsonObject.get("v") + "").isEmpty()) {
+                                deviceSet.add(jsonObject.get("v") + "");
+                            }
+                        }
+                    }
+                }
+            }
+            //鍐欏叆琛ㄦ牸
+            //鎺掗櫎鍏夌氦璇曢獙瀹ょ殑椤圭洰鍜屾澗濂楃锛岄櫎浜嗘俯搴﹀惊鐜�
+            a.setInsProduct(a.getInsProduct().stream()
+                    .filter(p->(!p.getSonLaboratory().equals("鍏夌氦璇曢獙瀹�")&&Objects.isNull(p.getInsFiberId()))||p.getInspectionItem().equals("娓╁害寰幆"))
+                    .filter(p->!p.getInspectionItem().contains("鏉惧绠�")&&!p.getInspectionItemSubclass().contains("鏉惧绠�"))
+                    .collect(Collectors.toList()));
+            writeTableRow(a,insReport,tables,DEFAULT_COL_WIDTHS);
+        });
+    }
+
+    /**
+     * 鍐欏叆琛ㄦ牸琛�
+     * @param a           鏍峰搧淇℃伅
+     * @param insReport   report瀵硅薄
+     * @param tables     妫�楠岄」琛ㄦ牸瀵硅薄
+     * @param colWidths  琛ㄦ牸鍒楀璁剧疆
+     */
+    private static void writeTableRow(SampleProductDto a,InsReport insReport,List<Map<String,Object>> tables,int[] colWidths){
+        List<RowRenderData> rows = new ArrayList<>();
+        AtomicInteger index = new AtomicInteger();
+        Set<String> itemSet = new HashSet<>();
+        for (int i = 0; i < 3 + a.getInsProduct().size(); i++) {
+            RowRenderData rowRenderData = new RowRenderData();
+            RowStyle rowStyle = new RowStyle();
+            rowStyle.setHeight(40);
+            rowRenderData.setRowStyle(rowStyle);
+            List<CellRenderData> cells = new ArrayList<>();
+            if (i >= 2 && i < 2 + a.getInsProduct().size()) {
+                if (itemSet.add(a.getInsProduct().get(i - 2).getInspectionItem())) {
+                    index.getAndIncrement();
+                }
+            }
+            //鍒楁暟
+            for (int j = 0; j < 7; j++) {
+                CellRenderData cellRenderData = new CellRenderData();
+                CellStyle cellStyle = new CellStyle();
+                cellStyle.setVertAlign(XWPFTableCell.XWPFVertAlign.CENTER);
+                cellRenderData.setCellStyle(cellStyle);
+                List<ParagraphRenderData> paragraphRenderDataList = new ArrayList<>();
+                ParagraphRenderData paragraphRenderData = new ParagraphRenderData();
+                ParagraphStyle paragraphStyle = new ParagraphStyle();
+                paragraphStyle.setAlign(ParagraphAlignment.CENTER);
+                paragraphRenderData.setParagraphStyle(paragraphStyle);
+                List<RenderData> renderData = new ArrayList<>();
+                TextRenderData textRenderData = new TextRenderData();
+                Style style = new Style();
+                style.setFontFamily("瀹嬩綋");
+                style.setFontSize(10);
+                style.setColor("000000");
+                textRenderData.setStyle(style);
+                if (i == 0) {
+                    //绗竴琛�
+                    if (j == 0 || j == 1) {
+                        //绗竴鍒楀拰绗簩鍒�
+                        if(StringUtils.isNotBlank(a.getSampleCode())){
+                            textRenderData.setText("鏍峰搧缂栧彿@Sample number鈭�1");
+                        }else{
+                            textRenderData.setText("瑙勬牸鍨嬪彿@Type鈭�0302");
+                        }
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    } else if (j == 2 || j == 3) {
+                        //绗笁鍒楀拰绗洓鍒�
+                        if(StringUtils.isNotBlank(a.getSampleCode())){
+                            textRenderData.setText(a.getSampleCode() + "鈭�2");
+                        }else{
+                            textRenderData.setText("瑙勬牸鍨嬪彿@Type鈭�0302");
+                        }
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    } else if (j == 4) {
+                        //绗簲鍒�
+                        textRenderData.setText("瑙勬牸鍨嬪彿@Type鈭�0302");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    } else {
+                        //绗叚鍒楀拰绗竷鍒�
+                        textRenderData.setText(a.getModel() + "鈭�3");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                } else if (i == 1) {
+                    //绗簩琛�
+                    if (j == 0) {
+                        //绗竴鍒�
+                        textRenderData.setText("搴忓彿@No.");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    } else if (j == 1 || j == 2) {
+                        //绗簩鍒楀拰绗笁鍒�
+                        textRenderData.setText("妫�娴嬮」鐩瓳Testing item鈭�4");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    } else if (j == 3) {
+                        //绗洓鍒�
+                        textRenderData.setText("鍗曚綅@Unit");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    } else if (j == 4) {
+                        //绗簲鍒�
+                        textRenderData.setText("鏍囧噯瑕佹眰@Requirement");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    } else if (j == 5) {
+                        //绗叚鍒�
+                        textRenderData.setText("妫�楠岀粨鏋淍Test result");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    } else {
+                        //绗竷鍒�
+                        textRenderData.setText("缁撹@Conclusion");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                } else if (i == 2 + a.getInsProduct().size()) {
+                    //鏈�鍚庝竴琛�
+                    if (j == 0 || j == 1) {
+                        //绗竴鍒楀拰绗簩鍒�
+                        textRenderData.setText("澶囨敞鈭�5");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    } else {
+                        //鍏朵綑鍒�
+                        textRenderData.setText("鈥溾垰鈥濊〃绀洪」鐩悎鏍硷紝鈥溍椻�濊〃绀洪」鐩笉鍚堟牸銆侤鈥溾垰鈥� indicates test item is qualified,鈥溍椻�� indicates test item is not qualified 鈭�6");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                } else {
+                    //鍏朵綑琛�
+                    if (j == 0) {
+                        //绗竴鍒�
+                        textRenderData.setText(index + "鈭�2" + index);
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    } else if (j == 1) {
+                        //绗簩鍒�
+                        InsProduct insProduct = a.getInsProduct().get(i - 2);
+                        if (ObjectUtil.isNotEmpty(insProduct.getInspectionItemSubclass())) {
+                            if (ObjectUtil.isNotEmpty(insProduct.getInspectionItemEn())) {
+                                String str = MyUtil.joinChars("@",insProduct.getInspectionItem(),insProduct.getInspectionItemEn());
+                                textRenderData.setText(str + "鈭�3" + str);
+                            } else {
+                                textRenderData.setText(insProduct.getInspectionItem() + "鈭�3" + insProduct.getInspectionItem());
+                            }
+                        } else {
+                            if (ObjectUtil.isNotEmpty(insProduct.getInspectionItemEn())) {
+                                String str = MyUtil.joinChars("@",insProduct.getInspectionItem(),insProduct.getInspectionItemEn());
+                                textRenderData.setText(str + "鈭�3" + str);
+                            } else {
+                                textRenderData.setText(insProduct.getInspectionItem() + "鈭�3" + insProduct.getInspectionItem());
+                            }
+                        }
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    } else if (j == 2) {
+                        //绗笁鍒�
+                        InsProduct insProduct = a.getInsProduct().get(i - 2);
+                        if (ObjectUtil.isNotEmpty(insProduct.getInspectionItemSubclass())) {
+                            if (ObjectUtil.isNotEmpty(insProduct.getInspectionItemSubclassEn())) {
+                                String str = MyUtil.joinChars("@",insProduct.getInspectionItemSubclass(),insProduct.getInspectionItemSubclassEn());
+                                textRenderData.setText(str);
+                            } else {
+                                textRenderData.setText(insProduct.getInspectionItemSubclass());
+                            }
+                        } else {
+                            if (ObjectUtil.isNotEmpty(insProduct.getInspectionItemEn())) {
+                                String str = MyUtil.joinChars("@",insProduct.getInspectionItem(),insProduct.getInspectionItemEn());
+                                textRenderData.setText(str + "鈭�3" + str);
+                            } else {
+                                textRenderData.setText(insProduct.getInspectionItem() + "鈭�3" + insProduct.getInspectionItem());
+                            }
+                        }
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    } else if (j == 3) {
+                        //绗洓鍒�
+                        textRenderData.setText(ObjectUtil.isNotEmpty(a.getInsProduct().get(i - 2).getUnit()) ? a.getInsProduct().get(i - 2).getUnit() : "");
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    } else if (j == 4) {
+                        //绗簲鍒�
+                        textRenderData.setText(a.getInsProduct().get(i - 2).getTell());
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    } else if (j == 5) {
+                        //绗叚鍒�
+                        textRenderData.setText(a.getInsProduct().get(i - 2).getLastValue());
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    } else {
+                        //绗竷鍒�
+                        InsProduct p = a.getInsProduct().get(i - 2);
+                        if (p.getInsResult() == 0) {
+                            textRenderData.setText("脳");
+                        } else if (a.getInsProduct().get(i - 2).getInsResult() == 1) {
+                            textRenderData.setText("鈭�");
+                        } else {
+                            textRenderData.setText("-");
+                        }
+                        renderData.add(textRenderData);
+                        paragraphRenderData.setContents(renderData);
+                        paragraphRenderDataList.add(paragraphRenderData);
+                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                        cells.add(cellRenderData);
+                    }
+                }
+            }
+            rowRenderData.setCells(cells);
+            if (!rowRenderData.getCells().isEmpty()) {
+                rows.add(rowRenderData);
+            }
+        }
+        //鍐欏叆琛ㄦ牸鐨勮
+        TableRenderData tableRenderData = new TableRenderData();
+        tableRenderData.setRows(rows);
+
+        List<TableRenderData> tables1 = new ArrayList<>();
+        tableRenderData.setRows(new ArrayList<>());
+        double totalHeight = 0;
+        double heightThreshold = 700.0; // 鍗曢〉楂樺害闃堝��
+        List<RowRenderData> firstTwoRows = new ArrayList<>(); // 淇濆瓨鍓嶄袱琛屼互渚垮鍒跺埌鏂拌〃鏍�
+        List<RowRenderData> endRows = new ArrayList<>(); // 淇濆瓨鍓嶄袱琛屼互渚垮鍒跺埌鏂拌〃鏍�
+        // 淇濆瓨鍓嶄袱琛屼互渚垮鍒跺埌鏂拌〃鏍�
+        firstTwoRows.add(rows.get(0));
+        firstTwoRows.add(rows.get(1));
+        endRows.add(rows.get(rows.size() - 1));
+        for (RowRenderData row : rows) {
+            double rowHeight = row.getRowStyle().getHeight(); // 鑾峰彇褰撳墠琛岀殑琛岄珮
+            // 鍒ゆ柇瀛椾綋鍐呭鏄惁鏈夊鐨�, 澶氱殑琛岄珮涔樺�嶆暟
+            RowRenderData lastRaw = rows.get(rows.size() - 1);
+            // 鎺掗櫎鏈�鍚庝竴琛�
+            if (rows.get(0) != row && rows.get(1) != row  && lastRaw != row) {
+                // 璋冩暣楂樺害
+                rowHeight = adjustRowHeight(row, rowHeight);
+            }
+            totalHeight += rowHeight; // 鏇存柊鎬昏楂�
+            if (totalHeight> heightThreshold) {
+                tableRenderData.getRows().addAll(endRows);
+                // 鍒涘缓鏂拌〃鏍煎苟澶嶅埗鍓嶄袱琛�
+                TableRenderData newTableRenderData = new TableRenderData();
+                newTableRenderData.setRows(new ArrayList<>(firstTwoRows));
+                //璁剧疆鏍峰紡
+                TableStyle tableStyle = new TableStyle();
+                tableStyle.setColWidths(colWidths);
+                tableStyle.setWidth("10000");
+                tableStyle.setAlign(TableRowAlign.CENTER);
+                BorderStyle borderStyle = new BorderStyle();
+                borderStyle.setColor("000000");
+                borderStyle.setType(XWPFTable.XWPFBorderType.THICK);
+                borderStyle.setSize(14);
+                tableStyle.setLeftBorder(borderStyle);
+                tableStyle.setTopBorder(borderStyle);
+                tableStyle.setRightBorder(borderStyle);
+                tableStyle.setBottomBorder(borderStyle);
+                tableRenderData.setTableStyle(tableStyle);
+                newTableRenderData.setTableStyle(tableStyle);
+                // 娣诲姞鏈�鍚庝竴琛�
+                tableRenderData.addRow(rows.get(rows.size() - 1));
+                tables1.add(tableRenderData);
+                tableRenderData = newTableRenderData;
+                totalHeight = 180 + rowHeight;//180涓烘柊椤甸潰琛ㄥご鍜屾渶鍚庝竴琛岀殑楂樺害
+            }
+            tableRenderData.getRows().add(row);
+        }
+        if (!tableRenderData.getRows().isEmpty() && tableRenderData.getRows().size() != 3) {
+            //璁剧疆鏍峰紡
+            TableStyle tableStyle = new TableStyle();
+            tableStyle.setColWidths(colWidths);
+            tableStyle.setWidth("10000");
+            tableStyle.setAlign(TableRowAlign.CENTER);
+            BorderStyle borderStyle = new BorderStyle();
+            borderStyle.setColor("000000");
+            borderStyle.setType(XWPFTable.XWPFBorderType.THICK);
+            borderStyle.setSize(14);
+            tableStyle.setLeftBorder(borderStyle);
+            tableStyle.setTopBorder(borderStyle);
+            tableStyle.setRightBorder(borderStyle);
+            tableStyle.setBottomBorder(borderStyle);
+            tableRenderData.setTableStyle(tableStyle);
+            tables1.add(tableRenderData);
+        }
+        tables1.forEach(table -> {
+            Map<String, Object> tableMap = new HashMap<>();
+            tableMap.put("table", table);
+            tableMap.put("report", insReport);
+            tables.add(tableMap);
+        });
+    }
+
+
+
+    /**
+     * 璋冩暣楂樺害
+     * @param row
+     * @param rowHeight
+     * @return
+     */
+    private static double adjustRowHeight(RowRenderData row, double rowHeight) {
+        // 鏍规嵁妫�楠岄」鐩悕绉拌繘琛岄珮搴﹁皟鏁�
+        //鏍规嵁妫�楠岄」(i:1)銆佹楠屽瓙椤�(i:2)銆佹爣鍑嗚姹�(i:4)涓瓧绗︽渶闀跨殑鏉ヨ绠�
+        TextRenderData insItemData = (TextRenderData) row.getCells().get(1).getParagraphs().get(0).getContents().get(0);
+        if(insItemData.getText().contains("鎴愬垎鍒嗘瀽")){
+            return rowHeight;
+        }
+        TextRenderData insSubItemData = (TextRenderData) row.getCells().get(2).getParagraphs().get(0).getContents().get(0);
+        TextRenderData requiredData = (TextRenderData) row.getCells().get(4).getParagraphs().get(0).getContents().get(0);
+        String dataText = insItemData.getText();
+        if(insSubItemData.getText().length()>dataText.length()){
+            dataText = insSubItemData.getText();
+        }
+        if(Objects.nonNull(requiredData) && requiredData.getText().length()>dataText.length()){
+            dataText = requiredData.getText();
+        }
+        TextRenderData valueData = (TextRenderData) row.getCells().get(5).getParagraphs().get(0).getContents().get(0);
+        String valueText = valueData.getText();
+        // 鑾峰彇妫�娴嬪唴瀹瑰垽鏂槸鍚﹁秴鍑�
+        if (StringUtils.isNotBlank(dataText)) {
+            double number = 1;
+            double chinaLength = 10;
+            double englishLength = 20;
+            double valueLength = 2;
+            // 鏍规嵁@绗﹀彿鎴彇涓嫳鏂�
+            String[] splits = dataText.split("鈭�");
+            String[] split;
+            if(splits.length>0){
+                split = splits[0].split("@");
+            }else{
+                split = dataText.split("@");
+            }
+            // 鏂囧瓧鍊嶆暟
+            double chinaMultiple = (Math.ceil(split[0].length() / chinaLength)) - 1;
+            // 鑻辨枃鍊嶆暟
+            double englishMultiple = 0;
+            if(split.length>1){
+                englishMultiple = (Math.ceil(split[1].length() / englishLength)) - 1;
+            }
+            double multiple = number + chinaMultiple * 0.5 + englishMultiple * 0.5;
+            if (StringUtils.isNotBlank(valueText)) {
+                double valueMultiple = (Math.ceil(valueText.length() / valueLength)) - 1;
+                if (multiple < number + valueMultiple * 0.4) {
+                    multiple = number + valueMultiple * 0.4;
+                }
+            }
+            rowHeight = rowHeight * multiple;
+        }
+        return rowHeight;
+    }
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/handler/FiberConfigReportHandler.java b/cnas-require/src/main/java/com/ruoyi/requier/handler/FiberConfigReportHandler.java
new file mode 100644
index 0000000..0977bdb
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/handler/FiberConfigReportHandler.java
@@ -0,0 +1,617 @@
+package com.ruoyi.requier.handler;
+
+import com.deepoove.poi.data.*;
+import com.deepoove.poi.data.style.*;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.framework.util.MyUtil;
+import com.ruoyi.inspect.dto.SampleProductDto;
+import com.ruoyi.inspect.mapper.InsProductMapper;
+import com.ruoyi.inspect.mapper.InsSampleMapper;
+import com.ruoyi.inspect.pojo.InsProduct;
+import com.ruoyi.inspect.pojo.InsReport;
+import com.ruoyi.inspect.pojo.InsSample;
+import com.ruoyi.inspect.vo.InsProductFiberVO;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
+import org.apache.poi.xwpf.usermodel.TableRowAlign;
+import org.apache.poi.xwpf.usermodel.XWPFTable;
+import org.apache.poi.xwpf.usermodel.XWPFTableCell;
+
+import java.text.Collator;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+/**
+ * 鍏夌氦閰嶇疆鎶ュ憡澶勭悊绫�
+ */
+public class FiberConfigReportHandler {
+
+    /**
+     * 榛樿琛ㄦ牸瀹藉害
+     */
+    private final static int[] DEFAULT_COL_WIDTHS = {1600,0, 1200, 1200, 1200, 1200, 1200, 1200,1200};
+
+    private final InsProductMapper insProductMapper;
+    private final InsSampleMapper insSampleMapper;
+
+    public FiberConfigReportHandler(InsProductMapper insProductMapper, InsSampleMapper insSampleMapper){
+        this.insProductMapper = insProductMapper;
+        this.insSampleMapper = insSampleMapper;
+    }
+
+    private final static String ITEM_SPLIT_CHAR = "&";//妫�楠岄」鍒嗛殧绗�
+
+    private final static String COLOR_SPLIT_CHAR = "-";//鑹叉爣鍒嗛殧绗�
+
+    /**
+     *
+     * @param samples    鎵�鏈夋牱鍝�
+     * @param insReport  report瀵硅薄
+     * @param tables2    鍏夌氦閰嶇疆闄勪欢琛ㄦ牸琛屽垪琛�
+     * @param colorDict  鑹叉爣瀛楀吀
+     */
+    public void doWrite(List<SampleProductDto> samples, InsReport insReport, List<Map<String,Object>> tables2,
+                        List<String> colorDict){
+        AtomicInteger index2 = new AtomicInteger(1);//椤电爜
+        samples.forEach(sample -> {
+            //鏌ヨ鏍峰搧涓嬬殑妫�楠岄」鍜岃壊鏍�
+            List<InsProductFiberVO> insProducts1 = insProductMapper.selectInsProductInsFiberList(sample.getId());
+            //鏍规嵁鑹叉爣鍒嗙粍
+            Map<String,List<InsProductFiberVO>> groupProducts = insProducts1.stream()
+                    .filter(p->!p.getInspectionItem().equals("鍏夌氦鎺ュご鎹熻��"))
+                    .collect(Collectors.groupingBy(product -> product.getBushColor()+"-"+product.getColor()));
+            if(groupProducts.isEmpty()){
+                return;
+            }
+            List<String[]> collect = groupProducts.keySet().stream().map(k -> k.split(COLOR_SPLIT_CHAR)).sorted((o1, o2) -> {
+                if (o1.length > 1 && o2.length > 1) {
+                    if (!Objects.equals(o1[0], o2[0])) {
+                        Integer o1Index = colorDict.indexOf(o1[0]);
+                        Integer o2Index = colorDict.indexOf(o2[0]);
+                        return o1Index.compareTo(o2Index);
+                    }
+                    if (!Objects.equals(o1[1], o2[1])) {
+                        Integer o1Index = colorDict.indexOf(o1[1]);
+                        Integer o2Index = colorDict.indexOf(o2[1]);
+                        return o1Index.compareTo(o2Index);
+                    }
+                }
+                return 0;
+            }).collect(Collectors.toList());
+            List<String> sortKeys = collect.stream().map(c->String.join(COLOR_SPLIT_CHAR,c)).collect(Collectors.toList());
+            //妫�楠岄」鍒楄〃(琛ㄥご)
+            List<String> itemMap = insProducts1.stream().sorted((o1,o2)->{
+                //鏍规嵁妫�楠岄」鎺掑簭
+                if(!Objects.equals(o1.getInspectionItem(),o2.getInspectionItem())){
+                    List<String> specialItems = Arrays.asList("鑰愮幆澧冨簲鍔涘紑瑁�","鐑敹缂╃巼");
+                    if(specialItems.contains(o1.getInspectionItem()) && specialItems.contains(o2.getInspectionItem())){
+                        return Integer.MAX_VALUE;
+                    }
+                    Collator instance = Collator.getInstance(Locale.CHINA);
+                    return instance.compare(o1.getInspectionItem(),o2.getInspectionItem());
+                }
+                //妫�楠屽瓙椤规帓搴�
+                if(StringUtils.isNotBlank(o1.getInspectionItemSubclass())&& StringUtils.isNotBlank(o2.getInspectionItemSubclass())){
+                    if(!Objects.equals(o1.getInspectionItemSubclass(),o2.getInspectionItemSubclass())){
+                        Collator instance = Collator.getInstance(Locale.CHINA);
+                        return instance.compare(o1.getInspectionItemSubclass(),o2.getInspectionItemSubclass());
+                    }
+                }
+                return 0;
+            }).map(insProduct -> {
+                String item = MyUtil.joinChars("@",insProduct.getInspectionItem(),insProduct.getInspectionItemEn());
+                String itemSubClass = MyUtil.joinChars("@",insProduct.getInspectionItemSubclass(),insProduct.getInspectionItemSubclassEn());
+                return MyUtil.joinChars(ITEM_SPLIT_CHAR,item,itemSubClass);
+            }).distinct().collect(Collectors.toList());
+            long size = itemMap.size();
+            long size2 = insProducts1.stream().map(InsProduct::getInsFiberId).distinct().count();
+            long number = 7;
+            long k = 0;
+            //鍒ゆ柇妫�楠岄」鐩槸鍚︽湁鐖跺瓙鍏崇郴
+            int a = itemMap.stream().anyMatch(p -> p.split(ITEM_SPLIT_CHAR).length>0) ? 2 : 1;
+            for (long c = 0; c < size; c++) {
+                if (c % number == 0) {
+                    List<RowRenderData> rows = new ArrayList<>();
+                    //琛ㄦ牸鐨勮鏁�
+                    for (long i = 0; i < size2 + a + 1; i++) {
+                        RowRenderData rowRenderData = new RowRenderData();
+                        RowStyle rowStyle = new RowStyle();
+                        rowStyle.setHeight(40);
+                        rowRenderData.setRowStyle(rowStyle);
+                        List<CellRenderData> cells = new ArrayList<>();
+                        //琛ㄦ牸鐨勫垪鏁�
+                        for (long j = 0; j < 9; j++) {
+                            CellRenderData cellRenderData = new CellRenderData();
+                            CellStyle cellStyle = new CellStyle();
+                            cellStyle.setVertAlign(XWPFTableCell.XWPFVertAlign.CENTER);
+                            cellRenderData.setCellStyle(cellStyle);
+                            List<ParagraphRenderData> paragraphRenderDataList = new ArrayList<>();
+                            ParagraphRenderData paragraphRenderData = new ParagraphRenderData();
+                            ParagraphStyle paragraphStyle = new ParagraphStyle();
+                            paragraphStyle.setAlign(ParagraphAlignment.CENTER);
+                            paragraphRenderData.setParagraphStyle(paragraphStyle);
+                            List<RenderData> renderData = new ArrayList<>();
+                            TextRenderData textRenderData = new TextRenderData();
+                            Style style = new Style();
+                            style.setFontFamily("瀹嬩綋");
+                            style.setColor("000000");
+                            style.setFontSize(10);
+                            textRenderData.setStyle(style);
+                            if(i==0){
+                                //绗竴琛�
+                                if (j == 0) {
+                                    //绗竴鍒�
+                                    textRenderData.setText("鏍峰搧缂栧彿@Sample number鈭�456");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 1) {
+                                    //绗簩鍒�
+                                    textRenderData.setText("鏍峰搧缂栧彿@Sample number鈭�456");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 2) {
+                                    //绗簩鍒�
+                                    textRenderData.setText(sample.getSampleCode()+"鈭�4566");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }else if (j == 3) {
+                                    //绗簩鍒�
+                                    textRenderData.setText(sample.getSampleCode()+"鈭�4566");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }else if (j == 4) {
+                                    //绗簩鍒�
+                                    textRenderData.setText("瑙勬牸鍨嬪彿@Type鈭�457");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }else if (j == 5) {
+                                    //绗簩鍒�
+                                    textRenderData.setText("瑙勬牸鍨嬪彿@Type鈭�457");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }else if (j == 6) {
+                                    //绗簩鍒�
+                                    textRenderData.setText(sample.getModel()+"鈭�4577");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }else if (j == 7) {
+                                    //绗簩鍒�
+                                    textRenderData.setText(sample.getModel()+"鈭�4577");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }else{
+                                    //绗簩鍒�
+                                    textRenderData.setText(sample.getModel()+"鈭�4577");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                            else if (i == 1) {
+                                //绗簩琛�
+                                if (j == 0) {
+                                    //绗竴鍒�
+                                    textRenderData.setText("绠¤壊鏍嘆Pipe鈭�100");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 1) {
+                                    //绗簩鍒�
+                                    textRenderData.setText("鍏夌氦鑹叉爣@Scanning Number鈭�101");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else {
+                                    if(itemMap.size()>(int) (j - 2 + k)){
+                                        String inspectionItem = itemMap.get((int) (j - 2 + k)).split(ITEM_SPLIT_CHAR)[0];
+                                        textRenderData.setText( inspectionItem + "鈭�" + inspectionItem);
+                                        renderData.add(textRenderData);
+                                        paragraphRenderData.setContents(renderData);
+                                        paragraphRenderDataList.add(paragraphRenderData);
+                                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                                        cells.add(cellRenderData);
+                                    }else{
+                                        String inspectionItem = itemMap.get(itemMap.size()-1).split(ITEM_SPLIT_CHAR)[0];
+                                        textRenderData.setText("鈭�" + inspectionItem);
+                                        renderData.add(textRenderData);
+                                        paragraphRenderData.setContents(renderData);
+                                        paragraphRenderDataList.add(paragraphRenderData);
+                                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                                        cells.add(cellRenderData);
+                                    }
+                                }
+                            }
+                            else if (a == 2 && i == 2) {
+                                //鏈夌埗瀛愰」鐩叧绯荤殑绗笁琛�
+                                if (j == 0) {
+                                    //绗竴鍒�
+                                    textRenderData.setText("绠¤壊鏍嘆Pipe鈭�100");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 1) {
+                                    //绗簩鍒�
+                                    textRenderData.setText("鍏夌氦鑹叉爣@Scanning Number鈭�101");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else {
+                                    //椤圭洰淇℃伅
+                                    if(itemMap.size()>(int)(j - 2 + k)){
+                                        //鍒ゆ柇鏄惁鏈夐」鐩瓙绫�
+                                        String[] splits = itemMap.get((int) (j - 2 + k)).split(ITEM_SPLIT_CHAR);
+                                        if (splits.length<2 || "@".equals(splits[1])) {
+                                            textRenderData.setText(splits[0] + "鈭�" + splits[0]);
+                                        } else {
+                                            textRenderData.setText(splits[1]+"鈭�"+splits[0]+splits[1]);
+                                        }
+                                        renderData.add(textRenderData);
+                                        paragraphRenderData.setContents(renderData);
+                                        paragraphRenderDataList.add(paragraphRenderData);
+                                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                                        cells.add(cellRenderData);
+                                    }else{
+                                        //鍒ゆ柇鏄惁鏈夐」鐩瓙绫�
+                                        String[] splits = itemMap.get(itemMap.size()-1).split(ITEM_SPLIT_CHAR);
+                                        if (splits.length<2 || "@".equals(splits[1])) {
+                                            textRenderData.setText("鈭�" + splits[0]);
+                                        } else {
+                                            textRenderData.setText("鈭�"+splits[0]+splits[1]);
+                                        }
+                                        renderData.add(textRenderData);
+                                        paragraphRenderData.setContents(renderData);
+                                        paragraphRenderDataList.add(paragraphRenderData);
+                                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                                        cells.add(cellRenderData);
+                                    }
+                                }
+                            }
+                            else{
+                                //寰幆鑹叉爣
+                                String key = sortKeys.get((int)i-3);
+                                if(itemMap.size()>(int) (j - 2 + k)) {
+                                    int index = Math.max((int) (j - 2 + k), 0);
+                                    String item = itemMap.get(index);
+                                    InsProductFiberVO insProduct = groupProducts.get(key).stream()
+                                            .filter(p->{
+                                                String insItem = MyUtil.joinChars("@",p.getInspectionItem(),p.getInspectionItemEn());
+                                                String insSubItem = MyUtil.joinChars("@",p.getInspectionItemSubclass(),p.getInspectionItemSubclassEn());
+                                                return item.equals(MyUtil.joinChars(ITEM_SPLIT_CHAR,insItem,insSubItem));
+                                            }).findFirst().orElse(new InsProductFiberVO());
+                                    //濉��
+                                    if (j == 0) {
+                                        //绗竴鍒�
+                                        textRenderData.setText(insProduct.getBushColor());
+                                        renderData.add(textRenderData);
+                                        paragraphRenderData.setContents(renderData);
+                                        paragraphRenderDataList.add(paragraphRenderData);
+                                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                                        cells.add(cellRenderData);
+                                    } else if (j == 1) {
+                                        //绗簩鍒�
+                                        textRenderData.setText(insProduct.getColor());
+                                        renderData.add(textRenderData);
+                                        paragraphRenderData.setContents(renderData);
+                                        paragraphRenderDataList.add(paragraphRenderData);
+                                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                                        cells.add(cellRenderData);
+                                    } else {
+                                        //椤圭洰淇℃伅
+                                        if((index+1)==groupProducts.get(key).size()){
+                                            textRenderData.setText(insProduct.getLastValue()+"鈭憀ast"+key);
+                                        }else{
+                                            textRenderData.setText(insProduct.getLastValue());
+                                        }
+                                        renderData.add(textRenderData);
+                                        paragraphRenderData.setContents(renderData);
+                                        paragraphRenderDataList.add(paragraphRenderData);
+                                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                                        cells.add(cellRenderData);
+                                    }
+                                } else {
+
+                                    textRenderData.setText("鈭憀ast"+key);
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                        }
+                        rowRenderData.setCells(cells);
+                        if (!rowRenderData.getCells().isEmpty()) {
+                            rows.add(rowRenderData);
+                        }
+                    }
+                    TableRenderData tableRenderData = new TableRenderData();
+                    tableRenderData.setRows(rows);
+                    int countSize = tableRenderData.getRows().get(0).getCells().size();
+                    for (RowRenderData row : tableRenderData.getRows()) {
+                        if (row.getCells().size() != countSize) {
+                            throw new ErrorException("姣忚鍗曞厓鏍间笉鐩哥瓑4");
+                        }
+                    }
+                    TableStyle tableStyle = new TableStyle();
+                    tableStyle.setWidth(XWPFTable.DEFAULT_PERCENTAGE_WIDTH);
+                    tableStyle.setAlign(TableRowAlign.CENTER);
+                    BorderStyle borderStyle = new BorderStyle();
+                    borderStyle.setColor("000000");
+                    borderStyle.setType(XWPFTable.XWPFBorderType.THICK);
+                    borderStyle.setSize(14);
+                    tableStyle.setLeftBorder(borderStyle);
+                    tableStyle.setTopBorder(borderStyle);
+                    tableStyle.setRightBorder(borderStyle);
+                    tableStyle.setBottomBorder(borderStyle);
+                    tableRenderData.setTableStyle(tableStyle);
+                    Map<String, Object> table = new HashMap<>();
+                    table.put("table2", tableRenderData);
+                    table.put("report", insReport);
+                    table.put("sample_number", sample.getSampleCode());
+                    table.put("type", sample.getModel());
+                    table.put("index2", index2.get());
+                    tables2.add(table);
+                    k += 7;
+                    index2.getAndIncrement();
+                }
+            }
+        });
+    }
+
+
+    /**
+     * 鍏夌氦闄勪欢琛ㄦ牸锛氬啓鍏ヨ鏁版嵁
+     * @param fiberList 鍏夌氦椤圭洰淇℃伅
+     * @param tables2   鍏夌氦闄勪欢琛ㄦ牸
+     */
+    public void writeFiberEnclosureTableRow(List<InsProduct> fiberList, List<Map<String, Object>> tables2,InsReport insReport) {
+        AtomicInteger index2 = new AtomicInteger(1);//椤电爜
+        int colCount = 9;//琛ㄦ牸鎬诲垪鏁�
+        int itemCount = 7;//琛ㄦ牸椤圭洰鍒楁暟
+        int k = 0;//宸查亶鍘嗘楠岄」鏁伴噺
+        //妫�楠岄」鍒楄〃(琛ㄥご)
+        List<String> itemMap = fiberList.stream().map(insProduct -> {
+            String item = MyUtil.joinChars("@",insProduct.getInspectionItem(),insProduct.getInspectionItemEn());
+            String itemSubClass = MyUtil.joinChars("@",insProduct.getInspectionItemSubclass(),insProduct.getInspectionItemSubclassEn());
+            return MyUtil.joinChars(ITEM_SPLIT_CHAR,item,itemSubClass);
+        }).sorted(Comparator.naturalOrder()).distinct().collect(Collectors.toList());
+        //鏍规嵁鏍峰搧id鍒嗙粍
+        Map<Integer,List<InsProduct>> groupProducts = fiberList.stream()
+                .collect(Collectors.groupingBy(InsProduct::getInsSampleId));
+        //sampleId椤哄簭鎺掑簭
+        List<Integer> sortKeys = groupProducts.keySet().stream().sorted(Comparator.naturalOrder()).collect(Collectors.toList());
+        //鍒ゆ柇妫�楠岄」鐩槸鍚︽湁鐖跺瓙鍏崇郴
+        int a = itemMap.stream().anyMatch(p -> p.split(ITEM_SPLIT_CHAR).length>0) ? 2 : 1;
+        for (int c = 0; c < itemMap.size(); c++) {
+            if (c % itemCount == 0) {
+                List<RowRenderData> rows = new ArrayList<>();
+                //琛ㄦ牸鐨勮鏁�(鏍峰搧鏁伴噺+琛ㄥご)
+                int tableRow = sortKeys.size() + a;
+                for (int i = 0; i < tableRow; i++) {
+                    RowRenderData rowRenderData = new RowRenderData();
+                    RowStyle rowStyle = new RowStyle();
+                    rowStyle.setHeight(40);
+                    rowRenderData.setRowStyle(rowStyle);
+                    List<CellRenderData> cells = new ArrayList<>();
+                    //琛ㄦ牸鐨勫垪鏁�
+                    for (int j = 0; j < colCount; j++) {
+                        CellRenderData cellRenderData = new CellRenderData();
+                        CellStyle cellStyle = new CellStyle();
+                        cellStyle.setVertAlign(XWPFTableCell.XWPFVertAlign.CENTER);
+                        cellRenderData.setCellStyle(cellStyle);
+                        List<ParagraphRenderData> paragraphRenderDataList = new ArrayList<>();
+                        ParagraphRenderData paragraphRenderData = new ParagraphRenderData();
+                        ParagraphStyle paragraphStyle = new ParagraphStyle();
+                        paragraphStyle.setAlign(ParagraphAlignment.CENTER);
+                        paragraphRenderData.setParagraphStyle(paragraphStyle);
+                        List<RenderData> renderData = new ArrayList<>();
+                        TextRenderData textRenderData = new TextRenderData();
+                        Style style = new Style();
+                        style.setFontFamily("瀹嬩綋");
+                        style.setColor("000000");
+                        style.setFontSize(10);
+                        textRenderData.setStyle(style);
+                        //绗竴琛�
+                        if(i==0){
+                            if (j < 2) {
+                                //绗竴鍒�
+                                textRenderData.setText("鏍峰搧缂栧彿@Sample number鈭�45678");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else{
+                                //鐢熸垚琛ㄥご
+                                if(itemMap.size()> (j - 2 + k)){
+                                    String inspectionItem = itemMap.get(j - 2 + k).split(ITEM_SPLIT_CHAR)[0];
+                                    textRenderData.setText( inspectionItem + "鈭�" + inspectionItem);
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }else{
+                                    String inspectionItem = itemMap.get(itemMap.size()-1).split(ITEM_SPLIT_CHAR)[0];
+                                    textRenderData.setText("鈭�" + inspectionItem);
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                        }
+                        else if (a == 2 && i == 1) {
+                            //鏈夌埗瀛愰」鐩叧绯荤殑绗簩琛�
+                            if (j < 2) {
+                                //绗竴鍒�
+                                textRenderData.setText("鏍峰搧缂栧彿@Sample number鈭�45678");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else {
+                                //椤圭洰淇℃伅
+                                if(itemMap.size()> (j - 2 + k)){
+                                    //鍒ゆ柇鏄惁鏈夐」鐩瓙绫�
+                                    String[] splits = itemMap.get(j - 2 + k).split(ITEM_SPLIT_CHAR);
+                                    if (splits.length<2 || "@".equals(splits[1])) {
+                                        textRenderData.setText(splits[0] + "鈭�" + splits[0]);
+                                    } else {
+                                        textRenderData.setText(splits[1]+"鈭�"+splits[0]+splits[1]);
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }else{
+                                    //鍒ゆ柇鏄惁鏈夐」鐩瓙绫�
+                                    String[] splits = itemMap.get(itemMap.size()-1).split(ITEM_SPLIT_CHAR);
+                                    if (splits.length<2 || "@".equals(splits[1])) {
+                                        textRenderData.setText("鈭�" + splits[0]);
+                                    } else {
+                                        textRenderData.setText("鈭�"+splits[0]+splits[1]);
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                        }
+                        else{
+                            //寰幆鏍峰搧
+                            Integer key = sortKeys.get(i-2);
+                            if(itemMap.size()>j - 2 + k) {
+                                //鏌ヨ褰撳墠鏍峰搧淇℃伅
+                                InsSample insSample = insSampleMapper.selectById(key);
+                                int index = Math.max(j - 2 + k, 0);
+                                String item = itemMap.get(index);
+                                InsProduct insProduct = groupProducts.get(key).stream()
+                                        .filter(p->{
+                                            String insItem = MyUtil.joinChars("@",p.getInspectionItem(),p.getInspectionItemEn());
+                                            String insItemSubClass = MyUtil.joinChars("@",p.getInspectionItemSubclass(),p.getInspectionItemSubclassEn());
+                                            return item.equals(MyUtil.joinChars(ITEM_SPLIT_CHAR,insItem,insItemSubClass));
+                                        })
+                                        .findFirst().orElse(new InsProduct());
+                                //濉��
+                                if (j < 2) {
+                                    //绗竴鍒�
+                                    textRenderData.setText(insSample.getSampleCode()+"鈭�"+key);
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else {
+                                    //椤圭洰淇℃伅
+                                    if((index+1)==groupProducts.get(key).size()){
+                                        textRenderData.setText(insProduct.getLastValue()+"鈭憀ast"+key);
+                                    }else{
+                                        textRenderData.setText(insProduct.getLastValue());
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            } else {
+                                textRenderData.setText("鈭憀ast"+key);
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                        }
+                    }
+                    rowRenderData.setCells(cells);
+                    if (!rowRenderData.getCells().isEmpty()) {
+                        rows.add(rowRenderData);
+                    }
+                }
+                TableRenderData tableRenderData = new TableRenderData();
+                tableRenderData.setRows(rows);
+                int countSize = tableRenderData.getRows().get(0).getCells().size();
+                for (RowRenderData row : tableRenderData.getRows()) {
+                    if (row.getCells().size() != countSize) {
+                        throw new ErrorException("鍏夌氦鎶ュ憡闄勪欢琛ㄦ牸鍒楁暟涓嶅尮閰�");
+                    }
+                }
+                TableStyle tableStyle = new TableStyle();
+                tableStyle.setWidth(XWPFTable.DEFAULT_PERCENTAGE_WIDTH);
+//                tableStyle.setColWidths(DEFAULT_COL_WIDTHS);
+//                tableStyle.setWidth("10000");
+                tableStyle.setAlign(TableRowAlign.CENTER);
+                BorderStyle borderStyle = new BorderStyle();
+                borderStyle.setColor("000000");
+                borderStyle.setType(XWPFTable.XWPFBorderType.THICK);
+                borderStyle.setSize(14);
+                tableStyle.setLeftBorder(borderStyle);
+                tableStyle.setTopBorder(borderStyle);
+                tableStyle.setRightBorder(borderStyle);
+                tableStyle.setBottomBorder(borderStyle);
+                tableRenderData.setTableStyle(tableStyle);
+                Map<String, Object> table = new HashMap<>();
+                table.put("table2", tableRenderData);
+                table.put("report", insReport);
+                table.put("index2", index2.get());
+                tables2.add(table);
+                k += 7;
+                index2.getAndIncrement();
+            }
+        }
+
+
+    }
+
+    /**
+     * 鍏夌氦闄勪欢琛ㄦ牸锛氬啓鍏ヨ鏁版嵁
+     * @param ribbonList 鍏夌氦椤圭洰淇℃伅
+     * @param tables6   鍏夌氦甯﹀昂瀵稿弬鏁伴檮浠惰〃鏍�
+     */
+    public void writeFiberOpticRibbonEnclosureTableRow(List<InsProduct> ribbonList, List<Map<String, Object>> tables6,InsReport insReport){
+
+    }
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/handler/FiberOpticConnectorLossReportHandler.java b/cnas-require/src/main/java/com/ruoyi/requier/handler/FiberOpticConnectorLossReportHandler.java
new file mode 100644
index 0000000..ae64968
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/handler/FiberOpticConnectorLossReportHandler.java
@@ -0,0 +1,210 @@
+package com.ruoyi.requier.handler;
+
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.deepoove.poi.data.*;
+import com.deepoove.poi.data.style.*;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.framework.util.MyUtil;
+import com.ruoyi.inspect.mapper.InsProductMapper;
+import com.ruoyi.inspect.pojo.InsProduct;
+import com.ruoyi.inspect.pojo.InsReport;
+import com.ruoyi.inspect.pojo.InsSample;
+import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
+import org.apache.poi.xwpf.usermodel.TableRowAlign;
+import org.apache.poi.xwpf.usermodel.XWPFTable;
+import org.apache.poi.xwpf.usermodel.XWPFTableCell;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 鍏夌氦鎺ュご鎹熻�楁姤鍛婂鐞嗙被
+ */
+public class FiberOpticConnectorLossReportHandler {
+
+    private final InsProductMapper insProductMapper;
+
+    public FiberOpticConnectorLossReportHandler(InsProductMapper insProductMapper){
+        this.insProductMapper = insProductMapper;
+    }
+
+    /**
+     *
+     * @param insProducts0 褰撳墠璁㈠崟涓嬬殑鎵�鏈夋楠岄」
+     * @param insSamples   褰撳墠璁㈠崟鎵�鏈夋牱鍝�
+     * @param insReport    report瀵硅薄
+     * @param tables4      鍏夌氦鎺ュご鎹熻�楅檮浠惰〃鏍艰鏁版嵁
+     */
+    public void doWrite(List<InsProduct> insProducts0,
+                        List<InsSample> insSamples,
+                        InsReport insReport,
+                        List<Map<String,Object>> tables4){
+//            //鍘婚噸鐨勬楠岄」鐩�
+            List<String> filteredProducts = insProducts0.stream()
+                    .map(insProduct -> (MyUtil.joinChars(",",insProduct.getInspectionItem(),insProduct.getInspectionItemEn(),insProduct.getInspectionItemSubclass(),insProduct.getInspectionItemSubclassEn(),insProduct.getTell())))
+                    .distinct().collect(Collectors.toList());
+            long index4 = 0;
+            //鍏夌氦鎺ュご鎹熻�楃殑鎶ュ憡杩樻槸tables4
+            //鏌ヨ鏍峰搧(鍙煡璇㈠甫"/")鐨勬暟閲�
+            List<InsSample> sampleList = insSamples.stream().filter(insSample -> insSample.getSampleCode().contains("/")).collect(Collectors.toList());
+            //杩囨护鍑哄厜绾ゆ帴澶存崯鑰楃殑妫�楠岄」鐩�
+            List<String> strings = filteredProducts.stream().filter(s -> s.contains("鍏夌氦鎺ュご鎹熻��")).distinct().sorted(Comparator.naturalOrder()).collect(Collectors.toList());
+            long index41 = 1;
+            for (int i = 0; i < sampleList.size(); i++) {
+                if (i % 16 == 0) {
+                    //鏍峰搧鏁伴噺瓒呰繃16闇�瑕佹柊澧炶〃鏍�
+                    List<RowRenderData> rows = new ArrayList<>();
+                    int count2 = sampleList.size() - (index41 - 1) * 16 < 16 ? (int) (sampleList.size() - (index41 - 1) * 16 + 1) : 17;
+                    //琛ㄦ牸鐨勮鏁�
+                    for (int j = 0; j < count2; j++) {
+                        RowRenderData rowRenderData = new RowRenderData();
+                        RowStyle rowStyle = new RowStyle();
+                        rowStyle.setHeight(40);
+                        rowRenderData.setRowStyle(rowStyle);
+                        List<CellRenderData> cells = new ArrayList<>();
+                        //琛ㄦ牸鐨勫垪鏁�
+                        for (int k = 0; k < 6; k++) {
+                            CellRenderData cellRenderData = new CellRenderData();
+                            CellStyle cellStyle = new CellStyle();
+                            cellStyle.setVertAlign(XWPFTableCell.XWPFVertAlign.CENTER);
+                            cellRenderData.setCellStyle(cellStyle);
+                            List<ParagraphRenderData> paragraphRenderDataList = new ArrayList<>();
+                            ParagraphRenderData paragraphRenderData = new ParagraphRenderData();
+                            ParagraphStyle paragraphStyle = new ParagraphStyle();
+                            paragraphStyle.setAlign(ParagraphAlignment.CENTER);
+                            paragraphRenderData.setParagraphStyle(paragraphStyle);
+                            List<RenderData> renderData = new ArrayList<>();
+                            TextRenderData textRenderData = new TextRenderData();
+                            Style style = new Style();
+                            style.setFontFamily("瀹嬩綋");
+                            style.setColor("000000");
+                            textRenderData.setStyle(style);
+                            if (j == 0) {
+                                //绗竴琛�
+                                if (k == 0) {
+                                    //绗竴鍒�
+                                    textRenderData.setText("鍏夌氦绫诲瀷@Fiber type");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (k == 1 || k == 2) {
+                                    //绗簩 涓夊垪
+                                    textRenderData.setText("鏍峰搧缂栧彿@Sample number鈭�3333");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else {
+                                    String[] split = strings.get(k - 3).split(",");
+                                    if (ObjectUtils.isEmpty(split[3]) || split[3].isEmpty()) {
+                                        textRenderData.setText(split[2]);
+                                    } else {
+                                        textRenderData.setText(split[2] + "@" + split[3]);
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            } else {
+                                if (k == 0) {
+                                    //绗竴鍒�
+                                    textRenderData.setText(sampleList.get(0).getModel() + "鈭�44");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (k == 1) {
+                                    //绗簩鍒�
+                                    textRenderData.setText(sampleList.get(j - 1).getSampleCode().split("/")[0]);
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (k == 2) {
+                                    //绗笁鍒�
+                                    textRenderData.setText(sampleList.get(j - 1).getSampleCode().split("/")[1]);
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else {
+                                    //鏍规嵁瀵瑰簲鐨勬牱鍝佺紪鍙峰拰妫�楠岄」鐩煡璇㈠搴旀暟鎹�(鏈�缁堝��)
+                                    String[] split = strings.get(k - 3).split(",");
+                                    // 濡傛灉鏄楠岄」涓哄厜绾ゆ帴澶存崯鑰楋紝鍒欏彇绗竴鏉�
+                                    InsProduct insProduct = null;
+                                    if(split[0].equals("鍏夌氦鎺ュご鎹熻��")) {
+                                        insProduct = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                                                .eq(InsProduct::getState, 1)
+                                                .eq(InsProduct::getInsSampleId, sampleList.get(j - 1).getId())
+                                                .eq(InsProduct::getInspectionItem, split[0])
+                                                .eq(InsProduct::getInspectionItemSubclass, split[2])).get(0);
+                                    }else {
+                                        insProduct = insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
+                                                .eq(InsProduct::getState, 1)
+                                                .eq(InsProduct::getInsSampleId, sampleList.get(j - 1).getId())
+                                                .eq(InsProduct::getInspectionItem, split[0])
+                                                .eq(InsProduct::getInspectionItemSubclass, split[2]));
+                                    }
+                                    textRenderData.setText(insProduct.getLastValue());
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                        }
+                        rowRenderData.setCells(cells);
+                        if (!rowRenderData.getCells().isEmpty()) {
+                            rows.add(rowRenderData);
+                        }
+                    }
+                    TableRenderData tableRenderData = new TableRenderData();
+                    tableRenderData.setRows(rows);
+                    int countSize = tableRenderData.getRows().get(0).getCells().size();
+                    for (RowRenderData row : tableRenderData.getRows()) {
+                                /*for (CellRenderData cell : row.getCells()) {
+                                    System.out.print(cell.getParagraphs().get(0).getContents());
+                                }
+                                System.out.println("");*/
+                        if (row.getCells().size() != countSize) {
+                            throw new ErrorException("姣忚鍗曞厓鏍间笉鐩哥瓑3");
+                        }
+                    }
+                    TableStyle tableStyle = new TableStyle();
+                    tableStyle.setWidth(XWPFTable.DEFAULT_PERCENTAGE_WIDTH);
+                    tableStyle.setAlign(TableRowAlign.CENTER);
+                    BorderStyle borderStyle = new BorderStyle();
+                    borderStyle.setColor("000000");
+                    borderStyle.setType(XWPFTable.XWPFBorderType.THICK);
+                    borderStyle.setSize(14);
+                    tableStyle.setLeftBorder(borderStyle);
+                    tableStyle.setTopBorder(borderStyle);
+                    tableStyle.setRightBorder(borderStyle);
+                    tableStyle.setBottomBorder(borderStyle);
+                    tableRenderData.setTableStyle(tableStyle);
+                    Map<String, Object> table = new HashMap<>();
+                    table.put("table4", tableRenderData);
+                    table.put("report", insReport);
+                    table.put("index4", index4 + 1);
+                    tables4.add(table);
+                    index4++;
+                    index41++;
+                }
+            }
+            tables4.forEach(table4 -> {
+                table4.put("tableSize4", tables4.size());
+            });
+
+    }
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/handler/FiberOpticRibbonReportHandler.java b/cnas-require/src/main/java/com/ruoyi/requier/handler/FiberOpticRibbonReportHandler.java
new file mode 100644
index 0000000..aa98b07
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/handler/FiberOpticRibbonReportHandler.java
@@ -0,0 +1,734 @@
+package com.ruoyi.requier.handler;
+
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.deepoove.poi.data.*;
+import com.deepoove.poi.data.style.*;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.framework.util.MyUtil;
+import com.ruoyi.inspect.dto.SampleProductDto;
+import com.ruoyi.inspect.mapper.InsProductMapper;
+import com.ruoyi.inspect.mapper.InsSampleMapper;
+import com.ruoyi.inspect.pojo.InsProduct;
+import com.ruoyi.inspect.pojo.InsReport;
+import com.ruoyi.inspect.pojo.InsSample;
+import com.ruoyi.inspect.vo.InsProductFiberVO;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
+import org.apache.poi.xwpf.usermodel.TableRowAlign;
+import org.apache.poi.xwpf.usermodel.XWPFTable;
+import org.apache.poi.xwpf.usermodel.XWPFTableCell;
+
+import java.text.Collator;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+/**
+ * 鍏夌氦甯﹀昂瀵稿弬鏁版姤鍛婂鐞嗙被
+ */
+public class FiberOpticRibbonReportHandler {
+
+    /**
+     * 榛樿琛ㄦ牸瀹藉害
+     */
+    private final static int[] DEFAULT_COL_WIDTHS = {1600,0, 1200, 1200, 1200, 1200, 1200, 1200,1200};
+
+    private final InsProductMapper insProductMapper;
+    private final InsSampleMapper insSampleMapper;
+
+    public FiberOpticRibbonReportHandler(InsProductMapper insProductMapper, InsSampleMapper insSampleMapper){
+        this.insProductMapper = insProductMapper;
+        this.insSampleMapper = insSampleMapper;
+    }
+
+    private final static String ITEM_SPLIT_CHAR = "&";//妫�楠岄」鍒嗛殧绗�
+
+    private final static String COLOR_SPLIT_CHAR = "-";//鑹叉爣鍒嗛殧绗�
+
+    /**
+     *
+     * @param samples    鎵�鏈夋牱鍝�
+     * @param insReport  report瀵硅薄
+     * @param tables6    灏哄鍙傛暟闄勪欢琛ㄦ牸琛屽垪琛�
+     * @param colorDict  鑹叉爣瀛楀吀
+     */
+    public void doWrite(List<SampleProductDto> samples, InsReport insReport, List<Map<String,Object>> tables6,
+                        List<String> colorDict){
+        AtomicInteger index6 = new AtomicInteger(1);//椤电爜
+        samples.forEach(sample -> {
+            //鏌ヨ鏍峰搧涓嬬殑妫�楠岄」鍜屽厜绾ゅ甫缂栧彿
+            List<InsProductFiberVO> insProducts1 = insProductMapper.selectInsProductInsFibersList(sample.getId());
+            //鏍规嵁鍏夌氦甯︾紪鍙�
+            Map<String,List<InsProductFiberVO>> groupProducts = insProducts1.stream()
+                    .filter(p->p.getInspectionItem().equals("灏哄鍙傛暟"))
+                    .collect(Collectors.groupingBy(product -> product.getBushColor()+"-"+product.getCode()));
+            if(groupProducts.isEmpty()){
+                return;
+            }
+            List<String[]> collect = groupProducts.keySet().stream().map(k -> k.split(COLOR_SPLIT_CHAR)).sorted((o1, o2) -> {
+                if (o1.length > 1 && o2.length > 1) {
+                    if (!Objects.equals(o1[0], o2[0])) {
+                        Integer o1Index = colorDict.indexOf(o1[0]);
+                        Integer o2Index = colorDict.indexOf(o2[0]);
+                        return o1Index.compareTo(o2Index);
+                    }
+                    if (!Objects.equals(o1[1], o2[1])) {
+                        Integer o1Index = colorDict.indexOf(o1[1]);
+                        Integer o2Index = colorDict.indexOf(o2[1]);
+                        return o1Index.compareTo(o2Index);
+                    }
+                }
+                return 0;
+            }).collect(Collectors.toList());
+            List<String> sortKeys = collect.stream().map(c->String.join(COLOR_SPLIT_CHAR,c)).collect(Collectors.toList());
+            //妫�楠岄」鍒楄〃(琛ㄥご)
+            List<String> itemMap = insProducts1.stream().sorted((o1,o2)->{
+                //鏍规嵁妫�楠岄」鎺掑簭
+                if(!Objects.equals(o1.getInspectionItem(),o2.getInspectionItem())){
+                    List<String> specialItems = Arrays.asList("鑰愮幆澧冨簲鍔涘紑瑁�","鐑敹缂╃巼");
+                    if(specialItems.contains(o1.getInspectionItem()) && specialItems.contains(o2.getInspectionItem())){
+                        return Integer.MAX_VALUE;
+                    }
+                    Collator instance = Collator.getInstance(Locale.CHINA);
+                    return instance.compare(o1.getInspectionItem(),o2.getInspectionItem());
+                }
+                //妫�楠屽瓙椤规帓搴�
+                if(StringUtils.isNotBlank(o1.getInspectionItemSubclass())&& StringUtils.isNotBlank(o2.getInspectionItemSubclass())){
+                    if(!Objects.equals(o1.getInspectionItemSubclass(),o2.getInspectionItemSubclass())){
+                        Collator instance = Collator.getInstance(Locale.CHINA);
+                        return instance.compare(o1.getInspectionItemSubclass(),o2.getInspectionItemSubclass());
+                    }
+                }
+                return 0;
+            }).map(insProduct -> {
+                String item = MyUtil.joinChars("@",insProduct.getInspectionItem(),insProduct.getInspectionItemEn());
+                String itemSubClass = MyUtil.joinChars("@",insProduct.getInspectionItemSubclass(),insProduct.getInspectionItemSubclassEn());
+                return MyUtil.joinChars(ITEM_SPLIT_CHAR,item,itemSubClass);
+            }).distinct().collect(Collectors.toList());
+            long size = itemMap.size();//琛ㄥご闀垮害
+            long size2 = insProducts1.stream().map(InsProduct::getInsFibersId).distinct().count();
+            long number = 10;
+            //鍒ゆ柇妫�楠岄」鐩槸鍚︽湁鐖跺瓙鍏崇郴
+            int a = itemMap.stream().anyMatch(p -> p.split(ITEM_SPLIT_CHAR).length>0) ? 2 : 1;
+            for (long c = 0; c < size; c++) {
+                if (c % number == 0) {
+                    List<RowRenderData> rows = new ArrayList<>();
+                    //琛ㄦ牸鐨勮鏁�
+                    for (long i = 0; i < size2 + a + 2; i++) {
+                        RowRenderData rowRenderData = new RowRenderData();
+                        RowStyle rowStyle = new RowStyle();
+                        rowStyle.setHeight(40);
+                        rowRenderData.setRowStyle(rowStyle);
+                        List<CellRenderData> cells = new ArrayList<>();
+                        //琛ㄦ牸鐨勫垪鏁�
+                        for (long j = 0; j < 12; j++) {
+                            CellRenderData cellRenderData = new CellRenderData();
+                            CellStyle cellStyle = new CellStyle();
+                            cellStyle.setVertAlign(XWPFTableCell.XWPFVertAlign.CENTER);
+                            cellRenderData.setCellStyle(cellStyle);
+                            List<ParagraphRenderData> paragraphRenderDataList = new ArrayList<>();
+                            ParagraphRenderData paragraphRenderData = new ParagraphRenderData();
+                            ParagraphStyle paragraphStyle = new ParagraphStyle();
+                            paragraphStyle.setAlign(ParagraphAlignment.CENTER);
+                            paragraphRenderData.setParagraphStyle(paragraphStyle);
+                            List<RenderData> renderData = new ArrayList<>();
+                            TextRenderData textRenderData = new TextRenderData();
+                            Style style = new Style();
+                            style.setFontFamily("瀹嬩綋");
+                            style.setColor("000000");
+                            style.setFontSize(10);
+                            textRenderData.setStyle(style);
+                            if(i==0){
+                                //绗竴琛�
+                                if (j<=2) {
+                                    textRenderData.setText("鏍峰搧缂栧彿@Sample number鈭�456");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j >2&&j<=5) {
+                                    textRenderData.setText(sample.getSampleCode()+"鈭�4566");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j >5&&j<=8) {
+                                    textRenderData.setText("瑙勬牸鍨嬪彿@Type鈭�457");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }else{
+                                    textRenderData.setText(sample.getModel()+"鈭�4577");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                            else if (i == 1) {
+                                //绗簩琛�
+                                if (j == 0) {
+                                    //绗竴鍒�
+                                    textRenderData.setText("绠¤壊鏍嘆Pipe鈭�100");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 1) {
+                                    //绗簩鍒�
+                                    textRenderData.setText("鍏夌氦甯︾紪鍙稝Scanning Number鈭�101");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else {
+                                    String inspectionItem = itemMap.get(itemMap.size()-1).split(ITEM_SPLIT_CHAR)[0];
+                                    textRenderData.setText("鈭�" + inspectionItem);
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                            else if (a == 2 && i == 2) {
+                                //鏈夌埗瀛愰」鐩叧绯荤殑绗笁琛�
+                                if (j == 0) {
+                                    //绗竴鍒�
+                                    textRenderData.setText("绠¤壊鏍嘆Pipe鈭�100");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                                else if (j == 1) {
+                                    //绗簩鍒�
+                                    textRenderData.setText("鍏夌氦甯︾紪鍙稝Scanning Number鈭�101");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                                else if (j >1&& j<=3) {
+                                    String[] splits = itemMap.get(0).split(ITEM_SPLIT_CHAR);
+                                    if (splits.length<2 || "@".equals(splits[1])) {
+                                        textRenderData.setText(splits[0] + "鈭�" + splits[0]);
+                                    } else {
+                                        textRenderData.setText(splits[1]+"鈭�"+splits[0]+splits[1]);
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                                else if (j>3&&j<=5) {
+                                    String[] splits = itemMap.get(1).split(ITEM_SPLIT_CHAR);
+                                    if (splits.length<2 || "@".equals(splits[1])) {
+                                        textRenderData.setText(splits[0] + "鈭�" + splits[0]);
+                                    } else {
+                                        textRenderData.setText(splits[1]+"鈭�"+splits[0]+splits[1]);
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                                else if (j >5&&j<=7) {
+                                    String[] splits = itemMap.get(2).split(ITEM_SPLIT_CHAR);
+                                    if (splits.length<2 || "@".equals(splits[1])) {
+                                        textRenderData.setText(splits[0] + "鈭�" + splits[0]);
+                                    } else {
+                                        textRenderData.setText(splits[1]+"鈭�"+splits[0]+splits[1]);
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                                else if (j >7&&j<=9) {
+                                    String[] splits = itemMap.get(3).split(ITEM_SPLIT_CHAR);
+                                    if (splits.length<2 || "@".equals(splits[1])) {
+                                        textRenderData.setText(splits[0] + "鈭�" + splits[0]);
+                                    } else {
+                                        textRenderData.setText(splits[1]+"鈭�"+splits[0]+splits[1]);
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                                else{
+                                    String[] splits = itemMap.get(4).split(ITEM_SPLIT_CHAR);
+                                    if (splits.length<2 || "@".equals(splits[1])) {
+                                        textRenderData.setText(splits[0] + "鈭�" + splits[0]);
+                                    } else {
+                                        textRenderData.setText(splits[1]+"鈭�"+splits[0]+splits[1]);
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                            else if ( i == 3) {
+                                //绗洓琛�
+                                if (j == 0) {
+                                    //绗竴鍒�
+                                    textRenderData.setText("绠¤壊鏍嘆Pipe鈭�100");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 1) {
+                                    //绗簩鍒�
+                                    textRenderData.setText("鍏夌氦甯︾紪鍙稝Scanning Number鈭�101");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else {
+                                    //椤圭洰淇℃伅
+                                    if((int)(j - 2)%2==0){
+                                        textRenderData.setText("A绔�");
+                                        renderData.add(textRenderData);
+                                        paragraphRenderData.setContents(renderData);
+                                        paragraphRenderDataList.add(paragraphRenderData);
+                                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                                        cells.add(cellRenderData);
+                                    }else{
+                                        textRenderData.setText("B绔�");
+                                        renderData.add(textRenderData);
+                                        paragraphRenderData.setContents(renderData);
+                                        paragraphRenderDataList.add(paragraphRenderData);
+                                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                                        cells.add(cellRenderData);
+                                    }
+                                }
+                            }
+                            else{
+                                //寰幆鍏夌氦甯︾紪鍙�
+                                String key = sortKeys.get((int)i-4);
+                                String item;
+                                if (j<=3) {
+                                    item = itemMap.get(0);
+                                }
+                                else if (j>3&&j<=5) {
+                                    item = itemMap.get(1);
+                                }
+                                else if (j >5&&j<=7) {
+                                    item =  itemMap.get(2);
+                                }
+                                else if (j >7&&j<=9) {
+                                    item =  itemMap.get(3);
+                                } else{
+                                    item =  itemMap.get(4);
+                                }
+                                InsProductFiberVO insProduct = groupProducts.get(key).stream()
+                                        .filter(p->{
+                                            String insItem = MyUtil.joinChars("@",p.getInspectionItem(),p.getInspectionItemEn());
+                                            String insSubItem = MyUtil.joinChars("@",p.getInspectionItemSubclass(),p.getInspectionItemSubclassEn());
+                                            return item.equals(MyUtil.joinChars(ITEM_SPLIT_CHAR,insItem,insSubItem));
+                                        }).findFirst().orElse(new InsProductFiberVO());
+                                //濉��
+                                if (j == 0) {
+                                    //绗竴鍒�
+                                    textRenderData.setText(insProduct.getBushColor());
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 1) {
+                                    //绗簩鍒�
+                                    textRenderData.setText(insProduct.getCode());
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else {
+                                    //椤圭洰淇℃伅
+                                    if((int)(j - 2)%2==0){
+                                        textRenderData.setText(transformInsValue(insProduct.getInsValue()).get(0));
+                                    }else{
+                                        textRenderData.setText(transformInsValue(insProduct.getInsValue()).get(1));
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                        }
+                        rowRenderData.setCells(cells);
+                        if (!rowRenderData.getCells().isEmpty()) {
+                            rows.add(rowRenderData);
+                        }
+                    }
+                    TableRenderData tableRenderData = new TableRenderData();
+                    tableRenderData.setRows(rows);
+                    int countSize = tableRenderData.getRows().get(0).getCells().size();
+                    for (RowRenderData row : tableRenderData.getRows()) {
+                        if (row.getCells().size() != countSize) {
+                            throw new ErrorException("姣忚鍗曞厓鏍间笉鐩哥瓑6");
+                        }
+                    }
+                    TableStyle tableStyle = new TableStyle();
+                    tableStyle.setWidth(XWPFTable.DEFAULT_PERCENTAGE_WIDTH);
+                    tableStyle.setAlign(TableRowAlign.CENTER);
+                    BorderStyle borderStyle = new BorderStyle();
+                    borderStyle.setColor("000000");
+                    borderStyle.setType(XWPFTable.XWPFBorderType.THICK);
+                    borderStyle.setSize(14);
+                    tableStyle.setLeftBorder(borderStyle);
+                    tableStyle.setTopBorder(borderStyle);
+                    tableStyle.setRightBorder(borderStyle);
+                    tableStyle.setBottomBorder(borderStyle);
+                    tableRenderData.setTableStyle(tableStyle);
+                    Map<String, Object> table = new HashMap<>();
+                    table.put("table6", tableRenderData);
+                    table.put("report", insReport);
+                    table.put("sample_number", sample.getSampleCode());
+                    table.put("type", sample.getModel());
+                    table.put("index6", index6.get());
+                    tables6.add(table);
+                    index6.getAndIncrement();
+                }
+            }
+        });
+    }
+
+    /**
+     * 鏍煎紡鍖栨楠岃繃绋嬪�糺son瀛楃涓�
+     * @param insValue 妫�楠岃繃绋嬪�糺son瀛楃涓�
+     * @return
+     */
+    private static List<String> transformInsValue(String insValue){
+        List<String> list = new ArrayList<>();
+        if(!insValue.isEmpty() && !"[]".equals(insValue)){
+            for (Object o : JSONUtil.parseArray(insValue)) {
+                JSONObject obj = JSON.parseObject(JSON.toJSONString(o));
+                if(Objects.nonNull(obj.get("v"))){
+                    list.add(obj.get("v").toString());
+                }
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 鍏夌氦闄勪欢琛ㄦ牸锛氬啓鍏ヨ鏁版嵁
+     * @param ribbonList 鍏夌氦椤圭洰淇℃伅
+     * @param tables6   鍏夌氦甯﹀昂瀵稿弬鏁伴檮浠惰〃鏍�
+     */
+    public void writeFiberOpticRibbonEnclosureTableRow(List<InsProductFiberVO> ribbonList, List<Map<String, Object>> tables6,InsReport insReport){
+        AtomicInteger index6 = new AtomicInteger(1);//椤电爜
+        int colCount = 12;//琛ㄦ牸鎬诲垪鏁�
+        int itemCount = 10;//琛ㄦ牸椤圭洰鍒楁暟
+        //妫�楠岄」鍒楄〃(琛ㄥご)
+        List<String> itemMap = ribbonList.stream().sorted((o1,o2)->{
+            //鏍规嵁妫�楠岄」鎺掑簭
+            if(!Objects.equals(o1.getInspectionItem(),o2.getInspectionItem())){
+                List<String> specialItems = Arrays.asList("鑰愮幆澧冨簲鍔涘紑瑁�","鐑敹缂╃巼");
+                if(specialItems.contains(o1.getInspectionItem()) && specialItems.contains(o2.getInspectionItem())){
+                    return Integer.MAX_VALUE;
+                }
+                Collator instance = Collator.getInstance(Locale.CHINA);
+                return instance.compare(o1.getInspectionItem(),o2.getInspectionItem());
+            }
+            //妫�楠屽瓙椤规帓搴�
+            if(StringUtils.isNotBlank(o1.getInspectionItemSubclass())&& StringUtils.isNotBlank(o2.getInspectionItemSubclass())){
+                if(!Objects.equals(o1.getInspectionItemSubclass(),o2.getInspectionItemSubclass())){
+                    Collator instance = Collator.getInstance(Locale.CHINA);
+                    return instance.compare(o1.getInspectionItemSubclass(),o2.getInspectionItemSubclass());
+                }
+            }
+            return 0;
+        }).map(insProduct -> {
+            String item = MyUtil.joinChars("@",insProduct.getInspectionItem(),insProduct.getInspectionItemEn());
+            String itemSubClass = MyUtil.joinChars("@",insProduct.getInspectionItemSubclass(),insProduct.getInspectionItemSubclassEn());
+            return MyUtil.joinChars(ITEM_SPLIT_CHAR,item,itemSubClass);
+        }).distinct().collect(Collectors.toList());
+        //鏍规嵁鏍峰搧id鍒嗙粍
+        Map<Integer,List<InsProductFiberVO>> groupProducts = ribbonList.stream()
+                .collect(Collectors.groupingBy(InsProductFiberVO::getInsSampleId));
+        //sampleId椤哄簭鎺掑簭
+        List<Integer> sortKeys = groupProducts.keySet().stream().sorted(Comparator.naturalOrder()).collect(Collectors.toList());
+        //鍒ゆ柇妫�楠岄」鐩槸鍚︽湁鐖跺瓙鍏崇郴
+        int a = itemMap.stream().anyMatch(p -> p.split(ITEM_SPLIT_CHAR).length>0) ? 2 : 1;
+        for (int c = 0; c < itemMap.size(); c++) {
+            if (c % itemCount == 0) {
+                List<RowRenderData> rows = new ArrayList<>();
+                //琛ㄦ牸鐨勮鏁�(鏍峰搧鏁伴噺+琛ㄥご)
+                int tableRow = sortKeys.size() + a + 1;
+                for (int i = 0; i < tableRow; i++) {
+                    RowRenderData rowRenderData = new RowRenderData();
+                    RowStyle rowStyle = new RowStyle();
+                    rowStyle.setHeight(40);
+                    rowRenderData.setRowStyle(rowStyle);
+                    List<CellRenderData> cells = new ArrayList<>();
+                    //琛ㄦ牸鐨勫垪鏁�
+                    for (int j = 0; j < colCount; j++) {
+                        CellRenderData cellRenderData = new CellRenderData();
+                        CellStyle cellStyle = new CellStyle();
+                        cellStyle.setVertAlign(XWPFTableCell.XWPFVertAlign.CENTER);
+                        cellRenderData.setCellStyle(cellStyle);
+                        List<ParagraphRenderData> paragraphRenderDataList = new ArrayList<>();
+                        ParagraphRenderData paragraphRenderData = new ParagraphRenderData();
+                        ParagraphStyle paragraphStyle = new ParagraphStyle();
+                        paragraphStyle.setAlign(ParagraphAlignment.CENTER);
+                        paragraphRenderData.setParagraphStyle(paragraphStyle);
+                        List<RenderData> renderData = new ArrayList<>();
+                        TextRenderData textRenderData = new TextRenderData();
+                        Style style = new Style();
+                        style.setFontFamily("瀹嬩綋");
+                        style.setColor("000000");
+                        style.setFontSize(10);
+                        textRenderData.setStyle(style);
+                        //绗竴琛�
+                        if(i==0){
+                            if (j < 2) {
+                                //绗竴鍒�
+                                textRenderData.setText("鏍峰搧缂栧彿@Sample number鈭�45678");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else{
+                                //鐢熸垚琛ㄥご
+                                if(itemMap.size()> (j - 2)){
+                                    String inspectionItem = itemMap.get(j - 2).split(ITEM_SPLIT_CHAR)[0];
+                                    textRenderData.setText( inspectionItem + "鈭�" + inspectionItem);
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }else{
+                                    String inspectionItem = itemMap.get(itemMap.size()-1).split(ITEM_SPLIT_CHAR)[0];
+                                    textRenderData.setText("鈭�" + inspectionItem);
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                        }
+                        else if (a == 2 && i == 1) {
+                            //鏈夌埗瀛愰」鐩叧绯荤殑绗簩琛�
+                            if (j < 2) {
+                                //绗竴鍒�
+                                textRenderData.setText("鏍峰搧缂栧彿@Sample number鈭�45678");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else if (j >1&& j<=3) {
+                                String[] splits = itemMap.get(0).split(ITEM_SPLIT_CHAR);
+                                if (splits.length<2 || "@".equals(splits[1])) {
+                                    textRenderData.setText(splits[0] + "鈭�" + splits[0]);
+                                } else {
+                                    textRenderData.setText(splits[1]+"鈭�"+splits[0]+splits[1]);
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                            else if (j>3&&j<=5) {
+                                String[] splits = itemMap.get(1).split(ITEM_SPLIT_CHAR);
+                                if (splits.length<2 || "@".equals(splits[1])) {
+                                    textRenderData.setText(splits[0] + "鈭�" + splits[0]);
+                                } else {
+                                    textRenderData.setText(splits[1]+"鈭�"+splits[0]+splits[1]);
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                            else if (j >5&&j<=7) {
+                                String[] splits = itemMap.get(2).split(ITEM_SPLIT_CHAR);
+                                if (splits.length<2 || "@".equals(splits[1])) {
+                                    textRenderData.setText(splits[0] + "鈭�" + splits[0]);
+                                } else {
+                                    textRenderData.setText(splits[1]+"鈭�"+splits[0]+splits[1]);
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                            else if (j >7&&j<=9) {
+                                String[] splits = itemMap.get(3).split(ITEM_SPLIT_CHAR);
+                                if (splits.length<2 || "@".equals(splits[1])) {
+                                    textRenderData.setText(splits[0] + "鈭�" + splits[0]);
+                                } else {
+                                    textRenderData.setText(splits[1]+"鈭�"+splits[0]+splits[1]);
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                            else{
+                                String[] splits = itemMap.get(4).split(ITEM_SPLIT_CHAR);
+                                if (splits.length<2 || "@".equals(splits[1])) {
+                                    textRenderData.setText(splits[0] + "鈭�" + splits[0]);
+                                } else {
+                                    textRenderData.setText(splits[1]+"鈭�"+splits[0]+splits[1]);
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                        }
+                        else if (i == 2) {
+                            //绗笁琛�
+                            if (j < 2) {
+                                //绗竴鍒�
+                                textRenderData.setText("鏍峰搧缂栧彿@Sample number鈭�45678");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else {
+                                //椤圭洰淇℃伅
+                                if((j - 2) %2==0){
+                                    textRenderData.setText("A绔�");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }else{
+                                    textRenderData.setText("B绔�");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                        }
+                        else{
+                            //寰幆鏍峰搧
+                            Integer key = sortKeys.get(i-3);
+                            //鏌ヨ褰撳墠鏍峰搧淇℃伅
+                            InsSample insSample = insSampleMapper.selectById(key);
+                            int index = Math.max(j - 2, 0);
+                            String item;
+                            if (j<=3) {
+                                item = itemMap.get(0);
+                            }
+                            else if (j>3&&j<=5) {
+                                item = itemMap.get(1);
+                            }
+                            else if (j >5&&j<=7) {
+                                item =  itemMap.get(2);
+                            }
+                            else if (j >7&&j<=9) {
+                                item =  itemMap.get(3);
+                            } else{
+                                item =  itemMap.get(4);
+                            }
+                            InsProductFiberVO insProduct = groupProducts.get(key).stream()
+                                    .filter(p->{
+                                        String insItem = MyUtil.joinChars("@",p.getInspectionItem(),p.getInspectionItemEn());
+                                        String insItemSubClass = MyUtil.joinChars("@",p.getInspectionItemSubclass(),p.getInspectionItemSubclassEn());
+                                        return item.equals(MyUtil.joinChars(ITEM_SPLIT_CHAR,insItem,insItemSubClass));
+                                    })
+                                    .findFirst().orElse(new InsProductFiberVO());
+                            //濉��
+                            if (j < 2) {
+                                //绗竴鍒�
+                                textRenderData.setText(insSample.getSampleCode()+"鈭�"+key);
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            } else {
+                                //椤圭洰淇℃伅
+                                if(index%2==0){
+                                    textRenderData.setText(transformInsValue(insProduct.getInsValue()).get(0));
+                                }else{
+                                    textRenderData.setText(transformInsValue(insProduct.getInsValue()).get(1));
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+//                            if(itemMap.size()>j - 2) {
+//                            }
+                        }
+                    }
+                    rowRenderData.setCells(cells);
+                    if (!rowRenderData.getCells().isEmpty()) {
+                        rows.add(rowRenderData);
+                    }
+                }
+                TableRenderData tableRenderData = new TableRenderData();
+                tableRenderData.setRows(rows);
+                int countSize = tableRenderData.getRows().get(0).getCells().size();
+                for (RowRenderData row : tableRenderData.getRows()) {
+                    if (row.getCells().size() != countSize) {
+                        throw new ErrorException("鍏夌氦甯︽姤鍛婇檮浠惰〃鏍煎垪鏁颁笉鍖归厤");
+                    }
+                }
+                TableStyle tableStyle = new TableStyle();
+                tableStyle.setWidth(XWPFTable.DEFAULT_PERCENTAGE_WIDTH);
+//                tableStyle.setColWidths(DEFAULT_COL_WIDTHS);
+//                tableStyle.setWidth("10000");
+                tableStyle.setAlign(TableRowAlign.CENTER);
+                BorderStyle borderStyle = new BorderStyle();
+                borderStyle.setColor("000000");
+                borderStyle.setType(XWPFTable.XWPFBorderType.THICK);
+                borderStyle.setSize(14);
+                tableStyle.setLeftBorder(borderStyle);
+                tableStyle.setTopBorder(borderStyle);
+                tableStyle.setRightBorder(borderStyle);
+                tableStyle.setBottomBorder(borderStyle);
+                tableRenderData.setTableStyle(tableStyle);
+                Map<String, Object> table = new HashMap<>();
+                table.put("table6", tableRenderData);
+                table.put("report", insReport);
+                table.put("index6", index6.get());
+                tables6.add(table);
+                index6.getAndIncrement();
+            }
+        }
+    }
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/handler/PiperConfigReportHandler.java b/cnas-require/src/main/java/com/ruoyi/requier/handler/PiperConfigReportHandler.java
new file mode 100644
index 0000000..3c0ab02
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/handler/PiperConfigReportHandler.java
@@ -0,0 +1,388 @@
+package com.ruoyi.requier.handler;
+
+import com.deepoove.poi.data.*;
+import com.deepoove.poi.data.style.*;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.framework.util.MyUtil;
+import com.ruoyi.inspect.dto.SampleProductDto;
+import com.ruoyi.inspect.mapper.InsProductMapper;
+import com.ruoyi.inspect.pojo.InsProduct;
+import com.ruoyi.inspect.pojo.InsReport;
+import com.ruoyi.inspect.vo.InsProductFiberVO;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
+import org.apache.poi.xwpf.usermodel.TableRowAlign;
+import org.apache.poi.xwpf.usermodel.XWPFTable;
+import org.apache.poi.xwpf.usermodel.XWPFTableCell;
+
+import java.text.Collator;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+/**
+ * 鏉惧绠℃姤鍛婂鐞嗙被
+ */
+public class PiperConfigReportHandler {
+
+
+    private final InsProductMapper insProductMapper;
+
+    public PiperConfigReportHandler(InsProductMapper insProductMapper){
+        this.insProductMapper = insProductMapper;
+    }
+
+    private final static String ITEM_SPLIT_CHAR = "&";//妫�楠岄」鍒嗛殧绗�
+
+    private final static String COLOR_SPLIT_CHAR = "-";//鑹叉爣鍒嗛殧绗�
+
+    /**
+     *
+     * @param samples    鎵�鏈夋牱鍝�
+     * @param insReport  report瀵硅薄
+     * @param tables5    鏉惧绠¢檮浠惰〃鏍艰鍒楄〃
+     * @param colorDict  鑹叉爣瀛楀吀
+     */
+    public void doWrite(List<SampleProductDto> samples, InsReport insReport, List<Map<String,Object>> tables5, List<String> colorDict){
+        AtomicInteger index5 = new AtomicInteger(1);//椤电爜
+        samples.forEach(sample -> {
+            //鏌ヨ鏍峰搧涓嬬殑妫�楠岄」鍜岃壊鏍�
+            List<InsProductFiberVO> insProducts1 = insProductMapper.selectInsProductInsBushList(sample.getId());//鏌ヨ濂楃鐩稿叧鏁版嵁
+            //鏍规嵁鑹叉爣鍒嗙粍
+            Map<String,List<InsProductFiberVO>> groupProducts = insProducts1.stream()
+                    .filter(p->!p.getInspectionItem().equals("鍏夌氦鎺ュご鎹熻��"))
+                    .collect(Collectors.groupingBy(product -> product.getBushColor()+"-"+product.getColor()));
+            if(groupProducts.isEmpty()){
+                return;
+            }
+            List<String[]> collect = groupProducts.keySet().stream().map(k -> k.split(COLOR_SPLIT_CHAR)).sorted((o1, o2) -> {
+                if (o1.length > 1 && o2.length > 1) {
+                    if (!Objects.equals(o1[0], o2[0])) {
+                        Integer o1Index = colorDict.indexOf(o1[0]);
+                        Integer o2Index = colorDict.indexOf(o2[0]);
+                        return o1Index.compareTo(o2Index);
+                    }
+                    if (!Objects.equals(o1[1], o2[1])) {
+                        Integer o1Index = colorDict.indexOf(o1[1]);
+                        Integer o2Index = colorDict.indexOf(o2[1]);
+                        return o1Index.compareTo(o2Index);
+                    }
+                }
+                return 0;
+            }).collect(Collectors.toList());
+            List<String> sortKeys = collect.stream().map(c->String.join(COLOR_SPLIT_CHAR,c)).collect(Collectors.toList());
+            //妫�楠岄」鍒楄〃(琛ㄥご)
+            List<String> itemMap = insProducts1.stream().sorted((o1,o2)->{
+                //鏍规嵁妫�楠岄」鎺掑簭
+                if(!Objects.equals(o1.getInspectionItem(),o2.getInspectionItem())){
+                    List<String> specialItems = Arrays.asList("鑰愮幆澧冨簲鍔涘紑瑁�","鐑敹缂╃巼");
+                    if(specialItems.contains(o1.getInspectionItem()) && specialItems.contains(o2.getInspectionItem())){
+                        return Integer.MAX_VALUE;
+                    }
+                    Collator instance = Collator.getInstance(Locale.CHINA);
+                    return instance.compare(o1.getInspectionItem(),o2.getInspectionItem());
+                }
+                //妫�楠屽瓙椤规帓搴�
+                if(StringUtils.isNotBlank(o1.getInspectionItemSubclass())&& StringUtils.isNotBlank(o2.getInspectionItemSubclass())){
+                    if(!Objects.equals(o1.getInspectionItemSubclass(),o2.getInspectionItemSubclass())){
+                        Collator instance = Collator.getInstance(Locale.CHINA);
+                        return instance.compare(o1.getInspectionItemSubclass(),o2.getInspectionItemSubclass());
+                    }
+                }
+                return 0;
+            }).map(insProduct -> {
+                String item = MyUtil.joinChars("@",insProduct.getInspectionItem(),insProduct.getInspectionItemEn());
+                String itemSubClass = MyUtil.joinChars("@",insProduct.getInspectionItemSubclass(),insProduct.getInspectionItemSubclassEn());
+                return MyUtil.joinChars(ITEM_SPLIT_CHAR,item,itemSubClass);
+            }).distinct().collect(Collectors.toList());
+            long size = itemMap.size();
+            long size2 = insProducts1.stream().map(InsProduct::getInsBushId).distinct().count();
+            long number = 7;
+            long k = 0;
+            //鍒ゆ柇妫�楠岄」鐩槸鍚︽湁鐖跺瓙鍏崇郴
+            int a = itemMap.stream().anyMatch(p -> p.split(ITEM_SPLIT_CHAR).length>0) ? 2 : 1;
+            for (long c = 0; c < size; c++) {
+                if (c % number == 0) {
+                    List<RowRenderData> rows = new ArrayList<>();
+                    //琛ㄦ牸鐨勮鏁�
+                    for (long i = 0; i < size2 + a + 1; i++) {
+                        RowRenderData rowRenderData = new RowRenderData();
+                        RowStyle rowStyle = new RowStyle();
+                        rowStyle.setHeight(40);
+                        rowRenderData.setRowStyle(rowStyle);
+                        List<CellRenderData> cells = new ArrayList<>();
+                        //琛ㄦ牸鐨勫垪鏁�
+                        for (long j = 0; j < 9; j++) {
+                            CellRenderData cellRenderData = new CellRenderData();
+                            CellStyle cellStyle = new CellStyle();
+                            cellStyle.setVertAlign(XWPFTableCell.XWPFVertAlign.CENTER);
+                            cellRenderData.setCellStyle(cellStyle);
+                            List<ParagraphRenderData> paragraphRenderDataList = new ArrayList<>();
+                            ParagraphRenderData paragraphRenderData = new ParagraphRenderData();
+                            ParagraphStyle paragraphStyle = new ParagraphStyle();
+                            paragraphStyle.setAlign(ParagraphAlignment.CENTER);
+                            paragraphRenderData.setParagraphStyle(paragraphStyle);
+                            List<RenderData> renderData = new ArrayList<>();
+                            TextRenderData textRenderData = new TextRenderData();
+                            Style style = new Style();
+                            style.setFontFamily("瀹嬩綋");
+                            style.setColor("000000");
+                            style.setFontSize(10);
+                            textRenderData.setStyle(style);
+                            if(i==0){
+                                //绗竴琛�
+                                if (j == 0) {
+                                    //绗竴鍒�
+                                    textRenderData.setText("鏍峰搧缂栧彿@Sample number鈭�456");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 1) {
+                                    //绗簩鍒�
+                                    textRenderData.setText("鏍峰搧缂栧彿@Sample number鈭�456");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 2) {
+                                    //绗簩鍒�
+                                    textRenderData.setText(sample.getSampleCode()+"鈭�4566");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }else if (j == 3) {
+                                    //绗簩鍒�
+                                    textRenderData.setText(sample.getSampleCode()+"鈭�4566");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }else if (j == 4) {
+                                    //绗簩鍒�
+                                    textRenderData.setText("瑙勬牸鍨嬪彿@Type鈭�457");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }else if (j == 5) {
+                                    //绗簩鍒�
+                                    textRenderData.setText("瑙勬牸鍨嬪彿@Type鈭�457");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }else if (j == 6) {
+                                    //绗簩鍒�
+                                    textRenderData.setText(sample.getModel()+"鈭�4577");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }else if (j == 7) {
+                                    //绗簩鍒�
+                                    textRenderData.setText(sample.getModel()+"鈭�4577");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }else{
+                                    //绗簩鍒�
+                                    textRenderData.setText(sample.getModel()+"鈭�4577");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                            else if (i == 1) {
+                                //绗簩琛�
+                                if (j == 0) {
+                                    //绗竴鍒�
+                                    textRenderData.setText("绠¤壊鏍嘆Pipe鈭�100");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 1) {
+                                    //绗簩鍒�
+                                    textRenderData.setText("绠¤壊鏍嘆Pipe鈭�100");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else {
+                                    if(itemMap.size()>(int) (j - 2 + k)){
+                                        String inspectionItem = itemMap.get((int) (j - 2 + k)).split(ITEM_SPLIT_CHAR)[0];
+                                        textRenderData.setText( inspectionItem + "鈭�" + inspectionItem);
+                                        renderData.add(textRenderData);
+                                        paragraphRenderData.setContents(renderData);
+                                        paragraphRenderDataList.add(paragraphRenderData);
+                                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                                        cells.add(cellRenderData);
+                                    }else{
+                                        String inspectionItem = itemMap.get(itemMap.size()-1).split(ITEM_SPLIT_CHAR)[0];
+                                        textRenderData.setText("鈭�" + inspectionItem);
+                                        renderData.add(textRenderData);
+                                        paragraphRenderData.setContents(renderData);
+                                        paragraphRenderDataList.add(paragraphRenderData);
+                                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                                        cells.add(cellRenderData);
+                                    }
+                                }
+                            }
+                            else if (a == 2 && i == 2) {
+                                //鏈夌埗瀛愰」鐩叧绯荤殑绗笁琛�
+                                if (j == 0) {
+                                    //绗竴鍒�
+                                    textRenderData.setText("绠¤壊鏍嘆Pipe鈭�100");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 1) {
+                                    //绗簩鍒�
+                                    textRenderData.setText("绠¤壊鏍嘆Pipe鈭�100");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else {
+                                    //椤圭洰淇℃伅
+                                    if(itemMap.size()>(int)(j - 2 + k)){
+                                        //鍒ゆ柇鏄惁鏈夐」鐩瓙绫�
+                                        String[] splits = itemMap.get((int) (j - 2 + k)).split(ITEM_SPLIT_CHAR);
+                                        if (splits.length<2 || "@".equals(splits[1])) {
+                                            textRenderData.setText(splits[0] + "鈭�" + splits[0]);
+                                        } else {
+                                            textRenderData.setText(splits[1]+"鈭�"+splits[0]+splits[1]);
+                                        }
+                                        renderData.add(textRenderData);
+                                        paragraphRenderData.setContents(renderData);
+                                        paragraphRenderDataList.add(paragraphRenderData);
+                                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                                        cells.add(cellRenderData);
+                                    }else{
+                                        //鍒ゆ柇鏄惁鏈夐」鐩瓙绫�
+                                        String[] splits = itemMap.get(itemMap.size()-1).split(ITEM_SPLIT_CHAR);
+                                        if (splits.length<2 || "@".equals(splits[1])) {
+                                            textRenderData.setText("鈭�" + splits[0]);
+                                        } else {
+                                            textRenderData.setText("鈭�"+splits[0]+splits[1]);
+                                        }
+                                        renderData.add(textRenderData);
+                                        paragraphRenderData.setContents(renderData);
+                                        paragraphRenderDataList.add(paragraphRenderData);
+                                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                                        cells.add(cellRenderData);
+                                    }
+                                }
+                            }
+                            else{
+                                //寰幆鑹叉爣
+                                String key = sortKeys.get((int)i-3);
+                                if(itemMap.size()>(int) (j - 2 + k)) {
+                                    int index = Math.max((int) (j - 2 + k), 0);
+                                    String item = itemMap.get(index);
+                                    InsProductFiberVO insProduct = groupProducts.get(key).stream()
+                                            .filter(p->{
+                                                String insItem = MyUtil.joinChars("@",p.getInspectionItem(),p.getInspectionItemEn());
+                                                String insSubItem = MyUtil.joinChars("@",p.getInspectionItemSubclass(),p.getInspectionItemSubclassEn());
+                                                return item.equals(MyUtil.joinChars(ITEM_SPLIT_CHAR,insItem,insSubItem));
+                                            }).findFirst().orElse(new InsProductFiberVO());
+                                    //濉��
+                                    if (j == 0) {
+                                        //绗竴鍒�
+                                        textRenderData.setText(insProduct.getBushColor()+"鈭�"+key);
+                                        renderData.add(textRenderData);
+                                        paragraphRenderData.setContents(renderData);
+                                        paragraphRenderDataList.add(paragraphRenderData);
+                                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                                        cells.add(cellRenderData);
+                                    } else if (j == 1) {
+                                        //绗簩鍒�
+                                        textRenderData.setText(insProduct.getBushColor()+"鈭�"+key);
+                                        renderData.add(textRenderData);
+                                        paragraphRenderData.setContents(renderData);
+                                        paragraphRenderDataList.add(paragraphRenderData);
+                                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                                        cells.add(cellRenderData);
+                                    } else {
+                                        //椤圭洰淇℃伅
+                                        if((index+1)==groupProducts.get(key).size()){
+                                            textRenderData.setText(insProduct.getLastValue()+"鈭憀ast"+key);
+                                        }else{
+                                            textRenderData.setText(insProduct.getLastValue());
+                                        }
+                                        renderData.add(textRenderData);
+                                        paragraphRenderData.setContents(renderData);
+                                        paragraphRenderDataList.add(paragraphRenderData);
+                                        cellRenderData.setParagraphs(paragraphRenderDataList);
+                                        cells.add(cellRenderData);
+                                    }
+                                } else {
+
+                                    textRenderData.setText("鈭憀ast"+key);
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                        }
+                        rowRenderData.setCells(cells);
+                        if (!rowRenderData.getCells().isEmpty()) {
+                            rows.add(rowRenderData);
+                        }
+                    }
+                    TableRenderData tableRenderData = new TableRenderData();
+                    tableRenderData.setRows(rows);
+                    int countSize = tableRenderData.getRows().get(0).getCells().size();
+                    for (RowRenderData row : tableRenderData.getRows()) {
+                        if (row.getCells().size() != countSize) {
+                            throw new ErrorException("姣忚鍗曞厓鏍间笉鐩哥瓑4");
+                        }
+                    }
+                    TableStyle tableStyle = new TableStyle();
+                    tableStyle.setWidth(XWPFTable.DEFAULT_PERCENTAGE_WIDTH);
+                    tableStyle.setAlign(TableRowAlign.CENTER);
+                    BorderStyle borderStyle = new BorderStyle();
+                    borderStyle.setColor("000000");
+                    borderStyle.setType(XWPFTable.XWPFBorderType.THICK);
+                    borderStyle.setSize(14);
+                    tableStyle.setLeftBorder(borderStyle);
+                    tableStyle.setTopBorder(borderStyle);
+                    tableStyle.setRightBorder(borderStyle);
+                    tableStyle.setBottomBorder(borderStyle);
+                    tableRenderData.setTableStyle(tableStyle);
+                    Map<String, Object> table = new HashMap<>();
+                    table.put("table5", tableRenderData);
+                    table.put("report", insReport);
+                    table.put("sample_number", sample.getSampleCode());
+                    table.put("type", sample.getModel());
+                    table.put("index5", index5.get());
+                    tables5.add(table);
+                    k += 7;
+                    index5.getAndIncrement();
+                }
+            }
+        });
+    }
+
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/handler/TemperatureCyclingReportHandler1.java b/cnas-require/src/main/java/com/ruoyi/requier/handler/TemperatureCyclingReportHandler1.java
new file mode 100644
index 0000000..ff2cac8
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/handler/TemperatureCyclingReportHandler1.java
@@ -0,0 +1,582 @@
+package com.ruoyi.requier.handler;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.deepoove.poi.data.*;
+import com.deepoove.poi.data.style.*;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.dto.SampleProductDto;
+import com.ruoyi.inspect.mapper.InsFiberMapper;
+import com.ruoyi.inspect.mapper.InsProductMapper;
+import com.ruoyi.inspect.mapper.InsProductResultMapper;
+import com.ruoyi.inspect.pojo.InsFiber;
+import com.ruoyi.inspect.pojo.InsProduct;
+import com.ruoyi.inspect.pojo.InsProductResult;
+import com.ruoyi.inspect.pojo.InsReport;
+import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
+import org.apache.poi.xwpf.usermodel.TableRowAlign;
+import org.apache.poi.xwpf.usermodel.XWPFTable;
+import org.apache.poi.xwpf.usermodel.XWPFTableCell;
+
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * 娓╁害寰幆鎶ュ憡鐢熸垚澶勭悊鏂规硶
+ */
+public class TemperatureCyclingReportHandler1 {
+
+    private final InsProductMapper insProductMapper;
+
+    private final InsFiberMapper insFiberMapper;
+
+    private final InsProductResultMapper insProductResultMapper;
+
+    public TemperatureCyclingReportHandler1(InsProductMapper insProductMapper, InsFiberMapper insFiberMapper, InsProductResultMapper insProductResultMapper) {
+        this.insProductMapper = insProductMapper;
+        this.insFiberMapper = insFiberMapper;
+        this.insProductResultMapper = insProductResultMapper;
+    }
+
+    public void doWrite(List<SampleProductDto> samples, InsReport insReport, List<Map<String, Object>> tables3) {
+        AtomicInteger index3 = new AtomicInteger(1);
+        // 鑷畾涔夋瘮杈冨櫒
+        Comparator<InsProduct> customComparator = Comparator.comparing(
+                InsProduct::getInspectionItemSubclass,
+                Comparator.naturalOrder()
+        );
+        samples.forEach(sample -> {
+            // 鏌ヨ娓╁害寰幆涓嬬殑妫�楠岄」鐩�
+            List<InsProduct> insPros = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                    .eq(InsProduct::getState, 1)
+                    .eq(InsProduct::getInsSampleId, sample.getId())
+                    .isNotNull(InsProduct::getSpecialItemParentId)
+                    .isNotNull(InsProduct::getInsFiberId)
+                    .isNotNull(InsProduct::getInspectionItemClass));
+            //鑾峰彇鎵�鏈夊厜绾よ壊鏍�
+            List<InsFiber> insFibers = insFiberMapper.selectBatchIds(insPros.stream().map(InsProduct::getInsFiberId).collect(Collectors.toList()));
+            //鑾峰彇鍏夌氦鑹叉爣鐨勬暟閲�(琛屾暟)
+            long size2 = insPros.stream().map(InsProduct::getInsFiberId).distinct().count();
+            //鑾峰彇鎵�鏈夌殑鍏夌氦椤圭洰(1310nm)
+            List<String> nm = insPros.stream().map(InsProduct::getInspectionItemClass).distinct().collect(Collectors.toList());
+            /*鍏堟牴鎹惊鐜鏁拌繘琛岄亶鍘�*/
+            Map<String, List<InsProduct>> xunhuans = insPros.stream().collect(Collectors.groupingBy(InsProduct::getInspectionItem));
+            for (int i = 0; i < xunhuans.entrySet().size(); i++) {
+                //鑾峰彇璇ュ惊鐜殑鎵�鏈夋俯搴�
+                String s1 = String.valueOf((i + 1));
+                //杩囨护鍑�20鈩�(甯告俯)鍜�20鈩�
+                List<InsProduct> filterList = xunhuans.get(s1).stream().filter(f->f.getInspectionItemSubclass().equals("20鈩�(甯告俯)")).collect(Collectors.toList());
+                List<InsProduct> filterList2 = xunhuans.get(s1).stream().filter(f->f.getInspectionItemSubclass().equals("20鈩�")).collect(Collectors.toList());
+                //鎺掑簭鍏朵粬娓╁害
+                List<InsProduct> sortList = xunhuans.get(s1).stream()
+                        .filter(f->!Arrays.asList("20鈩�(甯告俯)","20鈩�").contains(f.getInspectionItemSubclass()))
+                        .sorted(customComparator).collect(Collectors.toList());
+                //鍚堝苟
+                Map<String, List<InsProduct>> wendus = Stream.of(filterList,sortList,filterList2).flatMap(List::stream).collect(Collectors.groupingBy(
+                        InsProduct::getInspectionItemSubclass,
+                        LinkedHashMap::new, // 淇濊瘉 Map 涓敭鐨勯『搴忔槸鎻掑叆椤哄簭
+                        Collectors.toCollection(ArrayList::new) // 淇濊瘉姣忎釜缁勫唴鍏冪礌椤哄簭
+                ));
+                List<String> wendu = new ArrayList<>(wendus.keySet());
+                for (int m = 0; m < wendu.size(); m += 3) {
+                    //涓変釜娓╁害涓�寮犺〃,褰撻亶鍘嗗埌绗洓涓俯搴︾殑鏃跺�欓渶瑕侀噸鏂板缓琛�
+                    List<RowRenderData> rows = new ArrayList<>();
+                    //琛ㄦ牸鐨勮鏁�(鍏夌氦鑹叉爣鐨勬暟閲�+8)
+                    for (int j = 0; j < size2 + 8; j++) {
+                        RowRenderData rowRenderData = new RowRenderData();
+                        RowStyle rowStyle = new RowStyle();
+                        rowStyle.setHeight(40);
+                        rowRenderData.setRowStyle(rowStyle);
+                        List<CellRenderData> cells = new ArrayList<>();
+                        //琛ㄦ牸鐨勫垪鏁�(2*鍏夌氦椤圭洰*3+1)
+                        for (int k = 0; k < 6 * nm.size() + 1; k++) {
+                            CellRenderData cellRenderData = new CellRenderData();
+                            CellStyle cellStyle = new CellStyle();
+                            cellStyle.setVertAlign(XWPFTableCell.XWPFVertAlign.CENTER);
+                            cellRenderData.setCellStyle(cellStyle);
+                            List<ParagraphRenderData> paragraphRenderDataList = new ArrayList<>();
+                            ParagraphRenderData paragraphRenderData = new ParagraphRenderData();
+                            ParagraphStyle paragraphStyle = new ParagraphStyle();
+                            paragraphStyle.setAlign(ParagraphAlignment.CENTER);
+                            paragraphRenderData.setParagraphStyle(paragraphStyle);
+                            List<RenderData> renderData = new ArrayList<>();
+                            TextRenderData textRenderData = new TextRenderData();
+                            Style style = new Style();
+                            style.setFontFamily("瀹嬩綋");
+                            style.setColor("000000");
+                            style.setFontSize(10);
+                            textRenderData.setStyle(style);
+                            if (j == 0) {
+                                //绗竴琛�
+                                if (k <= (6L * nm.size() + 1) / 4) {
+                                    //绗竴鍒�
+                                    textRenderData.setText("鏍峰搧缂栧彿@Sample number鈭�1000");
+                                } else if (k > (6L * nm.size() + 1) / 4 && k <= (6L * nm.size() + 1) / 2) {
+                                    //绗簩鍒�
+                                    textRenderData.setText(sample.getSampleCode() + "鈭�998");
+                                } else if (k > (6L * nm.size() + 1) / 2 && k < 6L * nm.size()) {
+                                    //绗笁鍒�
+                                    textRenderData.setText("瑙勬牸鍨嬪彿@Type 鈭�999");
+                                } else {
+                                    //绗洓鍒�
+                                    textRenderData.setText(sample.getModel());
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                            else if (j == 1) {
+                                //绗簩琛�
+                                if (k == 0) {
+                                    //绗竴鍒�
+                                    textRenderData.setText("鍏夌氦鑹叉爣@ScanningNumber鈭�1004");
+                                } else {
+                                    textRenderData.setText("妫�娴嬬粨鏋滐紙dB/km锛�(寰幆" + (i + 1) + ")鈭�1005");
+                                }
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                            else if (j == 2) {
+                                //绗笁琛�
+                                if (k == 0) {
+                                    //绗竴鍒�
+                                    textRenderData.setText("鍏夌氦鑹叉爣@ScanningNumber鈭�1004");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (k <= 6L * nm.size() / 3) {
+                                    textRenderData.setText(wendu.get(m) + "鈭�52"+j + m);
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (k > 6L * nm.size() / 3 && k <= 6L * nm.size() / 3 * 2) {
+                                    int i1 = m + 1;
+                                    String s = "";
+                                    try {
+                                        s = wendu.get(m + 1);
+                                    } catch (Exception e) {
+                                    }
+                                    textRenderData.setText(s + "鈭�52"+j + i1);
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else {
+                                    int i1 = m + 2;
+                                    String s = "";
+                                    try {
+                                        s = wendu.get(m + 2);
+                                    } catch (Exception e) {
+                                    }
+                                    textRenderData.setText(s + "鈭�52" +j+ i1);
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                            else if (j == 3) {
+                                //绗洓琛�
+                                if (k == 0) {
+                                    //绗竴鍒�
+                                    textRenderData.setText("鍏夌氦鑹叉爣@ScanningNumber鈭�1004");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else {
+                                    for (int j1 = 0; j1 < 3; j1++) {//涓�寮犺〃3涓俯搴�
+                                        for (int i1 = 0; i1 < nm.size(); i1++) {//寰幆鍏夌氦椤圭洰:1310nm
+                                            if (k > 2 * j1 * nm.size() + 2 * i1 && k <= 2 * j1 * nm.size() + 2 * (i1 + 1)) {
+                                                textRenderData.setText(nm.get(i1) + "鈭�88888" + ((k + 1) / nm.size()) + i1);
+                                                renderData.add(textRenderData);
+                                                paragraphRenderData.setContents(renderData);
+                                                paragraphRenderDataList.add(paragraphRenderData);
+                                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                                cells.add(cellRenderData);
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                            else if (j == 4) {
+                                //绗簲琛�
+                                if (k == 0) {
+                                    //绗竴鍒�
+                                    textRenderData.setText("鍏夌氦鑹叉爣@ScanningNumber鈭�1004");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (k % 2 == 1) {
+                                    if (k <= 6L * nm.size() / 3 && wendu.get(m).equals("20鈩�(甯告俯)")) {
+                                        textRenderData.setText("琛板噺" + "鈭�42" +j+ k);
+                                    } else {
+                                        textRenderData.setText(" 琛板噺 ");
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else {
+                                    if (k <= 6L * nm.size() / 3 && wendu.get(m).equals("20鈩�(甯告俯)")) {
+                                        textRenderData.setText("琛板噺" + "鈭�42"+j + (k - 1));
+                                    } else {
+                                        textRenderData.setText("|鈭� 伪|");
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                            else if (j == size2 + 5) {
+                                //鍊掓暟绗笁琛�
+                                if (k == 0) {
+                                    //绗竴鍒�
+                                    textRenderData.setText("|max|");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                                else if (k % 2 == 0) {
+                                    String s = "";
+                                    if (k <= 6L * nm.size() / 3) {
+                                        s = wendu.get(m);
+                                    } else if (k > 6L * nm.size() / 3 && k <= 6L * nm.size() / 3 * 2) {
+                                        try {
+                                            s = wendu.get(m + 1);
+                                        } catch (Exception e) {
+                                        }
+                                    } else {
+                                        try {
+                                            s = wendu.get(m + 2);
+                                        } catch (Exception e) {
+                                        }
+                                    }
+                                    //璁$畻绗�()娓╁害鐨勭()涓」鐩殑鎵�鏈夎壊鏍囩殑鏈�缁堝�肩殑鏈�澶у��
+                                    if (s.equals("")) {
+                                        textRenderData.setText("");
+                                    } else {
+                                        try {
+                                            if (k <= 6L * nm.size() / 3 && wendu.get(m).equals("20鈩�(甯告俯)")){
+                                                List<Integer> ips = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                                                                .eq(InsProduct::getInsSampleId, sample.getId())
+                                                                .isNotNull(InsProduct::getInsFiberId)
+                                                                .eq(InsProduct::getInspectionItem, i + 1)
+                                                                .eq(InsProduct::getInspectionItemSubclass, s)
+                                                                .eq(InsProduct::getInspectionItemClass, nm.get((k - 2) / 2 % nm.size())))
+                                                        .stream().map(InsProduct::getId).collect(Collectors.toList());
+                                                List<InsProductResult> insProductResults = insProductResultMapper.selDetail(ips);
+                                                Optional<String> max = insProductResults.stream().map(insProductResult -> {
+                                                    {
+                                                        String[] splitStr = insProductResult.getComValue().split(":");
+                                                        return splitStr[splitStr.length - 1].split("\"")[1];
+                                                    }
+                                                }).filter(value -> !value.isEmpty()).max(String::compareTo);
+                                                textRenderData.setText(max.get() + "鈭�"+j+ (k-1));
+                                            }else {
+                                                Optional<String> max = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                                                                .eq(InsProduct::getInsSampleId, sample.getId())
+                                                                .isNotNull(InsProduct::getInsFiberId)
+                                                                .eq(InsProduct::getInspectionItem, i + 1)
+                                                                .eq(InsProduct::getInspectionItemSubclass, s)
+                                                                .eq(InsProduct::getInspectionItemClass, nm.get((k - 2) / 2 % nm.size())))
+                                                        .stream().map(InsProduct::getLastValue)
+                                                        .filter(value -> !value.isEmpty())
+                                                        .max(String::compareTo);
+                                                if (max.isPresent()) {
+                                                    textRenderData.setText(max.get());
+                                                } else {
+                                                    textRenderData.setText("");
+                                                }
+                                            }
+                                        } catch (Exception e) {
+                                            textRenderData.setText("");
+                                        }
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                                else {
+                                    String s = "";
+                                    if (k <= 6L * nm.size() / 3) {
+                                        s = wendu.get(m);
+                                    } else if (k > 6L * nm.size() / 3 && k <= 6L * nm.size() / 3 * 2) {
+                                        try {
+                                            s = wendu.get(m + 1);
+                                        } catch (Exception e) {
+                                        }
+                                    } else {
+                                        try {
+                                            s = wendu.get(m + 2);
+                                        } catch (Exception e) {
+                                        }
+                                    }
+                                    //璁$畻绗�()娓╁害鐨勭()涓」鐩殑鎵�鏈夎壊鏍囩殑骞冲潎鍊肩殑鏈�澶у��
+                                    if (s.equals("")) {
+                                        textRenderData.setText("");
+                                    } else {
+                                        List<Integer> ips = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                                                .eq(InsProduct::getInsSampleId, sample.getId())
+                                                .isNotNull(InsProduct::getInsFiberId)
+                                                .eq(InsProduct::getInspectionItem, i + 1)
+                                                .eq(InsProduct::getInspectionItemSubclass, s)
+                                                .eq(InsProduct::getInspectionItemClass, nm.get((k - 1) / 2 % nm.size()))).stream().map(InsProduct::getId).collect(Collectors.toList());
+                                        List<InsProductResult> insProductResults = insProductResultMapper.selDetail(ips);
+                                        Optional<String> max = insProductResults.stream().map(insProductResult -> {
+                                            {
+                                                String[] splitStr = insProductResult.getComValue().split(":");
+                                                return splitStr[splitStr.length - 1].split("\"")[1];
+                                            }
+                                        }).filter(value -> !value.isEmpty()).max(String::compareTo);
+                                        if (k <= 6L * nm.size() / 3 && wendu.get(m).equals("20鈩�(甯告俯)")){
+                                            textRenderData.setText(max.get() + "鈭�"+j+ k);
+                                        }else {
+                                            if (max.isPresent()) {
+                                                textRenderData.setText(max.get());
+                                            } else {
+                                                textRenderData.setText("");
+                                            }
+                                        }
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                            else if (j == size2 + 6) {
+                                //鍊掓暟绗簩琛�
+                                if (k == 0) {
+                                    //绗竴鍒�
+                                    textRenderData.setText("|鈭� 伪 max|");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (k % 2 == 0) {
+                                    String s = "";
+                                    if (k <= 6L * nm.size() / 3) {
+                                        s = wendu.get(m);
+                                    } else if (k > 6L * nm.size() / 3 && k <= 6L * nm.size() / 3 * 2) {
+                                        try {
+                                            s = wendu.get(m + 1);
+                                        } catch (Exception e) {
+                                        }
+                                    } else {
+                                        try {
+                                            s = wendu.get(m + 2);
+                                        } catch (Exception e) {
+                                        }
+                                    }
+                                    //璁$畻绗�()娓╁害鐨勭()涓」鐩殑鎵�鏈夎壊鏍囩殑鏈�缁堝�肩殑鏈�澶у��
+                                    if (s.equals("")) {
+                                        textRenderData.setText("");
+                                    } else {
+                                        if (k <= 6L * nm.size() / 3 && wendu.get(m).equals("20鈩�(甯告俯)")) {
+                                            textRenderData.setText("-" + "鈭�" + j + (k-1));
+                                        } else {
+                                            List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                                                    .eq(InsProduct::getInsSampleId, sample.getId())
+                                                    .isNotNull(InsProduct::getInsFiberId)
+                                                    .eq(InsProduct::getInspectionItem, i + 1)
+                                                    .eq(InsProduct::getInspectionItemSubclass, s)
+                                                    .eq(InsProduct::getInspectionItemClass, nm.get((k - 2) / 2 % nm.size())));
+                                            try {
+                                                Optional<String> max = insProducts.stream().map(InsProduct::getLastValue)
+                                                        .filter(value -> !value.isEmpty())
+                                                        .max(String::compareTo);
+                                                if (max.isPresent()) {
+                                                    textRenderData.setText(max.get());
+                                                } else {
+                                                    textRenderData.setText("");
+                                                }
+                                            } catch (Exception e) {
+                                                textRenderData.setText("");
+                                            }
+                                        }
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else {
+                                    if (k <= 6L * nm.size() / 3 && wendu.get(m).equals("20鈩�(甯告俯)")) {
+                                        textRenderData.setText("-" + "鈭�" + j + k);
+                                    } else {
+                                        textRenderData.setText("-");
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                            else if (j == size2 + 7) {
+                                //鍊掓暟绗竴琛�
+                                textRenderData.setText("鈥渱鈭� 伪|鈥濊〃绀洪檮鍔犺“鍑忕粷瀵瑰�尖垜111111");
+                                renderData.add(textRenderData);
+                                paragraphRenderData.setContents(renderData);
+                                paragraphRenderDataList.add(paragraphRenderData);
+                                cellRenderData.setParagraphs(paragraphRenderDataList);
+                                cells.add(cellRenderData);
+                            }
+                            else {
+                                //鍏朵綑濉啓妫�楠屽�肩殑鍐呭
+                                if (k == 0) {
+                                    //绗竴鍒楀~鍐欒壊鏍�
+                                    InsFiber insFiber = insFibers.get((j - 5));
+                                    textRenderData.setText(insFiber.getBushColor() + "-" + insFiber.getColor());
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (k % 2 == 0) {
+                                    //濉啓琛板噺宸氨鏄痩ast_value
+                                    String s = "";
+                                    if (k <= 6L * nm.size() / 3) {
+                                        s = wendu.get(m);
+                                    } else if (k > 6L * nm.size() / 3 && k <= 6L * nm.size() / 3 * 2) {
+                                        try {
+                                            s = wendu.get(m + 1);
+                                        } catch (Exception e) {
+                                        }
+                                    } else {
+                                        try {
+                                            s = wendu.get(m + 2);
+                                        } catch (Exception e) {
+                                        }
+                                    }
+                                    if (s.isEmpty()) {
+                                        textRenderData.setText("");
+                                    } else {
+                                        List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                                                .eq(InsProduct::getInsSampleId, sample.getId())
+                                                .isNotNull(InsProduct::getInsFiberId)
+                                                .eq(InsProduct::getInsFiberId, insFibers.get(j - 5).getId())
+                                                .eq(InsProduct::getInspectionItem, i + 1)
+                                                .eq(InsProduct::getInspectionItemSubclass, s)
+                                                .eq(InsProduct::getInspectionItemClass, nm.get((k - 2) / 2 % nm.size())));
+                                        if (k <= 6L * nm.size() / 3 && s.equals("20鈩�(甯告俯)")) {
+                                            String comValue = insProductResultMapper.selectOne(Wrappers.<InsProductResult>lambdaQuery()
+                                                            .eq(InsProductResult::getInsProductId, insProducts.get(0).getId()))
+                                                    .getComValue();
+                                            String[] splitStr = comValue.split(":");
+                                            textRenderData.setText(splitStr[splitStr.length - 1].split("\"")[1] + "鈭�" + j + (k - 1));
+                                        } else {
+                                            textRenderData.setText(insProducts.get(0).getLastValue());
+                                        }
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else {
+                                    //濉啓鍏朵綑姝e父娓╁害鐨勮“鍑�(result琛ㄩ噷闈㈢殑com_value)
+                                    String s = "";
+                                    if (k <= 6L * nm.size() / 3) {
+                                        s = wendu.get(m);
+                                    } else if (k > 6L * nm.size() / 3 && k <= 6L * nm.size() / 3 * 2) {
+                                        try {
+                                            s = wendu.get(m + 1);
+                                        } catch (Exception e) {
+                                        }
+                                    } else {
+                                        try {
+                                            s = wendu.get(m + 2);
+                                        } catch (Exception e) {
+                                        }
+                                    }
+                                    if (s.equals("")) {
+                                        textRenderData.setText("");
+                                    } else {
+                                        List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                                                .eq(InsProduct::getInsSampleId, sample.getId())
+                                                .isNotNull(InsProduct::getInsFiberId)
+                                                .eq(InsProduct::getInsFiberId, insFibers.get(j - 5).getId())
+                                                .eq(InsProduct::getInspectionItem, i + 1)
+                                                .eq(InsProduct::getInspectionItemSubclass, s)
+                                                .eq(InsProduct::getInspectionItemClass, nm.get((k - 1) / 2 % nm.size())));
+                                        String comValue = insProductResultMapper.selectOne(Wrappers.<InsProductResult>lambdaQuery()
+                                                        .eq(InsProductResult::getInsProductId, insProducts.get(0).getId()))
+                                                .getComValue();
+                                        String[] splitStr = comValue.split(":");
+                                        if (k <= 6L * nm.size() / 3 && s.equals("20鈩�(甯告俯)")) {
+                                            textRenderData.setText(splitStr[splitStr.length - 1].split("\"")[1] + "鈭�" + j + k);
+                                        } else {
+                                            textRenderData.setText(splitStr[splitStr.length - 1].split("\"")[1]);
+                                        }
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                        }
+                        rowRenderData.setCells(cells);
+                        if (!rowRenderData.getCells().isEmpty()) {
+                            rows.add(rowRenderData);
+                        }
+                    }
+                    TableRenderData tableRenderData = new TableRenderData();
+                    tableRenderData.setRows(rows);
+                    int countSize = tableRenderData.getRows().get(0).getCells().size();
+                    for (RowRenderData row : tableRenderData.getRows()) {
+                        if (row.getCells().size() != countSize) {
+                            throw new ErrorException("姣忚鍗曞厓鏍间笉鐩哥瓑5");
+                        }
+                    }
+                    TableStyle tableStyle = new TableStyle();
+                    tableStyle.setWidth(XWPFTable.DEFAULT_PERCENTAGE_WIDTH);
+                    tableStyle.setAlign(TableRowAlign.CENTER);
+                    BorderStyle borderStyle = new BorderStyle();
+                    borderStyle.setColor("000000");
+                    borderStyle.setType(XWPFTable.XWPFBorderType.THICK);
+                    borderStyle.setSize(14);
+                    tableStyle.setLeftBorder(borderStyle);
+                    tableStyle.setTopBorder(borderStyle);
+                    tableStyle.setRightBorder(borderStyle);
+                    tableStyle.setBottomBorder(borderStyle);
+                    tableRenderData.setTableStyle(tableStyle);
+                    Map<String, Object> table = new HashMap<>();
+                    table.put("table3", tableRenderData);
+                    table.put("report", insReport);
+                    table.put("index3", index3.get());
+                    tables3.add(table);
+                    index3.getAndIncrement();
+                }
+            }
+        });
+    }
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/handler/TemperatureTestReportHandler.java b/cnas-require/src/main/java/com/ruoyi/requier/handler/TemperatureTestReportHandler.java
new file mode 100644
index 0000000..58aa547
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/handler/TemperatureTestReportHandler.java
@@ -0,0 +1,367 @@
+package com.ruoyi.requier.handler;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.deepoove.poi.data.*;
+import com.deepoove.poi.data.style.*;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.dto.SampleProductDto;
+import com.ruoyi.inspect.mapper.InsProductMapper;
+import com.ruoyi.inspect.mapper.InsProductResultMapper;
+import com.ruoyi.inspect.pojo.InsProduct;
+import com.ruoyi.inspect.pojo.InsProductResult;
+import com.ruoyi.inspect.pojo.InsReport;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
+import org.apache.poi.xwpf.usermodel.TableRowAlign;
+import org.apache.poi.xwpf.usermodel.XWPFTable;
+import org.apache.poi.xwpf.usermodel.XWPFTableCell;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 娓╁崌璇曢獙鎶ュ憡澶勭悊绫�
+ */
+public class TemperatureTestReportHandler {
+
+    private final InsProductMapper insProductMapper;
+
+    private final InsProductResultMapper insProductResultMapper;
+
+    public TemperatureTestReportHandler(InsProductMapper insProductMapper, InsProductResultMapper insProductResultMapper){
+        this.insProductMapper = insProductMapper;
+        this.insProductResultMapper = insProductResultMapper;
+    }
+
+    /**
+     *
+     * @param samples   褰撳墠璁㈠崟鐨勬墍鏈夋牱鍝�
+     * @param insReport report瀵硅薄
+     * @param tables3   娓╁崌璇曢獙闄勪欢琛ㄦ牸鏁版嵁
+     */
+    public void doWrite(List<SampleProductDto> samples, InsReport insReport, List<Map<String,Object>> tables3){
+        samples.forEach(sample -> {
+            //鏌ヨ娓╁崌璇曢獙涓嬬殑妫�楠岄」鐩�
+            List<InsProduct> insPros = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                    .eq(InsProduct::getState, 1)
+                    .eq(InsProduct::getInsSampleId, sample.getId())
+                    .isNotNull(InsProduct::getSpecialItemParentId)  //鍖哄垎甯歌椤圭洰
+                    .isNull(InsProduct::getInspectionItemClass)//鐢ㄦ楠屽垎椤瑰瓧娈靛尯鍒俯鍗囪瘯楠屼笌鐑惊鐜�
+                    .isNull(InsProduct::getInsFiberId) //鐢ㄥ厜绾ゅ尯鍒俯鍗囪瘯楠屽拰娓╁害寰幆
+                    .eq(InsProduct::getInspectionItem, "1")); //娓╁崌璇曢獙鐨勫惊鐜彧鏈�1娆�
+            //鏌ヨ濉啓鐨勬楠屽�兼湁澶氬皯绉�
+            InsProductResult insProductResult = insProductResultMapper.selectList(Wrappers.<InsProductResult>lambdaQuery().eq(InsProductResult::getInsProductId, insPros.get(0).getId())).get(0);
+            int vCount = StringUtils.countMatches(insProductResult.getInsValue(), "\"v\":\"");
+            long index3 = 1;
+            for (int c = 0; c < vCount; c++) {
+                if (c % 16 == 0) {
+                    List<RowRenderData> rows = new ArrayList<>();
+                    //琛ㄦ牸鐨勮鏁�
+                    for (int i = 0; i < 3 + vCount; i++) {
+                        RowRenderData rowRenderData = new RowRenderData();
+                        RowStyle rowStyle = new RowStyle();
+                        rowStyle.setHeight(40);
+                        rowRenderData.setRowStyle(rowStyle);
+                        List<CellRenderData> cells = new ArrayList<>();
+                        String a = null;//瀵肩嚎娓╁害
+                        String b = null;//鑰愬紶娓╁害
+                        String d = null;//鎺ョ画娓╁害
+                        //鍒楁暟
+                        for (int j = 0; j < 6; j++) {
+                            CellRenderData cellRenderData = new CellRenderData();
+                            CellStyle cellStyle = new CellStyle();
+                            cellStyle.setVertAlign(XWPFTableCell.XWPFVertAlign.CENTER);
+                            cellRenderData.setCellStyle(cellStyle);
+                            List<ParagraphRenderData> paragraphRenderDataList = new ArrayList<>();
+                            ParagraphRenderData paragraphRenderData = new ParagraphRenderData();
+                            ParagraphStyle paragraphStyle = new ParagraphStyle();
+                            paragraphStyle.setAlign(ParagraphAlignment.CENTER);
+                            paragraphRenderData.setParagraphStyle(paragraphStyle);
+                            List<RenderData> renderData = new ArrayList<>();
+                            TextRenderData textRenderData = new TextRenderData();
+                            Style style = new Style();
+                            style.setFontFamily("瀹嬩綋");
+                            style.setColor("000000");
+                            textRenderData.setStyle(style);
+                            if (i == 0) {
+                                //绗竴琛�
+                                if (j == 0) {
+                                    //绗竴鍒�
+                                    textRenderData.setText("鏍峰搧缂栧彿@Sample number");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 1) {
+                                    //绗簩鍒�
+                                    textRenderData.setText(sample.getSampleCode());
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 2) {
+                                    //绗笁鍒�
+                                    textRenderData.setText("瑙勬牸鍨嬪彿@Type and size");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 3) {
+                                    //绗洓鍒�
+                                    textRenderData.setText(sample.getModel());
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 4) {
+                                    //绗簲鍒�
+                                    textRenderData.setText("妫�娴嬮」@Testing items");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else {
+                                    //绗叚鍒�
+                                    textRenderData.setText("娓╁崌璇曢獙@Temperature rise test");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            } else if (i == 1) {
+                                //绗簩琛�
+                                if (j == 0) {
+                                    //绗竴鍒�
+                                    textRenderData.setText("鐜娓╁害@Ambient temperature锛堚剝锛�");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 1) {
+                                    //绗簩鍒�
+                                    textRenderData.setText("瀵肩嚎娓╁害@Wire temperature锛堚剝锛�");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 2) {
+                                    //绗笁鍒�
+                                    textRenderData.setText("鑰愬紶娓╁害@Tensile temperature锛堚剝锛�");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 3) {
+                                    //绗洓鍒�
+                                    textRenderData.setText("鎺ョ画娓╁害@Connection temperature锛堚剝锛�");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else {
+                                    //绗簲鍒楃鍏垪
+                                    textRenderData.setText("缁撴灉鍒ゅ畾@Result judgment鈭�100");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                            else if (i == 2 + vCount) {
+                                //鏈�鍚庝竴琛�
+                                if (j == 0 || j == 1) {
+                                    //绗竴鍒楀拰绗簩鍒�
+                                    textRenderData.setText("澶囨敞鈭�101");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else {
+                                    //鍏朵綑鍒�
+                                    textRenderData.setText("鈥溾垰鈥濊〃绀洪」鐩悎鏍硷紝鈥溍椻�濊〃绀洪」鐩笉鍚堟牸銆傗垜102");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                            else {
+                                //鍏朵綑琛�
+                                if (j == 0) {
+                                    //绗竴鍒�(鐜娓╁害)
+                                    InsProduct insPro = insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
+                                            .eq(InsProduct::getState, 1)
+                                            .eq(InsProduct::getInsSampleId, sample.getId())
+                                            .eq(InsProduct::getInspectionItemSubclass, "鐜娓╁害")
+                                            .isNotNull(InsProduct::getSpecialItemParentId)  //鍖哄垎甯歌椤圭洰
+                                            .isNull(InsProduct::getInspectionItemClass)//鐢ㄦ楠屽垎椤瑰瓧娈靛尯鍒俯鍗囪瘯楠屼笌鐑惊鐜�
+                                            .isNull(InsProduct::getInsFiberId) //鐢ㄥ厜绾ゅ尯鍒俯鍗囪瘯楠屽拰娓╁害寰幆
+                                            .eq(InsProduct::getInspectionItem, "1")); //娓╁崌璇曢獙鐨勫惊鐜彧鏈�1娆�
+                                    String insValue = insProductResultMapper.selectList(Wrappers.<InsProductResult>lambdaQuery().eq(InsProductResult::getInsProductId, insPro.getId())).get(0).getInsValue();
+                                    JSONArray jsonArray = JSONArray.parseArray(insValue);
+                                    JSONObject jsonObject = jsonArray.getJSONObject(i - 2);
+                                    String vValue = jsonObject.getString("v");
+                                    System.out.println("鐜娓╁害绗� " + (i - 1) + " 涓� 'v' 瀛楁鐨勫�兼槸: " + vValue);
+                                    textRenderData.setText(vValue);
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                                else if (j == 1) {
+                                    //绗簩鍒�(瀵肩嚎娓╁害)
+                                    InsProduct insPro = insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
+                                            .eq(InsProduct::getState, 1)
+                                            .eq(InsProduct::getInsSampleId, sample.getId())
+                                            .eq(InsProduct::getInspectionItemSubclass, "瀵肩嚎娓╁害")
+                                            .isNotNull(InsProduct::getSpecialItemParentId)  //鍖哄垎甯歌椤圭洰
+                                            .isNull(InsProduct::getInspectionItemClass)//鐢ㄦ楠屽垎椤瑰瓧娈靛尯鍒俯鍗囪瘯楠屼笌鐑惊鐜�
+                                            .isNull(InsProduct::getInsFiberId) //鐢ㄥ厜绾ゅ尯鍒俯鍗囪瘯楠屽拰娓╁害寰幆
+                                            .eq(InsProduct::getInspectionItem, "1")); //娓╁崌璇曢獙鐨勫惊鐜彧鏈�1娆�
+                                    String insValue = insProductResultMapper.selectList(Wrappers.<InsProductResult>lambdaQuery().eq(InsProductResult::getInsProductId, insPro.getId())).get(0).getInsValue();
+                                    JSONArray jsonArray = JSONArray.parseArray(insValue);
+                                    JSONObject jsonObject = jsonArray.getJSONObject(i - 2);
+                                    String vValue = jsonObject.getString("v");
+                                    a = vValue;
+                                    System.out.println("瀵肩嚎娓╁害绗� " + (i - 1) + " 涓� 'v' 瀛楁鐨勫�兼槸: " + vValue);
+                                    textRenderData.setText(vValue);
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                                else if (j == 2) {
+                                    //绗笁鍒�(鑰愬紶娓╁害)
+                                    InsProduct insPro = insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
+                                            .eq(InsProduct::getState, 1)
+                                            .eq(InsProduct::getInsSampleId, sample.getId())
+                                            .eq(InsProduct::getInspectionItemSubclass, "鑰愬紶娓╁害")
+                                            .isNotNull(InsProduct::getSpecialItemParentId)  //鍖哄垎甯歌椤圭洰
+                                            .isNull(InsProduct::getInspectionItemClass)//鐢ㄦ楠屽垎椤瑰瓧娈靛尯鍒俯鍗囪瘯楠屼笌鐑惊鐜�
+                                            .isNull(InsProduct::getInsFiberId) //鐢ㄥ厜绾ゅ尯鍒俯鍗囪瘯楠屽拰娓╁害寰幆
+                                            .eq(InsProduct::getInspectionItem, "1")); //娓╁崌璇曢獙鐨勫惊鐜彧鏈�1娆�
+                                    if (ObjectUtils.isNotEmpty(insPro)) {
+                                        String insValue = insProductResultMapper.selectList(Wrappers.<InsProductResult>lambdaQuery().eq(InsProductResult::getInsProductId, insPro.getId())).get(0).getInsValue();
+                                        JSONArray jsonArray = JSONArray.parseArray(insValue);
+                                        JSONObject jsonObject = jsonArray.getJSONObject(i - 2);
+                                        String vValue = jsonObject.getString("v");
+                                        b = vValue;
+                                        System.out.println("鑰愬紶娓╁害绗� " + (i - 1) + " 涓� 'v' 瀛楁鐨勫�兼槸: " + vValue);
+                                        textRenderData.setText(vValue);
+                                    } else {
+                                        textRenderData.setText("");
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                                else if (j == 3) {
+                                    //绗洓鍒�(鎺ョ画娓╁害)
+                                    InsProduct insPro = insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
+                                            .eq(InsProduct::getState, 1)
+                                            .eq(InsProduct::getInsSampleId, sample.getId())
+                                            .eq(InsProduct::getInspectionItemSubclass, "鎺ョ画娓╁害")
+                                            .isNotNull(InsProduct::getSpecialItemParentId)  //鍖哄垎甯歌椤圭洰
+                                            .isNull(InsProduct::getInspectionItemClass)//鐢ㄦ楠屽垎椤瑰瓧娈靛尯鍒俯鍗囪瘯楠屼笌鐑惊鐜�
+                                            .isNull(InsProduct::getInsFiberId) //鐢ㄥ厜绾ゅ尯鍒俯鍗囪瘯楠屽拰娓╁害寰幆
+                                            .eq(InsProduct::getInspectionItem, "1")); //娓╁崌璇曢獙鐨勫惊鐜彧鏈�1娆�
+                                    if (ObjectUtils.isNotEmpty(insPro)) {
+                                        String insValue = insProductResultMapper.selectList(Wrappers.<InsProductResult>lambdaQuery().eq(InsProductResult::getInsProductId, insPro.getId())).get(0).getInsValue();
+                                        JSONArray jsonArray = JSONArray.parseArray(insValue);
+                                        JSONObject jsonObject = jsonArray.getJSONObject(i - 2);
+                                        String vValue = jsonObject.getString("v");
+                                        d = vValue;
+                                        System.out.println("鎺ョ画娓╁害绗� " + (i - 1) + " 涓� 'v' 瀛楁鐨勫�兼槸: " + vValue);
+                                        textRenderData.setText(vValue);
+                                    } else {
+                                        textRenderData.setText("");
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                                else {
+                                    //绗簲鍒� 绗叚鍒�(缁撹)
+                                    //鍒ゆ柇鍚堟牸涓庝笉鍚堟牸
+                                    BigDecimal decimal1 = new BigDecimal(a);
+                                    BigDecimal decimal2 = new BigDecimal(b == null ? "0" : b);
+                                    BigDecimal decimal3 = new BigDecimal(d == null ? "0" : d);
+                                    if (decimal1.compareTo(decimal2) > 0 && decimal1.compareTo(decimal3) > 0) {
+                                        textRenderData.setText("鈭氣垜20"+i);
+                                    } else {
+                                        textRenderData.setText("脳鈭�20"+i);
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                        }
+                        rowRenderData.setCells(cells);
+                        if (rowRenderData.getCells().size() != 0) {
+                            rows.add(rowRenderData);
+                        }
+                    }
+                    TableRenderData tableRenderData = new TableRenderData();
+                    tableRenderData.setRows(rows);
+                    int countSize = tableRenderData.getRows().get(0).getCells().size();
+                    for (RowRenderData row : tableRenderData.getRows()) {
+                            /*for (CellRenderData cell : row.getCells()) {
+                                System.out.print(cell.getParagraphs().get(0).getContents());
+                            }
+                            System.out.println("");*/
+                        if (row.getCells().size() != countSize) {
+                            throw new ErrorException("姣忚鍗曞厓鏍间笉鐩哥瓑5");
+                        }
+                    }
+                    TableStyle tableStyle = new TableStyle();
+                    tableStyle.setWidth(XWPFTable.DEFAULT_PERCENTAGE_WIDTH);
+                    tableStyle.setAlign(TableRowAlign.CENTER);
+                    BorderStyle borderStyle = new BorderStyle();
+                    borderStyle.setColor("000000");
+                    borderStyle.setType(XWPFTable.XWPFBorderType.THICK);
+                    borderStyle.setSize(14);
+                    tableStyle.setLeftBorder(borderStyle);
+                    tableStyle.setTopBorder(borderStyle);
+                    tableStyle.setRightBorder(borderStyle);
+                    tableStyle.setBottomBorder(borderStyle);
+                    tableRenderData.setTableStyle(tableStyle);
+                    Map<String, Object> table = new HashMap<>();
+                    table.put("table3", tableRenderData);
+                    table.put("report", insReport);
+                    table.put("index3", index3);
+                    tables3.add(table);
+                    index3++;
+                }
+            }
+        });
+    }
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/handler/ThermalCycleReportHandler.java b/cnas-require/src/main/java/com/ruoyi/requier/handler/ThermalCycleReportHandler.java
new file mode 100644
index 0000000..47534c9
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/handler/ThermalCycleReportHandler.java
@@ -0,0 +1,599 @@
+package com.ruoyi.requier.handler;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.deepoove.poi.data.*;
+import com.deepoove.poi.data.style.*;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.dto.SampleProductDto;
+import com.ruoyi.inspect.mapper.InsProductMapper;
+import com.ruoyi.inspect.mapper.InsProductResultMapper;
+import com.ruoyi.inspect.pojo.InsProduct;
+import com.ruoyi.inspect.pojo.InsProductResult;
+import com.ruoyi.inspect.pojo.InsReport;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
+import org.apache.poi.xwpf.usermodel.TableRowAlign;
+import org.apache.poi.xwpf.usermodel.XWPFTable;
+import org.apache.poi.xwpf.usermodel.XWPFTableCell;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鐑惊鐜姤鍛婂鐞嗙被
+ */
+public class ThermalCycleReportHandler {
+
+
+    private final InsProductMapper insProductMapper;
+
+    private final InsProductResultMapper insProductResultMapper;
+
+    public ThermalCycleReportHandler(InsProductMapper insProductMapper, InsProductResultMapper insProductResultMapper){
+        this.insProductMapper = insProductMapper;
+        this.insProductResultMapper = insProductResultMapper;
+    }
+
+    /**
+     *
+     * @param samples   褰撳墠璁㈠崟鐨勬墍鏈夋牱鍝�
+     * @param insReport report瀵硅薄
+     * @param tables3   鐑惊鐜檮浠惰〃鏍兼暟鎹�
+     */
+    public void doWrite(List<SampleProductDto> samples, InsReport insReport, List<Map<String,Object>> tables3){
+        samples.forEach(sample -> {
+            //璁$畻鏁版嵁鐨勮鏁�,鍏堟煡鍑烘湁澶氬皯娆″惊鐜�,鍐嶆煡姣忎釜寰幆鐨勫~鍐欐暟閲�
+            InsProduct insProduct = insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
+                    .eq(InsProduct::getState, 1)
+                    .eq(InsProduct::getInsSampleId, sample.getId())
+                    .eq(InsProduct::getInspectionItem, "鐑惊鐜�"));
+            String[] split = insProduct.getAsk().split(";");
+            Integer cycle = Integer.parseInt(split[split.length - 1]);//寰幆娆℃暟
+            int vCount = 0;
+            List<Integer> list = new ArrayList<>();
+            for (Integer i = 1; i <= cycle; i++) {
+                //鏌ユ瘡涓惊鐜噷闈㈢殑濉啓鏁伴噺
+                List<InsProduct> insPros = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                        .eq(InsProduct::getState, 1)
+                        .eq(InsProduct::getInsSampleId, sample.getId())
+                        .isNotNull(InsProduct::getSpecialItemParentId)  //鍖哄垎甯歌椤圭洰
+                        .eq(InsProduct::getInspectionItemClass, "鐩存祦鐢甸樆")
+                        .isNull(InsProduct::getInsFiberId) //鐢ㄥ厜绾ゅ尯鍒俯鍗囪瘯楠屽拰娓╁害寰幆
+                        .eq(InsProduct::getInspectionItem, i + ""));
+                InsProductResult insProductResult = insProductResultMapper.selectList(Wrappers.<InsProductResult>lambdaQuery().eq(InsProductResult::getInsProductId, insPros.get(0).getId())).get(0);
+                vCount += StringUtils.countMatches(insProductResult.getInsValue(), "\"v\":\"");
+                list.add(StringUtils.countMatches(insProductResult.getInsValue(), "\"v\":\""));
+            }
+            long index3 = 1;
+            for (int c = 0; c < vCount; c++) {
+                if (c % 18 == 0) {
+                    List<RowRenderData> rows = new ArrayList<>();
+                    //琛ㄦ牸鐨勮鏁�
+                    for (int i = 0; i < 4 + vCount; i++) {
+                        RowRenderData rowRenderData = new RowRenderData();
+                        RowStyle rowStyle = new RowStyle();
+                        rowStyle.setHeight(40);
+                        rowRenderData.setRowStyle(rowStyle);
+                        List<CellRenderData> cells = new ArrayList<>();
+                        String a = null;//瀵肩嚎娓╁害
+                        String b = null;//鑰愬紶娓╁害
+                        String d = null;//鎺ョ画娓╁害
+                        //鍒楁暟
+                        for (int j = 0; j < 9; j++) {
+                            CellRenderData cellRenderData = new CellRenderData();
+                            CellStyle cellStyle = new CellStyle();
+                            cellStyle.setVertAlign(XWPFTableCell.XWPFVertAlign.CENTER);
+                            cellRenderData.setCellStyle(cellStyle);
+                            List<ParagraphRenderData> paragraphRenderDataList = new ArrayList<>();
+                            ParagraphRenderData paragraphRenderData = new ParagraphRenderData();
+                            ParagraphStyle paragraphStyle = new ParagraphStyle();
+                            paragraphStyle.setAlign(ParagraphAlignment.CENTER);
+                            paragraphRenderData.setParagraphStyle(paragraphStyle);
+                            List<RenderData> renderData = new ArrayList<>();
+                            TextRenderData textRenderData = new TextRenderData();
+                            Style style = new Style();
+                            style.setFontFamily("瀹嬩綋");
+                            style.setColor("000000");
+                            textRenderData.setStyle(style);
+                            if (i == 0) {
+                                //绗竴琛�
+                                if (j == 0) {
+                                    //绗竴鍒�
+                                    textRenderData.setText("鏍峰搧缂栧彿@Sample number");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 1) {
+                                    //绗簩鍒�
+                                    textRenderData.setText(sample.getSampleCode());
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 2 || j == 3) {
+                                    //绗笁鍒楀拰绗洓鍒�
+                                    textRenderData.setText("瑙勬牸鍨嬪彿@Type and size鈭�301");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 4 || j == 5) {
+                                    //绗簲鍒楀拰绗叚鍒�
+                                    textRenderData.setText(sample.getModel()+"鈭�302");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 6) {
+                                    //绗竷鍒�
+                                    textRenderData.setText("妫�娴嬮」@Testing items");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else {
+                                    //绗叓鍒楀拰绗節鍒�
+                                    textRenderData.setText("鐑惊鐜疈Thermal cycle鈭�303");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                            else if (i == 1) {
+                                //绗簩琛�
+                                if (j == 0) {
+                                    //绗竴鍒�
+                                    textRenderData.setText("寰幆娆℃暟@Number of cycles(times)鈭�100");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 1) {
+                                    //绗簩鍒�
+                                    textRenderData.setText("鐜娓╁害@Ambient temperature锛堚剝锛夆垜101");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 2 || j == 3) {
+                                    //绗笁鍒楀拰绗洓鍒�
+                                    textRenderData.setText("瀵肩嚎@Conductor鈭�102");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 4 || j == 5) {
+                                    //绗簲鍒楀拰绗叚鍒�
+                                    textRenderData.setText("鑰愬紶绾垮す@Tension clamp鈭�103");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 6 || j == 7) {
+                                    //绗竷鍒楃鍏垪
+                                    textRenderData.setText("鎺ョ画閲戝叿@Splicing fittings鈭�104");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else {
+                                    //绗節鍒�
+                                    textRenderData.setText("缁撴灉鍒ゅ畾@Result judgment鈭�105");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                            else if (i == 2) {
+                                //绗笁琛�
+                                if (j == 0) {
+                                    //绗竴鍒�
+                                    textRenderData.setText("寰幆娆℃暟@Number of cycles(times)鈭�100");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 1) {
+                                    //绗簩鍒�
+                                    textRenderData.setText("鐜娓╁害@Ambient temperature锛堚剝锛夆垜101");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 2) {
+                                    //绗笁鍒�
+                                    textRenderData.setText("娓╁害@Temperature锛堚剝锛�");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 3) {
+                                    //绗洓鍒�
+                                    textRenderData.setText("鐩存祦鐢甸樆@DC resistance锛埼�/km锛�");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 4) {
+                                    //绗簲鍒�
+                                    textRenderData.setText("娓╁害@Temperature锛堚剝锛�");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 5) {
+                                    //绗叚鍒�
+                                    textRenderData.setText("鐩存祦鐢甸樆@DC resistance锛埼�/km锛�");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 6) {
+                                    //绗竷鍒�
+                                    textRenderData.setText("娓╁害@Temperature锛堚剝锛�");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else if (j == 7) {
+                                    //绗叓鍒�
+                                    textRenderData.setText("鐩存祦鐢甸樆@DC resistance锛埼�/km锛�");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else {
+                                    //绗節鍒�
+                                    textRenderData.setText("缁撴灉鍒ゅ畾@Result judgment鈭�105");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                            else if (i == 3 + vCount) {
+                                //鏈�鍚庝竴琛�
+                                if (j == 0) {
+                                    //绗竴鍒�
+                                    textRenderData.setText("澶囨敞");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                } else {
+                                    //鍏朵綑鍒�
+                                    textRenderData.setText("鈥溾垰鈥濊〃绀洪」鐩悎鏍硷紝鈥溍椻�濊〃绀洪」鐩笉鍚堟牸銆傗垜108");
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                            else {
+                                //鍏朵綑琛�
+                                if (j == 0) {
+                                    //绗竴鍒�
+                                    int aa= 0;
+                                    for (int m = 0; m < cycle; m++) {
+                                        aa += list.get(m);
+                                        if (i-3<aa){
+                                            textRenderData.setText((m+1)+"");
+                                            break;
+                                        }
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                                else if (j == 1) {
+                                    //绗簩鍒�
+                                    int aa= 0;
+                                    for (int m = 0; m < cycle; m++) {
+                                        aa += list.get(m);
+                                        if (i-3<aa){
+                                            InsProduct insPro = insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
+                                                    .eq(InsProduct::getState, 1)
+                                                    .eq(InsProduct::getInsSampleId, sample.getId())
+                                                    .eq(InsProduct::getInspectionItemSubclass, "鐜娓╁害")
+                                                    .isNotNull(InsProduct::getSpecialItemParentId)
+                                                    .eq(InsProduct::getInspectionItemClass,"鐩存祦鐢甸樆")
+                                                    .isNull(InsProduct::getInsFiberId)
+                                                    .eq(InsProduct::getInspectionItem, (m+1)+""));
+                                            String insValue = insProductResultMapper.selectList(Wrappers.<InsProductResult>lambdaQuery().eq(InsProductResult::getInsProductId, insPro.getId())).get(0).getInsValue();
+                                            JSONArray jsonArray = JSONArray.parseArray(insValue);
+                                            JSONObject jsonObject = jsonArray.getJSONObject(i - 3-(aa-list.get(m)));
+                                            String vValue = jsonObject.getString("v");
+                                            System.out.println("鐜娓╁害绗� " + (i - 2-(aa-list.get(m))) + " 涓� 'v' 瀛楁鐨勫�兼槸: " + vValue);
+                                            textRenderData.setText(vValue);
+                                            break;
+                                        }
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                                else if (j == 2) {
+                                    //绗笁鍒�
+                                    int aa= 0;
+                                    for (int m = 0; m < cycle; m++) {
+                                        aa += list.get(m);
+                                        if (i-3<aa){
+                                            InsProduct insPro = insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
+                                                    .eq(InsProduct::getState, 1)
+                                                    .eq(InsProduct::getInsSampleId, sample.getId())
+                                                    .eq(InsProduct::getInspectionItemSubclass, "瀵肩嚎娓╁害")
+                                                    .isNotNull(InsProduct::getSpecialItemParentId)
+                                                    .eq(InsProduct::getInspectionItemClass,"鐩存祦鐢甸樆")
+                                                    .isNull(InsProduct::getInsFiberId)
+                                                    .eq(InsProduct::getInspectionItem, (m+1)+""));
+                                            if (ObjectUtils.isNotEmpty(insPro)) {
+                                                String insValue = insProductResultMapper.selectList(Wrappers.<InsProductResult>lambdaQuery().eq(InsProductResult::getInsProductId, insPro.getId())).get(0).getInsValue();
+                                                JSONArray jsonArray = JSONArray.parseArray(insValue);
+                                                JSONObject jsonObject = jsonArray.getJSONObject(i - 3 - (aa - list.get(m)));
+                                                String vValue = jsonObject.getString("v");
+                                                a=vValue;
+                                                System.out.println("瀵肩嚎娓╁害绗� " + (i - 2 - (aa - list.get(m))) + " 涓� 'v' 瀛楁鐨勫�兼槸: " + vValue);
+                                                textRenderData.setText(vValue);
+                                            }else textRenderData.setText("");
+                                            break;
+                                        }
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                                else if (j == 3) {
+                                    //绗洓鍒�
+                                    int aa= 0;
+                                    for (int m = 0; m < cycle; m++) {
+                                        aa += list.get(m);
+                                        if (i-3<aa){
+                                            InsProduct insPro = insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
+                                                    .eq(InsProduct::getState, 1)
+                                                    .eq(InsProduct::getInsSampleId, sample.getId())
+                                                    .eq(InsProduct::getInspectionItemSubclass, "瀵肩嚎娓╁害")
+                                                    .isNotNull(InsProduct::getSpecialItemParentId)
+                                                    .eq(InsProduct::getInspectionItemClass,"鐩存祦鐢甸樆")
+                                                    .isNull(InsProduct::getInsFiberId)
+                                                    .eq(InsProduct::getInspectionItem, (m+1)+""));
+                                            if (ObjectUtils.isNotEmpty(insPro)) {
+                                                String insValue = insProductResultMapper.selectList(Wrappers.<InsProductResult>lambdaQuery().eq(InsProductResult::getInsProductId, insPro.getId())).get(0).getInsValue();
+                                                JSONArray jsonArray = JSONArray.parseArray(insValue);
+                                                JSONObject jsonObject = jsonArray.getJSONObject(i - 3 - (aa - list.get(m)));
+                                                String vValue = jsonObject.getString("w");
+                                                System.out.println("瀵肩嚎娓╁害绗� " + (i - 2 - (aa - list.get(m))) + " 涓� 'w' 瀛楁鐨勫�兼槸: " + vValue);
+                                                textRenderData.setText(vValue);
+                                            }else textRenderData.setText("");
+                                            break;
+                                        }
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                                else if (j == 4) {
+                                    //绗簲鍒�
+                                    int aa= 0;
+                                    for (int m = 0; m < cycle; m++) {
+                                        aa += list.get(m);
+                                        if (i-3<aa){
+                                            InsProduct insPro = insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
+                                                    .eq(InsProduct::getState, 1)
+                                                    .eq(InsProduct::getInsSampleId, sample.getId())
+                                                    .eq(InsProduct::getInspectionItemSubclass, "鑰愬紶娓╁害")
+                                                    .isNotNull(InsProduct::getSpecialItemParentId)
+                                                    .eq(InsProduct::getInspectionItemClass,"鐩存祦鐢甸樆")
+                                                    .isNull(InsProduct::getInsFiberId)
+                                                    .eq(InsProduct::getInspectionItem, (m+1)+""));
+                                            if (ObjectUtils.isNotEmpty(insPro)) {
+                                                String insValue = insProductResultMapper.selectList(Wrappers.<InsProductResult>lambdaQuery().eq(InsProductResult::getInsProductId, insPro.getId())).get(0).getInsValue();
+                                                JSONArray jsonArray = JSONArray.parseArray(insValue);
+                                                JSONObject jsonObject = jsonArray.getJSONObject(i - 3 - (aa - list.get(m)));
+                                                String vValue = jsonObject.getString("v");
+                                                b=vValue;
+                                                System.out.println("鑰愬紶娓╁害绗� " + (i - 2 - (aa - list.get(m))) + " 涓� 'v' 瀛楁鐨勫�兼槸: " + vValue);
+                                                textRenderData.setText(vValue);
+                                            }else textRenderData.setText("");
+                                            break;
+                                        }
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                                else if (j == 5) {
+                                    //绗叚鍒�
+                                    int aa= 0;
+                                    for (int m = 0; m < cycle; m++) {
+                                        aa += list.get(m);
+                                        if (i-3<aa){
+                                            InsProduct insPro = insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
+                                                    .eq(InsProduct::getState, 1)
+                                                    .eq(InsProduct::getInsSampleId, sample.getId())
+                                                    .eq(InsProduct::getInspectionItemSubclass, "鑰愬紶娓╁害")
+                                                    .isNotNull(InsProduct::getSpecialItemParentId)
+                                                    .eq(InsProduct::getInspectionItemClass,"鐩存祦鐢甸樆")
+                                                    .isNull(InsProduct::getInsFiberId)
+                                                    .eq(InsProduct::getInspectionItem, (m+1)+""));
+                                            if (ObjectUtils.isNotEmpty(insPro)) {
+                                                String insValue = insProductResultMapper.selectList(Wrappers.<InsProductResult>lambdaQuery().eq(InsProductResult::getInsProductId, insPro.getId())).get(0).getInsValue();
+                                                JSONArray jsonArray = JSONArray.parseArray(insValue);
+                                                JSONObject jsonObject = jsonArray.getJSONObject(i - 3 - (aa - list.get(m)));
+                                                String vValue = jsonObject.getString("w");
+                                                System.out.println("鑰愬紶娓╁害绗� " + (i - 2 - (aa - list.get(m))) + " 涓� 'w' 瀛楁鐨勫�兼槸: " + vValue);
+                                                textRenderData.setText(vValue);
+                                            }else textRenderData.setText("");
+                                            break;
+                                        }
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                                else if (j == 6) {
+                                    //绗竷鍒�
+                                    int aa= 0;
+                                    for (int m = 0; m < cycle; m++) {
+                                        aa += list.get(m);
+                                        if (i-3<aa){
+                                            InsProduct insPro = insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
+                                                    .eq(InsProduct::getState, 1)
+                                                    .eq(InsProduct::getInsSampleId, sample.getId())
+                                                    .eq(InsProduct::getInspectionItemSubclass, "鎺ョ画娓╁害")
+                                                    .isNotNull(InsProduct::getSpecialItemParentId)
+                                                    .eq(InsProduct::getInspectionItemClass,"鐩存祦鐢甸樆")
+                                                    .isNull(InsProduct::getInsFiberId)
+                                                    .eq(InsProduct::getInspectionItem, (m+1)+""));
+                                            if (ObjectUtils.isNotEmpty(insPro)) {
+                                                String insValue = insProductResultMapper.selectList(Wrappers.<InsProductResult>lambdaQuery().eq(InsProductResult::getInsProductId, insPro.getId())).get(0).getInsValue();
+                                                JSONArray jsonArray = JSONArray.parseArray(insValue);
+                                                JSONObject jsonObject = jsonArray.getJSONObject(i - 3 - (aa - list.get(m)));
+                                                String vValue = jsonObject.getString("v");
+                                                d=vValue;
+                                                System.out.println("鎺ョ画娓╁害绗� " + (i - 2 - (aa - list.get(m))) + " 涓� 'v' 瀛楁鐨勫�兼槸: " + vValue);
+                                                textRenderData.setText(vValue);
+                                            }else textRenderData.setText("");
+                                            break;
+                                        }
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                                else if (j == 7) {
+                                    //绗叓鍒�
+                                    int aa= 0;
+                                    for (int m = 0; m < cycle; m++) {
+                                        aa += list.get(m);
+                                        if (i-3<aa){
+                                            InsProduct insPro = insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
+                                                    .eq(InsProduct::getState, 1)
+                                                    .eq(InsProduct::getInsSampleId, sample.getId())
+                                                    .eq(InsProduct::getInspectionItemSubclass, "鎺ョ画娓╁害")
+                                                    .isNotNull(InsProduct::getSpecialItemParentId)
+                                                    .eq(InsProduct::getInspectionItemClass,"鐩存祦鐢甸樆")
+                                                    .isNull(InsProduct::getInsFiberId)
+                                                    .eq(InsProduct::getInspectionItem, (m+1)+""));
+                                            if (ObjectUtils.isNotEmpty(insPro)) {
+                                                String insValue = insProductResultMapper.selectList(Wrappers.<InsProductResult>lambdaQuery().eq(InsProductResult::getInsProductId, insPro.getId())).get(0).getInsValue();
+                                                JSONArray jsonArray = JSONArray.parseArray(insValue);
+                                                JSONObject jsonObject = jsonArray.getJSONObject(i - 3 - (aa - list.get(m)));
+                                                String vValue = jsonObject.getString("w");
+                                                System.out.println("鎺ョ画娓╁害绗� " + (i - 2 - (aa - list.get(m))) + " 涓� 'w' 瀛楁鐨勫�兼槸: " + vValue);
+                                                textRenderData.setText(vValue);
+                                            }else textRenderData.setText("");
+                                            break;
+                                        }
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                                else  {
+                                    //鍒ゆ柇鍚堟牸涓庝笉鍚堟牸
+                                    BigDecimal decimal1 = new BigDecimal(a);
+                                    BigDecimal decimal2 = new BigDecimal(b == null ? "0" : b);
+                                    BigDecimal decimal3 = new BigDecimal(d == null ? "0" : d);
+                                    if (decimal1.compareTo(decimal2) > 0 && decimal1.compareTo(decimal3) > 0) {
+                                        textRenderData.setText("鈭�");
+                                    } else {
+                                        textRenderData.setText("脳");
+                                    }
+                                    renderData.add(textRenderData);
+                                    paragraphRenderData.setContents(renderData);
+                                    paragraphRenderDataList.add(paragraphRenderData);
+                                    cellRenderData.setParagraphs(paragraphRenderDataList);
+                                    cells.add(cellRenderData);
+                                }
+                            }
+                        }
+                        rowRenderData.setCells(cells);
+                        if (rowRenderData.getCells().size() != 0) {
+                            rows.add(rowRenderData);
+                        }
+                    }
+                    TableRenderData tableRenderData = new TableRenderData();
+                    tableRenderData.setRows(rows);
+                    int countSize = tableRenderData.getRows().get(0).getCells().size();
+                    for (RowRenderData row : tableRenderData.getRows()) {
+                            /*for (CellRenderData cell : row.getCells()) {
+                                System.out.print(cell.getParagraphs().get(0).getContents());
+                            }
+                            System.out.println("");*/
+                        if (row.getCells().size() != countSize) {
+                            throw new ErrorException("姣忚鍗曞厓鏍间笉鐩哥瓑5");
+                        }
+                    }
+                    TableStyle tableStyle = new TableStyle();
+                    tableStyle.setWidth(XWPFTable.DEFAULT_PERCENTAGE_WIDTH);
+                    tableStyle.setAlign(TableRowAlign.CENTER);
+                    BorderStyle borderStyle = new BorderStyle();
+                    borderStyle.setColor("000000");
+                    borderStyle.setType(XWPFTable.XWPFBorderType.THICK);
+                    borderStyle.setSize(14);
+                    tableStyle.setLeftBorder(borderStyle);
+                    tableStyle.setTopBorder(borderStyle);
+                    tableStyle.setRightBorder(borderStyle);
+                    tableStyle.setBottomBorder(borderStyle);
+                    tableRenderData.setTableStyle(tableStyle);
+                    Map<String, Object> table = new HashMap<>();
+                    table.put("table3", tableRenderData);
+                    table.put("report", insReport);
+                    table.put("index3", index3);
+                    tables3.add(table);
+                    index3++;
+                }
+            }
+
+        });
+    }
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/DataConfigMapper.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/DataConfigMapper.java
new file mode 100644
index 0000000..c8b75e3
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/DataConfigMapper.java
@@ -0,0 +1,22 @@
+package com.ruoyi.requier.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.requier.dto.DeviceConfigDtoPage;
+import com.ruoyi.requier.pojo.DataConfig;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-07-13 12:23:00
+ */
+public interface DataConfigMapper extends BaseMapper<DataConfig> {
+
+    List<DeviceConfigDtoPage> selectDataConfigList(Integer deviceId);
+
+    List<Integer> deleteDataConfig();
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceFaultMapper.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceFaultMapper.java
new file mode 100644
index 0000000..117c5d8
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceFaultMapper.java
@@ -0,0 +1,9 @@
+package com.ruoyi.requier.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.requier.pojo.DeviceFault;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface DeviceFaultMapper extends BaseMapper<DeviceFault> {
+}
\ No newline at end of file
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceFaultOneMapper.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceFaultOneMapper.java
new file mode 100644
index 0000000..4da3db7
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceFaultOneMapper.java
@@ -0,0 +1,20 @@
+package com.ruoyi.requier.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.requier.dto.DeviceFaultOneDto;
+import com.ruoyi.requier.pojo.DeviceFaultOne;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-26 02:03:29
+ */
+public interface DeviceFaultOneMapper extends BaseMapper<DeviceFaultOne> {
+
+    IPage<DeviceFaultOneDto> deviceFaultOnePage(Integer deviceId, Page page, String processNumber);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceMaintenanceMapper.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceMaintenanceMapper.java
new file mode 100644
index 0000000..48dab57
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceMaintenanceMapper.java
@@ -0,0 +1,18 @@
+package com.ruoyi.requier.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.requier.dto.DeviceMaintenanceExport;
+import com.ruoyi.requier.pojo.DeviceMaintenance;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface DeviceMaintenanceMapper extends BaseMapper<DeviceMaintenance> {
+    List<DeviceMaintenance> getDeviceMaintenanceParam();
+
+//    IPage<DeviceMaintenance> getDeviceMaintenancePage(Page page, Integer deviceId);
+
+    List<DeviceMaintenanceExport> deviceMaintenanceExport(Integer deviceId);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceMapper.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceMapper.java
new file mode 100644
index 0000000..86646e9
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceMapper.java
@@ -0,0 +1,43 @@
+package com.ruoyi.requier.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.requier.dto.DeviceDto;
+import com.ruoyi.requier.pojo.Device;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 璁惧(Device)琛ㄦ暟鎹簱璁块棶灞�
+ */
+public interface DeviceMapper extends BaseMapper<Device> {
+
+    IPage<Device> selectDeviceParameter(Page page, QueryWrapper<Device> ew);
+    List<Device> selectEquipmentOverview(Page page, QueryWrapper<Device> ew);
+
+    //鑾峰彇琚巿鏉冧汉
+    List<Device> authorizedPerson();
+
+    //鏌ヨ
+    List<Device> search(@Param(value = "status") Integer status, @Param(value = "deviceName") String deviceName,
+                        @Param(value = "specificationModel") String specificationModel, @Param(value = "largeCategory") String largeCategory);
+
+    //鑾峰彇鍥剧墖鏁版嵁
+    void selectDeviceImage(@Param(value = "name") String name ,@Param(value = "id") Integer id);
+
+    //鏌ヨ璁惧璐熻矗浜�
+    List<Device> selectDevicePrincipal();
+
+    IPage<DeviceDto> selectDeviceParameterPage(Page page, @Param("ew") QueryWrapper<DeviceDto> queryWrappers, @Param("laboratoryNameIsNull") Boolean laboratoryNameIsNull);
+
+    List<Map<String, Object>> getInspectionItemSubclass(@Param("id") Integer id);
+
+    List<Map<String, Object>> treeDevice(@Param("deviceName") String deviceName);
+
+    DeviceDto selectDeviceByCode(Integer id);
+}
+
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceMetricMapper.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceMetricMapper.java
new file mode 100644
index 0000000..a3d97e7
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceMetricMapper.java
@@ -0,0 +1,9 @@
+package com.ruoyi.requier.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.requier.pojo.DeviceMetric;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface DeviceMetricMapper extends BaseMapper<DeviceMetric> {
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceMetricRecordMapper.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceMetricRecordMapper.java
new file mode 100644
index 0000000..33bc57f
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceMetricRecordMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.requier.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.requier.pojo.DeviceMetricRecord;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:01
+ */
+public interface DeviceMetricRecordMapper extends BaseMapper<DeviceMetricRecord> {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceMetricsCopyMapper.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceMetricsCopyMapper.java
new file mode 100644
index 0000000..df794ca
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/DeviceMetricsCopyMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.requier.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.requier.pojo.DeviceMetricsCopy;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 - 鏍″噯鏉$洰 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:11
+ */
+public interface DeviceMetricsCopyMapper extends BaseMapper<DeviceMetricsCopy> {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/DocumentDao.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/DocumentDao.java
new file mode 100644
index 0000000..7b320ea
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/DocumentDao.java
@@ -0,0 +1,9 @@
+package com.ruoyi.requier.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.requier.pojo.Document;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface DocumentDao extends BaseMapper<Document> {
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/IncidentAcceptanceCheckMapper.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/IncidentAcceptanceCheckMapper.java
new file mode 100644
index 0000000..c545b94
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/IncidentAcceptanceCheckMapper.java
@@ -0,0 +1,17 @@
+package com.ruoyi.requier.mapper;
+
+
+import com.ruoyi.framework.mybatis_config.MyBaseMapper;
+import com.ruoyi.requier.pojo.IncidentAcceptanceCheck;
+
+/**
+ * <p>
+ * 璁惧楠屾敹-楠屾敹鏍告煡 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 04:41:19
+ */
+public interface IncidentAcceptanceCheckMapper extends MyBaseMapper<IncidentAcceptanceCheck> {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/IncidentFileMapper.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/IncidentFileMapper.java
new file mode 100644
index 0000000..d607a53
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/IncidentFileMapper.java
@@ -0,0 +1,17 @@
+package com.ruoyi.requier.mapper;
+
+
+import com.ruoyi.framework.mybatis_config.MyBaseMapper;
+import com.ruoyi.requier.pojo.IncidentFile;
+
+/**
+ * <p>
+ * 璁惧楠屾敹-鏂囦欢绫荤‘璁� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 04:41:36
+ */
+public interface IncidentFileMapper extends MyBaseMapper<IncidentFile> {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/IncidentInstallMapper.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/IncidentInstallMapper.java
new file mode 100644
index 0000000..81b724b
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/IncidentInstallMapper.java
@@ -0,0 +1,17 @@
+package com.ruoyi.requier.mapper;
+
+
+import com.ruoyi.framework.mybatis_config.MyBaseMapper;
+import com.ruoyi.requier.pojo.IncidentInstall;
+
+/**
+ * <p>
+ * 璁惧楠屾敹-瀹夎楠屾敹妫�鏌� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 04:41:50
+ */
+public interface IncidentInstallMapper extends MyBaseMapper<IncidentInstall> {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/IncidentReportMapper.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/IncidentReportMapper.java
new file mode 100644
index 0000000..0c859e0
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/IncidentReportMapper.java
@@ -0,0 +1,28 @@
+package com.ruoyi.requier.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.requier.dto.IncidentReportAddDto;
+import com.ruoyi.requier.excel.IncidentReportExport;
+import com.ruoyi.requier.pojo.IncidentReport;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧楠屾敹娣诲姞楠屾敹瀛楁琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 03:54:49
+ */
+public interface IncidentReportMapper extends BaseMapper<IncidentReport> {
+
+    IPage<IncidentReportAddDto> getByDeviceId(Page page, @Param("deviceId") Integer deviceId, @Param("processNumber") String processNumber);
+
+    IncidentReportAddDto getShowIncidentReport(Integer id);
+
+    List<IncidentReportExport> incidentReportExport(Integer deviceId);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/IncidentSparePartsMapper.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/IncidentSparePartsMapper.java
new file mode 100644
index 0000000..0bb84fe
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/IncidentSparePartsMapper.java
@@ -0,0 +1,17 @@
+package com.ruoyi.requier.mapper;
+
+
+import com.ruoyi.framework.mybatis_config.MyBaseMapper;
+import com.ruoyi.requier.pojo.IncidentSpareParts;
+
+/**
+ * <p>
+ * 璁惧楠屾敹-澶囦欢纭 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 04:42:06
+ */
+public interface IncidentSparePartsMapper extends MyBaseMapper<IncidentSpareParts> {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/InformationNotificationMapper.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/InformationNotificationMapper.java
new file mode 100644
index 0000000..426406e
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/InformationNotificationMapper.java
@@ -0,0 +1,20 @@
+package com.ruoyi.requier.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.requier.dto.InformationNotificationDto;
+import com.ruoyi.requier.pojo.InformationNotification;
+
+/**
+ * <p>
+ * 娑堟伅閫氱煡 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-04-23 02:14:30
+ */
+public interface InformationNotificationMapper extends BaseMapper<InformationNotification> {
+
+    IPage<InformationNotificationDto> getPage(Page page, String messageType, Integer userId);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/InstructionMapper.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/InstructionMapper.java
new file mode 100644
index 0000000..8fe8276
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/InstructionMapper.java
@@ -0,0 +1,19 @@
+package com.ruoyi.requier.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.requier.pojo.Instruction;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+public interface InstructionMapper extends BaseMapper<Instruction> {
+
+    IPage<Instruction> pageByPageQueryOfHomeworkInstructions(Page page);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/OperationInstructionMapper.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/OperationInstructionMapper.java
new file mode 100644
index 0000000..a39c08f
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/OperationInstructionMapper.java
@@ -0,0 +1,20 @@
+package com.ruoyi.requier.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.requier.pojo.OperationInstruction;
+import com.ruoyi.requier.vo.OperationInstructionVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:43:32
+ */
+public interface OperationInstructionMapper extends BaseMapper<OperationInstruction> {
+
+    List<OperationInstructionVo> homeworkGuidebookEditor(Integer instructionId);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/PkMasterMapper.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/PkMasterMapper.java
new file mode 100644
index 0000000..0872620
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/PkMasterMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.requier.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.requier.pojo.PkMaster;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-07-29 01:16:26
+ */
+public interface PkMasterMapper extends BaseMapper<PkMaster> {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/PkSlaveMapper.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/PkSlaveMapper.java
new file mode 100644
index 0000000..8c4e29e
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/PkSlaveMapper.java
@@ -0,0 +1,20 @@
+package com.ruoyi.requier.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.requier.pojo.PkSlave;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-07-29 01:16:39
+ */
+public interface PkSlaveMapper extends BaseMapper<PkSlave> {
+
+    List<PkSlave> selectList1(@Param("isid") String isid);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/mapper/ReservationMapper.java b/cnas-require/src/main/java/com/ruoyi/requier/mapper/ReservationMapper.java
new file mode 100644
index 0000000..07bb465
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/mapper/ReservationMapper.java
@@ -0,0 +1,23 @@
+package com.ruoyi.requier.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.requier.dto.ReservationDto;
+import com.ruoyi.requier.pojo.Reservation;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璧勬簮棰勫畾鏂板缓棰勫畾琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author baomidou
+ * @since 2024-09-14
+ */
+public interface ReservationMapper extends BaseMapper<Reservation> {
+
+
+    List<ReservationDto> selectReservationParameterPage(@Param("deviceId") Integer deviceId, @Param("reservationTime") String reservationTime, @Param("specificTime") String specificTime);
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/DataConfig.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/DataConfig.java
new file mode 100644
index 0000000..29f45e2
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/DataConfig.java
@@ -0,0 +1,69 @@
+package com.ruoyi.requier.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-07-13 12:23:00
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@TableName("device_data_config")
+@ApiModel(value = "DataConfig瀵硅薄", description = "")
+public class DataConfig implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("鍏紡")
+    private String formula;
+
+    @ApiModelProperty("鍙傜収X")
+    private String referx;
+
+    @ApiModelProperty("鍙傜収Y")
+    private String refery;
+
+    @ApiModelProperty("x")
+    private String x;
+
+    @ApiModelProperty("y")
+    private String y;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("妫�楠岄」鐩�")
+    private String inspectionItem;
+
+    @ApiModelProperty("妫�楠岄」瀛愰」")
+    private String inspectionItemSubclass;
+
+    @TableField(exist = false)
+    @ApiModelProperty("妫�楠岄」瀛愰」")
+    private String insProductItem;
+
+    @ApiModelProperty("妫�楠岄」id")
+    private Integer structureItemParameterId;
+
+    @ApiModelProperty("搴忓彿")
+    private String serialNumber;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/Device.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/Device.java
new file mode 100644
index 0000000..eec50b2
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/Device.java
@@ -0,0 +1,140 @@
+package com.ruoyi.requier.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 璁惧(Device)琛ㄥ璞�
+ */
+@TableName(value = "device")
+@Data
+public class Device implements Serializable {
+    @ApiModelProperty(value = "涓婚敭")
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "璁惧鍚嶇О")
+    private String deviceName;
+
+    @ApiModelProperty(value = "en璁惧鍚嶇О")
+    private String enDeviceName;
+
+    @ApiModelProperty(value = "瑙勬牸鍨嬪彿")
+    private String specificationModel;
+
+    @ApiModelProperty(value = "鐢熶骇鍘傚")
+    private String manufacturer;
+
+    @ApiModelProperty(value = "鍑哄巶缂栧彿")
+    private String factoryNo;
+
+    @ApiModelProperty(value = "绠$悊缂栧彿")
+    private String managementNumber;
+
+    @ApiModelProperty(value = "鎶�鏈寚鏍�")
+    private String technicalIndicators;
+
+    @ApiModelProperty(value = "璐疆鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime acquisitionDate;
+
+    @ApiModelProperty(value = "鍚敤鏃ユ湡")
+    private LocalDateTime activationDate;
+
+    @ApiModelProperty(value = "绠$悊浜篒d")
+    private Integer equipmentManager;
+
+    @ApiModelProperty(value = "瀛樻斁鐐�")
+    private String storagePoint;
+
+    @ApiModelProperty(value = "鎵�灞為儴闂↖d")
+    private Integer subordinateDepartmentsId;
+
+    @ApiModelProperty(value = "妫�楠岄」鐩甀d")
+    private String insProductIds;
+
+    @ApiModelProperty(value = "鏍″噯鏈嶅姟鏈烘瀯")
+    private String calibrationServices;
+
+    @ApiModelProperty(value = "鏈�杩戞牎鍑嗘棩鏈�")
+    private LocalDateTime lastCalibrationDate;
+
+    @ApiModelProperty(value = "涓嬫鏍″噯鏃ユ湡")
+    private LocalDateTime nextCalibrationDate;
+
+    @ApiModelProperty(value = "璁惧绫诲瀷")
+    private String largeCategory;
+
+    @ApiModelProperty(value = "鍗曚环")
+    private BigDecimal unitPrice;
+
+    @ApiModelProperty(value = "璁惧鐘舵��")
+    private Integer deviceStatus;
+
+    @ApiModelProperty(value = "鏍″噯鍛ㄦ湡(鏈�)")
+    private String calibrationDate;
+
+    @ApiModelProperty(value = "鍥剧墖涓婁紶")
+    private String imageUpload;
+
+    @ApiModelProperty(value = "鍥剧墖澶囨敞")
+    private String imageName;
+
+    @ApiModelProperty(value = "鍒涘缓浜篿d")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鏁伴噰-鏂囦欢鍚庣紑")
+    private String fileType;
+
+    @ApiModelProperty("鏁伴噰-閲囬泦鍦板潃")
+    private String collectUrl;
+
+    @ApiModelProperty("鏁伴噰-瀛樺偍鍦板潃")
+    private String storageUrl;
+
+    @ApiModelProperty("鏁伴噰-璁惧IP")
+    private String ip;
+
+    @ApiModelProperty("鏁伴噰-鏄惁涓烘暟閲囪澶�")
+    @TableField(exist = false)
+    private Boolean isItADataAcquisitionDevice;
+
+    @ApiModelProperty("鏁伴噰-濮旀墭瀛楁")
+    private String entrustCode;
+
+    @ApiModelProperty("鏁伴噰-鏍峰搧瀛楁")
+    private String sampleCode;
+
+    @ApiModelProperty("鏁伴噰-db锛宮db鏂囦欢鍚嶇О")
+    private String dbFileName;
+
+    @ApiModelProperty("鏁伴噰-db鏂囦欢 鍏夌氦甯︾紪鍙�")
+    private String fiberOpticRibbon;
+
+    @ApiModelProperty("琚巿鏉冧汉")
+    private String authorizedPerson;
+
+    @ApiModelProperty("璧勪骇缂栫爜")
+    private String assetCode;
+
+    @ApiModelProperty("浜у湴")
+    private String origin;
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceFault.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceFault.java
new file mode 100644
index 0000000..2b79202
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceFault.java
@@ -0,0 +1,39 @@
+package com.ruoyi.requier.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.time.LocalDate;
+
+@Data
+@TableName("device_faults")
+public class DeviceFault {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+    //璁惧di
+    private Integer deviceId;
+    //鏁呴殰娆℃暟
+    private Integer faultCount;
+    //鏈�杩戞晠闅滄棩鏈�
+    private LocalDate recentFaultDate;
+    //鏈�杩戞牎鍑嗘棩鏈�
+    private LocalDate recentCalibrationDate;
+   // 鏈�杩戞牎鍑嗙粨璁�
+    private String calibrationConclusion;
+  // 鏈�杩戞鏌ユ棩鏈�
+    private LocalDate recentCheckDate;
+  // 涓嬩竴娆℃鏌ユ棩鏈�
+    private LocalDate nextCheckDate;
+//妫�鏌ョ粨璁�
+    private String checkConclusion;
+//缁存姢绫诲瀷
+    private String maintenanceType;
+//缁存姢浜哄憳
+    private String maintenancePerson;
+//澶囨敞
+    private String comments;
+
+}
\ No newline at end of file
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceFaultOne.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceFaultOne.java
new file mode 100644
index 0000000..8da38f5
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceFaultOne.java
@@ -0,0 +1,125 @@
+package com.ruoyi.requier.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧鏁呴殰琛�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-26 02:03:29
+ */
+@Getter
+@Setter
+@TableName("device_fault_one")
+@ApiModel(value = "DeviceFaultOne瀵硅薄", description = "璁惧鏁呴殰琛�")
+public class DeviceFaultOne implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("1娴佺▼缂栧彿")
+    private String processNumber;
+
+    @ApiModelProperty("1鍑嗙‘搴﹂噺鍊�")
+    private String measureOfAccuracy;
+
+    @ApiModelProperty("1鏁呴殰鎯呭喌")
+    private String faultSituation;
+
+    @ApiModelProperty("1鏂囦欢鍘熷悕")
+    private String fileName;
+
+    @ApiModelProperty("1绯荤粺鏂囦欢鍚�")
+    private String systemFileName;
+
+    @ApiModelProperty("1涓嬬幆鑺傝礋璐d汉")
+    private String submitNextPesponsible;
+
+    @ApiModelProperty("1鎿嶄綔浜�")
+    private String submitOperatingPersonnel;
+
+    @ApiModelProperty("1鏃ユ湡")
+    private LocalDateTime submitDate;
+
+    @ApiModelProperty("2缁翠慨鏂瑰紡鍙婅垂鐢�")
+    private String methodCost;
+
+    @ApiModelProperty("2瀹℃牳鎰忚")
+    private String adminAuditOption;
+
+    @ApiModelProperty("2璁惧绠$悊鍛�-涓嬬幆鑺傝礋璐d汉")
+    private String adminNextPesponsible;
+
+    @ApiModelProperty("2绠$悊鍛�-鎿嶄綔浜�")
+    private String adminOperatingPersonnel;
+
+    @ApiModelProperty("2绠$悊鍛�-鏃ユ湡")
+    private LocalDateTime adminDate;
+
+    @ApiModelProperty("3 鎶�鏈礋璐d汉 瀹℃牳鎰忚")
+    private String technicalAuditOption;
+
+    @ApiModelProperty("3鎶�鏈礋璐d汉 涓嬬幆鑺傝礋璐d汉")
+    private String technicalNextPesponsible;
+
+    @ApiModelProperty("3 鎶�鏈礋璐d汉 鎿嶄綔浜�")
+    private String technicalOperatingPersonnel;
+
+    @ApiModelProperty("3 鎶�鏈礋璐d汉 鏃ユ湡")
+    private LocalDateTime technicalDate;
+
+    @ApiModelProperty("4缁翠慨鎯呭喌")
+    private String maintainSituation;
+
+    @ApiModelProperty("4 缁翠慨 涓嬬幆鑺傝礋璐d汉")
+    private String maintainNextPesponsible;
+
+    @ApiModelProperty("4 缁翠慨 鎿嶄綔浜�")
+    private String maintainOperatingPersonnel;
+
+    @ApiModelProperty("4 缁翠慨 鏃ユ湡")
+    private LocalDateTime maintainDate;
+
+    @ApiModelProperty("5楠屾敹纭鏍″噯鎯呭喌")
+    private String checkCalSituation;
+
+    @ApiModelProperty("5 缁翠慨鍚� 鎿嶄綔浜�")
+    private String afterMaintenanceOperatingPersonnel;
+
+    @ApiModelProperty("5 缁翠慨鍚� 鏃ユ湡")
+    private LocalDateTime afterMaintenanceDate;
+
+    @ApiModelProperty("褰撳墠鐘舵��")
+    private String currentState;
+
+    @ApiModelProperty("鎻愪氦浜�")
+    private String submitPerson;
+
+    @ApiModelProperty("褰撳墠璐d换浜�")
+    private String currentResponsible;
+
+    @ApiModelProperty("鍒涘缓鏃ユ湡")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鏁呴殰鏃ユ湡")
+    private LocalDate faultDate;
+
+    @ApiModelProperty("瑕佹眰淇鏃ユ湡")
+    private LocalDate requestRepairDate;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceMaintenance.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceMaintenance.java
new file mode 100644
index 0000000..49db473
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceMaintenance.java
@@ -0,0 +1,42 @@
+package com.ruoyi.requier.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDate;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+//@Accessors(chain = true)
+@TableName("device_maintenance")
+public class DeviceMaintenance {
+//    @TableId(value = "id", type = IdType.AUTO)
+    private static final long serialVersionUID = 1L;
+    //璁惧id
+    @TableId(type=IdType.AUTO)
+    private Integer id;
+    private Integer deviceId;
+
+    private String deviceName;
+    //缂栧彿
+    private String deviceNumber;
+    //缁熶竴缂栧彿
+    private String managementNumber;
+    //缁存姢鍐呭
+    private String content;
+    //缁存姢鏃ユ湡
+    @TableField(fill = FieldFill.INSERT)
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate date;
+    //涓嬫缁存姢鏃ユ湡
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate nextDate;
+    //缁存姢绫诲瀷
+    private Integer maintenanceType;
+    //缁存姢浜哄憳
+    private String name;
+    //澶囨敞
+    private String comments;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceMetric.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceMetric.java
new file mode 100644
index 0000000..d3cfcde
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceMetric.java
@@ -0,0 +1,29 @@
+package com.ruoyi.requier.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@Data
+@TableName("device_metrics")
+public class DeviceMetric implements Serializable {
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id; //id
+    private Integer deviceId;            // 璁惧ID
+    private String measurementParameter; // 璁¢噺鍙傛暟
+    private String rangeOfMeasurement;   // 閲忕▼鑼冨洿
+    private String maxPermissibleError;  // 鏈�澶у厑璁歌宸�
+    private String judgmentCriteria;     // 鍒ゅ畾鏍囧噯
+    private String createdBy;           // 鍒涘缓浜�
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime creationTime;      // 鍒涘缓鏃堕棿
+
+    @ApiModelProperty("calibrate锛氭牎鍑嗭紱examine锛氭牳鏌�")
+    private String type; // 绫诲瀷
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceMetricRecord.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceMetricRecord.java
new file mode 100644
index 0000000..c655959
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceMetricRecord.java
@@ -0,0 +1,115 @@
+package com.ruoyi.requier.pojo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:01
+ */
+@Getter
+@Setter
+@TableName("device_metric_record")
+@ApiModel(value = "DeviceMetricRecord瀵硅薄", description = "璁惧鏍″噯 - 鏍″噯璁板綍")
+@ExcelIgnoreUnannotated
+public class DeviceMetricRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("璁板綍缂栧彿")
+    @ExcelProperty(value = "璁板綍缂栧彿",index = 0)
+    private String processNumber;
+
+    @ApiModelProperty("璁¢噺鍗曚綅")
+    @ExcelProperty(value = "鏈烘瀯",index = 1)
+    private String unitOfMeasure;
+
+    @ApiModelProperty("鏍″噯鏃ユ湡")
+    @ExcelProperty(value = "鏍″噯/鏍告煡鏃ユ湡",index = 5)
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ColumnWidth(20)
+    private Date calibrationDate;
+
+    @ApiModelProperty("涓嬫鏍″噯鏃ユ湡")
+    @ExcelProperty(value = "涓嬫鏍″噯/鏍告煡鏃ユ湡",index = 6)
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ColumnWidth(20)
+    private Date nextCalibrationDate;
+
+    @ApiModelProperty("璁$畻鍣ㄥ叿")
+    private String calculatingApparatus;
+
+    @ApiModelProperty("璁$畻鏍囧噯閲忕▼")
+    private String standardRange;
+
+    @ApiModelProperty("璁¢噺鏍囧噯涓嶇‘瀹氬害")
+    private String calibrationStandardUncertainty;
+
+    @ApiModelProperty("渚濇嵁鏂囦欢")
+    private String byDocument;
+
+    @ApiModelProperty("璇佷功缂栧彿")
+    @ExcelProperty(value = "鏍″噯/鏍告煡璇佷功缂栧彿",index = 3)
+    private String certificateSerialNumber;
+
+    @ApiModelProperty("鐘舵��")
+    @ExcelProperty(value = "鏍″噯/鏍告煡缁撹",index = 2)
+    private String status;
+
+    @ApiModelProperty("鍘熸枃浠跺悕绉�")
+    private String fileName;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鏂囦欢鍚嶇О")
+    private String systemFileName;
+
+    @ApiModelProperty("澶囨敞")
+    @ExcelProperty(value = "璇存槑",index = 4)
+    private String remark;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿 / 鐧昏鏃ユ湡")
+    @TableField(fill = FieldFill.INSERT)
+    @ExcelProperty(value = "鐧昏鏃ユ湡",index = 9)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ColumnWidth(20)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鐧昏浜�")
+    @ExcelProperty(value = "鐧昏浜�",index = 8)
+    private String createUser;
+
+    @ApiModelProperty("calibrate锛氭牎鍑嗭紱examine锛氭牳鏌�")
+    private String type;
+
+    @ApiModelProperty("纭鏃堕棿")
+    @ExcelProperty(value = "纭鏃ユ湡",index = 7)
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @ColumnWidth(20)
+    private Date confirmDate;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceMetricsCopy.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceMetricsCopy.java
new file mode 100644
index 0000000..a1e813c
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/DeviceMetricsCopy.java
@@ -0,0 +1,73 @@
+package com.ruoyi.requier.pojo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 - 鏍″噯鏉$洰
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:11
+ */
+@Getter
+@Setter
+@TableName("device_metrics_copy")
+@ApiModel(value = "DeviceMetricsCopy瀵硅薄", description = "璁惧鏍″噯 - 鏍″噯璁板綍 - 鏍″噯鏉$洰")
+@ExcelIgnoreUnannotated
+public class DeviceMetricsCopy implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("璁惧鏍″噯 - 鏍″噯璁板綍id")
+    private Integer deviceMetricsId;
+
+    @ApiModelProperty("璁¢噺鍙傛暟")
+
+    private String measurementParameter;
+
+    @ApiModelProperty("閲忕▼鑼冨洿")
+    private String rangeOfMeasurement;
+
+    @ApiModelProperty("鏈�澶у厑璁歌宸�")
+    private String maxPermissibleError;
+
+    @ApiModelProperty("鍒ゅ畾鏍囧噯")
+    private String judgmentCriteria;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    private String createdBy;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime creationTime;
+
+    @ApiModelProperty("鏄惁鏍″噯")
+    private String isCalibration;
+
+    @ApiModelProperty("鍒ゅ畾缁撴灉")
+    private String result;
+
+    @ApiModelProperty("鍗曢」缁撴灉璇存槑")
+    private String singleResultStatement;
+
+    @ApiModelProperty("calibrate锛氭牎鍑嗭紱examine锛氭牳鏌�")
+    private String type;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/Document.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/Document.java
new file mode 100644
index 0000000..afb283d
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/Document.java
@@ -0,0 +1,89 @@
+package com.ruoyi.requier.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+
+@Data
+@TableName(value = "device_documents")
+public class Document implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 鏂囨。绫诲瀷锛堟灇涓撅級
+     */
+    private String documentType;
+
+    /**
+     * 鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 鐗堟湰鍙�
+     */
+    private String version;
+
+    /**
+     * 鏁伴噺
+     */
+    private Integer quantity;
+
+    /**
+     * 椤垫暟
+     */
+    private Integer pageCount;
+
+    /**
+     * 鎻愪緵鍟�
+     */
+    private String provider;
+
+    /**
+     * 鎻愪緵鏃ユ湡
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime provideDate;
+
+    /**
+     * 澶囨敞
+     */
+    private String comments;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime createdAt;
+
+    /**
+     * 鏇存柊鏃堕棿
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updatedAt;
+
+    private int deviceId;
+
+    @ApiModelProperty("璧勪骇缂栧彿")
+    private String number;
+
+    @ApiModelProperty("鍘熷鏂囦欢鍚嶇О")
+    private String systemFileName;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鏂囦欢鍚嶇О")
+    private String fileName;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/IncidentAcceptanceCheck.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/IncidentAcceptanceCheck.java
new file mode 100644
index 0000000..f71687b
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/IncidentAcceptanceCheck.java
@@ -0,0 +1,50 @@
+package com.ruoyi.requier.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 璁惧楠屾敹-楠屾敹鏍告煡
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 04:41:19
+ */
+@Getter
+@Setter
+@TableName("device_incident_acceptance_check")
+@ApiModel(value = "IncidentAcceptanceCheck瀵硅薄", description = "璁惧楠屾敹-楠屾敹鏍告煡")
+public class IncidentAcceptanceCheck implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(type = IdType.AUTO)
+    private Integer acceptanceCheckId;
+
+    @ApiModelProperty("浠櫒妯″潡")
+    private String instrumentModule;
+
+    @ApiModelProperty("鏍告煡鍙傛暟")
+    private String verificationParameter;
+
+    @ApiModelProperty("鍙帴鏀堕檺")
+    private String acceptableLimit;
+
+    @ApiModelProperty("鏍告煡缁撴灉")
+    private String verificationResult;
+
+    @ApiModelProperty("鏍告煡缁撹")
+    private String verificationConclusion;
+
+    @ApiModelProperty("璁惧楠屾敹ID")
+    private Integer incidentId;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/IncidentFile.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/IncidentFile.java
new file mode 100644
index 0000000..ca8788a
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/IncidentFile.java
@@ -0,0 +1,40 @@
+package com.ruoyi.requier.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 璁惧楠屾敹-鏂囦欢绫荤‘璁�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 04:41:36
+ */
+@Getter
+@Setter
+@TableName("device_incident_file")
+@ApiModel(value = "IncidentFile瀵硅薄", description = "璁惧楠屾敹-鏂囦欢绫荤‘璁�")
+public class IncidentFile implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(type = IdType.AUTO)
+    private Integer fileId;
+
+    @ApiModelProperty("搴旀湁鍐屾暟")
+    private Integer expectedCopies;
+
+    @ApiModelProperty("瀹為檯鏀跺埌鍐屾暟")
+    private Integer actualCopies;
+
+    @ApiModelProperty("璁惧楠屾敹id")
+    private Integer incidentId;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/IncidentInstall.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/IncidentInstall.java
new file mode 100644
index 0000000..4e9caab
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/IncidentInstall.java
@@ -0,0 +1,44 @@
+package com.ruoyi.requier.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 璁惧楠屾敹-瀹夎楠屾敹妫�鏌�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 04:41:50
+ */
+@Getter
+@Setter
+@TableName("device_incident_install")
+@ApiModel(value = "IncidentInstall瀵硅薄", description = "璁惧楠屾敹-瀹夎楠屾敹妫�鏌�")
+public class IncidentInstall implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(type = IdType.AUTO)
+    private Integer installId;
+
+    @ApiModelProperty("椤圭洰")
+    private String installationProject;
+
+    @ApiModelProperty("瀹夎鎯呭喌")
+    private String installationSituation;
+
+    @ApiModelProperty("瀹夎瀹屾垚")
+    private String installationCompleted;
+
+    @ApiModelProperty("璁惧楠屾敹")
+    private Integer incidentId;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/IncidentReport.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/IncidentReport.java
new file mode 100644
index 0000000..adb6a96
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/IncidentReport.java
@@ -0,0 +1,142 @@
+package com.ruoyi.requier.pojo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧楠屾敹娣诲姞楠屾敹瀛楁琛�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 03:54:49
+ */
+@Getter
+@Setter
+@TableName("device_incident_report")
+@ApiModel(value = "IncidentReport瀵硅薄", description = "璁惧楠屾敹娣诲姞楠屾敹瀛楁琛�")
+public class IncidentReport implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ExcelProperty(value = "娴佺▼缂栧彿")
+    @ApiModelProperty("娴佺▼缂栧彿")
+    private String processNumber;
+
+    @ApiModelProperty("璁惧id")
+    private Integer deviceId;
+
+    @ApiModelProperty("搴忓垪鍙�")
+    private String serialNumber;
+
+    @ApiModelProperty("璁惧绫诲埆")
+    private String deviceClass;
+
+    @ApiModelProperty("寮�绠卞墠妫�鏌ュ鍖呰鏈夋棤鐮存崯")
+    private String checkOuterPackaging;
+
+    @ApiModelProperty("鍘熸枃浠跺悕绉�")
+    private String fileName;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鏂囦欢鍚嶇О")
+    private String systemFileName;
+
+    @ApiModelProperty("璁惧寮�绠遍獙鏀剁粨璁�")
+    private String unpackingAcceptanceConclusion;
+
+    @ApiModelProperty("1鎻愪氦 涓嬬幆鑺傝礋璐d汉鍚嶇О")
+    private String submitNextPesponsible;
+
+    @ApiModelProperty("1鎻愪氦 鎻愪氦澶囨敞")
+    private String submitRemarks;
+
+    @ApiModelProperty("1鎻愪氦 鎻愪氦鎿嶄綔浜�")
+    private String submitOperatingPersonnel;
+
+    @ApiModelProperty("1鎻愪氦 鎻愪氦鏃ユ湡")
+    private LocalDateTime submitDate;
+
+    @ApiModelProperty("2寮�绠遍獙鏀跺鏍� 澶嶆牳鎰忚")
+    private String unpackingReviewOpinion;
+
+    @ApiModelProperty("2寮�绠遍獙鏀跺鏍� 涓嬬幆鑺傝礋璐d汉")
+    private String unpackingNextPesponsible;
+
+    @ApiModelProperty("2寮�绠遍獙鏀跺鏍� 鎿嶄綔浜�")
+    private String unpackingOperatingPersonnel;
+
+    @ApiModelProperty("2寮�绠遍獙鏀跺鏍� 鏃ユ湡")
+    private LocalDateTime unpackingDate;
+
+    @ApiModelProperty("3瀹夎浣嶇疆")
+    private String installLocation;
+
+    @ApiModelProperty("3瀹夎澶囨敞")
+    private String installRemarks;
+
+    @ApiModelProperty("3瀹夎涓嬬幆鑺傝礋璐d汉")
+    private String installNextPesponsible;
+
+    @ApiModelProperty("3瀹夎鎿嶄綔浜�")
+    private String installOperatingPersonnel;
+
+    @ApiModelProperty("3瀹夎鏃ユ湡")
+    private LocalDateTime installDate;
+
+    @ApiModelProperty("4瀹夎楠屾敹澶嶆牳鎰忚")
+    private String installationAcceptanceCompoundOpinion;
+
+    @ApiModelProperty("4瀹夎楠屾敹涓嬬幆鑺傝礋璐d汉")
+    private String installationAcceptanceNextPesponsible;
+
+    @ApiModelProperty("4瀹夎楠屾敹鎿嶄綔浜�")
+    private String installationAcceptanceOperatingPersonnel;
+
+    @ApiModelProperty("4瀹夎楠屾敹鏃ユ湡")
+    private LocalDateTime installationAcceptanceDate;
+
+    @ApiModelProperty("5楠屾敹鏍告煡 璁惧寮�绠遍獙鏀剁粨璁�")
+    private String acceptanceCheckUnpackingConclusion;
+
+    @ApiModelProperty("5楠屾敹鏍告煡 涓嬬幆鑺傝礋璐d汉")
+    private String acceptanceCheckNextPesponsible;
+
+    @ApiModelProperty("5楠屾敹鏍告煡 鎿嶄綔浜�")
+    private String acceptanceCheckOperatingPersonnel;
+
+    @ApiModelProperty("5楠屾敹鏍告煡 鏃ユ湡")
+    private LocalDateTime acceptanceCheckDate;
+
+    @ApiModelProperty("6楠屾敹鏍告煡瀹℃牳 瀹℃牳鎰忚")
+    private String acceptanceAuditAuditOpinion;
+
+    @ApiModelProperty("6楠屾敹鏍告煡瀹℃牳 鎿嶄綔浜�")
+    private String acceptanceAuditOperatingPersonnel;
+
+    @ApiModelProperty("6楠屾敹鏍告煡瀹℃牳 鏃ユ湡")
+    private LocalDateTime acceptanceAuditDate;
+
+    @ApiModelProperty(value = "鍒涘缓浜篿d")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty("褰撳墠鐘舵��")
+    private String currentState;
+
+    @ApiModelProperty(value = "鍒涘缓鏃ユ湡 / 鎻愪氦鏃ユ湡")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("褰撳墠璐熻矗浜�")
+    private String currentResponsible;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/IncidentSpareParts.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/IncidentSpareParts.java
new file mode 100644
index 0000000..7d998e2
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/IncidentSpareParts.java
@@ -0,0 +1,44 @@
+package com.ruoyi.requier.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 璁惧楠屾敹-澶囦欢纭
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 04:42:06
+ */
+@Getter
+@Setter
+@TableName("device_incident_spare_parts")
+@ApiModel(value = "IncidentSpareParts瀵硅薄", description = "璁惧楠屾敹-澶囦欢纭")
+public class IncidentSpareParts implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(type = IdType.AUTO)
+    private Integer sparePartsId;
+
+    @ApiModelProperty("鍚嶇О")
+    private String name;
+
+    @ApiModelProperty("鏁伴噺")
+    private Integer number;
+
+    @ApiModelProperty("澶囨敞")
+    private String note;
+
+    @ApiModelProperty("璁惧楠屾敹ID")
+    private Integer incidentId;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/InformationNotification.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/InformationNotification.java
new file mode 100644
index 0000000..c647e53
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/InformationNotification.java
@@ -0,0 +1,69 @@
+package com.ruoyi.requier.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 娑堟伅閫氱煡
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-04-23 02:14:30
+ */
+@Getter
+@Setter
+@TableName("information_notification")
+@ApiModel(value = "InformationNotification瀵硅薄", description = "娑堟伅閫氱煡")
+public class InformationNotification implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("涓婚敭ID")
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    private String createUser;
+
+    @ApiModelProperty("鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿/鍙戦�佹椂闂�")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("寰呭姙銆佹帴鏀躲�佸鏍搞�佹壒鍑嗐�侀璀︽彁閱掋�侀�氱煡鍏憡")
+    private String messageType;
+
+    @ApiModelProperty("涓婚")
+    private String theme;
+
+    @ApiModelProperty("鍐呭")
+    private String content;
+
+    @ApiModelProperty("鍙戦�佷汉Id")
+    private Integer senderId;
+
+    @ApiModelProperty("鏀朵欢浜�")
+    private Integer consigneeId;
+
+    @ApiModelProperty("鏌ョ湅鐘舵�侊細宸茶锛屾湭璇�")
+    private Boolean viewStatus;
+
+    @ApiModelProperty("娑堟伅鐘舵�侊紙鎷掔粷銆佹帴鏀讹級锛堟牴鎹秷鎭被鍨嬪睍绀猴級")
+    private Boolean messageStatus;
+
+    @ApiModelProperty("璺宠浆璺緞")
+    private String jumpPath;
+
+    @ApiModelProperty("璺宠浆Id")
+    private String jumpId;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/Instruction.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/Instruction.java
new file mode 100644
index 0000000..ddb199f
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/Instruction.java
@@ -0,0 +1,64 @@
+package com.ruoyi.requier.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+@Getter
+@Setter
+@TableName("device_instruction")
+@ApiModel(value = "Instruction瀵硅薄", description = "浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃")
+public class Instruction implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("鐢宠缂栧彿")
+    private String applicationNumber;
+
+    @ApiModelProperty("鐢宠閮ㄩ棬")
+    private String applicationDepartment;
+
+    @ApiModelProperty("璐d换浜�")
+    private String personLiable;
+
+    @ApiModelProperty("鍙楁帶鐢宠璇存槑")
+    private String controlledApplicationDescription;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鍚嶇О")
+    private String fileName;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鍚嶇О")
+    private String fileSystemName;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @ApiModelProperty("鏇存柊浜�")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/OperationInstruction.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/OperationInstruction.java
new file mode 100644
index 0000000..2993ccf
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/OperationInstruction.java
@@ -0,0 +1,92 @@
+package com.ruoyi.requier.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:43:32
+ */
+@Getter
+@Setter
+@TableName("device_operation_instruction")
+@ApiModel(value = "OperationInstruction瀵硅薄", description = "璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛�")
+public class OperationInstruction implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("璁惧涓婚敭id")
+    private String deviceId;
+
+    @ApiModelProperty("鏂囦欢绫诲瀷")
+    private String documentType;
+
+    @ApiModelProperty("鏂囨。缂栧彿")
+    private String documentNumber;
+
+    @ApiModelProperty("鏂囦欢鐗堟湰")
+    private String documentVersion;
+
+    @ApiModelProperty("浣滆��")
+    private String author;
+
+    @ApiModelProperty("鎻愪氦鏃ユ湡")
+    private LocalDate submitDate;
+
+    @ApiModelProperty("鏂囨。璇存槑")
+    private String documentNote;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鍚嶇О")
+    private String fileName;
+
+    @ApiModelProperty("绯荤粺鐢熸垚鍚嶇О")
+    private String fileSystemName;
+
+    @ApiModelProperty("浣滀笟鎸囧涔d")
+    private Integer instructionId;
+
+    @ApiModelProperty("涓婁紶浜篿d")
+    private Integer uploader;
+
+    @ApiModelProperty("瀹℃壒浜篿d")
+    private Integer approverId;
+
+    @ApiModelProperty("瀹℃壒鐘舵��")
+    private Boolean status;
+
+    @ApiModelProperty("鐢熸晥鏃堕棿")
+    private LocalDateTime entryIntoForceTime;
+
+    @ApiModelProperty("涓婁紶鏃堕棿")
+    private LocalDateTime uploadTime;
+
+    @ApiModelProperty("鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鏇存柊浜篿d")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @ApiModelProperty("鍒涘缓浜篿d")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/PkMaster.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/PkMaster.java
new file mode 100644
index 0000000..9debb9b
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/PkMaster.java
@@ -0,0 +1,61 @@
+package com.ruoyi.requier.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-07-29 01:16:26
+ */
+@Getter
+@Setter
+@TableName("device_pk_master")
+@ApiModel(value = "PkMaster瀵硅薄", description = "娓╁害寰幆鏁伴噰瀛愯〃")
+public class PkMaster implements Serializable {
+
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("濮旀墭鍗曠紪鍙�")
+    private String entrustCode;
+
+    @ApiModelProperty("鏍峰搧缂栧彿")
+    private String sampleCode;
+
+    @ApiModelProperty("鍨嬪彿")
+    private String model;
+
+    @ApiModelProperty("寰幆娆℃暟")
+    private String cycles;
+
+    @ApiModelProperty("娓╁害寰幆")
+    private String temperature;
+
+    @ApiModelProperty("鍏夌氦鏍规暟")
+    private Integer numberOpticalFibers;
+
+    @ApiModelProperty("device_pk_slave鍏宠仈瀛楁")
+    private String isid;
+
+    @ApiModelProperty("妫�楠屾椂闂�")
+    private LocalDateTime detectionDate;
+
+    @ApiModelProperty("妫�楠屼汉")
+    private String detectionPeople;
+
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/PkSlave.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/PkSlave.java
new file mode 100644
index 0000000..4467d5f
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/PkSlave.java
@@ -0,0 +1,75 @@
+package com.ruoyi.requier.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-07-29 01:16:39
+ */
+@Getter
+@Setter
+@TableName("device_pk_slave")
+@ApiModel(value = "PkSlave瀵硅薄", description = "娓╁害寰幆鏁伴噰瀛愯〃")
+public class PkSlave implements Serializable {
+
+    @ApiModelProperty("涓婚敭id")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty("琛板噺绯荤粺1310(dB/km)-A绔�")
+    private Double weaken1310A;
+
+    @ApiModelProperty("琛板噺绯荤粺1310(dB/km)-B绔�")
+    private Double weaken1310B;
+
+    @ApiModelProperty("琛板噺绯荤粺1550(dB/km)-A绔�")
+    private Double weaken1550A;
+
+    @ApiModelProperty("琛板噺绯荤粺1550(dB/km)-B绔�")
+    private Double weaken1550B;
+
+    @ApiModelProperty("琛板噺绯荤粺1625(dB/km)-A绔�")
+    private Double weaken1625A;
+
+    @ApiModelProperty("琛板噺绯荤粺1625(dB/km)-B绔�")
+    private Double weaken1625B;
+
+    @ApiModelProperty("琛板噺绯荤粺1383(dB/km)-A绔�")
+    private Double weaken1383A;
+
+    @ApiModelProperty("琛板噺绯荤粺1383(dB/km)-B绔�")
+    private Double weaken1383B;
+
+    @ApiModelProperty("琛板噺绯荤粺1490(dB/km)-A绔�")
+    private Double weaken1490A;
+
+    @ApiModelProperty("琛板噺绯荤粺1490(dB/km)-B绔�")
+    private Double weaken1490B;
+
+    @ApiModelProperty("绠¤壊鏍噄d")
+    private String insBushingId;
+
+    @ApiModelProperty("鍏夌氦甯d")
+    private String insFibersId;
+
+    @ApiModelProperty("鍏夌氦缂栧彿id")
+    private String insFiberId;
+
+    @ApiModelProperty("device_pk_master鍏宠仈瀛楁")
+    private String shiftId;
+
+    @ApiModelProperty("鍒涘缓鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/pojo/Reservation.java b/cnas-require/src/main/java/com/ruoyi/requier/pojo/Reservation.java
new file mode 100644
index 0000000..8eb9865
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/pojo/Reservation.java
@@ -0,0 +1,84 @@
+package com.ruoyi.requier.pojo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 璧勬簮棰勫畾鏂板缓棰勫畾琛�
+ * </p>
+ *
+ * @author baomidou
+ * @since 2024-09-14
+ */
+@Getter
+@Setter
+@TableName("device_reservation")
+public class Reservation implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     *  璁惧id
+     */
+    private Integer deviceId;
+
+    /**
+     * 棰勫畾璁惧
+     */
+    private String deviceName;
+
+    /**
+     *  瀹㈡埛鍚嶇О
+     */
+    private String customerName;
+
+    /**
+     *  棰勫畾鏃堕棿
+     */
+
+    private String reservationTime;
+
+    /**
+     *  鍏蜂綋鏃堕棿
+     */
+    private String specificTime;
+
+
+
+    /**
+     * 鑱旂郴浜�
+     */
+    private String linkPerson;
+
+    /**
+     *  鑱旂郴鐢佃瘽
+     */
+    private String phone;
+
+    /**
+     *  娴佺▼缂栧彿
+     */
+    private String deviceNumber;
+
+    /**
+     *  棰勫畾璇存槑
+     */
+    private String reservationSpecification;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime createDate;
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/DataConfigService.java b/cnas-require/src/main/java/com/ruoyi/requier/service/DataConfigService.java
new file mode 100644
index 0000000..26b58fd
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/DataConfigService.java
@@ -0,0 +1,23 @@
+package com.ruoyi.requier.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.requier.dto.DataConfigDto;
+import com.ruoyi.requier.pojo.DataConfig;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-07-13 12:23:00
+ */
+public interface DataConfigService extends IService<DataConfig> {
+
+    void deleteDataConfig();
+
+    void saveDataAcquisitionConfiguration(Integer deviceId, DataConfigDto dataConfigList);
+
+    Result<?> queryDataAcquisitionConfiguration(Integer deviceId, Boolean isDevice, String inspectionItem, String inspectionItemSubclass);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/DeviceFaultService.java b/cnas-require/src/main/java/com/ruoyi/requier/service/DeviceFaultService.java
new file mode 100644
index 0000000..0071f2f
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/DeviceFaultService.java
@@ -0,0 +1,10 @@
+package com.ruoyi.requier.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.requier.pojo.DeviceFault;
+
+import java.util.Map;
+
+public interface DeviceFaultService extends IService<DeviceFault> {
+    Map<String,Object> findByDeviceId(Integer deviceId);
+}
\ No newline at end of file
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/DeviceMetricRecordService.java b/cnas-require/src/main/java/com/ruoyi/requier/service/DeviceMetricRecordService.java
new file mode 100644
index 0000000..39d4060
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/DeviceMetricRecordService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.requier.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.requier.pojo.DeviceMetricRecord;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:01
+ */
+public interface DeviceMetricRecordService extends IService<DeviceMetricRecord> {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/DeviceMetricsCopyService.java b/cnas-require/src/main/java/com/ruoyi/requier/service/DeviceMetricsCopyService.java
new file mode 100644
index 0000000..88d2215
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/DeviceMetricsCopyService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.requier.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.requier.pojo.DeviceMetricsCopy;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 - 鏍″噯鏉$洰 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:11
+ */
+public interface DeviceMetricsCopyService extends IService<DeviceMetricsCopy> {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/DeviceService.java b/cnas-require/src/main/java/com/ruoyi/requier/service/DeviceService.java
new file mode 100644
index 0000000..868cc96
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/DeviceService.java
@@ -0,0 +1,65 @@
+package com.ruoyi.requier.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.requier.dto.ADto;
+import com.ruoyi.requier.dto.DeviceDto;
+import com.ruoyi.requier.pojo.Device;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 璁惧(Device)琛ㄦ湇鍔℃帴鍙�
+ */
+public interface DeviceService extends IService<Device> {
+
+    List<User> selectUserList();
+
+    List<User> selectUserListByDepartLimsId(String departLimsId);
+
+    IPage<DeviceDto> selectDeviceParameter(Page page, DeviceDto itemParameter, Boolean laboratoryNameIsNull);
+
+    int addDeviceParameter(Device itemParameter);
+
+    int delDeviceParameter(Integer id);
+
+    int upDeviceParameter(Device itemParameter);
+
+    List<Device> selectEquipmentOverview();
+
+    List<Device> authorizedPerson();
+
+    List<Device> search(Integer status, String deviceName, String specificationModel, String largeCategory);
+
+    List<Device> selectDevicePrincipal();
+
+    List<Device> selectDeviceByCategory(String inspectionItem, String inspectionItemSubclass,String sonLaboratory);
+
+    DeviceDto selectDeviceByCode(Integer id);
+
+    /**
+     *
+     * @param request 鍙栬姹備腑鐨刬p
+     * @param id 妫�楠屾牱鍝� 涓婚敭id
+     * @param entrustCode 濮旀墭缂栧彿
+     * @param sampleCode 鏍峰搧缂栧彿
+     * @param fiberOpticRibbon 鍏夌氦甯︾紪鍙�
+     * @return
+     */
+    Result<?> dataAcquisition(HttpServletRequest request, Integer id, String entrustCode, String sampleCode, String fiberOpticRibbon);
+
+    List<ADto> menu();
+
+    List<Map<String, Object>> treeDevice(String deviceName);
+
+    Result<?> determineWhetherToCollectData(String managementNumber, HttpServletRequest request);
+
+    void exportData(DeviceDto deviceDto, HttpServletResponse response);
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/DocumentService.java b/cnas-require/src/main/java/com/ruoyi/requier/service/DocumentService.java
new file mode 100644
index 0000000..87b7595
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/DocumentService.java
@@ -0,0 +1,7 @@
+package com.ruoyi.requier.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.requier.pojo.Document;
+
+public interface DocumentService extends IService<Document> {
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/IDeviceMetricService.java b/cnas-require/src/main/java/com/ruoyi/requier/service/IDeviceMetricService.java
new file mode 100644
index 0000000..c8bb349
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/IDeviceMetricService.java
@@ -0,0 +1,7 @@
+package com.ruoyi.requier.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.requier.pojo.DeviceMetric;
+
+public interface IDeviceMetricService extends IService<DeviceMetric> {
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/IncidentAcceptanceCheckService.java b/cnas-require/src/main/java/com/ruoyi/requier/service/IncidentAcceptanceCheckService.java
new file mode 100644
index 0000000..d9c354f
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/IncidentAcceptanceCheckService.java
@@ -0,0 +1,7 @@
+package com.ruoyi.requier.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.requier.pojo.IncidentAcceptanceCheck;
+
+public interface IncidentAcceptanceCheckService extends IService<IncidentAcceptanceCheck> {
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/IncidentFileService.java b/cnas-require/src/main/java/com/ruoyi/requier/service/IncidentFileService.java
new file mode 100644
index 0000000..df458e4
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/IncidentFileService.java
@@ -0,0 +1,7 @@
+package com.ruoyi.requier.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.requier.pojo.IncidentFile;
+
+public interface IncidentFileService extends IService<IncidentFile> {
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/IncidentInstallService.java b/cnas-require/src/main/java/com/ruoyi/requier/service/IncidentInstallService.java
new file mode 100644
index 0000000..3fadab4
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/IncidentInstallService.java
@@ -0,0 +1,7 @@
+package com.ruoyi.requier.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.requier.pojo.IncidentInstall;
+
+public interface IncidentInstallService extends IService<IncidentInstall> {
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/IncidentReportService.java b/cnas-require/src/main/java/com/ruoyi/requier/service/IncidentReportService.java
new file mode 100644
index 0000000..32371ba
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/IncidentReportService.java
@@ -0,0 +1,33 @@
+package com.ruoyi.requier.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.requier.dto.IncidentReportAddDto;
+import com.ruoyi.requier.excel.IncidentReportExport;
+import com.ruoyi.requier.pojo.IncidentReport;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧楠屾敹娣诲姞楠屾敹瀛楁琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 03:54:49
+ */
+public interface IncidentReportService extends IService<IncidentReport> {
+
+    void saveIncidentReportData(IncidentReportAddDto incidentReportAddDto);
+
+    IPage<IncidentReportAddDto> getByDeviceId(Integer deviceId, Page page, String processNumber);
+
+    void deleteIncidentReport(Integer id);
+
+    IncidentReportAddDto getShowIncidentReport(Integer id);
+
+    void deleteIncidentReportAll(Integer sparePartsId, Integer fileId, Integer installId, Integer acceptanceCheckId);
+
+    List<IncidentReportExport> incidentReportExport(Integer deviceId);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/IncidentSparePartsService.java b/cnas-require/src/main/java/com/ruoyi/requier/service/IncidentSparePartsService.java
new file mode 100644
index 0000000..9b45b63
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/IncidentSparePartsService.java
@@ -0,0 +1,7 @@
+package com.ruoyi.requier.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.requier.pojo.IncidentSpareParts;
+
+public interface IncidentSparePartsService extends IService<IncidentSpareParts> {
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/InformationNotificationService.java b/cnas-require/src/main/java/com/ruoyi/requier/service/InformationNotificationService.java
new file mode 100644
index 0000000..c03a5c2
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/InformationNotificationService.java
@@ -0,0 +1,32 @@
+package com.ruoyi.requier.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.requier.dto.InformationNotificationDto;
+import com.ruoyi.requier.pojo.InformationNotification;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 娑堟伅閫氱煡 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-04-23 02:14:30
+ */
+public interface InformationNotificationService extends IService<InformationNotification> {
+
+    IPage<InformationNotificationDto> getPage(Page page, String messageType);
+
+    void markAllInformationReadOrDeleteAllReadMessages(Boolean isMarkAllInformationRead);
+
+    Boolean checkForUnreadData();
+
+    void triggerModificationStatusToRead(Integer id);
+
+    int addInformationNotification(InformationNotification informationNotification);
+
+    Map<String, Object> getNumberFourTypesMessagesHomePage();
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/InsOrderPlanService.java b/cnas-require/src/main/java/com/ruoyi/requier/service/InsOrderPlanService.java
new file mode 100644
index 0000000..ffbdfdc
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/InsOrderPlanService.java
@@ -0,0 +1,78 @@
+package com.ruoyi.requier.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.inspect.dto.InsOrderPlanDTO;
+import com.ruoyi.inspect.dto.InsProductResultDTO;
+import com.ruoyi.inspect.dto.TasksShowDto;
+import com.ruoyi.inspect.dto.UnInsProductsDTO;
+import com.ruoyi.inspect.pojo.InsOrderFile;
+import com.ruoyi.inspect.pojo.InsProduct;
+import com.ruoyi.inspect.vo.InsOrderPlanTaskSwitchVo;
+import com.ruoyi.inspect.vo.InsOrderPlanVO;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 妫�楠屼换鍔�-涓氬姟灞�
+ */
+public interface InsOrderPlanService {
+
+    void exportInsOrderPlanResult(Map<String, Object> data, HttpServletResponse response);
+
+    List<Map<String,Object>> getInsOrderPlanList(Map<String,Object> data);
+
+    void exportCommissionFees(Map<String, Object> data,HttpServletResponse response);
+
+    Map<String, Object> getTabHeader(String sonLaboratory,String samples);
+
+    IPage<InsOrderPlanVO> selectInsOrderPlanList(Page page, InsOrderPlanDTO insOrderPlanDTO);
+
+    IPage<InsOrderPlanTaskSwitchVo> inspectionOrderDetailsTaskSwitching(Page page, InsOrderPlanDTO insOrderPlanDTO);
+
+    boolean claimInsOrderPlan(InsOrderPlanDTO entity);
+
+    void saveInsContext(Map<String, Object> insContext,Integer currentTable,Integer sampleId,Integer orderId,String sonLaboratory,Boolean isDelete);
+
+    Map<String, Object> doInsOrder(Integer id, String laboratory);
+
+    int upPlanUser(Integer userId, Integer orderId,String sonLaboratory);
+
+    int verifyPlan(Integer orderId, String laboratory, Integer type, String tell);
+
+    int submitPlan(Integer orderId, String laboratory, Integer verifyUser, String entrustCode);
+
+    List<String> getEquipName(Integer orderId,String sonLaboratory);
+
+
+    List<InsProduct> getInsProduct(Integer id, Integer type, String laboratory, HttpServletRequest request);
+
+    List<String> checkSubmitPlan(Integer orderId, String laboratory,String temperature,String humidity);
+
+    IPage<InsOrderFile> getFileList(Page page, InsOrderFile insOrderFile);
+
+    int uploadFile(Integer orderId, MultipartFile file);
+
+    Map<String,Object> getReportModel(Integer sampleId, String sonLaboratory);
+
+    Map<String,Object> temCycle(Integer sampleId, String inspectionItem, String inspectionItemSubclass);
+
+    List<String> upPlanUser2(Integer orderId);
+
+    Map<String,Object> getSagTemperatureProducts(Integer sampleId);
+
+    Map<String,Object> getSampleInfoByOrderId(Integer id,String laboratory);
+
+    void exportUnInsProducts(UnInsProductsDTO unInsProductsDTO, HttpServletResponse response);
+
+    int saveInsContext2(InsProductResultDTO insProductResult);
+
+    IPage<TasksShowDto> tasksShow(Page page, String sonLaboratory);
+
+    int getCurrentMonthPlanTotalBySonLaboratory(String sonLaboratory, LocalDateTime startTime, LocalDateTime endTime);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/InsReportService.java b/cnas-require/src/main/java/com/ruoyi/requier/service/InsReportService.java
new file mode 100644
index 0000000..b7d5701
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/InsReportService.java
@@ -0,0 +1,56 @@
+package com.ruoyi.requier.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.inspect.dto.ReportPageDto;
+import com.ruoyi.inspect.pojo.InsReport;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+/**
+* @author Administrator
+* @description 閽堝琛ㄣ�恑ns_report(妫�楠屾姤鍛�)銆戠殑鏁版嵁搴撴搷浣淪ervice
+* @createDate 2024-03-17 22:10:02
+*/
+public interface InsReportService extends IService<InsReport> {
+
+    IPage<ReportPageDto> pageInsReport(Page page, ReportPageDto reportPageDto);
+
+//    void wordToPdf(String path,String sealUrl);
+
+    int inReport(String url, Integer id);
+
+    int upReportUrl(Integer id);
+    // 涓嬭浇
+    void downReport(Integer id, Integer type ,HttpServletResponse response);
+
+    //鎻愪氦
+    int writeReport(Integer id);
+
+    //瀹℃牳
+    int examineReport(Integer id, Integer isExamine, String examineTell);
+
+    //鎵瑰噯
+    int ratifyReport(Integer id, Integer isRatify, String ratifyTell);
+
+    int wordInsertUrl(Map<String, Object> map, String url);
+
+    String downAll(String ids);
+
+    int upAll(MultipartFile file) throws IOException;
+
+    void withdraw(Map<String,Object> map);
+
+    List<Map<String,Object>> getLaboratoryByReportId(Integer id);
+
+    Map<String,Object> getReportCountInfo(ReportPageDto reportPageDto);
+
+    void batchApprovalReport(List<Integer> ids);
+
+    Map<String,Object> getBatchApprovalProgress();
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/InstructionService.java b/cnas-require/src/main/java/com/ruoyi/requier/service/InstructionService.java
new file mode 100644
index 0000000..10e200f
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/InstructionService.java
@@ -0,0 +1,22 @@
+package com.ruoyi.requier.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.requier.dto.InstructionDto;
+import com.ruoyi.requier.pojo.Instruction;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+public interface InstructionService extends IService<Instruction> {
+
+    IPage<Instruction> pageByPageQueryOfHomeworkInstructions(Page page);
+
+    void newHomeworkGuidebookAdded(InstructionDto instructionDto);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/OperationInstructionService.java b/cnas-require/src/main/java/com/ruoyi/requier/service/OperationInstructionService.java
new file mode 100644
index 0000000..9d1bf23
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/OperationInstructionService.java
@@ -0,0 +1,20 @@
+package com.ruoyi.requier.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.requier.pojo.OperationInstruction;
+import com.ruoyi.requier.vo.OperationInstructionVo;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:43:32
+ */
+public interface OperationInstructionService extends IService<OperationInstruction> {
+
+    List<OperationInstructionVo> homeworkGuidebookEditor(Integer instructionId);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/PkMasterService.java b/cnas-require/src/main/java/com/ruoyi/requier/service/PkMasterService.java
new file mode 100644
index 0000000..cbad787
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/PkMasterService.java
@@ -0,0 +1,21 @@
+package com.ruoyi.requier.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.requier.pojo.PkMaster;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-07-29 01:16:26
+ */
+public interface PkMasterService extends IService<PkMaster> {
+
+    //娓╁害寰幆鏁伴噰
+    int temDataAcquisition(PkMaster pkMaster);
+
+    //娓╁害寰幆鏁伴噰鎬讳綋
+    int temDataAcquisition2(PkMaster pkMaster);
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/QrShowService.java b/cnas-require/src/main/java/com/ruoyi/requier/service/QrShowService.java
new file mode 100644
index 0000000..57874d8
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/QrShowService.java
@@ -0,0 +1,9 @@
+package com.ruoyi.requier.service;
+
+import org.springframework.ui.Model;
+
+public interface QrShowService {
+
+    void transformModelByType(Model model,String code,String type);
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/ReservationService.java b/cnas-require/src/main/java/com/ruoyi/requier/service/ReservationService.java
new file mode 100644
index 0000000..0bd2cb3
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/ReservationService.java
@@ -0,0 +1,29 @@
+package com.ruoyi.requier.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.requier.dto.DeviceDto;
+import com.ruoyi.requier.dto.ReservationDto;
+import com.ruoyi.requier.pojo.Reservation;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 璧勬簮棰勫畾鏂板缓棰勫畾琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author baomidou
+ * @since 2024-09-14
+ */
+public interface ReservationService extends IService<Reservation> {
+
+    ArrayList<JSONObject> selectDeviceParameter(Page page, DeviceDto itemParameter, Boolean laboratoryNameIsNull, String starttime, String endtime);
+
+    List<ReservationDto> selectReservationParameterPage(String deviceId, String reservationTime, String specificTime);
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/impl/DataConfigServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/DataConfigServiceImpl.java
new file mode 100644
index 0000000..fb6753e
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/DataConfigServiceImpl.java
@@ -0,0 +1,66 @@
+package com.ruoyi.requier.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.requier.dto.DataConfigDto;
+import com.ruoyi.requier.mapper.DataConfigMapper;
+import com.ruoyi.requier.mapper.DeviceMapper;
+import com.ruoyi.requier.pojo.DataConfig;
+import com.ruoyi.requier.pojo.Device;
+import com.ruoyi.requier.service.DataConfigService;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-07-13 12:23:00
+ */
+@Service
+@AllArgsConstructor
+public class DataConfigServiceImpl extends ServiceImpl<DataConfigMapper, DataConfig> implements DataConfigService {
+
+    private DeviceMapper deviceMapper;
+
+    private DataConfigMapper dataConfigMapper;
+
+    @Override
+    public void deleteDataConfig() {
+        List<Integer> integers = dataConfigMapper.deleteDataConfig();
+        if (!integers.isEmpty()) {
+            dataConfigMapper.deleteBatchIds(integers);
+        }
+    }
+
+    @Override
+    public void saveDataAcquisitionConfiguration(Integer deviceId, DataConfigDto dataConfigList) {
+        if (dataConfigList.getIsDevice()) {
+            Device device = new Device();
+            BeanUtils.copyProperties(dataConfigList, device);
+            device.setId(deviceId);
+            deviceMapper.updateById(device);
+        } else {
+            this.saveOrUpdateBatch(dataConfigList.getDataConfigList());
+        }
+    }
+
+    @Override
+    public Result<?> queryDataAcquisitionConfiguration(Integer deviceId, Boolean isDevice, String inspectionItem, String inspectionItemSubclass) {
+        if (isDevice) {
+            List<DataConfig> list = baseMapper.selectList(Wrappers.<DataConfig>lambdaQuery()
+                    .eq(DataConfig::getDeviceId, deviceId)
+                    .eq(DataConfig::getInspectionItem, inspectionItem)
+                    .eq(DataConfig::getInspectionItemSubclass, inspectionItemSubclass));
+            return Result.success(list);
+        } else {
+            return Result.success(dataConfigMapper.selectDataConfigList(deviceId));
+        }
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/impl/DeviceFaultServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/DeviceFaultServiceImpl.java
new file mode 100644
index 0000000..3d780b1
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/DeviceFaultServiceImpl.java
@@ -0,0 +1,107 @@
+package com.ruoyi.requier.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.mapper.StructureItemParameterMapper;
+import com.ruoyi.basic.pojo.StructureItemParameter;
+import com.ruoyi.common.core.domain.entity.SysDictData;
+import com.ruoyi.common.utils.DictUtils;
+import com.ruoyi.requier.mapper.DeviceFaultMapper;
+import com.ruoyi.requier.mapper.DeviceFaultOneMapper;
+import com.ruoyi.requier.mapper.DeviceMaintenanceMapper;
+import com.ruoyi.requier.mapper.DeviceMapper;
+import com.ruoyi.requier.pojo.*;
+import com.ruoyi.requier.service.DeviceFaultService;
+import com.ruoyi.system.mapper.SysDictDataMapper;
+import com.ruoyi.system.mapper.SysDictTypeMapper;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class DeviceFaultServiceImpl extends ServiceImpl<DeviceFaultMapper, DeviceFault> implements DeviceFaultService {
+
+    @Autowired
+    private DeviceMapper deviceMapper;
+
+    @Autowired
+    private QrShowServiceImpl qrShowService;
+
+    @Resource
+    private SysDictDataMapper sysDictDataMapper;
+
+    @Autowired
+    private DeviceMaintenanceMapper deviceMaintenanceMapper;
+
+    @Autowired
+    private StructureItemParameterMapper structureItemParameterMapper;
+
+    @Autowired
+    private DeviceFaultOneMapper deviceFaultOneMapper;
+
+    @Override
+    public Map<String,Object> findByDeviceId(Integer deviceId) {
+        Map<String,Object> map = new HashMap<>();
+        if(Objects.isNull(deviceId)){
+            return map;
+        }
+        //鏌ヨ璁惧涓昏〃淇℃伅
+        Device device = deviceMapper.selectById(deviceId);
+        if(!Objects.isNull(device)){
+            //鏌ヨ璁惧鏍″噯淇℃伅
+            DeviceMetricRecord calibrate = qrShowService.getDeviceMetricRecord(device.getId(), "calibrate");
+            //鏌ヨ璁惧鏍告煡淇℃伅
+            DeviceMetricRecord examine = qrShowService.getDeviceMetricRecord(device.getId(), "examine");
+            //鏌ヨ璁惧缁存姢璁板綍
+            DeviceMaintenance deviceMaintenance = Optional.ofNullable(deviceMaintenanceMapper.selectOne(Wrappers.<DeviceMaintenance>lambdaQuery()
+                    .eq(DeviceMaintenance::getDeviceId, device.getId())
+                    .orderByDesc(DeviceMaintenance::getId)
+                    .last("limit 1"))).orElse(new DeviceMaintenance());
+            //鏌ヨ璁惧鏁呴殰淇℃伅
+            List<DeviceFaultOne> deviceFaultOneList = Optional.ofNullable(deviceFaultOneMapper.selectList(Wrappers.<DeviceFaultOne>lambdaQuery()
+                    .eq(DeviceFaultOne::getDeviceId, device.getId())
+                    .orderByDesc(DeviceFaultOne::getId))).orElse(new ArrayList<>());
+            //鏌ヨ璁惧鐘舵�佸瓧鍏�
+            List<SysDictData> sysDictDataList = sysDictDataMapper.selectDictDataByType("device_status");
+//            List<SysDictData> sysDictDataList = DictUtils.getDictCache("璁惧鐘舵��");
+            SysDictData findEnum = sysDictDataList.stream().filter(e-> Integer.parseInt(e.getDictValue()) ==device.getDeviceStatus()).findFirst().orElse(new SysDictData());
+            map.put("progress",qrShowService.calcDeviceNextCheckRatio(calibrate.getCalibrationDate(),calibrate.getNextCalibrationDate()));//璺濈涓嬫鏍″噯鏃ユ湡鐨勫ぉ鏁扮櫨鍒嗘瘮
+            map.put("deviceName",device.getDeviceName());//璁惧鍚嶇О
+            map.put("deviceCode",device.getManagementNumber());//璁惧缂栧彿
+            map.put("usedYears",qrShowService.calcUsedYears(device.getActivationDate()));//鍚敤鏃堕暱(骞�)
+            map.put("deviceStatus",findEnum.getDictLabel());//璁惧杩愯鐘舵��
+            map.put("faultCount",deviceFaultOneList.size());//鏁呴殰娆℃暟
+            String faultDate = !deviceFaultOneList.isEmpty() ?qrShowService.formatDate(deviceFaultOneList.get(0).getFaultDate(),"yyyy-MM-dd"):"";
+            map.put("faultDate",faultDate);//鏈�杩戞晠闅滄棩鏈�
+            map.put("lastCalibrationDate",qrShowService.formatDate(calibrate.getCalibrationDate(),"yyyy-MM-dd"));//鏈�杩戞牎鍑嗘棩鏈�
+            map.put("nextCalibrationDate",qrShowService.formatDate(calibrate.getNextCalibrationDate(),"yyyy-MM-dd"));//涓嬫鏍″噯鏃ユ湡
+            String calibrateStatus = "0yes".equals(calibrate.getStatus())?"鍚堟牸":"1no".equals(calibrate.getStatus())?"涓嶅悎鏍�":"鍏朵粬";
+            map.put("calibrateStatus",Objects.isNull(calibrate.getCalibrationDate())?"":calibrateStatus);//鏍″噯鎬荤粨璁�
+            map.put("lastExamineDate",examine.getCalibrationDate());//鏈�杩戞牳鏌ユ棩鏈�
+            map.put("nextExamineDate",examine.getNextCalibrationDate());//涓嬫鏍告煡鏃ユ湡
+            String examineStatus = "0yes".equals(examine.getStatus())?"鍚堟牸":"1no".equals(examine.getStatus())?"涓嶅悎鏍�":"鍏朵粬";
+            map.put("examineStatus",Objects.isNull(examine.getCalibrationDate())?"":examineStatus);//鏍告煡鎬荤粨璁�
+            map.put("maintenanceDate",deviceMaintenance.getDate());//鏈�杩戠淮鎶ゆ棩鏈�
+            map.put("nextMaintenanceDate",deviceMaintenance.getNextDate());//涓嬫缁存姢鏃ユ湡
+            String maintenanceType = "";
+            if(!Objects.isNull(deviceMaintenance.getMaintenanceType())){
+                maintenanceType = 0==deviceMaintenance.getMaintenanceType()?"浣跨敤鍓嶇淮鎶�":"浣跨敤鍚庣淮鎶�";
+            }
+            map.put("maintenanceType",maintenanceType);//缁存姢鎬荤粨璁�
+            //娴嬮噺椤圭洰
+            String insProduct = "";
+            if(StringUtils.isNotBlank(device.getInsProductIds())){
+                String[] ids = device.getInsProductIds().split(",");
+                List<StructureItemParameter> parameters = structureItemParameterMapper.selectBatchIds(Arrays.asList(ids));
+                List<String> itemList = parameters.stream().map(StructureItemParameter::getInspectionItem).distinct().collect(Collectors.toList());
+                insProduct = String.join(",",itemList);
+            }
+            map.put("insProduct",insProduct);//娴嬮噺椤圭洰
+        }
+        return map;
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/impl/DeviceMetricRecordServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/DeviceMetricRecordServiceImpl.java
new file mode 100644
index 0000000..3e211aa
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/DeviceMetricRecordServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.requier.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.requier.mapper.DeviceMetricRecordMapper;
+import com.ruoyi.requier.pojo.DeviceMetricRecord;
+import com.ruoyi.requier.service.DeviceMetricRecordService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:01
+ */
+@Service
+public class DeviceMetricRecordServiceImpl extends ServiceImpl<DeviceMetricRecordMapper, DeviceMetricRecord> implements DeviceMetricRecordService {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/impl/DeviceMetricServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/DeviceMetricServiceImpl.java
new file mode 100644
index 0000000..907e618
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/DeviceMetricServiceImpl.java
@@ -0,0 +1,11 @@
+package com.ruoyi.requier.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.requier.mapper.DeviceMetricMapper;
+import com.ruoyi.requier.pojo.DeviceMetric;
+import com.ruoyi.requier.service.IDeviceMetricService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class DeviceMetricServiceImpl extends ServiceImpl<DeviceMetricMapper, DeviceMetric> implements IDeviceMetricService {
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/impl/DeviceMetricsCopyServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/DeviceMetricsCopyServiceImpl.java
new file mode 100644
index 0000000..1c7f225
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/DeviceMetricsCopyServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.requier.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.requier.mapper.DeviceMetricsCopyMapper;
+import com.ruoyi.requier.pojo.DeviceMetricsCopy;
+import com.ruoyi.requier.service.DeviceMetricsCopyService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 璁惧鏍″噯 - 鏍″噯璁板綍 - 鏍″噯鏉$洰 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-09-27 10:20:11
+ */
+@Service
+public class DeviceMetricsCopyServiceImpl extends ServiceImpl<DeviceMetricsCopyMapper, DeviceMetricsCopy> implements DeviceMetricsCopyService {
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/impl/DeviceServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/DeviceServiceImpl.java
new file mode 100644
index 0000000..33550cf
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/DeviceServiceImpl.java
@@ -0,0 +1,1115 @@
+package com.ruoyi.requier.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.mapper.StructureItemParameterMapper;
+import com.ruoyi.basic.pojo.StructureItemParameter;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.core.domain.entity.SysDictData;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.DictUtils;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.requier.dto.ADto;
+import com.ruoyi.requier.dto.BDto;
+import com.ruoyi.requier.dto.DeviceDto;
+import com.ruoyi.requier.mapper.DeviceMapper;
+import com.ruoyi.requier.pojo.DataConfig;
+import com.ruoyi.requier.pojo.Device;
+import com.ruoyi.requier.pojo.DeviceMetricRecord;
+import com.ruoyi.requier.service.DataConfigService;
+import com.ruoyi.requier.service.DeviceService;
+import com.ruoyi.requier.util.DataAcquisition;
+import com.ruoyi.system.mapper.UserMapper;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.util.Strings;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 璁惧(Device)琛ㄦ湇鍔″疄鐜扮被
+ */
+@Service
+@AllArgsConstructor
+public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> implements DeviceService {
+
+    private DeviceMapper deviceMapper;
+
+    private UserMapper userMapper;
+
+    private StructureItemParameterMapper structureItemParameterMapper;
+
+    @Autowired
+    private DataConfigService dataConfigService;
+
+    @Autowired
+    private QrShowServiceImpl qrShowService;
+
+    @Override
+    public List<User> selectUserList() {
+        List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().like(User::getDepartLimsId, "1"));
+        return users;
+    }
+
+    @Override
+    public List<User> selectUserListByDepartLimsId(String departLimsId) {
+        List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().like(User::getDepartLimsId, departLimsId));
+        return users;
+    }
+
+    @Override
+    public IPage<DeviceDto> selectDeviceParameter(Page page, DeviceDto itemParameter, Boolean laboratoryNameIsNull) {
+        IPage<DeviceDto> iPage = deviceMapper.selectDeviceParameterPage(page, QueryWrappers.queryWrappers(itemParameter), laboratoryNameIsNull);
+        return iPage;
+    }
+
+    @Override
+    public int addDeviceParameter(Device itemParameter) {
+        return deviceMapper.insert(itemParameter);
+    }
+
+    @Override
+    public int delDeviceParameter(Integer id) {
+        return deviceMapper.deleteById(id);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public int upDeviceParameter(Device itemParameter) {
+        // 鍒犻櫎鏁伴噰闆嗛厤缃暟鎹�
+        dataConfigService.deleteDataConfig();
+        // 闇�瑕佸悓鏃舵洿鏀� device琛�
+
+
+
+
+        return deviceMapper.updateById(itemParameter);
+    }
+
+    @Override
+    public List<Device> selectEquipmentOverview() {
+        return deviceMapper.selectEquipmentOverview(new Page(1, 10), QueryWrappers.queryWrappers(new Device()));
+    }
+
+    @Override
+    public List<Device> authorizedPerson() {
+        return deviceMapper.authorizedPerson();
+    }
+
+    @Override
+    public List<Device> search(Integer status, String deviceName, String specificationModel, String largeCategory) {
+        return deviceMapper.search(status, deviceName, specificationModel, largeCategory);
+    }
+
+    @Override
+    public List<Device> selectDevicePrincipal() {
+        return deviceMapper.selectDevicePrincipal();
+    }
+
+    @Override
+    public List<Device> selectDeviceByCategory(String inspectionItem, String inspectionItemSubclass,String sonLaboratory) {
+//        Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId");
+//        User user = Optional.ofNullable(userMapper.selectById(userId)).orElse(new User());
+//        String departLimsId = user.getDepartLimsId();
+//        if(departLimsId.isEmpty()){
+//
+//        }
+        List<Integer> id;
+
+        try {
+            id = structureItemParameterMapper.selectList(Wrappers.<StructureItemParameter>lambdaQuery()
+                    .eq(StructureItemParameter::getInspectionItem, inspectionItem)
+                    .eq(ObjectUtils.isNotEmpty(inspectionItemSubclass),StructureItemParameter::getInspectionItemSubclass, inspectionItemSubclass)
+                    .eq(ObjectUtils.isNotEmpty(sonLaboratory),StructureItemParameter::getSonLaboratory,sonLaboratory)
+                    .select(StructureItemParameter::getId)).stream().map(StructureItemParameter::getId).collect(Collectors.toList());
+//            if () {
+////                id = structureItemParameterMapper.selectOne(Wrappers.<StructureItemParameter>lambdaQuery()
+////                        .eq(StructureItemParameter::getInspectionItem, inspectionItem)
+////                        .last("limit 1").select(StructureItemParameter::getId)).getId();
+//
+//
+//            }else {
+////                id = structureItemParameterMapper.selectOne(Wrappers.<StructureItemParameter>lambdaQuery()
+////                        .eq(StructureItemParameter::getInspectionItem, inspectionItem)
+////                        .eq(StructureItemParameter::getInspectionItemSubclass, inspectionItemSubclass)
+////                        .last("limit 1").select(StructureItemParameter::getId)).getId();
+//                id = structureItemParameterMapper.selectList(Wrappers.<StructureItemParameter>lambdaQuery()
+//                        .eq(StructureItemParameter::getInspectionItem, inspectionItem)
+//
+//                        .select(StructureItemParameter::getId)).stream().map(StructureItemParameter::getId).collect(Collectors.toList());
+//            }
+        } catch (Exception e) {
+            return null;
+        }
+        List<Device> devices = deviceMapper.selectList(Wrappers.<Device>lambdaQuery()
+                .eq(Device::getDeviceStatus, 0)
+                .isNotNull(Device::getInsProductIds));
+        List<Device> devices2 = new ArrayList<>();
+        for (Device device : devices) {
+            String[] ids = device.getInsProductIds().split(",");
+            for (String i : ids) {
+                if (ObjectUtils.isNotEmpty(i)) {
+                    if (id.contains(Integer.parseInt(i))) {
+                        devices2.add(device);
+                        break;
+                    }
+                }
+            }
+        }
+        return devices2;
+    }
+
+    @Override
+    public DeviceDto selectDeviceByCode(Integer id) {
+        DeviceDto deviceDto = deviceMapper.selectDeviceByCode(id);
+        List<Integer> ids = new ArrayList<>();
+        if(Strings.isNotEmpty(deviceDto.getAuthorizedPerson())) {
+            if(deviceDto.getAuthorizedPerson().equals("null")) {
+                deviceDto.setAuthorizedPerson("[]");
+            }
+            ids = JSON.parseArray(deviceDto.getAuthorizedPerson(), Integer.class);
+        }
+        String name = "";
+        if(!ids.isEmpty()) {
+             name = userMapper.selectBatchIds(ids).stream().map(User::getName).collect(Collectors.joining(","));
+        }
+        deviceDto.setAuthorizedPersonName(name);
+        //鏌ヨ璁惧鏍″噯淇℃伅
+        DeviceMetricRecord calibrate = qrShowService.getDeviceMetricRecord(id, "calibrate");
+        //deviceDto.setCalibrationDate(qrShowService.formatDate(calibrate.getCalibrationDate(),"yyyy-MM-dd"));
+        deviceDto.setCalibrateNo(calibrate.getCertificateSerialNumber());
+        if(Objects.nonNull(calibrate.getNextCalibrationDate())){
+            deviceDto.setCalibrationServices(calibrate.getUnitOfMeasure());
+            deviceDto.setNextCalibrationDate(calibrate.getNextCalibrationDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
+            deviceDto.setLastCalibrationDate(calibrate.getCalibrationDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
+        }
+
+        // 鍒颁簡鍋滅敤鏃ユ湡锛岃嚜鍔ㄥ皢鐘舵�佹敼涓哄仠鐢�
+        if(Objects.nonNull(deviceDto.getNextCalibrationDate()) && LocalDateTime.now().isAfter(deviceDto.getNextCalibrationDate())) {
+            List<SysDictData> enums = DictUtils.getDictCache("璁惧鐘舵��");
+            List<SysDictData> status = enums.stream().filter(item -> item.getDictValue().equals("鍋滅敤")).collect(Collectors.toList());
+            deviceDto.setDeviceStatus(Integer.parseInt(status.get(0).getDictValue()));
+            deviceMapper.updateById(deviceDto);
+        }
+        return deviceDto;
+    }
+
+    /**
+     *
+     * @param request 鍙栬姹備腑鐨刬p
+     * @param id 妫�楠屾牱鍝� 涓婚敭id
+     * @param entrustCode 濮旀墭缂栧彿
+     * @param sampleCode 鏍峰搧缂栧彿
+     * @param fiberOpticRibbon 鍏夌氦甯︾紪鍙�
+     * @return
+     */
+    @Override
+    public Result<?> dataAcquisition(HttpServletRequest request, Integer id, String entrustCode, String sampleCode, String fiberOpticRibbon) {
+        // 闃叉鍥炵幆鍦板潃鍙樹负IPv6
+        String ip = DataAcquisition.getIp(request);
+        List<Device> device = baseMapper.selectList(Wrappers.<Device>lambdaQuery()
+                .eq(Device::getIp, ip));
+        // 1銆佹楠�
+        if(device.size() > 1) {
+            String str = "";
+            for (Device device1 : device) {
+                str += device1.getDeviceName() + "锛�";
+            }
+            throw new ErrorException("IP锛�" + ip + "閰嶇疆浜嗚澶囧涓澶囷細" + str + "锛屾棤娉曡繘琛屾暟閲囷紒");
+        }
+        if (ObjectUtils.isEmpty(device)) {
+            throw new ErrorException("鏈粰璇P锛�" + ip + "閰嶇疆璁惧锛屾棤娉曡繘琛屾暟閲囷紒");
+        }
+        List<Map<String, Object>> inspectionItemSubclass = baseMapper.getInspectionItemSubclass(id);
+        if (ObjectUtils.isEmpty(device.get(0).getFileType()) || ObjectUtils.isEmpty(device.get(0).getCollectUrl())) {
+            throw new ErrorException("鏈粰璇ワ細" + device.get(0).getDeviceName() + "璁惧閰嶇疆閲囬泦璺緞鎴栨枃浠跺悗缂�锛�");
+        }
+        // 2銆佸彇璁惧鍏宠仈鐨勬楠岄」锛屾楠屽瓙椤�
+        List<DataConfig> list1 = new ArrayList<>();
+        inspectionItemSubclass.forEach(i -> {
+             List<DataConfig> list = dataConfigService.list(Wrappers.<DataConfig>lambdaQuery()
+                .eq(DataConfig::getDeviceId, device.get(0).getId())
+                .eq(DataConfig::getInspectionItem, i.get("inspection_item"))
+                .eq(DataConfig::getInspectionItemSubclass, i.get("inspection_item_subclass"))
+                .orderBy(false, false, DataConfig::getId));
+            list1.addAll(list);
+        });
+        List<DataConfig> collect = list1.stream().distinct().collect(Collectors.toList());
+        // 3銆侀噰闆嗭紝鍙栨暟鎹�
+        Map<String, Object> map = DataAcquisition.dataAcquisitionEntrance(collect, device.get(0), entrustCode, sampleCode, ip, fiberOpticRibbon);
+        // 4銆侀�犲惊鐜鏁帮紝鍙備笌鍏紡璁$畻
+        if (ObjectUtils.isNotEmpty(map)) {
+            Map<String, Object> frequency = DataAcquisition.createFrequency(entrustCode, sampleCode,fiberOpticRibbon, map);
+            return Result.success(frequency);
+        } else {
+            return Result.success(null);
+        }
+    }
+
+    @Override
+    public List<ADto> menu() {
+        //鏌ヨ鎵�鏈夎澶囦俊鎭�
+        List<Device> devices = baseMapper.selectList(null);
+        List<String> name = devices.stream().map(Device::getDeviceName).collect(Collectors.toList());
+
+        //鏌ヨ鎵�鏈夌敤鎴蜂俊鎭�
+        List<User> users = userMapper.selectList(null);
+        List<String> collect = users.stream().map(User::getName).collect(Collectors.toList());
+        String menu="[\n" +
+                "\t{\n" +
+                "\t\tk: 0,\n" +
+                "\t\tv: \"涓汉棣栭〉\",\n" +
+                "\t\ti: \"font icon-shouyefill\",\n" +
+                "\t\tself: true,\n" +
+                "\t\tc: [{\n" +
+                "\t\t\tk: 0,\n" +
+                "\t\t\tv: \"涓汉棣栭〉\",\n" +
+                "\t\t\ti: \"font icon-shouyefill\",\n" +
+                "\t\t\tu: \"index-index\"\n" +
+                "\t\t}]\n" +
+                "\t},\n" +
+                "\t{\n" +
+                "\t\tv: \"涓氬姟绠$悊\",\n" +
+                "\t\ti: \"font icon-kexueyanjiuheshiyankaifa\",\n" +
+                "\t\tp: \"selectInsOrderParameter selectInsOrderPlanList pageInsReport costStatistics selectWarehouse\",\n" +
+                "\t\tc: [\n" +
+                "      {\n" +
+                "        v: \"鍘熸潗鏂欐楠屼笅鍗昞",\n" +
+                "        i: \"font icon-erjidaohang\",\n" +
+                "        u: \"b1-material-inspection-order\",\n" +
+                "        p: \"selectInsOrderParameter\"\n" +
+                "      },\n" +
+                "      {\n" +
+                "\t\t\tv: \"妫�楠屼笅鍗昞",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"b1-inspection-order\",\n" +
+                "\t\t\tp: \"selectInsOrderParameter\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"妫�楠屼换鍔",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"b1-inspect-order-plan\",\n" +
+                "\t\t\tp: \"selectInsOrderPlanList\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鎶ュ憡缂栧埗\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"b1-report-preparation\",\n" +
+                "\t\t\tp: \"pageInsReport\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"璐圭敤缁熻\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"b1-expenses\",\n" +
+                "\t\t\tp: \"costStatistics\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鏍峰搧绠$悊\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"b1-sample\",\n" +
+                "\t\t\tp: \"selectWarehouse\"\n" +
+                "\t\t},{\n" +
+                "\t\t\tv: \"涓嶅悎鏍肩鐞哱",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"b1-unpass\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}\n" +
+                "\t]\n" +
+                "\t},\n" +
+                "\t{\n" +
+                "\t\tv: \"鏍囧噯闆哱",\n" +
+                "\t\ti: \"font icon-biaozhunji\",\n" +
+                "\t\tp: \"selectStandardTreeList selectStandardTemplatePageList\",\n" +
+                "\t\tc: [{\n" +
+                "\t\t\tv: \"鏍囧噯搴揬",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"b2-standard\",\n" +
+                "\t\t\tp: \"selectStandardTreeList\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鍘熷璁板綍妯℃澘\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"b2-standard-template\",\n" +
+                "\t\t\tp: \"selectStandardTemplatePageList\"\n" +
+                "\t\t}]\n" +
+                "\t},\n" +
+                "\t{\n" +
+                "\t\tv: \"缁╂晥绠$悊\",\n" +
+                "\t\ti: \"font icon-jixiaoguanli\",\n" +
+                "\t\tp: \"\",\n" +
+                "\t\tc: [{\n" +
+                "\t\t\tv: \"宸ユ椂绠$悊\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"b3-work-time-management\",\n" +
+                "\t\t\tp: \"selectAuxiliaryWorkingHours\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"浜哄憳鑰冨嫟\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"浜哄憳鑰冭瘎\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"b3-personnel-evaluation\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"浜哄憳鑰冩牳\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鎶�鑳界瓑绾",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"宸ヨ祫缁撶畻\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鐝\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"b3-classes\",\n" +
+                "\t\t\tp: \"performanceShiftPage performanceShiftPageYear\"\n" +
+                "\t\t}]\n" +
+                "\t},\n" +
+                "\t{\n" +
+                "\t\tv: \"缁熻鍥捐〃\",\n" +
+                "\t\ti: \"font icon-tongjitubiao\",\n" +
+                "\t\tp: \"\",\n" +
+                "\t\tc: [{\n" +
+                "\t\t\tv: \"瀹為獙瀹よ绱燶",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"姣忔棩涓氬姟缁熻\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"b4-daily-business-statistics\",\n" +
+                "\t\t\tp: \"businessStatisticsByDay\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"妫�娴嬮」鐩粺璁",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"b4-inspection-item-statistics\",\n" +
+                "\t\t\tp: \"testProductByDay\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鏍峰搧缂洪櫡鎸囨暟\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"b4-sample-defects\",\n" +
+                "\t\t\tp: \"selectSampleDefects\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鑰楁潗缁熻\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"浜哄憳宸ヤ綔鎶ヨ〃\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}]\n" +
+                "\t},\n" +
+                "\t{\n" +
+                "\t\tv: \"鐢靛瓙鐪嬫澘\",\n" +
+                "\t\ti: \"font icon-dianzikanban-fan\",\n" +
+                "\t\tp: \"\",\n" +
+                "\t\tc: [{\n" +
+                "\t\t\tv: \"瀹㈡埛鎺ュ緟\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"浠诲姟灞曠ず\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"璁惧鐘舵�佸強楗卞拰搴",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}]\n" +
+                "\t},\n" +
+                "\t{\n" +
+                "\t\tv: \"绯荤粺鍔熻兘\",\n" +
+                "\t\ti: \"el-icon-s-tools\",\n" +
+                "\t\tp: \"\",\n" +
+                "\t\tc: [{\n" +
+                "\t\t\tv: \"鏁版嵁瀛楀吀\",\n" +
+                "\t\t\ti: \"el-icon-s-tools\",\n" +
+                "\t\t\tu: \"enums\",\n" +
+                "\t\t\tp: \"selectEnumList\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"瑙掕壊绠$悊\",\n" +
+                "\t\t\ti: \"el-icon-s-tools\",\n" +
+                "\t\t\tu: \"role-manage\",\n" +
+                "\t\t\tp: \"selectRoleLists\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鐢ㄦ埛绠$悊\",\n" +
+                "\t\t\ti: \"el-icon-s-tools\",\n" +
+                "\t\t\tu: \"person-manage\",\n" +
+                "\t\t\tp: \"selectUserList\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"瀹㈡埛绠$悊\",\n" +
+                "\t\t\ti: \"el-icon-s-tools\",\n" +
+                "\t\t\tu: \"custom_manage\",\n" +
+                "\t\t\tp: \"selectCustomPageList\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"绯荤粺鏃ュ織\",\n" +
+                "\t\t\ti: \"el-icon-s-tools\",\n" +
+                "\t\t\tu: \"system-log\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"娑堟伅璇︽儏\",\n" +
+                "\t\t\ti: \"el-icon-s-tools\",\n" +
+                "\t\t\tu: \"notice-detail\",\n" +
+                "\t\t\tp: \"abcd\"\n" +
+                "\t\t}]\n" +
+                "\t},\n" +
+                "\t{\n" +
+                "\t\tv: \"4 閫氱敤瑕佹眰\",\n" +
+                "\t\ti: \"font icon-tongyongyaoqiu\",\n" +
+                "\t\tp: \"\",\n" +
+                "\t\tc: [{\n" +
+                "\t\t\t\tv: \"閫氱敤瑕佹眰\",\n" +
+                "\t\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\t\tu: \"\",\n" +
+                "\t\t\t\tg: \"4 閫氱敤瑕佹眰\",\n" +
+                "\t\t\t\tp: \"\"\n" +
+                "\t\t\t},\n" +
+                "\t\t\t{\n" +
+                "\t\t\t\tv: \"鍏鎬",\n" +
+                "\t\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\t\tu: \"\",\n" +
+                "\t\t\t\tg: \"4.1 鍏鎬",\n" +
+                "\t\t\t\tp: \"\"\n" +
+                "\t\t\t},\n" +
+                "\t\t\t{\n" +
+                "\t\t\t\tv: \"淇濆瘑鎬",\n" +
+                "\t\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\t\tu: \"\",\n" +
+                "\t\t\t\tg: \"4.2 淇濆瘑鎬",\n" +
+                "\t\t\t\tp: \"\"\n" +
+                "\t\t\t}\n" +
+                "\t\t]\n" +
+                "\t},\n" +
+                "\t{\n" +
+                "\t\tv: \"5 缁撴瀯瑕佹眰\",\n" +
+                "\t\ti: \"font icon-jiegouyaoqiu\",\n" +
+                "\t\tp: \"\",\n" +
+                "\t\tc: [{\n" +
+                "\t\t\tv: \"瀹為獙瀹ょ殑娉曞緥鍦颁綅\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"A瀹為獙瀹ょ殑娉曞緥鍦颁綅\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鍏ㄦ潈璐熻矗鐨勭鐞嗗眰\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"B鍏ㄦ潈璐熻矗鐨勭鐞嗗眰\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"瀹為獙瀹よ祫璐╘",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"a5-laboratory-qualifications\",\n" +
+                "\t\t\tg: \"C鑳藉姏鑼冨洿鍜岃祫璐╘",\n" +
+                "\t\t\tp: \"getCertificationDetail\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鑳藉姏鑼冨洿\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"a5-capacity-scope\",\n" +
+                "\t\t\tg: \"C鑳藉姏鑼冨洿鍜岃祫璐╘",\n" +
+                "\t\t\tp: \"selectItemParameterList selectTestObjectList\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鍦烘墍鎴栬鏂絓",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"a5-laboratory-management\",\n" +
+                "\t\t\tg: \"D鍦烘墍鎴栬鏂絓",\n" +
+                "\t\t\tp: \"selectItemParameter\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"缁勭粐鐩稿叧鏂囦欢\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"E缁勭粐鐩稿叧鏂囦欢\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"浜哄憳宀椾綅浠昏亴\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"F浜哄憳宀椾綅浠昏亴\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"娌熼�氬拰瀹h疮\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"G娌熼�氬拰瀹h疮\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}]\n" +
+                "\t}, {\n" +
+                "\t\tv: \"6 璧勬簮瑕佹眰\",\n" +
+                "\t\ti: \"font icon-ziyuanyaoqiu\",\n" +
+                "\t\tp: \"\",\n" +
+                "\t\tc: [{\n" +
+                "\t\t\tv: \"鎬诲垯\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.1 鎬诲垯\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"浜哄憳鎬昏\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"a6-personnel-overview\",\n" +
+                "\t\t\tg: \"6.2 浜哄憳\",\n" +
+                "\t\t\tp: \"selectPersonnelOverview\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"浜哄憳鏄庣粏\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"a6-personnel-detail\",\n" +
+                "\t\t\tg: \"6.2 浜哄憳\",\n" +
+                "\t\t\tp: \"selectDepartmentLim\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"浜哄憳鍩硅\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.2 浜哄憳\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"浜哄憳鐩戠潱\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.2 浜哄憳\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"宀椾綅鑱岃矗\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.2 浜哄憳\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"浜哄憳鍩烘湰淇℃伅\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.2 浜哄憳\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"宸ヤ綔灞ュ巻\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.2 浜哄憳\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"濂栨儵璁板綍\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.2 浜哄憳\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鍩硅璁板綍\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.2 浜哄憳\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鐩戠潱璁板綍\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.2 浜哄憳\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"浠昏亴鎺堟潈璁板綍\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.2 浜哄憳\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"浜哄憳鑳藉姏鐩戞帶璁板綍\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.2 浜哄憳\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"娌熼�氳褰昞",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.2 浜哄憳\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"澶栨潵浜哄憳绠$悊\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"a6-external-personnel-management\",\n" +
+                "\t\t\tg: \"6.3 璁炬柦鍜岀幆澧冩潯浠禱",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"瀹為獙瀹よ鏂藉満鎵�淇℃伅\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.3 璁炬柦鍜岀幆澧冩潯浠禱",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"璁炬柦鍜岀幆澧冩潯浠惰姹俓",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.3 璁炬柦鍜岀幆澧冩潯浠禱",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鐜鏉′欢寮曠敤\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.3 璁炬柦鍜岀幆澧冩潯浠禱",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"瀹夊叏鍖轰唬琛ㄦ鏌",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.3 璁炬柦鍜岀幆澧冩潯浠禱",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"瀹夊叏鍐呭姟\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.3 璁炬柦鍜岀幆澧冩潯浠禱",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"搴熺墿澶勭悊浜ゆ帴璁板綍\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"a6-waste-handover\",\n" +
+                "\t\t\tg: \"6.3 璁炬柦鍜岀幆澧冩潯浠禱",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"璁惧鎬昏\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"a6-device-overview\",\n" +
+                "\t\t\tg: \"6.4 璁惧\",\n" +
+                "\t\t\tp: \"selectDeviceParameter\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"璁惧宸ュ叿鏄庣粏\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"a6-device-management\",\n" +
+                "\t\t\tg: \"6.4 璁惧\",\n" +
+                "\t\t\tp: \"selectDeviceParameter\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"璧勬簮棰勫畾\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.4 璁惧\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"浣滀笟鎸囧涔",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.4 璁惧\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"璁惧杩愯鎬昏\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.4 璁惧\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"璁惧妗f\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.4 璁惧\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"璁惧楠屾敹\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.4 璁惧\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"璁惧鏍″噯\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.4 璁惧\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"璁惧鏍告煡\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.4 璁惧\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"璁惧缁存姢\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.4 璁惧\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"璁惧鍊熺敤\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.4 璁惧\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"璁惧鏁呴殰\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.4 璁惧\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"浣跨敤璁板綍\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.4 璁惧\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"璁惧鍋滅敤/鍚敤\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.4 璁惧\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"閲忓�兼函婧愯鍒抃",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.5 璁¢噺婧簮鎬",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鏍囧噯鐗╄川娓呭崟\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"a6-standard-material-list\",\n" +
+                "\t\t\tg: \"6.5 璁¢噺婧簮鎬",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鏍囧噯鐗╄川楠屾敹\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.5 璁¢噺婧簮鎬",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鏍囧噯鐗╄川棰嗙敤\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"a6-standard-material-requisition\",\n" +
+                "\t\t\tg: \"6.5 璁¢噺婧簮鎬",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"杩囨湡鏍囨牱澶勭疆\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.5 璁¢噺婧簮鎬",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鏈嶅姟鍜屼緵搴斿搧閲囪喘\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.6 澶栭儴鎻愪緵鐨勪骇鍝佸拰鏈嶅姟\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t},{\n" +
+                "\t\t\tv: \"渚涘簲鍟嗙鐞哱",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"6.6 澶栭儴鎻愪緵鐨勪骇鍝佸拰鏈嶅姟\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}]\n" +
+                "\t},\n" +
+                "\t{\n" +
+                "\t\tv: \"7 杩囩▼瑕佹眰\",\n" +
+                "\t\ti: \"font icon-guochengyaoqiu\",\n" +
+                "\t\tp: \"\",\n" +
+                "\t\tc: [{\n" +
+                "\t\t\tv: \"妫�楠屽鎵樺崟\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"7.1 瑕佹眰銆佹爣涔﹀拰鍚堝悓璇勫\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鍚堝悓璇勫\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"7.1 瑕佹眰銆佹爣涔﹀拰鍚堝悓璇勫\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"瀹為獙瀹ょ殑妫�娴嬭兘鍔涙。妗圽",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"a7-standard-method\",\n" +
+                "\t\t\tg: \"7.2 鏂规硶鐨勯�夋嫨銆侀獙璇佸拰纭\",\n" +
+                "\t\t\tp: \"selectStandardMethodList\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鏍囧噯鏌ユ柊\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"7.2 鏂规硶鐨勯�夋嫨銆侀獙璇佸拰纭\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鏍囧噯鏂规硶鐨勫彉鏇碶",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"7.2 鏂规硶鐨勯�夋嫨銆侀獙璇佸拰纭\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鏂规硶楠岃瘉\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"7.2 鏂规硶鐨勯�夋嫨銆侀獙璇佸拰纭\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鎶芥牱\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"7.3 鎶芥牱\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃甛",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"7.4 妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃甛",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鎶�鏈褰昞",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"7.5 鎶�鏈褰昞",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"娴嬮噺涓嶇‘瀹氬害鐨勮瘎瀹歕",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"7.6 娴嬮噺涓嶇‘瀹氬害鐨勮瘎瀹歕",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"纭繚缁撴灉鏈夋晥鎬",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"7.7 纭繚缁撴灉鏈夋晥鎬",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鎶ュ憡缁撴灉\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"7.8 鎶ュ憡缁撴灉\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鎶曡瘔璇︽儏\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"7.9 鎶曡瘔\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鎶曡瘔鎯呭喌姹囨�昏〃\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"7.9 鎶曡瘔\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"涓嶇鍚堥」\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"7.10 涓嶇鍚堝伐浣淺",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"涓嶇鍚堥」鐨勫垎甯僜",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"7.10 涓嶇鍚堝伐浣淺",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鏁版嵁鎺у埗鍜屼俊鎭鐞哱",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"7.11 鏁版嵁鎺у埗鍜屼俊鎭鐞哱",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}]\n" +
+                "\t},\n" +
+                "\t{\n" +
+                "\t\tv: \"8 浣撶郴绠$悊瑕佹眰\",\n" +
+                "\t\ti: \"font icon-guanlitixiyaoqiu\",\n" +
+                "\t\tp: \"\",\n" +
+                "\t\tc: [{\n" +
+                "\t\t\tv: \"鏂瑰紡\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"8.1 鏂瑰紡\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"绠$悊浣撶郴鏂囦欢\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"8.2 绠$悊浣撶郴鏂囦欢\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鏂囦欢娓呭崟\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"8.3 绠$悊浣撶郴鏂囦欢鐨勬帶鍒禱",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鏂囦欢鍙楁帶\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"8.3 绠$悊浣撶郴鏂囦欢鐨勬帶鍒禱",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鏂囦欢鍙戞斁鍥炴敹\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"8.3 绠$悊浣撶郴鏂囦欢鐨勬帶鍒禱",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鏂囦欢鍙樻洿\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"8.3 绠$悊浣撶郴鏂囦欢鐨勬帶鍒禱",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鏂囦欢浣滃簾\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"8.3 绠$悊浣撶郴鏂囦欢鐨勬帶鍒禱",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"璁板綍鐨勬帶鍒禱",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"8.4 璁板綍鐨勬帶鍒禱",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"搴斿椋庨櫓鍜屾満閬囩殑鎺柦\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"8.5 搴斿椋庨櫓鍜屾満閬囩殑鎺柦\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"瀹㈡埛鍩烘湰淇℃伅绠$悊\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"8.6 鏀硅繘\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"瀹㈡埛婊℃剰搴",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"8.6 鏀硅繘\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"绾犳鎺柦\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"8.7 绾犳鎺柦\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"鍐呭绠$悊\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"8.8 鍐呭绠$悊\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}, {\n" +
+                "\t\t\tv: \"绠$悊璇勫\",\n" +
+                "\t\t\ti: \"font icon-erjidaohang\",\n" +
+                "\t\t\tu: \"\",\n" +
+                "\t\t\tg: \"8.9 绠$悊璇勫\",\n" +
+                "\t\t\tp: \"\"\n" +
+                "\t\t}]\n" +
+                "\t}\n" +
+                "]";
+        List<ADto> aDtos = JSONArray.parseArray(menu, ADto.class);
+        List<BDto> bDtos = aDtos.get(9).getC();
+        for (String s : name) {
+            BDto bDto = new BDto();
+            bDto.setV(s);
+            bDto.setI("font icon-erjidaohang");
+            bDto.setU("a6-device-overview");
+            bDto.setG("6.4 璁惧");
+            bDto.setP("selectDeviceParameter");
+            bDtos.add(bDto);
+        }
+        for (String s : collect) {
+            BDto bDto = new BDto();
+            bDto.setV(s);
+            bDto.setI("font icon-erjidaohang");
+            bDto.setU("a6-personnel-overview");
+            bDto.setG("6.2 浜哄憳");
+            bDto.setP("selectPersonnelOverview");
+            bDtos.add(bDto);
+        }
+
+        return aDtos;
+    }
+
+    @Override
+    public List<Map<String, Object>> treeDevice(String deviceName) {
+        List<Map<String, Object>>  listMap = deviceMapper.treeDevice(deviceName);
+        return listMap;
+    }
+
+    @Override
+    public Result<?> determineWhetherToCollectData(String managementNumber, HttpServletRequest request) {
+        String ip = DataAcquisition.getIp(request);
+        List<Device> device = baseMapper.selectList(Wrappers.<Device>lambdaQuery()
+                .eq(Device::getIp, ip));
+        if (ObjectUtils.isEmpty(device)) {
+            return Result.success(false);
+        }
+        if (ObjectUtils.isEmpty(device.get(0).getFileType()) || ObjectUtils.isEmpty(device.get(0).getCollectUrl())) {
+            return Result.success(false);
+        } else {
+            return Result.success(true);
+        }
+    }
+    @Override
+    public void exportData(DeviceDto deviceDto, HttpServletResponse response){
+         //鏌ヨ瀵煎嚭鐨勮垂鐢ㄧ粺璁℃暟鎹�
+//        String dates = deviceDto.getDates();
+//        String[] split = dates.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(",");
+//       deviceDto.setDates(null);
+//        List<CostStatisticsDto> deviceDtos = deviceMapper.selectList(QueryWrappers.queryWrappers(deviceDto).ge("create_time", split[0]).le("create_time", split[1] + " 23:59:59"));
+//        deviceDtos = deviceDtos.stream().map(dto -> {
+//            Set<String> uniqueTags = new HashSet<>();
+//            if (dto.getInspectionItem().contains(",")) {
+//                for (String s : dto.getInspectionItem().split(",")) {
+//                    uniqueTags.add(s.split("@")[0]);
+//                }
+//            } else {
+//                uniqueTags.add(dto.getInspectionItem().split("@")[0]);
+//            }
+//            dto.setInspectionItem(uniqueTags.toString());
+//            return dto;
+//        }).collect(Collectors.toList());
+//
+//        response.setContentType("application/vnd.ms-excel");
+//        response.setCharacterEncoding("UTF-8");
+//        // 杩欓噷URLEncoder.encode鍙互闃叉涓枃涔辩爜 褰撶劧鍜宔asyexcel娌℃湁鍏崇郴
+//        String fileName = URLEncoder.encode("鏍峰搧璐圭敤缁熻瀵煎嚭", "UTF-8");
+//        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+//        Map<String, List<CostStatisticsDto>> groupByCompany =
+//                deviceDtos.stream().filter(e -> StrUtil.isNotEmpty(e.getCompany()))
+//                        .collect(Collectors.groupingBy(CostStatisticsDto::getCompany));
+//        try {
+//            // 鏂板缓ExcelWriter
+//            // 鏂板缓ExcelWriter
+//            ExcelWriter excelWriter =
+//                    EasyExcel.write(response.getOutputStream())
+//                            .registerWriteHandler(new SimpleColumnWidthStyleStrategy(25))
+//                            .build();
+//            for (Map.Entry<String, List<CostStatisticsDto>> companyDataEntry : groupByCompany.entrySet()) {
+//                String sheetName = companyDataEntry.getKey();
+//                List<CostStatisticsDto> dataList = companyDataEntry.getValue();
+//                WriteSheet mainSheet = EasyExcel.writerSheet(sheetName)
+//                        .head(CostStatisticsDto.class)
+//                        .registerWriteHandler(new SimpleColumnWidthStyleStrategy(25))
+//                        .build();
+//                excelWriter.write(dataList, mainSheet);
+//            }
+//            // 鍏抽棴娴�
+//            excelWriter.finish();
+//        } catch (IOException e) {
+//            throw new RuntimeException("瀵煎嚭澶辫触");
+//        }
+    }
+
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/impl/DocumentServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/DocumentServiceImpl.java
new file mode 100644
index 0000000..7136df7
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/DocumentServiceImpl.java
@@ -0,0 +1,11 @@
+package com.ruoyi.requier.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.requier.mapper.DocumentDao;
+import com.ruoyi.requier.pojo.Document;
+import com.ruoyi.requier.service.DocumentService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class DocumentServiceImpl extends ServiceImpl<DocumentDao, Document> implements DocumentService {
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/impl/IncidentAcceptanceCheckServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/IncidentAcceptanceCheckServiceImpl.java
new file mode 100644
index 0000000..d01ccd9
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/IncidentAcceptanceCheckServiceImpl.java
@@ -0,0 +1,11 @@
+package com.ruoyi.requier.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.requier.mapper.IncidentAcceptanceCheckMapper;
+import com.ruoyi.requier.pojo.IncidentAcceptanceCheck;
+import com.ruoyi.requier.service.IncidentAcceptanceCheckService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class IncidentAcceptanceCheckServiceImpl extends ServiceImpl<IncidentAcceptanceCheckMapper, IncidentAcceptanceCheck> implements IncidentAcceptanceCheckService {
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/impl/IncidentFileServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/IncidentFileServiceImpl.java
new file mode 100644
index 0000000..fbbe829
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/IncidentFileServiceImpl.java
@@ -0,0 +1,11 @@
+package com.ruoyi.requier.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.requier.mapper.IncidentFileMapper;
+import com.ruoyi.requier.pojo.IncidentFile;
+import com.ruoyi.requier.service.IncidentFileService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class IncidentFileServiceImpl extends ServiceImpl<IncidentFileMapper, IncidentFile> implements IncidentFileService {
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/impl/IncidentInstallServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/IncidentInstallServiceImpl.java
new file mode 100644
index 0000000..0e6ac67
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/IncidentInstallServiceImpl.java
@@ -0,0 +1,11 @@
+package com.ruoyi.requier.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.requier.mapper.IncidentInstallMapper;
+import com.ruoyi.requier.pojo.IncidentInstall;
+import com.ruoyi.requier.service.IncidentInstallService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class IncidentInstallServiceImpl extends ServiceImpl<IncidentInstallMapper, IncidentInstall> implements IncidentInstallService {
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/impl/IncidentReportServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/IncidentReportServiceImpl.java
new file mode 100644
index 0000000..48eda69
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/IncidentReportServiceImpl.java
@@ -0,0 +1,116 @@
+package com.ruoyi.requier.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.requier.dto.IncidentReportAddDto;
+import com.ruoyi.requier.excel.IncidentReportExport;
+import com.ruoyi.requier.mapper.IncidentReportMapper;
+import com.ruoyi.requier.pojo.*;
+import com.ruoyi.requier.service.*;
+import com.ruoyi.system.mapper.UserMapper;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * <p>
+ * 璁惧楠屾敹娣诲姞楠屾敹瀛楁琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-09-19 03:54:49
+ */
+@Service
+@AllArgsConstructor
+@Transactional(rollbackFor = Exception.class)
+public class IncidentReportServiceImpl extends ServiceImpl<IncidentReportMapper, IncidentReport> implements IncidentReportService {
+    @Autowired
+    private UserMapper userMapper;
+    private IncidentSparePartsService incidentSparePartsService;
+    private IncidentFileService incidentFileService;
+    private IncidentInstallService incidentInstallService;
+    private IncidentAcceptanceCheckService incidentAcceptanceCheckService;
+
+    private final NumberGenerator<IncidentReport> numberGenerator;
+
+    @Override
+    public void saveIncidentReportData(IncidentReportAddDto incidentReportAddDto) {
+        if (ObjectUtils.isEmpty(incidentReportAddDto.getProcessNumber())) {
+            String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
+            String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
+            String processNumber = numberGenerator.generateNumberWithPrefix(3, "DG-TC-07FM " + month + "-" + year + month, IncidentReport::getProcessNumber);
+            incidentReportAddDto.setProcessNumber(processNumber);
+        }
+        this.saveOrUpdate(incidentReportAddDto);
+        // 澶囦欢纭List
+        if (ObjectUtils.isNotEmpty(incidentReportAddDto.getSparePartsConfirmationList())) {
+            incidentReportAddDto.getSparePartsConfirmationList().forEach(i -> i.setIncidentId(incidentReportAddDto.getId()));
+            incidentSparePartsService.saveOrUpdateBatch(incidentReportAddDto.getSparePartsConfirmationList());
+        }
+        // 鏂囦欢纭List
+        if (ObjectUtils.isNotEmpty(incidentReportAddDto.getFileClassConfirmationList())) {
+            incidentReportAddDto.getFileClassConfirmationList().forEach(i -> i.setIncidentId(incidentReportAddDto.getId()));
+            incidentFileService.saveOrUpdateBatch(incidentReportAddDto.getFileClassConfirmationList());
+        }
+        // 瀹夎楠屾敹璁板綍
+        if (ObjectUtils.isNotEmpty(incidentReportAddDto.getInstallationAcceptanceRecordList())) {
+            incidentReportAddDto.getInstallationAcceptanceRecordList().forEach(i -> i.setIncidentId(incidentReportAddDto.getId()));
+            incidentInstallService.saveOrUpdateBatch(incidentReportAddDto.getInstallationAcceptanceRecordList());
+        }
+        // 楠屾敹鏍告煡璁板綍
+        if (ObjectUtils.isNotEmpty(incidentReportAddDto.getAcceptanceCheckRecordList())) {
+            incidentReportAddDto.getAcceptanceCheckRecordList().forEach(i -> i.setIncidentId(incidentReportAddDto.getId()));
+            incidentAcceptanceCheckService.saveOrUpdateBatch(incidentReportAddDto.getAcceptanceCheckRecordList());
+        }
+    }
+
+    @Override
+    public IPage<IncidentReportAddDto> getByDeviceId(Integer deviceId, Page page, String processNumber) {
+        return baseMapper.getByDeviceId(page, deviceId, processNumber);
+    }
+
+    @Override
+    public void deleteIncidentReport(Integer id) {
+        baseMapper.deleteById(id);
+        incidentSparePartsService.remove(Wrappers.<IncidentSpareParts>lambdaQuery().eq(IncidentSpareParts::getIncidentId, id));
+        incidentFileService.remove(Wrappers.<IncidentFile>lambdaQuery().eq(IncidentFile::getIncidentId, id));
+        incidentInstallService.remove(Wrappers.<IncidentInstall>lambdaQuery().eq(IncidentInstall::getIncidentId, id));
+        incidentAcceptanceCheckService.remove(Wrappers.<IncidentAcceptanceCheck>lambdaQuery().eq(IncidentAcceptanceCheck::getIncidentId, id));
+    }
+
+    @Override
+    public IncidentReportAddDto getShowIncidentReport(Integer id) {
+        return baseMapper.getShowIncidentReport(id);
+    }
+
+    @Override
+    public void deleteIncidentReportAll(Integer sparePartsId, Integer fileId, Integer installId, Integer acceptanceCheckId) {
+        if (ObjectUtils.isNotEmpty(sparePartsId)) {
+            incidentSparePartsService.removeById(sparePartsId);
+        }
+        if (ObjectUtils.isNotEmpty(fileId)) {
+            incidentFileService.removeById(fileId);
+        }
+        if (ObjectUtils.isNotEmpty(installId)) {
+            incidentInstallService.removeById(installId);
+        }
+        if (ObjectUtils.isNotEmpty(acceptanceCheckId)) {
+            incidentAcceptanceCheckService.removeById(acceptanceCheckId);
+        }
+    }
+
+    @Override
+    public List<IncidentReportExport> incidentReportExport(Integer deviceId) {
+        return baseMapper.incidentReportExport(deviceId);
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/impl/IncidentSparePartsServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/IncidentSparePartsServiceImpl.java
new file mode 100644
index 0000000..81ef727
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/IncidentSparePartsServiceImpl.java
@@ -0,0 +1,11 @@
+package com.ruoyi.requier.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.requier.mapper.IncidentSparePartsMapper;
+import com.ruoyi.requier.pojo.IncidentSpareParts;
+import com.ruoyi.requier.service.IncidentSparePartsService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class IncidentSparePartsServiceImpl extends ServiceImpl<IncidentSparePartsMapper, IncidentSpareParts> implements IncidentSparePartsService {
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/impl/InformationNotificationServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/InformationNotificationServiceImpl.java
new file mode 100644
index 0000000..e239dbc
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/InformationNotificationServiceImpl.java
@@ -0,0 +1,95 @@
+package com.ruoyi.requier.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.requier.dto.InformationNotificationDto;
+import com.ruoyi.requier.mapper.InformationNotificationMapper;
+import com.ruoyi.requier.pojo.InformationNotification;
+import com.ruoyi.requier.service.InformationNotificationService;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 娑堟伅閫氱煡 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-04-23 02:14:30
+ */
+@Service
+public class InformationNotificationServiceImpl extends ServiceImpl<InformationNotificationMapper, InformationNotification> implements InformationNotificationService {
+
+    @Override
+    public IPage<InformationNotificationDto> getPage(Page page, String messageType) {
+        return baseMapper.getPage(page, messageType, SecurityUtils.getUserId().intValue());
+    }
+
+    @Override
+    public void markAllInformationReadOrDeleteAllReadMessages(Boolean isMarkAllInformationRead) {
+        if (isMarkAllInformationRead) {
+            baseMapper.update(new InformationNotification(), Wrappers.<InformationNotification>lambdaUpdate()
+                    .set(InformationNotification::getViewStatus, true)
+                    .eq(InformationNotification::getConsigneeId, SecurityUtils.getUserId()));
+        } else {
+            baseMapper.delete(Wrappers.<InformationNotification>lambdaUpdate()
+                    .eq(InformationNotification::getConsigneeId, SecurityUtils.getUserId())
+                    .eq(InformationNotification::getViewStatus, true));
+        }
+    }
+
+    @Override
+    public Boolean checkForUnreadData() {
+        Map<String, Integer> map1 = null;
+        try {
+            List<InformationNotification> informationNotifications = baseMapper.selectList(
+                    Wrappers.<InformationNotification>lambdaQuery()
+                            .eq(InformationNotification::getConsigneeId, SecurityUtils.getUserId())
+                            .eq(InformationNotification::getViewStatus, false)
+                            .last("limit 1"));
+            return !informationNotifications.isEmpty();
+        } catch (Exception e) {
+        }
+        return false;
+    }
+
+    @Override
+    public void triggerModificationStatusToRead(Integer id) {
+        baseMapper.update(new InformationNotification(), Wrappers.<InformationNotification>lambdaUpdate()
+                .eq(InformationNotification::getId, id)
+                .set(InformationNotification::getViewStatus, true));
+    }
+
+    @Override
+    public int addInformationNotification(InformationNotification informationNotification) {
+        return baseMapper.insert(informationNotification);
+    }
+
+    @Override
+    public Map<String, Object> getNumberFourTypesMessagesHomePage() {
+        Map<String, Object> map = new HashMap<>();
+        Long totalNumberOfMessages = baseMapper.selectCount(Wrappers.<InformationNotification>lambdaQuery()
+                .eq(InformationNotification::getConsigneeId, SecurityUtils.getUserId()));
+        Long totalNumberOfReadMessages = baseMapper.selectCount(Wrappers.<InformationNotification>lambdaQuery()
+                .eq(InformationNotification::getConsigneeId, SecurityUtils.getUserId())
+                .eq(InformationNotification::getViewStatus, true));
+        LocalDate today = LocalDate.now();
+        LocalDate sevenDaysAgo = today.minusDays(7);
+        Long totalNumberOfMessagesInThePastSevenDays = baseMapper.selectCount(Wrappers.<InformationNotification>lambdaQuery()
+                .eq(InformationNotification::getConsigneeId, SecurityUtils.getUserId())
+                .between(InformationNotification::getCreateTime, today, sevenDaysAgo));
+        long remainingToDo = totalNumberOfMessages - totalNumberOfReadMessages;
+        map.put("totalNumberOfMessages", totalNumberOfMessages);
+        map.put("remainingToDo", remainingToDo);
+        map.put("totalNumberOfReadMessages", totalNumberOfReadMessages);
+        map.put("totalNumberOfMessagesInThePastSevenDays", totalNumberOfMessagesInThePastSevenDays);
+        return map;
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/impl/InsOrderPlanServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/InsOrderPlanServiceImpl.java
new file mode 100644
index 0000000..5430bc1
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/InsOrderPlanServiceImpl.java
@@ -0,0 +1,2784 @@
+package com.ruoyi.requier.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.lang.UUID;
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.metadata.style.WriteCellStyle;
+import com.alibaba.excel.write.metadata.style.WriteFont;
+import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.deepoove.poi.data.*;
+import com.deepoove.poi.data.style.Style;
+import com.deepoove.poi.util.TableTools;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ruoyi.basic.mapper.StandardProductListMapper;
+import com.ruoyi.basic.service.StandardTemplateService;
+import com.ruoyi.basic.vo.StandardProductVO;
+import com.ruoyi.common.constant.ExchangeConstants;
+import com.ruoyi.common.constant.RouterKeyConstants;
+import com.ruoyi.common.core.domain.entity.Custom;
+import com.ruoyi.common.core.domain.entity.SysDictData;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.DictUtils;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.framework.util.MatrixToImageWriter;
+import com.ruoyi.framework.util.RedisUtil;
+import com.ruoyi.inspect.dto.*;
+import com.ruoyi.inspect.mapper.*;
+import com.ruoyi.inspect.pojo.*;
+import com.ruoyi.inspect.service.InsBushingService;
+import com.ruoyi.inspect.service.InsOrderService;
+import com.ruoyi.inspect.service.InsUnPassService;
+import com.ruoyi.inspect.service.impl.InsOrderServiceImpl;
+import com.ruoyi.framework.util.SheetWriteHandlerUtil;
+import com.ruoyi.inspect.vo.*;
+import com.ruoyi.performance.mapper.AuxiliaryOutputWorkingHoursMapper;
+import com.ruoyi.performance.mapper.PerformanceShiftMapper;
+import com.ruoyi.performance.mapper.ShiftTimeMapper;
+import com.ruoyi.requier.handler.*;
+import com.ruoyi.requier.pojo.InformationNotification;
+import com.ruoyi.requier.service.InformationNotificationService;
+import com.ruoyi.requier.service.InsOrderPlanService;
+import com.ruoyi.system.mapper.CustomMapper;
+import com.ruoyi.system.mapper.UserMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.util.Strings;
+import org.apache.poi.openxml4j.util.ZipSecureFile;
+import org.apache.poi.ss.usermodel.FillPatternType;
+import org.apache.poi.ss.usermodel.IndexedColors;
+import org.apache.poi.xwpf.usermodel.*;
+import org.springframework.amqp.rabbit.core.RabbitTemplate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.URLEncoder;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAdjusters;
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.locks.ReentrantLock;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+
+/**
+ * 妫�楠屼换鍔�-涓氬姟瀹炵幇灞�
+ */
+@Service
+@Slf4j
+public class InsOrderPlanServiceImpl extends ServiceImpl<InsOrderMapper, InsOrder> implements InsOrderPlanService {
+
+    // 鎶ュ憡鎵爜璺緞
+    @Value("${phoneQrCode}")
+    private String phoneQrCode;
+
+    @Resource
+    private InsReportServiceImpl insReportService;
+    @Resource
+    private InsSampleMapper insSampleMapper;
+    @Resource
+    private InsSampleUserMapper insSampleUserMapper;
+    @Resource
+    private InsOrderMapper insOrderMapper;
+    @Resource
+    private InsOrderService insOrderService;
+
+    @Resource
+    private InsOrderServiceImpl insOrderServiceImpl;
+
+    @Resource
+    private StandardTemplateService standardTemplateService;
+    @Resource
+    private InsOrderStateMapper insOrderStateMapper;
+    @Resource
+    private InsProductMapper insProductMapper;
+    @Resource
+    private ShiftTimeMapper shiftTimeMapper;
+    @Resource
+    private PerformanceShiftMapper performanceShiftMapper;
+
+    @Resource
+    private StandardProductListMapper standardProductListMapper;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    @Value("${twoCode}")
+    private String twoCode;
+
+    @Resource
+    private InsReportMapper insReportMapper;
+
+    @Resource
+    private InsProductResultMapper insProductResultMapper;
+
+    @Resource
+    private InsProductUserMapper insProductUserMapper;
+
+    @Resource
+    private InsUnPassService insUnPassService;
+
+    @Resource
+    AuxiliaryOutputWorkingHoursMapper auxiliaryOutputWorkingHoursMapper;
+
+    @Resource
+    private InformationNotificationService informationNotificationService;
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Resource
+    private CustomMapper customMapper;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Resource
+    private InsBushingService insBushingService;
+
+    @Resource
+    private InsBushingMapper insBushingMapper;
+
+    @Resource
+    private InsFiberMapper insFiberMapper;
+
+    @Resource
+    private InsFibersMapper insFibersMapper;
+
+    @Resource
+    private InsOrderFileMapper insOrderFileMapper;
+
+    @Resource
+    private InsReportApproveConfigMapper insReportApproveConfigMapper;
+
+    @Autowired
+    private RabbitTemplate rabbitTemplate;
+
+
+
+    private ReentrantLock lock = new ReentrantLock();
+
+    @Resource
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+
+    @Override
+    public void exportInsOrderPlanResult(Map<String, Object> data, HttpServletResponse response) {
+        List<Map<String,Object>> dataList = new ArrayList<>();
+        ObjectMapper objectMapper = new ObjectMapper();
+        try {
+            Object o = getTabHeader(data.get("sonLaboratory").toString(), data.get("samples").toString()).get("tableHeader");// 鑾峰彇鍔ㄦ�佽〃澶�
+            List<Map<String, Object>>  tableHeader = objectMapper.readValue(JSONUtil.toJsonStr(o), new TypeReference<List<Map<String, Object>>>() {
+            });// 琛ㄥご鏁版嵁
+            Map<String, Object> table = objectMapper.readValue(JSONUtil.toJsonStr(data.get("trendsTable")), new TypeReference<Map<String, Object>>() {
+            });
+            List<Map<String, Object>> trendsTable = getInsOrderPlanList(table); // 琛ㄦ牸鏁版嵁
+            for (Map<String, Object> trend : trendsTable) {
+                Map<String, Object> addMap = new HashMap<>();
+                addMap.put("濮旀墭鍗曞彿", trend.get("entrustCode"));
+                addMap.put("鏍峰搧缂栧彿", trend.get("sampleCode"));
+                addMap.put("绠¤壊鏍�", trend.get("bushing"));
+                addMap.put("鍏夌氦甯﹁壊鏍�", trend.get("fibers"));
+                addMap.put("鍏夌氦鑹叉爣", trend.get("fiber"));
+                addMap.put("妫�楠岄」鐩垎绫�", trend.get("inspectionItem"));
+                addMap.put("鍒涘缓浜�", trend.get("userName"));
+                addMap.put("妫�娴嬫椂闂�", trend.get("insTime"));
+                addMap.put("涓嬪彂鏃堕棿", trend.get("sendTime"));
+                for (Map<String, Object> map : tableHeader) {
+                    if(Objects.isNull(trend.get(map.get("prop").toString())) || Objects.equals(trend.get(map.get("prop").toString()),"null")) {
+                        addMap.put(map.get("label").toString(), "");
+                    }else {
+                        addMap.put(map.get("label").toString(), trend.get(map.get("prop").toString()));
+                    }
+                }
+                dataList.add(addMap);
+            }
+            List<List<String>> head = head(tableHeader);
+            response.setContentType("application/vnd.ms-excel");
+            response.setCharacterEncoding("UTF-8");
+            String fileName = URLEncoder.encode("妫�楠岀粨鏋�", "UTF-8");
+            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+            HorizontalCellStyleStrategy horizontalCellStyleStrategy =
+                    new HorizontalCellStyleStrategy(getHeadStyle((short) 12),new WriteCellStyle());
+
+            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
+                    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
+                    .registerWriteHandler(new SheetWriteHandlerUtil(data.get("samples").toString(),head.size()))
+                    .useDefaultStyle(true).relativeHeadRowIndex(1)
+                    .registerWriteHandler(horizontalCellStyleStrategy)
+                    .build();
+            WriteSheet mainSheet = EasyExcel.writerSheet("Sheet0").head(head).build();
+            excelWriter.write(dataList(head,dataList), mainSheet);
+            // 鍏抽棴娴�
+            excelWriter.finish();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 鍔ㄦ�佽〃澶�
+     * @param tableHeader
+     * @return
+     */
+    private List<List<String>> head(List<Map<String, Object>>  tableHeader) {
+        List<List<String>> list = new ArrayList<>();
+        List<String> head0 = new ArrayList<>();
+        head0.add("濮旀墭鍗曞彿");
+        List<String> head1 = new ArrayList<>();
+        head1.add("鏍峰搧缂栧彿");
+        List<String> head2 = new ArrayList<>();
+        head2.add("妫�楠岄」鐩垎绫�");
+        List<String> head3 = new ArrayList<>();
+        head3.add("鍒涘缓浜�");
+        List<String> head4 = new ArrayList<>();
+        head4.add("妫�娴嬫椂闂�");
+        List<String> head5 = new ArrayList<>();
+        head5.add("涓嬪彂鏃堕棿");
+        List<String> head6 = new ArrayList<>();
+        head6.add("绠¤壊鏍�");
+        List<String> head7 = new ArrayList<>();
+        head7.add("鍏夌氦甯﹁壊鏍�");
+        List<String> head8 = new ArrayList<>();
+        head8.add("鍏夌氦鑹叉爣");
+
+        list.add(head0);
+        list.add(head1);
+        list.add(head6);
+        list.add(head7);
+        list.add(head8);
+        list.add(head2);
+        list.add(head3);
+        list.add(head4);
+        list.add(head5);
+        for (Map<String, Object> map : tableHeader) {
+            List<String> head = new ArrayList<>();
+            head.add(map.get("label").toString());
+            list.add(head);
+        }
+        return list.stream().distinct().collect(Collectors.toList());
+    }
+
+    /**
+     * excel瀵煎嚭鏁版嵁
+     * @param head
+     * @param dataList
+     * @return
+     */
+    private List<List<Object>> dataList(List<List<String>> head,List<Map<String,Object>> dataList) {
+        List<List<Object>> list = new ArrayList<>();
+        for(Map<String, Object> map : dataList) {
+            List<Object> addList = new ArrayList<>();
+            for(List<String> k : head) {
+                if(map.containsKey(k.get(0))) {
+                    addList.add(map.get(k.get(0)));
+                }
+            }
+            list.add(addList);
+        }
+        return list;
+    }
+
+    /**
+     * 澶寸殑绛栫暐
+     * @return
+     */
+    public  WriteCellStyle getHeadStyle(Short size){
+        // 澶寸殑绛栫暐
+        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
+        // 鑳屾櫙棰滆壊
+        headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
+        headWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
+        // 瀛椾綋
+        WriteFont headWriteFont = new WriteFont();
+        headWriteFont.setFontName("榛戜綋");//璁剧疆瀛椾綋鍚嶅瓧
+        headWriteFont.setFontHeightInPoints(size);//璁剧疆瀛椾綋澶у皬
+        headWriteFont.setBold(true);//瀛椾綋鍔犵矖
+        headWriteCellStyle.setWriteFont(headWriteFont); //鍦ㄦ牱寮忕敤搴旂敤璁剧疆鐨勫瓧浣�;
+
+        return headWriteCellStyle;
+    }
+    @Override
+    public List<Map<String, Object>> getInsOrderPlanList(Map<String,Object> data) {
+        String sampleType = data.get("sampleType").toString();
+        String sonLaboratory = data.get("sonLaboratory").toString();
+        String entrustCode = data.get("entrustCode").toString();
+        Integer createUser = null;
+        String name = "";
+        if(StringUtils.isNotBlank(data.get("createUser").toString())) {
+             createUser = Integer.parseInt(data.get("createUser").toString());
+             name = userMapper.selectById(createUser).getName();
+        }
+        String sampleCode = data.get("sampleCode").toString();
+        String startTime = "";
+        String endTime = "";
+        List<Map<String, Object>> maps = new ArrayList<>();
+        ObjectMapper objectMapper = new ObjectMapper();
+        try {
+            if(StringUtils.isNotBlank(data.get("insTime").toString()) && !Objects.isNull(data.get("insTime"))) {
+                List insTime = objectMapper.readValue(JSONUtil.toJsonStr(data.get("insTime")), List.class);
+                startTime = insTime.get(0).toString();
+                endTime = insTime.get(1).toString();
+            }
+            // 琛ㄥご淇℃伅
+            List<Map<String, Object>> headerS = objectMapper.readValue(JSONUtil.toJsonStr(data.get("headerS")), new TypeReference<List<Map<String, Object>>>() {
+            });
+            // 鍒ゆ柇鏄惁鏄俯搴﹀惊鐜�
+            if(sampleType.equals("娓╁害寰幆")) {
+                List<ExportInsProductVO> insOrderTemList = insOrderMapper.getInsOrderTemList(entrustCode, sampleCode, startTime, endTime,name);
+                List<TemperatureCycling> temList = insOrderServiceImpl.getTemList(insOrderTemList);
+                for (TemperatureCycling map : temList) {
+                    Map<String, Object> resultMap = new HashMap<>();
+                    resultMap.put("entrustCode", map.getEntrustCode()); //濮旀墭鍗曞彿
+                    resultMap.put("sampleCode", map.getSampleCode()); //鏍峰搧缂栧彿
+                    resultMap.put("bushing", map.getBushColor()); //濂楃
+                    resultMap.put("fiber", map.getColor()); //鍏夌氦
+                    resultMap.put("fibers", map.getCode()); //鍏夌氦甯�
+                    resultMap.put("userName", map.getCheckName()); //妫�楠屼汉
+                    resultMap.put("insTime", map.getInsTime()); //妫�娴嬫椂闂�
+                    resultMap.put("sendTime", map.getSendTime()); //涓嬪彂鏃堕棿
+                    resultMap.put("inspectionItem", map.getSample()); //妫�楠岄」鐩�
+                    //娓╁害寰幆瀛愰」
+                    resultMap.put("inspectionItems", map.getInspectionItem());
+                    resultMap.put("inspectionItemSubclass", map.getInspectionItemSubclass());
+                    resultMap.put("attenuationCoefficient1310", map.getAttenuationCoefficient1310());
+                    resultMap.put("attenuationDifference1", map.getAttenuationDifference1());
+                    resultMap.put("attenuationDifference2", map.getAttenuationDifference2());
+                    resultMap.put("attenuationCoefficient1625", map.getAttenuationCoefficient1625());
+                    resultMap.put("attenuationDifference3", map.getAttenuationDifference3());
+                    resultMap.put("attenuationCoefficient1383", map.getAttenuationCoefficient1383());
+                    resultMap.put("attenuationDifference4", map.getAttenuationDifference4());
+                    resultMap.put("attenuationCoefficient1490", map.getAttenuationCoefficient1490());
+                    resultMap.put("attenuationDifference5", map.getAttenuationDifference5());
+                    resultMap.put("attenuationDifferenceMax", map.getAttenuationDifferenceMax());
+                    resultMap.put("insResult", map.getInsResult());
+                    maps.add(resultMap);
+                }
+            }
+            else {
+                List<Map<String, Object>> insOrderPlanList = baseMapper.getInsOrderPlanList(sonLaboratory, entrustCode, sampleCode, createUser, startTime, endTime,sampleType);
+                for (Map<String, Object> map : insOrderPlanList) {
+                    Map<String, Object> resultMap = new HashMap<>();
+                    resultMap.put("entrustCode", map.get("entrustCode")); //濮旀墭鍗曞彿
+                    resultMap.put("sampleCode", map.get("sampleCode")); //鏍峰搧缂栧彿
+                    resultMap.put("bushing", map.get("bushing")); //濂楃
+                    resultMap.put("fiber", map.get("fiber")); //鍏夌氦
+                    resultMap.put("fibers", map.get("fibers")); //鍏夌氦甯�
+                    resultMap.put("userName", map.get("userName")); //鍒涘缓浜�
+                    resultMap.put("insTime", map.get("insTime")); //妫�娴嬫椂闂�
+                    resultMap.put("sendTime", map.get("sendTime")); //涓嬪彂鏃堕棿
+                    resultMap.put("inspectionItem", map.get("inspectionItem")); //妫�楠岄」鐩�
+                    // 鏌ョ湅琛ㄥご鏄惁瀛樺湪瀛愰」
+                    List<Map<String, Object>> collect = headerS.stream().filter(item ->
+                                    item.get("label").toString().equals(map.get("inspectionItemSubclass").toString()))
+                            .collect(Collectors.toList());
+                    // 鏈夊氨鍙栧瓙椤� 娌℃湁灏卞彇鐖堕」
+                    if(!collect.isEmpty() && !Objects.isNull(collect)) {
+                        resultMap.put(collect.get(0).get("prop").toString(), map.get("lastValue"));//妫�楠屽瓙椤圭洰  妫�楠岀粨鏋�
+                    }else {
+                        List<Map<String, Object>> collect1 = headerS.stream().filter(item ->
+                                        item.get("label").toString().equals(map.get("inspectionItem").toString()))
+                                .collect(Collectors.toList());
+                        if(!collect1.isEmpty() && !Objects.isNull(collect1)) {
+                            resultMap.put(collect1.get(0).get("prop").toString(), map.get("lastValue"));//妫�楠岄」鐩�  妫�楠岀粨鏋�
+                        }
+                    }
+                    maps.add(resultMap);
+                }
+
+            }
+        } catch (JsonProcessingException e) {
+            throw new RuntimeException(e);
+        }
+        return  maps.stream().distinct().collect(Collectors.toList());
+    }
+
+    /**
+     * 鑾峰彇褰撳墠鐢ㄦ埛鐨勫疄楠屽
+     * @return
+     */
+    private String getCurrentUserLaboratory(){
+        // 鑾峰彇褰撳墠浜烘墍鍦ㄥ疄楠屽
+        Integer userId = SecurityUtils.getUserId().intValue();
+        String departLimsId = userMapper.selectById(userId).getDepartLimsId();
+        String laboratory = "";
+        if(StringUtils.isNotBlank(departLimsId)) {
+            String[] split = departLimsId.split(",");
+            for (String s : split) {
+                if (StringUtils.isNotBlank(s) && (!Arrays.asList("1","22").contains(s))) {
+                    laboratory = insOrderMapper.getDepartment(Integer.parseInt(s));
+                }
+            }
+        }
+        return laboratory;
+    }
+
+    /**
+     * 瀵煎嚭濮旀墭璐圭敤
+     * @param data 鏁版嵁
+     */
+    @Override
+    public void exportCommissionFees(Map<String, Object> data,HttpServletResponse response) {
+        String laboratory = getCurrentUserLaboratory();
+        // 鏃ユ湡鏍煎紡鍖�
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        String start = LocalDateTime.of(
+                LocalDate.parse(data.get("startTime").toString(),
+                        dateTimeFormatter),LocalTime.of(00, 00, 00)
+        ).toString();
+        String end = LocalDateTime.of(
+                LocalDate.parse(data.get("endTime").toString(),
+                        dateTimeFormatter),LocalTime.of(23, 59, 59)
+        ).toString();
+        // 鑾峰彇鏁版嵁
+        String company = data.get("company").toString();
+        List<CommissionFeesDto> list = insOrderMapper.selectCommissionFees(laboratory,company, start, end);
+        list = list.stream().map(dto -> {
+            Set<String> uniqueTags = new HashSet<>();
+            if (dto.getInsItem().contains(",")) {
+                for (String s : dto.getInsItem().split(",")) {
+                    uniqueTags.add(s.split("@")[0]);
+                }
+            } else {
+                uniqueTags.add(dto.getInsItem().split("@")[0]);
+            }
+            dto.setInsItem(uniqueTags.toString());
+            return dto;
+        }).collect(Collectors.toList());
+        try {
+            String fileName = URLEncoder.encode(laboratory+"濮旀墭璐圭敤缁熻", "UTF-8");
+            response.setContentType("application/vnd.ms-excel");
+            response.setCharacterEncoding("UTF-8");
+            response.setHeader("content-disposition", "attachment;filename=" + fileName + ".xlsx");
+            // 鏂板缓ExcelWriter
+            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(),CommissionFeesDto.class).build();
+            // 鏍规嵁濮旀墭鍗曚綅杩涜sheet鍒嗙被
+            Map<String, List<CommissionFeesDto>> collect = list.stream().collect(Collectors.groupingBy(CommissionFeesDto::getCompany));
+            Iterator<Map.Entry<String, List<CommissionFeesDto>>> iterator = collect.entrySet().iterator();
+            int i = 0;
+            while(iterator.hasNext()) {
+                Map.Entry<String, List<CommissionFeesDto>> entry = iterator.next();
+                WriteSheet writeSheet = EasyExcel.writerSheet(i, entry.getKey()).build();
+                excelWriter.write(entry.getValue(), writeSheet);
+                i++;
+            }
+//            WriteSheet writeSheet = EasyExcel.writerSheet().head(CommissionFeesDto.class).build();
+//            excelWriter.write(list, writeSheet);
+
+            // 灏嗘暟鎹啓鍏�
+            excelWriter.finish();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+    }
+
+    @Override
+    public void exportUnInsProducts(UnInsProductsDTO unInsProductsDTO, HttpServletResponse response) {
+        String laboratory = getCurrentUserLaboratory();
+        //鏃ユ湡鏍煎紡鍖�
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDateTime startDateTime = LocalDateTime.of(LocalDate.parse(unInsProductsDTO.getStartDate(),dateTimeFormatter),LocalTime.MIN);
+        LocalDateTime endDateTime = LocalDateTime.of(LocalDate.parse(unInsProductsDTO.getEndDate(),dateTimeFormatter),LocalTime.MAX);
+
+        // 鑾峰彇鏁版嵁
+        List<UnInsProductsVO> list = baseMapper.selectUnInsProducts(laboratory, startDateTime, endDateTime,unInsProductsDTO);
+        try {
+            String fileName = URLEncoder.encode(laboratory+"寰呮浠诲姟缁熻", "UTF-8");
+            response.setContentType("application/vnd.ms-excel");
+            response.setCharacterEncoding("UTF-8");
+            response.setHeader("content-disposition", "attachment;filename=" + fileName + ".xlsx");
+            // 鏂板缓ExcelWriter
+            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();
+            WriteSheet writeSheet = EasyExcel.writerSheet().head(UnInsProductsVO.class).build();
+            excelWriter.write(list, writeSheet);
+            // 鍏抽棴娴�
+            excelWriter.finish();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Override
+    public IPage<TasksShowDto> tasksShow(Page page, String sonLaboratory) {
+        IPage tasksShow = insOrderMapper.getTasksShow(page, sonLaboratory);
+        return tasksShow;
+    }
+
+    @Override
+    public int getCurrentMonthPlanTotalBySonLaboratory(String sonLaboratory,LocalDateTime startTime, LocalDateTime endTime) {
+        if(StringUtils.isNotBlank(sonLaboratory)){
+            if(Objects.isNull(startTime) || Objects.isNull(endTime)) {
+                //鑾峰彇褰撴湀鐨勫紑濮嬪拰缁撴潫鏃堕棿
+                // 褰撴湀鐨勫紑濮嬫椂闂达紙绗竴澶� 00:00:00锛�
+                startTime = LocalDate.now()
+                        .withDayOfMonth(1)
+                        .atStartOfDay();
+
+                // 褰撴湀鐨勭粨鏉熸椂闂达紙鏈�鍚庝竴澶� 23:59:59.999999999锛�
+                endTime = LocalDate.now()
+                        .with(TemporalAdjusters.lastDayOfMonth())
+                        .atTime(LocalTime.MAX);
+            }
+            //鏌ヨ褰撴湀璇ュ瓙璇曢獙瀹ょ殑鎬讳换鍔℃潯鏁�
+            return baseMapper.selectPlanCountBySonLaboratory(sonLaboratory,startTime,endTime);
+        }
+        return 0;
+    }
+
+    @Override
+    public Map<String, Object> getTabHeader(String sonLaboratory,String samples) {
+        Map<String, Object> resultMap = new HashMap<>();
+        List<String> list = new ArrayList<>();
+        List<Map<String, Object>> maps = new ArrayList<>();
+        if(StringUtils.isNotBlank(samples)) {
+            samples = "[" + "\"" + samples + "\"";
+        }
+        List<Map<String, Object>> tabHeader = baseMapper.getTabHeader(sonLaboratory,samples);
+        ObjectMapper objectMapper = new ObjectMapper();
+        Long count = 1l;
+        for (Map<String, Object> map : tabHeader) {
+            try {
+                List<List<String>> sample = objectMapper.readValue(JSONUtil.toJsonStr(map.get("sample").toString()), new TypeReference<List<List<String>>>() {
+                });
+                // 鑾峰彇tab椤佃〃澶�
+                for (List<String> strings : sample) {
+                        list.add(strings.get(0));
+                }
+                // 鑾峰彇琛ㄦ牸琛ㄥご
+                if(StringUtils.isNotBlank(samples)) {
+                    if(map.containsKey("inspectionItemSubclass")) {
+                        if(StringUtils.isNotBlank(map.get("inspectionItemSubclass").toString())) {
+                            HashMap<String, Object> map1 = new HashMap<>();
+                            map1.put("label", map.get("inspectionItemSubclass").toString());  // label
+                            map1.put("prop","lastValue"+count); // prop
+                            maps.add(map1);
+                        }else {
+                            HashMap<String, Object> map1 = new HashMap<>();
+                            map1.put("label", map.get("inspectionItem").toString());  // label
+                            map1.put("prop","lastValue"+count); // prop
+                            maps.add(map1);
+                        }
+                    }else {
+                        HashMap<String, Object> map1 = new HashMap<>();
+                        map1.put("label", map.get("inspectionItem").toString());  // label
+                        map1.put("prop","lastValue"+count); // prop
+                        maps.add(map1);
+                    }
+                    count++;
+                }
+            } catch (JsonProcessingException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        if (samples.contains("娓╁害寰幆")){
+            addElementToMaps(maps, "寰幆娆℃暟", "inspectionItems");
+            addElementToMaps(maps, "娓╁害鐐�", "inspectionItemSubclass");
+            addElementToMaps(maps, "琛板噺绯绘暟1310", "attenuationCoefficient1310");
+            addElementToMaps(maps, "琛板噺宸�1", "attenuationDifference1");
+            addElementToMaps(maps, "琛板噺绯绘暟1550", "attenuationCoefficient1550");
+            addElementToMaps(maps, "琛板噺宸�2", "attenuationDifference2");
+            addElementToMaps(maps, "琛板噺绯绘暟1625", "attenuationCoefficient1625");
+            addElementToMaps(maps, "琛板噺宸�3", "attenuationDifference3");
+            addElementToMaps(maps, "琛板噺1383", "attenuationCoefficient1383");
+            addElementToMaps(maps, "琛板噺宸�4", "attenuationDifference4");
+            addElementToMaps(maps, "琛板噺1490", "attenuationCoefficient1490");
+            addElementToMaps(maps, "琛板噺宸�5", "attenuationDifference5");
+            addElementToMaps(maps, "琛板噺宸甅ax", "attenuationDifferenceMax");
+            addElementToMaps(maps, "鏄惁鍚堟牸", "insResult");
+        }
+
+        Map<String, Map<String, Object>> uniqueByLabel = maps.stream()
+                .collect(Collectors.toMap(
+                        map -> (String) map.get("label"),
+                        map -> map,
+                        (existing, replacement) -> existing, // 淇濈暀绗竴涓亣鍒扮殑Map
+                        LinkedHashMap::new
+                ));
+        // 灏嗙粨鏋滆浆鎹㈠洖List<Map<String, Object>>
+        List<Map<String, Object>> collect1 = new ArrayList<>(uniqueByLabel.values());
+//        List<Map<String, Object>> collect1 = maps.stream().distinct().collect(Collectors.toList());
+        List<String> collect = list.stream().distinct().collect(Collectors.toList());
+        collect.add("娓╁害寰幆");
+        resultMap.put("tabHeader", collect);
+        resultMap.put("tableHeader", collect1);
+        return resultMap;
+    }
+
+    private static void addElementToMaps(List<Map<String, Object>> maps, String label, String prop) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("label", label);
+        map.put("prop", prop);
+        maps.add(map);
+    }
+
+    @Override
+    public IPage<InsOrderPlanVO> selectInsOrderPlanList(Page page, InsOrderPlanDTO insOrderPlanDTO) {
+        User user = userMapper.selectById(SecurityUtils.getUserId());//褰撳墠鐧诲綍鐨勪汉
+        //鑾峰彇褰撳墠浜烘墍灞炲疄楠屽id
+        String departLimsId = user.getDepartLimsId();
+        String laboratory = null;
+        if (ObjectUtils.isNotEmpty(departLimsId) && !departLimsId.isEmpty()) {
+            String[] split = departLimsId.split(",");
+            //鏌ヨ瀵瑰簲鏋舵瀯鍚嶇О(閫氫俊瀹為獙瀹�,鐢靛姏瀹為獙瀹�,妫�娴嬪姙)
+            String departLims = baseMapper.seldepLimsId(Integer.parseInt(split[split.length - 1]));
+            if (departLims.contains("瀹為獙瀹�")) {
+                laboratory = departLims;
+            }
+        }
+
+        String checkName = null;
+        String userName = null;
+        if (ObjectUtil.isNotEmpty(insOrderPlanDTO.getUserId())) {
+            userName = userMapper.selectById(SecurityUtils.getUserId()).getName();
+            if(Objects.equals(insOrderPlanDTO.getInsState(),"3")) {
+                userName = "";
+                checkName = userMapper.selectById(SecurityUtils.getUserId()).getName();
+            }
+            insOrderPlanDTO.setUserId(null);
+        }
+        InsOrderPlanDTO planDTO = new InsOrderPlanDTO();
+        QueryWrapper<InsOrderPlanDTO> wrappers = QueryWrappers.queryWrappers(planDTO);
+        IPage<InsOrderPlanVO> insOrderPage = insSampleMapper.findInsSampleAndOrder(
+                page,
+                userName,
+                checkName,
+                insOrderPlanDTO.getSonLaboratory(),
+                insOrderPlanDTO.getSample(),
+                insOrderPlanDTO.getSampleCode(),
+                laboratory,
+                insOrderPlanDTO.getEntrustCode(),
+                insOrderPlanDTO.getInsState(),
+                wrappers,
+                insOrderPlanDTO.getSendTimeRange()
+                );
+        return insOrderPage;
+    }
+
+    @Override
+    public IPage<InsOrderPlanTaskSwitchVo> inspectionOrderDetailsTaskSwitching(Page page, InsOrderPlanDTO insOrderPlanDTO) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);//褰撳墠鐧诲綍鐨勪汉
+
+        //鑾峰彇褰撳墠浜烘墍灞炲疄楠屽id
+        String departLimsId = user.getDepartLimsId();
+        String laboratory = null;
+        if (ObjectUtils.isNotEmpty(departLimsId) && !departLimsId.equals("")) {
+            String[] split = departLimsId.split(",");
+            //鏌ヨ瀵瑰簲鏋舵瀯鍚嶇О(閫氫俊瀹為獙瀹�,鐢靛姏瀹為獙瀹�,妫�娴嬪姙)
+            String departLims = baseMapper.seldepLimsId(Integer.parseInt(split[split.length - 1]));
+            if (departLims.contains("瀹為獙瀹�")) {
+                laboratory = departLims;
+            }
+        }
+        if (ObjectUtil.isNotEmpty(insOrderPlanDTO.getUserId())) {
+            insOrderPlanDTO.setUserId(userId.longValue());
+        }
+        String sonLaboratory = insOrderPlanDTO.getSonLaboratory();//璇曢獙瀹�
+        IPage<InsOrderPlanTaskSwitchVo> insOrderPage = insSampleMapper.inspectionOrderDetailsTaskSwitching(page, QueryWrappers.queryWrappers(insOrderPlanDTO), userId, sonLaboratory, laboratory);
+        return insOrderPage;
+    }
+
+    //璁ら浠诲姟
+    @Override
+    public boolean claimInsOrderPlan(InsOrderPlanDTO entity) {
+        if (Objects.isNull(entity)) {
+            return false;
+        }
+        Integer userId = SecurityUtils.getUserId().intValue();
+        InsSampleUser insSampleUser = new InsSampleUser(entity.getInsSampleId().intValue(), userId, 0, entity.getSonLaboratory());
+        return insSampleUserMapper.insert(insSampleUser) > 0;
+    }
+
+    @Override
+    public Map<String, Object> doInsOrder(Integer id, String laboratory) {
+//        InsOrder insOrder = new InsOrder();
+//        insOrder.setId(id);
+
+        InsOrder order = insOrderMapper.selectById(id);
+        InsOrderState insOrderState = insOrderStateMapper.selectOne(new LambdaQueryWrapper<InsOrderState>()
+                .eq(InsOrderState::getInsOrderId, id)
+                .eq(InsOrderState::getLaboratory, laboratory));
+
+        if (BeanUtil.isEmpty(insOrderState.getInsTime())) {
+            order.setInsTime(LocalDateTime.now());
+            insOrderMapper.updateById(order);
+            insOrderStateMapper.update(null, Wrappers.<InsOrderState>lambdaUpdate().eq(InsOrderState::getInsOrderId, id).eq(InsOrderState::getLaboratory, laboratory).set(InsOrderState::getInsTime, LocalDateTime.now()).set(InsOrderState::getInsState, 1));
+        }
+        Map<String, Object> map = insOrderService.getInsOrderAndSample(id, laboratory);
+        List<SampleProductDto> list = JSON.parseArray(JSON.toJSONString(map.get("sampleProduct")), SampleProductDto.class);
+        for (SampleProductDto samples : list) {
+            if (BeanUtil.isEmpty(samples.getInsProduct())) continue;
+            samples.setBushing(insBushingService.selectBushingBySampleId(samples.getId()));
+        }
+        map.put("sampleProduct", list.stream().sorted(Comparator.comparing(SampleProductDto::getId)).collect(Collectors.toList()));
+        return map;
+    }
+
+    @Override
+    public List<InsProduct> getInsProduct(Integer id, Integer type, String laboratory, HttpServletRequest request) {
+        List<InsProduct> insProducts = new ArrayList<>();
+        switch (type) {
+            case 0:
+                //鏍峰搧
+                insProducts = insSampleMapper.getInsProduct1(id, laboratory);
+                if(!insProducts.isEmpty()) {
+                    boolean flag = false;
+                    for(InsProduct insProduct : insProducts) {
+                        if("娓╁害寰幆".equals(insProduct.getInspectionItem())) {
+                            flag = true;
+                            break;
+                        }
+                    }
+                    if(flag) {
+                        insProducts = insSampleMapper.getInsProduct5(id, laboratory);
+                    }
+                }
+                break;
+            case 1:
+                //鍏夌氦甯�
+                insProducts = insSampleMapper.getInsProduct2(id, laboratory);
+                break;
+            case 2:
+                //鍏夌氦
+                insProducts = insSampleMapper.getInsProduct3(id, laboratory);
+                break;
+            case 3:
+                //濂楃
+                insProducts = insSampleMapper.getInsProduct4(id, laboratory);
+                break;
+        }
+
+        //濡傛灉鏄ぇ鏍峰搧涓嬬殑椤圭洰涓虹┖,閭d箞鏌ヨ绗竴涓厜绾ょ殑椤圭洰
+        if (ObjectUtils.isEmpty(insProducts) && type == 0) {
+            //鏌ヨ绗竴涓厜绾ょ殑id
+            List<InsFiber> insFibers = insFiberMapper.selectList(Wrappers.<InsFiber>lambdaQuery()
+                    .eq(InsFiber::getInsBushingId, insBushingMapper.selectList(Wrappers.<InsBushing>lambdaQuery()
+                            .eq(InsBushing::getInsSampleId, id)
+                            .isNotNull(InsBushing::getStandNum)
+                            .isNotNull(InsBushing::getTestNum)).get(0).getId()));
+            if(CollectionUtils.isNotEmpty(insFibers)) {
+                insProducts = insSampleMapper.getInsProduct3(insFibers.get(0).getId(),laboratory);
+            }
+            // 濡傛灉鍏夌氦涓嬬殑椤圭洰涓虹┖,閭d箞鏌ヨ绗竴涓厜绾ゅ甫鐨勯」鐩�
+            else {
+                List<InsFibers> insFibersS = insFibersMapper.selectList(Wrappers.<InsFibers>lambdaQuery()
+                        .eq(InsFibers::getInsBushingId, insBushingMapper.selectList(Wrappers.<InsBushing>lambdaQuery()
+                                .eq(InsBushing::getInsSampleId, id)
+                                .isNotNull(InsBushing::getTestNum)
+                        ).get(0).getId()));
+                //濡傛灉鍏夌氦甯︿笉涓虹┖锛屾煡璇㈠厜绾ゅ甫涓嬫槸鍚﹂厤鏈夊厜绾�
+                if(!insFibersS.isEmpty()){
+                    List<InsFiber> insFiberList = insFiberMapper.selectList(Wrappers.<InsFiber>lambdaQuery().eq(InsFiber::getInsFibersId, insFibersS.get(0).getId()));
+                    if(!insFiberList.isEmpty()){
+                        insProducts = insSampleMapper.getInsProduct3(insFiberList.get(0).getId(),laboratory);
+                    }else{
+                        insProducts = insSampleMapper.getInsProduct6(insFibersS.get(0).getId(),laboratory);
+                    }
+                }
+            }
+        }
+        Set<Integer> set = new HashSet<>();
+        Map<Integer, String> map2 = new HashMap<>();
+        if (BeanUtil.isEmpty(insProducts)) return null;
+        getTemplateThing(set, map2, insProducts);
+        return insProducts;
+    }
+
+    @Override
+    public List<String> checkSubmitPlan(Integer orderId, String laboratory,String temperature,String humidity) {
+        List<String> collect = new ArrayList<>();
+        List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery().eq(InsSample::getInsOrderId, orderId).select(InsSample::getId));
+        List<Integer> ids = insSamples.stream().map(InsSample::getId).collect(Collectors.toList());
+        List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                .in(InsProduct::getInsSampleId, ids)
+                .eq(InsProduct::getSonLaboratory, laboratory)
+                .eq(InsProduct::getState, 1)
+                .eq(InsProduct::getInsResult, 0));
+        if (insProducts.size() > 0) {
+            collect = insProducts.stream().map(insProduct -> {
+                return insProduct.getInspectionItem() + "-" + insProduct.getInspectionItemSubclass();
+            }).collect(Collectors.toList());
+            insProductMapper.update(null,new LambdaUpdateWrapper<InsProduct>()
+                    .set(InsProduct::getTemperature,temperature)
+                    .set(InsProduct::getHumidity,humidity)
+                    .in(InsProduct::getInsSampleId,ids));
+        }
+        return collect;
+    }
+
+    @Override
+    public IPage<InsOrderFile> getFileList(Page page, InsOrderFile insOrderFile) {
+        Integer insOrderId = insOrderFile.getInsOrderId();
+        insOrderFile.setInsOrderId(null);
+        IPage<InsOrderFile> insOrderFileIPage = insOrderFileMapper.getFileList(page, QueryWrappers.queryWrappers(insOrderFile),insOrderId);
+        return insOrderFileIPage;
+    }
+
+    @Override
+    public int uploadFile(Integer orderId, MultipartFile file) {
+        String urlString;
+        String pathName;
+        String path;
+        String filename = file.getOriginalFilename();
+        String contentType = file.getContentType();
+        InsOrderFile insOrderFile = new InsOrderFile();
+        insOrderFile.setInsOrderId(orderId);
+        insOrderFile.setFileName(filename);
+        if (contentType != null && contentType.startsWith("image/")) {
+            // 鏄浘鐗�
+            path = imgUrl;
+            insOrderFile.setType(1);
+        } else {
+            // 鏄枃浠�
+            path = wordUrl;
+            insOrderFile.setType(2);
+        }
+        try {
+            File realpath = new File(path);
+            if (!realpath.exists()) {
+                realpath.mkdirs();
+            }
+            pathName = UUID.randomUUID() + "_" + file.getOriginalFilename();
+            urlString = realpath + "/" + pathName;
+            file.transferTo(new File(urlString));
+            insOrderFile.setFileUrl(pathName);
+            return insOrderFileMapper.insert(insOrderFile);
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.err.println("闄勪欢涓婁紶閿欒");
+            return 0;
+        }
+    }
+
+    //鍒囨崲璁板綍妯$増鏌ヨ妫�楠屽唴瀹�
+    @Override
+    public Map<String, Object> getReportModel(Integer sampleId, String sonLaboratory) {
+        Map<String, Object> map = new HashMap<>();
+        //鍏堟煡鍑哄绠�
+        List<InsBushing> insBushings = insBushingMapper.selectList(Wrappers.<InsBushing>lambdaQuery().eq(InsBushing::getInsSampleId, sampleId));
+        List<InsFibersVO> fibers = new ArrayList<>();
+        List<InsFiber> fiber = new ArrayList<>();
+        List<InsBushing> bush = new ArrayList<>();
+        for (InsBushing insBushing : insBushings) {
+            //淇濆瓨濂楃(鏉惧绠�)
+            List<InsProduct> insProductsByBush = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                    .eq(InsProduct::getInsBushId, insBushing.getId())
+                    .eq(InsProduct::getSonLaboratory,sonLaboratory)
+                    .eq(InsProduct::getState,1)
+                    .and(i->i.like(InsProduct::getInspectionItem,"鏉惧绠�")
+                            .or()
+                            .like(InsProduct::getInspectionItemSubclass,"鏉惧绠�"))
+            );
+            List<Integer> collectByBush = insProductsByBush.stream()
+                    .map(InsProduct::getInsResult)
+                    .filter(sm -> ObjectUtils.isNotEmpty(sm) && sm != 2).collect(Collectors.toList());
+            //1锛氬凡妫�楠岋紝0锛氭湭妫�楠�,2:鍦ㄦ
+            int bushState = 0;
+            if(insProductsByBush.size() == collectByBush.size()){
+                bushState = 1;
+            }else if(!collectByBush.isEmpty() && collectByBush.size()<insProductsByBush.size()){
+                bushState = 2;
+            }
+            insBushing.setState(bushState);
+            if(!insProductsByBush.isEmpty()){
+                bush.add(insBushing);
+            }
+            //鍐嶆煡璇㈠嚭鎵�鏈夌殑鍏夌氦甯�
+            List<InsFibers> insFibers = insFibersMapper.selectList(Wrappers.<InsFibers>lambdaQuery().eq(InsFibers::getInsBushingId, insBushing.getId()));
+
+            List<InsFiber> insFiberList = insFiberMapper.selectList(Wrappers.<InsFiber>lambdaQuery().eq(InsFiber::getInsBushingId, insBushing.getId()));
+            if (CollectionUtils.isNotEmpty(insFibers)) {
+                for (InsFibers insFiberS : insFibers) {
+                    //鏌ヨ鍏夌氦甯︿笅鐨勫厜绾ら厤缃�
+                    List<InsFiber> fiberList = insFiberMapper.selectList(Wrappers.<InsFiber>lambdaQuery().eq(InsFiber::getInsFibersId, insFiberS.getId()));
+                    if(fiberList.isEmpty()){
+                        List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                                .eq(InsProduct::getState,1)
+                                .eq(InsProduct::getSonLaboratory,sonLaboratory)
+                                .eq(InsProduct::getInsFibersId, insFiberS.getId()));
+                        // 杩囨护鍏夌氦鎺ュご鎹熻��
+                        if(CollectionUtils.isNotEmpty(insProducts)) {
+                            insProducts = insProducts.stream().filter(item -> !item.getInspectionItem().equals("鍏夌氦鎺ュご鎹熻��")).collect(Collectors.toList());
+                        }
+                        //璁剧疆濂楃鐨勬楠岀姸鎬�
+                        insFiberS.setState(getInsState(insProducts));
+                        InsFibersVO insFibersVO = new InsFibersVO();
+                        BeanUtil.copyProperties(insFiberS,insFibersVO);
+                        insFibersVO.setIsExistProduct(!insProducts.isEmpty());//鏄惁瀛樺湪妫�楠岄」
+                        insFibersVO.setBushingColor(insBushing.getColor());
+                        //濡傛灉鍏夌氦甯︿笅鐨勯」鐩病鏈夊厜绾ゆ帴澶存崯鑰楅」鐩紝鎵嶆坊鍔犲厜绾ゅ甫淇℃伅
+                        if(CollectionUtils.isNotEmpty(insProducts)) {
+                            fibers.add(insFibersVO);
+                        }
+                    }else{
+                        InsFibersVO insFibersVO = new InsFibersVO();
+                        BeanUtil.copyProperties(insFiberS,insFibersVO);
+                        insFibersVO.setBushingColor(insBushing.getColor());
+                        //鏌ヨ鍏夌氦甯︿笅鐨勬楠岄」
+                        List<InsProduct> fibersProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                                .eq(InsProduct::getState,1)
+                                .eq(InsProduct::getSonLaboratory,sonLaboratory)
+                                .eq(InsProduct::getInsFibersId, insFiberS.getId()));
+                        insFibersVO.setIsExistProduct(!fibersProducts.isEmpty());//鏄惁瀛樺湪妫�楠岄」
+                        if(!fibersProducts.isEmpty()){
+                            //璁剧疆鍏夌氦甯﹁壊鏍囩殑妫�楠岀姸鎬�
+                            insFibersVO.setState(getInsState(fibersProducts));
+                        }
+                        //娣诲姞鍏夌氦甯︿俊鎭�
+                        fibers.add(insFibersVO);
+                        for (InsFiber insFiber : fiberList) {
+                            List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                                    .eq(InsProduct::getState,1)
+                                    .eq(InsProduct::getSonLaboratory,sonLaboratory)
+                                    .eq(InsProduct::getInsFiberId, insFiber.getId()));
+                            // 杩囨护鍏夌氦鎺ュご鎹熻��
+                            if(CollectionUtils.isNotEmpty(insProducts)) {
+                                insProducts = insProducts.stream().filter(item -> !item.getInspectionItem().equals("鍏夌氦鎺ュご鎹熻��")).collect(Collectors.toList());
+                            }
+                            //璁剧疆鍏夌氦鑹叉爣鐨勬楠岀姸鎬�
+                            insFiber.setState(getInsState(insProducts));
+                            //濡傛灉鍏夌氦涓嬬殑椤圭洰娌℃湁鍏夌氦鎺ュご鎹熻�楅」鐩紝鎵嶆坊鍔犲厜绾や俊鎭�
+                            if(CollectionUtils.isNotEmpty(insProducts)) {
+                                fiber.add(insFiber);
+                            }
+                        }
+                    }
+                }
+            }
+            //濡傛灉濂楃涓嬫病鏈夊厜绾ゅ甫灏卞彧鏈夊厜绾や簡
+            else if (CollectionUtils.isNotEmpty(insFiberList)) {
+                for (InsFiber insFiber : insFiberList) {
+                    List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                            .eq(InsProduct::getState,1)
+                            .eq(InsProduct::getSonLaboratory,sonLaboratory)
+                            .eq(InsProduct::getInsFiberId, insFiber.getId()));
+                    // 杩囨护鍏夌氦鎺ュご鎹熻��
+                    if(CollectionUtils.isNotEmpty(insProducts)) {
+                        insProducts = insProducts.stream().filter(item -> !item.getInspectionItem().equals("鍏夌氦鎺ュご鎹熻��")).collect(Collectors.toList());
+                    }
+                    //璁剧疆鍏夌氦鑹叉爣鐨勬楠岀姸鎬�
+                    insFiber.setState(getInsState(insProducts));
+                    if(CollectionUtils.isNotEmpty(insProducts)){
+                        fiber.add(insFiber);
+                    }
+                }
+            }
+        }
+        map.put("鍏夌氦甯�", fibers);
+        map.put("鍏夌氦", fiber);
+        map.put("濂楃", bush);
+        return map;
+    }
+
+    /**
+     * 鍒ゆ柇妫�楠岄」鏄惁妫�娴嬪畬锛岃繑鍥炴娴嬬姸鎬�
+     * @param insProducts
+     * @return
+     */
+    private Integer getInsState(List<InsProduct> insProducts){
+        List<Integer> collect = insProducts.stream().map(InsProduct::getInsResult)
+                .filter(sm -> ObjectUtils.isNotEmpty(sm) && sm != 2).collect(Collectors.toList());
+        if (insProducts.size() == collect.size()) {
+            return 1;//宸叉楠�
+        } else if(!collect.isEmpty() && collect.size()<insProducts.size()){
+            return 2;//鍦ㄦ楠�
+        }
+        return 0;//鏈楠�
+    }
+
+    //娓╁害寰幆鏌ョ湅鍒楄〃鏁版嵁(鍖呮嫭閫氳繃鏍峰搧id,寰幆娆℃暟,娓╁害,寰幆娆℃暟杩涜绛涢��)
+    @Override
+    public Map<String, Object> temCycle(Integer sampleId, String inspectionItem, String inspectionItemSubclass) {
+        Map<String, Object> map = new HashMap<>();
+        //鏍峰搧淇℃伅
+        SampleVo sampleVo = insSampleMapper.getDetailById(sampleId);
+        map.put("sampleVo", sampleVo);
+        List<ProductVo> productVos = new ArrayList<>();
+        //鍏堟煡鍑鸿繖涓牱鍝佷笅鏈夊摢浜涚鑹叉爣,鍏夌氦甯�,鍏夌氦鑹叉爣
+        //鍏堟煡鍑哄绠�
+        List<InsBushing> insBushings = insBushingMapper.selectList(Wrappers.<InsBushing>lambdaQuery().eq(InsBushing::getInsSampleId, sampleId));
+        if (insBushings.size() > 0) {
+            //閫氫俊--娓╁害寰幆
+            for (InsBushing insBushing : insBushings) {
+                //鍐嶆煡璇㈠嚭鎵�鏈夌殑鍏夌氦甯�
+                List<InsFibers> insFibers = insFibersMapper.selectList(Wrappers.<InsFibers>lambdaQuery().eq(InsFibers::getInsBushingId, insBushing.getId()));
+                if (CollectionUtils.isNotEmpty(insFibers)) {
+                    for (InsFibers insFiber : insFibers) {
+                        //鏌ュ嚭鍏夌氦甯︿笅鎵�鏈夌殑鍏夌氦
+                        List<InsFiber> fiberList = insFiberMapper.selectList(Wrappers.<InsFiber>lambdaQuery().eq(InsFiber::getInsFibersId, insFiber.getId()));
+                        for (InsFiber fiber : fiberList) {
+                            //鍐嶆牴鎹叧鑱旂殑鍏夌氦閰嶇疆鐨刬d鍜屽惊鐜鏁板拰娓╁害鍜屾牱鍝乮d杩涜鏌ヨ妫�楠岄」鐩�
+                            List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                                    .eq(InsProduct::getInsSampleId, sampleId)
+                                    .eq(InsProduct::getInspectionItem, inspectionItem)
+                                    .eq(InsProduct::getInspectionItemSubclass, inspectionItemSubclass)
+                                    .eq(InsProduct::getInsFiberId, fiber.getId()));
+                            for (InsProduct insProduct : insProducts) {
+                                InsProductResult insProductResult = insProductResultMapper.selectOne(Wrappers.<InsProductResult>lambdaQuery()
+                                        .eq(InsProductResult::getInsProductId, insProduct.getId()));
+                                ProductVo productVo = new ProductVo();
+                                productVo.setCode(insFiber.getCode());
+                                productVo.setColor(fiber.getColor());
+                                productVo.setBushColor(insBushing.getColor());
+                                if (ObjectUtils.isNotEmpty(insProductResult)) {
+                                    insProduct.setInsProductResult(insProductResult);
+                                }
+                                //姹傚悓绛夋潯浠朵笅1娆″惊鐜�20搴﹀父娓╃殑璁$畻鍊�
+                                InsProductResult insProductResult1 = insProductResultMapper.selectOne(Wrappers.<InsProductResult>lambdaQuery().eq(InsProductResult::getInsProductId, insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
+                                        .eq(InsProduct::getInsSampleId, sampleId)
+                                        .eq(InsProduct::getInspectionItem, "1")
+                                        .eq(InsProduct::getInspectionItemSubclass, "20鈩�(甯告俯)")
+                                        .eq(InsProduct::getInspectionItemClass, insProduct.getInspectionItemClass())
+                                        .eq(InsProduct::getInsFiberId, fiber.getId())).getId()));
+                                if (ObjectUtils.isNotEmpty(insProductResult1) && !insProductResult1.getComValue().equals("[]")) {
+                                    String[] splitStr = insProductResult1.getComValue().split(":");
+                                    insProduct.setComplue(splitStr[splitStr.length-1].split("\"")[1]);
+                                }
+                                productVo.setInsProduct(insProduct);
+                                productVos.add(productVo);
+                            }
+                        }
+                    }
+                } else {
+                    //濡傛灉濂楃涓嬫病鏈夊厜绾ゅ甫灏卞彧鏈夊厜绾や簡
+                    List<InsFiber> insFiberList = insFiberMapper.selectList(Wrappers.<InsFiber>lambdaQuery().eq(InsFiber::getInsBushingId, insBushing.getId()));
+                    for (InsFiber fiber : insFiberList) {
+                        //鍐嶆牴鎹叧鑱旂殑鍏夌氦閰嶇疆鐨刬d鍜屽惊鐜鏁板拰娓╁害鍜屾牱鍝乮d杩涜鏌ヨ妫�楠岄」鐩�
+                        List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                                .eq(InsProduct::getInsSampleId, sampleId)
+                                .eq(InsProduct::getInspectionItem, inspectionItem)
+                                .eq(InsProduct::getInspectionItemSubclass, inspectionItemSubclass)
+                                .eq(InsProduct::getInsFiberId, fiber.getId()));
+                        for (InsProduct insProduct : insProducts) {
+                            InsProductResult insProductResult = insProductResultMapper.selectOne(Wrappers.<InsProductResult>lambdaQuery().eq(InsProductResult::getInsProductId, insProduct.getId()));
+                            ProductVo productVo = new ProductVo();
+                            productVo.setCode("-");
+                            productVo.setColor(fiber.getColor());
+                            productVo.setBushColor(fiber.getBushColor());
+                            insProduct.setInsProductResult(insProductResult);
+                            //姹傚悓绛夋潯浠朵笅1娆″惊鐜�20搴﹀父娓╃殑璁$畻鍊�
+                            InsProductResult insProductResult1 = insProductResultMapper.selectOne(Wrappers.<InsProductResult>lambdaQuery().eq(InsProductResult::getInsProductId, insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
+                                    .eq(InsProduct::getInsSampleId, sampleId)
+                                    .eq(InsProduct::getInspectionItem, "1")
+                                    .eq(InsProduct::getInspectionItemSubclass, "20鈩�(甯告俯)")
+                                    .eq(InsProduct::getInspectionItemClass, insProduct.getInspectionItemClass())
+                                    .eq(InsProduct::getInsFiberId, fiber.getId())).getId()));
+                            if (ObjectUtils.isNotEmpty(insProductResult1) && !insProductResult1.getComValue().equals("[]")) {
+                                String[] splitStr = insProductResult1.getComValue().split(":");
+                                insProduct.setComplue(splitStr[splitStr.length-1].split("\"")[1]);
+                            }
+                            productVo.setInsProduct(insProduct);
+                            productVos.add(productVo);
+                        }
+                    }
+                }
+            }
+            productVos = productVos.stream().sorted(Comparator.comparing(productVo -> productVo.getInsProduct().getInspectionItemClass())).collect(Collectors.toList());
+        } else {
+            //鐢靛姏--鐑惊鐜拰娓╁崌璇曢獙
+            List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                    .eq(InsProduct::getInsSampleId, sampleId)
+                    .eq(InsProduct::getInspectionItem, inspectionItem));
+            for (InsProduct insProduct : insProducts) {
+                InsProductResult insProductResult = insProductResultMapper.selectOne(Wrappers.<InsProductResult>lambdaQuery().eq(InsProductResult::getInsProductId, insProduct.getId()));
+                ProductVo productVo = new ProductVo();
+                if (ObjectUtils.isNotEmpty(insProductResult)) {
+                    insProduct.setInsProductResult(insProductResult);
+                }
+                productVo.setInsProduct(insProduct);
+                productVos.add(productVo);
+            }
+        }
+        map.put("productVos", productVos);
+        return map;
+    }
+
+    @Override
+    public List<String> upPlanUser2(Integer orderId) {
+        List<Integer> sampleId = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery().eq(InsSample::getInsOrderId, orderId)).stream().map(InsSample::getId).collect(Collectors.toList());
+        List<String> sonLaboratory = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery().eq(InsProduct::getState, 1).in(InsProduct::getInsSampleId, sampleId)).stream().map(InsProduct::getSonLaboratory).distinct().collect(Collectors.toList());
+        return sonLaboratory;
+    }
+
+    @Override
+    public Map<String, Object> getSagTemperatureProducts(Integer sampleId) {
+        Map<String, Object> map = new HashMap<>();
+        //鏍峰搧淇℃伅
+        SampleVo sampleVo = insSampleMapper.getDetailById(sampleId);
+        map.put("sampleVo", sampleVo);
+        //鐢靛姏:寮у瀭-娓╁害鐗规畩椤�
+        List<ProductVo> productVos = new ArrayList<>();
+        List<InsProduct> insProducts = insProductMapper.findSagTemperatureProducts(sampleId,"寮у瀭-娓╁害");
+        for (InsProduct insProduct : insProducts) {
+            InsProductResult insProductResult = insProductResultMapper.selectOne(Wrappers.<InsProductResult>lambdaQuery().eq(InsProductResult::getInsProductId, insProduct.getId()));
+            ProductVo productVo = new ProductVo();
+            if (ObjectUtils.isNotEmpty(insProductResult)) {
+                insProduct.setInsProductResult(insProductResult);
+            }
+            productVo.setInsProduct(insProduct);
+            productVos.add(productVo);
+        }
+        map.put("productVos", productVos);
+        return map;
+    }
+
+    @Override
+    public Map<String, Object> getSampleInfoByOrderId(Integer orderId,String sonLaboratory) {
+        Map<String, Object> map = new HashMap<>();
+        if(!Objects.isNull(orderId)){
+            //妫�楠屽唴瀹瑰璞�
+            List<InsProductVO> insProductVOS = insProductMapper.selectProductByOrderId(orderId,sonLaboratory);
+            //鏍规嵁鏍峰搧id鍒嗙粍
+            Map<Integer, List<InsProductVO>> groupMap = insProductVOS.stream().collect(Collectors.groupingBy(InsProductVO::getSampleId));
+            List<InsProductVO> sampleList = new ArrayList<>();
+            for (Integer key : groupMap.keySet()) {
+                AtomicInteger insSum = new AtomicInteger(0);
+                List<String> inspectNameList = new ArrayList<>();
+                InsProductVO insProductVO = new InsProductVO();
+                groupMap.get(key).forEach(k->{
+                    if(StringUtils.isNotBlank(k.getInspectName())){
+                        insSum.getAndIncrement();
+                        inspectNameList.add(k.getInspectName());
+                    }
+                    insProductVO.setId(k.getSampleId());
+                    insProductVO.setSampleCode(k.getSampleCode());
+                });
+                if(CollectionUtils.isEmpty(inspectNameList)){
+                    insProductVO.setState(0);
+                }else if(inspectNameList.size() < groupMap.get(key).size()){
+                    insProductVO.setState(1);
+                }else if(inspectNameList.size() == groupMap.get(key).size()){
+                    insProductVO.setState(2);
+                }
+                insProductVO.setInspectName(inspectNameList.stream().distinct().collect(Collectors.joining(",")));
+                sampleList.add(insProductVO);
+            }
+            map.put("insSamples",sampleList);
+            map.put("insProductVOS",insProductVOS);
+        }
+        return map;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
+    public void saveInsContext(Map<String, Object> insContext, Integer currentTable, Integer currentSampleId, Integer orderId, String sonLaboratory, Boolean isDelete) {
+        try{
+            if(lock.tryLock(10,TimeUnit.SECONDS)){
+                Integer userId = SecurityUtils.getUserId().intValue();
+                insContext.forEach((k, v) -> {
+                    JSONObject jo = JSON.parseObject(JSON.toJSONString(v));
+                    InsProduct insProduct = new InsProduct();
+                    insProduct.setId(Integer.parseInt(k));
+                    InsProduct product = insProductMapper.selectById(insProduct.getId());
+                    if (currentTable.equals(product.getTemplateId()) && currentSampleId.equals(product.getInsSampleId())) {
+                        List<InsProductResult> oldResults = insProductResultMapper.selectList(Wrappers.<InsProductResult>lambdaQuery()
+                                .eq(InsProductResult::getInsProductId, insProduct.getId()));
+
+                        InsProductResult newResult = new InsProductResult();
+                        if (CollectionUtils.isNotEmpty(oldResults)) {
+                            BeanUtil.copyProperties(oldResults.get(0), newResult);
+                        }
+                        newResult.setInsProductId(Integer.parseInt(k));
+                        /*鏍¢獙涓�涓媟esult琛�*/
+                        if (oldResults.size() > 1) {
+                            for (int i = 1; i < oldResults.size(); i++) {
+                                insProductResultMapper.deleteById(oldResults.get(i));
+                            }
+                        }
+                        // 淇濆瓨鐨勬暟鎹皬鏁颁綅鏁板繀椤诲ぇ浜庣瓑浜巘ell鏈�澶х殑灏忔暟浣嶆暟
+                        String tells = product.getTell();
+                        Integer digit = null;
+                        if(StringUtils.isEmpty(tells)) {
+                            digit = -1;
+                        }else {
+                            // 鎵惧埌灏忔暟浣嶆暟鏈�澶氱殑鏁板��
+                            Map<String, Object> stringObjectMap = maxDecimalNumber(tells);
+                            digit = Integer.parseInt(stringObjectMap.get("maxNumber").toString());
+                        }
+                        if (!Arrays.asList("搴斿姏搴斿彉","鎸姩鐤插姵").contains(product.getInspectionItem())) {
+                            //妫�楠屽��
+                            if (jo.get("insValue") != null) {
+                                JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(jo.get("insValue")));
+                                List<Map<String, Object>> iv = new ArrayList<>();
+                                for (Object o : jsonArray) {
+                                    JSONObject insValue = JSON.parseObject(JSON.toJSONString(o));
+                                    Map<String, Object> map = new HashMap<>();
+                                    String val = "";
+                                    if(Objects.nonNull(JSON.parseObject(JSON.toJSONString(insValue.get("v"))).get("v"))){
+                                        val = JSON.parseObject(JSON.toJSONString(insValue.get("v"))).get("v").toString();
+                                    }
+                                    // 濡傛灉鍙互杞崲涓烘暟瀛楋紝灏辫杩涜浣嶆暟鐨勬瘮杈�
+                                    map.put("v", completion(val, digit));
+                                    map.put("r", JSON.toJSONString(insValue.get("r")));
+                                    map.put("c", JSON.toJSONString(insValue.get("c")));
+                                    map.put("w", insValue.get("w"));
+                                    try {
+                                        if ((insValue.get("u") == null || insValue.get("u").equals("")) && StrUtil.isNotEmpty(val)) {
+                                            map.put("u", userId + "");
+                                        } else {
+                                            map.put("u", insValue.get("u"));
+                                        }
+                                        iv.add(map);
+                                    } catch (Exception e) {
+                                    }
+                                }
+                                newResult.setInsValue(JSON.toJSONString(iv));
+                            }
+                        }
+                        if (!Arrays.asList("搴斿姏搴斿彉","鎸姩鐤插姵").contains(product.getInspectionItem())) {
+                            //璁$畻鍊�
+                            if (jo.get("comValue") != null && !Objects.equals(jo.get("comValue"), "")) {
+                                JSONArray jsonArray2 = JSON.parseArray(JSON.toJSONString(jo.get("comValue")));
+                                List<Map<String, Object>> cv = new ArrayList<>();
+                                for (Object o : jsonArray2) {
+                                    JSONObject comValue = JSON.parseObject(JSON.toJSONString(o));
+                                    Map<String, Object> map = new HashMap<>();
+                                    map.put("r", JSON.toJSONString(comValue.get("r")));
+                                    map.put("c", JSON.toJSONString(comValue.get("c")));
+                                    // 濡傛灉鍙互杞崲涓烘暟瀛楋紝灏辫杩涜浣嶆暟鐨勬瘮杈�
+                                    map.put("v", completion(JSON.parseObject(JSON.toJSONString(comValue.get("v"))).get("v").toString(), digit));
+                                    cv.add(map);
+                                }
+                                newResult.setComValue(JSON.toJSONString(cv));
+                            }
+                        }
+                        //鏈�缁堝��
+                        try {
+                            JSONObject resValue = JSON.parseObject(JSON.toJSONString(jo.get("resValue")));
+                            if (resValue.get("v") != null) {
+                                Object o = JSON.parseObject(JSON.toJSONString(resValue.get("v"))).get("v");
+                                // 濡傛灉鍙互杞崲涓烘暟瀛楋紝灏辫杩涜浣嶆暟鐨勬瘮杈�
+                                insProduct.setLastValue(completion(o.equals("") ? null : (o.toString()), digit));
+                            }
+                        } catch (Exception e) {
+                            insProduct.setLastValue("");//''
+                        }
+                        //璁惧缂栧彿
+                        if (jo.get("equipValue") != null) {
+                            JSONArray jsonArray2 = JSON.parseArray(JSON.toJSONString(jo.get("equipValue")));
+                            List<Map<String, Object>> ev = new ArrayList<>();
+                            for (Object o : jsonArray2) {
+                                JSONObject equipValue = JSON.parseObject(JSON.toJSONString(o));
+                                Map<String, Object> map = new HashMap<>();
+                                map.put("v", JSON.parseObject(JSON.toJSONString(equipValue.get("v"))).get("v"));
+                                ev.add(map);
+                            }
+                            newResult.setEquipValue(JSON.toJSONString(ev));
+                        }
+                        //璁惧鍚嶇О
+                        if (jo.get("equipName") != null) {
+                            JSONArray jsonArray2 = JSON.parseArray(JSON.toJSONString(jo.get("equipName")));
+                            List<Map<String, Object>> ev = new ArrayList<>();
+                            for (Object o : jsonArray2) {
+                                JSONObject equipValue = JSON.parseObject(JSON.toJSONString(o));
+                                Map<String, Object> map = new HashMap<>();
+                                map.put("v", JSON.parseObject(JSON.toJSONString(equipValue.get("v"))).get("v"));
+                                ev.add(map);
+                            }
+                            newResult.setEquipName(JSON.toJSONString(ev));
+                        }
+                        //缁撹
+                        try {
+                            JSONObject insResult = JSON.parseObject(JSON.toJSONString(jo.get("insResult")));
+                            String ir = JSON.parseObject(JSON.toJSONString(insResult.get("v"))).get("v") + "";
+                            insProduct.setInsResult(Integer.parseInt(ir));
+                            if (product.getInspectionItem().equals("鐑惊鐜�") || product.getInspectionItem().equals("娓╁崌璇曢獙")) {
+                                List<Integer> collect = insProductMapper.selectList(new LambdaQueryWrapper<InsProduct>()
+                                                .eq(InsProduct::getSpecialItemParentId, product.getId())).stream()
+                                        .map(InsProduct::getInsResult)
+                                        .collect(Collectors.toList());
+                                if (collect.contains(null)) {
+                                    insProduct.setInsResult(2);
+                                } else if (collect.contains(0)) {
+                                    insProduct.setInsResult(0);
+                                } else {
+                                    insProduct.setInsResult(1);
+                                }
+
+                            }
+                        } catch (Exception e) {
+                            insProduct.setInsResult(2);//寰呭畾
+                            if (product.getInspectionItem().equals("搴斿姏搴斿彉") && product.getInspectionItemSubclass().equals("寮规�фā閲�")
+                                    && Arrays.asList("/", "-").contains(product.getAsk())) {
+                                insProduct.setInsResult(3);// 涓嶅垽瀹�
+                            }
+                            // 濡傛灉鏄姬鍨傜殑缁撹涔熸敼涓轰笉鍒ゅ畾
+                            if(product.getInspectionItem().equals("寮у瀭-娓╁害")) {
+                                insProduct.setInsResult(3);// 涓嶅垽瀹�
+                            }
+                        }
+                        if (Objects.isNull(newResult.getId())) {
+                            newResult.setCreateUser(userId);
+                            newResult.setUpdateUser(userId);
+                            insProductResultMapper.insert(newResult);
+                        } else {
+                            newResult.setUpdateUser(userId);
+                            newResult.setUpdateTime(LocalDateTime.now());
+                            insProductResultMapper.updateById(newResult);
+                        }
+                        /*濡傛灉鏄涓�娆¢�夋嫨璁惧淇℃伅,涓旇繕鏈夊叾浣欐牱鍝佷篃鏈夊悓涓�涓楠岄」鐩�,閭d箞鎵�鏈夋牱鍝佺殑璇ラ」鐩兘鐢ㄨ繖涓澶囦俊鎭�*/
+                        //鍏堟煡璇㈡槸鍚﹁繕鏈夊叾浣欐牱鍝�
+                        Integer insSampleId = product.getInsSampleId();
+                        List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery().eq(InsSample::getInsOrderId, insSampleMapper.selectById(insSampleId).getInsOrderId()));
+                        //濡傛灉鏈夊涓牱鍝佹垨鑰呮槸涓嶆槸閲囬泦绫诲瀷灏卞悓涓�涓澶�
+                        if (insSamples.size() > 1 && !product.getInspectionItemType().equals("1")) {
+                            //瀛樺湪鍏朵綑鏍峰搧,鏌ヨ鏄惁鏈夊悓涓�绉嶆楠岄」鐩�
+                            for (InsSample sample : insSamples.stream().filter(insSample -> !insSample.getId().equals(insSampleId)).collect(Collectors.toList())) {
+                                InsProduct product1 = insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
+                                        .eq(InsProduct::getState, 1)
+                                        .eq(InsProduct::getInsSampleId, sample.getId())
+                                        .eq(InsProduct::getInspectionItem, product.getInspectionItem())
+                                        .eq(InsProduct::getInspectionItemEn, product.getInspectionItemEn())
+                                        .eq(InsProduct::getInspectionItemSubclass, product.getInspectionItemSubclass())
+                                        .eq(InsProduct::getInspectionItemSubclassEn, product.getInspectionItemSubclassEn())
+                                        .eq(InsProduct::getTemplateId, product.getTemplateId())
+                                        .eq(InsProduct::getStandardMethodListId, product.getStandardMethodListId())
+                                        .eq(InsProduct::getInsBushId, product.getInsBushId())
+                                        .eq(InsProduct::getInsFibersId, product.getInsFibersId())
+                                        .eq(InsProduct::getInsFiberId, product.getInsFiberId())
+                                );
+                                if (ObjectUtils.isNotEmpty(product1)) {
+                                    //濡傛灉瀛樺湪椤圭洰,鏌ヨ鏄惁鏈夎〃
+                                    InsProductResult productResult = insProductResultMapper.selectOne(Wrappers.<InsProductResult>lambdaQuery()
+                                            .eq(InsProductResult::getInsProductId, product1.getId()));
+                                    if (ObjectUtils.isEmpty(productResult)) {
+                                        //娌℃湁琛ㄦ柊寤鸿〃
+                                        productResult = new InsProductResult();
+                                        productResult.setInsProductId(product1.getId());
+                                        productResult.setEquipValue(newResult.getEquipValue());
+                                        productResult.setEquipName(newResult.getEquipValue());
+                                        productResult.setCreateUser(userId);
+                                        productResult.setUpdateUser(userId);
+                                        insProductResultMapper.insert(productResult);
+                                    } else if (ObjectUtils.isEmpty(productResult.getEquipValue())) {
+                                        //鏈夎〃鍒ゆ柇鏄惁鏈夎澶�
+                                        productResult.setEquipValue(newResult.getEquipValue());
+                                        productResult.setEquipName(newResult.getEquipValue());
+                                        productResult.setUpdateUser(userId);
+                                        productResult.setUpdateTime(LocalDateTime.now());
+                                        insProductResultMapper.updateById(productResult);
+                                    }
+                                }
+                            }
+
+                        }
+                        insProduct.setUpdateUser(userId);
+                        insProductMapper.updateById(insProduct);
+                        // 褰撳墠鏍峰搧鏄惁鏄厜绾ら厤缃殑鍏夌氦鎺ュご鎹熻��
+                        if ((!Objects.isNull(product.getInsFiberId()) || !Objects.isNull(product.getInsFibersId())) && product.getInspectionItem().equals("鍏夌氦鎺ュご鎹熻��")) {
+                            // 鏌ユ壘鍚屾牱鍝佷笅鐨勫厜绾ゆ垨鍏夌氦甯︾殑鍏夌氦鎺ュご鎹熻��
+                            List<InsProduct> insProducts = insProductMapper.selectList(new LambdaQueryWrapper<InsProduct>()
+                                    .eq(InsProduct::getInsSampleId, product.getInsSampleId())
+                                    .eq(InsProduct::getInspectionItem, product.getInspectionItem())
+                                    .eq(InsProduct::getInspectionItemSubclass, product.getInspectionItemSubclass())
+                                    .and(item -> item
+                                            .isNotNull(InsProduct::getInsFiberId)
+                                            .or()
+                                            .isNotNull(InsProduct::getInsFibersId)));
+                            // 瑕佸鍒剁殑result
+                            InsProductResult copyResult = insProductResultMapper.selectOne(new LambdaQueryWrapper<InsProductResult>()
+                                    .eq(InsProductResult::getInsProductId, product.getId()));
+
+                            for (InsProduct insProduct1 : insProducts) {
+                                InsProduct copyInsProduct = insProductMapper.selectById(product.getId()); // 澶嶅埗鐨刬nsProduct
+                                if (!insProduct1.getId().equals(copyInsProduct.getId())) {
+                                    copyInsProduct.setId(insProduct1.getId()); // 灏嗗鍒剁殑insProduct鐨刬d璁剧疆涓鸿澶嶅埗鐨刬d
+                                    copyInsProduct.setInsFibersId(insProduct1.getInsFibersId()); // 鍏夌氦甯d
+                                    copyInsProduct.setInsFiberId(insProduct1.getInsFiberId()); // 鍏夌氦id
+                                    copyInsProduct.setInsBushId(insProduct1.getInsBushId()); // 濂楃id
+                                    insProductMapper.updateById(copyInsProduct);
+                                    // 璧嬪�糹nsProductResult
+                                    InsProductResult insProductResult = insProductResultMapper.selectOne(new LambdaQueryWrapper<InsProductResult>()
+                                            .eq(InsProductResult::getInsProductId, insProduct1.getId()));
+                                    if (Objects.isNull(insProductResult)) {
+                                        copyResult.setId(null);
+                                        copyResult.setInsProductId(insProduct1.getId());
+                                        insProductResultMapper.insert(copyResult);
+                                    } else {
+                                        copyResult.setId(insProductResult.getId());
+                                        copyResult.setInsProductId(insProduct1.getId());
+                                        insProductResultMapper.updateById(copyResult);
+                                    }
+                                }
+                            }
+                        }
+                        insProductUserMapper.insert(new InsProductUser(null, userId, LocalDateTime.now(), insProduct.getId()));
+
+                        insProduct = insProductMapper.selectById(insProduct);
+                        //鏌ヨ妫�楠屽崟淇℃伅
+                        InsSample insSample = insSampleMapper.selectById(insProduct.getInsSampleId());
+                        InsOrder insOrder = insOrderMapper.selectById(insSample.getInsOrderId());
+                        //鏌ヨ鐖舵楠岄」
+                        InsProduct parentInsProduct;
+                        if (ObjectUtil.isNotNull(insProduct.getSpecialItemParentId())) {
+                            parentInsProduct = insProductMapper.selectById(insProduct.getSpecialItemParentId());
+                        } else {
+                            parentInsProduct = null;
+                        }
+                        if (!Objects.isNull(parentInsProduct)) {
+                            if ("娓╁崌璇曢獙".equals(parentInsProduct.getInspectionItem()) || "鐑惊鐜�".equals(parentInsProduct.getInspectionItem())) {
+                                // 娓╁崌璇曢獙浠ュ強鐑惊鐜殑鍒犻櫎
+                                if (isDelete) {
+                                    String inspectionItem = insProduct.getInspectionItem();
+                                    List<InsProduct> insProducts = insProductMapper.selectList(new LambdaQueryWrapper<InsProduct>()
+                                                    .eq(InsProduct::getSpecialItemParentId, parentInsProduct.getId()))
+                                            .stream()
+                                            .filter(item -> item.getInspectionItem().equals(inspectionItem)).collect(Collectors.toList());
+                                    for (InsProduct insProduct1 : insProducts) {
+                                        InsProductResult insProductResult = insProductResultMapper.selectOne(new LambdaQueryWrapper<InsProductResult>()
+                                                .eq(InsProductResult::getInsProductId, insProduct1.getId()));
+                                        if (!Objects.isNull(insProductResult)) {
+                                            if (insProductResult.getInsProductId().equals(Integer.parseInt(k))) {
+                                                continue;
+                                            }
+                                            String insValue = insProductResult.getInsValue();
+                                            List<Map> maps = com.alibaba.fastjson2.JSON.parseArray(insValue, Map.class);
+                                            if (maps.size() > 1) {
+                                                maps.remove(maps.size() - 1);
+                                                insProductResult.setInsValue(com.alibaba.fastjson2.JSON.toJSONString(maps));
+                                                insProductResultMapper.updateById(insProductResult);
+                                            }
+                                        }
+                                    }
+                                }
+                                // 娓╁崌璇曢獙浠ュ強鐑惊鐜煡璇�
+                                // 鐑惊鐜墍鏈夊瓙椤�
+                                List<InsProduct> c = insProductMapper.selectList(new LambdaQueryWrapper<InsProduct>()
+                                        .eq(InsProduct::getSpecialItemParentId, parentInsProduct.getId()));
+                                //閫氳繃inspectionItem鍒嗙粍
+                                Map<String, List<InsProduct>> collect1 = c.stream().collect(Collectors.groupingBy(InsProduct::getInspectionItem));
+                                HashMap<Integer, InsProductResult> map1 = new HashMap<>();
+                                Integer maxKey = Integer.MIN_VALUE;
+                                for (Map.Entry<String, List<InsProduct>> m : collect1.entrySet()) {
+                                    List<InsProduct> thermalCycleCollect = m.getValue();
+                                    if (!thermalCycleCollect.isEmpty()) {
+                                        for (InsProduct product1 : thermalCycleCollect) {
+                                            InsProductResult insProductResult = insProductResultMapper.selectOne(Wrappers.<InsProductResult>lambdaQuery()
+                                                    .eq(InsProductResult::getInsProductId, product1.getId()));
+                                            if (!Objects.isNull(insProductResult)) {
+                                                List<Map> maps = com.alibaba.fastjson2.JSON.parseArray(insProductResult.getInsValue(), Map.class);
+                                                map1.put(maps.size(), insProductResult);
+                                            }
+                                            if (!map1.isEmpty()) {
+                                                for (Map.Entry<Integer, InsProductResult> entry : map1.entrySet()) {
+                                                    if (entry.getKey() > maxKey) {
+                                                        maxKey = entry.getKey();
+                                                    }
+                                                }
+                                            }
+                                        }
+                                        if (maxKey != Integer.MIN_VALUE) {
+                                            InsProductResult insProductResult = map1.get(maxKey);
+                                            List<Map> maps = com.alibaba.fastjson2.JSON.parseArray(insProductResult.getInsValue(), Map.class);
+                                            maps.get(maps.size() - 1).put("v", "");//鏈�鍚庝竴涓�间负绌�
+                                            if (maps.get(maps.size() - 1).containsKey("w")) {
+                                                maps.get(maps.size() - 1).put("w", "");
+                                            }
+                                            for (InsProduct product1 : thermalCycleCollect) {
+                                                InsProductResult insProductResult1 = insProductResultMapper.selectOne(Wrappers.<InsProductResult>lambdaQuery()
+                                                        .eq(InsProductResult::getInsProductId, product1.getId()));
+                                                if (!Objects.isNull(insProductResult1)) {
+                                                    if (!insProductResult1.getInsProductId().equals(insProductResult.getInsProductId())) {
+                                                        List<Map> maps1 = com.alibaba.fastjson2.JSON.parseArray(insProductResult1.getInsValue(), Map.class);
+                                                        if (maps1.size() < maxKey) {
+                                                            int number = maxKey - maps1.size();
+                                                            for (int i = 0; i < number; i++) {
+                                                                maps1.add(maps.get(maps.size() - 1));
+                                                            }
+                                                            insProductResult1.setInsValue(com.alibaba.fastjson2.JSON.toJSONString(maps1));
+                                                            insProductResultMapper.updateById(insProductResult1);
+                                                        }
+                                                    }
+                                                } else {
+                                                    if (maxKey != Integer.MIN_VALUE) {
+                                                        InsProductResult insProductResult2 = map1.get(maxKey);
+                                                        List<Map> maps1 = com.alibaba.fastjson2.JSON.parseArray(insProductResult2.getInsValue(), Map.class);
+                                                        for (Map map : maps1) {
+                                                            map.put("v", "");
+                                                            if (map.containsKey("w")) {
+                                                                map.put("w", "");
+                                                            }
+                                                        }
+                                                        insProductResult2.setInsValue(com.alibaba.fastjson2.JSON.toJSONString(maps1));
+                                                        insProductResult2.setId(null);
+                                                        insProductResult2.setInsProductId(product1.getId());
+                                                        insProductResultMapper.insert(insProductResult2);
+                                                    }
+                                                }
+                                            }
+                                            maxKey = Integer.MIN_VALUE;
+                                            map1.clear();
+                                        }
+                                    }
+                                }
+                                // 濡傛灉鏄绾挎俯搴︾殑鍊兼洿鏂帮紝閭d箞灏辫鍒ゆ柇鑰愬紶鍜屾帴缁槸鍚﹀悎鏍�
+                                InsProduct insProduct1 = insProductMapper.selectById(Integer.parseInt(k));
+                                if (insProduct1.getInspectionItemSubclass().equals("瀵肩嚎娓╁害")) {
+                                    // 鏍规嵁鐖秈d浠ュ強妫�楠岄」鏉ユ煡鎵惧悓涓�寰幆涓嬬殑鑰愬紶鍜屾帴缁�
+                                    List<InsProduct> insProducts2 = insProductMapper.selectList(new LambdaQueryWrapper<InsProduct>()
+                                            .eq(InsProduct::getSpecialItemParentId, parentInsProduct.getId())
+                                            .eq(InsProduct::getInspectionItem, insProduct1.getInspectionItem()));
+                                    List<Double> wire = new ArrayList<>(); // 瀵肩嚎娓╁害鐨勫��
+                                    List<Double> strain = new ArrayList<>(); // 鑰愬紶鐨勫��
+                                    List<Double> joint = new ArrayList<>(); // 鎺ョ画鐨勫��
+
+                                    boolean strainFlag = true; // 鑰愬紶鏄惁鍚堟牸
+                                    boolean jointFlag = true; // 鎺ョ画鏄惁鍚堟牸
+                                    boolean strainPending = false; // 鏄惁鏈夊緟瀹�
+                                    boolean jointPending = false; // 鏄惁鏈夊緟瀹�
+                                    for (InsProduct insProduct2 : insProducts2) {
+                                        if (insProduct2.getInspectionItemSubclass().equals("瀵肩嚎娓╁害")) {
+                                            String insValue = "";
+                                            InsProductResult insProductResult = insProductResultMapper.selectOne(new LambdaQueryWrapper<InsProductResult>()
+                                                    .eq(InsProductResult::getInsProductId, insProduct2.getId()));
+                                            if (!Objects.isNull(insProductResult)) {
+                                                insValue = insProductResult.getInsValue();
+                                                List<Map> maps = com.alibaba.fastjson2.JSON.parseArray(insValue, Map.class);
+                                                if (maps.size() > 0) {
+                                                    for (Map map : maps) {
+                                                        if (Strings.isNotEmpty(map.get("v").toString())) {
+                                                            wire.add(Double.parseDouble(map.get("v").toString()));
+                                                        } else {
+                                                            wire.add(-1.0);
+                                                        }
+                                                    }
+                                                }
+                                            }
+                                        }
+                                        if (insProduct2.getInspectionItemSubclass().equals("鑰愬紶娓╁害")) {
+                                            String insValue = "";
+                                            InsProductResult insProductResult = insProductResultMapper.selectOne(new LambdaQueryWrapper<InsProductResult>()
+                                                    .eq(InsProductResult::getInsProductId, insProduct2.getId()));
+                                            if (!Objects.isNull(insProductResult)) {
+                                                insValue = insProductResult.getInsValue();
+                                                List<Map> maps = com.alibaba.fastjson2.JSON.parseArray(insValue, Map.class);
+                                                if (maps.size() > 0) {
+                                                    for (Map map : maps) {
+                                                        if (Strings.isNotEmpty(map.get("v").toString())) {
+                                                            strain.add(Double.parseDouble(map.get("v").toString()));
+                                                        } else {
+                                                            strain.add(-1.0);
+                                                        }
+                                                    }
+                                                }
+                                            } else {
+                                                strain.add(-1.0);
+                                            }
+                                        }
+                                        if (insProduct2.getInspectionItemSubclass().equals("鎺ョ画娓╁害")) {
+                                            String insValue = "";
+                                            InsProductResult insProductResult = insProductResultMapper.selectOne(new LambdaQueryWrapper<InsProductResult>()
+                                                    .eq(InsProductResult::getInsProductId, insProduct2.getId()));
+                                            if (!Objects.isNull(insProductResult)) {
+                                                insValue = insProductResult.getInsValue();
+                                                List<Map> maps = com.alibaba.fastjson2.JSON.parseArray(insValue, Map.class);
+                                                if (maps.size() > 0) {
+                                                    for (Map map : maps) {
+                                                        if (Strings.isNotEmpty(map.get("v").toString())) {
+                                                            joint.add(Double.parseDouble(map.get("v").toString()));
+                                                        } else {
+                                                            joint.add(-1.0);
+                                                        }
+                                                    }
+                                                }
+                                            } else {
+                                                joint.add(-1.0);
+                                            }
+                                        }
+                                    }
+                                    // 濡傛灉瀵肩嚎娓╁害鐨勫�煎ぇ浜庤�愬紶鍜屾帴缁殑鍊硷紝閭d箞灏辨槸鍚堟牸
+                                    if (!strain.isEmpty() && !wire.isEmpty() && (strain.size() == wire.size())) {
+                                        if (wire.contains(-1.0) || strain.contains(-1.0)) {
+                                            insProductMapper.update(null, new LambdaUpdateWrapper<InsProduct>()
+                                                    .set(InsProduct::getInsResult, 2)
+                                                    .eq(InsProduct::getSpecialItemParentId, parentInsProduct.getId())
+                                                    .eq(InsProduct::getInspectionItem, insProduct1.getInspectionItem())
+                                                    .eq(InsProduct::getInspectionItemSubclass, "鑰愬紶娓╁害"));
+                                            strainPending = true;
+                                        } else {
+                                            for (int i = 0; i < wire.size(); i++) {
+                                                if (wire.get(i) <= strain.get(i)) {
+                                                    strainFlag = false;
+                                                    break;
+                                                }
+                                            }
+                                        }
+                                    }
+
+                                    if (joint.size() > 0 && wire.size() > 0 && (joint.size() == wire.size())) {
+                                        if (wire.contains(-1.0) || joint.contains(-1.0)) {
+                                            insProductMapper.update(null, new LambdaUpdateWrapper<InsProduct>()
+                                                    .set(InsProduct::getInsResult, 2)
+                                                    .eq(InsProduct::getSpecialItemParentId, parentInsProduct.getId())
+                                                    .eq(InsProduct::getInspectionItem, insProduct1.getInspectionItem())
+                                                    .eq(InsProduct::getInspectionItemSubclass, "鎺ョ画娓╁害"));
+                                            jointPending = true;
+                                        } else {
+                                            for (int i = 0; i < wire.size(); i++) {
+                                                if (wire.get(i) <= joint.get(i)) {
+                                                    jointFlag = false;
+                                                    break;
+                                                }
+                                            }
+                                        }
+                                    }
+                                    if (!strainPending) {
+                                        if (strainFlag) {
+                                            insProductMapper.update(null, new LambdaUpdateWrapper<InsProduct>()
+                                                    .set(InsProduct::getInsResult, 1)
+                                                    .eq(InsProduct::getSpecialItemParentId, parentInsProduct.getId())
+                                                    .eq(InsProduct::getInspectionItem, insProduct1.getInspectionItem())
+                                                    .eq(InsProduct::getInspectionItemSubclass, "鑰愬紶娓╁害"));
+                                        } else {
+                                            insProductMapper.update(null, new LambdaUpdateWrapper<InsProduct>()
+                                                    .set(InsProduct::getInsResult, 0)
+                                                    .eq(InsProduct::getSpecialItemParentId, parentInsProduct.getId())
+                                                    .eq(InsProduct::getInspectionItem, insProduct1.getInspectionItem())
+                                                    .eq(InsProduct::getInspectionItemSubclass, "鑰愬紶娓╁害"));
+                                        }
+                                    }
+                                    if (!jointPending) {
+                                        if (jointFlag) {
+                                            insProductMapper.update(null, new LambdaUpdateWrapper<InsProduct>()
+                                                    .set(InsProduct::getInsResult, 1)
+                                                    .eq(InsProduct::getSpecialItemParentId, parentInsProduct.getId())
+                                                    .eq(InsProduct::getInspectionItem, insProduct1.getInspectionItem())
+                                                    .eq(InsProduct::getInspectionItemSubclass, "鎺ョ画娓╁害"));
+                                        } else {
+                                            insProductMapper.update(null, new LambdaUpdateWrapper<InsProduct>()
+                                                    .set(InsProduct::getInsResult, 0)
+                                                    .eq(InsProduct::getSpecialItemParentId, parentInsProduct.getId())
+                                                    .eq(InsProduct::getInspectionItem, insProduct1.getInspectionItem())
+                                                    .eq(InsProduct::getInspectionItemSubclass, "鎺ョ画娓╁害"));
+                                        }
+                                    }
+                                }
+                                // 鏌ユ壘鏄惁鏈夋湭妫�娴嬬殑娆℃暟
+                                List<Integer> insResult = Arrays.asList(0, 1, 3);
+                                List<InsProduct> insProducts = insProductMapper.selectList(new LambdaQueryWrapper<InsProduct>()
+                                        .eq(InsProduct::getSpecialItemParentId, parentInsProduct.getId())
+                                        .and(w -> w.notIn(InsProduct::getInsResult, insResult)
+                                                .or()
+                                                .isNull(InsProduct::getInsResult)));
+                                if (insProducts.isEmpty()) {
+                                    List<InsProduct> insProducts1 = insProductMapper.selectList(new LambdaQueryWrapper<InsProduct>()
+                                            .eq(InsProduct::getSpecialItemParentId, parentInsProduct.getId())
+                                            .eq(InsProduct::getInsResult, 0));
+                                    if (!insProducts1.isEmpty()) {
+                                        insProductMapper.update(null, new LambdaUpdateWrapper<InsProduct>()
+                                                .set(InsProduct::getInsResult, 0)
+                                                .eq(InsProduct::getId, parentInsProduct.getId()));
+                                    } else {
+                                        insProductMapper.update(null, new LambdaUpdateWrapper<InsProduct>()
+                                                .set(InsProduct::getInsResult, 1)
+                                                .eq(InsProduct::getId, parentInsProduct.getId()));
+                                    }
+
+                                }
+                            }
+                        }
+                        //娣诲姞宸ユ椂璁板綍
+                        InsProduct finalInsProduct = insProduct;
+                        WorkTimeDTO workTimeDTO = new WorkTimeDTO(userId, insOrder, insSample, finalInsProduct, parentInsProduct, currentSampleId, k, oldResults, newResult);
+                        String jsonStr;
+                        try {
+                            jsonStr = JackSonUtil.marshal(workTimeDTO);
+                        } catch (Exception e) {
+                            throw new RuntimeException(e);
+                        }
+                        String routerKey;
+                        switch (sonLaboratory){
+                            case "鏉愭枡璇曢獙瀹�":
+                                routerKey = RouterKeyConstants.CL_KEY;
+                                break;
+                            case "鏈烘鎬ц兘璇曢獙瀹�":
+                                routerKey = RouterKeyConstants.JX_KEY;
+                                break;
+                            case "鐢靛姏璇曢獙瀹�":
+                                routerKey = RouterKeyConstants.DL_KEY;
+                                break;
+                            default:
+                                routerKey = RouterKeyConstants.GX_KEY;
+                                break;
+                        }
+                        sendQueueMessage(ExchangeConstants.WORK_TIME_EXCHANGE,routerKey,jsonStr);
+
+                        insSample.setInsState(1);
+                        //鏈楠岀殑妫�楠岄」鏁伴噺
+                        Long unInsCount = insProductMapper.selectCount(Wrappers.<InsProduct>lambdaQuery()
+                                .eq(InsProduct::getInsSampleId, insSample.getId())
+                                .and(wrapper -> wrapper
+                                        .isNull(InsProduct::getInsResult)
+                                        .or()
+                                        .eq(InsProduct::getInsResult, 2)
+                                ));
+                        if (0 == unInsCount) {
+                            insSample.setInsState(2);
+                        }
+                        insSampleMapper.updateById(insSample);
+                        /*鏍¢獙涓�涓媟esult琛�*/
+                        List<InsProductResult> insProductResults = insProductResultMapper.selectList(Wrappers.<InsProductResult>lambdaQuery()
+                                .eq(InsProductResult::getInsProductId, insProduct.getId()));
+                        if (insProductResults.size() > 1) {
+                            for (int i = 1; i < insProductResults.size(); i++) {
+                                insProductResultMapper.deleteById(insProductResults.get(i));
+                            }
+                        }
+                    }
+                });
+                String sampleIdStr = insContext.keySet().stream().findFirst().orElse(null);
+                if (sampleIdStr != null) {
+                    int count = insProductMapper.selectInsProductCountByOrderId(orderId);
+                    if (count == 0) {
+                        insOrderStateMapper.update(new InsOrderState(), Wrappers.<InsOrderState>lambdaUpdate()
+                                .eq(InsOrderState::getInsOrderId, orderId)
+                                .eq(InsOrderState::getLaboratory, sonLaboratory)
+                                .set(InsOrderState::getInsState, 2));
+                        insOrderMapper.update(null, new LambdaUpdateWrapper<InsOrder>()
+                                .set(InsOrder::getState, 4)
+                                .eq(InsOrder::getId, orderId));
+                    } else {
+                        insOrderStateMapper.update(new InsOrderState(), Wrappers.<InsOrderState>lambdaUpdate()
+                                .eq(InsOrderState::getInsOrderId, orderId)
+                                .eq(InsOrderState::getLaboratory, sonLaboratory)
+                                .set(InsOrderState::getInsState, 1));
+                        insOrderMapper.update(null, new LambdaUpdateWrapper<InsOrder>()
+                                .set(InsOrder::getInsState, 1)
+                                .eq(InsOrder::getId, orderId));
+                    }
+                }
+            }
+        }catch (Exception e){
+            log.error("宸ユ椂璁$畻澶辫触-->褰撳墠鏍峰搧ID:{},妫�楠岃鎯�:{}",currentSampleId,insContext);
+            throw new RuntimeException(e);
+        }finally {
+            if(lock.isLocked())lock.unlock();
+        }
+    }
+
+
+    /**
+     * 鏌ユ壘灏忔暟浣嶆暟鏈�澶氱殑鏁板��
+     */
+    public Map<String,Object> maxDecimalNumber(String tells) {
+        HashMap<String, Object> map = new HashMap<>();
+        Pattern pattern = Pattern.compile("[-+]?\\d*\\.?\\d+");
+        Matcher matcher = pattern.matcher(tells);
+        String tell = "";
+        Integer maxNumber = 0;
+        while (matcher.find()) {
+            String group = matcher.group();
+            Integer length = 0;
+            if(group.contains(".")) {
+                 length = group.split("\\.")[1].length();
+            }else {
+                length = 0;
+            }
+            if(length > maxNumber) {
+                maxNumber = length;
+                tell = group;
+            }
+        }
+        map.put("tell",tell);
+        map.put("maxNumber",maxNumber);
+        return map;
+    }
+
+    /**
+     * 灏忔暟浣嶆暟鐨勮ˉ鍏�
+     */
+    public String completion(String value, Integer digit) {
+        if(NumberUtil.isDouble(value)) {
+            int length = 0;
+            String[] splits = value.split("\\.");
+            if(splits.length>1){
+                length = splits[1].length();
+            }
+            if(digit > length) {
+                int difference =  digit - length;
+                for (int i = 0; i < difference; i++) {
+                    value += "0";
+                }
+            }
+        }
+        return value;
+    }
+
+    //浜ゆ帴
+    @Override
+    public int upPlanUser(Integer userId, Integer orderId, String sonLaboratory) {
+        InsSampleUser insSampleUser = new InsSampleUser();
+        insSampleUser.setUserId(userId);
+        insSampleUser.setInsSampleId(orderId);
+        insSampleUser.setState(0);
+        insSampleUser.setSonLaboratory(sonLaboratory);
+        return insSampleUserMapper.insert(insSampleUser);
+    }
+
+    //鏍规嵁鍗曞厓鏍肩殑鏂囨湰鍐呭璁$畻瀹為檯琛岄珮
+    private int estimateCellHeight(CellRenderData cellRenderData) {
+        // 鍋囪榛樿琛岄珮鏄�40
+        int defaultHeight = 40;
+        // 鑾峰彇鍗曞厓鏍间腑鐨勬墍鏈夋钀�
+        List<ParagraphRenderData> paragraphs = cellRenderData.getParagraphs();
+        int estimatedHeight = 0;
+        try {
+            // 閬嶅巻娈佃惤锛屼及绠楁瘡涓钀界殑楂樺害
+            for (ParagraphRenderData paragraph : paragraphs) {
+                List<RenderData> contents = paragraph.getContents();
+                for (RenderData content : contents) {
+                    if (content instanceof TextRenderData) {
+                        TextRenderData text = (TextRenderData) content;
+                        Style style = text.getStyle();
+                        // 鍋囪姣忚鏂囨湰鐨勯珮搴︿负瀛椾綋澶у皬鐨�1.2鍊�
+                        Double fontSize = Objects.isNull(style.getFontSize()) ? 12.0 : style.getFontSize();
+                        int lines = (int) Math.ceil(text.getText().length() / 15.0); // 鍋囪姣忚绾�15涓瓧绗�
+                        int textHeight = (int) (fontSize * 1.2 * lines);
+                        // 绱姞娈佃惤鐨勯珮搴�
+                        estimatedHeight += textHeight;
+                    }
+                }
+            }
+        }catch (Exception ignored){}
+        // 杩斿洖鏈�澶у�硷紝纭繚楂樺害涓嶄綆浜庨粯璁ら珮搴�
+        return Math.max(estimatedHeight, defaultHeight);
+    }
+
+    /**
+     * 鍙戦�侀槦鍒楁秷鎭�
+     * @param exchange   浜ゆ崲鏈哄悕绉�
+     * @param routerKey 璺敱涓婚敭
+     * @param jsonStr   娑堟伅鍐呭
+     */
+    public void sendQueueMessage(String exchange,String routerKey,String jsonStr){
+        rabbitTemplate.convertAndSend(exchange,routerKey,jsonStr);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int verifyPlan(Integer orderId, String laboratory, Integer type, String tell) {
+        int num = (type == 1 ? 5 : 4);
+        LocalDateTime now = LocalDateTime.now();
+        insOrderStateMapper.update(null, Wrappers.<InsOrderState>lambdaUpdate().eq(InsOrderState::getInsOrderId, orderId).eq(InsOrderState::getLaboratory, laboratory).set(InsOrderState::getInsTime, now).set(InsOrderState::getInsState, num).set(InsOrderState::getVerifyTell, tell).set(InsOrderState::getVerifyUser, SecurityUtils.getUserId()));
+        Long count = insOrderStateMapper.selectCount(Wrappers.<InsOrderState>lambdaQuery().eq(InsOrderState::getInsOrderId, orderId).ne(InsOrderState::getInsState, 5));
+        if (count == 0 && num == 5) {
+            List<InsUnPass> insUnPasses = new ArrayList<>();
+            /*鏍峰搧涓嬬殑椤圭洰鍙鏈変竴涓」鐩笉鍚堟牸鍒欐楠岀粨鏋滀负0,鍚﹀垯涓�1*/
+            //杩欓噷鐨刬nsSamples鏄鍗曚笅鐨勬墍鏈夋牱鍝佸寘鎷�("/")
+            List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery().eq(InsSample::getInsOrderId, orderId));
+            for (InsSample insSample : insSamples) {
+                List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery().eq(InsProduct::getInsSampleId, insSample.getId()).eq(InsProduct::getState, 1));
+                List<Integer> results = insProducts.stream().map(InsProduct::getInsResult).filter(Objects::nonNull).collect(Collectors.toList());
+                if (results.contains(0)) {
+                    insSample.setInsResult(0);
+                } else {
+                    insSample.setInsResult(1);
+                }
+                insSampleMapper.updateById(insSample);
+                /*澶嶆牳閫氳繃鍚庯紝灏嗕笉鍚堟牸鐨勯」鐩俊鎭坊鍔犲埌ins_un_pass琛ㄤ腑*/
+                for (InsProduct insProduct : insProducts) {
+                    if (insProduct.getInsResult() == 0) {
+                        InsUnPass insUnPass = new InsUnPass();
+                        insUnPass.setId(null);
+                        insUnPass.setModel(insSample.getModel());
+                        insUnPass.setSample(insSample.getSample());
+                        insUnPass.setInspectionItem(insProduct.getInspectionItem());
+                        insUnPass.setInspectionItemSubclass(insProduct.getInspectionItemSubclass());
+                        insUnPass.setLastValue(insProduct.getLastValue());
+                        insUnPass.setEntrustCode(insOrderMapper.selectById(orderId).getEntrustCode());
+                        List<Integer> userIds = insProductUserMapper.selectList(Wrappers.<InsProductUser>lambdaQuery().eq(InsProductUser::getInsProductId, insProduct.getId())).stream().map(InsProductUser::getCreateUser).distinct().collect(Collectors.toList());
+                        if(!userIds.isEmpty()){
+                            String name = userMapper.selectBatchIds(userIds).stream().map(User::getName).collect(Collectors.joining(","));
+                            insUnPass.setName(name);
+                            insUnPasses.add(insUnPass);
+                        }
+                    }
+                }
+            }
+            insUnPassService.saveBatch(insUnPasses);
+            InsOrder insOrder = insOrderMapper.selectById(orderId);
+            String oldSampleStr = insOrder.getSample();
+            //samples鏄繃婊ゆ帀娌℃湁妫�楠岄」鐩殑鏍峰搧
+            List<SampleProductDto> samples = insSampleMapper.selectSampleProductListByOrderId(orderId);
+            //鏌ヨ璁㈠崟涓嬬殑鍘婚噸鍚庣殑鏍峰搧鍚嶇О
+            List<String> unqeSampleList = samples.stream().map(InsSample::getSample).distinct().collect(Collectors.toList());
+            if(unqeSampleList.size()==1){
+                insOrder.setSample(unqeSampleList.get(0));
+            }
+            InsReport insReport = new InsReport();
+            insReport.setCode(insOrder.getEntrustCode());
+            insReport.setInsOrderId(orderId);
+            List<Map<String, Object>> tables = new ArrayList<>();
+            Set<String> standardMethod = new HashSet<>();
+            Set<String> deviceSet = new HashSet<>();
+            Set<String> models = new HashSet<>();
+            AtomicReference<Integer> productSize = new AtomicReference<>(0);
+            String[] monthNames = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
+            Set<String> resultCh = new HashSet<>();
+            Set<String> resultEn = new HashSet<>();
+            //鑾峰彇妫�楠岄」鐩暟閲�
+            Set<String> unEqualSet = new HashSet<>();
+            //鐢靛姏璇曢獙瀹わ細閽㈡潗/閾濇潗鏍峰搧鍨嬪彿
+            List<String> modelDl = new ArrayList<>();
+            /*鍩虹鎶ュ憡(鏍规嵁缁樺埗鐨勫師濮嬭褰曟ā鐗堝舰鎴�)*/
+            BasicReportHandler basicReportHandler = new BasicReportHandler(baseMapper, this,insSampleMapper);
+            basicReportHandler.doWrite(samples,insReport,tables,standardMethod,models,unEqualSet,modelDl,deviceSet);
+            productSize.getAndSet(unEqualSet.size());
+            String sampleStr = insOrder.getSample();
+            if(!modelDl.isEmpty()){
+                String model = modelDl.stream().distinct().findFirst().orElse("");
+                sampleStr += model;
+            }
+            /*鍏夌氦鎺ュご鎹熻�楃殑鎶ュ憡鏍峰紡*/
+            //鏌ヨ璁㈠崟涓嬫墍鏈夋牱鍝佺殑妫�楠岄」鐩�,濡傛灉鏈夊厜绾ゆ帴澶存崯鑰楀垯閲嶆柊鏋勫缓琛ㄦ牸
+            List<Map<String, Object>> tables4 = new ArrayList<>();
+            //褰撳墠璁㈠崟涓嬬殑鎵�鏈夋楠岄」
+            List<InsProduct> insProducts0 = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                    .eq(InsProduct::getState, 1)
+                    .in(InsProduct::getInsSampleId, insSamples.stream().map(InsSample::getId).distinct().collect(Collectors.toList())));
+            if (insProducts0.stream().map(InsProduct::getInspectionItem).collect(Collectors.toList()).contains("鍏夌氦鎺ュご鎹熻��")){
+                //澶勭悊鍏夌氦鎺ュご鎹熻�楁姤鍛�
+                FiberOpticConnectorLossReportHandler lossReportHandler = new FiberOpticConnectorLossReportHandler(insProductMapper);
+                lossReportHandler.doWrite(insProducts0,insSamples,insReport,tables4);
+            }
+            String url;
+            try {
+                InputStream inputStream = this.getClass().getResourceAsStream("/static/report-template.docx");
+                File file = File.createTempFile("temp", ".tmp");
+                OutputStream outputStream = new FileOutputStream(file);
+                IOUtils.copy(inputStream, outputStream);
+                url = file.getAbsolutePath();
+            } catch (FileNotFoundException e) {
+                throw new ErrorException("鎵句笉鍒版ā鏉挎枃浠�");
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+            StringBuilder standardMethod2 = new StringBuilder();
+            for (String s : standardMethod) {
+                standardMethod2.append("銆�").append(s);
+            }
+            standardMethod2.replace(0, 1, "");
+            tables.forEach(table -> {
+                table.put("tableSize", tables.size() + 1);
+            });
+            List<DeviceVO> deviceList = new ArrayList<>();
+            if (!deviceSet.isEmpty()) {
+                deviceSet.forEach(d->deviceList.add(insOrderMapper.selectDeviceList(d)));
+            }
+            Map<String, String> codeStr = new HashMap<>();
+            codeStr.put("鎶ュ憡缂栧彿", insReport.getCode());
+            codeStr.put("鏍峰搧鍚嶇О", insOrder.getSample());
+            codeStr.put("瑙勬牸鍨嬪彿", samples.get(0).getModel());
+            codeStr.put("鍙戞斁鏃ユ湡", now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+            String codePath;
+            try {
+                String content = phoneQrCode+ insOrder.getEntrustCode() + "&type=word";
+                codePath = new MatrixToImageWriter().code(content, twoCode);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+            String modelStr = "";
+            for (String model : models) {
+                modelStr += "," + model;
+            }
+            String finalModelStr = modelStr;
+            String sampleEn = insSampleMapper.getSampleEn(insOrder.getSample());
+            insOrder.setSample(sampleStr);
+            String orderType = insOrderMapper.getEnumLabelByValue(insOrder.getOrderType());
+            String formType = insOrderMapper.getEnumLabelByValue(insOrder.getFormType());
+            ConfigureBuilder builder = Configure.builder();
+            builder.useSpringEL(true);
+            List<DeviceVO> finalDeviceList = deviceList;
+            Integer userId = insSampleUserMapper.selectOne(Wrappers.<InsSampleUser>lambdaQuery()
+                    .eq(InsSampleUser::getInsSampleId, orderId)
+                    .eq(InsSampleUser::getState,0)
+                    .orderByDesc(InsSampleUser::getCreateTime)
+                    .last("limit 1")).getUserId();
+            String signatureUrl;
+            try {
+                signatureUrl = userMapper.selectById(userId).getSignatureUrl();
+            } catch (Exception e) {
+                throw new ErrorException("鎵句笉鍒版楠屼汉鐨勭鍚�");
+            }
+            if (ObjectUtils.isEmpty(signatureUrl) || signatureUrl.isEmpty()) {
+                throw new ErrorException("鎵句笉鍒版楠屼汉鐨勭鍚�");
+            }
+            //濡傛灉鏄腑澶╃鎶�杞井缂嗗巶(02)锛屾姤鍛婂睍绀哄鎵樺崟浣嶄负涓ぉ绉戞妧鍏夌紗鎬诲巶(01)
+            Custom custom = customMapper.selectById(insOrder.getCompanyId());
+            if(!Objects.isNull(custom) && Objects.equals("涓ぉ绉戞妧杞井缂嗗巶",custom.getCompany())){
+                //涓ぉ绉戞妧鍏夌紗鎬诲巶瀹㈡埛淇℃伅
+                custom = customMapper.selectOne(Wrappers.<Custom>lambdaQuery()
+                        .eq(Custom::getCompany,"涓ぉ绉戞妧鍏夌紗鎬诲巶")
+                        .eq(Custom::getCode2,"01").last("limit 1"));
+            }
+            //鍚堟牸鏁伴噺
+            long qualifiedCount = insProducts0.stream().filter(f->f.getInsResult()==1).count();
+            //鏍煎紡鍖栦笉鍚堟牸椤圭洰
+            joinUnqualifiedItemChars(resultCh,resultEn,insProducts0);
+            String resultChStr = "渚濇嵁濮旀墭瑕佹眰锛屾墍妫�椤圭洰鍧囩鍚堣姹傘��";
+            String resultEnStr = "According to commissioned requirements, all the tested items meet the requirements.";
+            if (!resultCh.isEmpty() && qualifiedCount>0) {
+                resultChStr = "渚濇嵁濮旀墭瑕佹眰锛�" + String.join("銆�",resultCh) + "鎵�妫�椤圭洰涓嶇鍚堣姹傦紝鍏朵綑鎵�妫�椤圭洰鍧囩鍚堣姹傘��";
+                resultEnStr = "According to commissioned requirements," + String.join("銆�",resultEn) + " these inspected items do not meet the requirements, all other inspected items meet the requirements.";
+            }else if(!resultCh.isEmpty() && qualifiedCount==0){
+                resultChStr = "渚濇嵁濮旀墭瑕佹眰锛屾墍妫�椤圭洰鍧囦笉绗﹀悎瑕佹眰銆�";
+                resultEnStr = "According to commissioned requirements, all the tested items do not meet the requirements.";
+            }
+
+            //鍏夌氦闄勪欢琛ㄦ牸鏁版嵁
+            List<Map<String, Object>> tables2 = new ArrayList<>();
+            //鏉惧绠¢檮浠惰〃鏍兼暟鎹�
+            List<Map<String, Object>> tables5 = new ArrayList<>();
+            //灏哄鍙傛暟闄勪欢琛ㄦ牸鏁版嵁
+            List<Map<String, Object>> tables6 = new ArrayList<>();
+            /*鍏夌氦閰嶇疆鐨勬楠屾姤鍛�*/
+            //鍏堝垽鏂槸鍚︽湁鍏夌氦閰嶇疆
+            List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                    .eq(InsProduct::getState, 1)
+                    .in(InsProduct::getInsSampleId, insSamples.stream().map(InsSample::getId).distinct().collect(Collectors.toList()))
+                    .and(i->i.isNull(InsProduct::getInspectionItemClass).or().eq(InsProduct::getInspectionItemClass,""))
+                    );//鐢ㄦ楠屽垎椤瑰瓧娈靛尯鍒厜绾ら厤缃笌娓╁害寰幆
+            //鏌ヨ鍏ㄨ壊璋憋紝杩囨护鑹叉爣骞舵帓搴�
+            List<String> colorList = DictUtils.getDictCache("鑹叉爣").stream()
+                    .sorted(Comparator.comparing(SysDictData::getDictSort))
+                    .map(SysDictData::getDictValue)
+                    .collect(Collectors.toList());
+            //鏉惧绠¢檮浠跺鐞�
+            long piperCount = insProducts.stream().filter(f->!Objects.isNull(f.getInsBushId())).count();
+            if(piperCount>0){
+                PiperConfigReportHandler piperConfigReportHandler = new PiperConfigReportHandler(insProductMapper);
+                piperConfigReportHandler.doWrite(samples,insReport,tables5,colorList);
+            }
+            //杩囨护鏈夊厜绾ら厤缃殑椤圭洰
+            long fiberCount = insProducts.stream().filter(f->!Objects.isNull(f.getInsFiberId())).count();
+            FiberConfigReportHandler lossReportHandler = new FiberConfigReportHandler(insProductMapper,insSampleMapper);
+            if (fiberCount>0) {
+                lossReportHandler.doWrite(samples,insReport,tables2,colorList);
+            } else{
+                //鎺掗櫎鍏夌氦鎺ュご鎹熻�楀拰灏哄鍙傛暟
+                List<InsProduct> filterLists = insProducts.stream()
+                        .filter(f->!Arrays.asList("鍏夌氦鎺ュご鎹熻��","灏哄鍙傛暟","娓╁害寰幆").contains(f.getInspectionItem())&&f.getSonLaboratory().equals("鍏夌氦璇曢獙瀹�")).collect(Collectors.toList());
+                lossReportHandler.writeFiberEnclosureTableRow(filterLists,tables2,insReport);
+            }
+            //杩囨护鏈夊厜绾ゅ甫閰嶇疆鐨勯」鐩�
+            long fibersCount = insProducts.stream().filter(f->!Objects.isNull(f.getInsFibersId())).count();
+            FiberOpticRibbonReportHandler fiberOpticRibbonReportHandler = new FiberOpticRibbonReportHandler(insProductMapper,insSampleMapper);
+            if (fibersCount>0) {
+                fiberOpticRibbonReportHandler.doWrite(samples,insReport,tables6,colorList);
+            } else{
+                //杩囨护灏哄鍙傛暟椤圭洰
+                List<InsProductFiberVO> productList = new ArrayList<>();
+                insSamples.stream()
+                        .map(InsSample::getId).distinct()
+                        .forEach(id->productList.addAll(insProductMapper.selectProductBySampleId(id)));
+                List<InsProductFiberVO> vos = productList.stream().filter(f->f.getInspectionItem().equals("灏哄鍙傛暟")).collect(Collectors.toList());
+                if(!vos.isEmpty()){
+                    fiberOpticRibbonReportHandler.writeFiberOpticRibbonEnclosureTableRow(vos,tables6,insReport);
+                }
+            }
+            tables2.forEach(table2 -> table2.put("tableSize2", tables2.size()));
+            tables5.forEach(table5 -> table5.put("tableSize5", tables5.size()));
+            tables6.forEach(table6 -> table6.put("tableSize6", tables6.size()));
+
+            /*娓╁害寰幆鐨勬楠屾姤鍛�*/
+            //鍏堝垽鏂槸鍚︽湁娓╁害寰幆
+            List<InsProduct> insProducts3 = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                    .eq(InsProduct::getState, 1)
+                    .in(InsProduct::getInsSampleId, insSamples.stream().map(InsSample::getId).distinct().collect(Collectors.toList()))
+                    .isNotNull(InsProduct::getSpecialItemParentId)  //鍖哄垎甯歌椤圭洰
+                    .isNotNull(InsProduct::getInspectionItemClass)//鐢ㄦ楠屽垎椤瑰瓧娈靛尯鍒厜绾ら厤缃笌娓╁害寰幆
+                    .isNotNull(InsProduct::getInsFiberId)); //鐢ㄥ厜绾ゅ尯鍒儹寰幆鍜屾俯搴﹀惊鐜�
+            List<Map<String, Object>> tables3 = new ArrayList<>();
+            if (!insProducts3.isEmpty()) {
+                //澶勭悊娓╁害寰幆鎶ュ憡
+                TemperatureCyclingReportHandler1 cyclingReportHandler = new TemperatureCyclingReportHandler1(insProductMapper, insFiberMapper, insProductResultMapper);
+                cyclingReportHandler.doWrite(samples,insReport,tables3);
+            }
+
+            /*娓╁崌璇曢獙鐨勬楠屾姤鍛�*/
+            List<InsProduct> insProducts1 = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                    .eq(InsProduct::getState, 1)
+                    .in(InsProduct::getInsSampleId, insSamples.stream().map(InsSample::getId).distinct().collect(Collectors.toList()))
+                    .isNotNull(InsProduct::getSpecialItemParentId)  //鍖哄垎甯歌椤圭洰
+                    .isNull(InsProduct::getInspectionItemClass)//鐢ㄦ楠屽垎椤瑰瓧娈靛尯鍒俯鍗囪瘯楠屼笌鐑惊鐜�
+                    .isNull(InsProduct::getInsFiberId) //鐢ㄥ厜绾ゅ尯鍒俯鍗囪瘯楠屽拰娓╁害寰幆
+                    .eq(InsProduct::getInspectionItem, "1")); //娓╁崌璇曢獙鐨勫惊鐜彧鏈�1娆�
+            if (!insProducts1.isEmpty()) {
+                //澶勭悊娓╁崌璇曢獙鎶ュ憡
+                TemperatureTestReportHandler testReportHandler = new TemperatureTestReportHandler(insProductMapper, insProductResultMapper);
+                testReportHandler.doWrite(samples,insReport,tables3);
+            }
+
+            /*鐑惊鐜殑妫�楠屾姤鍛�*/
+            List<InsProduct> insProducts2 = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                    .eq(InsProduct::getState, 1)
+                    .in(InsProduct::getInsSampleId, insSamples.stream().map(InsSample::getId).distinct().collect(Collectors.toList()))
+                    .isNotNull(InsProduct::getSpecialItemParentId)  //鍖哄垎甯歌椤圭洰
+                    .isNotNull(InsProduct::getInspectionItemClass)//鐢ㄦ楠屽垎椤瑰瓧娈靛尯鍒俯鍗囪瘯楠屼笌鐑惊鐜�
+                    .isNull(InsProduct::getInsFiberId)); //鐢ㄥ厜绾ゅ尯鍒儹寰幆鍜屾俯搴﹀惊鐜�
+            if (!insProducts2.isEmpty()) {
+                //澶勭悊鐑惊鐜姤鍛�
+                ThermalCycleReportHandler cycleReportHandler = new ThermalCycleReportHandler(insProductMapper, insProductResultMapper);
+                cycleReportHandler.doWrite(samples,insReport,tables3);
+            }
+            //鍗曟牴鍨傜洿鐕冪儳鐨勬楠屾姤鍛�
+            tables3.forEach(table3 -> {
+                table3.put("tableSize3", tables3.size());
+            });
+            /*鑾峰彇闄勪欢鍥剧墖绫诲瀷*/
+            List<Map<String, Object>> images = new ArrayList<>();
+            List<InsOrderFile> insOrderFiles = insOrderFileMapper.selectList(Wrappers.<InsOrderFile>lambdaQuery().eq(InsOrderFile::getType, 1).eq(InsOrderFile::getInsOrderId, orderId));
+            if (CollectionUtils.isNotEmpty(insOrderFiles)) {
+                insOrderFiles.forEach(insOrderFile -> {
+                    Map<String, Object> image = new HashMap<>();
+                    PictureRenderData pictureRenderData = Pictures.ofLocal(imgUrl + "/" + insOrderFile.getFileUrl()).sizeInCm(17, 20).create();
+                    image.put("url", pictureRenderData);
+                    image.put("report", insReport);
+                    images.add(image);
+                });
+            }
+            //濮旀墭浜哄拰鐢佃瘽瀛楁鍒ゆ柇
+            if (ObjectUtils.isEmpty(insOrder.getPrepareUser())) {
+                insOrder.setPrepareUser("/");
+            }
+            if (ObjectUtils.isEmpty(insOrder.getPhone())) {
+                insOrder.setPhone("/");
+            }
+            //鏌ヨ瀹℃壒绛惧悕閰嶇疆
+            Map<String,Object> urlMap = insReportApproveConfigMapper.selectApprovalConfigByLaboratory(insOrder.getLaboratory());
+            String writeUrl = imgUrl + "/" + (Objects.isNull(urlMap.get("writeUrl"))?"":urlMap.get("writeUrl").toString());//缂栧埗浜虹鍚島rl
+            String examineUrl = imgUrl + "/" +  (Objects.isNull(urlMap.get("examineUrl"))?"":urlMap.get("examineUrl").toString());//瀹℃牳浜虹鍚島rl
+            String ratifyUrl = imgUrl + "/" +  (Objects.isNull(urlMap.get("ratifyUrl"))?"":urlMap.get("ratifyUrl").toString());//鎵瑰噯浜虹鍚島rl
+            //鑾峰彇鍦烘墍鐨勬姤鍛婁笓鐢ㄧ珷
+            String sealUrl;
+            try {
+                sealUrl = insReportMapper.getLaboratoryByName(insOrder.getLaboratory());
+            } catch (Exception e) {
+                throw new ErrorException("鎵句笉鍒版姤鍛婁笓鐢ㄧ珷");
+            }
+
+            //妫�楠岄」鐩殑鐜
+            InsProduct insProduct = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery().eq(InsProduct::getState, 1).eq(InsProduct::getInsSampleId, samples.get(0).getId())).get(0);
+            String environment = "";
+            environment = (ObjectUtils.isNotEmpty(insProduct.getTemperature()) ? insProduct.getTemperature() + "鈩� " : "") + (ObjectUtils.isNotEmpty(insProduct.getHumidity()) ? insProduct.getHumidity() + "%" : "");
+            String finalEnvironment = environment;
+            Custom finalCustom = custom;
+            String finalSealUrl = imgUrl + "/" +sealUrl;
+            String finalResultChStr = resultChStr;
+            String finalResultEnStr = resultEnStr;
+            ZipSecureFile.setMinInflateRatio(0.001);
+            XWPFTemplate template = XWPFTemplate.compile(url, builder.build()).render(
+                    new HashMap<String, Object>() {{
+                        put("order", insOrder);
+                        put("report", insReport);
+                        put("environment", finalEnvironment);
+                        put("custom", finalCustom);
+                        put("sampleSize", samples.size());
+                        put("tables", tables);
+                        put("tableSize", tables.size() + 1);
+                        put("tables2", tables2.isEmpty()?null:tables2);
+                        put("tableSize2", tables2.size());
+                        put("tables3", tables3.isEmpty()?null:tables3);
+                        put("tableSize3", tables3.size());
+                        put("tables4", tables4.isEmpty()?null:tables4);
+                        put("tableSize4", tables4.size());
+                        put("tables5", tables5.isEmpty()?null:tables5);
+                        put("tableSize5", tables5.size());
+                        put("tables6", tables6.isEmpty()?null:tables6);
+                        put("tableSize6", tables6.size());
+                        put("standardMethod", (standardMethod2.toString().equals("null") ? "" : standardMethod2));
+                        put("deviceList", finalDeviceList);
+                        put("twoCode", Pictures.ofLocal(codePath).create());
+                        put("models", finalModelStr.replace(",", ""));
+                        put("productSize", productSize);
+                        put("createTime", now.format(DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�")));
+                        put("createTimeEn", monthNames[now.getMonthValue() - 1] + " " + now.getDayOfMonth() + ", " + now.getYear());
+                        put("insTime", insOrder.getInsTime().format(DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�")));
+                        put("insTimeEn", monthNames[insOrder.getInsTime().getMonthValue() - 1] + " " + insOrder.getInsTime().getDayOfMonth() + ", " + insOrder.getInsTime().getYear());
+                        put("writeUrl", new FilePictureRenderData(100,50, writeUrl));
+                        put("insUrl", new FilePictureRenderData(100,50,imgUrl + "/" + signatureUrl));
+                        put("images", images.isEmpty()?null:images);
+                        put("examineUrl", new FilePictureRenderData(100,50,examineUrl));
+                        put("ratifyUrl", new FilePictureRenderData(100,50,ratifyUrl));
+                        put("sampleEn", sampleEn);
+                        put("orderType", orderType);
+                        put("getTime", insOrder.getExamineTime().format(DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�")));
+                        put("getTimeEn", monthNames[insOrder.getExamineTime().getMonthValue() - 1] + " " + insOrder.getExamineTime().getDayOfMonth() + ", " + insOrder.getExamineTime().getYear());
+                        put("seal1", new FilePictureRenderData(600,600, finalSealUrl));
+                        put("seal2", new FilePictureRenderData(600,600, finalSealUrl));
+                        put("formTypeCh", formType);
+                        put("formTypeEn", insOrder.getFormType());
+                        put("resultCh", finalResultChStr);
+                        put("resultEn", finalResultEnStr);
+                    }});
+            // 鏇存柊鏁版嵁搴撲腑鐨勭鍙戞棩鏈�
+            insOrderService.update(Wrappers.<InsOrder>lambdaUpdate()
+                    .eq(InsOrder::getId, insOrder.getId())
+                    .set(InsOrder::getIssuingDate, now));
+            try {
+                String name = insReport.getCode().replace("/", "") + ".docx";
+                template.writeAndClose(Files.newOutputStream(Paths.get(wordUrl + "/" + name)));
+                insReport.setUrl("/word/" + name);
+                insReport.setIsExamine(-9);//鏈鏍哥姸鎬佷负-9
+                insReport.setIsRatify(-9);//鏈壒鍑嗙姸鎬佷负-9
+                insReportMapper.insert(insReport);
+                insOrder.setInsState(5);
+                insOrder.setSample(oldSampleStr);
+                insOrderMapper.updateById(insOrder);
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+            // 澶勭悊鍚堝苟鍗曞厓鏍肩殑闂
+            String path = wordUrl + "/" + insReport.getCode().replace("/", "") + ".docx";
+            // word 杞� pdf
+            String tempUrlPdf = insReportService.wordToPdfTemp((StrUtil.isBlank(insReport.getUrlS()) ? insReport.getUrl() : insReport.getUrlS()).replace("/word", wordUrl));
+            insReportMapper.update(null,new LambdaUpdateWrapper<InsReport>()
+                    .set(InsReport::getTempUrlPdf,tempUrlPdf)
+                    .eq(InsReport::getId,insReport.getId()));
+            try {
+                ZipSecureFile.setMinInflateRatio(0.0001);//瑙e喅闄勪欢鏂囦欢杩囧ぇ寮曞彂鐨刏ipBom寮傚父
+                FileInputStream stream = new FileInputStream(path);
+                XWPFDocument document = new XWPFDocument(stream);
+                List<XWPFTable> xwpfTables = document.getTables();
+                for (int i = 0; i < xwpfTables.size(); i++) {
+                    Set<String> set1 = new HashSet<>();
+                    Map<String, Map<String, Integer>> maps = new HashMap<>();
+                    for (int j = 0; j < xwpfTables.get(i).getRows().size(); j++) {
+                        for (int k = 0; k < xwpfTables.get(i).getRows().get(j).getTableCells().size(); k++) {
+                            if (xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().indexOf("鈭�") > -1) {
+                                String[] split = xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().split("鈭�");
+                                if (set1.add(split[1])) {
+                                    Map<String, Integer> map = new HashMap<>();
+                                    map.put("sr", j);
+                                    map.put("sc", k);
+                                    map.put("er", j + 0);
+                                    map.put("ec", k + 0);
+                                    maps.put(split[1], map);
+                                } else {
+                                    Map<String, Integer> map1 = maps.get(split[1]);
+                                    if (j == map1.get("sr")) {
+                                        map1.put("ec", map1.get("ec") + 1);
+                                    } else if (k == map1.get("sc")) {
+                                        map1.put("er", map1.get("er") + 1);
+                                    }
+                                }
+                                String str = xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getText().split("鈭�")[0];
+                                xwpfTables.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0);
+                                xwpfTables.get(i).getRows().get(j).getTableCells().get(k).setText(str);
+                                xwpfTables.get(i).getRows().get(j).getTableCells().get(k).setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
+                                xwpfTables.get(i).getRows().get(j).getTableCells().get(k).getParagraphArray(0).setAlignment(ParagraphAlignment.CENTER);
+                            }
+                        }
+                    }
+
+                    // 鍗曞厓鏍兼帓搴�, 閬垮厤鏍煎紡閿欎贡
+                    List<Map.Entry<String, Map<String, Integer>>> entries = new ArrayList<>(maps.entrySet());
+                    entries.sort((o1, o2) -> o1.getValue().get("sc") - o2.getValue().get("sc"));
+
+                    // 鎸夌収椤哄簭娣诲姞杩涢泦鍚�
+                    List<String> list = new ArrayList<>();
+                    for (Map.Entry<String, Map<String, Integer>> entry : entries) {
+                        list.add(entry.getKey());
+                    }
+                /*List<String> list = new ArrayList<>();
+                for (String s : maps.keySet()) {
+                    list.add(s);
+                }*/
+                    for (int a = list.size() - 1; a >= 0; a--) {
+                        Map<String, Integer> v = maps.get(list.get(a));
+                        for (int j = 0; j < v.get("er") - v.get("sr") + 1; j++) {
+                            if (v.get("ec") > v.get("sc")) {
+                                try {
+                                    TableTools.mergeCellsHorizonal(xwpfTables.get(i), v.get("sr") + j, v.get("sc"), v.get("ec"));
+                                } catch (Exception e) {
+                                }
+                            }
+                        }
+                        if (v.get("er") > v.get("sr")) {
+                            try {
+                                TableTools.mergeCellsVertically(xwpfTables.get(i), v.get("sc"), v.get("sr"), v.get("er"));
+                            } catch (Exception e) {
+                            }
+                        }
+                    }
+                }
+                FileOutputStream fileOutputStream = new FileOutputStream(path);
+                document.write(fileOutputStream);
+                fileOutputStream.close();
+            } catch (FileNotFoundException e) {
+                throw new RuntimeException(e);
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+            //澶勭悊涓嫳鏂囨崲琛岀殑闂
+            try {
+                FileInputStream stream1 = new FileInputStream(path);
+                XWPFDocument document1 = new XWPFDocument(stream1);
+                List<XWPFTable> xwpfTables1 = document1.getTables();
+                for (int i = 1; i < xwpfTables1.size() - (deviceList == null ? 1 : 2); i++) {
+                    for (int j = 0; j < xwpfTables1.get(i).getRows().size(); j++) {
+                        for (int k = 0; k < xwpfTables1.get(i).getRows().get(j).getTableCells().size(); k++) {
+                            if (xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText().contains("@")) {
+                                String text = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText();
+                                String[] split = text.split("@");
+                                xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0);
+                                XWPFParagraph xwpfParagraph = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).addParagraph();
+                                XWPFRun run = xwpfParagraph.createRun();
+                                run.setText(split.length>0?split[0]:"");
+                                if (split.length>1 && ObjectUtils.isNotNull(split[1])) {
+                                    run.addBreak();
+                                    run.setText(split[1]);
+                                }
+                                xwpfParagraph.setAlignment(ParagraphAlignment.CENTER);
+                            }
+                        }
+                    }
+                }
+                FileOutputStream fileOutputStream1 = new FileOutputStream(path);
+                document1.write(fileOutputStream1);
+                fileOutputStream1.close();
+            } catch (FileNotFoundException e) {
+                throw new RuntimeException(e);
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+        } else if(num != 5) {
+            //澶嶆牳涓嶉�氳繃灏嗘妸澶嶆牳鐨勮礋璐d汉鍘绘帀
+            Integer id = insSampleUserMapper.selectOne(Wrappers.<InsSampleUser>lambdaQuery().eq(InsSampleUser::getInsSampleId, orderId).orderByDesc(InsSampleUser::getId).last("limit 1")).getId();
+            insSampleUserMapper.deleteById(id);
+        }
+        return 1;
+    }
+
+    /**
+     * 鏍煎紡鍖栦笉鍚堟牸椤圭洰瀛楃涓�
+     * @param resultCh 涓嶅悎鏍奸」鐩腑鏂囧垪琛�
+     * @param resultEn 涓嶅悎鏍奸」鐩嫳鏂囧垪琛�
+     * @param insProducts0 妫�楠岄」鍒楄〃
+     */
+    private void joinUnqualifiedItemChars(Set<String> resultCh, Set<String> resultEn, List<InsProduct> insProducts0) {
+        if(!insProducts0.isEmpty()){
+            insProducts0.stream().filter(f->f.getInsResult()==0).forEach(e->{
+                String chinaStr = String.join("-",e.getInspectionItem(),e.getInspectionItemSubclass());
+                String englishStr = String.join("-",e.getInspectionItemEn(),e.getInspectionItemSubclassEn());
+                resultCh.add(chinaStr);
+                resultEn.add(englishStr);
+            });
+        }
+    }
+
+    public void getTemplateThing
+            (Set<Integer> set, Map<Integer, String> map2, List<InsProduct> insProducts) {
+        for (InsProduct product : insProducts) {
+            if (product.getSpecialItemParentId()!=null) {
+                product.setTemplate(new ArrayList<>());
+                continue;
+            }
+            String thing = null;
+            if (product.getSpecialItemParentId() == null && set.add(product.getTemplateId())) {
+                map2.put(product.getTemplateId(), standardTemplateService.getStandTempThingById(product.getTemplateId()) + "");
+                thing = map2.get(product.getTemplateId());
+            }
+            if (StrUtil.isNotEmpty(thing)) {
+                JSONObject sheet = JSON.parseObject(JSON.toJSONString(JSON.parseArray(JSON.toJSONString(JSON.parseObject(thing).get("data"))).get(0)));
+                JSONObject config = JSON.parseObject(JSON.toJSONString(sheet.get("config")));
+                List<JSONObject> cellData = JSON.parseArray(JSON.toJSONString(sheet.get("celldata")), JSONObject.class);
+                Map<String, Object> style = new HashMap<>();
+                style.put("rowlen", config.get("rowlen"));
+                style.put("columnlen", config.get("columnlen"));
+                product.setTemplate(cellData);
+                product.setStyle(style);
+                product.setTemplateName(standardTemplateService.getStandTempNameById(product.getTemplateId()));
+            }
+        }
+    }
+
+    @Override
+    public int submitPlan(Integer orderId, String laboratory, Integer verifyUser, String entrustCode) {
+        List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery().eq(InsSample::getInsOrderId, orderId).select(InsSample::getId));
+        List<Integer> ids = insSamples.stream().map(a -> a.getId()).collect(Collectors.toList());
+        List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                .in(InsProduct::getInsSampleId, ids)
+                .eq(InsProduct::getSonLaboratory, laboratory)
+                .eq(InsProduct::getState, 1)
+                .and(wrapper -> wrapper
+                        .isNull(InsProduct::getInsResult)
+                        .or()
+                        .eq(InsProduct::getInsResult, 2)
+                )
+                .isNull(InsProduct::getInsFiberId)
+                .isNull(InsProduct::getInsFibersId));
+        insProducts.addAll(insProductMapper.selectFiberInsProduct(ids, laboratory));
+        if (insProducts.size() > 0) {
+            String str = "";
+            HashSet<String> set = new HashSet<>();
+            int count = 0;
+            for (InsProduct product : insProducts) {
+                //濡傛灉鏄厜缂嗙殑娓╁害寰幆
+                if (product.getInspectionItem().equals("娓╁害寰幆") && insOrderMapper.selectById(orderId).getSampleType().equals("鍏夌紗")) {
+                    //鏌ヨ閭d簺寰幆娓╁害鐨勬楠岄」鐩殑缁撹鏄惁鍏ㄩ儴妫�楠�
+                    List<InsProduct> insProductList = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery().eq(InsProduct::getInsSampleId, product.getInsSampleId())
+                            .isNotNull(InsProduct::getInsFiberId).like(InsProduct::getInspectionItemSubclass, "鈩�"));
+                    List<Integer> collect = insProductList.stream().filter(insProduct -> insProduct.getInsResult() != null).map(InsProduct::getInsResult).collect(Collectors.toList());
+                    List<Integer> tt = new ArrayList<>();
+                    tt.add(1);
+                    if (collect.contains(0)) {
+                        product.setLastValue("涓嶅悎鏍�");
+                        product.setInsResult(0);
+                    } else if (collect.size() == insProductList.size() && collect.stream().distinct().collect(Collectors.toList()).containsAll(tt)) {
+                        product.setLastValue("鍚堟牸");
+                        product.setInsResult(1);
+                    }
+                    insProductMapper.updateById(product);
+                }
+                //濡傛灉鏄儹寰幆鎴栬�呮槸娓╁崌璇曢獙
+                else if (product.getInspectionItem().equals("鐑惊鐜�") || product.getInspectionItem().equals("娓╁崌璇曢獙")) {
+                    //鏌ヨ杩欎簺椤圭洰涓嬬殑鍏朵粬妫�楠岄」鐩槸鍚﹀叏閮ㄦ楠�
+                    List<InsProduct> insProductList = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                            .eq(InsProduct::getInsSampleId, product.getInsSampleId())
+                            .like(InsProduct::getInspectionItemSubclass, "娓╁害"));
+                    List<Integer> collect = insProductList.stream().filter(insProduct -> insProduct.getInsResult() != null).map(InsProduct::getInsResult).collect(Collectors.toList());
+                    List<Integer> tt = new ArrayList<>();
+                    tt.add(1);
+                    if (collect.contains(0)) {
+                        product.setLastValue("涓嶅悎鏍�");
+                        product.setInsResult(0);
+                    } else if (collect.size() == insProductList.size() && collect.stream().distinct().collect(Collectors.toList()).containsAll(tt)) {
+                        product.setLastValue("鍚堟牸");
+                        product.setInsResult(1);
+                    }
+                    insProductMapper.updateById(product);
+                }
+                //濡傛灉鏄數鍔涚殑搴斿姏搴斿彉妫�楠岄」鐩垨鑰呮槸鐤插姵璇曢獙,缁撹鏀规垚涓嶅垽瀹�
+                else if (product.getInspectionItem().equals("搴斿姏搴斿彉") || product.getInspectionItem().contains("鐤插姵璇曢獙")){
+                    product.setInsResult(3);
+                    insProductMapper.updateById(product);
+                }
+                //濡傛灉鏄槻鎸敜鍔熺巼鐗规�ц瘯楠�
+                else if (product.getInspectionItem().equals("闃叉尟閿ゅ姛鐜囩壒鎬ц瘯楠�")){
+                    product.setInsResult(1);//榛樿鍚堟牸
+                    //闇�瑕佸幓鍒ゆ柇濉啓鐨勬楠屾暟鎹槸鍚︽湁涓嶅悎鏍�
+                    InsProductResult insProductResult = insProductResultMapper.selectOne(Wrappers.<InsProductResult>lambdaQuery().eq(InsProductResult::getInsProductId, product.getId()));
+                    cn.hutool.json.JSONObject jsonObject = new cn.hutool.json.JSONObject(insProductResult.getComValue());
+                    // 妫�鏌� arr2
+                    cn.hutool.json.JSONArray arr2 = jsonObject.getJSONArray("arr2");
+                    for (int i = 0; i < arr2.size(); i++) {
+                        cn.hutool.json.JSONObject obj = arr2.getJSONObject(i);
+                            if (obj.getInt("state") == 2) {
+                                product.setInsResult(0);
+                                break;
+                            }
+                    }
+                    // 妫�鏌� arr3
+                    cn.hutool.json.JSONArray arr3 = jsonObject.getJSONArray("arr3");
+                    for (int i = 0; i < arr3.size(); i++) {
+                        cn.hutool.json.JSONObject obj = arr3.getJSONObject(i);
+                            if (obj.getInt("state") == 2) {
+                                product.setInsResult(0);
+                                break;
+                            }
+                    }
+                    insProductMapper.updateById(product);
+                }
+                else {
+                    String  notDetected = product.getInspectionItem() + " " + product.getInspectionItemSubclass();
+                    if(!set.contains(notDetected)) {
+                        count++;
+                        str += "<br/>" + count + "锛�" + product.getInspectionItem() + " " + product.getInspectionItemSubclass() + "<br/>";
+                        set.add(notDetected);
+                    }
+
+                }
+            }
+            if (ObjectUtils.isNotEmpty(str)) {
+                throw new ErrorException("<strong>瀛樺湪寰呮楠岀殑椤圭洰锛�</strong><br/>" + str);
+            }
+        }
+        insOrderStateMapper.update(null, Wrappers.<InsOrderState>lambdaUpdate().eq(InsOrderState::getInsOrderId, orderId).eq(InsOrderState::getLaboratory, laboratory).set(InsOrderState::getInsTime, LocalDateTime.now()).set(InsOrderState::getInsState, 3).set(InsOrderState::getVerifyUser, verifyUser));
+        Integer userId = SecurityUtils.getUserId().intValue();
+        InformationNotification info = new InformationNotification();
+        info.setCreateUser(insProductMapper.selectUserById(userId).get("name"));
+        info.setMessageType("2");
+        info.setTheme("澶嶆牳閫氱煡");
+        info.setContent("鎮ㄦ湁涓�鏉℃楠屼换鍔″緟澶嶆牳娑堟伅");
+        info.setSenderId(userId);
+        info.setConsigneeId(verifyUser);
+        info.setViewStatus(false);
+        info.setJumpPath("b1-inspect-order-plan");
+        informationNotificationService.addInformationNotification(info);
+        //澶嶆牳浜�--妫�楠屽崟鐩稿叧璐熻矗浜�
+        InsSampleUser insSampleUser = new InsSampleUser();
+        insSampleUser.setUserId(verifyUser);
+        insSampleUser.setInsSampleId(orderId);
+        insSampleUser.setState(1);
+        insSampleUser.setSonLaboratory(laboratory);
+        insSampleUserMapper.insert(insSampleUser);
+        /*鏍¢獙涓�涓媟esult琛�*/
+        CompletableFuture.supplyAsync(() -> {
+            List<Integer> ips = insProducts.stream().map(InsProduct::getId).distinct().collect(Collectors.toList());
+            for (Integer ip : ips) {
+                List<InsProductResult> insProductResults = insProductResultMapper.selectList(Wrappers.<InsProductResult>lambdaQuery()
+                        .eq(InsProductResult::getInsProductId, ip));
+                if (insProductResults.size() > 1) {
+                    for (int i = 1; i < insProductResults.size(); i++) {
+                        insProductResultMapper.deleteById(insProductResults.get(i));
+                    }
+                }
+            }
+            return null;
+        });
+        // 鍒犻櫎鏁伴噰閲囬泦娆℃暟
+        String key = "frequency" + ":" + entrustCode + ":*";
+        RedisUtil.delsLike(key);
+        return 1;
+    }
+
+    @Override
+    public List<String> getEquipName(Integer orderId,String sonLaboratory) {
+        List<Integer> ids = insSampleMapper.selectList(new LambdaQueryWrapper<InsSample>()
+                        .eq(InsSample::getInsOrderId, orderId))
+                .stream()
+                .map(InsSample::getId)
+                .collect(Collectors.toList());
+        // 鏌ョ湅鍗曞瓙鏄惁閫夋嫨浜嗚澶�
+        List<String> strList = new ArrayList<>();
+        HashSet<String> set = new HashSet<>();
+        List<InsProduct> productList = insProductMapper.selectList(new LambdaQueryWrapper<InsProduct>()
+                .in(InsProduct::getInsSampleId, ids)
+                .eq(InsProduct::getSonLaboratory, sonLaboratory)
+                .eq(InsProduct::getState, 1));
+        if (CollectionUtils.isNotEmpty(productList)) {
+            List<InsProduct> collect = productList.stream()
+                    .filter(item -> Objects.isNull(item.getSpecialItemParentId()) || StringUtils.isEmpty(item.getSpecialItemParentId()+""))
+                    .collect(Collectors.toList());
+            for (InsProduct product : collect) {
+                InsProductResult insProductResult = insProductResultMapper.selectOne(new LambdaQueryWrapper<InsProductResult>()
+                        .eq(InsProductResult::getInsProductId, product.getId()));
+                if(Objects.nonNull(insProductResult)){
+                    if(Objects.isNull(insProductResult.getEquipName()) || StringUtils.isEmpty(insProductResult.getEquipName())) {
+                        strList.add(product.getInspectionItem() + " " + product.getInspectionItemSubclass());
+                    }else {
+                        List<Map> maps = JSONArray.parseArray(insProductResult.getEquipName(), Map.class);
+                        if(CollectionUtils.isNotEmpty(maps)) {
+                            List<Map> mapList = maps.stream().filter(item -> StringUtils.isEmpty(item.get("v") + "")).collect(Collectors.toList());
+                            if(mapList.size() == maps.size()) {
+                                strList.add(product.getInspectionItem() + " " + product.getInspectionItemSubclass());
+                            }
+//                            for (Map map : maps) {
+//                                if(StringUtils.isEmpty(map.get("v")+"")){
+//                                    strList.add(product.getInspectionItem() + " " + product.getInspectionItemSubclass());
+//                                }
+//                            }
+                        }else {
+                            strList.add(product.getInspectionItem() + " " + product.getInspectionItemSubclass());
+                        }
+                    }
+                }
+            }
+        }
+
+        return strList.stream().distinct().collect(Collectors.toList());
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
+    public int saveInsContext2(InsProductResultDTO insProductResult) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        try {
+            //妫�楠岀粨鏋�
+            Map<String,Object> insValueMap = JackSonUtil.unmarshal(insProductResult.getInsValue(), Map.class);
+            //saveInsContext2鏂规硶鏈夊涓ā鏉胯皟鐢紝闇�鏍规嵁妯℃澘鍚嶇О鍒嗗紑澶勭悊
+            switch (insProductResult.getTemplateName()){
+                case "鏋剁┖鍦扮嚎搴斿姏搴斿彉":
+                    //淇濆瓨寮规�фā閲忓拰妫�楠岀粨璁�
+                    if(Objects.nonNull(insValueMap.get("elasticityModulus"))){
+                        String elasticityModulus = insValueMap.get("elasticityModulus").toString();
+                        insProductMapper.update(null,Wrappers.<InsProduct>lambdaUpdate()
+                                .set(InsProduct::getInsResult,3)//缁撹璁句负涓嶅垽瀹�
+                                .set(InsProduct::getElasticityModulus,elasticityModulus)
+                                .eq(InsProduct::getId,insProductResult.getInsProductId())
+                        );
+                    }
+                    //鍒犻櫎寮规�фā閲弅ey
+                    insValueMap.remove("elasticityModulus");
+                    insProductResult.setInsValue(JackSonUtil.marshal(insValueMap));
+                    break;
+                case "鐤插姵璇曢獙":
+                    //淇濆瓨妫�楠岀粨鏋�
+                    if(Objects.nonNull(insValueMap.get("damage"))){
+                        String damage = insValueMap.get("damage").toString();
+                        Integer insResult = "绗﹀悎".equals(damage)?1:0;
+                        insProductMapper.update(null,Wrappers.<InsProduct>lambdaUpdate()
+                                .set(InsProduct::getInsResult,insResult)
+                                .set(InsProduct::getLastValue,damage)
+                                .eq(InsProduct::getId,insProductResult.getInsProductId())
+                        );
+                    }
+                    break;
+            }
+            List<InsProductResult> oldResults = new ArrayList<>();
+            InsProductResult insProductResult1 = insProductResultMapper.selectOne(new LambdaQueryWrapper<InsProductResult>().eq(InsProductResult::getInsProductId, insProductResult.getInsProductId()));
+            //鏂板鎴栨洿鏂版楠岃褰�
+            if (ObjectUtils.isNull(insProductResult1)){
+                insProductResultMapper.insert(insProductResult);
+            }else {
+                insProductResult.setId(insProductResult1.getId());
+                oldResults.add(insProductResult1);
+                insProductResultMapper.updateById(insProductResult);
+            }
+            //娣诲姞宸ユ椂璁板綍
+            InsOrder insOrder = insOrderMapper.selectById(insProductResult.getOrderId());
+            InsSample insSample = insSampleMapper.selectById(insProductResult.getSampleId());
+            InsProduct insProduct = insProductMapper.selectById(insProductResult.getInsProductId());
+            InsProductResult newInsResult = new InsProductResult();
+            BeanUtil.copyProperties(insProductResult,newInsResult);
+            WorkTimeDTO workTimeDTO = new WorkTimeDTO(userId,insOrder,insSample,insProduct,null,insProductResult.getSampleId(), String.valueOf(insProductResult.getInsProductId()),oldResults ,newInsResult);
+            String jsonStr = JackSonUtil.marshal(workTimeDTO);
+            //璁$畻宸ユ椂
+            //TODO:璇ユ柟娉曠洰鍓嶅彧鏈夌數鍔涚敤锛岄粯璁よ矾鐢变娇鐢ㄧ數鍔涚殑
+            sendQueueMessage(ExchangeConstants.WORK_TIME_EXCHANGE,RouterKeyConstants.DL_KEY,jsonStr);
+        }catch (Exception e){
+            throw new RuntimeException(e);
+        }
+        return 0;
+    }
+
+    // 鑾峰彇涓や釜localDateTime鐨勬瘡涓�澶�
+    public static List<LocalDateTime> getLocalDateTimesBetween(LocalDateTime start, LocalDateTime end) {
+        List<LocalDateTime> localDateTimes = new ArrayList<>();
+        LocalDate currentDate = start.toLocalDate();
+        LocalDateTime currentLocalDateTime = start;
+        while (!currentDate.isAfter(end.toLocalDate())) {
+            localDateTimes.add(currentLocalDateTime);
+            currentLocalDateTime = currentLocalDateTime.plusDays(1);
+            currentDate = currentDate.plusDays(1);
+        }
+        return localDateTimes;
+    }
+
+    /**
+     * 鏌ヨ妫�楠岄」瀵瑰簲鏍囧噯搴撻厤缃殑宸ユ椂淇℃伅
+     * @param insProduct
+     * @return
+     */
+    public StandardProductVO getInspectWorkHourAndGroup(InsProduct insProduct){
+        StandardProductVO standardProductVO = new StandardProductVO();
+        if(!Objects.isNull(insProduct)){
+            //鏌ヨ瀵瑰簲鏍囧噯搴�
+            List<StandardProductVO> productVO = standardProductListMapper.getStandardProductByInsProduct(
+                    insProduct.getLaboratory(),
+                    insProduct.getSampleType(),
+                    insProduct.getSample(),
+                    insProduct.getModel(),
+                    insProduct.getInspectionItem(),
+                    insProduct.getInspectionItemSubclass(),
+                    insProduct.getSonLaboratory(),
+                    insProduct.getStandardMethodListId());
+            if(!productVO.isEmpty()){
+                standardProductVO = productVO.get(0);
+            }
+            //鏈夊尯闂寸殑妫�楠岄」锛屽彇妫�楠岄」瀛樼殑宸ユ椂淇℃伅
+            if(StringUtils.isNotBlank(insProduct.getSection()) && StringUtils.isNotBlank(standardProductVO.getSection())){
+                try {
+                    ObjectMapper objectMapper = new ObjectMapper();
+                    //鍖洪棿璁剧疆
+                    List<String> sectionList = (List<String>)objectMapper.readValue(standardProductVO.getSection(), List.class);
+                    //閫変腑鍖洪棿鐨勪笅鏍�
+                    int i = sectionList.indexOf(insProduct.getSection());
+                    //鑾峰彇瀵瑰簲涓嬫爣鐨勫伐鏃跺拰宸ユ椂鍒嗙粍
+                    List<Double> hourList = (List<Double>)objectMapper.readValue(standardProductVO.getManHour(), List.class);
+                    standardProductVO.setManHour(String.valueOf(hourList.get(i)));
+                } catch (JsonProcessingException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        }
+        return standardProductVO;
+    }
+
+    public static String getWeek(String dayStr) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        try {
+            Date date = sdf.parse(dayStr);
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(date);
+            int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
+            int day = calendar.get(Calendar.DAY_OF_MONTH);
+            return getWeekDay(dayOfWeek);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+    public static String getWeekDay(int dayOfWeek) {
+        switch (dayOfWeek) {
+            case Calendar.MONDAY:
+                return "鍛ㄤ竴";
+            case Calendar.TUESDAY:
+                return "鍛ㄤ簩";
+            case Calendar.WEDNESDAY:
+                return "鍛ㄤ笁";
+            case Calendar.THURSDAY:
+                return "鍛ㄥ洓";
+            case Calendar.FRIDAY:
+                return "鍛ㄤ簲";
+            case Calendar.SATURDAY:
+                return "鍛ㄥ叚";
+            case Calendar.SUNDAY:
+                return "鍛ㄦ棩";
+            default:
+                return "鏈煡";
+        }
+    }
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/impl/InsReportServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/InsReportServiceImpl.java
new file mode 100644
index 0000000..fd71352
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/InsReportServiceImpl.java
@@ -0,0 +1,942 @@
+package com.ruoyi.requier.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.aspose.words.Document;
+import com.aspose.words.License;
+import com.aspose.words.SaveFormat;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.data.FilePictureRenderData;
+import com.itextpdf.text.BadElementException;
+import com.itextpdf.text.DocumentException;
+import com.itextpdf.text.pdf.PdfContentByte;
+import com.itextpdf.text.pdf.PdfReader;
+import com.itextpdf.text.pdf.PdfStamper;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.dto.ReportPageDto;
+import com.ruoyi.inspect.mapper.InsOrderMapper;
+import com.ruoyi.inspect.mapper.InsOrderStateMapper;
+import com.ruoyi.inspect.mapper.InsReportApproveConfigMapper;
+import com.ruoyi.inspect.mapper.InsReportMapper;
+import com.ruoyi.inspect.pojo.InsOrder;
+import com.ruoyi.inspect.pojo.InsOrderState;
+import com.ruoyi.inspect.pojo.InsReport;
+import com.ruoyi.process.mapper.ProcessReportMapper;
+import com.ruoyi.process.pojo.ProcessReport;
+import com.ruoyi.requier.service.InsReportService;
+import com.ruoyi.system.mapper.UserMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.util.Strings;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.imageio.ImageIO;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.stream.Collectors;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipOutputStream;
+
+/**
+ * @author Administrator
+ * @description 閽堝琛ㄣ�恑ns_report(妫�楠屾姤鍛�)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+ * @createDate 2024-03-17 22:10:02
+ */
+@Service
+@Slf4j
+public class InsReportServiceImpl extends ServiceImpl<InsReportMapper, InsReport>
+        implements InsReportService {
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Resource
+    private InsReportMapper insReportMapper;
+
+    @Resource
+    ProcessReportMapper processReportMapper;
+
+    @Value("${wordUrl}")
+    private String wordUrl;
+
+    @Value("${file.licenseUrl}")
+    private String licenseUrl;
+
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Resource
+    private InsOrderMapper insOrderMapper;
+
+    @Resource
+    private RedisTemplate<String, Object> redisTemplate;
+
+    @Resource
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+
+    @Resource
+    private InsOrderStateMapper insOrderStateMapper;
+
+    private static final String SYNC_REPORT_KEY_PREFIX = "syncApprovalReport_lock_";
+
+    @Resource
+    private InsReportApproveConfigMapper insReportApproveConfigMapper;
+
+    @Override
+    public IPage<ReportPageDto> pageInsReport(Page page, ReportPageDto reportPageDto) {
+        Map<String, Object> map = new HashMap<>();
+        User user = userMapper.selectById(SecurityUtils.getUserId());//褰撳墠鐧诲綍鐨勪汉
+        //鑾峰彇褰撳墠浜烘墍灞炲疄楠屽id
+        String departLimsId = user.getDepartLimsId();
+        String laboratory = null;
+        if (ObjectUtils.isNotEmpty(departLimsId) && !departLimsId.isEmpty()) {
+            String[] split = departLimsId.split(",");
+            //鏌ヨ瀵瑰簲鏋舵瀯鍚嶇О(閫氫俊瀹為獙瀹�,鐢靛姏瀹為獙瀹�,妫�娴嬪姙)
+            String departLims = insOrderMapper.seldepLimsId(Integer.parseInt(split[split.length - 1]));
+            if (departLims.contains("瀹為獙瀹�")) {
+                laboratory = departLims;
+            }
+        }
+        QueryWrapper<ReportPageDto> wrapper = QueryWrappers.queryWrappers(reportPageDto);
+        if(Objects.nonNull(reportPageDto.getCreateTimeRange())){
+            wrapper.gt(reportPageDto.getCreateTimeRange().size()>1,"create_time",reportPageDto.getCreateTimeRange().get(0))
+                    .lt(reportPageDto.getCreateTimeRange().size()>1,"create_time",reportPageDto.getCreateTimeRange().get(1));
+        }
+        return insReportMapper.pageInsReport(page, wrapper ,laboratory);
+    }
+
+    @Override
+    public int inReport(String url, Integer id) {
+        InsReport insReport = new InsReport();
+        insReport.setId(id);
+        insReport.setUrlS(url);
+        return insReportMapper.updateById(insReport);
+    }
+
+    // 杩樺師
+    @Override
+    public int upReportUrl(Integer id) {
+        InsReport insReport = insReportMapper.selectById(id);
+        String fileName = insReport.getUrlS().replace("/word/", "");
+        if(Strings.isNotEmpty(fileName)) {
+            String path = wordUrl + File.separator + fileName;
+            File file = new File(path);
+            if (file.exists()) {
+                file.delete();
+            }
+        }
+        return insReportMapper.update(null, Wrappers.<InsReport>lambdaUpdate().eq(InsReport::getId, id).set(InsReport::getUrlS, null));
+    }
+
+    @Override
+    public void downReport(Integer id,Integer type, HttpServletResponse response) {
+        InsReport insReport = insReportMapper.selectById(id);
+        String url = "";
+        // 0 涓嬭浇docx 1 涓嬭浇pdf
+        if(type == 0) {
+          url  = Strings.isNotEmpty(insReport.getUrlS()) ? insReport.getUrlS() : insReport.getUrl();
+        }else {
+            url = insReport.getTempUrlPdf();
+        }
+        if(Strings.isEmpty(url)){
+            throw new ErrorException("鎶ュ憡鍦板潃涓虹┖");
+        }
+        File file = new File(wordUrl + File.separator + url.replace("/word/", ""));
+        try {
+            String fileName = file.getName();
+            if(fileName.indexOf("_") != -1) {
+                fileName = fileName.split("_")[1];
+            }
+            fileName = URLEncoder.encode(fileName, "UTF-8");
+            response.setContentType("application/octet-stream");
+            response.setHeader("Content-disposition","attachment;filename=" + fileName);
+            ServletOutputStream stream = response.getOutputStream();
+            FileInputStream fileInputStream = new FileInputStream(file);
+            byte[] bytes = new byte[1024];
+            int byteRead;
+            while((byteRead = fileInputStream.read(bytes)) != -1){
+                stream.write(bytes, 0, byteRead);
+                stream.flush();
+            }
+            fileInputStream.close();
+            stream.close();
+        }catch (Exception e){
+            throw new ErrorException("涓嬭浇澶辫触");
+        }
+    }
+
+
+
+
+
+    //鎻愪氦
+    @Override
+    public int writeReport(Integer id) {
+        InsReport insReport = insReportMapper.selectById(id);
+        insReport.setId(id);
+        insReport.setState(1);
+        insReport.setWriteTime(LocalDateTime.now());//鎻愪氦鏃堕棿
+        insReport.setWriteUserId(SecurityUtils.getUserId().intValue());//鎻愪氦浜�
+        //鑾峰彇鎻愪氦浜虹殑绛惧悕鍦板潃
+        String signatureUrl;
+        try {
+            signatureUrl = userMapper.selectById(SecurityUtils.getUserId().intValue()).getSignatureUrl();
+        } catch (Exception e) {
+            throw new ErrorException("鎵句笉鍒扮紪鍒朵汉鐨勭鍚�");
+        }
+        //绯荤粺鐢熸垚鎶ュ憡鍦板潃
+        String url = insReport.getUrl();
+        //鎵嬪姩涓婁紶鎶ュ憡鍦板潃
+        String urlS = insReport.getUrlS();
+        wordInsertUrl(new HashMap<String, Object>() {{
+            put("writeUrl", new FilePictureRenderData(100,50,imgUrl + "/" + signatureUrl));
+        }}, (urlS == null ? url : urlS).replace("/word", wordUrl));
+        // 淇敼涓存椂pdf
+        String tempUrlPdf = wordToPdfTemp((StrUtil.isBlank(urlS) ? url : urlS).replace("/word", wordUrl));
+        insReport.setTempUrlPdf("/word/" + tempUrlPdf);
+        return insReportMapper.updateById(insReport);
+    }
+
+    //瀹℃牳
+    @Override
+    public int examineReport(Integer id, Integer isExamine, String examineTell) {
+        InsReport insReport = insReportMapper.selectById(id);
+        insReport.setIsExamine(isExamine);
+        if (ObjectUtils.isNotEmpty(examineTell)) {
+            insReport.setExamineTell(examineTell);
+        }
+        insReport.setExamineUserId(SecurityUtils.getUserId().intValue());//瀹℃牳浜�
+        insReport.setExamineTime(LocalDateTime.now());//瀹℃牳鏃堕棿
+        if (isExamine == 0) {
+            //濡傛灉瀹℃牳涓嶉�氳繃
+            insReport.setState(0);//鎻愪氦鐘舵�佹敼涓哄緟鎻愪氦
+            return insReportMapper.updateById(insReport);
+        }
+        //鑾峰彇瀹℃牳浜虹殑绛惧悕鍦板潃
+        String signatureUrl;
+        try {
+            signatureUrl = userMapper.selectById(insReport.getExamineUserId()).getSignatureUrl();
+        } catch (Exception e) {
+            throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+        }
+        //绯荤粺鐢熸垚鎶ュ憡鍦板潃
+        String url = insReport.getUrl();
+        //鎵嬪姩涓婁紶鎶ュ憡鍦板潃
+        String urlS = insReport.getUrlS();
+        wordInsertUrl(new HashMap<String, Object>() {{
+            put("examineUrl", new FilePictureRenderData(100,50,imgUrl + "/" + signatureUrl));
+        }}, (urlS == null ? url : urlS).replace("/word", wordUrl));
+        // 淇敼涓存椂pdf
+        String tempUrlPdf = wordToPdfTemp((StrUtil.isBlank(urlS) ? url : urlS).replace("/word", wordUrl));
+        insReport.setTempUrlPdf("/word/" + tempUrlPdf);
+        return insReportMapper.updateById(insReport);
+    }
+
+    //鎵瑰噯
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int ratifyReport(Integer id, Integer isRatify, String ratifyTell) {
+        InsReport insReport = insReportMapper.selectById(id);
+        insReport.setIsRatify(isRatify);
+        if (ObjectUtils.isNotEmpty(ratifyTell)) {
+            insReport.setRatifyTell(ratifyTell);
+        }
+        insReport.setRatifyUserId(SecurityUtils.getUserId().intValue());//鎵瑰噯浜�
+        insReport.setRatifyTime(LocalDateTime.now());//鎵瑰噯鏃堕棿
+        if (isRatify == 0) {
+            //濡傛灉鎵瑰噯涓嶉�氳繃
+            insReport.setState(0);//鎻愪氦鐘舵�佹敼涓哄緟鎻愪氦
+            return insReportMapper.updateById(insReport);
+        }
+        //鑾峰彇鎵瑰噯浜虹殑绛惧悕鍦板潃
+        String signatureUrl;
+        try {
+            signatureUrl = userMapper.selectById(insReport.getRatifyUserId()).getSignatureUrl();
+        } catch (Exception e) {
+            throw new ErrorException("鎵句笉鍒版壒鍑嗕汉鐨勭鍚�");
+        }
+        //鑾峰彇鍦烘墍鐨勬姤鍛婁笓鐢ㄧ珷
+        String sealUrl;
+        try {
+            String laboratory = insOrderMapper.selectById(insReport.getInsOrderId()).getLaboratory();
+            sealUrl = insReportMapper.getLaboratoryByName(laboratory);
+        } catch (Exception e) {
+            throw new ErrorException("鎵句笉鍒版姤鍛婁笓鐢ㄧ珷");
+        }
+        if (sealUrl == null) throw new ErrorException("鎵句笉鍒版姤鍛婁笓鐢ㄧ珷");
+        //绯荤粺鐢熸垚鎶ュ憡鍦板潃
+        String url = insReport.getUrl();
+        //鎵嬪姩涓婁紶鎶ュ憡鍦板潃
+        String urlS = insReport.getUrlS();
+        String finalUrl = (urlS == null ? url : urlS).replace("/word", wordUrl);
+        wordInsertUrl(new HashMap<String, Object>() {{
+            put("ratifyUrl", new FilePictureRenderData(100,50,imgUrl + "/" + signatureUrl));
+            put("seal1", new FilePictureRenderData(600,600,imgUrl + "/" + sealUrl));
+            put("seal2", new FilePictureRenderData(600,600,imgUrl + "/" + sealUrl));
+        }}, finalUrl);
+        wordToPdf(finalUrl, sealUrl);
+
+        InsOrder insOrder = new InsOrder();
+        insOrder.setId(insReportMapper.selectById(id).getInsOrderId());
+        insOrder.setState(4);
+        insOrderMapper.updateById(insOrder);
+        // 淇敼涓存椂pdf
+        String tempUrlPdf = wordToPdfTemp((StrUtil.isBlank(urlS) ? url : urlS).replace("/word", wordUrl));
+        insReport.setTempUrlPdf("/word/" + tempUrlPdf);
+        /*鏂板cnas7.8鎶ュ憡缁撴灉*/
+        ProcessReport processReport = new ProcessReport();
+        processReport.setInsReportCode(insReport.getCode());
+        processReportMapper.insert(processReport);
+        return insReportMapper.updateById(insReport);
+    }
+
+    @Override
+    public int wordInsertUrl(Map<String, Object> map, String url) {
+        XWPFTemplate template = XWPFTemplate.compile(url).render(map);
+        try {
+            template.writeAndClose(Files.newOutputStream(Paths.get(url)));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return 1;
+    }
+
+    //鎶ュ憡鎵归噺涓嬭浇
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String downAll(String ids) {
+        List<Long> list = Arrays.stream(ids.split(",")).map(Long::parseLong).collect(Collectors.toList());
+        List<InsReport> insReports = insReportMapper.selectBatchIds(list);
+        String zipFilePath = null;
+        // 涓存椂鏂囦欢澶硅矾寰�
+        try {
+            String tempFolderPath = wordUrl + "/tempFolder";
+            File tempFolder = new File(tempFolderPath);
+            if (tempFolder.exists()) {
+                deleteDirectory(tempFolder); // 鍒犻櫎鏃х殑涓存椂鏂囦欢澶�
+            }
+            tempFolder.mkdirs(); // 鍒涘缓鏂扮殑涓存椂鏂囦欢澶�
+            for (InsReport insReport : insReports) {
+                File sourceFile = new File((ObjectUtils.isNotEmpty(insReport.getUrlS()) ? insReport.getUrlS() : insReport.getUrl()).replace("/word", wordUrl));
+                // 涓嬭浇鏂囦欢鍚嶇О鍘婚櫎鏃堕棿
+                String destinationFileName = sourceFile.getName();
+                if(destinationFileName.indexOf("_") != -1) {
+                    destinationFileName = destinationFileName.split("_")[1];
+                }
+                File destinationFile = new File(tempFolder, destinationFileName);
+                Files.copy(sourceFile.toPath(), destinationFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
+            }
+            // 鍘嬬缉涓存椂鏂囦欢澶�
+            zipFilePath = wordUrl + "/zip/output.zip";
+            zipDirectory(tempFolderPath, zipFilePath);
+
+            // 娓呯悊涓存椂鏂囦欢澶�
+            deleteDirectory(tempFolder);
+
+            System.out.println("ZIP鏂囦欢鍒涘缓瀹屾垚锛�");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return "/word/zip/output.zip";
+    }
+
+    //鎵归噺涓婁紶
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int upAll(MultipartFile file) {
+        if (file != null) {
+            // 鏍规嵁鏂囦欢鍚嶆煡璇d
+            String fileName = file.getOriginalFilename();
+            String code = fileName.replace(".docx", "").replace("JCZX", "JCZX/");
+            if(fileName.lastIndexOf("_") != -1) {
+                code = code.substring(file.getOriginalFilename().lastIndexOf("_") + 1);
+            }
+            //鏌ヨ鏈鏍哥殑鎶ュ憡鏁版嵁
+            InsReport insReport = insReportMapper.selectOne(Wrappers.<InsReport>lambdaQuery().eq(InsReport::getCode, code).eq(InsReport::getIsExamine,-9));
+            if (ObjectUtils.isEmpty(insReport)) {
+                throw new ErrorException("娌℃湁缂栧彿涓�" + code + "鐨勬姤鍛婃垨璇ユ姤鍛婂凡瀹℃牳閫氳繃");
+            }
+            // 濡傛灉UrlS鏈夊�� 鍏堝皢璇ユ枃浠跺垹闄�
+            if(Strings.isNotEmpty(insReport.getUrlS())) {
+                String url = wordUrl + File.separator + insReport.getUrlS().replace("/word/", "");
+                File file1 = new File(url);
+                if(file1.exists()) {
+                    file1.delete();
+                }
+            }
+            String urlString;
+            String pathName;
+            String path = wordUrl;
+            File realpath = new File(path);
+            if (!realpath.exists()) {
+                realpath.mkdirs();
+            }
+            pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "_" + insReport.getCode().replace("/", "") + ".docx";
+            urlString = realpath + "/" + pathName;
+            // 澶嶅埗鏂囦欢鍒版寚瀹氳矾寰�
+            try {
+                Files.copy(file.getInputStream(), new File(urlString).toPath(), StandardCopyOption.REPLACE_EXISTING);
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+            inReport("/word/" + pathName, insReport.getId());
+        }
+//        File tempFile = null;
+//        File unzipDir = null;
+//        try {
+//            tempFile = File.createTempFile(wordUrl, ".zip");
+//            file.transferTo(tempFile);
+//
+//            unzipDir = new File("uploaded_files");
+//            if (!unzipDir.exists()) {
+//                unzipDir.mkdir();
+//            }
+//            unzip(tempFile, unzipDir);
+//            // 澶勭悊瑙e帇鍚庣殑鏂囦欢
+//            File[] files = unzipDir.listFiles();
+//            if (files != null) {
+//                for (File f : files) {
+//                    // 鏍规嵁鏂囦欢鍚嶆煡璇d
+//                    String name = f.getName();
+//                    String code = f.getName().replace(".docx", "").replace("JCZX", "JCZX/");
+//                    if(f.getName().lastIndexOf("_") != -1) {
+//                        code = code.substring(f.getName().lastIndexOf("_") + 1);
+//                    }
+//                    //InsReport insReport = insReportMapper.selectOne(Wrappers.<InsReport>lambdaQuery().eq(InsReport::getCode, f.getName().replace(".docx", "").replace("JCZX", "JCZX/")));
+//                    InsReport insReport = insReportMapper.selectOne(Wrappers.<InsReport>lambdaQuery().eq(InsReport::getCode, code));
+//                    if (ObjectUtils.isEmpty(insReport)) {
+//                        throw new ErrorException("娌℃湁鎵惧埌 " + f.getName() + " 杩欎釜鏂囦欢瀵瑰簲鐨勬姤鍛婃暟鎹�");
+//                    }
+//                    // 濡傛灉UrlS鏈夊�� 鍏堝皢璇ユ枃浠跺垹闄�
+//                    if(Strings.isNotEmpty(insReport.getUrlS())) {
+//                        String url = wordUrl + File.separator + insReport.getUrlS().replace("/word/", "");
+//                        File file1 = new File(url);
+//                        if(file1.exists()) {
+//                            file1.delete();
+//                        }
+//                    }
+//                    String urlString;
+//                    String pathName;
+//                    try {
+//                        String path = wordUrl;
+//                        File realpath = new File(path);
+//                        if (!realpath.exists()) {
+//                            realpath.mkdirs();
+//                        }
+//                        pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "_" + insReport.getCode().replace("/", "") + ".docx";
+//                        urlString = realpath + "/" + pathName;
+//                        // 澶嶅埗鏂囦欢鍒版寚瀹氳矾寰�
+//                        Files.copy(f.toPath(), new File(urlString).toPath(), StandardCopyOption.REPLACE_EXISTING);
+//                        inReport("/word/" + pathName, insReport.getId());
+//                    }
+//                    catch (IOException e) {
+//                        throw new ErrorException("鏂囦欢涓婁紶澶辫触");
+//                    }
+//                }
+//            }
+//        } catch (IOException e) {
+//            throw new ErrorException("鏂囦欢澶勭悊澶辫触");
+//        } finally {
+//            if (tempFile != null && tempFile.exists()) {
+//                tempFile.delete();
+//            }
+//            // 閫掑綊鍒犻櫎瑙e帇鐩綍鍙婂叾涓殑鏂囦欢
+//            if (unzipDir.exists()) {
+//                deleteDirectory(unzipDir); // 鍒犻櫎鏃х殑涓存椂鏂囦欢澶�
+//            }
+//        }
+        return 0;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void withdraw(Map<String,Object> map) {
+        Integer id = Integer.parseInt(map.get("id").toString());
+        List<String> list = JSONArray.parseArray(map.get("laboratory").toString(), String.class);
+        Integer insOrderId = insReportMapper.selectById(id).getInsOrderId();
+        List<InsOrderState> insOrderStateS = insOrderStateMapper.selectList(new LambdaQueryWrapper<InsOrderState>()
+                .eq(InsOrderState::getInsOrderId, insOrderId)
+                .in(CollectionUtils.isNotEmpty(list),InsOrderState::getLaboratory, list));
+        if(CollectionUtils.isNotEmpty(insOrderStateS)) {
+            List<Integer> collect = insOrderStateS.stream().map(InsOrderState::getId).collect(Collectors.toList());
+            // 淇敼璇ュ崟瀛愯瘯楠屽鐨勭姸鎬佷负寰呭鏍革紝鍒犻櫎鎶ュ憡淇℃伅
+            insOrderStateMapper.update(null,new LambdaUpdateWrapper<InsOrderState>()
+                    .set(InsOrderState::getInsState,3) // 寰呭鏍�
+                    .in(InsOrderState::getId,collect));
+            insReportMapper.delete(new LambdaQueryWrapper<InsReport>().eq(InsReport::getId,id));
+        }
+    }
+
+    @Override
+    public List<Map<String, Object>> getLaboratoryByReportId(Integer id) {
+        List<Map<String, Object>> list = new ArrayList<>();
+        Integer insOrderId = insReportMapper.selectById(id).getInsOrderId();
+        insOrderStateMapper.selectList(new LambdaQueryWrapper<InsOrderState>()
+                .eq(InsOrderState::getInsOrderId,insOrderId))
+                .forEach(insOrderState -> {
+                    Map<String, Object> map = new HashMap<>();
+                    map.put("label",insOrderState.getLaboratory());
+                    map.put("value",insOrderState.getLaboratory());
+                    list.add(map);
+                });
+        return list;
+    }
+
+    @Override
+    public Map<String, Object> getReportCountInfo(ReportPageDto reportPageDto) {
+        HashMap<String, Object> map = new HashMap<>();
+        User user = userMapper.selectById(SecurityUtils.getUserId());//褰撳墠鐧诲綍鐨勪汉
+        //鑾峰彇褰撳墠浜烘墍灞炲疄楠屽id
+        String departLimsId = user.getDepartLimsId();
+        String laboratory = null;
+        if (ObjectUtils.isNotEmpty(departLimsId) && !departLimsId.isEmpty()) {
+            String[] split = departLimsId.split(",");
+            //鏌ヨ瀵瑰簲鏋舵瀯鍚嶇О(閫氫俊瀹為獙瀹�,鐢靛姏瀹為獙瀹�,妫�娴嬪姙)
+            String departLims = insOrderMapper.seldepLimsId(Integer.parseInt(split[split.length - 1]));
+            if (departLims.contains("瀹為獙瀹�")) {
+                laboratory = departLims;
+            }
+        }
+        QueryWrapper<ReportPageDto> wrapper = QueryWrappers.queryWrappers(reportPageDto);
+        if(Objects.nonNull(reportPageDto.getCreateTimeRange())){
+            wrapper.gt(reportPageDto.getCreateTimeRange().size()>1,"create_time",reportPageDto.getCreateTimeRange().get(0))
+                    .lt(reportPageDto.getCreateTimeRange().size()>1,"create_time",reportPageDto.getCreateTimeRange().get(1));
+
+        }
+        map.put("unSubmitCount",insReportMapper.findReportCountInfo(wrapper,laboratory,"ir.write_user_id").size());
+        map.put("unExamineCount",insReportMapper.findReportCountInfo(wrapper,laboratory,"ir.is_examine").size());
+        map.put("unRatifyCount",insReportMapper.findReportCountInfo(wrapper,laboratory,"ir.is_ratify").size());
+        return map;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void batchApprovalReport(List<Integer> ids) {
+        redisTemplate.setKeySerializer(new StringRedisSerializer());
+        Integer userId = SecurityUtils.getUserId().intValue();
+        String key = SYNC_REPORT_KEY_PREFIX+userId;
+        //鎵ц鍓嶅垹闄や箣鍓嶇殑keys
+        deleteRedisKeys(key);
+        synchronized (key) {
+            redisTemplate.opsForValue().set(key,1);
+            RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(),true);
+            //寮傛鎵ц瀹℃壒鎿嶄綔
+            CompletableFuture.runAsync(() -> {
+                try {
+                    runBatchApproval(ids,key);
+                }catch (Exception e){
+                    //鍒犻櫎key
+                    deleteRedisKeys(key);
+                    redisTemplate.opsForValue().set(key+"_exception",e.getMessage());
+                }
+            },threadPoolTaskExecutor);
+        }
+    }
+
+    /**
+     * 鍒犻櫎redis key
+     * @param key
+     */
+    private void deleteRedisKeys(String key){
+        redisTemplate.delete(key);
+        redisTemplate.delete(key+"_num");
+        redisTemplate.delete(key+"_count");
+        redisTemplate.delete(key+"_surplus");
+        redisTemplate.delete(key+"_exception");
+    }
+
+    /**
+     * 鎵ц瀹℃壒鎿嶄綔
+     * @param ids 鎶ュ憡id鍒楄〃
+     */
+    private void runBatchApproval(List<Integer> ids,String keyPrefix) {
+        if(ids.isEmpty()){
+            return;
+        }
+        long start = System.currentTimeMillis();
+        String surplusKey = keyPrefix + "_surplus";//鍓╀綑鏉℃暟
+        String numKey = keyPrefix + "_num";//鎬昏繘搴�
+        String countKey = keyPrefix + "_count";//鎬绘潯鏁�
+        redisTemplate.opsForValue().set(countKey, ids.size());
+        redisTemplate.opsForValue().set(surplusKey, ids.size());
+        Object countObj = redisTemplate.opsForValue().get(countKey);
+        long parsed2 = Long.parseLong(String.valueOf(countObj));
+        AtomicLong count = new AtomicLong(parsed2);
+        for (Integer id : ids) {
+            //涓氬姟浠g爜
+            InsReport insReport = insReportMapper.selectById(id);
+            String laboratory = insOrderMapper.selectById(insReport.getInsOrderId()).getLaboratory();
+            //鑾峰彇绛惧悕鍜屽嵃绔�
+            String sealUrl;
+            String writeUrl;
+            String examineUrl;
+            String ratifyUrl;
+            int writeId;
+            int examineId;
+            int ratifyId;
+            try {
+                sealUrl = insReportMapper.getLaboratoryByName(laboratory);//鍗扮珷
+                Map<String,Object> urlMap = insReportApproveConfigMapper.selectApprovalConfigByLaboratory(laboratory);//绛惧悕
+                writeUrl = imgUrl + "/" + (Objects.isNull(urlMap.get("writeUrl"))?"":urlMap.get("writeUrl").toString());//缂栧埗浜虹鍚島rl
+                examineUrl = imgUrl + "/" +  (Objects.isNull(urlMap.get("examineUrl"))?"":urlMap.get("examineUrl").toString());//瀹℃牳浜虹鍚島rl
+                ratifyUrl = imgUrl + "/" +  (Objects.isNull(urlMap.get("ratifyUrl"))?"":urlMap.get("ratifyUrl").toString());//鎵瑰噯浜虹鍚島rl
+                writeId = Integer.parseInt(urlMap.get("writeId").toString());//缂栧埗浜�
+                examineId = Integer.parseInt(urlMap.get("examineId").toString());//瀹℃牳浜虹
+                ratifyId =Integer.parseInt(urlMap.get("ratifyId").toString());//鎵瑰噯浜�
+            } catch (Exception e) {
+                throw new ErrorException("鎵句笉鍒扮鍚嶅拰鍗扮珷");
+            }
+            //璁剧疆鎶ュ憡淇℃伅
+            insReport.setIsExamine(1);
+            insReport.setIsRatify(1);
+            insReport.setState(1);
+            insReport.setWriteUserId(writeId);
+            insReport.setExamineUserId(examineId);
+            insReport.setRatifyUserId(ratifyId);
+            if(Objects.isNull(insReport.getWriteTime())){
+                insReport.setWriteTime(LocalDateTime.now());
+            }
+            if(Objects.isNull(insReport.getExamineTime())){
+                insReport.setExamineTime(LocalDateTime.now());
+            }
+            if(Objects.isNull(insReport.getRatifyTime())){
+                insReport.setRatifyTime(LocalDateTime.now());
+            }
+            //鏇存柊璁㈠崟鐘舵��
+            InsOrder insOrder = new InsOrder();
+            insOrder.setId(insReport.getInsOrderId());
+            insOrder.setState(4);
+            insOrderMapper.updateById(insOrder);
+            //绯荤粺鐢熸垚鎶ュ憡鍦板潃
+            String url = insReport.getUrl();
+            //鎵嬪姩涓婁紶鎶ュ憡鍦板潃
+            String urlS = insReport.getUrlS();
+            String finalUrl = (StringUtils.isBlank(urlS) ? url : urlS).replace("/word", wordUrl);
+            wordInsertUrl(new HashMap<String, Object>() {{
+                put("writeUrl", new FilePictureRenderData(100,50,writeUrl));
+                put("examineUrl", new FilePictureRenderData(100,50,examineUrl));
+                put("ratifyUrl", new FilePictureRenderData(100,50,ratifyUrl));
+                put("seal1", new FilePictureRenderData(600,600,imgUrl + "/" +sealUrl));
+                put("seal2", new FilePictureRenderData(600,600,imgUrl + "/" +sealUrl));
+            }}, finalUrl);
+            wordToPdf(finalUrl, sealUrl);
+            // 淇敼涓存椂pdf
+            String tempUrlPdf = wordToPdfTemp((StrUtil.isBlank(urlS) ? url : urlS).replace("/word", wordUrl));
+            insReport.setTempUrlPdf("/word/" + tempUrlPdf);
+            //鏇存柊鎶ュ憡鐘舵��
+            insReportMapper.updateById(insReport);
+            //鏇存柊redis鐨刱ey
+            Object o = redisTemplate.opsForValue().get(numKey);
+            if (Objects.isNull(o)) {
+                redisTemplate.opsForValue().set(numKey, 1);
+            } else {
+                long parsed = Long.parseLong(String.valueOf(o));
+                redisTemplate.opsForValue().set(numKey, parsed + 1);
+            }
+            redisTemplate.opsForValue().set(surplusKey, count.decrementAndGet());
+        }
+        long end = System.currentTimeMillis();
+        long useTime = (end-start)/1000;
+        log.info("绾跨▼{}鎶ュ憡瀹℃壒缁撴潫锛岃�楁椂:{}s",keyPrefix,useTime);
+    }
+
+    @Override
+    public Map<String, Object> getBatchApprovalProgress() {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        String key = SYNC_REPORT_KEY_PREFIX + userId;
+        Map<String, Object> map = new HashMap<>();
+        map.put("hasProgress",false);
+        map.put("hasNum",0);
+        map.put("hasCount",0);
+        map.put("surplus",0);
+        Object o = redisTemplate.opsForValue().get(key);
+        if(Objects.nonNull(o)){
+            map.put("hasProgress",true);
+        }
+        Object o1 = redisTemplate.opsForValue().get(key+"_num");
+        Object o2 = redisTemplate.opsForValue().get(key+"_count");
+        Object surplus = redisTemplate.opsForValue().get(key+"_surplus");
+        Object exception = redisTemplate.opsForValue().get(key+"_exception");
+        if(Objects.nonNull(surplus)){
+            map.put("surplus",surplus);
+        }
+        if (Objects.nonNull(o1)&&Objects.nonNull(o2)){
+            //寰楀埌杩涘害
+            BigDecimal multiply = new BigDecimal(String.valueOf(o1)).divide(new BigDecimal(String.valueOf(o2)), 2,BigDecimal.ROUND_DOWN).multiply(BigDecimal.valueOf(100));
+            map.put("hasNum",multiply);
+            map.put("hasCount",Long.parseLong(String.valueOf(o2)));
+        }
+        map.put("hasException",exception);
+        return map;
+    }
+
+    //瑙e帇鏂囦欢澶�
+    private void unzip(File zipFile, File destDir) throws IOException {
+        try (ZipFile zip = new ZipFile(zipFile)) {
+            Enumeration<? extends ZipEntry> entries = zip.entries();
+            while (entries.hasMoreElements()) {
+                ZipEntry entry = entries.nextElement();
+                File file = new File(destDir, entry.getName());
+                if (entry.isDirectory()) {
+                    file.mkdirs();
+                } else {
+                    file.getParentFile().mkdirs();
+                    try (InputStream in = zip.getInputStream(entry);
+                         OutputStream out = new FileOutputStream(file)) {
+                        byte[] buffer = new byte[1024];
+                        int len;
+                        while ((len = in.read(buffer)) > 0) {
+                            out.write(buffer, 0, len);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    // 鍘嬬缉鏂囦欢澶�
+    public static void zipDirectory(String sourceDirPath, String zipFilePath) throws IOException {
+        try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFilePath))) {
+            Path sourceDir = Paths.get(sourceDirPath);
+            Files.walk(sourceDir)
+                    .filter(path -> !Files.isDirectory(path))
+                    .forEach(path -> {
+                        ZipEntry zipEntry = new ZipEntry(sourceDir.relativize(path).toString());
+                        try {
+                            zipOut.putNextEntry(zipEntry);
+                            Files.copy(path, zipOut);
+                            zipOut.closeEntry();
+                        } catch (IOException e) {
+                            e.printStackTrace();
+                        }
+                    });
+        }
+    }
+
+    // 鍒犻櫎鏂囦欢澶瑰強鍏跺唴瀹�
+    public static void deleteDirectory(File directory) throws IOException {
+        if (directory.isDirectory()) {
+            File[] files = directory.listFiles();
+            if (files != null) {
+                for (File file : files) {
+                    deleteDirectory(file);
+                }
+            }
+        }
+        Files.delete(directory.toPath());
+    }
+
+    /**
+     * word杞崲pdf
+     * @param path
+     * @return
+     */
+    public String wordToPdfTemp(String path) {
+        try {
+            return wordToPdf(path, path.replace(".docx", ".pdf"));
+        } catch (Exception e) {
+            throw new ErrorException("杞崲澶辫触");
+        }
+    }
+
+    public String wordToPdf(String wordPath, String pdfPath) {
+        FileOutputStream os = null;
+        try {
+            //鍑瘉 涓嶇劧鍒囨崲鍚庢湁姘村嵃
+            InputStream is = Files.newInputStream(new File(licenseUrl).toPath());
+            License license = new License();
+            license.setLicense(is);
+            if (!license.getIsLicensed()) {
+                System.out.println("License楠岃瘉涓嶉�氳繃...");
+                return null;
+            }
+            //鐢熸垚涓�涓┖鐨凱DF鏂囦欢
+            File file;
+            //鍒ゆ柇鏄惁鏄繘鍘傛姤鍛�
+            file = new File(pdfPath);
+            os = new FileOutputStream(file);
+            //瑕佽浆鎹㈢殑word鏂囦欢
+            Document doc = new Document(wordPath);
+            doc.save(os, SaveFormat.PDF);
+            String name = file.getName();
+            return file.getName();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (os != null) {
+                try {
+                    os.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return null;
+    }
+
+//    @Override
+//    public void wordToPdf(String path, String sealUrl) {
+//        CompletableFuture.supplyAsync(() -> {
+//            try {
+//                wordToPdf(path, path.replace(".docx", ".pdf"), sealUrl);
+//                return null;
+//            } catch (Exception e) {
+//                throw new ErrorException("杞崲澶辫触");
+//            }
+//        }).thenAccept(res -> {
+//        }).exceptionally(e -> {
+//            e.printStackTrace();
+//            return null;
+//        });
+//    }
+
+
+
+//    public String wordToPdf(String wordPath, String pdfPath, String sealUrl) {
+//        FileOutputStream os = null;
+//        try {
+//            //鍑瘉 涓嶇劧鍒囨崲鍚庢湁姘村嵃
+////            InputStream inputStream = this.getClass().getResourceAsStream("/lib/license.xml");
+//            /*String url;
+//            try {
+//                InputStream inputStream = this.getClass().getResourceAsStream("/lib/license.xml");
+//                File file = File.createTempFile("temp", ".tmp");
+//                OutputStream outputStream = new FileOutputStream(file);
+//                IOUtils.copy(inputStream, outputStream);
+//                url = file.getAbsolutePath();
+//            } catch (FileNotFoundException e) {
+//                throw new ErrorException("鎵句笉鍒版ā鏉挎枃浠�");
+//            } catch (IOException e) {
+//                throw new RuntimeException(e);
+//            }*/
+//            InputStream is = new ClassPathResource("/lib/license.xml").getInputStream();
+//            License license = new License();
+//            license.setLicense(is);
+//            if (!license.getIsLicensed()) {
+//                System.out.println("License楠岃瘉涓嶉�氳繃...");
+//                return null;
+//            }
+//            //鐢熸垚涓�涓┖鐨凱DF鏂囦欢
+//            File file = new File(pdfPath.replace(".pdf", "-1.pdf"));
+//            os = new FileOutputStream(file);
+//            //瑕佽浆鎹㈢殑word鏂囦欢
+//            com.aspose.words.Document doc = new com.aspose.words.Document(wordPath);
+//            doc.save(os, SaveFormat.PDF);
+//
+//            //娣诲姞楠戠紳绔�
+//            stamperCheckMarkPDF(pdfPath.replace(".pdf", "-1.pdf"), pdfPath, imgUrl + "/" + sealUrl);
+//
+//
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        } finally {
+//            if (os != null) {
+//                try {
+//                    os.close();
+//                } catch (IOException e) {
+//                    e.printStackTrace();
+//                }
+//            }
+//        }
+//        return null;
+//    }
+
+    /**
+     * 鍒囧壊鍥剧墖
+     *
+     * @param Path 鍥剧墖璺緞
+     * @param n    鍒囧壊浠芥暟
+     */
+    public static com.itextpdf.text.Image[] slicingImages(String Path, int n) throws IOException, BadElementException {
+        com.itextpdf.text.Image[] nImage = new com.itextpdf.text.Image[n];
+        BufferedImage img = ImageIO.read(new File(Path));
+
+        int h = img.getHeight();
+        int w = img.getWidth();
+
+        int sw = w / n;
+        for (int i = 0; i < n; i++) {
+            BufferedImage subImg;
+            if (i == n - 1) {//鏈�鍚庡墿浣欓儴鍒�
+                subImg = img.getSubimage(i * sw, 0, w - i * sw, h);
+            } else {//鍓峮-1鍧楀潎鍖�鍒�
+                subImg = img.getSubimage(i * sw, 0, sw, h);
+            }
+            ByteArrayOutputStream out = new ByteArrayOutputStream();
+            ImageIO.write(subImg, Path.substring(Path.lastIndexOf('.') + 1), out);
+            nImage[i] = com.itextpdf.text.Image.getInstance(out.toByteArray());
+
+        }
+        return nImage;
+    }
+
+    /**
+     * 鐩栭獞缂濈珷
+     *
+     * @param infilePath  鍘烶DF璺緞
+     * @param outFilePath 杈撳嚭PDF璺緞
+     */
+    public static void stamperCheckMarkPDF(String infilePath, String outFilePath, String picPath) throws IOException, DocumentException {
+        PdfReader reader = new PdfReader(infilePath);//閫夋嫨闇�瑕佸嵃绔犵殑pdf
+        PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(outFilePath));//鍔犲畬鍗扮珷鍚庣殑pdf
+
+
+        com.itextpdf.text.Rectangle pageSize = reader.getPageSize(1);//鑾峰緱绗竴椤�
+        float height = pageSize.getHeight();
+        float width = pageSize.getWidth();
+
+        int nums = reader.getNumberOfPages();
+        com.itextpdf.text.Image[] nImage = slicingImages(picPath, nums);//鐢熸垚楠戠紳绔犲垏鍓插浘鐗�
+
+        for (int n = 1; n <= nums; n++) {
+            PdfContentByte over = stamp.getOverContent(n);//璁剧疆鍦ㄧ鍑犻〉鎵撳嵃鍗扮珷
+            com.itextpdf.text.Image img = nImage[n - 1];//閫夋嫨鍥剧墖
+            float newHeight = 100f;
+            float newWidth = img.getWidth() / (img.getHeight() / 100);
+            img.scaleAbsolute(newWidth, newHeight);//鎺у埗鍥剧墖澶у皬
+            img.setAbsolutePosition(width - newWidth, height / 2 - newHeight / 2);//鎺у埗鍥剧墖浣嶇疆
+            over.addImage(img);
+        }
+        stamp.close();
+    }
+}
+
+
+
+
+
+
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/impl/InstructionServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/InstructionServiceImpl.java
new file mode 100644
index 0000000..3a1554f
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/InstructionServiceImpl.java
@@ -0,0 +1,66 @@
+package com.ruoyi.requier.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.requier.dto.InstructionDto;
+import com.ruoyi.requier.mapper.InstructionMapper;
+import com.ruoyi.requier.pojo.Instruction;
+import com.ruoyi.requier.service.InstructionService;
+import com.ruoyi.requier.service.OperationInstructionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.Locale;
+import java.util.Map;
+
+/**
+ * <p>
+ * 浣滀笟鎸囧涔︽坊鍔犲彈鎺ф枃浠惰〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:29:18
+ */
+@Service
+@Transactional(rollbackFor = Exception.class)
+public class InstructionServiceImpl extends ServiceImpl<InstructionMapper, Instruction> implements InstructionService {
+
+    @Autowired
+    private OperationInstructionService operationInstructionService;
+
+    @Autowired
+    private NumberGenerator<Instruction> numberGenerator;
+
+    @Override
+    public IPage<Instruction> pageByPageQueryOfHomeworkInstructions(Page page) {
+        return baseMapper.pageByPageQueryOfHomeworkInstructions(page);
+    }
+
+    @Override
+    public void newHomeworkGuidebookAdded(InstructionDto instructionDto) {
+        if (ObjectUtils.isEmpty(instructionDto.getApplicationNumber())) {
+            String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
+            String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
+            String day = new SimpleDateFormat("dd", Locale.CHINESE).format(new Date());
+            String processNumber = numberGenerator.generateNumberWithPrefix(3, "WJSK" + year + month + day, Instruction::getApplicationNumber);
+            instructionDto.setApplicationNumber(processNumber);
+        }
+        saveOrUpdate(instructionDto);
+        if (ObjectUtils.isNotEmpty(instructionDto.getFeTempHumRecordList())) {
+            instructionDto.getFeTempHumRecordList().forEach(i -> {
+                i.setInstructionId(instructionDto.getId());
+                i.setUploader(SecurityUtils.getUserId().intValue());
+                i.setUpdateTime(LocalDateTime.now());
+            });
+            operationInstructionService.saveOrUpdateBatch(instructionDto.getFeTempHumRecordList());
+        }
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/impl/OperationInstructionServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/OperationInstructionServiceImpl.java
new file mode 100644
index 0000000..c26e7c5
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/OperationInstructionServiceImpl.java
@@ -0,0 +1,27 @@
+package com.ruoyi.requier.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.requier.mapper.OperationInstructionMapper;
+import com.ruoyi.requier.pojo.OperationInstruction;
+import com.ruoyi.requier.service.OperationInstructionService;
+import com.ruoyi.requier.vo.OperationInstructionVo;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 璁惧 - 浣滀笟鎸囧涔� 娣诲姞鍙楁帶鏂囦欢 瀛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2024-12-04 10:43:32
+ */
+@Service
+public class OperationInstructionServiceImpl extends ServiceImpl<OperationInstructionMapper, OperationInstruction> implements OperationInstructionService {
+
+    @Override
+    public List<OperationInstructionVo> homeworkGuidebookEditor(Integer instructionId) {
+        return baseMapper.homeworkGuidebookEditor(instructionId);
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/impl/PkMasterServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/PkMasterServiceImpl.java
new file mode 100644
index 0000000..cbafb5d
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/PkMasterServiceImpl.java
@@ -0,0 +1,809 @@
+package com.ruoyi.requier.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.vo.StandardProductVO;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.mapper.*;
+import com.ruoyi.inspect.pojo.*;
+import com.ruoyi.inspect.vo.ProductVo;
+import com.ruoyi.performance.mapper.AuxiliaryOutputWorkingHoursMapper;
+import com.ruoyi.performance.mapper.PerformanceShiftMapper;
+import com.ruoyi.performance.mapper.ShiftTimeMapper;
+import com.ruoyi.performance.pojo.AuxiliaryOutputWorkingHours;
+import com.ruoyi.performance.pojo.PerformanceShift;
+import com.ruoyi.performance.pojo.ShiftTime;
+import com.ruoyi.requier.mapper.PkMasterMapper;
+import com.ruoyi.requier.mapper.PkSlaveMapper;
+import com.ruoyi.requier.pojo.PkMaster;
+import com.ruoyi.requier.pojo.PkSlave;
+import com.ruoyi.requier.service.InsOrderPlanService;
+import com.ruoyi.requier.service.PkMasterService;
+import com.ruoyi.system.mapper.UserMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.logging.log4j.util.Strings;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-07-29 01:16:26
+ */
+@Service
+@Slf4j
+public class PkMasterServiceImpl extends ServiceImpl<PkMasterMapper, PkMaster> implements PkMasterService {
+
+    @Resource
+    private PkMasterMapper pkMasterMapper;
+
+    @Resource
+    private PkSlaveMapper pkSlaveMapper;
+
+    @Resource
+    private InsOrderMapper insOrderMapper;
+
+    @Resource
+    private InsSampleMapper insSampleMapper;
+
+    @Resource
+    private InsProductMapper insProductMapper;
+
+    @Resource
+    private InsProductResultMapper insProductResultMapper;
+
+    @Resource
+    private InsProductUserMapper insProductUserMapper;
+
+    @Resource
+    private UserMapper userMapper;
+
+    @Resource
+    private InsOrderPlanService insOrderPlanService;
+
+    @Resource
+    private InsOrderPlanServiceImpl insOrderPlanServiceImpl;
+
+    @Resource
+    private ShiftTimeMapper shiftTimeMapper;
+    @Resource
+    private PerformanceShiftMapper performanceShiftMapper;
+
+    @Resource
+    private AuxiliaryOutputWorkingHoursMapper auxiliaryOutputWorkingHoursMapper;
+
+    //娓╁害寰幆鏁伴噰
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int temDataAcquisition(PkMaster pkMaster) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        //鏌ヨ鏁伴噰鍏宠仈鐨勫瓙琛ㄤ俊鎭�
+        PkMaster master = new PkMaster();
+        List<PkMaster> pkMasters = pkMasterMapper.selectList(Wrappers.<PkMaster>lambdaQuery()
+                .eq(PkMaster::getEntrustCode, pkMaster.getEntrustCode())
+                .eq(PkMaster::getSampleCode, pkMaster.getSampleCode())
+                .eq(PkMaster::getModel, pkMaster.getModel())
+                .eq(PkMaster::getCycles, pkMaster.getCycles())
+                .eq(PkMaster::getTemperature, pkMaster.getTemperature()).orderByDesc(PkMaster::getId));
+        if(!pkMasters.isEmpty()){
+            master = pkMasters.get(0);
+        }
+        //鏌ヨ瀵瑰簲鐨勬楠屽崟琛�
+        InsOrder insOrder = insOrderMapper.selectOne(Wrappers.<InsOrder>lambdaQuery().eq(InsOrder::getState, 1).eq(InsOrder::getEntrustCode, pkMaster.getEntrustCode()));
+        if (ObjectUtils.isEmpty(insOrder)) {
+            throw new ErrorException("娌℃湁鎵惧埌瀵瑰簲濮旀墭鍗�" + pkMaster.getEntrustCode());
+        }
+        //鏌ヨ瀵瑰簲妫�楠屾牱鍝乮d
+        InsSample insSample = insSampleMapper.selectOne(Wrappers.<InsSample>lambdaQuery()
+                .eq(InsSample::getInsOrderId, insOrder.getId())
+                .eq(InsSample::getSampleCode, pkMaster.getSampleCode())
+                .eq(InsSample::getModel, pkMaster.getModel()));
+        if (ObjectUtils.isEmpty(insSample)) {
+            throw new ErrorException("娌℃湁鎵惧埌瀵瑰簲濮旀墭鍗曚笅鐨勮鏍峰搧" + pkMaster.getSampleCode());
+        }        if (ObjectUtils.isNotEmpty(master)) {
+            //throw new ErrorException("娌℃湁鎵惧埌瀵瑰簲濮旀墭鍗�" + pkMaster.getEntrustCode() + "鐨勬暟閲囨暟鎹�");
+            List<PkSlave> pkSlaves = pkSlaveMapper.selectList1(master.getIsid());
+            if (CollectionUtils.isEmpty(pkSlaves)) {
+                throw new ErrorException("娌℃湁鎵惧埌瀵瑰簲濮旀墭鍗�" + pkMaster.getEntrustCode() + "鐨勬暟閲囧瓙鏁版嵁");
+            }
+
+            //鏌ヨ瀵瑰簲妫�楠岄」鐩�
+            Map<String, Object> map = insOrderPlanService.temCycle(insSample.getId(), pkMaster.getCycles(), pkMaster.getTemperature());
+            List<ProductVo> productVos = (List<ProductVo>) map.get("productVos");
+            if (CollectionUtils.isNotEmpty(productVos)) {
+                //todo 濡傛灉娓╁害寰幆鐨勯」鐩畁m鏈夋敼鍔ㄨ繖閲岄渶瑕佹敼鍔� @zss
+                for (PkSlave pkSlave : pkSlaves) {
+                    for (ProductVo productVo : productVos) {
+                        if (pkSlave.getInsBushingId().equals(productVo.getBushColor()) &&
+                                pkSlave.getInsFibersId().equals(productVo.getCode()) &&
+                                pkSlave.getInsFiberId().equals(productVo.getColor())) {
+                            //鎵惧埌瀵瑰簲鐨勬暟鎹�(瀵瑰簲濂楃鍏夌氦鐨勬暟鎹�)
+                            List<InsProductResult> results = insProductResultMapper.selectList(Wrappers.<InsProductResult>lambdaQuery().eq(InsProductResult::getInsProductId, productVo.getInsProduct().getId()));
+                            InsProductResult result;
+                            if (CollectionUtils.isEmpty(results)) {
+                                result = new InsProductResult();
+                            } else {
+                                result = results.get(0);
+                            }
+                            result.setInsProductId(productVo.getInsProduct().getId());//妫�楠岄」鐩甶d
+                            List<Map<String, Object>> iv = new ArrayList<>();
+                            List<Map<String, Object>> cv = new ArrayList<>();
+                            if (productVo.getInsProduct().getInspectionItemClass().equals("1310nm")) {
+                                //1310nm澶栫
+                                Map<String, Object> map1 = new HashMap<>();
+                                map1.put("u", userId + "");
+                                map1.put("v", ObjectUtils.isNotEmpty(pkSlave.getWeaken1310A()) ? pkSlave.getWeaken1310A().toString() : null);
+                                iv.add(map1);
+                                //1310nm鍐呯
+                                Map<String, Object> map2 = new HashMap<>();
+                                map2.put("u", userId + "");
+                                map2.put("v", ObjectUtils.isNotEmpty(pkSlave.getWeaken1310B()) ? pkSlave.getWeaken1310B().toString() : null);
+                                iv.add(map2);
+                                //1310nm琛板噺绯绘暟
+                                Map<String, Object> map3 = new HashMap<>();
+                                double v = 0.0;
+                                if (ObjectUtils.isNotEmpty(pkSlave.getWeaken1310A()) && ObjectUtils.isNotEmpty(pkSlave.getWeaken1310B())) {
+                                    v = (pkSlave.getWeaken1310A() + pkSlave.getWeaken1310B()) / 2;
+                                } else if (ObjectUtils.isNotEmpty(pkSlave.getWeaken1310A()) && ObjectUtils.isEmpty(pkSlave.getWeaken1310B())) {
+                                    v = pkSlave.getWeaken1310A();
+                                } else if (ObjectUtils.isNotEmpty(pkSlave.getWeaken1310B()) && ObjectUtils.isEmpty(pkSlave.getWeaken1310A())) {
+                                    v = pkSlave.getWeaken1310B();
+                                } else {
+                                    log.info("鏁伴噰id锛歿}", pkSlave.getId());
+                                    throw new ErrorException("1310鐨勪袱绔兘娌℃湁鏁版嵁!!!");
+                                }
+                                BigDecimal decimal = BigDecimal.valueOf(v).setScale(3, RoundingMode.HALF_UP);
+                                map3.put("v", String.valueOf(decimal));
+                                cv.add(map3);
+                            } else if (productVo.getInsProduct().getInspectionItemClass().equals("1550nm")) {
+                                //1550nm澶栫
+                                Map<String, Object> map1 = new HashMap<>();
+                                map1.put("u", userId + "");
+                                map1.put("v", ObjectUtils.isNotEmpty(pkSlave.getWeaken1550A()) ? pkSlave.getWeaken1550A().toString() : null);
+                                iv.add(map1);
+                                //1550nm鍐呯
+                                Map<String, Object> map2 = new HashMap<>();
+                                map2.put("u", userId + "");
+                                map2.put("v", ObjectUtils.isNotEmpty(pkSlave.getWeaken1550B()) ? pkSlave.getWeaken1550B().toString() : null);
+                                iv.add(map2);
+                                //1550nm琛板噺绯绘暟
+                                Map<String, Object> map3 = new HashMap<>();
+                                double v = 0.0;
+                                if (ObjectUtils.isNotEmpty(pkSlave.getWeaken1550A()) && ObjectUtils.isNotEmpty(pkSlave.getWeaken1550B())) {
+                                    v = (pkSlave.getWeaken1550A() + pkSlave.getWeaken1550B()) / 2;
+                                } else if (ObjectUtils.isNotEmpty(pkSlave.getWeaken1550A()) && ObjectUtils.isEmpty(pkSlave.getWeaken1550B())) {
+                                    v = pkSlave.getWeaken1550A();
+                                } else if (ObjectUtils.isNotEmpty(pkSlave.getWeaken1550B()) && ObjectUtils.isEmpty(pkSlave.getWeaken1550A())) {
+                                    v = pkSlave.getWeaken1550B();
+                                } else {
+                                    throw new ErrorException("1550鐨勪袱绔兘娌℃湁鏁版嵁!!!");
+                                }
+                                BigDecimal decimal = BigDecimal.valueOf(v).setScale(3, RoundingMode.HALF_UP);
+                                map3.put("v", String.valueOf(decimal));
+                                cv.add(map3);
+                            } else if (productVo.getInsProduct().getInspectionItemClass().equals("1625nm")) {
+                                //1625nm澶栫
+                                Map<String, Object> map1 = new HashMap<>();
+                                map1.put("u", userId + "");
+                                map1.put("v", ObjectUtils.isNotEmpty(pkSlave.getWeaken1625A()) ? pkSlave.getWeaken1625A().toString() : null);
+                                iv.add(map1);
+                                //1625nm鍐呯
+                                Map<String, Object> map2 = new HashMap<>();
+                                map2.put("u", userId + "");
+                                map2.put("v", ObjectUtils.isNotEmpty(pkSlave.getWeaken1625B()) ? pkSlave.getWeaken1625B().toString() : null);
+                                iv.add(map2);
+                                //1625nm琛板噺绯绘暟
+                                Map<String, Object> map3 = new HashMap<>();
+                                double v = 0.0;
+                                if (ObjectUtils.isNotEmpty(pkSlave.getWeaken1625A()) && ObjectUtils.isNotEmpty(pkSlave.getWeaken1625B())) {
+                                    v = (pkSlave.getWeaken1625A() + pkSlave.getWeaken1625B()) / 2;
+                                } else if (ObjectUtils.isNotEmpty(pkSlave.getWeaken1625A()) && ObjectUtils.isEmpty(pkSlave.getWeaken1625B())) {
+                                    v = pkSlave.getWeaken1625A();
+                                } else if (ObjectUtils.isNotEmpty(pkSlave.getWeaken1625B()) && ObjectUtils.isEmpty(pkSlave.getWeaken1625A())) {
+                                    v = pkSlave.getWeaken1625B();
+                                } else {
+                                    throw new ErrorException("1625鐨勪袱绔兘娌℃湁鏁版嵁!!!");
+                                }
+                                BigDecimal decimal = BigDecimal.valueOf(v).setScale(3, RoundingMode.HALF_UP);
+                                map3.put("v", String.valueOf(decimal));
+                                cv.add(map3);
+                            } else if (productVo.getInsProduct().getInspectionItemClass().equals("1383nm")) {
+                                //1383nm澶栫
+                                Map<String, Object> map1 = new HashMap<>();
+                                map1.put("u", userId + "");
+                                map1.put("v", ObjectUtils.isNotEmpty(pkSlave.getWeaken1383A()) ? pkSlave.getWeaken1383A().toString() : null);
+                                iv.add(map1);
+                                //1383nm鍐呯
+                                Map<String, Object> map2 = new HashMap<>();
+                                map2.put("u", userId + "");
+                                map2.put("v", ObjectUtils.isNotEmpty(pkSlave.getWeaken1383B()) ? pkSlave.getWeaken1383B().toString() : null);
+                                iv.add(map2);
+                                //1383nm琛板噺绯绘暟
+                                Map<String, Object> map3 = new HashMap<>();
+                                double v = 0.0;
+                                if (ObjectUtils.isNotEmpty(pkSlave.getWeaken1383A()) && ObjectUtils.isNotEmpty(pkSlave.getWeaken1383B())) {
+                                    v = (pkSlave.getWeaken1383A() + pkSlave.getWeaken1310B()) / 2;
+                                } else if (ObjectUtils.isNotEmpty(pkSlave.getWeaken1383A()) && ObjectUtils.isEmpty(pkSlave.getWeaken1383B())) {
+                                    v = pkSlave.getWeaken1383A();
+                                } else if (ObjectUtils.isNotEmpty(pkSlave.getWeaken1383B()) && ObjectUtils.isEmpty(pkSlave.getWeaken1383A())) {
+                                    v = pkSlave.getWeaken1383B();
+                                } else {
+                                    throw new ErrorException("1383鐨勪袱绔兘娌℃湁鏁版嵁!!!");
+                                }
+                                BigDecimal decimal = BigDecimal.valueOf(v).setScale(3, RoundingMode.HALF_UP);
+                                map3.put("v", String.valueOf(decimal));
+                                cv.add(map3);
+                            } else if (productVo.getInsProduct().getInspectionItemClass().equals("1490nm")) {
+                                //1490nm澶栫
+                                Map<String, Object> map1 = new HashMap<>();
+                                map1.put("u", userId + "");
+                                map1.put("v", ObjectUtils.isNotEmpty(pkSlave.getWeaken1490A()) ? pkSlave.getWeaken1490A().toString() : null);
+                                iv.add(map1);
+                                //1490nm鍐呯
+                                Map<String, Object> map2 = new HashMap<>();
+                                map2.put("u", userId + "");
+                                map2.put("v", ObjectUtils.isNotEmpty(pkSlave.getWeaken1490B()) ? pkSlave.getWeaken1490B().toString() : null);
+                                iv.add(map2);
+                                //1490nm琛板噺绯绘暟
+                                Map<String, Object> map3 = new HashMap<>();
+                                double v = 0.0;
+                                if (ObjectUtils.isNotEmpty(pkSlave.getWeaken1490A()) && ObjectUtils.isNotEmpty(pkSlave.getWeaken1490B())) {
+                                    v = (pkSlave.getWeaken1490A() + pkSlave.getWeaken1310B()) / 2;
+                                } else if (ObjectUtils.isNotEmpty(pkSlave.getWeaken1490A()) && ObjectUtils.isEmpty(pkSlave.getWeaken1490B())) {
+                                    v = pkSlave.getWeaken1490A();
+                                } else if (ObjectUtils.isNotEmpty(pkSlave.getWeaken1490B()) && ObjectUtils.isEmpty(pkSlave.getWeaken1490A())) {
+                                    v = pkSlave.getWeaken1490B();
+                                } else {
+                                    throw new ErrorException("1490鐨勪袱绔兘娌℃湁鏁版嵁!!!");
+                                }
+                                BigDecimal decimal = BigDecimal.valueOf(v).setScale(3, RoundingMode.HALF_UP);
+                                map3.put("v", String.valueOf(decimal));
+                                cv.add(map3);
+                            } else {
+                                throw new ErrorException("娌℃湁鎵惧埌璇ユ俯搴︾殑妫�楠岄」鐩�" + productVo.getInsProduct().getInspectionItemClass());
+                            }
+                            result.setInsValue(JSON.toJSONString(iv));//妫�楠屽��
+                            result.setComValue(JSON.toJSONString(cv));//璁$畻鍊�
+                            if (BeanUtil.isEmpty(result.getId())) {
+                                result.setCreateUser(userId);
+                                result.setUpdateUser(userId);
+                                insProductResultMapper.insert(result);
+                            } else {
+                                result.setUpdateUser(userId);
+                                result.setUpdateTime(LocalDateTime.now());
+                                insProductResultMapper.updateById(result);
+                            }
+
+                            InsProduct insProduct = productVo.getInsProduct();
+                            InsProductResult insProductResult = insProductResultMapper.selectOne(Wrappers.<InsProductResult>lambdaQuery().eq(InsProductResult::getInsProductId, insProduct.getId()));
+                            String[] comValue = insProductResult.getComValue().split(":");
+                            String comple = comValue[comValue.length-1].split("\"")[1];
+                            //棣栧厛鏌ョ湅娓╁害鏄惁鏄�20搴﹀父娓�
+                            if (!pkMaster.getTemperature().equals("20鈩�(甯告俯)")) {
+                                //濡傛灉涓嶆槸鍏堟煡璇㈡槸鍚︽湁鍊�
+                                int a = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                                        .eq(InsProduct::getInsSampleId, insSample.getId())
+                                        .eq(InsProduct::getInspectionItem, "1")
+                                        .eq(InsProduct::getInspectionItemSubclass, "20鈩�(甯告俯)")).stream().map(InsProduct::getInsResult).anyMatch(ObjectUtils::isEmpty) ? 1 : 0;
+                                if (a == 1) {
+                                    throw new ErrorException("鍏堣幏鍙�20鈩�(甯告俯)鐨勬楠屽��,鍐嶈幏鍙栧叾浠栨俯搴�" + pkMaster.getSampleCode());
+                                } else {
+                                    //璁$畻琛板噺宸�
+                                    InsProduct insPro = null;
+                                    switch (insProduct.getInspectionItemClass()) {
+                                        case "1310nm":
+                                            //鏌ヨ20鈩�(甯告俯)1310nm鐨勮“鍑忕郴鏁�
+                                            try {
+                                                insPro = insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
+                                                        .eq(InsProduct::getInsSampleId, insSample.getId())
+                                                        .eq(InsProduct::getInspectionItem, "1")
+                                                        .eq(InsProduct::getInspectionItemSubclass, "20鈩�(甯告俯)")
+                                                        .eq(InsProduct::getInspectionItemClass, "1310nm")
+                                                        .eq(InsProduct::getInsFiberId, productVo.getInsProduct().getInsFiberId()));
+                                            } catch (Exception e) {
+                                                throw new ErrorException("娌℃湁鏌ュ埌20鈩�(甯告俯),1310nm椤圭洰" + productVo.getInsProduct().getInsFiberId() + "鍏夌氦鐨勬楠岄」鐩�");
+                                            }
+                                            break;
+                                        case "1550nm":
+                                            //鏌ヨ20鈩�(甯告俯)1550nm鐨勮“鍑忕郴鏁�
+                                            try {
+                                                insPro = insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
+                                                        .eq(InsProduct::getInsSampleId, insSample.getId())
+                                                        .eq(InsProduct::getInspectionItem, "1")
+                                                        .eq(InsProduct::getInspectionItemSubclass, "20鈩�(甯告俯)")
+                                                        .eq(InsProduct::getInspectionItemClass, "1550nm")
+                                                        .eq(InsProduct::getInsFiberId, productVo.getInsProduct().getInsFiberId()));
+                                            } catch (Exception e) {
+                                                throw new ErrorException("娌℃湁鏌ュ埌20鈩�(甯告俯),1625nm椤圭洰" + productVo.getInsProduct().getInsFiberId() + "鍏夌氦鐨勬楠岄」鐩�");
+                                            }
+                                            break;
+                                        case "1625nm":
+                                            //鏌ヨ20鈩�(甯告俯)1625nm鐨勮“鍑忕郴鏁�
+                                            try {
+                                                insPro = insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
+                                                        .eq(InsProduct::getInsSampleId, insSample.getId())
+                                                        .eq(InsProduct::getInspectionItem, "1")
+                                                        .eq(InsProduct::getInspectionItemSubclass, "20鈩�(甯告俯)")
+                                                        .eq(InsProduct::getInspectionItemClass, "1625nm")
+                                                        .eq(InsProduct::getInsFiberId, productVo.getInsProduct().getInsFiberId()));
+                                            } catch (Exception e) {
+                                                throw new ErrorException("娌℃湁鏌ュ埌20鈩�(甯告俯),1625nm椤圭洰" + productVo.getInsProduct().getInsFiberId() + "鍏夌氦鐨勬楠岄」鐩�");
+                                            }
+                                            break;
+                                        case "1383nm":
+                                            //鏌ヨ20鈩�(甯告俯)1383nm鐨勮“鍑忕郴鏁�
+                                            try {
+                                                insPro = insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
+                                                        .eq(InsProduct::getInsSampleId, insSample.getId())
+                                                        .eq(InsProduct::getInspectionItem, "1")
+                                                        .eq(InsProduct::getInspectionItemSubclass, "20鈩�(甯告俯)")
+                                                        .eq(InsProduct::getInspectionItemClass, "1383nm")
+                                                        .eq(InsProduct::getInsFiberId, productVo.getInsProduct().getInsFiberId()));
+                                            } catch (Exception e) {
+                                                throw new ErrorException("娌℃湁鏌ュ埌20鈩�(甯告俯),1383nm椤圭洰" + productVo.getInsProduct().getInsFiberId() + "鍏夌氦鐨勬楠岄」鐩�");
+                                            }
+                                            break;
+                                        case "1490nm":
+                                            //鏌ヨ20鈩�(甯告俯)1490nm鐨勮“鍑忕郴鏁�
+                                            try {
+                                                insPro = insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
+                                                        .eq(InsProduct::getInsSampleId, insSample.getId())
+                                                        .eq(InsProduct::getInspectionItem, "1")
+                                                        .eq(InsProduct::getInspectionItemSubclass, "20鈩�(甯告俯)")
+                                                        .eq(InsProduct::getInspectionItemClass, "1490nm")
+                                                        .eq(InsProduct::getInsFiberId, productVo.getInsProduct().getInsFiberId()));
+                                            } catch (Exception e) {
+                                                throw new ErrorException("娌℃湁鏌ュ埌20鈩�(甯告俯),1490nm椤圭洰" + productVo.getInsProduct().getInsFiberId() + "鍏夌氦鐨勬楠岄」鐩�");
+                                            }
+                                            break;
+                                    }
+                                    InsProductResult insProductRes = insProductResultMapper.selectOne(Wrappers.<InsProductResult>lambdaQuery().eq(InsProductResult::getInsProductId, insPro.getId()));
+                                    String[] split = insProductRes.getComValue().split(":");
+                                    double abs = Math.abs(Double.parseDouble(split[split.length-1].split("\"")[1]) - Double.parseDouble(comple));
+                                    BigDecimal scale = BigDecimal.valueOf(abs).setScale(3, RoundingMode.HALF_UP);
+                                    insProduct.setLastValue(String.valueOf(scale));
+                                    String ask = insProduct.getAsk();
+                                    int insResult = 1;
+                                    switch (ask.charAt(0)) {
+                                        case '<':
+                                            insResult = Double.parseDouble(insProduct.getLastValue()) < Double.parseDouble(ask.substring(1)) ? 1 : 0;
+                                            break;
+                                        case '>':
+                                            insResult = Double.parseDouble(insProduct.getLastValue()) > Double.parseDouble(ask.substring(1)) ? 1 : 0;
+                                            break;
+                                        case '=':
+                                            insResult = Double.parseDouble(insProduct.getLastValue()) == Double.parseDouble(ask.substring(1)) ? 1 : 0;
+                                            break;
+                                        case '鈮�':
+                                            insResult = Double.parseDouble(insProduct.getLastValue()) <= Double.parseDouble(ask.substring(1)) ? 1 : 0;
+                                            break;
+                                        case '鈮�':
+                                            insResult = Double.parseDouble(insProduct.getLastValue()) >= Double.parseDouble(ask.substring(1)) ? 1 : 0;
+                                            break;
+                                    }
+                                    insProduct.setInsResult(insResult);
+                                }
+                            } else {
+                                //濡傛灉鏄�20搴﹀父娓�,闇�瑕佺粰鍑哄悎鏍肩殑缁撹
+                                insProduct.setInsResult(1);//20搴﹀父娓╃殑妫�楠岄」榛樿涓哄悎鏍�
+                            }
+                            insProduct.setUpdateUser(userId);
+                            insProductMapper.updateById(insProduct);
+                            User user = userMapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getAccount, master.getDetectionPeople()));
+                            if (ObjectUtils.isEmpty(user)) {
+                                throw new ErrorException("lims绯荤粺娌℃湁鎵惧埌璇ョ敤鎴�" + master.getDetectionPeople());
+                            }
+                            insProductUserMapper.insert(new InsProductUser(null, user.getId(), master.getDetectionDate(), insProduct.getId()));
+                        }
+                    }
+                }
+            }
+            //缁欐俯搴﹀惊鐜殑妫�楠岄」鐩粦瀹氳澶�
+            InsProduct product = insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
+                    .eq(InsProduct::getState, 1)
+                    .eq(InsProduct::getInsSampleId, insSample.getId())
+                    .eq(InsProduct::getInspectionItem, "娓╁害寰幆"));
+            if (ObjectUtils.isEmpty(product)) {
+                throw new ErrorException("娌℃湁鎵惧埌瀵瑰簲濮旀墭鍗曚笅璇ユ牱鍝佺殑鐩稿叧娓╁害寰幆妫�楠岄」鐩�");
+            }
+            InsProductResult insProductResult = insProductResultMapper.selectOne(Wrappers.<InsProductResult>lambdaQuery().eq(InsProductResult::getInsProductId, product.getId()));
+            if (ObjectUtils.isEmpty(insProductResult)) {
+                insProductResult = new InsProductResult();
+                insProductResult.setInsProductId(product.getId());
+            }
+            if (ObjectUtils.isEmpty(insProductResult.getEquipValue())) {
+                List<Map<String, Object>> dv = new ArrayList<>();
+                Map<String, Object> map4 = new HashMap<>();
+                map4.put("v", "JCZX-TX-TT02006");
+                dv.add(map4);
+                Map<String, Object> map5 = new HashMap<>();
+                map5.put("v", "JCZX-TX-TT02001");
+                dv.add(map5);
+                insProductResult.setEquipValue(JSON.toJSONString(dv));
+                List<Map<String, Object>> dn = new ArrayList<>();
+                Map<String, Object> map6 = new HashMap<>();
+                map6.put("v", "姝ュ叆寮忛珮浣庢俯婀跨儹璇曢獙绠�");
+                dn.add(map6);
+                Map<String, Object> map7 = new HashMap<>();
+                map7.put("v", "姝ュ叆寮忛珮浣庢俯璇曢獙绠�");
+                dn.add(map7);
+                insProductResult.setEquipName(JSON.toJSONString(dn));
+                if (BeanUtil.isEmpty(insProductResult.getId())) {
+                    insProductResult.setCreateUser(userId);
+                    insProductResult.setUpdateUser(userId);
+                    insProductResultMapper.insert(insProductResult);
+                } else {
+                    insProductResult.setUpdateUser(userId);
+                    insProductResult.setUpdateTime(LocalDateTime.now());
+                    insProductResultMapper.updateById(insProductResult);
+                }
+            }
+        }
+        //鏌ユ壘鏍峰搧涓嬭娆℃暟鐨勬俯搴︾殑椤圭洰
+        List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                .eq(InsProduct::getInsSampleId, insSample.getId())
+                .eq(InsProduct::getState, 1)
+                .isNotNull(InsProduct::getSpecialItemParentId)
+                .isNotNull(InsProduct::getInspectionItemClass));
+        // 杩囨护鍑哄綋鍓嶅惊鐜鏁� 鍜� 娓╁害鐨勬楠岄」鐩�
+        List<InsProduct> productList = insProducts.stream()
+                .filter(item -> item.getInspectionItem().equals(pkMaster.getCycles()) &&
+                        item.getInspectionItemSubclass().equals(pkMaster.getTemperature()))
+                .collect(Collectors.toList());
+        // 宸ユ椂娣诲姞
+        int count = 0;
+        for(InsProduct insProduct1 : productList) {
+            // 鏌ヨinsProductResult鎷垮埌insValue鐨勬湁鍊肩殑涓暟
+            InsProductResult insProductResult = insProductResultMapper.selectOne(new LambdaQueryWrapper<InsProductResult>()
+                    .eq(InsProductResult::getInsProductId, insProduct1.getId()));
+            if(!Objects.isNull(insProductResult)) {
+                // insProductResult涓嶄负绌�,鑾峰彇鏈夊�肩殑涓暟
+                insProductResult.getInsValue();
+                List<Map> maps = JSONArray.parseArray(insProductResult.getInsValue(), Map.class);
+                for (Map map : maps) {
+                    if (Strings.isNotEmpty(map.get("v").toString())) {
+                        count++;
+                        break;
+                    }
+                }
+            }
+        }
+        // 璇ュ崟瀛愪笅闄や簡褰撳墠娆℃暟浠ュ強娓╁害鏈夊�肩殑璁板綍
+        List<InsProduct> productList1 = insProducts.stream()
+                .filter(item -> !(item.getInspectionItem().equals(pkMaster.getCycles()) && item.getInspectionItemSubclass().equals(pkMaster.getTemperature())))
+                .collect(Collectors.toList());
+        int allValue = 0;
+        for(InsProduct insProduct1 : productList1) {
+            // 鏌ヨinsProductResult鎷垮埌insValue鐨勬湁鍊肩殑涓暟
+            InsProductResult insProductResult = insProductResultMapper.selectOne(new LambdaQueryWrapper<InsProductResult>()
+                    .eq(InsProductResult::getInsProductId, insProduct1.getId()));
+            if(!Objects.isNull(insProductResult)) {
+                // insProductResult涓嶄负绌�,鑾峰彇鏈夊�肩殑涓暟
+                insProductResult.getInsValue();
+                List<Map> maps = JSONArray.parseArray(insProductResult.getInsValue(), Map.class);
+                for (Map map : maps) {
+                    if (Strings.isNotEmpty(map.get("v").toString())) {
+                        allValue++;
+                        break;
+                    }
+                }
+            }
+        }
+        Map<String, Boolean> map = isOvertimeAndCrossDay(userId);
+        Boolean isWithinRange = map.get("isWithinRange"); // 鏄惁姝e父涓婄彮
+        Boolean isCross = map.get("isCross"); // 鏄惁璺ㄥぉ
+        BigDecimal manHour = BigDecimal.ZERO; // 宸ユ椂
+        InsProduct insProduct = insProductMapper.selectOne(new LambdaQueryWrapper<InsProduct>().eq(InsProduct::getInsSampleId, insSample.getId())
+                .eq(InsProduct::getInspectionItem, "娓╁害寰幆"));
+        StandardProductVO workHourMap = insOrderPlanServiceImpl.getInspectWorkHourAndGroup(insProduct);
+        if(ObjectUtil.isNotNull(workHourMap)){
+            manHour = new BigDecimal(workHourMap.getManHour());
+        }
+        DateTimeFormatter formatters = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        DateTime parse = DateUtil.parse(LocalDateTime.now().format(formatter));
+        AuxiliaryOutputWorkingHours auxiliaryOutputWorkingHours = new AuxiliaryOutputWorkingHours();
+        auxiliaryOutputWorkingHours.setInspectionItem("娓╁害寰幆"); // 妫�楠岄」鐩�
+        auxiliaryOutputWorkingHours.setInspectionItemSubclass(""); // 妫�楠岄」鐩瓙绫�
+        if(isWithinRange) {
+            // 姝e父涓婄彮
+            auxiliaryOutputWorkingHours.setOrderNo(insOrder.getEntrustCode()); // 闈炲姞鐝鎵樺崟鍙�
+            auxiliaryOutputWorkingHours.setWorkTime(new BigDecimal(accuracy(manHour,count))); // 宸ユ椂
+            auxiliaryOutputWorkingHours.setAmount(count); // 闈炲姞鐝暟閲�
+        }else{
+            // 鍔犵彮
+            auxiliaryOutputWorkingHours.setOvertimeOrderNo(insOrder.getEntrustCode()); // 闈炲姞鐝鎵樺崟鍙�
+            auxiliaryOutputWorkingHours.setOvertimeWorkTime(new BigDecimal(accuracy(manHour,count))); // 宸ユ椂
+            auxiliaryOutputWorkingHours.setOvertimeAmount(count); // 闈炲姞鐝暟閲�
+        }
+        if(isCross) {
+            String date = LocalDateTime.now().minusDays(1).toLocalDate().atStartOfDay().format(formatters);// 鍓嶄竴澶�
+            auxiliaryOutputWorkingHours.setDateTime(date); // 鏃ユ湡
+        }else {
+            String date = LocalDateTime.now().toLocalDate().atStartOfDay().format(formatters);// 褰撳ぉ
+            auxiliaryOutputWorkingHours.setDateTime(date); // 鏃ユ湡
+        }
+        auxiliaryOutputWorkingHours.setOutputWorkTime(new BigDecimal(accuracy(manHour,count))); // 浜у嚭宸ユ椂
+        auxiliaryOutputWorkingHours.setWeekDay(insOrderPlanServiceImpl.getWeek(LocalDateTime.now().format(formatters)));//鏄熸湡
+        auxiliaryOutputWorkingHours.setWeek(String.valueOf(DateUtil.weekOfYear(DateUtil.offsetDay(parse, 1))));//鍛ㄦ
+        auxiliaryOutputWorkingHours.setCheck(userId);//妫�娴嬩汉
+        auxiliaryOutputWorkingHours.setSample(insSample.getSampleCode());//鏍峰搧缂栧彿
+        auxiliaryOutputWorkingHours.setManHourGroup(workHourMap.getManHourGroup());//宸ユ椂鍒嗙粍
+        // 鏌ヨ闇�瑕佹搷浣滅殑鏃ユ湡鏄惁鏈夎褰�
+        List<AuxiliaryOutputWorkingHours> oldRecords = auxiliaryOutputWorkingHoursMapper.selectList(Wrappers.<AuxiliaryOutputWorkingHours>lambdaQuery()
+                .eq(AuxiliaryOutputWorkingHours::getCheck,userId)
+                .eq(AuxiliaryOutputWorkingHours::getInspectionItem, "娓╁害寰幆")
+                .eq(AuxiliaryOutputWorkingHours::getInspectionItemSubclass, "")
+                .eq(AuxiliaryOutputWorkingHours::getSample, insSample.getSampleCode())
+                .and(i->i.eq(AuxiliaryOutputWorkingHours::getOrderNo, insOrder.getEntrustCode())
+                        .or()
+                        .eq(AuxiliaryOutputWorkingHours::getOvertimeOrderNo, insOrder.getEntrustCode()))
+                .eq(AuxiliaryOutputWorkingHours::getDateTime, auxiliaryOutputWorkingHours.getDateTime())
+        );
+        // 鎵�鏈夌殑璁板綍锛堝叾浠栧ぉ + 褰撳墠澶╋級
+        List<AuxiliaryOutputWorkingHours> addOldRecords = auxiliaryOutputWorkingHoursMapper.selectList(Wrappers.<AuxiliaryOutputWorkingHours>lambdaQuery()
+                .eq(AuxiliaryOutputWorkingHours::getCheck,userId)
+                .eq(AuxiliaryOutputWorkingHours::getInspectionItem, "娓╁害寰幆")
+                .eq(AuxiliaryOutputWorkingHours::getInspectionItemSubclass, "")
+                .eq(AuxiliaryOutputWorkingHours::getSample, insSample.getSampleCode())
+                .and(i->i.eq(AuxiliaryOutputWorkingHours::getOrderNo, insOrder.getEntrustCode())
+                        .or()
+                        .eq(AuxiliaryOutputWorkingHours::getOvertimeOrderNo, insOrder.getEntrustCode()))
+        );
+        if(CollectionUtils.isEmpty(oldRecords)){
+            // 鏂板涔熻鏌ョ湅鏄惁鏈夋墍鏈夌殑璁板綍
+            if(Objects.isNull(addOldRecords)) {
+                // 鍏朵粬澶╀篃娌℃湁璁板綍
+                auxiliaryOutputWorkingHoursMapper.insert(auxiliaryOutputWorkingHours);
+            }else{
+                // 鎵�鏈夌殑璁板綍
+                int otherDayAmount = 0; // 鎵�鏈夌殑鏁伴噺
+                for(AuxiliaryOutputWorkingHours a : addOldRecords) {
+                    otherDayAmount += (Objects.isNull(a.getAmount()) ? 0 : a.getAmount()) + (Objects.isNull(a.getOvertimeAmount()) ? 0 : a.getOvertimeAmount());
+                }
+                if(isWithinRange) {
+                    // 姝e父涓婄彮
+
+                    auxiliaryOutputWorkingHours.setWorkTime(new BigDecimal(accuracy(manHour,(count - otherDayAmount + allValue)))); // 宸ユ椂
+                    auxiliaryOutputWorkingHours.setAmount((count - otherDayAmount + allValue)); // 闈炲姞鐝暟閲�
+                }else {
+                    // 鍔犵彮
+                    auxiliaryOutputWorkingHours.setOvertimeWorkTime(new BigDecimal(accuracy(manHour,(count - otherDayAmount + allValue)))); // 宸ユ椂
+                    auxiliaryOutputWorkingHours.setOvertimeAmount((count - otherDayAmount + allValue)); // 闈炲姞鐝暟閲�
+                }
+                auxiliaryOutputWorkingHours.setOutputWorkTime(new BigDecimal(accuracy(manHour,(count - otherDayAmount + allValue)))); // 浜у嚭宸ユ椂
+                auxiliaryOutputWorkingHoursMapper.insert(auxiliaryOutputWorkingHours);
+            }
+        }else {
+            // 涓嶄负绌�
+            Integer oldAmount = 0; // 宸ユ椂娣诲姞鐨勪釜鏁�
+            for(AuxiliaryOutputWorkingHours a : addOldRecords) {
+                oldAmount += (Objects.isNull(a.getAmount()) ? 0 : a.getAmount()) + (Objects.isNull(a.getOvertimeAmount()) ? 0 : a.getOvertimeAmount());
+            }
+            if(count > (oldAmount - allValue)){
+                // 鏌ユ壘鍑烘棩鏈熶负寰楀埌鏃ユ湡鐨勮褰�
+                List<AuxiliaryOutputWorkingHours> collect = oldRecords.stream().filter(item -> item.getDateTime().equals(auxiliaryOutputWorkingHours.getDateTime())).collect(Collectors.toList());
+                if(CollectionUtils.isNotEmpty(collect)){
+                    // 鏈夌殑璇濆氨鏄洿鏂版搷浣�
+                    AuxiliaryOutputWorkingHours auxiliaryOutputWorkingHours1 = collect.get(0);
+                    if(isWithinRange) {
+                        // 姝e父涓婄彮
+                        // 鎷垮埌鍘熸湰鐨勬暟閲� 涓� 鏂扮殑鏁伴噺鐩稿姞
+                        int num =  Objects.isNull(auxiliaryOutputWorkingHours1.getAmount()) ? 0 :auxiliaryOutputWorkingHours1.getAmount(); // 鍘熸湰鐨勬暟閲�
+                        auxiliaryOutputWorkingHours1.setAmount(count - oldAmount + num + allValue); // 闈炲姞鐝暟閲�
+                        auxiliaryOutputWorkingHours1.setOrderNo(insOrder.getEntrustCode()); // 闈炲姞鐝鎵樺崟鍙�
+                        auxiliaryOutputWorkingHours1.setWorkTime(new BigDecimal(accuracy(manHour,(count - oldAmount + num + allValue)))); // 宸ユ椂
+                        BigDecimal outputWorkTime = new BigDecimal(accuracy(manHour, auxiliaryOutputWorkingHours1.getAmount())).add((Objects.isNull(auxiliaryOutputWorkingHours1.getOvertimeWorkTime()) ? new BigDecimal(0) : auxiliaryOutputWorkingHours1.getOvertimeWorkTime()));
+                        auxiliaryOutputWorkingHours1.setOutputWorkTime(outputWorkTime);// 浜у嚭宸ユ椂 閲囬泦鑲畾鏄細閲囬泦瀹�
+                    }else{
+                        // 鍔犵彮
+                        // 鎷垮埌鍘熸湰鐨勬暟閲� 涓� 鏂扮殑鏁伴噺鐩稿姞
+                        int num =  Objects.isNull(auxiliaryOutputWorkingHours1.getOvertimeAmount()) ? 0 :auxiliaryOutputWorkingHours1.getOvertimeAmount(); // 鍘熸湰鐨勬暟閲�
+                        auxiliaryOutputWorkingHours1.setOvertimeAmount(count - oldAmount + num + allValue);// 鍔犵彮鏁伴噺
+                        auxiliaryOutputWorkingHours1.setOvertimeOrderNo(insOrder.getEntrustCode()); // 鍔犵彮濮旀墭鍗曞彿
+                        auxiliaryOutputWorkingHours1.setOvertimeWorkTime(new BigDecimal(accuracy(manHour,(count - oldAmount + num + allValue)))); // 宸ユ椂
+                        BigDecimal outputWorkTime = new BigDecimal(accuracy(manHour, auxiliaryOutputWorkingHours1.getOvertimeAmount())).add(
+                                (Objects.isNull(auxiliaryOutputWorkingHours1.getWorkTime()) ? new BigDecimal(0) : auxiliaryOutputWorkingHours1.getWorkTime()));
+                        auxiliaryOutputWorkingHours1.setOutputWorkTime(outputWorkTime); // 浜у嚭宸ユ椂 閲囬泦鑲畾鏄細閲囬泦瀹�
+                    }
+                    auxiliaryOutputWorkingHoursMapper.updateById(auxiliaryOutputWorkingHours1);
+                }
+            }
+        }
+
+
+
+        return 0;
+    }
+
+    //娓╁害寰幆鏁伴噰鎬讳綋
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int temDataAcquisition2(PkMaster pkMaster) {
+        //鏌ヨ鍑烘墍鏈夊惊鐜鏁板拰娓╁害,鐒跺悗寰幆璋冪敤temDataAcquisition鎺ュ彛
+        //鏌ヨ瀵瑰簲鐨勬楠屽崟琛�
+        InsOrder insOrder = insOrderMapper.selectOne(Wrappers.<InsOrder>lambdaQuery().eq(InsOrder::getState, 1).eq(InsOrder::getEntrustCode, pkMaster.getEntrustCode()));
+        if (ObjectUtils.isEmpty(insOrder)) {
+            throw new ErrorException("娌℃湁鎵惧埌瀵瑰簲濮旀墭鍗�" + pkMaster.getEntrustCode());
+        }
+        //鏌ヨ瀵瑰簲妫�楠屾牱鍝乮d
+        InsSample insSample = insSampleMapper.selectOne(Wrappers.<InsSample>lambdaQuery()
+                .eq(InsSample::getInsOrderId, insOrder.getId())
+                .eq(InsSample::getSampleCode, pkMaster.getSampleCode())
+                .eq(InsSample::getModel, pkMaster.getModel()));
+        if (ObjectUtils.isEmpty(insSample)) {
+            throw new ErrorException("娌℃湁鎵惧埌瀵瑰簲濮旀墭鍗曚笅鐨勮鏍峰搧" + pkMaster.getSampleCode());
+        }
+        //鏌ユ壘鏍峰搧涓嬫墍鏈夋俯搴﹀惊鐜殑椤圭洰
+        List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                .eq(InsProduct::getInsSampleId, insSample.getId())
+                .eq(InsProduct::getState, 1)
+                .isNotNull(InsProduct::getSpecialItemParentId)
+                .isNotNull(InsProduct::getInspectionItemClass));
+        //杩囨护鍑烘墍鏈夊惊鐜鏁板拰娓╁害
+        List<String> collect1 = insProducts.stream().map(InsProduct::getInspectionItem).distinct().collect(Collectors.toList());
+        List<String> collect2 = insProducts.stream().map(InsProduct::getInspectionItemSubclass).distinct().collect(Collectors.toList());
+        for (String s : collect1) {
+            for (String s1 : collect2) {
+                PkMaster master = new PkMaster();
+                master.setEntrustCode(pkMaster.getEntrustCode());
+                master.setSampleCode(pkMaster.getSampleCode());
+                master.setModel(pkMaster.getModel());
+                master.setCycles(s);
+                master.setTemperature(s1);
+                temDataAcquisition(master);
+            }
+        }
+        return 0;
+    }
+
+    /**
+     * 鏄惁鍔犵彮銆佽法澶�
+     */
+    public Map<String,Boolean> isOvertimeAndCrossDay(Integer userId){
+        Map<String, Boolean> map = new HashMap<>();
+        Boolean isWithinRange = true;
+        Boolean isCross = false; // 鏄惁灏嗗綋鍓嶆楠屽崟瀛愮殑宸ユ椂璁$畻鍒扮彮娆″紑濮嬪ぉ
+        LocalDateTime today = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT);
+        PerformanceShift performanceShift = performanceShiftMapper.selectOne(Wrappers.<PerformanceShift>lambdaQuery()
+                .eq(PerformanceShift::getUserId, userId)
+                .eq(PerformanceShift::getWorkTime, today));
+        if (ObjectUtils.isNotEmpty(performanceShift)) {
+            ShiftTime shiftTime = shiftTimeMapper.selectOne(Wrappers.<ShiftTime>lambdaQuery().eq(ShiftTime::getShift, performanceShift.getShift()));
+            if (ObjectUtils.isNotEmpty(shiftTime)) {
+                DateTimeFormatter forma = DateTimeFormatter.ofPattern("HH:mm");
+                LocalTime now = LocalTime.now();
+                LocalTime startTime = LocalTime.parse(shiftTime.getStartTime(), forma);
+                LocalTime endTime = LocalTime.parse(shiftTime.getEndTime(), forma);
+                // 妫�鏌ュ綋鍓嶆椂闂存槸鍚﹀湪鑼冨洿鍐咃紙鍖呮嫭杈圭晫锛�
+
+                // 濡傛灉褰撳墠鏃堕棿涓嶅湪浠婂ぉ鐨勭彮娆″唴  17:00~5.00  15.00 棣栧厛鍒ゆ柇鏄惁璺ㄥぉ浜�
+                // 璺ㄥぉ鐨勬儏鍐�
+                if (startTime.isAfter(endTime)) {
+                    // 鏌ョ湅褰撳墠鏃堕棿鏄惁鍦ㄧ彮娆℃椂闂村唴
+                    if (now.isAfter(startTime)) {
+                        // 濡傛灉鏄湪缁撴潫鏃堕棿涔嬪悗閭d箞灏辨槸姝e父涓婄彮
+                        isWithinRange = true;
+                        isCross = false;
+                    } else {
+                        // 褰撳墠鏃堕棿涓嶅湪鐝鍐咃紝鏌ョ湅鏄ㄥぉ鐨勭彮娆�
+                        LocalDateTime yesterday = LocalDateTime.of(LocalDate.now().minusDays(1), LocalTime.MIDNIGHT);
+                        PerformanceShift yesterdayShift = performanceShiftMapper.selectOne(Wrappers.<PerformanceShift>lambdaQuery()
+                                .eq(PerformanceShift::getUserId, userId)
+                                .eq(PerformanceShift::getWorkTime, yesterday));
+                        ShiftTime yesterdayShiftTime = shiftTimeMapper.selectOne(Wrappers.<ShiftTime>lambdaQuery().eq(ShiftTime::getShift, yesterdayShift.getShift()));
+                        // 濡傛灉鏄ㄥぉ鐨勭彮娆′笉涓虹┖锛岄偅涔堝氨瑕佺湅鏄ㄥぉ鐨勭彮娆℃椂闂�
+                        if (!Objects.isNull(yesterdayShiftTime)) {
+                            LocalTime yesterdayStartTime = LocalTime.parse(yesterdayShiftTime.getStartTime(), forma);
+                            LocalTime yesterdayEndTime = LocalTime.parse(yesterdayShiftTime.getEndTime(), forma);
+                            // 鏄ㄥぉ鐨勭彮娆℃槸鍚﹁法澶�
+                            if (yesterdayStartTime.isAfter(yesterdayEndTime)) {
+                                // 濡傛灉鏄ㄥぉ鐨勭彮娆¤法澶╀簡锛岄偅涔堝氨瑕佺湅浠婂ぉ鏄惁鍦ㄦ槰澶╃殑鐝鍐咃紝骞朵笖鍙兘鏄湪缁撴潫鏃堕棿涔嬪墠锛屽凡缁忓疄鐜颁簡璺ㄥぉ
+                                if (now.isBefore(yesterdayEndTime)) {
+                                    // 鍦ㄦ槰澶╃彮娆℃椂闂村唴姝e父涓婄彮锛屽伐鏃惰绠楀埌鏄ㄥぉ
+                                    isWithinRange = true;
+                                    isCross = true;
+                                } else {
+                                    // 涓嶅湪鏄ㄥぉ鐝鏃堕棿鍐呭氨鏄姞鐝紝宸ユ椂璁$畻鍒版槰澶�
+                                    isWithinRange = false;
+                                    isCross = true;
+                                }
+                            } else {
+                                // 鏄ㄥぉ鐨勭彮娆℃病鏈夎法澶� 濡傛灉褰撳墠鏃堕棿鍦ㄤ粖澶╃彮娆″紑濮嬫椂闂翠箣鍓嶅氨鏄槰澶╃殑鍔犵彮锛屽惁鍒欏氨鏄粖澶╃殑鍔犵彮
+                                if (now.isBefore(startTime)) {
+                                    isWithinRange = false;
+                                    isCross = true;
+                                } else {
+                                    isWithinRange = false;
+                                    isCross = false;
+                                }
+                            }
+                        } else {
+                            isWithinRange = false;
+                            // 濡傛灉鏄湪寮�濮嬫椂闂翠箣鍓嶉偅涔堝氨瑕佺畻鍒版槰澶�
+                            if (now.isBefore(startTime)) {
+                                isCross = true;
+                            } else {
+                                isCross = false;
+                            }
+                        }
+                    }
+                } else {
+                    // 褰撳墠鐝涓嶈法澶╃殑鎯呭喌涓�
+                    // 濡傛灉褰撳墠鏃堕棿鍦ㄥ紑濮嬫椂闂翠箣鍓嶏紝鏌ユ槰澶╃殑鐝鐪嬪綋鍓嶆椂闂存槸鍚﹀湪鏄ㄥぉ鐨勭彮娆″唴
+                    if (now.isBefore(startTime)) {
+                        // 鏌ョ湅鏄ㄥぉ鏄惁璺ㄥぉ
+                        LocalDateTime yesterday = LocalDateTime.of(LocalDate.now().minusDays(1), LocalTime.MIDNIGHT);
+                        PerformanceShift yesterdayShift = performanceShiftMapper.selectOne(Wrappers.<PerformanceShift>lambdaQuery()
+                                .eq(PerformanceShift::getUserId, userId)
+                                .eq(PerformanceShift::getWorkTime, yesterday));
+                        ShiftTime yesterdayShiftTime = shiftTimeMapper.selectOne(Wrappers.<ShiftTime>lambdaQuery().eq(ShiftTime::getShift, yesterdayShift.getShift()));
+                        LocalTime yesterdayStartTime = LocalTime.parse(yesterdayShiftTime.getStartTime(), forma);
+                        LocalTime yesterdayEndTime = LocalTime.parse(yesterdayShiftTime.getEndTime(), forma);
+                        if (yesterdayStartTime.isAfter(yesterdayEndTime)) {
+                            // 濡傛灉鏄ㄥぉ璺ㄥぉ
+                            if (now.isBefore(yesterdayEndTime)) {
+                                // 鍦ㄦ槰澶╃殑鐝鏃堕棿鍐呮甯镐笂鐝紝宸ユ椂璁$畻鍒版槰澶�
+                                isWithinRange = true;
+                                isCross = true;
+                            } else {
+                                // 涓嶅湪鏄ㄥぉ鐝鏃堕棿鍐呭氨鏄姞鐝紝宸ユ椂璁$畻鍒版槰澶�
+                                isWithinRange = false;
+                                isCross = true;
+                            }
+                        } else {
+                            // 鏄ㄥぉ涓嶈法澶�
+                            isWithinRange = false;
+                            isCross = true;
+                        }
+                    } else if (now.isAfter(endTime)) {
+                        // 濡傛灉褰撳墠鏃堕棿鍦ㄧ粨鏉熸椂闂翠箣鍚庯紝閭d箞灏辨槸浠婂ぉ鐨勫姞鐝�
+                        isWithinRange = false;
+                        isCross = false;
+                    } else {
+                        // 姝e父涓婄彮
+                        isWithinRange = true;
+                        isCross = false;
+                    }
+                }
+            }
+        }
+        map.put("isWithinRange",isWithinRange);
+        map.put("isCross",isCross);
+        return map;
+    }
+
+    /**
+     * 绮惧害闂
+     */
+    public double accuracy(BigDecimal manHour, int count){
+        return  manHour.multiply(BigDecimal.valueOf(count)).setScale(4, RoundingMode.HALF_UP).doubleValue();
+    }
+
+}
+
+
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/impl/QrShowServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/QrShowServiceImpl.java
new file mode 100644
index 0000000..d6a790f
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/QrShowServiceImpl.java
@@ -0,0 +1,269 @@
+package com.ruoyi.requier.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.basic.mapper.StructureItemParameterMapper;
+import com.ruoyi.basic.pojo.Product;
+import com.ruoyi.basic.pojo.StructureItemParameter;
+import com.ruoyi.basic.service.ProductService;
+import com.ruoyi.common.core.domain.entity.Custom;
+import com.ruoyi.inspect.mapper.InsOrderMapper;
+import com.ruoyi.inspect.mapper.InsProductMapper;
+import com.ruoyi.inspect.mapper.InsSampleMapper;
+import com.ruoyi.inspect.pojo.InsOrder;
+import com.ruoyi.inspect.pojo.InsProduct;
+import com.ruoyi.inspect.pojo.InsSample;
+import com.ruoyi.inspect.service.InsOrderService;
+import com.ruoyi.requier.mapper.DeviceMaintenanceMapper;
+import com.ruoyi.requier.mapper.DeviceMapper;
+import com.ruoyi.requier.mapper.DeviceMetricRecordMapper;
+import com.ruoyi.requier.pojo.Device;
+import com.ruoyi.requier.pojo.DeviceMaintenance;
+import com.ruoyi.requier.pojo.DeviceMetricRecord;
+import com.ruoyi.requier.service.QrShowService;
+import com.ruoyi.system.service.CustomService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.ui.Model;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.Duration;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class QrShowServiceImpl implements QrShowService {
+
+    @Autowired
+    private InsOrderService insOrderService;
+
+    @Autowired
+    private ProductService productService;
+
+    @Autowired
+    private CustomService customService;
+
+    @Autowired
+    private InsOrderMapper insOrderMapper;
+
+    @Autowired
+    private DeviceMapper deviceMapper;
+
+    @Autowired
+    private DeviceMetricRecordMapper deviceMetricRecordMapper;
+
+    @Autowired
+    private DeviceMaintenanceMapper deviceMaintenanceMapper;
+
+    @Autowired
+    private StructureItemParameterMapper structureItemParameterMapper;
+
+    @Autowired
+    private InsSampleMapper insSampleMapper;
+
+    @Autowired
+    private InsProductMapper insProductMapper;
+
+    @Value("${spring.profiles.active}")
+    private String active;
+
+    private String getIp(){
+        if(StringUtils.isNotBlank(active)){
+            return "prod".equals(active)?"https://zttx-lims.ztt.cn:8021/lims/":"http://114.132.189.42:8001/";
+        }
+        return "http://192.168.1.124:8001/lims/";
+    }
+
+    @Override
+    public void transformModelByType(Model model, String code, String type) {
+        if(StringUtils.isNotBlank(type)){
+            switch (type){
+                case "word":
+                    InsOrder insOrder = insOrderService.getOne(Wrappers.<InsOrder>lambdaQuery()
+                            .eq(InsOrder::getEntrustCode, code));
+                    Product product = productService.getOne(Wrappers.<Product>lambdaQuery()
+                            .eq(Product::getName, insOrder.getSample()));
+                    String insOrderModel = productService.getWordQrModel(insOrder.getId());
+                    Custom company = customService.getOne(Wrappers.<Custom>lambdaQuery()
+                            .eq(Custom::getCompany, insOrder.getCompany()));
+                    String orderType = insOrderMapper.getEnumLabelByValue(insOrder.getOrderType());
+                    String[] monthNames = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
+                    model.addAttribute("entrustCode", code);
+                    model.addAttribute("productName",product.getName());
+                    model.addAttribute("productNameEn",product.getNameEn());
+                    model.addAttribute("insOrderModel", insOrderModel);
+                    model.addAttribute("company", company.getCompany());
+                    model.addAttribute("companyEn", company.getCompanyEn());
+                    model.addAttribute("getTime", insOrder.getExamineTime().format(DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�")));
+                    String getTimeEn = monthNames[insOrder.getExamineTime().getMonthValue() - 1] + " " + insOrder.getExamineTime().getDayOfMonth() + ", " + insOrder.getExamineTime().getYear();
+                    model.addAttribute("getTimeEn", getTimeEn);
+                    model.addAttribute("issuingDate", insOrder.getIssuingDate().format(DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�")));
+                    String issuingDateEn = monthNames[insOrder.getIssuingDate().getMonthValue() - 1] + " " + insOrder.getIssuingDate().getDayOfMonth() + ", " + insOrder.getIssuingDate().getYear();
+                    model.addAttribute("issuingDateEn", issuingDateEn);
+                    model.addAttribute("orderType", orderType);
+                    model.addAttribute("orderTypeEn", insOrder.getOrderType());
+                    break;
+                case "device":
+                    //鏌ヨ璁惧涓昏〃淇℃伅
+                    List<Device> deviceList = deviceMapper.selectList(Wrappers.<Device>lambdaQuery().eq(Device::getManagementNumber, code));
+                    if(deviceList.size()>1){
+                        throw new RuntimeException("璁惧缂栧彿"+code+"閲嶅");
+                    }
+                    Device device = deviceList.isEmpty()?null:deviceList.get(0);
+                    if(!Objects.isNull(device)){
+                        //鏌ヨ璁惧鏍″噯淇℃伅
+                        DeviceMetricRecord calibrate = getDeviceMetricRecord(device.getId(), "calibrate");
+                        //鏌ヨ璁惧鏍告煡淇℃伅
+                        DeviceMetricRecord examine = getDeviceMetricRecord(device.getId(), "examine");
+                        //鏌ヨ璁惧缁存姢璁板綍
+                        DeviceMaintenance deviceMaintenance = Optional.ofNullable(deviceMaintenanceMapper.selectOne(Wrappers.<DeviceMaintenance>lambdaQuery()
+                                .eq(DeviceMaintenance::getDeviceId, device.getId())
+                                .orderByDesc(DeviceMaintenance::getId)
+                                .last("limit 1"))).orElse(new DeviceMaintenance());
+                        model.addAttribute("progress",calcDeviceNextCheckRatio(calibrate.getCalibrationDate(),calibrate.getNextCalibrationDate()));//璺濈涓嬫鏍″噯鏃ユ湡鐨勫ぉ鏁扮櫨鍒嗘瘮
+                        model.addAttribute("deviceName",device.getDeviceName());//璁惧鍚嶇О
+                        model.addAttribute("deviceCode",device.getManagementNumber());//璁惧缂栧彿
+                        model.addAttribute("usedYears",calcUsedYears(device.getActivationDate()));//鍚敤鏃堕暱(骞�)
+                        model.addAttribute("runStatus",device.getDeviceStatus());//璁惧杩愯鐘舵��
+                        model.addAttribute("lastCalibrationDate",formatDate(calibrate.getCalibrationDate(),"yyyy-MM-dd"));//鏈�杩戞牎鍑嗘棩鏈�
+                        model.addAttribute("nextCalibrationDate",formatDate(calibrate.getNextCalibrationDate(),"yyyy-MM-dd"));//涓嬫鏍″噯鏃ユ湡
+                        String calibrateStatus = "0yes".equals(calibrate.getStatus())?"鍚堟牸":"1no".equals(calibrate.getStatus())?"涓嶅悎鏍�":"鍏朵粬";
+                        model.addAttribute("calibrateStatus",Objects.isNull(calibrate.getCalibrationDate())?"":calibrateStatus);//鏍″噯鎬荤粨璁�
+                        model.addAttribute("lastExamineDate",formatDate(examine.getCalibrationDate(),"yyyy-MM-dd"));//鏈�杩戞牳鏌ユ棩鏈�
+                        model.addAttribute("nextExamineDate",formatDate(examine.getNextCalibrationDate(),"yyyy-MM-dd"));//涓嬫鏍告煡鏃ユ湡
+                        String examineStatus = "0yes".equals(examine.getStatus())?"鍚堟牸":"1no".equals(examine.getStatus())?"涓嶅悎鏍�":"鍏朵粬";
+                        model.addAttribute("examineStatus",Objects.isNull(examine.getCalibrationDate())?"":examineStatus);//鏍告煡鎬荤粨璁�
+                        model.addAttribute("maintenanceDate",formatDate(deviceMaintenance.getDate(),"yyyy-MM-dd"));//鏈�杩戠淮鎶ゆ棩鏈�
+                        model.addAttribute("nextMaintenanceDate",formatDate(deviceMaintenance.getNextDate(),"yyyy-MM-dd"));//涓嬫缁存姢鏃ユ湡
+                        String maintenanceType = "";
+                        if(!Objects.isNull(deviceMaintenance.getMaintenanceType())){
+                            maintenanceType = 0==deviceMaintenance.getMaintenanceType()?"浣跨敤鍓嶇淮鎶�":"浣跨敤鍚庣淮鎶�";
+                        }
+                        model.addAttribute("maintenanceType",maintenanceType);//缁存姢鎬荤粨璁�
+                        //娴嬮噺椤圭洰
+                        String insProduct = "";
+                        if(StringUtils.isNotBlank(device.getInsProductIds())){
+                            String[] ids = device.getInsProductIds().split(",");
+                            List<StructureItemParameter> parameters = structureItemParameterMapper.selectBatchIds(Arrays.asList(ids));
+                            List<String> itemList = parameters.stream().map(StructureItemParameter::getInspectionItem).distinct().collect(Collectors.toList());
+                            insProduct = String.join(",",itemList);
+                        }
+                        model.addAttribute("insProduct",insProduct);//娴嬮噺椤圭洰
+                        model.addAttribute("fileName",calibrate.getFileName());
+                        model.addAttribute("downloadUrl",getIp()+"img/"+calibrate.getSystemFileName());
+                    }
+                    break;
+                    case "sample":
+                        // 鏌ヨ鏍峰搧淇℃伅
+                        InsSample insSample = insSampleMapper.selectById(code);
+                        InsOrder insOrder1 = insOrderMapper.selectById(insSample.getInsOrderId());
+                        List<InsProduct> insProducts = insProductMapper.selectList(new LambdaQueryWrapper<InsProduct>()
+                                .eq(InsProduct::getInsSampleId, insSample.getId()));
+                        String collect = "";
+                        if(CollectionUtils.isNotEmpty(insProducts)){
+//                             collect = insProducts.stream().map(item -> {
+//                                String inspectionItem = "";
+//                                if (Strings.isNotEmpty(item.getInspectionItemSubclass())) {
+//                                    inspectionItem = item.getInspectionItemSubclass();
+//                                } else {
+//                                    inspectionItem = item.getInspectionItem();
+//                                }
+//                                return inspectionItem;
+//                            }).distinct().collect(Collectors.joining(","));
+                            collect = insProducts.stream().map(InsProduct::getInspectionItem).distinct().collect(Collectors.joining(","));
+                        }
+                        model.addAttribute("sampleCode",insSample.getSampleCode()); // 鏍峰搧缂栧彿
+                        model.addAttribute("entrustCode",insOrder1.getEntrustCode()); // 濮旀墭鍗曞彿
+                        model.addAttribute("model",insSample.getModel()); // 瑙勬牸鍨嬪彿
+                        model.addAttribute("sample",insSample.getSample()); // 鏍峰搧鍚嶇О
+                        model.addAttribute("inspectionItem",collect); // 妫�娴嬮」鐩�
+                        model.addAttribute("insState",insSample.getInsState()); // 妫�娴嬬姸鎬�
+                        model.addAttribute("isLeave",insOrder1.getIsLeave()); // 鏄惁鐣欐牱
+            }
+        }
+    }
+
+    /**
+     * 璁$畻鍚敤鏃堕暱
+     * @param activationDate
+     * @return
+     */
+    public double calcUsedYears(LocalDateTime activationDate) {
+        if(Objects.isNull(activationDate)){
+            return 0;
+        }
+        BigDecimal defDays = BigDecimal.valueOf(365);
+        BigDecimal usedDays = BigDecimal.valueOf(Duration.between(activationDate,LocalDateTime.now()).toDays());
+        return usedDays.divide(defDays,2,RoundingMode.HALF_UP).setScale(2,RoundingMode.HALF_UP).doubleValue();
+    }
+
+    /**
+     * 璁$畻璺濈涓嬫鏍″噯鏃ユ湡鐨勫ぉ鏁扮櫨鍒嗘瘮
+     * @param startDate
+     * @param endDate
+     * @return
+     */
+    public double calcDeviceNextCheckRatio(Date startDate, Date endDate){
+        if(Objects.isNull(startDate) || Objects.isNull(endDate)){
+            return 0;
+        }
+        LocalDateTime startLocalDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+        LocalDateTime endLocalDate = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+        long totalDays = Duration.between(startLocalDate, endLocalDate).toDays();
+        long usedDays = Duration.between(startLocalDate, LocalDateTime.now()).toDays();
+        BigDecimal calcVal = BigDecimal.valueOf(usedDays).divide(BigDecimal.valueOf(totalDays),2,RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP);
+        if(calcVal.compareTo(BigDecimal.ZERO)<0){
+            calcVal = BigDecimal.ZERO;
+        }else if(calcVal.compareTo(BigDecimal.valueOf(100))>0){
+            calcVal = BigDecimal.valueOf(100);
+        }
+        return calcVal.doubleValue();
+    }
+
+    /**
+     * 鏌ヨ璁惧鏍″噯/鏍告煡璁板綍
+     * @param deviceId
+     * @param type
+     * @return
+     */
+    public DeviceMetricRecord getDeviceMetricRecord(int deviceId,String type){
+        return Optional.ofNullable(
+                deviceMetricRecordMapper.selectOne(Wrappers.<DeviceMetricRecord>lambdaQuery()
+                .eq(DeviceMetricRecord::getDeviceId, deviceId)
+                .eq(DeviceMetricRecord::getType, type)
+                .orderByDesc(DeviceMetricRecord::getCreateTime)
+                .last("limit 1"))).orElse(new DeviceMetricRecord());
+    }
+
+    /**
+     * 鏍煎紡鍖栨棩鏈�
+     * @return
+     */
+    public String formatDate(Date date,String formatter){
+        if(Objects.isNull(date)){
+            return "";
+        }
+        LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
+        return localDateTime.format(DateTimeFormatter.ofPattern(formatter));
+    }
+    /**
+     * 鏍煎紡鍖栨棩鏈�
+     * @return
+     */
+    public String formatDate(LocalDate date,String formatter){
+        if(Objects.isNull(date)){
+            return "";
+        }
+        return date.format(DateTimeFormatter.ofPattern(formatter));
+    }
+
+
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/service/impl/ReservationServiceImpl.java b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/ReservationServiceImpl.java
new file mode 100644
index 0000000..be0efb0
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/service/impl/ReservationServiceImpl.java
@@ -0,0 +1,110 @@
+package com.ruoyi.requier.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.requier.dto.DeviceDto;
+import com.ruoyi.requier.dto.ReservationDto;
+import com.ruoyi.requier.mapper.DeviceMapper;
+import com.ruoyi.requier.mapper.ReservationMapper;
+import com.ruoyi.requier.pojo.Reservation;
+import com.ruoyi.requier.service.DataConfigService;
+import com.ruoyi.requier.service.ReservationService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 璧勬簮棰勫畾鏂板缓棰勫畾琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author baomidou
+ * @since 2024-09-14
+ */
+@Service
+public class ReservationServiceImpl extends ServiceImpl<ReservationMapper, Reservation> implements ReservationService {
+
+    @Autowired
+    private DeviceMapper deviceMapper;
+
+    @Autowired
+    private ReservationMapper reservationMapper;
+
+    @Autowired
+    private DataConfigService dataConfigService;
+
+    @Override
+    public ArrayList<JSONObject> selectDeviceParameter(Page page, DeviceDto itemParameter, Boolean laboratoryNameIsNull, String starttime, String endtime) {
+        ArrayList<String> dateTextList = new ArrayList<>();
+        if (StringUtils.isNoneEmpty(starttime)&&StringUtils.isNoneEmpty(endtime)){
+            LocalDate startDate = LocalDate.parse(starttime, DateTimeFormatter.ISO_LOCAL_DATE);
+            LocalDate endDate = LocalDate.parse(endtime, DateTimeFormatter.ISO_LOCAL_DATE);
+            while (!startDate.isAfter(endDate)) {
+                dateTextList.add(startDate.toString());
+                startDate = startDate.plusDays(1);
+            }
+        }
+        LambdaQueryWrapper<Reservation> lambdaQueryWrapper=new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.between(Reservation::getReservationTime,starttime,endtime);
+        List<Reservation> reservations = reservationMapper.selectList(lambdaQueryWrapper);
+        HashMap dates = new HashMap<String, Integer>();
+
+        Map<Integer, List<Reservation>> deviceIdcollect = reservations.stream().collect(Collectors.groupingBy(Reservation::getDeviceId));
+        for (Integer deviceId : deviceIdcollect.keySet()) {
+            List<Reservation> deviceIdList = deviceIdcollect.get(deviceId);
+            Map<String, List<Reservation>> collect = deviceIdList.stream().collect(Collectors.groupingBy(Reservation::getReservationTime));
+            for (String date : collect.keySet()) {
+                List<Reservation> reservations1 = collect.get(date);
+                Map<String, List<Reservation>> collect1 = reservations1.stream().collect(Collectors.groupingBy(Reservation::getSpecificTime));
+                for (String s : collect1.keySet()) {
+                    if (!(dates.containsKey(deviceId + date + s))) {
+                        dates.put(deviceId + date + s, collect1.get(s).size());
+                    }
+                }
+            }
+        }
+        Map<String, Object> map = new HashMap<>();
+        IPage<DeviceDto> iPage = deviceMapper.selectDeviceParameterPage(page, QueryWrappers.queryWrappers(itemParameter), laboratoryNameIsNull);
+        List<DeviceDto> records = iPage.getRecords();
+        ArrayList<JSONObject> datas = new ArrayList<>();
+
+        String [] dateArrays={"09:00-12:00","13:00-18:00", "18:00-22:00"};
+        for (DeviceDto record : records) {
+            for (int i = 0; i < dateArrays.length; i++) {
+                String dateArray = dateArrays[i];
+                JSONObject temp = JSON.parseObject(JSON.toJSONString(record));
+                temp.put("time", dateArray);
+                JSONArray dataArray = new JSONArray();
+                for (String date : dateTextList) {
+                    JSONObject dateObject = new JSONObject();
+                    dateObject.put("date", date);
+                    dateObject.put("value", dates.containsKey(record.getId()+date + dateArray) ? dates.get(record.getId()+date + dateArray) : 0);
+                    dataArray.add(dateObject);
+                }
+                temp.put("dateList", dataArray);
+                datas.add(temp);
+            }
+        }
+        return datas;
+    }
+
+
+    @Override
+    public List<ReservationDto> selectReservationParameterPage(String deviceId, String reservationTime, String specificTime) {
+        return reservationMapper.selectReservationParameterPage(Integer.parseInt(deviceId), reservationTime, specificTime);
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/util/DataAcquisition.java b/cnas-require/src/main/java/com/ruoyi/requier/util/DataAcquisition.java
new file mode 100644
index 0000000..6b4a461
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/util/DataAcquisition.java
@@ -0,0 +1,792 @@
+package com.ruoyi.requier.util;
+
+import cn.hutool.core.io.IORuntimeException;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.framework.util.RedisUtil;
+import com.ruoyi.requier.pojo.DataConfig;
+import com.ruoyi.requier.pojo.Device;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import javax.servlet.http.HttpServletRequest;
+import java.io.UnsupportedEncodingException;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+public class DataAcquisition {
+
+    private static final String HTTP = "http://";
+
+    private static final String GETFILE = ":9527/lims/getFile"; // 鑾峰彇鏂囦欢鎺ュ彛
+
+    private static final String MOVEFILE = ":9527/lims/moveFile"; // 鏂囦欢绉诲姩鍦板潃
+
+    private static final String splitIdentifier = "@-@"; // 鑷畾涔夊敮涓�鏍囪瘑鍒嗗壊绗�
+
+    public static final String frequency = "frequency";
+
+    /**
+     * 鏁伴噰鍏ュ彛
+     *
+     * @param dataConfig
+     * @param device
+     * @return
+     */
+    public static Map<String, Object> dataAcquisitionEntrance(List<DataConfig> dataConfig, Device device, String entrustCode, String sampleCode, String ip, String fiberOpticRibbon) {
+        /**
+         * filePath 鏂囦欢閲囬泦璺緞
+         * fileExtension 鏂囦欢鍚庣紑
+         * entrustCode 濮旀墭缂栧彿鏁版嵁
+         * sampleCode 鏍峰搧缂栧彿鏁版嵁
+         * mdbEntrustCode mdb鏂囦欢闇�瑕侊細濮旀墭缂栧彿瀛楁 涓轰粈涔堟病鏈夊幓杩欎釜mdb鍓嶇紑鍛紵鍥犱负宸茬粡缁欏鎴风殑閮ㄥ垎鐢佃剳涓婂畨瑁呬簡閲囬泦鍣紝鑰岀敤鎴蜂笉鎺ュ彈閲嶆柊瀹夎閲囬泦鍣紝鎵�浠ュ氨娌℃湁鍘婚櫎
+         * mdbSampleCode mdb鏂囦欢闇�瑕侊細鏍峰搧缂栧彿瀛楁
+         * fiberOpticRibbonCode 鍏夌氦甯� 瀛楁
+         * fiberOpticRibbon 鍏夌氦甯︽暟鎹�
+         */
+        //杞箟鐗规畩绗﹀彿锛岄伩鍏嶈姹傚弬鏁扮己澶�
+        try {
+            sampleCode = URLEncoder.encode(sampleCode, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            throw new RuntimeException(e);
+        }
+        String http = HTTP + ip + GETFILE +
+                "?filePath=" + device.getCollectUrl() +
+                "&fileExtension=" + device.getFileType() +
+                "&entrustCode=" + entrustCode +
+                "&sampleCode=" + sampleCode +
+                "&mdbEntrustCode=" + device.getEntrustCode() +
+                "&mdbSampleCode=" + device.getSampleCode() +
+                "&dbFileName=" + device.getDbFileName() +
+                "&fiberOpticRibbonCode=" + device.getFiberOpticRibbon();
+
+        if (Objects.nonNull(fiberOpticRibbon)) {
+            http += "&fiberOpticRibbon=" + fiberOpticRibbon.replaceAll("#","%23");
+        }
+        String result = null;
+        try {
+            result = HttpUtil.get(http);
+        } catch (IORuntimeException e) {
+            throw new ErrorException("鎵�鍦ㄧ數鑴戞湭瀹夎鎴栨湭鍚姩锛歀IMS鏂囦欢閲囬泦鍣紒");
+        }
+        JSONObject jsonObject = JSON.parseObject(result);
+        if (Objects.equals(jsonObject.get("code"), 1)) {
+            if (ObjectUtils.isEmpty(jsonObject.get("msg"))) {
+                throw new ErrorException("鏈煡璇㈠埌鏂囦欢锛佸彲鑳借璺緞锛�" + device.getCollectUrl() + "锛変笅骞舵病鏈夋墍闇�(" + device.getFileType() + ")鏂囦欢锛�");
+            } else {
+                throw new ErrorException(jsonObject.get("msg") + "");
+            }
+        } else {
+            String data = jsonObject.get("data") + "";
+            // 鑰冭檻鍒颁竴涓娴嬮」鍙兘浼氬瓨鍦ㄥ涓暟閲囬厤缃紝鎵�浠ラ渶瑕佽繘琛屽垎缁�
+            Map<String, List<DataConfig>> userMap = dataConfig.stream()
+                    .peek(i -> i.setInsProductItem(
+                            i.getInspectionItem().equals(i.getInspectionItemSubclass()) ? i.getInspectionItem() + "," : i.getInspectionItem() + "," + i.getInspectionItemSubclass()
+                    ))
+                    .collect(Collectors.groupingBy(DataConfig::getInsProductItem));
+            Map<String, Object> map;
+            switch (device.getFileType()) {
+                case ".docx":
+                    map = analysisString(data, userMap, device, entrustCode, sampleCode);
+                    break;
+                case ".xlsx":
+                    map = analysisList(data, userMap, device, entrustCode, sampleCode);
+                    break;
+                case ".txt":
+                    map = analysisTxt(data, userMap, device, entrustCode, sampleCode);
+                    break;
+                case ".csv":
+                    map = analysisList(data, userMap, device, entrustCode, sampleCode);
+                    break;
+                case ".mdb":
+                    map = analysisMdb(data, userMap, device);
+                    break;
+                case ".db":
+                    map = analysisDb(data, userMap, device);
+                    break;
+                case ".png":
+                    map = readPngString(data, userMap, device);
+                    break;
+                default:
+                    map = null;
+                    break;
+            }
+            // 濡傛灉瀛樺湪瀛樺偍鍦板潃锛屽垯绉诲姩鍦板潃
+            if (ObjectUtils.isNotEmpty(device.getStorageUrl())) {
+                String s = HTTP + ip + MOVEFILE + "?startFilePath=" + device.getCollectUrl() + "&endFilePath=" + device.getStorageUrl() + "&fileType=" + device.getFileType();
+                HttpUtil.get(s);
+            }
+            return map;
+        }
+    }
+
+    public static Map<String, Object> createFrequency(String entrustCode, String sampleCode,String fiberOpticRibbon, Map<String, Object> map) {
+        HashSet<String> set = new HashSet<>();
+        map.forEach((key, value) -> {
+            String[] split = key.split(",");
+            String inspectionItem = split[0];
+            System.out.println(value);
+            // 鍙鏈変竴涓笉涓虹┖灏眘et杩涘幓
+            Map map1 = JSONObject.parseObject(JSONObject.toJSONString(value), Map.class);
+            if (ObjectUtils.isNotEmpty(value) && ObjectUtils.isNotEmpty(map1.get("result"))) {
+                set.add(inspectionItem);
+            }
+        });
+        Map<String, Object> result = new HashMap<>();
+        for (String inspectionItemKey : set) {
+            Map<String, Object> hashMap = new HashMap<>();
+            map.forEach((key, value) -> {
+                String[] split = key.split(",");
+                String inspectionItem = split[0];
+                if (inspectionItemKey.equals(inspectionItem)) {
+                    if (split.length > 1) {
+                        hashMap.put(split[1], value);
+                    } else {
+                        hashMap.put(split[0], value);
+                    }
+                }
+            });
+            String frequency = createKey(entrustCode, sampleCode,fiberOpticRibbon, inspectionItemKey);
+            hashMap.put("frequency", frequency);
+            result.put(inspectionItemKey, hashMap);
+        }
+        return result;
+    }
+
+    public static String createKey(String entrustCode, String sampleCode,String fiberOpticRibbon, String inspectionItemKey) {
+        String key = frequency + ":" + entrustCode + ":" + sampleCode + ":" + inspectionItemKey;
+        if(StringUtils.isNotBlank(fiberOpticRibbon)){
+            key = frequency + ":" + entrustCode + ":" + sampleCode + ":" + fiberOpticRibbon + ":" + inspectionItemKey;
+        }
+        boolean b = RedisUtil.hasKey(key);
+        String frequencyValue;
+        if (b) {
+            long incr = RedisUtil.incr(key, 1);
+            frequencyValue = String.valueOf(incr);
+        } else {
+            RedisUtil.set(key, 1);
+            frequencyValue = "1";
+        }
+        return frequencyValue;
+    }
+
+    /**
+     * 闇�瑕侀�氳繃X,Y杞村畾浣�
+     *
+     * @param data
+     * @param dataConfig
+     * @return
+     */
+    private static Map<String, Object> analysisDb(String data, Map<String, List<DataConfig>> dataConfig, Device device) {
+        JSONObject jsonObject = JSON.parseObject(data);
+        Map<String, Object> map = new HashMap<>();
+        if (jsonObject.isEmpty()) {
+            return map;
+        }
+        JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString());
+        dataConfig.forEach((k, v) -> {
+            AtomicInteger numberOfDataEntries = new AtomicInteger();
+            List<Object> list = new ArrayList<>();
+            for (int config = 0; config < v.size(); config++) {
+                String refery = getRefer(v.get(config).getRefery());
+                for (int i = 0; i < dataList.size(); i++) {
+                    JSONObject jsonObject1 = JSON.parseObject(dataList.get(i).toString());
+                    Object o = jsonObject1.get(refery);
+                    if (ObjectUtils.isNotEmpty(o)) {
+                        numberOfDataEntries.addAndGet(1);
+                        list.add(o);
+                    }
+                }
+            }
+            // 鎷兼帴鏁伴噰閰嶇疆
+            List<Object> result = new ArrayList<>();
+            for (int i = 0; i < numberOfDataEntries.get(); i++) {
+                String aggregate = "";
+                for (int j = 0; j < v.size(); j++) {
+                    int index;
+                    if (j == 0) {
+                        index = i;
+                    } else {
+                        index = numberOfDataEntries.get() + i;
+                    }
+                    aggregate += list.get(index).toString() + ",";
+                }
+                int lastIndex = aggregate.lastIndexOf(",");
+                String substring = aggregate.substring(0, lastIndex);
+                result.add(substring);
+            }
+            // 杩涜鍏紡璁$畻
+            Object resultValue = calculationFormula(result, v.get(0), k, device);
+            map.put(k, resultValue);
+        });
+        return map;
+    }
+
+    /**
+     * @param data
+     * @param dataConfig
+     * @return
+     */
+    private static Map<String, Object> analysisMdb(String data, Map<String, List<DataConfig>> dataConfig, Device device) {
+        JSONObject jsonObject = JSON.parseObject(data);
+        Map<String, Object> map = new HashMap<>();
+        if (jsonObject.isEmpty()) {
+            return map;
+        }
+        JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString());
+        dataConfig.forEach((k, v) -> {
+            AtomicInteger numberOfDataEntries = new AtomicInteger();
+            List<Object> list = new ArrayList<>();
+            for (int config = 0; config < v.size(); config++) {
+                String refery = getRefer(v.get(config).getRefery());
+                for (int i = 0; i < dataList.size(); i++) {
+                    JSONObject jsonObject1 = JSON.parseObject(dataList.get(i).toString());
+                    Object o = jsonObject1.get(refery);
+                    if (ObjectUtils.isNotEmpty(o)) {
+                        numberOfDataEntries.addAndGet(1);
+                        list.add(o);
+                    }
+                }
+            }
+            // 鎷兼帴鏁伴噰閰嶇疆
+            List<Object> result = new ArrayList<>();
+            for (int i = 0; i < numberOfDataEntries.get(); i++) {
+                String aggregate = "";
+                for (int j = 0; j < v.size(); j++) {
+                    int index;
+                    if (j == 0) {
+                        index = i;
+                    } else {
+                        index = numberOfDataEntries.get() + i;
+                    }
+                    aggregate += list.get(index).toString() + ",";
+                }
+                int lastIndex = aggregate.lastIndexOf(",");
+                String substring = aggregate.substring(0, lastIndex);
+                result.add(substring);
+            }
+            // 杩涜鍏紡璁$畻
+            Object resultValue = calculationFormula(result, v.get(0), k, device);
+            map.put(k, resultValue);
+        });
+        return map;
+    }
+
+    private static Pattern SPATTERN = Pattern.compile("([-+])?\\d+(\\.\\d+)?");
+
+    /**
+     * 鍙渶X杞�
+     *
+     * @param data       閲囬泦鍒扮殑鏂囦欢瀛楃涓�
+     * @param dataConfig 鐢ㄦ埛閰嶇疆濂界殑x,y杞村畾浣嶆暟鎹笌鍙傜収鐗�
+     * @return
+     */
+    private static Map<String, Object> readPngString(String data, Map<String, List<DataConfig>> dataConfig, Device device) {
+        Map<String, Object> map = new HashMap<>();
+        dataConfig.forEach((k, v) -> {
+            List<Object> list = new ArrayList<>();
+            for (int config = 0; config < v.size(); config++) {
+                String referx = getRefer(v.get(config).getReferx());
+                String result = null;
+                // 閫氳繃\n灏嗗瓧绗︿覆鍒嗗壊涓鸿
+                String[] aColumnY = data.split("\n");
+                List<String> list1 = new ArrayList<>();
+                // 璇ュ惊鐜緱鍑虹敤鎴烽厤缃殑y杞�
+                for (int i = 0; i < aColumnY.length; i++) {
+                    String addDataWithSpaces = referx.replaceAll("", " ");
+                    int x = getXOrY(v.get(config).getX(), k, "X");
+                    if (aColumnY[i].contains(addDataWithSpaces)) {
+                        Matcher matcher = SPATTERN.matcher(aColumnY[i]);
+                        while (matcher.find()) {
+                            String group = matcher.group();
+                            list1.add(group);
+                        }
+                    }
+                    if (ObjectUtils.isNotEmpty(list1)) {
+                        result = list1.get(x);
+                    }
+                }
+                if (ObjectUtils.isNotEmpty(result)) {
+                    list.add(result);
+                }
+            }
+            // 杩涜鍏紡璁$畻
+            Object resultValue = calculationFormula(list, v.get(0), k, device);
+            map.put(k, resultValue);
+        });
+        return map;
+    }
+
+    /**
+     * 浠庢枃浠朵腑鎻愬彇鍑烘潵鐨勬枃瀛楋紝濡傛灉鏈夊叕寮忥紝杩涜鍏紡璁$畻锛屽惁鍒欏彇鍒楄〃绗竴涓��
+     *
+     * @param list       鎻愬彇鍑虹殑鏁板瓧
+     * @param dataConfig 瀛樺偍鍏紡鐨勫璞�
+     * @return
+     */
+    private static Object calculationFormula(List<Object> list, DataConfig dataConfig, String insProductItem, Device device) {
+        if (list.size() == 0) {
+            Map<String, Object> hashMap = new HashMap<>();
+            hashMap.put("equipName", device.getDeviceName());
+            hashMap.put("equipValue", device.getManagementNumber());
+            hashMap.put("result", null);
+            return hashMap;
+        }
+        ArrayList<Object> listResult = new ArrayList<>();
+        Map<String, Object> hashMap = new HashMap<>();
+        // 濡傛灉涓嶄负绌猴紝杩涜鍏紡璁$畻
+        if (ObjectUtils.isNotEmpty(dataConfig.getFormula())) {
+            // 鍚﹀垯锛氭病鏈夊叕寮忎唬琛ㄤ笉闇�瑕佽绠楋紝鐩存帴鎻愬彇List閲岄潰鐨勬暟鎹�
+            if (ObjectUtils.isEmpty(device.getEntrustCode()) && ObjectUtils.isEmpty(device.getSampleCode())) {
+                String s = calculationFormulaList(list, dataConfig.getFormula());
+                listResult.add(s);
+            } else {
+                list.forEach(i -> {
+                    List<Object> strings = Arrays.asList(i.toString().split(","));
+                    String s = calculationFormulaList(strings, dataConfig.getFormula());
+                    listResult.add(s);
+                });
+            }
+        } else {
+            listResult.addAll(list);
+        }
+        // 涓轰簡缁欏墠绔仛鏁版嵁鍖哄垎
+        if (listResult.size() > 1) {
+            hashMap.put("result", listResult);
+        } else {
+            hashMap.put("result", listResult.get(0).toString());
+        }
+        hashMap.put("equipName", device.getDeviceName());
+        hashMap.put("equipValue", device.getManagementNumber());
+        return hashMap;
+    }
+
+    /**
+     * 瑙f瀽String鏁版嵁
+     *
+     * @param data       閲囬泦鍒扮殑鏂囦欢瀛楃涓�
+     * @param dataConfig 鐢ㄦ埛閰嶇疆濂界殑x,y杞村畾浣嶆暟鎹笌鍙傜収鐗�
+     * @return
+     */
+    private static Map<String, Object> analysisTxt(String data, Map<String, List<DataConfig>> dataConfig,
+                                                   Device device, String entrustCode, String sampleCode) {
+        Map<String, Object> map = new HashMap<>();
+        dataConfig.forEach((k, v) -> {
+            List<Object> list = new ArrayList<>();
+            // 濮旀墭缂栧彿涓庢牱鍝佺紪鍙蜂笉瀛樺湪锛屽畾锛�1銆乊瀹氳寖鍥达紝X瀹氭í鍧愭爣锛�2銆佸彧瀛樺湪Y锛�3銆佸彧瀛樺湪X
+            if (ObjectUtils.isEmpty(device.getEntrustCode()) && ObjectUtils.isEmpty(device.getSampleCode())) {
+                list = analyzeData(data, v, k, ",");
+                // 濮旀墭缂栧彿涓庢牱鍝佺紪鍙峰瓨鍦�
+            } else if (ObjectUtils.isNotEmpty(device.getEntrustCode()) && ObjectUtils.isNotEmpty(device.getSampleCode())) {
+                list = analyzeDataEntrustCodAndSampleCode(data, v, k, ",", device, entrustCode, sampleCode);
+            }
+            // 杩涜鍏紡璁$畻
+            Object resultValue = calculationFormula(list, v.get(0), k, device);
+            map.put(k, resultValue);
+        });
+        return map;
+    }
+
+    /**
+     * @param data       閲囬泦鍒扮殑鏂囦欢瀛楃涓�
+     * @param dataConfig 鐢ㄦ埛閰嶇疆濂界殑x,y杞村畾浣嶆暟鎹笌鍙傜収鐗�
+     * @return
+     */
+    private static Map<String, Object> analysisString(String data, Map<String, List<DataConfig>> dataConfig, Device device,
+                                                      String entrustCode, String sampleCode) {
+        String processingDataAfterSpaces = data
+                .replaceAll("  +", splitIdentifier)
+                .replaceAll("\r", "")
+                .replaceAll(" ", "");
+        Map<String, Object> map = new HashMap<>();
+        dataConfig.forEach((k, v) -> {
+            List<Object> list = new ArrayList<>();
+            // 濮旀墭缂栧彿涓庢牱鍝佺紪鍙蜂笉瀛樺湪锛屽畾锛�1銆乊瀹氳寖鍥达紝X瀹氭í鍧愭爣锛�2銆佸彧瀛樺湪Y锛�3銆佸彧瀛樺湪X
+            if (ObjectUtils.isEmpty(device.getEntrustCode()) && ObjectUtils.isEmpty(device.getSampleCode())) {
+                list = analyzeData(processingDataAfterSpaces, v, k, splitIdentifier);
+                // 濮旀墭缂栧彿涓庢牱鍝佺紪鍙峰瓨鍦�
+            } else if (ObjectUtils.isNotEmpty(device.getEntrustCode()) && ObjectUtils.isNotEmpty(device.getSampleCode())) {
+                list = analyzeDataEntrustCodAndSampleCode(processingDataAfterSpaces, v, k, splitIdentifier, device, entrustCode, sampleCode);
+            }
+            // 杩涜鍏紡璁$畻
+            Object resultValue = calculationFormula(list, v.get(0), k, device);
+            map.put(k, resultValue);
+        });
+        return map;
+    }
+
+    /**
+     * 鍙朮锛孻涓や釜瀹氫綅
+     *
+     * @param data       閲囬泦鍒扮殑鏂囦欢瀛楃涓�
+     * @param dataConfig 鐢ㄦ埛閰嶇疆濂界殑x,y杞村畾浣嶆暟鎹笌鍙傜収鐗�
+     * @return
+     */
+    public static Map<String, Object> analysisList(String data, Map<String, List<DataConfig>> dataConfig,
+                                                   Device device, String entrustCode, String sampleCode) {
+        Map<String, Object> map = new HashMap<>();
+        dataConfig.forEach((k, v) -> {
+            List<Object> list = new ArrayList<>();
+            // 濮旀墭缂栧彿涓庢牱鍝佺紪鍙蜂笉瀛樺湪锛屽畾锛�1銆乊瀹氳寖鍥达紝X瀹氭í鍧愭爣锛�2銆佸彧瀛樺湪Y锛�3銆佸彧瀛樺湪X
+            if (ObjectUtils.isEmpty(device.getEntrustCode()) && ObjectUtils.isEmpty(device.getSampleCode())) {
+                list = analyzeData(data, v, k, splitIdentifier);
+                // 濮旀墭缂栧彿涓庢牱鍝佺紪鍙峰瓨鍦�
+            } else if (ObjectUtils.isNotEmpty(device.getEntrustCode()) && ObjectUtils.isNotEmpty(device.getSampleCode())) {
+                list = analyzeDataEntrustCodAndSampleCode(data, v, k, splitIdentifier, device, entrustCode, sampleCode);
+            }
+            // 杩涜鍏紡璁$畻
+            Object resultValue = calculationFormula(list, v.get(0), k, device);
+            map.put(k, resultValue);
+        });
+        return map;
+    }
+
+    private static List<Object> analyzeDataEntrustCodAndSampleCode(String data, List<DataConfig> v, String k, String splitIdentifier,
+                                                                   Device device, String entrustCodeValue, String sampleCodeValue) {
+        entrustCodeValue = entrustCodeValue.replaceAll(" ", "");
+        sampleCodeValue = sampleCodeValue.replaceAll(" ", "");
+        // 鏈�缁堢粨鏋�
+        List<Object> list = new ArrayList<>();
+        int numberOfDataEntries = 0;
+        // 鍙杄ntrustCode涓巗ampleCode鎵�鍦ㄤ綅
+        for (int config = 0; config < v.size(); config++) {
+            numberOfDataEntries = 0;
+            Integer entrustCodeY = null;
+            Integer sampleCodeY = null;
+            Integer referYCoordinate = null;
+            String refery = getRefer(v.get(config).getRefery());
+            String entrustCode = getRefer(device.getEntrustCode()); // 濮旀墭缂栧彿瀛楁
+            String sampleCode = getRefer(device.getSampleCode()); // 鏍峰搧缂栧彿瀛楁
+            if (ObjectUtils.isEmpty(refery)) {
+                continue;
+            }
+            // 鍘婚櫎鎵�鏈夌殑绌烘牸锛岄�氳繃\n灏嗗瓧绗︿覆鍒嗗壊涓鸿
+            String[] aColumnY = data.replaceAll(" ", "").split("\n");
+            for (int i = 0; i < aColumnY.length; i++) {
+                // 濡傛灉閫氳繃鍒ゆ柇锛屽畾浣嶅埌Y杞�
+                if (aColumnY[i].contains(entrustCode) && aColumnY[i].contains(sampleCode)) {
+                    String[] aLine = aColumnY[i].split(splitIdentifier);
+                    for (int j = 0; j < aLine.length; j++) {
+                        if (aLine[j].contains(entrustCode)) {
+                            entrustCodeY = j;
+                        }
+                        if (aLine[j].contains(sampleCode)) {
+                            sampleCodeY = j;
+                        }
+                        if (aLine[j].contains(refery)) {
+                            referYCoordinate = j;
+                        }
+                    }
+                }
+                if (ObjectUtils.isNotEmpty(entrustCodeY) && ObjectUtils.isNotEmpty(sampleCodeY) && ObjectUtils.isNotEmpty(referYCoordinate)) {
+                    String[] aLine = aColumnY[i].split(splitIdentifier);
+                    try {
+                        if (aLine[entrustCodeY].contains(entrustCodeValue) && aLine[sampleCodeY].contains(sampleCodeValue)) {
+                            String result = aLine[referYCoordinate];
+                            // 闃叉璁$畻鍏紡鐨勬椂鍊欏嚭鐜帮細[null] 杩欑鏁版嵁
+                            if (ObjectUtils.isNotEmpty(result)) {
+                                numberOfDataEntries += 1;
+                                list.add(result);
+                            }
+                        }
+                    } catch (Exception e) {
+                    }
+                }
+            }
+        }
+        // 鎷兼帴鏁伴噰閰嶇疆
+        List<Object> result = new ArrayList<>();
+        for (int i = 0; i < numberOfDataEntries; i++) {
+            String aggregate = "";
+            for (int j = 0; j < v.size(); j++) {
+                int index;
+                if (j == 0) {
+                    index = i;
+                } else {
+                    index = numberOfDataEntries + i;
+                }
+                aggregate += list.get(index).toString() + ",";
+            }
+            int lastIndex = aggregate.lastIndexOf(",");
+            String substring = aggregate.substring(0, lastIndex);
+            result.add(substring);
+        }
+        return result;
+    }
+
+    // 鐢变簬鍦ㄦ柟娉曚腑浼氬ぇ閲忕殑鍒ゆ柇锛屾墍浠ュ仛涓�涓柟娉�
+    private static int getXOrY(String value, String k, String tips) {
+        try {
+            return Integer.parseInt(value);
+        } catch (NumberFormatException e) {
+            throw new ErrorException(k + "锛氭湭閰嶇疆" + tips + "鍧愭爣杞寸殑鍊硷紒");
+        }
+    }
+
+    // 闃叉鍙傜収鐗╀负绌烘姤閿欙紝杩涜鍒ゆ柇濡傛灉涓虹┖璧嬪�肩┖瀛楃
+    private static String getRefer(String refer) {
+        return ObjectUtils.isNotEmpty(refer) ? refer.replaceAll(" ", "") : "";
+    }
+
+    /**
+     * 濮旀墭缂栧彿涓庢牱鍝佺紪鍙烽兘涓虹┖鎵ц
+     *
+     * @param data
+     * @param v
+     * @param k
+     * @param split
+     * @return
+     */
+    public static List<Object> analyzeData(String data, List<DataConfig> v, String k, String split) {
+        List<Object> list = new ArrayList<>();
+        for (int config = 0; config < v.size(); config++) {
+            // 鍙栦袱涓敤鎴烽厤缃殑鍙傜収鐗�
+            String referx = getRefer(v.get(config).getReferx());
+            String refery = getRefer(v.get(config).getRefery());
+            if (ObjectUtils.isEmpty(refery) && ObjectUtils.isEmpty(referx)) {
+                continue;
+            }
+            // 鏈�缁堢粨鏋�
+            String result = null;
+            // 閫氳繃\n灏嗗瓧绗︿覆鍒嗗壊涓鸿
+            String[] aColumnY = data.replaceAll(" ", "").split("\n");
+            Integer end = null;
+            // 閲囬泦鏁版嵁锛歒杞�
+            for (int i = 0; i < aColumnY.length; i++) {
+                // 濡傛灉Y鍙傜収涓嶄负绌轰笌X鍙傜収涓虹┖鍒欐墽琛岋紝鍚屾椂璇ヨ鍖呭惈Y鍙傜収
+                if (ObjectUtils.isNotEmpty(refery) && ObjectUtils.isEmpty(referx) && aColumnY[i].contains(refery)) {
+                    // 鍙朰鍧愭爣鍊�
+                    int y = getXOrY(v.get(config).getY(), k, "Y");
+                    String[] aLineX = aColumnY[i].split(split);
+                    for (int j = 0; j < aLineX.length; j++) {
+                        if (aLineX[j].contains(refery)) {
+                            String[] split1 = new String[0];
+                            try {
+                                split1 = aColumnY[i + y].split(split);
+                            } catch (Exception e) {
+                                throw new ErrorException(k + "锛歒杞村畾浣嶈秴鍑猴紒");
+                            }
+                            try {
+                                result = split1[j];
+                            } catch (Exception e) {
+                                throw new ErrorException(k + "锛歑杞村畾浣嶈秴鍑猴紒");
+                            }
+                        }
+                    }
+                // 濡傛灉Y鍙傜収涓嶄负绌轰笌X鍙傜収涓嶄负绌哄垯鎵ц,姝ゅY瀹氬尯鍩�
+                } else if (ObjectUtils.isNotEmpty(refery) && ObjectUtils.isNotEmpty(referx)) {
+                    // 鍙杧鐨勫�硷紝闃叉鎶ラ敊
+                    int x = getXOrY(v.get(config).getX(), k, "X");
+                    // 鍙朰鍧愭爣鍊�
+                    int y = getXOrY(v.get(config).getY(), k, "Y");
+                    // 缂撳瓨Y鐨勭粨鏉熷��
+                    if (ObjectUtils.isEmpty(end) && aColumnY[i].contains(refery)) {
+                        end = i + y;
+                    }
+                    // 鍒ゆ柇鏄惁鍦ㄥ弬鐓х墿涓鸿捣鍒帮紝Y鍧愭爣鍊间负鏈�缁堣寖鍥�
+                    if (ObjectUtils.isNotEmpty(end) && i <= end) {
+                        String[] aLineX = aColumnY[i].split(split);
+                        // 鍙栬鏁版嵁鐨勫崟鍏冩牸鏁版嵁
+                        for (int j = 0; j < aLineX.length; j++) {
+                            if (aLineX[j].contains(referx)) {
+                                try {
+                                    result = aLineX[j + x];
+                                } catch (Exception e) {}
+                                break;
+                            }
+                        }
+                    }
+                    // 濡傛灉X鍙傜収涓嶄负绌哄悓鏃惰琛屽寘鍚玐鍙傜収锛屽垯鎵ц涓嬮潰鐨勪唬鐮�
+                } else if (aColumnY[i].contains(referx) && ObjectUtils.isEmpty(refery)) {
+                    String[] aLineX = aColumnY[i].split(split);
+                    // 鍙杧鐨勫�硷紝闃叉鎶ラ敊
+                    int x = getXOrY(v.get(config).getX(), k, "X");
+                    // 鍙栬鏁版嵁鐨勫崟鍏冩牸鏁版嵁
+                    for (int j = 0; j < aLineX.length; j++) {
+                        if (aLineX[j].contains(referx)) {
+                            try {
+                                result = aLineX[j + x];
+                            } catch (Exception e) {}
+                        }
+                    }
+                }
+            }
+            // 闃叉璁$畻鍏紡鐨勬椂鍊欏嚭鐜帮細[null] 杩欑鏁版嵁
+            if (ObjectUtils.isNotEmpty(result)) {
+                String formatProcessing = getFormatProcessing(result);
+                list.add(formatProcessing);
+            }
+        }
+        return list;
+    }
+
+    /**
+     *
+     * @param j 妯潗鏍�
+     * @param x 绾靛潗鏍�
+     * @param aLineX 琛屾暟鎹�
+     * @param referx x鍙傜収鐗�
+     * @param k 妫�楠岄」鐩�
+     * @return
+     */
+    public static String getCellValue(int x, String[] aLineX, String referx, String k) {
+        String result = null;
+        for (int j = 0; j < aLineX.length; j++) {
+            try {
+                int xAddY = j + x;
+                if (aLineX[j].contains(referx)) {
+                    result = aLineX[xAddY];
+                }
+            } catch (Exception e) {}
+        }
+        return result;
+    }
+
+    public static String getFormatProcessing(String value) {
+        value = value.replaceAll("%", "");
+        if (value.contains("=")) {
+            String[] split = value.split("=");
+            return split[split.length - 1];
+        } else if (value.contains(":")) {
+            String[] split = value.split(":");
+            return split[split.length - 1];
+        } else {
+            return value;
+        }
+    }
+
+    public static String getIp(HttpServletRequest request) {
+        String ipAddress = request.getRemoteAddr();
+        // 闃叉鍥炵幆鍦板潃鍙樹负IPv6
+        return ipAddress.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ipAddress;
+    }
+
+    public static String calculationFormulaList(List<Object> list, String formula) {
+        //棣栧厛灏唋ist杞崲涓篵igdecmic
+        List<BigDecimal> bigDecimalList = list.stream()
+                .map(obj -> {
+                    return new BigDecimal((obj).toString());
+                }).collect(Collectors.toList());
+
+        //灏嗕腑鏂囩殑(杞崲鑻辨枃鐨�())
+        formula = formula.replace("锛�", "(")
+                .replace("锛�", ")")
+                .replace("锛�", ",");
+        //鐒跺悗鎻愬彇鍏紡
+        String strs = formula.substring(0, formula.indexOf("("));
+        String upperStr = strs.toUpperCase();
+        if (upperStr.matches(".*\\d.*")) {
+            upperStr = "";
+        }
+        //鐒跺悗鑾峰彇鏈�澶栭潰鎷彿閲岄潰鐨勫��,鍐嶆牴鎹�","鍒嗗壊
+        int start = formula.indexOf("(");
+        int end = -1;
+        int a = 0;
+        for (int i = start; i < formula.length(); i++) {
+            char c = formula.charAt(i);
+            if (c == '(') {
+                a++;
+            } else if (c == ')') {
+                a--;
+                if (a == 0) {
+                    end = i;
+                }
+            }
+        }
+        if (start == -1 || end == -1) {
+            throw new ErrorException("鍏紡鎷彿涓嶅尮閰�: " + formula);
+        }
+
+        String argumentsStr = formula.substring(start + 1, end);
+        List<String> arguments = new ArrayList<>();
+        int bracketCount = 0;
+        StringBuilder currentArgument = new StringBuilder();
+        for (char c : argumentsStr.toCharArray()) {
+            if (c == ',' && bracketCount == 0) {
+                arguments.add(currentArgument.toString());
+                currentArgument.setLength(0);
+            } else {
+                if (c == '(') bracketCount++;
+                if (c == ')') bracketCount--;
+                currentArgument.append(c);
+            }
+        }
+        arguments.add(currentArgument.toString());
+        String[] bracketStrs = arguments.toArray(new String[0]);
+        List<BigDecimal> results = new ArrayList<>();
+        for (String expr : bracketStrs) {
+            Pattern pattern = Pattern.compile("([A-Z])(\\d+)");
+            Matcher matcher = pattern.matcher(expr);
+            StringBuffer sb = new StringBuffer();
+            while (matcher.find()) {
+                String letter = matcher.group(1);
+                int index = Integer.parseInt(matcher.group(2)) - 1; // 灏�1-based杞负0-based
+                if (index < bigDecimalList.size()) {
+                    matcher.appendReplacement(sb, bigDecimalList.get(index).toString());
+                } else {
+                    throw new RuntimeException("鍏紡涓殑涓嬫爣 " + index + " 瓒呭嚭鑼冨洿");
+                }
+            }
+            matcher.appendTail(sb);
+
+            // 璁$畻琛ㄨ揪寮�
+            ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
+            try {
+                Object result = engine.eval(sb.toString());
+                results.add(new BigDecimal(result.toString()));
+            } catch (Exception e) {
+                throw new IllegalArgumentException("鏃犳硶璁$畻鍏紡: " + sb, e);
+            }
+        }
+        // 鏍规嵁鍑芥暟鍚嶇О杩涜鐩稿簲璁$畻
+        BigDecimal finalResult;
+        if (upperStr.equals("") || upperStr == null) {
+            finalResult = results.get(0);
+        } else {
+            switch (upperStr) {
+                case "MAX":
+                    finalResult = results.stream().max(BigDecimal::compareTo)
+                            .orElseThrow(() -> new IllegalArgumentException("鏃犳硶璁$畻MAX鍊�"));
+                    break;
+                case "MIN":
+                    finalResult = results.stream().min(BigDecimal::compareTo)
+                            .orElseThrow(() -> new IllegalArgumentException("鏃犳硶璁$畻MIN鍊�"));
+                    break;
+                case "SUM":
+                    finalResult = results.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+                    break;
+                case "ABS":
+                    finalResult = results.stream().map(BigDecimal::abs).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    break;
+                case "AVERAGE":
+                    finalResult = results.stream().reduce(BigDecimal.ZERO, BigDecimal::divide)
+                            .divide(BigDecimal.valueOf(results.size()), 2, BigDecimal.ROUND_HALF_UP);
+                    break;
+                case "MEDIAN":
+                    int size = results.size();
+                    if (size % 2 == 1) {
+                        finalResult = results.get(size / 2);
+                    } else {
+                        BigDecimal sum = results.get(size / 2 - 1).add(results.get(size / 2));
+                        finalResult = sum.divide(BigDecimal.valueOf(2), 2, BigDecimal.ROUND_HALF_UP);
+                    }
+                    break;
+                default:
+                    throw new UnsupportedOperationException("鏆備笉鏀寔鍑芥暟: " + upperStr);
+            }
+        }
+
+        return finalResult.toString();
+        // 鍚﹀垯锛氭病鏈夊叕寮忎唬琛ㄤ笉闇�瑕佽绠楋紝鐩存帴鎻愬彇List閲岄潰鐨勬暟鎹�
+    }
+}
diff --git a/cnas-require/src/main/java/com/ruoyi/requier/vo/OperationInstructionVo.java b/cnas-require/src/main/java/com/ruoyi/requier/vo/OperationInstructionVo.java
new file mode 100644
index 0000000..ab7a6d1
--- /dev/null
+++ b/cnas-require/src/main/java/com/ruoyi/requier/vo/OperationInstructionVo.java
@@ -0,0 +1,17 @@
+package com.ruoyi.requier.vo;
+
+import com.ruoyi.requier.pojo.OperationInstruction;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class OperationInstructionVo extends OperationInstruction {
+    @ApiModelProperty("绠$悊缂栧彿")
+    private String deviceNumber;
+
+    @ApiModelProperty("鍨嬪彿")
+    private String deviceModel;
+
+    @ApiModelProperty("璁惧鍚嶇О")
+    private String deviceName;
+}
diff --git a/cnas-require/src/main/resources/mapper/DataConfigMapper.xml b/cnas-require/src/main/resources/mapper/DataConfigMapper.xml
new file mode 100644
index 0000000..4e18b71
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/DataConfigMapper.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.requier.mapper.DataConfigMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.requier.pojo.DataConfig">
+        <id column="id" property="id" />
+        <result column="formula" property="formula" />
+        <result column="referx" property="referx" />
+        <result column="refery" property="refery" />
+        <result column="x" property="x" />
+        <result column="y" property="y" />
+    </resultMap>
+
+    <select id="selectDataConfigList" resultType="com.ruoyi.requier.dto.DeviceConfigDtoPage">
+        SELECT d.device_name,
+               d.file_type,
+               d.collect_url,
+               d.storage_url,
+               d.ip,
+               d.entrust_code,
+               d.sample_code,
+               d.db_file_name,
+               d.fiber_optic_ribbon,
+               ip.inspection_item,
+               if(ip.inspection_item_subclass is not null and ip.inspection_item_subclass != '',
+                  ip.inspection_item_subclass, ip.inspection_item)                            inspection_item_subclass,
+               TRIM(BOTH '["]' FROM SUBSTRING_INDEX(REPLACE(ip.sample, '[["', ''), '"]]', 1)) sample,
+               ddc.formula,
+               ddc.referx,
+               ddc.refery,
+               ddc.x,
+               ddc.y,
+               ddc.id,
+               ip.id                                                                          structureItemParameterId
+        FROM device d
+                 left join structure_item_parameter ip on FIND_IN_SET(ip.id, d.ins_product_ids)
+                 left join device_data_config ddc on ddc.device_id = d.id and ddc.structure_item_parameter_id = ip.id
+        where d.id = #{deviceId}
+    </select>
+
+    <select id="deleteDataConfig" resultType="integer">
+        SELECT ddc.id
+        FROM device d
+                 left join structure_item_parameter ip on not FIND_IN_SET(ip.id, d.ins_product_ids)
+                 inner join device_data_config ddc on ddc.device_id = d.id and ddc.structure_item_parameter_id = ip.id
+    </select>
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/DeviceFaultOneMapper.xml b/cnas-require/src/main/resources/mapper/DeviceFaultOneMapper.xml
new file mode 100644
index 0000000..d874e55
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/DeviceFaultOneMapper.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.requier.mapper.DeviceFaultOneMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.requier.pojo.DeviceFaultOne">
+        <id column="id" property="id" />
+        <result column="device_id" property="deviceId" />
+        <result column="process_number" property="processNumber" />
+        <result column="measure_of_accuracy" property="measureOfAccuracy" />
+        <result column="fault_situation" property="faultSituation" />
+        <result column="file_name" property="fileName" />
+        <result column="system_file_name" property="systemFileName" />
+        <result column="submit_next_pesponsible" property="submitNextPesponsible" />
+        <result column="submit_operating_personnel" property="submitOperatingPersonnel" />
+        <result column="submit_date" property="submitDate" />
+        <result column="method_cost" property="methodCost" />
+        <result column="admin_audit_option" property="adminAuditOption" />
+        <result column="admin_next_pesponsible" property="adminNextPesponsible" />
+        <result column="admin_operating_personnel" property="adminOperatingPersonnel" />
+        <result column="technical_audit_option" property="technicalAuditOption" />
+        <result column="technical_next_pesponsible" property="technicalNextPesponsible" />
+        <result column="technical_operating_personnel" property="technicalOperatingPersonnel" />
+        <result column="technical_date" property="technicalDate" />
+        <result column="maintain_situation" property="maintainSituation" />
+        <result column="maintain_next_pesponsible" property="maintainNextPesponsible" />
+        <result column="maintain_operating_personnel" property="maintainOperatingPersonnel" />
+        <result column="maintain_date" property="maintainDate" />
+        <result column="check_cal_situation" property="checkCalSituation" />
+        <result column="after_maintenance_operating_personnel" property="afterMaintenanceOperatingPersonnel" />
+        <result column="after_maintenance_date" property="afterMaintenanceDate" />
+        <result column="current_status" property="currentState" />
+        <result column="submit_person" property="submitPerson" />
+        <result column="current_responsible" property="currentResponsible" />
+        <result column="create_time" property="createTime" />
+    </resultMap>
+
+    <select id="deviceFaultOnePage" resultType="com.ruoyi.requier.dto.DeviceFaultOneDto">
+        select dfo.*,
+               d.device_name,
+               d.management_number,
+               d.specification_model
+        from device_fault_one dfo
+                 left join device d on d.id = dfo.device_id
+        where dfo.device_id = #{deviceId}
+        <if test="processNumber != '' and processNumber != null">
+            and dfo.process_number like concat('%', #{processNumber}, '%')
+        </if>
+    </select>
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/DeviceMaintenanceMapper.xml b/cnas-require/src/main/resources/mapper/DeviceMaintenanceMapper.xml
new file mode 100644
index 0000000..c596bbd
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/DeviceMaintenanceMapper.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.requier.mapper.DeviceMaintenanceMapper">
+
+    <select id="getDeviceMaintenanceParam" resultType="com.ruoyi.requier.pojo.DeviceMaintenance">
+        select id,device_id,device_name, device_number,management_number,content,name
+        ,date from device_maintenance
+    </select>
+
+<!--    <select id="getDeviceMaintenancePage" resultType="com.ruoyi.requier.pojo.DeviceMaintenance">-->
+<!--        select *-->
+<!--        from device_maintenance dm-->
+<!--        where dm.device_id = #{deviceId}-->
+<!--    </select>-->
+
+    <select id="deviceMaintenanceExport" resultType="com.ruoyi.requier.dto.DeviceMaintenanceExport">
+        select id, device_id, device_name, device_number, management_number, content, date, if(maintenance_type = 1, '璁″垝涓淮鎶�', '浣跨敤鍓嶅悗缁存姢'), next_date, name, comments
+        from device_maintenance dm
+        where dm.device_id = #{deviceId}
+    </select>
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/DeviceMapper.xml b/cnas-require/src/main/resources/mapper/DeviceMapper.xml
new file mode 100644
index 0000000..5f0ad41
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/DeviceMapper.xml
@@ -0,0 +1,184 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.requier.mapper.DeviceMapper">
+    <select id="selectDeviceParameter" resultType="com.ruoyi.requier.pojo.Device">
+        select * from(
+        select id,
+        large_category,
+        date_production,
+        equipment_manager,
+        authorized_person,
+        device_name,
+        internal_code,
+        asset_code,
+        calibration_date,
+        scrap_time,
+        acceptance_records,
+        subclass,
+        factory_no,
+        acquisition_date,
+        accurate_measurement,
+        specification_model,
+        device_status,
+        storage_point,
+        activation_date,
+        latest_traceability,
+        down_time,
+        maintenance_records,
+        manufacturer,
+        detection_type,
+        procurement_costs,
+        calibration_certicate,
+        create_user,
+        create_time,
+        update_user,
+        update_time,
+        status
+        from device
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="selectEquipmentOverview" resultType="com.ruoyi.requier.pojo.Device">
+        select * from(
+        select id,
+        device_name,
+        specification_model,
+        device_status,
+        create_user,
+        status,
+        update_time
+        from device
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="authorizedPerson" resultType="com.ruoyi.requier.pojo.Device">
+        select id,
+               authorized_person
+        from device
+    </select>
+    <select id="search" resultType="com.ruoyi.requier.pojo.Device">
+        select *
+        from device
+        <where>
+            <if test="deviceName!=null and deviceName!=''">
+                and device_name like concat('%',#{deviceName},'%')
+            </if>
+            <if test="specificationModel!=null and specificationModel!= ''">
+                and specification_model = #{specificationModel}
+            </if>
+            <if test="largeCategory!=null">
+                and large_category = #{largeCategory}
+            </if>
+            <if test="largeCategory == 'null'">
+                and (large_category = '' or large_category is null)
+            </if>
+        </where>
+    </select>
+
+    <select id="selectDeviceImage" resultType="com.ruoyi.requier.pojo.Device">
+        select (image_upload, create_user, create_time) values (#{image_upload}
+             , #{createUser}
+             , #{createTime})
+    </select>
+    <select id="selectDevicePrincipal" resultType="com.ruoyi.requier.pojo.Device">
+        select id,
+               equipment_manager
+        from device
+    </select>
+
+    <select id="selectDeviceParameterPage" resultType="com.ruoyi.requier.dto.DeviceDto">
+        select * from(
+        SELECT
+        d.*,
+        cmr.calibration_date as last_calibration_date_two,
+        cmr.next_calibration_date as next_calibration_date_two,
+        GROUP_CONCAT(distinct inspection_item SEPARATOR ';') AS insProductItem,
+        u.name ,
+        l.laboratory_name
+        FROM
+        device d
+        LEFT JOIN `user` u ON u.id = d.equipment_manager
+        LEFT JOIN laboratory l ON l.id = d.subordinate_departments_id
+        LEFT JOIN device_metric_record cmr ON d.id = cmr.device_id
+        LEFT JOIN structure_item_parameter sip ON FIND_IN_SET(sip.id, d.ins_product_ids)
+        <where>
+            <if test="laboratoryNameIsNull != null and laboratoryNameIsNull == true">
+                l.laboratory_name is null
+            </if>
+            AND cmr.type = 'calibrate' or cmr.type is null or cmr.type = ''
+        </where>
+        GROUP BY
+        d.id,
+        u.name, l.laboratory_name
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+    <select id="getInspectionItemSubclass" resultType="map">
+        SELECT ip.inspection_item,
+               if(ip.inspection_item_subclass is not null and ip.inspection_item_subclass != '',
+                  ip.inspection_item_subclass, ip.inspection_item) inspection_item_subclass
+        FROM ins_product ip
+        where ip.ins_sample_id = #{id}
+    </select>
+    <resultMap id="treeDeviceDto" type="map">
+        <result property="label" column="laboratory_name"/>
+        <result property="value" column="value" />
+        <collection property="children" resultMap="storagePointMap" javaType="List"/>
+    </resultMap>
+
+    <resultMap id="storagePointMap" type="map">
+        <result property="value" column="value"/>
+        <result property="label" column="storage_point"/>
+        <collection property="children" resultMap="deviceNameMap" javaType="List"/>
+    </resultMap>
+
+    <resultMap id="deviceNameMap" type="map">
+        <result property="value" column="id"/>
+        <result property="label" column="device_name"/>
+    </resultMap>
+
+    <select id="treeDevice" resultMap="treeDeviceDto">
+        select
+        d.id,
+        case when l.laboratory_name is null || l.laboratory_name ='' then '鍏朵粬' else l.laboratory_name end as laboratory_name,
+        case when d.storage_point is null || d.storage_point ='' then '鍏朵粬' else d.storage_point end as storage_point,
+        d.device_name,
+        null as value
+        from device d
+        LEFT JOIN laboratory l ON l.id = d.subordinate_departments_id
+        <where>
+            <if test="deviceName!=null and deviceName!=''">
+                and device_name like concat('%',#{deviceName},'%')
+            </if>
+        </where>
+        order by l.laboratory_name desc, d.storage_point desc
+    </select>
+
+    <select id="selectDeviceByCode" resultType="com.ruoyi.requier.dto.DeviceDto">
+        SELECT d.*,
+               GROUP_CONCAT(DISTINCT inspection_item SEPARATOR ';') AS ins_product_item,
+               l.laboratory_name,
+               u1.NAME                                                 equipmentManager_name,
+               u2.NAME                                                 authorized_person_name
+        FROM device d
+                 LEFT JOIN structure_item_parameter sip ON FIND_IN_SET(sip.id, d.ins_product_ids)
+                 LEFT JOIN laboratory l ON d.subordinate_departments_id = l.id
+                 LEFT JOIN USER u1 ON u1.id = d.equipment_manager
+                 LEFT JOIN USER u2 ON u2.id = d.authorized_person
+        WHERE d.id = #{id}
+
+        GROUP BY d.id,
+                 l.laboratory_name,
+                 u1.NAME,
+                 u2.NAME
+    </select>
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/DeviceMetricRecordMapper.xml b/cnas-require/src/main/resources/mapper/DeviceMetricRecordMapper.xml
new file mode 100644
index 0000000..5b51fbe
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/DeviceMetricRecordMapper.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.requier.mapper.DeviceMetricRecordMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.requier.pojo.DeviceMetricRecord">
+        <id column="id" property="id" />
+        <result column="unit_of_measure" property="unitOfMeasure" />
+        <result column="calibration_date" property="calibrationDate" />
+        <result column="next_calibration_date" property="nextCalibrationDate" />
+        <result column="calculating_apparatus" property="calculatingApparatus" />
+        <result column="standard_range" property="standardRange" />
+        <result column="calibration_standard_uncertainty" property="calibrationStandardUncertainty" />
+        <result column="by_document" property="byDocument" />
+        <result column="certificate_serial_number" property="certificateSerialNumber" />
+        <result column="status" property="status" />
+        <result column="file_name" property="fileName" />
+        <result column="system_file_name" property="systemFileName" />
+        <result column="remark" property="remark" />
+    </resultMap>
+
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/DeviceMetricsCopyMapper.xml b/cnas-require/src/main/resources/mapper/DeviceMetricsCopyMapper.xml
new file mode 100644
index 0000000..e331c6a
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/DeviceMetricsCopyMapper.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.requier.mapper.DeviceMetricsCopyMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.requier.pojo.DeviceMetricsCopy">
+        <id column="id" property="id" />
+        <result column="measurement_parameter" property="measurementParameter" />
+        <result column="range_of_measurement" property="rangeOfMeasurement" />
+        <result column="max_permissible_error" property="maxPermissibleError" />
+        <result column="judgment_criteria" property="judgmentCriteria" />
+        <result column="created_by" property="createdBy" />
+        <result column="creation_time" property="creationTime" />
+        <result column="is_calibration" property="isCalibration" />
+        <result column="result" property="result" />
+        <result column="single_result_statement" property="singleResultStatement" />
+    </resultMap>
+
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/IncidentAcceptanceCheckMapper.xml b/cnas-require/src/main/resources/mapper/IncidentAcceptanceCheckMapper.xml
new file mode 100644
index 0000000..85bfa21
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/IncidentAcceptanceCheckMapper.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.requier.mapper.IncidentAcceptanceCheckMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.requier.pojo.IncidentAcceptanceCheck">
+        <id column="acceptance_checkId" property="acceptanceCheckId" />
+        <result column="instrument_module" property="instrumentModule" />
+        <result column="verification_parameter" property="verificationParameter" />
+        <result column="acceptable_limit" property="acceptableLimit" />
+        <result column="verification_result" property="verificationResult" />
+        <result column="verification_conclusion" property="verificationConclusion" />
+        <result column="incident_id" property="incidentId" />
+    </resultMap>
+
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/IncidentFileMapper.xml b/cnas-require/src/main/resources/mapper/IncidentFileMapper.xml
new file mode 100644
index 0000000..26276cc
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/IncidentFileMapper.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.requier.mapper.IncidentFileMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.requier.pojo.IncidentFile">
+        <id column="file_id" property="fileId" />
+        <result column="expected_copies" property="expectedCopies" />
+        <result column="actual_copies" property="actualCopies" />
+        <result column="incident_id" property="incidentId" />
+    </resultMap>
+
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/IncidentInstallMapper.xml b/cnas-require/src/main/resources/mapper/IncidentInstallMapper.xml
new file mode 100644
index 0000000..6e6ff1f
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/IncidentInstallMapper.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.requier.mapper.IncidentInstallMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.requier.pojo.IncidentInstall">
+        <id column="install_id" property="installId" />
+        <result column="installation_project" property="installationProject" />
+        <result column="installation_situation" property="installationSituation" />
+        <result column="installation_completed" property="installationCompleted" />
+        <result column="incident_id" property="incidentId" />
+    </resultMap>
+
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/IncidentReportMapper.xml b/cnas-require/src/main/resources/mapper/IncidentReportMapper.xml
new file mode 100644
index 0000000..bb3022b
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/IncidentReportMapper.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.requier.mapper.IncidentReportMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.requier.pojo.IncidentReport">
+        <id column="id" property="id" />
+        <result column="process_number" property="processNumber" />
+        <result column="device_id" property="deviceId" />
+        <result column="serial_number" property="serialNumber" />
+        <result column="device_class" property="deviceClass" />
+        <result column="check_outer_packaging" property="checkOuterPackaging" />
+        <result column="file_name" property="fileName" />
+        <result column="system_file_name" property="systemFileName" />
+        <result column="unpacking_acceptance_conclusion" property="unpackingAcceptanceConclusion" />
+        <result column="submit_next_pesponsible" property="submitNextPesponsible" />
+        <result column="submit_remarks" property="submitRemarks" />
+        <result column="submit_operating_personnel" property="submitOperatingPersonnel" />
+        <result column="submit_date" property="submitDate" />
+        <result column="unpacking_review_opinion" property="unpackingReviewOpinion" />
+        <result column="unpacking_next_pesponsible" property="unpackingNextPesponsible" />
+        <result column="unpacking_operating_personnel" property="unpackingOperatingPersonnel" />
+        <result column="unpacking_date" property="unpackingDate" />
+        <result column="install_location" property="installLocation" />
+        <result column="install_remarks" property="installRemarks" />
+        <result column="install_next_pesponsible" property="installNextPesponsible" />
+        <result column="install_operating_personnel" property="installOperatingPersonnel" />
+        <result column="install_date" property="installDate" />
+        <result column="installation_acceptance_compound_opinion" property="installationAcceptanceCompoundOpinion" />
+        <result column="installation_acceptance_next_pesponsible" property="installationAcceptanceNextPesponsible" />
+        <result column="installation_acceptance_operating_personnel" property="installationAcceptanceOperatingPersonnel" />
+        <result column="installation_acceptance_date" property="installationAcceptanceDate" />
+        <result column="acceptance_check_unpacking_conclusion" property="acceptanceCheckUnpackingConclusion" />
+        <result column="acceptance_check_next_pesponsible" property="acceptanceCheckNextPesponsible" />
+        <result column="acceptance_check_operating_personnel" property="acceptanceCheckOperatingPersonnel" />
+        <result column="acceptance_check_date" property="acceptanceCheckDate" />
+        <result column="acceptance_audit_operating_personnel" property="acceptanceAuditOperatingPersonnel" />
+        <result column="acceptance_audit_date" property="acceptanceAuditDate" />
+        <result column="create_user" property="createUser" />
+        <result column="current_state" property="currentState" />
+        <result column="create_time" property="createTime" />
+        <result column="current_responsible" property="currentResponsible" />
+        <result column="acceptance_audit_audit_opinion" property="acceptanceAuditAuditOpinion" />
+    </resultMap>
+
+    <resultMap id="IncidentReportAddDtoMap" type="com.ruoyi.requier.dto.IncidentReportAddDto" extends="BaseResultMap">
+        <result column="device_name" property="deviceName" />
+        <result column="management_number" property="managementNumber" />
+        <result column="manufacturer" property="manufacturer" />
+        <result column="specification_model" property="specificationModel" />
+        <collection property="sparePartsConfirmationList" ofType="com.ruoyi.requier.pojo.IncidentSpareParts">
+            <id column="spare_parts_id" property="sparePartsId" />
+            <result column="name" property="name" />
+            <result column="number" property="number" />
+            <result column="note" property="note" />
+            <result column="incident_id" property="incidentId" />
+        </collection>
+        <collection property="fileClassConfirmationList" ofType="com.ruoyi.requier.pojo.IncidentFile">
+            <id column="file_id" property="fileId" />
+            <result column="expected_copies" property="expectedCopies" />
+            <result column="actual_copies" property="actualCopies" />
+            <result column="incident_id" property="incidentId" />
+        </collection>
+        <collection property="installationAcceptanceRecordList" ofType="com.ruoyi.requier.pojo.IncidentInstall">
+            <id column="install_id" property="installId" />
+            <result column="installation_project" property="installationProject" />
+            <result column="installation_situation" property="installationSituation" />
+            <result column="installation_completed" property="installationCompleted" />
+            <result column="incident_id" property="incidentId" />
+        </collection>
+        <collection property="acceptanceCheckRecordList" ofType="com.ruoyi.requier.pojo.IncidentAcceptanceCheck">
+            <id column="acceptance_check_id" property="acceptanceCheckId" />
+            <result column="instrument_module" property="instrumentModule" />
+            <result column="verification_parameter" property="verificationParameter" />
+            <result column="acceptable_limit" property="acceptableLimit" />
+            <result column="verification_result" property="verificationResult" />
+            <result column="verification_conclusion" property="verificationConclusion" />
+            <result column="incident_id" property="incidentId" />
+        </collection>
+    </resultMap>
+
+    <select id="getByDeviceId" resultType="com.ruoyi.requier.dto.IncidentReportAddDto">
+        select dir.*, d.device_name, d.management_number, u.name submitUser
+        from device_incident_report dir
+                 left join device d on d.id = dir.device_id
+            left join user u on u.id = dir.create_user
+        where dir.device_id = #{deviceId}
+        <if test="processNumber != '' and processNumber != null">
+            and dir.process_number like concat('%', #{processNumber}, '%')
+        </if>
+    </select>
+
+    <select id="getShowIncidentReport" resultMap="IncidentReportAddDtoMap">
+        select dir.*, d.device_name, d.management_number, d.manufacturer, d.specification_model,
+               diac.acceptance_check_id, diac.instrument_module,diac.verification_parameter, diac.acceptable_limit, diac.verification_result, diac.verification_conclusion,
+               disp.spare_parts_id, disp.name, disp.number, disp.note,
+               dif.file_id, dif.expected_copies, dif.actual_copies,
+               dii.install_id, dii.installation_completed, dii.installation_project, dii.installation_situation
+        from device_incident_report dir
+                 left join device d on d.id = dir.device_id
+                 left join device_incident_acceptance_check diac on diac.incident_id = dir.id
+                 left join device_incident_file dif on dif.incident_id = dir.id
+                 left join device_incident_install dii on dii.incident_id = dir.id
+                 left join device_incident_spare_parts disp on disp.incident_id = dir.id
+        where dir.id = #{id}
+    </select>
+
+    <select id="incidentReportExport" resultType="com.ruoyi.requier.excel.IncidentReportExport">
+        select dir.*, d.device_name, d.management_number, d.manufacturer, d.specification_model
+        from device_incident_report dir
+                 left join device d on d.id = dir.device_id
+        where dir.device_id = #{deviceId}
+    </select>
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/IncidentSparePartsMapper.xml b/cnas-require/src/main/resources/mapper/IncidentSparePartsMapper.xml
new file mode 100644
index 0000000..f790022
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/IncidentSparePartsMapper.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.requier.mapper.IncidentSparePartsMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.requier.pojo.IncidentSpareParts">
+        <id column="spare_parts_id" property="sparePartsId" />
+        <result column="name" property="name" />
+        <result column="number" property="number" />
+        <result column="note" property="note" />
+        <result column="incident_id" property="incidentId" />
+    </resultMap>
+
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/InformationNotificationMapper.xml b/cnas-require/src/main/resources/mapper/InformationNotificationMapper.xml
new file mode 100644
index 0000000..63f77b4
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/InformationNotificationMapper.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.requier.mapper.InformationNotificationMapper">
+
+    <select id="getPage" resultType="com.ruoyi.requier.dto.InformationNotificationDto">
+        select i.*, u.name senderUser, u2.name consigneeUser
+        from information_notification i
+                 left join user u on i.sender_id = u.id
+                 left join user u2 on u2.id = i.consignee_id
+        where i.consignee_id = #{userId}
+        <if test="messageType != '' and messageType != null">
+            and i.message_type = #{messageType}
+        </if>
+        order by i.create_time desc
+    </select>
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/InstructionMapper.xml b/cnas-require/src/main/resources/mapper/InstructionMapper.xml
new file mode 100644
index 0000000..f669677
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/InstructionMapper.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.requier.mapper.InstructionMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.requier.pojo.Instruction">
+        <id column="id" property="id" />
+        <result column="application_number" property="applicationNumber" />
+        <result column="person_liable" property="personLiable" />
+        <result column="controlled_application_description" property="controlledApplicationDescription" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="create_user" property="createUser" />
+        <result column="update_user" property="updateUser" />
+    </resultMap>
+
+    <select id="pageByPageQueryOfHomeworkInstructions" resultType="com.ruoyi.requier.dto.OperationInstructionDto">
+        SELECT
+            doi.*,di.*,d.device_name, d.management_number device_number, d.specification_model device_model, u.name uploader_name, u1.name approver_name
+        FROM
+            device_operation_instruction doi
+                LEFT JOIN device_instruction di ON di.id = doi.instruction_id
+                left join device d on d.id = doi.device_id
+                left join user u on u.id = doi.uploader
+                left join user u1 on u1.id = doi.approver_id
+    </select>
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/OperationInstructionMapper.xml b/cnas-require/src/main/resources/mapper/OperationInstructionMapper.xml
new file mode 100644
index 0000000..316fe0a
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/OperationInstructionMapper.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.requier.mapper.OperationInstructionMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.requier.pojo.OperationInstruction">
+        <id column="id" property="id" />
+        <result column="device_id" property="deviceId" />
+        <result column="document_number" property="documentNumber" />
+        <result column="author" property="author" />
+        <result column="system_file_name" property="systemFileName" />
+        <result column="update_time" property="updateTime" />
+        <result column="create_time" property="createTime" />
+        <result column="update_user" property="updateUser" />
+        <result column="create_user" property="createUser" />
+    </resultMap>
+
+    <select id="homeworkGuidebookEditor" resultType="com.ruoyi.requier.vo.OperationInstructionVo">
+        SELECT
+            doi.*,d.device_name, d.management_number device_number, d.specification_model device_model
+        FROM
+            device_operation_instruction doi
+                left join device d on d.id = doi.device_id
+        where doi.instruction_id = #{instructionId}
+    </select>
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/PkMasterMapper.xml b/cnas-require/src/main/resources/mapper/PkMasterMapper.xml
new file mode 100644
index 0000000..92dff33
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/PkMasterMapper.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.requier.mapper.PkMasterMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.requier.pojo.PkMaster">
+        <id column="id" property="id" />
+        <result column="entrust_code" property="entrustCode" />
+        <result column="sample_code" property="sampleCode" />
+        <result column="model" property="model" />
+        <result column="cycles" property="cycles" />
+        <result column="temperature" property="temperature" />
+        <result column="number_optical_fibers" property="numberOpticalFibers" />
+        <result column="ISID" property="isid" />
+        <result column="detection_date" property="detectionDate" />
+        <result column="detection_people" property="detectionPeople" />
+    </resultMap>
+
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/PkSlaveMapper.xml b/cnas-require/src/main/resources/mapper/PkSlaveMapper.xml
new file mode 100644
index 0000000..61f21e0
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/PkSlaveMapper.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.requier.mapper.PkSlaveMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.requier.pojo.PkSlave">
+        <id column="id" property="id" />
+        <result column="weaken_1310_A" property="weaken1310A" />
+        <result column="weaken_1310_B" property="weaken1310B" />
+        <result column="weaken_1550_A" property="weaken1550A" />
+        <result column="weaken_1550_B" property="weaken1550B" />
+        <result column="weaken_1625_A" property="weaken1625A" />
+        <result column="weaken_1625_B" property="weaken1625B" />
+        <result column="weaken_1383_A" property="weaken1383A" />
+        <result column="weaken_1383_B" property="weaken1383B" />
+        <result column="weaken_1490_A" property="weaken1490A" />
+        <result column="weaken_1490_B" property="weaken1490B" />
+        <result column="ins_bushing_id" property="insBushingId" />
+        <result column="ins_fibers_id" property="insFibersId" />
+        <result column="ins_fiber_id" property="insFiberId" />
+        <result column="shift_id" property="shiftId" />
+        <result column="create_time" property="createTime" />
+    </resultMap>
+
+    <select id="selectList1" resultMap="BaseResultMap">
+        select * from device_pk_slave where shift_id=#{isid}
+    </select>
+</mapper>
diff --git a/cnas-require/src/main/resources/mapper/ReservationMapper.xml b/cnas-require/src/main/resources/mapper/ReservationMapper.xml
new file mode 100644
index 0000000..1ccb536
--- /dev/null
+++ b/cnas-require/src/main/resources/mapper/ReservationMapper.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.requier.mapper.ReservationMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.requier.pojo.Reservation">
+        <id column="id" property="id" />
+        <result column="device_id" property="deviceId" />
+        <result column="device_name" property="deviceName" />
+        <result column="customer_name" property="customerName" />
+        <result column="reservation_time" property="reservationTime" />
+        <result column="specific_time" property="specificTime" />
+        <result column="link_person" property="linkPerson" />
+        <result column="phone" property="phone" />
+        <result column="device_number" property="deviceNumber" />
+        <result column="reservation_specification" property="reservationSpecification" />
+        <result column="create_user" property="createUser" />
+        <result column="create_date" property="createDate" />
+    </resultMap>
+
+
+    <select id="selectReservationParameterPage" resultType="com.ruoyi.requier.dto.ReservationDto">
+        SELECT
+        a.id,
+        a.create_date,
+        a.create_user,
+        a.customer_name,
+        a.device_id,
+        a.device_name,
+        a.device_number,
+        a.link_person,
+        a.phone ,
+        a.reservation_specification,
+        b.name
+        FROM
+        device_reservation a
+        INNER JOIN USER b ON a.create_user = b.id
+        where a.device_id = #{deviceId} and  a.reservation_time = #{reservationTime} and a.specific_time=#{specificTime}
+    </select>
+</mapper>
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/comparater/CustomComparator.java b/inspect-server/src/main/java/com/ruoyi/inspect/comparater/CustomComparator.java
new file mode 100644
index 0000000..f4dba96
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/comparater/CustomComparator.java
@@ -0,0 +1,100 @@
+package com.ruoyi.inspect.comparater;
+
+import com.ruoyi.common.core.domain.entity.SysDictData;
+import com.ruoyi.inspect.dto.SampleProductDto2;
+import com.ruoyi.system.service.ISysDictDataService;
+import com.ruoyi.system.service.ISysDictTypeService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.text.Collator;
+import java.util.*;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/**
+     * 鏁版嵁鏌ョ湅鎺ュ彛锛岃嚜瀹氫箟鎺掑簭瑙勫垯
+     */
+@Component
+public class CustomComparator implements Comparator<SampleProductDto2> {
+
+    public CustomComparator(ISysDictTypeService dictTypeService) {
+        this.dictTypeService = dictTypeService;
+    }
+
+    private final ISysDictTypeService dictTypeService;
+
+    @Override
+    public int compare(SampleProductDto2 o1, SampleProductDto2 o2) {
+        //鏍规嵁璇曢獙瀹ゆ帓搴�
+        if(StringUtils.isNotBlank(o1.getSonLaboratory())&& StringUtils.isNotBlank(o2.getSonLaboratory())){
+            if(!Objects.equals(o1.getSonLaboratory(),o2.getSonLaboratory())){
+                Collator instance = Collator.getInstance(Locale.CHINA);
+                return instance.compare(o1.getSonLaboratory(),o2.getSonLaboratory());
+            }
+        }
+        //鏌ヨ鍏ㄨ壊璋憋紝杩囨护鑹叉爣骞舵帓搴�
+        List<String> colorList = dictTypeService.selectDictDataByType("fiber_color_type").stream()
+                .sorted(Comparator.comparing(SysDictData::getDictSort))
+                .map(SysDictData::getDictLabel)
+                .collect(Collectors.toList());
+        //鍏堟寜鏍峰搧缂栧彿鍗囧簭
+        if(!Objects.equals(o1.getSampleCode(),o2.getSampleCode())){
+            if(containsOnlyDigits(o1.getSampleCode()) && containsOnlyDigits(o2.getSampleCode())){
+//                Integer o1Num = Integer.parseInt(o1.getSampleCode());
+//                Integer o2Num = Integer.parseInt(o2.getSampleCode());
+                Long o1Num = Long.parseLong(o1.getSampleCode());
+                Long o2Num = Long.parseLong(o2.getSampleCode());
+                return o1Num.compareTo(o2Num);
+            }
+            return o1.getSampleCode().compareTo(o2.getSampleCode());
+        }
+        //鏍规嵁濂楃鑹叉爣浠ュ強鍏夌氦鑹叉爣鎺掑簭
+        if(StringUtils.isNotBlank(o1.getBushColor())&& StringUtils.isNotBlank(o2.getBushColor())){
+            //濂楃鑹叉爣鎺掑簭
+            if(!Objects.equals(o1.getBushColor(),o2.getBushColor())){
+                Integer o1Index = colorList.indexOf(o1.getBushColor());
+                Integer o2Index = colorList.indexOf(o2.getBushColor());
+                return o1Index.compareTo(o2Index);
+            }
+            //鍏夌氦甯︽帓搴�
+            if(StringUtils.isNotBlank(o1.getCode())&& StringUtils.isNotBlank(o2.getCode())){
+                if(!Objects.equals(o1.getCode(),o2.getCode())){
+                    return o1.getCode().compareTo(o2.getCode());
+                }
+            }
+            //鍏夌氦鑹叉爣鎺掑簭
+            if(StringUtils.isNotBlank(o1.getColor())&& StringUtils.isNotBlank(o2.getColor())){
+                if(!Objects.equals(o1.getColor(),o2.getColor())){
+                    Integer o1Index = colorList.indexOf(o1.getColor());
+                    Integer o2Index = colorList.indexOf(o2.getColor());
+                    return o1Index.compareTo(o2Index);
+                }
+            }
+
+        }
+        //鏍规嵁妫�楠岄」鎺掑簭
+        if(!Objects.equals(o1.getInspectionItem(),o2.getInspectionItem())){
+            List<String> specialItems = Arrays.asList("鑰愮幆澧冨簲鍔涘紑瑁�","鐑敹缂╃巼");
+            if(specialItems.contains(o1.getInspectionItem()) && specialItems.contains(o2.getInspectionItem())){
+                return Integer.MAX_VALUE;
+            }
+            Collator instance = Collator.getInstance(Locale.CHINA);
+            return instance.compare(o1.getInspectionItem(),o2.getInspectionItem());
+        }
+        //妫�楠屽瓙椤规帓搴�
+        if(StringUtils.isNotBlank(o1.getInspectionItemSubclass())&& StringUtils.isNotBlank(o2.getInspectionItemSubclass())){
+            if(!Objects.equals(o1.getInspectionItemSubclass(),o2.getInspectionItemSubclass())){
+                Collator instance = Collator.getInstance(Locale.CHINA);
+                return instance.compare(o1.getInspectionItemSubclass(),o2.getInspectionItemSubclass());
+            }
+        }
+        return 0;
+    }
+
+    public static boolean containsOnlyDigits(String str) {
+        String regex = "\\d+"; // 鍖归厤涓�涓垨澶氫釜鏁板瓧
+        return Pattern.matches(regex, str);
+    }
+
+}
\ No newline at end of file
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsBushingController.java b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsBushingController.java
new file mode 100644
index 0000000..393fde4
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsBushingController.java
@@ -0,0 +1,35 @@
+package com.ruoyi.inspect.controller;
+
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.inspect.service.InsBushingService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 鍏夌氦閰嶇疆鐨勫绠¤〃 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-05-30 05:58:16
+ */
+@Api(tags = "妫�楠屼笅鍗�-鍏夌氦閰嶇疆-濂楃")
+@AllArgsConstructor
+@RestController
+@RequestMapping("/insBushing")
+public class InsBushingController {
+
+    private InsBushingService insBushingService;
+
+    @ApiModelProperty("/閫氳繃鏍峰搧id鑾峰彇鏍峰搧涓嬪厜绾ら厤缃唴瀹�")
+    @GetMapping("/selectBushingBySampleId")
+    public Result<?> selectBushingBySampleId(Integer sampleId){
+        return Result.success(insBushingService.selectBushingBySampleId(sampleId));
+    }
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
index 1a95be3..61a8a7b 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
@@ -3,7 +3,9 @@
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.utils.JackSonUtil;
 import com.ruoyi.inspect.dto.*;
 import com.ruoyi.inspect.pojo.InsOrder;
@@ -46,8 +48,6 @@
         return Result.success(insOrderService.selectInsOrderParameter(page, sampleOrderDto));
     }
 
-
-
     //鐢ㄤ簬妫�楠屼笅鍗曞尯鍒煡鐪嬫墍鏈夎鍗曞拰鍙煡鐪嬪悓涓�涓鎵樺崟浣嶇殑璁㈠崟
     @ApiOperation(value = "鍒ゆ柇褰撳墠瀹㈡埛绱ф�ラ搴︽槸鍚︾敤瀹�")
     @GetMapping("/hasSendUrgentOrder")
@@ -65,20 +65,20 @@
 
     @ApiOperation(value = "鍒嗛厤鎸夐挳")
     @PostMapping("/upInsOrder")
+    @Log(title = "妫�楠屼笅鍗�", businessType = BusinessType.UPDATE)
     public Result<?> upInsOrder(@RequestBody UpInsOrderDTO upInsOrderDTO) {
         return Result.success(insOrderService.upInsOrder(upInsOrderDTO));
     }
 
     @ApiOperation(value = "涓嬪崟鎸夐挳")
     @PostMapping("/addInsOrder")
-    public Result<?> addInsOrder(String str) {
-        Map<String, Object> map = JSON.parseObject(str, Map.class);
-        JSONArray jsonArray = JSON.parseArray(map.get("list")+"");
-        List<SampleProductDto> list = jsonArray.toJavaList(SampleProductDto.class);
-        InsOrder insOrder = JSON.parseObject(JSON.toJSONString(map.get("insOrder")), InsOrder.class);
-        List<List<Integer>> pairing = JSON.parseArray(map.get("pairing")+"");
-        List<List<Integer>> fiberPairing = JSON.parseArray(map.get("fiberPairing")+"");//鍏夌氦閰嶇疆閲岀殑鐔旀帴閰嶅
-        return Result.success(insOrderService.addInsOrder(list, insOrder, pairing,fiberPairing));
+    @Log(title = "妫�楠屼笅鍗�", businessType = BusinessType.INSERT)
+    public Result<?> addInsOrder(@RequestBody AddInsOrderDTO addInsOrderDTO) {
+        return Result.success(insOrderService.addInsOrder(
+                addInsOrderDTO.getList(),
+                addInsOrderDTO.getInsOrder(),
+                addInsOrderDTO.getPairing(),
+                addInsOrderDTO.getFiberPairing()));
     }
 
     @ApiOperation(value = "鏌ヨ璁㈠崟鏈�闀块璁℃椂闂�")
@@ -100,18 +100,21 @@
             @ApiImplicitParam(name = "state", value = "瀹℃牳缁撴灉 1:閫氳繃 2锛氫笉閫氳繃", dataTypeClass = Integer.class)
     })
     @PostMapping("/upInsOrderOfState")
+    @Log(title = "妫�楠屼笅鍗�", businessType = BusinessType.UPDATE)
     public Result<?> upInsOrderOfState(@RequestBody InsOrder insOrder) {
         return Result.success(insOrderService.upInsOrderOfState(insOrder));
     }
 
     @ApiOperation(value = "淇濆瓨妫�楠屾ā鏉挎寜閽�")
     @PostMapping("/addInsOrderTemplate")
+    @Log(title = "妫�楠屼笅鍗�", businessType = BusinessType.INSERT)
     public Result<?> addInsOrderTemplate(@RequestBody InsOrderTemplate insOrderTemplate) {
         return Result.success(insOrderTemplateService.addInsOrderTemplate(insOrderTemplate));
     }
 
     @ApiOperation(value = "鍒犻櫎妫�楠屾ā鏉挎寜閽�")
     @PostMapping("/delInsOrderTemplate")
+    @Log(title = "妫�楠屼笅鍗�", businessType = BusinessType.DELETE)
     public Result<?> delInsOrderTemplate(Integer id) {
         return Result.success(insOrderTemplateService.delInsOrderTemplate(id));
     }
@@ -130,8 +133,7 @@
 
     @ApiOperation(value = "閫氳繃妫�楠屽崟鏌ヨ妫�楠屾暟鎹紙鏁版嵁鏌ョ湅锛�")
     @GetMapping("/selectSampleAndProductByOrderId")
-    public Result<?> selectSampleAndProductByOrderId(@RequestBody Map<String, Object> data) throws Exception {
-        SampleProductDto2 sampleProductDto = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), SampleProductDto2.class);
+    public Result<?> selectSampleAndProductByOrderId(SampleProductDto2 sampleProductDto) {
         return Result.success(insOrderService.selectSampleAndProductByOrderId(sampleProductDto));
     }
     //鏁版嵁鏌ョ湅涓嬬殑鏌ョ湅璇︽儏锛堝崟鏍瑰瀭鐩寸噧鐑у拰鏉惧绠�
@@ -142,6 +144,7 @@
 
     @ApiOperation(value = "瀵煎嚭宸叉濮旀墭鍗�")
     @PostMapping("/exportChecked")
+    @Log(title = "妫�楠屼笅鍗�", businessType = BusinessType.EXPORT)
     public void exportChecked(@RequestBody Map<String, Object> data, HttpServletResponse response) {
         insOrderService.exportChecked(data,response);
     }
@@ -155,6 +158,7 @@
 
     @ApiOperation(value = "鎾ら攢鎸夐挳")
     @PutMapping("/updateStatus")
+    @Log(title = "妫�楠屼笅鍗�", businessType = BusinessType.UPDATE)
     public Result<?> updateStatus(Integer id) {
         insOrderService.updateStatus(id);
         return Result.success();
@@ -209,6 +213,7 @@
      * @param data
      * @return
      */
+    @Log(title = "妫�楠屼笅鍗�", businessType = BusinessType.UPDATE)
     @PostMapping("/revoke")
     public Result<?> revoke(@RequestBody Map<String, Object> data)   {
         insProductService.revoke(data);
@@ -253,13 +258,12 @@
         return Result.success(insProductService.revokeReviewProduct(orderId,sampleId));
     }
 
-
-
     /**
      * 鎾ら攢瀹℃牳閫氳繃
      * @param orderId
      * @return
      */
+    @Log(title = "妫�楠屼笅鍗�", businessType = BusinessType.UPDATE)
     @GetMapping("/revocationPassed")
     public Result<?> revocationPassed(Integer orderId){
         insProductService.revocationPassed(orderId);
@@ -271,6 +275,7 @@
      * @param orderId
      * @return
      */
+    @Log(title = "妫�楠屼笅鍗�", businessType = BusinessType.UPDATE)
     @GetMapping("/revocationCancel")
     public Result<?> revocationCancel(Integer orderId){
         insProductService.revocationCancel(orderId);
@@ -280,6 +285,7 @@
 
     @ApiOperation(value = "寰呮鐨勬挙閿�")
     @PutMapping("/updateInspected")
+    @Log(title = "妫�楠屼笅鍗�", businessType = BusinessType.UPDATE)
     public Result<?> updateInspected(Integer orderId,String ids){
         insProductService.updateInspected(orderId,ids);
         return Result.success();
@@ -287,6 +293,7 @@
 
     @ApiOperation(value = "鎾ら攢瀹℃牳鎸夐挳")
     @PostMapping("/checkUpdate")
+    @Log(title = "妫�楠屼笅鍗�", businessType = BusinessType.UPDATE)
     public Result<?> checkUpdate(Integer orderId,Integer state){
         insProductService.checkUpdate(orderId,state);
         return Result.success();
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/dto/AddInsOrderDTO.java b/inspect-server/src/main/java/com/ruoyi/inspect/dto/AddInsOrderDTO.java
new file mode 100644
index 0000000..5142e27
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/dto/AddInsOrderDTO.java
@@ -0,0 +1,27 @@
+package com.ruoyi.inspect.dto;
+
+import com.ruoyi.inspect.pojo.InsOrder;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class AddInsOrderDTO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("鏍峰搧鍒楄〃")
+    private List<SampleProductDto> list;
+
+    @ApiModelProperty("妫�楠屽崟涓讳綋娑堟伅")
+    private InsOrder insOrder;
+
+    @ApiModelProperty("鍏夌氦鐔旀帴閰嶅娑堟伅")
+    private List<List<Integer>> pairing;
+
+    @ApiModelProperty("鍏夌紗涓嬬殑鍏夌氦鐔旀帴閰嶅娑堟伅")
+    private List<List<Integer>> fiberPairing;
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsSample.java b/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsSample.java
index ae45b48..8d8254b 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsSample.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/pojo/InsSample.java
@@ -111,12 +111,6 @@
 
     private Integer parentId;
 
-    @ApiModelProperty("鏁伴噺")
-    private Integer quantity;
-
-    @ApiModelProperty("鐗规畩鏍囧噯鏂规硶")
-    private String specialStandardMethod;
-
     @TableField(select = false,exist = false)
     private Integer num=1;
 
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsBushingService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsBushingService.java
new file mode 100644
index 0000000..954b822
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsBushingService.java
@@ -0,0 +1,21 @@
+package com.ruoyi.inspect.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.inspect.dto.BushingDto;
+import com.ruoyi.inspect.pojo.InsBushing;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鍏夌氦閰嶇疆鐨勫绠¤〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-05-30 05:58:16
+ */
+public interface InsBushingService extends IService<InsBushing> {
+
+    List<BushingDto> selectBushingBySampleId(Integer sampleId);
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderService.java
index 5efb038..59e305d 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderService.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderService.java
@@ -33,7 +33,8 @@
 
     Map<String, Object> getInsOrderAndSample(Integer id, String laboratory);
 
-    Map<String, Object> selectSampleAndProductByOrderId(SampleProductDto2 sampleProductDto);
+    List<SampleProductDto2> selectSampleAndProductByOrderId(SampleProductDto2 sampleProductDto);
+
     List<Map<String, Object>> viewDetails(Map<String,Object> map);
 
     void exportChecked(Map<String,Object> data, HttpServletResponse response);
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsUnPassService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsUnPassService.java
new file mode 100644
index 0000000..894ceeb
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsUnPassService.java
@@ -0,0 +1,18 @@
+package com.ruoyi.inspect.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.inspect.dto.UnPassPageDto;
+import com.ruoyi.inspect.pojo.InsUnPass;
+
+import java.util.Map;
+
+/**
+ * @author 鏈变匠鍚�
+ * @date 2024/5/8 13:00
+ */
+public interface InsUnPassService extends IService<InsUnPass> {
+
+    IPage<UnPassPageDto> pageInsUnPass(Page page, UnPassPageDto unPassPageDto);
+}
\ No newline at end of file
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsBushingServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsBushingServiceImpl.java
new file mode 100644
index 0000000..74427cc
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsBushingServiceImpl.java
@@ -0,0 +1,80 @@
+package com.ruoyi.inspect.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.service.StandardTemplateService;
+import com.ruoyi.inspect.dto.BushingDto;
+import com.ruoyi.inspect.dto.FibersDto;
+import com.ruoyi.inspect.mapper.InsBushingMapper;
+import com.ruoyi.inspect.pojo.InsBushing;
+import com.ruoyi.inspect.pojo.InsProduct;
+import com.ruoyi.inspect.service.InsBushingService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+/**
+ * <p>
+ * 鍏夌氦閰嶇疆鐨勫绠¤〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-05-30 05:58:16
+ */
+@Service
+@AllArgsConstructor
+public class InsBushingServiceImpl extends ServiceImpl<InsBushingMapper, InsBushing> implements InsBushingService {
+
+    private InsBushingMapper insBushingMapper;
+
+    private StandardTemplateService standardTemplateService;
+
+    @Override
+    public List<BushingDto> selectBushingBySampleId(Integer sampleId) {
+        List<InsBushing> insBushings = insBushingMapper.selectList(Wrappers.<InsBushing>lambdaQuery().eq(InsBushing::getInsSampleId, sampleId));
+        List<BushingDto> bushingDtos = new ArrayList<>();
+        for (InsBushing insBushing : insBushings) {
+            BushingDto bushingDto = JSON.parseObject(JSON.toJSONString(insBushing), BushingDto.class);
+            bushingDto.setFiber(insBushingMapper.selectFiberByBushingId(bushingDto.getId()));
+            if(bushingDto.getFiber().isEmpty()){
+                bushingDto.setFibers(insBushingMapper.selectFibersByBushingId(insBushing.getId()));
+                for (FibersDto fibers : bushingDto.getFibers()) {
+                    fibers.setFiber(insBushingMapper.selectFiberByFibersId(fibers.getId()));
+                }
+            }
+            bushingDtos.add(bushingDto);
+        }
+        return bushingDtos;
+    }
+
+    private void getTemplateThing(List<InsProduct> insProducts) {
+        Set<Integer> set = new HashSet<>();
+        Map<Integer, String> map2 = new HashMap<>();
+        for (InsProduct product : insProducts) {
+            if (product.getTemplateId() == null) {
+                product.setTemplate(new ArrayList<>());
+                continue;
+            }
+            String thing = null;
+            if (product.getTemplateId() != null && set.add(product.getTemplateId())) {
+                map2.put(product.getTemplateId(), standardTemplateService.getStandTempThingById(product.getTemplateId()) + "");
+                thing = map2.get(product.getTemplateId());
+            }
+            if (StrUtil.isNotEmpty(thing)) {
+                JSONObject sheet = JSON.parseObject(JSON.toJSONString(JSON.parseArray(JSON.toJSONString(JSON.parseObject(thing).get("data"))).get(0)));
+                JSONObject config = JSON.parseObject(JSON.toJSONString(sheet.get("config")));
+                List<JSONObject> cellData = JSON.parseArray(JSON.toJSONString(sheet.get("celldata")), JSONObject.class);
+                Map<String, Object> style = new HashMap<>();
+                style.put("rowlen", config.get("rowlen"));
+                style.put("columnlen", config.get("columnlen"));
+                product.setTemplate(cellData);
+                product.setStyle(style);
+                product.setTemplateName(standardTemplateService.getStandTempNameById(product.getTemplateId()));
+            }
+        }
+    }
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
index 272479d..ae37bf8 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
@@ -33,6 +33,7 @@
 import com.ruoyi.common.utils.QueryWrappers;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.comparater.CustomComparator;
 import com.ruoyi.inspect.dto.*;
 import com.ruoyi.inspect.excel.FiberRibboGeometricalParameterExcelData;
 import com.ruoyi.inspect.mapper.*;
@@ -91,6 +92,10 @@
     private InsProductUserMapper insProductUserMapper;
 
     private NumberGenerator<InsOrder> numberGenerator;
+
+    private NumberGenerator<InsSample> sampleCodeGenerator;
+
+    private NumberGenerator<InsFibers> fibersCodeGenerator;
 
     private InsSampleUserMapper insSampleUserMapper;
 
@@ -254,11 +259,10 @@
         String outEntrustCodePrefix = getOutEntrustCodePrefix(customCode, laboratoryCode);
         String outEntrustCode = numberGenerator.generateNumberWithPrefix(5, outEntrustCodePrefix, InsOrder::getOutEntrustCode);
         insOrder.setOutEntrustCode(outEntrustCode);
-//        String giveCode = this.giveCode.giveCode("JCZX-" + customCode + "-", "ins_sample", "", "yyMMdd");
-        String giveCode = "";
-//        insOrder.setOutEntrustCode(giveCode.giveCode3("ZT/" + code2 + "-" + code + "-", insOrder.getCompanyId(), insOrder.getLaboratory(), "ins_order", "", "yyMM"));
-//        String giveCode = this.giveCode.giveCode("JCZX-" + code + "-", "ins_sample", "", "yyMMdd");
         insOrderMapper.insert(insOrder);
+        //鐢熸垚鏍峰搧缂栧彿
+        String currentDay = LocalDate.now().format(DateTimeFormatter.ofPattern("yyMMdd"));
+        String generatedSampleCode = sampleCodeGenerator.generateNumberWithPrefix(3, currentDay, InsSample::getSampleCode);
         AtomicInteger count = new AtomicInteger();
         List<FiberDto> fiberList = new ArrayList<>();
         list.forEach(a -> {
@@ -266,7 +270,7 @@
             a.setId(null);
             a.setInsOrderId(insOrder.getId());
             if (StrUtil.isEmpty(a.getSampleCode())) {
-                a.setSampleCode(giveCode.split("-")[2] + "-" + count.get());
+                a.setSampleCode(generatedSampleCode + "-" + count.get());
             } else {
                 //鍘婚櫎鎵嬭緭鐨勬牱鍝佺紪鍙蜂腑棣栧熬鍙兘鍖呭惈鐨勭┖鏍�
                 a.setSampleCode(a.getSampleCode().trim());
@@ -293,8 +297,7 @@
                             for (FibersDto fibersDto : bushingDto.getFibers()) {
                                 fibersDto.setInsBushingId(bushingDto.getId());
                                 if (StringUtils.isBlank(fibersDto.getCode())) {
-//                                    fibersDto.setCode(this.giveCode.giveCode("", "ins_fibers", "", "yyMMdd"));
-                                    fibersDto.setCode("");
+                                    fibersDto.setCode(fibersCodeGenerator.generateNumberWithPrefix(3, currentDay, InsFibers::getCode));
                                 }
                                 insFibersMapper.insert(fibersDto);
                                 for (FiberDto fiberDto : fibersDto.getFiber()) {
@@ -333,16 +336,13 @@
                                     insProductMapper.insert(product);
                                 }
                             }
-//                            else {
-//                                throw new ErrorException("鏍峰搧鐨勫厜绾ら厤缃俊鎭噷闈㈡病鏈夐厤缃厜绾ゅ甫淇℃伅涔熸病鏈夊厜绾や俊鎭�,璇烽噸鏂伴厤缃繚瀛樺啀鎻愪氦涓嬪崟!!!");
-//                            }
                         }
                     }
                 }
             }
             if (ObjectUtil.isNotEmpty(a.getInsulating())) {
                 List<InsProduct> ip2 = new ArrayList<>();
-                for (Integer i = 0; i < a.getInsulating().getNum(); i++) {
+                for (int i = 0; i < a.getInsulating().getNum(); i++) {
                     ip2.addAll(a.getInsulating().getInsProduct());
                 }
                 for (InsProduct product : ip2) {
@@ -363,8 +363,7 @@
                         b.setInsOrderId(insOrder.getId());
                         b.setParentId(a.getId());
                         if (StrUtil.isEmpty(b.getSampleCode())) {
-//                            b.setSampleCode(this.giveCode.giveCode("", "ins_sample", "", "yyMMdd"));
-                            b.setSampleCode("");
+                            b.setSampleCode(sampleCodeGenerator.generateNumberWithPrefix(3, currentDay, InsSample::getSampleCode));
                         }
                         insSampleMapper.insert(b);
                         if (ObjectUtil.isNotEmpty(b.getInsProduct())) {
@@ -387,7 +386,7 @@
                     } else {
                         for (FibersDto fibersDto : bushingDto.getFibers()) {
                             fibersDto.setInsBushingId(bushingDto.getId());
-                            fibersDto.setCode("");
+                            fibersDto.setCode(fibersCodeGenerator.generateNumberWithPrefix(3, currentDay, InsFibers::getCode));
                             insFibersMapper.insert(fibersDto);
                             for (FiberDto fiberDto : fibersDto.getFiber()) {
                                 fiberDto.setInsFibersId(fibersDto.getId());
@@ -507,16 +506,6 @@
                         }
                     }
                 }
-
-                // 娌℃湁杩涜鍏夌氦閰嶇疆鐨勭啍鎺ラ厤瀵癸紝鐩存帴娣诲姞鏍峰搧
-//                try {
-//                    for (InsProduct insProduct : insProducts) {
-//                        insProduct.setId(null);
-//                        insProduct.setInsSampleId(insSample.getId());
-//                        insProductMapper.insert(insProduct);
-//                    }
-//                } catch (Exception e) {
-//                }
             }
         }
         return insOrder.getId();
@@ -933,20 +922,16 @@
     }
 
     @Override
-    public Map<String, Object> selectSampleAndProductByOrderId(SampleProductDto2 sampleProductDto) {
-        Map<String, Object> map = new HashMap<>();
-        List<Map<String, Object>> headList = new ArrayList<>();
+    public List<SampleProductDto2> selectSampleAndProductByOrderId(SampleProductDto2 sampleProductDto) {
         List<SampleProductDto2> SampleProductDto2S = null;
         if (!Objects.isNull(sampleProductDto.getId())) {
             String laboratory = insOrderMapper.selectById(sampleProductDto.getId()).getLaboratory();
             if (laboratory.equals("鐢靛姏浜у搧瀹為獙瀹�")) {
                 //鐢靛姏璇曢獙瀹ょ殑鏁版嵁鏌ョ湅锛屽垹闄ゅ厜绾ら厤缃浉鍏冲瓧娈�
-//                headList = PrintChina.printChina(SampleProductDTODL.class);
                 SampleProductDto2S = insOrderMapper.selectSampleAndProductByOrderId(
                         QueryWrappers.queryWrappers(sampleProductDto).orderByAsc("ins_product_id"),
                         sampleProductDto.getId());
             } else {
-//                headList = PrintChina.printChina(SampleProductDto2.class);
                 SampleProductDto2S = insOrderMapper.selectSampleAndProductByOrderId(
                         QueryWrappers.queryWrappers(sampleProductDto)
                                 .orderByAsc("son_laboratory"),
@@ -1020,7 +1005,7 @@
                 }
                 collect2.addAll(list);
                 SampleProductDto2S = collect2;
-//                SampleProductDto2S.sort(new CustomComparator(enumService));
+                SampleProductDto2S.sort(new CustomComparator(dictTypeService));
             }
         }
         for (SampleProductDto2 record : SampleProductDto2S) {
@@ -1037,9 +1022,7 @@
                 record.setLastValue(String.join(",", values));
             }
         }
-        map.put("head", headList);
-        map.put("body", SampleProductDto2S);
-        return map;
+        return SampleProductDto2S;
     }
 
     @Override
@@ -1942,10 +1925,6 @@
         LocalDate today = LocalDate.parse(split[1]);
         LocalTime end = LocalTime.of(23, 59, 59);
         List<CostStatisticsDto> costStatisticsDtos = insOrderMapper.selectCostStatistics2(QueryWrappers.queryWrappers(costStatisticsDto), split[0], today.atTime(end).toString(), laboratory);
-//        double totalPrice = costStatisticsDtos.stream()
-//                .filter(dto -> dto.getPrice() != null) // 杩囨护鎺変环鏍间负 null 鐨勫璞�
-//                .mapToDouble(value -> value.getPrice().doubleValue() * value.getNum())
-//                .sum();
         BigDecimal total = BigDecimal.ZERO;
         for (CostStatisticsDto dto : costStatisticsDtos) {
             if (Objects.isNull(dto.getPrice()) || dto.getPrice().compareTo(BigDecimal.ZERO) == 0) {
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsUnPassServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsUnPassServiceImpl.java
new file mode 100644
index 0000000..eb9525e
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsUnPassServiceImpl.java
@@ -0,0 +1,34 @@
+package com.ruoyi.inspect.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.inspect.dto.UnPassPageDto;
+import com.ruoyi.inspect.mapper.InsUnPassMapper;
+import com.ruoyi.inspect.pojo.InsUnPass;
+import com.ruoyi.inspect.service.InsUnPassService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author 鏈变匠鍚�
+ * @date 2024/5/8 13:02
+ */
+@Service
+public class InsUnPassServiceImpl extends ServiceImpl<InsUnPassMapper, InsUnPass> implements InsUnPassService {
+
+    @Resource
+    private InsUnPassMapper insUnPassMapper;
+
+    @Override
+    public IPage<UnPassPageDto> pageInsUnPass(Page page, UnPassPageDto unPassPageDto) {
+        Map<String, Object> map = new HashMap<>();
+//        Map<String, Integer> map1 = getLook.selectPowerByMethodAndUserId("pageInsUnPass");
+//        if (map1.get("look") == 1) unPassPageDto.setCreateUser(map1.get("userId"));
+        return insUnPassMapper.pageInsUnPass(page, QueryWrappers.queryWrappers(unPassPageDto));
+    }
+}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index e7c41a6..2b980b8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -394,10 +394,10 @@
         <module>inspect-server</module>
         <module>performance-server</module>
         <module>cnas-manage</module>
+        <module>cnas-device</module>
         <module>cnas-process</module>
         <module>cnas-require</module>
         <module>cnas_server</module>
-        <module>cnas-device</module>
         <module>cnas-personnel</module>
     </modules>
     <packaging>pom</packaging>
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
index ba48829..73768ba 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -74,7 +74,7 @@
         SysUser user = loginUser.getUser();
         //鏌ヨ鐢ㄦ埛淇℃伅
         //TODO:閲嶅啓鏌ヨ鐢ㄦ埛淇℃伅sql
-//        SysUserVO userInfo = userMapper.selectUserInfo(user.getUserId());
+        SysUserVO userInfo = userMapper.selectUserInfo(user.getUserId());
         // 瑙掕壊闆嗗悎
         Set<String> roles = permissionService.getRolePermission(user);
         // 鏉冮檺闆嗗悎
@@ -85,7 +85,7 @@
             tokenService.refreshToken(loginUser);
         }
         AjaxResult ajax = AjaxResult.success();
-        ajax.put("user", user);
+        ajax.put("user", userInfo);
         ajax.put("roles", roles);
         ajax.put("permissions", permissions);
         return ajax;
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java
index 53ee93f..42b997e 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java
@@ -96,5 +96,16 @@
         return Result.success(userService.addPersonUser(personDto));
     }
 
+    /**
+     * 鑾峰彇瀹為獙瀹や笅鐨勬楠屽憳鍒楄〃
+     * @return
+     */
+    @ApiOperation(value = "鑾峰彇瀹為獙瀹や笅鐨勬楠屽憳鍒楄〃")
+    @GetMapping("/getLaboratoryPersonList")
+    public Result<?> getLaboratoryPersonList() {
+        return Result.success(userService.getLaboratoryPersonList());
+    }
+
+
 }
 
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/ExchangeConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/ExchangeConstants.java
new file mode 100644
index 0000000..ff983f7
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/ExchangeConstants.java
@@ -0,0 +1,7 @@
+package com.ruoyi.common.constant;
+
+public class ExchangeConstants {
+
+    public final static String WORK_TIME_EXCHANGE = "insert_work_time_exchange";
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/RouterKeyConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/RouterKeyConstants.java
new file mode 100644
index 0000000..4e8de14
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/RouterKeyConstants.java
@@ -0,0 +1,13 @@
+package com.ruoyi.common.constant;
+
+/**
+ * 宸ユ椂闃熷垪璺敱涓婚敭甯搁噺
+ */
+public class RouterKeyConstants {
+
+    public final static String GX_KEY="gx_router_key";
+    public final static String CL_KEY="cl_router_key";
+    public final static String JX_KEY="jx_router_key";
+    public final static String DL_KEY="dl_router_key";
+
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/numgen/NumberGenerator.java b/ruoyi-common/src/main/java/com/ruoyi/common/numgen/NumberGenerator.java
index 3b933bb..5cbd84d 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/numgen/NumberGenerator.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/numgen/NumberGenerator.java
@@ -79,7 +79,6 @@
 		return prependPrefix(prefix, generatedNumber);
 	}
 
-
 	/**
 	 * 鐢熸垚甯﹀悗缂�鐨勭紪鍙�
 	 *
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/util/MatrixToImageWriter.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/util/MatrixToImageWriter.java
new file mode 100644
index 0000000..f124bc7
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/util/MatrixToImageWriter.java
@@ -0,0 +1,68 @@
+package com.ruoyi.framework.util;
+
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.MultiFormatWriter;
+import com.google.zxing.WriterException;
+import com.google.zxing.common.BitMatrix;
+import com.ruoyi.framework.exception.ErrorException;
+
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 閰嶇疆鍥惧儚鍐欏叆鍣�
+ *
+ * @author z1292
+ *
+ */
+public class MatrixToImageWriter {
+    private final int BLACK = 0xFF000000;
+    private final int WHITE = 0xFFFFFFFF;
+
+    private BufferedImage toBufferedImage(BitMatrix matrix) {
+        int width = matrix.getWidth();
+        int height = matrix.getHeight();
+        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+        for (int x = 0; x < width; x++) {
+            for (int y = 0; y < height; y++) {
+                image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
+            }
+        }
+        return image;
+    }
+
+    private void writeToFile(BitMatrix matrix, String format, File file) throws IOException {
+        BufferedImage image = toBufferedImage(matrix);
+        if (!ImageIO.write(image, format, file)) {
+            throw new ErrorException("Could not write an image of format " + format + " to " + file);
+        }
+    }
+
+    public String code(String content, String path) {
+        try {
+            String codeName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yy_MM_dd&HH_mm_ss"));// 浜岀淮鐮佺殑鍥剧墖鍚�
+            String imageType = "jpg";// 鍥剧墖绫诲瀷
+            MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
+            Map<EncodeHintType, Object> hints = new HashMap<>();
+            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
+            hints.put(EncodeHintType.MARGIN, 0);
+            BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, 400, 400, hints);
+            File file1 = new File(path, codeName + "." + imageType);
+            writeToFile(bitMatrix, imageType, file1);
+            return file1.getPath();
+        } catch (WriterException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        throw new ErrorException("浜岀淮鐮佺敓鎴愬け璐�");
+    }
+
+}
\ No newline at end of file
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/util/MyUtil.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/util/MyUtil.java
new file mode 100644
index 0000000..9c5410f
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/util/MyUtil.java
@@ -0,0 +1,119 @@
+package com.ruoyi.framework.util;
+
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Objects;
+import java.util.Random;
+import java.util.StringJoiner;
+
+@Component
+public class MyUtil<T> {
+
+    /**
+     * 鑷畾涔夎皟璇曞伐鍏风被
+     * @return
+     */
+    public static void PrintLog(String str){
+        // 绫诲悕
+        String className = Thread.currentThread().getStackTrace()[2].getClassName();
+        // 鍑芥暟鍚�
+        String methodName = Thread.currentThread().getStackTrace()[2].getMethodName();
+        System.out.println("\033[1;94m" + className + "-->" + methodName + "-->"  + str + "\033[0m");
+    }
+
+    /**
+     * 鏃ユ湡宸ュ叿绫�
+     * @return
+     */
+    public static String MyDateFormat(){
+        //鑾峰彇鏃ユ湡
+        //瀵� import java.util.Date; 涓嬬殑鍖�
+        Date date = new Date();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+        return sdf.format(date);
+    }
+
+    /**
+     * 鑾峰彇闅忔満鍔犲瘑鐩�
+     * @param n 浣嶆暟
+     * @return 杩斿洖闅忔満鍔犲瘑鐩�
+     */
+    public static String getSalt(int n) {
+        char[] chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890!@$%^&*.?".toCharArray();
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < n; i++) {
+            char c = chars[new Random().nextInt(chars.length)];
+            sb.append(c);
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 鑾峰彇闅忔満鏁板瓧
+     * @param n 浣嶆暟
+     * @return 杩斿洖闅忔満鍊�
+     */
+    public static String getNumber(int n) {
+        char[] chars = "1234567890".toCharArray();
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < n; i++) {
+            char c = chars[new Random().nextInt(chars.length)];
+            sb.append(c);
+        }
+        return sb.toString();
+    }
+
+    public static String getTimeSixNumberCode(String prefix, String keyName){
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        String format = simpleDateFormat.format(new Date());
+        String timeStr = format.replace("-", "");
+        long incrNum = RedisUtil.incr(keyName, 1);
+        if(incrNum == 1){
+            RedisUtil.expire(keyName, 60 * 60 * 24);
+        }
+        String sixIncr = String.format("%06d", incrNum);
+        return prefix + timeStr + sixIncr;
+    }
+
+    /**
+     * 鍒ゆ柇鏄惁涓篹xcel
+     * @param file
+     * @return
+     */
+    public static boolean isExcelFile(MultipartFile file) {
+        if (file.isEmpty()) {
+            return false;
+        }
+        String originalFilename = file.getOriginalFilename();
+        if (originalFilename == null) {
+            return false;
+        }
+        String[] parts = originalFilename.split("\\.");
+        if (parts.length == 0) {
+            return false;
+        }
+        String fileExtension = parts[parts.length - 1].toLowerCase();
+        return fileExtension.equals("xls") || fileExtension.equals("xlsx");
+    }
+
+    /**
+     *
+     * @param delimiter
+     * @param elements
+     * @return
+     */
+    public static String joinChars(String delimiter,String... elements){
+        Objects.requireNonNull(delimiter);
+        Objects.requireNonNull(elements);
+        // Number of elements not likely worth Arrays.stream overhead.
+        StringJoiner joiner = new StringJoiner(delimiter);
+        for (String cs: elements) {
+            joiner.add(Objects.isNull(cs)?"":cs);
+        }
+        return joiner.toString();
+    }
+
+}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/util/RedisUtil.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/util/RedisUtil.java
new file mode 100644
index 0000000..6cfc8f4
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/util/RedisUtil.java
@@ -0,0 +1,631 @@
+package com.ruoyi.framework.util;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class RedisUtil {
+    private static RedisTemplate<String, Object> redisTemplate;
+    public static RedisTemplate<String, Object> getRedisTemplate() {
+        return redisTemplate;
+    }
+    @Autowired
+    private RedisUtil(RedisConnectionFactory redisConnectionFactory){
+        // redisTemplate妯℃澘鍒濆鍖�
+        redisTemplate = new RedisTemplate<>();
+        redisTemplate.setConnectionFactory(redisConnectionFactory);
+
+        // 灏嗗璞″簭鍒楀寲
+        ObjectMapper om=new ObjectMapper();
+        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
+                ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
+
+        // String鐨勫簭鍒楀寲
+        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
+        // json搴忓垪鍖栭厤缃�
+        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer=new Jackson2JsonRedisSerializer<>(Object.class);
+        jackson2JsonRedisSerializer.setObjectMapper(om);
+        //key閲囩敤String鐨勫簭鍒楀寲鏂瑰紡
+        redisTemplate.setKeySerializer(stringRedisSerializer);
+        //hash鐨刱ey涔熼噰鐢⊿tring 鐨勫簭鍒楀寲鏂瑰紡
+        redisTemplate.setHashKeySerializer(stringRedisSerializer);
+        //value鐨勫簭鍒楀寲鏂瑰紡閲囩敤jackson鐨勬柟寮�
+        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
+//        //hash鐨剉alue搴忓垪鍖栨柟寮忛噰鐢╦ackson
+        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
+        redisTemplate.afterPropertiesSet();
+    }
+
+    // =============================common============================
+    /**
+     * 鎸囧畾缂撳瓨澶辨晥鏃堕棿
+     * @param key  閿�
+     * @param time 鏃堕棿(绉�)
+     */
+    public static boolean expire(String key, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.expire(key, time, TimeUnit.SECONDS);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 鏍规嵁key 鑾峰彇杩囨湡鏃堕棿
+     * @param key 閿� 涓嶈兘涓簄ull
+     * @return 鏃堕棿(绉�) 杩斿洖0浠h〃涓烘案涔呮湁鏁�
+     */
+    public static long getExpire(String key) {
+        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
+    }
+
+
+    /**
+     * 鍒ゆ柇key鏄惁瀛樺湪
+     * @param key 閿�
+     * @return true 瀛樺湪 false涓嶅瓨鍦�
+     */
+    public static boolean hasKey(String key) {
+        try {
+            return redisTemplate.hasKey(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * 鍒犻櫎缂撳瓨
+     * @param key 鍙互浼犱竴涓�� 鎴栧涓�
+     */
+//    @SuppressWarnings("unchecked")
+    public static void del(String... key) {
+        if (key != null && key.length > 0) {
+            if (key.length == 1) {
+                redisTemplate.delete(key[0]);
+            } else {
+                redisTemplate.delete(Arrays.asList(key));
+//                redisTemplate.delete(CollectionUtils.arrayToList(key));
+            }
+        }
+    }
+
+    /**
+     * 妯$硦鍖归厤鍒犻櫎澶氫釜缂撳瓨
+     * @param key 鍙互浼犱竴涓�� 鎴栧涓�
+     */
+    public static void delsLike(String key) {
+        Set<String> keys = redisTemplate.keys(key);
+        redisTemplate.delete(keys);
+    }
+
+    /**
+     * 鑾峰彇骞跺垹闄ょ紦瀛�
+     * @param key 閿�
+     * @return 鍊�
+     */
+    public static Object getAndDelete(String key) {
+        try{
+            return key == null ? null : get(key);
+        }finally {
+            del(key);
+        }
+    }
+
+    // ============================String=============================
+
+    /**
+     * 鏅�氱紦瀛樿幏鍙�
+     * @param key 閿�
+     * @return 鍊�
+     */
+    public static Object get(String key) {
+        return key == null ? null : redisTemplate.opsForValue().get(key);
+    }
+
+    /**
+     * 鏅�氱紦瀛樻斁鍏�
+     * @param key   閿�
+     * @param value 鍊�
+     * @return true鎴愬姛 false澶辫触
+     */
+
+    public static boolean set(String key, Object value) {
+        try {
+            redisTemplate.opsForValue().set(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * 鏅�氱紦瀛樻斁鍏ュ苟璁剧疆鏃堕棿
+     * @param key   閿�
+     * @param value 鍊�
+     * @param time  鏃堕棿(绉�) time瑕佸ぇ浜�0 濡傛灉time灏忎簬绛変簬0 灏嗚缃棤闄愭湡
+     * @return true鎴愬姛 false 澶辫触
+     */
+
+    public static boolean set(String key, Object value, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.opsForValue().set(key, value, time, TimeUnit.MINUTES);
+            } else {
+                // 鍙慨鏀瑰弬鏁颁笉淇敼ttl
+                redisTemplate.opsForValue().set(key, value, 0);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * 閫掑
+     * @param key   閿�
+     * @param delta 瑕佸鍔犲嚑(澶т簬0)
+     */
+    public static long incr(String key, long delta) {
+        if (delta < 0) {
+            throw new RuntimeException("閫掑鍥犲瓙蹇呴』澶т簬0");
+        }
+        return redisTemplate.opsForValue().increment(key, delta);
+    }
+
+
+    /**
+     * 閫掑噺
+     * @param key   閿�
+     * @param delta 瑕佸噺灏戝嚑(灏忎簬0)
+     */
+    public static long decr(String key, long delta) {
+        if (delta < 0) {
+            throw new RuntimeException("閫掑噺鍥犲瓙蹇呴』澶т簬0");
+        }
+        return redisTemplate.opsForValue().increment(key, -delta);
+    }
+
+
+    // ================================Map=================================
+
+    /**
+     * HashGet
+     * @param key  閿� 涓嶈兘涓簄ull
+     * @param item 椤� 涓嶈兘涓簄ull
+     */
+    public static Object hget(String key, String item) {
+        return redisTemplate.opsForHash().get(key, item);
+    }
+
+    /**
+     * 鑾峰彇hashKey瀵瑰簲鐨勬墍鏈夐敭鍊�
+     * @param key 閿�
+     * @return 瀵瑰簲鐨勫涓敭鍊�
+     */
+    public static Map<Object, Object> hmget(String key) {
+        return redisTemplate.opsForHash().entries(key);
+    }
+
+    /**
+     * HashSet
+     * @param key 閿�
+     * @param map 瀵瑰簲澶氫釜閿��
+     */
+    public static boolean hmset(String key, Map<String, Object> map) {
+        try {
+            redisTemplate.opsForHash().putAll(key, map);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * HashSet 骞惰缃椂闂�
+     * @param key  閿�
+     * @param map  瀵瑰簲澶氫釜閿��
+     * @param time 鏃堕棿(绉�)
+     * @return true鎴愬姛 false澶辫触
+     */
+    public static boolean hmset(String key, Map<String, Object> map, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.opsForHash().putAll(key, map);
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * 鍚戜竴寮爃ash琛ㄤ腑鏀惧叆鏁版嵁,濡傛灉涓嶅瓨鍦ㄥ皢鍒涘缓
+     *
+     * @param key   閿�
+     * @param item  椤�
+     * @param value 鍊�
+     * @return true 鎴愬姛 false澶辫触
+     */
+    public static boolean hset(String key, String item, Object value) {
+        try {
+            redisTemplate.opsForHash().put(key, item, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 鍚戜竴寮爃ash琛ㄤ腑鏀惧叆鏁版嵁,濡傛灉涓嶅瓨鍦ㄥ皢鍒涘缓
+     *
+     * @param key   閿�
+     * @param item  椤�
+     * @param value 鍊�
+     * @param time  鏃堕棿(绉�) 娉ㄦ剰:濡傛灉宸插瓨鍦ㄧ殑hash琛ㄦ湁鏃堕棿,杩欓噷灏嗕細鏇挎崲鍘熸湁鐨勬椂闂�
+     * @return true 鎴愬姛 false澶辫触
+     */
+    public static boolean hset(String key, String item, Object value, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.opsForHash().put(key, item, value);
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+    /**
+     * 鍒犻櫎hash琛ㄤ腑鐨勫��
+     *
+     * @param key  閿� 涓嶈兘涓簄ull
+     * @param item 椤� 鍙互浣垮涓� 涓嶈兘涓簄ull
+     */
+    public static void hdel(String key, Object... item) {
+        redisTemplate.opsForHash().delete(key, item);
+    }
+
+
+    /**
+     * 鍒ゆ柇hash琛ㄤ腑鏄惁鏈夎椤圭殑鍊�
+     *
+     * @param key  閿� 涓嶈兘涓簄ull
+     * @param item 椤� 涓嶈兘涓簄ull
+     * @return true 瀛樺湪 false涓嶅瓨鍦�
+     */
+    public static boolean hHasKey(String key, String item) {
+        return redisTemplate.opsForHash().hasKey(key, item);
+    }
+
+
+    /**
+     * hash閫掑 濡傛灉涓嶅瓨鍦�,灏变細鍒涘缓涓�涓� 骞舵妸鏂板鍚庣殑鍊艰繑鍥�
+     *
+     * @param key  閿�
+     * @param item 椤�
+     * @param by   瑕佸鍔犲嚑(澶т簬0)
+     */
+    public static double hincr(String key, String item, double by) {
+        return redisTemplate.opsForHash().increment(key, item, by);
+    }
+
+
+    /**
+     * hash閫掑噺
+     *
+     * @param key  閿�
+     * @param item 椤�
+     * @param by   瑕佸噺灏戣(灏忎簬0)
+     */
+    public static double hdecr(String key, String item, double by) {
+        return redisTemplate.opsForHash().increment(key, item, -by);
+    }
+
+
+    // ============================set=============================
+
+    /**
+     * 鏍规嵁key鑾峰彇Set涓殑鎵�鏈夊��
+     * @param key 閿�
+     */
+    public static Set<Object> sGet(String key) {
+        try {
+            return redisTemplate.opsForSet().members(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+
+    /**
+     * 鏍规嵁value浠庝竴涓猻et涓煡璇�,鏄惁瀛樺湪
+     *
+     * @param key   閿�
+     * @param value 鍊�
+     * @return true 瀛樺湪 false涓嶅瓨鍦�
+     */
+    public static boolean sHasKey(String key, Object value) {
+        try {
+            return redisTemplate.opsForSet().isMember(key, value);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * 灏嗘暟鎹斁鍏et缂撳瓨
+     *
+     * @param key    閿�
+     * @param values 鍊� 鍙互鏄涓�
+     * @return 鎴愬姛涓暟
+     */
+    public static long sSet(String key, Object... values) {
+        try {
+            return redisTemplate.opsForSet().add(key, values);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+
+    /**
+     * 灏唖et鏁版嵁鏀惧叆缂撳瓨
+     *
+     * @param key    閿�
+     * @param time   鏃堕棿(绉�)
+     * @param values 鍊� 鍙互鏄涓�
+     * @return 鎴愬姛涓暟
+     */
+    public static long sSetAndTime(String key, long time, Object... values) {
+        try {
+            Long count = (long)values.length;
+            if (time > 0) {
+                count = redisTemplate.opsForSet().add(key, values);
+                expire(key, time);
+            }
+            return count;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+
+    /**
+     * 鑾峰彇set缂撳瓨鐨勯暱搴�
+     *
+     * @param key 閿�
+     */
+    public static long sGetSetSize(String key) {
+        try {
+            return redisTemplate.opsForSet().size(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+
+    /**
+     * 绉婚櫎鍊间负value鐨�
+     *
+     * @param key    閿�
+     * @param values 鍊� 鍙互鏄涓�
+     * @return 绉婚櫎鐨勪釜鏁�
+     */
+
+    public static long setRemove(String key, Object... values) {
+        try {
+            return redisTemplate.opsForSet().remove(key, values);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+    // ===============================list=================================
+
+    /**
+     * 鑾峰彇list缂撳瓨鐨勫唴瀹�
+     *
+     * @param key   閿�
+     * @param start 寮�濮�
+     * @param end   缁撴潫 0 鍒� -1浠h〃鎵�鏈夊��
+     */
+    public static List<Object> lGet(String key, long start, long end) {
+        try {
+            return redisTemplate.opsForList().range(key, start, end);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+
+    /**
+     * 鑾峰彇list缂撳瓨鐨勯暱搴�
+     *
+     * @param key 閿�
+     */
+    public static long lGetListSize(String key) {
+        try {
+            return redisTemplate.opsForList().size(key);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+
+
+    /**
+     * 閫氳繃绱㈠紩 鑾峰彇list涓殑鍊�
+     *
+     * @param key   閿�
+     * @param index 绱㈠紩 index>=0鏃讹紝 0 琛ㄥご锛�1 绗簩涓厓绱狅紝渚濇绫绘帹锛沬ndex<0鏃讹紝-1锛岃〃灏撅紝-2鍊掓暟绗簩涓厓绱狅紝渚濇绫绘帹
+     */
+    public static Object lGetIndex(String key, long index) {
+        try {
+            return redisTemplate.opsForList().index(key, index);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+
+    /**
+     * 灏唋ist鏀惧叆缂撳瓨
+     *
+     * @param key   閿�
+     * @param value 鍊�
+     */
+    public static boolean lSet(String key, Object value) {
+        try {
+            redisTemplate.opsForList().rightPush(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * 灏唋ist鏀惧叆缂撳瓨
+     * @param key   閿�
+     * @param value 鍊�
+     * @param time  鏃堕棿(绉�)
+     */
+    public static boolean lSet(String key, Object value, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.opsForList().rightPush(key, value);
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+
+    }
+
+
+    /**
+     * 灏唋ist鏀惧叆缂撳瓨
+     *
+     * @param key   閿�
+     * @param value 鍊�
+     * @return true 瀛樻斁鎴愬姛 false瀛樻斁澶辫触
+     */
+    public static boolean lSet(String key, List<Object> value) {
+        try {
+            redisTemplate.opsForList().rightPushAll(key, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+
+    }
+
+
+    /**
+     * 灏唋ist鏀惧叆缂撳瓨
+     *
+     * @param key   閿�
+     * @param value 鍊�
+     * @param time  鏃堕棿(绉�)
+     * @return true 瀛樻斁鎴愬姛 false瀛樻斁澶辫触
+     */
+    public static boolean lSet(String key, List<Object> value, long time) {
+        try {
+            if (time > 0) {
+                redisTemplate.opsForList().rightPushAll(key, value);
+                expire(key, time);
+            }
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * 鏍规嵁绱㈠紩淇敼list涓殑鏌愭潯鏁版嵁
+     *
+     * @param key   閿�
+     * @param index 绱㈠紩
+     * @param value 鍊�
+     * @return true 瀛樻斁鎴愬姛 false瀛樻斁澶辫触
+     */
+
+    public static boolean lUpdateIndex(String key, long index, Object value) {
+        try {
+            redisTemplate.opsForList().set(key, index, value);
+            return true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return false;
+        }
+    }
+
+
+    /**
+     * 绉婚櫎N涓�间负value
+     *
+     * @param key   閿�
+     * @param count 绉婚櫎澶氬皯涓�
+     * @param value 鍊�
+     * @return 绉婚櫎鐨勪釜鏁�
+     */
+
+    public static long lRemove(String key, long count, Object value) {
+        try {
+            return redisTemplate.opsForList().remove(key, count, value);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return 0;
+        }
+    }
+}
+
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPasswordService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPasswordService.java
index 6728c7b..b800bda 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPasswordService.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPasswordService.java
@@ -24,7 +24,7 @@
     @Autowired
     private RedisCache redisCache;
 
-    @Value(value = "${user.password.maxRetryCount}")
+    @Value(value = "10")
     private int maxRetryCount;
 
     @Value(value = "${user.password.lockTime}")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/DepartmentLimsMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/DepartmentLimsMapper.java
index 894912e..ba5f12c 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/DepartmentLimsMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/DepartmentLimsMapper.java
@@ -10,7 +10,7 @@
 * @author z1292
 * @description 閽堝琛ㄣ�恉epartment_lims(閮ㄩ棬鏄庣粏)銆戠殑鏁版嵁搴撴搷浣淢apper
 * @createDate 2024-05-22 14:08:17
-* @Entity com.yuanchu.mom.pojo.DepartmentLims
+* @Entity com.ruoyi.requier.pojo.DepartmentLims
 */
 public interface DepartmentLimsMapper extends BaseMapper<DepartmentLims> {
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserMapper.java
index ad464ef..a463ca3 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserMapper.java
@@ -6,6 +6,7 @@
 import com.ruoyi.common.core.vo.SysUserVO;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -47,8 +48,9 @@
     User getUserNow(@Param("userId") int userId);
 
     SysUserVO selectUserInfo(Long userId);
+
     String seldepLimsId(int depLimsId);
 
-    List<Map<String, Object>> getPersonList(String laboratory);
+    List<Map<String, Object>> getLaboratoryPersonList(String laboratory);
 }
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/UserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/UserService.java
index 34d7974..0a421a5 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/UserService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/UserService.java
@@ -5,6 +5,7 @@
 import com.ruoyi.common.core.dto.PersonDto;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 鐢ㄦ埛淇℃伅琛�
@@ -40,5 +41,8 @@
     int delUserDepardLimsId(Integer id);
 
     int addPersonUser(PersonDto personDto);
+
+    Map<String, List<Map<String,Object>>> getLaboratoryPersonList();
+
 }
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserServiceImpl.java
index 08331cd..db10443 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserServiceImpl.java
@@ -12,6 +12,7 @@
 import com.ruoyi.system.mapper.UserMapper;
 import com.ruoyi.system.service.CustomService;
 import com.ruoyi.system.service.UserService;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -19,6 +20,8 @@
 
 import java.time.LocalDateTime;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 鐢ㄦ埛淇℃伅琛�
@@ -110,5 +113,25 @@
         });
         return 1;
     }
+
+    @Override
+    public Map<String, List<Map<String, Object>>> getLaboratoryPersonList() {
+        //鏌ヨ閫氫俊鍜岀數鍔涗笅鐨勪汉鍛樹俊鎭�
+        //鏌ヨ褰撳墠鐧诲綍浜哄憳鐨勬灦鏋�
+        //鍒ゆ柇鍏ㄩ儴,涓汉,缁勭粐鐨勬潈闄�
+        User user = baseMapper.selectById(SecurityUtils.getUserId());//褰撳墠鐧诲綍鐨勪汉
+        //鑾峰彇褰撳墠浜烘墍灞炲疄楠屽id
+        String laboratory = "";
+        String departLimsId = user.getDepartLimsId();
+        if (ObjectUtils.isNotEmpty(departLimsId)) {
+            String[] split = departLimsId.split(",");
+            //鏌ヨ瀵瑰簲鏋舵瀯鍚嶇О(閫氫俊瀹為獙瀹�,鐢靛姏瀹為獙瀹�,妫�娴嬪姙)
+            String departLims = baseMapper.seldepLimsId(Integer.parseInt(split[split.length - 1]));
+            if (departLims.contains("瀹為獙瀹�")) {
+                laboratory = departLims;
+            }
+        }
+        return baseMapper.getLaboratoryPersonList(laboratory).stream().collect(Collectors.groupingBy(m->m.get("depName").toString()));
+    }
 }
 
diff --git a/ruoyi-system/src/main/resources/mapper/system/UserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/UserMapper.xml
index 3eb9d91..750379a 100644
--- a/ruoyi-system/src/main/resources/mapper/system/UserMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/UserMapper.xml
@@ -61,7 +61,51 @@
         where u.id = #{userId}
     </select>
     <select id="selectUserInfo" resultType="com.ruoyi.common.core.vo.SysUserVO">
-        select * from user
+        select u.id as user_id,
+               u.dept_id,
+               u.name as nick_name,
+               u.account as user_name,
+               u.name_en,
+               u.email,
+               u.phone as phone_number,
+               u.sex,
+               u.picture_url,
+               u.signature_url,
+               u.company,
+               c.company as company_name,
+               c.code,
+               u.password,
+               u.status,
+               u.del_flag,
+               u.login_ip,
+               u.login_date,
+               u.is_custom
+        from user u left join custom c on u.company = c.id
+        where u.id = #{userId}
+    </select>
+    <select id="seldepLimsId" resultType="java.lang.String">
+        select name
+        from department_lims
+        where id = #{depLimsId}
+    </select>
+    <select id="getLaboratoryPersonList" resultType="java.util.Map">
+        select
+        u.id,
+        u.name,
+        dl.name as depName
+        from
+        user u
+        left join
+        department_lims dl
+        on
+        FIND_IN_SET(dl.id,u.depart_lims_id)
+        where
+        dl.name in('閫氫俊浜у搧瀹為獙瀹�','鐢靛姏浜у搧瀹為獙瀹�')
+        and u.status = 0
+        and u.is_custom = 0
+        <if test="laboratory!='' and laboratory!=null">
+            and dl.name = #{laboratory}
+        </if>
     </select>
     <select id="seldepLimsId" resultType="java.lang.String">
         select name

--
Gitblit v1.9.3