yangyj 1 سال پیش
والد
کامیت
8d7ab3a224

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

@@ -43,6 +43,9 @@ public class InterimPaymentCertificate {
     /**本次实际支付金额合计*/
     @JSONField(name = "key_9",label="本次实际支付金额合计",ordinal = 9)
     private String total;
+    /**是否是汇总小结数据,输出的时候显示,计算的时候不参与*/
+    private Boolean isSummary=false;
+
     public void calculate(){
         BigDecimal previousPeriodEndPayBd = new BigDecimal(previousPeriodEndPay);
         BigDecimal currentPeriodPayBd = new BigDecimal(currentPeriodPay);

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

@@ -0,0 +1,62 @@
+package org.springblade.manager.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+/**
+ * @author yangyj
+ * @Date 2024/1/13 15:33
+ * @description 中期支付汇总表
+ */
+@Data
+public class InterimPaymentSummary {
+    public static final String ID="20220000000";
+    public static final String TBN="IPaySum";
+    public static final String TBN_CH="中期支付汇总表";
+    /**章次*/
+    @JSONField(name = "key_1",label="章次",ordinal = 1)
+    private String chapterSeq;
+    /**项目名称*/
+    @JSONField(name = "key_2",label="项目名称",ordinal = 2)
+    private String itemName;
+    /**合同金额*/
+    @JSONField(name = "key_3",label="合同金额",ordinal = 3)
+    private String contractAmount;
+    /**变更后的金额*/
+    @JSONField(name = "key_4",label="变更后的金额",ordinal = 4)
+    private String revisedAmount;
+    /**本次批准支付金额*/
+    @JSONField(name = "key_5",label="本次批准支付金额",ordinal = 5)
+    private String currentPeriodPay;
+    /**累计支付金额*/
+    @JSONField(name = "key_6",label="累计支付金额",ordinal = 6)
+    private String currentPeriodEndPay;
+    /**累计支付比例A*/
+    @JSONField(name = "key_7",label="累计支付比例A",ordinal = 7)
+    private String payRatioA;
+    /**累计支付比例B*/
+    @JSONField(name = "key_8",label="累计支付比例B",ordinal = 8)
+    private String payRatioB;
+    /**备注*/
+    @JSONField(name = "key_9",label="备注",ordinal = 9)
+    private String remark;
+    /**是否是汇总小结数据,输出的时候显示,计算的时候不参与*/
+    private Boolean summary=false;
+
+    public void calculate(){
+        /*本期累计金额*/
+        BigDecimal currentPeriodEndPayBd =new BigDecimal(currentPeriodEndPay);
+        /*合同金额*/
+        BigDecimal contractAmountBd =new BigDecimal(contractAmount);
+        /*变更金额*/
+        BigDecimal revisedAmountBd =new BigDecimal(revisedAmount);
+        this.currentPeriodEndPay = currentPeriodEndPayBd.toString();
+        BigDecimal payRatioA = currentPeriodEndPayBd.multiply(new BigDecimal(100)).divide(contractAmountBd, 2, RoundingMode.HALF_UP);
+        BigDecimal payRatioB = currentPeriodEndPayBd.multiply(new BigDecimal(100)).divide(revisedAmountBd, 2, RoundingMode.HALF_UP);
+        this.payRatioA=payRatioA.toString();
+        this.payRatioB=payRatioB.toString();
+    }
+}

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

@@ -0,0 +1,48 @@
+package org.springblade.manager.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+/**
+ * @author yangyj
+ * @Date 2024/1/13 17:28
+ * @description 分项工程中期支付汇总表
+ */
+public class SubprojectInterimPaymentSummary {
+    public static final String ID="20230000000";
+    public static final String TBN="SubIPaySum";
+    public static final String TBN_CH="分项工程中期支付汇总表";
+    /**项目名称*/
+    @JSONField(name = "key_1",label="项目名称",ordinal = 1)
+    private String itemName;
+    /**计量单位*/
+    @JSONField(name = "key_2",label="计量单位",ordinal = 2)
+    private String unit;
+    /**合同数量*/
+    @JSONField(name = "key_3",label="合同数量",ordinal = 3)
+    private String contractTotal;
+    /**变更数量*/
+    @JSONField(name = "key_4",label="变更数量",ordinal = 4)
+    private String revisedTotal;
+    /**本次完成数量*/
+    @JSONField(name = "key_5",label="本次完成数量",ordinal = 5)
+    private String currentPeriodComplete;
+    /**累计完成数量*/
+    @JSONField(name = "key_6",label="累计完成数量",ordinal = 6)
+    private String complete;
+    /**合同金额*/
+    @JSONField(name = "key_7",label="合同金额",ordinal = 7)
+    private String contractAmount;
+    /**变更后A金额*/
+    @JSONField(name = "key_8",label="变更后A金额",ordinal = 8)
+    private String revisedAmount;
+    /**上次支付金额*/
+    @JSONField(name = "key_9",label="上次支付金额",ordinal = 9)
+    private String previousPeriodEndPay;
+    /**累计支付B金额*/
+    @JSONField(name = "key_10",label="累计支付B金额",ordinal = 10)
+    private String currentPeriodEndPay;
+    /**比例*/
+    @JSONField(name = "key_11",label="比例",ordinal = 11)
+    private String payRatio;
+
+}

+ 72 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorSpecial.java

@@ -4,16 +4,19 @@ import com.mixsmart.utils.FormulaUtils;
 import com.mixsmart.utils.StringUtils;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import org.springblade.common.utils.BaseUtils;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringPool;
 import org.springblade.manager.dto.ElementData;
 import org.springblade.manager.dto.FormData;
 import org.springblade.manager.formula.FormulaExecutor;
 import org.springblade.manager.vo.*;
+import org.springframework.beans.BeanUtils;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
+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;
@@ -34,6 +37,8 @@ public class ExecutorSpecial extends FormulaExecutor {
         super(tec);
     }
     private List<Special> specialList = new ArrayList<>();
+    private List<Payment>  dataSource=new ArrayList<>();
+    private List<InterimPaymentCertificate> interimPaymentCertificates =new ArrayList<>();
 
     @Override
     public void handle() {
@@ -41,6 +46,7 @@ public class ExecutorSpecial extends FormulaExecutor {
             this.specialList.add(new MaterialCalc());
         }else if(MeterType.INTERIM.equals(tec.getMeterType())){
             this.specialList.add(new InterimPayCert());
+            this.specialList.add(new InterimSum());
         }
         this.specialList.stream().filter(Special::ready).forEach(Special::parse);
     }
@@ -194,8 +200,6 @@ public class ExecutorSpecial extends FormulaExecutor {
             return true;
         }
 
-
-
         private Function<List<InventoryForm>, Map<String, BigDecimal[]>> contractMoneySum = data -> data.stream()
                 .collect(Collectors.groupingBy(
                         form -> getPrefix(form.getFormNumber()),
@@ -216,8 +220,6 @@ public class ExecutorSpecial extends FormulaExecutor {
                         Collectors.reducing(BigDecimal.ZERO, Payment::getMoneyAsBigDecimal, BigDecimal::add)
                 ));
 
-
-
         public String getPrefix(String fn){
             for(InventoryForm itf:this.chapters){
                 String prefix=itf.getChapter();
@@ -232,13 +234,15 @@ public class ExecutorSpecial extends FormulaExecutor {
         public void parse() {
             LinkedHashMap<String,FormData> fdm = FormulaUtils.toFormDataMap(new InterimPaymentCertificate());
             tec.getFormDataMap().putAll(fdm);
-
             Map<String,Function<List<InterimPaymentCertificate>,List<Object>>> functionMap =FormulaUtils.fieldDataFcMap(InterimPaymentCertificate.class);
 
             List<InterimPaymentCertificate> dataList = new ArrayList<>();
             /*数据获取start*/
               /*支付数据*/
              List<Payment> paymentList=paymentListFc.apply(tec.getContractId());
+             if(!paymentList.isEmpty()){
+                 dataSource.addAll(paymentList);
+             }
              /*计量期*/
              MeterPeriodInfo periodInfo=interimMeterPeriodFc.apply(tec.getPeriodId());
              /*合同计量清单*/
@@ -290,7 +294,69 @@ public class ExecutorSpecial extends FormulaExecutor {
 
 
     }
+    @Data
+    public  class InterimSum implements Special{
+        @Override
+        public boolean ready() {
+            return interimPaymentCertificates.size()>0;
+        }
+
+        /*合计字段*/
+        BiFunction<List<InterimPaymentSummary>,Function<InterimPaymentSummary,String>,String>
+                bfc= (list,fc) -> StringUtils.number2String(list.stream().map(fc).mapToDouble(Double::parseDouble).sum(),1);
+        /*求百分比*/
+        BinaryOperator<String> ratioFc = (a,b)->{
+            /*合同金额*/
+            BigDecimal aBd =new BigDecimal(a);
+            /*变更金额*/
+            BigDecimal bBd =new BigDecimal(b);
+            if(BigDecimal.ZERO.compareTo(bBd)==0){
+                return "0.0";
+            }
+            return  aBd.multiply(new BigDecimal(100)).divide(bBd, 2, RoundingMode.HALF_UP).toString();
+        };
 
+        @Override
+        public void parse() {
+            LinkedHashMap<String,FormData> fdm = FormulaUtils.toFormDataMap(new InterimPaymentSummary());
+            Map<String,Function<List<InterimPaymentSummary>,List<Object>>> functionMap =FormulaUtils.fieldDataFcMap(InterimPaymentSummary.class);
+            tec.getFormDataMap().putAll(fdm);
+            List<InterimPaymentSummary> dataList=new ArrayList<>();
+            for(InterimPaymentCertificate ipc:interimPaymentCertificates){
+                InterimPaymentSummary ips = new InterimPaymentSummary();
+                BeanUtils.copyProperties(ipc,ips);
+                ips.calculate();
+                dataList.add(ips);
+            }
+            if(!dataList.isEmpty()){
+                /*最后一行的合计*/
+                InterimPaymentSummary summary = new InterimPaymentSummary();
+                summary.setSummary(true);
+                summary.setItemName("合计");
+                summary.setContractAmount(bfc.apply(dataList,InterimPaymentSummary::getContractAmount));
+                summary.setRevisedAmount(bfc.apply(dataList,InterimPaymentSummary::getRevisedAmount));
+                summary.setCurrentPeriodPay(bfc.apply(dataList,InterimPaymentSummary::getCurrentPeriodPay));
+                summary.setCurrentPeriodEndPay(bfc.apply(dataList,InterimPaymentSummary::getCurrentPeriodEndPay));
+                summary.setPayRatioA(ratioFc.apply(summary.getCurrentPeriodEndPay(),summary.getContractAmount()));
+                summary.setPayRatioA(ratioFc.apply(summary.getCurrentPeriodEndPay(),summary.getRevisedAmount()));
+                dataList.add(summary);
+                /*内容输出*/
+                FormulaUtils.put2FormData(fdm,functionMap,dataList);
+            }
+        }
+    }
+    @Data
+    public  class SubIPaySum implements Special{
+        @Override
+        public boolean ready() {
+            return dataSource.size()>0;
+        }
+
+        @Override
+        public void parse() {
+
+        }
+    }
 
 
 

+ 9 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -2539,6 +2539,14 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         return R.fail("无数据");
     }
 
+    public Map<String, String> getWtpParent(String meterType, String projectId) {
+        Map<String,Object> map=  this.jdbcTemplate.queryForMap("select id,wbs_id wbsId,CONCAT(ancestors,',',id) path from  m_wbs_tree_private a  where a.node_name=? and a.project_id=?",meterType,projectId);
+        Map<String,String> result = new HashMap<>();
+        for(Map.Entry<String,Object> entry:map.entrySet()){
+            result.put(entry.getKey(),StringUtils.handleNull(entry.getValue()));
+        }
+        return result;
+    }
 
     @Override
     public  List<ReportResult> execute3(Long contractId,Long periodId ,Integer type) {
@@ -2546,7 +2554,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         MeterType meterType = MeterType.getByIndex(type);
 
         /*元素创建*/
-        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,meterType.name(),contractInfo.getPId());
+        Map<String,String> parent=  getWtpParent(meterType.name(),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"));
         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(tableList.stream().map(NodeTable::getInitTableName).collect(Collectors.joining("','")));