|
@@ -11,18 +11,18 @@ import org.springblade.common.utils.BaseUtils;
|
|
import org.springblade.common.utils.SnowFlakeUtil;
|
|
import org.springblade.common.utils.SnowFlakeUtil;
|
|
import org.springblade.core.oss.model.BladeFile;
|
|
import org.springblade.core.oss.model.BladeFile;
|
|
import org.springblade.core.tool.utils.Func;
|
|
import org.springblade.core.tool.utils.Func;
|
|
|
|
+import org.springblade.core.tool.utils.RegexUtil;
|
|
import org.springblade.core.tool.utils.StringPool;
|
|
import org.springblade.core.tool.utils.StringPool;
|
|
import org.springblade.manager.dto.ElementData;
|
|
import org.springblade.manager.dto.ElementData;
|
|
import org.springblade.manager.dto.FormData;
|
|
import org.springblade.manager.dto.FormData;
|
|
import org.springblade.manager.dto.TreeNode;
|
|
import org.springblade.manager.dto.TreeNode;
|
|
import org.springblade.manager.formula.ElementWriter;
|
|
import org.springblade.manager.formula.ElementWriter;
|
|
|
|
+import org.springblade.manager.formula.NodeTable;
|
|
import org.springblade.manager.vo.*;
|
|
import org.springblade.manager.vo.*;
|
|
import org.springblade.meter.entity.InterimPayCertificateItem;
|
|
import org.springblade.meter.entity.InterimPayCertificateItem;
|
|
import org.springframework.beans.BeanUtils;
|
|
import org.springframework.beans.BeanUtils;
|
|
|
|
|
|
|
|
|
|
-import java.io.ByteArrayOutputStream;
|
|
|
|
-import java.io.FileOutputStream;
|
|
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
import java.math.RoundingMode;
|
|
import java.math.RoundingMode;
|
|
import java.time.LocalDate;
|
|
import java.time.LocalDate;
|
|
@@ -30,6 +30,7 @@ import java.util.*;
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
import java.util.concurrent.atomic.AtomicReference;
|
|
import java.util.concurrent.atomic.AtomicReference;
|
|
import java.util.function.*;
|
|
import java.util.function.*;
|
|
|
|
+import java.util.regex.Pattern;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.IntStream;
|
|
import java.util.stream.IntStream;
|
|
|
|
|
|
@@ -60,6 +61,9 @@ public class ExecutorMeter extends FormulaExecutor {
|
|
/*本期材料支付信息*/
|
|
/*本期材料支付信息*/
|
|
List<Material>materials;
|
|
List<Material>materials;
|
|
|
|
|
|
|
|
+ /**是否是浙江模版*/
|
|
|
|
+ private boolean isZJ=false;
|
|
|
|
+
|
|
private List<InterimPaymentCertificate> interimPaymentCertificates =new ArrayList<>();
|
|
private List<InterimPaymentCertificate> interimPaymentCertificates =new ArrayList<>();
|
|
/*分项中期汇总*/
|
|
/*分项中期汇总*/
|
|
private List<SubprojectInterimPaymentSummary> subprojectInterimPaymentSummary =new ArrayList<>();
|
|
private List<SubprojectInterimPaymentSummary> subprojectInterimPaymentSummary =new ArrayList<>();
|
|
@@ -184,6 +188,7 @@ public class ExecutorMeter extends FormulaExecutor {
|
|
@Override
|
|
@Override
|
|
public void handle() {
|
|
public void handle() {
|
|
this.elementWriter=new MeterElementWriter();
|
|
this.elementWriter=new MeterElementWriter();
|
|
|
|
+ isZJ=MeterInfo.MB_ZJ.equals(tec.getMeterInfo().getTemplate());
|
|
if(MeterType.MATERIAL.equals(tec.getMeterType())){
|
|
if(MeterType.MATERIAL.equals(tec.getMeterType())){
|
|
/*材料预付款支付申请表处理*/
|
|
/*材料预付款支付申请表处理*/
|
|
this.specialList.add(new MaterialCalc());
|
|
this.specialList.add(new MaterialCalc());
|
|
@@ -199,8 +204,9 @@ public class ExecutorMeter extends FormulaExecutor {
|
|
/*分项工程中期计量支付表*/
|
|
/*分项工程中期计量支付表*/
|
|
this.specialList.add(new SubIMeterPay());
|
|
this.specialList.add(new SubIMeterPay());
|
|
this.specialList.add(new IMeterPaySummary());
|
|
this.specialList.add(new IMeterPaySummary());
|
|
- /*中间计量表*/
|
|
|
|
|
|
+ /*中间计量表,中间计量表*/
|
|
this.specialList.add(new IMeter());
|
|
this.specialList.add(new IMeter());
|
|
|
|
+ this.specialList.add(new IMeterChapter());
|
|
}else if(MeterType.INTERIM_JL.equals(tec.getMeterType())){
|
|
}else if(MeterType.INTERIM_JL.equals(tec.getMeterType())){
|
|
/*监理*/
|
|
/*监理*/
|
|
this.specialList.add(new SupervisionCertificateSp());
|
|
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&¤t.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
|
|
@Data
|
|
@EqualsAndHashCode(callSuper = true)
|
|
@EqualsAndHashCode(callSuper = true)
|
|
public class IMeter extends BaseSpecial<InterimMeter> implements Special{
|
|
public class IMeter extends BaseSpecial<InterimMeter> implements Special{
|
|
- /*中间计量表*/
|
|
|
|
|
|
+ /*中间计量表、中间计量表*/
|
|
@Override
|
|
@Override
|
|
public boolean ready() {
|
|
public boolean ready() {
|
|
- return current.size()>0;
|
|
|
|
|
|
+ return !isZJ&¤t.size()>0;
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -1780,6 +1905,7 @@ public class ExecutorMeter extends FormulaExecutor {
|
|
/*每条记录一页*/
|
|
/*每条记录一页*/
|
|
capacity=1;
|
|
capacity=1;
|
|
tec.periodInfo.setMeterNumber(""+BaseUtils.sliceNumber(dataList.size(),capacity));
|
|
tec.periodInfo.setMeterNumber(""+BaseUtils.sliceNumber(dataList.size(),capacity));
|
|
|
|
+ /*tec.getTableAll().removeIf(e->e.getNodeName().contains("500章")||e.getNodeName().contains("400章"));*/
|
|
putOut(InterimMeter.class);
|
|
putOut(InterimMeter.class);
|
|
}
|
|
}
|
|
}
|
|
}
|