zss
2024-07-26 ff4d45d57c3d1a1c8d4218dd83023cb7e4c34d7e
cnas-server/src/main/java/com/yuanchu/mom/utils/DataAcquisition.java
@@ -9,9 +9,11 @@
import com.yuanchu.mom.exception.ErrorException;
import com.yuanchu.mom.pojo.DataConfig;
import com.yuanchu.mom.pojo.Device;
import com.yuanchu.mom.vo.Result;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -27,25 +29,38 @@
    private static final String splitIdentifier = "@-@"; // 自定义唯一标识分割符
    public static final String frequency = "frequency";
    /**
     * 数采入口
     * @param request
     *
     * @param dataConfig
     * @param device
     * @return
     */
    public static Result<?> dataAcquisitionEntrance(HttpServletRequest request, List<DataConfig> dataConfig, Device device, String entrustCode, String sampleCode) {
        String ipAddress = request.getRemoteAddr();
        // 防止回环地址变为IPv6
        String ip = ipAddress.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ipAddress;
        String http = HTTP + ip + GETFILE + "?filePath=" + device.getCollectUrl() + "&fileExtension=" + device.getFileType();
    public static Map<String, String> dataAcquisitionEntrance(List<DataConfig> dataConfig, Device device, String entrustCode, String sampleCode, String ip) {
        /**
         * filePath 文件采集路径
         * fileExtension 文件后缀
         * entrustCode 委托编号
         * sampleCode 样品编号
         * mdbEntrustCode mdb文件需要:委托编号字段
         * mdbSampleCode mdb文件需要:样品编号字段
         */
        String http = HTTP + ip + GETFILE +
                "?filePath=" + device.getCollectUrl() +
                "&fileExtension=" + device.getFileType() +
                "&entrustCode=" + entrustCode +
                "&sampleCode=" + sampleCode +
                "&mdbEntrustCode=" + device.getMdbEntrustCode() +
                "&mdbSampleCode=" + device.getMdbSampleCode();
        String result = null;
        try {
            result = HttpUtil.get(http);
        } catch (IORuntimeException e) {
            throw new ErrorException("所在电脑未安装或未启动:LIMS文件采集器!");
        }
        JSONObject jsonObject =  JSON.parseObject(result);
        JSONObject jsonObject = JSON.parseObject(result);
        if (Objects.equals(jsonObject.get("code"), 1)) {
            if (ObjectUtils.isEmpty(jsonObject.get("msg"))) {
                throw new ErrorException("未查询到数据,可能文件路径配置错误!");
@@ -56,7 +71,11 @@
        } else {
            String data = jsonObject.get("data").toString();
            // 考虑到一个检测项可能会存在多个数采配置,所以需要进行分组
            Map<String, List<DataConfig>> userMap = dataConfig.stream().collect(Collectors.groupingBy(DataConfig::getInsProductItem));
            Map<String, List<DataConfig>> userMap = dataConfig.stream()
                    .peek(i -> i.setInsProductItem(
                            i.getInspectionItem().equals(i.getInspectionItemSubclass()) ? i.getInspectionItem() + "," : i.getInspectionItem() + "," + i.getInspectionItemSubclass()
                    ))
                    .collect(Collectors.groupingBy(DataConfig::getInsProductItem));
            Map<String, String> map;
            switch (device.getFileType()) {
                case ".docx":
@@ -72,7 +91,7 @@
                    map = analysisList(data, userMap);
                    break;
                case ".mdb":
                    map = analysisMdb(data, userMap, entrustCode, sampleCode);
                    map = analysisMdb(data, userMap);
                    break;
                case ".db":
                    map = analysisDb(data, userMap);
@@ -86,52 +105,52 @@
            }
            // 如果存在存储地址,则移动地址
            if (ObjectUtils.isNotEmpty(device.getStorageUrl())) {
                String s = HTTP + ip + MOVEFILE + "?startFilePath=" + device.getCollectUrl() + "&endFilePath=" + device.getStorageUrl();
                String s = HTTP + ip + MOVEFILE + "?startFilePath=" + device.getCollectUrl() + "&endFilePath=" + device.getStorageUrl() + "&fileType=" + device.getFileType();
                String storageUrlResult = HttpUtil.get(s);
                JSONObject storageUrlResultJson =  JSON.parseObject(storageUrlResult);
                if (Objects.equals(storageUrlResultJson.get("code"), 1)) {
                    if (ObjectUtils.isEmpty(storageUrlResultJson.get("msg"))) {
                        throw new ErrorException("存储地址错误,可能文件路径配置错误!");
                    } else {
                        throw new ErrorException("未知错误,请联系管理员!");
                    }
                }
                JSONObject storageUrlResultJson = JSON.parseObject(storageUrlResult);
            }
            map.put("frequency", "1");
            return Result.success(map);
            return map;
        }
    }
    public static String createFrequency(String entrustCode, String sampleCode) {
        String key = frequency + ":" + entrustCode + ":" + sampleCode;
        boolean b = RedisUtil.hasKey(key);
        String frequencyValue;
        if (b) {
            long incr = RedisUtil.incr(key, 1);
            frequencyValue = String.valueOf(incr);
        } else {
            RedisUtil.set(key, 1);
            frequencyValue = "1";
        }
        return frequencyValue;
    }
    /**
     * 需要通过X,Y轴定位
     *
     * @param data
     * @param dataConfig
     * @return
     */
    private static Map<String, String> analysisDb(String data, Map<String, List<DataConfig>> dataConfig) {
        JSONObject jsonObject = JSON.parseObject(data);
        JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString());
        JSONArray columnList = JSONArray.parseArray(jsonObject.get("column").toString());
        Map<String, String> map = new HashMap<>();
        if (jsonObject.isEmpty()) {
            return map;
        }
        JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString());
        dataConfig.forEach((k, v) -> {
            List<Object> list = new ArrayList<>();
            for (int config = 0; config < v.size(); config++) {
                String referx = v.get(config).getReferx();
                if(ObjectUtils.isEmpty(v.get(config).getX()) && ObjectUtils.isEmpty(v.get(config).getY())) {
                    continue;
                }
                int x = Integer.parseInt(v.get(config).getX());
                int y = Integer.parseInt(v.get(config).getY());
                String key = "";
                for (int i = 0; i < columnList.size(); i++) {
                    if (columnList.get(i).equals(referx)) {
                        key = columnList.get(i + x).toString();
                String referx = getRefer(v.get(config).getReferx());
                for (int i = 0; i < dataList.size(); i++) {
                    JSONObject jsonObject1 = JSON.parseObject(dataList.get(i).toString());
                    Object o = jsonObject1.get(referx);
                    if (ObjectUtils.isNotEmpty(o)) {
                        list.add(o);
                    }
                }
                JSONObject jsonObject1 = JSON.parseObject(dataList.get(y).toString());
                Object o = jsonObject1.get(key);
                if (ObjectUtils.isNotEmpty(o)) {
                    list.add(o);
                }
            }
            // 进行公式计算
@@ -142,34 +161,26 @@
    }
    /**
     * 需要通过X,Y轴定位
     * @param data
     * @param dataConfig
     * @return
     */
    private static Map<String, String> analysisMdb(String data, Map<String, List<DataConfig>> dataConfig, String entrustCode, String sampleCode) {
    private static Map<String, String> analysisMdb(String data, Map<String, List<DataConfig>> dataConfig) {
        JSONObject jsonObject = JSON.parseObject(data);
        JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString());
        JSONArray columnList = JSONArray.parseArray(jsonObject.get("column").toString());
        Map<String, String> map = new HashMap<>();
        if (jsonObject.isEmpty()) {
            return map;
        }
        JSONArray dataList = JSONArray.parseArray(jsonObject.get("data").toString());
        dataConfig.forEach((k, v) -> {
            List<Object> list = new ArrayList<>();
            for (int config = 0; config < v.size(); config++) {
                String referx = v.get(config).getReferx();
                int x = Integer.parseInt(v.get(config).getX());
                String key = "";
                for (int i = 0; i < columnList.size(); i++) {
                    if (columnList.get(i).equals(referx)) {
                        key = columnList.get(i + x).toString();
                    }
                }
                String referx = getRefer(v.get(config).getReferx());
                for (int i = 0; i < dataList.size(); i++) {
                    JSONObject jsonObject1 = JSON.parseObject(dataList.get(i).toString());
                    if (entrustCode.equals(jsonObject1.get("OrderNumber")) && sampleCode.equals(jsonObject1.get("SampleNumber"))) {
                        Object o = jsonObject1.get(key);
                        if (ObjectUtils.isNotEmpty(o)) {
                            list.add(o);
                        }
                    Object o = jsonObject1.get(referx);
                    if (ObjectUtils.isNotEmpty(o)) {
                        list.add(o);
                    }
                }
            }
@@ -181,9 +192,11 @@
    }
    private static Pattern SPATTERN = Pattern.compile("([-+])?\\d+(\\.\\d+)?");
    /**
     * 只需X轴
     * @param data 采集到的文件字符串
     *
     * @param data       采集到的文件字符串
     * @param dataConfig 用户配置好的x,y轴定位数据与参照物
     * @return
     */
@@ -192,15 +205,15 @@
        dataConfig.forEach((k, v) -> {
            List<Object> list = new ArrayList<>();
            for (int config = 0; config < v.size(); config++) {
                String referx = v.get(config).getReferx();
                String xResult = null;
                String referx = getRefer(v.get(config).getReferx());
                String result = null;
                // 通过\n将字符串分割为行
                String[] aColumnY = data.split("\n");
                List<String> list1 = new ArrayList<>();
                // 该循环得出用户配置的y轴
                for (int i = 0; i < aColumnY.length; i++) {
                    String addDataWithSpaces = referx.replaceAll("", " ");
                    int x = Integer.parseInt(v.get(config).getX());
                    int x = getXOrY(v.get(config).getX(), k, "X");
                    if (aColumnY[i].contains(addDataWithSpaces)) {
                        Matcher matcher = SPATTERN.matcher(aColumnY[i]);
                        while (matcher.find()) {
@@ -209,11 +222,11 @@
                        }
                    }
                    if (ObjectUtils.isNotEmpty(list1)) {
                        xResult = list1.get(x);
                        result = list1.get(x);
                    }
                }
                if (ObjectUtils.isNotEmpty(xResult)) {
                    list.add(xResult);
                if (ObjectUtils.isNotEmpty(result)) {
                    list.add(result);
                }
            }
            // 进行公式计算
@@ -225,16 +238,148 @@
    /**
     * 从文件中提取出来的文字,如果有公式,进行公式计算,否则取列表第一个值
     * @param list 提取出的数字
     *
     * @param list       提取出的数字
     * @param dataConfig 存储公式的对象
     * @return
     */
    private static String calculationFormula(List<Object> list, DataConfig dataConfig, String insProductItem) {
        if (list.size() == 0) {
            return null;
        }
        // 如果不为空,进行公式计算
        if (ObjectUtils.isNotEmpty(dataConfig.getFormula())) {
            String formula = dataConfig.getFormula();
            //首先将list转换为bigdecmic
            List<BigDecimal> bigDecimalList = list.stream()
                    .map(obj -> {
                        return new BigDecimal((obj).toString());
                    }).collect(Collectors.toList());
            System.out.println(bigDecimalList);
            return null;
        // 否则:没有公式代表不需要计算,直接提取List里面的数据
            //将中文的(转换英文的())
            formula = formula.replace("(", "(")
                    .replace(")", ")")
                    .replace(",", ",");
            //然后提取英文字母,全部转换为大写
            String[] strs = formula.split("[^A-Za-z]+");
            String upperStr = "";
            for (String str : strs) {
                upperStr += str.toUpperCase();
            }
            if (upperStr.equals("")) {
                throw new ErrorException(formula + "里面的公式没有函数");
            }
            //然后获取最外面括号里面的值,再根据","分割
            int start = formula.indexOf("(");
            int end = -1;
            int a = 0;
            for (int i = start; i < formula.length(); i++) {
                char c = formula.charAt(i);
                if (c == '(') {
                    a++;
                } else if (c == ')') {
                    a--;
                    if (a == 0) {
                        end = i;
                    }
                }
            }
            if (start == -1 || end == -1) {
                throw new ErrorException("公式括号不匹配: " + formula);
            }
            String inner = formula.substring(start + 1, end);
            List<String> arguments = new ArrayList<>();
            int depth = 0;
            StringBuilder currentArgument = new StringBuilder();
            for (
                    char c : inner.toCharArray()) {
                if (c == ',' && depth == 0) {
                    arguments.add(currentArgument.toString());
                    currentArgument.setLength(0);
                } else {
                    if (c == '(') {
                        depth++;
                    } else if (c == ')') {
                        depth--;
                    }
                    currentArgument.append(c);
                }
            }
            arguments.add(currentArgument.toString());
            String[] bracketStrs = arguments.toArray(new String[0]);
            List<BigDecimal> results = new ArrayList<>();
            for (
                    String expr : bracketStrs) {
                System.out.println("替换前" + expr);
                Pattern pattern = Pattern.compile("\\b\\d+\\b");
                Matcher matcher = pattern.matcher(expr);
                StringBuffer sb = new StringBuffer();
                while (matcher.find()) {
                    int index = Integer.parseInt(matcher.group()) - 1;
                    if (index < bigDecimalList.size()) {
                        matcher.appendReplacement(sb, bigDecimalList.get(index).toString());
                    } else {
                        throw new ErrorException("表达式中的下标 " + index + " 超出范围");
                    }
                }
                matcher.appendTail(sb);
                System.out.println("替换后" + sb.toString());
                //计算
                ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
                try {
                    Object result = engine.eval(sb.toString());
                    results.add(new BigDecimal(result.toString()));
                } catch (Exception e) {
                    throw new IllegalArgumentException("无法计算表达式: " + sb, e);
                }
            }
            // 根据函数名称进行相应计算
            BigDecimal finalResult;
            switch (upperStr) {
                case "MAX":
                    finalResult = results.stream().max(BigDecimal::compareTo)
                            .orElseThrow(() -> new IllegalArgumentException("无法计算MAX值"));
                    break;
                case "MIN":
                    finalResult = results.stream().min(BigDecimal::compareTo)
                            .orElseThrow(() -> new IllegalArgumentException("无法计算MIN值"));
                    break;
                case "SUM":
                    finalResult = results.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
                    break;
                case "ABS":
                    finalResult = results.stream().map(BigDecimal::abs).reduce(BigDecimal.ZERO, BigDecimal::add);
                    break;
                case "AVERAGE":
                    finalResult = results.stream().reduce(BigDecimal.ZERO, BigDecimal::divide)
                            .divide(BigDecimal.valueOf(results.size()), 2, BigDecimal.ROUND_HALF_UP);
                    break;
                case "MEDIAN":
                    int size = results.size();
                    if (size % 2 == 1) {
                        finalResult = results.get(size / 2);
                    } else {
                        BigDecimal sum = results.get(size / 2 - 1).add(results.get(size / 2));
                        finalResult = sum.divide(BigDecimal.valueOf(2), 2, BigDecimal.ROUND_HALF_UP);
                    }
                    break;
                case "RANGE":
                    finalResult = results.stream().max(BigDecimal::compareTo)
                            .orElseThrow(() -> new IllegalArgumentException("无法计算RANGE值"))
                            .subtract(results.stream().min(BigDecimal::compareTo)
                                    .orElseThrow(() -> new IllegalArgumentException("无法计算RANGE值")));
                    break;
                default:
                    throw new UnsupportedOperationException("暂不支持函数: " + upperStr);
            }
            System.out.println(results);
            System.out.println("计算结果: " + finalResult);
            return finalResult.toString();
            // 否则:没有公式代表不需要计算,直接提取List里面的数据
        } else {
            // 这里只会取列表第一个数据
            if (list.size() > 1) {
@@ -247,192 +392,151 @@
    /**
     * 解析String数据
     * @param data 采集到的文件字符串
     *
     * @param data       采集到的文件字符串
     * @param dataConfig 用户配置好的x,y轴定位数据与参照物
     * @return
     */
    private static Map<String, String> analysisTxt(String data, Map<String, List<DataConfig>> dataConfig) {
        Map<String, String> map = new HashMap<>();
        dataConfig.forEach((k, v) -> {
            List<Object> list = new ArrayList<>();
            for (int config = 0; config < v.size(); config++) {
                String referx = v.get(config).getReferx();
                String refery = v.get(config).getRefery();
                String xResult = null;
                String yResult = null;
                // 通过\n将字符串分割为行
                String[] aColumnY = data.split("\n");
                // 该循环得出用户配置的y轴
                for (int i = 0; i < aColumnY.length; i++) {
                    // 得出用户配置的x轴
                    String[] aLineX = aColumnY[i].split(",");
                    for (int j = 0; j < aLineX.length; j++) {
                        if (ObjectUtils.isNotEmpty(referx) && aLineX[j].contains(referx)) {
                            try {
                                int x = Integer.parseInt(v.get(config).getX());
                                xResult = aLineX[j + x];
                            } catch (Exception e) {}
                        }
                        if (ObjectUtils.isNotEmpty(refery) && aLineX[j].contains(refery)) {
                            try {
                                int y = Integer.parseInt(v.get(config).getY());
                                String[] split = aColumnY[i + y].split(",");
                                yResult = split[split.length - 1];
                            } catch (Exception e) {}
                        }
                    }
                }
                if (ObjectUtils.isNotEmpty(xResult) && ObjectUtils.isNotEmpty(yResult)) {
                    if(xResult.equals(yResult)) {
                        list.add(xResult);
                    } else {
                        throw new ErrorException(k + "项目X轴值:" + xResult + ",Y轴值:" + yResult + "取得的数据不相同!请检查数采配置!");
                    }
                }
            }
            List<Object> list = analyzeData(data, v, k, ",");
            // 进行公式计算
            if (list.size() > 0) {
                String resultValue = calculationFormula(list, v.get(0), k);
                map.put(k, resultValue);
            } else {
                map.put(k, null);
            }
            String resultValue = calculationFormula(list, v.get(0), k);
            map.put(k, resultValue);
        });
        return map;
    }
    /**
     *
     * @param data 采集到的文件字符串
     * @param data       采集到的文件字符串
     * @param dataConfig 用户配置好的x,y轴定位数据与参照物
     * @return
     */
    private static Map<String, String> analysisString(String data, Map<String, List<DataConfig>> dataConfig) {
        String processingDataAfterSpaces = data.replaceAll("  +", splitIdentifier).replaceAll("\r", "");
        String processingDataAfterSpaces = data
                .replaceAll("  +", splitIdentifier)
                .replaceAll("\r", "")
                .replaceAll(" ", "");
        Map<String, String> map = new HashMap<>();
        dataConfig.forEach((k, v) -> {
            List<Object> list = new ArrayList<>();
            for (int config = 0; config < v.size(); config++) {
                String referx = v.get(config).getReferx();
                String refery = v.get(config).getRefery();
                String xResult = null;
                String yResult = null;
                // 通过\n将字符串分割为行
                String[] aColumnY = processingDataAfterSpaces.split("\n");
                // 该循环得出用户配置的y轴
                for (int i = 0; i < aColumnY.length; i++) {
                    if (aColumnY[i].replaceAll(" ", "").contains(refery.replaceAll(" ", ""))) {
                        int y = Integer.parseInt(v.get(config).getY());
                        int x = Integer.parseInt(v.get(config).getX());
                        String[] split = aColumnY[i + y].split(splitIdentifier);
                        for (int i1 = 0; i1 < split.length; i1++) {
                            if (split[i1].replaceAll(" ", "").equals(referx.replaceAll(" ", ""))) {
//                                split[i1 + x]
                            }
                        }
//                        String[] aLineX = aColumnY[i].split(splitIdentifier);
//                        try {
//                            int y = Integer.parseInt(v.get(config).getY());
//                            String[] split = aColumnY[i + y].split(splitIdentifier);
//                            yResult = split[split.length - 1];
//                        } catch (Exception e) {}
                    }
                    // 得出用户配置的x轴
//                    for (int j = 0; j < aLineX.length; j++) {
//                        if (ObjectUtils.isNotEmpty(referx) && aLineX[j].replaceAll(" ", "").contains(referx.replaceAll(" ", ""))) {
//                            try {
//                                int x = Integer.parseInt(v.get(config).getX());
//                                xResult = aLineX[j + x];
//                            } catch (Exception e) {}
//                        }
//
//                    }
                }
                if (ObjectUtils.isNotEmpty(yResult)) {
                    yResult = yResult.replaceAll(" ", "");
                    // 结果包含特殊字符,需要剔除掉
                    if(yResult.contains("=")) {
                        String[] split = yResult.split("=");
                        list.add(split[split.length - 1]);
                    } else if (yResult.contains(":")) {
                        String[] split = yResult.split(":");
                        list.add(split[split.length - 1].replaceAll("%",  ""));
                    }
                }
                System.out.println(xResult + "=========" + yResult);
                if (ObjectUtils.isNotEmpty(xResult) && ObjectUtils.isNotEmpty(yResult)) {
                    if(xResult.equals(yResult)) {
                        list.add(xResult);
                    } else {
                        throw new ErrorException("X轴值:" + xResult + ",Y轴值:" + yResult + "取得的数据不相同!请检查数采配置!");
                    }
                }
            }
            List<Object> list = analyzeData(processingDataAfterSpaces, v, k, splitIdentifier);
            // 进行公式计算
            if (list.size() > 0) {
                String resultValue = calculationFormula(list, v.get(0), k);
                map.put(k, resultValue);
            } else {
                map.put(k, null);
            }
            String resultValue = calculationFormula(list, v.get(0), k);
            map.put(k, resultValue);
        });
        return map;
    }
    /**
     * 取X,Y两个定位
     * @param data 采集到的文件字符串
     *
     * @param data       采集到的文件字符串
     * @param dataConfig 用户配置好的x,y轴定位数据与参照物
     * @return
     */
    public static Map<String, String> analysisList(String data, Map<String, List<DataConfig>> dataConfig) {
        Map<String, String> map = new HashMap<>();
        dataConfig.forEach((k, v) -> {
            List<Object> list = new ArrayList<>();
            for (int config = 0; config < v.size(); config++) {
                String referx = v.get(config).getReferx();
                String refery = v.get(config).getRefery();
                String xResult = null;
                String yResult = null;
                // 通过\n将字符串分割为行
                String[] aColumnY = data.split("\n");
                // 该循环得出用户配置的y轴
                for (int i = 0; i < aColumnY.length; i++) {
                    // 得出用户配置的x轴
                    String[] aLineX = aColumnY[i].split(splitIdentifier);
                    for (int j = 0; j < aLineX.length; j++) {
                        if (ObjectUtils.isNotEmpty(referx) && referx.equals(aLineX[j])) {
                            try {
                                int x = Integer.parseInt(v.get(config).getX());
                                xResult = aLineX[j + x];
                            } catch (Exception e) {}
                        }
                        if (ObjectUtils.isNotEmpty(refery) && refery.equals(aLineX[j])) {
                            try {
                                int y = Integer.parseInt(v.get(config).getY());
                                String aColumnData = aColumnY[i + y]; // 获取到第Y行的数据
                                yResult = aColumnData.split(splitIdentifier)[j];
                            } catch (Exception e) {}
                        }
                    }
                }
                if (ObjectUtils.isNotEmpty(xResult) && ObjectUtils.isNotEmpty(yResult)) {
                    if(xResult.equals(yResult)) {
                        list.add(xResult);
                    } else {
                        throw new ErrorException("X轴值:" + xResult + ",Y轴值:" + yResult + "取得的数据不相同!请检查数采配置!");
                    }
                }
            }
            // 用户可能给一个子项目配置了多个配置,即一个项目取多个值,所以需要循环
            List<Object> list = analyzeData(data, v, k, splitIdentifier);
            // 进行公式计算
            if (list.size() > 0) {
                String resultValue = calculationFormula(list, v.get(0), k);
                map.put(k, resultValue);
            } else {
                map.put(k, null);
            }
            String resultValue = calculationFormula(list, v.get(0), k);
            map.put(k, resultValue);
        });
        return map;
    }
    // 由于在方法中会大量的判断,所以做一个方法
    private static int getXOrY(String value, String k, String tips) {
        try {
            return Integer.parseInt(value);
        } catch (NumberFormatException e) {
            throw new ErrorException(k + ":未配置" + tips + "坐标轴的值!");
        }
    }
    // 防止参照物为空报错,进行判断如果为空赋值空字符
    private static String getRefer(String refer) {
        return ObjectUtils.isNotEmpty(refer) ? refer.replaceAll(" ", "") : "";
    }
    public static List<Object> analyzeData(String data, List<DataConfig> v, String k, String split) {
        List<Object> list = new ArrayList<>();
        for (int config = 0; config < v.size(); config++) {
            // 取两个用户配置的参照物
            String referx = getRefer(v.get(config).getReferx());
            String refery = getRefer(v.get(config).getRefery());
            // 最终结果
            String result = null;
            // 通过\n将字符串分割为行
            String[] aColumnY = data.replaceAll(" ", "").split("\n");
            Integer end = null;
            // 采集数据:Y轴
            for (int i = 0; i < aColumnY.length; i++) {
                // 取x的值,防止报错
                int x = getXOrY(v.get(config).getX(), k, "X");
                // 如果Y与X用户都配置了则执行
                if (ObjectUtils.isNotEmpty(refery)) {
                    // 取Y坐标值
                    int y = getXOrY(v.get(config).getY(), k, "Y");
                    // 缓存Y的结束值
                    if (ObjectUtils.isEmpty(end) && aColumnY[i].contains(refery)) {
                        end = i + y;
                    }
                    // 判断是否在参照物为起到,Y坐标值为最终范围
                    if (ObjectUtils.isNotEmpty(end) && i <= end) {
                        String[] aLineX = aColumnY[i].split(split);
                        for (int j = 0; j < aLineX.length; j++) {
                            if (aLineX[j].contains(referx)) {
                                try {
                                    result = aLineX[j + x];
                                } catch (Exception e) {
                                    throw new ErrorException(k + ":X轴定位超出!");
                                }
                                break;
                            }
                        }
                    }
                    // 如果只配置了X,则执行下面的代码
                } else if (aColumnY[i].contains(referx) && ObjectUtils.isEmpty(refery)) {
                    String[] aLineX = aColumnY[i].split(split);
                    for (int j = 0; j < aLineX.length; j++) {
                        if (aLineX[j].contains(referx)) {
                            try {
                                result = aLineX[j + x];
                            } catch (Exception e) {
                                throw new ErrorException(k + ":X轴定位超出!");
                            }
                        }
                    }
                }
            }
            // 防止计算公式的时候出现:[null] 这种数据
            if (ObjectUtils.isNotEmpty(result)) {
                String formatProcessing = getFormatProcessing(result);
                list.add(formatProcessing);
            }
        }
        return list;
    }
    public static String getFormatProcessing(String value) {
        value = value.replaceAll("%", "");
        if (value.contains("=")) {
            String[] split = value.split("=");
            return split[split.length - 1];
        } else if (value.contains(":")) {
            String[] split = value.split(":");
            return split[split.length - 1];
        } else {
            return value;
        }
    }
    public static String getIp(HttpServletRequest request) {
        String ipAddress = request.getRemoteAddr();
        // 防止回环地址变为IPv6
        return ipAddress.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ipAddress;
    }
}