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/meteringcheck/MesDvMeteringCheckServiceImpl.java |  165 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 165 insertions(+), 0 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/meteringcheck/MesDvMeteringCheckServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/meteringcheck/MesDvMeteringCheckServiceImpl.java
new file mode 100644
index 0000000..b1e0f3c
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/dv/meteringcheck/MesDvMeteringCheckServiceImpl.java
@@ -0,0 +1,165 @@
+package cn.iocoder.yudao.module.mes.service.dv.meteringcheck;
+
+import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
+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.dv.meteringcheck.vo.MesDvMeteringCheckPageReqVO;
+import cn.iocoder.yudao.module.mes.controller.admin.dv.meteringcheck.vo.MesDvMeteringCheckSaveReqVO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.dv.metering.MesDvMeteringDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.dv.meteringcheck.MesDvMeteringCheckDO;
+import cn.iocoder.yudao.module.mes.dal.mysql.dv.meteringcheck.MesDvMeteringCheckMapper;
+import cn.iocoder.yudao.module.mes.service.dv.metering.MesDvMeteringService;
+import jakarta.annotation.Resource;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+
+import java.time.LocalDate;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.DV_METERING_CHECK_CODE_DUPLICATE;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.DV_METERING_CHECK_NOT_EXISTS;
+import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.DV_METERING_NOT_EXISTS;
+
+/**
+ * MES 璁¢噺妫�娴嬭褰� Service 瀹炵幇绫�
+ *
+ * @author 瓒呯骇绠$悊鍛�
+ */
+@Service
+@Validated
+public class MesDvMeteringCheckServiceImpl implements MesDvMeteringCheckService {
+
+    @Resource
+    private MesDvMeteringCheckMapper meteringCheckMapper;
+    @Resource
+    @Lazy // 寤惰繜鍔犺浇锛岄伩鍏嶄笌璁¢噺鍣ㄥ叿 Service 寰幆渚濊禆
+    private MesDvMeteringService meteringService;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long createMeteringCheck(MesDvMeteringCheckSaveReqVO createReqVO) {
+        // 鏍¢獙璁¢噺鍣ㄥ叿瀛樺湪
+        MesDvMeteringDO metering = validateMeteringExists(createReqVO.getMeteringId());
+        // 鏍¢獙妫�娴嬬紪鍙峰敮涓�
+        validateMeteringCheckCodeUnique(null, createReqVO.getCheckCode());
+
+        // 璁$畻涓嬫妫�娴嬫棩鏈燂紙涓虹┖鍒欐寜鏍″噯鍛ㄦ湡鑷姩璁$畻锛�
+        LocalDate nextCheckDate = computeNextCheckDate(createReqVO.getCheckDate(),
+                createReqVO.getNextCheckDate(), metering);
+        MesDvMeteringCheckDO check = BeanUtils.toBean(createReqVO, MesDvMeteringCheckDO.class);
+        check.setNextCheckDate(nextCheckDate);
+        meteringCheckMapper.insert(check);
+
+        // 鍥炲啓璁¢噺鍣ㄥ叿鐨勬渶杩戞娴嬩俊鎭�
+        refreshMeteringCheckInfo(createReqVO.getMeteringId());
+        return check.getId();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updateMeteringCheck(MesDvMeteringCheckSaveReqVO updateReqVO) {
+        // 鏍¢獙瀛樺湪
+        validateMeteringCheckExists(updateReqVO.getId());
+        // 鏍¢獙璁¢噺鍣ㄥ叿瀛樺湪
+        MesDvMeteringDO metering = validateMeteringExists(updateReqVO.getMeteringId());
+        // 鏍¢獙妫�娴嬬紪鍙峰敮涓�
+        validateMeteringCheckCodeUnique(updateReqVO.getId(), updateReqVO.getCheckCode());
+
+        // 璁$畻涓嬫妫�娴嬫棩鏈燂紙涓虹┖鍒欐寜鏍″噯鍛ㄦ湡鑷姩璁$畻锛�
+        LocalDate nextCheckDate = computeNextCheckDate(updateReqVO.getCheckDate(),
+                updateReqVO.getNextCheckDate(), metering);
+        MesDvMeteringCheckDO updateObj = BeanUtils.toBean(updateReqVO, MesDvMeteringCheckDO.class);
+        updateObj.setNextCheckDate(nextCheckDate);
+        meteringCheckMapper.updateById(updateObj);
+
+        // 鍥炲啓璁¢噺鍣ㄥ叿鐨勬渶杩戞娴嬩俊鎭�
+        refreshMeteringCheckInfo(updateReqVO.getMeteringId());
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void deleteMeteringCheck(Long id) {
+        // 鏍¢獙瀛樺湪
+        validateMeteringCheckExists(id);
+        MesDvMeteringCheckDO check = meteringCheckMapper.selectById(id);
+
+        // 鍒犻櫎
+        meteringCheckMapper.deleteById(id);
+
+        // 鍥炲啓璁¢噺鍣ㄥ叿鐨勬渶杩戞娴嬩俊鎭�
+        refreshMeteringCheckInfo(check.getMeteringId());
+    }
+
+    @Override
+    public MesDvMeteringCheckDO getMeteringCheck(Long id) {
+        return meteringCheckMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<MesDvMeteringCheckDO> getMeteringCheckPage(MesDvMeteringCheckPageReqVO pageReqVO) {
+        return meteringCheckMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public Long getMeteringCheckCountByMeteringId(Long meteringId) {
+        return meteringCheckMapper.selectCountByMeteringId(meteringId);
+    }
+
+    @Override
+    public void validateMeteringCheckExists(Long id) {
+        if (meteringCheckMapper.selectById(id) == null) {
+            throw exception(DV_METERING_CHECK_NOT_EXISTS);
+        }
+    }
+
+    private MesDvMeteringDO validateMeteringExists(Long meteringId) {
+        MesDvMeteringDO metering = meteringService.getMetering(meteringId);
+        if (metering == null) {
+            throw exception(DV_METERING_NOT_EXISTS);
+        }
+        return metering;
+    }
+
+    private void validateMeteringCheckCodeUnique(Long id, String checkCode) {
+        if (StrUtil.isBlank(checkCode)) {
+            return;
+        }
+        MesDvMeteringCheckDO check = meteringCheckMapper.selectByCheckCode(checkCode);
+        if (check == null) {
+            return;
+        }
+        if (ObjUtil.notEqual(check.getId(), id)) {
+            throw exception(DV_METERING_CHECK_CODE_DUPLICATE);
+        }
+    }
+
+    /**
+     * 璁$畻涓嬫妫�娴嬫棩鏈燂細鎵嬪姩鎸囧畾浼樺厛锛屽惁鍒欐寜 妫�娴嬫棩鏈� + 鏍″噯鍛ㄦ湡锛堟湀锛夎嚜鍔ㄨ绠�
+     */
+    private LocalDate computeNextCheckDate(LocalDate checkDate, LocalDate nextCheckDate, MesDvMeteringDO metering) {
+        if (nextCheckDate != null) {
+            return nextCheckDate;
+        }
+        if (checkDate != null && metering.getCheckCycleCount() != null) {
+            return checkDate.plusMonths(metering.getCheckCycleCount());
+        }
+        return nextCheckDate;
+    }
+
+    /**
+     * 鎸�"鏈�鏂颁竴鏉℃娴嬭褰�"鏁翠綋閲嶇畻鍥炲啓璁¢噺鍣ㄥ叿锛屾纭鐩栫紪杈戦潪鏈�鏂拌褰�/鍒犻櫎涓棿璁板綍绛夎竟鐣�
+     */
+    private void refreshMeteringCheckInfo(Long meteringId) {
+        MesDvMeteringCheckDO latest = meteringCheckMapper.selectLatestByMeteringId(meteringId);
+        if (latest == null) {
+            meteringService.updateMeteringCheckInfo(meteringId, null, null);
+        } else {
+            meteringService.updateMeteringCheckInfo(meteringId,
+                    latest.getCheckDate(), latest.getNextCheckDate());
+        }
+    }
+
+}

--
Gitblit v1.9.3