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 3 import cn.hutool.core.collection.CollUtil;
4   -import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
5 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
6   -import cn.iocoder.yudao.framework.common.pojo.PageParam;
7 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
8 6 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
9 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 11 import cn.iocoder.yudao.module.mes.dal.dataobject.md.client.MesMdClientDO;
15 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 14 import cn.iocoder.yudao.module.mes.service.md.client.MesMdClientService;
18 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 17 import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
21 18 import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
22 19 import io.swagger.v3.oas.annotations.Operation;
23 20 import io.swagger.v3.oas.annotations.Parameter;
24 21 import io.swagger.v3.oas.annotations.tags.Tag;
25 22 import jakarta.annotation.Resource;
26   -import jakarta.servlet.http.HttpServletResponse;
27 23 import jakarta.validation.Valid;
28 24 import org.springframework.security.access.prepost.PreAuthorize;
29 25 import org.springframework.validation.annotation.Validated;
30 26 import org.springframework.web.bind.annotation.*;
31 27  
32   -import java.io.IOException;
33 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 30 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
38 31 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
39 32  
... ... @@ -97,18 +90,6 @@ public class MesWmPackageController {
97 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 93 @PutMapping("/finish")
113 94 @Operation(summary = "完成装箱单")
114 95 @Parameter(name = "id", description = "编号", required = true)
... ... @@ -118,14 +99,30 @@ public class MesWmPackageController {
118 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 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 135 Map<Long, MesMdClientDO> clientMap = clientService.getClientMap(
139 136 convertSet(list, MesWmPackageDO::getClientId));
140 137 // 批量查询计量单位(尺寸 + 重量)
  138 + // TODO @AI:可以通过 CollecionUtils 里,通过 flat 操作;
141 139 Set<Long> unitIds = new HashSet<>();
142 140 list.forEach(p -> {
143 141 if (p.getSizeUnitId() != null) {
... ... @@ -151,7 +149,7 @@ public class MesWmPackageController {
151 149 // 批量查询检查员
152 150 Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
153 151 convertSet(list, MesWmPackageDO::getInspectorUserId));
154   -
  152 + // 构建返回结果
155 153 return BeanUtils.toBean(list, MesWmPackageRespVO.class, vo -> {
156 154 MapUtils.findAndThen(clientMap, vo.getClientId(),
157 155 client -> vo.setClientCode(client.getCode()).setClientName(client.getName())
... ... @@ -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 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 6 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
7 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 11 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
12 12 import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
13 13 import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderDO;
14 14 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
15 15 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
16 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 18 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
19 19 import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
20 20 import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderService;
21 21 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
22 22 import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
23 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 25 import io.swagger.v3.oas.annotations.Operation;
26 26 import io.swagger.v3.oas.annotations.Parameter;
27 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 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 4 import io.swagger.v3.oas.annotations.media.Schema;
5 5 import lombok.Data;
6 6 import lombok.EqualsAndHashCode;
7 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 9 @Schema(description = "管理后台 - MES 装箱单分页 Request VO")
15 10 @Data
... ... @@ -21,16 +16,15 @@ public class MesWmPackagePageReqVO extends PageParam {
21 16 private String code;
22 17  
23 18 @Schema(description = "销售订单编号", example = "SO")
24   - private String soCode;
  19 + private String salesOrderCode;
25 20  
26 21 @Schema(description = "客户 ID", example = "1")
27 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 3 import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
4 4 import cn.idev.excel.annotation.ExcelProperty;
... ... @@ -7,9 +7,7 @@ import lombok.Data;
7 7 import lombok.experimental.Accessors;
8 8  
9 9 import java.math.BigDecimal;
10   -import java.time.LocalDate;
11 10 import java.time.LocalDateTime;
12   -import java.util.List;
13 11  
14 12 @Schema(description = "管理后台 - MES 装箱单 Response VO")
15 13 @Data
... ... @@ -30,11 +28,11 @@ public class MesWmPackageRespVO {
30 28  
31 29 @Schema(description = "装箱日期")
32 30 @ExcelProperty("装箱日期")
33   - private LocalDate packageDate;
  31 + private LocalDateTime packageDate;
34 32  
35 33 @Schema(description = "销售订单编号", example = "SO20260301")
36 34 @ExcelProperty("销售订单编号")
37   - private String soCode;
  35 + private String salesOrderCode;
38 36  
39 37 @Schema(description = "发票编号", example = "INV20260301")
40 38 @ExcelProperty("发票编号")
... ... @@ -107,7 +105,4 @@ public class MesWmPackageRespVO {
107 105 @ExcelProperty("创建时间")
108 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 3 import io.swagger.v3.oas.annotations.media.Schema;
4 4 import jakarta.validation.constraints.NotEmpty;
... ... @@ -6,7 +6,7 @@ import jakarta.validation.constraints.NotNull;
6 6 import lombok.Data;
7 7  
8 8 import java.math.BigDecimal;
9   -import java.time.LocalDate;
  9 +import java.time.LocalDateTime;
10 10  
11 11 @Schema(description = "管理后台 - MES 装箱单新增/修改 Request VO")
12 12 @Data
... ... @@ -19,15 +19,16 @@ public class MesWmPackageSaveReqVO {
19 19 @NotEmpty(message = "装箱单编号不能为空")
20 20 private String code;
21 21  
  22 + // TODO @AI:不传递 parentId;默认都是 = 0;
22 23 @Schema(description = "父箱 ID", example = "0")
23 24 private Long parentId;
24 25  
25 26 @Schema(description = "装箱日期", requiredMode = Schema.RequiredMode.REQUIRED)
26 27 @NotNull(message = "装箱日期不能为空")
27   - private LocalDate packageDate;
  28 + private LocalDateTime packageDate;
28 29  
29 30 @Schema(description = "销售订单编号", example = "SO20260301")
30   - private String soCode;
  31 + private String salesOrderCode;
31 32  
32 33 @Schema(description = "发票编号", example = "INV20260301")
33 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 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
4 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 3 import io.swagger.v3.oas.annotations.media.Schema;
4 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 3 import io.swagger.v3.oas.annotations.media.Schema;
4 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 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
5 4 import cn.iocoder.yudao.module.mes.dal.dataobject.md.client.MesMdClientDO;
6 5 import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
7   -import cn.iocoder.yudao.module.mes.enums.MesOrderStatusConstants;
8 6 import com.baomidou.mybatisplus.annotation.KeySequence;
  7 +import com.baomidou.mybatisplus.annotation.TableField;
9 8 import com.baomidou.mybatisplus.annotation.TableId;
10 9 import com.baomidou.mybatisplus.annotation.TableName;
11 10 import lombok.*;
... ... @@ -26,7 +25,7 @@ import java.time.LocalDate;
26 25 @AllArgsConstructor
27 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 30 @TableId
32 31 private Long id;
... ... @@ -42,11 +41,13 @@ public class MesWmPackageDO extends BaseDO {
42 41 * 装箱日期
43 42 */
44 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 96 * 关联 AdminUserDO 的 id
96 97 */
97 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 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 3 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
4 4 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
... ... @@ -49,7 +49,7 @@ public class MesWmPackageLineDO extends BaseDO {
49 49 * 装箱数量
50 50 */
51 51 private BigDecimal quantity;
52   - // TODO @AI:需要在确认下;
  52 + // DONE @芋艿:需要在确认下;
53 53 /**
54 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 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 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 8 import org.apache.ibatis.annotations.Mapper;
9 9  
10 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 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
4 4 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
5 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 8 import org.apache.ibatis.annotations.Mapper;
9 9  
10 10 import java.util.List;
... ... @@ -15,10 +15,10 @@ public interface MesWmPackageMapper extends BaseMapperX&lt;MesWmPackageDO&gt; {
15 15 default PageResult<MesWmPackageDO> selectPage(MesWmPackagePageReqVO reqVO) {
16 16 return selectPage(reqVO, new LambdaQueryWrapperX<MesWmPackageDO>()
17 17 .likeIfPresent(MesWmPackageDO::getCode, reqVO.getCode())
18   - .likeIfPresent(MesWmPackageDO::getSoCode, reqVO.getSoCode())
  18 + .likeIfPresent(MesWmPackageDO::getSalesOrderCode, reqVO.getSalesOrderCode())
19 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 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 517 ErrorCode WM_PACKAGE_STATUS_NOT_PREPARE = new ErrorCode(1_040_740_002, "只有草稿状态才允许此操作");
518 518 ErrorCode WM_PACKAGE_PARENT_NOT_EXISTS = new ErrorCode(1_040_740_003, "父箱不存在");
519 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 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 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 7 import jakarta.validation.Valid;
8 8  
9 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 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 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 10 import jakarta.annotation.Resource;
13 11 import org.springframework.context.annotation.Lazy;
14 12 import org.springframework.stereotype.Service;
... ... @@ -28,13 +26,17 @@ public class MesWmPackageLineServiceImpl implements MesWmPackageLineService {
28 26 @Resource
29 27 @Lazy
30 28 private MesWmPackageService packageService;
  29 + @Resource
  30 + private MesMdItemService itemService;
31 31  
32 32 @Override
33 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 40 MesWmPackageLineDO line = BeanUtils.toBean(createReqVO, MesWmPackageLineDO.class);
39 41 packageLineMapper.insert(line);
40 42 return line.getId();
... ... @@ -44,10 +46,12 @@ public class MesWmPackageLineServiceImpl implements MesWmPackageLineService {
44 46 public void updatePackageLine(MesWmPackageLineSaveReqVO updateReqVO) {
45 47 // 校验存在
46 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 55 MesWmPackageLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmPackageLineDO.class);
52 56 packageLineMapper.updateById(updateObj);
53 57 }
... ... @@ -57,7 +61,7 @@ public class MesWmPackageLineServiceImpl implements MesWmPackageLineService {
57 61 // 校验存在
58 62 MesWmPackageLineDO line = validatePackageLineExists(id);
59 63 // 校验装箱单状态为草稿
60   - validatePackageStatusDraft(line.getPackageId());
  64 + packageService.validatePackageStatusDraft(line.getPackageId());
61 65  
62 66 // 删除
63 67 packageLineMapper.deleteById(id);
... ... @@ -93,15 +97,4 @@ public class MesWmPackageLineServiceImpl implements MesWmPackageLineService {
93 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 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 7 import jakarta.validation.Valid;
8 8  
9 9 import java.util.List;
... ... @@ -59,10 +59,32 @@ public interface MesWmPackageService {
59 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 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.util.ObjUtil;
5 5 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 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 13 import jakarta.annotation.Resource;
13 14 import org.springframework.stereotype.Service;
14 15 import org.springframework.transaction.annotation.Transactional;
... ... @@ -33,14 +34,13 @@ public class MesWmPackageServiceImpl implements MesWmPackageService {
33 34 // 校验编码唯一性
34 35 validateCodeUnique(null, createReqVO.getCode());
35 36 // 校验父箱存在
  37 + // TODO @AI:parentId 校验都去掉,不传递了;
36 38 validateParentExists(createReqVO.getParentId());
37 39  
38 40 // 创建装箱单,默认为草稿状态
39 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 44 packageMapper.insert(packageDO);
45 45 return packageDO.getId();
46 46 }
... ... @@ -51,7 +51,8 @@ public class MesWmPackageServiceImpl implements MesWmPackageService {
51 51 validatePackageExistsAndDraft(updateReqVO.getId());
52 52 // 校验编码唯一性
53 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 57 validateParentExists(updateReqVO.getParentId());
57 58 if (updateReqVO.getParentId() != null && ObjUtil.equal(updateReqVO.getParentId(), updateReqVO.getId())) {
... ... @@ -100,12 +101,55 @@ public class MesWmPackageServiceImpl implements MesWmPackageService {
100 101  
101 102 // 更新状态为已完成
102 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 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 164  
121 165 private MesWmPackageDO validatePackageExistsAndDraft(Long id) {
122 166 MesWmPackageDO packageDO = validatePackageExists(id);
123   - if (ObjUtil.notEqual(MesOrderStatusConstants.PREPARE, packageDO.getStatus())) {
  167 + if (ObjUtil.notEqual(MesWmPackageStatusEnum.PREPARE.getStatus(), packageDO.getStatus())) {
124 168 throw exception(WM_PACKAGE_STATUS_NOT_PREPARE);
125 169 }
126 170 return packageDO;
... ...