From d2ab6f7153e604bac7bc4ad58f27f368b65d8a1e Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期二, 16 六月 2026 13:54:58 +0800
Subject: [PATCH] feat: 添加能耗数据综合分析功能,支持按天和周维度的趋势分析
---
src/main/java/com/ruoyi/http/service/impl/TqdianbiaoMeterManageServiceImpl.java | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 120 insertions(+), 0 deletions(-)
diff --git a/src/main/java/com/ruoyi/http/service/impl/TqdianbiaoMeterManageServiceImpl.java b/src/main/java/com/ruoyi/http/service/impl/TqdianbiaoMeterManageServiceImpl.java
new file mode 100644
index 0000000..fafafba
--- /dev/null
+++ b/src/main/java/com/ruoyi/http/service/impl/TqdianbiaoMeterManageServiceImpl.java
@@ -0,0 +1,120 @@
+package com.ruoyi.http.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.http.mapper.TqdianbiaoMeterMapper;
+import com.ruoyi.http.pojo.TqdianbiaoMeter;
+import com.ruoyi.http.service.TqdianbiaoMeterManageService;
+import com.ruoyi.http.service.TqdianbiaoMeterSyncService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class TqdianbiaoMeterManageServiceImpl
+ extends ServiceImpl<TqdianbiaoMeterMapper, TqdianbiaoMeter>
+ implements TqdianbiaoMeterManageService {
+
+ private static final long MANUAL_METER_ID_BASE = 900_000_000L;
+
+ private final TqdianbiaoMeterSyncService meterSyncService;
+
+ @Override
+ public IPage<TqdianbiaoMeter> listPage(Page page, TqdianbiaoMeter query) {
+ return page(page, Wrappers.<TqdianbiaoMeter>lambdaQuery()
+ .and(StringUtils.isNotEmpty(query.getKeyword()), w -> w
+ .like(TqdianbiaoMeter::getMeterName, query.getKeyword())
+ .or()
+ .like(TqdianbiaoMeter::getAddress, query.getKeyword())
+ .or()
+ .like(TqdianbiaoMeter::getDescription, query.getKeyword()))
+ .eq(query.getMeterId() != null, TqdianbiaoMeter::getMeterId, query.getMeterId())
+ .eq(StringUtils.isNotEmpty(query.getSource()), TqdianbiaoMeter::getSource, query.getSource())
+ .orderByDesc(TqdianbiaoMeter::getUpdateTime));
+ }
+
+ @Override
+ public boolean addMeter(TqdianbiaoMeter meter) {
+ validateManualMeter(meter);
+ meter.setSource("manual");
+ meter.setMeterId(generateManualMeterId());
+ if (meter.getRate() == null) {
+ meter.setRate(1);
+ }
+ if (StringUtils.isEmpty(meter.getRelayState())) {
+ meter.setRelayState("1");
+ }
+ meter.setSyncTime(LocalDateTime.now());
+ return save(meter);
+ }
+
+ @Override
+ public boolean updateMeter(TqdianbiaoMeter meter) {
+ if (meter.getId() == null) {
+ throw new ServiceException("ID涓嶈兘涓虹┖");
+ }
+ TqdianbiaoMeter existing = getById(meter.getId());
+ if (existing == null) {
+ throw new ServiceException("鐢佃〃涓嶅瓨鍦�");
+ }
+ if (StringUtils.isEmpty(meter.getAddress())) {
+ throw new ServiceException("琛ㄥ湴鍧�涓嶈兘涓虹┖");
+ }
+ String meterName = StringUtils.isNotEmpty(meter.getMeterName()) ? meter.getMeterName() : meter.getAddress();
+ existing.setMeterName(meterName);
+ existing.setAddress(meter.getAddress());
+ existing.setDescription(meter.getDescription());
+ existing.setRelayState(meter.getRelayState());
+ if (existing.getSource() == null) {
+ existing.setSource("sync");
+ }
+ if ("manual".equals(existing.getSource())) {
+ existing.setRate(meter.getRate());
+ }
+ existing.setSyncTime(LocalDateTime.now());
+ return updateById(existing);
+ }
+
+ @Override
+ public boolean deleteByIds(List<Long> ids) {
+ if (CollectionUtils.isEmpty(ids)) {
+ throw new ServiceException("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+ }
+ return removeBatchByIds(ids);
+ }
+
+ @Override
+ public int syncFromRemote() {
+ return meterSyncService.syncMeters();
+ }
+
+ private void validateManualMeter(TqdianbiaoMeter meter) {
+ if (StringUtils.isEmpty(meter.getMeterName())) {
+ throw new ServiceException("鐢佃〃鍚嶇О涓嶈兘涓虹┖");
+ }
+ if (StringUtils.isEmpty(meter.getAddress())) {
+ throw new ServiceException("琛ㄥ湴鍧�涓嶈兘涓虹┖");
+ }
+ }
+
+ private Long generateManualMeterId() {
+ TqdianbiaoMeter maxManual = getOne(
+ Wrappers.<TqdianbiaoMeter>lambdaQuery()
+ .eq(TqdianbiaoMeter::getSource, "manual")
+ .orderByDesc(TqdianbiaoMeter::getMeterId)
+ .last("LIMIT 1"),
+ false);
+ if (maxManual == null || maxManual.getMeterId() == null) {
+ return MANUAL_METER_ID_BASE + 1;
+ }
+ return maxManual.getMeterId() + 1;
+ }
+}
--
Gitblit v1.9.3