瀏覽代碼

公式相关

yangyj 1 年之前
父節點
當前提交
d029e51501

+ 13 - 1
blade-common/src/main/java/org/springblade/common/utils/BaseUtils.java

@@ -149,7 +149,19 @@ public class BaseUtils {
        }
        return 0D;
     }
-
+    /*默认返回零*/
+    public static Integer obj2IntegerZero(Object obj) {
+        if(isNumber(obj)){
+            if(obj instanceof Number){
+                if(obj instanceof  BigDecimal){
+                    return str2BigDecimal(obj).intValue();
+                }
+                return (int) obj;
+            }
+            return Integer.parseInt(obj.toString());
+        }
+        return 0;
+    }
 
     /**
      * @Description  根据指定大小对LIST进行切分

+ 16 - 3
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/MeterInfo.java

@@ -4,6 +4,7 @@ import lombok.Data;
 import org.springblade.manager.dto.TreeNode;
 
 import java.util.LinkedHashMap;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
@@ -15,12 +16,20 @@ import java.util.concurrent.CompletableFuture;
  */
 @Data
 public class MeterInfo {
-    /*默认计量模版*/
+    /**默认计量模版*/
     public static Integer MB_GX=0;
-    /*浙江计量模版*/
+    /**浙江计量模版*/
     public static Integer MB_ZJ=1;
+    /**上期末*/
+    public static Integer PRE=0;
+    /**本期*/
+    public static Integer CUR=1;
+    /**本期末*/
+    public static Integer END=2;
     /**计量单元树*/
     private CompletableFuture<Map<Long, TreeNode<MeterTree>>> meterTreeMap;
+    /**计量单元树列表*/
+    List<MeterTree> meterTreeList;
     /**模版*/
     private Integer config=MB_GX;
     /**合同信息*/
@@ -32,8 +41,12 @@ public class MeterInfo {
     /**合同段所有开工预付款信息*/
     List<StartPayForm> startPayFormAll;
     /**变更令,按照计量清单  */
-    LinkedHashMap<String,List<ChangeToken>> changeTokenListMap;
+    LinkedHashMap<Integer,List<ChangeToken>> changeTokenListMap;
     /**合同段所有支付项信息*/
     List<MidPayItem> midPayItemList;
+    /**支付信息*/
+    List<Payment> paymentList;
+    /**需要延后生成FormData(元素对象)*/
+    List<DataModel> delay =new LinkedList<>();
 
 }

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

@@ -29,6 +29,8 @@ public class MeterPeriodInfo implements  DataModel{
      */
     @JSONField(name = "key_3",label="报告打印日期",ordinal = 3 ,format ="yyyy年MM月dd日")
     private LocalDate formPrintDate;
+    @JSONField(name = "key_12",label="当期年份",ordinal = 3)
+    private String year;
     /**上期累计金额*/
     @JSONField(name = "key_4",label="上期累计金额",ordinal = 4)
     private String  preTotal;
@@ -65,4 +67,7 @@ public class MeterPeriodInfo implements  DataModel{
     /**结束日期*/
     private LocalDate endDate;
 
+    public void init(){
+       this.year= String.valueOf(formPrintDate.getYear());
+    }
 }

+ 2 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/MeterTree.java

@@ -23,6 +23,8 @@ public class MeterTree {
     private String ancestor;
     @ApiModelProperty(value = "父级id")
     private Long parentId;
+    @ApiModelProperty(value = "合同金额")
+    private String amount;
     @ApiModelProperty(value = "排序")
     private Integer sort;
 

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

@@ -653,8 +653,9 @@ public class CustomFunction {
         return StringPool.EMPTY;
     }
 
+    /**合格率显示*/
     public static String passRateDisplay(List<Object> rate){
-        if(Func.isNotEmpty(rate)){
+        if(Func.isNotEmpty(rate)&&rate.stream().anyMatch(StringUtils::isNotEmpty)){
            Optional<Object> op= rate.stream().filter(BaseUtils::isNumber).findAny();
            if(op.isPresent()){
                return StringUtils.number2String(op.get(),1)+"%";
@@ -667,6 +668,7 @@ public class CustomFunction {
 
 
 
+
     public String checkItems(List<String> items, List<Object> l1, List<Object> l2, List<Object> l3, List<Object> l4, List<Object> l5, List<Object> l6, List<Object> l7, List<Object> l8, List<Object> l9, List<Object> l10, List<Object> l11, List<Object> l12) {
         List<List<Object>> data = new ArrayList<>(Arrays.asList(l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12));
         List<String> result = new ArrayList<>();
@@ -1090,6 +1092,8 @@ public class CustomFunction {
         LocalDateTime localDateTime;
         if(list.size()>=5&&list.size()<=7){
              localDateTime=LocalDateTime.of(list.get(0),list.get(1),list.get(2),list.get(3),list.get(4),0,0);
+        }else if(list.size()==3){
+            localDateTime=LocalDateTime.of(list.get(0),list.get(1),list.get(2),0,0,0,0);
         }else if(list.size()==2){
             localDateTime=LocalDateTime.now().withHour(list.get(0)).withMinute(list.get(1)).withSecond(0).withNano(0);
         }else{

+ 33 - 15
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorInit.java

@@ -38,20 +38,24 @@ public class ExecutorInit extends FormulaExecutor {
     private Function<Long,List<MeterPeriodInfo>> interimMeterPeriodAllFc;
     private Function<Long, List<MidPayItem>> midPayItemListFc;
     private Function<Long,List<ChangeToken>> changeTokenFc;
+    private Function<Long, List<Payment>> paymentListFc;
     public static final String SZ="[ 一二三四五六七八九十]+";
 
 
     public void handle() {
+        List<DataModel> delay =tec.meterInfo.getDelay();
         /*合同段信息*/
-        addBaseInfo();
+        delay.add(addBaseInfo());
         /*计量期信息*/
-        addPeriodInfo();
+        delay.add(addPeriodInfo());
     }
 
+
     /*预处理计量单元树*/
     private CompletableFuture<Map<Long, TreeNode<MeterTree>>> getMeterTreeMapAsync(Long contractId) {
         return CompletableFuture.supplyAsync(() -> {
             List<MeterTree> list = meterTreeFc.apply(contractId);
+            tec.meterInfo.setMeterTreeList(list);
             Function<MeterTree,TreeNode<MeterTree>> fc = m->{
                 TreeNode<MeterTree> treeNode = new TreeNode<>();
                 treeNode.setId(m.getId());
@@ -64,14 +68,15 @@ public class ExecutorInit extends FormulaExecutor {
             return FormulaUtils.list2TreeNode(TreeNode::getId,list,fc,TreeNode::getParentId);
         });
     }
-    private void addBaseInfo(){
+    private  BaseInfo  addBaseInfo(){
         /*加载合同数据*/
         BaseInfo baseInfo = baseInfoFc.apply(tec.getContractId());
         baseInfo.setTotalAmount(baseInfo.getContractAmount());
         tec.meterInfo.setBaseInfo(baseInfo);
-        dataModel2FormData(baseInfo);
+        return baseInfo;
+        //dataModel2FormData(baseInfo);
     }
-    private void addPeriodInfo(){
+    private MeterPeriodInfo addPeriodInfo(){
         if(MeterType.MATERIAL.equals(tec.getMeterType())||MeterType.START.equals(tec.getMeterType())){
             /*加载计量期信息*/
             tec.periodInfo=meterPeriodFc.apply(tec.getReportId());
@@ -88,11 +93,14 @@ public class ExecutorInit extends FormulaExecutor {
             startInfo();
             //变更令部分
             changeToken();
+            tec.meterInfo.setPaymentList(paymentListFc.apply(tec.getContractId()));
         }
         tec.setPeriodId(tec.periodInfo.getId());
+        tec.periodInfo.init();
         /*计量期编号格式化*/
         periodNumberFormat();
-        dataModel2FormData(tec.periodInfo);
+        return tec.periodInfo;
+        //dataModel2FormData(tec.periodInfo);
     }
 
     private void periodNumberFormat(){
@@ -131,15 +139,9 @@ public class ExecutorInit extends FormulaExecutor {
 
     private void changeToken(){
         List<ChangeToken> changeTokenList = changeTokenFc.apply(tec.getContractId());
-
-        LinkedHashMap<String,List<ChangeToken>>  map =new LinkedHashMap<>();
-        /* 本期变更 */
-        map.put("CUR",getFilteredChangeTokens(changeTokenList,tec.periodInfo,0));
-        /* 上期末变更 */
-        map.put("PRE",getFilteredChangeTokens(changeTokenList,tec.periodInfo,1));
-        /* 本期末变更 */
-        map.put("EDN",getFilteredChangeTokens(changeTokenList,tec.periodInfo,2));
-        tec.meterInfo.setChangeTokenListMap(map);
+        if(changeTokenList.size()>0){
+            tec.meterInfo.setChangeTokenListMap(changeTokenList.stream().collect(Collectors.groupingBy(changeTokenPick,LinkedHashMap::new,Collectors.toList())));
+        }
     }
 
     /**
@@ -172,4 +174,20 @@ public class ExecutorInit extends FormulaExecutor {
         }
     }
 
+    /**根据日期对变更令分类*/
+    Function<ChangeToken,Integer> changeTokenPick=token->{
+        int result =-1;
+        if(token.getChangeApprovalDate().isBefore(tec.periodInfo.getStartDate())){
+            /*上期末*/
+            result=MeterInfo.PRE;
+        }else if(tec.periodInfo.getStartDate().isBefore(token.getChangeApprovalDate()) && !tec.periodInfo.getEndDate().isBefore(token.getChangeApprovalDate())){
+            /*本期*/
+            result=MeterInfo.CUR;
+        }else if(!token.getChangeApprovalDate().isAfter(tec.periodInfo.getEndDate())){
+            /*本期末*/
+            result= MeterInfo.END;
+        }
+        return result;
+    };
+
 }

+ 33 - 9
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorMeter.java

@@ -18,6 +18,7 @@ import org.springframework.beans.BeanUtils;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.LocalDate;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
@@ -27,6 +28,7 @@ import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
+import java.util.stream.Stream;
 
 /**
  * @author yangyj
@@ -37,7 +39,7 @@ import java.util.stream.IntStream;
 @Data
 public class ExecutorMeter extends FormulaExecutor {
   /*  private Function<Long, List<Material>> materialFormFc;*/
-    private Function<Long, List<Payment>> paymentListFc;
+   /* private Function<Long, List<Payment>> paymentListFc;*/
    /* private Function<Long, List<MidPayItem>> midPayItemListFc;*/
     private Function<Long, List<InventoryForm>> inventoryFormFc;
     private Function<Long, List<MeterApply>> meterApplyFc;
@@ -139,6 +141,8 @@ public class ExecutorMeter extends FormulaExecutor {
             this.specialList.add(new StayPayCalc());
         }
         this.specialList.stream().filter(Special::ready).forEach(Special::parse);
+        /**把队列中的DataModel全部转换为FormData(元素)*/
+        tec.meterInfo.getDelay().forEach(this::dataModel2FormData);
     }
 
     @Data
@@ -395,7 +399,7 @@ public class ExecutorMeter extends FormulaExecutor {
             builderFormDatas(InterimPaymentCertificate.class);
             /*数据获取start*/
               /*支付数据*/
-             List<Payment> paymentList=paymentListFc.apply(tec.getContractId());
+             //List<Payment> paymentList=paymentListFc.apply(tec.getContractId());
              /*合同计量清单*/
              List<InventoryForm> inventoryForms = inventoryFormFc.apply(tec.getContractId());
              InventoryForm root = null;
@@ -412,15 +416,16 @@ public class ExecutorMeter extends FormulaExecutor {
                 }
             }
 
-            LinkedHashMap<String,List<ChangeToken>> changeTokenListMap= tec.meterInfo.getChangeTokenListMap();
+            LinkedHashMap<Integer,List<ChangeToken>> changeTokenListMap= tec.meterInfo.getChangeTokenListMap();
             /* 本期变更 */
-            List<ChangeToken> changeTokenList0 = changeTokenListMap.get("CUR");
+            List<ChangeToken> changeTokenList0 = changeTokenListMap.get(MeterInfo.CUR);
             /* 上期末变更 */
-            List<ChangeToken> changeTokenList1 =changeTokenListMap.get("PRE");
+            List<ChangeToken> changeTokenList1 =changeTokenListMap.get(MeterInfo.PRE);
             /* 本期末变更 */
-            List<ChangeToken> changeTokenList2 =changeTokenListMap.get("END");
+            List<ChangeToken> changeTokenList2 =changeTokenListMap.get(MeterInfo.END);
 
             Map<String,InterimPaymentCertificate> paymentCertificateMap = new LinkedHashMap<>();
+            List<Payment> paymentList=tec.meterInfo.getPaymentList();
              if(Func.isNotEmpty(paymentList)){
                  /*之前的计量期数据*/
                  previous = paymentList.stream().filter(e->e.getSort()<tec.periodInfo.getSort()).collect(Collectors.toList());
@@ -958,6 +963,7 @@ public class ExecutorMeter extends FormulaExecutor {
             });
             /* 实际完成,累计完成、按月完成*/
             List<List<List<Payment>>> all =totalList.stream().map(ConstructionSchedule::getMonthlyCompletion).collect(Collectors.toList());
+            /*每页重复出现*/
             FormulaUtils.beRelyFrom(tec.getFormDataMap(),ConstructionSchedule.TBN,"key_22,key_23,key_24").forEach(e->e.setRepeat(true));
             /*每月合计进度*/
             try {
@@ -979,7 +985,26 @@ public class ExecutorMeter extends FormulaExecutor {
 
             /* 合同概要*/
             FormulaUtils.elementFindByCode(fdm,ConstructionSchedule.TBN+":key_24").ifPresent(t->{
-                elementWriter.write(t,"开工日期:"+baseInfo.getStartDatePlan()+" 始算工期日:"+baseInfo.getStartDate()+" 合同完成日期:"+baseInfo.getEndDatePlan()+" 合同期限$4天 时间延长$5天 修改后合同期限"+ CustomFunction.daysPassed(baseInfo.getStartDate(),baseInfo.getEndDate()) +"天(即至"+baseInfo.getEndDate()+")\n 合同总价"+baseInfo.getContractAmount().divide(new BigDecimal(10000),2,RoundingMode.HALF_UP)+"万元、暂定金$9万元、工程量清单金额$10万元、BG估计最终金额$11万元");
+                /*合同时长*/
+                String contractDay=CustomFunction.join(CustomFunction.daysPassed(baseInfo.getStartDatePlan(),baseInfo.getEndDatePlan()),"").toString();
+                /*总时长*/
+                String totalDay=CustomFunction.join(CustomFunction.daysPassed(baseInfo.getStartDate(),baseInfo.getEndDate()),"").toString();
+                /*延长时间*/
+                int extended=BaseUtils.obj2IntegerZero(contractDay)-BaseUtils.obj2IntegerZero(totalDay);
+                /*已过去*/
+                String passDay=CustomFunction.join(CustomFunction.daysPassed(baseInfo.getStartDate(), LocalDate.now()),"").toString();
+                BigDecimal provisionalSum=tec.meterInfo.getMeterTreeList().stream().filter(e->e.getNodeCode().equals("D")).map(e->BaseUtils.str2BigDecimal(e.getAmount())).reduce(BigDecimal.ZERO,BigDecimal::add);
+                baseInfo.setProvisionalSum(StringUtils.number2String(provisionalSum,2));
+                BigDecimal changeTokenTotal=tec.meterInfo.getChangeTokenListMap().values().stream().flatMap(Collection::stream).map(ChangeToken::getTotalChangeMoney).reduce(BigDecimal.ZERO,BigDecimal::add);
+                double totalMoney = BaseUtils.obj2DoubleZero(baseInfo.getContractAmount())+BaseUtils.obj2DoubleZero(baseInfo.getProvisionalSum())+BaseUtils.obj2DoubleZero(baseInfo.getBOQAmount())+BaseUtils.obj2DoubleZero(changeTokenTotal);
+                String brief="开工日期:"+baseInfo.getStartDatePlan()+" 始算工期日:"+baseInfo.getStartDate()
+                        +" 合同完成日期:"+baseInfo.getEndDatePlan()+" 合同期限"+contractDay+"天 时间延长"+extended+"天 修改后合同期限"+ totalDay
+                        +"天(即至"+baseInfo.getEndDate()+")"
+                        + "\n 合同总价"+baseInfo.getContractAmount().divide(new BigDecimal(10000),2,RoundingMode.HALF_UP)+"万元、暂定金"
+                        +CustomFunction.xN(baseInfo.getProvisionalSum(),0.0001)+"万元、工程量清单金额"
+                        +CustomFunction.xN(baseInfo.getBOQAmount(),0.0001)+"万元、工程量变更("+CustomFunction.xN(changeTokenTotal,0.0001)+")万元、估计最终金额"+StringUtils.number2String(totalMoney,2)+"万元,时间已过"
+                        +passDay+"天,占合同工期"+StringUtils.number2String(ratioFc.apply(passDay,totalDay),2)+"%";
+                elementWriter.write(t,brief);
             });
 
             /*内容输出*/
@@ -1188,6 +1213,7 @@ public class ExecutorMeter extends FormulaExecutor {
                 double sum=dataList.stream().map(InterimMeterPaySummary::getMoney).filter(StringUtils::isNumber).mapToDouble(Double::parseDouble).sum();
                 summary.setMoney(StringUtils.number2StringZero(sum,tec.getScale()));
                 dataList.add(summary);
+                /*计量汇总表数量(浙江)*/
                 FormulaUtils.elementFindByCode(tec.getFormDataMap(),MeterPeriodInfo.TBN+":key_10").ifPresent(fd->{
                     elementWriter.write(fd,BaseUtils.sliceNumber(dataList.size(),capacity));
                 });
@@ -1289,8 +1315,6 @@ public class ExecutorMeter extends FormulaExecutor {
             FormData pageFd = fdm.get(FormulaUtils.getPageCode(clazz));
             if(pageFd!=null) {
                 int total = totalPage();
-                /*页面不重复*/
-                /*tec.getFormDataMap().values().stream().filter(e->e.executable()&& pageFd.getCode().equals(e.getFormula().getRely())).forEach(e->e.setRepeat(false));*/
                 String pageTmp = "第$1页 共" + total + "页";
                 pageFd.setValues(IntStream.rangeClosed(1, total).boxed().map(i -> new ElementData(pageTmp.replace("$1", i.toString()))).collect(Collectors.toList()));
             }

+ 46 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -355,6 +355,46 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                 }
                             }
                             if (g != null) {
+                                /*手写部分的数据加载*/
+                                if(t.getPoint().contains("混凝土强度")&&false){
+                                    List<Long> ids =getNodeType46(tec).stream().map(CurrentNode::getPkId).collect(Collectors.toList());
+                                    /*质检附表m_20230316104657_1636197331206406144*/
+                                    List<Map<String,Object>> listMaps=  this.jdbcTemplate.queryForList("select a.p_key_id,b.key_10 name,b.key_6 design,b.key_5 data from m_wbs_tree_contract a join m_20230316104657_1636197331206406144 b on a.p_key_id=b.p_key_id where  a.is_deleted=0 and a.parent_id ="+tec.getCurrentNode().getId());
+                                    if(listMaps.size()>0){
+                                        Map<String,String> coordsMap = FormulaUtils.getElementCell("/www/wwwroot/Users/hongchuangyanfa/Desktop/privateUrl/1636291886580760576.html");
+                                        String nameCd = coordsMap.get("key_10");
+                                        String designCd = coordsMap.get("key_6");
+                                        String dataCd = coordsMap.get("key_5");
+                                        List<Object> custom = new ArrayList<>();
+                                        /*遍历每一页*/
+                                        listMaps.stream().filter(m->StringUtils.handleNull(m.get("name")).contains("混凝土强度")).forEach(m->{
+                                            FormData itemName = FormulaUtils.createFormDataFast("项目名","key_10",m.get("data").toString(),nameCd);
+                                            FormData data = FormulaUtils.createFormDataFast("实测值","key_10",m.get("data").toString(),dataCd);
+                                            List<ElementData> eds = itemName.getValues();
+                                            /*汇集数据,用行号分割*/
+                                            eds.stream().filter(e->e.stringValue().contains("混凝土强度")).findAny().ifPresent(x->{
+                                                int index=eds.indexOf(x);
+                                                int end = index+1;
+                                                int y1= x.getY();
+                                                int y2= x.getY();
+                                                if(end<eds.size()){
+                                                    /*不是行尾*/
+                                                    y2=eds.get(end).getY();
+                                                }
+                                                int finalY = y2;
+                                                List<Object> tmp=data.getValues().stream().filter(e->e.getY()>=y1&&e.getY()<= finalY&&e.isNotEmpty()).map(ElementData::getValue).collect(Collectors.toList());
+                                                if(tmp.size()>0){
+                                                    custom.addAll(tmp);
+                                                }
+                                            });
+                                        });
+                                        if(custom.size()>0) {
+                                            int size = g.getList().size();
+                                            g.getList().get(size-1).getData().add(custom);
+                                        }
+                                    }
+                                }
+
                                 List<ItemBlock> itemBlockList = g.getList();
                                 int originSize = itemBlockList.size();
                                 List<Long> ids =getNodeType46(tec).stream().map(CurrentNode::getPkId).collect(Collectors.toList());
@@ -429,6 +469,12 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             e.printStackTrace();
         }
     }
+
+    /*手写部分的数据加载*/
+     public  void literal(){
+
+     }
+
     public void assessmentForm2(TableElementConverter tec){
         if(!ExecuteType.INSPECTION.equals(tec.getExecuteType())){
             return;