Эх сурвалжийг харах

Merge branch 'hotfix/V1.1.1'

zheng 1 жил өмнө
parent
commit
879971da56

+ 20 - 0
sgs-middleware-v3/src/main/java/com/tokheim/sgs/v3/common/utils/DateTimeUtils.java

@@ -8,7 +8,10 @@ package com.tokheim.sgs.v3.common.utils;
  * To change this template use File | Settings | File Templates.
  */
 
+import lombok.extern.slf4j.Slf4j;
+
 import java.text.DateFormat;
+import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;
@@ -18,6 +21,7 @@ import java.util.Date;
  *
  * @author wuxw
  */
+@Slf4j
 public class DateTimeUtils {
     /**
      * 日期格式 **
@@ -108,6 +112,22 @@ public class DateTimeUtils {
         return sDate;
     }
 
+    /**
+     * 将字符串日期转为 Date ,yyyyMMdd HH:mm:ss
+     * @param date
+     * @return
+     */
+    public static Date parse(String date) {
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
+        Date result = null;
+        try {
+            result = simpleDateFormat.parse(date);
+        } catch (Exception e) {
+            log.error(date + " 转换失败",e);
+        }
+        return result;
+    }
+
     /**
      * 获取当前月份
      *

+ 14 - 0
sgs-middleware-v3/src/main/java/com/tokheim/sgs/v3/socket/convert/FuelMsgCardNoHandler.java

@@ -23,6 +23,12 @@ public class FuelMsgCardNoHandler {
     public static Map<String, String> respMap = new HashMap<>();
 
     private static TwoKeyMap<String,String,String> perOrderTime = new TwoKeyMap<>(); //记录上一笔订单的时间,用于过滤重复发送的订单信息
+    /**油机会偶发以下现象
+     * 实时加油信息携带了正确的卡号,而订单信息会先发一条错误卡号的信息,后续的重发信息中又带上了正确的卡号
+     * 所以记录一下实时加油信息的卡号,在收到订单信息时做对比,如与实时加油信息的卡号一致,则发到第三方;
+     * 若不一致,便不发,等重发的订单信息
+     */
+    private static TwoKeyMap<String,String,String> cacheCardNums = new TwoKeyMap<>();//记录卡号信息
 
     public static void setPerOrderTime(String ip,String fuelPoint,String time) {
         perOrderTime.set(ip, fuelPoint, time);
@@ -32,6 +38,14 @@ public class FuelMsgCardNoHandler {
         return perOrderTime.get(ip, fuelPoint);
     }
 
+    public static void setCacheCardNums(String ip,String fuelPoint,String cardNum) {
+        cacheCardNums.set(ip, fuelPoint, cardNum);
+    }
+
+    public static String getCacheCardNums(String ip,String fuelPoint){
+        return cacheCardNums.get(ip, fuelPoint);
+    }
+
     public static Map<String, String> getFuelMsg(String msg, String oilHeaderPackageCard) {
         try {
             //msg = msg.substring(msg.indexOf(oilHeaderPackage));

+ 68 - 47
sgs-middleware-v3/src/main/java/com/tokheim/sgs/v3/socket/handler/CloudInfoHandler.java

@@ -21,11 +21,11 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.lang.reflect.Field;
 import java.math.BigDecimal;
+import java.text.DateFormat;
 import java.util.*;
 import java.util.concurrent.Executors;
 
-import static com.tokheim.sgs.v3.socket.ServerHandler.ENV;
-import static com.tokheim.sgs.v3.socket.ServerHandler.prevPump;
+import static com.tokheim.sgs.v3.socket.ServerHandler.*;
 
 /**
  * @author xgm
@@ -98,6 +98,8 @@ public class CloudInfoHandler {
 //                String pump = ServerHandler.pumpMap.get(stationIp, gunNo_);
                 String pump = ServerHandler.pumpMap.get(stationIp, gunNo_,activeNozzle.get(gunNo_));
 
+                //记录卡号,用于收到订单信息时判断
+                FuelMsgCardNoHandler.setCacheCardNums(stationIp,gunNo_,realTimeMsg.get(DataConfig.RealTimeConfig.cardNo));
                 if (pump == null) {
                     orderNo = SeqKit.genPayOrderId();
                     ServerHandler.orderNoMap.set(stationIp, gunNo_, orderNo);
@@ -180,9 +182,26 @@ public class CloudInfoHandler {
                     String stationIp = getStationIp(msg, oilHeaderPackageCard);
                     String gunNo_ = String.valueOf(ByteUtils.hexToDecimal(fuelMsg.get(DataConfig.OrderConfig.gunNo)) - ByteUtils.hexToDecimal("20"));
 
+                    //出现过订单数据中卡号信息错误而实时数据卡号正确,因此对比实时数据中的卡号信息
+                    String cardNum = FuelMsgCardNoHandler.getCacheCardNums(stationIp, gunNo_);
+                    if (cardNum != null && !cardNum.isEmpty() && !fuelMsg.get(DataConfig.OrderConfig.cardNo).equals(cardNum)) {
+                        //null: 初始化;empty:实时记录没有卡号;实时记录的卡号 == 当前订单数据的卡号
+                        log.info("订单数据错误,实时数据卡号" + cardNum + "订单数据:" + fuelMsg);
+                        return;
+                    }
+
+                    //记录订单时间是否大于上一笔订单的时间,不是则为旧单或同一单,不上传
                     String orderTime = fuelMsg.get(DataConfig.OrderConfig.date) + " " + fuelMsg.get(DataConfig.OrderConfig.time);
                     String perOrderTime = FuelMsgCardNoHandler.getPerOrderTime(stationIp, gunNo_);
-                    if (orderTime.equals(perOrderTime)) return; //表示同一单
+                    Date orderTimeDate = DateTimeUtils.parse(orderTime);
+                    Date perOrderTimeDate = DateTimeUtils.parse(perOrderTime);
+                    if (orderTimeDate != null && perOrderTimeDate != null) {
+                        int intervalSeconds = DateTimeUtils.getIntervalSeconds(perOrderTimeDate,orderTimeDate);
+                        if (intervalSeconds <= 0) return; //表示同一单或者是旧单
+                    } else {
+                        if (orderTime.equals(perOrderTime)) return; //表示同一单
+                    }
+
                     //记录订单时间
                     FuelMsgCardNoHandler.setPerOrderTime(stationIp,gunNo_,orderTime);
 
@@ -230,58 +249,60 @@ public class CloudInfoHandler {
                        if (!(addValBigDecimalValue == Double.valueOf(fuelMsg.get(DataConfig.OrderConfig.pump)))){
                            log.info("油机ip地址--【" + stationIp + "】--漏单时间--addValBigDecimalValue--"+addValBigDecimalValue+"--" + DateTimeUtils.getFormatCurrentTime() + "--当前泵码【" + fuelMsg.get(DataConfig.OrderConfig.pump) + "】--上一个泵码【" + prevPump + "】--差值【" + v + "】--" + msg);
                        }
-                        log.info("加油记录包头(含卡号)--当前泵码【" + fuelMsg.get(DataConfig.OrderConfig.pump) + "】--上一个泵码【" + prevPump + "】--差值【" + v + "】--" + msg);
-                        //System.err.println("油机ip地址--【" + stationIp + "】--云平台数据(交易数据-含卡号):" + jsonString);
-                        log.info("油机ip地址--【" + stationIp + "】--云平台数据(交易数据-含卡号):" + jsonString);
-                        JSONObject jsonObject = JSONObject.parseObject(jsonString);
-                        //记录上传泵码
-                        ServerHandler.prevPump = fuelMsg.get(DataConfig.OrderConfig.pump);
+
+                    }
+
+                    log.info("加油记录包头(含卡号)--当前泵码【" + fuelMsg.get(DataConfig.OrderConfig.pump) + "】--上一个泵码【" + prevPump + "】" + msg);
+                    //System.err.println("油机ip地址--【" + stationIp + "】--云平台数据(交易数据-含卡号):" + jsonString);
+                    log.info("油机ip地址--【" + stationIp + "】--云平台数据(交易数据-含卡号):" + jsonString);
+                    JSONObject jsonObject = JSONObject.parseObject(jsonString);
+                    //记录上传泵码
+                    ServerHandler.prevPump = fuelMsg.get(DataConfig.OrderConfig.pump);
 //                        ServerHandler.pumpMap.set(stationIp, gunNo_, ServerHandler.prevPump);
-                        ServerHandler.pumpMap.set(stationIp, gunNo_, activeNozzle.get(gunNo_),ServerHandler.prevPump);
-                        //log.info("上一个泵码--" + prevPump + ",当前泵码---" + fuelMsg.get(DataConfig.OrderConfig.pump));
+                    ServerHandler.pumpMap.set(stationIp, gunNo_, activeNozzle.get(gunNo_),ServerHandler.prevPump);
+                    //log.info("上一个泵码--" + prevPump + ",当前泵码---" + fuelMsg.get(DataConfig.OrderConfig.pump));
 
 
-                        String orderNo2 = SeqKit.genPayOrderId();
-                        ServerHandler.orderNoMap.set(stationIp, gunNo_, orderNo2);
-                        //nextOrderNoMap.set(stationIp, gunNo_, orderNo2);
-                        OrderMapper orderMapper = SpringUtils.getBean("orderMapper");
+                    String orderNo2 = SeqKit.genPayOrderId();
+                    ServerHandler.orderNoMap.set(stationIp, gunNo_, orderNo2);
+                    //nextOrderNoMap.set(stationIp, gunNo_, orderNo2);
+                    OrderMapper orderMapper = SpringUtils.getBean("orderMapper");
                         /*if (ServerHandler.ENV.equals("test")){
                             target.put("id", SeqKit.genPayOrderId()); //开发环境生成订单号,生成环境在实时数据中生成
                         }*/
-                        String json = JSONObject.toJSONString(target, SerializerFeature.WriteNullStringAsEmpty);
-                        Order order = JSONObject.parseObject(json, Order.class);
-                        log.info("保存订单"+json);
-                        orderMapper.insertSelective(order);
-
-                        if (ServerHandler.ENV.equals("prod")) { //dev  prod test  http://47.107.51.26:8086/oilmachine/postOilData
-                            try {
-                                //OrderMapper orderMapper = SpringUtils.getBean("orderMapper");
-                                ////target.put("id",SeqKit.genPayOrderId());
-                                ////String json = JSONObject.toJSONString(target, SerializerFeature.WriteNullStringAsEmpty);
-                                //Order order = JSONObject.parseObject(jsonString, Order.class);
-                                //orderMapper.insertSelective(order);
-
-                                ThreadUtil.execAsync(new Runnable() { //异步执行
-                                    @Override
-                                    public void run() {
-                                        //System.out.println("异步请求---" + Thread.currentThread().getName());
-                                        String resp = HttpUtils.sendPost3(data.getUrl(), jsonObject); //url
-                                        if (resp != null) {
-                                            //System.err.println("响应数据:" + resp);
-                                            log.info("响应数据:" + resp);
-                                            orderMapper.deleteByPrimaryKey(order);
-                                        }
+                    String json = JSONObject.toJSONString(target, SerializerFeature.WriteNullStringAsEmpty);
+                    Order order = JSONObject.parseObject(json, Order.class);
+                    log.info("保存订单"+json);
+                    orderMapper.insertSelective(order);
+
+                    if (ServerHandler.ENV.equals("prod")) { //dev  prod test  http://47.107.51.26:8086/oilmachine/postOilData
+                        try {
+                            //OrderMapper orderMapper = SpringUtils.getBean("orderMapper");
+                            ////target.put("id",SeqKit.genPayOrderId());
+                            ////String json = JSONObject.toJSONString(target, SerializerFeature.WriteNullStringAsEmpty);
+                            //Order order = JSONObject.parseObject(jsonString, Order.class);
+                            //orderMapper.insertSelective(order);
+
+                            ThreadUtil.execAsync(new Runnable() { //异步执行
+                                @Override
+                                public void run() {
+                                    //System.out.println("异步请求---" + Thread.currentThread().getName());
+                                    String resp = HttpUtils.sendPost3(data.getUrl(), jsonObject); //url
+                                    if (resp != null) {
+                                        //System.err.println("响应数据:" + resp);
+                                        log.info("响应数据:" + resp);
+                                        orderMapper.deleteByPrimaryKey(order);
                                     }
-                                });
-                            } catch (Exception e) {
+                                }
+                            });
+                        } catch (Exception e) {
 //                                ServerHandler.pumpMap.set(stationIp, gunNo_, ServerHandler.prevPump);
-                                ServerHandler.pumpMap.set(stationIp, gunNo_,activeNozzle.get(gunNo_), ServerHandler.prevPump);
-                                //String orderNo = ID.get().next().toString();
-                                String orderNo = SeqKit.genPayOrderId();
-                                ServerHandler.orderNoMap.set(stationIp, gunNo_, orderNo);
-                                e.printStackTrace();
-                                log.error("threadPoolExecutor(order)--发送订单json数据【" + jsonString + "】--" + e);
-                            }
+                            ServerHandler.pumpMap.set(stationIp, gunNo_,activeNozzle.get(gunNo_), ServerHandler.prevPump);
+                            //String orderNo = ID.get().next().toString();
+                            String orderNo = SeqKit.genPayOrderId();
+                            ServerHandler.orderNoMap.set(stationIp, gunNo_, orderNo);
+                            e.printStackTrace();
+                            log.error("threadPoolExecutor(order)--发送订单json数据【" + jsonString + "】--" + e);
                         }
                     }
                 }

+ 1 - 1
sgs-middleware-v3/src/main/resources/application-dev.yml

@@ -1,6 +1,6 @@
 # server
 server:
-  port: 9000
+  port: 9001
   tomcat:
     uri-encoding: utf-8
     #配置内置tomcat的访问日志

+ 2 - 2
sgs-middleware-v3/src/main/resources/application-prod.yml

@@ -37,7 +37,7 @@ spring:
       max-request-size: 100Mb
   datasource:
     username: root
-    password: 123456 # 192.168.12.130  192.168.4.18   东莞:10.199.82.212
+    password: TKhs@123 # 192.168.12.130  192.168.4.18   东莞:10.199.82.212
     url: jdbc:mariadb://localhost:3306/sgs-master?characterEncoding=utf-8
     driverClassName: org.mariadb.jdbc.Driver # com.mysql.jdbc.Driver
     type: com.alibaba.druid.pool.DruidDataSource # 连接池指定
@@ -159,7 +159,7 @@ socketInfo:
   realUrl: http://47.107.51.26:8086/oilmachine/realOilData  # 实时加油数据
   filePath: /app/configure_dev.json # C:/token/info__manager_system/configure_dev.json
   urlBackup: http://47.107.51.26:8086/oilmachine/postOilData
-  lanSegments: 192 # 10 172 192
+  lanSegments: 10 # 10 172 192
   inPort: 20002
   socketPath: /etc/network/interfaces  #C:\token\info__manager_system\file\interfaces  /etc/network/interfaces /home/linaro/Desktop
   restartScript: /home/linaro/Desktop/restart.sh

+ 2 - 0
sgs-middleware-v3/src/main/resources/application.yml

@@ -30,6 +30,8 @@ logging:
 
 login.check: 0
 
+version: 1.1.1
+