From 73e810fc9569597be99accd08d63aab6e7c0daac Mon Sep 17 00:00:00 2001
From: xyc <jc_xiong@hotmail.com>
Date: 星期二, 06 十月 2026 09:36:41 +0800
Subject: [PATCH] fix(holiday): 提高平均拥挤度走势图标签精度

---
 traffic-audit-server/src/test/java/com/trafficaudit/holiday/service/HolidayBulletinServiceTest.java |   63 +++++++++++++++++++++++++++----
 1 files changed, 54 insertions(+), 9 deletions(-)

diff --git a/traffic-audit-server/src/test/java/com/trafficaudit/holiday/service/HolidayBulletinServiceTest.java b/traffic-audit-server/src/test/java/com/trafficaudit/holiday/service/HolidayBulletinServiceTest.java
index 7f585b3..cc81b4a 100644
--- a/traffic-audit-server/src/test/java/com/trafficaudit/holiday/service/HolidayBulletinServiceTest.java
+++ b/traffic-audit-server/src/test/java/com/trafficaudit/holiday/service/HolidayBulletinServiceTest.java
@@ -21,12 +21,18 @@
     void formatsTableRatiosAsSignedPercentages() throws Exception {
         HolidayBulletinService service = new HolidayBulletinService(null);
 
-        assertEquals("-4.7%", ratio(service, "95.3", "100"));
-        assertEquals("1.0%", ratio(service, "101", "100"));
-        assertEquals("0%", ratio(service, "100", "100"));
-        assertEquals("0%", ratio(service, "10004", "10000"));
-        assertEquals("鈥�", ratio(service, "100", null));
-        assertEquals("鈥�", ratio(service, "100", "0"));
+        assertEquals("-4.7%", ratio(service, "95.3", "100", 1));
+        assertEquals("-4.4%", ratio(service, "95.551398", "100", 1));
+        assertEquals("-4.5%", ratio(service, "95.551398", "100", 2));
+        assertEquals("-0.1%", ratio(service, "99.955", "100", 2));
+        assertEquals("0%", ratio(service, "99.955", "100", 1));
+        assertEquals("6.7%", ratio(service, "106.649", "100", 2));
+        assertEquals("6.6%", ratio(service, "106.649", "100", 1));
+        assertEquals("1.0%", ratio(service, "101", "100", 1));
+        assertEquals("0%", ratio(service, "100", "100", 1));
+        assertEquals("0%", ratio(service, "10004", "10000", 1));
+        assertEquals("鈥�", ratio(service, "100", null, 1));
+        assertEquals("鈥�", ratio(service, "100", "0", 1));
     }
 
     @Test
@@ -77,6 +83,43 @@
         verify(stat, never()).cumulativeMetrics(0, "NATIONAL_DAY", 1);
     }
 
+    @Test
+    void cumulativeParagraphUsesExcelDisplayThenBulletinRounding() throws Exception {
+        HolidayBulletinService service = new HolidayBulletinService(null);
+
+        DailyMetrics current = new DailyMetrics();
+        current.setTotalPersonFlow(new BigDecimal("3088.62958"));
+        DailyMetrics previousYear = new DailyMetrics();
+        previousYear.setTotalPersonFlow(new BigDecimal("3232.42742"));
+        DailyMetrics twoYearsAgo = new DailyMetrics();
+        twoYearsAgo.setTotalPersonFlow(new BigDecimal("3137.80860"));
+
+        Method method = HolidayBulletinService.class.getDeclaredMethod(
+                "cumulativeParagraph", DailyMetrics.class, DailyMetrics.class, DailyMetrics.class);
+        method.setAccessible(true);
+        String text = (String) method.invoke(service, current, previousYear, twoYearsAgo);
+
+        assertEquals(
+                "鍋囨湡浠ユ潵锛屽叏鐪佸叏绀句細璺ㄥ尯鍩熶汉鍛樻祦鍔ㄩ噺绱3088.63涓囦汉娆★紝姣�2025骞村悓鏈熶笅闄�4.5%锛屾瘮2024骞村悓鏈熶笅闄�1.6%銆�",
+                text);
+    }
+
+    @Test
+    void cumulativeAmountsUseExcelYiDisplayBeforeWanRounding() throws Exception {
+        HolidayBulletinService service = new HolidayBulletinService(null);
+
+        assertEquals("3961.77", cumulativeNumber(service, "3961.76472"));
+        assertEquals("4189.32", cumulativeNumber(service, "4189.31472"));
+        assertEquals("4486.63", cumulativeNumber(service, "4486.62652"));
+    }
+
+    private String cumulativeNumber(HolidayBulletinService service, String value) throws Exception {
+        Method method = HolidayBulletinService.class.getDeclaredMethod("numberCumulative", BigDecimal.class);
+        method.setAccessible(true);
+        BigDecimal number = value == null ? null : new BigDecimal(value);
+        return (String) method.invoke(service, number);
+    }
+
     private Object comparableCumulative(HolidayBulletinService service, DailyMetrics current,
                                         DailyMetrics comparisonYear,
                                         Function<DailyMetrics, BigDecimal> selector) throws Exception {
@@ -86,11 +129,13 @@
         return method.invoke(service, current, comparisonYear, selector);
     }
 
-    private String ratio(HolidayBulletinService service, String current, String base) throws Exception {
-        Method method = HolidayBulletinService.class.getDeclaredMethod("ratio", BigDecimal.class, BigDecimal.class);
+    private String ratio(HolidayBulletinService service, String current, String base,
+                         int excelPercentScale) throws Exception {
+        Method method = HolidayBulletinService.class.getDeclaredMethod(
+                "ratio", BigDecimal.class, BigDecimal.class, int.class);
         method.setAccessible(true);
         BigDecimal currentValue = current == null ? null : new BigDecimal(current);
         BigDecimal baseValue = base == null ? null : new BigDecimal(base);
-        return (String) method.invoke(service, currentValue, baseValue);
+        return (String) method.invoke(service, currentValue, baseValue, excelPercentScale);
     }
 }

--
Gitblit v1.9.1