소스 검색

中间计量表

yangyj 1 년 전
부모
커밋
ba6a54b86b
1개의 변경된 파일131개의 추가작업 그리고 5개의 파일을 삭제
  1. 131 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorMeter.java

+ 131 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorMeter.java

@@ -11,18 +11,18 @@ import org.springblade.common.utils.BaseUtils;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.RegexUtil;
 import org.springblade.core.tool.utils.StringPool;
 import org.springblade.manager.dto.ElementData;
 import org.springblade.manager.dto.FormData;
 import org.springblade.manager.dto.TreeNode;
 import org.springblade.manager.formula.ElementWriter;
+import org.springblade.manager.formula.NodeTable;
 import org.springblade.manager.vo.*;
 import org.springblade.meter.entity.InterimPayCertificateItem;
 import org.springframework.beans.BeanUtils;
 
 
-import java.io.ByteArrayOutputStream;
-import java.io.FileOutputStream;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDate;
@@ -30,6 +30,7 @@ import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.*;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
@@ -60,6 +61,9 @@ public class ExecutorMeter extends FormulaExecutor {
     /*本期材料支付信息*/
     List<Material>materials;
 
+    /**是否是浙江模版*/
+    private  boolean isZJ=false;
+
     private List<InterimPaymentCertificate> interimPaymentCertificates =new ArrayList<>();
     /*分项中期汇总*/
     private List<SubprojectInterimPaymentSummary> subprojectInterimPaymentSummary =new ArrayList<>();
@@ -184,6 +188,7 @@ public class ExecutorMeter extends FormulaExecutor {
     @Override
     public void handle() {
         this.elementWriter=new MeterElementWriter();
+        isZJ=MeterInfo.MB_ZJ.equals(tec.getMeterInfo().getTemplate());
         if(MeterType.MATERIAL.equals(tec.getMeterType())){
             /*材料预付款支付申请表处理*/
             this.specialList.add(new MaterialCalc());
@@ -199,8 +204,9 @@ public class ExecutorMeter extends FormulaExecutor {
             /*分项工程中期计量支付表*/
             this.specialList.add(new SubIMeterPay());
             this.specialList.add(new IMeterPaySummary());
-            /*中间计量表*/
+            /*中间计量表,中间计量表*/
             this.specialList.add(new IMeter());
+            this.specialList.add(new IMeterChapter());
         }else if(MeterType.INTERIM_JL.equals(tec.getMeterType())){
             /*监理*/
             this.specialList.add(new SupervisionCertificateSp());
@@ -1730,13 +1736,132 @@ public class ExecutorMeter extends FormulaExecutor {
     }
 
 
+    @Data
+    @EqualsAndHashCode(callSuper = true)
+    public class IMeterChapter extends   BaseSpecial<InterimMeter> implements Special{
+
+        @Override
+        public boolean ready() {
+             return isZJ&&current.size()>0;
+        }
+        private Function<MeterApply,String> chapterNumberFc= meterApply -> {
+          String[]  arr= meterApply.getMeterNumber().split("-");
+          return BaseUtils.handleObj2Integer(arr[arr.length-1])*100+"章";
+        };
+        private Function<NodeTable,String> chapterNumberTableFc= nodeTable -> RegexUtil.findResult("\\d+章",nodeTable.getNodeName());
+
+        @Override
+        public void parse() {
+            builderFormDatas(InterimMeter.class);
+            List<MeterApply> meterApplyList=meterApplyFc.apply(tec.getPeriodId());
+            LinkedHashMap<String,List<MeterApply>> meterApplyGroup = meterApplyList.stream().collect(Collectors.groupingBy(chapterNumberFc,LinkedHashMap::new,Collectors.toList()));
+            /*删除没有计量的章节,返回需要显示的章节*/
+            LinkedHashMap<String,NodeTable> table2E16Map= removeNodeTable(meterApplyGroup);
+            Map<Long,List<Payment>> paymentGroup = current.stream().collect(Collectors.groupingBy(Payment::getMiddleMeterId));
+            /*支付号,项目名称,单位,申报数量*/
+            Function<Function<InterimMeter,List<String>>,Function<List<InterimMeter>, List<Object>>> interimMeters2oListFc=i2s->dl->dl.stream().flatMap(e->i2s.apply(e).stream()).collect(Collectors.toList());
+            fieldDataFcMap.put(InterimMeter.TBN+":key_10",interimMeters2oListFc.apply(InterimMeter::getFormNumberList));
+            fieldDataFcMap.put(InterimMeter.TBN+":key_11",interimMeters2oListFc.apply(InterimMeter::getItemNameList));
+            fieldDataFcMap.put(InterimMeter.TBN+":key_12",interimMeters2oListFc.apply(InterimMeter::getUnitList));
+            fieldDataFcMap.put(InterimMeter.TBN+":key_13",interimMeters2oListFc.apply(InterimMeter::getCompletedList));
+            FormData pageTotal = fdm.get(FormulaUtils.getPageTotal(InterimMeter.class));
+            FormData pageIndex = fdm.get(FormulaUtils.getPageIndex(InterimMeter.class));
+            /*用来恢复*/
+            int capacityBak=capacity;
+            /*用于页数累计*/
+            AtomicInteger pageSum= new AtomicInteger();
+            meterApplyGroup.forEach((k,v)->{
+                NodeTable table2E16=table2E16Map.get(k);
+                if(table2E16!=null) {
+                    for (MeterApply meterApply : v) {
+                        List<Payment> paymentList = paymentGroup.get(meterApply.getId());
+                        List<List<Payment>> pageData = BaseUtils.splitList(paymentList, capacity);
+                        for (List<Payment> payments : pageData) {
+                            /*根据清单数量决定一条中间计量申请显示多少页*/
+                            InterimMeter iim = new InterimMeter();
+                            BeanUtils.copyProperties(meterApply, iim);
+                            int over = capacity - payments.size();
+                            List<String> formNumberList = payments.stream().map(Payment::getNumber).collect(Collectors.toList());
+                            List<String> itemNameList = payments.stream().map(Payment::getName).collect(Collectors.toList());
+                            List<String> unitList = payments.stream().map(Payment::getUnit).collect(Collectors.toList());
+                            List<String> completedList = payments.stream().map(p -> StringUtils.handleNull(p.getCompleted())).collect(Collectors.toList());
+                            if (over > 0) {
+                                formNumberList.addAll(Collections.nCopies(over, StringPool.EMPTY));
+                                itemNameList.addAll(Collections.nCopies(over, StringPool.EMPTY));
+                                unitList.addAll(Collections.nCopies(over, StringPool.EMPTY));
+                                completedList.addAll(Collections.nCopies(over, StringPool.EMPTY));
+                            }
+                            iim.setFormNumberList(formNumberList);
+                            iim.setItemNameList(itemNameList);
+                            iim.setUnitList(unitList);
+                            iim.setCompletedList(completedList);
+                            iim.setFormNumber(iim.getFormNumberList().stream().filter(Func::isNotEmpty).distinct().collect(Collectors.joining("、")));
+                            iim.setItemName(iim.getItemNameList().stream().filter(Func::isNotEmpty).distinct().collect(Collectors.joining("、")));
+                            dataList.add(iim);
+                        }
+                    }
+                    /*自定义写入数据*/
+                    LinkedHashMap<String,FormData> targetMap= tec.formDataList.stream().filter(e->table2E16.getInitTableName().equals(e.getTableName())).collect(Collectors.toMap(FormData::getCode,t->t,(v1,v2)->v1,LinkedHashMap::new));
+                    capacity=1;
+                    pageSum.addAndGet(pageNumber(pageIndex, targetMap));
+                    this.put2FormData(fdm,fieldDataFcMap,dataList,targetMap);
+                    /*重置输出缓存*/
+                    dataList.clear();
+                    capacity=capacityBak;
+                }
+
+            });
+            FormulaUtils.beRelyFrom(tec.formDataMap, pageTotal.getCode()).forEach(tfd->{
+                /*根据依赖获取输出目标元素*/
+                elementWriter.write(tfd,pageSum);
+            });
+
+        }
+
+        /*页码计算*/
+        public int pageNumber( FormData pageIndex, LinkedHashMap<String,FormData> targetMap){
+            int total = totalPage();
+            if(pageIndex!=null){
+                FormulaUtils.beRelyFrom(targetMap, pageIndex.getCode()).findFirst().ifPresent(tfd->{
+                    /*根据依赖获取输出目标元素*/
+                    elementWriter.write(tfd,IntStream.rangeClosed(1, total).boxed().map(ElementData::new).collect(Collectors.toList()));
+                });
+            }
+            return total;
+        }
+        /*把结果数据回写到元素*/
+        public void  put2FormData( LinkedHashMap<String,FormData> fdm,Map<String,Function<List<InterimMeter>,List<Object>>> functionMap,List<InterimMeter> dataList,LinkedHashMap<String,FormData> targetMap){
+            fdm.values().stream()
+                    .filter(fd -> functionMap.containsKey(fd.getCode()))
+                    .forEach(fd -> {
+                        List<Object> raw = functionMap.get(fd.getCode()).apply(dataList);
+                        /*raw.stream().map(ElementData::new).forEach(fd.getValues()::add);*/
+                        FormulaUtils.beRelyFrom(targetMap, fd.getCode()).findFirst().ifPresent(tfd->{
+                            /*根据依赖获取输出目标元素*/
+                            elementWriter.write(tfd,raw);
+                        });
+                    });
+        }
+
+        /*删除没有计量的章节*/
+        public LinkedHashMap<String,NodeTable> removeNodeTable(LinkedHashMap<String,List<MeterApply>> meterApplyGroup){
+            List<NodeTable> table2E16= tec.getTableAll().stream().filter(e-> Pattern.matches("【2-16】工程计量表\\(\\d+章\\)",e.getNodeName().replaceAll("\\s+",""))).collect(Collectors.toList());
+            List<String>chapters =new ArrayList<>(meterApplyGroup.keySet());
+            List<Long> removeIds=table2E16.stream().filter(t->!BaseUtils.inChain(chapters,t.getNodeName())).map(NodeTable::getPKeyId).collect(Collectors.toList());
+            /*删除没有计量的章节*/
+            tec.getTableAll().removeIf(n->removeIds.contains(n.getPKeyId()));
+            table2E16.removeIf(n->removeIds.contains(n.getPKeyId()));
+           return table2E16.stream().collect(Collectors.toMap(chapterNumberTableFc,t->t,(v1,v2)->v1,LinkedHashMap::new));
+        }
+    }
+
     @Data
     @EqualsAndHashCode(callSuper = true)
     public class IMeter extends   BaseSpecial<InterimMeter> implements Special{
-        /*中间计量表*/
+        /*中间计量表、中间计量表*/
         @Override
         public boolean ready() {
-            return current.size()>0;
+            return !isZJ&&current.size()>0;
         }
 
         @Override
@@ -1780,6 +1905,7 @@ public class ExecutorMeter extends FormulaExecutor {
            /*每条记录一页*/
             capacity=1;
             tec.periodInfo.setMeterNumber(""+BaseUtils.sliceNumber(dataList.size(),capacity));
+            /*tec.getTableAll().removeIf(e->e.getNodeName().contains("500章")||e.getNodeName().contains("400章"));*/
            putOut(InterimMeter.class);
         }
     }