feat(数据查看/汇总): 全省合计行置顶(武汉市之上),导出 Excel 合计行加粗 + 文档更新
3个文件已修改
18 ■■■■■ 已修改文件
docs/功能测试报告/功能测试报告_数据查看按市州汇总与导出_2026-09-22.md 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/工作日结/工作日结_2026-09-22.md 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/CityRollupService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_Êý¾Ý²é¿´°´ÊÐÖÝ»ã×ÜÓëµ¼³ö_2026-09-22.md
@@ -7,7 +7,7 @@
1. **入口**:数据查看工具栏加「视图:明细 / æŒ‰å¸‚州汇总」切换(仅对有市州维度的类型出现)。
2. **汇总条件**:起止月(任意区间,年初至 N æœˆå³ 01~N)、排名口径(留空 / æŒ‰ç´¯è®¡å€¼é‡æŽ’)、汇总、导出 Excel。
3. **结果**:17 ä¸ªå¸‚州(RegionUtil è§„范名与顺序)+「全省合计」行。
3. **结果**:「全省合计」行放在**最前面**(2026-09-22 ç”¨æˆ·è¦æ±‚,位于武汉市之上),其后为 17 ä¸ªå¸‚州(RegionUtil è§„范名与顺序);导出 Excel ä¸­åˆè®¡è¡ŒåŠ ç²—ã€‚
4. **口径规则**:
   - æµé‡ç±»ï¼ˆå®¢è¿é‡/周转量/货运量/订单数)→ è·¨æœŸæ±‚和;
   - **时点类(车辆数、企业数、站点数)不参与汇总,不出现在结果中**;
@@ -36,7 +36,8 @@
| TC-7 | æŽ’名 `rankMode=blank` | æŽ’名列为空 | ç©ºï¼ˆæ˜¾ç¤º `-`) | é€šè¿‡ |
| TC-8 | æŽ’名 `rankMode=recompute` | æŒ‰ç´¯è®¡å€¼é™åº | è´§è¿é‡ï¼šæ­¦æ±‰ 1、宜昌 3、黄石 9、十堰 12;全省合计行留空 | é€šè¿‡ |
| TC-9 | ç½‘约车 2026-01~08 | æ‹†åˆ†å£å¾„合计 | å…¨çœåˆè®¡è®¢å• 208,229,132 å•、客运量 33864.94 ä¸‡äººæ¬¡ | é€šè¿‡ |
| TC-10 | `export`(公交 2026-01~08) | ç”Ÿæˆ xlsx | 5,773 å­—节,可正常打开、含表头与合计行 | é€šè¿‡ |
| TC-10 | `export`(公交 2026-01~08) | ç”Ÿæˆ xlsx | 5,790 å­—节,可正常打开、含表头与合计行;合计行加粗、数值格式 `0.00`、同比格式 `0.00%` | é€šè¿‡ |
| TC-10b | åˆè®¡è¡Œä½ç½® | åœ¨æ­¦æ±‰å¸‚之上 | ç¬¬ 1 è¡Œ=全省合计(客运量 110776.34),第 2 è¡Œ=武汉市(排名 1);合计行排名留空 | é€šè¿‡ |
### 3.2 çœŸæœºç”¨ä¾‹
docs/¹¤×÷ÈÕ½á/¹¤×÷ÈÕ½á_2026-09-22.md
@@ -68,6 +68,7 @@
- å‰ç«¯ï¼šå·¥å…·æ åŠ ã€Œè§†å›¾ï¼šæ˜Žç»† / æŒ‰å¸‚州汇总」,汇总模式提供起止月、排名、汇总、导出 Excel;
- ä¿®å¤ä¸¤ä¸ªå£å¾„坑:货运量周转量表的"行内累计 + æ¹–北省合计行"重复计算(1,149,579 â†’ 130,311.89 ä¸‡å¨ï¼‰ã€ç»“束月无数据自动回退;
- ä¸Žæ‰‹å·¥æ ¸ç®—一致:公交 1-8 æœˆ 110776.34 ä¸‡äººæ¬¡ã€è´§è¿ä¼ä¸š 313,998,248 å¨ã€è´§è¿é‡å‘¨è½¬é‡ 130,311.89 ä¸‡å¨ã€‚
- æ”¶å°¾ï¼šæŒ‰ç”¨æˆ·è¦æ±‚把「全省合计」行提到最前面(武汉市之上),导出 Excel ä¸­åˆè®¡è¡ŒåŠ ç²—ã€‚
### 5. æ±‡æ€»å¤§è¡¨å¯¼å‡ºç»“果落盘缓存(用户:"下载过就不该再等很久,能不能记住上次结果")
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/CityRollupService.java
@@ -221,10 +221,11 @@
        Map<String, Map<String, Double>> last = sumByCity(longRows(type, lastFrom, lastTo), cols);
        List<Map<String, Object>> records = new ArrayList<>();
        // å…¨çœåˆè®¡è¡Œæ”¾åœ¨æœ€å‰é¢ï¼ˆç”¨æˆ·è¦æ±‚,放在武汉市之上)
        records.add(outRow(cols, mergeAll(cur), mergeAll(last), TOTAL_CITY));
        for (String city : RegionUtil.cityList()) {
            records.add(outRow(cols, cur.get(city), last.get(city), city));
        }
        records.add(outRow(cols, mergeAll(cur), mergeAll(last), TOTAL_CITY));
        if (recomputeRank) {
            applyRank(records, cols);
        }
@@ -283,8 +284,14 @@
                cell.setCellValue(String.valueOf(columns.get(i).get("label")));
                cell.setCellStyle(headStyle);
            }
            Font totalFont = wb.createFont();
            totalFont.setBold(true);
            XSSFCellStyle totalStyle = wb.createCellStyle();
            totalStyle.setFont(totalFont);
            int r = 2;
            for (Map<String, Object> rec : records) {
                boolean isTotal = TOTAL_CITY.equals(rec.get("city"));
                XSSFRow row = sheet.createRow(r++);
                for (int i = 0; i < columns.size(); i++) {
                    String prop = String.valueOf(columns.get(i).get("prop"));
@@ -296,6 +303,9 @@
                        cell.setCellStyle(colLabel.contains("同比") ? pctStyle : numStyle);
                    } else {
                        cell.setCellValue(v == null ? "" : String.valueOf(v));
                        if (isTotal) {
                            cell.setCellStyle(totalStyle);
                        }
                    }
                }
            }