From b26ff0d722445a4fdfbb747ba7675f102b6518f3 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 21 Feb 2026 16:51:56 +0800 Subject: [PATCH] feat(mes): 重构 IQC 缺陷记录为通用质检缺陷记录表,支持多模块复用 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/MesQcDefectRecordController.java | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRecordPageReqVO.java | 27 +++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRecordRespVO.java | 39 +++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRecordSaveReqVO.java | 46 ++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/MesQcIqcDefectController.java | 63 --------------------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/defect/MesQcIqcDefectPageReqVO.java | 23 ----------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/defect/MesQcIqcDefectRespVO.java | 36 ------------------------------------ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/defect/MesQcIqcDefectSaveReqVO.java | 37 ------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/defect/MesQcDefectDO.java | 4 ++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/defect/MesQcDefectRecordDO.java | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/lqc/MesQcIqcDefectDO.java | 79 ------------------------------------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/defect/MesQcDefectRecordMapper.java | 47 +++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/lqc/MesQcIqcDefectMapper.java | 42 ------------------------------------------ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java | 17 ++++++++++++++--- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/defect/MesQcDefectRecordService.java | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/defect/MesQcDefectRecordServiceImpl.java | 228 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcDefectService.java | 53 ----------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcDefectServiceImpl.java | 191 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcServiceImpl.java | 5 +++-- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateService.java | 11 +++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateServiceImpl.java | 19 +++++++++++++++++++ 21 files changed, 651 insertions(+), 529 deletions(-) create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/MesQcDefectRecordController.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRecordPageReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRecordRespVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRecordSaveReqVO.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/MesQcIqcDefectController.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/defect/MesQcIqcDefectPageReqVO.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/defect/MesQcIqcDefectRespVO.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/defect/MesQcIqcDefectSaveReqVO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/defect/MesQcDefectRecordDO.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/lqc/MesQcIqcDefectDO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/defect/MesQcDefectRecordMapper.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/lqc/MesQcIqcDefectMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/defect/MesQcDefectRecordService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/defect/MesQcDefectRecordServiceImpl.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcDefectService.java delete mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcDefectServiceImpl.java diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/MesQcDefectRecordController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/MesQcDefectRecordController.java new file mode 100644 index 0000000..929e5d2 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/MesQcDefectRecordController.java @@ -0,0 +1,64 @@ +package cn.iocoder.yudao.module.mes.controller.admin.qc.defect; + +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.qc.defect.vo.MesQcDefectRecordPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.qc.defect.vo.MesQcDefectRecordRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.qc.defect.vo.MesQcDefectRecordSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.defect.MesQcDefectRecordDO; +import cn.iocoder.yudao.module.mes.service.qc.defect.MesQcDefectRecordService; +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/qc/defect-record") +@Validated +public class MesQcDefectRecordController { + + @Resource + private MesQcDefectRecordService defectRecordService; + + // TODO @AI:使用 mes:qc-record:create 权限标识先;不要搞太复杂;当然,也写个 todo @芋艿:说下这个情况 + @PostMapping("/create") + @Operation(summary = "创建质检缺陷记录") + @PreAuthorize("@ss.hasPermission('mes:qc-defect-record:create')") + public CommonResult createDefectRecord(@Valid @RequestBody MesQcDefectRecordSaveReqVO createReqVO) { + return success(defectRecordService.createDefectRecord(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新质检缺陷记录") + @PreAuthorize("@ss.hasPermission('mes:qc-defect-record:update')") + public CommonResult updateDefectRecord(@Valid @RequestBody MesQcDefectRecordSaveReqVO updateReqVO) { + defectRecordService.updateDefectRecord(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除质检缺陷记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:qc-defect-record:update')") + public CommonResult deleteDefectRecord(@RequestParam("id") Long id) { + defectRecordService.deleteDefectRecord(id); + return success(true); + } + + @GetMapping("/page") + @Operation(summary = "获得质检缺陷记录分页") + @PreAuthorize("@ss.hasPermission('mes:qc-defect-record:query')") + public CommonResult> getDefectRecordPage(@Valid MesQcDefectRecordPageReqVO pageReqVO) { + PageResult pageResult = defectRecordService.getDefectRecordPage(pageReqVO); + return success(BeanUtils.toBean(pageResult, MesQcDefectRecordRespVO.class)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRecordPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRecordPageReqVO.java new file mode 100644 index 0000000..dab7f07 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRecordPageReqVO.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.mes.controller.admin.qc.defect.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; + +@Schema(description = "管理后台 - MES 质检缺陷记录分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MesQcDefectRecordPageReqVO extends PageParam { + + @Schema(description = "检验类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "检验类型不能为空") + private Integer qcType; + + @Schema(description = "检验单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") + @NotNull(message = "检验单 ID 不能为空") + private Long qcId; + + @Schema(description = "检验行 ID", example = "200") + private Long lineId; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRecordRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRecordRespVO.java new file mode 100644 index 0000000..664b39e --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRecordRespVO.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.mes.controller.admin.qc.defect.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 质检缺陷记录 Response VO") +@Data +public class MesQcDefectRecordRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "检验类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer qcType; + + @Schema(description = "检验单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") + private Long qcId; + + @Schema(description = "检验行 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") + private Long lineId; + + @Schema(description = "缺陷描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "表面划伤") + private String name; + + @Schema(description = "缺陷等级", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer level; + + @Schema(description = "缺陷数量", example = "1") + private Integer quantity; + + @Schema(description = "备注", example = "备注") + private String remark; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRecordSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRecordSaveReqVO.java new file mode 100644 index 0000000..c5f4717 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/defect/vo/MesQcDefectRecordSaveReqVO.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.module.mes.controller.admin.qc.defect.vo; + +import cn.iocoder.yudao.framework.common.validation.InEnum; +import cn.iocoder.yudao.module.mes.enums.qc.MesQcDefectLevelEnum; +import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; +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 MesQcDefectRecordSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "检验类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "检验类型不能为空") + @InEnum(MesQcTypeEnum.class) + private Integer qcType; + + @Schema(description = "检验单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") + @NotNull(message = "检验单 ID 不能为空") + private Long qcId; + + @Schema(description = "检验行 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") + @NotNull(message = "检验行 ID 不能为空") + private Long lineId; + + @Schema(description = "缺陷描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "表面划伤") + @NotEmpty(message = "缺陷描述不能为空") + private String name; + + @Schema(description = "缺陷等级", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "缺陷等级不能为空") + @InEnum(MesQcDefectLevelEnum.class) + private Integer level; + + @Schema(description = "缺陷数量", example = "1") + private Integer quantity; + + @Schema(description = "备注", example = "备注") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/MesQcIqcDefectController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/MesQcIqcDefectController.java deleted file mode 100644 index 549338a..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/MesQcIqcDefectController.java +++ /dev/null @@ -1,63 +0,0 @@ -package cn.iocoder.yudao.module.mes.controller.admin.qc.iqc; - -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.qc.iqc.vo.defect.MesQcIqcDefectPageReqVO; -import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.defect.MesQcIqcDefectRespVO; -import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.defect.MesQcIqcDefectSaveReqVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDefectDO; -import cn.iocoder.yudao.module.mes.service.qc.lqc.MesQcIqcDefectService; -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/qc/iqc/defect") -@Validated -public class MesQcIqcDefectController { - - @Resource - private MesQcIqcDefectService iqcDefectService; - - @PostMapping("/create") - @Operation(summary = "创建来料检验缺陷记录") - @PreAuthorize("@ss.hasPermission('mes:qc-iqc:create')") - public CommonResult createIqcDefect(@Valid @RequestBody MesQcIqcDefectSaveReqVO createReqVO) { - return success(iqcDefectService.createIqcDefect(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新来料检验缺陷记录") - @PreAuthorize("@ss.hasPermission('mes:qc-iqc:update')") - public CommonResult updateIqcDefect(@Valid @RequestBody MesQcIqcDefectSaveReqVO updateReqVO) { - iqcDefectService.updateIqcDefect(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除来料检验缺陷记录") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('mes:qc-iqc:update')") - public CommonResult deleteIqcDefect(@RequestParam("id") Long id) { - iqcDefectService.deleteIqcDefect(id); - return success(true); - } - - @GetMapping("/page") - @Operation(summary = "获得来料检验缺陷记录分页") - @PreAuthorize("@ss.hasPermission('mes:qc-iqc:query')") - public CommonResult> getIqcDefectPage(@Valid MesQcIqcDefectPageReqVO pageReqVO) { - PageResult pageResult = iqcDefectService.getIqcDefectPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, MesQcIqcDefectRespVO.class)); - } - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/defect/MesQcIqcDefectPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/defect/MesQcIqcDefectPageReqVO.java deleted file mode 100644 index 6df8cc3..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/defect/MesQcIqcDefectPageReqVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.defect; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; - -@Schema(description = "管理后台 - MES 来料检验缺陷记录分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class MesQcIqcDefectPageReqVO extends PageParam { - - @Schema(description = "来料检验单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - @NotNull(message = "来料检验单 ID 不能为空") - private Long iqcId; - - @Schema(description = "来料检验行 ID", example = "200") - private Long lineId; - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/defect/MesQcIqcDefectRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/defect/MesQcIqcDefectRespVO.java deleted file mode 100644 index f74b06e..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/defect/MesQcIqcDefectRespVO.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.defect; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - MES 来料检验缺陷记录 Response VO") -@Data -public class MesQcIqcDefectRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "来料检验单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - private Long iqcId; - - @Schema(description = "来料检验行 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") - private Long lineId; - - @Schema(description = "缺陷描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "表面划伤") - private String defectName; - - @Schema(description = "缺陷等级", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer defectLevel; - - @Schema(description = "缺陷数量", example = "1") - private Integer defectQuantity; - - @Schema(description = "备注", example = "备注") - private String remark; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/defect/MesQcIqcDefectSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/defect/MesQcIqcDefectSaveReqVO.java deleted file mode 100644 index 11aa66c..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/qc/iqc/vo/defect/MesQcIqcDefectSaveReqVO.java +++ /dev/null @@ -1,37 +0,0 @@ -package cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.defect; - -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 MesQcIqcDefectSaveReqVO { - - @Schema(description = "编号", example = "1024") - private Long id; - - @Schema(description = "来料检验单 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") - @NotNull(message = "来料检验单 ID 不能为空") - private Long iqcId; - - @Schema(description = "来料检验行 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") - @NotNull(message = "来料检验行 ID 不能为空") - private Long lineId; - - @Schema(description = "缺陷描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "表面划伤") - @NotEmpty(message = "缺陷描述不能为空") - private String defectName; - - @Schema(description = "缺陷等级", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "缺陷等级不能为空") - private Integer defectLevel; - - @Schema(description = "缺陷数量", example = "1") - private Integer defectQuantity; - - @Schema(description = "备注", example = "备注") - private String remark; - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/defect/MesQcDefectDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/defect/MesQcDefectDO.java index b4e5c9f..af46e46 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/defect/MesQcDefectDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/defect/MesQcDefectDO.java @@ -34,12 +34,16 @@ public class MesQcDefectDO extends BaseDO { * 缺陷描述 */ private String name; + // TODO @AI:改成 mes_defect_type;字典 sql 变更;另外,dict constants 里也写下 + // TODO @AI:枚举类; /** * 检测项类型 * * 字典类型 mes_index_type */ private String type; + // TODO @AI:改成 mes_defect_level;另外,dict constants 里也写下 + // TODO @AI:枚举类; /** * 缺陷等级 * diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/defect/MesQcDefectRecordDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/defect/MesQcDefectRecordDO.java new file mode 100644 index 0000000..643c198 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/defect/MesQcDefectRecordDO.java @@ -0,0 +1,95 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.qc.defect; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ipqc.MesQcIpqcDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.ipqc.MesQcIpqcLineDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcLineDO; +import cn.iocoder.yudao.module.mes.enums.qc.MesQcDefectLevelEnum; +import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * MES 质检缺陷记录 DO + * + * 通用缺陷记录表,通过 {@link #qcType} 区分检验类型(IQC、IPQC、OQC、RQC),多模块复用 + * + * @author 芋道源码 + */ +@TableName("mes_qc_defect_record") +@KeySequence("mes_qc_defect_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesQcDefectRecordDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 检验类型 + * + * 枚举 {@link MesQcTypeEnum} + */ + private Integer qcType; + /** + * 检验单 ID + * + * 关联 {@link MesQcIqcDO#getId()} + * 关联 {@link MesQcIpqcDO#getId()} + */ + private Long qcId; + /** + * 检验行 ID + * + * 关联 {@link MesQcIqcLineDO#getId()} + * 关联 {@link MesQcIpqcLineDO#getId()} + */ + private Long lineId; + /** + * 缺陷描述 + */ + private String name; + /** + * 缺陷等级 + * + * 枚举 {@link MesQcDefectLevelEnum} + */ + private Integer level; + /** + * 缺陷数量 + */ + private Integer quantity; + /** + * 备注 + */ + 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/qc/lqc/MesQcIqcDefectDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/lqc/MesQcIqcDefectDO.java deleted file mode 100644 index 0b27f21..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/qc/lqc/MesQcIqcDefectDO.java +++ /dev/null @@ -1,79 +0,0 @@ -package cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc; - -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_qc_iqc_defect") -@KeySequence("mes_qc_iqc_defect_seq") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MesQcIqcDefectDO extends BaseDO { - - /** - * 编号 - */ - @TableId - private Long id; - /** - * 来料检验单 ID - * - * 关联 {@link MesQcIqcDO#getId()} - */ - private Long iqcId; - /** - * 来料检验行 ID - * - * 关联 {@link MesQcIqcLineDO#getId()} - */ - private Long lineId; - /** - * 缺陷描述 - */ - private String defectName; - /** - * 缺陷等级 - * - * 枚举 {@link cn.iocoder.yudao.module.mes.enums.qc.MesQcDefectLevelEnum} - */ - private Integer defectLevel; - /** - * 缺陷数量 - */ - private Integer defectQuantity; - /** - * 备注 - */ - 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/qc/defect/MesQcDefectRecordMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/defect/MesQcDefectRecordMapper.java new file mode 100644 index 0000000..34c2773 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/defect/MesQcDefectRecordMapper.java @@ -0,0 +1,47 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.qc.defect; + +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.qc.defect.vo.MesQcDefectRecordPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.defect.MesQcDefectRecordDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * MES 质检缺陷记录 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface MesQcDefectRecordMapper extends BaseMapperX { + + default PageResult selectPage(MesQcDefectRecordPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MesQcDefectRecordDO::getQcType, reqVO.getQcType()) + .eqIfPresent(MesQcDefectRecordDO::getQcId, reqVO.getQcId()) + .eqIfPresent(MesQcDefectRecordDO::getLineId, reqVO.getLineId()) + .orderByDesc(MesQcDefectRecordDO::getId)); + } + + default List selectListByQcTypeAndQcId(Integer qcType, Long qcId) { + return selectList(new LambdaQueryWrapperX() + .eq(MesQcDefectRecordDO::getQcType, qcType) + .eq(MesQcDefectRecordDO::getQcId, qcId)); + } + + default List selectListByQcTypeAndQcIdAndLineId(Integer qcType, Long qcId, Long lineId) { + return selectList(new LambdaQueryWrapperX() + .eq(MesQcDefectRecordDO::getQcType, qcType) + .eq(MesQcDefectRecordDO::getQcId, qcId) + .eq(MesQcDefectRecordDO::getLineId, lineId)); + } + + default void deleteByQcTypeAndQcId(Integer qcType, Long qcId) { + delete(new LambdaQueryWrapperX() + .eq(MesQcDefectRecordDO::getQcType, qcType) + .eq(MesQcDefectRecordDO::getQcId, qcId)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/lqc/MesQcIqcDefectMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/lqc/MesQcIqcDefectMapper.java deleted file mode 100644 index 7fa1731..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/qc/lqc/MesQcIqcDefectMapper.java +++ /dev/null @@ -1,42 +0,0 @@ -package cn.iocoder.yudao.module.mes.dal.mysql.qc.lqc; - -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.qc.iqc.vo.defect.MesQcIqcDefectPageReqVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDefectDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -/** - * MES 来料检验缺陷记录 Mapper - * - * @author 芋道源码 - */ -@Mapper -public interface MesQcIqcDefectMapper extends BaseMapperX { - - default PageResult selectPage(MesQcIqcDefectPageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(MesQcIqcDefectDO::getIqcId, reqVO.getIqcId()) - .eqIfPresent(MesQcIqcDefectDO::getLineId, reqVO.getLineId()) - .orderByDesc(MesQcIqcDefectDO::getId)); - } - - default List selectListByIqcId(Long iqcId) { - return selectList(MesQcIqcDefectDO::getIqcId, iqcId); - } - - default List selectListByIqcIdAndLineId(Long iqcId, Long lineId) { - return selectList(new LambdaQueryWrapperX() - .eq(MesQcIqcDefectDO::getIqcId, iqcId) - .eq(MesQcIqcDefectDO::getLineId, lineId)); - } - - default void deleteByIqcId(Long iqcId) { - delete(new LambdaQueryWrapperX() - .eq(MesQcIqcDefectDO::getIqcId, iqcId)); - } - -} 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 d544fcf..8742f1c 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 @@ -252,9 +252,20 @@ public interface ErrorCodeConstants { ErrorCode QC_IQC_NO_TEMPLATE = new ErrorCode(1_040_603_005, "当前产品未配置 IQC 检测模板"); // ========== MES 质量管理-来料检验行(1-040-603-100) ========== ErrorCode QC_IQC_LINE_NOT_EXISTS = new ErrorCode(1_040_603_100, "来料检验行不存在"); - // ========== MES 质量管理-来料检验缺陷(1-040-603-200) ========== - ErrorCode QC_IQC_DEFECT_NOT_EXISTS = new ErrorCode(1_040_603_200, "来料检验缺陷记录不存在"); - ErrorCode QC_IQC_DEFECT_LEVEL_UNKNOWN = new ErrorCode(1_040_603_201, "未知的缺陷等级"); + + // ========== MES 质量管理-过程检验 IPQC(1-040-604-000) ========== + ErrorCode QC_IPQC_NOT_EXISTS = new ErrorCode(1_040_604_000, "过程检验单不存在"); + ErrorCode QC_IPQC_CODE_DUPLICATE = new ErrorCode(1_040_604_001, "过程检验单编号已存在"); + ErrorCode QC_IPQC_NOT_PREPARE = new ErrorCode(1_040_604_002, "只有草稿状态的检验单才可操作"); + ErrorCode QC_IPQC_QUANTITY_MISMATCH = new ErrorCode(1_040_604_004, "合格品与不合格品数量之和须等于检测数量"); + ErrorCode QC_IPQC_NO_TEMPLATE = new ErrorCode(1_040_604_005, "当前产品未配置 IPQC 检测模板"); + // ========== MES 质量管理-过程检验行(1-040-604-100) ========== + ErrorCode QC_IPQC_LINE_NOT_EXISTS = new ErrorCode(1_040_604_100, "过程检验行不存在"); + + // ========== MES 质量管理-质检缺陷记录(通用)(1-040-605-000) ========== + ErrorCode QC_DEFECT_RECORD_NOT_EXISTS = new ErrorCode(1_040_605_000, "缺陷记录不存在"); + ErrorCode QC_DEFECT_RECORD_LEVEL_UNKNOWN = new ErrorCode(1_040_605_001, "未知的缺陷等级"); + ErrorCode QC_DEFECT_RECORD_QC_TYPE_UNSUPPORTED = new ErrorCode(1_040_605_002, "不支持的检验类型"); // ========== MES 仓库管理-仓库(1-040-700-000) ========== ErrorCode WM_WAREHOUSE_NOT_EXISTS = new ErrorCode(1_040_700_000, "仓库不存在"); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/defect/MesQcDefectRecordService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/defect/MesQcDefectRecordService.java new file mode 100644 index 0000000..5fc5174 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/defect/MesQcDefectRecordService.java @@ -0,0 +1,54 @@ +package cn.iocoder.yudao.module.mes.service.qc.defect; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.qc.defect.vo.MesQcDefectRecordPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.qc.defect.vo.MesQcDefectRecordSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.defect.MesQcDefectRecordDO; +import jakarta.validation.Valid; + +/** + * MES 质检缺陷记录 Service 接口 + * + * @author 芋道源码 + */ +public interface MesQcDefectRecordService { + + /** + * 创建质检缺陷记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createDefectRecord(@Valid MesQcDefectRecordSaveReqVO createReqVO); + + /** + * 更新质检缺陷记录 + * + * @param updateReqVO 更新信息 + */ + void updateDefectRecord(@Valid MesQcDefectRecordSaveReqVO updateReqVO); + + /** + * 删除质检缺陷记录 + * + * @param id 编号 + */ + void deleteDefectRecord(Long id); + + /** + * 获得质检缺陷记录分页 + * + * @param pageReqVO 分页查询 + * @return 质检缺陷记录分页 + */ + PageResult getDefectRecordPage(MesQcDefectRecordPageReqVO pageReqVO); + + /** + * 根据检验类型和检验单 ID 级联删除所有缺陷记录 + * + * @param qcType 检验类型 + * @param qcId 检验单 ID + */ + void deleteByQcTypeAndQcId(Integer qcType, Long qcId); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/defect/MesQcDefectRecordServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/defect/MesQcDefectRecordServiceImpl.java new file mode 100644 index 0000000..0a7b529 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/defect/MesQcDefectRecordServiceImpl.java @@ -0,0 +1,228 @@ +package cn.iocoder.yudao.module.mes.service.qc.defect; + +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.qc.defect.vo.MesQcDefectRecordPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.qc.defect.vo.MesQcDefectRecordSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.defect.MesQcDefectRecordDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcLineDO; +import cn.iocoder.yudao.module.mes.dal.mysql.qc.defect.MesQcDefectRecordMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.qc.lqc.MesQcIqcMapper; +import cn.iocoder.yudao.module.mes.enums.qc.MesQcDefectLevelEnum; +import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; +import cn.iocoder.yudao.module.mes.service.qc.lqc.MesQcIqcLineService; +import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +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 MesQcDefectRecordServiceImpl implements MesQcDefectRecordService { + + @Resource + private MesQcDefectRecordMapper defectRecordMapper; + + // TODO @AI:不要调用 mapper,调用对方的 service; + @Resource + private MesQcIqcMapper iqcMapper; + @Resource + @Lazy + private MesQcIqcLineService iqcLineService; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createDefectRecord(MesQcDefectRecordSaveReqVO createReqVO) { + // 1. 校验主表和行表存在 + validateQcExists(createReqVO.getQcType(), createReqVO.getQcId()); + validateQcLineExists(createReqVO.getQcType(), createReqVO.getLineId()); + + // 2. 插入 + MesQcDefectRecordDO record = BeanUtils.toBean(createReqVO, MesQcDefectRecordDO.class); + defectRecordMapper.insert(record); + + // 3. 重新计算缺陷统计 + recalculateDefectStats(createReqVO.getQcType(), createReqVO.getQcId()); + return record.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateDefectRecord(MesQcDefectRecordSaveReqVO updateReqVO) { + // 1. 校验存在 + validateDefectRecordExists(updateReqVO.getId()); + + // 2. 更新 + MesQcDefectRecordDO updateObj = BeanUtils.toBean(updateReqVO, MesQcDefectRecordDO.class); + defectRecordMapper.updateById(updateObj); + + // 3. 重新计算缺陷统计 + recalculateDefectStats(updateReqVO.getQcType(), updateReqVO.getQcId()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteDefectRecord(Long id) { + // 1. 校验存在 + MesQcDefectRecordDO record = validateDefectRecordExists(id); + + // 2. 删除 + defectRecordMapper.deleteById(id); + + // 3. 重新计算缺陷统计 + recalculateDefectStats(record.getQcType(), record.getQcId()); + } + + @Override + public PageResult getDefectRecordPage(MesQcDefectRecordPageReqVO pageReqVO) { + return defectRecordMapper.selectPage(pageReqVO); + } + + @Override + public void deleteByQcTypeAndQcId(Integer qcType, Long qcId) { + defectRecordMapper.deleteByQcTypeAndQcId(qcType, qcId); + } + + // ==================== 校验方法 ==================== + + // TODO @AI:validateQcExists、validateQcLineExists 合并成一个方法;然后调用对应的 service 方法; + private void validateQcExists(Integer qcType, Long qcId) { + if (Objects.equals(qcType, MesQcTypeEnum.IQC.getType())) { + if (iqcMapper.selectById(qcId) == null) { + throw exception(QC_IQC_NOT_EXISTS); + } + } else { + // 后续扩展:IPQC、OQC、RQC + throw exception(QC_DEFECT_RECORD_QC_TYPE_UNSUPPORTED); + } + } + + // TODO @AI:去掉这个,相信调用方 + private void validateQcLineExists(Integer qcType, Long lineId) { + if (Objects.equals(qcType, MesQcTypeEnum.IQC.getType())) { + MesQcIqcLineDO line = iqcLineService.getIqcLine(lineId); + if (line == null) { + throw exception(QC_IQC_LINE_NOT_EXISTS); + } + } else { + // 后续扩展:IPQC、OQC、RQC + throw exception(QC_DEFECT_RECORD_QC_TYPE_UNSUPPORTED); + } + } + + private MesQcDefectRecordDO validateDefectRecordExists(Long id) { + MesQcDefectRecordDO record = defectRecordMapper.selectById(id); + if (record == null) { + throw exception(QC_DEFECT_RECORD_NOT_EXISTS); + } + return record; + } + + // ==================== 缺陷统计 ==================== + + /** + * 重新计算缺陷统计(行级 + 主表级) + * + * @param qcType 检验类型 + * @param qcId 检验单 ID + */ + @SuppressWarnings("DuplicatedCode") + private void recalculateDefectStats(Integer qcType, Long qcId) { + // 1. 查询所有缺陷记录 + List records = defectRecordMapper.selectListByQcTypeAndQcId(qcType, qcId); + + if (Objects.equals(qcType, MesQcTypeEnum.IQC.getType())) { + // TODO @AI:直接调用 iqcservice 方法;qcId、records + recalculateIqcDefectStats(qcId, records); + } else { + // 后续扩展:IPQC、OQC、RQC + throw exception(QC_DEFECT_RECORD_QC_TYPE_UNSUPPORTED); + } + } + + /** + * IQC 缺陷统计重算 + */ + private void recalculateIqcDefectStats(Long qcId, List records) { + // 1. 按行汇总缺陷数量,批量更新 + // TODO @AI:1 这块的逻辑,放到 iqcLineService 里,使用 qcId、records; + List lines = iqcLineService.selectListByIqcId(qcId); + List updateLines = new ArrayList<>(); + for (MesQcIqcLineDO line : lines) { + int critical = 0, major = 0, minor = 0; + for (MesQcDefectRecordDO record : records) { + if (ObjUtil.notEqual(record.getLineId(), line.getId())) { + continue; + } + int quantity = ObjUtil.defaultIfNull(record.getQuantity(), 1); + if (Objects.equals(record.getLevel(), MesQcDefectLevelEnum.CRITICAL.getType())) { + critical += quantity; + } else if (Objects.equals(record.getLevel(), MesQcDefectLevelEnum.MAJOR.getType())) { + major += quantity; + } else if (Objects.equals(record.getLevel(), MesQcDefectLevelEnum.MINOR.getType())) { + minor += quantity; + } else { + throw exception(QC_DEFECT_RECORD_LEVEL_UNKNOWN); + } + } + updateLines.add(new MesQcIqcLineDO().setId(line.getId()) + .setCriticalQuantity(critical).setMajorQuantity(major).setMinorQuantity(minor)); + } + iqcLineService.batchUpdateDefectStats(updateLines); + + // 2. 汇总主表的缺陷数量 + // TODO @AI:2-4 这块的逻辑,放到 iqcService 里,使用 qcId、records; + int totalCritical = 0, totalMajor = 0, totalMinor = 0; + for (MesQcDefectRecordDO record : records) { + int quantity = ObjUtil.defaultIfNull(record.getQuantity(), 1); + if (Objects.equals(record.getLevel(), MesQcDefectLevelEnum.CRITICAL.getType())) { + totalCritical += quantity; + } else if (Objects.equals(record.getLevel(), MesQcDefectLevelEnum.MAJOR.getType())) { + totalMajor += quantity; + } else if (Objects.equals(record.getLevel(), MesQcDefectLevelEnum.MINOR.getType())) { + totalMinor += quantity; + } else { + throw exception(QC_DEFECT_RECORD_LEVEL_UNKNOWN); + } + } + + // 3. 计算缺陷率 + MesQcIqcDO iqc = iqcMapper.selectById(qcId); + BigDecimal criticalRate = BigDecimal.ZERO; + BigDecimal majorRate = BigDecimal.ZERO; + BigDecimal minorRate = BigDecimal.ZERO; + if (iqc != null && iqc.getCheckQuantity() != null && iqc.getCheckQuantity() > 0) { + BigDecimal checkQty = BigDecimal.valueOf(iqc.getCheckQuantity()); + criticalRate = BigDecimal.valueOf(totalCritical).multiply(BigDecimal.valueOf(100)) + .divide(checkQty, 2, RoundingMode.HALF_UP); + majorRate = BigDecimal.valueOf(totalMajor).multiply(BigDecimal.valueOf(100)) + .divide(checkQty, 2, RoundingMode.HALF_UP); + minorRate = BigDecimal.valueOf(totalMinor).multiply(BigDecimal.valueOf(100)) + .divide(checkQty, 2, RoundingMode.HALF_UP); + } + + // 4. 更新主表 + MesQcIqcDO updateIqc = new MesQcIqcDO().setId(qcId) + .setCriticalQuantity(totalCritical).setMajorQuantity(totalMajor).setMinorQuantity(totalMinor) + .setCriticalRate(criticalRate).setMajorRate(majorRate).setMinorRate(minorRate); + iqcMapper.updateById(updateIqc); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcDefectService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcDefectService.java deleted file mode 100644 index b676930..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcDefectService.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.iocoder.yudao.module.mes.service.qc.lqc; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.defect.MesQcIqcDefectPageReqVO; -import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.defect.MesQcIqcDefectSaveReqVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDefectDO; -import jakarta.validation.Valid; - -/** - * MES 来料检验缺陷记录 Service 接口 - * - * @author 芋道源码 - */ -public interface MesQcIqcDefectService { - - /** - * 创建来料检验缺陷记录 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createIqcDefect(@Valid MesQcIqcDefectSaveReqVO createReqVO); - - /** - * 更新来料检验缺陷记录 - * - * @param updateReqVO 更新信息 - */ - void updateIqcDefect(@Valid MesQcIqcDefectSaveReqVO updateReqVO); - - /** - * 删除来料检验缺陷记录 - * - * @param id 编号 - */ - void deleteIqcDefect(Long id); - - /** - * 获得来料检验缺陷记录分页 - * - * @param pageReqVO 分页查询 - * @return 来料检验缺陷记录分页 - */ - PageResult getIqcDefectPage(MesQcIqcDefectPageReqVO pageReqVO); - - /** - * 根据来料检验单 ID 级联删除所有缺陷记录 - * - * @param iqcId 来料检验单 ID - */ - void deleteByIqcId(Long iqcId); - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcDefectServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcDefectServiceImpl.java deleted file mode 100644 index c1b59b1..0000000 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcDefectServiceImpl.java +++ /dev/null @@ -1,191 +0,0 @@ -package cn.iocoder.yudao.module.mes.service.qc.lqc; - -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.qc.iqc.vo.defect.MesQcIqcDefectPageReqVO; -import cn.iocoder.yudao.module.mes.controller.admin.qc.iqc.vo.defect.MesQcIqcDefectSaveReqVO; -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcDefectDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.qc.lqc.MesQcIqcLineDO; -import cn.iocoder.yudao.module.mes.dal.mysql.qc.lqc.MesQcIqcDefectMapper; -import cn.iocoder.yudao.module.mes.dal.mysql.qc.lqc.MesQcIqcMapper; -import cn.iocoder.yudao.module.mes.enums.qc.MesQcDefectLevelEnum; -import jakarta.annotation.Resource; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.validation.annotation.Validated; - -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.util.ArrayList; -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 MesQcIqcDefectServiceImpl implements MesQcIqcDefectService { - - @Resource - private MesQcIqcDefectMapper iqcDefectMapper; - @Resource - private MesQcIqcMapper iqcMapper; - @Resource - @Lazy - private MesQcIqcLineService iqcLineService; - - @Override - @Transactional(rollbackFor = Exception.class) - public Long createIqcDefect(MesQcIqcDefectSaveReqVO createReqVO) { - // 1.1 校验 IQC 存在 - validateIqcExists(createReqVO.getIqcId()); - // 1.2 校验行存在 - validateIqcLineExists(createReqVO.getLineId()); - - // 2. 插入 - MesQcIqcDefectDO defect = BeanUtils.toBean(createReqVO, MesQcIqcDefectDO.class); - iqcDefectMapper.insert(defect); - - // 3. 重新计算缺陷统计 - recalculateDefectStats(createReqVO.getIqcId()); - return defect.getId(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateIqcDefect(MesQcIqcDefectSaveReqVO updateReqVO) { - // 1. 校验存在 - validateIqcDefectExists(updateReqVO.getId()); - - // 2. 更新 - MesQcIqcDefectDO updateObj = BeanUtils.toBean(updateReqVO, MesQcIqcDefectDO.class); - iqcDefectMapper.updateById(updateObj); - - // 3. 重新计算缺陷统计 - recalculateDefectStats(updateReqVO.getIqcId()); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteIqcDefect(Long id) { - // 1. 校验存在 - MesQcIqcDefectDO defect = validateIqcDefectExists(id); - - // 2. 删除 - iqcDefectMapper.deleteById(id); - - // 3. 重新计算缺陷统计 - recalculateDefectStats(defect.getIqcId()); - } - - @Override - public PageResult getIqcDefectPage(MesQcIqcDefectPageReqVO pageReqVO) { - return iqcDefectMapper.selectPage(pageReqVO); - } - - @Override - public void deleteByIqcId(Long iqcId) { - iqcDefectMapper.deleteByIqcId(iqcId); - } - - private void validateIqcExists(Long iqcId) { - if (iqcMapper.selectById(iqcId) == null) { - throw exception(QC_IQC_NOT_EXISTS); - } - } - - private void validateIqcLineExists(Long lineId) { - MesQcIqcLineDO line = iqcLineService.getIqcLine(lineId); - if (line == null) { - throw exception(QC_IQC_LINE_NOT_EXISTS); - } - } - - private MesQcIqcDefectDO validateIqcDefectExists(Long id) { - MesQcIqcDefectDO defect = iqcDefectMapper.selectById(id); - if (defect == null) { - throw exception(QC_IQC_DEFECT_NOT_EXISTS); - } - return defect; - } - - /** - * 重新计算缺陷统计(行级 + 主表级) - * - * @param iqcId 来料检验单 ID - */ - @SuppressWarnings("DuplicatedCode") - private void recalculateDefectStats(Long iqcId) { - // 1. 查询所有缺陷记录 - List defects = iqcDefectMapper.selectListByIqcId(iqcId); - - // 2. 按行汇总缺陷数量,批量更新 - List lines = iqcLineService.selectListByIqcId(iqcId); - List updateLines = new ArrayList<>(); - for (MesQcIqcLineDO line : lines) { - int critical = 0, major = 0, minor = 0; - for (MesQcIqcDefectDO defect : defects) { - if (ObjUtil.notEqual(defect.getLineId(), line.getId())) { - continue; - } - int quantity = ObjUtil.defaultIfNull(defect.getDefectQuantity(), 1); - if (Objects.equals(defect.getDefectLevel(), MesQcDefectLevelEnum.CRITICAL.getType())) { - critical += quantity; - } else if (Objects.equals(defect.getDefectLevel(), MesQcDefectLevelEnum.MAJOR.getType())) { - major += quantity; - } else if (Objects.equals(defect.getDefectLevel(), MesQcDefectLevelEnum.MINOR.getType())) { - minor += quantity; - } else { - throw exception(QC_IQC_DEFECT_LEVEL_UNKNOWN); - } - } - updateLines.add(new MesQcIqcLineDO().setId(line.getId()) - .setCriticalQuantity(critical).setMajorQuantity(major).setMinorQuantity(minor)); - } - iqcLineService.batchUpdateDefectStats(updateLines); - - // 3.1 汇总主表的缺陷数量 - int totalCritical = 0, totalMajor = 0, totalMinor = 0; - for (MesQcIqcDefectDO defect : defects) { - int quantity = ObjUtil.defaultIfNull(defect.getDefectQuantity(), 1); - if (Objects.equals(defect.getDefectLevel(), MesQcDefectLevelEnum.CRITICAL.getType())) { - totalCritical += quantity; - } else if (Objects.equals(defect.getDefectLevel(), MesQcDefectLevelEnum.MAJOR.getType())) { - totalMajor += quantity; - } else if (Objects.equals(defect.getDefectLevel(), MesQcDefectLevelEnum.MINOR.getType())) { - totalMinor += quantity; - } else { - throw exception(QC_IQC_DEFECT_LEVEL_UNKNOWN); - } - } - // 3.2 计算缺陷率 - MesQcIqcDO iqc = iqcMapper.selectById(iqcId); - BigDecimal criticalRate = BigDecimal.ZERO; - BigDecimal majorRate = BigDecimal.ZERO; - BigDecimal minorRate = BigDecimal.ZERO; - if (iqc != null && iqc.getCheckQuantity() != null && iqc.getCheckQuantity() > 0) { - BigDecimal checkQty = BigDecimal.valueOf(iqc.getCheckQuantity()); - criticalRate = BigDecimal.valueOf(totalCritical).multiply(BigDecimal.valueOf(100)) - .divide(checkQty, 2, RoundingMode.HALF_UP); - majorRate = BigDecimal.valueOf(totalMajor).multiply(BigDecimal.valueOf(100)) - .divide(checkQty, 2, RoundingMode.HALF_UP); - minorRate = BigDecimal.valueOf(totalMinor).multiply(BigDecimal.valueOf(100)) - .divide(checkQty, 2, RoundingMode.HALF_UP); - } - // 3.3 更新主表 - MesQcIqcDO updateIqc = new MesQcIqcDO().setId(iqcId) - .setCriticalQuantity(totalCritical).setMajorQuantity(totalMajor).setMinorQuantity(totalMinor) - .setCriticalRate(criticalRate).setMajorRate(majorRate).setMinorRate(minorRate); - iqcMapper.updateById(updateIqc); - } - -} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcServiceImpl.java index eb8025b..70f99e5 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/lqc/MesQcIqcServiceImpl.java @@ -12,6 +12,7 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.qc.template.MesQcTemplateItemD import cn.iocoder.yudao.module.mes.dal.mysql.qc.lqc.MesQcIqcMapper; import cn.iocoder.yudao.module.mes.enums.qc.MesQcIqcStatusEnum; import cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum; +import cn.iocoder.yudao.module.mes.service.qc.defect.MesQcDefectRecordService; import cn.iocoder.yudao.module.mes.service.qc.template.MesQcTemplateService; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; @@ -38,7 +39,7 @@ public class MesQcIqcServiceImpl implements MesQcIqcService { @Resource private MesQcIqcLineService iqcLineService; @Resource - private MesQcIqcDefectService iqcDefectService; + private MesQcDefectRecordService defectRecordService; @Override @Transactional(rollbackFor = Exception.class) @@ -117,7 +118,7 @@ public class MesQcIqcServiceImpl implements MesQcIqcService { // 2.2 级联删除行 iqcLineService.deleteByIqcId(id); // 2.3 级联删除缺陷记录 - iqcDefectService.deleteByIqcId(id); + defectRecordService.deleteByQcTypeAndQcId(MesQcTypeEnum.IQC.getType(), id); } /** diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateService.java index 940091b..ff04297 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateService.java @@ -107,6 +107,17 @@ public interface MesQcTemplateService { */ MesQcTemplateItemDO getTemplateItemByTemplateIdAndItemId(Long templateId, Long itemId); + /** + * 根据产品物料 ID 和 QC 类型查找检验模板 + * + * 查找逻辑:在 template_item 中找到匹配 itemId 的模板,再校验该模板的 types 包含给定的 qcType + * + * @param itemId 产品物料 ID + * @param qcType 检测种类(枚举 {@link cn.iocoder.yudao.module.mes.enums.qc.MesQcTypeEnum}) + * @return 匹配的检验模板(可能为 null) + */ + MesQcTemplateDO getTemplateByItemIdAndType(Long itemId, Integer qcType); + // ========== 质检方案-检测指标项 ========== /** diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateServiceImpl.java index 6fc0f5f..15cca8e 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/qc/template/MesQcTemplateServiceImpl.java @@ -109,6 +109,25 @@ public class MesQcTemplateServiceImpl implements MesQcTemplateService { } @Override + public MesQcTemplateDO getTemplateByItemIdAndType(Long itemId, Integer qcType) { + // 1.1 查出 itemId 关联的所有 templateId + List templateItems = templateItemMapper.selectListByItemId(itemId); + if (CollUtil.isEmpty(templateItems)) { + return null; + } + // 1.2 批量查模板,筛选 types 包含给定 qcType 的第一个 + // TODO @AI:convertSet; + List templateIds = templateItems.stream() + .map(MesQcTemplateItemDO::getTemplateId).distinct().toList(); + List templates = templateMapper.selectByIds(templateIds); + + // 2. 筛选 types 包含给定 qcType 的第一个 TODO @AI:findOne; + return templates.stream() + .filter(t -> CollUtil.contains(t.getTypes(), qcType)) + .findFirst().orElse(null); + } + + @Override public MesQcTemplateDO getTemplate(Long id) { return templateMapper.selectById(id); } -- libgit2 0.21.4