src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -1,7 +1,6 @@
package com.ruoyi.quality.service.impl;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -16,23 +15,31 @@
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.HackLoopTableRenderPolicy;
import com.ruoyi.common.utils.OrderUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.procurementrecord.service.ProcurementRecordService;
import com.ruoyi.procurementrecord.utils.StockUtils;
import com.ruoyi.quality.dto.QualityInspectDto;
import com.ruoyi.quality.utils.FinalInspectExportUtil;
import com.ruoyi.quality.utils.ProcessInspectExportUtil;
import com.ruoyi.quality.utils.RawMaterialInspectExportUtil;
import com.ruoyi.quality.mapper.QualityInspectMapper;
import com.ruoyi.quality.mapper.QualityTestStandardMapper;
import com.ruoyi.quality.mapper.QualityUnqualifiedMapper;
import com.ruoyi.quality.mapper.QualityUnqualifiedOrderMapper;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.quality.pojo.QualityInspectParam;
import com.ruoyi.quality.pojo.QualityUnqualified;
import com.ruoyi.quality.pojo.QualityUnqualifiedOrder;
import com.ruoyi.stock.pojo.StockInRecord;
import com.ruoyi.stock.service.StockInRecordService;
import com.ruoyi.quality.service.IQualityInspectParamService;
import com.ruoyi.quality.service.IQualityInspectService;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.stock.dto.StockInventoryDto;
import com.ruoyi.stock.pojo.StockInRecord;
import com.ruoyi.stock.service.StockInRecordService;
import com.ruoyi.stock.service.StockInventoryService;
import jakarta.servlet.http.HttpServletResponse;
import lombok.AllArgsConstructor;
@@ -68,6 +75,8 @@
    private QualityUnqualifiedMapper qualityUnqualifiedMapper;
    private QualityUnqualifiedOrderMapper qualityUnqualifiedOrderMapper;
    private SalesLedgerProductMapper salesLedgerProductMapper;
    private ProcurementRecordService procurementRecordService;
@@ -76,12 +85,15 @@
    public int add(QualityInspectDto qualityInspectDto) {
        QualityInspect qualityInspect = new QualityInspect();
        BeanUtils.copyProperties(qualityInspectDto, qualityInspect);
        qualityInspect.setId(null);//强制走数据库自增,避免前端误传id导致主键冲突
        qualityInspect.setInspectState(0);//默认未提交
        qualityInspectMapper.insert(qualityInspect);
        for (QualityInspectParam qualityInspectParam : qualityInspectDto.getQualityInspectParams()) {
            qualityInspectParam.setInspectId(qualityInspect.getId());
        if (ObjectUtils.isNotEmpty(qualityInspectDto.getQualityInspectParams())) {
            for (QualityInspectParam qualityInspectParam : qualityInspectDto.getQualityInspectParams()) {
                qualityInspectParam.setInspectId(qualityInspect.getId());
            }
            qualityInspectParamService.saveBatch(qualityInspectDto.getQualityInspectParams());
        }
        qualityInspectParamService.saveBatch(qualityInspectDto.getQualityInspectParams());
        // 保存附件
        fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.QUALITY_INSPECT, qualityInspect.getId(), qualityInspectDto.getStorageBlobDTOs());
        return 0;
@@ -104,9 +116,36 @@
    public int submit(QualityInspect inspect) {
        QualityInspect qualityInspect = qualityInspectMapper.selectById(inspect.getId());
        if (Integer.valueOf(1).equals(qualityInspect.getInspectState())) {
            throw new ServiceException("该记录已提交,不能重复提交");
        }
        // 原材料检验/过程检验/出厂检验:表单不再填写合格/不合格数量,改用「判定」字段
        boolean isVerdictInspect = qualityInspect.getInspectType() != null
                && (qualityInspect.getInspectType() == 0 || qualityInspect.getInspectType() == 1 || qualityInspect.getInspectType() == 2);
        //提交前必须判断是否合格
        if (ObjectUtils.isNull(qualityInspect.getCheckResult())) {
            throw new ServiceException("请先判断是否合格");
            if (isVerdictInspect) {
                // 改用「判定」字段
                if (ObjectUtils.isNull(qualityInspect.getVerdict())) {
                    throw new ServiceException("请先判定是否合格");
                }
            } else {
                throw new ServiceException("请先判断是否合格");
            }
        }
        // 由「判定」推导合格/不合格数量
        if (isVerdictInspect) {
            BigDecimal total = qualityInspect.getQuantity() == null ? BigDecimal.ZERO : qualityInspect.getQuantity();
            if ("合格".equals(qualityInspect.getVerdict())) {
                qualityInspect.setQualifiedQuantity(total);
                qualityInspect.setUnqualifiedQuantity(BigDecimal.ZERO);
            } else if ("不合格".equals(qualityInspect.getVerdict())) {
                qualityInspect.setQualifiedQuantity(BigDecimal.ZERO);
                qualityInspect.setUnqualifiedQuantity(total);
            }
        }
        if (ObjectUtils.isNull(qualityInspect.getQualifiedQuantity())) {
@@ -127,8 +166,10 @@
            qualityInspect.setUnqualifiedQuantity(BigDecimal.ZERO);
        }
        // 合格直接入库
        if(qualityInspect.getQualifiedQuantity().compareTo(BigDecimal.ZERO) > 0){
        // 合格直接入库(过程检不入库)
        if (qualityInspect.getQualifiedQuantity().compareTo(BigDecimal.ZERO) > 0 &&
                qualityInspect.getInspectType() != 1 &&
                qualityInspect.getInspectType() != 0) {
            //仅添加入库记录
            StockInventoryDto stockInventoryDto = new StockInventoryDto();
            //如果是采购质检合格入库选用CUSTOMIZATION_UNSTOCK_OUT,其余合格入库选用QUALITYINSPECT_STOCK_IN
@@ -158,9 +199,32 @@
            qualityUnqualified.setProductModelId(qualityInspect.getProductModelId());
            List<QualityInspectParam> inspectParams = qualityInspectParamService.list(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, inspect.getId()));
            String text = inspectParams.stream().map(QualityInspectParam::getParameterItem).collect(Collectors.joining(","));
            qualityUnqualified.setDefectivePhenomena(text + "这些指标中存在不合格");//不合格现象
            if (text == null || text.isEmpty()) {
                text = qualityInspect.getAbnormalRemark();
            }
            qualityUnqualified.setDefectivePhenomena((text == null || text.isEmpty()) ? "检验不合格" : text + "这些指标中存在不合格");//不合格现象
            qualityUnqualified.setInspectId(qualityInspect.getId());
            qualityUnqualifiedMapper.insert(qualityUnqualified);
            // 自动创建不合格品处理单,流入新模块
            QualityUnqualifiedOrder order = new QualityUnqualifiedOrder();
            order.setUnqualifiedId(qualityUnqualified.getId());
            order.setUnqualifiedProcess(qualityInspect.getInspectType() + 1);
            order.setUnqualifiedQuantity(qualityInspect.getUnqualifiedQuantity());
            order.setQuantity(qualityInspect.getQuantity());
            order.setProductModelId(qualityInspect.getProductModelId());
            order.setInspectorName(qualityInspect.getCheckName());
            if (qualityInspect.getCheckTime() != null) {
                order.setInspectDate(new java.util.Date(qualityInspect.getCheckTime().getTime()));
            }
            order.setSupplierName(qualityInspect.getSupplier());
            order.setSpecificationModel(qualityInspect.getModel());
            order.setProblemDescription(qualityInspect.getDefectivePhenomena());
            order.setStatus(0);
            String orderNo = OrderUtils.countTodayByCreateTime(
                    qualityUnqualifiedOrderMapper, "BHG", "order_no", LocalDateTime.now());
            order.setOrderNo(orderNo);
            qualityUnqualifiedOrderMapper.insert(order);
        }
        qualityInspect.setInspectState(1);//已提交
@@ -180,6 +244,9 @@
            return R.ok("检验单已提交");
        }
        if (ObjectUtils.isNull(qualityInspect.getVerdict())) {
            qualityInspect.setVerdict("合格");
        }
        if (ObjectUtils.isNull(qualityInspect.getCheckResult())) {
            qualityInspect.setCheckResult("合格");
        }
@@ -308,6 +375,21 @@
    @Override
    public void qualityInspectExport(HttpServletResponse response, QualityInspect qualityInspect) {
        List<QualityInspect> qualityInspects = qualityInspectMapper.qualityInspectExport(qualityInspect);
        // 原材料检验:按纸质单据样式导出
        if (qualityInspect.getInspectType() != null && qualityInspect.getInspectType() == 0) {
            RawMaterialInspectExportUtil.export(response, qualityInspects);
            return;
        }
        // 过程检验:按纸质单据样式导出
        if (qualityInspect.getInspectType() != null && qualityInspect.getInspectType() == 1) {
            ProcessInspectExportUtil.export(response, qualityInspects);
            return;
        }
        // 出厂检验:按纸质单据样式导出
        if (qualityInspect.getInspectType() != null && qualityInspect.getInspectType() == 2) {
            FinalInspectExportUtil.export(response, qualityInspects);
            return;
        }
        ExcelUtil<QualityInspect> util = new ExcelUtil<QualityInspect>(QualityInspect.class);
        switch (qualityInspect.getInspectType()) {
            case 0: