فهرست منبع

feat(infrared): 增加红外读电表数据查询功能- 新增按年、月、日查询电表数据的接口和实现
- 添加异常处理配置,提高系统稳定性
- 优化 Netty 服务端口配置

nahida 11 ماه پیش
والد
کامیت
a94cf02ea3

+ 1 - 1
environment-hj212-service/src/main/resources/application-dev.yaml

@@ -17,4 +17,4 @@ minio:
   readPath: http://192.168.110.30:9000
 netty:
   # 端口号
-  port: 8085
+  port: 8086

+ 1 - 1
environment-hj212-service/src/main/resources/application-prod.yaml

@@ -17,4 +17,4 @@ minio:
   readPath: http://172.16.102.52:9000
 netty:
   # 端口号
-  port: 8085
+  port: 8086

+ 6 - 0
infrared-reading-meter-service/pom.xml

@@ -79,6 +79,12 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-websocket</artifactId>
         </dependency>
+        <!--common-->
+        <dependency>
+            <groupId>com.zksy</groupId>
+            <artifactId>zksy-common</artifactId>
+            <version>1.0.0</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 24 - 0
infrared-reading-meter-service/src/main/java/com/zksy/infrared/controller/InfraredReadingMeterController.java

@@ -4,6 +4,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zksy.common.core.domain.Result;
 import com.zksy.common.utils.SearchUtil;
 import com.zksy.infrared.domain.InfraredReadingMeter;
+import com.zksy.infrared.domain.vo.MeterDayDataVo;
+import com.zksy.infrared.domain.vo.MeterMonthDataVo;
+import com.zksy.infrared.domain.vo.MeterYearDataVo;
 import com.zksy.infrared.service.InfraredReadingMeterService;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -38,4 +41,25 @@ public class InfraredReadingMeterController {
         List<InfraredReadingMeter> list = service.list(SearchUtil.parseWhereSql(conditionJson));
         return Result.ok(list);
     }
+
+    @GetMapping("/selectByYearAndMonthData")
+    @ApiOperation(value = "根据年查询")
+    public Result selectByYearAndMonthData(Integer year,String meterNumber){
+        MeterYearDataVo vo = service.selectByYear(year,meterNumber);
+        return Result.ok(vo);
+    }
+
+    @GetMapping("/selectByYearAndMonthWithDayData")
+    @ApiOperation(value = "根据年和月查询")
+    public Result selectByYearAndMonthWithDayData(Integer year,Integer month,String meterNumber){
+        MeterMonthDataVo vo = service.selectByYearselectByYearAndMonthWithDayData(year,month,meterNumber);
+        return Result.ok(vo);
+    }
+
+    @GetMapping("/selectTodayNewestData")
+    @ApiOperation(value = "查询今天最新数据")
+    public Result selectTodayNewestData(String meterNumber){
+        MeterDayDataVo vo = service.selectByNewestData(meterNumber);
+        return Result.ok(vo);
+    }
 }

+ 16 - 0
infrared-reading-meter-service/src/main/java/com/zksy/infrared/domain/vo/MeterDayDataVo.java

@@ -0,0 +1,16 @@
+package com.zksy.infrared.domain.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class MeterDayDataVo {
+    private BigDecimal dayData;
+}

+ 17 - 0
infrared-reading-meter-service/src/main/java/com/zksy/infrared/domain/vo/MeterMonthDataVo.java

@@ -0,0 +1,17 @@
+package com.zksy.infrared.domain.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class MeterMonthDataVo {
+    private BigDecimal allMonthData;
+    private List<BigDecimal> meterDayDataList = new ArrayList<>(31);
+}

+ 17 - 0
infrared-reading-meter-service/src/main/java/com/zksy/infrared/domain/vo/MeterYearDataVo.java

@@ -0,0 +1,17 @@
+package com.zksy.infrared.domain.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class MeterYearDataVo {
+    private BigDecimal allYearData;
+    private List<BigDecimal> meterMonthDataList = new ArrayList<>(12);
+}

+ 10 - 0
infrared-reading-meter-service/src/main/java/com/zksy/infrared/service/InfraredReadingMeterService.java

@@ -2,6 +2,11 @@ package com.zksy.infrared.service;
 
 import com.zksy.infrared.domain.InfraredReadingMeter;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.zksy.infrared.domain.vo.MeterDayDataVo;
+import com.zksy.infrared.domain.vo.MeterMonthDataVo;
+import com.zksy.infrared.domain.vo.MeterYearDataVo;
+
+import java.util.List;
 
 /**
 * @author Administrator
@@ -10,4 +15,9 @@ import com.baomidou.mybatisplus.extension.service.IService;
 */
 public interface InfraredReadingMeterService extends IService<InfraredReadingMeter> {
 
+    MeterYearDataVo selectByYear(Integer year,String meterNumber);
+
+    MeterMonthDataVo selectByYearselectByYearAndMonthWithDayData(Integer year, Integer month, String meterNumber);
+
+    MeterDayDataVo selectByNewestData(String meterNumber);
 }

+ 174 - 6
infrared-reading-meter-service/src/main/java/com/zksy/infrared/service/impl/InfraredReadingMeterServiceImpl.java

@@ -1,22 +1,190 @@
 package com.zksy.infrared.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.zksy.common.exception.CommonException;
 import com.zksy.infrared.domain.InfraredReadingMeter;
+import com.zksy.infrared.domain.vo.MeterDayDataVo;
+import com.zksy.infrared.domain.vo.MeterMonthDataVo;
+import com.zksy.infrared.domain.vo.MeterYearDataVo;
 import com.zksy.infrared.service.InfraredReadingMeterService;
 import com.zksy.infrared.mapper.InfraredReadingMeterMapper;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneId;
+import java.util.*;
+import java.util.stream.Collectors;
+
 /**
-* @author Administrator
-* @description 针对表【infrared_reading_meter(红外读电表数据)】的数据库操作Service实现
-* @createDate 2025-06-06 10:27:47
-*/
+ * @author Administrator
+ * @description 针对表【infrared_reading_meter(红外读电表数据)】的数据库操作Service实现
+ * @createDate 2025-06-06 10:27:47
+ */
 @Service
 public class InfraredReadingMeterServiceImpl extends ServiceImpl<InfraredReadingMeterMapper, InfraredReadingMeter>
-    implements InfraredReadingMeterService{
+        implements InfraredReadingMeterService {
 
-}
+    // 工具方法:生成默认月数据列表
+    private static final List<BigDecimal> DEFAULT_MONTH_LIST = Collections.nCopies(12, BigDecimal.ZERO);
+    // 工具方法:生成默认日数据列表
+    private static final List<BigDecimal> DEFAULT_DAY_LIST = Collections.nCopies(31, BigDecimal.ZERO);
+
+    @Override
+    public MeterYearDataVo selectByYear(Integer year, String meterNumber) {
+        if (year == null || year < 0 || year > 9999) {
+            throw new CommonException("年份无效", 400);
+        }
+
+        LocalDate firstDayOfYear = LocalDate.of(year, 1, 1);
+        LocalDate lastDayOfYear = LocalDate.of(year, 12, 31);
+
+        LocalDateTime startOfDay = firstDayOfYear.atStartOfDay();
+        LocalDateTime endOfDay = lastDayOfYear.atTime(LocalTime.MAX);
+
+        LambdaQueryWrapper<InfraredReadingMeter> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(InfraredReadingMeter::getElectricNumber, meterNumber)
+                .between(InfraredReadingMeter::getCreateTime, startOfDay, endOfDay)
+                .orderByAsc(InfraredReadingMeter::getCreateTime);
+
+        List<InfraredReadingMeter> list = this.list(wrapper);
+
+        if (list == null || list.size() < 2) {
+            return new MeterYearDataVo(BigDecimal.ZERO, new ArrayList<>(DEFAULT_MONTH_LIST));
+        }
+
+        BigDecimal firstValue = BigDecimal.valueOf(list.get(0).getElectricEnergy());
+        BigDecimal lastValue = BigDecimal.valueOf(list.get(list.size() - 1).getElectricEnergy());
+
+        Map<Integer, List<InfraredReadingMeter>> groupedByMonth = list.stream()
+                .collect(Collectors.groupingBy(item -> {
+                    LocalDate date = item.getCreateTime().toInstant()
+                            .atZone(ZoneId.systemDefault())
+                            .toLocalDate();
+                    return date.getMonthValue();
+                }));
+
+        List<Integer> months = new ArrayList<>(groupedByMonth.keySet());
+        Collections.sort(months);
+
+        List<BigDecimal> monthDataList = new ArrayList<>(DEFAULT_MONTH_LIST);
+
+        for (int i = 0; i < months.size(); i++) {
+            Integer currentMonth = months.get(i);
+            List<InfraredReadingMeter> meters = groupedByMonth.get(currentMonth);
+
+            if (!meters.isEmpty()) {
+                BigDecimal start = BigDecimal.valueOf(meters.get(0).getElectricEnergy());
+                BigDecimal end;
+
+                if (i < months.size() - 1) {
+                    Integer nextMonth = months.get(i + 1);
+                    List<InfraredReadingMeter> nextMeters = groupedByMonth.get(nextMonth);
+                    end = !nextMeters.isEmpty()
+                            ? BigDecimal.valueOf(nextMeters.get(0).getElectricEnergy())
+                            : BigDecimal.valueOf(meters.get(meters.size() - 1).getElectricEnergy());
+                } else {
+                    end = BigDecimal.valueOf(meters.get(meters.size() - 1).getElectricEnergy());
+                }
+
+                monthDataList.set(currentMonth - 1, end.subtract(start));
+            }
+        }
+
+        return new MeterYearDataVo(lastValue.subtract(firstValue), monthDataList);
+    }
+
+    @Override
+    public MeterMonthDataVo selectByYearselectByYearAndMonthWithDayData(Integer year, Integer month, String meterNumber) {
+        if (year == null || month == null || year < 0 || year > 9999 || month < 1 || month > 12) {
+            throw new CommonException("年份或月份无效", 400);
+        }
 
+        LocalDate firstDayOfMonth = LocalDate.of(year, month, 1);
+        LocalDate lastDayOfMonth = firstDayOfMonth.withDayOfMonth(firstDayOfMonth.lengthOfMonth());
 
+        LocalDateTime startOfDay = firstDayOfMonth.atStartOfDay();
+        LocalDateTime endOfDay = lastDayOfMonth.atTime(LocalTime.MAX);
 
+        LambdaQueryWrapper<InfraredReadingMeter> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(InfraredReadingMeter::getElectricNumber, meterNumber)
+                .between(InfraredReadingMeter::getCreateTime, startOfDay, endOfDay)
+                .orderByAsc(InfraredReadingMeter::getCreateTime);
 
+        List<InfraredReadingMeter> list = this.list(wrapper);
+
+        if (list == null || list.size() < 2) {
+            return new MeterMonthDataVo(BigDecimal.ZERO, new ArrayList<>(DEFAULT_DAY_LIST));
+        }
+
+        BigDecimal firstValue = BigDecimal.valueOf(list.get(0).getElectricEnergy());
+        BigDecimal lastValue = BigDecimal.valueOf(list.get(list.size() - 1).getElectricEnergy());
+
+        Map<Integer, List<InfraredReadingMeter>> groupedByDay = list.stream()
+                .collect(Collectors.groupingBy(item -> {
+                    LocalDate date = item.getCreateTime().toInstant()
+                            .atZone(ZoneId.systemDefault())
+                            .toLocalDate();
+                    return date.getDayOfMonth();
+                }));
+
+        List<Integer> days = new ArrayList<>(groupedByDay.keySet());
+        Collections.sort(days);
+
+        List<BigDecimal> dayDataList = new ArrayList<>(DEFAULT_DAY_LIST);
+
+        for (int i = 0; i < days.size(); i++) {
+            Integer currentDay = days.get(i);
+            List<InfraredReadingMeter> currentMeters = groupedByDay.get(currentDay);
+
+            if (!currentMeters.isEmpty()) {
+                BigDecimal start = BigDecimal.valueOf(currentMeters.get(0).getElectricEnergy());
+                BigDecimal end;
+
+                if (i < days.size() - 1) {
+                    Integer nextDay = days.get(i + 1);
+                    List<InfraredReadingMeter> nextMeters = groupedByDay.get(nextDay);
+                    end = !nextMeters.isEmpty()
+                            ? BigDecimal.valueOf(nextMeters.get(0).getElectricEnergy())
+                            : BigDecimal.valueOf(currentMeters.get(currentMeters.size() - 1).getElectricEnergy());
+                } else {
+                    end = BigDecimal.valueOf(currentMeters.get(currentMeters.size() - 1).getElectricEnergy());
+                }
+
+                dayDataList.set(currentDay - 1, end.subtract(start));
+            }
+        }
+
+        return new MeterMonthDataVo(lastValue.subtract(firstValue), dayDataList);
+    }
+
+    @Override
+    public MeterDayDataVo selectByNewestData(String meterNumber) {
+        if (meterNumber == null || meterNumber.isEmpty()) {
+            throw new CommonException("电表编号不能为空", 400);
+        }
+
+        LocalDate today = LocalDate.now();
+        LocalDateTime startOfDay = today.atStartOfDay();
+        LocalDateTime endOfDay = today.atTime(LocalTime.MAX);
+
+        LambdaQueryWrapper<InfraredReadingMeter> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(InfraredReadingMeter::getElectricNumber, meterNumber)
+                .between(InfraredReadingMeter::getCreateTime, startOfDay, endOfDay)
+                .orderByAsc(InfraredReadingMeter::getCreateTime);
+
+        List<InfraredReadingMeter> list = this.list(wrapper);
+
+        if (list == null || list.size() < 2) {
+            return new MeterDayDataVo(BigDecimal.ZERO);
+        }
+
+        BigDecimal firstValue = BigDecimal.valueOf(list.get(0).getElectricEnergy());
+        BigDecimal lastValue = BigDecimal.valueOf(list.get(list.size() - 1).getElectricEnergy());
+
+        return new MeterDayDataVo(lastValue.subtract(firstValue));
+    }
+}

+ 13 - 0
zksy-common/src/main/java/com/zksy/common/config/ExceptionHandlerConfig.java

@@ -0,0 +1,13 @@
+package com.zksy.common.config;
+
+import com.zksy.common.advice.CommonExceptionAdvice;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class ExceptionHandlerConfig {
+    @Bean
+    public CommonExceptionAdvice commonExceptionAdvice() {
+        return new CommonExceptionAdvice();
+    }
+}

+ 2 - 1
zksy-common/src/main/resources/META-INF/spring.factories

@@ -1,4 +1,5 @@
 org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
   com.zksy.common.config.MyBatisConfig,\
   com.zksy.common.config.MvcConfig,\
-  com.zksy.common.config.JsonConfig
+  com.zksy.common.config.JsonConfig,\
+  com.zksy.common.config.ExceptionHandlerConfig