diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/MesTmToolController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/MesTmToolController.java new file mode 100644 index 0000000..f017799 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/MesTmToolController.java @@ -0,0 +1,129 @@ +package cn.iocoder.yudao.module.mes.controller.admin.tm.tool; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +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.tm.tool.vo.MesTmToolPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.tm.tool.vo.MesTmToolRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.tm.tool.vo.MesTmToolSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.tm.tool.MesTmToolDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.tm.tool.MesTmToolTypeDO; +import cn.iocoder.yudao.module.mes.service.tm.tool.MesTmToolService; +import cn.iocoder.yudao.module.mes.service.tm.tool.MesTmToolTypeService; +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 java.util.Map; + +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.convertSet; + +@Tag(name = "管理后台 - MES 工具台账") +@RestController +@RequestMapping("/mes/tm/tool") +@Validated +public class MesTmToolController { + + @Resource + private MesTmToolService toolService; + + @Resource + private MesTmToolTypeService toolTypeService; + + @PostMapping("/create") + @Operation(summary = "创建工具") + @PreAuthorize("@ss.hasPermission('mes:tm-tool:create')") + public CommonResult createTool(@Valid @RequestBody MesTmToolSaveReqVO createReqVO) { + return success(toolService.createTool(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新工具") + @PreAuthorize("@ss.hasPermission('mes:tm-tool:update')") + public CommonResult updateTool(@Valid @RequestBody MesTmToolSaveReqVO updateReqVO) { + toolService.updateTool(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除工具") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:tm-tool:delete')") + public CommonResult deleteTool(@RequestParam("id") Long id) { + toolService.deleteTool(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得工具") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:tm-tool:query')") + public CommonResult getTool(@RequestParam("id") Long id) { + MesTmToolDO tool = toolService.getTool(id); + MesTmToolRespVO respVO = BeanUtils.toBean(tool, MesTmToolRespVO.class); + // 拼接工具类型名称 + if (respVO != null && respVO.getToolTypeId() != null) { + MesTmToolTypeDO toolType = toolTypeService.getToolType(respVO.getToolTypeId()); + if (toolType != null) { + respVO.setToolTypeName(toolType.getName()); + } + } + return success(respVO); + } + + @GetMapping("/page") + @Operation(summary = "获得工具分页") + @PreAuthorize("@ss.hasPermission('mes:tm-tool:query')") + public CommonResult> getToolPage(@Valid MesTmToolPageReqVO pageReqVO) { + PageResult pageResult = toolService.getToolPage(pageReqVO); + PageResult voPageResult = BeanUtils.toBean(pageResult, MesTmToolRespVO.class); + // 拼接工具类型名称 + Map toolTypeMap = toolTypeService.getToolTypeMap( + convertSet(voPageResult.getList(), MesTmToolRespVO::getToolTypeId)); + voPageResult.getList().forEach(vo -> { + MesTmToolTypeDO toolType = toolTypeMap.get(vo.getToolTypeId()); + if (toolType != null) { + vo.setToolTypeName(toolType.getName()); + } + }); + return success(voPageResult); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出工具 Excel") + @PreAuthorize("@ss.hasPermission('mes:tm-tool:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportToolExcel(@Valid MesTmToolPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = toolService.getToolPage(pageReqVO).getList(); + List voList = BeanUtils.toBean(list, MesTmToolRespVO.class); + // 拼接工具类型名称 + Map toolTypeMap = toolTypeService.getToolTypeMap( + convertSet(voList, MesTmToolRespVO::getToolTypeId)); + voList.forEach(vo -> { + MesTmToolTypeDO toolType = toolTypeMap.get(vo.getToolTypeId()); + if (toolType != null) { + vo.setToolTypeName(toolType.getName()); + } + }); + // 导出 Excel + ExcelUtils.write(response, "工具台账.xls", "数据", MesTmToolRespVO.class, voList); + } + + // TODO @AI:page、export 都有拼接;可以参考别的模块的出列方式, 抽 build 公用方法; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/MesTmToolTypeController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/MesTmToolTypeController.java new file mode 100644 index 0000000..50312be --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/MesTmToolTypeController.java @@ -0,0 +1,100 @@ +package cn.iocoder.yudao.module.mes.controller.admin.tm.tool; + +import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog; +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.tm.tool.vo.type.MesTmToolTypePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.tm.tool.vo.type.MesTmToolTypeRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.tm.tool.vo.type.MesTmToolTypeSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.tm.tool.MesTmToolTypeDO; +import cn.iocoder.yudao.module.mes.service.tm.tool.MesTmToolTypeService; +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; + +@Tag(name = "管理后台 - MES 工具类型") +@RestController +@RequestMapping("/mes/tm/tool-type") +@Validated +public class MesTmToolTypeController { + + @Resource + private MesTmToolTypeService toolTypeService; + + @PostMapping("/create") + @Operation(summary = "创建工具类型") + @PreAuthorize("@ss.hasPermission('mes:tm-tool-type:create')") + public CommonResult createToolType(@Valid @RequestBody MesTmToolTypeSaveReqVO createReqVO) { + return success(toolTypeService.createToolType(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新工具类型") + @PreAuthorize("@ss.hasPermission('mes:tm-tool-type:update')") + public CommonResult updateToolType(@Valid @RequestBody MesTmToolTypeSaveReqVO updateReqVO) { + toolTypeService.updateToolType(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除工具类型") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:tm-tool-type:delete')") + public CommonResult deleteToolType(@RequestParam("id") Long id) { + toolTypeService.deleteToolType(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得工具类型") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:tm-tool-type:query')") + public CommonResult getToolType(@RequestParam("id") Long id) { + MesTmToolTypeDO toolType = toolTypeService.getToolType(id); + return success(BeanUtils.toBean(toolType, MesTmToolTypeRespVO.class)); + } + + @GetMapping("/page") + @Operation(summary = "获得工具类型分页") + @PreAuthorize("@ss.hasPermission('mes:tm-tool-type:query')") + public CommonResult> getToolTypePage(@Valid MesTmToolTypePageReqVO pageReqVO) { + PageResult pageResult = toolTypeService.getToolTypePage(pageReqVO); + return success(BeanUtils.toBean(pageResult, MesTmToolTypeRespVO.class)); + } + + @GetMapping("/simple-list") + @Operation(summary = "获得工具类型精简列表", description = "主要用于前端的下拉选项") + public CommonResult> getToolTypeSimpleList() { + List list = toolTypeService.getToolTypeList(); + return success(BeanUtils.toBean(list, MesTmToolTypeRespVO.class)); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出工具类型 Excel") + @PreAuthorize("@ss.hasPermission('mes:tm-tool-type:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportToolTypeExcel(@Valid MesTmToolTypePageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = toolTypeService.getToolTypePage(pageReqVO).getList(); + // 导出 Excel + ExcelUtils.write(response, "工具类型.xls", "数据", MesTmToolTypeRespVO.class, + BeanUtils.toBean(list, MesTmToolTypeRespVO.class)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/MesTmToolPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/MesTmToolPageReqVO.java new file mode 100644 index 0000000..b51082e --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/MesTmToolPageReqVO.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.mes.controller.admin.tm.tool.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 MesTmToolPageReqVO extends PageParam { + + @Schema(description = "工具编码", example = "T-001") + private String code; + + @Schema(description = "工具名称", example = "铣刀") + private String name; + + @Schema(description = "工具类型编号", example = "100") + private Long toolTypeId; + + @Schema(description = "品牌", example = "三菱") + private String brand; + + @Schema(description = "型号规格", example = "M5-100") + private String spec; + + @Schema(description = "状态", example = "1") + private Integer status; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/MesTmToolRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/MesTmToolRespVO.java new file mode 100644 index 0000000..dd9c5c6 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/MesTmToolRespVO.java @@ -0,0 +1,91 @@ +package cn.iocoder.yudao.module.mes.controller.admin.tm.tool.vo; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.module.mes.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.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 工具台账 Response VO") +@Data +@ExcelIgnoreUnannotated +public class MesTmToolRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "工具编码", example = "T-001") + @ExcelProperty("工具编码") + private String code; + + @Schema(description = "工具名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "5mm 铣刀") + @ExcelProperty("工具名称") + private String name; + + @Schema(description = "品牌", example = "三菱") + @ExcelProperty("品牌") + private String brand; + + @Schema(description = "型号规格", example = "M5-100") + @ExcelProperty("型号规格") + private String spec; + + @Schema(description = "工具类型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") + private Long toolTypeId; + + @Schema(description = "工具类型名称", example = "铣刀") + @ExcelProperty("工具类型") + private String toolTypeName; + + @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty("数量") + private Integer quantity; + + @Schema(description = "可用数量", example = "1") + @ExcelProperty("可用数量") + private Integer quantityAvailable; + + @Schema(description = "保养维护类型", example = "1") + @ExcelProperty(value = "保养维护类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.MES_TM_MAINTEN_TYPE) + private Integer maintenType; + + @Schema(description = "下次保养周期(次数)", example = "100") + @ExcelProperty("下次保养周期") + private Integer nextMaintenPeriod; + + @Schema(description = "下次保养日期", example = "2024-06-01 00:00:00") + @ExcelProperty("下次保养日期") + private LocalDateTime nextMaintenDate; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.MES_TM_TOOL_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/tm/tool/vo/MesTmToolSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/MesTmToolSaveReqVO.java new file mode 100644 index 0000000..ffcdf18 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/MesTmToolSaveReqVO.java @@ -0,0 +1,69 @@ +package cn.iocoder.yudao.module.mes.controller.admin.tm.tool.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 工具台账新增/修改 Request VO") +@Data +public class MesTmToolSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "工具编码", example = "T-001") + private String code; + + @Schema(description = "工具名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "5mm 铣刀") + @NotEmpty(message = "工具名称不能为空") + private String name; + + @Schema(description = "品牌", example = "三菱") + private String brand; + + @Schema(description = "型号规格", example = "M5-100") + private String spec; + + @Schema(description = "工具类型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") + @NotNull(message = "工具类型不能为空") + private Long toolTypeId; + + @Schema(description = "数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "数量不能为空") + private Integer quantity; + + @Schema(description = "可用数量", example = "1") + private Integer quantityAvailable; + + @Schema(description = "保养维护类型", example = "1") + private Integer maintenType; + + @Schema(description = "下次保养周期(次数)", example = "100") + private Integer nextMaintenPeriod; + + @Schema(description = "下次保养日期", example = "2024-06-01 00:00:00") + private LocalDateTime nextMaintenDate; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "状态不能为空") + 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/controller/admin/tm/tool/vo/type/MesTmToolTypePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/type/MesTmToolTypePageReqVO.java new file mode 100644 index 0000000..3ea64d1 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/type/MesTmToolTypePageReqVO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.module.mes.controller.admin.tm.tool.vo.type; + +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 MesTmToolTypePageReqVO extends PageParam { + + @Schema(description = "类型编码", example = "TT-001") + private String code; + + @Schema(description = "类型名称", example = "铣刀") + private String name; + + @Schema(description = "保养维护类型", example = "1") + private Integer maintenType; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/type/MesTmToolTypeRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/type/MesTmToolTypeRespVO.java new file mode 100644 index 0000000..77c0991 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/type/MesTmToolTypeRespVO.java @@ -0,0 +1,63 @@ +package cn.iocoder.yudao.module.mes.controller.admin.tm.tool.vo.type; + +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat; +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert; +import cn.iocoder.yudao.module.mes.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.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 工具类型 Response VO") +@Data +@ExcelIgnoreUnannotated +public class MesTmToolTypeRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "类型编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "TT-001") + @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 codeFlag; + + @Schema(description = "保养维护类型", example = "1") + @ExcelProperty(value = "保养维护类型", converter = DictConvert.class) + @DictFormat(DictTypeConstants.MES_TM_MAINTEN_TYPE) + private Integer maintenType; + + @Schema(description = "保养周期", example = "30") + @ExcelProperty("保养周期") + private Integer maintenPeriod; + + @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/tm/tool/vo/type/MesTmToolTypeSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/type/MesTmToolTypeSaveReqVO.java new file mode 100644 index 0000000..d56e815 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/tm/tool/vo/type/MesTmToolTypeSaveReqVO.java @@ -0,0 +1,48 @@ +package cn.iocoder.yudao.module.mes.controller.admin.tm.tool.vo.type; + +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 MesTmToolTypeSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "类型编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "TT-001") + @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 codeFlag; + + @Schema(description = "保养维护类型", example = "1") + private Integer maintenType; + + @Schema(description = "保养周期", example = "30") + private Integer maintenPeriod; + + @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/tm/tool/MesTmToolDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/tm/tool/MesTmToolDO.java new file mode 100644 index 0000000..e41b79c --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/tm/tool/MesTmToolDO.java @@ -0,0 +1,103 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.tm.tool; + +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.time.LocalDateTime; + +/** + * MES 工具台账 DO + * + * @author 芋道源码 + */ +@TableName("mes_tm_tool") +@KeySequence("mes_tm_tool_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesTmToolDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 工具编码 + */ + private String code; + /** + * 工具名称 + */ + private String name; + /** + * 品牌 + */ + private String brand; + /** + * 型号规格 + */ + private String spec; + /** + * 工具类型编号 + * + * 关联 {@link MesTmToolTypeDO#getId()} + */ + private Long toolTypeId; + /** + * 数量 + */ + private Integer quantity; + /** + * 可用数量 + */ + private Integer quantityAvailable; + // TODO @AI:枚举类 + /** + * 保养维护类型 + * + * 字典 {@link cn.iocoder.yudao.module.mes.enums.DictTypeConstants#MES_TM_MAINTEN_TYPE} + */ + private Integer maintenType; + /** + * 下次保养周期(次数) + */ + private Integer nextMaintenPeriod; + /** + * 下次保养日期 + */ + private LocalDateTime nextMaintenDate; + /** + * 状态 + * + * 字典 {@link cn.iocoder.yudao.module.mes.enums.DictTypeConstants#MES_TM_TOOL_STATUS} + */ + 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/dataobject/tm/tool/MesTmToolTypeDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/tm/tool/MesTmToolTypeDO.java new file mode 100644 index 0000000..31b382b --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/tm/tool/MesTmToolTypeDO.java @@ -0,0 +1,73 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.tm.tool; + +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.*; + +/** + * MES 工具类型 DO + * + * @author 芋道源码 + */ +@TableName("mes_tm_tool_type") +@KeySequence("mes_tm_tool_type_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesTmToolTypeDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 类型编码 + */ + private String code; + /** + * 类型名称 + */ + private String name; + /** + * 是否编码管理 + */ + private Boolean codeFlag; + // TODO @AI:枚举类; + /** + * 保养维护类型 + * + * 字典 {@link cn.iocoder.yudao.module.mes.enums.DictTypeConstants#MES_TM_MAINTEN_TYPE} + */ + private Integer maintenType; + /** + * 保养周期 + */ + private Integer maintenPeriod; + /** + * 备注 + */ + 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/tm/tool/MesTmToolMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/tm/tool/MesTmToolMapper.java new file mode 100644 index 0000000..f2f256b --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/tm/tool/MesTmToolMapper.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.tm.tool; + +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.tm.tool.vo.MesTmToolPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.tm.tool.MesTmToolDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * MES 工具台账 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface MesTmToolMapper extends BaseMapperX { + + default PageResult selectPage(MesTmToolPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(MesTmToolDO::getCode, reqVO.getCode()) + .likeIfPresent(MesTmToolDO::getName, reqVO.getName()) + .eqIfPresent(MesTmToolDO::getToolTypeId, reqVO.getToolTypeId()) + .likeIfPresent(MesTmToolDO::getBrand, reqVO.getBrand()) + .likeIfPresent(MesTmToolDO::getSpec, reqVO.getSpec()) + .eqIfPresent(MesTmToolDO::getStatus, reqVO.getStatus()) + .orderByDesc(MesTmToolDO::getId)); + } + + default MesTmToolDO selectByCode(String code) { + return selectOne(MesTmToolDO::getCode, code); + } + + default Long selectCountByToolTypeId(Long toolTypeId) { + return selectCount(MesTmToolDO::getToolTypeId, toolTypeId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/tm/tool/MesTmToolTypeMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/tm/tool/MesTmToolTypeMapper.java new file mode 100644 index 0000000..4af70a5 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/tm/tool/MesTmToolTypeMapper.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.tm.tool; + +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.tm.tool.vo.type.MesTmToolTypePageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.tm.tool.MesTmToolTypeDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * MES 工具类型 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface MesTmToolTypeMapper extends BaseMapperX { + + default PageResult selectPage(MesTmToolTypePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .likeIfPresent(MesTmToolTypeDO::getCode, reqVO.getCode()) + .likeIfPresent(MesTmToolTypeDO::getName, reqVO.getName()) + .eqIfPresent(MesTmToolTypeDO::getMaintenType, reqVO.getMaintenType()) + .orderByDesc(MesTmToolTypeDO::getId)); + } + + default MesTmToolTypeDO selectByCode(String code) { + return selectOne(MesTmToolTypeDO::getCode, code); + } + + default MesTmToolTypeDO selectByName(String name) { + return selectOne(MesTmToolTypeDO::getName, name); + } + + default List selectList() { + return selectList(new LambdaQueryWrapperX() + .orderByDesc(MesTmToolTypeDO::getId)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/tm/tool/MesTmToolService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/tm/tool/MesTmToolService.java new file mode 100644 index 0000000..acbe55c --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/tm/tool/MesTmToolService.java @@ -0,0 +1,54 @@ +package cn.iocoder.yudao.module.mes.service.tm.tool; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.tm.tool.vo.MesTmToolPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.tm.tool.vo.MesTmToolSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.tm.tool.MesTmToolDO; +import jakarta.validation.Valid; + +/** + * MES 工具台账 Service 接口 + * + * @author 芋道源码 + */ +public interface MesTmToolService { + + /** + * 创建工具 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createTool(@Valid MesTmToolSaveReqVO createReqVO); + + /** + * 更新工具 + * + * @param updateReqVO 更新信息 + */ + void updateTool(@Valid MesTmToolSaveReqVO updateReqVO); + + /** + * 删除工具 + * + * @param id 编号 + */ + void deleteTool(Long id); + + /** + * 获得工具 + * + * @param id 编号 + * @return 工具 + */ + MesTmToolDO getTool(Long id); + + /** + * 获得工具分页 + * + * @param pageReqVO 分页查询 + * @return 工具分页 + */ + PageResult getToolPage(MesTmToolPageReqVO pageReqVO); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/tm/tool/MesTmToolServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/tm/tool/MesTmToolServiceImpl.java new file mode 100644 index 0000000..09738a6 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/tm/tool/MesTmToolServiceImpl.java @@ -0,0 +1,109 @@ +package cn.iocoder.yudao.module.mes.service.tm.tool; + +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.tm.tool.vo.MesTmToolPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.tm.tool.vo.MesTmToolSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.tm.tool.MesTmToolDO; +import cn.iocoder.yudao.module.mes.dal.mysql.tm.tool.MesTmToolMapper; +import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +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 MesTmToolServiceImpl implements MesTmToolService { + + @Resource + private MesTmToolMapper toolMapper; + + @Resource + @Lazy // 延迟加载,避免循环依赖 + private MesTmToolTypeService toolTypeService; + + @Override + public Long createTool(MesTmToolSaveReqVO createReqVO) { + // 校验工具类型存在 + toolTypeService.getToolType(createReqVO.getToolTypeId()); + // 校验编码唯一 + validateToolCodeUnique(null, createReqVO.getCode()); + + // 插入 + MesTmToolDO tool = BeanUtils.toBean(createReqVO, MesTmToolDO.class); + toolMapper.insert(tool); + return tool.getId(); + } + + @Override + public void updateTool(MesTmToolSaveReqVO updateReqVO) { + // 校验存在 + validateToolExists(updateReqVO.getId()); + // 校验工具类型存在 + toolTypeService.getToolType(updateReqVO.getToolTypeId()); + // 校验编码唯一 + validateToolCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); + + // 更新 + // TODO @AI:枚举类维护类型,避免使用魔法值 + if (Objects.equals(updateReqVO.getMaintenType(), 1)) { // 定期维护 + updateReqVO.setNextMaintenPeriod(null); + } else if (Objects.equals(updateReqVO.getMaintenType(), 2)) { // 按使用次数维护 + updateReqVO.setNextMaintenDate(null); + } + MesTmToolDO updateObj = BeanUtils.toBean(updateReqVO, MesTmToolDO.class); + toolMapper.updateById(updateObj); + } + + @Override + public void deleteTool(Long id) { + // 校验存在 + validateToolExists(id); + // 删除 + toolMapper.deleteById(id); + } + + private void validateToolExists(Long id) { + if (toolMapper.selectById(id) == null) { + throw exception(TM_TOOL_NOT_EXISTS); + } + } + + private void validateToolCodeUnique(Long id, String code) { + if (code == null) { + return; + } + MesTmToolDO tool = toolMapper.selectByCode(code); + if (tool == null) { + return; + } + // TODO @AI:ObjUtil notEquals + if (id == null) { + throw exception(TM_TOOL_CODE_DUPLICATE); + } + if (!Objects.equals(tool.getId(), id)) { + throw exception(TM_TOOL_CODE_DUPLICATE); + } + } + + @Override + public MesTmToolDO getTool(Long id) { + return toolMapper.selectById(id); + } + + @Override + public PageResult getToolPage(MesTmToolPageReqVO pageReqVO) { + return toolMapper.selectPage(pageReqVO); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/tm/tool/MesTmToolTypeService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/tm/tool/MesTmToolTypeService.java new file mode 100644 index 0000000..4f69e2a --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/tm/tool/MesTmToolTypeService.java @@ -0,0 +1,85 @@ +package cn.iocoder.yudao.module.mes.service.tm.tool; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.tm.tool.vo.type.MesTmToolTypePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.tm.tool.vo.type.MesTmToolTypeSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.tm.tool.MesTmToolTypeDO; +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 MesTmToolTypeService { + + /** + * 创建工具类型 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createToolType(@Valid MesTmToolTypeSaveReqVO createReqVO); + + /** + * 更新工具类型 + * + * @param updateReqVO 更新信息 + */ + void updateToolType(@Valid MesTmToolTypeSaveReqVO updateReqVO); + + /** + * 删除工具类型 + * + * @param id 编号 + */ + void deleteToolType(Long id); + + /** + * 获得工具类型 + * + * @param id 编号 + * @return 工具类型 + */ + MesTmToolTypeDO getToolType(Long id); + + /** + * 获得工具类型分页 + * + * @param pageReqVO 分页查询 + * @return 工具类型分页 + */ + PageResult getToolTypePage(MesTmToolTypePageReqVO pageReqVO); + + /** + * 获得工具类型列表 + * + * @return 工具类型列表 + */ + List getToolTypeList(); + + /** + * 获得工具类型列表 + * + * @param ids 编号数组 + * @return 工具类型列表 + */ + List getToolTypeList(Collection ids); + + /** + * 获得工具类型 Map + * + * @param ids 编号数组 + * @return 工具类型 Map + */ + default Map getToolTypeMap(Collection ids) { + return convertMap(getToolTypeList(ids), MesTmToolTypeDO::getId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/tm/tool/MesTmToolTypeServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/tm/tool/MesTmToolTypeServiceImpl.java new file mode 100644 index 0000000..65a9d6d --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/tm/tool/MesTmToolTypeServiceImpl.java @@ -0,0 +1,130 @@ +package cn.iocoder.yudao.module.mes.service.tm.tool; + +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.tm.tool.vo.type.MesTmToolTypePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.tm.tool.vo.type.MesTmToolTypeSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.tm.tool.MesTmToolTypeDO; +import cn.iocoder.yudao.module.mes.dal.mysql.tm.tool.MesTmToolMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.tm.tool.MesTmToolTypeMapper; +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 MesTmToolTypeServiceImpl implements MesTmToolTypeService { + + @Resource + private MesTmToolTypeMapper toolTypeMapper; + + @Resource + private MesTmToolMapper toolMapper; + + @Override + public Long createToolType(MesTmToolTypeSaveReqVO createReqVO) { + // 校验编码唯一 + validateToolTypeCodeUnique(null, createReqVO.getCode()); + // 校验名称唯一 + validateToolTypeNameUnique(null, createReqVO.getName()); + + // 插入 + MesTmToolTypeDO toolType = BeanUtils.toBean(createReqVO, MesTmToolTypeDO.class); + toolTypeMapper.insert(toolType); + return toolType.getId(); + } + + @Override + public void updateToolType(MesTmToolTypeSaveReqVO updateReqVO) { + // 校验存在 + validateToolTypeExists(updateReqVO.getId()); + // 校验编码唯一 + validateToolTypeCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); + // 校验名称唯一 + validateToolTypeNameUnique(updateReqVO.getId(), updateReqVO.getName()); + + // 更新 + MesTmToolTypeDO updateObj = BeanUtils.toBean(updateReqVO, MesTmToolTypeDO.class); + toolTypeMapper.updateById(updateObj); + } + + @Override + public void deleteToolType(Long id) { + // 校验存在 + validateToolTypeExists(id); + // 校验是否被工具引用 + if (toolMapper.selectCountByToolTypeId(id) > 0) { + throw exception(TM_TOOL_TYPE_HAS_TOOL); + } + + // 删除 + toolTypeMapper.deleteById(id); + } + + private void validateToolTypeExists(Long id) { + if (toolTypeMapper.selectById(id) == null) { + throw exception(TM_TOOL_TYPE_NOT_EXISTS); + } + } + + private void validateToolTypeCodeUnique(Long id, String code) { + MesTmToolTypeDO toolType = toolTypeMapper.selectByCode(code); + if (toolType == null) { + return; + } + // TODO @AI:ObjUtil notEquals + if (id == null) { + throw exception(TM_TOOL_TYPE_CODE_DUPLICATE); + } + if (!Objects.equals(toolType.getId(), id)) { + throw exception(TM_TOOL_TYPE_CODE_DUPLICATE); + } + } + + private void validateToolTypeNameUnique(Long id, String name) { + MesTmToolTypeDO toolType = toolTypeMapper.selectByName(name); + if (toolType == null) { + return; + } + // TODO @AI:ObjUtil notEquals + if (id == null) { + throw exception(TM_TOOL_TYPE_NAME_DUPLICATE); + } + if (!Objects.equals(toolType.getId(), id)) { + throw exception(TM_TOOL_TYPE_NAME_DUPLICATE); + } + } + + @Override + public MesTmToolTypeDO getToolType(Long id) { + return toolTypeMapper.selectById(id); + } + + @Override + public PageResult getToolTypePage(MesTmToolTypePageReqVO pageReqVO) { + return toolTypeMapper.selectPage(pageReqVO); + } + + @Override + public List getToolTypeList() { + return toolTypeMapper.selectList(); + } + + @Override + public List getToolTypeList(Collection ids) { + return toolTypeMapper.selectByIds(ids); + } + +}