From b8d340c753e50340e6dcd8e68129d421304aea8b Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 8 Apr 2026 13:59:14 +0800 Subject: [PATCH] ✨ feat(select): 增加批次和仓库过滤功能,优化库存选择器 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/line/MesWmPackageLineSaveReqVO.java | 4 ++-- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java | 2 ++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchService.java | 11 +++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java | 12 ++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineServiceImpl.java | 4 +--- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java | 16 ++++++++++------ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineServiceImpl.java | 7 ++++--- 7 files changed, 42 insertions(+), 14 deletions(-) diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/line/MesWmPackageLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/line/MesWmPackageLineSaveReqVO.java index 5e257ee..1be70a7 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/line/MesWmPackageLineSaveReqVO.java +++ b/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 { @DecimalMin(value = "0.01", message = "装箱数量必须大于 0") private BigDecimal quantity; - @Schema(description = "生产工单 ID", example = "1") + @Schema(description = "生产工单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "生产工单不能为空") private Long workOrderId; - // DONE @AI:时间都是 LocalDateTIme; @Schema(description = "有效期") private LocalDateTime expireDate; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index b0e6fbe..12252a2 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -53,6 +53,8 @@ public interface ErrorCodeConstants { ErrorCode WM_BATCH_QUALITY_STATUS_REQUIRED = new ErrorCode(1_040_717_013, "批次配置要求质量状态不能为空"); ErrorCode WM_BATCH_NOT_EXISTS = new ErrorCode(1_040_717_014, "批次不存在"); ErrorCode WM_BATCH_ITEM_MISMATCH = new ErrorCode(1_040_717_015, "批次不属于当前物料"); + ErrorCode WM_BATCH_CLIENT_MISMATCH = new ErrorCode(1_040_717_016, "批次不属于当前客户"); + ErrorCode WM_BATCH_VENDOR_MISMATCH = new ErrorCode(1_040_717_017, "批次不属于当前供应商"); // ========== MES 基础数据-客户(1-040-103-000) ========== ErrorCode MD_CLIENT_NOT_EXISTS = new ErrorCode(1_040_103_000, "客户不存在"); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchService.java index ac5323d..1211d05 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchService.java @@ -77,4 +77,15 @@ public interface MesWmBatchService { */ MesWmBatchDO validateBatchExists(Long batchId, Long itemId); + /** + * 校验批次存在,并校验批次与物料、客户/供应商的归属关系 + * + * @param batchId 批次ID + * @param itemId 物料ID + * @param clientId 客户ID(可选,不为空时校验) + * @param vendorId 供应商ID(可选,不为空时校验) + * @return 批次记录 + */ + MesWmBatchDO validateBatchExists(Long batchId, Long itemId, Long clientId, Long vendorId); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java index 3bc1580..483a228 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java +++ b/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 { return batch; } + @Override + public MesWmBatchDO validateBatchExists(Long batchId, Long itemId, Long clientId, Long vendorId) { + MesWmBatchDO batch = validateBatchExists(batchId, itemId); + if (clientId != null && ObjUtil.notEqual(batch.getClientId(), clientId)) { + throw exception(WM_BATCH_CLIENT_MISMATCH); + } + if (vendorId != null && ObjUtil.notEqual(batch.getVendorId(), vendorId)) { + throw exception(WM_BATCH_VENDOR_MISMATCH); + } + return batch; + } + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineServiceImpl.java index 438b37f..ce30a76 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineServiceImpl.java +++ b/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 { // 校验产品物料存在 itemService.validateItemExists(reqVO.getItemId()); // 校验工单已确认 - if (reqVO.getWorkOrderId() != null) { - workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId()); - } + workOrderService.validateWorkOrderConfirmed(reqVO.getWorkOrderId()); } private MesWmPackageLineDO validatePackageLineExists(Long id) { diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java index cbaa79e..dba3a0a 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnsales/MesWmReturnSalesLineServiceImpl.java +++ b/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 import cn.iocoder.yudao.module.mes.controller.admin.wm.returnsales.vo.line.MesWmReturnSalesLineSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesLineDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnsales.MesWmReturnSalesDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnsales.MesWmReturnSalesLineMapper; import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; import cn.iocoder.yudao.module.mes.enums.wm.MesWmReturnSalesStatusEnum; @@ -81,7 +82,7 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ // 校验退货单存在 + 草稿状态 returnSalesService.validateReturnSalesExistsAndPrepare(reqVO.getReturnId()); // 校验物料存在 + 批次管理 - validateItemBatchManagement(reqVO.getItemId(), reqVO.getBatchId()); + validateItemBatchManagement(reqVO.getReturnId(), reqVO.getItemId(), reqVO.getBatchId()); } @Override @@ -147,18 +148,21 @@ public class MesWmReturnSalesLineServiceImpl implements MesWmReturnSalesLineServ /** * 校验物料批次管理 * - * @param itemId 物料ID - * @param batchId 批次ID + * @param returnId 退货单ID + * @param itemId 物料ID + * @param batchId 批次ID */ - private void validateItemBatchManagement(Long itemId, Long batchId) { + private void validateItemBatchManagement(Long returnId, Long itemId, Long batchId) { MesMdItemDO item = itemService.validateItemExists(itemId); // 如果物料启用了批次管理,则必须选择批次 if (Boolean.TRUE.equals(item.getBatchFlag()) && batchId == null) { throw exception(MD_ITEM_BATCH_REQUIRED); } - // 校验批次存在且属于当前物料 + // 校验批次存在且属于当前物料和客户 if (batchId != null) { - batchService.validateBatchExists(batchId, itemId); + // 从父单获取客户ID,校验批次归属 + MesWmReturnSalesDO returnSales = returnSalesService.validateReturnSalesExistsAndPrepare(returnId); + batchService.validateBatchExists(batchId, itemId, returnSales.getClientId(), null); } } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineServiceImpl.java index efda8d1..31fd755 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/returnvendor/MesWmReturnVendorLineServiceImpl.java +++ b/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; import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesWmReturnVendorLinePageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.returnvendor.vo.line.MesWmReturnVendorLineSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorLineDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.returnvendor.MesWmReturnVendorDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.returnvendor.MesWmReturnVendorLineMapper; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; @@ -108,12 +109,12 @@ public class MesWmReturnVendorLineServiceImpl implements MesWmReturnVendorLineSe private void validateReturnVendorLineSaveData(MesWmReturnVendorLineSaveReqVO reqVO) { // 校验父数据存在且为草稿状态 - returnVendorService.validateReturnVendorExistsAndPrepare(reqVO.getReturnId()); + MesWmReturnVendorDO returnVendor = returnVendorService.validateReturnVendorExistsAndPrepare(reqVO.getReturnId()); // 校验物料存在 itemService.validateItemExists(reqVO.getItemId()); - // 校验批次存在且属于当前物料 + // 校验批次存在且属于当前物料和供应商 if (reqVO.getBatchId() != null) { - batchService.validateBatchExists(reqVO.getBatchId(), reqVO.getItemId()); + batchService.validateBatchExists(reqVO.getBatchId(), reqVO.getItemId(), null, returnVendor.getVendorId()); } } -- libgit2 0.21.4