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,10 +36,10 @@ public class MesWmPackageLineSaveReqVO {
36 @DecimalMin(value = "0.01", message = "装箱数量必须大于 0") 36 @DecimalMin(value = "0.01", message = "装箱数量必须大于 0")
37 private BigDecimal quantity; 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 private Long workOrderId; 41 private Long workOrderId;
41 42
42 - // DONE @AI:时间都是 LocalDateTIme;  
43 @Schema(description = "有效期") 43 @Schema(description = "有效期")
44 private LocalDateTime expireDate; 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,6 +53,8 @@ public interface ErrorCodeConstants {
53 ErrorCode WM_BATCH_QUALITY_STATUS_REQUIRED = new ErrorCode(1_040_717_013, "批次配置要求质量状态不能为空"); 53 ErrorCode WM_BATCH_QUALITY_STATUS_REQUIRED = new ErrorCode(1_040_717_013, "批次配置要求质量状态不能为空");
54 ErrorCode WM_BATCH_NOT_EXISTS = new ErrorCode(1_040_717_014, "批次不存在"); 54 ErrorCode WM_BATCH_NOT_EXISTS = new ErrorCode(1_040_717_014, "批次不存在");
55 ErrorCode WM_BATCH_ITEM_MISMATCH = new ErrorCode(1_040_717_015, "批次不属于当前物料"); 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 // ========== MES 基础数据-客户(1-040-103-000) ========== 59 // ========== MES 基础数据-客户(1-040-103-000) ==========
58 ErrorCode MD_CLIENT_NOT_EXISTS = new ErrorCode(1_040_103_000, "客户不存在"); 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,4 +77,15 @@ public interface MesWmBatchService {
77 */ 77 */
78 MesWmBatchDO validateBatchExists(Long batchId, Long itemId); 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,4 +248,16 @@ public class MesWmBatchServiceImpl implements MesWmBatchService {
248 return batch; 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,9 +102,7 @@ public class MesWmPackageLineServiceImpl implements MesWmPackageLineService {
102 // 校验产品物料存在 102 // 校验产品物料存在
103 itemService.validateItemExists(reqVO.getItemId()); 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 private MesWmPackageLineDO validatePackageLineExists(Long id) { 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,6 +8,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWm
8 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLineSaveReqVO; 8 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLineSaveReqVO;
9 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; 9 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
10 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO; 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 import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesLineMapper; 12 import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesLineMapper;
12 import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; 13 import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
13 import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum; 14 import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum;
@@ -81,7 +82,7 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ @@ -81,7 +82,7 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ
81 // 校验退货单存在 + 草稿状态 82 // 校验退货单存在 + 草稿状态
82 returnSalesService.validateReturnSalesExistsAndPrepare(reqVO.getReturnId()); 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 @Override 88 @Override
@@ -147,18 +148,21 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ @@ -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 MesMdItemDO item = itemService.validateItemExists(itemId); 156 MesMdItemDO item = itemService.validateItemExists(itemId);
155 // 如果物料启用了批次管理,则必须选择批次 157 // 如果物料启用了批次管理,则必须选择批次
156 if (Boolean.TRUE.equals(item.getBatchFlag()) && batchId == null) { 158 if (Boolean.TRUE.equals(item.getBatchFlag()) && batchId == null) {
157 throw exception(MD_ITEM_BATCH_REQUIRED); 159 throw exception(MD_ITEM_BATCH_REQUIRED);
158 } 160 }
159 - // 校验批次存在且属于当前物料 161 + // 校验批次存在且属于当前物料和客户
160 if (batchId != null) { 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,6 +5,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
5 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesWmReturnVendorLinePageReqVO; 5 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesWmReturnVendorLinePageReqVO;
6 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesWmReturnVendorLineSaveReqVO; 6 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesWmReturnVendorLineSaveReqVO;
7 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO; 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 import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorLineMapper; 9 import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorLineMapper;
9 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; 10 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
10 import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; 11 import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService;
@@ -108,12 +109,12 @@ public class MesWmReturnVendorLineServiceImpl implements MesWmReturnVendorLineSe @@ -108,12 +109,12 @@ public class MesWmReturnVendorLineServiceImpl implements MesWmReturnVendorLineSe
108 109
109 private void validateReturnVendorLineSaveData(MesWmReturnVendorLineSaveReqVO reqVO) { 110 private void validateReturnVendorLineSaveData(MesWmReturnVendorLineSaveReqVO reqVO) {
110 // 校验父数据存在且为草稿状态 111 // 校验父数据存在且为草稿状态
111 - returnVendorService.validateReturnVendorExistsAndPrepare(reqVO.getReturnId()); 112 + MesWmReturnVendorDO returnVendor = returnVendorService.validateReturnVendorExistsAndPrepare(reqVO.getReturnId());
112 // 校验物料存在 113 // 校验物料存在
113 itemService.validateItemExists(reqVO.getItemId()); 114 itemService.validateItemExists(reqVO.getItemId());
114 - // 校验批次存在且属于当前物料 115 + // 校验批次存在且属于当前物料和供应商
115 if (reqVO.getBatchId() != null) { 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