Commit a63a8070497607a5b6077e5cd56e3ffbd714c5f0

Authored by YunaiV
1 parent abddf4a1

✨ feat(mes): 添加装箱单及装箱明细相关功能

新增装箱单和装箱明细的请求和响应对象,支持装箱单的创建、更新、删除及查询功能。包括装箱单的状态管理和子箱的添加与移除逻辑,提升了系统的功能完整性和用户体验。
Showing 18 changed files with 229 additions and 149 deletions
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/MesWmPackageController.java renamed to yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageController.java
1 -package cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage; 1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.packages;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 -import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;  
5 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
6 -import cn.iocoder.yudao.framework.common.pojo.PageParam;  
7 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
8 import cn.iocoder.yudao.framework.common.util.collection.MapUtils; 6 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
9 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
10 -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;  
11 -import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.MesWmPackagePageReqVO;  
12 -import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.MesWmPackageRespVO;  
13 -import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.MesWmPackageSaveReqVO; 8 +import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.MesWmPackagePageReqVO;
  9 +import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.MesWmPackageRespVO;
  10 +import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.MesWmPackageSaveReqVO;
14 import cn.iocoder.yudao.module.mes.dal.dataobject.md.client.MesMdClientDO; 11 import cn.iocoder.yudao.module.mes.dal.dataobject.md.client.MesMdClientDO;
15 import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; 12 import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
16 -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.wmpackage.MesWmPackageDO; 13 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages.MesWmPackageDO;
17 import cn.iocoder.yudao.module.mes.service.md.client.MesMdClientService; 14 import cn.iocoder.yudao.module.mes.service.md.client.MesMdClientService;
18 import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; 15 import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
19 -import cn.iocoder.yudao.module.mes.service.wm.wmpackage.MesWmPackageService; 16 +import cn.iocoder.yudao.module.mes.service.wm.packages.MesWmPackageService;
20 import cn.iocoder.yudao.module.system.api.user.AdminUserApi; 17 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
21 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; 18 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
22 import io.swagger.v3.oas.annotations.Operation; 19 import io.swagger.v3.oas.annotations.Operation;
23 import io.swagger.v3.oas.annotations.Parameter; 20 import io.swagger.v3.oas.annotations.Parameter;
24 import io.swagger.v3.oas.annotations.tags.Tag; 21 import io.swagger.v3.oas.annotations.tags.Tag;
25 import jakarta.annotation.Resource; 22 import jakarta.annotation.Resource;
26 -import jakarta.servlet.http.HttpServletResponse;  
27 import jakarta.validation.Valid; 23 import jakarta.validation.Valid;
28 import org.springframework.security.access.prepost.PreAuthorize; 24 import org.springframework.security.access.prepost.PreAuthorize;
29 import org.springframework.validation.annotation.Validated; 25 import org.springframework.validation.annotation.Validated;
30 import org.springframework.web.bind.annotation.*; 26 import org.springframework.web.bind.annotation.*;
31 27
32 -import java.io.IOException;  
33 import java.util.*; 28 import java.util.*;
34 -import java.util.stream.Collectors;  
35 29
36 -import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;  
37 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 30 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
38 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; 31 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
39 32
@@ -97,18 +90,6 @@ public class MesWmPackageController { @@ -97,18 +90,6 @@ public class MesWmPackageController {
97 return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); 90 return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal()));
98 } 91 }
99 92
100 - @GetMapping("/export-excel")  
101 - @Operation(summary = "导出装箱单 Excel")  
102 - @PreAuthorize("@ss.hasPermission('mes:wm-package:export')")  
103 - @ApiAccessLog(operateType = EXPORT)  
104 - public void exportPackageExcel(@Valid MesWmPackagePageReqVO pageReqVO,  
105 - HttpServletResponse response) throws IOException {  
106 - pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);  
107 - PageResult<MesWmPackageDO> pageResult = packageService.getPackagePage(pageReqVO);  
108 - ExcelUtils.write(response, "装箱单.xls", "数据", MesWmPackageRespVO.class,  
109 - buildRespVOList(pageResult.getList()));  
110 - }  
111 -  
112 @PutMapping("/finish") 93 @PutMapping("/finish")
113 @Operation(summary = "完成装箱单") 94 @Operation(summary = "完成装箱单")
114 @Parameter(name = "id", description = "编号", required = true) 95 @Parameter(name = "id", description = "编号", required = true)
@@ -118,14 +99,30 @@ public class MesWmPackageController { @@ -118,14 +99,30 @@ public class MesWmPackageController {
118 return success(true); 99 return success(true);
119 } 100 }
120 101
121 - @GetMapping("/tree")  
122 - @Operation(summary = "获得装箱单树形结构") 102 + @PutMapping("/add-sub-package")
  103 + @Operation(summary = "添加子箱")
  104 + @PreAuthorize("@ss.hasPermission('mes:wm-package:update')")
  105 + public CommonResult<Boolean> addSubPackage(@RequestParam("parentId") Long parentId,
  106 + @RequestParam("childId") Long childId) {
  107 + packageService.addSubPackage(parentId, childId);
  108 + return success(true);
  109 + }
  110 +
  111 + @PutMapping("/remove-sub-package")
  112 + @Operation(summary = "移除子箱")
  113 + @Parameter(name = "childId", description = "子箱编号", required = true)
  114 + @PreAuthorize("@ss.hasPermission('mes:wm-package:update')")
  115 + public CommonResult<Boolean> removeSubPackage(@RequestParam("childId") Long childId) {
  116 + packageService.removeSubPackage(childId);
  117 + return success(true);
  118 + }
  119 +
  120 + @GetMapping("/simple-list")
  121 + @Operation(summary = "获取装箱单精简列表")
123 @PreAuthorize("@ss.hasPermission('mes:wm-package:query')") 122 @PreAuthorize("@ss.hasPermission('mes:wm-package:query')")
124 - public CommonResult<List<MesWmPackageRespVO>> getPackageTree() {  
125 - List<MesWmPackageDO> list = packageService.getPackageTree();  
126 - List<MesWmPackageRespVO> voList = buildRespVOList(list);  
127 - // 构建树形结构  
128 - return success(buildTree(voList)); 123 + public CommonResult<List<MesWmPackageRespVO>> getPackageSimpleList() {
  124 + List<MesWmPackageDO> list = packageService.getPackageSimpleList();
  125 + return success(buildRespVOList(list));
129 } 126 }
130 127
131 // ========== 私有方法 ========== 128 // ========== 私有方法 ==========
@@ -138,6 +135,7 @@ public class MesWmPackageController { @@ -138,6 +135,7 @@ public class MesWmPackageController {
138 Map<Long, MesMdClientDO> clientMap = clientService.getClientMap( 135 Map<Long, MesMdClientDO> clientMap = clientService.getClientMap(
139 convertSet(list, MesWmPackageDO::getClientId)); 136 convertSet(list, MesWmPackageDO::getClientId));
140 // 批量查询计量单位(尺寸 + 重量) 137 // 批量查询计量单位(尺寸 + 重量)
  138 + // TODO @AI:可以通过 CollecionUtils 里,通过 flat 操作;
141 Set<Long> unitIds = new HashSet<>(); 139 Set<Long> unitIds = new HashSet<>();
142 list.forEach(p -> { 140 list.forEach(p -> {
143 if (p.getSizeUnitId() != null) { 141 if (p.getSizeUnitId() != null) {
@@ -151,7 +149,7 @@ public class MesWmPackageController { @@ -151,7 +149,7 @@ public class MesWmPackageController {
151 // 批量查询检查员 149 // 批量查询检查员
152 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap( 150 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
153 convertSet(list, MesWmPackageDO::getInspectorUserId)); 151 convertSet(list, MesWmPackageDO::getInspectorUserId));
154 - 152 + // 构建返回结果
155 return BeanUtils.toBean(list, MesWmPackageRespVO.class, vo -> { 153 return BeanUtils.toBean(list, MesWmPackageRespVO.class, vo -> {
156 MapUtils.findAndThen(clientMap, vo.getClientId(), 154 MapUtils.findAndThen(clientMap, vo.getClientId(),
157 client -> vo.setClientCode(client.getCode()).setClientName(client.getName()) 155 client -> vo.setClientCode(client.getCode()).setClientName(client.getName())
@@ -165,16 +163,4 @@ public class MesWmPackageController { @@ -165,16 +163,4 @@ public class MesWmPackageController {
165 }); 163 });
166 } 164 }
167 165
168 - private List<MesWmPackageRespVO> buildTree(List<MesWmPackageRespVO> list) {  
169 - // 按 parentId 分组  
170 - Map<Long, List<MesWmPackageRespVO>> parentMap = list.stream()  
171 - .collect(Collectors.groupingBy(vo -> vo.getParentId() != null ? vo.getParentId() : 0L));  
172 - // 设置 children  
173 - list.forEach(vo -> vo.setChildren(parentMap.get(vo.getId())));  
174 - // 返回顶级节点(parentId == 0 或 parentId == null)  
175 - return list.stream()  
176 - .filter(vo -> vo.getParentId() == null || vo.getParentId() == 0L)  
177 - .collect(Collectors.toList());  
178 - }  
179 -  
180 } 166 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/MesWmPackageLineController.java renamed to yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/MesWmPackageLineController.java
1 -package cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage; 1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.packages;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.common.util.collection.MapUtils; 6 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 7 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
8 -import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.line.MesWmPackageLinePageReqVO;  
9 -import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.line.MesWmPackageLineRespVO;  
10 -import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.line.MesWmPackageLineSaveReqVO; 8 +import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.line.MesWmPackageLinePageReqVO;
  9 +import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.line.MesWmPackageLineRespVO;
  10 +import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.line.MesWmPackageLineSaveReqVO;
11 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; 11 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
12 import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; 12 import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
13 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO; 13 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
14 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; 14 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
15 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; 15 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
16 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; 16 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
17 -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.wmpackage.MesWmPackageLineDO; 17 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages.MesWmPackageLineDO;
18 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; 18 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
19 import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; 19 import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
20 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService; 20 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
21 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; 21 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
22 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; 22 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
23 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; 23 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService;
24 -import cn.iocoder.yudao.module.mes.service.wm.wmpackage.MesWmPackageLineService; 24 +import cn.iocoder.yudao.module.mes.service.wm.packages.MesWmPackageLineService;
25 import io.swagger.v3.oas.annotations.Operation; 25 import io.swagger.v3.oas.annotations.Operation;
26 import io.swagger.v3.oas.annotations.Parameter; 26 import io.swagger.v3.oas.annotations.Parameter;
27 import io.swagger.v3.oas.annotations.tags.Tag; 27 import io.swagger.v3.oas.annotations.tags.Tag;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/MesWmPackagePageReqVO.java renamed to yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/MesWmPackagePageReqVO.java
1 -package cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo; 1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
5 import lombok.Data; 5 import lombok.Data;
6 import lombok.EqualsAndHashCode; 6 import lombok.EqualsAndHashCode;
7 import lombok.ToString; 7 import lombok.ToString;
8 -import org.springframework.format.annotation.DateTimeFormat;  
9 -  
10 -import java.time.LocalDate;  
11 -  
12 -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;  
13 8
14 @Schema(description = "管理后台 - MES 装箱单分页 Request VO") 9 @Schema(description = "管理后台 - MES 装箱单分页 Request VO")
15 @Data 10 @Data
@@ -21,16 +16,15 @@ public class MesWmPackagePageReqVO extends PageParam { @@ -21,16 +16,15 @@ public class MesWmPackagePageReqVO extends PageParam {
21 private String code; 16 private String code;
22 17
23 @Schema(description = "销售订单编号", example = "SO") 18 @Schema(description = "销售订单编号", example = "SO")
24 - private String soCode; 19 + private String salesOrderCode;
25 20
26 @Schema(description = "客户 ID", example = "1") 21 @Schema(description = "客户 ID", example = "1")
27 private Long clientId; 22 private Long clientId;
28 23
29 - @Schema(description = "装箱日期")  
30 - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)  
31 - private LocalDate[] packageDate; 24 + @Schema(description = "父箱 ID", example = "1024")
  25 + private Long parentId;
32 26
33 - @Schema(description = "状态", example = "0")  
34 - private Integer status; 27 + @Schema(description = "检查员用户 ID", example = "1")
  28 + private Long inspectorUserId;
35 29
36 } 30 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/MesWmPackageRespVO.java renamed to yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/MesWmPackageRespVO.java
1 -package cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo; 1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo;
2 2
3 import cn.idev.excel.annotation.ExcelIgnoreUnannotated; 3 import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
4 import cn.idev.excel.annotation.ExcelProperty; 4 import cn.idev.excel.annotation.ExcelProperty;
@@ -7,9 +7,7 @@ import lombok.Data; @@ -7,9 +7,7 @@ import lombok.Data;
7 import lombok.experimental.Accessors; 7 import lombok.experimental.Accessors;
8 8
9 import java.math.BigDecimal; 9 import java.math.BigDecimal;
10 -import java.time.LocalDate;  
11 import java.time.LocalDateTime; 10 import java.time.LocalDateTime;
12 -import java.util.List;  
13 11
14 @Schema(description = "管理后台 - MES 装箱单 Response VO") 12 @Schema(description = "管理后台 - MES 装箱单 Response VO")
15 @Data 13 @Data
@@ -30,11 +28,11 @@ public class MesWmPackageRespVO { @@ -30,11 +28,11 @@ public class MesWmPackageRespVO {
30 28
31 @Schema(description = "装箱日期") 29 @Schema(description = "装箱日期")
32 @ExcelProperty("装箱日期") 30 @ExcelProperty("装箱日期")
33 - private LocalDate packageDate; 31 + private LocalDateTime packageDate;
34 32
35 @Schema(description = "销售订单编号", example = "SO20260301") 33 @Schema(description = "销售订单编号", example = "SO20260301")
36 @ExcelProperty("销售订单编号") 34 @ExcelProperty("销售订单编号")
37 - private String soCode; 35 + private String salesOrderCode;
38 36
39 @Schema(description = "发票编号", example = "INV20260301") 37 @Schema(description = "发票编号", example = "INV20260301")
40 @ExcelProperty("发票编号") 38 @ExcelProperty("发票编号")
@@ -107,7 +105,4 @@ public class MesWmPackageRespVO { @@ -107,7 +105,4 @@ public class MesWmPackageRespVO {
107 @ExcelProperty("创建时间") 105 @ExcelProperty("创建时间")
108 private LocalDateTime createTime; 106 private LocalDateTime createTime;
109 107
110 - @Schema(description = "子箱列表")  
111 - private List<MesWmPackageRespVO> children;  
112 -  
113 } 108 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/MesWmPackageSaveReqVO.java renamed to yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/MesWmPackageSaveReqVO.java
1 -package cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo; 1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import jakarta.validation.constraints.NotEmpty; 4 import jakarta.validation.constraints.NotEmpty;
@@ -6,7 +6,7 @@ import jakarta.validation.constraints.NotNull; @@ -6,7 +6,7 @@ import jakarta.validation.constraints.NotNull;
6 import lombok.Data; 6 import lombok.Data;
7 7
8 import java.math.BigDecimal; 8 import java.math.BigDecimal;
9 -import java.time.LocalDate; 9 +import java.time.LocalDateTime;
10 10
11 @Schema(description = "管理后台 - MES 装箱单新增/修改 Request VO") 11 @Schema(description = "管理后台 - MES 装箱单新增/修改 Request VO")
12 @Data 12 @Data
@@ -19,15 +19,16 @@ public class MesWmPackageSaveReqVO { @@ -19,15 +19,16 @@ public class MesWmPackageSaveReqVO {
19 @NotEmpty(message = "装箱单编号不能为空") 19 @NotEmpty(message = "装箱单编号不能为空")
20 private String code; 20 private String code;
21 21
  22 + // TODO @AI:不传递 parentId;默认都是 = 0;
22 @Schema(description = "父箱 ID", example = "0") 23 @Schema(description = "父箱 ID", example = "0")
23 private Long parentId; 24 private Long parentId;
24 25
25 @Schema(description = "装箱日期", requiredMode = Schema.RequiredMode.REQUIRED) 26 @Schema(description = "装箱日期", requiredMode = Schema.RequiredMode.REQUIRED)
26 @NotNull(message = "装箱日期不能为空") 27 @NotNull(message = "装箱日期不能为空")
27 - private LocalDate packageDate; 28 + private LocalDateTime packageDate;
28 29
29 @Schema(description = "销售订单编号", example = "SO20260301") 30 @Schema(description = "销售订单编号", example = "SO20260301")
30 - private String soCode; 31 + private String salesOrderCode;
31 32
32 @Schema(description = "发票编号", example = "INV20260301") 33 @Schema(description = "发票编号", example = "INV20260301")
33 private String invoiceCode; 34 private String invoiceCode;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/line/MesWmPackageLinePageReqVO.java renamed to yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/line/MesWmPackageLinePageReqVO.java
1 -package cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.line; 1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.line;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 import io.swagger.v3.oas.annotations.media.Schema; 4 import io.swagger.v3.oas.annotations.media.Schema;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/line/MesWmPackageLineRespVO.java renamed to yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/line/MesWmPackageLineRespVO.java
1 -package cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.line; 1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.line;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 4 import lombok.Data;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/wmpackage/vo/line/MesWmPackageLineSaveReqVO.java renamed to yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/packages/vo/line/MesWmPackageLineSaveReqVO.java
1 -package cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.line; 1 +package cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.line;
2 2
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import jakarta.validation.constraints.DecimalMin; 4 import jakarta.validation.constraints.DecimalMin;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/wmpackage/MesWmPackageDO.java renamed to yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/packages/MesWmPackageDO.java
1 -// TODO @AI:报名改成 packages 避免 Java 关键字冲突;  
2 -package cn.iocoder.yudao.module.mes.dal.dataobject.wm.wmpackage; 1 +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages;
3 2
4 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
5 import cn.iocoder.yudao.module.mes.dal.dataobject.md.client.MesMdClientDO; 4 import cn.iocoder.yudao.module.mes.dal.dataobject.md.client.MesMdClientDO;
6 import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; 5 import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
7 -import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants;  
8 import com.baomidou.mybatisplus.annotation.KeySequence; 6 import com.baomidou.mybatisplus.annotation.KeySequence;
  7 +import com.baomidou.mybatisplus.annotation.TableField;
9 import com.baomidou.mybatisplus.annotation.TableId; 8 import com.baomidou.mybatisplus.annotation.TableId;
10 import com.baomidou.mybatisplus.annotation.TableName; 9 import com.baomidou.mybatisplus.annotation.TableName;
11 import lombok.*; 10 import lombok.*;
@@ -26,7 +25,7 @@ import java.time.LocalDate; @@ -26,7 +25,7 @@ import java.time.LocalDate;
26 @AllArgsConstructor 25 @AllArgsConstructor
27 public class MesWmPackageDO extends BaseDO { 26 public class MesWmPackageDO extends BaseDO {
28 27
29 - private static final Integer PARENT_ID_ROOT = 0; 28 + public static final Long PARENT_ID_ROOT = 0L;
30 29
31 @TableId 30 @TableId
32 private Long id; 31 private Long id;
@@ -42,11 +41,13 @@ public class MesWmPackageDO extends BaseDO { @@ -42,11 +41,13 @@ public class MesWmPackageDO extends BaseDO {
42 * 装箱日期 41 * 装箱日期
43 */ 42 */
44 private LocalDate packageDate; 43 private LocalDate packageDate;
45 - // TODO @AI:改成 salesOrderCode 44 + // DONE @AI:改成 salesOrderCode
  45 + // TODO @AI:数据库也改;另外前端也检查下;
46 /** 46 /**
47 * 销售订单编号 47 * 销售订单编号
48 */ 48 */
49 - private String soCode; 49 + @TableField("so_code")
  50 + private String salesOrderCode;
50 /** 51 /**
51 * 发票编号 52 * 发票编号
52 */ 53 */
@@ -95,11 +96,10 @@ public class MesWmPackageDO extends BaseDO { @@ -95,11 +96,10 @@ public class MesWmPackageDO extends BaseDO {
95 * 关联 AdminUserDO 的 id 96 * 关联 AdminUserDO 的 id
96 */ 97 */
97 private Long inspectorUserId; 98 private Long inspectorUserId;
98 - // TODO @AI:自定义一个属于自己的枚举类;类似:MesWmSalesNoticeStatusEnum  
99 /** 99 /**
100 * 状态 100 * 状态
101 * 101 *
102 - * 枚举 {@link MesOrderStatusConstants#PREPARE}、{@link MesOrderStatusConstants#FINISHED} 102 + * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.MesWmPackageStatusEnum}
103 */ 103 */
104 private Integer status; 104 private Integer status;
105 /** 105 /**
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/wmpackage/MesWmPackageLineDO.java renamed to yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/packages/MesWmPackageLineDO.java
1 -package cn.iocoder.yudao.module.mes.dal.dataobject.wm.wmpackage; 1 +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages;
2 2
3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; 4 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
@@ -49,7 +49,7 @@ public class MesWmPackageLineDO extends BaseDO { @@ -49,7 +49,7 @@ public class MesWmPackageLineDO extends BaseDO {
49 * 装箱数量 49 * 装箱数量
50 */ 50 */
51 private BigDecimal quantity; 51 private BigDecimal quantity;
52 - // TODO @AI:需要在确认下; 52 + // DONE @芋艿:需要在确认下;
53 /** 53 /**
54 * 生产工单 ID 54 * 生产工单 ID
55 * 55 *
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/wmpackage/MesWmPackageLineMapper.java renamed to yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/packages/MesWmPackageLineMapper.java
1 -package cn.iocoder.yudao.module.mes.dal.mysql.wm.wmpackage; 1 +package cn.iocoder.yudao.module.mes.dal.mysql.wm.packages;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
6 -import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.line.MesWmPackageLinePageReqVO;  
7 -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.wmpackage.MesWmPackageLineDO; 6 +import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.line.MesWmPackageLinePageReqVO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages.MesWmPackageLineDO;
8 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
9 9
10 import java.util.List; 10 import java.util.List;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/wmpackage/MesWmPackageMapper.java renamed to yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/packages/MesWmPackageMapper.java
1 -package cn.iocoder.yudao.module.mes.dal.mysql.wm.wmpackage; 1 +package cn.iocoder.yudao.module.mes.dal.mysql.wm.packages;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 5 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
6 -import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.MesWmPackagePageReqVO;  
7 -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.wmpackage.MesWmPackageDO; 6 +import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.MesWmPackagePageReqVO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages.MesWmPackageDO;
8 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
9 9
10 import java.util.List; 10 import java.util.List;
@@ -15,10 +15,10 @@ public interface MesWmPackageMapper extends BaseMapperX&lt;MesWmPackageDO&gt; { @@ -15,10 +15,10 @@ public interface MesWmPackageMapper extends BaseMapperX&lt;MesWmPackageDO&gt; {
15 default PageResult<MesWmPackageDO> selectPage(MesWmPackagePageReqVO reqVO) { 15 default PageResult<MesWmPackageDO> selectPage(MesWmPackagePageReqVO reqVO) {
16 return selectPage(reqVO, new LambdaQueryWrapperX<MesWmPackageDO>() 16 return selectPage(reqVO, new LambdaQueryWrapperX<MesWmPackageDO>()
17 .likeIfPresent(MesWmPackageDO::getCode, reqVO.getCode()) 17 .likeIfPresent(MesWmPackageDO::getCode, reqVO.getCode())
18 - .likeIfPresent(MesWmPackageDO::getSoCode, reqVO.getSoCode()) 18 + .likeIfPresent(MesWmPackageDO::getSalesOrderCode, reqVO.getSalesOrderCode())
19 .eqIfPresent(MesWmPackageDO::getClientId, reqVO.getClientId()) 19 .eqIfPresent(MesWmPackageDO::getClientId, reqVO.getClientId())
20 - .betweenIfPresent(MesWmPackageDO::getPackageDate, reqVO.getPackageDate())  
21 - .eqIfPresent(MesWmPackageDO::getStatus, reqVO.getStatus()) 20 + .eqIfPresent(MesWmPackageDO::getParentId, reqVO.getParentId())
  21 + .eqIfPresent(MesWmPackageDO::getInspectorUserId, reqVO.getInspectorUserId())
22 .orderByDesc(MesWmPackageDO::getId)); 22 .orderByDesc(MesWmPackageDO::getId));
23 } 23 }
24 24
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
@@ -517,6 +517,7 @@ public interface ErrorCodeConstants { @@ -517,6 +517,7 @@ public interface ErrorCodeConstants {
517 ErrorCode WM_PACKAGE_STATUS_NOT_PREPARE = new ErrorCode(1_040_740_002, "只有草稿状态才允许此操作"); 517 ErrorCode WM_PACKAGE_STATUS_NOT_PREPARE = new ErrorCode(1_040_740_002, "只有草稿状态才允许此操作");
518 ErrorCode WM_PACKAGE_PARENT_NOT_EXISTS = new ErrorCode(1_040_740_003, "父箱不存在"); 518 ErrorCode WM_PACKAGE_PARENT_NOT_EXISTS = new ErrorCode(1_040_740_003, "父箱不存在");
519 ErrorCode WM_PACKAGE_PARENT_SELF = new ErrorCode(1_040_740_004, "不能选择自己作为父箱"); 519 ErrorCode WM_PACKAGE_PARENT_SELF = new ErrorCode(1_040_740_004, "不能选择自己作为父箱");
  520 + ErrorCode WM_PACKAGE_CHILD_HAS_PARENT = new ErrorCode(1_040_740_005, "该装箱单已有父箱,不能重复添加");
520 ErrorCode WM_PACKAGE_LINE_NOT_EXISTS = new ErrorCode(1_040_740_100, "装箱明细不存在"); 521 ErrorCode WM_PACKAGE_LINE_NOT_EXISTS = new ErrorCode(1_040_740_100, "装箱明细不存在");
521 522
522 } 523 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmPackageStatusEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.enums.wm;
  2 +
  3 +import cn.iocoder.yudao.framework.common.core.ArrayValuable;
  4 +import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants;
  5 +import lombok.AllArgsConstructor;
  6 +import lombok.Getter;
  7 +
  8 +import java.util.Arrays;
  9 +
  10 +/**
  11 + * MES 装箱单状态枚举
  12 + */
  13 +@Getter
  14 +@AllArgsConstructor
  15 +public enum MesWmPackageStatusEnum implements ArrayValuable<Integer> {
  16 +
  17 + // TODO @AI:需要增加下: * 对应方法:{@link MesWmOutsourceIssueService#createOutsourceIssue(MesWmOutsourceIssueSaveReqVO)}
  18 + /**
  19 + * 草稿
  20 + */
  21 + PREPARE(MesOrderStatusConstants.PREPARE, "草稿"),
  22 + /**
  23 + * 已完成
  24 + */
  25 + FINISHED(MesOrderStatusConstants.FINISHED, "已完成");
  26 +
  27 + public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesWmPackageStatusEnum::getStatus)
  28 + .toArray(Integer[]::new);
  29 +
  30 + /**
  31 + * 状态值
  32 + */
  33 + private final Integer status;
  34 + /**
  35 + * 状态名
  36 + */
  37 + private final String name;
  38 +
  39 + @Override
  40 + public Integer[] array() {
  41 + return ARRAYS;
  42 + }
  43 +
  44 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/wmpackage/MesWmPackageLineService.java renamed to yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineService.java
1 -package cn.iocoder.yudao.module.mes.service.wm.wmpackage; 1 +package cn.iocoder.yudao.module.mes.service.wm.packages;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 -import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.line.MesWmPackageLinePageReqVO;  
5 -import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.line.MesWmPackageLineSaveReqVO;  
6 -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.wmpackage.MesWmPackageLineDO; 4 +import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.line.MesWmPackageLinePageReqVO;
  5 +import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.line.MesWmPackageLineSaveReqVO;
  6 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages.MesWmPackageLineDO;
7 import jakarta.validation.Valid; 7 import jakarta.validation.Valid;
8 8
9 import java.util.List; 9 import java.util.List;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/wmpackage/MesWmPackageLineServiceImpl.java renamed to yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageLineServiceImpl.java
1 -package cn.iocoder.yudao.module.mes.service.wm.wmpackage; 1 +package cn.iocoder.yudao.module.mes.service.wm.packages;
2 2
3 -import cn.hutool.core.util.ObjUtil;  
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 4 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6 -import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.line.MesWmPackageLinePageReqVO;  
7 -import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.line.MesWmPackageLineSaveReqVO;  
8 -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.wmpackage.MesWmPackageDO;  
9 -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.wmpackage.MesWmPackageLineDO;  
10 -import cn.iocoder.yudao.module.mes.dal.mysql.wm.wmpackage.MesWmPackageLineMapper;  
11 -import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants; 5 +import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.line.MesWmPackageLinePageReqVO;
  6 +import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.line.MesWmPackageLineSaveReqVO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages.MesWmPackageLineDO;
  8 +import cn.iocoder.yudao.module.mes.dal.mysql.wm.packages.MesWmPackageLineMapper;
  9 +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
12 import jakarta.annotation.Resource; 10 import jakarta.annotation.Resource;
13 import org.springframework.context.annotation.Lazy; 11 import org.springframework.context.annotation.Lazy;
14 import org.springframework.stereotype.Service; 12 import org.springframework.stereotype.Service;
@@ -28,13 +26,17 @@ public class MesWmPackageLineServiceImpl implements MesWmPackageLineService { @@ -28,13 +26,17 @@ public class MesWmPackageLineServiceImpl implements MesWmPackageLineService {
28 @Resource 26 @Resource
29 @Lazy 27 @Lazy
30 private MesWmPackageService packageService; 28 private MesWmPackageService packageService;
  29 + @Resource
  30 + private MesMdItemService itemService;
31 31
32 @Override 32 @Override
33 public Long createPackageLine(MesWmPackageLineSaveReqVO createReqVO) { 33 public Long createPackageLine(MesWmPackageLineSaveReqVO createReqVO) {
34 - // TODO @AI:检查关联的 packageId(草稿)、itemId  
35 -  
36 // 校验装箱单状态为草稿 34 // 校验装箱单状态为草稿
37 - validatePackageStatusDraft(createReqVO.getPackageId()); 35 + packageService.validatePackageStatusDraft(createReqVO.getPackageId());
  36 + // 校验产品物料存在
  37 + itemService.validateItemExists(createReqVO.getItemId());
  38 +
  39 + // 插入
38 MesWmPackageLineDO line = BeanUtils.toBean(createReqVO, MesWmPackageLineDO.class); 40 MesWmPackageLineDO line = BeanUtils.toBean(createReqVO, MesWmPackageLineDO.class);
39 packageLineMapper.insert(line); 41 packageLineMapper.insert(line);
40 return line.getId(); 42 return line.getId();
@@ -44,10 +46,12 @@ public class MesWmPackageLineServiceImpl implements MesWmPackageLineService { @@ -44,10 +46,12 @@ public class MesWmPackageLineServiceImpl implements MesWmPackageLineService {
44 public void updatePackageLine(MesWmPackageLineSaveReqVO updateReqVO) { 46 public void updatePackageLine(MesWmPackageLineSaveReqVO updateReqVO) {
45 // 校验存在 47 // 校验存在
46 MesWmPackageLineDO line = validatePackageLineExists(updateReqVO.getId()); 48 MesWmPackageLineDO line = validatePackageLineExists(updateReqVO.getId());
47 - // TODO @AI:检查关联的 packageId(草稿)、itemId  
48 -  
49 // 校验装箱单状态为草稿 49 // 校验装箱单状态为草稿
50 - validatePackageStatusDraft(line.getPackageId()); 50 + packageService.validatePackageStatusDraft(line.getPackageId());
  51 + // 校验产品物料存在
  52 + itemService.validateItemExists(updateReqVO.getItemId());
  53 +
  54 + // 更新
51 MesWmPackageLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmPackageLineDO.class); 55 MesWmPackageLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmPackageLineDO.class);
52 packageLineMapper.updateById(updateObj); 56 packageLineMapper.updateById(updateObj);
53 } 57 }
@@ -57,7 +61,7 @@ public class MesWmPackageLineServiceImpl implements MesWmPackageLineService { @@ -57,7 +61,7 @@ public class MesWmPackageLineServiceImpl implements MesWmPackageLineService {
57 // 校验存在 61 // 校验存在
58 MesWmPackageLineDO line = validatePackageLineExists(id); 62 MesWmPackageLineDO line = validatePackageLineExists(id);
59 // 校验装箱单状态为草稿 63 // 校验装箱单状态为草稿
60 - validatePackageStatusDraft(line.getPackageId()); 64 + packageService.validatePackageStatusDraft(line.getPackageId());
61 65
62 // 删除 66 // 删除
63 packageLineMapper.deleteById(id); 67 packageLineMapper.deleteById(id);
@@ -93,15 +97,4 @@ public class MesWmPackageLineServiceImpl implements MesWmPackageLineService { @@ -93,15 +97,4 @@ public class MesWmPackageLineServiceImpl implements MesWmPackageLineService {
93 return line; 97 return line;
94 } 98 }
95 99
96 - // TODO @AI:这个方法,应该 packageService 实现;  
97 - private void validatePackageStatusDraft(Long packageId) {  
98 - MesWmPackageDO packageDO = packageService.getPackage(packageId);  
99 - if (packageDO == null) {  
100 - throw exception(WM_PACKAGE_NOT_EXISTS);  
101 - }  
102 - if (ObjUtil.notEqual(MesOrderStatusConstants.PREPARE, packageDO.getStatus())) {  
103 - throw exception(WM_PACKAGE_STATUS_NOT_PREPARE);  
104 - }  
105 - }  
106 -  
107 } 100 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/wmpackage/MesWmPackageService.java renamed to yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageService.java
1 -package cn.iocoder.yudao.module.mes.service.wm.wmpackage; 1 +package cn.iocoder.yudao.module.mes.service.wm.packages;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageResult; 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 -import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.MesWmPackagePageReqVO;  
5 -import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.MesWmPackageSaveReqVO;  
6 -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.wmpackage.MesWmPackageDO; 4 +import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.MesWmPackagePageReqVO;
  5 +import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.MesWmPackageSaveReqVO;
  6 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages.MesWmPackageDO;
7 import jakarta.validation.Valid; 7 import jakarta.validation.Valid;
8 8
9 import java.util.List; 9 import java.util.List;
@@ -59,10 +59,32 @@ public interface MesWmPackageService { @@ -59,10 +59,32 @@ public interface MesWmPackageService {
59 void finishPackage(Long id); 59 void finishPackage(Long id);
60 60
61 /** 61 /**
62 - * 获得装箱单树形结构 62 + * 校验装箱单状态为草稿
63 * 63 *
64 - * @return 装箱单列表(树形) 64 + * @param packageId 装箱单 ID
65 */ 65 */
66 - List<MesWmPackageDO> getPackageTree(); 66 + void validatePackageStatusDraft(Long packageId);
  67 +
  68 + /**
  69 + * 添加子箱
  70 + *
  71 + * @param parentId 父箱 ID
  72 + * @param childId 子箱 ID
  73 + */
  74 + void addSubPackage(Long parentId, Long childId);
  75 +
  76 + /**
  77 + * 移除子箱
  78 + *
  79 + * @param childId 子箱 ID
  80 + */
  81 + void removeSubPackage(Long childId);
  82 +
  83 + /**
  84 + * 获取装箱单精简列表(无父箱 + 已完成状态)
  85 + *
  86 + * @return 装箱单列表
  87 + */
  88 + List<MesWmPackageDO> getPackageSimpleList();
67 89
68 } 90 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/wmpackage/MesWmPackageServiceImpl.java renamed to yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/packages/MesWmPackageServiceImpl.java
1 -package cn.iocoder.yudao.module.mes.service.wm.wmpackage; 1 +package cn.iocoder.yudao.module.mes.service.wm.packages;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.ObjUtil; 4 import cn.hutool.core.util.ObjUtil;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
7 -import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.MesWmPackagePageReqVO;  
8 -import cn.iocoder.yudao.module.mes.controller.admin.wm.wmpackage.vo.MesWmPackageSaveReqVO;  
9 -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.wmpackage.MesWmPackageDO;  
10 -import cn.iocoder.yudao.module.mes.dal.mysql.wm.wmpackage.MesWmPackageMapper;  
11 -import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants; 7 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  8 +import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.MesWmPackagePageReqVO;
  9 +import cn.iocoder.yudao.module.mes.controller.admin.wm.packages.vo.MesWmPackageSaveReqVO;
  10 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.packages.MesWmPackageDO;
  11 +import cn.iocoder.yudao.module.mes.dal.mysql.wm.packages.MesWmPackageMapper;
  12 +import cn.iocoder.yudao.module.mes.enums.wm.MesWmPackageStatusEnum;
12 import jakarta.annotation.Resource; 13 import jakarta.annotation.Resource;
13 import org.springframework.stereotype.Service; 14 import org.springframework.stereotype.Service;
14 import org.springframework.transaction.annotation.Transactional; 15 import org.springframework.transaction.annotation.Transactional;
@@ -33,14 +34,13 @@ public class MesWmPackageServiceImpl implements MesWmPackageService { @@ -33,14 +34,13 @@ public class MesWmPackageServiceImpl implements MesWmPackageService {
33 // 校验编码唯一性 34 // 校验编码唯一性
34 validateCodeUnique(null, createReqVO.getCode()); 35 validateCodeUnique(null, createReqVO.getCode());
35 // 校验父箱存在 36 // 校验父箱存在
  37 + // TODO @AI:parentId 校验都去掉,不传递了;
36 validateParentExists(createReqVO.getParentId()); 38 validateParentExists(createReqVO.getParentId());
37 39
38 // 创建装箱单,默认为草稿状态 40 // 创建装箱单,默认为草稿状态
39 MesWmPackageDO packageDO = BeanUtils.toBean(createReqVO, MesWmPackageDO.class); 41 MesWmPackageDO packageDO = BeanUtils.toBean(createReqVO, MesWmPackageDO.class);
40 - packageDO.setStatus(MesOrderStatusConstants.PREPARE);  
41 - if (packageDO.getParentId() == null) {  
42 - packageDO.setParentId(0L);  
43 - } 42 + packageDO.setStatus(MesWmPackageStatusEnum.PREPARE.getStatus())
  43 + .setParentId(MesWmPackageDO.PARENT_ID_ROOT);
44 packageMapper.insert(packageDO); 44 packageMapper.insert(packageDO);
45 return packageDO.getId(); 45 return packageDO.getId();
46 } 46 }
@@ -51,7 +51,8 @@ public class MesWmPackageServiceImpl implements MesWmPackageService { @@ -51,7 +51,8 @@ public class MesWmPackageServiceImpl implements MesWmPackageService {
51 validatePackageExistsAndDraft(updateReqVO.getId()); 51 validatePackageExistsAndDraft(updateReqVO.getId());
52 // 校验编码唯一性 52 // 校验编码唯一性
53 validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); 53 validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode());
54 - // TODO @AI:是不是创建一个方法,校验 parent;因为 create 和 update 都需要; 54 + // TODO @AI:parentId 校验都去掉,不传递了;
  55 + // DONE @AI:是不是创建一个方法,校验 parent;因为 create 和 update 都需要;
55 // 校验父箱存在,且不能选自己或子节点 56 // 校验父箱存在,且不能选自己或子节点
56 validateParentExists(updateReqVO.getParentId()); 57 validateParentExists(updateReqVO.getParentId());
57 if (updateReqVO.getParentId() != null && ObjUtil.equal(updateReqVO.getParentId(), updateReqVO.getId())) { 58 if (updateReqVO.getParentId() != null && ObjUtil.equal(updateReqVO.getParentId(), updateReqVO.getId())) {
@@ -100,12 +101,55 @@ public class MesWmPackageServiceImpl implements MesWmPackageService { @@ -100,12 +101,55 @@ public class MesWmPackageServiceImpl implements MesWmPackageService {
100 101
101 // 更新状态为已完成 102 // 更新状态为已完成
102 packageMapper.updateById(new MesWmPackageDO() 103 packageMapper.updateById(new MesWmPackageDO()
103 - .setId(id).setStatus(MesOrderStatusConstants.FINISHED)); 104 + .setId(id).setStatus(MesWmPackageStatusEnum.FINISHED.getStatus()));
  105 + }
  106 +
  107 + @Override
  108 + public void validatePackageStatusDraft(Long packageId) {
  109 + validatePackageExistsAndDraft(packageId);
  110 + }
  111 +
  112 + @Override
  113 + public void addSubPackage(Long parentId, Long childId) {
  114 + // 校验父箱存在且为草稿
  115 + validatePackageExistsAndDraft(parentId);
  116 + // 校验子箱存在
  117 + MesWmPackageDO child = validatePackageExists(childId);
  118 + // TODO @AI:参考 validateParentDept 的实现;
  119 + // 校验子箱没有父箱(parentId 为 0 或 null)
  120 + if (child.getParentId() != null && child.getParentId() != 0L) {
  121 + throw exception(WM_PACKAGE_CHILD_HAS_PARENT);
  122 + }
  123 + // 不能将自己作为子箱
  124 + if (ObjUtil.equal(parentId, childId)) {
  125 + throw exception(WM_PACKAGE_PARENT_SELF);
  126 + }
  127 +
  128 + // 设置子箱的 parentId
  129 + packageMapper.updateById(new MesWmPackageDO().setId(childId).setParentId(parentId));
  130 + }
  131 +
  132 + @Override
  133 + public void removeSubPackage(Long childId) {
  134 + // 校验子箱存在
  135 + MesWmPackageDO child = validatePackageExists(childId);
  136 + // 校验父箱存在且为草稿
  137 + // TODO @AI:notEquals(null, 和 MesWmPackageDO.PARENT_ID_ROOT)
  138 + if (child.getParentId() != null && child.getParentId() != 0L) {
  139 + validatePackageExistsAndDraft(child.getParentId());
  140 + }
  141 +
  142 + // 清除 parentId
  143 + packageMapper.updateById(new MesWmPackageDO().setId(childId).setParentId(MesWmPackageDO.PARENT_ID_ROOT));
104 } 144 }
105 145
106 @Override 146 @Override
107 - public List<MesWmPackageDO> getPackageTree() {  
108 - return packageMapper.selectList(); 147 + public List<MesWmPackageDO> getPackageSimpleList() {
  148 + return packageMapper.selectList(new LambdaQueryWrapperX<MesWmPackageDO>()
  149 + // TODO @AI:这些不要直接写在 service 里,要和 mybatis plus 解耦;通过条件传递下去;
  150 + .eq(MesWmPackageDO::getParentId, 0L)
  151 + .eq(MesWmPackageDO::getStatus, MesWmPackageStatusEnum.FINISHED.getStatus())
  152 + .orderByDesc(MesWmPackageDO::getId));
109 } 153 }
110 154
111 // ========== 校验方法 ========== 155 // ========== 校验方法 ==========
@@ -120,7 +164,7 @@ public class MesWmPackageServiceImpl implements MesWmPackageService { @@ -120,7 +164,7 @@ public class MesWmPackageServiceImpl implements MesWmPackageService {
120 164
121 private MesWmPackageDO validatePackageExistsAndDraft(Long id) { 165 private MesWmPackageDO validatePackageExistsAndDraft(Long id) {
122 MesWmPackageDO packageDO = validatePackageExists(id); 166 MesWmPackageDO packageDO = validatePackageExists(id);
123 - if (ObjUtil.notEqual(MesOrderStatusConstants.PREPARE, packageDO.getStatus())) { 167 + if (ObjUtil.notEqual(MesWmPackageStatusEnum.PREPARE.getStatus(), packageDO.getStatus())) {
124 throw exception(WM_PACKAGE_STATUS_NOT_PREPARE); 168 throw exception(WM_PACKAGE_STATUS_NOT_PREPARE);
125 } 169 }
126 return packageDO; 170 return packageDO;