package cn.iocoder.yudao.module.mes.service.wm.outsourcereceipt; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchGenerateReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourcereceipt.vo.line.MesWmOutsourceReceiptLinePageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourcereceipt.vo.line.MesWmOutsourceReceiptLineSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptLineDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourcereceipt.MesWmOutsourceReceiptLineMapper; import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService; import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_OUTSOURCE_RECEIPT_LINE_NOT_EXISTS; /** * MES 委外收货单行 Service 实现类 */ @Service @Validated public class MesWmOutsourceReceiptLineServiceImpl implements MesWmOutsourceReceiptLineService { @Resource private MesWmOutsourceReceiptLineMapper lineMapper; @Resource private MesMdmItemService mdmItemService; @Resource @Lazy private MesWmOutsourceReceiptDetailService outsourceReceiptDetailService; @Resource @Lazy private MesWmOutsourceReceiptService outsourceReceiptService; @Resource @Lazy private MesProWorkOrderService workOrderService; @Resource private MesWmBatchService batchService; @Override public Long createOutsourceReceiptLine(MesWmOutsourceReceiptLineSaveReqVO createReqVO) { // 校验物料存在 mdmItemService.validateItemExistsAndEnable(createReqVO.getItemId()); // 插入 MesWmOutsourceReceiptLineDO line = BeanUtils.toBean(createReqVO, MesWmOutsourceReceiptLineDO.class); line.setQualityStatus(calculateQualityStatus(line.getIqcCheckFlag())); // 质量状态自动赋值 // 生成或获取批次 MesWmBatchDO batch = generateOrGetBatch(createReqVO); if (batch != null) { line.setBatchId(batch.getId()); line.setBatchCode(batch.getCode()); } lineMapper.insert(line); return line.getId(); } @Override public void updateOutsourceReceiptLine(MesWmOutsourceReceiptLineSaveReqVO updateReqVO) { // 校验存在 validateOutsourceReceiptLineExists(updateReqVO.getId()); // 校验物料存在 mdmItemService.validateItemExistsAndEnable(updateReqVO.getItemId()); // 更新 MesWmOutsourceReceiptLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmOutsourceReceiptLineDO.class); updateObj.setQualityStatus(calculateQualityStatus(updateObj.getIqcCheckFlag())); // 质量状态自动赋值 // 生成或获取批次 MesWmBatchDO batch = generateOrGetBatch(updateReqVO); if (batch != null) { updateObj.setBatchId(batch.getId()); updateObj.setBatchCode(batch.getCode()); } lineMapper.updateById(updateObj); } @Override @Transactional(rollbackFor = Exception.class) public void deleteOutsourceReceiptLine(Long id) { // 校验存在 validateOutsourceReceiptLineExists(id); // 级联删除明细 outsourceReceiptDetailService.deleteOutsourceReceiptDetailByLineId(id); // 删除 lineMapper.deleteById(id); } @Override public MesWmOutsourceReceiptLineDO getOutsourceReceiptLine(Long id) { return lineMapper.selectById(id); } @Override public PageResult getOutsourceReceiptLinePage(MesWmOutsourceReceiptLinePageReqVO pageReqVO) { return lineMapper.selectPage(pageReqVO); } @Override public List getOutsourceReceiptLineListByReceiptId(Long receiptId) { return lineMapper.selectListByReceiptId(receiptId); } @Override public void deleteOutsourceReceiptLineByReceiptId(Long receiptId) { lineMapper.deleteByReceiptId(receiptId); } private void validateOutsourceReceiptLineExists(Long id) { if (lineMapper.selectById(id) == null) { throw exception(WM_OUTSOURCE_RECEIPT_LINE_NOT_EXISTS); } } @Override public void updateOutsourceReceiptLineDO(MesWmOutsourceReceiptLineDO line) { lineMapper.updateById(line); } @Override public void createOutsourceReceiptLineDO(MesWmOutsourceReceiptLineDO line) { lineMapper.insert(line); } /** * 根据 iqcCheckFlag,计算质量状态 * * @param iqcCheckFlag 是否需要质检 * @return 质量状态 */ private Integer calculateQualityStatus(Boolean iqcCheckFlag) { if (Boolean.TRUE.equals(iqcCheckFlag)) { return MesWmQualityStatusEnum.PENDING.getStatus(); // 待检 } return MesWmQualityStatusEnum.PASS.getStatus(); // 不需检验,默认合格 } /** * 生成或获取批次 * * @param reqVO 入库单行请求VO * @return 批次记录(如果物料未启用批次管理则返回 null) */ private MesWmBatchDO generateOrGetBatch(MesWmOutsourceReceiptLineSaveReqVO reqVO) { MesWmBatchGenerateReqVO batchReqVO = new MesWmBatchGenerateReqVO(); batchReqVO.setItemId(reqVO.getItemId()).setProduceDate(reqVO.getProductionDate()) .setExpireDate(reqVO.getExpireDate()).setLotNumber(reqVO.getLotNumber()); MesWmOutsourceReceiptDO receipt = outsourceReceiptService.getOutsourceReceipt(reqVO.getReceiptId()); if (receipt != null) { batchReqVO.setVendorId(receipt.getVendorId()) .setWorkOrderId(receipt.getWorkOrderId()) .setReceiptDate(receipt.getReceiptDate()); if (receipt.getWorkOrderId() != null) { MesProWorkOrderDO workOrder = workOrderService.getWorkOrder(receipt.getWorkOrderId()); if (workOrder != null) { batchReqVO.setClientId(workOrder.getClientId()); } } } // 调用批次服务生成或获取批次 return batchService.getOrGenerateBatchCode(batchReqVO); } }