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);
|
}
|
}
|