yangyj 2 жил өмнө
parent
commit
30e63f2c22

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

@@ -91,7 +91,11 @@ public class ElementData {
     }
     }
 
 
     public String stringValue(){
     public String stringValue(){
-        return this.value.toString();
+        if(Func.isNotEmpty(this.value)){
+            return this.value.toString();
+        }else{
+            return null;
+        }
     }
     }
 
 
 
 

+ 2 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/FormulaType.java

@@ -14,7 +14,8 @@ public enum FormulaType {
     DATE(3,"时间相关"),
     DATE(3,"时间相关"),
     COLLECT(4,"数组、集合"),
     COLLECT(4,"数组、集合"),
     LOGIC(5,"逻辑"),
     LOGIC(5,"逻辑"),
-    SPECIFIC(6,"特殊");
+    SPECIFIC(6,"特殊"),
+    WBS(7,"WBS");
 
 
 
 
     private final String name;
     private final String name;

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

@@ -704,21 +704,21 @@ public class CustomFunction {
 	}
 	}
 	public static Object avg(List<Object> list) {
 	public static Object avg(List<Object> list) {
 		if(ListUtils.isNotEmpty(list)){
 		if(ListUtils.isNotEmpty(list)){
-			return    list.stream().filter(StringUtils::isNumber).map(StringUtils::handleNull).mapToDouble(Double::parseDouble).average();
+			return    list.stream().filter(StringUtils::isNumber).map(StringUtils::handleNull).mapToDouble(Double::parseDouble).average().getAsDouble();
 		}
 		}
 		return "";
 		return "";
 	}
 	}
 
 
 	public static Object max(List<Object> list) {
 	public static Object max(List<Object> list) {
 		if(ListUtils.isNotEmpty(list)){
 		if(ListUtils.isNotEmpty(list)){
-			return    list.stream().filter(StringUtils::isNumber).map(StringUtils::handleNull).mapToDouble(Double::parseDouble).max();
+			return    list.stream().filter(StringUtils::isNumber).map(StringUtils::handleNull).mapToDouble(Double::parseDouble).max().getAsDouble();
 		}
 		}
 		return "";
 		return "";
 	}
 	}
 
 
 	public static Object min(List<Object> list) {
 	public static Object min(List<Object> list) {
 		if(ListUtils.isNotEmpty(list)){
 		if(ListUtils.isNotEmpty(list)){
-			return    list.stream().filter(StringUtils::isNumber).map(StringUtils::handleNull).mapToDouble(Double::parseDouble).min();
+			return    list.stream().filter(StringUtils::isNumber).map(StringUtils::handleNull).mapToDouble(Double::parseDouble).min().getAsDouble();
 		}
 		}
 		return "";
 		return "";
 	}
 	}

+ 29 - 7
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaTurnPoint.java

@@ -2,17 +2,16 @@ package org.springblade.manager.formula.impl;
 
 
 import com.mixsmart.utils.StringUtils;
 import com.mixsmart.utils.StringUtils;
 import lombok.Data;
 import lombok.Data;
+import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.dto.ElementData;
 import org.springblade.manager.dto.ElementData;
 import org.springblade.manager.dto.FormData;
 import org.springblade.manager.dto.FormData;
+import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.formula.FormulaStrategy;
 import org.springblade.manager.formula.FormulaStrategy;
 import org.springblade.manager.formula.LevelInfo;
 import org.springblade.manager.formula.LevelInfo;
 import org.springblade.manager.formula.NextPoint;
 import org.springblade.manager.formula.NextPoint;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
-
-import java.math.BigDecimal;
 import java.util.*;
 import java.util.*;
-import java.util.stream.Collectors;
 
 
 /**
 /**
  * @author yangyj
  * @author yangyj
@@ -31,6 +30,7 @@ public class FormulaTurnPoint implements FormulaStrategy {
     @Override
     @Override
     public void execute(List<FormData> fds, Map<String, Object> constantMap) {
     public void execute(List<FormData> fds, Map<String, Object> constantMap) {
         LinkedHashMap<String,FormData> dataSourceMap = new LinkedHashMap<>();
         LinkedHashMap<String,FormData> dataSourceMap = new LinkedHashMap<>();
+        TurnPointCalculator tpc = new TurnPointCalculator();
         List<String> args=cur.getFormula().getRelyList();
         List<String> args=cur.getFormula().getRelyList();
         this.args=args;
         this.args=args;
         if(Func.isNotEmpty(args)) {
         if(Func.isNotEmpty(args)) {
@@ -38,6 +38,10 @@ public class FormulaTurnPoint implements FormulaStrategy {
                 Optional<FormData> ov =fds.stream().filter(e -> k.equals(e.getCode())).findFirst();
                 Optional<FormData> ov =fds.stream().filter(e -> k.equals(e.getCode())).findFirst();
                 ov.ifPresent(formData -> dataSourceMap.put(k, formData));
                 ov.ifPresent(formData -> dataSourceMap.put(k, formData));
             });
             });
+            /*包含所有基本元素,不满足就终止*/
+            if(dataSourceMap.size()<KEYS.size()){
+                return;
+            }
             CompositeDataAccess cda = new CompositeDataAccess(dataSourceMap);
             CompositeDataAccess cda = new CompositeDataAccess(dataSourceMap);
             cda.cursorReset();
             cda.cursorReset();
             while (cda.hasNext()) {
             while (cda.hasNext()) {
@@ -56,17 +60,36 @@ public class FormulaTurnPoint implements FormulaStrategy {
                           cda.close();
                           cda.close();
                      }
                      }
                 }else{
                 }else{
+                    NextPoint np =  new NextPoint();
                     ElementData gc = map.get(c("实际标高"));
                     ElementData gc = map.get(c("实际标高"));
+                    if(Func.isNotEmpty(gc)){
+                       np.setSc(gc.stringValue());
+                    }
                     ElementData qs = map.get(c("前视"));
                     ElementData qs = map.get(c("前视"));
-                    TurnPointCalculator tpc = new TurnPointCalculator();
-                    NextPoint nextPoint = new NextPoint(qs.stringValue(),gc.stringValue());
+                    if(Func.isNotEmpty(qs)){
+                        np.setQ(qs.stringValue());
+                    }
+                    ElementData sj = map.get(c("设计标高"));
+                    if(Func.isNotEmpty(sj)){
+                        np.setH(sj.stringValue());
+                    }
+                    ElementData hs = map.get(c("后视"));
+                    ElementData yg = map.get(c("仪器高"));
+                    if(Func.isNotEmpty(hs)&&Func.isNotEmpty(yg)&&Func.isNotBlank(hs.stringValue())&&Func.isNotBlank(yg.stringValue())){
+                        np.setZd(Boolean.TRUE);
+                        np.setBmd(yg.stringValue());
+                    }
+                    tpc.vacancy(levelInfo,np);
+                    /* 插入过程没有确定前先不生成转点
                     List<NextPoint> nextPointList= tpc.turnPoint(levelInfo,nextPoint);
                     List<NextPoint> nextPointList= tpc.turnPoint(levelInfo,nextPoint);
-                    /**怎么动态插入数据?*/
+                     */
                 }
                 }
             }
             }
         }
         }
     }
     }
 
 
+
+
     private String c(String name){
     private String c(String name){
         if(Func.isNotEmpty(name)&&Func.isNotEmpty(this.args)){
         if(Func.isNotEmpty(name)&&Func.isNotEmpty(this.args)){
             int  index= KEYS.indexOf(name);
             int  index= KEYS.indexOf(name);
@@ -87,5 +110,4 @@ public class FormulaTurnPoint implements FormulaStrategy {
 
 
 
 
 
 
-
 }
 }

+ 31 - 37
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/TurnPointCalculator.java

@@ -195,70 +195,64 @@ public class TurnPointCalculator implements ITurnPointCalculator {
         return result;
         return result;
     }
     }
 
 
-    public NextPoint vacancy(Object qs, Object gc, Object sj, Double bmd, String range, Object step){
-        NextPoint np = new NextPoint();
-        String dev="-6,6";
-        if(StringUtils.isNotEmpty(range)){
-            dev=range.replaceAll("[\\[\\]]","");
+    public void vacancy(LevelInfo levelInfo,NextPoint np){
+        if(StringUtils.isNotEmpty(levelInfo.getDx())){
+            levelInfo.setDx(levelInfo.getDx().replaceAll("[\\[\\]]",""));
+        }else{
+            levelInfo.setDx("-6,6");
         }
         }
         String dx;
         String dx;
-        double cD=Double.parseDouble(step.toString());
+//        double cD=Double.parseDouble(step.toString());
         double min=0.5d;
         double min=0.5d;
         do{
         do{
-            dx= CustomFunction.rangeList(1,0,dev,1,0,1).get(0).toString();
+            dx= CustomFunction.rangeList(1,0,levelInfo.getDx(),1,0,1).get(0).toString();
         }while (StringUtils.isEquals(0,dx));
         }while (StringUtils.isEquals(0,dx));
         double hd;
         double hd;
         boolean hasNp=true;
         boolean hasNp=true;
-        if(StringUtils.isNotEmpty(bmd,gc)){
-            hd=Double.parseDouble(bmd.toString())-Double.parseDouble(gc.toString());
-            if(hd>min&&hd<cD){
+        if(StringUtils.isNotEmpty(levelInfo.getSightHeight(),np.getSc())){
+            hd=levelInfo.getSightHeight()-Double.parseDouble(np.getSc());
+            if(hd>min&&hd<levelInfo.getStep()){
                 hasNp=false;
                 hasNp=false;
             }
             }
-            np.setSc(StringUtils.handleNull(gc));
+//            np.setSc(StringUtils.handleNull(gc));
         }
         }
-        if(StringUtils.isNotEmpty(gc)&&StringUtils.isEmpty(sj,qs)){
+        if(StringUtils.isNotEmpty(np.getSc())&&StringUtils.isEmpty(np.getQ(),np.getSj())){
             /*010*/
             /*010*/
             if(!hasNp){
             if(!hasNp){
-                np.setQ(CustomFunction.calculate(bmd,gc,3,2).toString());
+                np.setQ(CustomFunction.calculate(levelInfo.getSightHeight(),np.getSc(),3,2).toString());
             }
             }
-        }else if(StringUtils.isNotEmpty(gc,sj)&&StringUtils.isEmpty(qs)){
+        }else if(StringUtils.isNotEmpty(np.getSc(),np.getSj())&&StringUtils.isEmpty(np.getQ())){
             /*011*/
             /*011*/
             if(!hasNp){
             if(!hasNp){
-                np.setQ(CustomFunction.calculate(bmd,gc,3,2).toString());
+                np.setQ(CustomFunction.calculate(levelInfo.getSightHeight(),np.getSc(),3,2).toString());
             }
             }
-            np.setSj(sj.toString());
-        }else if(StringUtils.isNotEmpty(gc,qs)&&StringUtils.isEmpty(sj)){
+        }else if(StringUtils.isNotEmpty(np.getSc(),np.getQ())&&StringUtils.isEmpty(np.getSj())){
             /*110*/
             /*110*/
-            np.setQ(qs.toString());
-        }else if(StringUtils.isNotEmpty(sj)&&StringUtils.isEmpty(gc,qs)){
+//            np.setQ(qs.toString());
+        }else if(StringUtils.isNotEmpty(np.getSj())&&StringUtils.isEmpty(np.getSc(),np.getQ())){
             /*001*/
             /*001*/
-            np.setSj(sj.toString());
+//            np.setSj(sj.toString());
             np.setSc(StringUtils.number2String(Double.parseDouble(np.getSj())+Double.parseDouble(dx)/1000,3));
             np.setSc(StringUtils.number2String(Double.parseDouble(np.getSj())+Double.parseDouble(dx)/1000,3));
-            hd=Double.parseDouble(bmd.toString())-Double.parseDouble(np.getSc());
-            if(hd>min&&hd<cD){
+            hd=levelInfo.getSightHeight()-Double.parseDouble(np.getSc());
+            if(hd>min&&hd<levelInfo.getStep()){
                 hasNp=false;
                 hasNp=false;
             }
             }
             if(!hasNp){
             if(!hasNp){
-                np.setQ(CustomFunction.calculate(bmd,np.getSc(),3,2).toString());
+                np.setQ(CustomFunction.calculate(levelInfo.getSightHeight(),np.getSc(),3,2).toString());
             }
             }
-        }else if(StringUtils.isNotEmpty(qs,bmd)&&StringUtils.isEmpty(gc,sj)){
+        }else if(StringUtils.isNotEmpty(np.getQ(),levelInfo.getSightHeight())&&StringUtils.isEmpty(np.getSc(),np.getSj())){
             /*100*/
             /*100*/
-            np.setQ(qs.toString());
-            np.setSc(StringUtils.number2String(bmd-Double.parseDouble(np.getQ()),3));
-        }else if(StringUtils.isNotEmpty(qs,sj)&&StringUtils.isEmpty(gc)){
+//            np.setQ(qs.toString());
+            np.setSc(StringUtils.number2String(levelInfo.getSightHeight()-Double.parseDouble(np.getQ()),3));
+        }else if(StringUtils.isNotEmpty(np.getQ(),np.getSj())&&StringUtils.isEmpty(np.getSc())){
             /*101*/
             /*101*/
-            np.setQ(qs.toString());
-            np.setSc(StringUtils.number2String(Double.parseDouble(sj.toString())+Double.parseDouble(dx)/1000,3));
-        }else if(StringUtils.isNotEmpty(qs,sj,gc)){
+//            np.setQ(qs.toString());
+            np.setSc(StringUtils.number2String(Double.parseDouble(np.getSj())+Double.parseDouble(dx)/1000,3));
+        }else if(StringUtils.isNotEmpty(np.getQ(),np.getSc(),np.getSj())){
             /*111*/
             /*111*/
-            np.setQ(qs.toString());
-            np.setSc(gc.toString());
-        }
-        if(np.getSc()==null){
-            /*实测高程一定不能为空*/
-            return null;
+//            np.setQ(qs.toString());
+//            np.setSc(gc.toString());
         }
         }
-        return  np;
     }
     }
 
 
 }
 }

+ 38 - 19
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -11,6 +11,7 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.dto.ElementData;
 import org.springblade.manager.dto.ElementData;
 import org.springblade.manager.dto.FormData;
 import org.springblade.manager.dto.FormData;
 import org.springblade.manager.dto.LocalVariable;
 import org.springblade.manager.dto.LocalVariable;
+import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.Formula;
 import org.springblade.manager.entity.Formula;
 import org.springblade.manager.entity.WbsParam;
 import org.springblade.manager.entity.WbsParam;
 import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.entity.WbsTreeContract;
@@ -18,9 +19,7 @@ import org.springblade.manager.formula.Container;
 import org.springblade.manager.formula.FormulaStrategyFactory;
 import org.springblade.manager.formula.FormulaStrategyFactory;
 import org.springblade.manager.formula.impl.TableElementConverter;
 import org.springblade.manager.formula.impl.TableElementConverter;
 import org.springblade.manager.mapper.FormulaMapper;
 import org.springblade.manager.mapper.FormulaMapper;
-import org.springblade.manager.service.IFormulaService;
-import org.springblade.manager.service.IWbsParamService;
-import org.springblade.manager.service.IWbsTreeContractService;
+import org.springblade.manager.service.*;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import java.util.*;
 import java.util.*;
@@ -41,6 +40,8 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     private final IWbsParamService wpService;
     private final IWbsParamService wpService;
     private final IWbsTreeContractService treeContractService;
     private final IWbsTreeContractService treeContractService;
     private final FormulaStrategyFactory formulaStrategyFactory;
     private final FormulaStrategyFactory formulaStrategyFactory;
+    private final IContractInfoService contractInfoService;
+    private final IProjectInfoService projectInfoService;
     private final Container env;
     private final Container env;
 
 
 
 
@@ -56,6 +57,11 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
 
     public static final String ELE_CODE_REG= "(?<=E\\[)[^]]+(?=\\])";
     public static final String ELE_CODE_REG= "(?<=E\\[)[^]]+(?=\\])";
     public static final  Pattern P = Pattern.compile(ELE_CODE_REG);
     public static final  Pattern P = Pattern.compile(ELE_CODE_REG);
+    public static final String POLY_REG= "(avg|min|max|sum)\\(([^)]+)\\)";
+    public static final Pattern POLY = Pattern.compile(POLY_REG);
+    public final static String CTI="ContractInfo";
+    public final static String PJI="ProjectInfo";
+
 
 
 
 
 
 
@@ -82,6 +88,11 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         this.env.constantMap=new HashMap<>(100);
         this.env.constantMap=new HashMap<>(100);
         this.env.formDataList=list;
         this.env.formDataList=list;
         this.env.constantMap.put("contractId",contractId);
         this.env.constantMap.put("contractId",contractId);
+        ContractInfo info =this.contractInfoService.getById(contractId);
+        /*合同段信息*/
+        this.env.constantMap.put(CTI,info);
+        /*项目信息*/
+        this.env.constantMap.put(PJI,this.projectInfoService.getById(info.getPId()));
         List<WbsTreeContract> nodes = treeContractService.searchParentAllNode(primaryKeyId,contractId);
         List<WbsTreeContract> nodes = treeContractService.searchParentAllNode(primaryKeyId,contractId);
         this.env.constantMap.put(CHAIN,nodes.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList()));
         this.env.constantMap.put(CHAIN,nodes.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList()));
         List<WbsParam> wps = this.wpService.list(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getWbsId,primaryKeyId));
         List<WbsParam> wps = this.wpService.list(Wrappers.<WbsParam>lambdaQuery().eq(WbsParam::getWbsId,primaryKeyId));
@@ -144,6 +155,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                 fd.getFormula().setFormula(tmp);
                 fd.getFormula().setFormula(tmp);
             }
             }
         }
         }
+        polymerization();
         return this;
         return this;
     }
     }
 
 
@@ -302,22 +314,29 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
 
 
 
     public void  polymerization(){
     public void  polymerization(){
-//    if(f.contains(CustomFunction.CLASS_CALL+"avg(")||f.contains(CustomFunction.CLASS_CALL+"min(")||f.contains(CustomFunction.CLASS_CALL+"max(")||f.contains(CustomFunction.CLASS_CALL+"sum(")){
-//        /*聚合*/
-//        Matcher m = POLY.matcher(f);
-//        while (m.find()){
-//            /**/
-//            List<String> elementCodes=CustomFunction.parseElementCode(m.group(2));
-//            List<FormData> tmp = ele.stream().filter(e->elementCodes.contains(e.getCode())).collect(Collectors.toList());
-//            ele.removeAll(tmp);
-//
-//            tmp.forEach(e-> E.put(e.getCode(),e.getValues().stream().map(ElementData::getValue).collect(Collectors.toList())));
-//            Object data =   Expression.parse(CustomFunction.CLASS_CALL+m.group()).calculate(currentMap);
-//
-//            f = f.replace(CustomFunction.CLASS_CALL+m.group(),data.toString());
-//            fd.getFormula().setFormula(f);
-//        }
-//    }
+        for(FormData fd:this.env.formDataList){
+            Formula formula = fd.getFormula();
+            if(Func.isNotEmpty(formula)){
+                String f=formula.getFormula();
+                if(Func.isNotBlank(f)) {
+                    if (f.contains(CustomFunction.CLASS_CALL + "avg(") || f.contains(CustomFunction.CLASS_CALL + "min(") || f.contains(CustomFunction.CLASS_CALL + "max(") || f.contains(CustomFunction.CLASS_CALL + "sum(")) {
+                        /*聚合*/
+                        Matcher m = POLY.matcher(f);
+                        while (m.find()) {
+                            List<String> elementCodes = CustomFunction.parseElementCode(m.group(2));
+                            Map<String, Object> currentMap = new HashMap<>(this.env.constantMap);
+                            List<String> relyList = fd.getFormula().getRelyList();
+                            List<FormData> tmp = this.env.formDataList.stream().filter(e -> relyList.contains(e.getCode())).collect(Collectors.toList());
+                            Map<String, Object> E = getMap(currentMap, "E");
+                            tmp.forEach(e -> E.put(e.getCode(), e.getValues().stream().map(ElementData::getValue).collect(Collectors.toList())));
+                            Object data = Expression.parse(CustomFunction.CLASS_CALL + m.group()).calculate(currentMap);
+                            f = f.replace(CustomFunction.CLASS_CALL + m.group(), data.toString());
+                            fd.getFormula().setFormula(f);
+                        }
+                    }
+                }
+            }
+        }
     }
     }