|
@@ -1,9 +1,11 @@
|
|
|
package com.zcxk.xxljob.service.impl;
|
|
|
|
|
|
+import cn.hutool.core.comparator.CompareUtil;
|
|
|
import cn.hutool.core.date.LocalDateTimeUtil;
|
|
|
import cn.hutool.core.map.MapUtil;
|
|
|
import cn.hutool.core.util.PageUtil;
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
+import com.xxl.job.core.log.XxlJobLogger;
|
|
|
import com.zcxk.core.common.enums.StatusEnum;
|
|
|
import com.zcxk.core.common.util.SnowflakeIdWorker;
|
|
|
import com.zcxk.core.utils.DateUtil;
|
|
@@ -22,15 +24,13 @@ import org.springframework.data.mongodb.core.aggregation.*;
|
|
|
import org.springframework.data.mongodb.core.query.Criteria;
|
|
|
import org.springframework.data.mongodb.core.query.Query;
|
|
|
import org.springframework.data.mongodb.core.query.Update;
|
|
|
+import org.springframework.data.redis.core.RedisTemplate;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.time.LocalDateTime;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Date;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
+import java.util.*;
|
|
|
|
|
|
/**
|
|
|
* @author linqingwei
|
|
@@ -48,6 +48,8 @@ public class MeterReadRecordServiceImpl implements MeterReadRecordService {
|
|
|
private SnowflakeIdWorker idWorker;
|
|
|
@Resource
|
|
|
private MeterReadRecordMapper meterReadRecordMapper;
|
|
|
+ @Autowired
|
|
|
+ private RedisTemplate redisTemplate;
|
|
|
|
|
|
@Override
|
|
|
public void executeCreateMeterUnReadRecord(Map<String, Object> map, int index, int total) {
|
|
@@ -59,34 +61,92 @@ public class MeterReadRecordServiceImpl implements MeterReadRecordService {
|
|
|
int startIndex = index * pageSize;
|
|
|
|
|
|
List<WaterMeterDto> waterMeterList = deviceMapper.findWaterMeterListWithPage(startIndex, pageSize);
|
|
|
+
|
|
|
+ XxlJobLogger.log("waterMeterList size = {}",waterMeterList.size());
|
|
|
batchCreateMeterUnReadRecord(waterMeterList,readDay);
|
|
|
log.info("end executeCreateMeterUnReadRecord");
|
|
|
}
|
|
|
|
|
|
private void batchCreateMeterUnReadRecord(List<WaterMeterDto> waterMeterList, int readDay) {
|
|
|
if(waterMeterList.isEmpty())return;
|
|
|
+
|
|
|
+ updateReadingData(waterMeterList,readDay);
|
|
|
+
|
|
|
+ saveReadingData(readDay);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description 更新抄表数据
|
|
|
+ * @param waterMeterList
|
|
|
+ * @return
|
|
|
+ * @author linqingwei
|
|
|
+ **/
|
|
|
+ private void updateReadingData(List<WaterMeterDto> waterMeterList,int readDay) {
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ Map<String,WaterMeterDto> lastMap = redisTemplate.opsForHash().entries(Constants.PREFIX_DEVICE_CACHE_FLAG);
|
|
|
+
|
|
|
+ List<MeterReadRecord> meterReadRecordList = new ArrayList<>();
|
|
|
+
|
|
|
+ for (WaterMeterDto waterMeter : waterMeterList) {
|
|
|
+ WaterMeterDto last = lastMap.get(waterMeter.getId().toString());
|
|
|
+ if (last != null) {
|
|
|
+ //判断最后和最新信息不同则更新
|
|
|
+ if(CompareUtil.compare(waterMeter, last) == -1){
|
|
|
+ log.info("begin updateReadingData compare waterMeter = {} last = {} {}",JSON.toJSONString(waterMeter),JSON.toJSONString(last),readDay);
|
|
|
+ Query query = new Query();
|
|
|
+ query.addCriteria(Criteria.where("deviceId").is(waterMeter.getId()));
|
|
|
+ Update update = new Update();
|
|
|
+ if(waterMeter.getTenantId()!=null)update.set("tenantId",waterMeter.getTenantId());
|
|
|
+ if(waterMeter.getCategoryId()!=null)update.set("categoryId",waterMeter.getCategoryId());
|
|
|
+ if(waterMeter.getCompanyOrgId()!=null)update.set("companyOrgId",waterMeter.getCompanyOrgId());
|
|
|
+ if(waterMeter.getCompanyName()!=null)update.set("companyOrgName",waterMeter.getCompanyName());
|
|
|
+ if(waterMeter.getDeptOrgId()!=null)update.set("deptOrgId",waterMeter.getDeptOrgId());
|
|
|
+ if(waterMeter.getDeptName()!=null)update.set("deptOrgName",waterMeter.getDeptName());
|
|
|
+ if(waterMeter.getCommunityId()!=null)update.set("communityId",waterMeter.getCommunityId());
|
|
|
+ if(waterMeter.getCommunityName()!=null)update.set("communityName",waterMeter.getCommunityName());
|
|
|
+ if(waterMeter.getDeviceNo()!=null)update.set("deviceNo",waterMeter.getDeviceNo());
|
|
|
+ if(waterMeter.getAddress()!=null)update.set("location",waterMeter.getAddress());
|
|
|
+ if(waterMeter.getProductName()!=null)update.set("deviceModel",waterMeter.getManufacturerName()+"/"+waterMeter.getProductName()+"/"+waterMeter.getProductModel());
|
|
|
+ if(waterMeter.getMeterNo()!=null)update.set("meterNo",waterMeter.getMeterNo());
|
|
|
+ if(waterMeter.getFileNo()!=null)update.set("fileNo",waterMeter.getFileNo());
|
|
|
+ long updateResult = mongoTemplate.updateMulti(query,update, Constants.METER_READ_RECORD_TABLE).getModifiedCount();
|
|
|
+ }
|
|
|
+
|
|
|
+ }else {
|
|
|
+ meterReadRecordList.add(buildMeterReadRecord(waterMeter));
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ XxlJobLogger.log("meterReadRecordList size = {},lastMap size = {}",meterReadRecordList.size() , lastMap.size());
|
|
|
+ if(!meterReadRecordList.isEmpty()){
|
|
|
+ mongoTemplate.insert(meterReadRecordList,Constants.METER_READ_RECORD_TABLE);
|
|
|
+ }
|
|
|
+
|
|
|
+ //保存最新信息到缓存中
|
|
|
+ Map<String,WaterMeterDto> map = new HashMap<>();
|
|
|
for (WaterMeterDto waterMeter : waterMeterList) {
|
|
|
- saveReadingData(waterMeter,readDay);
|
|
|
+ map.put(waterMeter.getId().toString(),waterMeter);
|
|
|
}
|
|
|
+ redisTemplate.opsForHash().putAll(Constants.PREFIX_DEVICE_CACHE_FLAG,map);
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
|
|
|
- private void saveReadingData(WaterMeterDto waterMeter,int readDay) {
|
|
|
- log.info("begin saveReadingData ,waterMeter = {}" , JSON.toJSONString(waterMeter));
|
|
|
+ private void saveReadingData(int readDay) {
|
|
|
+ log.info("begin saveReadingData ,readDay = {}" , readDay);
|
|
|
MeterReadRecord.MeterReadInfo meterReadInfo = buildMeterReadInfo(readDay);
|
|
|
|
|
|
|
|
|
//推送数据
|
|
|
Query pushQuery = new Query();
|
|
|
- pushQuery.addCriteria(Criteria.where("deviceId").is(waterMeter.getId()));
|
|
|
+ //pushQuery.addCriteria(Criteria.where("deviceId").is(waterMeter.getId()));
|
|
|
Update push = new Update();
|
|
|
push.push("data",meterReadInfo);
|
|
|
long pushResult = mongoTemplate.updateMulti(pushQuery,push, Constants.METER_READ_RECORD_TABLE).getModifiedCount();
|
|
|
- if(pushResult == 0){
|
|
|
- //推送失败插入数据
|
|
|
- MeterReadRecord meterReadRecord = buildMeterReadRecord(waterMeter,meterReadInfo);
|
|
|
- mongoTemplate.insert(meterReadRecord,Constants.METER_READ_RECORD_TABLE);
|
|
|
- }
|
|
|
- log.info("end saveReadingData");
|
|
|
+ log.info("end saveReadingData pushResult = {}",pushResult);
|
|
|
}
|
|
|
|
|
|
private MeterReadRecord.MeterReadInfo buildMeterReadInfo(int readDay) {
|
|
@@ -103,10 +163,7 @@ public class MeterReadRecordServiceImpl implements MeterReadRecordService {
|
|
|
return readInfo;
|
|
|
}
|
|
|
|
|
|
- private MeterReadRecord buildMeterReadRecord(WaterMeterDto waterMeter,MeterReadRecord.MeterReadInfo meterReadInfo) {
|
|
|
-
|
|
|
- List<MeterReadRecord.MeterReadInfo> list = new ArrayList<>();
|
|
|
- list.add(meterReadInfo);
|
|
|
+ private MeterReadRecord buildMeterReadRecord(WaterMeterDto waterMeter) {
|
|
|
|
|
|
MeterReadRecord readRecord = new MeterReadRecord();
|
|
|
readRecord.setId(idWorker.nextId());
|
|
@@ -134,7 +191,7 @@ public class MeterReadRecordServiceImpl implements MeterReadRecordService {
|
|
|
readRecord.setCreateTime(new Date());
|
|
|
readRecord.setCreatorName(Constants.SYS_FLAG);
|
|
|
readRecord.setUpdateTime(new Date());
|
|
|
- readRecord.setData(list);
|
|
|
+
|
|
|
|
|
|
return readRecord;
|
|
|
}
|