package com.estate.expert.admin.stat.report.builder; import com.alibaba.fastjson.JSONObject; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.config.ConfigureBuilder; import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy; import com.estate.expert.admin.service.UserFileService; import com.estate.expert.admin.stat.report.render.CustomPictureRenderPolicy; import com.estate.expert.admin.stat.report.render.DeviceGroupTablePolicy; import com.estate.expert.admin.stat.report.render.DeviceTablePolicy; import com.estate.expert.admin.stat.report.render.WordNumberingSanitizer; import org.springframework.core.io.ClassPathResource; import java.io.IOException; import java.util.Map; /** * 设备风险评估报告构建器 */ public class DeviceReportBuilder implements ReportBuilderBase { private static final String DEFAULT_TEMPLATE_FILE = "设备风险评估报告.docx"; protected UserFileService userFileService; private final String templateFileName; public DeviceReportBuilder(UserFileService userFileService) { this(userFileService, DEFAULT_TEMPLATE_FILE); } public DeviceReportBuilder(UserFileService userFileService, String templateFileName) { this.userFileService = userFileService; this.templateFileName = templateFileName; } /** * 构建设备风险评估报告 * @param data 数据 * @param templateConfig 模板配置 * @return 设备风险评估报告 */ @Override public XWPFTemplate buildReport(JSONObject data, Map templateConfig) { var res = new ClassPathResource("templates/" + templateFileName); if (res.getPath().contains("new")) { return buildNewReport(res, data); } return buildDefaultReport(res, data); } private XWPFTemplate buildDefaultReport(ClassPathResource res, JSONObject data) { // 将data.评估结果.分类评估.详情 复制 // 避免渲染的时候的策略冲突 copyCategoryDetails(data); ConfigureBuilder builder = Configure.builder(); builder.bind("data.设备信息", new LoopRowTableRenderPolicy()); builder.bind("data.评估结果.分类评估", new LoopRowTableRenderPolicy()); builder.bind("data.评估结果.分类评估.详情2", new LoopRowTableRenderPolicy()); builder.bind("data.评估结果.隐患等级分布汇总.分项", new LoopRowTableRenderPolicy()); builder.bind("分项隐患", new LoopRowTableRenderPolicy()); builder.bind("分项问题", new DeviceTablePolicy()); // builder.bind("data.设备信息", new DeviceInfoTablePolicy()); builder.addPlugin('%', new CustomPictureRenderPolicy(userFileService)); return compileAndRender(res, builder, data); } private XWPFTemplate buildNewReport(ClassPathResource res, JSONObject data) { copyCategoryDetails(data); ConfigureBuilder builder = Configure.builder(); builder.bind("data.设备信息", new LoopRowTableRenderPolicy()); builder.bind("data.设备分组信息", new DeviceGroupTablePolicy()); builder.bind("data.评估结果.设备得分情况", new LoopRowTableRenderPolicy()); builder.bind("详情", new LoopRowTableRenderPolicy()); builder.bind("data.评估结果.分类评估", new LoopRowTableRenderPolicy()); builder.bind("data.评估结果.分类评估.详情2", new LoopRowTableRenderPolicy()); builder.bind("data.评估结果.隐患等级分布汇总.分项", new LoopRowTableRenderPolicy()); builder.bind("分项隐患", new LoopRowTableRenderPolicy()); builder.bind("分项问题", new DeviceTablePolicy()); builder.addPlugin('%', new CustomPictureRenderPolicy(userFileService)); return compileAndRender(res, builder, data); } private void copyCategoryDetails(JSONObject data) { if (data.containsKey("评估结果") && data.getJSONObject("评估结果").containsKey("分类评估")) { var evalResult = data.getJSONObject("评估结果").getJSONObject("分类评估"); var details = evalResult.getJSONArray("详情"); evalResult.put("详情2", details); } } private XWPFTemplate compileAndRender(ClassPathResource res, ConfigureBuilder builder, JSONObject data) { try { return WordNumberingSanitizer.sanitize( XWPFTemplate.compile(res.getInputStream(), builder.build()).render(Map.of("data", data)), res.getPath().contains("new") ); } catch (IOException e) { throw new RuntimeException(e); } } }