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