zss
2024-08-01 54a33a391e211a4b2b97621501c6236527d32331
cnas-server/src/main/java/com/yuanchu/mom/utils/DataAcquisition.java
@@ -261,15 +261,13 @@
            formula = formula.replace("(", "(")
                    .replace(")", ")")
                    .replace(",", ",");
            //然后提取英文字母,全部转换为大写
            String[] strs = formula.split("[^A-Za-z]+");
            String upperStr = "";
            for (String str : strs) {
                upperStr += str.toUpperCase();
            }
            //然后提取公式
            String strs = formula.substring(0,formula.indexOf("("));
            String upperStr = strs.toUpperCase();
            if (upperStr.equals("")) {
                throw new ErrorException(formula + "里面的公式没有函数");
            }
            System.out.println(upperStr);
            //然后获取最外面括号里面的值,再根据","分割
            int start = formula.indexOf("(");
            int end = -1;
@@ -289,51 +287,47 @@
                throw new ErrorException("公式括号不匹配: " + formula);
            }
            String inner = formula.substring(start + 1, end);
            String argumentsStr = formula.substring(start + 1, end);
            List<String> arguments = new ArrayList<>();
            int depth = 0;
            int bracketCount = 0;
            StringBuilder currentArgument = new StringBuilder();
            for (
                    char c : inner.toCharArray()) {
                if (c == ',' && depth == 0) {
            for (char c : argumentsStr.toCharArray()) {
                if (c == ',' && bracketCount == 0) {
                    arguments.add(currentArgument.toString());
                    currentArgument.setLength(0);
                } else {
                    if (c == '(') {
                        depth++;
                    } else if (c == ')') {
                        depth--;
                    }
                    if (c == '(') bracketCount++;
                    if (c == ')') bracketCount--;
                    currentArgument.append(c);
                }
            }
            arguments.add(currentArgument.toString());
            String[] bracketStrs = arguments.toArray(new String[0]);
            List<BigDecimal> results = new ArrayList<>();
            for (
                    String expr : bracketStrs) {
            for (String expr : bracketStrs) {
                System.out.println("替换前" + expr);
                Pattern pattern = Pattern.compile("\\b\\d+\\b");
                Pattern pattern = Pattern.compile("([A-Z])(\\d+)");
                Matcher matcher = pattern.matcher(expr);
                StringBuffer sb = new StringBuffer();
                while (matcher.find()) {
                    int index = Integer.parseInt(matcher.group()) - 1;
                    String letter = matcher.group(1);
                    int index = Integer.parseInt(matcher.group(2)) - 1; // 将1-based转为0-based
                    if (index < bigDecimalList.size()) {
                        matcher.appendReplacement(sb, bigDecimalList.get(index).toString());
                    } else {
                        throw new ErrorException("表达式中的下标 " + index + " 超出范围");
                        throw new RuntimeException("公式中的下标 " + 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);
                    throw new IllegalArgumentException("无法计算公式: " + sb, e);
                }
            }
            // 根据函数名称进行相应计算