Browse Source

公式相关

yangyj 3 years ago
parent
commit
af228dff97

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

@@ -128,6 +128,19 @@ public class FormulaController {
     @ApiIgnore
     public R execute() {
         List<FormData> list = new ArrayList<>();
+        list.add(makeFd("MILE<M1,M2,M3,M4,M5,M6,M7,M8,M9>","MILE","M1,M2,M3,M4,M5,M6,M7,M8,M9"));
+        list.add(makeFd("","M1","",""));
+        list.add(makeFd("","M2","",""));
+        list.add(makeFd("","M3","",""));
+        list.add(makeFd("","M4","",""));
+        list.add(makeFd("","M5","",""));
+        list.add(makeFd("","M6","",""));
+        list.add(makeFd("","M7","",""));
+        list.add(makeFd("","M8","",""));
+        list.add(makeFd("","M9","",""));
+        list.add(makeFd("1+1/2","ta",""));
+        list.add(makeFd("6+6","tb",""));
+        list.add(makeFd("5000/90","tc",""));
         list.add(makeFd("FC.tree(trees,WP[snake])","t-f1",""));
         list.add(makeFd("FC.avg(E[ele852])","ele100","ele852"));
         list.add(makeFd("","ele852","",0,1,2,3,4,5,6));
@@ -147,7 +160,7 @@ public class FormulaController {
         list.add(makeFd("","zms","","19","5"));
         list.add(makeFd("FC.pow(E[zms],2)","pow","zms"));
 
-        this.service.execute(list,12563252L);
+        this.service.execute(list,12563252L,45646L);
        return R.success("执行完成");
     }
 

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/FormulaClientImpl.java

@@ -32,7 +32,7 @@ public class FormulaClientImpl implements  FormulaClient{
         list.add(makeFd("","b","",0,3,3,6,3,8));
         list.add(makeFd("","c","",0,5.5,3,7,3,9));
         list.add(makeFd("","d","",0,10,7,2,5,5));
-        service.execute(list,111111L);
+        service.execute(list,111111L,22222L);
     }
     public FormData makeFd(String fs,String code,String rely,Object ...obs){
         Formula f= new Formula();

+ 13 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/FormulaStrategy.java

@@ -0,0 +1,13 @@
+package org.springblade.manager.formula;
+
+import org.springblade.manager.dto.FormData;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author yangyj
+ */
+public interface FormulaStrategy extends IStrategy{
+    void execute(List<FormData> fds, Map<String,Object> constantMap);
+}

+ 25 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/FormulaStrategyFactory.java

@@ -0,0 +1,25 @@
+package org.springblade.manager.formula;
+
+import lombok.Data;
+import org.springblade.manager.dto.FormData;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author yangyj
+ * @Date 2022/7/15 16:11
+ * @description TODO
+ */
+@Component
+@Data
+public class FormulaStrategyFactory {
+
+    private final List<FormulaStrategy> testStrategyList;
+
+    public List<FormulaStrategy> get(FormData fd) {
+        return testStrategyList.stream().filter(t -> t.accept(fd)).collect(Collectors.toList());
+    }
+
+}

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/IFcHandler.java

@@ -1,5 +1,8 @@
 package org.springblade.manager.formula;
 
+/**
+ * @author yangyj
+ */
 public interface IFcHandler {
     void execute();
 }

+ 10 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/IStrategy.java

@@ -0,0 +1,10 @@
+package org.springblade.manager.formula;
+
+import org.springblade.manager.dto.FormData;
+
+/**
+ * @author yangyj
+ */
+public interface IStrategy {
+    boolean accept(FormData fd);
+}

+ 31 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaA.java

@@ -0,0 +1,31 @@
+package org.springblade.manager.formula.impl;
+
+import com.alibaba.cloud.commons.lang.StringUtils;
+import org.springblade.manager.dto.ElementData;
+import org.springblade.manager.dto.FormData;
+import org.springblade.manager.formula.FormulaStrategy;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author yangyj
+ * @Date 2022/7/15 16:13
+ * @description TODO
+ */
+@Component
+public class FormulaA implements FormulaStrategy {
+    private FormData cur;
+    @Override
+    public void execute(List<FormData> fds, Map<String,Object> constantMap) {
+        System.out.println(this.cur.getFormula().getFormula());
+        cur.getValues().add(new ElementData(1,1,"result_ta"));
+    }
+
+    @Override
+    public boolean accept(FormData fd) {
+        this.cur=fd;
+        return StringUtils.equals("ta", fd.getCode());
+    }
+}

+ 32 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaB.java

@@ -0,0 +1,32 @@
+package org.springblade.manager.formula.impl;
+
+import com.alibaba.cloud.commons.lang.StringUtils;
+import org.springblade.manager.dto.ElementData;
+import org.springblade.manager.dto.FormData;
+import org.springblade.manager.formula.FormulaStrategy;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author yangyj
+ * @Date 2022/7/15 16:13
+ * @description TODO
+ */
+@Component
+public class FormulaB implements FormulaStrategy {
+    private FormData cur;
+
+    @Override
+    public void execute(List<FormData> fds, Map<String,Object> constantMap) {
+        System.out.println(this.cur.getFormula().getFormula());
+        cur.getValues().add(new ElementData(1,1,"result_tb"));
+    }
+
+    @Override
+    public boolean accept(FormData fd) {
+        this.cur=fd;
+        return StringUtils.equals("ta", fd.getCode());
+    }
+}

+ 32 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaC.java

@@ -0,0 +1,32 @@
+package org.springblade.manager.formula.impl;
+
+import com.alibaba.cloud.commons.lang.StringUtils;
+import org.springblade.manager.dto.ElementData;
+import org.springblade.manager.dto.FormData;
+import org.springblade.manager.formula.FormulaStrategy;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author yangyj
+ * @Date 2022/7/15 16:13
+ * @description TODO
+ */
+@Component
+public class FormulaC implements FormulaStrategy {
+    private FormData cur;
+    @Override
+    public void execute(List<FormData> fds, Map<String,Object> constantMap) {
+        System.out.println(this.cur.getFormula().getFormula());
+        cur.getValues().add(new ElementData(1,1,"result_tc"));
+    }
+
+    @Override
+    public boolean accept(FormData fd) {
+        this.cur=fd;
+        return StringUtils.equals("ta", fd.getCode());
+    }
+
+}

+ 92 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaMileage.java

@@ -0,0 +1,92 @@
+package org.springblade.manager.formula.impl;
+
+import com.mixsmart.utils.FormulaUtils;
+import com.mixsmart.utils.ListUtils;
+import com.mixsmart.utils.StringUtils;
+import org.springblade.manager.dto.ElementData;
+import org.springblade.manager.dto.FormData;
+import org.springblade.manager.formula.FormulaStrategy;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author yangyj
+ * @Date 2022/7/18 11:50
+ * @description TODO
+ */
+@Component
+public class FormulaMileage implements FormulaStrategy {
+    private FormData cur;
+    public static final Pattern MILE_ARGS= Pattern.compile("(?<=MILE<)[^>]+(?=>)");
+    @Override
+    public void execute(List<FormData> fds, Map<String,Object> constantMap) {
+        List<ElementData> eds = cur.getValues();
+        Map<String,String[]> mileages = (Map<String, String[]>) constantMap.get("mileages");
+        if(ListUtils.isNotEmpty(eds)){
+            Matcher m= MILE_ARGS.matcher(cur.getCode());
+            if(m.find()){
+                String tmp =m.group();
+                tmp=tmp.replace("E[","").replace("]","");
+                List<String> cp = Arrays.asList(tmp.split(","));
+                Map<String,FormData> map = new LinkedHashMap<>();
+                List<FormData> listFd = new ArrayList<>();
+                fds.forEach(e->{
+                    if(cp.contains(e.getCode())){
+                        map.put(e.getCode(),e);
+                        listFd.add(e);
+                    }
+                });
+                if(listFd.size()<9){
+                    return;
+                }
+                /*测点名称*/
+                List<ElementData> a = map.get(cp.get(0)).getValues();
+                /*编号*/
+                List<ElementData> b = map.get(cp.get(2)).getValues();
+                int size=Math.min(a.size(),b.size());
+                for(int i=0;i<size;i++){
+                    ElementData ea=a.get(i);
+                    ElementData eb=b.get(i);
+                    String k =ea.getValue().toString();
+                    String jz=eb.getValue().toString();
+                    String[] coordinate = mileages.get(k+"@"+jz);
+                    Map xyz = FormulaUtils.triangleSquare("-5,+5");
+                    double dx = Double.parseDouble(xyz.get("X").toString());
+                    double dy = Double.parseDouble(xyz.get("Y").toString());
+                    double dz = Double.parseDouble(xyz.get("Z").toString());
+                    double scx= Double.parseDouble(coordinate[0]) + dx * 0.001;
+                    double scy= Double.parseDouble(coordinate[1]) + dy * 0.001;
+                    double sjx= Double.parseDouble(coordinate[0]);
+                    double sjy= Double.parseDouble(coordinate[1]);
+                    int index=ea.getIndex();
+                    int groupId=ea.getGroupId();
+                    /*实测x*/
+                    listFd.get(2).getValues().add(new ElementData(index,groupId,dx));
+                    /*实测y*/
+                    listFd.get(3).getValues().add(new ElementData(index,groupId,dx));
+                    /*设计x*/
+                    listFd.get(4).getValues().add(new ElementData(index,groupId,dx));
+                    /*设计x*/
+                    listFd.get(5).getValues().add(new ElementData(index,groupId,dx));
+                    /*设计dx*/
+                    listFd.get(6).getValues().add(new ElementData(index,groupId,dx));
+                    /*设计dy*/
+                    listFd.get(7).getValues().add(new ElementData(index,groupId,dx));
+                    /*设计ds*/
+                    listFd.get(8).getValues().add(new ElementData(index,groupId,dx));
+                }
+            }
+        }
+        this.cur.getFormula().setFormula("");
+    }
+
+    @Override
+    public boolean accept(FormData fd) {
+        this.cur=fd;
+        String f= fd.getFormula().getFormula();
+        return StringUtils.isNotEmpty(f)&&f.startsWith("MILE<");
+    }
+}

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

@@ -14,5 +14,5 @@ public interface IFormulaService extends BaseService<Formula> {
      *
      * @param list
      */
-    void execute(List<FormData> list,Long contractId );
+    void execute(List<FormData> list,Long contractId,Long primaryKeyId);
 }

+ 28 - 50
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -4,10 +4,7 @@ package org.springblade.manager.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.jfireel.expression.Expression;
-import com.mixsmart.utils.CustomFunction;
-import com.mixsmart.utils.ListUtils;
-import com.mixsmart.utils.ReflectionUtil;
-import com.mixsmart.utils.StringUtils;
+import com.mixsmart.utils.*;
 import lombok.AllArgsConstructor;
 import org.springblade.business.feign.MileageClient;
 import org.springblade.core.mp.base.BaseServiceImpl;
@@ -18,8 +15,9 @@ import org.springblade.manager.dto.FormData;
 import org.springblade.manager.dto.LocalVariable;
 import org.springblade.manager.entity.Formula;
 import org.springblade.manager.entity.WbsParam;
-import org.springblade.manager.entity.WbsTree;
+import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.formula.IFcHandler;
+import org.springblade.manager.formula.FormulaStrategyFactory;
 import org.springblade.manager.mapper.FormulaMapper;
 import org.springblade.manager.service.IFormulaService;
 import org.springblade.manager.service.IWbsTreeContractService;
@@ -43,6 +41,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     private final WbsParamServiceImpl wpService;
     private final MileageClient mileageClient;
     private final IWbsTreeContractService treeContractService;
+    private final FormulaStrategyFactory formulaStrategyFactory;
 
 
     public final static String WP="WP";
@@ -54,18 +53,28 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     public static final Pattern MILE_P = Pattern.compile("(?<=MILE<)([^,]+),([^,]+)(?=,)");
 
     @Override
-    public void execute(List<FormData> list ,Long contractId){
+    public void execute(List<FormData> list ,Long contractId,Long primaryKeyId){
 
+        /*变量准备*/
+        /*依赖排序*/
+        /*公式预处理*/
+        /*公式运算*/
+        System.out.println();
         Map<Boolean,List<FormData>> map = list.stream().collect(Collectors.partitioningBy(e->e!=null&&e.getFormula().getFormula().contains("E[")));
             List<FormData>total = new ArrayList<>();
             /*用来保存所有变量*/
             Map<String,Object> constantMap = new HashMap<>();
             /*预设变量start*/
-            List<WbsTree> trees = new ArrayList<>();
-            for(int i=0;i<6;i++){
-                 WbsTree t= new WbsTree();
-                 t.setDeptName("第"+i+"层");
-                 trees.add(t);
+            List<WbsTreeContract> trees = new ArrayList<>();
+            List<WbsTreeContract> nodes = treeContractService.searchParentAllNode(primaryKeyId,contractId);
+            if(CollectionUtil.isEmpty(nodes)){
+                for(int i=0;i<6;i++){
+                    WbsTreeContract t= new WbsTreeContract();
+                    t.setDeptName("第"+i+"层");
+                    trees.add(t);
+                }
+            }else{
+                trees=nodes;
             }
             List<WbsParam> wps = this.wpService.list(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getWbsId,123456));
             Map<String,Object> wpMap= new HashMap<>();
@@ -87,11 +96,10 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                   sort(rely,((rely.size()+1)/2)*rely.size());
                   total.addAll(rely);
              }
-
             if(CollectionUtil.isNotEmpty(total)){
                 /*变量环境加载*/
                 constantMap.put(WP,wpMap);
-                constantMap.put(CHAIN,trees.stream().map(WbsTree::getDeptName).collect(Collectors.toList()));
+                constantMap.put(CHAIN,trees.stream().map(WbsTreeContract::getDeptName).collect(Collectors.toList()));
                 for(FormData fd:total){
                       /*预处理公式脚本*/
                       String tmp =fd.getFormula().getFormula();
@@ -157,10 +165,14 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
                     fd.getFormula().setFormula(tmp);
                 }
+
+
+
+
                /*公式执行*/
                 for(FormData fd:total){
                     Formula formula= fd.getFormula();
-
+                    formulaStrategyFactory.get(fd).forEach(e->e.execute(list,constantMap));
                     if(formula!=null){
                         String f=formula.getFormula();
                         if(Func.isNotBlank(f)){
@@ -326,42 +338,6 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             }
         }
     }
-    public static final Pattern MILE_ARGS= Pattern.compile("(?<=MILE<)[^>]+(?=>)");
-    /**
-     * @Description
-     * @Param [fd]
-     * @return void
-     * @Author yangyj
-     * @Date 2022.07.08 16:39
-     **/
-    public void mileageCalc(FormData fd,List<FormData> fds,Map<String,Object> constantMap){
-           List<ElementData> eds = fd.getValues();
-           Map<String,String[]> mileages = (Map<String, String[]>) constantMap.get("mileages");
-           if(ListUtils.isNotEmpty(eds)){
-               Matcher m= MILE_ARGS.matcher(fd.getCode());
-               if(m.find()){
-                   String tmp =m.group();
-                   tmp=tmp.replace("E[","").replace("]","");
-                   List<String> cp = Arrays.asList(tmp.split(","));
-                   Map<String,FormData> map = new LinkedHashMap<>();
-                   fds.forEach(e->{
-                       if(cp.contains(e.getCode())){
-                           map.put(e.getCode(),fd);
-                       }
-                   });
-                   /*测点名称*/
-                   List<ElementData> a = map.get(cp.get(0)).getValues();
-                   /*编号*/
-                   List<ElementData> b = map.get(cp.get(2)).getValues();
-                   int size=Math.min(a.size(),b.size());
-                   for(int i=0;i<size;i++){
-                        String k =a.get(i).getValue().toString();
-                        String jz=b.get(i).getValue().toString();
-                        String[] coordinate = mileages.get(k+"@"+jz);
-                   }
-               }
-           }
-    }
 
 /*    public static void main(String[] args) {
         Set<Class<?>> classList =  ReflectionUtil.getClassSetBySuper(IFcHandler.class);
@@ -378,6 +354,8 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         System.out.println();
     }*/
 
+
+
 }