Commit e7ee268a76aeb583ee1646f7a503b72b343d831a

Authored by YunaiV
1 parent b660fe45

✨ feat(mes): 添加库存事务关联错误码

新增错误码 WM_TRANSACTION_RELATED_NOT_EXISTS,用于处理关联库存事务不存在的情况。
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
@@ -363,6 +363,7 @@ public interface ErrorCodeConstants { @@ -363,6 +363,7 @@ public interface ErrorCodeConstants {
363 ErrorCode WM_TRANSACTION_BATCH_REQUIRED = new ErrorCode(1_040_703_007, "当前物料启用了批次管理,批次号不能为空"); 363 ErrorCode WM_TRANSACTION_BATCH_REQUIRED = new ErrorCode(1_040_703_007, "当前物料启用了批次管理,批次号不能为空");
364 ErrorCode WM_MATERIAL_STOCK_AREA_ITEM_MIXING_NOT_ALLOWED = new ErrorCode(1_040_703_008, "库位({})不允许物料混放,请选择其他库位"); 364 ErrorCode WM_MATERIAL_STOCK_AREA_ITEM_MIXING_NOT_ALLOWED = new ErrorCode(1_040_703_008, "库位({})不允许物料混放,请选择其他库位");
365 ErrorCode WM_MATERIAL_STOCK_AREA_BATCH_MIXING_NOT_ALLOWED = new ErrorCode(1_040_703_009, "库位({})不允许批次混放,请选择其他库位"); 365 ErrorCode WM_MATERIAL_STOCK_AREA_BATCH_MIXING_NOT_ALLOWED = new ErrorCode(1_040_703_009, "库位({})不允许批次混放,请选择其他库位");
  366 + ErrorCode WM_TRANSACTION_RELATED_NOT_EXISTS = new ErrorCode(1_040_703_010, "关联的库存事务不存在");
366 367
367 // ========== MES 仓库管理-到货通知单(1-040-704-000) ========== 368 // ========== MES 仓库管理-到货通知单(1-040-704-000) ==========
368 ErrorCode WM_ARRIVAL_NOTICE_NOT_EXISTS = new ErrorCode(1_040_704_000, "到货通知单不存在"); 369 ErrorCode WM_ARRIVAL_NOTICE_NOT_EXISTS = new ErrorCode(1_040_704_000, "到货通知单不存在");
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productionissue/MesWmProductionIssueServiceImpl.java
@@ -19,6 +19,12 @@ import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationServic @@ -19,6 +19,12 @@ import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationServic
19 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; 19 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
20 import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; 20 import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService;
21 import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; 21 import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO;
  22 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
  23 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
  24 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService;
  25 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
  26 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
  27 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
22 import jakarta.annotation.Resource; 28 import jakarta.annotation.Resource;
23 import org.springframework.stereotype.Service; 29 import org.springframework.stereotype.Service;
24 import org.springframework.transaction.annotation.Transactional; 30 import org.springframework.transaction.annotation.Transactional;
@@ -28,7 +34,6 @@ import java.math.BigDecimal; @@ -28,7 +34,6 @@ import java.math.BigDecimal;
28 import java.util.List; 34 import java.util.List;
29 35
30 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 36 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
31 -import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;  
32 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; 37 import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
33 38
34 /** 39 /**
@@ -51,6 +56,12 @@ public class MesWmProductionIssueServiceImpl implements MesWmProductionIssueServ @@ -51,6 +56,12 @@ public class MesWmProductionIssueServiceImpl implements MesWmProductionIssueServ
51 private MesProWorkOrderService workOrderService; 56 private MesProWorkOrderService workOrderService;
52 @Resource 57 @Resource
53 private MesWmTransactionService wmTransactionService; 58 private MesWmTransactionService wmTransactionService;
  59 + @Resource
  60 + private MesWmWarehouseService warehouseService;
  61 + @Resource
  62 + private MesWmWarehouseLocationService locationService;
  63 + @Resource
  64 + private MesWmWarehouseAreaService areaService;
54 65
55 @Override 66 @Override
56 @Transactional(rollbackFor = Exception.class) 67 @Transactional(rollbackFor = Exception.class)
@@ -155,14 +166,32 @@ public class MesWmProductionIssueServiceImpl implements MesWmProductionIssueServ @@ -155,14 +166,32 @@ public class MesWmProductionIssueServiceImpl implements MesWmProductionIssueServ
155 } 166 }
156 167
157 private void createTransactionList(MesWmProductionIssueDO issue) { 168 private void createTransactionList(MesWmProductionIssueDO issue) {
  169 + // 1. 查询虚拟线边库
  170 + MesWmWarehouseDO virtualWarehouse = warehouseService.getWarehouseByCode(MesWmWarehouseDO.WIP_VIRTUAL_WAREHOUSE);
  171 + MesWmWarehouseLocationDO virtualLocation = locationService.getWarehouseLocationByCode(MesWmWarehouseLocationDO.WIP_VIRTUAL_LOCATION);
  172 + MesWmWarehouseAreaDO virtualArea = areaService.getWarehouseAreaByCode(MesWmWarehouseAreaDO.WIP_VIRTUAL_AREA);
  173 +
  174 + // 2. 遍历明细,每条明细产生 OUT(实际仓库扣减)+ IN(虚拟线边库增加)
158 List<MesWmProductionIssueDetailDO> details = issueDetailService.getProductionIssueDetailListByIssueId(issue.getId()); 175 List<MesWmProductionIssueDetailDO> details = issueDetailService.getProductionIssueDetailListByIssueId(issue.getId());
159 - wmTransactionService.createTransactionList(convertList(details, detail -> new MesWmTransactionSaveReqDTO()  
160 - .setType(MesWmTransactionTypeEnum.OUT.getType()).setItemId(detail.getItemId())  
161 - .setQuantity(detail.getQuantity().negate()) // 出库数量为负数  
162 - .setBatchId(detail.getBatchId()).setBatchCode(detail.getBatchCode())  
163 - .setWarehouseId(detail.getWarehouseId()).setLocationId(detail.getLocationId()).setAreaId(detail.getAreaId())  
164 - .setBizType(MesBizTypeConstants.WM_ISSUE).setBizId(issue.getId())  
165 - .setBizCode(issue.getCode()).setBizLineId(detail.getLineId()))); 176 + for (MesWmProductionIssueDetailDO detail : details) {
  177 + // 2.1 先从实际仓库出库(库存减少)
  178 + Long outTransactionId = wmTransactionService.createTransaction(new MesWmTransactionSaveReqDTO()
  179 + .setType(MesWmTransactionTypeEnum.OUT.getType()).setItemId(detail.getItemId())
  180 + .setQuantity(detail.getQuantity().negate()) // 库存减少
  181 + .setBatchId(detail.getBatchId()).setBatchCode(detail.getBatchCode())
  182 + .setWarehouseId(detail.getWarehouseId()).setLocationId(detail.getLocationId()).setAreaId(detail.getAreaId())
  183 + .setBizType(MesBizTypeConstants.WM_ISSUE).setBizId(issue.getId())
  184 + .setBizCode(issue.getCode()).setBizLineId(detail.getLineId()));
  185 + // 2.2 再入虚拟线边库(库存增加)
  186 + wmTransactionService.createTransaction(new MesWmTransactionSaveReqDTO()
  187 + .setType(MesWmTransactionTypeEnum.IN.getType()).setItemId(detail.getItemId())
  188 + .setQuantity(detail.getQuantity()) // 库存增加
  189 + .setBatchId(detail.getBatchId()).setBatchCode(detail.getBatchCode())
  190 + .setWarehouseId(virtualWarehouse.getId()).setLocationId(virtualLocation.getId()).setAreaId(virtualArea.getId())
  191 + .setBizType(MesBizTypeConstants.WM_ISSUE).setBizId(issue.getId())
  192 + .setBizCode(issue.getCode()).setBizLineId(detail.getLineId())
  193 + .setRelatedTransactionId(outTransactionId)); // 关联出库事务
  194 + }
166 } 195 }
167 196
168 @Override 197 @Override