package com.yaoyicloud.render; import java.io.IOException; import java.nio.file.Paths; 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.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.yaoyicloud.message.FxyProtos.AuditResult; import com.yaoyicloud.message.FxyProtos.CheckItemScore; import cn.hutool.core.util.StrUtil; /** * AuditResult渲染器 * */ public final class AuditResultRender extends AbstractRender { public AuditResultRender(String cwd) { super(cwd); } /** * Docx 渲染 * * @param info 数据 * @param templateFileContent 模板内容 * @return 本地文件目录 * @throws IOException */ public String renderDocx(AuditResult info, byte[] templateFileContent) throws IOException { ObjectMapper mapper = new ObjectMapper(); SimpleModule module = new SimpleModule(); module.addSerializer(new AuditResultSerializer(AuditResult.class)); module.addSerializer(new CheckItemScoreSerializer(CheckItemScore.class)); mapper.registerModule(module); String jsonStr = mapper.writeValueAsString(info); // 注: 报告模板的模板变量按照json序列化的结果命名 // 注: 目前的实现假设:一个session对应一个cwd目录 ConfigureBuilder builder = Configure.builder(); builder.bind("checkItemScores", new LoopRowTableRenderPolicy()); this.docxResultPath = this.renderDocx(jsonStr, templateFileContent, builder, Paths.get(cwd, UUID.randomUUID().toString() + ".docx").toString()); return this.docxResultPath; } /* * 通过序列化和反序列化 * 1. 默认显示规则的数据转换 * 2. 避免TL处理模板面对复杂数据类型 */ public class AuditResultSerializer extends StdSerializer { public AuditResultSerializer() { this(null); } public AuditResultSerializer(Class t) { super(t); } @Override public void serialize(AuditResult value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { jgen.writeStartObject(); jgen.writeStringField("auditResultScore", value.getAuditResultScore()); jgen.writeStringField("opinion", StrUtil.isBlank(value.getOpinion()) ? "-" : value.getOpinion()); jgen.writeStringField("serviceProviderName", value.getServiceProviderName()); // Note: ignore reportVersion jgen.writeStringField("auditDate", value.getAuditDate()); jgen.writeStringField("riskAlert", StrUtil.isBlank(value.getRiskAlert()) ? "-" : value.getRiskAlert()); jgen.writeStringField("auditResultSuggestion", StrUtil.isBlank(value.getAuditResultSuggestion()) ? "-" : value.getAuditResultSuggestion()); jgen.writeObjectField("checkItemScores", value.getCheckItemScoresList()); jgen.writeEndObject(); } } public class CheckItemScoreSerializer extends StdSerializer { public CheckItemScoreSerializer() { this(null); } public CheckItemScoreSerializer(Class t) { super(t); } @Override public void serialize(CheckItemScore value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { jgen.writeStartObject(); jgen.writeNumberField("itemId", value.getItemId()); jgen.writeStringField("category", StrUtil.isBlank(value.getCategory()) ? "-" : value.getCategory()); jgen.writeStringField("itemName", value.getItemName()); jgen.writeNumberField("score", value.getScore()); jgen.writeEndObject(); } } }