| 
					
				 | 
			
			
				@@ -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; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 |