package com.yaoyicloud.render; 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.deepoove.poi.policy.RenderPolicy; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.yaoyicloud.config.FilerepoProperties; import lombok.extern.slf4j.Slf4j; /** * AntiBribery渲染器 * */ @Slf4j public final class AntiBriberyRender extends AbstractRender { private final FilerepoProperties filerepoProperties; // 注入父类所需的 cwd 参数 public AntiBriberyRender(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 addtionalMap 额外数据 * @param templateFileContent 模板内容 * @param relationId 关联ID * @return 本地文件目录 * @throws IOException */ public String renderDocx(String info, Map addtionalMap, byte[] templateFileContent, String relationId) throws IOException { log.info("开始渲染防贿赂报告,relationId: {}", relationId); // 配置POI-TL渲染器 ConfigureBuilder builder = Configure.builder(); RenderPolicy indicatorsRenderPolicy = this.indicatorsRenderPolicy(); builder.bind("questionnaireItems", indicatorsRenderPolicy); // 解析数据 ObjectMapper objectMapper = new ObjectMapper(); Map data = objectMapper.readValue(info, new TypeReference>() {}); if (addtionalMap != null) { data.putAll(addtionalMap); } // 填充默认值 fillDefaultValues(data); try { // 渲染文档 String resultPath = this.renderDocx(data, templateFileContent, builder, relationId); log.info("防贿赂报告渲染成功,文件路径: {}", resultPath); return resultPath; } catch (Exception e) { log.error("防贿赂报告渲染失败,relationId: {}", relationId, e); throw new IOException("文档渲染失败", e); } } /** * 填充默认值,确保所有必要字段都存在 */ private void fillDefaultValues(Map data) { // 处理 questionnaireItems 列表 if (!data.containsKey("questionnaireItems") || data.get("questionnaireItems") == null) { List> defaultItems = new ArrayList<>(); Map defaultItem = new HashMap<>(); defaultItem.put("id", 1); defaultItem.put("question", "-"); defaultItem.put("answer", "-"); defaultItems.add(defaultItem); data.put("questionnaireItems", defaultItems); } else { // 确保列表中的每个项目都有所有字段 @SuppressWarnings("unchecked") List> items = (List>) data.get("questionnaireItems"); for (Map item : items) { item.putIfAbsent("id", 1); item.putIfAbsent("question", "-"); item.putIfAbsent("answer", "-"); } } // 处理 antiBriberySummary 对象 if (!data.containsKey("antiBriberySummary") || data.get("antiBriberySummary") == null) { Map defaultSummary = new HashMap<>(); defaultSummary.put("score", "-"); defaultSummary.put("riskSummary", "-"); defaultSummary.put("suggestion", "-"); data.put("antiBriberySummary", defaultSummary); } else { @SuppressWarnings("unchecked") Map summary = (Map) data.get("antiBriberySummary"); summary.putIfAbsent("score", "-"); summary.putIfAbsent("riskSummary", "-"); summary.putIfAbsent("suggestion", "-"); } } }