zhuo
2025-02-18 bd1137319f16fcb2750333aeb37366aff0ec4ef9
检验下单移植
已修改19个文件
已添加22个文件
10153 ■■■■■ 文件已修改
inspect-server/pom.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java 617 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/controller/RawMaterialOrderController.java 628 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/UnqualifiedHandlerDto.java 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderTemplateMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsUnqualifiedHandlerMapper.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/pojo/CommonOa.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderTemplateService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/InsProductService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/RawMaterialOrderService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java 2100 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderTemplateServiceImpl.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsProductServiceImpl.java 221 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsReportServiceImpl.java 2318 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/RawMaterialOrderServiceImpl.java 1686 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsOrderMapper.xml 588 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsOrderStateMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsOrderTemplateMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsProductMapper.xml 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsProductUserMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsReportMapper.xml 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsSampleMapper.xml 699 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsSampleUserMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsUnqualifiedHandlerMapper.xml 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsUnqualifiedRetestProductMapper.xml 200 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/RawMaterialOrderTemplateMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/SpotCheckQuarterItemMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
performance-server/src/main/resources/mapper/PerformanceShiftMapper.xml 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/pom.xml 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application-druid.yml 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application.yml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/Result.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/DateImageUtil.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/FormatterConfig.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/UserService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/UserMapper.xml 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/pom.xml
@@ -47,6 +47,22 @@
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
        </dependency>
        <!--word转pdf-->
        <!--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>
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);
    }
}
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 åŽŸææ–™id
//     * @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 åŽŸææ–™id
//     * @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 åŽŸææ–™id
//     * @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 åŽŸææ–™id
     * @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 åŽŸææ–™id
     * @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 åŽŸææ–™id
     * @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));
    }
}
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;
}
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);
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 é’ˆå¯¹è¡¨ã€ins_order_template】的数据库操作Mapper
* @createDate 2024-03-18 14:14:54
* @Entity com.yuanchu.mom.pojo.InsOrderTemplate
*/
public interface InsOrderTemplateMapper extends BaseMapper<InsOrderTemplate> {
}
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 é’ˆå¯¹è¡¨ã€ins_unqualified_handler(不合格处理表)】的数据库操作Mapper
* @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);
}
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;
}
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 é’ˆå¯¹è¡¨ã€ins_order_template】的数据库操作Service
* @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);
}
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);
inspect-server/src/main/java/com/ruoyi/inspect/service/RawMaterialOrderService.java
@@ -95,7 +95,6 @@
     */
    void addIfsInventoryQuantity(IfsInventoryQuantity ifsInventoryQuantity);
    void shiftingParking(List<Integer> ids);
    /**
     * é“œå•丝下单免检
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 é’ˆå¯¹è¡¨ã€ins_order(检验下单)】的数据库操作Service实现
// * @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) {
//                // èŽ·å–å½“å‰å­£åº¦çš„å¼€å§‹æ—¶é—´å’Œç»“æŸæ—¶é—´
//                LocalDateTime now = LocalDateTime.now();
//                // èŽ·å–å½“å‰æœˆä»½
//                int month = now.getMonthValue();
//                // ç¡®å®šå½“前季度的开始月份
//                int startMonth = (month - 1) / 3 * 3 + 1;
//                // æž„造季度的开始时间
//                LocalDateTime startOfQuarter = LocalDateTime.of(now.getYear(), Month.of(startMonth), 1, 0, 0);
//                // è®¡ç®—下一个季度的开始时间
//                LocalDateTime startOfNextQuarter = startOfQuarter.plusMonths(3);
//                // è®¡ç®—当前季度的结束时间
//                LocalDateTime endOfQuarter = startOfNextQuarter.minusSeconds(1);
//
//                // æ ¹æ®ä¸‹å•的规格型号判断是否为季度首次出现
//                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);
//            // åˆ¤æ–­æ˜¯å¦æ˜¯å­£åº¦æ£€éªŒ, æ˜¯å­£åº¦æ£€éªŒå–消原材料季度检验下单
//            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可以防止中文乱码 å½“ç„¶å’Œeasyexcel没有关系
//        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()); // ä¾›åº”商ID
//            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是原材料的id
//     *
//     * ä¿®æ”¹è®¢å•单号
//     * @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可以防止中文乱码 å½“ç„¶å’Œeasyexcel没有关系
//            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();
//
//            //向sheet0写入数据 ä¼ å…¥ç©ºlist这样只导出表头
//            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 é’ˆå¯¹è¡¨ã€ins_order(检验下单)】的数据库操作Service实现
 * @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) {
                // èŽ·å–å½“å‰å­£åº¦çš„å¼€å§‹æ—¶é—´å’Œç»“æŸæ—¶é—´
                LocalDateTime now = LocalDateTime.now();
                // èŽ·å–å½“å‰æœˆä»½
                int month = now.getMonthValue();
                // ç¡®å®šå½“前季度的开始月份
                int startMonth = (month - 1) / 3 * 3 + 1;
                // æž„造季度的开始时间
                LocalDateTime startOfQuarter = LocalDateTime.of(now.getYear(), Month.of(startMonth), 1, 0, 0);
                // è®¡ç®—下一个季度的开始时间
                LocalDateTime startOfNextQuarter = startOfQuarter.plusMonths(3);
                // è®¡ç®—当前季度的结束时间
                LocalDateTime endOfQuarter = startOfNextQuarter.minusSeconds(1);
                // æ ¹æ®ä¸‹å•的规格型号判断是否为季度首次出现
                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);
            // åˆ¤æ–­æ˜¯å¦æ˜¯å­£åº¦æ£€éªŒ, æ˜¯å­£åº¦æ£€éªŒå–消原材料季度检验下单
            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可以防止中文乱码 å½“ç„¶å’Œeasyexcel没有关系
        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()); // ä¾›åº”商ID
            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是原材料的id
     *
     * ä¿®æ”¹è®¢å•单号
     * @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可以防止中文乱码 å½“ç„¶å’Œeasyexcel没有关系
            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();
            //向sheet0写入数据 ä¼ å…¥ç©ºlist这样只导出表头
            excelWriter.write(sampleOrderDtoList, mainSheet);
            //关闭流
            excelWriter.finish();
        } catch (IOException e) {
            throw new RuntimeException("导出失败");
        }
    }
}
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 é’ˆå¯¹è¡¨ã€ins_order_template】的数据库操作Service实现
 * @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);
    }
}
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)) {
                //如果该检验单下的所有项目全部都撤销,那么这个单子也需要撤销
                insOrder.setState(3);
            } else {
                List<InsProduct> products = insProductMapper.selectBatchIds(ids);
                //首先根据选择的项目id进行撤销项目
                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;
    }
}
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 é’ˆå¯¹è¡¨ã€ins_report(检验报告)】的数据库操作Service实现
// * @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);
//            // å¤„理解压后的文件
//            File[] files = unzipDir.listFiles();
//            if (files != null) {
//                for (File f : files) {
//                    // æ ¹æ®æ–‡ä»¶åæŸ¥è¯¢id
//                    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();
//            }
//            // é€’归删除解压目录及其中的文件
//            if (unzipDir.exists()) {
//                deleteDirectory(unzipDir); // åˆ é™¤æ—§çš„临时文件夹
//            }
//        }
//        return 0;
//    }
//
//
//    //解压文件夹
//    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;
//            }
//            //生成一个空的PDF文件
//            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 {//前n-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  åŽŸPDF路径
//     * @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();
//                // å‘送企业inspectStatus信通知
//                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;
//        // ç™»è®°é‡‡è´­æ£€éªŒç»“æžœSTD
//        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 åŽç»­éœ€è¦è°ƒç”¨IFS的接口 ç§»å…¥çš„库位号 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解析对象
//     * @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;
//            }
//            //生成一个空的PDF文件
//            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 é’ˆå¯¹è¡¨ã€ins_report(检验报告)】的数据库操作Service实现
 * @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);
            // å¤„理解压后的文件
            File[] files = unzipDir.listFiles();
            if (files != null) {
                for (File f : files) {
                    // æ ¹æ®æ–‡ä»¶åæŸ¥è¯¢id
                    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();
            }
            // é€’归删除解压目录及其中的文件
            if (unzipDir.exists()) {
                deleteDirectory(unzipDir); // åˆ é™¤æ—§çš„临时文件夹
            }
        }
        return 0;
    }
    //解压文件夹
    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;
            }
            //生成一个空的PDF文件
            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 {//前n-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  åŽŸPDF路径
     * @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();
                // å‘送企业inspectStatus信通知
                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;
        // ç™»è®°é‡‡è´­æ£€éªŒç»“æžœSTD
        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 åŽç»­éœ€è¦è°ƒç”¨IFS的接口 ç§»å…¥çš„库位号 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解析对象
     * @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;
            }
            //生成一个空的PDF文件
            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;
    }
}
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) {
//            // åˆ¤æ–­å•位是kg或者t
//            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:需要判断oa流程是否是让步放行
//        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可以防止中文乱码 å½“ç„¶å’Œeasyexcel没有关系
//        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();
//
//            //向sheet0写入数据 ä¼ å…¥ç©ºlist这样只导出表头
//            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:需要判断oa流程是否是让步放行
//        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) {
            // åˆ¤æ–­å•位是kg或者t
            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:需要判断oa流程是否是让步放行
        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可以防止中文乱码 å½“ç„¶å’Œeasyexcel没有关系
        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();
            //向sheet0写入数据 ä¼ å…¥ç©ºlist这样只导出表头
            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:需要判断oa流程是否是让步放行
        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 "未知";
        }
    }
}
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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">
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>
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);
    }
}
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));
    }
}
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
                    # æ…¢SQL记录
                    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
          # æ…¢SQL记录
          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
  # è½¬pdf文件路径
  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
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:
    # åœ°å€
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()
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());
    }
}
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);
//    }
//}
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);
}
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);
}
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);
    }
}
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>