package cn.iocoder.yudao.module.mes.service.qc.seedquality; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.qc.seedquality.vo.MesQcSeedQualitySubmitReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.batch.MesProBatchDO; import cn.iocoder.yudao.module.mes.dal.dataobject.qc.seedquality.*; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; import cn.iocoder.yudao.module.mes.dal.mysql.qc.seedquality.*; import cn.iocoder.yudao.module.mes.enums.wm.MesWmStockStateEnum; import cn.iocoder.yudao.module.mes.service.pro.batch.MesProBatchService; import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.jdbc.BadSqlGrammarException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.time.LocalDateTime; import java.util.*; @Service @Validated @Slf4j public class MesQcSeedQualityServiceImpl implements MesQcSeedQualityService { private static final Set REQUIRED = Set.of("purity", "cleanliness", "germination_rate", "moisture"); @Resource private MesQcSeedQualityMapper qualityMapper; @Resource private MesQcSeedQualityIndicatorMapper indicatorMapper; @Resource private MesProBatchService proBatchService; @Resource private MesWmBatchService mesWmBatchService; @Resource private MesWmMaterialStockService materialStockService; @Override @Transactional(rollbackFor = Exception.class) public Long submit(MesQcSeedQualitySubmitReqVO reqVO) { if (reqVO.getIndicators().size() != 4) throw new IllegalArgumentException("必须提交四项指标"); if (qualityMapper.selectByCode(reqVO.getCode()) != null) throw new IllegalArgumentException("该袋码已质检,禁止重复提交"); Set codes = new HashSet<>(); boolean passed = true; MesQcSeedQualityDO quality = MesQcSeedQualityDO.builder().code(reqVO.getCode()).itemId(reqVO.getItemId()) .batchCode(reqVO.getBatchCode()).reason(reqVO.getReason()).result(0) .inspectedAt(LocalDateTime.now()).build(); qualityMapper.insert(quality); for (MesQcSeedQualitySubmitReqVO.Indicator item : reqVO.getIndicators()) { if (!REQUIRED.contains(item.getCode()) || !codes.add(item.getCode())) throw new IllegalArgumentException("指标必须为纯度、净度、发芽率、水分且不可重复"); if (item.getMinValue().compareTo(item.getMaxValue()) > 0 || item.getValue().compareTo(item.getMinValue()) < 0 || item.getValue().compareTo(item.getMaxValue()) > 0) passed = false; indicatorMapper.insert(MesQcSeedQualityIndicatorDO.builder().qualityId(quality.getId()).indicatorCode(item.getCode()) .value(item.getValue()).minValue(item.getMinValue()).maxValue(item.getMaxValue()).build()); } if (!codes.equals(REQUIRED)) throw new IllegalArgumentException("四项指标不完整"); quality.setResult(passed ? 1 : 2); qualityMapper.updateById(quality); // 质检合格 → 库存整批由暂存库(待质检)转为合格库(正式库存) if (passed) { MesProBatchDO proBatch = proBatchService.getBatchByCode(reqVO.getBatchCode()); if (proBatch != null) { MesWmBatchDO wmBatch = mesWmBatchService.getOrCreateByProBatch(proBatch); if (wmBatch != null) { int updated = materialStockService.updateStockStateByBatchId(wmBatch.getId(), MesWmStockStateEnum.QUALIFIED.getState(), MesWmStockStateEnum.TEMP.getState()); log.info("[submit][质检合格,批次 {} 库存由暂存库转合格库,影响 {} 条]", reqVO.getBatchCode(), updated); } } } // 库位由后台配置服务接管,当前版本保留审计闭环,禁止前端传入库位。 return quality.getId(); } @Override public List getQualityByBatchCode(String batchCode) { try { return qualityMapper.selectListByBatchCode(batchCode); } catch (BadSqlGrammarException ex) { // 种子质检表未初始化时容错,不阻塞公开溯源 log.warn("[getQualityByBatchCode][种子质检表未初始化,批次 {} 查询失败: {}]", batchCode, ex.getMessage()); return List.of(); } } @Override public List getIndicatorsByQualityId(Long qualityId) { try { return indicatorMapper.selectListByQualityId(qualityId); } catch (BadSqlGrammarException ex) { // 种子质检表未初始化时容错 log.warn("[getIndicatorsByQualityId][种子质检指标表未初始化,质检 {} 查询失败: {}]", qualityId, ex.getMessage()); return List.of(); } } }