From bc822c6ca3e1ce3e16a38ba877449fc697be9511 Mon Sep 17 00:00:00 2001
From: xyc <jc_xiong@hotmail.com>
Date: 星期二, 06 十月 2026 14:09:41 +0800
Subject: [PATCH] fix(holiday): 折线图按标签精度绘制

---
 HANDOFF.md                                                                                            |    7 +++++++
 traffic-audit-server/src/main/java/com/trafficaudit/holiday/service/HolidayTrendChartService.java     |   12 ++++++++++--
 traffic-audit-server/src/test/java/com/trafficaudit/holiday/service/HolidayTrendChartServiceTest.java |   37 +++++++++++++++++++++++++++++++++++++
 3 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/HANDOFF.md b/HANDOFF.md
index 97f9148..3ad55d9 100644
--- a/HANDOFF.md
+++ b/HANDOFF.md
@@ -6,6 +6,13 @@
 
 ## 鏈�鏂帮紙2026-10-06锛�
 
+### 10-06锛氭姌绾垮浘缁熶竴鎸夋樉绀烘爣绛剧簿搴︾粯鍒�
+
+- **鍙e緞锛堢敤鎴� 2026-10-06 纭锛�**锛氬悓涓�寮犳姌绾垮浘涓紝鍚屼竴涓樉绀烘爣绛惧繀椤诲搴斿悓涓�涓偣浣嶉珮搴︼紱鍒嗘瀽鏂囧瓧涓嶅緱寮曠敤姣旇鍥炬樉绀虹簿搴︽洿缁嗙殑宸紓銆�
+- **瀹炵幇**锛歚HolidayTrendChartService.lineChart` 鍦ㄦ墍鏈夊師濮嬬粺璁¤绠楀畬鎴愬悗锛屼簬鏈�缁堝叆鍥捐竟鐣岃皟鐢� `displayValue`锛涙櫘閫氬浘鎸夎鍥� `valueDecimals` 鍋� `HALF_UP` 鑸嶅叆锛岀櫨鍒嗘瘮鐐规爣绛炬寜 1 浣嶇櫨鍒嗘瘮绮惧害锛堝嵆鍘熷灏忔暟 3 浣嶏級鑸嶅叆銆傛姌绾垮潗鏍囧拰鐐规爣绛惧叡鐢ㄥ悓涓�鑸嶅叆鍊硷紝绾佃酱鏍煎紡娌跨敤璇ュ浘绮惧害銆�
+- **杈圭晫**锛氬彧鍦ㄦ渶缁堝浘琛ㄦ樉绀哄眰鑸嶅叆锛屼笉鏀规暟鎹簱銆佷笉鏀圭疮璁°�佸揩鎶ャ�佸悓姣斻�佺幆姣旀垨璋冩暣鍙e緞锛涜瑙勫垯鐢ㄤ簬闈欐�佸垎鏋愭姤鍛婂浘锛屼笉鑳借鏂囧瓧寮曠敤鍥句笂鏃犳硶鍒嗚鲸鐨勫井灏忓樊寮傘��
+- **楠岃瘉**锛歚HolidayTrendChartServiceTest` 鑱氱劍娴嬭瘯閫氳繃锛涘悗绔叏閲� `mvn -q test -f traffic-audit-server\pom.xml` 閫氳繃銆傛柊澧炴祴璇曡鐩栤�滀袱涓笉鍚屽師鍊兼寜 2 浣嶆爣绛捐垗鍏ュ悗鐢熸垚鐩稿悓鍑犱綍鈥濆拰鐧惧垎姣旂簿搴︽崲绠椼�傛祴璇曟姤鍛婏細`docs/鍔熻兘娴嬭瘯鎶ュ憡/鍔熻兘娴嬭瘯鎶ュ憡_鎶樼嚎鍥炬寜鏍囩绮惧害缁樺埗_2026-10-06.md`锛堟湰鍦扮暀瀛橈紝涓嶅叆搴擄級銆�
+
 ### 10-06锛氳娴嬬珯骞冲潎鎷ユ尋搴﹁蛋鍔垮浘鏀逛负 3 浣嶅皬鏁�
 
 - **闂**锛氱敤鎴峰鍏� 10-05 瑙傛祴绔欐暟鎹悗鍙嶉锛屾渶鍚庝竴寮犳嫢鎸ゅ害鍥句腑 10-04銆�10-05 鏍囩閮芥樉绀� `0.49`锛屼絾鐐逛綅楂樺害涓嶅悓銆�
diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/holiday/service/HolidayTrendChartService.java b/traffic-audit-server/src/main/java/com/trafficaudit/holiday/service/HolidayTrendChartService.java
index e0b9c88..d01765e 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/holiday/service/HolidayTrendChartService.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/holiday/service/HolidayTrendChartService.java
@@ -49,6 +49,7 @@
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.DecimalFormat;
 import java.text.NumberFormat;
 import java.util.ArrayList;
@@ -76,6 +77,7 @@
     private static final double RIGHT_LABEL_BAND = 74.0;
     private static final double ITEM_LABEL_GAP = 10.0;
     private static final float HALO_OUTLINE_WIDTH = 4.0f;
+    private static final int PERCENT_ITEM_LABEL_DECIMALS = 1;
     private static final Color ITEM_LABEL_COLOR = new Color(55, 55, 55);
     private static final Color[] SERIES_COLORS = {
             new Color(192, 80, 77),
@@ -107,7 +109,7 @@
             for (int i = 0; i < item.getValues().size(); i++) {
                 BigDecimal value = item.getValues().get(i);
                 if (value != null) {
-                    xySeries.add(i, value.doubleValue());
+                    xySeries.add(i, displayValue(value, percentAxis, valueDecimals).doubleValue());
                 }
             }
             dataset.addSeries(xySeries);
@@ -1113,10 +1115,16 @@
         return total;
     }
 
+    static BigDecimal displayValue(BigDecimal value, boolean percentItemLabels, int valueDecimals) {
+        if (value == null) return null;
+        int scale = percentItemLabels ? PERCENT_ITEM_LABEL_DECIMALS + 2 : valueDecimals;
+        return value.setScale(scale, RoundingMode.HALF_UP);
+    }
+
     private String formatLineLabel(Number value, boolean percentItemLabels, int valueDecimals) {
         if (percentItemLabels) {
             NumberFormat formatter = NumberFormat.getPercentInstance();
-            formatter.setMaximumFractionDigits(1);
+            formatter.setMaximumFractionDigits(PERCENT_ITEM_LABEL_DECIMALS);
             return formatter.format(value.doubleValue());
         }
         DecimalFormat formatter = new DecimalFormat("#,##0");
diff --git a/traffic-audit-server/src/test/java/com/trafficaudit/holiday/service/HolidayTrendChartServiceTest.java b/traffic-audit-server/src/test/java/com/trafficaudit/holiday/service/HolidayTrendChartServiceTest.java
index 29a8ff1..03cf0a1 100644
--- a/traffic-audit-server/src/test/java/com/trafficaudit/holiday/service/HolidayTrendChartServiceTest.java
+++ b/traffic-audit-server/src/test/java/com/trafficaudit/holiday/service/HolidayTrendChartServiceTest.java
@@ -5,7 +5,10 @@
 import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayInputStream;
+import java.math.BigDecimal;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -42,6 +45,40 @@
     }
 
     @Test
+    void roundsLineDataToTheSamePrecisionAsLabels() {
+        assertEquals(new BigDecimal("0.49"),
+                HolidayTrendChartService.displayValue(new BigDecimal("0.4904"), false, 2));
+        assertEquals(new BigDecimal("0.49"),
+                HolidayTrendChartService.displayValue(new BigDecimal("0.4911"), false, 2));
+        assertEquals(new BigDecimal("0.491"),
+                HolidayTrendChartService.displayValue(new BigDecimal("0.4911"), false, 3));
+        assertEquals(new BigDecimal("0.123"),
+                HolidayTrendChartService.displayValue(new BigDecimal("0.1234"), true, 2));
+    }
+
+    @Test
+    void rendersSameGeometryWhenValuesRoundToSameLabel() {
+        HolidayTrendChartService service = new HolidayTrendChartService();
+        HolidayTrendChartService.ChartSeries first = new HolidayTrendChartService.ChartSeries();
+        first.setName("骞冲潎鎷ユ尋搴�");
+        first.setValues(java.util.Arrays.asList(
+                new BigDecimal("0.4904"), new BigDecimal("0.4923"), new BigDecimal("0.5100")));
+        HolidayTrendChartService.ChartSeries second = new HolidayTrendChartService.ChartSeries();
+        second.setName("骞冲潎鎷ユ尋搴�");
+        second.setValues(java.util.Arrays.asList(
+                new BigDecimal("0.4911"), new BigDecimal("0.4934"), new BigDecimal("0.5100")));
+
+        byte[] firstChart = service.lineChart("鎷ユ尋搴�",
+                java.util.Collections.singletonList(first), false, 2, 1100, 590);
+        byte[] secondChart = service.lineChart("鎷ユ尋搴�",
+                java.util.Collections.singletonList(second), false, 2, 1100, 590);
+
+        assertPng(firstChart);
+        assertPng(secondChart);
+        assertArrayEquals(firstChart, secondChart);
+    }
+
+    @Test
     void rendersHigherPrecisionLineLabelsWhenRequested() {
         HolidayTrendChartService service = new HolidayTrendChartService();
         HolidayTrendChartService.ChartSeries congestion = new HolidayTrendChartService.ChartSeries();

--
Gitblit v1.9.1