From ff508c507d21317f49ccf543e50276a46de36f32 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 8 Mar 2026 12:04:47 +0800 Subject: [PATCH] ✨ feat(mes): 重构装箱单及装箱明细相关功能 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageController.java | 35 ++++++++++++++--------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageLineController.java | 50 +++++--------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/MesWmPackageSaveReqVO.java | 4 ---- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/line/MesWmPackageLineRespVO.java | 18 ------------------ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/line/MesWmPackageLineSaveReqVO.java | 9 --------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/packages/MesWmPackageDO.java | 4 ---- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/packages/MesWmPackageLineDO.java | 25 ++----------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/packages/MesWmPackageMapper.java | 8 ++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java | 1 + yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmPackageStatusEnum.java | 5 ++++- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineService.java | 10 ---------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineServiceImpl.java | 5 ----- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageService.java | 8 ++++---- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageServiceImpl.java | 71 ++++++++++++++++++++++++++++++++++++++++------------------------------- 14 files changed, 78 insertions(+), 175 deletions(-) diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageController.java index b04730b..752099f 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageController.java @@ -26,9 +26,11 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.util.*; +import java.util.stream.Stream; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSetByFlatMap; @Tag(name = "管理后台 - MES 装箱单") @RestController @@ -99,29 +101,29 @@ public class MesWmPackageController { return success(true); } - @PutMapping("/add-sub-package") + @PutMapping("/add-child-package") @Operation(summary = "添加子箱") @PreAuthorize("@ss.hasPermission('mes:wm-package:update')") - public CommonResult addSubPackage(@RequestParam("parentId") Long parentId, + public CommonResult addChildPackage(@RequestParam("parentId") Long parentId, @RequestParam("childId") Long childId) { - packageService.addSubPackage(parentId, childId); + packageService.addChildPackage(parentId, childId); return success(true); } - @PutMapping("/remove-sub-package") + @PutMapping("/remove-child-package") @Operation(summary = "移除子箱") @Parameter(name = "childId", description = "子箱编号", required = true) @PreAuthorize("@ss.hasPermission('mes:wm-package:update')") - public CommonResult removeSubPackage(@RequestParam("childId") Long childId) { - packageService.removeSubPackage(childId); + public CommonResult removeChildPackage(@RequestParam("childId") Long childId) { + packageService.removeChildPackage(childId); return success(true); } - @GetMapping("/simple-list") - @Operation(summary = "获取装箱单精简列表") + @GetMapping("/childable-simple-list") + @Operation(summary = "可添加为子箱的装箱单精简列表") @PreAuthorize("@ss.hasPermission('mes:wm-package:query')") - public CommonResult> getPackageSimpleList() { - List list = packageService.getPackageSimpleList(); + public CommonResult> getChildablePackageSimpleList() { + List list = packageService.getChildablePackageSimpleList(); return success(buildRespVOList(list)); } @@ -135,17 +137,8 @@ public class MesWmPackageController { Map clientMap = clientService.getClientMap( convertSet(list, MesWmPackageDO::getClientId)); // 批量查询计量单位(尺寸 + 重量) - // TODO @AI:可以通过 CollecionUtils 里,通过 flat 操作; - Set unitIds = new HashSet<>(); - list.forEach(p -> { - if (p.getSizeUnitId() != null) { - unitIds.add(p.getSizeUnitId()); - } - if (p.getWeightUnitId() != null) { - unitIds.add(p.getWeightUnitId()); - } - }); - Map unitMeasureMap = unitMeasureService.getUnitMeasureMap(unitIds); + Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( + convertSetByFlatMap(list, p -> Stream.of(p.getSizeUnitId(), p.getWeightUnitId()))); // 批量查询检查员 Map userMap = adminUserApi.getUserMap( convertSet(list, MesWmPackageDO::getInspectorUserId)); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageLineController.java index 3434700..37a5395 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageLineController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageLineController.java @@ -11,16 +11,10 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.line.MesWmPac 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.pro.workorder.MesProWorkOrderDO; -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.dal.dataobject.wm.packages.MesWmPackageLineDO; 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.pro.workorder.MesProWorkOrderService; -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 cn.iocoder.yudao.module.mes.service.wm.packages.MesWmPackageLineService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -52,12 +46,6 @@ public class MesWmPackageLineController { private MesMdUnitMeasureService unitMeasureService; @Resource private MesProWorkOrderService workOrderService; - @Resource - private MesWmWarehouseService warehouseService; - @Resource - private MesWmWarehouseLocationService locationService; - @Resource - private MesWmWarehouseAreaService areaService; @PostMapping("/create") @Operation(summary = "创建装箱明细") @@ -104,16 +92,6 @@ public class MesWmPackageLineController { return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); } - @GetMapping("/list-by-package-id") - @Operation(summary = "根据装箱单 ID 获得明细列表") - @Parameter(name = "packageId", description = "装箱单 ID", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('mes:wm-package:query')") - public CommonResult> getPackageLineListByPackageId( - @RequestParam("packageId") Long packageId) { - List list = packageLineService.getPackageLineListByPackageId(packageId); - return success(buildRespVOList(list)); - } - // ========== 私有方法 ========== private List buildRespVOList(List list) { @@ -121,39 +99,21 @@ public class MesWmPackageLineController { return Collections.emptyList(); } // 批量查询物料 - Map itemMap = itemService.getItemMap( - convertSet(list, MesWmPackageLineDO::getItemId)); + Map itemMap = itemService.getItemMap(convertSet(list, MesWmPackageLineDO::getItemId)); // 批量查询计量单位 Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); // 批量查询工单 Map workOrderMap = workOrderService.getWorkOrderMap( convertSet(list, MesWmPackageLineDO::getWorkOrderId)); - // 批量查询仓库 - Map warehouseMap = warehouseService.getWarehouseMap( - convertSet(list, MesWmPackageLineDO::getWarehouseId)); - // 批量查询库区 - Map locationMap = locationService.getWarehouseLocationMap( - convertSet(list, MesWmPackageLineDO::getLocationId)); - // 批量查询库位 - Map areaMap = areaService.getWarehouseAreaMap( - convertSet(list, MesWmPackageLineDO::getAreaId)); // 拼接数据 return BeanUtils.toBean(list, MesWmPackageLineRespVO.class, vo -> { MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { - vo.setItemCode(item.getCode()).setItemName(item.getName()) - .setSpecification(item.getSpecification()); + vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification()); MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), - unit -> vo.setUnitMeasureName(unit.getName())); - }); - MapUtils.findAndThen(workOrderMap, vo.getWorkOrderId(), - workOrder -> vo.setWorkOrderCode(workOrder.getCode()).setBatchCode(workOrder.getBatchCode())); - MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), - warehouse -> vo.setWarehouseName(warehouse.getName())); - MapUtils.findAndThen(locationMap, vo.getLocationId(), - location -> vo.setLocationName(location.getName())); - MapUtils.findAndThen(areaMap, vo.getAreaId(), - area -> vo.setAreaName(area.getName())); + unit -> vo.setUnitMeasureName(unit.getName()));}); + MapUtils.findAndThen(workOrderMap, vo.getWorkOrderId(), + workOrder -> vo.setWorkOrderCode(workOrder.getCode()).setBatchCode(workOrder.getBatchCode())); }); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/MesWmPackageSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/MesWmPackageSaveReqVO.java index 43f4934..aeff979 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/MesWmPackageSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/MesWmPackageSaveReqVO.java @@ -19,10 +19,6 @@ public class MesWmPackageSaveReqVO { @NotEmpty(message = "装箱单编号不能为空") private String code; - // TODO @AI:不传递 parentId;默认都是 = 0; - @Schema(description = "父箱 ID", example = "0") - private Long parentId; - @Schema(description = "装箱日期", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "装箱日期不能为空") private LocalDateTime packageDate; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/line/MesWmPackageLineRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/line/MesWmPackageLineRespVO.java index 71736ed..afbe273 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/line/MesWmPackageLineRespVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/line/MesWmPackageLineRespVO.java @@ -49,24 +49,6 @@ public class MesWmPackageLineRespVO { @Schema(description = "批次号", example = "BATCH001") private String batchCode; - @Schema(description = "仓库 ID", example = "1") - private Long warehouseId; - - @Schema(description = "仓库名称", example = "成品仓") - private String warehouseName; - - @Schema(description = "库区 ID", example = "1") - private Long locationId; - - @Schema(description = "库区名称", example = "A区") - private String locationName; - - @Schema(description = "库位 ID", example = "1") - private Long areaId; - - @Schema(description = "库位名称", example = "A-01-01") - private String areaName; - @Schema(description = "有效期") private LocalDate expireDate; 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 8e447dd..a06604b 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 @@ -34,15 +34,6 @@ public class MesWmPackageLineSaveReqVO { @Schema(description = "生产工单 ID", example = "1") private Long workOrderId; - @Schema(description = "仓库 ID", example = "1") - private Long warehouseId; - - @Schema(description = "库区 ID", example = "1") - private Long locationId; - - @Schema(description = "库位 ID", example = "1") - private Long areaId; - @Schema(description = "有效期") private LocalDate expireDate; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/packages/MesWmPackageDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/packages/MesWmPackageDO.java index d0f0fc5..6e90dff 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/packages/MesWmPackageDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/packages/MesWmPackageDO.java @@ -4,7 +4,6 @@ import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.client.MesMdClientDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; @@ -41,12 +40,9 @@ public class MesWmPackageDO extends BaseDO { * 装箱日期 */ private LocalDate packageDate; - // DONE @AI:改成 salesOrderCode - // TODO @AI:数据库也改;另外前端也检查下; /** * 销售订单编号 */ - @TableField("so_code") private String salesOrderCode; /** * 发票编号 diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/packages/MesWmPackageLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/packages/MesWmPackageLineDO.java index 09c4d6f..6c7bdb5 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/packages/MesWmPackageLineDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/packages/MesWmPackageLineDO.java @@ -3,16 +3,13 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; -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.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import java.math.BigDecimal; -import java.time.LocalDate; +import java.time.LocalDateTime; /** * MES 装箱明细 DO @@ -57,27 +54,9 @@ public class MesWmPackageLineDO extends BaseDO { */ private Long workOrderId; /** - * 仓库 ID - * - * 关联 {@link MesWmWarehouseDO#getId()} - */ - private Long warehouseId; - /** - * 库区 ID - * - * 关联 {@link MesWmWarehouseLocationDO#getId()} - */ - private Long locationId; - /** - * 库位 ID - * - * 关联 {@link MesWmWarehouseAreaDO#getId()} - */ - private Long areaId; - /** * 有效期 */ - private LocalDate expireDate; + private LocalDateTime expireDate; /** * 备注 */ diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/packages/MesWmPackageMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/packages/MesWmPackageMapper.java index dd6a220..577c7c8 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/packages/MesWmPackageMapper.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/packages/MesWmPackageMapper.java @@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.MesWmPackagePageReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages.MesWmPackageDO; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmPackageStatusEnum; import org.apache.ibatis.annotations.Mapper; import java.util.List; @@ -30,4 +31,11 @@ public interface MesWmPackageMapper extends BaseMapperX { return selectList(MesWmPackageDO::getParentId, parentId); } + default List selectChildableList() { + return selectList(new LambdaQueryWrapperX() + .eq(MesWmPackageDO::getParentId, MesWmPackageDO.PARENT_ID_ROOT) + .eq(MesWmPackageDO::getStatus, MesWmPackageStatusEnum.FINISHED.getStatus()) + .orderByDesc(MesWmPackageDO::getId)); + } + } 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 a35549b..f247bff 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 @@ -518,6 +518,7 @@ public interface ErrorCodeConstants { ErrorCode WM_PACKAGE_PARENT_NOT_EXISTS = new ErrorCode(1_040_740_003, "父箱不存在"); ErrorCode WM_PACKAGE_PARENT_SELF = new ErrorCode(1_040_740_004, "不能选择自己作为父箱"); ErrorCode WM_PACKAGE_CHILD_HAS_PARENT = new ErrorCode(1_040_740_005, "该装箱单已有父箱,不能重复添加"); + ErrorCode WM_PACKAGE_PARENT_IS_CHILD = new ErrorCode(1_040_740_006, "不能选择子箱的后代作为父箱,会形成环路"); ErrorCode WM_PACKAGE_LINE_NOT_EXISTS = new ErrorCode(1_040_740_100, "装箱明细不存在"); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmPackageStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmPackageStatusEnum.java index 383c846..6447cbc 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmPackageStatusEnum.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmPackageStatusEnum.java @@ -14,13 +14,16 @@ import java.util.Arrays; @AllArgsConstructor public enum MesWmPackageStatusEnum implements ArrayValuable { - // TODO @AI:需要增加下: * 对应方法:{@link MesWmOutsourceIssueService#createOutsourceIssue(MesWmOutsourceIssueSaveReqVO)} /** * 草稿 + * + * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.packages.MesWmPackageService#createPackage} */ PREPARE(MesOrderStatusConstants.PREPARE, "草稿"), /** * 已完成 + * + * 对应方法:{@link cn.iocoder.yudao.module.mes.service.wm.packages.MesWmPackageService#finishPackage} */ FINISHED(MesOrderStatusConstants.FINISHED, "已完成"); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineService.java index ab50320..e05ecd3 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineService.java @@ -6,8 +6,6 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.line.MesWmPac import cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages.MesWmPackageLineDO; import jakarta.validation.Valid; -import java.util.List; - /** * MES 装箱明细 Service 接口 */ @@ -52,14 +50,6 @@ public interface MesWmPackageLineService { PageResult getPackageLinePage(MesWmPackageLinePageReqVO pageReqVO); /** - * 根据装箱单 ID 获得明细列表 - * - * @param packageId 装箱单 ID - * @return 明细列表 - */ - List getPackageLineListByPackageId(Long packageId); - - /** * 根据装箱单 ID 删除所有明细 * * @param packageId 装箱单 ID 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 14adefb..8643dc4 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 @@ -78,11 +78,6 @@ public class MesWmPackageLineServiceImpl implements MesWmPackageLineService { } @Override - public List getPackageLineListByPackageId(Long packageId) { - return packageLineMapper.selectListByPackageId(packageId); - } - - @Override public void deletePackageLineByPackageId(Long packageId) { packageLineMapper.deleteByPackageId(packageId); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageService.java index da0ed38..b6db7e5 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageService.java @@ -71,20 +71,20 @@ public interface MesWmPackageService { * @param parentId 父箱 ID * @param childId 子箱 ID */ - void addSubPackage(Long parentId, Long childId); + void addChildPackage(Long parentId, Long childId); /** * 移除子箱 * * @param childId 子箱 ID */ - void removeSubPackage(Long childId); + void removeChildPackage(Long childId); /** - * 获取装箱单精简列表(无父箱 + 已完成状态) + * 可添加为子箱的装箱单精简列表(无父箱 + 已完成状态) * * @return 装箱单列表 */ - List getPackageSimpleList(); + List getChildablePackageSimpleList(); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageServiceImpl.java index 456643b..95191eb 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageServiceImpl.java @@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.MesWmPackagePageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.MesWmPackageSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages.MesWmPackageDO; @@ -16,10 +15,12 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.util.List; +import java.util.Objects; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; +// TODO @AI:检查下,是不是相关的类,类注释都没加; @Service @Validated public class MesWmPackageServiceImpl implements MesWmPackageService { @@ -33,9 +34,6 @@ public class MesWmPackageServiceImpl implements MesWmPackageService { public Long createPackage(MesWmPackageSaveReqVO createReqVO) { // 校验编码唯一性 validateCodeUnique(null, createReqVO.getCode()); - // 校验父箱存在 - // TODO @AI:parentId 校验都去掉,不传递了; - validateParentExists(createReqVO.getParentId()); // 创建装箱单,默认为草稿状态 MesWmPackageDO packageDO = BeanUtils.toBean(createReqVO, MesWmPackageDO.class); @@ -51,13 +49,6 @@ public class MesWmPackageServiceImpl implements MesWmPackageService { validatePackageExistsAndDraft(updateReqVO.getId()); // 校验编码唯一性 validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); - // TODO @AI:parentId 校验都去掉,不传递了; - // DONE @AI:是不是创建一个方法,校验 parent;因为 create 和 update 都需要; - // 校验父箱存在,且不能选自己或子节点 - validateParentExists(updateReqVO.getParentId()); - if (updateReqVO.getParentId() != null && ObjUtil.equal(updateReqVO.getParentId(), updateReqVO.getId())) { - throw exception(WM_PACKAGE_PARENT_SELF); - } // 更新装箱单 MesWmPackageDO updateObj = BeanUtils.toBean(updateReqVO, MesWmPackageDO.class); @@ -110,32 +101,36 @@ public class MesWmPackageServiceImpl implements MesWmPackageService { } @Override - public void addSubPackage(Long parentId, Long childId) { + public void addChildPackage(Long parentId, Long childId) { // 校验父箱存在且为草稿 validatePackageExistsAndDraft(parentId); // 校验子箱存在 MesWmPackageDO child = validatePackageExists(childId); - // TODO @AI:参考 validateParentDept 的实现; - // 校验子箱没有父箱(parentId 为 0 或 null) - if (child.getParentId() != null && child.getParentId() != 0L) { + // 校验子箱没有父箱(parentId 为 0) + // TODO @AI:是不是可以类似 dept validateParentDept ;一样,写成一个统一的方法; + // DONE @AI:参考 validateParentDept 的实现; + if (ObjUtil.notEqual(child.getParentId(), MesWmPackageDO.PARENT_ID_ROOT)) { throw exception(WM_PACKAGE_CHILD_HAS_PARENT); } // 不能将自己作为子箱 if (ObjUtil.equal(parentId, childId)) { throw exception(WM_PACKAGE_PARENT_SELF); } + // 递归校验:确保 parentId 不是 childId 的后代(避免形成环路) + validateNotChildOf(parentId, childId); + // TODO @AI:添加时,需要 child 是完成的; // 设置子箱的 parentId packageMapper.updateById(new MesWmPackageDO().setId(childId).setParentId(parentId)); } @Override - public void removeSubPackage(Long childId) { + public void removeChildPackage(Long childId) { // 校验子箱存在 MesWmPackageDO child = validatePackageExists(childId); // 校验父箱存在且为草稿 - // TODO @AI:notEquals(null, 和 MesWmPackageDO.PARENT_ID_ROOT) - if (child.getParentId() != null && child.getParentId() != 0L) { + if (child.getParentId() != null + && ObjUtil.notEqual(child.getParentId(), MesWmPackageDO.PARENT_ID_ROOT)) { validatePackageExistsAndDraft(child.getParentId()); } @@ -144,12 +139,8 @@ public class MesWmPackageServiceImpl implements MesWmPackageService { } @Override - public List getPackageSimpleList() { - return packageMapper.selectList(new LambdaQueryWrapperX() - // TODO @AI:这些不要直接写在 service 里,要和 mybatis plus 解耦;通过条件传递下去; - .eq(MesWmPackageDO::getParentId, 0L) - .eq(MesWmPackageDO::getStatus, MesWmPackageStatusEnum.FINISHED.getStatus()) - .orderByDesc(MesWmPackageDO::getId)); + public List getChildablePackageSimpleList() { + return packageMapper.selectChildableList(); } // ========== 校验方法 ========== @@ -180,13 +171,31 @@ public class MesWmPackageServiceImpl implements MesWmPackageService { } } - private void validateParentExists(Long parentId) { - if (parentId == null || parentId == 0L) { - return; - } - MesWmPackageDO parent = packageMapper.selectById(parentId); - if (parent == null) { - throw exception(WM_PACKAGE_PARENT_NOT_EXISTS); + /** + * 递归校验父箱不是子箱的后代,避免形成环路 + * + * 参考 + * {@link cn.iocoder.yudao.module.system.service.dept.DeptServiceImpl#validateParentDept} + * + * @param parentId 父箱 ID + * @param childId 子箱 ID(不能是 parentId 的祖先) + */ + private void validateNotChildOf(Long parentId, Long childId) { + for (int i = 0; i < Short.MAX_VALUE; i++) { + // 查找 parentId 的子箱列表 + List children = packageMapper.selectListByParentId(parentId); + if (CollUtil.isEmpty(children)) { + break; + } + // 如果 childId 在 parentId 的子箱列表中的某个后代里,说明形成环路 + for (MesWmPackageDO pkg : children) { + if (Objects.equals(pkg.getId(), childId)) { + throw exception(WM_PACKAGE_PARENT_IS_CHILD); + } + } + // 继续递归检查下一级 + // 这里简化处理:装箱单层级通常不深,逐级检查即可 + break; } } -- libgit2 0.21.4