Kaynağa Gözat

build 学协会基本信息(老版)

mamingxu 1 hafta önce
ebeveyn
işleme
f610625542
33 değiştirilmiş dosya ile 870 ekleme ve 620 silme
  1. 141 297
      com/yaoyicloud/message/FxyProtos.java
  2. 9 2
      easier-report-api/src/main/java/com/yaoyicloud/constant/enums/ModuleType.java
  3. 84 0
      easier-report-biz/src/main/java/com/yaoyicloud/render/InterestConflictsRender.java
  4. 110 0
      easier-report-biz/src/main/java/com/yaoyicloud/render/ProjectInfoRender.java
  5. 51 48
      easier-report-biz/src/main/java/com/yaoyicloud/render/PublicRecordRender.java
  6. 118 0
      easier-report-biz/src/main/java/com/yaoyicloud/render/association/AssociationAttachmentSectionRender.java
  7. 13 9
      easier-report-biz/src/main/java/com/yaoyicloud/render/association/AssociationBasicInfoRender.java
  8. 8 5
      easier-report-biz/src/main/java/com/yaoyicloud/render/foundation/FoundationBasicInfoRender.java
  9. 2 1
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/AntiBriberyRender.java
  10. 2 1
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/AttachmentSectionRender.java
  11. 9 4
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/BasicInfoRender.java
  12. 2 1
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/FinancialInfoRender.java
  13. 2 1
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/ServiceProviderInfoRender.java
  14. 1 1
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/BasicInfoNewRender.java
  15. 1 1
      easier-report-biz/src/main/java/com/yaoyicloud/render/platform/update/PublicRecordNewRender.java
  16. 33 7
      easier-report-biz/src/main/java/com/yaoyicloud/service/impl/ReportServiceImpl.java
  17. 277 235
      easier-report-biz/src/main/proto/fxy.proto
  18. 1 1
      easier-report-biz/src/test/java/com/yaoyicloud/render/test/TestAntiBriberyRender.java
  19. 1 1
      easier-report-biz/src/test/java/com/yaoyicloud/render/test/TestAttachmentSectionRender.java
  20. 1 1
      easier-report-biz/src/test/java/com/yaoyicloud/render/test/TestBasicInfoRender.java
  21. 1 1
      easier-report-biz/src/test/java/com/yaoyicloud/render/test/TestFinancialInfoRender.java
  22. 2 2
      easier-report-biz/src/test/java/com/yaoyicloud/render/test/TestPublicRecordRender.java
  23. 1 1
      easier-report-biz/src/test/java/com/yaoyicloud/render/test/TestServiceProviderInfoRender.java
  24. BIN
      easier-report-biz/src/test/resources/docx/antiBribery.docx
  25. BIN
      easier-report-biz/src/test/resources/docx/association_attachment.docx
  26. BIN
      easier-report-biz/src/test/resources/docx/association_basic_info.docx
  27. BIN
      easier-report-biz/src/test/resources/docx/doundation_finance.docx
  28. BIN
      easier-report-biz/src/test/resources/docx/finance.docx
  29. BIN
      easier-report-biz/src/test/resources/docx/interestConflicts.docx
  30. BIN
      easier-report-biz/src/test/resources/docx/project_info.docx
  31. BIN
      easier-report-biz/src/test/resources/docx/public_record.docx
  32. BIN
      easier-report-biz/src/test/resources/docx/public_record_new.docx
  33. BIN
      easier-report-biz/src/test/resources/docx/service_provider_info.docx

Dosya farkı çok büyük olduğundan ihmal edildi
+ 141 - 297
com/yaoyicloud/message/FxyProtos.java


+ 9 - 2
easier-report-api/src/main/java/com/yaoyicloud/constant/enums/ModuleType.java

@@ -11,15 +11,22 @@ import lombok.Getter;
 @Getter
 @AllArgsConstructor
 public enum ModuleType {
+    PLATFORM_COMPANY_BASICINFO("PLATFORM_COMPANY_BASICINFO", "平台公司基本信息"),
     FOUNDATION_BASICINFO("FOUNDATION_BASICINFO", "基金会基本信息"),
     ASSOCIATION_BASICINFO("ASSOCIATION_BASICINFO", "学协会基本信息"),
 
-    PLATFORM_COMPANY_BASICINFO("PLATFORM_COMPANY_BASICINFO", "平台公司基本信息"),
+    PUBLIC_RECORD("PUBLIC_RECORD", "公共记录"),
+    PROJECT("PROJECT", "项目信息"),
+    INTERESTCONFLICTS("INTERESTCONFLICTS", "利益冲突"),
+
+
     ANTIBRIBERY("ANTIBRIBERY", "反贿赂反腐败诚信保证"),
     COMMON("COMMON", "公共模块封面"),
     PLATFORM_COMPANY_FinancialInfo("PLATFORM_COMPANY_FinancialInfo", "财务"),
     PLATFORM_COMPANY_ATTACHMENTSECTION("PLATFORM_COMPANY_ATTACHMENTSECTION", "平台公司附件"),
-    PUBLIC_RECORD("PUBLIC_RECORD", "公共记录"),
+    ASSOCIATION_ATTACHMENTSECTION("ASSOCIATION_ATTACHMENTSECTION", "学协会附件"),
+    FOUNDATION_ATTACHMENTSECTION("FOUNDATION_ATTACHMENTSECTION", "基金会附件"),
+
 
 
 

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

@@ -0,0 +1,84 @@
+package com.yaoyicloud.render;
+
+import java.io.IOException;
+
+
+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.FilerepoProperties;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+
+/**
+ * BasicInfo渲染器
+ *
+ */
+@Slf4j
+public final class InterestConflictsRender extends AbstractRender {
+    private final FilerepoProperties filerepoProperties;
+
+    public InterestConflictsRender(String cwd, FilerepoProperties filerepoProperties) {
+        super(cwd);
+        this.filerepoProperties = filerepoProperties;
+    }
+
+    @Override
+    protected String getBasicPath() throws IOException {
+        return filerepoProperties.getBasePath();
+    }
+
+    @Override
+    protected String getReportImagePath() {
+        return filerepoProperties.getReportImagePath();
+    }
+
+    /**
+     * Docx 渲染
+     *
+     * @param info 数据
+     * @param templateFileContent 模板内容
+     * @return 本地文件目录
+     * @throws IOException
+     */
+    public String renderDocx(String info, Map<String, Object> addtionalMap, byte[] templateFileContent,
+        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>>() {});
+
+        if (addtionalMap != null) {
+            data.putAll(addtionalMap);
+        }
+        fillDefaultValues(data);
+        try {
+            // 渲染文档
+            String resultPath = this.renderDocx(data, templateFileContent, 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", "未上传");
+        }
+
+    }
+}

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

@@ -0,0 +1,110 @@
+package com.yaoyicloud.render;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+
+import com.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.FilerepoProperties;
+import com.yaoyicloud.message.FxyProtos;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * BasicInfo渲染器
+ *
+ */
+@Slf4j
+public final class ProjectInfoRender extends AbstractRender {
+    private final FilerepoProperties filerepoProperties;
+
+    public ProjectInfoRender(String cwd, FilerepoProperties filerepoProperties) {
+        super(cwd);
+        this.filerepoProperties = filerepoProperties;
+    }
+
+    @Override
+    protected String getBasicPath() throws IOException {
+        return filerepoProperties.getBasePath();
+    }
+
+    @Override
+    protected String getReportImagePath() {
+        return filerepoProperties.getReportImagePath();
+    }
+
+    /**
+     * Docx 渲染
+     *
+     * @param info 数据
+     * @param templateFileContent 模板内容
+     * @return 本地文件目录
+     * @throws IOException
+     */
+    public String renderDocx(String info, Map<String, Object> addtionalMap, byte[] templateFileContent,
+        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);
+
+        if (addtionalMap != null) {
+            data.putAll(addtionalMap);
+        }
+
+        fillDefaultValues(data);
+        try {
+            // 渲染文档
+            String resultPath = this.renderDocx(data, templateFileContent, 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);
+
+    }
+
+}

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

@@ -1,6 +1,7 @@
 package com.yaoyicloud.render;
 
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -20,9 +21,10 @@ import com.google.protobuf.InvalidProtocolBufferException;
 import com.google.protobuf.MessageOrBuilder;
 import com.google.protobuf.util.JsonFormat;
 import com.yaoyicloud.config.FilerepoProperties;
-
 import com.yaoyicloud.message.FxyProtos.PublicRecord;
+
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
 
 /**
  * PublicRecord渲染器
@@ -70,8 +72,19 @@ public final class PublicRecordRender extends AbstractRender {
         builder.bind("taxPenalties", indicatorsRenderPolicy);
         builder.bind("severeViolations", indicatorsRenderPolicy);
 
+        PublicRecord.Builder basicInfoBuilder = PublicRecord.newBuilder();
+        JsonFormat.parser().merge(info, basicInfoBuilder);
+        PublicRecord defaultInstance = PublicRecord.getDefaultInstance();
+        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(info, new TypeReference<Map<String, Object>>() {});
+        Map<String, Object> data = objectMapper.readValue(completeJson, new TypeReference<Map<String, Object>>() {});
         data.replaceAll((k, v) -> v.equals("") ? "-" : v);
 
         if (addtionalMap != null) {
@@ -95,27 +108,15 @@ public final class PublicRecordRender extends AbstractRender {
      */
     private void fillBasicDefaultValues(Map<String, Object> data) {
         Map<String, Object> basicInfoSummary = (Map<String, Object>) data.get("publicRecordSummary");
-
-        // 如果存在 summary 对象,则处理其字段
-        if (basicInfoSummary != null) {
-            // 确保所有需要的字段都有默认值
-            setDefaultIfNull(basicInfoSummary, "score", "-");
-            setDefaultIfNull(basicInfoSummary, "riskSummary", "-");
-            setDefaultIfNull(basicInfoSummary, "suggestion", "-");
-        } else {
-            // 如果 summary 对象不存在,则创建并设置默认值
-            Map<String, Object> defaultSummary = new HashMap<>();
-            defaultSummary.put("score", "-");
-            defaultSummary.put("riskSummary", "-");
-            defaultSummary.put("suggestion", "-");
-            data.put("publicRecordSummary", defaultSummary);
-        }
         basicInfoSummary.replaceAll((k, v) -> v.equals("") ? "-" : v);
 
-        Map<String, Object> dishonestPersonsMap = (Map<String, Object>) data.get("dishonestPersons");
-        if (dishonestPersonsMap != null) {
-            dishonestPersonsMap.replaceAll((k, v) -> v.equals("") ? "-" : v);
-            data.put("dishonestPersonsCount", dishonestPersonsMap.size());
+        // 处理失信人数据
+        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");
@@ -126,17 +127,19 @@ public final class PublicRecordRender extends AbstractRender {
             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);
         }
 
-        Map<String, Object> businessAbnormalsMap = (Map<String, Object>) data.get("businessAbnormals");
-        if (businessAbnormalsMap != null) {
-            businessAbnormalsMap.replaceAll((k, v) -> v.equals("") ? "-" : v);
-            data.put("businessAbnormalsCount", businessAbnormalsMap.size());
+        // 处理经营异常数据
+        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");
@@ -145,15 +148,17 @@ public final class PublicRecordRender extends AbstractRender {
             defaultBusinessAbnormal.put("inReason", "-");
             defaultBusinessAbnormal.put("disabled", "-");
             List<Map<String, Object>> defaultBusinessAbnormalList = Collections.singletonList(defaultBusinessAbnormal);
-
             data.put("businessAbnormals", defaultBusinessAbnormalList);
             data.put("businessAbnormalsCount", 0);
         }
 
-        Map<String, Object> penaltyRecordsMap = (Map<String, Object>) data.get("penaltyRecords");
-        if (penaltyRecordsMap != null) {
-            penaltyRecordsMap.replaceAll((k, v) -> v.equals("") ? "-" : v);
-            data.put("penaltyRecordsCount", penaltyRecordsMap.size());
+        // 处理行政处罚记录
+        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");
@@ -165,15 +170,17 @@ public final class PublicRecordRender extends AbstractRender {
             defaultPenaltyRecord.put("department", "-");
             defaultPenaltyRecord.put("description", "-");
             List<Map<String, Object>> defaultPenaltyRecordList = Collections.singletonList(defaultPenaltyRecord);
-
             data.put("penaltyRecords", defaultPenaltyRecordList);
             data.put("penaltyRecordsCount", 0);
         }
 
-        Map<String, Object> taxPenaltiesMap = (Map<String, Object>) data.get("taxPenalties");
-        if (taxPenaltiesMap != null) {
-            taxPenaltiesMap.replaceAll((k, v) -> v.equals("") ? "-" : v);
-            data.put("taxPenaltiesCount", taxPenaltiesMap.size());
+        // 处理税务处罚记录
+        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");
@@ -181,15 +188,17 @@ public final class PublicRecordRender extends AbstractRender {
             defaultTaxPenalty.put("type", "-");
             defaultTaxPenalty.put("result", "-");
             List<Map<String, Object>> defaultTaxPenaltyList = Collections.singletonList(defaultTaxPenalty);
-
             data.put("taxPenalties", defaultTaxPenaltyList);
             data.put("taxPenaltiesCount", 0);
         }
 
-        Map<String, Object> severeViolationsMap = (Map<String, Object>) data.get("severeViolations");
-        if (severeViolationsMap != null) {
-            severeViolationsMap.replaceAll((k, v) -> v.equals("") ? "-" : v);
-            data.put("severeViolationsCount", severeViolationsMap.size());
+        // 处理严重违法记录
+        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");
@@ -203,12 +212,6 @@ public final class PublicRecordRender extends AbstractRender {
         }
     }
 
-    private void setDefaultIfNull(Map<String, Object> map, String key, Object defaultValue) {
-        if (!map.containsKey(key) || map.get(key) == null) {
-            map.put(key, defaultValue);
-        }
-    }
-
     // /**
     // * Docx 渲染
     // *

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

@@ -0,0 +1,118 @@
+package com.yaoyicloud.render.association;
+
+import java.io.IOException;
+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.FilerepoProperties;
+import com.yaoyicloud.message.FxyProtos;
+import com.yaoyicloud.message.FxyProtos.AttachmentSection;
+import com.yaoyicloud.render.AbstractRender;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * AttachmentSection渲染器
+ *
+ */
+@Slf4j
+public final class AssociationAttachmentSectionRender extends AbstractRender {
+    private final FilerepoProperties filerepoProperties;
+    public AssociationAttachmentSectionRender(String cwd, FilerepoProperties filerepoProperties) {
+        super(cwd);
+        this.filerepoProperties = filerepoProperties;
+    }
+    @Override
+    protected String getBasicPath() throws IOException {
+        return filerepoProperties.getBasePath();
+    }
+
+    @Override
+    protected String getReportImagePath() {
+        return filerepoProperties.getReportImagePath();
+    }
+
+    /**
+     * Docx 渲染
+     *
+     * @param info 数据
+     * @param templateFileContent 模板内容
+     * @return 本地文件目录
+     * @throws IOException
+     */
+
+    public String renderDocx(String info, Map<String, Object> addtionalMap, byte[] templateFileContent, 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);
+        }
+        if (addtionalMap != null) {
+            data.putAll(addtionalMap);
+        }
+
+        fillDefaultValues(data);
+        try {
+            // 渲染文档
+            String resultPath = this.renderDocx(data, templateFileContent, 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);
+
+        }
+
+    }
+
+
+}

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

@@ -2,6 +2,7 @@ package com.yaoyicloud.render.association;
 
 import java.io.IOException;
 import java.util.Map;
+import java.util.Objects;
 
 import com.deepoove.poi.config.Configure;
 import com.deepoove.poi.config.ConfigureBuilder;
@@ -59,18 +60,18 @@ public final class AssociationBasicInfoRender extends AbstractRender {
         builder.bind("basicInfoChecks", indicatorsRenderPolicyToProtobuf).bind("superiorAuthority", indicatorsRenderPolicyToProtobuf);
         builder.addPlugin('^', this.pictureRenderPolicy());
         builder.useSpringEL();
-        // 通过默认protobuf实例来填充不存在的key
+        //通过默认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>>() {});
         data.replaceAll((k, v) -> v.equals("") ? "-" : v);
@@ -115,17 +116,20 @@ public final class AssociationBasicInfoRender extends AbstractRender {
         associationExt.replaceAll((k, v) -> v.equals("") ? "-" : v);
 
         Object certReceived = data.get("certReceived");
-        if (certReceived.equals("-")) {
+        if (Objects.equals(certReceived, "-")) {
             data.put("certReceived", "否");
         }
+
         Object bankLicense = data.get("bankLicense");
-        if (bankLicense.equals("-")) {
+        if (Objects.equals(bankLicense, "-")) {
             data.put("bankLicense", "否");
         }
+
         Object annualInspectionResult = data.get("annualInspectionResult");
-        if (annualInspectionResult.equals("-")) {
+        if (Objects.equals(annualInspectionResult, "-")) {
             data.put("annualInspectionResult", "否");
         }
+
     }
 
 }

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

@@ -3,6 +3,7 @@ package com.yaoyicloud.render.foundation;
 import java.io.IOException;
 
 import java.util.Map;
+import java.util.Objects;
 
 import com.deepoove.poi.config.Configure;
 import com.deepoove.poi.config.ConfigureBuilder;
@@ -68,8 +69,8 @@ public final class FoundationBasicInfoRender extends AbstractRender {
             .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>>() {});
@@ -127,15 +128,17 @@ public final class FoundationBasicInfoRender extends AbstractRender {
         }
 
         Object certReceived = data.get("certReceived");
-        if (certReceived.equals("-")) {
+        if (Objects.equals(certReceived, "-")) {
             data.put("certReceived", "否");
         }
+
         Object bankLicense = data.get("bankLicense");
-        if (bankLicense.equals("-")) {
+        if (Objects.equals(bankLicense, "-")) {
             data.put("bankLicense", "否");
         }
+
         Object annualInspectionResult = data.get("annualInspectionResult");
-        if (annualInspectionResult.equals("-")) {
+        if (Objects.equals(annualInspectionResult, "-")) {
             data.put("annualInspectionResult", "否");
         }
     }

+ 2 - 1
easier-report-biz/src/main/java/com/yaoyicloud/render/AntiBriberyRender.java → easier-report-biz/src/main/java/com/yaoyicloud/render/platform/AntiBriberyRender.java

@@ -1,4 +1,4 @@
-package com.yaoyicloud.render;
+package com.yaoyicloud.render.platform;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -12,6 +12,7 @@ import com.deepoove.poi.policy.RenderPolicy;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.yaoyicloud.config.FilerepoProperties;
+import com.yaoyicloud.render.AbstractRender;
 import lombok.extern.slf4j.Slf4j;
 
 

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

@@ -1,4 +1,4 @@
-package com.yaoyicloud.render;
+package com.yaoyicloud.render.platform;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -11,6 +11,7 @@ import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.yaoyicloud.config.FilerepoProperties;
 import com.yaoyicloud.message.FxyProtos;
+import com.yaoyicloud.render.AbstractRender;
 import lombok.extern.slf4j.Slf4j;
 
 import com.deepoove.poi.config.Configure;

+ 9 - 4
easier-report-biz/src/main/java/com/yaoyicloud/render/BasicInfoRender.java → easier-report-biz/src/main/java/com/yaoyicloud/render/platform/BasicInfoRender.java

@@ -1,8 +1,9 @@
-package com.yaoyicloud.render;
+package com.yaoyicloud.render.platform;
 
 import java.io.IOException;
 
 import java.util.Map;
+import java.util.Objects;
 
 
 import com.deepoove.poi.config.Configure;
@@ -14,6 +15,7 @@ import com.google.protobuf.util.JsonFormat;
 import com.yaoyicloud.config.FilerepoProperties;
 
 import com.yaoyicloud.message.FxyProtos;
+import com.yaoyicloud.render.AbstractRender;
 import lombok.extern.slf4j.Slf4j;
 
 /**
@@ -94,16 +96,19 @@ public final class BasicInfoRender extends AbstractRender {
         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 (certReceived.equals("-")) {
+        if (Objects.equals(certReceived, "-")) {
             data.put("certReceived", "否");
         }
+
         Object bankLicense = data.get("bankLicense");
-        if (bankLicense.equals("-")) {
+        if (Objects.equals(bankLicense, "-")) {
             data.put("bankLicense", "否");
         }
+
         Object annualInspectionResult = data.get("annualInspectionResult");
-        if (annualInspectionResult.equals("-")) {
+        if (Objects.equals(annualInspectionResult, "-")) {
             data.put("annualInspectionResult", "否");
         }
     }

+ 2 - 1
easier-report-biz/src/main/java/com/yaoyicloud/render/FinancialInfoRender.java → easier-report-biz/src/main/java/com/yaoyicloud/render/platform/FinancialInfoRender.java

@@ -1,4 +1,4 @@
-package com.yaoyicloud.render;
+package com.yaoyicloud.render.platform;
 
 import java.io.IOException;
 
@@ -9,6 +9,7 @@ import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.yaoyicloud.config.FilerepoProperties;
 import com.yaoyicloud.message.FxyProtos;
+import com.yaoyicloud.render.AbstractRender;
 import lombok.extern.slf4j.Slf4j;
 
 import com.deepoove.poi.config.Configure;

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

@@ -1,4 +1,4 @@
-package com.yaoyicloud.render;
+package com.yaoyicloud.render.platform;
 
 import java.io.IOException;
 
@@ -11,6 +11,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.protobuf.util.JsonFormat;
 import com.yaoyicloud.config.FilerepoProperties;
 import com.yaoyicloud.message.FxyProtos;
+import com.yaoyicloud.render.AbstractRender;
 import lombok.extern.slf4j.Slf4j;
 
 /**

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

@@ -1,4 +1,4 @@
-package com.yaoyicloud.render.update;
+package com.yaoyicloud.render.platform.update;
 
 import java.io.IOException;
 import java.util.Map;

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

@@ -1,4 +1,4 @@
-package com.yaoyicloud.render.update;
+package com.yaoyicloud.render.platform.update;
 
 import java.io.IOException;
 import java.util.Collections;

+ 33 - 7
easier-report-biz/src/main/java/com/yaoyicloud/service/impl/ReportServiceImpl.java

@@ -9,16 +9,20 @@ import java.util.Map;
 import com.yaoyicloud.config.FilerepoProperties;
 import com.yaoyicloud.constant.enums.ModuleType;
 import com.yaoyicloud.constant.enums.ReportType;
-import com.yaoyicloud.render.AntiBriberyRender;
-import com.yaoyicloud.render.AttachmentSectionRender;
-import com.yaoyicloud.render.BasicInfoRender;
-import com.yaoyicloud.render.FinancialInfoRender;
+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.platform.AntiBriberyRender;
+import com.yaoyicloud.render.platform.AttachmentSectionRender;
+import com.yaoyicloud.render.platform.BasicInfoRender;
+import com.yaoyicloud.render.platform.FinancialInfoRender;
+import com.yaoyicloud.render.platform.ServiceProviderInfoRender;
 import com.yaoyicloud.render.association.AssociationBasicInfoRender;
 import com.yaoyicloud.render.foundation.FoundationBasicInfoRender;
-import com.yaoyicloud.render.update.BasicInfoNewRender;
-import com.yaoyicloud.render.update.PublicRecordNewRender;
+import com.yaoyicloud.render.platform.update.BasicInfoNewRender;
+import com.yaoyicloud.render.platform.update.PublicRecordNewRender;
 import com.yaoyicloud.service.ReportService;
 import com.yaoyicloud.template.AcademicAssociationReport;
 import com.yaoyicloud.template.FoundationReport;
@@ -85,6 +89,16 @@ public class ReportServiceImpl implements ReportService {
                     new AttachmentSectionRender(sessionId, filerepoProperties).renderDocx(data, processedData,
                         templateBytes, String.valueOf(relationId));
                 return reportPath;
+            case ASSOCIATION_ATTACHMENTSECTION:
+                reportPath =
+                    new AssociationAttachmentSectionRender(sessionId, filerepoProperties).renderDocx(data, processedData,
+                        templateBytes, String.valueOf(relationId));
+                return reportPath;
+            case FOUNDATION_ATTACHMENTSECTION:
+                reportPath =
+                    new AttachmentSectionRender(sessionId, filerepoProperties).renderDocx(data, processedData,
+                        templateBytes, String.valueOf(relationId));
+                return reportPath;
             case COMMON:
                 reportPath =
                     new ServiceProviderInfoRender(sessionId, filerepoProperties).renderDocx(data, processedData,
@@ -121,6 +135,18 @@ public class ReportServiceImpl implements ReportService {
                         templateBytes,
                         String.valueOf(relationId));
                 return reportPath;
+            case PROJECT:
+                reportPath =
+                    new ProjectInfoRender(sessionId, filerepoProperties).renderDocx(data, processedData,
+                        templateBytes,
+                        String.valueOf(relationId));
+                return reportPath;
+            case INTERESTCONFLICTS:
+                reportPath =
+                    new InterestConflictsRender(sessionId, filerepoProperties).renderDocx(data, processedData,
+                        templateBytes,
+                        String.valueOf(relationId));
+                return reportPath;
 
             default:
                 throw new UnsupportedOperationException("Unsupported module type: " + moduleType);

+ 277 - 235
easier-report-biz/src/main/proto/fxy.proto

@@ -4,325 +4,367 @@ option java_package = "com.yaoyicloud.message";
 option java_outer_classname = "FxyProtos";
 
 message ServiceProviderInfo {
-    optional string name = 1; // ${服务商信息:服务商名称}
-    optional string type = 2; // "基金会"
-    optional string reportDate = 3; // ${服务商信息:报告日期}
+  optional string name = 1; // ${服务商信息:服务商名称}
+  optional string type = 2; // "基金会"
+  optional string reportDate = 3; // ${服务商信息:报告日期}
 }
 
 message CheckItemDetail {
-    optional string name = 1;      //
-    optional string desc = 2;      //
-    optional string fact = 3;     //
-    optional string result = 4;      //
-    optional int64 score = 5;      //
-    optional string reviewResult = 6; // 复核结果
-    optional int32 reviewScore = 7; // 复核评分
-    optional string category = 8;
-    optional int32 rank = 9;  // 展示排序
+  optional string name = 1;      //
+  optional string desc = 2;      //
+  optional string fact = 3;     //
+  optional string result = 4;      //
+  optional int64 score = 5;      //
+  optional string reviewResult = 6; // 复核结果
+  optional int32 reviewScore = 7; // 复核评分
+  optional string category = 8;
+  optional int32 rank = 9;  // 展示排序
 }
 
 message CheckItemScore {
-    optional string category = 1;
-    optional string itemName = 2;
-    optional int64 score = 3;
+  optional string category = 1;
+  optional string itemName = 2;
+  optional int64 score = 3;
 }
 
 message CheckSummary {
-    optional int32 score = 1; // ${基本信息评分及建议:基本信息总分}
-    optional string riskSummary = 2; // ${基本信息评分及建议:风险综述}
-    optional string suggestion = 3 ; // ${基本信息评分及建议:建议}
+  optional int32 score = 1; // ${基本信息评分及建议:基本信息总分}
+  optional string riskSummary = 2; // ${基本信息评分及建议:风险综述}
+  optional string suggestion = 3 ; // ${基本信息评分及建议:建议}
 }
 
 message AuditResult {
-    optional string opinion = 2; // ${审核结果:审核意见}
-    optional string serviceProviderName = 3; // ${审核结果:服务商名称}
-    optional string auditDate = 4; // ${审核结果:审核日期}
-    optional string reportVersion = 5; // ${审核结果:报告版本}
-    optional string tenantName = 6; // ${服务商信息:租户名称}
+  optional string opinion = 2; // ${审核结果:审核意见}
+  optional string serviceProviderName = 3; // ${审核结果:服务商名称}
+  optional string auditDate = 4; // ${审核结果:审核日期}
+  optional string reportVersion = 5; // ${审核结果:报告版本}
+  optional string tenantName = 6; // ${服务商信息:租户名称}
 
-    optional CheckSummary overallSummary = 7;
-    repeated CheckItemScore checkItemScores = 8;
+  optional CheckSummary overallSummary = 7;
+  repeated CheckItemScore checkItemScores = 8;
 
   //  optional string reportDate = 11; // ${服务商信息:报告日期}
 }
 
-message SuperiorAuthority { // 直属机关
-    optional string sname = 1;
-    optional string nature = 2;
+message SuperiorAuthority {// 直属机关
+  optional string sname = 1;
+  optional string nature = 2;
 }
 
 message CompanyBasicInfoExt {
-    optional string industry = 1; // 所属行业
-    optional string paidInCapital = 2; // 实缴资本(单位:人民币万元)
-    optional string enterpriseScale = 3; // 企业规模(如:小型)
-    optional int32 insuredEmployees = 4; // 参保人数
-    optional string businessStatus = 5; // 经营状态(如:存续)
-    optional string registrationAuthority = 6; // 登记机关
-    optional string taxpayerQualification = 7; // 纳税人资质(如:增值税一般纳税人)
-    optional string enterpriseType = 8; // 企业类型(如:有限责任公司)
+  optional string industry = 1; // 所属行业
+  optional string paidInCapital = 2; // 实缴资本(单位:人民币万元)
+  optional string enterpriseScale = 3; // 企业规模(如:小型)
+  optional int32 insuredEmployees = 4; // 参保人数
+  optional string businessStatus = 5; // 经营状态(如:存续)
+  optional string registrationAuthority = 6; // 登记机关
+  optional string taxpayerQualification = 7; // 纳税人资质(如:增值税一般纳税人)
+  optional string enterpriseType = 8; // 企业类型(如:有限责任公司)
 }
 
 message AssociationBasicInfoExt {
-    optional string corporateMembers = 1; // 单位会员数量(如:超x家)
-    optional string individualMembers = 2; // 个人会员数量
-    optional string membershipFeeStandard = 3; // 会费收取标准(多行文本)
-    optional string mainActivityRegion = 4; // 主要活动覆盖地域(示例:长三角地区)
-    optional string sponsorshipRatio = 5; // 上一年度xxx公司赞助和捐赠额占总社会赞助和捐赠比例(单位:%,示例:1%)
+  optional string corporateMembers = 1; // 单位会员数量(如:超x家)
+  optional string individualMembers = 2; // 个人会员数量
+  optional string membershipFeeStandard = 3; // 会费收取标准(多行文本)
+  optional string mainActivityRegion = 4; // 主要活动覆盖地域(示例:长三角地区)
+  optional string sponsorshipRatio = 5; // 上一年度xxx公司赞助和捐赠额占总社会赞助和捐赠比例(单位:%,示例:1%)
 }
 
 message FoundationBasicInfoExt {
-    optional string foundationCategory = 1;          // 基金会类别(公募/非公募)
-    optional string lastYearSponsorshipDonationRatio = 2; // 上一年度XXX赞助和捐赠额占比(%)
-    optional string initialFund = 3;             // 原始基金(单位:元)
-    optional string lastYearDonationIncome = 4;  // 最近一年捐赠收入(单位:元)
-    optional string secretaryGeneral = 5;            // 秘书长
-    optional string chairman = 6;                    // 理事长
-    optional int32 numberOfDirectors = 7;          // 理事人数
+  optional string foundationCategory = 1;          // 基金会类别(公募/非公募)
+  optional string lastYearSponsorshipDonationRatio = 2; // 上一年度XXX赞助和捐赠额占比(%)
+  optional string initialFund = 3;             // 原始基金(单位:元)
+  optional string lastYearDonationIncome = 4;  // 最近一年捐赠收入(单位:元)
+  optional string secretaryGeneral = 5;            // 秘书长
+  optional string chairman = 6;                    // 理事长
+  optional int32 numberOfDirectors = 7;          // 理事人数
 }
 
 message Attachment {
-    optional string fileName = 1;
-    optional string fileUri = 2;
+  optional string fileName = 1;
+  optional string fileUri = 2;
 }
 
 /* 通用基础信息 */
 message BasicInfo {
-    optional string entName = 1;
-    optional string establishmentDate = 2; // 成立登记日期(格式:yyyy-MM-dd)
-    optional string registrationValidity = 3; // 登记有效期(格式:yyyy-MM-dd)
-    optional string officialWebsite = 4; // 官方网站链接
-    optional string registeredCapital = 5; // 注册资金(单位:万元)
-    optional string netAsset = 6;                // 净资产(单位:元)
-    optional string businessScope = 7; // 业务范围描述
-    optional string missionStatement = 8; // 机构宗旨
-    optional string legalRepresentative = 9; // 法定代表人
-    optional string officeAddress = 10; // 实际办公地址
-    optional string location = 11;          // 基金会所在地
-    optional string contactNumber = 12; // 联系电话
-    optional int32 fullTimeStaffCount = 13;         // 全职员工数量
-    optional string evaluationLevel = 14; // 评估等级(如:3A)
-    optional bool useExternalService = 15; // 是否通常需要外包合作项目(true/false)
-    optional string projectServiceVendors = 16; // 项目服务执行方名单(如:无/合作方名称列表)
-    repeated SuperiorAuthority superiorAuthority = 17; // 业务主管单位情况
-
-    optional string basicInfoCheckResult = 18;
-    repeated Attachment relatedEntityImages = 19;            // 支机构或专业委员会情况
-    optional string relatedEntitiesResult = 20; // 利益冲突风险提示 根据客户在申报链接中填写的答案 填写是,提示1,填写不是,则提示0
-
-    optional string certReceived = 21;    // ${经营情况:《*登记证书》:相关资料是否收到}
-    optional string renzcode = 22;               // ${认证代码}
-    optional string validate = 23;               // ${有效期}
-    optional string companyCode = 24; // ${统一社会信用代码}
-    optional string companyRenzcode = 25;               // ${认证代码}
-    optional string companyValidate = 26;               // ${有效期}
-    optional string bankLicense = 27;             //银行开户许可证
-    optional string bankRenzcode = 28;               // ${认证代码}
-    optional string bankValidate = 29;               // ${有效期}
-    optional string annualInspectionResult = 30;    // ${经营情况:年检结果}
-
-    repeated CheckItemDetail basicInfoChecks = 31; // 审查内容
-    optional CheckSummary basicInfoSummary = 32;          // 基本信息评分及建议(2.5)
-
-    optional CompanyBasicInfoExt platformExt = 33;
-    optional AssociationBasicInfoExt associationExt = 34;
-    optional FoundationBasicInfoExt foundationExt = 35;
+  optional string entName = 1;
+  optional string establishmentDate = 2; // 成立登记日期(格式:yyyy-MM-dd)
+  optional string registrationValidity = 3; // 登记有效期(格式:yyyy-MM-dd)
+  optional string officialWebsite = 4; // 官方网站链接
+  optional string registeredCapital = 5; // 注册资金(单位:万元)
+  optional string netAsset = 6;                // 净资产(单位:元)
+  optional string businessScope = 7; // 业务范围描述
+  optional string missionStatement = 8; // 机构宗旨
+  optional string legalRepresentative = 9; // 法定代表人
+  optional string officeAddress = 10; // 实际办公地址
+  optional string location = 11;          // 基金会所在地
+  optional string contactNumber = 12; // 联系电话
+  optional int32 fullTimeStaffCount = 13;         // 全职员工数量
+  optional string evaluationLevel = 14; // 评估等级(如:3A)
+  optional bool useExternalService = 15; // 是否通常需要外包合作项目(true/false)
+  optional string projectServiceVendors = 16; // 项目服务执行方名单(如:无/合作方名称列表)
+  repeated SuperiorAuthority superiorAuthority = 17; // 业务主管单位情况
+
+  optional string basicInfoCheckResult = 18;
+  repeated Attachment relatedEntityImages = 19;            // 支机构或专业委员会情况
+  optional string relatedEntitiesResult = 20; // 利益冲突风险提示 根据客户在申报链接中填写的答案 填写是,提示1,填写不是,则提示0
+
+  optional string certReceived = 21;    // ${经营情况:《*登记证书》:相关资料是否收到}
+  optional string renzcode = 22;               // ${认证代码}
+  optional string validate = 23;               // ${有效期}
+  optional string companyCode = 24; // ${统一社会信用代码}
+  optional string companyRenzcode = 25;               // ${认证代码}
+  optional string companyValidate = 26;               // ${有效期}
+  optional string bankLicense = 27;             //银行开户许可证
+  optional string bankRenzcode = 28;               // ${认证代码}
+  optional string bankValidate = 29;               // ${有效期}
+  optional string annualInspectionResult = 30;    // ${经营情况:年检结果}
+
+  repeated CheckItemDetail basicInfoChecks = 31; // 审查内容
+  optional CheckSummary basicInfoSummary = 32;          // 基本信息评分及建议(2.5)
+
+  optional CompanyBasicInfoExt platformExt = 33;
+  optional AssociationBasicInfoExt associationExt = 34;
+  optional FoundationBasicInfoExt foundationExt = 35;
 }
 
 message DishonestPersonsInfo {
-    optional string province = 1; // 省份
-    optional string inDate = 2; // 立案时间
-    optional string docNumber = 3; // 执行依据文号
-    optional string finalDuty = 4; // 生效法律文书确定的义务
-    optional string executionStatus = 5; // 被执行人履行情况
-    optional string caseNumber = 6; // 案号
-    optional string amount = 7; // 执行标的
-    optional string publishDate = 8; // 发布日期
-    optional string court = 9; // 执行法院
-    optional string executionDesc = 10; // 失信被执行人行为情况
-    optional string disabled = 11; // 是否是历史
-    optional string operName = 12; // 法定代表人
-    optional string number = 13; // 组织机构号
-    optional string exDepartment = 14; // 做出执行依据单位
-    optional string id = 15;
+  optional string province = 1; // 省份
+  optional string inDate = 2; // 立案时间
+  optional string docNumber = 3; // 执行依据文号
+  optional string finalDuty = 4; // 生效法律文书确定的义务
+  optional string executionStatus = 5; // 被执行人履行情况
+  optional string caseNumber = 6; // 案号
+  optional string amount = 7; // 执行标的
+  optional string publishDate = 8; // 发布日期
+  optional string court = 9; // 执行法院
+  optional string executionDesc = 10; // 失信被执行人行为情况
+  optional string disabled = 11; // 是否是历史
+  optional string operName = 12; // 法定代表人
+  optional string number = 13; // 组织机构号
+  optional string exDepartment = 14; // 做出执行依据单位
+  optional string id = 15;
 }
 
 message AbnormalsInfo {
-    optional string entName = 1; // 企业名称
-    optional string inDate = 2; // 列入时间
-    optional string department = 3; // 做出决定机关
-    optional string province = 4; // 省份
-    optional string outDate = 5; // 移出时间
-    optional string outReason = 6; // 移出原因
-    optional string regNo = 7; // 注册号
-    optional string disabled = 8; // 历史异常
-    optional string inReason = 9; // 列入原因
-    optional string outDepartment = 10; // 移出决定机关
-    optional string id = 11;
+  optional string entName = 1; // 企业名称
+  optional string inDate = 2; // 列入时间
+  optional string department = 3; // 做出决定机关
+  optional string province = 4; // 省份
+  optional string outDate = 5; // 移出时间
+  optional string outReason = 6; // 移出原因
+  optional string regNo = 7; // 注册号
+  optional string disabled = 8; // 历史异常
+  optional string inReason = 9; // 列入原因
+  optional string outDepartment = 10; // 移出决定机关
+  optional string id = 11;
 }
 
 message AdministrativePenaltyRecord {
-    optional string number = 1; // 决定书文号
-    optional string penaltyData = 2; // 处罚日期
-    optional string departmentName = 3;
-    optional string entName = 4; // 企业名称
-    optional string illegalType = 5; // 违法行为类型
-    optional string source = 6; // 来源
-    optional string content = 7; // 行政处罚内容
-    optional string publishDate = 8; // 公示日期
-    optional string description = 9; // 详情
-    optional string disabled = 10; // 是否成为历史
-    optional string basedOn = 11; // 处罚依据
-    optional string seqNo = 12; // 序号
-    optional string operName = 13; // 法定代表人
-    optional string punishAmnt = 14; // 罚款金额
-    optional string department = 15; // 决定机关名称
-    optional string id = 16;
+  optional string number = 1; // 决定书文号
+  optional string penaltyData = 2; // 处罚日期
+  optional string departmentName = 3;
+  optional string entName = 4; // 企业名称
+  optional string illegalType = 5; // 违法行为类型
+  optional string source = 6; // 来源
+  optional string content = 7; // 行政处罚内容
+  optional string publishDate = 8; // 公示日期
+  optional string description = 9; // 详情
+  optional string disabled = 10; // 是否成为历史
+  optional string basedOn = 11; // 处罚依据
+  optional string seqNo = 12; // 序号
+  optional string operName = 13; // 法定代表人
+  optional string punishAmnt = 14; // 罚款金额
+  optional string department = 15; // 决定机关名称
+  optional string id = 16;
 }
 
 message AdministrativeTaxPenalty {
-    optional string departmentName = 1; // 企业名称
-    optional string time = 2; // 发生时间
-    optional string type = 3; // 公示税务机关
-    optional string uTags = 4; // 是否是历史
-    optional string property = 5; // 案件性质
-    optional string createTime = 6; // 创建时间
-    optional string financeOfficer = 7; // 财务负责人
-    optional string name = 8; // 纳税人名称
-    optional string creditNo = 9; // 纳税人识别号
-    optional string oper = 10; // 法定代表人
-    optional string address = 11; // 注册地址
-    optional string result = 12; // 相关法律依据及,税务处理处罚情况
-    optional string orgNo = 13; // 组织机构代码
-    optional string url = 14; // 原文链接
-    optional string id = 15;
+  optional string departmentName = 1; // 企业名称
+  optional string time = 2; // 发生时间
+  optional string type = 3; // 公示税务机关
+  optional string uTags = 4; // 是否是历史
+  optional string property = 5; // 案件性质
+  optional string createTime = 6; // 创建时间
+  optional string financeOfficer = 7; // 财务负责人
+  optional string name = 8; // 纳税人名称
+  optional string creditNo = 9; // 纳税人识别号
+  optional string oper = 10; // 法定代表人
+  optional string address = 11; // 注册地址
+  optional string result = 12; // 相关法律依据及,税务处理处罚情况
+  optional string orgNo = 13; // 组织机构代码
+  optional string url = 14; // 原文链接
+  optional string id = 15;
 }
 
 message AdministrativeSeriousIllegal {
-    optional string departName = 1; // 企业名称
-    optional string time = 2; // 列入日期
-    optional string decisionDept = 3; // 作出决定机关(列入)
-    optional string inReason = 4; // 列入原因
-    optional string outDate = 5; // 移出时间
-    optional string outReason = 6; // 移出原因
-    optional string outDepartment = 7; // 作出决定机关(移出)
-    optional string isHistory = 8; // 是否是历史信息
-    optional string id = 9;
+  optional string departName = 1; // 企业名称
+  optional string time = 2; // 列入日期
+  optional string decisionDept = 3; // 作出决定机关(列入)
+  optional string inReason = 4; // 列入原因
+  optional string outDate = 5; // 移出时间
+  optional string outReason = 6; // 移出原因
+  optional string outDepartment = 7; // 作出决定机关(移出)
+  optional string isHistory = 8; // 是否是历史信息
+  optional string id = 9;
 }
 
 message PublicRecord {
-    repeated DishonestPersonsInfo dishonestPersons = 1; // 失信被执行人(3.1)
-    repeated AbnormalsInfo businessAbnormals = 2; // 经营异常(3.2)
-    repeated AdministrativePenaltyRecord penaltyRecords = 3; // 行政处罚记录(3.3)
-    repeated AdministrativeTaxPenalty taxPenalties = 4; // 税务处罚记录(3.4)
-    repeated AdministrativeSeriousIllegal severeViolations = 5; // 严重违法记录(3.5)
-    optional CheckSummary publicRecordSummary = 6; // 公共记录评分及建议(3.6)
+  repeated DishonestPersonsInfo dishonestPersons = 1; // 失信被执行人(3.1)
+  repeated AbnormalsInfo businessAbnormals = 2; // 经营异常(3.2)
+  repeated AdministrativePenaltyRecord penaltyRecords = 3; // 行政处罚记录(3.3)
+  repeated AdministrativeTaxPenalty taxPenalties = 4; // 税务处罚记录(3.4)
+  repeated AdministrativeSeriousIllegal severeViolations = 5; // 严重违法记录(3.5)
+  optional CheckSummary publicRecordSummary = 6; // 公共记录评分及建议(3.6)
 }
 
 message FinancialData {
-    optional int32 year = 1; // 年份(如2022、2023、2024)
-    optional string donationIncome = 2; // 捐赠收入(单位:元)
-    optional string publicExpense = 3; // 公益事业支出(单位:元)
-    optional string totalAssets = 4; // 总资产(单位:元) 资产合计
-    optional string netAssets = 5; // 净资产(单位:元)
-    optional string totalIncome = 6; // 总收入(单位:元) 收入合计
-    optional string investmentIncome = 7; // 投资收益(单位:元)
-    optional string governmentGrants = 8; // 政府补助收入(单位:元)
-    optional string serviceIncome = 9; // 服务收入(单位:元)
-    optional string totalExpense = 10; // 总支出(单位:元)
-    optional string salaryExpense = 11; // 工资福利支出(单位:元)
-    optional string adminExpense = 12; // 行政办公支出(单位:元)
-    optional string activityCost = 13; // 业务活动成本(单位:元)
-    optional string managementExpense = 14; // 管理费用(单位:元)
-    optional string fundraisingExpense = 15; // 筹资费用(单位:元)
-    optional string lastYearFundBalance = 16; // 上年基金余额(单位:元)
-
-    optional string flowAssets = 17; // 流动资产
-    optional string flowLiabilities = 18; // 流动负债
-    optional string flowCapital = 19; // 营运资本
-    optional string fixedAsset = 20; // 固定资产
-    optional string inventory = 21; // 存货
-    optional string receivables = 22; // 应收账款
-    optional string liabTotal = 23; // 总负债
-    optional string las3yTotAmtLiaEquMap = 24; // 所有者权益
-    optional string operatingIncome = 25; // 营业收入
-    optional string mainBusInc = 26; // 主营业务收入
-    optional string mainBusProfit = 27; // 营业利润
-    optional string netProfit = 28; // 净利润
-    optional string las3yTotProfMap = 29; // 利润总额
-    optional string interestExpense = 30; // 利息支出
-
-    //捐赠项目成本
-    optional string donationProjectCost= 31;
-    //净资产合计
-    optional string totalNetAssets = 32;
-    //费用合计
-    optional string totalCost = 33;
+  optional int32 year = 1; // 年份(如2022、2023、2024)
+  optional string donationIncome = 2; // 捐赠收入(单位:元)
+  optional string publicExpense = 3; // 公益事业支出(单位:元)
+  optional string totalAssets = 4; // 总资产(单位:元) 资产合计
+  optional string netAssets = 5; // 净资产(单位:元)
+  optional string totalIncome = 6; // 总收入(单位:元) 收入合计
+  optional string investmentIncome = 7; // 投资收益(单位:元)
+  optional string governmentGrants = 8; // 政府补助收入(单位:元)
+  optional string serviceIncome = 9; // 服务收入(单位:元)
+  optional string totalExpense = 10; // 总支出(单位:元)
+  optional string salaryExpense = 11; // 工资福利支出(单位:元)
+  optional string adminExpense = 12; // 行政办公支出(单位:元)
+  optional string activityCost = 13; // 业务活动成本(单位:元)
+  optional string managementExpense = 14; // 管理费用(单位:元)
+  optional string fundraisingExpense = 15; // 筹资费用(单位:元)
+  optional string lastYearFundBalance = 16; // 上年基金余额(单位:元)
+
+  optional string flowAssets = 17; // 流动资产
+  optional string flowLiabilities = 18; // 流动负债
+  optional string flowCapital = 19; // 营运资本
+  optional string fixedAsset = 20; // 固定资产
+  optional string inventory = 21; // 存货
+  optional string receivables = 22; // 应收账款
+  optional string liabTotal = 23; // 总负债
+  optional string las3yTotAmtLiaEquMap = 24; // 所有者权益
+  optional string operatingIncome = 25; // 营业收入
+  optional string mainBusInc = 26; // 主营业务收入
+  optional string mainBusProfit = 27; // 营业利润
+  optional string netProfit = 28; // 净利润
+  optional string las3yTotProfMap = 29; // 利润总额
+  optional string interestExpense = 30; // 利息支出
+
+  //捐赠项目成本
+  optional string donationProjectCost = 31;
+  //净资产合计
+  optional string totalNetAssets = 32;
+  //费用合计
+  optional string totalCost = 33;
 }
 
 message FinancialIndicator {
-    optional string category = 1; // 分类(如"运营能力"、"发展能力")
-    optional string indicatorName = 2; // 指标名称(如"公益支出比例")财务指标
-    optional string formula = 3; // 计算公式(如"公益支出/上年基金余额")
+  optional string category = 1; // 分类(如"运营能力"、"发展能力")
+  optional string indicatorName = 2; // 指标名称(如"公益支出比例")财务指标
+  optional string formula = 3; // 计算公式(如"公益支出/上年基金余额")
 
-    repeated string values = 4;  //按年取值
+  repeated string values = 4;  //按年取值
 }
 
 message FinancialInfo {
-    repeated FinancialData financialDataSeq = 1; // 重要财务数据(4.1)
-    repeated string years = 4;   //按年取值
-    optional string remark = 5; // 备注
-    repeated FinancialIndicator indicators = 9; // 财务指标(4.2)
-    repeated CheckItemDetail financialCheckDetails = 10;
-    optional CheckSummary financialSummary = 11; // 财务信息评分及建议(4.3)
-    repeated Attachment financialFiles = 12; // 没有财务解析时的临时方案
-
-    // 平台报告新加字段
-    optional string operatingRevenue = 13; // 最近一年营业收入
-    optional string neProfit = 14; // 最近一年净利润
+  repeated FinancialData financialDataSeq = 1; // 重要财务数据(4.1)
+  repeated string years = 4;   //按年取值
+  optional string remark = 5; // 备注
+  repeated FinancialIndicator indicators = 9; // 财务指标(4.2)
+  repeated CheckItemDetail financialCheckDetails = 10;
+  optional CheckSummary financialSummary = 11; // 财务信息评分及建议(4.3)
+  repeated Attachment financialFiles = 12; // 没有财务解析时的临时方案
+
+  // 平台报告新加字段
+  optional string operatingRevenue = 13; // 最近一年营业收入
+  optional string neProfit = 14; // 最近一年净利润
 }
 
 message QuestionnaireItem {
-    optional int32 id = 1;
-    optional string question = 2;
-    optional string answer = 3;
+  optional int32 id = 1;
+  optional string question = 2;
+  optional string answer = 3;
 }
 
 message AntiBribery {
-    repeated QuestionnaireItem questionnaireItems = 1; // 反贿赂反腐败诚信保证问卷
-    optional CheckSummary antiBriberySummary = 2; // 反贿赂反腐败诚信保证评分及建议
+  repeated QuestionnaireItem questionnaireItems = 1; // 反贿赂反腐败诚信保证问卷
+  optional CheckSummary antiBriberySummary = 2; // 反贿赂反腐败诚信保证评分及建议
+}
+
+message ProjectInfo {
+  repeated Attachment files = 1;            //项目情况
+  optional CheckSummary projectInfoSummary = 2;
 }
 
 /* 包含所有可能的附件 */
 message AttachmentSection {
-    optional string selfDeclLink = 1;
-    repeated string fillDeclLinks = 2;
+  optional string selfDeclLink = 1;
+  repeated string fillDeclLinks = 2;
+
+  repeated Attachment businessLicenseImages = 3; // 营业执照图片路径
+
+  repeated Attachment bankCertificateImages = 4; // 银行开户证明图片路径
+
+  repeated Attachment isoCertificationImages = 5; // ISO认证证书图片路径
+
+  repeated Attachment otherCertifications = 6; // 其他资质文件路径
+
+  repeated Attachment securityLevelCertifications = 7; // 信息安全等级保护证明路径
+
+  repeated Attachment organizationalStructureImages = 8; // 组织架构图路径
+
+  repeated Attachment financialInfoLinks = 9; // 财务信息在线链接
+
+  repeated Attachment taxDeclarationImages = 10; // 增值税申报表路径
+
+  repeated Attachment taxPaymentCertificateImages = 11; // 完税凭证图片路径
+
+  repeated Attachment socialSecurityDetailsLinks = 12; // 社保缴纳证明路径
+
+  repeated Attachment nsxydjwj = 13; // 纳税信用等级相关支持性文件
+
+  repeated Attachment interestConflicts = 14; // 利益冲突
+
+  repeated Attachment disanfangcangzhaos = 15; // 第三方参照
+
+  repeated Attachment overallGuaranteeStatements = 16; // 总体保证声明
+
+}
+
+message AssociationattachmentSection {
+  optional string selfDeclLink = 1;
+  repeated string fillDeclLinks = 2;
+  repeated Attachment businessLicenseImages = 3; // 营业执照图片路径
+
+  repeated Attachment bankCertificateImages = 4; // 银行开户证明图片路径
 
-    repeated Attachment businessLicenseImages = 3; // 营业执照图片路径
+  repeated Attachment overallGuaranteeStatements = 16; // 总体保证声明
 
-    repeated Attachment bankCertificateImages = 4; // 银行开户证明图片路径
+  repeated Attachment legalRegistrationCertImages = 17; //社会团体法人登记证书图片路径(多张)
 
-    repeated Attachment isoCertificationImages = 5; // ISO认证证书图片路径
+  repeated Attachment annualInspectionResultImage = 18; //最新年检结果页图片路径
 
-    repeated Attachment otherCertifications = 6; // 其他资质文件路径
+  repeated Attachment assessmentLevelCertImage = 19; //评估等级证书图片路径(1A-5A)
 
-    repeated Attachment securityLevelCertifications = 7; // 信息安全等级保护证明路径
+  repeated Attachment fullCharterImage = 20; //完整章程副本
 
-    repeated Attachment organizationalStructureImages = 8; // 组织架构图路径
+  repeated Attachment topDonorsListImage = 21; //前十大捐赠方名单图片路径
 
-    repeated Attachment financialInfoLinks = 9; // 财务信息在线链接
+  repeated Attachment topExpenditureListImage = 22; //前十大支出方名单图片路径
 
-    repeated Attachment taxDeclarationImages = 10; // 增值税申报表路径
+  repeated Attachment managementFilingFormImage = 23; //管理层备案表图片路径(如有)
 
-    repeated Attachment taxPaymentCertificateImages = 11; // 完税凭证图片路径
+  repeated Attachment jigoupinggu = 24; //机构评估等级证书
 
-    repeated Attachment socialSecurityDetailsLinks = 12; // 社保缴纳证明路径
+  repeated Attachment nianjianjieguo = 25; //年检结果通知单
 
-    repeated Attachment nsxydjwj = 13; // 纳税信用等级相关支持性文件
+  repeated Attachment principalInfoImage = 26; //机构负责人信息图片路径
 
-    repeated Attachment interestConflicts = 14; // 利益冲突
+  repeated Attachment projectInfoImage = 27; //项目信息
 
-    repeated Attachment disanfangcangzhaos = 15; // 第三方参照
+  repeated Attachment otherInfoImage = 28; //其他分支机构
 
-    repeated Attachment overallGuaranteeStatements = 16; // 总体保证声明
 
+  repeated Attachment branchInfoImage = 29; //地方分会情况图片路径
 }

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

@@ -14,7 +14,7 @@
 //import com.yaoyicloud.message.FxyProtos.AntiBribery;
 //import com.yaoyicloud.message.FxyProtos.CheckSummary;
 //import com.yaoyicloud.message.FxyProtos.QuestionnaireItem;
-//import com.yaoyicloud.render.AntiBriberyRender;
+//import com.yaoyicloud.render.platform.AntiBriberyRender;
 //
 //public class
 //

+ 1 - 1
easier-report-biz/src/test/java/com/yaoyicloud/render/test/TestAttachmentSectionRender.java

@@ -14,7 +14,7 @@
 //
 //import com.yaoyicloud.message.FxyProtos.Attachment;
 //import com.yaoyicloud.message.FxyProtos.AttachmentSection;
-//import com.yaoyicloud.render.AttachmentSectionRender;
+//import com.yaoyicloud.render.platform.AttachmentSectionRender;
 //
 //import javax.annotation.Resource;
 //

+ 1 - 1
easier-report-biz/src/test/java/com/yaoyicloud/render/test/TestBasicInfoRender.java

@@ -11,7 +11,7 @@
 //import com.yaoyicloud.message.FxyProtos.BasicInfo;
 //import com.yaoyicloud.message.FxyProtos.CheckItemDetail;
 //import com.yaoyicloud.message.FxyProtos.CheckSummary;
-//import com.yaoyicloud.render.BasicInfoRender;
+//import com.yaoyicloud.render.platform.BasicInfoRender;
 //
 //public class TestBasicInfoRender {
 //

+ 1 - 1
easier-report-biz/src/test/java/com/yaoyicloud/render/test/TestFinancialInfoRender.java

@@ -13,7 +13,7 @@
 //import com.yaoyicloud.message.FxyProtos.FinancialData;
 //import com.yaoyicloud.message.FxyProtos.FinancialIndicator;
 //import com.yaoyicloud.message.FxyProtos.FinancialInfo;
-//import com.yaoyicloud.render.FinancialInfoRender;
+//import com.yaoyicloud.render.platform.FinancialInfoRender;
 //
 //import javax.annotation.Resource;
 //

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

@@ -11,7 +11,7 @@
 //import com.yaoyicloud.message.FxyProtos.CheckSummary;
 //import com.yaoyicloud.message.FxyProtos.DishonestPersonsInfo;
 //import com.yaoyicloud.message.FxyProtos.PublicRecord;
-//import com.yaoyicloud.render.PublicRecordRender;
+//import com.yaoyicloud.render.platform.PlatformPublicRecordRender;
 //
 //public class TestPublicRecordRender {
 //
@@ -20,7 +20,7 @@
 //
 //        byte[] content = Files
 //            .readAllBytes(Paths.get(getClass().getClassLoader().getResource("docx/public_record.docx").getFile()));
-//        PublicRecordRender render = new PublicRecordRender("../temp/");
+//        PlatformPublicRecordRender render = new PlatformPublicRecordRender("../temp/");
 //        String retPath = render.renderDocx(
 //            PublicRecord.newBuilder()
 //                .setPublicRecordSummary(CheckSummary.newBuilder().setRiskSummary("high risk").setSuggestion("accept it"))

+ 1 - 1
easier-report-biz/src/test/java/com/yaoyicloud/render/test/TestServiceProviderInfoRender.java

@@ -9,7 +9,7 @@
 //import org.junit.Test;
 //
 //import com.yaoyicloud.message.FxyProtos.ServiceProviderInfo;
-//import com.yaoyicloud.render.ServiceProviderInfoRender;
+//import com.yaoyicloud.render.platform.ServiceProviderInfoRender;
 //
 //public class TestServiceProviderInfoRender {
 //

BIN
easier-report-biz/src/test/resources/docx/antiBribery.docx


BIN
easier-report-biz/src/test/resources/docx/association_attachment.docx


BIN
easier-report-biz/src/test/resources/docx/association_basic_info.docx


BIN
easier-report-biz/src/test/resources/docx/doundation_finance.docx


BIN
easier-report-biz/src/test/resources/docx/finance.docx


BIN
easier-report-biz/src/test/resources/docx/interestConflicts.docx


BIN
easier-report-biz/src/test/resources/docx/project_info.docx


BIN
easier-report-biz/src/test/resources/docx/public_record.docx


BIN
easier-report-biz/src/test/resources/docx/public_record_new.docx


BIN
easier-report-biz/src/test/resources/docx/service_provider_info.docx


Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor