|
@@ -16,6 +16,7 @@ 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.function.BiFunction;
|
|
@@ -600,46 +601,82 @@ public class ExecutorMeter extends FormulaExecutor {
|
|
|
sis.setPayRatio(ratioFc.apply(sis.getCurrentPeriodEndPay(),sis.getChangeMoney()));
|
|
|
totalList.add(sis);
|
|
|
});
|
|
|
- LinkedHashMap<String,List<SubprojectInterimPaymentSummary>> chapterGroup= totalList.stream().collect(Collectors.groupingBy(e->getPrefix(e.getFormNumber()),LinkedHashMap::new,Collectors.toList()));
|
|
|
- AtomicInteger loop = new AtomicInteger(chapterGroup.size());
|
|
|
- chapterGroup.forEach((k,v)->{
|
|
|
- int extra=loop.getAndDecrement()>0?1:2;
|
|
|
- /*每章小结或总结等价一行数据*/
|
|
|
- int dataLength=v.size()+extra;
|
|
|
- /*每页小结是固定内容,需要每页保留一行*/
|
|
|
- int dataAreaSize=capacity-1;
|
|
|
- int pageSize=(int)Math.ceil(dataLength/(double)dataAreaSize);
|
|
|
- List<List<SubprojectInterimPaymentSummary>> ds = BaseUtils.splitList(v,capacity-1);
|
|
|
- List<SubprojectInterimPaymentSummary> tmp = new ArrayList<>();
|
|
|
- for(int n=0;n<pageSize;n++){
|
|
|
- List<SubprojectInterimPaymentSummary> currentPageData =ds.get(n);
|
|
|
- tmp.addAll(currentPageData);
|
|
|
- int m=1;
|
|
|
- if(pageSize-n==1){
|
|
|
- m+=extra;
|
|
|
- }
|
|
|
- int placeholderSize = capacity-m-currentPageData.size();
|
|
|
- if(placeholderSize>0){
|
|
|
- tmp.addAll(Collections.nCopies(placeholderSize,new SubprojectInterimPaymentSummary()));
|
|
|
- }
|
|
|
- subtotal(new SubprojectInterimPaymentSummary("本页小计"),tmp,currentPageData,tec.getScale());
|
|
|
- if(m>1) {
|
|
|
- /*本章小结*/
|
|
|
- subtotal(new SubprojectInterimPaymentSummary("章合计"),tmp,v,tec.getScale());
|
|
|
- }
|
|
|
- if(m>2){
|
|
|
- /*所有章合计*/
|
|
|
- subtotal(new SubprojectInterimPaymentSummary("所有章合计"),tmp,totalList,tec.getScale());
|
|
|
+ if(MeterInfo.MB_ZJ.equals(tec.meterInfo.getConfig())){
|
|
|
+ /*把所有计量期根据打印日期按自然月分类,支付信息按计量期分类*/
|
|
|
+ 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();
|
|
|
+ /*单项占合同价的比例*/
|
|
|
+ sis.setItemPercent(ratioFc.apply(sis.getChangeMoney(),baseInfo.getTotalAmount().toString()));
|
|
|
+ /*单项计划完成完成比例*/
|
|
|
+ sis.setItemProgress(ratioFc.apply(sis.getCurrentPeriodEndPay(),sis.getChangeMoney()));
|
|
|
+ /*本期占合同金额*/
|
|
|
+ sis.setCurrentPayPercent(ratioFc.apply(sis.getCurrentPeriodPay(), sis.getChangeMoney()));
|
|
|
+ /*本期末累计支付金额占合同比*/
|
|
|
+ sis.setPayPercent(ratioFc.apply(sis.getCurrentPeriodEndPay(),sis.getChangeMoney()));
|
|
|
+ /*根据月份来获取payment*/
|
|
|
+ sis.getFormNumber();
|
|
|
+ });
|
|
|
+ }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());
|
|
|
+ chapterGroup.forEach((k,v)->{
|
|
|
+ int extra=loop.getAndDecrement()>0?1:2;
|
|
|
+ /*每章小结或总结等价一行数据*/
|
|
|
+ int dataLength=v.size()+extra;
|
|
|
+ /*每页小结是固定内容,需要每页保留一行*/
|
|
|
+ int dataAreaSize=capacity-1;
|
|
|
+ int pageSize=(int)Math.ceil(dataLength/(double)dataAreaSize);
|
|
|
+ List<List<SubprojectInterimPaymentSummary>> ds = BaseUtils.splitList(v,capacity-1);
|
|
|
+ List<SubprojectInterimPaymentSummary> tmp = new ArrayList<>();
|
|
|
+ for(int n=0;n<pageSize;n++){
|
|
|
+ List<SubprojectInterimPaymentSummary> currentPageData =ds.get(n);
|
|
|
+ tmp.addAll(currentPageData);
|
|
|
+ int m=1;
|
|
|
+ if(pageSize-n==1){
|
|
|
+ m+=extra;
|
|
|
+ }
|
|
|
+ int placeholderSize = capacity-m-currentPageData.size();
|
|
|
+ if(placeholderSize>0){
|
|
|
+ tmp.addAll(Collections.nCopies(placeholderSize,new SubprojectInterimPaymentSummary()));
|
|
|
+ }
|
|
|
+ subtotal(new SubprojectInterimPaymentSummary("本页小计"),tmp,currentPageData,tec.getScale());
|
|
|
+ if(m>1) {
|
|
|
+ /*本章小结*/
|
|
|
+ subtotal(new SubprojectInterimPaymentSummary("章合计"),tmp,v,tec.getScale());
|
|
|
+ }
|
|
|
+ if(m>2){
|
|
|
+ /*所有章合计*/
|
|
|
+ subtotal(new SubprojectInterimPaymentSummary("所有章合计"),tmp,totalList,tec.getScale());
|
|
|
+ }
|
|
|
+ dataList.addAll(tmp);
|
|
|
+ tmp.clear();
|
|
|
}
|
|
|
- dataList.addAll(tmp);
|
|
|
- tmp.clear();
|
|
|
- }
|
|
|
- });
|
|
|
+ });
|
|
|
+ }
|
|
|
/*内容输出*/
|
|
|
putOut(SubprojectInterimPaymentSummary.class);
|
|
|
}
|
|
|
|
|
|
|
|
|
+ /*从日期获取月份*/
|
|
|
+ Function<String,Integer> date2Int = s->{
|
|
|
+ String[] arr = s.split("\\D+");
|
|
|
+ if(arr.length>=3){
|
|
|
+ return BaseUtils.handleObj2Integer(arr[1]);
|
|
|
+ }
|
|
|
+ return 1;
|
|
|
+ };
|
|
|
+
|
|
|
public void subtotal(SubprojectInterimPaymentSummary b, List<SubprojectInterimPaymentSummary> result ,List<SubprojectInterimPaymentSummary> data,Integer scale){
|
|
|
b.calculate(data,scale);
|
|
|
|
|
@@ -695,7 +732,7 @@ public class ExecutorMeter extends FormulaExecutor {
|
|
|
/*根据每一期的s_middle_meter_apply,s_inventory_form_apply 获取对应的计量清单,然后根据清单Id配合s_inventory_form_meter查找计量单元信息*/
|
|
|
/*s_change_token_inventory每个清单关联的变更令,s_change_token_meter每个计量单元关联的变更令*/
|
|
|
try {
|
|
|
- Map<Long, TreeNode<MeterTree>> treeNodeMap = tec.meterTreeMap.get();
|
|
|
+ Map<Long, TreeNode<MeterTree>> treeNodeMap = tec.meterInfo.getMeterTreeMap().get();
|
|
|
Optional<TreeNode<MeterTree>> opTreeNode= treeNodeMap.values().stream().filter(TreeNode::isTop).findAny();
|
|
|
if(opTreeNode.isPresent()) {
|
|
|
/*计量单元根节点*/
|