Преглед на файлове

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	easier-report-biz/src/main/java/com/yaoyicloud/render/BasicInfoRender.java
mamingxu преди 1 месец
родител
ревизия
2ce259a43c

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

@@ -7,7 +7,6 @@ import java.util.UUID;
 import com.deepoove.poi.config.Configure;
 import com.deepoove.poi.config.ConfigureBuilder;
 import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
-
 import com.google.protobuf.util.JsonFormat;
 import com.yaoyicloud.message.FxyProtos.BasicInfo;
 

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

@@ -0,0 +1,140 @@
+package com.yaoyicloud.render;
+
+import java.io.IOException;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.config.ConfigureBuilder;
+import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+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.message.FxyProtos.PublicRecord;
+
+/**
+ * ServiceProviderInfo渲染器
+ *
+ */
+public final class PublicRecordRender extends AbstractRender {
+
+    public PublicRecordRender(String cwd) {
+        super(cwd);
+    }
+
+    /**
+     * Docx 渲染
+     *
+     * @param info 数据
+     * @param templateFileContent 模板内容
+     * @return 本地文件目录
+     * @throws IOException
+     */
+    public String renderDocx(PublicRecord info, 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, 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));
+            }
+        }
+    }
+}

+ 90 - 0
easier-report-biz/src/main/proto/fxy.proto

@@ -123,3 +123,93 @@ message BasicInfo {
     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;
+}
+
+message AbnormalsInfo {
+    optional string entName = 1; // 企业名称
+    optional string inDate = 2; // 列入时间
+    optional string department = 3; // 做出决定机关
+    optional string province = 4; // 省份
+    optional string outDate = 5; // 移出时间
+    optional string outReason = 6; // 移出原因
+    optional string regNo = 7; // 注册号
+    optional string disabled = 8; // 历史异常
+    optional string inReason = 9; // 列入原因
+    optional string outDepartment = 10; // 移出决定机关
+    optional string id = 11;
+}
+
+message AdministrativePenaltyRecord {
+    optional string number = 1; // 决定书文号
+    optional string penaltyData = 2; // 处罚日期
+    optional string departmentName = 3;
+    optional string entName = 4; // 企业名称
+    optional string illegalType = 5; // 违法行为类型
+    optional string source = 6; // 来源
+    optional string content = 7; // 行政处罚内容
+    optional string publishDate = 8; // 公示日期
+    optional string description = 9; // 详情
+    optional string disabled = 10; // 是否成为历史
+    optional string basedOn = 11; // 处罚依据
+    optional string seqNo = 12; // 序号
+    optional string operName = 13; // 法定代表人
+    optional string punishAmnt = 14; // 罚款金额
+    optional string department = 15; // 决定机关名称
+    optional string id = 16;
+}
+
+message AdministrativeTaxPenalty {
+    optional string departmentName = 1; // 企业名称
+    optional string time = 2; // 发生时间
+    optional string type = 3; // 公示税务机关
+    optional string uTags = 4; // 是否是历史
+    optional string property = 5; // 案件性质
+    optional string createTime = 6; // 创建时间
+    optional string financeOfficer = 7; // 财务负责人
+    optional string name = 8; // 纳税人名称
+    optional string creditNo = 9; // 纳税人识别号
+    optional string oper = 10; // 法定代表人
+    optional string address = 11; // 注册地址
+    optional string result = 12; // 相关法律依据及,税务处理处罚情况
+    optional string orgNo = 13; // 组织机构代码
+    optional string url = 14; // 原文链接
+    optional string id = 15;
+}
+
+message AdministrativeSeriousIllegal {
+    optional string departName = 1; // 企业名称
+    optional string time = 2; // 列入日期
+    optional string decisionDept = 3; // 作出决定机关(列入)
+    optional string inReason = 4; // 列入原因
+    optional string outDate = 5; // 移出时间
+    optional string outReason = 6; // 移出原因
+    optional string outDepartment = 7; // 作出决定机关(移出)
+    optional string isHistory = 8; // 是否是历史信息
+    optional string id = 9;
+}
+
+message PublicRecord {
+    repeated DishonestPersonsInfo dishonestPersons = 1; // 失信被执行人(3.1)
+    repeated AbnormalsInfo businessAbnormals = 2; // 经营异常(3.2)
+    repeated AdministrativePenaltyRecord penaltyRecords = 3; // 行政处罚记录(3.3)
+    repeated AdministrativeTaxPenalty taxPenalties = 4; // 税务处罚记录(3.4)
+    repeated AdministrativeSeriousIllegal severeViolations = 5; // 严重违法记录(3.5)
+    optional CheckSummary publicRecordSummary = 6; // 公共记录评分及建议(3.6)
+}

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

@@ -0,0 +1,33 @@
+package com.yaoyicloud.render.test;
+
+import static org.junit.Assert.assertTrue;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import org.junit.Test;
+
+import com.yaoyicloud.message.FxyProtos.CheckSummary;
+import com.yaoyicloud.message.FxyProtos.DishonestPersonsInfo;
+import com.yaoyicloud.message.FxyProtos.PublicRecord;
+import com.yaoyicloud.render.PublicRecordRender;
+
+public class TestPublicRecordRender {
+
+    @Test
+    public void testRenderDocx() throws IOException {
+
+        byte[] content = Files
+            .readAllBytes(Paths.get(getClass().getClassLoader().getResource("docx/public_record.docx").getFile()));
+        PublicRecordRender render = new PublicRecordRender("../temp/");
+        String retPath = render.renderDocx(
+            PublicRecord.newBuilder()
+                .setPublicRecordSummary(CheckSummary.newBuilder().setRiskSummary("high risk").setSuggestion("accept it"))
+                .addDishonestPersons(DishonestPersonsInfo.newBuilder().setCourt("fake cout"))
+                .addDishonestPersons(DishonestPersonsInfo.newBuilder().setAmount("fake amount"))
+                .build(),
+            content);
+
+        assertTrue(retPath.length() > 0);
+    }
+
+}

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