inspect-server/src/main/java/com/yuanchu/mom/service/impl/InsOrderPlanServiceImpl.java
@@ -17,16 +17,16 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yuanchu.mom.common.GetLook;
import com.yuanchu.mom.common.PrintChina;
import com.yuanchu.mom.dto.InsOrderPlanDTO;
import com.yuanchu.mom.dto.InsProductResultDto;
import com.yuanchu.mom.dto.SampleProductDto;
import com.yuanchu.mom.dto.SubmitPlanDto;
import com.yuanchu.mom.dto.*;
import com.yuanchu.mom.exception.ErrorException;
import com.yuanchu.mom.mapper.*;
import com.yuanchu.mom.pojo.*;
import com.yuanchu.mom.service.*;
import com.yuanchu.mom.utils.*;
import com.yuanchu.mom.vo.*;
import org.apache.poi.ss.usermodel.CellValue;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Value;
@@ -78,6 +78,8 @@
    private ShiftTimeMapper shiftTimeMapper;
    @Resource
    private PerformanceShiftMapper performanceShiftMapper;
    @Resource
    private WarehouseHistoryMapper warehouseHistoryMapper;
    @Resource
    private WarehouseService warehouseService;
@@ -87,6 +89,9 @@
    @Resource
    WordUtils wordUtils;
    @Resource
    private InsReportMapper insReportMapper;
    @Resource
    private InsProductResultMapper insProductResultMapper;
@@ -120,6 +125,9 @@
    @Resource
    FuSheUtils fuSheUtils;
    @Resource
    DianLuUtils dianLuUtils;
    @Override
    public Map<String, Object> selectInsOrderPlanList(Page page, InsOrderPlanDTO insOrderPlanDTO) {
@@ -177,6 +185,12 @@
        if (BeanUtil.isEmpty(order.getInsTime())) {
            insOrder.setInsTime(LocalDateTime.now());//订单的检验时间
            insOrderMapper.updateById(insOrder);
        }
        InsOrderState orderState = insOrderStateMapper.selectOne(Wrappers.<InsOrderState>lambdaQuery()
                .eq(InsOrderState::getInsOrderId, insSample.getInsOrderId())
                .eq(InsOrderState::getInsSampleId, sampleId)
                .eq(InsOrderState::getLaboratory, laboratory));
        if (ObjectUtils.isEmpty(orderState.getInsTime())) {
            //更新检验任务表的检验时间
            insOrderStateMapper.update(null, Wrappers.<InsOrderState>lambdaUpdate()
                    .eq(InsOrderState::getInsOrderId, insSample.getInsOrderId())
@@ -290,13 +304,14 @@
            sampleId = insOrderFile.getInsSampleId();
            insOrderFile.setInsSampleId(null);
        }
        IPage<InsOrderFile> insOrderFileIPage = insOrderFileMapper.getFileList(page, QueryWrappers.queryWrappers(insOrderFile), insOrderId, sonLaboratory,sampleId);
        IPage<InsOrderFile> insOrderFileIPage = insOrderFileMapper.getFileList(page, QueryWrappers.queryWrappers(insOrderFile), insOrderId, sonLaboratory, sampleId);
        map.put("body", insOrderFileIPage);
        return map;
    }
    @Override
    public int uploadFile(Integer orderId, MultipartFile file, String sonLaboratory, Integer sampleId) {
    public Object uploadFile(Integer orderId, MultipartFile file, String sonLaboratory, Integer sampleId) {
        InsOrder insOrder = insOrderMapper.selectById(orderId);
        String urlString;
        String pathName;
        String path;
@@ -306,6 +321,9 @@
        insOrderFile.setInsOrderId(orderId);
        if (ObjectUtils.isNotEmpty(sampleId)) {
            insOrderFile.setInsSampleId(sampleId);
        }
        if (ObjectUtils.isNotEmpty(sonLaboratory)) {
            insOrderFile.setSonLaboratory(sonLaboratory);
        }
        insOrderFile.setFileName(filename);
        if (contentType != null && contentType.startsWith("image/")) {
@@ -322,24 +340,25 @@
            if (!realpath.exists()) {
                realpath.mkdirs();
            }
            pathName = UUID.randomUUID() + "_"+file.getOriginalFilename().replace("#", "&");
            pathName = UUID.randomUUID() + "_" + file.getOriginalFilename().replace("#", "&");
            urlString = realpath + "/" + pathName;
            file.transferTo(new File(urlString));
            insOrderFile.setFileUrl(pathName);
            insOrderFileMapper.insert(insOrderFile);
            //如果是辐射试验(近场/远程上传的csv文件)
            String[] split = filename.split("\\.");
            if (ObjectUtils.isNotEmpty(sonLaboratory) && (sonLaboratory.equals("近场") || sonLaboratory.equals("远场")) &&
                    split[split.length - 1].equals("csv")) {
                //判断是哪种csv文件,是否有——
                if (!file.getOriginalFilename().contains("——")) {
                    fuSheUtils.getFuSheWord1(sonLaboratory, insOrderFile);
                } else {
                    fuSheUtils.getFuSheWord2(sonLaboratory, insOrderFile);
                }
            if (ObjectUtils.isNotEmpty(sonLaboratory) && sonLaboratory.equals("近场") && split[split.length - 1].equals("csv")) {
                fuSheUtils.getFuSheWord1(sonLaboratory, insOrderFile);
            } else if (ObjectUtils.isNotEmpty(sonLaboratory) && sonLaboratory.equals("远场") && split[split.length - 1].equals("xlsx")) {
                fuSheUtils.getFuSheWord2(sonLaboratory, insOrderFile);
            } else if (ObjectUtils.isNotEmpty(sonLaboratory) && sonLaboratory.equals("电路试验") && split[split.length - 1].equals("xlsx") && filename.contains("交调")) {
                dianLuUtils.readDianLuFile1(sampleId, insOrderFile);
            } else if (ObjectUtils.isNotEmpty(sonLaboratory) && sonLaboratory.equals("电路试验") && split[split.length - 1].equals("csv") && filename.contains("驻波")) {
                dianLuUtils.readDianLuFile2(sampleId, insOrderFile);
            } else if (ObjectUtils.isNotEmpty(sonLaboratory) && sonLaboratory.equals("电路试验") && split[split.length - 1].equals("csv") && insOrder.getSampleType().equals("无源器件")) {
                dianLuUtils.readDianLuFile3(sampleId, insOrderFile);
            }
        } catch (Exception e) {
            System.err.println("附件上传错误");
            throw new ErrorException(e.getMessage());
        }
        return 0;
    }
@@ -363,12 +382,15 @@
    //扫码报检
    @Override
    public int scanInsOrderState(String sonLaboratory, String sampleCode, String trees) {
    public int scanInsOrderState(String sonLaboratory, String sampleCode, String trees, String entrustCode) {
        /*样品入库*/
        warehouseService.inWarehouse(trees, sampleCode);
        warehouseService.inWarehouse(trees, sampleCode, entrustCode);
        /*新增检验任务*/
        //先判断该样品是否有这个站点的项目
        InsSample insSample = insSampleMapper.selectOne(Wrappers.<InsSample>lambdaQuery().eq(InsSample::getSampleCode, sampleCode));
        List<InsOrder> insOrders = insOrderMapper.selectList(Wrappers.<InsOrder>lambdaQuery().eq(InsOrder::getEntrustCode, entrustCode));
        InsSample insSample = insSampleMapper.selectOne(Wrappers.<InsSample>lambdaQuery()
                .eq(InsSample::getSampleCode, sampleCode)
                .eq(InsSample::getInsOrderId, insOrders.get(0).getId()));
        List<String> collect = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
                .eq(InsProduct::getState, 1)
                .eq(InsProduct::getInsSampleId, insSample.getId())).stream().map(InsProduct::getSonLaboratory).collect(Collectors.toList());
@@ -396,7 +418,7 @@
        } else {
            InsOrderState insOrderState = new InsOrderState();
            insOrderState.setInsOrderId(insSample.getInsOrderId());
            insOrderState.setInsOrderId(insSample.getId());
            insOrderState.setInsSampleId(insSample.getId());
            insOrderState.setLaboratory(sonLaboratory);
            insOrderState.setInsState(0);
            insOrderState.setNum(1);//初始是第一次
@@ -407,10 +429,13 @@
    //扫码出库
    @Override
    public int outInsOrderState(String sonLaboratory, String sampleCode) {
    public int outInsOrderState(String sonLaboratory, String sampleCode, String entrustCode) {
        //判断该样品的检验任务是否已经结束(继续试验或者是结束试验)
        //先判断该样品是否有这个站点的项目
        InsSample insSample = insSampleMapper.selectOne(Wrappers.<InsSample>lambdaQuery().eq(InsSample::getSampleCode, sampleCode));
        List<InsOrder> insOrders = insOrderMapper.selectList(Wrappers.<InsOrder>lambdaQuery().eq(InsOrder::getEntrustCode, entrustCode));
        InsSample insSample = insSampleMapper.selectOne(Wrappers.<InsSample>lambdaQuery()
                .eq(InsSample::getSampleCode, sampleCode)
                .eq(InsSample::getInsOrderId, insOrders.get(0).getId()));
        List<String> collect = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
                .eq(InsProduct::getState, 1)
                .eq(InsProduct::getInsSampleId, insSample.getId())).stream().map(InsProduct::getSonLaboratory).collect(Collectors.toList());
@@ -432,7 +457,7 @@
            }
        }
        boolean a = true;
        warehouseService.outWarehouse(sampleCode, a);
        warehouseService.outWarehouse(sampleCode, a, entrustCode);
        return 0;
    }
@@ -475,11 +500,60 @@
                //获取最后一行的num,即总行数。此处从0开始
                int maxRow = sheet.getLastRowNum();
                for (int row = 0; row <= maxRow; row++) {
                    XSSFRow xssfRow = sheet.getRow(row);
                    //获取最后单元格num,即总单元格数 ***注意:此处从1开始计数***
                    int maxRol = sheet.getRow(row).getLastCellNum();
                    StringBuilder aLine = new StringBuilder();
                    for (int rol = 0; rol < maxRol; rol++) {
                    /*for (int rol = 0; rol < maxRol; rol++) {
                        aLine.append(sheet.getRow(row).getCell(rol)).append(",");
                    }*/
                    for (int rol = 0; rol < maxRol; rol++) {
                        XSSFCell cell = xssfRow.getCell(rol);
                        if (cell == null) {
                            aLine.append(",");
                        } else {
                            switch (cell.getCellType()) {
                                case FORMULA:
                                    // 计算公式并获取结果
                                    CellValue cellValue = xssfWorkbook.getCreationHelper().createFormulaEvaluator().evaluate(cell);
                                    switch (cellValue.getCellType()) {
                                        case NUMERIC:
                                            String formattedValue = String.format("%.4f", cellValue.getNumberValue());
                                            aLine.append(formattedValue);
                                            break;
                                        case STRING:
                                            aLine.append(cellValue.getStringValue());
                                            break;
                                        case BOOLEAN:
                                            aLine.append(cellValue.getBooleanValue());
                                            break;
                                        case ERROR:
                                            aLine.append("#ERR!");
                                            break;
                                        default:
                                            aLine.append("");
                                            break;
                                    }
                                    break;
                                case NUMERIC:
                                    String formattedValue = String.format("%.4f", cell.getNumericCellValue());
                                    aLine.append(formattedValue);
                                    break;
                                case STRING:
                                    aLine.append(cell.getStringCellValue());
                                    break;
                                case BOOLEAN:
                                    aLine.append(cell.getBooleanCellValue());
                                    break;
                                case ERROR:
                                    aLine.append("#ERR!");
                                    break;
                                default:
                                    aLine.append("");
                                    break;
                            }
                            aLine.append(",");
                        }
                    }
                    String substring = aLine.substring(0, aLine.length() - 1);
                    result.append(substring).append("\n");
@@ -679,22 +753,23 @@
            throw new ErrorException("频率不能为空");
        }
        Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId");
        //查询样品信息
        InsSample insSample = insSampleMapper.selectById(insProductResultDtos.getSampleId());
        //查询检验单信息
        InsOrder insOrder = insOrderMapper.selectById(insProductResultDtos.getOrderId());
        InsOrderState orderState = insOrderStateMapper.selectOne(Wrappers.<InsOrderState>lambdaQuery()
                .eq(InsOrderState::getInsOrderId, insProductResultDtos.getOrderId())
                .eq(InsOrderState::getInsOrderId, insSample.getInsOrderId())
                .eq(InsOrderState::getInsSampleId, insProductResultDtos.getSampleId())
                .eq(InsOrderState::getLaboratory, insProductResultDtos.getSonLaboratory())
                .orderByDesc(InsOrderState::getId)
                .last("LIMIT 1"));// 确保只取一条记录
        //查询样品信息
        InsSample insSample = insSampleMapper.selectById(insProductResultDtos.getSampleId());
        List<Integer> list = new ArrayList<>();
        /*新增检验项目检验值记录表(采取先删后增)*/
        insProductResult2Mapper.delete(Wrappers.<InsProductResult2>lambdaQuery()
                .in(InsProductResult2::getInsProductId, insProductResultDtos.getInsProductResult2s().stream().map(InsProductResult2::getInsProductId).distinct().collect(Collectors.toList()))
                .eq(InsProductResult2::getNum, orderState.getNum())
                .eq(InsProductResult2::getFrequency, insProductResultDtos.getFrequency()));
        List<InsProductResult2> result2s = new ArrayList<>();
        List<InsProductUser> insProductUsers = new ArrayList<>();
        for (InsProductResult2 insProductResult2 : insProductResultDtos.getInsProductResult2s()) {
            InsProduct insProduct = new InsProduct();
            insProduct.setId(insProductResult2.getInsProductId());//项目id
@@ -730,8 +805,9 @@
                //结论
                int ressult = 1;
                String valueStr = insProductResult2.getValue();
                String regex = "[\u4e00-\u9fa5]";
                if (!insProduct.getAsk().contains(",")) {
                    if (insProduct.getAsk().equals("/")) {
                    if (insProduct.getAsk().equals("/") || Pattern.compile(regex).matcher(insProduct.getAsk()).find()) {
                        ressult = 3; //不判定
                    } else if (!isValueValid(valueStr, new String[]{insProduct.getAsk()})) {
                        ressult = 0; //不合格
@@ -771,10 +847,13 @@
            }
            result2.setCreateUser(userId);
            result2.setUpdateUser(userId);
            insProductResult2Mapper.insert(result2);
            insProduct.setUpdateUser(userId);
            insProductMapper.updateById(insProduct);
            insProductUserMapper.insert(new InsProductUser(null, userId, LocalDateTime.now(), insProduct.getId()));
            result2s.add(result2);
            //insProductResult2Mapper.insert(result2);
            //insProduct.setUpdateUser(userId);
            //insProducts.add(insProduct);
            //insProductMapper.updateById(insProduct);
            insProductUsers.add(new InsProductUser(null, userId, LocalDateTime.now(), insProduct.getId()));
            //insProductUserMapper.insert(new InsProductUser(null, userId, LocalDateTime.now(), insProduct.getId()));
            /*更新样品的检验状态*/
            insSample.setInsState(1);
            Long l = insProductMapper.selectCount(Wrappers.<InsProduct>lambdaQuery()
@@ -790,18 +869,29 @@
                //如果所有项目都有结论,那么该样品状态已检
                insSample.setInsState(2);
            }
            insSampleMapper.updateById(insSample);
        }
        insProductResult2Mapper.saveBatch(result2s);
        insProductUserMapper.saveBatch(insProductUsers);
        insSampleMapper.updateById(insSample);
        /*判断该站点的检验项目是否全部已检*/
        int count = insProductMapper.selectInsProductCountByOrderId(insProductResultDtos.getOrderId());
        int count = insProductMapper.selectInsProductCountByOrderId(insSample.getInsOrderId());
        if (count == 0) {
            insOrderStateMapper.update(new InsOrderState(), Wrappers.<InsOrderState>lambdaUpdate()
                    .eq(InsOrderState::getInsOrderId, insProductResultDtos.getOrderId())
                    .eq(InsOrderState::getInsOrderId, insSample.getInsOrderId())
                    .eq(InsOrderState::getInsSampleId, insProductResultDtos.getSampleId())
                    .eq(InsOrderState::getLaboratory, insProductResultDtos.getSonLaboratory())
                    .set(InsOrderState::getInsState, 2));
        }
        return list;
    }
    //电路试验的保存检验内容(返回/提交)
    @Override
    public int saveInsContext2s(InsProductResultDtos insProductResultDtos) {
        for (InsProductResultDto insProductResultDto : insProductResultDtos.getInsProductResultDtos()) {
            saveInsContext2(insProductResultDto);
        }
        return 1;
    }
    //温湿度试验+功率试验的保存检验内容
@@ -830,19 +920,19 @@
            }
        }
        // 处理其他比较条件
        if (ask.startsWith(">")) {
        if (ask.startsWith(">") || ask.startsWith(">")) {
            double threshold = Double.parseDouble(ask.substring(1));
            return s > threshold;
        } else if (ask.startsWith("≥")) {
            double threshold = Double.parseDouble(ask.substring(1));
            return s >= threshold;
        } else if (ask.startsWith("<")) {
        } else if (ask.startsWith("<")|| ask.startsWith("<")) {
            double threshold = Double.parseDouble(ask.substring(1));
            return s < threshold;
        } else if (ask.startsWith("≤")) {
            double threshold = Double.parseDouble(ask.substring(1));
            return s <= threshold;
        } else if (ask.equals("=")) {
        } else if (ask.equals("=")|| ask.startsWith("=")) {
            double exactValue = Double.parseDouble(ask.substring(1));
            return s == exactValue;
        }
@@ -866,7 +956,7 @@
            if (ObjectUtils.isEmpty(s)) {
                continue;
            }
            double numericValue = Double.parseDouble(s);
            double numericValue = Math.abs(Double.parseDouble(s));
            boolean valid = Arrays.stream(valuesToCheck)
                    .allMatch(v -> getResult(numericValue, v));
            if (!valid) {
@@ -952,7 +1042,7 @@
                            .set(InsOrderState::getCreateTime, LocalDateTime.now()));
                    break;
                case 1:
                    //继续试验:该站点任务结束(可以再次扫码检验);
                    //继续试验:该样品该站点任务结束(可以再次扫码检验);
                    insOrderStateMapper.update(null, Wrappers.<InsOrderState>lambdaUpdate()
                            .eq(InsOrderState::getInsOrderId, insSample.getInsOrderId())
                            .eq(InsOrderState::getInsSampleId, sampleId)
@@ -971,11 +1061,11 @@
                            .set(InsOrderState::getVerifyTell, tell)
                            .set(InsOrderState::getVerifyUser, userId));
                    //如果订单类型是原理样机,则该订单直接闭环
                    if (insOrder.getFormType().equals("原理样机")) {
                        //出库
                        try {
                            outInsOrderState(laboratory, insSample.getSampleCode());
                        } catch (Exception e) {
                    List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery().eq(InsSample::getInsOrderId, insSample.getInsOrderId()));
                    for (InsSample sample : insSamples) {
                        try{
                            outInsOrderState(laboratory, sample.getSampleCode(), insOrder.getEntrustCode());
                        }catch (Exception e){
                        }
                    }
@@ -987,7 +1077,97 @@
        return 1;
    }
    private void getTemplateThing(Set<Integer> set, Map<Integer, String> map2, List<InsProduct> insProducts) {
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int verifyPlan2(Integer sampleId, String laboratory, Integer type, String tell) throws IOException {
        Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId");
        InsSample insSample = insSampleMapper.selectById(sampleId);
        InsOrder insOrder = insOrderMapper.selectById(insSample.getInsOrderId());
        /*type=0  再次试验; type=1 继续试验 ; type=2 结束试验*/
        // 查询根据 id 倒序排列的第一条记录
        InsOrderState record = insOrderStateMapper.selectOne(Wrappers.<InsOrderState>lambdaQuery()
                .eq(InsOrderState::getInsOrderId, insSample.getInsOrderId())
                .eq(InsOrderState::getInsSampleId, sampleId)
                .eq(InsOrderState::getLaboratory, laboratory)
                .orderByDesc(InsOrderState::getId)
                .last("LIMIT 1")); // 确保只取一条记录
        if (record != null) {
            switch (type) {
                case 0:
                    //再次试验:该单子退回到检验状态(排序改成当前的最后),次数递增(保留以前的数据);
                    insOrderStateMapper.update(null, Wrappers.<InsOrderState>lambdaUpdate()
                            .eq(InsOrderState::getId, record.getId())
                            .set(InsOrderState::getInsTime, LocalDateTime.now())
                            .set(InsOrderState::getInsState, 4)
                            .set(InsOrderState::getVerifyTell, tell)
                            .set(InsOrderState::getVerifyUser, userId)
                            .set(InsOrderState::getNum, record.getNum() + 1)//次数加1
                            .set(InsOrderState::getCreateTime, LocalDateTime.now()));
                    insOrder.setState(1);
                    break;
                case 1:
                    //继续试验:该样品该站点任务结束(可以再次扫码检验);
                    //先判断上一个复核是什么结论
                    if (record.getInsState()==4){
                        insOrderStateMapper.update(null, Wrappers.<InsOrderState>lambdaUpdate()
                                .eq(InsOrderState::getInsOrderId, insSample.getInsOrderId())
                                .eq(InsOrderState::getInsSampleId, sampleId)
                                .eq(InsOrderState::getLaboratory, laboratory)
                                .set(InsOrderState::getInsState, 6)
                                .set(InsOrderState::getVerifyTell, tell)
                                .set(InsOrderState::getNum, record.getNum() - 1)//次数-1
                                .set(InsOrderState::getVerifyUser, userId));
                    }else {
                        insOrderStateMapper.update(null, Wrappers.<InsOrderState>lambdaUpdate()
                                .eq(InsOrderState::getInsOrderId, insSample.getInsOrderId())
                                .eq(InsOrderState::getInsSampleId, sampleId)
                                .eq(InsOrderState::getLaboratory, laboratory)
                                .set(InsOrderState::getInsState, 6)
                                .set(InsOrderState::getVerifyTell, tell)
                                .set(InsOrderState::getVerifyUser, userId));
                    }
                    insOrder.setState(1);
                    break;
                case 2:
                    //结束试验:此委托单停止试验(无法再次检验)。
                    //先判断上一个复核是什么结论
                    if (record.getInsState()==4){
                        insOrderStateMapper.update(null, Wrappers.<InsOrderState>lambdaUpdate()
                                .eq(InsOrderState::getInsOrderId, insSample.getInsOrderId())
                                .eq(InsOrderState::getInsSampleId, sampleId)
                                .eq(InsOrderState::getLaboratory, laboratory)
                                .set(InsOrderState::getInsState, 5)
                                .set(InsOrderState::getNum, record.getNum() - 1)//次数-1
                                .set(InsOrderState::getVerifyTell, tell)
                                .set(InsOrderState::getVerifyUser, userId));
                    }else {
                        insOrderStateMapper.update(null, Wrappers.<InsOrderState>lambdaUpdate()
                                .eq(InsOrderState::getInsOrderId, insSample.getInsOrderId())
                                .eq(InsOrderState::getInsSampleId, sampleId)
                                .eq(InsOrderState::getLaboratory, laboratory)
                                .set(InsOrderState::getInsState, 5)
                                .set(InsOrderState::getVerifyTell, tell)
                                .set(InsOrderState::getVerifyUser, userId));
                    }
                    //出库
                    List<InsSample> insSamples = insSampleMapper.selectList(Wrappers.<InsSample>lambdaQuery().eq(InsSample::getInsOrderId, insSample.getInsOrderId()));
                    for (InsSample sample : insSamples) {
                        try{
                            outInsOrderState(laboratory, sample.getSampleCode(), insOrder.getEntrustCode());
                        }catch (Exception e){
                        }
                    }
                    insOrder.setState(4);
                    break;
            }
            insOrderMapper.updateById(insOrder);
        }
        return 1;
    }
    private void getTemplateThing
            (Set<Integer> set, Map<Integer, String> map2, List<InsProduct> insProducts) {
        for (InsProduct product : insProducts) {
            if (product.getTemplateId() == null) {
                product.setTemplate(new ArrayList<>());
@@ -1025,6 +1205,7 @@
        InsOrderUser insOrderUser = new InsOrderUser();
        insOrderUser.setInsOrderStateId(orderState.getId());
        insOrderUser.setSubmitUser(getLook.selectPowerByMethodAndUserId(null).get("userId"));
        insOrderUser.setInsTime(orderState.getInsTime());
        insOrderUser.setSubmitTime(LocalDateTime.now());
        insOrderUser.setNum(orderState.getNum());
        insOrderUser.setNote(ObjectUtils.isNotEmpty(submitPlanDto.getNote()) ? submitPlanDto.getNote() : null);
@@ -1033,6 +1214,11 @@
        List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
                .eq(InsProduct::getInsSampleId, insSample.getId())
                .eq(InsProduct::getSonLaboratory, submitPlanDto.getLaboratory())
                .and(wrapper -> wrapper
                        .isNull(InsProduct::getInsResult)
                        .or()
                        .eq(InsProduct::getInsResult, 2)
                )
                .eq(InsProduct::getState, 1));
        if (insProducts.size() > 0) {
            String str = "";
@@ -1078,27 +1264,12 @@
        info.setCreateUser(insProductMapper.selectUserById(userId).get("name"));
        info.setMessageType("2");
        info.setTheme("复核通知");
        info.setContent("您有一条检验任务待复核消息");
        info.setContent("您有一条检验任务待复核消息,订单号是:" + insOrder.getEntrustCode() + ",样品名称为:" + insSample.getSample());
        info.setSenderId(userId);
        info.setConsigneeId(submitPlanDto.getVerifyUser());
        info.setViewStatus(false);
        info.setJumpPath("b1-inspect-order-plan");
        informationNotificationService.addInformationNotification(info);
        //  todo 企业微信消息推送@zss
        HashMap<String, Object> map = new HashMap<>();
        String account = userMapper.selectById(submitPlanDto.getVerifyUser()).getAccount();
        map.put("touser", account);//接收消息成员的账号'ZT-031292'这种类型(如果有多个用'|'分隔)
        map.put("toparty", "");//接收部门id
        map.put("totag", "");//消息标签id
        map.put("msgtype", "text");//消息类型 text:文本
        map.put("agentid", 1000517);//应用id
        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("content", "您有一条检验任务待复核消息,订单号是:" + insOrder.getEntrustCode() + ",请前往LIMS系统查看。<a href=\"https://ztwxlims.ztt.cn:7443/enter\">中天通信LIMS系统 </a>");
        map.put("text", hashMap);//消息内容
        map.put("safe", 0);//是否保密消息.0否
        map.put("enable_id_trans", 0);//是否开启id转译.0否
        map.put("enable_duplicate_check", 0);//是否开启重复消息检查.0否
        qywxApi.send(map);
        //复核人--检验单相关负责人
        InsSampleUser insSampleUser = new InsSampleUser();
        insSampleUser.setUserId(submitPlanDto.getVerifyUser());
@@ -1108,18 +1279,22 @@
        insSampleUserMapper.insert(insSampleUser);
        /*生成电路试验的站点报告并上传到附件中*/
        if (submitPlanDto.getLaboratory().equals("电路试验")) {
            //wordUtils.generateWord(submitPlanDto.getTerm(), orderState);
            //todo 电路站点报告 正式库部署放开
            try {
            if (!insOrder.getSampleType().equals("无源器件")) {
                wordUtils.generateWord(submitPlanDto.getTerm(), orderState);
            } catch (Exception e) {
                throw new ErrorException("电路试验的站点报告生成有误,请联系开发人员调整!");
            } else {
                wordUtils.generateWord2(submitPlanDto.getTerm(), orderState);
            }
            //todo 电路站点报告 正式库部署放开
//            try {
//                if (!insOrder.getSampleType().equals("无源器件")) {
//                    wordUtils.generateWord(submitPlanDto.getTerm(), orderState);
//                }else {
//                    wordUtils.generateWord2(submitPlanDto.getTerm(), orderState);
//                }
//            } catch (Exception e) {
//                throw new ErrorException("电路试验的站点报告生成有误,请联系开发人员调整!");
//            }
        }
        /*// 删除数采采集次数
        String key = "frequency" + ":" + submitPlanDto.getEntrustCode() + ":*";
        RedisUtil.delsLike(key);*/
        /*生成产量工时*/
        //校验如果这个人这个检测项目已经添加过了则不需要再新增
        //首先判断当前人的当前时间是否是排班时间内,如果不是就是加班
@@ -1164,14 +1339,105 @@
                    DateTime parse = DateUtil.parse(localDateTime.format(formatter));
                    auxiliaryOutputWorkingHours.setWeekDay(getWeek(localDateTime.format(formatters)));//星期
                    auxiliaryOutputWorkingHours.setWeek(String.valueOf(DateUtil.weekOfYear(DateUtil.offsetDay(parse, 1))));//周次
                    auxiliaryOutputWorkingHours.setCheck(userId);//检测人
                    auxiliaryOutputWorkingHoursMapper.insert(auxiliaryOutputWorkingHours);
                }
            }
        }
        //  todo 企业微信消息推送@zss
        HashMap<String, Object> map = new HashMap<>();
        String account = userMapper.selectById(submitPlanDto.getVerifyUser()).getAccount();
        map.put("touser", account);//接收消息成员的账号'ZT-031292'这种类型(如果有多个用'|'分隔)
        map.put("toparty", "");//接收部门id
        map.put("totag", "");//消息标签id
        map.put("msgtype", "text");//消息类型 text:文本
        map.put("agentid", 1000517);//应用id
        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("content", "您有一条检验任务待复核消息,订单号是:" + insOrder.getEntrustCode() + ",样品名称为:" + insSample.getSample() +
                ",请前往LIMS系统查看。请点击<a href=\"https://ztwxlims.ztt.cn:7443/enter\">中天通信LIMS系统 </a>");
        map.put("text", hashMap);//消息内容
        map.put("safe", 0);//是否保密消息.0否
        map.put("enable_id_trans", 0);//是否开启id转译.0否
        map.put("enable_duplicate_check", 0);//是否开启重复消息检查.0否
        qywxApi.send(map);
        return 1;
    }
    @Override
    public int cancelSubmitPlan(Integer orderStateId) {
        InsOrderState orderState = insOrderStateMapper.selectById(orderStateId);
        InsOrder insOrder = insOrderMapper.selectById(orderState.getInsOrderId());
        InsSample insSample = insSampleMapper.selectById(orderState.getInsSampleId());
        /*删除记录检验任务每次的备注信息*/
        insOrderUserMapper.delete(Wrappers.<InsOrderUser>lambdaQuery()
                .eq(InsOrderUser::getInsOrderStateId, orderState.getId())
                .eq(InsOrderUser::getNum, orderState.getNum()));
        //撤销提交
        insOrderStateMapper.update(null, Wrappers.<InsOrderState>lambdaUpdate()
                .eq(InsOrderState::getInsOrderId, orderState.getInsOrderId())
                .eq(InsOrderState::getInsSampleId, orderState.getInsSampleId())
                .eq(InsOrderState::getLaboratory, orderState.getLaboratory())
                .set(InsOrderState::getInsState, 2));
        Integer userId = getLook.selectPowerByMethodAndUserId(null).get("userId");
        //LIMS系统消息推送
        InformationNotification info = new InformationNotification();
        info.setCreateUser(insProductMapper.selectUserById(userId).get("name"));
        info.setMessageType("2");
        info.setTheme("复核撤销通知");
        info.setContent("您有一条检验任务待复核已撤销的消息,订单号是:" + insOrder.getEntrustCode() + ",样品名称为:" + insSample.getSample());
        info.setSenderId(userId);
        info.setConsigneeId(orderState.getVerifyUser());
        info.setViewStatus(false);
        info.setJumpPath("b1-inspect-order-plan");
        informationNotificationService.addInformationNotification(info);
        //删除复核人--检验单相关负责人
        insSampleUserMapper.delete(Wrappers.<InsSampleUser>lambdaQuery()
                .eq(InsSampleUser::getState, 1)
                .eq(InsSampleUser::getSonLaboratory, orderState.getLaboratory())
                .eq(InsSampleUser::getUserId, orderState.getVerifyUser())
                .eq(InsSampleUser::getInsSampleId, orderState.getInsSampleId()));
        //删除生成的报告
        if (orderState.getLaboratory().equals("电路试验")) {
            List<InsOrderFile> insOrderFiles = insOrderFileMapper.selectList(Wrappers.<InsOrderFile>lambdaQuery()
                    .eq(InsOrderFile::getType, 2)
                    .like(InsOrderFile::getFileName, "电路参数.docx")
                    .eq(InsOrderFile::getInsOrderId, insOrder.getId())
                    .eq(InsOrderFile::getInsSampleId, orderState.getInsSampleId())
                    .eq(InsOrderFile::getSonLaboratory, orderState.getLaboratory()));
            for (InsOrderFile insOrderFile : insOrderFiles) {
                File file = new File(wordUrl + "/" + insOrderFile.getFileUrl());
                file.delete();
                insOrderFileMapper.deleteById(insOrderFile.getId());
            }
        }
        /*删除生成产量工时*/
        List<InsProduct> insProducts = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery().eq(InsProduct::getInsSampleId, insSample.getId()));
        List<Integer> productIds = insProducts.stream().map(InsProduct::getId).distinct().collect(Collectors.toList());
        auxiliaryOutputWorkingHoursMapper.delete(Wrappers.<AuxiliaryOutputWorkingHours>lambdaQuery()
                .eq(AuxiliaryOutputWorkingHours::getSample, insSample.getSampleCode())
                .in(AuxiliaryOutputWorkingHours::getInsProductId, productIds)
                .eq(AuxiliaryOutputWorkingHours::getNum, orderState.getNum()));
        //  todo 企业微信消息推送@zss
        HashMap<String, Object> map = new HashMap<>();
        String account = userMapper.selectById(orderState.getVerifyUser()).getAccount();
        map.put("touser", account);//接收消息成员的账号'ZT-031292'这种类型(如果有多个用'|'分隔)
        map.put("toparty", "");//接收部门id
        map.put("totag", "");//消息标签id
        map.put("msgtype", "text");//消息类型 text:文本
        map.put("agentid", 1000517);//应用id
        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("content", "您有一条复核的消息已撤销,订单号是:" + insOrder.getEntrustCode() + ",样品名称为:" + insSample.getSample() +
                ",请前往LIMS系统查看。请点击<a href=\"https://ztwxlims.ztt.cn:7443/enter\">中天通信LIMS系统 </a>");
        map.put("text", hashMap);//消息内容
        map.put("safe", 0);//是否保密消息.0否
        map.put("enable_id_trans", 0);//是否开启id转译.0否
        map.put("enable_duplicate_check", 0);//是否开启重复消息检查.0否
        qywxApi.send(map);
        return 0;
    }
    public static String getWeek(String dayStr) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {