package cn.iocoder.yudao.module.mes.service.dv.checkrecord; import cn.hutool.core.collection.CollUtil; 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.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.enums.dv.MesDvCheckRecordStatusEnum; import cn.iocoder.yudao.module.mes.enums.dv.MesDvCheckPlanTypeEnum; import cn.iocoder.yudao.module.mes.enums.dv.MesDvCheckResultEnum; 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 cn.iocoder.yudao.module.system.api.user.AdminUserApi; 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.util.ArrayList; 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 { @Resource private MesDvCheckRecordMapper checkRecordMapper; @Resource @Lazy private MesDvCheckRecordLineService checkRecordLineService; @Resource private MesDvMachineryService machineryService; @Resource private MesDvCheckPlanService checkPlanService; @Resource private MesDvCheckPlanSubjectService checkPlanSubjectService; @Resource private AdminUserApi adminUserApi; @Override @Transactional(rollbackFor = Exception.class) public Long createCheckRecord(MesDvCheckRecordSaveReqVO createReqVO) { // 1. 校验关联数据 validateCheckRecordSave(createReqVO); // 2. 插入主记录,状态默认为草稿 MesDvCheckRecordDO checkRecord = BeanUtils.toBean(createReqVO, MesDvCheckRecordDO.class) .setStatus(MesDvCheckRecordStatusEnum.DRAFT.getStatus()); 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 校验存在 + 状态为草稿 validateCheckRecordDraft(updateReqVO.getId()); // 1.2 校验关联数据 validateCheckRecordSave(updateReqVO); // 2. 如果计划变更,删除旧明细并重新生成 MesDvCheckRecordDO existRecord = checkRecordMapper.selectById(updateReqVO.getId()); Long oldPlanId = existRecord.getPlanId(); Long newPlanId = updateReqVO.getPlanId(); boolean planChanged = ObjUtil.notEqual(oldPlanId, newPlanId); if (planChanged) { checkRecordLineService.deleteByRecordId(updateReqVO.getId()); if (newPlanId != null) { generateCheckRecordLines(updateReqVO.getId(), newPlanId); } } // 3. 更新主记录 MesDvCheckRecordDO updateObj = BeanUtils.toBean(updateReqVO, MesDvCheckRecordDO.class); checkRecordMapper.updateById(updateObj); } @Override @Transactional(rollbackFor = Exception.class) public void submitCheckRecord(Long id) { // 1.1 校验状态为草稿 validateCheckRecordDraft(id); // 1.2 校验至少有一条明细 List lines = checkRecordLineService.getCheckRecordLineListByRecordId(id); if (CollUtil.isEmpty(lines)) { throw exception(DV_CHECK_RECORD_NO_LINE); } // 2. 状态改为已完成 MesDvCheckRecordDO record = checkRecordMapper.selectById(id); MesDvCheckRecordDO updateObj = new MesDvCheckRecordDO() .setId(id).setStatus(MesDvCheckRecordStatusEnum.FINISHED.getStatus()); checkRecordMapper.updateById(updateObj); // 3. 回写设备台账的【最近点检时间】 if (record.getCheckTime() != null) { machineryService.updateMachineryLastCheckTime(record.getMachineryId(), record.getCheckTime()); } } @Override @Transactional(rollbackFor = Exception.class) public void deleteCheckRecord(Long id) { // 1. 校验状态为草稿(已完成不可删除) validateCheckRecordDraft(id); // 2.1 删除主记录 checkRecordMapper.deleteById(id); // 2.2 级联删除明细 checkRecordLineService.deleteByRecordId(id); } @Override public void validateCheckRecordExists(Long id) { if (checkRecordMapper.selectById(id) == null) { throw exception(DV_CHECK_RECORD_NOT_EXISTS); } } @Override public Long getCheckRecordCountByMachineryId(Long machineryId) { return checkRecordMapper.selectCountByMachineryId(machineryId); } @Override public MesDvCheckRecordDO getCheckRecord(Long id) { return checkRecordMapper.selectById(id); } @Override public PageResult getCheckRecordPage(MesDvCheckRecordPageReqVO pageReqVO) { return checkRecordMapper.selectPage(pageReqVO); } // ==================== 校验方法 ==================== @Override public void validateCheckRecordDraft(Long id) { MesDvCheckRecordDO record = checkRecordMapper.selectById(id); if (record == null) { throw exception(DV_CHECK_RECORD_NOT_EXISTS); } if (ObjUtil.notEqual(MesDvCheckRecordStatusEnum.DRAFT.getStatus(), record.getStatus())) { throw exception(DV_CHECK_RECORD_NOT_DRAFT); } } private void validateCheckRecordSave(MesDvCheckRecordSaveReqVO reqVO) { // 校验设备是否存在 machineryService.validateMachineryExists(reqVO.getMachineryId()); // 校验点检计划是否存在 if (reqVO.getPlanId() != null) { checkPlanService.validateCheckPlanExistsAndType(reqVO.getPlanId(), MesDvCheckPlanTypeEnum.CHECK.getType()); } // 校验点检人是否存在 if (reqVO.getUserId() != null) { adminUserApi.validateUser(reqVO.getUserId()); } } /** * 根据计划自动生成点检项目明细行 */ private void generateCheckRecordLines(Long recordId, Long planId) { List planSubjects = checkPlanSubjectService.getCheckPlanSubjectListByPlanId(planId); if (CollUtil.isEmpty(planSubjects)) { return; } List lines = new ArrayList<>(planSubjects.size()); for (MesDvCheckPlanSubjectDO planSubject : planSubjects) { lines.add(new MesDvCheckRecordLineDO() .setRecordId(recordId).setSubjectId(planSubject.getSubjectId()) .setCheckStatus(MesDvCheckResultEnum.NORMAL.getResult())); } checkRecordLineService.createCheckRecordLineList(lines); } }