|
|
@@ -417,14 +417,9 @@ public class InfraredReadingMeterServiceImpl extends ServiceImpl<InfraredReading
|
|
|
LambdaQueryWrapper<InfraredReadingMeter> allMeterQuery = new LambdaQueryWrapper<>();
|
|
|
allMeterQuery.isNotNull(InfraredReadingMeter::getElectricNumber)
|
|
|
.isNotNull(InfraredReadingMeter::getElectricEnergy)
|
|
|
- .select(InfraredReadingMeter::getElectricNumber)
|
|
|
- .groupBy(InfraredReadingMeter::getElectricNumber);
|
|
|
- List<String> allValidMeterNumbers = listObjs(allMeterQuery, obj -> {
|
|
|
- if (obj instanceof String) {
|
|
|
- return (String) obj;
|
|
|
- }
|
|
|
- return obj.toString();
|
|
|
- }).stream()
|
|
|
+ .groupBy(InfraredReadingMeter::getElectricNumber); // 去重获取所有电表号
|
|
|
+ List<String> allValidMeterNumbers = list(allMeterQuery).stream()
|
|
|
+ .map(InfraredReadingMeter::getElectricNumber)
|
|
|
.filter(Objects::nonNull)
|
|
|
.filter(num -> !num.trim().isEmpty())
|
|
|
.collect(Collectors.toList());
|
|
|
@@ -444,10 +439,7 @@ public class InfraredReadingMeterServiceImpl extends ServiceImpl<InfraredReading
|
|
|
// 查询所有电表的最新总电量记录
|
|
|
LambdaQueryWrapper<InfraredReadingMeter> latestQuery = new LambdaQueryWrapper<>();
|
|
|
latestQuery.isNotNull(InfraredReadingMeter::getElectricNumber)
|
|
|
- .isNotNull(InfraredReadingMeter::getElectricEnergy)
|
|
|
- .select(InfraredReadingMeter::getElectricNumber,
|
|
|
- InfraredReadingMeter::getElectricEnergy,
|
|
|
- InfraredReadingMeter::getCreateTime);
|
|
|
+ .isNotNull(InfraredReadingMeter::getElectricEnergy);
|
|
|
List<InfraredReadingMeter> allRecords = list(latestQuery);
|
|
|
|
|
|
// 按电表号分组,取最新记录(创建时间最晚)
|
|
|
@@ -460,7 +452,7 @@ public class InfraredReadingMeterServiceImpl extends ServiceImpl<InfraredReading
|
|
|
// 组装结果(保留两位小数)
|
|
|
List<Map<String, Object>> result = new ArrayList<>();
|
|
|
for (String electricNumber : allValidMeterNumbers) {
|
|
|
- Map<String, Object> meterMap = new HashMap<>(5); // 增加容量以存储复位标记
|
|
|
+ Map<String, Object> meterMap = new HashMap<>(4);
|
|
|
meterMap.put("electricNumber", electricNumber);
|
|
|
|
|
|
LambdaQueryWrapper<CompanyElectric> companyElectricQuery = new LambdaQueryWrapper<>();
|
|
|
@@ -474,46 +466,30 @@ public class InfraredReadingMeterServiceImpl extends ServiceImpl<InfraredReading
|
|
|
continue; // 排除总电量为空的电表
|
|
|
}
|
|
|
BigDecimal totalElectricity = BigDecimal.valueOf(latestRecord.getElectricEnergy())
|
|
|
- .setScale(2, RoundingMode.HALF_UP);
|
|
|
+ .setScale(2, RoundingMode.HALF_UP); // 四舍五入保留两位小数
|
|
|
meterMap.put("totalElectricity", totalElectricity);
|
|
|
|
|
|
- // 计算当日用电量(处理电表复位情况)
|
|
|
+ // 计算当日用电量(无数据则为0,保留两位小数)
|
|
|
List<InfraredReadingMeter> todayMeterRecords = todayRecordsByMeter.getOrDefault(electricNumber, Collections.emptyList());
|
|
|
- BigDecimal dailyElectricity = BigDecimal.ZERO.setScale(2);
|
|
|
- boolean isReset = false; // 标记是否发生电表复位
|
|
|
-
|
|
|
+ BigDecimal dailyElectricity;
|
|
|
if (todayMeterRecords.size() >= 2) {
|
|
|
InfraredReadingMeter first = todayMeterRecords.get(0);
|
|
|
InfraredReadingMeter last = todayMeterRecords.get(todayMeterRecords.size() - 1);
|
|
|
-
|
|
|
if (first.getElectricEnergy() != null && last.getElectricEnergy() != null) {
|
|
|
double diff = last.getElectricEnergy() - first.getElectricEnergy();
|
|
|
-
|
|
|
- // 检测到负数,说明电表复位
|
|
|
- if (diff < 0) {
|
|
|
- // 复位情况下,当日用电量为最后一次记录的电量值
|
|
|
- dailyElectricity = BigDecimal.valueOf(last.getElectricEnergy())
|
|
|
- .setScale(2, RoundingMode.HALF_UP);
|
|
|
- isReset = true;
|
|
|
- } else {
|
|
|
- dailyElectricity = BigDecimal.valueOf(diff)
|
|
|
- .setScale(2, RoundingMode.HALF_UP);
|
|
|
- }
|
|
|
- }
|
|
|
- } else if (todayMeterRecords.size() == 1) {
|
|
|
- // 只有一条记录时,直接使用该记录的电量值
|
|
|
- InfraredReadingMeter record = todayMeterRecords.get(0);
|
|
|
- if (record.getElectricEnergy() != null) {
|
|
|
- dailyElectricity = BigDecimal.valueOf(record.getElectricEnergy())
|
|
|
+ dailyElectricity = BigDecimal.valueOf(diff)
|
|
|
.setScale(2, RoundingMode.HALF_UP);
|
|
|
+ } else {
|
|
|
+ dailyElectricity = BigDecimal.ZERO.setScale(2); // 数据异常时设为0.00
|
|
|
}
|
|
|
+ } else {
|
|
|
+ dailyElectricity = BigDecimal.ZERO.setScale(2); // 当日无数据或记录不足,设为0.00
|
|
|
}
|
|
|
-
|
|
|
meterMap.put("dailyElectricity", dailyElectricity);
|
|
|
- meterMap.put("isReset", isReset); // 增加复位标记,方便前端展示
|
|
|
|
|
|
result.add(meterMap);
|
|
|
}
|
|
|
+
|
|
|
return result;
|
|
|
}
|
|
|
}
|