Browse Source

feat(广西ai自助):完成与油机协议开发

Zhenghanjv 9 months ago
parent
commit
e99d6ceff1

+ 18 - 7
ai-fueling/src/main/java/com/tokheim/aifueling/communication/BaseAnalyzer.java

@@ -1,22 +1,16 @@
 package com.tokheim.aifueling.communication;
 
 import cn.hutool.core.convert.Convert;
-import com.google.gson.Gson;
+import com.tokheim.aifueling.communication.entitys.DecimalAnalysisAid;
 import com.tokheim.aifueling.communication.entitys.BaseInfo;
 import com.tokheim.aifueling.communication.entitys.NozzleDTO;
-import com.tokheim.aifueling.communication.toInternalInterface.InterfaceApi;
 import com.tokheim.aifueling.communication.toInternalInterface.InterfaceUtils;
-import com.tokheim.aifueling.communication.toInternalInterface.entity.FuelResponse;
-import com.tokheim.aifueling.communication.toMachine.MachineWriter;
-import com.tokheim.aifueling.domain.Nozzle;
 import com.tokheim.aifueling.repository.NozzleRepository;
 import com.tokheim.aifueling.utils.BeanUtils;
 import com.tokheim.aifueling.utils.ByteArrayUtils;
 import lombok.extern.slf4j.Slf4j;
 
-import java.io.IOException;
 import java.util.List;
-import java.util.Optional;
 
 @Slf4j
 public abstract class BaseAnalyzer {
@@ -33,6 +27,23 @@ public abstract class BaseAnalyzer {
         InterfaceUtils.sendDataToInternal(dataType,allInfo);
     }
 
+    /**
+     * 解析小数
+     * @param currentIndex 当前下标
+     * @param data         数据
+     * @return 解析后的小数及下标应该移动到哪个位置
+     */
+    protected DecimalAnalysisAid getDecimal(int currentIndex, byte[] data){
+        DecimalAnalysisAid decimalAnalysisAid = new DecimalAnalysisAid();
+        int decimalLen = data[currentIndex+1]; //获取数据长度
+        int decimalIntLen = data[currentIndex+2] / 2; //获取整数部分长度
+        String decimalIntPart = Convert.toHex(ByteArrayUtils.slipt(data,currentIndex+3,currentIndex+3+decimalIntLen)); //获取整数部分
+        String decimalDecimalsPart = Convert.toHex(ByteArrayUtils.slipt(data,currentIndex+3+decimalIntLen,currentIndex+2+decimalLen));//获取小数部分
+        String decimal = decimalIntPart + "." + decimalDecimalsPart; //拼接金额
+        decimalAnalysisAid.setNextIndex(currentIndex + 2 + decimalLen);
+        decimalAnalysisAid.setDecimal(decimal);
+        return decimalAnalysisAid;
+    }
     /**
      * 获取基础信息
      * @param ip 油机 ip

+ 30 - 0
ai-fueling/src/main/java/com/tokheim/aifueling/communication/analyzer/CarNumAnalyzer.java

@@ -0,0 +1,30 @@
+package com.tokheim.aifueling.communication.analyzer;
+
+import cn.hutool.core.convert.Convert;
+import com.tokheim.aifueling.communication.BaseAnalyzer;
+import com.tokheim.aifueling.communication.entitys.BaseInfo;
+import com.tokheim.aifueling.communication.entitys.CarNum;
+
+/**
+ * 发送车牌号回复相关解析类
+ */
+public class CarNumAnalyzer extends BaseAnalyzer {
+    @Override
+    protected BaseInfo getOtherInfo(BaseInfo baseInfo, byte[] data) {
+        CarNum carNum = new CarNum(baseInfo);
+        int index = 0;
+        while (index < data.length) {
+            switch (data[index]) {
+                case 0x30:
+                    Integer matchResult = Convert.toInt(data[index + 1]);
+                    index += 2;
+                    carNum.setMatchResult(matchResult);
+                    break;
+                default:
+                    index++;
+                    break;
+            }
+        }
+        return carNum;
+    }
+}

+ 7 - 14
ai-fueling/src/main/java/com/tokheim/aifueling/communication/analyzer/CardStatusAnalyzer.java

@@ -4,6 +4,7 @@ import cn.hutool.core.convert.Convert;
 import com.tokheim.aifueling.communication.BaseAnalyzer;
 import com.tokheim.aifueling.communication.entitys.BaseInfo;
 import com.tokheim.aifueling.communication.entitys.CardStatus;
+import com.tokheim.aifueling.communication.entitys.DecimalAnalysisAid;
 import com.tokheim.aifueling.utils.ByteArrayUtils;
 
 /**
@@ -17,22 +18,14 @@ public class CardStatusAnalyzer extends BaseAnalyzer {
         while (index < data.length) {
             switch (data[index]) {
                 case 0x25:
-                    int balanceLen = data[index+1]; //获取数据长度
-                    int balanceIntLen = data[index+2] / 2; //获取整数部分长度
-                    String balanceIntPart = Convert.toHex(ByteArrayUtils.slipt(data,index+3,index+3+ balanceIntLen)); //获取整数部分
-                    String balanceDecimalsPart = Convert.toHex(ByteArrayUtils.slipt(data,index+3+ balanceIntLen,index+2+ balanceLen));//获取小数部分
-                    String balance = balanceIntPart + "." + balanceDecimalsPart; //拼接金额
-                    index = index + 2 + balanceLen;
-                    cardStatus.setBalance(balance);
+                    DecimalAnalysisAid balance = getDecimal(index, data);
+                    index = balance.getNextIndex();
+                    cardStatus.setBalance(balance.getDecimal());
                     break;
                 case 0x26:
-                    int maxAmountLen = data[index+1]; //获取数据长度
-                    int maxAmountIntLen = data[index+2] / 2; //获取整数部分长度
-                    String maxAmountIntPart = Convert.toHex(ByteArrayUtils.slipt(data,index+3,index+3+maxAmountIntLen)); //获取整数部分
-                    String maxAmountDecimalsPart = Convert.toHex(ByteArrayUtils.slipt(data,index+3+maxAmountIntLen,index+2+maxAmountLen));//获取小数部分
-                    String maxAmount = maxAmountIntPart + "." + maxAmountDecimalsPart; //拼接金额
-                    index = index + 2 + maxAmountLen;
-                    cardStatus.setMaxRefuelingAmount(maxAmount);
+                    DecimalAnalysisAid maxAmount = getDecimal(index, data);
+                    index = maxAmount.getNextIndex();
+                    cardStatus.setMaxRefuelingAmount(maxAmount.getDecimal());
                     break;
                 default:
                     index++;

+ 47 - 0
ai-fueling/src/main/java/com/tokheim/aifueling/communication/analyzer/NozzleStatusAnalyzer.java

@@ -0,0 +1,47 @@
+package com.tokheim.aifueling.communication.analyzer;
+
+import cn.hutool.core.convert.Convert;
+import com.tokheim.aifueling.communication.BaseAnalyzer;
+import com.tokheim.aifueling.communication.entitys.DecimalAnalysisAid;
+import com.tokheim.aifueling.communication.entitys.BaseInfo;
+import com.tokheim.aifueling.communication.entitys.NozzleStatus;
+import com.tokheim.aifueling.utils.ByteArrayUtils;
+
+/**
+ * 油枪状态相关解析类
+ */
+public class NozzleStatusAnalyzer extends BaseAnalyzer {
+    @Override
+    protected BaseInfo getOtherInfo(BaseInfo baseInfo, byte[] data) {
+        NozzleStatus nozzleStatus = new NozzleStatus(baseInfo);
+        int index = 0;
+        while (index < data.length) {
+            switch (data[index]) {
+                case 0x25:
+                    DecimalAnalysisAid balance = getDecimal(index, data);
+                    index = balance.getNextIndex();
+                    nozzleStatus.setBalance(balance.getDecimal());
+                    break;
+                case 0x26:
+                    DecimalAnalysisAid maxAmount = getDecimal(index, data);
+                    index = maxAmount.getNextIndex();
+                    nozzleStatus.setMaxRefuelingAmount(maxAmount.getDecimal());
+                    break;
+                case 0x27:
+                    DecimalAnalysisAid amount = getDecimal(index, data);
+                    index = amount.getNextIndex();
+                    nozzleStatus.setAmount(amount.getDecimal());
+                    break;
+                case 0x28:
+                    DecimalAnalysisAid vol = getDecimal(index, data);
+                    index = vol.getNextIndex();
+                    nozzleStatus.setVol(vol.getDecimal());
+                    break;
+                default:
+                    index++;
+                    break;
+            }
+        }
+        return nozzleStatus;
+    }
+}

+ 30 - 0
ai-fueling/src/main/java/com/tokheim/aifueling/communication/analyzer/QuantitativeAnalyzer.java

@@ -0,0 +1,30 @@
+package com.tokheim.aifueling.communication.analyzer;
+
+import com.tokheim.aifueling.communication.BaseAnalyzer;
+import com.tokheim.aifueling.communication.entitys.BaseInfo;
+import com.tokheim.aifueling.communication.entitys.DecimalAnalysisAid;
+import com.tokheim.aifueling.communication.entitys.Quantitative;
+
+/**
+ * 定量加油回复相关解析类
+ */
+public class QuantitativeAnalyzer extends BaseAnalyzer {
+    @Override
+    protected BaseInfo getOtherInfo(BaseInfo baseInfo, byte[] data) {
+        Quantitative quantitative = new Quantitative(baseInfo);
+        int index = 0;
+        while (index < data.length) {
+            switch (data[index]) {
+                case 0x30:
+                    boolean isSuccess = data[index + 1] == 0x01;
+                    index += 2;
+                    quantitative.setSuccess(isSuccess);
+                    break;
+                default:
+                    index++;
+                    break;
+            }
+        }
+        return quantitative;
+    }
+}

+ 35 - 0
ai-fueling/src/main/java/com/tokheim/aifueling/communication/analyzer/RefuelCodeAnalyzer.java

@@ -0,0 +1,35 @@
+package com.tokheim.aifueling.communication.analyzer;
+
+import com.tokheim.aifueling.communication.BaseAnalyzer;
+import com.tokheim.aifueling.communication.entitys.BaseInfo;
+import com.tokheim.aifueling.communication.entitys.DecimalAnalysisAid;
+import com.tokheim.aifueling.communication.entitys.RefuelCode;
+
+/**
+ * 一键加油相关数据解析类
+ */
+public class RefuelCodeAnalyzer extends BaseAnalyzer {
+    @Override
+    protected BaseInfo getOtherInfo(BaseInfo baseInfo, byte[] data) {
+        RefuelCode refuelCode = new RefuelCode(baseInfo);
+        int index = 0;
+        while (index < data.length) {
+            switch (data[index]) {
+                case 0x26:
+                    DecimalAnalysisAid maxAmount = getDecimal(index, data);
+                    index = maxAmount.getNextIndex();
+                    refuelCode.setMaxRefuelingAmount(maxAmount.getDecimal());
+                    break;
+                case 0x31:
+                    DecimalAnalysisAid maxVolume = getDecimal(index, data);
+                    index = maxVolume.getNextIndex();
+                    refuelCode.setMaxRefuelingVolume(maxVolume.getDecimal());
+                    break;
+                default:
+                    index++;
+                    break;
+            }
+        }
+        return refuelCode;
+    }
+}

+ 31 - 0
ai-fueling/src/main/java/com/tokheim/aifueling/communication/entitys/CarNum.java

@@ -0,0 +1,31 @@
+package com.tokheim.aifueling.communication.entitys;
+
+import com.tokheim.aifueling.communication.interfaces.IDataExtractor;
+import lombok.Data;
+
+import java.util.AbstractMap;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * 定义油机回复车牌号匹配数据
+ * <h5>matchResult:匹配车牌号结果</h5>
+ * <p>0:不匹配</p>
+ * <p>1:匹配</p>
+ * <p>2:不是限车牌卡</p>
+ */
+@Data
+public class CarNum extends BaseInfo implements IDataExtractor {
+
+    private Integer matchResult;
+
+    public CarNum(BaseInfo baseInfo) {
+        super(baseInfo);
+    }
+
+    @Override
+    public String getEvent() {
+        return "refuel_card_send_license_plate_match";
+    }
+}

+ 2 - 2
ai-fueling/src/main/java/com/tokheim/aifueling/communication/entitys/CardStatus.java

@@ -25,8 +25,8 @@ public class CardStatus extends BaseInfo implements IDataExtractor {
             new AbstractMap.SimpleEntry<>(7,"refuel_card_max_oilamount")    //卡最大可加金额
     ).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
 
-    private String balance;
-    private String maxRefuelingAmount;
+    public String balance;
+    public String maxRefuelingAmount;
 
     public CardStatus(){}
 

+ 12 - 0
ai-fueling/src/main/java/com/tokheim/aifueling/communication/entitys/DecimalAnalysisAid.java

@@ -0,0 +1,12 @@
+package com.tokheim.aifueling.communication.entitys;
+
+import lombok.Data;
+
+/**
+ * 用于解析油机数据中金额/升数相关的辅助类
+ */
+@Data
+public class DecimalAnalysisAid {
+    private int nextIndex;      //标识解析完金额后下标应该移动到的位置
+    private String decimal;      //解析完的金额
+}

+ 39 - 0
ai-fueling/src/main/java/com/tokheim/aifueling/communication/entitys/NozzleStatus.java

@@ -0,0 +1,39 @@
+package com.tokheim.aifueling.communication.entitys;
+
+import com.tokheim.aifueling.communication.interfaces.IDataExtractor;
+import lombok.Data;
+
+import java.util.AbstractMap;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * 定义油枪状态相关信息
+ * <h5>balance:卡余额<h5/>
+ * <h5>maxRefuelingAmount:最大可加金额<h5/>
+ * <h5>amount:加油金额<h5/>
+ * <h5>vol:加油升数<h5/>
+ */
+@Data
+public class NozzleStatus extends BaseInfo implements IDataExtractor {
+    Map<Integer,String> eventMap = Stream.of(
+            new AbstractMap.SimpleEntry<>(1,"refuel_in_process"),               //提枪
+            new AbstractMap.SimpleEntry<>(2,"refuel_out_process"),              //油枪归位
+            new AbstractMap.SimpleEntry<>(3,"refuel_exceptional_stop")          //异常加油停机
+    ).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+
+    private String balance;
+    private String maxRefuelingAmount;
+    private String amount;
+    private String vol;
+
+    public NozzleStatus(BaseInfo baseInfo) {
+        super(baseInfo);
+    }
+
+    @Override
+    public String getEvent() {
+        return eventMap.get(getEventType()) != null ? eventMap.get(getEventType()) : "";
+    }
+}

+ 23 - 0
ai-fueling/src/main/java/com/tokheim/aifueling/communication/entitys/Quantitative.java

@@ -0,0 +1,23 @@
+package com.tokheim.aifueling.communication.entitys;
+
+import com.tokheim.aifueling.communication.interfaces.IDataExtractor;
+import lombok.Data;
+
+/**
+ * 定义油机回复定量结果
+ * <h5>isSuccess:是否定量成功</h5>
+ */
+@Data
+public class Quantitative extends BaseInfo implements IDataExtractor {
+
+    private boolean isSuccess;
+
+    public Quantitative(BaseInfo baseInfo) {
+        super(baseInfo);
+    }
+
+    @Override
+    public String getEvent() {
+        return "";
+    }
+}

+ 37 - 0
ai-fueling/src/main/java/com/tokheim/aifueling/communication/entitys/RefuelCode.java

@@ -0,0 +1,37 @@
+package com.tokheim.aifueling.communication.entitys;
+
+import com.tokheim.aifueling.communication.interfaces.IDataExtractor;
+import lombok.Data;
+
+import java.util.AbstractMap;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * 定义一键加油油机数据
+ * <h5>maxRefuelingAmount:最大可加金额</h5>
+ * <h5>maxRefuelingVolume:最大可加升数</h5>
+ */
+@Data
+public class RefuelCode extends BaseInfo implements IDataExtractor {
+    Map<Integer,String> eventMap = Stream.of(
+            new AbstractMap.SimpleEntry<>(1,"refuel_code_type"),             //选择一键加油方式
+            new AbstractMap.SimpleEntry<>(2,"refuel_code_enter"),            //一键加油输入验证码按完确认键
+            new AbstractMap.SimpleEntry<>(3,"refuel_code_password"),         //一键加油等待验证码密码输入
+            new AbstractMap.SimpleEntry<>(4,"refuel_code_error"),            //一键加油验证码验证错误
+            new AbstractMap.SimpleEntry<>(5,"refuel_code_current"),          //一键加油验证码验证正确
+            new AbstractMap.SimpleEntry<>(6,"refuel_main_valve_open")        //电磁阀主阀打开
+    ).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+
+    private String maxRefuelingAmount;
+    private String maxRefuelingVolume;
+
+    public RefuelCode(BaseInfo baseInfo) {
+        super(baseInfo);
+    }
+    @Override
+    public String getEvent() {
+        return eventMap.get(getEventType()) != null ? eventMap.get(getEventType()) : "";
+    }
+}

+ 17 - 1
ai-fueling/src/main/java/com/tokheim/aifueling/communication/toInternalInterface/entity/FuelSendRequest.java

@@ -68,6 +68,20 @@ public class FuelSendRequest {
      */
     public Integer LicensePlateMatching;
 
+//    FuelSendRequest(){
+//        this.Type = "";
+//        this.ClientId = "";
+//        this.AIId = "";
+//        this.GLId = "";
+//        this.NozzleNo = -1;
+//        this.OilCode = "";
+//        this.Balance = BigDecimal.valueOf(-1);
+//        this.MaxRefuelingAmount = BigDecimal.valueOf(-1);
+//        this.CardType = -1;
+//        this.Amount = BigDecimal.valueOf(-1);
+//        this.Vol = BigDecimal.valueOf(-1);
+//        this.LicensePlateMatching = -1;
+//    }
     /**
      * 油机信息对象转化为内部接口请求对象
      * @param type 数据类型
@@ -82,16 +96,18 @@ public class FuelSendRequest {
      */
     public static FuelSendRequest convert(Integer type,BaseInfo baseInfo){
         FuelSendRequest fuelSendRequest = new FuelSendRequest();
+        //填入基本信息
         fuelSendRequest.setClientId(baseInfo.getIp());
         fuelSendRequest.setAIId(baseInfo.getAiId());
         fuelSendRequest.setGLId(baseInfo.getGeLinId());
         fuelSendRequest.setOilCode(baseInfo.getOilCode());
         fuelSendRequest.setNozzleNo(baseInfo.getNozzleNum());
         fuelSendRequest.setCardType(baseInfo.getCardType());
+
         switch (type) {
             case 1:
                 CardStatus cardStatus = (CardStatus) baseInfo;
-                fuelSendRequest.Type = cardStatus.getEvent();
+                fuelSendRequest.setType(cardStatus.getEvent());
                 fuelSendRequest.setMaxRefuelingAmount(new BigDecimal(cardStatus.getMaxRefuelingAmount()));
                 fuelSendRequest.setBalance(new BigDecimal(cardStatus.getBalance()));
                 break;