liujie
2026-01-14 f976a39b294f8c7dd60bcd2c661983c0dcc97fc6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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.DeviceTablePolicy;
import lombok.AllArgsConstructor;
import org.springframework.core.io.ClassPathResource;
 
import java.io.IOException;
import java.util.Map;
 
 
/**
 * 设备风险评估报告构建器
 */
@AllArgsConstructor
public class DeviceReportBuilder implements ReportBuilderBase {
 
    protected UserFileService userFileService;
 
    /**
     * 构建设备风险评估报告
     * @param data 数据
     * @param templateConfig 模板配置
     * @return 设备风险评估报告
     */
    @Override
    public XWPFTemplate buildReport(JSONObject data, Map<String, Integer> templateConfig) {
        var res = new ClassPathResource("templates/设备风险评估报告.docx");
 
        // 将data.评估结果.分类评估.详情 复制
        // 避免渲染的时候的策略冲突
        if (data.containsKey("评估结果") && data.getJSONObject("评估结果").containsKey("分类评估")) {
            var evalResult = data.getJSONObject("评估结果").getJSONObject("分类评估");
            var details = evalResult.getJSONArray("详情");
            evalResult.put("详情2", details);
        }
 
        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.addPlugin('%', new CustomPictureRenderPolicy(userFileService));
 
        try {
            return XWPFTemplate.compile(res.getInputStream(), builder.build()).render(
                    Map.of( "data", data
                    ));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}