Преглед изворни кода

build 工商信息参保人数,税务信息纳税信用评级取值逻辑完善,指标项信息取分数前判断当前分类是否开启评分,附件中链接可点击跳转,指标项展示顺序,展示内容(改风险校验时actval赋值逻辑)改动,报告新增trycatch包裹,可以快速定位

mamingxu пре 1 дан
родитељ
комит
94277462e6

+ 29 - 13
easier-report-biz/src/main/java/com/yaoyicloud/factory/AbstractRender.java

@@ -24,6 +24,7 @@ import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import javax.imageio.ImageIO;
 
+import com.deepoove.poi.data.Texts;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.pdmodel.PDDocument;
@@ -34,12 +35,15 @@ import org.apache.poi.xwpf.usermodel.IBodyElement;
 import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
 import org.apache.poi.xwpf.usermodel.UnderlinePatterns;
 import org.apache.poi.xwpf.usermodel.XWPFDocument;
-import org.apache.poi.xwpf.usermodel.XWPFHyperlinkRun;
+
 import org.apache.poi.xwpf.usermodel.XWPFParagraph;
+import org.apache.poi.xwpf.usermodel.XWPFRelation;
 import org.apache.poi.xwpf.usermodel.XWPFRun;
 import org.apache.poi.xwpf.usermodel.XWPFTable;
 import org.apache.poi.xwpf.usermodel.XWPFTableCell;
 import org.apache.poi.xwpf.usermodel.XWPFTableRow;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHyperlink;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;
 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc;
 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
 import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc;
@@ -307,6 +311,7 @@ public abstract class AbstractRender {
             this.valColIndex = valRowIndex;
         }
 
+        @SuppressWarnings("checkstyle:NestedForDepth")
         @Override
         public void render(ElementTemplate eleTemplate, Object data, XWPFTemplate template) {
             RunTemplate runTemplate = (RunTemplate) eleTemplate;
@@ -351,6 +356,15 @@ public abstract class AbstractRender {
                         XWPFTableCell valueCell = row.getCell(currIndex);
                         String valStr = realData.getOrDefault(idx2Expression.get(i), "-").toString();
                         valueCell.setText(valStr);
+                        for (XWPFParagraph paragraph : valueCell.getParagraphs()) {
+
+                            for (XWPFRun runa : paragraph.getRuns()) {
+
+                                runa.setFontFamily("思源黑体 Medium");
+
+                                runa.setFontSize(9);
+                            }
+                        }
                     }
                     currIndex += indexDelta;
                 }
@@ -635,6 +649,7 @@ public abstract class AbstractRender {
                             paragraph.setAlignment(ParagraphAlignment.CENTER);
                             for (XWPFRun runa : paragraph.getRuns()) {
                                 runa.setFontFamily("思源黑体 Medium");
+                                runa.setFontSize(10);
                             }
                         }
                         try {
@@ -826,6 +841,7 @@ public abstract class AbstractRender {
                     // uri render when no filename
                     TextRenderPolicy.Helper.renderTextRun(((RunTemplate) eleTemplate).getRun(),
                         new HyperlinkTextRenderData(url, url));
+                    return;
                 } else if (filename.endsWith(".pdf")) {
                     // pdf render, replace data with bytestream
                     PDDocument document = null;
@@ -925,20 +941,20 @@ public abstract class AbstractRender {
         return new ParagraphRenderPolicy() {
             @Override
             public void render(ElementTemplate eleTemplate, Object data, XWPFTemplate template) {
-                // 获取当前运行的
-                XWPFParagraph paragraph = ((RunTemplate) eleTemplate).getRun().getParagraph();
-                int pos = paragraph.getRuns().indexOf(((RunTemplate) eleTemplate).getRun());
-                paragraph.removeRun(pos);
-                paragraph.removeRun(pos);
-                if (data instanceof String) {
-                    XWPFHyperlinkRun hyperlinkRun = paragraph.createHyperlinkRun(data.toString());
-                    hyperlinkRun.setText(data.toString());
-                    hyperlinkRun.setColor("0000FF");
-                    hyperlinkRun.setUnderline(UnderlinePatterns.SINGLE);
-                    hyperlinkRun.setFontFamily("思源黑体 Medium");
-                    hyperlinkRun.setFontSize(10.5);
 
+                if (data instanceof String) {
+                    // 获取超链接URL(从数据中)
+                    String url = data.toString();
+                    TextRenderPolicy.Helper.renderTextRun(((RunTemplate) eleTemplate).getRun(),
+                        new HyperlinkTextRenderData(url, url));
                 }
+                if (data instanceof Map) {
+                    Map<String, Object> mpData = (Map<String, Object>) data;
+                    String url = mpData.getOrDefault("fileUri", "").toString();
+                    TextRenderPolicy.Helper.renderTextRun(((RunTemplate) eleTemplate).getRun(),
+                        new HyperlinkTextRenderData(url, url));
+                }
+
             }
         };
     }

+ 0 - 2
easier-report-biz/src/main/java/com/yaoyicloud/render/platform/AttachmentSectionRender.java

@@ -101,9 +101,7 @@ public final class AttachmentSectionRender extends FXYAbstractRender {
         ArrayList<String> fillDeclLinks = (ArrayList) data.get("fillDeclLinks");
         if (fillDeclLinks != null) {
             data.put("fillDeclLinksExits", true);
-
         }
-
     }
 
 }

+ 5 - 2
easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/BusinessRender.java

@@ -43,7 +43,6 @@ public final class BusinessRender extends FXYAbstractRender {
         log.info("开始渲染工商信息报告模块,relationId: {}", relationId);
 
         // 配置POI-TL渲染器
-
         // 通过默认protobuf实例来填充不存在的key
         FxyProtos.BasicInfo.Builder basicInfoBuilder = FxyProtos.BasicInfo.newBuilder();
         JsonFormat.parser().merge(info, basicInfoBuilder);
@@ -52,7 +51,11 @@ public final class BusinessRender extends FXYAbstractRender {
         FxyProtos.BasicInfo mergedProto = defaultInstance.toBuilder()
             .mergeFrom(basicInfoBuilder.build())
             .build();
-
+        if (!mergedProto.hasBasicInfoSummary()) {
+            mergedProto = mergedProto.toBuilder()
+                    .setBasicInfoSummary(FxyProtos.CheckSummary.getDefaultInstance())
+                    .build();
+        }
         String completeJson = JsonFormat.printer()
             .includingDefaultValueFields()
             .print(mergedProto);

+ 19 - 1
easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/JudicialRender.java

@@ -10,10 +10,12 @@ import com.deepoove.poi.config.ConfigureBuilder;
 import com.deepoove.poi.policy.RenderPolicy;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.protobuf.util.JsonFormat;
 import com.yaoyicloud.config.CommonDataCache;
 import com.yaoyicloud.config.FilerepoProperties;
 
 import com.yaoyicloud.factory.FXYAbstractRender;
+import com.yaoyicloud.message.FxyProtos;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.MapUtils;
@@ -32,8 +34,24 @@ public final class JudicialRender extends FXYAbstractRender {
     @Override
     protected Map<String, Object> renderDocx(String info, String relationId, Integer counter) throws IOException {
         log.info("开始渲染司法风险模块,relationId: {}", relationId);
+        FxyProtos.RiskModule.Builder basicInfoBuilder = FxyProtos.RiskModule.newBuilder();
+        JsonFormat.parser().merge(info, basicInfoBuilder);
+
+        FxyProtos.RiskModule defaultInstance = FxyProtos.RiskModule.getDefaultInstance();
+        FxyProtos.RiskModule mergedProto = defaultInstance.toBuilder()
+                .mergeFrom(basicInfoBuilder.build())
+                .build();
+        if (!mergedProto.hasSummary()) {
+            mergedProto = mergedProto.toBuilder()
+                    .setSummary(FxyProtos.CheckSummary.getDefaultInstance())
+                    .build();
+        }
+        String completeJson = JsonFormat.printer()
+                .includingDefaultValueFields()
+                .print(mergedProto);
         ObjectMapper objectMapper = new ObjectMapper();
-        Map<String, Object> data = objectMapper.readValue(info, new TypeReference<Map<String, Object>>() {});
+
+        Map<String, Object> data = objectMapper.readValue(completeJson, new TypeReference<Map<String, Object>>() {});
         data.replaceAll((k, v) -> v.equals("") ? "-" : v);
         fillBasicDefaultValues(data);
         Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);

+ 9 - 2
easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/OperationalRender.java

@@ -45,7 +45,11 @@ public final class OperationalRender extends FXYAbstractRender {
         FxyProtos.FinancialInfo mergedProto = defaultInstance.toBuilder()
             .mergeFrom(financialInfoBuilder.build())
             .build();
-
+        if (!mergedProto.hasFinancialSummary()) {
+            mergedProto = mergedProto.toBuilder()
+                    .setFinancialSummary(FxyProtos.CheckSummary.getDefaultInstance())
+                    .build();
+        }
         String completeJson = JsonFormat.printer()
             .includingDefaultValueFields()
             .print(mergedProto);
@@ -124,7 +128,6 @@ public final class OperationalRender extends FXYAbstractRender {
         data.put("certReceived_source", "(自主申报)");
         data.put("bankLicense_source", "(自主申报)");
         data.put("annualInspectionResult_source", "(自主申报)");
-        data.put("financialDataSeqFlag_source", "(授权)");
         Object certReceived = data.get("certReceived");
         if (Objects.equals(certReceived, "-")) {
             data.put("certReceived", "否");
@@ -142,6 +145,10 @@ public final class OperationalRender extends FXYAbstractRender {
             data.put("annualInspectionResult", "否");
             data.put("annualInspectionResult_source", "");
         }
+        Object financialDataSeqFlagSource = data.get("financialDataSeqFlagSource");
+        if (Objects.equals(financialDataSeqFlagSource, "-")) {
+            data.put("financialDataSeqFlagSource", "");
+        }
 
         List<Map<String, Object>> financialDataSeq = (List<Map<String, Object>>) data.get("financialDataSeq");
         if (CollectionUtils.isNotEmpty(financialDataSeq)) {

+ 5 - 1
easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/OtherRender.java

@@ -50,7 +50,11 @@ public final class OtherRender extends FXYAbstractRender {
         FxyProtos.RiskModule mergedProto = defaultInstance.toBuilder()
             .mergeFrom(basicInfoBuilder.build())
             .build();
-
+        if (!mergedProto.hasSummary()) {
+            mergedProto = mergedProto.toBuilder()
+                    .setSummary(FxyProtos.CheckSummary.getDefaultInstance())
+                    .build();
+        }
         String completeJson = JsonFormat.printer()
             .includingDefaultValueFields()
             .print(mergedProto);

+ 5 - 1
easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/TaxRender.java

@@ -41,7 +41,11 @@ public final class TaxRender extends FXYAbstractRender {
         FxyProtos.RiskModule mergedProto = defaultInstance.toBuilder()
             .mergeFrom(riskModuleBuilder.build())
             .build();
-
+        if (!mergedProto.hasSummary()) {
+            mergedProto = mergedProto.toBuilder()
+                    .setSummary(FxyProtos.CheckSummary.getDefaultInstance())
+                    .build();
+        }
         String completeJson = JsonFormat.printer()
             .includingDefaultValueFields()
             .print(mergedProto);

+ 6 - 3
easier-report-biz/src/main/java/com/yaoyicloud/tools/DocxUtil.java

@@ -54,11 +54,12 @@ public final class DocxUtil {
 
     /**
      * 将Word文件转换为PDF文件
+     * 
      * @param reportTempWordFile 待转换的Word文件路径(.docx格式)
      * @return 转换后最终的PDF文件路径
      * @throws Exception 转换过程中发生的异常(如文件操作、格式转换错误等)
      */
-    public  String wordToPdf(String reportTempWordFile) throws Exception {
+    public String wordToPdf(String reportTempWordFile) throws Exception {
         String imagePath = this.imagePath();
         String reportImagePath = this.getReportImagePath();
         // 第一步:将Word文件转换为HTML字符串,同时提取图片到reportImagePath
@@ -94,7 +95,9 @@ public final class DocxUtil {
             e.printStackTrace();
         }
         // 第四步:使用第二次格式化后的html2生成最终PDF(flag为false可能表示最终转换,
-        return OfficeUtil.convertHtmlToPdf(html2, reportBastPath, getFontPaths(), imagePath, false);
+        String pdfPath = OfficeUtil.convertHtmlToPdf(html2, reportBastPath, getFontPaths(), imagePath, false);
+        log.info("文档转换成功,文档路径为:" + pdfPath);
+        return pdfPath;
     }
 
     public static void mergeDocx(XWPFDocument target, List<XWPFDocument> sources, String outputPath, Long relationId)
@@ -104,7 +107,7 @@ public final class DocxUtil {
     }
 
     public static void mergeDocx(XWPFDocument target, List<XWPFDocument> sources, String outputPath,
-                                 boolean clearTargetBody) throws InvalidFormatException, FileNotFoundException, IOException {
+        boolean clearTargetBody) throws InvalidFormatException, FileNotFoundException, IOException {
         if (clearTargetBody) {
             target.getDocument().unsetBody();
             target.getDocument().addNewBody();

+ 33 - 41
easier-report-biz/src/main/java/com/yaoyicloud/tools/OfficeUtil.java

@@ -44,7 +44,6 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 public class OfficeUtil {
-    private static final org.slf4j.Logger OFFICE_UTIL_LOGGER = org.slf4j.LoggerFactory.getLogger(OfficeUtil.class);
     private static Map<String, Integer> pageNumberMap = new LinkedHashMap<>();
 
     /**
@@ -320,6 +319,38 @@ public class OfficeUtil {
         for (Element element : select8) {
             element.attr("style",
                 element.attr("style") + "word-break: break-all; overflow-wrap: anywhere; max-width: 100%;");
+            for (Element pElement : select8) {
+                // 检查当前p标签是否已包含a标签
+                Elements existingA = pElement.select("a");
+                if (existingA.isEmpty()) {
+                    // 步骤1:获取包含URL的span(取第一个有内容的span)
+                    Element urlSpan = pElement.selectFirst("span[style*=color:#0000ff]"); // 筛选蓝色文本的span(通常是链接)
+                    if (urlSpan != null) {
+                        // 提取span中的URL文本(作为href和链接显示文本)
+                        String url = urlSpan.text().trim();
+                        if (!url.isEmpty()) {
+                            // 步骤2:创建a标签并设置href
+                            Element aTag = doc.createElement("a");
+                            aTag.attr("href", url); // 用span中的文本作为链接URL
+
+                            // 步骤3:复制原span的样式和内容到新span,并修改class为X1 X9
+                            Element newSpan = doc.createElement("span");
+                            newSpan.attr("class", "X1 X9"); // 更新class
+                            newSpan.attr("style", urlSpan.attr("style")); // 沿用原样式
+                            newSpan.text(url); // 显示文本为URL
+
+                            // 步骤4:将新span放入a标签中
+                            aTag.appendChild(newSpan);
+                            aTag.append(" "); // 保留原示例中的空格
+
+                            // 步骤5:删除原span,将a标签插入到p标签开头
+                            urlSpan.remove();
+                            pElement.prependChild(aTag);
+                        }
+                    }
+
+                }
+            }
         }
         // 1.3合并的单元格 不分页
         Elements select11 = doc.select("td.X10.X11");
@@ -335,45 +366,6 @@ public class OfficeUtil {
         return doc.html();
     }
 
-    /**
-     * 合并表格中相同内容的单元格
-     *
-     * @param doc HTML文档对象
-     */
-    public static void mergeSameContentCells(Document doc) {
-        Elements tables = doc.select("table");
-        for (Element table : tables) {
-            Elements rows = table.select("tr");
-            for (int colIndex = 0; colIndex < rows.first().select("td").size(); colIndex++) {
-                int rowspan = 1;
-                String currentCellText = "";
-                for (int rowIndex = 0; rowIndex < rows.size(); rowIndex++) {
-                    Element currentCell = rows.get(rowIndex).select("td").get(colIndex);
-                    String cellText = currentCell.text();
-                    if (rowIndex == 0) {
-                        currentCellText = cellText;
-                    } else {
-                        if (cellText.equals(currentCellText)) {
-                            rowspan++;
-                            currentCell.remove();
-                        } else {
-                            if (rowspan > 1) {
-                                Element prevCell = rows.get(rowIndex - rowspan).select("td").get(colIndex);
-                                prevCell.attr("rowspan", String.valueOf(rowspan));
-                            }
-                            rowspan = 1;
-                            currentCellText = cellText;
-                        }
-                    }
-                }
-                if (rowspan > 1) {
-                    Element lastCell = rows.get(rows.size() - rowspan).select("td").get(colIndex);
-                    lastCell.attr("rowspan", String.valueOf(rowspan));
-                }
-            }
-        }
-    }
-
     /**
      * 移除 white-space:pre-wrap 并替换为 normal
      */
@@ -569,7 +561,7 @@ public class OfficeUtil {
                 String pageText = new PdfTextExtractor(reader).getTextFromPage(pageNum);
                 String[] lines = pageText.split("\\r?\\n");
                 for (String line : lines) {
-                    if (line.equals("1. 报告概述")) {
+                    if (line.contains("1. 报告概述")) {
                         startPage = pageNum;
                         pageNumberMap.put("startPage", startPage);
                     }

+ 3 - 1
easier-report-biz/src/main/proto/fxy.proto

@@ -14,7 +14,7 @@ message CheckItemDetail {
   optional string desc = 2;      //
   optional string fact = 3;     //
   optional string result = 4;      //
-  optional int64 score = 5;      //
+ // optional int64 score = 5;      //
   optional string reviewResult = 6; // 复核结果
  // optional int32 reviewScore = 7; // 复核评分
   optional string category = 8;
@@ -22,6 +22,7 @@ message CheckItemDetail {
   optional string formula = 10; // 计算公式(如"公益支出/上年基金余额")
   optional string avg = 11; // 服务商数据(平均值/收入)
   optional string reviewScore = 12; // 复核评分
+  optional string score = 13;
 
 }
 
@@ -209,6 +210,7 @@ message FinancialInfo {
   optional string bankLicense = 19;             //银行开户许可证
   repeated CheckItemDetail businessRiskChecks = 20; //经营风险提示
   optional string financialInfo = 21; // 财务信息 是否授权
+  optional string financialDataSeqFlagSource = 22; // 财务信息  重要财务数据来源
 
 }
 

+ 6 - 6
easier-report-biz/src/main/resources/application.yml

@@ -13,8 +13,8 @@ spring:
   redis:
     host: 127.0.0.1
     port: 6379
-    password: 8F4tJuQEgAE7MZyX
-   # password: 123456
+ #   password: 8F4tJuQEgAE7MZyX
+    password: 123456
     database: 10
   servlet:
     multipart:
@@ -102,7 +102,7 @@ logging:
     com.yaoyicloud.easier.filerepo.mapper: debug
 
 # 租户表维护
-#easier:
-#  office:
-#    pdf:
-#      rootPath: C:/Users/yyy/dev/yyc3/easier-be
+easier:
+  office:
+    pdf:
+      rootPath: C:/Users/yyy/dev/yyc3/easier-be