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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
package com.estate.expert.admin.stat.report.render;
 
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.deepoove.poi.policy.DynamicTableRenderPolicy;
import com.estate.expert.admin.domain.exam.record.error.ErrorLevel;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.springframework.util.CollectionUtils;
 
import java.util.List;
 
/**
 * 这里循环渲染表格
 * */
public class CheckInfoTablePolicy extends DynamicTableRenderPolicy {
 
    private String colorCommon = "000000";
    private String colorP1 = "FF0000";
 
    // 橙色
    private String colorP2 = "FF8000";
 
    /**
     * 渲染检查信息表格
     * @param table 表格
     * @param data 数据
     * @throws Exception 异常
     */
    @Override
    public void render(XWPFTable table, Object data) throws Exception {
        if(data == null)
            return;
 
        List<JSONObject> categories = (List<JSONObject>) data;
 
        var title = table.getRow(0).getCell(0).getText();
        boolean isErrorSummary = title.contains("问题汇总表");
        if(isErrorSummary){
//            renderErrors(categories, table);
        }
 
        int colCnt = table.getRow(1).getTableCells().size();
        String colTitle = table.getRow(1).getCell(1).getText();
        for(var category : categories) {
            var checkInfos = category.getJSONArray("分项");
            for(var checkInfo : checkInfos) {
                var info = (JSONObject) checkInfo;
                switch (colCnt)
                {
                    case 3: {
                        if(colTitle.equals("分项风险评价")) {
                            //分项评估结果,样式0
                            var row = table.insertNewTableRow(table.getRows().size()-1);
                            RenderHelper.renderCell(row, info.getString("类别"));
                            RenderHelper.renderCell(row, info.getString("评价"));
                            RenderHelper.renderCell(row, info.getString("模糊得分"));
                        }else {
                            //分项评估结果,样式1
                            var row = table.insertNewTableRow(table.getRows().size() - 1);
                            RenderHelper.renderCell(row, info.getString("类别"));
                            RenderHelper.renderCell(row, info.getString("权重"));
 
                            String ns = "-";
                            try {
                                var totalScore = 100f;
                                if (info.containsKey("总分"))
                                    totalScore = Float.parseFloat(info.getString("总分"));
                                var normalizedScore = Float.parseFloat(info.getString("得分")) * 100 / totalScore;
                                ns = String.format("%.2f", normalizedScore);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
 
                            RenderHelper.renderCell(row, ns);
                        }
                    }break;
                    case 4: {
                        if(isErrorSummary){
                            // 问题汇总表
                            var errors = info.getJSONArray("问题");
                            if(!CollectionUtils.isEmpty(errors)){
 
                                var highLevelColor = highLevelColor(errors);
                                for(var error : errors){
                                    var e = (JSONObject) error;
                                    var row = table.insertNewTableRow(table.getRows().size());
                                    var textColor = colorCommon;
                                    var errorLevel = e.getString("隐患等级");
                                    if(errorLevel.equals("一级隐患")){
                                        textColor = colorP1;
                                    }else if(errorLevel.equals("二级隐患")){
                                        textColor = colorP2;
                                    }
                                    RenderHelper.renderCell(row, info.getString("类别"), highLevelColor);
                                    RenderHelper.renderCell(row, e.getString("问题部位"), textColor);
                                    RenderHelper.renderCell(row, e.getString("问题备注"), textColor);
                                    RenderHelper.renderCell(row, e.getString("隐患等级"), textColor);
                                }
                            }
                        }else {
                            // 检查问题分布
                            var row = table.insertNewTableRow(table.getRows().size() -1);
                            RenderHelper.renderCell(row, info.getString("序号"));
                            RenderHelper.renderCell(row, info.getString("类别"));
                            RenderHelper.renderCell(row, info.getString("问题数量"));
                            RenderHelper.renderCell(row, info.getString("问题百分比"));
                        }
                    }break;
                    default:
                        break;
                }
            }
        }
        int endRow = table.getRows().size() - 1;
        if(isErrorSummary && endRow > 3){
            RenderHelper.mergeCellsVertically(table, 2, 0);
        }
    }
 
    /**
     * 获取最高隐患等级颜色
     * @param errorRecords 错误记录
     * @return 最高隐患等级颜色
     */
    private String highLevelColor(JSONArray errorRecords){
        var minLevel = ErrorLevel.P4;
 
        for(var errorRecord : errorRecords){
            var e = (JSONObject) errorRecord;
            var levelStr = e.getString("隐患等级");
            var level = ErrorLevel.getByDesc(levelStr);
            if(level != null && level.ordinal() < minLevel.ordinal()){
                minLevel = level;
            }
        }
 
        switch (minLevel){
            case P1:
                return colorP1;
            case P2:
                return colorP2;
            default:
                return colorCommon;
        }
    }
 
    /*
     * 问题汇总表
     * 主要差异是需要合并第0列的相同内容
     */
    private void renderErrors(List<JSONObject> categories, XWPFTable table){
        for(var category : categories) {
            var checkInfos = category.getJSONArray("分项");
            for (var checkInfo : checkInfos) {
                var info = (JSONObject) checkInfo;
 
                var errors = info.getJSONArray("问题");
                if(errors != null && !errors.isEmpty()){
                    for (var error : errors) {
                        var errorInfo = (JSONObject) error;
                        var row = table.insertNewTableRow(table.getRows().size() );
                        RenderHelper.renderCell(row, errorInfo.getString("项目级别"));
                        RenderHelper.renderCell(row, errorInfo.getString("问题部位"));
                        RenderHelper.renderCell(row, errorInfo.getString("问题描述"));
                        RenderHelper.renderCell(row, errorInfo.getString("隐患等级"));
                    }
                }
            }
        }
 
        // 将第0列的连续包含相同内容的单元格合并
        RenderHelper.mergeCellsVertically(table, 1, 0);
    }
}