Commit 6358bff95194516c00e4d9d17a57e0619cf1eaa8

Authored by YunaiV
1 parent 5a16d833

✨ feat(mes): 添加仓库、库区和库位名称字段及相关校验

yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/MesWmMiscIssueLineController.java
@@ -11,9 +11,15 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.miscissue.vo.line.MesWmMi @@ -11,9 +11,15 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.miscissue.vo.line.MesWmMi
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.wm.miscissue.MesWmMiscIssueLineDO; 13 import cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscissue.MesWmMiscIssueLineDO;
  14 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
  15 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
  16 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
14 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; 17 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
15 import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; 18 import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
16 import cn.iocoder.yudao.module.mes.service.wm.miscissue.MesWmMiscIssueLineService; 19 import cn.iocoder.yudao.module.mes.service.wm.miscissue.MesWmMiscIssueLineService;
  20 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService;
  21 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
  22 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
17 import io.swagger.v3.oas.annotations.Operation; 23 import io.swagger.v3.oas.annotations.Operation;
18 import io.swagger.v3.oas.annotations.Parameter; 24 import io.swagger.v3.oas.annotations.Parameter;
19 import io.swagger.v3.oas.annotations.tags.Tag; 25 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -45,6 +51,15 @@ public class MesWmMiscIssueLineController { @@ -45,6 +51,15 @@ public class MesWmMiscIssueLineController {
45 @Resource 51 @Resource
46 private MesMdUnitMeasureService unitMeasureService; 52 private MesMdUnitMeasureService unitMeasureService;
47 53
  54 + @Resource
  55 + private MesWmWarehouseService warehouseService;
  56 +
  57 + @Resource
  58 + private MesWmWarehouseLocationService warehouseLocationService;
  59 +
  60 + @Resource
  61 + private MesWmWarehouseAreaService warehouseAreaService;
  62 +
48 @PostMapping("/create") 63 @PostMapping("/create")
49 @Operation(summary = "创建杂项出库单行") 64 @Operation(summary = "创建杂项出库单行")
50 @PreAuthorize("@ss.hasPermission('mes:wm-misc-issue:create')") 65 @PreAuthorize("@ss.hasPermission('mes:wm-misc-issue:create')")
@@ -101,6 +116,13 @@ public class MesWmMiscIssueLineController { @@ -101,6 +116,13 @@ public class MesWmMiscIssueLineController {
101 convertSet(list, MesWmMiscIssueLineDO::getItemId)); 116 convertSet(list, MesWmMiscIssueLineDO::getItemId));
102 Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap( 117 Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
103 convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); 118 convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
  119 + Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
  120 + convertSet(list, MesWmMiscIssueLineDO::getWarehouseId));
  121 + Map<Long, MesWmWarehouseLocationDO> locationMap = warehouseLocationService.getWarehouseLocationMap(
  122 + convertSet(list, MesWmMiscIssueLineDO::getLocationId));
  123 + Map<Long, MesWmWarehouseAreaDO> areaMap = warehouseAreaService.getWarehouseAreaMap(
  124 + convertSet(list, MesWmMiscIssueLineDO::getAreaId));
  125 +
104 // 2. 构建结果 126 // 2. 构建结果
105 return BeanUtils.toBean(list, MesWmMiscIssueLineRespVO.class, vo -> { 127 return BeanUtils.toBean(list, MesWmMiscIssueLineRespVO.class, vo -> {
106 MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { 128 MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
@@ -108,6 +130,9 @@ public class MesWmMiscIssueLineController { @@ -108,6 +130,9 @@ public class MesWmMiscIssueLineController {
108 MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), 130 MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(),
109 unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); 131 unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName()));
110 }); 132 });
  133 + MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> vo.setWarehouseName(warehouse.getName()));
  134 + MapUtils.findAndThen(locationMap, vo.getLocationId(), location -> vo.setLocationName(location.getName()));
  135 + MapUtils.findAndThen(areaMap, vo.getAreaId(), area -> vo.setAreaName(area.getName()));
111 }); 136 });
112 } 137 }
113 138
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssueSaveReqVO.java
@@ -35,7 +35,8 @@ public class MesWmMiscIssueSaveReqVO { @@ -35,7 +35,8 @@ public class MesWmMiscIssueSaveReqVO {
35 @Schema(description = "来源单据类型", example = "PURCHASE_ORDER") 35 @Schema(description = "来源单据类型", example = "PURCHASE_ORDER")
36 private String sourceDocType; 36 private String sourceDocType;
37 37
38 - @Schema(description = "出库日期") 38 + @Schema(description = "出库日期", requiredMode = Schema.RequiredMode.REQUIRED)
  39 + @NotNull(message = "出库日期不能为空")
39 private LocalDateTime issueDate; 40 private LocalDateTime issueDate;
40 41
41 @Schema(description = "备注", example = "备注") 42 @Schema(description = "备注", example = "备注")
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/line/MesWmMiscIssueLineRespVO.java
@@ -52,6 +52,15 @@ public class MesWmMiscIssueLineRespVO { @@ -52,6 +52,15 @@ public class MesWmMiscIssueLineRespVO {
52 @Schema(description = "库位编号", example = "1") 52 @Schema(description = "库位编号", example = "1")
53 private Long areaId; 53 private Long areaId;
54 54
  55 + @Schema(description = "仓库名称", example = "原料仓")
  56 + private String warehouseName;
  57 +
  58 + @Schema(description = "库区名称", example = "A区")
  59 + private String locationName;
  60 +
  61 + @Schema(description = "库位名称", example = "1排1架")
  62 + private String areaName;
  63 +
55 @Schema(description = "备注", example = "备注") 64 @Schema(description = "备注", example = "备注")
56 private String remark; 65 private String remark;
57 66
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/MesWmMiscReceiptLineController.java
@@ -17,9 +17,24 @@ import org.springframework.security.access.prepost.PreAuthorize; @@ -17,9 +17,24 @@ import org.springframework.security.access.prepost.PreAuthorize;
17 import org.springframework.validation.annotation.Validated; 17 import org.springframework.validation.annotation.Validated;
18 import org.springframework.web.bind.annotation.*; 18 import org.springframework.web.bind.annotation.*;
19 19
  20 +import java.util.Collections;
20 import java.util.List; 21 import java.util.List;
  22 +import java.util.Map;
21 23
22 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 24 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  25 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
  26 +import cn.hutool.core.collection.CollUtil;
  27 +import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
  28 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
  29 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
  30 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO;
  31 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO;
  32 +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO;
  33 +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
  34 +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
  35 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService;
  36 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService;
  37 +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService;
23 38
24 /** 39 /**
25 * MES 杂项入库单行 Controller 40 * MES 杂项入库单行 Controller
@@ -33,6 +48,21 @@ public class MesWmMiscReceiptLineController { @@ -33,6 +48,21 @@ public class MesWmMiscReceiptLineController {
33 @Resource 48 @Resource
34 private MesWmMiscReceiptLineService miscReceiptLineService; 49 private MesWmMiscReceiptLineService miscReceiptLineService;
35 50
  51 + @Resource
  52 + private MesMdItemService itemService;
  53 +
  54 + @Resource
  55 + private MesMdUnitMeasureService unitMeasureService;
  56 +
  57 + @Resource
  58 + private MesWmWarehouseService warehouseService;
  59 +
  60 + @Resource
  61 + private MesWmWarehouseLocationService warehouseLocationService;
  62 +
  63 + @Resource
  64 + private MesWmWarehouseAreaService warehouseAreaService;
  65 +
36 @PostMapping("/create") 66 @PostMapping("/create")
37 @Operation(summary = "创建杂项入库单行") 67 @Operation(summary = "创建杂项入库单行")
38 @PreAuthorize("@ss.hasPermission('mes:wm:misc-receipt:create')") 68 @PreAuthorize("@ss.hasPermission('mes:wm:misc-receipt:create')")
@@ -63,7 +93,10 @@ public class MesWmMiscReceiptLineController { @@ -63,7 +93,10 @@ public class MesWmMiscReceiptLineController {
63 @PreAuthorize("@ss.hasPermission('mes:wm:misc-receipt:query')") 93 @PreAuthorize("@ss.hasPermission('mes:wm:misc-receipt:query')")
64 public CommonResult<MesWmMiscReceiptLineRespVO> getMiscReceiptLine(@RequestParam("id") Long id) { 94 public CommonResult<MesWmMiscReceiptLineRespVO> getMiscReceiptLine(@RequestParam("id") Long id) {
65 MesWmMiscReceiptLineDO line = miscReceiptLineService.getMiscReceiptLine(id); 95 MesWmMiscReceiptLineDO line = miscReceiptLineService.getMiscReceiptLine(id);
66 - return success(BeanUtils.toBean(line, MesWmMiscReceiptLineRespVO.class)); 96 + if (line == null) {
  97 + return success(null);
  98 + }
  99 + return success(buildRespVOList(Collections.singletonList(line)).get(0));
67 } 100 }
68 101
69 @GetMapping("/list-by-receipt-id") 102 @GetMapping("/list-by-receipt-id")
@@ -72,7 +105,7 @@ public class MesWmMiscReceiptLineController { @@ -72,7 +105,7 @@ public class MesWmMiscReceiptLineController {
72 @PreAuthorize("@ss.hasPermission('mes:wm:misc-receipt:query')") 105 @PreAuthorize("@ss.hasPermission('mes:wm:misc-receipt:query')")
73 public CommonResult<List<MesWmMiscReceiptLineRespVO>> getMiscReceiptLineListByReceiptId(@RequestParam("receiptId") Long receiptId) { 106 public CommonResult<List<MesWmMiscReceiptLineRespVO>> getMiscReceiptLineListByReceiptId(@RequestParam("receiptId") Long receiptId) {
74 List<MesWmMiscReceiptLineDO> list = miscReceiptLineService.getMiscReceiptLineListByReceiptId(receiptId); 107 List<MesWmMiscReceiptLineDO> list = miscReceiptLineService.getMiscReceiptLineListByReceiptId(receiptId);
75 - return success(BeanUtils.toBean(list, MesWmMiscReceiptLineRespVO.class)); 108 + return success(buildRespVOList(list));
76 } 109 }
77 110
78 @GetMapping("/page") 111 @GetMapping("/page")
@@ -80,7 +113,38 @@ public class MesWmMiscReceiptLineController { @@ -80,7 +113,38 @@ public class MesWmMiscReceiptLineController {
80 @PreAuthorize("@ss.hasPermission('mes:wm:misc-receipt:query')") 113 @PreAuthorize("@ss.hasPermission('mes:wm:misc-receipt:query')")
81 public CommonResult<PageResult<MesWmMiscReceiptLineRespVO>> getMiscReceiptLinePage(@Valid MesWmMiscReceiptLinePageReqVO pageReqVO) { 114 public CommonResult<PageResult<MesWmMiscReceiptLineRespVO>> getMiscReceiptLinePage(@Valid MesWmMiscReceiptLinePageReqVO pageReqVO) {
82 PageResult<MesWmMiscReceiptLineDO> pageResult = miscReceiptLineService.getMiscReceiptLinePage(pageReqVO); 115 PageResult<MesWmMiscReceiptLineDO> pageResult = miscReceiptLineService.getMiscReceiptLinePage(pageReqVO);
83 - return success(BeanUtils.toBean(pageResult, MesWmMiscReceiptLineRespVO.class)); 116 + return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal()));
  117 + }
  118 +
  119 + // ==================== 拼接 VO ====================
  120 +
  121 + private List<MesWmMiscReceiptLineRespVO> buildRespVOList(List<MesWmMiscReceiptLineDO> list) {
  122 + if (CollUtil.isEmpty(list)) {
  123 + return Collections.emptyList();
  124 + }
  125 + // 1. 获得关联数据
  126 + Map<Long, MesMdItemDO> itemMap = itemService.getItemMap(
  127 + convertSet(list, MesWmMiscReceiptLineDO::getItemId));
  128 + Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
  129 + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId));
  130 + Map<Long, MesWmWarehouseDO> warehouseMap = warehouseService.getWarehouseMap(
  131 + convertSet(list, MesWmMiscReceiptLineDO::getWarehouseId));
  132 + Map<Long, MesWmWarehouseLocationDO> locationMap = warehouseLocationService.getWarehouseLocationMap(
  133 + convertSet(list, MesWmMiscReceiptLineDO::getLocationId));
  134 + Map<Long, MesWmWarehouseAreaDO> areaMap = warehouseAreaService.getWarehouseAreaMap(
  135 + convertSet(list, MesWmMiscReceiptLineDO::getAreaId));
  136 +
  137 + // 2. 构建结果
  138 + return BeanUtils.toBean(list, MesWmMiscReceiptLineRespVO.class, vo -> {
  139 + MapUtils.findAndThen(itemMap, vo.getItemId(), item -> {
  140 + vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification());
  141 + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(),
  142 + unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName()));
  143 + });
  144 + MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> vo.setWarehouseName(warehouse.getName()));
  145 + MapUtils.findAndThen(locationMap, vo.getLocationId(), location -> vo.setLocationName(location.getName()));
  146 + MapUtils.findAndThen(areaMap, vo.getAreaId(), area -> vo.setAreaName(area.getName()));
  147 + });
84 } 148 }
85 149
86 } 150 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/line/MesWmMiscReceiptLineRespVO.java
@@ -34,14 +34,26 @@ public class MesWmMiscReceiptLineRespVO { @@ -34,14 +34,26 @@ public class MesWmMiscReceiptLineRespVO {
34 @Schema(description = "库位编号", example = "1") 34 @Schema(description = "库位编号", example = "1")
35 private Long areaId; 35 private Long areaId;
36 36
37 - @Schema(description = "生产日期")  
38 - private LocalDateTime productionDate; 37 + @Schema(description = "物料编码", example = "M001")
  38 + private String itemCode;
39 39
40 - @Schema(description = "有效期")  
41 - private LocalDateTime expireDate; 40 + @Schema(description = "物料名称", example = "钢板")
  41 + private String itemName;
42 42
43 - @Schema(description = "生产批号", example = "PROD20260301")  
44 - private String lotNumber; 43 + @Schema(description = "规格型号", example = "10mm*100mm")
  44 + private String specification;
  45 +
  46 + @Schema(description = "计量单位名称", example = "千克")
  47 + private String unitMeasureName;
  48 +
  49 + @Schema(description = "仓库名称", example = "原料仓")
  50 + private String warehouseName;
  51 +
  52 + @Schema(description = "库区名称", example = "A区")
  53 + private String locationName;
  54 +
  55 + @Schema(description = "库位名称", example = "1排1架")
  56 + private String areaName;
45 57
46 @Schema(description = "备注", example = "备注") 58 @Schema(description = "备注", example = "备注")
47 private String remark; 59 private String remark;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/line/MesWmMiscReceiptLineSaveReqVO.java
@@ -6,7 +6,6 @@ import jakarta.validation.constraints.NotNull; @@ -6,7 +6,6 @@ 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.LocalDateTime;  
10 9
11 @Schema(description = "管理后台 - MES 杂项入库单行新增/修改 Request VO") 10 @Schema(description = "管理后台 - MES 杂项入库单行新增/修改 Request VO")
12 @Data 11 @Data
@@ -41,15 +40,6 @@ public class MesWmMiscReceiptLineSaveReqVO { @@ -41,15 +40,6 @@ public class MesWmMiscReceiptLineSaveReqVO {
41 @Schema(description = "库位编号", example = "1") 40 @Schema(description = "库位编号", example = "1")
42 private Long areaId; 41 private Long areaId;
43 42
44 - @Schema(description = "生产日期")  
45 - private LocalDateTime productionDate;  
46 -  
47 - @Schema(description = "有效期")  
48 - private LocalDateTime expireDate;  
49 -  
50 - @Schema(description = "生产批号", example = "PROD20260301")  
51 - private String lotNumber;  
52 -  
53 @Schema(description = "备注", example = "备注") 43 @Schema(description = "备注", example = "备注")
54 private String remark; 44 private String remark;
55 45
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptDetailDO.java
@@ -11,7 +11,6 @@ import com.baomidou.mybatisplus.annotation.TableName; @@ -11,7 +11,6 @@ import com.baomidou.mybatisplus.annotation.TableName;
11 import lombok.*; 11 import lombok.*;
12 12
13 import java.math.BigDecimal; 13 import java.math.BigDecimal;
14 -import java.time.LocalDateTime;  
15 14
16 /** 15 /**
17 * MES 杂项入库明细 DO 16 * MES 杂项入库明细 DO
@@ -76,18 +75,6 @@ public class MesWmMiscReceiptDetailDO extends BaseDO { @@ -76,18 +75,6 @@ public class MesWmMiscReceiptDetailDO extends BaseDO {
76 */ 75 */
77 private Long areaId; 76 private Long areaId;
78 /** 77 /**
79 - * 生产日期  
80 - */  
81 - private LocalDateTime productionDate;  
82 - /**  
83 - * 有效期  
84 - */  
85 - private LocalDateTime expireDate;  
86 - /**  
87 - * 生产批号  
88 - */  
89 - private String lotNumber;  
90 - /**  
91 * 备注 78 * 备注
92 */ 79 */
93 private String remark; 80 private String remark;
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptLineDO.java
@@ -11,7 +11,6 @@ import com.baomidou.mybatisplus.annotation.TableName; @@ -11,7 +11,6 @@ import com.baomidou.mybatisplus.annotation.TableName;
11 import lombok.*; 11 import lombok.*;
12 12
13 import java.math.BigDecimal; 13 import java.math.BigDecimal;
14 -import java.time.LocalDateTime;  
15 14
16 /** 15 /**
17 * MES 杂项入库单行 DO 16 * MES 杂项入库单行 DO
@@ -72,18 +71,6 @@ public class MesWmMiscReceiptLineDO extends BaseDO { @@ -72,18 +71,6 @@ public class MesWmMiscReceiptLineDO extends BaseDO {
72 */ 71 */
73 private Long areaId; 72 private Long areaId;
74 /** 73 /**
75 - * 生产日期(暂不使用)  
76 - */  
77 - private LocalDateTime productionDate;  
78 - /**  
79 - * 有效期(暂不使用)  
80 - */  
81 - private LocalDateTime expireDate;  
82 - /**  
83 - * 生产批号(暂不使用)  
84 - */  
85 - private String lotNumber;  
86 - /**  
87 * 备注 74 * 备注
88 */ 75 */
89 private String remark; 76 private String remark;