package com.tmzn.devicelinkykc.taskQueue.runner; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.tmzn.devicelinkykc.constant.Constant; import com.tmzn.devicelinkykc.constant.DeviceOnlineStatus; import com.tmzn.devicelinkykc.constant.PortStatusConstant; import com.tmzn.devicelinkykc.constant.RedisConstant; import com.tmzn.devicelinkykc.constant.ykc.StatusConstant; import com.tmzn.devicelinkykc.entity.Device; import com.tmzn.devicelinkykc.entity.DeviceStatus; import com.tmzn.devicelinkykc.frameMsg.FrameDataSplicing; import com.tmzn.devicelinkykc.frameMsg.TransMoney; import com.tmzn.devicelinkykc.frameMsg.frameType.HeartFrameSend; import com.tmzn.devicelinkykc.frameMsg.frameType.LoginFrame; import com.tmzn.devicelinkykc.frameMsg.frameType.RealTimeStatusPushFrame; import com.tmzn.devicelinkykc.frameMsg.frameType.TransactionFlowPushFrame; import com.tmzn.devicelinkykc.redis.RedisCache; import com.tmzn.devicelinkykc.service.*; import com.tmzn.devicelinkykc.socket.DeviceConnectionMsg; import com.tmzn.devicelinkykc.socket.SocketHandle; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; @Component @Slf4j(topic = "MsgHeartRunner") public class MsgFreeRunner { @Autowired private DeviceService deviceService; @Autowired private LoginFrame loginFrame; @Autowired private RedisCache redisCache; @Autowired private RealTimeStatusPushFrame realTimeStatusPushFrame; private static final BigDecimal zero = new BigDecimal("0"); @Async("freeTaskAsyncPool") public void freeMsg(Map map) throws Exception { log.info("空闲上报>>"+map.size()); map.forEach(( devicePileCode,deviceConnectionMsg)->{ try{ DeviceStatus deviceStatusOne = redisCache.getCacheMapValue(RedisConstant.ONLINE_DEVICE_ONE, devicePileCode); if(deviceStatusOne!=null){ handleOne(deviceStatusOne,deviceConnectionMsg); } DeviceStatus deviceStatusTwo = redisCache.getCacheMapValue(RedisConstant.ONLINE_DEVICE_TWO, devicePileCode); if(deviceStatusTwo!=null){ handleOne(deviceStatusTwo,deviceConnectionMsg); } }catch (Exception e){ e.printStackTrace(); log.info("上报空闲异常{},{}",devicePileCode,e.getMessage()); } }); //任务处理 //redis取出在线设备集合 log.info("======Free status push task ending====="); } public void handleOne( DeviceStatus deviceStatus,DeviceConnectionMsg deviceConnectionMsg){ if(deviceStatus==null){ return; } try{ long ts = redisCache.getCacheMapValue(RedisConstant.PILE_GUN_PAY_TIME, deviceStatus.getPileCode()+"_"+deviceStatus.getGunPort()); if(ts!=0){ long ts1 = System.currentTimeMillis(); if((ts1-ts)<300*1000){ log.info("{}下单时间未超过5分钟不主动上报空闲状态",deviceStatus.getPileCode()+"_"+deviceStatus.getGunPort()); return; } } }catch (Exception e){ } //标记最后订单时间 5分钟内不上报空闲状态 避免刚下单状态还没更新就被freeTask任务给顶掉了 //存在设备在线状态的上送空闲状态 if (deviceConnectionMsg.getLoginStatus()== Constant.DEVICE_NOT_LOGIN_STATUS){ Long heartTime = deviceConnectionMsg.getHeartTime(); if (deviceStatus.getOnlineStatus() == DeviceOnlineStatus.ONLINE && (System.currentTimeMillis() - heartTime) > 50 * 1000L) { log.info("heartTaskAsyncPool-1>not longin and heart normal>>" + deviceStatus.getPileCode()); QueryWrapper deviceQueryWrapper = new QueryWrapper<>(); deviceQueryWrapper.eq("pile_code", deviceStatus.getPileCode()).eq("disabled", DeviceOnlineStatus.NORMAL); Device device = deviceService.getOne(deviceQueryWrapper); if(device!=null){ loginFrame.loginMsgSend(deviceConnectionMsg,device); } } return; } if (deviceStatus.getGunStatus() != StatusConstant.CHARGING) { if (deviceConnectionMsg.getLoginStatus() == 1) { if (deviceStatus.getGunStatus() == PortStatusConstant.EMERGENCY_STOP) { //急停中也是空闲状态上报 deviceStatus.setGunStatus(StatusConstant.FREE); } log.info("↑↑↑↑{}-{}空闲实时状态上报",deviceStatus.getPileCode(),deviceStatus.getGunPort()); realTimeStatusPushFrame.deviceStatusPush(deviceConnectionMsg, FrameDataSplicing. transactionNum(deviceStatus.getPileCode(), deviceConnectionMsg.getMessageCount()), deviceStatus.getPileCode(), deviceStatus.getGunPort(), deviceStatus.getGunStatus(), deviceStatus.getInsertGunStatus(), 0, 0, zero, zero, 0); } } } }