Browse Source

公式相关:G8手填优化

yangyj 2 years ago
parent
commit
8c167aef0d

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

@@ -109,8 +109,13 @@ public class ElementData {
         return y+ StringPool.UNDERSCORE+x;
     }
     public String getRowKey(){
+        /*同行*/
         return this.groupId+StringPool.AT+this.index+StringPool.AT+this.y;
     }
+    public String getColKey(){
+        /*同列*/
+        return this.groupId+StringPool.AT+this.index+StringPool.AT+this.x;
+    }
 
 
 }

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

@@ -8,10 +8,7 @@ import org.springblade.core.tool.utils.StringPool;
 import org.springblade.manager.entity.Formula;
 
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -54,6 +51,8 @@ public class FormData {
      * 用于输出
      */
     private List<ElementData> values;
+    private Map<String,ElementData> vMap=new HashMap<>();
+
     /**
      * 公式对象
      */
@@ -85,19 +84,35 @@ public class FormData {
     }
     public FormData(String code, List<ElementData> values, Formula formula,String coords) {
         this.code = code;
+        this.step = 1;
         this.values = values;
         this.formula = formula;
-        if(Func.isNotBlank(coords)){
-            this.coordsList = Stream.of(coords).flatMap(e-> Arrays.stream(e.split(";"))).map(e->{String[] xy=e.split("_");return new Coords(xy[1],xy[0]);}).collect(Collectors.toList());
-        }
+        flushVmap();
+        flushCoords(coords);
     }
 
+
     public FormData(String code, Integer step, List<ElementData> values, Formula formula,String coords) {
         this.code = code;
         this.step = step;
         this.values = values;
         this.formula = formula;
-        this.coordsList = Stream.of(coords).flatMap(e-> Arrays.stream(e.split(";"))).map(e->{String[] xy=e.split("_");return new Coords(xy[1],xy[0]);}).collect(Collectors.toList());
+        flushVmap();
+        flushCoords(coords);
+    }
+
+    public void flushVmap(){
+        if(Func.isNotEmpty(this.values)){
+            this.values.forEach(v->{
+                vMap.put(v.getRowKey(),v);
+            });
+        }
+    }
+
+    public void flushCoords(String coords){
+        if(Func.isNotBlank(coords)){
+            this.coordsList = Stream.of(coords).flatMap(e-> Arrays.stream(e.split(";"))).map(e->{String[] xy=e.split("_");return new Coords(xy[1],xy[0]);}).collect(Collectors.toList());
+        }
     }
 
     public String getKey(){

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

@@ -1921,7 +1921,7 @@ public class CustomFunction {
 				index=list.size()-1;
 			}
 			if(ListUtils.isNotEmpty(list) ){
-				if(list.size()>index&&index>=1){
+				if(list.size()>index&&index>=0){
 					return list.get(index);
 				}else{
 					return  list.get(list.size()-1);

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

@@ -103,11 +103,16 @@ public interface ITurnPointCalculator {
             Random rd = new Random();
             LevelInfo info = turnPointList.get(0).getLevelInfo();
             List<TurnPoint> result = new ArrayList<>();
+            TurnPoint lastCd = turnPointList.stream().filter(TurnPoint::isCe).reduce((a,b)->b).orElse(null);
             for (TurnPoint tp : turnPointList) {
                 try {
+                    if(tp.equals(lastCd)){
+                        /*已经是最后一个测点*/
+                        tp.getLevelInfo().setHasCe(Boolean.FALSE);
+                    }
                     /*先判断是不是转点*/
                     if (tp.getType().equals(TurnPoint.ZD)) {
-                        if (tp.getQ() == null && tp.getH() == null && tp.getBmd() != null) {
+                        if (Func.isBlank(tp.getQ()) && Func.isBlank(tp.getH())  && Func.isNotBlank(tp.getBmd())) {
                             double dh = Math.abs(tp.getLevelInfo().getSightHeight() - tp.getBmd0L());
                             double big = BigDecimal.valueOf(rd.nextDouble() * (info.getStep() - dh) + dh).setScale(info.getScale(), ROUND_HALF_UP).doubleValue();
                             double small = big - dh;
@@ -118,26 +123,29 @@ public interface ITurnPointCalculator {
                                 tp.setH(small);
                                 tp.setQ(big);
                             }
-                            tp.setSc(info.getSightHeight() - tp.getQ0L());
                             /* 更新仪器高*/
                             info.setSightHeight(tp.getBmd0L());
-                        } else if (tp.getQ() == null && tp.getH() != null && tp.getBmd() != null) {
+                        } else if ( Func.isBlank(tp.getQ()) && Func.isNotBlank(tp.getH()) && Func.isNotBlank(tp.getBmd())) {
                             tp.setQ(info.getSightHeight() + tp.getH0L() - tp.getBmd0L());
                             info.setSightHeight(tp.getBmd0L());
-                        } else if (tp.getQ() != null && tp.getH() == null && tp.getBmd() != null) {
+                        } else if (Func.isNotBlank(tp.getQ()) &&  Func.isBlank(tp.getH()) && Func.isNotBlank(tp.getBmd())) {
                             tp.setH(info.getSightHeight() - tp.getQ0L() - tp.getBmd0L());
                             info.setSightHeight(tp.getBmd0L());
-                        } else if (tp.getQ() != null && tp.getH() != null && tp.getBmd() == null) {
+                        } else if (Func.isNotBlank(tp.getQ() ) && Func.isNotBlank(tp.getH()) && Func.isBlank( tp.getBmd()) ) {
                             tp.setBmd(info.getSightHeight() + tp.getH0L() - tp.getQ0L());
                             info.setSightHeight(tp.getBmd0L());
-                        } else if(tp.getQ() != null && tp.getH() != null && tp.getBmd() != null){
+                        } else if(Func.isNotBlank(tp.getQ()) && Func.isNotBlank(tp.getH()) && Func.isNotBlank(tp.getBmd())){
                             info.setSightHeight(tp.getBmd0L());
                         }else {
                             return Collections.emptyList();
                         }
                         /*可能存在自动插入转点情况,所以每个转点的序号需要实时计算*/
-                        tp.setName("ZD"+info.getCloseZd().size());
-                        tp.getLevelInfo().getCloseZd().add(tp.clone());
+                        if(tp.getLevelInfo().getHasCe()) {
+                            tp.setName("ZD"+info.getCloseZd().size());
+                            tp.getLevelInfo().getCloseZd().add(tp.clone());
+                        }else{
+                            tp.getLevelInfo().getCloseZd().remove(tp.getLevelInfo().getCloseZd().size()-1);
+                        }
                     } else if (tp.getType().equals(TurnPoint.CLOSE)) {
                         /*闭合转点*/
                         tp.setQ(info.getSightHeight() - tp.getSc0L());

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

@@ -41,6 +41,8 @@ public class LevelInfo {
     private Double step;
     /**是否移除末尾的零*/
     private Boolean zero;
+
+    private Boolean hasCe=true;
     /**闭合信息*/
     private List<TurnPoint> closeZd=new ArrayList<>();
 
@@ -130,4 +132,12 @@ public class LevelInfo {
     public void setCloseZd(List<TurnPoint> closeZd) {
         this.closeZd = closeZd;
     }
+
+    public Boolean getHasCe() {
+        return hasCe;
+    }
+
+    public void setHasCe(Boolean hasCe) {
+        this.hasCe = hasCe;
+    }
 }

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

@@ -330,5 +330,8 @@ public class TurnPoint {
         /*合法水准点,设计标高、后视必须为数字*/
         return StringUtils.isNumber(this.sj)&&StringUtils.isNumber(this.h);
   }
+  public Boolean isCe(){
+        return StringUtils.isEquals(CE,this.type);
+  }
 
 }

+ 7 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -398,8 +398,13 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     @Override
     public IFormulaService special() {
         for(FormData fd:this.formDataList) {
-            if(Func.isNotEmpty(fd.getFormula())) {
-                formulaStrategyFactory.get(fd).forEach(e -> e.execute(tec));
+            try {
+                if(Func.isNotEmpty(fd.getFormula())) {
+                    formulaStrategyFactory.get(fd).forEach(e -> e.execute(tec));
+                }
+            }catch (Exception e){
+                tec.getLog().append("特殊公式:").append(fd.getEName()).append(fd.getFormula().getNumber()).append("执行异常;");
+                e.printStackTrace();
             }
         }
         return this;