From 52b61fce22f188e37a88c20740e005ff109637a7 Mon Sep 17 00:00:00 2001
From: hsy <1029150275@qq.com>
Date: 星期一, 17 八月 2026 15:02:27 +0800
Subject: [PATCH] dos: 新增表:mes_pro_task_pause_record
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/metering/MesDvMeteringServiceImpl.java | 181 +++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 181 insertions(+), 0 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/metering/MesDvMeteringServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/metering/MesDvMeteringServiceImpl.java
new file mode 100644
index 0000000..6c5ccbe
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/metering/MesDvMeteringServiceImpl.java
@@ -0,0 +1,181 @@
+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锛坕nfra_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 -> { // 姝e父锛氬埌鏈熸棩 > 浠婂ぉ+鎻愰啋澶╂暟
+ pageReqVO.setNextCheckDateBegin(today.plusDays(remindDays + 1));
+ }
+ default -> {
+ }
+ }
+ }
+ // 2. 鏌ヨ
+ PageResult<MesDvMeteringDO> pageResult = meteringMapper.selectPage(pageReqVO);
+ // 3. 鎳掕Е鍙戝埌鏈熸彁閱掔珯鍐呬俊锛坆est-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);
+ }
+
+}
--
Gitblit v1.9.3