package com.dy.rtuMw.server.rtuData.pSdV1; import com.dy.common.mw.protocol4Mqtt.MqttSubMsg; import com.dy.common.mw.protocol4Mqtt.pSdV1.upVos.ManureVo; import com.dy.common.springUtil.SpringContextUtil; import com.dy.pipIrrGlobal.pojoPr.PrStManure; import com.dy.rtuMw.server.ServerProperties; import com.dy.rtuMw.server.rtuData.TaskSurpport; import com.dy.rtuMw.server.rtuData.dbSv.DbSv; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.HashMap; import java.util.Map; /** * @Author: liurunyu * @Date: 2025/6/25 8:56 * @Description */ public class TkPreGenObjs4ManureSdV1 extends TaskSurpport { private static Logger log = LogManager.getLogger(TkPreGenObjs4ManureSdV1.class.getName()) ; //类ID,一定与Tree.xml配置文件中配置一致 public static final String taskId = "TkPreGenObjs4ManureSdV1" ; //处理上条数据的时刻 private static final Map dealDataAtDateTime = new HashMap<>(); private static final Map lastUpManureData = new HashMap<>(); /** * 执行节点任务 * @param data 需要处理的数据 */ @Override public void execute(Object data) { //前面的任务已经判断了data不为空 MqttSubMsg msg = (MqttSubMsg)data ; if(msg.vo4Up != null && msg.vo4Up instanceof ManureVo){ //水肥数据 ManureVo nowVo = (ManureVo)msg.vo4Up ; ManureVo lastVo = lastUpManureData.get(msg.deviceId + nowVo.no) ; Long now = System.currentTimeMillis() ; 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{ //未超过最小时间间隔, 最新数据要存储,以备客户端及时查看状态 this.deal(data, msg, nowVo, now, true); } } lastUpManureData.put(msg.deviceId + nowVo.no, nowVo); if(msg.commandId != null && !msg.commandId.equals("")){ this.toNextOneTask(data, TkFindComResponseSdV1.taskId); } } } 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对象"); } } }