فهرست منبع

build csoB端报告配置了包含新华等共四套模版代码生成逻辑

mamingxu 3 روز پیش
والد
کامیت
777d66e616
41فایلهای تغییر یافته به همراه2531 افزوده شده و 2114 حذف شده
  1. 11 1
      easier-report-api/src/main/java/com/yaoyicloud/constant/enums/ModuleType.java
  2. 24 0
      easier-report-api/src/main/java/com/yaoyicloud/dto/DocumentDTO.java
  3. 11 0
      easier-report-api/src/main/java/com/yaoyicloud/dto/ReportDTO.java
  4. 27 8
      easier-report-biz/src/main/java/com/yaoyicloud/config/RelationCounterRedisUtil.java
  5. 8 6
      easier-report-biz/src/main/java/com/yaoyicloud/controller/CsoReportController.java
  6. 107 32
      easier-report-biz/src/main/java/com/yaoyicloud/factory/AbstractRender.java
  7. 139 83
      easier-report-biz/src/main/java/com/yaoyicloud/factory/CSOAbstractRender.java
  8. 0 13
      easier-report-biz/src/main/java/com/yaoyicloud/factory/DocxRenderer.java
  9. 72 0
      easier-report-biz/src/main/java/com/yaoyicloud/factory/FXYAbstractRender.java
  10. 86 86
      easier-report-biz/src/main/java/com/yaoyicloud/render/InterestConflictsRender.java
  11. 115 115
      easier-report-biz/src/main/java/com/yaoyicloud/render/ProjectInfoRender.java
  12. 217 217
      easier-report-biz/src/main/java/com/yaoyicloud/render/PublicRecordRender.java
  13. 31 41
      easier-report-biz/src/main/java/com/yaoyicloud/render/ServiceProviderInfoRender.java
  14. 124 124
      easier-report-biz/src/main/java/com/yaoyicloud/render/association/AssociationAttachmentSectionRender.java
  15. 138 138
      easier-report-biz/src/main/java/com/yaoyicloud/render/association/AssociationBasicInfoRender.java
  16. 25 36
      easier-report-biz/src/main/java/com/yaoyicloud/render/cso/EntAppendixRender.java
  17. 28 37
      easier-report-biz/src/main/java/com/yaoyicloud/render/cso/EntHeaderSectionRender.java
  18. 84 0
      easier-report-biz/src/main/java/com/yaoyicloud/render/cso/EntProductIntroductionRender.java
  19. 24 38
      easier-report-biz/src/main/java/com/yaoyicloud/render/cso/EntPromotionDetailsRender.java
  20. 26 37
      easier-report-biz/src/main/java/com/yaoyicloud/render/cso/EntPromotionSummaryRender.java
  21. 122 122
      easier-report-biz/src/main/java/com/yaoyicloud/render/foundation/FoundationAttachmentSectionRender.java
  22. 154 154
      easier-report-biz/src/main/java/com/yaoyicloud/render/foundation/FoundationBasicInfoRender.java
  23. 122 122
      easier-report-biz/src/main/java/com/yaoyicloud/render/foundation/FoundationfinancialInfoRender.java
  24. 128 127
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/AntiBriberyRender.java
  25. 25 34
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/AttachmentSectionRender.java
  26. 123 123
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/BasicInfoRender.java
  27. 106 106
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/FinancialInfoRender.java
  28. 22 36
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/AntiBriberyNewRender.java
  29. 34 44
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/FXYInfoNewRender.java
  30. 33 43
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/FinancialInfoNewRender.java
  31. 30 40
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/PublicRecordNewRender.java
  32. 32 43
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/TaxNewRender.java
  33. 2 1
      easier-report-biz/src/main/java/com/yaoyicloud/service/CsoReportService.java
  34. 42 18
      easier-report-biz/src/main/java/com/yaoyicloud/service/impl/CsoReportServiceImpl.java
  35. 1 1
      easier-report-biz/src/main/java/com/yaoyicloud/service/impl/FxyReportServiceImpl.java
  36. 66 73
      easier-report-biz/src/main/java/com/yaoyicloud/service/impl/FxyReportUpdateServiceImpl.java
  37. 6 6
      easier-report-biz/src/main/java/com/yaoyicloud/template/AbstractReportExporter.java
  38. 176 0
      easier-report-biz/src/main/java/com/yaoyicloud/tools/DesensitizedUtils.java
  39. 2 2
      easier-report-biz/src/main/java/com/yaoyicloud/tools/OfficeUtil.java
  40. 6 3
      easier-report-biz/src/main/proto/cso.proto
  41. 2 4
      easier-report-biz/src/test/java/com/yaoyicloud/render/test/TestPdf.java

+ 11 - 1
easier-report-api/src/main/java/com/yaoyicloud/constant/enums/ModuleType.java

@@ -11,9 +11,19 @@ import lombok.Getter;
 @Getter
 @AllArgsConstructor
 public enum ModuleType {
+    CSO_PROMOTION_SIGNIFICANCE_DRUG("CSO_PROMOTION_SIGNIFICANCE_DRUG", "CSO推广目的及意义模块"),
+    CSO_SITUATION_OVERVIEW_DRUG("CSO_SITUATION_OVERVIEW_DRUG", "CSO医药市场情况概况模块"),
 
-    CSO_HEADER("CSO_HEADER", "CSO封面模块"),
+    CSO_HEADER_XINHUA("CSO_HEADER_XINHUA", "CSO新华封面模块"),
+    CSO_PROMOTION_SIGNIFICANCE_XINHUA("CSO_PROMOTION_SIGNIFICANCE_XINHUA", "CSO新华推广目的及意义模块"),
+    CSO_SITUATION_OVERVIEW_XINHUA("CSO_SITUATION_OVERVIEW_XINHUA", "CSO新华医药市场情况概况模块"),
+    CSO_PRODUCT_INTRODUCTION_XINHUA("CSO_PRODUCT_INTRODUCTION_XINHUA", "CSO新华产品介绍模块"),
+    CSO_PROMOTION_DETAILS_XINHUA("CSO_PROMOTION_DETAILS_XINHUA", "CSO新华推广明细模块"),
+    CSO_ATTACHMENT_XINHUA("CSO_ATTACHMENT_XINHUA", "CSO新华签章明细模块"),
 
+    CSO_HEADER("CSO_HEADER", "CSO封面模块"),
+    CSO_PRODUCT_INTRODUCTION("CSO_PRODUCT_INTRODUCTION", "CSO产品介绍模块"),
+    CSO_PROMOTION_DETAILS_1611890606("CSO_PROMOTION_DETAILS_1611890606", "CSOv2_1611890606推广明细模块"),
     CSO_PROMOTION_SUMMARY("CSO_PROMOTION_SUMMARY", "CSO推广总结模块"),
     CSO_PROMOTION_DETAILS("CSO_PROMOTION_DETAILS", "CSO推广明细模块"),
     CSO_APPENDIX("CSO_APPENDIX", "CSO签章"),

+ 24 - 0
easier-report-api/src/main/java/com/yaoyicloud/dto/DocumentDTO.java

@@ -0,0 +1,24 @@
+package com.yaoyicloud.dto;
+
+import lombok.AccessLevel;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.InputStream;
+
+/**
+ * 报告dto
+ */
+@NoArgsConstructor(access = AccessLevel.NONE)
+public class DocumentDTO {
+
+    @Data
+    public static class Oncreate {
+        private String info;
+        private InputStream inputStream;
+        private String relationId;
+        private Integer counter;
+        private String moduleType;
+    }
+
+}

+ 11 - 0
easier-report-api/src/main/java/com/yaoyicloud/dto/ReportDTO.java

@@ -65,10 +65,21 @@ public class ReportDTO {
     @Data
     public static class CsoReport {
 
+        /**
+         * protobuf json串
+         */
         @NotNull(message = "map数据必填")
         private String data;
 
+        /**
+         * 模块标识
+         */
         @NotNull(message = "moduleType必填")
         private ModuleType moduleType;
+        /**
+         * 是否合并文档
+         */
+        @NotNull(message = "mergeflag")
+        private Boolean mergeflag;
     }
 }

+ 27 - 8
easier-report-biz/src/main/java/com/yaoyicloud/config/RelationCounterRedisUtil.java

@@ -22,6 +22,7 @@ public class RelationCounterRedisUtil {
 
     /**
      * 生成 Redis 计数器的完整 key
+     *
      * @param relationId 业务关联 ID
      * @return 格式:relation:counter:{relationId}
      */
@@ -30,18 +31,20 @@ public class RelationCounterRedisUtil {
     }
 
     /**
-     * 初始化计数器(若不存在则设置初始值为 0)
+     * 初始化计数器
      * 注意:通常无需主动调用,increment 方法会自动处理不存在的键
+     *
      * @param relationId 业务关联 ID
      */
-    public void initCounter(Long relationId) {
+    public void initCounter(Long relationId, int initialValue) {
         String key = getCounterKey(relationId);
         // 仅当键不存在时设置初始值为 0(避免覆盖已有计数)
-        redisTemplate.opsForValue().setIfAbsent(key, "1", DEF_REPORT_TTL, TimeUnit.MILLISECONDS);
+        redisTemplate.opsForValue().setIfAbsent(key, String.valueOf(initialValue), DEF_REPORT_TTL, TimeUnit.MILLISECONDS);
     }
 
     /**
      * 计数器自增 1,并返回自增后的值
+     *
      * @param relationId 业务关联 ID
      * @return 自增后的计数(例如:初始为 0,调用后返回 1)
      */
@@ -51,8 +54,9 @@ public class RelationCounterRedisUtil {
 
     /**
      * 计数器自增指定步长,并返回自增后的值
+     *
      * @param relationId 业务关联 ID
-     * @param step 自增步长(正整数)
+     * @param step       自增步长(正整数)
      * @return 自增后的计数
      */
     public int increment(Long relationId, int step) {
@@ -67,14 +71,25 @@ public class RelationCounterRedisUtil {
 
     /**
      * 获取当前计数
+     *
      * @param relationId 业务关联 ID
      * @return 当前计数(若键不存在,返回 0)
      */
     public Integer getCount(Long relationId) {
         String key = getCounterKey(relationId);
         String value = redisTemplate.opsForValue().get(key);
-        if (value == null) {
-            initCounter(relationId);
+        String className = "";
+        StackTraceElement[] stack = Thread.currentThread().getStackTrace();
+        if (stack.length >= 2) {
+            StackTraceElement caller = stack[2];
+            className = caller.getClassName();
+        }
+        if (value == null && className.contains("Cso")) {
+
+            initCounter(relationId, 0);
+            return 0;
+        } else if (value == null && className.contains("Fxy")) {
+            initCounter(relationId, 1);
             return 1;
         }
 
@@ -83,6 +98,7 @@ public class RelationCounterRedisUtil {
 
     /**
      * 重置计数器为 0
+     *
      * @param relationId 业务关联 ID
      */
     public void reset(Long relationId) {
@@ -92,6 +108,7 @@ public class RelationCounterRedisUtil {
 
     /**
      * 删除计数器(适用于业务结束后清理资源)
+     *
      * @param relationId 业务关联 ID
      * @return 是否删除成功(true:键存在且被删除;false:键不存在)
      */
@@ -102,9 +119,10 @@ public class RelationCounterRedisUtil {
 
     /**
      * 设置计数器过期时间(避免长期占用 Redis 内存)
+     *
      * @param relationId 业务关联 ID
-     * @param timeout 过期时间
-     * @param unit 时间单位
+     * @param timeout    过期时间
+     * @param unit       时间单位
      */
     public void setExpire(Long relationId, long timeout, TimeUnit unit) {
         String key = getCounterKey(relationId);
@@ -113,6 +131,7 @@ public class RelationCounterRedisUtil {
 
     /**
      * 检查计数器是否存在
+     *
      * @param relationId 业务关联 ID
      * @return true:存在;false:不存在
      */

+ 8 - 6
easier-report-biz/src/main/java/com/yaoyicloud/controller/CsoReportController.java

@@ -4,7 +4,7 @@ import java.util.HashMap;
 import java.util.Map;
 import javax.servlet.http.HttpServletRequest;
 import com.yaoyicloud.config.CommonDataCache;
-import com.yaoyicloud.config.ReportPathManager;
+import com.yaoyicloud.config.RelationCounterRedisUtil;
 import com.yaoyicloud.entity.ReportGenerationResult;
 import com.yaoyicloud.service.CsoReportService;
 import org.springframework.validation.annotation.Validated;
@@ -29,8 +29,8 @@ import static com.yaoyicloud.config.SessionInterceptor.SESSION_MAP;
 @Slf4j
 public class CsoReportController {
     private final CsoReportService csoReportService;
-    private final ReportPathManager reportPathManager;
     private final CommonDataCache commonDataCache;
+    private final RelationCounterRedisUtil relationCounterRedisUtil;
     /**
      * 创建Plus版本审核报告
      *
@@ -43,24 +43,26 @@ public class CsoReportController {
                                  HttpServletRequest request) throws Exception {
 
         String relationId = request.getHeader("relationId");
+        Boolean mergeflag = resource.getMergeflag();
         synchronized (this) {
             ReportGenerationResult plusVersionCheckReport = csoReportService.createCsoCheckReport(
                     resource.getData(),
                     Long.valueOf(relationId),
-                    resource.getModuleType()
+                    resource.getModuleType(),
+                    mergeflag
             );
             String sessionId = SESSION_MAP.get(relationId);
 
             // 3. 构建响应
             Map<String, Object> response = new HashMap<>();
             // 根据是否是最后一个模块决定返回哪个路径
-            if (plusVersionCheckReport.isLastModule() && plusVersionCheckReport.getMergedReportPath() != null) {
+            if (mergeflag) {
                 response.put("reportResult", plusVersionCheckReport.getMergedReportPath());
-                response.put("isFinalReport", true);
                 commonDataCache.removeSessionData(relationId);
+                relationCounterRedisUtil.delete(Long.valueOf(relationId));
             } else {
                 response.put("reportResult", plusVersionCheckReport.getModulePath());
-                response.put("isFinalReport", false);
+
             }
 
             response.put("sessionId", sessionId);

+ 107 - 32
easier-report-biz/src/main/java/com/yaoyicloud/factory/BasicAbstractRender.java → easier-report-biz/src/main/java/com/yaoyicloud/factory/AbstractRender.java

@@ -8,8 +8,8 @@ import java.io.InputStream;
 import java.net.URL;
 import java.text.DecimalFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
-
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
@@ -20,8 +20,26 @@ import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
-import cn.hutool.core.lang.Pair;
-import cn.hutool.core.util.StrUtil;
+
+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.IBodyElement;
+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.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.CTTc;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
+import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc;
+
 import com.deepoove.poi.XWPFTemplate;
 import com.deepoove.poi.config.Configure;
 import com.deepoove.poi.config.ConfigureBuilder;
@@ -44,33 +62,19 @@ import com.deepoove.poi.xwpf.BodyContainerFactory;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.yaoyicloud.tools.DesensitizedUtils;
 import com.yaoyicloud.tools.Util;
-import lombok.extern.slf4j.Slf4j;
-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.IBodyElement;
-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.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.CTTc;
-import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
-import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc;
 
-import javax.imageio.ImageIO;
+import cn.hutool.core.lang.Pair;
+import cn.hutool.core.util.StrUtil;
+import lombok.extern.slf4j.Slf4j;
 
 /**
- * 抽象文档渲染器基类,提供DOCX模板渲染、格式处理及转换PDF的核心功能 主要功能: 1. 基于POI-TL的DOCX模板渲染 2. 文档格式处理(表格合并、空行清理等) 3. DOCX转HTML/PDF转换流水线 4. 多种表格渲染策略实现 设计特点: -
+ * 抽象文档渲染器基类,提供DOCX模板渲染、格式处理及转换PDF的核心功能 主要功能: 1. 基于POI-TL的DOCX模板渲染 2. 文档格式处理(表格合并、空行清理等) 3. DOCX转HTML/PDF转换流水线 4. 多种表格渲染策略实现 设计特点: -
  * 采用模板方法模式,子类需实现getBasicPath()等抽象方法 - 内置多种表格渲染策略(循环行、合并单元格、统计计算等) - 支持图片、超链接等复杂元素渲染 - 提供数据脱敏处理能力
  */
 @Slf4j
-public abstract class BasicAbstractRender implements DocxRenderer {
+public abstract class AbstractRender {
 
     /*
     * 导出文件位置
@@ -92,10 +96,12 @@ public abstract class BasicAbstractRender implements DocxRenderer {
      */
     protected String pdfResultPath;
 
-    public BasicAbstractRender(String cwd) {
+    public AbstractRender(String cwd) {
         this.cwd = cwd;
     }
 
+
+
     /**
      * DOCX文档渲染核心方法 处理流程: 1. 创建输出目录 2. 编译模板并渲染数据 3. 保存渲染结果
      *
@@ -106,7 +112,7 @@ public abstract class BasicAbstractRender implements DocxRenderer {
      * @param moduleType 模块类型(用于生成文件名)
      * @return 生成的DOCX文件路径
      */
-    public String renderDocx(Map<String, Object> dataMap, InputStream inputStream,
+    public String documentCompile(Map<String, Object> dataMap, InputStream inputStream,
         ConfigureBuilder builder, String relationId, String moduleType)
         throws IOException {
 
@@ -170,20 +176,90 @@ public abstract class BasicAbstractRender implements DocxRenderer {
         return this.pdfResultPath;
     }
 
+    /**
+     * Docx 渲染
+     *
+     * @param info 数据
+     * @param relationId 关联ID
+     * @return 当前章节数据map
+     * @throws IOException
+     */
+    protected abstract Map<String, Object> renderDocx(String info, String relationId, Integer counter)throws IOException;
+
     /**
      * 获取基础路径
-     * 
+     *
      * @return 文件存储基础路径
      */
     protected abstract String getBasicPath() throws IOException;
 
     /**
      * 获取报告图片路径(需子类实现)
-     * 
+     *
      * @return 图片存储路径
      */
     protected abstract String getReportImagePath();
 
+    Map<String, Object> sensitiveData(Map<String, Object> data, Boolean sensitiveFlag) {
+        if (!sensitiveFlag) {
+            return data;
+        }
+        // 第四章信息脱敏处理要处理的数据
+        Set<String> listSet = new HashSet<>(Arrays.asList("customer_visit_list", "meeting_list",
+            "task_type_51_52_53_list", "task_type_55_list", "task_type_56_57_list",
+            "task_type8_11_list", "task_type_9_10_list", "policy_info_collect_list",
+            "competing_products_info_collect_list", "inventory_info_collect_list",
+            "task_type_16_list", "task_type_18_list", "task_type_15_list", "task_type45_list", "task_type74_list",
+            "task_type_75_list", "user_tasks", "task_type_54_list",
+            "task_type_76_list", "task_type_78_79_list", "task_type_80_list", "task_type_81_list", "task_type801_list",
+            "task_type38_list", "task_type39_40_41_list",
+            "task_type42_43_44_list", "task_type46_list", "task_type47_48_49_50_list", "task_type_19_list",
+            "task_type_34_35_36_list", "tasks", "task_type_85_list",
+            "task_type_86_list", "task_type_87_list"));
+        for (Map.Entry<String, Object> entry : data.entrySet()) {
+            // 敏感数据处理
+            String key = entry.getKey();
+            // 处理C端数据封面姓名脱敏
+            if ("task_users".equals(key)) {
+                Object o = data.get("task_users");
+                String userName = DesensitizedUtils.chineseName((String) o);
+                data.put("task_users", userName);
+                continue;
+            }
+            // 处理第五章的数据脱敏
+            if (key.equals("task_promotioner_quality_5_4_1")) {
+                Object o = data.get("task_promotioner_quality_5_4_1");
+                List<Map<String, Object>> taskPromotionalQuality = (List<Map<String, Object>>) o;
+                for (Map<String, Object> sensitiveObject : taskPromotionalQuality) {
+                    if (!sensitiveObject.containsKey("promotioner")) {
+                        continue;
+                    }
+                    Object object = sensitiveObject.get("promotioner");
+                    String sensitiveName = DesensitizedUtils.chineseName((String) object);
+                    sensitiveObject.put("promotioner", sensitiveName);
+                }
+            }
+            // 处理第四章的数据脱敏
+            if (!listSet.contains(key)) {
+                continue;
+            }
+            Object tempKey = data.get(key);
+            List<Map<String, Object>> temp = (List<Map<String, Object>>) tempKey;
+            for (Map<String, Object> sensitiveObject : temp) {
+                if (!sensitiveObject.containsKey("user_name")) {
+                    continue;
+                }
+                Object o = sensitiveObject.get("user_name");
+                if ("合计".equals(o)) {
+                    continue;
+                }
+                String userName = DesensitizedUtils.chineseName((String) o);
+                sensitiveObject.put("user_name", userName);
+            }
+        }
+        return data;
+    }
+
     /**
      * 列循环静态表格渲染策略(fxy 重要财务数据处理)
      *
@@ -576,7 +652,7 @@ public abstract class BasicAbstractRender implements DocxRenderer {
             @Override
             public void render(ElementTemplate eleTemplate, Object data, XWPFTemplate template) {
                 // 获取模板中的变量如:[name]
-                ArrayList<String> strings = processElement(eleTemplate, data);
+                ArrayList<String> strings = processElement(eleTemplate);
                 List<Map<String, Object>> processedData = null;
                 if (null != data && data instanceof Iterable) {
                     processedData = (List<Map<String, Object>>) data;
@@ -597,7 +673,7 @@ public abstract class BasicAbstractRender implements DocxRenderer {
     }
 
     @SuppressWarnings("checkstyle:NestedForDepth")
-    private ArrayList<String> processElement(ElementTemplate eleTemplate, Object data) {
+    private ArrayList<String> processElement(ElementTemplate eleTemplate) {
         RunTemplate runTemplate = (RunTemplate) eleTemplate;
         XWPFRun run = runTemplate.getRun();
         XWPFTableCell tagCell = (XWPFTableCell) ((XWPFParagraph) run.getParent()).getBody();
@@ -727,7 +803,7 @@ public abstract class BasicAbstractRender implements DocxRenderer {
                             style.setWidth(targetSize.getKey());
                             style.setHeight(targetSize.getValue());
                             picData.setPictureStyle(style);
-                            PictureRenderPolicy.Helper.renderPicture(run, picData);
+                            Helper.renderPicture(run, picData);
                         }
                     } catch (Exception e) {
                         throw new RenderException(
@@ -1185,8 +1261,7 @@ public abstract class BasicAbstractRender implements DocxRenderer {
             }
 
             /**
-             * 格式化单元格文本
-             * 特殊处理: 1. Double类型保留2位小数 2. 百分比列自动添加%符号 3. Set类型显示元素数量
+             * 格式化单元格文本 特殊处理: 1. Double类型保留2位小数 2. 百分比列自动添加%符号 3. Set类型显示元素数量
              */
             @SuppressWarnings("unchecked")
             private String getText(XWPFTable table, int j, Object value) {

+ 139 - 83
easier-report-biz/src/main/java/com/yaoyicloud/factory/CSOAbstractRender.java

@@ -4,12 +4,21 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Files;
 import java.util.List;
 import java.util.Map;
+
+import com.amazonaws.services.s3.model.S3Object;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.deepoove.poi.data.DocxRenderData;
+import com.deepoove.poi.policy.DynamicTableRenderPolicy;
 import com.deepoove.poi.xwpf.NiceXWPFDocument;
+import com.yaoyicloud.easier.common.file.core.FileProperties;
+import com.yaoyicloud.easier.common.file.core.FileTemplate;
 import org.apache.poi.xwpf.usermodel.BodyElementType;
 import org.apache.poi.xwpf.usermodel.IBodyElement;
 import org.apache.poi.xwpf.usermodel.XWPFParagraph;
@@ -23,109 +32,156 @@ import org.w3c.dom.Node;
  * 抽象渲染器
  *
  */
-public abstract class CSOAbstractRender extends BasicAbstractRender {
+
+public abstract class CSOAbstractRender extends AbstractRender {
+    private final FileTemplate ossTemplate;
+    private final FileProperties properties;
 
     /*
      * 子模版路径
      */
-    private String subTemplatePath = "D:\\excel\\subtemplate.docx";
+    private String subTemplatePath;
 
-    public CSOAbstractRender(String cwd) {
+    public CSOAbstractRender(String cwd, FileTemplate ossTemplate, FileProperties properties) {
         super(cwd);
+        this.ossTemplate = ossTemplate;
+        this.properties = properties;
     }
 
-    /**
-     * Docx 渲染
-     *
-     * 
-     * @param inputStream 模板内容
-     * @return 本地文件目录
-     * @throws IOException
-     */
-    @SuppressWarnings("checkstyle:ParameterNumber")
-    public String renderDocx(Map<String, Object> dataMap, InputStream inputStream,
+    public final String createCSODocument(String info, InputStream inputStream, String relationId, Integer counter,
+        String moduleType) throws IOException {
+        // 获取数据
+        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);
+        return this.csoCompile(sensitiveMap, inputStream, builder, relationId, moduleType);
+    }
+
+    @SuppressWarnings({"checkstyle:ParameterNumber", "checkstyle:NestedIfDepth"})
+    public String csoCompile(Map<String, Object> dataMap, InputStream inputStream,
         ConfigureBuilder builder, String relationId, String moduleType)
         throws IOException {
-        String resultPath = super.renderDocx(dataMap, inputStream, builder, relationId, moduleType);
-        Configure config = builder.build();
-        // 处理嵌套模板逻辑
-        if (moduleType.equals("PromotionDetails")) {
-            XWPFTemplate subTemplate = XWPFTemplate.compile(subTemplatePath, config).render(dataMap);
-            ByteArrayOutputStream nestOutput = new ByteArrayOutputStream();
-            subTemplate.write(nestOutput);
-            ByteArrayInputStream nestInput = new ByteArrayInputStream(nestOutput.toByteArray());
-            DocxRenderData docxRenderData = new DocxRenderData(nestInput);
-            dataMap.put("nestfile", docxRenderData);
-        }
 
-        NiceXWPFDocument xwpfDocument = new NiceXWPFDocument(new FileInputStream(new File(resultPath)));
-        List<XWPFTable> allTables = xwpfDocument.getAllTables();
-
-        int toDeleteLine = 0;
-        // 删除多余的表格
-        for (int i = 0; i < allTables.size(); i++) {
-            XWPFTable xwpfTable = allTables.get(i);
-            if (allTables.get(i).getRows().size() <= 1) {
-                Node domNode = xwpfTable.getCTTbl().getDomNode();
-                Node parentNode = domNode.getParentNode();
-                parentNode.removeChild(domNode);
-                toDeleteLine++;
+        if (moduleType.equals("CSO_PROMOTION_DETAILS") || moduleType.equals("CSO_ATTACHMENT_XINHUA")) {
+            Configure config = builder.build();
+            XWPFTemplate subTemplate = null;
+            try {
+                if (StringUtils.isEmpty(subTemplatePath)) {
+                    // 调用getSubTemplatePath()触发初始化
+                    subTemplatePath = getSubTemplatePath();
+                }
+                subTemplate = XWPFTemplate.compile(subTemplatePath, config).render(dataMap);
+                try (ByteArrayOutputStream nestOutput = new ByteArrayOutputStream()) {
+                    subTemplate.write(nestOutput);
+                    try (ByteArrayInputStream nestInput = new ByteArrayInputStream(nestOutput.toByteArray())) {
+                        DocxRenderData docxRenderData = new DocxRenderData(nestInput);
+                        dataMap.put("nestfile", docxRenderData);
+                    }
+                }
+            } finally {
+                if (subTemplate != null) {
+                    subTemplate.close();
+                }
             }
         }
+        String sourcePath = super.documentCompile(dataMap, inputStream, builder, relationId, moduleType);
+        File sourceFile = new File(sourcePath);
+        try (NiceXWPFDocument xwpfDocument = new NiceXWPFDocument(new FileInputStream(sourceFile))) {
+            // 3.1 删除空表格
+            List<XWPFTable> allTables = xwpfDocument.getAllTables();
+            for (XWPFTable table : allTables) {
+                if (table.getRows().size() <= 1) {
+                    Node domNode = table.getCTTbl().getDomNode();
+                    Node parentNode = domNode.getParentNode();
+                    parentNode.removeChild(domNode);
+                }
+            }
 
-        // 删除空标题行
-        for (int i = xwpfDocument.getXWPFDocument().getBodyElements().size() - 1; i >= 0; i--) {
-            IBodyElement ele = xwpfDocument.getXWPFDocument().getBodyElements().get(i);
-            if (ele.getElementType().equals(BodyElementType.PARAGRAPH)) {
-                XWPFParagraph paragraph = (XWPFParagraph) ele;
-                if (paragraph.getText().contains("EMPTY")) {
-                    xwpfDocument.removeBodyElement(i);
-                    if (i - 1 < 0) {
-                        continue;
-                    }
-                    IBodyElement above = xwpfDocument.getXWPFDocument().getBodyElements().get(i - 1);
-                    if (!ele.getElementType().equals(BodyElementType.PARAGRAPH)) {
-                        continue;
-                    }
-                    XWPFParagraph paragraphAbove = (XWPFParagraph) above;
-                    if (paragraphAbove.getText().equals("")) {
-                        xwpfDocument.removeBodyElement(i - 1);
-                        i--;
+            // 3.2 删除空标题行
+            List<IBodyElement> bodyElements = xwpfDocument.getXWPFDocument().getBodyElements();
+            for (int i = bodyElements.size() - 1; i >= 0; i--) {
+                IBodyElement ele = bodyElements.get(i);
+                if (ele.getElementType() == BodyElementType.PARAGRAPH) {
+                    XWPFParagraph paragraph = (XWPFParagraph) ele;
+                    if (paragraph.getText().contains("EMPTY")) {
+                        xwpfDocument.removeBodyElement(i);
+                        if (i - 1 >= 0) {
+                            IBodyElement aboveEle = bodyElements.get(i - 1);
+                            if (aboveEle.getElementType() == BodyElementType.PARAGRAPH) {
+                                XWPFParagraph abovePara = (XWPFParagraph) aboveEle;
+                                if (abovePara.getText().trim().isEmpty()) {
+                                    xwpfDocument.removeBodyElement(i - 1);
+                                }
+                            }
+                        }
                     }
                 }
             }
+
+            try (FileOutputStream fos = new FileOutputStream(sourceFile)) {
+                xwpfDocument.write(fos); // 覆盖写入原文件
+            }
+            this.docxResultPath = sourcePath;
         }
-        // ArrayList<String> templateDele = new ArrayList<>();
-        // for (Map.Entry<String, Object> entry : specialMap.entrySet()) {
-        // String key = entry.getKey();
-        // Object value = entry.getValue();
-        // if (value.equals("")) {
-        // templateDele.add(key);
-        // }
-        // }
-        // Map<String, String> keywordMap = new HashMap<>();
-        // keywordMap.put("suggestion", "建议");
-        // keywordMap.put("score", "分");
-        // keywordMap.put("riskSummary", "-");
-        // XWPFDocument doc = template.getXWPFDocument();
-        // List<XWPFTable> tables = doc.getTables();
-        // XWPFTable xwpfTable = tables.get(tables.size() - 1);
-        // for (int i = xwpfTable.getNumberOfRows() - 1; i >= 0; i--) {
-        // XWPFTableRow row = xwpfTable.getRow(i);
-        // StringBuilder rowText = new StringBuilder();
-        // for (XWPFTableCell cell : row.getTableCells()) {
-        // rowText.append(cell.getText());
-        // }
-        // for (String codeKeyword : templateDele) {
-        // String templateKeyword = keywordMap.get(codeKeyword);
-        // if (rowText.toString().contains(templateKeyword)) {
-        // xwpfTable.removeRow(i);
-        // break;
-        // }
-        // }
-        // }
 
         return this.docxResultPath;
     }
 
+    protected DynamicTableRenderPolicy getDynamicTableRenderPolicy(Map<String, Object> data) {
+        boolean sensitiveFlag = (Boolean) data.get("sensitiveFlag");
+        Map<Integer, String> userNameMap = (Map<Integer, String>) data.get("userNameMap");
+        return tableDynamicPolicy(sensitiveFlag, userNameMap);
+    }
+
+    protected String getSubTemplatePath() {
+        // 如果已经获取过模板路径,直接返回缓存的路径
+        if (subTemplatePath != null && new File(subTemplatePath).exists()) {
+            return subTemplatePath;
+        }
+
+        InputStream inputStream = null;
+        OutputStream outputStream = null;
+
+        try {
+            // 从OSS获取对象
+            S3Object s3Object = ossTemplate.getObject(properties.getBucketName(), "subtemplate.docx");
+            inputStream = s3Object.getObjectContent();
+
+            // 创建临时文件
+            File tempFile = Files.createTempFile("subtemplate-", ".docx").toFile();
+            // 标记临时文件在JVM退出时删除
+            tempFile.deleteOnExit();
+
+            // 将OSS文件内容写入临时文件
+            outputStream = new FileOutputStream(tempFile);
+            byte[] buffer = new byte[1024];
+            int bytesRead;
+            while ((bytesRead = inputStream.read(buffer)) != -1) {
+                outputStream.write(buffer, 0, bytesRead);
+            }
+
+            // 保存临时文件路径
+            subTemplatePath = tempFile.getAbsolutePath();
+            return subTemplatePath;
+
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        } finally {
+            if (inputStream != null) {
+                try {
+                    inputStream.close();
+                } catch (IOException e) {
+                }
+            }
+            if (outputStream != null) {
+                try {
+                    outputStream.close();
+                } catch (IOException e) {
+                }
+            }
+        }
+    }
+
+    protected abstract ConfigureBuilder builder(Map<String, Object> data);
 }

+ 0 - 13
easier-report-biz/src/main/java/com/yaoyicloud/factory/DocxRenderer.java

@@ -1,13 +0,0 @@
-package com.yaoyicloud.factory;
-
-import com.deepoove.poi.config.ConfigureBuilder;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Map;
-
-public interface DocxRenderer {
-    String renderDocx(Map<String, Object> dataMap, InputStream inputStream,
-                      ConfigureBuilder builder, String relationId, String moduleType)
-                     throws IOException;
-}

+ 72 - 0
easier-report-biz/src/main/java/com/yaoyicloud/factory/FXYAbstractRender.java

@@ -0,0 +1,72 @@
+package com.yaoyicloud.factory;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+import com.deepoove.poi.config.ConfigureBuilder;
+import lombok.extern.slf4j.Slf4j;
+
+
+
+@Slf4j
+public abstract class FXYAbstractRender extends AbstractRender  {
+
+
+    public FXYAbstractRender(String cwd) {
+        super(cwd);
+    }
+
+    @SuppressWarnings("checkstyle:ParameterNumber")
+    public final String createFXYDocument(String info, InputStream inputStream, String relationId, Integer counter,
+         String moduleType)
+        throws IOException {
+        // 获取数据
+        Map<String, Object> originalMap = this.renderDocx(info, relationId, counter);
+        ConfigureBuilder builder = this.builder();
+        return this.documentCompile(originalMap, inputStream, builder, relationId, moduleType);
+    }
+
+    @SuppressWarnings("checkstyle:ParameterNumber")
+    public String fxyCompile(Map<String, Object> dataMap, InputStream inputStream,
+                             ConfigureBuilder builder, String relationId, String moduleType)
+            throws IOException {
+        String resultPath = super.documentCompile(dataMap, inputStream, builder, relationId, moduleType);
+
+        // ArrayList<String> templateDele = new ArrayList<>();
+        // for (Map.Entry<String, Object> entry : specialMap.entrySet()) {
+        // String key = entry.getKey();
+        // Object value = entry.getValue();
+        // if (value.equals("")) {
+        // templateDele.add(key);
+        // }
+        // }
+        // Map<String, String> keywordMap = new HashMap<>();
+        // keywordMap.put("suggestion", "建议");
+        // keywordMap.put("score", "分");
+        // keywordMap.put("riskSummary", "-");
+        // XWPFDocument doc = template.getXWPFDocument();
+        // List<XWPFTable> tables = doc.getTables();
+        // XWPFTable xwpfTable = tables.get(tables.size() - 1);
+        // for (int i = xwpfTable.getNumberOfRows() - 1; i >= 0; i--) {
+        // XWPFTableRow row = xwpfTable.getRow(i);
+        // StringBuilder rowText = new StringBuilder();
+        // for (XWPFTableCell cell : row.getTableCells()) {
+        // rowText.append(cell.getText());
+        // }
+        // for (String codeKeyword : templateDele) {
+        // String templateKeyword = keywordMap.get(codeKeyword);
+        // if (rowText.toString().contains(templateKeyword)) {
+        // xwpfTable.removeRow(i);
+        // break;
+        // }
+        // }
+        // }
+
+        return this.docxResultPath;
+    }
+
+
+    protected abstract ConfigureBuilder builder();
+
+
+}

+ 86 - 86
easier-report-biz/src/main/java/com/yaoyicloud/render/InterestConflictsRender.java

@@ -1,86 +1,86 @@
-package com.yaoyicloud.render;
-
-import java.io.IOException;
-
-import java.io.InputStream;
-import java.util.List;
-import java.util.Map;
-
-import com.deepoove.poi.config.Configure;
-import com.deepoove.poi.config.ConfigureBuilder;
-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.BasicAbstractRender;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.MapUtils;
-
-@Slf4j
-public final class InterestConflictsRender extends BasicAbstractRender {
-    private final FilerepoProperties filerepoProperties;
-    private final CommonDataCache commonDataCache;
-
-    public InterestConflictsRender(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();
-    }
-
-    /**
-     * Docx 渲染
-     *
-     * @param info 数据
-     * @param inputStream 模板内容
-     * @return 本地文件目录
-     * @throws IOException
-     */
-    public String renderDocx(String info, InputStream inputStream,
-                             String relationId) throws IOException {
-        log.info("开始渲染利益冲突报告模块,relationId: {}", relationId);
-
-        // 配置POI-TL渲染器
-        ConfigureBuilder builder = Configure.builder();
-        builder.addPlugin('^', this.pictureRenderPolicy());
-
-        ObjectMapper objectMapper = new ObjectMapper();
-        Map<String, Object> data = objectMapper.readValue(info, new TypeReference<Map<String, Object>>() {});
-
-        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
-        if (MapUtils.isNotEmpty(commonDataCacheData)) {
-            data.putAll(commonDataCacheData);
-        }
-        fillDefaultValues(data);
-        try {
-            // 渲染文档
-            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "interestConflicts");
-            log.info("渲染利益冲突报告模块成功,文件路径: {}", resultPath);
-            return resultPath;
-        } catch (Exception e) {
-            log.error("渲染利益冲突报告模块失败,relationId: {}", relationId, e);
-            throw new IOException("文档渲染失败", e);
-        }
-    }
-
-    /**
-     * 填充默认值,确保所有必要字段都存在
-     */
-    private void fillDefaultValues(Map<String, Object> data) {
-        List<Map<String, Object>> items = (List<Map<String, Object>>) data.get("interestConflicts");
-        if (CollectionUtils.isEmpty(items)) {
-            data.put("interestConflictsAltText", "未上传");
-        }
-
-    }
-}
+//package com.yaoyicloud.render;
+//
+//import java.io.IOException;
+//
+//import java.io.InputStream;
+//import java.util.List;
+//import java.util.Map;
+//
+//import com.deepoove.poi.config.Configure;
+//import com.deepoove.poi.config.ConfigureBuilder;
+//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 InterestConflictsRender extends FXYAbstractRender {
+//    private final FilerepoProperties filerepoProperties;
+//    private final CommonDataCache commonDataCache;
+//
+//    public InterestConflictsRender(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();
+//    }
+//
+//    /**
+//     * Docx 渲染
+//     *
+//     * @param info 数据
+//     * @param inputStream 模板内容
+//     * @return 本地文件目录
+//     * @throws IOException
+//     */
+//    public String renderDocx(String info, InputStream inputStream,
+//                             String relationId) throws IOException {
+//        log.info("开始渲染利益冲突报告模块,relationId: {}", relationId);
+//
+//        // 配置POI-TL渲染器
+//        ConfigureBuilder builder = Configure.builder();
+//        builder.addPlugin('^', this.pictureRenderPolicy());
+//
+//        ObjectMapper objectMapper = new ObjectMapper();
+//        Map<String, Object> data = objectMapper.readValue(info, new TypeReference<Map<String, Object>>() {});
+//
+//        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
+//        if (MapUtils.isNotEmpty(commonDataCacheData)) {
+//            data.putAll(commonDataCacheData);
+//        }
+//        fillDefaultValues(data);
+//        try {
+//            // 渲染文档
+//            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "interestConflicts");
+//            log.info("渲染利益冲突报告模块成功,文件路径: {}", resultPath);
+//            return resultPath;
+//        } catch (Exception e) {
+//            log.error("渲染利益冲突报告模块失败,relationId: {}", relationId, e);
+//            throw new IOException("文档渲染失败", e);
+//        }
+//    }
+//
+//    /**
+//     * 填充默认值,确保所有必要字段都存在
+//     */
+//    private void fillDefaultValues(Map<String, Object> data) {
+//        List<Map<String, Object>> items = (List<Map<String, Object>>) data.get("interestConflicts");
+//        if (CollectionUtils.isEmpty(items)) {
+//            data.put("interestConflictsAltText", "未上传");
+//        }
+//
+//    }
+//}

+ 115 - 115
easier-report-biz/src/main/java/com/yaoyicloud/render/ProjectInfoRender.java

@@ -1,115 +1,115 @@
-package com.yaoyicloud.render;
-
-import java.io.IOException;
-import java.io.InputStream;
-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.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.protobuf.Descriptors;
-
-import com.google.protobuf.util.JsonFormat;
-import com.yaoyicloud.config.CommonDataCache;
-import com.yaoyicloud.config.FilerepoProperties;
-
-import com.yaoyicloud.factory.BasicAbstractRender;
-import com.yaoyicloud.message.FxyProtos;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.collections4.MapUtils;
-
-/**
- * BasicInfo渲染器
- *
- */
-@Slf4j
-public final class ProjectInfoRender extends BasicAbstractRender {
-    private final FilerepoProperties filerepoProperties;
-    private final CommonDataCache commonDataCache;
-
-    public ProjectInfoRender(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();
-    }
-
-    /**
-     * Docx 渲染
-     *
-     * @param info 数据
-     * @param inputStream 模板内容
-     * @return 本地文件目录
-     * @throws IOException
-     */
-    public String renderDocx(String info, InputStream inputStream,
-        String relationId) throws IOException {
-        log.info("开始渲染项目信息报告模块,relationId: {}", relationId);
-
-        // 配置POI-TL渲染器
-        ConfigureBuilder builder = Configure.builder();
-        builder.addPlugin('^', this.pictureRenderPolicy());
-        // 通过默认protobuf实例来填充不存在的key
-        FxyProtos.ProjectInfo.Builder basicInfoBuilder = FxyProtos.ProjectInfo.newBuilder();
-        JsonFormat.parser().merge(info, basicInfoBuilder);
-        FxyProtos.ProjectInfo defaultInstance = FxyProtos.ProjectInfo.getDefaultInstance();
-        FxyProtos.ProjectInfo mergedProto = defaultInstance.toBuilder()
-            .mergeFrom(basicInfoBuilder.build())
-            .build();
-        Map<String, Object> newAddtionMap = new HashMap<>();
-        Descriptors.Descriptor descriptor = mergedProto.getDescriptorForType();
-        for (Descriptors.FieldDescriptor field : descriptor.getFields()) {
-            if (field.isRepeated()) {
-                List<?> li = (List<?>) mergedProto.getField(field);
-                if (li.size() == 0) {
-                    newAddtionMap.put(field.getName() + "AltText", "未上传");
-                }
-            }
-        }
-        String completeJson = JsonFormat.printer().includingDefaultValueFields().print(mergedProto);
-
-        ObjectMapper objectMapper = new ObjectMapper();
-        Map<String, Object> data = objectMapper.readValue(completeJson, new TypeReference<Map<String, Object>>() {});
-        if (newAddtionMap != null) {
-            data.putAll(newAddtionMap);
-        }
-        data.replaceAll((k, v) -> v.equals("") ? "-" : v);
-        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
-        if (MapUtils.isNotEmpty(commonDataCacheData)) {
-            data.putAll(commonDataCacheData);
-        }
-        fillDefaultValues(data);
-        try {
-            // 渲染文档
-            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "projectInfo");
-            log.info("渲染项目信息报告模块成功,文件路径: {}", resultPath);
-            return resultPath;
-        } catch (Exception e) {
-            log.error("渲染项目信息报告模块失败,relationId: {}", relationId, e);
-            throw new IOException("文档渲染失败", e);
-        }
-    }
-
-    /**
-     * 填充默认值,确保所有必要字段都存在
-     */
-    private void fillDefaultValues(Map<String, Object> data) {
-        Map<String, Object> basicInfoSummary = (Map<String, Object>) data.get("projectInfoSummary");
-        basicInfoSummary.replaceAll((k, v) -> v.equals("") ? "-" : v);
-
-    }
-
-}
+//package com.yaoyicloud.render;
+//
+//import java.io.IOException;
+//import java.io.InputStream;
+//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.fasterxml.jackson.core.type.TypeReference;
+//import com.fasterxml.jackson.databind.ObjectMapper;
+//import com.google.protobuf.Descriptors;
+//
+//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;
+//
+///**
+// * BasicInfo渲染器
+// *
+// */
+//@Slf4j
+//public final class ProjectInfoRender extends FXYAbstractRender {
+//    private final FilerepoProperties filerepoProperties;
+//    private final CommonDataCache commonDataCache;
+//
+//    public ProjectInfoRender(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();
+//    }
+//
+//    /**
+//     * Docx 渲染
+//     *
+//     * @param info 数据
+//     * @param inputStream 模板内容
+//     * @return 本地文件目录
+//     * @throws IOException
+//     */
+//    public String renderDocx(String info, InputStream inputStream,
+//        String relationId) throws IOException {
+//        log.info("开始渲染项目信息报告模块,relationId: {}", relationId);
+//
+//        // 配置POI-TL渲染器
+//        ConfigureBuilder builder = Configure.builder();
+//        builder.addPlugin('^', this.pictureRenderPolicy());
+//        // 通过默认protobuf实例来填充不存在的key
+//        FxyProtos.ProjectInfo.Builder basicInfoBuilder = FxyProtos.ProjectInfo.newBuilder();
+//        JsonFormat.parser().merge(info, basicInfoBuilder);
+//        FxyProtos.ProjectInfo defaultInstance = FxyProtos.ProjectInfo.getDefaultInstance();
+//        FxyProtos.ProjectInfo mergedProto = defaultInstance.toBuilder()
+//            .mergeFrom(basicInfoBuilder.build())
+//            .build();
+//        Map<String, Object> newAddtionMap = new HashMap<>();
+//        Descriptors.Descriptor descriptor = mergedProto.getDescriptorForType();
+//        for (Descriptors.FieldDescriptor field : descriptor.getFields()) {
+//            if (field.isRepeated()) {
+//                List<?> li = (List<?>) mergedProto.getField(field);
+//                if (li.size() == 0) {
+//                    newAddtionMap.put(field.getName() + "AltText", "未上传");
+//                }
+//            }
+//        }
+//        String completeJson = JsonFormat.printer().includingDefaultValueFields().print(mergedProto);
+//
+//        ObjectMapper objectMapper = new ObjectMapper();
+//        Map<String, Object> data = objectMapper.readValue(completeJson, new TypeReference<Map<String, Object>>() {});
+//        if (newAddtionMap != null) {
+//            data.putAll(newAddtionMap);
+//        }
+//        data.replaceAll((k, v) -> v.equals("") ? "-" : v);
+//        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
+//        if (MapUtils.isNotEmpty(commonDataCacheData)) {
+//            data.putAll(commonDataCacheData);
+//        }
+//        fillDefaultValues(data);
+//        try {
+//            // 渲染文档
+//            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "projectInfo");
+//            log.info("渲染项目信息报告模块成功,文件路径: {}", resultPath);
+//            return resultPath;
+//        } catch (Exception e) {
+//            log.error("渲染项目信息报告模块失败,relationId: {}", relationId, e);
+//            throw new IOException("文档渲染失败", e);
+//        }
+//    }
+//
+//    /**
+//     * 填充默认值,确保所有必要字段都存在
+//     */
+//    private void fillDefaultValues(Map<String, Object> data) {
+//        Map<String, Object> basicInfoSummary = (Map<String, Object>) data.get("projectInfoSummary");
+//        basicInfoSummary.replaceAll((k, v) -> v.equals("") ? "-" : v);
+//
+//    }
+//
+//}

+ 217 - 217
easier-report-biz/src/main/java/com/yaoyicloud/render/PublicRecordRender.java

@@ -1,217 +1,217 @@
-package com.yaoyicloud.render;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-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.google.protobuf.util.JsonFormat;
-import com.yaoyicloud.config.CommonDataCache;
-import com.yaoyicloud.config.FilerepoProperties;
-
-import com.yaoyicloud.factory.BasicAbstractRender;
-import com.yaoyicloud.message.FxyProtos;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.MapUtils;
-
-/**
- * PublicRecord渲染器
- *
- */
-@Slf4j
-public final class PublicRecordRender extends BasicAbstractRender {
-    private final FilerepoProperties filerepoProperties;
-private final CommonDataCache commonDataCache;
-    public PublicRecordRender(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();
-    }
-
-    /**
-     * Docx 渲染
-     *
-     * @param info 数据
-     * @param inputStream 模板内容
-     * @return 本地文件目录
-     * @throws IOException
-     */
-
-    public String renderDocx(String info, InputStream inputStream,
-        String relationId) throws IOException {
-        log.info("开始渲染公共模块,relationId: {}", relationId);
-
-        // 配置POI-TL渲染器
-        ConfigureBuilder builder = Configure.builder();
-        RenderPolicy indicatorsRenderPolicy = this.indicatorsRenderPolicy();
-
-        builder.bind("dishonestPersons", indicatorsRenderPolicy);
-        builder.bind("businessAbnormals", indicatorsRenderPolicy);
-        builder.bind("penaltyRecords", indicatorsRenderPolicy);
-        builder.bind("taxPenalties", indicatorsRenderPolicy);
-        builder.bind("severeViolations", indicatorsRenderPolicy);
-
-        FxyProtos.PublicRecord.Builder basicInfoBuilder = FxyProtos.PublicRecord.newBuilder();
-        JsonFormat.parser().merge(info, basicInfoBuilder);
-        FxyProtos.PublicRecord defaultInstance = FxyProtos.PublicRecord.getDefaultInstance();
-        FxyProtos.PublicRecord 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>>() {});
-        data.replaceAll((k, v) -> v.equals("") ? "-" : v);
-
-        fillBasicDefaultValues(data);
-        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
-        if (MapUtils.isNotEmpty(commonDataCacheData)) {
-            data.putAll(commonDataCacheData);
-        }
-
-        try {
-            // 渲染文档
-            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "publicRecord");
-            log.info("渲染公共模块成功,文件路径: {}", resultPath);
-            return resultPath;
-        } catch (Exception e) {
-            log.error("渲染公共模块失败,relationId: {}", relationId, e);
-            throw new IOException("文档渲染失败", e);
-        }
-    }
-
-    /**
-     * 填充默认值,确保所有必要字段都存在
-     */
-    private void fillBasicDefaultValues(Map<String, Object> data) {
-        Map<String, Object> basicInfoSummary = (Map<String, Object>) data.get("publicRecordSummary");
-        basicInfoSummary.replaceAll((k, v) -> v.equals("") ? "-" : v);
-
-        // 处理失信人数据
-        ArrayList<Map<String, Object>> dishonestPersons = (ArrayList<Map<String, Object>>) data.get("dishonestPersons");
-        if (CollectionUtils.isNotEmpty(dishonestPersons)) {
-            dishonestPersons.forEach(person -> {
-                person.replaceAll((k, v) -> v.equals("") ? "-" : v);
-            });
-            data.put("dishonestPersonsCount", dishonestPersons.size());
-        } else {
-            Map<String, Object> defaultDishonestPerson = new HashMap<>();
-            defaultDishonestPerson.put("id", "1");
-            defaultDishonestPerson.put("inDate", "-");
-            defaultDishonestPerson.put("caseNumber", "-");
-            defaultDishonestPerson.put("amount", "-");
-            defaultDishonestPerson.put("executionDesc", "-");
-            defaultDishonestPerson.put("executionStatus", "-");
-            defaultDishonestPerson.put("court", "-");
-            defaultDishonestPerson.put("disabled", "-");
-            List<Map<String, Object>> defaultDishonestPersonList = Collections.singletonList(defaultDishonestPerson);
-            data.put("dishonestPersons", defaultDishonestPersonList);
-            data.put("dishonestPersonsCount", 0);
-        }
-
-        // 处理经营异常数据
-        ArrayList<Map<String, Object>> businessAbnormals =
-            (ArrayList<Map<String, Object>>) data.get("businessAbnormals");
-        if (CollectionUtils.isNotEmpty(businessAbnormals)) {
-            businessAbnormals.forEach(item -> {
-                item.replaceAll((k, v) -> v.equals("") ? "-" : v);
-            });
-            data.put("businessAbnormalsCount", businessAbnormals.size());
-        } else {
-            Map<String, Object> defaultBusinessAbnormal = new HashMap<>();
-            defaultBusinessAbnormal.put("id", "1");
-            defaultBusinessAbnormal.put("inDate", "-");
-            defaultBusinessAbnormal.put("department", "-");
-            defaultBusinessAbnormal.put("inReason", "-");
-            defaultBusinessAbnormal.put("disabled", "-");
-            List<Map<String, Object>> defaultBusinessAbnormalList = Collections.singletonList(defaultBusinessAbnormal);
-            data.put("businessAbnormals", defaultBusinessAbnormalList);
-            data.put("businessAbnormalsCount", 0);
-        }
-
-        // 处理行政处罚记录
-        ArrayList<Map<String, Object>> penaltyRecords = (ArrayList<Map<String, Object>>) data.get("penaltyRecords");
-        if (CollectionUtils.isNotEmpty(penaltyRecords)) {
-            penaltyRecords.forEach(item -> {
-                item.replaceAll((k, v) -> v.equals("") ? "-" : v);
-            });
-            data.put("penaltyRecordsCount", penaltyRecords.size());
-        } else {
-            Map<String, Object> defaultPenaltyRecord = new HashMap<>();
-            defaultPenaltyRecord.put("id", "1");
-            defaultPenaltyRecord.put("seqNo", "-");
-            defaultPenaltyRecord.put("number", "-");
-            defaultPenaltyRecord.put("penaltyData", "-");
-            defaultPenaltyRecord.put("content", "-");
-            defaultPenaltyRecord.put("punishAmnt", "-");
-            defaultPenaltyRecord.put("department", "-");
-            defaultPenaltyRecord.put("description", "-");
-            List<Map<String, Object>> defaultPenaltyRecordList = Collections.singletonList(defaultPenaltyRecord);
-            data.put("penaltyRecords", defaultPenaltyRecordList);
-            data.put("penaltyRecordsCount", 0);
-        }
-
-        // 处理税务处罚记录
-        ArrayList<Map<String, Object>> taxPenalties = (ArrayList<Map<String, Object>>) data.get("taxPenalties");
-        if (CollectionUtils.isNotEmpty(taxPenalties)) {
-            taxPenalties.forEach(item -> {
-                item.replaceAll((k, v) -> v.equals("") ? "-" : v);
-            });
-            data.put("taxPenaltiesCount", taxPenalties.size());
-        } else {
-            Map<String, Object> defaultTaxPenalty = new HashMap<>();
-            defaultTaxPenalty.put("id", "1");
-            defaultTaxPenalty.put("time", "-");
-            defaultTaxPenalty.put("type", "-");
-            defaultTaxPenalty.put("result", "-");
-            List<Map<String, Object>> defaultTaxPenaltyList = Collections.singletonList(defaultTaxPenalty);
-            data.put("taxPenalties", defaultTaxPenaltyList);
-            data.put("taxPenaltiesCount", 0);
-        }
-
-        // 处理严重违法记录
-        ArrayList<Map<String, Object>> severeViolations = (ArrayList<Map<String, Object>>) data.get("severeViolations");
-        if (CollectionUtils.isNotEmpty(severeViolations)) {
-            severeViolations.forEach(item -> {
-                item.replaceAll((k, v) -> v.equals("") ? "-" : v);
-            });
-            data.put("severeViolationsCount", severeViolations.size());
-        } else {
-            Map<String, Object> defaultSevereViolation = new HashMap<>();
-            defaultSevereViolation.put("id", "1");
-            defaultSevereViolation.put("time", "-");
-            defaultSevereViolation.put("decisionDept", "-");
-            defaultSevereViolation.put("inReason", "-");
-            defaultSevereViolation.put("isHistory", "-");
-            List<Map<String, Object>> defaultSevereViolationList = Collections.singletonList(defaultSevereViolation);
-            data.put("severeViolations", defaultSevereViolationList);
-            data.put("severeViolationsCount", 0);
-        }
-    }
-
-
-}
+//package com.yaoyicloud.render;
+//
+//import java.io.IOException;
+//import java.io.InputStream;
+//import java.util.ArrayList;
+//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.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;
+//
+///**
+// * PublicRecord渲染器
+// *
+// */
+//@Slf4j
+//public final class PublicRecordRender extends FXYAbstractRender {
+//    private final FilerepoProperties filerepoProperties;
+//private final CommonDataCache commonDataCache;
+//    public PublicRecordRender(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();
+//    }
+//
+//    /**
+//     * Docx 渲染
+//     *
+//     * @param info 数据
+//     * @param inputStream 模板内容
+//     * @return 本地文件目录
+//     * @throws IOException
+//     */
+//
+//    public String renderDocx(String info, InputStream inputStream,
+//        String relationId) throws IOException {
+//        log.info("开始渲染公共模块,relationId: {}", relationId);
+//
+//        // 配置POI-TL渲染器
+//        ConfigureBuilder builder = Configure.builder();
+//        RenderPolicy indicatorsRenderPolicy = this.indicatorsRenderPolicy();
+//
+//        builder.bind("dishonestPersons", indicatorsRenderPolicy);
+//        builder.bind("businessAbnormals", indicatorsRenderPolicy);
+//        builder.bind("penaltyRecords", indicatorsRenderPolicy);
+//        builder.bind("taxPenalties", indicatorsRenderPolicy);
+//        builder.bind("severeViolations", indicatorsRenderPolicy);
+//
+//        FxyProtos.PublicRecord.Builder basicInfoBuilder = FxyProtos.PublicRecord.newBuilder();
+//        JsonFormat.parser().merge(info, basicInfoBuilder);
+//        FxyProtos.PublicRecord defaultInstance = FxyProtos.PublicRecord.getDefaultInstance();
+//        FxyProtos.PublicRecord 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>>() {});
+//        data.replaceAll((k, v) -> v.equals("") ? "-" : v);
+//
+//        fillBasicDefaultValues(data);
+//        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
+//        if (MapUtils.isNotEmpty(commonDataCacheData)) {
+//            data.putAll(commonDataCacheData);
+//        }
+//
+//        try {
+//            // 渲染文档
+//            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "publicRecord");
+//            log.info("渲染公共模块成功,文件路径: {}", resultPath);
+//            return resultPath;
+//        } catch (Exception e) {
+//            log.error("渲染公共模块失败,relationId: {}", relationId, e);
+//            throw new IOException("文档渲染失败", e);
+//        }
+//    }
+//
+//    /**
+//     * 填充默认值,确保所有必要字段都存在
+//     */
+//    private void fillBasicDefaultValues(Map<String, Object> data) {
+//        Map<String, Object> basicInfoSummary = (Map<String, Object>) data.get("publicRecordSummary");
+//        basicInfoSummary.replaceAll((k, v) -> v.equals("") ? "-" : v);
+//
+//        // 处理失信人数据
+//        ArrayList<Map<String, Object>> dishonestPersons = (ArrayList<Map<String, Object>>) data.get("dishonestPersons");
+//        if (CollectionUtils.isNotEmpty(dishonestPersons)) {
+//            dishonestPersons.forEach(person -> {
+//                person.replaceAll((k, v) -> v.equals("") ? "-" : v);
+//            });
+//            data.put("dishonestPersonsCount", dishonestPersons.size());
+//        } else {
+//            Map<String, Object> defaultDishonestPerson = new HashMap<>();
+//            defaultDishonestPerson.put("id", "1");
+//            defaultDishonestPerson.put("inDate", "-");
+//            defaultDishonestPerson.put("caseNumber", "-");
+//            defaultDishonestPerson.put("amount", "-");
+//            defaultDishonestPerson.put("executionDesc", "-");
+//            defaultDishonestPerson.put("executionStatus", "-");
+//            defaultDishonestPerson.put("court", "-");
+//            defaultDishonestPerson.put("disabled", "-");
+//            List<Map<String, Object>> defaultDishonestPersonList = Collections.singletonList(defaultDishonestPerson);
+//            data.put("dishonestPersons", defaultDishonestPersonList);
+//            data.put("dishonestPersonsCount", 0);
+//        }
+//
+//        // 处理经营异常数据
+//        ArrayList<Map<String, Object>> businessAbnormals =
+//            (ArrayList<Map<String, Object>>) data.get("businessAbnormals");
+//        if (CollectionUtils.isNotEmpty(businessAbnormals)) {
+//            businessAbnormals.forEach(item -> {
+//                item.replaceAll((k, v) -> v.equals("") ? "-" : v);
+//            });
+//            data.put("businessAbnormalsCount", businessAbnormals.size());
+//        } else {
+//            Map<String, Object> defaultBusinessAbnormal = new HashMap<>();
+//            defaultBusinessAbnormal.put("id", "1");
+//            defaultBusinessAbnormal.put("inDate", "-");
+//            defaultBusinessAbnormal.put("department", "-");
+//            defaultBusinessAbnormal.put("inReason", "-");
+//            defaultBusinessAbnormal.put("disabled", "-");
+//            List<Map<String, Object>> defaultBusinessAbnormalList = Collections.singletonList(defaultBusinessAbnormal);
+//            data.put("businessAbnormals", defaultBusinessAbnormalList);
+//            data.put("businessAbnormalsCount", 0);
+//        }
+//
+//        // 处理行政处罚记录
+//        ArrayList<Map<String, Object>> penaltyRecords = (ArrayList<Map<String, Object>>) data.get("penaltyRecords");
+//        if (CollectionUtils.isNotEmpty(penaltyRecords)) {
+//            penaltyRecords.forEach(item -> {
+//                item.replaceAll((k, v) -> v.equals("") ? "-" : v);
+//            });
+//            data.put("penaltyRecordsCount", penaltyRecords.size());
+//        } else {
+//            Map<String, Object> defaultPenaltyRecord = new HashMap<>();
+//            defaultPenaltyRecord.put("id", "1");
+//            defaultPenaltyRecord.put("seqNo", "-");
+//            defaultPenaltyRecord.put("number", "-");
+//            defaultPenaltyRecord.put("penaltyData", "-");
+//            defaultPenaltyRecord.put("content", "-");
+//            defaultPenaltyRecord.put("punishAmnt", "-");
+//            defaultPenaltyRecord.put("department", "-");
+//            defaultPenaltyRecord.put("description", "-");
+//            List<Map<String, Object>> defaultPenaltyRecordList = Collections.singletonList(defaultPenaltyRecord);
+//            data.put("penaltyRecords", defaultPenaltyRecordList);
+//            data.put("penaltyRecordsCount", 0);
+//        }
+//
+//        // 处理税务处罚记录
+//        ArrayList<Map<String, Object>> taxPenalties = (ArrayList<Map<String, Object>>) data.get("taxPenalties");
+//        if (CollectionUtils.isNotEmpty(taxPenalties)) {
+//            taxPenalties.forEach(item -> {
+//                item.replaceAll((k, v) -> v.equals("") ? "-" : v);
+//            });
+//            data.put("taxPenaltiesCount", taxPenalties.size());
+//        } else {
+//            Map<String, Object> defaultTaxPenalty = new HashMap<>();
+//            defaultTaxPenalty.put("id", "1");
+//            defaultTaxPenalty.put("time", "-");
+//            defaultTaxPenalty.put("type", "-");
+//            defaultTaxPenalty.put("result", "-");
+//            List<Map<String, Object>> defaultTaxPenaltyList = Collections.singletonList(defaultTaxPenalty);
+//            data.put("taxPenalties", defaultTaxPenaltyList);
+//            data.put("taxPenaltiesCount", 0);
+//        }
+//
+//        // 处理严重违法记录
+//        ArrayList<Map<String, Object>> severeViolations = (ArrayList<Map<String, Object>>) data.get("severeViolations");
+//        if (CollectionUtils.isNotEmpty(severeViolations)) {
+//            severeViolations.forEach(item -> {
+//                item.replaceAll((k, v) -> v.equals("") ? "-" : v);
+//            });
+//            data.put("severeViolationsCount", severeViolations.size());
+//        } else {
+//            Map<String, Object> defaultSevereViolation = new HashMap<>();
+//            defaultSevereViolation.put("id", "1");
+//            defaultSevereViolation.put("time", "-");
+//            defaultSevereViolation.put("decisionDept", "-");
+//            defaultSevereViolation.put("inReason", "-");
+//            defaultSevereViolation.put("isHistory", "-");
+//            List<Map<String, Object>> defaultSevereViolationList = Collections.singletonList(defaultSevereViolation);
+//            data.put("severeViolations", defaultSevereViolationList);
+//            data.put("severeViolationsCount", 0);
+//        }
+//    }
+//
+//
+//}

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

@@ -1,7 +1,7 @@
 package com.yaoyicloud.render;
 
 import java.io.IOException;
-import java.io.InputStream;
+
 import java.time.LocalDate;
 import java.util.HashMap;
 import java.util.Map;
@@ -14,7 +14,7 @@ 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.BasicAbstractRender;
+import com.yaoyicloud.factory.FXYAbstractRender;
 import com.yaoyicloud.message.FxyProtos;
 
 import lombok.extern.slf4j.Slf4j;
@@ -24,7 +24,7 @@ import lombok.extern.slf4j.Slf4j;
  *
  */
 @Slf4j
-public final class ServiceProviderInfoRender extends BasicAbstractRender {
+public final class ServiceProviderInfoRender extends FXYAbstractRender {
     private final FilerepoProperties filerepoProperties;
     private final CommonDataCache commonDataCache;
 
@@ -36,43 +36,21 @@ public final class ServiceProviderInfoRender extends BasicAbstractRender {
     }
 
     @Override
-    protected String getBasicPath() throws IOException {
-        return filerepoProperties.getBasePath();
-    }
-
-    @Override
-    protected String getReportImagePath() {
-        return filerepoProperties.getReportImagePath();
-    }
-
-    /**
-     * Docx 渲染
-     *
-     * @param info 数据
-     * @param inputStream 模板内容
-     * @return 本地文件目录
-     * @throws IOException
-     */
-
-    public String renderDocx(String info, InputStream inputStream,
-        String relationId, Integer counter) throws IOException {
+    protected Map<String, Object> renderDocx(String info, String relationId, Integer counter) throws IOException {
         log.info("开始渲染公共封面模块,relationId: {}", relationId);
 
-        // 配置POI-TL渲染器
-        ConfigureBuilder builder = Configure.builder();
-        RenderPolicy indicatorsRenderPolicy = this.getScoreRenderPolicy();
-        builder.bind("checkItemScores", indicatorsRenderPolicy);
+
         FxyProtos.AuditResult.Builder auditResultBuilder = FxyProtos.AuditResult.newBuilder();
         JsonFormat.parser().merge(info, auditResultBuilder);
 
         FxyProtos.AuditResult defaultInstance = FxyProtos.AuditResult.getDefaultInstance();
         FxyProtos.AuditResult mergedProto = defaultInstance.toBuilder()
-            .mergeFrom(auditResultBuilder.build())
-            .build();
+                .mergeFrom(auditResultBuilder.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);
@@ -90,16 +68,28 @@ public final class ServiceProviderInfoRender extends BasicAbstractRender {
         data.put("levelInteger", counter);
         data.putAll(commonData);
         fillDefaultValues(data);
-        try {
-            // 渲染文档
-           String resultPath = this.renderDocx(data, inputStream, builder, relationId, "serviceProviderInfo");
-            log.info("渲染公共封面成功,文件路径: {}", resultPath);
-
-            return resultPath;
-        } catch (Exception e) {
-            log.error("渲染公共封面失败,relationId: {}", relationId, e);
-            throw new IOException("文档渲染失败", e);
-        }
+        return data;
+    }
+
+
+
+    @Override
+    protected ConfigureBuilder builder() {
+        // 配置POI-TL渲染器
+        ConfigureBuilder builder = Configure.builder();
+        RenderPolicy indicatorsRenderPolicy = this.getScoreRenderPolicy();
+        builder.bind("checkItemScores", indicatorsRenderPolicy);
+        return builder;
+    }
+
+    @Override
+    protected String getBasicPath() throws IOException {
+        return filerepoProperties.getBasePath();
+    }
+
+    @Override
+    protected String getReportImagePath() {
+        return filerepoProperties.getReportImagePath();
     }
 
     /**

+ 124 - 124
easier-report-biz/src/main/java/com/yaoyicloud/render/association/AssociationAttachmentSectionRender.java

@@ -1,124 +1,124 @@
-package com.yaoyicloud.render.association;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-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.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.protobuf.Descriptors;
-import com.google.protobuf.util.JsonFormat;
-import com.yaoyicloud.config.CommonDataCache;
-import com.yaoyicloud.config.FilerepoProperties;
-
-import com.yaoyicloud.message.FxyProtos;
-import com.yaoyicloud.factory.BasicAbstractRender;
-
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.collections4.MapUtils;
-
-/**
- * AttachmentSection渲染器
- *
- */
-@Slf4j
-public final class AssociationAttachmentSectionRender extends BasicAbstractRender {
-    private final FilerepoProperties filerepoProperties;
-    private final CommonDataCache commonDataCache;
-    public AssociationAttachmentSectionRender(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();
-    }
-
-    /**
-     * Docx 渲染
-     *
-     * @param info 数据
-     * @param inputStream 模板内容
-     * @return 本地文件目录
-     * @throws IOException
-     */
-
-    public String renderDocx(String info, InputStream inputStream, String relationId) throws IOException {
-        log.info("开始渲染学协会附件模块,relationId: {}", relationId);
-
-        // 配置POI-TL渲染器
-        ConfigureBuilder builder = Configure.builder();
-        builder.addPlugin('^',  this.pictureRenderPolicy());
-        builder.addPlugin('`',  this.hyperlinkRenderPolicy());
-
-        FxyProtos.AssociationattachmentSection.Builder associationattachmentSection = FxyProtos.AssociationattachmentSection.newBuilder();
-        JsonFormat.parser().merge(info, associationattachmentSection);
-
-        FxyProtos.AssociationattachmentSection defaultInstance = FxyProtos.AssociationattachmentSection.getDefaultInstance();
-        FxyProtos.AssociationattachmentSection mergedProto = defaultInstance.toBuilder()
-                .mergeFrom(associationattachmentSection.build())
-                .build();
-
-        Map<String, Object> newAddtionMap = new HashMap<>();
-        Descriptors.Descriptor descriptor = mergedProto.getDescriptorForType();
-        for (Descriptors.FieldDescriptor field : descriptor.getFields()) {
-            if (field.isRepeated()) {
-                List<?> li = (List<?>) mergedProto.getField(field);
-                if (li.size() == 0) {
-                    newAddtionMap.put(field.getName() + "AltText", "未上传");
-                }
-            }
-        }
-
-        String completeJson = JsonFormat.printer()
-                .includingDefaultValueFields()
-                .print(mergedProto);
-        ObjectMapper objectMapper = new ObjectMapper();
-        Map<String, Object> data = objectMapper.readValue(completeJson, new TypeReference<Map<String, Object>>() {});
-        if (newAddtionMap != null) {
-            data.putAll(newAddtionMap);
-        }
-        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
-        if (MapUtils.isNotEmpty(commonDataCacheData)) {
-            data.putAll(commonDataCacheData);
-        }
-
-        fillDefaultValues(data);
-        try {
-            // 渲染文档
-            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "attachmentSection");
-            log.info("渲染学协会附件模块成功,文件路径: {}", resultPath);
-            return resultPath;
-        } catch (Exception e) {
-            log.error("渲染学协会附件模块失败,relationId: {}", relationId, e);
-            throw new IOException("文档渲染失败", e);
-        }
-    }
-
-
-    /**
-     * 填充默认值,确保所有必要字段都存在
-     */
-    private void fillDefaultValues(Map<String, Object> data) {
-
-        ArrayList<String> fillDeclLinks = (ArrayList) data.get("fillDeclLinks");
-        if (fillDeclLinks != null) {
-            data.put("fillDeclLinksExits", true);
-
-        }
-
-    }
-
-
-}
+//package com.yaoyicloud.render.association;
+//
+//import java.io.IOException;
+//import java.io.InputStream;
+//import java.util.ArrayList;
+//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.fasterxml.jackson.core.type.TypeReference;
+//import com.fasterxml.jackson.databind.ObjectMapper;
+//import com.google.protobuf.Descriptors;
+//import com.google.protobuf.util.JsonFormat;
+//import com.yaoyicloud.config.CommonDataCache;
+//import com.yaoyicloud.config.FilerepoProperties;
+//
+//import com.yaoyicloud.message.FxyProtos;
+//import com.yaoyicloud.factory.FXYAbstractRender;
+//
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.commons.collections4.MapUtils;
+//
+///**
+// * AttachmentSection渲染器
+// *
+// */
+//@Slf4j
+//public final class AssociationAttachmentSectionRender extends FXYAbstractRender {
+//    private final FilerepoProperties filerepoProperties;
+//    private final CommonDataCache commonDataCache;
+//    public AssociationAttachmentSectionRender(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();
+//    }
+//
+//    /**
+//     * Docx 渲染
+//     *
+//     * @param info 数据
+//     * @param inputStream 模板内容
+//     * @return 本地文件目录
+//     * @throws IOException
+//     */
+//
+//    public String renderDocx(String info, InputStream inputStream, String relationId) throws IOException {
+//        log.info("开始渲染学协会附件模块,relationId: {}", relationId);
+//
+//        // 配置POI-TL渲染器
+//        ConfigureBuilder builder = Configure.builder();
+//        builder.addPlugin('^',  this.pictureRenderPolicy());
+//        builder.addPlugin('`',  this.hyperlinkRenderPolicy());
+//
+//        FxyProtos.AssociationattachmentSection.Builder associationattachmentSection = FxyProtos.AssociationattachmentSection.newBuilder();
+//        JsonFormat.parser().merge(info, associationattachmentSection);
+//
+//        FxyProtos.AssociationattachmentSection defaultInstance = FxyProtos.AssociationattachmentSection.getDefaultInstance();
+//        FxyProtos.AssociationattachmentSection mergedProto = defaultInstance.toBuilder()
+//                .mergeFrom(associationattachmentSection.build())
+//                .build();
+//
+//        Map<String, Object> newAddtionMap = new HashMap<>();
+//        Descriptors.Descriptor descriptor = mergedProto.getDescriptorForType();
+//        for (Descriptors.FieldDescriptor field : descriptor.getFields()) {
+//            if (field.isRepeated()) {
+//                List<?> li = (List<?>) mergedProto.getField(field);
+//                if (li.size() == 0) {
+//                    newAddtionMap.put(field.getName() + "AltText", "未上传");
+//                }
+//            }
+//        }
+//
+//        String completeJson = JsonFormat.printer()
+//                .includingDefaultValueFields()
+//                .print(mergedProto);
+//        ObjectMapper objectMapper = new ObjectMapper();
+//        Map<String, Object> data = objectMapper.readValue(completeJson, new TypeReference<Map<String, Object>>() {});
+//        if (newAddtionMap != null) {
+//            data.putAll(newAddtionMap);
+//        }
+//        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
+//        if (MapUtils.isNotEmpty(commonDataCacheData)) {
+//            data.putAll(commonDataCacheData);
+//        }
+//
+//        fillDefaultValues(data);
+//        try {
+//            // 渲染文档
+//            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "attachmentSection");
+//            log.info("渲染学协会附件模块成功,文件路径: {}", resultPath);
+//            return resultPath;
+//        } catch (Exception e) {
+//            log.error("渲染学协会附件模块失败,relationId: {}", relationId, e);
+//            throw new IOException("文档渲染失败", e);
+//        }
+//    }
+//
+//
+//    /**
+//     * 填充默认值,确保所有必要字段都存在
+//     */
+//    private void fillDefaultValues(Map<String, Object> data) {
+//
+//        ArrayList<String> fillDeclLinks = (ArrayList) data.get("fillDeclLinks");
+//        if (fillDeclLinks != null) {
+//            data.put("fillDeclLinksExits", true);
+//
+//        }
+//
+//    }
+//
+//
+//}

+ 138 - 138
easier-report-biz/src/main/java/com/yaoyicloud/render/association/AssociationBasicInfoRender.java

@@ -1,138 +1,138 @@
-package com.yaoyicloud.render.association;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Map;
-import java.util.Objects;
-
-import com.deepoove.poi.config.Configure;
-import com.deepoove.poi.config.ConfigureBuilder;
-import com.deepoove.poi.policy.RenderPolicy;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.protobuf.InvalidProtocolBufferException;
-import com.google.protobuf.util.JsonFormat;
-import com.yaoyicloud.config.CommonDataCache;
-import com.yaoyicloud.config.FilerepoProperties;
-import com.yaoyicloud.message.FxyProtos;
-import com.yaoyicloud.factory.BasicAbstractRender;
-
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.collections4.MapUtils;
-
-/**
- * BasicInfo渲染器
- *
- */
-@Slf4j
-public final class AssociationBasicInfoRender extends BasicAbstractRender {
-    private final FilerepoProperties filerepoProperties;
-private final CommonDataCache commonDataCache;
-    public AssociationBasicInfoRender(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();
-    }
-
-    /**
-     * Docx 渲染
-     *
-     * @param info 数据
-     * @param inputStream 模板内容
-     * @return 本地文件目录
-     * @throws IOException
-     */
-    public String renderDocx(String info, InputStream inputStream,
-                             String relationId) throws IOException {
-        log.info("开始渲染学协会基础信息报告模块,relationId: {}", relationId);
-
-
-        // 配置POI-TL渲染器
-        ConfigureBuilder builder = Configure.builder();
-        RenderPolicy indicatorsRenderPolicyToProtobuf = this.indicatorsRenderPolicyToProtobuf();
-        builder.bind("basicInfoChecks", indicatorsRenderPolicyToProtobuf).bind("superiorAuthority", indicatorsRenderPolicyToProtobuf);
-        builder.addPlugin('^', this.pictureRenderPolicy());
-        builder.useSpringEL();
-        //通过默认protobuf实例来填充不存在的key
-        FxyProtos.BasicInfo.Builder basicInfoBuilder = FxyProtos.BasicInfo.newBuilder();
-        JsonFormat.parser().merge(info, basicInfoBuilder);
-
-        FxyProtos.BasicInfo defaultInstance = FxyProtos.BasicInfo.getDefaultInstance();
-        FxyProtos.BasicInfo 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>>() {});
-        data.replaceAll((k, v) -> v.equals("") ? "-" : v);
-        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
-        if (MapUtils.isNotEmpty(commonDataCacheData)) {
-            data.putAll(commonDataCacheData);
-        }
-        fillBasicDefaultValues(data);
-        try {
-            // 渲染文档
-            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "basicInfo");
-            log.info("渲染学协会基础信息报告模块成功,文件路径: {}", resultPath);
-            return resultPath;
-        } catch (Exception e) {
-            log.error("渲染学协会基础信息报告模块失败,relationId: {}", relationId, e);
-            throw new IOException("文档渲染失败", e);
-        }
-    }
-
-    /**
-     * 填充默认值,确保所有必要字段都存在
-     */
-    private void fillBasicDefaultValues(Map<String, Object> data)
-        throws InvalidProtocolBufferException, JsonProcessingException {
-        Map<String, Object> basicInfoSummary = (Map<String, Object>) data.get("basicInfoSummary");
-        basicInfoSummary.replaceAll((k, v) -> v.equals("") ? "-" : v);
-
-        Map<String, Object> associationExt = (Map<String, Object>) data.get("associationExt");
-        if (associationExt == null) {
-            ObjectMapper objectMapper = new ObjectMapper();
-
-            FxyProtos.AssociationBasicInfoExt associationBasicInfoExt = FxyProtos.AssociationBasicInfoExt.getDefaultInstance();
-            String print = JsonFormat.printer()
-                .includingDefaultValueFields()
-                .print(associationBasicInfoExt);
-            associationExt = objectMapper.readValue(print, new TypeReference<Map<String, Object>>() {});
-            associationExt.replaceAll((k, v) -> v.equals("") ? "-" : v);
-            data.put("associationExt", associationExt);
-        }
-
-        associationExt.replaceAll((k, v) -> v.equals("") ? "-" : v);
-
-        Object certReceived = data.get("certReceived");
-        if (Objects.equals(certReceived, "-")) {
-            data.put("certReceived", "否");
-        }
-
-        Object bankLicense = data.get("bankLicense");
-        if (Objects.equals(bankLicense, "-")) {
-            data.put("bankLicense", "否");
-        }
-
-        Object annualInspectionResult = data.get("annualInspectionResult");
-        if (Objects.equals(annualInspectionResult, "-")) {
-            data.put("annualInspectionResult", "否");
-        }
-
-    }
-
-}
+//package com.yaoyicloud.render.association;
+//
+//import java.io.IOException;
+//import java.io.InputStream;
+//import java.util.Map;
+//import java.util.Objects;
+//
+//import com.deepoove.poi.config.Configure;
+//import com.deepoove.poi.config.ConfigureBuilder;
+//import com.deepoove.poi.policy.RenderPolicy;
+//import com.fasterxml.jackson.core.JsonProcessingException;
+//import com.fasterxml.jackson.core.type.TypeReference;
+//import com.fasterxml.jackson.databind.ObjectMapper;
+//import com.google.protobuf.InvalidProtocolBufferException;
+//import com.google.protobuf.util.JsonFormat;
+//import com.yaoyicloud.config.CommonDataCache;
+//import com.yaoyicloud.config.FilerepoProperties;
+//import com.yaoyicloud.message.FxyProtos;
+//import com.yaoyicloud.factory.FXYAbstractRender;
+//
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.commons.collections4.MapUtils;
+//
+///**
+// * BasicInfo渲染器
+// *
+// */
+//@Slf4j
+//public final class AssociationBasicInfoRender extends FXYAbstractRender {
+//    private final FilerepoProperties filerepoProperties;
+//private final CommonDataCache commonDataCache;
+//    public AssociationBasicInfoRender(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();
+//    }
+//
+//    /**
+//     * Docx 渲染
+//     *
+//     * @param info 数据
+//     * @param inputStream 模板内容
+//     * @return 本地文件目录
+//     * @throws IOException
+//     */
+//    public String renderDocx(String info, InputStream inputStream,
+//                             String relationId) throws IOException {
+//        log.info("开始渲染学协会基础信息报告模块,relationId: {}", relationId);
+//
+//
+//        // 配置POI-TL渲染器
+//        ConfigureBuilder builder = Configure.builder();
+//        RenderPolicy indicatorsRenderPolicyToProtobuf = this.indicatorsRenderPolicyToProtobuf();
+//        builder.bind("basicInfoChecks", indicatorsRenderPolicyToProtobuf).bind("superiorAuthority", indicatorsRenderPolicyToProtobuf);
+//        builder.addPlugin('^', this.pictureRenderPolicy());
+//        builder.useSpringEL();
+//        //通过默认protobuf实例来填充不存在的key
+//        FxyProtos.BasicInfo.Builder basicInfoBuilder = FxyProtos.BasicInfo.newBuilder();
+//        JsonFormat.parser().merge(info, basicInfoBuilder);
+//
+//        FxyProtos.BasicInfo defaultInstance = FxyProtos.BasicInfo.getDefaultInstance();
+//        FxyProtos.BasicInfo 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>>() {});
+//        data.replaceAll((k, v) -> v.equals("") ? "-" : v);
+//        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
+//        if (MapUtils.isNotEmpty(commonDataCacheData)) {
+//            data.putAll(commonDataCacheData);
+//        }
+//        fillBasicDefaultValues(data);
+//        try {
+//            // 渲染文档
+//            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "basicInfo");
+//            log.info("渲染学协会基础信息报告模块成功,文件路径: {}", resultPath);
+//            return resultPath;
+//        } catch (Exception e) {
+//            log.error("渲染学协会基础信息报告模块失败,relationId: {}", relationId, e);
+//            throw new IOException("文档渲染失败", e);
+//        }
+//    }
+//
+//    /**
+//     * 填充默认值,确保所有必要字段都存在
+//     */
+//    private void fillBasicDefaultValues(Map<String, Object> data)
+//        throws InvalidProtocolBufferException, JsonProcessingException {
+//        Map<String, Object> basicInfoSummary = (Map<String, Object>) data.get("basicInfoSummary");
+//        basicInfoSummary.replaceAll((k, v) -> v.equals("") ? "-" : v);
+//
+//        Map<String, Object> associationExt = (Map<String, Object>) data.get("associationExt");
+//        if (associationExt == null) {
+//            ObjectMapper objectMapper = new ObjectMapper();
+//
+//            FxyProtos.AssociationBasicInfoExt associationBasicInfoExt = FxyProtos.AssociationBasicInfoExt.getDefaultInstance();
+//            String print = JsonFormat.printer()
+//                .includingDefaultValueFields()
+//                .print(associationBasicInfoExt);
+//            associationExt = objectMapper.readValue(print, new TypeReference<Map<String, Object>>() {});
+//            associationExt.replaceAll((k, v) -> v.equals("") ? "-" : v);
+//            data.put("associationExt", associationExt);
+//        }
+//
+//        associationExt.replaceAll((k, v) -> v.equals("") ? "-" : v);
+//
+//        Object certReceived = data.get("certReceived");
+//        if (Objects.equals(certReceived, "-")) {
+//            data.put("certReceived", "否");
+//        }
+//
+//        Object bankLicense = data.get("bankLicense");
+//        if (Objects.equals(bankLicense, "-")) {
+//            data.put("bankLicense", "否");
+//        }
+//
+//        Object annualInspectionResult = data.get("annualInspectionResult");
+//        if (Objects.equals(annualInspectionResult, "-")) {
+//            data.put("annualInspectionResult", "否");
+//        }
+//
+//    }
+//
+//}

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

@@ -1,9 +1,10 @@
 package com.yaoyicloud.render.cso;
 
 import java.io.IOException;
-import java.io.InputStream;
 import java.util.Map;
 
+import com.yaoyicloud.easier.common.file.core.FileProperties;
+import com.yaoyicloud.easier.common.file.core.FileTemplate;
 import com.yaoyicloud.factory.CSOAbstractRender;
 import org.apache.commons.collections4.MapUtils;
 
@@ -21,36 +22,17 @@ public final class EntAppendixRender extends CSOAbstractRender {
     private final FilerepoProperties filerepoProperties;
     private final CommonDataCache commonDataCache;
 
-    public EntAppendixRender(String cwd, FilerepoProperties filerepoProperties, CommonDataCache commonDataCache) {
-        super(cwd);
+    public EntAppendixRender(String cwd, FileTemplate ossTemplate, FileProperties properties,
+        FilerepoProperties filerepoProperties, CommonDataCache commonDataCache) {
+        super(cwd, ossTemplate, properties);
         this.filerepoProperties = filerepoProperties;
         this.commonDataCache = commonDataCache;
     }
 
     @Override
-    protected String getBasicPath() throws IOException {
-        return filerepoProperties.getBasePath();
-    }
-
-    @Override
-    protected String getReportImagePath() {
-        return filerepoProperties.getReportImagePath();
-    }
-
-    /**
-     *  Docx 渲染
-     * @param info 数据
-     * @param inputStream 模板内容
-     * @param relationId  用于查询缓存
-     * @return
-     * @throws IOException
-     */
-    public String renderDocx(String info, InputStream inputStream, String relationId) throws IOException {
+    protected Map<String, Object> renderDocx(String info, String relationId, Integer counter) throws IOException {
         log.info("开始渲染CSO企业报告签章模块,relationId: {}", relationId);
 
-        // 配置POI-TL渲染器
-        ConfigureBuilder builder = Configure.builder();
-
         ObjectMapper objectMapper = new ObjectMapper();
         Map<String, Object> data = objectMapper.readValue(info, new TypeReference<Map<String, Object>>() {});
 
@@ -58,17 +40,26 @@ public final class EntAppendixRender extends CSOAbstractRender {
         if (MapUtils.isNotEmpty(commonDataCacheData)) {
             data.putAll(commonDataCacheData);
         }
-
+        data.put("levelInteger", counter);
         fillDefaultValues(data);
-        try {
-            // 渲染文档
-            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "Appendix");
-            log.info("渲染CSO企业报告签章模块成功,文件路径: {}", resultPath);
-            return resultPath;
-        } catch (Exception e) {
-            log.error("渲染CSO企业报告签章模块失败,relationId: {}", relationId, e);
-            throw new IOException("文档渲染失败", e);
-        }
+        return data;
+    }
+
+    @Override
+    protected ConfigureBuilder builder(Map<String, Object> data) {
+        // 配置POI-TL渲染器
+        ConfigureBuilder builder = Configure.builder();
+        return builder;
+    }
+
+    @Override
+    protected String getBasicPath() throws IOException {
+        return filerepoProperties.getBasePath();
+    }
+
+    @Override
+    protected String getReportImagePath() {
+        return filerepoProperties.getReportImagePath();
     }
 
     /**
@@ -76,8 +67,6 @@ public final class EntAppendixRender extends CSOAbstractRender {
      */
     private void fillDefaultValues(Map<String, Object> data) {
 
-
-
     }
 
 }

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

@@ -1,7 +1,6 @@
 package com.yaoyicloud.render.cso;
 
 import java.io.IOException;
-import java.io.InputStream;
 import java.time.LocalDateTime;
 import java.util.Map;
 import cn.hutool.core.date.DateUtil;
@@ -12,6 +11,8 @@ 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.easier.common.file.core.FileProperties;
+import com.yaoyicloud.easier.common.file.core.FileTemplate;
 import com.yaoyicloud.factory.CSOAbstractRender;
 import com.yaoyicloud.message.CSOProtos;
 
@@ -23,36 +24,17 @@ public final class EntHeaderSectionRender extends CSOAbstractRender {
     private final FilerepoProperties filerepoProperties;
     private final CommonDataCache commonDataCache;
 
-    public EntHeaderSectionRender(String cwd, FilerepoProperties filerepoProperties, CommonDataCache commonDataCache) {
-        super(cwd);
+    public EntHeaderSectionRender(String cwd, FileTemplate ossTemplate, FileProperties properties,
+        FilerepoProperties filerepoProperties, CommonDataCache commonDataCache) {
+        super(cwd, ossTemplate, properties);
         this.filerepoProperties = filerepoProperties;
         this.commonDataCache = commonDataCache;
     }
 
     @Override
-    protected String getBasicPath() throws IOException {
-        return filerepoProperties.getBasePath();
-    }
-
-    @Override
-    protected String getReportImagePath() {
-        return filerepoProperties.getReportImagePath();
-    }
-
-    /**
-     *  Docx 渲染
-     * @param info 数据
-     * @param inputStream 模板内容
-     * @param relationId  用于查询缓存
-     * @return
-     * @throws IOException
-     */
-    public String renderDocx(String info, InputStream inputStream, String relationId) throws IOException {
+    protected Map<String, Object> renderDocx(String info, String relationId, Integer counter) throws IOException {
         log.info("开始渲染CSO企业报告封面模块,relationId: {}", relationId);
 
-        // 配置POI-TL渲染器
-        ConfigureBuilder builder = Configure.builder();
-        builder.bind("drugDetails", this.indicatorsRenderPolicyToProtobuf());
         CSOProtos.ReportHeader.Builder header = CSOProtos.ReportHeader.newBuilder();
 
         JsonFormat.parser().merge(info, header);
@@ -67,7 +49,8 @@ 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", DateUtil.format(LocalDateTime.now(), "yyyy年MM月dd日 HH:mm:ss"));
+        commonDataCache.addData(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);
@@ -83,24 +66,32 @@ public final class EntHeaderSectionRender extends CSOAbstractRender {
         commonDataCache.addData(relationId, "entrustingCompany", data.get("entrustingCompany"));
         commonDataCache.addData(relationId, "taskFinishTime", data.get("taskFinishTime"));
         commonDataCache.addData(relationId, "serviceCompany", data.get("serviceCompany"));
-
+        data.put("levelInteger", counter);
         fillDefaultValues(data);
-        try {
-            // 渲染文档
-            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "Header");
-            log.info("渲染CSO企业报告封面模块成功,文件路径: {}", resultPath);
-            return resultPath;
-        } catch (Exception e) {
-            log.error("渲染CSO企业报告封面模块失败,relationId: {}", relationId, e);
-            throw new IOException("文档渲染失败", e);
-        }
+        return data;
+    }
+
+    @Override
+    protected ConfigureBuilder builder(Map<String, Object> data) {
+        ConfigureBuilder builder = Configure.builder();
+        builder.bind("drugDetails", this.indicatorsRenderPolicyToProtobuf());
+        return builder;
+    }
+
+    @Override
+    protected String getBasicPath() throws IOException {
+        return filerepoProperties.getBasePath();
+    }
+
+    @Override
+    protected String getReportImagePath() {
+        return filerepoProperties.getReportImagePath();
     }
 
     /**
      * 填充默认值,确保所有必要字段都存在
      */
-    private void fillDefaultValues(Map<String, Object> data)  {
-        processJsonData(data, "drugDetails");
+    private void fillDefaultValues(Map<String, Object> data) {
 
     }
 

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

@@ -0,0 +1,84 @@
+package com.yaoyicloud.render.cso;
+
+import java.io.IOException;
+import java.util.Map;
+
+import com.yaoyicloud.easier.common.file.core.FileProperties;
+import com.yaoyicloud.easier.common.file.core.FileTemplate;
+import org.apache.commons.collections4.MapUtils;
+
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+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.CSOAbstractRender;
+import com.yaoyicloud.message.CSOProtos;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public final class EntProductIntroductionRender extends CSOAbstractRender {
+    private final FilerepoProperties filerepoProperties;
+    private final CommonDataCache commonDataCache;
+
+    public EntProductIntroductionRender(String cwd, FileTemplate ossTemplate, FileProperties properties,
+        FilerepoProperties filerepoProperties, CommonDataCache commonDataCache) {
+        super(cwd, ossTemplate, properties);
+        this.filerepoProperties = filerepoProperties;
+        this.commonDataCache = commonDataCache;
+    }
+
+    @Override
+    protected Map<String, Object> renderDocx(String info, String relationId, Integer counter) throws IOException {
+        log.info("开始渲染CSO企业报告产品介绍模块,relationId: {}", relationId);
+
+        CSOProtos.ProductIntroduction.Builder header = CSOProtos.ProductIntroduction.newBuilder();
+
+        JsonFormat.parser().merge(info, header);
+        CSOProtos.ProductIntroduction defaultInstance = CSOProtos.ProductIntroduction.getDefaultInstance();
+        CSOProtos.ProductIntroduction mergedProto = defaultInstance.toBuilder()
+            .mergeFrom(header.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);
+        }
+        data.put("levelInteger", counter);
+        fillDefaultValues(data);
+        return data;
+    }
+
+    @Override
+    protected ConfigureBuilder builder(Map<String, Object> data) {
+        ConfigureBuilder builder = Configure.builder();
+        builder.bind("drugDetails", this.indicatorsRenderPolicyToProtobuf());
+        return builder;
+    }
+
+    @Override
+    protected String getBasicPath() throws IOException {
+        return filerepoProperties.getBasePath();
+    }
+
+    @Override
+    protected String getReportImagePath() {
+        return filerepoProperties.getReportImagePath();
+    }
+
+    /**
+     * 填充默认值,确保所有必要字段都存在
+     */
+    private void fillDefaultValues(Map<String, Object> data) {
+        processJsonData(data, "drugDetails");
+
+    }
+
+}

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

@@ -1,9 +1,10 @@
 package com.yaoyicloud.render.cso;
 
 import java.io.IOException;
-import java.io.InputStream;
 import java.util.Map;
 import com.deepoove.poi.policy.RenderPolicy;
+import com.yaoyicloud.easier.common.file.core.FileProperties;
+import com.yaoyicloud.easier.common.file.core.FileTemplate;
 import com.yaoyicloud.factory.CSOAbstractRender;
 import org.apache.commons.collections4.MapUtils;
 import com.deepoove.poi.config.Configure;
@@ -22,33 +23,16 @@ public final class EntPromotionDetailsRender extends CSOAbstractRender {
     private final FilerepoProperties filerepoProperties;
     private final CommonDataCache commonDataCache;
 
-    public EntPromotionDetailsRender(String cwd, FilerepoProperties filerepoProperties,
+    public EntPromotionDetailsRender(String cwd, FileTemplate ossTemplate, FileProperties properties,
+        FilerepoProperties filerepoProperties,
         CommonDataCache commonDataCache) {
-        super(cwd);
+        super(cwd, ossTemplate, properties);
         this.filerepoProperties = filerepoProperties;
         this.commonDataCache = commonDataCache;
     }
 
     @Override
-    protected String getBasicPath() throws IOException {
-        return filerepoProperties.getBasePath();
-    }
-
-    @Override
-    protected String getReportImagePath() {
-        return filerepoProperties.getReportImagePath();
-    }
-
-    /**
-     * Docx 渲染
-     * 
-     * @param info 数据
-     * @param inputStream 模板内容
-     * @param relationId 用于查询缓存
-     * @return
-     * @throws IOException
-     */
-    public String renderDocx(String info, InputStream inputStream, String relationId) throws IOException {
+    protected Map<String, Object> renderDocx(String info, String relationId, Integer counter) throws IOException {
         log.info("开始渲染CSO企业报告推广明细模块,relationId: {}", relationId);
 
         CSOProtos.PromotionDetails.Builder promotionSummary = CSOProtos.PromotionDetails.newBuilder();
@@ -70,9 +54,14 @@ public final class EntPromotionDetailsRender extends CSOAbstractRender {
         if (MapUtils.isNotEmpty(commonDataCacheData)) {
             data.putAll(commonDataCacheData);
         }
-
+        data.put("levelInteger", counter);
         fillDefaultValues(data);
 
+        return data;
+    }
+
+    @Override
+    protected ConfigureBuilder builder(Map<String, Object> data) {
         ConfigureBuilder builder = Configure.builder();
         RenderPolicy policy = this.indicatorsRenderPolicyToProtobuf();
         builder.bind("userTasks", policy);
@@ -108,22 +97,24 @@ public final class EntPromotionDetailsRender extends CSOAbstractRender {
         builder.bind("taskType85List", policy);
         builder.bind("customerVisitList", policy);
         builder.bind("taskType424344List", policy);
-        try {
-            // 渲染文档
-            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "PromotionDetails");
-            log.info("渲染CSO企业报告推广明细模块成功,文件路径: {}", resultPath);
-            return resultPath;
-        } catch (Exception e) {
-            log.error("渲染CSO企业报告推广明细模块失败,relationId: {}", relationId, e);
-            throw new IOException("文档渲染失败", e);
-        }
+        return builder;
+    }
+
+    @Override
+    protected String getBasicPath() throws IOException {
+        return filerepoProperties.getBasePath();
+    }
+
+    @Override
+    protected String getReportImagePath() {
+        return filerepoProperties.getReportImagePath();
     }
 
     /**
      * 填充默认值,确保所有必要字段都存在
      */
     @SuppressWarnings("checkstyle:MethodLength")
-    private void fillDefaultValues(Map<String, Object> data)  {
+    private void fillDefaultValues(Map<String, Object> data) {
         processJsonData(data, "userTasks");
         processJsonData(data, "tasks");
         processJsonData(data, "meetingList");
@@ -159,10 +150,5 @@ public final class EntPromotionDetailsRender extends CSOAbstractRender {
         processJsonData(data, "taskType424344List");
         processJsonData(data, "taskType801List");
 
-
-
-
-
     }
 }
-

+ 26 - 37
easier-report-biz/src/main/java/com/yaoyicloud/render/cso/EntPromotionSummaryRender.java

@@ -1,7 +1,7 @@
 package com.yaoyicloud.render.cso;
 
 import java.io.IOException;
-import java.io.InputStream;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -10,6 +10,8 @@ import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import com.yaoyicloud.easier.common.file.core.FileProperties;
+import com.yaoyicloud.easier.common.file.core.FileTemplate;
 import com.yaoyicloud.factory.CSOAbstractRender;
 
 import org.apache.commons.collections4.MapUtils;
@@ -34,33 +36,16 @@ public final class EntPromotionSummaryRender extends CSOAbstractRender {
     private final FilerepoProperties filerepoProperties;
     private final CommonDataCache commonDataCache;
 
-    public EntPromotionSummaryRender(String cwd, FilerepoProperties filerepoProperties,
-                                     CommonDataCache commonDataCache) {
-        super(cwd);
+    public EntPromotionSummaryRender(String cwd, FileTemplate ossTemplate, FileProperties properties,
+        FilerepoProperties filerepoProperties,
+        CommonDataCache commonDataCache) {
+        super(cwd, ossTemplate, properties);
         this.filerepoProperties = filerepoProperties;
         this.commonDataCache = commonDataCache;
     }
 
     @Override
-    protected String getBasicPath() throws IOException {
-        return filerepoProperties.getBasePath();
-    }
-
-    @Override
-    protected String getReportImagePath() {
-        return filerepoProperties.getReportImagePath();
-    }
-
-    /**
-     * Docx 渲染
-     * 
-     * @param info 数据
-     * @param inputStream 模板内容
-     * @param relationId 用于查询缓存
-     * @return
-     * @throws IOException
-     */
-    public String renderDocx(String info, InputStream inputStream, String relationId) throws IOException {
+    protected Map<String, Object> renderDocx(String info, String relationId, Integer counter) throws IOException {
         log.info("开始渲染CSO企业报告推广总结模块,relationId: {}", relationId);
 
         CSOProtos.PromotionSummary.Builder promotionSummary = CSOProtos.PromotionSummary.newBuilder();
@@ -78,7 +63,7 @@ public final class EntPromotionSummaryRender extends CSOAbstractRender {
             ListValue listValue = ListValue.parseFrom(byteString);
             // 转换为List<Integer>
             List<Integer> scoreList = listValue.getValuesList().stream()
-                    .map(value -> (int) value.getNumberValue())
+                .map(value -> (int) value.getNumberValue())
                 .collect(Collectors.toList());
             userScoreMap.put(userId, scoreList);
         }
@@ -99,30 +84,34 @@ public final class EntPromotionSummaryRender extends CSOAbstractRender {
         if (MapUtils.isNotEmpty(commonDataCacheData)) {
             data.putAll(commonDataCacheData);
         }
-
+        data.put("levelInteger", counter);
         fillDefaultValues(data);
+        return data;
+    }
 
-        boolean sensitiveFlag = (Boolean) data.get("sensitiveFlag");
-        Map<Integer, String> userNameMap = (Map<Integer, String>) data.get("userNameMap");
+    @Override
+    protected ConfigureBuilder builder(Map<String, Object> data) {
         ConfigureBuilder builder = Configure.builder();
         DynamicTableRenderPolicy twoLevelTableDynamicPolicy = getTwoLevelTableDynamicPolicy();
-        DynamicTableRenderPolicy tableDynamicPolicy = tableDynamicPolicy(sensitiveFlag, userNameMap);
         DynamicTableRenderPolicy lastRowDaynamicPolicy = getTableLastRowDynamicPolicy();
+        DynamicTableRenderPolicy tableDynamicPolicy = super.getDynamicTableRenderPolicy(data);
         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_last", lastRowDaynamicPolicy);
-        try {
-            // 渲染文档
-            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "PromotionSummary");
-            log.info("渲染CSO企业报告推广总结模块成功,文件路径: {}", resultPath);
-            return resultPath;
-        } catch (Exception e) {
-            log.error("渲染CSO企业报告推广总结模块失败,relationId: {}", relationId, e);
-            throw new IOException("文档渲染失败", e);
-        }
+        return builder;
+    }
+
+    @Override
+    protected String getBasicPath() throws IOException {
+        return filerepoProperties.getBasePath();
+    }
+
+    @Override
+    protected String getReportImagePath() {
+        return filerepoProperties.getReportImagePath();
     }
 
     /**

+ 122 - 122
easier-report-biz/src/main/java/com/yaoyicloud/render/foundation/FoundationAttachmentSectionRender.java

@@ -1,122 +1,122 @@
-package com.yaoyicloud.render.foundation;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-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.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.protobuf.Descriptors;
-import com.google.protobuf.util.JsonFormat;
-import com.yaoyicloud.config.CommonDataCache;
-import com.yaoyicloud.config.FilerepoProperties;
-import com.yaoyicloud.message.FxyProtos;
-import com.yaoyicloud.factory.BasicAbstractRender;
-
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.collections4.MapUtils;
-
-/**
- * AttachmentSection渲染器
- *
- */
-@Slf4j
-public final class FoundationAttachmentSectionRender extends BasicAbstractRender {
-    private final FilerepoProperties filerepoProperties;
-    private final CommonDataCache commonDataCache;
-    public FoundationAttachmentSectionRender(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();
-    }
-
-    /**
-     * Docx 渲染
-     *
-     * @param info 数据
-     * @param inputStream 模板内容
-     * @return 本地文件目录
-     * @throws IOException
-     */
-
-    public String renderDocx(String info, InputStream inputStream, String relationId) throws IOException {
-        log.info("开始渲染基金会附件模块,relationId: {}", relationId);
-
-        // 配置POI-TL渲染器
-        ConfigureBuilder builder = Configure.builder();
-        builder.addPlugin('^',  this.pictureRenderPolicy());
-        builder.addPlugin('`',  this.hyperlinkRenderPolicy());
-
-        FxyProtos.AssociationattachmentSection.Builder associationattachmentSection = FxyProtos.AssociationattachmentSection.newBuilder();
-        JsonFormat.parser().merge(info, associationattachmentSection);
-
-        FxyProtos.AssociationattachmentSection defaultInstance = FxyProtos.AssociationattachmentSection.getDefaultInstance();
-        FxyProtos.AssociationattachmentSection mergedProto = defaultInstance.toBuilder()
-                .mergeFrom(associationattachmentSection.build())
-                .build();
-
-        Map<String, Object> newAddtionMap = new HashMap<>();
-        Descriptors.Descriptor descriptor = mergedProto.getDescriptorForType();
-        for (Descriptors.FieldDescriptor field : descriptor.getFields()) {
-            if (field.isRepeated()) {
-                List<?> li = (List<?>) mergedProto.getField(field);
-                if (li.size() == 0) {
-                    newAddtionMap.put(field.getName() + "AltText", "未上传");
-                }
-            }
-        }
-
-        String completeJson = JsonFormat.printer()
-                .includingDefaultValueFields()
-                .print(mergedProto);
-        ObjectMapper objectMapper = new ObjectMapper();
-        Map<String, Object> data = objectMapper.readValue(completeJson, new TypeReference<Map<String, Object>>() {});
-        if (newAddtionMap != null) {
-            data.putAll(newAddtionMap);
-        }
-        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
-        if (MapUtils.isNotEmpty(commonDataCacheData)) {
-            data.putAll(commonDataCacheData);
-        }
-        fillDefaultValues(data);
-        try {
-            // 渲染文档
-            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "attachmentSection");
-            log.info("渲染基金会附件模块成功,文件路径: {}", resultPath);
-            return resultPath;
-        } catch (Exception e) {
-            log.error("渲染基金会附件模块失败,relationId: {}", relationId, e);
-            throw new IOException("文档渲染失败", e);
-        }
-    }
-
-
-    /**
-     * 填充默认值,确保所有必要字段都存在
-     */
-    private void fillDefaultValues(Map<String, Object> data) {
-
-        ArrayList<String> fillDeclLinks = (ArrayList) data.get("fillDeclLinks");
-        if (fillDeclLinks != null) {
-            data.put("fillDeclLinksExits", true);
-
-        }
-
-    }
-
-
-}
+//package com.yaoyicloud.render.foundation;
+//
+//import java.io.IOException;
+//import java.io.InputStream;
+//import java.util.ArrayList;
+//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.fasterxml.jackson.core.type.TypeReference;
+//import com.fasterxml.jackson.databind.ObjectMapper;
+//import com.google.protobuf.Descriptors;
+//import com.google.protobuf.util.JsonFormat;
+//import com.yaoyicloud.config.CommonDataCache;
+//import com.yaoyicloud.config.FilerepoProperties;
+//import com.yaoyicloud.message.FxyProtos;
+//import com.yaoyicloud.factory.FXYAbstractRender;
+//
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.commons.collections4.MapUtils;
+//
+///**
+// * AttachmentSection渲染器
+// *
+// */
+//@Slf4j
+//public final class FoundationAttachmentSectionRender extends FXYAbstractRender {
+//    private final FilerepoProperties filerepoProperties;
+//    private final CommonDataCache commonDataCache;
+//    public FoundationAttachmentSectionRender(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();
+//    }
+//
+//    /**
+//     * Docx 渲染
+//     *
+//     * @param info 数据
+//     * @param inputStream 模板内容
+//     * @return 本地文件目录
+//     * @throws IOException
+//     */
+//
+//    public String renderDocx(String info, InputStream inputStream, String relationId) throws IOException {
+//        log.info("开始渲染基金会附件模块,relationId: {}", relationId);
+//
+//        // 配置POI-TL渲染器
+//        ConfigureBuilder builder = Configure.builder();
+//        builder.addPlugin('^',  this.pictureRenderPolicy());
+//        builder.addPlugin('`',  this.hyperlinkRenderPolicy());
+//
+//        FxyProtos.AssociationattachmentSection.Builder associationattachmentSection = FxyProtos.AssociationattachmentSection.newBuilder();
+//        JsonFormat.parser().merge(info, associationattachmentSection);
+//
+//        FxyProtos.AssociationattachmentSection defaultInstance = FxyProtos.AssociationattachmentSection.getDefaultInstance();
+//        FxyProtos.AssociationattachmentSection mergedProto = defaultInstance.toBuilder()
+//                .mergeFrom(associationattachmentSection.build())
+//                .build();
+//
+//        Map<String, Object> newAddtionMap = new HashMap<>();
+//        Descriptors.Descriptor descriptor = mergedProto.getDescriptorForType();
+//        for (Descriptors.FieldDescriptor field : descriptor.getFields()) {
+//            if (field.isRepeated()) {
+//                List<?> li = (List<?>) mergedProto.getField(field);
+//                if (li.size() == 0) {
+//                    newAddtionMap.put(field.getName() + "AltText", "未上传");
+//                }
+//            }
+//        }
+//
+//        String completeJson = JsonFormat.printer()
+//                .includingDefaultValueFields()
+//                .print(mergedProto);
+//        ObjectMapper objectMapper = new ObjectMapper();
+//        Map<String, Object> data = objectMapper.readValue(completeJson, new TypeReference<Map<String, Object>>() {});
+//        if (newAddtionMap != null) {
+//            data.putAll(newAddtionMap);
+//        }
+//        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
+//        if (MapUtils.isNotEmpty(commonDataCacheData)) {
+//            data.putAll(commonDataCacheData);
+//        }
+//        fillDefaultValues(data);
+//        try {
+//            // 渲染文档
+//            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "attachmentSection");
+//            log.info("渲染基金会附件模块成功,文件路径: {}", resultPath);
+//            return resultPath;
+//        } catch (Exception e) {
+//            log.error("渲染基金会附件模块失败,relationId: {}", relationId, e);
+//            throw new IOException("文档渲染失败", e);
+//        }
+//    }
+//
+//
+//    /**
+//     * 填充默认值,确保所有必要字段都存在
+//     */
+//    private void fillDefaultValues(Map<String, Object> data) {
+//
+//        ArrayList<String> fillDeclLinks = (ArrayList) data.get("fillDeclLinks");
+//        if (fillDeclLinks != null) {
+//            data.put("fillDeclLinksExits", true);
+//
+//        }
+//
+//    }
+//
+//
+//}

+ 154 - 154
easier-report-biz/src/main/java/com/yaoyicloud/render/foundation/FoundationBasicInfoRender.java

@@ -1,154 +1,154 @@
-package com.yaoyicloud.render.foundation;
-
-import java.io.IOException;
-
-import java.io.InputStream;
-import java.util.Map;
-import java.util.Objects;
-
-import com.deepoove.poi.config.Configure;
-import com.deepoove.poi.config.ConfigureBuilder;
-import com.deepoove.poi.policy.RenderPolicy;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.google.protobuf.InvalidProtocolBufferException;
-import com.google.protobuf.util.JsonFormat;
-import com.yaoyicloud.config.CommonDataCache;
-import com.yaoyicloud.config.FilerepoProperties;
-import com.yaoyicloud.message.FxyProtos;
-import com.yaoyicloud.factory.BasicAbstractRender;
-
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.collections4.MapUtils;
-
-/**
- * BasicInfo渲染器
- *
- */
-@Slf4j
-public final class FoundationBasicInfoRender extends BasicAbstractRender {
-    private final FilerepoProperties filerepoProperties;
-    private final CommonDataCache commonDataCache;
-
-    public FoundationBasicInfoRender(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();
-    }
-
-    /**
-     * Docx 渲染
-     *
-     * @param info 数据
-     * @param inputStream 模板内容
-     * @return 本地文件目录
-     * @throws IOException
-     */
-    public String renderDocx(String info, InputStream inputStream,
-        String relationId) throws IOException {
-        log.info("开始渲染基金会基础信息报告模块,relationId: {}", relationId);
-
-        // 配置POI-TL渲染器
-        ConfigureBuilder builder = Configure.builder();
-        RenderPolicy indicatorsRenderPolicyToProtobuf = this.indicatorsRenderPolicyToProtobuf();
-        builder.bind("basicInfoChecks", indicatorsRenderPolicyToProtobuf).bind("superiorAuthority",
-            indicatorsRenderPolicyToProtobuf);
-        builder.addPlugin('^', this.pictureRenderPolicy());
-        builder.useSpringEL();
-        // 通过默认protobuf实例来填充不存在的key
-        FxyProtos.BasicInfo.Builder basicInfoBuilder = FxyProtos.BasicInfo.newBuilder();
-        JsonFormat.parser().merge(info, basicInfoBuilder);
-        FxyProtos.BasicInfo defaultInstance = FxyProtos.BasicInfo.getDefaultInstance();
-        FxyProtos.BasicInfo 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>>() {});
-        data.replaceAll((k, v) -> v.equals("") ? "-" : v);
-
-        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
-        if (MapUtils.isNotEmpty(commonDataCacheData)) {
-            data.putAll(commonDataCacheData);
-        }
-
-        fillBasicDefaultValues(data);
-        try {
-            // 渲染文档
-            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "basicInfo");
-            log.info("渲染基金会基础信息报告模块成功,文件路径: {}", resultPath);
-            return resultPath;
-        } catch (Exception e) {
-            log.error("渲染基金会基础信息报告模块失败,relationId: {}", relationId, e);
-            throw new IOException("文档渲染失败", e);
-        }
-    }
-
-    /**
-     * 填充默认值,确保所有必要字段都存在
-     */
-    private void fillBasicDefaultValues(Map<String, Object> data)
-        throws InvalidProtocolBufferException, JsonProcessingException {
-        Map<String, Object> basicInfoSummary = (Map<String, Object>) data.get("basicInfoSummary");
-        basicInfoSummary.replaceAll((k, v) -> v.equals("") ? "-" : v);
-        Object netAsset = data.get("netAsset");
-        data.put("netAsset", netAsset + "元人民币");
-
-        Map<String, Object> foundationExt = (Map<String, Object>) data.get("foundationExt");
-        if (foundationExt == null) {
-            ObjectMapper objectMapper = new ObjectMapper();
-            FxyProtos.FoundationBasicInfoExt foundationBasicInfoExt =
-                FxyProtos.FoundationBasicInfoExt.getDefaultInstance();
-            String print = JsonFormat.printer()
-                .includingDefaultValueFields()
-                .print(foundationBasicInfoExt);
-            foundationExt = objectMapper.readValue(print, new TypeReference<Map<String, Object>>() {});
-            foundationExt.replaceAll((k, v) -> v.equals("") ? "-" : v);
-            data.put("foundationExt", foundationExt);
-        }
-
-        foundationExt.replaceAll((k, v) -> v.equals("") ? "-" : v);
-
-        Object lastYearSponsorshipDonationRatio = foundationExt.get("lastYearDonationIncome");
-        foundationExt.put("lastYearDonationIncome", lastYearSponsorshipDonationRatio + "万元人民币");
-        Object initialFund = foundationExt.get("initialFund");
-        foundationExt.put("initialFund", initialFund + "万人民币");
-
-        Object numberOfDirectors = foundationExt.get("numberOfDirectors");
-        if (numberOfDirectors.equals("-")) {
-            foundationExt.put("numberOfDirectors", 0);
-        }
-
-        Object certReceived = data.get("certReceived");
-        if (Objects.equals(certReceived, "-")) {
-            data.put("certReceived", "否");
-        }
-
-        Object bankLicense = data.get("bankLicense");
-        if (Objects.equals(bankLicense, "-")) {
-            data.put("bankLicense", "否");
-        }
-
-        Object annualInspectionResult = data.get("annualInspectionResult");
-        if (Objects.equals(annualInspectionResult, "-")) {
-            data.put("annualInspectionResult", "无");
-        }
-    }
-
-}
+//package com.yaoyicloud.render.foundation;
+//
+//import java.io.IOException;
+//
+//import java.io.InputStream;
+//import java.util.Map;
+//import java.util.Objects;
+//
+//import com.deepoove.poi.config.Configure;
+//import com.deepoove.poi.config.ConfigureBuilder;
+//import com.deepoove.poi.policy.RenderPolicy;
+//import com.fasterxml.jackson.core.JsonProcessingException;
+//import com.fasterxml.jackson.core.type.TypeReference;
+//import com.fasterxml.jackson.databind.ObjectMapper;
+//import com.google.protobuf.InvalidProtocolBufferException;
+//import com.google.protobuf.util.JsonFormat;
+//import com.yaoyicloud.config.CommonDataCache;
+//import com.yaoyicloud.config.FilerepoProperties;
+//import com.yaoyicloud.message.FxyProtos;
+//import com.yaoyicloud.factory.FXYAbstractRender;
+//
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.commons.collections4.MapUtils;
+//
+///**
+// * BasicInfo渲染器
+// *
+// */
+//@Slf4j
+//public final class FoundationBasicInfoRender extends FXYAbstractRender {
+//    private final FilerepoProperties filerepoProperties;
+//    private final CommonDataCache commonDataCache;
+//
+//    public FoundationBasicInfoRender(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();
+//    }
+//
+//    /**
+//     * Docx 渲染
+//     *
+//     * @param info 数据
+//     * @param inputStream 模板内容
+//     * @return 本地文件目录
+//     * @throws IOException
+//     */
+//    public String renderDocx(String info, InputStream inputStream,
+//        String relationId) throws IOException {
+//        log.info("开始渲染基金会基础信息报告模块,relationId: {}", relationId);
+//
+//        // 配置POI-TL渲染器
+//        ConfigureBuilder builder = Configure.builder();
+//        RenderPolicy indicatorsRenderPolicyToProtobuf = this.indicatorsRenderPolicyToProtobuf();
+//        builder.bind("basicInfoChecks", indicatorsRenderPolicyToProtobuf).bind("superiorAuthority",
+//            indicatorsRenderPolicyToProtobuf);
+//        builder.addPlugin('^', this.pictureRenderPolicy());
+//        builder.useSpringEL();
+//        // 通过默认protobuf实例来填充不存在的key
+//        FxyProtos.BasicInfo.Builder basicInfoBuilder = FxyProtos.BasicInfo.newBuilder();
+//        JsonFormat.parser().merge(info, basicInfoBuilder);
+//        FxyProtos.BasicInfo defaultInstance = FxyProtos.BasicInfo.getDefaultInstance();
+//        FxyProtos.BasicInfo 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>>() {});
+//        data.replaceAll((k, v) -> v.equals("") ? "-" : v);
+//
+//        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
+//        if (MapUtils.isNotEmpty(commonDataCacheData)) {
+//            data.putAll(commonDataCacheData);
+//        }
+//
+//        fillBasicDefaultValues(data);
+//        try {
+//            // 渲染文档
+//            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "basicInfo");
+//            log.info("渲染基金会基础信息报告模块成功,文件路径: {}", resultPath);
+//            return resultPath;
+//        } catch (Exception e) {
+//            log.error("渲染基金会基础信息报告模块失败,relationId: {}", relationId, e);
+//            throw new IOException("文档渲染失败", e);
+//        }
+//    }
+//
+//    /**
+//     * 填充默认值,确保所有必要字段都存在
+//     */
+//    private void fillBasicDefaultValues(Map<String, Object> data)
+//        throws InvalidProtocolBufferException, JsonProcessingException {
+//        Map<String, Object> basicInfoSummary = (Map<String, Object>) data.get("basicInfoSummary");
+//        basicInfoSummary.replaceAll((k, v) -> v.equals("") ? "-" : v);
+//        Object netAsset = data.get("netAsset");
+//        data.put("netAsset", netAsset + "元人民币");
+//
+//        Map<String, Object> foundationExt = (Map<String, Object>) data.get("foundationExt");
+//        if (foundationExt == null) {
+//            ObjectMapper objectMapper = new ObjectMapper();
+//            FxyProtos.FoundationBasicInfoExt foundationBasicInfoExt =
+//                FxyProtos.FoundationBasicInfoExt.getDefaultInstance();
+//            String print = JsonFormat.printer()
+//                .includingDefaultValueFields()
+//                .print(foundationBasicInfoExt);
+//            foundationExt = objectMapper.readValue(print, new TypeReference<Map<String, Object>>() {});
+//            foundationExt.replaceAll((k, v) -> v.equals("") ? "-" : v);
+//            data.put("foundationExt", foundationExt);
+//        }
+//
+//        foundationExt.replaceAll((k, v) -> v.equals("") ? "-" : v);
+//
+//        Object lastYearSponsorshipDonationRatio = foundationExt.get("lastYearDonationIncome");
+//        foundationExt.put("lastYearDonationIncome", lastYearSponsorshipDonationRatio + "万元人民币");
+//        Object initialFund = foundationExt.get("initialFund");
+//        foundationExt.put("initialFund", initialFund + "万人民币");
+//
+//        Object numberOfDirectors = foundationExt.get("numberOfDirectors");
+//        if (numberOfDirectors.equals("-")) {
+//            foundationExt.put("numberOfDirectors", 0);
+//        }
+//
+//        Object certReceived = data.get("certReceived");
+//        if (Objects.equals(certReceived, "-")) {
+//            data.put("certReceived", "否");
+//        }
+//
+//        Object bankLicense = data.get("bankLicense");
+//        if (Objects.equals(bankLicense, "-")) {
+//            data.put("bankLicense", "否");
+//        }
+//
+//        Object annualInspectionResult = data.get("annualInspectionResult");
+//        if (Objects.equals(annualInspectionResult, "-")) {
+//            data.put("annualInspectionResult", "无");
+//        }
+//    }
+//
+//}

+ 122 - 122
easier-report-biz/src/main/java/com/yaoyicloud/render/foundation/FoundationfinancialInfoRender.java

@@ -1,122 +1,122 @@
-package com.yaoyicloud.render.foundation;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import com.deepoove.poi.config.Configure;
-import com.deepoove.poi.config.ConfigureBuilder;
-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.message.FxyProtos;
-import com.yaoyicloud.factory.BasicAbstractRender;
-
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.MapUtils;
-
-
-/**
- * FinancialInfo渲染器
- *
- */
-@Slf4j
-public final class FoundationfinancialInfoRender extends BasicAbstractRender {
-    private final FilerepoProperties filerepoProperties;
-    private final CommonDataCache commonDataCache;
-    public FoundationfinancialInfoRender(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();
-    }
-
-    /**
-     * Docx 渲染
-     *
-     * @param info 数据
-     * @param inputStream 模板内容
-     * @return 本地文件目录
-     * @throws IOException
-     */
-
-    public String renderDocx(String info, InputStream inputStream, String relationId) throws IOException {
-        log.info("开始渲染基金会财务模块,relationId: {}", relationId);
-
-        // 配置POI-TL渲染器
-        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());
-        FxyProtos.FinancialInfo.Builder basicInfoBuilder = FxyProtos.FinancialInfo.newBuilder();
-        JsonFormat.parser().merge(info, basicInfoBuilder);
-
-        FxyProtos.FinancialInfo defaultInstance = FxyProtos.FinancialInfo.getDefaultInstance();
-        FxyProtos.FinancialInfo 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>>() {});
-        data.replaceAll((k, v) -> v.equals("") ? "-" : v);
-
-        fillBasicDefaultValues(data);
-        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
-        if (MapUtils.isNotEmpty(commonDataCacheData)) {
-            data.putAll(commonDataCacheData);
-        }
-        try {
-            // 渲染文档
-            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "financialInfo");
-            log.info("渲染基金会财务模块成功,文件路径: {}", resultPath);
-            return resultPath;
-        } catch (Exception e) {
-            log.error("渲染基金会财务模块失败,relationId: {}", relationId, e);
-            throw new IOException("文档渲染失败", e);
-        }
-    }
-
-    /**
-     * 填充默认值,确保所有必要字段都存在
-     */
-    private void fillBasicDefaultValues(Map<String, Object> data) {
-        Map<String, Object> basicInfoSummary = (Map<String, Object>) data.get("financialSummary");
-        basicInfoSummary.replaceAll((k, v) -> v.equals("") ? "-" : v);
-
-        List<Map<String, Object>> financialDataSeq = (List<Map<String, Object>>) data.get("financialDataSeq");
-        for (Map<String, Object> stringObjectMap : financialDataSeq) {
-            stringObjectMap.replaceAll((k, v) -> v.equals("") ? "-" : v);
-        }
-
-        List<Map<String, Object>> indicators = (List<Map<String, Object>>) data.get("indicators");
-        for (Map<String, Object> indicator : indicators) {
-            ArrayList<String> strings = (ArrayList<String>) indicator.get("values");
-            if (CollectionUtils.isEmpty(strings)) {
-                indicator.put("values", Arrays.asList("-", "-", "-"));
-
-            }
-        }
-    }
-
-
-
-}
+//package com.yaoyicloud.render.foundation;
+//
+//import java.io.IOException;
+//import java.io.InputStream;
+//import java.util.ArrayList;
+//import java.util.Arrays;
+//import java.util.List;
+//import java.util.Map;
+//
+//import com.deepoove.poi.config.Configure;
+//import com.deepoove.poi.config.ConfigureBuilder;
+//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.message.FxyProtos;
+//import com.yaoyicloud.factory.FXYAbstractRender;
+//
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.commons.collections4.CollectionUtils;
+//import org.apache.commons.collections4.MapUtils;
+//
+//
+///**
+// * FinancialInfo渲染器
+// *
+// */
+//@Slf4j
+//public final class FoundationfinancialInfoRender extends FXYAbstractRender {
+//    private final FilerepoProperties filerepoProperties;
+//    private final CommonDataCache commonDataCache;
+//    public FoundationfinancialInfoRender(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();
+//    }
+//
+//    /**
+//     * Docx 渲染
+//     *
+//     * @param info 数据
+//     * @param inputStream 模板内容
+//     * @return 本地文件目录
+//     * @throws IOException
+//     */
+//
+//    public String renderDocx(String info, InputStream inputStream, String relationId) throws IOException {
+//        log.info("开始渲染基金会财务模块,relationId: {}", relationId);
+//
+//        // 配置POI-TL渲染器
+//        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());
+//        FxyProtos.FinancialInfo.Builder basicInfoBuilder = FxyProtos.FinancialInfo.newBuilder();
+//        JsonFormat.parser().merge(info, basicInfoBuilder);
+//
+//        FxyProtos.FinancialInfo defaultInstance = FxyProtos.FinancialInfo.getDefaultInstance();
+//        FxyProtos.FinancialInfo 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>>() {});
+//        data.replaceAll((k, v) -> v.equals("") ? "-" : v);
+//
+//        fillBasicDefaultValues(data);
+//        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
+//        if (MapUtils.isNotEmpty(commonDataCacheData)) {
+//            data.putAll(commonDataCacheData);
+//        }
+//        try {
+//            // 渲染文档
+//            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "financialInfo");
+//            log.info("渲染基金会财务模块成功,文件路径: {}", resultPath);
+//            return resultPath;
+//        } catch (Exception e) {
+//            log.error("渲染基金会财务模块失败,relationId: {}", relationId, e);
+//            throw new IOException("文档渲染失败", e);
+//        }
+//    }
+//
+//    /**
+//     * 填充默认值,确保所有必要字段都存在
+//     */
+//    private void fillBasicDefaultValues(Map<String, Object> data) {
+//        Map<String, Object> basicInfoSummary = (Map<String, Object>) data.get("financialSummary");
+//        basicInfoSummary.replaceAll((k, v) -> v.equals("") ? "-" : v);
+//
+//        List<Map<String, Object>> financialDataSeq = (List<Map<String, Object>>) data.get("financialDataSeq");
+//        for (Map<String, Object> stringObjectMap : financialDataSeq) {
+//            stringObjectMap.replaceAll((k, v) -> v.equals("") ? "-" : v);
+//        }
+//
+//        List<Map<String, Object>> indicators = (List<Map<String, Object>>) data.get("indicators");
+//        for (Map<String, Object> indicator : indicators) {
+//            ArrayList<String> strings = (ArrayList<String>) indicator.get("values");
+//            if (CollectionUtils.isEmpty(strings)) {
+//                indicator.put("values", Arrays.asList("-", "-", "-"));
+//
+//            }
+//        }
+//    }
+//
+//
+//
+//}

+ 128 - 127
easier-report-biz/src/main/java/com/yaoyicloud/render/platform/AntiBriberyRender.java

@@ -1,127 +1,128 @@
-package com.yaoyicloud.render.platform;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-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.BasicAbstractRender;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.collections4.MapUtils;
-
-/**
- * AntiBribery渲染器
- *
- */
-@Slf4j
-public final class AntiBriberyRender extends BasicAbstractRender {
-    private final FilerepoProperties filerepoProperties;
-    private final CommonDataCache commonDataCache;
-
-    // 注入父类所需的 cwd 参数
-    public AntiBriberyRender(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();
-    }
-
-    /**
-     * Docx 渲染
-     *
-     * @param info 数据
-     * 
-     * @param inputStream 模板内容
-     * @param relationId 关联ID
-     * @return 本地文件目录
-     * @throws IOException
-     */
-    public String renderDocx(String info, InputStream inputStream, String relationId) throws IOException {
-        log.info("开始渲染防贿赂报告,relationId: {}", relationId);
-
-        // 配置POI-TL渲染器
-        ConfigureBuilder builder = Configure.builder();
-        RenderPolicy indicatorsRenderPolicy = this.indicatorsRenderPolicy();
-        builder.bind("questionnaireItems", indicatorsRenderPolicy);
-
-        // 解析数据
-        ObjectMapper objectMapper = new ObjectMapper();
-        Map<String, Object> data = objectMapper.readValue(info, new TypeReference<Map<String, Object>>() {});
-
-        fillDefaultValues(data);
-        data.replaceAll((k, v) -> v == null ? "-" : v);
-        Map<String, Object> commonData = commonDataCache.getData(cwd);
-        if (MapUtils.isNotEmpty(commonData)) {
-            data.putAll(commonData);
-        }
-
-        try {
-            // 渲染文档
-           String resultPath = this.renderDocx(data, inputStream, builder, relationId, "antiBribery");
-            log.info("防贿赂报告渲染成功,文件路径: {}", resultPath);
-            return resultPath;
-        } catch (Exception e) {
-            log.error("防贿赂报告渲染失败,relationId: {}", relationId, e);
-            throw new IOException("文档渲染失败", e);
-        }
-    }
-
-    /**
-     * 填充默认值,确保所有必要字段都存在
-     */
-    private void fillDefaultValues(Map<String, Object> data) {
-        // 处理 questionnaireItems 列表
-        if (!data.containsKey("questionnaireItems") || data.get("questionnaireItems") == null) {
-            List<Map<String, Object>> defaultItems = new ArrayList<>();
-            Map<String, Object> defaultItem = new HashMap<>();
-            defaultItem.put("id", 1);
-            defaultItem.put("question", "-");
-            defaultItem.put("answer", "-");
-            defaultItems.add(defaultItem);
-            data.put("questionnaireItems", defaultItems);
-        } else {
-            // 确保列表中的每个项目都有所有字段
-            @SuppressWarnings("unchecked")
-            List<Map<String, Object>> items = (List<Map<String, Object>>) data.get("questionnaireItems");
-            for (Map<String, Object> item : items) {
-                item.putIfAbsent("id", 1);
-                item.putIfAbsent("question", "-");
-                item.putIfAbsent("answer", "-");
-            }
-        }
-
-        // 处理 antiBriberySummary 对象
-        if (!data.containsKey("antiBriberySummary") || data.get("antiBriberySummary") == null) {
-            Map<String, Object> defaultSummary = new HashMap<>();
-            defaultSummary.put("score", "-");
-            defaultSummary.put("riskSummary", "-");
-            defaultSummary.put("suggestion", "-");
-            data.put("antiBriberySummary", defaultSummary);
-        } else {
-            @SuppressWarnings("unchecked")
-            Map<String, Object> summary = (Map<String, Object>) data.get("antiBriberySummary");
-            summary.putIfAbsent("score", "-");
-            summary.putIfAbsent("riskSummary", "-");
-            summary.putIfAbsent("suggestion", "-");
-        }
-    }
-
-}
+//package com.yaoyicloud.render.platform;
+//
+//import java.io.IOException;
+//import java.io.InputStream;
+//import java.util.ArrayList;
+//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.MapUtils;
+//
+///**
+// * AntiBribery渲染器
+// *
+// */
+//@Slf4j
+//public final class AntiBriberyRender extends FXYAbstractRender {
+//    private final FilerepoProperties filerepoProperties;
+//    private final CommonDataCache commonDataCache;
+//
+//    // 注入父类所需的 cwd 参数
+//    public AntiBriberyRender(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();
+//    }
+//
+//    /**
+//     * Docx 渲染
+//     *
+//     * @param info 数据
+//     *
+//     * @param inputStream 模板内容
+//     * @param relationId 关联ID
+//     * @return 本地文件目录
+//     * @throws IOException
+//     */
+//    public String renderDocx(String info, InputStream inputStream, String relationId) throws IOException {
+//        log.info("开始渲染防贿赂报告,relationId: {}", relationId);
+//
+//        // 配置POI-TL渲染器
+//        ConfigureBuilder builder = Configure.builder();
+//        RenderPolicy indicatorsRenderPolicy = this.indicatorsRenderPolicy();
+//        builder.bind("questionnaireItems", indicatorsRenderPolicy);
+//
+//        // 解析数据
+//        ObjectMapper objectMapper = new ObjectMapper();
+//        Map<String, Object> data = objectMapper.readValue(info, new TypeReference<Map<String, Object>>() {});
+//
+//        fillDefaultValues(data);
+//        data.replaceAll((k, v) -> v == null ? "-" : v);
+//        Map<String, Object> commonData = commonDataCache.getData(cwd);
+//        if (MapUtils.isNotEmpty(commonData)) {
+//            data.putAll(commonData);
+//        }
+//
+//        try {
+//            this.
+//            // 渲染文档
+//           String resultPath = this.renderDocx(data, inputStream, builder, relationId, "antiBribery");
+//            log.info("防贿赂报告渲染成功,文件路径: {}", resultPath);
+//            return resultPath;
+//        } catch (Exception e) {
+//            log.error("防贿赂报告渲染失败,relationId: {}", relationId, e);
+//            throw new IOException("文档渲染失败", e);
+//        }
+//    }
+//
+//    /**
+//     * 填充默认值,确保所有必要字段都存在
+//     */
+//    private void fillDefaultValues(Map<String, Object> data) {
+//        // 处理 questionnaireItems 列表
+//        if (!data.containsKey("questionnaireItems") || data.get("questionnaireItems") == null) {
+//            List<Map<String, Object>> defaultItems = new ArrayList<>();
+//            Map<String, Object> defaultItem = new HashMap<>();
+//            defaultItem.put("id", 1);
+//            defaultItem.put("question", "-");
+//            defaultItem.put("answer", "-");
+//            defaultItems.add(defaultItem);
+//            data.put("questionnaireItems", defaultItems);
+//        } else {
+//            // 确保列表中的每个项目都有所有字段
+//            @SuppressWarnings("unchecked")
+//            List<Map<String, Object>> items = (List<Map<String, Object>>) data.get("questionnaireItems");
+//            for (Map<String, Object> item : items) {
+//                item.putIfAbsent("id", 1);
+//                item.putIfAbsent("question", "-");
+//                item.putIfAbsent("answer", "-");
+//            }
+//        }
+//
+//        // 处理 antiBriberySummary 对象
+//        if (!data.containsKey("antiBriberySummary") || data.get("antiBriberySummary") == null) {
+//            Map<String, Object> defaultSummary = new HashMap<>();
+//            defaultSummary.put("score", "-");
+//            defaultSummary.put("riskSummary", "-");
+//            defaultSummary.put("suggestion", "-");
+//            data.put("antiBriberySummary", defaultSummary);
+//        } else {
+//            @SuppressWarnings("unchecked")
+//            Map<String, Object> summary = (Map<String, Object>) data.get("antiBriberySummary");
+//            summary.putIfAbsent("score", "-");
+//            summary.putIfAbsent("riskSummary", "-");
+//            summary.putIfAbsent("suggestion", "-");
+//        }
+//    }
+//
+//}

+ 25 - 34
easier-report-biz/src/main/java/com/yaoyicloud/render/platform/AttachmentSectionRender.java

@@ -1,7 +1,6 @@
 package com.yaoyicloud.render.platform;
 
 import java.io.IOException;
-import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -10,8 +9,8 @@ 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 com.yaoyicloud.message.FxyProtos;
-import com.yaoyicloud.factory.BasicAbstractRender;
 import lombok.extern.slf4j.Slf4j;
 
 import com.deepoove.poi.config.Configure;
@@ -25,7 +24,7 @@ import org.apache.commons.collections4.MapUtils;
  *
  */
 @Slf4j
-public final class AttachmentSectionRender extends BasicAbstractRender {
+public final class AttachmentSectionRender extends FXYAbstractRender {
     private final FilerepoProperties filerepoProperties;
     private final CommonDataCache commonDataCache;
     public AttachmentSectionRender(String cwd, FilerepoProperties filerepoProperties, CommonDataCache commonDataCache) {
@@ -33,32 +32,12 @@ public final class AttachmentSectionRender extends BasicAbstractRender {
         this.filerepoProperties = filerepoProperties;
         this.commonDataCache = commonDataCache;
     }
-    @Override
-    protected String getBasicPath() throws IOException {
-        return filerepoProperties.getBasePath();
-    }
 
     @Override
-    protected String getReportImagePath() {
-        return filerepoProperties.getReportImagePath();
-    }
-
-    /**
-     * Docx 渲染
-     *
-     * @param info 数据
-     * @param inputStream 模板内容
-     * @return 本地文件目录
-     * @throws IOException
-     */
-
-    public String renderDocx(String info, InputStream inputStream, String relationId, Integer counter) throws IOException {
+    protected Map<String, Object> renderDocx(String info, String relationId, Integer counter) throws IOException {
         log.info("开始渲染附件模块,relationId: {}", relationId);
 
-        // 配置POI-TL渲染器
-        ConfigureBuilder builder = Configure.builder();
-        builder.addPlugin('^',  this.pictureRenderPolicy());
-        builder.addPlugin('`',  this.hyperlinkRenderPolicy());
+
 
         FxyProtos.AttachmentSection.Builder attachmentSection = FxyProtos.AttachmentSection.newBuilder();
         JsonFormat.parser().merge(info, attachmentSection);
@@ -93,17 +72,29 @@ public final class AttachmentSectionRender extends BasicAbstractRender {
         }
         data.put("levelInteger", counter);
         fillDefaultValues(data);
-        try {
-            // 渲染文档
-            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "attachmentSection");
-            log.info("渲染附件模块成功,文件路径: {}", resultPath);
-            return resultPath;
-        } catch (Exception e) {
-            log.error("渲染附件模块失败,relationId: {}", relationId, e);
-            throw new IOException("文档渲染失败", e);
-        }
+        return data;
     }
 
+    @Override
+    protected ConfigureBuilder builder() {
+        // 配置POI-TL渲染器
+        ConfigureBuilder builder = Configure.builder();
+        builder.addPlugin('^',  this.pictureRenderPolicy());
+        builder.addPlugin('`',  this.hyperlinkRenderPolicy());
+        return builder;
+    }
+
+    @Override
+    protected String getBasicPath() throws IOException {
+        return filerepoProperties.getBasePath();
+    }
+
+    @Override
+    protected String getReportImagePath() {
+        return filerepoProperties.getReportImagePath();
+    }
+
+
 
     /**
      * 填充默认值,确保所有必要字段都存在

+ 123 - 123
easier-report-biz/src/main/java/com/yaoyicloud/render/platform/BasicInfoRender.java

@@ -1,123 +1,123 @@
-package com.yaoyicloud.render.platform;
-
-import java.io.IOException;
-
-import java.io.InputStream;
-import java.util.Map;
-import java.util.Objects;
-
-
-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.message.FxyProtos;
-import com.yaoyicloud.factory.BasicAbstractRender;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.collections4.MapUtils;
-
-/**
- * BasicInfo渲染器
- *
- */
-@Slf4j
-public final class BasicInfoRender extends BasicAbstractRender {
-    private final FilerepoProperties filerepoProperties;
-    private final CommonDataCache commonDataCache;
-
-    public BasicInfoRender(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();
-    }
-
-    /**
-     * Docx 渲染
-     *
-     * @param info 数据
-     * @param inputStream 模板内容
-     * @return 本地文件目录
-     * @throws IOException
-     */
-    public String renderDocx(String info, InputStream inputStream, String relationId) throws IOException {
-        log.info("开始渲染基础信息报告模块,relationId: {}", relationId);
-
-        // 配置POI-TL渲染器
-        ConfigureBuilder builder = Configure.builder();
-        RenderPolicy indicatorsRenderPolicy = this.indicatorsRenderPolicy();
-        builder.bind("basicInfoChecks", indicatorsRenderPolicy);
-        builder.addPlugin('^',  this.pictureRenderPolicy());
-        //通过默认protobuf实例来填充不存在的key
-        FxyProtos.BasicInfo.Builder basicInfoBuilder = FxyProtos.BasicInfo.newBuilder();
-        JsonFormat.parser().merge(info, basicInfoBuilder);
-
-        FxyProtos.BasicInfo defaultInstance = FxyProtos.BasicInfo.getDefaultInstance();
-        FxyProtos.BasicInfo 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>>() {});
-        data.replaceAll((k, v) -> v.equals("") ? "-" : v);
-
-
-        fillBasicDefaultValues(data);
-        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
-        if (MapUtils.isNotEmpty(commonDataCacheData)) {
-            data.putAll(commonDataCacheData);
-        }
-        try {
-            // 渲染文档
-            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "basicInfo");
-            log.info("渲染基础信息报告模块成功,文件路径: {}", resultPath);
-            return resultPath;
-        } catch (Exception e) {
-            log.error("渲染基础信息报告模块失败,relationId: {}", relationId, e);
-            throw new IOException("文档渲染失败", e);
-        }
-    }
-
-    /**
-     * 填充默认值,确保所有必要字段都存在
-     */
-    private void fillBasicDefaultValues(Map<String, Object> data) {
-        Map<String, Object> basicInfoSummary = (Map<String, Object>) data.get("basicInfoSummary");
-        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 certReceived = data.get("certReceived");
-        if (Objects.equals(certReceived, "-")) {
-            data.put("certReceived", "否");
-        }
-
-        Object bankLicense = data.get("bankLicense");
-        if (Objects.equals(bankLicense, "-")) {
-            data.put("bankLicense", "否");
-        }
-
-        Object annualInspectionResult = data.get("annualInspectionResult");
-        if (Objects.equals(annualInspectionResult, "-")) {
-            data.put("annualInspectionResult", "否");
-        }
-    }
-
-}
+//package com.yaoyicloud.render.platform;
+//
+//import java.io.IOException;
+//
+//import java.io.InputStream;
+//import java.util.Map;
+//import java.util.Objects;
+//
+//
+//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.message.FxyProtos;
+//import com.yaoyicloud.factory.FXYAbstractRender;
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.commons.collections4.MapUtils;
+//
+///**
+// * BasicInfo渲染器
+// *
+// */
+//@Slf4j
+//public final class BasicInfoRender extends FXYAbstractRender {
+//    private final FilerepoProperties filerepoProperties;
+//    private final CommonDataCache commonDataCache;
+//
+//    public BasicInfoRender(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();
+//    }
+//
+//    /**
+//     * Docx 渲染
+//     *
+//     * @param info 数据
+//     * @param inputStream 模板内容
+//     * @return 本地文件目录
+//     * @throws IOException
+//     */
+//    public String renderDocx(String info, InputStream inputStream, String relationId) throws IOException {
+//        log.info("开始渲染基础信息报告模块,relationId: {}", relationId);
+//
+//        // 配置POI-TL渲染器
+//        ConfigureBuilder builder = Configure.builder();
+//        RenderPolicy indicatorsRenderPolicy = this.indicatorsRenderPolicy();
+//        builder.bind("basicInfoChecks", indicatorsRenderPolicy);
+//        builder.addPlugin('^',  this.pictureRenderPolicy());
+//        //通过默认protobuf实例来填充不存在的key
+//        FxyProtos.BasicInfo.Builder basicInfoBuilder = FxyProtos.BasicInfo.newBuilder();
+//        JsonFormat.parser().merge(info, basicInfoBuilder);
+//
+//        FxyProtos.BasicInfo defaultInstance = FxyProtos.BasicInfo.getDefaultInstance();
+//        FxyProtos.BasicInfo 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>>() {});
+//        data.replaceAll((k, v) -> v.equals("") ? "-" : v);
+//
+//
+//        fillBasicDefaultValues(data);
+//        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
+//        if (MapUtils.isNotEmpty(commonDataCacheData)) {
+//            data.putAll(commonDataCacheData);
+//        }
+//        try {
+//            // 渲染文档
+//            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "basicInfo");
+//            log.info("渲染基础信息报告模块成功,文件路径: {}", resultPath);
+//            return resultPath;
+//        } catch (Exception e) {
+//            log.error("渲染基础信息报告模块失败,relationId: {}", relationId, e);
+//            throw new IOException("文档渲染失败", e);
+//        }
+//    }
+//
+//    /**
+//     * 填充默认值,确保所有必要字段都存在
+//     */
+//    private void fillBasicDefaultValues(Map<String, Object> data) {
+//        Map<String, Object> basicInfoSummary = (Map<String, Object>) data.get("basicInfoSummary");
+//        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 certReceived = data.get("certReceived");
+//        if (Objects.equals(certReceived, "-")) {
+//            data.put("certReceived", "否");
+//        }
+//
+//        Object bankLicense = data.get("bankLicense");
+//        if (Objects.equals(bankLicense, "-")) {
+//            data.put("bankLicense", "否");
+//        }
+//
+//        Object annualInspectionResult = data.get("annualInspectionResult");
+//        if (Objects.equals(annualInspectionResult, "-")) {
+//            data.put("annualInspectionResult", "否");
+//        }
+//    }
+//
+//}

+ 106 - 106
easier-report-biz/src/main/java/com/yaoyicloud/render/platform/FinancialInfoRender.java

@@ -1,106 +1,106 @@
-package com.yaoyicloud.render.platform;
-
-import java.io.IOException;
-
-import java.io.InputStream;
-import java.util.Map;
-
-
-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.message.FxyProtos;
-import com.yaoyicloud.factory.BasicAbstractRender;
-import lombok.extern.slf4j.Slf4j;
-
-import com.deepoove.poi.config.Configure;
-import com.deepoove.poi.config.ConfigureBuilder;
-
-import com.google.protobuf.util.JsonFormat;
-import org.apache.commons.collections4.MapUtils;
-
-
-/**
- * FinancialInfo渲染器
- *
- */
-@Slf4j
-public final class FinancialInfoRender extends BasicAbstractRender {
-    private final FilerepoProperties filerepoProperties;
-    private final CommonDataCache commonDataCache;
-    public FinancialInfoRender(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();
-    }
-
-    /**
-     * Docx 渲染
-     *
-     * @param info 数据
-     * @param inputStream 模板内容
-     * @return 本地文件目录
-     * @throws IOException
-     */
-
-    public String renderDocx(String info, InputStream inputStream, String relationId) throws IOException {
-        log.info("开始渲染财务模块,relationId: {}", relationId);
-
-        // 配置POI-TL渲染器
-        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());
-        FxyProtos.FinancialInfo.Builder basicInfoBuilder = FxyProtos.FinancialInfo.newBuilder();
-        JsonFormat.parser().merge(info, basicInfoBuilder);
-
-        FxyProtos.FinancialInfo defaultInstance = FxyProtos.FinancialInfo.getDefaultInstance();
-        FxyProtos.FinancialInfo 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>>() {});
-        data.replaceAll((k, v) -> v.equals("") ? "-" : v);
-        fillBasicDefaultValues(data);
-        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
-        if (MapUtils.isNotEmpty(commonDataCacheData)) {
-            data.putAll(commonDataCacheData);
-        }
-        try {
-            // 渲染文档
-           // String resultPath = this.renderDocx(data, inputStream, builder, relationId, "financialInfo");
-            String resultPath = null;
-            log.info("渲染财务模块成功,文件路径: {}", resultPath);
-            return resultPath;
-        } catch (Exception e) {
-            log.error("渲染财务模块失败,relationId: {}", relationId, e);
-            throw new IOException("文档渲染失败", e);
-        }
-    }
-    /**
-     * 填充默认值,确保所有必要字段都存在
-     */
-    private void fillBasicDefaultValues(Map<String, Object> data) {
-        Map<String, Object> basicInfoSummary = (Map<String, Object>) data.get("financialSummary");
-        basicInfoSummary.replaceAll((k, v) -> v.equals("") ? "-" : v);
-    }
-
-
-
-}
+//package com.yaoyicloud.render.platform;
+//
+//import java.io.IOException;
+//
+//import java.io.InputStream;
+//import java.util.Map;
+//
+//
+//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.message.FxyProtos;
+//import com.yaoyicloud.factory.FXYAbstractRender;
+//import lombok.extern.slf4j.Slf4j;
+//
+//import com.deepoove.poi.config.Configure;
+//import com.deepoove.poi.config.ConfigureBuilder;
+//
+//import com.google.protobuf.util.JsonFormat;
+//import org.apache.commons.collections4.MapUtils;
+//
+//
+///**
+// * FinancialInfo渲染器
+// *
+// */
+//@Slf4j
+//public final class FinancialInfoRender extends FXYAbstractRender {
+//    private final FilerepoProperties filerepoProperties;
+//    private final CommonDataCache commonDataCache;
+//    public FinancialInfoRender(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();
+//    }
+//
+//    /**
+//     * Docx 渲染
+//     *
+//     * @param info 数据
+//     * @param inputStream 模板内容
+//     * @return 本地文件目录
+//     * @throws IOException
+//     */
+//
+//    public String renderDocx(String info, InputStream inputStream, String relationId) throws IOException {
+//        log.info("开始渲染财务模块,relationId: {}", relationId);
+//
+//        // 配置POI-TL渲染器
+//        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());
+//        FxyProtos.FinancialInfo.Builder basicInfoBuilder = FxyProtos.FinancialInfo.newBuilder();
+//        JsonFormat.parser().merge(info, basicInfoBuilder);
+//
+//        FxyProtos.FinancialInfo defaultInstance = FxyProtos.FinancialInfo.getDefaultInstance();
+//        FxyProtos.FinancialInfo 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>>() {});
+//        data.replaceAll((k, v) -> v.equals("") ? "-" : v);
+//        fillBasicDefaultValues(data);
+//        Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
+//        if (MapUtils.isNotEmpty(commonDataCacheData)) {
+//            data.putAll(commonDataCacheData);
+//        }
+//        try {
+//            // 渲染文档
+//           // String resultPath = this.renderDocx(data, inputStream, builder, relationId, "financialInfo");
+//            String resultPath = null;
+//            log.info("渲染财务模块成功,文件路径: {}", resultPath);
+//            return resultPath;
+//        } catch (Exception e) {
+//            log.error("渲染财务模块失败,relationId: {}", relationId, e);
+//            throw new IOException("文档渲染失败", e);
+//        }
+//    }
+//    /**
+//     * 填充默认值,确保所有必要字段都存在
+//     */
+//    private void fillBasicDefaultValues(Map<String, Object> data) {
+//        Map<String, Object> basicInfoSummary = (Map<String, Object>) data.get("financialSummary");
+//        basicInfoSummary.replaceAll((k, v) -> v.equals("") ? "-" : v);
+//    }
+//
+//
+//
+//}

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

@@ -1,7 +1,7 @@
 package com.yaoyicloud.render.platform.update;
 
 import java.io.IOException;
-import java.io.InputStream;
+
 import java.util.Map;
 import com.deepoove.poi.config.Configure;
 import com.deepoove.poi.config.ConfigureBuilder;
@@ -11,14 +11,14 @@ 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.BasicAbstractRender;
+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 BasicAbstractRender {
+public final class AntiBriberyNewRender extends FXYAbstractRender {
     private final FilerepoProperties filerepoProperties;
     private final CommonDataCache commonDataCache;
 
@@ -39,40 +39,22 @@ public final class AntiBriberyNewRender extends BasicAbstractRender {
         return filerepoProperties.getReportImagePath();
     }
 
-    /**
-     * Docx 渲染
-     *
-     * @param info 数据
-     * @param inputStream 模板内容
-     * @param relationId 关联ID
-     * @return 本地文件目录
-     * @throws IOException
-     */
-    public String renderDocx(String info, InputStream inputStream, String relationId, Integer counter)
-        throws IOException {
+    @Override
+    protected Map<String, Object> renderDocx(String info, String relationId, Integer counter) throws IOException {
         log.info("开始渲染其他风险报告模块,relationId: {}", relationId);
 
-        // 配置POI-TL渲染器
-        ConfigureBuilder builder = Configure.builder();
-        RenderPolicy indicatorsRenderPolicy = this.indicatorsRenderPolicyToProtobuf();
-        builder.bind("questionnaireItems", indicatorsRenderPolicy);
-        builder.bind("otherRiskChecks", indicatorsRenderPolicy);
-
-        builder.useSpringEL();
-        // 解析数据
-
         // 通过默认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();
+                .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>>() {});
         Map<String, Object> commonDataCacheData = commonDataCache.getData(relationId);
@@ -84,16 +66,18 @@ public final class AntiBriberyNewRender extends BasicAbstractRender {
         // 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;
+    }
 
-        try {
-            // 渲染文档
-            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "antiBribery");
-            log.info("其他风险报告模块渲染成功,文件路径: {}", resultPath);
-            return resultPath;
-        } catch (Exception e) {
-            log.error("其他风险报告模块渲染失败,relationId: {}", relationId, e);
-            throw new IOException("文档渲染失败", e);
-        }
+    @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;
     }
 
     /**
@@ -105,4 +89,6 @@ public final class AntiBriberyNewRender extends BasicAbstractRender {
 
     }
 
+
+
 }

+ 34 - 44
easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/BasicInfoNewRender.java → easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/FXYInfoNewRender.java

@@ -1,7 +1,6 @@
 package com.yaoyicloud.render.platform.update;
 
 import java.io.IOException;
-import java.io.InputStream;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -14,7 +13,7 @@ import com.google.protobuf.Descriptors;
 import com.google.protobuf.util.JsonFormat;
 import com.yaoyicloud.config.CommonDataCache;
 import com.yaoyicloud.config.FilerepoProperties;
-import com.yaoyicloud.factory.BasicAbstractRender;
+import com.yaoyicloud.factory.FXYAbstractRender;
 import com.yaoyicloud.message.FxyProtos;
 
 
@@ -26,59 +25,34 @@ import org.apache.commons.collections4.MapUtils;
  *
  */
 @Slf4j
-public final class BasicInfoNewRender extends BasicAbstractRender {
+public final class FXYInfoNewRender extends FXYAbstractRender {
     private final FilerepoProperties filerepoProperties;
     private final CommonDataCache commonDataCache;
 
-    public BasicInfoNewRender(String cwd, FilerepoProperties filerepoProperties, CommonDataCache commonDataCache) {
+    public FXYInfoNewRender(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();
-    }
-
-    /**
-     * Docx 渲染
-     *
-     * @param info 数据
-     * @param inputStream 模板内容
-     * @return 本地文件目录
-     * @throws IOException
-     */
-    public String renderDocx(String info, InputStream inputStream,
-                             String relationId, Integer counter) throws IOException {
+    protected Map<String, Object> renderDocx(String info, String relationId, Integer counter) throws IOException {
         log.info("开始渲染工商信息报告模块,relationId: {}", relationId);
 
         // 配置POI-TL渲染器
-        ConfigureBuilder builder = Configure.builder();
-        RenderPolicy indicatorsRenderPolicy = this.indicatorsRenderPolicy();
-        RenderPolicy deleteLoopRowTableRenderPolicy = this.deleteLoopRowTableRenderPolicy();
-        builder.bind("basicInfoChecks", indicatorsRenderPolicy);
-        builder.bind("sameaddress", deleteLoopRowTableRenderPolicy);
-        builder.bind("samecontactNumberDatas", deleteLoopRowTableRenderPolicy);
-        builder.addPlugin('^', this.pictureRenderPolicy());
-         builder.useSpringEL();
+
         // 通过默认protobuf实例来填充不存在的key
         FxyProtos.BasicInfo.Builder basicInfoBuilder = FxyProtos.BasicInfo.newBuilder();
         JsonFormat.parser().merge(info, basicInfoBuilder);
 
         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>>() {});
@@ -107,17 +81,33 @@ public final class BasicInfoNewRender extends BasicAbstractRender {
 //        Map<String, Object> basicInfoSummary = (Map<String, Object>) data.get("basicInfoSummary");
 //        basicInfoSummary.put("riskSummary",
 //            basicInfoSummary.get("riskSummary").equals("") ? "-" : basicInfoSummary.get("riskSummary"));
-        try {
-            // 渲染文档
-            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "basicInfo");
-            log.info("渲染工商信息报告模块成功,文件路径: {}", resultPath);
-            return resultPath;
-        } catch (Exception e) {
-            log.error("渲染工商信息报告模块失败,relationId: {}", relationId, e);
-            throw new IOException("文档渲染失败", e);
-        }
+        return data;
     }
 
+    @Override
+    protected ConfigureBuilder builder() {
+        ConfigureBuilder builder = Configure.builder();
+        RenderPolicy indicatorsRenderPolicy = this.indicatorsRenderPolicy();
+        RenderPolicy deleteLoopRowTableRenderPolicy = this.deleteLoopRowTableRenderPolicy();
+        builder.bind("basicInfoChecks", indicatorsRenderPolicy);
+        builder.bind("sameaddress", deleteLoopRowTableRenderPolicy);
+        builder.bind("samecontactNumberDatas", deleteLoopRowTableRenderPolicy);
+        builder.addPlugin('^', this.pictureRenderPolicy());
+        builder.useSpringEL();
+        return builder;
+    }
+
+    @Override
+    protected String getBasicPath() throws IOException {
+        return filerepoProperties.getBasePath();
+    }
+
+    @Override
+    protected String getReportImagePath() {
+        return filerepoProperties.getReportImagePath();
+    }
+
+
     /**
      * 填充默认值,确保所有必要字段都存在
      */

+ 33 - 43
easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/FinancialInfoNewRender.java

@@ -1,7 +1,6 @@
 package com.yaoyicloud.render.platform.update;
 
 import java.io.IOException;
-import java.io.InputStream;
 import java.util.Map;
 import java.util.Objects;
 
@@ -12,7 +11,7 @@ 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.BasicAbstractRender;
+import com.yaoyicloud.factory.FXYAbstractRender;
 import com.yaoyicloud.message.FxyProtos;
 
 
@@ -24,7 +23,7 @@ import org.apache.commons.collections4.MapUtils;
  *
  */
 @Slf4j
-public final class FinancialInfoNewRender extends BasicAbstractRender {
+public final class FinancialInfoNewRender extends FXYAbstractRender {
     private final FilerepoProperties filerepoProperties;
     private final CommonDataCache commonDataCache;
 
@@ -35,47 +34,22 @@ public final class FinancialInfoNewRender extends BasicAbstractRender {
     }
 
     @Override
-    protected String getBasicPath() throws IOException {
-        return filerepoProperties.getBasePath();
-    }
-
-    @Override
-    protected String getReportImagePath() {
-        return filerepoProperties.getReportImagePath();
-    }
-
-    /**
-     * Docx 渲染
-     *
-     * @param info 数据
-     * @param inputStream 模板内容
-     * @return 本地文件目录
-     * @throws IOException
-     */
-
-    public String renderDocx(String info, InputStream inputStream, String relationId, Integer counter)
-        throws IOException {
+    protected Map<String, Object> renderDocx(String info, String relationId, Integer counter) throws IOException {
         log.info("开始渲染财务模块,relationId: {}", relationId);
 
-        // 配置POI-TL渲染器
-        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());
+
         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);
@@ -88,17 +62,33 @@ public final class FinancialInfoNewRender extends BasicAbstractRender {
         data.put("levelInteger", counter);
         // Map<String, Object> financialSummary = (Map<String, Object>) data.get("financialSummary");
         // data.put("fiancescore", financialSummary.get("score"));
-        try {
-            // 渲染文档
-            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "financialInfo");
-            log.info("渲染财务模块成功,文件路径: {}", resultPath);
-            return resultPath;
-        } catch (Exception e) {
-            log.error("渲染财务模块失败,relationId: {}", relationId, e);
-            throw new IOException("文档渲染失败", e);
-        }
+        return data;
+    }
+
+    @Override
+    protected ConfigureBuilder builder() {
+        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());
+        return builder;
     }
 
+    @Override
+    protected String getBasicPath() throws IOException {
+        return filerepoProperties.getBasePath();
+    }
+
+    @Override
+    protected String getReportImagePath() {
+        return filerepoProperties.getReportImagePath();
+    }
+
+
+
     /**
      * 填充默认值,确保所有必要字段都存在
      */

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

@@ -1,7 +1,6 @@
 package com.yaoyicloud.render.platform.update;
 
 import java.io.IOException;
-import java.io.InputStream;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -15,13 +14,13 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.yaoyicloud.config.CommonDataCache;
 import com.yaoyicloud.config.FilerepoProperties;
 
-import com.yaoyicloud.factory.BasicAbstractRender;
+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 BasicAbstractRender {
+public final class PublicRecordNewRender extends FXYAbstractRender {
     private final FilerepoProperties filerepoProperties;
     private final CommonDataCache commonDataCache;
 
@@ -32,37 +31,10 @@ public final class PublicRecordNewRender extends BasicAbstractRender {
     }
 
     @Override
-    protected String getBasicPath() throws IOException {
-        return filerepoProperties.getBasePath();
-    }
-
-    @Override
-    protected String getReportImagePath() {
-        return filerepoProperties.getReportImagePath();
-    }
-
-    /**
-     * Docx 渲染
-     *
-     * @param info 数据
-     * @param inputStream 模板内容
-     * @return 本地文件目录
-     * @throws IOException
-     */
-
-    public String renderDocx(String info, InputStream inputStream,
-        String relationId, Integer counter) throws IOException {
+    protected Map<String, Object> renderDocx(String info, String relationId, Integer counter) throws IOException {
         log.info("开始渲染司法风险模块,relationId: {}", relationId);
 
-        // 配置POI-TL渲染器
-        ConfigureBuilder builder = Configure.builder();
-        RenderPolicy indicatorsRenderPolicy = this.indicatorsRenderPolicyToProtobuf();
 
-        builder.bind("dishonestPersons", indicatorsRenderPolicy);
-        builder.bind("judicialRiskChecks", indicatorsRenderPolicy);
-
-        builder.bind("severeViolations", indicatorsRenderPolicy);
-        builder.useSpringEL();
 
         ObjectMapper objectMapper = new ObjectMapper();
         Map<String, Object> data = objectMapper.readValue(info, new TypeReference<Map<String, Object>>() {});
@@ -78,17 +50,35 @@ public final class PublicRecordNewRender extends BasicAbstractRender {
             data.putAll(commonDataCacheData);
         }
         data.put("levelInteger", counter);
-        try {
-            // 渲染文档
-            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "publicRecord");
-            log.info("渲染司法风险模块成功,文件路径: {}", resultPath);
-            return resultPath;
-        } catch (Exception e) {
-            log.error("渲染司法风险模块失败,relationId: {}", relationId, e);
-            throw new IOException("文档渲染失败", e);
-        }
+        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();
+    }
+
+
+
     /**
      * 填充默认值,确保所有必要字段都存在
      */

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

@@ -1,13 +1,12 @@
 package com.yaoyicloud.render.platform.update;
 
 import java.io.IOException;
-import java.io.InputStream;
 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.BasicAbstractRender;
+import com.yaoyicloud.factory.FXYAbstractRender;
 import com.yaoyicloud.message.FxyProtos;
 import org.apache.commons.collections4.CollectionUtils;
 
@@ -23,7 +22,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.MapUtils;
 
 @Slf4j
-public final class TaxNewRender extends BasicAbstractRender {
+public final class TaxNewRender extends FXYAbstractRender {
     private final FilerepoProperties filerepoProperties;
     private final CommonDataCache commonDataCache;
 
@@ -34,45 +33,20 @@ public final class TaxNewRender extends BasicAbstractRender {
     }
 
     @Override
-    protected String getBasicPath() throws IOException {
-        return filerepoProperties.getBasePath();
-    }
-
-    @Override
-    protected String getReportImagePath() {
-        return filerepoProperties.getReportImagePath();
-    }
-
-    /**
-     * Docx 渲染
-     *
-     * @param info 数据
-     * @param inputStream 模板内容
-     * @return 本地文件目录
-     * @throws IOException
-     */
-
-    public String renderDocx(String info, InputStream inputStream,
-        String relationId, Integer count) throws IOException {
+    protected Map<String, Object> renderDocx(String info, String relationId, Integer counter) throws IOException {
         log.info("开始渲染税务风险模块,relationId: {}", relationId);
 
-        // 配置POI-TL渲染器
-        ConfigureBuilder builder = Configure.builder();
-        RenderPolicy indicatorsRenderPolicy = this.indicatorsRenderPolicyToProtobuf();
 
-        builder.bind("taxationRiskChecks", indicatorsRenderPolicy);
-        builder.bind("taxPenalties", indicatorsRenderPolicy);
-        builder.useSpringEL();
         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();
+                .mergeFrom(publicRecordBuilder.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);
@@ -83,21 +57,36 @@ public final class TaxNewRender extends BasicAbstractRender {
         }
 
         fillBasicDefaultValues(data);
-        data.put("levelInteger", count);
+        data.put("levelInteger", counter);
         // Map<String, Object> publicRecordSummary = (Map<String, Object>) data.get("publicRecordSummary");
         // publicRecordSummary.putIfAbsent("riskSummary", "-");
         // publicRecordSummary.putIfAbsent("suggestion", "");
-        try {
-            // 渲染文档
-            String resultPath = this.renderDocx(data, inputStream, builder, relationId, "tax");
-            log.info("渲染税务风险模块成功,文件路径: {}", resultPath);
-            return resultPath;
-        } catch (Exception e) {
-            log.error("渲染税务风险模块失败,relationId: {}", relationId, e);
-            throw new IOException("文档渲染失败", e);
-        }
+        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();
     }
 
+
     /**
      * 填充默认值,确保所有必要字段都存在
      */

+ 2 - 1
easier-report-biz/src/main/java/com/yaoyicloud/service/CsoReportService.java

@@ -9,7 +9,8 @@ public interface CsoReportService {
     ReportGenerationResult createCsoCheckReport(
             String data,
             Long relationId,
-            ModuleType moduleType
+            ModuleType moduleType,
+            Boolean mergeflag
     ) throws Exception;
 
 }

+ 42 - 18
easier-report-biz/src/main/java/com/yaoyicloud/service/impl/CsoReportServiceImpl.java

@@ -9,9 +9,11 @@ import java.util.List;
 
 import com.amazonaws.services.s3.model.S3Object;
 import com.amazonaws.services.s3.model.S3ObjectInputStream;
+import com.yaoyicloud.config.RelationCounterRedisUtil;
 import com.yaoyicloud.easier.common.file.core.FileProperties;
 import com.yaoyicloud.easier.common.file.core.FileTemplate;
 import com.yaoyicloud.render.cso.EntAppendixRender;
+import com.yaoyicloud.render.cso.EntProductIntroductionRender;
 import com.yaoyicloud.render.cso.EntPromotionDetailsRender;
 import org.apache.poi.xwpf.usermodel.XWPFDocument;
 import org.springframework.stereotype.Service;
@@ -38,30 +40,52 @@ public class CsoReportServiceImpl implements CsoReportService {
     private final CommonDataCache commonDataCache;
     private final FileTemplate ossTemplate;
     private final FileProperties properties;
+    private final RelationCounterRedisUtil relationCounterRedisUtil;
+    private final FileProperties fileProperties;
+
     /**
      * 处理单个模块的报告生成
      */
     @SuppressWarnings("checkstyle:ParameterNumber")
     private String processModule(ModuleType moduleType, String data,
-                                 InputStream inputStream, String sessionId, Long relationId) throws Exception {
+        InputStream inputStream, String sessionId, Long relationId, Integer counter) throws Exception {
         String reportPath;
-
+        String type = moduleType.getType();
         switch (moduleType) {
+            case CSO_HEADER_XINHUA:
             case CSO_HEADER:
-                reportPath = new EntHeaderSectionRender(sessionId, filerepoProperties, commonDataCache)
-                    .renderDocx(data, inputStream, String.valueOf(relationId));
+                reportPath = new EntHeaderSectionRender(sessionId, ossTemplate, fileProperties, filerepoProperties,
+                    commonDataCache)
+                        .createCSODocument(data, inputStream, String.valueOf(relationId), counter, type);
+                break;
+            case CSO_PRODUCT_INTRODUCTION_XINHUA:
+            case CSO_PRODUCT_INTRODUCTION:
+                reportPath = new EntProductIntroductionRender(sessionId, ossTemplate, fileProperties,
+                    filerepoProperties, commonDataCache)
+                        .createCSODocument(data, inputStream, String.valueOf(relationId), counter, type);
                 break;
             case CSO_PROMOTION_SUMMARY:
-                reportPath = new EntPromotionSummaryRender(sessionId, filerepoProperties, commonDataCache)
-                    .renderDocx(data, inputStream, String.valueOf(relationId));
+                reportPath = new EntPromotionSummaryRender(sessionId, ossTemplate, fileProperties, filerepoProperties,
+                    commonDataCache)
+                        .createCSODocument(data, inputStream, String.valueOf(relationId), counter, type);
                 break;
+            case CSO_ATTACHMENT_XINHUA:
+            case CSO_PROMOTION_DETAILS_XINHUA:
+            case CSO_PROMOTION_DETAILS_1611890606:
             case CSO_PROMOTION_DETAILS:
-                reportPath = new EntPromotionDetailsRender(sessionId, filerepoProperties, commonDataCache)
-                    .renderDocx(data, inputStream, String.valueOf(relationId));
+                reportPath = new EntPromotionDetailsRender(sessionId, ossTemplate, fileProperties, filerepoProperties,
+                    commonDataCache)
+                        .createCSODocument(data, inputStream, String.valueOf(relationId), counter, type);
                 break;
+
+            case CSO_SITUATION_OVERVIEW_XINHUA:
+            case CSO_PROMOTION_SIGNIFICANCE_XINHUA:
+            case CSO_PROMOTION_SIGNIFICANCE_DRUG:
+            case CSO_SITUATION_OVERVIEW_DRUG:
             case CSO_APPENDIX:
-                reportPath = new EntAppendixRender(sessionId, filerepoProperties, commonDataCache)
-                    .renderDocx(data, inputStream, String.valueOf(relationId));
+                reportPath =
+                    new EntAppendixRender(sessionId, ossTemplate, fileProperties, filerepoProperties, commonDataCache)
+                        .createCSODocument(data, inputStream, String.valueOf(relationId), counter, type);
                 break;
             default:
                 throw new UnsupportedOperationException("Unsupported module type: " + moduleType);
@@ -71,20 +95,20 @@ public class CsoReportServiceImpl implements CsoReportService {
 
     @Override
     public ReportGenerationResult createCsoCheckReport(String data, Long relationId,
-        ModuleType moduleType) throws Exception {
-        //oss 获取文件
+        ModuleType moduleType, Boolean mergeflag) throws Exception {
+        // oss 获取文件
         S3Object s3Object = ossTemplate.getObject(properties.getBucketName(), moduleType.getType() + ".docx");
         S3ObjectInputStream objectContent = s3Object.getObjectContent();
 
+        Integer count = relationCounterRedisUtil.getCount(relationId);
         String sessionId = SESSION_MAP.get(relationId.toString());
-        String reportPath = processModule(moduleType, data, objectContent, sessionId, relationId);
+
+        String reportPath = processModule(moduleType, data, objectContent, sessionId, relationId, count);
         // 处理指定模块
         reportPathManager.addReportPath(sessionId, reportPath);
-
+        relationCounterRedisUtil.increment(relationId, 1);
         String mergedReportPath = null;
-        boolean isLastModule = reportPath.contains("Appendix");
-
-        if (isLastModule) {
+        if (mergeflag) {
             List<String> reportPaths = reportPathManager.removeSession(sessionId);
             XWPFDocument targetDoc;
             try (FileInputStream fis = new FileInputStream(reportPaths.get(0))) {
@@ -102,6 +126,6 @@ public class CsoReportServiceImpl implements CsoReportService {
             DocxUtil.mergeDocx(targetDoc, sourceDocs, mergedReportPath, relationId);
         }
 
-        return new ReportGenerationResult(reportPath, mergedReportPath, isLastModule);
+        return new ReportGenerationResult(reportPath, mergedReportPath, mergeflag);
     }
 }

+ 1 - 1
easier-report-biz/src/main/java/com/yaoyicloud/service/impl/ReportServiceImpl.java → easier-report-biz/src/main/java/com/yaoyicloud/service/impl/FxyReportServiceImpl.java

@@ -17,7 +17,7 @@ import lombok.extern.slf4j.Slf4j;
 @Slf4j
 @Service
 @RequiredArgsConstructor
-public class ReportServiceImpl implements ReportService {
+public class FxyReportServiceImpl implements ReportService {
     private final PlatformCompanyReport platformCompanyReport;
     private final AcademicAssociationReport academicAssociationReport;
     private final FoundationReport foundationReport;

+ 66 - 73
easier-report-biz/src/main/java/com/yaoyicloud/service/impl/ReportUpdateServiceImpl.java → easier-report-biz/src/main/java/com/yaoyicloud/service/impl/FxyReportUpdateServiceImpl.java

@@ -15,22 +15,13 @@ import com.yaoyicloud.constant.enums.ModuleType;
 import com.yaoyicloud.easier.common.file.core.FileProperties;
 import com.yaoyicloud.easier.common.file.core.FileTemplate;
 import com.yaoyicloud.entity.ReportGenerationResult;
-import com.yaoyicloud.render.InterestConflictsRender;
-import com.yaoyicloud.render.ProjectInfoRender;
-import com.yaoyicloud.render.PublicRecordRender;
 
 import com.yaoyicloud.render.ServiceProviderInfoRender;
-import com.yaoyicloud.render.association.AssociationAttachmentSectionRender;
-import com.yaoyicloud.render.foundation.FoundationAttachmentSectionRender;
-import com.yaoyicloud.render.foundation.FoundationfinancialInfoRender;
-import com.yaoyicloud.render.platform.AntiBriberyRender;
+
 import com.yaoyicloud.render.platform.AttachmentSectionRender;
-import com.yaoyicloud.render.platform.BasicInfoRender;
-import com.yaoyicloud.render.platform.FinancialInfoRender;
-import com.yaoyicloud.render.association.AssociationBasicInfoRender;
-import com.yaoyicloud.render.foundation.FoundationBasicInfoRender;
+
 import com.yaoyicloud.render.platform.update.AntiBriberyNewRender;
-import com.yaoyicloud.render.platform.update.BasicInfoNewRender;
+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;
@@ -46,7 +37,7 @@ import static com.yaoyicloud.config.SessionInterceptor.SESSION_MAP;
 @Slf4j
 @Service
 @RequiredArgsConstructor
-public class ReportUpdateServiceImpl implements ReportUpdateService {
+public class FxyReportUpdateServiceImpl implements ReportUpdateService {
 
     private final FilerepoProperties filerepoProperties;
     private final ReportPathManager reportPathManager;
@@ -54,19 +45,21 @@ public class ReportUpdateServiceImpl implements ReportUpdateService {
     private final RelationCounterRedisUtil relationCounterRedisUtil;
     private final FileTemplate ossTemplate;
     private final FileProperties properties;
+
     @SuppressWarnings("checkstyle:ReturnCount")
     @Override
-    public ReportGenerationResult createPlusVersionCheckReport(String data,  Long relationId, ModuleType moduleType)
+    public ReportGenerationResult createPlusVersionCheckReport(String data, Long relationId, ModuleType moduleType)
         throws Exception {
 
-        //oss 获取文件
+        // oss 获取文件
         S3Object s3Object = ossTemplate.getObject(properties.getBucketName(), moduleType.getType() + ".docx");
         S3ObjectInputStream objectContent = s3Object.getObjectContent();
 
         Integer count = relationCounterRedisUtil.getCount(relationId);
         String sessionId = SESSION_MAP.get(relationId.toString());
-        String reportPath = processModule(moduleType, data, objectContent, sessionId, relationId, count);
         // 处理指定模块
+        String reportPath = processModule(moduleType, data, objectContent, sessionId, relationId, count);
+
         reportPathManager.addReportPath(sessionId, reportPath);
         relationCounterRedisUtil.increment(relationId, 1);
 
@@ -100,80 +93,80 @@ public class ReportUpdateServiceImpl implements ReportUpdateService {
     @SuppressWarnings("checkstyle:ParameterNumber")
     private String processModule(ModuleType moduleType, String data,
        InputStream inputStream, String sessionId, Long relationId, Integer counter) throws Exception {
-        String reportPath;
-
+        String reportPath = null;
+        String type = moduleType.getType();
         switch (moduleType) {
-            case ANTIBRIBERY:
-                reportPath = new AntiBriberyRender(sessionId, filerepoProperties, commonDataCache)
-                    .renderDocx(data, inputStream, String.valueOf(relationId));
-                break;
+//            case ANTIBRIBERY:
+//                reportPath = new AntiBriberyRender(sessionId, filerepoProperties, commonDataCache)
+//                    .createFXYDocument(data, inputStream, String.valueOf(relationId));
+//                break;
             case PLATFORM_COMPANY_ANTIBRIBERY_NEW:
                 reportPath = new AntiBriberyNewRender(sessionId, filerepoProperties, commonDataCache)
-                    .renderDocx(data, inputStream, String.valueOf(relationId), counter);
-                break;
-            case PLATFORM_COMPANY_BASICINFO:
-                reportPath = new BasicInfoRender(sessionId, filerepoProperties, commonDataCache)
-                    .renderDocx(data, inputStream, String.valueOf(relationId));
+                    .createFXYDocument(data, inputStream, String.valueOf(relationId), counter, type);
                 break;
+//            case PLATFORM_COMPANY_BASICINFO:
+//                reportPath = new BasicInfoRender(sessionId, filerepoProperties, commonDataCache)
+//                    .createFXYDocument(data, inputStream, String.valueOf(relationId));
+//                break;
             case PLATFORM_COMPANY_ATTACHMENTSECTION:
                 reportPath = new AttachmentSectionRender(sessionId, filerepoProperties, commonDataCache)
-                    .renderDocx(data, inputStream, String.valueOf(relationId), counter);
-                break;
-            case ASSOCIATION_ATTACHMENTSECTION:
-                reportPath = new AssociationAttachmentSectionRender(sessionId, filerepoProperties, commonDataCache)
-                    .renderDocx(data, inputStream, String.valueOf(relationId));
-                break;
-            case FOUNDATION_ATTACHMENTSECTION:
-                reportPath = new FoundationAttachmentSectionRender(sessionId, filerepoProperties, commonDataCache)
-                    .renderDocx(data, inputStream, String.valueOf(relationId));
-                break;
+                    .createFXYDocument(data, inputStream, String.valueOf(relationId), counter, type);
+                break;
+//            case ASSOCIATION_ATTACHMENTSECTION:
+//                reportPath = new AssociationAttachmentSectionRender(sessionId, filerepoProperties, commonDataCache)
+//                    .createFXYDocument(data, inputStream, String.valueOf(relationId));
+//                break;
+//            case FOUNDATION_ATTACHMENTSECTION:
+//                reportPath = new FoundationAttachmentSectionRender(sessionId, filerepoProperties, commonDataCache)
+//                    .createFXYDocument(data, inputStream, String.valueOf(relationId));
+//                break;
             case COMMON:
                 reportPath = new ServiceProviderInfoRender(sessionId, filerepoProperties, commonDataCache)
-                    .renderDocx(data, inputStream, String.valueOf(relationId), counter);
-                break;
-            case PLATFORM_COMPANY_FINANCIALINFO:
-                reportPath = new FinancialInfoRender(sessionId, filerepoProperties, commonDataCache)
-                    .renderDocx(data, inputStream, String.valueOf(relationId));
+                    .createFXYDocument(data, inputStream, String.valueOf(relationId), counter, type);
                 break;
+//            case PLATFORM_COMPANY_FINANCIALINFO:
+//                reportPath = new FinancialInfoRender(sessionId, filerepoProperties, commonDataCache)
+//                    .createFXYDocument(data, inputStream, String.valueOf(relationId));
+//                break;
             case PLATFORM_COMPANY_FINANCIALINFO_NEW:
                 reportPath = new FinancialInfoNewRender(sessionId, filerepoProperties, commonDataCache)
-                    .renderDocx(data, inputStream, String.valueOf(relationId), counter);
-                break;
-            case FOUNDATION_FINANCIALINFO:
-                reportPath = new FoundationfinancialInfoRender(sessionId, filerepoProperties, commonDataCache)
-                    .renderDocx(data, inputStream, String.valueOf(relationId));
-                break;
-            case PUBLIC_RECORD:
-                reportPath = new PublicRecordRender(sessionId, filerepoProperties, commonDataCache)
-                    .renderDocx(data, inputStream, String.valueOf(relationId));
-                break;
+                    .createFXYDocument(data, inputStream, String.valueOf(relationId), counter, type);
+                break;
+//            case FOUNDATION_FINANCIALINFO:
+//                reportPath = new FoundationfinancialInfoRender(sessionId, filerepoProperties, commonDataCache)
+//                    .createFXYDocument(data, inputStream, String.valueOf(relationId));
+//                break;
+//            case PUBLIC_RECORD:
+//                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)
-                    .renderDocx(data, inputStream, String.valueOf(relationId), counter);
+                    .createFXYDocument(data, inputStream, String.valueOf(relationId), counter, type);
                 break;
             case PLATFORM_COMPANY_BASICINFO_NEW:
-                reportPath = new BasicInfoNewRender(sessionId, filerepoProperties, commonDataCache)
-                    .renderDocx(data, inputStream, String.valueOf(relationId), counter);
-                break;
-            case FOUNDATION_BASICINFO:
-                reportPath = new FoundationBasicInfoRender(sessionId, filerepoProperties, commonDataCache)
-                    .renderDocx(data, inputStream, String.valueOf(relationId));
-                break;
-            case ASSOCIATION_BASICINFO:
-                reportPath = new AssociationBasicInfoRender(sessionId, filerepoProperties, commonDataCache)
-                    .renderDocx(data, inputStream, String.valueOf(relationId));
-                break;
-            case PROJECT:
-                reportPath = new ProjectInfoRender(sessionId, filerepoProperties, commonDataCache)
-                    .renderDocx(data, inputStream, String.valueOf(relationId));
-                break;
-            case INTERESTCONFLICTS:
-                reportPath = new InterestConflictsRender(sessionId, filerepoProperties, commonDataCache)
-                    .renderDocx(data, inputStream, String.valueOf(relationId));
-                break;
+                reportPath = new FXYInfoNewRender(sessionId, filerepoProperties, commonDataCache)
+                    .createFXYDocument(data, inputStream, String.valueOf(relationId), counter, type);
+                break;
+//            case FOUNDATION_BASICINFO:
+//                reportPath = new FoundationBasicInfoRender(sessionId, filerepoProperties, commonDataCache)
+//                    .createFXYDocument(data, inputStream, String.valueOf(relationId));
+//                break;
+//            case ASSOCIATION_BASICINFO:
+//                reportPath = new AssociationBasicInfoRender(sessionId, filerepoProperties, commonDataCache)
+//                    .createFXYDocument(data, inputStream, String.valueOf(relationId));
+//                break;
+//            case PROJECT:
+//                reportPath = new ProjectInfoRender(sessionId, filerepoProperties, commonDataCache)
+//                    .createFXYDocument(data, inputStream, String.valueOf(relationId));
+//                break;
+//            case INTERESTCONFLICTS:
+//                reportPath = new InterestConflictsRender(sessionId, filerepoProperties, commonDataCache)
+//                    .createFXYDocument(data, inputStream, String.valueOf(relationId));
+//                break;
             case PLATFORM_COMPANY_TAX_NEW:
                 reportPath = new TaxNewRender(sessionId, filerepoProperties, commonDataCache)
-                    .renderDocx(data, inputStream, String.valueOf(relationId), counter);
+                    .createFXYDocument(data, inputStream, String.valueOf(relationId), counter, type);
                 break;
             default:
                 throw new UnsupportedOperationException("Unsupported module type: " + moduleType);

+ 6 - 6
easier-report-biz/src/main/java/com/yaoyicloud/template/AbstractReportExporter.java

@@ -20,7 +20,7 @@ import com.deepoove.poi.data.Texts;
 import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
 import com.deepoove.poi.template.run.RunTemplate;
 import com.yaoyicloud.constant.enums.ReportType;
-import com.yaoyicloud.tools.OfficeUtil1;
+import com.yaoyicloud.tools.OfficeUtil;
 import org.apache.poi.xwpf.usermodel.XWPFDocument;
 import org.apache.poi.xwpf.usermodel.XWPFParagraph;
 import org.apache.poi.xwpf.usermodel.XWPFRun;
@@ -143,22 +143,22 @@ public abstract class AbstractReportExporter  implements ReportDataProcessor {
         this.renderTemplate(reportTempWordFile, templatePath, builder, processedData);
         String imagePath = this.imagePath();
         // word转pdf
-        String html = OfficeUtil1.convert(reportTempWordFile, reportImagePath);
+        String html = OfficeUtil.convert(reportTempWordFile, reportImagePath);
         try (BufferedWriter writer2 = new BufferedWriter(new FileWriter("1.html"))) {
             writer2.write(html);
         } catch (IOException e) {
             System.err.println("写入 1.html 文件时发生错误: " + e.getMessage());
             e.printStackTrace();
         }
-        String html1 = OfficeUtil1.formatHtml(html);
+        String html1 = OfficeUtil.formatHtml(html);
         try (BufferedWriter writer2 = new BufferedWriter(new FileWriter("2.html"))) {
             writer2.write(html1);
         } catch (IOException e) {
             System.err.println("写入 2.html 文件时发生错误: " + e.getMessage());
             e.printStackTrace();
         }
-        OfficeUtil1.convertHtmlToPdf(html1, reportBastPath, getFontPaths(), imagePath, true);
-        String html2 = OfficeUtil1.formatHtml(html);
+        OfficeUtil.convertHtmlToPdf(html1, reportBastPath, getFontPaths(), imagePath, true);
+        String html2 = OfficeUtil.formatHtml(html);
 
         try (BufferedWriter writer2 = new BufferedWriter(new FileWriter("3.html"))) {
             writer2.write(html2);
@@ -166,7 +166,7 @@ public abstract class AbstractReportExporter  implements ReportDataProcessor {
             System.err.println("写入 3.html 文件时发生错误: " + e.getMessage());
             e.printStackTrace();
         }
-        return OfficeUtil1.convertHtmlToPdf(html2, reportBastPath, getFontPaths(), imagePath,  false);
+        return OfficeUtil.convertHtmlToPdf(html2, reportBastPath, getFontPaths(), imagePath,  false);
     }
 
     protected abstract String getReportImagePath();

+ 176 - 0
easier-report-biz/src/main/java/com/yaoyicloud/tools/DesensitizedUtils.java

@@ -0,0 +1,176 @@
+/*
+ * Copyright (c) 2018-2025, hnqz All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution. Neither the name of the pig4cloud.com developer nor the names of its
+ * contributors may be used to endorse or promote products derived from this software without specific prior written permission. Author:
+ * hnqz
+ */
+
+package com.yaoyicloud.tools;
+
+import cn.hutool.core.util.StrUtil;
+
+/**
+ * 脱敏工具类
+ *
+ * @author mayee
+ * @version v1.0
+ **/
+public class DesensitizedUtils {
+
+    /**
+     * 对字符串进行脱敏操作
+     * 
+     * @param origin 原始字符串
+     * @param prefixNoMaskLen 左侧需要保留几位明文字段
+     * @param suffixNoMaskLen 右侧需要保留几位明文字段
+     * @param maskStr 用于遮罩的字符串, 如'*'
+     * @return 脱敏后结果
+     */
+    public static String desValue(String origin, int prefixNoMaskLen, int suffixNoMaskLen, String maskStr) {
+        if (origin == null) {
+            return null;
+        }
+
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0, n = origin.length(); i < n; i++) {
+            if (i < prefixNoMaskLen) {
+                sb.append(origin.charAt(i));
+                continue;
+            }
+            if (i > (n - suffixNoMaskLen - 1)) {
+                sb.append(origin.charAt(i));
+                continue;
+            }
+            sb.append(maskStr);
+        }
+        return sb.toString();
+    }
+
+    /**
+     * 【中文姓名】只显示最后一个汉字,其他隐藏为星号,比如:**梦
+     * 
+     * @param fullName 姓名
+     * @return 结果
+     */
+    public static String chineseName(String fullName) {
+        if (fullName == null) {
+            return null;
+        }
+        return desValue(fullName, 0, 1, "*");
+    }
+
+    /**
+     * 【身份证号】显示前六位, 四位,其他隐藏。共计18位或者15位,比如:340304*******1234
+     * 
+     * @param id 身份证号码
+     * @return 结果
+     */
+    public static String idCardNum(String id) {
+        return desValue(id, 6, 4, "*");
+    }
+
+    /**
+     * 【固定电话】后四位,其他隐藏,比如 ****1234
+     * 
+     * @param num 固定电话
+     * @return 结果
+     */
+    public static String fixedPhone(String num) {
+        return desValue(num, 0, 4, "*");
+    }
+
+    /**
+     * 【手机号码】前三位,后四位,其他隐藏,比如135****6810
+     * 
+     * @param num 手机号码
+     * @return 结果
+     */
+    public static String mobilePhone(String num) {
+        return desValue(num, 3, 4, "*");
+    }
+
+    /**
+     * 【地址】只显示到地区,不显示详细地址,比如:北京市海淀区****
+     * 
+     * @param address 地址
+     * @return 结果
+     */
+    public static String address(String address) {
+        return desValue(address, 6, 0, "*");
+    }
+
+    /**
+     * 【电子邮箱 邮箱前缀仅显示第一个字母,前缀其他隐藏,用星号代替,@及后面的地址显示,比如:d**@126.com
+     * 
+     * @param email 电子邮箱
+     * @return 结果
+     */
+    public static String email(String email) {
+        if (email == null) {
+            return null;
+        }
+        int index = StrUtil.indexOf(email, '@');
+        if (index <= 1) {
+            return email;
+        }
+        String preEmail = desValue(email.substring(0, index), 1, 0, "*");
+        return preEmail + email.substring(index);
+
+    }
+
+    /**
+     * 【银行卡号】前六位,后四位,其他用星号隐藏每位1个星号,比如:622260**********1234
+     * 
+     * @param cardNum 银行卡号
+     * @return 结果
+     */
+    public static String bankCard(String cardNum) {
+        return desValue(cardNum, 6, 4, "*");
+    }
+
+    /**
+     * 【密码】密码的全部字符都用*代替,比如:******
+     * 
+     * @param password 密码
+     * @return 结果
+     */
+    public static String password(String password) {
+        if (password == null) {
+            return null;
+        }
+        return "******";
+    }
+
+    /**
+     * 【密钥】密钥除了最后三位,全部都用*代替,比如:***xdS 脱敏后长度为6,如果明文长度不足三位,则按实际长度显示,剩余位置补*
+     * 
+     * @param key 密钥
+     * @return 结果
+     */
+    @SuppressWarnings("checkstyle:ReturnCount")
+    public static String key(String key) {
+        if (key == null) {
+            return null;
+        }
+        int viewLength = 6;
+        StringBuilder tmpKey = new StringBuilder(desValue(key, 0, 3, "*"));
+        if (tmpKey.length() > viewLength) {
+            return tmpKey.substring(tmpKey.length() - viewLength);
+        } else if (tmpKey.length() < viewLength) {
+            int buffLength = viewLength - tmpKey.length();
+            for (int i = 0; i < buffLength; i++) {
+                tmpKey.insert(0, "*");
+            }
+            return tmpKey.toString();
+        } else {
+            return tmpKey.toString();
+        }
+    }
+
+}

+ 2 - 2
easier-report-biz/src/main/java/com/yaoyicloud/tools/OfficeUtil1.java → easier-report-biz/src/main/java/com/yaoyicloud/tools/OfficeUtil.java

@@ -42,8 +42,8 @@ import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-public class OfficeUtil1 {
-    private static final org.slf4j.Logger OFFICE_UTIL_LOGGER  = org.slf4j.LoggerFactory.getLogger(OfficeUtil1.class);
+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<>();
     public static String convert(String docxPath, String imageDir) throws IOException {
         File imageDirFile = new File(imageDir);

+ 6 - 3
easier-report-biz/src/main/proto/cso.proto

@@ -5,7 +5,7 @@ package report;
 option java_package = "com.yaoyicloud.message";
 option java_outer_classname = "CSOProtos";
 
-// 1. 报告基础信息(封面数据)
+// 0. 报告基础信息(封面数据)
 message ReportHeader {
   optional string report_id = 1; // 报告ID
   optional string entrusting_project_time = 2; // 委托项目时间
@@ -15,7 +15,7 @@ message ReportHeader {
   optional string task_finish_time = 6; // 任务完成时间
   optional int32 total_package_score = 7; // 积分包值
   optional int32 total_approved_score = 8; // 审核通过总值
-  map<string, string> drug_details = 9; // 产品列表(表格数据)
+//  map<string, string> drug_details = 9; // 产品列表(表格数据)
   optional string score_package_name = 10; // 积分包名称
   optional int32 task_user_names = 11; // 积分包推广人数
   optional int32 submited_task_score = 12; // 总提交积分
@@ -23,7 +23,10 @@ message ReportHeader {
   optional string service_end_date = 14; // 完成时间
   optional bool sensitiveFlag = 15; // 是否脱敏
 }
-
+// 1. 产品介绍模块
+message ProductIntroduction{
+  map<string, string> drug_details = 9; // 产品列表(表格数据)
+}
 // 2. 推广明细
 message PromotionDetails {
   // 2.1 推广人员任务信息

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

@@ -7,7 +7,7 @@ import com.lowagie.text.pdf.PdfContentByte;
 import com.lowagie.text.pdf.PdfReader;
 import com.lowagie.text.pdf.PdfStamper;
 import com.lowagie.text.pdf.parser.PdfTextExtractor;
-import com.yaoyicloud.tools.OfficeUtil1;
+import com.yaoyicloud.tools.OfficeUtil;
 import fr.opensagres.poi.xwpf.converter.core.FileImageExtractor;
 import fr.opensagres.poi.xwpf.converter.core.FileURIResolver;
 import fr.opensagres.poi.xwpf.converter.core.ImageManager;
@@ -33,8 +33,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.Map;
@@ -69,7 +67,7 @@ public class TestPdf {
             e.printStackTrace();
         }
 
-        String docxHtml1 = OfficeUtil1.formatHtml(docxHtml);
+        String docxHtml1 = OfficeUtil.formatHtml(docxHtml);
         try (BufferedWriter writer1 = new BufferedWriter(new FileWriter("1.html"))) {
             writer1.write(docxHtml1);
         } catch (IOException e) {