package cn.iocoder.yudao.module.mes.service.wm.itemreceipt; import cn.hutool.core.collection.CollUtil; 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.itemreceipt.vo.line.MesWmItemReceiptLinePageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line.MesWmItemReceiptLineSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptLineMapper; import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeLineService; 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.framework.common.util.collection.CollectionUtils.convertList; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; /** * MES 采购入库单行 Service 实现类 */ @Service @Validated public class MesWmItemReceiptLineServiceImpl implements MesWmItemReceiptLineService { @Resource private MesWmItemReceiptLineMapper itemReceiptLineMapper; @Resource @Lazy private MesWmItemReceiptService itemReceiptService; @Resource private MesWmItemReceiptDetailService itemReceiptDetailService; @Resource @Lazy private MesWmArrivalNoticeLineService arrivalNoticeLineService; @Resource private MesWmBatchService batchService; @Override public Long createItemReceiptLine(MesWmItemReceiptLineSaveReqVO createReqVO) { // 1. 校验父单据存在且为可编辑状态 MesWmItemReceiptDO receipt = itemReceiptService.validateItemReceiptEditable(createReqVO.getReceiptId()); // 2. 校验数据 validateItemReceiptLineSaveData(receipt, createReqVO); // 3.1 创建入库单行 MesWmItemReceiptLineDO line = BeanUtils.toBean(createReqVO, MesWmItemReceiptLineDO.class); // 3.2 生成或获取批次 MesWmBatchDO batch = generateOrGetBatch(receipt, createReqVO); if (batch != null) { line.setBatchId(batch.getId()); line.setBatchCode(batch.getCode()); } // 3.3 插入数据库 itemReceiptLineMapper.insert(line); return line.getId(); } @Override public void updateItemReceiptLine(MesWmItemReceiptLineSaveReqVO updateReqVO) { // 1.1 校验存在 MesWmItemReceiptLineDO line = validateItemReceiptLineExists(updateReqVO.getId()); // 1.2 校验父单据存在且为可编辑状态 MesWmItemReceiptDO receipt = itemReceiptService.validateItemReceiptEditable(line.getReceiptId()); // 1.3 校验数据 validateItemReceiptLineSaveData(receipt, updateReqVO); // 2.1 更新 MesWmItemReceiptLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmItemReceiptLineDO.class); // 2.2 生成或获取批次 MesWmBatchDO batch = generateOrGetBatch(receipt, updateReqVO); if (batch != null) { updateObj.setBatchId(batch.getId()).setBatchCode(batch.getCode()); } // 2.3 更新数据库 itemReceiptLineMapper.updateById(updateObj); } private void validateItemReceiptLineSaveData(MesWmItemReceiptDO receipt, MesWmItemReceiptLineSaveReqVO reqVO) { // 校验关联到货通知单行 validateArrivalNoticeLine(receipt, reqVO.getArrivalNoticeLineId()); } @Override @Transactional(rollbackFor = Exception.class) public void deleteItemReceiptLine(Long id) { // 1.1 校验存在 MesWmItemReceiptLineDO line = validateItemReceiptLineExists(id); // 1.2 校验父单据存在且为可编辑状态 itemReceiptService.validateItemReceiptEditable(line.getReceiptId()); // 2.1 级联删除明细 itemReceiptDetailService.deleteItemReceiptDetailByLineId(id); // 2.2 删除 itemReceiptLineMapper.deleteById(id); } @Override public MesWmItemReceiptLineDO getItemReceiptLine(Long id) { return itemReceiptLineMapper.selectById(id); } @Override public PageResult getItemReceiptLinePage(MesWmItemReceiptLinePageReqVO pageReqVO) { // 如果传了 vendorId,先查出该供应商的所有入库单 ID,设置到 receiptIds if (pageReqVO.getReceiptId() == null) { List receipts = itemReceiptService.getItemReceiptListByVendorId(pageReqVO.getVendorId()); if (CollUtil.isEmpty(receipts)) { return PageResult.empty(); } pageReqVO.setReceiptIds(convertList(receipts, MesWmItemReceiptDO::getId)); } // 查询分页 return itemReceiptLineMapper.selectPage(pageReqVO); } @Override public List getItemReceiptLineListByReceiptId(Long receiptId) { return itemReceiptLineMapper.selectListByReceiptId(receiptId); } @Override public void deleteItemReceiptLineByReceiptId(Long receiptId) { itemReceiptLineMapper.deleteByReceiptId(receiptId); } @Override public void createItemReceiptLineFromArrivalNoticeLine(MesWmItemReceiptLineDO line) { // 内部方法,不做校验,直接插入 itemReceiptLineMapper.insert(line); } /** * 校验到货通知单行 * * @param receipt 入库单 * @param arrivalNoticeLineId 到货通知单行编号 */ private void validateArrivalNoticeLine(MesWmItemReceiptDO receipt, Long arrivalNoticeLineId) { // 情况一:如果入库单关联了到货通知单,则必须关联到货通知单行 if (receipt.getNoticeId() != null) { if (arrivalNoticeLineId == null) { throw exception(WM_ITEM_RECEIPT_LINE_ARRIVAL_NOTICE_LINE_REQUIRED); } arrivalNoticeLineService.validateArrivalNoticeLineExists( arrivalNoticeLineId, receipt.getNoticeId()); return; } // 情况二:如果入库单没有关联到货通知单,则不允许关联到货通知单行 if (arrivalNoticeLineId != null) { throw exception(WM_ITEM_RECEIPT_LINE_ARRIVAL_NOTICE_LINE_NOT_ALLOWED); } } private MesWmItemReceiptLineDO validateItemReceiptLineExists(Long id) { MesWmItemReceiptLineDO line = itemReceiptLineMapper.selectById(id); if (line == null) { throw exception(WM_ITEM_RECEIPT_LINE_NOT_EXISTS); } return line; } /** * 生成或获取批次 * * @param receipt 入库单 * @param reqVO 入库单行请求VO * @return 批次记录(如果物料未启用批次管理则返回 null) */ private MesWmBatchDO generateOrGetBatch(MesWmItemReceiptDO receipt, MesWmItemReceiptLineSaveReqVO reqVO) { // 构建批次参数 VO MesWmBatchGenerateReqVO batchReqVO = new MesWmBatchGenerateReqVO(); // 从入库单行获取 batchReqVO.setItemId(reqVO.getItemId()).setProduceDate(reqVO.getProductionDate()) .setExpireDate(reqVO.getExpireDate()).setLotNumber(reqVO.getLotNumber()); // 从父单据获取 batchReqVO.setVendorId(receipt.getVendorId()).setReceiptDate(receipt.getReceiptDate()) .setPurchaseOrderCode(receipt.getPurchaseOrderCode()); // 生成或获取批次 return batchService.getOrGenerateBatchCode(batchReqVO); } }