yangyj 1 gadu atpakaļ
vecāks
revīzija
7378088b1c

+ 2 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormData.java

@@ -111,6 +111,8 @@ public class FormData {
      * 是否完成执行
      */
     private Boolean finished = false;
+    /**是否去空格*/
+    private Boolean isRemoveEmpty=false;
     /**是否已经初始化好数据*/
     private Boolean initReady=false;
     /**0表头表尾,1正文*/

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

@@ -27,7 +27,7 @@ public class MeterPeriodInfo {
     /**
      * 报表打印日期
      */
-    @JSONField(name = "key_3",label="报告打印日期",ordinal = 3)
+    @JSONField(name = "key_3",label="报告打印日期",ordinal = 3 ,format ="yyyy年MM月dd日")
     private LocalDate formPrintDate;
     /**上期累计金额*/
     @JSONField(name = "key_4",label="上期累计金额",ordinal = 4)

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

@@ -86,7 +86,7 @@ public class SubprojectInterimPaymentSummary {
     private String payPercent;
     /**本期末累计占变更后的总金额*/
     @JSONField(name = "key_21",label="按月计划与实际完成-ZJ",ordinal = 101)
-    private List<String> monthlyCompletion ;
+    private List<List<Payment>> monthlyCompletion = new ArrayList<>() ;
     /**累计实际完成*/
     @JSONField(name = "key_22",label="累计实际完成-ZJ",ordinal = 101)
     private String actualCompletion;
@@ -99,18 +99,15 @@ public class SubprojectInterimPaymentSummary {
         this.itemName = itemName;
         this.currentPeriodPay = "0.0";
         this.currentPeriodEndPay = "0.0";
-        this.monthlyCompletion= Collections.nCopies(12,StringPool.EMPTY);
     }
 
     public SubprojectInterimPaymentSummary(String itemName, String currentPeriodPay, String currentPeriodEndPay) {
         this.itemName = itemName;
         this.currentPeriodPay = currentPeriodPay;
         this.currentPeriodEndPay = currentPeriodEndPay;
-        this.monthlyCompletion= Collections.nCopies(12,StringPool.EMPTY);
     }
 
     public SubprojectInterimPaymentSummary() {
-        this.monthlyCompletion= Collections.nCopies(12,StringPool.EMPTY);
     }
 
     public void count( @NotNull Consumer<String> setting ,@NotNull  List<SubprojectInterimPaymentSummary> data, @NotNull  Function<SubprojectInterimPaymentSummary,String> fc,@NotNull Integer scale){

+ 8 - 0
blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java

@@ -1374,6 +1374,14 @@ public static Map<String,List<Long>> relatedPages(List<FormData> curFormDatas ,L
         System.out.println(chineseToArabic("一百二十二"));
         System.out.println(chineseToArabic("一百零二"));*//*
     }*/
+    /*获取引用code的元素*/
+    public static  Stream<FormData>  beRelyFrom( Map<String, FormData> formDataMap ,String code){
+        return formDataMap.values().stream().filter(e->e.executable()&& code.equals(e.getFormula().getRely()));
+    }
+    /*根据code查找元素 */
+    public static  Optional<FormData>  elementFindByCode( Map<String, FormData> formDataMap ,String code){
+        return formDataMap.values().stream().filter(e->code.equals(e.getCode())).findAny();
+    }
 
     public static List<TableInfo> getTableInfoList(JSONArray dataArray) {
         if (dataArray != null && !dataArray.isEmpty()) {

+ 69 - 13
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorMeter.java

@@ -16,15 +16,14 @@ import org.springframework.beans.BeanUtils;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.BiFunction;
 import java.util.function.BinaryOperator;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
-import java.util.stream.Stream;
 
 /**
  * @author yangyj
@@ -605,16 +604,11 @@ public class ExecutorMeter extends FormulaExecutor {
                 /*把所有计量期根据打印日期按自然月分类,支付信息按计量期分类*/
                LinkedHashMap<Long,MeterPeriodInfo> meterPeriodInfoMap = tec.meterInfo.getMeterPeriodInfoLinkedHashMap();
                LinkedHashMap<Integer,MeterPeriodInfo> monthMeterMap=meterPeriodInfoMap.values().stream().collect(Collectors.toMap(e->e.getFormPrintDate().getMonthValue(),t->t,(v1,v2)->v2,LinkedHashMap::new));
-               /*根据计量期分组*/
-               Map<Long,List<Payment>> paymentGroup=paymentsPeriodEnd.stream().collect(Collectors.groupingBy(Payment::getPeriodId,Collectors.toList()));
-               monthMeterMap.forEach((k,v)->{
-                   for(int i = 1; i<= k; i++){
-                       MeterPeriodInfo tmp = monthMeterMap.get(k);
-
-                   }
-               });
-               totalList.forEach(sis->{
-                   BaseInfo baseInfo =tec.meterInfo.getBaseInfo();
+               /*根据清单编号、计量期分组*/
+                Map<String,Map<Long,List<Payment>>> paymentGroup=paymentsPeriodEnd.stream().collect(Collectors.groupingBy(Payment::getNumber,Collectors.groupingBy(Payment::getPeriodId,Collectors.toList())));
+               int max=monthMeterMap.keySet().stream().max(Comparator.comparingInt(t->t)).orElse(12);
+                BaseInfo baseInfo =tec.meterInfo.getBaseInfo();
+                totalList.forEach(sis->{
                    /*单项占合同价的比例*/
                    sis.setItemPercent(ratioFc.apply(sis.getChangeMoney(),baseInfo.getTotalAmount().toString()));
                    /*单项计划完成完成比例*/
@@ -624,8 +618,70 @@ public class ExecutorMeter extends FormulaExecutor {
                    /*本期末累计支付金额占合同比*/
                    sis.setPayPercent(ratioFc.apply(sis.getCurrentPeriodEndPay(),sis.getChangeMoney()));
                    /*根据月份来获取payment*/
-                   sis.getFormNumber();
+                   Map<Long,List<Payment>> meterPaymentGroup = paymentGroup.get(sis.getFormNumber());
+                   /*当前月已经累计的*/
+                   List<Payment> pl =new ArrayList<>();
+                   for(int i=1;i<=max;i++){
+                       MeterPeriodInfo period = monthMeterMap.get(i);
+                       if(period!=null) {
+                           List<Payment> pays = meterPaymentGroup.get(period.getId());
+                           if (Func.isNotEmpty(pays)) {
+                               pl.addAll(pays);
+                           }
+                       }
+                       if(pl.size()>0) {
+                           sis.getMonthlyCompletion().add(new ArrayList<>(pl));
+                       }
+                   }
                });
+                /*输出设置*/
+                /*合同按月计划完成进度*/
+                fieldDataFcMap.put(SubprojectInterimPaymentSummary.TBN+":key_21",dl->dl.stream().flatMap(e->{
+                    List<List<Payment>> l= e.getMonthlyCompletion();
+                    return  IntStream.range(0,12).boxed().map(month->{
+                        if(month>=l.size()){
+                            return StringPool.EMPTY;
+                        }else{
+                            List<Payment> cur=l.get(month);
+                            String money=cur.stream().map(Payment::getMoneyAsBigDecimal).reduce(BigDecimal.ZERO,BigDecimal::add).toString();
+                            String change =cur.get(0).getChangeMoney();
+                            return ratioFc.apply(money,change);
+                        }
+                    });
+               }).collect(Collectors.toList()));
+                /*分页*/
+                List<List<SubprojectInterimPaymentSummary>> pageList = BaseUtils.splitList(totalList,capacity);
+                BiFunction<List<SubprojectInterimPaymentSummary>,Function<SubprojectInterimPaymentSummary,String>,String> sumFc= (page,fc)->page.stream().map(fc).map(BaseUtils::str2BigDecimal).reduce(BigDecimal.ZERO,BigDecimal::add).toString();
+                pageList.forEach(page->{
+                        dataList.addAll(page);
+                        SubprojectInterimPaymentSummary sis = new SubprojectInterimPaymentSummary("合计 (万元)");
+                        /*合同金额*/
+                        sis.setContractMoney(sumFc.apply(page,SubprojectInterimPaymentSummary::getContractMoney));
+                        /*变更后的金额*/
+                        sis.setChangeMoney(sumFc.apply(page,SubprojectInterimPaymentSummary::getChangeMoney));
+                        /*实际工程量金额*/
+                        sis.setCurrentPeriodPay(page.stream().map(SubprojectInterimPaymentSummary::getCurrentPeriodPay).map(BaseUtils::str2BigDecimal).reduce(BigDecimal.ZERO,BigDecimal::add).toString());
+                        dataList.add(sis);
+                });
+                /*实际完成,累计完成、按月完成*/
+                List<List<List<Payment>>> all =totalList.stream().map(SubprojectInterimPaymentSummary::getMonthlyCompletion).collect(Collectors.toList());
+                FormulaUtils.beRelyFrom(fdm,SubprojectInterimPaymentSummary.TBN+":key_22").forEach(e->e.setRepeat(true));
+                FormulaUtils.beRelyFrom(fdm,SubprojectInterimPaymentSummary.TBN+":key_23").forEach(e->e.setRepeat(true));
+                /*每月合计进度*/
+                List<String> monthlySum= IntStream.range(0,max).boxed().map(month->{
+                    List<Payment> tmp=  all.stream().flatMap(row->row.get(month).stream()).collect(Collectors.toList());
+                    return  ratioFc.apply(tmp.stream().map(Payment::getMoneyAsBigDecimal).reduce(BigDecimal.ZERO,BigDecimal::add).toString(),baseInfo.getTotalAmount().toString());
+                }).collect(Collectors.toList());
+                FormulaUtils.elementFindByCode(fdm,SubprojectInterimPaymentSummary.TBN+":key_22").ifPresent(t->{
+                    elementWriter.write(t,monthlySum);
+                });
+
+                AtomicReference<Double> cp = new AtomicReference<>(0.0);
+                FormulaUtils.elementFindByCode(fdm,SubprojectInterimPaymentSummary.TBN+":key_23").ifPresent(t->{
+                    elementWriter.write(t, monthlySum.stream().map(e->{double r=BaseUtils.obj2DoubleZero(e)- cp.get();
+                        cp.set(BaseUtils.obj2DoubleZero(e));return r;}).collect(Collectors.toList()));
+                });
+
             }else{
                 LinkedHashMap<String,List<SubprojectInterimPaymentSummary>> chapterGroup= totalList.stream().collect(Collectors.groupingBy(e->getPrefix(e.getFormNumber()),LinkedHashMap::new,Collectors.toList()));
                 AtomicInteger loop = new AtomicInteger(chapterGroup.size());

+ 8 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -904,9 +904,12 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                       tmp=tmp.replace(mg.group(),ka[0]+"['"+ka[1]+"']");
                   }
                 }
-                /*假如是直接取数,则补充上非空过滤*/
-                if(tmp.matches("^E\\[m_\\d{14}_\\d{19}:key_\\d{0,3}]$")){
+                /*假如是直接取数,则补充上非空过滤,排除元素自我引用情况*/
+                if(StringUtils.isNotEquals(fd.getCode(),fd.getFormula().getRely())&&tmp.matches("^E\\[m_\\d{14}_\\d{19}:key_\\d{0,3}]$")){
                     tmp="FC.removeEmpty("+tmp+")";
+                }else if(!tmp.contains("removeEmpty")){
+                    /*如果不用去空公式,且元素自我引用就可以视为手填*/
+                    fd.setIsRemoveEmpty(true);
                 }
                 tmp = tmp.replace(FC, CustomFunction.CLASS_CALL);
                 if(tmp.contains("E[")||tmp.contains("WP[")){
@@ -1477,7 +1480,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                 fd.setUpdate(1);
             }
         }else {
-            FormulaUtils.write(fd, data, false);
+            FormulaUtils.write(fd, data, fd.getIsRemoveEmpty());
         }
     }
 
@@ -2651,9 +2654,9 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     @Override
     /*合同段id,报表Id,报表类型中间计量0,材料1,开工2*/
     public  List<ReportResult> execute3(Long contractId,Long reportId ,Integer type) {
+        ExecutionTime executionTime = new ExecutionTime();
         ContractInfo contractInfo = this.contractInfoService.getById(contractId);
         MeterType meterType = MeterType.getByIndex(type);
-
         /*元素创建*/
         Map<String,String> parent=  getWtpParent(meterType.getName(),contractInfo.getPId());
         List<NodeTable> tableList=getTableListMeter(parent);
@@ -2711,6 +2714,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         formulaHandleChains.add(new ExecutorFormat(tec));
         formulaHandleChains.forEach(FormulaHandleChain::handle);
         tec.after();
+        executionTime.info("公式计算");
         return tec.getReportResults();
     }