diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferDetailController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferDetailController.java index 03450f3..e0ef381 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferDetailController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferDetailController.java @@ -1,11 +1,23 @@ package cn.iocoder.yudao.module.mes.controller.admin.wm.transfer; +import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.detail.MesWmTransferDetailRespVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.detail.MesWmTransferDetailSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transfer.MesWmTransferDetailDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; import cn.iocoder.yudao.module.mes.service.wm.transfer.MesWmTransferDetailService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -15,9 +27,12 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.Collections; import java.util.List; +import java.util.Map; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; @Tag(name = "管理后台 - MES 调拨明细") @RestController @@ -28,6 +43,21 @@ public class MesWmTransferDetailController { @Resource private MesWmTransferDetailService transferDetailService; + @Resource + private MesMdItemService itemService; + + @Resource + private MesMdUnitMeasureService unitMeasureService; + + @Resource + private MesWmWarehouseService warehouseService; + + @Resource + private MesWmWarehouseLocationService locationService; + + @Resource + private MesWmWarehouseAreaService areaService; + @PostMapping("/create") @Operation(summary = "创建调拨明细") @PreAuthorize("@ss.hasPermission('mes:wm-transfer:create')") @@ -58,7 +88,10 @@ public class MesWmTransferDetailController { @PreAuthorize("@ss.hasPermission('mes:wm-transfer:query')") public CommonResult getTransferDetail(@RequestParam("id") Long id) { MesWmTransferDetailDO detail = transferDetailService.getTransferDetail(id); - return success(BeanUtils.toBean(detail, MesWmTransferDetailRespVO.class)); + if (detail == null) { + return success(null); + } + return success(buildRespVOList(Collections.singletonList(detail)).get(0)); } @GetMapping("/list-by-line") @@ -68,7 +101,39 @@ public class MesWmTransferDetailController { public CommonResult> getTransferDetailListByLineId( @RequestParam("lineId") Long lineId) { List list = transferDetailService.getTransferDetailListByLineId(lineId); - return success(BeanUtils.toBean(list, MesWmTransferDetailRespVO.class)); + return success(buildRespVOList(list)); + } + + // ==================== 拼接 VO ==================== + + private List buildRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + // 查询相关数据 + Map itemMap = itemService.getItemMap(convertSet(list, MesWmTransferDetailDO::getItemId)); + Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); + Map warehouseMap = warehouseService.getWarehouseMap( + convertSet(list, MesWmTransferDetailDO::getToWarehouseId)); + Map locationMap = locationService.getWarehouseLocationMap( + convertSet(list, MesWmTransferDetailDO::getToLocationId)); + Map areaMap = areaService.getWarehouseAreaMap( + convertSet(list, MesWmTransferDetailDO::getToAreaId)); + // 拼接数据 + return BeanUtils.toBean(list, MesWmTransferDetailRespVO.class, vo -> { + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { + vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification()); + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), + unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); + }); + MapUtils.findAndThen(warehouseMap, vo.getToWarehouseId(), + warehouse -> vo.setToWarehouseName(warehouse.getName())); + MapUtils.findAndThen(locationMap, vo.getToLocationId(), + location -> vo.setToLocationName(location.getName())); + MapUtils.findAndThen(areaMap, vo.getToAreaId(), + area -> vo.setToAreaName(area.getName())); + }); } } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferLineController.java index acdade7..46419b6 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferLineController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/MesWmTransferLineController.java @@ -1,11 +1,23 @@ package cn.iocoder.yudao.module.mes.controller.admin.wm.transfer; +import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.line.MesWmTransferLineRespVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.line.MesWmTransferLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transfer.MesWmTransferLineDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; import cn.iocoder.yudao.module.mes.service.wm.transfer.MesWmTransferLineService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -15,9 +27,12 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.Collections; import java.util.List; +import java.util.Map; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; @Tag(name = "管理后台 - MES 转移单行") @RestController @@ -28,6 +43,21 @@ public class MesWmTransferLineController { @Resource private MesWmTransferLineService transferLineService; + @Resource + private MesMdItemService itemService; + + @Resource + private MesMdUnitMeasureService unitMeasureService; + + @Resource + private MesWmWarehouseService warehouseService; + + @Resource + private MesWmWarehouseLocationService locationService; + + @Resource + private MesWmWarehouseAreaService areaService; + @PostMapping("/create") @Operation(summary = "创建转移单行") @PreAuthorize("@ss.hasPermission('mes:wm-transfer:create')") @@ -58,7 +88,10 @@ public class MesWmTransferLineController { @PreAuthorize("@ss.hasPermission('mes:wm-transfer:query')") public CommonResult getTransferLine(@RequestParam("id") Long id) { MesWmTransferLineDO line = transferLineService.getTransferLine(id); - return success(BeanUtils.toBean(line, MesWmTransferLineRespVO.class)); + if (line == null) { + return success(null); + } + return success(buildRespVOList(Collections.singletonList(line)).get(0)); } @GetMapping("/list") @@ -67,7 +100,39 @@ public class MesWmTransferLineController { @PreAuthorize("@ss.hasPermission('mes:wm-transfer:query')") public CommonResult> getTransferLineList(@RequestParam("transferId") Long transferId) { List list = transferLineService.getTransferLineListByTransferId(transferId); - return success(BeanUtils.toBean(list, MesWmTransferLineRespVO.class)); + return success(buildRespVOList(list)); + } + + // ==================== 拼接 VO ==================== + + private List buildRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + // 查询相关数据 + Map itemMap = itemService.getItemMap(convertSet(list, MesWmTransferLineDO::getItemId)); + Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); + Map warehouseMap = warehouseService.getWarehouseMap( + convertSet(list, MesWmTransferLineDO::getFromWarehouseId)); + Map locationMap = locationService.getWarehouseLocationMap( + convertSet(list, MesWmTransferLineDO::getFromLocationId)); + Map areaMap = areaService.getWarehouseAreaMap( + convertSet(list, MesWmTransferLineDO::getFromAreaId)); + // 拼接数据 + return BeanUtils.toBean(list, MesWmTransferLineRespVO.class, vo -> { + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { + vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification()); + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), + unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); + }); + MapUtils.findAndThen(warehouseMap, vo.getFromWarehouseId(), + warehouse -> vo.setFromWarehouseName(warehouse.getName())); + MapUtils.findAndThen(locationMap, vo.getFromLocationId(), + location -> vo.setFromLocationName(location.getName())); + MapUtils.findAndThen(areaMap, vo.getFromAreaId(), + area -> vo.setFromAreaName(area.getName())); + }); } } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/detail/MesWmTransferDetailRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/detail/MesWmTransferDetailRespVO.java index e0baf5a..75521dd 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/detail/MesWmTransferDetailRespVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/detail/MesWmTransferDetailRespVO.java @@ -20,21 +20,37 @@ public class MesWmTransferDetailRespVO { @Schema(description = "物料编号", example = "1") private Long itemId; + @Schema(description = "物料编码") + private String itemCode; + @Schema(description = "物料名称") + private String itemName; + @Schema(description = "规格型号") + private String specification; + @Schema(description = "单位名称") + private String unitMeasureName; @Schema(description = "上架数量", example = "100") private BigDecimal quantity; @Schema(description = "批次编号", example = "1") private Long batchId; + @Schema(description = "批次号") + private String batchCode; @Schema(description = "移入仓库编号", example = "1") private Long toWarehouseId; + @Schema(description = "移入仓库名称") + private String toWarehouseName; @Schema(description = "移入库区编号", example = "1") private Long toLocationId; + @Schema(description = "移入库区名称") + private String toLocationName; @Schema(description = "移入库位编号", example = "1") private Long toAreaId; + @Schema(description = "移入库位名称") + private String toAreaName; @Schema(description = "备注", example = "备注信息") private String remark; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/detail/MesWmTransferDetailSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/detail/MesWmTransferDetailSaveReqVO.java index df5621d..7e93f25 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/detail/MesWmTransferDetailSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/detail/MesWmTransferDetailSaveReqVO.java @@ -1,6 +1,8 @@ package cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.detail; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.NotNull; import lombok.Data; import java.math.BigDecimal; @@ -12,28 +14,36 @@ public class MesWmTransferDetailSaveReqVO { @Schema(description = "编号", example = "1") private Long id; - @Schema(description = "转移单行编号", example = "1") + @Schema(description = "转移单行编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "转移单行编号不能为空") private Long lineId; - @Schema(description = "转移单编号", example = "1") + @Schema(description = "转移单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "转移单编号不能为空") private Long transferId; - @Schema(description = "物料编号", example = "1") + @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "物料编号不能为空") private Long itemId; - @Schema(description = "上架数量", example = "100") + @Schema(description = "上架数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") + @NotNull(message = "上架数量不能为空") + @DecimalMin(value = "0.01", message = "上架数量必须大于 0") private BigDecimal quantity; @Schema(description = "批次编号", example = "1") private Long batchId; - @Schema(description = "移入仓库编号", example = "1") + @Schema(description = "移入仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "移入仓库编号不能为空") private Long toWarehouseId; - @Schema(description = "移入库区编号", example = "1") + @Schema(description = "移入库区编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "移入库区编号不能为空") private Long toLocationId; - @Schema(description = "移入库位编号", example = "1") + @Schema(description = "移入库位编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "移入库位编号不能为空") private Long toAreaId; @Schema(description = "备注", example = "备注信息") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/line/MesWmTransferLineRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/line/MesWmTransferLineRespVO.java index a61db9f..fbf4f96 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/line/MesWmTransferLineRespVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/line/MesWmTransferLineRespVO.java @@ -20,21 +20,37 @@ public class MesWmTransferLineRespVO { @Schema(description = "物料编号", example = "1") private Long itemId; + @Schema(description = "物料编码") + private String itemCode; + @Schema(description = "物料名称") + private String itemName; + @Schema(description = "规格型号") + private String specification; + @Schema(description = "单位名称") + private String unitMeasureName; @Schema(description = "转移数量", example = "100") private BigDecimal quantity; @Schema(description = "批次编号", example = "1") private Long batchId; + @Schema(description = "批次号") + private String batchCode; @Schema(description = "移出仓库编号", example = "1") private Long fromWarehouseId; + @Schema(description = "移出仓库名称") + private String fromWarehouseName; @Schema(description = "移出库区编号", example = "1") private Long fromLocationId; + @Schema(description = "移出库区名称") + private String fromLocationName; @Schema(description = "移出库位编号", example = "1") private Long fromAreaId; + @Schema(description = "移出库位名称") + private String fromAreaName; @Schema(description = "备注", example = "备注信息") private String remark; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/line/MesWmTransferLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/line/MesWmTransferLineSaveReqVO.java index d213ca6..96f7763 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/line/MesWmTransferLineSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/transfer/vo/line/MesWmTransferLineSaveReqVO.java @@ -1,6 +1,8 @@ package cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.line; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.NotNull; import lombok.Data; import java.math.BigDecimal; @@ -12,34 +14,35 @@ public class MesWmTransferLineSaveReqVO { @Schema(description = "编号", example = "1") private Long id; - @Schema(description = "转移单编号", example = "1") - // TODO @AI:不能为空 + @Schema(description = "转移单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "转移单编号不能为空") private Long transferId; @Schema(description = "库存记录编号", example = "1") private Long materialStockId; - @Schema(description = "物料编号", example = "1") - // TODO @AI:不能为空 + @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "物料编号不能为空") private Long itemId; - @Schema(description = "转移数量", example = "100") - // TODO @AI:数量不能为空,且要大于 0 + @Schema(description = "转移数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") + @NotNull(message = "转移数量不能为空") + @DecimalMin(value = "0.01", message = "转移数量必须大于 0") private BigDecimal quantity; @Schema(description = "批次编号", example = "1") private Long batchId; - @Schema(description = "移出仓库编号", example = "1") - // TODO @AI:不能为空 + @Schema(description = "移出仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "移出仓库编号不能为空") private Long fromWarehouseId; - @Schema(description = "移出库区编号", example = "1") - // TODO @AI:不能为空 + @Schema(description = "移出库区编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "移出库区编号不能为空") private Long fromLocationId; - @Schema(description = "移出库位编号", example = "1") - // TODO @AI:不能为空 + @Schema(description = "移出库位编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "移出库位编号不能为空") private Long fromAreaId; @Schema(description = "备注", example = "备注信息") 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 4d6976b..fce0f40 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 @@ -401,13 +401,14 @@ public interface ErrorCodeConstants { ErrorCode WM_TRANSFER_CODE_DUPLICATE = new ErrorCode(1_040_710_002, "转移单编号已存在"); ErrorCode WM_TRANSFER_NOT_DRAFT = new ErrorCode(1_040_710_003, "只有草稿状态的转移单才可操作"); ErrorCode WM_TRANSFER_NOT_CONFIRMED = new ErrorCode(1_040_710_004, "只有待确认状态的转移单才可执行确认"); - ErrorCode WM_TRANSFER_NOT_UNSTOCK = new ErrorCode(1_040_710_005, "只有待上架状态的转移单才可执行上架"); - ErrorCode WM_TRANSFER_NOT_UNEXECUTE = new ErrorCode(1_040_710_006, "只有待执行状态的转移单才可完成"); + ErrorCode WM_TRANSFER_NOT_APPROVING = new ErrorCode(1_040_710_005, "只有待上架状态的转移单才可执行上架"); + ErrorCode WM_TRANSFER_NOT_APPROVED = new ErrorCode(1_040_710_006, "只有待执行状态的转移单才可完成"); ErrorCode WM_TRANSFER_ALREADY_FINISHED = new ErrorCode(1_040_710_007, "转移单已完成或已取消,无法继续操作"); ErrorCode WM_TRANSFER_NO_LINE = new ErrorCode(1_040_710_008, "转移单至少需要一条行数据"); ErrorCode WM_TRANSFER_DETAIL_QUANTITY_MISMATCH = new ErrorCode(1_040_710_009, "转移单行数量与明细数量不一致"); ErrorCode WM_TRANSFER_LINE_NOT_EXISTS = new ErrorCode(1_040_710_100, "转移单行不存在"); ErrorCode WM_TRANSFER_DETAIL_NOT_EXISTS = new ErrorCode(1_040_710_200, "调拨明细不存在"); + ErrorCode WM_TRANSFER_DETAIL_QUANTITY_EXCEED = new ErrorCode(1_040_710_201, "调拨明细总数量不能超过调拨单行数量"); // ========== MES 仓库管理-生产退料单(1-040-711-000) ========== ErrorCode WM_RETURN_ISSUE_NOT_EXISTS = new ErrorCode(1_040_710_000, "生产退料单不存在"); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmTransferStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmTransferStatusEnum.java index b057e58..bb61f61 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmTransferStatusEnum.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmTransferStatusEnum.java @@ -30,20 +30,18 @@ public enum MesWmTransferStatusEnum implements ArrayValuable { * 对应方法:{@link MesWmTransferService#submitTransfer(Long)} */ UNCONFIRMED(MesOrderStatusConstants.CONFIRMED, "待确认"), - // TODO @AI:前后端,要不都改成 APPROVING /** * 待上架 * * 对应方法:{@link MesWmTransferService#submitTransfer(Long)}、{@link MesWmTransferService#confirmTransfer(Long)} */ - UNSTOCK(MesOrderStatusConstants.APPROVING, "待上架"), - // TODO @AI:前后端,要不都改成 APPROVED + APPROVING(MesOrderStatusConstants.APPROVING, "待上架"), /** * 待执行 * * 对应方法:{@link MesWmTransferService#stockTransfer(Long)} */ - UNEXECUTE(MesOrderStatusConstants.APPROVED, "待执行"), + APPROVED(MesOrderStatusConstants.APPROVED, "待执行"), /** * 已完成 * diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferDetailServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferDetailServiceImpl.java index 9683506..549d7d4 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferDetailServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/transfer/MesWmTransferDetailServiceImpl.java @@ -1,18 +1,23 @@ package cn.iocoder.yudao.module.mes.service.wm.transfer; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.transfer.vo.detail.MesWmTransferDetailSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transfer.MesWmTransferDetailDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.transfer.MesWmTransferLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.transfer.MesWmTransferDetailMapper; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; +import java.math.BigDecimal; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_TRANSFER_DETAIL_NOT_EXISTS; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_TRANSFER_DETAIL_QUANTITY_EXCEED; /** * MES 调拨明细 Service 实现类 @@ -28,12 +33,21 @@ public class MesWmTransferDetailServiceImpl implements MesWmTransferDetailServic @Lazy private MesWmTransferLineService transferLineService; + @Resource + private MesWmWarehouseAreaService warehouseAreaService; + @Override public Long createTransferDetail(MesWmTransferDetailSaveReqVO createReqVO) { - transferLineService.validateTransferLineExists(createReqVO.getLineId()); - // DONE @AI:当前先保留行存在校验,其他关联校验需结合上架业务与库位规则统一设计,暂不在本轮 TODO 修复中扩展 - // TODO @AI:位置相关的几个校验; - + // 校验父数据存在 + MesWmTransferLineDO line = transferLineService.validateTransferLineExists(createReqVO.getLineId()); + // 校验仓库、库区、库位的关联关系 + warehouseAreaService.validateWarehouseAreaExists( + createReqVO.getToWarehouseId(), createReqVO.getToLocationId(), createReqVO.getToAreaId()); + // 校验明细总数量不超过行数量 + validateDetailQuantityNotExceed(createReqVO.getLineId(), createReqVO.getQuantity(), null, line); + // TODO @芋艿:不能混货 + + // 插入 MesWmTransferDetailDO detail = BeanUtils.toBean(createReqVO, MesWmTransferDetailDO.class); transferDetailMapper.insert(detail); return detail.getId(); @@ -41,19 +55,27 @@ public class MesWmTransferDetailServiceImpl implements MesWmTransferDetailServic @Override public void updateTransferDetail(MesWmTransferDetailSaveReqVO updateReqVO) { + // 校验存在 validateTransferDetailExists(updateReqVO.getId()); - transferLineService.validateTransferLineExists(updateReqVO.getLineId()); - // DONE @AI:当前先保留行存在校验,其他关联校验需结合上架业务与库位规则统一设计,暂不在本轮 TODO 修复中扩展 - // TODO @AI:位置相关的几个校验; - + // 校验父数据存在 + MesWmTransferLineDO line = transferLineService.validateTransferLineExists(updateReqVO.getLineId()); + // 校验仓库、库区、库位的关联关系 + warehouseAreaService.validateWarehouseAreaExists( + updateReqVO.getToWarehouseId(), updateReqVO.getToLocationId(), updateReqVO.getToAreaId()); + // 校验明细总数量不超过行数量(排除自身) + validateDetailQuantityNotExceed(updateReqVO.getLineId(), updateReqVO.getQuantity(), updateReqVO.getId(), line); + // TODO @芋艿:不能混货 + + // 更新 MesWmTransferDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmTransferDetailDO.class); transferDetailMapper.updateById(updateObj); } @Override public void deleteTransferDetail(Long id) { - // DONE @AI:当前先保留行存在校验,其他关联校验需结合上架业务与库位规则统一设计,暂不在本轮 TODO 修复中扩展 + // 校验存在 validateTransferDetailExists(id); + // 删除 transferDetailMapper.deleteById(id); } @@ -84,4 +106,26 @@ public class MesWmTransferDetailServiceImpl implements MesWmTransferDetailServic } } + /** + * 校验明细总数量不超过行数量 + * + * @param lineId 行 ID + * @param newQuantity 本次新增/修改的数量 + * @param excludeDetailId 排除的明细 ID(更新时排除自身,新增时传 null) + * @param line 调拨单行 + */ + private void validateDetailQuantityNotExceed(Long lineId, BigDecimal newQuantity, + Long excludeDetailId, MesWmTransferLineDO line) { + // 计算已有明细总数量(排除自身) + List details = transferDetailMapper.selectListByLineId(lineId); + BigDecimal existingTotal = CollectionUtils.getSumValue(details, + detail -> excludeDetailId != null && excludeDetailId.equals(detail.getId()) + ? BigDecimal.ZERO : detail.getQuantity(), + BigDecimal::add, BigDecimal.ZERO); + // 校验:已有 + 本次 <= 行数量 + if (existingTotal.add(newQuantity).compareTo(line.getQuantity()) > 0) { + throw exception(WM_TRANSFER_DETAIL_QUANTITY_EXCEED); + } + } + }