diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/MesDvCheckRecordController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/MesDvCheckRecordController.java new file mode 100644 index 0000000..462c56a --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/MesDvCheckRecordController.java @@ -0,0 +1,150 @@ +package cn.iocoder.yudao.module.mes.controller.admin.dv.checkrecord; + +import cn.hutool.core.collection.CollUtil; +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.collection.MapUtils; +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.dv.checkrecord.vo.MesDvCheckRecordPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.dv.checkrecord.vo.MesDvCheckRecordRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.dv.checkrecord.vo.MesDvCheckRecordSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.dv.checkplan.MesDvCheckPlanDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.dv.checkrecord.MesDvCheckRecordDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.dv.machinery.MesDvMachineryDO; +import cn.iocoder.yudao.module.mes.service.dv.checkplan.MesDvCheckPlanService; +import cn.iocoder.yudao.module.mes.service.dv.checkrecord.MesDvCheckRecordService; +import cn.iocoder.yudao.module.mes.service.dv.machinery.MesDvMachineryService; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; +import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; +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.Collections; +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/dv/check-record") +@Validated +public class MesDvCheckRecordController { + + @Resource + private MesDvCheckRecordService checkRecordService; + + @Resource + private MesDvCheckPlanService checkPlanService; + + @Resource + private MesDvMachineryService machineryService; + + @Resource + private AdminUserApi adminUserApi; + + @PostMapping("/create") + @Operation(summary = "创建设备点检记录") + @PreAuthorize("@ss.hasPermission('mes:dv-check-record:create')") + public CommonResult createCheckRecord(@Valid @RequestBody MesDvCheckRecordSaveReqVO createReqVO) { + return success(checkRecordService.createCheckRecord(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新设备点检记录") + @PreAuthorize("@ss.hasPermission('mes:dv-check-record:update')") + public CommonResult updateCheckRecord(@Valid @RequestBody MesDvCheckRecordSaveReqVO updateReqVO) { + checkRecordService.updateCheckRecord(updateReqVO); + return success(true); + } + + @PutMapping("/submit") + @Operation(summary = "提交设备点检记录(待点检→已完成)") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:dv-check-record:update')") + public CommonResult submitCheckRecord(@RequestParam("id") Long id) { + checkRecordService.submitCheckRecord(id); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除设备点检记录") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:dv-check-record:delete')") + public CommonResult deleteCheckRecord(@RequestParam("id") Long id) { + checkRecordService.deleteCheckRecord(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得设备点检记录") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:dv-check-record:query')") + public CommonResult getCheckRecord(@RequestParam("id") Long id) { + MesDvCheckRecordDO checkRecord = checkRecordService.getCheckRecord(id); + if (checkRecord == null) { + return success(null); + } + return success(buildCheckRecordRespVOList(Collections.singletonList(checkRecord)).get(0)); + } + + @GetMapping("/page") + @Operation(summary = "获得设备点检记录分页") + @PreAuthorize("@ss.hasPermission('mes:dv-check-record:query')") + public CommonResult> getCheckRecordPage(@Valid MesDvCheckRecordPageReqVO pageReqVO) { + PageResult pageResult = checkRecordService.getCheckRecordPage(pageReqVO); + return success(new PageResult<>(buildCheckRecordRespVOList(pageResult.getList()), pageResult.getTotal())); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出设备点检记录 Excel") + @PreAuthorize("@ss.hasPermission('mes:dv-check-record:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportCheckRecordExcel(@Valid MesDvCheckRecordPageReqVO pageReqVO, + HttpServletResponse response) throws IOException { + pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = checkRecordService.getCheckRecordPage(pageReqVO).getList(); + ExcelUtils.write(response, "设备点检记录.xls", "数据", MesDvCheckRecordRespVO.class, + buildCheckRecordRespVOList(list)); + } + + // ==================== 拼接 VO ==================== + + @SuppressWarnings("DuplicatedCode") + private List buildCheckRecordRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + // 1. 批量获取关联数据 + Map planMap = checkPlanService.getCheckPlanMap( + convertSet(list, MesDvCheckRecordDO::getPlanId)); + Map machineryMap = machineryService.getMachineryMap( + convertSet(list, MesDvCheckRecordDO::getMachineryId)); + Map userMap = adminUserApi.getUserMap( + convertSet(list, MesDvCheckRecordDO::getUserId)); + // 2. 拼接 VO + return BeanUtils.toBean(list, MesDvCheckRecordRespVO.class, vo -> { + MapUtils.findAndThen(planMap, vo.getPlanId(), + plan -> vo.setPlanName(plan.getName())); + MapUtils.findAndThen(machineryMap, vo.getMachineryId(), machinery -> vo + .setMachineryCode(machinery.getCode()).setMachineryName(machinery.getName()) + .setMachineryBrand(machinery.getBrand()).setMachinerySpec(machinery.getSpec())); + MapUtils.findAndThen(userMap, vo.getUserId(), + user -> vo.setNickname(user.getNickname())); + }); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/MesDvCheckRecordLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/MesDvCheckRecordLineController.java new file mode 100644 index 0000000..e23d5be --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/MesDvCheckRecordLineController.java @@ -0,0 +1,105 @@ +package cn.iocoder.yudao.module.mes.controller.admin.dv.checkrecord; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.dv.checkrecord.vo.line.MesDvCheckRecordLinePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.dv.checkrecord.vo.line.MesDvCheckRecordLineRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.dv.checkrecord.vo.line.MesDvCheckRecordLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.dv.checkrecord.MesDvCheckRecordLineDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.dv.subject.MesDvSubjectDO; +import cn.iocoder.yudao.module.mes.service.dv.checkrecord.MesDvCheckRecordLineService; +import cn.iocoder.yudao.module.mes.service.dv.subject.MesDvSubjectService; +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 java.util.Collections; +import java.util.List; +import java.util.Map; + +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/dv/check-record-line") +@Validated +public class MesDvCheckRecordLineController { + + @Resource + private MesDvCheckRecordLineService checkRecordLineService; + + @Resource + private MesDvSubjectService subjectService; + + @PostMapping("/create") + @Operation(summary = "创建设备点检记录明细") + @PreAuthorize("@ss.hasPermission('mes:dv-check-record:create')") + public CommonResult createCheckRecordLine(@Valid @RequestBody MesDvCheckRecordLineSaveReqVO createReqVO) { + return success(checkRecordLineService.createCheckRecordLine(createReqVO)); + } + + @PutMapping("/update") + @Operation(summary = "更新设备点检记录明细") + @PreAuthorize("@ss.hasPermission('mes:dv-check-record:update')") + public CommonResult updateCheckRecordLine(@Valid @RequestBody MesDvCheckRecordLineSaveReqVO updateReqVO) { + checkRecordLineService.updateCheckRecordLine(updateReqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除设备点检记录明细") + @Parameter(name = "id", description = "编号", required = true) + @PreAuthorize("@ss.hasPermission('mes:dv-check-record:delete')") + public CommonResult deleteCheckRecordLine(@RequestParam("id") Long id) { + checkRecordLineService.deleteCheckRecordLine(id); + return success(true); + } + + @GetMapping("/get") + @Operation(summary = "获得设备点检记录明细") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:dv-check-record:query')") + public CommonResult getCheckRecordLine(@RequestParam("id") Long id) { + MesDvCheckRecordLineDO line = checkRecordLineService.getCheckRecordLine(id); + if (line == null) { + return success(null); + } + return success(buildCheckRecordLineRespVOList(Collections.singletonList(line)).get(0)); + } + + @GetMapping("/page") + @Operation(summary = "获得设备点检记录明细分页") + @PreAuthorize("@ss.hasPermission('mes:dv-check-record:query')") + public CommonResult> getCheckRecordLinePage(@Valid MesDvCheckRecordLinePageReqVO pageReqVO) { + PageResult pageResult = checkRecordLineService.getCheckRecordLinePage(pageReqVO); + return success(new PageResult<>(buildCheckRecordLineRespVOList(pageResult.getList()), pageResult.getTotal())); + } + + // ==================== 拼接 VO ==================== + + private List buildCheckRecordLineRespVOList(List list) { + if (CollUtil.isEmpty(list)) { + return Collections.emptyList(); + } + // 1. 批量获取关联数据 + Map subjectMap = subjectService.getSubjectMap( + convertSet(list, MesDvCheckRecordLineDO::getSubjectId)); + // 2. 拼接 VO + return BeanUtils.toBean(list, MesDvCheckRecordLineRespVO.class, vo -> + MapUtils.findAndThen(subjectMap, vo.getSubjectId(), subject -> vo + .setSubjectCode(subject.getCode()) + .setSubjectName(subject.getName()) + .setSubjectContent(subject.getContent()) + .setSubjectStandard(subject.getStandard()))); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/vo/MesDvCheckRecordPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/vo/MesDvCheckRecordPageReqVO.java new file mode 100644 index 0000000..340a2a2 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/vo/MesDvCheckRecordPageReqVO.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.mes.controller.admin.dv.checkrecord.vo; + +import cn.iocoder.yudao.framework.common.pojo.PageParam; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.ToString; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDateTime; + +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; + +@Schema(description = "管理后台 - MES 设备点检记录分页 Request VO") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class MesDvCheckRecordPageReqVO extends PageParam { + + @Schema(description = "点检计划编号", example = "1") + private Long planId; + + @Schema(description = "设备编号", example = "1") + private Long machineryId; + + @Schema(description = "点检人编号", example = "1") + private Long userId; + + @Schema(description = "状态", example = "10") + private Integer status; + + @Schema(description = "点检时间") + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) + private LocalDateTime[] checkTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/vo/MesDvCheckRecordRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/vo/MesDvCheckRecordRespVO.java new file mode 100644 index 0000000..a37f976 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/vo/MesDvCheckRecordRespVO.java @@ -0,0 +1,75 @@ +package cn.iocoder.yudao.module.mes.controller.admin.dv.checkrecord.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 MesDvCheckRecordRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "点检计划编号", example = "1") + private Long planId; + + @Schema(description = "计划名称", example = "日常点检计划") + @ExcelProperty("计划名称") + private String planName; + + @Schema(description = "计划类型", example = "1") + private Integer planType; + + @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long machineryId; + + @Schema(description = "设备编码", example = "M001") + @ExcelProperty("设备编码") + private String machineryCode; + + @Schema(description = "设备名称", example = "机床A") + @ExcelProperty("设备名称") + private String machineryName; + + @Schema(description = "品牌", example = "西门子") + @ExcelProperty("品牌") + private String machineryBrand; + + @Schema(description = "规格型号", example = "X-100") + @ExcelProperty("规格型号") + private String machinerySpec; + + @Schema(description = "点检时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("点检时间") + private LocalDateTime checkTime; + + @Schema(description = "点检人编号", example = "1") + private Long userId; + + @Schema(description = "点检人名称", example = "张三") + @ExcelProperty("点检人") + private String nickname; + + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") + @ExcelProperty(value = "状态", converter = DictConvert.class) + @DictFormat(DictTypeConstants.MES_DV_CHECK_RECORD_STATUS) + private Integer status; + + @Schema(description = "备注", example = "测试备注") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/vo/MesDvCheckRecordSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/vo/MesDvCheckRecordSaveReqVO.java new file mode 100644 index 0000000..95c2291 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/vo/MesDvCheckRecordSaveReqVO.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.mes.controller.admin.dv.checkrecord.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotNull; +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 设备点检记录新增/修改 Request VO") +@Data +public class MesDvCheckRecordSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "1024") + private Long id; + + @Schema(description = "点检计划编号", example = "1") + private Long planId; + + @Schema(description = "计划类型", example = "1") + private Integer planType; + + @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "设备不能为空") + private Long machineryId; + + @Schema(description = "点检时间", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "点检时间不能为空") + private LocalDateTime checkTime; + + @Schema(description = "点检人编号", example = "1") + private Long userId; + + @Schema(description = "状态", example = "10") + private Integer status; + + @Schema(description = "备注", example = "测试备注") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/vo/line/MesDvCheckRecordLinePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/vo/line/MesDvCheckRecordLinePageReqVO.java new file mode 100644 index 0000000..166fc55 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/vo/line/MesDvCheckRecordLinePageReqVO.java @@ -0,0 +1,18 @@ +package cn.iocoder.yudao.module.mes.controller.admin.dv.checkrecord.vo.line; + +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 MesDvCheckRecordLinePageReqVO extends PageParam { + + @Schema(description = "点检记录编号", example = "1") + private Long recordId; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/vo/line/MesDvCheckRecordLineRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/vo/line/MesDvCheckRecordLineRespVO.java new file mode 100644 index 0000000..7de282f --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/vo/line/MesDvCheckRecordLineRespVO.java @@ -0,0 +1,61 @@ +package cn.iocoder.yudao.module.mes.controller.admin.dv.checkrecord.vo.line; + +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 MesDvCheckRecordLineRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + @ExcelProperty("编号") + private Long id; + + @Schema(description = "点检记录编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long recordId; + + @Schema(description = "点检项目编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long subjectId; + + @Schema(description = "项目编码", example = "S001") + @ExcelProperty("项目编码") + private String subjectCode; + + @Schema(description = "项目名称", example = "润滑油检查") + @ExcelProperty("项目名称") + private String subjectName; + + @Schema(description = "检查内容", example = "检查润滑油是否充足") + @ExcelProperty("检查内容") + private String subjectContent; + + @Schema(description = "检查标准", example = "油位不低于最低刻度") + @ExcelProperty("检查标准") + private String subjectStandard; + + @Schema(description = "点检结果(Y=正常,N=异常)", requiredMode = Schema.RequiredMode.REQUIRED, example = "Y") + @ExcelProperty(value = "点检结果", converter = DictConvert.class) + @DictFormat(DictTypeConstants.MES_DV_CHECK_RESULT) + private String checkStatus; + + @Schema(description = "异常描述", example = "设备异响") + @ExcelProperty("异常描述") + private String checkResult; + + @Schema(description = "备注", example = "测试备注") + @ExcelProperty("备注") + private String remark; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + @ExcelProperty("创建时间") + private LocalDateTime createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/vo/line/MesDvCheckRecordLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/vo/line/MesDvCheckRecordLineSaveReqVO.java new file mode 100644 index 0000000..45f3bbc --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/dv/checkrecord/vo/line/MesDvCheckRecordLineSaveReqVO.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.mes.controller.admin.dv.checkrecord.vo.line; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import jakarta.validation.constraints.NotNull; + +@Schema(description = "管理后台 - MES 设备点检记录明细新增/修改 Request VO") +@Data +public class MesDvCheckRecordLineSaveReqVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "1024") + private Long id; + + @Schema(description = "点检记录编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "点检记录不能为空") + private Long recordId; + + @Schema(description = "点检项目编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "点检项目不能为空") + private Long subjectId; + + @Schema(description = "点检结果(Y=正常,N=异常)", requiredMode = Schema.RequiredMode.REQUIRED, example = "Y") + @NotNull(message = "点检结果不能为空") + private String checkStatus; + + @Schema(description = "异常描述", example = "设备异响") + private String checkResult; + + @Schema(description = "备注", example = "测试备注") + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/checkrecord/MesDvCheckRecordDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/checkrecord/MesDvCheckRecordDO.java new file mode 100644 index 0000000..aac9c46 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/checkrecord/MesDvCheckRecordDO.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.dv.checkrecord; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.dv.checkplan.MesDvCheckPlanDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.dv.machinery.MesDvMachineryDO; +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_dv_check_record") +@KeySequence("mes_dv_check_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesDvCheckRecordDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 点检计划编号 + * + * 关联 {@link MesDvCheckPlanDO#getId()} + */ + private Long planId; + // TODO @AI:这个字段可以移除; + /** + * 计划类型 + * + * 字典类型 mes_dv_check_plan_type(与计划保持冗余,避免 JOIN) + */ + private Integer planType; + /** + * 设备编号 + * + * 关联 {@link MesDvMachineryDO#getId()} + */ + private Long machineryId; + /** + * 点检时间 + */ + private LocalDateTime checkTime; + /** + * 点检人编号 + * + * 关联 AdminUserDO#getId() + */ + private Long userId; + // TODO @AI:枚举、字典; + /** + * 状态 + * + * 字典类型 mes_dv_check_record_status(10=待点检,20=已完成) + */ + private Integer status; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/checkrecord/MesDvCheckRecordLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/checkrecord/MesDvCheckRecordLineDO.java new file mode 100644 index 0000000..6393e59 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/dv/checkrecord/MesDvCheckRecordLineDO.java @@ -0,0 +1,59 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.dv.checkrecord; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.dv.subject.MesDvSubjectDO; +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_dv_check_record_line") +@KeySequence("mes_dv_check_record_line_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesDvCheckRecordLineDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 点检记录编号 + * + * 关联 {@link MesDvCheckRecordDO#getId()} + */ + private Long recordId; + /** + * 点检项目编号 + * + * 关联 {@link MesDvSubjectDO#getId()} + */ + private Long subjectId; + // TODO @AI:应该使用 int; + /** + * 点检结果 + * + * 字典类型 mes_dv_check_result(Y=正常,N=异常) + */ + private String checkStatus; + // TODO @AI:需要标注下,checkStatus 才有使用; + /** + * 异常描述 + */ + private String checkResult; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/dv/checkrecord/MesDvCheckRecordLineMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/dv/checkrecord/MesDvCheckRecordLineMapper.java new file mode 100644 index 0000000..ab217ec --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/dv/checkrecord/MesDvCheckRecordLineMapper.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.dv.checkrecord; + +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.dv.checkrecord.vo.line.MesDvCheckRecordLinePageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.dv.checkrecord.MesDvCheckRecordLineDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * MES 设备点检记录明细 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface MesDvCheckRecordLineMapper extends BaseMapperX { + + default PageResult selectPage(MesDvCheckRecordLinePageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MesDvCheckRecordLineDO::getRecordId, reqVO.getRecordId()) + .orderByDesc(MesDvCheckRecordLineDO::getId)); + } + + default List selectListByRecordId(Long recordId) { + return selectList(MesDvCheckRecordLineDO::getRecordId, recordId); + } + + default int deleteByRecordId(Long recordId) { + return delete(MesDvCheckRecordLineDO::getRecordId, recordId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/dv/checkrecord/MesDvCheckRecordMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/dv/checkrecord/MesDvCheckRecordMapper.java new file mode 100644 index 0000000..41bd283 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/dv/checkrecord/MesDvCheckRecordMapper.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.dv.checkrecord; + +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.dv.checkrecord.vo.MesDvCheckRecordPageReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.dv.checkrecord.MesDvCheckRecordDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * MES 设备点检记录 Mapper + * + * @author 芋道源码 + */ +@Mapper +public interface MesDvCheckRecordMapper extends BaseMapperX { + + default PageResult selectPage(MesDvCheckRecordPageReqVO reqVO) { + return selectPage(reqVO, new LambdaQueryWrapperX() + .eqIfPresent(MesDvCheckRecordDO::getPlanId, reqVO.getPlanId()) + .eqIfPresent(MesDvCheckRecordDO::getMachineryId, reqVO.getMachineryId()) + .eqIfPresent(MesDvCheckRecordDO::getUserId, reqVO.getUserId()) + .eqIfPresent(MesDvCheckRecordDO::getStatus, reqVO.getStatus()) + .betweenIfPresent(MesDvCheckRecordDO::getCheckTime, reqVO.getCheckTime()) + .orderByDesc(MesDvCheckRecordDO::getId)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkrecord/MesDvCheckRecordLineService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkrecord/MesDvCheckRecordLineService.java new file mode 100644 index 0000000..5f679db --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkrecord/MesDvCheckRecordLineService.java @@ -0,0 +1,78 @@ +package cn.iocoder.yudao.module.mes.service.dv.checkrecord; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.dv.checkrecord.vo.line.MesDvCheckRecordLinePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.dv.checkrecord.vo.line.MesDvCheckRecordLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.dv.checkrecord.MesDvCheckRecordLineDO; + +import jakarta.validation.Valid; +import java.util.List; + +/** + * MES 设备点检记录明细 Service 接口 + * + * @author 芋道源码 + */ +public interface MesDvCheckRecordLineService { + + /** + * 创建点检记录明细 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createCheckRecordLine(@Valid MesDvCheckRecordLineSaveReqVO createReqVO); + + /** + * 更新点检记录明细 + * + * @param updateReqVO 更新信息 + */ + void updateCheckRecordLine(@Valid MesDvCheckRecordLineSaveReqVO updateReqVO); + + /** + * 删除点检记录明细 + * + * @param id 编号 + */ + void deleteCheckRecordLine(Long id); + + /** + * 根据点检记录编号删除所有明细 + * + * @param recordId 点检记录编号 + */ + void deleteByRecordId(Long recordId); + + /** + * 校验点检记录明细存在 + * + * @param id 编号 + */ + void validateCheckRecordLineExists(Long id); + + /** + * 获得点检记录明细 + * + * @param id 编号 + * @return 点检记录明细 + */ + MesDvCheckRecordLineDO getCheckRecordLine(Long id); + + /** + * 获得点检记录明细分页 + * + * @param pageReqVO 分页查询 + * @return 点检记录明细分页 + */ + PageResult getCheckRecordLinePage(MesDvCheckRecordLinePageReqVO pageReqVO); + + /** + * 获得指定点检记录的所有明细 + * + * @param recordId 点检记录编号 + * @return 明细列表 + */ + List getCheckRecordLineListByRecordId(Long recordId); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkrecord/MesDvCheckRecordLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkrecord/MesDvCheckRecordLineServiceImpl.java new file mode 100644 index 0000000..aef0412 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkrecord/MesDvCheckRecordLineServiceImpl.java @@ -0,0 +1,84 @@ +package cn.iocoder.yudao.module.mes.service.dv.checkrecord; + +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.dv.checkrecord.vo.line.MesDvCheckRecordLinePageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.dv.checkrecord.vo.line.MesDvCheckRecordLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.dv.checkrecord.MesDvCheckRecordLineDO; +import cn.iocoder.yudao.module.mes.dal.mysql.dv.checkrecord.MesDvCheckRecordLineMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.DV_CHECK_RECORD_LINE_NOT_EXISTS; + +/** + * MES 设备点检记录明细 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class MesDvCheckRecordLineServiceImpl implements MesDvCheckRecordLineService { + + @Resource + private MesDvCheckRecordLineMapper checkRecordLineMapper; + + @Override + public Long createCheckRecordLine(MesDvCheckRecordLineSaveReqVO createReqVO) { + // TODO @AI:校验下存在 + MesDvCheckRecordLineDO line = BeanUtils.toBean(createReqVO, MesDvCheckRecordLineDO.class); + checkRecordLineMapper.insert(line); + return line.getId(); + } + + @Override + public void updateCheckRecordLine(MesDvCheckRecordLineSaveReqVO updateReqVO) { + // TODO @AI:校验下存在 + // 校验存在 + validateCheckRecordLineExists(updateReqVO.getId()); + + // 更新 + MesDvCheckRecordLineDO updateObj = BeanUtils.toBean(updateReqVO, MesDvCheckRecordLineDO.class); + checkRecordLineMapper.updateById(updateObj); + } + + @Override + public void deleteCheckRecordLine(Long id) { + // 校验存在 + validateCheckRecordLineExists(id); + // 删除 + checkRecordLineMapper.deleteById(id); + } + + @Override + public void deleteByRecordId(Long recordId) { + checkRecordLineMapper.deleteByRecordId(recordId); + } + + @Override + public void validateCheckRecordLineExists(Long id) { + if (checkRecordLineMapper.selectById(id) == null) { + throw exception(DV_CHECK_RECORD_LINE_NOT_EXISTS); + } + } + + @Override + public MesDvCheckRecordLineDO getCheckRecordLine(Long id) { + return checkRecordLineMapper.selectById(id); + } + + @Override + public PageResult getCheckRecordLinePage(MesDvCheckRecordLinePageReqVO pageReqVO) { + return checkRecordLineMapper.selectPage(pageReqVO); + } + + @Override + public List getCheckRecordLineListByRecordId(Long recordId) { + return checkRecordLineMapper.selectListByRecordId(recordId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkrecord/MesDvCheckRecordService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkrecord/MesDvCheckRecordService.java new file mode 100644 index 0000000..0b0e0c7 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkrecord/MesDvCheckRecordService.java @@ -0,0 +1,69 @@ +package cn.iocoder.yudao.module.mes.service.dv.checkrecord; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.dv.checkrecord.vo.MesDvCheckRecordPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.dv.checkrecord.vo.MesDvCheckRecordSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.dv.checkrecord.MesDvCheckRecordDO; + +import jakarta.validation.Valid; + +/** + * MES 设备点检记录 Service 接口 + * + * @author 芋道源码 + */ +public interface MesDvCheckRecordService { + + /** + * 创建设备点检记录 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createCheckRecord(@Valid MesDvCheckRecordSaveReqVO createReqVO); + + /** + * 更新设备点检记录 + * + * @param updateReqVO 更新信息 + */ + void updateCheckRecord(@Valid MesDvCheckRecordSaveReqVO updateReqVO); + + /** + * 提交点检记录(状态从待点检变为已完成) + * + * @param id 编号 + */ + void submitCheckRecord(Long id); + + /** + * 删除设备点检记录 + * + * @param id 编号 + */ + void deleteCheckRecord(Long id); + + /** + * 校验设备点检记录存在 + * + * @param id 编号 + */ + void validateCheckRecordExists(Long id); + + /** + * 获得设备点检记录 + * + * @param id 编号 + * @return 设备点检记录 + */ + MesDvCheckRecordDO getCheckRecord(Long id); + + /** + * 获得设备点检记录分页 + * + * @param pageReqVO 分页查询 + * @return 设备点检记录分页 + */ + PageResult getCheckRecordPage(MesDvCheckRecordPageReqVO pageReqVO); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkrecord/MesDvCheckRecordServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkrecord/MesDvCheckRecordServiceImpl.java new file mode 100644 index 0000000..4a693c3 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/checkrecord/MesDvCheckRecordServiceImpl.java @@ -0,0 +1,185 @@ +package cn.iocoder.yudao.module.mes.service.dv.checkrecord; + +import cn.hutool.core.collection.CollUtil; +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.dv.checkrecord.vo.MesDvCheckRecordPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.dv.checkrecord.vo.MesDvCheckRecordSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.dv.checkplan.MesDvCheckPlanSubjectDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.dv.checkrecord.MesDvCheckRecordDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.dv.checkrecord.MesDvCheckRecordLineDO; +import cn.iocoder.yudao.module.mes.dal.mysql.dv.checkrecord.MesDvCheckRecordLineMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.dv.checkrecord.MesDvCheckRecordMapper; +import cn.iocoder.yudao.module.mes.service.dv.checkplan.MesDvCheckPlanService; +import cn.iocoder.yudao.module.mes.service.dv.checkplan.MesDvCheckPlanSubjectService; +import cn.iocoder.yudao.module.mes.service.dv.machinery.MesDvMachineryService; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + +/** + * MES 设备点检记录 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class MesDvCheckRecordServiceImpl implements MesDvCheckRecordService { + + // TODO @AI:枚举类; + /** + * 待点检状态 + */ + private static final int STATUS_PREPARE = 10; + /** + * 已完成状态 + */ + private static final int STATUS_FINISHED = 20; + + @Resource + private MesDvCheckRecordMapper checkRecordMapper; + @Resource + private MesDvCheckRecordLineMapper checkRecordLineMapper; + @Resource + private MesDvMachineryService machineryService; + @Resource + private MesDvCheckPlanService checkPlanService; + @Resource + private MesDvCheckPlanSubjectService checkPlanSubjectService; + + @Override + @Transactional(rollbackFor = Exception.class) + public Long createCheckRecord(MesDvCheckRecordSaveReqVO createReqVO) { + // 1. 校验关联数据 + validateCheckRecordRelation(createReqVO); + + // 2. 插入主记录,状态默认为待点检 + MesDvCheckRecordDO checkRecord = BeanUtils.toBean(createReqVO, MesDvCheckRecordDO.class) + .setStatus(STATUS_PREPARE); + checkRecordMapper.insert(checkRecord); + + // 3. 如果指定了点检计划,自动生成明细行 + if (createReqVO.getPlanId() != null) { + generateCheckRecordLines(checkRecord.getId(), createReqVO.getPlanId()); + } + return checkRecord.getId(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateCheckRecord(MesDvCheckRecordSaveReqVO updateReqVO) { + // 1.1 校验存在 + 状态为待点检 + MesDvCheckRecordDO existRecord = validateCheckRecordPrepare(updateReqVO.getId()); + // 1.2 校验关联数据 + validateCheckRecordRelation(updateReqVO); + + // 2. 如果计划变更,删除旧明细并重新生成 + Long oldPlanId = existRecord.getPlanId(); + Long newPlanId = updateReqVO.getPlanId(); + boolean planChanged = !java.util.Objects.equals(oldPlanId, newPlanId); + if (planChanged) { + checkRecordLineMapper.deleteByRecordId(updateReqVO.getId()); + if (newPlanId != null) { + generateCheckRecordLines(updateReqVO.getId(), newPlanId); + } + } + + // 3. 更新主记录 + MesDvCheckRecordDO updateObj = BeanUtils.toBean(updateReqVO, MesDvCheckRecordDO.class); + checkRecordMapper.updateById(updateObj); + } + + @Override + public void submitCheckRecord(Long id) { + // 1.1 校验状态为待点检 + validateCheckRecordPrepare(id); + // 1.2 校验至少有一条明细 + List lines = checkRecordLineMapper.selectListByRecordId(id); + if (CollUtil.isEmpty(lines)) { + throw exception(DV_CHECK_RECORD_NO_LINE); + } + + // 2. 状态改为已完成 + MesDvCheckRecordDO updateObj = new MesDvCheckRecordDO() + .setId(id).setStatus(STATUS_FINISHED); + checkRecordMapper.updateById(updateObj); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteCheckRecord(Long id) { + // 1. 校验状态为待点检(已完成不可删除) + validateCheckRecordPrepare(id); + + // 2.1 删除主记录 + checkRecordMapper.deleteById(id); + // 2.2 级联删除明细 + checkRecordLineMapper.deleteByRecordId(id); + } + + @Override + public void validateCheckRecordExists(Long id) { + if (checkRecordMapper.selectById(id) == null) { + throw exception(DV_CHECK_RECORD_NOT_EXISTS); + } + } + + @Override + public MesDvCheckRecordDO getCheckRecord(Long id) { + return checkRecordMapper.selectById(id); + } + + @Override + public PageResult getCheckRecordPage(MesDvCheckRecordPageReqVO pageReqVO) { + return checkRecordMapper.selectPage(pageReqVO); + } + + // ==================== 私有方法 ==================== + + /** + * 校验点检记录为待点检状态 + */ + private MesDvCheckRecordDO validateCheckRecordPrepare(Long id) { + MesDvCheckRecordDO record = checkRecordMapper.selectById(id); + if (record == null) { + throw exception(DV_CHECK_RECORD_NOT_EXISTS); + } + // TODO @AI:ObjUtil notEquals + if (!STATUS_PREPARE.equals(record.getStatus())) { + throw exception(DV_CHECK_RECORD_NOT_PREPARE); + } + return record; + } + + private void validateCheckRecordRelation(MesDvCheckRecordSaveReqVO reqVO) { + // 校验设备是否存在 + machineryService.validateMachineryExists(reqVO.getMachineryId()); + // 校验点检计划是否存在 + if (reqVO.getPlanId() != null) { + checkPlanService.validateCheckPlanExists(reqVO.getPlanId()); + } + } + + /** + * 根据计划自动生成点检项目明细行 + */ + private void generateCheckRecordLines(Long recordId, Long planId) { + List planSubjects = checkPlanSubjectService.getCheckPlanSubjectListByPlanId(planId); + if (CollUtil.isEmpty(planSubjects)) { + return; + } + // TODO @AI:批量插入; + for (MesDvCheckPlanSubjectDO planSubject : planSubjects) { + MesDvCheckRecordLineDO line = new MesDvCheckRecordLineDO() + .setRecordId(recordId).setSubjectId(planSubject.getSubjectId()).setCheckStatus("Y"); + checkRecordLineMapper.insert(line); + } + } + +}