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<MesDvMeteringDO> 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<MesDvMeteringDO> 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<MesDvMeteringDO> getMeteringList() {
|
return meteringMapper.selectList();
|
}
|
|
@Override
|
public List<MesDvMeteringDO> getMeteringList(Collection<Long> ids) {
|
if (CollUtil.isEmpty(ids)) {
|
return Collections.emptyList();
|
}
|
return meteringMapper.selectByIds(ids);
|
}
|
|
}
|