云
7 天以前 616a6b2e9a7824da8d11a4e11730fd2f9b615299
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/rqc/MesQcRqcServiceImpl.java
@@ -50,6 +50,9 @@
public class MesQcRqcServiceImpl implements MesQcRqcService {
    @Resource
    private cn.iocoder.yudao.module.mes.service.qc.MesQcCompletionHelper completionHelper;
    @Resource
    private MesQcRqcMapper rqcMapper;
    @Resource
@@ -90,42 +93,33 @@
    public Long createRqc(MesQcRqcSaveReqVO createReqVO) {
        // 1.1 校验数据
        validateRqcSaveData(createReqVO);
        // 1.2 根据物料 + RQC 检测种类查找可用质检方案(支持前端显式指定)
        List<MesQcTemplateItemDO> templateItems = templateItemService.getTemplateItemList(
                createReqVO.getItemId(), MesQcTypeEnum.RQC.getType(), null, null);
        if (CollUtil.isEmpty(templateItems)) {
            throw exception(QC_NO_TEMPLATE);
        }
        MesQcTemplateItemDO templateItem = templateItems.get(0);
        if (createReqVO.getTemplateId() != null) {
            templateItem = templateItems.stream()
                    .filter(available -> Objects.equals(available.getTemplateId(), createReqVO.getTemplateId()))
                    .findFirst().orElse(null);
            if (templateItem == null) {
                throw exception(QC_NO_TEMPLATE); // 指定了方案但不在匹配列表中,拒绝
            }
        }
        Long templateId = templateItem.getTemplateId();
        // 新建质检单不依赖质检方案。
        // 1.3 获取来源单据编号
        String sourceDocCode = validateAndGetSourceDocCode(
                createReqVO.getSourceDocType(), createReqVO.getSourceDocId());
        // 2. 插入主表
        MesQcRqcDO rqc = BeanUtils.toBean(createReqVO, MesQcRqcDO.class)
                .setTemplateId(templateId)
                .setTemplateId(null)
                .setSourceDocCode(sourceDocCode)
                .setStatus(MesQcStatusEnum.DRAFT.getStatus());
        if (Objects.equals(createReqVO.getSourceDocType(), MesBizTypeConstants.WM_RETURN_SALES)
                && createReqVO.getSourceLineId() != null) {
            var line = returnSalesLineService.validateReturnSalesLineExists(createReqVO.getSourceLineId());
            if (!Objects.equals(line.getReturnId(), createReqVO.getSourceDocId())
                    || !Objects.equals(line.getItemId(), createReqVO.getItemId())) {
                throw exception(WM_RETURN_SALES_DETAIL_SOURCE_MISMATCH);
            }
            rqc.setBatchCode(line.getBatchCode());
        }
        rqcMapper.insert(rqc);
        // 3. 从模板指标自动生成检验行
        rqcLineService.createLinesFromTemplate(rqc.getId(), templateId);
        return rqc.getId();
    }
    @Override
    public void updateRqc(MesQcRqcSaveReqVO updateReqVO) {
        // 1.1 校验存在 + 草稿状态
        validateRqcStatusPrepare(updateReqVO.getId());
        MesQcRqcDO existingRqc = validateRqcStatusPrepare(updateReqVO.getId());
        // 1.2 校验数据
        validateRqcSaveData(updateReqVO);
@@ -134,6 +128,8 @@
        updateObj.setSourceDocType(null).setSourceDocId(null).setSourceLineId(null); // 不允许修改来源单据
        updateObj.setTemplateId(null); // 不允许修改模板
        updateObj.setItemId(null); // 不允许修改物料
        if (Objects.equals(existingRqc.getSourceDocType(), MesBizTypeConstants.WM_RETURN_SALES)
                && existingRqc.getSourceLineId() != null) updateObj.setBatchCode(null);
        rqcMapper.updateById(updateObj);
    }
@@ -148,25 +144,15 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void finishRqc(Long id) {
        completionHelper.lockDocument("rqc", id);
        // 1.1 校验存在 + 草稿状态
        MesQcRqcDO rqc = validateRqcStatusPrepare(id);
        // 1.2 校验检测结论必填
        if (rqc.getCheckResult() == null) {
            throw exception(QC_RQC_CHECK_RESULT_EMPTY);
        }
        // 1.3 校验合格品 + 不合格品 = 检测数量
        if (rqc.getCheckQuantity() != null && rqc.getCheckQuantity().compareTo(BigDecimal.ZERO) > 0) {
            BigDecimal qualified = rqc.getQualifiedQuantity() != null ? rqc.getQualifiedQuantity() : BigDecimal.ZERO;
            BigDecimal unqualified = rqc.getUnqualifiedQuantity() != null ? rqc.getUnqualifiedQuantity() : BigDecimal.ZERO;
            if (qualified.add(unqualified).compareTo(rqc.getCheckQuantity()) != 0) {
                throw exception(QC_RQC_QUANTITY_MISMATCH);
            }
        }
        // 1.4 校验至少存在一条检测结果
        indicatorResultService.validateIndicatorResultExistsByQcIdAndType(id, MesQcTypeEnum.RQC.getType());
        int result = completionHelper.validateAndGetResult("rqc", id, rqc.getQualifiedQuantity(), rqc.getUnqualifiedQuantity(), rqc.getCheckQuantity());
        rqc.setCheckResult(result);
        // 2. 更新状态为已完成
        MesQcRqcDO updateObj = new MesQcRqcDO().setId(id).setStatus(MesQcStatusEnum.FINISHED.getStatus());
        MesQcRqcDO updateObj = new MesQcRqcDO().setId(id).setStatus(MesQcStatusEnum.FINISHED.getStatus()).setCheckResult(result);
        rqcMapper.updateById(updateObj);
        // 3. 不合格时自动创建 NCR