Commit deb6cac081fd2e6b2ad459e5b3050b5fa4042144

Authored by YunaiV
1 parent b759c474

✨ feat(mes): 增强产品入库单功能,新增数量校验和明细检查

新增上架数量的正数校验,确保入库单的数量大于0。同时,增加了收货单明细为空的错误提示,提升数据完整性和用户体验。
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productreceipt/vo/detail/MesWmProductReceiptDetailSaveReqVO.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.controller.admin.wm.productreceipt.vo.detail @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.controller.admin.wm.productreceipt.vo.detail
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import jakarta.validation.constraints.NotNull; 4 import jakarta.validation.constraints.NotNull;
  5 +import jakarta.validation.constraints.Positive;
5 import lombok.Data; 6 import lombok.Data;
6 7
7 import java.math.BigDecimal; 8 import java.math.BigDecimal;
@@ -27,6 +28,7 @@ public class MesWmProductReceiptDetailSaveReqVO { @@ -27,6 +28,7 @@ public class MesWmProductReceiptDetailSaveReqVO {
27 28
28 @Schema(description = "上架数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") 29 @Schema(description = "上架数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00")
29 @NotNull(message = "上架数量不能为空") 30 @NotNull(message = "上架数量不能为空")
  31 + @Positive(message = "上架数量必须大于 0")
30 private BigDecimal quantity; 32 private BigDecimal quantity;
31 33
32 @Schema(description = "批次编号", example = "1") 34 @Schema(description = "批次编号", example = "1")
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
@@ -491,6 +491,7 @@ public interface ErrorCodeConstants { @@ -491,6 +491,7 @@ public interface ErrorCodeConstants {
491 ErrorCode WM_PRODUCT_RECPT_DETAIL_QUANTITY_MISMATCH = new ErrorCode(1_040_712_004, "明细上架总数与行收货数量不匹配"); 491 ErrorCode WM_PRODUCT_RECPT_DETAIL_QUANTITY_MISMATCH = new ErrorCode(1_040_712_004, "明细上架总数与行收货数量不匹配");
492 ErrorCode WM_PRODUCT_RECPT_STATUS_ERROR = new ErrorCode(1_040_712_005, "收货单状态不正确"); 492 ErrorCode WM_PRODUCT_RECPT_STATUS_ERROR = new ErrorCode(1_040_712_005, "收货单状态不正确");
493 ErrorCode WM_PRODUCT_RECPT_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_712_006, "已完成或已取消的收货单不允许取消"); 493 ErrorCode WM_PRODUCT_RECPT_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_712_006, "已完成或已取消的收货单不允许取消");
  494 + ErrorCode WM_PRODUCT_RECPT_NO_DETAIL = new ErrorCode(1_040_712_007, "收货单没有上架明细,无法执行入库");
494 ErrorCode WM_PRODUCT_RECPT_LINE_NOT_EXISTS = new ErrorCode(1_040_712_100, "产品收货单行不存在"); 495 ErrorCode WM_PRODUCT_RECPT_LINE_NOT_EXISTS = new ErrorCode(1_040_712_100, "产品收货单行不存在");
495 ErrorCode WM_PRODUCT_RECPT_DETAIL_NOT_EXISTS = new ErrorCode(1_040_712_200, "产品收货明细不存在"); 496 ErrorCode WM_PRODUCT_RECPT_DETAIL_NOT_EXISTS = new ErrorCode(1_040_712_200, "产品收货明细不存在");
496 497
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptDetailServiceImpl.java
@@ -34,12 +34,10 @@ public class MesWmProductReceiptDetailServiceImpl implements MesWmProductReceipt @@ -34,12 +34,10 @@ public class MesWmProductReceiptDetailServiceImpl implements MesWmProductReceipt
34 34
35 @Override 35 @Override
36 public Long createProductReceiptDetail(MesWmProductReceiptDetailSaveReqVO createReqVO) { 36 public Long createProductReceiptDetail(MesWmProductReceiptDetailSaveReqVO createReqVO) {
37 - // 校验父单据存在且为可编辑状态  
38 - productReceiptService.validateProductReceiptEditable(createReqVO.getReceiptId());  
39 - // 校验库区关系  
40 - warehouseAreaService.validateWarehouseAreaExists(  
41 - createReqVO.getWarehouseId(), createReqVO.getLocationId(), createReqVO.getAreaId()); 37 + // 1. 校验关联数据
  38 + validateProductReceiptDetailSaveData(createReqVO);
42 39
  40 + // 2. 新增
43 MesWmProductReceiptDetailDO detail = BeanUtils.toBean(createReqVO, MesWmProductReceiptDetailDO.class); 41 MesWmProductReceiptDetailDO detail = BeanUtils.toBean(createReqVO, MesWmProductReceiptDetailDO.class);
44 productReceiptDetailMapper.insert(detail); 42 productReceiptDetailMapper.insert(detail);
45 return detail.getId(); 43 return detail.getId();
@@ -47,15 +45,13 @@ public class MesWmProductReceiptDetailServiceImpl implements MesWmProductReceipt @@ -47,15 +45,13 @@ public class MesWmProductReceiptDetailServiceImpl implements MesWmProductReceipt
47 45
48 @Override 46 @Override
49 public void updateProductReceiptDetail(MesWmProductReceiptDetailSaveReqVO updateReqVO) { 47 public void updateProductReceiptDetail(MesWmProductReceiptDetailSaveReqVO updateReqVO) {
50 - // 校验存在 48 + // 1.1 校验存在
51 MesWmProductReceiptDetailDO detail = validateProductReceiptDetailExists(updateReqVO.getId()); 49 MesWmProductReceiptDetailDO detail = validateProductReceiptDetailExists(updateReqVO.getId());
52 - // 校验父单据存在且为可编辑状态  
53 - productReceiptService.validateProductReceiptEditable(detail.getReceiptId());  
54 - // 校验库区关系  
55 - warehouseAreaService.validateWarehouseAreaExists(  
56 - updateReqVO.getWarehouseId(), updateReqVO.getLocationId(), updateReqVO.getAreaId()); 50 + // 1.2 校验关联数据
  51 + updateReqVO.setReceiptId(detail.getReceiptId());
  52 + validateProductReceiptDetailSaveData(updateReqVO);
57 53
58 - // 更新 54 + // 2. 更新
59 MesWmProductReceiptDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductReceiptDetailDO.class); 55 MesWmProductReceiptDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductReceiptDetailDO.class);
60 productReceiptDetailMapper.updateById(updateObj); 56 productReceiptDetailMapper.updateById(updateObj);
61 } 57 }
@@ -63,7 +59,10 @@ public class MesWmProductReceiptDetailServiceImpl implements MesWmProductReceipt @@ -63,7 +59,10 @@ public class MesWmProductReceiptDetailServiceImpl implements MesWmProductReceipt
63 @Override 59 @Override
64 public void deleteProductReceiptDetail(Long id) { 60 public void deleteProductReceiptDetail(Long id) {
65 // 校验存在 61 // 校验存在
66 - validateProductReceiptDetailExists(id); 62 + MesWmProductReceiptDetailDO detail = validateProductReceiptDetailExists(id);
  63 + // 校验父单据存在且为可编辑状态
  64 + productReceiptService.validateProductReceiptEditable(detail.getReceiptId());
  65 +
67 // 删除 66 // 删除
68 productReceiptDetailMapper.deleteById(id); 67 productReceiptDetailMapper.deleteById(id);
69 } 68 }
@@ -101,4 +100,15 @@ public class MesWmProductReceiptDetailServiceImpl implements MesWmProductReceipt @@ -101,4 +100,15 @@ public class MesWmProductReceiptDetailServiceImpl implements MesWmProductReceipt
101 return detail; 100 return detail;
102 } 101 }
103 102
  103 + /**
  104 + * 校验明细保存时的关联数据
  105 + */
  106 + private void validateProductReceiptDetailSaveData(MesWmProductReceiptDetailSaveReqVO reqVO) {
  107 + // 校验父单据存在且为可编辑状态
  108 + productReceiptService.validateProductReceiptEditable(reqVO.getReceiptId());
  109 + // 校验仓库层级关系
  110 + warehouseAreaService.validateWarehouseAreaExists(
  111 + reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId());
  112 + }
  113 +
104 } 114 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptLineServiceImpl.java
@@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.productreceipt.vo.line.Me @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.productreceipt.vo.line.Me
6 import cn.iocoder.yudao.module.mes.controller.admin.wm.productreceipt.vo.line.MesWmProductReceiptLineSaveReqVO; 6 import cn.iocoder.yudao.module.mes.controller.admin.wm.productreceipt.vo.line.MesWmProductReceiptLineSaveReqVO;
7 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productreceipt.MesWmProductReceiptLineDO; 7 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productreceipt.MesWmProductReceiptLineDO;
8 import cn.iocoder.yudao.module.mes.dal.mysql.wm.productreceipt.MesWmProductReceiptLineMapper; 8 import cn.iocoder.yudao.module.mes.dal.mysql.wm.productreceipt.MesWmProductReceiptLineMapper;
  9 +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
9 import jakarta.annotation.Resource; 10 import jakarta.annotation.Resource;
10 import org.springframework.context.annotation.Lazy; 11 import org.springframework.context.annotation.Lazy;
11 import org.springframework.stereotype.Service; 12 import org.springframework.stereotype.Service;
@@ -34,12 +35,15 @@ public class MesWmProductReceiptLineServiceImpl implements MesWmProductReceiptLi @@ -34,12 +35,15 @@ public class MesWmProductReceiptLineServiceImpl implements MesWmProductReceiptLi
34 @Resource 35 @Resource
35 private MesWmProductReceiptDetailService productReceiptDetailService; 36 private MesWmProductReceiptDetailService productReceiptDetailService;
36 37
  38 + @Resource
  39 + private MesMdItemService itemService;
  40 +
37 @Override 41 @Override
38 public Long createProductReceiptLine(MesWmProductReceiptLineSaveReqVO createReqVO) { 42 public Long createProductReceiptLine(MesWmProductReceiptLineSaveReqVO createReqVO) {
39 - // 校验父单据存在且为可编辑状态  
40 - productReceiptService.validateProductReceiptEditable(createReqVO.getReceiptId()); 43 + // 1. 校验关联数据
  44 + validateProductReceiptLineSaveData(createReqVO);
41 45
42 - // 新增 46 + // 2. 新增
43 MesWmProductReceiptLineDO line = BeanUtils.toBean(createReqVO, MesWmProductReceiptLineDO.class); 47 MesWmProductReceiptLineDO line = BeanUtils.toBean(createReqVO, MesWmProductReceiptLineDO.class);
44 productReceiptLineMapper.insert(line); 48 productReceiptLineMapper.insert(line);
45 return line.getId(); 49 return line.getId();
@@ -47,12 +51,13 @@ public class MesWmProductReceiptLineServiceImpl implements MesWmProductReceiptLi @@ -47,12 +51,13 @@ public class MesWmProductReceiptLineServiceImpl implements MesWmProductReceiptLi
47 51
48 @Override 52 @Override
49 public void updateProductReceiptLine(MesWmProductReceiptLineSaveReqVO updateReqVO) { 53 public void updateProductReceiptLine(MesWmProductReceiptLineSaveReqVO updateReqVO) {
50 - // 校验存在 54 + // 1.1 校验存在
51 MesWmProductReceiptLineDO line = validateProductReceiptLineExists(updateReqVO.getId()); 55 MesWmProductReceiptLineDO line = validateProductReceiptLineExists(updateReqVO.getId());
52 - // 校验父单据存在且为可编辑状态  
53 - productReceiptService.validateProductReceiptEditable(line.getReceiptId()); 56 + // 1.2 校验关联数据
  57 + updateReqVO.setReceiptId(line.getReceiptId());
  58 + validateProductReceiptLineSaveData(updateReqVO);
54 59
55 - // 更新 60 + // 2. 更新
56 MesWmProductReceiptLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductReceiptLineDO.class); 61 MesWmProductReceiptLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductReceiptLineDO.class);
57 productReceiptLineMapper.updateById(updateObj); 62 productReceiptLineMapper.updateById(updateObj);
58 } 63 }
@@ -61,7 +66,9 @@ public class MesWmProductReceiptLineServiceImpl implements MesWmProductReceiptLi @@ -61,7 +66,9 @@ public class MesWmProductReceiptLineServiceImpl implements MesWmProductReceiptLi
61 @Transactional(rollbackFor = Exception.class) 66 @Transactional(rollbackFor = Exception.class)
62 public void deleteProductReceiptLine(Long id) { 67 public void deleteProductReceiptLine(Long id) {
63 // 校验存在 68 // 校验存在
64 - validateProductReceiptLineExists(id); 69 + MesWmProductReceiptLineDO line = validateProductReceiptLineExists(id);
  70 + // 校验父单据存在且为可编辑状态
  71 + productReceiptService.validateProductReceiptEditable(line.getReceiptId());
65 72
66 // 级联删除明细 73 // 级联删除明细
67 productReceiptDetailService.deleteProductReceiptDetailByLineId(id); 74 productReceiptDetailService.deleteProductReceiptDetailByLineId(id);
@@ -97,4 +104,14 @@ public class MesWmProductReceiptLineServiceImpl implements MesWmProductReceiptLi @@ -97,4 +104,14 @@ public class MesWmProductReceiptLineServiceImpl implements MesWmProductReceiptLi
97 return line; 104 return line;
98 } 105 }
99 106
  107 + /**
  108 + * 校验行保存时的关联数据
  109 + */
  110 + private void validateProductReceiptLineSaveData(MesWmProductReceiptLineSaveReqVO reqVO) {
  111 + // 校验父单据存在且为可编辑状态
  112 + productReceiptService.validateProductReceiptEditable(reqVO.getReceiptId());
  113 + // 校验物料存在
  114 + itemService.validateItemExists(reqVO.getItemId());
  115 + }
  116 +
100 } 117 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productreceipt/MesWmProductReceiptServiceImpl.java
@@ -12,15 +12,14 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderD @@ -12,15 +12,14 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderD
12 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productreceipt.MesWmProductReceiptDO; 12 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productreceipt.MesWmProductReceiptDO;
13 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productreceipt.MesWmProductReceiptDetailDO; 13 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productreceipt.MesWmProductReceiptDetailDO;
14 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productreceipt.MesWmProductReceiptLineDO; 14 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productreceipt.MesWmProductReceiptLineDO;
15 -import cn.iocoder.yudao.module.mes.dal.mysql.wm.productreceipt.MesWmProductReceiptMapper;  
16 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; 15 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
17 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; 16 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
18 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; 17 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
19 -import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductReceiptStatusEnum; 18 +import cn.iocoder.yudao.module.mes.dal.mysql.wm.productreceipt.MesWmProductReceiptMapper;
20 import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; 19 import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants;
  20 +import cn.iocoder.yudao.module.mes.enums.wm.MesWmProductReceiptStatusEnum;
21 import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; 21 import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum;
22 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; 22 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
23 -import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService;  
24 import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; 23 import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService;
25 import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; 24 import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO;
26 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; 25 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
@@ -54,9 +53,6 @@ public class MesWmProductReceiptServiceImpl implements MesWmProductReceiptServic @@ -54,9 +53,6 @@ public class MesWmProductReceiptServiceImpl implements MesWmProductReceiptServic
54 private MesWmProductReceiptDetailService productReceiptDetailService; 53 private MesWmProductReceiptDetailService productReceiptDetailService;
55 54
56 @Resource 55 @Resource
57 - private MesWmMaterialStockService materialStockService;  
58 -  
59 - @Resource  
60 private MesWmTransactionService wmTransactionService; 56 private MesWmTransactionService wmTransactionService;
61 57
62 @Resource 58 @Resource
@@ -70,13 +66,10 @@ public class MesWmProductReceiptServiceImpl implements MesWmProductReceiptServic @@ -70,13 +66,10 @@ public class MesWmProductReceiptServiceImpl implements MesWmProductReceiptServic
70 66
71 @Override 67 @Override
72 public Long createProductReceipt(MesWmProductReceiptSaveReqVO createReqVO) { 68 public Long createProductReceipt(MesWmProductReceiptSaveReqVO createReqVO) {
73 - // 校验编码唯一  
74 - validateCodeUnique(null, createReqVO.getCode());  
75 - // 校验工单存在并设置 itemId  
76 - MesProWorkOrderDO workOrder = createReqVO.getWorkOrderId() != null ?  
77 - workOrderService.validateWorkOrderExists(createReqVO.getWorkOrderId()) : null; 69 + // 1. 校验关联数据
  70 + MesProWorkOrderDO workOrder = validateProductReceiptSaveData(createReqVO);
78 71
79 - // 插入 72 + // 2. 插入
80 MesWmProductReceiptDO receipt = BeanUtils.toBean(createReqVO, MesWmProductReceiptDO.class); 73 MesWmProductReceiptDO receipt = BeanUtils.toBean(createReqVO, MesWmProductReceiptDO.class);
81 if (workOrder != null) { 74 if (workOrder != null) {
82 receipt.setItemId(workOrder.getProductId()); 75 receipt.setItemId(workOrder.getProductId());
@@ -88,15 +81,12 @@ public class MesWmProductReceiptServiceImpl implements MesWmProductReceiptServic @@ -88,15 +81,12 @@ public class MesWmProductReceiptServiceImpl implements MesWmProductReceiptServic
88 81
89 @Override 82 @Override
90 public void updateProductReceipt(MesWmProductReceiptSaveReqVO updateReqVO) { 83 public void updateProductReceipt(MesWmProductReceiptSaveReqVO updateReqVO) {
91 - // 校验存在 + 草稿状态 84 + // 1.1 校验存在 + 草稿状态
92 validateProductReceiptExistsAndDraft(updateReqVO.getId()); 85 validateProductReceiptExistsAndDraft(updateReqVO.getId());
93 - // 校验编码唯一  
94 - validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode());  
95 - // 校验工单存在  
96 - MesProWorkOrderDO workOrder = updateReqVO.getWorkOrderId() != null ?  
97 - workOrderService.validateWorkOrderExists(updateReqVO.getWorkOrderId()) : null; 86 + // 1.2 校验关联数据
  87 + MesProWorkOrderDO workOrder = validateProductReceiptSaveData(updateReqVO);
98 88
99 - // 更新 89 + // 2. 更新
100 MesWmProductReceiptDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductReceiptDO.class); 90 MesWmProductReceiptDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductReceiptDO.class);
101 if (workOrder != null) { 91 if (workOrder != null) {
102 updateObj.setItemId(workOrder.getProductId()); 92 updateObj.setItemId(workOrder.getProductId());
@@ -179,23 +169,27 @@ public class MesWmProductReceiptServiceImpl implements MesWmProductReceiptServic @@ -179,23 +169,27 @@ public class MesWmProductReceiptServiceImpl implements MesWmProductReceiptServic
179 if (ObjUtil.notEqual(MesWmProductReceiptStatusEnum.APPROVED.getStatus(), receipt.getStatus())) { 169 if (ObjUtil.notEqual(MesWmProductReceiptStatusEnum.APPROVED.getStatus(), receipt.getStatus())) {
180 throw exception(WM_PRODUCT_RECPT_STATUS_ERROR); 170 throw exception(WM_PRODUCT_RECPT_STATUS_ERROR);
181 } 171 }
  172 + // 校验明细非空
  173 + List<MesWmProductReceiptDetailDO> details = productReceiptDetailService.getProductReceiptDetailListByRecptId(id);
  174 + if (CollUtil.isEmpty(details)) {
  175 + throw exception(WM_PRODUCT_RECPT_NO_DETAIL);
  176 + }
182 177
183 // 创建库存事务 178 // 创建库存事务
184 - createTransactionList(receipt); 179 + createTransactionList(receipt, details);
185 180
186 // 更新收货单状态 181 // 更新收货单状态
187 productReceiptMapper.updateById(new MesWmProductReceiptDO() 182 productReceiptMapper.updateById(new MesWmProductReceiptDO()
188 .setId(id).setStatus(MesWmProductReceiptStatusEnum.FINISHED.getStatus())); 183 .setId(id).setStatus(MesWmProductReceiptStatusEnum.FINISHED.getStatus()));
189 } 184 }
190 185
191 - private void createTransactionList(MesWmProductReceiptDO receipt) { 186 + private void createTransactionList(MesWmProductReceiptDO receipt, List<MesWmProductReceiptDetailDO> details) {
192 // 1. 查询虚拟线边库 187 // 1. 查询虚拟线边库
193 MesWmWarehouseDO virtualWarehouse = warehouseService.getWarehouseByCode(MesWmWarehouseDO.WIP_VIRTUAL_WAREHOUSE); 188 MesWmWarehouseDO virtualWarehouse = warehouseService.getWarehouseByCode(MesWmWarehouseDO.WIP_VIRTUAL_WAREHOUSE);
194 MesWmWarehouseLocationDO virtualLocation = locationService.getWarehouseLocationByCode(MesWmWarehouseLocationDO.WIP_VIRTUAL_LOCATION); 189 MesWmWarehouseLocationDO virtualLocation = locationService.getWarehouseLocationByCode(MesWmWarehouseLocationDO.WIP_VIRTUAL_LOCATION);
195 MesWmWarehouseAreaDO virtualArea = areaService.getWarehouseAreaByCode(MesWmWarehouseAreaDO.WIP_VIRTUAL_AREA); 190 MesWmWarehouseAreaDO virtualArea = areaService.getWarehouseAreaByCode(MesWmWarehouseAreaDO.WIP_VIRTUAL_AREA);
196 191
197 // 2. 遍历明细,每条明细产生 OUT(虚拟线边库扣减)+ IN(实际仓库增加) 192 // 2. 遍历明细,每条明细产生 OUT(虚拟线边库扣减)+ IN(实际仓库增加)
198 - List<MesWmProductReceiptDetailDO> details = productReceiptDetailService.getProductReceiptDetailListByRecptId(receipt.getId());  
199 for (MesWmProductReceiptDetailDO detail : details) { 193 for (MesWmProductReceiptDetailDO detail : details) {
200 // 2.1 先从虚拟线边库出库(库存减少) 194 // 2.1 先从虚拟线边库出库(库存减少)
201 Long outTransactionId = wmTransactionService.createTransaction(new MesWmTransactionSaveReqDTO() 195 Long outTransactionId = wmTransactionService.createTransaction(new MesWmTransactionSaveReqDTO()
@@ -263,6 +257,18 @@ public class MesWmProductReceiptServiceImpl implements MesWmProductReceiptServic @@ -263,6 +257,18 @@ public class MesWmProductReceiptServiceImpl implements MesWmProductReceiptServic
263 } 257 }
264 return receipt; 258 return receipt;
265 } 259 }
  260 + /**
  261 + * 校验保存时的关联数据
  262 + *
  263 + * @return 工单对象(可能为 null)
  264 + */
  265 + private MesProWorkOrderDO validateProductReceiptSaveData(MesWmProductReceiptSaveReqVO reqVO) {
  266 + // 校验编码唯一
  267 + validateCodeUnique(reqVO.getId(), reqVO.getCode());
  268 + // 校验工单存在
  269 + return reqVO.getWorkOrderId() != null ?
  270 + workOrderService.validateWorkOrderExists(reqVO.getWorkOrderId()) : null;
  271 + }
266 272
267 private void validateCodeUnique(Long id, String code) { 273 private void validateCodeUnique(Long id, String code) {
268 MesWmProductReceiptDO receipt = productReceiptMapper.selectByCode(code); 274 MesWmProductReceiptDO receipt = productReceiptMapper.selectByCode(code);