From 6a9c2c25e51d5a4ccd19c47d4e8f4aac5bb515a8 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 22 Mar 2026 22:30:38 +0800 Subject: [PATCH] ✨ feat(transaction): 添加库存事务创建逻辑,支持入库和出库操作 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/MesBizTypeConstants.java | 5 +++-- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemconsume/MesWmItemConsumeLineService.java | 8 ++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemconsume/MesWmItemConsumeLineServiceImpl.java | 5 +++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java | 38 +++++++++++++++++++++++--------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueServiceImpl.java | 32 +++++++++++++++++++++----------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptServiceImpl.java | 34 ++++++++++++++++++++++------------ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java | 33 +++++++++++++++++++++------------ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java | 28 ++++++++++++++++++++-------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java | 33 +++++++++++++++++++++++---------- 9 files changed, 146 insertions(+), 70 deletions(-) diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/MesBizTypeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/MesBizTypeConstants.java index 292d39a..3de5c9c 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/MesBizTypeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/MesBizTypeConstants.java @@ -36,14 +36,15 @@ public final class MesBizTypeConstants { public static final int WM_MISC_ISSUE = 113; // 其他出库:MesWmMiscIssueDO public static final int WM_MISC_RECPT = 114; // 其他入库:MesWmMiscReceiptDO public static final int WM_ISSUE = 115; // 生产领料:MesWmProductionIssueDO - public static final int WM_RT_ISSUE = 116; // 生产退料:MesWmReturnIssueDO + public static final int WM_RETURN_ISSUE = 116; // 生产退料:MesWmReturnIssueDO public static final int WM_PRODUCT_RECPT = 117; // 生产入库:MesWmProductReceiptDO public static final int WM_PRODUCT_SALES = 118; // 销售出库:MesWmProductSalesDO - public static final int WM_RT_SALES = 119; // 销售退货入库:MesWmReturnSalesDO + public static final int WM_RETURN_SALES = 119; // 销售退货入库:MesWmReturnSalesDO public static final int WM_OUTSOURCE_ISSUE = 120; // 外协发料:MesWmOutsourceIssueDO public static final int WM_OUTSOURCE_RECPT = 121; // 外协入库:MesWmOutsourceReceiptDO public static final int WM_ITEM_CONSUME = 122; // 生产消耗:MesWmItemConsumeDO public static final int WM_PRODUCT_PRODUCE = 123; // 产品产出:MesWmProductProduceDO + public static final int WM_RETURN_VENDOR = 124; // 供应商退货出库:MesWmReturnVendorDO // ========== CAL 排班模块 [200, 300) ========== diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemconsume/MesWmItemConsumeLineService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemconsume/MesWmItemConsumeLineService.java index 43d02fc..bccbd92 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemconsume/MesWmItemConsumeLineService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemconsume/MesWmItemConsumeLineService.java @@ -28,4 +28,12 @@ public interface MesWmItemConsumeLineService { */ PageResult getItemConsumeLinePage(MesWmItemConsumeLinePageReqVO pageReqVO); + /** + * 查询指定消耗记录的所有行 + * + * @param consumeId 消耗记录编号 + * @return 消耗行列表 + */ + List getItemConsumeLineListByConsumeId(Long consumeId); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemconsume/MesWmItemConsumeLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemconsume/MesWmItemConsumeLineServiceImpl.java index 312141d..cc63943 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemconsume/MesWmItemConsumeLineServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemconsume/MesWmItemConsumeLineServiceImpl.java @@ -44,4 +44,9 @@ public class MesWmItemConsumeLineServiceImpl implements MesWmItemConsumeLineServ return itemConsumeLineMapper.selectPage(pageReqVO, consume.getId()); } + @Override + public List getItemConsumeLineListByConsumeId(Long consumeId) { + return itemConsumeLineMapper.selectListByConsumeId(consumeId); + } + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java index 85bddda..86450ea 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java @@ -12,9 +12,12 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceip import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDetailDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptMapper; +import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; import cn.iocoder.yudao.module.mes.enums.wm.MesWmItemReceiptStatusEnum; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService; -import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; +import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; +import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -25,6 +28,7 @@ import java.math.BigDecimal; 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.*; /** @@ -39,16 +43,14 @@ public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService { @Resource private MesWmItemReceiptLineService itemReceiptLineService; - @Resource private MesWmItemReceiptDetailService itemReceiptDetailService; - @Resource @Lazy private MesWmArrivalNoticeService arrivalNoticeService; @Resource - private MesWmMaterialStockService materialStockService; + private MesWmTransactionService wmTransactionService; @Override public Long createItemReceipt(MesWmItemReceiptSaveReqVO createReqVO) { @@ -140,31 +142,37 @@ public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService { @Override @Transactional(rollbackFor = Exception.class) public void finishItemReceipt(Long id) { - // 校验存在 + // 1. 校验存在 MesWmItemReceiptDO receipt = validateItemReceiptExists(id); if (ObjUtil.notEqual(MesWmItemReceiptStatusEnum.APPROVED.getStatus(), receipt.getStatus())) { throw exception(WM_ITEM_RECEIPT_STATUS_ERROR); } - // 遍历所有明细,更新库存台账 - // TODO @AI:【后续在弄】这里可能有点问题;缺少库存更新;后面在弄; - List details = itemReceiptDetailService.getItemReceiptDetailListByReceiptId(id); - for (MesWmItemReceiptDetailDO detail : details) { - materialStockService.increaseStock( - detail.getItemId(), detail.getWarehouseId(), detail.getLocationId(), detail.getAreaId(), - detail.getBatchId(), detail.getQuantity(), receipt.getVendorId(), null, null); - } + // 2. 遍历所有明细,创建库存事务(增加库存 + 记录流水) + createTransactionList(receipt); - // 更新入库单状态 + // 3. 更新入库单状态 itemReceiptMapper.updateById(new MesWmItemReceiptDO() .setId(id).setStatus(MesWmItemReceiptStatusEnum.FINISHED.getStatus())); - // 更新关联的到货通知单状态 + // 4. 更新关联的到货通知单状态 if (receipt.getNoticeId() != null) { arrivalNoticeService.finishArrivalNotice(receipt.getNoticeId()); } } + private void createTransactionList(MesWmItemReceiptDO receipt) { + List details = itemReceiptDetailService.getItemReceiptDetailListByReceiptId(receipt.getId()); + wmTransactionService.createTransactionList(convertList(details, detail -> new MesWmTransactionSaveReqDTO() + .setType(MesWmTransactionTypeEnum.IN.getType()).setItemId(detail.getItemId()) + .setQuantity(detail.getQuantity()) // 入库数量为正数 + .setBatchId(detail.getBatchId()) + .setWarehouseId(detail.getWarehouseId()).setLocationId(detail.getLocationId()).setAreaId(detail.getAreaId()) + .setVendorId(receipt.getVendorId()).setReceiptTime(receipt.getReceiptDate()) + .setBizType(MesBizTypeConstants.WM_ITEM_RECEIPT_IN).setBizId(receipt.getId()) + .setBizCode(receipt.getCode()).setBizLineId(detail.getLineId()))); + } + @Override @Transactional(rollbackFor = Exception.class) public void cancelItemReceipt(Long id) { diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueServiceImpl.java index 61bda00..772f24b 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourceissue/MesWmOutsourceIssueServiceImpl.java @@ -12,9 +12,12 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsour import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourceissue.MesWmOutsourceIssueLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourceissue.MesWmOutsourceIssueMapper; +import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; import cn.iocoder.yudao.module.mes.enums.wm.MesWmOutsourceIssueStatusEnum; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; +import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; +import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -24,6 +27,7 @@ import java.util.List; import java.util.Map; 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.*; /** @@ -33,7 +37,6 @@ import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; */ @Service @Validated -@Slf4j public class MesWmOutsourceIssueServiceImpl implements MesWmOutsourceIssueService { @Resource @@ -41,9 +44,10 @@ public class MesWmOutsourceIssueServiceImpl implements MesWmOutsourceIssueServic @Resource private MesWmOutsourceIssueLineService outsourceIssueLineService; - @Resource private MesWmOutsourceIssueDetailService outsourceIssueDetailService; + @Resource + private MesWmTransactionService wmTransactionService; @Override public Long createOutsourceIssue(MesWmOutsourceIssueSaveReqVO createReqVO) { @@ -153,20 +157,26 @@ public class MesWmOutsourceIssueServiceImpl implements MesWmOutsourceIssueServic throw exception(WM_OUTSOURCE_ISSUE_STATUS_NOT_APPROVED); } - // 2. 扣减库存(遍历明细表,逐条扣减) - List details = outsourceIssueDetailService.getOutsourceIssueDetailListByIssueId(id); - for (MesWmOutsourceIssueDetailDO detail : details) { - // TODO: 调用库存服务扣减库存 - // materialStockService.decreaseStock(detail.getMaterialStockId(), detail.getQuantity()); - log.info("[finishOutsourceIssue][发料单({}) 扣减库存 - 库存ID: {}, 数量: {}]", - id, detail.getMaterialStockId(), detail.getQuantity()); - } + // 2. 遍历所有明细,创建库存事务(扣减库存 + 记录流水) + createTransactionList(issue); // 3. 更新单据状态为已完成 outsourceIssueMapper.updateById(new MesWmOutsourceIssueDO() .setId(id).setStatus(MesWmOutsourceIssueStatusEnum.FINISHED.getStatus())); } + private void createTransactionList(MesWmOutsourceIssueDO issue) { + List details = outsourceIssueDetailService.getOutsourceIssueDetailListByIssueId(issue.getId()); + wmTransactionService.createTransactionList(convertList(details, detail -> new MesWmTransactionSaveReqDTO() + .setType(MesWmTransactionTypeEnum.OUT.getType()).setItemId(detail.getItemId()) + .setQuantity(detail.getQuantity().negate()) // 出库数量为负数 + .setBatchId(detail.getBatchId()) + .setWarehouseId(detail.getWarehouseId()).setLocationId(detail.getLocationId()).setAreaId(detail.getAreaId()) + .setVendorId(issue.getVendorId()) + .setBizType(MesBizTypeConstants.WM_OUTSOURCE_ISSUE).setBizId(issue.getId()) + .setBizCode(issue.getCode()).setBizLineId(detail.getLineId()))); + } + @Override @Transactional(rollbackFor = Exception.class) public void cancelOutsourceIssue(Long id) { diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptServiceImpl.java index ec2426e..d612684 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptServiceImpl.java @@ -15,11 +15,14 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutso import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourcereceipt.MesWmOutsourceReceiptDetailMapper; import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourcereceipt.MesWmOutsourceReceiptLineMapper; import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourcereceipt.MesWmOutsourceReceiptMapper; +import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; import cn.iocoder.yudao.module.mes.enums.wm.MesWmOutsourceReceiptStatusEnum; import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService; -import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; +import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; +import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; @@ -31,6 +34,7 @@ import java.util.List; import java.util.Map; 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.*; /** @@ -50,7 +54,7 @@ public class MesWmOutsourceReceiptServiceImpl implements MesWmOutsourceReceiptSe private MesWmOutsourceReceiptDetailMapper outsourceReceiptDetailMapper; @Resource - private MesWmMaterialStockService materialStockService; + private MesWmTransactionService wmTransactionService; @Resource private MesMdVendorService vendorService; @@ -170,26 +174,32 @@ public class MesWmOutsourceReceiptServiceImpl implements MesWmOutsourceReceiptSe @Override @Transactional(rollbackFor = Exception.class) public void finishOutsourceReceipt(Long id) { - // 校验存在 + // 1. 校验存在 MesWmOutsourceReceiptDO receipt = validateOutsourceReceiptExists(id); if (ObjUtil.notEqual(MesWmOutsourceReceiptStatusEnum.APPROVED.getStatus(), receipt.getStatus())) { throw exception(WM_OUTSOURCE_RECEIPT_STATUS_ERROR); } - // 遍历所有明细,校验并更新库存台账 - // DONE @AI:芋艿【暂时不处理】;后续在观察;(AI 未修复原因:标注为后续处理,需人工介入) - List details = outsourceReceiptDetailMapper.selectListByReceiptId(id); - for (MesWmOutsourceReceiptDetailDO detail : details) { - materialStockService.increaseStock( - detail.getItemId(), detail.getWarehouseId(), detail.getLocationId(), detail.getAreaId(), - detail.getBatchId(), detail.getQuantity(), receipt.getVendorId(), null, null); - } + // 2. 遍历所有明细,创建库存事务(增加库存 + 记录流水) + createTransactionList(receipt); - // 更新入库单状态 + // 3. 更新入库单状态 outsourceReceiptMapper.updateById(new MesWmOutsourceReceiptDO() .setId(id).setStatus(MesWmOutsourceReceiptStatusEnum.FINISHED.getStatus())); } + private void createTransactionList(MesWmOutsourceReceiptDO receipt) { + List details = outsourceReceiptDetailMapper.selectListByReceiptId(receipt.getId()); + wmTransactionService.createTransactionList(convertList(details, detail -> new MesWmTransactionSaveReqDTO() + .setType(MesWmTransactionTypeEnum.IN.getType()).setItemId(detail.getItemId()) + .setQuantity(detail.getQuantity()) // 入库数量为正数 + .setBatchId(detail.getBatchId()) + .setWarehouseId(detail.getWarehouseId()).setLocationId(detail.getLocationId()).setAreaId(detail.getAreaId()) + .setVendorId(receipt.getVendorId()).setReceiptTime(receipt.getReceiptDate()) + .setBizType(MesBizTypeConstants.WM_OUTSOURCE_RECPT).setBizId(receipt.getId()) + .setBizCode(receipt.getCode()).setBizLineId(detail.getLineId()))); + } + @Override @Transactional(rollbackFor = Exception.class) public void cancelOutsourceReceipt(Long id) { diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java index a38e7a3..3695af8 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesServiceImpl.java @@ -13,9 +13,12 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSa import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesDetailDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesMapper; +import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductSalesStatusEnum; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; import cn.iocoder.yudao.module.mes.service.md.client.MesMdClientService; -import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; +import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; +import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -25,6 +28,7 @@ import java.math.BigDecimal; 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.*; /** @@ -49,7 +53,7 @@ public class MesWmProductSalesServiceImpl implements MesWmProductSalesService { private MesMdClientService clientService; @Resource - private MesWmMaterialStockService materialStockService; + private MesWmTransactionService wmTransactionService; @Override public Long createProductSales(MesWmProductSalesSaveReqVO createReqVO) { @@ -170,26 +174,31 @@ public class MesWmProductSalesServiceImpl implements MesWmProductSalesService { @Override @Transactional(rollbackFor = Exception.class) public void finishProductSales(Long id) { - // 校验存在 + // 1. 校验存在 MesWmProductSalesDO sales = validateProductSalesExists(id); if (ObjUtil.notEqual(MesWmProductSalesStatusEnum.APPROVED.getStatus(), sales.getStatus())) { throw exception(WM_PRODUCT_SALES_CANNOT_FINISH); } - // 遍历所有明细,扣减库存 - // DONE @AI:需要实现 decreaseStock 方法(AI 未修复原因:需要 materialStockService 提供 decreaseStock 方法实现) - List details = productSalesDetailService.getProductSalesDetailListBySalesId(id); - for (MesWmProductSalesDetailDO detail : details) { - // materialStockService.decreaseStock( - // detail.getItemId(), detail.getWarehouseId(), detail.getLocationId(), detail.getAreaId(), - // detail.getBatchId(), detail.getQuantity(), sales.getClientId(), null, null); - } + // 2. 遍历所有明细,创建库存事务(扣减库存 + 记录流水) + createTransactionList(sales); - // 更新出库单状态 + // 3. 更新出库单状态 productSalesMapper.updateById(new MesWmProductSalesDO() .setId(id).setStatus(MesWmProductSalesStatusEnum.FINISHED.getStatus())); } + private void createTransactionList(MesWmProductSalesDO sales) { + List details = productSalesDetailService.getProductSalesDetailListBySalesId(sales.getId()); + wmTransactionService.createTransactionList(convertList(details, detail -> new MesWmTransactionSaveReqDTO() + .setType(MesWmTransactionTypeEnum.OUT.getType()).setItemId(detail.getItemId()) + .setQuantity(detail.getQuantity().negate()) // 出库数量为负数 + .setBatchId(detail.getBatchId()) + .setWarehouseId(detail.getWarehouseId()).setLocationId(detail.getLocationId()).setAreaId(detail.getAreaId()) + .setBizType(MesBizTypeConstants.WM_PRODUCT_SALES).setBizId(sales.getId()) + .setBizCode(sales.getCode()).setBizLineId(detail.getLineId()))); + } + @Override @Transactional(rollbackFor = Exception.class) public void cancelProductSales(Long id) { diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java index 509355c..069d13b 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesServiceImpl.java @@ -13,10 +13,14 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSale import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDetailDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesMapper; +import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; import cn.iocoder.yudao.module.mes.service.md.client.MesMdClientService; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; +import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -27,6 +31,7 @@ import java.util.List; import java.util.Map; 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.*; /** @@ -49,6 +54,8 @@ public class MesWmReturnSalesServiceImpl implements MesWmReturnSalesService { private MesMdClientService clientService; @Resource private MesMdItemService itemService; + @Resource + private MesWmTransactionService wmTransactionService; @Override @Transactional(rollbackFor = Exception.class) @@ -162,20 +169,25 @@ public class MesWmReturnSalesServiceImpl implements MesWmReturnSalesService { } } - // 2. 遍历所有明细,更新库存台账(增加库存) - // DONE @芋艿:【后续在弄】这里需要库存更新;后面在弄(AI 未修复原因:标注为后续处理,需人工介入) - List details = returnSalesDetailService.getReturnSalesDetailListByReturnId(id); - for (MesWmReturnSalesDetailDO detail : details) { - // materialStockService.increaseStock( - // detail.getItemId(), detail.getWarehouseId(), detail.getLocationId(), detail.getAreaId(), - // detail.getBatchId(), detail.getQuantity(), null, null, null); - } + // 2. 遍历所有明细,创建库存事务(增加库存 + 记录流水) + createTransactionList(returnSales); // 3. 更新退货单状态 returnSalesMapper.updateById(new MesWmReturnSalesDO() .setId(id).setStatus(MesWmReturnSalesStatusEnum.FINISHED.getStatus())); } + private void createTransactionList(MesWmReturnSalesDO returnSales) { + List details = returnSalesDetailService.getReturnSalesDetailListByReturnId(returnSales.getId()); + wmTransactionService.createTransactionList(convertList(details, detail -> new MesWmTransactionSaveReqDTO() + .setType(MesWmTransactionTypeEnum.IN.getType()).setItemId(detail.getItemId()) + .setQuantity(detail.getQuantity()) // 入库数量为正数 + .setBatchId(detail.getBatchId()) + .setWarehouseId(detail.getWarehouseId()).setLocationId(detail.getLocationId()).setAreaId(detail.getAreaId()) + .setBizType(MesBizTypeConstants.WM_RETURN_SALES).setBizId(returnSales.getId()) + .setBizCode(returnSales.getCode()).setBizLineId(detail.getLineId()))); + } + @Override @Transactional(rollbackFor = Exception.class) public void cancelReturnSales(Long id) { diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java index 0decd9a..337e915 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorServiceImpl.java @@ -12,8 +12,12 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVen import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDetailDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorMapper; +import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnVendorStatusEnum; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService; +import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; +import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -23,6 +27,7 @@ import java.math.BigDecimal; 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.*; /** @@ -41,6 +46,8 @@ public class MesWmReturnVendorServiceImpl implements MesWmReturnVendorService { private MesWmReturnVendorDetailService returnVendorDetailService; @Resource private MesMdVendorService vendorService; + @Resource + private MesWmTransactionService wmTransactionService; @Override @Transactional(rollbackFor = Exception.class) @@ -124,26 +131,32 @@ public class MesWmReturnVendorServiceImpl implements MesWmReturnVendorService { @Override @Transactional(rollbackFor = Exception.class) public void finishReturnVendor(Long id) { - // 校验存在 + // 1. 校验存在 MesWmReturnVendorDO returnVendor = validateReturnVendorExists(id); if (ObjUtil.notEqual(MesWmReturnVendorStatusEnum.APPROVED.getStatus(), returnVendor.getStatus())) { throw exception(WM_RETURN_VENDOR_STATUS_INVALID); } - // 遍历所有明细,更新库存台账(扣减库存) - // DONE @芋艿:【后续在弄】这里可能有点问题;缺少库存更新;后面在弄;(AI 未修复原因:标注为后续处理,需人工介入) - List details = returnVendorDetailService.getReturnVendorDetailListByReturnId(id); - for (MesWmReturnVendorDetailDO detail : details) { - // materialStockService.decreaseStock( - // detail.getItemId(), detail.getWarehouseId(), detail.getLocationId(), detail.getAreaId(), - // detail.getBatchId(), detail.getQuantity(), null, null, null); - } + // 2. 遍历所有明细,创建库存事务(扣减库存 + 记录流水) + createTransactionList(returnVendor); - // 更新退货单状态 + // 3. 更新退货单状态 returnVendorMapper.updateById(new MesWmReturnVendorDO() .setId(id).setStatus(MesWmReturnVendorStatusEnum.FINISHED.getStatus())); } + private void createTransactionList(MesWmReturnVendorDO returnVendor) { + List details = returnVendorDetailService.getReturnVendorDetailListByReturnId(returnVendor.getId()); + wmTransactionService.createTransactionList(convertList(details, detail -> new MesWmTransactionSaveReqDTO() + .setType(MesWmTransactionTypeEnum.OUT.getType()).setItemId(detail.getItemId()) + .setQuantity(detail.getQuantity().negate()) // 出库数量为负数 + .setBatchId(detail.getBatchId()).setBatchCode(detail.getBatchCode()) + .setWarehouseId(detail.getWarehouseId()).setLocationId(detail.getLocationId()).setAreaId(detail.getAreaId()) + .setVendorId(returnVendor.getVendorId()) + .setBizType(MesBizTypeConstants.WM_RETURN_VENDOR).setBizId(returnVendor.getId()) + .setBizCode(returnVendor.getCode()).setBizLineId(detail.getLineId()))); + } + @Override @Transactional(rollbackFor = Exception.class) public void cancelReturnVendor(Long id) { -- libgit2 0.21.4