Commit b8d340c753e50340e6dcd8e68129d421304aea8b

Authored by YunaiV
1 parent 3320fa80

✨ feat(select): 增加批次和仓库过滤功能,优化库存选择器

yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/line/MesWmPackageLineSaveReqVO.java
... ... @@ -36,10 +36,10 @@ public class MesWmPackageLineSaveReqVO {
36 36 @DecimalMin(value = "0.01", message = "装箱数量必须大于 0")
37 37 private BigDecimal quantity;
38 38  
39   - @Schema(description = "生产工单 ID", example = "1")
  39 + @Schema(description = "生产工单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  40 + @NotNull(message = "生产工单不能为空")
40 41 private Long workOrderId;
41 42  
42   - // DONE @AI:时间都是 LocalDateTIme;
43 43 @Schema(description = "有效期")
44 44 private LocalDateTime expireDate;
45 45  
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
... ... @@ -53,6 +53,8 @@ public interface ErrorCodeConstants {
53 53 ErrorCode WM_BATCH_QUALITY_STATUS_REQUIRED = new ErrorCode(1_040_717_013, "批次配置要求质量状态不能为空");
54 54 ErrorCode WM_BATCH_NOT_EXISTS = new ErrorCode(1_040_717_014, "批次不存在");
55 55 ErrorCode WM_BATCH_ITEM_MISMATCH = new ErrorCode(1_040_717_015, "批次不属于当前物料");
  56 + ErrorCode WM_BATCH_CLIENT_MISMATCH = new ErrorCode(1_040_717_016, "批次不属于当前客户");
  57 + ErrorCode WM_BATCH_VENDOR_MISMATCH = new ErrorCode(1_040_717_017, "批次不属于当前供应商");
56 58  
57 59 // ========== MES 基础数据-客户(1-040-103-000) ==========
58 60 ErrorCode MD_CLIENT_NOT_EXISTS = new ErrorCode(1_040_103_000, "客户不存在");
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchService.java
... ... @@ -77,4 +77,15 @@ public interface MesWmBatchService {
77 77 */
78 78 MesWmBatchDO validateBatchExists(Long batchId, Long itemId);
79 79  
  80 + /**
  81 + * 校验批次存在,并校验批次与物料、客户/供应商的归属关系
  82 + *
  83 + * @param batchId 批次ID
  84 + * @param itemId 物料ID
  85 + * @param clientId 客户ID(可选,不为空时校验)
  86 + * @param vendorId 供应商ID(可选,不为空时校验)
  87 + * @return 批次记录
  88 + */
  89 + MesWmBatchDO validateBatchExists(Long batchId, Long itemId, Long clientId, Long vendorId);
  90 +
80 91 }
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java
... ... @@ -248,4 +248,16 @@ public class MesWmBatchServiceImpl implements MesWmBatchService {
248 248 return batch;
249 249 }
250 250  
  251 + @Override
  252 + public MesWmBatchDO validateBatchExists(Long batchId, Long itemId, Long clientId, Long vendorId) {
  253 + MesWmBatchDO batch = validateBatchExists(batchId, itemId);
  254 + if (clientId != null && ObjUtil.notEqual(batch.getClientId(), clientId)) {
  255 + throw exception(WM_BATCH_CLIENT_MISMATCH);
  256 + }
  257 + if (vendorId != null && ObjUtil.notEqual(batch.getVendorId(), vendorId)) {
  258 + throw exception(WM_BATCH_VENDOR_MISMATCH);
  259 + }
  260 + return batch;
  261 + }
  262 +
251 263 }
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineServiceImpl.java
... ... @@ -102,9 +102,7 @@ public class MesWmPackageLineServiceImpl implements MesWmPackageLineService {
102 102 // 校验产品物料存在
103 103 itemService.validateItemExists(reqVO.getItemId());
104 104 // 校验工单已确认
105   - if (reqVO.getWorkOrderId() != null) {
106   - workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId());
107   - }
  105 + workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId());
108 106 }
109 107  
110 108 private MesWmPackageLineDO validatePackageLineExists(Long id) {
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java
... ... @@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWm
8 8 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLineSaveReqVO;
9 9 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
10 10 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO;
  11 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDO;
11 12 import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesLineMapper;
12 13 import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
13 14 import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum;
... ... @@ -81,7 +82,7 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ
81 82 // 校验退货单存在 + 草稿状态
82 83 returnSalesService.validateReturnSalesExistsAndPrepare(reqVO.getReturnId());
83 84 // 校验物料存在 + 批次管理
84   - validateItemBatchManagement(reqVO.getItemId(), reqVO.getBatchId());
  85 + validateItemBatchManagement(reqVO.getReturnId(), reqVO.getItemId(), reqVO.getBatchId());
85 86 }
86 87  
87 88 @Override
... ... @@ -147,18 +148,21 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ
147 148 /**
148 149 * 校验物料批次管理
149 150 *
150   - * @param itemId 物料ID
151   - * @param batchId 批次ID
  151 + * @param returnId 退货单ID
  152 + * @param itemId 物料ID
  153 + * @param batchId 批次ID
152 154 */
153   - private void validateItemBatchManagement(Long itemId, Long batchId) {
  155 + private void validateItemBatchManagement(Long returnId, Long itemId, Long batchId) {
154 156 MesMdItemDO item = itemService.validateItemExists(itemId);
155 157 // 如果物料启用了批次管理,则必须选择批次
156 158 if (Boolean.TRUE.equals(item.getBatchFlag()) && batchId == null) {
157 159 throw exception(MD_ITEM_BATCH_REQUIRED);
158 160 }
159   - // 校验批次存在且属于当前物料
  161 + // 校验批次存在且属于当前物料和客户
160 162 if (batchId != null) {
161   - batchService.validateBatchExists(batchId, itemId);
  163 + // 从父单获取客户ID,校验批次归属
  164 + MesWmReturnSalesDO returnSales = returnSalesService.validateReturnSalesExistsAndPrepare(returnId);
  165 + batchService.validateBatchExists(batchId, itemId, returnSales.getClientId(), null);
162 166 }
163 167 }
164 168  
... ...
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineServiceImpl.java
... ... @@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 5 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesWmReturnVendorLinePageReqVO;
6 6 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesWmReturnVendorLineSaveReqVO;
7 7 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO;
  8 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDO;
8 9 import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorLineMapper;
9 10 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
10 11 import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
... ... @@ -108,12 +109,12 @@ public class MesWmReturnVendorLineServiceImpl implements MesWmReturnVendorLineSe
108 109  
109 110 private void validateReturnVendorLineSaveData(MesWmReturnVendorLineSaveReqVO reqVO) {
110 111 // 校验父数据存在且为草稿状态
111   - returnVendorService.validateReturnVendorExistsAndPrepare(reqVO.getReturnId());
  112 + MesWmReturnVendorDO returnVendor = returnVendorService.validateReturnVendorExistsAndPrepare(reqVO.getReturnId());
112 113 // 校验物料存在
113 114 itemService.validateItemExists(reqVO.getItemId());
114   - // 校验批次存在且属于当前物料
  115 + // 校验批次存在且属于当前物料和供应商
115 116 if (reqVO.getBatchId() != null) {
116   - batchService.validateBatchExists(reqVO.getBatchId(), reqVO.getItemId());
  117 + batchService.validateBatchExists(reqVO.getBatchId(), reqVO.getItemId(), null, returnVendor.getVendorId());
117 118 }
118 119 }
119 120  
... ...