Browse Source

build fxy新版报告1.0

mamingxu 1 day ago
parent
commit
7fd38b2eb2
26 changed files with 752 additions and 635 deletions
  1. 6 7
      easier-report-api/src/main/java/com/yaoyicloud/constant/enums/ModuleType.java
  2. 1 1
      easier-report-biz/src/main/java/com/yaoyicloud/config/CommonDataCache.java
  3. 9 15
      easier-report-biz/src/main/java/com/yaoyicloud/config/FilerepoProperties.java
  4. 132 29
      easier-report-biz/src/main/java/com/yaoyicloud/factory/AbstractRender.java
  5. 1 2
      easier-report-biz/src/main/java/com/yaoyicloud/factory/CSOAbstractRender.java
  6. 6 3
      easier-report-biz/src/main/java/com/yaoyicloud/factory/FXYAbstractRender.java
  7. 1 1
      easier-report-biz/src/main/java/com/yaoyicloud/render/ServiceProviderInfoRender.java
  8. 1 1
      easier-report-biz/src/main/java/com/yaoyicloud/render/cso/EntAppendixRender.java
  9. 14 14
      easier-report-biz/src/main/java/com/yaoyicloud/render/cso/EntHeaderSectionRender.java
  10. 2 2
      easier-report-biz/src/main/java/com/yaoyicloud/render/cso/EntProductIntroductionRender.java
  11. 2 2
      easier-report-biz/src/main/java/com/yaoyicloud/render/cso/EntPromotionDetailsRender.java
  12. 6 3
      easier-report-biz/src/main/java/com/yaoyicloud/render/cso/EntPromotionSummaryRender.java
  13. 1 3
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/AttachmentSectionRender.java
  14. 0 94
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/AntiBriberyNewRender.java
  15. 66 15
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/BusinessRender.java
  16. 121 0
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/JudicialRender.java
  17. 46 14
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/OperationalRender.java
  18. 137 0
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/OtherRender.java
  19. 0 104
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/PublicRecordNewRender.java
  20. 0 114
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/TaxNewRender.java
  21. 129 0
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/TaxRender.java
  22. 16 16
      easier-report-biz/src/main/java/com/yaoyicloud/service/impl/FxyReportUpdateServiceImpl.java
  23. 3 1
      easier-report-biz/src/main/java/com/yaoyicloud/tools/DocxUtil.java
  24. 41 180
      easier-report-biz/src/main/proto/fxy.proto
  25. 9 12
      easier-report-biz/src/main/resources/application.yml
  26. 2 2
      easier-report-biz/src/test/java/com/yaoyicloud/render/test/TestAntiBriberyRender.java

+ 6 - 7
easier-report-api/src/main/java/com/yaoyicloud/constant/enums/ModuleType.java

@@ -35,7 +35,7 @@ public enum ModuleType {
     PUBLIC_RECORD("PUBLIC_RECORD", "公共记录"),
     PROJECT("PROJECT", "项目信息"),
     INTERESTCONFLICTS("INTERESTCONFLICTS", "利益冲突"),
-    ANTIBRIBERY("ANTIBRIBERY", "反贿赂反腐败诚信保证"),
+    ANTIBRIBERY("ANTIBRIBERY", "诚信保证"),
     COMMON("COMMON", "公共模块封面"),
     PLATFORM_COMPANY_FINANCIALINFO("PLATFORM_COMPANY_FINANCIALINFO", "平台公司财务"),
     FOUNDATION_FINANCIALINFO("FOUNDATION_FINANCIALINFO", "基金会财务"),
@@ -44,12 +44,11 @@ public enum ModuleType {
     FOUNDATION_ATTACHMENTSECTION("FOUNDATION_ATTACHMENTSECTION", "基金会附件"),
 
 
-
-    PLATFORM_COMPANY_BASICINFO_NEW("PLATFORM_COMPANY_BASICINFO_NEW", "工商信息"),
-    PLATFORM_COMPANY_ANTIBRIBERY_NEW("PLATFORM_COMPANY_ANTIBRIBERY_NEW", "其他风险"),
-    PLATFORM_COMPANY_FINANCIALINFO_NEW("PLATFORM_COMPANY_FINANCIALINFO_NEW", "经营风险"),
-    PLATFORM_COMPANY_PUBLIC_RECORD_NEW("PLATFORM_COMPANY_PUBLIC_RECORD_NEW", "司法风险"),
-    PLATFORM_COMPANY_TAX_NEW("PLATFORM_COMPANY_TAX_NEW", "税务风险");
+    BUSINESS("BUSINESS", "工商信息"),
+    OTHER("OTHER", "其他风险"),
+    OPERATIONAL("OPERATIONAL", "经营风险"),
+    JUDICIAL("JUDICIAL", "司法风险"),
+    TAX("TAX", "税务风险");
     /**
      * 类型
      */

+ 1 - 1
easier-report-biz/src/main/java/com/yaoyicloud/config/CommonDataCache.java

@@ -46,7 +46,7 @@ public class CommonDataCache {
     /**
      * 添加或更新单个键值对
      */
-    public void addData(String relationId, String key, Object value) {
+    public void insertData(String relationId, String key, Object value) {
         String redisKey = getRedisKey(relationId);
         try {
             // 序列化value并写入Hash

+ 9 - 15
easier-report-biz/src/main/java/com/yaoyicloud/config/FilerepoProperties.java

@@ -18,38 +18,32 @@ import org.springframework.stereotype.Component;
 @ConfigurationProperties(prefix = "easier.office.pdf")
 public class FilerepoProperties {
 
-    private String rootPath = "/serving/server/yyc3";
+    private String rootPath = "/serving/server/easier-render";
     /**
      * 基金报告模板
      */
     private String reportTemplateSuffix = "_template.xml";
 
+    /**
+     * 文档导出根路径
+     * @return
+     */
     public String getBasePath() {
         return rootPath + "/temp";
     }
 
-    public String getTmplPath() {
-        return rootPath + "/file/tmpl";
-    }
-
+    /**
+     * 字体根目录
+     * @return
+     */
     public String getFontPath() {
         return rootPath + "/file/font";
     }
 
-    public String getEntRiskInfoCheckReportTemplatePath() {
-        return getTmplPath() + "/ent_risk_info_ckt_report_v1.0.pdf";
-    }
 
     /**
      * plus版本审核报告模板路径
      */
-    public String getPlusReportTemplatePath() {
-        return getTmplPath() + "/plus_version_check_report_template.pdf";
-    }
-
-    public String getReportTemplatePath() {
-        return getTmplPath();
-    }
 
     public String getReportImagePath() {
         return getRootPath() + "/file/image/word/media/";

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

@@ -5,6 +5,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
+import java.math.BigInteger;
 import java.net.URL;
 import java.text.DecimalFormat;
 import java.util.ArrayList;
@@ -20,14 +21,15 @@ import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
-
 import javax.imageio.ImageIO;
-
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.rendering.PDFRenderer;
+
+import org.apache.poi.xwpf.usermodel.IBody;
 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;
@@ -100,8 +102,6 @@ public abstract class AbstractRender {
         this.cwd = cwd;
     }
 
-
-
     /**
      * DOCX文档渲染核心方法 处理流程: 1. 创建输出目录 2. 编译模板并渲染数据 3. 保存渲染结果
      *
@@ -184,7 +184,8 @@ public abstract class AbstractRender {
      * @return 当前章节数据map
      * @throws IOException
      */
-    protected abstract Map<String, Object> renderDocx(String info, String relationId, Integer counter)throws IOException;
+    protected abstract Map<String, Object> renderDocx(String info, String relationId, Integer counter)
+        throws IOException;
 
     /**
      * 获取基础路径
@@ -200,6 +201,8 @@ public abstract class AbstractRender {
      */
     protected abstract String getReportImagePath();
 
+    protected abstract ConfigureBuilder builder(String relationId);
+
     Map<String, Object> sensitiveData(Map<String, Object> data, Boolean sensitiveFlag) {
         if (!sensitiveFlag) {
             return data;
@@ -581,21 +584,72 @@ public abstract class AbstractRender {
     }
 
     /**
-     * 空数据处理策略(数据为空时删除整个表格)
+     * 没配置项,删除表格 配置了有数据正常显示,没数据显示暂无风险项
      */
-    public RenderPolicy deleteLoopRowTableRenderPolicy() {
+    public RenderPolicy addDefaultRowForEmptyTable(Boolean itemFlag) {
         return new LoopRowTableRenderPolicy() {
+            @SuppressWarnings("checkstyle:ReturnCount")
             @Override
             public void render(ElementTemplate eleTemplate, Object data, XWPFTemplate template) {
-                super.render(eleTemplate, data, template);
                 ArrayList<Map<String, String>> data1 = (ArrayList<Map<String, String>>) data;
-                if (CollectionUtils.isEmpty(data1)) {
+                if (itemFlag) {
+                    if (CollectionUtils.isNotEmpty(data1)) {
+                        super.render(eleTemplate, data1, template);
+                    } else {
+                        RunTemplate runTemplate = (RunTemplate) eleTemplate;
+                        XWPFRun run = runTemplate.getRun();
+                        XWPFTableCell tagCell = (XWPFTableCell) ((XWPFParagraph) run.getParent()).getBody();
+                        XWPFTable table = tagCell.getTableRow().getTable();
+                        List<XWPFTableRow> rows = table.getRows();
+                        if (rows == null || rows.size() <= 1) {
+                            return;
+                        }
+                        int lastRowIndex = rows.size() - 1; // 最后一行的索引
+                        for (int i = rows.size() - 2; i >= 0; i--) { // 从倒数第二行开始删除
+                            table.removeRow(i);
+                        }
+                        // 获取最后一行(现在索引为0)
+                        XWPFTableRow lastRow = table.getRow(0);
+                        List<XWPFTableCell> cells = lastRow.getTableCells();
+                        XWPFTableCell mergedCell = cells.get(0);
+                        if (cells.size() > 1) {
+                            // 设置跨列合并(gridSpan = 总列数)
+                            mergedCell.getCTTc().addNewTcPr().addNewGridSpan().setVal(BigInteger.valueOf(cells.size()));
+                            for (int i = cells.size() - 1; i > 0; i--) {
+                                lastRow.removeCell(i);
+                            }
+                        }
+                        // 设置合并后的内容和居中
+                        mergedCell.setText("暂无风险项");
+                        mergedCell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
+                        for (XWPFParagraph paragraph : mergedCell.getParagraphs()) {
+                            paragraph.setAlignment(ParagraphAlignment.CENTER);
+                        }
+                        try {
+
+                            Util.mergeFirstNColSimple(table, 1, 0);
+                        } catch (Exception e) {
+                            throw new RenderException(
+                                "LoopRowCutAndMergeFirstColTable for " + eleTemplate + " error: " + e.getMessage(), e);
+                        }
+                    }
+                } else {
                     RunTemplate runTemplate = (RunTemplate) eleTemplate;
                     XWPFRun run = runTemplate.getRun();
                     XWPFTableCell tagCell = (XWPFTableCell) ((XWPFParagraph) run.getParent()).getBody();
                     XWPFTable table = tagCell.getTableRow().getTable();
                     XWPFDocument doc = template.getXWPFDocument();
 
+                    List<XWPFTableRow> rows = table.getRows();
+                    List<XWPFTableCell> tableCells = rows.get(0).getTableCells();
+                    XWPFTableCell xwpfTableCell = tableCells.get(0);
+                    String text = xwpfTableCell.getText();
+                    String itemName = extractCollectionName(text);
+                    int paragraphsToDelete = 1;
+                    if (itemName.equals("sameaddress") || itemName.equals("samecontactNumberDatas")
+                        || itemName.equals("sameExecutivesNames")) {
+                        paragraphsToDelete = 2;
+                    }
                     int tablePos = -1;
                     List<IBodyElement> bodyElements = doc.getBodyElements();
                     for (int i = 0; i < bodyElements.size(); i++) {
@@ -605,8 +659,8 @@ public abstract class AbstractRender {
                         }
                     }
                     if (tablePos >= 0) {
+
                         // 4.1 先删除前一个段落(如果存在且是段落)
-                        int paragraphsToDelete = 2; // 要删除的段落数量
                         for (int i = 0; i < paragraphsToDelete && tablePos - 1 >= 0; i++) {
                             IBodyElement prevElement = doc.getBodyElements().get(tablePos - 1);
                             if (prevElement instanceof XWPFParagraph) {
@@ -618,27 +672,10 @@ public abstract class AbstractRender {
                         // 4.2 强制删除表格(通过操作底层 XML)
                         doc.removeBodyElement(tablePos);
                         doc.getTables();
-
                     }
                 }
             }
-            // // 辅助方法:在XML中找到表格的实际位置
-            // private int findTablePositionInXML(CTBody body, XWPFTable table) {
-            // List<CTP> paragraphs = body.getPList();
-            // List<CTTbl> tables = body.getTblList();
-            //
-            // for (int i = 0; i < tables.size(); i++) {
-            // if (tables.get(i) == table.getCTTbl()) {
-            // return i;
-            // }
-            // }
-            // return -1;
-            // }
-
-            // int xmlTblPos = findTablePositionInXML(body, table);
-            // if (xmlTblPos >= 0) {
-            // body.removeTbl(xmlTblPos);
-            // }
+
         };
     }
 
@@ -647,7 +684,7 @@ public abstract class AbstractRender {
      *
      * 功能特点: - 自动处理空值为"-" - 支持从模板提取变量名
      */
-    protected RenderPolicy indicatorsRenderPolicyToProtobuf() {
+    protected RenderPolicy indicatorsRenderPolicyToProtobuf(Boolean delFlag) {
         return new LoopRowTableRenderPolicy() {
             @Override
             public void render(ElementTemplate eleTemplate, Object data, XWPFTemplate template) {
@@ -667,6 +704,20 @@ public abstract class AbstractRender {
                 }
                 // 调用父类渲染处理后的数据
                 super.render(eleTemplate, processedData, template);
+                if (!delFlag) {
+
+                    RunTemplate runTemplate = (RunTemplate) eleTemplate;
+                    XWPFRun run = runTemplate.getRun();
+                    XWPFTableCell tagCell = (XWPFTableCell) ((XWPFParagraph) run.getParent()).getBody();
+                    XWPFTable table = tagCell.getTableRow().getTable();
+                    List<XWPFTableRow> rows = table.getRows();
+                    if (rows != null && rows.size() > 0) {
+                        // 获取最后一行的索引(行索引从0开始)
+                        int lastRowIndex = rows.size() - 1;
+                        // 删除最后一行
+                        table.removeRow(lastRowIndex);
+                    }
+                }
             }
 
         };
@@ -1099,6 +1150,38 @@ public abstract class AbstractRender {
         };
     }
 
+    protected RenderPolicy getPictureListDelParagraphPolicy() {
+        return new RenderPolicy() {
+            @SuppressWarnings("checkstyle:ReturnCount")
+            @Override
+            public void render(ElementTemplate eleTemplate, Object data, XWPFTemplate template) {
+                RunTemplate runTemplate = (RunTemplate) eleTemplate;
+                XWPFRun run = runTemplate.getRun();
+                XWPFParagraph currentParagraph = (XWPFParagraph) run.getParent();
+
+                // 检查当前内容是否为"是"
+                if ("是".equals(data)) {
+                    // 获取当前段落所在的文档对象
+                    IBody body = currentParagraph.getBody();
+
+                    // 处理文档主体中的段落
+                    if (body instanceof XWPFDocument) {
+                        XWPFDocument document = (XWPFDocument) body;
+                        List<XWPFParagraph> paragraphs = document.getParagraphs();
+                        int currentIndex = paragraphs.indexOf(currentParagraph);
+
+                        // 确保存在上一个段落
+                        if (currentIndex > 0) {
+                            // 删除上一个段落
+                            document.removeBodyElement(currentIndex - 1);
+                            document.removeBodyElement(currentIndex - 1);
+                        }
+                    }
+                }
+            }
+        };
+    }
+
     /**
      * 动态表格渲染策略工厂方法(支持数据脱敏) 功能特点: 1. 支持按用户ID分组渲染表格数据 2. 自动计算分类汇总和小计 3. 支持敏感数据脱敏处理 4. 自动识别百分比、平均值等特殊列格式
      *
@@ -1374,4 +1457,24 @@ public abstract class AbstractRender {
         }
         data.put(key, listMap);
     }
+
+    /**
+     * 从包含 {{#xxx}} 标签的字符串中提取 xxx(集合名称)
+     * 
+     * @param input 包含模板标签的字符串
+     * @return 提取到的集合名称,若格式不正确返回null
+     */
+    public static String extractCollectionName(String input) {
+
+        if (input == null || input.isEmpty()) {
+            return null;
+        }
+        int startTag = input.indexOf("{{#");
+        int endTag = input.indexOf("}}", startTag);
+
+        if (startTag == -1 || endTag == -1 || startTag >= endTag) {
+            return null;
+        }
+        return input.substring(startTag + 3, endTag).trim();
+    }
 }

+ 1 - 2
easier-report-biz/src/main/java/com/yaoyicloud/factory/CSOAbstractRender.java

@@ -54,7 +54,7 @@ public abstract class CSOAbstractRender extends AbstractRender {
         Map<String, Object> originalMap = this.renderDocx(info, relationId, counter);
         boolean sensitiveFlag = (Boolean) originalMap.get("sensitiveFlag"); // 处理数据脱敏
         Map<String, Object> sensitiveMap = this.sensitiveData(originalMap, sensitiveFlag);
-        ConfigureBuilder builder = this.builder(sensitiveMap);
+        ConfigureBuilder builder = this.builder(relationId);
         return this.csoCompile(sensitiveMap, inputStream, builder, relationId, moduleType);
     }
 
@@ -183,5 +183,4 @@ public abstract class CSOAbstractRender extends AbstractRender {
         }
     }
 
-    protected abstract ConfigureBuilder builder(Map<String, Object> data);
 }

+ 6 - 3
easier-report-biz/src/main/java/com/yaoyicloud/factory/FXYAbstractRender.java

@@ -22,8 +22,11 @@ public abstract class FXYAbstractRender extends AbstractRender  {
         throws IOException {
         // 获取数据
         Map<String, Object> originalMap = this.renderDocx(info, relationId, counter);
-        ConfigureBuilder builder = this.builder();
-        return this.documentCompile(originalMap, inputStream, builder, relationId, moduleType);
+        ConfigureBuilder builder = this.builder(relationId);
+        String docxResultPath = this.documentCompile(originalMap, inputStream, builder, relationId, moduleType);
+
+        log.info("文档导出成功,文档路径为: {}", docxResultPath);
+        return docxResultPath;
     }
 
     @SuppressWarnings("checkstyle:ParameterNumber")
@@ -66,7 +69,7 @@ public abstract class FXYAbstractRender extends AbstractRender  {
     }
 
 
-    protected abstract ConfigureBuilder builder();
+
 
 
 }

+ 1 - 1
easier-report-biz/src/main/java/com/yaoyicloud/render/ServiceProviderInfoRender.java

@@ -74,7 +74,7 @@ public final class ServiceProviderInfoRender extends FXYAbstractRender {
 
 
     @Override
-    protected ConfigureBuilder builder() {
+    protected ConfigureBuilder builder(String relationId) {
         // 配置POI-TL渲染器
         ConfigureBuilder builder = Configure.builder();
         RenderPolicy indicatorsRenderPolicy = this.getScoreRenderPolicy();

+ 1 - 1
easier-report-biz/src/main/java/com/yaoyicloud/render/cso/EntAppendixRender.java

@@ -46,7 +46,7 @@ public final class EntAppendixRender extends CSOAbstractRender {
     }
 
     @Override
-    protected ConfigureBuilder builder(Map<String, Object> data) {
+    protected ConfigureBuilder builder(String relationId) {
         // 配置POI-TL渲染器
         ConfigureBuilder builder = Configure.builder();
         return builder;

+ 14 - 14
easier-report-biz/src/main/java/com/yaoyicloud/render/cso/EntHeaderSectionRender.java

@@ -49,32 +49,32 @@ public final class EntHeaderSectionRender extends CSOAbstractRender {
 
         ObjectMapper objectMapper = new ObjectMapper();
         Map<String, Object> data = objectMapper.readValue(completeJson, new TypeReference<Map<String, Object>>() {});
-        commonDataCache.addData(relationId, "reportCreateTime",
+        commonDataCache.insertData(relationId, "reportCreateTime",
             DateUtil.format(LocalDateTime.now(), "yyyy年MM月dd日 HH:mm:ss"));
         Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
         if (MapUtils.isNotEmpty(commonDataCacheData)) {
             data.putAll(commonDataCacheData);
         }
-        commonDataCache.addData(relationId, "totalPackageScore", data.get("totalPackageScore"));
-        commonDataCache.addData(relationId, "totalApprovedScore", data.get("totalApprovedScore"));
-        commonDataCache.addData(relationId, "taskUserNames", data.get("taskUserNames"));
-        commonDataCache.addData(relationId, "submitedTaskScore", data.get("submitedTaskScore"));
-        commonDataCache.addData(relationId, "createTime", data.get("createTime"));
-        commonDataCache.addData(relationId, "serviceEndDate", data.get("serviceEndDate"));
-        commonDataCache.addData(relationId, "sensitiveFlag", data.get("sensitiveFlag"));
-        commonDataCache.addData(relationId, "scorePackageName", data.get("scorePackageName"));
-        commonDataCache.addData(relationId, "entrustingCompany", data.get("entrustingCompany"));
-        commonDataCache.addData(relationId, "taskFinishTime", data.get("taskFinishTime"));
-        commonDataCache.addData(relationId, "serviceCompany", data.get("serviceCompany"));
+        commonDataCache.insertData(relationId, "totalPackageScore", data.get("totalPackageScore"));
+        commonDataCache.insertData(relationId, "totalApprovedScore", data.get("totalApprovedScore"));
+        commonDataCache.insertData(relationId, "taskUserNames", data.get("taskUserNames"));
+        commonDataCache.insertData(relationId, "submitedTaskScore", data.get("submitedTaskScore"));
+        commonDataCache.insertData(relationId, "createTime", data.get("createTime"));
+        commonDataCache.insertData(relationId, "serviceEndDate", data.get("serviceEndDate"));
+        commonDataCache.insertData(relationId, "sensitiveFlag", data.get("sensitiveFlag"));
+        commonDataCache.insertData(relationId, "scorePackageName", data.get("scorePackageName"));
+        commonDataCache.insertData(relationId, "entrustingCompany", data.get("entrustingCompany"));
+        commonDataCache.insertData(relationId, "taskFinishTime", data.get("taskFinishTime"));
+        commonDataCache.insertData(relationId, "serviceCompany", data.get("serviceCompany"));
         data.put("levelInteger", counter);
         fillDefaultValues(data);
         return data;
     }
 
     @Override
-    protected ConfigureBuilder builder(Map<String, Object> data) {
+    protected ConfigureBuilder builder(String relationId) {
         ConfigureBuilder builder = Configure.builder();
-        builder.bind("drugDetails", this.indicatorsRenderPolicyToProtobuf());
+        builder.bind("drugDetails", this.indicatorsRenderPolicyToProtobuf(true));
         return builder;
     }
 

+ 2 - 2
easier-report-biz/src/main/java/com/yaoyicloud/render/cso/EntProductIntroductionRender.java

@@ -57,9 +57,9 @@ public final class EntProductIntroductionRender extends CSOAbstractRender {
     }
 
     @Override
-    protected ConfigureBuilder builder(Map<String, Object> data) {
+    protected ConfigureBuilder builder(String relationId) {
         ConfigureBuilder builder = Configure.builder();
-        builder.bind("drugDetails", this.indicatorsRenderPolicyToProtobuf());
+        builder.bind("drugDetails", this.indicatorsRenderPolicyToProtobuf(true));
         return builder;
     }
 

+ 2 - 2
easier-report-biz/src/main/java/com/yaoyicloud/render/cso/EntPromotionDetailsRender.java

@@ -61,9 +61,9 @@ public final class EntPromotionDetailsRender extends CSOAbstractRender {
     }
 
     @Override
-    protected ConfigureBuilder builder(Map<String, Object> data) {
+    protected ConfigureBuilder builder(String relationId) {
         ConfigureBuilder builder = Configure.builder();
-        RenderPolicy policy = this.indicatorsRenderPolicyToProtobuf();
+        RenderPolicy policy = this.indicatorsRenderPolicyToProtobuf(true);
         builder.bind("userTasks", policy);
         builder.bind("tasks", policy);
         builder.bind("meetingList", policy);

+ 6 - 3
easier-report-biz/src/main/java/com/yaoyicloud/render/cso/EntPromotionSummaryRender.java

@@ -84,22 +84,25 @@ public final class EntPromotionSummaryRender extends CSOAbstractRender {
         if (MapUtils.isNotEmpty(commonDataCacheData)) {
             data.putAll(commonDataCacheData);
         }
+        commonDataCacheData.put("sensitiveFlag", data.get("sensitiveFlag"));
         data.put("levelInteger", counter);
         fillDefaultValues(data);
         return data;
     }
 
     @Override
-    protected ConfigureBuilder builder(Map<String, Object> data) {
+    protected ConfigureBuilder builder(String relationId) {
         ConfigureBuilder builder = Configure.builder();
         DynamicTableRenderPolicy twoLevelTableDynamicPolicy = getTwoLevelTableDynamicPolicy();
         DynamicTableRenderPolicy lastRowDaynamicPolicy = getTableLastRowDynamicPolicy();
-        DynamicTableRenderPolicy tableDynamicPolicy = super.getDynamicTableRenderPolicy(data);
+        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
+
+        DynamicTableRenderPolicy tableDynamicPolicy = super.getDynamicTableRenderPolicy(commonDataCacheData);
         builder.bind("task_analysis_5_1", twoLevelTableDynamicPolicy);
         builder.bind("task_promotion_count_5_1_1", twoLevelTableDynamicPolicy);
         builder.bind("task_promotion_count_5_1_1_last", lastRowDaynamicPolicy);
         builder.bind("task_promotioner_5_4", tableDynamicPolicy);
-        builder.bind("task_promotioner_quality_5_4_1", this.indicatorsRenderPolicyToProtobuf());
+        builder.bind("task_promotioner_quality_5_4_1", this.indicatorsRenderPolicyToProtobuf(true));
         builder.bind("task_promotioner_quality_5_4_1_last", lastRowDaynamicPolicy);
         return builder;
     }

+ 1 - 3
easier-report-biz/src/main/java/com/yaoyicloud/render/platform/AttachmentSectionRender.java

@@ -37,8 +37,6 @@ public final class AttachmentSectionRender extends FXYAbstractRender {
     protected Map<String, Object> renderDocx(String info, String relationId, Integer counter) throws IOException {
         log.info("开始渲染附件模块,relationId: {}", relationId);
 
-
-
         FxyProtos.AttachmentSection.Builder attachmentSection = FxyProtos.AttachmentSection.newBuilder();
         JsonFormat.parser().merge(info, attachmentSection);
 
@@ -76,7 +74,7 @@ public final class AttachmentSectionRender extends FXYAbstractRender {
     }
 
     @Override
-    protected ConfigureBuilder builder() {
+    protected ConfigureBuilder builder(String relationId) {
         // 配置POI-TL渲染器
         ConfigureBuilder builder = Configure.builder();
         builder.addPlugin('^',  this.pictureRenderPolicy());

+ 0 - 94
easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/AntiBriberyNewRender.java

@@ -1,94 +0,0 @@
-package com.yaoyicloud.render.platform.update;
-
-import java.io.IOException;
-
-import java.util.Map;
-import com.deepoove.poi.config.Configure;
-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.MapUtils;
-
-@Slf4j
-public final class AntiBriberyNewRender extends FXYAbstractRender {
-    private final FilerepoProperties filerepoProperties;
-    private final CommonDataCache commonDataCache;
-
-    // 注入父类所需的 cwd 参数
-    public AntiBriberyNewRender(String cwd, FilerepoProperties filerepoProperties, CommonDataCache commonDataCache) {
-        super(cwd);
-        this.filerepoProperties = filerepoProperties;
-        this.commonDataCache = commonDataCache;
-    }
-
-    @Override
-    protected String getBasicPath() throws IOException {
-        return filerepoProperties.getBasePath();
-    }
-
-    @Override
-    protected String getReportImagePath() {
-        return filerepoProperties.getReportImagePath();
-    }
-
-    @Override
-    protected Map<String, Object> renderDocx(String info, String relationId, Integer counter) throws IOException {
-        log.info("开始渲染其他风险报告模块,relationId: {}", relationId);
-
-        // 通过默认protobuf实例来填充不存在的key
-        FxyProtos.AntiBribery.Builder basicInfoBuilder = FxyProtos.AntiBribery.newBuilder();
-        JsonFormat.parser().merge(info, basicInfoBuilder);
-
-        FxyProtos.AntiBribery defaultInstance = FxyProtos.AntiBribery.getDefaultInstance();
-        FxyProtos.AntiBribery mergedProto = defaultInstance.toBuilder()
-                .mergeFrom(basicInfoBuilder.build())
-                .build();
-
-        String completeJson = JsonFormat.printer()
-                .includingDefaultValueFields()
-                .print(mergedProto);
-        ObjectMapper objectMapper = new ObjectMapper();
-        Map<String, Object> data = objectMapper.readValue(completeJson, new TypeReference<Map<String, Object>>() {});
-        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
-        if (MapUtils.isNotEmpty(commonDataCacheData)) {
-            data.putAll(commonDataCacheData);
-        }
-        fillDefaultValues(data);
-        data.put("levelInteger", counter);
-        // Map<String, Object> antiBriberySummary = (Map<String, Object>) data.get("antiBriberySummary");
-        // String riskSummary = (String) antiBriberySummary.get("riskSummary");
-        // antiBriberySummary.put("riskSummary", riskSummary == null || riskSummary.isEmpty() ? "-" : riskSummary);
-        return data;
-    }
-
-    @Override
-    protected ConfigureBuilder builder() {
-        // 配置POI-TL渲染器
-        ConfigureBuilder builder = Configure.builder();
-        RenderPolicy indicatorsRenderPolicy = this.indicatorsRenderPolicyToProtobuf();
-        builder.bind("questionnaireItems", indicatorsRenderPolicy);
-        builder.bind("otherRiskChecks", indicatorsRenderPolicy);
-        builder.useSpringEL();
-        return builder;
-    }
-
-    /**
-     * 填充默认值,确保所有必要字段都存在
-     */
-    private void fillDefaultValues(Map<String, Object> data) {
-        Map<String, Object> antiBriberySummary = (Map<String, Object>) data.get("antiBriberySummary");
-        antiBriberySummary.replaceAll((k, v) -> v.equals("") ? "-" : v);
-
-    }
-
-
-
-}

+ 66 - 15
easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/FXYInfoNewRender.java → easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/BusinessRender.java

@@ -16,8 +16,8 @@ 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;
 
 /**
@@ -25,11 +25,11 @@ import org.apache.commons.collections4.MapUtils;
  *
  */
 @Slf4j
-public final class FXYInfoNewRender extends FXYAbstractRender {
+public final class BusinessRender extends FXYAbstractRender {
     private final FilerepoProperties filerepoProperties;
     private final CommonDataCache commonDataCache;
 
-    public FXYInfoNewRender(String cwd, FilerepoProperties filerepoProperties, CommonDataCache commonDataCache) {
+    public BusinessRender(String cwd, FilerepoProperties filerepoProperties, CommonDataCache commonDataCache) {
         super(cwd);
         this.filerepoProperties = filerepoProperties;
         this.commonDataCache = commonDataCache;
@@ -47,12 +47,12 @@ public final class FXYInfoNewRender extends FXYAbstractRender {
 
         FxyProtos.BasicInfo defaultInstance = FxyProtos.BasicInfo.getDefaultInstance();
         FxyProtos.BasicInfo mergedProto = defaultInstance.toBuilder()
-                .mergeFrom(basicInfoBuilder.build())
-                .build();
+            .mergeFrom(basicInfoBuilder.build())
+            .build();
 
         String completeJson = JsonFormat.printer()
-                .includingDefaultValueFields()
-                .print(mergedProto);
+            .includingDefaultValueFields()
+            .print(mergedProto);
 
         ObjectMapper objectMapper = new ObjectMapper();
         Map<String, Object> data = objectMapper.readValue(completeJson, new TypeReference<Map<String, Object>>() {});
@@ -78,20 +78,23 @@ public final class FXYInfoNewRender extends FXYAbstractRender {
         }
         data.put("levelInteger", counter);
         fillBasicDefaultValues(data);
-//        Map<String, Object> basicInfoSummary = (Map<String, Object>) data.get("basicInfoSummary");
-//        basicInfoSummary.put("riskSummary",
-//            basicInfoSummary.get("riskSummary").equals("") ? "-" : basicInfoSummary.get("riskSummary"));
+        fillCommonDataCacheData(data, relationId);
         return data;
     }
 
     @Override
-    protected ConfigureBuilder builder() {
+    protected ConfigureBuilder builder(String relationId) {
         ConfigureBuilder builder = Configure.builder();
         RenderPolicy indicatorsRenderPolicy = this.indicatorsRenderPolicy();
-        RenderPolicy deleteLoopRowTableRenderPolicy = this.deleteLoopRowTableRenderPolicy();
+        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
+
         builder.bind("basicInfoChecks", indicatorsRenderPolicy);
-        builder.bind("sameaddress", deleteLoopRowTableRenderPolicy);
-        builder.bind("samecontactNumberDatas", deleteLoopRowTableRenderPolicy);
+        builder.bind("sameaddress",
+            this.addDefaultRowForEmptyTable((Boolean) commonDataCacheData.get("same_addr_error_flag")));
+        builder.bind("samecontactNumberDatas",
+            this.addDefaultRowForEmptyTable((Boolean) commonDataCacheData.get("same_tel_error_flag")));
+        builder.bind("sameExecutivesNames",
+            this.addDefaultRowForEmptyTable((Boolean) commonDataCacheData.get("same_executives_name_flag")));
         builder.addPlugin('^', this.pictureRenderPolicy());
         builder.useSpringEL();
         return builder;
@@ -107,7 +110,6 @@ public final class FXYInfoNewRender extends FXYAbstractRender {
         return filerepoProperties.getReportImagePath();
     }
 
-
     /**
      * 填充默认值,确保所有必要字段都存在
      */
@@ -116,6 +118,55 @@ public final class FXYInfoNewRender extends FXYAbstractRender {
         basicInfoSummary.replaceAll((k, v) -> v.equals("") ? "-" : v);
         Map<String, Object> platformExt = (Map<String, Object>) data.get("platformExt");
         platformExt.replaceAll((k, v) -> v.equals("") ? "-" : v);
+        Object updateSource = platformExt.get("updateSource");
+        if (updateSource.equals("-")) {
+            platformExt.put("updateSource", "");
+        }
+
+        processJsonData(data, "sameaddress");
+        processJsonData(data, "samecontactNumberDatas");
+        processJsonData(data, "sameExecutivesNames");
+    }
+
+    private void fillCommonDataCacheData(Map<String, Object> data, String relationId) {
+        Integer index = 1;
+        Map<String, Object> secondsMap = new HashMap<>();
+        commonDataCache.insertData(relationId, "same_tel_error_flag", false);
+        commonDataCache.insertData(relationId, "same_addr_error_flag", false);
+        commonDataCache.insertData(relationId, "same_executives_name_flag", false);
+        List<Map<String, Object>> basicInfoChecks = (List<Map<String, Object>>) data.get("basicInfoChecks");
+        if (CollectionUtils.isEmpty(basicInfoChecks)) {
+            index++;
+        } else {
+            for (Map<String, Object> basicInfoCheck : basicInfoChecks) {
+                String category = (String) basicInfoCheck.get("category");
+                if (category == null) {
+                    continue;
+                }
+                switch (category) {
+                    case "same_addr_error":
+                        index++;
+                        secondsMap.put("sameaddress", index.toString());
+                        commonDataCache.insertData(relationId, "same_addr_error_flag", true);
+                        break;
+                    case "same_tel_error":
+                        index++;
+                        secondsMap.put("samecontactNumberDatas", index.toString());
+                        commonDataCache.insertData(relationId, "same_tel_error_flag", true);
+                        break;
+                    case "same_executives_name":
+                        index++;
+                        secondsMap.put("sameExecutivesNames", index.toString());
+                        commonDataCache.insertData(relationId, "same_executives_name_flag", true);
+                        break;
+                    default:
+                        break;
+                }
+            }
+            index++;
+        }
+        secondsMap.put("moduleTail", index.toString());
+        data.put("secondsMap", secondsMap);
     }
 
 }

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

@@ -0,0 +1,121 @@
+package com.yaoyicloud.render.platform.update;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.deepoove.poi.config.Configure;
+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.yaoyicloud.config.CommonDataCache;
+import com.yaoyicloud.config.FilerepoProperties;
+
+import com.yaoyicloud.factory.FXYAbstractRender;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
+
+@Slf4j
+public final class JudicialRender extends FXYAbstractRender {
+    private final FilerepoProperties filerepoProperties;
+    private final CommonDataCache commonDataCache;
+
+    public JudicialRender(String cwd, FilerepoProperties filerepoProperties, CommonDataCache commonDataCache) {
+        super(cwd);
+        this.filerepoProperties = filerepoProperties;
+        this.commonDataCache = commonDataCache;
+    }
+
+    @Override
+    protected Map<String, Object> renderDocx(String info, String relationId, Integer counter) throws IOException {
+        log.info("开始渲染司法风险模块,relationId: {}", relationId);
+        ObjectMapper objectMapper = new ObjectMapper();
+        Map<String, Object> data = objectMapper.readValue(info, new TypeReference<Map<String, Object>>() {});
+        data.replaceAll((k, v) -> v.equals("") ? "-" : v);
+        fillBasicDefaultValues(data);
+        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
+        if (MapUtils.isNotEmpty(commonDataCacheData)) {
+            data.putAll(commonDataCacheData);
+        }
+        data.put("levelInteger", counter);
+        fillCommonDataCacheData(data, relationId);
+        return data;
+    }
+
+    private void fillCommonDataCacheData(Map<String, Object> data, String relationId) {
+        Integer index = 1;
+        Map<String, Object> judicialMap = new HashMap<>();
+
+        commonDataCache.insertData(relationId, "dishonest_person_error_flag", false);
+        commonDataCache.insertData(relationId, "serious_illegal_error_flag", false);
+        List<Map<String, Object>> judicialRiskChecks = (List<Map<String, Object>>) data.get("judicialRiskChecks");
+        if (CollectionUtils.isEmpty(judicialRiskChecks)) {
+            index++;
+        } else {
+            for (Map<String, Object> basicInfoCheck : judicialRiskChecks) {
+                String category = (String) basicInfoCheck.get("category");
+                if (category == null) {
+                    continue;
+                }
+                switch (category) {
+                    case "dishonest_person_error":
+                        index++;
+                        judicialMap.put("dishonestPersons", index.toString());
+                        commonDataCache.insertData(relationId, "dishonest_person_error_flag", true);
+                        break;
+                    case "serious_illegal_error":
+                        index++;
+                        judicialMap.put("severeViolations", index.toString());
+                        commonDataCache.insertData(relationId, "serious_illegal_error_flag", true);
+                        break;
+                    default:
+                        break;
+                }
+            }
+            index++;
+        }
+
+        judicialMap.put("moduleTail", index.toString());
+        data.put("judicialMap", judicialMap);
+    }
+
+    @Override
+    protected ConfigureBuilder builder(String relationId) {
+        // 配置POI-TL渲染器
+        ConfigureBuilder builder = Configure.builder();
+        RenderPolicy indicatorsRenderPolicy = this.indicatorsRenderPolicyToProtobuf(true);
+        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
+        builder.bind("dishonestPersons",
+            this.addDefaultRowForEmptyTable((Boolean) commonDataCacheData.get("dishonest_person_error_flag")));
+        builder.bind("judicialRiskChecks", indicatorsRenderPolicy);
+        builder.bind("severeViolations",
+            this.addDefaultRowForEmptyTable((Boolean) commonDataCacheData.get("serious_illegal_error_flag")));
+        builder.useSpringEL();
+        return builder;
+    }
+
+    @Override
+    protected String getBasicPath() throws IOException {
+        return filerepoProperties.getBasePath();
+    }
+
+    @Override
+    protected String getReportImagePath() {
+        return filerepoProperties.getReportImagePath();
+    }
+
+    /**
+     * 填充默认值,确保所有必要字段都存在
+     */
+    private void fillBasicDefaultValues(Map<String, Object> data) {
+        Map<String, Object> summary = (Map<String, Object>) data.get("summary");
+        summary.putIfAbsent("riskSummary", "-");
+        summary.putIfAbsent("suggestion", "-");
+
+        processJsonData(data, "dishonestPersons");
+        processJsonData(data, "severeViolations");
+    }
+}

+ 46 - 14
easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/FinancialInfoNewRender.java → easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/OperationalRender.java

@@ -1,6 +1,8 @@
 package com.yaoyicloud.render.platform.update;
 
 import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 
@@ -14,20 +16,20 @@ 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;
 
 /**
- * FinancialInfo渲染器
+ * 经营风险渲染器
  *
  */
 @Slf4j
-public final class FinancialInfoNewRender extends FXYAbstractRender {
+public final class OperationalRender extends FXYAbstractRender {
     private final FilerepoProperties filerepoProperties;
     private final CommonDataCache commonDataCache;
 
-    public FinancialInfoNewRender(String cwd, FilerepoProperties filerepoProperties, CommonDataCache commonDataCache) {
+    public OperationalRender(String cwd, FilerepoProperties filerepoProperties, CommonDataCache commonDataCache) {
         super(cwd);
         this.filerepoProperties = filerepoProperties;
         this.commonDataCache = commonDataCache;
@@ -35,21 +37,18 @@ public final class FinancialInfoNewRender extends FXYAbstractRender {
 
     @Override
     protected Map<String, Object> renderDocx(String info, String relationId, Integer counter) throws IOException {
-        log.info("开始渲染财务模块,relationId: {}", relationId);
-
-
-
+        log.info("开始渲染经营风险模块,relationId: {}", relationId);
         FxyProtos.FinancialInfo.Builder financialInfoBuilder = FxyProtos.FinancialInfo.newBuilder();
         JsonFormat.parser().merge(info, financialInfoBuilder);
 
         FxyProtos.FinancialInfo defaultInstance = FxyProtos.FinancialInfo.getDefaultInstance();
         FxyProtos.FinancialInfo mergedProto = defaultInstance.toBuilder()
-                .mergeFrom(financialInfoBuilder.build())
-                .build();
+            .mergeFrom(financialInfoBuilder.build())
+            .build();
 
         String completeJson = JsonFormat.printer()
-                .includingDefaultValueFields()
-                .print(mergedProto);
+            .includingDefaultValueFields()
+            .print(mergedProto);
         ObjectMapper objectMapper = new ObjectMapper();
         Map<String, Object> data = objectMapper.readValue(completeJson, new TypeReference<Map<String, Object>>() {});
         data.replaceAll((k, v) -> v.equals("") ? "-" : v);
@@ -62,18 +61,20 @@ public final class FinancialInfoNewRender extends FXYAbstractRender {
         data.put("levelInteger", counter);
         // Map<String, Object> financialSummary = (Map<String, Object>) data.get("financialSummary");
         // data.put("fiancescore", financialSummary.get("score"));
+        fillCommonDataCacheData(data, relationId);
         return data;
     }
 
     @Override
-    protected ConfigureBuilder builder() {
+    protected ConfigureBuilder builder(String relationId) {
         ConfigureBuilder builder = Configure.builder();
         builder.useSpringEL();
 
         builder.bind("indicators", new LoopRowIncludeStatisticsTableRenderPolicy("values"));
         builder.bind("financialDataSeq", new LoopColumnStaticTableRenderPolicy("[", "]", false, true, 2));
         builder.bind("financialCheckDetails", new LoopRowCutAndMergeFirstColTableRenderPolicy());
-        builder.bind("businessRiskChecks", this.indicatorsRenderPolicyToProtobuf());
+        builder.bind("businessRiskChecks", this
+            .indicatorsRenderPolicyToProtobuf((Boolean) commonDataCache.getDataItem(relationId, "financialInfo_flag")));
         return builder;
     }
 
@@ -87,7 +88,33 @@ public final class FinancialInfoNewRender extends FXYAbstractRender {
         return filerepoProperties.getReportImagePath();
     }
 
+    private void fillCommonDataCacheData(Map<String, Object> data, String relationId) {
+        boolean financialFlag = false;
+        Object financialInfo = data.get("financialInfo");
 
+        if (financialInfo != null && "是".equals(financialInfo.toString())) {
+            financialFlag = true;
+        }
+        data.put("financialInfo_flag", financialFlag);
+        commonDataCache.insertData(relationId, "financialInfo_flag", financialFlag);
+
+        Integer index = 1;
+        Map<String, Object> operationalMap = new HashMap<>();
+        if (financialFlag) {
+            index++;
+            operationalMap.put("financialDataSeq", index.toString());
+            index++;
+            operationalMap.put("indicators", index.toString());
+            index++;
+            operationalMap.put("financialCheckDetails", index.toString());
+            index++;
+            operationalMap.put("moduleTail", index.toString());
+        }
+        index++;
+        operationalMap.put("moduleTail", index.toString());
+
+        data.put("operationalMap", operationalMap);
+    }
 
     /**
      * 填充默认值,确保所有必要字段都存在
@@ -112,6 +139,11 @@ public final class FinancialInfoNewRender extends FXYAbstractRender {
             data.put("annualInspectionResult", "否");
         }
 
+        List<Map<String, Object>> financialDataSeq = (List<Map<String, Object>>) data.get("financialDataSeq");
+        if (CollectionUtils.isNotEmpty(financialDataSeq)) {
+            data.put("financialDataSeqFlag", "是");
+        }
+        data.put("financialDataSeqFlag", "否");
     }
 
 }

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

@@ -0,0 +1,137 @@
+package com.yaoyicloud.render.platform.update;
+
+import java.io.IOException;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import com.deepoove.poi.config.Configure;
+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;
+
+@Slf4j
+public final class OtherRender extends FXYAbstractRender {
+    private final FilerepoProperties filerepoProperties;
+    private final CommonDataCache commonDataCache;
+
+    // 注入父类所需的 cwd 参数
+    public OtherRender(String cwd, FilerepoProperties filerepoProperties, CommonDataCache commonDataCache) {
+        super(cwd);
+        this.filerepoProperties = filerepoProperties;
+        this.commonDataCache = commonDataCache;
+    }
+
+    @Override
+    protected String getBasicPath() throws IOException {
+        return filerepoProperties.getBasePath();
+    }
+
+    @Override
+    protected String getReportImagePath() {
+        return filerepoProperties.getReportImagePath();
+    }
+
+    @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();
+
+        String completeJson = JsonFormat.printer()
+            .includingDefaultValueFields()
+            .print(mergedProto);
+
+        ObjectMapper objectMapper = new ObjectMapper();
+        Map<String, Object> data = objectMapper.readValue(completeJson, new TypeReference<Map<String, Object>>() {});
+        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
+        if (MapUtils.isNotEmpty(commonDataCacheData)) {
+            data.putAll(commonDataCacheData);
+        }
+        fillDefaultValues(data);
+        data.put("levelInteger", counter);
+        fillCommonDataCacheData(data, relationId);
+        return data;
+    }
+
+    private void fillCommonDataCacheData(Map<String, Object> data, String relationId) {
+        Integer index = 1;
+        Map<String, Object> otherMap = new HashMap<>();
+        commonDataCache.insertData(relationId, "integrity_guarantee_flag", false);
+        data.put("relatedEntityImage_flag", false);
+        List<Map<String, Object>> otherRiskChecks = (List<Map<String, Object>>) data.get("otherRiskChecks");
+
+        if (CollectionUtils.isEmpty(otherRiskChecks)) {
+            index++;
+        } else {
+            for (Map<String, Object> basicInfoCheck : otherRiskChecks) {
+                String category = (String) basicInfoCheck.get("category");
+                if (category == null) {
+                    continue;
+                }
+
+                switch (category) {
+                    case "interest_conflict_questionnaire":
+
+                        index++;
+                        otherMap.put("relatedEntityImage", index.toString());
+                        data.put("relatedEntityImage_flag", true);
+                        break;
+                    case "integrity_guarantee":
+                        index++;
+                        otherMap.put("questionnaireItems", index.toString());
+                        commonDataCache.insertData(relationId, "integrity_guarantee_flag", true);
+                        break;
+
+                    default:
+                        break;
+                }
+            }
+            index++;
+        }
+
+        otherMap.put("moduleTail", index.toString());
+        data.put("otherMap", otherMap);
+    }
+
+    @Override
+    protected ConfigureBuilder builder(String relationId) {
+        // 配置POI-TL渲染器
+        ConfigureBuilder builder = Configure.builder();
+        RenderPolicy indicatorsRenderPolicy = this.indicatorsRenderPolicyToProtobuf(true);
+        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
+        builder.bind("questionnaireItems",
+            this.addDefaultRowForEmptyTable((Boolean) commonDataCacheData.get("integrity_guarantee_flag")));
+        builder.bind("otherRiskChecks", indicatorsRenderPolicy);
+        builder.addPlugin('^', this.pictureRenderPolicy());
+        builder.useSpringEL();
+        return builder;
+    }
+
+    /**
+     * 填充默认值,确保所有必要字段都存在
+     */
+    private void fillDefaultValues(Map<String, Object> data) {
+        Map<String, Object> summary = (Map<String, Object>) data.get("summary");
+        summary.replaceAll((k, v) -> v.equals("") ? "-" : v);
+
+        processJsonData(data, "questionnaireItems");
+
+    }
+
+}

+ 0 - 104
easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/PublicRecordNewRender.java

@@ -1,104 +0,0 @@
-package com.yaoyicloud.render.platform.update;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import com.deepoove.poi.config.Configure;
-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.yaoyicloud.config.CommonDataCache;
-import com.yaoyicloud.config.FilerepoProperties;
-
-import com.yaoyicloud.factory.FXYAbstractRender;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.MapUtils;
-
-@Slf4j
-public final class PublicRecordNewRender extends FXYAbstractRender {
-    private final FilerepoProperties filerepoProperties;
-    private final CommonDataCache commonDataCache;
-
-    public PublicRecordNewRender(String cwd, FilerepoProperties filerepoProperties, CommonDataCache commonDataCache) {
-        super(cwd);
-        this.filerepoProperties = filerepoProperties;
-        this.commonDataCache = commonDataCache;
-    }
-
-    @Override
-    protected Map<String, Object> renderDocx(String info, String relationId, Integer counter) throws IOException {
-        log.info("开始渲染司法风险模块,relationId: {}", relationId);
-
-
-
-        ObjectMapper objectMapper = new ObjectMapper();
-        Map<String, Object> data = objectMapper.readValue(info, new TypeReference<Map<String, Object>>() {});
-        data.replaceAll((k, v) -> v.equals("") ? "-" : v);
-
-        fillBasicDefaultValues(data);
-
-        Map<String, Object> publicRecordSummary = (Map<String, Object>) data.get("publicRecordSummary");
-        publicRecordSummary.putIfAbsent("riskSummary", "-");
-        publicRecordSummary.putIfAbsent("suggestion", "-");
-        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
-        if (MapUtils.isNotEmpty(commonDataCacheData)) {
-            data.putAll(commonDataCacheData);
-        }
-        data.put("levelInteger", counter);
-        return data;
-    }
-
-    @Override
-    protected ConfigureBuilder builder() {
-        // 配置POI-TL渲染器
-        ConfigureBuilder builder = Configure.builder();
-        RenderPolicy indicatorsRenderPolicy = this.indicatorsRenderPolicyToProtobuf();
-
-        builder.bind("dishonestPersons", indicatorsRenderPolicy);
-        builder.bind("judicialRiskChecks", indicatorsRenderPolicy);
-
-        builder.bind("severeViolations", indicatorsRenderPolicy);
-        builder.useSpringEL();
-        return builder;
-    }
-
-    @Override
-    protected String getBasicPath() throws IOException {
-        return filerepoProperties.getBasePath();
-    }
-
-    @Override
-    protected String getReportImagePath() {
-        return filerepoProperties.getReportImagePath();
-    }
-
-
-
-    /**
-     * 填充默认值,确保所有必要字段都存在
-     */
-    private void fillBasicDefaultValues(Map<String, Object> data) {
-
-        List<Map<String, Object>> dishonestPersons = (List<Map<String, Object>>) data.get("dishonestPersons");
-        if (CollectionUtils.isEmpty(dishonestPersons)) {
-            Map<String, Object> defaultDishonestPerson = new HashMap<>();
-            defaultDishonestPerson.put("id", "1");
-            List<Map<String, Object>> defaultDishonestPersonList = Collections.singletonList(defaultDishonestPerson);
-            data.put("dishonestPersons", defaultDishonestPersonList);
-
-        }
-
-        List<Map<String, Object>> severeViolations = (List<Map<String, Object>>) data.get("severeViolations");
-        if (CollectionUtils.isEmpty(severeViolations)) {
-            Map<String, Object> defaultSevereViolation = new HashMap<>();
-            defaultSevereViolation.put("id", "1");
-            List<Map<String, Object>> defaultSevereViolationList = Collections.singletonList(defaultSevereViolation);
-            data.put("severeViolations", defaultSevereViolationList);
-        }
-    }
-}

+ 0 - 114
easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/TaxNewRender.java

@@ -1,114 +0,0 @@
-package com.yaoyicloud.render.platform.update;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import com.yaoyicloud.config.CommonDataCache;
-import com.yaoyicloud.factory.FXYAbstractRender;
-import com.yaoyicloud.message.FxyProtos;
-import org.apache.commons.collections4.CollectionUtils;
-
-import com.deepoove.poi.config.Configure;
-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.FilerepoProperties;
-
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.collections4.MapUtils;
-
-@Slf4j
-public final class TaxNewRender extends FXYAbstractRender {
-    private final FilerepoProperties filerepoProperties;
-    private final CommonDataCache commonDataCache;
-
-    public TaxNewRender(String cwd, FilerepoProperties filerepoProperties, CommonDataCache commonDataCache) {
-        super(cwd);
-        this.filerepoProperties = filerepoProperties;
-        this.commonDataCache = commonDataCache;
-    }
-
-    @Override
-    protected Map<String, Object> renderDocx(String info, String relationId, Integer counter) throws IOException {
-        log.info("开始渲染税务风险模块,relationId: {}", relationId);
-
-
-        FxyProtos.PublicRecord.Builder publicRecordBuilder = FxyProtos.PublicRecord.newBuilder();
-        JsonFormat.parser().merge(info, publicRecordBuilder);
-        FxyProtos.PublicRecord defaultInstance = FxyProtos.PublicRecord.getDefaultInstance();
-        FxyProtos.PublicRecord mergedProto = defaultInstance.toBuilder()
-                .mergeFrom(publicRecordBuilder.build())
-                .build();
-
-        String completeJson = JsonFormat.printer()
-                .includingDefaultValueFields()
-                .print(mergedProto);
-        ObjectMapper objectMapper = new ObjectMapper();
-        Map<String, Object> data = objectMapper.readValue(completeJson, new TypeReference<Map<String, Object>>() {});
-        data.replaceAll((k, v) -> v.equals("") ? "-" : v);
-
-        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
-        if (MapUtils.isNotEmpty(commonDataCacheData)) {
-            data.putAll(commonDataCacheData);
-        }
-
-        fillBasicDefaultValues(data);
-        data.put("levelInteger", counter);
-        // Map<String, Object> publicRecordSummary = (Map<String, Object>) data.get("publicRecordSummary");
-        // publicRecordSummary.putIfAbsent("riskSummary", "-");
-        // publicRecordSummary.putIfAbsent("suggestion", "");
-        return data;
-    }
-
-    @Override
-    protected ConfigureBuilder builder() {
-        // 配置POI-TL渲染器
-        ConfigureBuilder builder = Configure.builder();
-        RenderPolicy indicatorsRenderPolicy = this.indicatorsRenderPolicyToProtobuf();
-
-        builder.bind("taxationRiskChecks", indicatorsRenderPolicy);
-        builder.bind("taxPenalties", indicatorsRenderPolicy);
-        builder.useSpringEL();
-        return builder;
-    }
-
-    @Override
-    protected String getBasicPath() throws IOException {
-        return filerepoProperties.getBasePath();
-    }
-
-    @Override
-    protected String getReportImagePath() {
-        return filerepoProperties.getReportImagePath();
-    }
-
-
-    /**
-     * 填充默认值,确保所有必要字段都存在
-     */
-    private void fillBasicDefaultValues(Map<String, Object> data) {
-        Map<String, Object> publicRecordSummary = (Map<String, Object>) data.get("publicRecordSummary");
-        publicRecordSummary.replaceAll((k, v) -> v.equals("") ? "-" : v);
-
-        List<Map<String, Object>> dishonestPersons = (List<Map<String, Object>>) data.get("dishonestPersons");
-        if (CollectionUtils.isEmpty(dishonestPersons)) {
-            Map<String, Object> defaultDishonestPerson = new HashMap<>();
-            defaultDishonestPerson.put("id", "1");
-            List<Map<String, Object>> defaultDishonestPersonList = Collections.singletonList(defaultDishonestPerson);
-            data.put("dishonestPersons", defaultDishonestPersonList);
-
-        }
-
-        List<Map<String, Object>> severeViolations = (List<Map<String, Object>>) data.get("severeViolations");
-        if (CollectionUtils.isEmpty(severeViolations)) {
-            Map<String, Object> defaultSevereViolation = new HashMap<>();
-            defaultSevereViolation.put("id", "1");
-            List<Map<String, Object>> defaultSevereViolationList = Collections.singletonList(defaultSevereViolation);
-            data.put("severeViolations", defaultSevereViolationList);
-        }
-    }
-}

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

@@ -0,0 +1,129 @@
+package com.yaoyicloud.render.platform.update;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import com.yaoyicloud.config.CommonDataCache;
+import com.yaoyicloud.factory.FXYAbstractRender;
+import com.yaoyicloud.message.FxyProtos;
+import org.apache.commons.collections4.CollectionUtils;
+
+import com.deepoove.poi.config.Configure;
+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.FilerepoProperties;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
+
+@Slf4j
+public final class TaxRender extends FXYAbstractRender {
+    private final FilerepoProperties filerepoProperties;
+    private final CommonDataCache commonDataCache;
+
+    public TaxRender(String cwd, FilerepoProperties filerepoProperties, CommonDataCache commonDataCache) {
+        super(cwd);
+        this.filerepoProperties = filerepoProperties;
+        this.commonDataCache = commonDataCache;
+    }
+
+    @Override
+    protected Map<String, Object> renderDocx(String info, String relationId, Integer counter) throws IOException {
+        log.info("开始渲染税务风险模块,relationId: {}", relationId);
+
+        FxyProtos.RiskModule.Builder riskModuleBuilder = FxyProtos.RiskModule.newBuilder();
+        JsonFormat.parser().merge(info, riskModuleBuilder);
+        FxyProtos.RiskModule defaultInstance = FxyProtos.RiskModule.getDefaultInstance();
+        FxyProtos.RiskModule mergedProto = defaultInstance.toBuilder()
+            .mergeFrom(riskModuleBuilder.build())
+            .build();
+
+        String completeJson = JsonFormat.printer()
+            .includingDefaultValueFields()
+            .print(mergedProto);
+        ObjectMapper objectMapper = new ObjectMapper();
+        Map<String, Object> data = objectMapper.readValue(completeJson, new TypeReference<Map<String, Object>>() {});
+        data.replaceAll((k, v) -> v.equals("") ? "-" : v);
+
+        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
+        if (MapUtils.isNotEmpty(commonDataCacheData)) {
+            data.putAll(commonDataCacheData);
+        }
+
+        fillBasicDefaultValues(data);
+        data.put("levelInteger", counter);
+        fillCommonDataCacheData(data, relationId);
+        return data;
+    }
+
+    private void fillCommonDataCacheData(Map<String, Object> data, String relationId) {
+        Integer index = 1;
+        Map<String, Object> otherMap = new HashMap<>();
+        commonDataCache.insertData(relationId, "tax_error_flag", false);
+        List<Map<String, Object>> taxInfoChecks = (List<Map<String, Object>>) data.get("taxInfoChecks");
+        if (CollectionUtils.isEmpty(taxInfoChecks)) {
+            index++;
+        } else {
+            for (Map<String, Object> basicInfoCheck : taxInfoChecks) {
+                String category = (String) basicInfoCheck.get("category");
+                if (category == null) {
+                    continue;
+                }
+                switch (category) {
+                    case "tax_error":
+                        index++;
+                        otherMap.put("taxError", index.toString());
+                        commonDataCache.insertData(relationId, "tax_error_flag", true);
+                        break;
+                    default:
+                        break;
+                }
+            }
+            index++;
+        }
+        otherMap.put("moduleTail", index.toString());
+        data.put("taxMap", otherMap);
+    }
+
+    @Override
+    protected ConfigureBuilder builder(String relationId) {
+        // 配置POI-TL渲染器
+        ConfigureBuilder builder = Configure.builder();
+        RenderPolicy indicatorsRenderPolicy = this.indicatorsRenderPolicyToProtobuf(true);
+        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
+        builder.bind("taxPenalties",
+            this.addDefaultRowForEmptyTable((Boolean) commonDataCacheData.get("tax_error_flag")));
+        builder.bind("taxInfoChecks", indicatorsRenderPolicy);
+        builder.useSpringEL();
+
+        return builder;
+    }
+
+    @Override
+    protected String getBasicPath() throws IOException {
+        return filerepoProperties.getBasePath();
+    }
+
+    @Override
+    protected String getReportImagePath() {
+        return filerepoProperties.getReportImagePath();
+    }
+
+    /**
+     * 填充默认值,确保所有必要字段都存在
+     */
+    private void fillBasicDefaultValues(Map<String, Object> data) {
+        Map<String, Object> summary = (Map<String, Object>) data.get("summary");
+        summary.replaceAll((k, v) -> v.equals("") ? "-" : v);
+
+        Object updateSource = data.get("updateSource");
+        if (updateSource.equals("-")) {
+            data.put("updateSource", "");
+        }
+        processJsonData(data, "taxPenalties");
+    }
+}

+ 16 - 16
easier-report-biz/src/main/java/com/yaoyicloud/service/impl/FxyReportUpdateServiceImpl.java

@@ -20,11 +20,11 @@ import com.yaoyicloud.render.ServiceProviderInfoRender;
 
 import com.yaoyicloud.render.platform.AttachmentSectionRender;
 
-import com.yaoyicloud.render.platform.update.AntiBriberyNewRender;
-import com.yaoyicloud.render.platform.update.FXYInfoNewRender;
-import com.yaoyicloud.render.platform.update.FinancialInfoNewRender;
-import com.yaoyicloud.render.platform.update.PublicRecordNewRender;
-import com.yaoyicloud.render.platform.update.TaxNewRender;
+import com.yaoyicloud.render.platform.update.OtherRender;
+import com.yaoyicloud.render.platform.update.BusinessRender;
+import com.yaoyicloud.render.platform.update.OperationalRender;
+import com.yaoyicloud.render.platform.update.JudicialRender;
+import com.yaoyicloud.render.platform.update.TaxRender;
 import com.yaoyicloud.service.ReportUpdateService;
 import com.yaoyicloud.tools.DocxUtil;
 import org.apache.poi.xwpf.usermodel.XWPFDocument;
@@ -64,7 +64,7 @@ public class FxyReportUpdateServiceImpl implements ReportUpdateService {
         relationCounterRedisUtil.increment(relationId, 1);
 
         String mergedReportPath = null;
-        boolean isLastModule = reportPath.contains("attachmentSection");
+        boolean isLastModule = reportPath.contains("ATTACHMENTSECTION");
         if (isLastModule) {
             List<String> reportPaths = reportPathManager.removeSession(sessionId);
             XWPFDocument targetDoc;
@@ -100,8 +100,8 @@ public class FxyReportUpdateServiceImpl implements ReportUpdateService {
 //                reportPath = new AntiBriberyRender(sessionId, filerepoProperties, commonDataCache)
 //                    .createFXYDocument(data, inputStream, String.valueOf(relationId));
 //                break;
-            case PLATFORM_COMPANY_ANTIBRIBERY_NEW:
-                reportPath = new AntiBriberyNewRender(sessionId, filerepoProperties, commonDataCache)
+            case OTHER:
+                reportPath = new OtherRender(sessionId, filerepoProperties, commonDataCache)
                     .createFXYDocument(data, inputStream, String.valueOf(relationId), counter, type);
                 break;
 //            case PLATFORM_COMPANY_BASICINFO:
@@ -128,8 +128,8 @@ public class FxyReportUpdateServiceImpl implements ReportUpdateService {
 //                reportPath = new FinancialInfoRender(sessionId, filerepoProperties, commonDataCache)
 //                    .createFXYDocument(data, inputStream, String.valueOf(relationId));
 //                break;
-            case PLATFORM_COMPANY_FINANCIALINFO_NEW:
-                reportPath = new FinancialInfoNewRender(sessionId, filerepoProperties, commonDataCache)
+            case OPERATIONAL:
+                reportPath = new OperationalRender(sessionId, filerepoProperties, commonDataCache)
                     .createFXYDocument(data, inputStream, String.valueOf(relationId), counter, type);
                 break;
 //            case FOUNDATION_FINANCIALINFO:
@@ -140,12 +140,12 @@ public class FxyReportUpdateServiceImpl implements ReportUpdateService {
 //                reportPath = new PublicRecordRender(sessionId, filerepoProperties, commonDataCache)
 //                    .createFXYDocument(data, inputStream, String.valueOf(relationId));
 //                break;
-            case PLATFORM_COMPANY_PUBLIC_RECORD_NEW:
-                reportPath = new PublicRecordNewRender(sessionId, filerepoProperties, commonDataCache)
+            case JUDICIAL:
+                reportPath = new JudicialRender(sessionId, filerepoProperties, commonDataCache)
                     .createFXYDocument(data, inputStream, String.valueOf(relationId), counter, type);
                 break;
-            case PLATFORM_COMPANY_BASICINFO_NEW:
-                reportPath = new FXYInfoNewRender(sessionId, filerepoProperties, commonDataCache)
+            case BUSINESS:
+                reportPath = new BusinessRender(sessionId, filerepoProperties, commonDataCache)
                     .createFXYDocument(data, inputStream, String.valueOf(relationId), counter, type);
                 break;
 //            case FOUNDATION_BASICINFO:
@@ -164,8 +164,8 @@ public class FxyReportUpdateServiceImpl implements ReportUpdateService {
 //                reportPath = new InterestConflictsRender(sessionId, filerepoProperties, commonDataCache)
 //                    .createFXYDocument(data, inputStream, String.valueOf(relationId));
 //                break;
-            case PLATFORM_COMPANY_TAX_NEW:
-                reportPath = new TaxNewRender(sessionId, filerepoProperties, commonDataCache)
+            case TAX:
+                reportPath = new TaxRender(sessionId, filerepoProperties, commonDataCache)
                     .createFXYDocument(data, inputStream, String.valueOf(relationId), counter, type);
                 break;
             default:

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

@@ -7,6 +7,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.xwpf.usermodel.IBodyElement;
 import org.apache.poi.xwpf.usermodel.XWPFDocument;
@@ -28,7 +29,7 @@ import org.openxmlformats.schemas.wordprocessingml.x2006.main.STStyleType;
 import com.deepoove.poi.xwpf.XWPFStructuredDocumentTag;
 
 
-
+@Slf4j
 public final class DocxUtil {
 
     public static void mergeDocx(XWPFDocument target, List<XWPFDocument> sources, String outputPath, Long relationId)
@@ -62,6 +63,7 @@ public final class DocxUtil {
             target.write(out);
             target.close();
         }
+        log.info("文档合并成功,文档路径为:{}", outputPath);
     }
 
     private static void prefixStyles(XWPFDocument doc, String prefix) {

+ 41 - 180
easier-report-biz/src/main/proto/fxy.proto

@@ -3,7 +3,6 @@ package fxy;
 option java_package = "com.yaoyicloud.message";
 option java_outer_classname = "FxyProtos";
 
-
 message ServiceProviderInfo {
   optional string name = 1; // ${服务商信息:服务商名称}
   optional string type = 2; // "基金会"
@@ -21,38 +20,31 @@ message CheckItemDetail {
   optional string category = 8;
   optional int32 rank = 9;  // 展示排序
   optional string formula = 10; // 计算公式(如"公益支出/上年基金余额")
-  optional string avg = 11; // 平均值
+  optional string avg = 11; // 服务商数据(平均值/收入)
 }
 
 message CheckItemScore {
   optional string category = 1;
   optional string itemName = 2;
- // optional int64 score = 3;
-  optional string score = 4;
+  optional string score = 3;
 }
 
 message CheckSummary {
-  // optional int32 score = 1; // ${基本信息评分及建议:基本信息总分}
+  optional int32 score = 1; // ${基本信息评分及建议:基本信息总分}
   optional string riskSummary = 2; // ${基本信息评分及建议:风险综述}
   optional string suggestion = 3 ; // ${基本信息评分及建议:建议}
-
-  optional string score = 4; // ${基本信息评分及建议:基本信息总分}
 }
 
 message AuditResult {
-  optional string opinion = 2; // ${审核结果:审核意见}
-  optional string serviceProviderName = 3; // ${审核结果:服务商名称}
-  optional string auditDate = 4; // ${审核结果:审核日期}
-  optional string reportVersion = 5; // ${审核结果:报告版本}
-  optional string tenantName = 6; // ${服务商信息:租户名称}
-
-  optional CheckSummary overallSummary = 7;
-  repeated CheckItemScore checkItemScores = 8;
-
-  //  optional string reportDate = 11; // ${服务商信息:报告日期}
-
+  optional string opinion = 1; // ${审核结果:审核意见}
+  optional string serviceProviderName = 2; // ${审核结果:服务商名称}
+  optional string auditDate = 3; // ${审核结果:审核日期}
+  optional string reportVersion = 4; // ${审核结果:报告版本}
+  optional string tenantName = 5; // ${服务商信息:租户名称}
+  optional CheckSummary overallSummary = 6;
+  repeated CheckItemScore checkItemScores = 7;
   //通用数据
-  optional string type =12; //服务商类型
+  optional string type = 8; //服务商类型
 }
 
 message SuperiorAuthority {// 直属机关
@@ -64,11 +56,12 @@ message CompanyBasicInfoExt {
   optional string industry = 1; // 所属行业
   optional string paidInCapital = 2; // 实缴资本(单位:人民币万元)
   optional string enterpriseScale = 3; // 企业规模(如:小型)
-  optional int32 insuredEmployees = 4; // 参保人数
+  optional string insuredEmployees = 4; // 参保人数
   optional string businessStatus = 5; // 经营状态(如:存续)
   optional string registrationAuthority = 6; // 登记机关
   optional string taxpayerQualification = 7; // 纳税人资质(如:增值税一般纳税人)
   optional string enterpriseType = 8; // 企业类型(如:有限责任公司)
+  optional string updateSource = 9; //数据来源
 }
 
 message AssociationBasicInfoExt {
@@ -136,109 +129,14 @@ message BasicInfo {
   optional AssociationBasicInfoExt associationExt = 34;
   optional FoundationBasicInfoExt foundationExt = 35;
 
-  repeated SameAddress sameaddress = 36; // 相同地址企业
+  //新报告新数据
+  map<string, string> sameaddress = 36; // 相同地址企业
 
-  //  repeated string seconds = 37; //二级标题的后半部分
-  map<string, string> secondsMap = 38; //二级标题连续定义
+  map<string, string> samecontactNumberDatas = 37; // 相同电话企业
 
-  repeated SamecontactNumber samecontactNumberDatas = 39; // 相同电话企业
-}
+  map<string, string> sameExecutivesNames = 38; //同名高管
 
-message DishonestPersonsInfo {
-  optional string province = 1; // 省份
-  optional string inDate = 2; // 立案时间
-  optional string docNumber = 3; // 执行依据文号
-  optional string finalDuty = 4; // 生效法律文书确定的义务
-  optional string executionStatus = 5; // 被执行人履行情况
-  optional string caseNumber = 6; // 案号
-  optional string amount = 7; // 执行标的
-  optional string publishDate = 8; // 发布日期
-  optional string court = 9; // 执行法院
-  optional string executionDesc = 10; // 失信被执行人行为情况
-  optional string disabled = 11; // 是否是历史
-  optional string operName = 12; // 法定代表人
-  optional string number = 13; // 组织机构号
-  optional string exDepartment = 14; // 做出执行依据单位
-  optional string id = 15;
-}
-
-message AbnormalsInfo {
-  optional string entName = 1; // 企业名称
-  optional string inDate = 2; // 列入时间
-  optional string department = 3; // 做出决定机关
-  optional string province = 4; // 省份
-  optional string outDate = 5; // 移出时间
-  optional string outReason = 6; // 移出原因
-  optional string regNo = 7; // 注册号
-  optional string disabled = 8; // 历史异常
-  optional string inReason = 9; // 列入原因
-  optional string outDepartment = 10; // 移出决定机关
-  optional string id = 11;
-}
-
-message AdministrativePenaltyRecord {
-  optional string number = 1; // 决定书文号
-  optional string penaltyData = 2; // 处罚日期
-  optional string departmentName = 3;
-  optional string entName = 4; // 企业名称
-  optional string illegalType = 5; // 违法行为类型
-  optional string source = 6; // 来源
-  optional string content = 7; // 行政处罚内容
-  optional string publishDate = 8; // 公示日期
-  optional string description = 9; // 详情
-  optional string disabled = 10; // 是否成为历史
-  optional string basedOn = 11; // 处罚依据
-  optional string seqNo = 12; // 序号
-  optional string operName = 13; // 法定代表人
-  optional string punishAmnt = 14; // 罚款金额
-  optional string department = 15; // 决定机关名称
-  optional string id = 16;
-}
-
-message AdministrativeTaxPenalty {
-  optional string departmentName = 1; // 企业名称
-  optional string time = 2; // 发生时间
-  optional string type = 3; // 公示税务机关
-  optional string uTags = 4; // 是否是历史
-  optional string property = 5; // 案件性质
-  optional string createTime = 6; // 创建时间
-  optional string financeOfficer = 7; // 财务负责人
-  optional string name = 8; // 纳税人名称
-  optional string creditNo = 9; // 纳税人识别号
-  optional string oper = 10; // 法定代表人
-  optional string address = 11; // 注册地址
-  optional string result = 12; // 相关法律依据及,税务处理处罚情况
-  optional string orgNo = 13; // 组织机构代码
-  optional string url = 14; // 原文链接
-  optional string id = 15;
-}
 
-message AdministrativeSeriousIllegal {
-  optional string departName = 1; // 企业名称
-  optional string time = 2; // 列入日期
-  optional string decisionDept = 3; // 作出决定机关(列入)
-  optional string inReason = 4; // 列入原因
-  optional string outDate = 5; // 移出时间
-  optional string outReason = 6; // 移出原因
-  optional string outDepartment = 7; // 作出决定机关(移出)
-  optional string isHistory = 8; // 是否是历史信息
-  optional string id = 9;
-}
-
-message PublicRecord {
-  repeated DishonestPersonsInfo dishonestPersons = 1; // 失信被执行人(3.1)
-  repeated AbnormalsInfo businessAbnormals = 2; // 经营异常(3.2)
-  repeated AdministrativePenaltyRecord penaltyRecords = 3; // 行政处罚记录(3.3)
-  repeated AdministrativeTaxPenalty taxPenalties = 4; // 税务处罚记录(3.4)
-  repeated AdministrativeSeriousIllegal severeViolations = 5; // 严重违法记录(3.5)
-  optional CheckSummary publicRecordSummary = 6; // 公共记录评分及建议(3.6)
-  //新版报告专用
-  repeated CheckItemDetail judicialRiskChecks = 7; // 司法风险
-
-  repeated CheckItemDetail taxationRiskChecks = 8; //税务风险
-
-  optional string qualification = 9; //纳税人类型
-  optional string grade = 10; //纳税信用评级
 }
 
 message FinancialData {
@@ -273,20 +171,19 @@ message FinancialData {
   optional string netProfit = 28; // 净利润
   optional string las3yTotProfMap = 29; // 利润总额
   optional string interestExpense = 30; // 利息支出
-
   //捐赠项目成本
   optional string donationProjectCost = 31;
   //净资产合计
   optional string totalNetAssets = 32;
   //费用合计
   optional string totalCost = 33;
+  optional string incomeTaxExpense = 34; // 利息支出
 }
 
 message FinancialIndicator {
   optional string category = 1; // 分类(如"运营能力"、"发展能力")
   optional string indicatorName = 2; // 指标名称(如"公益支出比例")财务指标
   optional string formula = 3; // 计算公式(如"公益支出/上年基金余额")
-
   repeated string values = 4;  //按年取值
 }
 
@@ -295,21 +192,20 @@ message FinancialInfo {
   repeated string years = 4;   //按年取值
   optional string remark = 5; // 备注
   repeated FinancialIndicator indicators = 9; // 财务指标(4.2)
-  repeated CheckItemDetail financialCheckDetails = 10;
+  repeated CheckItemDetail financialCheckDetails = 10;  //财务信息评分及建议
   optional CheckSummary financialSummary = 11; // 财务信息评分及建议(4.3)
   repeated Attachment financialFiles = 12; // 没有财务解析时的临时方案
-
   // 平台报告新加字段
   optional string operatingRevenue = 13; // 最近一年营业收入
   optional string neProfit = 14; // 最近一年净利润
+  //新版报告展示位置变动
   optional string certReceived = 15;    // ${经营情况:《*登记证书》:相关资料是否收到}
-
   optional string renzcode = 16;               // ${认证代码}
   optional string validate = 17;               // ${有效期}
   optional string annualInspectionResult = 18;    // ${经营情况:年检结果}
   optional string bankLicense = 19;             //银行开户许可证
-
   repeated CheckItemDetail businessRiskChecks = 20; //经营风险提示
+  optional string financialInfo = 21; // 财务信息 是否授权
 
 }
 
@@ -322,7 +218,7 @@ message QuestionnaireItem {
 message AntiBribery {
   repeated QuestionnaireItem questionnaireItems = 1; // 反贿赂反腐败诚信保证问卷
   optional CheckSummary antiBriberySummary = 2; // 反贿赂反腐败诚信保证评分及建议
-  repeated CheckItemDetail otherRiskChecks = 3; // 审查内容
+  repeated CheckItemDetail otherRiskChecks = 4; // 审查内容
 }
 
 message ProjectInfo {
@@ -363,21 +259,6 @@ message AttachmentSection {
 
   repeated Attachment overallGuaranteeStatements = 16; // 总体保证声明
 
-}
-//message Address{
-//  optional string name = 1;//企业名称
-//}
-
-
-message AssociationattachmentSection {
-  optional string selfDeclLink = 1;
-  repeated string fillDeclLinks = 2;
-  repeated Attachment businessLicenseImages = 3; // 营业执照图片路径
-
-  repeated Attachment bankCertificateImages = 4; // 银行开户证明图片路径
-
-  repeated Attachment overallGuaranteeStatements = 16; // 总体保证声明
-
   repeated Attachment legalRegistrationCertImages = 17; //社会团体法人登记证书图片路径(多张)
 
   repeated Attachment annualInspectionResultImage = 18; //最新年检结果页图片路径
@@ -402,48 +283,28 @@ message AssociationattachmentSection {
 
   repeated Attachment otherInfoImage = 28; //其他分支机构
 
-  repeated Attachment branchInfoImage = 29; //地方分会情况图片路径
+  repeated Attachment branchInfoImage = 30; //地方分会情况图片路径
 
-  repeated Attachment financialStatementsForLastThreeYears = 31; //最近三年财务报表
+  repeated Attachment relatedEntitySituation = 33; //关联实体情况
 
-  repeated Attachment relatedEntitySituation = 32; //关联实体情况
-
-  repeated Attachment organizationalStructureScan = 33; //组织结构-扫描件并加盖公章
+  repeated Attachment organizationalStructureScan = 34; //组织结构-扫描件并加盖公章
 
+  repeated Attachment financialStatementsForLastThreeYears = 35; // 财务信息在线链接
 }
 
-message SamecontactNumber {
-  // 企业名称
-  optional string name = 1;
-
-  // 成立日期
-  optional string startDate = 2;
-
-
-  // 税号
-  optional string creditNo = 4;
-
-  // 注册资本
-  optional string regCapiDesc = 5;
-
-
-}
-message SameAddress {
-  // 企业名称
-  optional string name = 1;
-
-  // 成立日期
-  optional string startDate = 2;
-
-  // 企业法人
-  optional string operName = 3;
-
-  // 税号
-  optional string creditNo = 4;
-
-  // 注册资本
-  optional string regCapiDesc = 5;
+message RiskModule{
+  repeated CheckItemDetail judicialRiskChecks = 1; // 司法风险
+  map<string, string>  dishonestPersons = 2; //失信被执行人情况
+  map<string, string>  severeViolations = 3; //列入失信黑名单情况
+  optional CheckSummary summary = 4; // 风险评分及建议
+  repeated CheckItemDetail otherRiskChecks = 5; // 其他风险
+  map<string, string> questionnaireItems = 6;   //反贿赂反腐败诚信保证问卷
+  repeated Attachment relatedEntityImages = 7;  // 利益冲突情况
+  optional string qualification = 9; //纳税人类型
+  optional string grade = 10; //纳税信用评级
+  // optional string year = 11; //年份
+  optional string updateSource = 12; //数据来源
+  repeated CheckItemDetail taxInfoChecks = 13; // 税务风险
+  map<string, string>  taxPenalties = 14; //税务处罚情况
 
-  // 企业状态
-  optional string status = 6;
-}
+}

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

@@ -13,7 +13,8 @@ spring:
   redis:
     host: 127.0.0.1
     port: 6379
-    password: 123456
+    password: 8F4tJuQEgAE7MZyX
+  #  password: 123456
     database: 10
   servlet:
     multipart:
@@ -84,14 +85,14 @@ mybatis-plus-join:
 
 # 文件系统
 file:
-  bucket-name: render-12
+  bucket-name: render-20250725
   oss:
     info: true
     enable: true
     endpoint: oss-cn-beijing.aliyuncs.com
     region: cn-beijing
-    access-key: LTAI5tKdzAiofJSASgbKRv69
-    secret-key: o9Qzoj54LbtUgZkai9fvIyUKSDzI3Q
+    access-key: LTAI5tD1Jucf5WFcnN8epMFk
+    secret-key: 2jkXhMGPeDSceblABB5Hf6erKzAfBM
     # 使用云OSS 需要关闭
     path-style-access: false
 
@@ -101,11 +102,7 @@ logging:
     com.yaoyicloud.easier.filerepo.mapper: debug
 
 # 租户表维护
-easier:
-  office:
-    pdf:
-      rootPath: C:/Users/yyy/dev/yyc3/easier-be
-
-template:
-  subTemplate: subtemplate.docx
-  path: /excel/pre/
+#easier:
+#  office:
+#    pdf:
+#      rootPath: C:/Users/yyy/dev/yyc3/easier-be

+ 2 - 2
easier-report-biz/src/test/java/com/yaoyicloud/render/test/TestAntiBriberyRender.java

@@ -14,7 +14,7 @@
 //import com.yaoyicloud.message.FxyProtos.AntiBribery;
 //import com.yaoyicloud.message.FxyProtos.CheckSummary;
 //import com.yaoyicloud.message.FxyProtos.QuestionnaireItem;
-//import com.yaoyicloud.render.platform.AntiBriberyNewRender;
+//import com.yaoyicloud.render.platform.OtherRender;
 //
 //public class
 //
@@ -30,7 +30,7 @@
 //
 //        byte[] content = Files
 //            .readAllBytes(Paths.get(getClass().getClassLoader().getResource("docx/antiBribery.docx").getFile()));
-//        AntiBriberyNewRender render = new AntiBriberyNewRender("../temp/");
+//        OtherRender render = new OtherRender("../temp/");
 //        String retPath = render.renderDocx(
 //            AntiBribery.newBuilder()
 //                .setAntiBriberySummary(CheckSummary.newBuilder().setRiskSummary("high risk").setSuggestion("accept it"))