| docs/交接文档_2026-09-21.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/功能测试报告/功能测试报告_投资系统新模板按表头解析与审核基准缺失保护_2026-09-21.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/工作日结/工作日结_2026-09-21.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/投资/输入/模板_查询结果(投资系统-客运+物流 2026.7).xls | 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/投资/输入/物流(物流园区)/8月/湖北省十堰交通物流基础设施投资统计汇总表(月报)(2026年8月).xls | 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/投资/输出/源文件备份/湖北省十堰交通物流基础设施投资统计汇总表(月报)(2026年8月)_原始含武汉黄石_20260921.xls | 补丁 | 查看 | 原始文档 | blame | 历史 | |
| traffic-audit-server/src/main/java/com/trafficaudit/auditengine/service/AuditEngineService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
docs/½»½ÓÎĵµ_2026-09-21.md
@@ -11,8 +11,10 @@ ## 0. å 读è¿ä¸é¡µï¼æ¥æç第 1 å°æ¶ï¼ 1. **å æç³»ç»è·èµ·æ¥**ï¼åè°æ¹ä»£ç ãè§ Â§7.1ï¼ä¸é®èæ¬ï¼å¿ 须卿²ç®±å¤æ§è¡ï¼ã 2. **å½åæç´§æ¥ç 4 ä»¶äº**ï¼è¯¦è§ §4 P0ï¼ï¼â 8 æåå °ç©æµæºæä»¶éçãéåå °æ®µãä¼å夿 31 个项ç®å¸¦ååºï¼â¡ ãäº¿å æèµé¡¹ç®ãæä»½åæ¯æè¦çä¸æï¼ â¢ å¯¼åºåãåºæ°ä½æ£ + å¼¹çª +ãæ°æ®ç¼ºå¤±æ¸ åã页ãåªåäºä¸åï¼â£ 缺 2026-06 / 2026-09 æ¯çï¼é£ä¸¤æåºä¸äºè¡¨ã 2. **å½åæç´§æ¥ç 4 ä»¶äº**ï¼è¯¦è§ §4 P0ï¼ï¼â ãäº¿å æèµé¡¹ç®ãæä»½åæ¯æè¦ç䏿ï¼ç¨æ· Q7 è¦çãå ä¸åãæªåï¼ï¼ ⡠导åºåãåºæ°ä½æ£ + å¼¹çª +ãæ°æ®ç¼ºå¤±æ¸ åã页ãåªåäºä¸åï¼â¢ 缺 2026-06 / 2026-09 æ¯çï¼é£ä¸¤æåºä¸äºè¡¨ï¼ â£ æ±æ»å¤§è¡¨ãä¸å£å¾æå vs ä¸å£å¾æç»ãåå²åæ¯åºæ°å轨å¶ï¼16 个å¸å·æå·®ï¼ã > åã8 æåå °ç©æµæºæä»¶å«éåå °æ®µãå·²äº 2026-09-21 éç¯ï¼è§ §4 P0-1ã 3. **å«èªå·±ææ¿ä¸å¡å£å¾**ï¼ç¬¬ 5 ç« åçæ¯å¿ é¡»ä¸å¡ç¡®è®¤çäºã 4. æ¹å®å¿ é¡»ï¼åãåè½æµè¯æ¥åãâ æ´æ°ã工使¥ç»ãâ åä»åºæ¨éï¼Â§7.4ï¼ãè¿æ¯æ¬é¡¹ç®ç硬è§ç©ã @@ -41,6 +43,7 @@ | `freight_turnover_import` | **234** | 18 è¡/æ à 13 æï¼2021-12 ~ 2026-08ï¼ | | `h2031_enterprise_monthly` | 15811 | å ¬è·¯æ 客ï¼ä¸å£å¾ç»´åº¦ 1 çæ¥æºä¹ä¸ï¼ | | `h2032_enterprise_monthly` | 13056 | è´§è¿ä¼ä¸ææ¥ | | `investment_system` | 2026-07: 148 / **2026-08: 129** | æèµç³»ç»å¯¼åºï¼æèµå®¡æ ¸çæ¯å¯¹åºåï¼ï¼08 æç¨**æ°æ¨¡æ¿**å¯¼å ¥ | | `import_batch` | 417 | å¯¼å ¥æ¹æ¬¡å°è´¦ï¼å¼æ¥å¯¼åºçãæ°æ®çæ¬å®å«ãç¨å®ï¼ | - **2026-09 èæå·²æ¸ çå¹²å**ï¼æ¬æ¬¡æ ¸å®ï¼`h204_vehicle_quarterly` åªæ 2026-07/08ï¼`audit_run`/`audit_result` åªæ 2026-05~08ï¼`investment_monthly` åªæ 06~08ï¼ã @@ -55,7 +58,7 @@ | HEAD | `a08c70d feat(æèµ): å¸å·ææ¥ç»ä¸å¡«æ¥æ¨¡æ¿ + å¿(å¸ãåº)åè§£æ + 表头è¡å¤å®æ¶ç´§` | | 个人è¿ç«¯ | `origin` â `https://gitee.com/zhizhijie/traffic-audit.git`ï¼åæ¯ `master`ï¼ | | å ¬å¸è¿ç«¯ | `gitea` â `http://61.183.254.94:3000/r/trafficAudit.git`ï¼åæ¯ `main`ï¼è´¦å· zyjï¼ | | æªæäº¤æä»¶ | æ¬äº¤æ¥å½æ¶çæªè·è¸ªæä»¶ï¼`docs/é®é¢æ±æ»/æ±æ»å¤§è¡¨é®é¢äº¤æ¥_2026-09-21.md`ã`docs/工使¥ç»/工使¥ç»_2026-09-21.md`ã`docs/æèµ/è¾å ¥/2026å¹´8ææèµç³»ç»é¡¹ç®æç».xls`ã`docs/äº¤æ¥ææ¡£_2026-09-21.md`ï¼éæ¬æ¬¡äº¤æ¥ä¸å¹¶æäº¤ï¼ | | å·¥ä½åºç¶æ | å¹²åï¼äº¤æ¥ææ¡£ãæ±æ»å¤§è¡¨é®é¢äº¤æ¥ãæ¥ç»ãæèµç³»ç»æ°æ¨¡æ¿æ¯æåå·²æäº¤å¹¶æ¨éä¸¤ç«¯ï¼ | ### 1.4 å ³é®ç®å½ @@ -182,7 +185,7 @@ | # | äºé¡¹ | ç°è±¡ / å½±å | ç°ç¶ä¸è¯æ® | ä¸ä¸æ¥ | ç¶æ | | --- | --- | --- | --- | --- | --- | | P0-1 | **8 æåå °ç©æµæ±æ»è¡¨å«ãéåå °æ®µã** | 该æä»¶ä¸ä¸ªé¡µç¾æ¶äºå ¨çï¼8 æè¿ä»½ 38 è¡éåªæ **7 è¡æ¯åå °**ï¼å¦ **27 è¡æ¦æ± + 4 è¡é»ç³**ãç¨åºç¹ææ¯æãæå°èè¡åå¸å·ãï¼æä»¥æ¯æ¬¡é导 8 æç©æµé½ä¼æè¿ 31 个项ç®å»ºå°æ¦æ±/é»ç³åä¸ï¼09-20 已宿µå¤ç° +31 项ç®ï¼çæè¡¨æ¦æ±ç©æµæ®µä¼å¤ 27 è¡ï¼ | åºå·²æ¸ å¹²åï¼152 é¡¹ç® / 284 æåº¦æ°ï¼2026-08 æåº¦æ° 136 è¡ä¸é导åéå¼ä¸è´ï¼ï¼**æºæä»¶æªæ¸ ** | ç¨æ·ç¡®è®¤åç±æ¥æäººå 段ï¼å å¤ä»½å° `docs/æèµ/è¾åº/`ï¼ï¼æç¨æ·èªè¡å¨ Excel å é¤è¯¥ä¸¤æ®µ | â | | P0-1 | ~~8 æåå °ç©æµæ±æ»è¡¨å«ãéåå °æ®µã~~ | ââ | **å·²éç¯ï¼2026-09-21ï¼**ï¼ç¨æ·ç¡®è®¤ãæ¸ é¤æãâ ç¨ Excel COM å 餿ºæä»¶ç¬¬ 11~63 è¡ï¼æ¦æ± 27 + é»ç³ 4ï¼ï¼åä»¶å¤ä»½ `docs/æèµ/è¾åº/æºæä»¶å¤ä»½/â¦_åå§å«æ¦æ±é»ç³_20260921.xls`ï¼é导éªè¯è¯¥æä»¶ 38 â **7 æ¡**ï¼8 æç©æµ 128 â 97ï¼åºå ä» 152 é¡¹ç® / 136 æ¡ 2026-08 æåº¦æ° | æ éåå¤çï¼åç»è¥åå å鿬æä»¶å¸å·æ®µï¼ééæ°æ¸ çï¼ | â | | P0-2 | **ãäº¿å æèµé¡¹ç®ãè§ä¸é¡¹ç®è¡¨æä»½åä¼è¢«è¦ç** | 代ç åªéå表头æåï¼`ReportExportService.java:6128-6139` å `col5`/`col23`ï¼ï¼æ¨¡æ¿ row2 第 24 å忬æ¯ã2026å¹´7æå®é 宿æèµãã8 æå¯¼åºæå®æ¹æã2026å¹´8æâ¦ãå¹¶å 8 ææ° â **7 æé£ä¸åçæ°æ®æ¶å¤±** | ç¨æ·å·²å¨ãå¾ ç¡®è®¤æ¸ åãQ7 æç¡®ï¼ãåªæ´æ° F å + å¨ 2026å¹´Xæå®é 宿æèµå**å ä¸å** 2026å¹´X+1æå®é 宿æèµãâ æªå®ç° | æ Q7 æ¹ä¸ºãææè¿½å ä¸åãï¼åè¡¨å ¶å®åæ»æä»½åï¼1-3æ/4æ/5æ/6æ/第äºå£åº¦ï¼åæ ·è¦ä¸èµ·ç | â | | P0-3 | **导åºåãåºæ°ä½æ£ + å¼¹çª +ãæ°æ®ç¼ºå¤±æ¸ åã页ãï¼B4ï¼** | å»å¹´åæåºæ°æ®ç¼ºæ¶ç¨åºç §ç®ï¼æ¾æä¸å£å¾æåå ¨çç´¯è®¡åæ¯ç®æ **+73.89%**ï¼çå¼ +5.81%ï¼ãå 使£å坿 ¹æ²»å¤å | å端已æ¶éé®é¢æ¸ å `midIssues`ï¼`ReportExportService.java:2436`ï¼ä¸ `dbProblems`ï¼ä½ **`getLastMidIssues()` 没æä»»ä½è°ç¨æ¹**ï¼åç«¯ä¹æ æ¶è´¹ï¼æ²¡æãæ°æ®ç¼ºå¤±æ¸ åã页 â åªåäº B5ï¼æ¥å¿ï¼ä¸ B3ï¼å®å¤æ§æ ¡éªï¼ | â 就绪/é¢è§æ¥å£è¿å issuesï¼â¡ 导åºåå¼¹çªï¼â¢ çæä»¶è¿½å ãæ°æ®ç¼ºå¤±æ¸ åã页 | ð¶ | | P0-4 | **缺 2026-06 / 2026-09 æ¯ç** | è¿ä¸¤æé¢è§ `ready=false`ãæªæ¾å°æ¨¡æ¿æä»¶ãï¼åºä¸äºè¡¨ | `docs/çææ±æ»å¤§è¡¨/` ä¸åªæ 2026å¹´7æ / 2026å¹´8æ + çå¼ååï¼ç¨åº**åªææä»¶å精确å¹é **ãä¸ä¼èªå»º | ç¨æ· Q13 å·²æç¼ï¼è¦é®åäºãè½ä¸è½ç¨æ¯çèªå¨çæåç»æ¯ææ¨¡æ¿ãï¼ãçæï¼äººå·¥æ¾ä¸ä»½ 9 ææ¯çï¼é¿æï¼æ©åå¨ï¼è¯¦è§æ±æ»å¤§è¡¨äº¤æ¥ P0-2ï¼ | ⸠| @@ -203,6 +206,7 @@ | P1-10 | è¿è¾é 2026-01~07 ç `last_*` 为空 / H203-1 2026-01~07 ç `unified_credit_code`ã`report_unit` 为空 | åè æ¯æ¹å¨å就为空ï¼åè æ¯æ°åæ¬ææè¯»åï¼æ¯å¦è¡¥/éå¯¼å¾ ç¡®è®¤ | ⸠| | P1-11 | è´§è¿ãæç»å¨è§ 545 å®¶ãvsã宿¹å ¨å£å¾ã两ç忝ï¼+2.90% vs +4.54%ï¼ | å£å¾ä¸åï¼å·²å嫿³¨æï¼è¥è¦éãå·®å¼çæ±æ»è¡¨ã䏿¥ï¼å»ºè®®å 注差å¼åå | ⸠| | P1-12 | é«éè¿è·åæ¯ï¼ç¨æ·è¡¨æ ¼ O åï¼çæ¥æº/æé´å¾ 确认 | ç¡®è®¤åæ¹å¯ç®ãè¿è·å¢éå·®ã | ð çç¨æ· | | P1-13 | æèµç³»ç»å¯¼åºç**æ°æ¨¡æ¿**ï¼`2026å¹´Xææèµç³»ç»é¡¹ç®æç»`ï¼ | å·²æ¯ææè¡¨å¤´å®ä½è§£æï¼09-21ï¼129 æ¡å ¥åºï¼ã**å¾ å®**ï¼â æ°æ¨¡æ¿å¤åºçãé¡¹ç®æå¤é¶æ®µãæªè½åºï¼å¦éæ¯å¯¹å»ºè®¾é¶æ®µè¦å å并忥 `docs/init.sql`/`docs/database.md`ï¼â¡ æ°æ¨¡æ¿**没æãèªå¹´å累计ãå**ï¼è¯¥ç»´åº¦å®¡æ ¸å·²æ¹ä¸ºãåºå缺失å³è·³è¿ + WARN æ¥å¿ãï¼RULE_I002 宿µ 0 æ¡ï¼ï¼è¥ä¸å¡ä»è¦æ¯å¯¹é模æ¿è¡¥å该å | ð¶ | ### P2 ââ å·¥ç¨ä¸æ´æ´ @@ -316,3 +320,4 @@ | æ¥æ | åæ´ | | --- | --- | | 2026-09-21 | 馿¬¡ææï¼æ´åæ±æ»å¤§è¡¨äº¤æ¥ï¼`docs/é®é¢æ±æ»/æ±æ»å¤§è¡¨é®é¢äº¤æ¥_2026-09-21.md`ï¼ä¸æèµ/è´§è¿/客è¿å线éç | | 2026-09-21ï¼ä¸åï¼ | P0-1 éç¯ï¼åå °æºæä»¶å·²å æ®µ + é导éªè¯ï¼ï¼æ°å¢ P1-13ï¼æèµç³»ç»æ°æ¨¡æ¿æ¯æï¼ï¼æ°æ®å¿«ç §è¡¥ `investment_system` è¡ | docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_Ͷ×ÊϵͳÐÂÄ£°å°´±íÍ·½âÎöÓëÉóºË»ù׼ȱʧ±£»¤_2026-09-21.md
New file @@ -0,0 +1,65 @@ # åè½æµè¯æ¥å_æèµç³»ç»æ°æ¨¡æ¿æè¡¨å¤´è§£æä¸å®¡æ ¸åºåç¼ºå¤±ä¿æ¤_2026-09-21 ## ä¸ãåè½è¯´æ | # | åè½ | 说æ | | --- | --- | --- | | 1 | æèµç³»ç»å¯¼åº**æè¡¨å¤´å®ä½**è§£æ | ç¨æ· 2026-09-21 æã䏿èµç³»ç»æ¯å¯¹çæç»è¡¨ãæ¢æäºæ°æ¨¡æ¿ã2026å¹´8ææèµç³»ç»é¡¹ç®æç»ãï¼å¤ä¸åãé¡¹ç®æå¤é¶æ®µããå°ä¸åãèªå¹´å累计ãï¼æ´ä½å³ç§»ï¼ãåå®ç°åæ» 8 ååä½ï¼éæ°æ¨¡æ¿å¿ ç¶æ¥ã表头ä¸ç³»ç»æ¨¡æ¿ä¸ä¸è´ããæ¬æ¬¡æ¹ä¸ºæè¡¨å¤´å ³é®å宿¶å®ä½åï¼å ¼å®¹æ°æ§ä¸¤ç§æ¨¡æ¿ | | 2 | å®¡æ ¸æ¯å¯¹ãåºå缺失ãä¿æ¤ | æ°æ¨¡æ¿æ²¡æãèªå¹´å累计ãå â `investment_system.year_cum` 为 NULLãåå®ç°ç¨ `nvl()` æ NULL å½ 0ï¼ä¼æ 100+ 个项ç®å ¨é¨è¯¯å¤ä¸ºãå·®å¼ããæ¹ä¸ºï¼åºå为 NULL æ¶è·³è¿è¯¥å段æ¯å¯¹å¹¶è®° WARN æ¥å¿ | | 3 | åå °ç©æµæ±æ»è¡¨æºæä»¶æ¸ çï¼æ°æ®å¤ç½®ï¼é代ç ï¼ | æç¨æ· 2026-09-21ãæ¸ 餿ãçè¦æ±ï¼å é¤è¯¥æä»¶éçæ¦æ±æ®µï¼27 个项ç®ï¼ä¸é»ç³æ®µï¼4 个项ç®ï¼ï¼åªä¿çåå °æ®µ | æ¹å¨æä»¶ï¼ - `traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java`ï¼`importInvestmentSystem` éå + æ°å¢ `findColByKeywords` / `headerText`ï¼ - `traffic-audit-server/src/main/java/com/trafficaudit/auditengine/service/AuditEngineService.java`ï¼`checkInvestCrossDiff` åºåç¼ºå¤±ä¿æ¤ï¼ ## äºãæµè¯ç¯å¢ - å端 Spring Boot 8090ï¼éå¯å è½½æ°ä»£ç ï¼`backend.log` **2026-09-21 10:20:30 Started TrafficAuditApplication**ï¼å端 8080 - æ°æ®åº MySQL 3308 / `traffic_audit` - æ°æ§æ¨¡æ¿åç»æå¯¹ç §ï¼`xlrd` 读åï¼ï¼ | å | èæ¨¡æ¿ã模æ¿_æ¥è¯¢ç»æ(æèµç³»ç»-客è¿+ç©æµ 2026.7).xlsã | æ°æ¨¡æ¿ã2026å¹´8ææèµç³»ç»é¡¹ç®æç».xlsã | | --- | --- | --- | | 1 | è¡å· | è¡å· | | 2 | åä½ | **æèµé¡¹ç®** | | 3 | æ¶æ | æ¶æ | | 4 | è®¡åæ»æèµ | **é¡¹ç®æå¤é¶æ®µ**ï¼æ°å¢ï¼ | | 5 | èªå¼å§ç´¯è®¡ | è®¡åæ»æèµ | | 6 | æ¬å¹´è®¡åæèµ | æ¬å¹´è®¡åæèµ | | 7 | èªå¹´å累计 | èªå¼å§å»ºè®¾è³æ¬å¹´ï¼æï¼åº-ç´¯è®¡å®ææèµ | | 8 | 彿宿æèµ | 彿宿æèµ | | â | â | **æ ãèªå¹´å累计ãå** | ## ä¸ãç¨ä¾è¡¨ | # | ç¨ä¾ | è¾å ¥ | 颿 | å®é | ç»è®º | | --- | --- | --- | --- | --- | --- | | T01 | åå °æºæä»¶æ¸ ç-ç»æ | åãæ¹åçåå °â¦æ±æ»è¡¨ï¼ææ¥ï¼ï¼2026å¹´8æï¼.xlsã | åªä¿çåå °æ®µï¼æ¦æ±/é»ç³æ®µæ¶å¤± | è¡æ° 86 â **33**ï¼åå °æ®µç¬¬ 10 è¡èµ·ã7 个项ç®ãå计è¡ä¿çï¼æ¦æ±/é»ç³æ®µ 0 è¡ | éè¿ | | T02 | åå °æºæä»¶æ¸ ç-å¤ä»½ | åä¸ | åä»¶å å¤ä»½å°è¾åºç®å½ | `docs/æèµ/è¾åº/æºæä»¶å¤ä»½/â¦_åå§å«æ¦æ±é»ç³_20260921.xls`ï¼108544 åèï¼ | éè¿ | | T03 | 8 æç©æµéå¯¼ï¼æ£åï¼ | `POST /api/import/investCityBatch?period=2026-08&category=ç©æµååº` | åå °åªåº 7 æ¡ï¼ä¸åäº§çæ¦æ±/é»ç³é¡¹ç® | total=97ãsuccess=97ãfail=0ï¼åå °æä»¶ **ok=7**ï¼æ¹å 38ï¼ï¼æ¦æ±/é»ç³ 0 æ¡ | éè¿ | | T04 | é导ååºæ ¸å¯¹ | åä¸ | 项ç®/æåº¦æ°ä¸å¢ä¸å | `investment_project` = **152**ã2026-08 æåº¦æ° = **136**ãåå °ç©æµ = 7ï¼ä¸æ¸ çåä¸è´ï¼ | éè¿ | | T05 | æ°æ¨¡æ¿å¯¼å ¥ï¼æ£åï¼ | æ°æ¨¡æ¿ 129 è¡æ°æ® | å ¨é¨å ¥åº | è¿åãæèµç³»ç»å¯¼åºå¯¼å ¥æå, å ± **129** æ¡è®°å½ãï¼`investment_system` 2026-08 = 129ã2026-07 = 148 ä¸åå½±å | éè¿ | | T06 | åæ®µæ å°æ½æ¥ | åä¸ | éåçäºæºæä»¶ | æ¹åç综åè¿è¾æå¡ç«åå车äºï¼12721.5 / 10306.2 / 10316.1 / 93.5ï¼æ±å£å®¢è¿ä¸å¿ï¼315700 / 30000 / 178235.4 / 550 | éè¿ | | T07 | 缺åå¤çï¼è´åï¼ | åä¸ï¼æ ãèªå¹´å累计ãåï¼ | year_cum ç空ï¼**ä¸å¾**æãèªå¼å§å»ºè®¾â¦ãå误å½èªå¹´å累计 | 129 è¡ year_cum å ¨ä¸º NULLï¼æªéå¡«ï¼ | éè¿ | | T08 | èæ¨¡æ¿å ¼å®¹ï¼åå½ï¼ | èæ ¼å¼è¡¨å¤´ | ä»è½å¯¼å ¥ | èæä»¶å·²ä¸å¨è¾å ¥ç®å½ï¼æ¹ä¸ºæè¡¨å¤´å®ä½åï¼èæ¨¡æ¿ 8 åå ³é®åï¼åä½/è®¡åæ»æèµ/èªå¼å§å»ºè®¾/æ¬å¹´è®¡åæèµ/èªå¹´å/彿宿æèµï¼å ¨é¨å¯å½ä¸ï¼ä»£ç 审æ¥ï¼ï¼åé 2026-07 = 148 è¡æªåå½±å | éè¿ï¼éæï¼ | | T09 | å®¡æ ¸åºåç¼ºå¤±ä¿æ¤ | `POST /api/audit/execute?period=2026-08&reportType=INVEST` | èªå¹´å累计è§åä¸å产çè¯¯æ¥ | RULE_I002 ç»æ **0 æ¡**ï¼æ¥å¿åºç°ãæèµæ¯å¯¹è·³è¿ï¼æèµç³»ç»åºå缺失ï¼ï¼rule=RULE_I002 ⦠field=èªå¹´å累计ã | éè¿ | | T10 | å®¡æ ¸å ¶å®è§åæªåå½±å | åä¸ | æ£å¸¸åºç»æ | RULE_I001ï¼èªå¼å§å»ºè®¾ç´¯è®¡ï¼2 æ¡ãRULE_I003ï¼æ¬æå®æï¼1 æ¡ãRULE_I004ï¼å卿§ï¼25 æ¡ï¼å计 28 æ¡ | éè¿ | | T11 | å®¡æ ¸å¹ç | åä¸é夿§è¡ | åªæ¸ INVEST æ§ç»æãä¸éå¤å 积 | 两次æ§è¡ç»ææ¡æ°ä¸è´ï¼28 æ¡ï¼ | éè¿ | ## åãåç°çé®é¢ä¸å¤ç½® | # | é®é¢ | å¤ç½® | | --- | --- | --- | | P1 | æ°æ¨¡æ¿å¤åºãé¡¹ç®æå¤é¶æ®µãåï¼ä½åºè¡¨ `investment_system` 没æå¯¹åºå段 | **æ¬æ¬¡ä¸è½åº**ãè¥ä¸å¡è¦æ¯å¯¹ãå»ºè®¾é¶æ®µãï¼éå å并忥 `docs/init.sql`ã`docs/database.md`ï¼æé¡¹ç®è§ç©ä¸å¤åæ¥ï¼ | | P2 | æ°æ¨¡æ¿**没æãèªå¹´å累计ãå** â è¯¥ç»´åº¦æ æ³æ¯å¯¹ | å·²æ¹ä¸ºãåºå缺失å³è·³è¿ + WARN æ¥å¿ãï¼ä¸äº§ç误æ¥ãè¥ä¸å¡ä»è¦æ¯å¯¹èªå¹´å累计ï¼éæ°æ¨¡æ¿è¡¥å该åï¼æç¡®è®¤æ¹ç¨ãèªå¼å§å»ºè®¾ç´¯è®¡ãå£å¾ï¼ | | P3 | èæ¨¡æ¿æä»¶ `模æ¿_æ¥è¯¢ç»æ(æèµç³»ç»-客è¿+ç©æµ 2026.7).xls` å·²ä¸å¨ `docs/æèµ/è¾å ¥/`ï¼è¢«ç¨æ·æ¿æ¢ï¼ | 2026-07 ç 148 è¡ä¸ºèå£å¾åéæ°æ®ï¼ä¿çä¸å¨ï¼åç»æä»½ç»ä¸ç¨æ°æ¨¡æ¿ | | P4 | å®¡æ ¸æ°å¢ 25 æ¡ãæèµç³»ç»å¯¼åºä¸ä¸åå¨ã | å¤ä¸ºä¹¡é综åè¿è¾æå¡ç«ä¸é¨åç©æµé¡¹ç®ï¼å¦ æ¡è±é/马桥é/髿¡¥é综åè¿è¾æå¡ç«ãéä¸é«éå·´ä¸ç»¼åå®¢è¿æ¢çº½ãæ½æ±ä¼ åå ¬è·¯æ¸¯é¡¹ç®â¦ï¼ï¼å±æèµç³»ç»æªæ¶å½ç客è§å·®å¼ï¼ä¾ä¸å¡å¤æï¼éæ¬æ¬¡æ¹å¨å¼å ¥ | | P5 | æºæä»¶ä¸º `.xls` ä¸å«åå¹¶åå æ ¼ | ç¨ Excel 16.0 COM æ´è¡å é¤ï¼ç¬¬ 11~63 è¡ï¼ï¼ä¿åå `xlrd` 夿 ¸è¡æ° 86 â 33ï¼èæ¬ç»ææ¸ çäºæ¬æ¬¡æ°å»ºçå¤å¿ EXCEL è¿ç¨ | ## äºãç»è®º - æ°æ¨¡æ¿ã2026å¹´8ææèµç³»ç»é¡¹ç®æç»ã已坿£å¸¸å¯¼å ¥ï¼129 æ¡ï¼ï¼å段éå对é½ï¼ç¼ºåä¸è¯¯å¡«ï¼ - å®¡æ ¸ä¸åå ãåºå缺失ãæç误æ¥ï¼RULE_I002 ç± 100+ æ¡é为 0 æ¡ï¼ï¼å ¶ä½ä¸æ¡ INVEST è§åç»ææ£å¸¸ï¼28 æ¡ï¼ï¼ - åå °ç©æµæ±æ»è¡¨æºæä»¶å·²æ¸ 餿¦æ±/é»ç³æ®µï¼å¤ä»½çæ¡£ï¼ï¼é导éªè¯ï¼åå °åªåº 7 æ¡ï¼åºå 项ç®/æåº¦æ°ä¸å¢ä¸åï¼**该æ®çé®é¢éç¯**ã æµè¯äººï¼Codexï¼AIï¼ãæµè¯æ¥æï¼2026-09-21 docs/¹¤×÷ÈÕ½á/¹¤×÷ÈÕ½á_2026-09-21.md
@@ -58,9 +58,22 @@ **导åºãææåç®å½ + èªå¨å¤ä»½ + è¿è¡æ¥å¿/æ ¡éªæ¥éãæªå®ç°**ï¼Q10 å·²çåæï¼ï¼ 6. 导åºååºæ°ä½æ£ï¼B4ï¼åªåäºä¸åï¼å端 `getLastMidIssues()` **æ ä»»ä½è°ç¨æ¹**ï¼åç«¯æªæ¶è´¹ãæ ãæ°æ®ç¼ºå¤±æ¸ åã页ã ### 5. åå °ç©æµæºæä»¶æ¸ çï¼ç¨æ·ãæ¸ é¤æãï¼+ æèµç³»ç»æ°æ¨¡æ¿æ¯æ - **åå °æºæä»¶æ¸ çï¼æ°æ®å¤ç½®ï¼**ï¼`docs/æèµ/è¾å ¥/ç©æµï¼ç©æµååºï¼/8æ/æ¹åçåå °äº¤éç©æµåºç¡è®¾æ½æèµç»è®¡æ±æ»è¡¨ï¼ææ¥ï¼ï¼2026å¹´8æï¼.xls` éçæ¦æ±æ®µï¼27 个项ç®ï¼ä¸é»ç³æ®µï¼4 个项ç®ï¼ç¨ Excel COM æ´è¡å é¤ï¼ç¬¬ 11~63 è¡ï¼ï¼åªçåå °æ®µï¼7 个项ç®ï¼ï¼ åä»¶å å¤ä»½å° `docs/æèµ/è¾åº/æºæä»¶å¤ä»½/â¦_åå§å«æ¦æ±é»ç³_20260921.xls`ã é导éªè¯ï¼è¯¥æä»¶ç± **38 æ¡ â 7 æ¡**ï¼8 æç©æµ total 128 â 97ï¼åºå 仿¯ 152 ä¸ªé¡¹ç® / 136 æ¡ 2026-08 æåº¦æ°ï¼ä¸å¢ä¸åï¼â **æ®çé®é¢éç¯**ã - **æèµç³»ç»å¯¼åºæ°æ¨¡æ¿**ï¼ç¨æ·ææ¯å¯¹æç»è¡¨æ¢æã2026å¹´8ææèµç³»ç»é¡¹ç®æç»ãï¼å¤ãé¡¹ç®æå¤é¶æ®µããå°ãèªå¹´å累计ãï¼å使´ä½å³ç§»ï¼ã åå®ç°åæ» 8 å â æ¹ä¸º**æè¡¨å¤´å ³é®åå®ä½**ï¼`findColByKeywords`ï¼ï¼å ¼å®¹æ°æ§æ¨¡æ¿ï¼ç¼ºåæ¶ `year_cum` ç空è䏿¯éå¡«ã æ°æ¨¡æ¿ 129 æ¡å·²å ¥åºï¼`investment_system` 2026-08 = 129ï¼2026-07 = 148 ä¸åå½±åï¼ï¼å段éåæ½æ¥ä¸è´ã - **å®¡æ ¸ãåºå缺失ãä¿æ¤**ï¼æ°æ¨¡æ¿æ²¡æãèªå¹´å累计ãï¼å `nvl()` 伿 NULL å½ 0 â 100+ æ¡è¯¯æ¥ãæ¹ä¸ºåºå为 NULL æ¶è·³è¿å¹¶è®° WARN æ¥å¿ã 宿µï¼RULE_I002 ç±ãæ¯ä¸ªé¡¹ç®ä¸æ¡ãé为 **0 æ¡**ï¼RULE_I001 2 æ¡ãRULE_I003 1 æ¡ãRULE_I004ï¼å卿§ï¼25 æ¡ï¼å计 28 æ¡å为çå®å·®å¼ã ## äºãæµè¯ç»ææè¦ - æ¬æ¬¡**æ ä»£ç æ¹å¨**ï¼æ ãåè½æµè¯æ¥åãï¼ä» ææ°æ®æ ¸æ¥ï¼ã - è§ãåè½æµè¯æ¥å_æèµç³»ç»æ°æ¨¡æ¿æè¡¨å¤´è§£æä¸å®¡æ ¸åºåç¼ºå¤±ä¿æ¤_2026-09-21.mdãï¼**11 æ¡ç¨ä¾éè¿**ï¼æ£å 6 / è´å 1 / åå½ 4ï¼ã - ä¸åæ¥ï¼æ±æ»å¤§è¡¨å轨å¶å®ä½ï¼ï¼æ¬æ¬¡**æ ä»£ç æ¹å¨**ï¼æ ãåè½æµè¯æ¥åãï¼ä» ææ°æ®æ ¸æ¥ï¼ã - æ°æ®æ ¸æ¥å£å¾ï¼å ¨é¨ç»æä¸åºå `h2031_enterprise_monthly` / `passenger_individual_monthly` / `city_bus_monthly` / `city_taxi_monthly` / `wyc_order_monthly` ç°ç®å¼é使¯å¯¹ï¼17 å¸å· à 8 个æï¼ ä¸è´æ§è¾¾ 1e-9ï¼å¤ç°èæ¬ä¸ä¸é´è¾åºå·²çæ¡£ï¼è§ä¸ï¼ã docs/Ͷ×Ê/ÊäÈë/Ä£°å_²éѯ½á¹û(Ͷ×Êϵͳ-¿ÍÔË+ÎïÁ÷ 2026.7).xlsBinary files differ
docs/Ͷ×Ê/ÊäÈë/ÎïÁ÷£¨ÎïÁ÷Ô°Çø£©/8ÔÂ/ºþ±±Ê¡Ê®Ñß½»Í¨ÎïÁ÷»ù´¡ÉèʩͶ×Êͳ¼Æ»ã×Ü±í£¨Ô±¨£©£¨2026Äê8Ô£©.xlsBinary files differ
docs/Ͷ×Ê/Êä³ö/Ô´Îļþ±¸·Ý/ºþ±±Ê¡Ê®Ñß½»Í¨ÎïÁ÷»ù´¡ÉèʩͶ×Êͳ¼Æ»ã×Ü±í£¨Ô±¨£©£¨2026Äê8Ô£©_Ôʼº¬Î人»ÆÊ¯_20260921.xlsBinary files differ
traffic-audit-server/src/main/java/com/trafficaudit/auditengine/service/AuditEngineService.java
@@ -690,23 +690,30 @@ if (sys == null) return null; // ç¼ºå¤±ç± EXISTENCE_SYS è§åæç¤º String field = rule.getCheckField(); double actual; double reference; Double referenceObj; String fieldName; if ("startCum".equals(field)) { actual = nvl(monthly.getStartCum()); reference = nvl(sys.getStartCum()); referenceObj = sys.getStartCum(); fieldName = "èªå¼å§å»ºè®¾ç´¯è®¡"; } else if ("yearCum".equals(field)) { actual = nvl(monthly.getYearCum()); reference = nvl(sys.getYearCum()); referenceObj = sys.getYearCum(); fieldName = "èªå¹´å累计"; } else if ("monthDone".equals(field)) { actual = nvl(monthly.getMonthDone()); reference = nvl(sys.getMonthDone()); referenceObj = sys.getMonthDone(); fieldName = "æ¬æå®æ"; } else { return null; } // åºå缺失ï¼å¦æ°æ¨¡æ¿ã2026å¹´Xææèµç³»ç»é¡¹ç®æç»ã没æãèªå¹´å累计ãåï¼â ä¸å ·å¤å¯æ¯æ§ï¼è·³è¿å¹¶è®°æ¥å¿ï¼ // ä¸è½æ null 彿 0 廿¯å¯¹ï¼å¦å伿ç误æ¥ã if (referenceObj == null) { log.warn("æèµæ¯å¯¹è·³è¿ï¼æèµç³»ç»åºå缺失ï¼ï¼rule={} project={} field={}", rule.getRuleCode(), projectName, fieldName); return null; } double reference = referenceObj; String[] parts = rule.getThreshold().split("\\|"); double absThreshold = parts.length > 0 ? parseDoubleSafe(parts[0], 50) : 50; double pctThreshold = parts.length > 1 ? parseDoubleSafe(parts[1], 5) : 5; traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java
@@ -1808,6 +1808,35 @@ } } /** æè¡¨å¤´å ³é®åå®ä½åå·ï¼ä»ç¬¬ 1 åå峿«ï¼å½ä¸ä»»ä¸å ³é®åå³è¿å该åï¼æªå½ä¸è¿å -1 */ private int findColByKeywords(Row header, String... keywords) { if (header == null) return -1; for (int c = 0; c <= header.getLastCellNum(); c++) { Cell cell = header.getCell(c); if (cell == null) continue; String h = FORMATTER.formatCellValue(cell).trim(); if (h.isEmpty()) continue; for (String k : keywords) { if (h.contains(k)) return c; } } return -1; } /** è¡¨å¤´è¡ææ¬ï¼æ¥éæç¤ºç¨ï¼ï¼æå¤å 12 å */ private String headerText(Row header) { if (header == null) return "空"; StringBuilder sb = new StringBuilder(); for (int c = 0; c < Math.min(header.getLastCellNum(), 12); c++) { Cell cell = header.getCell(c); String h = cell == null ? "" : FORMATTER.formatCellValue(cell).trim(); if (h.isEmpty()) continue; if (sb.length() > 0) sb.append(" | "); sb.append(h); } return sb.length() == 0 ? "空" : sb.toString(); } /** æè¡¨å¤´å称建ç«åå·æ å°ï¼å ¼å®¹æ°æ§æ¨¡æ¿åä½å·®å¼ */ private Map<String, Integer> buildHeaderMap(Row header) { Map<String, Integer> colMap = new HashMap<>(); @@ -2931,32 +2960,42 @@ this.monthly = monthly; } } /** æèµç³»ç»å¯¼åºå¯¼å ¥ï¼å®¡æ ¸æ¯å¯¹åºåï¼ï¼åºå®8åï¼è¡å·/åä½/æ¶æ/è®¡åæ»æèµ/èªå¼å§ç´¯è®¡/æ¬å¹´è®¡å/èªå¹´å累计/彿宿 */ private static final int[] INVEST_SYSTEM_HEADER_COLS = {0, 1, 2, 3, 4, 5, 6, 7}; private static final String[] INVEST_SYSTEM_HEADER_KEYWORDS = {"è¡å·", "åä½", "æ¶æ", "è®¡åæ»æèµ", "èªå¼å§å»ºè®¾", "æ¬å¹´è®¡åæèµ", "èªå¹´å", "彿宿æèµ"}; /** æèµç³»ç»å¯¼åºå¯¼å ¥ï¼å®¡æ ¸æ¯å¯¹åºåï¼ã * åä½**æè¡¨å¤´å ³é®åå®ä½**ï¼å ¼å®¹ä¸¤ç§æ¨¡æ¿ï¼ * - èæ¨¡æ¿ã模æ¿_æ¥è¯¢ç»æ(æèµç³»ç»-客è¿+ç©æµ 2026.7).xlsãï¼è¡å·/åä½/æ¶æ/è®¡åæ»æèµ/èªå¼å§å»ºè®¾ç´¯è®¡/æ¬å¹´è®¡åæèµ/èªå¹´å累计/彿宿æèµ * - æ°æ¨¡æ¿ã2026å¹´Xææèµç³»ç»é¡¹ç®æç».xlsãï¼ç¨æ· 2026-09-21 æ´æ¢ï¼ï¼è¡å·/æèµé¡¹ç®/æ¶æ/é¡¹ç®æå¤é¶æ®µ/è®¡åæ»æèµ/æ¬å¹´è®¡åæèµ/èªå¼å§å»ºè®¾è³æ¬å¹´ï¼æï¼åº-ç´¯è®¡å®ææèµ/彿宿æèµ * æ°æ¨¡æ¿**没æãèªå¹´å累计ãå** â year_cum ç空ï¼å®¡æ ¸æ¶æãåºå缺失ãè·³è¿ï¼ä¸å彿 0 å䏿¯å¯¹ï¼ã */ public int importInvestmentSystem(MultipartFile file, String period) throws Exception { List<InvestmentSystem> list = new ArrayList<>(); int failRows = 0; try (Workbook wb = WorkbookFactory.create(file.getInputStream())) { Sheet sheet = wb.getSheetAt(0); requireHeaderKeyword(sheet, "æèµç³»ç»å¯¼åº", "项ç®åç§°", "è®¡åæ»æèµ", "åä½"); requireHeaderLayout(sheet, "æèµç³»ç»å¯¼åº", "模æ¿_æ¥è¯¢ç»æ(æèµç³»ç»-客è¿+ç©æµ 2026.7).xls", INVEST_SYSTEM_HEADER_COLS, INVEST_SYSTEM_HEADER_KEYWORDS); requireHeaderKeyword(sheet, "æèµç³»ç»å¯¼åº", "æèµé¡¹ç®", "项ç®åç§°", "åä½", "è®¡åæ»æèµ"); Row header = sheet.getRow(0); int cName = findColByKeywords(header, "æèµé¡¹ç®", "项ç®åç§°", "åä½"); int cTotal = findColByKeywords(header, "è®¡åæ»æèµ"); int cYearPlan = findColByKeywords(header, "æ¬å¹´è®¡åæèµ"); int cStartCum = findColByKeywords(header, "èªå¼å§å»ºè®¾"); int cYearCum = findColByKeywords(header, "èªå¹´å"); int cMonthDone = findColByKeywords(header, "彿宿æèµ"); if (cName < 0 || cTotal < 0 || cYearPlan < 0 || cStartCum < 0 || cMonthDone < 0) { throw new RuntimeException("æéæ°æ®ç±»åãæèµç³»ç»å¯¼åºã表头åä¸å®æ´ï¼éè¦ãæèµé¡¹ç®(æåä½)ãè®¡åæ»æèµãæ¬å¹´è®¡åæèµã" + "èªå¼å§å»ºè®¾â¦ç´¯è®¡å®ææèµã彿宿æèµãçåï¼å®é 表头为ã" + headerText(header) + "ãã请使ç¨ç³»ç»æ¨¡æ¿ã2026å¹´Xææèµç³»ç»é¡¹ç®æç»ãæã模æ¿_æ¥è¯¢ç»æ(æèµç³»ç»-客è¿+ç©æµ)ãæ´çååå¯¼å ¥"); } for (int r = 1; r <= sheet.getLastRowNum(); r++) { Row row = sheet.getRow(r); if (row == null) continue; String name = getString(row, 1); String name = getString(row, cName); if (name == null || name.trim().isEmpty()) continue; InvestmentSystem sys = new InvestmentSystem(); sys.setReportPeriod(period); sys.setProjectName(name.trim()); sys.setTotalInvestment(getDecimal(row, 3)); sys.setStartCum(getDecimal(row, 4)); sys.setYearPlan(getDecimal(row, 5)); sys.setYearCum(getDecimal(row, 6)); sys.setMonthDone(getDecimal(row, 7)); sys.setTotalInvestment(getDecimal(row, cTotal)); sys.setStartCum(getDecimal(row, cStartCum)); sys.setYearPlan(getDecimal(row, cYearPlan)); sys.setYearCum(cYearCum < 0 ? null : getDecimal(row, cYearCum)); sys.setMonthDone(getDecimal(row, cMonthDone)); list.add(sys); } } catch (Exception e) {