YYC
2023-10-09 47b716f76e16295a684d2634a5bd245c0e59aa3c
igds-protocol-beibo/src/main/java/com/ld/igds/protocol/beibo/grainv1/analysis/AnalysisService.java
@@ -26,6 +26,7 @@
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.*;
/**
@@ -54,82 +55,115 @@
    public static String result = "";
    public static Map<String, String> contextMap = new HashMap<>();
    public static double ERROR_CHECK_TAG = -100.0;
    public static double FAULT_CHECK_TAG = 85.0;
    public static double ERROR_CHECK_TAG2 = 50;
    public static String ERROR_HEX = "FFFF";
    public static double MAX_TEMP = -50.0;
    public static double MIN_TEMP = 50.0;
    public static void main(String[] args) {
        String str = "00000000FFEB90FEAA41E821EC21EA21EC21ED21EC21E921E221E921E921E921EC21E921ED21F021E521E521E221E421E321E321E121DE21D721E021DD21DC21DF21FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
        System.out.println(str.substring(9*2, 10*2));
    }
    /*
    * 00000000FFEB90FEAA41D821DD21DB21DE21DE21DA21DD21DE21DC21DC21DC21DC21DB21D821D721CE21D121DD21DC21DF21DE21DE21DD21DA21DD21D921DD21DC21DA21D921D921D721D521D321DD21DE21DF21DC21DF21DC21DA21DD21DD21DD21DC21DC21DC21DB21D821D721D121DC21DF21DF21DD21DD21DA21DE21DD21DC21DE21DB21D821DA21DB21D821D721D321DE21E021DD21DF21DF21DE21DB21DC21DF21DF21DD21DF21DB21DC21DB21FFFFFFFFDA21DC21D721DB21DB21DA21DB21D421DB21D921DC21D821D921D621D321FFFFFFFFDF21E021DE21DE21DB21DD21DC21E021DF21DD21DD21DC21DC21DC21DA21FFFFFFFFD921DD21DD21DE21DB21DD21DA21DB21DF21DD21DC21DB21DB21DB21D921FFFFFFFFDD21DC21DE21DD21DE21DC21DB21DC21DE21DE21DC21DC21DB21D921D921FFFFFFFFE021DD21DB21E021DF21DB21DB21D821DE21DE21DD21DD21DB21DB21DB21FFFFFFFFE021E021E021E221DC21DE21DF21DD21DD21DF21DF21DB21DC21DD21DC21FFFFFFFFE221E321E321E521E421DF21E321E321E321E521E321E121D921DE21FFFFFFFFFFFFE321E421E321E621E521E321E621E021E521E321E221E321DF21DE21FFFFFFFFFFFFE421E621E521E521E621E321E521E121E621E121E321E421E121DE21FFFFFFFFFFFFE621E421E521E521E521E321E521E421E121E321E521E321DF21E021FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40013D10101039014110101010101010101000000000000000E5113500031A4C
    *
    * 00000000FFEB90FEAA
    * 41
    * D821DD21DB21DE21DE21DA21DD21DE21DC21DC21DC21DC21DB21D821D721CE21D121
    * DD21DC21DF21DE21DE21DD21DA21DD21D921DD21DC21DA21D921D921D721D521D321
    * DD21DE21DF21DC21DF21DC21DA21DD21DD21DD21DC21DC21DC21DB21D821D721D121
    * DC21DF21DF21DD21DD21DA21DE21DD21DC21DE21DB21D821DA21DB21D821D721D321
    * DE21E021DD21DF21DF21DE21DB21DC21DF21DF21DD21DF21DB21DC21DB21FFFFFFFF
    * DA21DC21D721DB21DB21DA21DB21D421DB21D921DC21D821D921D621D321FFFFFFFF
    * DF21E021DE21DE21DB21DD21DC21E021DF21DD21DD21DC21DC21DC21DA21FFFFFFFF
    * D921DD21DD21DE21DB21DD21DA21DB21DF21DD21DC21DB21DB21DB21D921FFFFFFFF
    * DD21DC21DE21DD21DE21DC21DB21DC21DE21DE21DC21DC21DB21D921D921FFFFFFFF
    * E021DD21DB21E021DF21DB21DB21D821DE21DE21DD21DD21DB21DB21DB21FFFFFFFF
    * E021E021E021E221DC21DE21DF21DD21DD21DF21DF21DB21DC21DD21DC21FFFFFFFF
    *
    * E221E321E321E521E421DF21E321E321E321E521E321E121D921DE21FFFFFFFFFFFF
    * E321E421E321E621E521E321E621E021E521E321E221E321DF21DE21FFFFFFFFFFFF
    * E421E621E521E521E621E321E521E121E621E121E321E421E121DE21FFFFFFFFFFFF
    * E621E421E521E521E521E321E521E421E121E321E521E321DF21E021FFFFFFFFFFFF
    * FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    * 40013D 101010 390141 101010101010101010
    * 00000000000000E51135
    * 00031A4C
    *
    *
    *
    *
    *
    * */
    /**
     * 00000000FFEB90FEAA41E821EC21EA21EC21ED21EC21E921E221E921E921E921EC21E921ED21F021E521E521E221E421E321E321E121DE21D721E021DD21DC21DF21FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
     *
     *
     * @param hexStr
     */
    public void analysis(String ip, int port, String hexStr) {
        result += hexStr;
        if(result.length() < 1066*2){
        if (result.length() < 1066 * 2) {
            log.info("分机------->>平台,报文长度不够,等待下一包数据");
            return;
        }
        //封装数据
        ReMessage reMessage = ReMessageBuilder.getInstance().buildMessage(result);
        reMessage.setIp(ip);
        reMessage.setPort(port);
        log.info("分机------->>平台:粮情完整报文信息={}", reMessage);
        result = "";
        if (!BeiboGrainServerUtils.MSG_START.startsWith(reMessage.getStartStr())) {
            log.error("分机------->>平台,解析粮情失败:报文起始符={}错误,不解析", reMessage.getStartStr());
            return;
        try {
            //封装数据
            ReMessage reMessage = ReMessageBuilder.getInstance().buildMessage(result);
            reMessage.setIp(ip);
            reMessage.setPort(port);
            log.info("分机------->>平台:粮情完整报文信息={}", reMessage);
            result = "";
            if (!BeiboGrainServerUtils.MSG_START.startsWith(reMessage.getStartStr())) {
                log.error("分机------->>平台,解析粮情失败:报文起始符={}错误,不解析", reMessage.getStartStr());
                return;
            }
            //根据分机地址获取分机信息
            DeviceSer ser = coreSerService.getCacheSer(ContextUtil.getDefaultCompanyId(), reMessage.getSerId());
            if (ser == null) {
                log.error("分机-------->>平台,解析粮情失败,未获取到系统粮情主机配置:" + reMessage.getSerId());
                return;
            }
            List<ExeRequest> list = exeOrderService.getInProgressOrderBySerId(BizType.GRAIN.getCode(), ser.getId());
            if (null == list || list.isEmpty()) {
                String info = "粮情解析失败:分机=" + ser.getName() + "没有获取到所属仓库信息。";
                log.error("分机------>>>平台:" + info);
                notifyGrainInvoker.notifyWeb(ser.getCompanyId(), OrderRespEnum.MSG_ERROR, BizType.GRAIN, info);
                return;
            }
            ExeRequest exeRequest = list.get(0);
            log.info("获取粮情命令信息={}", exeRequest);
            if (null == exeRequest) {
                String info = "粮情解析失败:分机=" + ser.getName() + "没有获取历史命令。";
                log.error("贝博分机------>>>平台:" + info);
                return;
            }
            DepotConf depotConf = commonService.getCacheDepotConf(exeRequest.getCompanyId(), exeRequest.getDepotId());
            if (null == depotConf) {
                String info = "粮情解析失败:分机=" + ser.getName() + "没有获取到粮情参数配置信息。";
                log.error("分机------>>>平台:" + info);
                notifyGrainInvoker.notifyWeb(ser.getCompanyId(),
                        OrderRespEnum.MSG_ERROR, BizType.GRAIN, info);
                return;
            }
            // 首先获取到系统参数,判断是否需要批次自动优化
            DicSysConf sysConf = commonService.getCacheSysConf(ser.getCompanyId());
            reMessage.setCompanyId(ser.getCompanyId());
            analysisGrain(depotConf, reMessage, ser, exeRequest, sysConf);
        } catch (Exception e) {
            result = "";
            log.error("分机------->>平台,解析粮情异常:原因={}", e.toString());
        }
        //根据分机地址获取分机信息
        DeviceSer ser = coreSerService.getCacheSer(ContextUtil.getDefaultCompanyId(), reMessage.getSerId());
        if (ser == null) {
            log.error("分机-------->>平台,解析粮情失败,未获取到系统粮情主机配置:" + reMessage.getSerId());
            return;
        }
        List<ExeRequest> list = exeOrderService.getInProgressOrderBySerId(BizType.GRAIN.getCode(), ser.getId());
        if (null == list || list.isEmpty()) {
            String info = "粮情解析失败:分机=" + ser.getName() + "没有获取到所属仓库信息。";
            log.error("分机------>>>平台:" + info);
            notifyGrainInvoker.notifyWeb(ser.getCompanyId(), OrderRespEnum.MSG_ERROR, BizType.GRAIN, info);
            return;
        }
        ExeRequest exeRequest = list.get(0);
        log.info("获取粮情命令信息={}", exeRequest);
        if (null == exeRequest) {
            String info = "粮情解析失败:分机=" + ser.getName() + "没有获取历史命令。";
            log.error("贝博分机------>>>平台:" + info);
            return;
        }
        DepotConf depotConf = commonService.getCacheDepotConf(exeRequest.getCompanyId(), exeRequest.getDepotId());
        if (null == depotConf) {
            String info = "粮情解析失败:分机=" + ser.getName() + "没有获取到粮情参数配置信息。";
            log.error("分机------>>>平台:" + info);
            notifyGrainInvoker.notifyWeb(ser.getCompanyId(),
                    OrderRespEnum.MSG_ERROR, BizType.GRAIN, info);
            return;
        }
        // 首先获取到系统参数,判断是否需要批次自动优化
        DicSysConf sysConf = commonService.getCacheSysConf(ser.getCompanyId());
        reMessage.setCompanyId(ser.getCompanyId());
        analysisGrain(depotConf, reMessage, ser, exeRequest, sysConf);
    }
@@ -225,12 +259,19 @@
        log.info("------筒仓粮情报文={}------", strPoints);
        int sumNum = 0, cableZ = 1;// sumNum 共多少根电缆;cableZ 层的最大值,锥形仓补齐最大层
        int sumNum = 0, cableZ = 1;  // sumNum 共多少根电缆;cableZ 层的最大值,锥形仓补齐最大层
        for (int i = 0; i < cableCirAtt.length; i++) {
            if (Integer.valueOf(cableCirAtt[i]) > cableZ) {
                cableZ = Integer.valueOf(cableCirAtt[i]);
            }
            sumNum += Integer.valueOf(cableRuleAtt[i]);
        }
        int cableZTemp = 1;// 当前仓的最大层
        cableZTemp = cableZ;
        //判断最大层跟分机的层数是否一致
        if(cableZ < ser.getCableZ()){
            cableZ = ser.getCableZ();
        }
        // 根据层行列获取指定长度
@@ -244,68 +285,47 @@
        List<Double> temps = new ArrayList<>();
        double tempValue;
        String temp;
        int curLay = 1;//所在层从1开始
        int curRoot = 1;//所在根
        int curCir = 1;//所在圈
        int cirLay = 1;//当前圈的层
        int symbol = 0; //符号位
        int num = 0; //标记解析的层数
        for (int i = 0; i < strPoints.length() / 4; i++) {
            temp = strPoints.substring(i * 4, i * 4 + 4);
            if (temp == null) {
                temp = "0000";
            if(num == cableZ){
                num = 0;
            }
            //高低位转换后转为16位二进制字符串
            temp = BytesUtil.toBinary8StringSame(BytesUtil.hexToInt(BytesUtil.tran_LH(temp)), 16);
            //符号位
            symbol = Integer.valueOf(temp.substring(0, 1));
            //获取温度值
            tempValue = BytesUtil.hexToInt(BytesUtil.binToHex(temp.substring(6))) * 0.0625;
            if(symbol == 1){
                tempValue = (1- BytesUtil.hexToInt(BytesUtil.binToHex(temp.substring(6))))*0.0625;
            }
            tempValue = NumberUtil.keepPrecision(tempValue, 1);
            //非正常值
            if (tempValue > ERROR_CHECK_TAG2) {
                tempValue = Constant.ERROR_TEMP;
            }
            // 故障值处理
            if (tempValue >= FAULT_CHECK_TAG) {
                tempValue = Constant.FAULT_TEMP;
            }
            // 备用值
            if (tempValue == ERROR_CHECK_TAG) {
                tempValue = Constant.ERROR_TEMP;
                //验证是不是锥形仓补偿值
                curLay = (i % layMax) + 1;
                curRoot = (i / layMax) + 1;
                curCir = getCurCir(curRoot, cableRuleAtt);
                cirLay = Integer.valueOf(cableCirAtt[curCir - 1]);
                //比如配置了5层但是当前是6层,说明当前点为补偿点
                if (curLay > cirLay) {
                    tempValue = Constant.ADD_TEMP;
                    //判断是不是上锥形,将补点转移到上方
                    if (Constant.CABLE_CONE_1.equals(depotConf.getCableCone())) {
                        int index = i - curLay - 1;
                        temps.add(index, tempValue);
                    } else {
                        temps.add(tempValue);
            if(num < cableZTemp){
                temp = strPoints.substring(i * 4, i * 4 + 4);
                if (temp == null) {
                    temp = "0000";
                }
                //高低位转换后转为16位二进制字符串
                temp = BytesUtil.tran_LH(temp);
                if(ERROR_HEX.equals(temp)){
                    tempValue = Constant.ERROR_TEMP;
                }else {
                    //10进制转16位的2进制
                    temp = BytesUtil.hexString2binaryString(temp, 16);
                    //符号位
                    symbol = Integer.valueOf(temp.substring(0, 1));
                    //获取温度值
                    tempValue = BytesUtil.biannary2Decimal(temp.substring(6)) * 0.0625;
                    //若为负,则补码:取反加1
                    if (symbol == 1) {
                        tempValue = ((~BytesUtil.biannary2Decimal(temp.substring(6))) + 1) * 0.0625;
                    }
                } else {
                    temps.add(tempValue);
                    tempValue = NumberUtil.keepPrecision(tempValue, 1);
                }
            } else {
                //非正常值
                if (tempValue > ERROR_CHECK_TAG2) {
                    tempValue = Constant.ERROR_TEMP;
                }
                // 故障值处理
                if (tempValue >= FAULT_CHECK_TAG) {
                    tempValue = Constant.FAULT_TEMP;
                }
                temps.add(tempValue);
            }
            num ++;
        }
        log.debug("-------CheckGrainRequest--={}", exeRequest.toString());
@@ -370,16 +390,22 @@
                temp = "0000";
            }
            //高低位转换后转为16位二进制字符串
            temp = BytesUtil.toBinary8StringSame(BytesUtil.hexToInt(BytesUtil.tran_LH(temp)), 16);
            //符号位
            symbol = Integer.valueOf(temp.substring(0, 1));
            //获取温度值
            tempValue = BytesUtil.hexToInt(BytesUtil.binToHex(temp.substring(6))) * 0.0625;
            if(symbol == 1){
                tempValue = (1- BytesUtil.hexToInt(BytesUtil.binToHex(temp.substring(6))))*0.0625;
            if(ERROR_HEX.equals(temp)){
                tempValue = Constant.ERROR_TEMP;
            }else {
                //10进制转16位的2进制
                temp = BytesUtil.hexString2binaryString(temp, 16);
                //符号位
                symbol = Integer.valueOf(temp.substring(0, 1));
                //获取温度值
                tempValue = BytesUtil.biannary2Decimal(temp.substring(6)) * 0.0625;
                //若为负,则补码:取反加1
                if (symbol == 1) {
                    tempValue = ((~BytesUtil.biannary2Decimal(temp.substring(6))) + 1) * 0.0625;
                }
                tempValue = NumberUtil.keepPrecision(tempValue, 1);
            }
            tempValue = NumberUtil.keepPrecision(tempValue, 1);
            // 说明解析的数据有问题
            if (tempValue == ERROR_CHECK_TAG || tempValue == ERROR_CHECK_TAG2) {
                tempValue = Constant.ERROR_TEMP;
@@ -439,10 +465,40 @@
        grain.setCompanyId(depotConf.getCompanyId());
        grain.setCable(depotConf.getCableRule());
        grain.setBatchId(msg.getBatchId());
        grain.setTempIn(Constant.ERROR_TEMP);
        grain.setHumidityIn(Constant.ERROR_TEMP);
        grain.setReceiveDate(msg.getReceiveDate());
        int humidity = -100;
        int tem = -100;
        String substring = "";
        //解析外湿外温
        String thStr = msg.getThStr().substring(6, 12);
        humidity = BytesUtil.hexToInt(thStr.substring(0, 2));
        grain.setHumidityOut(humidity * 1.0);
        substring = thStr.substring(2);
        tem = BytesUtil.hexToInt(substring);
        grain.setTempOut(tem * 0.1);
        if(substring.startsWith("1")){
            grain.setTempOut(tem * -0.1);
        }
        //解析仓内温仓内湿
        int thConf = Integer.valueOf(depotConf.getThConf());
        int start = 0, end = 6;
        if(thConf > 1){
            start += 6*thConf; //12-18
            end += start;
        }
        thStr = msg.getThStr().substring(start, end);
        humidity = BytesUtil.hexToInt(thStr.substring(0, 2));
        grain.setHumidityIn(humidity * 1.0);
        substring = thStr.substring(2);
        tem = BytesUtil.hexToInt(substring);
        grain.setTempIn(tem * 0.1);
        if(substring.startsWith("1")){
            grain.setTempIn(tem * -0.1);
        }
        grain.setReceiveDate(new Date());
        grain.setRemark("粮温正常");
        // 获取缓存中的命令信息
@@ -521,10 +577,40 @@
        grain.setCable(depotConf.getCableRule());
        grain.setCableCir(depotConf.getCableCir());
        grain.setBatchId(msg.getBatchId());
        grain.setTempIn(Constant.ERROR_TEMP);
        grain.setHumidityIn(Constant.ERROR_TEMP);
        grain.setReceiveDate(msg.getReceiveDate());
        int humidity = -100;
        int tem = -100;
        String substring = "";
        //解析外湿外温
        String thStr = msg.getThStr().substring(6, 12);
        humidity = BytesUtil.hexToInt(thStr.substring(0, 2));
        grain.setHumidityOut(humidity * 1.0);
        substring = thStr.substring(2);
        tem = BytesUtil.hexToInt(substring);
        grain.setTempOut(tem * 0.1);
        if(substring.startsWith("1")){
            grain.setTempOut(tem * -0.1);
        }
        //解析仓内温仓内湿
        int thConf = Integer.valueOf(depotConf.getThConf());
        int start = 0, end = 6;
        if(thConf > 1){
            start += 6*thConf; //12-18
            end += start;
        }
        thStr = msg.getThStr().substring(start, end);
        humidity = BytesUtil.hexToInt(thStr.substring(0, 2));
        grain.setHumidityIn(humidity * 1.0);
        substring = thStr.substring(2);
        tem = BytesUtil.hexToInt(substring);
        grain.setTempIn(tem * 0.1);
        if(substring.startsWith("1")){
            grain.setTempIn(tem * -0.1);
        }
        grain.setReceiveDate(new Date());
        grain.setRemark("粮温正常");
        grain.setCheckUser(exeRequest.getExeUser());
@@ -570,6 +656,17 @@
        grain.setTempMax(max);
        grain.setTempMin(min);
        grain.setPoints(StringUtils.join(temps, ","));
        //判断是否是锥形仓,是的话进行锥形仓补点
        if(StringUtils.isNotEmpty(depotConf.getCableCone())){
            //上锥形补点
            if(Constant.CABLE_CONE_1.equals(depotConf.getCableCone())){
                grain.setPoints(upConePoints(depotConf, grain.getPoints()));
            }
            //下锥形补点
            if(Constant.CABLE_CONE_2.equals(depotConf.getCableCone())){
                grain.setPoints(downConePoints(depotConf, grain.getPoints()));
            }
        }
        String depotIds = exeRequest.getDepotIds();
        boolean notifyWeb = true;
@@ -661,11 +758,85 @@
        return temps;
    }
    private String buildCurKey(ReMessage msg, int curPacket) {
        return msg.getSerId() + "_" + curPacket;
    /**
     * 上锥形补点(点位位置正确,需要补点为-102)
     *
     * @param depotConf
     * @param points
     * @return
     */
    private String upConePoints(DepotConf depotConf, String points){
        String[] cableRuleAtt = depotConf.getCableRule().split("-");
        String[] cableCirAtt = depotConf.getCableCir().split("-");
        //获取最大的层配置
        int layMax = Integer.valueOf(cableCirAtt[0]);
        for (int i = 0; i < cableCirAtt.length; i++) {
            if (Integer.valueOf(cableCirAtt[i]) >= layMax) {
                layMax = Integer.valueOf(cableCirAtt[i]);
            }
        }
        //所在层从1开始
        int curLay = 1;
        //所在根
        int curRoot = 1;
        //所在圈
        int curCir = 1;
        //当前圈的层
        int cirLay = 1;
        String[] array = points.split(",");
        for (int i = 0; i < array.length; i++) {
            curLay = (i % layMax) + 1;
            curRoot = (i / layMax) + 1;
            curCir = getCurCir(curRoot, cableRuleAtt);
            cirLay = Integer.valueOf(cableCirAtt[curCir - 1]);
            //比如配置了5层但是当前是6层,说明当前点为补偿点
            if (curLay <= (layMax - cirLay)) {
                array[i] = String.valueOf(Constant.ADD_TEMP);
            }
        }
        return StringUtils.join(array, ",");
    }
    private String buildContextKey(String companyId, String serId) {
        return companyId + "_" + serId;
    /**
     * 下锥形补点(点位位置正确,需要补点为-102)
     *
     * @param depotConf
     * @param points
     * @return
     */
    private String downConePoints(DepotConf depotConf, String points){
        String[] cableRuleAtt = depotConf.getCableRule().split("-");
        String[] cableCirAtt = depotConf.getCableCir().split("-");
        //获取最大的层配置
        int layMax = Integer.valueOf(cableCirAtt[0]);
        for (int i = 0; i < cableCirAtt.length; i++) {
            if (Integer.valueOf(cableCirAtt[i]) >= layMax) {
                layMax = Integer.valueOf(cableCirAtt[i]);
            }
        }
        //所在层从1开始
        int curLay = 1;
        //所在根
        int curRoot = 1;
        //所在圈
        int curCir = 1;
        //当前圈的层
        int cirLay = 1;
        String[] array = points.split(",");
        for (int i = 0; i < array.length; i++) {
            curLay = (i % layMax) + 1;
            curRoot = (i / layMax) + 1;
            curCir = getCurCir(curRoot, cableRuleAtt);
            cirLay = Integer.valueOf(cableCirAtt[curCir - 1]);
            //比如配置了5层但是当前是6层,说明当前点为补偿点
            if (curLay > cirLay) {
                array[i] = String.valueOf(Constant.ADD_TEMP);
            }
        }
        return StringUtils.join(array, ",");
    }
}