From bd1137319f16fcb2750333aeb37366aff0ec4ef9 Mon Sep 17 00:00:00 2001
From: zhuo <2089219845@qq.com>
Date: 星期二, 18 二月 2025 11:51:51 +0800
Subject: [PATCH] 检验下单移植

---
 inspect-server/src/main/resources/mapper/RawMaterialOrderTemplateMapper.xml                  |    4 
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java                    |    2 
 ruoyi-framework/src/main/java/com/ruoyi/framework/config/FormatterConfig.java                |   51 
 ruoyi-common/src/main/java/com/ruoyi/common/utils/DateImageUtil.java                         |   61 
 inspect-server/src/main/resources/mapper/InsUnqualifiedRetestProductMapper.xml               |  200 +
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java | 1686 ++++----
 inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java            |  617 +-
 inspect-server/src/main/resources/mapper/InsOrderStateMapper.xml                             |    4 
 ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java                                    |    2 
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderTemplateMapper.java            |   18 
 inspect-server/src/main/resources/mapper/InsOrderMapper.xml                                  |  588 +++
 inspect-server/src/main/resources/mapper/InsReportMapper.xml                                 |   66 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java         | 2100 ++++++------
 performance-server/src/main/resources/mapper/PerformanceShiftMapper.xml                      |   19 
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnqualifiedHandlerMapper.java       |   38 
 ruoyi-system/src/main/java/com/ruoyi/system/service/UserService.java                         |   10 
 inspect-server/pom.xml                                                                       |   16 
 inspect-server/src/main/java/com/ruoyi/inspect/dto/UnqualifiedHandlerDto.java                |  148 
 inspect-server/src/main/java/com/ruoyi/inspect/pojo/CommonOa.java                            |   61 
 inspect-server/src/main/resources/mapper/InsOrderTemplateMapper.xml                          |    4 
 inspect-server/src/main/resources/mapper/InsUnqualifiedHandlerMapper.xml                     |   87 
 inspect-server/src/main/resources/mapper/InsSampleMapper.xml                                 |  699 ++++
 inspect-server/src/main/resources/mapper/SpotCheckQuarterItemMapper.xml                      |    4 
 ruoyi-admin/pom.xml                                                                          |   12 
 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/Result.java                          |   12 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderTemplateServiceImpl.java |   57 
 inspect-server/src/main/resources/mapper/InsProductMapper.xml                                |  144 
 ruoyi-admin/src/main/resources/application.yml                                               |   12 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java                |   14 
 inspect-server/src/main/java/com/ruoyi/inspect/controller/RawMaterialOrderController.java    |  628 +-
 inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderTemplateService.java          |   23 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsProductServiceImpl.java       |  221 +
 inspect-server/src/main/java/com/ruoyi/inspect/service/InsProductService.java                |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserServiceImpl.java                |   13 
 ruoyi-admin/src/main/resources/application-druid.yml                                         |  159 
 inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java        | 2318 ++++++------
 inspect-server/src/main/resources/mapper/InsSampleUserMapper.xml                             |    4 
 ruoyi-system/src/main/resources/mapper/system/UserMapper.xml                                 |   32 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserMapper.java                           |   11 
 inspect-server/src/main/resources/mapper/InsProductUserMapper.xml                            |    4 
 inspect-server/src/main/java/com/ruoyi/inspect/service/RawMaterialOrderService.java          |    1 
 41 files changed, 6,372 insertions(+), 3,781 deletions(-)

diff --git a/inspect-server/pom.xml b/inspect-server/pom.xml
index 0484757..9781406 100644
--- a/inspect-server/pom.xml
+++ b/inspect-server/pom.xml
@@ -47,6 +47,22 @@
             <groupId>com.deepoove</groupId>
             <artifactId>poi-tl</artifactId>
         </dependency>
+
+        <!--word杞琾df-->
+        <!--D:\JavaWork\center-lims-after\inspect-server\src\main\resources\lib-->
+        <!--mvn install:install-file -Dfile=aspose-words-15.12.0-jdk16.jar -DgroupId=com.aspose -DartifactId=aspose-words -Dversion=15.12.0 -Dpackaging=jar-->
+        <dependency>
+            <groupId>com.aspose</groupId>
+            <artifactId>aspose-words</artifactId>
+            <version>15.12.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itextpdf</artifactId>
+            <version>5.0.6</version>
+        </dependency>
+
+        
     </dependencies>
 
     <properties>
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
index a0cec57..e65b4ea 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
@@ -1,307 +1,310 @@
-//package com.ruoyi.basic.controller;
-//
-//import com.alibaba.fastjson.JSON;
-//import com.alibaba.fastjson.JSONArray;
-//import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-//import com.ruoyi.basic.mapper.IfsInventoryQuantityMapper;
-//import com.ruoyi.common.core.domain.Result;
-//import com.ruoyi.inspect.dto.OmitOrderProductDto;
-//import com.ruoyi.inspect.dto.SampleOrderDto;
-//import com.ruoyi.inspect.service.InsOrderService;
-//import io.swagger.annotations.Api;
-//import io.swagger.annotations.ApiImplicitParam;
-//import io.swagger.annotations.ApiImplicitParams;
-//import io.swagger.annotations.ApiOperation;
-//import lombok.AllArgsConstructor;
-//import org.springframework.scheduling.annotation.Scheduled;
-//import org.springframework.web.bind.annotation.*;
-//
-//import javax.servlet.http.HttpServletResponse;
-//import java.time.LocalDateTime;
-//import java.time.format.DateTimeFormatter;
-//import java.util.List;
-//import java.util.Map;
-//import java.util.Objects;
-//
-//@RestController
-//@AllArgsConstructor
-//@RequestMapping("/insOrder")
-//@Api(tags="妫�楠屽崟妯″潡")
-//public class InsOrderController {
-//
-//    private InsOrderService insOrderService;
-//
-//    private InsSampleService insSampleService;
-//
-//    private InsProductService insProductService;
-//
-//    private IfsInventoryQuantityMapper ifsInventoryQuantityMapper;
-//
-//    private InsOrderTemplateService insOrderTemplateService;
-//
-//    //鑾峰彇妫�楠屼笅鍗曟暟鎹�
-//    @ApiOperation(value = "鏌ヨ鍗曚綅妫�楠屽崟")
-//    @PostMapping("/selectInsOrderParameter")
-//    public Result selectInsOrderParameter(@RequestBody Map<String, Object> data) throws Exception {
-//        Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
-//        SampleOrderDto sampleOrderDto = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), SampleOrderDto.class);
-//        return Result.success(insOrderService.selectInsOrderParameter(page, sampleOrderDto));
-//    }
-//
-//    //鐢ㄤ簬妫�楠屼笅鍗曞尯鍒煡鐪嬫墍鏈夎鍗曞拰鍙煡鐪嬪悓涓�涓鎵樺崟浣嶇殑璁㈠崟
-//    @ApiOperation(value = "鏌ヨ鎵�鏈夋楠屽崟")
-//    @PostMapping("/selectAllInsOrderParameter")
-//    public Result selectAllInsOrderParameter() {
-//        return Result.success();
-//    }
-//
-//
-//    @ApiOperation(value = "妫�楠屽垎閰�")
-//    @PostMapping("/upInsOrder")
-//    public Result<?> upInsOrder(Integer orderId, Integer sampleId, String appointed, Integer userId,String sonLaboratory) {
-//        return Result.success(insOrderService.upInsOrder(orderId, sampleId, appointed, userId,sonLaboratory));
-//    }
-//
-//    @ApiOperation(value = "娣诲姞妫�楠屼笅鍗曟暟鎹�")
-//    @PostMapping("/addInsOrder")
-//    public Result<?> addInsOrder(String str) {
-//        Map<String, Object> map = JSON.parseObject(str, Map.class);
-//        JSONArray jsonArray = JSON.parseArray(map.get("list")+"");
-//        List<SampleProductDto> list = jsonArray.toJavaList(SampleProductDto.class);
-//        InsOrder insOrder = JSON.parseObject(JSON.toJSONString(map.get("insOrder")), InsOrder.class);
-//        List<List<Integer>> pairing = JSON.parseArray(map.get("pairing")+"");
-//        return Result.success(insOrderService.addInsOrder(list, insOrder, pairing));
-//    }
-//
-//    @ApiOperation(value = "鏌ヨ璁㈠崟鏈�闀块璁℃椂闂�")
-//    @PostMapping("/selectOrderManDay")
-//    public Result<?> selectOrderManDay(Integer id) {
-//        int day = insProductService.selectOrderManDay(id);
-//        return Result.success("鎴愬姛", LocalDateTime.now().plusHours(day).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
-//    }
-//
-//    @ApiOperation(value = "鏌ヨ妫�楠屼笅鍗曞唴瀹硅鎯�")
-//    @PostMapping("/getInsOrder")
-//    public Result<?> getInsOrder(Integer orderId) {
-//        return Result.success(insOrderService.getInsOrder(orderId));
-//    }
-//    @ValueClassify("妫�楠屼笅鍗�")
-//    @ApiOperation(value = "瀹℃牳妫�楠屽崟杩涜鐘舵�佷慨鏀�")
-//    @ApiImplicitParams({
-//            @ApiImplicitParam(name = "id", value = "妫�楠屽崟id", dataTypeClass = Integer.class),
-//            @ApiImplicitParam(name = "state", value = "瀹℃牳缁撴灉 1:閫氳繃 2锛氫笉閫氳繃", dataTypeClass = Integer.class)
-//    })
-//
-//    @PostMapping("/upInsOrderOfState")
-//    public Result<?> upInsOrderOfState(@RequestBody InsOrder insOrder) {
-//        return Result.success(insOrderService.upInsOrderOfState(insOrder));
-//    }
-//
-//    @ApiOperation(value = "娣诲姞妫�楠屽崟妯℃澘")
-//    @PostMapping("/addInsOrderTemplate")
-//    public Result<?> addInsOrderTemplate(@RequestBody InsOrderTemplate insOrderTemplate) {
-//        return Result.success(insOrderTemplateService.addInsOrderTemplate(insOrderTemplate));
-//    }
-//
-//    @ApiOperation(value = "鏌ヨ妫�楠屽崟妯℃澘")
-//    @GetMapping("/selectInsOrderTemplate")
-//    public Result<?> selectInsOrderTemplate(String company) {
-//        return Result.success(insOrderTemplateService.selectInsOrderTemplate(company));
-//    }
-//
-//    @ApiOperation(value = "閫氳繃妫�楠屽崟妯℃澘id鑾峰彇妫�楠屽崟妯℃澘鍐呭")
-//    @PostMapping("/selectInsOrderTemplateById")
-//    public Result<?> selectInsOrderTemplateById(Integer id) {
-//        return Result.success("鎴愬姛", insOrderTemplateService.selectInsOrderTemplateById(id));
-//    }
-//
-//    @ApiOperation(value = "鍒犻櫎妫�楠屽崟妯℃澘")
-//    @PostMapping("/delInsOrderTemplate")
-//    public Result<?> delInsOrderTemplate(Integer id) {
-//        return Result.success(insOrderTemplateService.delInsOrderTemplate(id));
-//    }
-//
-//    @ApiOperation(value = "閫氳繃妫�楠屽崟鏌ヨ妫�楠屾暟鎹紙鏁版嵁鏌ョ湅锛�")
-//    @PostMapping("/selectSampleAndProductByOrderId")
-//    public Result<?> selectSampleAndProductByOrderId(@RequestBody Map<String, Object> data) throws Exception {
-//        Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
-//        SampleProductDto2 sampleProductDto = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), SampleProductDto2.class);
-//        return Result.success(insOrderService.selectSampleAndProductByOrderId(page, sampleProductDto));
-//    }
-//
-//    @ApiOperation(value = "璐圭敤缁熻")
-//    @PostMapping("/costStatistics")
-//    public Result<?> costStatistics(@RequestBody Map<String, Object> data) throws Exception {
-//        Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
-//        CostStatisticsDto costStatisticsDto = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), CostStatisticsDto.class);
-//        return Result.success(insOrderService.costStatistics(page, costStatisticsDto));
-//    }
-//
-//    @ApiOperation(value = "璐圭敤缁熻鑾峰彇鎬讳环")
-//    @PostMapping("/costStatistics2")
-//    public Result<?> costStatistics2(@RequestBody Map<String, Object> data) throws Exception {
-//        CostStatisticsDto costStatisticsDto = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), CostStatisticsDto.class);
-//        return Result.success(insOrderService.costStatistics2(costStatisticsDto));
-//    }
-//
-//
-//    @ApiOperation(value = "鏍峰搧缂洪櫡鎸囨暟")
-//    @PostMapping("/selectSampleDefects")
-//    public Result selectSampleDefects(Integer size, Integer current, String inspectionItems, String orderNumber) {
-//        return Result.success(insOrderService.selectSampleDefects(new Page<>(current, size),inspectionItems, orderNumber));
-//    }
-//
-//
-//    @ApiOperation(value = "鎾ら攢")
-//    @PutMapping("/updateStatus")
-//    public Result<?> updateStatus(Integer id) {
-//        insOrderService.updateStatus(id);
-//        return Result.success();
-//    }
-//
-//    //寰呮鐨勬挙閿�鐨勬煡璇㈠緟妫�椤圭洰
-//    @PostMapping("/selectNoProducts")
-//    public Result<?> selectNoProducts(@RequestBody Map<String, Object> data,Integer orderId ,String ids) throws Exception {
-//        Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
-//        InsProduct insProduct = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), InsProduct.class);
-//        return Result.success(insProductService.selectNoProducts(page, insProduct,orderId,ids));
-//    }
-//
-//
-//    @ApiOperation(value = "寰呮鐨勬挙閿�")
-//    @PutMapping("/updateInspected")
-//    public Result<?> updateInspected(Integer orderId, String ids,
-//                                     @RequestParam(value = "typeSource",required = false) Integer typeSource,
-//                                     @RequestParam(value = "ifsInventoryId",required = false) Integer ifsInventoryId){
-//        if(Objects.nonNull(typeSource) && typeSource == 1){
-//            ifsInventoryQuantityMapper.update(null,new LambdaUpdateWrapper<IfsInventoryQuantity>()
-//                    .set(IfsInventoryQuantity::getState,0)
-//                    .eq(IfsInventoryQuantity::getId,ifsInventoryId));
-//            insOrderService.update(null,new LambdaUpdateWrapper<InsOrder>().set(InsOrder::getState,-1).eq(InsOrder::getId,orderId)); // 鎾ら攢
-//        }
-//        insProductService.updateInspected(orderId,ids);
-//        return Result.success();
-//    }
-//
-//    @ApiOperation(value = "瀹℃牳寰呮鎾ら攢")
-//    @PostMapping("/checkUpdate")
-//    public Result<?> checkUpdate(Integer orderId,Integer state){
-//        insProductService.checkUpdate(orderId,state);
-//        return Result.success();
-//    }
-//
-//    @ApiOperation(value = "鏍囩鎵撳嵃")
-//    @PostMapping("/labelPrinting")
-//    public Result<?> labelPrinting(String ids) {
-//        return Result.success(insOrderService.labelPrinting(ids));
-//    }
-//
-//
-//    @ApiOperation(value = "璐圭敤缁熻瀵煎嚭")
-//    @PostMapping("/export")
-//    public void export(@RequestBody Map<String, Object> data,HttpServletResponse response) throws Exception {
-//        CostStatisticsDto costStatisticsDto = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), CostStatisticsDto.class);
-//       insOrderService.export(costStatisticsDto,response);
-//    }
-//
-//
-//    @ApiOperation(value = "鑾峰彇ifs璁㈠崟")
-//    @PostMapping("/getIfsOrder")
-//    public Result<?> getIfsOrder() {
-//        insOrderService.getIfsOrder();
-//        return Result.success();
-//    }
-//
-//    @Scheduled(fixedDelay = 1200000)
-//    public void getIfsOrderTiming() {
-//        insOrderService.getIfsOrder();
-//    }
-//
-//
-//    @ApiOperation(value = "淇敼璁㈠崟鍗曞彿")
-//    @PostMapping("/updateEntrustCode")
-//    public Result<?> updateEntrustCode(@RequestBody InsOrder insOrder) {
-//        insOrderService.updateEntrustCode(insOrder);
-//        return Result.success();
-//    }
-//
-//    @ApiOperation("鏌ヨ涓嶅悎鏍煎娴嬩俊鎭�")
-//    @GetMapping("/getRetestResult")
-//    public Result<?> getRetestResult(Integer insProductId) {
-//        return Result.success(insOrderService.getRetestResult(insProductId));
-//    }
-//
-//
-//
-//    @ApiOperation(value = "閾滃崟涓濅笅鍗�")
-//    @PostMapping("/addRawCopperOrder")
-//    public Result<?> addRawCopperOrder(String str) {
-//        Map<String, Object> map = JSON.parseObject(str, Map.class);
-//        JSONArray jsonArray = JSON.parseArray(map.get("list")+"");
-//        List<SampleProductDto> list = jsonArray.toJavaList(SampleProductDto.class);
-//        CopperInsOrderDto CopperInsOrder = JSON.parseObject(JSON.toJSONString(map.get("insOrder")), CopperInsOrderDto.class);
-//        return Result.success(insOrderService.addRawCopperOrder(list, CopperInsOrder));
-//    }
-//
-//
-//    @ApiOperation(value = "淇敼濮旀墭缂栧彿")
-//    @PostMapping("/updateOrderEntrustCode")
-//    public Result<?> updateOrderEntrustCode(@RequestBody InsOrder insOrder) {
-//        insOrderService.updateOrderEntrustCode(insOrder);
-//        return Result.success();
-//    }
-//
-//    @ApiOperation(value = "淇敼妫�楠屼笅鍗曞唴瀹�")
-//    @PostMapping("/updateInsOrder")
-//    public Result<?> updateInsOrder(@RequestBody InsOrderUpdateDto insOrderUpdateDto) {
-//        return Result.success(insOrderService.updateInsOrder(insOrderUpdateDto));
-//    }
-//
-//    @ApiOperation(value = "鍒犻櫎閫�鍥炶鍗�")
-//    @GetMapping("/delInsOrder")
-//    public Result<?> delInsOrder(Integer insOrderId) {
-//        // 鏌ヨ璁㈠崟
-//        InsOrder order = insOrderService.getById(insOrderId);
-//        if (!order.getState().equals(2)) {
-//            throw new ErrorException("鍙湁閫�鍥炶鍗曟墠鑳藉垹闄�");
-//        }
-//
-//        return Result.success(insOrderService.removeById(insOrderId));
-//    }
-//
-//    @ApiOperation(value = "鎴愬搧鏍囩鎵撳嵃")
-//    @PostMapping("/labelOrderPrinting")
-//    public Result<List<InsOrderPrintingVo>> labelOrderPrinting(@RequestBody Map<String, Object> param) {
-//        List<Integer> ids = (List<Integer>) param.get("ids");
-//        return Result.success(insOrderService.labelOrderPrinting(ids));
-//    }
-//
-//    @ApiOperation(value = "鏍规嵁璁㈠崟id鏌ヨ鏍峰搧")
-//    @GetMapping("/getSampleByOrderId")
-//    public Result<List<InsSample>> getSampleByOrderId(Integer insOrderId) {
-//        return Result.success(insSampleService.list(Wrappers.<InsSample>lambdaQuery()
-//                .eq(InsSample::getInsOrderId, insOrderId)));
-//    }
-//
-//    @ApiOperation(value = "鏍规嵁鏍峰搧id鏌ヨ妫�楠岄」鏍�")
-//    @GetMapping("/getProductTreeBySampleId")
-//    public Result<List<StandardProductList>> getProductTreeBySampleId(Integer insSampleId) {
-//        return Result.success(insOrderService.getProductTreeBySampleId(insSampleId));
-//    }
-//
-//
-//    @ApiOperation(value = "娣诲姞閬楁紡鐨勬楠岄」")
-//    @PostMapping("/addOmitOrderProduct")
-//    public Result addOmitOrderProduct(@RequestBody OmitOrderProductDto omitOrderProductDto) {
-//        return Result.success(insOrderService.addOmitOrderProduct(omitOrderProductDto));
-//    }
-//
-//    @ApiOperation(value = "鎴愬搧妫�楠屽崟鍏ㄩ儴淇℃伅瀵煎嚭")
-//    @PostMapping("/rawAllInsOrderExport")
-//    public void rawAllInsOrderExport(@RequestBody SampleOrderDto sampleOrderDto, HttpServletResponse response){
-//        insOrderService.rawAllInsOrderExport(sampleOrderDto,response);
-//    }
-//
-//}
+package com.ruoyi.basic.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.basic.mapper.IfsInventoryQuantityMapper;
+import com.ruoyi.basic.pojo.IfsInventoryQuantity;
+import com.ruoyi.basic.pojo.StandardProductList;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.dto.*;
+import com.ruoyi.inspect.pojo.InsOrder;
+import com.ruoyi.inspect.pojo.InsOrderTemplate;
+import com.ruoyi.inspect.pojo.InsProduct;
+import com.ruoyi.inspect.pojo.InsSample;
+import com.ruoyi.inspect.service.InsOrderService;
+import com.ruoyi.inspect.service.InsOrderTemplateService;
+import com.ruoyi.inspect.service.InsProductService;
+import com.ruoyi.inspect.service.InsSampleService;
+import com.ruoyi.inspect.vo.InsOrderPrintingVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/insOrder")
+@Api(tags="妫�楠屽崟妯″潡")
+public class InsOrderController {
+
+    private InsOrderService insOrderService;
+
+    private InsSampleService insSampleService;
+
+    private InsProductService insProductService;
+
+    private IfsInventoryQuantityMapper ifsInventoryQuantityMapper;
+
+    private InsOrderTemplateService insOrderTemplateService;
+
+    //鑾峰彇妫�楠屼笅鍗曟暟鎹�
+    @ApiOperation(value = "鏌ヨ鍗曚綅妫�楠屽崟")
+    @GetMapping("/selectInsOrderParameter")
+    public Result selectInsOrderParameter(Page page, SampleOrderDto sampleOrderDto) throws Exception {
+        return Result.success(insOrderService.selectInsOrderParameter(page, sampleOrderDto));
+    }
+
+    //鐢ㄤ簬妫�楠屼笅鍗曞尯鍒煡鐪嬫墍鏈夎鍗曞拰鍙煡鐪嬪悓涓�涓鎵樺崟浣嶇殑璁㈠崟
+    @ApiOperation(value = "鏌ヨ鎵�鏈夋楠屽崟")
+    @GetMapping("/selectAllInsOrderParameter")
+    public Result selectAllInsOrderParameter() {
+        return Result.success();
+    }
+
+
+    @ApiOperation(value = "妫�楠屽垎閰�")
+    @PostMapping("/upInsOrder")
+    public Result<?> upInsOrder(Integer orderId, Integer sampleId, String appointed, Integer userId,String sonLaboratory) {
+        return Result.success(insOrderService.upInsOrder(orderId, sampleId, appointed, userId,sonLaboratory));
+    }
+
+    //todo: 涓嬪崟闇�瑕佷慨鏀�
+    @ApiOperation(value = "娣诲姞妫�楠屼笅鍗曟暟鎹�")
+    @PostMapping("/addInsOrder")
+    public Result<?> addInsOrder(String str) {
+        Map<String, Object> map = JSON.parseObject(str, Map.class);
+        JSONArray jsonArray = JSON.parseArray(map.get("list")+"");
+        List<SampleProductDto> list = jsonArray.toJavaList(SampleProductDto.class);
+        InsOrder insOrder = JSON.parseObject(JSON.toJSONString(map.get("insOrder")), InsOrder.class);
+        List<List<Integer>> pairing = JSON.parseArray(map.get("pairing")+"");
+        return Result.success(insOrderService.addInsOrder(list, insOrder, pairing));
+    }
+
+    @ApiOperation(value = "鏌ヨ璁㈠崟鏈�闀块璁℃椂闂�")
+    @GetMapping("/selectOrderManDay")
+    public Result<?> selectOrderManDay(Integer id) {
+        int day = insProductService.selectOrderManDay(id);
+        return Result.success("鎴愬姛", LocalDateTime.now().plusHours(day).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+    }
+
+    @ApiOperation(value = "鏌ヨ妫�楠屼笅鍗曞唴瀹硅鎯�")
+    @GetMapping("/getInsOrder")
+    public Result<?> getInsOrder(Integer orderId) {
+        return Result.success(insOrderService.getInsOrder(orderId));
+    }
+
+    @ApiOperation(value = "瀹℃牳妫�楠屽崟杩涜鐘舵�佷慨鏀�")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "妫�楠屽崟id", dataTypeClass = Integer.class),
+            @ApiImplicitParam(name = "state", value = "瀹℃牳缁撴灉 1:閫氳繃 2锛氫笉閫氳繃", dataTypeClass = Integer.class)
+    })
+
+    @PostMapping("/upInsOrderOfState")
+    public Result<?> upInsOrderOfState(@RequestBody InsOrder insOrder) {
+        return Result.success(insOrderService.upInsOrderOfState(insOrder));
+    }
+
+    @ApiOperation(value = "娣诲姞妫�楠屽崟妯℃澘")
+    @PostMapping("/addInsOrderTemplate")
+    public Result<?> addInsOrderTemplate(@RequestBody InsOrderTemplate insOrderTemplate) {
+        return Result.success(insOrderTemplateService.addInsOrderTemplate(insOrderTemplate));
+    }
+
+    @ApiOperation(value = "鏌ヨ妫�楠屽崟妯℃澘")
+    @GetMapping("/selectInsOrderTemplate")
+    public Result<?> selectInsOrderTemplate(String company) {
+        return Result.success(insOrderTemplateService.selectInsOrderTemplate(company));
+    }
+
+    @ApiOperation(value = "閫氳繃妫�楠屽崟妯℃澘id鑾峰彇妫�楠屽崟妯℃澘鍐呭")
+    @GetMapping("/selectInsOrderTemplateById")
+    public Result<?> selectInsOrderTemplateById(Integer id) {
+        return Result.success("鎴愬姛", insOrderTemplateService.selectInsOrderTemplateById(id));
+    }
+
+    @ApiOperation(value = "鍒犻櫎妫�楠屽崟妯℃澘")
+    @DeleteMapping("/delInsOrderTemplate")
+    public Result<?> delInsOrderTemplate(Integer id) {
+        return Result.success(insOrderTemplateService.delInsOrderTemplate(id));
+    }
+
+    @ApiOperation(value = "閫氳繃妫�楠屽崟鏌ヨ妫�楠屾暟鎹紙鏁版嵁鏌ョ湅锛�")
+    @GetMapping("/selectSampleAndProductByOrderId")
+    public Result<?> selectSampleAndProductByOrderId(Page page, SampleProductDto2 sampleProductDto){
+        return Result.success(insOrderService.selectSampleAndProductByOrderId(page, sampleProductDto));
+    }
+
+    @ApiOperation(value = "璐圭敤缁熻")
+    @GetMapping("/costStatistics")
+    public Result<?> costStatistics(Page page, CostStatisticsDto costStatisticsDto){
+        return Result.success(insOrderService.costStatistics(page, costStatisticsDto));
+    }
+
+    @ApiOperation(value = "璐圭敤缁熻鑾峰彇鎬讳环")
+    @GetMapping("/costStatistics2")
+    public Result<?> costStatistics2(CostStatisticsDto costStatisticsDto){
+        return Result.success(insOrderService.costStatistics2(costStatisticsDto));
+    }
+
+
+    @ApiOperation(value = "鏍峰搧缂洪櫡鎸囨暟")
+    @GetMapping("/selectSampleDefects")
+    public Result selectSampleDefects(Integer size, Integer current, String inspectionItems, String orderNumber) {
+        return Result.success(insOrderService.selectSampleDefects(new Page<>(current, size),inspectionItems, orderNumber));
+    }
+
+
+    @ApiOperation(value = "鎾ら攢")
+    @PostMapping("/updateStatus")
+    public Result<?> updateStatus(@RequestBody Map<String, Object> param) {
+        Integer id = (Integer) param.get("id");
+        insOrderService.updateStatus(id);
+        return Result.success();
+    }
+
+    //寰呮鐨勬挙閿�鐨勬煡璇㈠緟妫�椤圭洰
+    @GetMapping("/selectNoProducts")
+    public Result<?> selectNoProducts(Page page, InsProduct insProduct,Integer orderId ,String ids){
+        return Result.success(insProductService.selectNoProducts(page, insProduct,orderId,ids));
+    }
+
+
+    @ApiOperation(value = "寰呮鐨勬挙閿�")
+    @PostMapping("/updateInspected")
+    public Result<?> updateInspected(@RequestBody Map<String, Object> param){
+        Integer orderId = (Integer) param.get("orderId");
+        String ids = (String) param.get("ids");
+        Integer typeSource = (Integer) param.get("typeSource");
+        Integer ifsInventoryId = (Integer) param.get("ifsInventoryId");
+        if(Objects.nonNull(typeSource) && typeSource == 1){
+            ifsInventoryQuantityMapper.update(null,new LambdaUpdateWrapper<IfsInventoryQuantity>()
+                    .set(IfsInventoryQuantity::getState,0)
+                    .eq(IfsInventoryQuantity::getId,ifsInventoryId));
+            insOrderService.update(null,new LambdaUpdateWrapper<InsOrder>().set(InsOrder::getState,-1).eq(InsOrder::getId,orderId)); // 鎾ら攢
+        }
+        insProductService.updateInspected(orderId,ids);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "瀹℃牳寰呮鎾ら攢")
+    @PostMapping("/checkUpdate")
+    public Result<?> checkUpdate(@RequestBody Map<String, Object> param){
+        Integer orderId = (Integer) param.get("orderId");
+        Integer state = (Integer) param.get("state");
+        insProductService.checkUpdate(orderId,state);
+        return Result.success();
+    }
+
+
+    @ApiOperation(value = "璐圭敤缁熻瀵煎嚭")
+    @GetMapping("/export")
+    public void export(CostStatisticsDto costStatisticsDto,HttpServletResponse response) throws ServletException, IOException {
+       insOrderService.export(costStatisticsDto,response);
+    }
+
+
+    @ApiOperation(value = "鑾峰彇ifs璁㈠崟")
+    @GetMapping("/getIfsOrder")
+    public Result<?> getIfsOrder() {
+        insOrderService.getIfsOrder();
+        return Result.success();
+    }
+
+    @Scheduled(fixedDelay = 1200000)
+    public void getIfsOrderTiming() {
+        insOrderService.getIfsOrder();
+    }
+
+
+    @ApiOperation(value = "淇敼璁㈠崟鍗曞彿")
+    @PostMapping("/updateEntrustCode")
+    public Result<?> updateEntrustCode(@RequestBody InsOrder insOrder) {
+        insOrderService.updateEntrustCode(insOrder);
+        return Result.success();
+    }
+
+    @ApiOperation("鏌ヨ涓嶅悎鏍煎娴嬩俊鎭�")
+    @GetMapping("/getRetestResult")
+    public Result<?> getRetestResult(Integer insProductId) {
+        return Result.success(insOrderService.getRetestResult(insProductId));
+    }
+
+
+
+    @ApiOperation(value = "閾滃崟涓濅笅鍗�")
+    @PostMapping("/addRawCopperOrder")
+    public Result<?> addRawCopperOrder(String str) {
+        Map<String, Object> map = JSON.parseObject(str, Map.class);
+        JSONArray jsonArray = JSON.parseArray(map.get("list")+"");
+        List<SampleProductDto> list = jsonArray.toJavaList(SampleProductDto.class);
+        CopperInsOrderDto CopperInsOrder = JSON.parseObject(JSON.toJSONString(map.get("insOrder")), CopperInsOrderDto.class);
+        return Result.success(insOrderService.addRawCopperOrder(list, CopperInsOrder));
+    }
+
+
+    @ApiOperation(value = "淇敼濮旀墭缂栧彿")
+    @PostMapping("/updateOrderEntrustCode")
+    public Result<?> updateOrderEntrustCode(@RequestBody InsOrder insOrder) {
+        insOrderService.updateOrderEntrustCode(insOrder);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "淇敼妫�楠屼笅鍗曞唴瀹�")
+    @PostMapping("/updateInsOrder")
+    public Result<?> updateInsOrder(@RequestBody InsOrderUpdateDto insOrderUpdateDto) {
+        return Result.success(insOrderService.updateInsOrder(insOrderUpdateDto));
+    }
+
+    @ApiOperation(value = "鍒犻櫎閫�鍥炶鍗�")
+    @GetMapping("/delInsOrder")
+    public Result<?> delInsOrder(Integer insOrderId) {
+        // 鏌ヨ璁㈠崟
+        InsOrder order = insOrderService.getById(insOrderId);
+        if (!order.getState().equals(2)) {
+            throw new ErrorException("鍙湁閫�鍥炶鍗曟墠鑳藉垹闄�");
+        }
+
+        return Result.success(insOrderService.removeById(insOrderId));
+    }
+
+    @ApiOperation(value = "鎴愬搧鏍囩鎵撳嵃")
+    @PostMapping("/labelOrderPrinting")
+    public Result<List<InsOrderPrintingVo>> labelOrderPrinting(@RequestBody Map<String, Object> param) {
+        List<Integer> ids = (List<Integer>) param.get("ids");
+        return Result.success(insOrderService.labelOrderPrinting(ids));
+    }
+
+    @ApiOperation(value = "鏍规嵁璁㈠崟id鏌ヨ鏍峰搧")
+    @GetMapping("/getSampleByOrderId")
+    public Result<List<InsSample>> getSampleByOrderId(Integer insOrderId) {
+        return Result.success(insSampleService.list(Wrappers.<InsSample>lambdaQuery()
+                .eq(InsSample::getInsOrderId, insOrderId)));
+    }
+
+    @ApiOperation(value = "鏍规嵁鏍峰搧id鏌ヨ妫�楠岄」鏍�")
+    @GetMapping("/getProductTreeBySampleId")
+    public Result<List<StandardProductList>> getProductTreeBySampleId(Integer insSampleId) {
+        return Result.success(insOrderService.getProductTreeBySampleId(insSampleId));
+    }
+
+
+    @ApiOperation(value = "娣诲姞閬楁紡鐨勬楠岄」")
+    @PostMapping("/addOmitOrderProduct")
+    public Result addOmitOrderProduct(@RequestBody OmitOrderProductDto omitOrderProductDto) {
+        return Result.success(insOrderService.addOmitOrderProduct(omitOrderProductDto));
+    }
+
+    @ApiOperation(value = "鎴愬搧妫�楠屽崟鍏ㄩ儴淇℃伅瀵煎嚭")
+    @PostMapping("/rawAllInsOrderExport")
+    public void rawAllInsOrderExport(@RequestBody SampleOrderDto sampleOrderDto, HttpServletResponse response){
+        insOrderService.rawAllInsOrderExport(sampleOrderDto,response);
+    }
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/controller/RawMaterialOrderController.java b/inspect-server/src/main/java/com/ruoyi/inspect/controller/RawMaterialOrderController.java
index eb03d93..5ec41ee 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/controller/RawMaterialOrderController.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/controller/RawMaterialOrderController.java
@@ -1,317 +1,311 @@
-//package com.ruoyi.inspect.controller;
-//
-//import com.alibaba.fastjson.JSON;
-//import com.alibaba.fastjson.JSONArray;
-//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-//import com.ruoyi.basic.dto.*;
-//import com.ruoyi.basic.pojo.IfsInventoryQuantity;
-//import com.ruoyi.inspect.dto.SampleProductDto;
-//import com.ruoyi.inspect.pojo.InsOrder;
-//import com.ruoyi.inspect.pojo.RawMaterialOrderTemplate;
-//import com.ruoyi.inspect.service.RawMaterialOrderService;
-//import com.ruoyi.inspect.service.RawMaterialOrderTemplateService;
-//import com.ruoyi.common.core.domain.Result;
-//import com.ruoyi.common.utils.JackSonUtil;
-//import com.ruoyi.common.utils.WxCpUtils;
-//import com.ruoyi.inspect.dto.CopperInsOrderDto;
-//import io.swagger.annotations.Api;
-//import io.swagger.annotations.ApiOperation;
-//import lombok.AllArgsConstructor;
-//import org.springframework.web.bind.annotation.*;
-//
-//import javax.servlet.http.HttpServletResponse;
-//import java.io.File;
-//import java.util.List;
-//import java.util.Map;
-//
-///**
-// * @Author zhuo
-// * @Date 2024/7/31
-// */
-//@RequestMapping("/rawMaterialOrder")
-//@RestController
-//@AllArgsConstructor
-//@Api(tags = "鍘熸潗鏂欎笅鍗�")
-//public class RawMaterialOrderController {
-//
-//    private RawMaterialOrderService rawMaterialOrderService;
-//    private RawMaterialOrderTemplateService rawMaterialOrderTemplateService;
-//
-//    @ApiOperation(value = "鏇村叿闆朵欢鍙疯幏鍙栨爣鍑嗘爲")
-//    @GetMapping("/selectStandardTreeListByPartNo")
-//    public Result selectStandardTreeListByPartNo(String partNo) {
-//        return Result.success(rawMaterialOrderService.selectStandardTreeListByPartNo(partNo));
-//    }
-//
-//    @ApiOperation(value = "鍘熸潗鏂欐楠屾煡璇唬涓嬪崟")
-//    @GetMapping("/getPurchaseOrder")
-//    public Result getPurchaseOrder(Page page, IfsInventoryQuantityCheckDto ifsInventoryQuantity){
-//        return Result.success(rawMaterialOrderService.selectIfsInventoryQuantity(page, ifsInventoryQuantity));
-//    }
-//
-//    @ApiOperation(value = "鍘熸潗鏂欐楠屾煡璇㈡楠屼腑")
-//    @GetMapping("/getIfsByStateOne")
-//    public Result getIfsByStateOne(Page page, IfsInventoryQuantityDto ifsInventoryQuantityDto) throws Exception {
-//        return Result.success(rawMaterialOrderService.getIfsByStateOne(page, ifsInventoryQuantityDto));
-//    }
-//
-//    @ApiOperation(value = "鍘熸潗鏂欐楠屾煡璇㈠凡妫�楠�")
-//    @GetMapping("/getIfsByOver")
-//    public Result getIfsByOver(Page page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto) throws Exception {
-//        return Result.success(rawMaterialOrderService.getIfsByOver(page, ifsInventoryQuantityDto));
-//    }
-//
-//    @ApiOperation(value = "娣诲姞鍘熸潗鏂欐楠屽崟妯℃澘")
-//    @PostMapping("/addRawMaterOrderTemplate")
-//    public Result<?> addRawMaterOrderTemplate(@RequestBody RawMaterialOrderTemplate rawMaterialOrderTemplate) {
-//        return Result.success(rawMaterialOrderTemplateService.addRawMaterOrderTemplate(rawMaterialOrderTemplate));
-//    }
-//    @ApiOperation(value = "鏌ヨ鍘熸潗鏂欐楠屽崟妯℃澘鍒楄〃")
-//    @GetMapping("/selectRawMaterOrderTemplate")
-//    public Result<?> selectRawMaterOrderTemplate(String partNo) {
-//        return Result.success(rawMaterialOrderTemplateService.selectRawMaterOrderTemplate(partNo));
-//    }
-//
-//    @ApiOperation(value = "閫氳繃鍘熸潗鏂欐楠屽崟妯℃澘id鑾峰彇妫�楠屽崟妯℃澘鍐呭")
-//    @GetMapping("/selectRawMaterOrderTemplateById")
-//    public Result<?> selectRawMaterOrderTemplateById(Integer id) {
-//        return Result.success("鎴愬姛", rawMaterialOrderTemplateService.selectRawMaterOrderTemplateById(id));
-//    }
-//
-//    @ApiOperation(value = "鍒犻櫎鍘熸潗鏂欐楠屽崟妯℃澘")
-//    @PostMapping("/delRawMaterOrderTemplate")
-//    public Result<?> delRawMaterOrderTemplate(Integer id) {
-//        return Result.success(rawMaterialOrderTemplateService.delRawMaterOrderTemplate(id));
-//    }
-//
-//
-//    /**
-//     * 鎶ユ鎵归噺
-//     * @param param 鍘熸潗鏂檌d
-//     * @return
-//     */
-//    @ApiOperation(value = "鎶ユ鎵归噺")
-//    @PostMapping("/inspectionReport")
-//    public Result<?> inspectionReport(@RequestBody Map<String, Object> param) {
-//        List<Integer> ids = (List<Integer>) param.get("ids");
-//        return Result.success(rawMaterialOrderService.inspectionReport(ids));
-//    }
-//
-//    /**
-//     * 鍙栨秷鎶ユ
-//     * @param id 鍘熸潗鏂欎笅鍗�
-//     * @return
-//     */
-//    @ApiOperation(value = "鎾ら攢鎶ユ")
-//    @PostMapping("/revokeInspectionReport")
-//    public Result<?> revokeInspectionReport(Integer id) {
-//        return Result.success(rawMaterialOrderService.revokeInspectionReport(id));
-//    }
-//
-//    /**
-//     * 鎵撳嵃鏍囩鏌ヨ
-//     * @param param 鍘熸潗鏂檌d
-//     * @return
-//     */
-//    @ApiOperation(value = "鎵撳嵃鏍囩鏌ヨ")
-//    @PostMapping("/printLabel")
-//    public Result<?> printLabel(@RequestBody Map<String, Object> param) {
-//        List<Integer> ids = (List<Integer>) param.get("ids");
-//        return Result.success(rawMaterialOrderService.printLabel(ids));
-//    }
-//
-//    /**
-//     * 鎶ユ
-//     * @param ifsInventoryQuantity 鍘熸潗鏂�
-//     * @return
-//     */
-//    @ApiOperation(value = "鎶ユ")
-//    @PostMapping("/inspectionReportOne")
-//    public Result<?> inspectionReportOne(@RequestBody IfsInventoryQuantity ifsInventoryQuantity) {
-//
-//        return Result.success(rawMaterialOrderService.inspectionReportOne(ifsInventoryQuantity));
-//    }
-//
-//    /**
-//     * 鑾峰彇閾滀骇涓氶摼妫�娴嬫暟鎹�
-//     * @param id 鍘熸潗鏂檌d
-//     * @return
-//     */
-//    @ApiOperation(value = "鑾峰彇閾滀骇涓氶摼妫�娴嬫暟鎹�")
-//    @GetMapping("/getIndustryChain")
-//    public Result<?> getIndustryChain(Integer id) {
-//        return Result.success("鎴愬姛", rawMaterialOrderService.getIndustryChain(id));
-//    }
-//
-//    /**
-//     * 鍘熸潗鏂欐挙閿�
-//     * @param ifsInventoryId
-//     * @return
-//     */
-//    @ApiOperation(value = "鍘熸潗鏂欐挙閿�涓嬪崟")
-//    @PutMapping("/repealRawOrder")
-//    public Result<?> repealRawOrder(Integer ifsInventoryId){
-//        return Result.success(rawMaterialOrderService.repealRawOrder(ifsInventoryId));
-//    }
-//
-//
-//    @ApiOperation(value = "鍘熸潗鏂欎笅鍗曞厤妫�")
-//    @PostMapping("/addExemptionOrder")
-//    public Result<?> addExemptionOrder(String str) {
-//        Map<String, Object> map = JSON.parseObject(str, Map.class);
-//        JSONArray jsonArray = JSON.parseArray(map.get("list")+"");
-//        List<SampleProductDto> list = jsonArray.toJavaList(SampleProductDto.class);
-//        InsOrder insOrder = JSON.parseObject(JSON.toJSONString(map.get("insOrder")), InsOrder.class);
-//        return Result.success(rawMaterialOrderService.addExemptionOrder(list, insOrder));
-//    }
-//
-//
-//    @ApiOperation(value = "浠撳簱鎶ユ鏌ヨ")
-//    @PostMapping("/getWarehouseSubmit")
-//    public Result getWarehouseSubmit(Page page, IfsInventoryQuantity ifsInventoryQuantity) throws Exception {
-//        return Result.success(rawMaterialOrderService.getWarehouseSubmit(page, ifsInventoryQuantity));
-//    }
-//
-//    /**
-//     * 鍙栨秷鎶ユ
-//     * @param id 鍘熸潗鏂欎笅鍗�
-//     * @return
-//     */
-//    @ApiOperation(value = "鍒犻櫎鍘熸潗鏂欐姤妫�淇℃伅")
-//    @PostMapping("/delIfsInventory")
-//    public Result<?> delIfsInventory(Integer id) {
-//        return Result.success(rawMaterialOrderService.delIfsInventory(id));
-//    }
-//
-//    /**
-//     * 鍘熸潗鏂欎笅鍗曟斁琛�
-//     * @param param
-//     * @return
-//     */
-//    @ApiOperation(value = "鍘熸潗鏂欎笅鍗曟斁琛屽厤妫�")
-//    @PostMapping("/rawOrderRelease")
-//    public Result<?> rawOrderRelease(@RequestBody Map<String, Object> param){
-//        Integer ifsInventoryId = (Integer) param.get("ifsInventoryId");
-//        String partDetail = (String) param.get("partDetail");
-//        return Result.success(rawMaterialOrderService.rawOrderRelease(ifsInventoryId, partDetail));
-//    }
-//
-//    /**
-//     * 鍘熸潗鏂欎笅鍗曢�氱煡鍏嶆鎴栬�呭娆℃楠�
-//     * @param ifsInventoryId
-//     * @return
-//     */
-//    @ApiOperation(value = "鍘熸潗鏂欎笅鍗曢�氱煡鍏嶆鎴栬�呭娆℃楠�")
-//    @GetMapping("/notificationRawOrder")
-//    public Result<?> notificationRawOrder(Integer ifsInventoryId){
-//        return Result.success(rawMaterialOrderService.notificationRawOrder(ifsInventoryId));
-//    }
-//
-//
-//    @ApiOperation(value = "鍘熸潗鏂欐姤妫�鏌ヨ鍏ㄩ儴")
-//    @PostMapping("/getIfsByAll")
-//    public Result getIfsByAll(@RequestBody Map<String, Object> data) throws Exception {
-//        Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
-//        IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), IfsInventoryQuantitySupplierDto.class);
-//        return Result.success(rawMaterialOrderService.getIfsByOver(page, ifsInventoryQuantityDto));
-//    }
-//
-//
-//    @ApiOperation(value = "鏂板鍘熸潗鏂欐姤妫�淇℃伅")
-//    @PostMapping("/addIfsInventoryQuantity")
-//    public Result addIfsInventoryQuantity(@RequestBody IfsInventoryQuantity ifsInventoryQuantity) {
-//        rawMaterialOrderService.addIfsInventoryQuantity(ifsInventoryQuantity);
-//        return Result.success();
-//    }
-//
-//    @ApiOperation(value = "鍘熸潗鏂欎笅鍗曟煡鐪嬪凡瀹屾垚淇℃伅")
-//    @PostMapping("/getIfsByFinish")
-//    public Result getIfsByFinish(@RequestBody Map<String, Object> data) throws Exception {
-//        Page page = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("page")), Page.class);
-//        IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), IfsInventoryQuantitySupplierDto.class);
-//        ifsInventoryQuantityDto.setIsFinish(1);
-//        return Result.success(rawMaterialOrderService.getIfsByOver(page, ifsInventoryQuantityDto));
-//    }
-//
-//    @ApiOperation(value = "娴嬭瘯绉诲簱")
-//    @PostMapping("/shiftingParking")
-//    public Result shiftingParking(@RequestBody List<Integer> ids){
-//        rawMaterialOrderService.shiftingParking(ids);
-//        return Result.success();
-//    }
-//
-//    @ApiOperation(value = "寰俊鍙戦�佹枃浠舵祴璇�")
-//    @GetMapping("/wxSend")
-//    public Result wxSend(String user, String content, String filePath) throws Exception {
-//        WxCpUtils.inform(user, content, new File(filePath));
-//        return Result.success();
-//    }
-//
-//    @ApiOperation(value = "閾滃崟涓濅笅鍗曞厤妫�")
-//    @PostMapping("/addRawCopperOrderExemptionOrder")
-//    public Result<?> addRawCopperOrderExemptionOrder(String str) {
-//        Map<String, Object> map = JSON.parseObject(str, Map.class);
-//        JSONArray jsonArray = JSON.parseArray(map.get("list")+"");
-//        List<SampleProductDto> list = jsonArray.toJavaList(SampleProductDto.class);
-//        CopperInsOrderDto CopperInsOrder = JSON.parseObject(JSON.toJSONString(map.get("insOrder")), CopperInsOrderDto.class);
-//        return Result.success(rawMaterialOrderService.addRawCopperOrderExemptionOrder(list, CopperInsOrder));
-//    }
-//
-//    /**
-//     * 璁╂鏀捐
-//     * @param ifsInventoryId
-//     * @return
-//     */
-//    @ApiOperation(value = "璁╂鏀捐")
-//    @PostMapping("/concessionRelease")
-//    public Result<?> concessionRelease(Integer ifsInventoryId){
-//        return Result.success(rawMaterialOrderService.concessionRelease(ifsInventoryId));
-//    }
-//
-//    /**
-//     * 鍘熸潗鏂欒繘鍘傛挙閿�涓嬪崟
-//     * @param enterOrderId
-//     * @return
-//     */
-//    @ApiOperation(value = "鍘熸潗鏂欒繘鍘傛挙閿�涓嬪崟")
-//    @PostMapping("/repealEnterRawOrder")
-//    public Result<?> repealEnterRawOrder(Integer enterOrderId){
-//        return Result.success(rawMaterialOrderService.repealEnterRawOrder(enterOrderId));
-//    }
-//
-//    /**
-//     * 鍘熸潗鏂欏搴︽挙閿�涓嬪崟
-//     * @param quarterOrderId
-//     * @return
-//     */
-//    @ApiOperation(value = "鍘熸潗鏂欏搴︽挙閿�涓嬪崟")
-//    @PostMapping("/repealQuarterRawOrder")
-//    public Result<?> repealQuarterRawOrder(Integer quarterOrderId){
-//        return Result.success(rawMaterialOrderService.repealQuarterRawOrder(quarterOrderId));
-//    }
-//
-//    @ApiOperation(value = "鍏ㄩ儴淇℃伅瀵煎嚭")
-//    @PostMapping("/rawAllExport")
-//    public void rawAllExport(@RequestBody Map<String, Object> data, HttpServletResponse response) throws Exception {
-//        IfsInventoryQuantitySupplierDto dto = JackSonUtil.unmarshal(JackSonUtil.marshal(data.get("entity")), IfsInventoryQuantitySupplierDto.class);
-//        rawMaterialOrderService.rawAllExport(dto,response);
-//    }
-//
-//    @ApiOperation(value = "鍘熸潗鏂欐楠屾煡璇㈠搴︽楠�")
-//    @GetMapping("/getIfsByQuarter")
-//    public Result getIfsByQuarter(Page page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto){
-//        return Result.success(rawMaterialOrderService.getIfsByQuarter(page, ifsInventoryQuantityDto));
-//    }
-//
-//    /**
-//     * 鎻愬墠鍏ュ簱
-//     * @param ifsInventoryId
-//     * @return
-//     */
-//    @ApiOperation(value = "鎻愬墠鍏ュ簱")
-//    @PostMapping("/advancedGodown")
-//    public Result<?> advancedGodown(Integer ifsInventoryId){
-//        return Result.success(rawMaterialOrderService.advancedGodown(ifsInventoryId));
-//    }
-//
-//}
+package com.ruoyi.inspect.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.basic.dto.*;
+import com.ruoyi.basic.pojo.IfsInventoryQuantity;
+import com.ruoyi.inspect.dto.SampleProductDto;
+import com.ruoyi.inspect.pojo.InsOrder;
+import com.ruoyi.inspect.pojo.RawMaterialOrderTemplate;
+import com.ruoyi.inspect.service.RawMaterialOrderService;
+import com.ruoyi.inspect.service.RawMaterialOrderTemplateService;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.utils.JackSonUtil;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.inspect.dto.CopperInsOrderDto;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author zhuo
+ * @Date 2024/7/31
+ */
+@RequestMapping("/rawMaterialOrder")
+@RestController
+@AllArgsConstructor
+@Api(tags = "鍘熸潗鏂欎笅鍗�")
+public class RawMaterialOrderController {
+
+    private RawMaterialOrderService rawMaterialOrderService;
+    private RawMaterialOrderTemplateService rawMaterialOrderTemplateService;
+
+    @ApiOperation(value = "鏇村叿闆朵欢鍙疯幏鍙栨爣鍑嗘爲")
+    @GetMapping("/selectStandardTreeListByPartNo")
+    public Result selectStandardTreeListByPartNo(String partNo) {
+        return Result.success(rawMaterialOrderService.selectStandardTreeListByPartNo(partNo));
+    }
+
+    @ApiOperation(value = "鍘熸潗鏂欐楠屾煡璇唬涓嬪崟")
+    @GetMapping("/getPurchaseOrder")
+    public Result getPurchaseOrder(Page page, IfsInventoryQuantityCheckDto ifsInventoryQuantity){
+        return Result.success(rawMaterialOrderService.selectIfsInventoryQuantity(page, ifsInventoryQuantity));
+    }
+
+    @ApiOperation(value = "鍘熸潗鏂欐楠屾煡璇㈡楠屼腑")
+    @GetMapping("/getIfsByStateOne")
+    public Result getIfsByStateOne(Page page, IfsInventoryQuantityDto ifsInventoryQuantityDto){
+        return Result.success(rawMaterialOrderService.getIfsByStateOne(page, ifsInventoryQuantityDto));
+    }
+
+    @ApiOperation(value = "鍘熸潗鏂欐楠屾煡璇㈠凡妫�楠�")
+    @GetMapping("/getIfsByOver")
+    public Result getIfsByOver(Page page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto){
+        return Result.success(rawMaterialOrderService.getIfsByOver(page, ifsInventoryQuantityDto));
+    }
+
+    @ApiOperation(value = "娣诲姞鍘熸潗鏂欐楠屽崟妯℃澘")
+    @PostMapping("/addRawMaterOrderTemplate")
+    public Result<?> addRawMaterOrderTemplate(@RequestBody RawMaterialOrderTemplate rawMaterialOrderTemplate) {
+        return Result.success(rawMaterialOrderTemplateService.addRawMaterOrderTemplate(rawMaterialOrderTemplate));
+    }
+    @ApiOperation(value = "鏌ヨ鍘熸潗鏂欐楠屽崟妯℃澘鍒楄〃")
+    @GetMapping("/selectRawMaterOrderTemplate")
+    public Result<?> selectRawMaterOrderTemplate(String partNo) {
+        return Result.success(rawMaterialOrderTemplateService.selectRawMaterOrderTemplate(partNo));
+    }
+
+    @ApiOperation(value = "閫氳繃鍘熸潗鏂欐楠屽崟妯℃澘id鑾峰彇妫�楠屽崟妯℃澘鍐呭")
+    @GetMapping("/selectRawMaterOrderTemplateById")
+    public Result<?> selectRawMaterOrderTemplateById(Integer id) {
+        return Result.success("鎴愬姛", rawMaterialOrderTemplateService.selectRawMaterOrderTemplateById(id));
+    }
+
+    @ApiOperation(value = "鍒犻櫎鍘熸潗鏂欐楠屽崟妯℃澘")
+    @DeleteMapping("/delRawMaterOrderTemplate")
+    public Result<?> delRawMaterOrderTemplate(Integer id) {
+        return Result.success(rawMaterialOrderTemplateService.delRawMaterOrderTemplate(id));
+    }
+
+
+    /**
+     * 鎶ユ鎵归噺
+     * @param param 鍘熸潗鏂檌d
+     * @return
+     */
+    @ApiOperation(value = "鎶ユ鎵归噺")
+    @PostMapping("/inspectionReport")
+    public Result<?> inspectionReport(@RequestBody Map<String, Object> param) {
+        List<Integer> ids = (List<Integer>) param.get("ids");
+        return Result.success(rawMaterialOrderService.inspectionReport(ids));
+    }
+
+    /**
+     * 鍙栨秷鎶ユ
+     * @param param 鍘熸潗鏂欎笅鍗�
+     * @return
+     */
+    @ApiOperation(value = "鎾ら攢鎶ユ")
+    @PostMapping("/revokeInspectionReport")
+    public Result<?> revokeInspectionReport(@RequestBody Map<String, Object> param) {
+        Integer id = (Integer) param.get("id");
+        return Result.success(rawMaterialOrderService.revokeInspectionReport(id));
+    }
+
+    /**
+     * 鎵撳嵃鏍囩鏌ヨ
+     * @param param 鍘熸潗鏂檌d
+     * @return
+     */
+    @ApiOperation(value = "鎵撳嵃鏍囩鏌ヨ")
+    @PostMapping("/printLabel")
+    public Result<?> printLabel(@RequestBody Map<String, Object> param) {
+        List<Integer> ids = (List<Integer>) param.get("ids");
+        return Result.success(rawMaterialOrderService.printLabel(ids));
+    }
+
+    /**
+     * 鎶ユ
+     * @param ifsInventoryQuantity 鍘熸潗鏂�
+     * @return
+     */
+    @ApiOperation(value = "鎶ユ")
+    @PostMapping("/inspectionReportOne")
+    public Result<?> inspectionReportOne(@RequestBody IfsInventoryQuantity ifsInventoryQuantity) {
+
+        return Result.success(rawMaterialOrderService.inspectionReportOne(ifsInventoryQuantity));
+    }
+
+    /**
+     * 鑾峰彇閾滀骇涓氶摼妫�娴嬫暟鎹�
+     * @param id 鍘熸潗鏂檌d
+     * @return
+     */
+    @ApiOperation(value = "鑾峰彇閾滀骇涓氶摼妫�娴嬫暟鎹�")
+    @GetMapping("/getIndustryChain")
+    public Result<?> getIndustryChain(Integer id) {
+        return Result.success("鎴愬姛", rawMaterialOrderService.getIndustryChain(id));
+    }
+
+    /**
+     * 鍘熸潗鏂欐挙閿�
+     * @param param
+     * @return
+     */
+    @ApiOperation(value = "鍘熸潗鏂欐挙閿�涓嬪崟")
+    @GetMapping("/repealRawOrder")
+    public Result<?> repealRawOrder(@RequestBody Map<String, Object> param){
+        Integer ifsInventoryId = (Integer) param.get("ifsInventoryId");
+        return Result.success(rawMaterialOrderService.repealRawOrder(ifsInventoryId));
+    }
+
+
+    @ApiOperation(value = "鍘熸潗鏂欎笅鍗曞厤妫�")
+    @PostMapping("/addExemptionOrder")
+    public Result<?> addExemptionOrder(String str) {
+        Map<String, Object> map = JSON.parseObject(str, Map.class);
+        JSONArray jsonArray = JSON.parseArray(map.get("list")+"");
+        List<SampleProductDto> list = jsonArray.toJavaList(SampleProductDto.class);
+        InsOrder insOrder = JSON.parseObject(JSON.toJSONString(map.get("insOrder")), InsOrder.class);
+        return Result.success(rawMaterialOrderService.addExemptionOrder(list, insOrder));
+    }
+
+
+    @ApiOperation(value = "浠撳簱鎶ユ鏌ヨ")
+    @GetMapping("/getWarehouseSubmit")
+    public Result getWarehouseSubmit(Page page, IfsInventoryQuantity ifsInventoryQuantity) throws Exception {
+        return Result.success(rawMaterialOrderService.getWarehouseSubmit(page, ifsInventoryQuantity));
+    }
+
+    /**
+     * 鍙栨秷鎶ユ
+     * @param id 鍘熸潗鏂欎笅鍗�
+     * @return
+     */
+    @ApiOperation(value = "鍒犻櫎鍘熸潗鏂欐姤妫�淇℃伅")
+    @DeleteMapping("/delIfsInventory")
+    public Result<?> delIfsInventory(Integer id) {
+        return Result.success(rawMaterialOrderService.delIfsInventory(id));
+    }
+
+    /**
+     * 鍘熸潗鏂欎笅鍗曟斁琛�
+     * @param param
+     * @return
+     */
+    @ApiOperation(value = "鍘熸潗鏂欎笅鍗曟斁琛屽厤妫�")
+    @PostMapping("/rawOrderRelease")
+    public Result<?> rawOrderRelease(@RequestBody Map<String, Object> param){
+        Integer ifsInventoryId = (Integer) param.get("ifsInventoryId");
+        String partDetail = (String) param.get("partDetail");
+        return Result.success(rawMaterialOrderService.rawOrderRelease(ifsInventoryId, partDetail));
+    }
+
+    /**
+     * 鍘熸潗鏂欎笅鍗曢�氱煡鍏嶆鎴栬�呭娆℃楠�
+     * @param ifsInventoryId
+     * @return
+     */
+    @ApiOperation(value = "鍘熸潗鏂欎笅鍗曢�氱煡鍏嶆鎴栬�呭娆℃楠�")
+    @GetMapping("/notificationRawOrder")
+    public Result<?> notificationRawOrder(Integer ifsInventoryId){
+        return Result.success(rawMaterialOrderService.notificationRawOrder(ifsInventoryId));
+    }
+
+
+    @ApiOperation(value = "鍘熸潗鏂欐姤妫�鏌ヨ鍏ㄩ儴")
+    @GetMapping("/getIfsByAll")
+    public Result getIfsByAll(Page page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto){
+        return Result.success(rawMaterialOrderService.getIfsByOver(page, ifsInventoryQuantityDto));
+    }
+
+
+    @ApiOperation(value = "鏂板鍘熸潗鏂欐姤妫�淇℃伅")
+    @PostMapping("/addIfsInventoryQuantity")
+    public Result addIfsInventoryQuantity(@RequestBody IfsInventoryQuantity ifsInventoryQuantity) {
+        rawMaterialOrderService.addIfsInventoryQuantity(ifsInventoryQuantity);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "鍘熸潗鏂欎笅鍗曟煡鐪嬪凡瀹屾垚淇℃伅")
+    @GetMapping("/getIfsByFinish")
+    public Result getIfsByFinish(Page page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto) throws Exception {
+        ifsInventoryQuantityDto.setIsFinish(1);
+        return Result.success(rawMaterialOrderService.getIfsByOver(page, ifsInventoryQuantityDto));
+    }
+
+    @ApiOperation(value = "寰俊鍙戦�佹枃浠舵祴璇�")
+    @GetMapping("/wxSend")
+    public Result wxSend(String user, String content, String filePath) throws Exception {
+        WxCpUtils.inform(user, content, new File(filePath));
+        return Result.success();
+    }
+
+    @ApiOperation(value = "閾滃崟涓濅笅鍗曞厤妫�")
+    @PostMapping("/addRawCopperOrderExemptionOrder")
+    public Result<?> addRawCopperOrderExemptionOrder(String str) {
+        Map<String, Object> map = JSON.parseObject(str, Map.class);
+        JSONArray jsonArray = JSON.parseArray(map.get("list")+"");
+        List<SampleProductDto> list = jsonArray.toJavaList(SampleProductDto.class);
+        CopperInsOrderDto CopperInsOrder = JSON.parseObject(JSON.toJSONString(map.get("insOrder")), CopperInsOrderDto.class);
+        return Result.success(rawMaterialOrderService.addRawCopperOrderExemptionOrder(list, CopperInsOrder));
+    }
+
+    /**
+     * 璁╂鏀捐
+     * @param param
+     * @return
+     */
+    @ApiOperation(value = "璁╂鏀捐")
+    @PostMapping("/concessionRelease")
+    public Result<?> concessionRelease(@RequestBody Map<String, Object> param){
+        Integer ifsInventoryId = (Integer) param.get("ifsInventoryId");
+        return Result.success(rawMaterialOrderService.concessionRelease(ifsInventoryId));
+    }
+
+    /**
+     * 鍘熸潗鏂欒繘鍘傛挙閿�涓嬪崟
+     * @param param
+     * @return
+     */
+    @ApiOperation(value = "鍘熸潗鏂欒繘鍘傛挙閿�涓嬪崟")
+    @PostMapping("/repealEnterRawOrder")
+    public Result<?> repealEnterRawOrder(@RequestBody Map<String, Object> param){
+        Integer enterOrderId = (Integer) param.get("enterOrderId");
+        return Result.success(rawMaterialOrderService.repealEnterRawOrder(enterOrderId));
+    }
+
+    /**
+     * 鍘熸潗鏂欏搴︽挙閿�涓嬪崟
+     * @param param
+     * @return
+     */
+    @ApiOperation(value = "鍘熸潗鏂欏搴︽挙閿�涓嬪崟")
+    @PostMapping("/repealQuarterRawOrder")
+    public Result<?> repealQuarterRawOrder(@RequestBody Map<String, Object> param){
+        Integer quarterOrderId = (Integer) param.get("quarterOrderId");
+        return Result.success(rawMaterialOrderService.repealQuarterRawOrder(quarterOrderId));
+    }
+
+    @ApiOperation(value = "鍏ㄩ儴淇℃伅瀵煎嚭")
+    @GetMapping("/rawAllExport")
+    public void rawAllExport(IfsInventoryQuantitySupplierDto dto, HttpServletResponse response) throws Exception {
+        rawMaterialOrderService.rawAllExport(dto,response);
+    }
+
+    @ApiOperation(value = "鍘熸潗鏂欐楠屾煡璇㈠搴︽楠�")
+    @GetMapping("/getIfsByQuarter")
+    public Result getIfsByQuarter(Page page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto){
+        return Result.success(rawMaterialOrderService.getIfsByQuarter(page, ifsInventoryQuantityDto));
+    }
+
+    /**
+     * 鎻愬墠鍏ュ簱
+     * @param param
+     * @return
+     */
+    @ApiOperation(value = "鎻愬墠鍏ュ簱")
+    @PostMapping("/advancedGodown")
+    public Result<?> advancedGodown(@RequestBody Map<String, Object> param){
+        Integer ifsInventoryId = (Integer) param.get("ifsInventoryId");
+        return Result.success(rawMaterialOrderService.advancedGodown(ifsInventoryId));
+    }
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/dto/UnqualifiedHandlerDto.java b/inspect-server/src/main/java/com/ruoyi/inspect/dto/UnqualifiedHandlerDto.java
new file mode 100644
index 0000000..1b0d8e0
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/dto/UnqualifiedHandlerDto.java
@@ -0,0 +1,148 @@
+package com.ruoyi.inspect.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.inspect.pojo.InsUnqualifiedHandler;
+import com.ruoyi.inspect.pojo.InsUnqualifiedHandlerFile;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+public class UnqualifiedHandlerDto extends InsUnqualifiedHandler implements Serializable {
+
+    @ApiModelProperty("鍩�")
+    private String contract;
+
+    @ApiModelProperty("璁㈠崟鍙�")
+    private String orderNo;
+
+    @ApiModelProperty("琛屽彿")
+    private String lineNo;
+
+    @ApiModelProperty("涓嬭揪鍙�")
+    private String releaseNo;
+
+    @ApiModelProperty("鎺ユ敹鍙�")
+    private Integer receiptNo;
+
+    @ApiModelProperty("闆朵欢鍙�")
+    private String partNo;
+
+    @ApiModelProperty("闆朵欢鎻忚堪")
+    private String partDesc;
+
+    @ApiModelProperty("鐘舵�佹弿杩�")
+    private String status;
+
+    @ApiModelProperty("鐘舵��")
+    private String statusDB;
+
+    @ApiModelProperty("鎶佃揪鐨勯噰璐暟閲�")
+    private BigDecimal qtyArrived;
+
+    @ApiModelProperty("宸叉楠岀殑璐拱鏁伴噺")
+    private BigDecimal qtyInspected;
+
+    @ApiModelProperty("瑕佹楠岀殑閲囪喘鏁伴噺")
+    private BigDecimal qtyToInspect;
+
+    @ApiModelProperty("渚涘簲鍟嗙紪鍙�")
+    private String supplierId;
+
+    @ApiModelProperty("渚涘簲鍟嗗悕绉�")
+    private String supplierName;
+
+    @ApiModelProperty("鎶佃揪鐨勫簱瀛樻暟閲�")
+    private BigDecimal invQtyInStore;
+
+    @ApiModelProperty("鎶佃揪鐨勯噰璐暟閲�")
+    private BigDecimal purQtyInStore;
+
+    @ApiModelProperty("閰嶇疆鏍囪瘑")
+    private String configurationId;
+
+    @ApiModelProperty("鎵瑰彿")
+    private String lotBatchNo;
+
+    @ApiModelProperty("wdr鍙�")
+    private String waivDevRejNo;
+
+    @ApiModelProperty("娲诲姩搴忓垪")
+    private String activitySeq;
+
+    @ApiModelProperty("搴忓垪鍙�")
+    private String serialNo;
+
+    @ApiModelProperty("搴撲綅鍙�")
+    private String locationNo;
+
+    @ApiModelProperty("鐗堟湰鍙�")
+    private String engChgLevel;
+
+    @ApiModelProperty("鎺ユ敹浜�")
+    private String receiver;
+
+    @ApiModelProperty("鎺ユ敹浜哄鍚�")
+    private String receiverName;
+
+    @ApiModelProperty("閲囪喘鍛�")
+    private String buyerCode;
+
+    @ApiModelProperty("閲囪喘鍛樺鍚�")
+    private String buyerName;
+
+    @ApiModelProperty("瀹為檯鍒拌揣鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private LocalDateTime arriveDate;
+
+    @ApiModelProperty("瀹為檯浜よ揣鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private LocalDateTime deliveryDate;
+
+    @ApiModelProperty("鐢熶骇鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private LocalDateTime productDate;
+
+    @ApiModelProperty("澶辨晥鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private LocalDateTime invalidDate;
+
+
+    @ApiModelProperty("瀹℃壒鏃ユ湡")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private LocalDateTime approvedDate;
+
+    @ApiModelProperty("閲囪喘鐢宠鍒涘缓浜�")
+    private String reqCeater;
+
+    @ApiModelProperty("閲囪喘鐢宠鍒涘缓浜哄鍚�")
+    private String reqCeaterName;
+
+    @ApiModelProperty("閲囪喘璁㈠崟琛屽娉�")
+    private String lineRemarks;
+
+    @ApiModelProperty("閲囪喘鍗曚綅")
+    private String buyUnitMeas;
+
+
+    private Integer isSource;
+
+    private Integer number;
+
+    private Integer state;
+
+    @ApiModelProperty("鎺ユ敹鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private LocalDateTime receiverDate;
+
+
+    @ApiModelProperty("闄勪欢鍒楄〃")
+    private List<InsUnqualifiedHandlerFile> unqualifiedHandlerFiles;
+
+
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java
index f637cc1..33b9e4c 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java
@@ -43,8 +43,6 @@
 
     Long getCount(@Param("inspectionItems") String inspectionItems, @Param("orderNumber") String orderNumber);
 
-    String getEnumLabelByValue(String value);
-
     String getStandardMethodCode(Integer id);
 
     int updateStatus( Integer id);
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderTemplateMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderTemplateMapper.java
new file mode 100644
index 0000000..6e064e5
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderTemplateMapper.java
@@ -0,0 +1,18 @@
+package com.ruoyi.inspect.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.inspect.pojo.InsOrderTemplate;
+
+/**
+* @author Administrator
+* @description 閽堝琛ㄣ�恑ns_order_template銆戠殑鏁版嵁搴撴搷浣淢apper
+* @createDate 2024-03-18 14:14:54
+* @Entity com.yuanchu.mom.pojo.InsOrderTemplate
+*/
+public interface InsOrderTemplateMapper extends BaseMapper<InsOrderTemplate> {
+
+}
+
+
+
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnqualifiedHandlerMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnqualifiedHandlerMapper.java
new file mode 100644
index 0000000..ad27c5c
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnqualifiedHandlerMapper.java
@@ -0,0 +1,38 @@
+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.UnqualifiedHandlerDto;
+import com.ruoyi.inspect.pojo.CommonOa;
+import com.ruoyi.inspect.pojo.InsUnqualifiedHandler;
+import com.ruoyi.inspect.vo.UnqualifiedHandlerVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+* @author 27233
+* @description 閽堝琛ㄣ�恑ns_unqualified_handler(涓嶅悎鏍煎鐞嗚〃)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @createDate 2024-07-31 13:38:14
+* @Entity com.yuanchu.mom.pojo.InsUnqualifiedHandler
+*/
+@Mapper
+public interface InsUnqualifiedHandlerMapper extends BaseMapper<InsUnqualifiedHandler> {
+
+    IPage<UnqualifiedHandlerVO> selectPageList(IPage<UnqualifiedHandlerVO> page, @Param("ew")QueryWrapper<UnqualifiedHandlerDto> ew);
+
+    UnqualifiedHandlerVO findById(Long id);
+
+    /**
+     * 鏌ョ湅oa娴佺▼
+     * @param id
+     * @return
+     */
+    List<CommonOa> getOaFlow(@Param("id") Integer id);
+}
+
+
+
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/pojo/CommonOa.java b/inspect-server/src/main/java/com/ruoyi/inspect/pojo/CommonOa.java
new file mode 100644
index 0000000..3d8abb5
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/pojo/CommonOa.java
@@ -0,0 +1,61 @@
+package com.ruoyi.inspect.pojo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * oa瀹℃牳娴佺▼淇℃伅璁板綍琛�
+ * @TableName common_oa
+ */
+@TableName(value ="common_oa")
+@Data
+public class CommonOa implements Serializable {
+    /**
+     * 涓婚敭id
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 鑺傜偣鍚嶇О
+     */
+    private String nodeName;
+
+    /**
+     * 鎿嶄綔
+     */
+    private String operation;
+
+    /**
+     * 瀹℃壒浜�
+     */
+    private String approver;
+
+    /**
+     * 瀹℃壒鏃ユ湡
+     */
+    private String approvalDate;
+
+    /**
+     * 瀹℃壒鏃堕棿
+     */
+    private String approvalTime;
+
+    /**
+     * 瀹℃壒鎰忚
+     */
+    private String approvalOpinion;
+
+    /**
+     * 娴佺▼id
+     */
+    private Long workflowId;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderTemplateService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderTemplateService.java
new file mode 100644
index 0000000..03d6894
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderTemplateService.java
@@ -0,0 +1,23 @@
+package com.ruoyi.inspect.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.inspect.pojo.InsOrderTemplate;
+
+import java.util.List;
+
+/**
+* @author Administrator
+* @description 閽堝琛ㄣ�恑ns_order_template銆戠殑鏁版嵁搴撴搷浣淪ervice
+* @createDate 2024-03-18 14:14:54
+*/
+public interface InsOrderTemplateService extends IService<InsOrderTemplate> {
+
+    int addInsOrderTemplate(InsOrderTemplate insOrderTemplate);
+
+    List<InsOrderTemplate> selectInsOrderTemplate(String company);
+
+    String selectInsOrderTemplateById(Integer id);
+
+    int delInsOrderTemplate(Integer id);
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsProductService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsProductService.java
index f1e6f22..078d393 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/InsProductService.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/InsProductService.java
@@ -1,5 +1,6 @@
 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.InsProductBindingDto;
@@ -22,7 +23,7 @@
 
     boolean write(InsOrder insOrder);
 
-    Map<String,Object> selectNoProducts(Page page, InsProduct insProduct,Integer orderId,String ids);
+    IPage<InsProduct> selectNoProducts(Page page, InsProduct insProduct, Integer orderId, String ids);
 
     void checkUpdate(Integer orderId,Integer state);
 
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/RawMaterialOrderService.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/RawMaterialOrderService.java
index 6869015..4673df1 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/RawMaterialOrderService.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/RawMaterialOrderService.java
@@ -95,7 +95,6 @@
      */
     void addIfsInventoryQuantity(IfsInventoryQuantity ifsInventoryQuantity);
 
-    void shiftingParking(List<Integer> ids);
 
     /**
      * 閾滃崟涓濅笅鍗曞厤妫�
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
index f70a18d..abb2686 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
@@ -1,1050 +1,1050 @@
-//package com.ruoyi.inspect.service.impl;
-//
-//import cn.hutool.core.collection.CollUtil;
-//import cn.hutool.core.util.ObjectUtil;
-//import cn.hutool.core.util.StrUtil;
-//import cn.hutool.json.JSONUtil;
-//import com.alibaba.excel.EasyExcel;
-//import com.alibaba.excel.ExcelWriter;
-//import com.alibaba.excel.write.metadata.WriteSheet;
-//import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
-//import com.alibaba.excel.write.style.column.SimpleColumnWidthStyleStrategy;
-//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-//import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-//import com.baomidou.mybatisplus.core.metadata.IPage;
-//import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-//import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
-//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-//import com.ruoyi.basic.mapper.IfsInventoryQuantityMapper;
-//import com.ruoyi.basic.mapper.StandardProductListMapper;
-//import com.ruoyi.basic.pojo.IfsInventoryQuantity;
-//import com.ruoyi.basic.pojo.StandardProductList;
-//import com.ruoyi.basic.pojo.StructureTestObject;
-//import com.ruoyi.common.constant.InsOrderTypeConstants;
-//import com.ruoyi.common.core.domain.entity.User;
-//import com.ruoyi.common.numgen.NumberGenerator;
-//import com.ruoyi.common.utils.*;
-//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.InsOrderService;
-//import com.ruoyi.inspect.service.InsProductService;
-//import com.ruoyi.inspect.service.InsSampleService;
-//import com.ruoyi.inspect.vo.InsOrderPrintingVo;
-//import com.ruoyi.inspect.vo.SampleDefectsFatherVo;
-//import com.ruoyi.system.mapper.CustomMapper;
-//import com.ruoyi.system.mapper.UserMapper;
-//import lombok.AllArgsConstructor;
-//import org.apache.commons.lang3.StringUtils;
-//import org.springframework.beans.BeanUtils;
-//import org.springframework.stereotype.Service;
-//import org.springframework.transaction.annotation.Transactional;
-//
-//import javax.servlet.http.HttpServletResponse;
-//import java.io.IOException;
-//import java.math.BigDecimal;
-//import java.net.URLEncoder;
-//import java.time.LocalDate;
-//import java.time.LocalDateTime;
-//import java.time.Month;
-//import java.time.format.DateTimeFormatter;
-//import java.util.*;
-//import java.util.concurrent.atomic.AtomicInteger;
-//import java.util.stream.Collectors;
-//
-///**
-// * @author gaoaoy
-// * @description 閽堝琛ㄣ�恑ns_order(妫�楠屼笅鍗�)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
-// * @createDate 2024-03-12 16:17:55
-// */
-//@Service
-//@AllArgsConstructor
-//public class InsOrderServiceImpl extends ServiceImpl<InsOrderMapper, InsOrder>
-//        implements InsOrderService {
-//
-//    private InsOrderMapper insOrderMapper;
-//    private InsSampleService insSampleService;
-//    private InsSampleMapper insSampleMapper;
-//    private InsProductService insProductService;
-//    private InsProductMapper insProductMapper;
-//    private InsProductUserMapper insProductUserMapper;
-//    private InsSampleUserMapper insSampleUserMapper;
-//    private InsOrderStateMapper insOrderStateMapper;
-//    private UserMapper userMapper;
-//    private IfsInventoryQuantityMapper ifsInventoryQuantityMapper;
-//    private CustomMapper customMapper;
-//    private final NumberGenerator<InsOrder> numberGenerator;
-//    private InsReportMapper insReportMapper;
-//    private InsUnqualifiedRetestProductMapper insUnqualifiedRetestProductMapper;
-//    private IfsApiUtils ifsApiUtils;
-//    private SpotCheckQuarterItemMapper spotCheckQuarterItemMapper;
-//    private StandardProductListMapper standardProductListMapper;
-//
-//
-//
-//    //鑾峰彇妫�楠屼笅鍗曟暟鎹�
-//    @Override
-//    public IPage<SampleOrderDto> selectInsOrderParameter(IPage<InsOrder> page, SampleOrderDto sampleOrderDto) {
-//        //todo: 鍙湅鎴戝垽鏂叏閮�,涓汉,缁勭粐鐨勬潈闄�
-//        String laboratory = null;
-//        // 鍒ゆ柇鏄惁鏄叏閮�
-//        String isOrderAll = null;
-//        if (sampleOrderDto.getState() != null && sampleOrderDto.getState() == -2) {
-//            isOrderAll = "1";
-//            sampleOrderDto.setState(null);
-//        }
-//        IPage<SampleOrderDto> sampleOrderDtoIPage = insOrderMapper.selectInsOrderPage(page, QueryWrappers.queryWrappers(sampleOrderDto), laboratory, isOrderAll);
-//        return insOrderMapper.selectInsOrderPage(page, QueryWrappers.queryWrappers(sampleOrderDto), laboratory, isOrderAll);
-//    }
-//
-//
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public int upInsOrder(Integer orderId, Integer sampleId, String appointed, Integer userId, String sonLaboratory) {
-//        InsOrder insOrder = new InsOrder();
-//        insOrder.setId(orderId);
-//        insOrder.setAppointed(StringUtils.isNotEmpty(appointed) ? LocalDate.parse(appointed) : null);
-//        insOrder.setSendTime(LocalDateTime.now());
-//        insOrderMapper.updateById(insOrder);
-//        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::getState, 1)
-//                .select(InsProduct::getSonLaboratory).groupBy(InsProduct::getSonLaboratory));
-//        for (InsProduct insProduct : insProducts) {
-//            InsOrderState insOrderState = new InsOrderState();
-//            insOrderState.setInsOrderId(orderId);
-//            try {
-//                insOrderState.setLaboratory(insProduct.getSonLaboratory());
-//            } catch (NullPointerException e) {
-//                throw new ErrorException("璇ユ楠屽崟鏈夋湭缁存姢瀹為獙瀹ょ殑妫�楠岄」鐩�");
-//            }
-//            insOrderState.setInsState(0);
-//            insOrderStateMapper.insert(insOrderState);
-//        }
-//        if (userId != null) {
-//            InsSampleUser insSampleUser = new InsSampleUser();
-//            insSampleUser.setState(0);
-//            insSampleUser.setUserId(userId);
-//            insSampleUser.setInsSampleId(orderId);
-//            insSampleUser.setSonLaboratory(sonLaboratory);
-//            insSampleUserMapper.insert(insSampleUser);
-//        }
-//
-//        // 鍒ゆ柇璁㈠崟鏈夋病鏈夌粦瀹氭娊鏍疯鍒�
-//        InsOrder order = insOrderMapper.selectById(orderId);
-//        if (order.getQuarterItemId() != null) {
-//           // 闇�瑕佹坊鍔犱笅鍙戞椂闂村埌鎶芥牱鏃堕棿, 鍙栨牱浜哄憳灏辨槸妫�娴嬩汉
-//            SpotCheckQuarterItem spotCheckQuarterItem = spotCheckQuarterItemMapper.selectById(order.getQuarterItemId());
-//            spotCheckQuarterItem.setSpotCheckTime(order.getSendTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
-//            User user = userMapper.selectById(userId);
-//            spotCheckQuarterItem.setSamplingUser(user.getName());
-//            spotCheckQuarterItemMapper.updateById(spotCheckQuarterItem);
-//        }
-//        return 1;
-//    }
-//
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public int addInsOrder(List<SampleProductDto> list, InsOrder insOrder, List<List<Integer>> pairing) {
-//        // todo: 涓嬪崟鍒ゆ柇鎶芥牱璁″垝鐨勫敮涓�鎬�
-//        if (insOrder.getQuarterItemId() != null) {
-//            Long quarterItemCount = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery()
-//                    .eq(InsOrder::getQuarterItemId, insOrder.getQuarterItemId())
-//                    .notIn(InsOrder::getState, -1 ,2 ,3));
-//            if (quarterItemCount > 0) {
-//                throw new ErrorException("璇ユ娊鏍疯鍒掑凡琚粦瀹氳繃");
-//            }
-//        }
-//
-//        insOrder.setState(0);
-//
-//        LocalDate appointed = insOrder.getAppointed();
-//
-//        insOrderMapper.insert(insOrder); // 涓昏〃
-//
-//        list.forEach(a -> {
-//            a.setId(null);
-//            a.setInsOrderId(insOrder.getId());
-//            insSampleMapper.insert(a);
-//            if (ObjectUtil.isNotEmpty(a.getInsProduct())) {
-//                // 鍒ゆ柇鏄惁濉啓寰呮椤规暟閲�
-//                if (a.getQuantity() != null) {
-//                    List<InsProduct> ip2 = new ArrayList<>();
-//                    for (Integer i = 1; i <= a.getQuantity(); i++) {
-//                        // 閲嶆柊鎷疯礉 鍒涘缓鏂板璞�
-//                        AtomicInteger atomicInteger = new AtomicInteger(i);
-//                        List<InsProduct> insProducts = a.getInsProduct().stream().map(insProduct -> {
-//                            insProduct.setRawMaterialTag(String.valueOf(atomicInteger.get()));
-//                            InsProduct product = new InsProduct();
-//                            BeanUtils.copyProperties(insProduct, product);
-//                            return product;
-//                        }).collect(Collectors.toList());
-//
-//                        ip2.addAll(insProducts);
-//                    }
-//                    addInsProductMethod(a.getId(), ip2);
-//                } else {
-//                    addInsProductMethod(a.getId(), a.getInsProduct());
-//                }
-//            }
-//            // 鍒ゆ柇鏄惁鏈夌數缂嗛厤缃�
-//            if (ObjectUtil.isNotEmpty(a.getInsulating())) {
-//                // 鍒ゆ柇鏄惁鏈夎緟鍔╃嚎鑺�
-//                if (ObjectUtil.isNotEmpty(a.getAuxiliaryWireCore())) {
-//                    if (a.getAuxiliaryWireCore().getInsProduct().stream().filter(insProduct -> insProduct.getState() == 1).count() !=
-//                            a.getInsulating().getInsProduct().stream().filter(insProduct -> insProduct.getState() == 1).count()) {
-//                        throw new ErrorException("鐢电紗閰嶇疆杈呭姪绾胯姱妫�楠岄」鏁伴噺涓嶇粺涓�, 璇锋鏌�");
-//                    }
-//                }
-//                List<InsProduct> ip2 = new ArrayList<>();
-//                for (String s : a.getInsulating().getNum()) {
-//                    // 閲嶆柊鎷疯礉 鍒涘缓鏂板璞�
-//                    List<InsProduct> insProducts = a.getInsulating().getInsProduct().stream().map(insProduct -> {
-//                        insProduct.setCableTag(s);
-//                        InsProduct product = new InsProduct();
-//                        BeanUtils.copyProperties(insProduct, product);
-//                        return product;
-//                    }).collect(Collectors.toList());
-//                    ip2.addAll(insProducts);
-//                }
-//                for (InsProduct product : ip2) {
-//                    product.setStandardMethodListId(a.getInsulating().getStandardMethodListId());
-//                }
-//                addInsProductMethod(a.getId(), ip2);
-//            }
-//            // 鍒ゆ柇鏄惁鏈夎緟鍔╃嚎鑺�
-//            if (ObjectUtil.isNotEmpty(a.getAuxiliaryWireCore())) {
-//                List<InsProduct> ip2 = new ArrayList<>();
-//                for (String s : a.getAuxiliaryWireCore().getNum()) {
-//                    // 閲嶆柊鎷疯礉 鍒涘缓鏂板璞�
-//                    List<InsProduct> insProducts = a.getAuxiliaryWireCore().getInsProduct().stream().map(insProduct -> {
-//                        insProduct.setCableTag(s);
-//                        InsProduct product = new InsProduct();
-//                        BeanUtils.copyProperties(insProduct, product);
-//                        return product;
-//                    }).collect(Collectors.toList());
-//                    ip2.addAll(insProducts);
-//                }
-//                for (InsProduct product : ip2) {
-//                    product.setStandardMethodListId(a.getAuxiliaryWireCore().getStandardMethodListId());
-//                }
-//                addInsProductMethod(a.getId(), ip2);
-//            }
-//            // 瀛愭牱鍝侀厤缃�
-//            if (ObjectUtil.isNotEmpty(a.getChildSampleList())) {
-//                for (SampleProductDto b : a.getChildSampleList()) {
-//                    for (int i = 0; i < b.getNum(); i++) {
-//                        b.setId(null);
-//                        b.setInsOrderId(insOrder.getId());
-//                        b.setParentId(a.getId());
-//                        insSampleMapper.insert(b);
-//                        if (ObjectUtil.isNotEmpty(b.getInsProduct())) {
-//                            addInsProductMethod(b.getId(), b.getInsProduct());
-//                        }
-//                    }
-//                }
-//            }
-//        });
-//        //鏄惁涓哄師鏉愭枡涓嬪崟
-//        if (insOrder.getTypeSource() != null && insOrder.getTypeSource().equals(1)) {
-//            // 鍘熸潗鏂欎笅鍗�: 濮旀墭浜哄氨鏄姤妫�浜�, 鐢熶骇鍗曚綅灏辨槸渚涘簲鍟嗗崟浣�
-//            IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(insOrder.getIfsInventoryId());
-//            Integer declareUserId = ifsInventoryQuantity.getDeclareUserId();
-//            User user = userMapper.selectById(declareUserId);
-//            if (user == null) {
-//               throw new ErrorException("缂哄皯鎶ユ浜轰俊鎭�");
-//            }
-//            // 渚涘簲鍟嗗悕绉�
-//            insOrder.setProduction(ifsInventoryQuantity.getSupplierName());
-//            insOrder.setProductionEn("");
-//            // 濮旀墭浜哄悕绉�
-//            insOrder.setPrepareUserId(user.getId());
-//            insOrder.setPrepareUser(user.getName());
-//            insOrder.setPrepareUserEn(user.getNameEn());
-//            insOrder.setPhone(user.getPhone());
-//            insOrder.setState(1);
-//            Long count1 = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery()
-//                    .eq(InsOrder::getIfsInventoryId, insOrder.getIfsInventoryId())
-//                    .ne(InsOrder::getState, -1)
-//                    .eq(InsOrder::getOrderType, InsOrderTypeConstants.ENTER_THE_FACTORY)
-//                    .ne(InsOrder::getId, insOrder.getId()));
-//            // 鍒ゆ柇涔嬪墠鏄惁鏈夎繘鍘傛楠�
-//            if (count1 == 0) {
-//                ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>().set(IfsInventoryQuantity::getState, 1)
-//                        .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId()));
-//            }
-//
-//            // 鍒ゆ柇缁撴潫鐘舵�佷慨鏀瑰悎鏍肩姸鎬�
-//            if (ifsInventoryQuantity.getIsFinish().equals(0)) {
-//                ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
-//                        .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId())
-//                        .set(IfsInventoryQuantity::getInspectStatus, 0));
-//            }
-//
-//            upInsOrderOfState(insOrder);
-//            upInsOrder(insOrder.getId(), null, appointed != null ? appointed.toString() : null, SecurityUtils.getUserId().intValue(), "鍘熸潗鏂�");
-//
-//
-//            // 鏍规嵁闆朵欢鍙峰垽鏂槸鍚︽槸杈呮潗
-//            boolean isRaw = false;
-//            StructureTestObject productObject = insOrderMapper.selectProductByPartNo(ifsInventoryQuantity.getPartNo());
-//            // 鏌ヨ浜у搧
-//            if (productObject != null && StrUtil.isNotBlank(productObject.getObjectType()) && productObject.getObjectType().equals("1")) {
-//                isRaw = true;
-//            } else {
-//            // 鏌ヨ瀵硅薄
-//                StructureTestObject testObject = insOrderMapper.selectByPartNo(ifsInventoryQuantity.getPartNo());
-//                if (testObject != null && StrUtil.isNotBlank(testObject.getObjectType()) && testObject.getObjectType().equals("1")) {
-//                    isRaw = true;
-//                }
-//            }
-//
-//            if (isRaw) {
-//                // 鑾峰彇褰撳墠瀛e害鐨勫紑濮嬫椂闂村拰缁撴潫鏃堕棿
-//                LocalDateTime now = LocalDateTime.now();
-//                // 鑾峰彇褰撳墠鏈堜唤
-//                int month = now.getMonthValue();
-//                // 纭畾褰撳墠瀛e害鐨勫紑濮嬫湀浠�
-//                int startMonth = (month - 1) / 3 * 3 + 1;
-//                // 鏋勯�犲搴︾殑寮�濮嬫椂闂�
-//                LocalDateTime startOfQuarter = LocalDateTime.of(now.getYear(), Month.of(startMonth), 1, 0, 0);
-//                // 璁$畻涓嬩竴涓搴︾殑寮�濮嬫椂闂�
-//                LocalDateTime startOfNextQuarter = startOfQuarter.plusMonths(3);
-//                // 璁$畻褰撳墠瀛e害鐨勭粨鏉熸椂闂�
-//                LocalDateTime endOfQuarter = startOfNextQuarter.minusSeconds(1);
-//
-//                // 鏍规嵁涓嬪崟鐨勮鏍煎瀷鍙峰垽鏂槸鍚︿负瀛e害棣栨鍑虹幇
-//                Integer count = ifsInventoryQuantityMapper.selectIsFirst(insOrder.getPartDetail(),
-//                        ifsInventoryQuantity.getSupplierName(),
-//                        startOfNextQuarter,
-//                        endOfQuarter);
-//
-//                if(count == 0) {
-//                    ifsInventoryQuantity.setIsFirst(1);
-//                    ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
-//                            .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId())
-//                            .set(IfsInventoryQuantity::getIsFirst, 1));
-//                }
-//            }
-//        }
-//        return insOrder.getId();
-//    }
-//
-//    /**
-//     * 娣诲姞妫�楠岄」
-//     * @param sampleId
-//     * @param productList
-//     */
-//    private void addInsProductMethod(Integer sampleId, List<InsProduct> productList) {
-//        for (InsProduct product : productList) {
-//            if (product.getState() == 1) {
-//                product.setId(null);
-//                product.setCreateTime(null);
-//                product.setCreateUser(null);
-//                product.setUpdateTime(null);
-//                product.setUpdateUser(null);
-//                product.setInsSampleId(sampleId);
-//                if (product.getInspectionItemSubclass() == null) {
-//                    product.setInspectionItemSubclass("");
-//                }
-//                if (StringUtils.isBlank(product.getAsk()) || StringUtils.isBlank(product.getTell())) {
-//                    throw new ErrorException("鏈夋楠岄」鐨勮姹傚�兼垨瑕佹眰鎻忚堪涓虹┖, 璇峰厛鍘绘爣鍑嗗簱閰嶇疆瑕佹眰鍊兼垨瑕佹眰鎻忚堪");
-//                }
-//                insProductMapper.insert(product);
-//            }
-//        }
-//    }
-//
-//
-//    @Override
-//    public Map<String, Object> getInsOrder(Integer id) {
-//        Map<String, Object> map = new HashMap<>();
-//        InsOrder insOrder = insOrderMapper.selectById(id);
-//        List<SampleProductDto> list;
-//        // 鍒ゆ柇鏄惁鏄繘鍘傛姤鍛婂厤妫�
-//        if (insOrder.getIsExemption().equals(1)) {
-//            list = insSampleMapper.selectExemptionByOrderId(id);
-//        } else {
-//            list = insSampleMapper.selectSampleProductListByOrderId2(id);
-//        }
-//        Map<String, Object> map1 = insSampleMapper.selectInsOrder(id);
-//        map.put("insOrder", insOrder);
-//        map.put("sampleProduct", list);
-//        map.put("insOrderTemplate", map1);
-//        return map;
-//    }
-//
-//    @Override
-//    public int upInsOrderOfState(InsOrder insOrder) {
-//        insOrder.setExamineTime(LocalDateTime.now());
-//        if (insOrder.getState() == 1) {
-//            //瀹℃牳閫氳繃鎵嶄細鐢熸垚濮旀墭缂栧彿
-//            // todo: 妫�楠岀被鍨嬬紪鍙�
-//            InsOrder order = this.getById(insOrder.getId());
-//            String code = "";
-//            switch (order.getOrderType()) {
-//                case InsOrderTypeConstants.SPOT_CHECK:
-//                    code = "C";
-//                    break;
-//                case InsOrderTypeConstants.CUSTOMER_ORDERED:
-//                    code = "W";
-//                    break;
-//                case InsOrderTypeConstants.ENTER_THE_FACTORY:
-//                case InsOrderTypeConstants.QUARTERLY_TEST:
-//                    code = "Y";
-//                    break;
-//            }
-//            // 鐢熸垚缂栧彿
-//            String no = numberGenerator.generateNumberWithPrefix(3,
-//                    "JCZX/ZB-" + code + LimsDateUtil.resetDate(LocalDateTime.now()),
-//                    InsOrder::getEntrustCode);
-//            // 鍒ゆ柇鏄惁鏄搴︽楠�, 鏄搴︽楠屽彇娑堝師鏉愭枡瀛e害妫�楠屼笅鍗�
-//            if (InsOrderTypeConstants.QUARTERLY_TEST.equals(order.getOrderType())) {
-//                ifsInventoryQuantityMapper.update(null,  Wrappers.<IfsInventoryQuantity>lambdaUpdate()
-//                        .eq(IfsInventoryQuantity::getId, order.getIfsInventoryId())
-//                        .set(IfsInventoryQuantity::getIsQuarter, 0));
-//
-//                // 鏌ヨ鏄惁鏈夎繃杩涘巶妫�楠�, 鏈夎幏鍙栭噷闈㈢殑缂栧彿
-//                InsOrder order1 = insOrderMapper.selectOne(Wrappers.<InsOrder>lambdaQuery()
-//                        .eq(InsOrder::getIfsInventoryId, order.getIfsInventoryId())
-//                        .ne(InsOrder::getState, -1)
-//                        .eq(InsOrder::getOrderType, InsOrderTypeConstants.ENTER_THE_FACTORY));
-//                if (order1 != null) {
-//                  no = order1.getEntrustCode();
-//                }
-//            }
-//
-//            int count = 1;
-//            // 鏌ヨ鏍峰搧琛�
-//            List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
-//                    .eq(InsSample::getInsOrderId, insOrder.getId()));
-//            for (InsSample insSample : insSamples) {
-//                if (StringUtils.isBlank(insSample.getSampleCode())) {
-//                    // 濡傛灉鍙湁涓�涓牱鍝佸氨涓嶉渶瑕佹嫾鎺ユ暟瀛�
-//                    if (insSamples.size() != 1) {
-//                        insSample.setSampleCode(no + "-" + count);
-//                        count++;
-//                    } else {
-//                        insSample.setSampleCode(no);
-//                    }
-//                }
-//            }
-//            insSampleService.updateBatchById(insSamples);
-//
-//            insOrder.setEntrustCode(no);
-//        }
-//        return insOrderMapper.updateById(insOrder);
-//    }
-//
-//    @Override
-//    public Map<String, Object> getInsOrderAndSample(Integer id, String laboratory) {
-//        Map<String, Object> map = new HashMap<>();
-//        InsOrder insOrder = insOrderMapper.selectById(id);
-//        List<SampleProductDto> list = insSampleMapper.getInsOrderAndSample(id, laboratory);
-//        for (SampleProductDto sampleProductDto : list) {
-//            List<Integer> ids = sampleProductDto.getInsProduct().stream().map(InsProduct::getId).collect(Collectors.toList());
-//            List<InsProductUser> insProductUsers = insProductUserMapper.selectList(Wrappers.<InsProductUser>lambdaQuery()
-//                    .in(InsProductUser::getInsProductId, ids));
-//            if (CollectionUtils.isNotEmpty(insProductUsers)) {
-//                List<Integer> userIds = insProductUsers.stream().map(InsProductUser::getCreateUser).distinct().collect(Collectors.toList());
-//                String collect = userMapper.selectBatchIds(userIds).stream().map(User::getName).collect(Collectors.joining(","));
-//                sampleProductDto.setCheckName(collect);
-//            }
-//        }
-//        map.put("insOrder", insOrder);
-//        map.put("sampleProduct", list);
-//        //鏌ヨ鎵�鏈夎褰曟ā鐗堝幓閲�
-//        List<Map<Integer, Object>> list2 = insOrderMapper.selectReportModelByOrderId(id, laboratory);
-//        map.put("reportModel", list2);
-//        return map;
-//    }
-//
-//    @Override
-//    public IPage<SampleProductDto2> selectSampleAndProductByOrderId(IPage<SampleProductDto2> page, SampleProductDto2 sampleProductDto) {
-//        IPage<SampleProductDto2> productDto2IPage = insOrderMapper.selectSampleAndProductByOrderId(page,
-//                QueryWrappers.queryWrappers(sampleProductDto)
-//                        .orderByAsc("sample_code")
-//                        .orderByAsc("cable_tag")
-//                        .orderByAsc("sort"),
-//                sampleProductDto.getId());
-//        return productDto2IPage;
-//    }
-//
-//    @Override
-//    public IPage<CostStatisticsDto> costStatistics(IPage<CostStatisticsDto> page, CostStatisticsDto costStatisticsDto) {
-//        String dates = costStatisticsDto.getDates();
-//        String[] split = dates.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(",");
-//        costStatisticsDto.setDates(null);
-//
-//        //todo:浠呯湅鑷繁
-//
-//        IPage<CostStatisticsDto> dtoIPage = insOrderMapper.selectCostStatistics(page, QueryWrappers.queryWrappers(costStatisticsDto).ge("create_time", split[0]).le("create_time", split[1] + " 23:59:59"));
-//        List<CostStatisticsDto> collect = dtoIPage.getRecords().stream().map(dto -> {
-//            Set<String> uniqueTags = new HashSet<>();
-//            if (dto.getInspectionItem().contains(",")) {
-//                for (String s : dto.getInspectionItem().split(",")) {
-//                    uniqueTags.add(s.split("@")[0]);
-//                }
-//            } else {
-//                uniqueTags.add(dto.getInspectionItem().split("@")[0]);
-//            }
-//            dto.setInspectionItem(uniqueTags.toString());
-//            return dto;
-//        }).collect(Collectors.toList());
-//        dtoIPage.setRecords(collect);
-//        return dtoIPage;
-//    }
-//
-//    @Override
-//    public Map<String, Object> costStatistics2(CostStatisticsDto costStatisticsDto) {
-//        Map<String, Object> map = new HashMap<>();
-//        String dates = costStatisticsDto.getDates();
-//        String[] split = dates.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(",");
-//        costStatisticsDto.setDates(null);
-//        List<CostStatisticsDto> costStatisticsDtos = insOrderMapper.selectCostStatistics2(QueryWrappers.queryWrappers(costStatisticsDto).ge("create_time", split[0]).le("create_time", split[1] + " 23:59:59"));
-//        double totalPrice = costStatisticsDtos.stream()
-//                .filter(dto -> dto.getPrice() != null) // 杩囨护鎺変环鏍间负 null 鐨勫璞�
-//                .mapToDouble(value -> value.getPrice().doubleValue() * value.getNum())
-//                .sum();
-//        map.put("total", totalPrice);
-//        return map;
-//    }
-//
-//    @Override
-//    public Map<String, Object> selectSampleDefects(Page page, String inspectionItems, String orderNumber) {
-//        List<SampleDefectsFatherVo> sampleDefectsFatherVos = insOrderMapper.selectSampleDefects(page, inspectionItems, orderNumber);
-//        Map<String, Object> map = new HashMap<>();
-//        map.put("records", sampleDefectsFatherVos);
-//        Long aLong = insOrderMapper.getCount(inspectionItems, orderNumber);
-//        map.put("total", aLong);
-//        return map;
-//    }
-//
-//    @Override
-//    public int updateStatus(Integer id) {
-//        return insOrderMapper.updateStatus(id);
-//    }
-//
-//
-//    @Override
-//    public void export(CostStatisticsDto costStatisticsDto, HttpServletResponse response) throws IOException {
-//        //鏌ヨ瀵煎嚭鐨勮垂鐢ㄧ粺璁℃暟鎹�
-//        String dates = costStatisticsDto.getDates();
-//        String[] split = dates.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(",");
-//        costStatisticsDto.setDates(null);
-//        List<CostStatisticsDto> costStatisticsDtos = insOrderMapper.selectCostStatistics2(QueryWrappers.queryWrappers(costStatisticsDto).ge("create_time", split[0]).le("create_time", split[1] + " 23:59:59"));
-//        costStatisticsDtos = costStatisticsDtos.stream().map(dto -> {
-//            Set<String> uniqueTags = new HashSet<>();
-//            if (dto.getInspectionItem().contains(",")) {
-//                for (String s : dto.getInspectionItem().split(",")) {
-//                    uniqueTags.add(s.split("@")[0]);
-//                }
-//            } else {
-//                uniqueTags.add(dto.getInspectionItem().split("@")[0]);
-//            }
-//            dto.setInspectionItem(uniqueTags.toString());
-//            return dto;
-//        }).collect(Collectors.toList());
-//
-//        response.setContentType("application/vnd.ms-excel");
-//        response.setCharacterEncoding("UTF-8");
-//        // 杩欓噷URLEncoder.encode鍙互闃叉涓枃涔辩爜 褰撶劧鍜宔asyexcel娌℃湁鍏崇郴
-//        String fileName = URLEncoder.encode("鏍峰搧璐圭敤缁熻瀵煎嚭", "UTF-8");
-//        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
-//        Map<String, List<CostStatisticsDto>> groupByCompany =
-//                costStatisticsDtos.stream().filter(e -> StrUtil.isNotEmpty(e.getCompany()))
-//                        .collect(Collectors.groupingBy(CostStatisticsDto::getCompany));
-//        try {
-//            // 鏂板缓ExcelWriter
-//            // 鏂板缓ExcelWriter
-//            ExcelWriter excelWriter =
-//                    EasyExcel.write(response.getOutputStream())
-//                            .registerWriteHandler(new SimpleColumnWidthStyleStrategy(25))
-//                            .build();
-//            for (Map.Entry<String, List<CostStatisticsDto>> companyDataEntry : groupByCompany.entrySet()) {
-//                String sheetName = companyDataEntry.getKey();
-//                List<CostStatisticsDto> dataList = companyDataEntry.getValue();
-//                WriteSheet mainSheet = EasyExcel.writerSheet(sheetName)
-//                        .head(CostStatisticsDto.class)
-//                        .registerWriteHandler(new SimpleColumnWidthStyleStrategy(25))
-//                        .build();
-//                excelWriter.write(dataList, mainSheet);
-//            }
-//            // 鍏抽棴娴�
-//            excelWriter.finish();
-//        } catch (IOException e) {
-//            throw new RuntimeException("瀵煎嚭澶辫触");
-//        }
-//    }
-//
-//    /**
-//     * 鑾峰彇ifs搴撳瓨淇℃伅
-//     * @param
-//     * @return
-//     */
-//    @Override
-//    public void getIfsOrder() {
-//        HashMap<String, Object> map = new HashMap<>();
-//        map.put("LOCATION_NO","1302");
-//        map.put("STATE_DB","To be Inspected");
-//        List<Map<String, Object>> inventory = ifsApiUtils.getInventory(JSONUtil.toJsonStr(map));
-//        if(inventory.size() == 0) {
-//            return;
-//        }
-//        // 杩涜淇濆瓨
-//        for (Map<String, Object> map1 : inventory) {
-//            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 鏃堕棿鏍煎紡鍖�
-//            IfsInventoryQuantity ifsInventoryQuantity = new IfsInventoryQuantity();
-//            ifsInventoryQuantity.setContract(map1.get("CONTRACT") == null ? "" : map1.get("CONTRACT").toString()); // 鍩�
-//            ifsInventoryQuantity.setPartNo(map1.get("PART_NO") == null ? "" : map1.get("PART_NO").toString() ); // 闆朵欢鍙�
-//            ifsInventoryQuantity.setPartDesc(map1.get("PART_DESC") == null ? "" : map1.get("PART_DESC").toString()); // 闆朵欢鎻忚堪
-//            ifsInventoryQuantity.setOrderNo(map1.get("ORDER_NO") == null ? "" : map1.get("ORDER_NO").toString()); // 璁㈠崟鍙�
-//            ifsInventoryQuantity.setLineNo(map1.get("LINE_NO") == null ? "" : map1.get("LINE_NO").toString()); // 琛屽彿
-//            ifsInventoryQuantity.setReleaseNo(map1.get("RELEASE_NO") == null ? "" : map1.get("RELEASE_NO").toString()); // 涓嬭揪鍙�
-//            ifsInventoryQuantity.setReceiptNo(Integer.parseInt(map1.get("RECEIPT_NO") == null ? "" : map1.get("RECEIPT_NO").toString())); // 鎺ユ敹鍙�
-//            ifsInventoryQuantity.setStatus(map1.get("STATE") == null ? "" : map1.get("STATE").toString()); // 鐘舵�佹弿杩�
-//            ifsInventoryQuantity.setStatusDb(map1.get("STATE_DB") == null ? "" : map1.get("STATE_DB").toString()); // 鐘舵��
-//            if(map1.get("QTY_ARRIVED") != null) {
-//                ifsInventoryQuantity.setQtyArrived(new BigDecimal(map1.get("QTY_ARRIVED").toString())); // 鎶佃揪鐨勯噰璐暟閲�
-//            }
-//            if(map1.get("QTY_INSPECTED") != null) {
-//                ifsInventoryQuantity.setQtyInspected(new BigDecimal(map1.get("QTY_INSPECTED").toString())); // 宸叉楠岀殑璐拱鏁伴噺
-//            }
-//            if(map1.get("QTY_TO_INSPECT") != null) {
-//                ifsInventoryQuantity.setQtyToInspect(new BigDecimal(map1.get("QTY_TO_INSPECT").toString())); // 瑕佹楠岀殑閲囪喘鏁伴噺
-//            }
-//            if(map1.get("INV_QTY_IN_STORE") != null) {
-//                ifsInventoryQuantity.setInvQtyInStore(new BigDecimal(map1.get("INV_QTY_IN_STORE").toString())); // 鎶佃揪鐨勫簱瀛樻暟閲�
-//            }
-//            if(map1.get("PUR_QTY_IN_STORE") != null) {
-//                ifsInventoryQuantity.setPurQtyInStore(new BigDecimal( map1.get("PUR_QTY_IN_STORE").toString())); // 鎶佃揪鐨勯噰璐暟閲�
-//
-//            }
-//            ifsInventoryQuantity.setSupplierId(map1.get("SUPPLIER_ID") == null ? "" : map1.get("SUPPLIER_ID").toString()); // 渚涘簲鍟咺D
-//            ifsInventoryQuantity.setSupplierName(map1.get("SUPPLIER_NAME") == null ? "" : map1.get("SUPPLIER_NAME").toString()); // 渚涘簲鍟嗗悕绉�
-//            ifsInventoryQuantity.setConfigurationId(map1.get("CONFIGURATION_ID") == null ? "" : map1.get("CONFIGURATION_ID").toString()); // 閰嶇疆鏍囪瘑
-//            ifsInventoryQuantity.setLotBatchNo(map1.get("LOT_BATCH_NO") == null ? "" : map1.get("LOT_BATCH_NO").toString()); // 鎵规鍙�
-//            ifsInventoryQuantity.setUpdateBatchNo(map1.get("LOT_BATCH_NO") == null ? "" : map1.get("LOT_BATCH_NO").toString()); // 鎵规鍙�
-//            ifsInventoryQuantity.setWaivDevRejNo(map1.get("WAIV_DEV_REJ_NO") == null ? "" : map1.get("WAIV_DEV_REJ_NO").toString()); // WDR鍙�
-//            ifsInventoryQuantity.setActivitySeq(map1.get("ACTIVITY_SEQ") == null ? null : Integer.parseInt(map1.get("ACTIVITY_SEQ").toString())); // 娲诲姩搴忓垪
-//            ifsInventoryQuantity.setSerialNo(map1.get("SERIAL_NO") == null ? "" : map1.get("SERIAL_NO").toString()); // 搴忓垪鍙�
-//            ifsInventoryQuantity.setLocationNo(map1.get("LOCATION_NO") == null ? "" : map1.get("LOCATION_NO").toString()); // 搴撲綅鍙�
-//            ifsInventoryQuantity.setEngChgLevel(map1.get("ENG_CHG_LEVEL") == null ? "" : map1.get("ENG_CHG_LEVEL").toString()); // 鐗堟湰鍙�
-//            ifsInventoryQuantity.setReceiver(map1.get("RECEIVER") == null ? "" : map1.get("RECEIVER").toString()); // 鎺ユ敹浜�
-//            ifsInventoryQuantity.setReceiverName(map1.get("RECEIVER_NAME") == null ? "" : map1.get("RECEIVER_NAME").toString()); // 鎺ユ敹浜哄悕绉�
-//            ifsInventoryQuantity.setBuyerCode(map1.get("BUYER_CODE") == null ? "" : map1.get("BUYER_CODE").toString()); // 閲囪喘鍛�
-//            ifsInventoryQuantity.setBuyerName(map1.get("BUYER_NAME") == null ? "" : map1.get("BUYER_NAME").toString()); // 閲囪喘鍛樺悕绉�
-//
-//            if(map1.get("ARRIVE_DATE") != null) {
-//                ifsInventoryQuantity.setArriveDate(LocalDateTime.parse(map1.get("ARRIVE_DATE").toString(),dateTimeFormatter)); // 瀹為檯鍒拌揣鏃ユ湡
-//            }
-//            if(map1.get("DELIVERY_DATE") != null) {
-//                ifsInventoryQuantity.setDeliveryDate(LocalDateTime.parse(map1.get("DELIVERY_DATE").toString(),dateTimeFormatter)); // 瀹為檯浜よ揣鏃ユ湡
-//            }
-//            if(map1.get("PRODUCT_DATE") != null) {
-//                ifsInventoryQuantity.setProductDate(LocalDateTime.parse(map1.get("PRODUCT_DATE").toString(),dateTimeFormatter)); // 鐢熶骇鏃ユ湡
-//
-//            }
-//            if(map1.get("INVALID_DATE") != null) {
-//                ifsInventoryQuantity.setInvalidDate(LocalDateTime.parse(map1.get("INVALID_DATE").toString(),dateTimeFormatter)); // 澶辨晥鏃ユ湡
-//            }
-//            if(map1.get("APPROVED_DATE") != null) {
-//                ifsInventoryQuantity.setApprovedDate(LocalDateTime.parse(map1.get("APPROVED_DATE").toString(),dateTimeFormatter)); // 瀹℃壒鏃ユ湡
-//            }
-//            ifsInventoryQuantity.setReqCeater(map1.get("REQ_CEATER") == null ? "" : map1.get("REQ_CEATER").toString()); // 閲囪喘鐢宠鍒涘缓浜�
-//            ifsInventoryQuantity.setReqCeaterName(map1.get("REQ_CEATER_NAME") == null ? "" : map1.get("REQ_CEATER_NAME").toString()); // 閲囪喘鐢宠鍒涘缓浜哄悕绉�
-//            ifsInventoryQuantity.setLineRemarks(map1.get("LINE_REMARKS") == null ? "" : map1.get("LINE_REMARKS").toString()); // 閲囪喘璁㈠崟琛屽娉�
-//            ifsInventoryQuantity.setBuyUnitMeas(map1.get("BUY_UNIT_MEAS") == null ? "" : map1.get("BUY_UNIT_MEAS").toString()); // 閲囪喘鍗曚綅
-//            ifsInventoryQuantity.setReceiverDate(LocalDateTime.now()); // 鎺ユ敹鏃ユ湡
-//            ifsInventoryQuantity.setIsSource(1);
-//            ifsInventoryQuantity.setState(0);
-//
-//            IfsInventoryQuantity one = ifsInventoryQuantityMapper.selectOne(new LambdaQueryWrapper<IfsInventoryQuantity>()
-//                    .eq(IfsInventoryQuantity::getOrderNo, ifsInventoryQuantity.getOrderNo())
-//                    .eq(IfsInventoryQuantity::getLineNo, ifsInventoryQuantity.getLineNo())
-//                    .eq(IfsInventoryQuantity::getReleaseNo, ifsInventoryQuantity.getReleaseNo())
-//                    .eq(IfsInventoryQuantity::getReceiptNo, ifsInventoryQuantity.getReceiptNo())
-//                    .eq(IfsInventoryQuantity::getLocationNo, ifsInventoryQuantity.getLocationNo())
-//                    .eq(IfsInventoryQuantity::getLotBatchNo, ifsInventoryQuantity.getLotBatchNo())
-//                    .eq(IfsInventoryQuantity::getSerialNo, ifsInventoryQuantity.getSerialNo())
-//                    .eq(IfsInventoryQuantity::getEngChgLevel, ifsInventoryQuantity.getEngChgLevel())
-//                    .eq(IfsInventoryQuantity::getWaivDevRejNo, ifsInventoryQuantity.getWaivDevRejNo())
-//                    .eq(IfsInventoryQuantity::getActivitySeq, ifsInventoryQuantity.getActivitySeq())
-//            );
-//            if(Objects.isNull(one)) {
-//
-//                ifsInventoryQuantity.setIsFirst(0);
-//                // 鏌ヨ浜т笟閾炬娴嬫暟鎹�
-//                String industryChainAttrFields = IndustryChainUtils.getIndustryChainAttrFields(ifsInventoryQuantity.getOrderNo(),
-//                        ifsInventoryQuantity.getLineNo(),
-//                        ifsInventoryQuantity.getReleaseNo());
-//                ifsInventoryQuantity.setIndustryChain(industryChainAttrFields);
-//
-//                ifsInventoryQuantityMapper.insert(ifsInventoryQuantity);
-//            }
-//        }
-//    }
-//
-//    /**
-//     * id鏄師鏉愭枡鐨刬d
-//     *
-//     * 淇敼璁㈠崟鍗曞彿
-//     * @param insOrder
-//     */
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public void updateEntrustCode(InsOrder insOrder) {
-//        // 鍒ゆ柇褰撳墠璁㈠崟鏄惁鐢熸垚浜嗘姤鍛�, 鐢熸垚浜嗘姤鍛婁笉鑳戒慨鏀瑰崟鍙�
-//        List<InsOrder> insOrders = insOrderMapper.selectList(Wrappers.<InsOrder>lambdaQuery()
-//                .eq(InsOrder::getIfsInventoryId, insOrder.getId())
-//                .ne(InsOrder::getState, -1));
-//        List<Integer> insOrderIds = insOrders.stream().map(InsOrder::getId).collect(Collectors.toList());
-//        Long count = insReportMapper.selectCount(Wrappers.<InsReport>lambdaQuery()
-//                .in(InsReport::getInsOrderId, insOrderIds));
-//        if (count > 0 ) {
-//            throw new ErrorException("褰撳墠璁㈠崟宸茬粡鐢熸垚浜嗘姤鍛婁笉鑳戒慨鏀圭紪鍙�");
-//        }
-//
-//
-//        Long count1 = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery()
-//                .eq(InsOrder::getEntrustCode, insOrder.getEntrustCode())
-//                .ne(InsOrder::getIfsInventoryId, insOrder.getId())
-//                .ne(InsOrder::getInsState, -1));
-//        if (count1 > 0) {
-//            throw new ErrorException("璇ョ紪鍙烽噸澶�");
-//        }
-//
-//        //淇敼鎶ュ憡鐨勭紪鍙�
-//        insOrderMapper.update(null, Wrappers.<InsOrder>lambdaUpdate()
-//                .eq(InsOrder::getIfsInventoryId, insOrder.getId())
-//                .set(InsOrder::getEntrustCode, insOrder.getEntrustCode()));
-//
-//        // 淇敼鏍峰搧鐨勭紪鍙�
-//        // 鏌ヨ鎵�鏈夌殑鏍峰搧
-//        List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
-//                .in(InsSample::getInsOrderId, insOrderIds));
-//        for (InsSample insSample : insSamples) {
-//            String sampleCode = insSample.getSampleCode();
-//            String updateCode = insOrder.getEntrustCode();
-//            // 鏌ユ壘鏈�鍚庝竴涓�'-'鐨勪綅缃�
-//            int lastDashIndex = sampleCode.lastIndexOf('-');
-//            if (lastDashIndex != -1) {
-//                int secondLastDashIndex = sampleCode.lastIndexOf('-', lastDashIndex - 1);
-//                // 澶勭悊鏈�鍚庝竴涓�'-'鍓嶇殑閮ㄥ垎
-//                if (secondLastDashIndex != -1) {
-//                    // 澶勭悊鏈�鍚庝竴涓�'-'鍙婁箣鍚庣殑閮ㄥ垎
-//                    String afterLastDash = sampleCode.substring(lastDashIndex);
-//
-//                    updateCode = updateCode + afterLastDash;
-//                }
-//            }
-//            insSampleMapper.update(null, Wrappers.<InsSample>lambdaUpdate()
-//                    .eq(InsSample::getId, insSample.getId())
-//                    .set(InsSample::getSampleCode, updateCode));
-//
-//        }
-//    }
-//
-//    @Override
-//    public List<InsUnqualifiedRetestProduct> getRetestResult(Integer insProductId) {
-//        return insUnqualifiedRetestProductMapper.selectList(Wrappers.<InsUnqualifiedRetestProduct>lambdaQuery()
-//                .eq(InsUnqualifiedRetestProduct::getInsProductId, insProductId));
-//    }
-//
-//    /**
-//     * 淇敼閲囪喘璁㈠崟鎺ユ敹鐘舵��, 閬垮厤鍥炴粴
-//     * @param id
-//     */
-//    @Transactional
-//    public void updateIfsInventoryQuantity(Integer id) {
-//        ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
-//                .set(IfsInventoryQuantity::getIsRegister, 1)
-//                .eq(IfsInventoryQuantity::getId, id));
-//    }
-//
-//    /**
-//     * 鏂板閾滃崟涓濅笅鍗�
-//     * @param list
-//     * @param insOrder
-//     * @return
-//     */
-//    @Override
-//    public int addRawCopperOrder(List<SampleProductDto> list, CopperInsOrderDto insOrder) {
-//        insOrder.setState(1);
-//        insOrder.setTypeSource(1);
-//
-//        LocalDate appointed = insOrder.getAppointed();
-//
-//        insOrderMapper.insert(insOrder); // 涓昏〃
-//
-//        list.forEach(a -> {
-//            a.setId(null);
-//            a.setInsOrderId(insOrder.getId());
-//            insSampleMapper.insert(a);
-//            if (ObjectUtil.isNotEmpty(a.getInsProduct())) {
-//                // 鍒ゆ柇鏄惁濉啓寰呮椤规暟閲�
-//                if (a.getQuantity() != null) {
-//                    List<InsProduct> ip2 = new ArrayList<>();
-//                    for (Integer i = 1; i <= a.getQuantity(); i++) {
-//                        // 閲嶆柊鎷疯礉 鍒涘缓鏂板璞�
-//                        AtomicInteger atomicInteger = new AtomicInteger(i);
-//                        List<InsProduct> insProducts = a.getInsProduct().stream().map(insProduct -> {
-//                            insProduct.setRawMaterialTag(String.valueOf(atomicInteger.get()));
-//                            InsProduct product = new InsProduct();
-//                            BeanUtils.copyProperties(insProduct, product);
-//                            return product;
-//                        }).collect(Collectors.toList());
-//
-//                        ip2.addAll(insProducts);
-//                    }
-//                    addInsProductMethod(a.getId(), ip2);
-//                } else {
-//                    addInsProductMethod(a.getId(), a.getInsProduct());
-//                }
-//            }
-//            if (ObjectUtil.isNotEmpty(a.getChildSampleList())) {
-//                for (SampleProductDto b : a.getChildSampleList()) {
-//                    for (int i = 0; i < b.getNum(); i++) {
-//                        b.setId(null);
-//                        b.setInsOrderId(insOrder.getId());
-//                        b.setParentId(a.getId());
-//                        insSampleMapper.insert(b);
-//                        if (ObjectUtil.isNotEmpty(b.getInsProduct())) {
-//                            addInsProductMethod(b.getId(), b.getInsProduct());
-//                        }
-//                    }
-//                }
-//            }
-//        });
-//
-//        // 娣诲姞鍘熸潗鏂欎俊鎭�
-//        IfsInventoryQuantity ifsInventoryQuantity = new IfsInventoryQuantity();
-//        // 鍩烘湰淇℃伅
-//        ifsInventoryQuantity.setIsSource(0);
-//        ifsInventoryQuantity.setIsInspect(1);
-//        ifsInventoryQuantity.setState(1);
-//        ifsInventoryQuantity.setIsFinish(0);
-//        ifsInventoryQuantity.setIsCopper(1);
-//        ifsInventoryQuantity.setIsQuarter(0);
-//        ifsInventoryQuantity.setInspectStatus(0);
-//
-//        ifsInventoryQuantity.setQtyArrived(insOrder.getQtyArrived());
-//        ifsInventoryQuantity.setBuyUnitMeas(insOrder.getBuyUnitMeas());
-//        ifsInventoryQuantity.setSupplierName(insOrder.getSupplierName());
-//        ifsInventoryQuantity.setUpdateBatchNo(insOrder.getUpdateBatchNo());
-//        ifsInventoryQuantity.setDeclareDate(insOrder.getDeclareDate());
-//
-//        ifsInventoryQuantityMapper.insert(ifsInventoryQuantity);
-//
-//
-//        insOrder.setIfsInventoryId(ifsInventoryQuantity.getId());
-//        insOrder.setState(1);
-//
-//
-//        upInsOrderOfState(insOrder);
-//        upInsOrder(insOrder.getId(), null, appointed != null ? appointed.toString() : null, SecurityUtils.getUserId().intValue(), "鍘熸潗鏂�");
-//
-//        return insOrder.getId();
-//    }
-//
-//    /**
-//     * 淇敼濮旀墭涓嬪崟缂栧彿
-//     * @param insOrder
-//     */
-//    @Override
-//    public void updateOrderEntrustCode(InsOrder insOrder) {
-//        // 鍒ゆ柇褰撳墠璁㈠崟鏄惁鐢熸垚浜嗘姤鍛�, 鐢熸垚浜嗘姤鍛婁笉鑳戒慨鏀瑰崟鍙�
-//        Long count = insReportMapper.selectCount(Wrappers.<InsReport>lambdaQuery()
-//                .eq(InsReport::getInsOrderId, insOrder.getId()));
-//        if (count > 0 ) {
-//            throw new ErrorException("褰撳墠璁㈠崟宸茬粡鐢熸垚浜嗘姤鍛婁笉鑳戒慨鏀圭紪鍙�");
-//        }
-//
-//        Long count1 = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery()
-//                .eq(InsOrder::getEntrustCode, insOrder.getEntrustCode()));
-//        if (count1 > 0) {
-//            throw new ErrorException("璇ョ紪鍙烽噸澶�");
-//        }
-//
-//        //淇敼鎶ュ憡鐨勭紪鍙�
-//        insOrderMapper.update(null, Wrappers.<InsOrder>lambdaUpdate()
-//                .eq(InsOrder::getId, insOrder.getId())
-//                .set(InsOrder::getEntrustCode, insOrder.getEntrustCode()));
-//
-//        // 淇敼鏍峰搧鐨勭紪鍙�
-//        // 鏌ヨ鎵�鏈夌殑鏍峰搧
-//        List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
-//                .eq(InsSample::getInsOrderId, insOrder.getId()));
-//        for (InsSample insSample : insSamples) {
-//            String sampleCode = insSample.getSampleCode();
-//            String updateCode = insOrder.getEntrustCode();
-//            // 鏌ユ壘鏈�鍚庝竴涓�'-'鐨勪綅缃�
-//            int lastDashIndex = sampleCode.lastIndexOf('-');
-//            if (lastDashIndex != -1) {
-//                int secondLastDashIndex = sampleCode.lastIndexOf('-', lastDashIndex - 1);
-//                // 澶勭悊鏈�鍚庝竴涓�'-'鍓嶇殑閮ㄥ垎
-//                if (secondLastDashIndex != -1) {
-//                    // 澶勭悊鏈�鍚庝竴涓�'-'鍙婁箣鍚庣殑閮ㄥ垎
-//                    String afterLastDash = sampleCode.substring(lastDashIndex);
-//
-//                    updateCode = updateCode + afterLastDash;
-//                }
-//            }
-//            insSampleMapper.update(null, Wrappers.<InsSample>lambdaUpdate()
-//                    .eq(InsSample::getId, insSample.getId())
-//                    .set(InsSample::getSampleCode, updateCode));
-//
-//        }
-//    }
-//
-//    /**
-//     * 淇敼妫�楠屼笅鍗曞唴瀹�
-//     * @param insOrderUpdateDto
-//     * @return
-//     */
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public Boolean updateInsOrder(InsOrderUpdateDto insOrderUpdateDto) {
-//        // 淇敼璁㈠崟
-//        insOrderUpdateDto.getInsOrder().setState(0);
-//        insOrderUpdateDto.getInsOrder().setTell("");
-//        insOrderMapper.updateById(insOrderUpdateDto.getInsOrder());
-//
-//        // 淇敼妫�楠岄」
-//        for (SampleProductDto sampleProductDto : insOrderUpdateDto.getSampleProduct()) {
-//            insProductService.updateBatchById(sampleProductDto.getInsProduct());
-//        }
-//
-//        return true;
-//    }
-//
-//    /**
-//     * 鎴愬搧鏍囩鎵撳嵃
-//     * @param ids
-//     * @return
-//     */
-//    @Override
-//    public List<InsOrderPrintingVo> labelOrderPrinting(List<Integer> ids) {
-//        return insOrderMapper.labelOrderPrinting(ids);
-//    }
-//
-//    /**
-//     * 鏍规嵁鏍峰搧id鏌ヨ妫�楠岄」鏍�
-//     * @param insSampleId
-//     * @return
-//     */
-//    @Override
-//    public List<StandardProductList> getProductTreeBySampleId(Integer insSampleId) {
-//        // 鏌ヨ绗竴涓楠岄」鑾峰彇妫�楠岄」鏍�
-//        InsProduct insProduct = insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
-//                .eq(InsProduct::getInsSampleId, insSampleId)
-//                .last("limit 1"));
-//        String tree = insProduct.getFactory() + " - " +
-//                insProduct.getLaboratory() + " - " +
-//                insProduct.getSampleType() + " - " +
-//                insProduct.getSample() + " - " +
-//                insProduct.getModel();
-//        // 鏌ヨ鏍囧噯鏍�
-//        List<StandardProductList> standardProductLists = standardProductListMapper.selectList(Wrappers.<StandardProductList>lambdaQuery()
-//                .eq(StandardProductList::getStandardMethodListId, insProduct.getStandardMethodListId())
-//                .eq(StandardProductList::getTree, tree));
-//        for (StandardProductList standardProductList : standardProductLists) {
-//            standardProductList.setId(null);
-//        }
-//
-//        return standardProductLists;
-//    }
-//
-//    /**
-//     * 娣诲姞閬楁紡鐨勬楠岄」
-//     * @param omitOrderProductDto
-//     * @return
-//     */
-//    @Override
-//    public boolean addOmitOrderProduct(OmitOrderProductDto omitOrderProductDto) {
-//        if (omitOrderProductDto.getInsSampleId() == null) {
-//            throw new ErrorException("缂哄皯鏍峰搧Id");
-//        }
-//        for (InsProduct product : omitOrderProductDto.getInsProductBindingList()) {
-//            if (product.getState() == 1) {
-//                product.setId(null);
-//                product.setCreateTime(null);
-//                product.setCreateUser(null);
-//                product.setUpdateTime(null);
-//                product.setUpdateUser(null);
-//                product.setInsSampleId(omitOrderProductDto.getInsSampleId());
-//                if (StringUtils.isBlank(product.getCableTag())) {
-//                    product.setCableTag(null);
-//                }
-//                if (product.getInspectionItemSubclass() == null) {
-//                    product.setInspectionItemSubclass("");
-//                }
-//                if (StringUtils.isBlank(product.getAsk()) || StringUtils.isBlank(product.getTell())) {
-//                    throw new ErrorException("鏈夋楠岄」鐨勮姹傚�兼垨瑕佹眰鎻忚堪涓虹┖, 璇峰~鍐欒姹傚�兼垨瑕佹眰鎻忚堪");
-//                }
-//                insProductMapper.insert(product);
-//            }
-//        }
-//
-//        return true;
-//    }
-//
-//    /**
-//     * 鎴愬搧妫�楠屽崟瀵煎嚭
-//     * @param sampleOrderDto
-//     * @param response
-//     */
-//    @Override
-//    public void rawAllInsOrderExport(SampleOrderDto sampleOrderDto, HttpServletResponse response) {
-//        //鍒ゆ柇鍏ㄩ儴,涓汉,缁勭粐鐨勬潈闄�
-//        //todo:浠呯湅鎴戣幏鍙栧綋鍓嶄汉鎵�灞炲疄楠屽id
-//        String laboratory = null;
-//        // 鍒ゆ柇鏄惁鏄叏閮�
-//        String isOrderAll = null;
-//        if (sampleOrderDto.getState() != null && sampleOrderDto.getState() == -2) {
-//            isOrderAll = "1";
-//            sampleOrderDto.setState(null);
-//        }
-//        List<SampleOrderDto> sampleOrderDtoList = insOrderMapper.rawAllInsOrderExport(QueryWrappers.queryWrappers(sampleOrderDto), laboratory, isOrderAll);
-//
-//        // 鍒ゆ柇鏄惁鏄笉鍚堟牸, 涓嶅悎鏍兼煡璇笉鍚堟牸椤�
-//        for (SampleOrderDto orderDto : sampleOrderDtoList) {
-//            if (orderDto.getInsResult() != null && orderDto.getInsResult() == 0){
-//                // 鏌ヨ涓嶅悎鏍奸」
-//                List<String> unqualifiedList = insProductMapper.selectUnqualifiedList(orderDto.getId());
-//                orderDto.setUnqualifiedItem(CollUtil.join(unqualifiedList, ","));
-//            }
-//            orderDto.setCreateTimeString(orderDto.getCreateTime() == null ? "" : orderDto.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
-//
-//        }
-//
-//        response.setContentType("application/vnd.ms-excel");
-//        response.setCharacterEncoding("UTF-8");
-//        try {
-//            // 杩欓噷URLEncoder.encode鍙互闃叉涓枃涔辩爜 褰撶劧鍜宔asyexcel娌℃湁鍏崇郴
-//            String fileName = URLEncoder.encode("濮旀墭妫�娴嬩俊鎭鍑�", "UTF-8");
-//            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
-//            //鏂板缓ExcelWriter
-//            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
-//            //鑾峰彇sheet0瀵硅薄
-//            WriteSheet mainSheet = EasyExcel.writerSheet(0, "濮旀墭妫�娴嬩俊鎭鍑�").head(SampleOrderDto.class).build();
-//
-//            //鍚憇heet0鍐欏叆鏁版嵁 浼犲叆绌簂ist杩欐牱鍙鍑鸿〃澶�
-//            excelWriter.write(sampleOrderDtoList, mainSheet);
-//            //鍏抽棴娴�
-//            excelWriter.finish();
-//        } catch (IOException e) {
-//            throw new RuntimeException("瀵煎嚭澶辫触");
-//        }
-//    }
-//
-//}
-//
-//
-//
-//
+package com.ruoyi.inspect.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.alibaba.excel.write.style.column.SimpleColumnWidthStyleStrategy;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.mapper.IfsInventoryQuantityMapper;
+import com.ruoyi.basic.mapper.StandardProductListMapper;
+import com.ruoyi.basic.pojo.IfsInventoryQuantity;
+import com.ruoyi.basic.pojo.StandardProductList;
+import com.ruoyi.basic.pojo.StructureTestObject;
+import com.ruoyi.common.constant.InsOrderTypeConstants;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.common.utils.*;
+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.InsOrderService;
+import com.ruoyi.inspect.service.InsProductService;
+import com.ruoyi.inspect.service.InsSampleService;
+import com.ruoyi.inspect.vo.InsOrderPrintingVo;
+import com.ruoyi.inspect.vo.SampleDefectsFatherVo;
+import com.ruoyi.system.mapper.CustomMapper;
+import com.ruoyi.system.mapper.UserMapper;
+import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.Month;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+/**
+ * @author gaoaoy
+ * @description 閽堝琛ㄣ�恑ns_order(妫�楠屼笅鍗�)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+ * @createDate 2024-03-12 16:17:55
+ */
+@Service
+@AllArgsConstructor
+public class InsOrderServiceImpl extends ServiceImpl<InsOrderMapper, InsOrder>
+        implements InsOrderService {
+
+    private InsOrderMapper insOrderMapper;
+    private InsSampleService insSampleService;
+    private InsSampleMapper insSampleMapper;
+    private InsProductService insProductService;
+    private InsProductMapper insProductMapper;
+    private InsProductUserMapper insProductUserMapper;
+    private InsSampleUserMapper insSampleUserMapper;
+    private InsOrderStateMapper insOrderStateMapper;
+    private UserMapper userMapper;
+    private IfsInventoryQuantityMapper ifsInventoryQuantityMapper;
+    private CustomMapper customMapper;
+    private final NumberGenerator<InsOrder> numberGenerator;
+    private InsReportMapper insReportMapper;
+    private InsUnqualifiedRetestProductMapper insUnqualifiedRetestProductMapper;
+    private IfsApiUtils ifsApiUtils;
+    private SpotCheckQuarterItemMapper spotCheckQuarterItemMapper;
+    private StandardProductListMapper standardProductListMapper;
+
+
+
+    //鑾峰彇妫�楠屼笅鍗曟暟鎹�
+    @Override
+    public IPage<SampleOrderDto> selectInsOrderParameter(IPage<InsOrder> page, SampleOrderDto sampleOrderDto) {
+        //todo: 鍙湅鎴戝垽鏂叏閮�,涓汉,缁勭粐鐨勬潈闄�
+        String laboratory = null;
+        // 鍒ゆ柇鏄惁鏄叏閮�
+        String isOrderAll = null;
+        if (sampleOrderDto.getState() != null && sampleOrderDto.getState() == -2) {
+            isOrderAll = "1";
+            sampleOrderDto.setState(null);
+        }
+        IPage<SampleOrderDto> sampleOrderDtoIPage = insOrderMapper.selectInsOrderPage(page, QueryWrappers.queryWrappers(sampleOrderDto), laboratory, isOrderAll);
+        return insOrderMapper.selectInsOrderPage(page, QueryWrappers.queryWrappers(sampleOrderDto), laboratory, isOrderAll);
+    }
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int upInsOrder(Integer orderId, Integer sampleId, String appointed, Integer userId, String sonLaboratory) {
+        InsOrder insOrder = new InsOrder();
+        insOrder.setId(orderId);
+        insOrder.setAppointed(StringUtils.isNotEmpty(appointed) ? LocalDate.parse(appointed) : null);
+        insOrder.setSendTime(LocalDateTime.now());
+        insOrderMapper.updateById(insOrder);
+        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::getState, 1)
+                .select(InsProduct::getSonLaboratory).groupBy(InsProduct::getSonLaboratory));
+        for (InsProduct insProduct : insProducts) {
+            InsOrderState insOrderState = new InsOrderState();
+            insOrderState.setInsOrderId(orderId);
+            try {
+                insOrderState.setLaboratory(insProduct.getSonLaboratory());
+            } catch (NullPointerException e) {
+                throw new ErrorException("璇ユ楠屽崟鏈夋湭缁存姢瀹為獙瀹ょ殑妫�楠岄」鐩�");
+            }
+            insOrderState.setInsState(0);
+            insOrderStateMapper.insert(insOrderState);
+        }
+        if (userId != null) {
+            InsSampleUser insSampleUser = new InsSampleUser();
+            insSampleUser.setState(0);
+            insSampleUser.setUserId(userId);
+            insSampleUser.setInsSampleId(orderId);
+            insSampleUser.setSonLaboratory(sonLaboratory);
+            insSampleUserMapper.insert(insSampleUser);
+        }
+
+        // 鍒ゆ柇璁㈠崟鏈夋病鏈夌粦瀹氭娊鏍疯鍒�
+        InsOrder order = insOrderMapper.selectById(orderId);
+        if (order.getQuarterItemId() != null) {
+           // 闇�瑕佹坊鍔犱笅鍙戞椂闂村埌鎶芥牱鏃堕棿, 鍙栨牱浜哄憳灏辨槸妫�娴嬩汉
+            SpotCheckQuarterItem spotCheckQuarterItem = spotCheckQuarterItemMapper.selectById(order.getQuarterItemId());
+            spotCheckQuarterItem.setSpotCheckTime(order.getSendTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+            User user = userMapper.selectById(userId);
+            spotCheckQuarterItem.setSamplingUser(user.getName());
+            spotCheckQuarterItemMapper.updateById(spotCheckQuarterItem);
+        }
+        return 1;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int addInsOrder(List<SampleProductDto> list, InsOrder insOrder, List<List<Integer>> pairing) {
+        // todo: 涓嬪崟鍒ゆ柇鎶芥牱璁″垝鐨勫敮涓�鎬�
+        if (insOrder.getQuarterItemId() != null) {
+            Long quarterItemCount = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery()
+                    .eq(InsOrder::getQuarterItemId, insOrder.getQuarterItemId())
+                    .notIn(InsOrder::getState, -1 ,2 ,3));
+            if (quarterItemCount > 0) {
+                throw new ErrorException("璇ユ娊鏍疯鍒掑凡琚粦瀹氳繃");
+            }
+        }
+
+        insOrder.setState(0);
+
+        LocalDate appointed = insOrder.getAppointed();
+
+        insOrderMapper.insert(insOrder); // 涓昏〃
+
+        list.forEach(a -> {
+            a.setId(null);
+            a.setInsOrderId(insOrder.getId());
+            insSampleMapper.insert(a);
+            if (ObjectUtil.isNotEmpty(a.getInsProduct())) {
+                // 鍒ゆ柇鏄惁濉啓寰呮椤规暟閲�
+                if (a.getQuantity() != null) {
+                    List<InsProduct> ip2 = new ArrayList<>();
+                    for (Integer i = 1; i <= a.getQuantity(); i++) {
+                        // 閲嶆柊鎷疯礉 鍒涘缓鏂板璞�
+                        AtomicInteger atomicInteger = new AtomicInteger(i);
+                        List<InsProduct> insProducts = a.getInsProduct().stream().map(insProduct -> {
+                            insProduct.setRawMaterialTag(String.valueOf(atomicInteger.get()));
+                            InsProduct product = new InsProduct();
+                            BeanUtils.copyProperties(insProduct, product);
+                            return product;
+                        }).collect(Collectors.toList());
+
+                        ip2.addAll(insProducts);
+                    }
+                    addInsProductMethod(a.getId(), ip2);
+                } else {
+                    addInsProductMethod(a.getId(), a.getInsProduct());
+                }
+            }
+            // 鍒ゆ柇鏄惁鏈夌數缂嗛厤缃�
+            if (ObjectUtil.isNotEmpty(a.getInsulating())) {
+                // 鍒ゆ柇鏄惁鏈夎緟鍔╃嚎鑺�
+                if (ObjectUtil.isNotEmpty(a.getAuxiliaryWireCore())) {
+                    if (a.getAuxiliaryWireCore().getInsProduct().stream().filter(insProduct -> insProduct.getState() == 1).count() !=
+                            a.getInsulating().getInsProduct().stream().filter(insProduct -> insProduct.getState() == 1).count()) {
+                        throw new ErrorException("鐢电紗閰嶇疆杈呭姪绾胯姱妫�楠岄」鏁伴噺涓嶇粺涓�, 璇锋鏌�");
+                    }
+                }
+                List<InsProduct> ip2 = new ArrayList<>();
+                for (String s : a.getInsulating().getNum()) {
+                    // 閲嶆柊鎷疯礉 鍒涘缓鏂板璞�
+                    List<InsProduct> insProducts = a.getInsulating().getInsProduct().stream().map(insProduct -> {
+                        insProduct.setCableTag(s);
+                        InsProduct product = new InsProduct();
+                        BeanUtils.copyProperties(insProduct, product);
+                        return product;
+                    }).collect(Collectors.toList());
+                    ip2.addAll(insProducts);
+                }
+                for (InsProduct product : ip2) {
+                    product.setStandardMethodListId(a.getInsulating().getStandardMethodListId());
+                }
+                addInsProductMethod(a.getId(), ip2);
+            }
+            // 鍒ゆ柇鏄惁鏈夎緟鍔╃嚎鑺�
+            if (ObjectUtil.isNotEmpty(a.getAuxiliaryWireCore())) {
+                List<InsProduct> ip2 = new ArrayList<>();
+                for (String s : a.getAuxiliaryWireCore().getNum()) {
+                    // 閲嶆柊鎷疯礉 鍒涘缓鏂板璞�
+                    List<InsProduct> insProducts = a.getAuxiliaryWireCore().getInsProduct().stream().map(insProduct -> {
+                        insProduct.setCableTag(s);
+                        InsProduct product = new InsProduct();
+                        BeanUtils.copyProperties(insProduct, product);
+                        return product;
+                    }).collect(Collectors.toList());
+                    ip2.addAll(insProducts);
+                }
+                for (InsProduct product : ip2) {
+                    product.setStandardMethodListId(a.getAuxiliaryWireCore().getStandardMethodListId());
+                }
+                addInsProductMethod(a.getId(), ip2);
+            }
+            // 瀛愭牱鍝侀厤缃�
+            if (ObjectUtil.isNotEmpty(a.getChildSampleList())) {
+                for (SampleProductDto b : a.getChildSampleList()) {
+                    for (int i = 0; i < b.getNum(); i++) {
+                        b.setId(null);
+                        b.setInsOrderId(insOrder.getId());
+                        b.setParentId(a.getId());
+                        insSampleMapper.insert(b);
+                        if (ObjectUtil.isNotEmpty(b.getInsProduct())) {
+                            addInsProductMethod(b.getId(), b.getInsProduct());
+                        }
+                    }
+                }
+            }
+        });
+        //鏄惁涓哄師鏉愭枡涓嬪崟
+        if (insOrder.getTypeSource() != null && insOrder.getTypeSource().equals(1)) {
+            // 鍘熸潗鏂欎笅鍗�: 濮旀墭浜哄氨鏄姤妫�浜�, 鐢熶骇鍗曚綅灏辨槸渚涘簲鍟嗗崟浣�
+            IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(insOrder.getIfsInventoryId());
+            Integer declareUserId = ifsInventoryQuantity.getDeclareUserId();
+            User user = userMapper.selectById(declareUserId);
+            if (user == null) {
+               throw new ErrorException("缂哄皯鎶ユ浜轰俊鎭�");
+            }
+            // 渚涘簲鍟嗗悕绉�
+            insOrder.setProduction(ifsInventoryQuantity.getSupplierName());
+            insOrder.setProductionEn("");
+            // 濮旀墭浜哄悕绉�
+            insOrder.setPrepareUserId(user.getId());
+            insOrder.setPrepareUser(user.getName());
+            insOrder.setPrepareUserEn(user.getNameEn());
+            insOrder.setPhone(user.getPhone());
+            insOrder.setState(1);
+            Long count1 = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery()
+                    .eq(InsOrder::getIfsInventoryId, insOrder.getIfsInventoryId())
+                    .ne(InsOrder::getState, -1)
+                    .eq(InsOrder::getOrderType, InsOrderTypeConstants.ENTER_THE_FACTORY)
+                    .ne(InsOrder::getId, insOrder.getId()));
+            // 鍒ゆ柇涔嬪墠鏄惁鏈夎繘鍘傛楠�
+            if (count1 == 0) {
+                ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>().set(IfsInventoryQuantity::getState, 1)
+                        .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId()));
+            }
+
+            // 鍒ゆ柇缁撴潫鐘舵�佷慨鏀瑰悎鏍肩姸鎬�
+            if (ifsInventoryQuantity.getIsFinish().equals(0)) {
+                ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
+                        .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId())
+                        .set(IfsInventoryQuantity::getInspectStatus, 0));
+            }
+
+            upInsOrderOfState(insOrder);
+            upInsOrder(insOrder.getId(), null, appointed != null ? appointed.toString() : null, SecurityUtils.getUserId().intValue(), "鍘熸潗鏂�");
+
+
+            // 鏍规嵁闆朵欢鍙峰垽鏂槸鍚︽槸杈呮潗
+            boolean isRaw = false;
+            StructureTestObject productObject = insOrderMapper.selectProductByPartNo(ifsInventoryQuantity.getPartNo());
+            // 鏌ヨ浜у搧
+            if (productObject != null && StrUtil.isNotBlank(productObject.getObjectType()) && productObject.getObjectType().equals("1")) {
+                isRaw = true;
+            } else {
+            // 鏌ヨ瀵硅薄
+                StructureTestObject testObject = insOrderMapper.selectByPartNo(ifsInventoryQuantity.getPartNo());
+                if (testObject != null && StrUtil.isNotBlank(testObject.getObjectType()) && testObject.getObjectType().equals("1")) {
+                    isRaw = true;
+                }
+            }
+
+            if (isRaw) {
+                // 鑾峰彇褰撳墠瀛e害鐨勫紑濮嬫椂闂村拰缁撴潫鏃堕棿
+                LocalDateTime now = LocalDateTime.now();
+                // 鑾峰彇褰撳墠鏈堜唤
+                int month = now.getMonthValue();
+                // 纭畾褰撳墠瀛e害鐨勫紑濮嬫湀浠�
+                int startMonth = (month - 1) / 3 * 3 + 1;
+                // 鏋勯�犲搴︾殑寮�濮嬫椂闂�
+                LocalDateTime startOfQuarter = LocalDateTime.of(now.getYear(), Month.of(startMonth), 1, 0, 0);
+                // 璁$畻涓嬩竴涓搴︾殑寮�濮嬫椂闂�
+                LocalDateTime startOfNextQuarter = startOfQuarter.plusMonths(3);
+                // 璁$畻褰撳墠瀛e害鐨勭粨鏉熸椂闂�
+                LocalDateTime endOfQuarter = startOfNextQuarter.minusSeconds(1);
+
+                // 鏍规嵁涓嬪崟鐨勮鏍煎瀷鍙峰垽鏂槸鍚︿负瀛e害棣栨鍑虹幇
+                Integer count = ifsInventoryQuantityMapper.selectIsFirst(insOrder.getPartDetail(),
+                        ifsInventoryQuantity.getSupplierName(),
+                        startOfNextQuarter,
+                        endOfQuarter);
+
+                if(count == 0) {
+                    ifsInventoryQuantity.setIsFirst(1);
+                    ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
+                            .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId())
+                            .set(IfsInventoryQuantity::getIsFirst, 1));
+                }
+            }
+        }
+        return insOrder.getId();
+    }
+
+    /**
+     * 娣诲姞妫�楠岄」
+     * @param sampleId
+     * @param productList
+     */
+    private void addInsProductMethod(Integer sampleId, List<InsProduct> productList) {
+        for (InsProduct product : productList) {
+            if (product.getState() == 1) {
+                product.setId(null);
+                product.setCreateTime(null);
+                product.setCreateUser(null);
+                product.setUpdateTime(null);
+                product.setUpdateUser(null);
+                product.setInsSampleId(sampleId);
+                if (product.getInspectionItemSubclass() == null) {
+                    product.setInspectionItemSubclass("");
+                }
+                if (StringUtils.isBlank(product.getAsk()) || StringUtils.isBlank(product.getTell())) {
+                    throw new ErrorException("鏈夋楠岄」鐨勮姹傚�兼垨瑕佹眰鎻忚堪涓虹┖, 璇峰厛鍘绘爣鍑嗗簱閰嶇疆瑕佹眰鍊兼垨瑕佹眰鎻忚堪");
+                }
+                insProductMapper.insert(product);
+            }
+        }
+    }
+
+
+    @Override
+    public Map<String, Object> getInsOrder(Integer id) {
+        Map<String, Object> map = new HashMap<>();
+        InsOrder insOrder = insOrderMapper.selectById(id);
+        List<SampleProductDto> list;
+        // 鍒ゆ柇鏄惁鏄繘鍘傛姤鍛婂厤妫�
+        if (insOrder.getIsExemption().equals(1)) {
+            list = insSampleMapper.selectExemptionByOrderId(id);
+        } else {
+            list = insSampleMapper.selectSampleProductListByOrderId2(id);
+        }
+        Map<String, Object> map1 = insSampleMapper.selectInsOrder(id);
+        map.put("insOrder", insOrder);
+        map.put("sampleProduct", list);
+        map.put("insOrderTemplate", map1);
+        return map;
+    }
+
+    @Override
+    public int upInsOrderOfState(InsOrder insOrder) {
+        insOrder.setExamineTime(LocalDateTime.now());
+        if (insOrder.getState() == 1) {
+            //瀹℃牳閫氳繃鎵嶄細鐢熸垚濮旀墭缂栧彿
+            // todo: 妫�楠岀被鍨嬬紪鍙�
+            InsOrder order = this.getById(insOrder.getId());
+            String code = "";
+            switch (order.getOrderType()) {
+                case InsOrderTypeConstants.SPOT_CHECK:
+                    code = "C";
+                    break;
+                case InsOrderTypeConstants.CUSTOMER_ORDERED:
+                    code = "W";
+                    break;
+                case InsOrderTypeConstants.ENTER_THE_FACTORY:
+                case InsOrderTypeConstants.QUARTERLY_TEST:
+                    code = "Y";
+                    break;
+            }
+            // 鐢熸垚缂栧彿
+            String no = numberGenerator.generateNumberWithPrefix(3,
+                    "JCZX/ZB-" + code + LimsDateUtil.resetDate(LocalDateTime.now()),
+                    InsOrder::getEntrustCode);
+            // 鍒ゆ柇鏄惁鏄搴︽楠�, 鏄搴︽楠屽彇娑堝師鏉愭枡瀛e害妫�楠屼笅鍗�
+            if (InsOrderTypeConstants.QUARTERLY_TEST.equals(order.getOrderType())) {
+                ifsInventoryQuantityMapper.update(null,  Wrappers.<IfsInventoryQuantity>lambdaUpdate()
+                        .eq(IfsInventoryQuantity::getId, order.getIfsInventoryId())
+                        .set(IfsInventoryQuantity::getIsQuarter, 0));
+
+                // 鏌ヨ鏄惁鏈夎繃杩涘巶妫�楠�, 鏈夎幏鍙栭噷闈㈢殑缂栧彿
+                InsOrder order1 = insOrderMapper.selectOne(Wrappers.<InsOrder>lambdaQuery()
+                        .eq(InsOrder::getIfsInventoryId, order.getIfsInventoryId())
+                        .ne(InsOrder::getState, -1)
+                        .eq(InsOrder::getOrderType, InsOrderTypeConstants.ENTER_THE_FACTORY));
+                if (order1 != null) {
+                  no = order1.getEntrustCode();
+                }
+            }
+
+            int count = 1;
+            // 鏌ヨ鏍峰搧琛�
+            List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
+                    .eq(InsSample::getInsOrderId, insOrder.getId()));
+            for (InsSample insSample : insSamples) {
+                if (StringUtils.isBlank(insSample.getSampleCode())) {
+                    // 濡傛灉鍙湁涓�涓牱鍝佸氨涓嶉渶瑕佹嫾鎺ユ暟瀛�
+                    if (insSamples.size() != 1) {
+                        insSample.setSampleCode(no + "-" + count);
+                        count++;
+                    } else {
+                        insSample.setSampleCode(no);
+                    }
+                }
+            }
+            insSampleService.updateBatchById(insSamples);
+
+            insOrder.setEntrustCode(no);
+        }
+        return insOrderMapper.updateById(insOrder);
+    }
+
+    @Override
+    public Map<String, Object> getInsOrderAndSample(Integer id, String laboratory) {
+        Map<String, Object> map = new HashMap<>();
+        InsOrder insOrder = insOrderMapper.selectById(id);
+        List<SampleProductDto> list = insSampleMapper.getInsOrderAndSample(id, laboratory);
+        for (SampleProductDto sampleProductDto : list) {
+            List<Integer> ids = sampleProductDto.getInsProduct().stream().map(InsProduct::getId).collect(Collectors.toList());
+            List<InsProductUser> insProductUsers = insProductUserMapper.selectList(Wrappers.<InsProductUser>lambdaQuery()
+                    .in(InsProductUser::getInsProductId, ids));
+            if (CollectionUtils.isNotEmpty(insProductUsers)) {
+                List<Integer> userIds = insProductUsers.stream().map(InsProductUser::getCreateUser).distinct().collect(Collectors.toList());
+                String collect = userMapper.selectBatchIds(userIds).stream().map(User::getName).collect(Collectors.joining(","));
+                sampleProductDto.setCheckName(collect);
+            }
+        }
+        map.put("insOrder", insOrder);
+        map.put("sampleProduct", list);
+        //鏌ヨ鎵�鏈夎褰曟ā鐗堝幓閲�
+        List<Map<Integer, Object>> list2 = insOrderMapper.selectReportModelByOrderId(id, laboratory);
+        map.put("reportModel", list2);
+        return map;
+    }
+
+    @Override
+    public IPage<SampleProductDto2> selectSampleAndProductByOrderId(IPage<SampleProductDto2> page, SampleProductDto2 sampleProductDto) {
+        IPage<SampleProductDto2> productDto2IPage = insOrderMapper.selectSampleAndProductByOrderId(page,
+                QueryWrappers.queryWrappers(sampleProductDto)
+                        .orderByAsc("sample_code")
+                        .orderByAsc("cable_tag")
+                        .orderByAsc("sort"),
+                sampleProductDto.getId());
+        return productDto2IPage;
+    }
+
+    @Override
+    public IPage<CostStatisticsDto> costStatistics(IPage<CostStatisticsDto> page, CostStatisticsDto costStatisticsDto) {
+        String dates = costStatisticsDto.getDates();
+        String[] split = dates.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(",");
+        costStatisticsDto.setDates(null);
+
+        //todo:浠呯湅鑷繁
+
+        IPage<CostStatisticsDto> dtoIPage = insOrderMapper.selectCostStatistics(page, QueryWrappers.queryWrappers(costStatisticsDto).ge("create_time", split[0]).le("create_time", split[1] + " 23:59:59"));
+        List<CostStatisticsDto> collect = dtoIPage.getRecords().stream().map(dto -> {
+            Set<String> uniqueTags = new HashSet<>();
+            if (dto.getInspectionItem().contains(",")) {
+                for (String s : dto.getInspectionItem().split(",")) {
+                    uniqueTags.add(s.split("@")[0]);
+                }
+            } else {
+                uniqueTags.add(dto.getInspectionItem().split("@")[0]);
+            }
+            dto.setInspectionItem(uniqueTags.toString());
+            return dto;
+        }).collect(Collectors.toList());
+        dtoIPage.setRecords(collect);
+        return dtoIPage;
+    }
+
+    @Override
+    public Map<String, Object> costStatistics2(CostStatisticsDto costStatisticsDto) {
+        Map<String, Object> map = new HashMap<>();
+        String dates = costStatisticsDto.getDates();
+        String[] split = dates.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(",");
+        costStatisticsDto.setDates(null);
+        List<CostStatisticsDto> costStatisticsDtos = insOrderMapper.selectCostStatistics2(QueryWrappers.queryWrappers(costStatisticsDto).ge("create_time", split[0]).le("create_time", split[1] + " 23:59:59"));
+        double totalPrice = costStatisticsDtos.stream()
+                .filter(dto -> dto.getPrice() != null) // 杩囨护鎺変环鏍间负 null 鐨勫璞�
+                .mapToDouble(value -> value.getPrice().doubleValue() * value.getNum())
+                .sum();
+        map.put("total", totalPrice);
+        return map;
+    }
+
+    @Override
+    public Map<String, Object> selectSampleDefects(Page page, String inspectionItems, String orderNumber) {
+        List<SampleDefectsFatherVo> sampleDefectsFatherVos = insOrderMapper.selectSampleDefects(page, inspectionItems, orderNumber);
+        Map<String, Object> map = new HashMap<>();
+        map.put("records", sampleDefectsFatherVos);
+        Long aLong = insOrderMapper.getCount(inspectionItems, orderNumber);
+        map.put("total", aLong);
+        return map;
+    }
+
+    @Override
+    public int updateStatus(Integer id) {
+        return insOrderMapper.updateStatus(id);
+    }
+
+
+    @Override
+    public void export(CostStatisticsDto costStatisticsDto, HttpServletResponse response) throws IOException {
+        //鏌ヨ瀵煎嚭鐨勮垂鐢ㄧ粺璁℃暟鎹�
+        String dates = costStatisticsDto.getDates();
+        String[] split = dates.replaceAll("\\[", "").replaceAll("]", "").replaceAll("\"", "").split(",");
+        costStatisticsDto.setDates(null);
+        List<CostStatisticsDto> costStatisticsDtos = insOrderMapper.selectCostStatistics2(QueryWrappers.queryWrappers(costStatisticsDto).ge("create_time", split[0]).le("create_time", split[1] + " 23:59:59"));
+        costStatisticsDtos = costStatisticsDtos.stream().map(dto -> {
+            Set<String> uniqueTags = new HashSet<>();
+            if (dto.getInspectionItem().contains(",")) {
+                for (String s : dto.getInspectionItem().split(",")) {
+                    uniqueTags.add(s.split("@")[0]);
+                }
+            } else {
+                uniqueTags.add(dto.getInspectionItem().split("@")[0]);
+            }
+            dto.setInspectionItem(uniqueTags.toString());
+            return dto;
+        }).collect(Collectors.toList());
+
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("UTF-8");
+        // 杩欓噷URLEncoder.encode鍙互闃叉涓枃涔辩爜 褰撶劧鍜宔asyexcel娌℃湁鍏崇郴
+        String fileName = URLEncoder.encode("鏍峰搧璐圭敤缁熻瀵煎嚭", "UTF-8");
+        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+        Map<String, List<CostStatisticsDto>> groupByCompany =
+                costStatisticsDtos.stream().filter(e -> StrUtil.isNotEmpty(e.getCompany()))
+                        .collect(Collectors.groupingBy(CostStatisticsDto::getCompany));
+        try {
+            // 鏂板缓ExcelWriter
+            // 鏂板缓ExcelWriter
+            ExcelWriter excelWriter =
+                    EasyExcel.write(response.getOutputStream())
+                            .registerWriteHandler(new SimpleColumnWidthStyleStrategy(25))
+                            .build();
+            for (Map.Entry<String, List<CostStatisticsDto>> companyDataEntry : groupByCompany.entrySet()) {
+                String sheetName = companyDataEntry.getKey();
+                List<CostStatisticsDto> dataList = companyDataEntry.getValue();
+                WriteSheet mainSheet = EasyExcel.writerSheet(sheetName)
+                        .head(CostStatisticsDto.class)
+                        .registerWriteHandler(new SimpleColumnWidthStyleStrategy(25))
+                        .build();
+                excelWriter.write(dataList, mainSheet);
+            }
+            // 鍏抽棴娴�
+            excelWriter.finish();
+        } catch (IOException e) {
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    /**
+     * 鑾峰彇ifs搴撳瓨淇℃伅
+     * @param
+     * @return
+     */
+    @Override
+    public void getIfsOrder() {
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("LOCATION_NO","1302");
+        map.put("STATE_DB","To be Inspected");
+        List<Map<String, Object>> inventory = ifsApiUtils.getInventory(JSONUtil.toJsonStr(map));
+        if(inventory.size() == 0) {
+            return;
+        }
+        // 杩涜淇濆瓨
+        for (Map<String, Object> map1 : inventory) {
+            DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); // 鏃堕棿鏍煎紡鍖�
+            IfsInventoryQuantity ifsInventoryQuantity = new IfsInventoryQuantity();
+            ifsInventoryQuantity.setContract(map1.get("CONTRACT") == null ? "" : map1.get("CONTRACT").toString()); // 鍩�
+            ifsInventoryQuantity.setPartNo(map1.get("PART_NO") == null ? "" : map1.get("PART_NO").toString() ); // 闆朵欢鍙�
+            ifsInventoryQuantity.setPartDesc(map1.get("PART_DESC") == null ? "" : map1.get("PART_DESC").toString()); // 闆朵欢鎻忚堪
+            ifsInventoryQuantity.setOrderNo(map1.get("ORDER_NO") == null ? "" : map1.get("ORDER_NO").toString()); // 璁㈠崟鍙�
+            ifsInventoryQuantity.setLineNo(map1.get("LINE_NO") == null ? "" : map1.get("LINE_NO").toString()); // 琛屽彿
+            ifsInventoryQuantity.setReleaseNo(map1.get("RELEASE_NO") == null ? "" : map1.get("RELEASE_NO").toString()); // 涓嬭揪鍙�
+            ifsInventoryQuantity.setReceiptNo(Integer.parseInt(map1.get("RECEIPT_NO") == null ? "" : map1.get("RECEIPT_NO").toString())); // 鎺ユ敹鍙�
+            ifsInventoryQuantity.setStatus(map1.get("STATE") == null ? "" : map1.get("STATE").toString()); // 鐘舵�佹弿杩�
+            ifsInventoryQuantity.setStatusDb(map1.get("STATE_DB") == null ? "" : map1.get("STATE_DB").toString()); // 鐘舵��
+            if(map1.get("QTY_ARRIVED") != null) {
+                ifsInventoryQuantity.setQtyArrived(new BigDecimal(map1.get("QTY_ARRIVED").toString())); // 鎶佃揪鐨勯噰璐暟閲�
+            }
+            if(map1.get("QTY_INSPECTED") != null) {
+                ifsInventoryQuantity.setQtyInspected(new BigDecimal(map1.get("QTY_INSPECTED").toString())); // 宸叉楠岀殑璐拱鏁伴噺
+            }
+            if(map1.get("QTY_TO_INSPECT") != null) {
+                ifsInventoryQuantity.setQtyToInspect(new BigDecimal(map1.get("QTY_TO_INSPECT").toString())); // 瑕佹楠岀殑閲囪喘鏁伴噺
+            }
+            if(map1.get("INV_QTY_IN_STORE") != null) {
+                ifsInventoryQuantity.setInvQtyInStore(new BigDecimal(map1.get("INV_QTY_IN_STORE").toString())); // 鎶佃揪鐨勫簱瀛樻暟閲�
+            }
+            if(map1.get("PUR_QTY_IN_STORE") != null) {
+                ifsInventoryQuantity.setPurQtyInStore(new BigDecimal( map1.get("PUR_QTY_IN_STORE").toString())); // 鎶佃揪鐨勯噰璐暟閲�
+
+            }
+            ifsInventoryQuantity.setSupplierId(map1.get("SUPPLIER_ID") == null ? "" : map1.get("SUPPLIER_ID").toString()); // 渚涘簲鍟咺D
+            ifsInventoryQuantity.setSupplierName(map1.get("SUPPLIER_NAME") == null ? "" : map1.get("SUPPLIER_NAME").toString()); // 渚涘簲鍟嗗悕绉�
+            ifsInventoryQuantity.setConfigurationId(map1.get("CONFIGURATION_ID") == null ? "" : map1.get("CONFIGURATION_ID").toString()); // 閰嶇疆鏍囪瘑
+            ifsInventoryQuantity.setLotBatchNo(map1.get("LOT_BATCH_NO") == null ? "" : map1.get("LOT_BATCH_NO").toString()); // 鎵规鍙�
+            ifsInventoryQuantity.setUpdateBatchNo(map1.get("LOT_BATCH_NO") == null ? "" : map1.get("LOT_BATCH_NO").toString()); // 鎵规鍙�
+            ifsInventoryQuantity.setWaivDevRejNo(map1.get("WAIV_DEV_REJ_NO") == null ? "" : map1.get("WAIV_DEV_REJ_NO").toString()); // WDR鍙�
+            ifsInventoryQuantity.setActivitySeq(map1.get("ACTIVITY_SEQ") == null ? null : Integer.parseInt(map1.get("ACTIVITY_SEQ").toString())); // 娲诲姩搴忓垪
+            ifsInventoryQuantity.setSerialNo(map1.get("SERIAL_NO") == null ? "" : map1.get("SERIAL_NO").toString()); // 搴忓垪鍙�
+            ifsInventoryQuantity.setLocationNo(map1.get("LOCATION_NO") == null ? "" : map1.get("LOCATION_NO").toString()); // 搴撲綅鍙�
+            ifsInventoryQuantity.setEngChgLevel(map1.get("ENG_CHG_LEVEL") == null ? "" : map1.get("ENG_CHG_LEVEL").toString()); // 鐗堟湰鍙�
+            ifsInventoryQuantity.setReceiver(map1.get("RECEIVER") == null ? "" : map1.get("RECEIVER").toString()); // 鎺ユ敹浜�
+            ifsInventoryQuantity.setReceiverName(map1.get("RECEIVER_NAME") == null ? "" : map1.get("RECEIVER_NAME").toString()); // 鎺ユ敹浜哄悕绉�
+            ifsInventoryQuantity.setBuyerCode(map1.get("BUYER_CODE") == null ? "" : map1.get("BUYER_CODE").toString()); // 閲囪喘鍛�
+            ifsInventoryQuantity.setBuyerName(map1.get("BUYER_NAME") == null ? "" : map1.get("BUYER_NAME").toString()); // 閲囪喘鍛樺悕绉�
+
+            if(map1.get("ARRIVE_DATE") != null) {
+                ifsInventoryQuantity.setArriveDate(LocalDateTime.parse(map1.get("ARRIVE_DATE").toString(),dateTimeFormatter)); // 瀹為檯鍒拌揣鏃ユ湡
+            }
+            if(map1.get("DELIVERY_DATE") != null) {
+                ifsInventoryQuantity.setDeliveryDate(LocalDateTime.parse(map1.get("DELIVERY_DATE").toString(),dateTimeFormatter)); // 瀹為檯浜よ揣鏃ユ湡
+            }
+            if(map1.get("PRODUCT_DATE") != null) {
+                ifsInventoryQuantity.setProductDate(LocalDateTime.parse(map1.get("PRODUCT_DATE").toString(),dateTimeFormatter)); // 鐢熶骇鏃ユ湡
+
+            }
+            if(map1.get("INVALID_DATE") != null) {
+                ifsInventoryQuantity.setInvalidDate(LocalDateTime.parse(map1.get("INVALID_DATE").toString(),dateTimeFormatter)); // 澶辨晥鏃ユ湡
+            }
+            if(map1.get("APPROVED_DATE") != null) {
+                ifsInventoryQuantity.setApprovedDate(LocalDateTime.parse(map1.get("APPROVED_DATE").toString(),dateTimeFormatter)); // 瀹℃壒鏃ユ湡
+            }
+            ifsInventoryQuantity.setReqCeater(map1.get("REQ_CEATER") == null ? "" : map1.get("REQ_CEATER").toString()); // 閲囪喘鐢宠鍒涘缓浜�
+            ifsInventoryQuantity.setReqCeaterName(map1.get("REQ_CEATER_NAME") == null ? "" : map1.get("REQ_CEATER_NAME").toString()); // 閲囪喘鐢宠鍒涘缓浜哄悕绉�
+            ifsInventoryQuantity.setLineRemarks(map1.get("LINE_REMARKS") == null ? "" : map1.get("LINE_REMARKS").toString()); // 閲囪喘璁㈠崟琛屽娉�
+            ifsInventoryQuantity.setBuyUnitMeas(map1.get("BUY_UNIT_MEAS") == null ? "" : map1.get("BUY_UNIT_MEAS").toString()); // 閲囪喘鍗曚綅
+            ifsInventoryQuantity.setReceiverDate(LocalDateTime.now()); // 鎺ユ敹鏃ユ湡
+            ifsInventoryQuantity.setIsSource(1);
+            ifsInventoryQuantity.setState(0);
+
+            IfsInventoryQuantity one = ifsInventoryQuantityMapper.selectOne(new LambdaQueryWrapper<IfsInventoryQuantity>()
+                    .eq(IfsInventoryQuantity::getOrderNo, ifsInventoryQuantity.getOrderNo())
+                    .eq(IfsInventoryQuantity::getLineNo, ifsInventoryQuantity.getLineNo())
+                    .eq(IfsInventoryQuantity::getReleaseNo, ifsInventoryQuantity.getReleaseNo())
+                    .eq(IfsInventoryQuantity::getReceiptNo, ifsInventoryQuantity.getReceiptNo())
+                    .eq(IfsInventoryQuantity::getLocationNo, ifsInventoryQuantity.getLocationNo())
+                    .eq(IfsInventoryQuantity::getLotBatchNo, ifsInventoryQuantity.getLotBatchNo())
+                    .eq(IfsInventoryQuantity::getSerialNo, ifsInventoryQuantity.getSerialNo())
+                    .eq(IfsInventoryQuantity::getEngChgLevel, ifsInventoryQuantity.getEngChgLevel())
+                    .eq(IfsInventoryQuantity::getWaivDevRejNo, ifsInventoryQuantity.getWaivDevRejNo())
+                    .eq(IfsInventoryQuantity::getActivitySeq, ifsInventoryQuantity.getActivitySeq())
+            );
+            if(Objects.isNull(one)) {
+
+                ifsInventoryQuantity.setIsFirst(0);
+                // 鏌ヨ浜т笟閾炬娴嬫暟鎹�
+                String industryChainAttrFields = IndustryChainUtils.getIndustryChainAttrFields(ifsInventoryQuantity.getOrderNo(),
+                        ifsInventoryQuantity.getLineNo(),
+                        ifsInventoryQuantity.getReleaseNo());
+                ifsInventoryQuantity.setIndustryChain(industryChainAttrFields);
+
+                ifsInventoryQuantityMapper.insert(ifsInventoryQuantity);
+            }
+        }
+    }
+
+    /**
+     * id鏄師鏉愭枡鐨刬d
+     *
+     * 淇敼璁㈠崟鍗曞彿
+     * @param insOrder
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateEntrustCode(InsOrder insOrder) {
+        // 鍒ゆ柇褰撳墠璁㈠崟鏄惁鐢熸垚浜嗘姤鍛�, 鐢熸垚浜嗘姤鍛婁笉鑳戒慨鏀瑰崟鍙�
+        List<InsOrder> insOrders = insOrderMapper.selectList(Wrappers.<InsOrder>lambdaQuery()
+                .eq(InsOrder::getIfsInventoryId, insOrder.getId())
+                .ne(InsOrder::getState, -1));
+        List<Integer> insOrderIds = insOrders.stream().map(InsOrder::getId).collect(Collectors.toList());
+        Long count = insReportMapper.selectCount(Wrappers.<InsReport>lambdaQuery()
+                .in(InsReport::getInsOrderId, insOrderIds));
+        if (count > 0 ) {
+            throw new ErrorException("褰撳墠璁㈠崟宸茬粡鐢熸垚浜嗘姤鍛婁笉鑳戒慨鏀圭紪鍙�");
+        }
+
+
+        Long count1 = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery()
+                .eq(InsOrder::getEntrustCode, insOrder.getEntrustCode())
+                .ne(InsOrder::getIfsInventoryId, insOrder.getId())
+                .ne(InsOrder::getInsState, -1));
+        if (count1 > 0) {
+            throw new ErrorException("璇ョ紪鍙烽噸澶�");
+        }
+
+        //淇敼鎶ュ憡鐨勭紪鍙�
+        insOrderMapper.update(null, Wrappers.<InsOrder>lambdaUpdate()
+                .eq(InsOrder::getIfsInventoryId, insOrder.getId())
+                .set(InsOrder::getEntrustCode, insOrder.getEntrustCode()));
+
+        // 淇敼鏍峰搧鐨勭紪鍙�
+        // 鏌ヨ鎵�鏈夌殑鏍峰搧
+        List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
+                .in(InsSample::getInsOrderId, insOrderIds));
+        for (InsSample insSample : insSamples) {
+            String sampleCode = insSample.getSampleCode();
+            String updateCode = insOrder.getEntrustCode();
+            // 鏌ユ壘鏈�鍚庝竴涓�'-'鐨勪綅缃�
+            int lastDashIndex = sampleCode.lastIndexOf('-');
+            if (lastDashIndex != -1) {
+                int secondLastDashIndex = sampleCode.lastIndexOf('-', lastDashIndex - 1);
+                // 澶勭悊鏈�鍚庝竴涓�'-'鍓嶇殑閮ㄥ垎
+                if (secondLastDashIndex != -1) {
+                    // 澶勭悊鏈�鍚庝竴涓�'-'鍙婁箣鍚庣殑閮ㄥ垎
+                    String afterLastDash = sampleCode.substring(lastDashIndex);
+
+                    updateCode = updateCode + afterLastDash;
+                }
+            }
+            insSampleMapper.update(null, Wrappers.<InsSample>lambdaUpdate()
+                    .eq(InsSample::getId, insSample.getId())
+                    .set(InsSample::getSampleCode, updateCode));
+
+        }
+    }
+
+    @Override
+    public List<InsUnqualifiedRetestProduct> getRetestResult(Integer insProductId) {
+        return insUnqualifiedRetestProductMapper.selectList(Wrappers.<InsUnqualifiedRetestProduct>lambdaQuery()
+                .eq(InsUnqualifiedRetestProduct::getInsProductId, insProductId));
+    }
+
+    /**
+     * 淇敼閲囪喘璁㈠崟鎺ユ敹鐘舵��, 閬垮厤鍥炴粴
+     * @param id
+     */
+    @Transactional
+    public void updateIfsInventoryQuantity(Integer id) {
+        ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
+                .set(IfsInventoryQuantity::getIsRegister, 1)
+                .eq(IfsInventoryQuantity::getId, id));
+    }
+
+    /**
+     * 鏂板閾滃崟涓濅笅鍗�
+     * @param list
+     * @param insOrder
+     * @return
+     */
+    @Override
+    public int addRawCopperOrder(List<SampleProductDto> list, CopperInsOrderDto insOrder) {
+        insOrder.setState(1);
+        insOrder.setTypeSource(1);
+
+        LocalDate appointed = insOrder.getAppointed();
+
+        insOrderMapper.insert(insOrder); // 涓昏〃
+
+        list.forEach(a -> {
+            a.setId(null);
+            a.setInsOrderId(insOrder.getId());
+            insSampleMapper.insert(a);
+            if (ObjectUtil.isNotEmpty(a.getInsProduct())) {
+                // 鍒ゆ柇鏄惁濉啓寰呮椤规暟閲�
+                if (a.getQuantity() != null) {
+                    List<InsProduct> ip2 = new ArrayList<>();
+                    for (Integer i = 1; i <= a.getQuantity(); i++) {
+                        // 閲嶆柊鎷疯礉 鍒涘缓鏂板璞�
+                        AtomicInteger atomicInteger = new AtomicInteger(i);
+                        List<InsProduct> insProducts = a.getInsProduct().stream().map(insProduct -> {
+                            insProduct.setRawMaterialTag(String.valueOf(atomicInteger.get()));
+                            InsProduct product = new InsProduct();
+                            BeanUtils.copyProperties(insProduct, product);
+                            return product;
+                        }).collect(Collectors.toList());
+
+                        ip2.addAll(insProducts);
+                    }
+                    addInsProductMethod(a.getId(), ip2);
+                } else {
+                    addInsProductMethod(a.getId(), a.getInsProduct());
+                }
+            }
+            if (ObjectUtil.isNotEmpty(a.getChildSampleList())) {
+                for (SampleProductDto b : a.getChildSampleList()) {
+                    for (int i = 0; i < b.getNum(); i++) {
+                        b.setId(null);
+                        b.setInsOrderId(insOrder.getId());
+                        b.setParentId(a.getId());
+                        insSampleMapper.insert(b);
+                        if (ObjectUtil.isNotEmpty(b.getInsProduct())) {
+                            addInsProductMethod(b.getId(), b.getInsProduct());
+                        }
+                    }
+                }
+            }
+        });
+
+        // 娣诲姞鍘熸潗鏂欎俊鎭�
+        IfsInventoryQuantity ifsInventoryQuantity = new IfsInventoryQuantity();
+        // 鍩烘湰淇℃伅
+        ifsInventoryQuantity.setIsSource(0);
+        ifsInventoryQuantity.setIsInspect(1);
+        ifsInventoryQuantity.setState(1);
+        ifsInventoryQuantity.setIsFinish(0);
+        ifsInventoryQuantity.setIsCopper(1);
+        ifsInventoryQuantity.setIsQuarter(0);
+        ifsInventoryQuantity.setInspectStatus(0);
+
+        ifsInventoryQuantity.setQtyArrived(insOrder.getQtyArrived());
+        ifsInventoryQuantity.setBuyUnitMeas(insOrder.getBuyUnitMeas());
+        ifsInventoryQuantity.setSupplierName(insOrder.getSupplierName());
+        ifsInventoryQuantity.setUpdateBatchNo(insOrder.getUpdateBatchNo());
+        ifsInventoryQuantity.setDeclareDate(insOrder.getDeclareDate());
+
+        ifsInventoryQuantityMapper.insert(ifsInventoryQuantity);
+
+
+        insOrder.setIfsInventoryId(ifsInventoryQuantity.getId());
+        insOrder.setState(1);
+
+
+        upInsOrderOfState(insOrder);
+        upInsOrder(insOrder.getId(), null, appointed != null ? appointed.toString() : null, SecurityUtils.getUserId().intValue(), "鍘熸潗鏂�");
+
+        return insOrder.getId();
+    }
+
+    /**
+     * 淇敼濮旀墭涓嬪崟缂栧彿
+     * @param insOrder
+     */
+    @Override
+    public void updateOrderEntrustCode(InsOrder insOrder) {
+        // 鍒ゆ柇褰撳墠璁㈠崟鏄惁鐢熸垚浜嗘姤鍛�, 鐢熸垚浜嗘姤鍛婁笉鑳戒慨鏀瑰崟鍙�
+        Long count = insReportMapper.selectCount(Wrappers.<InsReport>lambdaQuery()
+                .eq(InsReport::getInsOrderId, insOrder.getId()));
+        if (count > 0 ) {
+            throw new ErrorException("褰撳墠璁㈠崟宸茬粡鐢熸垚浜嗘姤鍛婁笉鑳戒慨鏀圭紪鍙�");
+        }
+
+        Long count1 = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery()
+                .eq(InsOrder::getEntrustCode, insOrder.getEntrustCode()));
+        if (count1 > 0) {
+            throw new ErrorException("璇ョ紪鍙烽噸澶�");
+        }
+
+        //淇敼鎶ュ憡鐨勭紪鍙�
+        insOrderMapper.update(null, Wrappers.<InsOrder>lambdaUpdate()
+                .eq(InsOrder::getId, insOrder.getId())
+                .set(InsOrder::getEntrustCode, insOrder.getEntrustCode()));
+
+        // 淇敼鏍峰搧鐨勭紪鍙�
+        // 鏌ヨ鎵�鏈夌殑鏍峰搧
+        List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
+                .eq(InsSample::getInsOrderId, insOrder.getId()));
+        for (InsSample insSample : insSamples) {
+            String sampleCode = insSample.getSampleCode();
+            String updateCode = insOrder.getEntrustCode();
+            // 鏌ユ壘鏈�鍚庝竴涓�'-'鐨勪綅缃�
+            int lastDashIndex = sampleCode.lastIndexOf('-');
+            if (lastDashIndex != -1) {
+                int secondLastDashIndex = sampleCode.lastIndexOf('-', lastDashIndex - 1);
+                // 澶勭悊鏈�鍚庝竴涓�'-'鍓嶇殑閮ㄥ垎
+                if (secondLastDashIndex != -1) {
+                    // 澶勭悊鏈�鍚庝竴涓�'-'鍙婁箣鍚庣殑閮ㄥ垎
+                    String afterLastDash = sampleCode.substring(lastDashIndex);
+
+                    updateCode = updateCode + afterLastDash;
+                }
+            }
+            insSampleMapper.update(null, Wrappers.<InsSample>lambdaUpdate()
+                    .eq(InsSample::getId, insSample.getId())
+                    .set(InsSample::getSampleCode, updateCode));
+
+        }
+    }
+
+    /**
+     * 淇敼妫�楠屼笅鍗曞唴瀹�
+     * @param insOrderUpdateDto
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean updateInsOrder(InsOrderUpdateDto insOrderUpdateDto) {
+        // 淇敼璁㈠崟
+        insOrderUpdateDto.getInsOrder().setState(0);
+        insOrderUpdateDto.getInsOrder().setTell("");
+        insOrderMapper.updateById(insOrderUpdateDto.getInsOrder());
+
+        // 淇敼妫�楠岄」
+        for (SampleProductDto sampleProductDto : insOrderUpdateDto.getSampleProduct()) {
+            insProductService.updateBatchById(sampleProductDto.getInsProduct());
+        }
+
+        return true;
+    }
+
+    /**
+     * 鎴愬搧鏍囩鎵撳嵃
+     * @param ids
+     * @return
+     */
+    @Override
+    public List<InsOrderPrintingVo> labelOrderPrinting(List<Integer> ids) {
+        return insOrderMapper.labelOrderPrinting(ids);
+    }
+
+    /**
+     * 鏍规嵁鏍峰搧id鏌ヨ妫�楠岄」鏍�
+     * @param insSampleId
+     * @return
+     */
+    @Override
+    public List<StandardProductList> getProductTreeBySampleId(Integer insSampleId) {
+        // 鏌ヨ绗竴涓楠岄」鑾峰彇妫�楠岄」鏍�
+        InsProduct insProduct = insProductMapper.selectOne(Wrappers.<InsProduct>lambdaQuery()
+                .eq(InsProduct::getInsSampleId, insSampleId)
+                .last("limit 1"));
+        String tree = insProduct.getFactory() + " - " +
+                insProduct.getLaboratory() + " - " +
+                insProduct.getSampleType() + " - " +
+                insProduct.getSample() + " - " +
+                insProduct.getModel();
+        // 鏌ヨ鏍囧噯鏍�
+        List<StandardProductList> standardProductLists = standardProductListMapper.selectList(Wrappers.<StandardProductList>lambdaQuery()
+                .eq(StandardProductList::getStandardMethodListId, insProduct.getStandardMethodListId())
+                .eq(StandardProductList::getTree, tree));
+        for (StandardProductList standardProductList : standardProductLists) {
+            standardProductList.setId(null);
+        }
+
+        return standardProductLists;
+    }
+
+    /**
+     * 娣诲姞閬楁紡鐨勬楠岄」
+     * @param omitOrderProductDto
+     * @return
+     */
+    @Override
+    public boolean addOmitOrderProduct(OmitOrderProductDto omitOrderProductDto) {
+        if (omitOrderProductDto.getInsSampleId() == null) {
+            throw new ErrorException("缂哄皯鏍峰搧Id");
+        }
+        for (InsProduct product : omitOrderProductDto.getInsProductBindingList()) {
+            if (product.getState() == 1) {
+                product.setId(null);
+                product.setCreateTime(null);
+                product.setCreateUser(null);
+                product.setUpdateTime(null);
+                product.setUpdateUser(null);
+                product.setInsSampleId(omitOrderProductDto.getInsSampleId());
+                if (StringUtils.isBlank(product.getCableTag())) {
+                    product.setCableTag(null);
+                }
+                if (product.getInspectionItemSubclass() == null) {
+                    product.setInspectionItemSubclass("");
+                }
+                if (StringUtils.isBlank(product.getAsk()) || StringUtils.isBlank(product.getTell())) {
+                    throw new ErrorException("鏈夋楠岄」鐨勮姹傚�兼垨瑕佹眰鎻忚堪涓虹┖, 璇峰~鍐欒姹傚�兼垨瑕佹眰鎻忚堪");
+                }
+                insProductMapper.insert(product);
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * 鎴愬搧妫�楠屽崟瀵煎嚭
+     * @param sampleOrderDto
+     * @param response
+     */
+    @Override
+    public void rawAllInsOrderExport(SampleOrderDto sampleOrderDto, HttpServletResponse response) {
+        //鍒ゆ柇鍏ㄩ儴,涓汉,缁勭粐鐨勬潈闄�
+        //todo:浠呯湅鎴戣幏鍙栧綋鍓嶄汉鎵�灞炲疄楠屽id
+        String laboratory = null;
+        // 鍒ゆ柇鏄惁鏄叏閮�
+        String isOrderAll = null;
+        if (sampleOrderDto.getState() != null && sampleOrderDto.getState() == -2) {
+            isOrderAll = "1";
+            sampleOrderDto.setState(null);
+        }
+        List<SampleOrderDto> sampleOrderDtoList = insOrderMapper.rawAllInsOrderExport(QueryWrappers.queryWrappers(sampleOrderDto), laboratory, isOrderAll);
+
+        // 鍒ゆ柇鏄惁鏄笉鍚堟牸, 涓嶅悎鏍兼煡璇笉鍚堟牸椤�
+        for (SampleOrderDto orderDto : sampleOrderDtoList) {
+            if (orderDto.getInsResult() != null && orderDto.getInsResult() == 0){
+                // 鏌ヨ涓嶅悎鏍奸」
+                List<String> unqualifiedList = insProductMapper.selectUnqualifiedList(orderDto.getId());
+                orderDto.setUnqualifiedItem(CollUtil.join(unqualifiedList, ","));
+            }
+            orderDto.setCreateTimeString(orderDto.getCreateTime() == null ? "" : orderDto.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+
+        }
+
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("UTF-8");
+        try {
+            // 杩欓噷URLEncoder.encode鍙互闃叉涓枃涔辩爜 褰撶劧鍜宔asyexcel娌℃湁鍏崇郴
+            String fileName = URLEncoder.encode("濮旀墭妫�娴嬩俊鎭鍑�", "UTF-8");
+            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+            //鏂板缓ExcelWriter
+            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
+            //鑾峰彇sheet0瀵硅薄
+            WriteSheet mainSheet = EasyExcel.writerSheet(0, "濮旀墭妫�娴嬩俊鎭鍑�").head(SampleOrderDto.class).build();
+
+            //鍚憇heet0鍐欏叆鏁版嵁 浼犲叆绌簂ist杩欐牱鍙鍑鸿〃澶�
+            excelWriter.write(sampleOrderDtoList, mainSheet);
+            //鍏抽棴娴�
+            excelWriter.finish();
+        } catch (IOException e) {
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+}
+
+
+
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderTemplateServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderTemplateServiceImpl.java
new file mode 100644
index 0000000..b56ffeb
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderTemplateServiceImpl.java
@@ -0,0 +1,57 @@
+package com.ruoyi.inspect.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.inspect.mapper.InsOrderTemplateMapper;
+import com.ruoyi.inspect.pojo.InsOrderTemplate;
+import com.ruoyi.inspect.service.InsOrderTemplateService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author Administrator
+ * @description 閽堝琛ㄣ�恑ns_order_template銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+ * @createDate 2024-03-18 14:14:54
+ */
+@Service
+@AllArgsConstructor
+public class InsOrderTemplateServiceImpl extends ServiceImpl<InsOrderTemplateMapper, InsOrderTemplate>
+        implements InsOrderTemplateService {
+
+    private InsOrderTemplateMapper insOrderTemplateMapper;
+
+    @Override
+    public int addInsOrderTemplate(InsOrderTemplate insOrderTemplate) {
+        return insOrderTemplateMapper.insert(insOrderTemplate);
+    }
+
+    @Override
+    public List<InsOrderTemplate> selectInsOrderTemplate(String company) {
+        if (ObjectUtils.isEmpty(company) || company.equals("")) {
+            return insOrderTemplateMapper.selectList(Wrappers.<InsOrderTemplate>lambdaQuery()
+                    .select(InsOrderTemplate.class, info -> !info.getColumn().equals("thing")));
+        } else {
+            //鏍规嵁濮旀墭鍗曚綅杩涜绛涢��
+            return insOrderTemplateMapper.selectList(Wrappers.<InsOrderTemplate>lambdaQuery()
+                    .like(InsOrderTemplate::getThing,"\"company\":\""+ company+"\"")
+                    .select(InsOrderTemplate.class, info -> !info.getColumn().equals("thing")));
+        }
+    }
+
+    @Override
+    public String selectInsOrderTemplateById(Integer id) {
+        return insOrderTemplateMapper.selectById(id).getThing();
+    }
+
+    @Override
+    public int delInsOrderTemplate(Integer id) {
+        return insOrderTemplateMapper.deleteById(id);
+    }
+}
+
+
+
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsProductServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsProductServiceImpl.java
new file mode 100644
index 0000000..63619a2
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsProductServiceImpl.java
@@ -0,0 +1,221 @@
+package com.ruoyi.inspect.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.mapper.StandardProductListMapper;
+import com.ruoyi.basic.pojo.StandardProductList;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.dto.InsProductBindingDto;
+import com.ruoyi.inspect.mapper.InsOrderMapper;
+import com.ruoyi.inspect.mapper.InsProductMapper;
+import com.ruoyi.inspect.mapper.InsSampleMapper;
+import com.ruoyi.inspect.pojo.InsOrder;
+import com.ruoyi.inspect.pojo.InsProduct;
+import com.ruoyi.inspect.pojo.InsSample;
+import com.ruoyi.inspect.service.InsProductService;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@AllArgsConstructor
+@Transactional(rollbackFor = Exception.class)
+public class InsProductServiceImpl extends ServiceImpl<InsProductMapper, InsProduct>
+        implements InsProductService {
+
+    private InsProductMapper insProductMapper;
+
+    private InsOrderMapper insOrderMapper;
+
+    private InsSampleMapper insSampleMapper;
+
+    private StandardProductListMapper standardProductListMapper;
+
+    @Override
+    public int selectOrderManDay(Integer orderId) {
+        return insProductMapper.selectOrderManDay(orderId);
+    }
+
+    @Override
+    public int updateInspected(Integer id, String ids) {
+        InsOrder insOrder = new InsOrder();
+        insOrder.setId(id);
+        insOrder.setIsRevocation(1);//闇�瑕佸鏍�
+        insOrder.setRevocationInsProductIds(ids);
+        return insOrderMapper.updateById(insOrder);
+    }
+
+    @Override
+    public boolean write(InsOrder insOrder) {
+        insOrderMapper.updateById(insOrder);
+        return true;
+    }
+
+    //鏌ヨ寰呮椤圭洰
+    @Override
+    public IPage<InsProduct> selectNoProducts(Page page, InsProduct insProduct, Integer orderId, String ids) {
+        List<Integer> noIds = null;
+        if (StringUtils.isNotBlank(ids)) {
+            noIds = Arrays.asList(ids.split(",")).stream()
+                    .map(Integer::parseInt)
+                    .collect(Collectors.toList());
+        }
+        IPage<InsProduct> insProductIPage = baseMapper.selectNoProducts(page, orderId, noIds);
+        return insProductIPage;
+    }
+
+    //瀹℃牳寰呮鎾ら攢
+    @Override
+    public void checkUpdate(Integer orderId, Integer state) {
+        InsOrder insOrder = insOrderMapper.selectById(orderId);
+        if (state == 1) {
+            List<String> list = new ArrayList<>();
+            try {
+                list = Arrays.asList(insOrder.getRevocationInsProductIds().split(","));
+            } catch (Exception e) {
+                throw new ErrorException("杩樻病鏈夐�夋嫨搴旇瑕佹挙閿�鐨勬楠岄」鐩�");
+            }
+            List<Integer> ids = list.stream()
+                    .map(Integer::parseInt)
+                    .collect(Collectors.toList());
+            List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery().eq(InsSample::getInsOrderId, orderId));
+            List<Integer> collect = insSamples.stream().map(InsSample::getId).collect(Collectors.toList());
+            List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery().eq(InsProduct::getState, 1).in(InsProduct::getInsSampleId, collect));
+            if (insProducts.stream().map(InsProduct::getId).collect(Collectors.toList()).equals(ids)) {
+                //濡傛灉璇ユ楠屽崟涓嬬殑鎵�鏈夐」鐩叏閮ㄩ兘鎾ら攢,閭d箞杩欎釜鍗曞瓙涔熼渶瑕佹挙閿�
+                insOrder.setState(3);
+            } else {
+                List<InsProduct> products = insProductMapper.selectBatchIds(ids);
+                //棣栧厛鏍规嵁閫夋嫨鐨勯」鐩甶d杩涜鎾ら攢椤圭洰
+                updateBatchById(products.stream().map(insProduct -> {
+                    insProduct.setState(0);
+                    return insProduct;
+                }).collect(Collectors.toList()));
+            }
+            //insProductMapper.updateInspected(id);
+        }
+        //涓嶉�氳繃
+        insOrder.setIsRevocation(0);
+        insOrderMapper.updateById(insOrder);
+
+    }
+
+
+    /**
+     * 鏍规嵁妫�楠岄」id鏌ヨ妫�楠岄」鏍戜俊鎭�
+     * @param productId
+     * @return
+     */
+    @Override
+    public List<InsProduct> getProductTreeByProductId(Integer productId) {
+        // 鏌ヨ妫�楠岄」淇℃伅
+        InsProduct insProduct = insProductMapper.selectById(productId);
+        String tree = insProduct.getFactory() + " - " +
+                insProduct.getLaboratory() + " - " +
+                insProduct.getSampleType() + " - " +
+                insProduct.getSample() + " - " +
+                insProduct.getModel();
+        // 鏌ヨ鏍囧噯鏍�
+        List<StandardProductList> standardProductLists = standardProductListMapper.selectList(Wrappers.<StandardProductList>lambdaQuery()
+                .eq(StandardProductList::getStandardMethodListId, insProduct.getStandardMethodListId())
+                .eq(StandardProductList::getTree, tree));
+
+        List<InsProduct> insProducts = standardProductLists.stream().map(standardProductList -> {
+            InsProduct product = new InsProduct();
+            BeanUtils.copyProperties(standardProductList, product);
+            // 闃叉搴忓垪鍖栭敊璇�
+            product.setTemplate(null);
+            product.setStyle(null);
+            return product;
+        }).collect(Collectors.toList());
+        return insProducts;
+    }
+
+    /**
+     * 鐗规畩妫�楠岄」缁戝畾
+     * @param insProductBindingDto
+     * @return
+     */
+    @Override
+    public boolean bindingProductTreeByProductId(InsProductBindingDto insProductBindingDto) {
+        if (insProductBindingDto.getInsProductId() == null) {
+            throw new ErrorException("缂哄皯妫�楠岄」缁戝畾id");
+        }
+
+        List<InsProduct> insProductBindingList = insProductBindingDto.getInsProductBindingList();
+        // 鏌ヨ鍘熸湰妫�楠岄」
+        InsProduct insProduct = insProductMapper.selectById(insProductBindingDto.getInsProductId());
+
+        for (InsProduct product : insProductBindingList) {
+            product.setBindingProductId(insProductBindingDto.getInsProductId());
+            product.setAsk(null);
+            product.setTell(null);
+            product.setPrice(null);
+            product.setManHour(null);
+            product.setSection(null);
+            // 鍏宠仈鏍囪瘑
+            product.setRawMaterialTag(insProduct.getRawMaterialTag());
+            product.setRepetitionTag(insProduct.getRepetitionTag());
+            product.setInsSampleId(insProduct.getInsSampleId());
+            product.setIsBinding(1);
+            product.setState(1);
+        }
+
+        // 鍒ゆ柇鏄惁鏄數缂嗘槸鐢电紗闇�瑕佹坊鍔犳墍鏈夌數缂嗗叧鑱斿叧绯�
+        if (StringUtils.isNotBlank(insProduct.getCableTag())) {
+            // 鏌ヨ鍏朵粬鐢电紗
+            List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
+                    .eq(InsProduct::getInsSampleId, insProduct.getInsSampleId())
+                    .eq(InsProduct::getStructureItemParameterId, insProduct.getStructureItemParameterId())
+                    .isNotNull(InsProduct::getCableTag));
+            for (InsProduct product : insProducts) {
+                for (InsProduct insProduct1 : insProductBindingList) {
+                    insProduct1.setId(null);
+                    insProduct1.setBindingProductId(product.getId());
+                    insProduct1.setCableTag(product.getCableTag());
+                }
+                this.saveBatch(insProductBindingList);
+            }
+        } else {
+            this.saveBatch(insProductBindingList);
+        }
+
+        return true;
+    }
+
+    /**
+     * 鍒犻櫎鐗规畩妫�楠岄」缁戝畾淇℃伅
+     * @param productId
+     * @return
+     */
+    @Override
+    public boolean removeBindingProductTree(Integer productId) {
+        // 鏌ヨ妫�楠岄」
+        InsProduct insProduct = insProductMapper.selectById(productId);
+        // 鍒ゆ柇鏄惁鏄數缂嗛厤缃�, 闇�瑕佸垹闄ゅ叧鑱旂殑鎵�鏈夌殑妫�楠岄」
+        if (StringUtils.isNotBlank(insProduct.getCableTag())) {
+            insProductMapper.delete(Wrappers.<InsProduct>lambdaQuery()
+                    .eq(InsProduct::getInsSampleId, insProduct.getInsSampleId())
+                    .eq(InsProduct::getIsBinding, 1)
+                    .isNotNull(InsProduct::getBindingProductId)
+                    .eq(InsProduct::getStructureItemParameterId, insProduct.getStructureItemParameterId())
+                    .isNotNull(InsProduct::getCableTag));
+        } else {
+            insProductMapper.deleteById(productId);
+        }
+        return false;
+    }
+
+
+}
+
+
+
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java
index 45ef235..742af90 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java
@@ -1,1163 +1,1155 @@
-//package com.ruoyi.inspect.service.impl;
-//
-//import cn.hutool.core.util.StrUtil;
-//import cn.hutool.json.JSONUtil;
-//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-//import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-//import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-//import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
-//import com.baomidou.mybatisplus.core.toolkit.StringUtils;
-//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-//import com.deepoove.poi.XWPFTemplate;
-//import com.deepoove.poi.data.Pictures;
-//import com.ruoyi.common.properties.WechatProperty;
-//import com.ruoyi.common.utils.QueryWrappers;
-//import com.ruoyi.inspect.dto.ReportPageDto;
-//import com.ruoyi.inspect.mapper.InsOrderStateMapper;
-//import com.ruoyi.inspect.mapper.InsProductMapper;
-//import com.ruoyi.inspect.mapper.InsReportMapper;
-//import com.ruoyi.inspect.mapper.InsUnqualifiedRetestProductMapper;
-//import com.ruoyi.inspect.pojo.InsReport;
-//import com.ruoyi.inspect.service.InsOrderService;
-//import com.ruoyi.inspect.service.InsReportService;
-//import com.ruoyi.system.mapper.UserMapper;
-//import org.apache.poi.xwpf.usermodel.*;
-//import org.springframework.beans.factory.annotation.Value;
-//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 javax.imageio.ImageIO;
-//import java.awt.image.BufferedImage;
-//import java.io.*;
-//import java.nio.file.Files;
-//import java.nio.file.Path;
-//import java.nio.file.Paths;
-//import java.nio.file.StandardCopyOption;
-//import java.time.LocalDateTime;
-//import java.time.format.DateTimeFormatter;
-//import java.util.*;
-//import java.util.stream.Collectors;
-//import java.util.zip.ZipEntry;
-//import java.util.zip.ZipFile;
-//import java.util.zip.ZipOutputStream;
-//
-///**
-// * @author Administrator
-// * @description 閽堝琛ㄣ�恑ns_report(妫�楠屾姤鍛�)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
-// * @createDate 2024-03-17 22:10:02
-// */
-//@Service
-//public class InsReportServiceImpl extends ServiceImpl<InsReportMapper, InsReport>
-//        implements InsReportService {
-//
-//    @Resource
-//    private GetLook getLook;
-//    @Resource
-//    private UserMapper userMapper;
-//    @Resource
-//    private InsReportMapper insReportMapper;
-//    @Resource
-//    private InsOrderStateMapper insOrderStateMapper;
-//    @Resource
-//    private InsProductMapper insProductMapper;
-//    @Resource
-//    private InformationNotificationService informationNotificationService;
-//    @Value("${wordUrl}")
-//    private String wordUrl;
-//    @Value("${file.path}")
-//    private String imgUrl;
-//    @Value("${file.licenseUrl}")
-//    private String licenseUrl;
-//    @Resource
-//    private InsOrderMapper insOrderMapper;
-//    @Resource
-//    private IfsInventoryQuantityMapper ifsInventoryQuantityMapper;
-//    @Resource
-//    private InsUnqualifiedHandlerMapper insUnqualifiedHandlerMapper;
-//    @Resource
-//    private InsSampleMapper insSampleMapper;
-//    @Resource
-//    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
-//    @Resource
-//    private InsOrderService insOrderService;
-//    @Resource
-//    private WechatProperty wechatProperty;
-//    @Resource
-//    private InsUnqualifiedRetestProductMapper insUnqualifiedRetestProductMapper;
-//    @Resource
-//    private IfsApiUtils ifsApiUtils;
-//    @Resource
-//    private InsSampleUserMapper insSampleUserMapper;
-//
-//
-//    @Override
-//    public Map<String, Object> pageInsReport(Page page, ReportPageDto reportPageDto) {
-//        Map<String, Object> map = new HashMap<>();
-//        map.put("head", PrintChina.printChina(ReportPageDto.class));
-//        Map<String, Integer> map1 = getLook.selectPowerByMethodAndUserId("pageInsReport");
-//        User user = userMapper.selectById(map1.get("userId"));//褰撳墠鐧诲綍鐨勪汉
-//        //鑾峰彇褰撳墠浜烘墍灞炲疄楠屽id
-//        String departLimsId = user.getDepartLimsId();
-//        String laboratory = null;
-////        if (ObjectUtils.isNotEmpty(departLimsId) && !departLimsId.equals("")) {
-////            String[] split = departLimsId.split(",");
-////            //鏌ヨ瀵瑰簲鏋舵瀯鍚嶇О(閫氫俊瀹為獙瀹�,鐢靛姏瀹為獙瀹�,妫�娴嬪姙)
-////            String departLims = insOrderMapper.seldepLimsId(Integer.parseInt(split[split.length - 1]));
-////            if (departLims.contains("瀹為獙瀹�")) {
-////                laboratory = departLims;
-////            }
-////        }
-//
-//        Integer createOrderUser = null;
-//        if (map1.get("look") == 1) {
-//            //涓汉
-//            createOrderUser = map1.get("userId");
-//        }
-//        String queryStatus = reportPageDto.getQueryStatus();
-//        reportPageDto.setQueryStatus(null);
-//
-//        map.put("body", insReportMapper.pageInsReport(page,
-//                QueryWrappers.queryWrappers(reportPageDto),
-//                laboratory,
-//                map1.get("userId"),
-//                queryStatus,
-//                createOrderUser));
-//        return map;
-//    }
-//
-//    @Override
-//    public int inReport(String url, Integer id) {
-//        InsReport insReport = new InsReport();
-//        insReport.setId(id);
-//        insReport.setUrlS(url);
-//        // 杩樺師pdf
-//        String tempUrlPdf = wordToPdfTemp(insReport.getUrlS().replace("/word", wordUrl));
-//        insReport.setTempUrlPdf("/word/" + tempUrlPdf);
-//        return insReportMapper.updateById(insReport);
-//    }
-//
-//    @Override
-//    public int upReportUrl(Integer id) {
-//        InsReport report = insReportMapper.selectById(id);
-//        // 杩樺師pdf
-//        String tempUrlPdf = wordToPdfTemp(report.getUrl().replace("/word", wordUrl));
-//
-//        return insReportMapper.update(null, Wrappers.<InsReport>lambdaUpdate()
-//                .eq(InsReport::getId, id)
-//                .set(InsReport::getUrlS, null)
-//                .set(InsReport::getTempUrlPdf, "/word/" + tempUrlPdf));
-//    }
-//
-//    //鎻愪氦
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public int writeReport(Integer id, Integer userId, Integer submitUserId) {
-//        submitUserId = submitUserId == null ? getLook.selectPowerByMethodAndUserId(null).get("userId") : submitUserId;
-//        InsReport insReport = insReportMapper.selectById(id);
-//        insReport.setId(id);
-//        insReport.setState(1);
-//        insReport.setWriteUserId(submitUserId);//鎻愪氦浜�
-//        if (userId == null) {
-//            throw new ErrorException("缂哄皯瀹℃牳浜�");
-//        }
-//        insReport.setExamineUserId(userId);//瀹℃牳浜�
-//        insReport.setWriteTime(LocalDateTime.now());//鎻愪氦鏃堕棿
-//        //鑾峰彇鎻愪氦浜虹殑绛惧悕鍦板潃
-//        String signatureUrl;
-//        try {
-//            signatureUrl = userMapper.selectById(insReport.getWriteUserId()).getSignatureUrl();
-//        } catch (Exception e) {
-//            throw new ErrorException("鎵句笉鍒扮紪鍒朵汉鐨勭鍚�");
-//        }
-//        if (ObjectUtils.isEmpty(signatureUrl) || signatureUrl.equals("")) {
-//            throw new ErrorException("鎵句笉鍒版楠屼汉鐨勭鍚�");
-//        }
-//
-//        Integer insOrderId = insReportMapper.selectById(id).getInsOrderId();
-//        InsOrder order = insOrderMapper.selectById(insOrderId);
-//        boolean isRawMater = order.getTypeSource() != null && order.getTypeSource().equals(1);
-//
-//        //鍙戦�佹秷鎭�
-//        InformationNotification info = new InformationNotification();
-//        info.setCreateUser(insProductMapper.selectUserById(userId).get("name"));
-//        info.setMessageType("3");
-//        info.setTheme("瀹℃牳閫氱煡");
-//        info.setContent("鎮ㄦ湁涓�鏉℃姤鍛婄紪鍒跺緟瀹℃牳娑堟伅, 缂栧彿:" + insReport.getCode());
-//        info.setSenderId(submitUserId);    //鍙戦�佷汉
-//        info.setConsigneeId(userId);     //鏀朵欢浜�
-//        info.setViewStatus(false);
-//        info.setJumpPath("b1-report-preparation");
-//        informationNotificationService.addInformationNotification(info);
-//        //绯荤粺鐢熸垚鎶ュ憡鍦板潃
-//        String url = insReport.getUrl();
-//        //鎵嬪姩涓婁紶鎶ュ憡鍦板潃
-//        String urlS = insReport.getUrlS();
-//
-//        // 鍒ゆ柇鏄惁鏄師鏉愭枡  闇�瑕佹浛鎹�****鎴愪緵搴斿晢
-//        IfsInventoryQuantity one = ifsInventoryQuantityMapper.selectOne(new LambdaQueryWrapper<IfsInventoryQuantity>()
-//                .eq(IfsInventoryQuantity::getId, order.getIfsInventoryId()));
-//        if (one != null) {
-//            if (isRawMater && order.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY)) {
-//                changeText(new HashMap<String, String>() {{
-//                    put("**********", one.getSupplierName());
-//                }}, (StrUtil.isBlank(urlS) ? url : urlS).replace("/word", wordUrl));
-//            }
-//        }
-//
-//        wordInsertUrl(new HashMap<String, Object>() {{
-//            put("writeUrl", Pictures.ofLocal(imgUrl + "/" + signatureUrl).create());
-//            put("writeDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(null)).create());
-//            put("insUrl", Pictures.ofLocal(imgUrl + "/" + signatureUrl).create());
-//        }}, (StrUtil.isBlank(urlS) ? url : urlS).replace("/word", wordUrl));
-//
-//        // 淇敼涓存椂pdf
-//        String tempUrlPdf = wordToPdfTemp((StrUtil.isBlank(urlS) ? url : urlS).replace("/word", wordUrl));
-//        insReport.setTempUrlPdf("/word/" + tempUrlPdf);
-//
-//        insReportMapper.updateById(insReport);
-//
-//        // 娓呯┖瀹℃牳鏃堕棿, 瀹℃牳鐘舵��
-//        insReportMapper.update(null, Wrappers.<InsReport>lambdaUpdate()
-//                .eq(InsReport::getId, insReport.getId())
-//                .set(InsReport::getRatifyTime, null)
-//                .set(InsReport::getIsRatify, null)
-//                .set(InsReport::getExamineTime, null)
-//                .set(InsReport::getIsExamine, null));
-//
-//        return 1;
-//    }
-//
-//    //瀹℃牳
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public int examineReport(Integer id, Integer isExamine, String examineTell, Integer userId) {
-//        InsReport insReport = insReportMapper.selectById(id);
-//        insReport.setIsExamine(isExamine);
-//        if (ObjectUtils.isNotEmpty(examineTell)) {
-//            insReport.setExamineTell(examineTell);
-//        }
-//
-//        // 妫�楠屼汉
-//        String userName = insProductMapper.selectUserById(insReport.getWriteUserId()).get("name");
-//        String userAccount = insProductMapper.selectUserById(insReport.getWriteUserId()).get("account");
-//
-//        // 瀹℃牳浜�
-//        Integer checkUserId = getLook.selectPowerByMethodAndUserId(null).get("userId");
-//        String checkUserName = insProductMapper.selectUserById(checkUserId).get("name");
-//
-//        insReport.setExamineTime(LocalDateTime.now());//瀹℃牳鏃堕棿
-//        if (isExamine == 0) {
-//            // 鍙戦�佷紒涓氬井淇¢�氱煡(瀹℃牳閫�鍥�)
-//            threadPoolTaskExecutor.execute(() -> {
-//                // 鏌ヨ璁㈠崟
-//                InsOrder order = insOrderMapper.selectById(insReport.getInsOrderId());
-//                InsSample insSample = insSampleMapper.selectOne(Wrappers.<InsSample>lambdaQuery()
-//                        .eq(InsSample::getInsOrderId, insReport.getInsOrderId())
-//                        .last("limit 1"));
-//                // 鏌ヨ鍘熸潗鏂�
-//                IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(order.getIfsInventoryId());
-//
-//                String message = "";
-//                message += "鎶ュ憡缂栧埗瀹℃牳閫�鍥為�氱煡";
-//                message += "\n瀹℃牳浜�: " + checkUserName;
-//                message += "\n濮旀墭缂栧彿: " + order.getEntrustCode();
-//                message += "\n鏍峰搧鍚嶇О: " + insSample.getModel();
-//                message += "\n瑙勬牸鍨嬪彿: " + order.getPartDetail();
-//                if (ifsInventoryQuantity != null) {
-//                    message += "\n鎵规鍙�: " + ifsInventoryQuantity.getUpdateBatchNo();
-//                }
-//                message += "\n閫�鍥炲師鍥�: " + examineTell;
-//                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡  鎻愪氦澶嶆牳
-//                try {
-//                    WxCpUtils.inform(userAccount, message, null);
-//                } catch (Exception e) {
-//                    throw new RuntimeException(e);
-//                }
-//            });
-//
-//            //濡傛灉瀹℃牳涓嶉�氳繃
-//            insReport.setState(0);//鎻愪氦鐘舵�佹敼涓哄緟鎻愪氦
-//            return insReportMapper.updateById(insReport);
-//        } else {
-//            if (userId == null) {
-//                throw new ErrorException("缂哄皯鎵瑰噯浜�");
-//            }
-//        }
-//        insReport.setRatifyUserId(userId);//鎵瑰噯浜�
-//        //鑾峰彇瀹℃牳浜虹殑绛惧悕鍦板潃
-//        String signatureUrl;
-//        try {
-//            signatureUrl = userMapper.selectById(insReport.getExamineUserId()).getSignatureUrl();
-//        } catch (Exception e) {
-//            throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
-//        }
-//        if (StringUtils.isBlank(signatureUrl)) {
-//            throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
-//        }
-//
-//        // 鎵瑰噯浜�
-//        String sendUserAccount = insProductMapper.selectUserById(userId).get("account");
-//
-//        //鍙戦�佹秷鎭�
-//        //褰撳墠鐢ㄦ埛
-//        Integer currentUser = getLook.selectPowerByMethodAndUserId(null).get("userId");
-//        InformationNotification info = new InformationNotification();
-//        info.setCreateUser(insProductMapper.selectUserById(userId).get("name"));
-//        info.setMessageType("3");
-//        info.setTheme("鎵瑰噯閫氱煡");
-//        info.setContent("鎮ㄦ湁涓�鏉℃姤鍛婄紪鍒跺緟鎵瑰噯娑堟伅, 缂栧彿:" + insReport.getCode());
-//        info.setSenderId(currentUser);    //鍙戦�佷汉
-//        info.setConsigneeId(userId);     //鏀朵欢浜�
-//        info.setViewStatus(false);
-//        info.setJumpPath("b1-report-preparation");
-//        informationNotificationService.addInformationNotification(info);
-//        //绯荤粺鐢熸垚鎶ュ憡鍦板潃
-//        String url = insReport.getUrl();
-//        //鎵嬪姩涓婁紶鎶ュ憡鍦板潃
-//        String urlS = insReport.getUrlS();
-//        wordInsertUrl(new HashMap<String, Object>() {{
-//            put("examineUrl", Pictures.ofLocal(imgUrl + "/" + signatureUrl).create());
-//            put("examineDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(null)).create());
-//        }}, (StrUtil.isBlank(urlS) ? url : urlS).replace("/word", wordUrl));
-//
-//        // 淇敼涓存椂pdf
-//        String tempUrlPdf = wordToPdfTemp((StrUtil.isBlank(urlS) ? url : urlS).replace("/word", wordUrl));
-//        insReport.setTempUrlPdf("/word/" + tempUrlPdf);
-//
-//        // 鍙戦�佷紒涓氬井淇¢�氱煡(閫氱煡鎵瑰噯浜哄鎵�)
-//        threadPoolTaskExecutor.execute(() -> {
-//            // 鏌ヨ璁㈠崟
-//            InsOrder order = insOrderMapper.selectById(insReport.getInsOrderId());
-//            InsSample insSample = insSampleMapper.selectOne(Wrappers.<InsSample>lambdaQuery()
-//                    .eq(InsSample::getInsOrderId, insReport.getInsOrderId())
-//                    .last("limit 1"));
-//            // 鏌ヨ鍘熸潗鏂�
-//            IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(order.getIfsInventoryId());
-//
-//            String message = "";
-//            message += "鎶ュ憡缂栧埗鎵瑰噯閫氱煡";
-//            message += "\n妫�楠屼汉: " + userName;
-//            message += "\n澶嶆牳浜�: " + checkUserName;
-//            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);
-//            }
-//        });
-//        insReportMapper.updateById(insReport);
-//
-//        // 娓呯┖鎵瑰噯澶囨敞, 鎵瑰噯鏃堕棿, 鎵瑰噯鐘舵��
-//        insReportMapper.update(null, Wrappers.<InsReport>lambdaUpdate()
-//                .eq(InsReport::getId, insReport.getId())
-//                .set(InsReport::getExamineTell, null)
-//                .set(InsReport::getRatifyTime, null)
-//                .set(InsReport::getIsRatify, null));
-//        return 1;
-//    }
-//
-//    //鎵瑰噯
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public int ratifyReport(Integer id, Integer isRatify, String ratifyTell) {
-//        InsReport insReport = insReportMapper.selectById(id);
-//        insReport.setIsRatify(isRatify);
-//        if (ObjectUtils.isNotEmpty(ratifyTell)) {
-//            insReport.setRatifyTell(ratifyTell);
-//        }
-//        insReport.setRatifyTime(LocalDateTime.now());//鎵瑰噯鏃堕棿
-//        if (isRatify == 0) {
-//
-//            // 鎵瑰噯浜�
-//            Integer ratifyUserId = getLook.selectPowerByMethodAndUserId(null).get("userId");
-//            String ratifyUserName = insProductMapper.selectUserById(ratifyUserId).get("name");
-//
-//            // 鍙戦�佷汉(瀹℃牳浜�)(妫�楠屼汉)
-//            // 妫�楠屼汉
-//            String userAccount = insProductMapper.selectUserById(insReport.getWriteUserId()).get("account");
-//            // 瀹℃牳浜�
-//            String checkUserAccount = insProductMapper.selectUserById(insReport.getExamineUserId()).get("account");
-//
-//
-//            // 鍙戦�佷紒涓氬井淇¢�氱煡(鎵瑰噯閫�鍥�)
-//            threadPoolTaskExecutor.execute(() -> {
-//                // 鏌ヨ璁㈠崟
-//                InsOrder order = insOrderMapper.selectById(insReport.getInsOrderId());
-//                InsSample insSample = insSampleMapper.selectOne(Wrappers.<InsSample>lambdaQuery()
-//                        .eq(InsSample::getInsOrderId, insReport.getInsOrderId())
-//                        .last("limit 1"));
-//                // 鏌ヨ鍘熸潗鏂�
-//                IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(order.getIfsInventoryId());
-//
-//                String message = "";
-//                message += "鎶ュ憡缂栧埗鎵瑰噯閫�鍥為�氱煡";
-//                message += "\n鎵瑰噯浜�: " + ratifyUserName;
-//                message += "\n濮旀墭缂栧彿: " + order.getEntrustCode();
-//                message += "\n鏍峰搧鍚嶇О: " + insSample.getModel();
-//                message += "\n瑙勬牸鍨嬪彿: " + order.getPartDetail();
-//                if (ifsInventoryQuantity != null) {
-//                    message += "\n鎵规鍙�: " + ifsInventoryQuantity.getUpdateBatchNo();
-//                }
-//                message += "\n閫�鍥炲師鍥�: " + ratifyTell;
-//                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡  鎻愪氦澶嶆牳
-//                try {
-//                    // 瀹℃壒浜�
-//                    WxCpUtils.inform(checkUserAccount, message, null);
-//
-//                    // 妫�楠屼汉
-//                    WxCpUtils.inform(userAccount, message, null);
-//                } catch (Exception e) {
-//                    throw new RuntimeException(e);
-//                }
-//            });
-//
-//            //濡傛灉鎵瑰噯涓嶉�氳繃 鐩存帴閫�鍥炲埌鎻愪氦浜洪偅杈瑰幓
-//            insReport.setState(0);
-//            insReport.setIsExamine(0);
-//            return insReportMapper.updateById(insReport);
-//        }
-//        //鑾峰彇鎵瑰噯浜虹殑绛惧悕鍦板潃
-//        String signatureUrl;
-//        try {
-//            signatureUrl = userMapper.selectById(insReport.getRatifyUserId()).getSignatureUrl();
-//        } catch (Exception e) {
-//            throw new ErrorException("鎵句笉鍒版壒鍑嗕汉鐨勭鍚�");
-//        }
-//        if (StringUtils.isBlank(signatureUrl)) {
-//            throw new ErrorException("鎵句笉鍒版壒鍑嗕汉鐨勭鍚�");
-//        }
-//        Integer insOrderId = insReportMapper.selectById(id).getInsOrderId();
-//        InsOrder order = insOrderMapper.selectById(insOrderId);
-//        boolean isRawMater = order.getTypeSource() != null && order.getTypeSource().equals(1);
-//
-//        //鑾峰彇鍦烘墍鐨勬姤鍛婁笓鐢ㄧ珷
-//        String sealUrl;
-//        String laboratory = insOrderMapper.selectById(insReport.getInsOrderId()).getLaboratory();
-//        try {
-//            String type = "";
-//            if (isRawMater && order.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY)) {
-//                type = "杩涘巶鎶ュ憡";
-//            } else {
-//                type = "濮旀墭鎶ュ憡";
-//            }
-//            sealUrl = insReportMapper.getLaboratoryByName(laboratory, type);
-//        } catch (Exception e) {
-//            throw new ErrorException(laboratory + "鎵句笉鍒版姤鍛婁笓鐢ㄧ珷");
-//        }
-//        if (StringUtils.isBlank(sealUrl)) {
-//            throw new ErrorException(laboratory + "鎵句笉鍒版姤鍛婁笓鐢ㄧ珷");
-//        }
-//        //绯荤粺鐢熸垚鎶ュ憡鍦板潃
-//        String url = insReport.getUrl();
-//        //鎵嬪姩涓婁紶鎶ュ憡鍦板潃
-//        String urlS = insReport.getUrlS();
-//        String finalUrl = (StrUtil.isBlank(urlS) ? url : urlS).replace("/word", wordUrl);
-//
-//        wordInsertUrl(new HashMap<String, Object>() {{
-//            put("ratifyUrl", Pictures.ofLocal(imgUrl + "/" + signatureUrl).create());
-//            put("ratifyDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(null)).create());
-//            put("seal1", Pictures.ofLocal(imgUrl + "/" + sealUrl).create());
-//            put("seal2", Pictures.ofLocal(imgUrl + "/" + sealUrl).create());
-//        }}, finalUrl);
-//
-//        // 淇敼涓存椂pdf
-//        insReport.setTempUrlPdf((StrUtil.isBlank(urlS) ? url : urlS).replace(".docx", ".pdf"));
-//
-//        InsOrder insOrder = new InsOrder();
-//        insOrder.setId(insOrderId);
-//        insOrder.setState(4);
-//        insOrderMapper.updateById(insOrder);
-//
-//        wordToPdf(finalUrl, sealUrl, isRawMater && order.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY));
-//
-//        // 鍒ゆ柇鏄惁涓哄師鏉愭枡
-//        if (isRawMater) {
-//            // 淇敼ifs搴撳瓨鐘舵��
-//            ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
-//                    .set(IfsInventoryQuantity::getState, 2)
-//                    .eq(IfsInventoryQuantity::getId, order.getIfsInventoryId()));
-//        }
-//        insReport.setRatifyTell("");
-//
-//        // 鍙戦�佹枃浠跺埌濮旀墭浜�
-//        if (StringUtils.isNotBlank(order.getPrepareCode())) {
-//            threadPoolTaskExecutor.execute(() -> {
-//                String message = "";
-//                message += "濮旀墭缂栧彿: " + order.getEntrustCode();
-//                message += "濮旀墭鏍峰搧: " + order.getSampleView();
-//                message += "宸叉娴嬬粨鏉�, 璇锋帴鏀�";
-//                try {
-//                    WxCpUtils.inform(order.getPrepareCode(), message, new File(finalUrl.replace(".docx", ".pdf")));
-//                } catch (Exception e) {
-//                    throw new RuntimeException(e);
-//                }
-//            });
-//        }
-//
-//        return insReportMapper.updateById(insReport);
-//    }
-//
-//    @Override
-//    public int wordInsertUrl(Map<String, Object> map, String url) {
-//        XWPFTemplate template = XWPFTemplate.compile(url).render(map);
-//        try {
-//            template.writeAndClose(Files.newOutputStream(Paths.get(url)));
-//        } catch (IOException e) {
-//            throw new RuntimeException(e);
-//        }
-//        return 1;
-//    }
-//
-//
-//    //鎶ュ憡鎵归噺涓嬭浇
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public String downAll(String ids) {
-//        List<Long> list = Arrays.stream(ids.split(",")).map(Long::parseLong).collect(Collectors.toList());
-//        List<InsReport> insReports = insReportMapper.selectBatchIds(list);
-//        String zipFilePath = null;
-//        // 涓存椂鏂囦欢澶硅矾寰�
-//        try {
-//            String tempFolderPath = wordUrl + "/tempFolder";
-//            File tempFolder = new File(tempFolderPath);
-//            if (tempFolder.exists()) {
-//                deleteDirectory(tempFolder); // 鍒犻櫎鏃х殑涓存椂鏂囦欢澶�
-//            }
-//            tempFolder.mkdirs(); // 鍒涘缓鏂扮殑涓存椂鏂囦欢澶�
-//            for (InsReport insReport : insReports) {
-//                File sourceFile = new File((ObjectUtils.isNotEmpty(insReport.getUrlS()) ? insReport.getUrlS() : insReport.getUrl()).replace("/word", wordUrl));
-//                File destinationFile = new File(tempFolder, sourceFile.getName());
-//                Files.copy(sourceFile.toPath(), destinationFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
-//            }
-//            // 鍘嬬缉涓存椂鏂囦欢澶�
-//            zipFilePath = wordUrl + "/zip/output.zip";
-//            zipDirectory(tempFolderPath, zipFilePath);
-//
-//            // 娓呯悊涓存椂鏂囦欢澶�
-//            deleteDirectory(tempFolder);
-//
-//            System.out.println("ZIP鏂囦欢鍒涘缓瀹屾垚锛�");
-//        } catch (IOException e) {
-//            e.printStackTrace();
-//        }
-//        return "/word/zip/output.zip";
-//    }
-//
-//    //鎵归噺涓婁紶
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public int upAll(MultipartFile file) throws IOException {
-//        File tempFile = null;
-//        File unzipDir = null;
-//        try {
-//            tempFile = File.createTempFile(wordUrl, ".zip");
-//            file.transferTo(tempFile);
-//
-//            unzipDir = new File("uploaded_files");
-//            if (!unzipDir.exists()) {
-//                unzipDir.mkdir();
-//            }
-//            unzip(tempFile, unzipDir);
-//            // 澶勭悊瑙e帇鍚庣殑鏂囦欢
-//            File[] files = unzipDir.listFiles();
-//            if (files != null) {
-//                for (File f : files) {
-//                    // 鏍规嵁鏂囦欢鍚嶆煡璇d
-//                    String name = f.getName();
-//                    InsReport insReport = insReportMapper.selectOne(Wrappers.<InsReport>lambdaQuery().like(InsReport::getCode, f.getName().replace(".docx", "").replace("JCZX", "JCZX/")));
-//                    if (ObjectUtils.isEmpty(insReport)) {
-//                        throw new ErrorException("娌℃湁鎵惧埌 " + f.getName() + " 杩欎釜鏂囦欢瀵瑰簲鐨勬姤鍛婃暟鎹�");
-//                    }
-//                    String urlString;
-//                    String pathName;
-//                    try {
-//                        String path = wordUrl;
-//                        File realpath = new File(path);
-//                        if (!realpath.exists()) {
-//                            realpath.mkdirs();
-//                        }
-//                        pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "_" + f.getName();
-//                        urlString = realpath + "/" + pathName;
-//                        // 澶嶅埗鏂囦欢鍒版寚瀹氳矾寰�
-//                        Files.copy(f.toPath(), new File(urlString).toPath(), StandardCopyOption.REPLACE_EXISTING);
-//                        inReport("/word/" + pathName, insReport.getId());
-//                    } catch (IOException e) {
-//                        throw new ErrorException("鏂囦欢涓婁紶澶辫触");
-//                    }
-//                }
-//            }
-//        } catch (IOException e) {
-//            throw new ErrorException("鏂囦欢澶勭悊澶辫触");
-//        } finally {
-//            if (tempFile != null && tempFile.exists()) {
-//                tempFile.delete();
-//            }
-//            // 閫掑綊鍒犻櫎瑙e帇鐩綍鍙婂叾涓殑鏂囦欢
-//            if (unzipDir.exists()) {
-//                deleteDirectory(unzipDir); // 鍒犻櫎鏃х殑涓存椂鏂囦欢澶�
-//            }
-//        }
-//        return 0;
-//    }
-//
-//
-//    //瑙e帇鏂囦欢澶�
-//    private void unzip(File zipFile, File destDir) throws IOException {
-//        try (ZipFile zip = new ZipFile(zipFile)) {
-//            Enumeration<? extends ZipEntry> entries = zip.entries();
-//            while (entries.hasMoreElements()) {
-//                ZipEntry entry = entries.nextElement();
-//                File file = new File(destDir, entry.getName());
-//                if (entry.isDirectory()) {
-//                    file.mkdirs();
-//                } else {
-//                    file.getParentFile().mkdirs();
-//                    try (InputStream in = zip.getInputStream(entry);
-//                         OutputStream out = new FileOutputStream(file)) {
-//                        byte[] buffer = new byte[1024];
-//                        int len;
-//                        while ((len = in.read(buffer)) > 0) {
-//                            out.write(buffer, 0, len);
-//                        }
-//                    }
-//                }
-//            }
-//        }
-//    }
-//
-//    // 鍘嬬缉鏂囦欢澶�
-//    public static void zipDirectory(String sourceDirPath, String zipFilePath) throws IOException {
-//        try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFilePath))) {
-//            Path sourceDir = Paths.get(sourceDirPath);
-//            Files.walk(sourceDir)
-//                    .filter(path -> !Files.isDirectory(path))
-//                    .forEach(path -> {
-//                        ZipEntry zipEntry = new ZipEntry(sourceDir.relativize(path).toString());
-//                        try {
-//                            zipOut.putNextEntry(zipEntry);
-//                            Files.copy(path, zipOut);
-//                            zipOut.closeEntry();
-//                        } catch (IOException e) {
-//                            e.printStackTrace();
-//                        }
-//                    });
-//        }
-//    }
-//
-//    // 鍒犻櫎鏂囦欢澶瑰強鍏跺唴瀹�
-//    public static void deleteDirectory(File directory) throws IOException {
-//        if (directory.isDirectory()) {
-//            File[] files = directory.listFiles();
-//            if (files != null) {
-//                for (File file : files) {
-//                    deleteDirectory(file);
-//                }
-//            }
-//        }
-//        Files.delete(directory.toPath());
-//    }
-//
-//    @Override
-//    public void wordToPdf(String path, String sealUrl, boolean isRawMater) {
-//        try {
-//            wordToPdf(path, path.replace(".docx", ".pdf"), sealUrl, isRawMater);
-//        } catch (Exception e) {
-//            throw new ErrorException("杞崲澶辫触");
-//        }
-//    }
-//
-//
-//    public String wordToPdf(String wordPath, String pdfPath, String sealUrl, boolean isRawMater) {
-//        FileOutputStream os = null;
-//        try {
-//            //鍑瘉 涓嶇劧鍒囨崲鍚庢湁姘村嵃
-////            InputStream is = this.getClass().getResourceAsStream("/lib/license.xml");
-////            InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("license.xml");
-//            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;
-//            //鍒ゆ柇鏄惁鏄繘鍘傛姤鍛�
-//            if (!isRawMater) {
-//                file = new File(pdfPath.replace(".pdf", "-1.pdf"));
-//            } else {
-//                file = new File(pdfPath.replace(".pdf", ".pdf"));
-//            }
-//            os = new FileOutputStream(file);
-//            //瑕佽浆鎹㈢殑word鏂囦欢
-//            com.aspose.words.Document doc = new com.aspose.words.Document(wordPath);
-//            doc.save(os, SaveFormat.PDF);
-//
-//            //娣诲姞楠戠紳绔�
-//            if (!isRawMater) {
-//                stamperCheckMarkPDF(pdfPath.replace(".pdf", "-1.pdf"), pdfPath, imgUrl + "/" + sealUrl);
-//            }
-//
-//
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//        } finally {
-//            if (os != null) {
-//                try {
-//                    os.close();
-//                } catch (IOException e) {
-//                    e.printStackTrace();
-//                }
-//            }
-//        }
-//        return null;
-//    }
-//
-//    /**
-//     * 鍒囧壊鍥剧墖
-//     *
-//     * @param Path 鍥剧墖璺緞
-//     * @param n    鍒囧壊浠芥暟
-//     */
-//    public static com.itextpdf.text.Image[] slicingImages(String Path, int n) throws IOException, BadElementException {
-//        com.itextpdf.text.Image[] nImage = new com.itextpdf.text.Image[n];
-//        BufferedImage img = ImageIO.read(new File(Path));
-//
-//        int h = img.getHeight();
-//        int w = img.getWidth();
-//
-//        int sw = w / n;
-//        for (int i = 0; i < n; i++) {
-//            BufferedImage subImg;
-//            if (i == n - 1) {//鏈�鍚庡墿浣欓儴鍒�
-//                subImg = img.getSubimage(i * sw, 0, w - i * sw, h);
-//            } else {//鍓峮-1鍧楀潎鍖�鍒�
-//                subImg = img.getSubimage(i * sw, 0, sw, h);
-//            }
-//            ByteArrayOutputStream out = new ByteArrayOutputStream();
-//            ImageIO.write(subImg, Path.substring(Path.lastIndexOf('.') + 1), out);
-//            nImage[i] = com.itextpdf.text.Image.getInstance(out.toByteArray());
-//
-//        }
-//        return nImage;
-//    }
-//
-//    /**
-//     * 鐩栭獞缂濈珷
-//     *
-//     * @param infilePath  鍘烶DF璺緞
-//     * @param outFilePath 杈撳嚭PDF璺緞
-//     */
-//    public static void stamperCheckMarkPDF(String infilePath, String outFilePath, String picPath) throws IOException, DocumentException {
-//        PdfReader reader = new PdfReader(infilePath);//閫夋嫨闇�瑕佸嵃绔犵殑pdf
-//        PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(outFilePath));//鍔犲畬鍗扮珷鍚庣殑pdf
-//
-//
-//        com.itextpdf.text.Rectangle pageSize = reader.getPageSize(1);//鑾峰緱绗竴椤�
-//        float height = pageSize.getHeight();
-//        float width = pageSize.getWidth();
-//
-//        int nums = reader.getNumberOfPages();
-//        com.itextpdf.text.Image[] nImage = slicingImages(picPath, nums);//鐢熸垚楠戠紳绔犲垏鍓插浘鐗�
-//
-//        for (int n = 1; n <= nums; n++) {
-//            PdfContentByte over = stamp.getOverContent(n);//璁剧疆鍦ㄧ鍑犻〉鎵撳嵃鍗扮珷
-//            com.itextpdf.text.Image img = nImage[n - 1];//閫夋嫨鍥剧墖
-//            float newHeight = 100f;
-//            float newWidth = img.getWidth() / (img.getHeight() / 100);
-//            img.scaleAbsolute(newWidth, newHeight);//鎺у埗鍥剧墖澶у皬
-//            img.setAbsolutePosition(width - newWidth, height / 2 - newHeight / 2);//鎺у埗鍥剧墖浣嶇疆
-//            over.addImage(img);
-//        }
-//        stamp.close();
-//    }
-//
-//    @Transactional(rollbackFor = Exception.class)
-//    public void isRawMaterial(InsOrder insOrder) {
-//        IfsInventoryQuantity one = ifsInventoryQuantityMapper.selectOne(new LambdaQueryWrapper<IfsInventoryQuantity>()
-//                .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId()));
-//        if (Objects.isNull(one)) {
-//            throw new ErrorException("鎵句笉鍒板師鏉愭枡淇℃伅");
-//        }
-//        // 鍒ゆ柇鏄惁鏈変笉鍚堟牸淇℃伅
-//        Long count = insUnqualifiedHandlerMapper.selectCount(Wrappers.<InsUnqualifiedHandler>lambdaQuery()
-//                .eq(InsUnqualifiedHandler::getInventoryQuantityId, one.getId()));
-//        String toLocation = null;
-//
-//        // 鍒ゆ柇鏄惁鏈変笉鍚堟牸
-//        Long unqualifiedCount = getUnqualifiedCount(insOrder);
-//
-//        if (count.equals(0L) && unqualifiedCount.equals(0L) && one.getIsFinish().equals(0) && one.getIsSource().equals(1)) {
-//            // 鍘熸潗鏂欑Щ搴�
-//            toLocation = this.moveRawMaterial(one);
-//        }
-//
-//        // 鍒ゆ柇缁撴潫鐘舵�佷慨鏀瑰悎鏍肩姸鎬�
-//        int inspectStatus = (count == 0 && unqualifiedCount == 0) ? 1 : 2;
-//        insOrderMapper.update(null, Wrappers.<InsOrder>lambdaUpdate()
-//                .eq(InsOrder::getId, insOrder.getId())
-//                .set(InsOrder::getInsResult, inspectStatus));
-//
-//        if (one.getIsFinish().equals(0)) {
-//            ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
-//                    .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId())
-//                    .set(IfsInventoryQuantity::getInspectStatus, inspectStatus));
-//
-//            // 淇敼ifs搴撳瓨鐘舵��
-//            if (StringUtils.isBlank(toLocation)) {
-//                ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
-//                        .set(IfsInventoryQuantity::getIsFinish, 1)
-//                        .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId()));
-//            } else {
-//                ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
-//                        .set(IfsInventoryQuantity::getIsFinish, 1)
-//                        .set(IfsInventoryQuantity::getToLocation, toLocation)
-//                        .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId()));
-//            }
-//
-//            threadPoolTaskExecutor.execute(() -> {
-//                // 浼佷笟寰俊閫氱煡
-//                String message = "";
-//                message += "妫�娴嬬粨鏋滄彁浜ら�氱煡";
-//                message += "\n鎵规鍙�: " + one.getUpdateBatchNo();
-//                message += "\n闆朵欢鍙�: " + one.getPartNo();
-//                message += "\n闆朵欢鎻忚堪: " + one.getPartDesc();
-//                message += "\n渚涘簲鍟嗗悕绉�: " + one.getSupplierName();
-//                message += "\n鎶佃揪鏁伴噺: " + one.getQtyArrived().stripTrailingZeros().toPlainString() + one.getBuyUnitMeas();
-//                // 鍙戦�佷紒涓歩nspectStatus淇¢�氱煡
-//                if (inspectStatus == 1) {
-//                    message += "\n妫�娴嬬粨鏋�: 鍚堟牸";
-//                } else {
-//                    message += "\n妫�娴嬬粨鏋�: 涓嶅悎鏍�";
-//                }
-//                WxCpUtils.informWebHook(wechatProperty.getExaminingUrl(), message);
-//            });
-//
-//        }
-//
-//
-//    }
-//
-//    /**
-//     * 鍒ゆ柇鏄惁鏈変笉鍚堟牸
-//     * @param insOrder
-//     * @return
-//     */
-//    @Override
-//    public Long getUnqualifiedCount(InsOrder insOrder) {
-//        Long unqualifiedCount = 0L;
-//        List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
-//                .eq(InsSample::getInsOrderId, insOrder.getId()));
-//        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> insProducts = 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 : insProducts) {
-//                    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;
-//                }
-//            }
-//        }
-//        return unqualifiedCount;
-//    }
-//
-//    /**
-//     * ifs绉诲簱鎿嶄綔
-//     * @param one
-//     * @return
-//     */
-//    @Override
-//    public String moveRawMaterial(IfsInventoryQuantity one) {
-//        String toLocation;
-//        // 鐧昏閲囪喘妫�楠岀粨鏋淪TD
-//        if (one.getIsRegister().equals(0)) {
-//            Map<String, Object> resultMap = new HashMap<>();
-//            List<Map<String, Object>> resultList = new ArrayList<>();
-//            Map<String, Object> map = new HashMap<>();
-//            map.put("ORDER_NO", one.getOrderNo()); // 閲囪喘璁㈠崟鍙�
-//            map.put("LINE_NO", one.getLineNo()); // 琛屽彿
-//            map.put("RELEASE_NO", one.getReleaseNo()); // 涓嬭揪鍙�
-//            map.put("RECEIPT_NO", one.getReceiptNo()); // 鎺ユ敹鍙�
-//            map.put("PURCH_QTY", one.getQtyToInspect()); // 瑕佹楠岀殑閲囪喘鏁伴噺
-//            resultList.add(map);
-//            resultMap.put("RECORD_ID", UUID.randomUUID().toString());
-//            resultMap.put("SYSCODE", "LIMS");
-//            resultMap.put("SYSMODEL", "鐧昏閲囪喘妫�楠岀粨鏋�");
-//            resultMap.put("BATCH_INFO", resultList);
-//            Result result = ifsApiUtils.getProcurementResults(JSONUtil.toJsonStr(resultMap));
-//            if (result.getCode() != 200) {
-//                throw new ErrorException("IFS鐧昏閲囪喘妫�楠岀粨鏋滃け璐�: " + result.getMessage());
-//            }
-//        }
-//        insOrderService.updateIfsInventoryQuantity(one.getId());
-//        /**
-//         * TODO 鍚庣画闇�瑕佽皟鐢↖FS鐨勬帴鍙� 绉诲叆鐨勫簱浣嶅彿 toLocation
-//         */
-//        // 妫�楠屽悗绉诲簱
-//        toLocation = "1301";
-//        Map<String, Object> moveResultMap = new HashMap<>();
-//        List<Map<String, Object>> moveResultList = new ArrayList<>();
-//        Map<String, Object> moveMap = new HashMap<>();
-//        moveMap.put("ORDER_NO", one.getOrderNo()); // 閲囪喘璁㈠崟鍙�
-//        moveMap.put("LINE_NO", one.getLineNo());
-//        moveMap.put("RELEASE_NO", one.getReleaseNo());
-//        moveMap.put("RECEIPT_NO", one.getReceiptNo());
-//        moveMap.put("PART_NO", one.getPartNo());
-//        moveMap.put("QTY", one.getQtyArrived());
-//        moveMap.put("LOCATION_NO", one.getLocationNo());
-//        moveMap.put("TO_LOCATION_NO", toLocation);
-//        moveMap.put("LOT_BATCH_NO", one.getLotBatchNo());
-//        moveMap.put("SERIAL_NO", one.getSerialNo());
-//        moveMap.put("WAIV_DEV_REJ_NO", one.getWaivDevRejNo());
-//        moveMap.put("ENG_CHG_LEVEL", one.getEngChgLevel());
-//        moveMap.put("ACTIVITY_SEQ", one.getActivitySeq());
-//        moveResultList.add(moveMap);
-//        moveResultMap.put("RECORD_ID", UUID.randomUUID().toString());
-//        moveResultMap.put("SYSCODE", "LIMS");
-//        moveResultMap.put("SYSMODEL", "妫�楠屽悗绉诲簱");
-//        moveResultMap.put("BATCH_INFO", moveResultList);
-//
-//        Result result1 = ifsApiUtils.moveReceipt(JSONUtil.toJsonStr(moveResultMap));
-//        // 濡傛灉鏈夊繀椤讳负闆朵欢鎸囧畾鎵瑰彿鎶ラ敊闇�瑕侀噸鏂版彁浜ょЩ搴撲俊鎭幓鎸囧畾鎵瑰彿
-//        if (result1.getCode() != 200) {
-//            String message = result1.getMessage();
-//            if (message.contains("蹇呴』涓洪浂浠�") && message.contains("鎸囧畾鎵瑰彿")) {
-//                updaeBatch(one, toLocation);
-//            } else {
-//                throw new ErrorException("IFS妫�楠屽悗绉诲簱澶辫触: " + result1.getMessage());
-//            }
-//        }
-//        return toLocation;
-//    }
-//
-//    /**
-//     * 閫�鍥炲埌妫�楠屼换鍔�
-//     * @param id
-//     * @return
-//     */
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public boolean sendBackTask(Integer id) {
-//        InsReport report = insReportMapper.selectById(id);
-//        // 鏍规嵁璁㈠崟鏌ヨ璇曢獙瀹�
-//        String laboratory = insOrderMapper.selectLaboratoryByOrderId(report.getInsOrderId());
-//
-//        // 淇敼璁㈠崟鐘舵��
-//        insOrderStateMapper.update(null, Wrappers.<InsOrderState>lambdaUpdate()
-//                .eq(InsOrderState::getInsOrderId, report.getInsOrderId())
-//                .eq(InsOrderState::getLaboratory, laboratory)
-//                .set(InsOrderState::getInsState, 4));
-//
-//        Integer insSampleId = insSampleUserMapper.selectOne(Wrappers.<InsSampleUser>lambdaQuery()
-//                .eq(InsSampleUser::getInsSampleId, report.getInsOrderId())
-//                .orderByDesc(InsSampleUser::getId)
-//                .last("limit 1")).getId();
-//        insSampleUserMapper.deleteById(insSampleId);
-//
-//        // 淇敼鎶ュ憡琛屼负鏈樉绀�
-//        insReportMapper.update(null, Wrappers.<InsReport>lambdaUpdate()
-//                .eq(InsReport::getId, id)
-//                .set(InsReport::getIsPass, 0));
-//
-//        return false;
-//    }
-//
-//
-//    /**
-//     * 鍏堜慨鏀归噰璐鍗曟壒娆″彿, 鍚庤繘琛岀Щ搴撴搷浣�
-//     * @param one
-//     * @param toLocation
-//     */
-//    private void updaeBatch(IfsInventoryQuantity one, String toLocation) {
-//        if (one.getIsUpdateBatch().equals(0)) {
-//            // 鍏堜慨鏀规壒娆″彿鍚庤繘琛岀Щ搴�
-//            Map<String, Object> resultMap = new HashMap<>();
-//            List<Map<String, Object>> resultList = new ArrayList<>();
-//            Map<String, Object> map = new HashMap<>();
-//            map.put("ORDER_NO", one.getOrderNo()); // 閲囪喘璁㈠崟鍙�
-//            map.put("LINE_NO", one.getLineNo()); // 琛屽彿
-//            map.put("RELEASE_NO", one.getReleaseNo()); // 涓嬭揪鍙�
-//            map.put("RECEIPT_NO", one.getReceiptNo()); // 鎺ユ敹鍙�
-//            map.put("PART_NO", one.getPartNo()); //闆朵欢鍙�
-//            map.put("CONFIGURATION_ID", one.getConfigurationId()); // 閰嶇疆鏍囪瘑
-//            map.put("LOCATION_NO", one.getLocationNo()); // 搴撲綅鍙�
-//            map.put("LOT_BATCH_NO", one.getLotBatchNo());// 鎵规鍙�
-//            map.put("NEW_LOT_BATCH_NO", one.getUpdateBatchNo()); // 鐩爣鎵规鍙�
-//            map.put("SERIAL_NO", one.getSerialNo()); // 搴忓垪鍙�
-//            map.put("ENG_CHG_LEVEL", one.getEngChgLevel()); // 鐗堟湰鍙�
-//            map.put("WAIV_DEV_REJ_NO", one.getWaivDevRejNo()); // wdr鍙�
-//            map.put("ACTIVITY_SEQ", one.getActivitySeq()); // 娲诲姩搴忓彿
-//            map.put("QTY_TO_CHANGE", one.getQtyArrived()); // 鍙樻洿鏁伴噺
-//            resultList.add(map);
-//            resultMap.put("RECORD_ID", UUID.randomUUID().toString());
-//            resultMap.put("SYSCODE", "LIMS");
-//            resultMap.put("SYSMODEL", "淇敼閲囪喘璁㈠崟鎵规鍙�");
-//            resultMap.put("BATCH_INFO", resultList);
-//
-//            Result result = ifsApiUtils.updateMoveReceiptLot(JSONUtil.toJsonStr(resultMap));
-//
-//            if (result.getCode() != 200) {
-//                throw new ErrorException("IFS淇敼鎵规鍙峰け璐�: " + result.getMessage());
-//            }
-//            ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
-//                    .set(IfsInventoryQuantity::getIsUpdateBatch, 1)
-//                    .eq(IfsInventoryQuantity::getId, one.getId()));
-//        }
-//
-//        Map<String, Object> moveResultMap = new HashMap<>();
-//        List<Map<String, Object>> moveResultList = new ArrayList<>();
-//        Map<String, Object> moveMap = new HashMap<>();
-//        moveMap.put("ORDER_NO", one.getOrderNo()); // 閲囪喘璁㈠崟鍙�
-//        moveMap.put("LINE_NO", one.getLineNo());
-//        moveMap.put("RELEASE_NO", one.getReleaseNo());
-//        moveMap.put("RECEIPT_NO", one.getReceiptNo());
-//        moveMap.put("PART_NO", one.getPartNo());
-//        moveMap.put("QTY", one.getQtyArrived());
-//        moveMap.put("LOCATION_NO", one.getLocationNo());
-//        moveMap.put("TO_LOCATION_NO", toLocation);
-//        moveMap.put("LOT_BATCH_NO", one.getUpdateBatchNo());
-//        moveMap.put("SERIAL_NO", one.getSerialNo());
-//        moveMap.put("WAIV_DEV_REJ_NO", one.getWaivDevRejNo());
-//        moveMap.put("ENG_CHG_LEVEL", one.getEngChgLevel());
-//        moveMap.put("ACTIVITY_SEQ", one.getActivitySeq());
-//        moveResultList.add(moveMap);
-//        moveResultMap.put("RECORD_ID", UUID.randomUUID().toString());
-//        moveResultMap.put("SYSCODE", "LIMS");
-//        moveResultMap.put("SYSMODEL", "妫�楠屽悗绉诲簱");
-//        moveResultMap.put("BATCH_INFO", moveResultList);
-//
-//        Result result1 = ifsApiUtils.moveReceipt(JSONUtil.toJsonStr(moveResultMap));
-//        if (result1.getCode() != 200) {
-//            throw new ErrorException("IFS妫�楠屽悗绉诲簱澶辫触: " + result1.getMessage());
-//        }
-//
-//    }
-//
-//    /**
-//     * 鏇挎崲娈佃惤鏂囨湰
-//     * @param filePath docx瑙f瀽瀵硅薄
-//     * @param textMap 闇�瑕佹浛鎹㈢殑淇℃伅闆嗗悎
-//     */
-//    public static void changeText(Map<String, String> textMap, String filePath) {
-//        try {
-//            FileInputStream stream = new FileInputStream(filePath);
-//            XWPFDocument document = new XWPFDocument(stream);
-//            List<XWPFTable> tables = document.getTables();
-//            for (XWPFTable table : tables) {
-//                for (XWPFTableRow row : table.getRows()) {
-//                    for (XWPFTableCell cell : row.getTableCells()) {
-//
-//                        textMap.forEach((s, s2) -> {
-//                            if (cell.getText().equals(s)) {
-//                                XWPFParagraph paragraph = cell.getParagraphs().get(0);
-//                                XWPFRun oldRun = paragraph.getRuns().get(0);
-//                                // 淇濆瓨鍘熸牱寮�
-//                                String fontFamily = oldRun.getFontFamily();
-//                                int fontSize = oldRun.getFontSize();
-//                                String color = oldRun.getColor();
-//                                ParagraphAlignment alignment = paragraph.getAlignment();
-//                                // 鏇挎崲鍐呭
-//                                paragraph.removeRun(0); // 绉婚櫎鍘熸湁鐨� run
-//                                XWPFRun newRun = paragraph.createRun();
-//                                newRun.setText(s2);
-//                                // 搴旂敤鍘熸牱寮�
-//                                newRun.setFontFamily(fontFamily);
-//                                newRun.setFontSize(fontSize);
-//                                newRun.setColor(color);
-//                                paragraph.setAlignment(alignment);
-//                            }
-//                        });
-//                    }
-//                }
-//            }
-//            FileOutputStream fileOutputStream = new FileOutputStream(filePath);
-//            document.write(fileOutputStream);
-//            fileOutputStream.close();
-//
-//        } catch (Exception e) {
-//            e.printStackTrace();
-//            throw new ErrorException(e.getMessage());
-//        }
-//    }
-//
-//    /**
-//     * word杞崲pdf
-//     * @param path
-//     * @return
-//     */
-//    private 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;
-//    }
-//}
-//
-//
-//
-//
-//
-//
+package com.ruoyi.inspect.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
+import com.aspose.words.License;
+import com.aspose.words.SaveFormat;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.data.Pictures;
+import com.itextpdf.text.BadElementException;
+import com.itextpdf.text.DocumentException;
+import com.itextpdf.text.pdf.PdfContentByte;
+import com.itextpdf.text.pdf.PdfReader;
+import com.itextpdf.text.pdf.PdfStamper;
+import com.ruoyi.basic.mapper.IfsInventoryQuantityMapper;
+import com.ruoyi.basic.pojo.IfsInventoryQuantity;
+import com.ruoyi.common.constant.InsOrderTypeConstants;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.core.domain.entity.InformationNotification;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.properties.WechatProperty;
+import com.ruoyi.common.utils.*;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.inspect.dto.ReportPageDto;
+import com.ruoyi.inspect.mapper.*;
+import com.ruoyi.inspect.pojo.*;
+import com.ruoyi.inspect.service.InsOrderService;
+import com.ruoyi.inspect.service.InsReportService;
+import com.ruoyi.inspect.mapper.InsUnqualifiedHandlerMapper;
+import com.ruoyi.system.mapper.UserMapper;
+import com.ruoyi.system.service.InformationNotificationService;
+import org.apache.poi.xwpf.usermodel.*;
+import org.springframework.beans.factory.annotation.Value;
+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 javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipOutputStream;
+
+/**
+ * @author Administrator
+ * @description 閽堝琛ㄣ�恑ns_report(妫�楠屾姤鍛�)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+ * @createDate 2024-03-17 22:10:02
+ */
+@Service
+public class InsReportServiceImpl extends ServiceImpl<InsReportMapper, InsReport>
+        implements InsReportService {
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private InsReportMapper insReportMapper;
+    @Resource
+    private InsOrderStateMapper insOrderStateMapper;
+    @Resource
+    private InsProductMapper insProductMapper;
+    @Resource
+    private InformationNotificationService informationNotificationService;
+    @Value("${wordUrl}")
+    private String wordUrl;
+    @Value("${file.path}")
+    private String imgUrl;
+    @Value("${file.licenseUrl}")
+    private String licenseUrl;
+    @Resource
+    private InsOrderMapper insOrderMapper;
+    @Resource
+    private IfsInventoryQuantityMapper ifsInventoryQuantityMapper;
+    @Resource
+    private InsUnqualifiedHandlerMapper insUnqualifiedHandlerMapper;
+    @Resource
+    private InsSampleMapper insSampleMapper;
+    @Resource
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+    @Resource
+    private InsOrderService insOrderService;
+    @Resource
+    private WechatProperty wechatProperty;
+    @Resource
+    private InsUnqualifiedRetestProductMapper insUnqualifiedRetestProductMapper;
+    @Resource
+    private IfsApiUtils ifsApiUtils;
+    @Resource
+    private InsSampleUserMapper insSampleUserMapper;
+
+
+    @Override
+    public Map<String, Object> pageInsReport(Page page, ReportPageDto reportPageDto) {
+        Map<String, Object> map = new HashMap<>();
+        // todo: 浠呯湅鑷繁
+        //鑾峰彇褰撳墠浜烘墍灞炲疄楠屽id
+        String laboratory = null;
+        Integer createOrderUser = null;
+        String queryStatus = reportPageDto.getQueryStatus();
+        reportPageDto.setQueryStatus(null);
+
+        map.put("body", insReportMapper.pageInsReport(page,
+                QueryWrappers.queryWrappers(reportPageDto),
+                laboratory,
+                SecurityUtils.getUserId().intValue(),
+                queryStatus,
+                createOrderUser));
+        return map;
+    }
+
+    @Override
+    public int inReport(String url, Integer id) {
+        InsReport insReport = new InsReport();
+        insReport.setId(id);
+        insReport.setUrlS(url);
+        // 杩樺師pdf
+        String tempUrlPdf = wordToPdfTemp(insReport.getUrlS().replace("/word", wordUrl));
+        insReport.setTempUrlPdf("/word/" + tempUrlPdf);
+        return insReportMapper.updateById(insReport);
+    }
+
+    @Override
+    public int upReportUrl(Integer id) {
+        InsReport report = insReportMapper.selectById(id);
+        // 杩樺師pdf
+        String tempUrlPdf = wordToPdfTemp(report.getUrl().replace("/word", wordUrl));
+
+        return insReportMapper.update(null, Wrappers.<InsReport>lambdaUpdate()
+                .eq(InsReport::getId, id)
+                .set(InsReport::getUrlS, null)
+                .set(InsReport::getTempUrlPdf, "/word/" + tempUrlPdf));
+    }
+
+    //鎻愪氦
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int writeReport(Integer id, Integer userId, Integer submitUserId) {
+        submitUserId = submitUserId == null ? SecurityUtils.getUserId().intValue() : submitUserId;
+        InsReport insReport = insReportMapper.selectById(id);
+        insReport.setId(id);
+        insReport.setState(1);
+        insReport.setWriteUserId(submitUserId);//鎻愪氦浜�
+        if (userId == null) {
+            throw new ErrorException("缂哄皯瀹℃牳浜�");
+        }
+        insReport.setExamineUserId(userId);//瀹℃牳浜�
+        insReport.setWriteTime(LocalDateTime.now());//鎻愪氦鏃堕棿
+        //鑾峰彇鎻愪氦浜虹殑绛惧悕鍦板潃
+        String signatureUrl;
+        try {
+            signatureUrl = userMapper.selectById(insReport.getWriteUserId()).getSignatureUrl();
+        } catch (Exception e) {
+            throw new ErrorException("鎵句笉鍒扮紪鍒朵汉鐨勭鍚�");
+        }
+        if (ObjectUtils.isEmpty(signatureUrl) || signatureUrl.equals("")) {
+            throw new ErrorException("鎵句笉鍒版楠屼汉鐨勭鍚�");
+        }
+
+        Integer insOrderId = insReportMapper.selectById(id).getInsOrderId();
+        InsOrder order = insOrderMapper.selectById(insOrderId);
+        boolean isRawMater = order.getTypeSource() != null && order.getTypeSource().equals(1);
+
+        //鍙戦�佹秷鎭�
+        InformationNotification info = new InformationNotification();
+        info.setCreateUser(insProductMapper.selectUserById(userId).get("name"));
+        info.setMessageType("3");
+        info.setTheme("瀹℃牳閫氱煡");
+        info.setContent("鎮ㄦ湁涓�鏉℃姤鍛婄紪鍒跺緟瀹℃牳娑堟伅, 缂栧彿:" + insReport.getCode());
+        info.setSenderId(submitUserId);    //鍙戦�佷汉
+        info.setConsigneeId(userId);     //鏀朵欢浜�
+        info.setViewStatus(false);
+        info.setJumpPath("b1-report-preparation");
+        informationNotificationService.addInformationNotification(info);
+        //绯荤粺鐢熸垚鎶ュ憡鍦板潃
+        String url = insReport.getUrl();
+        //鎵嬪姩涓婁紶鎶ュ憡鍦板潃
+        String urlS = insReport.getUrlS();
+
+        // 鍒ゆ柇鏄惁鏄師鏉愭枡  闇�瑕佹浛鎹�****鎴愪緵搴斿晢
+        IfsInventoryQuantity one = ifsInventoryQuantityMapper.selectOne(new LambdaQueryWrapper<IfsInventoryQuantity>()
+                .eq(IfsInventoryQuantity::getId, order.getIfsInventoryId()));
+        if (one != null) {
+            if (isRawMater && order.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY)) {
+                changeText(new HashMap<String, String>() {{
+                    put("**********", one.getSupplierName());
+                }}, (StrUtil.isBlank(urlS) ? url : urlS).replace("/word", wordUrl));
+            }
+        }
+
+        wordInsertUrl(new HashMap<String, Object>() {{
+            put("writeUrl", Pictures.ofLocal(imgUrl + "/" + signatureUrl).create());
+            put("writeDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(null)).create());
+            put("insUrl", Pictures.ofLocal(imgUrl + "/" + signatureUrl).create());
+        }}, (StrUtil.isBlank(urlS) ? url : urlS).replace("/word", wordUrl));
+
+        // 淇敼涓存椂pdf
+        String tempUrlPdf = wordToPdfTemp((StrUtil.isBlank(urlS) ? url : urlS).replace("/word", wordUrl));
+        insReport.setTempUrlPdf("/word/" + tempUrlPdf);
+
+        insReportMapper.updateById(insReport);
+
+        // 娓呯┖瀹℃牳鏃堕棿, 瀹℃牳鐘舵��
+        insReportMapper.update(null, Wrappers.<InsReport>lambdaUpdate()
+                .eq(InsReport::getId, insReport.getId())
+                .set(InsReport::getRatifyTime, null)
+                .set(InsReport::getIsRatify, null)
+                .set(InsReport::getExamineTime, null)
+                .set(InsReport::getIsExamine, null));
+
+        return 1;
+    }
+
+    //瀹℃牳
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int examineReport(Integer id, Integer isExamine, String examineTell, Integer userId) {
+        InsReport insReport = insReportMapper.selectById(id);
+        insReport.setIsExamine(isExamine);
+        if (ObjectUtils.isNotEmpty(examineTell)) {
+            insReport.setExamineTell(examineTell);
+        }
+
+        // 妫�楠屼汉
+        String userName = insProductMapper.selectUserById(insReport.getWriteUserId()).get("name");
+        String userAccount = insProductMapper.selectUserById(insReport.getWriteUserId()).get("account");
+
+        // 瀹℃牳浜�
+        Integer checkUserId = SecurityUtils.getUserId().intValue();
+        String checkUserName = insProductMapper.selectUserById(checkUserId).get("name");
+
+        insReport.setExamineTime(LocalDateTime.now());//瀹℃牳鏃堕棿
+        if (isExamine == 0) {
+            // 鍙戦�佷紒涓氬井淇¢�氱煡(瀹℃牳閫�鍥�)
+            threadPoolTaskExecutor.execute(() -> {
+                // 鏌ヨ璁㈠崟
+                InsOrder order = insOrderMapper.selectById(insReport.getInsOrderId());
+                InsSample insSample = insSampleMapper.selectOne(Wrappers.<InsSample>lambdaQuery()
+                        .eq(InsSample::getInsOrderId, insReport.getInsOrderId())
+                        .last("limit 1"));
+                // 鏌ヨ鍘熸潗鏂�
+                IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(order.getIfsInventoryId());
+
+                String message = "";
+                message += "鎶ュ憡缂栧埗瀹℃牳閫�鍥為�氱煡";
+                message += "\n瀹℃牳浜�: " + checkUserName;
+                message += "\n濮旀墭缂栧彿: " + order.getEntrustCode();
+                message += "\n鏍峰搧鍚嶇О: " + insSample.getModel();
+                message += "\n瑙勬牸鍨嬪彿: " + order.getPartDetail();
+                if (ifsInventoryQuantity != null) {
+                    message += "\n鎵规鍙�: " + ifsInventoryQuantity.getUpdateBatchNo();
+                }
+                message += "\n閫�鍥炲師鍥�: " + examineTell;
+                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡  鎻愪氦澶嶆牳
+                try {
+                    WxCpUtils.inform(userAccount, message, null);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            });
+
+            //濡傛灉瀹℃牳涓嶉�氳繃
+            insReport.setState(0);//鎻愪氦鐘舵�佹敼涓哄緟鎻愪氦
+            return insReportMapper.updateById(insReport);
+        } else {
+            if (userId == null) {
+                throw new ErrorException("缂哄皯鎵瑰噯浜�");
+            }
+        }
+        insReport.setRatifyUserId(userId);//鎵瑰噯浜�
+        //鑾峰彇瀹℃牳浜虹殑绛惧悕鍦板潃
+        String signatureUrl;
+        try {
+            signatureUrl = userMapper.selectById(insReport.getExamineUserId()).getSignatureUrl();
+        } catch (Exception e) {
+            throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+        }
+        if (StringUtils.isBlank(signatureUrl)) {
+            throw new ErrorException("鎵句笉鍒板鏍镐汉鐨勭鍚�");
+        }
+
+        // 鎵瑰噯浜�
+        String sendUserAccount = insProductMapper.selectUserById(userId).get("account");
+
+        //鍙戦�佹秷鎭�
+        InformationNotification info = new InformationNotification();
+        info.setCreateUser(insProductMapper.selectUserById(userId).get("name"));
+        info.setMessageType("3");
+        info.setTheme("鎵瑰噯閫氱煡");
+        info.setContent("鎮ㄦ湁涓�鏉℃姤鍛婄紪鍒跺緟鎵瑰噯娑堟伅, 缂栧彿:" + insReport.getCode());
+        info.setSenderId(checkUserId);    //鍙戦�佷汉
+        info.setConsigneeId(userId);     //鏀朵欢浜�
+        info.setViewStatus(false);
+        info.setJumpPath("b1-report-preparation");
+        informationNotificationService.addInformationNotification(info);
+        //绯荤粺鐢熸垚鎶ュ憡鍦板潃
+        String url = insReport.getUrl();
+        //鎵嬪姩涓婁紶鎶ュ憡鍦板潃
+        String urlS = insReport.getUrlS();
+        wordInsertUrl(new HashMap<String, Object>() {{
+            put("examineUrl", Pictures.ofLocal(imgUrl + "/" + signatureUrl).create());
+            put("examineDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(null)).create());
+        }}, (StrUtil.isBlank(urlS) ? url : urlS).replace("/word", wordUrl));
+
+        // 淇敼涓存椂pdf
+        String tempUrlPdf = wordToPdfTemp((StrUtil.isBlank(urlS) ? url : urlS).replace("/word", wordUrl));
+        insReport.setTempUrlPdf("/word/" + tempUrlPdf);
+
+        // 鍙戦�佷紒涓氬井淇¢�氱煡(閫氱煡鎵瑰噯浜哄鎵�)
+        threadPoolTaskExecutor.execute(() -> {
+            // 鏌ヨ璁㈠崟
+            InsOrder order = insOrderMapper.selectById(insReport.getInsOrderId());
+            InsSample insSample = insSampleMapper.selectOne(Wrappers.<InsSample>lambdaQuery()
+                    .eq(InsSample::getInsOrderId, insReport.getInsOrderId())
+                    .last("limit 1"));
+            // 鏌ヨ鍘熸潗鏂�
+            IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(order.getIfsInventoryId());
+
+            String message = "";
+            message += "鎶ュ憡缂栧埗鎵瑰噯閫氱煡";
+            message += "\n妫�楠屼汉: " + userName;
+            message += "\n澶嶆牳浜�: " + checkUserName;
+            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);
+            }
+        });
+        insReportMapper.updateById(insReport);
+
+        // 娓呯┖鎵瑰噯澶囨敞, 鎵瑰噯鏃堕棿, 鎵瑰噯鐘舵��
+        insReportMapper.update(null, Wrappers.<InsReport>lambdaUpdate()
+                .eq(InsReport::getId, insReport.getId())
+                .set(InsReport::getExamineTell, null)
+                .set(InsReport::getRatifyTime, null)
+                .set(InsReport::getIsRatify, null));
+        return 1;
+    }
+
+    //鎵瑰噯
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int ratifyReport(Integer id, Integer isRatify, String ratifyTell) {
+        InsReport insReport = insReportMapper.selectById(id);
+        insReport.setIsRatify(isRatify);
+        if (ObjectUtils.isNotEmpty(ratifyTell)) {
+            insReport.setRatifyTell(ratifyTell);
+        }
+        insReport.setRatifyTime(LocalDateTime.now());//鎵瑰噯鏃堕棿
+        if (isRatify == 0) {
+
+            // 鎵瑰噯浜�
+            Integer ratifyUserId = SecurityUtils.getUserId().intValue();
+            String ratifyUserName = insProductMapper.selectUserById(ratifyUserId).get("name");
+
+            // 鍙戦�佷汉(瀹℃牳浜�)(妫�楠屼汉)
+            // 妫�楠屼汉
+            String userAccount = insProductMapper.selectUserById(insReport.getWriteUserId()).get("account");
+            // 瀹℃牳浜�
+            String checkUserAccount = insProductMapper.selectUserById(insReport.getExamineUserId()).get("account");
+
+
+            // 鍙戦�佷紒涓氬井淇¢�氱煡(鎵瑰噯閫�鍥�)
+            threadPoolTaskExecutor.execute(() -> {
+                // 鏌ヨ璁㈠崟
+                InsOrder order = insOrderMapper.selectById(insReport.getInsOrderId());
+                InsSample insSample = insSampleMapper.selectOne(Wrappers.<InsSample>lambdaQuery()
+                        .eq(InsSample::getInsOrderId, insReport.getInsOrderId())
+                        .last("limit 1"));
+                // 鏌ヨ鍘熸潗鏂�
+                IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(order.getIfsInventoryId());
+
+                String message = "";
+                message += "鎶ュ憡缂栧埗鎵瑰噯閫�鍥為�氱煡";
+                message += "\n鎵瑰噯浜�: " + ratifyUserName;
+                message += "\n濮旀墭缂栧彿: " + order.getEntrustCode();
+                message += "\n鏍峰搧鍚嶇О: " + insSample.getModel();
+                message += "\n瑙勬牸鍨嬪彿: " + order.getPartDetail();
+                if (ifsInventoryQuantity != null) {
+                    message += "\n鎵规鍙�: " + ifsInventoryQuantity.getUpdateBatchNo();
+                }
+                message += "\n閫�鍥炲師鍥�: " + ratifyTell;
+                //鍙戦�佷紒涓氬井淇℃秷鎭�氱煡  鎻愪氦澶嶆牳
+                try {
+                    // 瀹℃壒浜�
+                    WxCpUtils.inform(checkUserAccount, message, null);
+
+                    // 妫�楠屼汉
+                    WxCpUtils.inform(userAccount, message, null);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            });
+
+            //濡傛灉鎵瑰噯涓嶉�氳繃 鐩存帴閫�鍥炲埌鎻愪氦浜洪偅杈瑰幓
+            insReport.setState(0);
+            insReport.setIsExamine(0);
+            return insReportMapper.updateById(insReport);
+        }
+        //鑾峰彇鎵瑰噯浜虹殑绛惧悕鍦板潃
+        String signatureUrl;
+        try {
+            signatureUrl = userMapper.selectById(insReport.getRatifyUserId()).getSignatureUrl();
+        } catch (Exception e) {
+            throw new ErrorException("鎵句笉鍒版壒鍑嗕汉鐨勭鍚�");
+        }
+        if (StringUtils.isBlank(signatureUrl)) {
+            throw new ErrorException("鎵句笉鍒版壒鍑嗕汉鐨勭鍚�");
+        }
+        Integer insOrderId = insReportMapper.selectById(id).getInsOrderId();
+        InsOrder order = insOrderMapper.selectById(insOrderId);
+        boolean isRawMater = order.getTypeSource() != null && order.getTypeSource().equals(1);
+
+        //鑾峰彇鍦烘墍鐨勬姤鍛婁笓鐢ㄧ珷
+        String sealUrl;
+        String laboratory = insOrderMapper.selectById(insReport.getInsOrderId()).getLaboratory();
+        try {
+            String type = "";
+            if (isRawMater && order.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY)) {
+                type = "杩涘巶鎶ュ憡";
+            } else {
+                type = "濮旀墭鎶ュ憡";
+            }
+            sealUrl = insReportMapper.getLaboratoryByName(laboratory, type);
+        } catch (Exception e) {
+            throw new ErrorException(laboratory + "鎵句笉鍒版姤鍛婁笓鐢ㄧ珷");
+        }
+        if (StringUtils.isBlank(sealUrl)) {
+            throw new ErrorException(laboratory + "鎵句笉鍒版姤鍛婁笓鐢ㄧ珷");
+        }
+        //绯荤粺鐢熸垚鎶ュ憡鍦板潃
+        String url = insReport.getUrl();
+        //鎵嬪姩涓婁紶鎶ュ憡鍦板潃
+        String urlS = insReport.getUrlS();
+        String finalUrl = (StrUtil.isBlank(urlS) ? url : urlS).replace("/word", wordUrl);
+
+        wordInsertUrl(new HashMap<String, Object>() {{
+            put("ratifyUrl", Pictures.ofLocal(imgUrl + "/" + signatureUrl).create());
+            put("ratifyDateUrl", Pictures.ofStream(DateImageUtil.createDateImage(null)).create());
+            put("seal1", Pictures.ofLocal(imgUrl + "/" + sealUrl).create());
+            put("seal2", Pictures.ofLocal(imgUrl + "/" + sealUrl).create());
+        }}, finalUrl);
+
+        // 淇敼涓存椂pdf
+        insReport.setTempUrlPdf((StrUtil.isBlank(urlS) ? url : urlS).replace(".docx", ".pdf"));
+
+        InsOrder insOrder = new InsOrder();
+        insOrder.setId(insOrderId);
+        insOrder.setState(4);
+        insOrderMapper.updateById(insOrder);
+
+        wordToPdf(finalUrl, sealUrl, isRawMater && order.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY));
+
+        // 鍒ゆ柇鏄惁涓哄師鏉愭枡
+        if (isRawMater) {
+            // 淇敼ifs搴撳瓨鐘舵��
+            ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
+                    .set(IfsInventoryQuantity::getState, 2)
+                    .eq(IfsInventoryQuantity::getId, order.getIfsInventoryId()));
+        }
+        insReport.setRatifyTell("");
+
+        // 鍙戦�佹枃浠跺埌濮旀墭浜�
+        if (StringUtils.isNotBlank(order.getPrepareCode())) {
+            threadPoolTaskExecutor.execute(() -> {
+                String message = "";
+                message += "濮旀墭缂栧彿: " + order.getEntrustCode();
+                message += "濮旀墭鏍峰搧: " + order.getSampleView();
+                message += "宸叉娴嬬粨鏉�, 璇锋帴鏀�";
+                try {
+                    WxCpUtils.inform(order.getPrepareCode(), message, new File(finalUrl.replace(".docx", ".pdf")));
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            });
+        }
+
+        return insReportMapper.updateById(insReport);
+    }
+
+    @Override
+    public int wordInsertUrl(Map<String, Object> map, String url) {
+        XWPFTemplate template = XWPFTemplate.compile(url).render(map);
+        try {
+            template.writeAndClose(Files.newOutputStream(Paths.get(url)));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return 1;
+    }
+
+
+    //鎶ュ憡鎵归噺涓嬭浇
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public String downAll(String ids) {
+        List<Long> list = Arrays.stream(ids.split(",")).map(Long::parseLong).collect(Collectors.toList());
+        List<InsReport> insReports = insReportMapper.selectBatchIds(list);
+        String zipFilePath = null;
+        // 涓存椂鏂囦欢澶硅矾寰�
+        try {
+            String tempFolderPath = wordUrl + "/tempFolder";
+            File tempFolder = new File(tempFolderPath);
+            if (tempFolder.exists()) {
+                deleteDirectory(tempFolder); // 鍒犻櫎鏃х殑涓存椂鏂囦欢澶�
+            }
+            tempFolder.mkdirs(); // 鍒涘缓鏂扮殑涓存椂鏂囦欢澶�
+            for (InsReport insReport : insReports) {
+                File sourceFile = new File((ObjectUtils.isNotEmpty(insReport.getUrlS()) ? insReport.getUrlS() : insReport.getUrl()).replace("/word", wordUrl));
+                File destinationFile = new File(tempFolder, sourceFile.getName());
+                Files.copy(sourceFile.toPath(), destinationFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
+            }
+            // 鍘嬬缉涓存椂鏂囦欢澶�
+            zipFilePath = wordUrl + "/zip/output.zip";
+            zipDirectory(tempFolderPath, zipFilePath);
+
+            // 娓呯悊涓存椂鏂囦欢澶�
+            deleteDirectory(tempFolder);
+
+            System.out.println("ZIP鏂囦欢鍒涘缓瀹屾垚锛�");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return "/word/zip/output.zip";
+    }
+
+    //鎵归噺涓婁紶
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int upAll(MultipartFile file) throws IOException {
+        File tempFile = null;
+        File unzipDir = null;
+        try {
+            tempFile = File.createTempFile(wordUrl, ".zip");
+            file.transferTo(tempFile);
+
+            unzipDir = new File("uploaded_files");
+            if (!unzipDir.exists()) {
+                unzipDir.mkdir();
+            }
+            unzip(tempFile, unzipDir);
+            // 澶勭悊瑙e帇鍚庣殑鏂囦欢
+            File[] files = unzipDir.listFiles();
+            if (files != null) {
+                for (File f : files) {
+                    // 鏍规嵁鏂囦欢鍚嶆煡璇d
+                    String name = f.getName();
+                    InsReport insReport = insReportMapper.selectOne(Wrappers.<InsReport>lambdaQuery().like(InsReport::getCode, f.getName().replace(".docx", "").replace("JCZX", "JCZX/")));
+                    if (ObjectUtils.isEmpty(insReport)) {
+                        throw new ErrorException("娌℃湁鎵惧埌 " + f.getName() + " 杩欎釜鏂囦欢瀵瑰簲鐨勬姤鍛婃暟鎹�");
+                    }
+                    String urlString;
+                    String pathName;
+                    try {
+                        String path = wordUrl;
+                        File realpath = new File(path);
+                        if (!realpath.exists()) {
+                            realpath.mkdirs();
+                        }
+                        pathName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMddHHmmss")) + "_" + f.getName();
+                        urlString = realpath + "/" + pathName;
+                        // 澶嶅埗鏂囦欢鍒版寚瀹氳矾寰�
+                        Files.copy(f.toPath(), new File(urlString).toPath(), StandardCopyOption.REPLACE_EXISTING);
+                        inReport("/word/" + pathName, insReport.getId());
+                    } catch (IOException e) {
+                        throw new ErrorException("鏂囦欢涓婁紶澶辫触");
+                    }
+                }
+            }
+        } catch (IOException e) {
+            throw new ErrorException("鏂囦欢澶勭悊澶辫触");
+        } finally {
+            if (tempFile != null && tempFile.exists()) {
+                tempFile.delete();
+            }
+            // 閫掑綊鍒犻櫎瑙e帇鐩綍鍙婂叾涓殑鏂囦欢
+            if (unzipDir.exists()) {
+                deleteDirectory(unzipDir); // 鍒犻櫎鏃х殑涓存椂鏂囦欢澶�
+            }
+        }
+        return 0;
+    }
+
+
+    //瑙e帇鏂囦欢澶�
+    private void unzip(File zipFile, File destDir) throws IOException {
+        try (ZipFile zip = new ZipFile(zipFile)) {
+            Enumeration<? extends ZipEntry> entries = zip.entries();
+            while (entries.hasMoreElements()) {
+                ZipEntry entry = entries.nextElement();
+                File file = new File(destDir, entry.getName());
+                if (entry.isDirectory()) {
+                    file.mkdirs();
+                } else {
+                    file.getParentFile().mkdirs();
+                    try (InputStream in = zip.getInputStream(entry);
+                         OutputStream out = new FileOutputStream(file)) {
+                        byte[] buffer = new byte[1024];
+                        int len;
+                        while ((len = in.read(buffer)) > 0) {
+                            out.write(buffer, 0, len);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    // 鍘嬬缉鏂囦欢澶�
+    public static void zipDirectory(String sourceDirPath, String zipFilePath) throws IOException {
+        try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFilePath))) {
+            Path sourceDir = Paths.get(sourceDirPath);
+            Files.walk(sourceDir)
+                    .filter(path -> !Files.isDirectory(path))
+                    .forEach(path -> {
+                        ZipEntry zipEntry = new ZipEntry(sourceDir.relativize(path).toString());
+                        try {
+                            zipOut.putNextEntry(zipEntry);
+                            Files.copy(path, zipOut);
+                            zipOut.closeEntry();
+                        } catch (IOException e) {
+                            e.printStackTrace();
+                        }
+                    });
+        }
+    }
+
+    // 鍒犻櫎鏂囦欢澶瑰強鍏跺唴瀹�
+    public static void deleteDirectory(File directory) throws IOException {
+        if (directory.isDirectory()) {
+            File[] files = directory.listFiles();
+            if (files != null) {
+                for (File file : files) {
+                    deleteDirectory(file);
+                }
+            }
+        }
+        Files.delete(directory.toPath());
+    }
+
+    @Override
+    public void wordToPdf(String path, String sealUrl, boolean isRawMater) {
+        try {
+            wordToPdf(path, path.replace(".docx", ".pdf"), sealUrl, isRawMater);
+        } catch (Exception e) {
+            throw new ErrorException("杞崲澶辫触");
+        }
+    }
+
+
+    public String wordToPdf(String wordPath, String pdfPath, String sealUrl, boolean isRawMater) {
+        FileOutputStream os = null;
+        try {
+            //鍑瘉 涓嶇劧鍒囨崲鍚庢湁姘村嵃
+//            InputStream is = this.getClass().getResourceAsStream("/lib/license.xml");
+//            InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("license.xml");
+            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;
+            //鍒ゆ柇鏄惁鏄繘鍘傛姤鍛�
+            if (!isRawMater) {
+                file = new File(pdfPath.replace(".pdf", "-1.pdf"));
+            } else {
+                file = new File(pdfPath.replace(".pdf", ".pdf"));
+            }
+            os = new FileOutputStream(file);
+            //瑕佽浆鎹㈢殑word鏂囦欢
+            com.aspose.words.Document doc = new com.aspose.words.Document(wordPath);
+            doc.save(os, SaveFormat.PDF);
+
+            //娣诲姞楠戠紳绔�
+            if (!isRawMater) {
+                stamperCheckMarkPDF(pdfPath.replace(".pdf", "-1.pdf"), pdfPath, imgUrl + "/" + sealUrl);
+            }
+
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (os != null) {
+                try {
+                    os.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 鍒囧壊鍥剧墖
+     *
+     * @param Path 鍥剧墖璺緞
+     * @param n    鍒囧壊浠芥暟
+     */
+    public static com.itextpdf.text.Image[] slicingImages(String Path, int n) throws IOException, BadElementException {
+        com.itextpdf.text.Image[] nImage = new com.itextpdf.text.Image[n];
+        BufferedImage img = ImageIO.read(new File(Path));
+
+        int h = img.getHeight();
+        int w = img.getWidth();
+
+        int sw = w / n;
+        for (int i = 0; i < n; i++) {
+            BufferedImage subImg;
+            if (i == n - 1) {//鏈�鍚庡墿浣欓儴鍒�
+                subImg = img.getSubimage(i * sw, 0, w - i * sw, h);
+            } else {//鍓峮-1鍧楀潎鍖�鍒�
+                subImg = img.getSubimage(i * sw, 0, sw, h);
+            }
+            ByteArrayOutputStream out = new ByteArrayOutputStream();
+            ImageIO.write(subImg, Path.substring(Path.lastIndexOf('.') + 1), out);
+            nImage[i] = com.itextpdf.text.Image.getInstance(out.toByteArray());
+
+        }
+        return nImage;
+    }
+
+    /**
+     * 鐩栭獞缂濈珷
+     *
+     * @param infilePath  鍘烶DF璺緞
+     * @param outFilePath 杈撳嚭PDF璺緞
+     */
+    public static void stamperCheckMarkPDF(String infilePath, String outFilePath, String picPath) throws IOException, DocumentException {
+        PdfReader reader = new PdfReader(infilePath);//閫夋嫨闇�瑕佸嵃绔犵殑pdf
+        PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(outFilePath));//鍔犲畬鍗扮珷鍚庣殑pdf
+
+
+        com.itextpdf.text.Rectangle pageSize = reader.getPageSize(1);//鑾峰緱绗竴椤�
+        float height = pageSize.getHeight();
+        float width = pageSize.getWidth();
+
+        int nums = reader.getNumberOfPages();
+        com.itextpdf.text.Image[] nImage = slicingImages(picPath, nums);//鐢熸垚楠戠紳绔犲垏鍓插浘鐗�
+
+        for (int n = 1; n <= nums; n++) {
+            PdfContentByte over = stamp.getOverContent(n);//璁剧疆鍦ㄧ鍑犻〉鎵撳嵃鍗扮珷
+            com.itextpdf.text.Image img = nImage[n - 1];//閫夋嫨鍥剧墖
+            float newHeight = 100f;
+            float newWidth = img.getWidth() / (img.getHeight() / 100);
+            img.scaleAbsolute(newWidth, newHeight);//鎺у埗鍥剧墖澶у皬
+            img.setAbsolutePosition(width - newWidth, height / 2 - newHeight / 2);//鎺у埗鍥剧墖浣嶇疆
+            over.addImage(img);
+        }
+        stamp.close();
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void isRawMaterial(InsOrder insOrder) {
+        IfsInventoryQuantity one = ifsInventoryQuantityMapper.selectOne(new LambdaQueryWrapper<IfsInventoryQuantity>()
+                .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId()));
+        if (Objects.isNull(one)) {
+            throw new ErrorException("鎵句笉鍒板師鏉愭枡淇℃伅");
+        }
+        // 鍒ゆ柇鏄惁鏈変笉鍚堟牸淇℃伅
+        Long count = insUnqualifiedHandlerMapper.selectCount(Wrappers.<InsUnqualifiedHandler>lambdaQuery()
+                .eq(InsUnqualifiedHandler::getInventoryQuantityId, one.getId()));
+        String toLocation = null;
+
+        // 鍒ゆ柇鏄惁鏈変笉鍚堟牸
+        Long unqualifiedCount = getUnqualifiedCount(insOrder);
+
+        if (count.equals(0L) && unqualifiedCount.equals(0L) && one.getIsFinish().equals(0) && one.getIsSource().equals(1)) {
+            // 鍘熸潗鏂欑Щ搴�
+            toLocation = this.moveRawMaterial(one);
+        }
+
+        // 鍒ゆ柇缁撴潫鐘舵�佷慨鏀瑰悎鏍肩姸鎬�
+        int inspectStatus = (count == 0 && unqualifiedCount == 0) ? 1 : 2;
+        insOrderMapper.update(null, Wrappers.<InsOrder>lambdaUpdate()
+                .eq(InsOrder::getId, insOrder.getId())
+                .set(InsOrder::getInsResult, inspectStatus));
+
+        if (one.getIsFinish().equals(0)) {
+            ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
+                    .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId())
+                    .set(IfsInventoryQuantity::getInspectStatus, inspectStatus));
+
+            // 淇敼ifs搴撳瓨鐘舵��
+            if (StringUtils.isBlank(toLocation)) {
+                ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
+                        .set(IfsInventoryQuantity::getIsFinish, 1)
+                        .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId()));
+            } else {
+                ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
+                        .set(IfsInventoryQuantity::getIsFinish, 1)
+                        .set(IfsInventoryQuantity::getToLocation, toLocation)
+                        .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId()));
+            }
+
+            threadPoolTaskExecutor.execute(() -> {
+                // 浼佷笟寰俊閫氱煡
+                String message = "";
+                message += "妫�娴嬬粨鏋滄彁浜ら�氱煡";
+                message += "\n鎵规鍙�: " + one.getUpdateBatchNo();
+                message += "\n闆朵欢鍙�: " + one.getPartNo();
+                message += "\n闆朵欢鎻忚堪: " + one.getPartDesc();
+                message += "\n渚涘簲鍟嗗悕绉�: " + one.getSupplierName();
+                message += "\n鎶佃揪鏁伴噺: " + one.getQtyArrived().stripTrailingZeros().toPlainString() + one.getBuyUnitMeas();
+                // 鍙戦�佷紒涓歩nspectStatus淇¢�氱煡
+                if (inspectStatus == 1) {
+                    message += "\n妫�娴嬬粨鏋�: 鍚堟牸";
+                } else {
+                    message += "\n妫�娴嬬粨鏋�: 涓嶅悎鏍�";
+                }
+                WxCpUtils.informWebHook(wechatProperty.getExaminingUrl(), message);
+            });
+
+        }
+
+
+    }
+
+    /**
+     * 鍒ゆ柇鏄惁鏈変笉鍚堟牸
+     * @param insOrder
+     * @return
+     */
+    @Override
+    public Long getUnqualifiedCount(InsOrder insOrder) {
+        Long unqualifiedCount = 0L;
+        List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery()
+                .eq(InsSample::getInsOrderId, insOrder.getId()));
+        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> insProducts = 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 : insProducts) {
+                    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;
+                }
+            }
+        }
+        return unqualifiedCount;
+    }
+
+    /**
+     * ifs绉诲簱鎿嶄綔
+     * @param one
+     * @return
+     */
+    @Override
+    public String moveRawMaterial(IfsInventoryQuantity one) {
+        String toLocation;
+        // 鐧昏閲囪喘妫�楠岀粨鏋淪TD
+        if (one.getIsRegister().equals(0)) {
+            Map<String, Object> resultMap = new HashMap<>();
+            List<Map<String, Object>> resultList = new ArrayList<>();
+            Map<String, Object> map = new HashMap<>();
+            map.put("ORDER_NO", one.getOrderNo()); // 閲囪喘璁㈠崟鍙�
+            map.put("LINE_NO", one.getLineNo()); // 琛屽彿
+            map.put("RELEASE_NO", one.getReleaseNo()); // 涓嬭揪鍙�
+            map.put("RECEIPT_NO", one.getReceiptNo()); // 鎺ユ敹鍙�
+            map.put("PURCH_QTY", one.getQtyToInspect()); // 瑕佹楠岀殑閲囪喘鏁伴噺
+            resultList.add(map);
+            resultMap.put("RECORD_ID", UUID.randomUUID().toString());
+            resultMap.put("SYSCODE", "LIMS");
+            resultMap.put("SYSMODEL", "鐧昏閲囪喘妫�楠岀粨鏋�");
+            resultMap.put("BATCH_INFO", resultList);
+            Result result = ifsApiUtils.getProcurementResults(JSONUtil.toJsonStr(resultMap));
+            if (result.getCode() != 200) {
+                throw new ErrorException("IFS鐧昏閲囪喘妫�楠岀粨鏋滃け璐�: " + result.getMessage());
+            }
+        }
+        insOrderService.updateIfsInventoryQuantity(one.getId());
+        /**
+         * TODO 鍚庣画闇�瑕佽皟鐢↖FS鐨勬帴鍙� 绉诲叆鐨勫簱浣嶅彿 toLocation
+         */
+        // 妫�楠屽悗绉诲簱
+        toLocation = "1301";
+        Map<String, Object> moveResultMap = new HashMap<>();
+        List<Map<String, Object>> moveResultList = new ArrayList<>();
+        Map<String, Object> moveMap = new HashMap<>();
+        moveMap.put("ORDER_NO", one.getOrderNo()); // 閲囪喘璁㈠崟鍙�
+        moveMap.put("LINE_NO", one.getLineNo());
+        moveMap.put("RELEASE_NO", one.getReleaseNo());
+        moveMap.put("RECEIPT_NO", one.getReceiptNo());
+        moveMap.put("PART_NO", one.getPartNo());
+        moveMap.put("QTY", one.getQtyArrived());
+        moveMap.put("LOCATION_NO", one.getLocationNo());
+        moveMap.put("TO_LOCATION_NO", toLocation);
+        moveMap.put("LOT_BATCH_NO", one.getLotBatchNo());
+        moveMap.put("SERIAL_NO", one.getSerialNo());
+        moveMap.put("WAIV_DEV_REJ_NO", one.getWaivDevRejNo());
+        moveMap.put("ENG_CHG_LEVEL", one.getEngChgLevel());
+        moveMap.put("ACTIVITY_SEQ", one.getActivitySeq());
+        moveResultList.add(moveMap);
+        moveResultMap.put("RECORD_ID", UUID.randomUUID().toString());
+        moveResultMap.put("SYSCODE", "LIMS");
+        moveResultMap.put("SYSMODEL", "妫�楠屽悗绉诲簱");
+        moveResultMap.put("BATCH_INFO", moveResultList);
+
+        Result result1 = ifsApiUtils.moveReceipt(JSONUtil.toJsonStr(moveResultMap));
+        // 濡傛灉鏈夊繀椤讳负闆朵欢鎸囧畾鎵瑰彿鎶ラ敊闇�瑕侀噸鏂版彁浜ょЩ搴撲俊鎭幓鎸囧畾鎵瑰彿
+        if (result1.getCode() != 200) {
+            String message = result1.getMessage();
+            if (message.contains("蹇呴』涓洪浂浠�") && message.contains("鎸囧畾鎵瑰彿")) {
+                updaeBatch(one, toLocation);
+            } else {
+                throw new ErrorException("IFS妫�楠屽悗绉诲簱澶辫触: " + result1.getMessage());
+            }
+        }
+        return toLocation;
+    }
+
+    /**
+     * 閫�鍥炲埌妫�楠屼换鍔�
+     * @param id
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean sendBackTask(Integer id) {
+        InsReport report = insReportMapper.selectById(id);
+        // 鏍规嵁璁㈠崟鏌ヨ璇曢獙瀹�
+        String laboratory = insOrderMapper.selectLaboratoryByOrderId(report.getInsOrderId());
+
+        // 淇敼璁㈠崟鐘舵��
+        insOrderStateMapper.update(null, Wrappers.<InsOrderState>lambdaUpdate()
+                .eq(InsOrderState::getInsOrderId, report.getInsOrderId())
+                .eq(InsOrderState::getLaboratory, laboratory)
+                .set(InsOrderState::getInsState, 4));
+
+        Integer insSampleId = insSampleUserMapper.selectOne(Wrappers.<InsSampleUser>lambdaQuery()
+                .eq(InsSampleUser::getInsSampleId, report.getInsOrderId())
+                .orderByDesc(InsSampleUser::getId)
+                .last("limit 1")).getId();
+        insSampleUserMapper.deleteById(insSampleId);
+
+        // 淇敼鎶ュ憡琛屼负鏈樉绀�
+        insReportMapper.update(null, Wrappers.<InsReport>lambdaUpdate()
+                .eq(InsReport::getId, id)
+                .set(InsReport::getIsPass, 0));
+
+        return false;
+    }
+
+
+    /**
+     * 鍏堜慨鏀归噰璐鍗曟壒娆″彿, 鍚庤繘琛岀Щ搴撴搷浣�
+     * @param one
+     * @param toLocation
+     */
+    private void updaeBatch(IfsInventoryQuantity one, String toLocation) {
+        if (one.getIsUpdateBatch().equals(0)) {
+            // 鍏堜慨鏀规壒娆″彿鍚庤繘琛岀Щ搴�
+            Map<String, Object> resultMap = new HashMap<>();
+            List<Map<String, Object>> resultList = new ArrayList<>();
+            Map<String, Object> map = new HashMap<>();
+            map.put("ORDER_NO", one.getOrderNo()); // 閲囪喘璁㈠崟鍙�
+            map.put("LINE_NO", one.getLineNo()); // 琛屽彿
+            map.put("RELEASE_NO", one.getReleaseNo()); // 涓嬭揪鍙�
+            map.put("RECEIPT_NO", one.getReceiptNo()); // 鎺ユ敹鍙�
+            map.put("PART_NO", one.getPartNo()); //闆朵欢鍙�
+            map.put("CONFIGURATION_ID", one.getConfigurationId()); // 閰嶇疆鏍囪瘑
+            map.put("LOCATION_NO", one.getLocationNo()); // 搴撲綅鍙�
+            map.put("LOT_BATCH_NO", one.getLotBatchNo());// 鎵规鍙�
+            map.put("NEW_LOT_BATCH_NO", one.getUpdateBatchNo()); // 鐩爣鎵规鍙�
+            map.put("SERIAL_NO", one.getSerialNo()); // 搴忓垪鍙�
+            map.put("ENG_CHG_LEVEL", one.getEngChgLevel()); // 鐗堟湰鍙�
+            map.put("WAIV_DEV_REJ_NO", one.getWaivDevRejNo()); // wdr鍙�
+            map.put("ACTIVITY_SEQ", one.getActivitySeq()); // 娲诲姩搴忓彿
+            map.put("QTY_TO_CHANGE", one.getQtyArrived()); // 鍙樻洿鏁伴噺
+            resultList.add(map);
+            resultMap.put("RECORD_ID", UUID.randomUUID().toString());
+            resultMap.put("SYSCODE", "LIMS");
+            resultMap.put("SYSMODEL", "淇敼閲囪喘璁㈠崟鎵规鍙�");
+            resultMap.put("BATCH_INFO", resultList);
+
+            Result result = ifsApiUtils.updateMoveReceiptLot(JSONUtil.toJsonStr(resultMap));
+
+            if (result.getCode() != 200) {
+                throw new ErrorException("IFS淇敼鎵规鍙峰け璐�: " + result.getMessage());
+            }
+            ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
+                    .set(IfsInventoryQuantity::getIsUpdateBatch, 1)
+                    .eq(IfsInventoryQuantity::getId, one.getId()));
+        }
+
+        Map<String, Object> moveResultMap = new HashMap<>();
+        List<Map<String, Object>> moveResultList = new ArrayList<>();
+        Map<String, Object> moveMap = new HashMap<>();
+        moveMap.put("ORDER_NO", one.getOrderNo()); // 閲囪喘璁㈠崟鍙�
+        moveMap.put("LINE_NO", one.getLineNo());
+        moveMap.put("RELEASE_NO", one.getReleaseNo());
+        moveMap.put("RECEIPT_NO", one.getReceiptNo());
+        moveMap.put("PART_NO", one.getPartNo());
+        moveMap.put("QTY", one.getQtyArrived());
+        moveMap.put("LOCATION_NO", one.getLocationNo());
+        moveMap.put("TO_LOCATION_NO", toLocation);
+        moveMap.put("LOT_BATCH_NO", one.getUpdateBatchNo());
+        moveMap.put("SERIAL_NO", one.getSerialNo());
+        moveMap.put("WAIV_DEV_REJ_NO", one.getWaivDevRejNo());
+        moveMap.put("ENG_CHG_LEVEL", one.getEngChgLevel());
+        moveMap.put("ACTIVITY_SEQ", one.getActivitySeq());
+        moveResultList.add(moveMap);
+        moveResultMap.put("RECORD_ID", UUID.randomUUID().toString());
+        moveResultMap.put("SYSCODE", "LIMS");
+        moveResultMap.put("SYSMODEL", "妫�楠屽悗绉诲簱");
+        moveResultMap.put("BATCH_INFO", moveResultList);
+
+        Result result1 = ifsApiUtils.moveReceipt(JSONUtil.toJsonStr(moveResultMap));
+        if (result1.getCode() != 200) {
+            throw new ErrorException("IFS妫�楠屽悗绉诲簱澶辫触: " + result1.getMessage());
+        }
+
+    }
+
+    /**
+     * 鏇挎崲娈佃惤鏂囨湰
+     * @param filePath docx瑙f瀽瀵硅薄
+     * @param textMap 闇�瑕佹浛鎹㈢殑淇℃伅闆嗗悎
+     */
+    public static void changeText(Map<String, String> textMap, String filePath) {
+        try {
+            FileInputStream stream = new FileInputStream(filePath);
+            XWPFDocument document = new XWPFDocument(stream);
+            List<XWPFTable> tables = document.getTables();
+            for (XWPFTable table : tables) {
+                for (XWPFTableRow row : table.getRows()) {
+                    for (XWPFTableCell cell : row.getTableCells()) {
+
+                        textMap.forEach((s, s2) -> {
+                            if (cell.getText().equals(s)) {
+                                XWPFParagraph paragraph = cell.getParagraphs().get(0);
+                                XWPFRun oldRun = paragraph.getRuns().get(0);
+                                // 淇濆瓨鍘熸牱寮�
+                                String fontFamily = oldRun.getFontFamily();
+                                int fontSize = oldRun.getFontSize();
+                                String color = oldRun.getColor();
+                                ParagraphAlignment alignment = paragraph.getAlignment();
+                                // 鏇挎崲鍐呭
+                                paragraph.removeRun(0); // 绉婚櫎鍘熸湁鐨� run
+                                XWPFRun newRun = paragraph.createRun();
+                                newRun.setText(s2);
+                                // 搴旂敤鍘熸牱寮�
+                                newRun.setFontFamily(fontFamily);
+                                newRun.setFontSize(fontSize);
+                                newRun.setColor(color);
+                                paragraph.setAlignment(alignment);
+                            }
+                        });
+                    }
+                }
+            }
+            FileOutputStream fileOutputStream = new FileOutputStream(filePath);
+            document.write(fileOutputStream);
+            fileOutputStream.close();
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new ErrorException(e.getMessage());
+        }
+    }
+
+    /**
+     * word杞崲pdf
+     * @param path
+     * @return
+     */
+    private 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;
+    }
+}
+
+
+
+
+
+
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java
index 1faaee4..9bce1e1 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java
@@ -1,847 +1,839 @@
-//package com.ruoyi.inspect.service.impl;
-//
-//import cn.hutool.core.collection.CollUtil;
-//import cn.hutool.core.collection.CollectionUtil;
-//import cn.hutool.core.date.DateTime;
-//import cn.hutool.core.date.DateUtil;
-//import cn.hutool.core.util.StrUtil;
-//import com.alibaba.excel.EasyExcel;
-//import com.alibaba.excel.ExcelWriter;
-//import com.alibaba.excel.write.metadata.WriteSheet;
-//import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
-//import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-//import com.baomidou.mybatisplus.core.metadata.IPage;
-//import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
-//import com.baomidou.mybatisplus.core.toolkit.StringUtils;
-//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-//import com.ruoyi.basic.dto.*;
-//import com.ruoyi.basic.pojo.IfsInventoryQuantity;
-//import com.ruoyi.common.constant.InsOrderTypeConstants;
-//import com.ruoyi.common.core.domain.entity.User;
-//import com.ruoyi.common.utils.LimsDateUtil;
-//import com.ruoyi.common.utils.QueryWrappers;
-//import com.ruoyi.common.utils.SecurityUtils;
-//import com.ruoyi.common.utils.WxCpUtils;
-//import com.ruoyi.framework.properties.WechatProperty;
-//import com.ruoyi.inspect.dto.CopperInsOrderDto;
-//import com.ruoyi.inspect.dto.RawMaterialStandardTreeDto;
-//import com.ruoyi.basic.mapper.IfsInventoryQuantityMapper;
-//import com.ruoyi.basic.mapper.StandardTreeMapper;
-//import com.ruoyi.inspect.dto.SampleProductDto;
-//import com.ruoyi.inspect.mapper.InsOrderMapper;
-//import com.ruoyi.inspect.mapper.InsProductMapper;
-//import com.ruoyi.inspect.mapper.InsSampleMapper;
-//import com.ruoyi.inspect.pojo.InsOrder;
-//import com.ruoyi.inspect.pojo.InsReport;
-//import com.ruoyi.inspect.service.InsOrderService;
-//import com.ruoyi.inspect.service.InsReportService;
-//import com.ruoyi.inspect.service.RawMaterialOrderService;
-//import com.ruoyi.common.numgen.NumberGenerator;
-//import com.ruoyi.framework.exception.ErrorException;
-//import com.ruoyi.performance.mapper.AuxiliaryOutputWorkingHoursMapper;
-//import com.ruoyi.performance.pojo.AuxiliaryOutputWorkingHours;
-//import com.ruoyi.system.mapper.UserMapper;
-//import lombok.AllArgsConstructor;
-//import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
-//import org.springframework.stereotype.Service;
-//import org.springframework.transaction.annotation.Transactional;
-//
-//import javax.servlet.http.HttpServletResponse;
-//import java.io.IOException;
-//import java.io.UnsupportedEncodingException;
-//import java.math.BigDecimal;
-//import java.net.URLEncoder;
-//import java.text.SimpleDateFormat;
-//import java.time.LocalDateTime;
-//import java.time.format.DateTimeFormatter;
-//import java.util.*;
-//import java.util.concurrent.atomic.AtomicInteger;
-//
-///**
-// * @Author zhuo
-// * @Date 2024/7/31
-// */
-//@Service
-//@AllArgsConstructor
-//public class RawMaterialOrderServiceImpl implements RawMaterialOrderService {
-//
-//    private StandardTreeMapper standardTreeMapper;
-//    private IfsInventoryQuantityMapper ifsInventoryQuantityMapper;
-//    private UserMapper userMapper;
-//    private InsOrderService insOrderService;
-//    private InsOrderMapper insOrderMapper;
-//    private InsSampleMapper insSampleMapper;
-//    private final NumberGenerator<InsOrder> numberGenerator;
-//    private InsReportService insReportService;
-//    private WechatProperty wechatProperty;
-//    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
-//    private InsProductMapper insProductMapper;
-//    private AuxiliaryOutputWorkingHoursMapper auxiliaryOutputWorkingHoursMapper;
-//
-//
-//    @Override
-//    public RawMaterialStandardTreeDto selectStandardTreeListByPartNo(String partNo) {
-//        if (StringUtils.isBlank(partNo)) {
-//            throw new ErrorException("闆朵欢鍙蜂涪澶�");
-//        }
-//        List<FactoryDto> factoryDtos = standardTreeMapper.selectStandardTreeListByPartNo(partNo);
-//        if (CollectionUtil.isEmpty(factoryDtos)) {
-//            throw new ErrorException("闆朵欢鍙蜂负" + partNo + "鐨勫師鏉愭枡娌℃湁瀵瑰簲鐨勬爣鍑嗗簱閰嶇疆");
-//        }
-//        RawMaterialStandardTreeDto rawMaterialStandardTreeDto = new RawMaterialStandardTreeDto();
-//        for (FactoryDto factoryDto : factoryDtos) {
-//            for (LaboratoryDto laboratoryDto : factoryDto.getChildren()) {
-//                for (SampleTypeDto sampleTypeDto : laboratoryDto.getChildren()) {
-//                    if (sampleTypeDto.getChildren().size() == 0) {
-//                        sampleTypeDto.setChildren(standardTreeMapper.getStandardTree3(sampleTypeDto.getValue()));
-//                    }
-//                    // 鍒ゆ柇缁戝畾鐨勬槸鍚︽槸褰撳墠闆朵欢鍙�
-//                    if (sampleTypeDto.getPartNo() != null && sampleTypeDto.getPartNo().equals(partNo)) {
-//                        // 娣诲姞瀵硅薄
-//                        rawMaterialStandardTreeDto.setTreeName(factoryDto.getValue() + "-"
-//                                + laboratoryDto.getValue() + "-"
-//                                + sampleTypeDto.getValue());
-//                        rawMaterialStandardTreeDto.setCode(sampleTypeDto.getCode());
-//                        rawMaterialStandardTreeDto.setLabel(sampleTypeDto.getLabel());
-//                        rawMaterialStandardTreeDto.setValue(sampleTypeDto.getValue());
-//                        rawMaterialStandardTreeDto.setChildren1(sampleTypeDto.getChildren());
-//                    } else {
-//                        for (SampleDto sampleDto : sampleTypeDto.getChildren()) {
-//                            if (sampleDto.getPartNo() != null && sampleDto.getPartNo().equals(partNo)) {
-//                                // 娣诲姞瀵硅薄
-//                                rawMaterialStandardTreeDto.setTreeName(factoryDto.getValue() + "-"
-//                                        + laboratoryDto.getValue() + "-"
-//                                        + sampleTypeDto.getValue() + "-"
-//                                        + sampleDto.getValue());
-//                                rawMaterialStandardTreeDto.setCode(sampleDto.getCode());
-//                                rawMaterialStandardTreeDto.setLabel(sampleDto.getLabel());
-//                                rawMaterialStandardTreeDto.setValue(sampleDto.getValue());
-//                                rawMaterialStandardTreeDto.setChildren2(sampleDto.getChildren());
-//                            }
-//                        }
-//                    }
-//                }
-//            }
-//        }
-//        return rawMaterialStandardTreeDto;
-//    }
-//
-//    @Override
-//    public IPage<IfsInventoryQuantity> getWarehouseSubmit(IPage<IfsInventoryQuantity> page, IfsInventoryQuantity ifsInventoryQuantity) {
-//        return standardTreeMapper.selectIfsPage(page, QueryWrappers.queryWrappers(ifsInventoryQuantity));
-//    }
-//
-//    @Override
-//    public IPage<IfsInventoryQuantityDto> getIfsByStateOne(IPage<IfsInventoryQuantityDto> page, IfsInventoryQuantityDto ifsInventoryQuantityDto) {
-//        return standardTreeMapper.getIfsByStateOne(page, QueryWrappers.queryWrappers(ifsInventoryQuantityDto));
-//    }
-//
-//
-//    /**
-//     * 鎶ユ
-//     * @param ids
-//     * @return
-//     */
-//    @Override
-//    public int inspectionReport(List<Integer> ids) {
-//        Integer userId = SecurityUtils.getUserId().intValue();
-//        ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
-//                .in(IfsInventoryQuantity::getId, ids)
-//                .set(IfsInventoryQuantity::getDeclareUser, userMapper.selectById(userId).getName())
-//                .set(IfsInventoryQuantity::getDeclareUserId, userId)
-//                .set(IfsInventoryQuantity::getIsInspect, 1)
-//                .set(IfsInventoryQuantity::getDeclareDate, LocalDateTime.now())
-//        );
-//        threadPoolTaskExecutor.execute(() -> {
-//            List<IfsInventoryQuantity> quantityList = ifsInventoryQuantityMapper.selectList(Wrappers.<IfsInventoryQuantity>lambdaQuery()
-//                    .in(IfsInventoryQuantity::getId, ids));
-//            // 浼佷笟寰俊閫氱煡
-//            String message = "";
-//            message += "鏂板鎶ユ閫氱煡";
-//            for (IfsInventoryQuantity inventoryQuantity : quantityList) {
-//                message += "\n鎵规鍙�: " + inventoryQuantity.getUpdateBatchNo();
-//                message += "\n闆朵欢鎻忚堪: " + inventoryQuantity.getPartDesc();
-//                message += "\n鎶佃揪鏁伴噺: " + inventoryQuantity.getQtyArrived().stripTrailingZeros().toPlainString() + inventoryQuantity.getBuyUnitMeas();
-//
-//                // 鍒ゆ柇鏈夋病鏈夊埌20鍚�. 鎴栬�呰兘鍚﹀厤妫�
-//                int result = notificationRawOrder(inventoryQuantity.getId());
-//                switch (result) {
-//                    case 1:
-//                        message += "\n褰撳墠鏍峰搧宸叉楠岃繃, 鍙互鍏嶆";
-//                        break;
-//                    case 2:
-//                        message += "\n褰撳墠鏍峰搧宸茶秴杩�20鍚�";
-//                        break;
-//                }
-//                message += "\n";
-//            }
-//            WxCpUtils.informWebHook(wechatProperty.getExaminingUrl(), message);
-//        });
-//        return 1;
-//    }
-//
-//    /**
-//     * 鎾ら攢鎶ユ
-//     * @param id
-//     * @return
-//     */
-//    @Override
-//    public int revokeInspectionReport(Integer id) {
-//        return ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
-//                .eq(IfsInventoryQuantity::getId, id)
-//                .set(IfsInventoryQuantity::getIsInspect, 0)
-//        );
-//    }
-//
-//    /**
-//     * 鎵撳嵃鏍囩鏌ヨ
-//     * @param ids
-//     * @return
-//     */
-//    @Override
-//    public List<IfsInventoryQuantityDto> printLabel(List<Integer> ids) {
-//        return ifsInventoryQuantityMapper.printLabel(ids);
-//    }
-//
-//    /**
-//     * 鎶ユ
-//     * @param ifsInventoryQuantity
-//     * @return
-//     */
-//    @Override
-//    public int inspectionReportOne(IfsInventoryQuantity ifsInventoryQuantity) {
-//        Integer userId = SecurityUtils.getUserId().intValue();
-//        ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
-//                .eq(IfsInventoryQuantity::getId, ifsInventoryQuantity.getId())
-//                .set(IfsInventoryQuantity::getDeclareUser, userMapper.selectById(userId).getName())
-//                .set(IfsInventoryQuantity::getDeclareUserId, userId)
-//                .set(IfsInventoryQuantity::getIsInspect, 1)
-//                .set(IfsInventoryQuantity::getDeclareDate, LocalDateTime.now())
-//                .set(IfsInventoryQuantity::getUpdateBatchNo, ifsInventoryQuantity.getUpdateBatchNo())
-//        );
-//
-//        threadPoolTaskExecutor.execute(() -> {
-//            IfsInventoryQuantity inventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsInventoryQuantity.getId());
-//            // 浼佷笟寰俊閫氱煡
-//            String message = "";
-//            message += "鏂板鎶ユ閫氱煡";
-//            message += "\n鎵规鍙�: " + inventoryQuantity.getUpdateBatchNo();
-//            message += "\n闆朵欢鎻忚堪: " + inventoryQuantity.getPartDesc();
-//            message += "\n鎶佃揪鏁伴噺: " + inventoryQuantity.getQtyArrived().stripTrailingZeros().toPlainString() + inventoryQuantity.getBuyUnitMeas();
-//            WxCpUtils.informWebHook(wechatProperty.getExaminingUrl(), message);
-//        });
-//        return 1;
-//    }
-//
-//    /**
-//     * 鑾峰彇閾滀骇涓氶摼妫�娴嬫暟鎹�
-//     * @param id
-//     * @return
-//     */
-//    @Override
-//    public String getIndustryChain(Integer id) {
-//        return ifsInventoryQuantityMapper.selectById(id).getIndustryChain();
-//    }
-//
-//    /**
-//     * 鍘熸潗鏂欐挙閿�鎺ュ彛
-//     * @param ifsInventoryId
-//     * @return
-//     */
-//    @Override
-//    public boolean repealRawOrder(Integer ifsInventoryId) {
-//        // 鏌ヨ鍒ゆ柇鏄惁鏄摐鍗曚笣
-//        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
-//        if (ifsInventoryQuantity.getIsCopper() != null && ifsInventoryQuantity.getIsCopper().equals(1)) {
-//            // 閾滃崟涓濈洿鎺ュ垹闄ゅ氨琛�
-//            ifsInventoryQuantityMapper.deleteById(ifsInventoryId);
-//        } else {
-//            ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
-//                    .set(IfsInventoryQuantity::getState, 0)
-//                    .set(IfsInventoryQuantity::getIsQuarter, 1)
-//                    .eq(IfsInventoryQuantity::getId, ifsInventoryId));
-//        }
-//
-//        insOrderService.update(Wrappers.<InsOrder>lambdaUpdate()
-//                .eq(InsOrder::getIfsInventoryId, ifsInventoryId)
-//                .set(InsOrder::getState, -1)
-//                .set(InsOrder::getEntrustCode, ""));// 鎾ら攢
-//        return true;
-//    }
-//
-//    /**
-//     * 鍘熸潗鏂欏厤妫�涓嬪崟
-//     * @param list
-//     * @param insOrder
-//     * @return
-//     */
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public int addExemptionOrder(List<SampleProductDto> list, InsOrder insOrder) {
-//        if (!insOrder.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY)) {
-//            throw new ErrorException("鍙湁杩涘巶妫�楠屾墠鑳藉厤妫�");
-//        }
-//        insOrder.setSendTime(LocalDateTime.now());
-//        // 淇敼璁㈠崟琛ㄧ洿鎺ヤ负宸叉楠�
-//        insOrder.setState(4);
-//        insOrder.setTypeSource(1);
-//
-//        String code = "Y";
-//        // 鐢熸垚缂栧彿
-//        String no = numberGenerator.generateNumberWithPrefix(3,
-//                "JCZX/ZB-" + code + LimsDateUtil.resetDate(LocalDateTime.now()),
-//                InsOrder::getEntrustCode);
-//
-//        insOrderMapper.insert(insOrder); // 涓昏〃
-//
-//        AtomicInteger count = new AtomicInteger();
-//        list.forEach(a -> {
-//            count.getAndIncrement();
-//            a.setId(null);
-//            a.setInsOrderId(insOrder.getId());
-//            if (StrUtil.isEmpty(a.getSampleCode())) {
-//                // 濡傛灉鍙湁涓�涓牱鍝佸氨涓嶉渶瑕佹嫾鎺ユ暟瀛�
-//                if (list.size() != 1) {
-//                    a.setSampleCode(no + "-" + count.get());
-//                } else {
-//                    a.setSampleCode(no);
-//                }
-//            }
-//            insSampleMapper.insert(a);
-//
-//            if (!CollectionUtil.isEmpty(a.getInsProduct())) {
-//                throw new ErrorException("鍏嶆涓嶉渶瑕佸~鍐欐楠岄」");
-//            }
-//        });
-//
-//        // 鍘熸潗鏂欎笅鍗�: 濮旀墭浜哄氨鏄姤妫�浜�, 鐢熶骇鍗曚綅灏辨槸渚涘簲鍟嗗崟浣�
-//        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(insOrder.getIfsInventoryId());
-//        Integer declareUserId = ifsInventoryQuantity.getDeclareUserId();
-//        User user = userMapper.selectById(declareUserId);
-//        // 渚涘簲鍟嗗悕绉�
-//        insOrder.setProduction(ifsInventoryQuantity.getSupplierName());
-//        // 濮旀墭浜哄悕绉�
-//        insOrder.setPrepareUser(user.getName());
-//        insOrder.setPhone(user.getPhone());
-//
-//        // 淇敼鍘熸潗鏂欐暟鎹洿鎺ヤ负宸叉楠�
-//        ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>().set(IfsInventoryQuantity::getState, 2)
-//                .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId()));
-//
-//        insOrder.setExamineTime(LocalDateTime.now());
-//
-//        insOrder.setEntrustCode(no);
-//        insOrder.setIsExemption(1);
-//
-//        insOrderMapper.updateById(insOrder);
-//
-//        // 娣诲姞宸ユ椂
-//        addAuxiliary(insOrder, ifsInventoryQuantity);
-//
-//        // todo: ifs鐩存帴绉诲簱
-//        insReportService.isRawMaterial(insOrder);
-//
-//        return insOrder.getId();
-//    }
-//
-//
-//    /**
-//     * 鏌ヨ寰呬笅鍗�
-//     * @param page
-//     * @param ifsInventoryQuantity
-//     * @return
-//     */
-//    @Override
-//    public IPage<IfsInventoryQuantityCheckDto> selectIfsInventoryQuantity(Page<IfsInventoryQuantityCheckDto> page, IfsInventoryQuantityCheckDto ifsInventoryQuantity) {
-//        return standardTreeMapper.selectIfsInventoryQuantity(page, QueryWrappers.queryWrappers(ifsInventoryQuantity));
-//    }
-//
-//    /**
-//     * 鏌ヨ宸叉楠�
-//     * @param page
-//     * @param ifsInventoryQuantityDto
-//     * @return
-//     */
-//    @Override
-//    public IPage<IfsInventoryQuantitySupplierDto> getIfsByOver(Page<IfsInventoryQuantitySupplierDto> page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto) {
-//        // todo: 鍙湅鎴�
-//        String beginDeclareDate = ifsInventoryQuantityDto.getBeginDeclareDate();
-//        String endDeclareDate = ifsInventoryQuantityDto.getEndDeclareDate();
-//        ifsInventoryQuantityDto.setBeginDeclareDate(null);
-//        ifsInventoryQuantityDto.setEndDeclareDate(null);
-//
-//        return standardTreeMapper.getIfsByOver(page, QueryWrappers.queryWrappers(ifsInventoryQuantityDto), beginDeclareDate, endDeclareDate);
-//    }
-//
-//    /**
-//     * 鍒犻櫎鍘熸潗鏂欐姤妫�淇℃伅
-//     * @param id
-//     * @return
-//     */
-//    @Override
-//    public int delIfsInventory(Integer id) {
-//        return ifsInventoryQuantityMapper.deleteById(id);
-//    }
-//
-//    /**
-//     * 鍘熸潗鏂欐斁琛屽厤妫�
-//     * @param ifsInventoryId
-//     * @return
-//     */
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public boolean rawOrderRelease(Integer ifsInventoryId, String partDetail) {
-//        // 淇敼鍘熸潗鏂欐暟鎹洿鎺ヤ负宸叉楠�
-//        ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
-//                .set(IfsInventoryQuantity::getState, 2)
-//                .set(IfsInventoryQuantity::getIsQuarter, 0)
-//                .eq(IfsInventoryQuantity::getId, ifsInventoryId));
-//
-//        // 鏌ヨ鍘熸潗鏂欎俊鎭�
-//        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
-//        // 濮旀墭浜哄氨鏄姤妫�浜�, 鐢熶骇鍗曚綅灏辨槸渚涘簲鍟嗗崟浣�
-//        Integer declareUserId = ifsInventoryQuantity.getDeclareUserId();
-//        User user = userMapper.selectById(declareUserId);
-//
-//        InsOrder insOrder = new InsOrder();
-//        insOrder.setState(4);
-//        insOrder.setTypeSource(1);
-//        String code = "Y";
-//        // 鐢熸垚缂栧彿
-//        String no = numberGenerator.generateNumberWithPrefix(3,
-//                "JCZX/ZB-" + code + LimsDateUtil.resetDate(LocalDateTime.now()),
-//                InsOrder::getEntrustCode);
-//        insOrder.setExamineTime(LocalDateTime.now());
-//        insOrder.setEntrustCode(no);
-//        insOrder.setIsExemption(1);
-//        // 渚涘簲鍟嗗悕绉�
-//        insOrder.setProduction(ifsInventoryQuantity.getSupplierName());
-//        // 濮旀墭浜哄悕绉�
-//        insOrder.setPrepareUser(user.getName());
-//        insOrder.setPhone(user.getPhone());
-//        insOrder.setIfsInventoryId(ifsInventoryId);
-//        insOrder.setPartDetail(partDetail);
-//        insOrder.setSendTime(LocalDateTime.now());
-//        insOrder.setSample(ifsInventoryQuantity.getPartDesc());
-//        // 杩涘巶妫�楠�
-//        insOrder.setOrderType(InsOrderTypeConstants.ENTER_THE_FACTORY);
-//
-//        insOrderMapper.insert(insOrder);
-//
-//        // 娣诲姞宸ユ椂
-//        addAuxiliary(insOrder, ifsInventoryQuantity);
-//
-//        // todo: ifs鐩存帴绉诲簱
-//        insReportService.isRawMaterial(insOrder);
-//        return true;
-//    }
-//
-//    /**
-//     * 0, 鏃犳彁绀�, 1鎻愮ず  褰撳墠鎵规鐨勬牱鍝佸凡妫�楠岃繃, 鍙互鍏嶆, 2 鎻愮ず 褰撳墠鎵规鐨勬牱鍝佸凡瓒�20鍚�, 闇�瑕佸绾у娆℃楠�
-//     *
-//     * 鍘熸潗鏂欎笅鍗曢�氱煡鍏嶆鎴栬�呭娆℃楠�
-//     * @param ifsInventoryId
-//     * @return
-//     */
-//    @Override
-//    public int notificationRawOrder(Integer ifsInventoryId) {
-//        IfsInventoryQuantity ifsInventory = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
-//        // 鏌ヨ褰撳墠鎵规, 渚涘簲鍟�, 闆朵欢鍙风殑鍘熸潗鏂欐槸鍚﹁秴杩囦簡20鍚�, 瓒呰繃浜�20鍚ㄩ渶瑕佽繘琛屽娆℃楠屾彁閱�
-//        List<IfsInventoryQuantity> quantityList = ifsInventoryQuantityMapper.selectList(Wrappers.<IfsInventoryQuantity>lambdaQuery()
-//                .eq(IfsInventoryQuantity::getPartNo, ifsInventory.getPartNo())
-//                .eq(IfsInventoryQuantity::getUpdateBatchNo, ifsInventory.getUpdateBatchNo())
-//                .eq(IfsInventoryQuantity::getSupplierId, ifsInventory.getSupplierId())
-//                .eq(IfsInventoryQuantity::getSupplierName, ifsInventory.getSupplierName()));
-//
-//        // 鍒ゆ柇鏄惁澶т簬20鍚�
-//        BigDecimal bigDecimal = new BigDecimal("20000");
-//        BigDecimal count = BigDecimal.ZERO;
-//        for (IfsInventoryQuantity inventoryQuantity : quantityList) {
-//            // 鍒ゆ柇鍗曚綅鏄痥g鎴栬�卼
-//            if (inventoryQuantity.getBuyUnitMeas().equalsIgnoreCase("t")) {
-//                count = count.add(inventoryQuantity.getQtyArrived().multiply(new BigDecimal("1000")));
-//            } else if (inventoryQuantity.getBuyUnitMeas().equalsIgnoreCase("kg")) {
-//                count = count.add(inventoryQuantity.getQtyArrived());
-//            }
-//        }
-//
-//        if (count.compareTo(bigDecimal) >= 0) {
-//            return 2;
-//        } else {
-//            // 鍒ゆ柇涔嬪墠鏄惁鍑鸿繃鎶ュ憡, 鍑鸿繃鎶ュ憡鍙互鍏嶆
-//            int reportCount = ifsInventoryQuantityMapper.selectReportCountById(ifsInventoryId);
-//            if (reportCount > 0) {
-//                return 1;
-//            }
-//        }
-//        return 0;
-//    }
-//
-//    /**
-//     * 鎶ユ鍙互鏂板鎶ユ淇℃伅
-//     * @param ifsInventoryQuantity
-//     */
-//    @Override
-//    public void addIfsInventoryQuantity(IfsInventoryQuantity ifsInventoryQuantity) {
-//        ifsInventoryQuantity.setIsSource(0);
-//        ifsInventoryQuantity.setState(0);
-//        ifsInventoryQuantity.setIsFinish(0);
-//        ifsInventoryQuantityMapper.insert(ifsInventoryQuantity);
-//    }
-//
-//    @Override
-//    public void shiftingParking(List<Integer> ids) {
-//        for (Integer id : ids) {
-//            InsOrder order = insOrderService.getById(id);
-//            // todo: ifs鐩存帴绉诲簱
-//            insReportService.isRawMaterial(order);
-//        }
-//    }
-//
-//    /**
-//     * 閾滃崟涓濅笅鍗曞厤妫�
-//     * @param list
-//     * @param insOrder
-//     */
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public int addRawCopperOrderExemptionOrder(List<SampleProductDto> list, CopperInsOrderDto insOrder) {
-//        if (!insOrder.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY)) {
-//            throw new ErrorException("鍙湁杩涘巶妫�楠屾墠鑳藉厤妫�");
-//        }
-//        insOrder.setSendTime(LocalDateTime.now());
-//        // 淇敼璁㈠崟琛ㄧ洿鎺ヤ负宸叉楠�
-//        insOrder.setState(4);
-//        insOrder.setTypeSource(1);
-//
-//        String code = "Y";
-//        // 鐢熸垚缂栧彿
-//        String no = numberGenerator.generateNumberWithPrefix(3,
-//                "JCZX/ZB-" + code + LimsDateUtil.resetDate(LocalDateTime.now()),
-//                InsOrder::getEntrustCode);
-//
-//        insOrderMapper.insert(insOrder); // 涓昏〃
-//
-//        AtomicInteger count = new AtomicInteger();
-//        list.forEach(a -> {
-//            count.getAndIncrement();
-//            a.setId(null);
-//            a.setInsOrderId(insOrder.getId());
-//            if (StrUtil.isEmpty(a.getSampleCode())) {
-//                // 濡傛灉鍙湁涓�涓牱鍝佸氨涓嶉渶瑕佹嫾鎺ユ暟瀛�
-//                if (list.size() != 1) {
-//                    a.setSampleCode(no + "-" + count.get());
-//                } else {
-//                    a.setSampleCode(no);
-//                }
-//            }
-//            insSampleMapper.insert(a);
-//
-//            if (!CollectionUtil.isEmpty(a.getInsProduct())) {
-//                throw new ErrorException("鍏嶆涓嶉渶瑕佸~鍐欐楠岄」");
-//            }
-//        });
-//        // 娣诲姞鍘熸潗鏂欎俊鎭�
-//        IfsInventoryQuantity ifsInventoryQuantity = new IfsInventoryQuantity();
-//        // 鍩烘湰淇℃伅
-//        ifsInventoryQuantity.setIsSource(0);
-//        ifsInventoryQuantity.setState(2);
-//        ifsInventoryQuantity.setIsInspect(1);
-//        ifsInventoryQuantity.setIsFinish(1);
-//        ifsInventoryQuantity.setIsCopper(1);
-//        ifsInventoryQuantity.setInspectStatus(1);
-//        ifsInventoryQuantity.setIsQuarter(0);
-//
-//        ifsInventoryQuantity.setQtyArrived(insOrder.getQtyArrived());
-//        ifsInventoryQuantity.setBuyUnitMeas(insOrder.getBuyUnitMeas());
-//        ifsInventoryQuantity.setSupplierName(insOrder.getSupplierName());
-//        ifsInventoryQuantity.setUpdateBatchNo(insOrder.getUpdateBatchNo());
-//        ifsInventoryQuantity.setDeclareDate(insOrder.getDeclareDate());
-//
-//        ifsInventoryQuantityMapper.insert(ifsInventoryQuantity);
-//
-//        insOrder.setIfsInventoryId(ifsInventoryQuantity.getId());
-//        insOrder.setExamineTime(LocalDateTime.now());
-//
-//        insOrder.setEntrustCode(no);
-//        insOrder.setIsExemption(1);
-//
-//        insOrderMapper.updateById(insOrder);
-//
-//        // 娣诲姞宸ユ椂
-//        addAuxiliary(insOrder, ifsInventoryQuantity);
-//
-//        return insOrder.getId();
-//    }
-//
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public boolean concessionRelease(Integer ifsInventoryId) {
-//        // 鏌ヨ鍘熸潗鏂欎俊鎭�
-//        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
-//        if (!ifsInventoryQuantity.getInspectStatus().equals(2)) {
-//            throw new ErrorException("涓嶅悎鏍肩殑鍘熸潗鏂欐墠鑳借姝ユ斁琛�");
-//        }
-//
-//        // todo:闇�瑕佸垽鏂璷a娴佺▼鏄惁鏄姝ユ斁琛�
-//        String toLocation = insReportService.moveRawMaterial(ifsInventoryQuantity);
-//
-//        ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
-//                .set(IfsInventoryQuantity::getInspectStatus, 4)
-//                .set(IfsInventoryQuantity::getToLocation, toLocation)
-//                .eq(IfsInventoryQuantity::getId, ifsInventoryId));
-//
-//        return true;
-//    }
-//
-//    /**
-//     * 鍘熸潗鏂欒繘鍘傛挙閿�涓嬪崟
-//     * @param enterOrderId
-//     * @return
-//     */
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public boolean repealEnterRawOrder(Integer enterOrderId) {
-//        // 鏌ヨ璁㈠崟
-//        InsOrder order = insOrderMapper.selectById(enterOrderId);
-//
-//        // 鏌ヨ鍒ゆ柇鏄惁鏄摐鍗曚笣
-//        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(order.getIfsInventoryId());
-//        if (ifsInventoryQuantity.getIsCopper() != null && ifsInventoryQuantity.getIsCopper().equals(1)) {
-//            // 閾滃崟涓濈洿鎺ュ垹闄ゅ氨琛�
-//            ifsInventoryQuantityMapper.deleteById(order.getIfsInventoryId());
-//        } else {
-//            ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
-//                    .set(IfsInventoryQuantity::getState, 0)
-//                    .set(IfsInventoryQuantity::getIsQuarter, 1)
-//                    .eq(IfsInventoryQuantity::getId, order.getIfsInventoryId()));
-//        }
-//        insOrderService.update(Wrappers.<InsOrder>lambdaUpdate()
-//                .eq(InsOrder::getId, enterOrderId)
-//                .set(InsOrder::getState, -1)
-//                .set(InsOrder::getEntrustCode, ""));// 鎾ら攢
-//
-//        // 娓呴櫎涔嬪墠鐨勫伐鏃�
-//        auxiliaryOutputWorkingHoursMapper.delete(Wrappers.<AuxiliaryOutputWorkingHours>lambdaQuery()
-//                .eq(AuxiliaryOutputWorkingHours::getOrderId, enterOrderId));
-//
-//        // 娓呴櫎涔嬪墠鎶ュ憡
-//        insReportService.remove(Wrappers.<InsReport>lambdaQuery()
-//                .eq(InsReport::getInsOrderId, enterOrderId));
-//
-//        return true;
-//    }
-//
-//    /**
-//     * 鍘熸潗鏂欏搴︽挙閿�涓嬪崟
-//     * @param quarterOrderId
-//     * @return
-//     */
-//    @Override
-//    @Transactional(rollbackFor = Exception.class)
-//    public boolean repealQuarterRawOrder(Integer quarterOrderId) {
-//        // 鏌ヨ璁㈠崟
-//        InsOrder order = insOrderMapper.selectById(quarterOrderId);
-//
-//        Long count = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery()
-//                .eq(InsOrder::getIfsInventoryId, order.getIfsInventoryId())
-//                .ne(InsOrder::getState, -1)
-//                .eq(InsOrder::getOrderType, InsOrderTypeConstants.ENTER_THE_FACTORY)
-//                .ne(InsOrder::getId, order.getId()));
-//        // 鍒ゆ柇涔嬪墠鏄惁鏈夎繘鍘傛楠�, 娌℃湁闇�瑕佷慨鏀瑰師鏉愭枡淇℃伅
-//        if (count == 0) {
-//            ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
-//                    .set(IfsInventoryQuantity::getState, 0)
-//                    .set(IfsInventoryQuantity::getIsQuarter, 1)
-//                    .eq(IfsInventoryQuantity::getId, order.getIfsInventoryId()));
-//        } else {
-//            ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
-//                    .set(IfsInventoryQuantity::getIsQuarter, 1)
-//                    .eq(IfsInventoryQuantity::getId, order.getIfsInventoryId()));
-//        }
-//
-//        insOrderService.update(Wrappers.<InsOrder>lambdaUpdate()
-//                .eq(InsOrder::getId, quarterOrderId)
-//                .set(InsOrder::getState, -1)
-//                .set(InsOrder::getEntrustCode, ""));// 鎾ら攢
-//        auxiliaryOutputWorkingHoursMapper.delete(Wrappers.<AuxiliaryOutputWorkingHours>lambdaQuery()
-//                .eq(AuxiliaryOutputWorkingHours::getOrderId, quarterOrderId));
-//        // 娓呴櫎涔嬪墠鎶ュ憡
-//        insReportService.remove(Wrappers.<InsReport>lambdaQuery()
-//                .eq(InsReport::getInsOrderId, quarterOrderId));
-//        return true;
-//    }
-//
-//    /**
-//     * 鍘熸潗鏂欐姤妫�鍏ㄩ儴淇℃伅瀵煎嚭
-//     * @param ifsInventoryQuantityDto
-//     * @param response
-//     */
-//    @Override
-//    public void rawAllExport(IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto, HttpServletResponse response) throws UnsupportedEncodingException {
-//        //鏌ヨ瀵煎嚭鐨勮垂鐢ㄧ粺璁℃暟鎹�
-//        String beginDeclareDate = ifsInventoryQuantityDto.getBeginDeclareDate();
-//        String endDeclareDate = ifsInventoryQuantityDto.getEndDeclareDate();
-//        ifsInventoryQuantityDto.setBeginDeclareDate(null);
-//        ifsInventoryQuantityDto.setEndDeclareDate(null);
-//        List<IfsInventoryQuantitySupplierDto> ifsByOverList = standardTreeMapper.getIfsByOverList(QueryWrappers.queryWrappers(ifsInventoryQuantityDto), beginDeclareDate, endDeclareDate);
-//
-//        for (IfsInventoryQuantitySupplierDto dto : ifsByOverList) {
-//            dto.setSendTimeString(dto.getSendTime() == null ? "" : dto.getSendTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
-//            dto.setReceiverDateString(dto.getReceiverDate() == null ? "" : dto.getReceiverDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
-//            dto.setDeclareDateString(dto.getDeclareDate() == null ? "" : dto.getDeclareDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
-//            switch (dto.getInspectStatus()) {
-//                case 1:
-//                    dto.setInspectStatusString("鍚堟牸");
-//                    break;
-//                case 2:
-//                    dto.setInspectStatusString("涓嶅悎鏍�");
-//                    // 鏌ヨ涓嶅悎鏍奸」
-//                    List<String> unqualifiedList = insProductMapper.selectUnqualifiedList(dto.getEnterOrderId() == null ? dto.getQuarterOrderId() : dto.getEnterOrderId());
-//                    dto.setUnqualifiedItem(CollUtil.join(unqualifiedList, ","));
-//                    break;
-//                case 3:
-//                    dto.setInspectStatusString("鏈笅鍗�");
-//                    break;
-//                case 4:
-//                    dto.setInspectStatusString("璁╂鏀捐");
-//                    break;
-//                case 0:
-//                    dto.setInspectStatusString("妫�楠屼腑");
-//                    break;
-//
-//            }
-//        }
-//
-//
-//        response.setContentType("application/vnd.ms-excel");
-//        response.setCharacterEncoding("UTF-8");
-//        // 杩欓噷URLEncoder.encode鍙互闃叉涓枃涔辩爜 褰撶劧鍜宔asyexcel娌℃湁鍏崇郴
-//        String fileName = URLEncoder.encode("鍘熸潗鏂欐娴嬩俊鎭鍑�", "UTF-8");
-//        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
-//        try {
-//            //鏂板缓ExcelWriter
-//            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
-//            //鑾峰彇sheet0瀵硅薄
-//            WriteSheet mainSheet = EasyExcel.writerSheet(0, "鍘熸潗鏂欐娴嬩俊鎭鍑�").head(IfsInventoryQuantitySupplierDto.class).build();
-//
-//            //鍚憇heet0鍐欏叆鏁版嵁 浼犲叆绌簂ist杩欐牱鍙鍑鸿〃澶�
-//            excelWriter.write(ifsByOverList, mainSheet);
-//            //鍏抽棴娴�
-//            excelWriter.finish();
-//        } catch (IOException e) {
-//            throw new RuntimeException("瀵煎嚭澶辫触");
-//        }
-//    }
-//
-//    /**
-//     * 鍘熸潗鏂欐煡璇㈠彲浠ュ搴︽楠岀殑鍐呭
-//     * @param page
-//     * @param ifsInventoryQuantityDto
-//     * @return
-//     */
-//    @Override
-//    public IPage<IfsInventoryQuantitySupplierDto> getIfsByQuarter(Page page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto) {
-//
-//        // todo: 鍙湅鎴�
-//        String beginDeclareDate = ifsInventoryQuantityDto.getBeginDeclareDate();
-//        String endDeclareDate = ifsInventoryQuantityDto.getEndDeclareDate();
-//        ifsInventoryQuantityDto.setBeginDeclareDate(null);
-//        ifsInventoryQuantityDto.setEndDeclareDate(null);
-//
-//        return standardTreeMapper.getIfsByQuarter(page, QueryWrappers.queryWrappers(ifsInventoryQuantityDto), beginDeclareDate, endDeclareDate);
-//    }
-//
-//    /**
-//     * 鎻愬墠鍏ュ簱
-//     * @param ifsInventoryId
-//     * @return
-//     */
-//    @Override
-//    public boolean advancedGodown(Integer ifsInventoryId) {
-//        // 鏌ヨ鍘熸潗鏂欎俊鎭�
-//        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
-//        if (!ifsInventoryQuantity.getInspectStatus().equals(0)
-//                && !ifsInventoryQuantity.getInspectStatus().equals(3)) {
-//            throw new ErrorException("鏈娴嬪畬鎴愭暟鎹墠鑳芥彁鍓嶅叆搴�");
-//        }
-//
-//        // todo:闇�瑕佸垽鏂璷a娴佺▼鏄惁鏄姝ユ斁琛�
-//        String toLocation = insReportService.moveRawMaterial(ifsInventoryQuantity);
-//
-//        ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
-//                .set(IfsInventoryQuantity::getInspectStatus, 1)
-//                .set(IfsInventoryQuantity::getIsFinish, 1)
-//                .set(IfsInventoryQuantity::getToLocation, toLocation)
-//                .eq(IfsInventoryQuantity::getId, ifsInventoryId));
-//
-//        return true;
-//    }
-//
-//
-//    /**
-//     * 娣诲姞宸ユ椂
-//     * @param insOrder
-//     * @param ifsInventoryQuantity
-//     */
-//    private void addAuxiliary(InsOrder insOrder, IfsInventoryQuantity ifsInventoryQuantity) {
-//        AuxiliaryOutputWorkingHours auxiliaryOutputWorkingHours = new AuxiliaryOutputWorkingHours();
-//        auxiliaryOutputWorkingHours.setInspectionItemClass(ifsInventoryQuantity.getUpdateBatchNo() + "鍏嶆");//妫�娴嬮」鍒嗙被
-//        auxiliaryOutputWorkingHours.setSample(insOrder.getEntrustCode());//鏍峰搧缂栧彿
-//        auxiliaryOutputWorkingHours.setOrderId(insOrder.getId());//璁㈠崟id
-//        auxiliaryOutputWorkingHours.setOrderNo(insOrder.getEntrustCode());//闈炲姞鐝鎵樺崟鍙�
-//
-//        // 鍏嶆榛樿2
-//        auxiliaryOutputWorkingHours.setWorkTime(new BigDecimal("2"));//闈炲姞鐝伐鏃�
-//        auxiliaryOutputWorkingHours.setAmount(1);//闈炲姞鐝暟閲�
-//        auxiliaryOutputWorkingHours.setOutputWorkTime((ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getOvertimeWorkTime()) ? auxiliaryOutputWorkingHours.getOvertimeWorkTime() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getWorkTime()) ? auxiliaryOutputWorkingHours.getWorkTime() : BigDecimal.ZERO));//浜ч噺宸ユ椂
-//        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(SecurityUtils.getUserId().intValue());//妫�娴嬩汉
-//        auxiliaryOutputWorkingHours.setPrice(new BigDecimal("1"));//鍗曚环
-//
-//        auxiliaryOutputWorkingHoursMapper.insert(auxiliaryOutputWorkingHours);
-//    }
-//
-//    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 "鏈煡";
-//        }
-//    }
-//}
+package com.ruoyi.inspect.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelWriter;
+import com.alibaba.excel.write.metadata.WriteSheet;
+import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.basic.dto.*;
+import com.ruoyi.basic.pojo.IfsInventoryQuantity;
+import com.ruoyi.common.constant.InsOrderTypeConstants;
+import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.properties.WechatProperty;
+import com.ruoyi.common.utils.LimsDateUtil;
+import com.ruoyi.common.utils.QueryWrappers;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.WxCpUtils;
+import com.ruoyi.inspect.dto.CopperInsOrderDto;
+import com.ruoyi.inspect.dto.RawMaterialStandardTreeDto;
+import com.ruoyi.basic.mapper.IfsInventoryQuantityMapper;
+import com.ruoyi.basic.mapper.StandardTreeMapper;
+import com.ruoyi.inspect.dto.SampleProductDto;
+import com.ruoyi.inspect.mapper.InsOrderMapper;
+import com.ruoyi.inspect.mapper.InsProductMapper;
+import com.ruoyi.inspect.mapper.InsSampleMapper;
+import com.ruoyi.inspect.pojo.InsOrder;
+import com.ruoyi.inspect.pojo.InsReport;
+import com.ruoyi.inspect.service.InsOrderService;
+import com.ruoyi.inspect.service.InsReportService;
+import com.ruoyi.inspect.service.RawMaterialOrderService;
+import com.ruoyi.common.numgen.NumberGenerator;
+import com.ruoyi.framework.exception.ErrorException;
+import com.ruoyi.performance.mapper.AuxiliaryOutputWorkingHoursMapper;
+import com.ruoyi.performance.pojo.AuxiliaryOutputWorkingHours;
+import com.ruoyi.system.mapper.UserMapper;
+import lombok.AllArgsConstructor;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * @Author zhuo
+ * @Date 2024/7/31
+ */
+@Service
+@AllArgsConstructor
+public class RawMaterialOrderServiceImpl implements RawMaterialOrderService {
+
+    private StandardTreeMapper standardTreeMapper;
+    private IfsInventoryQuantityMapper ifsInventoryQuantityMapper;
+    private UserMapper userMapper;
+    private InsOrderService insOrderService;
+    private InsOrderMapper insOrderMapper;
+    private InsSampleMapper insSampleMapper;
+    private final NumberGenerator<InsOrder> numberGenerator;
+    private InsReportService insReportService;
+    private WechatProperty wechatProperty;
+    private ThreadPoolTaskExecutor threadPoolTaskExecutor;
+    private InsProductMapper insProductMapper;
+    private AuxiliaryOutputWorkingHoursMapper auxiliaryOutputWorkingHoursMapper;
+
+
+    @Override
+    public RawMaterialStandardTreeDto selectStandardTreeListByPartNo(String partNo) {
+        if (StringUtils.isBlank(partNo)) {
+            throw new ErrorException("闆朵欢鍙蜂涪澶�");
+        }
+        List<FactoryDto> factoryDtos = standardTreeMapper.selectStandardTreeListByPartNo(partNo);
+        if (CollectionUtil.isEmpty(factoryDtos)) {
+            throw new ErrorException("闆朵欢鍙蜂负" + partNo + "鐨勫師鏉愭枡娌℃湁瀵瑰簲鐨勬爣鍑嗗簱閰嶇疆");
+        }
+        RawMaterialStandardTreeDto rawMaterialStandardTreeDto = new RawMaterialStandardTreeDto();
+        for (FactoryDto factoryDto : factoryDtos) {
+            for (LaboratoryDto laboratoryDto : factoryDto.getChildren()) {
+                for (SampleTypeDto sampleTypeDto : laboratoryDto.getChildren()) {
+                    if (sampleTypeDto.getChildren().size() == 0) {
+                        sampleTypeDto.setChildren(standardTreeMapper.getStandardTree3(sampleTypeDto.getValue()));
+                    }
+                    // 鍒ゆ柇缁戝畾鐨勬槸鍚︽槸褰撳墠闆朵欢鍙�
+                    if (sampleTypeDto.getPartNo() != null && sampleTypeDto.getPartNo().equals(partNo)) {
+                        // 娣诲姞瀵硅薄
+                        rawMaterialStandardTreeDto.setTreeName(factoryDto.getValue() + "-"
+                                + laboratoryDto.getValue() + "-"
+                                + sampleTypeDto.getValue());
+                        rawMaterialStandardTreeDto.setCode(sampleTypeDto.getCode());
+                        rawMaterialStandardTreeDto.setLabel(sampleTypeDto.getLabel());
+                        rawMaterialStandardTreeDto.setValue(sampleTypeDto.getValue());
+                        rawMaterialStandardTreeDto.setChildren1(sampleTypeDto.getChildren());
+                    } else {
+                        for (SampleDto sampleDto : sampleTypeDto.getChildren()) {
+                            if (sampleDto.getPartNo() != null && sampleDto.getPartNo().equals(partNo)) {
+                                // 娣诲姞瀵硅薄
+                                rawMaterialStandardTreeDto.setTreeName(factoryDto.getValue() + "-"
+                                        + laboratoryDto.getValue() + "-"
+                                        + sampleTypeDto.getValue() + "-"
+                                        + sampleDto.getValue());
+                                rawMaterialStandardTreeDto.setCode(sampleDto.getCode());
+                                rawMaterialStandardTreeDto.setLabel(sampleDto.getLabel());
+                                rawMaterialStandardTreeDto.setValue(sampleDto.getValue());
+                                rawMaterialStandardTreeDto.setChildren2(sampleDto.getChildren());
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return rawMaterialStandardTreeDto;
+    }
+
+    @Override
+    public IPage<IfsInventoryQuantity> getWarehouseSubmit(IPage<IfsInventoryQuantity> page, IfsInventoryQuantity ifsInventoryQuantity) {
+        return standardTreeMapper.selectIfsPage(page, QueryWrappers.queryWrappers(ifsInventoryQuantity));
+    }
+
+    @Override
+    public IPage<IfsInventoryQuantityDto> getIfsByStateOne(IPage<IfsInventoryQuantityDto> page, IfsInventoryQuantityDto ifsInventoryQuantityDto) {
+        return standardTreeMapper.getIfsByStateOne(page, QueryWrappers.queryWrappers(ifsInventoryQuantityDto));
+    }
+
+
+    /**
+     * 鎶ユ
+     * @param ids
+     * @return
+     */
+    @Override
+    public int inspectionReport(List<Integer> ids) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
+                .in(IfsInventoryQuantity::getId, ids)
+                .set(IfsInventoryQuantity::getDeclareUser, userMapper.selectById(userId).getName())
+                .set(IfsInventoryQuantity::getDeclareUserId, userId)
+                .set(IfsInventoryQuantity::getIsInspect, 1)
+                .set(IfsInventoryQuantity::getDeclareDate, LocalDateTime.now())
+        );
+        threadPoolTaskExecutor.execute(() -> {
+            List<IfsInventoryQuantity> quantityList = ifsInventoryQuantityMapper.selectList(Wrappers.<IfsInventoryQuantity>lambdaQuery()
+                    .in(IfsInventoryQuantity::getId, ids));
+            // 浼佷笟寰俊閫氱煡
+            String message = "";
+            message += "鏂板鎶ユ閫氱煡";
+            for (IfsInventoryQuantity inventoryQuantity : quantityList) {
+                message += "\n鎵规鍙�: " + inventoryQuantity.getUpdateBatchNo();
+                message += "\n闆朵欢鎻忚堪: " + inventoryQuantity.getPartDesc();
+                message += "\n鎶佃揪鏁伴噺: " + inventoryQuantity.getQtyArrived().stripTrailingZeros().toPlainString() + inventoryQuantity.getBuyUnitMeas();
+
+                // 鍒ゆ柇鏈夋病鏈夊埌20鍚�. 鎴栬�呰兘鍚﹀厤妫�
+                int result = notificationRawOrder(inventoryQuantity.getId());
+                switch (result) {
+                    case 1:
+                        message += "\n褰撳墠鏍峰搧宸叉楠岃繃, 鍙互鍏嶆";
+                        break;
+                    case 2:
+                        message += "\n褰撳墠鏍峰搧宸茶秴杩�20鍚�";
+                        break;
+                }
+                message += "\n";
+            }
+            WxCpUtils.informWebHook(wechatProperty.getExaminingUrl(), message);
+        });
+        return 1;
+    }
+
+    /**
+     * 鎾ら攢鎶ユ
+     * @param id
+     * @return
+     */
+    @Override
+    public int revokeInspectionReport(Integer id) {
+        return ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
+                .eq(IfsInventoryQuantity::getId, id)
+                .set(IfsInventoryQuantity::getIsInspect, 0)
+        );
+    }
+
+    /**
+     * 鎵撳嵃鏍囩鏌ヨ
+     * @param ids
+     * @return
+     */
+    @Override
+    public List<IfsInventoryQuantityDto> printLabel(List<Integer> ids) {
+        return ifsInventoryQuantityMapper.printLabel(ids);
+    }
+
+    /**
+     * 鎶ユ
+     * @param ifsInventoryQuantity
+     * @return
+     */
+    @Override
+    public int inspectionReportOne(IfsInventoryQuantity ifsInventoryQuantity) {
+        Integer userId = SecurityUtils.getUserId().intValue();
+        ifsInventoryQuantityMapper.update(null, Wrappers.<IfsInventoryQuantity>lambdaUpdate()
+                .eq(IfsInventoryQuantity::getId, ifsInventoryQuantity.getId())
+                .set(IfsInventoryQuantity::getDeclareUser, userMapper.selectById(userId).getName())
+                .set(IfsInventoryQuantity::getDeclareUserId, userId)
+                .set(IfsInventoryQuantity::getIsInspect, 1)
+                .set(IfsInventoryQuantity::getDeclareDate, LocalDateTime.now())
+                .set(IfsInventoryQuantity::getUpdateBatchNo, ifsInventoryQuantity.getUpdateBatchNo())
+        );
+
+        threadPoolTaskExecutor.execute(() -> {
+            IfsInventoryQuantity inventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsInventoryQuantity.getId());
+            // 浼佷笟寰俊閫氱煡
+            String message = "";
+            message += "鏂板鎶ユ閫氱煡";
+            message += "\n鎵规鍙�: " + inventoryQuantity.getUpdateBatchNo();
+            message += "\n闆朵欢鎻忚堪: " + inventoryQuantity.getPartDesc();
+            message += "\n鎶佃揪鏁伴噺: " + inventoryQuantity.getQtyArrived().stripTrailingZeros().toPlainString() + inventoryQuantity.getBuyUnitMeas();
+            WxCpUtils.informWebHook(wechatProperty.getExaminingUrl(), message);
+        });
+        return 1;
+    }
+
+    /**
+     * 鑾峰彇閾滀骇涓氶摼妫�娴嬫暟鎹�
+     * @param id
+     * @return
+     */
+    @Override
+    public String getIndustryChain(Integer id) {
+        return ifsInventoryQuantityMapper.selectById(id).getIndustryChain();
+    }
+
+    /**
+     * 鍘熸潗鏂欐挙閿�鎺ュ彛
+     * @param ifsInventoryId
+     * @return
+     */
+    @Override
+    public boolean repealRawOrder(Integer ifsInventoryId) {
+        // 鏌ヨ鍒ゆ柇鏄惁鏄摐鍗曚笣
+        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
+        if (ifsInventoryQuantity.getIsCopper() != null && ifsInventoryQuantity.getIsCopper().equals(1)) {
+            // 閾滃崟涓濈洿鎺ュ垹闄ゅ氨琛�
+            ifsInventoryQuantityMapper.deleteById(ifsInventoryId);
+        } else {
+            ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
+                    .set(IfsInventoryQuantity::getState, 0)
+                    .set(IfsInventoryQuantity::getIsQuarter, 1)
+                    .eq(IfsInventoryQuantity::getId, ifsInventoryId));
+        }
+
+        insOrderService.update(Wrappers.<InsOrder>lambdaUpdate()
+                .eq(InsOrder::getIfsInventoryId, ifsInventoryId)
+                .set(InsOrder::getState, -1)
+                .set(InsOrder::getEntrustCode, ""));// 鎾ら攢
+        return true;
+    }
+
+    /**
+     * 鍘熸潗鏂欏厤妫�涓嬪崟
+     * @param list
+     * @param insOrder
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int addExemptionOrder(List<SampleProductDto> list, InsOrder insOrder) {
+        if (!insOrder.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY)) {
+            throw new ErrorException("鍙湁杩涘巶妫�楠屾墠鑳藉厤妫�");
+        }
+        insOrder.setSendTime(LocalDateTime.now());
+        // 淇敼璁㈠崟琛ㄧ洿鎺ヤ负宸叉楠�
+        insOrder.setState(4);
+        insOrder.setTypeSource(1);
+
+        String code = "Y";
+        // 鐢熸垚缂栧彿
+        String no = numberGenerator.generateNumberWithPrefix(3,
+                "JCZX/ZB-" + code + LimsDateUtil.resetDate(LocalDateTime.now()),
+                InsOrder::getEntrustCode);
+
+        insOrderMapper.insert(insOrder); // 涓昏〃
+
+        AtomicInteger count = new AtomicInteger();
+        list.forEach(a -> {
+            count.getAndIncrement();
+            a.setId(null);
+            a.setInsOrderId(insOrder.getId());
+            if (StrUtil.isEmpty(a.getSampleCode())) {
+                // 濡傛灉鍙湁涓�涓牱鍝佸氨涓嶉渶瑕佹嫾鎺ユ暟瀛�
+                if (list.size() != 1) {
+                    a.setSampleCode(no + "-" + count.get());
+                } else {
+                    a.setSampleCode(no);
+                }
+            }
+            insSampleMapper.insert(a);
+
+            if (!CollectionUtil.isEmpty(a.getInsProduct())) {
+                throw new ErrorException("鍏嶆涓嶉渶瑕佸~鍐欐楠岄」");
+            }
+        });
+
+        // 鍘熸潗鏂欎笅鍗�: 濮旀墭浜哄氨鏄姤妫�浜�, 鐢熶骇鍗曚綅灏辨槸渚涘簲鍟嗗崟浣�
+        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(insOrder.getIfsInventoryId());
+        Integer declareUserId = ifsInventoryQuantity.getDeclareUserId();
+        User user = userMapper.selectById(declareUserId);
+        // 渚涘簲鍟嗗悕绉�
+        insOrder.setProduction(ifsInventoryQuantity.getSupplierName());
+        // 濮旀墭浜哄悕绉�
+        insOrder.setPrepareUser(user.getName());
+        insOrder.setPhone(user.getPhone());
+
+        // 淇敼鍘熸潗鏂欐暟鎹洿鎺ヤ负宸叉楠�
+        ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>().set(IfsInventoryQuantity::getState, 2)
+                .eq(IfsInventoryQuantity::getId, insOrder.getIfsInventoryId()));
+
+        insOrder.setExamineTime(LocalDateTime.now());
+
+        insOrder.setEntrustCode(no);
+        insOrder.setIsExemption(1);
+
+        insOrderMapper.updateById(insOrder);
+
+        // 娣诲姞宸ユ椂
+        addAuxiliary(insOrder, ifsInventoryQuantity);
+
+        // todo: ifs鐩存帴绉诲簱
+        insReportService.isRawMaterial(insOrder);
+
+        return insOrder.getId();
+    }
+
+
+    /**
+     * 鏌ヨ寰呬笅鍗�
+     * @param page
+     * @param ifsInventoryQuantity
+     * @return
+     */
+    @Override
+    public IPage<IfsInventoryQuantityCheckDto> selectIfsInventoryQuantity(Page<IfsInventoryQuantityCheckDto> page, IfsInventoryQuantityCheckDto ifsInventoryQuantity) {
+        return standardTreeMapper.selectIfsInventoryQuantity(page, QueryWrappers.queryWrappers(ifsInventoryQuantity));
+    }
+
+    /**
+     * 鏌ヨ宸叉楠�
+     * @param page
+     * @param ifsInventoryQuantityDto
+     * @return
+     */
+    @Override
+    public IPage<IfsInventoryQuantitySupplierDto> getIfsByOver(Page<IfsInventoryQuantitySupplierDto> page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto) {
+        // todo: 鍙湅鎴�
+        String beginDeclareDate = ifsInventoryQuantityDto.getBeginDeclareDate();
+        String endDeclareDate = ifsInventoryQuantityDto.getEndDeclareDate();
+        ifsInventoryQuantityDto.setBeginDeclareDate(null);
+        ifsInventoryQuantityDto.setEndDeclareDate(null);
+
+        return standardTreeMapper.getIfsByOver(page, QueryWrappers.queryWrappers(ifsInventoryQuantityDto), beginDeclareDate, endDeclareDate);
+    }
+
+    /**
+     * 鍒犻櫎鍘熸潗鏂欐姤妫�淇℃伅
+     * @param id
+     * @return
+     */
+    @Override
+    public int delIfsInventory(Integer id) {
+        return ifsInventoryQuantityMapper.deleteById(id);
+    }
+
+    /**
+     * 鍘熸潗鏂欐斁琛屽厤妫�
+     * @param ifsInventoryId
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean rawOrderRelease(Integer ifsInventoryId, String partDetail) {
+        // 淇敼鍘熸潗鏂欐暟鎹洿鎺ヤ负宸叉楠�
+        ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
+                .set(IfsInventoryQuantity::getState, 2)
+                .set(IfsInventoryQuantity::getIsQuarter, 0)
+                .eq(IfsInventoryQuantity::getId, ifsInventoryId));
+
+        // 鏌ヨ鍘熸潗鏂欎俊鎭�
+        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
+        // 濮旀墭浜哄氨鏄姤妫�浜�, 鐢熶骇鍗曚綅灏辨槸渚涘簲鍟嗗崟浣�
+        Integer declareUserId = ifsInventoryQuantity.getDeclareUserId();
+        User user = userMapper.selectById(declareUserId);
+
+        InsOrder insOrder = new InsOrder();
+        insOrder.setState(4);
+        insOrder.setTypeSource(1);
+        String code = "Y";
+        // 鐢熸垚缂栧彿
+        String no = numberGenerator.generateNumberWithPrefix(3,
+                "JCZX/ZB-" + code + LimsDateUtil.resetDate(LocalDateTime.now()),
+                InsOrder::getEntrustCode);
+        insOrder.setExamineTime(LocalDateTime.now());
+        insOrder.setEntrustCode(no);
+        insOrder.setIsExemption(1);
+        // 渚涘簲鍟嗗悕绉�
+        insOrder.setProduction(ifsInventoryQuantity.getSupplierName());
+        // 濮旀墭浜哄悕绉�
+        insOrder.setPrepareUser(user.getName());
+        insOrder.setPhone(user.getPhone());
+        insOrder.setIfsInventoryId(ifsInventoryId);
+        insOrder.setPartDetail(partDetail);
+        insOrder.setSendTime(LocalDateTime.now());
+        insOrder.setSample(ifsInventoryQuantity.getPartDesc());
+        // 杩涘巶妫�楠�
+        insOrder.setOrderType(InsOrderTypeConstants.ENTER_THE_FACTORY);
+
+        insOrderMapper.insert(insOrder);
+
+        // 娣诲姞宸ユ椂
+        addAuxiliary(insOrder, ifsInventoryQuantity);
+
+        // todo: ifs鐩存帴绉诲簱
+        insReportService.isRawMaterial(insOrder);
+        return true;
+    }
+
+    /**
+     * 0, 鏃犳彁绀�, 1鎻愮ず  褰撳墠鎵规鐨勬牱鍝佸凡妫�楠岃繃, 鍙互鍏嶆, 2 鎻愮ず 褰撳墠鎵规鐨勬牱鍝佸凡瓒�20鍚�, 闇�瑕佸绾у娆℃楠�
+     *
+     * 鍘熸潗鏂欎笅鍗曢�氱煡鍏嶆鎴栬�呭娆℃楠�
+     * @param ifsInventoryId
+     * @return
+     */
+    @Override
+    public int notificationRawOrder(Integer ifsInventoryId) {
+        IfsInventoryQuantity ifsInventory = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
+        // 鏌ヨ褰撳墠鎵规, 渚涘簲鍟�, 闆朵欢鍙风殑鍘熸潗鏂欐槸鍚﹁秴杩囦簡20鍚�, 瓒呰繃浜�20鍚ㄩ渶瑕佽繘琛屽娆℃楠屾彁閱�
+        List<IfsInventoryQuantity> quantityList = ifsInventoryQuantityMapper.selectList(Wrappers.<IfsInventoryQuantity>lambdaQuery()
+                .eq(IfsInventoryQuantity::getPartNo, ifsInventory.getPartNo())
+                .eq(IfsInventoryQuantity::getUpdateBatchNo, ifsInventory.getUpdateBatchNo())
+                .eq(IfsInventoryQuantity::getSupplierId, ifsInventory.getSupplierId())
+                .eq(IfsInventoryQuantity::getSupplierName, ifsInventory.getSupplierName()));
+
+        // 鍒ゆ柇鏄惁澶т簬20鍚�
+        BigDecimal bigDecimal = new BigDecimal("20000");
+        BigDecimal count = BigDecimal.ZERO;
+        for (IfsInventoryQuantity inventoryQuantity : quantityList) {
+            // 鍒ゆ柇鍗曚綅鏄痥g鎴栬�卼
+            if (inventoryQuantity.getBuyUnitMeas().equalsIgnoreCase("t")) {
+                count = count.add(inventoryQuantity.getQtyArrived().multiply(new BigDecimal("1000")));
+            } else if (inventoryQuantity.getBuyUnitMeas().equalsIgnoreCase("kg")) {
+                count = count.add(inventoryQuantity.getQtyArrived());
+            }
+        }
+
+        if (count.compareTo(bigDecimal) >= 0) {
+            return 2;
+        } else {
+            // 鍒ゆ柇涔嬪墠鏄惁鍑鸿繃鎶ュ憡, 鍑鸿繃鎶ュ憡鍙互鍏嶆
+            int reportCount = ifsInventoryQuantityMapper.selectReportCountById(ifsInventoryId);
+            if (reportCount > 0) {
+                return 1;
+            }
+        }
+        return 0;
+    }
+
+    /**
+     * 鎶ユ鍙互鏂板鎶ユ淇℃伅
+     * @param ifsInventoryQuantity
+     */
+    @Override
+    public void addIfsInventoryQuantity(IfsInventoryQuantity ifsInventoryQuantity) {
+        ifsInventoryQuantity.setIsSource(0);
+        ifsInventoryQuantity.setState(0);
+        ifsInventoryQuantity.setIsFinish(0);
+        ifsInventoryQuantityMapper.insert(ifsInventoryQuantity);
+    }
+
+
+    /**
+     * 閾滃崟涓濅笅鍗曞厤妫�
+     * @param list
+     * @param insOrder
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int addRawCopperOrderExemptionOrder(List<SampleProductDto> list, CopperInsOrderDto insOrder) {
+        if (!insOrder.getOrderType().equals(InsOrderTypeConstants.ENTER_THE_FACTORY)) {
+            throw new ErrorException("鍙湁杩涘巶妫�楠屾墠鑳藉厤妫�");
+        }
+        insOrder.setSendTime(LocalDateTime.now());
+        // 淇敼璁㈠崟琛ㄧ洿鎺ヤ负宸叉楠�
+        insOrder.setState(4);
+        insOrder.setTypeSource(1);
+
+        String code = "Y";
+        // 鐢熸垚缂栧彿
+        String no = numberGenerator.generateNumberWithPrefix(3,
+                "JCZX/ZB-" + code + LimsDateUtil.resetDate(LocalDateTime.now()),
+                InsOrder::getEntrustCode);
+
+        insOrderMapper.insert(insOrder); // 涓昏〃
+
+        AtomicInteger count = new AtomicInteger();
+        list.forEach(a -> {
+            count.getAndIncrement();
+            a.setId(null);
+            a.setInsOrderId(insOrder.getId());
+            if (StrUtil.isEmpty(a.getSampleCode())) {
+                // 濡傛灉鍙湁涓�涓牱鍝佸氨涓嶉渶瑕佹嫾鎺ユ暟瀛�
+                if (list.size() != 1) {
+                    a.setSampleCode(no + "-" + count.get());
+                } else {
+                    a.setSampleCode(no);
+                }
+            }
+            insSampleMapper.insert(a);
+
+            if (!CollectionUtil.isEmpty(a.getInsProduct())) {
+                throw new ErrorException("鍏嶆涓嶉渶瑕佸~鍐欐楠岄」");
+            }
+        });
+        // 娣诲姞鍘熸潗鏂欎俊鎭�
+        IfsInventoryQuantity ifsInventoryQuantity = new IfsInventoryQuantity();
+        // 鍩烘湰淇℃伅
+        ifsInventoryQuantity.setIsSource(0);
+        ifsInventoryQuantity.setState(2);
+        ifsInventoryQuantity.setIsInspect(1);
+        ifsInventoryQuantity.setIsFinish(1);
+        ifsInventoryQuantity.setIsCopper(1);
+        ifsInventoryQuantity.setInspectStatus(1);
+        ifsInventoryQuantity.setIsQuarter(0);
+
+        ifsInventoryQuantity.setQtyArrived(insOrder.getQtyArrived());
+        ifsInventoryQuantity.setBuyUnitMeas(insOrder.getBuyUnitMeas());
+        ifsInventoryQuantity.setSupplierName(insOrder.getSupplierName());
+        ifsInventoryQuantity.setUpdateBatchNo(insOrder.getUpdateBatchNo());
+        ifsInventoryQuantity.setDeclareDate(insOrder.getDeclareDate());
+
+        ifsInventoryQuantityMapper.insert(ifsInventoryQuantity);
+
+        insOrder.setIfsInventoryId(ifsInventoryQuantity.getId());
+        insOrder.setExamineTime(LocalDateTime.now());
+
+        insOrder.setEntrustCode(no);
+        insOrder.setIsExemption(1);
+
+        insOrderMapper.updateById(insOrder);
+
+        // 娣诲姞宸ユ椂
+        addAuxiliary(insOrder, ifsInventoryQuantity);
+
+        return insOrder.getId();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean concessionRelease(Integer ifsInventoryId) {
+        // 鏌ヨ鍘熸潗鏂欎俊鎭�
+        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
+        if (!ifsInventoryQuantity.getInspectStatus().equals(2)) {
+            throw new ErrorException("涓嶅悎鏍肩殑鍘熸潗鏂欐墠鑳借姝ユ斁琛�");
+        }
+
+        // todo:闇�瑕佸垽鏂璷a娴佺▼鏄惁鏄姝ユ斁琛�
+        String toLocation = insReportService.moveRawMaterial(ifsInventoryQuantity);
+
+        ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
+                .set(IfsInventoryQuantity::getInspectStatus, 4)
+                .set(IfsInventoryQuantity::getToLocation, toLocation)
+                .eq(IfsInventoryQuantity::getId, ifsInventoryId));
+
+        return true;
+    }
+
+    /**
+     * 鍘熸潗鏂欒繘鍘傛挙閿�涓嬪崟
+     * @param enterOrderId
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean repealEnterRawOrder(Integer enterOrderId) {
+        // 鏌ヨ璁㈠崟
+        InsOrder order = insOrderMapper.selectById(enterOrderId);
+
+        // 鏌ヨ鍒ゆ柇鏄惁鏄摐鍗曚笣
+        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(order.getIfsInventoryId());
+        if (ifsInventoryQuantity.getIsCopper() != null && ifsInventoryQuantity.getIsCopper().equals(1)) {
+            // 閾滃崟涓濈洿鎺ュ垹闄ゅ氨琛�
+            ifsInventoryQuantityMapper.deleteById(order.getIfsInventoryId());
+        } else {
+            ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
+                    .set(IfsInventoryQuantity::getState, 0)
+                    .set(IfsInventoryQuantity::getIsQuarter, 1)
+                    .eq(IfsInventoryQuantity::getId, order.getIfsInventoryId()));
+        }
+        insOrderService.update(Wrappers.<InsOrder>lambdaUpdate()
+                .eq(InsOrder::getId, enterOrderId)
+                .set(InsOrder::getState, -1)
+                .set(InsOrder::getEntrustCode, ""));// 鎾ら攢
+
+        // 娓呴櫎涔嬪墠鐨勫伐鏃�
+        auxiliaryOutputWorkingHoursMapper.delete(Wrappers.<AuxiliaryOutputWorkingHours>lambdaQuery()
+                .eq(AuxiliaryOutputWorkingHours::getOrderId, enterOrderId));
+
+        // 娓呴櫎涔嬪墠鎶ュ憡
+        insReportService.remove(Wrappers.<InsReport>lambdaQuery()
+                .eq(InsReport::getInsOrderId, enterOrderId));
+
+        return true;
+    }
+
+    /**
+     * 鍘熸潗鏂欏搴︽挙閿�涓嬪崟
+     * @param quarterOrderId
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean repealQuarterRawOrder(Integer quarterOrderId) {
+        // 鏌ヨ璁㈠崟
+        InsOrder order = insOrderMapper.selectById(quarterOrderId);
+
+        Long count = insOrderMapper.selectCount(Wrappers.<InsOrder>lambdaQuery()
+                .eq(InsOrder::getIfsInventoryId, order.getIfsInventoryId())
+                .ne(InsOrder::getState, -1)
+                .eq(InsOrder::getOrderType, InsOrderTypeConstants.ENTER_THE_FACTORY)
+                .ne(InsOrder::getId, order.getId()));
+        // 鍒ゆ柇涔嬪墠鏄惁鏈夎繘鍘傛楠�, 娌℃湁闇�瑕佷慨鏀瑰師鏉愭枡淇℃伅
+        if (count == 0) {
+            ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
+                    .set(IfsInventoryQuantity::getState, 0)
+                    .set(IfsInventoryQuantity::getIsQuarter, 1)
+                    .eq(IfsInventoryQuantity::getId, order.getIfsInventoryId()));
+        } else {
+            ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
+                    .set(IfsInventoryQuantity::getIsQuarter, 1)
+                    .eq(IfsInventoryQuantity::getId, order.getIfsInventoryId()));
+        }
+
+        insOrderService.update(Wrappers.<InsOrder>lambdaUpdate()
+                .eq(InsOrder::getId, quarterOrderId)
+                .set(InsOrder::getState, -1)
+                .set(InsOrder::getEntrustCode, ""));// 鎾ら攢
+        auxiliaryOutputWorkingHoursMapper.delete(Wrappers.<AuxiliaryOutputWorkingHours>lambdaQuery()
+                .eq(AuxiliaryOutputWorkingHours::getOrderId, quarterOrderId));
+        // 娓呴櫎涔嬪墠鎶ュ憡
+        insReportService.remove(Wrappers.<InsReport>lambdaQuery()
+                .eq(InsReport::getInsOrderId, quarterOrderId));
+        return true;
+    }
+
+    /**
+     * 鍘熸潗鏂欐姤妫�鍏ㄩ儴淇℃伅瀵煎嚭
+     * @param ifsInventoryQuantityDto
+     * @param response
+     */
+    @Override
+    public void rawAllExport(IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto, HttpServletResponse response) throws UnsupportedEncodingException {
+        //鏌ヨ瀵煎嚭鐨勮垂鐢ㄧ粺璁℃暟鎹�
+        String beginDeclareDate = ifsInventoryQuantityDto.getBeginDeclareDate();
+        String endDeclareDate = ifsInventoryQuantityDto.getEndDeclareDate();
+        ifsInventoryQuantityDto.setBeginDeclareDate(null);
+        ifsInventoryQuantityDto.setEndDeclareDate(null);
+        List<IfsInventoryQuantitySupplierDto> ifsByOverList = standardTreeMapper.getIfsByOverList(QueryWrappers.queryWrappers(ifsInventoryQuantityDto), beginDeclareDate, endDeclareDate);
+
+        for (IfsInventoryQuantitySupplierDto dto : ifsByOverList) {
+            dto.setSendTimeString(dto.getSendTime() == null ? "" : dto.getSendTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            dto.setReceiverDateString(dto.getReceiverDate() == null ? "" : dto.getReceiverDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            dto.setDeclareDateString(dto.getDeclareDate() == null ? "" : dto.getDeclareDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+            switch (dto.getInspectStatus()) {
+                case 1:
+                    dto.setInspectStatusString("鍚堟牸");
+                    break;
+                case 2:
+                    dto.setInspectStatusString("涓嶅悎鏍�");
+                    // 鏌ヨ涓嶅悎鏍奸」
+                    List<String> unqualifiedList = insProductMapper.selectUnqualifiedList(dto.getEnterOrderId() == null ? dto.getQuarterOrderId() : dto.getEnterOrderId());
+                    dto.setUnqualifiedItem(CollUtil.join(unqualifiedList, ","));
+                    break;
+                case 3:
+                    dto.setInspectStatusString("鏈笅鍗�");
+                    break;
+                case 4:
+                    dto.setInspectStatusString("璁╂鏀捐");
+                    break;
+                case 0:
+                    dto.setInspectStatusString("妫�楠屼腑");
+                    break;
+
+            }
+        }
+
+
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("UTF-8");
+        // 杩欓噷URLEncoder.encode鍙互闃叉涓枃涔辩爜 褰撶劧鍜宔asyexcel娌℃湁鍏崇郴
+        String fileName = URLEncoder.encode("鍘熸潗鏂欐娴嬩俊鎭鍑�", "UTF-8");
+        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+        try {
+            //鏂板缓ExcelWriter
+            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).build();
+            //鑾峰彇sheet0瀵硅薄
+            WriteSheet mainSheet = EasyExcel.writerSheet(0, "鍘熸潗鏂欐娴嬩俊鎭鍑�").head(IfsInventoryQuantitySupplierDto.class).build();
+
+            //鍚憇heet0鍐欏叆鏁版嵁 浼犲叆绌簂ist杩欐牱鍙鍑鸿〃澶�
+            excelWriter.write(ifsByOverList, mainSheet);
+            //鍏抽棴娴�
+            excelWriter.finish();
+        } catch (IOException e) {
+            throw new RuntimeException("瀵煎嚭澶辫触");
+        }
+    }
+
+    /**
+     * 鍘熸潗鏂欐煡璇㈠彲浠ュ搴︽楠岀殑鍐呭
+     * @param page
+     * @param ifsInventoryQuantityDto
+     * @return
+     */
+    @Override
+    public IPage<IfsInventoryQuantitySupplierDto> getIfsByQuarter(Page page, IfsInventoryQuantitySupplierDto ifsInventoryQuantityDto) {
+
+        // todo: 鍙湅鎴�
+        String beginDeclareDate = ifsInventoryQuantityDto.getBeginDeclareDate();
+        String endDeclareDate = ifsInventoryQuantityDto.getEndDeclareDate();
+        ifsInventoryQuantityDto.setBeginDeclareDate(null);
+        ifsInventoryQuantityDto.setEndDeclareDate(null);
+
+        return standardTreeMapper.getIfsByQuarter(page, QueryWrappers.queryWrappers(ifsInventoryQuantityDto), beginDeclareDate, endDeclareDate);
+    }
+
+    /**
+     * 鎻愬墠鍏ュ簱
+     * @param ifsInventoryId
+     * @return
+     */
+    @Override
+    public boolean advancedGodown(Integer ifsInventoryId) {
+        // 鏌ヨ鍘熸潗鏂欎俊鎭�
+        IfsInventoryQuantity ifsInventoryQuantity = ifsInventoryQuantityMapper.selectById(ifsInventoryId);
+        if (!ifsInventoryQuantity.getInspectStatus().equals(0)
+                && !ifsInventoryQuantity.getInspectStatus().equals(3)) {
+            throw new ErrorException("鏈娴嬪畬鎴愭暟鎹墠鑳芥彁鍓嶅叆搴�");
+        }
+
+        // todo:闇�瑕佸垽鏂璷a娴佺▼鏄惁鏄姝ユ斁琛�
+        String toLocation = insReportService.moveRawMaterial(ifsInventoryQuantity);
+
+        ifsInventoryQuantityMapper.update(null, new LambdaUpdateWrapper<IfsInventoryQuantity>()
+                .set(IfsInventoryQuantity::getInspectStatus, 1)
+                .set(IfsInventoryQuantity::getIsFinish, 1)
+                .set(IfsInventoryQuantity::getToLocation, toLocation)
+                .eq(IfsInventoryQuantity::getId, ifsInventoryId));
+
+        return true;
+    }
+
+
+    /**
+     * 娣诲姞宸ユ椂
+     * @param insOrder
+     * @param ifsInventoryQuantity
+     */
+    private void addAuxiliary(InsOrder insOrder, IfsInventoryQuantity ifsInventoryQuantity) {
+        AuxiliaryOutputWorkingHours auxiliaryOutputWorkingHours = new AuxiliaryOutputWorkingHours();
+        auxiliaryOutputWorkingHours.setInspectionItemClass(ifsInventoryQuantity.getUpdateBatchNo() + "鍏嶆");//妫�娴嬮」鍒嗙被
+        auxiliaryOutputWorkingHours.setSample(insOrder.getEntrustCode());//鏍峰搧缂栧彿
+        auxiliaryOutputWorkingHours.setOrderId(insOrder.getId());//璁㈠崟id
+        auxiliaryOutputWorkingHours.setOrderNo(insOrder.getEntrustCode());//闈炲姞鐝鎵樺崟鍙�
+
+        // 鍏嶆榛樿2
+        auxiliaryOutputWorkingHours.setWorkTime(new BigDecimal("2"));//闈炲姞鐝伐鏃�
+        auxiliaryOutputWorkingHours.setAmount(1);//闈炲姞鐝暟閲�
+        auxiliaryOutputWorkingHours.setOutputWorkTime((ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getOvertimeWorkTime()) ? auxiliaryOutputWorkingHours.getOvertimeWorkTime() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getWorkTime()) ? auxiliaryOutputWorkingHours.getWorkTime() : BigDecimal.ZERO));//浜ч噺宸ユ椂
+        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(SecurityUtils.getUserId().intValue());//妫�娴嬩汉
+        auxiliaryOutputWorkingHours.setPrice(new BigDecimal("1"));//鍗曚环
+
+        auxiliaryOutputWorkingHoursMapper.insert(auxiliaryOutputWorkingHours);
+    }
+
+    public static String getWeek(String dayStr) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        try {
+            Date date = sdf.parse(dayStr);
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(date);
+            int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
+            int day = calendar.get(Calendar.DAY_OF_MONTH);
+            return getWeekDay(dayOfWeek);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static String getWeekDay(int dayOfWeek) {
+        switch (dayOfWeek) {
+            case Calendar.MONDAY:
+                return "鍛ㄤ竴";
+            case Calendar.TUESDAY:
+                return "鍛ㄤ簩";
+            case Calendar.WEDNESDAY:
+                return "鍛ㄤ笁";
+            case Calendar.THURSDAY:
+                return "鍛ㄥ洓";
+            case Calendar.FRIDAY:
+                return "鍛ㄤ簲";
+            case Calendar.SATURDAY:
+                return "鍛ㄥ叚";
+            case Calendar.SUNDAY:
+                return "鍛ㄦ棩";
+            default:
+                return "鏈煡";
+        }
+    }
+}
diff --git a/inspect-server/src/main/resources/mapper/InsOrderMapper.xml b/inspect-server/src/main/resources/mapper/InsOrderMapper.xml
new file mode 100644
index 0000000..2cc6e8d
--- /dev/null
+++ b/inspect-server/src/main/resources/mapper/InsOrderMapper.xml
@@ -0,0 +1,588 @@
+<?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.InsOrderMapper">
+
+    <resultMap id="selectSampleDefectsMap" type="com.ruoyi.inspect.vo.SampleDefectsFatherVo">
+        <id column="id" property="id"/>
+        <result column="sample" property="sample"/>
+        <association property="children" resultMap="SampleDefectsChildrenMap" javaType="java.util.List"/>
+    </resultMap>
+
+    <resultMap id="SampleDefectsChildrenMap" type="com.ruoyi.inspect.vo.SampleDefectsChildrenVo">
+        <result column="entrust_code" property="entrust_code"/>
+        <result column="inspection_item" property="inspection_item"/>
+        <result column="name" property="name"/>
+        <result column="create_time" property="create_time"/>
+    </resultMap>
+
+    <sql id="selectSampleProductDto2">
+        i.id,
+        isa.sample_code,
+        isa.sample,
+        isa.model,
+        isa.ins_state,
+        ip.id insProductId,
+        ip.state,
+        ip.unit,
+        ip.inspection_item_class,
+        ip.inspection_item_class_en,
+        ip.inspection_item,
+        ip.inspection_item_en,
+        ip.inspection_item_subclass,
+        ip.inspection_item_subclass_en,
+        ip.son_laboratory,
+        ip.inspection_item_type,
+        ip.inspection_value_type,
+        ip.ask,
+        ip.tell,
+        ip.`last_value`,
+        ip.ins_result,
+        ip.radius,
+        isa.quantity,
+        ip.sort,
+        ip.cable_tag
+    </sql>
+
+    <select id="selectInsOrderPage" resultType="com.ruoyi.inspect.dto.SampleOrderDto">
+        select *
+        from (
+        SELECT
+        io.*,
+        isau.user_id assign,
+        ir.id report_id,
+        ir.url,
+        ir.url_s,
+        sample_counts.sample_num,
+        CONCAT(ROUND(approved_product_counts.approved_count / total_product_counts.total_count * 100, 2), '%') AS insProgress,
+        io.sample_view AS sample_name,
+        GROUP_CONCAT(DISTINCT isa.model SEPARATOR ' ') AS sample_model,
+        u.name,
+        testing_name,
+        ip.son_laboratory
+        FROM
+        ins_order io
+        LEFT JOIN
+        ins_sample isa ON io.id = isa.ins_order_id
+        left join ins_product ip on ip.ins_sample_id = isa.id
+        LEFT JOIN
+        ins_sample_user isau ON isau.ins_sample_id = io.id
+        LEFT JOIN
+        (SELECT id, ins_order_id, is_ratify, url, url_s FROM ins_report WHERE is_ratify = 1) ir ON io.id = ir.ins_order_id
+        LEFT JOIN
+        user u ON io.create_user = u.id
+        LEFT JOIN
+        (SELECT ins_order_id, COUNT(*) AS sample_num
+        FROM ins_sample
+        WHERE id in(select id1 from (select is2.id id1 ,ip.id from ins_sample is2 left join ins_product ip on is2.id = ip.ins_sample_id where ip.id is not null)s )
+        GROUP BY ins_order_id) sample_counts ON io.id = sample_counts.ins_order_id
+        LEFT JOIN
+        (SELECT ins_sample.ins_order_id, COUNT(*) AS total_count
+        FROM ins_product
+        JOIN ins_sample ON ins_product.ins_sample_id = ins_sample.id
+        WHERE ins_product.state = 1
+        GROUP BY ins_sample.ins_order_id) total_product_counts ON io.id = total_product_counts.ins_order_id
+        LEFT JOIN
+        (SELECT ins_sample.ins_order_id, COUNT(*) AS approved_count
+        FROM ins_product
+        JOIN ins_sample ON ins_product.ins_sample_id = ins_sample.id
+        WHERE ins_product.state = 1 AND ins_product.ins_result IS NOT NULL
+        GROUP BY ins_sample.ins_order_id) approved_product_counts ON io.id = approved_product_counts.ins_order_id
+        LEFT JOIN (SELECT ins_sample_id, GROUP_CONCAT(DISTINCT uu.name SEPARATOR ',') AS testing_name
+        FROM ins_sample_user u
+        LEFT JOIN user uu ON u.user_id = uu.id
+        WHERE u.state = 0
+        GROUP BY ins_sample_id
+        ORDER BY ins_sample_id) isu ON isu.ins_sample_id = io.id
+        where (io.ifs_inventory_id IS NULL OR TRIM(io.ifs_inventory_id)  = '')
+        <if test="isOrderAll != null and isOrderAll != ''">
+            AND io.state in (1, 4)
+        </if>
+        <if test="laboratory!=null and laboratory!=''">
+            AND io.laboratory=#{laboratory}
+        </if>
+        GROUP BY io.id,type
+        order by type desc,io.id desc
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+    <select id="selectInsOrderParameter" resultType="com.ruoyi.inspect.pojo.InsOrder">
+        select *
+        from (
+        select
+        id,
+        appointed,
+        user_id,
+        create_user,
+        otc_code,
+        code,
+        custom,
+        update_user,
+        update_time,
+        type,
+        entrust_code,
+        company,
+        remark,
+        create_time,
+        state
+        from ins_order
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="getLaboratoryCode" resultType="java.lang.String">
+        select laboratory_number
+        from laboratory
+        where laboratory_name = #{name}
+    </select>
+    <select id="selectSampleAndProductByOrderId" resultType="com.ruoyi.inspect.dto.SampleProductDto2">
+        select *
+        from (
+        select
+        i.id,
+        isa.sample_code,
+        isa.sample,
+        isa.model,
+        isa.ins_state,
+        ip.id insProductId,
+        ip.state,
+        ip.unit,
+        ip.inspection_item,
+        ip.inspection_item_subclass,
+        ip.son_laboratory,
+        ip.inspection_item_type,
+        ip.inspection_value_type,
+        ip.tell,
+        ip.ask,
+        ip.`last_value`,
+        ip.ins_result,
+        ip.inspection_item_class,
+        i.ifs_inventory_id,
+        i.order_type,
+        ip.sort,
+        ip.cable_tag,
+        ip.radius
+        from ins_sample isa
+        left join ins_order i on isa.ins_order_id = i.id
+        left join ins_product ip on isa.id = ip.ins_sample_id
+        where ip.state = 1
+        and i.id=#{id}
+        and ip.is_binding != 1
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="selectCostStatistics" resultType="com.ruoyi.inspect.dto.CostStatisticsDto">
+        select * from (
+        SELECT A.id,
+        A.entrust_code,
+        A.create_time,
+        A.sample,
+        A.model,
+        A.inspection_item,
+        A.company,
+        A.`name`,
+        COUNT(1) num,
+        SUM(A.price) price,
+        SUM(A.cost) cost
+        FROM
+        (SELECT
+        i.id,
+        i.entrust_code,
+        i.create_time,
+        isa.sample,
+        isa.sample_code,
+        isa.model,
+        c.price,
+        c.cost,
+        c.inspection_item,
+        i.company,
+        u.`name`,
+        i.create_user,
+        c.ins_sample_id
+        FROM
+        ins_order i
+        LEFT JOIN ins_sample isa ON isa.ins_order_id = i.id
+        LEFT JOIN `user` u ON u.id = i.user_id
+        left join custom cus on cus.id = u.company
+        LEFT JOIN (select SUM(b.price) price, sum(b.man_hour) cost,b.ins_sample_id,
+        GROUP_CONCAT(b.inspection_item2
+        SEPARATOR ',')
+        inspection_item from (select * ,
+        GROUP_CONCAT(CONCAT(inspection_item,'@',inspection_item_subclass) SEPARATOR ',')inspection_item2 from ins_product where state = 1 and template_id IS NOT NULL GROUP BY ins_sample_id,man_hour_group) b GROUP
+        BY b.ins_sample_id) c ON c.ins_sample_id = isa.id
+        where (i.state = 1 or i.state = 3 or i.state = 4) and c.ins_sample_id IS not  NULL)A
+        GROUP BY
+        A.id,
+        A.entrust_code,
+        A.create_time,
+        A.sample,
+        A.model,
+        A.inspection_item,
+        A.company,
+        A.`name`
+        ) B
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="selectDeviceList" resultType="java.util.Map">
+        select device_name,
+               en_device_name,
+               specification_model,
+               management_number,
+               date_format(activation_date,'%Y-%m-%d')
+        latest_traceability
+        from device
+        where device.management_number in
+        <foreach collection="names" index="index" open="(" separator="," close=")" item="val">
+            #{val}
+        </foreach>
+    </select>
+
+    <update id="updateStatus">
+        update ins_order
+        set state=3
+        where id = #{id}
+    </update>
+
+    <select id="selectSampleDefects" resultMap="selectSampleDefectsMap">
+        SELECT io.entrust_code,sam.sample,ip.inspection_item,u.name,b.create_time, sam.id
+        from ins_order io
+        left JOIN ins_sample sam on io.id=sam.ins_order_id
+        LEFT JOIN ins_product ip on ip.ins_sample_id=sam.id
+        LEFT JOIN
+        (SELECT create_time,create_user,ins_product_id FROM
+        (select * FROM ins_product_user ORDER BY ins_product_user.create_time DESC) a
+        GROUP BY a.ins_product_id) b
+        on b.ins_product_id=ip.id
+        left JOIN `user` u on u.id=b.create_user
+        WHERE (ip.ins_result=0 OR ip.state=0)
+        <if test="inspectionItems != null and inspectionItems != ''">
+            and inspection_item like concat('%', #{inspectionItems}, '%')
+        </if>
+        <if test="orderNumber != null and orderNumber != ''">
+            and io.entrust_code like concat('%', #{orderNumber}, '%')
+        </if>
+    </select>
+
+    <select id="getCount" resultType="long">
+        select count(1)
+        from (
+        SELECT io.entrust_code,sam.sample,ip.inspection_item,u.name,b.create_time, sam.id
+        from ins_order io
+        left JOIN ins_sample sam on io.id=sam.ins_order_id
+        LEFT JOIN ins_product ip on ip.ins_sample_id=sam.id
+        LEFT JOIN
+        (SELECT create_time,create_user,ins_product_id FROM (select * FROM ins_product_user ORDER BY
+        ins_product_user.create_time DESC) a GROUP BY a.ins_product_id) b
+        on b.ins_product_id=ip.id
+        left JOIN `user` u on u.id=b.create_user
+        where (ip.ins_result=0 OR ip.state=0)
+        <if test="inspectionItems != null and inspectionItems != ''">
+            and inspection_item like concat('%', #{inspectionItems}, '%')
+        </if>
+        <if test="orderNumber != null and orderNumber != ''">
+            and io.entrust_code like concat('%', #{orderNumber}, '%')
+        </if>
+        ) temp
+    </select>
+
+    <select id="getStandardMethodCode" resultType="java.lang.String">
+        select code
+        from standard_method
+        where id = #{id}
+    </select>
+    <select id="selLaboratoryCode" resultType="java.lang.String">
+        select laboratory_code
+        from laboratory
+        where laboratory_name = #{laboratory}
+    </select>
+    <select id="selectReportModelByOrderId" resultType="java.util.Map">
+        select distinct id, name
+        from standard_template
+        where id in (select template_id
+                     from ins_product
+                     where son_laboratory = #{laboratory}
+                       and ins_sample_id in
+                           (select id from ins_sample where ins_order_id = #{id}))
+    </select>
+
+    <select id="selectCostStatistics2" resultType="com.ruoyi.inspect.dto.CostStatisticsDto">
+        select * from (
+        SELECT A.id,
+        A.entrust_code,
+        A.create_time,
+        A.sample,
+        A.model,
+        A.inspection_item,
+        A.company,
+        A.`name`,
+        production,
+        engineering,
+        COUNT(1) num,
+        SUM(A.price) price,
+        SUM(A.cost) cost
+        FROM
+        (SELECT
+        i.id,
+        i.entrust_code,
+        i.create_time,
+        isa.sample,
+        isa.sample_code,
+        isa.model,
+        c.price,
+        c.cost,
+        c.inspection_item,
+        i.company,
+        u.`name`,
+        i.create_user,
+        c.ins_sample_id,
+        production,
+        engineering
+        FROM
+        ins_order i
+        LEFT JOIN ins_sample isa ON isa.ins_order_id = i.id
+        LEFT JOIN `user` u ON u.id = i.user_id
+        left join custom cus on cus.id = u.company
+        LEFT JOIN (select SUM(b.price) price, sum(b.man_hour) cost,b.ins_sample_id,
+        GROUP_CONCAT(b.inspection_item2
+        SEPARATOR ',')
+        inspection_item from (select * ,
+        GROUP_CONCAT(CONCAT(inspection_item,'@',inspection_item_subclass) SEPARATOR ',')inspection_item2 from ins_product where state = 1 and template_id IS NOT NULL GROUP BY ins_sample_id,man_hour_group) b GROUP
+        BY b.ins_sample_id) c ON c.ins_sample_id = isa.id
+        where (i.state = 1 or i.state = 3 or i.state = 4) and c.ins_sample_id IS not  NULL)A
+        GROUP BY
+        A.id,
+        A.entrust_code,
+        A.create_time,
+        A.sample,
+        A.model,
+        A.inspection_item,
+        A.company,
+        A.`name`,
+        production,
+        engineering
+        ORDER BY
+        A.id,
+        A.entrust_code,
+        A.create_time,
+        A.sample,
+        A.model,
+        A.inspection_item,
+        A.company,
+        A.`name`,
+        production,
+        engineering) B
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+    <select id="seldepLimsId" resultType="java.lang.String">
+        select name
+        from department_lims
+        where id = #{depLimsId}
+    </select>
+    <select id="selectSampleBySampleId" resultType="com.ruoyi.inspect.dto.SampleProductExportDto">
+        select <include refid="selectSampleProductDto2"/>
+        from ins_sample isa
+                 left join ins_order i on isa.ins_order_id = i.id
+                 left join ins_product ip on isa.id = ip.ins_sample_id
+        where ip.state = 1
+          and ip.is_binding != 1
+          and isa.id in
+        <foreach collection="ids" index="index" open="(" separator="," close=")" item="val">
+            #{val}
+        </foreach>
+        order by ip.sort asc
+    </select>
+    <select id="selectSampleMax" resultType="java.lang.Integer">
+        SELECT COUNT(*)
+        FROM ins_sample isa
+                 LEFT JOIN ins_order i ON isa.ins_order_id = i.id
+                 LEFT JOIN ins_product ip ON isa.id = ip.ins_sample_id
+        WHERE ip.state = 1
+          AND isa.id = #{id}
+        GROUP BY ip.inspection_item,
+                 ip.inspection_item_subclass,
+                 ip.inspection_item_class
+        ORDER BY COUNT(*) DESC
+        LIMIT 1;
+    </select>
+    <select id="selectSampleCableTag" resultType="java.lang.String">
+        SELECT ip.cable_tag
+        FROM ins_sample isa
+                 LEFT JOIN ins_order i ON isa.ins_order_id = i.id
+                 LEFT JOIN ins_product ip ON isa.id = ip.ins_sample_id
+        WHERE ip.state = 1
+          AND isa.id = #{id}
+          and ip.cable_tag is not null
+        GROUP BY ip.cable_tag
+        order by ip.cable_tag
+    </select>
+    <select id="selectSampleItemS" resultType="java.lang.Integer">
+        select count(*)
+        from (select distinct ip.inspection_item
+              from  ins_sample isa
+                        left join ins_order i on isa.ins_order_id = i.id
+                        left join ins_product ip on isa.id = ip.ins_sample_id
+              where ip.state = 1
+                and i.id = #{id}) a
+    </select>
+    <select id="selectSampleBySampleIdOne" resultType="com.ruoyi.inspect.dto.SampleProductExportDto">
+        select <include refid="selectSampleProductDto2"/>
+        from ins_sample isa
+        left join ins_order i on isa.ins_order_id = i.id
+        left join ins_product ip on isa.id = ip.ins_sample_id
+        where ip.state = 1
+        and isa.id = #{id}
+        and ip.raw_material_tag = 1
+        order by ip.sort asc
+    </select>
+    <select id="selectCalendarWorkByWeek" resultType="java.util.Map">
+        select io2.entrust_code text,
+               io2.type         type,
+               ios.ins_state    insState,
+               u.name           name
+        from ins_order io2
+                 left join ins_order_state ios on ios.ins_order_id = io2.id
+                 left join user u on u.id = io2.create_user
+        where DATE(io2.create_time) = CURDATE() - INTERVAL #{day} DAY
+    </select>
+    <select id="selectProductByPartNo" resultType="com.ruoyi.basic.pojo.StructureTestObject">
+        select sto.id,
+               object_type
+        from product_part pp
+                 left join product p on p.id = pp.product_id
+                 left join structure_test_object sto on sto.id = p.object_id
+        where pp.part_no = #{partNo}
+    </select>
+    <select id="selectByPartNo" resultType="com.ruoyi.basic.pojo.StructureTestObject">
+        select sto.id,
+               object_type
+        from structure_test_object_part stop
+                 left join structure_test_object sto on sto.id = stop.test_object_id
+        where stop.part_no = #{partNo}
+    </select>
+
+    <!-- 鎴愬搧鏍囩鎵撳嵃 -->
+    <select id="labelOrderPrinting" resultType="com.ruoyi.inspect.vo.InsOrderPrintingVo">
+        select *
+        from (select io2.id insOrderId,
+                     io2.sample_view,
+                     io2.production,
+                     io2.send_time,
+                     GROUP_CONCAT(DISTINCT isa.model SEPARATOR ' ') AS sample_model,
+                     io2.prepare_user,
+                     io2.entrust_code,
+                     io2.test_quantity,
+                     io2.ins_state,
+                     JSON_OBJECT(
+                             'sample_name', io2.sample_view,
+                             'entrust_code', io2.entrust_code
+                     )                                                 labelBarCode
+              from ins_order io2
+                       LEFT JOIN ins_sample isa ON io2.id = isa.ins_order_id
+              where type_source = 0
+              GROUP BY io2.id) a
+        where insOrderId in
+        <foreach collection="ids" index="index" open="(" separator="," close=")" item="val">
+            #{val}
+        </foreach>
+    </select>
+
+    <!-- 鏌ヨ妫�楠屽崟鏁版嵁 -->
+    <select id="rawAllInsOrderExport" resultType="com.ruoyi.inspect.dto.SampleOrderDto">
+        select *
+        from (
+        SELECT
+        io.*,
+        isau.user_id assign,
+        ir.id report_id,
+        ir.url,
+        ir.url_s,
+        sample_counts.sample_num,
+        CONCAT(ROUND(approved_product_counts.approved_count / total_product_counts.total_count * 100, 2), '%') AS insProgress,
+        io.sample_view AS sample_name,
+        GROUP_CONCAT(DISTINCT isa.model SEPARATOR ' ') AS sample_model,
+        u.name,
+        testing_name,
+        case when io.type = 0 then '鏅��'
+        when io.type = 1 then '浼樺厛'
+        when io.type = 2 then '绱ф��'
+            end typeString,
+        case when io.ins_result = 1 then '鍚堟牸'
+        when io.ins_result = 0 then '涓嶅悎鏍�'
+        else '寰呮楠�' end insResultString
+        FROM
+        ins_order io
+        LEFT JOIN
+        ins_sample isa ON io.id = isa.ins_order_id
+        LEFT JOIN
+        ins_sample_user isau ON isau.ins_sample_id = io.id
+        LEFT JOIN
+        (SELECT id, ins_order_id, is_ratify, url, url_s FROM ins_report WHERE is_ratify = 1) ir ON io.id = ir.ins_order_id
+        LEFT JOIN
+        user u ON io.create_user = u.id
+        LEFT JOIN
+        (SELECT ins_order_id, COUNT(*) AS sample_num
+        FROM ins_sample
+        WHERE id in(select id1 from (select is2.id id1 ,ip.id from ins_sample is2 left join ins_product ip on is2.id = ip.ins_sample_id where ip.id is not null)s )
+        GROUP BY ins_order_id) sample_counts ON io.id = sample_counts.ins_order_id
+        LEFT JOIN
+        (SELECT ins_sample.ins_order_id, COUNT(*) AS total_count
+        FROM ins_product
+        JOIN ins_sample ON ins_product.ins_sample_id = ins_sample.id
+        WHERE ins_product.state = 1
+        GROUP BY ins_sample.ins_order_id) total_product_counts ON io.id = total_product_counts.ins_order_id
+        LEFT JOIN
+        (SELECT ins_sample.ins_order_id, COUNT(*) AS approved_count
+        FROM ins_product
+        JOIN ins_sample ON ins_product.ins_sample_id = ins_sample.id
+        WHERE ins_product.state = 1 AND ins_product.ins_result IS NOT NULL
+        GROUP BY ins_sample.ins_order_id) approved_product_counts ON io.id = approved_product_counts.ins_order_id
+        LEFT JOIN (SELECT ins_sample_id, GROUP_CONCAT(DISTINCT uu.name SEPARATOR ',') AS testing_name
+        FROM ins_sample_user u
+        LEFT JOIN user uu ON u.user_id = uu.id
+        WHERE u.state = 0
+        GROUP BY ins_sample_id
+        ORDER BY ins_sample_id) isu ON isu.ins_sample_id = io.id
+        where (io.ifs_inventory_id IS NULL OR TRIM(io.ifs_inventory_id)  = '')
+        <if test="isOrderAll != null and isOrderAll != ''">
+            AND io.state in (1, 4)
+        </if>
+        <if test="laboratory!=null and laboratory!=''">
+            AND io.laboratory=#{laboratory}
+        </if>
+        GROUP BY io.id,type
+        order by type desc,io.id desc
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+    <!-- 鏍规嵁璁㈠崟鏌ヨ璇曢獙瀹� -->
+    <select id="selectLaboratoryByOrderId" resultType="java.lang.String">
+        select ip.son_laboratory
+        from ins_product ip
+                 left join ins_sample is2 on is2.id = ip.ins_sample_id
+        where is2.ins_order_id = #{insOrderId}
+        limit 1
+    </select>
+
+    <select id="selectFirstSubmit" resultType="com.ruoyi.inspect.pojo.InsOrder">
+        select io.id,
+               io.is_first_submit
+        from ins_order io
+                 left join ins_sample is2 on is2.ins_order_id = io.id
+        where is2.id = #{insSampleId}
+    </select>
+</mapper>
diff --git a/inspect-server/src/main/resources/mapper/InsOrderStateMapper.xml b/inspect-server/src/main/resources/mapper/InsOrderStateMapper.xml
new file mode 100644
index 0000000..684e104
--- /dev/null
+++ b/inspect-server/src/main/resources/mapper/InsOrderStateMapper.xml
@@ -0,0 +1,4 @@
+<?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.InsOrderStateMapper">
+</mapper>
diff --git a/inspect-server/src/main/resources/mapper/InsOrderTemplateMapper.xml b/inspect-server/src/main/resources/mapper/InsOrderTemplateMapper.xml
new file mode 100644
index 0000000..15d3b2c
--- /dev/null
+++ b/inspect-server/src/main/resources/mapper/InsOrderTemplateMapper.xml
@@ -0,0 +1,4 @@
+<?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.InsOrderTemplateMapper">
+</mapper>
diff --git a/inspect-server/src/main/resources/mapper/InsProductMapper.xml b/inspect-server/src/main/resources/mapper/InsProductMapper.xml
new file mode 100644
index 0000000..7d92da9
--- /dev/null
+++ b/inspect-server/src/main/resources/mapper/InsProductMapper.xml
@@ -0,0 +1,144 @@
+<?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.InsProductMapper">
+
+    <update id="updateInspected">
+        UPDATE ins_product p
+        SET p.state=0
+        WHERE EXISTS(
+                      SELECT 1
+                      FROM ins_sample s
+                      WHERE s.ins_order_id IN (
+                          SELECT o.id
+                          FROM ins_order o
+                          WHERE o.id = #{id}
+                      )
+                        AND p.ins_sample_id = s.id
+                        AND p.state = 1
+                        AND p.ins_result IS NULL
+                  );
+    </update>
+
+    <select id="selectOrderManDay" resultType="java.lang.Integer">
+        select coalesce(max(ip.man_day), 0)
+        from ins_order io
+                 left join ins_sample isa on io.id = isa.ins_order_id
+                 left join ins_product ip on isa.id = ip.ins_sample_id
+        where io.id = #{orderId}
+    </select>
+    <select id="selectUserById" resultType="java.util.Map">
+        select account, name, company, phone, name_en
+        from user
+        where id = #{userId}
+    </select>
+    <select id="getProductAndResult" resultType="com.ruoyi.inspect.dto.ProductResultDto2">
+        select ip.id,
+               ip.inspection_item,
+               ip.inspection_item_subclass,
+               ip.laboratory,
+               ip.unit,
+               ipr.equip_name equipValue,
+               io.entrust_code,
+               ipr.update_time,
+               ip.ins_result,
+               u.name         updateUserName
+        from ins_product ip
+                 left join ins_product_result ipr on ip.id = ipr.ins_product_id
+                 left join ins_sample isa on isa.id = ip.ins_sample_id
+                 left join ins_order io on io.id = isa.ins_order_id
+                 left join user u on u.id = ipr.update_user
+        where ip.ins_sample_id = #{sampleId}
+          and ip.ins_result is not null
+          and template_id is not null
+    </select>
+    <select id="selectFiberInsProduct" resultType="com.ruoyi.inspect.pojo.InsProduct">
+        select * from ins_product
+        where state = 1
+        and is_binding != 1
+        and (ins_fibers_id is not null or ins_fiber_id is not null)
+        and ins_result is null
+        and son_laboratory = #{laboratory}
+        and ins_sample_id in
+        <foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
+            #{item}
+        </foreach>
+    </select>
+    <select id="selectNoProducts" resultType="com.ruoyi.inspect.pojo.InsProduct">
+        select *
+        from (select ip.*, sample_code
+              from ins_product ip
+                       left join ins_sample is2 on ip.ins_sample_id = is2.id
+              where state = 1
+                and is2.ins_order_id = #{orderId}
+        <if test="noIds != null and noIds.size() > 0">
+            and ip.id in
+            <foreach collection="noIds" index="index" open="(" separator="," close=")" item="val">
+                #{val}
+            </foreach>
+        </if>
+        ) A
+    </select>
+    <select id="selectInsProductCountByOrderId" resultType="java.lang.Integer">
+        select COUNT(1)
+        from ins_product ip
+                 left join ins_sample isa on ip.ins_sample_id = isa.id
+                 left join ins_order io on isa.ins_order_id = io.id
+        where io.id = #{orderId}
+          and (ip.ins_result is null or ip.ins_result = 2)
+          and ip.state = 1
+    </select>
+    <select id="selectListBySampleIds" resultType="com.ruoyi.inspect.dto.SampleProductRawAnalysisDto">
+        select ins.id                                                  ins_sample_id,
+               ins.sample_code,
+               ip.id                                                   ins_product_id,
+               concat(ip.inspection_item, ip.inspection_item_subclass) inspection_item,
+               ip.`last_value`,
+               iiq.update_batch_no,
+               iiq.supplier_name,
+               ins.sample,
+               ip.ins_result
+        from ins_product ip
+                 left join ins_sample ins on ins.id = ip.ins_sample_id
+                 left join ins_order io1 on io1.id = ins.ins_order_id
+                 left join ifs_inventory_quantity iiq on iiq.id = io1.ifs_inventory_id
+        where ip.inspection_value_type = 1
+        and ip.ins_sample_id in
+        <foreach collection="sampleIds" index="index" open="(" separator="," close=")" item="val">
+            #{val}
+        </foreach>
+    </select>
+    <select id="selectItemNameBySampleIds" resultType="java.lang.String">
+        select concat(ip.inspection_item, ip.inspection_item_subclass)
+        from ins_product ip
+                 left join ins_sample ins on ins.id = ip.ins_sample_id
+        where ip.inspection_value_type = 1
+        and ip.ins_sample_id in
+        <foreach collection="sampleIds" index="index" open="(" separator="," close=")" item="val">
+            #{val}
+        </foreach>
+
+        group by concat(ip.inspection_item, ip.inspection_item_subclass)
+    </select>
+    <select id="selectUnqualifiedList" resultType="java.lang.String">
+        select distinct concat(ip.inspection_item_class, ip.inspection_item, ip.inspection_item_subclass)
+        from ins_product ip
+                 left join ins_sample is2 on is2.id = ip.ins_sample_id
+                 left join ins_order io2 on io2.id = is2.ins_order_id
+        where io2.id = #{orderId}
+    </select>
+
+    <!--鏌ヨ鍒ゆ柇鏄惁鏈変笉鍒ゅ畾椤圭洰,鍜屽叏閮芥槸鍒ゅ畾椤�-->
+    <select id="selectNoJudge" resultType="java.lang.Integer">
+        select CASE
+                   WHEN SUM(CASE WHEN ip.ins_result = 3 THEN 1 ELSE 0 END) = COUNT(*) THEN 3
+                   WHEN SUM(CASE WHEN ip.ins_result = 3 THEN 1 ELSE 0 END) > 0 THEN 2
+                   ELSE 1 END AS result_flag
+        from ins_product ip
+                 left join ins_sample is2 on is2.id = ip.ins_sample_id
+                 left join ins_order io2 on io2.id = is2.ins_order_id
+        where io2.id = #{orderId}
+        and ip.is_binding != 1
+    </select>
+</mapper>
diff --git a/inspect-server/src/main/resources/mapper/InsProductUserMapper.xml b/inspect-server/src/main/resources/mapper/InsProductUserMapper.xml
new file mode 100644
index 0000000..474ae59
--- /dev/null
+++ b/inspect-server/src/main/resources/mapper/InsProductUserMapper.xml
@@ -0,0 +1,4 @@
+<?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.InsProductUserMapper">
+</mapper>
diff --git a/inspect-server/src/main/resources/mapper/InsReportMapper.xml b/inspect-server/src/main/resources/mapper/InsReportMapper.xml
new file mode 100644
index 0000000..0098974
--- /dev/null
+++ b/inspect-server/src/main/resources/mapper/InsReportMapper.xml
@@ -0,0 +1,66 @@
+<?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.InsReportMapper">
+
+    <select id="pageInsReport" resultType="com.ruoyi.inspect.dto.ReportPageDto">
+        select *
+        from (
+        select
+        ir.*,
+        io.entrust_code,
+        u.name write_user_name,
+        u1.name ratify_user,
+        u2.name examine_user,
+        io.type_source,
+        io.order_type,
+        io.laboratory,
+        io.ifs_inventory_id,
+        iiq.is_copper,
+        ip.son_laboratory
+        from ins_report ir
+        left join ins_order io on io.id = ir.ins_order_id
+        LEFT JOIN ifs_inventory_quantity iiq ON iiq.id = io.ifs_inventory_id
+        left join user u on u.id = ir.write_user_id
+        left join user u1 on u1.id = ir.ratify_user_id
+        left join user u2 on u2.id = ir.examine_user_id
+        left join ins_sample is2 on is2.ins_order_id = io.id
+        left join ins_product ip on ip.ins_sample_id = is2.id
+        where 1=1
+        and ir.is_pass = 1
+        <if test="createOrderUser != null and createOrderUser != ''">
+            and (ir.write_user_id = #{createOrderUser} or ir.examine_user_id = #{createOrderUser} or ir.ratify_user_id = #{createOrderUser})
+        </if>
+        <if test="laboratory!=null and laboratory!=''">
+           and  laboratory=#{laboratory}
+        </if>
+        <if test="queryStatus != null and queryStatus != ''">
+            <!-- 寰呮彁浜�-->
+            <if test='queryStatus == 0'>
+                and ir.state = 0
+            </if>
+            <!-- 寰呭鎵�-->
+            <if test='queryStatus == 1'>
+                and ir.state = 1 and (ir.is_examine != 1 or ir.is_examine is null)
+            </if>
+            <!-- 寰呮壒鍑�-->
+            <if test='queryStatus == 2'>
+                and ir.state = 1 and ir.is_examine = 1 and (ir.is_ratify != 1 or ir.is_ratify is null)
+            </if>
+        </if>
+        group by ir.id
+        ) a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="getLaboratoryByName" resultType="java.lang.String">
+        select s.address from seal s
+        left join laboratory l on s.lab_id = l.id
+        where l.laboratory_name = #{name}
+        and s.type = #{type}
+        order by s.create_time desc
+        limit 1
+    </select>
+</mapper>
diff --git a/inspect-server/src/main/resources/mapper/InsSampleMapper.xml b/inspect-server/src/main/resources/mapper/InsSampleMapper.xml
new file mode 100644
index 0000000..2f7423d
--- /dev/null
+++ b/inspect-server/src/main/resources/mapper/InsSampleMapper.xml
@@ -0,0 +1,699 @@
+<?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.InsSampleMapper">
+
+    <resultMap id="sampleDto" type="com.ruoyi.inspect.dto.SampleProductDto">
+        <id property="id" column="id" jdbcType="INTEGER"/>
+        <result property="insResult" column="ins_result" jdbcType="INTEGER"/>
+        <result property="insOrderId" column="ins_order_id" jdbcType="INTEGER"/>
+        <result property="joinModel" column="join_model" jdbcType="VARCHAR"/>
+        <result property="joinName" column="join_name" jdbcType="VARCHAR"/>
+        <result property="sampleCode" column="sample_code" jdbcType="VARCHAR"/>
+        <result property="factory" column="factory" jdbcType="VARCHAR"/>
+        <result property="laboratory" column="laboratory" jdbcType="VARCHAR"/>
+        <result property="sampleType" column="sample_type" jdbcType="VARCHAR"/>
+        <result property="sample" column="sample" jdbcType="VARCHAR"/>
+        <result property="model" column="model" jdbcType="VARCHAR"/>
+        <result property="insState" column="ins_state" jdbcType="INTEGER"/>
+        <result property="joinNum" column="join_num" jdbcType="INTEGER"/>
+        <result property="remark" column="remark" 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"/>
+        <result property="standardMethodListId" column="standard_method_list_id"/>
+        <result property="unit" column="unit"/>
+        <result property="quantity" column="quantity"/>
+        <result property="specialStandardMethod" column="special_standard_method"/>
+        <collection property="insProduct" resultMap="product"/>
+    </resultMap>
+
+    <resultMap id="product" type="com.ruoyi.inspect.pojo.InsProduct">
+        <id property="id" column="ip_id" jdbcType="INTEGER"/>
+        <result property="inspectionItem" column="inspection_item" jdbcType="VARCHAR"/>
+        <result property="inspectionItemEn" column="inspection_item_en" jdbcType="VARCHAR"/>
+        <result property="inspectionItemSubclass" column="inspection_item_subclass" jdbcType="VARCHAR"/>
+        <result property="inspectionItemSubclassEn" column="inspection_item_subclass_en" jdbcType="VARCHAR"/>
+        <result property="inspectionItemClass" column="inspection_item_class" jdbcType="VARCHAR"/>
+        <result property="inspectionItemClassEn" column="inspection_item_class_en" jdbcType="VARCHAR"/>
+        <result property="factory" column="ip_factory" jdbcType="VARCHAR"/>
+        <result property="laboratory" column="ip_laboratory" jdbcType="VARCHAR"/>
+        <result property="sampleType" column="ip_sample_type" jdbcType="VARCHAR"/>
+        <result property="sample" column="ip_sample" jdbcType="VARCHAR"/>
+        <result property="model" column="ip_model" jdbcType="VARCHAR"/>
+        <result property="sonLaboratory" column="son_laboratory" jdbcType="VARCHAR"/>
+        <result property="unit" column="ip_unit" jdbcType="VARCHAR"/>
+        <result property="price" column="price" jdbcType="DECIMAL"/>
+        <result property="manHour" column="man_hour" jdbcType="DOUBLE"/>
+        <result property="manHourGroup" column="man_hour_group" jdbcType="VARCHAR"/>
+        <result property="inspectionItemType" column="inspection_item_type" jdbcType="VARCHAR"/>
+        <result property="inspectionValueType" column="inspection_value_type" jdbcType="VARCHAR"/>
+        <result property="deviceGroup" column="device_group" jdbcType="VARCHAR"/>
+        <result property="checkoutNumber" column="checkout_number" jdbcType="INTEGER"/>
+        <result property="section" column="section" jdbcType="VARCHAR"/>
+        <result property="valueType" column="value_type" jdbcType="VARCHAR"/>
+        <result property="method" column="method" jdbcType="VARCHAR"/>
+        <result property="manDay" column="man_day" jdbcType="INTEGER"/>
+        <result property="bsm" column="bsm" jdbcType="VARCHAR"/>
+        <result property="ask" column="ask" jdbcType="VARCHAR"/>
+        <result property="tell" column="tell" jdbcType="VARCHAR"/>
+        <result property="lastValue" column="last_value" jdbcType="VARCHAR"/>
+        <result property="insResult" column="ip_ins_result" jdbcType="INTEGER"/>
+        <result property="state" column="state" jdbcType="INTEGER"/>
+        <result property="insBushId" column="ins_bush_id" jdbcType="INTEGER"/>
+        <result property="insSampleId" column="ins_sample_id" jdbcType="INTEGER"/>
+        <result property="createUser" column="ip_create_user" jdbcType="INTEGER"/>
+        <result property="updateUser" column="ip_update_user" jdbcType="INTEGER"/>
+        <result property="createTime" column="ip_create_time" jdbcType="TIMESTAMP"/>
+        <result property="updateTime" column="ip_update_time" jdbcType="TIMESTAMP"/>
+        <result property="templateId" column="template_id" jdbcType="INTEGER"/>
+        <result property="methodS" column="method_s"/>
+        <result property="tell" column="tell"/>
+        <result property="dic" column="dic"/>
+        <result property="sort" column="sort"/>
+        <result property="temperature" column="temperature"/>
+        <result property="humidity" column="humidity"/>
+        <result property="radius" column="radius"/>
+        <result property="cableTag" column="cable_tag"/>
+        <result property="structureItemParameterId" column="structure_item_parameter_id"/>
+        <collection property="insProductResult" resultMap="insProductResult"/>
+    </resultMap>
+
+
+    <resultMap id="insProductResult" type="com.ruoyi.inspect.pojo.InsProductResult">
+        <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="equipName" column="equip_name" jdbcType="VARBINARY"/>
+    </resultMap>
+
+    <resultMap id="sampleVo" type="com.ruoyi.inspect.vo.SampleVo">
+        <id property="id" column="id" jdbcType="INTEGER"/>
+        <result property="insResult" column="ins_result" jdbcType="INTEGER"/>
+        <result property="insOrderId" column="ins_order_id" jdbcType="INTEGER"/>
+        <result property="joinModel" column="join_model" jdbcType="VARCHAR"/>
+        <result property="joinName" column="join_name" jdbcType="VARCHAR"/>
+        <result property="sampleCode" column="sample_code" jdbcType="VARCHAR"/>
+        <result property="factory" column="factory" jdbcType="VARCHAR"/>
+        <result property="laboratory" column="laboratory" jdbcType="VARCHAR"/>
+        <result property="sampleType" column="sample_type" jdbcType="VARCHAR"/>
+        <result property="sample" column="sample" jdbcType="VARCHAR"/>
+        <result property="model" column="model" jdbcType="VARCHAR"/>
+        <result property="insState" column="ins_state" jdbcType="INTEGER"/>
+        <result property="joinNum" column="join_num" jdbcType="INTEGER"/>
+        <result property="remark" column="remark" 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"/>
+        <result property="standardMethodListId" column="standard_method_list_id"/>
+        <result property="methodName" column="methodName" jdbcType="VARCHAR"/>
+        <result property="unit" column="unit"/>
+    </resultMap>
+
+    <sql id="getInsProducSql">
+        ip.id          ip_id,
+               inspection_item,
+               inspection_item_en,
+               inspection_item_class,
+               inspection_item_class_en,
+               inspection_item_subclass,
+               inspection_item_subclass_en,
+               ip.factory     ip_factory,
+               ip.laboratory  ip_laboratory,
+               ip.sample_type ip_sample_type,
+               ip.sample      ip_sample,
+               ip.model       ip_model,
+               son_laboratory,
+               ip.unit        ip_unit,
+               price,
+               man_hour,
+               man_hour_group,
+               inspection_item_type,
+               inspection_value_type,
+               device_group,
+               checkout_number,
+               section,
+               value_type,
+               method,
+               man_day,
+               bsm,
+               ask,
+               `last_value`,
+               ip.ins_result  ip_ins_result,
+               state,
+               ins_sample_id,
+               ip.create_user ip_create_user,
+               ip.update_user ip_update_user,
+               ip.create_time ip_create_time,
+               ip.update_time ip_update_time,
+               template_id,
+               ipr.ins_value,
+               ipr.com_value,
+               ipr.equip_value,
+               ipr.equip_name,
+               ip.method_s,
+               ip.tell,
+               ip.dic,
+               ip.sort,
+               ip.cable_tag,
+               ip.structure_item_parameter_id
+    </sql>
+
+
+    <select id="findInsSampleAndOrder" resultType="com.ruoyi.inspect.vo.InsOrderPlanVO">
+        select * from(select * from(
+        SELECT
+        a.*,ios.ins_state,ios.verify_tell,verify_user
+        FROM
+        (
+        SELECT
+        io.id,
+        io.entrust_code,
+        io.type,
+        io.appointed,
+        io.send_time,
+        io.order_type,
+        case when
+            io.type_source = 0
+            then io.sample_view
+            else io.sample end sample,
+        GROUP_CONCAT(DISTINCT isa.model SEPARATOR ' ') AS sample_model,
+        userName,
+        checkName,
+        ip.son_laboratory,
+        io.ins_time,
+        io.laboratory,
+        io.type_source,
+        io.ifs_inventory_id,
+        ira.id ins_report_id,
+        ira.url,
+        ira.url_s,
+        ira.temp_url_pdf,
+        iiq.is_copper
+        FROM
+        ins_order io
+        LEFT JOIN ins_sample isa ON isa.ins_order_id = io.id
+        LEFT JOIN ins_report ira ON ira.ins_order_id = io.id
+        LEFT JOIN ifs_inventory_quantity iiq ON iiq.id = io.ifs_inventory_id
+        LEFT JOIN (
+        SELECT ins_sample_id,GROUP_CONCAT( DISTINCT uu.name SEPARATOR ',') AS userName
+        FROM ins_sample_user u LEFT JOIN  user uu ON u.user_id = uu.id
+        WHERE u.state=0
+        <if test="sonLaboratory!= null and sonLaboratory != ''">
+           and son_laboratory=#{sonLaboratory}
+        </if>
+        GROUP BY ins_sample_id
+        ORDER BY ins_sample_id
+        ) isu ON isu.ins_sample_id = io.id
+        LEFT JOIN (
+        SELECT ins_sample_id,uu.name checkName
+        FROM ins_sample_user u LEFT JOIN  user uu ON u.user_id = uu.id
+        WHERE u.state=1
+        <if test="sonLaboratory!= null and sonLaboratory != ''">
+            and son_laboratory=#{sonLaboratory}
+        </if>
+        GROUP BY ins_sample_id
+        ORDER BY ins_sample_id
+        )isu2 ON isu2.ins_sample_id = io.id
+        LEFT JOIN ins_product ip ON ip.ins_sample_id = isa.id
+        WHERE io.state = 1 and send_time is not null
+        <if test="isCheck != null">
+            <if test="userName !=null and userName!=''">
+                and checkName like CONCAT ('%', #{userName},'%')
+            </if>
+        </if>
+        <if test="isCheck == null">
+            <if test="userName !=null and userName!=''">
+                and userName like CONCAT ('%', #{userName},'%')
+            </if>
+        </if>
+        <if test="sonLaboratory!= null and sonLaboratory != ''">
+            and ip.son_laboratory = #{sonLaboratory}
+        </if>
+        GROUP BY
+        ip.son_laboratory,
+        io.id
+        ) a
+        LEFT JOIN ins_order_state ios ON ios.ins_order_id = a.id AND ios.laboratory = a.son_laboratory
+        ORDER BY
+        a.type DESC,
+        a.id
+        ) b
+        where ins_state is not null
+        <if test="laboratory!=null and laboratory!=''">
+            and laboratory=#{laboratory}
+        </if>
+        )A
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+    <select id="inspectionOrderDetailsTaskSwitching" resultType="com.ruoyi.inspect.vo.InsOrderPlanTaskSwitchVo">
+        select * from(
+        SELECT
+        a.*,ios.ins_state,ios.verify_tell,isu2.order_user_id,<!--(ios.verify_user = #{userId})--> verify_user
+        FROM
+        (
+        SELECT
+        io.id,
+        io.entrust_code,
+        io.type,
+        io.appointed,
+        io.send_time,
+        group_concat(distinct isa.sample,' ') sampleType,
+        isu.user_id,
+        user.name userName,
+        ip.son_laboratory,
+        io.ins_time,
+        io.laboratory
+        FROM
+        ins_order io
+        LEFT JOIN ins_sample isa ON isa.ins_order_id = io.id
+        LEFT JOIN ( <!--SELECT * FROM ins_sample_user GROUP BY ins_sample_id, user_id -->
+        SELECT *
+        FROM ins_sample_user u
+        WHERE son_laboratory=#{sonLaboratory} and (ins_sample_id, id) IN (
+        SELECT ins_sample_id, MAX(id)
+        FROM ins_sample_user
+        WHERE son_laboratory=#{sonLaboratory}
+        GROUP BY ins_sample_id
+        )
+        ORDER BY ins_sample_id, id
+        ) isu ON isu.ins_sample_id = io.id
+        LEFT JOIN ins_product ip ON ip.ins_sample_id = isa.id
+        LEFT JOIN user ON isu.user_id = user.id
+        WHERE
+        io.state = 1
+--         # AND io.ins_state != 5
+        and send_time is not null
+        <if test="userId !=null and userId!=''">
+            and (isu.user_id = #{userId} OR isu.user_id is NULL )
+        </if>
+        OR isu.user_id is NULL
+        GROUP BY
+        ip.son_laboratory,
+        io.id
+        ) a
+        LEFT JOIN ins_order_state ios ON ios.ins_order_id = a.id AND ios.laboratory = a.son_laboratory
+        left join (SELECT td.user_id order_user_id, td.ins_sample_id FROM ins_sample_user td,(SELECT max(id) id FROM
+        ins_sample_user where son_laboratory=#{sonLaboratory} GROUP BY ins_sample_id) md where td.id = md.id
+        <if test="userId !=null and userId!=''">
+            and user_id = #{userId} OR user_id is NULL
+        </if>
+        OR user_id is NULL
+        ) isu2 on
+        isu2.ins_sample_id = a.id
+        where ins_state is not null
+        <if test="laboratory != null and laboratory != ''">
+            and a.laboratory=#{laboratory}
+        </if>
+        ORDER BY
+        <!--a.user_id DESC,-->
+        a.type DESC,
+        a.id
+        ) b
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+
+    <select id="selectSampleProductListByOrderId" resultMap="sampleDto">
+        select isa.*,
+               ip.id          ip_id,
+               inspection_item,
+               inspection_item_en,
+               inspection_item_class,
+               inspection_item_class_en,
+               inspection_item_subclass,
+               inspection_item_subclass_en,
+               ip.factory     ip_factory,
+               ip.laboratory  ip_laboratory,
+               ip.sample_type ip_sample_type,
+               ip.sample      ip_sample,
+               ip.model       ip_model,
+               son_laboratory,
+               ip.unit        ip_unit,
+               price,
+               man_hour,
+               man_hour_group,
+               inspection_item_type,
+               inspection_value_type,
+               device_group,
+               checkout_number,
+               section,
+               value_type,
+               method,
+               man_day,
+               bsm,
+               ask,
+               tell,
+               `last_value`,
+               ip.ins_result  ip_ins_result,
+               state,
+               ins_sample_id,
+               ip.create_user ip_create_user,
+               ip.update_user ip_update_user,
+               ip.create_time ip_create_time,
+               ip.update_time ip_update_time,
+               template_id,
+               ipr.ins_value,
+               ipr.com_value,
+               ipr.equip_value,
+               ip.method_s
+        from ins_sample isa
+                 left join ins_product ip on isa.id = ip.ins_sample_id
+                 left join ins_product_result ipr on ip.id = ipr.ins_product_id
+        where ins_order_id = #{id}
+          and state = 1
+--           and ins_fiber_id is null
+--           and ins_fibers_id is null
+          and <!--isa.sample_code NOT REGEXP '/'-->
+            isa.id in(select id1 from (select is2.id id1 ,ip.id from ins_sample is2 left join ins_product ip on is2.id = ip.ins_sample_id where ip.id is not null)s )
+        order by ip.sort asc,
+            case when man_hour_group is NULL then 1
+        when man_hour_group ='' then 1  else 0 end,
+        CASE
+        WHEN man_hour_group REGEXP '^[0-9]' THEN CAST(man_hour_group AS UNSIGNED) -- 濡傛灉浠ユ暟瀛楀紑澶达紝鍒欐寜鐓ф暟瀛楀ぇ灏忔帓搴�
+        WHEN man_hour_group REGEXP '[0-9]+' THEN CAST(SUBSTRING(man_hour_group, 2)AS UNSIGNED) END -- 鎻愬彇瀛楁瘝鍚庨潰鐨勬暟瀛楅儴鍒�
+        ,id asc
+    </select>
+    <select id="getInsOrderAndSample" resultMap="sampleDto">
+        select isa.*,
+               ip.id          ip_id,
+               inspection_item,
+               inspection_item_en,
+               inspection_item_class,
+               inspection_item_class_en,
+               inspection_item_subclass,
+               inspection_item_subclass_en,
+               ip.factory     ip_factory,
+               ip.laboratory  ip_laboratory,
+               ip.sample_type ip_sample_type,
+               ip.sample      ip_sample,
+               ip.model       ip_model,
+               son_laboratory,
+               ip.unit        ip_unit,
+               price,
+               man_hour,
+               man_hour_group,
+               inspection_item_type,
+               inspection_value_type,
+               device_group,
+               checkout_number,
+               section,
+               value_type,
+               method,
+               man_day,
+               bsm,
+               ask,
+               `last_value`,
+               ip.ins_result  ip_ins_result,
+               state,
+               ins_sample_id,
+               ip.create_user ip_create_user,
+               ip.update_user ip_update_user,
+               ip.create_time ip_create_time,
+               ip.update_time ip_update_time,
+               template_id,
+               ipr.ins_value,
+               ipr.com_value,
+               ipr.equip_value,
+               ipr.equip_name,
+               ip.method_s,
+               ip.tell,
+               ip.dic,
+               ip.temperature,
+               ip.humidity
+        from ins_sample isa
+                 left join ins_product ip on isa.id = ip.ins_sample_id
+                 left join ins_product_result ipr on ip.id = ipr.ins_product_id
+        where ins_order_id = #{id}
+          and state = 1
+          and ip.son_laboratory = #{laboratory}
+    </select>
+    <select id="getSampleEn" resultType="java.lang.String">
+        select name_en
+        from product
+        where name = #{sample}
+        limit 1
+    </select>
+    <select id="getSampleEnByObject" resultType="java.lang.String">
+        select specimen_name_en
+        from structure_test_object
+        where specimen_name = #{sample}
+        limit 1
+    </select>
+    <select id="selectInsOrder" resultType="map">
+        SELECT
+            ifs.order_no AS orderNo,
+            ifs.supplier_id AS supplierId,
+            ifs.supplier_name AS supplierName,
+            ifs.part_no AS partNo,
+            ifs.qty_arrived AS qtyArrived,
+            ifs.receiver_date AS receiverDate,
+            ifs.update_batch_no AS updateBatchNo,
+            ifs.part_desc AS partDesc,
+            io.send_time AS sendTime,
+            ifs.declare_user declareUser,
+            ifs.id inventoryQuantityId,
+            ifs.buy_unit_meas buyUnitMeas,
+            io.test_quantity testQuantity,
+            ifs.buy_unit_meas buyUnitMeas
+        FROM
+            ifs_inventory_quantity ifs
+                LEFT JOIN ins_order io ON ifs.id = io.ifs_inventory_id
+        WHERE
+            io.id = #{id}
+    </select>
+    <select id="selectSampleProductListByOrderId2" resultMap="sampleDto">
+        select isa.*,
+               ip.id          ip_id,
+               inspection_item,
+               inspection_item_en,
+               inspection_item_subclass,
+               inspection_item_subclass_en,
+               inspection_item_class,
+               inspection_item_class_en,
+               ip.factory     ip_factory,
+               ip.laboratory  ip_laboratory,
+               ip.sample_type ip_sample_type,
+               ip.sample      ip_sample,
+               ip.model       ip_model,
+               son_laboratory,
+               ip.unit        ip_unit,
+               price,
+               man_hour,
+               man_hour_group,
+               inspection_item_type,
+               inspection_value_type,
+               device_group,
+               checkout_number,
+               section,
+               value_type,
+               method,
+               man_day,
+               bsm,
+               ask,
+               tell,
+               `last_value`,
+               ip.ins_result  ip_ins_result,
+               state,
+               ins_sample_id,
+               ip.create_user ip_create_user,
+               ip.update_user ip_update_user,
+               ip.create_time ip_create_time,
+               ip.update_time ip_update_time,
+               template_id,
+               ipr.ins_value,
+               ipr.com_value,
+               ipr.equip_value,
+               ip.method_s,
+               ip.radius,
+               isa.special_standard_method
+        from ins_sample isa
+                 left join ins_product ip on isa.id = ip.ins_sample_id
+                 left join ins_product_result ipr on ip.id = ipr.ins_product_id
+        where ins_order_id = #{id}
+          and ip.standard_method_list_id is not null
+          and state = 1
+          and ip.is_binding != 1
+        order by ip.sort asc,
+            case when man_hour_group is NULL then 1
+                      when man_hour_group ='' then 1  else 0 end,
+                 CASE
+                     WHEN man_hour_group REGEXP '^[0-9]' THEN CAST(man_hour_group AS UNSIGNED) -- 濡傛灉浠ユ暟瀛楀紑澶达紝鍒欐寜鐓ф暟瀛楀ぇ灏忔帓搴�
+                     WHEN man_hour_group REGEXP '[0-9]+' THEN CAST(SUBSTRING(man_hour_group, 2)AS UNSIGNED) END -- 鎻愬彇瀛楁瘝鍚庨潰鐨勬暟瀛楅儴鍒�
+                ,id asc
+    </select>
+
+    <select id="getInsProduct1" resultMap="product">
+        select <include refid="getInsProducSql"/>
+        from ins_product ip
+                 left join ins_product_result ipr on ip.id = ipr.ins_product_id
+        where ins_sample_id = #{id}
+          and state = 1
+          and ip.son_laboratory = #{laboratory}
+          and ins_fiber_id is null
+          and ins_fibers_id is null
+          and standard_method_list_id is not null
+        /* 鐢电紗閰嶇疆鏍囪瘑 */
+        <if test="cableTag == null or cableTag == ''">
+            and ip.cable_tag is null
+        </if>
+        <if test="cableTag != null and cableTag != ''">
+            and ip.cable_tag = #{cableTag}
+        </if>
+        /* 閲嶅鍊兼爣璇� */
+        <if test="repetitionTag == null or repetitionTag == ''">
+            and ip.repetition_tag is null
+        </if>
+        <if test="repetitionTag != null and repetitionTag != ''">
+            and ip.repetition_tag = #{repetitionTag}
+        </if>
+        <if test="isDisqualification != null and isDisqualification != ''">
+            and ip.ins_result = 0
+        </if>
+        order by sort asc
+    </select>
+
+    <select id="getInsProduct6" resultMap="product">
+        select <include refid="getInsProducSql"/>
+        from ins_product ip
+        left join ins_product_result ipr on ip.id = ipr.ins_product_id
+        where ins_sample_id = #{id}
+        and state = 1
+        and ip.son_laboratory = #{laboratory}
+        and ins_fiber_id is null
+        and ins_fibers_id is null
+        and standard_method_list_id is not null
+        and ip.raw_material_tag = #{rawMaterialTag}
+        <if test="isDisqualification != null and isDisqualification != ''">
+            and ip.ins_result = 0
+        </if>
+        order by sort asc
+    </select>
+
+    <select id="getDetailById" resultMap="sampleVo">
+        select is2.*,
+               code methodName
+        from ins_sample is2
+                 inner join standard_method sm on standard_method_list_id = sm.id
+        where is2.id = #{sampleId}
+    </select>
+
+    <select id="selMethodById" resultType="java.lang.String">
+        select code
+        from standard_method
+        where id = (select standard_method_list_id from ins_sample where id = #{sampleId})
+    </select>
+
+    <!-- 鏌ョ湅鐢电紗閰嶇疆鏍囪瘑 -->
+    <select id="getCableTag" resultType="java.util.Map">
+        select ip.cable_tag cableTag,
+               CASE
+                   WHEN COUNT(ip.last_value) = 0 THEN '0'
+                   WHEN COUNT(CASE WHEN ip.last_value = '' OR ip.last_value IS NULL THEN 1 END) = 0 THEN '2'
+                   ELSE '2'
+                   END AS status
+        from ins_product ip
+        where ins_sample_id = #{id}
+          and state = 1
+          and ip.son_laboratory = #{laboratory}
+          and ins_fiber_id is null
+          and ins_fibers_id is null
+          and standard_method_list_id is not null
+          and ip.cable_tag is not null
+        group by ip.cable_tag
+    </select>
+
+    <!-- 鍘熸潗鏂欐煡鐪嬮厤缃爣璇� -->
+    <select id="getRawMaterialTag" resultType="java.util.Map">
+        select ip.raw_material_tag rawMaterialTag,
+               CASE
+                   WHEN COUNT(ip.last_value) = 0 THEN '0'
+                   WHEN COUNT(CASE WHEN ip.last_value = '' OR ip.last_value IS NULL THEN 1 END) = 0 THEN '2'
+                   ELSE '1'
+                   END AS status
+        from ins_product ip
+        where ins_sample_id = #{id}
+          and state = 1
+          and ip.son_laboratory = #{laboratory}
+          and ins_fiber_id is null
+          and ins_fibers_id is null
+          and standard_method_list_id is not null
+          and ip.raw_material_tag is not null
+        group by ip.raw_material_tag
+    </select>
+
+    <!-- 鏌ョ湅閲嶅鏍囪瘑 -->
+    <select id="getRepetitionTag" resultType="java.util.Map">
+        select ip.repetition_tag repetitionTag,
+               CASE
+                   WHEN COUNT(ip.last_value) = 0 THEN '0'
+                   WHEN COUNT(CASE WHEN ip.last_value = '' OR ip.last_value IS NULL THEN 1 END) = 0 THEN '2'
+                   ELSE '1'
+                   END AS status,
+               GROUP_CONCAT(DISTINCT ip.radius SEPARATOR '锛�') AS radius
+        from ins_product ip
+        where ins_sample_id = #{id}
+          and state = 1
+          and ip.son_laboratory = #{laboratory}
+          and ins_fiber_id is null
+          and ins_fibers_id is null
+          and standard_method_list_id is not null
+          and ip.repetition_tag is not null
+        /* 鐢电紗閰嶇疆鏍囪瘑 */
+        <if test="cableTag == null or cableTag == ''">
+            and ip.cable_tag is null
+        </if>
+        <if test="cableTag != null and cableTag != ''">
+            and ip.cable_tag = #{cableTag}
+        </if>
+        group by ip.repetition_tag
+    </select>
+
+    <select id="selectExemptionByOrderId" resultType="com.ruoyi.inspect.dto.SampleProductDto">
+        select *
+        from ins_sample
+        where ins_order_id = #{id}
+    </select>
+    <select id="selectSupplierDensityModel" resultType="java.lang.String">
+        select psd.density_value densityValue
+        from product_supplier_density psd
+        where psd.product_id = (select id
+                                from product
+                                where name = #{sample}
+                                limit 1)
+          and psd.supplier_name = #{production}
+          and psd.model = #{model}
+        limit 1
+    </select>
+    <select id="selectSupplierDensity" resultType="java.lang.String">
+        select psd.density_value densityValue
+        from product_supplier_density psd
+        where psd.product_id = (select id
+                                from product
+                                where name = #{sample}
+                                limit 1)
+          and psd.supplier_name = #{production}
+          and (psd.model = '' or psd.model is null)
+        limit 1
+    </select>
+
+    <!-- 鏌ヨ妫�楠岄」妫�楠岀粨鏋� -->
+    <select id="selectProductResult" resultMap="product">
+        select <include refid="getInsProducSql"/>
+        from ins_product ip
+        left join ins_product_result ipr on ip.id = ipr.ins_product_id
+        where ip.id in
+        <foreach collection="itemIds" index="index" open="(" separator="," close=")" item="val">
+            #{val}
+        </foreach>
+        order by ip.sort asc
+    </select>
+
+</mapper>
diff --git a/inspect-server/src/main/resources/mapper/InsSampleUserMapper.xml b/inspect-server/src/main/resources/mapper/InsSampleUserMapper.xml
new file mode 100644
index 0000000..5cad2d2
--- /dev/null
+++ b/inspect-server/src/main/resources/mapper/InsSampleUserMapper.xml
@@ -0,0 +1,4 @@
+<?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.InsSampleUserMapper">
+</mapper>
diff --git a/inspect-server/src/main/resources/mapper/InsUnqualifiedHandlerMapper.xml b/inspect-server/src/main/resources/mapper/InsUnqualifiedHandlerMapper.xml
new file mode 100644
index 0000000..fdeb4af
--- /dev/null
+++ b/inspect-server/src/main/resources/mapper/InsUnqualifiedHandlerMapper.xml
@@ -0,0 +1,87 @@
+<?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.InsUnqualifiedHandlerMapper">
+
+    <sql id="Base_Column_List">
+        id,no,supplier_name,
+        material_name,production_batch,cargo_quantity,
+        specs_models,inspect_time,feedback_user,
+        feedback_time,classification,off_grade_ascription,
+        unqualified_desc,inventory_quantity_id
+    </sql>
+    <select id="selectPageList" resultType="com.ruoyi.inspect.vo.UnqualifiedHandlerVO">
+        select * from (select
+            iiq.*,
+            iuh.id as handler_id,
+            iuh.no,
+            iuh.material_name,
+            iuh.production_batch,
+            iuh.cargo_quantity,
+            iuh.specs_models,
+            iuh.inspect_time,
+            iuh.feedback_user,
+            iuh.feedback_time,
+            iuh.classification,
+            iuh.off_grade_ascription,
+            iuh.unqualified_desc,
+            iuh.inventory_quantity_id,
+            iuh.oa_state,
+            iuh.request_id,
+            iuh.file_url,
+            iuh.headline
+        from
+            ins_unqualified_handler iuh
+        inner join
+            ifs_inventory_quantity iiq
+        on
+            iuh.inventory_quantity_id = iiq.id)tempA
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+    <select id="findById" resultType="com.ruoyi.inspect.vo.UnqualifiedHandlerVO">
+        select * from (select
+        iiq.*,
+        iuh.id as handler_id,
+        iuh.no,
+        iuh.headline,
+        iuh.material_name,
+        iuh.production_batch,
+        iuh.cargo_quantity,
+        iuh.specs_models,
+        iuh.inspect_time,
+        iuh.feedback_user,
+        iuh.feedback_time,
+        iuh.classification,
+        iuh.off_grade_ascription,
+        iuh.unqualified_desc,
+        iuh.inventory_quantity_id,
+        iuh.request_id,
+        iuh.oa_state,
+        iuh.file_url
+        from
+        ins_unqualified_handler iuh
+        inner join
+        ifs_inventory_quantity iiq
+        on
+        iuh.inventory_quantity_id = iiq.id)tempA
+        where tempA.handler_id = #{id}
+    </select>
+    <select id="getOaFlow" resultType="com.ruoyi.inspect.pojo.CommonOa">
+        select co.id,
+               co.node_name,
+               co.operation,
+               co.approver,
+               co.approval_date,
+               co.approval_time,
+               co.approval_opinion,
+               co.workflow_id
+        from common_oa co
+                 left join ins_unqualified_handler iuh on iuh.request_id = co.workflow_id
+        where iuh.id = #{id}
+        and operation != '鎶勯��'
+        group by co.node_name
+    </select>
+</mapper>
diff --git a/inspect-server/src/main/resources/mapper/InsUnqualifiedRetestProductMapper.xml b/inspect-server/src/main/resources/mapper/InsUnqualifiedRetestProductMapper.xml
new file mode 100644
index 0000000..4be6b91
--- /dev/null
+++ b/inspect-server/src/main/resources/mapper/InsUnqualifiedRetestProductMapper.xml
@@ -0,0 +1,200 @@
+<?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.InsUnqualifiedRetestProductMapper">
+    <resultMap id="product" type="com.ruoyi.inspect.pojo.InsProduct">
+        <id property="id" column="ip_id" jdbcType="INTEGER"/>
+        <result property="inspectionItem" column="inspection_item" jdbcType="VARCHAR"/>
+        <result property="inspectionItemEn" column="inspection_item_en" jdbcType="VARCHAR"/>
+        <result property="inspectionItemSubclass" column="inspection_item_subclass" jdbcType="VARCHAR"/>
+        <result property="inspectionItemSubclassEn" column="inspection_item_subclass_en" jdbcType="VARCHAR"/>
+        <result property="inspectionItemClass" column="inspection_item_class" jdbcType="VARCHAR"/>
+        <result property="inspectionItemClassEn" column="inspection_item_class_en" jdbcType="VARCHAR"/>
+        <result property="factory" column="ip_factory" jdbcType="VARCHAR"/>
+        <result property="laboratory" column="ip_laboratory" jdbcType="VARCHAR"/>
+        <result property="sampleType" column="ip_sample_type" jdbcType="VARCHAR"/>
+        <result property="sample" column="ip_sample" jdbcType="VARCHAR"/>
+        <result property="model" column="ip_model" jdbcType="VARCHAR"/>
+        <result property="sonLaboratory" column="son_laboratory" jdbcType="VARCHAR"/>
+        <result property="unit" column="ip_unit" jdbcType="VARCHAR"/>
+        <result property="price" column="price" jdbcType="DECIMAL"/>
+        <result property="manHour" column="man_hour" jdbcType="DOUBLE"/>
+        <result property="manHourGroup" column="man_hour_group" jdbcType="VARCHAR"/>
+        <result property="inspectionItemType" column="inspection_item_type" jdbcType="VARCHAR"/>
+        <result property="inspectionValueType" column="inspection_value_type" jdbcType="VARCHAR"/>
+        <result property="deviceGroup" column="device_group" jdbcType="VARCHAR"/>
+        <result property="checkoutNumber" column="checkout_number" jdbcType="INTEGER"/>
+        <result property="section" column="section" jdbcType="VARCHAR"/>
+        <result property="valueType" column="value_type" jdbcType="VARCHAR"/>
+        <result property="method" column="method" jdbcType="VARCHAR"/>
+        <result property="manDay" column="man_day" jdbcType="INTEGER"/>
+        <result property="bsm" column="bsm" jdbcType="VARCHAR"/>
+        <result property="ask" column="ask" jdbcType="VARCHAR"/>
+        <result property="tell" column="tell" jdbcType="VARCHAR"/>
+        <result property="lastValue" column="last_value" jdbcType="VARCHAR"/>
+        <result property="insResult" column="ip_ins_result" jdbcType="INTEGER"/>
+        <result property="state" column="state" jdbcType="INTEGER"/>
+        <result property="insBushId" column="ins_bush_id" jdbcType="INTEGER"/>
+        <result property="insSampleId" column="ins_sample_id" jdbcType="INTEGER"/>
+        <result property="createUser" column="ip_create_user" jdbcType="INTEGER"/>
+        <result property="updateUser" column="ip_update_user" jdbcType="INTEGER"/>
+        <result property="createTime" column="ip_create_time" jdbcType="TIMESTAMP"/>
+        <result property="updateTime" column="ip_update_time" jdbcType="TIMESTAMP"/>
+        <result property="templateId" column="template_id" jdbcType="INTEGER"/>
+        <result property="methodS" column="method_s"/>
+        <result property="tell" column="tell"/>
+        <result property="dic" column="dic"/>
+        <result property="temperature" column="temperature"/>
+        <result property="humidity" column="humidity"/>
+        <result property="cableTag" column="cable_tag"/>
+        <collection property="insProductResult" resultMap="insProductResult"/>
+    </resultMap>
+
+    <resultMap id="insProductResult" type="com.ruoyi.inspect.pojo.InsProductResult">
+        <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="equipName" column="equip_name" jdbcType="VARBINARY"/>
+    </resultMap>
+
+       <sql id="getInsProducSql">
+            ip.id          ip_id,
+               inspection_item,
+               inspection_item_en,
+               inspection_item_class,
+               inspection_item_class_en,
+               inspection_item_subclass,
+               inspection_item_subclass_en,
+               ip.factory     ip_factory,
+               ip.laboratory  ip_laboratory,
+               ip.sample_type ip_sample_type,
+               ip.sample      ip_sample,
+               ip.model       ip_model,
+               son_laboratory,
+               ip.unit        ip_unit,
+               price,
+               man_hour,
+               man_hour_group,
+               inspection_item_type,
+               inspection_value_type,
+               device_group,
+               checkout_number,
+               section,
+               value_type,
+               method,
+               man_day,
+               bsm,
+               ask,
+               `last_value`,
+               ip.ins_result  ip_ins_result,
+               state,
+               ins_sample_id,
+               ip.create_user ip_create_user,
+               ip.update_user ip_update_user,
+               ip.create_time ip_create_time,
+               ip.update_time ip_update_time,
+               template_id,
+               ipr.ins_value,
+               ipr.com_value,
+               ipr.equip_value,
+               ipr.equip_name,
+               ip.method_s,
+               ip.tell,
+               ip.dic,
+               ip.cable_tag
+       </sql>
+
+    <select id="selectRetestProduct" resultType="com.ruoyi.inspect.pojo.InsUnqualifiedRetestProduct">
+        select id ins_product_id,
+               inspection_item,
+               inspection_item_subclass,
+               factory,
+               laboratory,
+               sample_type,
+               sample,
+               model,
+               son_laboratory,
+               unit,
+               price,
+               man_hour,
+               man_hour_group,
+               '0' inspection_item_type,
+               inspection_value_type,
+               device_group,
+               checkout_number,
+               section,
+               value_type,
+               method,
+               man_day,
+               bsm,
+               ask,
+               tell,
+               state,
+               ins_sample_id,
+               create_user,
+               update_user,
+               create_time,
+               update_time,
+               template_id,
+               dic,
+               method_s,
+               ins_fiber_id,
+               ins_fibers_id,
+               inspection_item_en,
+               inspection_item_subclass_en,
+               inspection_item_class,
+               inspection_item_class_en,
+               standard_method_list_id,
+               temperature,
+               humidity,
+               ins_bush_id,
+               radius,
+               cable_tag,
+               raw_material_tag,
+               sort,
+               '1' retest_tag
+        from ins_product
+        where id in
+        <foreach collection="ids" index="index" open="(" separator="," close=")" item="val">
+            #{val}
+        </foreach>
+    </select>
+       <select id="getInsProductUnqualifiedRetest1" resultMap="product">
+              select <include refid="getInsProducSql"/>
+              from ins_unqualified_retest_product ip
+              left join ins_unqualified_retest_result ipr on ip.id = ipr.retest_product_id
+              where ins_sample_id = #{id}
+              and state = 1
+              and ip.son_laboratory = #{laboratory}
+              and ins_fiber_id is null
+              and ins_fibers_id is null
+              and standard_method_list_id is not null
+              and ip.cable_tag is null
+              and ip.retest_tag = #{retestTag}
+       </select>
+       <select id="getInsProductUnqualifiedRetest5" resultMap="product">
+           select <include refid="getInsProducSql"/>
+           from ins_unqualified_retest_product ip
+           left join ins_unqualified_retest_result ipr on ip.id = ipr.retest_product_id
+           where ins_sample_id = #{id}
+           and state = 1
+           and ip.son_laboratory = #{laboratory}
+           and ins_fiber_id is null
+           and ins_fibers_id is null
+           and standard_method_list_id is not null
+           and ip.cable_tag = #{cableTag}
+           and ip.retest_tag = #{retestTag}
+       </select>
+       <select id="getInsProductUnqualifiedRetest6" resultMap="product">
+           select <include refid="getInsProducSql"/>
+           from ins_unqualified_retest_product ip
+           left join ins_unqualified_retest_result ipr on ip.id = ipr.retest_product_id
+           where ins_sample_id = #{id}
+           and state = 1
+           and ip.son_laboratory = #{laboratory}
+           and ins_fiber_id is null
+           and ins_fibers_id is null
+           and standard_method_list_id is not null
+           and ip.raw_material_tag = #{rawMaterialTag}
+           and ip.retest_tag = #{retestTag}
+       </select>
+</mapper>
diff --git a/inspect-server/src/main/resources/mapper/RawMaterialOrderTemplateMapper.xml b/inspect-server/src/main/resources/mapper/RawMaterialOrderTemplateMapper.xml
new file mode 100644
index 0000000..cc06bb9
--- /dev/null
+++ b/inspect-server/src/main/resources/mapper/RawMaterialOrderTemplateMapper.xml
@@ -0,0 +1,4 @@
+<?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.RawMaterialOrderTemplateMapper">
+</mapper>
diff --git a/inspect-server/src/main/resources/mapper/SpotCheckQuarterItemMapper.xml b/inspect-server/src/main/resources/mapper/SpotCheckQuarterItemMapper.xml
new file mode 100644
index 0000000..f1404a5
--- /dev/null
+++ b/inspect-server/src/main/resources/mapper/SpotCheckQuarterItemMapper.xml
@@ -0,0 +1,4 @@
+<?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.SpotCheckQuarterItemMapper">
+</mapper>
diff --git a/performance-server/src/main/resources/mapper/PerformanceShiftMapper.xml b/performance-server/src/main/resources/mapper/PerformanceShiftMapper.xml
index 751ca1a..64b3dfc 100644
--- a/performance-server/src/main/resources/mapper/PerformanceShiftMapper.xml
+++ b/performance-server/src/main/resources/mapper/PerformanceShiftMapper.xml
@@ -11,13 +11,13 @@
 
     <select id="performanceShiftPage" resultMap="performanceShiftPageMap">
         SELECT
-        if(u2.department is not null and u2.department != '', CONCAT(u2.name, '锛�', u2.department, '锛�'), 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
         user u
         left join department_lims dl on FIND_IN_SET(dl.id,u.depart_lims_id)
-        where state=1
+        where status = '0'
+        and del_flag = '0'
         <if test="laboratory != null and laboratory != ''">
           and   dl.name=#{laboratory}
         </if>
@@ -31,8 +31,8 @@
                 and u2.name like concat('%', #{userName}, '%')
             </if>
         </where>
-        order by s.create_time
         GROUP BY u2.id
+        order by s.create_time
     </select>
 
     <select id="performanceShiftYearPage" resultType="map">
@@ -42,7 +42,8 @@
         LEFT JOIN (SELECT u.* from
         user u
         left join department_lims dl on FIND_IN_SET(dl.id,u.depart_lims_id)
-        where state=1
+        where status = '0'
+        and del_flag = '0'
         <if test="laboratory != null and laboratory != ''">
             and   dl.name=#{laboratory}
         </if>
@@ -60,7 +61,7 @@
     </select>
 
     <select id="performanceShiftYear" resultType="java.util.Map">
-        SELECT if(u2.department is not null and u2.department != '', CONCAT(u2.name, '锛�', u2.department, '锛�'), u2.name) name,
+        SELECT
         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
@@ -68,7 +69,8 @@
         LEFT JOIN (SELECT u.* from
         user u
         left join department_lims dl on FIND_IN_SET(dl.id,u.depart_lims_id)
-        where state=1
+        where status = '0'
+        and del_flag = '0'
         <if test="laboratory != null and laboratory != ''">
             and   dl.name=#{laboratory}
         </if>
@@ -87,7 +89,7 @@
     </select>
 
     <select id="performanceShiftYearList" resultType="map">
-        SELECT if(u.department is not null and u.department != '', CONCAT(u.name, '锛�', u.department, '锛�'), u.name) name,
+        SELECT
         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
@@ -109,7 +111,6 @@
 
     <select id="performanceShiftList" resultMap="performanceShiftPageMap">
         SELECT
-        if(u.department is not null and u.department != '', CONCAT(u.name, '锛�', 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, u.department
         FROM performance_shift s
         LEFT JOIN user u on u.id = s.user_id
@@ -123,8 +124,8 @@
             <if test="laboratory != null and laboratory != ''">
             </if>
         </where>
-        order by s.create_time
         GROUP BY u.id
+        order by s.create_time
     </select>
 
     <select id="seldepLimsId" resultType="java.lang.String">
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index 5449aa6..5267ad5 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -17,12 +17,12 @@
 
     <dependencies>
 
-        <!-- spring-boot-devtools -->
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-devtools</artifactId>
-            <optional>true</optional> <!-- 琛ㄧず渚濊禆涓嶄細浼犻�� -->
-        </dependency>
+<!--        &lt;!&ndash; spring-boot-devtools &ndash;&gt;-->
+<!--        <dependency>-->
+<!--            <groupId>org.springframework.boot</groupId>-->
+<!--            <artifactId>spring-boot-devtools</artifactId>-->
+<!--            <optional>true</optional> &lt;!&ndash; 琛ㄧず渚濊禆涓嶄細浼犻�� &ndash;&gt;-->
+<!--        </dependency>-->
 
         <!-- swagger3-->
         <dependency>
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
index 1133e0c..7a63aa3 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
@@ -14,7 +14,7 @@
 {
     public static void main(String[] args)
     {
-        System.setProperty("spring.devtools.restart.enabled", "false");
+//        System.setProperty("spring.devtools.restart.enabled", "false");
         SpringApplication.run(RuoYiApplication.class, args);
     }
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java
index eb0bfd5..8a25b60 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java
@@ -1,11 +1,15 @@
 package com.ruoyi.web.controller.system;
 
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.core.domain.entity.User;
 import com.ruoyi.system.service.UserService;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.util.Map;
 
 
 /**
@@ -21,5 +25,11 @@
     @Resource
     private UserService userService;
 
+    @ApiOperation(value = "鏍规嵁鏉′欢鑾峰彇鐢ㄦ埛鍒楄〃")
+    @GetMapping("/selectUserCondition")
+    public Result selectUserCondition(User user, String type){
+        return Result.success(userService.selectUserCondition(user, type));
+    }
+
 }
 
diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml
index a77bf59..9980440 100644
--- a/ruoyi-admin/src/main/resources/application-druid.yml
+++ b/ruoyi-admin/src/main/resources/application-druid.yml
@@ -1,70 +1,99 @@
 # 鏁版嵁婧愰厤缃�
 spring:
-    datasource:
-        type: com.alibaba.druid.pool.DruidDataSource
-        driverClassName: com.mysql.cj.jdbc.Driver
-        druid:
-            # 涓诲簱鏁版嵁婧�
-            master:
-                url: jdbc:mysql://114.132.189.42:9004/lims-ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
-                username: root
-                password: 123456
-            # 浠庡簱鏁版嵁婧�
-            slave:
-                # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
-                enabled: false
-                url:
-                username:
-                password:
-            # 鍒濆杩炴帴鏁�
-            initialSize: 5
-            # 鏈�灏忚繛鎺ユ睜鏁伴噺
-            minIdle: 10
-            # 鏈�澶ц繛鎺ユ睜鏁伴噺
-            maxActive: 20
-            # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
-            maxWait: 60000
-            # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
-            connectTimeout: 30000
-            # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
-            socketTimeout: 60000
-            # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
-            timeBetweenEvictionRunsMillis: 60000
-            # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
-            minEvictableIdleTimeMillis: 300000
-            # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
-            maxEvictableIdleTimeMillis: 900000
-            # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
-            validationQuery: SELECT 1 FROM DUAL
-            testWhileIdle: true
-            testOnBorrow: false
-            testOnReturn: false
-            webStatFilter:
-                enabled: true
-            statViewServlet:
-                enabled: true
-                # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
-                allow:
-                url-pattern: /druid/*
-                # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
-                login-username: ruoyi
-                login-password: 123456
-            filter:
-                stat:
-                    enabled: true
-                    # 鎱QL璁板綍
-                    log-slow-sql: true
-                    slow-sql-millis: 1000
-                    merge-sql: true
-                wall:
-                    config:
-                        multi-statement-allow: true
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    driverClassName: com.mysql.cj.jdbc.Driver
+    druid:
+      # 涓诲簱鏁版嵁婧�
+      master:
+        url: jdbc:mysql://114.132.189.42:9004/lims-ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+        username: root
+        password: 123456
+      # 浠庡簱鏁版嵁婧�
+      slave:
+        # 浠庢暟鎹簮寮�鍏�/榛樿鍏抽棴
+        enabled: false
+        url:
+        username:
+        password:
+      # 鍒濆杩炴帴鏁�
+      initialSize: 5
+      # 鏈�灏忚繛鎺ユ睜鏁伴噺
+      minIdle: 10
+      # 鏈�澶ц繛鎺ユ睜鏁伴噺
+      maxActive: 20
+      # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂�
+      maxWait: 60000
+      # 閰嶇疆杩炴帴瓒呮椂鏃堕棿
+      connectTimeout: 30000
+      # 閰嶇疆缃戠粶瓒呮椂鏃堕棿
+      socketTimeout: 60000
+      # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫�娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶆槸姣
+      timeBetweenEvictionRunsMillis: 60000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      minEvictableIdleTimeMillis: 300000
+      # 閰嶇疆涓�涓繛鎺ュ湪姹犱腑鏈�澶х敓瀛樼殑鏃堕棿锛屽崟浣嶆槸姣
+      maxEvictableIdleTimeMillis: 900000
+      # 閰嶇疆妫�娴嬭繛鎺ユ槸鍚︽湁鏁�
+      validationQuery: SELECT 1 FROM DUAL
+      testWhileIdle: true
+      testOnBorrow: false
+      testOnReturn: false
+      webStatFilter:
+        enabled: true
+      statViewServlet:
+        enabled: true
+        # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂�
+        allow:
+        url-pattern: /druid/*
+        # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮�
+        login-username: ruoyi
+        login-password: 123456
+      filter:
+        stat:
+          enabled: true
+          # 鎱QL璁板綍
+          log-slow-sql: true
+          slow-sql-millis: 1000
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
 
 
 minio:
-    endpoint: http://114.132.189.42/
-    port: 7019
-    secure: false
-    accessKey: admin
-    secretKey: 12345678
-    preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+  endpoint: http://114.132.189.42/
+  port: 7019
+  secure: false
+  accessKey: admin
+  secretKey: 12345678
+  preview-expiry: 24 # 棰勮鍦板潃榛樿24灏忔椂
+
+# 鐓х墖瀛樺偍璺緞+++++++++++++++++++++++++++杩愮淮闇�瑕侀厤缃�+++++++++++++++++++++++++++
+file:
+  path: D:\椤圭洰鏂囦欢瀛樺偍\image
+  # 杞琾df鏂囦欢璺緞
+  licenseUrl: D:\20892\Desktop\lims\code\center-lims-after\inspect-server\src\main\resources\lib\license.xml
+  # 涓婁紶鏂囦欢鍏佽鐨勬墿灞曞悕
+  allowed: png,jpg,jpeg,gif
+
+wordUrl: D:\椤圭洰鏂囦欢瀛樺偍\word
+twoCode: D:\椤圭洰鏂囦欢瀛樺偍\two_code
+
+
+#oa:
+#    oaHost: http://192.168.0.49:8000/oa_workflowrequest.asmx?wsdl
+#    prodIp: http://192.168.21.53:8081
+#    unqualifiedProcessId: 41974
+
+wechat:
+  # 璐ㄩ噺鎶ユ閫氱煡
+  examiningUrl: https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=21993616-9966-4fe4-81b0-68e99a40c964
+
+ifs:
+  contract: ZTZB
+  contract-key-get: 4ttDeLKNsZuhstjtROMcRE1USNFXKdFYE7lQ2p1m5Bo=
+  contract-key-post: 4ttDeLKNsZuhstjtROMcRE1USNFXKdFYE7lQ2p1m5Bo=
+  custorder: http://192.168.20.47/PurchService.ashx?
+  custorder-port: http://192.168.20.47:8008/PurchService.ashx?
+  erp-services: http://192.168.20.47:8081
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 0ab2d16..11725f1 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -53,6 +53,10 @@
     basename: i18n/messages
   profiles:
     active: druid
+  # 鍏ㄥ眬鏃堕棿澶勭悊 LocalDateTime鏃堕棿搴忓垪鍙�
+  jackson:
+    date-format: yyyy-MM-dd HH:mm:ss
+    time-zone: GMT+8
   # 鏂囦欢涓婁紶
   servlet:
     multipart:
@@ -61,10 +65,10 @@
       # 璁剧疆鎬讳笂浼犵殑鏂囦欢澶у皬
       max-request-size: 20MB
   # 鏈嶅姟妯″潡
-  devtools:
-    restart:
-      # 鐑儴缃插紑鍏�
-      enabled: true
+#  devtools:
+#    restart:
+#      # 鐑儴缃插紑鍏�
+#      enabled: false
   # redis 閰嶇疆
   redis:
     # 鍦板潃
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/Result.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/Result.java
index 2703c59..37cffe6 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/Result.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/Result.java
@@ -20,7 +20,7 @@
 
     private int code;
 
-    private String msg;
+    private String message;
 
     private T data;
 
@@ -69,7 +69,7 @@
         Result<T> apiResult = new Result<>();
         apiResult.setCode(code);
         apiResult.setData(data);
-        apiResult.setMsg(msg);
+        apiResult.setMessage(msg);
         return apiResult;
     }
 
@@ -83,14 +83,14 @@
         this.code = code;
     }
 
-    public String getMsg()
+    public String getMessage()
     {
-        return msg;
+        return message;
     }
 
-    public void setMsg(String msg)
+    public void setMessage(String message)
     {
-        this.msg = msg;
+        this.message = message;
     }
 
     public T getData()
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateImageUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateImageUtil.java
new file mode 100644
index 0000000..7fb91ee
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateImageUtil.java
@@ -0,0 +1,61 @@
+package com.ruoyi.common.utils;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.font.FontRenderContext;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * @Author zhuo
+ * @Date 2024/9/28
+ */
+public class DateImageUtil {
+
+    /**
+     * 鐢熸垚 褰撳墠鏃ユ湡鐨勭敾甯�
+     * @return
+     */
+    public static InputStream createDateImage(LocalDateTime date) {
+        int width = 80;
+        int height = 20;
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");
+        if (date == null) {
+            date = LocalDateTime.now();
+        }
+        String s = date.format(formatter);
+
+        Font font = new Font("Serif", Font.BOLD, 10);
+        // 鍒涘缓涓�涓敾甯冿紙鑳屾櫙閫忔槑锛�
+        BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
+        // 鑾峰彇鐢诲竷鐨勭敾绗�
+        Graphics2D g2 = (Graphics2D) bi.getGraphics();
+        // 寮�濮嬬粯鍥�
+        g2.setComposite(AlphaComposite.Src); // 纭繚缁樺浘鏃舵槸閫忔槑鑳屾櫙
+        g2.setBackground(new Color(0, 0, 0, 0)); // 鑳屾櫙鑹蹭负閫忔槑
+        g2.clearRect(0, 0, width, height);
+        g2.setPaint(new Color(0, 0, 0)); // 璁剧疆缁樺埗棰滆壊
+        FontRenderContext context = g2.getFontRenderContext();
+        Rectangle2D bounds = font.getStringBounds(s, context);
+        double x = (width - bounds.getWidth()) / 2;
+        double y = (height - bounds.getHeight()) / 2;
+        double ascent = -bounds.getY();
+        double baseY = y + ascent;
+        g2.drawString(s, (int) x, (int) baseY);
+        g2.dispose(); // 閲婃斁鐢荤瑪璧勬簮
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+
+        try {
+            ImageIO.write(bi, "png", os);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return new ByteArrayInputStream(os.toByteArray());
+    }
+}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FormatterConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FormatterConfig.java
new file mode 100644
index 0000000..5360870
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/FormatterConfig.java
@@ -0,0 +1,51 @@
+//package com.ruoyi.framework.config;
+//
+//import com.fasterxml.jackson.databind.DeserializationFeature;
+//import com.fasterxml.jackson.databind.ObjectMapper;
+//import com.fasterxml.jackson.databind.SerializationFeature;
+//import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+//import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
+//import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.http.converter.HttpMessageConverter;
+//import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
+//import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+//import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
+//
+//import java.text.SimpleDateFormat;
+//import java.time.LocalDateTime;
+//import java.time.format.DateTimeFormatter;
+//import java.util.List;
+//
+//@Configuration
+//public class FormatterConfig extends WebMvcConfigurationSupport {
+//
+//
+//    @Value("${spring.jackson.date-format}")
+//    private String pattern;
+//
+//    // 鍏ㄥ眬鏍煎紡鍖栧鐞�
+//    @Override
+//    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
+//        Jackson2ObjectMapperBuilder json = Jackson2ObjectMapperBuilder.json();
+//        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
+//
+//        //localDateTime鏍煎紡鍖�
+//        JavaTimeModule module = new JavaTimeModule();
+//        LocalDateTimeDeserializer dateTimeDeserializer = new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(pattern));
+//        LocalDateTimeSerializer dateTimeSerializer = new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern));
+//        module.addDeserializer(LocalDateTime.class, dateTimeDeserializer);
+//        module.addSerializer(LocalDateTime.class, dateTimeSerializer);
+//        ObjectMapper objectMapper = json.modules(module)
+//                .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).build();
+//
+//        //date鏃堕棿鏍煎紡鍖�
+//        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+//        objectMapper.setDateFormat(new SimpleDateFormat(pattern.split(" ")[0]));
+//
+//        // 璁剧疆鏍煎紡鍖栧唴瀹�
+//        converter.setObjectMapper(objectMapper);
+//        converters.add(0, converter);
+//    }
+//}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserMapper.java
index 0f3eafd..6bfa898 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserMapper.java
@@ -1,7 +1,11 @@
 package com.ruoyi.system.mapper;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.common.core.domain.entity.User;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 鐢ㄦ埛淇℃伅琛�
@@ -11,5 +15,12 @@
  */
 public interface UserMapper extends BaseMapper<User> {
 
+    /**
+     * 鏍规嵁鏉′欢鑾峰彇鐢ㄦ埛鍒楄〃
+     * @param ew
+     * @param type
+     * @return
+     */
+    List<User> selectUserCondition(@Param("ew") QueryWrapper<User> ew, @Param("type") String type);
 }
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/UserService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/UserService.java
index b073d56..615f700 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/UserService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/UserService.java
@@ -3,6 +3,8 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.common.core.domain.entity.User;
 
+import java.util.List;
+
 /**
  * 鐢ㄦ埛淇℃伅琛�
  *
@@ -11,5 +13,13 @@
  */
 public interface UserService extends IService<User> {
 
+
+    /**
+     * 鏍规嵁鏉′欢鑾峰彇鐢ㄦ埛鍒楄〃
+     * @param user
+     * @param type
+     * @return
+     */
+    List<User> selectUserCondition(User user, String type);
 }
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserServiceImpl.java
index acc052e..7251c0c 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserServiceImpl.java
@@ -2,9 +2,12 @@
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.core.domain.entity.User;
+import com.ruoyi.common.utils.QueryWrappers;
 import com.ruoyi.system.mapper.UserMapper;
 import com.ruoyi.system.service.UserService;
 import org.springframework.stereotype.Service;
+
+import java.util.List;
 
 /**
  * 鐢ㄦ埛淇℃伅琛�
@@ -15,5 +18,15 @@
 @Service
 public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
 
+    /**
+     * 鏍规嵁鏉′欢鑾峰彇鐢ㄦ埛鍒楄〃
+     * @param user
+     * @param type
+     * @return
+     */
+    @Override
+    public List<User> selectUserCondition(User user, String type) {
+        return baseMapper.selectUserCondition(QueryWrappers.queryWrappers(user), type);
+    }
 }
 
diff --git a/ruoyi-system/src/main/resources/mapper/system/UserMapper.xml b/ruoyi-system/src/main/resources/mapper/system/UserMapper.xml
new file mode 100644
index 0000000..f927978
--- /dev/null
+++ b/ruoyi-system/src/main/resources/mapper/system/UserMapper.xml
@@ -0,0 +1,32 @@
+<?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.system.mapper.UserMapper">
+
+    <!--鏍规嵁鏉′欢鑾峰彇鐢ㄦ埛鍒楄〃-->
+    <select id="selectUserCondition" resultType="com.ruoyi.common.core.domain.entity.User">
+        select * from (select id,
+        dept_id,
+        account,
+        name,
+        name_en,
+        user_type,
+        email,
+        phone,
+        sex,
+        age,
+        signature_url,
+        picture_url,
+        status,
+        del_flag,
+        login_ip,
+        login_date,
+        depart_lims_id,
+        company,
+        is_custom
+        from user
+        where del_flag = '0') a
+        <if test="ew.customSqlSegment != null and ew.customSqlSegment != ''">
+            ${ew.customSqlSegment}
+        </if>
+    </select>
+</mapper>

--
Gitblit v1.9.3