浏览代码

G8距离转点\分部评定

yangyj 1 年之前
父节点
当前提交
1d1f6d9807

+ 28 - 20
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/FB02.java

@@ -2,6 +2,7 @@ package org.springblade.manager.vo;
 
 import lombok.Data;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.StringPool;
 import org.springblade.manager.dto.Coords;
 import org.springblade.manager.dto.ElementData;
 import org.springblade.manager.dto.FormData;
@@ -9,7 +10,6 @@ import org.springblade.manager.entity.WbsTreeContract;
 
 import java.util.*;
 import java.util.function.BiFunction;
-import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
@@ -29,6 +29,7 @@ public class FB02 {
     private List<FormData> fds = new ArrayList<>();
     private List<Item> datas = new ArrayList<>();
     private Map<FormData, BiFunction<List<Item>,Integer,List<Object>>> fm = new HashMap<>();
+    private List<String> sqlList = new ArrayList<>();
 
 
     @Data
@@ -60,19 +61,11 @@ public class FB02 {
 
     public Integer getPageNum(){
         if(this.name!=null){
-          return  this.name.getValues().size()/this.name.getCoordsList().size();
+          return  (this.getDatas().size()/this.name.getCoordsList().size())+1;
         }
         return null;
     }
 
-    public void addItem(String subItem,String name,Double passRate, Integer weight){
-          this.datas.add(new Item(subItem, name, passRate, weight));
-    }
-
-    private FB02() {
-        /*禁止无参构建实例*/
-    }
-
     public FB02(List<FormData> processFds) {
          for(FormData fd:processFds){
               if(fd.getEName().contains("分项工程名称")){
@@ -87,7 +80,7 @@ public class FB02 {
               }else if(fd.getEName().contains("实测合格率")){
                   this.passRate=fd;
                   this.fm.put(fd,(List<Item> l,Integer pn)->l.stream().map(Item::getPassRate).collect(Collectors.toList()));
-              }else if(fd.getEName().contains("权值")){
+              }else if(fd.getEName().trim().equals("权值")){
                   this.weight=fd;
                   this.fm.put(fd,(List<Item> l,Integer pn)->l.stream().map(Item::getWeight).collect(Collectors.toList()));
               }
@@ -125,14 +118,22 @@ public class FB02 {
                             LinkedHashMap::new,
                             Collectors.mapping(datas::get, Collectors.toList())
                     ));
-            pages.forEach((k, v) -> {
+
+            for (Map.Entry<Integer, List<Item>> entry : pages.entrySet()) {
+                int k = entry.getKey();
+                if (wtcList.size() <= k) {
+                    break;
+                }
+                List<Item> v = entry.getValue();
+                WbsTreeContract w = wtcList.get(k);
+                StringBuilder  sb =new StringBuilder();
                 this.fds.forEach(fd -> {
-                    putEd(k, v, fd);
+                    sb.append(putEd(k,v,fd,w)).append(StringPool.COMMA);
                 });
-            });
-
-
-         String template="update xxxxx set content='xxxx',update_time=xxx where id =xxxx";
+                String template="update "+w.getInitTableName()+" set "+sb.deleteCharAt(sb.length()-1)+" where id ="+w.getPKeyId();
+                System.out.println("EUV:"+template);
+                sqlList.add(template);
+            }
 
             return true;
         }
@@ -140,7 +141,7 @@ public class FB02 {
     }
 
    /**把数据放到对应元素*/
-    private void putEd(int pn,List<Item> items, FormData fd){
+    private String putEd(int pn,List<Item> items, FormData fd,WbsTreeContract w){
         BiFunction<List<Item>,Integer,List<Object>> fc = this.fm.get(fd);
         if(fc!=null) {
             List<Object> data = fc.apply(items,pn);
@@ -150,12 +151,19 @@ public class FB02 {
                 list.add(new ElementData(pn, 0, data.get(i), c.getX(), c.getY()));
             }
             fd.getValues().addAll(list);
+            return fd.getKey()+StringPool.EQUALS+StringPool.SINGLE_QUOTE+recovery(list)+StringPool.SINGLE_QUOTE;
         }
+        return StringPool.EMPTY;
     }
 
-    public String getSql(){
-        return "select 1";
+    public String recovery(List<ElementData> dataList) {
+        if (Func.isNotEmpty(dataList)) {
+            return dataList.stream().filter(e -> !e.isEmpty()).map(e -> e.stringValue() + "_^_" + e.getY() + "_" + e.getX()).collect(Collectors.joining("☆"));
+        }
+        return StringPool.EMPTY;
     }
 
 
+
+
 }

+ 24 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WtcEva.java

@@ -0,0 +1,24 @@
+package org.springblade.manager.vo;
+
+import lombok.Data;
+
+import java.util.Objects;
+import java.util.Optional;
+
+/**
+ * @author yangyj
+ * @Date 2023/11/13 14:18
+ * @description 评定Bean
+ */
+@Data
+public class WtcEva {
+    private String nodeName;
+    private String initTableName;
+    private String htmlUrl;
+    private Long contractId;
+    private String treeCode;
+    private Long parentId;
+    public boolean isEva(){
+      return Objects.requireNonNull(this.nodeName, "nodeName不能为空").contains("评定");
+  }
+}

+ 4 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsFormElementController.java

@@ -246,5 +246,9 @@ public class WbsFormElementController extends BladeController {
         return R.fail(200, "关联失败");
     }
 
+    @RequestMapping(value = "/structure", method = RequestMethod.GET)
+    public R<Object> structure(Long tableId) {
+        return R.fail(200, "");
+    }
 
 }

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsParamController.java

@@ -621,4 +621,6 @@ public class WbsParamController {
 
 
 
+
+
 }

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

@@ -366,12 +366,11 @@ public interface ITurnPointCalculator {
             if (!tp.isVisible(negative)) {
                 result.addAll(tp.limit(negative));
             }
-            double x=tp.tooFar();
-            if(x!=0){
-               /*距离超过两百米需要转点*/
-                List<TurnPoint>   closeZd=  info.getCloseZd();
+            int n=tp.tooFar();
+            if(n!=0){
+                result.addAll(tp.limitOfRange(n));
+                /*List<TurnPoint>   closeZd=  info.getCloseZd();
                 TurnPoint last = closeZd.get(closeZd.size()-1);
-                 int n = (int)Math.ceil(Math.abs(x)/200);
                 List<TurnPoint> list = new ArrayList<>();
                 for(int i=0;i<n;i++){
                      TurnPoint zd = new TurnPoint(info, new HashMap<>());
@@ -383,11 +382,11 @@ public interface ITurnPointCalculator {
                     double small = BigDecimal.valueOf(r.nextDouble() * (info.getStep() - info.getMin() - xx) + info.getMin()).setScale(info.getScale(), ROUND_HALF_UP).doubleValue();
                     double big = small + xx;
                     if (ddx < 0) {
-                        /*后大前小,取高*/
+                        *//*后大前小,取高*//*
                         zd.setQ(small);
                         zd.setH(big);
                     } else {
-                        /*前大后小,趋低*/
+                        *//*前大后小,趋低*//*
                         zd.setQ(big);
                         zd.setH(small);
                     }
@@ -397,17 +396,16 @@ public interface ITurnPointCalculator {
                     zd.getDataMap().put(QS, zd.getQ());
                     zd.getDataMap().put(HS, zd.getH());
                     if(i==n-1) {
-                        /*最后一个重新计算前视,因为是微调所以不再判断高差是否在范围*/
+                        *//*最后一个重新计算前视,因为是微调所以不再判断高差是否在范围*//*
                         tp.setQ(info.getSightHeight() - tp.getSc0L());
                     }
                     closeZd.add(zd.clone());
-                    /*设置新的仪器里程,没转一次点相当于减少两百米的间隔,正向+负向-*/
-                    info.setMilestone(info.getMilestone() + 200*(x/Math.abs(x)));
+                    *//*info.setMilestone(info.getMilestone() + 200*(x/Math.abs(x)));tooFar里已经重置仪器里程,这里专注转点*//*
                     list.add(zd);
                 }
                 if(list.size()>0){
                     result.addAll(list);
-                }
+                }*/
             }
 
         }

+ 38 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/LevelInfo.java

@@ -58,8 +58,8 @@ public class LevelInfo implements  Cloneable {
     private boolean distance=false;
     /**当前里程*/
     private Double milestone;
-    /**减少间距*/
-    private Double missdistance=0d;
+    /**高程转点等效缩短间距*/
+    private Double heightTurnLength =0d;
     /**测站点信息*/
     private Map<String,Double> BmMap =new HashMap<>();
 
@@ -208,11 +208,43 @@ public class LevelInfo implements  Cloneable {
         this.milestone = milestone;
     }
 
-    public Double getMissdistance() {
-        return missdistance;
+
+
+    /*重置仪器里程*/
+    public double resetMilestone(double x){
+        /*只要包含里程信息就必须重置等效间距*/
+        double d=x-this.milestone;
+        /*高差转点每次等效减小200米间距,如果还是小于当前测点与仪器高的间距则返回剩余间距*/
+        if(this.heightTurnLength >0) {
+            /*负向减少里程,正向则增大里程*/
+            if(this.milestone<Math.abs(d)) {
+                double symbol=d / Math.abs(d);
+                /*只有当高差转点不能抵消等效间距的时候,更新当前仪器里程信息*/
+                this.setMilestone(this.milestone + this.heightTurnLength * symbol);
+                /*重新计算测点与仪器间距*/
+                d = x - this.milestone;
+            }else{
+                /* this.levelInfo.setMilestone(x-(ThreadLocalRandom.current().nextInt(11)+5)*symbol);*/
+                /*假如高程转点的等效缩小距离已经能抵消测量距离,则仪器里程信息设置为当前转点*/
+                this.milestone=x;
+                /*高程转点等效距离已经完全抵消所需要的距离转点*/
+                d=0;
+            }
+            /*重置等效高程转点*/
+            this.heightTurnLength =0D;
+        }else{
+            /*this.levelInfo.setMilestone(x-(ThreadLocalRandom.current().nextInt(21)+5)*symbol);*/
+            /*this.levelInfo.setMilestone(x);*/
+            this.milestone=this.milestone+((int)(d/200))*200;
+        }
+        return d;
+    }
+
+    public Double getHeightTurnLength() {
+        return heightTurnLength;
     }
 
-    public void setMissdistance(Double missdistance) {
-        this.missdistance = missdistance;
+    public void setHeightTurnLength(Double heightTurnLength) {
+        this.heightTurnLength = heightTurnLength;
     }
 }

+ 49 - 30
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/TurnPoint.java

@@ -7,9 +7,7 @@ import org.springframework.beans.BeanUtils;
 
 import java.math.BigDecimal;
 import java.util.*;
-import java.util.concurrent.ThreadLocalRandom;
 import java.util.stream.Collectors;
-import java.util.stream.IntStream;
 
 import static com.mixsmart.utils.CustomFunction.rangeList;
 import static java.math.BigDecimal.ROUND_HALF_UP;
@@ -334,12 +332,50 @@ public class TurnPoint {
             if(levelInfo.isDistance()) {
                 /*没转一次点相当于往前推进两百米*/
                 /* levelInfo.setMilestone(levelInfo.getMilestone()+200);*/
-                 levelInfo.setMissdistance(levelInfo.getMissdistance()+200);
+                 levelInfo.setHeightTurnLength(levelInfo.getHeightTurnLength()+200);
             }
             loop++;
         } while (hd > 0 && loop < 20);
         return result;
     }
+    /**生成距离转点*/
+    public List<TurnPoint> limitOfRange(Integer n){
+        List<TurnPoint>   closeZd=  this.levelInfo.getCloseZd();
+        TurnPoint last = closeZd.get(closeZd.size()-1);
+        List<TurnPoint> list = new ArrayList<>();
+        for(int i=0;i<n;i++){
+            TurnPoint zd = new TurnPoint(this.levelInfo, new HashMap<>());
+            zd.setName("ZD"+closeZd.size());
+            double dx = Math.random() * 0.07 * (RD.nextBoolean() ? -1 : 1);
+            zd.setBmd(StringUtils.number2StringZero(Double.parseDouble(last.getBmd()) + dx, 3));
+            double ddx = this.levelInfo.getSightHeight() - zd.getBmd0L();
+            double xx = Math.abs(ddx);
+            double small = BigDecimal.valueOf(r.nextDouble() * (this.levelInfo.getStep() - this.levelInfo.getMin() - xx) + this.levelInfo.getMin()).setScale(this.levelInfo.getScale(), ROUND_HALF_UP).doubleValue();
+            double big = small + xx;
+            if (ddx < 0) {
+                /*后大前小,取高*/
+                zd.setQ(small);
+                zd.setH(big);
+            } else {
+                /*前大后小,趋低*/
+                zd.setQ(big);
+                zd.setH(small);
+            }
+            this.levelInfo.setSightHeight(zd.getBmd0L());
+            zd.getDataMap().put(CD, zd.getName());
+            zd.getDataMap().put(YG, zd.getBmd());
+            zd.getDataMap().put(QS, zd.getQ());
+            zd.getDataMap().put(HS, zd.getH());
+            if(i==n-1) {
+                /*最后一个重新计算前视,因为是微调所以不再判断高差是否在范围*/
+                this.setQ(this.levelInfo.getSightHeight() - this.getSc0L());
+            }
+            closeZd.add(zd.clone());
+            /*info.setMilestone(info.getMilestone() + 200*(x/Math.abs(x)));tooFar里已经重置仪器里程,这里专注转点*/
+            list.add(zd);
+        }
+        return list;
+    }
 
     public double hdx() {
         double step = levelInfo.getStep();
@@ -457,34 +493,17 @@ public class TurnPoint {
     public void setIsDeleted(int isDeleted) {
         this.isDeleted = isDeleted;
     }
-    public double tooFar(){
+
+
+    /*仪器里程全部在这里控制,返回值需要距离转点的数量*/
+    public int tooFar(){
         if(this.levelInfo.isDistance()){
-            Double x= BaseUtils.milestone(this.name);
-            if(x!=null) {
-                /*只要包含里程信息就必须重置等效间距*/
-                double d=x-this.levelInfo.getMilestone();
-                double symbol=d / Math.abs(d);
-                /*高差转点每次等效减小200米间距,如果还是小于当前测点与仪器高的间距则返回剩余间距*/
-                if(this.levelInfo.getMissdistance()>0) {
-                    /*负向减少里程,正向则增大里程*/
-                    double reduce = this.levelInfo.getMissdistance() * symbol;
-                    if(Math.abs(reduce)<Math.abs(d)) {
-                        /*只有当高差转点不能抵消等效间距的时候,更新当前仪器里程信息*/
-                        this.levelInfo.setMilestone(this.levelInfo.getMilestone() + reduce);
-                        /*重新计算测点与仪器间距*/
-                        d = x - this.levelInfo.getMilestone();
-                    }else{
-                        /*高差转点等效间隔不能越过测点,仪器里程设置为距离当前测点5-25米的范围*/
-                        this.levelInfo.setMilestone(x-(ThreadLocalRandom.current().nextInt(21)+5)*symbol);
-                    }
-                    /*遇到有桩号的测点必须重置高差转点减少的等效间距*/
-                    this.levelInfo.setMissdistance(0D);
-                }else{
-                    this.levelInfo.setMilestone(x-(ThreadLocalRandom.current().nextInt(21)+5)*symbol);
-                }
-                if(Math.abs(d)>200.0001){
-                    /*间距超过200则返回实际间距*/
-                    return d;
+            Double mileage= BaseUtils.milestone(this.name);
+            if(mileage!=null) {
+              double dx=this.levelInfo.resetMilestone(mileage);
+                if(Math.abs(dx)>200.00001){
+                    /*间距超过200则返回需要距离转点的数量*/
+                    return  (int)Math.floor(Math.abs(dx)/200);
                 }
             }
         }

+ 45 - 39
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -3,7 +3,6 @@ package org.springblade.manager.service.impl;
 
 import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.date.DateTime;
-import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.hutool.core.date.StopWatch;
 import cn.hutool.core.util.HashUtil;
 import cn.hutool.log.StaticLog;
@@ -13,7 +12,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.jfireel.expression.Expression;
 import com.mixsmart.utils.*;
 import lombok.RequiredArgsConstructor;
-import org.apache.commons.lang.math.IntRange;
 import org.apache.poi.ss.usermodel.*;
 import org.jsoup.nodes.Document;
 import org.springblade.common.utils.BaseUtils;
@@ -36,13 +34,14 @@ import org.springblade.manager.service.*;
 import org.springblade.manager.vo.AppWbsTreeContractVO;
 import org.springblade.manager.vo.CurrentNode;
 import org.springblade.manager.vo.FB02;
+import org.springblade.manager.vo.WtcEva;
 import org.springframework.context.annotation.Scope;
 import org.springframework.context.annotation.ScopedProxyMode;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.util.LinkedCaseInsensitiveMap;
 import org.springframework.web.context.WebApplicationContext;
 import javax.validation.constraints.NotNull;
-import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -1521,11 +1520,11 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     }
 
     /*调整页数并返回当所有页*/
-   public List<WbsTreeContract>  adjustPageSize(int pageSizeNow,WbsTreeContract wtc,List<FormData> processFds){
+   public List<WbsTreeContract>  adjustPageSize(int pageSizeNow,WtcEva wtc,List<FormData> processFds){
        try {
            List<WbsTreeContract> list =this.wbsTreeContractService.list(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getInitTableName,wtc.getInitTableName()).eq(WbsTreeContract::getContractId,wtc.getContractId()).eq(WbsTreeContract::getParentId,wtc.getParentId()).orderByDesc(WbsTreeContract::getCreateTime));
            int length=list.size();
-           if(pageSizeNow!=length){
+           if(pageSizeNow>0&&pageSizeNow!=length){
                int dx = pageSizeNow-length;
                if(dx>0) {
                    /*加页*/
@@ -2420,43 +2419,50 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         }
     }
 
+
+
     @Override
     public R<Object> evaluate(Long pkeyId) {
-        if(StringUtils.isNumber(pkeyId)) {
-            WbsTreeContract wtc= this.getSqlOne("select tree_code treeCode,contract_id,init_table_name,html_url from m_wbs_tree_contract where p_key_id =" + pkeyId,WbsTreeContract.class);
-            List<FormData> processFds = this.createFormDataByTableName(wtc.getInitTableName());
-            FB02 fb02 = new FB02(processFds);
-            LinkedList<String> treeCode = new LinkedList<>(FormulaUtils.treeCodeSplit(wtc.getTreeCode()));
-            List<FormulaDataBlock> formulaDataBlocks = this.getSqlList("select a.* from m_formula_data_block a join (select parent_id from m_wbs_tree_contract where tree_code like '"+treeCode.getLast()+"%' and contract_id ="+wtc.getContractId()+" and major_data_type=2 and is_deleted=0 ORDER BY tree_code)b on a.sw_id=b.parent_id ",FormulaDataBlock.class);
-            if(formulaDataBlocks.size()>0){
-                 formulaDataBlocks.forEach(fdb->{
-                     List<ElementBlock> elementBlockList = JSON.parseArray(fdb.getVal(), ElementBlock.class);
-                     elementBlockList.forEach(eb->{
-                         String name = eb.getEName();
-                         FB02.Item  xm=new FB02.Item();
-                         xm.setName(name);
-                         List<ItemBlock> ib=  eb.getList();
-                         int total=  ib.stream().mapToInt(ItemBlock::getSubTotal).sum();
-                         int pass=   ib.stream().mapToInt(ItemBlock::getSubPass).sum();
-                         if(total>0) {
-                             double rate = (double) pass / (double) total;
-                             if (rate >= 0 && rate <= 100) {
-                                 xm.setPassRate(rate);
-                             }
-                         }
-                         fb02.getDatas().add(xm);
-                     });
-                 });
-                 if(fb02.getDatas().size()>0){
-                    Map<String,String> tableKeysCoordsMap= FormulaUtils.getElementCell(wtc.getHtmlUrl());
-                    fb02.initFdCoords(tableKeysCoordsMap);
-                    /*根据数据长度,增减页数*/
-                    List<WbsTreeContract> wtcList= this.adjustPageSize(fb02.getPageNum(),wtc,processFds);
-                    if(fb02.flush(wtcList)) {
-                        this.jdbcTemplate.execute(fb02.getSql());
+        if (StringUtils.isNumber(pkeyId)) {
+            WtcEva wtcEva = this.getSqlOne(
+                    "select b.tree_code treeCode ,a.contract_id contractId,a.init_table_name initTableName,a.html_url htmlUrl ,a.node_name nodeName ,a.parent_id parentId from m_wbs_tree_contract a join m_wbs_tree_contract b on (a.parent_id=b.id and a.contract_id=b.contract_id) where a.p_key_id ="
+                            + pkeyId, WtcEva.class);
+            if(wtcEva.isEva()){
+                List<FormData> processFds = this.createFormDataByTableName(wtcEva.getInitTableName());
+                FB02 fb02 = new FB02(processFds);
+                LinkedList<String> treeCode = new LinkedList<>(FormulaUtils.treeCodeSplit(wtcEva.getTreeCode()));
+                List<FormulaDataBlock> formulaDataBlocks = this.getSqlList("select a.* from m_formula_data_block a join (select parent_id from m_wbs_tree_contract where tree_code like '" + treeCode.getLast() + "%' and contract_id =" + wtcEva.getContractId() + " and major_data_type=2 and is_deleted=0 ORDER BY tree_code)b on a.sw_id=b.parent_id ", FormulaDataBlock.class);
+                if (formulaDataBlocks!=null&&formulaDataBlocks.size() > 0) {
+                    formulaDataBlocks.forEach(fdb -> {
+                        List<ElementBlock> elementBlockList = JSON.parseArray(fdb.getVal(), ElementBlock.class);
+                        elementBlockList.forEach(eb -> {
+                            String name = eb.getEName();
+                            FB02.Item xm = new FB02.Item();
+                            xm.setName(name);
+                            List<ItemBlock> ib = eb.getList();
+                            int total = ib.stream().mapToInt(ItemBlock::getSubTotal).sum();
+                            int pass = ib.stream().mapToInt(ItemBlock::getSubPass).sum();
+                            if (total > 0) {
+                                double rate = (double) pass / (double) total;
+                                if (rate >= 0 && rate <= 100) {
+                                    xm.setPassRate(rate);
+                                }
+                            }
+                            fb02.getDatas().add(xm);
+                        });
+                    });
+                    if (fb02.getDatas().size() > 0) {
+                        Map<String, String> tableKeysCoordsMap = FormulaUtils.getElementCell(wtcEva.getHtmlUrl());
+                        fb02.initFdCoords(tableKeysCoordsMap);
+                        /*根据数据长度,增减页数*/
+                        List<WbsTreeContract> wtcList = this.adjustPageSize(fb02.getPageNum(), wtcEva, processFds);
+                        if (fb02.flush(wtcList)) {
+                            fb02.getSqlList().forEach(System.out::println);
+                            //this.jdbcTemplate.execute(fb02.getSql());
+                            return R.success("成功");
+                        }
                     }
-                 }
-                return R.success("成功");
+                }
             }
         }
         return R.fail("无数据");