refactor(property): 优化智能水表抄表逻辑
This commit is contained in:
@@ -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());
|
||||
|
Reference in New Issue
Block a user