package cn.iocoder.yudao.module.mes.service.dv.metering; 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.infra.api.config.ConfigApi; import cn.iocoder.yudao.module.mes.controller.admin.dv.metering.vo.MesDvMeteringPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.dv.metering.vo.MesDvMeteringSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.dv.metering.MesDvMeteringDO; import cn.iocoder.yudao.module.mes.dal.mysql.dv.metering.MesDvMeteringMapper; import cn.iocoder.yudao.module.mes.service.dv.meteringcheck.MesDvMeteringCheckService; import cn.hutool.core.util.StrUtil; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.time.LocalDate; import java.util.Collection; import java.util.Collections; 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_METERING_CODE_DUPLICATE; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.DV_METERING_HAS_CHECK_RECORD; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.DV_METERING_NOT_EXISTS; /** * MES 计量器具 Service 实现类 * * @author 超级管理员 */ @Service @Validated public class MesDvMeteringServiceImpl implements MesDvMeteringService { /** * 提醒天数配置 KEY(infra_config) */ private static final String REMIND_DAYS_CONFIG_KEY = "mes.dv-metering.remind-days"; /** * 提醒天数默认值 */ private static final int DEFAULT_REMIND_DAYS = 30; @Resource private MesDvMeteringMapper meteringMapper; @Resource @Lazy // 延迟加载,避免与计量检测记录 Service 循环依赖 private MesDvMeteringCheckService meteringCheckService; @Resource private MesDvMeteringRemindService meteringRemindService; @Resource private ConfigApi configApi; @Override public Long createMetering(MesDvMeteringSaveReqVO createReqVO) { // 校验编码唯一 validateMeteringCodeUnique(null, createReqVO.getCode()); // 插入 MesDvMeteringDO metering = BeanUtils.toBean(createReqVO, MesDvMeteringDO.class); meteringMapper.insert(metering); return metering.getId(); } @Override public void updateMetering(MesDvMeteringSaveReqVO updateReqVO) { // 校验存在 validateMeteringExists(updateReqVO.getId()); // 校验编码唯一 validateMeteringCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); // 更新 MesDvMeteringDO updateObj = BeanUtils.toBean(updateReqVO, MesDvMeteringDO.class); meteringMapper.updateById(updateObj); } @Override public void deleteMetering(Long id) { // 校验存在 validateMeteringExists(id); // 校验无关联检测记录 if (meteringCheckService.getMeteringCheckCountByMeteringId(id) > 0) { throw exception(DV_METERING_HAS_CHECK_RECORD); } // 删除 meteringMapper.deleteById(id); } @Override public void validateMeteringExists(Long id) { if (meteringMapper.selectById(id) == null) { throw exception(DV_METERING_NOT_EXISTS); } } private void validateMeteringCodeUnique(Long id, String code) { if (StrUtil.isBlank(code)) { return; } MesDvMeteringDO metering = meteringMapper.selectByCode(code); if (metering == null) { return; } if (ObjUtil.notEqual(metering.getId(), id)) { throw exception(DV_METERING_CODE_DUPLICATE); } } @Override public MesDvMeteringDO getMetering(Long id) { return meteringMapper.selectById(id); } @Override public PageResult getMeteringPage(MesDvMeteringPageReqVO pageReqVO) { // 1. 到期状态转换为日期范围,走 DB 过滤 Integer expireStatus = pageReqVO.getExpireStatus(); if (expireStatus != null) { LocalDate today = LocalDate.now(); int remindDays = getRemindDays(); switch (expireStatus) { case 1 -> { // 已过期:到期日 < 今天 pageReqVO.setNextCheckDateEnd(today.minusDays(1)); } case 2 -> { // 即将到期:到期日在 [今天, 今天+提醒天数] pageReqVO.setNextCheckDateBegin(today); pageReqVO.setNextCheckDateEnd(today.plusDays(remindDays)); } case 3 -> { // 正常:到期日 > 今天+提醒天数 pageReqVO.setNextCheckDateBegin(today.plusDays(remindDays + 1)); } default -> { } } } // 2. 查询 PageResult pageResult = meteringMapper.selectPage(pageReqVO); // 3. 懒触发到期提醒站内信(best-effort,不影响查询) meteringRemindService.sendExpireRemind(); return pageResult; } @Override public int getRemindDays() { String value = configApi.getConfigValueByKey(REMIND_DAYS_CONFIG_KEY); if (StrUtil.isBlank(value)) { return DEFAULT_REMIND_DAYS; } try { return Integer.parseInt(value.trim()); } catch (NumberFormatException ex) { return DEFAULT_REMIND_DAYS; } } @Override public void updateMeteringCheckInfo(Long meteringId, LocalDate lastCheckDate, LocalDate nextCheckDate) { meteringMapper.updateById(new MesDvMeteringDO() .setId(meteringId) .setLastCheckDate(lastCheckDate) .setNextCheckDate(nextCheckDate)); } @Override public List getMeteringList() { return meteringMapper.selectList(); } @Override public List getMeteringList(Collection ids) { if (CollUtil.isEmpty(ids)) { return Collections.emptyList(); } return meteringMapper.selectByIds(ids); } }