From 45d54d72a4a2963ed5b34dccd66d8034b43ddf53 Mon Sep 17 00:00:00 2001 From: buaixuexideshitongxue <2936013465@qq.com> Date: Sat, 7 Mar 2026 17:58:47 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A0=94=E5=88=A4=E5=88=86=E6=9E=90--=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E6=A8=A1=E6=9D=BFstep4-=E5=91=A8=E5=85=AD=E8=A7=A3?= =?UTF-8?q?=E5=86=B3=E5=9B=BE=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../supervision/SupervisionApplication.java | 1 + .../pojo/dto/report/ReportViewModel.java | 2 +- .../AccountabilityDepartmentSection.java | 5 + .../AccountabilityPersonalSection.java | 4 + .../BusinessLineOverviewSection.java | 5 + .../UnitInvestigationOverviewSection.java | 5 + .../service/NegativeQueryService.java | 2 +- .../service/report/ReportDataServiceImpl.java | 67 ++- .../supervision/util/ChartRenderUtil.java | 451 +++++++++++++++--- ...审一体化平台研判分析报告.docx | Bin 88959 -> 80365 bytes 10 files changed, 481 insertions(+), 61 deletions(-) diff --git a/src/main/java/com/biutag/supervision/SupervisionApplication.java b/src/main/java/com/biutag/supervision/SupervisionApplication.java index bb76792..15694ba 100644 --- a/src/main/java/com/biutag/supervision/SupervisionApplication.java +++ b/src/main/java/com/biutag/supervision/SupervisionApplication.java @@ -15,6 +15,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; public class SupervisionApplication { public static void main(String[] args) { + System.setProperty("java.awt.headless", "true"); SpringApplication.run(SupervisionApplication.class, args); } diff --git a/src/main/java/com/biutag/supervision/pojo/dto/report/ReportViewModel.java b/src/main/java/com/biutag/supervision/pojo/dto/report/ReportViewModel.java index 6e83e69..c479913 100644 --- a/src/main/java/com/biutag/supervision/pojo/dto/report/ReportViewModel.java +++ b/src/main/java/com/biutag/supervision/pojo/dto/report/ReportViewModel.java @@ -41,7 +41,7 @@ public class ReportViewModel { @Schema(description = "单位查处情况") - private UnitInvestigationOverviewSection unitInvestigationSection; + private UnitInvestigationOverviewSection unitInvestigationOverviewSection; // @Schema(description = "单位查处情况--详情预留") diff --git a/src/main/java/com/biutag/supervision/pojo/dto/report/accountability/AccountabilityDepartmentSection.java b/src/main/java/com/biutag/supervision/pojo/dto/report/accountability/AccountabilityDepartmentSection.java index 81ff73d..5bcaaea 100644 --- a/src/main/java/com/biutag/supervision/pojo/dto/report/accountability/AccountabilityDepartmentSection.java +++ b/src/main/java/com/biutag/supervision/pojo/dto/report/accountability/AccountabilityDepartmentSection.java @@ -1,5 +1,6 @@ package com.biutag.supervision.pojo.dto.report.accountability; +import com.deepoove.poi.data.PictureRenderData; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; @@ -16,4 +17,8 @@ public class AccountabilityDepartmentSection { @Schema(description = "单位问责类型列表") private List typeItems; + + @Schema(description = "单位问责饼状图") + private PictureRenderData departPieChart; + } \ No newline at end of file diff --git a/src/main/java/com/biutag/supervision/pojo/dto/report/accountability/AccountabilityPersonalSection.java b/src/main/java/com/biutag/supervision/pojo/dto/report/accountability/AccountabilityPersonalSection.java index 41ba6f5..1aa4523 100644 --- a/src/main/java/com/biutag/supervision/pojo/dto/report/accountability/AccountabilityPersonalSection.java +++ b/src/main/java/com/biutag/supervision/pojo/dto/report/accountability/AccountabilityPersonalSection.java @@ -1,5 +1,6 @@ package com.biutag.supervision.pojo.dto.report.accountability; +import com.deepoove.poi.data.PictureRenderData; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; @@ -16,4 +17,7 @@ public class AccountabilityPersonalSection { @Schema(description = "个人问责类型列表") private List typeItems; + + @Schema(description = "个人问责饼状图") + private PictureRenderData personPieChart; } \ No newline at end of file diff --git a/src/main/java/com/biutag/supervision/pojo/dto/report/businessLine/BusinessLineOverviewSection.java b/src/main/java/com/biutag/supervision/pojo/dto/report/businessLine/BusinessLineOverviewSection.java index d060e53..a036e25 100644 --- a/src/main/java/com/biutag/supervision/pojo/dto/report/businessLine/BusinessLineOverviewSection.java +++ b/src/main/java/com/biutag/supervision/pojo/dto/report/businessLine/BusinessLineOverviewSection.java @@ -1,5 +1,6 @@ package com.biutag.supervision.pojo.dto.report.businessLine; +import com.deepoove.poi.data.PictureRenderData; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; @@ -22,4 +23,8 @@ public class BusinessLineOverviewSection { @Schema(description = "各业务条线情况-总览文本(已拼接)") private String businessLineOverviewText; + + @Schema(description = "业务总览饼状图") + private PictureRenderData problemPieChart; + } \ No newline at end of file diff --git a/src/main/java/com/biutag/supervision/pojo/dto/report/unitInvestigation/UnitInvestigationOverviewSection.java b/src/main/java/com/biutag/supervision/pojo/dto/report/unitInvestigation/UnitInvestigationOverviewSection.java index 830cf32..49a6a20 100644 --- a/src/main/java/com/biutag/supervision/pojo/dto/report/unitInvestigation/UnitInvestigationOverviewSection.java +++ b/src/main/java/com/biutag/supervision/pojo/dto/report/unitInvestigation/UnitInvestigationOverviewSection.java @@ -1,5 +1,6 @@ package com.biutag.supervision.pojo.dto.report.unitInvestigation; +import com.deepoove.poi.data.PictureRenderData; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; @@ -30,4 +31,8 @@ public class UnitInvestigationOverviewSection { private List topUnits; + + @Schema(description = "单位查处情况柱状图") + private PictureRenderData unitBarChart; + } diff --git a/src/main/java/com/biutag/supervision/service/NegativeQueryService.java b/src/main/java/com/biutag/supervision/service/NegativeQueryService.java index 57cbe4a..eb3561f 100644 --- a/src/main/java/com/biutag/supervision/service/NegativeQueryService.java +++ b/src/main/java/com/biutag/supervision/service/NegativeQueryService.java @@ -212,7 +212,7 @@ public class NegativeQueryService { NegativeQueryVo vo = new NegativeQueryVo(); BeanUtils.copyProperties(item, vo); if (Objects.nonNull(item.getFirstDistributeTime()) && !ProcessingStatusEnum.completed.name().equals(item.getProcessingStatus())) { - vo.setRemainingDuration(TimeUtil.getRemainingDuration(item.getFirstDistributeTime(), item.getMaxSignDuration(), item.getMaxHandleDuration(), item.getExtensionDays(), item.getFlowKey())); +// vo.setRemainingDuration(TimeUtil.getRemainingDuration(item.getFirstDistributeTime(), item.getMaxSignDuration(), item.getMaxHandleDuration(), item.getExtensionDays(), item.getFlowKey())); } return vo; }).toList(); diff --git a/src/main/java/com/biutag/supervision/service/report/ReportDataServiceImpl.java b/src/main/java/com/biutag/supervision/service/report/ReportDataServiceImpl.java index 9bc7edb..cf032a1 100644 --- a/src/main/java/com/biutag/supervision/service/report/ReportDataServiceImpl.java +++ b/src/main/java/com/biutag/supervision/service/report/ReportDataServiceImpl.java @@ -30,11 +30,16 @@ import com.biutag.supervision.repository.negativeBlame.NegativeBlameResourceServ import com.biutag.supervision.repository.supdepart.SupDepartResourceService; import com.biutag.supervision.service.NegativeQueryService; import com.biutag.supervision.service.SupDictProblemSourceService; +import com.biutag.supervision.util.ChartRenderUtil; import com.biutag.supervision.util.DateCompareRangeUtil; import com.biutag.supervision.util.ReportTrendUtil; import com.biutag.supervision.util.TimeUtil; +import com.deepoove.poi.data.PictureRenderData; +import com.deepoove.poi.data.PictureType; +import com.deepoove.poi.data.Pictures; import jakarta.annotation.Resource; import lombok.Data; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.math.BigDecimal; @@ -43,6 +48,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; @Service +@Slf4j public class ReportDataServiceImpl implements ReportDataService { @Resource @@ -70,10 +76,11 @@ public class ReportDataServiceImpl implements ReportDataService { vm.setOverviewSection(buildOverviewSection(request, periodStart, periodEnd)); vm.setBusinessLineOverviewSection(buildBusinessLineOverviewSection(request, periodStart, periodEnd)); vm.setBusinessLineDetailSections(buildBusinessLineDetailSections(request, periodStart, periodEnd)); - vm.setUnitInvestigationSection(buildUnitInvestigationSection(request, periodStart, periodEnd)); + vm.setUnitInvestigationOverviewSection(buildUnitInvestigationOverviewSection(request, periodStart, periodEnd)); vm.setAccountabilityOverviewSection(buildAccountabilityOverviewSection(request, periodStart, periodEnd)); vm.setAccountabilityUnitDetailSection(buildAccountabilityUnitDetailSection(request, periodStart, periodEnd)); vm.setAccountabilityPersonOverviewSection(buildAccountabilityPersonOverviewSection(request, periodStart, periodEnd)); +// System.out.println(1/0); return vm; } @@ -106,6 +113,18 @@ public class ReportDataServiceImpl implements ReportDataService { .sorted(Comparator.comparing(AccountabilityTypeItem::getCount).reversed()) .toList(); accountabilityPersonalSection.setTypeItems(typeItems); + + // 饼图 + Map pieData = new LinkedHashMap<>(); + for (AccountabilityTypeItem typeItem : typeItems) { + pieData.put(typeItem.getTypeName(), typeItem.getCount()); + } + byte[] pieBytes = ChartRenderUtil.piePng("单位问责情况", pieData, 5, 900, 520); + PictureRenderData picture = Pictures.ofBytes(pieBytes, PictureType.PNG) + .size(500, 300) + .create(); + accountabilityPersonalSection.setPersonPieChart(picture); + return accountabilityPersonalSection; } @@ -138,6 +157,17 @@ public class ReportDataServiceImpl implements ReportDataService { .sorted(Comparator.comparing(AccountabilityTypeItem::getCount).reversed()) .toList(); accountabilityDepartmentSection.setTypeItems(typeItems); + + // 饼图 + Map pieData = new LinkedHashMap<>(); + for (AccountabilityTypeItem typeItem : typeItems) { + pieData.put(typeItem.getTypeName(), typeItem.getCount()); + } + byte[] pieBytes = ChartRenderUtil.piePng("单位问责情况", pieData, 5, 900, 520); + PictureRenderData picture = Pictures.ofBytes(pieBytes, PictureType.PNG) + .size(500, 300) + .create(); + accountabilityDepartmentSection.setDepartPieChart(picture); return accountabilityDepartmentSection; } @@ -164,9 +194,9 @@ public class ReportDataServiceImpl implements ReportDataService { return accountabilityOverviewSection; } - private UnitInvestigationOverviewSection buildUnitInvestigationSection(NegativeQueryParam request, - String periodStart, - String periodEnd) { + private UnitInvestigationOverviewSection buildUnitInvestigationOverviewSection(NegativeQueryParam request, + String periodStart, + String periodEnd) { DateCompareRangeUtil.CompareDateRange compareDateRange = DateCompareRangeUtil.buildCompareDateRange(request.getCrtTime().get(0), request.getCrtTime().get(1)); // 总体数据 NegativeQueryParam ztnegativeQueryParam = request.newQueryParam(); @@ -179,7 +209,8 @@ public class ReportDataServiceImpl implements ReportDataService { for (DepartAndSubDepartDto value : departAndSubDepart.values()) { Set allDepartIds = value.getAllDepartIds(); List voList = ztNegativeList.stream().filter(one -> allDepartIds.contains(one.getInvolveDepartId())).toList(); - if (CollectionUtil.isNotEmpty(voList)){ + log.info(value.getParentName() + "的数量=====================" + voList.size()); + if (CollectionUtil.isNotEmpty(voList)) { UnitInvestigationItem unitInvestigationItem = new UnitInvestigationItem(); unitInvestigationItem.setUnitName(value.getParentName()); unitInvestigationItem.setIssuedProblemCount(voList.size()); @@ -193,10 +224,26 @@ public class ReportDataServiceImpl implements ReportDataService { } } topUnits.sort(Comparator.comparing(UnitInvestigationItem::getVerifiedProblemCount).reversed()); + topUnits = topUnits.stream().limit(3).toList(); UnitInvestigationOverviewSection section = new UnitInvestigationOverviewSection(); section.setPeriodStart(periodStart); section.setPeriodEnd(periodEnd); section.setTopUnits(topUnits); + // 柱状图 + Map> seriesData = new LinkedHashMap<>(); + Map issuedMap = new LinkedHashMap<>(); + Map verifiedMap = new LinkedHashMap<>(); + for (UnitInvestigationItem item : topUnits) { + issuedMap.put(item.getUnitName(), item.getIssuedProblemCount()); + verifiedMap.put(item.getUnitName(), item.getVerifiedProblemCount()); + } + seriesData.put("下发问题数", issuedMap); + seriesData.put("查实问题数", verifiedMap); + byte[] barBytes = ChartRenderUtil.groupedBarPng("单位查处情况", seriesData, "单位", "数量", 1000, 520); + PictureRenderData picture = Pictures.ofBytes(barBytes, PictureType.PNG) + .size(500, 300) + .create(); + section.setUnitBarChart(picture); return section; } @@ -372,6 +419,16 @@ public class ReportDataServiceImpl implements ReportDataService { businessLineOverviewSection.setPeriodEnd(periodEnd); businessLineOverviewSection.setBusinessLineTotal(ztNegativeList.size()); businessLineOverviewSection.setBusinessLineOverviewText(businessLineOverviewText.toString()); + + Map pieData = new LinkedHashMap<>(); + for (Map.Entry entry : sorted) { + pieData.put(entry.getKey(), entry.getValue()); + } + byte[] pieBytes = ChartRenderUtil.piePng("占比统计", pieData, 5, 900, 520); + PictureRenderData picture = Pictures.ofBytes(pieBytes, PictureType.PNG) + .size(500, 300) + .create(); + businessLineOverviewSection.setProblemPieChart(picture); return businessLineOverviewSection; } diff --git a/src/main/java/com/biutag/supervision/util/ChartRenderUtil.java b/src/main/java/com/biutag/supervision/util/ChartRenderUtil.java index a4aaded..50cdcc5 100644 --- a/src/main/java/com/biutag/supervision/util/ChartRenderUtil.java +++ b/src/main/java/com/biutag/supervision/util/ChartRenderUtil.java @@ -10,47 +10,123 @@ import org.jfree.chart.plot.PiePlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.renderer.category.BarRenderer; import org.jfree.chart.title.LegendTitle; +import org.jfree.chart.ui.HorizontalAlignment; +import org.jfree.chart.ui.RectangleEdge; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.data.general.DefaultPieDataset; -import java.awt.*; +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Font; +import java.awt.GraphicsEnvironment; import java.io.ByteArrayOutputStream; -import java.text.NumberFormat; +import java.text.DecimalFormat; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; import java.util.Map; +import java.util.Set; /** * 图表渲染工具(PNG) - * - 适配报告输出:白底、抗锯齿、中文字体、标签更清晰、柱状图显示数值 + *

+ * 适用场景: + * 1. JFreeChart 生成图表 + * 2. poi-tl 插入 Word 模板 + * 3. 报表类固定输出场景 */ public class ChartRenderUtil { + private ChartRenderUtil() { + } + + /** + * 饼图配色 + */ + private static final Color[] PIE_COLORS = new Color[]{ + new Color(91, 155, 213), + new Color(237, 125, 49), + new Color(165, 165, 165), + new Color(255, 192, 0), + new Color(68, 114, 196), + new Color(112, 173, 71), + new Color(38, 68, 120), + new Color(158, 72, 14), + new Color(99, 99, 99), + new Color(153, 115, 0) + }; + + /** + * 柱状图系列配色 + */ + private static final Color[] BAR_COLORS = new Color[]{ + new Color(91, 155, 213), + new Color(237, 125, 49), + new Color(112, 173, 71), + new Color(165, 165, 165), + new Color(255, 192, 0), + new Color(68, 114, 196), + new Color(158, 72, 14), + new Color(38, 68, 120) + }; + + private static final String DEFAULT_OTHER_NAME = "其余问题类型"; + private static final String DEFAULT_EMPTY_NAME = "暂无数据"; + // ========================= - // 对外 API:根据数据生成图 + // 对外 API:饼图(唯一入口) // ========================= - public static byte[] piePng(Map data, int w, int h) { + /** + * 生成饼图 PNG + * + * @param title 标题 + * @param data 数据,key=名称,value=数值 + * @param topN 前N项,<=0表示不截断,超出部分合并为“其他” + * @param w 宽 + * @param h 高 + */ + public static byte[] piePng(String title, Map data, int topN, int w, int h) { + Map safeData = normalizePieData(data); + Map chartData = mergeTopNAsOther(safeData, topN, DEFAULT_OTHER_NAME); + DefaultPieDataset dataset = new DefaultPieDataset<>(); - data.forEach(dataset::setValue); + chartData.forEach(dataset::setValue); JFreeChart chart = ChartFactory.createPieChart( - "占比统计", // 你不想要标题可以传 null + title, dataset, true, false, false ); - beautifyPie(chart); + beautifyPie(chart, chartData); return toPng(chart, w, h, "生成饼图失败"); } - public static byte[] barPng(Map data, String xLabel, String yLabel, int w, int h) { + // ========================= + // 对外 API:柱状图(单系列) + // ========================= + + /** + * 单系列柱状图 + * + * @param title 标题 + * @param data 数据,key=类目,value=数值 + * @param xLabel X轴标题 + * @param yLabel Y轴标题 + * @param w 宽 + * @param h 高 + */ + public static byte[] barPng(String title, Map data, String xLabel, String yLabel, int w, int h) { DefaultCategoryDataset dataset = new DefaultCategoryDataset(); - // series 用一个固定值即可(yLabel 也行) - data.forEach((k, v) -> dataset.addValue(v, yLabel, k)); + + Map safeData = normalizeBarData(data); + safeData.forEach((category, value) -> dataset.addValue(value, yLabel, category)); JFreeChart chart = ChartFactory.createBarChart( - "统计分析", // 你不想要标题可以传 null + title, xLabel, yLabel, dataset, @@ -60,75 +136,161 @@ public class ChartRenderUtil { false ); - beautifyBar(chart); + beautifyBar(chart, 1); return toPng(chart, w, h, "生成柱状图失败"); } // ========================= - // Demo:随便生成一个图(可留可删) + // 对外 API:柱状图(多系列) + // ========================= + + /** + * 多系列分组柱状图 + * + * @param title 标题 + * @param seriesData 多系列数据 + * 外层key = 系列名,例如“下发问题数”“查实问题数” + * 内层key = 类目名,例如“单位A”“单位B” + * 内层value = 数值 + * @param xLabel X轴标题 + * @param yLabel Y轴标题 + * @param w 宽 + * @param h 高 + */ + public static byte[] groupedBarPng(String title, + Map> seriesData, + String xLabel, + String yLabel, + int w, + int h) { + DefaultCategoryDataset dataset = new DefaultCategoryDataset(); + + Map> safeSeriesData = normalizeGroupedBarData(seriesData); + + for (Map.Entry> seriesEntry : safeSeriesData.entrySet()) { + String seriesName = seriesEntry.getKey(); + Map categoryData = seriesEntry.getValue(); + for (Map.Entry categoryEntry : categoryData.entrySet()) { + dataset.addValue(categoryEntry.getValue(), seriesName, categoryEntry.getKey()); + } + } + + JFreeChart chart = ChartFactory.createBarChart( + title, + xLabel, + yLabel, + dataset, + PlotOrientation.VERTICAL, + true, + false, + false + ); + + beautifyBar(chart, safeSeriesData.size()); + return toPng(chart, w, h, "生成分组柱状图失败"); + } + + // ========================= + // Demo // ========================= public static byte[] createPieChart() { - return piePng(Map.of("查实", 40, "基本属实", 30, "不属实", 30), 900, 520); + Map data = new LinkedHashMap<>(); + data.put("查实", 40); + data.put("基本属实", 30); + data.put("不属实", 30); + return piePng("查实情况分布", data, 0, 900, 520); } public static byte[] createBarChart() { - return barPng(Map.of("市局", 120, "分县市局", 80, "基层单位", 50), "单位", "数量", 900, 520); + Map> seriesData = new LinkedHashMap<>(); + + Map issued = new LinkedHashMap<>(); + issued.put("单位A", 120); + issued.put("单位B", 80); + issued.put("单位C", 50); + + Map verified = new LinkedHashMap<>(); + verified.put("单位A", 100); + verified.put("单位B", 60); + verified.put("单位C", 30); + + seriesData.put("下发问题数", issued); + seriesData.put("查实问题数", verified); + + return groupedBarPng("单位问题分布", seriesData, "单位", "数量", 1000, 520); } // ========================= // 美化:饼图 // ========================= - private static void beautifyPie(JFreeChart chart) { + private static void beautifyPie(JFreeChart chart, Map data) { chart.setAntiAlias(true); chart.setTextAntiAlias(true); chart.setBackgroundPaint(Color.WHITE); chart.setBorderVisible(false); - Font titleFont = pickFont(Font.BOLD, 16); + Font titleFont = pickFont(Font.BOLD, 18); Font legendFont = pickFont(Font.PLAIN, 12); - Font labelFont = pickFont(Font.PLAIN, 12); + Font labelFont = pickFont(Font.PLAIN, 11); if (chart.getTitle() != null) { chart.getTitle().setFont(titleFont); + chart.getTitle().setPaint(new Color(51, 51, 51)); + chart.getTitle().setHorizontalAlignment(HorizontalAlignment.CENTER); + chart.getTitle().setMargin(0, 0, 12, 0); } LegendTitle legend = chart.getLegend(); if (legend != null) { legend.setItemFont(legendFont); legend.setBackgroundPaint(Color.WHITE); + legend.setBorder(0, 0, 0, 0); + legend.setPosition(RectangleEdge.TOP); } - PiePlot plot = (PiePlot) chart.getPlot(); + PiePlot plot = (PiePlot) chart.getPlot(); plot.setBackgroundPaint(Color.WHITE); plot.setOutlineVisible(false); + plot.setShadowPaint(null); + plot.setInteriorGap(0.08); - // label 样式:白底半透明,边框淡一点,去阴影 plot.setLabelFont(labelFont); + plot.setLabelPaint(new Color(51, 51, 51)); plot.setLabelBackgroundPaint(new Color(255, 255, 255, 235)); plot.setLabelOutlinePaint(new Color(220, 220, 220)); plot.setLabelShadowPaint(null); + plot.setLabelLinkPaint(new Color(160, 160, 160)); + plot.setLabelLinkStroke(new BasicStroke(1.0f)); + plot.setSimpleLabels(false); - // 标签内容:名称 + 百分比(例:查实 40.0%) plot.setLabelGenerator(new StandardPieSectionLabelGenerator( - "{0} {2}", - NumberFormat.getNumberInstance(), - NumberFormat.getPercentInstance() + "{0} {2}({1})", + new DecimalFormat("0"), + new DecimalFormat("0.0%") )); - // 让饼图别贴边 - plot.setInteriorGap(0.03); + plot.setSectionOutlinesVisible(true); + plot.setForegroundAlpha(0.95f); + + // 分类太多时隐藏扇区标签,只保留图例 + if (data.size() > 6) { + plot.setLabelGenerator(null); + } - // 分离效果(可选:更“立体”,如果你觉得花哨可以注释) - // plot.setExplodePercent("查实", 0.04); + int index = 0; + for (String key : data.keySet()) { + plot.setSectionPaint(key, PIE_COLORS[index % PIE_COLORS.length]); + index++; + } } // ========================= // 美化:柱状图 // ========================= - private static void beautifyBar(JFreeChart chart) { + private static void beautifyBar(JFreeChart chart, int seriesCount) { chart.setAntiAlias(true); chart.setTextAntiAlias(true); chart.setBackgroundPaint(Color.WHITE); @@ -137,45 +299,221 @@ public class ChartRenderUtil { Font titleFont = pickFont(Font.BOLD, 16); Font legendFont = pickFont(Font.PLAIN, 12); Font axisFont = pickFont(Font.PLAIN, 12); - Font valueFont = pickFont(Font.PLAIN, 12); + Font valueFont = pickFont(Font.PLAIN, 11); if (chart.getTitle() != null) { chart.getTitle().setFont(titleFont); + chart.getTitle().setPaint(new Color(51, 51, 51)); + chart.getTitle().setHorizontalAlignment(HorizontalAlignment.CENTER); } LegendTitle legend = chart.getLegend(); if (legend != null) { legend.setItemFont(legendFont); legend.setBackgroundPaint(Color.WHITE); + legend.setBorder(0, 0, 0, 0); + legend.setPosition(RectangleEdge.TOP); } CategoryPlot plot = chart.getCategoryPlot(); plot.setBackgroundPaint(Color.WHITE); plot.setOutlineVisible(false); - - // 网格线淡一点(更干净) plot.setRangeGridlinePaint(new Color(230, 230, 230)); plot.setRangeGridlinesVisible(true); - // 轴字体 plot.getDomainAxis().setTickLabelFont(axisFont); plot.getDomainAxis().setLabelFont(axisFont); plot.getRangeAxis().setTickLabelFont(axisFont); plot.getRangeAxis().setLabelFont(axisFont); - // 柱体渲染:更清爽 BarRenderer renderer = (BarRenderer) plot.getRenderer(); renderer.setDrawBarOutline(false); renderer.setShadowVisible(false); - renderer.setMaximumBarWidth(0.12); renderer.setItemMargin(0.10); - // 在柱子上方显示数值 + // 多系列时适当放宽柱宽 + if (seriesCount <= 1) { + renderer.setMaximumBarWidth(0.12); + } else if (seriesCount == 2) { + renderer.setMaximumBarWidth(0.18); + } else { + renderer.setMaximumBarWidth(0.25); + } + + for (int i = 0; i < seriesCount; i++) { + renderer.setSeriesPaint(i, BAR_COLORS[i % BAR_COLORS.length]); + } + renderer.setDefaultItemLabelGenerator(new StandardCategoryItemLabelGenerator()); renderer.setDefaultItemLabelsVisible(true); renderer.setDefaultItemLabelFont(valueFont); } + // ========================= + // 数据预处理:饼图 + // ========================= + + /** + * 过滤无效数据,并按数值倒序 + */ + private static Map normalizePieData(Map data) { + Map filtered = new LinkedHashMap<>(); + if (data != null) { + data.forEach((k, v) -> { + if (k != null && !k.isBlank() && v != null && v.doubleValue() > 0) { + filtered.put(k.trim(), v); + } + }); + } + + if (filtered.isEmpty()) { + filtered.put(DEFAULT_EMPTY_NAME, 1); + return filtered; + } + + LinkedHashMap sorted = new LinkedHashMap<>(); + filtered.entrySet().stream() + .sorted((a, b) -> Double.compare(b.getValue().doubleValue(), a.getValue().doubleValue())) + .forEachOrdered(e -> sorted.put(e.getKey(), e.getValue())); + + return sorted; + } + + /** + * 仅保留前 topN 项,其余合并为“其他” + */ + private static Map mergeTopNAsOther(Map data, int topN, String otherName) { + if (data == null || data.isEmpty()) { + Map result = new LinkedHashMap<>(); + result.put(DEFAULT_EMPTY_NAME, 1); + return result; + } + + if (topN <= 0 || data.size() <= topN) { + return data; + } + + String finalOtherName = (otherName == null || otherName.isBlank()) + ? DEFAULT_OTHER_NAME + : otherName.trim(); + + List> sorted = data.entrySet().stream().toList(); + + Map result = new LinkedHashMap<>(); + double otherTotal = 0D; + + for (int i = 0; i < sorted.size(); i++) { + Map.Entry entry = sorted.get(i); + if (i < topN) { + result.put(entry.getKey(), entry.getValue()); + } else { + otherTotal += entry.getValue().doubleValue(); + } + } + + if (otherTotal > 0D) { + if (isIntegerLike(otherTotal)) { + result.put(finalOtherName, (long) otherTotal); + } else { + result.put(finalOtherName, otherTotal); + } + } + + return result; + } + + // ========================= + // 数据预处理:单系列柱状图 + // ========================= + + private static Map normalizeBarData(Map data) { + Map result = new LinkedHashMap<>(); + if (data != null) { + data.forEach((k, v) -> { + if (k != null && !k.isBlank() && v != null && v.doubleValue() >= 0) { + result.put(k.trim(), v); + } + }); + } + + if (result.isEmpty()) { + result.put(DEFAULT_EMPTY_NAME, 0); + } + + return result; + } + + // ========================= + // 数据预处理:多系列柱状图 + // ========================= + + private static Map> normalizeGroupedBarData(Map> seriesData) { + Map> result = new LinkedHashMap<>(); + + if (seriesData == null || seriesData.isEmpty()) { + Map emptySeries = new LinkedHashMap<>(); + emptySeries.put(DEFAULT_EMPTY_NAME, 0); + result.put("数量", emptySeries); + return result; + } + + // 收集所有类目,保证多系列类目对齐 + Set allCategories = new LinkedHashSet<>(); + for (Map.Entry> seriesEntry : seriesData.entrySet()) { + Map item = seriesEntry.getValue(); + if (item == null) { + continue; + } + item.forEach((k, v) -> { + if (k != null && !k.isBlank()) { + allCategories.add(k.trim()); + } + }); + } + + if (allCategories.isEmpty()) { + Map emptySeries = new LinkedHashMap<>(); + emptySeries.put(DEFAULT_EMPTY_NAME, 0); + result.put("数量", emptySeries); + return result; + } + + for (Map.Entry> seriesEntry : seriesData.entrySet()) { + String seriesName = seriesEntry.getKey(); + if (seriesName == null || seriesName.isBlank()) { + continue; + } + + Map rawCategoryData = seriesEntry.getValue(); + Map normalizedCategoryData = new LinkedHashMap<>(); + + for (String category : allCategories) { + Number value = 0; + if (rawCategoryData != null && rawCategoryData.containsKey(category)) { + Number raw = rawCategoryData.get(category); + if (raw != null && raw.doubleValue() >= 0) { + value = raw; + } + } + normalizedCategoryData.put(category, value); + } + + result.put(seriesName.trim(), normalizedCategoryData); + } + + if (result.isEmpty()) { + Map emptySeries = new LinkedHashMap<>(); + emptySeries.put(DEFAULT_EMPTY_NAME, 0); + result.put("数量", emptySeries); + } + + return result; + } + + private static boolean isIntegerLike(double value) { + return Math.abs(value - Math.rint(value)) < 0.0000001D; + } + // ========================= // 输出 PNG // ========================= @@ -194,25 +532,30 @@ public class ChartRenderUtil { // ========================= private static Font pickFont(int style, int size) { - // 按优先级尝试(Windows 常见:微软雅黑;Linux 常见:Noto/文泉驿/DejaVu) - String[] candidates = new String[]{ - "Microsoft YaHei", "微软雅黑", - "PingFang SC", "苹方-简", - "Noto Sans CJK SC", "Noto Sans SC", - "WenQuanYi Micro Hei", "文泉驿微米黑", - "SimSun", "宋体", - "Arial Unicode MS", - "SansSerif" - }; - - GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); - String[] available = ge.getAvailableFontFamilyNames(); - for (String c : candidates) { - for (String a : available) { - if (a.equalsIgnoreCase(c)) { - return new Font(a, style, size); + try { + // 按优先级尝试(Windows 常见:微软雅黑;Linux 常见:Noto/文泉驿/DejaVu) + String[] candidates = new String[]{ + "Microsoft YaHei", "微软雅黑", + "PingFang SC", "苹方-简", + "Noto Sans CJK SC", "Noto Sans SC", + "WenQuanYi Micro Hei", "文泉驿微米黑", + "SimSun", "宋体", + "Arial Unicode MS", + "SansSerif" + }; + + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + String[] available = ge.getAvailableFontFamilyNames(); + for (String c : candidates) { + for (String a : available) { + if (a.equalsIgnoreCase(c)) { + return new Font(a, style, size); + } } } + } catch (Throwable e) { + // 字体系统初始化失败时兜底 + System.err.println("Font detection failed, fallback to SansSerif: " + e.getMessage()); } return new Font("SansSerif", style, size); } diff --git a/src/main/resources/static/templates/督审一体化平台研判分析报告.docx b/src/main/resources/static/templates/督审一体化平台研判分析报告.docx index db67adc4227249d15b0c4c4977e5f17838cb19d0..0badf438dcf9eb93d9fa632241d753b9a96412cc 100644 GIT binary patch delta 24835 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 N@I@*Xcv;|p{{uBQdSU@MUb`=Rbe~gotGZ70 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