refactor(property): 优化智能水表抄表逻辑

This commit is contained in:
2025-09-06 17:07:59 +08:00
parent 4a3097e490
commit 7f813393c5

View File

@@ -1,6 +1,7 @@
package org.dromara.property.service.impl.smartDevicesImpl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
@@ -169,20 +170,24 @@ public class TbMeterRecordServiceImpl implements ITbMeterRecordService {
continue;
}
String newReadingTime = result.getRecordTime();
Date newReadingTimeDate = DateUtil.parse(newReadingTime);
Date oldReadingTimeDate = DateUtil.offset(newReadingTimeDate, DateField.HOUR, -1);
// 获取设备id
Collection<Long> meterIds = infoList.stream().map(TbMeterInfoVo::getId).toList();
// 取出上次抄表记录
LambdaQueryWrapper<TbMeterRecord> lqw = new LambdaQueryWrapper<>();
lqw.in(TbMeterRecord::getMeterId, meterIds)
.orderByDesc(TbMeterRecord::getReadingTime)
.last("limit " + meterIds.size());
.eq(TbMeterRecord::getReadingTime, oldReadingTimeDate)
.orderByDesc(TbMeterRecord::getReadingTime);
List<TbMeterRecord> recordOld = baseMapper.selectList(lqw);
List<TbMeterRecord> recordNew = new ArrayList<>(infoList.size());
boolean hasOldRecords = CollUtil.isNotEmpty(recordOld);
log.info("当前采集器ip下{}抄表记录, ip:{}", hasOldRecords ? "" : "", result.getIp());
log.info("当前采集器ip下{}前一小时抄表记录, ip:{}", hasOldRecords ? "" : "", result.getIp());
// 创建meterId到旧记录的映射提高查找效率
Map<Long, TbMeterRecord> oldRecordMap = hasOldRecords ?
recordOld.stream().collect(Collectors.toMap(TbMeterRecord::getMeterId, Function.identity())) :
@@ -197,10 +202,12 @@ public class TbMeterRecordServiceImpl implements ITbMeterRecordService {
record.setTenantId(info.getTenantId());
// 获取当前读数
BigDecimal currentReading = BigDecimal.valueOf(
result.getCollectionValue().get(Integer.parseInt(info.getMeterCode()))
);
record.setCurrentReading(currentReading);
int meterCode = Integer.parseInt(info.getMeterCode());
if (meterCode + 1 <= result.getCollectionValue().size()){
record.setCurrentReading(BigDecimal.valueOf(result.getCollectionValue().get(meterCode)));
}else {
record.setCurrentReading(BigDecimal.ZERO);
}
// 设置上次读数
if (hasOldRecords) {
@@ -209,10 +216,10 @@ public class TbMeterRecordServiceImpl implements ITbMeterRecordService {
record.setPreviousReading(oldRecord.getCurrentReading());
} else {
// 如果没有找到对应的旧记录,使用默认值
record.setPreviousReading(BigDecimal.ZERO);
record.setPreviousReading(record.getCurrentReading());
}
} else {
record.setPreviousReading(BigDecimal.ZERO);
record.setPreviousReading(record.getCurrentReading());
}
record.setReadingMethod(MeterRecordTypeEnum.AUTO_RECORD.getCode());