gongchunyi
昨天 e9b4ceeea014f9d81263672f3d9c46a567c39591
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package com.ruoyi.energymeter.mapper;
 
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.energymeter.dto.DailyUsageRow;
import com.ruoyi.energymeter.dto.DataRangeRow;
import com.ruoyi.energymeter.dto.MeterUsageRow;
import com.ruoyi.energymeter.dto.MonthlyUsageRow;
import com.ruoyi.energymeter.pojo.EnergyMeterMeasurement;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
 
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;
 
/**
 * 水电表采集数据 Mapper。
 */
@Mapper
public interface EnergyMeterMeasurementMapper extends BaseMapper<EnergyMeterMeasurement> {
 
    /**
     * 按日汇总期间用量。只统计 D 粒度的用量指标,绝不累加 POINT 表码。
     */
    List<DailyUsageRow> sumDailyUsage(@Param("meterIds") Collection<Long> meterIds,
                                      @Param("metricCode") String metricCode,
                                      @Param("start") LocalDateTime start,
                                      @Param("end") LocalDateTime end);
 
    /**
     * 按设备汇总一段时间内的用量,用于设备列表展示最近一天用量。
     */
    List<MeterUsageRow> sumUsageByMeter(@Param("meterIds") Collection<Long> meterIds,
                                        @Param("metricCode") String metricCode,
                                        @Param("start") LocalDateTime start,
                                        @Param("end") LocalDateTime end);
 
    /**
     * 按月汇总期间用量。
     */
    List<MonthlyUsageRow> sumMonthlyUsage(@Param("meterIds") Collection<Long> meterIds,
                                          @Param("metricCode") String metricCode,
                                          @Param("start") LocalDateTime start,
                                          @Param("end") LocalDateTime end);
 
    /**
     * 查询指定设备、指标、粒度在时间区间内已存在的采集点,用于幂等比对。
     */
    List<EnergyMeterMeasurement> selectExistingPoints(@Param("meterId") Long meterId,
                                                       @Param("metricCode") String metricCode,
                                                       @Param("granularity") String granularity,
                                                       @Param("start") LocalDateTime start,
                                                       @Param("end") LocalDateTime end);
 
    /**
     * 批量幂等写入,唯一键冲突时更新指标值与采集时间。
     */
    int upsertBatch(@Param("list") List<EnergyMeterMeasurement> list);
 
    /**
     * 查询已采集数据的时间范围。
     */
    DataRangeRow selectDataRange(@Param("meterIds") Collection<Long> meterIds,
                                 @Param("metricCode") String metricCode);
 
    /**
     * 区间合计。
     */
    BigDecimal sumTotal(@Param("meterIds") Collection<Long> meterIds,
                        @Param("metricCode") String metricCode,
                        @Param("start") LocalDateTime start,
                        @Param("end") LocalDateTime end);
 
    @Select("SELECT * FROM energy_meter_measurement WHERE meter_id = #{meterId} AND metric_code = #{metricCode} "
            + "ORDER BY measure_time DESC LIMIT 1")
    EnergyMeterMeasurement selectLatestPoint(@Param("meterId") Long meterId,
                                             @Param("metricCode") String metricCode);
 
    /**
     * 查询指定时间点之前最近的一条时点示值(手工抄表用于计算期差)。
     */
    @Select("SELECT * FROM energy_meter_measurement WHERE meter_id = #{meterId} AND metric_code = #{metricCode} "
            + "AND granularity = 'POINT' AND measure_time < #{time} ORDER BY measure_time DESC LIMIT 1")
    EnergyMeterMeasurement selectPreviousPoint(@Param("meterId") Long meterId,
                                               @Param("metricCode") String metricCode,
                                               @Param("time") LocalDateTime time);
 
    /**
     * 查询指定时间点之后最近的一条时点示值(补录/删除后重算下一期用量)。
     */
    @Select("SELECT * FROM energy_meter_measurement WHERE meter_id = #{meterId} AND metric_code = #{metricCode} "
            + "AND granularity = 'POINT' AND measure_time > #{time} ORDER BY measure_time ASC LIMIT 1")
    EnergyMeterMeasurement selectNextPoint(@Param("meterId") Long meterId,
                                           @Param("metricCode") String metricCode,
                                           @Param("time") LocalDateTime time);
 
    @Select("SELECT COUNT(DISTINCT DATE(measure_time)) FROM energy_meter_measurement "
            + "WHERE meter_id = #{meterId} AND metric_code = #{metricCode} AND granularity = 'D' "
            + "AND measure_time >= #{start} AND measure_time < #{end}")
    Integer countCollectedDays(@Param("meterId") Long meterId,
                               @Param("metricCode") String metricCode,
                               @Param("start") LocalDateTime start,
                               @Param("end") LocalDateTime end);
 
    /**
     * 指定期间内已有日用量数据的设备台数,用于采集页展示“今日已归集”。
     */
    Integer countMetersWithUsage(@Param("meterIds") Collection<Long> meterIds,
                                 @Param("metricCode") String metricCode,
                                 @Param("start") LocalDateTime start,
                                 @Param("end") LocalDateTime end);
}