Browse Source

计量相关;测量偏差

yangyj 1 year ago
parent
commit
84a1698d7f

+ 9 - 2
blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java

@@ -69,6 +69,7 @@ import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.security.NoSuchAlgorithmException;
 import java.util.*;
 import java.util.*;
 import java.util.List;
 import java.util.List;
+import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Function;
 import java.util.function.Function;
 import java.util.regex.Matcher;
 import java.util.regex.Matcher;
@@ -156,6 +157,7 @@ public class FormulaUtils {
         }
         }
     }
     }
 
 
+    public static final  Random RD = new Random();
     public static Map<String,Object> triangleSquare(Object ranges){
     public static Map<String,Object> triangleSquare(Object ranges){
         Map<String,Object> map =new HashMap<>();
         Map<String,Object> map =new HashMap<>();
         if(StringUtils.isEmpty(ranges)){
         if(StringUtils.isEmpty(ranges)){
@@ -164,7 +166,6 @@ public class FormulaUtils {
         }
         }
         Matcher m = RegexUtils.matcher("(\\-?\\d+)(\\D)(\\+?\\d+)",ranges.toString());
         Matcher m = RegexUtils.matcher("(\\-?\\d+)(\\D)(\\+?\\d+)",ranges.toString());
         if(m.find()) {
         if(m.find()) {
-            System.out.println();
             int min = StringUtils.handObj2Integer(m.group(1));
             int min = StringUtils.handObj2Integer(m.group(1));
             int max = StringUtils.handObj2Integer(m.group(3));
             int max = StringUtils.handObj2Integer(m.group(3));
             Integer[] r = pythagorean(min, max);
             Integer[] r = pythagorean(min, max);
@@ -175,6 +176,12 @@ public class FormulaUtils {
         return map;
         return map;
     }
     }
 
 
+/*    public static void main(String[] args) {
+        IntStream.range(0,10).boxed().forEach(i->{
+            System.out.println(triangleSquare("-5,5"));
+        });
+    }*/
+
     /**
     /**
      * @Description  字符串相似度
      * @Description  字符串相似度
      * @Param [s1, s2]
      * @Param [s1, s2]
@@ -222,7 +229,7 @@ public class FormulaUtils {
                 int z= (int) Math.round(tmp);
                 int z= (int) Math.round(tmp);
 
 
                 if(min<z&&z<=max){
                 if(min<z&&z<=max){
-                    Integer[] arr = new Integer[]{ i,j,z};
+                    Integer[] arr = new Integer[]{RD.nextBoolean()?i:-i,RD.nextBoolean()?j:-j,z};
                     list.add(arr);
                     list.add(arr);
                 }
                 }
             }
             }

+ 2 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/Mileage.java

@@ -92,14 +92,14 @@ public class Mileage {
                 double sjxD = Double.parseDouble(sjx);
                 double sjxD = Double.parseDouble(sjx);
                 if (StringUtils.isNotEmpty(dx)) {
                 if (StringUtils.isNotEmpty(dx)) {
                     double dxD = Double.parseDouble(dx) * 0.001;
                     double dxD = Double.parseDouble(dx) * 0.001;
-                    this.scx = StringUtils.number2String(sjxD + dxD, 3);
+                    this.scx = StringUtils.number2StringZero(sjxD + dxD, 3);
                 }
                 }
             }
             }
             if (StringUtils.isNotEmpty(sjy)) {
             if (StringUtils.isNotEmpty(sjy)) {
                 double sjyD = Double.parseDouble(sjy);
                 double sjyD = Double.parseDouble(sjy);
                 if (StringUtils.isNotEmpty(dy)) {
                 if (StringUtils.isNotEmpty(dy)) {
                     double dyD = Double.parseDouble(dy) * 0.001;
                     double dyD = Double.parseDouble(dy) * 0.001;
-                    this.scy = StringUtils.number2String(sjyD + dyD, 3);
+                    this.scy = StringUtils.number2StringZero(sjyD + dyD, 3);
                 }
                 }
             }
             }
             if (Func.isNotEmpty(relyList) && relyList.size() == this.dataMap.size()) {
             if (Func.isNotEmpty(relyList) && relyList.size() == this.dataMap.size()) {

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

@@ -24,11 +24,13 @@ import org.springblade.manager.formula.ITableElementConverter;
 import org.springblade.manager.formula.KeyMapper;
 import org.springblade.manager.formula.KeyMapper;
 import org.springblade.manager.formula.NodeTable;
 import org.springblade.manager.formula.NodeTable;
 import org.springblade.manager.vo.CurrentNode;
 import org.springblade.manager.vo.CurrentNode;
+import org.springblade.manager.vo.ReportResult;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.JdbcTemplate;
 
 
 import java.util.*;
 import java.util.*;
 import java.util.regex.Pattern;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 
 /**
 /**
  * @author yangyj
  * @author yangyj
@@ -108,6 +110,8 @@ public class TableElementConverter implements ITableElementConverter {
     private final Converter out;
     private final Converter out;
     /*计量属性*/
     /*计量属性*/
     private Long periodId;
     private Long periodId;
+    /*存放计量计算结果*/
+    public List<ReportResult> reportResults ;
     /*计量属性*/
     /*计量属性*/
     /**根据表名获取对应表页对象*/
     /**根据表名获取对应表页对象*/
     public LinkedList<NodeTable> getTableByName(String initTableName){
     public LinkedList<NodeTable> getTableByName(String initTableName){
@@ -437,7 +441,36 @@ public class TableElementConverter implements ITableElementConverter {
     public class AfterC implements Converter{
     public class AfterC implements Converter{
         @Override
         @Override
         public void convert() {
         public void convert() {
-
+               if(reportResults==null){
+                   reportResults = new ArrayList<>();
+               }
+            Map<String,List<FormData>> group = formDataList.stream().collect(Collectors.groupingBy(FormData::getTableName));
+            for(NodeTable report:tableAll){
+                   ReportResult rt = new ReportResult();
+                   rt.setUrl(report.getHtmlUrl());
+                   rt.setInitTableName(report.getInitTableName());
+                   reportResults.add(rt);
+                   List<FormData> fds =group.get(report.getInitTableName());
+                   if(fds.size()>0){
+                       int pageMax = fds.stream()
+                               .filter(e -> !e.empty())
+                               .mapToInt(e -> 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());
+                       rt.setData(dataList);
+                       for(FormData fd:fds){
+                           if(!fd.empty()) {
+                               List<ElementData> eds = fd.getValues();
+                               for(ElementData ed:eds){
+                                   dataList.get(ed.getIndex()).put(ed.getCoords(),ed.getValue());
+                               }
+                           }
+                       }
+                   }
+               }
         }
         }
     }
     }
 
 

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

@@ -8,6 +8,7 @@ import org.springblade.manager.entity.*;
 import org.springblade.manager.enums.ExecuteType;
 import org.springblade.manager.enums.ExecuteType;
 import org.springblade.manager.formula.KeyMapper;
 import org.springblade.manager.formula.KeyMapper;
 import org.springblade.manager.formula.impl.TableElementConverter;
 import org.springblade.manager.formula.impl.TableElementConverter;
+import org.springblade.manager.vo.ReportResult;
 
 
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.NotNull;
 import java.util.List;
 import java.util.List;
@@ -89,6 +90,6 @@ public interface IFormulaService extends BaseService<Formula> {
     /**获取当前节点的参数wbsNodeId:WBS级id ,wtpPkeyId:项目级PkeyId*/
     /**获取当前节点的参数wbsNodeId:WBS级id ,wtpPkeyId:项目级PkeyId*/
     List<WbsParam> getNodeWps(Long wbsNodeId,Long wtpPkeyId);
     List<WbsParam> getNodeWps(Long wbsNodeId,Long wtpPkeyId);
     /*计量公式执行 0中间,1材料,2开工*/
     /*计量公式执行 0中间,1材料,2开工*/
-    void execute3(Long contractId,Long periodId,Integer type);
+    List<ReportResult> execute3(Long contractId, Long periodId, Integer type);
 
 
 }
 }

+ 31 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -1871,9 +1871,25 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         return Collections.emptyList();
         return Collections.emptyList();
     }
     }
 
 
-    /*获取*/
-    private void listForMeter(Long projectId,Long pkeyId){
-
+    /*获取计量公式,计量表是被动加载的,也不存在表单,所以需要根据计量类型获取*/
+    private void listForMeter(List<FormData> curFormDatas,String projectId,String parentId){
+          List<WbsTreePrivate> wtpList= this.wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getParentId,parentId));
+          /*元素Id,节点id*/
+          List<Map<String,Object>> efMap= this.jdbcTemplate.queryForList("select element_id elementId,formula_id formulaId,scope " +
+                "from m_element_formula_mapping " +
+                "where element_id in(" + curFormDatas.stream().map(FormData::getId).distinct().map(Func::toStr).collect(Collectors.joining(",")) + ") " +
+                "and is_deleted=0 " + " and ( scope<2 or (scope =10 and project_id = " + projectId + ") or (scope=20 and project_id =" + projectId + " and node_id in ("+wtpList.stream().map(WbsTreePrivate::getId).map(Objects::toString).collect(Collectors.joining(","))+")))");
+         setFormula2(curFormDatas,efMap);
+        List<Long> formulaIds = curFormDatas.stream().map(FormData::getFormulaId).distinct().collect(Collectors.toList());
+        if(formulaIds.size()>0) {
+            List<Formula> formulaList = this.listByIds(formulaIds);
+            if (formulaList.size() > 0) {
+                Map<Long, Formula> idMap = formulaList.stream().collect(Collectors.toMap(Formula::getId, f -> f, (p, n) -> n));
+                for (FormData fd : curFormDatas) {
+                    fd.setFormula(idMap.get(fd.getFormulaId()));
+                }
+            }
+        }
     }
     }
 
 
 
 
@@ -1900,6 +1916,8 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             });
             });
         }
         }
     }
     }
+
+
     private void setFormula2(List<FormData> list,List<Map<String,Object>> efMap){
     private void setFormula2(List<FormData> list,List<Map<String,Object>> efMap){
         if(Func.isNotEmpty(efMap)){
         if(Func.isNotEmpty(efMap)){
             Map<Long,List<Map<String,Object>>> efGroup= efMap.stream().collect(Collectors.groupingBy(e->Func.toLong(e.get("elementId"))));
             Map<Long,List<Map<String,Object>>> efGroup= efMap.stream().collect(Collectors.groupingBy(e->Func.toLong(e.get("elementId"))));
@@ -2505,13 +2523,14 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
 
     String[] tabArr=new String[]{"计量报表","动员预付款报表","材料预付款报表"};
     String[] tabArr=new String[]{"计量报表","动员预付款报表","材料预付款报表"};
     @Override
     @Override
-    public void execute3(Long contractId,Long periodId ,Integer type) {
+    public  List<ReportResult> execute3(Long contractId,Long periodId ,Integer type) {
         /*封面、支付申请单、付款申请表*/
         /*封面、支付申请单、付款申请表*/
         ContractInfo contractInfo = this.contractInfoService.getById(contractId);
         ContractInfo contractInfo = this.contractInfoService.getById(contractId);
-        Map<String,String> parent=  this.getSqlOne("select wbs_id wbsId,CONCAT(ancestors,',',id) path from  m_wbs_tree_private a  where a.node_name='?' and a.project_id=?",Map.class,tabArr[type],contractInfo.getPId());
+        Map<String,String> parent=  this.getSqlOne("select id,wbs_id wbsId,CONCAT(ancestors,',',id) path from  m_wbs_tree_private a  where a.node_name='?' and a.project_id=?",Map.class,tabArr[type],contractInfo.getPId());
         List<NodeTable> tableList=  this.getSqlList("select p_key_id pkeyId, node_name nodeName ,init_table_name initTableName,html_url htmlUrl  from  m_wbs_tree_private where ancestors like '?%' and LENGTH(html_url)>0 and is_deleted=0 and project_id=? and wbs_id=?",NodeTable.class,parent.get("path"),contractInfo.getPId(),parent.get("wbsId"));
         List<NodeTable> tableList=  this.getSqlList("select p_key_id pkeyId, node_name nodeName ,init_table_name initTableName,html_url htmlUrl  from  m_wbs_tree_private where ancestors like '?%' and LENGTH(html_url)>0 and is_deleted=0 and project_id=? and wbs_id=?",NodeTable.class,parent.get("path"),contractInfo.getPId(),parent.get("wbsId"));
         Map<String,Map<String,String>> coordinateMap=tableList.stream().collect(Collectors.toMap(NodeTable::getInitTableName,m->FormulaUtils.getElementCell(m.getHtmlUrl()),(v1,v2)->v2));
         Map<String,Map<String,String>> coordinateMap=tableList.stream().collect(Collectors.toMap(NodeTable::getInitTableName,m->FormulaUtils.getElementCell(m.getHtmlUrl()),(v1,v2)->v2));
         List<FormData> processFds = this.createFormDataByTableName(String.join(",", ""));
         List<FormData> processFds = this.createFormDataByTableName(String.join(",", ""));
+        listForMeter(processFds,contractInfo.getPId(),parent.get("id"));
         TableElementConverter tec = new TableElementConverter(processFds,coordinateMap,tableList);
         TableElementConverter tec = new TableElementConverter(processFds,coordinateMap,tableList);
         tec.setProjectId(Long.parseLong(contractInfo.getPId()));
         tec.setProjectId(Long.parseLong(contractInfo.getPId()));
         tec.setContractId(contractInfo.getId());
         tec.setContractId(contractInfo.getId());
@@ -2530,8 +2549,15 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         formulaHandleChains.add(new ExecutorFormat(tec));
         formulaHandleChains.add(new ExecutorFormat(tec));
         formulaHandleChains.forEach(FormulaHandleChain::handle);
         formulaHandleChains.forEach(FormulaHandleChain::handle);
         tec.after();
         tec.after();
+        return tec.getReportResults();
     }
     }
 
 
+
+
+
+
+
+
     public Map<String,Object> getBussDataInfo(Long pkeyId, int type, Boolean isFormLoading) {
     public Map<String,Object> getBussDataInfo(Long pkeyId, int type, Boolean isFormLoading) {
         /*需要加载表单公式的时候isFormLoading==true*/
         /*需要加载表单公式的时候isFormLoading==true*/
         Document document=null;
         Document document=null;