From f04c68c083da81f56607162da94123b7cf2c17c9 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 15 Feb 2026 22:18:32 +0800 Subject: [PATCH] feat(mes): 完善计量单位迁移与物料字段重构 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemController.java | 28 +++++++++++++++++++--------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemImportExcelVO.java | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemImportRespVO.java | 24 ++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemRespVO.java | 16 +++++++++------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemSaveReqVO.java | 14 +++++++------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/type/MesMdItemTypeRespVO.java | 8 ++++---- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/type/MesMdItemTypeSaveReqVO.java | 8 ++++---- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/unitmeasure/MesMdUnitMeasureController.java | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/unitmeasure/vo/MesMdUnitMeasurePageReqVO.java | 24 ++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/unitmeasure/vo/MesMdUnitMeasureRespVO.java | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/unitmeasure/vo/MesMdUnitMeasureSaveReqVO.java | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdItemDO.java | 15 +++++++++------ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdItemTypeDO.java | 8 ++++---- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/unitmeasure/MesMdUnitMeasureDO.java | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/item/MesMdItemMapper.java | 4 ++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/unitmeasure/MesMdUnitMeasureMapper.java | 36 ++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java | 2 ++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java | 4 ++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java | 25 ++++++++++++++++++++++++- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/unitmeasure/MesMdUnitMeasureService.java | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/unitmeasure/MesMdUnitMeasureServiceImpl.java | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 21 files changed, 754 insertions(+), 42 deletions(-) create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemImportExcelVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemImportRespVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/unitmeasure/MesMdUnitMeasureController.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/unitmeasure/vo/MesMdUnitMeasurePageReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/unitmeasure/vo/MesMdUnitMeasureRespVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/unitmeasure/vo/MesMdUnitMeasureSaveReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/unitmeasure/MesMdUnitMeasureDO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/unitmeasure/MesMdUnitMeasureMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/unitmeasure/MesMdUnitMeasureService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/unitmeasure/MesMdUnitMeasureServiceImpl.java diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemController.java index 0dffbe1..8f1ee66 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemController.java +++ b/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; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemTypeService; +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; @@ -52,6 +54,9 @@ public class MesMdItemController { @Resource private MesMdItemTypeService itemTypeService; + @Resource + private MesMdUnitMeasureService unitMeasureService; + @PostMapping("/create") @Operation(summary = "创建物料产品") @PreAuthorize("@ss.hasPermission('mes:md-item:create')") @@ -100,7 +105,7 @@ public class MesMdItemController { return success(convertList(buildItemVOList(list), item -> new MesMdItemRespVO() .setId(item.getId()).setName(item.getName()).setCode(item.getCode()) .setItemTypeId(item.getItemTypeId()).setItemTypeName(item.getItemTypeName()) - .setUnitOfMeasure(item.getUnitOfMeasure()))); + .setUnitMeasureId(item.getUnitMeasureId()).setUnitMeasureName(item.getUnitMeasureName()))); } @GetMapping("/export-excel") @@ -122,7 +127,7 @@ public class MesMdItemController { // 手动创建导出 demo List list = Collections.singletonList( MesMdItemImportExcelVO.builder().code("ITEM001").name("螺丝").specification("M6*20") - .unitOfMeasure("PCS").itemTypeId(1L).status(0).build() + .unitMeasureCode("PCS").itemTypeId(1L).status(0).build() ); // 输出 ExcelUtils.write(response, "物料导入模板.xls", "物料列表", MesMdItemImportExcelVO.class, list); @@ -134,7 +139,7 @@ public class MesMdItemController { @Parameter(name = "file", description = "Excel 文件", required = true), @Parameter(name = "updateSupport", description = "是否支持更新,默认为 false", example = "true") }) - @PreAuthorize("@ss.hasPermission('mes:md-item:create')") + @PreAuthorize("@ss.hasPermission('mes:md-item:import')") public CommonResult importExcel(@RequestParam("file") MultipartFile file, @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { @@ -150,12 +155,17 @@ public class MesMdItemController { } Map itemTypeMap = itemTypeService.getItemTypeMap( convertSet(list, MesMdItemDO::getItemTypeId)); - return BeanUtils.toBean(list, MesMdItemRespVO.class, item -> - MapUtils.findAndThen(itemTypeMap, item.getItemTypeId(), - itemType -> { - item.setItemTypeName(itemType.getName()); - item.setItemOrProduct(itemType.getItemOrProduct()); - })); + Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( + convertSet(list, MesMdItemDO::getUnitMeasureId)); + return BeanUtils.toBean(list, MesMdItemRespVO.class, item -> { + MapUtils.findAndThen(itemTypeMap, item.getItemTypeId(), + itemType -> { + item.setItemTypeName(itemType.getName()); + item.setItemOrProduct(itemType.getItemOrProduct()); + }); + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), + unitMeasure -> item.setUnitMeasureName(unitMeasure.getName())); + }); } } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemImportExcelVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemImportExcelVO.java new file mode 100644 index 0000000..dee51f7 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemImportExcelVO.java @@ -0,0 +1,60 @@ +package cn.iocoder.yudao.module.mes.controller.admin.md.item.vo; + +import cn.idev.excel.annotation.ExcelProperty; +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.module.system.enums.DictTypeConstants; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +/** + * 物料产品 Excel 导入 VO + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class MesMdItemImportExcelVO { + + @ExcelProperty("物料编码") + private String code; + + @ExcelProperty("物料名称") + private String name; + + @ExcelProperty("规格型号") + private String specification; + + @ExcelProperty("单位编码") + private String unitMeasureCode; + + @ExcelProperty("物料分类编号") + private Long itemTypeId; + + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + + @ExcelProperty("是否启用安全库存") + private Boolean safeStockFlag; + + @ExcelProperty("最低库存量") + private BigDecimal minStock; + + @ExcelProperty("最高库存量") + private BigDecimal maxStock; + + @ExcelProperty("是否高值物料") + private Boolean highValue; + + @ExcelProperty("是否启用批次管理") + private Boolean batchFlag; + + @ExcelProperty("备注") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemImportRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemImportRespVO.java new file mode 100644 index 0000000..de3f51b --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemImportRespVO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.module.mes.controller.admin.md.item.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Schema(description = "管理后台 - MES 物料产品导入 Response VO") +@Data +@Builder +public class MesMdItemImportRespVO { + + @Schema(description = "创建成功的物料编码数组", requiredMode = Schema.RequiredMode.REQUIRED) + private List createCodes; + + @Schema(description = "更新成功的物料编码数组", requiredMode = Schema.RequiredMode.REQUIRED) + private List updateCodes; + + @Schema(description = "导入失败的物料集合,key 为物料编码,value 为失败原因", requiredMode = Schema.RequiredMode.REQUIRED) + private Map failureCodes; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemRespVO.java index 355e201..f11ca15 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemRespVO.java +++ b/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 { @ExcelProperty("规格型号") private String specification; - @Schema(description = "单位编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "pcs") - @ExcelProperty("单位编码") - private String unitOfMeasure; + @Schema(description = "计量单位编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "202") + private Long unitMeasureId; + @Schema(description = "计量单位名称", example = "个") + @ExcelProperty("计量单位") + private String unitMeasureName; @Schema(description = "物料分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Long itemTypeId; @@ -76,16 +78,16 @@ public class MesMdItemRespVO { private String remark; @Schema(description = "预留字段1") - private String attr1; + private String attribute1; @Schema(description = "预留字段2") - private String attr2; + private String attribute2; @Schema(description = "预留字段3") - private Integer attr3; + private Integer attribute3; @Schema(description = "预留字段4") - private Integer attr4; + private Integer attribute4; @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建时间") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemSaveReqVO.java index 5846a32..16dfe33 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/MesMdItemSaveReqVO.java +++ b/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 { @Schema(description = "规格型号", example = "M6*20") private String specification; - @Schema(description = "单位编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "pcs") - @NotEmpty(message = "单位编码不能为空") - private String unitOfMeasure; + @Schema(description = "计量单位编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "202") + @NotNull(message = "计量单位不能为空") + private Long unitMeasureId; @Schema(description = "物料分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "物料分类编号不能为空") @@ -56,15 +56,15 @@ public class MesMdItemSaveReqVO { private String remark; @Schema(description = "预留字段1") - private String attr1; + private String attribute1; @Schema(description = "预留字段2") - private String attr2; + private String attribute2; @Schema(description = "预留字段3") - private Integer attr3; + private Integer attribute3; @Schema(description = "预留字段4") - private Integer attr4; + private Integer attribute4; } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/type/MesMdItemTypeRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/type/MesMdItemTypeRespVO.java index f08ea44..d9ae8a8 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/type/MesMdItemTypeRespVO.java +++ b/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 { private String remark; @Schema(description = "预留字段1") - private String attr1; + private String attribute1; @Schema(description = "预留字段2") - private String attr2; + private String attribute2; @Schema(description = "预留字段3") - private Integer attr3; + private Integer attribute3; @Schema(description = "预留字段4") - private Integer attr4; + private Integer attribute4; @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建时间") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/type/MesMdItemTypeSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/type/MesMdItemTypeSaveReqVO.java index b3ca294..b62d211 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/type/MesMdItemTypeSaveReqVO.java +++ b/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 { private String remark; @Schema(description = "预留字段1") - private String attr1; + private String attribute1; @Schema(description = "预留字段2") - private String attr2; + private String attribute2; @Schema(description = "预留字段3") - private Integer attr3; + private Integer attribute3; @Schema(description = "预留字段4") - private Integer attr4; + private Integer attribute4; } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/unitmeasure/MesMdUnitMeasureController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/unitmeasure/MesMdUnitMeasureController.java new file mode 100644 index 0000000..0429366 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/unitmeasure/MesMdUnitMeasureController.java @@ -0,0 +1,105 @@ +package cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; +import cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure.vo.MesMdUnitMeasurePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure.vo.MesMdUnitMeasureRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure.vo.MesMdUnitMeasureSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.io.IOException; +import java.util.List; + +import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; + +@Tag(name = "管理后台 - MES 计量单位") +@RestController +@RequestMapping("/mes/md/unit-measure") +@Validated +public class MesMdUnitMeasureController { + + @Resource + private MesMdUnitMeasureService unitMeasureService; + + @PostMapping("/create") + @Operation(summary = "创建计量单位") + @PreAuthorize("@ss.hasPermission('mes:md-unit-measure:create')") + public CommonResult createUnitMeasure(@Valid @RequestBody MesMdUnitMeasureSaveReqVO createReqVO) { + return success(unitMeasureService.createUnitMeasure(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新计量单位") + @PreAuthorize("@ss.hasPermission('mes:md-unit-measure:update')") + public CommonResult updateUnitMeasure(@Valid @RequestBody MesMdUnitMeasureSaveReqVO updateReqVO) { + unitMeasureService.updateUnitMeasure(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除计量单位") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:md-unit-measure:delete')") + public CommonResult deleteUnitMeasure(@RequestParam("id") Long id) { + unitMeasureService.deleteUnitMeasure(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得计量单位") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:md-unit-measure:query')") + public CommonResult getUnitMeasure(@RequestParam("id") Long id) { + MesMdUnitMeasureDO unitMeasure = unitMeasureService.getUnitMeasure(id); + return success(BeanUtils.toBean(unitMeasure, MesMdUnitMeasureRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得计量单位分页") + @PreAuthorize("@ss.hasPermission('mes:md-unit-measure:query')") + public CommonResult> getUnitMeasurePage(@Valid MesMdUnitMeasurePageReqVO pageReqVO) { + PageResult pageResult = unitMeasureService.getUnitMeasurePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, MesMdUnitMeasureRespVO.class)); + } + + @GetMapping("/simple-list") + @Operation(summary = "获得计量单位精简列表", description = "只包含被开启的单位,主要用于前端的下拉选项") + public CommonResult> getUnitMeasureSimpleList() { + List list = unitMeasureService.getUnitMeasureListByStatus(CommonStatusEnum.ENABLE.getStatus()); + return success(convertList(list, unit -> new MesMdUnitMeasureRespVO() + .setId(unit.getId()).setCode(unit.getCode()).setName(unit.getName()) + .setPrimaryFlag(unit.getPrimaryFlag()).setPrimaryId(unit.getPrimaryId()) + .setChangeRate(unit.getChangeRate()))); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出计量单位 Excel") + @PreAuthorize("@ss.hasPermission('mes:md-unit-measure:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportUnitMeasureExcel(@Valid MesMdUnitMeasurePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = unitMeasureService.getUnitMeasurePage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "计量单位.xls", "数据", MesMdUnitMeasureRespVO.class, + BeanUtils.toBean(list, MesMdUnitMeasureRespVO.class)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/unitmeasure/vo/MesMdUnitMeasurePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/unitmeasure/vo/MesMdUnitMeasurePageReqVO.java new file mode 100644 index 0000000..bf964af --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/unitmeasure/vo/MesMdUnitMeasurePageReqVO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - MES 计量单位分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MesMdUnitMeasurePageReqVO extends PageParam { + + @Schema(description = "单位编码", example = "KG") + private String code; + + @Schema(description = "单位名称", example = "公斤") + private String name; + + @Schema(description = "状态", example = "0") + private Integer status; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/unitmeasure/vo/MesMdUnitMeasureRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/unitmeasure/vo/MesMdUnitMeasureRespVO.java new file mode 100644 index 0000000..43b2139 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/unitmeasure/vo/MesMdUnitMeasureRespVO.java @@ -0,0 +1,68 @@ +package cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure.vo; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.module.system.enums.DictTypeConstants; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 计量单位 Response VO") +@Data +@ExcelIgnoreUnannotated +public class MesMdUnitMeasureRespVO { + + @Schema(description = "单位编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("单位编号") + private Long id; + + @Schema(description = "单位编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "KG") + @ExcelProperty("单位编码") + private String code; + + @Schema(description = "单位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "公斤") + @ExcelProperty("单位名称") + private String name; + + @Schema(description = "是否主单位", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @ExcelProperty("是否主单位") + private Boolean primaryFlag; + + @Schema(description = "主单位编号", example = "200") + @ExcelProperty("主单位编号") + private Long primaryId; + + @Schema(description = "与主单位换算比例", example = "1000.0000") + @ExcelProperty("与主单位换算比例") + private BigDecimal changeRate; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.COMMON_STATUS) + private Integer status; + + @Schema(description = "备注", example = "备注") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "预留字段1") + private String attribute1; + + @Schema(description = "预留字段2") + private String attribute2; + + @Schema(description = "预留字段3") + private Integer attribute3; + + @Schema(description = "预留字段4") + private Integer attribute4; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/unitmeasure/vo/MesMdUnitMeasureSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/unitmeasure/vo/MesMdUnitMeasureSaveReqVO.java new file mode 100644 index 0000000..e431052 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/unitmeasure/vo/MesMdUnitMeasureSaveReqVO.java @@ -0,0 +1,57 @@ +package cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure.vo; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.validation.InEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.math.BigDecimal; + +@Schema(description = "管理后台 - MES 计量单位新增/修改 Request VO") +@Data +public class MesMdUnitMeasureSaveReqVO { + + @Schema(description = "单位编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "单位编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "KG") + @NotEmpty(message = "单位编码不能为空") + private String code; + + @Schema(description = "单位名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "公斤") + @NotEmpty(message = "单位名称不能为空") + private String name; + + @Schema(description = "是否主单位", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @NotNull(message = "是否主单位不能为空") + private Boolean primaryFlag; + + @Schema(description = "主单位编号", example = "200") + private Long primaryId; + + @Schema(description = "与主单位换算比例", example = "1000.0000") + private BigDecimal changeRate; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @NotNull(message = "状态不能为空") + @InEnum(CommonStatusEnum.class) + private Integer status; + + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "预留字段1") + private String attribute1; + + @Schema(description = "预留字段2") + private String attribute2; + + @Schema(description = "预留字段3") + private Integer attribute3; + + @Schema(description = "预留字段4") + private Integer attribute4; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdItemDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdItemDO.java index 9ccbd47..27e1169 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdItemDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdItemDO.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.md.item; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -41,9 +42,11 @@ public class MesMdItemDO extends BaseDO { */ private String specification; /** - * 单位编码 + * 计量单位编号 + * + * 关联 {@link MesMdUnitMeasureDO#getId()} */ - private String unitOfMeasure; + private Long unitMeasureId; /** * 物料分类编号 * @@ -83,18 +86,18 @@ public class MesMdItemDO extends BaseDO { /** * 预留字段1 */ - private String attr1; + private String attribute1; /** * 预留字段2 */ - private String attr2; + private String attribute2; /** * 预留字段3 */ - private Integer attr3; + private Integer attribute3; /** * 预留字段4 */ - private Integer attr4; + private Integer attribute4; } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdItemTypeDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdItemTypeDO.java index 04651f7..98fcec3 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdItemTypeDO.java +++ b/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 { /** * 预留字段1 */ - private String attr1; + private String attribute1; /** * 预留字段2 */ - private String attr2; + private String attribute2; /** * 预留字段3 */ - private Integer attr3; + private Integer attribute3; /** * 预留字段4 */ - private Integer attr4; + private Integer attribute4; } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/unitmeasure/MesMdUnitMeasureDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/unitmeasure/MesMdUnitMeasureDO.java new file mode 100644 index 0000000..f516fb2 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/unitmeasure/MesMdUnitMeasureDO.java @@ -0,0 +1,80 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; + +/** + * MES 计量单位 DO + * + * @author 芋道源码 + */ +@TableName("mes_md_unit_measure") +@KeySequence("mes_md_unit_measure_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesMdUnitMeasureDO extends BaseDO { + + /** + * 单位编号 + */ + @TableId + private Long id; + /** + * 单位编码 + */ + private String code; + /** + * 单位名称 + */ + private String name; + /** + * 是否主单位 + */ + private Boolean primaryFlag; + /** + * 主单位编号 + * + * 关联 {@link MesMdUnitMeasureDO#getId()} + */ + private Long primaryId; + /** + * 与主单位换算比例 + */ + private BigDecimal changeRate; + /** + * 状态 + * + * 枚举 {@link cn.iocoder.yudao.framework.common.enums.CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + /** + * 预留字段1 + */ + private String attribute1; + /** + * 预留字段2 + */ + private String attribute2; + /** + * 预留字段3 + */ + private Integer attribute3; + /** + * 预留字段4 + */ + private Integer attribute4; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/item/MesMdItemMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/item/MesMdItemMapper.java index eac8271..8d82682 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/item/MesMdItemMapper.java +++ b/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 { return selectList(MesMdItemDO::getStatus, status); } + default Long selectCountByUnitMeasureId(Long unitMeasureId) { + return selectCount(MesMdItemDO::getUnitMeasureId, unitMeasureId); + } + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/unitmeasure/MesMdUnitMeasureMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/unitmeasure/MesMdUnitMeasureMapper.java new file mode 100644 index 0000000..cb9a2bf --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/unitmeasure/MesMdUnitMeasureMapper.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.md.unitmeasure; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure.vo.MesMdUnitMeasurePageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * MES 计量单位 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface MesMdUnitMeasureMapper extends BaseMapperX { + + default PageResult selectPage(MesMdUnitMeasurePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(MesMdUnitMeasureDO::getCode, reqVO.getCode()) + .likeIfPresent(MesMdUnitMeasureDO::getName, reqVO.getName()) + .eqIfPresent(MesMdUnitMeasureDO::getStatus, reqVO.getStatus()) + .orderByDesc(MesMdUnitMeasureDO::getId)); + } + + default MesMdUnitMeasureDO selectByCode(String code) { + return selectOne(MesMdUnitMeasureDO::getCode, code); + } + + default List selectListByStatus(Integer status) { + return selectList(MesMdUnitMeasureDO::getStatus, status); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java index eccf4f7..ac70fef 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/DictTypeConstants.java +++ b/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; */ public interface DictTypeConstants { + String MES_CLIENT_TYPE = "mes_client_type"; // MES 客户类型 + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index 91f01a5..8079e77 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -22,6 +22,7 @@ public interface ErrorCodeConstants { // ========== MES 基础数据-计量单位(1-040-101-000) ========== ErrorCode MD_UNIT_MEASURE_NOT_EXISTS = new ErrorCode(1_040_101_000, "计量单位不存在"); ErrorCode MD_UNIT_MEASURE_CODE_DUPLICATE = new ErrorCode(1_040_101_001, "计量单位编码已存在"); + ErrorCode MD_UNIT_MEASURE_HAS_ITEM = new ErrorCode(1_040_101_002, "该计量单位下存在物料,无法删除"); // ========== MES 基础数据-物料(1-040-102-000) ========== ErrorCode MD_ITEM_NOT_EXISTS = new ErrorCode(1_040_102_000, "物料不存在"); @@ -31,6 +32,9 @@ public interface ErrorCodeConstants { // ========== MES 基础数据-客户(1-040-103-000) ========== ErrorCode MD_CLIENT_NOT_EXISTS = new ErrorCode(1_040_103_000, "客户不存在"); + ErrorCode MD_CLIENT_CODE_DUPLICATE = new ErrorCode(1_040_103_001, "客户编码已存在"); + ErrorCode MD_CLIENT_NAME_DUPLICATE = new ErrorCode(1_040_103_002, "客户名称已存在"); + ErrorCode MD_CLIENT_NICKNAME_DUPLICATE = new ErrorCode(1_040_103_003, "客户简称已存在"); // ========== MES 基础数据-供应商(1-040-104-000) ========== ErrorCode MD_VENDOR_NOT_EXISTS = new ErrorCode(1_040_104_000, "供应商不存在"); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java index fe6a8e8..86a794a 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java +++ b/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 import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; import cn.iocoder.yudao.module.mes.dal.mysql.md.item.MesMdItemMapper; +import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -40,6 +42,9 @@ public class MesMdItemServiceImpl implements MesMdItemService { @Resource private MesMdItemTypeService itemTypeService; + @Resource + private MesMdUnitMeasureService unitMeasureService; + @Override public Long createItem(MesMdItemSaveReqVO createReqVO) { // 校验物料编码的唯一性 @@ -48,6 +53,8 @@ public class MesMdItemServiceImpl implements MesMdItemService { validateItemNameUnique(null, createReqVO.getName()); // 校验物料分类存在 validateItemTypeExists(createReqVO.getItemTypeId()); + // 校验计量单位存在 + validateUnitMeasureExists(createReqVO.getUnitMeasureId()); // 插入 MesMdItemDO item = BeanUtils.toBean(createReqVO, MesMdItemDO.class); @@ -66,6 +73,8 @@ public class MesMdItemServiceImpl implements MesMdItemService { validateItemNameUnique(updateReqVO.getId(), updateReqVO.getName()); // 校验物料分类存在 validateItemTypeExists(updateReqVO.getItemTypeId()); + // 校验计量单位存在 + validateUnitMeasureExists(updateReqVO.getUnitMeasureId()); // 更新 MesMdItemDO updateObj = BeanUtils.toBean(updateReqVO, MesMdItemDO.class); @@ -119,6 +128,12 @@ public class MesMdItemServiceImpl implements MesMdItemService { } } + private void validateUnitMeasureExists(Long unitMeasureId) { + if (unitMeasureService.getUnitMeasure(unitMeasureId) == null) { + throw exception(MD_UNIT_MEASURE_NOT_EXISTS); + } + } + /** * 如果未启用安全库存,清零库存上下限 */ @@ -191,10 +206,16 @@ public class MesMdItemServiceImpl implements MesMdItemService { respVO.getFailureCodes().put(key, "物料名称不能为空"); return; } - if (StrUtil.isBlank(importItem.getUnitOfMeasure())) { + if (StrUtil.isBlank(importItem.getUnitMeasureCode())) { respVO.getFailureCodes().put(key, "单位编码不能为空"); return; } + // 将单位编码转换为单位 ID + MesMdUnitMeasureDO unitMeasure = unitMeasureService.getUnitMeasureByCode(importItem.getUnitMeasureCode()); + if (unitMeasure == null) { + respVO.getFailureCodes().put(key, "单位编码[" + importItem.getUnitMeasureCode() + "]不存在"); + return; + } if (importItem.getItemTypeId() == null) { respVO.getFailureCodes().put(key, "物料分类编号不能为空"); return; @@ -218,6 +239,7 @@ public class MesMdItemServiceImpl implements MesMdItemService { return; } MesMdItemDO item = BeanUtils.toBean(importItem, MesMdItemDO.class); + item.setUnitMeasureId(unitMeasure.getId()); clearStockIfNotSafe(item); itemMapper.insert(item); respVO.getCreateCodes().add(importItem.getCode()); @@ -231,6 +253,7 @@ public class MesMdItemServiceImpl implements MesMdItemService { } MesMdItemDO updateObj = BeanUtils.toBean(importItem, MesMdItemDO.class); updateObj.setId(existItem.getId()); + updateObj.setUnitMeasureId(unitMeasure.getId()); clearStockIfNotSafe(updateObj); itemMapper.updateById(updateObj); respVO.getUpdateCodes().add(importItem.getCode()); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/unitmeasure/MesMdUnitMeasureService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/unitmeasure/MesMdUnitMeasureService.java new file mode 100644 index 0000000..eb38c2b --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/unitmeasure/MesMdUnitMeasureService.java @@ -0,0 +1,94 @@ +package cn.iocoder.yudao.module.mes.service.md.unitmeasure; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure.vo.MesMdUnitMeasurePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure.vo.MesMdUnitMeasureSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; +import jakarta.validation.Valid; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; + +/** + * MES 计量单位 Service 接口 + * + * @author 芋道源码 + */ +public interface MesMdUnitMeasureService { + + /** + * 创建计量单位 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createUnitMeasure(@Valid MesMdUnitMeasureSaveReqVO createReqVO); + + /** + * 更新计量单位 + * + * @param updateReqVO 更新信息 + */ + void updateUnitMeasure(@Valid MesMdUnitMeasureSaveReqVO updateReqVO); + + /** + * 删除计量单位 + * + * @param id 编号 + */ + void deleteUnitMeasure(Long id); + + /** + * 获得计量单位 + * + * @param id 编号 + * @return 计量单位 + */ + MesMdUnitMeasureDO getUnitMeasure(Long id); + + /** + * 获得计量单位分页 + * + * @param pageReqVO 分页查询 + * @return 计量单位分页 + */ + PageResult getUnitMeasurePage(MesMdUnitMeasurePageReqVO pageReqVO); + + /** + * 获得指定状态的计量单位列表 + * + * @param status 状态 + * @return 计量单位列表 + */ + List getUnitMeasureListByStatus(Integer status); + + /** + * 获得计量单位列表 + * + * @param ids 编号数组 + * @return 计量单位列表 + */ + List getUnitMeasureList(Collection ids); + + /** + * 获得计量单位 Map + * + * @param ids 编号数组 + * @return 计量单位 Map + */ + default Map getUnitMeasureMap(Collection ids) { + return convertMap(getUnitMeasureList(ids), MesMdUnitMeasureDO::getId); + } + + /** + * 根据编码获得计量单位 + * + * @param code 单位编码 + * @return 计量单位 + */ + MesMdUnitMeasureDO getUnitMeasureByCode(String code); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/unitmeasure/MesMdUnitMeasureServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/unitmeasure/MesMdUnitMeasureServiceImpl.java new file mode 100644 index 0000000..af85415 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/unitmeasure/MesMdUnitMeasureServiceImpl.java @@ -0,0 +1,116 @@ +package cn.iocoder.yudao.module.mes.service.md.unitmeasure; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure.vo.MesMdUnitMeasurePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.md.unitmeasure.vo.MesMdUnitMeasureSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; +import cn.iocoder.yudao.module.mes.dal.mysql.md.item.MesMdItemMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.md.unitmeasure.MesMdUnitMeasureMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.Collection; +import java.util.List; +import java.util.Objects; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + +/** + * MES 计量单位 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class MesMdUnitMeasureServiceImpl implements MesMdUnitMeasureService { + + @Resource + private MesMdUnitMeasureMapper unitMeasureMapper; + + @Resource + private MesMdItemMapper itemMapper; + + @Override + public Long createUnitMeasure(MesMdUnitMeasureSaveReqVO createReqVO) { + // 校验编码唯一 + validateUnitMeasureCodeUnique(null, createReqVO.getCode()); + + // 插入 + MesMdUnitMeasureDO unitMeasure = BeanUtils.toBean(createReqVO, MesMdUnitMeasureDO.class); + unitMeasureMapper.insert(unitMeasure); + return unitMeasure.getId(); + } + + @Override + public void updateUnitMeasure(MesMdUnitMeasureSaveReqVO updateReqVO) { + // 校验存在 + validateUnitMeasureExists(updateReqVO.getId()); + // 校验编码唯一 + validateUnitMeasureCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); + + // 更新 + MesMdUnitMeasureDO updateObj = BeanUtils.toBean(updateReqVO, MesMdUnitMeasureDO.class); + unitMeasureMapper.updateById(updateObj); + } + + @Override + public void deleteUnitMeasure(Long id) { + // 校验存在 + validateUnitMeasureExists(id); + // 校验是否被物料引用 + if (itemMapper.selectCountByUnitMeasureId(id) > 0) { + throw exception(MD_UNIT_MEASURE_HAS_ITEM); + } + // 删除 + unitMeasureMapper.deleteById(id); + } + + private void validateUnitMeasureExists(Long id) { + if (unitMeasureMapper.selectById(id) == null) { + throw exception(MD_UNIT_MEASURE_NOT_EXISTS); + } + } + + private void validateUnitMeasureCodeUnique(Long id, String code) { + MesMdUnitMeasureDO unitMeasure = unitMeasureMapper.selectByCode(code); + if (unitMeasure == null) { + return; + } + // 如果 id 为空,说明不用比较是否为相同 id 的记录 + if (id == null) { + throw exception(MD_UNIT_MEASURE_CODE_DUPLICATE); + } + if (!Objects.equals(unitMeasure.getId(), id)) { + throw exception(MD_UNIT_MEASURE_CODE_DUPLICATE); + } + } + + @Override + public MesMdUnitMeasureDO getUnitMeasure(Long id) { + return unitMeasureMapper.selectById(id); + } + + @Override + public PageResult getUnitMeasurePage(MesMdUnitMeasurePageReqVO pageReqVO) { + return unitMeasureMapper.selectPage(pageReqVO); + } + + @Override + public List getUnitMeasureListByStatus(Integer status) { + return unitMeasureMapper.selectListByStatus(status); + } + + @Override + public List getUnitMeasureList(Collection ids) { + return unitMeasureMapper.selectByIds(ids); + } + + @Override + public MesMdUnitMeasureDO getUnitMeasureByCode(String code) { + return unitMeasureMapper.selectByCode(code); + } + +} -- libgit2 0.21.4