Browse Source

计量公式

yangyj 1 year ago
parent
commit
398f66a7a8

+ 3 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/InterimPaymentSummary.java

@@ -43,6 +43,9 @@ public class InterimPaymentSummary {
     /**备注*/
     @JSONField(name = "key_9",label="备注",ordinal = 9)
     private String remark;
+    /**至上前累计批准支付金额*/
+    @JSONField(name = "key_10",label="",ordinal = 4)
+    private String previousPay;
     /**是否是汇总小结数据,输出的时候显示,计算的时候不参与*/
     private Boolean summary=false;
 

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

@@ -15,7 +15,7 @@ public class MeterPeriodInfo {
     public static final String ID="20200000000";
     /**计量期信息表名*/
     public static final String TBN="MPI";
-    public static final String TBN_CH="开工材料计量期";
+    public static final String TBN_CH="计量期";
     /**计量期*/
     @JSONField(name = "key_1",label="计量期",ordinal = 1)
     private String periodNumber;

+ 12 - 2
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/SubInterimMeterPaySummary.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.annotation.JSONField;
 import lombok.Data;
 import org.apache.commons.lang.StringUtils;
 import org.springblade.common.utils.BaseUtils;
+import org.springblade.core.tool.utils.StringPool;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
@@ -29,6 +30,9 @@ public class SubInterimMeterPaySummary {
     /**计量单位*/
     @JSONField(name = "key_2",label="计量单位",ordinal = 2)
     private String unit;
+    /**单价*/
+    @JSONField(name = "key_12",label="单价",ordinal = 2)
+    private String price;
     /**合同数量*/
     @JSONField(name = "key_3",label="合同数量",ordinal = 3)
     private String contractTotal;
@@ -56,10 +60,13 @@ public class SubInterimMeterPaySummary {
     /**比例*/
     @JSONField(name = "key_11",label="变更令号",ordinal = 11)
     private String changeTokenId;
-
     /**第n页 共m页*/
     @JSONField(name = "key_12",label="页码",ordinal = 101)
     private String pageCount;
+    /*分项工程名称*/
+    @JSONField(name = "key_13",label="分项工程名称",ordinal = 102)
+    private String subProjectName;
+
 
     public void currentPeriodEndPayAdd(String n){
           List<String> list = new ArrayList<>();
@@ -75,7 +82,10 @@ public class SubInterimMeterPaySummary {
         this.setCompleted(String.valueOf(list.stream().filter(BaseUtils::isNumber).map(Object::toString).mapToInt(Integer::parseInt).sum()));
     }
 
-
+    /*获取*/
+    public static  String getSubPjFdCode(){
+        return TBN+ StringPool.COLON+"key_13";
+    }
 
     public SubInterimMeterPaySummary(String itemName) {
         this.itemName = itemName;

+ 3 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/SubprojectInterimPaymentSummary.java

@@ -49,6 +49,9 @@ public class SubprojectInterimPaymentSummary {
     @JSONField(name = "key_8",label="变更后A金额",ordinal = 8)
     private String changeMoney;
     /**上次支付金额*/
+    @JSONField(name = "key_13",label="本次支付金额",ordinal = 8)
+    private String previousPeriodPay;
+    /**本次支付金额*/
     @JSONField(name = "key_9",label="本次支付金额",ordinal = 9)
     private String currentPeriodPay;
     /**累计支付B金额*/

+ 36 - 5
blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java

@@ -800,7 +800,41 @@ public class FormulaUtils {
             return new HashMap<>();
         }
     }
-
+    public static Map<String, String> getElementExcelCoords(String uri){
+        return getElementExcelCoords(uri,null,null);
+    }
+    public static Map<String, String> getElementExcelCoords(String uri,String key,Document document){
+        try {
+            String filter=" [keyname]";
+            if(Func.isNotBlank(key)){
+                filter="[keyname^="+key+"__]";
+            }
+            if(document==null){
+                InputStream inputStreamByUrl = FileUtils.getInputStreamByUrl(uri);
+                document=Jsoup.parse(IoUtil.readToString(inputStreamByUrl));
+            }
+            Map<String,String> result= document
+                    .select("table").first()
+                    .select(filter).stream()
+                    .filter(d -> Func.isNotEmpty(d.attr("keyname"))).filter(StringUtils::isNotEmpty).map(e ->new String[]{e.attr("keyname").split("__")[0],e.attr("y1")+"_"+e.attr("x1")})
+                    .collect(
+                            Collectors.toMap(
+                                    b -> b[0],
+                                    b -> b[1],
+                                    (v1, v2) -> v1 + ";" + v2
+                            )
+                    );
+            if(result.size()>0){
+                for(Map.Entry<String,String> entry:result.entrySet()){
+                    entry.setValue(FormulaUtils.coordsSorted(entry.getValue()));
+                }
+            }
+            return result;
+        }catch (Exception e){
+            e.printStackTrace();
+            return new HashMap<>();
+        }
+    }
 
 
     public static List<ElementData> setScale(Integer scale, List<ElementData> data){
@@ -811,10 +845,7 @@ public class FormulaUtils {
         return data.stream().peek(e->{if(StringUtils.isDouble(e.getValue())){e.setValue(StringUtils.number2StringZero(e.getValue(),finalScale));}}).collect(Collectors.toList());
     }
 
-/*    public static void main(String[] args) {
-        Map<String,String> map=getElementCell("/www/wwwroot/Users/hongchuangyanfa/Desktop/privateUrl/1694630551069130752.html","key_22");
-        System.out.println(map);
-    }*/
+
     /**
      * @Description  定位信息排序
      * @Param [coords]

+ 25 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorMeter.java

@@ -72,6 +72,7 @@ public class ExecutorMeter extends FormulaExecutor {
         return fn;
     }
 
+
     Function<String,String> preFixFc= this::getPrefix;
 
 
@@ -550,6 +551,9 @@ public class ExecutorMeter extends FormulaExecutor {
             return current.size()>0;
         }
 
+        /*分项工程名称*/
+        List<String> subProjectName = new ArrayList<>();
+
         public BiFunction<Payment,Payment,SubInterimMeterPaySummary> payment2Smps=(payment,prePayment)->{
             SubInterimMeterPaySummary smps= new SubInterimMeterPaySummary();
             smps.setItemName(payment.getName());
@@ -610,6 +614,11 @@ public class ExecutorMeter extends FormulaExecutor {
                         tmp.add(summary);
                        return tmp.stream();
                     }).collect(Collectors.toList());
+                    /*分项数据*/
+                     FormData subPjFd = fdm.get(SubInterimMeterPaySummary.getSubPjFdCode());
+                     if(subPjFd!=null) {
+                         FormulaUtils.write(subPjFd, this.subProjectName);
+                     }
                     /*内容输出*/
                     putOut(SubInterimMeterPaySummary.class);
                 }
@@ -619,6 +628,7 @@ public class ExecutorMeter extends FormulaExecutor {
 
         }
 
+
         /*溯源并计算累计支付*/
         public  void treeNodeCheckedCount(TreeNode<MeterTree> tmp,Payment payment, Payment prePayment ){
             tmp.setChecked(true);
@@ -645,6 +655,7 @@ public class ExecutorMeter extends FormulaExecutor {
                 }
                 node=node.getParent();
             }
+
         }
 
         /*遍历树获取smps*/
@@ -654,25 +665,34 @@ public class ExecutorMeter extends FormulaExecutor {
                 List<TreeNode<MeterTree>> parts = top.getChildren();
                 for(TreeNode<MeterTree> node :parts){
                     List<SubInterimMeterPaySummary> list = new ArrayList<>();
-                    toSmps(node,list);
+                    toSubCollect(node,list);
                     if(list.size()>0){
                         total.add(list);
+                        /*计算每页的分项名称*/
+                        setSubPjName(node.getName(),list.size());
                     }
                 }
             }
             return total;
         }
 
-        public void toSmps(TreeNode<MeterTree> node,List<SubInterimMeterPaySummary> list){
+        /*获取checked状态的节点*/
+        public void toSubCollect(TreeNode<MeterTree> node,List<SubInterimMeterPaySummary> list){
             if(node.isChecked()){
                 list.add(node.getValue().getPeer());
                 if(node.hasChildren()){
                       for(TreeNode<MeterTree> child:node.getChildren()){
-                          toSmps(child,list);
+                          toSubCollect(child,list);
                       }
                 }
             }
         }
+        /*计算每页的分项名称*/
+        public void setSubPjName(String name ,int size){
+            this.subProjectName.addAll(Collections.nCopies((int)Math.ceil(size/(double)this.capacity),name));
+        }
+
+
 
     }
 
@@ -790,10 +810,11 @@ public class ExecutorMeter extends FormulaExecutor {
                 pageFd.setValues(IntStream.range(0, total).boxed().map(i -> new ElementData(pageTmp.replace("$1", i.toString()))).collect(Collectors.toList()));
             }
         }
-        /*写入对应的元素*/
+        /*动态行数据写入对应的元素*/
         public void putOut(){
             FormulaUtils.put2FormData(fdm, fieldDataFcMap,dataList);
         };
+        /*动态行数据写入对应的元素*/
         public void putOut(Class<T> clazz){
             pageNumber(clazz);
             FormulaUtils.put2FormData(fdm, fieldDataFcMap,dataList);

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/SubTable.java

@@ -35,6 +35,7 @@ public class SubTable {
     public SubTable(List<FormData> source) {
         if (source != null && source.size() > 0) {
             source.stream().filter(e -> KEYS.contains(e.getEName().trim())).forEach(fd -> {
+                /*这是把所有数据重置为空,如果要实现手填就必须分析出项目*/
                 fd.getValues().forEach(e -> e.setValue(null));
                 switch (KEYS.indexOf(fd.getEName().trim())) {
                     case 0:

+ 5 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaBaseService.java

@@ -88,4 +88,9 @@ public class FormulaBaseService extends BaseServiceImpl<FormulaBaseMapper, Formu
 
     }
 
+    /*用于自动绑定元素库和数据模型*/
+    public void modelBind(String bindId,String tableId){
+
+    }
+
 }

+ 40 - 16
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -1121,15 +1121,37 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             /*检验单附表处理*/
             List<FormData> inspectionList = new ArrayList<>();
             /*1检验表5评定表*/
-            tec.getTableAll().stream().filter(e -> e.getTableType().equals(1) ||e.getTableType().equals(5)).forEach(e -> {
-                /*获取所有挂在检验单、评定表里的元素映射关系*/
-                tec.getKeyMappers().stream().filter(p -> p.getPkId().equals(e.getPKeyId())).forEach(k -> {
-                    /*筛选元素长度超1页的元素*/
-                    List<FormData> target = tec.formDataMap.values().stream().filter(f -> f.getCode().equals(k.getCode()) && f.getAddPages() > 0).collect(Collectors.toList());
-                    if (Func.isNotEmpty(target)) {
-                        inspectionList.addAll(target);
-                    }
+            List<NodeTable> mainTable = tec.getTableAll().stream().filter(e -> (e.getTableType().equals(1) ||e.getTableType().equals(5))&&!e.getNodeName().contains("附表")).collect(Collectors.toList());
+            if(Func.isEmpty(mainTable)){
+                return;
+            }
+            NodeTable main = mainTable.get(0);
+            if(mainTable.size()>1){
+                /*超过一页全部删除*/
+                List<Long> removeIds = mainTable.stream().skip(1L).map(NodeTable::getPKeyId).collect(Collectors.toList());
+                tec.getKeyMappers().removeIf(e->removeIds.contains(e.getPkId()));
+                this.wbsTreeContractMapper.deleteByIds(removeIds);
+                /*多余的表删除之后需要,裁剪多余表头数据保留全部实测数据然后重新设置增页大小*/
+                tec.getKeyMappers().stream().filter(e->e.getPkId().equals(main.getPKeyId())).map(KeyMapper::getCode).forEach(e->{
+                   FormData target= tec.formDataMap.get(e);
+                   int capacity=target.getCoordsList().size();
+                   List<ElementData> eds = target.getValues();
+                   if(eds.size()>capacity){
+                       if(capacity>1){
+                          target.setAddPages((eds.size()/capacity)-1);
+                       }else{
+                          target.setValues(eds.stream().limit(capacity).collect(Collectors.toList()));
+                       }
+                   }
                 });
+            }
+            /*获取所有挂在检验单、评定表里的元素映射关系*/
+            tec.getKeyMappers().stream().filter(p -> p.getPkId().equals(main.getPKeyId())).forEach(k -> {
+                /*筛选元素长度超1页的元素*/
+                List<FormData> target = tec.formDataMap.values().stream().filter(f -> f.getCode().equals(k.getCode()) && f.getAddPages() > 0).collect(Collectors.toList());
+                if (Func.isNotEmpty(target)) {
+                    inspectionList.addAll(target);
+                }
             });
             if (Func.isNotEmpty(inspectionList)) {
                 /*检查是否存在附表,不存在挂载*/
@@ -1154,14 +1176,16 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     List<ElementData> overList = f.getValues().stream().skip(f.getCoordsList().size()).collect(Collectors.toList());
                     f.setValues(f.getValues().stream().limit(f.getCoordsList().size()).collect(Collectors.toList()));
                     f.setAddPages(0);
-                    String itemName=FormulaUtils.parseItemName(f.getEName());
-                    String key=itemName.trim();
-                    /*同项目*/
-                    Optional<FormData> designFdOp=  tec.formDataMap.values().stream().filter(o->o.getTableName().equals(f.getTableName())&&!o.equals(f)&&f.getMaxRow().equals(o.getMaxRow())&&o.getEName().contains("设计")).findAny();
-                    if(designFdOp.isPresent()){
-                        key+="@"+designFdOp.get().getValues().stream().map(ElementData::getValue).filter(StringUtils::isNotEmpty).findAny().orElse("");
+                    if(overList.stream().anyMatch(ElementData::isNotEmpty)) {
+                        String itemName = FormulaUtils.parseItemName(f.getEName());
+                        String key = itemName.trim();
+                        /*同项目*/
+                        Optional<FormData> designFdOp = tec.formDataMap.values().stream().filter(o -> o.getTableName().equals(f.getTableName()) && !o.equals(f) && f.getMaxRow().equals(o.getMaxRow()) && o.getEName().contains("设计")).findAny();
+                        if (designFdOp.isPresent()) {
+                            key += "@" + designFdOp.get().getValues().stream().map(ElementData::getValue).filter(StringUtils::isNotEmpty).findAny().orElse("");
+                        }
+                        sta.put(key, FormulaUtils.setScale(null, overList));
                     }
-                    sta.put(key,FormulaUtils.setScale(null,overList));
                 });
                 if(sta.checked()){
                     /*把附表数据刷入对应的附表元素对象*/
@@ -2628,7 +2652,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         /*元素创建*/
         Map<String,String> parent=  getWtpParent(meterType.getName(),contractInfo.getPId());
         List<NodeTable> tableList=getTableListMeter(parent);
-        Map<String,Map<String,String>> coordinateMap=tableList.parallelStream().collect(Collectors.toMap(NodeTable::getInitTableName,m->FormulaUtils.getElementCell(m.getHtmlUrl()),(v1,v2)->v2));
+        Map<String,Map<String,String>> coordinateMap=tableList.parallelStream().collect(Collectors.toMap(NodeTable::getInitTableName,m->FormulaUtils.getElementExcelCoords(m.getHtmlUrl()),(v1,v2)->v2));
         List<FormData> processFds = this.createFormDataByTableName(tableList.stream().map(NodeTable::getInitTableName).collect(Collectors.joining("','")));
         listForMeter(processFds,contractInfo.getPId(),parent.get("id"));