zhuo
2025-05-20 61f34419e094f2363276d614a960b379cc456482
业务代码合并
已修改13个文件
329 ■■■■ 文件已修改
inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderPlanController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleProductDto.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/dto/SaveInsContextDto.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderPlanService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/FinishProductSpotCheckServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java 63 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java 187 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsProductServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/mapper/InsOrderMapper.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/static/report-template.docx 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderController.java
@@ -267,4 +267,10 @@
        return Result.success();
    }
    @ApiOperation(value = "查询当前时间是否没有该检测项的抽样计划")
    @PostMapping("/judgeNotSpotCheckOrder")
    public Result<?> judgeNotSpotCheckOrder(@RequestBody InsPlaceOrderDto insPlaceOrderDto) {
        return insOrderService.judgeNotSpotCheckOrder(insPlaceOrderDto.getSampleList(), insPlaceOrderDto.getInsOrder());
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderPlanController.java
@@ -114,8 +114,7 @@
    @ApiOperation(value = "保存检验内容")
    @PostMapping("/saveInsContext")
    public Result<?> saveInsContext(@RequestBody SaveInsContextDto saveInsContextDto) {
        Map<String, Object> param2 = JSON.parseObject(saveInsContextDto.getParam(), Map.class);
        insOrderPlanService.saveInsContext(param2, saveInsContextDto.getCurrentTable(), saveInsContextDto.getSampleId(), saveInsContextDto.getOrderId(), saveInsContextDto.getSonLaboratory());
        insOrderPlanService.saveInsContext(saveInsContextDto);
        return Result.success();
    }
@@ -244,7 +243,8 @@
    @GetMapping("/getBindingProductByProductId")
    public Result<List<InsProduct>> getBindingProductByProductId(Integer productId) {
        return Result.success(insProductService.list(Wrappers.<InsProduct>lambdaQuery()
                .eq(InsProduct::getBindingProductId, productId)));
                .eq(InsProduct::getBindingProductId, productId)
                .orderByAsc(InsProduct::getSort)));
    }
inspect-server/src/main/java/com/ruoyi/inspect/dto/SampleProductDto.java
@@ -13,8 +13,6 @@
    @ApiModelProperty("检验项目")
    private List<InsProduct> insProduct;
//    private List<BushingDto> bushing;
    @ApiModelProperty("子样品配置")
    private List<SampleProductDto> childSampleList;
@@ -23,8 +21,6 @@
    @ApiModelProperty("辅助线芯配置")
    private InsulatingDto auxiliaryWireCore;
//    private SheathDto sheath;
    @ApiModelProperty("检验人")
    private String checkName;
inspect-server/src/main/java/com/ruoyi/inspect/dto/SaveInsContextDto.java
@@ -1,19 +1,29 @@
package com.ruoyi.inspect.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * 保存模板传参
 */
@Data
//保存检验内容传参
public class SaveInsContextDto {
    //模板内容
    @ApiModelProperty("模板内容")
    private String param;
    //当前模板id
    @ApiModelProperty("当前模板id")
    private Integer currentTable;
    //当前样品id
    @ApiModelProperty("当前样品id")
    private Integer sampleId;
    //当前订单id
    @ApiModelProperty("当前订单id")
    private Integer orderId;
    //子试验室
    @ApiModelProperty("子试验室")
    private String sonLaboratory;
    @ApiModelProperty("是否没有检验值")
    private Integer isNoTestValue;
}
inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsOrderMapper.java
@@ -5,7 +5,6 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.pojo.StructureTestObject;
import com.ruoyi.inspect.dto.CostStatisticsDto;
import com.ruoyi.inspect.dto.SampleOrderDto;
import com.ruoyi.inspect.dto.SampleProductDto2;
import com.ruoyi.inspect.dto.SampleProductExportDto;
@@ -136,4 +135,13 @@
     * @return
     */
    List<SampleOrderDto> getInsOrderExportByIds(@Param("orderIds") List<String> orderIds);
    /**
     * 查询当前时间是否有该检测项的抽样计划订单
     * @param itmeId    样品Id
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return
     */
    Integer selectNotSpotCheckOrder(@Param("itmeId") Integer itmeId, @Param("startTime") String startTime, @Param("endTime") String endTime);
}
inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderPlanService.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.inspect.dto.InsOrderPlanDTO;
import com.ruoyi.inspect.dto.InsOrderPlanProductDto;
import com.ruoyi.inspect.dto.SaveInsContextDto;
import com.ruoyi.inspect.pojo.InsOrderFactoryVerify;
import com.ruoyi.inspect.pojo.InsOrderFile;
import com.ruoyi.inspect.pojo.InsProduct;
@@ -25,7 +26,7 @@
    boolean claimInsOrderPlan(InsOrderPlanDTO entity);
    void saveInsContext(Map<String, Object> insContext,Integer currentTable,Integer sampleId,Integer orderId,String sonLaboratory);
    void saveInsContext(SaveInsContextDto saveInsContextDto);
    Map<String, Object> doInsOrder(Integer id, String laboratory);
inspect-server/src/main/java/com/ruoyi/inspect/service/InsOrderService.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.basic.pojo.StandardProductList;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.inspect.pojo.InsOrder;
import com.ruoyi.inspect.pojo.InsSample;
import com.ruoyi.inspect.pojo.InsUnqualifiedRetestProduct;
@@ -114,4 +115,12 @@
     * @param insSample
     */
    void updateSampleModel(InsSample insSample);
    /**
     * 查询当前时间是否没有该检测项的抽样计划
     * @param sampleList
     * @param insOrder
     * @return
     */
    Result judgeNotSpotCheckOrder(List<SampleProductDto> sampleList, InsOrder insOrder);
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/FinishProductSpotCheckServiceImpl.java
@@ -476,6 +476,7 @@
            template.write(os);
            os.flush();
            os.close();
            inputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败");
@@ -669,6 +670,7 @@
            template.write(os);
            os.flush();
            os.close();
            inputStream.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderPlanServiceImpl.java
@@ -361,15 +361,16 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveInsContext(Map<String, Object> insContext, Integer currentTable, Integer currentSampleId, Integer orderId, String sonLaboratory) {
    public void saveInsContext(SaveInsContextDto saveInsContextDto) {
        Map<String, Object> insContext = JSON.parseObject(saveInsContextDto.getParam(), Map.class);
        Integer userId = SecurityUtils.getUserId().intValue();
        InsSample insSample = insSampleMapper.selectById(currentSampleId);
        InsSample insSample = insSampleMapper.selectById(saveInsContextDto.getSampleId());
        insContext.forEach((k, v) -> {
            JSONObject jo = JSON.parseObject(JSON.toJSONString(v));
            InsProduct insProduct = new InsProduct();
            insProduct.setId(Integer.parseInt(k));
            InsProduct product = insProductMapper.selectById(insProduct.getId());
            if (currentTable.equals(product.getTemplateId()) && currentSampleId.equals(product.getInsSampleId())) {
            if (saveInsContextDto.getCurrentTable().equals(product.getTemplateId()) && saveInsContextDto.getSampleId().equals(product.getInsSampleId())) {
                List<InsProductResult> oldResults = insProductResultMapper.selectList(Wrappers.<InsProductResult>lambdaQuery()
                        .eq(InsProductResult::getInsProductId, insProduct.getId()));
                InsProductResult newResult = new InsProductResult();
@@ -502,22 +503,31 @@
                // 添加工时
                // 判断是否只是参与计算值, 参与计算值实际没有填写
                if (StringUtils.isNotBlank(newResult.getInsValue()) && !newResult.getInsValue().equals("[]")) {
                    InsProduct finalInsProduct = insProductMapper.selectById(product.getId());
                    threadPoolTaskExecutor.execute(() -> {
                        InsProduct finalInsProduct = insProductMapper.selectById(product.getId());
                        InsOrder insOrder = insOrderMapper.selectById(insSample.getInsOrderId());
                        this.addAuxiliary(userId, finalInsProduct, insOrder);
                    });
                } else {
                    // 判断是否是没有检验值的内容
                    if (saveInsContextDto.getIsNoTestValue() != null && saveInsContextDto.getIsNoTestValue() == 1) {
                        threadPoolTaskExecutor.execute(() -> {
                            InsProduct finalInsProduct = insProductMapper.selectById(product.getId());
                            InsOrder insOrder = insOrderMapper.selectById(insSample.getInsOrderId());
                            this.addAuxiliary(userId, finalInsProduct, insOrder);
                        });
                    }
                }
            }
        });
        String sampleIdStr = insContext.keySet().stream().findFirst().orElse(null);
        if (sampleIdStr != null) {
            int count = insProductMapper.selectInsProductCountByOrderId(orderId);
            int count = insProductMapper.selectInsProductCountByOrderId(saveInsContextDto.getOrderId());
            if (count == 0) {
                insOrderStateMapper.update(new InsOrderState(), Wrappers.<InsOrderState>lambdaUpdate()
                        .eq(InsOrderState::getInsOrderId, orderId)
                        .eq(InsOrderState::getLaboratory, sonLaboratory)
                        .eq(InsOrderState::getInsOrderId, saveInsContextDto.getOrderId())
                        .eq(InsOrderState::getLaboratory, saveInsContextDto.getSonLaboratory())
                        .set(InsOrderState::getInsState, 2));
            }
        }
@@ -605,20 +615,6 @@
     */
    private void getTemplateThing(InsOrder order, List<InsProduct> insProducts) {
        Set<Integer> set = new HashSet<>();
        // 检验项分类+检验项+检验子项的拼接
//        List<String> itemNameList = insProducts.stream().map(insProduct -> {
//            String itemName = "";
//            if (StringUtils.isNotBlank(insProduct.getInspectionItemClass())) {
//                itemName += insProduct.getInspectionItemClass().trim();
//            }
//            if (StringUtils.isNotBlank(insProduct.getInspectionItem())) {
//                itemName += insProduct.getInspectionItem().trim();
//            }
//            if (StringUtils.isNotBlank(insProduct.getInspectionItemSubclass())) {
//                itemName += insProduct.getInspectionItemSubclass().trim();
//            }
//            return itemName;
//        }).collect(Collectors.toList());
        // 查询订单状态判断是否是查历史模板
        if (order.getIsFirstSubmit() != null && order.getIsFirstSubmit().equals(1)) {
            InsOrderState insOrderState = insOrderStateMapper.selectOne(Wrappers.<InsOrderState>lambdaQuery()
@@ -822,10 +818,9 @@
        // 5.发送消息通知给复核人
        // 查询当前人信息
        Integer userId = SecurityUtils.getUserId().intValue();
        Map<String, String> userMap = insProductMapper.selectUserById(verifyUser);
        String userName = userMap.get("name");
        String userName = insProductMapper.selectUserById(userId).get("name");
        // 查询发送人信息
        String sendUserAccount = userMap.get("account");
        String sendUserAccount = insProductMapper.selectUserById(verifyUser).get("account");
        InformationNotification info = new InformationNotification();
        info.setCreateUser(userName);
        info.setMessageType("2");
@@ -967,13 +962,13 @@
     * @param ifsInventoryQuantity
     * @param order
     */
    private void addAnalysis(List<InsProduct> productList, IfsInventoryQuantity ifsInventoryQuantity, InsOrder order, String userName) {
    private void addAnalysis(List<InsProduct> productList, IfsInventoryQuantity ifsInventoryQuantity, InsOrder order, String sendUserAccount) {
        for (InsProduct insProduct : productList) {
            // 判断是否是数值类型
            if (insProduct.getInspectionValueType().equals("1") && insProduct.getInsResult().equals(1)) {
                List<InsProductDeviationWarningDetail> insProductAnalysisDtoList = insProductMapper.selectAnalysis(insProduct, ifsInventoryQuantity.getSupplierName());
                if (insProductAnalysisDtoList.size() < 5) {
                if (insProductAnalysisDtoList.size() < 10) {
                    continue;
                }
@@ -1034,10 +1029,10 @@
                            message += "\n检验项: " + insProduct.getInspectionItem() + insProduct.getInspectionItemSubclass();
                            message += "\n偏差超过了 10%";
                            // 发送给提交人
                            WxCpUtils.inform(userName, message, null);
                            // todo: 发送给检测中心主任(固定死)
                            WxCpUtils.inform("ZT-004704", message, null);
//                            WxCpUtils.inform(sendUserAccount, message, null);
//
//                            // todo: 发送给检测中心主任(固定死)
//                            WxCpUtils.inform("ZT-004704", message, null);
                        } catch (Exception e) {
                            e.printStackTrace();
                            log.error("偏差预警企业微信通知报错");
@@ -2015,7 +2010,7 @@
            insReportMapper.delete(Wrappers.<InsReport>lambdaQuery()
                    .eq(InsReport::getInsOrderId, insOrder.getId()));
            insReportMapper.insert(insReport);
            inputStream.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
@@ -2568,6 +2563,7 @@
            insReportMapper.delete(Wrappers.<InsReport>lambdaQuery()
                    .eq(InsReport::getInsOrderId, insOrder.getId()));
            insReportMapper.insert(insReport);
            inputStream.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
@@ -4242,6 +4238,11 @@
        // 保存到附件里面
        uploadFile(insOrderId, multipartFile);
        try {
            inputStream.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsOrderServiceImpl.java
@@ -13,15 +13,18 @@
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.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.mapper.IfsInventoryQuantityMapper;
import com.ruoyi.basic.mapper.StandardProductListMapper;
import com.ruoyi.basic.mapper.StructureItemParameterMapper;
import com.ruoyi.basic.pojo.IfsInventoryQuantity;
import com.ruoyi.basic.pojo.StandardProductList;
import com.ruoyi.basic.pojo.StructureItemParameter;
import com.ruoyi.basic.pojo.StructureTestObject;
import com.ruoyi.common.constant.InsOrderTypeConstants;
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.numgen.NumberGenerator;
import com.ruoyi.common.utils.*;
@@ -35,8 +38,6 @@
import com.ruoyi.inspect.service.InsProductService;
import com.ruoyi.inspect.service.InsSampleService;
import com.ruoyi.inspect.vo.InsOrderPrintingVo;
import com.ruoyi.performance.pojo.AuxiliaryOutputWorkingHoursTemporary;
import com.ruoyi.performance.service.AuxiliaryOutputWorkingHoursTemporaryService;
import com.ruoyi.system.mapper.UserMapper;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
@@ -82,14 +83,13 @@
    private IfsApiUtils ifsApiUtils;
    private SpotCheckQuarterItemMapper spotCheckQuarterItemMapper;
    private StandardProductListMapper standardProductListMapper;
    private AuxiliaryOutputWorkingHoursTemporaryService auxiliaryOutputWorkingHoursTemporaryService;
    private StructureItemParameterMapper structureItemParameterMapper;
    //获取检验下单数据
    @Override
    public IPage<SampleOrderDto> selectInsOrderParameter(IPage<InsOrder> page, SampleOrderDto sampleOrderDto) {
        //todo: 只看我判断全部,个人,组织的权限
        String laboratory = null;
        // 判断是否是全部
        String isOrderAll = null;
@@ -155,53 +155,9 @@
            spotCheckQuarterItemMapper.updateById(spotCheckQuarterItem);
        }
        // 创建工时暂存
        // 缓存样品id, 编号map
//        addWorkingHoursTemporary(userId, insSamples, ids, order);
        return 1;
    }
    /**
     * 创建工时暂存
     * @param userId
     * @param insSamples
     * @param ids
     * @param order
     */
    private void addWorkingHoursTemporary(Integer userId, List<InsSample> insSamples, List<Integer> ids, InsOrder order) {
        Map<Integer, String> sampleMap = insSamples.stream().collect(Collectors.toMap(InsSample::getId, InsSample::getSampleCode));
        List<InsProduct> insProductList = insProductMapper.selectList(Wrappers.<InsProduct>lambdaQuery()
                .in(InsProduct::getInsSampleId, ids)
                .eq(InsProduct::getState, 1));
        List<AuxiliaryOutputWorkingHoursTemporary> outputWorkingHours = insProductList.stream().map(insProduct -> {
            AuxiliaryOutputWorkingHoursTemporary auxiliaryOutputWorkingHours = new AuxiliaryOutputWorkingHoursTemporary();
            auxiliaryOutputWorkingHours.setInspectionItemClass(insProduct.getInspectionItemClass());//检测项分类
            auxiliaryOutputWorkingHours.setInspectionItem(insProduct.getInspectionItem());//检测父项
            auxiliaryOutputWorkingHours.setInspectionItemSubclass(insProduct.getInspectionItemSubclass());//检测子项
            auxiliaryOutputWorkingHours.setSample(sampleMap.get(insProduct.getInsSampleId()));//样品编号
            auxiliaryOutputWorkingHours.setOrderId(order.getId());//订单id
            auxiliaryOutputWorkingHours.setOrderNo(order.getEntrustCode());//非加班委托单号
            auxiliaryOutputWorkingHours.setWorkTime(insProduct.getManHour());//非加班工时
            auxiliaryOutputWorkingHours.setAmount(1);//非加班数量
            auxiliaryOutputWorkingHours.setOutputWorkTime((ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getOvertimeWorkTime()) ? auxiliaryOutputWorkingHours.getOvertimeWorkTime() : BigDecimal.ZERO).add(ObjectUtils.isNotEmpty(auxiliaryOutputWorkingHours.getWorkTime()) ? auxiliaryOutputWorkingHours.getWorkTime() : BigDecimal.ZERO));//产量工时
            auxiliaryOutputWorkingHours.setManHourGroup(insProduct.getManHourGroup());//工时分组
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
            DateTimeFormatter formatters = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            auxiliaryOutputWorkingHours.setDateTime(LocalDateTime.now().toLocalDate().atStartOfDay().format(formatters));//日期
            LocalDateTime localDateTime = LocalDateTime.now();
            DateTime parse = DateUtil.parse(localDateTime.format(formatter));
            auxiliaryOutputWorkingHours.setWeekDay(getWeek(localDateTime.format(formatters)));//星期
            auxiliaryOutputWorkingHours.setWeek(String.valueOf(DateUtil.weekOfYear(DateUtil.offsetDay(parse, 1))));//周次
            auxiliaryOutputWorkingHours.setCheck(userId);//检测人
            auxiliaryOutputWorkingHours.setPrice(insProduct.getPrice());//单价
            auxiliaryOutputWorkingHours.setSampleId(insProduct.getInsSampleId());//样品id
            auxiliaryOutputWorkingHours.setInsProductId(insProduct.getId());//检验项id
            return auxiliaryOutputWorkingHours;
        }).collect(Collectors.toList());
        auxiliaryOutputWorkingHoursTemporaryService.saveBatch(outputWorkingHours);
    }
    public static String getWeek(String dayStr) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@@ -237,6 +193,19 @@
            default:
                return "未知";
        }
    }
    // 如果你使用 Java 8+,也可以用 Stream API 简化代码:
    public List<StandardProductList> findMissingItemsWithStream(List<StandardProductList> standardList,
                                                                List<InsProduct> insList) {
        Set<Integer> insIds = insList.stream()
                .map(InsProduct::getStructureItemParameterId)
                .collect(Collectors.toSet());
        return standardList.stream()
                .filter(product -> !insIds.contains(product.getStructureItemParameterId()))
                .collect(Collectors.toList());
    }
    @Override
@@ -906,6 +875,10 @@
        // 修改检验项
        for (SampleProductDto sampleProductDto : insOrderUpdateDto.getSampleProduct()) {
            insSampleService.update(Wrappers.<InsSample>lambdaUpdate()
                    .eq(InsSample::getId, sampleProductDto.getId())
                    .set(InsSample::getSpecialStandardMethod, sampleProductDto.getSpecialStandardMethod()));
            insProductService.updateBatchById(sampleProductDto.getInsProduct());
        }
@@ -1057,6 +1030,122 @@
                .set(InsSample::getModel, insSample.getModel()));
    }
    /**
     * 查询当前时间是否没有该检测项的抽样计划
     * @param sampleList
     * @param insOrder
     * @return
     */
    @Override
    public Result judgeNotSpotCheckOrder(List<SampleProductDto> sampleList, InsOrder insOrder) {
        // 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("该抽样计划已被绑定过");
            }
        }
        // 判断是否是抽样检测
        if (insOrder.getOrderType().equals(InsOrderTypeConstants.SPOT_CHECK)) {
            Set<String> monthMessageSet = new HashSet<>();
            Set<String> quarterMessageSet = new HashSet<>();
            Set<String> yearMessageSet = new HashSet<>();
            String formatTime = "yyyy-MM-dd HH:mm:ss";
            // 查询当前所有样品的检验项
            for (SampleProductDto sampleProductDto : sampleList) {
                List<StandardProductList> standardProductList = getProductTreeBySampleId(sampleProductDto.getId());
                Set<Integer> insIds = sampleProductDto.getInsProduct().stream()
                        .map(InsProduct::getStructureItemParameterId)
                        .collect(Collectors.toSet());
                List<StandardProductList> productLists = standardProductList.stream()
                        .filter(product -> !insIds.contains(product.getStructureItemParameterId()))
                        .collect(Collectors.toList());
                // 查询检验项基础表, 查询是否有月度, 季度, 年度的检验项
                List<StructureItemParameter> itemParameterList = structureItemParameterMapper.selectList(Wrappers.<StructureItemParameter>lambdaQuery()
                        .in(StructureItemParameter::getId, productLists.stream().map(StandardProductList::getStructureItemParameterId).collect(Collectors.toList())));
                for (StructureItemParameter item : itemParameterList) {
                    if (StringUtils.isNotBlank(item.getSpotCheckType())) {
                        switch (item.getSpotCheckType()) {
                            case "1": // 月度
                                // 查询当月是否有该检测项的抽样计划
                                // 当月开始时间
                                DateTime monthStart = DateUtil.beginOfMonth(DateUtil.date());
                                String monthStartTime = monthStart.toString(formatTime);
                                // 当月结束时间
                                DateTime monthEnd = DateUtil.endOfMonth(DateUtil.date());
                                String monthEndTime = monthEnd.toString(formatTime);
                                Integer count = insOrderMapper.selectNotSpotCheckOrder(item.getId(), monthStartTime, monthEndTime);
                                if (count == 0) {
                                    String monthMessage = item.getInspectionItemClass() +
                                            item.getInspectionItem() +
                                            item.getInspectionItemSubclass();
                                    monthMessageSet.add(monthMessage);
                                }
                                break;
                            case "2": // 季度
                                DateTime quarterStart = DateUtil.beginOfQuarter(DateUtil.date());
                                String quarterStartTime = quarterStart.toString(formatTime);
                                // 当月结束时间
                                DateTime quarterEnd = DateUtil.endOfQuarter(DateUtil.date());
                                String quarterEndTime = quarterEnd.toString(formatTime);
                                Integer quarterCount = insOrderMapper.selectNotSpotCheckOrder(item.getId(), quarterStartTime, quarterEndTime);
                                if (quarterCount == 0) {
                                    String quarterMessage = item.getInspectionItemClass() +
                                            item.getInspectionItem() +
                                            item.getInspectionItemSubclass();
                                    quarterMessageSet.add(quarterMessage);
                                }
                                break;
                            case "3": // 年度
                                DateTime yearStart = DateUtil.beginOfQuarter(DateUtil.date());
                                String yearStartTime = yearStart.toString(formatTime);
                                // 当月结束时间
                                DateTime yearEnd = DateUtil.endOfQuarter(DateUtil.date());
                                String yearEndTime = yearEnd.toString(formatTime);
                                Integer yearCount = insOrderMapper.selectNotSpotCheckOrder(item.getId(), yearStartTime, yearEndTime);
                                if (yearCount == 0) {
                                    String yearMessage = item.getInspectionItemClass() +
                                            item.getInspectionItem() +
                                            item.getInspectionItemSubclass();
                                    yearMessageSet.add(yearMessage);
                                }
                                break;
                        }
                    }
                }
            }
            String message = "";
            if (CollectionUtils.isNotEmpty(monthMessageSet)) {
                message += StrUtil.format("<p>检验项<span style=\"color: red\">{}</span>当月还未进行抽样检测, 请查看是否需要添加当前检验项</p>", CollUtil.join(monthMessageSet, ", "));
            }
            if (CollectionUtils.isNotEmpty(quarterMessageSet)) {
                message += StrUtil.format("<p>检验项<span style=\"color: red\">{}</span>当前季度还未进行抽样检测, 请看是否需要添加当前检验项</p>", CollUtil.join(quarterMessageSet, ", "));
            }
            if (CollectionUtils.isNotEmpty(yearMessageSet)) {
                message += StrUtil.format("<p>检验项<span style=\"color: red\">{}</span>今年还未进行抽样检测, 请看是否需要添加当前检验项</p>", CollUtil.join(yearMessageSet, ", "));
            }
            if (StringUtils.isNotBlank(message)) {
                return Result.success(false, message);
            }
        }
        return Result.success(true);
    }
}
inspect-server/src/main/java/com/ruoyi/inspect/service/impl/InsProductServiceImpl.java
@@ -135,7 +135,8 @@
            product.setTemplate(null);
            product.setStyle(null);
            return product;
        }).collect(Collectors.toList());
        }).sorted((o1, o2) -> (o1.getSort() == null ? 0 : o1.getSort())
                - (o2.getSort() == null ? 0 : o2.getSort())).collect(Collectors.toList());
        return insProducts;
    }
inspect-server/src/main/resources/mapper/InsOrderMapper.xml
@@ -455,4 +455,18 @@
        GROUP BY io.id,type
        order by type desc,io.id desc
    </select>
    <!-- 查询当前时间是否有该检测项的抽样计划订单 -->
    <select id="selectNotSpotCheckOrder" resultType="java.lang.Integer">
        select count(*)
        from (select io.id
              from ins_product ip
                       left join ins_sample is2 on is2.id = ip.ins_sample_id
                       left join ins_order io on io.id = is2.ins_order_id
                       left join spot_check_quarter_item scqi on scqi.quarter_item_id = io.quarter_item_id
              where io.quarter_item_id is not null
                and scqi.spot_check_time between #{startTime} and #{endTime}
                and ip.structure_item_parameter_id = #{itmeId}
              group by io.id) a
    </select>
</mapper>
inspect-server/src/main/resources/static/report-template.docx
Binary files differ