MsgFreeRunner.java 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package com.tmzn.devicelinkykc.taskQueue.runner;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.tmzn.devicelinkykc.constant.Constant;
  4. import com.tmzn.devicelinkykc.constant.DeviceOnlineStatus;
  5. import com.tmzn.devicelinkykc.constant.PortStatusConstant;
  6. import com.tmzn.devicelinkykc.constant.RedisConstant;
  7. import com.tmzn.devicelinkykc.constant.ykc.StatusConstant;
  8. import com.tmzn.devicelinkykc.entity.Device;
  9. import com.tmzn.devicelinkykc.entity.DeviceStatus;
  10. import com.tmzn.devicelinkykc.frameMsg.FrameDataSplicing;
  11. import com.tmzn.devicelinkykc.frameMsg.TransMoney;
  12. import com.tmzn.devicelinkykc.frameMsg.frameType.HeartFrameSend;
  13. import com.tmzn.devicelinkykc.frameMsg.frameType.LoginFrame;
  14. import com.tmzn.devicelinkykc.frameMsg.frameType.RealTimeStatusPushFrame;
  15. import com.tmzn.devicelinkykc.frameMsg.frameType.TransactionFlowPushFrame;
  16. import com.tmzn.devicelinkykc.redis.RedisCache;
  17. import com.tmzn.devicelinkykc.service.*;
  18. import com.tmzn.devicelinkykc.socket.DeviceConnectionMsg;
  19. import com.tmzn.devicelinkykc.socket.SocketHandle;
  20. import lombok.extern.slf4j.Slf4j;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.scheduling.annotation.Async;
  23. import org.springframework.stereotype.Component;
  24. import java.math.BigDecimal;
  25. import java.util.Map;
  26. import java.util.Set;
  27. import java.util.concurrent.TimeUnit;
  28. @Component
  29. @Slf4j(topic = "MsgHeartRunner")
  30. public class MsgFreeRunner {
  31. @Autowired
  32. private DeviceService deviceService;
  33. @Autowired
  34. private LoginFrame loginFrame;
  35. @Autowired
  36. private RedisCache redisCache;
  37. @Autowired
  38. private RealTimeStatusPushFrame realTimeStatusPushFrame;
  39. private static final BigDecimal zero = new BigDecimal("0");
  40. @Async("freeTaskAsyncPool")
  41. public void freeMsg(Map<String, DeviceConnectionMsg> map) throws Exception {
  42. log.info("空闲上报>>"+map.size());
  43. map.forEach(( devicePileCode,deviceConnectionMsg)->{
  44. try{
  45. DeviceStatus deviceStatusOne = redisCache.getCacheMapValue(RedisConstant.ONLINE_DEVICE_ONE, devicePileCode);
  46. if(deviceStatusOne!=null){
  47. handleOne(deviceStatusOne,deviceConnectionMsg);
  48. }
  49. DeviceStatus deviceStatusTwo = redisCache.getCacheMapValue(RedisConstant.ONLINE_DEVICE_TWO, devicePileCode);
  50. if(deviceStatusTwo!=null){
  51. handleOne(deviceStatusTwo,deviceConnectionMsg);
  52. }
  53. }catch (Exception e){
  54. e.printStackTrace();
  55. log.info("上报空闲异常{},{}",devicePileCode,e.getMessage());
  56. }
  57. });
  58. //任务处理
  59. //redis取出在线设备集合
  60. log.info("======Free status push task ending=====");
  61. }
  62. public void handleOne( DeviceStatus deviceStatus,DeviceConnectionMsg deviceConnectionMsg){
  63. if(deviceStatus==null){
  64. return;
  65. }
  66. try{
  67. long ts = redisCache.getCacheMapValue(RedisConstant.PILE_GUN_PAY_TIME, deviceStatus.getPileCode()+"_"+deviceStatus.getGunPort());
  68. if(ts!=0){
  69. long ts1 = System.currentTimeMillis();
  70. if((ts1-ts)<300*1000){
  71. log.info("{}下单时间未超过5分钟不主动上报空闲状态",deviceStatus.getPileCode()+"_"+deviceStatus.getGunPort());
  72. return;
  73. }
  74. }
  75. }catch (Exception e){
  76. }
  77. //标记最后订单时间 5分钟内不上报空闲状态 避免刚下单状态还没更新就被freeTask任务给顶掉了
  78. //存在设备在线状态的上送空闲状态
  79. if (deviceConnectionMsg.getLoginStatus()== Constant.DEVICE_NOT_LOGIN_STATUS){
  80. Long heartTime = deviceConnectionMsg.getHeartTime();
  81. if (deviceStatus.getOnlineStatus() == DeviceOnlineStatus.ONLINE && (System.currentTimeMillis() - heartTime) > 50 * 1000L) {
  82. log.info("heartTaskAsyncPool-1>not longin and heart normal>>" + deviceStatus.getPileCode());
  83. QueryWrapper<Device> deviceQueryWrapper = new QueryWrapper<>();
  84. deviceQueryWrapper.eq("pile_code", deviceStatus.getPileCode()).eq("disabled", DeviceOnlineStatus.NORMAL);
  85. Device device = deviceService.getOne(deviceQueryWrapper);
  86. if(device!=null){
  87. loginFrame.loginMsgSend(deviceConnectionMsg,device);
  88. }
  89. }
  90. return;
  91. }
  92. if (deviceStatus.getGunStatus() != StatusConstant.CHARGING) {
  93. if (deviceConnectionMsg.getLoginStatus() == 1) {
  94. if (deviceStatus.getGunStatus() == PortStatusConstant.EMERGENCY_STOP) {
  95. //急停中也是空闲状态上报
  96. deviceStatus.setGunStatus(StatusConstant.FREE);
  97. }
  98. log.info("↑↑↑↑{}-{}空闲实时状态上报",deviceStatus.getPileCode(),deviceStatus.getGunPort());
  99. realTimeStatusPushFrame.deviceStatusPush(deviceConnectionMsg, FrameDataSplicing.
  100. transactionNum(deviceStatus.getPileCode(), deviceConnectionMsg.getMessageCount()), deviceStatus.getPileCode(), deviceStatus.getGunPort(), deviceStatus.getGunStatus(), deviceStatus.getInsertGunStatus(), 0, 0, zero, zero, 0);
  101. }
  102. }
  103. }
  104. }