|
@@ -16,12 +16,15 @@ import com.huaxu.zoniot.entity.JobTask;
|
|
|
import com.huaxu.zoniot.entity.MeasuringData;
|
|
|
import com.huaxu.zoniot.entity.MeterReadRecord;
|
|
|
import com.huaxu.zoniot.entity.WaterMeter;
|
|
|
+import com.huaxu.zoniot.repository.MeterReadRecordRepository;
|
|
|
import com.huaxu.zoniot.service.MeterReadRecordService;
|
|
|
import com.huaxu.zoniot.utils.RedisUtil;
|
|
|
import com.huaxu.zoniot.utils.SnowflakeIdWorker;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.apache.commons.lang3.time.StopWatch;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.data.mongodb.core.MongoTemplate;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Isolation;
|
|
|
import org.springframework.transaction.annotation.Propagation;
|
|
@@ -29,10 +32,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
import java.math.BigDecimal;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Date;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
+import java.util.*;
|
|
|
|
|
|
/**
|
|
|
* <p>抄表记录服务实现类</p>
|
|
@@ -55,6 +55,8 @@ public class MeterReadRecordServiceImpl implements MeterReadRecordService {
|
|
|
@Resource
|
|
|
RedisUtil redisUtil ;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ MeterReadRecordRepository meterReadRecordRepository ;
|
|
|
/**
|
|
|
* 根据任务生成未抄记录
|
|
|
* @param jobTask
|
|
@@ -97,11 +99,12 @@ public class MeterReadRecordServiceImpl implements MeterReadRecordService {
|
|
|
}
|
|
|
else{
|
|
|
List<MeterReadRecord> meterReadRecordList = new ArrayList<>();
|
|
|
+ List<MeterReadRecord> meterReadRecordListForMongo = new ArrayList<>();
|
|
|
for (WaterMeter waterMeter : waterMeterList){
|
|
|
MeterReadRecord meterReadRecord = buildUnReadRecord(waterMeter, readDay);
|
|
|
if(meterReadRecord != null){
|
|
|
-
|
|
|
meterReadRecordList.add(meterReadRecord);
|
|
|
+ meterReadRecordListForMongo.add(meterReadRecord);
|
|
|
}
|
|
|
if (meterReadRecordList.size() == Constants.BATCH_SIZE){
|
|
|
// 按批次提交
|
|
@@ -115,6 +118,14 @@ public class MeterReadRecordServiceImpl implements MeterReadRecordService {
|
|
|
i = i+insert ;
|
|
|
meterReadRecordList.clear();
|
|
|
}
|
|
|
+ if(meterReadRecordListForMongo.size() != 0){
|
|
|
+ try {
|
|
|
+ meterReadRecordRepository.saveAll(meterReadRecordListForMongo);
|
|
|
+ }catch (Exception e){
|
|
|
+ e.printStackTrace();
|
|
|
+ log.error("Batch insert meter read record to mongo failed !",e);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
log.info("end batch create meter record , readDay={} ,result size = {}",readDay,i);
|
|
|
return i;
|
|
@@ -139,17 +150,17 @@ public class MeterReadRecordServiceImpl implements MeterReadRecordService {
|
|
|
* @return
|
|
|
*/
|
|
|
protected MeterReadRecord buildUnReadRecord(WaterMeter waterMeter , Integer readDay){
|
|
|
- if(compareMeterReadDay(readDay) == 0){
|
|
|
- // 生成今日的未抄,从缓存中获取最新的数据,若最新的数据不为今日数据才生成今日未抄
|
|
|
- Map<String, MeasuringData> cacheMeasuringData = getMeterLastDataFromCache(waterMeter.getDeviceId());
|
|
|
- if(cacheMeasuringData != null){
|
|
|
- Date lastSendTime = getDateFromMeterData(cacheMeasuringData);
|
|
|
- if(lastSendTime.after(DateUtil.parse(String.valueOf(readDay),Constants.DEFAULT_METER_READ_DATE_FORMAT))){
|
|
|
- log.warn("Don't Need Create UnRead Record , Device = {},Last Send Time = {}",waterMeter.getDeviceId(),lastSendTime);
|
|
|
- return null ;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+// if(compareMeterReadDay(readDay) == 0){
|
|
|
+// // 生成今日的未抄,从缓存中获取最新的数据,若最新的数据不为今日数据才生成今日未抄
|
|
|
+// Map<String, MeasuringData> cacheMeasuringData = getMeterLastDataFromCache(waterMeter.getDeviceId());
|
|
|
+// if(cacheMeasuringData != null){
|
|
|
+// Date lastSendTime = getDateFromMeterData(cacheMeasuringData);
|
|
|
+// if(lastSendTime.after(DateUtil.parse(String.valueOf(readDay),Constants.DEFAULT_METER_READ_DATE_FORMAT))){
|
|
|
+// log.warn("Don't Need Create UnRead Record , Device = {},Last Send Time = {}",waterMeter.getDeviceId(),lastSendTime);
|
|
|
+// return null ;
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
MeterReadRecord meterReadRecord = new MeterReadRecord() ;
|
|
|
meterReadRecord.setBuildingId(waterMeter.getBuildingId());
|
|
|
meterReadRecord.setCity(waterMeter.getCity());
|
|
@@ -176,6 +187,21 @@ public class MeterReadRecordServiceImpl implements MeterReadRecordService {
|
|
|
meterReadRecord.setSysId(waterMeter.getSysId());
|
|
|
meterReadRecord.setProvince(waterMeter.getProvince());
|
|
|
meterReadRecord.setLastValid(getMeterLastValid(waterMeter,readDay));
|
|
|
+ /*********************如下字段为了MongoDB的需要**************************/
|
|
|
+ meterReadRecord.setProvinceName(waterMeter.getProvinceName());
|
|
|
+ meterReadRecord.setCityName(waterMeter.getCityName());
|
|
|
+ meterReadRecord.setRegionName(waterMeter.getRegionName());
|
|
|
+ meterReadRecord.setCustomerName(waterMeter.getCustomerName());
|
|
|
+ meterReadRecord.setDeviceTypeName(waterMeter.getDeviceTypeName());
|
|
|
+ meterReadRecord.setManufacturerId(waterMeter.getManufacturerId());
|
|
|
+ meterReadRecord.setManufacturerName(waterMeter.getManufacturerName());
|
|
|
+ meterReadRecord.setConcentratorNo(waterMeter.getConcentratorNo());
|
|
|
+ meterReadRecord.setCollectorNo(waterMeter.getCollectorNo());
|
|
|
+ meterReadRecord.setBuildingName(waterMeter.getBuildingName());
|
|
|
+ meterReadRecord.setCommunityName(waterMeter.getCommunityName());
|
|
|
+ meterReadRecord.setChannelNumberId(waterMeter.getChannelNumberId());
|
|
|
+ meterReadRecord.setChannelName(waterMeter.getChannelName());
|
|
|
+
|
|
|
return meterReadRecord ;
|
|
|
}
|
|
|
|
|
@@ -299,8 +325,10 @@ public class MeterReadRecordServiceImpl implements MeterReadRecordService {
|
|
|
// 判断数据上报时间与抄表日期是否匹配
|
|
|
Date sendTime = getDateFromMeterData(measuringData);
|
|
|
DateTime readDate = DateUtil.parse(String.valueOf(readDay), Constants.DEFAULT_METER_READ_DATE_FORMAT);
|
|
|
+ // 允许一个小时日切延时
|
|
|
int hour = 24 ;
|
|
|
- if(sendTime.before(readDate) || sendTime.after(DateUtil.offsetHour(readDate,hour))){
|
|
|
+ if(sendTime.before(DateUtil.offsetHour(readDate,-1)) ||
|
|
|
+ sendTime.after(DateUtil.offsetHour(readDate,hour))){
|
|
|
log.error("表{}数据异常,抄表时间与上报时间不匹配,上报时间{} != 本次抄表时间{}",
|
|
|
waterMeter.getDeviceId(),sendTime,readDate);
|
|
|
throw new ServiceException(ResultStatus.READING_ERROR_2);
|
|
@@ -310,7 +338,15 @@ public class MeterReadRecordServiceImpl implements MeterReadRecordService {
|
|
|
if(record == null){
|
|
|
// 抄表记录不存在,则生成今日未抄表记录
|
|
|
record = buildUnReadRecord(waterMeter,readDay);
|
|
|
- meterReadRecordMapper.insert(record);
|
|
|
+ if(record != null){
|
|
|
+ meterReadRecordMapper.insert(record);
|
|
|
+ // 同时也插入一份到mongo中
|
|
|
+ meterReadRecordRepository.insert(record);
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ throw new ServiceException(ResultStatus.READING_ERROR_3);
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
// 根据上报数据更新抄表数据
|
|
|
if(record.getReadStatus().equals(Constants.READ)){
|
|
@@ -329,7 +365,9 @@ public class MeterReadRecordServiceImpl implements MeterReadRecordService {
|
|
|
throw new ServiceException(ResultStatus.READING_ERROR_4);
|
|
|
}
|
|
|
// 计算今日用水量
|
|
|
- BigDecimal todayCost = calculateTodayCost(currentReading, record);
|
|
|
+ BigDecimal todayCost = calculateTodayCost(currentReading,
|
|
|
+ new BigDecimal(getMeterLastValid(waterMeter,readDay)),
|
|
|
+ record);
|
|
|
MeterReadRecord update = new MeterReadRecord();
|
|
|
update.setId(record.getId());
|
|
|
update.setLastCost(todayCost);
|
|
@@ -340,6 +378,21 @@ public class MeterReadRecordServiceImpl implements MeterReadRecordService {
|
|
|
update.setReadTime(sendTime);
|
|
|
update.setUpdateBy(Constants.SYS_FLAG);
|
|
|
meterReadRecordMapper.updateByPrimaryKeySelective(update) ;
|
|
|
+ // 同时也将mongo抄表记录更新
|
|
|
+ try {
|
|
|
+ record.setLastSendData(getMeasuringValueMap(measuringData));
|
|
|
+ update.setLastCost(todayCost);
|
|
|
+ record.setReadData(currentReading);
|
|
|
+ record.setLastValid(currentReading);
|
|
|
+ record.setReadStatus(Constants.READ);
|
|
|
+ record.setDateUpdate(new Date());
|
|
|
+ record.setReadTime(sendTime);
|
|
|
+ record.setUpdateBy(Constants.SYS_FLAG);
|
|
|
+ meterReadRecordRepository.save(record);
|
|
|
+ }catch (Exception e){
|
|
|
+ e.printStackTrace();
|
|
|
+ log.error("Update meter record to mongo failed!",e);
|
|
|
+ }
|
|
|
// 更新缓存
|
|
|
setMeterLastDataToCache(waterMeter.getDeviceId(),measuringData);
|
|
|
}catch (Exception e){
|
|
@@ -355,6 +408,15 @@ public class MeterReadRecordServiceImpl implements MeterReadRecordService {
|
|
|
log.debug("-----end meter reading , meter = {},readDay = {},Cost = {}ms",waterMeter.getDeviceId(),readDay,clock.getTime());
|
|
|
}
|
|
|
|
|
|
+ protected Map<String,String> getMeasuringValueMap(Map<String, MeasuringData> measuringData){
|
|
|
+ Map<String,String> measuringValueMap = new HashMap<>(measuringData.size());
|
|
|
+ Iterator<Map.Entry<String, MeasuringData>> iterator = measuringData.entrySet().iterator();
|
|
|
+ while(iterator.hasNext()){
|
|
|
+ Map.Entry<String, MeasuringData> next = iterator.next();
|
|
|
+ measuringValueMap.put(next.getValue().getMeasuringCode(),next.getValue().getMeasuringVaule());
|
|
|
+ }
|
|
|
+ return measuringValueMap ;
|
|
|
+ }
|
|
|
@Override
|
|
|
public void meterReading(Long meterId, Map<String, MeasuringData> measuringData) {
|
|
|
WaterMeter meter = waterMeterMapper.findWaterMeterById(meterId);
|
|
@@ -374,9 +436,9 @@ public class MeterReadRecordServiceImpl implements MeterReadRecordService {
|
|
|
String readingValue = readingData.getMeasuringVaule();
|
|
|
return readingValue ;
|
|
|
}
|
|
|
- protected BigDecimal calculateTodayCost(String currentReading,MeterReadRecord record){
|
|
|
+ protected BigDecimal calculateTodayCost(String currentReading,BigDecimal lastValid,MeterReadRecord record){
|
|
|
BigDecimal lastCost = record.getLastCost();
|
|
|
- BigDecimal lastValid = new BigDecimal(record.getLastValid());
|
|
|
+// BigDecimal lastValid = new BigDecimal(record.getLastValid());
|
|
|
BigDecimal currentValid = new BigDecimal(currentReading);
|
|
|
BigDecimal cost = currentValid.subtract(lastValid).add(lastCost) ;
|
|
|
return cost ;
|