Просмотр исходного кода

build 新版报告平台公司

mamingxu 3 дней назад
Родитель
Сommit
ed708559c2

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

@@ -33,8 +33,9 @@ public enum ModuleType {
 
     PLATFORM_COMPANY_BASICINFO_NEW("PLATFORM_COMPANY_BASICINFO_NEW", "工商信息"),
     ANTIBRIBERY_NEW("ANTIBRIBERY_NEW", "其他风险"),
-    PLATFORM_COMPANY_FinancialInfo_NEW("PLATFORM_COMPANY_FinancialInfo_NEW", "经营风险"),
-    PUBLIC_RECORD_NEW("PUBLIC_RECORD_NEW", "司法风险");
+    PLATFORM_COMPANY_FINANCIALINFO_NEW("PLATFORM_COMPANY_FINANCIALINFO_NEW", "经营风险"),
+    PUBLIC_RECORD_NEW("PUBLIC_RECORD_NEW", "司法风险"),
+    TAX_NEW("TAX_NEW", "税务风险");
     /**
      * 类型
      */

+ 85 - 3
easier-report-biz/src/main/java/com/yaoyicloud/render/AbstractNewRender.java

@@ -19,9 +19,11 @@ import java.util.stream.Collectors;
 
 import javax.imageio.ImageIO;
 
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.pdfbox.Loader;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.rendering.PDFRenderer;
+import org.apache.poi.xwpf.usermodel.IBodyElement;
 import org.apache.poi.xwpf.usermodel.UnderlinePatterns;
 import org.apache.poi.xwpf.usermodel.XWPFDocument;
 import org.apache.poi.xwpf.usermodel.XWPFHyperlinkRun;
@@ -118,6 +120,7 @@ public abstract class AbstractNewRender {
         Configure config = builder.build();
         XWPFTemplate template =
             XWPFTemplate.compile(new ByteArrayInputStream(templateFileContent), config).render(dataMap);
+
         ArrayList<String> templateDele = new ArrayList<>();
         for (Map.Entry<String, Object> entry : specialMap.entrySet()) {
             String key = entry.getKey();
@@ -129,6 +132,7 @@ public abstract class AbstractNewRender {
         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);
@@ -263,6 +267,70 @@ public abstract class AbstractNewRender {
         return strings;
     }
 
+    /**
+     * 针对数据存在
+     * 
+     * @return
+     */
+    public RenderPolicy deleteLoopRowTableRenderPolicy() {
+        return new LoopRowTableRenderPolicy() {
+            @Override
+            public void render(ElementTemplate eleTemplate, Object data, XWPFTemplate template) {
+                super.render(eleTemplate, data, template);
+                ArrayList<Map<String, String>> data1 = (ArrayList<Map<String, String>>) data;
+                if (CollectionUtils.isEmpty(data1)) {
+                    RunTemplate runTemplate = (RunTemplate) eleTemplate;
+                    XWPFRun run = runTemplate.getRun();
+                    XWPFTableCell tagCell = (XWPFTableCell) ((XWPFParagraph) run.getParent()).getBody();
+                    XWPFTable table = tagCell.getTableRow().getTable();
+                    XWPFDocument doc = template.getXWPFDocument();
+
+                    int tablePos = -1;
+                    List<IBodyElement> bodyElements = doc.getBodyElements();
+                    for (int i = 0; i < bodyElements.size(); i++) {
+                        if (bodyElements.get(i) == table) {
+                            tablePos = i;
+                            break;
+                        }
+                    }
+                    if (tablePos >= 0) {
+                        // 4.1 先删除前一个段落(如果存在且是段落)
+                        int paragraphsToDelete = 2; // 要删除的段落数量
+                        for (int i = 0; i < paragraphsToDelete && tablePos - 1 >= 0; i++) {
+                            IBodyElement prevElement = doc.getBodyElements().get(tablePos - 1);
+                            if (prevElement instanceof XWPFParagraph) {
+                                doc.removeBodyElement(tablePos - 1);
+                                tablePos--; // 每删除一个段落,表格位置前移
+                            }
+                        }
+
+                        // 4.2 强制删除表格(通过操作底层 XML)
+                        doc.removeBodyElement(tablePos);
+                        doc.getTables();
+
+                    }
+                }
+            }
+            // // 辅助方法:在XML中找到表格的实际位置
+            // private int findTablePositionInXML(CTBody body, XWPFTable table) {
+            // List<CTP> paragraphs = body.getPList();
+            // List<CTTbl> tables = body.getTblList();
+            //
+            // for (int i = 0; i < tables.size(); i++) {
+            // if (tables.get(i) == table.getCTTbl()) {
+            // return i;
+            // }
+            // }
+            // return -1;
+            // }
+
+            // int xmlTblPos = findTablePositionInXML(body, table);
+            // if (xmlTblPos >= 0) {
+            // body.removeTbl(xmlTblPos);
+            // }
+        };
+    }
+
     /**
      * 针对于json格式全量传输数据的列表处理 将默认值null转为“-”
      * 
@@ -699,11 +767,12 @@ public abstract class AbstractNewRender {
         }
     }
 
+    /**
+     * 财务信息计算平均值的策略
+     */
     public class LoopRowIncludeStatisticsTableRenderPolicy extends LoopRowTableRenderPolicy {
 
         private String valueTag;
-        // 存储计算得到的平均值
-        private static final Map<String, String> AVERAGE_VALUES = new HashMap<>();
 
         public LoopRowIncludeStatisticsTableRenderPolicy(String valueTag) {
             this.valueTag = valueTag;
@@ -711,6 +780,13 @@ public abstract class AbstractNewRender {
 
         @Override
         public void render(ElementTemplate eleTemplate, Object data, XWPFTemplate template) {
+
+            RunTemplate runTemplate = (RunTemplate) eleTemplate;
+            XWPFRun run = runTemplate.getRun();
+
+            XWPFTableCell tagCell = (XWPFTableCell) ((XWPFParagraph) run.getParent()).getBody();
+            XWPFTable table = tagCell.getTableRow().getTable();
+
             @SuppressWarnings("unchecked")
             List<Map<String, Object>> mpData = (List<Map<String, Object>>) data;
 
@@ -760,10 +836,16 @@ public abstract class AbstractNewRender {
                 }
 
                 row.put("avg", formattedAvg);
-                // AVERAGE_VALUES.put(row.get(""), formattedAvg);
             }
 
             super.render(eleTemplate, data, template);
+            try {
+                // merge the first column
+                Util.mergeFirstNColSimple(table, 1, 0);
+            } catch (Exception e) {
+                throw new RenderException(
+                    "LoopRowCutAndMergeFirstColTable for " + eleTemplate + " error: " + e.getMessage(), e);
+            }
         }
     }
 }

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

@@ -13,7 +13,6 @@ import com.yaoyicloud.config.FilerepoProperties;
 import com.yaoyicloud.message.FxyProtos;
 import com.yaoyicloud.render.AbstractNewRender;
 
-
 import lombok.extern.slf4j.Slf4j;
 
 /**
@@ -23,6 +22,7 @@ import lombok.extern.slf4j.Slf4j;
 @Slf4j
 public final class BasicInfoNewRender extends AbstractNewRender {
     private final FilerepoProperties filerepoProperties;
+
     public BasicInfoNewRender(String cwd, FilerepoProperties filerepoProperties) {
         super(cwd);
         this.filerepoProperties = filerepoProperties;
@@ -46,27 +46,31 @@ public final class BasicInfoNewRender extends AbstractNewRender {
      * @return 本地文件目录
      * @throws IOException
      */
-    public String renderDocx(String info, Map<String, Object> addtionalMap, byte[] templateFileContent, String relationId) 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();
         RenderPolicy indicatorsRenderPolicy = this.indicatorsRenderPolicy();
+        RenderPolicy deleteLoopRowTableRenderPolicy = this.deleteLoopRowTableRenderPolicy();
         builder.bind("basicInfoChecks", indicatorsRenderPolicy);
-        builder.addPlugin('^',  this.pictureRenderPolicy());
-        builder.useSpringEL();
-        //通过默认protobuf实例来填充不存在的key
+        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>>() {});
         data.replaceAll((k, v) -> v.equals("") ? "-" : v);
@@ -76,9 +80,12 @@ public final class BasicInfoNewRender extends AbstractNewRender {
         }
         fillBasicDefaultValues(data);
         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, templateFileContent, builder, relationId, "basicInfo", basicInfoSummary);
+            String resultPath =
+                this.renderDocx(data, templateFileContent, builder, relationId, "basicInfo", basicInfoSummary);
             log.info("渲染工商信息报告模块成功,文件路径: {}", resultPath);
             return resultPath;
         } catch (Exception e) {

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

@@ -2,6 +2,7 @@ package com.yaoyicloud.render.platform.update;
 
 import java.io.IOException;
 import java.util.Map;
+import java.util.Objects;
 
 import com.deepoove.poi.config.Configure;
 import com.deepoove.poi.config.ConfigureBuilder;
@@ -12,7 +13,6 @@ import com.yaoyicloud.config.FilerepoProperties;
 import com.yaoyicloud.message.FxyProtos;
 import com.yaoyicloud.render.AbstractNewRender;
 
-
 import lombok.extern.slf4j.Slf4j;
 
 
@@ -56,6 +56,7 @@ public final class FinancialInfoNewRender extends AbstractNewRender {
         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 basicInfoBuilder = FxyProtos.FinancialInfo.newBuilder();
         JsonFormat.parser().merge(info, basicInfoBuilder);
 
@@ -76,6 +77,7 @@ public final class FinancialInfoNewRender extends AbstractNewRender {
         }
         fillBasicDefaultValues(data);
         Map<String, Object> financialSummary = (Map<String, Object>) data.get("financialSummary");
+        data.put("fiancescore", financialSummary.get("score"));
         try {
             // 渲染文档
             String resultPath = this.renderDocx(data, templateFileContent, builder, relationId, "financialInfo", financialSummary);
@@ -90,6 +92,20 @@ public final class FinancialInfoNewRender extends AbstractNewRender {
      * 填充默认值,确保所有必要字段都存在
      */
     private void fillBasicDefaultValues(Map<String, Object> data) {
+        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", "否");
+        }
 
     }
 

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

@@ -72,6 +72,7 @@ public final class PublicRecordNewRender extends AbstractNewRender {
 
         builder.bind("severeViolations", indicatorsRenderPolicy);
         builder.useSpringEL();
+
         ObjectMapper objectMapper = new ObjectMapper();
         Map<String, Object> data = objectMapper.readValue(info, new TypeReference<Map<String, Object>>() {});
         data.replaceAll((k, v) -> v.equals("") ? "-" : v);
@@ -80,7 +81,10 @@ public final class PublicRecordNewRender extends AbstractNewRender {
             data.putAll(addtionalMap);
         }
         fillBasicDefaultValues(data);
+
         Map<String, Object> publicRecordSummary = (Map<String, Object>) data.get("publicRecordSummary");
+publicRecordSummary.putIfAbsent("riskSummary", "-");
+publicRecordSummary.putIfAbsent("suggestion", "");
         try {
             // 渲染文档
             String resultPath =

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

@@ -0,0 +1,230 @@
+package com.yaoyicloud.render.platform.update;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.apache.commons.collections4.CollectionUtils;
+
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.deepoove.poi.policy.RenderPolicy;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+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 com.yaoyicloud.render.AbstractNewRender;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * PublicRecord渲染器
+ *
+ */
+@Slf4j
+public final class TaxNewRender extends AbstractNewRender {
+    private final FilerepoProperties filerepoProperties;
+
+    public TaxNewRender(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();
+        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>>() {});
+        data.replaceAll((k, v) -> v.equals("") ? "-" : v);
+
+        if (addtionalMap != null) {
+            data.putAll(addtionalMap);
+        }
+        fillBasicDefaultValues(data);
+
+        Map<String, Object> publicRecordSummary = (Map<String, Object>) data.get("publicRecordSummary");
+publicRecordSummary.putIfAbsent("riskSummary", "-");
+publicRecordSummary.putIfAbsent("suggestion", "");
+        try {
+            // 渲染文档
+            String resultPath =
+                this.renderDocx(data, templateFileContent, builder, relationId, "publicRecord", publicRecordSummary);
+            log.info("渲染司法风险模块成功,文件路径: {}", resultPath);
+            return resultPath;
+        } catch (Exception e) {
+            log.error("渲染司法风险模块失败,relationId: {}", relationId, e);
+            throw new IOException("文档渲染失败", e);
+        }
+    }
+
+    /**
+     * 填充默认值,确保所有必要字段都存在
+     */
+    private void fillBasicDefaultValues(Map<String, Object> data) {
+
+        List<Map<String, Object>> dishonestPersons = (List<Map<String, Object>>) data.get("dishonestPersons");
+        if (CollectionUtils.isEmpty(dishonestPersons)) {
+            Map<String, Object> defaultDishonestPerson = new HashMap<>();
+            defaultDishonestPerson.put("id", "1");
+            List<Map<String, Object>> defaultDishonestPersonList = Collections.singletonList(defaultDishonestPerson);
+            data.put("dishonestPersons", defaultDishonestPersonList);
+
+        }
+
+        List<Map<String, Object>> severeViolations = (List<Map<String, Object>>) data.get("severeViolations");
+        if (CollectionUtils.isEmpty(severeViolations)) {
+            Map<String, Object> defaultSevereViolation = new HashMap<>();
+            defaultSevereViolation.put("id", "1");
+            List<Map<String, Object>> defaultSevereViolationList = Collections.singletonList(defaultSevereViolation);
+            data.put("severeViolations", defaultSevereViolationList);
+        }
+    }
+
+    // /**
+    // * Docx 渲染
+    // *
+    // * @param info 数据
+    // * @param templateFileContent 模板内容
+    // * @return 本地文件目录
+    // * @throws IOException
+    // */
+    // public String renderDocx(PublicRecord info, Map<String, Object> addtionalMap, byte[] templateFileContent) throws IOException {
+    // // TODO: let mapper be package static
+    // ObjectMapper mapper = new ObjectMapper();
+    // SimpleModule module = new SimpleModule();
+    // module.addSerializer(new PublicRecordSerializer(PublicRecord.class));
+    // mapper.registerModule(module);
+    //
+    // String jsonStr = mapper.writeValueAsString(info);
+    //
+    // // 注: 报告模板的模板变量按照json序列化的结果命名
+    // // 注: 目前的实现假设:一个session对应一个cwd目录
+    // ConfigureBuilder builder = Configure.builder();
+    // builder.bind("dishonestPersons", new LoopRowTableRenderPolicy());
+    // builder.bind("businessAbnormals", new LoopRowTableRenderPolicy());
+    // builder.bind("penaltyRecords", new LoopRowTableRenderPolicy());
+    // builder.bind("taxPenalties", new LoopRowTableRenderPolicy());
+    // builder.bind("severeViolations", new LoopRowTableRenderPolicy());
+    // this.docxResultPath =
+    // this.renderDocx(jsonStr, addtionalMap, templateFileContent, builder,
+    // Paths.get(cwd, UUID.randomUUID().toString() + ".docx").toString());
+    // return this.docxResultPath;
+    // }
+
+    /*
+     * 通过序列化和反序列化
+     * 1. 进行默认显示规则的数据转换
+     * 2. 避免POI-TL处理模板面对复杂数据类型
+     */
+    public class PublicRecordSerializer extends StdSerializer<PublicRecord> {
+
+        public PublicRecordSerializer() {
+            this(null);
+        }
+
+        public PublicRecordSerializer(Class<PublicRecord> t) {
+            super(t);
+        }
+
+        /**
+         * 为了增加*Count的数值,定制了序列化方法。 TODO: 可能更简单的方法是使用POI-TL的Spring表达式能力
+         */
+        @Override
+        public void serialize(PublicRecord value, JsonGenerator jgen, SerializerProvider provider)
+            throws IOException, JsonProcessingException {
+
+            jgen.writeStartObject();
+
+            jgen.writeArrayFieldStart("dishonestPersons");
+            writeRawArray(
+                value.getDishonestPersonsList().stream().map(o -> (MessageOrBuilder) o).collect(Collectors.toList()),
+                jgen);
+            jgen.writeEndArray();
+            jgen.writeNumberField("dishonestPersonsCount", value.getDishonestPersonsCount());
+
+            jgen.writeArrayFieldStart("businessAbnormals");
+            writeRawArray(
+                value.getBusinessAbnormalsList().stream().map(o -> (MessageOrBuilder) o).collect(Collectors.toList()),
+                jgen);
+            jgen.writeEndArray();
+            jgen.writeNumberField("businessAbnormalsCount", value.getBusinessAbnormalsCount());
+
+            jgen.writeArrayFieldStart("penaltyRecords");
+            writeRawArray(
+                value.getPenaltyRecordsList().stream().map(o -> (MessageOrBuilder) o).collect(Collectors.toList()),
+                jgen);
+            jgen.writeEndArray();
+            jgen.writeNumberField("penaltyRecordsCount", value.getPenaltyRecordsCount());
+
+            jgen.writeArrayFieldStart("taxPenalties");
+            writeRawArray(
+                value.getTaxPenaltiesList().stream().map(o -> (MessageOrBuilder) o).collect(Collectors.toList()), jgen);
+            jgen.writeEndArray();
+            jgen.writeNumberField("taxPenaltiesCount", value.getTaxPenaltiesCount());
+
+            jgen.writeArrayFieldStart("severeViolations");
+            writeRawArray(
+                value.getSevereViolationsList().stream().map(o -> (MessageOrBuilder) o).collect(Collectors.toList()),
+                jgen);
+            jgen.writeEndArray();
+            jgen.writeNumberField("severeViolationsCount", value.getSevereViolationsCount());
+
+            jgen.writeRaw(", \"publicRecordSummary\": " + JsonFormat.printer().print(value.getPublicRecordSummary()));
+
+            jgen.writeEndObject();
+        }
+
+        private void writeRawArray(List<MessageOrBuilder> values, JsonGenerator jgen)
+            throws IOException, InvalidProtocolBufferException {
+            String comma = null;
+            for (MessageOrBuilder item : values) {
+                if (comma != null) {
+                    jgen.writeRaw(comma);
+                } else {
+                    comma = ",";
+                }
+                jgen.writeRaw(JsonFormat.printer().print(item));
+            }
+        }
+    }
+}

+ 10 - 0
easier-report-biz/src/main/java/com/yaoyicloud/service/impl/ReportServiceImpl.java

@@ -26,7 +26,9 @@ 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.FinancialInfoNewRender;
 import com.yaoyicloud.render.platform.update.PublicRecordNewRender;
+import com.yaoyicloud.render.platform.update.TaxNewRender;
 import com.yaoyicloud.service.ReportService;
 import com.yaoyicloud.template.AcademicAssociationReport;
 import com.yaoyicloud.template.FoundationReport;
@@ -118,6 +120,10 @@ public class ReportServiceImpl implements ReportService {
                 reportPath = new FinancialInfoRender(sessionId, filerepoProperties).renderDocx(data, processedData,
                     templateBytes, String.valueOf(relationId));
                 return reportPath;
+            case PLATFORM_COMPANY_FINANCIALINFO_NEW:
+                reportPath = new FinancialInfoNewRender(sessionId, filerepoProperties).renderDocx(data, processedData,
+                    templateBytes, String.valueOf(relationId));
+                return reportPath;
             case FOUNDATION_FINANCIALINFO:
                 reportPath =
                     new FoundationfinancialInfoRender(sessionId, filerepoProperties).renderDocx(data, processedData,
@@ -162,6 +168,10 @@ public class ReportServiceImpl implements ReportService {
                         templateBytes,
                         String.valueOf(relationId));
                 return reportPath;
+            case TAX_NEW:
+                reportPath = new TaxNewRender(sessionId, filerepoProperties).renderDocx(data, processedData,
+                        templateBytes, String.valueOf(relationId));
+                return reportPath;
 
             default:
                 throw new UnsupportedOperationException("Unsupported module type: " + moduleType);

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

@@ -3,6 +3,28 @@ package fxy;
 option java_package = "com.yaoyicloud.message";
 option java_outer_classname = "FxyProtos";
 
+message AddressData{
+
+  // 企业名称
+  optional string name = 1;
+
+  // 成立日期
+  optional string startDate = 2;
+
+  // 企业法人
+  optional string operName = 3;
+
+  // 税号
+  optional string creditNo = 4;
+
+  // 注册资本
+  optional string regCapiDesc = 5;
+
+  // 企业状态
+  optional string status = 6;
+
+}
+
 message ServiceProviderInfo {
   optional string name = 1; // ${服务商信息:服务商名称}
   optional string type = 2; // "基金会"
@@ -19,6 +41,8 @@ message CheckItemDetail {
   optional int32 reviewScore = 7; // 复核评分
   optional string category = 8;
   optional int32 rank = 9;  // 展示排序
+  optional string formula = 10; // 计算公式(如"公益支出/上年基金余额")
+  optional string avg = 11; // 平均值
 }
 
 message CheckItemScore {
@@ -28,7 +52,7 @@ message CheckItemScore {
 }
 
 message CheckSummary {
- // optional int32 score = 1; // ${基本信息评分及建议:基本信息总分}
+  // optional int32 score = 1; // ${基本信息评分及建议:基本信息总分}
   optional string riskSummary = 2; // ${基本信息评分及建议:风险综述}
   optional string suggestion = 3 ; // ${基本信息评分及建议:建议}
 
@@ -128,6 +152,13 @@ message BasicInfo {
   optional CompanyBasicInfoExt platformExt = 33;
   optional AssociationBasicInfoExt associationExt = 34;
   optional FoundationBasicInfoExt foundationExt = 35;
+
+  repeated SameAddress sameaddress = 36; // 相同地址企业
+
+  //  repeated string seconds = 37; //二级标题的后半部分
+  map<string, string> secondsMap = 38; //二级标题连续定义
+
+  repeated SamecontactNumber samecontactNumberDatas = 39; // 相同电话企业
 }
 
 message DishonestPersonsInfo {
@@ -218,6 +249,10 @@ message PublicRecord {
   repeated AdministrativeTaxPenalty taxPenalties = 4; // 税务处罚记录(3.4)
   repeated AdministrativeSeriousIllegal severeViolations = 5; // 严重违法记录(3.5)
   optional CheckSummary publicRecordSummary = 6; // 公共记录评分及建议(3.6)
+  //新版报告专用
+  repeated CheckItemDetail judicialRiskChecks = 7; // 司法风险
+
+  repeated CheckItemDetail taxationRiskChecks = 8; //税务风险
 }
 
 message FinancialData {
@@ -281,6 +316,15 @@ message FinancialInfo {
   // 平台报告新加字段
   optional string operatingRevenue = 13; // 最近一年营业收入
   optional string neProfit = 14; // 最近一年净利润
+  optional string certReceived = 15;    // ${经营情况:《*登记证书》:相关资料是否收到}
+
+  optional string renzcode = 16;               // ${认证代码}
+  optional string validate = 17;               // ${有效期}
+  optional string annualInspectionResult = 18;    // ${经营情况:年检结果}
+  optional string bankLicense = 19;             //银行开户许可证
+
+  repeated CheckItemDetail businessRiskChecks = 20; //经营风险提示
+
 }
 
 message QuestionnaireItem {
@@ -334,6 +378,10 @@ message AttachmentSection {
   repeated Attachment overallGuaranteeStatements = 16; // 总体保证声明
 
 }
+//message Address{
+//  optional string name = 1;//企业名称
+//}
+
 
 message AssociationattachmentSection {
   optional string selfDeclLink = 1;
@@ -376,6 +424,23 @@ message AssociationattachmentSection {
 
   repeated Attachment organizationalStructureScan = 33; //组织结构-扫描件并加盖公章
 
+}
+
+message SamecontactNumber {
+  // 企业名称
+  optional string name = 1;
+
+  // 成立日期
+  optional string startDate = 2;
+
+
+  // 税号
+  optional string creditNo = 4;
+
+  // 注册资本
+  optional string regCapiDesc = 5;
+
+
 }
 message SameAddress {
   // 企业名称