From 4c64a8f71dbbd65e72864fcefb8578958e4dda51 Mon Sep 17 00:00:00 2001
From: zhuo <2089219845@qq.com>
Date: 星期二, 18 二月 2025 14:35:26 +0800
Subject: [PATCH] 检验任务移植

---
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderFileMapper.java                           |   20 
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsProductResultMapper.java                       |   29 
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderDeviceRecordMapper.java                   |   32 
 inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderDeviceRecordService.java                 |   11 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderFactoryVerifyItemServiceImpl.java   |   19 
 inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderFileService.java                         |   16 
 inspect-server/src/main/java/com/ruoyi/inspect/service/InsUnqualifiedRetestProductService.java          |   15 
 inspect-server/src/main/java/com/ruoyi/inspect/dto/UnPassPageDto.java                                   |   15 
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderStandardTemplateMapper.java               |   17 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderFileServiceImpl.java                |   20 
 inspect-server/src/main/resources/mapper/InsOrderFileMapper.xml                                         |   15 
 inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderPlanService.java                         |  123 +
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderStandardTemplateServiceImpl.java    |   19 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsUnPassServiceImpl.java                   |   31 
 performance-server/src/main/resources/mapper/PerformanceShiftMapper.xml                                 |    6 
 inspect-server/src/main/java/com/ruoyi/inspect/service/InsUnPassService.java                            |   18 
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderFactoryVerifyMapper.java                  |   17 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java                | 4295 ++++++++++++++++++++++++++++++++++++++++++++++++
 inspect-server/src/main/java/com/ruoyi/inspect/dto/InsOrderPlanProductDto.java                          |   33 
 inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderPlanController.java                   |  271 +++
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnPassMapper.java                              |   15 
 inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderStandardTemplateService.java             |   15 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsUnqualifiedRetestProductServiceImpl.java |   19 
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnqualifiedRetestResultMapper.java             |   17 
 inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderFactoryVerifyItemService.java            |   15 
 inspect-server/src/main/resources/mapper/InsOrderDeviceRecordMapper.xml                                 |   23 
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderFactoryVerifyItemMapper.java              |   17 
 inspect-server/src/main/resources/mapper/InsUnPassMapper.xml                                            |   14 
 inspect-server/src/main/java/com/ruoyi/inspect/dto/InsOrderDeviceRecordDto.java                         |   16 
 inspect-server/src/main/resources/mapper/InsProductResultMapper.xml                                     |   40 
 inspect-server/src/main/java/com/ruoyi/inspect/dto/EnterFactoryReport.java                              |   33 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderDeviceRecordServiceImpl.java        |   15 
 32 files changed, 5,260 insertions(+), 1 deletions(-)

diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderPlanController.java b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderPlanController.java
new file mode 100644
index 0000000..d61e1f9
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderPlanController.java
@@ -0,0 +1,271 @@
+package com.ruoyi.inspect.controller;
+
+import com.alibaba.fastjson.JSON;
+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.inspect.dto.InsOrderPlanDTO;
+import com.ruoyi.inspect.dto.InsOrderPlanProductDto;
+import com.ruoyi.inspect.dto.InsProductBindingDto;
+import com.ruoyi.inspect.pojo.InsOrder;
+import com.ruoyi.inspect.pojo.InsOrderFactoryVerify;
+import com.ruoyi.inspect.pojo.InsOrderFile;
+import com.ruoyi.inspect.pojo.InsProduct;
+import com.ruoyi.inspect.service.InsOrderFileService;
+import com.ruoyi.inspect.service.InsOrderPlanService;
+import com.ruoyi.inspect.service.InsProductService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 妫�楠屼换鍔�-鎺у埗灞�
+ */
+@RestController
+@RequestMapping("/insOrderPlan")
+@Api(tags = "妫�楠屼换鍔�")
+@AllArgsConstructor
+public class InsOrderPlanController {
+
+    private InsOrderPlanService insOrderPlanService;
+
+    private InsOrderFileService insOrderFileService;
+
+    private InsProductService insProductService;
+
+
+    @ApiOperation(value = "鑾峰彇妫�楠屼换鍔″垪琛�")
+    @GetMapping("/selectInsOrderPlanList")
+    public Result selectInsOrderPlanList(Page page, InsOrderPlanDTO insOrderPlanDTO){
+        return Result.success(insOrderPlanService.selectInsOrderPlanList(page, insOrderPlanDTO));
+    }
+
+    @ApiOperation(value = "妫�楠屽崟璇︽儏-浠诲姟鍒囨崲")
+    @GetMapping("/inspectionOrderDetailsTaskSwitching")
+    public Result inspectionOrderDetailsTaskSwitching(Page page, InsOrderPlanDTO insOrderPlanDTO) throws Exception {
+        return Result.success(insOrderPlanService.inspectionOrderDetailsTaskSwitching(page, insOrderPlanDTO));
+    }
+
+    @ApiOperation(value = "璁ら浠诲姟璁″垝")
+    @PostMapping("/claimInsOrderPlan")
+    public Result claimInsOrderPlan(@RequestBody InsOrderPlanDTO data) {
+        return Result.success(insOrderPlanService.claimInsOrderPlan(data));
+    }
+
+
+    @ApiOperation(value = "鎵ц妫�楠屾搷浣�")
+    @PostMapping("/doInsOrder")
+    public Result<?> doInsOrder(Integer id, String laboratory) {
+        return Result.success(insOrderPlanService.doInsOrder(id, laboratory));
+    }
+
+    @PostMapping("/getInsProduct")
+    @ApiOperation("鑾峰彇妫�楠岄」鐩拰妯℃澘鍐呭")
+    public Result<?> getInsProduct(InsOrderPlanProductDto insOrderPlanProductDto) {
+        return Result.success(insOrderPlanService.getInsProduct(insOrderPlanProductDto));
+    }
+
+
+    @ApiOperation(value = "浠诲姟浜ゆ帴")
+    @PostMapping("/upPlanUser")
+    public Result<?> upPlanUser(Integer userId, Integer orderId, String sonLaboratory) {
+        return Result.success(insOrderPlanService.upPlanUser(userId, orderId, sonLaboratory));
+    }
+
+    @ApiOperation(value = "鍒ゆ柇浜ゆ帴鐨勮瘯楠屽")
+    @PostMapping("/upPlanUser2")
+    public Result<?> upPlanUser2(Integer orderId) {
+        return Result.success(insOrderPlanService.upPlanUser2(orderId));
+    }
+
+
+    @ApiOperation(value = "澶嶆牳妫�楠屼换鍔�")
+    @PostMapping("/verifyPlan")
+    public Result<?> verifyPlan(Integer orderId, String laboratory, Integer type, String tell, Integer userId) {
+        return Result.success(insOrderPlanService.rawMaterialVerifyPlan(orderId, laboratory, type, tell, userId));
+    }
+
+    @ApiOperation(value = "鏍¢獙妫�楠屼换鍔℃彁浜�")
+    @PostMapping("/checkSubmitPlan")
+    public Result<?> checkSubmitPlan(Integer orderId, String laboratory) {
+        return Result.success(insOrderPlanService.checkSubmitPlan(orderId, laboratory));
+    }
+
+
+    @ApiOperation(value = "妫�楠屼换鍔℃彁浜�")
+    @PostMapping("/submitPlan")
+    public Result<?> submitPlan(Integer orderId, String laboratory, Integer verifyUser, String entrustCode) {
+        int num = insOrderPlanService.submitPlan(orderId, laboratory, verifyUser, entrustCode);
+        return num == 1 ? Result.success() : Result.fail("鎻愪氦澶辫触锛岄儴鍒嗛」鐩繕鏈繘琛屾楠�");
+    }
+
+
+    /**
+     *
+     * @param param 妯℃澘鍐呭
+     * @param currentTable 褰撳墠妯℃澘id
+     * @param sampleId 褰撳墠鏍峰搧id
+     * @param orderId 褰撳墠璁㈠崟id
+     * @param sonLaboratory 瀛愯瘯楠屽
+     * @return
+     */
+    @ApiOperation(value = "淇濆瓨妫�楠屽唴瀹�")
+    @PostMapping("/saveInsContext")
+    public Result<?> saveInsContext(String param, Integer currentTable, Integer sampleId, Integer orderId, String sonLaboratory) {
+        Map<String, Object> param2 = JSON.parseObject(param, Map.class);
+        insOrderPlanService.saveInsContext(param2, currentTable, sampleId, orderId, sonLaboratory);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鏌ョ湅妫�楠屽崟涓嬬殑闄勪欢鍒楄〃")
+    @GetMapping("/getFileList")
+    public Result<?> getFileList(Page page, InsOrderFile insOrderFile) throws Exception {
+        return Result.success(insOrderPlanService.getFileList(page, insOrderFile));
+    }
+
+
+    @ApiOperation(value = "涓婁紶闄勪欢")
+    @PostMapping("/uploadFile")
+    public Result<?> taskUploadFile(Integer orderId, MultipartFile file) {
+        return Result.success(insOrderPlanService.uploadFile(orderId, file));
+    }
+
+
+    @ApiOperation(value = "鍒犻櫎闄勪欢")
+    @PostMapping("/delfile")
+    public Result<?> delfile(Integer id) {
+        return Result.success(insOrderFileService.removeById(id));
+    }
+
+
+    @ApiOperation(value = "涓嬭浇闄勪欢")
+    @GetMapping("/downFile")
+    public Result<?> downFile(Integer id) {
+        InsOrderFile insOrderFile = insOrderFileService.getById(id);
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("type", insOrderFile.getType());
+        map.put("fileUrl", insOrderFile.getFileUrl());
+        return Result.success(map);
+    }
+
+    @ApiOperation(value = "濉啓娓╁害涓庢箍搴�")
+    @PostMapping("/write")
+    public Result<?> write(@RequestBody InsOrder insOrder) {
+        return Result.success(insProductService.write(insOrder));
+    }
+
+
+    @ApiOperation(value = "鐢电紗閰嶇疆,鏌ョ湅閰嶇疆鏍囪瘑")
+    @PostMapping("/getCableTag")
+    public Result<?> getCableTag(Integer id, String laboratory) {
+        return Result.success(insOrderPlanService.getCableTag(id, laboratory));
+    }
+
+    @ApiOperation(value = "鍘熸潗鏂�,鏌ョ湅閰嶇疆鏍囪瘑")
+    @PostMapping("/getRawMaterialTag")
+    public Result<?> getRawMaterialTag(Integer id, String laboratory) {
+        return Result.success(insOrderPlanService.getRawMaterialTag(id, laboratory));
+    }
+
+    @ApiOperation(value = "鏌ョ湅閲嶅鏍囪瘑")
+    @PostMapping("/getRepetitionTag")
+    public Result<?> getRepetitionTag(Integer id, String laboratory, String cableTag) {
+        return Result.success(insOrderPlanService.getRepetitionTag(id, laboratory, cableTag));
+    }
+
+    @ApiOperation("鑾峰彇涓嶅悎鏍兼暟鎹�")
+    @PostMapping("/getInsProductUnqualified")
+    public Result<?> getInsProductUnqualified(InsOrderPlanProductDto insOrderPlanProductDto) {
+        return Result.success(insOrderPlanService.getInsProductUnqualified(insOrderPlanProductDto));
+    }
+
+    @ApiOperation("鏂板涓嶅悎鏍煎娴嬩俊鎭�")
+    @PostMapping("/addUnqualifiedRetest")
+    public Result<?> addDisqualificationRetest(@RequestBody Map<String, Object> params) {
+        // 鑾峰彇妫�楠屽璞$殑id
+        List<Integer> ids = (List<Integer>) params.get("ids");
+        return Result.success(insOrderPlanService.addDisqualificationRetest(ids));
+    }
+
+    @ApiOperation("鑾峰彇涓嶅悎鏍煎娴嬫暟鎹�")
+    @PostMapping("/getInsProductUnqualifiedRetest")
+    public Result<?> getInsProductUnqualifiedRetest(Integer id, Integer type, String laboratory, String cableTag, String rawMaterialTag, String retestTag) {
+        return Result.success(insOrderPlanService.getInsProductUnqualifiedRetest(id, type, laboratory, cableTag, rawMaterialTag, retestTag));
+    }
+
+    /**
+     *
+     * @param param 妯℃澘鍐呭
+     * @param currentTable 褰撳墠妯℃澘id
+     * @param sampleId 褰撳墠鏍峰搧id
+     * @param orderId 褰撳墠璁㈠崟id
+     * @param sonLaboratory 瀛愯瘯楠屽
+     * @return
+     */
+    @ApiOperation(value = "淇濆瓨涓嶅悎鏍煎娴嬫楠屽唴瀹�")
+    @PostMapping("/saveUnqualifiedContext")
+    public Result<?> saveUnqualifiedContext(String param, Integer currentTable, Integer sampleId, Integer orderId, String sonLaboratory) {
+        Map<String, Object> param2 = JSON.parseObject(param, Map.class);
+        insOrderPlanService.saveUnqualifiedContext(param2, currentTable, sampleId, orderId, sonLaboratory);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鏌ヨ鍘熸潗鏂欒繘璐ч獙璇�")
+    @GetMapping("/getFactoryVerify")
+    public Result<?> getFactoryVerify(Integer insOrderId) {
+        return Result.success(insOrderPlanService.getFactoryVerify(insOrderId));
+    }
+
+
+
+    @ApiOperation(value = "淇濆瓨鍘熸潗鏂欒繘璐ч獙璇�")
+    @PostMapping("/addFactoryVerify")
+    public Result<?> addFactoryVerify(@RequestBody InsOrderFactoryVerify factoryVerify) {
+        return Result.success(insOrderPlanService.addFactoryVerify(factoryVerify));
+    }
+
+
+    @ApiOperation(value = "淇敼妫�楠岄」鍐呭")
+    @PostMapping("/updateProductOnPlan")
+    public Result<?> updateProductOnPlan(@RequestBody InsProduct insProduct) {
+        insProductService.updateById(insProduct);
+        return Result.success();
+    }
+
+
+    @ApiOperation(value = "鏍规嵁妫�楠岄」id鏌ヨ妫�楠岄」鏍戜俊鎭�")
+    @GetMapping("/getProductTreeByProductId")
+    public Result<List<InsProduct>> getProductTreeByProductId(Integer productId) {
+        return Result.success(insProductService.getProductTreeByProductId(productId));
+    }
+
+
+
+    @ApiOperation(value = "鐗规畩妫�楠岄」缁戝畾")
+    @PostMapping("/bindingProductTreeByProductId")
+    public Result<?> bindingProductTreeByProductId(@RequestBody InsProductBindingDto insProductBindingDto) {
+        return Result.success(insProductService.bindingProductTreeByProductId(insProductBindingDto));
+    }
+
+
+    @ApiOperation(value = "鐗规畩妫�楠岄」缁戝畾鏌ヨ")
+    @GetMapping("/getBindingProductByProductId")
+    public Result<List<InsProduct>> getBindingProductByProductId(Integer productId) {
+        return Result.success(insProductService.list(Wrappers.<InsProduct>lambdaQuery()
+                .eq(InsProduct::getBindingProductId, productId)));
+    }
+
+
+
+    @ApiOperation(value = "鍒犻櫎鐗规畩妫�楠岄」缁戝畾淇℃伅")
+    @GetMapping("/delProductTreeByProductId")
+    public Result<?> delProductTreeByProductId(Integer productId) {
+        return Result.success(insProductService.removeBindingProductTree(productId));
+    }
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/dto/EnterFactoryReport.java b/inspect-server/src/main/java/com/ruoyi/inspect/dto/EnterFactoryReport.java
new file mode 100644
index 0000000..3a5456d
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/dto/EnterFactoryReport.java
@@ -0,0 +1,33 @@
+package com.ruoyi.inspect.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/8/12
+ */
+@Data
+public class EnterFactoryReport {
+
+    @ApiModelProperty("鏉愭枡鍚嶇О")
+    private String sample;
+
+    @ApiModelProperty("鍒拌揣鏁伴噺")
+    private String qtyArrived;
+
+    @ApiModelProperty("鎶芥鏁伴噺")
+    private String quantity;
+
+    @ApiModelProperty("瑙勬牸鍨嬪彿")
+    private String partDesc;
+
+    @ApiModelProperty("鏉愭枡鍘傚")
+    private String supplierName;
+
+    @ApiModelProperty("鎵瑰彿")
+    private String lotBatchNo;
+
+    @ApiModelProperty("妫�娴嬬紪鍙�")
+    private String code;
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/dto/InsOrderDeviceRecordDto.java b/inspect-server/src/main/java/com/ruoyi/inspect/dto/InsOrderDeviceRecordDto.java
new file mode 100644
index 0000000..18eafe9
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/dto/InsOrderDeviceRecordDto.java
@@ -0,0 +1,16 @@
+package com.ruoyi.inspect.dto;
+
+import com.ruoyi.inspect.pojo.InsOrderDeviceRecord;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Author zhuo
+ * @Date 2024/12/22
+ */
+@Data
+public class InsOrderDeviceRecordDto extends InsOrderDeviceRecord {
+
+    @ApiModelProperty("璁惧缂栧彿")
+    private String managementNumber;
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/dto/InsOrderPlanProductDto.java b/inspect-server/src/main/java/com/ruoyi/inspect/dto/InsOrderPlanProductDto.java
new file mode 100644
index 0000000..dc7d89f
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/dto/InsOrderPlanProductDto.java
@@ -0,0 +1,33 @@
+package com.ruoyi.inspect.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 妫�楠屼换鍔℃楠岄」鏌ヨ鏉′欢
+ *
+ * @Author zhuo
+ * @Date 2024/11/29
+ */
+@Data
+public class InsOrderPlanProductDto {
+
+    @ApiModelProperty("鏍峰搧id")
+    private Integer id;
+
+    @ApiModelProperty("绫诲瀷")
+    private Integer type;
+
+    @ApiModelProperty("璇曢獙瀹�")
+    private String laboratory;
+
+    @ApiModelProperty("鐢电紗閰嶇疆鏍囪瘑")
+    private String cableTag;
+
+    @ApiModelProperty("鍘熸潗鏂欐壒娆℃爣璇�")
+    private String rawMaterialTag;
+
+    @ApiModelProperty("鎴愬搧涓嬪崟閲嶅鏍囪瘑")
+    private String repetitionTag;
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/dto/UnPassPageDto.java b/inspect-server/src/main/java/com/ruoyi/inspect/dto/UnPassPageDto.java
new file mode 100644
index 0000000..96111a8
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/dto/UnPassPageDto.java
@@ -0,0 +1,15 @@
+package com.ruoyi.inspect.dto;
+
+import com.ruoyi.inspect.pojo.InsUnPass;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author 鏈变匠鍚�
+ * @date 2024/5/8 12:38
+ */
+@Data
+public class UnPassPageDto extends InsUnPass implements Serializable {
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderDeviceRecordMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderDeviceRecordMapper.java
new file mode 100644
index 0000000..258dd57
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderDeviceRecordMapper.java
@@ -0,0 +1,32 @@
+package com.ruoyi.inspect.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.inspect.dto.InsOrderDeviceRecordDto;
+import com.ruoyi.inspect.pojo.InsOrderDeviceRecord;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * cnas璁惧浣跨敤璁板綍琛�(DeviceRecord)$desc
+ *
+ * @author makejava
+ * @since 2024-12-21 11:11:01
+ */
+public interface InsOrderDeviceRecordMapper extends BaseMapper<InsOrderDeviceRecord> {
+
+    /**
+     * 鏌ヨ璁惧浣跨敤璁板綍
+     * @param insOrderId
+     * @return
+     */
+    List<InsOrderDeviceRecordDto> selectDeviceNumber(Integer insOrderId);
+
+    /**
+     * 鏍规嵁缂栧彿鏌ヨ璁惧id
+     * @param deviceNumbers
+     * @return
+     */
+    List<Integer> selectDeviceIdsByNumbers(Set<String> deviceNumbers);
+}
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderFactoryVerifyItemMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderFactoryVerifyItemMapper.java
new file mode 100644
index 0000000..a858ab1
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderFactoryVerifyItemMapper.java
@@ -0,0 +1,17 @@
+package com.ruoyi.inspect.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.inspect.pojo.InsOrderFactoryVerifyItem;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 鍘熸潗鏂欏巶瀹惰繘璐ч獙璇佹楠岄」
+ *
+ * @author zhuo
+ * @since 2024-09-26
+ */
+@Mapper
+public interface InsOrderFactoryVerifyItemMapper extends BaseMapper<InsOrderFactoryVerifyItem> {
+
+}
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderFactoryVerifyMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderFactoryVerifyMapper.java
new file mode 100644
index 0000000..5012c04
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderFactoryVerifyMapper.java
@@ -0,0 +1,17 @@
+package com.ruoyi.inspect.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.inspect.pojo.InsOrderFactoryVerify;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 鍘熸潗鏂欏巶瀹惰繘璐ч獙璇�
+ *
+ * @author zhuo
+ * @since 2024-09-26
+ */
+@Mapper
+public interface InsOrderFactoryVerifyMapper extends BaseMapper<InsOrderFactoryVerify> {
+
+}
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderFileMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderFileMapper.java
new file mode 100644
index 0000000..8bd5432
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderFileMapper.java
@@ -0,0 +1,20 @@
+package com.ruoyi.inspect.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.inspect.pojo.InsOrderFile;
+
+/**
+ * <p>
+ * 妫�楠屽崟涓嬬殑闄勪欢鍒楄〃 Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-06-06 10:08:21
+ */
+public interface InsOrderFileMapper extends BaseMapper<InsOrderFile> {
+
+    IPage<InsOrderFile> getFileList(Page page, QueryWrapper<InsOrderFile> ew, Integer insOrderId);
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderStandardTemplateMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderStandardTemplateMapper.java
new file mode 100644
index 0000000..2864f73
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderStandardTemplateMapper.java
@@ -0,0 +1,17 @@
+package com.ruoyi.inspect.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.inspect.pojo.InsOrderStandardTemplate;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 璁㈠崟鏍囧噯妯℃澘澶嶅埗
+ *
+ * @author zhuo
+ * @since 2024-11-05
+ */
+@Mapper
+public interface InsOrderStandardTemplateMapper extends BaseMapper<InsOrderStandardTemplate> {
+
+}
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsProductResultMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsProductResultMapper.java
new file mode 100644
index 0000000..6ce0f27
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsProductResultMapper.java
@@ -0,0 +1,29 @@
+package com.ruoyi.inspect.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.inspect.pojo.InsProductResult;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author Administrator
+ * @description 閽堝琛ㄣ�恑ns_product_result(妫�楠岄」鐩殑缁撴灉)銆戠殑鏁版嵁搴撴搷浣淢apper
+ * @createDate 2024-03-28 10:29:37
+ * @Entity com.yuanchu.mom.pojo.InsProductResult
+ */
+public interface InsProductResultMapper extends BaseMapper<InsProductResult> {
+
+    List<InsProductResult> selDetail(@Param("ips") List<Integer> ips);
+
+    /**
+     * 鏍规嵁璁㈠崟id鏌ヨ妫�楠岀粨鏋�
+     * @param orderId
+     * @return
+     */
+    List<InsProductResult> selectResultByOrderId(Integer orderId);
+}
+
+
+
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnPassMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnPassMapper.java
new file mode 100644
index 0000000..d818dd2
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnPassMapper.java
@@ -0,0 +1,15 @@
+package com.ruoyi.inspect.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.ruoyi.inspect.dto.UnPassPageDto;
+import com.ruoyi.inspect.pojo.InsUnPass;
+
+/**
+ * @author 鏈变匠鍚�
+ * @date 2024/5/8 13:05
+ */
+public interface InsUnPassMapper extends BaseMapper<InsUnPass> {
+    IPage<UnPassPageDto> pageInsUnPass(IPage<UnPassPageDto> page, QueryWrapper<UnPassPageDto> ew);
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnqualifiedRetestResultMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnqualifiedRetestResultMapper.java
new file mode 100644
index 0000000..0a6caba
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnqualifiedRetestResultMapper.java
@@ -0,0 +1,17 @@
+package com.ruoyi.inspect.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.inspect.pojo.InsUnqualifiedRetestResult;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 涓嶅悎鏍煎娴嬫楠岄」鐩殑缁撴灉
+ *
+ * @author zhuo
+ * @since 2024-09-03
+ */
+@Mapper
+public interface InsUnqualifiedRetestResultMapper extends BaseMapper<InsUnqualifiedRetestResult> {
+
+}
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderDeviceRecordService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderDeviceRecordService.java
new file mode 100644
index 0000000..84c047a
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderDeviceRecordService.java
@@ -0,0 +1,11 @@
+package com.ruoyi.inspect.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.inspect.pojo.InsOrderDeviceRecord;
+
+/**
+ * @Author zhuo
+ * @Date 2024/12/22
+ */
+public interface InsOrderDeviceRecordService extends IService<InsOrderDeviceRecord> {
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderFactoryVerifyItemService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderFactoryVerifyItemService.java
new file mode 100644
index 0000000..6b87d14
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderFactoryVerifyItemService.java
@@ -0,0 +1,15 @@
+package com.ruoyi.inspect.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.inspect.pojo.InsOrderFactoryVerifyItem;
+
+/**
+ * 鍘熸潗鏂欏巶瀹惰繘璐ч獙璇佹楠岄」
+ *
+ * @author zhuo
+ * @since 2024-09-26
+ */
+public interface InsOrderFactoryVerifyItemService extends IService<InsOrderFactoryVerifyItem> {
+
+}
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderFileService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderFileService.java
new file mode 100644
index 0000000..c4f52aa
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderFileService.java
@@ -0,0 +1,16 @@
+package com.ruoyi.inspect.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.inspect.pojo.InsOrderFile;
+
+/**
+ * <p>
+ * 妫�楠屽崟涓嬬殑闄勪欢鍒楄〃 鏈嶅姟绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-06-06 10:08:21
+ */
+public interface InsOrderFileService extends IService<InsOrderFile> {
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderPlanService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderPlanService.java
new file mode 100644
index 0000000..ce749a6
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderPlanService.java
@@ -0,0 +1,123 @@
+package com.ruoyi.inspect.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.InsOrderPlanProductDto;
+import com.ruoyi.inspect.pojo.InsOrderFactoryVerify;
+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 java.util.List;
+import java.util.Map;
+
+/**
+ * 妫�楠屼换鍔�-涓氬姟灞�
+ */
+public interface InsOrderPlanService {
+    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);
+
+    Map<String, Object> doInsOrder(Integer id, String laboratory);
+
+    int upPlanUser(Integer userId, Integer orderId,String sonLaboratory);
+
+    int submitPlan(Integer orderId, String laboratory, Integer verifyUser, String entrustCode);
+
+    List<InsProduct> getInsProduct(InsOrderPlanProductDto insOrderPlanProductDto);
+
+    List<String> checkSubmitPlan(Integer orderId, String laboratory);
+
+    IPage<InsOrderFile> getFileList(Page page, InsOrderFile insOrderFile);
+
+    int uploadFile(Integer orderId, MultipartFile file);
+
+
+    List<String> upPlanUser2(Integer orderId);
+
+    int rawMaterialVerifyPlan(Integer orderId, String laboratory, Integer type, String tell, Integer userId);
+
+    /**
+     * 鐢电紗閰嶇疆. 鏌ョ湅鏍囪瘑
+     * @param id
+     * @param laboratory
+     * @return
+     */
+    List<Map<String, Object>> getCableTag(Integer id, String laboratory);
+
+    /**
+     * 鍘熸潗鏂欐煡鐪嬫爣璇�
+     * @param id
+     * @param laboratory
+     * @return
+     */
+    List<Map<String, Object>> getRawMaterialTag(Integer id, String laboratory);
+
+    /**
+     * 鏌ョ湅閲嶅鏍囪瘑
+     * @param id
+     * @param laboratory
+     * @return
+     */
+    List<Map<String, Object>> getRepetitionTag(Integer id, String laboratory, String cableTag);
+
+    /**
+     * 鑾峰彇涓嶅悎鏍兼暟鎹�
+     * @return
+     */
+    List<InsProduct> getInsProductUnqualified(InsOrderPlanProductDto insOrderPlanProductDto);
+
+    /**
+     * 鏂板涓嶅悎鏍煎娴嬪唴瀹圭粰
+     * @param ids
+     * @return
+     */
+    boolean addDisqualificationRetest(List<Integer> ids);
+
+    /**
+     * 鑾峰彇涓嶅悎鏍煎娴嬫暟鎹�
+     * @param id
+     * @param type
+     * @param laboratory
+     * @param cableTag
+     * @param rawMaterialTag
+     * @param retestTag
+     * @return
+     */
+    List<InsProduct> getInsProductUnqualifiedRetest(Integer id, Integer type, String laboratory, String cableTag, String rawMaterialTag, String retestTag);
+
+    /**
+     * 淇濆瓨涓嶅悎鏍煎娴嬫楠屽唴瀹�
+     */
+    void saveUnqualifiedContext(Map<String, Object> insContext,Integer currentTable,Integer currentSampleId,Integer orderId,String sonLaboratory);
+
+    /**
+     * 鏌ヨ鍘熸潗鏂欒繘璐ч獙璇�
+     * @param insOrderId
+     * @return
+     */
+    InsOrderFactoryVerify getFactoryVerify(Integer insOrderId);
+
+    /**
+     * 淇濆瓨鍘熸潗鏂欒繘璐ч獙璇�
+     * @param factoryVerify
+     * @return
+     */
+    boolean addFactoryVerify(InsOrderFactoryVerify factoryVerify);
+
+
+    /**
+     * 鐢熸垚pd涓存椂
+     * @param path
+     * @return
+     */
+    String wordToPdfTemp(String path);
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderStandardTemplateService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderStandardTemplateService.java
new file mode 100644
index 0000000..5ec6807
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderStandardTemplateService.java
@@ -0,0 +1,15 @@
+package com.ruoyi.inspect.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.inspect.pojo.InsOrderStandardTemplate;
+
+/**
+ * 璁㈠崟鏍囧噯妯℃澘澶嶅埗
+ *
+ * @author zhuo
+ * @since 2024-11-05
+ */
+public interface InsOrderStandardTemplateService extends IService<InsOrderStandardTemplate> {
+
+}
+
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..fd63ba1
--- /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);
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsUnqualifiedRetestProductService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsUnqualifiedRetestProductService.java
new file mode 100644
index 0000000..6a13254
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsUnqualifiedRetestProductService.java
@@ -0,0 +1,15 @@
+package com.ruoyi.inspect.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.inspect.pojo.InsUnqualifiedRetestProduct;
+
+/**
+ * 涓嶅悎鏍兼楠岄」鐩娴�
+ *
+ * @author zhuo
+ * @since 2024-09-03
+ */
+public interface InsUnqualifiedRetestProductService extends IService<InsUnqualifiedRetestProduct> {
+
+}
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderDeviceRecordServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderDeviceRecordServiceImpl.java
new file mode 100644
index 0000000..4d8b71e
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderDeviceRecordServiceImpl.java
@@ -0,0 +1,15 @@
+package com.ruoyi.inspect.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.inspect.mapper.InsOrderDeviceRecordMapper;
+import com.ruoyi.inspect.pojo.InsOrderDeviceRecord;
+import com.ruoyi.inspect.service.InsOrderDeviceRecordService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @Author zhuo
+ * @Date 2024/12/22
+ */
+@Service
+public class InsOrderDeviceRecordServiceImpl extends ServiceImpl<InsOrderDeviceRecordMapper, InsOrderDeviceRecord> implements InsOrderDeviceRecordService {
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderFactoryVerifyItemServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderFactoryVerifyItemServiceImpl.java
new file mode 100644
index 0000000..9a27146
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderFactoryVerifyItemServiceImpl.java
@@ -0,0 +1,19 @@
+package com.ruoyi.inspect.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.inspect.mapper.InsOrderFactoryVerifyItemMapper;
+import com.ruoyi.inspect.pojo.InsOrderFactoryVerifyItem;
+import com.ruoyi.inspect.service.InsOrderFactoryVerifyItemService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 鍘熸潗鏂欏巶瀹惰繘璐ч獙璇佹楠岄」
+ *
+ * @author zhuo
+ * @since 2024-09-26
+ */
+@Service
+public class InsOrderFactoryVerifyItemServiceImpl extends ServiceImpl<InsOrderFactoryVerifyItemMapper, InsOrderFactoryVerifyItem> implements InsOrderFactoryVerifyItemService {
+
+}
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderFileServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderFileServiceImpl.java
new file mode 100644
index 0000000..63ed243
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderFileServiceImpl.java
@@ -0,0 +1,20 @@
+package com.ruoyi.inspect.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.inspect.mapper.InsOrderFileMapper;
+import com.ruoyi.inspect.pojo.InsOrderFile;
+import com.ruoyi.inspect.service.InsOrderFileService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 妫�楠屽崟涓嬬殑闄勪欢鍒楄〃 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-06-06 10:08:21
+ */
+@Service
+public class InsOrderFileServiceImpl extends ServiceImpl<InsOrderFileMapper, InsOrderFile> implements InsOrderFileService {
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
new file mode 100644
index 0000000..1f39ef1
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
@@ -0,0 +1,4295 @@
+package com.ruoyi.inspect.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.aspose.words.License;
+import com.aspose.words.SaveFormat;
+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.BorderStyle;
+import com.deepoove.poi.data.style.Style;
+import com.deepoove.poi.data.style.TableStyle;
+import com.deepoove.poi.util.TableTools;
+import com.deepoove.poi.util.UnitUtils;
+import com.ruoyi.basic.mapper.IfsInventoryQuantityMapper;
+import com.ruoyi.basic.pojo.IfsInventoryQuantity;
+import com.ruoyi.basic.pojo.StandardTemplate;
+import com.ruoyi.basic.service.StandardTemplateService;
+import com.ruoyi.common.constant.InsOrderTypeConstants;
+import com.ruoyi.common.core.domain.entity.Custom;
+import com.ruoyi.common.core.domain.entity.InformationNotification;
+import com.ruoyi.common.core.domain.entity.SysDictData;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.DateImageUtil;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.dto.*;
+import com.ruoyi.inspect.mapper.*;
+import com.ruoyi.inspect.pojo.*;
+import com.ruoyi.inspect.service.*;
+import com.ruoyi.inspect.vo.InsOrderPlanTaskSwitchVo;
+import com.ruoyi.inspect.vo.InsOrderPlanVO;
+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.service.AuxiliaryOutputWorkingHoursService;
+import com.ruoyi.system.mapper.CustomMapper;
+import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.ISysDictTypeService;
+import com.ruoyi.system.service.InformationNotificationService;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.xwpf.usermodel.*;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.mock.web.MockMultipartFile;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import java.io.*;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+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.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/**
+ * 妫�楠屼换鍔�-涓氬姟瀹炵幇灞�
+ */
+@Service
+public class InsOrderPlanServiceImpl extends ServiceImpl<InsOrderMapper, InsOrder> implements InsOrderPlanService {
+
+    @Resource
+    private InsSampleMapper insSampleMapper;
+    @Resource
+    private InsSampleUserMapper insSampleUserMapper;
+    @Resource
+    private InsOrderMapper insOrderMapper;
+    @Resource
+    private InsOrderService insOrderService;
+    @Resource
+    private StandardTemplateService standardTemplateService;
+    @Resource
+    private InsOrderStateMapper insOrderStateMapper;
+    @Resource
+    private InsProductMapper insProductMapper;
+    @Resource
+    private ShiftTimeMapper shiftTimeMapper;
+    @Resource
+    private PerformanceShiftMapper performanceShiftMapper;
+    @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
+    private AuxiliaryOutputWorkingHoursMapper auxiliaryOutputWorkingHoursMapper;
+    @Resource
+    private AuxiliaryOutputWorkingHoursService auxiliaryOutputWorkingHoursService;
+    @Resource
+    private InformationNotificationService informationNotificationService;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private CustomMapper customMapper;
+    @Value("${file.path}")
+    private String imgUrl;
+
+    @Resource
+    private InsOrderFileMapper insOrderFileMapper;
+    @Resource
+    private IfsInventoryQuantityMapper ifsInventoryQuantityMapper;
+    @Resource
+    private InsReportService insReportService;
+    @Resource
+    private InsUnqualifiedRetestProductMapper insUnqualifiedRetestProductMapper;
+    @Resource
+    private InsUnqualifiedRetestProductService insUnqualifiedRetestProductService;
+    @Resource
+    private InsUnqualifiedRetestResultMapper insUnqualifiedRetestResultMapper;
+    @Resource
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+    @Resource
+    private InsOrderFactoryVerifyMapper insOrderFactoryVerifyMapper;
+    @Resource
+    private InsOrderFactoryVerifyItemService insOrderFactoryVerifyItemService;
+    @Value("${file.licenseUrl}")
+    private String licenseUrl;
+    @Resource
+    private SpotCheckQuarterItemMapper spotCheckQuarterItemMapper;
+    @Resource
+    private InsOrderStandardTemplateService insOrderStandardTemplateService;
+    @Resource
+    private InsOrderDeviceRecordMapper insOrderDeviceRecordMapper;
+    @Resource
+    private InsOrderDeviceRecordService insOrderDeviceRecordService;
+    @Resource
+    private ISysDictTypeService iSysDictTypeService;
+
+
+    @Override
+    public IPage<InsOrderPlanVO> selectInsOrderPlanList(Page page, InsOrderPlanDTO insOrderPlanDTO) {
+        // todo: 浠呯湅鑷繁鎴栬�呭疄楠屽
+        //鑾峰彇褰撳墠浜烘墍灞炲疄楠屽id
+
+        String laboratory = null;
+
+        String userName = null;
+        Integer userId = null;
+        if (ObjectUtil.isNotEmpty(insOrderPlanDTO.getUserId())) {
+            userId = SecurityUtils.getUserId().intValue();
+            userName = userMapper.selectById(userId).getName();
+            insOrderPlanDTO.setUserId(null);
+        }
+        Integer isCheck = insOrderPlanDTO.getIsCheck();
+        insOrderPlanDTO.setIsCheck(null);
+        String sonLaboratory = insOrderPlanDTO.getSonLaboratory();//璇曢獙瀹�
+        IPage<InsOrderPlanVO> insOrderPage = insSampleMapper.findInsSampleAndOrder(page,
+                QueryWrappers.queryWrappers(insOrderPlanDTO),
+                userName,
+                userId,
+                sonLaboratory,
+                laboratory,
+                isCheck);
+        return insOrderPage;
+    }
+
+    @Override
+    public IPage<InsOrderPlanTaskSwitchVo> inspectionOrderDetailsTaskSwitching(Page page, InsOrderPlanDTO insOrderPlanDTO) {
+
+        Integer userId = SecurityUtils.getUserId().intValue();
+        User user = userMapper.selectById(userId);//褰撳墠鐧诲綍鐨勪汉
+        // todo: 浠呯湅鑷繁鎴栬�呭疄楠屽
+        //鑾峰彇褰撳墠浜烘墍灞炲疄楠屽id
+        String departLimsId = user.getDepartLimsId();
+        String laboratory = null;
+
+        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);
+        if (BeanUtil.isEmpty(order.getInsTime())) {
+            insOrder.setInsTime(LocalDateTime.now());
+            insOrderMapper.updateById(insOrder);
+            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);
+        map.put("sampleProduct", list);
+
+        // 鏌ヨ鍘傚瀵嗗害
+        String supplierDensity = "";
+        SampleProductDto sampleProductDto = list.get(0);
+
+        // 鍒ゆ柇鏈夋病鏈夌粦瀹氬瀷鍙�
+        String modelValue = insSampleMapper.selectSupplierDensityModel(sampleProductDto.getSample(),
+                order.getProduction(),
+                sampleProductDto.getModel());
+        if (StringUtils.isNotBlank(modelValue)) {
+            supplierDensity = modelValue;
+        } else {
+            supplierDensity = insSampleMapper.selectSupplierDensity(sampleProductDto.getSample(),
+                    order.getProduction());
+        }
+        map.put("supplierDensity", supplierDensity);
+        return map;
+    }
+
+    @Override
+    public List<InsProduct> getInsProduct(InsOrderPlanProductDto dto) {
+        List<InsProduct> insProducts = new ArrayList<>();
+        switch (dto.getType()) {
+            case 0:
+                insProducts = insSampleMapper.getInsProduct1(dto.getId(), dto.getLaboratory(), dto.getCableTag(), dto.getRepetitionTag(), null);
+                //鏍峰搧
+                break;
+            case 4:
+                //鐢电紗閰嶇疆
+                insProducts = insSampleMapper.getInsProduct1(dto.getId(), dto.getLaboratory(), dto.getCableTag(), dto.getRepetitionTag(), null);
+                break;
+            case 5:
+                //鍘熸潗鏂欎笅鍗�
+                insProducts = insSampleMapper.getInsProduct6(dto.getId(), dto.getLaboratory(), dto.getRawMaterialTag(), null);
+                break;
+        }
+        if (BeanUtil.isEmpty(insProducts)) {
+            return null;
+        }
+        // 鏌ヨ璁㈠崟Id
+        InsOrder order = insOrderMapper.selectFirstSubmit(dto.getId());
+        getTemplateThing(order, insProducts);
+        return insProducts;
+    }
+
+    @Override
+    public List<String> checkSubmitPlan(Integer orderId, String laboratory) {
+        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(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)
+                .eq(InsProduct::getInsResult, 0));
+
+        // 杩囨护鍒ゆ柇鏄湁澶嶆祴鐨勫�兼槸鍚堟牸鐨�
+        List<InsProduct> productList = insProducts.stream().filter(insProduct -> {
+            // 鏌ヨ涓嶅悎鏍煎娴�
+            Long count = insUnqualifiedRetestProductMapper.selectCount(Wrappers.<InsUnqualifiedRetestProduct>lambdaQuery()
+                    .eq(InsUnqualifiedRetestProduct::getInsProductId, insProduct.getId())
+                    .ne(InsUnqualifiedRetestProduct::getInsResult, 0));
+            if (count != 2) {
+                return true;
+            }
+            return false;
+        }).collect(Collectors.toList());
+        if (productList.size() > 0) {
+            collect = productList.stream().map(insProduct -> {
+                return insProduct.getInspectionItem() + "-" + insProduct.getInspectionItemSubclass();
+            }).collect(Collectors.toList());
+        }
+        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 = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "_" + 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 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
+    @Transactional(rollbackFor = Exception.class)
+    public void saveInsContext(Map<String, Object> insContext, Integer currentTable, Integer currentSampleId, Integer orderId, String sonLaboratory) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        InsSample insSample = insSampleMapper.selectById(currentSampleId);
+        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));
+                    }
+                }
+                //妫�楠屽��
+                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<>();
+                        map.put("v", JSON.parseObject(JSON.toJSONString(insValue.get("v"))).get("v"));
+                        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(JSON.parseObject(JSON.toJSONString(insValue.get("v"))).get("v").toString())) {
+                                map.put("u", userId + "");
+                            } else {
+                                map.put("u", insValue.get("u"));
+                            }
+                            iv.add(map);
+                        } catch (Exception e) {
+                        }
+                    }
+                    newResult.setInsValue(JSON.toJSONString(iv));
+                }
+                //璁$畻鍊�
+                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", JSON.parseObject(JSON.toJSONString(comValue.get("v"))).get("v"));
+                        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(o.equals("") ? null : (o.toString()));
+                    }
+                } 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));
+                } catch (Exception e) {
+                    insProduct.setInsResult(2);//寰呭畾
+                }
+                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);
+                }
+
+                insProduct.setUpdateUser(userId);
+                insProductMapper.updateById(insProduct);
+                insProductUserMapper.insert(new InsProductUser(null, userId, LocalDateTime.now(), insProduct.getId()));
+
+                insSample.setInsState(1);
+                Long l = insProductMapper.selectCount(Wrappers.<InsProduct>lambdaQuery()
+                        .eq(InsProduct::getInsSampleId, insSample.getId()));
+                Long l1 = insProductMapper.selectCount(Wrappers.<InsProduct>lambdaQuery()
+                        .eq(InsProduct::getInsSampleId, insSample.getId())
+                        .and(wrapper -> wrapper
+                                .isNotNull(InsProduct::getInsResult)
+                                .or()
+                                .ne(InsProduct::getInsResult, 2)
+                        ));
+                if (Objects.equals(l, l1)) {
+                    insSample.setInsState(2);
+                }
+                insSampleMapper.updateById(insSample);
+                /*鏍¢獙涓�涓媟esult琛�*/
+                List<InsProductResult> insProductResults = insProductResultMapper.selectList(Wrappers.<InsProductResult>lambdaQuery()
+                        .eq(InsProductResult::getInsProductId, product.getId()));
+                if (insProductResults.size() > 1) {
+                    for (int i = 1; i < insProductResults.size(); i++) {
+                        insProductResultMapper.deleteById(insProductResults.get(i));
+                    }
+                }
+
+                //鏌ヨ妫�楠屽崟淇℃伅
+                // 娣诲姞宸ユ椂
+                InsProduct finalInsProduct = insProductMapper.selectById(product.getId());
+                threadPoolTaskExecutor.execute(() -> {
+                    InsOrder insOrder = insOrderMapper.selectById(insSample.getInsOrderId());
+                    this.addAuxiliary(userId, finalInsProduct, insOrder);
+                });
+            }
+        });
+        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));
+            }
+        }
+
+
+        // 娣诲姞璁惧璁板綍
+        threadPoolTaskExecutor.execute(() -> {
+            InsOrder order = insOrderMapper.selectById(insSample.getInsOrderId());
+            User user = userMapper.selectById(userId);
+            // 鏌ヨ璁惧浣跨敤璁板綍鏌ヨ璇ヨ鍗曠殑浣跨敤璁板綍
+            List<InsOrderDeviceRecordDto> deviceRecordDtoList = insOrderDeviceRecordMapper.selectDeviceNumber(insSample.getInsOrderId());
+            Set<String> recordCodeset = deviceRecordDtoList.stream().map(InsOrderDeviceRecordDto::getManagementNumber).collect(Collectors.toSet());
+
+            // 鑾峰彇璁㈠崟璁惧缂栧彿
+            List<InsProductResult> resultList = insProductResultMapper.selectResultByOrderId(insSample.getInsOrderId());
+            Set<String> deviceCodeSet = new HashSet<>();
+            for (InsProductResult result : resultList) {
+                // 娣诲姞璁惧缂栧彿
+                List<JSONObject> jsonObjects = JSON.parseArray(result.getEquipValue(), JSONObject.class);
+                for (JSONObject jsonObject : jsonObjects) {
+                    if (!"".equals(jsonObject.get("v") + "")) {
+                        List<String> v = StrUtil.split(jsonObject.get("v") + "", "锛�");
+                        deviceCodeSet.addAll(v);
+                    }
+                }
+            }
+            // 1.鍒ゆ柇鏄惁鏈夋病鏈夋坊鍔犵殑浣跨敤璁板綍
+            Set<String> orderDeviceNumbers = getDeviceDifference(deviceCodeSet, recordCodeset);
+            // 娣诲姞浣跨敤璁板綍, 鏍规嵁缂栧彿鏌ヨ璁惧id
+            if (CollectionUtils.isNotEmpty(orderDeviceNumbers)) {
+                List<Integer> orderDeviceIds = insOrderDeviceRecordMapper.selectDeviceIdsByNumbers(orderDeviceNumbers);
+                List<InsOrderDeviceRecord> collect = orderDeviceIds.stream().map(deviceId -> {
+                    InsOrderDeviceRecord insOrderDeviceRecord = new InsOrderDeviceRecord();
+                    insOrderDeviceRecord.setInsOrderId(insSample.getInsOrderId());
+                    insOrderDeviceRecord.setDeviceId(deviceId);
+                    insOrderDeviceRecord.setSampleCode(order.getEntrustCode());
+                    insOrderDeviceRecord.setUseBefore(1);
+                    insOrderDeviceRecord.setUseAfter(1);
+                    insOrderDeviceRecord.setUsePerson(user.getName());
+                    insOrderDeviceRecord.setUsePersonId(user.getId());
+                    return insOrderDeviceRecord;
+                }).collect(Collectors.toList());
+
+                insOrderDeviceRecordService.saveBatch(collect);
+
+            }
+
+            // 2.鍒ゆ柇鏄惁鍙栨秷浜嗚澶囦娇鐢�
+            Set<String> repoprNumbers = getDeviceDifference(recordCodeset, deviceCodeSet);
+            if (CollectionUtils.isNotEmpty(repoprNumbers)) {
+                List<Integer> reportDeviceIds = insOrderDeviceRecordMapper.selectDeviceIdsByNumbers(repoprNumbers);
+                insOrderDeviceRecordMapper.delete(Wrappers.<InsOrderDeviceRecord>lambdaQuery()
+                        .in(InsOrderDeviceRecord::getDeviceId, reportDeviceIds)
+                        .eq(InsOrderDeviceRecord::getInsOrderId, insSample.getInsOrderId()));
+            }
+        });
+    }
+
+    private static Set<String> getDeviceDifference(Set<String> number1, Set<String> number2) {
+        return number1.stream().filter(s1 -> number2.stream().noneMatch(s2 -> s1.equals(s2)))
+                .collect(Collectors.toSet());
+    }
+
+
+    //浜ゆ帴
+    @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 void getTemplateThing(InsOrder order, List<InsProduct> insProducts) {
+        Set<Integer> set = new HashSet<>();
+        // 鏌ヨ璁㈠崟鐘舵�佸垽鏂槸鍚︽槸鏌ュ巻鍙叉ā鏉�
+        if (order.getIsFirstSubmit() != null && order.getIsFirstSubmit().equals(1)) {
+            InsOrderState insOrderState = insOrderStateMapper.selectOne(Wrappers.<InsOrderState>lambdaQuery()
+                    .eq(InsOrderState::getInsOrderId, order.getId())
+                    .last("limit 1"));
+            if (insOrderState != null && (!insOrderState.getInsState().equals(3) || !insOrderState.getInsState().equals(5))) {
+                for (InsProduct product : insProducts) {
+                    if (product.getTemplateId() == null) {
+                        product.setTemplate(new ArrayList<>());
+                        continue;
+                    }
+                    String thing = null;
+                    if (product.getTemplateId() != null && set.add(product.getTemplateId())) {
+                        // 鏌ヨ鍘嗗彶妯℃澘
+                        InsOrderStandardTemplate one = insOrderStandardTemplateService.getOne(Wrappers.<InsOrderStandardTemplate>lambdaQuery()
+                                .eq(InsOrderStandardTemplate::getTemplateId, product.getTemplateId())
+                                .eq(InsOrderStandardTemplate::getInsOrderId, order.getId()));
+                        thing = one.getThing();
+                        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(one.getName());
+                        }
+                    }
+                }
+            }
+        }
+        for (InsProduct product : insProducts) {
+            if (product.getTemplateId() == null) {
+                product.setTemplate(new ArrayList<>());
+                continue;
+            }
+            String thing = null;
+            if (product.getTemplateId() != null && set.add(product.getTemplateId())) {
+                long begin = System.currentTimeMillis();
+                thing = standardTemplateService.getStandTempThingById(product.getTemplateId());
+                long end = System.currentTimeMillis();
+                System.out.println("=========鏃堕棿====" + (end - begin));
+            }
+            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);
+                long begin = System.currentTimeMillis();
+                product.setTemplateName(standardTemplateService.getStandTempNameById(product.getTemplateId()));
+                long end = System.currentTimeMillis();
+                System.out.println("=========鏃堕棿22222====" + (end - begin));
+            }
+        }
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int submitPlan(Integer orderId, String laboratory, Integer verifyUser, String entrustCode) {
+        InsOrder order = insOrderMapper.selectById(orderId);
+        // 鍒ゆ柇鏄惁鏈夐噸澶嶇紪鍙�, 鏈夐噸澶嶇紪鍙峰仛鎻愰啋
+        Long codeCount = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery()
+                .ne(InsOrder::getState, -1)
+                .ne(InsOrder::getIfsInventoryId, order.getIfsInventoryId())
+                .eq(InsOrder::getEntrustCode, order.getEntrustCode()));
+        if (codeCount > 0) {
+            throw new ErrorException("褰撳墠缂栧彿鏈夐噸澶�, 璇峰厛鍘讳慨鏀归噸澶嶇紪鍙�");
+        }
+
+        // 鍒ゆ柇璇ヨ鍗曟槸鍚︽槸绗竴娆$敓浜�
+        if (!(order.getIsFirstSubmit() != null && order.getIsFirstSubmit().equals(1))) {
+            insOrderMapper.update(null, Wrappers.<InsOrder>lambdaUpdate()
+                    .eq(InsOrder::getId, orderId)
+                    .set(InsOrder::getIsFirstSubmit, 1)
+                    .set(InsOrder::getFirstSubmitDate, LocalDateTime.now()));
+        }
+
+        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)
+                .ne(InsProduct::getIsBinding, 1));
+        insProducts.addAll(insProductMapper.selectFiberInsProduct(ids, laboratory));
+        if (insProducts.size() > 0) {
+            String str = "";
+            int count = 0;
+            for (InsProduct product : insProducts) {
+                count++;
+                str += "<br/>" + count + "锛�" + product.getInspectionItem() + " " + product.getInspectionItemSubclass() + "<br/>";
+
+            }
+            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();
+        String userName = insProductMapper.selectUserById(userId).get("name");
+
+        // 鏌ヨ鍙戦�佷汉淇℃伅
+        String sendUserAccount = insProductMapper.selectUserById(verifyUser).get("account");
+
+
+        InformationNotification info = new InformationNotification();
+        info.setCreateUser(userName);
+        info.setMessageType("2");
+        info.setTheme("澶嶆牳閫氱煡");
+        info.setContent("鎮ㄦ湁涓�鏉℃楠屼换鍔″緟澶嶆牳娑堟伅, 缂栧彿:" + order.getEntrustCode());
+        info.setSenderId(userId);
+        info.setConsigneeId(verifyUser);
+        info.setViewStatus(false);
+        info.setJumpPath("b1-inspect-orderPlan-review");
+        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;
+        });
+        // todo: 鍒犻櫎鏁伴噰閲囬泦娆℃暟
+//        String key = "frequency" + ":" + entrustCode + ":*";
+//        RedisUtil.delsLike(key);
+
+        // 鎻愪氦鐢熸垚鎶ュ憡
+        this.generateReport(orderId);
+
+        // 娣诲姞涓存椂pdf鐢熸垚鍦板潃
+        InsReport report = insReportMapper.selectOne(Wrappers.<InsReport>lambdaQuery()
+                .eq(InsReport::getInsOrderId, orderId));
+        String tempUrlPdf = this.wordToPdfTemp(report.getUrl().replace("/word", wordUrl));
+        report.setTempUrlPdf("/word/" + tempUrlPdf);
+        insReportMapper.updateById(report);
+
+        // 鏌ヨ璁㈠崟
+        InsSample insSample = insSampleMapper.selectOne(Wrappers.<InsSample>lambdaQuery()
+                .eq(InsSample::getInsOrderId, orderId)
+                .last("limit 1"));
+        // 鏌ヨ鍘熸潗鏂�
+        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(order.getIfsInventoryId());
+
+        // 鍒犻櫎鍘熸湰妯℃澘
+        insOrderStandardTemplateService.remove(Wrappers.<InsOrderStandardTemplate>lambdaQuery()
+                .eq(InsOrderStandardTemplate::getInsOrderId, orderId));
+        // 澶嶅埗妯℃澘
+        Set<Integer> set = new HashSet<>();
+        List<InsProduct> insProductList = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                .in(InsProduct::getInsSampleId, ids)
+                .select(InsProduct::getTemplateId));
+
+        for (InsProduct product : insProductList) {
+            // 鏌ヨ妯℃澘id
+            if (product.getTemplateId() != null && set.add(product.getTemplateId())) {
+                StandardTemplate standardTemplate = standardTemplateService.getById(product.getTemplateId());
+                if (standardTemplate != null) {
+                    InsOrderStandardTemplate insOrderStandardTemplate = new InsOrderStandardTemplate();
+                    insOrderStandardTemplate.setInsOrderId(orderId);
+                    insOrderStandardTemplate.setTemplateId(standardTemplate.getId());
+                    insOrderStandardTemplate.setNumber(standardTemplate.getNumber());
+                    insOrderStandardTemplate.setName(standardTemplate.getName());
+                    insOrderStandardTemplate.setThing(standardTemplate.getThing());
+                    insOrderStandardTemplateService.save(insOrderStandardTemplate);
+                }
+            }
+        }
+
+
+        // todo: 鎴愬搧鎶芥牱娣诲姞鍚堟牸鐘舵��
+        // 鍒ゆ柇鏄惁鏈夋娊鏍蜂俊鎭�
+        if (order.getQuarterItemId() != null) {
+            // 鍒ゆ柇鏄惁鏈変笉鍚堟牸
+            Long unqualifiedCount = 0L;
+            if (CollectionUtils.isNotEmpty(insSamples)) {
+                unqualifiedCount = insProductMapper.selectCount(Wrappers.<InsProduct>lambdaQuery()
+                        .in(InsProduct::getInsSampleId, insSamples.stream().map(InsSample::getId).collect(Collectors.toList()))
+                        .eq(InsProduct::getInsResult, 0));
+
+                // 鍒ゆ柇濡傛灉鏈変笉鍚堟牸鐨勬楠岄」, 鍒ゆ柇鏈夋病鏈夋楠岄」澶嶆祴, 澶嶆牳鍚堟牸涔熺畻鍚堟牸閫氳繃
+                if (!unqualifiedCount.equals(0L)) {
+                    List<InsProduct> productList = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                            .in(InsProduct::getInsSampleId, insSamples.stream().map(InsSample::getId).collect(Collectors.toList()))
+                            .eq(InsProduct::getInsResult, 0));
+
+                    boolean flag = true;
+                    for (InsProduct insProduct : productList) {
+                        Long unqualifiedProductCount = insUnqualifiedRetestProductMapper.selectCount(Wrappers.<InsUnqualifiedRetestProduct>lambdaQuery()
+                                .eq(InsUnqualifiedRetestProduct::getInsProductId, insProduct.getId())
+                                .ne(InsUnqualifiedRetestProduct::getInsResult, 0));
+                        if (unqualifiedProductCount != 2) {
+                            flag = false;
+                        }
+                    }
+                    if (flag) {
+                        unqualifiedCount = 0L;
+                    }
+                }
+            }
+            spotCheckQuarterItemMapper.update(null, Wrappers.<SpotCheckQuarterItem>lambdaUpdate()
+                    .eq(SpotCheckQuarterItem::getQuarterItemId, order.getQuarterItemId())
+                    .set(SpotCheckQuarterItem::getResult, unqualifiedCount.equals(0L) ? "鍚堟牸" : "涓嶅悎鏍�"));
+
+        }
+
+        // 鍙戦�佷紒涓氬井淇¢�氱煡
+        threadPoolTaskExecutor.execute(() -> {
+            String message = "";
+            message += "妫�楠屼换鍔″鏍搁�氱煡";
+            message += "\n鎻愪氦浜�: " + userName;
+            message += "\n濮旀墭缂栧彿: " + order.getEntrustCode();
+            message += "\n鏍峰搧鍚嶇О: " + insSample.getModel();
+            message += "\n瑙勬牸鍨嬪彿: " + order.getPartDetail();
+            if (ifsInventoryQuantity != null) {
+                message += "\n鎵规鍙�: " + ifsInventoryQuantity.getUpdateBatchNo();
+            }
+            //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡  鎻愪氦澶嶆牳
+            try {
+                WxCpUtils.inform(sendUserAccount, message, null);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        });
+
+        // ifs绉诲簱
+        if (ifsInventoryQuantity != null) {
+            // 鐧昏妫�楠岀粨鏋�
+            // 鍒ゆ柇鏄惁鏈変笉鍚堟牸, 鏈変笉鍚堟牸涓嶈兘绉诲簱
+            // todo: ifs绉诲簱
+            insReportService.isRawMaterial(order);
+        } else {
+            // 淇敼鎴愬搧鐘舵��
+            // 鍒ゆ柇鏄惁鏈変笉鍚堟牸
+            Long unqualifiedCount = insReportService.getUnqualifiedCount(order);
+            if (unqualifiedCount.equals(0L)) {
+                insOrderMapper.update(null, Wrappers.<InsOrder>lambdaUpdate()
+                        .eq(InsOrder::getId, order.getId())
+                        .set(InsOrder::getInsResult, 1));
+            } else {
+                insOrderMapper.update(null, Wrappers.<InsOrder>lambdaUpdate()
+                        .eq(InsOrder::getId, order.getId())
+                        .set(InsOrder::getInsResult, 0));
+            }
+        }
+
+        return 1;
+    }
+
+    public int pxToCm(int px) {
+        return px / 9;
+    }
+
+    // 鑾峰彇涓や釜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;
+    }
+
+    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 "鏈煡";
+        }
+    }
+
+
+    /**
+     * 妫�楠屼换鍔″鏍�
+     * @param orderId
+     * @param laboratory
+     * @param type
+     * @param tell
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int rawMaterialVerifyPlan(Integer orderId, String laboratory, Integer type, String tell, Integer userId) {
+        Integer 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().intValue()));
+        Long count = insOrderStateMapper.selectCount(Wrappers.<InsOrderState>lambdaQuery()
+                .eq(InsOrderState::getInsOrderId, orderId)
+                .ne(InsOrderState::getInsState, 5));
+        InsReport report = insReportMapper.selectOne(Wrappers.<InsReport>lambdaQuery()
+                .eq(InsReport::getInsOrderId, orderId));
+        // 鏌ヨ璁㈠崟
+        InsOrder order = insOrderMapper.selectById(orderId);
+        if (count == 0 && num == 5) {
+            // 淇敼鎶ュ憡鐘舵��
+            insReportMapper.update(null, Wrappers.<InsReport>lambdaUpdate()
+                    .eq(InsReport::getInsOrderId, orderId)
+                    .set(InsReport::getIsPass, 1));
+
+            // 淇敼璁㈠崟鐘舵��
+            insOrderMapper.update(null, Wrappers.<InsOrder>lambdaUpdate()
+                    .eq(InsOrder::getId, orderId)
+                    .set(InsOrder::getInsState, 5));
+
+            //鐢熸垚鍘熸潗鏂欒繘璐ч獙璇佸師濮嬭褰曞埌闄勪欢閲�
+            if (order.getTypeSource() != null && order.getTypeSource().equals(1)) {
+                this.reportFactoryVerify(orderId, userId, report.getWriteUserId());
+            }
+
+            // 鏌ヨ妫�楠屼换鍔$殑妫�楠屼换鍔�
+            // 鎶ュ憡鐩栦笂鎵瑰噯浜�
+            insReportService.writeReport(report.getId(), userId, report.getWriteUserId());
+
+            // 妫�楠屼汉
+            String userName = insProductMapper.selectUserById(report.getWriteUserId()).get("name");
+
+            // 澶嶆牳浜�
+            Integer checkUserId = SecurityUtils.getUserId().intValue();
+            String chenkUserName = insProductMapper.selectUserById(checkUserId).get("name");
+
+            // 瀹℃牳浜�
+            String sendUserAccount = insProductMapper.selectUserById(userId).get("account");
+
+            // 鍙戦�佷紒涓氬井淇¢�氱煡(閫氱煡瀹℃牳浜哄鎵�)
+            threadPoolTaskExecutor.execute(() -> {
+
+                InsSample insSample = insSampleMapper.selectOne(Wrappers.<InsSample>lambdaQuery()
+                        .eq(InsSample::getInsOrderId, orderId)
+                        .last("limit 1"));
+                // 鏌ヨ鍘熸潗鏂�
+                IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(order.getIfsInventoryId());
+
+                String message = "";
+                message += "鎶ュ憡缂栧埗瀹℃壒閫氱煡";
+                message += "\n妫�楠屼汉: " + userName;
+                message += "\n澶嶆牳浜�: " + chenkUserName;
+                message += "\n濮旀墭缂栧彿: " + order.getEntrustCode();
+                message += "\n鏍峰搧鍚嶇О: " + insSample.getModel();
+                message += "\n瑙勬牸鍨嬪彿: " + order.getPartDetail();
+                if (ifsInventoryQuantity != null) {
+                    message += "\n鐢熶骇鍘傚: " + ifsInventoryQuantity.getSupplierName();
+                    message += "\n鎵规鍙�: " + ifsInventoryQuantity.getUpdateBatchNo();
+                }
+                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡  鎻愪氦澶嶆牳
+                try {
+                    WxCpUtils.inform(sendUserAccount, message, null);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            });
+
+
+        } else {
+            //澶嶆牳涓嶉�氳繃灏嗘妸澶嶆牳鐨勮礋璐d汉鍘绘帀
+            Integer id = insSampleUserMapper.selectOne(Wrappers.<InsSampleUser>lambdaQuery().eq(InsSampleUser::getInsSampleId, orderId).orderByDesc(InsSampleUser::getId).last("limit 1")).getId();
+            insSampleUserMapper.deleteById(id);
+
+            // 褰撳墠瀹℃牳浜�
+            Integer currentUserId = SecurityUtils.getUserId().intValue();
+            String userName = insProductMapper.selectUserById(currentUserId).get("name");
+
+            // 鍙戦�佹秷鎭殑浜�
+            // 鏌ヨ鍙戦�佷汉淇℃伅
+            String sendUserAccount = insProductMapper.selectUserById(report.getWriteUserId()).get("account");
+
+            // 鍙戦�佷紒涓氬井淇¢�氱煡(妫�楠屼换鍔¢��鍥�)
+            threadPoolTaskExecutor.execute(() -> {
+                // 鏌ヨ璁㈠崟
+                InsSample insSample = insSampleMapper.selectOne(Wrappers.<InsSample>lambdaQuery()
+                        .eq(InsSample::getInsOrderId, orderId)
+                        .last("limit 1"));
+                // 鏌ヨ鍘熸潗鏂�
+                IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(order.getIfsInventoryId());
+
+                String message = "";
+                message += "妫�楠屼换鍔″鏍搁��鍥為�氱煡";
+                message += "\n澶嶆牳浜�: " + userName;
+                message += "\n濮旀墭缂栧彿: " + order.getEntrustCode();
+                message += "\n鏍峰搧鍚嶇О: " + insSample.getModel();
+                message += "\n瑙勬牸鍨嬪彿: " + order.getPartDetail();
+                if (ifsInventoryQuantity != null) {
+                    message += "\n鎵规鍙�: " + ifsInventoryQuantity.getUpdateBatchNo();
+                }
+                message += "\n閫�鍥炲師鍥�: " + tell;
+                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡  鎻愪氦澶嶆牳
+                try {
+                    WxCpUtils.inform(sendUserAccount, message, null);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            });
+        }
+        return 1;
+    }
+
+    /**
+     * 鐢熸垚鎶ュ憡
+     * @param orderId
+     */
+    private void generateReport(Integer orderId) {
+        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)
+                    .ne(InsProduct::getIsBinding, 1));
+            List<Integer> results = insProducts.stream().map(InsProduct::getInsResult).filter(str -> str != null).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());
+                    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);
+        // 鎶芥鍙樻垚濮旀墭妫�楠�
+        if (insOrder.getOrderType().equals(InsOrderTypeConstants.SPOT_CHECK)) {
+            insOrder.setOrderType(InsOrderTypeConstants.CUSTOMER_ORDERED);
+        }
+
+        // 鍒ゆ柇鏄ぇ鎶ュ憡杩樻槸灏忔姤鍛�  杩涘巶灏忔姤鍛�, 鍏朵粬閮芥槸澶ф姤鍛�
+        if (insOrder.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY)) {
+            // 鐢熸垚灏忔姤鍛�
+            addSmallReport(orderId, insOrder, insSamples);
+        } else {
+            //鐢熸垚澶ф姤鍛�
+            addBitReport(orderId, insOrder);
+        }
+
+    }
+
+
+    /**
+     * 鐢电紗閰嶇疆, 鏌ョ湅閰嶇疆鏍囪瘑
+     * @param id
+     * @param laboratory
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> getCableTag(Integer id, String laboratory) {
+        return insSampleMapper.getCableTag(id, laboratory);
+    }
+
+    /**
+     * 鍘熸潗鏂欐煡鐪嬫爣璇�
+     * @param id
+     * @param laboratory
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> getRawMaterialTag(Integer id, String laboratory) {
+        return insSampleMapper.getRawMaterialTag(id, laboratory);
+    }
+
+    /**
+     * 鏌ョ湅閲嶅鏍囪瘑
+     * @param id
+     * @param laboratory
+     * @return
+     */
+    @Override
+    public List<Map<String, Object>> getRepetitionTag(Integer id, String laboratory, String cableTag) {
+        return insSampleMapper.getRepetitionTag(id, laboratory, cableTag);
+    }
+
+    /**
+     * 鑾峰彇涓嶅悎鏍兼暟鎹�
+     * @return
+     */
+    @Override
+    public List<InsProduct> getInsProductUnqualified(InsOrderPlanProductDto dto) {
+        List<InsProduct> insProducts = new ArrayList<>();
+        switch (dto.getType()) {
+            case 0:
+                //鏍峰搧
+                insProducts = insSampleMapper.getInsProduct1(dto.getId(), dto.getLaboratory(), dto.getCableTag(), dto.getRepetitionTag(), "1");
+                break;
+            case 4:
+                //鐢电紗閰嶇疆
+                insProducts = insSampleMapper.getInsProduct1(dto.getId(), dto.getLaboratory(), dto.getCableTag(), dto.getRepetitionTag(), "1");
+                break;
+            case 5:
+                //鍘熸潗鏂欎笅鍗�
+                insProducts = insSampleMapper.getInsProduct6(dto.getId(), dto.getLaboratory(), dto.getRawMaterialTag(), "1");
+                break;
+        }
+        return insProducts;
+    }
+
+    /**
+     * 鏂板涓嶅悎鏍煎娴嬪唴瀹�
+     * @param ids
+     * @return
+     */
+    @Override
+    public boolean addDisqualificationRetest(List<Integer> ids) {
+        // 鍒ゆ柇涔嬪墠鏄惁娣诲姞杩�
+        Long count = insUnqualifiedRetestProductMapper.selectCount(Wrappers.<InsUnqualifiedRetestProduct>lambdaQuery()
+                .in(InsUnqualifiedRetestProduct::getInsProductId, ids));
+        if (count > 0) {
+            throw new ErrorException("鏈夋楠岄」妫�娣诲姞杩囧娴嬩俊鎭�");
+        }
+
+        // 鏌ヨ涓嶅悎鏍煎唴瀹�
+        List<InsUnqualifiedRetestProduct> list = insUnqualifiedRetestProductMapper.selectRetestProduct(ids);
+        // 鏂板涓嶅悎鏍煎唴瀹�
+        insUnqualifiedRetestProductService.saveBatch(list);
+        list.forEach(insUnqualifiedRetestProduct -> {
+            insUnqualifiedRetestProduct.setRetestTag("2");
+            insUnqualifiedRetestProduct.setId(null);
+        });
+        insUnqualifiedRetestProductService.saveBatch(list);
+        return true;
+    }
+
+    @Override
+    public List<InsProduct> getInsProductUnqualifiedRetest(Integer id, Integer type, String laboratory, String cableTag, String rawMaterialTag, String retestTag) {
+
+        List<InsProduct> insProducts = new ArrayList<>();
+        switch (type) {
+            case 0:
+                //鏍峰搧
+                insProducts = insUnqualifiedRetestProductMapper.getInsProductUnqualifiedRetest1(id, laboratory, retestTag);
+                break;
+            case 4:
+                //鐢电紗閰嶇疆
+                insProducts = insUnqualifiedRetestProductMapper.getInsProductUnqualifiedRetest5(id, laboratory, cableTag, retestTag);
+                break;
+            case 5:
+                //鍘熸潗鏂欎笅鍗�
+                insProducts = insUnqualifiedRetestProductMapper.getInsProductUnqualifiedRetest6(id, laboratory, rawMaterialTag, retestTag);
+                break;
+        }
+        if (BeanUtil.isEmpty(insProducts)) {
+            return null;
+        }
+        InsOrder order = insOrderMapper.selectFirstSubmit(id);
+        getTemplateThing(order, Collections.unmodifiableList(insProducts));
+        return insProducts;
+    }
+
+
+    /**
+     * 淇濆瓨涓嶅悎鏍煎娴嬫楠屽唴瀹�
+     * @param currentTable
+     * @param orderId
+     * @param sonLaboratory
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void saveUnqualifiedContext(Map<String, Object> insContext, Integer currentTable, Integer currentSampleId, Integer orderId, String sonLaboratory) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        insContext.forEach((k, v) -> {
+            JSONObject jo = JSON.parseObject(JSON.toJSONString(v));
+            InsUnqualifiedRetestProduct insProduct = new InsUnqualifiedRetestProduct();
+            insProduct.setId(Integer.parseInt(k));
+            InsUnqualifiedRetestProduct product = insUnqualifiedRetestProductMapper.selectById(insProduct.getId());
+            if (currentTable.equals(product.getTemplateId()) && currentSampleId.equals(product.getInsSampleId())) {
+                List<InsUnqualifiedRetestResult> oldResults = insUnqualifiedRetestResultMapper.selectList(Wrappers.<InsUnqualifiedRetestResult>lambdaQuery()
+                        .eq(InsUnqualifiedRetestResult::getRetestProductId, insProduct.getId()));
+                InsUnqualifiedRetestResult newResult = new InsUnqualifiedRetestResult();
+                if (CollectionUtils.isNotEmpty(oldResults)) {
+                    BeanUtil.copyProperties(oldResults.get(0), newResult);
+                }
+                newResult.setRetestProductId(Integer.parseInt(k));
+
+                if (oldResults.size() > 1) {
+                    for (int i = 1; i < oldResults.size(); i++) {
+                        insUnqualifiedRetestResultMapper.deleteById(oldResults.get(i));
+                    }
+                }
+
+                //妫�楠屽��
+                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<>();
+                        map.put("v", JSON.parseObject(JSON.toJSONString(insValue.get("v"))).get("v"));
+                        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(JSON.parseObject(JSON.toJSONString(insValue.get("v"))).get("v").toString())) {
+                                map.put("u", userId + "");
+                            } else {
+                                map.put("u", insValue.get("u"));
+                            }
+                            iv.add(map);
+                        } catch (Exception e) {
+                        }
+                    }
+                    newResult.setInsValue(JSON.toJSONString(iv));
+                }
+                //璁$畻鍊�
+                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("v", JSON.parseObject(JSON.toJSONString(comValue.get("v"))).get("v"));
+                        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(o.equals("") ? null : (o.toString()));
+                    }
+                } 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));
+                } catch (Exception e) {
+                    insProduct.setInsResult(2);//寰呭畾
+                }
+                if (Objects.isNull(newResult.getId())) {
+                    newResult.setCreateUser(userId);
+                    newResult.setUpdateUser(userId);
+                    insUnqualifiedRetestResultMapper.insert(newResult);
+                } else {
+                    newResult.setUpdateUser(userId);
+                    newResult.setUpdateTime(LocalDateTime.now());
+                    insUnqualifiedRetestResultMapper.updateById(newResult);
+                }
+
+                insProduct.setUpdateUser(userId);
+                insUnqualifiedRetestProductMapper.updateById(insProduct);
+                insProductUserMapper.insert(new InsProductUser(null, userId, LocalDateTime.now(), insProduct.getId()));
+
+
+                InsSample insSample = insSampleMapper.selectById(insProductMapper.selectById(insProduct.getId()).getInsSampleId());
+                insSample.setInsState(1);
+                Long l = insProductMapper.selectCount(Wrappers.<InsProduct>lambdaQuery()
+                        .eq(InsProduct::getInsSampleId, insSample.getId()));
+                Long l1 = insProductMapper.selectCount(Wrappers.<InsProduct>lambdaQuery()
+                        .eq(InsProduct::getInsSampleId, insSample.getId())
+                        .and(wrapper -> wrapper
+                                .isNotNull(InsProduct::getInsResult)
+                                .or()
+                                .ne(InsProduct::getInsResult, 2)
+                        ));
+                if (Objects.equals(l, l1)) {
+                    insSample.setInsState(2);
+                }
+                insSampleMapper.updateById(insSample);
+                /*鏍¢獙涓�涓媟esult琛�*/
+                List<InsUnqualifiedRetestResult> insProductResults = insUnqualifiedRetestResultMapper.selectList(Wrappers.<InsUnqualifiedRetestResult>lambdaQuery()
+                        .eq(InsUnqualifiedRetestResult::getRetestProductId, insProduct.getId()));
+                if (insProductResults.size() > 1) {
+                    for (int i = 1; i < insProductResults.size(); i++) {
+                        insUnqualifiedRetestResultMapper.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));
+            }
+        }
+    }
+
+    /**
+     * 鏌ヨ杩涜揣鍘熷璁板綍
+     * @param insOrderId
+     * @return
+     */
+    @Override
+    public InsOrderFactoryVerify getFactoryVerify(Integer insOrderId) {
+        InsOrderFactoryVerify insOrderFactoryVerify = insOrderFactoryVerifyMapper.selectOne(Wrappers.<InsOrderFactoryVerify>lambdaQuery()
+                .eq(InsOrderFactoryVerify::getInsOrderId, insOrderId)
+                .last("limit 1"));
+        // 鍒ゆ柇鏌ヨ鏌ヨ鏄惁涓虹┖
+        if (insOrderFactoryVerify == null) {
+            insOrderFactoryVerify = new InsOrderFactoryVerify();
+            // 鏌ヨ涓嬪崟
+            InsOrder order = insOrderMapper.selectById(insOrderId);
+            // 鏌ヨ妫�楠岄」鐩〃
+            List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
+                    .eq(InsSample::getInsOrderId, insOrderId));
+
+            //鏌ヨ瑙勬牸淇″彿
+            List<String> insSamplemodel = insSamples.stream().map(insSample -> insSample.getModel()).collect(Collectors.toList());
+            String model = CollUtil.join(insSamplemodel, ",");
+
+            // 鏌ヨ鍘熸潗鏂欎俊鎭�
+            IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(order.getIfsInventoryId());
+            if (ifsInventoryQuantity == null) {
+                throw new ErrorException("缂哄皯鍘熸潗鏂欎俊鎭�");
+            }
+
+            // 妫�楠岀紪鍙�
+            insOrderFactoryVerify.setEntrustCode(order.getEntrustCode());
+            // 鏉愭枡鍘傚
+            insOrderFactoryVerify.setSupplierName(ifsInventoryQuantity.getSupplierName());
+            // 鍒拌揣鏃ユ湡
+            insOrderFactoryVerify.setDeclareDate(ifsInventoryQuantity.getDeclareDate());
+            // 鏉愭枡鍚嶇О
+            insOrderFactoryVerify.setSample(order.getSample());
+            // 瑙勬牸鍨嬪彿
+            insOrderFactoryVerify.setModel(model);
+            // 鏉愭枡鎵瑰彿
+            insOrderFactoryVerify.setUpdateBatchNo(ifsInventoryQuantity.getUpdateBatchNo());
+
+            insOrderFactoryVerify.setInsOrderId(insOrderId);
+
+            return insOrderFactoryVerify;
+        }
+
+        // 鏌ヨ楠岃瘉椤圭洰
+        List<InsOrderFactoryVerifyItem> verifyItems = insOrderFactoryVerifyItemService.list(Wrappers.<InsOrderFactoryVerifyItem>lambdaQuery()
+                .eq(InsOrderFactoryVerifyItem::getFactoryVerifyId, insOrderFactoryVerify.getFactoryVerifyId())
+                .orderByAsc(InsOrderFactoryVerifyItem::getSort));
+        insOrderFactoryVerify.setFactoryVerifyItemList(verifyItems);
+        return insOrderFactoryVerify;
+    }
+
+    /**
+     * 淇濆瓨鍘熸潗鏂欒繘璐ч獙璇�
+     * @param factoryVerify
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean addFactoryVerify(InsOrderFactoryVerify factoryVerify) {
+        if (factoryVerify.getInsOrderId() == null) {
+            throw new ErrorException("缂哄皯璁㈠崟Id");
+        }
+
+        // 鍒ゆ柇鏄柊澧炶繕鏄慨鏀�
+        if (factoryVerify.getFactoryVerifyId() == null) {
+            // 鍒ゆ柇涔嬪墠鏄惁娣诲姞杩�
+            Long count = insOrderFactoryVerifyMapper.selectCount(Wrappers.<InsOrderFactoryVerify>lambdaQuery()
+                    .eq(InsOrderFactoryVerify::getInsOrderId, factoryVerify.getInsOrderId()));
+            if (count > 0) {
+                throw new ErrorException("鍘熸潗鏂欒繘璐ч獙璇佽褰曢噸澶嶆坊鍔�");
+            }
+
+            // 鏂板
+            insOrderFactoryVerifyMapper.insert(factoryVerify);
+
+            for (InsOrderFactoryVerifyItem item : factoryVerify.getFactoryVerifyItemList()) {
+                item.setFactoryVerifyId(factoryVerify.getFactoryVerifyId());
+            }
+
+            // 鎵归噺娣诲姞
+            insOrderFactoryVerifyItemService.saveBatch(factoryVerify.getFactoryVerifyItemList());
+
+        } else {
+            // 缂栬緫
+            insOrderFactoryVerifyMapper.updateById(factoryVerify);
+
+            // 鍒犻櫎鍘熸湰楠岃瘉椤圭洰
+            insOrderFactoryVerifyItemService.remove(Wrappers.<InsOrderFactoryVerifyItem>lambdaQuery()
+                    .eq(InsOrderFactoryVerifyItem::getFactoryVerifyId, factoryVerify.getFactoryVerifyId()));
+
+            for (InsOrderFactoryVerifyItem item : factoryVerify.getFactoryVerifyItemList()) {
+                item.setFactoryVerifyId(factoryVerify.getFactoryVerifyId());
+            }
+
+            insOrderFactoryVerifyItemService.saveBatch(factoryVerify.getFactoryVerifyItemList());
+        }
+
+        return true;
+    }
+
+    /*****************************************************  灏忔姤鍛�    ***************************************************************************/
+
+    /**
+     * 灏忔姤鍛婄敓鎴�
+     * @param orderId
+     * @param insOrder
+     * @param insSamples
+     */
+    private void addSmallReport(Integer orderId, InsOrder insOrder, List<InsSample> insSamples) {
+        InsReport insReport = new InsReport();
+        AtomicReference<String> resultCh = new AtomicReference<>("");
+        insReport.setCode(insOrder.getEntrustCode());
+        insReport.setInsOrderId(orderId);
+        InsSample insSample = insSamples.get(0);
+        // 濉厖鍩虹鏁版嵁
+        EnterFactoryReport enterFactoryReport = new EnterFactoryReport();
+        enterFactoryReport.setCode(insOrder.getEntrustCode());
+        enterFactoryReport.setSample(insOrder.getSample());
+        // 鑾峰彇ifs鏁版嵁
+        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(insOrder.getIfsInventoryId());
+        enterFactoryReport.setQtyArrived(ifsInventoryQuantity.getQtyArrived() == null ? "" :
+                ifsInventoryQuantity.getQtyArrived().stripTrailingZeros().toPlainString() + ifsInventoryQuantity.getBuyUnitMeas());
+        enterFactoryReport.setQuantity(insOrder.getTestQuantity());
+        enterFactoryReport.setPartDesc(insOrder.getPartDetail());
+        enterFactoryReport.setSupplierName("**********");
+        enterFactoryReport.setLotBatchNo(ifsInventoryQuantity.getUpdateBatchNo());
+
+        // 妫�娴嬩緷鎹�
+        Set<String> standardMethod = new HashSet<>();
+        StringBuilder standardMethod2 = new StringBuilder();
+        standardMethod.add(baseMapper.getStandardMethodCode(insSample.getStandardMethodListId()));
+        for (String s : standardMethod) {
+            standardMethod2.append("銆�").append(s);
+        }
+        standardMethod2.replace(0, 1, "");
+        // todo: 妫�娴嬬被鍨�
+//        List<SysDictData> sysDictData = iSysDictTypeService.selectDictDataByName("");
+        String orderType = null;
+
+        List<RowRenderData> rows = new ArrayList<>();
+        List<TextRenderData> text = new ArrayList<>();
+        RowRenderData rowRenderData = null;
+
+        // 鏌ヨ妫�楠屽唴瀹�
+        List<SampleProductExportDto> sampleProductDto2s = insOrderMapper.selectSampleBySampleId(insSamples.stream()
+                .map(InsSample::getId).collect(Collectors.toList()));
+
+        // 鏍煎紡鍖栦慨鏀规楠岄」
+        this.formatProducts(sampleProductDto2s);
+
+        List<SampleProductExportDto> sampleList = new ArrayList<>();
+        Integer max = insSamples.stream().mapToInt(InsSample::getQuantity).sum();
+
+        // 杞垚Mpa杩涜鎺掑簭
+        Map<String, List<SampleProductExportDto>> sortedMap = sampleProductDto2s.stream()
+                .filter(sampleProductDto2 -> StringUtils.isNotBlank(sampleProductDto2.getInspectionItem()))
+                .collect(Collectors.groupingBy(SampleProductExportDto::getInspectionItem));
+        List<Map.Entry<String, List<SampleProductExportDto>>> entries = new ArrayList<>(sortedMap.entrySet());
+        entries.sort((o1, o2) -> (o1.getValue().get(0).getSort() == null ? 0 : o1.getValue().get(0).getSort())
+                - (o2.getValue().get(0).getSort() == null ? 0 : o2.getValue().get(0).getSort()));
+        // 鍒涘缓涓�涓� LinkedHashMap 鏉ヤ繚鎸佹彃鍏ラ『搴�
+        Map<String, List<SampleProductExportDto>> item = new LinkedHashMap<>();
+        for (Map.Entry<String, List<SampleProductExportDto>> entry : entries) {
+            item.put(entry.getKey(), entry.getValue());
+        }
+
+        AtomicInteger finalIndex = new AtomicInteger(1);
+        item.forEach((s, sampleProductDtoInside) -> {
+            // 娣诲姞妫�楠岄」
+            SampleProductExportDto dto2 = new SampleProductExportDto();
+            // 鍒ゆ柇鏄惁鏈夎嫳鏂囧悕绉�
+            SampleProductExportDto temp = sampleProductDtoInside.get(0);
+
+            // 鍒ゆ柇鏄惁鏈夋楠屽瓙椤�,娌℃湁灏辨妸妫�楠屽弬鏁板~鍏�
+            dto2.setIndex(Integer.toString(finalIndex.get()));
+            if (StringUtils.isBlank(temp.getInspectionItemSubclass())) {
+                // 澶勭悊闆嗗悎
+                Map<String, SampleProductExportDto> map = new LinkedHashMap<>();
+                for (SampleProductExportDto productDto2 : sampleProductDtoInside) {
+                    String productName = productDto2.getInspectionItemClass() + productDto2.getInspectionItem();
+                    if (map.containsKey(productName)) {
+                        // 濡傛灉鍚嶇О宸茬粡瀛樺湪锛屾坊鍔� lastValue 鍊煎埌 lastValueList 鍒楄〃
+                        map.get(productName)
+                                .getLastValueList()
+                                .add(productDto2.getLastValue());
+                        map.get(productName)
+                                .getInsResultList()
+                                .add(productDto2.getInsResult());
+                    } else {
+                        // 濡傛灉鍚嶇О涓嶅瓨鍦紝鐩存帴鏀惧叆 map
+                        productDto2.setLastValueList(new ArrayList<>()); // 妫�楠屽唴瀹�
+                        productDto2.getLastValueList().add(productDto2.getLastValue());
+                        productDto2.setInsResultList(new ArrayList<>()); // 缁撴灉
+                        productDto2.getInsResultList().add(productDto2.getInsResult());
+
+                        map.put(productName, productDto2);
+                    }
+                }
+                List<SampleProductExportDto> result = new ArrayList<>(map.values());
+
+                //娣诲姞妫�楠屽瓙椤�
+                SampleProductExportDto temp2 = result.get(0);
+                if (StringUtils.isNotBlank(temp2.getRadius())) {
+                    s = s + "(" + temp2.getRadius() + ")";
+                }
+                // 鍒ゆ柇鏈夋病鏈夋潯浠跺瓧娈垫湁闇�瑕佹嫾鎺ュ埌鍚嶇О鍚庨潰
+                temp2.setInspectionName(s);
+                temp2.setIndex(Integer.toString(finalIndex.get()));
+                sampleList.add(temp2);
+            } else {
+                dto2.setInspectionName(s);
+                // 濉厖鍒拌姹�
+                if (StringUtils.isNotBlank(temp.getRadius())) {
+                    dto2.setTell("(" + temp.getRadius() + ")");
+                }
+                sampleList.add(dto2);
+
+                // 澶勭悊闆嗗悎
+                Map<String, SampleProductExportDto> map = new LinkedHashMap<>();
+                for (SampleProductExportDto productDto2 : sampleProductDtoInside) {
+                    String productName = productDto2.getInspectionItemClass() + productDto2.getInspectionItem() + productDto2.getInspectionItemSubclass();
+                    if (map.containsKey(productName)) {
+                        // 濡傛灉鍚嶇О宸茬粡瀛樺湪锛屾坊鍔� lastValue 鍊煎埌 lastValueList 鍒楄〃
+                        map.get(productName)
+                                .getLastValueList()
+                                .add(productDto2.getLastValue());
+                        map.get(productName)
+                                .getInsResultList()
+                                .add(productDto2.getInsResult());
+                    } else {
+                        // 濡傛灉鍚嶇О涓嶅瓨鍦紝鐩存帴鏀惧叆 map
+                        productDto2.setLastValueList(new ArrayList<>()); // 妫�楠屽唴瀹�
+                        productDto2.getLastValueList().add(productDto2.getLastValue());
+                        productDto2.setInsResultList(new ArrayList<>()); // 缁撴灉
+                        productDto2.getInsResultList().add(productDto2.getInsResult());
+
+                        map.put(productName, productDto2);
+                    }
+                }
+                List<SampleProductExportDto> result = new ArrayList<>(map.values());
+                //娣诲姞妫�楠屽瓙椤�
+                for (SampleProductExportDto productDto2 : result) {
+                    productDto2.setInspectionName("--" + productDto2.getInspectionItemSubclass());
+                    sampleList.add(productDto2);
+                }
+            }
+            finalIndex.incrementAndGet();
+        });
+
+        // 娣诲姞灏忔姤鍛婅〃澶�
+        text = addSmallHead(text, max, rows);
+
+
+        // 涓棿妫�娴嬪�兼坊鍔�
+        for (int i = 0; i < sampleList.size(); i++) {
+            SampleProductExportDto sample = sampleList.get(i);
+
+            // 搴忓彿
+            TextRenderData middleRenderData1 = new TextRenderData();
+            middleRenderData1.setText(sample.getIndex());
+            Style middleStyle1 = new Style();
+            middleStyle1.setFontFamily("瀹嬩綋");
+            middleStyle1.setColor("000000");
+            middleRenderData1.setStyle(middleStyle1);
+            text.add(middleRenderData1);
+
+            // 妫�楠岄」鐩�
+            TextRenderData middleRenderData2 = new TextRenderData();
+            middleRenderData2.setText(sample.getInspectionName());
+            Style middleStyle2 = new Style();
+            middleStyle2.setFontFamily("瀹嬩綋");
+            middleStyle2.setColor("000000");
+            middleRenderData2.setStyle(middleStyle2);
+            text.add(middleRenderData2);
+
+            // 鍗曚綅
+            TextRenderData middleRenderData4 = new TextRenderData();
+            middleRenderData4.setText(sample.getUnit());
+            Style middleStyle4 = new Style();
+            middleStyle4.setFontFamily("瀹嬩綋");
+            middleStyle4.setColor("000000");
+            middleRenderData4.setStyle(middleStyle4);
+            text.add(middleRenderData4);
+
+            //鏍囧噯瑕佹眰
+            TextRenderData middleRenderData5 = new TextRenderData();
+            middleRenderData5.setText(sample.getTell());
+            Style middleStyle5 = new Style();
+            middleStyle5.setFontFamily("瀹嬩綋");
+            middleStyle5.setColor("000000");
+            middleRenderData5.setStyle(middleStyle5);
+            text.add(middleRenderData5);
+
+            // 妫�楠岀粨鏋�
+            boolean isMore = false;
+            if (CollectionUtils.isNotEmpty(sample.getLastValueList())
+                    && sample.getLastValueList().size() == max) {
+                // 鍒ゆ柇鏄惁鏄瑙�, 澶栬鍏ㄩ儴鍚堟牸鐨勮瘽闇�瑕佸悎骞�
+                if (sample.getInspectionItem().contains("澶栬")) {
+                    // 鍒ゅ畾缁撴灉
+                    boolean falg = false;
+                    if (CollectionUtils.isNotEmpty(sample.getLastValueList())) {
+                        // 鍒ゆ柇鏄惁鏈変竴涓敊璇�
+                        if (sample.getInsResultList().stream().anyMatch(s -> s.equals(2))) {
+                            falg = true;
+                        } else {
+                            boolean error = sample.getInsResultList().stream().anyMatch(s -> s.equals(0));
+                            if (!error) {
+                                falg = true;
+                            }
+                        }
+                    } else {
+                        if (!sample.getInsResult().equals(2)) {
+                            falg = true;
+                        }
+                    }
+                    if (falg) {
+                        for (int j = 0; j < max; j++) {
+                            TextRenderData middleRenderData6 = new TextRenderData();
+                            middleRenderData6.setText((StringUtils.isNotEmpty(sample.getLastValue()) ?
+                                    sample.getLastValue() : "")
+                                    + "鈭�" + (50 + i));
+                            Style middleStyle6 = new Style();
+                            middleStyle6.setFontFamily("瀹嬩綋");
+                            middleStyle6.setColor("000000");
+                            middleRenderData6.setStyle(middleStyle6);
+                            text.add(middleRenderData6);
+                        }
+                    } else {
+                        for (String s : sample.getLastValueList()) {
+                            TextRenderData middleRenderData6 = new TextRenderData();
+                            middleRenderData6.setText(s);
+                            Style middleStyle6 = new Style();
+                            middleStyle6.setFontFamily("瀹嬩綋");
+                            middleStyle6.setColor("000000");
+                            middleRenderData6.setStyle(middleStyle6);
+                            text.add(middleRenderData6);
+                        }
+                    }
+                } else {
+                    for (String s : sample.getLastValueList()) {
+                        TextRenderData middleRenderData6 = new TextRenderData();
+                        middleRenderData6.setText(s);
+                        Style middleStyle6 = new Style();
+                        middleStyle6.setFontFamily("瀹嬩綋");
+                        middleStyle6.setColor("000000");
+                        middleRenderData6.setStyle(middleStyle6);
+                        text.add(middleRenderData6);
+                    }
+                }
+            } else {
+                for (int j = 0; j < max; j++) {
+                    TextRenderData middleRenderData6 = new TextRenderData();
+                    middleRenderData6.setText((StringUtils.isNotEmpty(sample.getLastValue()) ?
+                            sample.getLastValue() : "")
+                            + "鈭�" + (7 + i));
+                    Style middleStyle6 = new Style();
+                    middleStyle6.setFontFamily("瀹嬩綋");
+                    middleStyle6.setColor("000000");
+                    middleRenderData6.setStyle(middleStyle6);
+                    text.add(middleRenderData6);
+                }
+            }
+
+
+            // 鍒ゅ畾缁撴灉
+            String result = "";
+            if (sample.getInsResult() != null) {
+                switch (sample.getInsResult()) {
+                    case 1:
+                        result = "鈭�";
+                        break;
+                    case 2:
+                        result = "脳";
+                        break;
+                    case 3:
+                        result = "-";
+                        break;
+                }
+            }
+            if (CollectionUtils.isNotEmpty(sample.getLastValueList())) {
+                // 鍒ゆ柇鏄惁鏈変竴涓敊璇�
+                if (sample.getInsResultList().stream().anyMatch(s -> s.equals(3))) {
+                    result = "-";
+                } else {
+                    boolean error = sample.getInsResultList().stream().anyMatch(s -> s.equals(0));
+                    if (error) {
+                        List<String> collect = new ArrayList<>();
+                        int index = 1;
+                        for (Integer count : sample.getInsResultList()) {
+                            String type;
+                            if (count.equals(0)) {
+                                // 娣诲姞涓嶅悎鏍兼弿杩�
+                                String item1 = (max == 1 ? "" : "绗�" + Integer.toString(index) + "娆�")
+                                        + sample.getInspectionItem()
+                                        + (StringUtils.isBlank(sample.getInspectionItemSubclass()) ? "" : "" + sample.getInspectionItemSubclass());
+                                if (resultCh.get().equals("")) {
+                                    resultCh.set(resultCh.get() + item1);
+                                } else {
+                                    resultCh.set(resultCh.get() + "銆�" + item1);
+                                }
+                                type = "脳";
+                            } else {
+                                type = "鈭�";
+                            }
+                            collect.add(type);
+                            index++;
+                        }
+                        result = CollUtil.join(collect, " ");
+                    } else {
+                        result = "鈭�";
+                    }
+                }
+            }
+
+            TextRenderData middleRenderData7 = new TextRenderData();
+            middleRenderData7.setText(result);
+            Style middleStyle7 = new Style();
+            middleStyle7.setFontFamily("瀹嬩綋");
+            middleStyle7.setColor("000000");
+            middleRenderData7.setStyle(middleStyle7);
+            text.add(middleRenderData7);
+
+            TextRenderData[] text2 = text.toArray(new TextRenderData[0]);
+            rowRenderData = Rows.of(text2).center().rowAtleastHeight(1).create();
+            // 0.8鍘樼背
+            double centimeters = 0.8;
+            int twips = UnitUtils.cm2Twips(centimeters);
+            rowRenderData.getRowStyle().setHeight(twips);
+            rows.add(rowRenderData);
+            text = new ArrayList<>();
+        }
+
+        TableRenderData tableRenderData = new TableRenderData();
+        tableRenderData.setRows(rows);
+
+        //璁剧疆鏍峰紡
+        TableStyle tableStyle = new TableStyle();
+        for (int i = 1; i <= max; i++) {
+            // 鏍规嵁鍑忓帇閭g粨鏋滀釜鏁颁慨鏀归暱搴�
+            switch (i) {
+                case 1:
+                    tableStyle.setColWidths(new int[]{650, 2900, 850, 2300, 2100, 1200});
+                    break;
+                case 2:
+                    tableStyle.setColWidths(new int[]{650, 2700, 850, 2200, 1200, 1200, 1200});
+                    break;
+                case 3:
+                    tableStyle.setColWidths(new int[]{650, 2700, 850, 1600, 1000, 1000, 1000, 1200});
+                    break;
+                case 4:
+                    tableStyle.setColWidths(new int[]{650, 2400, 850, 1500, 850, 850, 850, 850, 1200});
+                    break;
+                case 5:
+                    tableStyle.setColWidths(new int[]{650, 2200, 850, 1350, 750, 750, 750, 750, 750, 1200});
+                    break;
+            }
+        }
+        tableStyle.setWidth("10000");
+        tableStyle.setAlign(TableRowAlign.CENTER);
+        BorderStyle borderStyle = new BorderStyle();
+        borderStyle.setColor("000000");
+        borderStyle.setType(XWPFTable.XWPFBorderType.SINGLE);
+        borderStyle.setSize(4);
+        tableStyle.setLeftBorder(borderStyle);
+        tableStyle.setRightBorder(borderStyle);
+        tableStyle.setInsideHBorder(borderStyle); // 璁剧疆姘村钩鍐呰竟妗�
+        tableStyle.setInsideVBorder(borderStyle);
+        tableRenderData.setTableStyle(tableStyle);
+
+        if (!resultCh.get().equals("")) {
+            resultCh.set("缁忔楠岋紝" + resultCh.get() + "鎵�妫�椤圭洰涓嶅悎鏍硷紝鍏朵綑鎵�妫�椤圭洰鍧囧悎鏍笺��");
+        } else {
+            resultCh.set("缁忔楠屾鎵�" + enterFactoryReport.getSample() + "鍚勯」鐩潎绗﹀悎妫�楠岃鑼冭姹傘��");
+        }
+
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+        // 鑾峰彇褰撳墠鏃堕棿
+        LocalDate currentDate = LocalDate.now();
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        String formattedDate = currentDate.format(formatter);
+
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/small-report-template.docx");
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("report", enterFactoryReport);
+                    put("standardMethod", standardMethod2.toString().equals("null") ? "" : standardMethod2);
+                    put("orderType", orderType);
+                    put("table", tableRenderData);
+                    put("resultCh", resultCh);
+                    put("writeUrl", null);
+                    put("examineUrl", null);
+                    put("ratifyUrl", null);
+                    put("writeDateUrl", null);
+                    put("examineDateUrl", null);
+                    put("ratifyDateUrl", null);
+                    put("seal1", null);
+                }});
+        try {
+            String name = insReport.getCode().replace("/", "") + "-J.docx";
+            template.writeAndClose(Files.newOutputStream(Paths.get(wordUrl + "/" + name)));
+            insReport.setUrl("/word/" + name);
+            insReport.setIsPass(0);
+            insReport.setWriteUserId(SecurityUtils.getUserId().intValue());//鎻愪氦浜�
+            insReport.setWriteTime(LocalDateTime.now());//鎻愪氦鏃堕棿
+            // 鏌ヨ鎶ュ憡, 鍒ゆ柇涔嬪墠鏄惁娣诲姞杩�, 娣诲姞杩囧垹闄�
+            insReportMapper.delete(Wrappers.<InsReport>lambdaQuery()
+                    .eq(InsReport::getInsOrderId, insOrder.getId()));
+            insReportMapper.insert(insReport);
+
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        // 淇敼鎹㈣鍜屽悎骞堕棶棰�
+        updaeMerge(insReport, null, true);
+    }
+
+    /**
+     * 娣诲姞灏忓疂琛ㄥご
+     * @param text
+     * @param max
+     * @param rows
+     * @return
+     */
+    private static List<TextRenderData> addSmallHead(List<TextRenderData> text, Integer max, List<RowRenderData> rows) {
+        RowRenderData rowRenderData;
+//        // 澶�
+        TextRenderData headRenderData1 = new TextRenderData();
+        headRenderData1.setText("搴忓彿");
+        Style headStyle1 = new Style();
+        headStyle1.setFontFamily("瀹嬩綋");
+        headStyle1.setColor("000000");
+        headRenderData1.setStyle(headStyle1);
+        text.add(headRenderData1);
+
+        TextRenderData headRenderData2 = new TextRenderData();
+        headRenderData2.setText("妫�楠岄」鐩�");
+        Style headStyle2 = new Style();
+        headStyle2.setFontFamily("瀹嬩綋");
+        headStyle2.setColor("000000");
+        headRenderData2.setStyle(headStyle2);
+        text.add(headRenderData2);
+
+        TextRenderData headRenderData4 = new TextRenderData();
+        headRenderData4.setText("鍗曚綅");
+        Style headStyle4 = new Style();
+        headStyle4.setFontFamily("瀹嬩綋");
+        headStyle4.setColor("000000");
+        headRenderData4.setStyle(headStyle4);
+        text.add(headRenderData4);
+
+        TextRenderData headRenderData5 = new TextRenderData();
+        headRenderData5.setText("鏍囧噯瑕佹眰");
+        Style headStyle5 = new Style();
+        headStyle5.setFontFamily("瀹嬩綋");
+        headStyle5.setColor("000000");
+        headRenderData5.setStyle(headStyle5);
+        text.add(headRenderData5);
+
+        for (int i = 0; i < max; i++) {
+            TextRenderData headRenderData6 = new TextRenderData();
+            headRenderData6.setText("妫�楠岀粨鏋溾垜6");
+            Style headStyle6 = new Style();
+            headStyle6.setFontFamily("瀹嬩綋");
+            headStyle6.setColor("000000");
+            headRenderData6.setStyle(headStyle6);
+            text.add(headRenderData6);
+        }
+        TextRenderData headRenderData7 = new TextRenderData();
+        headRenderData7.setText("鍗曢」鍒ゆ柇");
+        Style headStyle7 = new Style();
+        headStyle7.setFontFamily("瀹嬩綋");
+        headStyle7.setColor("000000");
+        headRenderData7.setStyle(headStyle7);
+        text.add(headRenderData7);
+
+        TextRenderData[] text3 = text.toArray(new TextRenderData[0]);
+        rowRenderData = Rows.of(text3).center().rowAtleastHeight(1).create();
+        rows.add(rowRenderData);
+        text = new ArrayList<>();
+
+        // 绗簩琛�(鍙兘娌℃湁)
+        if (max > 1) {
+            TextRenderData tagRenderData1 = new TextRenderData();
+            tagRenderData1.setText("");
+            Style tagStyle1 = new Style();
+            tagStyle1.setFontFamily("瀹嬩綋");
+            tagStyle1.setColor("000000");
+            tagRenderData1.setStyle(tagStyle1);
+            text.add(tagRenderData1);
+
+            TextRenderData tagRenderData2 = new TextRenderData();
+            tagRenderData2.setText("鏍囪瘑");
+            Style tagStyle2 = new Style();
+            tagStyle2.setFontFamily("瀹嬩綋");
+            tagStyle2.setColor("000000");
+            tagRenderData2.setStyle(tagStyle2);
+            text.add(tagRenderData2);
+
+            TextRenderData tagRenderData4 = new TextRenderData();
+            tagRenderData4.setText("");
+            Style tagStyle4 = new Style();
+            tagStyle4.setFontFamily("瀹嬩綋");
+            tagStyle4.setColor("000000");
+            tagRenderData4.setStyle(tagStyle4);
+            text.add(tagRenderData4);
+
+            TextRenderData tagRenderData5 = new TextRenderData();
+            tagRenderData5.setText("");
+            Style tagStyle5 = new Style();
+            tagStyle5.setFontFamily("瀹嬩綋");
+            tagStyle5.setColor("000000");
+            tagRenderData5.setStyle(tagStyle5);
+            text.add(tagRenderData5);
+
+            for (int i = 0; i < max; i++) {
+                TextRenderData tagRenderData6 = new TextRenderData();
+                tagRenderData6.setText("鏍囪瘑" + (i + 1));
+                Style tagStyle6 = new Style();
+                tagStyle6.setFontFamily("瀹嬩綋");
+                tagStyle6.setColor("000000");
+                tagRenderData6.setStyle(tagStyle6);
+                text.add(tagRenderData6);
+            }
+            TextRenderData tagRenderData7 = new TextRenderData();
+            tagRenderData7.setText("");
+            Style tagStyle7 = new Style();
+            tagStyle7.setFontFamily("瀹嬩綋");
+            tagStyle7.setColor("000000");
+            tagRenderData7.setStyle(tagStyle7);
+            text.add(tagRenderData7);
+
+            TextRenderData[] text4 = text.toArray(new TextRenderData[0]);
+            rowRenderData = Rows.of(text4).center().rowAtleastHeight(1).create();
+            rows.add(rowRenderData);
+            text = new ArrayList<>();
+
+
+        }
+
+        return text;
+    }
+
+    /*****************************************************  澶ф姤鍛�   ***************************************************************************/
+
+    /**
+     * 鍒涘缓澶ф姤鍛�
+     * @param orderId
+     * @param insOrder
+     * @param
+     */
+    private void addBitReport(Integer orderId, InsOrder insOrder) {
+        Map<String, String> user = insProductMapper.selectUserById(insOrder.getUserId());
+        //samples鏄笉鍖呮嫭甯︽湁"/"鐨勬牱鍝�
+        List<SampleProductDto> samples = insSampleMapper.selectSampleProductListByOrderId(orderId);
+        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<>();
+        // 鏌ヨ妫�楠岄」鏁伴噺
+        AtomicInteger productSize = new AtomicInteger();
+        String[] monthNames = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
+        List<String> resultChList = new ArrayList<>();
+        List<String> resultEnList = new ArrayList<>();
+        // 鍒ゆ柇鏄惁鏄彧鏈変竴涓牱鍝�
+        boolean isOneSample = samples.size() == 1 ? true : false;
+        /*鍩虹鎶ュ憡(鏍规嵁缁樺埗鐨勫師濮嬭褰曟ā鐗堝舰鎴�)*/
+        samples.forEach(a -> {
+            Map<Integer, String> map2 = new HashMap<>();
+            models.add(a.getModel());
+            String standardMethodCode = baseMapper.getStandardMethodCode(a.getStandardMethodListId());
+            if (StrUtil.isNotBlank(a.getSpecialStandardMethod())) {
+                standardMethodCode = standardMethodCode + "+" + a.getSpecialStandardMethod();
+            }
+            standardMethod.add(standardMethodCode);
+            for (InsProduct b : a.getInsProduct()) {
+                if (b.getInsProductResult() != null) {
+                    List<JSONObject> jsonObjects = JSON.parseArray(b.getInsProductResult().getEquipValue(), JSONObject.class);
+                    for (JSONObject jsonObject : jsonObjects) {
+                        if (!"".equals(jsonObject.get("v") + "")) {
+                            List<String> v = StrUtil.split(jsonObject.get("v") + "", "锛�");
+                            deviceSet.addAll(v);
+                        }
+                    }
+                }
+            }
+            // 鏀舵牱鏃ユ湡
+            List<RowRenderData> rows = new ArrayList<>();
+            List<TextRenderData> text = new ArrayList<>();
+            RowRenderData rowRenderData = null;
+
+            InsSample insSamples = null;
+            int max = 1;
+            List<String> cableTags = new ArrayList<>();
+            // 鍒ゆ柇鏄惁涓哄師鏉愭枡
+            if (insOrder.getTypeSource() != null && insOrder.getTypeSource().equals(1)) {
+
+                InsOrder one = insOrderService.getOne(Wrappers.<InsOrder>lambdaQuery()
+                        .eq(InsOrder::getIfsInventoryId, insOrder.getIfsInventoryId())
+                        .eq(InsOrder::getOrderType, InsOrderTypeConstants.ENTER_THE_FACTORY)
+                        .ne(InsOrder::getState, -1)
+                        .last("limit 1"));
+                // 鍒ゆ柇涔嬪墠鏄惁鏈夎繘鍘傛楠�
+                if (one != null) {
+                    insSamples = insSampleMapper.selectOne(Wrappers.<InsSample>lambdaQuery()
+                            .eq(InsSample::getInsOrderId, one.getId())
+                            .last("limit 1"));
+                }
+
+                max = a.getQuantity();
+                // 瀛e害妫�楠岄渶瑕佽繘鍘傛楠岀殑璁惧
+                // 鏌ヨ鏄惁鏈夎繘鍘傛楠�
+                InsOrder order = insOrderMapper.selectOne(Wrappers.<InsOrder>lambdaQuery()
+                        .eq(InsOrder::getIfsInventoryId, insOrder.getIfsInventoryId())
+                        .ne(InsOrder::getState, -1)
+                        .eq(InsOrder::getOrderType, InsOrderTypeConstants.ENTER_THE_FACTORY)
+                        .ne(InsOrder::getId, insOrder.getId())
+                        .last("limit 1"));
+                if (order != null) {
+                    List<SampleProductDto> sampleProductDtos = insSampleMapper.selectSampleProductListByOrderId(order.getId());
+                    for (InsProduct b : sampleProductDtos.get(0).getInsProduct()) {
+                        if (b.getInsProductResult() != null) {
+                            List<JSONObject> jsonObjects = JSON.parseArray(b.getInsProductResult().getEquipValue(), JSONObject.class);
+                            for (JSONObject jsonObject : jsonObjects) {
+                                if (!"".equals(jsonObject.get("v") + "")) {
+                                    List<String> v = StrUtil.split(jsonObject.get("v") + "", "锛�");
+                                    deviceSet.addAll(v);
+                                }
+                            }
+                        }
+                    }
+                }
+                insOrder.setSampleView(insOrder.getSample());
+                String sampleViewEn = insSampleMapper.getSampleEn(insOrder.getSample());
+                if (StringUtils.isBlank(sampleViewEn)) {
+                    sampleViewEn = insSampleMapper.getSampleEnByObject(insOrder.getSample());
+                }
+                insOrder.setSampleViewEn(sampleViewEn);
+            } else {
+                // 鑾峰緱鎵归噺妫�楠岀殑鎬绘暟
+                max = insOrderMapper.selectSampleMax(a.getId());
+                cableTags = insOrderMapper.selectSampleCableTag(a.getId());
+            }
+
+            // 琛ㄥご娣诲姞
+            addHead(a, text, rowRenderData, rows, max, cableTags);
+            text = new ArrayList<>();
+
+            // 娣诲姞妫�娴嬪��
+            productSize.set(addTestValue(a, text, rowRenderData, rows, max, resultChList, resultEnList, insSamples, cableTags, isOneSample));
+            text = new ArrayList<>();
+
+            // 缁撳熬娣诲姞
+            addEnding(text, rowRenderData, rows, max);
+            text = new ArrayList<>();
+
+            List<TableRenderData> tables1 = new ArrayList<>();
+            TableRenderData tableRenderData = new TableRenderData();
+            tableRenderData.setRows(new ArrayList<>());
+            double totalHeight = 0.0; // 鐢ㄤ簬璺熻釜褰撳墠琛ㄦ牸鐨勬�昏楂�
+            double heightThreshold = 9300.0; // 闃堝�硷紝
+            List<RowRenderData> firstTwoRows = new ArrayList<>(); // 淇濆瓨鍓嶄袱琛屼互渚垮鍒跺埌鏂拌〃鏍�
+            List<RowRenderData> endTwoRows = new ArrayList<>(); // 淇濆瓨鏈�鍚庝竴琛屼互渚垮鍒跺埌鏂拌〃鏍�
+            // 淇濆瓨鍓嶄袱琛屼互渚垮鍒跺埌鏂拌〃鏍�
+            firstTwoRows.add(rows.get(0));
+            firstTwoRows.add(rows.get(1));
+            // 淇濆瓨鏈�鍚庝竴琛�
+            endTwoRows.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, max);
+                }
+                totalHeight += rowHeight; // 鏇存柊鎬昏楂�
+                if (totalHeight >= heightThreshold) {
+                    // 鍒涘缓鏂拌〃鏍煎苟澶嶅埗鍓嶄袱琛�
+                    TableRenderData newTableRenderData = new TableRenderData();
+                    newTableRenderData.setRows(new ArrayList<>(firstTwoRows));
+                    //璁剧疆鏍峰紡
+                    TableStyle tableStyle = new TableStyle();
+                    for (int i = 1; i <= max; i++) {
+                        // 鏍规嵁鍑忓帇閭g粨鏋滀釜鏁颁慨鏀归暱搴�
+                        switch (i) {
+                            case 1:
+                                tableStyle.setColWidths(new int[]{650, 2000, 2000, 850, 2200, 2100, 1200});
+                                break;
+                            case 2:
+                                tableStyle.setColWidths(new int[]{650, 1400, 1400, 850, 2100, 1200, 1200, 1200});
+                                break;
+                            case 3:
+                                tableStyle.setColWidths(new int[]{650, 1400, 1400, 850, 1500, 1000, 1000, 1000, 1200});
+                                break;
+                            case 4:
+                                tableStyle.setColWidths(new int[]{650, 1200, 1200, 850, 1400, 850, 850, 850, 850, 1200});
+                                break;
+                            case 5:
+                                tableStyle.setColWidths(new int[]{650, 1100, 1100, 850, 1350, 750, 750, 750, 750, 750, 1200});
+                                break;
+                        }
+                    }
+                    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 = rowHeight;
+                }
+                tableRenderData.getRows().add(row);
+            }
+            if (!tableRenderData.getRows().isEmpty() && tableRenderData.getRows().size() != 3) {
+                //璁剧疆鏍峰紡
+                TableStyle tableStyle = new TableStyle();
+                for (int i = 1; i <= max; i++) {
+                    // 鏍规嵁鍑忓帇閭g粨鏋滀釜鏁颁慨鏀归暱搴�
+                    switch (i) {
+                        case 1:
+                            tableStyle.setColWidths(new int[]{650, 2000, 2000, 850, 2200, 2100, 1200});
+                            break;
+                        case 2:
+                            tableStyle.setColWidths(new int[]{650, 1400, 1400, 850, 2100, 1200, 1200, 1200});
+                            break;
+                        case 3:
+                            tableStyle.setColWidths(new int[]{650, 1400, 1400, 850, 1500, 1000, 1000, 1000, 1200});
+                            break;
+                        case 4:
+                            tableStyle.setColWidths(new int[]{650, 1200, 1200, 850, 1400, 850, 850, 850, 850, 1200});
+                            break;
+                        case 5:
+                            tableStyle.setColWidths(new int[]{650, 1100, 1100, 850, 1350, 750, 750, 750, 750, 750, 1200});
+                            break;
+                    }
+                }
+                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);
+            });
+
+        });
+
+        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<Map<String, String>> deviceList = null;
+        if (deviceSet.size() != 0) {
+            deviceList = insOrderMapper.selectDeviceList(deviceSet);
+        }
+        Map<String, String> codeStr = new HashMap<>();
+        codeStr.put("鎶ュ憡缂栧彿", insReport.getCode());
+        codeStr.put("鏍峰搧鍚嶇О", insOrder.getSample());
+        codeStr.put("瑙勬牸鍨嬪彿", samples.get(0).getModel());
+        codeStr.put("鍙戞斁鏃ユ湡", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+
+        String modelStr = CollUtil.join(models, "\n");
+        String finalModelStr = modelStr;
+
+        // todo: 鏌ヨ瀛楀吀
+        String orderType = null;
+        String formType = null;
+
+        // 鏍峰搧鐘舵��
+        String sampleStatus = null;
+
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+        List<Map<String, String>> finalDeviceList = deviceList;
+        Integer userId = insSampleUserMapper.selectOne(Wrappers.<InsSampleUser>lambdaQuery().eq(InsSampleUser::getInsSampleId, orderId).last("limit 1")).getUserId();
+        Custom custom = customMapper.selectById(insOrder.getCompanyId());
+
+        // 鏌ヨ鍒ゆ柇鏄惁鏈変笉鍒ゅ畾椤圭洰,鍜屽叏閮芥槸鍒ゅ畾椤�
+        int judgeType = insProductMapper.selectNoJudge(insOrder.getId());
+        String resultCh = "";
+        String resultEn = "";
+        for (String reference : resultChList) {
+            resultCh = resultCh + reference;
+        }
+        for (String reference : resultEnList) {
+            resultEn = resultEn + reference;
+        }
+        switch (judgeType) {
+            // 娌℃湁涓嶅垽瀹氶」鐩�
+            case 1:
+                if (StringUtils.isNotBlank(resultCh)) {
+                    resultCh = "渚濇嵁濮旀墭瑕佹眰锛�" + resultCh + "鎵�妫�椤圭洰涓嶅悎鏍硷紝鍏朵綑鎵�妫�椤圭洰鍧囧悎鏍笺��";
+                    resultEn = "According to commissioned requirements," + resultEn + " these inspected items do not meet the requirements, all other inspected items meet the requirements.";
+                } else {
+                    resultCh = "渚濇嵁濮旀墭瑕佹眰锛屾墍妫�椤圭洰鍧囩鍚堣姹傘��";
+                    resultEn = "According to commissioned requirements, all the tested items meet the requirements.";
+                }
+                break;
+            // 瀛樺湪涓嶅垽瀹氶」鐩�
+            case 2:
+                if (StringUtils.isNotBlank(resultCh)) {
+                    resultCh = "渚濇嵁濮旀墭瑕佹眰锛�" + resultCh + "鎵�妫�椤圭洰涓嶅悎鏍硷紝鍏朵綑鎵�妫�椤圭洰闄や笉鍒ゅ畾澶栧潎绗﹀悎瑕佹眰銆�";
+                    resultEn = "According to commissioned requirements," + resultEn + " these inspected items do not meet the requirements, all the inspected items meet the requirements except that they are not judged.";
+                } else {
+                    resultCh = "渚濇嵁濮旀墭瑕佹眰锛屾墍妫�椤圭洰闄や笉鍒ゅ畾澶栧潎绗﹀悎瑕佹眰銆�";
+                    resultEn = "According to commissioned requirements, all the tested items meet the requirements.";
+                }
+                break;
+            // 閮芥槸涓嶅垽瀹氶」鐩�
+            case 3:
+                resultCh = "渚濇嵁濮旀墭瑕佹眰锛屾墍妫�椤圭洰鍧囦笉鍒ゅ畾銆�";
+                resultEn = "According to commissioned requirements, the items examined are not judged.";
+                break;
+        }
+
+        /*鑾峰彇闄勪欢鍥剧墖绫诲瀷*/
+        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("/");
+        }
+
+        // 鎶芥牱鏃ユ湡
+        // 鎴愬搧鏄娊鏍锋椂闂�
+        LocalDateTime sendTime = insOrder.getSendTime();
+        if (insOrder.getTypeSource() != null && insOrder.getTypeSource().equals(1)) {
+            // 鍘熸潗鏂欐敹鏍锋棩鏈熸槸鎶ユ鏃ユ湡
+            IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(insOrder.getIfsInventoryId());
+            sendTime = ifsInventoryQuantity.getDeclareDate();
+        }
+
+        // 妫�楠屾椂闂�  鎶芥牱鏃堕棿-鎻愪氦鏃堕棿
+        LocalDateTime now = LocalDateTime.now();
+        // 鎻愪氦鏃堕棿
+        LocalDateTime submitTime = LocalDateTime.now();
+        // 鍒ゆ柇鏄惁鏈夋彁浜ゆ椂闂�
+        if (insOrder.getFirstSubmitDate() != null) {
+            submitTime = insOrder.getFirstSubmitDate();
+        }
+
+        String insTime = insOrder.getSendTime().format(DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�")) + "-"
+                + submitTime.format(DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�"));
+
+        String insTimeEn = monthNames[insOrder.getSendTime().getMonthValue() - 1] + " " + insOrder.getSendTime().format(DateTimeFormatter.ofPattern("dd, yyyy")) + "-"
+                + monthNames[submitTime.getMonthValue() - 1] + " " + submitTime.format(DateTimeFormatter.ofPattern("dd, yyyy"));
+
+        //妫�楠岄」鐩殑鐜
+        String environment = "";
+        environment = (ObjectUtils.isNotEmpty(insOrder.getTemperature()) ? insOrder.getTemperature() + "鈩� " : "") + (ObjectUtils.isNotEmpty(insOrder.getHumidity()) ? insOrder.getHumidity() + "%" : "");
+        String finalEnvironment = environment;
+        LocalDateTime finalSendTime = sendTime;
+
+        String finalResultCh = resultCh;
+        String finalResultEn = resultEn;
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/report-template.docx");
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("order", insOrder);
+                    put("report", insReport);
+                    put("environment", finalEnvironment);
+                    put("custom", custom);
+                    put("sampleSize", insOrder.getTestQuantity());
+                    put("tables", tables);
+                    put("tableSize", tables.size() + 1);
+                    put("standardMethod", (standardMethod2.toString().equals("null") ? "" : standardMethod2));
+                    put("deviceList", finalDeviceList);
+                    put("twoCode", null);
+                    put("models", finalModelStr);
+                    put("productSize", productSize.get());
+                    put("createTime", now.format(DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�")));
+                    put("createTimeEn", monthNames[now.getMonthValue() - 1] + " " + now.format(DateTimeFormatter.ofPattern("dd, yyyy")));
+                    put("insTime", insTime);
+                    put("insTimeEn", insTimeEn);
+                    put("writeUrl", null);
+                    put("insUrl", null);
+                    put("images", images);
+                    put("examineUrl", null);
+                    put("ratifyUrl", null);
+                    put("orderType", orderType);
+                    put("getTime", finalSendTime.format(DateTimeFormatter.ofPattern("yyyy骞碝M鏈坉d鏃�")));
+                    put("getTimeEn", monthNames[finalSendTime.getMonthValue() - 1] + " " + finalSendTime.format(DateTimeFormatter.ofPattern("dd, yyyy")));
+                    put("seal1", null);
+                    put("seal2", null);
+                    put("formTypeCh", formType);
+                    put("formTypeEn", insOrder.getFormType());
+                    put("resultCh", finalResultCh);
+                    put("resultEn", finalResultEn);
+                    put("sampleStatus", sampleStatus);
+                }});
+        try {
+            String name = insReport.getCode().replace("/", "") + ".docx";
+            template.writeAndClose(Files.newOutputStream(Paths.get(wordUrl + "/" + name)));
+            insReport.setUrl("/word/" + name);
+            insReport.setWriteUserId(SecurityUtils.getUserId().intValue());//鎻愪氦浜�
+            insReport.setWriteTime(LocalDateTime.now());//鎻愪氦鏃堕棿
+            // 鏌ヨ鎶ュ憡, 鍒ゆ柇涔嬪墠鏄惁娣诲姞杩�, 娣诲姞杩囧垹闄�
+            insReportMapper.delete(Wrappers.<InsReport>lambdaQuery()
+                    .eq(InsReport::getInsOrderId, insOrder.getId()));
+            insReportMapper.insert(insReport);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        // 淇敼鎹㈣鍜屽悎骞堕棶棰�
+        updaeMerge(insReport, deviceList, false);
+    }
+
+    /**
+     * 璋冩暣楂樺害
+     * @param row
+     * @param rowHeight
+     * @return
+     */
+    private static double adjustRowHeight(RowRenderData row, double rowHeight, int max) {
+        // 鏍规嵁妫�楠岄」鐩悕绉拌繘琛岄珮搴﹁皟鏁�
+        TextRenderData renderData = (TextRenderData) row.getCells().get(1).getParagraphs().get(0).getContents().get(0);
+        String dataText = renderData.getText();
+        TextRenderData valueData = (TextRenderData) row.getCells().get(5).getParagraphs().get(0).getContents().get(0);
+        String valueText = valueData.getText();
+        // 鑾峰彇妫�娴嬪唴瀹瑰垽鏂槸鍚﹁秴鍑�
+        if (StringUtils.isNotBlank(dataText) && dataText.contains("@")) {
+            double number = 1;
+            double chinaLength = 0;
+            double englishLength = 0;
+            double valueLength = 0;
+            // 鏍规嵁绾胯姱涓暟鍒ゆ柇璺濈
+            switch (max) {
+                case 1:
+                    chinaLength = 15;
+                    englishLength = 30;
+                    valueLength = 8;
+                    break;
+                case 2:
+                    chinaLength = 13;
+                    englishLength = 25;
+                    valueLength = 6;
+                    break;
+                case 3:
+                    chinaLength = 13;
+                    englishLength = 25;
+                    valueLength = 4;
+                    break;
+                case 4:
+                    chinaLength = 13;
+                    englishLength = 23;
+                    valueLength = 3;
+                    break;
+                case 5:
+                    chinaLength = 12;
+                    englishLength = 22;
+                    valueLength = 2;
+                    break;
+            }
+            // 鏍规嵁@绗﹀彿鎴彇涓嫳鏂�
+            String[] split = dataText.split("@");
+            // 鏂囧瓧鍊嶆暟
+            double chinaMultiple = (Math.ceil(split[0].length() / chinaLength)) - 1;
+
+            // 鑻辨枃鍊嶆暟
+            double 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;
+    }
+
+    /**
+     * 鍚堝苟鍗曞厓鏍�
+     * @param insReport
+     * @param deviceList
+     */
+    private void updaeMerge(InsReport insReport, List<Map<String, String>> deviceList, boolean isSmall) {
+        // 澶勭悊鍚堝苟鍗曞厓鏍肩殑闂
+        String path = wordUrl + insReport.getUrl().replaceFirst("/word", "");
+        try {
+            // 鑾峰彇鏂囨。涓殑鎵�鏈夎〃鏍�
+            FileInputStream stream = new FileInputStream(path);
+            XWPFDocument document = new XWPFDocument(stream);
+            List<XWPFTable> xwpfTables = document.getTables();
+            // 閬嶅巻琛ㄦ牸锛屼絾璺宠繃绗竴涓〃鏍硷紙濡傛灉deviceList涓簄ull锛屽垯棰濆璺宠繃绗簩涓級
+            for (int i = 1; i < xwpfTables.size() - (deviceList == null ? 1 : 2); i++) {
+                // 鍒涘缓涓�涓狧ashSet鏉ュ瓨鍌ㄥ敮涓�鐨勫瓧绗︿覆锛堣繖閲屽熀浜�"鈭�"鍒嗗壊鍚庣殑绗簩閮ㄥ垎锛�
+                Set<String> set1 = new HashSet<>();
+                // 鍒涘缓涓�涓狧ashMap鏉ュ瓨鍌ㄦ瘡涓敮涓�瀛楃涓插強鍏跺搴旂殑鍗曞厓鏍间綅缃俊鎭�
+                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("鈭�");
+                            // 濡傛灉鍒嗗壊鍚庣殑绗簩閮ㄥ垎鏄柊鐨勶紙鍗充箣鍓嶆湭鍑虹幇杩囷級锛屽垯娣诲姞鍒皊et1骞跺垱寤轰綅缃俊鎭痬ap
+                            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);
+                                }
+                            }
+                            // 鍒ゆ柇灏忛珮鎶ュ憡杩樻槸澶ф姤鍛�
+                            if (isSmall) {
+                                // 鑾峰彇鍗曞厓鏍�
+                                XWPFTableCell cell = xwpfTables.get(i).getRows().get(j).getTableCells().get(k);
+                                XWPFParagraph paragraph = cell.getParagraphArray(0);
+                                String originalText = paragraph.getText();
+                                String newText = originalText.split("鈭�")[0];
+                                List<XWPFRun> runs = paragraph.getRuns();
+                                for (XWPFRun run : runs) {
+                                    run.setText("", 0); // 娓呯┖ run 涓殑鏂囨湰
+                                }
+                                if (!runs.isEmpty()) {
+                                    XWPFRun run = runs.get(0);
+                                    run.setText(newText);
+
+                                    // 澶嶅埗鏍峰紡
+                                    run.setFontFamily(paragraph.getRuns().get(0).getFontFamily());
+                                    run.setFontSize(paragraph.getRuns().get(0).getFontSize());
+                                    run.setBold(paragraph.getRuns().get(0).isBold());
+                                    run.setItalic(paragraph.getRuns().get(0).isItalic());
+                                    run.setUnderline(paragraph.getRuns().get(0).getUnderline());
+                                    run.setColor(paragraph.getRuns().get(0).getColor());
+                                }
+
+                                cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
+                                paragraph.setAlignment(ParagraphAlignment.CENTER);
+                            } else {
+                                // 绉婚櫎鍖呭惈"鈭�"鐨勬钀斤紝骞堕噸鏂拌缃崟鍏冩牸鏂囨湰鍜屾牱寮�
+                                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());
+                }
+
+                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("@")) {
+                            if (isSmall) {
+                                // 鑾峰彇鍘熸湁娈佃惤鐨勭涓�涓� XWPFRun
+                                String text = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getText();
+                                XWPFParagraph oldParagraph = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).getParagraphs().get(0);
+                                XWPFRun oldRun = oldParagraph.getRuns().get(0);
+                                // 淇濆瓨鍘熸湁鏍峰紡
+                                String fontFamily = oldRun.getFontFamily();
+                                int fontSize = oldRun.getFontSize();
+                                boolean isBold = oldRun.isBold();
+                                boolean isItalic = oldRun.isItalic();
+                                boolean isUnderline = oldRun.getUnderline() != UnderlinePatterns.NONE;
+                                // 鍒犻櫎鍘熸湁娈佃惤
+                                xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).removeParagraph(0);
+                                // 娣诲姞鏂版钀�
+                                XWPFParagraph newParagraph = xwpfTables1.get(i).getRows().get(j).getTableCells().get(k).addParagraph();
+                                XWPFRun newRun = newParagraph.createRun();
+                                // 搴旂敤淇濆瓨鐨勬牱寮�
+                                newRun.setFontFamily(fontFamily);
+                                newRun.setFontSize(fontSize);
+                                newRun.setBold(isBold);
+                                newRun.setItalic(isItalic);
+                                if (isUnderline) {
+                                    newRun.setUnderline(UnderlinePatterns.SINGLE);
+                                }
+                                // 璁剧疆鏂版枃鏈�
+                                String[] split = text.split("@");
+                                newRun.setText(split[0]);
+                                if (split.length > 1) {
+                                    newRun.addBreak();
+                                    newRun.setText(split[1]);
+                                }
+                                // 璁剧疆娈佃惤瀵归綈鏂瑰紡
+                                newParagraph.setAlignment(ParagraphAlignment.CENTER);
+                            } else {
+                                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[0]);
+                                if (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);
+        }
+    }
+
+
+    /**
+     * 娣诲姞鎶ュ憡琛ㄥご
+     * @param sample
+     * @param text
+     * @param rowRenderData
+     * @param rows
+     * @param max
+     * @param cableTags 绾胯姱棰滆壊
+     */
+    private static void addHead(SampleProductDto sample, List<TextRenderData> text, RowRenderData rowRenderData, List<RowRenderData> rows, int max, List<String> cableTags) {
+        // 绗竴琛�
+        TextRenderData firstRenderData1 = new TextRenderData();
+        firstRenderData1.setText("鏍峰搧缂栧彿@Sample No.鈭�1");
+        Style firstStyle1 = new Style();
+        firstStyle1.setFontFamily("瀹嬩綋");
+        firstStyle1.setColor("000000");
+        firstRenderData1.setStyle(firstStyle1);
+        text.add(firstRenderData1);
+
+        TextRenderData firstRenderData2 = new TextRenderData();
+        firstRenderData2.setText("鏍峰搧缂栧彿@Sample No.鈭�1");
+        Style firstStyle2 = new Style();
+        firstStyle2.setFontFamily("瀹嬩綋");
+        firstStyle2.setColor("000000");
+        firstRenderData2.setStyle(firstStyle2);
+        text.add(firstRenderData2);
+
+        TextRenderData firstRenderData3 = new TextRenderData();
+        firstRenderData3.setText(sample.getSampleCode() + "鈭�2");
+        Style firstStyle3 = new Style();
+        firstStyle3.setFontFamily("瀹嬩綋");
+        firstStyle3.setColor("000000");
+        firstRenderData3.setStyle(firstStyle3);
+        text.add(firstRenderData3);
+
+        TextRenderData firstRenderData4 = new TextRenderData();
+        firstRenderData4.setText(sample.getSampleCode() + "鈭�2");
+        Style firstStyle4 = new Style();
+        firstStyle4.setFontFamily("瀹嬩綋");
+        firstStyle4.setColor("000000");
+        firstRenderData4.setStyle(firstStyle4);
+        text.add(firstRenderData4);
+
+
+        // 鍒ゆ柇寰幆鏉′欢
+
+        if (max <= 2) {
+            for (int i = 0; i < max; i++) {
+                TextRenderData firstRenderData5 = new TextRenderData();
+                firstRenderData5.setText("瑙勬牸鍨嬪彿@Type鈭�3");
+                Style firstStyle5 = new Style();
+                firstStyle5.setFontFamily("瀹嬩綋");
+                firstStyle5.setColor("000000");
+                firstRenderData4.setStyle(firstStyle5);
+                text.add(firstRenderData5);
+            }
+            for (int i = 0; i < 2; i++) {
+                TextRenderData firstRenderData6 = new TextRenderData();
+                firstRenderData6.setText(sample.getModel() + "鈭�4");
+                Style firstStyle6 = new Style();
+                firstStyle6.setFontFamily("瀹嬩綋");
+                firstStyle6.setColor("000000");
+                firstRenderData6.setStyle(firstStyle6);
+                text.add(firstRenderData6);
+            }
+        } else {
+            for (int i = 0; i < 2; i++) {
+                TextRenderData firstRenderData5 = new TextRenderData();
+                firstRenderData5.setText("瑙勬牸鍨嬪彿@Type鈭�3");
+                Style firstStyle5 = new Style();
+                firstStyle5.setFontFamily("瀹嬩綋");
+                firstStyle5.setColor("000000");
+                firstRenderData4.setStyle(firstStyle5);
+                text.add(firstRenderData5);
+            }
+            for (int i = 0; i < max; i++) {
+                TextRenderData firstRenderData6 = new TextRenderData();
+                firstRenderData6.setText(sample.getModel() + "鈭�4");
+                Style firstStyle6 = new Style();
+                firstStyle6.setFontFamily("瀹嬩綋");
+                firstStyle6.setColor("000000");
+                firstRenderData6.setStyle(firstStyle6);
+                text.add(firstRenderData6);
+            }
+
+        }
+        TextRenderData[] text2 = text.toArray(new TextRenderData[0]);
+        rowRenderData = Rows.of(text2).center().rowAtleastHeight(1).create();
+        rows.add(rowRenderData);
+        text = new ArrayList<>();
+
+        // 绗簩琛�
+        TextRenderData headRenderData1 = new TextRenderData();
+        headRenderData1.setText("搴忓彿@NO.");
+        Style headStyle1 = new Style();
+        headStyle1.setFontFamily("瀹嬩綋");
+        headStyle1.setColor("000000");
+        headRenderData1.setStyle(headStyle1);
+        text.add(headRenderData1);
+
+        TextRenderData headRenderData2 = new TextRenderData();
+        headRenderData2.setText("妫�楠岄」鐩瓳Test item鈭�5");
+        Style headStyle2 = new Style();
+        headStyle2.setFontFamily("瀹嬩綋");
+        headStyle2.setColor("000000");
+        headRenderData2.setStyle(headStyle2);
+        text.add(headRenderData2);
+
+        TextRenderData headRenderData3 = new TextRenderData();
+        headRenderData3.setText("妫�楠岄」鐩瓳Test item鈭�5");
+        Style headStyle3 = new Style();
+        headStyle3.setFontFamily("瀹嬩綋");
+        headStyle3.setColor("000000");
+        headRenderData3.setStyle(headStyle3);
+        text.add(headRenderData3);
+
+        TextRenderData headRenderData4 = new TextRenderData();
+        headRenderData4.setText("鍗曚綅@Unit");
+        Style headStyle4 = new Style();
+        headStyle4.setFontFamily("瀹嬩綋");
+        headStyle4.setColor("000000");
+        headRenderData4.setStyle(headStyle4);
+        text.add(headRenderData4);
+
+        TextRenderData headRenderData5 = new TextRenderData();
+        headRenderData5.setText("鏍囧噯瑕佹眰@Requirement");
+        Style headStyle5 = new Style();
+        headStyle5.setFontFamily("瀹嬩綋");
+        headStyle5.setColor("000000");
+        headRenderData5.setStyle(headStyle5);
+        text.add(headRenderData5);
+
+        for (int i = 0; i < max; i++) {
+            TextRenderData headRenderData6 = new TextRenderData();
+            headRenderData6.setText("妫�楠岀粨鏋淍Test result鈭�6");
+            Style headStyle6 = new Style();
+            headStyle6.setFontFamily("瀹嬩綋");
+            headStyle6.setColor("000000");
+            headRenderData6.setStyle(headStyle6);
+            text.add(headRenderData6);
+        }
+        TextRenderData headRenderData7 = new TextRenderData();
+        headRenderData7.setText("缁撹@Conclusion");
+        Style headStyle7 = new Style();
+        headStyle7.setFontFamily("瀹嬩綋");
+        headStyle7.setColor("000000");
+        headRenderData7.setStyle(headStyle7);
+        text.add(headRenderData7);
+
+        TextRenderData[] text3 = text.toArray(new TextRenderData[0]);
+        rowRenderData = Rows.of(text3).center().rowAtleastHeight(1).create();
+        rows.add(rowRenderData);
+        text = new ArrayList<>();
+
+        // 绾胯姱棰滆壊
+        if (CollectionUtils.isNotEmpty(cableTags)) {
+            TextRenderData cableRenderData1 = new TextRenderData();
+            cableRenderData1.setText("");
+            Style cableStyle1 = new Style();
+            cableStyle1.setFontFamily("瀹嬩綋");
+            cableStyle1.setColor("000000");
+            cableRenderData1.setStyle(cableStyle1);
+            text.add(cableRenderData1);
+
+            TextRenderData cableRenderData2 = new TextRenderData();
+            cableRenderData2.setText("缁濈紭绾胯姱棰滆壊鍜屾爣蹇桜Insulation core color and mark鈭�200");
+            Style cableStyle2 = new Style();
+            cableStyle2.setFontFamily("瀹嬩綋");
+            cableStyle2.setColor("000000");
+            cableRenderData2.setStyle(cableStyle2);
+            text.add(cableRenderData2);
+
+            TextRenderData cableRenderData3 = new TextRenderData();
+            cableRenderData3.setText("缁濈紭绾胯姱棰滆壊鍜屾爣蹇桜Insulation core color and mark鈭�200");
+            Style cableStyle3 = new Style();
+            cableStyle3.setFontFamily("瀹嬩綋");
+            cableStyle3.setColor("000000");
+            cableRenderData3.setStyle(cableStyle3);
+            text.add(cableRenderData3);
+
+            TextRenderData cableRenderData4 = new TextRenderData();
+            cableRenderData4.setText("");
+            Style cableStyle4 = new Style();
+            cableStyle4.setFontFamily("瀹嬩綋");
+            cableStyle4.setColor("000000");
+            cableRenderData4.setStyle(cableStyle4);
+            text.add(cableRenderData4);
+
+            TextRenderData cableRenderData5 = new TextRenderData();
+            cableRenderData5.setText("");
+            Style cableStyle5 = new Style();
+            cableStyle5.setFontFamily("瀹嬩綋");
+            cableStyle5.setColor("000000");
+            cableRenderData5.setStyle(cableStyle5);
+            text.add(cableRenderData5);
+
+            for (String cableTag : cableTags) {
+                TextRenderData cableRenderData6 = new TextRenderData();
+                cableRenderData6.setText(cableTag);
+                Style cableStyle6 = new Style();
+                cableStyle6.setFontFamily("瀹嬩綋");
+                cableStyle6.setColor("000000");
+                cableRenderData6.setStyle(cableStyle6);
+                text.add(cableRenderData6);
+            }
+            TextRenderData cableRenderData7 = new TextRenderData();
+            cableRenderData7.setText("-");
+            Style cableStyle7 = new Style();
+            cableStyle7.setFontFamily("瀹嬩綋");
+            cableStyle7.setColor("000000");
+            cableRenderData7.setStyle(cableStyle7);
+            text.add(cableRenderData7);
+
+            TextRenderData[] text4 = text.toArray(new TextRenderData[0]);
+            rowRenderData = Rows.of(text4).center().rowAtleastHeight(1).create();
+            rows.add(rowRenderData);
+            text = new ArrayList<>();
+        }
+
+
+    }
+
+
+    /**
+     * 娣诲姞妫�娴嬪��
+     * @param a   褰撳墠鏍峰搧
+     * @param text
+     * @param rowRenderData
+     * @param rows
+     * @param max  妫�楠屾暟閲�
+     * @param resultChList  涓嶇鍚堜俊鎭腑鏂�
+     * @param resultEhList  涓嶇鍚堜俊鎭嫳鏂�
+     * @param insSamples
+     * @param cableTags 绾胯姱棰滆壊
+     * @param isOneSample 鍒ゆ柇鏄惁鏄彧鏈変竴涓牱鍝�
+     */
+    private int addTestValue(SampleProductDto a,
+                             List<TextRenderData> text,
+                             RowRenderData rowRenderData,
+                             List<RowRenderData> rows,
+                             int max,
+                             List<String> resultChList,
+                             List<String> resultEhList,
+                             InsSample insSamples, List<String> cableTags,
+                             boolean isOneSample) {
+        // 妫�楠岄」鎬绘暟
+        AtomicInteger productSize = new AtomicInteger(1);
+        // 涓嶅悎鏍间俊鎭�
+        AtomicReference<String> resultCh = new AtomicReference<>("");
+        AtomicReference<String> resultEn = new AtomicReference<>("");
+        // 鏌ヨ妫�楠岀粨鏋�
+        List<Integer> ids = new ArrayList<>();
+        ids.add(a.getId());
+        List<SampleProductExportDto> sampleProductDto2s = insOrderMapper.selectSampleBySampleId(ids);
+
+        // 鍒ゆ柇鏄惁鏄搴︽楠�, 涓旀湁娌℃湁杩涘巶妫�楠�, 鏈夎繘鍘傛楠岃繘鍘傛楠岀殑淇℃伅璧嬪�煎埌瀛e害涓�
+        if (insSamples != null) {
+            // 鏌ヨ妫�楠屽唴瀹�
+            List<SampleProductExportDto> enterDto = insOrderMapper.selectSampleBySampleIdOne(insSamples.getId());
+            // 鎺掗櫎鎺夎繘鍘傛姤鍛婇噸澶嶇殑
+            enterDto = enterDto.stream().filter(sampleProductDto2 -> {
+                // 鍒ゆ柇妫�楠岄」妫�楠屽瓙椤规槸鍚︿竴鏍�, 涓�鏍峰氨鐩存帴杩斿洖false鎺掗櫎
+                return !sampleProductDto2s.stream().anyMatch(dto -> {
+                    String quarter = sampleProductDto2.getInspectionItem() + sampleProductDto2.getInspectionItemSubclass();
+                    String enter = dto.getInspectionItem() + dto.getInspectionItemSubclass();
+                    return quarter.equals(enter);
+                });
+            }).collect(Collectors.toList());
+            sampleProductDto2s.addAll(enterDto);
+        }
+
+        // 鏍煎紡鍖栦慨鏀规楠岄」
+        this.formatProducts(sampleProductDto2s);
+
+        List<SampleProductExportDto> sampleList = new ArrayList<>();
+
+        // 鑾峰彇妫�楠岄」鍒嗙被鐨�
+        Map<String, List<SampleProductExportDto>> itemClassMap = sampleProductDto2s.stream().filter(sampleProductDto2 -> StringUtils.isNotBlank(sampleProductDto2.getInspectionItemClass()))
+                .collect(Collectors.groupingBy(SampleProductExportDto::getInspectionItemClass));
+
+        List<Map.Entry<String, List<SampleProductExportDto>>> itemClassEntries = new ArrayList<>(itemClassMap.entrySet());
+        itemClassEntries.sort((o1, o2) -> {
+            // 鍐嶆瘮杈� sort
+            Integer sort1 = o1.getValue().get(0).getSort();
+            Integer sort2 = o2.getValue().get(0).getSort();
+            sort1 = sort1 == null ? 0 : sort1;
+            sort2 = sort2 == null ? 0 : sort2;
+            return sort1.compareTo(sort2);
+        });
+        // 鍒涘缓涓�涓� LinkedHashMap 鏉ヤ繚鎸佹彃鍏ラ『搴�
+        Map<String, List<SampleProductExportDto>> itemClassList = new LinkedHashMap<>();
+        for (Map.Entry<String, List<SampleProductExportDto>> entry : itemClassEntries) {
+            itemClassList.put(entry.getKey(), entry.getValue());
+        }
+
+        if (CollectionUtils.isNotEmpty(itemClassList)) {
+            AtomicInteger finalIndex = new AtomicInteger(1);
+
+            // 鑾峰彇妫�楠岄」鍒嗙被鐩稿悓鐨�
+            itemClassList.forEach((s, sampleClass) -> {
+                // 娣诲姞妫�楠屽垎绫�
+                SampleProductExportDto classDto = new SampleProductExportDto();
+                // 鍒ゆ柇鏄惁鏈夎嫳鏂囧悕绉�
+                SampleProductExportDto temp = sampleClass.get(0);
+                if (StringUtils.isNotBlank(temp.getInspectionItemClassEN())) {
+                    classDto.setInspectionName(temp.getInspectionItemClass() + "@" + temp.getInspectionItemClassEN());
+                } else {
+                    classDto.setInspectionName(temp.getInspectionItemClass());
+                }
+                classDto.setIndex(Integer.toString(finalIndex.get()));
+                sampleList.add(classDto);
+
+                // 娣诲姞妫�楠岄」
+                Map<String, List<SampleProductExportDto>> sortedMap = sampleClass.stream()
+                        .filter(sampleProductDto2 -> StringUtils.isNotBlank(sampleProductDto2.getInspectionItem()))
+                        .collect(Collectors.groupingBy(SampleProductExportDto::getInspectionItemRadius));
+
+                List<Map.Entry<String, List<SampleProductExportDto>>> entries = new ArrayList<>(sortedMap.entrySet());
+                entries.sort((o1, o2) -> {
+                    // 鍐嶆瘮杈� sort
+                    Integer sort1 = o1.getValue().get(0).getSort();
+                    Integer sort2 = o2.getValue().get(0).getSort();
+                    sort1 = sort1 == null ? 0 : sort1;
+                    sort2 = sort2 == null ? 0 : sort2;
+                    return sort1.compareTo(sort2);
+                });
+                // 鍒涘缓涓�涓� LinkedHashMap 鏉ヤ繚鎸佹彃鍏ラ『搴�
+                Map<String, List<SampleProductExportDto>> item = new LinkedHashMap<>();
+                for (Map.Entry<String, List<SampleProductExportDto>> entry : entries) {
+                    item.put(entry.getKey(), entry.getValue());
+                }
+
+                AtomicInteger belowIndex = new AtomicInteger(1);
+                item.forEach((s2, sampleProductDtoInside) -> {
+                    // 娣诲姞妫�楠岄」
+                    SampleProductExportDto dto2 = new SampleProductExportDto();
+                    // 鍒ゆ柇鏄惁鏈夎嫳鏂囧悕绉�
+                    SampleProductExportDto temp2 = sampleProductDtoInside.get(0);
+                    if (StringUtils.isNotBlank(temp2.getInspectionItemEn())) {
+                        dto2.setInspectionName(temp2.getInspectionItem() + "@" + temp2.getInspectionItemEn());
+                    } else {
+                        dto2.setInspectionName(temp2.getInspectionItem());
+                    }
+                    // 鍒ゆ柇鏈夋病鏈夋潯浠跺瓧娈靛~鍏呭埌瑕佹眰
+                    if (StringUtils.isNotBlank(temp2.getRadius())) {
+                        dto2.setTell("(" + temp2.getRadius() + ")");
+                    }
+                    // 鍒ゆ柇鏄惁鏈夋楠屽瓙椤�,娌℃湁灏辨妸妫�楠屽弬鏁板~鍏�
+                    dto2.setIndex(finalIndex.get() + "." + belowIndex.get());
+                    if (StringUtils.isBlank(temp2.getInspectionItemSubclass())) {
+                        // 澶勭悊闆嗗悎
+                        Map<String, SampleProductExportDto> map = new LinkedHashMap<>();
+                        for (SampleProductExportDto productDto2 : sampleProductDtoInside) {
+                            String productName = productDto2.getInspectionItemClass() + productDto2.getInspectionItem();
+                            if (map.containsKey(productName)) {
+                                // 濡傛灉鍚嶇О宸茬粡瀛樺湪锛屾坊鍔� lastValue 鍊煎埌 lastValueList 鍒楄〃
+                                map.get(productName)
+                                        .getLastValueList()
+                                        .add(productDto2.getLastValue());
+                                map.get(productName)
+                                        .getInsResultList()
+                                        .add(productDto2.getInsResult());
+                                // 娣诲姞棰滆壊瀵瑰簲鐨勫�煎拰缁撴灉
+                                if (StringUtils.isNotBlank(productDto2.getCableTag())) {
+                                    map.get(productName)
+                                            .getCableTagValueMap()
+                                            .put(productDto2.getCableTag(), productDto2.getLastValue());
+                                    map.get(productName)
+                                            .getCableTagResultMap()
+                                            .put(productDto2.getCableTag(), productDto2.getInsResult());
+                                }
+                                // 娣诲姞鏍囧噯瑕佹眰鏉ョ‘瀹氬敮涓�鎬�
+                                map.get(productName).getTellSet().add(productDto2.getTell());
+                            } else {
+                                // 濡傛灉鍚嶇О涓嶅瓨鍦紝鐩存帴鏀惧叆 map
+                                productDto2.setLastValueList(new ArrayList<>()); // 妫�楠屽唴瀹�
+                                productDto2.getLastValueList().add(productDto2.getLastValue());
+                                productDto2.setInsResultList(new ArrayList<>()); // 缁撴灉
+                                productDto2.getInsResultList().add(productDto2.getInsResult());
+                                productDto2.setTellSet(new LinkedHashSet<>());
+                                productDto2.getTellSet().add(productDto2.getTell());// 鏍囧噯瑕佹眰
+
+                                // 鍒ゆ柇鏄惁鏈夌嚎鑺鑹�, 娣诲姞棰滆壊瀵瑰簲鐨勫�煎拰缁撴灉
+                                productDto2.setCableTagValueMap(new TreeMap<>());
+                                productDto2.setCableTagResultMap(new TreeMap<>());
+                                if (StringUtils.isNotBlank(productDto2.getCableTag())) {
+                                    productDto2.getCableTagValueMap().put(productDto2.getCableTag(), productDto2.getLastValue());
+                                    productDto2.getCableTagResultMap().put(productDto2.getCableTag(), productDto2.getInsResult());
+                                }
+
+                                map.put(productName, productDto2);
+                            }
+                        }
+                        List<SampleProductExportDto> result = new ArrayList<>(map.values());
+
+
+                        //娣诲姞妫�楠岄」
+                        SampleProductExportDto temp3 = result.get(0);
+                        String itemName = temp3.getInspectionItem();
+                        if (StringUtils.isNotBlank(temp3.getRadius())) {
+                            itemName = itemName + "(" + temp3.getRadius() + ")";
+                        }
+                        // 鍒ゆ柇鏈夋病鏈夋潯浠跺瓧娈垫湁闇�瑕佹嫾鎺ュ埌鍚嶇О鍚庨潰
+                        if (StringUtils.isNotBlank(temp3.getInspectionItemEn())) {
+                            temp3.setInspectionName(itemName + "@" + temp3.getInspectionItemEn());
+                        } else {
+                            temp3.setInspectionName(itemName);
+                        }
+                        // 鍒ゆ柇鏈夋病鏈夋潯浠跺瓧娈垫湁闇�瑕佹嫾鎺ュ埌鍚嶇О鍚庨潰
+                        // 鍒ゆ柇鏈夋病鏈夋潯浠跺瓧娈靛~鍏呭埌瑕佹眰
+                        if (StringUtils.isNotBlank(temp3.getRadius())) {
+                            temp3.setTell("(" + temp3.getRadius() + ")");
+                        }
+                        temp3.setIndex(finalIndex.get() + "." + belowIndex.get());
+                        sampleList.add(temp3);
+                    } else {
+                        sampleList.add(dto2);
+                        // 鐜板湪闇�瑕佹牴鎹瓙椤瑰幓閲嶇疮鍔犳楠岀粨鏋�
+                        // 澶勭悊闆嗗悎
+                        Map<String, SampleProductExportDto> map = new LinkedHashMap<>();
+                        for (SampleProductExportDto productDto2 : sampleProductDtoInside) {
+                            String productName = productDto2.getInspectionItemClass() + productDto2.getInspectionItem() + productDto2.getInspectionItemSubclass();
+                            if (map.containsKey(productName)) {
+                                // 濡傛灉鍚嶇О宸茬粡瀛樺湪锛屾坊鍔� lastValue 鍊煎埌 lastValueList 鍒楄〃
+                                map.get(productName)
+                                        .getLastValueList()
+                                        .add(productDto2.getLastValue());
+                                map.get(productName)
+                                        .getInsResultList()
+                                        .add(productDto2.getInsResult());
+                                // 娣诲姞棰滆壊瀵瑰簲鐨勫�煎拰缁撴灉
+                                if (StringUtils.isNotBlank(productDto2.getCableTag())) {
+                                    map.get(productName)
+                                            .getCableTagValueMap()
+                                            .put(productDto2.getCableTag(), productDto2.getLastValue());
+                                    map.get(productName)
+                                            .getCableTagResultMap()
+                                            .put(productDto2.getCableTag(), productDto2.getInsResult());
+                                }
+                                // 娣诲姞鏍囧噯瑕佹眰鏉ョ‘瀹氬敮涓�鎬�
+                                map.get(productName).getTellSet().add(productDto2.getTell());
+                            } else {
+                                // 濡傛灉鍚嶇О涓嶅瓨鍦紝鐩存帴鏀惧叆 map
+                                productDto2.setLastValueList(new ArrayList<>()); // 妫�楠屽唴瀹�
+                                productDto2.getLastValueList().add(productDto2.getLastValue());
+                                productDto2.setInsResultList(new ArrayList<>()); // 缁撴灉
+                                productDto2.getInsResultList().add(productDto2.getInsResult());
+                                productDto2.setTellSet(new LinkedHashSet<>());
+                                productDto2.getTellSet().add(productDto2.getTell());// 鏍囧噯瑕佹眰
+
+                                // 鍒ゆ柇鏄惁鏈夌嚎鑺鑹�, 娣诲姞棰滆壊瀵瑰簲鐨勫�煎拰缁撴灉
+                                productDto2.setCableTagValueMap(new TreeMap<>());
+                                productDto2.setCableTagResultMap(new TreeMap<>());
+                                if (StringUtils.isNotBlank(productDto2.getCableTag())) {
+                                    productDto2.getCableTagValueMap().put(productDto2.getCableTag(), productDto2.getLastValue());
+                                    productDto2.getCableTagResultMap().put(productDto2.getCableTag(), productDto2.getInsResult());
+                                }
+
+                                map.put(productName, productDto2);
+                            }
+                        }
+                        List<SampleProductExportDto> result = new ArrayList<>(map.values());
+
+                        //娣诲姞妫�楠屽瓙椤�
+                        for (SampleProductExportDto productDto2 : result) {
+                            if (StringUtils.isNotBlank(productDto2.getInspectionItemSubclassEn())) {
+                                productDto2.setInspectionName("--" + productDto2.getInspectionItemSubclass() + "@"
+                                        + "--" + productDto2.getInspectionItemSubclassEn());
+                            } else {
+                                productDto2.setInspectionName("--" + productDto2.getInspectionItemSubclass());
+                            }
+                            sampleList.add(productDto2);
+                        }
+                    }
+                    belowIndex.incrementAndGet();
+                    productSize.incrementAndGet();
+                });
+                finalIndex.incrementAndGet();
+            });
+        } else {
+            // 杞垚Mpa杩涜鎺掑簭
+            Map<String, List<SampleProductExportDto>> sortedMap = sampleProductDto2s.stream()
+                    .filter(sampleProductDto2 -> StringUtils.isNotBlank(sampleProductDto2.getInspectionItem()))
+                    .collect(Collectors.groupingBy(SampleProductExportDto::getInspectionItemRadius));
+            List<Map.Entry<String, List<SampleProductExportDto>>> entries = new ArrayList<>(sortedMap.entrySet());
+            entries.sort((o1, o2) -> {
+                Integer sort1 = o1.getValue().get(0).getSort();
+                Integer sort2 = o2.getValue().get(0).getSort();
+                sort1 = sort1 == null ? 0 : sort1;
+                sort2 = sort2 == null ? 0 : sort2;
+                return sort1.compareTo(sort2);
+            });
+            // 鍒涘缓涓�涓� LinkedHashMap 鏉ヤ繚鎸佹彃鍏ラ『搴�
+            Map<String, List<SampleProductExportDto>> item = new LinkedHashMap<>();
+            for (Map.Entry<String, List<SampleProductExportDto>> entry : entries) {
+                item.put(entry.getKey(), entry.getValue());
+            }
+
+            AtomicInteger finalIndex = new AtomicInteger(1);
+            item.forEach((s, sampleProductDtoInside) -> {
+                // 娣诲姞妫�楠岄」
+                SampleProductExportDto dto2 = new SampleProductExportDto();
+                // 鍒ゆ柇鏄惁鏈夎嫳鏂囧悕绉�
+                SampleProductExportDto temp = sampleProductDtoInside.get(0);
+
+                // 鍒ゆ柇鏄惁鏈夋楠屽瓙椤�,娌℃湁灏辨妸妫�楠屽弬鏁板~鍏�
+                dto2.setIndex(Integer.toString(finalIndex.get()));
+                if (StringUtils.isBlank(temp.getInspectionItemSubclass())) {
+                    // 澶勭悊闆嗗悎
+                    Map<String, SampleProductExportDto> map = new LinkedHashMap<>();
+                    for (SampleProductExportDto productDto2 : sampleProductDtoInside) {
+                        String productName = productDto2.getInspectionItemClass() + productDto2.getInspectionItem();
+                        if (map.containsKey(productName)) {
+                            // 濡傛灉鍚嶇О宸茬粡瀛樺湪锛屾坊鍔� lastValue 鍊煎埌 lastValueList 鍒楄〃
+                            map.get(productName)
+                                    .getLastValueList()
+                                    .add(productDto2.getLastValue());
+                            map.get(productName)
+                                    .getInsResultList()
+                                    .add(productDto2.getInsResult());
+                            // 娣诲姞棰滆壊瀵瑰簲鐨勫�煎拰缁撴灉
+                            if (StringUtils.isNotBlank(productDto2.getCableTag())) {
+                                map.get(productName)
+                                        .getCableTagValueMap()
+                                        .put(productDto2.getCableTag(), productDto2.getLastValue());
+                                map.get(productName)
+                                        .getCableTagResultMap()
+                                        .put(productDto2.getCableTag(), productDto2.getInsResult());
+                            }
+                            // 娣诲姞鏍囧噯瑕佹眰鏉ョ‘瀹氬敮涓�鎬�
+                            map.get(productName).getTellSet().add(productDto2.getTell());
+                        } else {
+                            // 濡傛灉鍚嶇О涓嶅瓨鍦紝鐩存帴鏀惧叆 map
+                            productDto2.setLastValueList(new ArrayList<>()); // 妫�楠屽唴瀹�
+                            productDto2.getLastValueList().add(productDto2.getLastValue());
+                            productDto2.setInsResultList(new ArrayList<>()); // 缁撴灉
+                            productDto2.getInsResultList().add(productDto2.getInsResult());
+                            productDto2.setTellSet(new LinkedHashSet<>());
+                            productDto2.getTellSet().add(productDto2.getTell());// 鏍囧噯瑕佹眰
+
+                            // 鍒ゆ柇鏄惁鏈夌嚎鑺鑹�, 娣诲姞棰滆壊瀵瑰簲鐨勫�煎拰缁撴灉
+                            productDto2.setCableTagValueMap(new TreeMap<>());
+                            productDto2.setCableTagResultMap(new TreeMap<>());
+                            if (StringUtils.isNotBlank(productDto2.getCableTag())) {
+                                productDto2.getCableTagValueMap().put(productDto2.getCableTag(), productDto2.getLastValue());
+                                productDto2.getCableTagResultMap().put(productDto2.getCableTag(), productDto2.getInsResult());
+                            }
+
+                            map.put(productName, productDto2);
+                        }
+                    }
+                    List<SampleProductExportDto> result = new ArrayList<>(map.values());
+
+                    //娣诲姞妫�楠屽瓙椤�
+                    SampleProductExportDto temp2 = result.get(0);
+                    String itemName = temp2.getInspectionItem();
+                    if (StringUtils.isNotBlank(temp2.getRadius())) {
+                        itemName = itemName + "(" + temp2.getRadius() + ")";
+                    }
+                    // 鍒ゆ柇鏈夋病鏈夋潯浠跺瓧娈垫湁闇�瑕佹嫾鎺ュ埌鍚嶇О鍚庨潰
+                    if (StringUtils.isNotBlank(temp2.getInspectionItemEn())) {
+                        temp2.setInspectionName(itemName + "@" + temp2.getInspectionItemEn());
+                    } else {
+                        temp2.setInspectionName(itemName);
+                    }
+                    // 鍒ゆ柇鏈夋病鏈夋潯浠跺瓧娈垫湁闇�瑕佹嫾鎺ュ埌鍚嶇О鍚庨潰
+                    temp2.setIndex(Integer.toString(finalIndex.get()));
+                    sampleList.add(temp2);
+                } else {
+                    if (StringUtils.isNotBlank(temp.getInspectionItemEn())) {
+                        dto2.setInspectionName(temp.getInspectionItem() + "@" + temp.getInspectionItemEn());
+                    } else {
+                        dto2.setInspectionName(temp.getInspectionItem());
+                    }
+                    // 濉厖鍒拌姹�
+                    if (StringUtils.isNotBlank(temp.getRadius())) {
+                        dto2.setTell("(" + temp.getRadius() + ")");
+                    }
+                    sampleList.add(dto2);
+
+                    // 鐜板湪闇�瑕佹牴鎹瓙椤瑰幓閲嶇疮鍔犳楠岀粨鏋�
+                    // 澶勭悊闆嗗悎
+                    Map<String, SampleProductExportDto> map = new LinkedHashMap<>();
+                    for (SampleProductExportDto productDto2 : sampleProductDtoInside) {
+                        // 鍚嶅瓧鍙栦笁灞傚敮涓�
+                        String productName = productDto2.getInspectionItemClass() + productDto2.getInspectionItem() + productDto2.getInspectionItemSubclass();
+                        if (map.containsKey(productName)) {
+                            // 濡傛灉鍚嶇О宸茬粡瀛樺湪锛屾坊鍔� lastValue 鍊煎埌 lastValueList 鍒楄〃
+                            map.get(productName)
+                                    .getLastValueList()
+                                    .add(productDto2.getLastValue());
+                            map.get(productName)
+                                    .getInsResultList()
+                                    .add(productDto2.getInsResult());
+                            // 娣诲姞棰滆壊瀵瑰簲鐨勫�煎拰缁撴灉
+                            if (StringUtils.isNotBlank(productDto2.getCableTag())) {
+                                map.get(productName)
+                                        .getCableTagValueMap()
+                                        .put(productDto2.getCableTag(), productDto2.getLastValue());
+                                map.get(productName)
+                                        .getCableTagResultMap()
+                                        .put(productDto2.getCableTag(), productDto2.getInsResult());
+                            }
+                            // 娣诲姞鏍囧噯瑕佹眰鏉ョ‘瀹氬敮涓�鎬�
+                            map.get(productName).getTellSet().add(productDto2.getTell());
+                        } else {
+                            // 濡傛灉鍚嶇О涓嶅瓨鍦紝鐩存帴鏀惧叆 map
+                            productDto2.setLastValueList(new ArrayList<>()); // 妫�楠屽唴瀹�
+                            productDto2.getLastValueList().add(productDto2.getLastValue());
+                            productDto2.setInsResultList(new ArrayList<>()); // 缁撴灉
+                            productDto2.getInsResultList().add(productDto2.getInsResult());
+                            productDto2.setTellSet(new LinkedHashSet<>());
+                            productDto2.getTellSet().add(productDto2.getTell());// 鏍囧噯瑕佹眰
+                            productDto2.setCableTagValueMap(new TreeMap<>());
+                            // 鍒ゆ柇鏄惁鏈夌嚎鑺鑹�, 娣诲姞棰滆壊瀵瑰簲鐨勫�煎拰缁撴灉
+                            productDto2.setCableTagValueMap(new TreeMap<>());
+                            productDto2.setCableTagResultMap(new TreeMap<>());
+                            if (StringUtils.isNotBlank(productDto2.getCableTag())) {
+                                productDto2.getCableTagValueMap().put(productDto2.getCableTag(), productDto2.getLastValue());
+                                productDto2.getCableTagResultMap().put(productDto2.getCableTag(), productDto2.getInsResult());
+                            }
+                            map.put(productName, productDto2);
+                        }
+                    }
+                    List<SampleProductExportDto> result = new ArrayList<>(map.values());
+
+                    //娣诲姞妫�楠屽瓙椤�
+                    for (SampleProductExportDto productDto2 : result) {
+                        if (StringUtils.isNotBlank(productDto2.getInspectionItemSubclassEn())) {
+                            productDto2.setInspectionName("--" + productDto2.getInspectionItemSubclass() + "@"
+                                    + "--" + productDto2.getInspectionItemSubclassEn());
+                        } else {
+                            productDto2.setInspectionName("--" + productDto2.getInspectionItemSubclass());
+                        }
+                        sampleList.add(productDto2);
+                    }
+                }
+                finalIndex.incrementAndGet();
+            });
+            productSize.set(finalIndex.get());
+        }
+
+        if (CollectionUtils.isEmpty(sampleList)) {
+            return productSize.get() - 1;
+        }
+
+        /* 妫�楠岄」map, 濡傛灉涓嶅悎鏍煎垽鏂槸鍚︽湁澶х被鍜屾楠岄」, 鏈夊ぇ绫讳笉闇�瑕侀噸鍙�, 濡�(缁濈紭鏈烘鐗╃悊鎬ц兘鑰佸寲鍓嶆柇瑁備几闀跨巼銆佺粷缂樻満姊扮墿鐞嗘�ц兘鑰佸寲鍓嶆姉寮犲己搴�)
+         *  闇�瑕佷慨鏀规垚缁濈紭鏈烘鐗╃悊鎬ц兘鑰佸寲鍓嶆柇瑁備几闀跨巼銆佹姉寮犲己搴�
+         * */
+        // 妫�楠岄」鍒嗙被      妫�楠岄」  妫�楠屽瓙椤�
+        Map<String, LinkedHashMap<String, List<String>>> errorClassItemMapCn = new LinkedHashMap<>();
+        Map<String, LinkedHashMap<String, List<String>>> errorClassItemMapEn = new LinkedHashMap<>();
+
+        // 涓棿妫�娴嬪�兼坊鍔�
+        for (int i = 0; i < sampleList.size(); i++) {
+            SampleProductExportDto sample = sampleList.get(i);
+
+            String fixedValue = "(100鈩冿紝168h)";
+            // 鍒ゆ柇鏄惁鏄�  鎷変几寮哄害鍙樺寲鐜�(100鈩冿紝168h)  鍜�  鏂鎷変几搴斿彉鍙樺寲鐜�(100鈩冿紝168h) 闇�瑕佸幓闄ゆ潯浠�
+            if (StrUtil.isNotBlank(sample.getInspectionName())
+                    && sample.getInspectionName().contains("鏂鎷変几搴斿彉鍙樺寲鐜�(100鈩冿紝168h)")) {
+                sample.setInspectionName(sample.getInspectionName().replace(fixedValue, ""));
+            }
+            if (StrUtil.isNotBlank(sample.getInspectionName())
+                    && sample.getInspectionName().contains("鎷変几寮哄害鍙樺寲鐜�(100鈩冿紝168h)")) {
+                sample.setInspectionName(sample.getInspectionName().replace(fixedValue, ""));
+            }
+            if (StrUtil.isNotBlank(sample.getInspectionName())
+                    && sample.getInspectionName().contains("鑰佸寲鍚庢満姊版�ц兘(100鈩冿紝168h)")) {
+                sample.setInspectionName(sample.getInspectionName().replace(fixedValue, ""));
+            }
+
+            // 鍒ゆ柇鏄惁鏄�  鑰愮熆鐗╂补鈪狅紙150鈩� 72h)  鍜�  鑰愮熆鐗╂补鈪狅紙150鈩� 144h) 闇�瑕佸幓闄ゆ潯浠�
+            if (StrUtil.isNotBlank(sample.getInspectionName())
+                    && sample.getInspectionName().contains("鑰愮熆鐗╂补鈪狅紙150鈩� 72h)")) {
+                sample.setInspectionName(sample.getInspectionName().replace("锛�150鈩� 72h)", ""));
+            }
+            if (StrUtil.isNotBlank(sample.getInspectionName())
+                    && sample.getInspectionName().contains("鑰愮熆鐗╂补鈪狅紙150鈩� 144h)")) {
+                sample.setInspectionName(sample.getInspectionName().replace("锛�150鈩� 144h)", ""));
+            }
+
+            // 搴忓彿
+            TextRenderData headRenderData1 = new TextRenderData();
+            headRenderData1.setText(sample.getIndex());
+            Style headStyle1 = new Style();
+            headStyle1.setFontFamily("瀹嬩綋");
+            headStyle1.setColor("000000");
+            headRenderData1.setStyle(headStyle1);
+            text.add(headRenderData1);
+
+            // 妫�楠岄」鐩�
+            TextRenderData headRenderData2 = new TextRenderData();
+            headRenderData2.setText(sample.getInspectionName() + "鈭�" + (i + 999));
+            Style headStyle2 = new Style();
+            headStyle2.setFontFamily("瀹嬩綋");
+            headStyle2.setColor("000000");
+            headRenderData2.setStyle(headStyle2);
+            text.add(headRenderData2);
+
+            // 妫�楠岄」鐩�
+            TextRenderData headRenderData3 = new TextRenderData();
+            headRenderData3.setText(sample.getInspectionName() + "鈭�" + (i + 999));
+            Style headStyle3 = new Style();
+            headStyle3.setFontFamily("瀹嬩綋");
+            headStyle3.setColor("000000");
+            headRenderData3.setStyle(headStyle3);
+            text.add(headRenderData3);
+
+            // 鍗曚綅
+            TextRenderData headRenderData4 = new TextRenderData();
+            headRenderData4.setText(sample.getUnit());
+            Style headStyle4 = new Style();
+            headStyle4.setFontFamily("瀹嬩綋");
+            headStyle4.setColor("000000");
+            headRenderData4.setStyle(headStyle4);
+            text.add(headRenderData4);
+
+            //鏍囧噯瑕佹眰
+            String tell = sample.getTell();
+            if (CollectionUtils.isNotEmpty(sample.getTellSet())) {
+                tell = CollUtil.join(sample.getTellSet(), "/");
+            }
+            TextRenderData headRenderData5 = new TextRenderData();
+            headRenderData5.setText(tell);
+            Style headStyle5 = new Style();
+            headStyle5.setFontFamily("瀹嬩綋");
+            headStyle5.setColor("000000");
+            headRenderData5.setStyle(headStyle5);
+            text.add(headRenderData5);
+
+            // 鍒ゆ柇鏄惁鏈夌數缂嗘爣璇唌ap
+            if (CollectionUtils.isNotEmpty(sample.getCableTagValueMap())) {
+                sample.setLastValueList(new ArrayList<>(sample.getCableTagValueMap().values()));
+            }
+            if (CollectionUtils.isNotEmpty(sample.getCableTagResultMap())) {
+                sample.setInsResultList(new ArrayList<>(sample.getCableTagResultMap().values()));
+            }
+
+            // 妫�楠岀粨鏋�
+            // 鍒ゆ柇鏄惁鏄娆℃楠�
+            if (CollectionUtils.isNotEmpty(sample.getLastValueList())
+                    && sample.getLastValueList().size() == max) {
+
+                for (String s : sample.getLastValueList()) {
+                    TextRenderData headRenderData6 = new TextRenderData();
+                    headRenderData6.setText(s);
+                    Style headStyle6 = new Style();
+                    headStyle6.setFontFamily("瀹嬩綋");
+                    headStyle6.setColor("000000");
+                    headRenderData6.setStyle(headStyle6);
+                    text.add(headRenderData6);
+                }
+            } else {
+                for (int j = 0; j < max; j++) {
+                    TextRenderData headRenderData6 = new TextRenderData();
+                    headRenderData6.setText((StringUtils.isNotEmpty(sample.getLastValue()) ?
+                            sample.getLastValue() : "")
+                            + "鈭�" + (7 + i));
+                    Style headStyle6 = new Style();
+                    headStyle6.setFontFamily("瀹嬩綋");
+                    headStyle6.setColor("000000");
+                    headRenderData6.setStyle(headStyle6);
+                    text.add(headRenderData6);
+                }
+            }
+            // 鍒ゅ畾缁撴灉
+            String result = "";
+            if (sample.getInsResult() != null) {
+                switch (sample.getInsResult()) {
+                    case 1:
+                        result = "鈭�";
+                        break;
+                    case 2:
+                        result = "脳";
+                        break;
+                    case 3:
+                        result = "-";
+                        break;
+                }
+            }
+            if (CollectionUtils.isNotEmpty(sample.getLastValueList())) {
+                // 鍒ゆ柇鏄惁鏈変竴涓敊璇�
+                if (sample.getInsResultList().stream().anyMatch(s -> s.equals(3))) {
+                    result = "-";
+                } else {
+                    boolean error = sample.getInsResultList().stream().anyMatch(s -> s.equals(0));
+                    if (error) {
+                        List<String> collect = new ArrayList<>();
+                        int index = 0;
+                        for (Integer count : sample.getInsResultList()) {
+                            String type;
+                            if (count.equals(0)) {
+                                String itemCh = "";
+                                String itemEn = "";
+                                // 娣诲姞涓嶅悎鏍兼弿杩�
+                                // 鍒ゆ柇闀垮害鏄惁涓�1
+                                if (sample.getLastValueList().size() == 1) {
+                                    this.fillReportErrorResult(errorClassItemMapCn, errorClassItemMapEn, sample, itemCh, itemEn);
+                                } else if (CollectionUtils.isNotEmpty(cableTags)) {
+                                    // 鍒ゆ柇鏄惁鏈夌數缂嗛厤缃�, 涓嶆槸鐨勮瘽鍙兘涓哄師鏉愭枡
+                                    // 娣诲姞涓嶅悎鏍兼弿杩�
+                                    itemCh = (max == 1 ? "" : cableTags.get(index));
+                                    itemEn = (max == 1 ? "" : "The " + Integer.toString(index + 1) + " time ");
+                                    this.fillReportErrorResult(errorClassItemMapCn, errorClassItemMapEn, sample, itemCh, itemEn);
+                                } else {
+                                    // 娣诲姞涓嶅悎鏍兼弿杩�
+                                    itemCh = (max == 1 ? "" : "绗�" + Integer.toString(index + 1) + "娆�");
+                                    itemEn = (max == 1 ? "" : "The " + Integer.toString(index + 1) + " time ");
+                                    this.fillReportErrorResult(errorClassItemMapCn, errorClassItemMapEn, sample, itemCh, itemEn);
+                                }
+                                type = "脳";
+                            } else {
+                                type = "鈭�";
+                            }
+                            collect.add(type);
+                            index++;
+                        }
+                        result = CollUtil.join(collect, " ");
+                        ;
+                    } else {
+                        result = "鈭�";
+                    }
+                }
+            }
+
+            TextRenderData headRenderData7 = new TextRenderData();
+            headRenderData7.setText(result);
+            Style headStyle7 = new Style();
+            headStyle7.setFontFamily("瀹嬩綋");
+            headStyle7.setColor("000000");
+            headRenderData7.setStyle(headStyle7);
+            text.add(headRenderData7);
+
+            TextRenderData[] text2 = text.toArray(new TextRenderData[0]);
+            rowRenderData = Rows.of(text2).center().rowAtleastHeight(1).create();
+            rows.add(rowRenderData);
+            text = new ArrayList<>();
+
+        }
+        if (CollectionUtils.isNotEmpty(errorClassItemMapCn)) {
+            // 寰幆妫�楠岄」鍒嗙被
+            errorClassItemMapCn.forEach((errorClass, errorItemMap) -> {
+                if (StringUtils.isNotBlank(resultCh.get())) {
+                    resultCh.set(resultCh.get() + "锛�" + errorClass);
+                } else {
+                    resultCh.set(errorClass);
+                }
+                // 寰幆妫�楠岄」
+                AtomicBoolean flag = new AtomicBoolean(false);
+                errorItemMap.forEach((errorItem, errorSubClassList) -> {
+                    if (flag.get()) {
+                        resultCh.set(resultCh.get() + "锛�" + errorItem);
+                    } else {
+                        resultCh.set(resultCh.get() + errorItem);
+                    }
+                    flag.set(true);
+                    // 寰幆妫�楠岄」鍒嗙被
+                    if (CollectionUtils.isNotEmpty(errorSubClassList)) {
+                        for (int i = 0; i < errorSubClassList.size(); i++) {
+                            // 鍒ゆ柇鏄惁鏄浜屼釜, 绗簩涓坊鍔犻】鍙�
+                            if (i > 0) {
+                                resultCh.set(resultCh.get() + "銆�" + errorSubClassList.get(i));
+                            } else {
+                                resultCh.set(resultCh.get() + errorSubClassList.get(i));
+                            }
+                        }
+                    }
+                });
+            });
+            // 寰幆妫�楠岄」鍒嗙被
+            errorClassItemMapEn.forEach((errorClass, errorItemMap) -> {
+                if (StringUtils.isNotBlank(resultEn.get())) {
+                    resultEn.set(resultEn.get() + "锛�" + errorClass);
+                } else {
+                    resultEn.set(errorClass);
+                }
+                // 寰幆妫�楠岄」
+                errorItemMap.forEach((errorItem, errorSubClassList) -> {
+                    resultEn.set(resultEn.get() + errorItem);
+                    // 寰幆妫�楠岄」鍒嗙被
+                    if (CollectionUtils.isNotEmpty(errorSubClassList)) {
+                        for (int i = 0; i < errorSubClassList.size(); i++) {
+                            // 鍒ゆ柇鏄惁鏄浜屼釜, 绗簩涓坊鍔犻】鍙�
+                            if (i > 0) {
+                                resultEn.set(resultEn.get() + "銆�" + errorSubClassList.get(i));
+                            } else {
+                                resultEn.set(resultEn.get() + errorSubClassList.get(i));
+                            }
+                        }
+                    }
+                });
+            });
+        }
+
+        if (StringUtils.isNotBlank(resultCh.get())) {
+            String resultChString = resultCh.get();
+            String resultEnString = resultEn.get();
+            // 鍒ゆ柇鏍峰搧鏄惁鏈夊涓�, 鏈夊涓渶瑕佹嫾鎺ユ牱鍝佺紪鍙�
+            if (!isOneSample) {
+                resultChString = a.getSampleCode() + resultChString;
+                resultEnString = a.getSampleCode() + resultEnString;
+            }
+            resultChList.add(resultChString);
+            resultEhList.add(resultEnString);
+        }
+
+
+        return productSize.get() - 1;
+    }
+
+    /**
+     * 娣诲姞鎶ュ憡缁撹涓嫳鏂�
+     * @param sample
+     * @param itemCh
+     * @param itemEn
+     */
+    private void fillReportErrorResult(Map<String, LinkedHashMap<String, List<String>>> errorClassItemMapCn,
+                                       Map<String, LinkedHashMap<String, List<String>>> errorClassItemMapEn,
+                                       SampleProductExportDto sample,
+                                       String itemCh,
+                                       String itemEn) {
+        // 鍒ゆ柇鏄惁鏈夋楠岄」鍒嗙被map
+        String classTiemName = itemCh + (StringUtils.isBlank(sample.getInspectionItemClass()) ? "" : sample.getInspectionItemClass());
+        String classTiemNameEn = itemEn + (StringUtils.isBlank(sample.getInspectionItemClassEN()) ? "" : sample.getInspectionItemClassEN());
+        String classTiemNameItemEN = StringUtils.isBlank(sample.getInspectionItemEn()) ? "" : sample.getInspectionItemEn();
+
+        if (errorClassItemMapCn.containsKey(classTiemName)) {
+            // 鍒ゆ柇鏄惁鏈夋楠岄」map
+            if (errorClassItemMapCn.get(classTiemName).containsKey(sample.getInspectionItem())) {
+                // 娣诲姞妫�楠岄」鍒嗙被
+                if (StringUtils.isNotBlank(sample.getInspectionItemSubclass())) {
+                    errorClassItemMapCn.get(classTiemName).get(sample.getInspectionItem()).add(sample.getInspectionItemSubclass());
+                }
+                if (StringUtils.isNotBlank(sample.getInspectionItemSubclassEn())) {
+                    errorClassItemMapEn.get(classTiemNameEn).get(classTiemNameItemEN).add(sample.getInspectionItemSubclassEn());
+                }
+            } else {
+                // 娣诲姞妫�楠岄」map
+                List<String> errorItemSubClassList = new ArrayList<>();
+                if (StringUtils.isNotBlank(sample.getInspectionItemSubclass())) {
+                    errorItemSubClassList.add(sample.getInspectionItemSubclass());
+                }
+                List<String> errorItemSubClassListEn = new ArrayList<>();
+                if (StringUtils.isNotBlank(sample.getInspectionItemSubclassEn())) {
+                    errorItemSubClassListEn.add(sample.getInspectionItemSubclassEn());
+                }
+                errorClassItemMapCn.get(classTiemName).put(sample.getInspectionItem(), errorItemSubClassList);
+                errorClassItemMapEn.get(classTiemNameEn).put(classTiemNameItemEN, errorItemSubClassListEn);
+            }
+        } else {
+            // map娣诲姞妫�楠岄」鍒嗙被
+            List<String> errorItemSubClassList = new ArrayList<>();
+            if (StringUtils.isNotBlank(sample.getInspectionItemSubclass())) {
+                errorItemSubClassList.add(sample.getInspectionItemSubclass());
+            }
+            List<String> errorItemSubClassListEn = new ArrayList<>();
+            if (StringUtils.isNotBlank(sample.getInspectionItemSubclassEn())) {
+                errorItemSubClassListEn.add(sample.getInspectionItemSubclassEn());
+            }
+            errorClassItemMapCn.put(classTiemName, new LinkedHashMap<String, List<String>>() {{
+                put(sample.getInspectionItem(), errorItemSubClassList);
+            }});
+            errorClassItemMapEn.put(classTiemNameEn, new LinkedHashMap<String, List<String>>() {{
+                put(classTiemNameItemEN, errorItemSubClassListEn);
+            }});
+        }
+    }
+
+
+    /**
+     * 鏍煎紡鍖栦慨鏀规楠岄」
+     * @param sampleProductDto2s
+     */
+    private void formatProducts(List<SampleProductExportDto> sampleProductDto2s) {
+        sampleProductDto2s.forEach(sampleProductDto2 -> {
+            // 娓呴櫎鍏ㄩ儴缁撴灉鐨勫墠鍚庣┖鏍�, 鎹㈣绗�
+            if (StrUtil.isNotBlank(sampleProductDto2.getLastValue())) {
+                sampleProductDto2.setLastValue(sampleProductDto2.getLastValue().trim());
+            }
+
+            if (sampleProductDto2.getInsResult().equals(0)) {
+                // 鏌ヨ涓嶅悎鏍煎娴�
+                Long count = insUnqualifiedRetestProductMapper.selectCount(Wrappers.<InsUnqualifiedRetestProduct>lambdaQuery()
+                        .eq(InsUnqualifiedRetestProduct::getInsProductId, sampleProductDto2.getInsProductId())
+                        .ne(InsUnqualifiedRetestProduct::getInsResult, 0));
+                if (count == 2) {
+                    // 澶嶆祴鍐呭閮藉悎鏍煎氨鍙栫涓�涓粨鏋�
+                    InsUnqualifiedRetestProduct retestProduct = insUnqualifiedRetestProductMapper.selectOne(Wrappers.<InsUnqualifiedRetestProduct>lambdaQuery()
+                            .eq(InsUnqualifiedRetestProduct::getInsProductId, sampleProductDto2.getInsProductId())
+                            .last("limit 1"));
+                    sampleProductDto2.setLastValue(retestProduct.getLastValue());
+                    sampleProductDto2.setInsResult(retestProduct.getInsResult());
+                }
+            }
+            // 鍒ゆ柇鏄惁鏄暟瀛楃被鍨�
+            if (sampleProductDto2.getInspectionValueType().equals("1")) {
+                // 鎶婃楠屽唴瀹瑰鏋滄纭寲鐐瑰拰鐒︾儳鏃堕棿鎶�  .  鍒囧壊鎴�  :
+                String lastValue = sampleProductDto2.getLastValue();
+                if (sampleProductDto2.getInspectionItem().contains("姝g~鍖栫偣") || sampleProductDto2.getInspectionItem().contains("鐒︾儳鏃堕棿")) {
+                    sampleProductDto2.setLastValue(sampleProductDto2.getLastValue().replace('.', ':'));
+                } else {
+                    // 鍒ゆ柇褰撳墠缁撴灉鏄惁鏄瀛﹁鏁版硶
+                    boolean scientificNotation = isScientificNotation(lastValue);
+                    if (scientificNotation) {
+                        // 淇敼瑕佹眰鎻忚堪
+                        sampleProductDto2.setTell(convertToScientificNotation(sampleProductDto2.getTell()));
+
+                        // 淇敼瑕佹眰鍊�
+                        sampleProductDto2.setLastValue(toScientificNotationWithTimes(lastValue));
+                    } else {
+                        // 鎺掗櫎姘ф寚鏁�
+                        if (sampleProductDto2.getInspectionItem().contains("姘ф寚鏁�")) {
+
+                            // 鐗规畩澶勭悊鍒ゆ柇妫�楠岄」鏄惁绛変簬澶栨姢濂楃數瀵肩巼, 鏄殑璇濆彧闇�瑕佷繚鐣欎竴浣嶅皬鏁�
+                        } else if (StringUtils.isNotBlank(sampleProductDto2.getInspectionItemSubclass())
+                                && sampleProductDto2.getInspectionItemSubclass().contains("澶栨姢濂楃數瀵肩巼")) {
+                            BigDecimal bd = new BigDecimal(lastValue);
+                            bd = bd.setScale(1, RoundingMode.HALF_UP);
+                            sampleProductDto2.setLastValue(bd.stripTrailingZeros().toPlainString());
+                        } else {
+                            // 淇敼灏忔暟鐐逛綅鏁版牴鎹姹傚�兼潵
+                            sampleProductDto2.setLastValue(modifyNumber(sampleProductDto2.getAsk(), lastValue));
+                        }
+                    }
+                }
+            }
+            // 鍒ゆ柇鏄惁鏄�  鎷変几寮哄害鍙樺寲鐜�(100鈩冿紝168h)  鍜�  鏂鎷変几搴斿彉鍙樺寲鐜�(100鈩冿紝168h) 闇�瑕佸幓闄ゆ潯浠�
+            if (StrUtil.isNotBlank(sampleProductDto2.getInspectionItemSubclass())
+                    && sampleProductDto2.getInspectionItemSubclass().equals("鎷変几寮哄害鍙樺寲鐜�(100鈩冿紝168h)")) {
+                sampleProductDto2.setInspectionItem("鑰佸寲鍚庢満姊版�ц兘(100鈩冿紝168h)");
+            }
+            if (StrUtil.isNotBlank(sampleProductDto2.getInspectionItemSubclass())
+                    && sampleProductDto2.getInspectionItemSubclass().equals("鏂鎷変几搴斿彉鍙樺寲鐜�(100鈩冿紝168h)")) {
+                sampleProductDto2.setInspectionItem("鑰佸寲鍚庢満姊版�ц兘(100鈩冿紝168h)");
+            }
+        });
+    }
+
+    /**
+     * 娣诲姞缁撳熬
+     * @param text
+     * @param rowRenderData
+     * @param rows
+     */
+    private static void addEnding(List<TextRenderData> text, RowRenderData rowRenderData, List<RowRenderData> rows, int max) {
+        for (int i = 0; i < 2; i++) {
+            TextRenderData endingRenderData = new TextRenderData();
+            endingRenderData.setText("澶囨敞鈭�1999");
+            Style endingStyle = new Style();
+            endingStyle.setFontFamily("瀹嬩綋");
+            endingStyle.setColor("000000");
+            endingRenderData.setStyle(endingStyle);
+            text.add(endingRenderData);
+        }
+
+        for (int i = 0; i < 5 + max - 1; i++) {
+            TextRenderData endingRenderData = new TextRenderData();
+            endingRenderData.setText("鈥溾垰鈥濊〃绀洪」鐩悎鏍�,鈥溍椻�濊〃绀洪」鐩笉鍚堟牸,鈥�-鈥濊〃绀轰笉瑕佸垽瀹氾紝鈥�/鈥濊〃绀烘病鏈夋爣鍑嗚姹傘�侤鈥溾垰鈥� indicates test ltem is qualified,鈥溍椻�� indicates test ltem is unqualified,鈥�-鈥� indicates test ltem judgment is not required,鈥�/鈥� indicates test ltem is no test requirement.鈭�2000");
+            Style endingStyle = new Style();
+            endingStyle.setFontFamily("瀹嬩綋");
+            endingStyle.setColor("000000");
+            endingRenderData.setStyle(endingStyle);
+            text.add(endingRenderData);
+        }
+        TextRenderData[] text3 = text.toArray(new TextRenderData[0]);
+        rowRenderData = Rows.of(text3).center().rowAtleastHeight(1).create();
+        rows.add(rowRenderData);
+    }
+
+    /**
+     * 鍒ゆ柇褰撳墠鍐呭鏄惁鏄瀛﹁鏁版硶
+     * @param str
+     * @return
+     */
+    public static boolean isScientificNotation(String str) {
+        if (StringUtils.isEmpty(str)) {
+            return false;
+        }
+        // 姝e垯琛ㄨ揪寮忓尮閰嶇瀛﹁鏁版硶锛屽寘鎷鏁板拰璐熸暟
+        String regex = "^[+|-]?\\d*[.]?\\d*e[+|-]?\\d+$";
+        Pattern pattern = Pattern.compile(regex);
+        return pattern.matcher(str).matches();
+    }
+
+
+    /**
+     * 淇敼瑕佹眰鎻忚堪鐨勭瀛﹁鏁版硶
+     * @param input
+     */
+    public static String convertToScientificNotation(String input) {
+        // 淇濆瓨鍘熷杈撳叆
+        String originalInput = input;
+
+        // 鍘绘帀闈炵瀛﹁鏁版硶鐨勫瓧绗�
+        String cleanedInput = input.replaceAll("[^0-9eE+-.]", "");
+
+        // 鍒ゆ柇瑕佹眰鎻忚堪鏄惁鏄瀛﹁鏁版硶
+        boolean scientificNotation = isScientificNotation(cleanedInput);
+        if (!scientificNotation) {
+            return input;
+        }
+
+        // 鎵惧嚭琚幓鎺夌殑瀛楃
+        String removedChars = originalInput.replace(cleanedInput, "");
+
+        try {
+            String scientificNotationWithTimes = toScientificNotationWithTimes(cleanedInput);
+            return removedChars + scientificNotationWithTimes;
+        } catch (Exception e) {
+            return input;
+        }
+
+    }
+
+    /**
+     * 灞曠ず鎴愮瀛﹁鏁版硶
+     * @param number
+     * @return
+     */
+    public static String toScientificNotationWithTimes(String number) {
+        Double value = Double.valueOf(number);
+
+        // 鎻愬彇灏忔暟閮ㄥ垎鍜屾寚鏁伴儴鍒�
+        String scientificFormat = String.format("%.1e", value);
+        String[] parts = scientificFormat.split("e");
+
+        // 澶勭悊鏁板瓧閮ㄥ垎鍜屾寚鏁伴儴鍒�
+        String mantissa = parts[0]; // 灏忔暟閮ㄥ垎
+        int exponent = Integer.parseInt(parts[1]); // 鎸囨暟閮ㄥ垎
+
+        String power = "";
+        switch (exponent) {
+            case 2:
+                power = "虏";
+                break;
+            case 3:
+                power = "鲁";
+                break;
+            case 4:
+                power = "鈦�";
+                break;
+            case 5:
+                power = "鈦�";
+                break;
+            case 6:
+                power = "鈦�";
+                break;
+            case 7:
+                power = "鈦�";
+                break;
+            case 8:
+                power = "鈦�";
+                break;
+            case 9:
+                power = "鈦�";
+                break;
+            case 10:
+                power = "鹿鈦�";
+                break;
+            case 11:
+                power = "鹿鹿";
+                break;
+            case 12:
+                power = "鹿虏";
+                break;
+            case 13:
+                power = "鹿鲁";
+                break;
+            case 14:
+                power = "鹿鈦�";
+                break;
+            case 15:
+                power = "鹿鈦�";
+                break;
+            case 16:
+                power = "鹿鈦�";
+                break;
+            case 17:
+                power = "鹿鈦�";
+                break;
+            case 18:
+                power = "鹿鈦�";
+                break;
+            case 19:
+                power = "鹿鈦�";
+                break;
+            case 20:
+                power = "虏鈦�";
+                break;
+
+        }
+
+        // 鏋勫缓鏈�缁堢殑绉戝璁℃暟娉曟牸寮忓瓧绗︿覆
+        return String.format("%s脳10%s", mantissa, power);
+    }
+
+
+    // 鍒ゆ柇鏄惁鏄暟瀛�
+    public static boolean isNumeric(String str) {
+        if (str == null || str.isEmpty()) {
+            return false;
+        }
+        try {
+            Double.parseDouble(str); // 灏濊瘯灏嗗瓧绗︿覆瑙f瀽涓哄弻绮惧害娴偣鏁�
+            return true;
+        } catch (NumberFormatException e) {
+            return false; // 瑙f瀽澶辫触鍒欒繑鍥瀎alse
+        }
+    }
+
+    /**
+     * 鏍规嵁瑕佹眰鎻忚堪淇濈暀缁撴灉灏忔暟鐐逛綅鏁�
+     * @param reference
+     * @param value
+     * @return
+     */
+    public static String modifyNumber(String reference, String value) {
+        if (reference.equals("/") || reference.equals("-") || reference.equals("鈥�")) {
+            // 涓嶅垽瀹氶粯璁や繚鐣欎竴浣嶅皬鏁� > 榛樿灏忔暟浣�
+//            BigDecimal bd = new BigDecimal(value);
+//            bd = bd.setScale(1, RoundingMode.HALF_UP);
+            return value;
+        }
+
+        // 鍒ゆ柇鏄惁鏄暟瀛�
+        if (!isNumeric(value)) {
+            try {
+                // 鍙兘鏄墹95.1A杩欐牱鐨�, 闇�瑕佹埅鍙栦繚鐣欎綅鏁�
+                // 浣跨敤姝e垯琛ㄨ揪寮忔彁鍙栨暟瀛楅儴鍒�
+                String numberPart = value.replaceAll("[^0-9.]", "");
+                // 灏嗘暟瀛楅儴鍒嗘浛鎹㈡垚鍗犱綅绗�
+                String withPlaceholder = value.replaceAll(numberPart, "**");
+                // 鎻愬彇灏忔暟鐐逛綅鏁�
+                int decimalPlaces = getDecimalPlaces(reference);
+                // 澶勭悊绗簩涓瓧绗︿覆
+                BigDecimal number = new BigDecimal(numberPart);
+                number = number.setScale(decimalPlaces, RoundingMode.HALF_UP);
+                // 绛変簬0闇�瑕佽繘涓�姝ュ鐞�
+                if (number.compareTo(BigDecimal.ZERO) == 0) {
+                    return formatNumber(value, decimalPlaces);
+                }
+                // 灏嗗崰浣嶇鏇挎崲鎴愭寚瀹氭暟瀛�
+                String finalResult = withPlaceholder.replace("**", number.toString());
+                return finalResult;
+            } catch (Exception e) {
+                return value;
+            }
+        }
+
+        // 鎻愬彇灏忔暟鐐逛綅鏁�
+        int decimalPlaces = getDecimalPlaces(reference);
+
+        // 澶勭悊绗簩涓瓧绗︿覆
+        BigDecimal number = new BigDecimal(value);
+        number = number.setScale(decimalPlaces, RoundingMode.HALF_UP);
+
+        // 绛変簬0闇�瑕佽繘涓�姝ュ鐞�
+        if (number.compareTo(BigDecimal.ZERO) == 0) {
+            return formatNumber(value, decimalPlaces);
+        }
+
+        return number.toString();
+    }
+
+
+    private static int getDecimalPlaces(String str) {
+        // 鏌ユ壘灏忔暟鐐逛綅缃�
+        int decimalPointIndex = str.lastIndexOf('.');
+
+        if (decimalPointIndex == -1) {
+            // 濡傛灉娌℃湁灏忔暟鐐癸紝杩斿洖0浣嶅皬鏁�
+            return 0;
+        }
+
+        // 璁$畻灏忔暟鐐瑰悗鐨勪綅鏁�
+        return str.length() - decimalPointIndex - 1;
+    }
+
+    /**
+     * 淇濈暀浣嶆暟, 濡傛灉绛変簬0 杩斿洖鎵惧埌鐨勪竴涓潪0浣嶆暟
+     * @param number 褰撳墠鏁板瓧
+     * @param scale  鍘熸湰淇濈暀鐨勪綅鏁�
+     * @return
+     */
+    public static String formatNumber(String number, int scale) {
+        // 灏嗚緭鍏ョ殑瀛楃涓茶浆鎹负 BigDecimal
+        BigDecimal bd = new BigDecimal(number);
+
+        // 淇濈暀鎸囧畾鐨勫皬鏁颁綅鏁帮紝骞朵娇鐢ㄥ洓鑸嶄簲鍏ユā寮�
+        bd = bd.setScale(scale, RoundingMode.HALF_UP);
+
+        // 妫�鏌ヤ繚鐣欑殑灏忔暟鏄惁绛変簬 0
+        if (bd.stripTrailingZeros().scale() <= 0) {
+            // 闇�瑕佹壘鍒扮涓�涓笉涓� 0 鐨勫皬鏁颁綅
+            String decimalPart = number.substring(number.indexOf('.') + 1);
+            int firstNonZeroIndex = findFirstNonZeroIndex(decimalPart);
+
+            if (firstNonZeroIndex != -1) {
+                // 璁$畻闇�瑕佷繚鐣欑殑灏忔暟浣嶆暟
+                int newScale = firstNonZeroIndex + 1;
+                bd = new BigDecimal(number).setScale(newScale, RoundingMode.HALF_UP);
+            }
+        }
+
+        return bd.toString();
+    }
+
+    private static int findFirstNonZeroIndex(String decimalPart) {
+        for (int i = 0; i < decimalPart.length(); i++) {
+            if (decimalPart.charAt(i) != '0') {
+                return i;
+            }
+        }
+        return -1; // 濡傛灉娌℃湁鎵惧埌闈為浂鐨勬暟瀛�
+    }
+
+    /**
+     * 淇濆瓨鍏冩闃块噷杩涜揣楠岃瘉鍘熷璁板綍
+     * @param insOrderId 璁㈠崟Id
+     * @param examineUserId  澶嶆牳浜篒d
+     * @param writeUserId  妫�楠屽憳Id
+     */
+    private void reportFactoryVerify(Integer insOrderId, Integer examineUserId, Integer writeUserId) {
+        // 鏌ヨ杩涜揣楠岃瘉鍘熷璁板綍
+        InsOrderFactoryVerify factoryVerify = insOrderFactoryVerifyMapper.selectOne(Wrappers.<InsOrderFactoryVerify>lambdaQuery()
+                .eq(InsOrderFactoryVerify::getInsOrderId, insOrderId)
+                .last("limit 1"));
+
+        // 娌℃湁灏辩粨鏉�
+        if (factoryVerify == null) {
+            return;
+        }
+
+        //1.鏉愭枡鍚嶇О
+        factoryVerify.setBasicName(this.formatBasic(factoryVerify.getBasicName()));
+        //2.瑙勬牸鍨嬪彿
+        factoryVerify.setBasicModel(this.formatBasic(factoryVerify.getBasicModel()));
+        //3.鏉愭枡鎵瑰彿
+        factoryVerify.setBasicBatchNo(this.formatBasic(factoryVerify.getBasicBatchNo()));
+        //4.鎵ц鏍囧噯
+        factoryVerify.setBasicStandard(this.formatBasic(factoryVerify.getBasicStandard()));
+        //5.鐢熶骇鏃ユ湡
+        factoryVerify.setBasicDate(this.formatBasic(factoryVerify.getBasicDate()));
+        //6.渚涜揣鏁伴噺
+        factoryVerify.setBasicNumber(this.formatBasic(factoryVerify.getBasicNumber()));
+        //7.鏉愭枡鍚嶇О
+        factoryVerify.setBasicColor(this.formatBasic(factoryVerify.getBasicColor()));
+
+        //8.鍏朵粬
+        // 鍐呭
+        if (factoryVerify.getBasicOtherValue() == null) {
+            factoryVerify.setBasicOtherValue("");
+        }
+        // 鍊�
+        if (factoryVerify.getBasicOther() == null) {
+            factoryVerify.setBasicOther("");
+        }
+        switch (factoryVerify.getBasicOther()) {
+            case "1":
+                factoryVerify.setBasicOther("鈽戠鍚�  鈻′笉绗﹀悎");
+                break;
+            case "2":
+                factoryVerify.setBasicOther("鈻$鍚�  鈽戜笉绗﹀悎");
+                break;
+            default:
+                factoryVerify.setBasicOther("鈻$鍚�  鈻′笉绗﹀悎");
+        }
+
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        String declareDate = factoryVerify.getDeclareDate().format(formatter);
+
+        // 淇敼楠岃瘉椤圭洰
+        List<InsOrderFactoryVerifyItem> verifyItems = insOrderFactoryVerifyItemService.list(Wrappers.<InsOrderFactoryVerifyItem>lambdaQuery()
+                .eq(InsOrderFactoryVerifyItem::getFactoryVerifyId, factoryVerify.getFactoryVerifyId())
+                .orderByAsc(InsOrderFactoryVerifyItem::getSort));
+
+        for (InsOrderFactoryVerifyItem verifyItem : verifyItems) {
+            if (verifyItem.getResult() == null) {
+                verifyItem.setResult("");
+            }
+            switch (verifyItem.getResult()) {
+                case "1":
+                    verifyItem.setResult("鈽戠鍚�    鈻′笉绗﹀悎    鈻′笉閫傜敤");
+                    break;
+                case "2":
+                    verifyItem.setResult("鈻$鍚�    鈽戜笉绗﹀悎    鈻′笉閫傜敤");
+                    break;
+                case "3":
+                    verifyItem.setResult("鈻$鍚�    鈻′笉绗﹀悎    鈽戜笉閫傜敤");
+                    break;
+                default:
+                    verifyItem.setResult("鈻$鍚�    鈻′笉绗﹀悎    鈻′笉閫傜敤");
+            }
+        }
+
+        //鑾峰彇鎻愪氦浜虹殑绛惧悕鍦板潃
+        String writeUrl;
+        try {
+            writeUrl = userMapper.selectById(writeUserId).getSignatureUrl();
+        } catch (Exception e) {
+            throw new ErrorException("鎵句笉鍒扮紪鍒朵汉鐨勭鍚�");
+        }
+        if (ObjectUtils.isEmpty(writeUrl) || writeUrl.equals("")) {
+            throw new ErrorException("鎵句笉鍒版楠屼汉鐨勭鍚�");
+        }
+
+        //鑾峰彇澶嶆牳浜虹殑绛惧悕鍦板潃
+        String examineUrl;
+        try {
+            examineUrl = userMapper.selectById(examineUserId).getSignatureUrl();
+        } catch (Exception e) {
+            throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+        }
+        if (ObjectUtils.isEmpty(examineUrl) || examineUrl.equals("")) {
+            throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+        }
+
+
+        InputStream inputStream = this.getClass().getResourceAsStream("/static/factory_verify.docx");
+        ConfigureBuilder builder = Configure.builder();
+        builder.useSpringEL(true);
+
+        XWPFTemplate template = XWPFTemplate.compile(inputStream, builder.build()).render(
+                new HashMap<String, Object>() {{
+                    put("report", factoryVerify);
+                    put("declareDate", declareDate);
+                    put("factoryVerifyItemList", verifyItems);
+                    put("writeUrl", Pictures.ofLocal(imgUrl + "/" + writeUrl).create());
+                    put("examineUrl", Pictures.ofLocal(imgUrl + "/" + examineUrl).create());
+                    put("writeDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(null)).create());
+                    put("examineDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(null)).create());
+                }});
+
+        MultipartFile multipartFile = xwpfDocumentToMockMultipartFile(template.getXWPFDocument());
+
+        // 淇濆瓨鍒伴檮浠堕噷闈�
+        uploadFile(insOrderId, multipartFile);
+
+    }
+
+    /**
+     * XWPFDocument 杞� MultipartFile(MockMultipartFile)
+     *
+     * @param document 鏂囨。瀵硅薄
+     * @return
+     */
+    public static MultipartFile xwpfDocumentToMockMultipartFile(XWPFDocument document) {
+        String fileName = "鍘熸潗鏂欒繘璐ч獙璇佽褰�.docx";
+        try {
+            String contentType = "text/plain";
+            ByteArrayOutputStream bos = new ByteArrayOutputStream();
+            document.write(bos);
+            //XWPFDocument 杞� byte[]
+            byte[] barray = bos.toByteArray();
+            //byte[] 杞� InputStream
+            InputStream is = new ByteArrayInputStream(barray);
+            //InputStream 杞� MultipartFile
+            MultipartFile multipartFile = new MockMultipartFile(fileName, fileName, contentType, is);
+            return multipartFile;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+
+    /**
+     * 鏍煎紡鍖栬繘鍘傞獙璇佸唴瀹�
+     * @param basicType
+     * @return
+     */
+    private String formatBasic(String basicType) {
+        if (basicType == null) {
+            basicType = "";
+        }
+
+        //鏍煎紡鍖栧瓧娈�
+        String basic = "";
+        switch (basicType) {
+            case "1":
+                basic = "鈽戠鍚�  鈻′笉绗﹀悎  鈻′笉閫傜敤";
+                break;
+            case "2":
+                basic = "鈻$鍚�  鈽戜笉绗﹀悎  鈻′笉閫傜敤";
+                break;
+            case "3":
+                basic = "鈻$鍚�  鈻′笉绗﹀悎  鈽戜笉閫傜敤";
+                break;
+            default:
+                basic = "鈻$鍚�  鈻′笉绗﹀悎  鈻′笉閫傜敤";
+        }
+
+        return basic;
+    }
+
+    /**
+     * word杞崲pdf
+     * @param path
+     * @return
+     */
+    @Override
+    public String wordToPdfTemp(String path) {
+        try {
+            return wordToPdf(path, path.replace(".docx", "-涓存椂.pdf"));
+        } catch (Exception e) {
+            throw new ErrorException("杞崲澶辫触");
+        }
+    }
+
+    private 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鏂囦欢
+            com.aspose.words.Document doc = new com.aspose.words.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;
+    }
+
+    /**
+     * 娣诲姞宸ユ椂
+     * @param userId
+     * @param insProduct
+     * @param insOrder
+     */
+    private synchronized void addAuxiliary(Integer userId, InsProduct insProduct, InsOrder insOrder) {
+        if (insProduct.getIsBinding().equals(1)) {
+            return;
+        }
+
+        //棣栧厛鍒ゆ柇褰撳墠浜虹殑褰撳墠鏃堕棿鏄惁鏄帓鐝椂闂村唴,濡傛灉涓嶆槸灏辨槸鍔犵彮
+        LocalDateTime today = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT);
+
+        //鏍¢獙濡傛灉杩欎釜浜鸿繖涓娴嬮」鐩凡缁忔坊鍔犺繃浜�
+        List<AuxiliaryOutputWorkingHours> count2s = auxiliaryOutputWorkingHoursMapper.selectList(Wrappers.<AuxiliaryOutputWorkingHours>lambdaQuery()
+                .eq(AuxiliaryOutputWorkingHours::getCheck, userId)
+                .eq(AuxiliaryOutputWorkingHours::getInsProductId, insProduct.getId()));
+        if (CollectionUtils.isNotEmpty(count2s)) {
+            auxiliaryOutputWorkingHoursMapper.deleteBatchIds(count2s.stream().map(auxiliaryOutputWorkingHours -> auxiliaryOutputWorkingHours.getId()).collect(Collectors.toList()));
+        }
+        if (ObjectUtils.isNotEmpty(insProduct.getManHour()) && StringUtils.isNotBlank(insProduct.getLastValue())) {
+            AuxiliaryOutputWorkingHours auxiliaryOutputWorkingHours = new AuxiliaryOutputWorkingHours();
+            auxiliaryOutputWorkingHours.setInspectionItemClass(insProduct.getInspectionItemClass());//妫�娴嬮」鍒嗙被
+            auxiliaryOutputWorkingHours.setInspectionItem(insProduct.getInspectionItem());//妫�娴嬬埗椤�
+            auxiliaryOutputWorkingHours.setInspectionItemSubclass(insProduct.getInspectionItemSubclass());//妫�娴嬪瓙椤�
+            auxiliaryOutputWorkingHours.setSample(insSampleMapper.selectById(insProduct.getInsSampleId()).getSampleCode());//鏍峰搧缂栧彿
+            auxiliaryOutputWorkingHours.setOrderId(insOrder.getId());//璁㈠崟id
+            auxiliaryOutputWorkingHours.setOrderNo(insOrder.getEntrustCode());//闈炲姞鐝鎵樺崟鍙�
+            auxiliaryOutputWorkingHours.setWorkTime(insProduct.getManHour());//闈炲姞鐝伐鏃�
+            auxiliaryOutputWorkingHours.setAmount(1);//闈炲姞鐝暟閲�
+            auxiliaryOutputWorkingHours.setOutputWorkTime((ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getOvertimeWorkTime()) ? auxiliaryOutputWorkingHours.getOvertimeWorkTime() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getWorkTime()) ? auxiliaryOutputWorkingHours.getWorkTime() : BigDecimal.ZERO));//浜ч噺宸ユ椂
+            auxiliaryOutputWorkingHours.setManHourGroup(insProduct.getManHourGroup());//宸ユ椂鍒嗙粍
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            DateTimeFormatter formatters = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+            auxiliaryOutputWorkingHours.setDateTime(LocalDateTime.now().toLocalDate().atStartOfDay().format(formatters));//鏃ユ湡
+            LocalDateTime localDateTime = LocalDateTime.now();
+            DateTime parse = DateUtil.parse(localDateTime.format(formatter));
+            auxiliaryOutputWorkingHours.setWeekDay(getWeek(localDateTime.format(formatters)));//鏄熸湡
+            auxiliaryOutputWorkingHours.setWeek(String.valueOf(DateUtil.weekOfYear(DateUtil.offsetDay(parse, 1))));//鍛ㄦ
+            auxiliaryOutputWorkingHours.setCheck(userId);//妫�娴嬩汉
+            auxiliaryOutputWorkingHours.setPrice(insProduct.getPrice());//鍗曚环
+            auxiliaryOutputWorkingHours.setSampleId(insProduct.getInsSampleId());//鏍峰搧id
+            auxiliaryOutputWorkingHours.setInsProductId(insProduct.getId());//妫�楠岄」id
+
+            auxiliaryOutputWorkingHoursMapper.insert(auxiliaryOutputWorkingHours);
+
+        }
+    }
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderStandardTemplateServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderStandardTemplateServiceImpl.java
new file mode 100644
index 0000000..3bf2e55
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderStandardTemplateServiceImpl.java
@@ -0,0 +1,19 @@
+package com.ruoyi.inspect.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.inspect.mapper.InsOrderStandardTemplateMapper;
+import com.ruoyi.inspect.pojo.InsOrderStandardTemplate;
+import com.ruoyi.inspect.service.InsOrderStandardTemplateService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 璁㈠崟鏍囧噯妯℃澘澶嶅埗
+ *
+ * @author zhuo
+ * @since 2024-11-05
+ */
+@Service
+public class InsOrderStandardTemplateServiceImpl extends ServiceImpl<InsOrderStandardTemplateMapper, InsOrderStandardTemplate> implements InsOrderStandardTemplateService {
+
+}
+
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..6c7dc54
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsUnPassServiceImpl.java
@@ -0,0 +1,31 @@
+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) {
+        return insUnPassMapper.pageInsUnPass(page, QueryWrappers.queryWrappers(unPassPageDto));
+    }
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsUnqualifiedRetestProductServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsUnqualifiedRetestProductServiceImpl.java
new file mode 100644
index 0000000..52edb38
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsUnqualifiedRetestProductServiceImpl.java
@@ -0,0 +1,19 @@
+package com.ruoyi.inspect.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.inspect.mapper.InsUnqualifiedRetestProductMapper;
+import com.ruoyi.inspect.pojo.InsUnqualifiedRetestProduct;
+import com.ruoyi.inspect.service.InsUnqualifiedRetestProductService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 涓嶅悎鏍兼楠岄」鐩娴�
+ *
+ * @author zhuo
+ * @since 2024-09-03
+ */
+@Service
+public class InsUnqualifiedRetestProductServiceImpl extends ServiceImpl<InsUnqualifiedRetestProductMapper, InsUnqualifiedRetestProduct> implements InsUnqualifiedRetestProductService {
+
+}
+
diff --git a/inspect-server/src/main/resources/mapper/InsOrderDeviceRecordMapper.xml b/inspect-server/src/main/resources/mapper/InsOrderDeviceRecordMapper.xml
new file mode 100644
index 0000000..af17e04
--- /dev/null
+++ b/inspect-server/src/main/resources/mapper/InsOrderDeviceRecordMapper.xml
@@ -0,0 +1,23 @@
+<?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.inspect.mapper.InsOrderDeviceRecordMapper">
+
+    <!-- 璁㈠崟id鏌ヨ璁惧浣跨敤璁板綍 -->
+    <select id="selectDeviceNumber" resultType="com.ruoyi.inspect.dto.InsOrderDeviceRecordDto">
+        select dr.*,
+               d.management_number
+        from device_record dr
+                 left join device d on d.id = dr.device_id
+        where dr.ins_order_id = #{insOrderId}
+    </select>
+
+    <!-- 鏍规嵁缂栧彿鏌ヨ璁惧id -->
+    <select id="selectDeviceIdsByNumbers" resultType="java.lang.Integer">
+        select id
+        from device
+        where management_number in
+        <foreach collection="deviceNumbers" index="index" open="(" separator="," close=")" item="val">
+            #{val}
+        </foreach>
+    </select>
+</mapper>
diff --git a/inspect-server/src/main/resources/mapper/InsOrderFileMapper.xml b/inspect-server/src/main/resources/mapper/InsOrderFileMapper.xml
new file mode 100644
index 0000000..ce5e6c2
--- /dev/null
+++ b/inspect-server/src/main/resources/mapper/InsOrderFileMapper.xml
@@ -0,0 +1,15 @@
+<?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.inspect.mapper.InsOrderFileMapper">
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <select id="getFileList" resultType="com.ruoyi.inspect.pojo.InsOrderFile">
+        select A.*
+        from (select iof.*, name
+              from ins_order_file iof
+                       left join user u on iof.create_user = u.id
+              where iof.ins_order_id = #{insOrderId}) A
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/inspect-server/src/main/resources/mapper/InsProductResultMapper.xml b/inspect-server/src/main/resources/mapper/InsProductResultMapper.xml
new file mode 100644
index 0000000..0a42c74
--- /dev/null
+++ b/inspect-server/src/main/resources/mapper/InsProductResultMapper.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.inspect.mapper.InsProductResultMapper">
+    <resultMap id="BaseResultMap" type="com.ruoyi.inspect.pojo.InsProductResult">
+        <id property="id" column="id" jdbcType="INTEGER"/>
+        <result property="insProductId" column="ins_product_id" jdbcType="INTEGER"/>
+        <result property="insValue" column="ins_value" jdbcType="VARCHAR"/>
+        <result property="comValue" column="com_value" jdbcType="VARCHAR"/>
+        <result property="equipValue" column="equip_value" jdbcType="VARCHAR"/>
+        <result property="createUser" column="create_user" jdbcType="INTEGER"/>
+        <result property="updateUser" column="update_user" jdbcType="INTEGER"/>
+        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+        <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <select id="selDetail" resultMap="BaseResultMap">
+        select *
+        from ins_product_result
+        where 1=1
+            <!--and ins_product_id in (#{ips})-->
+        <if test="ips != null and ips.size() > 0">
+            <!-- 浣跨敤foreach鍏冪礌鏋勫缓IN瀛愬彞 -->
+            and ins_product_id in
+            <foreach item="item" collection="ips" open="(" separator="," close=")">
+                #{item}
+            </foreach>
+        </if>
+    </select>
+
+    <!-- 鏍规嵁璁㈠崟id鏌ヨ妫�楠岀粨鏋� -->
+    <select id="selectResultByOrderId" resultType="com.ruoyi.inspect.pojo.InsProductResult">
+        select ipr.equip_value
+        from ins_product_result ipr
+                 left join ins_product ip on ip.id = ipr.ins_product_id
+                 left join ins_sample is2 on is2.id = ip.ins_sample_id
+        where is2.ins_order_id = #{orderId}
+    </select>
+</mapper>
diff --git a/inspect-server/src/main/resources/mapper/InsUnPassMapper.xml b/inspect-server/src/main/resources/mapper/InsUnPassMapper.xml
new file mode 100644
index 0000000..8a22fe9
--- /dev/null
+++ b/inspect-server/src/main/resources/mapper/InsUnPassMapper.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.inspect.mapper.InsUnPassMapper">
+
+    <select id="pageInsUnPass" resultType="com.ruoyi.inspect.dto.UnPassPageDto">
+        SELECT * FROM
+            ins_un_pass iu
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>
diff --git a/performance-server/src/main/resources/mapper/PerformanceShiftMapper.xml b/performance-server/src/main/resources/mapper/PerformanceShiftMapper.xml
index 64b3dfc..56bd55b 100644
--- a/performance-server/src/main/resources/mapper/PerformanceShiftMapper.xml
+++ b/performance-server/src/main/resources/mapper/PerformanceShiftMapper.xml
@@ -11,6 +11,7 @@
 
     <select id="performanceShiftPage" resultMap="performanceShiftPageMap">
         SELECT
+        u2.name name,
         GROUP_CONCAT(s.work_time, '锛�', s.shift, '锛�', s.id order by s.work_time SEPARATOR ';') AS shift_time, u2.id user_id
         FROM performance_shift s
         LEFT JOIN (SELECT distinct u.* from
@@ -62,6 +63,7 @@
 
     <select id="performanceShiftYear" resultType="java.util.Map">
         SELECT
+        u2.name name,
         s.user_id, u2.account,
         DATE_FORMAT(s.work_time, '%c') work_time,
         GROUP_CONCAT(DATE_FORMAT(s.work_time, '%c'), '锛�', s.shift order by s.work_time SEPARATOR ';') month_str
@@ -90,6 +92,7 @@
 
     <select id="performanceShiftYearList" resultType="map">
         SELECT
+        u.name name,
         s.user_id, u.account,
         DATE_FORMAT(s.work_time, '%c') work_time,
         GROUP_CONCAT(DATE_FORMAT(s.work_time, '%c'), '锛�', s.shift order by s.work_time SEPARATOR ';') month_str
@@ -111,7 +114,8 @@
 
     <select id="performanceShiftList" resultMap="performanceShiftPageMap">
         SELECT
-        GROUP_CONCAT(s.work_time, '锛�', s.shift, '锛�', s.id order by s.work_time SEPARATOR ';') AS shift_time, u.id user_id, u.department
+        u.name name,
+        GROUP_CONCAT(s.work_time, '锛�', s.shift, '锛�', s.id order by s.work_time SEPARATOR ';') AS shift_time, u.id user_id
         FROM performance_shift s
         LEFT JOIN user u on u.id = s.user_id
         <where>

--
Gitblit v1.9.3