xyc
4 天以前 922823a3f1faaf0293256e3ffb1285eaeb8a3b23
HANDOFF.md
@@ -4,6 +4,135 @@
> **每天结束时**:把当天进展、踩过的坑、新需求、未完成事项更新到本文件,然后可以放心开新对话。
> **协作约定(2026-08-31)**:说「提交」= 本地 commit + 推送到远端 git(origin main,Gitblit),不再只做本地 commit。
## 最新(2026-10-04)
### 10-04:快报百分比按 Excel 单元格显示精度后再取 1 位
- **用户确认的业务口径**:人工核对以 `2026年十一数据.xlsx` 单元格实际显示值为准。比如总计累计同比 2025 底层精确值为 `-4.448602%`,Excel 单元格格式为 `0.00%`,人看到并用于核对的是 `-4.45%`,再取快报 1 位小数就是 `-4.5%`。此前“直接按底层值取一位得到 -4.4%”的结论已作废。
- **实现**:`HolidayBulletinService` 新增 `bulletinPercent(...)`,严格按百分比来源单元格格式先取显示精度,再取快报 1 位小数;正文措辞与表格百分比共用同一逻辑。当前源表逐列口径:多数源单元格为 `0.0%`;`人员流动量汇总` 的当日环比 D/P/J、累计同比 V/W/Y/Z/AB/AC,以及水路当日环比 D 为 `0.00%`。
- **领导分析报告核对规则**:领导分析报告不套用快报的 1 位小数,一律按该报告自身显示的小数位核对,确保与人工在文档里看到的值一致。
- **验证**:新增/更新单元测试覆盖 `-4.448602%` 的 `-4.4%`(1 位源格式)与 `-4.5%`(2 位源格式),以及 `-0.045% -> -0.05% -> -0.1%` 边界;后端 `mvn test` 全部通过。重启 8090 后用真实库数据生成 2026-10-02 快报,正文和表格与已人工核对的模板逐项一致,总计累计同比 2025/2024 为 `-4.5% / -1.6%`。
- **本地验证产物**:`_tmp_holiday_verify/bulletin_excel_display_rounding_2026-10-02.docx`;功能测试报告与工作日结按本地留档规则写入 `docs/功能测试报告/`、`docs/工作日结/`,不入库。
- **状态**:代码和口径说明随本次提交推送;服务保持运行,访问 `http://localhost:8080`。
## 最新(2026-10-03)
### 【新对话先读】当前状态与下一步(2026-10-03 深夜写入)
- **代码状态(已推送)**:`HEAD = origin/main = f329f50`,内容为 `feat(observation): 新增观测站分日调查数据导入与明细查看`,用户已「验收通过」。工作区除本 HANDOFF.md 的交接更新(尚未提交,等用户确认)外,无其他已跟踪文件改动;仅剩未跟踪的 `_tmp_doc_compare/`、`_tmp_holiday_verify/` 和 `docs/专项统计/重要节假日/观测站分日调查数据 (2026年10月1日).xls`(过程产物与源数据,按约定保留、不入库、不删除)。`docs/专项统计/重要节假日/2026年十一数据.xlsx` 已由用户改回原名,模板下载接口实测 HTTP 200 / 36335 字节。
- **服务状态**:后端 8090、前端 8080 均在运行,访问 `http://localhost:8080`;登录 admin/admin123。数据库 `127.0.0.1:3305/traffic_audit`(root/root)。
- **库内数据**:节假日 2026-09-30(铁路/民航前一日)、2026-10-01、2026-10-02 已导入;**2026-10-03 尚未导入**。观测站 `observation_station_flow` 现有 2026-10-01(692 站)与 2026-10-02(689 站)。
- **下一步(2026-10-04 早上)**:10 月 3 日数据出来后,按既有口径导入 2026-10-03 并生成当天「湖北省国庆假期综合运输客流快报」。领导要求 8:30 前出第一版,而民航数据可能晚于 8:30 才有:民航未到就先出缺民航版本(累计同比只与往年已覆盖日期比较),民航到齐后重新导入并重新生成。完整口径与已验证结论见本文件 10-03 各段。
- **无自动化**:曾建的心跳提醒(id `10-03`)已按用户要求删除,用户 2026-10-04 明确「到时我会手工操作」。明天早上由用户手工导入 10-03 数据并生成快报,助手只在其提出时配合核对/排查。不要在未获用户明确要求时自行创建定时任务或自动写库。
- **数据发现(供参考,无需改代码)**:2026-10-02 比 10-01 少 3 个观测站——`G348L149420501` 土门(宜昌市/市辖区)、`S464L105422828` 大典河(恩施州/鹤峰县)、`S483L105420801` 屈家岭(荆门市/市辖区)。已核对两份源 Excel,确属源数据当天未上报,不是导入漏行。
- **长期待办**:见下方第七节「数值精度统一改造」(既有 16 张表、228 个 double 列改 `DECIMAL(30,15)` + Java `BigDecimal`)。
### 10-03 晚:重要节假日新模板(2019/前一日)适配
- **模板变化**:`2026年十一数据.xlsx` 的道路表增加 2019 年及同比2019;铁路、民航增加“前一日”行;快报模板增加同比2024 列。旧模板已放在 `docs/专项统计/重要节假日/备份/`。
- **数据库初始化**:启动时直接写入 2019 道路数据,以及 2024/2025/2026 年铁路、民航前一日数据;`holiday_calendar.day_index=0` 表示“前一日”,旧库启动会自动补齐已有年份的前一日配置行,且不覆盖管理员已维护的日期。
- **正常导入口径**:只读取所选年份的当年列(2026 年铁路/民航/道路/水路为 C 列、高速为 C 列、普通国省道为 D 列);同时只额外读取当前年份铁路/民航的“前一日”行。2019/2024/2025 历史列不参与导入。
- **快报口径**:同比只使用 2025、2024;假期第 1 日的铁路、民航环比使用“前一日”数据,公路、水路、总计及其他口径第 1 日仍显示“—”;第 2 日起正常计算环比。
- **迁移脚本**:`docs/sql_holiday_previous_day_migration.sql`,部署包同步为 `deploy-templates/db/sql_holiday_previous_day_migration.sql`,脚本可重复执行。
- **2019 显示补齐(10-03 晚追加)**:`holiday_calendar` 增加 2019-10-01 至 2019-10-08 配置;系统配置-节假日管理和专项统计-节假日均增加 2019 年份,历史库执行幂等迁移后即可查看 2019 年 8 天道路数据。
- **验证(本机 3305 库 + 真实模板)**:接口导入结果 `passengerRows=10, vehicleRows=4, successRows=14, failRows=0`;数据库抽查 2026-09-30 铁路=82.1、民航=6.6994,2026-10-01 铁路=113.8、民航=6.7482、道路=78.82、水路=1.311,2026-10-02 铁路=82.0、民航=6.3914、道路=75.61、水路=3.3373;2026-10-01 快报铁路环比=+38.6%、民航环比=+0.7%,总行环比为“—”;2026-10-02 铁路环比=-27.9%、民航环比=-5.3%。
- **运行状态**:后端 8090(重启后已加载新代码)、前端 8080 均在运行;访问 `http://localhost:8080`。
### 10-03 深夜:快报表格百分比与模板样式修复(已验收)
- **问题**:生成快报表格使用“增长/下降”文字,数字拆行并多出 1 页;复核发现模板路径正确,根因是 `HolidayBulletinService#setCellText` 替换单元格时只保留段落属性,未保留模板 run 的字体/字号属性。
- **口径**:表格环比/同比改为带符号一位小数(正数不加 `+`,负数保留 `-`),零或一位小数后为零显示 `0%`,缺失/基数为空或为零显示 `—`;正文继续使用“增长/下降”。
- **修复**:单元格替换时继承模板 `rPr`;新增 `HolidayBulletinServiceTest` 覆盖正数、负数、零、四舍五入为零、缺失和零基数。
- **验证**:Maven 编译和测试通过;重新生成 2026-10-01 快报,正文仍为“增长2.3%”且不含“增长了”;Word 导出由 2 页恢复为 1 页,数字不再拆行。最终样报见本地 `_tmp_holiday_verify/bulletin_final_signed_styled_2026-10-01.docx`。
- **状态**:2026-10-03 用户验收通过;本次提交只包含代码、回归测试和本交接记录,不包含 `_tmp_*` 过程产物及用户未提交的数据文件重命名。
### 10-03 深夜(2):缺当日民航数据时的累计同比对比期间修正
- **快报民航累计同比对比期间修正(2026-10-03,缺当日民航数据场景)**:当某运输方式当年累计覆盖的日期短于所选日期(典型为 10 月 2 日民航数据未出、民航累计只有 10-01),累计同比改为「只和往年已经覆盖到的日期比较」——先找当年最后一个有该指标数据的日期,再取往年同日累计。修复后缺失民航的 10 月 2 日快报民航累计同比由 `-50.5%/-49.9%` 变为 `-10.0%/-0.9%`(与手工稿 -10.03%/-0.87% 的 1 位小数值一致)。实现见 `HolidayBulletinService.comparableCumulative`(仅作用于民航行),其余行与总人员流动量口径不变。
- **「累计同比 -4.65% vs 快报 -4.6%」结论(2026-10-03,无需改代码)**:Excel 显示的 -4.65% 是**两位小数**结果;底层精确比值是 `-4.64633%`(2026 累计 3082.23818、2025 累计 3232.42742),**一次四舍五入到 1 位小数就是 -4.6%**。把已经取到两位小数的 -4.65 再取一位才得到 -4.7,属二次取整,不采用。同理 2026 对 2024 为 `-1.7710%` → `-1.8%`。快报百分比统一 1 位小数口径不变。
  - **2026-10-04 修正**:按 Excel 单元格显示精度口径,`-4.65%` 再取一位应为 `-4.7%`;以文件顶部最新段为准。
- **「暂缺民航」提示**:用户确认由人工在生成的快报稿上修改,系统不生成该提示行,**不做代码改动**。
- **验证**:`HolidayBulletinServiceTest` 3 个用例通过(新增 2 个覆盖民航累计对比期间与无数据返回 null);端到端用库内真实 2026-10-02 数据(铁路/道路/水路/车流齐全、缺民航)重新生成快报,民航累计同比 `-10.0%/-0.9%`、民航累计 `6.75`、总计累计 `3082.24`、总计累计同比 `-4.6%/-1.8%`,与手工稿口径一致。
- **Git**:本次改动待用户「验收通过」后再提交/推送。
### 10-03 深夜(3):快报累计正文单位由「亿人次」改「万人次」(待验收)
- **口径(用户/领导确认)**:假期累计数值目前偏小(0.31 亿),正文可读性差,改为与当日一致的**万人次**;例如 `假期以来,全省全社会跨区域人员流动量累计3088.63万人次`,不再输出「0.31亿人次」。表格与其余口径不变。
- **实现**:`HolidayBulletinService` 抽出 `cumulativeParagraph(...)`,直接按万人次(2 位小数)输出累计值;同比仍为「增长/下降 + 一位小数」,**保持一次取整不变**(该处 2026-10-04 已修正:源单元格为 `0.00%`,Excel 显示 -4.45%,再取一位为 -4.5%;以文件顶部最新段为准)。
- **验证**:`HolidayBulletinServiceTest` 4 个用例通过(新增 `cumulativeParagraphUsesWanUnitAndSingleRounding` 固化「万人次 + 一次取整」);重启后端后重新生成 2026-10-02 快报,正文为 `累计3088.63万人次,比2025年同期下降4.4%,比2024年同期下降1.6%`,与手工稿仅差既定的取整口径;2026-10-01 回归正常(`累计1643.17万人次`)。
- **状态**:待用户「验收通过」后提交/推送。
### 10-03 晚(4):新增「观测站分日调查数据」原始数据导入(待验收)
- **背景(用户 2026-10-03 提出)**:普通国省道车流量的来源之一是观测站分日调查数据(模板 `docs/专项统计/重要节假日/观测站分日调查数据 (2026年10月1日).xls`,其中字段「中小客流量」即普通国省道车流量来源)。**系统内不做关联**,节假日统计仍走原有导入;本功能只做原始数据留存,为后续分析挖掘积累数据基础。
- **数据表**:新增 `observation_station_flow`,DDL 见 `docs/sql_observation_station.sql`,部署包同步为 `deploy-templates/db/sql_observation_station.sql`。保留模板全部 26 列(观测站编号/名称/观测里程/地市/区县/行驶方向 + 各车型流量 + 客车/货车/汽车/机动车流量 + 各类当量 + 机动车速度 + 拥挤度 + 来源文件名)。唯一键 `(obs_date, station_code, direction)`;**数值列一律 `DECIMAL(30,15)`**,Java 实体字段一律 `BigDecimal`,与节假日表同口径,无 float/double。
- **导入实现**:新增包 `com.trafficaudit.observation`(entity / mapper / dto / service / controller)。用 POI `WorkbookFactory` 同时支持 `.xls` 和 `.xlsx`;**表头按列名匹配**(列顺序变化不影响导入),扫描前 10 行定位表头;日期兼容 Excel 日期格式与 `yyyy-M-d`/`yyyy/M/d`/`yyyyMMdd`/中文年月日;同一日期**重复导入即整体覆盖**(先删该日期再插入),幂等。
- **接口**:`POST /api/observation/import`、`GET /api/observation/dates`(按日期汇总站数、中小客流量合计、最近导入时间)、`GET /api/observation/rows?date=&limit=`、`POST /api/observation/delete?date=`。
- **前端**:`traffic-audit-web/src/views/HolidayStat.vue`(专项统计 - 节假日)新增「观测站分日调查数据」卡片:选择文件 → 导入 → 按日期汇总表 → 查看明细(弹窗)→ 删除。
- **实测(真实模板,本机 3305)**:导入 692 行 / 692 站 / 0 跳过 / 0 失败;三项合计与源文件逐项一致(中小客流量 3,523,873、机动车流量 5,487,965、机动车当量 7,140,575);**692 行 × 25 字段全量逐行比对 0 处不一致**;中文(站名/地市/区县)落库无乱码;重复导入仍为 692 行(覆盖而非累加);上传非 Excel 返回明确错误。旁证:692 站中小客流量合计 3,523,873 辆 = 352.3873 万辆,与 2026-10-01 节假日「普通国省道」入库值完全一致,印证了数据来源关系。
- **顺带修复**:`pack-deploy.ps1` 把 db 脚本复制进包内 docs 的清单里漏了 `sql_holiday_previous_day_migration.sql`,本次一并补上 `sql_observation_station.sql`;`deploy-templates/README-部署说明.txt` 的 db 清单同步更新。
- **10-03 深夜追加(观测站界面微调)**:①「查看」明细弹窗按模板表头展示原始数据全部字段(观测日期/站号/站名/里程/地市/区县/方向 + 全部车型流量、客货汽车机动车流量、各类当量、速度、拥挤度,另附来源文件名,共 27 列,横向滚动);②汇总表「中小客流量合计」单位由辆次改为**万辆次**、保留 4 位小数(`formatWanVehicles`,如 3,523,873 → 352.3873)。前端 dev server 已热更新编译通过。
- **10-03 深夜追加(观测站列表/明细修正)**:①**明细行序**原来按 `stationCode` 排序,与 Excel 行序对不上,改为按导入顺序(`id ASC`,即 Excel 行序),便于逐行比对;②明细**列顺序**与模板 26 列完全一致(末尾附来源文件名);③**观测里程/机动车速度/拥挤度**改为按原始小数显示(`formatPlain`,去尾零,如 50.92 / 43.882 / 0.777 / 58),不再固定 2 位;④**17 个流量与当量列**改为整数显示(`formatInteger`,如 6413),与 Excel 一致;⑤汇总列表「观测日期」改为**正序**(mapper `ORDER BY obs_date ASC`)。已用 10-01/10-02 真实数据验证行序与 Excel 前 5 行一致(中帮/万店/沼山站/邾城站/白云)。
- **状态**:待用户「验收通过」后提交/推送。
---
### 补充(10-03 下午):服务器部署报 “Access denied ... (using password: NO)” —— 根因与修复
- **现象**:把 `deploy/traffic-audit-release-20261002/` 部署到 `61.183.254.94` 后,后端启动报 `java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: NO)`。
- **根因**:jar 内置配置里库口令是占位符 `${TRAFFIC_DB_PASSWORD:}`(默认空串),而 10-02 那个包**只含 jar + web + dist**,没有外置 `application.yml`、没有 `docs/`、`db/`、启动脚本。部署机没有任何外部配置覆盖,Spring 就拿空密码连本机 MySQL → `using password: NO`(注意:这是“末传密码”,不是密码错)。
- **服务器侧一步修复(无需重打包)**:在 jar 同级放 `application.yml`,把 `spring.datasource.url/username/password` 改成现场真实值后重启即可;也可用环境变量 `TRAFFIC_DB_PASSWORD` 代替。启动脚本已加预检提醒(缺 `application.yml` / password 仍是占位文字都会 WARN)。修复后若报“未找到数据目录 docs”则说明包内缺 `backend/docs`,从新包或源机器拷。
- **打包工具已修(原 “打包工具待修” 两项均已落实)**:`pack-deploy.ps1` 重写为五步:① 用新增模板 `deploy-templates/jar-application.yml`(**全占位符**)临时替换源码配置后 `mvn clean package`,无论成败都还原真实配置;② 解压 jar 去密自检;③ 前端构建;④ 组装**完整包**:`backend/{jar, application.yml, start-backend.cmd/.sh, docs/, web/}` + `frontend/dist` + `db/*.sql` + README(`backend/web` 从 dist 自动同步,逐文件一致);⑤ 整包明文密钥扫描。新增 `-SkipBackend` 可复用现有 jar 快速重组包。
- **模板同步修正**:`deploy-templates/backend/application.yml` 的 `server.port` 由 8080 改回 8090(原值会导致后端起在 8080)、补 `static-locations: file:./web/` 与 password 陷阱注释;`README-部署说明.txt` 常见问题新增该报错处置;`docs/打包部署说明.md` 排错表新增该行;`application.yml.example` 环境变量名统一为 `TRAFFIC_DB_USER/TRAFFIC_DB_PASSWORD/TRAFFIC_JWT_SECRET`(原来误用 `MYSQL_PASSWORD`/`JWT_SECRET`,与 `start-dev.ps1` 不一致)。
- **新包(本地,不入库)**:`deploy/traffic-audit-deploy-20261003/`(388 文件 / 93.07 MB,zip 76.37 MB),已验证:jar 内置配置全占位符(去密自检通过)、`backend/web` 与 `frontend/dist` 逐文件一致(各 44 个)、`backend/docs/生成汇总大表` 母版存在、`功能测试报告/工作日结/问题汇总/_cache` 已排除。
- **踩坑(重要)**:本机 PowerShell 5.1 把无 BOM 的 `.ps1` 当 ANSI 读,中文注释会变成乱码并导致脚本解析失败。`pack-deploy.ps1` 必须保存为 **UTF-8 with BOM**(仓库其他 `*.ps1` 也都是 BOM);排查中曾实际踩到。
- **运行状态(写交接时)**:后端 8090、前端 8080 均未监听;新对话如继续开发或测试,先执行 `powershell -NoProfile -ExecutionPolicy Bypass -File start-dev.ps1`。数据库仍为 `127.0.0.1:3305/traffic_audit`,MySQL 服务未停。
- **发布构建(已完成)**:应“发布编译”要求,已完成后端 `mvn clean package -DskipTests` 和前端 `npm run build`。jar 内已做去密自检,只保留环境变量占位符;构建后本机真实 `src/main/resources/application.yml` 已原样恢复。
- **发布产物(本地,未入库)**:
  - 后端 jar:`traffic-audit-server/target/traffic-audit-server-1.0.0-SNAPSHOT.jar`(约 54.6 MB)
  - 前端:`traffic-audit-web/dist`(44 个文件、约 3.55 MB)
  - 发布目录:`deploy/traffic-audit-release-20261002/`(含 `backend/`、`frontend/dist/`)
  - 发布压缩包:`deploy/traffic-audit-release-20261002.zip`(约 51.11 MB)
- **发布包结构说明**:`frontend/dist` 是标准前端发布目录;`backend/web` 是同一份 dist 的副本,用于后端 8090 单端口模式(当前静态资源路径为 `file:./web/,classpath:/static/`)。两处已逐文件比对,文件列表与 SHA-256 完全一致。
- **安全状态**:本机真实配置已保存在被忽略的 `traffic-audit-server/config/application.yml`;发布 jar 不含真实数据库口令、JWT secret 或 DeepSeek key。发布包不包含部署机的真实外部配置,部署时需要继续使用现场 `application.yml` 或按模板填写。
- **打包工具待修(重要)**:`pack-deploy.ps1` 目前直接消费 `src/main/resources/application.yml`,若该文件被本机真实配置覆盖,会在去密自检阶段中止;且它只把 dist 放到 `frontend/dist`,没有同步到 `backend/web`,默认包无法直接用于 8090 单端口模式。本次使用“临时占位符配置 → 构建自检 → 恢复真实配置”的方式完成。下次发布前建议改为从 `application.yml.example` 生成临时资源,并在组装阶段同时复制 `backend/web`。
- **Git/工作区(本段更新前)**:`HEAD = origin/main = 37f5209`;当前无已跟踪文件改动。未跟踪项有 `_tmp_holiday_verify/`(历史验证产物)和 `docs.zip`(约 31.6 MB,用户本地产物);二者均保留,新对话不要误删或误提交。
- **下一步**:如需部署,直接使用上面发布目录或 zip;如需继续修复发布工具,先实现“占位符模板自动切换 + `backend/web` 自动组装 + jar 去密自检”后再重新产出发布包。
### Windows 开机自启(10-03 追加,用户选“方案 B”:注册成 Windows 服务)
- **先回答过的问题**:`start-backend.cmd` **不能**直接做开机自启(末尾有 `pause`、无日志重定向、依赖 PATH)。给出 A(计划任务)/B(Windows 服务)/C 三方案后,用户选 **B**。
- **新增模板(已入库)**:
  - `deploy-templates/backend/trafficAudit.xml`:WinSW 服务配置——id `TrafficAuditBackend`、`startmode=Automatic` + `delayedAutoStart=true`(等 MySQL 先就绪)、`onfailure restart 10s/30s/60s` + `resetfailure 1 hour`、`workingdirectory=%BASE%`、日志 `logs\trafficAudit.out.log|err.log`(10MB × 10 滚动)。
  - `deploy-templates/backend/install-service.ps1`:管理员安装/查看/重启/删除(`-Status/-Restart/-Remove/-NoStart/-JavaPath`);自动定位 java(JAVA_HOME → PATH → JavaSoft 注册表 → Program Files)并把绝对路径写进 XML 的 `executable` 元素;重复执行幂等;非管理员直接拒绝。
  - `start-backend-service.cmd` + `install-autostart.ps1`(计划任务方式)保留为**备选**;注意 `New-ScheduledTask*` 需 Win8/Server 2012+,且**不可与服务方式同时启用**(会抢 8090)。
  - `pack-deploy.ps1`:新增 WinSW 获取(缓存 `deploy-templates/tools/winsw.exe` 并校 SHA-256,缺则从 GitHub 下载 v2.12.0 x64)与 `-SkipServiceWrapper`;包内输出 `backend\trafficAudit.exe`(改名以匹配 XML 文件名)。`.gitignore` 新增 `deploy-templates/tools/`(17.4MB 二进制不入库)。
- **WinSW = Windows Service Wrapper**:把普通程序包成 Windows 服务。java.exe 自己不是服务程序,直接 `sc create` 会报“服务没有及时响应启动或控制请求”;WinSW 实现了服务控制协议再拉起 `java -jar`,并管重启与日志。
- **实测验证(本机,未真正安装服务)**:`trafficAudit.exe status` 能读打包 XML 并输出 `NonExistent`(解析通过);故意写坏 XML → `FATAL - The configuration file cound not be loaded`(证明该校验路径真实有效);`install-service.ps1 -Status` 正常输出“未安装”,无参数 / `-Remove` 在非管理员下抛“必须管理员”且不产生注册项。
- **踩坑(重要)**:XML 改写最初用正则 `(?s)<executable>.*?</executable>`,会**先命中注释里的 `<executable>` 字样**,把注释头与 service 开头整段吞掉 → XML 非法。已改为 DOM(`SelectSingleNode('/service/executable')`)并把注释里的裸标签改掉。另:新增打包代码曾多一个 `}` 导致语法错,已用 `Parser::ParseFile` AST 复核,两个 ps1 现在语法 OK 且均为 UTF-8 with BOM。
- **兼容性(用户问“Win7/Win10/Win11/Server 是不是都可以”)**:服务机制完全一样(自动启动/延迟启动/失败重启都是系统能力),差别只在包装器依赖什么运行时。实测二进制:`WinSW-x64.exe` 2.12.0 是**自包含 .NET 6 单文件**(含 `singlefilehost`/`System.Private.CoreLib`/`Microsoft.NETCore.App 6.0.13`/`net6.0`),**不需要装 .NET Framework**;老系统(Win7 SP1/2008R2/2012R2)若报 `api-ms-win-*.dll` 缺失,可换官方 `WinSW.NET461.exe`(0.6MB,需 .NET 4.6.1+,改名成 `trafficAudit.exe` 即可,XML 不动);32 位系统换 `WinSW-x86.exe`。
- **安全提示**:WinSW 官方产物**未做 Authenticode 签名**(本机 `Get-AuthenticodeSignature` = NotSigned),因此以固定 SHA-256 作完整性校验:`05B82D46AD331CC16BDC00DE5C6332C1EF818DF8CEEFCD49C726553209B3A0DA`(与 GitHub 发布资产 18,243,033 字节一致)。
- **未验证项(需在目标机做一次)**:本机当前不是管理员,**没真正 install 过服务**;开机自启、失败重启、日志滚动要在服务器上按 README 3.1 执行一次确认。
- **新包(本地,不入库)**:`deploy/traffic-audit-deploy-20261003-3/`(393 文件 / 110.49 MB,zip 83.77 MB)。已验证:服务三件套在 `backend\`、包内 `trafficAudit.exe` SHA-256 与固定值一致、`backend\web` 与 `frontend/dist` 各 44 文件、jar 去密自检通过、无明文 key。**旧的 `traffic-audit-deploy-20261003/` 与 `-2/` 已被取代**,部署请用 `-3`(旧包待用户确认后再删)。
- **运行状态(写本条时)**:开发用后端 8090(PID 43040)、前端 8080(PID 43152)均在跑;数据库 `127.0.0.1:3305/traffic_audit`。
- **补充可操作性(用户反馈“backend 下文件太多,不知道怎么操作”)**:
  - 新增双击入口 `deploy-templates/backend/install-service.cmd`:自动 UAC 提权 → 调 `install-service.ps1`;若找不到 `trafficAudit.exe` 则提示“必须整个 backend 一起拷”。
  - `install-service.ps1` 装完会自己探测端口(TCP 探测,兼容 PowerShell 2.0),打印 OK + 本机/对外网址;起不来时直接打印 `logs\*.log` 最后 15 行;若 `application.yml` 口令仍像占位符,最后再打一次醒目提示。
  - `README-部署说明.txt` 顶部新增【服务器上只要做这 3 步】+“哪些要拷/哪些不用拷”;`docs/打包部署说明.md` 的 5.4 改为“右键 `install-service.cmd` →以管理员运行”。
  - 三个 `.cmd` 模板统一为 CRLF(新增的两个原来是 LF,批处理在 Windows 上应用 CRLF)。
  - 实测:强制走“已提权”分支时 `cmd → install-service.ps1 -Status` 链路跑通、`%*` 传参正常;`Test-LocalPort` 对 8090 返回 True、对 8099 返回 False。
  - 新包:`deploy/traffic-audit-deploy-20261003-4/`(394 文件 / 110.50 MB,zip 83.78 MB)——**当前唯一可用包**。
- **发布包清理(10-03 晚,用户确认“只留 -4”)**:已删除 `traffic-audit-release-20261002/`(+zip)、`traffic-audit-deploy-20261003/`(+zip)、`-2/`(+zip)、`-3/`(+zip) 及空的 `server-fix/`,`deploy\` 现在只有 `traffic-audit-deploy-20261003-4/` 和它的 zip(释放约 671MB)。
  > 因此本文件上面提到的 `deploy/traffic-audit-deploy-20261003/`(388 文件)与 `deploy/traffic-audit-release-20261002/` 均为**历史记录**,磁盘上已不存在,别再去找。
- **紧急修复(10-03 晚):`install-service.ps1` 密码解析崩溃,服务根本没装上**
  - 现象:用户在服务器(`D:\trafficAudit`)双击 `install-service.cmd`,报 `无法将“Trim”的参数“trimChars”转换为类型“System.Char”`,位置 `install-service.ps1:210`。
  - 根因:那行是 `.Trim(' ''', '"')`,其中 `' '''` 被 PowerShell 解析成一个**长度 2 的字符串**(空格 + 单引号),`Trim(char[])` 无法把 2 字符串转成单个 char → 整行抛异常(`MethodArgumentConversionInvalidCastArgument`)。
  - 修复:把这段抽成纯函数 `Test-AppConfigPassword`,改写为 `Trim()` → `Trim("'")` → `Trim('"')`;并加脚本级 `trap`,任何异常只打印一行说明 + 行号,不再甩红字堆栈。
  - 验证:8 个样本(缺文件 / 空值 / 中文占位符 / 裸值 / 双引号 / 单引号 / 含空格特殊字符 / 真实模板文件)全部符合预期;打包内脚本语法解析通过、`-Status` 实跑正常、非管理员时 trap 输出干净错误并 exit 1。
  - 教训:这条分支之前没被任何测试覆盖(`-Status` 提前 exit、非管理员在 `Assert-Admin` 就退出),所以解析类逻辑要抽成纯函数并用样本测。
  - 包名:修复版重打包时脚本复用了已释放的基础名,最终已删掉旧坏包并改名,`deploy\` 仍然是**唯一**的 `traffic-audit-deploy-20261003-4\`(含修复后的 install-service.ps1)与同名 zip。
  - 用户侧最小修复:只需用新包里的 `backend\install-service.ps1` 覆盖服务器 `D:\trafficAudit\install-service.ps1`,再重跑 `install-service.cmd`(不必重拷 110MB)。
- **服务器部署成功(10-03 晚,用户确认)**:服务器(部署目录 `D:\trafficAudit`,把 backend 里的内容直接铺在该目录下)用修复后的 `install-service.cmd` 安装服务 `TrafficAuditBackend` 成功。
  - **已验证(用户确认)**:① 办公电脑浏览器能打开服务器页面(说明网络/防火墙这一层通,无需额外放行 8090);② **重启服务器后仍能从办公电脑打开页面 → 开机自启实测生效**(服务不依赖任何账号登录)。
  - **仍待做**:业务功能验收(登录 / 数据导入 / 报表导出 / Word 快报);确认 `application.yml` 的 jwt.secret 已换成正式随机值、预置 admin/admin123 已改密。
  - 防火墙放行(老系统也能用):`netsh advfirewall firewall add rule name="TrafficAudit 8090" dir=in action=allow protocol=TCP localport=8090`
  - 装完后常用:`install-service.ps1 -Status / -Restart / -Remove`;日志在 `D:\trafficAudit\logs\trafficAudit.out.log`(错误看 `trafficAudit.err.log`)。
## 最新(2026-10-02)
- **新模块(用户已验收,本次提交/推送)**:新增“专项统计-重要节假日”模块,含节假日配置、营业性客流、非营业性车流、客运系数 4 张表;系统配置菜单仅 admin 可维护,专项统计-节假日支持导入、导出、模板下载和 Word 快报下载。
@@ -406,6 +535,11 @@
- **2026-08-28 复核「点数据导入浏览器崩溃」(打包测试环境,部分用户)**:重点排查 `GET /api/import/batches`——后端 limit 上限 200;全表 81 条、error_detail 最长 2.6KB、全量响应约 17KB(前端只取 50 条);前端表格仅 8 列短字段(errorDetail 不渲染)、无轮询/定时器。**结论:接口不是崩溃根因**(若接口有问题,所有用户都会崩,而非"部分用户")。现象符合客户端环境差异(第三方扩展注入/旧显卡驱动/低配内存,与 08-27 迅雷扩展+Intel 旧驱动结论一致)。建议对崩溃用户依次验证:无痕模式→换 Edge→禁扩展,并看 chrome://crashes。
- 【新需求·仅记录未实现·2026-08-28】增加**经济指标试算功能**:领导非常关注经济指标,**货运是大头**;常驻现场的所有人都要会计算货运相关数据(货运量/周转量等)。领导经常要求把某个数据「压一压」,今后考虑在软件里增加试算功能——可按需要调整/测算指标数值(如模拟下调某企业/某口径的货运量后看汇总与趋势影响),辅助现场人员快速试算与应对。
- 【待办·2026-10-03】**数值精度统一改造**:把既有业务表的数值列由 `double` 改为 `DECIMAL(30,15)`,Java 实体字段由 `Double/Float` 改为 `BigDecimal`,与节假日表、观测站表统一口径(用户 2026-10-03 明确要求,择机实施)。
  - 现状盘点(traffic_audit,2026-10-03 查询):**16 张表、共 228 个 double 列**——`freight_turnover_import` 48、`city_bus_monthly` 34、`h2032_enterprise_monthly` 33、`city_taxi_monthly` 29、`wyc_order_monthly` 22、`h2031_enterprise_monthly` 18、`h204_vehicle_quarterly` 12、`scale_split_transport` 9、`investment_monthly` 5、`investment_system` 5、`wyc_total_monthly` 4、`h204_auth_vehicle` 2、`investment_project` 2、`passenger_individual_monthly` 2、`transport_auth_vehicle` 2、`vehicle_track_mileage` 1。
  - 已是 decimal 口径、无需改动:`holiday_calendar` / `holiday_passenger_coefficient` / `holiday_passenger_flow` / `holiday_vehicle_flow` / `observation_station_flow`。
  - 改造范围不只是改列类型:实体类字段类型、导入解析(不要经 double 中转)、计算与取整逻辑、报表导出格式化,以及存量数据的迁移脚本,都要一起改;改完要做逐表数值抽查。
## 八、每日交接约定
1. 新对话第一步:读 `AGENTS.md` + `HANDOFF.md`;涉及 AI 分析/审核时参考 `docs/` 与数据库表结构。
2. 每天结束时:更新 `HANDOFF.md`(进展、坑、新需求、待办),再关对话。