Преглед изворни кода

[功能修复]调整停充

liuf пре 1 година
родитељ
комит
671045f3ad

+ 4 - 12
src/main/java/com/tmzn/devicelinkykc/constant/RedisConstant.java

@@ -10,37 +10,29 @@ public class RedisConstant {
     //根据枪号缓存的设备状态表信息,状态变位时更新
     public static final String ONLINE_DEVICE_ONE= "onlineDevicePortOneYKC";
     public static final String ONLINE_DEVICE_TWO= "onlineDevicePortTwoYKC";
+
     public static final String POWER_ZERO_TIMES = "powerZeroTimes";
 
     //最新设备103消息
     public static final String DEVICE_PORT_STATUS= "devicePortStatusYKC";
 
-    //通讯帧的密钥
-    public static final String KEYS= "keysYKC";
 
+    //消息通讯秘钥
     public static final String YKC_KEY_MAP = "ykc_key_map";
 
     //全部设备的imei
     public static final String DEVICE_INFO="deviceInfoYKC";
     public static final String DEVICE_IMEI_PILE_MAP="device_imei_pile_map";
 
-    //充电中设备的实时计费信息
-    public static final String DEVICE_CHARNGING_INFO="deviceCharngingInfo";
 
     //登录验证时,防止设备循环发送登录
     public static final String DEVICE_LOGIN_YKC="deviceLoginYKC";
 
-    //开始充电时设备是离线状态时,需要缓存当前设备是不是等待插枪充电
-    public static final String START_CHARNGING_YKC="startCharngingYKC";
-
     //云快充启充但是没插枪
-    public static final String NO_INSERT_GUN_YKC="noInsertGunYKC";
-
     public static final String PILE_GUN_PAY_TIME = "pileGunPayTime";
 
-    /**
-     *订单未校验识别
-     */
+    public static final String WAITING_INSERT_GUN = "waitingInsertGun";
+
 
 
 

+ 1 - 0
src/main/java/com/tmzn/devicelinkykc/entity/DeviceStatus.java

@@ -42,4 +42,5 @@ public class DeviceStatus implements Serializable {
     private long createTime;
     private long updateTime;
     private int flage;
+    private int portStatus;
 }

+ 1 - 1
src/main/java/com/tmzn/devicelinkykc/frameMsg/TransMoney.java

@@ -70,7 +70,7 @@ public class TransMoney {
 
         Map<String,BigDecimal>   transData = getTransData();
         try {
-            TimeUnit.MILLISECONDS.sleep(3000);
+            TimeUnit.MILLISECONDS.sleep(1000);
         } catch (Exception e) {
             e.printStackTrace();
         }

+ 72 - 52
src/main/java/com/tmzn/devicelinkykc/frameMsg/frameType/TransactionFlowPushFrame.java

@@ -14,6 +14,7 @@ import com.tmzn.devicelinkykc.service.BillingModelService;
 import com.tmzn.devicelinkykc.service.OrderStatusService;
 import com.tmzn.devicelinkykc.service.TransOrderService;
 import com.tmzn.devicelinkykc.socket.DeviceConnectionMsg;
+import com.tmzn.devicelinkykc.socket.SocketHandle;
 import com.tmzn.devicelinkykc.util.CP56Time2a;
 import com.tmzn.devicelinkykc.util.Encrytion;
 import lombok.extern.slf4j.Slf4j;
@@ -53,6 +54,8 @@ public class TransactionFlowPushFrame {
     @Autowired
     private TransOrderService transOrderService;
 
+//    @Autowired
+//    private SocketHandle socketHandle;
 
     public byte[] makeTransParams(DeviceConnectionMsg deviceConnectionMsg,byte[] transOrder, String pileCode, byte gunPort, long createTime, long endTime, BillingModel billingModel, byte[] card, Map<String, BigDecimal> map,int reason){
 
@@ -103,6 +106,13 @@ public class TransactionFlowPushFrame {
                 //只有发送了才将校验订单写到redis里
             } catch (IOException e) {
                 log.info("pileCode:" + pileCode + " ,订单上报异常 push frame Exception"+e.getMessage());
+//                socketHandle.removeDeviceConnection(deviceConnectionMsg.getDeviceId());
+                try{
+                    deviceConnectionMsg.resetLogin();
+                    log.info("pileCode:" + pileCode + "重新登录");
+                }catch (Exception e1){
+                    log.info("pileCode:" + pileCode + " ,重新登录异常"+e.getMessage());
+                }
                 e.printStackTrace();
                 return null;
             }
@@ -136,6 +146,7 @@ public class TransactionFlowPushFrame {
             return encrypt;
             //只有发送了才将校验订单写到redis里
         } catch (IOException e) {
+
             log.info("pileCode:" + pileCode + " ,订单上报异常 push frame Exception"+e.getMessage());
             e.printStackTrace();
             return null;
@@ -146,33 +157,36 @@ public class TransactionFlowPushFrame {
         //订单创建时间0和预留原因不存库
         if (createTime > 0||reason!=TransConstant.START_FAIL) {
             try {
-                //TODO:测试存订单
                 byte[] transOrders = new byte[8];
                 System.arraycopy(transOrder, 8, transOrders, 0, transOrders.length);
                 QueryWrapper<TransOrder> transOrderQueryWrapper = new QueryWrapper<>();
                 transOrderQueryWrapper.eq("trans", DataConversion.bytesToHexString(transOrders)).eq("pile_code", pileCode);
                 TransOrder transOrderServiceOne = transOrderService.getOne(transOrderQueryWrapper);
-                transOrderServiceOne.setStartTime(new Date(createTime));
-                transOrderServiceOne.setEndTime(new Date(endTime));
-                transOrderServiceOne.setSharpElec(map.get("elec1"));
-                transOrderServiceOne.setSharpMoney(map.get("money1"));
-                transOrderServiceOne.setPeakElec(map.get("elec2"));
-                transOrderServiceOne.setPeakMoney(map.get("money2"));
-                transOrderServiceOne.setFlatElec(map.get("elec3"));
-                transOrderServiceOne.setFlatMoney(map.get("money3"));
-                transOrderServiceOne.setValleyElec(map.get("elec4"));
-                transOrderServiceOne.setValleyMoney(map.get("money4"));
-                transOrderServiceOne.setDeepValleyElec(map.get("elec5"));
-                transOrderServiceOne.setDeepValleyMoney(map.get("money5"));
-                transOrderServiceOne.setElec(map.get("elec"));
-                transOrderServiceOne.setMoney(map.get("money"));
-                transOrderServiceOne.setReasonStopCharging(reason);
-                transOrderService.updateById(transOrderServiceOne);
-                //TODO:测试存订单
+                if(transOrderServiceOne!=null){
+                    transOrderServiceOne.setStartTime(new Date(createTime));
+                    transOrderServiceOne.setEndTime(new Date(endTime));
+                    transOrderServiceOne.setSharpElec(map.get("elec1"));
+                    transOrderServiceOne.setSharpMoney(map.get("money1"));
+                    transOrderServiceOne.setPeakElec(map.get("elec2"));
+                    transOrderServiceOne.setPeakMoney(map.get("money2"));
+                    transOrderServiceOne.setFlatElec(map.get("elec3"));
+                    transOrderServiceOne.setFlatMoney(map.get("money3"));
+                    transOrderServiceOne.setValleyElec(map.get("elec4"));
+                    transOrderServiceOne.setValleyMoney(map.get("money4"));
+                    transOrderServiceOne.setDeepValleyElec(map.get("elec5"));
+                    transOrderServiceOne.setDeepValleyMoney(map.get("money5"));
+                    transOrderServiceOne.setElec(map.get("elec"));
+                    transOrderServiceOne.setMoney(map.get("money"));
+                    transOrderServiceOne.setReasonStopCharging(reason);
+                    transOrderService.updateById(transOrderServiceOne);
+                    log.info("更新订单结束{}",pileCode);
+                }else{
+                    log.info("无订单不更新{}",pileCode);
+                }
+
             }catch(Exception e){
                 e.printStackTrace();
             }
-            redisCache.deleteObject(RedisConstant.DEVICE_CHARNGING_INFO + pileCode + gunPort);
         }
         int index = 0;
         byte[] msg = new byte[174];
@@ -418,25 +432,29 @@ public class TransactionFlowPushFrame {
                 QueryWrapper<TransOrder> transOrderQueryWrapper = new QueryWrapper<>();
                 transOrderQueryWrapper.eq("trans", DataConversion.bytesToHexString(transOrders)).eq("pile_code", pileCode);
                 TransOrder transOrderServiceOne = transOrderService.getOne(transOrderQueryWrapper);
-                transOrderServiceOne.setStartTime(new Date(createTime));
-                transOrderServiceOne.setEndTime(new Date(endTime));
-                transOrderServiceOne.setSharpElec(map.get("elec1"));
-                transOrderServiceOne.setSharpMoney(map.get("money1"));
-                transOrderServiceOne.setPeakElec(map.get("elec2"));
-                transOrderServiceOne.setPeakMoney(map.get("money2"));
-                transOrderServiceOne.setFlatElec(map.get("elec3"));
-                transOrderServiceOne.setFlatMoney(map.get("money3"));
-                transOrderServiceOne.setValleyElec(map.get("elec4"));
-                transOrderServiceOne.setValleyMoney(map.get("money4"));
-                transOrderServiceOne.setElec(map.get("elec"));
-                transOrderServiceOne.setMoney(map.get("money"));
-                transOrderServiceOne.setReasonStopCharging(reason);
-                transOrderService.updateById(transOrderServiceOne);
-                //TODO:测试存订单
+                if(transOrderServiceOne!=null){
+                    transOrderServiceOne.setStartTime(new Date(createTime));
+                    transOrderServiceOne.setEndTime(new Date(endTime));
+                    transOrderServiceOne.setSharpElec(map.get("elec1"));
+                    transOrderServiceOne.setSharpMoney(map.get("money1"));
+                    transOrderServiceOne.setPeakElec(map.get("elec2"));
+                    transOrderServiceOne.setPeakMoney(map.get("money2"));
+                    transOrderServiceOne.setFlatElec(map.get("elec3"));
+                    transOrderServiceOne.setFlatMoney(map.get("money3"));
+                    transOrderServiceOne.setValleyElec(map.get("elec4"));
+                    transOrderServiceOne.setValleyMoney(map.get("money4"));
+                    transOrderServiceOne.setElec(map.get("elec"));
+                    transOrderServiceOne.setMoney(map.get("money"));
+                    transOrderServiceOne.setReasonStopCharging(reason);
+                    transOrderService.updateById(transOrderServiceOne);
+                    log.info("更新订单结束{}",pileCode);
+                }else{
+                    log.info("无订单不更新{}",pileCode);
+                }
+
             }catch(Exception e){
                 e.printStackTrace();
             }
-            redisCache.deleteObject(RedisConstant.DEVICE_CHARNGING_INFO + pileCode + gunPort);
         }
         int index = 0;
         byte[] msg = new byte[158];
@@ -647,31 +665,33 @@ public class TransactionFlowPushFrame {
         //订单创建时间0和预留原因不存库
         if (createTime > 0||reason!=TransConstant.START_FAIL) {
         try {
-                //TODO:测试存订单
                 byte[] transOrders = new byte[8];
                 System.arraycopy(transOrder, 8, transOrders, 0, transOrders.length);
                 QueryWrapper<TransOrder> transOrderQueryWrapper = new QueryWrapper<>();
                 transOrderQueryWrapper.eq("trans", DataConversion.bytesToHexString(transOrders)).eq("pile_code", pileCode);
                 TransOrder transOrderServiceOne = transOrderService.getOne(transOrderQueryWrapper);
-                transOrderServiceOne.setStartTime(new Date(createTime));
-                transOrderServiceOne.setEndTime(new Date(endTime));
-                transOrderServiceOne.setSharpElec(map.get("elec1"));
-                transOrderServiceOne.setSharpMoney(map.get("money1"));
-                transOrderServiceOne.setPeakElec(map.get("elec2"));
-                transOrderServiceOne.setPeakMoney(map.get("money2"));
-                transOrderServiceOne.setFlatElec(map.get("elec3"));
-                transOrderServiceOne.setFlatMoney(map.get("money3"));
-                transOrderServiceOne.setValleyElec(map.get("elec4"));
-                transOrderServiceOne.setValleyMoney(map.get("money4"));
-                transOrderServiceOne.setElec(map.get("elec"));
-                transOrderServiceOne.setMoney(map.get("money"));
-                transOrderServiceOne.setReasonStopCharging(reason);
-                transOrderService.updateById(transOrderServiceOne);
-                //TODO:测试存订单
+                if(transOrderServiceOne!=null){
+                    transOrderServiceOne.setStartTime(new Date(createTime));
+                    transOrderServiceOne.setEndTime(new Date(endTime));
+                    transOrderServiceOne.setSharpElec(map.get("elec1"));
+                    transOrderServiceOne.setSharpMoney(map.get("money1"));
+                    transOrderServiceOne.setPeakElec(map.get("elec2"));
+                    transOrderServiceOne.setPeakMoney(map.get("money2"));
+                    transOrderServiceOne.setFlatElec(map.get("elec3"));
+                    transOrderServiceOne.setFlatMoney(map.get("money3"));
+                    transOrderServiceOne.setValleyElec(map.get("elec4"));
+                    transOrderServiceOne.setValleyMoney(map.get("money4"));
+                    transOrderServiceOne.setElec(map.get("elec"));
+                    transOrderServiceOne.setMoney(map.get("money"));
+                    transOrderServiceOne.setReasonStopCharging(reason);
+                    transOrderService.updateById(transOrderServiceOne);
+                    log.info("更新订单结束{}",pileCode);
+                }else{
+                    log.info("订单不存在不更新{}",pileCode);
+                }
             }catch(Exception e){
                 e.printStackTrace();
             }
-            redisCache.deleteObject(RedisConstant.DEVICE_CHARNGING_INFO + pileCode + gunPort);
         }
         int index = 0;
         byte[] msg = new byte[201];

+ 28 - 111
src/main/java/com/tmzn/devicelinkykc/message/DeviceMsgHandle.java

@@ -630,6 +630,7 @@ public class DeviceMsgHandle {
         }
 
         if (portStatus.equals(PortStatusConstant.CHARGING_END)) {
+            //7状态的时候 充满停止以后 认为未插枪 不允许充电 因为启动不了,必须要重新拔枪
             deviceOnline(portStatus, imei, port, (byte) StatusConstant.FREE, StatusConstant.INSERT_GUNS_NO);
             return;
         }
@@ -640,121 +641,12 @@ public class DeviceMsgHandle {
         }
     }
 
-    /**
-     * 端口状态是7时的特殊处理充满;端口状态是1时特殊处理直接拔枪
-     *
-     * @param imei
-     * @param port
-     * @param gunsStatus
-     * @param insertGunStatus
-     * @param type            指令类型
-     */
-    private boolean handleStatus7(String imei, int port, byte gunsStatus, byte insertGunStatus, int type) throws Exception {
-        logger.info("处理7状态>>>>>>");
-        QueryWrapper<BillingModel> billingModelQueryWrapper = new QueryWrapper<>();
-        billingModelQueryWrapper.eq("device_imei", imei);
-        BillingModel model = billingModelService.getOne(billingModelQueryWrapper);
-
-        if (model == null) {
-            logger.info("无计费模型>>>>>>");
-            //说明设备不是云快充设备或者还没登录,获取一次103?
-            DeviceParam deviceParam = new DeviceParam();
-            deviceParam.setDeviceId(imei);
-            deviceParam.setCcid(imei);
-            deviceControlerService.sendPortDetailCmd(deviceParam);
-            return false;
-        }
-
-        //只有指令116时进入处理
-        //20240620:所有7状态当充满,116不处理
-        if (type == NormalChargeConstant.PORT_STATUS) {
-            return true;
-        }
-        if (gunsStatus == PortStatusConstant.CHARGING_END) {
-            //特殊处理端口状态是7充电已完成(充满),TODO:但是116的端口状态拔枪和充满都是7;103上报是7的话会一只走状态7的处理>就是一只查库看订单状态
-            QueryWrapper<OrderStatus> orderStatusQueryWrapper = new QueryWrapper<>();
-            orderStatusQueryWrapper.eq("device_imei", imei).eq("guns_code", port).orderByDesc("create_time").last("limit 1");
-            OrderStatus one = orderStatusService.getOne(orderStatusQueryWrapper);
-
-
-            //7状态小于30秒内且订单原因不是远程停充
-            if ((System.currentTimeMillis() - one.getCreateTime()) < 60 * 1000
-                    && one.getReasonStopCharging() != TransConstant.APP_REMOTE_STOP) {
-                logger.info("启动状态还没变化--->当前7状态不处理");
-
-//                //发送一条103消息
-//                try{
-//                    DeviceParam dataParam = new DeviceParam();
-//                    dataParam.setDeviceId(imei);
-//                    dataParam.setCcid(imei);
-//                    deviceControlerService.sendPortDetailCmd(dataParam);
-//                    logger.info(imei+ ":7状态主动下发103消息");
-//                }catch (Exception e){
-//                    logger.info(imei+ ":7状态主动下发103消息异常"+e.getMessage());
-//                }
-
-                return true;
-            }
-
-            //7状态:充电完成未拔枪会一直上报,只有当订单完成并回复解析订单成功,7状态当空闲状态上报
-            if (one.getTransactionOrderReportingActionStatus() == StatusConstant.TRANSACTION_ORDER_REPORTING_ACTION_STATUS_OK
-                    && one.getTransactionOrderReplyStatus() == StatusConstant.TRANSACTION_ORDER_REPLY_STATUS_SUCC) {
-                return false;
-            }
-
 
-            //如果当前设备的最新订单状态已经是'已经充满'的原因并且订单现在的情况是'充电结束'说明不需要再处理,已经处理过了,
-            if (one.getReasonStopCharging() == TransConstant.SOC_FULL_OF_STOP || one.getNowOrderStatus() == StatusConstant.NOW_ORDER_STATUS_CHARGING_ENDING) {
-                return false;
-            }
-            //订单充电中,103端口状态2变7:认为充满.//充满情况,因为可能没拔枪113结束充电通知还没上来;手动发停充;在113中处理交易记录上送
-//            DeviceParam deviceParam = new DeviceParam();
-//            deviceParam.setDeviceId(imei);
-//            deviceParam.setCcid(imei);
-//            deviceControlerService.sendPortDetailCmd(deviceParam);
-            deviceControlerService.stopCharge(imei, imei, port);
-            DeviceConnectionMsg deviceConnection = socketHandle.getDeviceConnection(model.getPileCode());
-
-            QueryWrapper<DeviceStatus> deviceStatusQueryWrapper = new QueryWrapper<>();
-            deviceStatusQueryWrapper.eq("device_imei", imei).eq("gun_port", port);
-            DeviceStatus statusServiceOne = deviceStatusService.getOne(deviceStatusQueryWrapper);
-            one.setEndTime(System.currentTimeMillis());
-
-            //后台计费
-            //Map<String, BigDecimal> start = transMoney.compute(port, model, one.getCreateTime(), one.getEndTime(),true);
-            //byte[] encrypt = transactionFlowPushFrame.sendTrans(deviceConnection, one.getTransOrder(), one.getPileCode(), (byte) port, one.getCreateTime(), one.getEndTime(), model, one.getCard(), start, TransConstant.SOC_FULL_OF_STOP);
-            //one.setOriginalText(encrypt);
-            if (one.getReasonStopCharging() == 0) {
-                one.setReasonStopCharging(TransConstant.SOC_FULL_OF_STOP);//充满
-            }
-            one.setNowOrderStatus(StatusConstant.NOW_ORDER_STATUS_CHARGING_ENDING);//已结束
-            one.setStopChargingReply(StatusConstant.STOP_CHARGING_REPLY_NO);//记录为停充回复
-            one.setTransactionOrderReportingActionStatus(StatusConstant.TRANSACTION_ORDER_REPORTING_ACTION_STATUS_NO);//未送交易
-            orderStatusService.updateById(one);
-
-        } else if (gunsStatus == PortStatusConstant.FREE) {
-            //特俗处理:校验是不是最新订单是充电中原因没有等等,也就是订单未结束时直接状态成了未插枪状态
-            QueryWrapper<OrderStatus> orderStatusQueryWrapper = new QueryWrapper<>();
-            orderStatusQueryWrapper.eq("device_imei", imei).eq("guns_code", port).orderByDesc("create_time").last("limit 1");
-            OrderStatus one = orderStatusService.getOne(orderStatusQueryWrapper);
-            if (one == null) {
-                return false;
-            }
-            if (one.getReasonStopCharging() == 0 && one.getNowOrderStatus() == StatusConstant.NOW_ORDER_STATUS_CHARGING) {
-                //校验通过,说明是直接拔枪了,拔枪设备会主动上报113结束充电通知
-                one.setEndTime(System.currentTimeMillis());
-                //手动停充
-                one.setReasonStopCharging(TransConstant.MANUAL_STOP);
-                one.setNowOrderStatus(StatusConstant.NOW_ORDER_STATUS_CHARGING_ENDING);
-                one.setStopChargingReply(StatusConstant.STOP_CHARGING_REPLY_OK);//已停充
-                orderStatusService.updateById(one);
-            }
-        }
-        return false;
+    //重启一个订单 因为重启
+    private void restartOrderByWaiting(){
 
     }
 
-
     /**
      * 1.这里接收到消息就是设备在线;2.对状态进行处理,不同类型消息的枪状态不同进行落库;3.并且状态变化的一个变位上送
      *
@@ -769,6 +661,29 @@ public class DeviceMsgHandle {
         DeviceStatus statusServiceOne = deviceStatusService.getOne(deviceStatusQueryWrapper);
         DeviceStatus statusServiceOneTemp = new DeviceStatus();
 
+
+        if(statusServiceOne!=null && gunsStatus == StatusConstant.INSERT_GUNS_YES){
+            String waitingKey = RedisConstant.WAITING_INSERT_GUN+"_"+statusServiceOneTemp.getPileCode()+statusServiceOneTemp.getGunPort();
+            if (redisCache.hasKey(waitingKey)) {
+                //未插枪启充的操作会保存订单,但是订单号不是因为断网中停充造成的订单结束原因是0,所以redis有当前设备的订单值,就不是结束充电
+               int  waitingId = redisCache.getCacheObject(waitingKey);
+               //启动充电
+                QueryWrapper<OrderStatus> orderStatusQueryWrapper = new QueryWrapper<>();
+                orderStatusQueryWrapper.eq("device_imei", imei).eq("guns_code", port).orderByDesc("create_time").last("limit 1");
+                OrderStatus waitingOrder = orderStatusService.getOne(orderStatusQueryWrapper);
+                if(waitingOrder!= null && waitingOrder.getId()==waitingId && waitingOrder.getNowOrderStatus()==StatusConstant.NOW_ORDER_STATUS_CHARGING){
+                    logger.info("订单{}已就绪启动充电{}-{}",waitingOrder.getId(),waitingOrder.getPileCode(),waitingOrder.getGunsCode());
+                    deviceControlerService.startCharge(waitingOrder.getDeviceImei(), waitingOrder.getDeviceImei(), (int) waitingOrder.getGunsCode(),0);
+                    redisCache.deleteObject(waitingKey);
+                    return;
+                }
+
+            }
+        }
+
+
+
+
         //创建设备端口号
         if (statusServiceOne != null) {
             BeanUtils.copyProperties(statusServiceOne, statusServiceOneTemp);
@@ -790,9 +705,11 @@ public class DeviceMsgHandle {
             statusServiceOne.setUpdateTime(System.currentTimeMillis());
             statusServiceOne.setOnlineStatus(DeviceOnlineStatus.ONLINE);
             statusServiceOne.setUpdateTime(System.currentTimeMillis());
+            statusServiceOne.setPortStatus(portStatus);
             deviceStatusService.saveOrUpdate(statusServiceOne);
         }
 
+        statusServiceOne.setPortStatus(portStatus);
         statusServiceOne.setGunStatus(gunsStatus);
         statusServiceOne.setInsertGunStatus(insertGunStatus);
         statusServiceOne.setOnlineStatus(DeviceOnlineStatus.ONLINE);

+ 64 - 75
src/main/java/com/tmzn/devicelinkykc/message/YkcMsgHandle.java

@@ -182,23 +182,25 @@ public class YkcMsgHandle {
                     QueryWrapper<OrderStatus> orderStatusQueryWrapper = new QueryWrapper<>();
                     orderStatusQueryWrapper.eq("trans_order", trans);
                     OrderStatus one = orderStatusService.getOne(orderStatusQueryWrapper);
+                    if(one!=null){
+                        QueryWrapper<TransOrder> transOrderQueryWrapper = new QueryWrapper<>();
+                        transOrderQueryWrapper.eq("trans_order", trans);
+                        TransOrder transOrderServiceOne = transOrderService.getOne(transOrderQueryWrapper);
+                        if (reason[0] == 0x00) {
+                            one.setTransactionOrderReplyStatus(StatusConstant.TRANSACTION_ORDER_REPLY_STATUS_SUCC);
+
+                            transOrderServiceOne.setFlage(StatusConstant.TRANSACTION_ORDER_REPLY_STATUS_SUCC);
+                        } else if (reason[0] == 0x01) {
+                            one.setTransactionOrderReplyStatus(StatusConstant.TRANSACTION_ORDER_REPLY_STATUS_FAIL);
+                        } else if (reason[0] == 0x02) {
+                            one.setTransactionOrderReplyStatus(StatusConstant.TRANSACTION_ORDER_REPLY_STATUS_ILLEGAL);
+                        }
+                        //接收到后将订单校验从redis剔除
+                        orderStatusService.updateById(one);
+                        transOrderService.updateById(transOrderServiceOne);
+                    }
 
-                    QueryWrapper<TransOrder> transOrderQueryWrapper = new QueryWrapper<>();
-                    transOrderQueryWrapper.eq("trans_order", trans);
-                    TransOrder transOrderServiceOne = transOrderService.getOne(transOrderQueryWrapper);
-
-                    if (reason[0] == 0x00) {
-                        one.setTransactionOrderReplyStatus(StatusConstant.TRANSACTION_ORDER_REPLY_STATUS_SUCC);
 
-                        transOrderServiceOne.setFlage(StatusConstant.TRANSACTION_ORDER_REPLY_STATUS_SUCC);
-                    } else if (reason[0] == 0x01) {
-                        one.setTransactionOrderReplyStatus(StatusConstant.TRANSACTION_ORDER_REPLY_STATUS_FAIL);
-                    } else if (reason[0] == 0x02) {
-                        one.setTransactionOrderReplyStatus(StatusConstant.TRANSACTION_ORDER_REPLY_STATUS_ILLEGAL);
-                    }
-                    //接收到后将订单校验从redis剔除
-                    orderStatusService.updateById(one);
-                    transOrderService.updateById(transOrderServiceOne);
                 } else if (framType == YkcSendDevice.DEVICE_STATUS_REQUEST.getFrameType()) {
                     logger.info("↓↓↓↓↓{}读取实时监测数据",deviceConnectionMsg.getDeviceId());
 
@@ -290,11 +292,6 @@ public class YkcMsgHandle {
             //1.解析出启动充电流水号
             //查询设备sn和imie
 
-            QueryWrapper<DeviceStatus> deviceStatusQueryWrapper = new QueryWrapper<>();
-            deviceStatusQueryWrapper.eq("pile_code", deviceConnectionMsg.getDeviceId());
-            List<DeviceStatus> list = deviceStatusService.list(deviceStatusQueryWrapper);
-            //可能双枪
-            DeviceStatus deviceStatus = list.get(0);
             //切出订单号,保存在连接的该设备中
             byte[] transOrder = Arrays.copyOfRange(respone_msg, 0, 16);
             //测试
@@ -306,59 +303,54 @@ public class YkcMsgHandle {
             boolean temp = false;
             int result = 0x00;    //失败
             int reason = 0x00;   //无
-            if (guns[0] == 1) {
-                DeviceStatus oneDeviceStatus = redisCache.getCacheMapValue(RedisConstant.ONLINE_DEVICE_ONE, deviceConnectionMsg.getDeviceId());
-                logger.info(oneDeviceStatus.toString());
-                if (oneDeviceStatus.getOnlineStatus() == StatusConstant.OFFLINE || StatusConstant.OFFLINE == oneDeviceStatus.getGunStatus()) {
-                    //离线上报
-                    reason = 0x04;
-                    temp = true;
-                } else if (StatusConstant.CHARGING == oneDeviceStatus.getGunStatus()) {
-                    //枪已在充电中
-                    reason = 0x02;
-                    temp = true;
-                } else if (StatusConstant.FAULT == oneDeviceStatus.getGunStatus()) {
-                    //枪故障
-                    reason = 0x03;
-                    temp = true;
-                } else if (StatusConstant.INSERT_GUNS_NO == oneDeviceStatus.getInsertGunStatus()) {
-                    //未插枪
-                    reason = 0x05;
-                    temp = false;
-                } else if (PortStatusConstant.EMERGENCY_STOP == oneDeviceStatus.getGunStatus()) {
-                    //急停没复位,也是启充失败
-                    temp = true;
-                }
-            } else if (guns[0] == 2) {
-                DeviceStatus twoDeviceStatus = redisCache.getCacheMapValue(RedisConstant.ONLINE_DEVICE_TWO, deviceConnectionMsg.getDeviceId());
-                if (twoDeviceStatus.getOnlineStatus() == StatusConstant.OFFLINE || StatusConstant.OFFLINE == twoDeviceStatus.getGunStatus()) {
+            String cacheKey;
+
+            int portId = guns[0];
+            QueryWrapper<DeviceStatus> deviceStatusQueryWrapper = new QueryWrapper<>();
+            deviceStatusQueryWrapper.eq("pile_code", deviceConnectionMsg.getDeviceId());
+            deviceStatusQueryWrapper.eq("gun_port", portId);
+            DeviceStatus deviceStatus = deviceStatusService.getOne(deviceStatusQueryWrapper);
+
+            if(deviceStatus==null){
+                //不存在
+                reason = 0x04;
+                temp = true;
+            }else {
+
+                if (deviceStatus.getOnlineStatus()==StatusConstant.OFFLINE||StatusConstant.OFFLINE==deviceStatus.getGunStatus()){
                     //离线上报
-                    reason = 0x04;
-                    temp = true;
-                } else if (StatusConstant.CHARGING == twoDeviceStatus.getGunStatus()) {
+                    reason=0x04;
+                    temp=true;
+                    logger.info("reson>"+reason);
+                }else if (StatusConstant.CHARGING==deviceStatus.getGunStatus()){
                     //枪已在充电中
-                    reason = 0x02;
-                    temp = true;
-                } else if (StatusConstant.FAULT == twoDeviceStatus.getGunStatus()) {
+                    reason=0x02;
+                    temp=true;
+                    logger.info("reson>"+reason);
+                }else if (StatusConstant.FAULT==deviceStatus.getGunStatus()){
                     //枪故障
-                    reason = 0x03;
-                    temp = true;
-                } else if (StatusConstant.INSERT_GUNS_NO == twoDeviceStatus.getInsertGunStatus()) {
+                    reason=0x03;
+                    temp=true;
+                    logger.info("reson>"+reason);
+                }else if (StatusConstant.INSERT_GUNS_NO==deviceStatus.getInsertGunStatus()){
                     //未插枪
-                    reason = 0x05;
-                    temp = true;
-                } else if (PortStatusConstant.EMERGENCY_STOP == twoDeviceStatus.getGunStatus()) {
+                    reason=0x05;
+                    temp=false;
+                    logger.info("reson>"+reason);
+                }else if (PortStatusConstant.EMERGENCY_STOP==deviceStatus.getGunStatus()){
                     //急停没复位,也是启充失败
-                    temp = true;
+                    temp=true;
                 }
             }
+
             if (temp) {
                 logger.info("启动失败{}:reason:{}" ,deviceConnectionMsg.getDeviceId(), reason);
                 charngingPushFrame.startStatus(deviceConnectionMsg, transOrder, guns[0], result, reason);
                 Map<String, BigDecimal> compute = transMoney.getTransData();
-                transactionFlowPushFrame.sendTrans(deviceConnectionMsg, transOrder, deviceStatus.getPileCode(), guns[0], System.currentTimeMillis(), System.currentTimeMillis(), new BillingModel(), card, compute, TransConstant.START_FAIL);
+                transactionFlowPushFrame.sendTrans(deviceConnectionMsg, transOrder, deviceConnectionMsg.getDeviceId(), guns[0], System.currentTimeMillis(), System.currentTimeMillis(), new BillingModel(), card, compute, TransConstant.START_FAIL);
                 return;
             }
+
             BigDecimal bigDecimalmoney = DataConversion.arrToBigDec(startMoney, 2, 2).setScale(2, BigDecimal.ROUND_UP);
             logger.info("{}开始充电,startMoney" + bigDecimalmoney + "sbyt+" + DataConversion.bytesToHexString(startMoney),deviceConnectionMsg.getDeviceId());
             OrderStatus orderStatus = new OrderStatus();
@@ -372,26 +364,23 @@ public class YkcMsgHandle {
             orderStatus.setCreateTime(System.currentTimeMillis());
             //2.保存交易流水号并记录本次交易流水状态
             orderStatusService.save(orderStatus);
-            this.saveOrder(orderStatus);
-            //setMoney(orderStatus);//让设备记余额不足情况,启充时要传启充金额money,传0就是启充默认值
-            //3.向设备发送启机指令
-            if (reason == 0x05) {
+            saveTransOrder(orderStatus);
+
+            String gunCode = String.valueOf(guns[0]);
+
+            if (reason==0x05){
                 //未插枪不启充设备,但是返回未插枪
-                logger.info("{}未插枪等待充电订单:" + DataConversion.bytesToHexString(transOrder),deviceConnectionMsg.getDeviceId());
-                charngingPushFrame.startStatus(deviceConnectionMsg, transOrder, guns[0], result, reason);
-                redisCache.setCacheObject(RedisConstant.NO_INSERT_GUN_YKC + deviceStatus.getPileCode(), DataConversion.bytesToHexString(transOrder), 60 * 1000, TimeUnit.MILLISECONDS);
-            } else {
-                deviceControlerService.startCharge(deviceStatus.getDeviceImei(), deviceStatus.getDeviceImei(), (int) guns[0], 0);
+                logger.info("未插枪等待插枪充电订单{}-{}",orderStatus.getPileCode(),orderStatus.getGunsCode());
+                charngingPushFrame.startStatus(deviceConnectionMsg,transOrder,guns[0],result,reason );
+                redisCache.setCacheObject(RedisConstant.WAITING_INSERT_GUN+"_"+orderStatus.getPileCode()+orderStatus.getGunsCode(),orderStatus.getId(),55*1000, TimeUnit.MILLISECONDS);
+            }else {
+                logger.info("已就绪启动充电{}-{}",orderStatus.getPileCode(),orderStatus.getGunsCode());
+                deviceControlerService.startCharge(deviceStatus.getDeviceImei(), orderStatus.getDeviceImei(), (int) guns[0],0);
             }
 
-            String gunCode = String.valueOf(guns[0]);
             //标记最后订单时间 5分钟内不上报空闲状态 避免刚下单状态还没更新就被freeTask任务给顶掉了
             redisCache.setCacheMapValue(RedisConstant.PILE_GUN_PAY_TIME, orderStatus.getPileCode() + "_" + gunCode, System.currentTimeMillis());
 
-
-            //TODO:在处理设备消息的地方需要处理设备启动充电是否成功
-            //TODO:保存交易流水时保存一个交易订单
-
         } catch (Exception e) {
             logger.info("{}启动充电异常,{}",deviceConnectionMsg.getDeviceId(),e.getMessage());
             realTimeStatusPushFrame.deviceStatusPush(deviceConnectionMsg, t, deviceConnectionMsg.getDeviceId(), (byte) 1, (byte) 2, (byte) 1, 0, 0, zero, zero, 0);
@@ -501,7 +490,7 @@ public class YkcMsgHandle {
     }
 
     //保存订单开始状态,记录充电的交易流水
-    private void saveOrder(OrderStatus orderStatus) {
+    private void saveTransOrder(OrderStatus orderStatus) {
         TransOrder transOrder = transMapping.orderStatusToTransOrder(orderStatus);
         byte[] transOrders = new byte[8];
         System.arraycopy(orderStatus.getTransOrder(), 8, transOrders, 0, transOrders.length);

+ 6 - 0
src/main/java/com/tmzn/devicelinkykc/socket/DeviceConnectionMsg.java

@@ -45,6 +45,12 @@ public class DeviceConnectionMsg {
         }
     }
 
+    public void resetLogin() throws IOException {
+        this.loginStatus = 0;
+        this.socket.close();
+    }
+
+
     public Socket getSocket() {
         return socket;
     }

+ 13 - 12
src/main/java/com/tmzn/devicelinkykc/taskQueue/runner/MsgCharngingRunner.java

@@ -150,14 +150,14 @@ public class MsgCharngingRunner {
 
     //尝试下发103 避免下发太频繁
     public void try103(OrderStatus orderStatus){
-        String key = "try103:_"+orderStatus.getDeviceImei();
+        String key = "try103:_"+orderStatus.getDeviceImei()+"_"+orderStatus.getGunsCode();
         if(redisCache.hasKey(key)){
             log.info("{}-{}忽略下发103", orderStatus.getPileCode(), orderStatus.getGunsCode());
             return;
         }
-        log.info("{}-{}2分钟内无状态下发一次103", orderStatus.getPileCode(), orderStatus.getGunsCode());
+        log.info("{}-{}-5分钟内无状态下发一次103", orderStatus.getPileCode(), orderStatus.getGunsCode());
         deviceControlerService.sendImeiDetail(orderStatus.getDeviceImei());
-        redisCache.setCacheObject(key, System.currentTimeMillis(),120, TimeUnit.SECONDS);
+        redisCache.setCacheObject(key, System.currentTimeMillis(),300, TimeUnit.SECONDS);
     }
 
     //停止一个订单
@@ -171,19 +171,20 @@ public class MsgCharngingRunner {
     }
 
     public void reportOne(OrderStatus orderStatus, BillingModel billingModel, DeviceConnectionMsg deviceConnectionMsg) {
+
+        try103(orderStatus);
+
         //获取订单状态
         String cacheKey = orderStatus.getGunsCode() == 1 ? RedisConstant.ONLINE_DEVICE_ONE : RedisConstant.ONLINE_DEVICE_TWO;
         DeviceStatus deviceStatus = redisCache.getCacheMapValue(cacheKey, orderStatus.getPileCode());
-
+        //每次下发一次103
         long t = System.currentTimeMillis()-orderStatus.getCreateTime();
         int port = (int) orderStatus.getGunsCode();
         if(deviceStatus==null){
-            if(t<15*60*1000){
-                try103(orderStatus);
+            if(t<10*60*1000){
                 return;
             }else{
-                log.info("{}-{}无15分钟还没有记录要停止充电", orderStatus.getPileCode(), orderStatus.getGunsCode());
-                //状态那我为
+                log.info("{}-{}无10分钟还没有记录要停止充电", orderStatus.getPileCode(), orderStatus.getGunsCode());
                 orderStatus.setReasonStopCharging(TransConstant.OTHER_STOP);
                 stopOneOrder(orderStatus);
             }
@@ -193,10 +194,10 @@ public class MsgCharngingRunner {
 
         if(deviceStatus.getGunStatus() != StatusConstant.CHARGING){
             if(t<5*60*1000){
-                log.info("{}-{}5分钟内还未变充电状态忽略", orderStatus.getPileCode(), orderStatus.getGunsCode());
+                log.info("{}-{}-5分钟内还未变充电状态忽略", orderStatus.getPileCode(), orderStatus.getGunsCode());
                 return;
             }else{
-                log.info("{}-{}5分钟后还不是充电状态录要停止充电", orderStatus.getPileCode(), orderStatus.getGunsCode());
+                log.info("{}-{}-5分钟后还不是充电状态录要停止充电", orderStatus.getPileCode(), orderStatus.getGunsCode());
                 //状态那我为
                 orderStatus.setReasonStopCharging(TransConstant.OTHER_STOP);
                 stopOneOrder(orderStatus);
@@ -230,7 +231,7 @@ public class MsgCharngingRunner {
 
         String transCacheKey = "ChargingTrans:"+orderStatus.getId();
         if(redisCache.hasKey(transCacheKey)){
-            start = redisCache.getCacheObject(cacheKey);
+            start = redisCache.getCacheObject(transCacheKey);
         }else{
             //缓存120秒避免重复计算电量
             try {
@@ -240,7 +241,7 @@ public class MsgCharngingRunner {
                 log.error("计算订单异常{},{}",orderStatus.getPileCode(),e.getMessage());
                 return;
             }
-            redisCache.setCacheObject(cacheKey, start, 120, TimeUnit.SECONDS);
+            redisCache.setCacheObject(transCacheKey, start, 120, TimeUnit.SECONDS);
         }
 
         BigDecimal elec = start.get("elec");

+ 1 - 0
src/main/java/com/tmzn/devicelinkykc/taskQueue/runner/MsgHeartRunner.java

@@ -71,6 +71,7 @@ public class MsgHeartRunner {
         //2:设备第一次上线时未触发过登录,设备连接集合中初始话的心跳时间还是0,符合该判断,进行登录
         DeviceStatus oneDs = redisCache.getCacheMapValue(portStatusCacheKey, devicePileCode);
 
+
         if (deviceConnectionMsg.getLoginStatus()== Constant.DEVICE_NOT_LOGIN_STATUS) {
             if (oneDs != null && oneDs.getOnlineStatus() == DeviceOnlineStatus.ONLINE && (System.currentTimeMillis() - heartTime) > 50 * 1000L) {
                 QueryWrapper<Device> deviceQueryWrapper = new QueryWrapper<>();

+ 1 - 1
src/main/resources/application-dev.yml

@@ -17,7 +17,7 @@ spring:
 redisMsgChanel: redisMsgChanel
 
 #后台计费
-billingInterface: http://wetiandi.com/app/index.php?i=1&j=1&c=auth&a=calculate_cost&do=compute_elec_all
+billingInterface: http://wetiandi.com/app/index.php?i=1&j=1&c=auth&a=calculate_cost_new&do=compute_elec_all
 
 #本地
 msgService: http://127.0.0.1:8051

+ 1 - 1
src/main/resources/application-test.yml

@@ -18,7 +18,7 @@ redisMsgChanel: redisMsgChanel
 #本地
 msgService: http://127.0.0.1:8051
 #后台计费地址
-billingInterface: http://wetiandi.com/app/index.php?i=1&j=1&c=auth&a=calculate_cost&do=compute_elec_all
+billingInterface: http://wetiandi.com/app/index.php?i=1&j=1&c=auth&a=calculate_cost_new&do=compute_elec_all
 #集测IP
 #ip: 114.55.7.88