package cn.iocoder.yudao.module.mes.service.safety; 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.safety.vo.hazard.MesSafetyHazardCheckReqVO; import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.hazard.MesSafetyHazardPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.hazard.MesSafetyHazardRectifyReqVO; import cn.iocoder.yudao.module.mes.controller.admin.safety.vo.hazard.MesSafetyHazardSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.safety.MesSafetyHazardDO; import cn.iocoder.yudao.module.mes.dal.mysql.safety.MesSafetyHazardMapper; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Objects; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; /** * 安全生产 - 隐患 Service 实现 * * @author 超级管理员 */ @Service @Validated public class MesSafetyHazardServiceImpl implements MesSafetyHazardService { @Resource private MesSafetyHazardMapper hazardMapper; @Override public PageResult getHazardPage(MesSafetyHazardPageReqVO pageReqVO) { return hazardMapper.selectPage(pageReqVO); } @Override public MesSafetyHazardDO getHazard(Long id) { return hazardMapper.selectById(id); } @Override public Long createHazard(MesSafetyHazardSaveReqVO createReqVO) { validateCodeUnique(null, createReqVO.getCode()); MesSafetyHazardDO hazard = BeanUtils.toBean(createReqVO, MesSafetyHazardDO.class); // 新建即为待整改 hazard.setStatus(MesSafetyHazardDO.STATUS_PENDING); if (hazard.getFoundDate() == null) { hazard.setFoundDate(LocalDate.now()); } hazardMapper.insert(hazard); return hazard.getId(); } @Override public void updateHazard(MesSafetyHazardSaveReqVO updateReqVO) { MesSafetyHazardDO exists = validateHazardExists(updateReqVO.getId()); // 已闭环的隐患不允许再修改基本信息 if (MesSafetyHazardDO.STATUS_CLOSED.equals(exists.getStatus())) { throw exception(MES_SAFETY_HAZARD_STATUS_INVALID); } validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); MesSafetyHazardDO updateObj = BeanUtils.toBean(updateReqVO, MesSafetyHazardDO.class); // 状态与整改/验收信息不通过此接口修改 updateObj.setStatus(null); updateObj.setMeasure(null); updateObj.setFinishDate(null); updateObj.setCheckUserId(null); updateObj.setCheckTime(null); updateObj.setCheckResult(null); updateObj.setRejectReason(null); hazardMapper.updateById(updateObj); } @Override public void deleteHazard(Long id) { validateHazardExists(id); hazardMapper.deleteById(id); } @Override public void rectifyHazard(MesSafetyHazardRectifyReqVO reqVO) { MesSafetyHazardDO hazard = validateHazardExists(reqVO.getId()); // 只有「待整改」「整改中」可以提交整改;已提交待验收或已闭环不可重复提交 if (!MesSafetyHazardDO.STATUS_PENDING.equals(hazard.getStatus()) && !MesSafetyHazardDO.STATUS_RECTIFYING.equals(hazard.getStatus())) { throw exception(MES_SAFETY_HAZARD_STATUS_INVALID); } MesSafetyHazardDO updateObj = new MesSafetyHazardDO(); updateObj.setId(reqVO.getId()); updateObj.setMeasure(reqVO.getMeasure()); updateObj.setFinishDate(reqVO.getFinishDate() != null ? reqVO.getFinishDate() : LocalDate.now()); updateObj.setStatus(MesSafetyHazardDO.STATUS_TO_CHECK); // 重新提交时清空上一次的驳回原因 updateObj.setRejectReason(""); hazardMapper.updateById(updateObj); } @Override public void checkHazard(MesSafetyHazardCheckReqVO reqVO) { MesSafetyHazardDO hazard = validateHazardExists(reqVO.getId()); // 只有「待验收」可以验收 if (!MesSafetyHazardDO.STATUS_TO_CHECK.equals(hazard.getStatus())) { throw exception(MES_SAFETY_HAZARD_STATUS_INVALID); } MesSafetyHazardDO updateObj = new MesSafetyHazardDO(); updateObj.setId(reqVO.getId()); updateObj.setCheckResult(reqVO.getCheckResult()); updateObj.setCheckTime(LocalDateTime.now()); if (Boolean.TRUE.equals(reqVO.getPass())) { // 验收通过 → 闭环 updateObj.setStatus(MesSafetyHazardDO.STATUS_CLOSED); updateObj.setRejectReason(""); } else { // 验收驳回 → 必须填原因,退回整改中 if (reqVO.getRejectReason() == null || reqVO.getRejectReason().trim().isEmpty()) { throw exception(MES_SAFETY_HAZARD_REJECT_REASON_REQUIRED); } updateObj.setStatus(MesSafetyHazardDO.STATUS_RECTIFYING); updateObj.setRejectReason(reqVO.getRejectReason()); } hazardMapper.updateById(updateObj); } @Override public MesSafetyHazardDO validateHazardExists(Long id) { if (id == null) { throw exception(MES_SAFETY_HAZARD_NOT_EXISTS); } MesSafetyHazardDO hazard = hazardMapper.selectById(id); if (hazard == null) { throw exception(MES_SAFETY_HAZARD_NOT_EXISTS); } return hazard; } private void validateCodeUnique(Long id, String code) { MesSafetyHazardDO exists = hazardMapper.selectByCode(code); if (exists == null) { return; } if (id == null || !Objects.equals(exists.getId(), id)) { throw exception(MES_SAFETY_HAZARD_CODE_DUPLICATE); } } }