yangyj преди 1 година
родител
ревизия
ae45510f14

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

@@ -2,6 +2,8 @@ package org.springblade.manager.vo;
 
 import lombok.Data;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
@@ -30,7 +32,9 @@ public class ReportResult {
     /**Excel路基*/
     private String excelPath;
     /**每一页的数据,格式{y_x:val,y1_x1:val1...}{...}...*/
-    private List<Map<String,Object>> data;
+    private List<Map<String,Object>> data=new ArrayList<>();
+    /**每一页的固定内容*/
+    private Map<String,Object> commonData =new HashMap<>();
 
     public String getPdfPath(){
         return this.pdfPath;
@@ -46,5 +50,13 @@ public class ReportResult {
         this.pdfPath=sysLocalFileUrl + "/pdf//" +getId() + ".pdf";
         this.excelPath=sysLocalFileUrl + "/pdf//" + getId() + ".xlsx";
     }
+    /*添加公共部分*/
+    public void putCommon(){
+        if(this.commonData.size()>0) {
+            for (Map<String, Object> m : this.data) {
+                m.putAll(this.commonData);
+            }
+        }
+    }
 
 }

+ 39 - 16
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/TableElementConverter.java

@@ -477,26 +477,49 @@ public class TableElementConverter implements ITableElementConverter {
                    reportResults.add(rt);
                    List<FormData> fds =group.get(report.getInitTableName());
                    if(fds.size()>0){
-                       int pageMax = fds.stream()
-                               .filter(e -> !e.empty())
-                               .mapToInt(e -> BaseUtils.sliceNumber(e.getValues().size() ,e.getCoordsList().size()))
-                               .max()
-                               .orElse(1);
-                       /*初始化每页的数据集合*/
-                       List<Map<String,Object>>  dataList = IntStream.range(0, pageMax)
-                               .mapToObj(i -> new HashMap<String, Object>())
-                               .collect(Collectors.toList());
-                       rt.setData(dataList);
-                       for(FormData fd:fds){
-                           if(!fd.empty()) {
-                               List<ElementData> eds = fd.getValues();
-                               for(ElementData ed:eds){
-                                   if(!ed.isEmpty()) {
-                                       dataList.get(ed.getIndex()).put(ed.getCoords(), ed.getValue());
+                       /*数据分两种,一种是每页都包含的公共部分,另一种是动态内容每页独立*/
+                       Map<Boolean,List<FormData>> groupList= fds.stream().collect(Collectors.partitioningBy(e->e.getCoordsList().size()>1));
+                       List<FormData> common = groupList.get(false);
+                       List<FormData> page =groupList.get(true);
+                       if(common.size()>0){
+                           Map<String,Object> commonMap=rt.getCommonData();
+                           for(FormData fd:common){
+                               if(!fd.empty()) {
+                                   List<ElementData> eds = fd.getValues();
+                                   for(ElementData ed:eds){
+                                       if(!ed.isEmpty()) {
+                                           commonMap.put(ed.getCoords(), ed.getValue());
+                                       }
                                    }
                                }
                            }
                        }
+                       if(page.size()>0) {
+                           int pageMax = page.stream()
+                                   .filter(e -> !e.empty())
+                                   .mapToInt(e -> BaseUtils.sliceNumber(e.getValues().size(), e.getCoordsList().size()))
+                                   .max()
+                                   .orElse(1);
+                           /*初始化每页的数据集合*/
+                           List<Map<String, Object>> dataList = IntStream.range(0, pageMax)
+                                   .mapToObj(i -> new HashMap<String, Object>())
+                                   .collect(Collectors.toList());
+                           rt.setData(dataList);
+                           for (FormData fd : page) {
+                               if (!fd.empty()) {
+                                   List<ElementData> eds = fd.getValues();
+                                   for (ElementData ed : eds) {
+                                       if (!ed.isEmpty()) {
+                                           dataList.get(ed.getIndex()).put(ed.getCoords(), ed.getValue());
+                                       }
+                                   }
+                               }
+                           }
+                       }else{
+                           /*确保至少有一张空白页驱动页面生成*/
+                           rt.getData().add(new HashMap<>());
+                       }
+
                    }
                }
         }

+ 69 - 64
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java

@@ -44,12 +44,10 @@ import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.feign.ArchiveFileTaskClient;
 import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.ContractRelationJlyz;
-import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.feign.FormulaClient;
 import org.springblade.manager.vo.ReportResult;
 import org.springblade.meter.dto.*;
 import org.springblade.meter.entity.*;
-import org.springblade.meter.mapper.MaterialStartStatementMapper;
 import org.springblade.meter.mapper.MiddleMeterApplyMapper;
 import org.springblade.meter.service.IMaterialStartStatementService;
 import org.springblade.meter.service.impl.*;
@@ -74,6 +72,7 @@ import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -2674,13 +2673,13 @@ public class TaskController extends BladeController {
     public R<String> calculate(String reportId, Integer type){
         if(BaseUtils.isNumber(reportId)&& BaseUtils.isNumber(type)) {
             Report report = generateReport(Long.parseLong(reportId), type);
-            return R.data(generateReportsPdf(report));
+            return generateReportsPdf(report);
         }
         return R.fail("计算失败");
     }
 
     /*中期支付证书报表、开工、材料手册报表*/
-    public String generateReportsPdf(Report report){
+    public R<String> generateReportsPdf(Report report){
         /*报表记录新增或者重算的时候会调用当前方法,生成PDF*/
         /*保存两类PDF,一每种表独立一份用于浏览,二合成表用于电签*/
         /*数据完全独立互不影响,可以并发生成,预估PDF的总大小来决定是否全部在内存中生成PDF*/
@@ -2719,83 +2718,89 @@ public class TaskController extends BladeController {
                     }
                 });
                 /*每种表生成一份pdf*/
+                StringBuffer sb = new StringBuffer();
                 reportResults.parallelStream().forEach(rs->{
                     try {
                         byte[] excelByte = CommonUtil.InputStreamToBytes(CommonUtil.getOSSInputStream(rs.getExcelUrl()));
-                        if(Func.isNotEmpty(rs.getData())){
-                            PdfReader reader = null;
-                            Document doc = new Document();
-                            PdfCopy  pdfCopy = new PdfCopy(doc, new FileOutputStream(rs.getPdfPath()));
-                            int pageCount;
-                            doc.open();
-                            String tile=rs.getName().contains("封面")?projectName:projectName+StringPool.DASH+rs.getName();
-                            for(Map<String,Object> dataMap:rs.getData()){
-                                try {
-                                    Workbook workbook  = WorkbookFactory.create(new ByteArrayInputStream(excelByte));
-                                    //获取工作表
-                                    Sheet sheet = workbook.getSheetAt(0);
-                                    sheet.setForceFormulaRecalculation(true);
-                                    if(Func.isNotEmpty(dataMap)) {
-                                        for (String keys : dataMap.keySet()) {
-                                            int y1 = Func.toInt(keys.split("_")[0]);
-                                            int x1 = Func.toInt(keys.split("_")[1]);
-                                            Row row = sheet.getRow(y1 - 1);
-                                            if (row != null) {
-                                                Cell cell = row.getCell(x1 - 1);
-                                                if (cell != null) {
-                                                    cell.setCellValue(dataMap.getOrDefault(keys, StringPool.EMPTY).toString());
-                                                } else {
-                                                    System.out.println(keys + "不存在");
-                                                }
+                        PdfReader reader = null;
+                        Document doc = new Document();
+                        PdfCopy  pdfCopy = new PdfCopy(doc, new FileOutputStream(rs.getPdfPath()));
+                        int pageCount;
+                        doc.open();
+                        String tile=rs.getName().contains("封面")?projectName:projectName+StringPool.DASH+rs.getName();
+                        /*把公共部分内容释放到每一页*/
+                        rs.putCommon();
+                        for(Map<String,Object> dataMap:rs.getData()){
+                            try {
+                                Workbook workbook  = WorkbookFactory.create(new ByteArrayInputStream(excelByte));
+                                //获取工作表
+                                Sheet sheet = workbook.getSheetAt(0);
+                                sheet.setForceFormulaRecalculation(true);
+                                if(Func.isNotEmpty(dataMap)) {
+                                    for (String keys : dataMap.keySet()) {
+                                        int y1 = Func.toInt(keys.split("_")[0]);
+                                        int x1 = Func.toInt(keys.split("_")[1]);
+                                        Row row = sheet.getRow(y1 - 1);
+                                        if (row != null) {
+                                            Cell cell = row.getCell(x1 - 1);
+                                            if (cell != null) {
+                                                cell.setCellValue(dataMap.getOrDefault(keys, StringPool.EMPTY).toString());
+                                            } else {
+                                                System.out.println(keys + "不存在");
                                             }
                                         }
                                     }
-                                    /*设置表头*/
-                                    setTitle(sheet,tile);
-                                    //去掉表格虚线
-                                    sheet.setPrintGridlines(false);
-                                    //设置 整个工作表为一页
-                                    sheet.setFitToPage(true);
-                                    sheet.getPrintSetup().setPaperSize(PrintSetup.A4_PAPERSIZE);
-                                    ByteArrayOutputStream out = new ByteArrayOutputStream();
-                                    workbook.write(out);
-                                    workbook.write(new FileOutputStream(rs.getExcelPath()));
-                                    com.aspose.cells.Workbook wb = new com.aspose.cells.Workbook( new ByteArrayInputStream(out.toByteArray()));
-                                    out.reset();
-                                    wb.save(out, SaveFormat.PDF);
-                                    reader = new PdfReader(new ByteArrayInputStream(out.toByteArray()));
-                                    pageCount = reader.getNumberOfPages();
-                                    for (int i = 1; i <= pageCount; ++i) {
-                                        pdfCopy.addPage(pdfCopy.getImportedPage(reader, i));
-                                    }
-                                    out.close();
-                                    workbook.close();
-                                }catch (Exception e){
-                                    e.printStackTrace();
                                 }
-                            }
-                            pdfCopy.flush();
-                            pdfCopy.close();
-                            if(reader!=null)reader.close();
-                            doc.close();
-                            rs.setPdfOssPath(CompletableFuture.supplyAsync(()->{
-                                BladeFile bladeFile = newIOSSClient.uploadFile(rs.getName()+SnowFlakeUtil.getId() + ".pdf", rs.getPdfPath());
-                                String url=bladeFile.getLink();
-                                if(Func.isEmpty(url)){
-                                    url="无效链接";
+                                /*设置表头*/
+                                setTitle(sheet,tile);
+                                //去掉表格虚线
+                                sheet.setPrintGridlines(false);
+                                //设置 整个工作表为一页
+                                sheet.setFitToPage(true);
+                                sheet.getPrintSetup().setPaperSize(PrintSetup.A4_PAPERSIZE);
+                                ByteArrayOutputStream out = new ByteArrayOutputStream();
+                                workbook.write(out);
+                                workbook.write(new FileOutputStream(rs.getExcelPath()));
+                                com.aspose.cells.Workbook wb = new com.aspose.cells.Workbook( new ByteArrayInputStream(out.toByteArray()));
+                                out.reset();
+                                wb.save(out, SaveFormat.PDF);
+                                reader = new PdfReader(new ByteArrayInputStream(out.toByteArray()));
+                                pageCount = reader.getNumberOfPages();
+                                for (int i = 1; i <= pageCount; ++i) {
+                                    pdfCopy.addPage(pdfCopy.getImportedPage(reader, i));
                                 }
-                                return url;
-                            }));
+                                out.close();
+                                workbook.close();
+                            }catch (Exception e){
+                                e.printStackTrace();
+                            }
                         }
+                        pdfCopy.flush();
+                        pdfCopy.close();
+                        if(reader!=null)reader.close();
+                        doc.close();
+                        rs.setPdfOssPath(CompletableFuture.supplyAsync(()->{
+                            BladeFile bladeFile = newIOSSClient.uploadFile(rs.getName()+SnowFlakeUtil.getId() + ".pdf", rs.getPdfPath());
+                            String url=bladeFile.getLink();
+                            if(Func.isEmpty(url)){
+                                url="无效链接";
+                            }
+                            return url;
+                        }));
                     }catch (Exception e){
+                        sb.append("【").append(rs.getName()).append("】");
                         e.printStackTrace();
                     }
                 });
+                if(sb.length()>0){
+                    sb.append("生成异常");
+                    return R.fail(sb.toString());
+                }
                 /*合并所有表*/
                 fileUrl=report.getReportPdf(file_path,reportResults);
             }
         }
-       return fileUrl;
+       return R.data(fileUrl);
     }