|  |  | 
 |  |  |  | 
 |  |  |     //处理上条数据的时刻 | 
 |  |  |     private static final Map<String, Long> dealDataAtDateTime = new HashMap<>(); | 
 |  |  |     private static final Map<String, ManureVo> lastUpManureData = new HashMap<>(); | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 执行节点任务 | 
 |  |  | 
 |  |  |         MqttSubMsg msg = (MqttSubMsg)data ; | 
 |  |  |         if(msg.vo4Up != null && msg.vo4Up instanceof ManureVo){ | 
 |  |  |             //水肥数据 | 
 |  |  |             ManureVo stVo = (ManureVo)msg.vo4Up ; | 
 |  |  |             Long lastAt = dealDataAtDateTime.get(msg.deviceId + stVo.no); | 
 |  |  |             ManureVo nowVo = (ManureVo)msg.vo4Up ; | 
 |  |  |             ManureVo lastVo = lastUpManureData.get(msg.deviceId + nowVo.no) ; | 
 |  |  |             Long now = System.currentTimeMillis() ; | 
 |  |  |             if(lastAt == null || ((now - lastAt) >= ServerProperties.mqttAcceptDataMinInterval)){ | 
 |  |  |                 dealDataAtDateTime.put(msg.deviceId + stVo.no, now); | 
 |  |  |                 DbSv sv = SpringContextUtil.getBean(DbSv.class) ; | 
 |  |  |                 if(sv != null){ | 
 |  |  |                     PrStManure stPo = sv.getStManureByFBoxIdAndNo(msg.deviceId, stVo.no) ; | 
 |  |  |                     if(stPo != null){ | 
 |  |  |                         this.taskResult = new Object[]{sv, stPo} ; | 
 |  |  |                         this.toNextTasks(data); | 
 |  |  |                     } | 
 |  |  |             if(lastVo != null && nowVo.stateIsChanged(lastVo)){ | 
 |  |  |                 //状态有变化,最新数据及历史数据都要存储 | 
 |  |  |                 this.deal(data, msg, nowVo, now, false); | 
 |  |  |             }else{ | 
 |  |  |                 //状态无变化 | 
 |  |  |                 Long lastAt = dealDataAtDateTime.get(msg.deviceId + nowVo.no); | 
 |  |  |                 if(lastAt == null || ((now - lastAt) >= ServerProperties.acceptManureDataMinInterval)){ | 
 |  |  |                     //超过最小时间间隔, 最新数据及历史数据都要存储 | 
 |  |  |                     this.deal(data, msg, nowVo, now, false); | 
 |  |  |                 }else{ | 
 |  |  |                     log.error("严重错误,未能得到DbSv对象"); | 
 |  |  |                     //未超过最小时间间隔, 最新数据要存储,以备客户端及时查看状态 | 
 |  |  |                     this.deal(data, msg, nowVo, now, true); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             lastUpManureData.put(msg.deviceId + nowVo.no, nowVo); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |     private void deal(Object data, MqttSubMsg msg, ManureVo stVo, Long now, boolean dealOnlyLast){ | 
 |  |  |         dealDataAtDateTime.put(msg.deviceId + stVo.no, now); | 
 |  |  |         DbSv sv = SpringContextUtil.getBean(DbSv.class) ; | 
 |  |  |         if(sv != null){ | 
 |  |  |             PrStManure stPo = sv.getStManureByFBoxIdAndNo(msg.deviceId, stVo.no) ; | 
 |  |  |             if(stPo != null){ | 
 |  |  |                 this.taskResult = new Object[]{sv, stPo} ; | 
 |  |  |                 if(dealOnlyLast){ | 
 |  |  |                     this.toNextOneTask(data, TkDealManureLastSdV1.taskId); | 
 |  |  |                 }else{ | 
 |  |  |                     this.toNextOneTask(data, TkDealManureSdV1.taskId); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         }else{ | 
 |  |  |             log.error("严重错误,未能得到DbSv对象"); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  | } |