From b0adeb36db668b50efafdba31ff0d7682c4c7e32 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 5 Mar 2026 21:51:24 +0800 Subject: [PATCH] ✨ feat(mes): 添加 MES 条码配置和清单相关的请求与响应 VO --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/MesWmBarcodeConfigController.java | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/MesWmBarcodeController.java | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/MesWmBarcodePageReqVO.java | 45 +++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/MesWmBarcodeRespVO.java | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/MesWmBarcodeSaveReqVO.java | 46 ++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/config/MesWmBarcodeConfigPageReqVO.java | 36 ++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/config/MesWmBarcodeConfigRespVO.java | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/config/MesWmBarcodeConfigSaveReqVO.java | 43 +++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/barcode/MesWmBarcodeConfigDO.java | 23 +++++++++++++++++------ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/barcode/MesWmBarcodeDO.java | 26 +++++++++++++------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/barcode/MesWmBarcodeConfigMapper.java | 38 ++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/barcode/MesWmBarcodeMapper.java | 41 +++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java | 9 +++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/MesBizTypeConstants.java | 19 +++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/BarcodeBizTypeEnum.java | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/BarcodeFormatEnum.java | 39 +++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/barcode/MesWmBarcodeAutoGenerator.java | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeConfigService.java | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeConfigServiceImpl.java | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeService.java | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeServiceImpl.java | 114 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 21 files changed, 1115 insertions(+), 19 deletions(-) create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/MesWmBarcodeConfigController.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/MesWmBarcodeController.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/MesWmBarcodePageReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/MesWmBarcodeRespVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/MesWmBarcodeSaveReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/config/MesWmBarcodeConfigPageReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/config/MesWmBarcodeConfigRespVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/config/MesWmBarcodeConfigSaveReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/barcode/MesWmBarcodeConfigMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/barcode/MesWmBarcodeMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/BarcodeBizTypeEnum.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/BarcodeFormatEnum.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/barcode/MesWmBarcodeAutoGenerator.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeConfigService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeConfigServiceImpl.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeServiceImpl.java diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/MesWmBarcodeConfigController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/MesWmBarcodeConfigController.java new file mode 100644 index 0000000..4a12b4e --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/MesWmBarcodeConfigController.java @@ -0,0 +1,73 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.barcode; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +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.wm.barcode.vo.config.MesWmBarcodeConfigPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.barcode.vo.config.MesWmBarcodeConfigRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.barcode.vo.config.MesWmBarcodeConfigSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.barcode.MesWmBarcodeConfigDO; +import cn.iocoder.yudao.module.mes.service.wm.barcode.MesWmBarcodeConfigService; +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.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - MES 条码配置") +@RestController +@RequestMapping("/mes/wm/barcode-config") +@Validated +public class MesWmBarcodeConfigController { + + @Resource + private MesWmBarcodeConfigService barcodeConfigService; + + @PostMapping("/create") + @Operation(summary = "创建条码配置") + @PreAuthorize("@ss.hasPermission('mes:wm-barcode-config:create')") + public CommonResult createBarcodeConfig(@Valid @RequestBody MesWmBarcodeConfigSaveReqVO createReqVO) { + return success(barcodeConfigService.createBarcodeConfig(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新条码配置") + @PreAuthorize("@ss.hasPermission('mes:wm-barcode-config:update')") + public CommonResult updateBarcodeConfig(@Valid @RequestBody MesWmBarcodeConfigSaveReqVO updateReqVO) { + barcodeConfigService.updateBarcodeConfig(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除条码配置") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-barcode-config:delete')") + public CommonResult deleteBarcodeConfig(@RequestParam("id") Long id) { + barcodeConfigService.deleteBarcodeConfig(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得条码配置") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-barcode-config:query')") + public CommonResult getBarcodeConfig(@RequestParam("id") Long id) { + MesWmBarcodeConfigDO config = barcodeConfigService.getBarcodeConfig(id); + return success(BeanUtils.toBean(config, MesWmBarcodeConfigRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得条码配置分页") + @PreAuthorize("@ss.hasPermission('mes:wm-barcode-config:query')") + public CommonResult> getBarcodeConfigPage( + @Valid MesWmBarcodeConfigPageReqVO pageReqVO) { + PageResult pageResult = barcodeConfigService.getBarcodeConfigPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, MesWmBarcodeConfigRespVO.class)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/MesWmBarcodeController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/MesWmBarcodeController.java new file mode 100644 index 0000000..63e98aa --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/MesWmBarcodeController.java @@ -0,0 +1,83 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.barcode; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +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.wm.barcode.vo.MesWmBarcodePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.barcode.vo.MesWmBarcodeRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.barcode.vo.MesWmBarcodeSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.barcode.MesWmBarcodeDO; +import cn.iocoder.yudao.module.mes.service.wm.barcode.MesWmBarcodeService; +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.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - MES 条码清单") +@RestController +@RequestMapping("/mes/wm/barcode") +@Validated +public class MesWmBarcodeController { + + @Resource + private MesWmBarcodeService barcodeService; + + @PostMapping("/create") + @Operation(summary = "创建条码") + @PreAuthorize("@ss.hasPermission('mes:wm-barcode:create')") + public CommonResult createBarcode(@Valid @RequestBody MesWmBarcodeSaveReqVO createReqVO) { + return success(barcodeService.createBarcode(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新条码") + @PreAuthorize("@ss.hasPermission('mes:wm-barcode:update')") + public CommonResult updateBarcode(@Valid @RequestBody MesWmBarcodeSaveReqVO updateReqVO) { + barcodeService.updateBarcode(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除条码") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:wm-barcode:delete')") + public CommonResult deleteBarcode(@RequestParam("id") Long id) { + barcodeService.deleteBarcode(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得条码") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-barcode:query')") + public CommonResult getBarcode(@RequestParam("id") Long id) { + MesWmBarcodeDO barcode = barcodeService.getBarcode(id); + return success(BeanUtils.toBean(barcode, MesWmBarcodeRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得条码分页") + @PreAuthorize("@ss.hasPermission('mes:wm-barcode:query')") + public CommonResult> getBarcodePage(@Valid MesWmBarcodePageReqVO pageReqVO) { + PageResult pageResult = barcodeService.getBarcodePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, MesWmBarcodeRespVO.class)); + } + + @GetMapping("/get-by-business") + @Operation(summary = "根据业务对象获取条码信息", description = "前端用于生成条码图片") + @Parameter(name = "bizType", description = "业务类型", required = true, example = "102") + @Parameter(name = "bizId", description = "业务编号", required = true, example = "1024") + public CommonResult getBarcodeByBusiness( + @RequestParam("bizType") Integer bizType, + @RequestParam("bizId") Long bizId) { + MesWmBarcodeDO barcode = barcodeService.getBarcodeByBizTypeAndBizId(bizType, bizId); + return success(BeanUtils.toBean(barcode, MesWmBarcodeRespVO.class)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/MesWmBarcodePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/MesWmBarcodePageReqVO.java new file mode 100644 index 0000000..e3a120c --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/MesWmBarcodePageReqVO.java @@ -0,0 +1,45 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.barcode.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; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - MES 条码清单分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MesWmBarcodePageReqVO extends PageParam { + + @Schema(description = "条码配置编号", example = "1") + private Long configId; + + @Schema(description = "条码格式", example = "1") + private Integer format; + + @Schema(description = "业务类型", example = "102") + private Integer bizType; + + @Schema(description = "条码内容", example = "WH-WH001") + private String content; + + @Schema(description = "业务编号", example = "1024") + private Long bizId; + + @Schema(description = "业务编码", example = "WH001") + private String bizCode; + + @Schema(description = "状态", example = "0") + private Integer status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/MesWmBarcodeRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/MesWmBarcodeRespVO.java new file mode 100644 index 0000000..5123e45 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/MesWmBarcodeRespVO.java @@ -0,0 +1,57 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.barcode.vo; + +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.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 条码清单 Response VO") +@Data +@ExcelIgnoreUnannotated +public class MesWmBarcodeRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "条码配置编号", example = "1") + private Long configId; + + @Schema(description = "条码格式", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("条码格式") + private Integer format; + + @Schema(description = "业务类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "102") + @ExcelProperty("业务类型") + private Integer bizType; + + @Schema(description = "条码内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "WH-WH001") + @ExcelProperty("条码内容") + private String content; + + @Schema(description = "业务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long bizId; + + @Schema(description = "业务编码", example = "WH001") + @ExcelProperty("业务编码") + private String bizCode; + + @Schema(description = "业务名称", example = "原料仓") + @ExcelProperty("业务名称") + private String bizName; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @ExcelProperty("状态") + private Integer status; + + @Schema(description = "备注", example = "备注") + @ExcelProperty("备注") + private String remark; + + @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/wm/barcode/vo/MesWmBarcodeSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/MesWmBarcodeSaveReqVO.java new file mode 100644 index 0000000..1b417fd --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/MesWmBarcodeSaveReqVO.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.barcode.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Schema(description = "管理后台 - MES 条码清单新增/修改 Request VO") +@Data +public class MesWmBarcodeSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "条码配置编号", example = "1") + private Long configId; + + @Schema(description = "条码格式", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "条码格式不能为空") + private Integer format; + + @Schema(description = "业务类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "102") + @NotNull(message = "业务类型不能为空") + private Integer bizType; + + @Schema(description = "条码内容", example = "WH-WH001") + private String content; + + @Schema(description = "业务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @NotNull(message = "业务编号不能为空") + private Long bizId; + + @Schema(description = "业务编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "WH001") + @NotEmpty(message = "业务编码不能为空") + private String bizCode; + + @Schema(description = "业务名称", example = "原料仓") + private String bizName; + + @Schema(description = "状态", example = "0") + private Integer status; + + @Schema(description = "备注", example = "备注") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/config/MesWmBarcodeConfigPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/config/MesWmBarcodeConfigPageReqVO.java new file mode 100644 index 0000000..903683b --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/config/MesWmBarcodeConfigPageReqVO.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.barcode.vo.config; + +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; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - MES 条码配置分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MesWmBarcodeConfigPageReqVO extends PageParam { + + @Schema(description = "条码格式", example = "1") + private Integer format; + + @Schema(description = "业务类型", example = "102") + private Integer bizType; + + @Schema(description = "是否自动生成", example = "true") + private Boolean autoGenerateFlag; + + @Schema(description = "状态", example = "0") + private Integer status; + + @Schema(description = "创建时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/config/MesWmBarcodeConfigRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/config/MesWmBarcodeConfigRespVO.java new file mode 100644 index 0000000..b6b97e5 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/config/MesWmBarcodeConfigRespVO.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.barcode.vo.config; + +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.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 条码配置 Response VO") +@Data +@ExcelIgnoreUnannotated +public class MesWmBarcodeConfigRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "条码格式", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("条码格式") + private Integer format; + + @Schema(description = "业务类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "102") + @ExcelProperty("业务类型") + private Integer bizType; + + @Schema(description = "内容格式模板", requiredMode = Schema.RequiredMode.REQUIRED, example = "WH-{BUSINESSCODE}") + @ExcelProperty("内容格式模板") + private String contentFormat; + + @Schema(description = "内容样例", example = "WH-WH001") + @ExcelProperty("内容样例") + private String contentExample; + + @Schema(description = "是否自动生成", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @ExcelProperty("是否自动生成") + private Boolean autoGenerateFlag; + + @Schema(description = "默认打印模板", example = "template1") + @ExcelProperty("默认打印模板") + private String defaultTemplate; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") + @ExcelProperty("状态") + private Integer status; + + @Schema(description = "备注", example = "备注") + @ExcelProperty("备注") + private String remark; + + @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/wm/barcode/vo/config/MesWmBarcodeConfigSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/config/MesWmBarcodeConfigSaveReqVO.java new file mode 100644 index 0000000..fb0d319 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/barcode/vo/config/MesWmBarcodeConfigSaveReqVO.java @@ -0,0 +1,43 @@ +package cn.iocoder.yudao.module.mes.controller.admin.wm.barcode.vo.config; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Schema(description = "管理后台 - MES 条码配置新增/修改 Request VO") +@Data +public class MesWmBarcodeConfigSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "条码格式", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "条码格式不能为空") + private Integer format; + + @Schema(description = "业务类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "102") + @NotNull(message = "业务类型不能为空") + private Integer bizType; + + @Schema(description = "内容格式模板", requiredMode = Schema.RequiredMode.REQUIRED, example = "WH-{BUSINESSCODE}") + @NotEmpty(message = "内容格式模板不能为空") + private String contentFormat; + + @Schema(description = "内容样例", example = "WH-WH001") + private String contentExample; + + @Schema(description = "是否自动生成", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") + @NotNull(message = "是否自动生成不能为空") + private Boolean autoGenerateFlag; + + @Schema(description = "默认打印模板", example = "template1") + private String defaultTemplate; + + @Schema(description = "状态", example = "0") + private Integer status; + + @Schema(description = "备注", example = "备注") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/barcode/MesWmBarcodeConfigDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/barcode/MesWmBarcodeConfigDO.java index 3daafa1..0d44f13 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/barcode/MesWmBarcodeConfigDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/barcode/MesWmBarcodeConfigDO.java @@ -8,6 +8,8 @@ import lombok.*; /** * MES 条码配置 DO + * + * @author 芋道源码 */ @TableName("mes_wm_barcode_config") @KeySequence("mes_wm_barcode_config_seq") @@ -20,21 +22,31 @@ import lombok.*; public class MesWmBarcodeConfigDO extends BaseDO { /** + * 内容格式模板占位符 + */ + public static final String PLACEHOLDER_BUSINESS_CODE = "{BUSINESSCODE}"; + + /** * 编号 */ @TableId private Long id; /** * 条码格式 + * + * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.BarcodeFormatEnum} */ - private String format; - // TODO DONE @AI:需要有个枚举类;这样后续方便使用;=> 条码业务类型为字符串字典值,具体枚举值由业务字典管理,暂无需 Java 枚举类 + private Integer format; /** - * 条码业务类型 + * 业务类型 + * + * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.BarcodeBizTypeEnum} */ - private String type; + private Integer bizType; /** - * 内容格式 + * 内容格式模板(支持 {BUSINESSCODE} 占位符) + * + * @see #PLACEHOLDER_BUSINESS_CODE */ private String contentFormat; /** @@ -45,7 +57,6 @@ public class MesWmBarcodeConfigDO extends BaseDO { * 是否自动生成 */ private Boolean autoGenerateFlag; - // todo DONE @AI:printTemplate 改成这个字段;=> 已改名为 defaultTemplate /** * 默认打印模板 */ diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/barcode/MesWmBarcodeDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/barcode/MesWmBarcodeDO.java index 910fa3f..2205bb9 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/barcode/MesWmBarcodeDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/barcode/MesWmBarcodeDO.java @@ -8,6 +8,8 @@ import lombok.*; /** * MES 条码清单 DO + * + * @author 芋道源码 */ @TableName("mes_wm_barcode") @KeySequence("mes_wm_barcode_seq") @@ -32,34 +34,32 @@ public class MesWmBarcodeDO extends BaseDO { private Long configId; /** * 条码格式 + * + * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.BarcodeFormatEnum} */ - private String format; - // TODO DONE @AI:需要有个枚举类;这样后续方便使用;=> 条码业务类型为字符串字典值,具体枚举值由业务字典管理,暂无需 Java 枚举类 + private Integer format; /** - * 条码业务类型 + * 业务类型 + * + * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.BarcodeBizTypeEnum} */ - private String type; + private Integer bizType; /** - * 条码内容 + * 条码内容(核心字段,前端根据此内容生成条码图片) */ private String content; /** * 业务编号 */ - private Long businessId; + private Long bizId; /** * 业务编码 */ - private String businessCode; + private String bizCode; /** * 业务名称 */ - private String businessName; - // TODO DONE @AI:条码必须后端生成么?可以前端生成么?=> 条码建议后端生成,保证全局唯一性、可追溯,且避免前端伪造 - /** - * 条码地址 - */ - private String imageUrl; + private String bizName; /** * 状态 * diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/barcode/MesWmBarcodeConfigMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/barcode/MesWmBarcodeConfigMapper.java new file mode 100644 index 0000000..cbf0a7f --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/barcode/MesWmBarcodeConfigMapper.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.barcode; + +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.wm.barcode.vo.config.MesWmBarcodeConfigPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.barcode.MesWmBarcodeConfigDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * MES 条码配置 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface MesWmBarcodeConfigMapper extends BaseMapperX { + + default PageResult selectPage(MesWmBarcodeConfigPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MesWmBarcodeConfigDO::getFormat, reqVO.getFormat()) + .eqIfPresent(MesWmBarcodeConfigDO::getBizType, reqVO.getBizType()) + .eqIfPresent(MesWmBarcodeConfigDO::getAutoGenerateFlag, reqVO.getAutoGenerateFlag()) + .eqIfPresent(MesWmBarcodeConfigDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(MesWmBarcodeConfigDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(MesWmBarcodeConfigDO::getId)); + } + + default MesWmBarcodeConfigDO selectByBizType(Integer bizType) { + return selectOne(MesWmBarcodeConfigDO::getBizType, bizType); + } + + default List selectListByAutoGenerateFlag(Boolean autoGenerateFlag) { + return selectList(MesWmBarcodeConfigDO::getAutoGenerateFlag, autoGenerateFlag); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/barcode/MesWmBarcodeMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/barcode/MesWmBarcodeMapper.java new file mode 100644 index 0000000..809c5f7 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/barcode/MesWmBarcodeMapper.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.barcode; + +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.wm.barcode.vo.MesWmBarcodePageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.barcode.MesWmBarcodeDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * MES 条码清单 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface MesWmBarcodeMapper extends BaseMapperX { + + default PageResult selectPage(MesWmBarcodePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MesWmBarcodeDO::getConfigId, reqVO.getConfigId()) + .eqIfPresent(MesWmBarcodeDO::getFormat, reqVO.getFormat()) + .eqIfPresent(MesWmBarcodeDO::getBizType, reqVO.getBizType()) + .likeIfPresent(MesWmBarcodeDO::getContent, reqVO.getContent()) + .eqIfPresent(MesWmBarcodeDO::getBizId, reqVO.getBizId()) + .likeIfPresent(MesWmBarcodeDO::getBizCode, reqVO.getBizCode()) + .eqIfPresent(MesWmBarcodeDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(MesWmBarcodeDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(MesWmBarcodeDO::getId)); + } + + default MesWmBarcodeDO selectByBizTypeAndBizId(Integer bizType, Long bizId) { + return selectOne(new LambdaQueryWrapperX() + .eq(MesWmBarcodeDO::getBizType, bizType) + .eq(MesWmBarcodeDO::getBizId, bizId)); + } + + default MesWmBarcodeDO selectByContent(String content) { + return selectOne(MesWmBarcodeDO::getContent, content); + } + +} 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 10a81ab..b04c554 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 @@ -497,4 +497,13 @@ public interface ErrorCodeConstants { ErrorCode WM_SALES_NOTICE_LINE_NOT_EXISTS = new ErrorCode(1_040_720_010, "发货通知单行不存在"); ErrorCode WM_SALES_NOTICE_LINE_EMPTY = new ErrorCode(1_040_720_011, "发货通知单行为空,不能提交"); + // ========== MES 仓库管理-条码配置(1-040-730-000) ========== + ErrorCode WM_BARCODE_CONFIG_NOT_EXISTS = new ErrorCode(1_040_730_000, "条码配置不存在"); + ErrorCode WM_BARCODE_CONFIG_BIZ_TYPE_DUPLICATE = new ErrorCode(1_040_730_001, "该业务类型的条码配置已存在"); + + // ========== MES 仓库管理-条码清单(1-040-731-000) ========== + ErrorCode WM_BARCODE_NOT_EXISTS = new ErrorCode(1_040_731_000, "条码不存在"); + ErrorCode WM_BARCODE_ALREADY_EXISTS = new ErrorCode(1_040_731_001, "该业务对象的条码已存在"); + ErrorCode WM_BARCODE_CONTENT_DUPLICATE = new ErrorCode(1_040_731_002, "条码内容已存在"); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/MesBizTypeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/MesBizTypeConstants.java index e249b06..ec1d469 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/MesBizTypeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/MesBizTypeConstants.java @@ -23,6 +23,11 @@ public final class MesBizTypeConstants { public static final int WM_ARRIVAL_NOTICE = 100; // 到货通知单:MesWmArrivalNoticeDO // public static final int WM_OUTSOURCE_RECPT = 101; // TODO 外协入库单:未实现,占位 + public static final int WM_WAREHOUSE = 102; // 仓库:MesWmWarehouseDO + public static final int WM_AREA = 103; // 库位:MesWmStorageAreaDO + public static final int WM_PACKAGE = 104; // 装箱单:MesWmPackageDO + public static final int WM_STOCK = 105; // 库存:MesWmMaterialStockDO + public static final int WM_BATCH = 106; // 批次:MesWmBatchDO // ========== CAL 排班模块 [200, 300) ========== @@ -31,10 +36,24 @@ public final class MesBizTypeConstants { // ========== PRO 生产模块 [300, 400) ========== + public static final int PRO_CARD = 300; // 流转卡:MesProCardDO + public static final int PRO_WORKORDER = 301; // 工单:MesProWorkOrderDO + public static final int PRO_TRANS_ORDER = 302; // 流转单:MesProTransOrderDO + // ========== DV 设备模块 [400, 500) ========== + public static final int DV_MACHINERY = 400; // 设备:MesDvMachineryDO + // ========== TM 工装夹具模块 [500, 600) ========== + public static final int TM_TOOL = 500; // 工装:MesToolDO + // ========== MD 主数据模块 [600, 700) ========== + public static final int MD_ITEM = 600; // 物料:MesMdItemDO + public static final int MD_VENDOR = 601; // 供应商:MesMdVendorDO + public static final int MD_WORKSTATION = 602; // 工作站:MesMdWorkstationDO + public static final int MD_WORKSHOP = 603; // 车间:MesMdWorkshopDO + public static final int MD_USER = 604; // 人员:系统用户 + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/BarcodeBizTypeEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/BarcodeBizTypeEnum.java new file mode 100644 index 0000000..0c8dcf1 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/BarcodeBizTypeEnum.java @@ -0,0 +1,60 @@ +package cn.iocoder.yudao.module.mes.enums.wm; + +import cn.iocoder.yudao.framework.common.core.ArrayValuable; +import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * MES 条码业务类型枚举 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum BarcodeBizTypeEnum implements ArrayValuable { + + // ========== WM 仓库模块 [100, 200) ========== + WAREHOUSE(MesBizTypeConstants.WM_WAREHOUSE, "仓库"), + AREA(MesBizTypeConstants.WM_AREA, "库位"), + PACKAGE(MesBizTypeConstants.WM_PACKAGE, "装箱单"), + STOCK(MesBizTypeConstants.WM_STOCK, "库存"), + BATCH(MesBizTypeConstants.WM_BATCH, "批次"), + + // ========== PRO 生产模块 [300, 400) ========== + PROCARD(MesBizTypeConstants.PRO_CARD, "流转卡"), + WORKORDER(MesBizTypeConstants.PRO_WORKORDER, "工单"), + TRANSORDER(MesBizTypeConstants.PRO_TRANS_ORDER, "流转单"), + + // ========== DV 设备模块 [400, 500) ========== + MACHINERY(MesBizTypeConstants.DV_MACHINERY, "设备"), + + // ========== TM 工装夹具模块 [500, 600) ========== + TOOL(MesBizTypeConstants.TM_TOOL, "工装"), + + // ========== MD 主数据模块 [600, 700) ========== + ITEM(MesBizTypeConstants.MD_ITEM, "物料"), + VENDOR(MesBizTypeConstants.MD_VENDOR, "供应商"), + WORKSTATION(MesBizTypeConstants.MD_WORKSTATION, "工作站"), + WORKSHOP(MesBizTypeConstants.MD_WORKSHOP, "车间"), + USER(MesBizTypeConstants.MD_USER, "人员"); + + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BarcodeBizTypeEnum::getValue).toArray(Integer[]::new); + + /** + * 业务类型值 + */ + private final Integer value; + /** + * 业务类型名称 + */ + private final String label; + + @Override + public Integer[] array() { + return ARRAYS; + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/BarcodeFormatEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/BarcodeFormatEnum.java new file mode 100644 index 0000000..ef1c900 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/BarcodeFormatEnum.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.mes.enums.wm; + +import cn.iocoder.yudao.framework.common.core.ArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * MES 条码格式枚举 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum BarcodeFormatEnum implements ArrayValuable { + + QR_CODE(1, "二维码"), + EAN13(2, "EAN13 商品条码"), + CODE39(3, "CODE39 工业条码"), + UPC_A(4, "UPC-A 美国商品码"); + + public static final Integer[] ARRAYS = Arrays.stream(values()).map(BarcodeFormatEnum::getValue).toArray(Integer[]::new); + + /** + * 格式值 + */ + private final Integer value; + /** + * 格式名称 + */ + private final String label; + + @Override + public Integer[] array() { + return ARRAYS; + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/barcode/MesWmBarcodeAutoGenerator.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/barcode/MesWmBarcodeAutoGenerator.java new file mode 100644 index 0000000..ef828be --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/barcode/MesWmBarcodeAutoGenerator.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.mes.framework.barcode; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.module.mes.controller.admin.wm.barcode.vo.MesWmBarcodeSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.barcode.MesWmBarcodeConfigDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.barcode.MesWmBarcodeDO; +import cn.iocoder.yudao.module.mes.service.wm.barcode.MesWmBarcodeConfigService; +import cn.iocoder.yudao.module.mes.service.wm.barcode.MesWmBarcodeService; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +/** + * MES 条码自动生成器 + * + * @author 芋道源码 + */ +@Component +@Slf4j +public class MesWmBarcodeAutoGenerator { + + @Resource + private MesWmBarcodeConfigService barcodeConfigService; + + @Resource + private MesWmBarcodeService barcodeService; + + // TODO @AI:合并到 MesWmBarcodeServiceImpl 中; + /** + * 自动生成条码 + * + * @param bizType 业务类型 + * @param bizId 业务编号 + * @param bizCode 业务编码 + * @param bizName 业务名称 + */ + @Async + // TODO @AI:就不异步处理了,必要性不大; + public void autoGenerateBarcode(Integer bizType, Long bizId, String bizCode, String bizName) { + // TODO @AI:不要 try catch;;;;必须成功! + try { + // 1.1 检查是否配置自动生成 + MesWmBarcodeConfigDO config = barcodeConfigService.getBarcodeConfigByBizType(bizType); + if (config == null) { + return; + } + // TODO @AI:Boolean.False 去比较;跳过; + if (!config.getAutoGenerateFlag()) { + return; + } + // TODO @AI;CommonStatusEnum.isFalse(config.getStatus()) 去比较;把上面 3 个判断,合并下; + if (!CommonStatusEnum.ENABLE.getStatus().equals(config.getStatus())) { + return; + } + // 1.2 检查是否已存在条码 + MesWmBarcodeDO existBarcode = barcodeService.getBarcodeByBizTypeAndBizId(bizType, bizId); + if (existBarcode != null) { + return; + } + + // 2. 创建条码记录 + MesWmBarcodeSaveReqVO createReqVO = new MesWmBarcodeSaveReqVO() + .setFormat(config.getFormat()).setStatus(CommonStatusEnum.ENABLE.getStatus()) + .setBizType(bizType).setBizId(bizId).setBizCode(bizCode).setBizName(bizName); + Long barcodeId = barcodeService.createBarcode(createReqVO); + // TODO @AI:这里就不打日志了; + log.info("自动生成条码成功 [业务类型={}, 业务ID={}, 条码ID={}]", bizType, bizId, barcodeId); + } catch (Exception e) { + log.error("自动生成条码失败 [业务类型={}, 业务ID={}]", bizType, bizId, e); + } + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeConfigService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeConfigService.java new file mode 100644 index 0000000..1bbd356 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeConfigService.java @@ -0,0 +1,80 @@ +package cn.iocoder.yudao.module.mes.service.wm.barcode; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.wm.barcode.vo.config.MesWmBarcodeConfigPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.barcode.vo.config.MesWmBarcodeConfigSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.barcode.MesWmBarcodeConfigDO; +import jakarta.validation.Valid; + +import java.util.List; + +/** + * MES 条码配置 Service 接口 + * + * @author 芋道源码 + */ +public interface MesWmBarcodeConfigService { + + /** + * 创建条码配置 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createBarcodeConfig(@Valid MesWmBarcodeConfigSaveReqVO createReqVO); + + /** + * 更新条码配置 + * + * @param updateReqVO 更新信息 + */ + void updateBarcodeConfig(@Valid MesWmBarcodeConfigSaveReqVO updateReqVO); + + /** + * 删除条码配置 + * + * @param id 编号 + */ + void deleteBarcodeConfig(Long id); + + /** + * 获得条码配置 + * + * @param id 编号 + * @return 条码配置 + */ + MesWmBarcodeConfigDO getBarcodeConfig(Long id); + + /** + * 获得条码配置分页 + * + * @param pageReqVO 分页参数 + * @return 条码配置分页 + */ + PageResult getBarcodeConfigPage(MesWmBarcodeConfigPageReqVO pageReqVO); + + /** + * 根据业务类型获取条码配置 + * + * @param bizType 业务类型 + * @return 条码配置 + */ + MesWmBarcodeConfigDO getBarcodeConfigByBizType(Integer bizType); + + /** + * 校验条码配置存在(根据业务类型) + * + * @param bizType 业务类型 + * @return 条码配置 + */ + MesWmBarcodeConfigDO validateBarcodeConfigByBizType(Integer bizType); + + // TODO @AI:是不是删除掉?貌似没用哈。 + /** + * 获取自动生成的条码配置列表 + * + * @return 条码配置列表 + */ + List getAutoGenerateBarcodeConfigList(); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeConfigServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeConfigServiceImpl.java new file mode 100644 index 0000000..4c2800c --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeConfigServiceImpl.java @@ -0,0 +1,110 @@ +package cn.iocoder.yudao.module.mes.service.wm.barcode; + +import cn.hutool.core.util.ObjUtil; +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.wm.barcode.vo.config.MesWmBarcodeConfigPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.barcode.vo.config.MesWmBarcodeConfigSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.barcode.MesWmBarcodeConfigDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.barcode.MesWmBarcodeConfigMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.List; + +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 MesWmBarcodeConfigServiceImpl implements MesWmBarcodeConfigService { + + @Resource + private MesWmBarcodeConfigMapper barcodeConfigMapper; + + @Override + public Long createBarcodeConfig(MesWmBarcodeConfigSaveReqVO createReqVO) { + // 校验业务类型唯一 + validateBarcodeConfigBizTypeUnique(null, createReqVO.getBizType()); + + // 插入 + MesWmBarcodeConfigDO config = BeanUtils.toBean(createReqVO, MesWmBarcodeConfigDO.class); + barcodeConfigMapper.insert(config); + return config.getId(); + } + + @Override + public void updateBarcodeConfig(MesWmBarcodeConfigSaveReqVO updateReqVO) { + // 校验存在 + validateBarcodeConfigExists(updateReqVO.getId()); + // 校验业务类型唯一 + validateBarcodeConfigBizTypeUnique(updateReqVO.getId(), updateReqVO.getBizType()); + + // 更新 + MesWmBarcodeConfigDO updateObj = BeanUtils.toBean(updateReqVO, MesWmBarcodeConfigDO.class); + barcodeConfigMapper.updateById(updateObj); + } + + @Override + public void deleteBarcodeConfig(Long id) { + // 校验存在 + validateBarcodeConfigExists(id); + // 删除 + barcodeConfigMapper.deleteById(id); + } + + private MesWmBarcodeConfigDO validateBarcodeConfigExists(Long id) { + MesWmBarcodeConfigDO config = barcodeConfigMapper.selectById(id); + if (config == null) { + throw exception(WM_BARCODE_CONFIG_NOT_EXISTS); + } + return config; + } + + private void validateBarcodeConfigBizTypeUnique(Long id, Integer bizType) { + MesWmBarcodeConfigDO config = barcodeConfigMapper.selectByBizType(bizType); + if (config == null) { + return; + } + if (ObjUtil.notEqual(config.getId(), id)) { + throw exception(WM_BARCODE_CONFIG_BIZ_TYPE_DUPLICATE); + } + } + + @Override + public MesWmBarcodeConfigDO getBarcodeConfig(Long id) { + return barcodeConfigMapper.selectById(id); + } + + @Override + public PageResult getBarcodeConfigPage(MesWmBarcodeConfigPageReqVO pageReqVO) { + return barcodeConfigMapper.selectPage(pageReqVO); + } + + @Override + public MesWmBarcodeConfigDO getBarcodeConfigByBizType(Integer bizType) { + return barcodeConfigMapper.selectByBizType(bizType); + } + + @Override + public MesWmBarcodeConfigDO validateBarcodeConfigByBizType(Integer bizType) { + MesWmBarcodeConfigDO config = barcodeConfigMapper.selectByBizType(bizType); + if (config == null) { + throw exception(WM_BARCODE_CONFIG_NOT_EXISTS); + } + return config; + } + + // TODO @AI:getBarcodeConfigListByAutoGenerateFlag,获取自动生成条码的配置列表(Boolean ) + @Override + public List getAutoGenerateBarcodeConfigList() { + return barcodeConfigMapper.selectListByAutoGenerateFlag(true); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeService.java new file mode 100644 index 0000000..c662988 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeService.java @@ -0,0 +1,63 @@ +package cn.iocoder.yudao.module.mes.service.wm.barcode; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.wm.barcode.vo.MesWmBarcodePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.barcode.vo.MesWmBarcodeSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.barcode.MesWmBarcodeDO; +import jakarta.validation.Valid; + +/** + * MES 条码清单 Service 接口 + * + * @author 芋道源码 + */ +public interface MesWmBarcodeService { + + /** + * 创建条码 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createBarcode(@Valid MesWmBarcodeSaveReqVO createReqVO); + + /** + * 更新条码 + * + * @param updateReqVO 更新信息 + */ + void updateBarcode(@Valid MesWmBarcodeSaveReqVO updateReqVO); + + /** + * 删除条码 + * + * @param id 编号 + */ + void deleteBarcode(Long id); + + /** + * 获得条码 + * + * @param id 编号 + * @return 条码 + */ + MesWmBarcodeDO getBarcode(Long id); + + /** + * 获得条码分页 + * + * @param pageReqVO 分页参数 + * @return 条码分页 + */ + PageResult getBarcodePage(MesWmBarcodePageReqVO pageReqVO); + + /** + * 根据业务类型和业务编号获取条码 + * + * @param bizType 业务类型 + * @param bizId 业务编号 + * @return 条码 + */ + MesWmBarcodeDO getBarcodeByBizTypeAndBizId(Integer bizType, Long bizId); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeServiceImpl.java new file mode 100644 index 0000000..2cdbbba --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/barcode/MesWmBarcodeServiceImpl.java @@ -0,0 +1,114 @@ +package cn.iocoder.yudao.module.mes.service.wm.barcode; + +import cn.hutool.core.util.StrUtil; +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.wm.barcode.vo.MesWmBarcodePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.barcode.vo.MesWmBarcodeSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.barcode.MesWmBarcodeConfigDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.barcode.MesWmBarcodeDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.barcode.MesWmBarcodeMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +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 MesWmBarcodeServiceImpl implements MesWmBarcodeService { + + @Resource + private MesWmBarcodeMapper barcodeMapper; + + @Resource + private MesWmBarcodeConfigService barcodeConfigService; + + @Override + public Long createBarcode(MesWmBarcodeSaveReqVO createReqVO) { + // 1.1 校验条码配置 + MesWmBarcodeConfigDO config = barcodeConfigService.validateBarcodeConfigByBizType(createReqVO.getBizType()); + // 1.2 校验是否已存在条码 + MesWmBarcodeDO existBarcode = barcodeMapper.selectByBizTypeAndBizId( + createReqVO.getBizType(), createReqVO.getBizId()); + if (existBarcode != null) { + throw exception(WM_BARCODE_ALREADY_EXISTS); + } + + // 2.1 生成条码内容(根据配置模板) + String content = generateBarcodeContent(config.getContentFormat(), createReqVO.getBizCode()); + // 2.2 校验条码内容唯一性 + MesWmBarcodeDO contentBarcode = barcodeMapper.selectByContent(content); + if (contentBarcode != null) { + throw exception(WM_BARCODE_CONTENT_DUPLICATE); + } + + // 3. 保存条码记录 + MesWmBarcodeDO barcode = BeanUtils.toBean(createReqVO, MesWmBarcodeDO.class) + .setConfigId(config.getId()).setContent(content).setFormat(config.getFormat()); + barcodeMapper.insert(barcode); + return barcode.getId(); + } + + @Override + public void updateBarcode(MesWmBarcodeSaveReqVO updateReqVO) { + // 校验存在 + validateBarcodeExists(updateReqVO.getId()); + + // 更新 + MesWmBarcodeDO updateObj = BeanUtils.toBean(updateReqVO, MesWmBarcodeDO.class); + barcodeMapper.updateById(updateObj); + } + + @Override + public void deleteBarcode(Long id) { + // 校验存在 + validateBarcodeExists(id); + // 删除 + barcodeMapper.deleteById(id); + } + + private MesWmBarcodeDO validateBarcodeExists(Long id) { + MesWmBarcodeDO barcode = barcodeMapper.selectById(id); + if (barcode == null) { + throw exception(WM_BARCODE_NOT_EXISTS); + } + return barcode; + } + + @Override + public MesWmBarcodeDO getBarcode(Long id) { + return barcodeMapper.selectById(id); + } + + @Override + public PageResult getBarcodePage(MesWmBarcodePageReqVO pageReqVO) { + return barcodeMapper.selectPage(pageReqVO); + } + + @Override + public MesWmBarcodeDO getBarcodeByBizTypeAndBizId(Integer bizType, Long bizId) { + return barcodeMapper.selectByBizTypeAndBizId(bizType, bizId); + } + + /** + * 生成条码内容 + * + * @param contentFormat 内容格式模板 + * @param bizCode 业务编码 + * @return 条码内容 + */ + private String generateBarcodeContent(String contentFormat, String bizCode) { + if (StrUtil.isBlank(contentFormat)) { + return bizCode; + } + return contentFormat.replace(MesWmBarcodeConfigDO.PLACEHOLDER_BUSINESS_CODE, bizCode); + } + +} -- libgit2 0.21.4