Commit b8d340c753e50340e6dcd8e68129d421304aea8b
1 parent
3320fa80
✨ feat(select): 增加批次和仓库过滤功能,优化库存选择器
Showing
7 changed files
with
42 additions
and
14 deletions
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 |