Jelajahi Sumber

中间计量公式/解析器负号兼容性bug

yangyj 1 tahun lalu
induk
melakukan
39931ff1ac

+ 15 - 3
blade-service/blade-manager/src/main/java/com/jfireel/expression/parse/impl/NumberParser.java

@@ -1,13 +1,17 @@
 package com.jfireel.expression.parse.impl;
 
+import com.jfireel.expression.Expression;
 import com.jfireel.expression.node.CalculateNode;
 import com.jfireel.expression.node.impl.NumberNode;
 import com.jfireel.expression.parse.Invoker;
 import com.jfireel.expression.token.Operator;
 import com.jfireel.expression.token.Symbol;
+import com.jfireel.expression.token.Token;
 import com.jfireel.expression.util.CharType;
 
 import java.util.Deque;
+import java.util.LinkedList;
+import java.util.Objects;
 
 public class NumberParser extends NodeParser {
 
@@ -27,15 +31,23 @@ public class NumberParser extends NodeParser {
             if (nodes.peek() != null && nodes.peek().type() == Symbol.LEFT_PAREN) {
                 // 这种情况下,-代表是一个负数
                 return true;
-            } else if (nodes.peek() != null && !(nodes.peek().type() instanceof Operator)) {
+            }  else if(nodes.peek() != null&&nodes.stream().anyMatch(e->e.type() == Token.METHOD)&&(nodes.peek().type() == Symbol.COMMA)){
+                return true;
+            } else if(nodes.peek()!=null&&nodes.size()>=2&& (nodes.peek().type() instanceof  Operator) && ((LinkedList)nodes).get(1) instanceof NumberNode){
+                return true;
+            }else if (nodes.peek() != null && !(nodes.peek().type() instanceof Operator)) {
                 // 这种情况下,-是一个操作符
                 return false;
-            } else {
+            }else {
                 throw new IllegalArgumentException("无法识别的-符号,不是负数也不是操作符,问题区间:" + el.substring(0, offset));
             }
         } else return CharType.isDigital(getChar(offset, el));
     }
 
+    public static void main(String[] args) {
+        System.out.println(Expression.parse("(2+2*3)*(1--1)").calculate().toString());
+    }
+
     @Override
     public int parse(String el, int offset, Deque<CalculateNode> nodes, int function, Invoker next) {
         if (!match(el, offset, nodes, function)) {
@@ -47,7 +59,7 @@ public class NumberParser extends NodeParser {
             offset += 1;
         }
         boolean hasDot = false;
-        while (CharType.isDigital(c = getChar(offset, el)) || (hasDot == false && c == '.')) {
+        while (CharType.isDigital(c = getChar(offset, el)) || (!hasDot && c == '.')) {
             offset++;
             if (c == '.') {
                 hasDot = true;

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeController.java

@@ -303,7 +303,7 @@ public class WbsTreeController extends BladeController {
          return set.contains(id);
      };
 
-   public final static Map<String,List<WbsFormElementVO>> MODEL_MAP = new HashMap<>();
+   public final static Map<String,List<WbsFormElementVO>> MODEL_MAP = new LinkedHashMap<>();
     static {
         MODEL_MAP.put(BaseInfo.ID,FormulaUtils.toElementVos(BaseInfo.class));
         MODEL_MAP.put(MeterPeriodInfo.ID,FormulaUtils.toElementVos(MeterPeriodInfo.class));

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/ITurnPointCalculator.java

@@ -20,7 +20,7 @@ import static org.springblade.manager.formula.TurnPoint.*;
  * @author yangyj
  */
 public interface ITurnPointCalculator {
-    Long VERSION=202311301530L;
+    Long VERSION=20240129L;
      String ZD_REG="(?i)zd\\d+";
      /*核心计算*/
     static List<TurnPoint> create(List<Map<String, Object>> data, LinkedHashMap<String, String> configMap,LevelInfo levelInfo) {

+ 14 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/StartupTimeListener.java

@@ -2,7 +2,9 @@ package org.springblade.manager.formula.impl;
 
 import org.jetbrains.annotations.NotNull;
 import org.springframework.boot.context.event.ApplicationReadyEvent;
+import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.context.ApplicationListener;
+import org.springframework.context.event.ContextRefreshedEvent;
 import org.springframework.stereotype.Component;
 
 import java.time.Instant;
@@ -18,10 +20,21 @@ public class StartupTimeListener implements ApplicationListener<ApplicationReady
 
     @Override
     public void onApplicationEvent(@NotNull ApplicationReadyEvent event) {
-        startupTime = Instant.now();
+        try{
+            startupTime = Instant.now();
+            /*清除缓存*/
+            cacheClear();
+        }catch (Exception e){
+            e.printStackTrace();
+        }
     }
 
     public static Instant getStartupTime() {
         return startupTime;
     }
+
+    @CacheEvict(value = {"data-model"}, allEntries = true)
+    public void cacheClear(){
+
+    }
 }

+ 6 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -38,6 +38,7 @@ import org.springblade.manager.service.IWbsTreePrivateService;
 import org.springblade.manager.vo.*;
 import org.springblade.system.cache.ParamCache;
 import org.springframework.beans.BeanUtils;
+import org.springframework.cache.annotation.Cacheable;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.scheduling.annotation.Async;
@@ -255,14 +256,18 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         }
     }
 
+
+    @Cacheable(cacheNames = "data-model")
     public List<TreeNodeVOByTabType> baseList() {
-        Map<String, String[]> titleMap = new HashMap<>();
+        Map<String, String[]> titleMap = new LinkedHashMap<>();
         titleMap.put(BaseInfo.TBN_CH, new String[]{BaseInfo.TBN, BaseInfo.ID});
         titleMap.put(MeterPeriodInfo.TBN_CH, new String[]{MeterPeriodInfo.TBN, MeterPeriodInfo.ID});
         titleMap.put(InterimPaymentCertificate.TBN_CH, new String[]{InterimPaymentCertificate.TBN, InterimPaymentCertificate.ID});
         titleMap.put(InterimPaymentSummary.TBN_CH, new String[]{InterimPaymentSummary.TBN, InterimPaymentSummary.ID});
         titleMap.put(SubprojectInterimPaymentSummary.TBN_CH, new String[]{SubprojectInterimPaymentSummary.TBN, SubprojectInterimPaymentSummary.ID});
         titleMap.put(SubInterimMeterPaySummary.TBN_CH, new String[]{SubInterimMeterPaySummary.TBN, SubInterimMeterPaySummary.ID});
+        titleMap.put(InterimMeterPaySummary.TBN_CH, new String[]{InterimMeterPaySummary.TBN, InterimMeterPaySummary.ID});
+        titleMap.put(InterimMeter.TBN_CH, new String[]{InterimMeter.TBN, InterimMeter.ID});
         return titleMap.entrySet().stream().map(kv -> {
             TreeNodeVOByTabType tn = new TreeNodeVOByTabType();
             tn.setTitle(kv.getKey());