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 1965fcc4..1762ea04 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 @@ -20,20 +20,26 @@ public class Calc { public static void main(String[] argv) { Map map = new HashMap<>(); - map.put("T", Double.valueOf(0.7)); - String ruleExpression = "T + 10%"; + map.put("T", Double.valueOf(0.1234)); + String ruleExpression = "T * 30%"; double rs = eval(ruleExpression, map); System.out.println(rs); System.out.println(0.7 + 0.1); } + //计算中采用5位小数(四舍五入),结果保留4位小数(截断) public static double eval(String ruleExpression, Map params) { + return eval(ruleExpression, params, RoundingMode.FLOOR); + } + + public static double eval(String ruleExpression, Map params, RoundingMode rm) { + String[] split = ruleExpression.split("[()*/\\-+?]"); for (String splitValue : split) { if (splitValue.endsWith("%")) { BigDecimal rate = new BigDecimal(splitValue.trim().replace("%", "")); - ruleExpression = ruleExpression.replace(splitValue, rate.divide(BigDecimal.valueOf(100)).setScale(2, + ruleExpression = ruleExpression.replace(splitValue, rate.divide(BigDecimal.valueOf(100)).setScale(5, RoundingMode.HALF_UP).toString()); } else { if (pattern.matcher(splitValue.trim()).matches()) { @@ -42,8 +48,9 @@ public class Calc { } } Expression expression = new Expression(ruleExpression); - expression.setPrecision(3); - return expression.eval().doubleValue(); + expression.setPrecision(5); + expression.setRoundingMode(RoundingMode.HALF_UP); + return expression.eval().setScale(4, rm).doubleValue(); } private static void test(String s, double x) { 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 a1b85540..a346ae94 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 @@ -20,6 +20,7 @@ import org.springframework.stereotype.Component; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; import java.util.Map; import static com.xhpc.common.data.redis.StaticBeanUtil.REDIS; @@ -34,8 +35,17 @@ public class OrderDataLogic implements ServiceLogic { @Autowired private PileOrderService pileOrderService; - @Autowired - private ChargingController chargingController; + private static Map SM = new HashMap<>(); + + static { + SM.put("40", "APP 远程停止"); + SM.put("41", "SOC 达到 100%"); + SM.put("42", "充电电量满足设定条件"); + SM.put("43", "充电金额满足设定条件"); + SM.put("44", "充电时间满足设定条件"); + SM.put("45", "手动停止充电"); + SM.put("72", "急停按钮停止充电(0X72)"); + } @Override public ServiceResult service(ServiceParameter sp) throws Exception { @@ -54,6 +64,7 @@ public class OrderDataLogic implements ServiceLogic { cacheOrderData.setCreateTime(DateUtil.now()); cacheOrder.put("orderData", cacheOrderData); cacheOrder.put("status", "已结束"); + cacheOrder.put("stopReason", translate(cacheOrderData.getStopReason())); REDIS.setCacheMap(orderkey, cacheOrder); String gunkey = "gun:".concat(orderData.getPileNo()).concat(orderData.getGunId()); Map cacheGun = REDIS.getCacheMap(gunkey); @@ -89,7 +100,29 @@ public class OrderDataLogic implements ServiceLogic { } } - private CacheOrderData translate(OrderData orderData) throws InvocationTargetException, IllegalAccessException, InstantiationException { + private String translate(String stopReason) { + + String sr = SM.get(stopReason); + if (sr == null) { + final Integer stopReasonInt = Integer.valueOf(stopReason, 16); + if (stopReasonInt <= 0x49) { + sr = "充电完成(0X".concat(stopReason).concat(")"); + } else if (stopReasonInt <= 0x69) { + sr = "充电启动失败(0X".concat(stopReason).concat(")"); + } else if (stopReasonInt < 0x90) { + sr = "充电异常中止(0X".concat(stopReason).concat(")"); + } else if (stopReasonInt == 0x90) { + sr = "未知原因中止(0X".concat(stopReason).concat(")"); + } else { + sr = "未知原因中止(UC_0X".concat(stopReason).concat(")"); + } + } + return sr; +// } + } + + private CacheOrderData translate(OrderData orderData) throws InvocationTargetException, IllegalAccessException, + InstantiationException { Class codclz = CacheOrderData.class; Class odclz = OrderData.class; diff --git a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/utils/security/CacheDataUtils.java b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/utils/security/CacheDataUtils.java index aaedb618..2f471d32 100644 --- a/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/utils/security/CacheDataUtils.java +++ b/xhpc-modules/xhpc-power-pile/src/main/java/com/xhpc/pp/utils/security/CacheDataUtils.java @@ -23,7 +23,7 @@ public class CacheDataUtils { Object tarobj = null; for (Constructor c : constructors) { if (c.getParameters().length == 0) { - tarobj = constructors[0].newInstance(); + tarobj = c.newInstance(); for (Field tarfield : targetfields) { String tarFieldName = tarfield.getName(); String srcval = null;