Kaynağa Gözat

公式相关

yangyj 1 yıl önce
ebeveyn
işleme
9853bd38f6

+ 4 - 1
blade-common/src/main/java/org/springblade/common/utils/BaseUtils.java

@@ -96,7 +96,10 @@ public class BaseUtils {
         }
     }
 
-
+    /*最小分割片*/
+    public static int sliceNumber(Integer len,Integer capacity){
+        return (int)Math.ceil(len/(double)capacity);
+    }
     /**
      * @Description  判断对象是否为数值
      * @Param [value]

+ 1 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormData.java

@@ -226,7 +226,7 @@ public class FormData {
 
 
     /**
-     * 是否还需要执行公式
+     * 是否还需要处理
      */
     public Boolean verify() {
         return !this.finished;

+ 7 - 2
blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java

@@ -1758,10 +1758,15 @@ public class CustomFunction {
                 loop=200;
                 for (int k = 0; k < total - hzi; k++) {
                     BigDecimal tb;
+                    /*保证salt是大于等于1的正整数*/
+                    int salt=Math.max(1,(max - min) / 2);
                     if (rd.nextBoolean()) {
-                        tb = new BigDecimal(rd.nextInt(((max - min) / 2)) + max + 1).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);
+                        /*tb = new BigDecimal(rd.nextInt(((max - min) / 2)) + max + 1).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);*/
+                        tb = new BigDecimal(rd.nextInt(salt) + max + 1).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);
+
                     } else {
-                        tb = new BigDecimal(min - 1 - rd.nextInt(((max - min) / 2))).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);
+                       /* tb = new BigDecimal(min - 1 - rd.nextInt(((max - min) / 2))).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);*/
+                        tb = new BigDecimal(min - 1 - rd.nextInt(salt)).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);
                     }
                     if(tb.compareTo(BigDecimal.ZERO)==0&&loop>0){
                         loop--;

+ 3 - 0
blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java

@@ -139,6 +139,7 @@ public class FormulaUtils {
     public static void putEle(String f,List<FormData>  ele,Map<String, Object> currentMap,FormData fd){
         @SuppressWarnings("unchecked")
         Map<String,Object> em = (Map<String, Object>) currentMap.computeIfAbsent(E,(k)-> new HashMap<>());
+        /*如果输入输出元素都是1对1*/
         if(f.split("[/+\\-*]").length>1&&ele.stream().map(e->e.getCoordsList().size()).max(Comparator.comparingInt(e->e)).orElse(1)==1&&fd.getCoordsList().size()==1){
             ele.forEach(e->{
                 Object value=e.getValues().get(0).getValue();
@@ -271,6 +272,7 @@ public class FormulaUtils {
             if(data instanceof List){
                 List<Object> values = (List<Object>) data;
                 if(!nullOrBlank){
+                    /*不包含空白内容*/
                     values=values.stream().filter(StringUtils::isNotEmpty).collect(Collectors.toList());
                 }
                 if(values.size()>fd.getValues().size()){
@@ -603,6 +605,7 @@ public class FormulaUtils {
         return keywords.stream().anyMatch(s::contains);
     }
 
+
     /**回归·测试变量*/
     public static List<String> itemNames =Arrays.asList(
             ""

+ 83 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorCalc.java

@@ -32,7 +32,89 @@ public class ExecutorCalc extends FormulaExecutor {
         /*通用计算*/
         generalCalc(tec);
     }
+
     public void generalCalc(TableElementConverter tec){
+        /*关键内容,常量变量集合,计算时变量集合,依赖元素,公式,输出元素,是否批量运算*/
+        for(FormData fd:tec.formDataList){
+            if(fd.verify()){
+                Formula formula =fd.getFormula();
+                String f=formula.getFormula();
+                if(Func.isNotBlank(f)){
+                    try{
+                        Map<String, Object> currentMap = new HashMap<>(tec.constantMap);
+                        List<String>  relyList = fd.getFormula().getRelyList();
+                        if(CollectionUtil.isNotEmpty(relyList)){
+                            /*存在依赖*/
+                            List<FormData>  ele = new ArrayList<>();
+                            relyList.forEach(rely->{
+                                FormData formData=  tec.getFormDataMap().get(rely);
+                                if(formData!=null&&!formData.empty()){
+                                    ele.add(formData);
+                                }
+                            });
+                            /*并不是所有依赖都用FormData表示*/
+                            if(ele.size()<relyList.size()){
+                                tec.getLog().put(FormulaLog.RELY,fd.getCode()+"@"+fd.getEName()+"@"+fd.getFormula().getFormula().replaceAll("'", ""));
+                                continue;
+                            }
+                            FormulaUtils.putEle(f,ele,currentMap,fd);
+                            Object data = Expression.parse(formula.getFormula()).calculate(currentMap);
+                            FormulaUtils.write(fd,data);
+                        }else{
+                            Object data =Expression.parse(formula.getFormula()).calculate(currentMap);
+                            FormulaUtils.write(fd,data);
+                        }
+                    }catch (Exception e){
+                        e.printStackTrace();
+                        tec.getLog().put(FormulaLog.CALC,fd.getEName()+"("+formula+")");
+                    }
+
+                }
+                fd.setUpdate(1);
+            }
+        }
+
+    }
+
+
+    interface Calculation {
+        void calculate(Formula formula, List<FormData> ele, TableElementConverter tec);
+    }
+
+    static class SimpleCalculation implements Calculation{
+
+        @Override
+        public void calculate(Formula formula, List<FormData> ele, TableElementConverter tec) {
+
+        }
+    }
+
+    static class BatchCalculation implements  Calculation{
+
+        @Override
+        public void calculate(Formula formula, List<FormData> ele, TableElementConverter tec) {
+
+        }
+    }
+
+    interface DependenceHandler {
+        boolean handle(String rely, TableElementConverter tec);
+    }
+
+    static class FormDataDependenceHandler implements DependenceHandler {
+        @Override
+        public boolean handle(String rely, TableElementConverter tec) {
+            return false;
+        }
+    }
+
+    static class OtherDependenceHandler implements DependenceHandler {
+        @Override
+        public boolean handle(String rely, TableElementConverter tec) {
+            return false;
+        }
+    }
+    public void generalCalcOld(TableElementConverter tec){
         String checkTable ="";
         Optional<NodeTable> op=tec.getTableAll().stream().filter(e->StringUtils.isEquals(1,e.getTableType())).findAny();
         if(op.isPresent()){
@@ -92,4 +174,5 @@ public class ExecutorCalc extends FormulaExecutor {
     }
 
 
+
 }

+ 7 - 10
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorMeter.java

@@ -63,7 +63,7 @@ public class ExecutorMeter extends FormulaExecutor {
             String prefix=itf.getFormNumber();
             fn= fn.split("-")[0];
             if(BaseUtils.isNumber(fn)){
-                fn=String.valueOf(100*Integer.parseInt(fn)/100);
+                fn=String.valueOf(100*(Integer.parseInt(fn)/100));
             }
             if(fn.equals(prefix)){
                 return prefix;
@@ -78,8 +78,8 @@ public class ExecutorMeter extends FormulaExecutor {
 
     /*获取动态行最大行数,codeFind为相关元素码集合 */
     public Integer getLineSize(List<String> codeFind){
-        int line=10;
-        Optional<FormData> formDataOp=  tec.getFormDataList().stream().filter(e-> BaseUtils.inChain(codeFind,e.getCode())).findAny();
+        int line=19;
+        Optional<FormData> formDataOp=  tec.getFormDataMap().values().stream().filter(e->e.executable()&& BaseUtils.inChain(codeFind,e.getFormula().getRely())).findAny();
         if(formDataOp.isPresent()){
             FormData target = formDataOp.get();
            line= target.getCoordsList().size();
@@ -500,16 +500,13 @@ public class ExecutorMeter extends FormulaExecutor {
                 List<List<SubprojectInterimPaymentSummary>> ds = BaseUtils.splitList(v,capacity-1);
                 List<SubprojectInterimPaymentSummary> tmp = new ArrayList<>();
                 for(int n=0;n<pageSize;n++){
-                    List<SubprojectInterimPaymentSummary> currentPageData =null;
-                    if(ds.size()>n){
-                        currentPageData=ds.get(n);
-                        tmp.addAll(currentPageData);
-                    }
+                    List<SubprojectInterimPaymentSummary> currentPageData =ds.get(n);
+                    tmp.addAll(currentPageData);
                     int m=1;
                     if(pageSize-n==1){
                         m+=extra;
                     }
-                    int placeholderSize = capacity-m;
+                    int placeholderSize = capacity-m-currentPageData.size();
                     if(placeholderSize>0){
                         tmp.addAll(Collections.nCopies(placeholderSize,new SubprojectInterimPaymentSummary()));
                     }
@@ -793,7 +790,7 @@ public class ExecutorMeter extends FormulaExecutor {
         public void  builderFormDatas(Class<T> clazz){
             fdm = FormulaUtils.toFormDataMap(clazz);
             fieldDataFcMap =FormulaUtils.fieldDataFcMap(clazz);
-            capacity=getLineSize(new ArrayList<>(fdm.keySet()));
+            capacity=getLineSize(new ArrayList<>(fdm.keySet()).stream().filter(e->fieldDataFcMap.containsKey(e)).collect(Collectors.toList()));
             tec.getFormDataMap().putAll(fdm);
             dataList=new ArrayList<>();
         }

+ 2 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/TableElementConverter.java

@@ -470,9 +470,10 @@ public class TableElementConverter implements ITableElementConverter {
                    if(fds.size()>0){
                        int pageMax = fds.stream()
                                .filter(e -> !e.empty())
-                               .mapToInt(e -> e.getValues().size() / e.getCoordsList().size())
+                               .mapToInt(e -> BaseUtils.sliceNumber(e.getValues().size() ,e.getCoordsList().size()))
                                .max()
                                .orElse(1);
+                       /*初始化每页的数据集合*/
                        List<Map<String,Object>>  dataList = IntStream.range(0, pageMax)
                                .mapToObj(i -> new HashMap<String, Object>())
                                .collect(Collectors.toList());