From 09f10567839584f25ccb199758103da5ee3d2aa6 Mon Sep 17 00:00:00 2001 From: ZZ Date: Fri, 8 Apr 2022 15:30:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E8=A1=A8=E8=BE=BE=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xhpc-modules/xhpc-order/pom.xml | 13 +++-- .../com/xhpc/order/service/impl/Calc.java | 56 +++++++++---------- .../com/xhpc/pp/logic/OrderDataLogic.java | 2 +- 3 files changed, 37 insertions(+), 34 deletions(-) diff --git a/xhpc-modules/xhpc-order/pom.xml b/xhpc-modules/xhpc-order/pom.xml index f1a31b0a..d5157f70 100644 --- a/xhpc-modules/xhpc-order/pom.xml +++ b/xhpc-modules/xhpc-order/pom.xml @@ -103,11 +103,16 @@ com.ruoyi ruoyi-common-log + + com.udojava + EvalEx + 2.7 + - - - - + + + + diff --git a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/Calc.java b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/Calc.java index 19efaec0..1965fcc4 100644 --- a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/Calc.java +++ b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/Calc.java @@ -1,50 +1,49 @@ package com.xhpc.order.service.impl; -import org.springframework.expression.Expression; -import org.springframework.expression.ExpressionParser; -import org.springframework.expression.spel.standard.SpelExpressionParser; -import org.springframework.expression.spel.support.StandardEvaluationContext; +import com.udojava.evalex.Expression; import java.io.IOException; import java.io.Reader; import java.io.StreamTokenizer; import java.io.StringReader; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.HashMap; import java.util.Map; +import java.util.regex.Pattern; public class Calc { + private static String regex = "^[a-zA-Z]+$"; + private static Pattern pattern = Pattern.compile(regex); + public static void main(String[] argv) { - test("-1 + 2", 1); - test("2 * (3 * (4 + 5)) / 9 / 6", 1); -// test("max(1, 2 + 3)", 5); -// test("min(3 - 1, 1)", 1); + Map map = new HashMap<>(); + map.put("T", Double.valueOf(0.7)); + String ruleExpression = "T + 10%"; + double rs = eval(ruleExpression, map); + System.out.println(rs); + System.out.println(0.7 + 0.1); + } + + public static double eval(String ruleExpression, Map params) { - Map map = new HashMap<>(); - map.put("totalPower", new BigDecimal("400000.000000")); - StandardEvaluationContext stdContext = new StandardEvaluationContext(); - stdContext.setVariables(map); - String ruleExpression = "#totalPower >= 500000 ? 'e1' : 'e2'"; - // Evaluate the SpEL expression - ExpressionParser parser = new SpelExpressionParser(); - Expression expression = parser.parseExpression(ruleExpression); - String rs = expression.getValue(stdContext, String.class); - System.out.println(rs); - ruleExpression = "#totalPower + 500000"; - expression = parser.parseExpression(ruleExpression); - rs = expression.getValue(stdContext, String.class); - System.out.println(rs); - ruleExpression = "#totalPower - (0.03% * 2%)"; -// expression = parser.parseExpression(ruleExpression); -// rs = expression.getValue(stdContext, String.class); -// System.out.println(rs); String[] split = ruleExpression.split("[()*/\\-+?]"); for (String splitValue : split) { - System.out.println(splitValue); + if (splitValue.endsWith("%")) { + BigDecimal rate = new BigDecimal(splitValue.trim().replace("%", "")); + ruleExpression = ruleExpression.replace(splitValue, rate.divide(BigDecimal.valueOf(100)).setScale(2, + RoundingMode.HALF_UP).toString()); + } else { + if (pattern.matcher(splitValue.trim()).matches()) { + ruleExpression = ruleExpression.replace(splitValue, params.get(splitValue.trim()).toString()); + } + } } - + Expression expression = new Expression(ruleExpression); + expression.setPrecision(3); + return expression.eval().doubleValue(); } private static void test(String s, double x) { @@ -78,7 +77,6 @@ public class Calc { * mulop = "*" | "/" * * - * @param s the string to be evaluated. * @see * Recursive descent parser. */ diff --git a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/OrderDataLogic.java b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/OrderDataLogic.java index 36081cc9..a1b85540 100644 --- a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/OrderDataLogic.java +++ b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/logic/OrderDataLogic.java @@ -78,7 +78,7 @@ public class OrderDataLogic implements ServiceLogic { log.error(">>INVALID order [{}] detected. MUST check the system or [{}].<<", orderNo, gunkey); } String resultStr = "6815".concat(req.get("seqhex").toString()).concat("0040").concat(orderNo); - if (r != null && r.getCode() == 200) { + if ((r != null && r.getCode() == 200) || (r != null && r.getMsg() != null && r.getMsg().contains("重复结算"))) { resultStr = resultStr.concat(ServiceResult.HEX_00); resultStr = resultStr.concat(CRCCalculator.calcCrc(resultStr)); return new ServiceResult(HexUtils.toBytes(resultStr), ServiceResult.OK);