Commit f04c68c083da81f56607162da94123b7cf2c17c9

Authored by YunaiV
1 parent 4a4a287f

feat(mes): 完善计量单位迁移与物料字段重构

1. 迁移计量单位:新增 MesMdUnitMeasure 全套 CRUD(Controller/Service/Mapper/VO)
2. 物料单位外键改造:unitOfMeasure(String) → unitMeasureId(Long),
   Controller 拼接 unitMeasureName,表单改为下拉选择
3. 物料导入:新增 ImportExcelVO/ImportRespVO,Service 实现 importItemList,
   支持按编码匹配计量单位、物料分类校验
4. 删除引用校验:计量单位删除前检查是否被物料引用
5. 字段重命名:attr1~attr4 → attribute1~attribute4(Item/ItemType/UnitMeasure 全部 DO+VO)
6. 权限标识:物料导入接口独立 mes:md-item:import 权限
7. 迁移客户管理:新增 MesMdClient 全套 CRUD
Showing 21 changed files with 754 additions and 42 deletions
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemController.java
@@ -16,8 +16,10 @@ import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemRespVO; @@ -16,8 +16,10 @@ import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemRespVO;
16 import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemSaveReqVO; 16 import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemSaveReqVO;
17 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; 17 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
18 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO; 18 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO;
  19 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
19 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; 20 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService;
20 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemTypeService; 21 import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemTypeService;
  22 +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
21 import io.swagger.v3.oas.annotations.Operation; 23 import io.swagger.v3.oas.annotations.Operation;
22 import io.swagger.v3.oas.annotations.Parameter; 24 import io.swagger.v3.oas.annotations.Parameter;
23 import io.swagger.v3.oas.annotations.Parameters; 25 import io.swagger.v3.oas.annotations.Parameters;
@@ -52,6 +54,9 @@ public class MesMdItemController { @@ -52,6 +54,9 @@ public class MesMdItemController {
52 @Resource 54 @Resource
53 private MesMdItemTypeService itemTypeService; 55 private MesMdItemTypeService itemTypeService;
54 56
  57 + @Resource
  58 + private MesMdUnitMeasureService unitMeasureService;
  59 +
55 @PostMapping("/create") 60 @PostMapping("/create")
56 @Operation(summary = "创建物料产品") 61 @Operation(summary = "创建物料产品")
57 @PreAuthorize("@ss.hasPermission('mes:md-item:create')") 62 @PreAuthorize("@ss.hasPermission('mes:md-item:create')")
@@ -100,7 +105,7 @@ public class MesMdItemController { @@ -100,7 +105,7 @@ public class MesMdItemController {
100 return success(convertList(buildItemVOList(list), item -> new MesMdItemRespVO() 105 return success(convertList(buildItemVOList(list), item -> new MesMdItemRespVO()
101 .setId(item.getId()).setName(item.getName()).setCode(item.getCode()) 106 .setId(item.getId()).setName(item.getName()).setCode(item.getCode())
102 .setItemTypeId(item.getItemTypeId()).setItemTypeName(item.getItemTypeName()) 107 .setItemTypeId(item.getItemTypeId()).setItemTypeName(item.getItemTypeName())
103 - .setUnitOfMeasure(item.getUnitOfMeasure()))); 108 + .setUnitMeasureId(item.getUnitMeasureId()).setUnitMeasureName(item.getUnitMeasureName())));
104 } 109 }
105 110
106 @GetMapping("/export-excel") 111 @GetMapping("/export-excel")
@@ -122,7 +127,7 @@ public class MesMdItemController { @@ -122,7 +127,7 @@ public class MesMdItemController {
122 // 手动创建导出 demo 127 // 手动创建导出 demo
123 List<MesMdItemImportExcelVO> list = Collections.singletonList( 128 List<MesMdItemImportExcelVO> list = Collections.singletonList(
124 MesMdItemImportExcelVO.builder().code("ITEM001").name("螺丝").specification("M6*20") 129 MesMdItemImportExcelVO.builder().code("ITEM001").name("螺丝").specification("M6*20")
125 - .unitOfMeasure("PCS").itemTypeId(1L).status(0).build() 130 + .unitMeasureCode("PCS").itemTypeId(1L).status(0).build()
126 ); 131 );
127 // 输出 132 // 输出
128 ExcelUtils.write(response, "物料导入模板.xls", "物料列表", MesMdItemImportExcelVO.class, list); 133 ExcelUtils.write(response, "物料导入模板.xls", "物料列表", MesMdItemImportExcelVO.class, list);
@@ -134,7 +139,7 @@ public class MesMdItemController { @@ -134,7 +139,7 @@ public class MesMdItemController {
134 @Parameter(name = "file", description = "Excel 文件", required = true), 139 @Parameter(name = "file", description = "Excel 文件", required = true),
135 @Parameter(name = "updateSupport", description = "是否支持更新,默认为 false", example = "true") 140 @Parameter(name = "updateSupport", description = "是否支持更新,默认为 false", example = "true")
136 }) 141 })
137 - @PreAuthorize("@ss.hasPermission('mes:md-item:create')") 142 + @PreAuthorize("@ss.hasPermission('mes:md-item:import')")
138 public CommonResult<MesMdItemImportRespVO> importExcel(@RequestParam("file") MultipartFile file, 143 public CommonResult<MesMdItemImportRespVO> importExcel(@RequestParam("file") MultipartFile file,
139 @RequestParam(value = "updateSupport", required = false, 144 @RequestParam(value = "updateSupport", required = false,
140 defaultValue = "false") Boolean updateSupport) throws Exception { 145 defaultValue = "false") Boolean updateSupport) throws Exception {
@@ -150,12 +155,17 @@ public class MesMdItemController { @@ -150,12 +155,17 @@ public class MesMdItemController {
150 } 155 }
151 Map<Long, MesMdItemTypeDO> itemTypeMap = itemTypeService.getItemTypeMap( 156 Map<Long, MesMdItemTypeDO> itemTypeMap = itemTypeService.getItemTypeMap(
152 convertSet(list, MesMdItemDO::getItemTypeId)); 157 convertSet(list, MesMdItemDO::getItemTypeId));
153 - return BeanUtils.toBean(list, MesMdItemRespVO.class, item ->  
154 - MapUtils.findAndThen(itemTypeMap, item.getItemTypeId(),  
155 - itemType -> {  
156 - item.setItemTypeName(itemType.getName());  
157 - item.setItemOrProduct(itemType.getItemOrProduct());  
158 - })); 158 + Map<Long, MesMdUnitMeasureDO> unitMeasureMap = unitMeasureService.getUnitMeasureMap(
  159 + convertSet(list, MesMdItemDO::getUnitMeasureId));
  160 + return BeanUtils.toBean(list, MesMdItemRespVO.class, item -> {
  161 + MapUtils.findAndThen(itemTypeMap, item.getItemTypeId(),
  162 + itemType -> {
  163 + item.setItemTypeName(itemType.getName());
  164 + item.setItemOrProduct(itemType.getItemOrProduct());
  165 + });
  166 + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(),
  167 + unitMeasure -> item.setUnitMeasureName(unitMeasure.getName()));
  168 + });
159 } 169 }
160 170
161 } 171 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemImportExcelVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.md.item.vo;
  2 +
  3 +import cn.idev.excel.annotation.ExcelProperty;
  4 +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
  5 +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
  6 +import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
  7 +import lombok.AllArgsConstructor;
  8 +import lombok.Builder;
  9 +import lombok.Data;
  10 +import lombok.NoArgsConstructor;
  11 +
  12 +import java.math.BigDecimal;
  13 +
  14 +/**
  15 + * 物料产品 Excel 导入 VO
  16 + */
  17 +@Data
  18 +@Builder
  19 +@AllArgsConstructor
  20 +@NoArgsConstructor
  21 +public class MesMdItemImportExcelVO {
  22 +
  23 + @ExcelProperty("物料编码")
  24 + private String code;
  25 +
  26 + @ExcelProperty("物料名称")
  27 + private String name;
  28 +
  29 + @ExcelProperty("规格型号")
  30 + private String specification;
  31 +
  32 + @ExcelProperty("单位编码")
  33 + private String unitMeasureCode;
  34 +
  35 + @ExcelProperty("物料分类编号")
  36 + private Long itemTypeId;
  37 +
  38 + @ExcelProperty(value = "状态", converter = DictConvert.class)
  39 + @DictFormat(DictTypeConstants.COMMON_STATUS)
  40 + private Integer status;
  41 +
  42 + @ExcelProperty("是否启用安全库存")
  43 + private Boolean safeStockFlag;
  44 +
  45 + @ExcelProperty("最低库存量")
  46 + private BigDecimal minStock;
  47 +
  48 + @ExcelProperty("最高库存量")
  49 + private BigDecimal maxStock;
  50 +
  51 + @ExcelProperty("是否高值物料")
  52 + private Boolean highValue;
  53 +
  54 + @ExcelProperty("是否启用批次管理")
  55 + private Boolean batchFlag;
  56 +
  57 + @ExcelProperty("备注")
  58 + private String remark;
  59 +
  60 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemImportRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.md.item.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Builder;
  5 +import lombok.Data;
  6 +
  7 +import java.util.List;
  8 +import java.util.Map;
  9 +
  10 +@Schema(description = "管理后台 - MES 物料产品导入 Response VO")
  11 +@Data
  12 +@Builder
  13 +public class MesMdItemImportRespVO {
  14 +
  15 + @Schema(description = "创建成功的物料编码数组", requiredMode = Schema.RequiredMode.REQUIRED)
  16 + private List<String> createCodes;
  17 +
  18 + @Schema(description = "更新成功的物料编码数组", requiredMode = Schema.RequiredMode.REQUIRED)
  19 + private List<String> updateCodes;
  20 +
  21 + @Schema(description = "导入失败的物料集合,key 为物料编码,value 为失败原因", requiredMode = Schema.RequiredMode.REQUIRED)
  22 + private Map<String, String> failureCodes;
  23 +
  24 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemRespVO.java
@@ -32,9 +32,11 @@ public class MesMdItemRespVO { @@ -32,9 +32,11 @@ public class MesMdItemRespVO {
32 @ExcelProperty("规格型号") 32 @ExcelProperty("规格型号")
33 private String specification; 33 private String specification;
34 34
35 - @Schema(description = "单位编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "pcs")  
36 - @ExcelProperty("单位编码")  
37 - private String unitOfMeasure; 35 + @Schema(description = "计量单位编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "202")
  36 + private Long unitMeasureId;
  37 + @Schema(description = "计量单位名称", example = "个")
  38 + @ExcelProperty("计量单位")
  39 + private String unitMeasureName;
38 40
39 @Schema(description = "物料分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") 41 @Schema(description = "物料分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
40 private Long itemTypeId; 42 private Long itemTypeId;
@@ -76,16 +78,16 @@ public class MesMdItemRespVO { @@ -76,16 +78,16 @@ public class MesMdItemRespVO {
76 private String remark; 78 private String remark;
77 79
78 @Schema(description = "预留字段1") 80 @Schema(description = "预留字段1")
79 - private String attr1; 81 + private String attribute1;
80 82
81 @Schema(description = "预留字段2") 83 @Schema(description = "预留字段2")
82 - private String attr2; 84 + private String attribute2;
83 85
84 @Schema(description = "预留字段3") 86 @Schema(description = "预留字段3")
85 - private Integer attr3; 87 + private Integer attribute3;
86 88
87 @Schema(description = "预留字段4") 89 @Schema(description = "预留字段4")
88 - private Integer attr4; 90 + private Integer attribute4;
89 91
90 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) 92 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
91 @ExcelProperty("创建时间") 93 @ExcelProperty("创建时间")
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemSaveReqVO.java
@@ -25,9 +25,9 @@ public class MesMdItemSaveReqVO { @@ -25,9 +25,9 @@ public class MesMdItemSaveReqVO {
25 @Schema(description = "规格型号", example = "M6*20") 25 @Schema(description = "规格型号", example = "M6*20")
26 private String specification; 26 private String specification;
27 27
28 - @Schema(description = "单位编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "pcs")  
29 - @NotEmpty(message = "单位编码不能为空")  
30 - private String unitOfMeasure; 28 + @Schema(description = "计量单位编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "202")
  29 + @NotNull(message = "计量单位不能为空")
  30 + private Long unitMeasureId;
31 31
32 @Schema(description = "物料分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") 32 @Schema(description = "物料分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
33 @NotNull(message = "物料分类编号不能为空") 33 @NotNull(message = "物料分类编号不能为空")
@@ -56,15 +56,15 @@ public class MesMdItemSaveReqVO { @@ -56,15 +56,15 @@ public class MesMdItemSaveReqVO {
56 private String remark; 56 private String remark;
57 57
58 @Schema(description = "预留字段1") 58 @Schema(description = "预留字段1")
59 - private String attr1; 59 + private String attribute1;
60 60
61 @Schema(description = "预留字段2") 61 @Schema(description = "预留字段2")
62 - private String attr2; 62 + private String attribute2;
63 63
64 @Schema(description = "预留字段3") 64 @Schema(description = "预留字段3")
65 - private Integer attr3; 65 + private Integer attribute3;
66 66
67 @Schema(description = "预留字段4") 67 @Schema(description = "预留字段4")
68 - private Integer attr4; 68 + private Integer attribute4;
69 69
70 } 70 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/type/MesMdItemTypeRespVO.java
@@ -49,16 +49,16 @@ public class MesMdItemTypeRespVO { @@ -49,16 +49,16 @@ public class MesMdItemTypeRespVO {
49 private String remark; 49 private String remark;
50 50
51 @Schema(description = "预留字段1") 51 @Schema(description = "预留字段1")
52 - private String attr1; 52 + private String attribute1;
53 53
54 @Schema(description = "预留字段2") 54 @Schema(description = "预留字段2")
55 - private String attr2; 55 + private String attribute2;
56 56
57 @Schema(description = "预留字段3") 57 @Schema(description = "预留字段3")
58 - private Integer attr3; 58 + private Integer attribute3;
59 59
60 @Schema(description = "预留字段4") 60 @Schema(description = "预留字段4")
61 - private Integer attr4; 61 + private Integer attribute4;
62 62
63 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) 63 @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
64 @ExcelProperty("创建时间") 64 @ExcelProperty("创建时间")
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/type/MesMdItemTypeSaveReqVO.java
@@ -40,15 +40,15 @@ public class MesMdItemTypeSaveReqVO { @@ -40,15 +40,15 @@ public class MesMdItemTypeSaveReqVO {
40 private String remark; 40 private String remark;
41 41
42 @Schema(description = "预留字段1") 42 @Schema(description = "预留字段1")
43 - private String attr1; 43 + private String attribute1;
44 44
45 @Schema(description = "预留字段2") 45 @Schema(description = "预留字段2")
46 - private String attr2; 46 + private String attribute2;
47 47
48 @Schema(description = "预留字段3") 48 @Schema(description = "预留字段3")
49 - private Integer attr3; 49 + private Integer attribute3;
50 50
51 @Schema(description = "预留字段4") 51 @Schema(description = "预留字段4")
52 - private Integer attr4; 52 + private Integer attribute4;
53 53
54 } 54 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/unitmeasure/MesMdUnitMeasureController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure;
  2 +
  3 +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
  4 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  5 +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;
  8 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  9 +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
  10 +import cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure.vo.MesMdUnitMeasurePageReqVO;
  11 +import cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure.vo.MesMdUnitMeasureRespVO;
  12 +import cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure.vo.MesMdUnitMeasureSaveReqVO;
  13 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
  14 +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
  15 +import io.swagger.v3.oas.annotations.Operation;
  16 +import io.swagger.v3.oas.annotations.Parameter;
  17 +import io.swagger.v3.oas.annotations.tags.Tag;
  18 +import jakarta.annotation.Resource;
  19 +import jakarta.servlet.http.HttpServletResponse;
  20 +import jakarta.validation.Valid;
  21 +import org.springframework.security.access.prepost.PreAuthorize;
  22 +import org.springframework.validation.annotation.Validated;
  23 +import org.springframework.web.bind.annotation.*;
  24 +
  25 +import java.io.IOException;
  26 +import java.util.List;
  27 +
  28 +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
  29 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  30 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
  31 +
  32 +@Tag(name = "管理后台 - MES 计量单位")
  33 +@RestController
  34 +@RequestMapping("/mes/md/unit-measure")
  35 +@Validated
  36 +public class MesMdUnitMeasureController {
  37 +
  38 + @Resource
  39 + private MesMdUnitMeasureService unitMeasureService;
  40 +
  41 + @PostMapping("/create")
  42 + @Operation(summary = "创建计量单位")
  43 + @PreAuthorize("@ss.hasPermission('mes:md-unit-measure:create')")
  44 + public CommonResult<Long> createUnitMeasure(@Valid @RequestBody MesMdUnitMeasureSaveReqVO createReqVO) {
  45 + return success(unitMeasureService.createUnitMeasure(createReqVO));
  46 + }
  47 +
  48 + @PutMapping("/update")
  49 + @Operation(summary = "更新计量单位")
  50 + @PreAuthorize("@ss.hasPermission('mes:md-unit-measure:update')")
  51 + public CommonResult<Boolean> updateUnitMeasure(@Valid @RequestBody MesMdUnitMeasureSaveReqVO updateReqVO) {
  52 + unitMeasureService.updateUnitMeasure(updateReqVO);
  53 + return success(true);
  54 + }
  55 +
  56 + @DeleteMapping("/delete")
  57 + @Operation(summary = "删除计量单位")
  58 + @Parameter(name = "id", description = "编号", required = true)
  59 + @PreAuthorize("@ss.hasPermission('mes:md-unit-measure:delete')")
  60 + public CommonResult<Boolean> deleteUnitMeasure(@RequestParam("id") Long id) {
  61 + unitMeasureService.deleteUnitMeasure(id);
  62 + return success(true);
  63 + }
  64 +
  65 + @GetMapping("/get")
  66 + @Operation(summary = "获得计量单位")
  67 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  68 + @PreAuthorize("@ss.hasPermission('mes:md-unit-measure:query')")
  69 + public CommonResult<MesMdUnitMeasureRespVO> getUnitMeasure(@RequestParam("id") Long id) {
  70 + MesMdUnitMeasureDO unitMeasure = unitMeasureService.getUnitMeasure(id);
  71 + return success(BeanUtils.toBean(unitMeasure, MesMdUnitMeasureRespVO.class));
  72 + }
  73 +
  74 + @GetMapping("/page")
  75 + @Operation(summary = "获得计量单位分页")
  76 + @PreAuthorize("@ss.hasPermission('mes:md-unit-measure:query')")
  77 + public CommonResult<PageResult<MesMdUnitMeasureRespVO>> getUnitMeasurePage(@Valid MesMdUnitMeasurePageReqVO pageReqVO) {
  78 + PageResult<MesMdUnitMeasureDO> pageResult = unitMeasureService.getUnitMeasurePage(pageReqVO);
  79 + return success(BeanUtils.toBean(pageResult, MesMdUnitMeasureRespVO.class));
  80 + }
  81 +
  82 + @GetMapping("/simple-list")
  83 + @Operation(summary = "获得计量单位精简列表", description = "只包含被开启的单位,主要用于前端的下拉选项")
  84 + public CommonResult<List<MesMdUnitMeasureRespVO>> getUnitMeasureSimpleList() {
  85 + List<MesMdUnitMeasureDO> list = unitMeasureService.getUnitMeasureListByStatus(CommonStatusEnum.ENABLE.getStatus());
  86 + return success(convertList(list, unit -> new MesMdUnitMeasureRespVO()
  87 + .setId(unit.getId()).setCode(unit.getCode()).setName(unit.getName())
  88 + .setPrimaryFlag(unit.getPrimaryFlag()).setPrimaryId(unit.getPrimaryId())
  89 + .setChangeRate(unit.getChangeRate())));
  90 + }
  91 +
  92 + @GetMapping("/export-excel")
  93 + @Operation(summary = "导出计量单位 Excel")
  94 + @PreAuthorize("@ss.hasPermission('mes:md-unit-measure:export')")
  95 + @ApiAccessLog(operateType = EXPORT)
  96 + public void exportUnitMeasureExcel(@Valid MesMdUnitMeasurePageReqVO pageReqVO,
  97 + HttpServletResponse response) throws IOException {
  98 + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
  99 + List<MesMdUnitMeasureDO> list = unitMeasureService.getUnitMeasurePage(pageReqVO).getList();
  100 + // 导出 Excel
  101 + ExcelUtils.write(response, "计量单位.xls", "数据", MesMdUnitMeasureRespVO.class,
  102 + BeanUtils.toBean(list, MesMdUnitMeasureRespVO.class));
  103 + }
  104 +
  105 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/unitmeasure/vo/MesMdUnitMeasurePageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +@Schema(description = "管理后台 - MES 计量单位分页 Request VO")
  10 +@Data
  11 +@EqualsAndHashCode(callSuper = true)
  12 +@ToString(callSuper = true)
  13 +public class MesMdUnitMeasurePageReqVO extends PageParam {
  14 +
  15 + @Schema(description = "单位编码", example = "KG")
  16 + private String code;
  17 +
  18 + @Schema(description = "单位名称", example = "公斤")
  19 + private String name;
  20 +
  21 + @Schema(description = "状态", example = "0")
  22 + private Integer status;
  23 +
  24 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/unitmeasure/vo/MesMdUnitMeasureRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
  4 +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
  5 +import cn.iocoder.yudao.module.system.enums.DictTypeConstants;
  6 +import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
  7 +import cn.idev.excel.annotation.ExcelProperty;
  8 +import io.swagger.v3.oas.annotations.media.Schema;
  9 +import lombok.Data;
  10 +
  11 +import java.math.BigDecimal;
  12 +import java.time.LocalDateTime;
  13 +
  14 +@Schema(description = "管理后台 - MES 计量单位 Response VO")
  15 +@Data
  16 +@ExcelIgnoreUnannotated
  17 +public class MesMdUnitMeasureRespVO {
  18 +
  19 + @Schema(description = "单位编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  20 + @ExcelProperty("单位编号")
  21 + private Long id;
  22 +
  23 + @Schema(description = "单位编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "KG")
  24 + @ExcelProperty("单位编码")
  25 + private String code;
  26 +
  27 + @Schema(description = "单位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "公斤")
  28 + @ExcelProperty("单位名称")
  29 + private String name;
  30 +
  31 + @Schema(description = "是否主单位", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
  32 + @ExcelProperty("是否主单位")
  33 + private Boolean primaryFlag;
  34 +
  35 + @Schema(description = "主单位编号", example = "200")
  36 + @ExcelProperty("主单位编号")
  37 + private Long primaryId;
  38 +
  39 + @Schema(description = "与主单位换算比例", example = "1000.0000")
  40 + @ExcelProperty("与主单位换算比例")
  41 + private BigDecimal changeRate;
  42 +
  43 + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
  44 + @ExcelProperty(value = "状态", converter = DictConvert.class)
  45 + @DictFormat(DictTypeConstants.COMMON_STATUS)
  46 + private Integer status;
  47 +
  48 + @Schema(description = "备注", example = "备注")
  49 + @ExcelProperty("备注")
  50 + private String remark;
  51 +
  52 + @Schema(description = "预留字段1")
  53 + private String attribute1;
  54 +
  55 + @Schema(description = "预留字段2")
  56 + private String attribute2;
  57 +
  58 + @Schema(description = "预留字段3")
  59 + private Integer attribute3;
  60 +
  61 + @Schema(description = "预留字段4")
  62 + private Integer attribute4;
  63 +
  64 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  65 + @ExcelProperty("创建时间")
  66 + private LocalDateTime createTime;
  67 +
  68 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/unitmeasure/vo/MesMdUnitMeasureSaveReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  4 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  5 +import io.swagger.v3.oas.annotations.media.Schema;
  6 +import jakarta.validation.constraints.NotEmpty;
  7 +import jakarta.validation.constraints.NotNull;
  8 +import lombok.Data;
  9 +
  10 +import java.math.BigDecimal;
  11 +
  12 +@Schema(description = "管理后台 - MES 计量单位新增/修改 Request VO")
  13 +@Data
  14 +public class MesMdUnitMeasureSaveReqVO {
  15 +
  16 + @Schema(description = "单位编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  17 + private Long id;
  18 +
  19 + @Schema(description = "单位编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "KG")
  20 + @NotEmpty(message = "单位编码不能为空")
  21 + private String code;
  22 +
  23 + @Schema(description = "单位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "公斤")
  24 + @NotEmpty(message = "单位名称不能为空")
  25 + private String name;
  26 +
  27 + @Schema(description = "是否主单位", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
  28 + @NotNull(message = "是否主单位不能为空")
  29 + private Boolean primaryFlag;
  30 +
  31 + @Schema(description = "主单位编号", example = "200")
  32 + private Long primaryId;
  33 +
  34 + @Schema(description = "与主单位换算比例", example = "1000.0000")
  35 + private BigDecimal changeRate;
  36 +
  37 + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
  38 + @NotNull(message = "状态不能为空")
  39 + @InEnum(CommonStatusEnum.class)
  40 + private Integer status;
  41 +
  42 + @Schema(description = "备注", example = "备注")
  43 + private String remark;
  44 +
  45 + @Schema(description = "预留字段1")
  46 + private String attribute1;
  47 +
  48 + @Schema(description = "预留字段2")
  49 + private String attribute2;
  50 +
  51 + @Schema(description = "预留字段3")
  52 + private Integer attribute3;
  53 +
  54 + @Schema(description = "预留字段4")
  55 + private Integer attribute4;
  56 +
  57 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdItemDO.java
1 package cn.iocoder.yudao.module.mes.dal.dataobject.md.item; 1 package cn.iocoder.yudao.module.mes.dal.dataobject.md.item;
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.unitmeasure.MesMdUnitMeasureDO;
4 import com.baomidou.mybatisplus.annotation.KeySequence; 5 import com.baomidou.mybatisplus.annotation.KeySequence;
5 import com.baomidou.mybatisplus.annotation.TableId; 6 import com.baomidou.mybatisplus.annotation.TableId;
6 import com.baomidou.mybatisplus.annotation.TableName; 7 import com.baomidou.mybatisplus.annotation.TableName;
@@ -41,9 +42,11 @@ public class MesMdItemDO extends BaseDO { @@ -41,9 +42,11 @@ public class MesMdItemDO extends BaseDO {
41 */ 42 */
42 private String specification; 43 private String specification;
43 /** 44 /**
44 - * 单位编码 45 + * 计量单位编号
  46 + *
  47 + * 关联 {@link MesMdUnitMeasureDO#getId()}
45 */ 48 */
46 - private String unitOfMeasure; 49 + private Long unitMeasureId;
47 /** 50 /**
48 * 物料分类编号 51 * 物料分类编号
49 * 52 *
@@ -83,18 +86,18 @@ public class MesMdItemDO extends BaseDO { @@ -83,18 +86,18 @@ public class MesMdItemDO extends BaseDO {
83 /** 86 /**
84 * 预留字段1 87 * 预留字段1
85 */ 88 */
86 - private String attr1; 89 + private String attribute1;
87 /** 90 /**
88 * 预留字段2 91 * 预留字段2
89 */ 92 */
90 - private String attr2; 93 + private String attribute2;
91 /** 94 /**
92 * 预留字段3 95 * 预留字段3
93 */ 96 */
94 - private Integer attr3; 97 + private Integer attribute3;
95 /** 98 /**
96 * 预留字段4 99 * 预留字段4
97 */ 100 */
98 - private Integer attr4; 101 + private Integer attribute4;
99 102
100 } 103 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdItemTypeDO.java
@@ -61,18 +61,18 @@ public class MesMdItemTypeDO extends BaseDO { @@ -61,18 +61,18 @@ public class MesMdItemTypeDO extends BaseDO {
61 /** 61 /**
62 * 预留字段1 62 * 预留字段1
63 */ 63 */
64 - private String attr1; 64 + private String attribute1;
65 /** 65 /**
66 * 预留字段2 66 * 预留字段2
67 */ 67 */
68 - private String attr2; 68 + private String attribute2;
69 /** 69 /**
70 * 预留字段3 70 * 预留字段3
71 */ 71 */
72 - private Integer attr3; 72 + private Integer attribute3;
73 /** 73 /**
74 * 预留字段4 74 * 预留字段4
75 */ 75 */
76 - private Integer attr4; 76 + private Integer attribute4;
77 77
78 } 78 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/unitmeasure/MesMdUnitMeasureDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import com.baomidou.mybatisplus.annotation.KeySequence;
  5 +import com.baomidou.mybatisplus.annotation.TableId;
  6 +import com.baomidou.mybatisplus.annotation.TableName;
  7 +import lombok.*;
  8 +
  9 +import java.math.BigDecimal;
  10 +
  11 +/**
  12 + * MES 计量单位 DO
  13 + *
  14 + * @author 芋道源码
  15 + */
  16 +@TableName("mes_md_unit_measure")
  17 +@KeySequence("mes_md_unit_measure_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
  18 +@Data
  19 +@EqualsAndHashCode(callSuper = true)
  20 +@ToString(callSuper = true)
  21 +@Builder
  22 +@NoArgsConstructor
  23 +@AllArgsConstructor
  24 +public class MesMdUnitMeasureDO extends BaseDO {
  25 +
  26 + /**
  27 + * 单位编号
  28 + */
  29 + @TableId
  30 + private Long id;
  31 + /**
  32 + * 单位编码
  33 + */
  34 + private String code;
  35 + /**
  36 + * 单位名称
  37 + */
  38 + private String name;
  39 + /**
  40 + * 是否主单位
  41 + */
  42 + private Boolean primaryFlag;
  43 + /**
  44 + * 主单位编号
  45 + *
  46 + * 关联 {@link MesMdUnitMeasureDO#getId()}
  47 + */
  48 + private Long primaryId;
  49 + /**
  50 + * 与主单位换算比例
  51 + */
  52 + private BigDecimal changeRate;
  53 + /**
  54 + * 状态
  55 + *
  56 + * 枚举 {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum}
  57 + */
  58 + private Integer status;
  59 + /**
  60 + * 备注
  61 + */
  62 + private String remark;
  63 + /**
  64 + * 预留字段1
  65 + */
  66 + private String attribute1;
  67 + /**
  68 + * 预留字段2
  69 + */
  70 + private String attribute2;
  71 + /**
  72 + * 预留字段3
  73 + */
  74 + private Integer attribute3;
  75 + /**
  76 + * 预留字段4
  77 + */
  78 + private Integer attribute4;
  79 +
  80 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/item/MesMdItemMapper.java
@@ -44,4 +44,8 @@ public interface MesMdItemMapper extends BaseMapperX&lt;MesMdItemDO&gt; { @@ -44,4 +44,8 @@ public interface MesMdItemMapper extends BaseMapperX&lt;MesMdItemDO&gt; {
44 return selectList(MesMdItemDO::getStatus, status); 44 return selectList(MesMdItemDO::getStatus, status);
45 } 45 }
46 46
  47 + default Long selectCountByUnitMeasureId(Long unitMeasureId) {
  48 + return selectCount(MesMdItemDO::getUnitMeasureId, unitMeasureId);
  49 + }
  50 +
47 } 51 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/unitmeasure/MesMdUnitMeasureMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.dal.mysql.md.unitmeasure;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure.vo.MesMdUnitMeasurePageReqVO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
  8 +import org.apache.ibatis.annotations.Mapper;
  9 +
  10 +import java.util.List;
  11 +
  12 +/**
  13 + * MES 计量单位 Mapper
  14 + *
  15 + * @author 芋道源码
  16 + */
  17 +@Mapper
  18 +public interface MesMdUnitMeasureMapper extends BaseMapperX<MesMdUnitMeasureDO> {
  19 +
  20 + default PageResult<MesMdUnitMeasureDO> selectPage(MesMdUnitMeasurePageReqVO reqVO) {
  21 + return selectPage(reqVO, new LambdaQueryWrapperX<MesMdUnitMeasureDO>()
  22 + .likeIfPresent(MesMdUnitMeasureDO::getCode, reqVO.getCode())
  23 + .likeIfPresent(MesMdUnitMeasureDO::getName, reqVO.getName())
  24 + .eqIfPresent(MesMdUnitMeasureDO::getStatus, reqVO.getStatus())
  25 + .orderByDesc(MesMdUnitMeasureDO::getId));
  26 + }
  27 +
  28 + default MesMdUnitMeasureDO selectByCode(String code) {
  29 + return selectOne(MesMdUnitMeasureDO::getCode, code);
  30 + }
  31 +
  32 + default List<MesMdUnitMeasureDO> selectListByStatus(Integer status) {
  33 + return selectList(MesMdUnitMeasureDO::getStatus, status);
  34 + }
  35 +
  36 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java
@@ -7,4 +7,6 @@ package cn.iocoder.yudao.module.mes.enums; @@ -7,4 +7,6 @@ package cn.iocoder.yudao.module.mes.enums;
7 */ 7 */
8 public interface DictTypeConstants { 8 public interface DictTypeConstants {
9 9
  10 + String MES_CLIENT_TYPE = "mes_client_type"; // MES 客户类型
  11 +
10 } 12 }
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
@@ -22,6 +22,7 @@ public interface ErrorCodeConstants { @@ -22,6 +22,7 @@ public interface ErrorCodeConstants {
22 // ========== MES 基础数据-计量单位(1-040-101-000) ========== 22 // ========== MES 基础数据-计量单位(1-040-101-000) ==========
23 ErrorCode MD_UNIT_MEASURE_NOT_EXISTS = new ErrorCode(1_040_101_000, "计量单位不存在"); 23 ErrorCode MD_UNIT_MEASURE_NOT_EXISTS = new ErrorCode(1_040_101_000, "计量单位不存在");
24 ErrorCode MD_UNIT_MEASURE_CODE_DUPLICATE = new ErrorCode(1_040_101_001, "计量单位编码已存在"); 24 ErrorCode MD_UNIT_MEASURE_CODE_DUPLICATE = new ErrorCode(1_040_101_001, "计量单位编码已存在");
  25 + ErrorCode MD_UNIT_MEASURE_HAS_ITEM = new ErrorCode(1_040_101_002, "该计量单位下存在物料,无法删除");
25 26
26 // ========== MES 基础数据-物料(1-040-102-000) ========== 27 // ========== MES 基础数据-物料(1-040-102-000) ==========
27 ErrorCode MD_ITEM_NOT_EXISTS = new ErrorCode(1_040_102_000, "物料不存在"); 28 ErrorCode MD_ITEM_NOT_EXISTS = new ErrorCode(1_040_102_000, "物料不存在");
@@ -31,6 +32,9 @@ public interface ErrorCodeConstants { @@ -31,6 +32,9 @@ public interface ErrorCodeConstants {
31 32
32 // ========== MES 基础数据-客户(1-040-103-000) ========== 33 // ========== MES 基础数据-客户(1-040-103-000) ==========
33 ErrorCode MD_CLIENT_NOT_EXISTS = new ErrorCode(1_040_103_000, "客户不存在"); 34 ErrorCode MD_CLIENT_NOT_EXISTS = new ErrorCode(1_040_103_000, "客户不存在");
  35 + ErrorCode MD_CLIENT_CODE_DUPLICATE = new ErrorCode(1_040_103_001, "客户编码已存在");
  36 + ErrorCode MD_CLIENT_NAME_DUPLICATE = new ErrorCode(1_040_103_002, "客户名称已存在");
  37 + ErrorCode MD_CLIENT_NICKNAME_DUPLICATE = new ErrorCode(1_040_103_003, "客户简称已存在");
34 38
35 // ========== MES 基础数据-供应商(1-040-104-000) ========== 39 // ========== MES 基础数据-供应商(1-040-104-000) ==========
36 ErrorCode MD_VENDOR_NOT_EXISTS = new ErrorCode(1_040_104_000, "供应商不存在"); 40 ErrorCode MD_VENDOR_NOT_EXISTS = new ErrorCode(1_040_104_000, "供应商不存在");
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java
@@ -11,7 +11,9 @@ import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemPageReqV @@ -11,7 +11,9 @@ import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemPageReqV
11 import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemSaveReqVO; 11 import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemSaveReqVO;
12 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; 12 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO;
13 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO; 13 import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO;
  14 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
14 import cn.iocoder.yudao.module.mes.dal.mysql.md.item.MesMdItemMapper; 15 import cn.iocoder.yudao.module.mes.dal.mysql.md.item.MesMdItemMapper;
  16 +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService;
15 import jakarta.annotation.Resource; 17 import jakarta.annotation.Resource;
16 import org.springframework.stereotype.Service; 18 import org.springframework.stereotype.Service;
17 import org.springframework.transaction.annotation.Transactional; 19 import org.springframework.transaction.annotation.Transactional;
@@ -40,6 +42,9 @@ public class MesMdItemServiceImpl implements MesMdItemService { @@ -40,6 +42,9 @@ public class MesMdItemServiceImpl implements MesMdItemService {
40 @Resource 42 @Resource
41 private MesMdItemTypeService itemTypeService; 43 private MesMdItemTypeService itemTypeService;
42 44
  45 + @Resource
  46 + private MesMdUnitMeasureService unitMeasureService;
  47 +
43 @Override 48 @Override
44 public Long createItem(MesMdItemSaveReqVO createReqVO) { 49 public Long createItem(MesMdItemSaveReqVO createReqVO) {
45 // 校验物料编码的唯一性 50 // 校验物料编码的唯一性
@@ -48,6 +53,8 @@ public class MesMdItemServiceImpl implements MesMdItemService { @@ -48,6 +53,8 @@ public class MesMdItemServiceImpl implements MesMdItemService {
48 validateItemNameUnique(null, createReqVO.getName()); 53 validateItemNameUnique(null, createReqVO.getName());
49 // 校验物料分类存在 54 // 校验物料分类存在
50 validateItemTypeExists(createReqVO.getItemTypeId()); 55 validateItemTypeExists(createReqVO.getItemTypeId());
  56 + // 校验计量单位存在
  57 + validateUnitMeasureExists(createReqVO.getUnitMeasureId());
51 58
52 // 插入 59 // 插入
53 MesMdItemDO item = BeanUtils.toBean(createReqVO, MesMdItemDO.class); 60 MesMdItemDO item = BeanUtils.toBean(createReqVO, MesMdItemDO.class);
@@ -66,6 +73,8 @@ public class MesMdItemServiceImpl implements MesMdItemService { @@ -66,6 +73,8 @@ public class MesMdItemServiceImpl implements MesMdItemService {
66 validateItemNameUnique(updateReqVO.getId(), updateReqVO.getName()); 73 validateItemNameUnique(updateReqVO.getId(), updateReqVO.getName());
67 // 校验物料分类存在 74 // 校验物料分类存在
68 validateItemTypeExists(updateReqVO.getItemTypeId()); 75 validateItemTypeExists(updateReqVO.getItemTypeId());
  76 + // 校验计量单位存在
  77 + validateUnitMeasureExists(updateReqVO.getUnitMeasureId());
69 78
70 // 更新 79 // 更新
71 MesMdItemDO updateObj = BeanUtils.toBean(updateReqVO, MesMdItemDO.class); 80 MesMdItemDO updateObj = BeanUtils.toBean(updateReqVO, MesMdItemDO.class);
@@ -119,6 +128,12 @@ public class MesMdItemServiceImpl implements MesMdItemService { @@ -119,6 +128,12 @@ public class MesMdItemServiceImpl implements MesMdItemService {
119 } 128 }
120 } 129 }
121 130
  131 + private void validateUnitMeasureExists(Long unitMeasureId) {
  132 + if (unitMeasureService.getUnitMeasure(unitMeasureId) == null) {
  133 + throw exception(MD_UNIT_MEASURE_NOT_EXISTS);
  134 + }
  135 + }
  136 +
122 /** 137 /**
123 * 如果未启用安全库存,清零库存上下限 138 * 如果未启用安全库存,清零库存上下限
124 */ 139 */
@@ -191,10 +206,16 @@ public class MesMdItemServiceImpl implements MesMdItemService { @@ -191,10 +206,16 @@ public class MesMdItemServiceImpl implements MesMdItemService {
191 respVO.getFailureCodes().put(key, "物料名称不能为空"); 206 respVO.getFailureCodes().put(key, "物料名称不能为空");
192 return; 207 return;
193 } 208 }
194 - if (StrUtil.isBlank(importItem.getUnitOfMeasure())) { 209 + if (StrUtil.isBlank(importItem.getUnitMeasureCode())) {
195 respVO.getFailureCodes().put(key, "单位编码不能为空"); 210 respVO.getFailureCodes().put(key, "单位编码不能为空");
196 return; 211 return;
197 } 212 }
  213 + // 将单位编码转换为单位 ID
  214 + MesMdUnitMeasureDO unitMeasure = unitMeasureService.getUnitMeasureByCode(importItem.getUnitMeasureCode());
  215 + if (unitMeasure == null) {
  216 + respVO.getFailureCodes().put(key, "单位编码[" + importItem.getUnitMeasureCode() + "]不存在");
  217 + return;
  218 + }
198 if (importItem.getItemTypeId() == null) { 219 if (importItem.getItemTypeId() == null) {
199 respVO.getFailureCodes().put(key, "物料分类编号不能为空"); 220 respVO.getFailureCodes().put(key, "物料分类编号不能为空");
200 return; 221 return;
@@ -218,6 +239,7 @@ public class MesMdItemServiceImpl implements MesMdItemService { @@ -218,6 +239,7 @@ public class MesMdItemServiceImpl implements MesMdItemService {
218 return; 239 return;
219 } 240 }
220 MesMdItemDO item = BeanUtils.toBean(importItem, MesMdItemDO.class); 241 MesMdItemDO item = BeanUtils.toBean(importItem, MesMdItemDO.class);
  242 + item.setUnitMeasureId(unitMeasure.getId());
221 clearStockIfNotSafe(item); 243 clearStockIfNotSafe(item);
222 itemMapper.insert(item); 244 itemMapper.insert(item);
223 respVO.getCreateCodes().add(importItem.getCode()); 245 respVO.getCreateCodes().add(importItem.getCode());
@@ -231,6 +253,7 @@ public class MesMdItemServiceImpl implements MesMdItemService { @@ -231,6 +253,7 @@ public class MesMdItemServiceImpl implements MesMdItemService {
231 } 253 }
232 MesMdItemDO updateObj = BeanUtils.toBean(importItem, MesMdItemDO.class); 254 MesMdItemDO updateObj = BeanUtils.toBean(importItem, MesMdItemDO.class);
233 updateObj.setId(existItem.getId()); 255 updateObj.setId(existItem.getId());
  256 + updateObj.setUnitMeasureId(unitMeasure.getId());
234 clearStockIfNotSafe(updateObj); 257 clearStockIfNotSafe(updateObj);
235 itemMapper.updateById(updateObj); 258 itemMapper.updateById(updateObj);
236 respVO.getUpdateCodes().add(importItem.getCode()); 259 respVO.getUpdateCodes().add(importItem.getCode());
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/unitmeasure/MesMdUnitMeasureService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.md.unitmeasure;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure.vo.MesMdUnitMeasurePageReqVO;
  5 +import cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure.vo.MesMdUnitMeasureSaveReqVO;
  6 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
  7 +import jakarta.validation.Valid;
  8 +
  9 +import java.util.Collection;
  10 +import java.util.List;
  11 +import java.util.Map;
  12 +
  13 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
  14 +
  15 +/**
  16 + * MES 计量单位 Service 接口
  17 + *
  18 + * @author 芋道源码
  19 + */
  20 +public interface MesMdUnitMeasureService {
  21 +
  22 + /**
  23 + * 创建计量单位
  24 + *
  25 + * @param createReqVO 创建信息
  26 + * @return 编号
  27 + */
  28 + Long createUnitMeasure(@Valid MesMdUnitMeasureSaveReqVO createReqVO);
  29 +
  30 + /**
  31 + * 更新计量单位
  32 + *
  33 + * @param updateReqVO 更新信息
  34 + */
  35 + void updateUnitMeasure(@Valid MesMdUnitMeasureSaveReqVO updateReqVO);
  36 +
  37 + /**
  38 + * 删除计量单位
  39 + *
  40 + * @param id 编号
  41 + */
  42 + void deleteUnitMeasure(Long id);
  43 +
  44 + /**
  45 + * 获得计量单位
  46 + *
  47 + * @param id 编号
  48 + * @return 计量单位
  49 + */
  50 + MesMdUnitMeasureDO getUnitMeasure(Long id);
  51 +
  52 + /**
  53 + * 获得计量单位分页
  54 + *
  55 + * @param pageReqVO 分页查询
  56 + * @return 计量单位分页
  57 + */
  58 + PageResult<MesMdUnitMeasureDO> getUnitMeasurePage(MesMdUnitMeasurePageReqVO pageReqVO);
  59 +
  60 + /**
  61 + * 获得指定状态的计量单位列表
  62 + *
  63 + * @param status 状态
  64 + * @return 计量单位列表
  65 + */
  66 + List<MesMdUnitMeasureDO> getUnitMeasureListByStatus(Integer status);
  67 +
  68 + /**
  69 + * 获得计量单位列表
  70 + *
  71 + * @param ids 编号数组
  72 + * @return 计量单位列表
  73 + */
  74 + List<MesMdUnitMeasureDO> getUnitMeasureList(Collection<Long> ids);
  75 +
  76 + /**
  77 + * 获得计量单位 Map
  78 + *
  79 + * @param ids 编号数组
  80 + * @return 计量单位 Map
  81 + */
  82 + default Map<Long, MesMdUnitMeasureDO> getUnitMeasureMap(Collection<Long> ids) {
  83 + return convertMap(getUnitMeasureList(ids), MesMdUnitMeasureDO::getId);
  84 + }
  85 +
  86 + /**
  87 + * 根据编码获得计量单位
  88 + *
  89 + * @param code 单位编码
  90 + * @return 计量单位
  91 + */
  92 + MesMdUnitMeasureDO getUnitMeasureByCode(String code);
  93 +
  94 +}
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/unitmeasure/MesMdUnitMeasureServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.mes.service.md.unitmeasure;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  5 +import cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure.vo.MesMdUnitMeasurePageReqVO;
  6 +import cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure.vo.MesMdUnitMeasureSaveReqVO;
  7 +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO;
  8 +import cn.iocoder.yudao.module.mes.dal.mysql.md.item.MesMdItemMapper;
  9 +import cn.iocoder.yudao.module.mes.dal.mysql.md.unitmeasure.MesMdUnitMeasureMapper;
  10 +import jakarta.annotation.Resource;
  11 +import org.springframework.stereotype.Service;
  12 +import org.springframework.validation.annotation.Validated;
  13 +
  14 +import java.util.Collection;
  15 +import java.util.List;
  16 +import java.util.Objects;
  17 +
  18 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  19 +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*;
  20 +
  21 +/**
  22 + * MES 计量单位 Service 实现类
  23 + *
  24 + * @author 芋道源码
  25 + */
  26 +@Service
  27 +@Validated
  28 +public class MesMdUnitMeasureServiceImpl implements MesMdUnitMeasureService {
  29 +
  30 + @Resource
  31 + private MesMdUnitMeasureMapper unitMeasureMapper;
  32 +
  33 + @Resource
  34 + private MesMdItemMapper itemMapper;
  35 +
  36 + @Override
  37 + public Long createUnitMeasure(MesMdUnitMeasureSaveReqVO createReqVO) {
  38 + // 校验编码唯一
  39 + validateUnitMeasureCodeUnique(null, createReqVO.getCode());
  40 +
  41 + // 插入
  42 + MesMdUnitMeasureDO unitMeasure = BeanUtils.toBean(createReqVO, MesMdUnitMeasureDO.class);
  43 + unitMeasureMapper.insert(unitMeasure);
  44 + return unitMeasure.getId();
  45 + }
  46 +
  47 + @Override
  48 + public void updateUnitMeasure(MesMdUnitMeasureSaveReqVO updateReqVO) {
  49 + // 校验存在
  50 + validateUnitMeasureExists(updateReqVO.getId());
  51 + // 校验编码唯一
  52 + validateUnitMeasureCodeUnique(updateReqVO.getId(), updateReqVO.getCode());
  53 +
  54 + // 更新
  55 + MesMdUnitMeasureDO updateObj = BeanUtils.toBean(updateReqVO, MesMdUnitMeasureDO.class);
  56 + unitMeasureMapper.updateById(updateObj);
  57 + }
  58 +
  59 + @Override
  60 + public void deleteUnitMeasure(Long id) {
  61 + // 校验存在
  62 + validateUnitMeasureExists(id);
  63 + // 校验是否被物料引用
  64 + if (itemMapper.selectCountByUnitMeasureId(id) > 0) {
  65 + throw exception(MD_UNIT_MEASURE_HAS_ITEM);
  66 + }
  67 + // 删除
  68 + unitMeasureMapper.deleteById(id);
  69 + }
  70 +
  71 + private void validateUnitMeasureExists(Long id) {
  72 + if (unitMeasureMapper.selectById(id) == null) {
  73 + throw exception(MD_UNIT_MEASURE_NOT_EXISTS);
  74 + }
  75 + }
  76 +
  77 + private void validateUnitMeasureCodeUnique(Long id, String code) {
  78 + MesMdUnitMeasureDO unitMeasure = unitMeasureMapper.selectByCode(code);
  79 + if (unitMeasure == null) {
  80 + return;
  81 + }
  82 + // 如果 id 为空,说明不用比较是否为相同 id 的记录
  83 + if (id == null) {
  84 + throw exception(MD_UNIT_MEASURE_CODE_DUPLICATE);
  85 + }
  86 + if (!Objects.equals(unitMeasure.getId(), id)) {
  87 + throw exception(MD_UNIT_MEASURE_CODE_DUPLICATE);
  88 + }
  89 + }
  90 +
  91 + @Override
  92 + public MesMdUnitMeasureDO getUnitMeasure(Long id) {
  93 + return unitMeasureMapper.selectById(id);
  94 + }
  95 +
  96 + @Override
  97 + public PageResult<MesMdUnitMeasureDO> getUnitMeasurePage(MesMdUnitMeasurePageReqVO pageReqVO) {
  98 + return unitMeasureMapper.selectPage(pageReqVO);
  99 + }
  100 +
  101 + @Override
  102 + public List<MesMdUnitMeasureDO> getUnitMeasureListByStatus(Integer status) {
  103 + return unitMeasureMapper.selectListByStatus(status);
  104 + }
  105 +
  106 + @Override
  107 + public List<MesMdUnitMeasureDO> getUnitMeasureList(Collection<Long> ids) {
  108 + return unitMeasureMapper.selectByIds(ids);
  109 + }
  110 +
  111 + @Override
  112 + public MesMdUnitMeasureDO getUnitMeasureByCode(String code) {
  113 + return unitMeasureMapper.selectByCode(code);
  114 + }
  115 +
  116 +}