| 2026-09-16 | zhizhijie | ![]() |
| 2026-09-16 | zhizhijie | ![]() |
| 2026-09-16 | zhizhijie | ![]() |
| 2026-09-16 | zhizhijie | ![]() |
| 2026-09-16 | zhizhijie | ![]() |
| 2026-09-16 | zhizhijie | ![]() |
| 2026-09-16 | zhizhijie | ![]() |
| 2026-09-16 | zhizhijie | ![]() |
| 2026-09-16 | zhizhijie | ![]() |
| 2026-09-16 | zhizhijie | ![]() |
| 2026-09-16 | zhizhijie | ![]() |
| 2026-09-16 | zhizhijie | ![]() |
| 2026-09-16 | zhizhijie | ![]() |
| 2026-09-16 | zhizhijie | ![]() |
| 2026-09-16 | zhizhijie | ![]() |
.gitignore
@@ -38,6 +38,10 @@ Thumbs.db desktop.ini # ==== Office æå¼ææ¡£æ¶äº§ççéæä»¶ ==== ~$* _pylibs/ # ==== ??/?????????==== _shots/ *.nb3 docs/8Ô¹æÉÏ»õÎïÖÜתÁ¿ÓëÔ˾à·ÖÎö±¨¸æ_²Ý¸å_2026-09-10.md
New file @@ -0,0 +1,99 @@ # 2026å¹´8æè§ä¸è´§ç©å¨è½¬éä¸å¹³åè¿è·åææ¥åï¼èç¨¿ï¼ > æ°æ®æ¥æºï¼ãå ¨çè§ä¸è´§ç©å¨è½¬éå·®å¼ç.xlsxãçãå¸å·æ±æ»ããä¼ä¸æç»ã两个页ç¾ãä¼ä¸æç»ä¸º **8æå½æ** å£å¾ï¼ä» å«å½ä¸é®é¢çä¼ä¸ï¼ä¸ä»£è¡¨å¸å·å ¨é¨è§ä¸ä¼ä¸ã > èç¨¿æ¥æï¼2026-09-10 ## ä¸ãæ»ä½æ åµ 2026å¹´8æï¼å ¨çè§ä¸é路货ç©è¿è¾å®æè´§è¿é 3665.36 ä¸å¨ãè´§ç©å¨è½¬é 570004.44 ä¸å¨å ¬éï¼åæ¯åå«ä¸é 1.37%ãå¢é¿ 9.60%ï¼è´§è½¦å¹³åè¿è· 155.51 å ¬éï¼åæ¯å¢é¿ 11.11%ã䏿¥å¨è½¬éä¸è½¨è¿¹éç¨æµç®å¨è½¬éçå·®å¼çæ¬æä¸º 4.69%ï¼æ¯ä¸æï¼7æï¼ç 20.65% æ¶çª 15.96 个ç¾åç¹ã 1-8æç´¯è®¡ï¼å ¨çè§ä¸è´§è¿é 31399.82 ä¸å¨ãè´§ç©å¨è½¬é 4927161.77 ä¸å¨å ¬éï¼åæ¯åå«ä¸é 7.63% å 3.44%ï¼ç´¯è®¡å·®å¼ç 29.93%ï¼æ¯1-7æç 34.16% æ¶çª 4.23 个ç¾åç¹ã æ»ä½ç¹å¾ï¼å½æåç° **âè´§è¿éä¸éãå¨è½¬éå¢é¿ãå¹³åè¿è·æé¿â**ãå¨è½¬éå¢éï¼+9.6%ï¼ææ¾é«äºè´§è¿éï¼-1.4%ï¼ï¼å¢é¿ä¸»è¦æ¥èªå¹³åè¿è·æé¿ï¼+11.1%ï¼ï¼èéè¿è¾éå¢å ï¼å¨è½¬é = è´§è¿é à 平åè¿è·ï¼è´§è¿éä¸éæ¶ï¼å¨è½¬éè½å¦å¢é¿å®å ¨åå³äºè¿è·æé¿å¹ 度ï¼ï¼ä½ç´¯è®¡å£å¾å¨è½¬éä»ä¸ºè´å¢é¿ï¼-3.4%ï¼ï¼å½æååå°æªæè½¬ç´¯è®¡ä¸éè¶å¿ã ## äºãéç¹å¸å·çéå é忦æ±ãé»ç³ã宿ãè¥é³ãèå·ãé»åãå¸å® 7 个å¸å·ï¼è¡¨å é»è²æ 注ï¼ä½ä¸ºéç¹åæå¯¹è±¡ï¼çç±å¦ä¸ï¼ 1. **å ¨çè´§è¿ä¸»ä½**ï¼7 个å¸å· 8 æè´§è¿éå计 3142.32 ä¸å¨ï¼å å ¨ç **85.7%**ï¼1-8 æç´¯è®¡å 86.2%ï¼8 æå¨è½¬éå 85.2%ãè´§è¿ä¸»ä½å¨è¿éï¼å ¨çé®é¢çä¸»è¦æ¥æºä¹å¨è¿éã 2. **å¨è½¬éå¢é¿ä¸»è¦ç±è¿è·æå¨**ï¼ç±äº å¨è½¬é = è´§è¿é à 平åè¿è·ï¼å¨è´§è¿éä¸éæ¶ï¼å¨è½¬éè½å¦å¢é¿å®å ¨åå³äºè¿è·çæé¿å¹ 度ãé»ç³ï¼è´§è¿é -34.6%ãè¿è· +85.5%ãå¨è½¬é +21.3%ï¼ãè¥é³ï¼-22.8%ã+32.8%ã+2.5%ï¼çè¿è·æé¿å¹ åº¦ææ¾å¤§äºå ¨çï¼+11.1%ï¼ï¼èå·ï¼-6.4%ã+7.7%ã+0.8%ï¼éåèå¨è½¬éå¾®å¢ï¼åå±è´§éä¸å¨è½¬éä¸ååãä¸è¿°å¸å·éæ ¸å®ä»£è¡¨ä¼ä¸è¿è·æ¯å¦çå®ã 3. **çéè¿è¾ç¹å¾**ï¼å®æï¼87.29 å ¬éï¼ãå¸å®ï¼83.58 å ¬éï¼ãé»ç³ï¼121.73 å ¬éï¼ãé»åï¼132.00 å ¬éï¼å¹³åè¿è·ææ¾ä½äºå ¨ç 155.51 å ¬éï¼ä»¥çéè¿è¾ä¸ºä¸»ã | å¸å· | 8æè´§è¿é(ä¸å¨) | å å ¨ç | 8æå¹³åè¿è·(å ¬é) | 2025å¹´8æè¿è· | è¿è·åæ¯ | 8æè´§è¿é忝 | 8æå¨è½¬é忝 | 8æå·®å¼ç | |---|---|---|---|---|---|---|---|---| | æ¦æ± | 1167.83 | 31.9% | 164.68 | 136.62 | +20.5% | +10.6% | +33.3% | +0.6% | | é»ç³ | 131.00 | 3.6% | 121.73 | 65.62 | +85.5% | -34.6% | +21.3% | -11.0% | | 宿 | 761.88 | 20.8% | 87.29 | 77.01 | +13.4% | +5.5% | +19.6% | +77.0% | | è¥é³ | 326.61 | 8.9% | 287.54 | 216.51 | +32.8% | -22.8% | +2.5% | +1.7% | | èå· | 111.85 | 3.1% | 320.92 | 297.97 | +7.7% | -6.4% | +0.8% | -15.8% | | é»å | 560.89 | 15.3% | 132.00 | 126.09 | +4.7% | -10.7% | -6.5% | +120.2% | | å¸å® | 82.25 | 2.2% | 83.58 | 75.35 | +10.9% | +16.5% | +29.2% | -2.9% | | **å ¨ç** | 3665.36 | 100.0% | 155.51 | 139.96 | +11.1% | -1.4% | +9.6% | +4.7% | ## ä¸ã代表ä¼ä¸åæ > 代表ä¼ä¸æâå¨è½¬éè§æ¨¡å¤§ãå·®å¼çé«ãè¿è·åæ¯å¼å¸¸âä¸ä¸ªè§åº¦éåï¼æ¯å¸å· 3 å®¶ï¼è¡¨å æ°æ®å为 8 æå½æã ### æ¦æ± æç»å 101 å®¶ï¼å ¶ä¸å·®å¼çâ¥30% ç 76 å®¶ãâ¥100% ç 37 å®¶ï¼å¹³åè¿è·åæ¯>30% ç 44 å®¶ãæ¦æ± 8 æå·®å¼çä» +0.57%ï¼ä¼ä¸å±é¢å´é«åº¦éä¸ï¼å±å ¸åçâå¤§çæ£å¸¸ã个ä½å¼å¸¸âã | ä¼ä¸åç§° | 8æå¨è½¬é(ä¸å¨å ¬é) | 8æè´§è¿é(ä¸å¨) | å¹³åè¿è·(å ¬é) | è¿è·åæ¯ | å¨è½¬é忝 | å·®å¼ç | |---|---|---|---|---|---|---| | æ¹ååæ¶ç©æµæéå ¬å¸ | 9617.4 | 20.29 | 474.1 | +100.4% | +172.2% | -66.9% | | æ¦æ±è¥¿é©¬é¢éç©æµæéå ¬å¸ | 5085.6 | 81.72 | 62.2 | +100.0% | +130.8% | +169.0% | | æ¦æ±å®éè¿è´¸æéå ¬å¸ | 900.9 | 14.42 | 62.5 | +182.3% | +304.1% | +337.2% | ### é»ç³ æç»å ä» 3 å®¶ï¼å·®å¼çåæªè¶ è¿ 30%ï¼ä½ 3 å®¶ä¼ä¸å¹³åè¿è·åæ¯å ¨é¨è¶ è¿ 30%ãé»ç³ 8 æè´§è¿é忝 -34.6%ãå¨è½¬é忝 +21.3%ï¼éä»·èç¦»å¨ 7 个å¸å·ä¸æææ¾ã | ä¼ä¸åç§° | 8æå¨è½¬é(ä¸å¨å ¬é) | 8æè´§è¿é(ä¸å¨) | å¹³åè¿è·(å ¬é) | è¿è·åæ¯ | å¨è½¬é忝 | å·®å¼ç | |---|---|---|---|---|---|---| | æ¹å鸿èç©æµæéè´£ä»»å ¬å¸ | 1026.0 | 0.96 | 1073.7 | +56.1% | +119.6% | -11.9% | | 大嶿è²ç©æµæéå ¬å¸ | 107.1 | 2.83 | 37.8 | +67.2% | -81.6% | -0.3% | | æ¹å广è¿è¿éç©æµæéå ¬å¸ | 239.2 | 8.04 | 29.8 | +30.6% | -13.9% | -0.2% | ### 宿 æç»å 50 å®¶ï¼å·®å¼çå ¨é¨â¥30%ï¼å ¶ä¸ 29 å®¶â¥100%ï¼8 æå·®å¼ç +77.01%ï¼å± å ¨ç第äºï¼å±å·®å¼é¢æå¹¿çå¸å·ä¹ä¸ã | ä¼ä¸åç§° | 8æå¨è½¬é(ä¸å¨å ¬é) | 8æè´§è¿é(ä¸å¨) | å¹³åè¿è·(å ¬é) | è¿è·åæ¯ | å¨è½¬é忝 | å·®å¼ç | |---|---|---|---|---|---|---| | 宿åç¨ä¾åºé¾ç®¡çæéå ¬å¸ | 5791.9 | 6.96 | 831.6 | +5.5% | -10.4% | +256.8% | | å ´å±±å¿å ´åæ±½è¿æéå ¬å¸ | 4383.1 | 96.00 | 45.7 | +56.4% | +64.5% | +155.7% | | æ¹å訸è¿ç³åç©æµæéå ¬å¸ | 2518.2 | 5.71 | 441.2 | -26.1% | +99.1% | +111.8% | ### è¥é³ æç»å 34 å®¶ï¼å·®å¼çâ¥30% ç 21 å®¶ãè¥é³ 8 æè´§è¿é忝 -22.8%ãå¨è½¬é忝 +2.5%ãè¿è·åæ¯ +32.8%ï¼å±âè´§éä¸éãè¿è·æé¿âåã | ä¼ä¸åç§° | 8æå¨è½¬é(ä¸å¨å ¬é) | 8æè´§è¿é(ä¸å¨) | å¹³åè¿è·(å ¬é) | è¿è·åæ¯ | å¨è½¬é忝 | å·®å¼ç | |---|---|---|---|---|---|---| | è¥é³é¡ºåè¿è¾æéè´£ä»»å ¬å¸ | 5074.1 | 9.11 | 557.2 | +10.1% | -16.9% | +44.7% | | æ£é³å¸é«è·¯æºæ±½è½¦æå¡æéå ¬å¸ | 2498.5 | 6.56 | 380.7 | +72.8% | +61.0% | -7.8% | | è¥é³å¸éæµ·éç©æµæéå ¬å¸ | 1040.2 | 4.40 | 236.2 | +121.6% | +696.4% | -27.0% | ### èå· æç»å 22 å®¶ï¼å·®å¼çâ¥30% ç 18 å®¶ãâå·®å¼ç+è¿è·âåå½ä¸ 6 å®¶ãèå· 8 æè´§è¿é忝 -6.4%ãå¨è½¬é忝 +0.8%ã | ä¼ä¸åç§° | 8æå¨è½¬é(ä¸å¨å ¬é) | 8æè´§è¿é(ä¸å¨) | å¹³åè¿è·(å ¬é) | è¿è·åæ¯ | å¨è½¬é忝 | å·®å¼ç | |---|---|---|---|---|---|---| | å ¬å®å¿ä¸æºç©æµæéå ¬å¸ | 1888.9 | 7.05 | 267.8 | +126.2% | +192.5% | +494.7% | | èå·å¸å®è¾¾çç©æµè¡ä»½æéå ¬å¸ | 2017.2 | 3.11 | 649.2 | +133.9% | +27.8% | -57.7% | | å ¬å®å¿æºè¾¾æ±½è½¦è¿è¾æå¡æéå ¬å¸ | 1596.8 | 6.92 | 230.8 | +11.0% | +89.6% | +110.3% | ### é»å æç»å 52 å®¶ï¼å·®å¼çâ¥30% ç 49 å®¶ãâ¥100% ç 39 å®¶ï¼å¼å¸¸éä¸åº¦å ¨çæé«ï¼8 æå·®å¼ç +120.18%ï¼å± å ¨ç第ä¸ã | ä¼ä¸åç§° | 8æå¨è½¬é(ä¸å¨å ¬é) | 8æè´§è¿é(ä¸å¨) | å¹³åè¿è·(å ¬é) | è¿è·åæ¯ | å¨è½¬é忝 | å·®å¼ç | |---|---|---|---|---|---|---| | è²æ¥å¤ªå¹³æ´è½¦è¾è¿è¾æå¡æéå ¬å¸ | 6118.2 | 38.93 | 157.1 | +24.9% | +21.0% | +747.9% | | 黿¢ å¿å¹¿å汽车è¿è¾æéå ¬å¸ | 5009.4 | 6.04 | 829.9 | +0.6% | +11.2% | +321.5% | | ç½ç°å¿å ´è¾¾ç©æµè¿è¾æéå ¬å¸ | 2741.4 | 3.83 | 716.2 | -5.9% | -18.3% | +477.5% | ### å¸å® æç»å 8 å®¶ï¼è§æ¨¡è¾å°ï¼ä¸å·®å¼ç夿°ä¸ºè´ï¼ä¸æ¥ä½äºæµç®ï¼ãå¸å®æ¯ 7 个å¸å·ä¸å¯ä¸ 1-8 æç´¯è®¡âè´§è¿éå¢ãå¨è½¬ééâï¼+32.2% / -1.3%ï¼çå°åºï¼æ¹åä¸å ¶ä»å¸å·ç¸åï¼éåç¬è¯´æã | ä¼ä¸åç§° | 8æå¨è½¬é(ä¸å¨å ¬é) | 8æè´§è¿é(ä¸å¨) | å¹³åè¿è·(å ¬é) | è¿è·åæ¯ | å¨è½¬é忝 | å·®å¼ç | |---|---|---|---|---|---|---| | 赤å£å¸æµ·é建ææéå ¬å¸ | 876.9 | 10.87 | 80.7 | +39.4% | +75.1% | -21.4% | | æ¹åæ¬èªç©æµæéå ¬å¸ | 799.7 | 1.96 | 407.8 | +38.6% | +129.4% | +0.2% | | å鱼谦æºç§ææéå ¬å¸ | 520.3 | 6.94 | 75.0 | +90.5% | +285.4% | -14.8% | docs/database.md
@@ -222,6 +222,8 @@ | region_code | varchar(20) | æå±å°åºï¼è¡æ¿åºå代ç ï¼ | | enterprise_code | varchar(50) | ä¼ä¸ä»£ç | | enterprise_name | varchar(200) | ä¼ä¸åç§° | | unified_credit_code | varchar(50) | ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç ï¼æ°çæ¨¡æ¿æ°å¢åï¼èæ¨¡æ¿æ æ¤åæ¶ä¸º NULLï¼ | | report_unit | varchar(200) | å¡«æ¥åä½ï¼æ°çæ¨¡æ¿æ°å¢åï¼èæ¨¡æ¿æ æ¤åæ¶ä¸º NULLï¼ | | vehicle_total | int | 客è¿è½¦è¾_æ»è®¡ | | seat_total | int | æ ¸å®è½½å®¢ä½_æ»è®¡ | | vehicle_schedule | int | è½¦è¾æ°_客è¿ç车ï¼å«å®çº¿æ æ¸¸ï¼ | docs/init.sql
@@ -399,6 +399,8 @@ region_code VARCHAR(20) COMMENT 'æå±å°åº', enterprise_code VARCHAR(50) COMMENT 'ä¼ä¸ä»£ç ', enterprise_name VARCHAR(200) COMMENT 'ä¼ä¸åç§°', unified_credit_code VARCHAR(50) COMMENT 'ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç ', report_unit VARCHAR(200) COMMENT 'å¡«æ¥åä½', vehicle_total INT COMMENT '客è¿è½¦è¾_æ»è®¡', seat_total INT COMMENT 'æ ¸å®è½½å®¢ä½_æ»è®¡', vehicle_schedule INT COMMENT 'è½¦è¾æ°_客è¿ç车ï¼å«å®çº¿æ 游客è¿å®¢è½¦ï¼', docs/½»Í¨Í³¼Æ±¨±íÉóºËϵͳ_¹¦ÄÜÓëÍê³ÉÇé¿ö»ã±¨_2026-09-14.docxBinary files differ
docs/¹«Â·ÂÿÍ/Ä£°å_½»ÆóͳH203-1±í_¹«Â·ÂÿÍÔËÊäÔ¶ÈÉú²úÇé¿ö.xlsxBinary files differ
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_2026-07ĸ°æ²¹ÆëÓëµ¼³ö¼þ´ò²»¿ªÐÞ¸´_2026-09-16.md
New file @@ -0,0 +1,86 @@ # åè½æµè¯æ¥å â 2026-07 æ¯çè¡¥é½ & 导åºä»¶ãExcel æä¸å¼ãä¿®å¤ - æ¥æï¼2026-09-16 - èå´ï¼æ±æ»å¤§è¡¨ï¼`/api/report/export/summaryWorkbook`ï¼2026-07 / 2026-08 导åºï¼`docs/çææ±æ»å¤§è¡¨/2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨.xlsx` æ¯çè¡¥é½ - å ³èï¼`docs/é®é¢æ±æ»/é®é¢ä¸æ³¨æäºé¡¹æ±æ»_2026-09-16.md` 第åä¸è ## ä¸ãèæ¯ ã è´§è¿ã页ã累计ãåå£å¾å¨ 2026-09-16 å·²å¨ **8 ææ¯ç** è½å°ï¼è§ç¬¬åäºèï¼ãç¨æ·ç¡®è®¤ãå¯ä»¥è¡¥é½ãï¼è¦æ±æåä¸å£å¾è¡¥å° **7 ææ¯ç**ï¼å¹¶è§£å³ 7 æå¯¼åºä»¶æ æ³ç¨ Excel æå¼çé®é¢ã ## äºãæµè¯ç¯å¢ | 项 | å¼ | |---|---| | å端 | Spring Bootï¼8090ï¼ä¿®å¤åå·²éå¯ï¼ | | å端 | Vueï¼8080 | | æ°æ®åº | MySQL 127.0.0.1:3308 / traffic_audit | | Excel 夿® | Excel COM `Workbooks.Open`ï¼æ¯ä¾ç¬ç«å®ä¾ï¼æµå强æå¤å¿è¿ç¨ï¼ | | ç»æå¤æ® | Python `zipfile` + `xml.etree` éé¨ä»¶æ ¡éªãéæ ¼ `<c>` è§£æ | ## ä¸ãåç°çæ ¹å ï¼ä¸¤å¤ï¼åä¸ºæ¬æ¬¡ä¿®å¤å¯¹è±¡ï¼ ### 3.1 导åºä»¶æä¸å¼ï¼æ®ç `<is>` çéæ³åå æ ¼ åä»¶éåå¨ 19 个**模å¼éæ³**çæ ¼åï¼ ``` <c r="E15" s="111" t="n"><v>67.0</v><is><t>67.00</t></is></c> ``` `<is>`ï¼inlineStrï¼åªå 许åºç°å¨ `t="inlineStr"` çæ ¼éï¼`t="n"` å´å¸¦ `<is>` å±äºéæ³ï¼Excel ç´æ¥å¤å®ãæ æ³è¯»åçå 容ãæç»æå¼ï¼COM 表ç°ä¸ºãä¸è½åå¾ç±» Workbooks ç Open 屿§ãï¼è¿ä¿®å¤æ¨¡å¼ `CorruptLoad=1` 乿ä¸å¼ï¼ã **æå **ï¼7 ææ¯çç± **openpyxl** ååºï¼`docProps/app.xml` = `Microsoft Excel Compatible / Openpyxl 3.1.5`ï¼ææ¬ç¨ `<is>` åå¨ï¼ãå¯¼åºæ¶å«çåå ¥è·¯å¾åªæ¹ `t`/`<v>`ï¼**䏿¸ æ§ `<is>`**ï¼è 8 ææ¯çæ¯ Excel åçï¼ææ¬èµ° sharedStringsï¼ï¼æä»¥åæ ·ä»£ç ä¸ 8 æä»¶æ£å¸¸ã7 æä»¶åã **为ä»ä¹åªæ 7 æå**ï¼7 æåå¨åæå¤ä»½æ¯ç `_å¤ä»½_2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨_æ¸ çå_20260904.xlsx`ï¼`restoreSummaryMonthlyBlocks` 伿´æ ¼åå¡«ï¼åå¡«åå ¥ inlineStr æ¯çæ ¼æ¶ç䏿§ `<is>`ã8 ææ²¡æè¯¥ `_å¤ä»½_*` æä»¶ï¼ä¸èµ°åå¡«ï¼å æ¤ä¸è§¦åã **å®ä½æ¹æ³**ï¼å¯å¤ç¨ï¼ï¼åä»¶ä¸å¥½ä»¶é¤ worksheets/styles/sharedStrings å¤**å ¨é¨é¨ä»¶éåèç¸å** â ç¨ zip æäº¤ + Excel éä¸å¼æ¡£å leave-one-outï¼å®ä½å° **sheet9ãå ¬äº¤ã(17 æ ¼) + sheet12ã轨éã轮渡ã(2 æ ¼)**ã ### 3.2 æ¯çè¡¥é½è¢«å¤ä»½æ¯çãçæå夿´»ã 补好 7 ææ¯çå导åºï¼`è´§è¿` 页 2022/2021 累计**åå忧忻叏é** ââ å 为 `restoreSummaryMonthlyBlocks` æå¤ä»½æ¯çï¼æ¸ çåã仿¯æ§å¸¸éï¼æ´æ ¼åå¡«è¦çäºæ¯ççæ°å ¬å¼ã ## åãä¿®å¤å 容 | # | ä½ç½® | æ¹å¨ | |---|---|---| | 1 | `ReportExportService.exportSummaryWorkbook` | è½çåæ°å¢ `normalizeStaleInlineStrings(wb)`ï¼æææãé inlineStr å´æ®ç `<is>`ãçæ ¼åæ¸ æï¼å¹çï¼ï¼å¹¶æ warn æ¥å¿ | | 2 | `ReportExportService.restoreSummaryMonthlyBlocks` | æ°å¢ `skipFreightHistoryBlocks`ï¼ã è´§è¿ã页 **T åå以å**ï¼2025/2024/2023/2022/2021 年度å + å年累计/ç´¯è®¡åæ¯åï¼æ°¸ä¸ä»å¤ä»½æ¯çåå¡«ï¼é¿å âçæå夿´»âï¼ä¸æ¢æãä¸å£å¾æåãå·¦åä¿æ¤åä¸æè·¯ï¼ | | 3 | `docs/çææ±æ»å¤§è¡¨/2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨.xlsx` | Excel COM è¡¥é½ï¼2025/2024/2023/2022/2021 äºä¸ªå¹´åº¦åå ± **360** 个åå æ ¼ï¼`r7/r9/r8/r10 = SUM(17 å¸å·)`ã`r5=r7+r9`ã`r6=r8+r10`ï¼+ **324** ä¸ªç´¯è®¡æ ¼ï¼`DX=SUM(DK:DV)`ã`EM=SUM(EA:EL)`ã`DY=IFERROR(DX/SUM(EA:EL)-1,"")`ï¼ï¼`CalculateFullRebuild` åä¿å | > å¤ä»½ï¼`docs/çææ±æ»å¤§è¡¨/_bak_2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨_è¡¥é½å_20260916.xlsx`ï¼**æ æä¸ç¨ `_å¤ä»½_` åç¼**ï¼å¦åä¼è¢« `resolveSummaryDonor` 彿 donor åå¡«ï¼ã ## äºãç¨ä¾è¡¨ | # | ç¨ä¾ | è¾å ¥ | 颿 | å®é | ç»è®º | |---|---|---|---|---|---| | 1 | åä»¶å¤ç° | 2026-07 导åºï¼ä¿®å¤åï¼ | å¯æå¼ | Excel æ¥ãä¸è½åå¾ç±» Workbooks ç Open 屿§ãï¼éè¯ 2 次ä»å¤±è´¥ | å¤ç° | | 2 | ç¯å¢æé¤ | 10KB å°ä»¶ / 8 ææ¯ç / 7 ææ¯ç / 09-08 æ§ 7 æå¯¼åº | â | å ¨é¨å¯æå¼ï¼ä» æ° 7 æå¯¼åºå¤±è´¥ | 确认éç¯å¢é®é¢ | | 3 | è·¯å¾æé¤ | åä»¶å¤å¶å°å¦ä¸ç®å½æ¹å | ä»å¤±è´¥ | ä»å¤±è´¥ | ç¡®è®¤æ¯æä»¶å 容é®é¢ | | 4 | é¨ä»¶çº§æäº¤ | åä»¶ + 好件ç styles/sharedStrings/worksheets | å®ä½åé¨ä»¶ | åä»¶ styles + åä»¶ sst + **å¥½ä»¶å ¨é¨ sheets** â å¯æå¼ | å®ä½å° worksheets | | 5 | leave-one-out | 19 个 sheet éä¸ªæ¢æåä»¶ç | æ¾åºå sheet | ä» **sheet9ãå ¬äº¤ã/ sheet12ã轨éã轮渡ã** 失败 | å®ä½å° 2 页 | | 6 | è´åï¼éæ³æ ¼è®¡æ° | ä¿®å¤å导åºä»¶ | â | 19 个 `t="n"` 带 `<is>` | å½ä¸æ ¹å | | 7 | æ£åï¼ä¿®å¤å 2026-07 | éå¯å端åå¯¼åº | 坿å¼ã19 页ã累计对 | OK sheets=19ï¼`DX5=144979.2825`ï¼`=SUM(DK5:DV5)`ï¼ã`DY5=-0.101235487797891`ã`EM5=161309.53162`ã`CU5=173045.296428512` | éè¿ | | 8 | æ£åï¼ä¿®å¤å 2026-08 | åä¸ | 坿å¼ã累计ä¸å | OK sheets=19ï¼`DZ5=144979.2825`ã`EO5=161309.53162`ã`CW5=173045.296428512`ã`S5=130311.892698249` | éè¿ | | 9 | è·¨æä¸è´æ§ | 7 æ vs 8 æåå£å¾æ ¼å | å®å ¨ç¸ç | 2022 累计 / 2021 累计 / 2023 累计 ä¸ä¸ªæåº¦ â ä¸ä¸ªå¼**å®å ¨ç¸ç** | éè¿ | | 10 | éæ³æ ¼å¤æ« | ä¿®å¤å 7 æå¯¼åº | 0 个 | 0 个 | éè¿ | | 11 | æ¯çå¯æå¼ | è¡¥é½åç¨ Excel æå¼ 7 ææ¯ç | å¯æå¼ | å¯æå¼ | éè¿ | | 12 | æ®çæ°æ®å¤æ ¸ | `2026-09` äºå¼ è¡¨è®¡æ° | å ¨ 0 | å ¨ 0ï¼h204 / investment_monthly / h2032 / audit_result / import_batchï¼ | éè¿ | ## å ãåç°çé®é¢ä¸å¤ç½® 1. **7 æå¯¼åºä»¶æä¸å¼**ï¼P0ï¼ï¼`normalizeStaleInlineStrings` æ ¹æ²»ï¼å¯¼åºä»¶ä» 941,960 åèï¼åï¼â 1,310,693 åèï¼å¥½ï¼ã 2. **å¤ä»½æ¯çå填让补é½å¤±æ**ï¼P0ï¼ï¼`skipFreightHistoryBlocks` ä¿æ¤ `è´§è¿` T åå以åã 3. **Excel COM ä¼çå¤å¿è¿ç¨**ï¼æ¯ä¾æµå®å¿ é¡»å¼ºææ¬æ¬¡æ°å»ºç `EXCEL` è¿ç¨ï¼å¦ååç» `Workbooks.Open` ä¼**é´ææ§åæ¥**åæ ·çéï¼æ¬æ¬¡ææ¥åæè¢«æ¤å¹²æ°è¿ï¼ã屿æ¥å·¥å ·åï¼å·²è®°å ¥é®é¢æ±æ»ã 4. **注æ**ï¼æ¬æ¬¡**æª**æ¹å¨ 8 ææ¯çä¸ä»»ä½å ¥åºæ°æ®ã ## ä¸ãç»è®º - 2026-07 / 2026-08 两个导åºä»¶åå¯è¢« Excel æ£å¸¸æå¼ï¼å 19 页ï¼ï¼ä¸ã è´§è¿ã页 2021/2022/2023 累计åå£å¾**å®å ¨ä¸è´**ã - 7 ææ¯çå·²æ 8 ææ¯çå£å¾è¡¥é½ï¼å¹´åº¦å 360 æ ¼ + 累计 324 æ ¼ï¼ï¼å¹¶ä» openpyxl è¡ç¼è½¬ä¸º Excel åçã - ç¨æ·è¦æ±çãæ®çæ°æ®å ¨é¨æ¸ é¤ãç»å¤æ ¸ä¸º 0 æ®çã ## å «ãéç - 2026-06 / 2026-09 æ æ¯ç â é¢è§è¿å `ready=False`ãæªæ¾å°æ¨¡æ¿æä»¶ãï¼éæ°å»ºæ¯çæè½åºæ°ï¼ç¨æ·ç¬¬ 5 é®ç延伸ï¼ã - ä»åºæ ¹ç®å½ `_*.*` ä¸´æ¶ææ¥æä»¶ï¼å«æ¬æ¬¡ `_hyb_*` / `_loo_*` / `_v2_*` / `_final_*`ï¼æªå ï¼å¾ ç¨æ·åæã docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_H2031Ä£°åÐÂÔöÁÐÊÊÅä_2026-09-16.md
New file @@ -0,0 +1,53 @@ # åè½æµè¯æ¥åï¼H203-1 æ¨¡æ¿æ°å¢ãç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç / å¡«æ¥åä½ã两åéé - æ¥æï¼2026-09-16 - 模åï¼æ°æ®å¯¼å ¥ / æ°æ®æ¥ç / æ°æ®åºè¡¨ç»æ - ç»è®ºï¼**éè¿**ï¼æ£å 4 æ¡ãè´å 2 æ¡ãå ¼å®¹ 2 æ¡ãå ¥åºæ½æ¥ 814Ã2 é¡¹å ¨é¨å¯¹é½ï¼ ## ä¸ãåè½è¯´æ ç¨æ·ä¿®æ¹äºã模æ¿_交ä¼ç»H203-1表_å ¬è·¯æ 客è¿è¾æåº¦ç产æ åµã模æ¿ï¼å¨ãä¼ä¸åç§°ãä¹å**æå ¥ä¸¤å**ï¼`ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç `ã`å¡«æ¥åä½`ï¼å ¶ä½ 48 åæ´ä½å³ç§»ï¼æ»åæ°ç± 50 â 52ãæ¬æ¬¡æ¹å¨è®©å端è½è¯»åå¹¶å ¥åºè¿ä¸¤åï¼åæ¶ä¿è¯èæ ¼å¼æä»¶å ¼å®¹ã æ¹å¨æ¸ åï¼ | å± | æä»¶ | æ¹å¨ | |----|------|------| | æ°æ®åº | `h2031_enterprise_monthly` | `ADD COLUMN unified_credit_code VARCHAR(50) NULL AFTER enterprise_name`ã`ADD COLUMN report_unit VARCHAR(200) NULL AFTER unified_credit_code` | | å»ºè¡¨èæ¬ | `docs/init.sql` | åæ¥è¡¥ä¸¤å | | æ°æ®åå ¸ | `docs/database.md` | åæ¥è¡¥ä¸¤å说æ | | å®ä½ | `PassengerEnterpriseMonthly.java` | æ°å¢ `unifiedCreditCode`ã`reportUnit` | | å¯¼å ¥è§£æ | `DataImportService.java` | `importPassengerMonthly` å æè¡¨å¤´ååå¼ | | å端åé ç½® | `DataViewController.java` | `H2031_COLUMNS` æ°å¢ä¸¤åï¼æ°æ®æ¥ç页å¯è§ï¼ | ## äºãæµè¯ç¯å¢ - å端ï¼`Started TrafficAuditApplication` / `Tomcat started on port(s): 8090`ï¼éå¯åæ°ç¼è¯ï¼13:30ï¼ - å端ï¼8080 å·²å°±ç»ªï¼æ¬æ¬¡æªæ¹åç«¯ï¼æªéå¯ï¼ - æ°æ®åºï¼`traffic_audit` @ 127.0.0.1:3308 - æ°æ¨¡æ¿ï¼`docs\å ¬è·¯æ 客\模æ¿_交ä¼ç»H203-1表_å ¬è·¯æ 客è¿è¾æåº¦ç产æ åµ.xlsx`ï¼Sheet1ï¼816Ã52ï¼ - èæ ¼å¼ï¼`D:\æ¡é¢\æµè¯æ°æ®\å ¬è·¯æ 客\å «æ\å ¬è·¯æ 客è¿è¾æåº¦ç产æ åµï¼2026ï¼_2026-09-09 09_18_45.xls`ï¼Sheet0ï¼769Ã52ï¼ ## ä¸ãç¨ä¾è¡¨ | # | åºæ¯ | è¾å ¥ | 颿 | å®é | ç»è®º | |---|------|------|------|------|------| | 1 | æ£å-æ°æ¨¡æ¿å¯¼å ¥ | æ°æ¨¡æ¿ â `POST /api/import/passengerMonthly?period=2099-07` | æå䏿¡æ°ä¸æºæä»¶ä¸è´ | `æå 814 æ¡ï¼å¤±è´¥ 0 æ¡` | éè¿ | | 2 | æ£å-æ°åå ¥åº | æ¥ `unified_credit_code` / `report_unit` | 814 è¡å ¨é¨æå¼ | `count=814, c1=814, c2=814` | éè¿ | | 3 | å ¥åºæ½æ¥-é¦è¡ | æºç¬¬ 1 è¡ vs åºç¬¬ 1 è¡ | éåæ®µä¸è´ | åºï¼`enterprise_code=91420105MA4F5Q3R68`ã`unified_credit_code=91420105MA4F5Q3R68`ã`report_unit=æ¦æ±å¸å®å¹²çº¿å ¬è·¯å®¢è¿æéå ¬å¸éå°åå ¬å¸`ã`vehicle_total=26`ã`passenger_total=12835`ï¼ä¸ Excel å®å ¨ä¸è´ | éè¿ | | 4 | å ¥åºæ½æ¥-æ±æ»å | æºæä»¶æ±æ» vs åºæ±æ» | ä¸è´ | 客è¿è½¦è¾ 24584ãæ ¸å®è½½å®¢ä½ 711018ã客è¿é 16371625ãå¨è½¬é 1023386179ï¼åé¡¹å ¨ç | éè¿ | | 5 | å ¼å®¹-èæ ¼å¼å¯¼å ¥ | è `.xls` â `period=2099-09` | æå䏿°åæå¼ï¼èæä»¶ä¹å«è¿ä¸¤åï¼ | `æå 767 æ¡ï¼å¤±è´¥ 0 æ¡`ï¼`c1=767, c2=767` | éè¿ | | 6 | å ¼å®¹-èæ ¼å¼æ°å¼ä¸å | 2099-09 vs æ¢æ 2026-08ï¼åæºåå å®¹ï¼ | å®å ¨ä¸è´ | n=767 / v=22091 / p=16286506 / t=1158473501ï¼åé¡¹å ¨ç | éè¿ | | 7 | å ¼å®¹-èæ ¼å¼é¦è¡æ½æ¥ | Excel COM 读 `.xls` 第 2 è¡ vs åº | ä¸è´ | æºï¼`914201005519761659 / 914201005519761659 / æ¦æ±æ·å®é¡ºè¾¾æ±½è½¦æå¡æéå ¬å¸ / 24 / 54330`ï¼åºå | éè¿ | | 8 | è´å-ééæ°æ®ç±»å | `H203_1_2026-å ¬è·¯æ 客è¿è¾æåº¦ç产æ åµï¼2026ï¼.xlsx` â passengerMonthly | æç¡®æ¥éãä¸ååº | `å¯¼å ¥å¤±è´¥: æéæ°æ®ç±»åãå ¬è·¯æ 客è¿è¾æåº¦ç产æ åµã䏿件å 容ä¸ç¬¦ï¼è¡¨å¤´ç¼ºå°å¿ éåãä¼ä¸åç§°ãã客è¿é_æ»è®¡ã` | éè¿ | | 9 | è´å-åå³ç§»ä¸å½±åæ§å段 | æ°æ¨¡æ¿ï¼æ´ä½å³ç§» 2 åï¼ | ä¼ä¸ä»£ç /ä¼ä¸åç§°/车è¾/客è¿éçæ§åæ®µåå¼ä¸å | è§£ææè¡¨å¤´å `buildHeaderMap` åå¼ï¼814 æ¡ 0 å¤±è´¥ï¼æ±æ»å项䏿ºæä»¶ä¸è´ï¼è§ç¨ä¾ 4ï¼ | éè¿ | ## åãåç°çé®é¢ä¸å¤ç½® 1. **èæ ¼å¼æä»¶å ¶å®ä¹å¸¦è¿ä¸¤å**ï¼`ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç `ã`å¡«æ¥åä½`ï¼ï¼æ¤åä»£ç æªè¯»å â æ¬æä¸å¹¶å¼å§å ¥åºãè¿ä¹æå³ç 2026-01 ~ 2026-08 çåéæ°æ®è¿ä¸¤å为空ï¼**éè¦éå¯¼å¯¹åºæä»¶æè½åå¡«**ï¼å·²åå ¥å¾ åï¼çç¨æ·ç¡®è®¤ï¼ã 2. **è¡¨ç»æåæ´å¿ é¡»åæ¥ä¸å¤**ï¼æ¬æ¬¡é¦æ¬¡åªæ¹äºåºä¸å®ä½ï¼æ¼äº `docs/init.sql` / `docs/database.md`ï¼å·²è¡¥é½ã 3. **æ¿æ¢éç¹ä¸å¯ä¸å¯¼è´æ¹éææ¡£**ï¼`docs/database.md` ä¸ `| enterprise_name | varchar(200) | ä¼ä¸åç§° |` åºç° 4 次ï¼é¦æ¬¡æ¹éæ¿æ¢è¯¯æ¹äº H203-2 ç 3 å¼ è¡¨ï¼å·² `git checkout` åéå¹¶æ¹ä¸ºãå æªå h2031 ç« èåæ¿æ¢ãã ## äºãç»è®º - æ°æ¨¡æ¿ä¸èæ ¼å¼**ååå ¼å®¹**ï¼å¯¼å ¥ 0 å¤±è´¥ï¼æ½æ¥åé项对é½ï¼æ§å段æªååå³ç§»å½±åã - æ°æ®åºãå»ºè¡¨èæ¬ãæ°æ®åå ¸ãå®ä½ãå¯¼å ¥è§£æãå端åé ç½®**å å¤ä¸è´**ã - éçï¼åéæä»½ï¼2026-01 ~ 2026-08ï¼ç两åå¾ åå¡«ï¼çç¨æ·ç¡®è®¤åé导ã docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_¾ÖÓòÍøIP·ÃÎʵǼCORSÐÞ¸´_2026-09-16.md
New file @@ -0,0 +1,53 @@ # åè½æµè¯æ¥å_å±åç½IP访é®ç»å½CORSä¿®å¤_2026-09-16 > 模åï¼ç³»ç»å®å ¨ï¼è·¨åç½ååï¼+ ç»å½ãæµè¯äººï¼Codexãæ¥æï¼2026-09-16 ## ä¸ãåè½è¯´æ **é®é¢ç°è±¡**ï¼ç¨ `http://192.168.177.26:8080/` æå¼é¡µé¢ï¼ç»å½é¡µè½æ£å¸¸æ¾ç¤ºï¼ä½ç¹ãç»å½ãæç¤ºãç½ç»é误ï¼ç»å½å¤±è´¥ãï¼åä¸å¥æå¡ç¨ `http://localhost:8080/` ç»å½æ£å¸¸ã **æ ¹å **ï¼æµè§å¨å¯¹ POST/PUT/DELETE **å¿ å¸¦ `Origin` 头**ï¼GET ä¸å¸¦ï¼ã9-14 å®å ¨æ´æ¹æ CORS ä» `allowedOriginPattern("*") + allowCredentials(true)` æ¶ç´§ä¸ºåªåå ·ä½æ¥æºï¼`http://localhost:8080,http://127.0.0.1:8080`ï¼ãç» dev-server ä»£çæ¶ `Origin` åæ ·è½¬åç»å端ï¼äºæ¯ `Origin: http://192.168.177.26:8080` å½ä¸ä¸äºç½ååï¼`CorsFilter` ç´æ¥è¿å 403 `Invalid CORS request`ï¼å®æµæ¥æè§ç¨ä¾ C2ï¼ã è¿è§£éäº"页颿£å¸¸ãä¸ç»å½å°±ç½ç»é误"ï¼é¡µé¢ HTML/JS ä¸ `GET /api/auth/captcha-config` é½ä¸å¸¦ `Origin` å èä¸åå½±åï¼ç»å½é¡µè½æ¾ç¤º"æµè¯æ¨¡å¼"æç¤ºå³è¯æè¯¥ GET æåï¼ã **è¿å¸¦é£é©ï¼æ¬æ¬¡ä¸å¹¶è§£å³ï¼**ï¼æå é¨ç½²æ¯å端å åµã䏿¥å£åæºå¨ 8090ï¼æµè§å¨ POST åæ ·ä¼å¸¦ `Origin: http://<é¨ç½²æºIP>:8090`ï¼ç¨ IP è®¿é®æ¶ä¼åæ ·è¢« 403 æ¡ä½ç»å½ã **æ¹å¨**ï¼2 个æä»¶ï¼`CorsConfig.java` / `application.yml`ï¼ï¼ - `config.setAllowedOrigins(...)` â `config.setAllowedOriginPatterns(...)`ï¼é»è®¤æ¥æºæ¾å®½ä¸ºæ¬æº + å ç½ç½æ®µï¼`http://localhost:*`ã`http://127.0.0.1:*`ã`http://192.168.*:*`ã`http://10.*:*`ã`http://172.*:*`ã - ç½ååæºå¶ä¸åï¼ä»æ¯æ¾å¼æ¥æºæ ¡éªï¼ééé å ¨æ¾å¼ï¼ï¼`allowCredentials` ä»ä¸º `false`ï¼å¦æ¹ç¨åå访é®ï¼éæååï¼å«ç«¯å£ï¼è¿½å å° `app.cors.allowed-origins`ï¼å·²åå ¥ yml 注éï¼ã ## äºãæµè¯ç¯å¢ - å端ï¼8090ï¼æ¹åæ PID 精确éå¯ï¼`cmdâjava(maven)âjava(app)`ï¼ï¼`Started TrafficAuditApplication` / `Tomcat started on port(s): 8090 (http)`ã - å端ï¼8080ï¼dev-server æªéå¯ï¼é¡µé¢ä¸ä»£çæ²¿ç¨æ¬æ¬¡å¯å¨å®ä¾ã - æµè§å¨ï¼Codex åºç¨å æµè§å¨ï¼`http://192.168.177.26:8080/#/login`ï¼ç宿µè§å¨è·¯å¾ï¼é模æï¼ã - å½ä»¤è¡å¯¹ç §ï¼`curl.exe` ç´ååä¸ URLï¼ç¨äºåºå"æå¡ç«¯æç»"ä¸"æµè§å¨ä¾§å¤±è´¥"ã - è´¦å·ï¼`admin`ï¼æ¬æºåºå¯ç `123456`ï¼ã ## ä¸ãç¨ä¾ä¸ç»æ | ç¼å· | ç¨ä¾ | è¾å ¥ | 颿 | å®é | ç»è®º | | --- | --- | --- | --- | --- | --- | | C1 | å¤ç°ï¼ä¿®å¤åï¼æµè§å¨ï¼ | `192.168.177.26:8080/#/login` è¾å ¥ admin/123456 ç¹ç»å½ | å¤ç°"ç½ç»é误ï¼ç»å½å¤±è´¥" | é¡µé¢æç¤ºãç½ç»é误ï¼ç»å½å¤±è´¥ãï¼URL åå¨ `#/login` | å¤ç°æå | | C2 | å¤ç°ï¼ä¿®å¤åï¼å½ä»¤è¡ï¼ | POST `/api/auth/login`ï¼å¸¦ `Origin: http://192.168.177.26:8080` | è½å®ä½å°æå¡ç«¯æç» | `HTTP/1.1 403 Forbidden` + `Invalid CORS request` | å¤ç°æåï¼å®ä½æ ¹å ï¼ | | C3 | å¯¹ç §ï¼ä¿®å¤åï¼ | å C2 ä½ä¸å¸¦ `Origin` | æ£å¸¸ | 200 ä¸è¿å token | éè¿ï¼è¯æå·®å¼æ¥èª Originï¼ | | C4 | ä¿®å¤å LAN æ¥æº | POST `/api/auth/login`ï¼å¸¦ `Origin: http://192.168.177.26:8080` | 200 | 200 + tokenï¼`管çå`/5 模åï¼ | éè¿ï¼æ£åï¼ | | C5 | ä¿®å¤åæµè§å¨å®ç» | `http://192.168.177.26:8080/#/login` è¾å ¥ admin/123456 | ç»å½æåè¿å·¥ä½å° | æç¤ºãç»å½æåãï¼è·³è½¬ `#/dashboard`ï¼é¡¶é¨æ¾ç¤º admin | éè¿ï¼æ£åï¼ç«¯å°ç«¯ï¼ | | C6 | æ¬æºæ¥æºåå½ | `Origin: http://localhost:8080` | 200 | 200 | éè¿ï¼æ åå½ï¼ | | C7 | åæºé¨ç½²åºæ¯ | ç´è¿ 8090ï¼å¸¦ `Origin: http://192.168.177.26:8090` | 200 | 200 | éè¿ï¼æ£åï¼ | | C8 | å ç½ç½æ®µæ¥æº | 带 `Origin: http://10.1.2.3:8080` | 200 | 200 | éè¿ï¼æ£åï¼ | | C9 | 颿£è¯·æ± | `OPTIONS /api/auth/login` + `Origin: http://192.168.177.26:8080` | 200 ä¸åæ¾æ¾è¡æ¥æº | 200ï¼`Access-Control-Allow-Origin: http://192.168.177.26:8080`ï¼æ¹æ³ `GET,POST,PUT,DELETE,OPTIONS` | éè¿ | | C10 | æ Origin 头 | POST `/api/auth/login`ï¼curl ç´è¿ 8090ï¼ | ä¸åå½±å | 200 | éè¿ | | C11 | éæ³æ¥æº | `Origin: http://evil.example.com` | æç» | 403 `Invalid CORS request` | éè¿ï¼è´åï¼ç½ååä»çæï¼ | | C12 | 带令çä¸å¡æ¥å£ | LAN æ¥æº + `Bearer` 令ç GET `/api/user/list` | 200 | 200 | éè¿ | ## åãåç°çé®é¢ä¸å¤ç½® 1. **CORS ç½ååè¿çªå¯¼è´å±åç½ IP/åæº IP 访é®ç»å½å¤±è´¥**ï¼æ¬æ¬¡ä¸»é®é¢ï¼ï¼å·²æ¹ä¸ºææ¨¡å¼æ¾è¡æ¬æº + å ç½ç½æ®µï¼è§ä¸ï¼éæ³å¤é¨æ¥æºä» 403ã 2. å端 dev æ¥å¿æ¾ç¤º `Network: unavailable`ï¼vue-cli æªæ¢æµå°ç½å¡å°åï¼ï¼ä½ 8080 å®é çå¬ `0.0.0.0`ãå±åç½è®¿é®æ£å¸¸ï¼C5 宿µï¼ï¼å±æ¥å¿æç¤ºé®é¢ï¼ä¸å¤çã 3. ãç½ç»é误ï¼ç»å½å¤±è´¥ãè¿ä¸æç¤ºæ 403/500 çæååºçé误ä¹å½å°"ç½ç»é误"ï¼ææ¥æ¶å®¹æè¯¯å¯¼ï¼`Login.vue` æªæ¹å¨ï¼å为åç»å¯éä¼å项ã ## äºãç»è®º å±åç½ IPï¼`http://192.168.177.26:8080/`ï¼ç»å½å¤±è´¥é®é¢å·²ä¿®å¤ï¼å½ä»¤è¡èµ°æ¥ï¼C4/C6/C7/C8/C9/C10/C12ï¼ä¸ç宿µè§å¨ç«¯å°ç«¯ç»å½ï¼C5ï¼å ¨é¨éè¿ï¼ç½ååè´åç¨ä¾ï¼C11ï¼ä»ç¶æ¦æªï¼æªå¼å ¥é´æ/è·¨ååå½ã docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_»ã×Ü´ó±íÔ¤ÀÀɾ³ýÖпھ¶ºóÃ÷ϸ±í_2026-09-16.md
New file @@ -0,0 +1,47 @@ # åè½æµè¯æ¥åï¼æ¥è¡¨çæ-æ±æ»å¤§è¡¨é¢è§å¼¹çªå é¤ãä¸å£å¾ãä¹åçæç»è¡¨ 2026-09-16 ## åè½è¯´æ - ä½ç½®ï¼æ¥è¡¨çæé¡µ â æ¥è¡¨ç±»åãæ±æ»å¤§è¡¨ãâ éæä»½ â å表è¡ãé¢è§ãâ å¼¹çªãé¢è§æ°æ® - æ±æ»å¤§è¡¨ï¼YYYY-MMï¼ãã - ç°è±¡ï¼æ¹å¨åï¼ï¼å¼¹çªéåºç°**ä¸¤å¼ è¡¨**ââ第ä¸å¼ æ¯ãææ / æ°æ® / 忝ãä¸åçæ±æ»è¡¨ï¼å«é路货è¿ãåå¸å®¢è¿ãä¸å£å¾ä¸æ®µï¼ï¼ç¬¬äºå¼ æ¯ä¸å£å¾ä¹åé夿¸²æçä¸å¼ æç»è¡¨ï¼ä¿¡æ¯åä½ã - éæ±ï¼ææ±æ»å¤§è¡¨é¢è§é**ä¸å£å¾åé¢çè¡¨æ ¼å ¨é¨å æ**ï¼åªä¿çä¸é¢é£å¼ æ±æ»è¡¨ã - æ¹å¨åï¼å¼¹çªå åªå©ç¬¬ä¸å¼ 表ï¼`class="preview-summary wb-table"`ï¼ï¼è¡¨æ ¼ä¸æ¹æ¯ä¸¤æ¡åæ¯ç¼ºå¤±æç¤ºä¸ãå ³éãæé®ã ## æ¶åæ¹å¨ - å端 `traffic-audit-web/src/views/ReportExport.vue`ï¼**åè¡æ¹å¨**ï¼ç¬¬ 133 è¡ï¼ï¼ - åï¼`<table class="preview-summary" v-else-if="it.summary && it.summary.length">` - ç°ï¼`<table class="preview-summary" v-if="it.key !== 'summaryWorkbook' && it.summary && it.summary.length">` - åå 说æï¼`previewItems` é `summaryWorkbook` è¿ä¸é¡¹åæ¶å¸¦æ `summary` æ°æ®ï¼èä¸é¢çæ±æ»è¡¨ï¼ç¬¬ 115 è¡ `v-if="it.key === 'summaryWorkbook' && it.summary && it.summary.length"`ï¼å·²ç»æ¯ `v-if`ï¼åæ¥ç第äºç§è¡¨ç¨çæ¯ `v-else-if`ï¼ä¼è·å¨åä¸ä¸ª `v-if` ä¹åï¼äºæ¯å¯¹ `summaryWorkbook` ä¹ç §æ ·æ¸²æåºç¬¬äºå¼ è¡¨ãæ¹æå¸¦ `it.key !== 'summaryWorkbook'` æ¡ä»¶çç¬ç« `v-if` åï¼æ±æ»å¤§è¡¨ä¸å渲æç¬¬äºå¼ 表ï¼èå ¶å®æ¥è¡¨ç±»åï¼å¦æ `summary` çï¼è¡ä¸ºä¿æä¸åã - 第 115â132 è¡çæ±æ»è¡¨ï¼å«ãé¨åææ ç¼ºå°ä¸å¹´åæâ¦ãæç¤ºï¼**æªæ¹å¨**ã - æªæ¹åç«¯ãæªæ¹æ¥å£ãæªæ¹å¯¼åºã ## æµè¯ç¯å¢ - å端ï¼traffic-audit-web 8080 devï¼æ¹å¨å `Compiled successfully`ï¼ã - å端ï¼traffic-audit-server 8090ï¼æ¬æ¬¡ä¸æ¶åå端ï¼ã - æµè§å¨ï¼Codex åºç¨å æµè§å¨ï¼`admin` ç»å½ï¼å°å `http://localhost:8080/#/report`ã - è¢«æµæ°æ®ï¼æ¥è¡¨ç±»åãæ±æ»å¤§è¡¨ããæä»½ `2026å¹´8æ`ï¼æºæ°æ®å·²ç±æ¬æ¬¡å¤å¹´åº¦å¯¼å ¥ä¿è¯ï¼ã ## æµè¯æ¹æ³ï¼éè¦è¯´æï¼ - **ä¸ä¸è½®çæªå¾ä¸è½ä½ä¸ºè¯æ®**ï¼æ©ææªå¾ `_qa_out/preview_summaryWorkbook_2026-08_after_fix.png` æ¯å¨å¼¹çªå°æªæ¸²æ/忝ä¸å½æ¶æçï¼ç»é¢é没æå¼¹çªå 容ï¼å±äºæ æè¯æ®ï¼åæ¶ä¾èµå¯è®¿é®æ§æ ï¼AXï¼è¯»åä¹ä¸å¯é ï¼æ¬æº `getAXState()` è¿åç¼åï¼ä¼è¯»å°è¿æå 容ï¼ã - æ¬è½®æ¹ç¨**ç´æ¥è¯» DOM**ä½ä¸ºå¯ä¸å¤æ®ï¼`tab.playwright.evaluate(() => {...})` ç»è®¡å¼¹çªå `table` å ç´ çæ°éãç±»åä¸è¡æ°ã - å ³é®æä½åï¼å·²é¿å¼ï¼ï¼`el-select` 䏿项 `isVisible()` æä¸º falseï¼æ æ³ç¨ææ¬ç¹å»éæä»½ï¼æ¹ç¨é®ç `ArrowDown`/`Enter`ï¼è¡å ãé¢è§ãæé®å¿ é¡»ç¨ `locator('.el-table__row button').nth(1)`ï¼`has-text` ä¼å½ä¸ç¦ç¨çãæ¹éé¢è§ãï¼ï¼é¡µé¢ä¸å¸¸é©» 3 个 `.el-dialog__wrapper`ï¼éæ `getComputedStyle(w).display !== 'none'` æ¾å½åæå¼çé£ä¸ªï¼æ¹ `.vue` åå¿ é¡» `tab.reload()` æè½æ¿å°ææ°é¡µé¢ã - æææªå¾ï¼`_qa_out/preview_summaryWorkbook_2026-08_verified_20260916.png`ï¼54006 åèï¼ä¸ `_qa_out/preview_summaryWorkbook_2026-08_verified2_20260916.png`ï¼54006 åèï¼æ¬è½®å¤æ ¸æ¶éæï¼ã ## ç¨ä¾è¡¨ | # | ç¨ä¾ | è¾å ¥ | 颿 | å®é | ç»è®º | |---|---|---|---|---|---| | 1 | æ£å-å¼¹çªå¯æå¼ | æ±æ»å¤§è¡¨ / 2026å¹´8æ / ç¹è¡å ãé¢è§ã | å¼¹åºãé¢è§æ°æ® - æ±æ»å¤§è¡¨ï¼2026-08ï¼ã | å¼¹çªæ£å¸¸æå¼ï¼æ é¢ä¸é¢æä¸è´ | éè¿ | | 2 | æ£å-è¡¨æ ¼æ°é | DOM ç»è®¡å½åå¯è§å¼¹çªå `table` æ°é | åªå© 1 å¼ ï¼ä¸å£å¾ä¹åç表已å é¤ï¼ | `visible` å¼¹çªä» 1 个ï¼å ¶ä¸ `body.querySelectorAll('table').length === 1` | éè¿ | | 3 | æ£å-è¡¨æ ¼æ è¯ | 读å该表 class ä¸è¡æ° | ä¸ºæ±æ»è¡¨ï¼`preview-summary wb-table`ï¼ï¼12 è¡ææ | `cls="preview-summary wb-table"`ï¼`tbody tr` 计 12 è¡ | éè¿ | | 4 | æ£å-å 容宿´ | 读å 12 è¡ææ¬ | é路货è¿/åå¸å®¢è¿/ä¸å£å¾å 4 é¡¹ï¼æ°å¼ä¸åæ¯é½å ¨ | é路货è¿ï¼å½æè´§è¿é 16888.76ãå½æè´§ç©å¨è½¬é 2270010.6ï¼åæ¯ 4.8%ï¼ã累计货è¿é 130311.89ã累计货ç©å¨è½¬é 17492129.05ï¼åæ¯ 0%ï¼ï¼åå¸å®¢è¿ï¼29575.09 / 212391.4 / 254440.17 / 1806719.08ï¼ä¸å£å¾ï¼1628.65 / 115847.35 / 12691.45 / 900177.92 | éè¿ | | 5 | æ£å-è¡¨æ ¼ä¸æ¹å 容 | 读åè¡¨æ ¼ä¹åçèç¹ | åªå©æç¤ºä¸å ³éæé®ï¼æ 第äºå¼ 表 | 便¬¡ä¸ºã· 2025-08 åæåå¸å®¢è¿æ°æ®æªå¯¼å ¥åºï¼åå¸å®¢è¿åæ¯æä¸æ¾ç¤ºâ¦ãã· 2025-08 åæå ¬è·¯æ å®¢æ°æ®æªå¯¼å ¥åºï¼ä¸å£å¾åæ¯æä¸æ¾ç¤ºâ¦ãä¸ãå ³éãæé® | éè¿ | | 6 | åå½-å ¶å®æ¡ä»¶ä¸åå½ | æ£æ¥ç¬¬ 115â132 è¡æ±æ»è¡¨ä¸ `wbMissing` æç¤º | æªè¢«æ¹å¨ | 䏿¹å¨åä¸è´ï¼`git diff` ä» ç¬¬ 133 è¡ 1 è¡åæ´ï¼ | éè¿ | | 7 | åå½-å ¶å®æ¥è¡¨ç±»å | æ£æ¥ `v-if` æ¡ä»¶å¯¹é `summaryWorkbook` 项 | è¡ä¸ºä¸åï¼ä»æ `summary` 渲æï¼ | æ¡ä»¶ä¸º `it.key !== 'summaryWorkbook' && it.summary && it.summary.length`ï¼éæ±æ»å¤§è¡¨é¡¹è¡ä¸ºä¸å | éè¿ | ## åç°çé®é¢ä¸å¤ç½® 1. **ä¸ä¸è½®åè¯æ æï¼å·²ä¿®æ£ï¼**ï¼æ©ææªå¾æªæå°å¼¹çªãAX æ 为ç¼åï¼å·²å¨æ¬æ¥åä¸ä½åºï¼æ¬è½®ä»¥ DOM 宿µ + æææªå¾éæ°åè¯ã 2. **å¼¹çªå ãå ± 0 è¡ãä¸ä¸æ¹ãæåº¦è¦çï¼1~8æåææ°æ®ãå£å¾ä¸å**ï¼`rowCount` è¡¨ç¤ºçæ¯æç»è¡æ°ï¼æ±æ»å¤§è¡¨ä¸å«æç»è¡ï¼æ 为 0ï¼ï¼è¿æ¯æ¢æå±ç¤ºå£å¾ï¼éæ¬æ¬¡æ¹å¨å¼å ¥ï¼æ¬æ¬¡æªæ¹ï¼å¦ç¨æ·è§å¾æè¯¯è§£ï¼å¯å¦è¡è°æ´ææ¡ã 3. 两æ¡åæ¯ç¼ºå¤±æç¤ºï¼2025-08 åå¸å®¢è¿ / å ¬è·¯æ 客忿°æ®æªå ¥åºï¼ä¸ºæ°æ®ä¾§ç°ç¶ï¼éæ¬æ¬¡æ¹å¨å¼èµ·ï¼å¾ 2025 å¹´å®ç¨¿æ°æ®å¯¼å ¥åèªå¨æ¶å¤±ã ## ç»è®º - éè¿ãæ±æ»å¤§è¡¨é¢è§å¼¹çªä¸ãä¸å£å¾ãä¹åçé£å¼ 表已彻åºç§»é¤ï¼DOM 宿µå¼¹çªå æä¸ä» æ 1 å¼ è¡¨ï¼`preview-summary wb-table`ï¼12 è¡æ±æ»ææ ï¼ï¼è¡¨æ ¼å 容䏿¹å¨åä¸è´ãæ ä¿¡æ¯ä¸¢å¤±ï¼å ¶å®æ¥è¡¨ç±»åçé¢è§è¡ä¸ºä¸åå½±åã - å¾ ç¨æ·å¨èªå·±çæµè§å¨ä¸æå¼ãæ¥è¡¨çæ â æ±æ»å¤§è¡¨ â 2026å¹´8æ â é¢è§ãå䏿¬¡ç®è§éªæ¶ã docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_µÇ¼ÑéÖ¤ÂëÈÝ´íÓ뱨±íÔ¤ÀÀÕû¸Ä_2026-09-16.md
New file @@ -0,0 +1,62 @@ # åè½æµè¯æ¥åï¼ç»å½éªè¯ç 容é + æ¥è¡¨é¢è§æ´æ¹ï¼ææ éä½ / å¼¹çªæå¨åè§ / 失败æç¤ºï¼ - æ¥æï¼2026-09-16 - 模åï¼ç»å½é¡µãæ¥è¡¨çæ-æ±æ»å¤§è¡¨é¢è§ - ç»è®ºï¼**éè¿**ï¼4 个é®é¢å ¨é¨ä¿®å¤ï¼æµè§å¨å®æµåè¯ï¼ ## ä¸ãåè½è¯´æ ç¨æ·åé¦ 3 个é®é¢ï¼ | # | ç¨æ·æè¿° | æ ¹å | ä¿®å¤ | |---|----------|------|------| | 1 | æ¢ WiFi åç»å½é¡µåºç°éªè¯ç ç½è²æ¹æ¡ãæç¤ºãéªè¯ç å 载失败ï¼è¯·æ£æ¥ç½ç»ã | å端 `app.captcha.required=false` å·²ç¦ç¨éªè¯ç ï¼ä½å端 `Login.vue` ç `captchaRequired` é»è®¤å¼æ¯ `true`ï¼ä¸ `/api/auth/captcha-config` 请æ±å¤±è´¥æ¶ `.catch(() => {})` **éé»å¿½ç¥**ï¼é¡µé¢æ®çä¸ä¸ªå è½½ä¸åºæ¥çéªè¯ç æ¡ | é»è®¤å¼æ¹ `false`ï¼æ¹ä¸º fail-safeï¼ä» å½å端æç¡®è¿å `code===200 && data.required===true` ææ¾ç¤ºéªè¯ç ï¼è¯·æ±å¼å¸¸ä¸å¾æãä¸éè¦éªè¯ç ãå¤ç | | 2 | æ¥è¡¨çæ-æ±æ»å¤§è¡¨é¢è§ï¼ç¹å»åå¼¹ã导åºå¤±è´¥ï¼è¯·ç¡®è®¤å¯¼å ¥æ°æ®ï¼ææ¥çå端æ¥å¿ã | å端 `failWith(err, action)` æ**ææ**å¼å¸¸ï¼å«ç½ç»/代çå±å¤±è´¥ï¼é½æ¸²ææåä¸å¥ç¬¼ç»ææ¡ï¼é»è®¤ action è¿æ¯ã导åºãï¼è¯¯å¯¼è¯»ææ°æ®é®é¢ | éå `failWith` + æ°å¢ `errReason(raw)`ï¼åºåãè¿ä¸ä¸æå¡å¨ãä¸ãå端çå®åå ãï¼é¢è§è°ç¨ä¼ `action='é¢è§'`ï¼Blob é误ååºå `text()` åè§£æ | | 3 | é¢è§å¼¹çªææ éä½ï¼ææ åå¨ãå½æè´§è¿éãä¸ï¼ï¼å¼¹çªä¸å¯æå¨ãæ åè§ | è¡¨å¤´æ¯ 3 åï¼ææ /æ°æ®/忝ï¼ï¼ä¸ 4 åæ°æ®è¡ï¼åç±»/ææ /æ°æ®/忝ï¼ä¸å¹é ï¼Element UI 2.15.14 **没æ** `draggable` 屿§ï¼é£æ¯ Element Plusï¼ | 表头补为 4 å `åç±»/ææ /æ°æ®/忝`ï¼æ°å¢ `v-dialog-drag` æä»¤å®ç°æå¨ï¼åªæ¹ `.el-dialog` ç `transform`ï¼å ³éæ¶å¤ä½ï¼ï¼å `border-radius:10px` | æ¹å¨æä»¶ï¼`traffic-audit-web/src/views/Login.vue`ã`traffic-audit-web/src/views/ReportExport.vue`ãæ°å¢ `traffic-audit-web/src/directives/dialogDrag.js`ã`traffic-audit-web/src/main.js`ï¼æ³¨åæä»¤ï¼ã ## äºãæµè¯ç¯å¢ - å端ï¼`http://localhost:8080`ï¼vue-cli-service serveï¼dev æå»ºï¼ - å端ï¼8090ï¼`Started TrafficAuditApplication`ï¼éå¯åæ°ç¼è¯ï¼ - æµè§å¨ï¼Codex å 嵿µè§å¨ï¼è§å£çº¦ 319Ã790ï¼ï¼åè¯æ¹å¼ `tab.playwright.evaluate()` ç´è¯» DOM + æªå¾ ## ä¸ãç¨ä¾è¡¨ | # | åºæ¯ | è¾å ¥/æä½ | 颿 | å®é | ç»è®º | |---|------|-----------|------|------|------| | 1 | éªè¯ç -åç«¯å·²å ³é | æ°å¼æ ç¾è®¿é® `#/login`ï¼å端ä¸å¯ç¨æ¶åæ ·éªè¯ï¼ | ä¸åºç°éªè¯ç æ¹æ¡ï¼ä¸åºç°ãéªè¯ç å 载失败ã | 页颿 `.captcha-box`ï¼æç¤ºãæµè¯æ¨¡å¼ï¼è¡ä¸ºéªè¯ç 已跳è¿ã | éè¿ | | 2 | éªè¯ç -æ¥å£æ£å¸¸ | `GET /api/auth/captcha-config` | `required=false` | `{"code":200,"message":"success","data":{"required":false}}` | éè¿ | | 3 | é¢è§-è¡¨å¤´åæ° | æå¼é¢è§å¼¹çªè¯» `thead th` | 4 åä¸é¡ºåºä¸º åç±»/ææ /æ°æ®/忝 | `['åç±»','ææ ','æ°æ®','忝']` | éè¿ | | 4 | é¢è§-ææ å¯¹é½ | 读é¦è¡ååå æ ¼ x åæ | å类对é½ãé路货è¿ããææ 对é½ãå½æè´§è¿é(ä¸å¨)ããæ°æ®å¯¹é½ 16888.76ã忝卿°æ®å³ä¾§ | åç±» x=35ãææ x=118ãæ°æ® x=394ã忝 x=587ï¼`16888.76` å¨ x=394ï¼ | éè¿ | | 5 | é¢è§-å¼¹çªåè§ | 读 `.el-dialog` è®¡ç®æ ·å¼ | æåè§ | `borderRadius=10px`ã`overflow=hidden` | éè¿ | | 6 | é¢è§-å¼¹çªæå¨ | `tab.drag([150,60],[270,220])` ææ é¢æ | å¼¹çªè·éç§»å¨ | ç± `(0,40)` â `(120,200)`ï¼`transform=matrix(1,0,0,1,120,160)`ï¼ä½ç§»éçäºææ½å¢é | éè¿ | | 7 | é¢è§-å ³éå¤ä½ | å ³éå¼¹çªå读 transform | å¤ä½ä¸º none | `transform=none`ã`visible=false` | éè¿ | | 8 | é¢è§-ä¸å£å¾ä¹åæ è¡¨æ ¼ | 读弹çªå `table` æ°éä¸å 容 | æä¸ä» æ 1 å¼ ææ è¡¨ | å¼¹çªå 1 å¼ è¡¨ï¼12 è¡ææ ï¼å«ä¸å£å¾ 4 è¡ï¼ï¼è¡¨ä¸ä» 两æ¡åæ¯ç¼ºå¤±æç¤ºä¸ãå ³éãæé® | éè¿ | | 9 | 失败æç¤º-ç½ç»å¼å¸¸ | åç«¯åææ¶ç¹é¢è§ | æç¡®æç¤ºç½ç»/æå¡æªå¯å¨ï¼èéã导åºå¤±è´¥ï¼è¯·ç¡®è®¤å¯¼å ¥æ°æ®ã | `é¢è§å¤±è´¥ï¼æ æ³è¿æ¥æå¡å¨ï¼è¯·æ£æ¥ç½ç»è¿æ¥ï¼æç¡®è®¤å端æå¡æ¯å¦å·²å¯å¨` | éè¿ | | 10 | 导åº-æ£å¸¸è·¯å¾ | ç¹ã导åºã | ä¸è½½æåæç¤º | `æ¥è¡¨å¯¼åºæå` | éè¿ | ## åãåç°çé®é¢ä¸å¤ç½® 1. **ã导åºå¤±è´¥ï¼è¯·ç¡®è®¤å¯¼å ¥æ°æ®ï¼ææ¥çå端æ¥å¿ã䏿¯æ°æ®é®é¢**ï¼ç¨ API éæç´è¿ `/api/report/preview` ä¸ `/api/report/export/summaryWorkbook` å ¨é¨è¿å 200ï¼2026-08 å¯¼åº 950747 åèï¼ãè¯¥ææ¡åªå¨**ç½ç»/代çå±å¤±è´¥**æ¶åºç°ï¼æ¢ WiFi åè¯·æ±æä¸å°å端ï¼ï¼å±äºæç¤ºè¯¯å¯¼ãç°å·²æ¹ä¸ºåºåå ·ä½åå ã 2. **Element UI 2.15.14 䏿¯æ `draggable`**ï¼å¼¹çªæå¨åªè½èªå·±å®ç°ï¼å·²ç¨ `v-dialog-drag` æä»¤ï¼`<style>` å¿ é¡»**é scoped**ï¼el-dialog é»è®¤ append-to-bodyï¼ã 3. **æµè§å¨èªå¨ååè¯çå**ï¼`tab.click(index)` çç´¢å¼å¨é¡µé¢å·æ°åä¼å¤±æï¼æ¾è¯¯ç¹å°ãæèµæ¥è¡¨ãTabï¼Playwright locator ç¹ Element UI è¡¨æ ¼å æé®ä¼è¶ æ¶ï¼`tab.drag` åæ å¿ é¡»å¨è§å£å ã以ä¸åå·²è®°å ¥ãé®é¢ä¸æ³¨æäºé¡¹æ±æ»ãã 4. é¢è§å¼¹çªæ é¢å¨æªæå¼æ¶æ¾ç¤ºä¸ºãé¢è§æ°æ® - ï¼ï¼ãï¼å±æªèµå¼ç¶æï¼ä¸å½±å使ç¨ã ## äºãç»è®º - 4 个é®é¢å ¨é¨ä¿®å¤å¹¶ææµè§å¨å®æµè¯æ®ï¼è¡¨å¤´ 4 åä¸ x åæ å¯¹é½ãåè§ 10pxãæå¨ä½ç§» 120/160ãå ³éå¤ä½ãæ 第äºå¼ 表ã失败æç¤ºå·²ç»åï¼ã - ãä¸å£å¾ä¹åä¸å渲æè¡¨æ ¼ãçä¸é¡¹éªè¯è§ãåè½æµè¯æ¥å_æ±æ»å¤§è¡¨é¢è§å é¤ä¸å£å¾åæç»è¡¨_2026-09-16.mdãã - éçï¼é¢è§å¼¹çªå ãå ± 0 è¡ãä¸ãæåº¦è¦çï¼1~8æåææ°æ®ã两个å£å¾ææ¡ä¸åï¼æè¯¯è§£ï¼çç¨æ·ç¡®è®¤åè°æ´ã ## å ãç¨æ·ç¡®è®¤åç追å ä¿®æ¹ï¼2026-09-16 åæï¼ ç¨æ·ç¡®è®¤ãé¢è§å¼¹çªçè¡æ°ææ¡å¯ä»¥æ¹ãï¼å·²å®æ½ï¼ - **æ¹å¨**ï¼`ReportExport.vue` ä¸ `å ± {{ it.rowCount || 0 }} è¡` æ¹ä¸ºææ¥è¡¨ç±»ååºåââ - æ±æ»å¤§è¡¨ï¼`summaryWorkbook`ï¼ææ åï¼ï¼æ¾ç¤º `ææ {{ (it.summary || []).length }} 项`ï¼ - å ¶å®æç»æ¥è¡¨ï¼æ¾ç¤º `å ± {{ it.rowCount || 0 }} è¡æç»`ã - **åå **ï¼æ±æ»å¤§è¡¨æ²¡ææç»è¡ï¼`rowCount` æä¸º 0ï¼ä¸ä¸æ¹ãæåº¦è¦çï¼1~8æåææ°æ®ãèªç¸çç¾ï¼å®¹æè¯¯å¤ä¸ºæ²¡æ°æ®ã - **éªè¯**ï¼æµè§å¨å®æµï¼2026-08 æ±æ»å¤§è¡¨ï¼ï¼å¼¹çªå¤´é¨ç±ãå ± 0 è¡ãå为 **ãéè·¯è¿è¾éæ±æ»è¡¨ï¼æ´æ¬ï¼ ææ 20 项ã**ï¼ä¸æ¹ä»ä¸ºãæåº¦è¦çï¼1~8æåææ°æ®ãï¼è¡¨å¤´ä»ä¸º `åç±»/ææ /æ°æ®/忝`ï¼å¼¹çªå ä»åªæ 1 å¼ è¡¨ï¼12 è¡ï¼ãæªå¾ï¼`_shot_preview_after_wording_20260916.png`ã - **ç»è®º**ï¼éè¿ã docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_»õÔËÁ¿ÖÜתÁ¿2023ÄêÊý¾Ý²¹Â¼_2026-09-16.md
New file @@ -0,0 +1,49 @@ # åè½æµè¯æ¥åï¼è´§è¿é/å¨è½¬é 2023 å¹´æ°æ®è¡¥å½å ¥åº - æ¥æï¼2026-09-16 - 模åï¼æ°æ®å¯¼å ¥ / è´§è¿éå¨è½¬é - ç»è®ºï¼**éè¿**ï¼æ£å 1 æ¡ãå ¥åºæ½æ¥ 216 é¡¹å ¨å¯¹é½ãä¸å¹´åæ 1 æ¡ãå¹ç/åå½ 2 æ¡ï¼ ## ä¸ãåè½è¯´æ ç¨æ·åé¦ã2023 å¹´æ 12 æçæ°æ®ãï¼èä¸è½®å ¥åºä½¿ç¨ç 8 ææºæä»¶**缺 2023 å¹´ Sheet**ï¼åªæ `2026å¹´/2025å¹´/2024å¹´/2022å¹´/2021å¹´`ï¼ï¼å æ¤åºé没æ `2023-12`ã ææ¥åå¨ 7 ææºæä»¶ä¸æ¾å° 2023 å¹´æ°æ®ï¼å°å ¶è¡¥å½å ¥åºï¼ | 项 | å 容 | |----|------| | æ°æ®æ¥æº | `D:\05_æ°æ®åç±»\è´§è¿\7æ\å®ç¨¿-æ¹åçåå¸å·è¿è¾éæ°æ®ï¼2026å¹´1-7æï¼.xlsx` ç `2023` Sheet | | è¡¥å½æ¹å¼ | å¦å临æ¶å·¥ä½ç°¿ `_2023_import_tmp.xlsx`ï¼ä» ä¿ç `2023` + `2022å¹´` 两个 Sheetï¼æ»¡è¶³å¤å¹´åº¦å·¥ä½ç°¿ãè³å° 2 个 Sheetãè§åï¼ï¼èµ° `POST /api/import/freightTurnover?period=2023-12` | | ç»æ | `è´§è¿éå¨è½¬éå¯¼å ¥æå, å ± 36 æ¡è®°å½`ï¼18 å°å¸ à 2 个æ¥è¡¨æï¼2022-12 éå + 2023-12 æ°å¢ï¼ | **为ä»ä¹å¸¦ä¸ 2022 å¹´ Sheet**ï¼`2023` çä¸å¹´åæåèªãä¸ä¸å¹´åº¦ Sheetãï¼åªæ¾ 2023 ä¼å¯¼è´ 2023 ç `last_*` 为空ï¼åæ¶é¿å æ´æ¬å¯¼å ¥ 7 ææä»¶èå¤åºæ ç¨ç `2026-07` æ¥è¡¨æã ## äºãæµè¯ç¯å¢ - å端ï¼éå¯åæ°ç¼è¯ï¼`Tomcat started on port(s): 8090`ï¼PID 31384 - æ°æ®åºï¼`traffic_audit.freight_turnover_import` - æºæä»¶ï¼7 ææä»¶ `2023` Sheetï¼A1:N48ï¼`è´§è¿é(ä¸å¨)` å + `å¨è½¬é(ä¸å¨å ¬é)` åï¼1â12 æ + 累计åï¼ ## ä¸ãç¨ä¾è¡¨ | # | åºæ¯ | è¾å ¥ | 颿 | å®é | ç»è®º | |---|------|------|------|------|------| | 1 | æ£å-2023 å ¥åº | `_2023_import_tmp.xlsx` â freightTurnover | çæ `2023-12`ï¼18 è¡ | `å ± 36 æ¡è®°å½`ï¼`SELECT report_period,COUNT(*)` åºç° `2023-12 = 18` | éè¿ | | 2 | å ¥åºæ½æ¥-éæ ¼æ¯å¯¹ | 2023 Sheet è´§è¿éå + å¨è½¬éåï¼18 å°å¸ à 12 æ à 2 ææ = 432 é¡¹ï¼ | ä¸åºä¸ `freight_m01..m12` / `turnover_m01..m12` å®å ¨ä¸è´ | **mismatches = 0**ï¼18 个å°åºå ¨é¨å¹é ï¼ | éè¿ | | 3 | ä¸å¹´åæ | æ¥ 2023-12 ç `last_freight_*` / `last_turnover_*` | çäº 2022 å¹´åæå¼ | æ¦æ± `last_freight_m01=3527.89407360113`ã`last_freight_m12=4334.42636773157`ã`last_turnover_m12=608823.495390257`ï¼ä¸ `2022-12` è¡éå¼ç¸å | éè¿ | | 4 | æ¥è¡¨ææ¸ ååå½ | æ¥å ¨é¨æ¥è¡¨æ | æ éå¤ãæ 2099 æ®ç | 2021-12 / 2022-12 / **2023-12** / 2024-12 / 2025-12 / 2026-01â¦2026-08ï¼æ¯æ 18 è¡ | éè¿ | | 5 | å岿æªè¢«æ±¡æ | 2022-12 éååä¸å弿¯è¾ | å®å ¨ä¸è´ | 䏿¹å¨å 2022-12 éå¼ç¸å | éè¿ | ## åãåç°çé®é¢ä¸å¤ç½® | # | é®é¢ | å¤ç½® | |---|------|------| | 1 | 8 ææºæä»¶æ 2023 å¹´ Sheetï¼å¯¼è´åºéé¿æç¼º `2023-12`ãä¸ `2024-12` æ ä¸å¹´åæ | ä» 7 ææºæä»¶è¡¥å½ `2023-12`ï¼`2024-12` çä¸å¹´åææ¬æ¬¡**æªéç®**ï¼éé导 2024 æä¼çæï¼ï¼å¦éå¯å¦è¡è¡¥å¯¼ | | 2 | 7 ææä»¶ä¸ 8 ææä»¶ç 2021/2022/2024 ä¸å¹´æ°æ®æ¯å¦ä¸è´æ æ³ç¡®å® | éæ ¼æ¯å¯¹ï¼`onlyJuly/onlyAug/differ` å ¨é¨ä¸ºç©ºï¼**ä¸å¹´ 0 å¤å·®å¼**ï¼å æ¤è¡¥å¯¼ 2022 ä¸ä¼å¼å ¥åå·® | | 3 | è¥æ´æ¬å¯¼å ¥ 7 ææä»¶ä¼å¤åº `2026-07` æ¥è¡¨æ | æ¹ä¸ºåªä¿ç `2023 + 2022å¹´` 两个 Sheet ç临æ¶å·¥ä½ç°¿ï¼é¿å äº§çæ ç¨ææ¬¡ | | 4 | å Sheet æä»¶ä¸ä¼è¢«è¯å«ä¸ºå¤å¹´åº¦å·¥ä½ç°¿ | 已卿¬æ¥åä¸ãé®é¢ä¸æ³¨æäºé¡¹æ±æ»ãä¸è®°å½è¯¥è§åï¼ä¾åç»è¡¥æ°åè | ## äºãç»è®º - 2023 å¹´è´§è¿é/å¨è½¬é已宿´å ¥åºï¼18 å°å¸ à 12 æï¼ï¼**432 é¡¹éæ ¼æ¯å¯¹é¶å·®å¼**ï¼ä¸å¹´åææ£ç¡®åèª 2022 å¹´ã - æ¥è¡¨ææ¸ åè¿è´¯ï¼2021-12 â 2026-08 å ± 13 æï¼æ¯æ 18 è¡ã - éçï¼`2024-12` çä¸å¹´åæï¼2023 å¹´å¼ï¼æªåå¡«ï¼å¦éè¦å¯é导 2024 å¹´æ°æ®ã docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_»õÔËÁ¿ÖÜתÁ¿¶àÄê¶Èµ¼Èë_2026-09-16.md
New file @@ -0,0 +1,50 @@ # åè½æµè¯æ¥åï¼è´§è¿éå¨è½¬é表å¤å¹´åº¦å·¥ä½ç°¿ï¼2021â2026ï¼ä¸æ¬¡æ§å ¥åº 2026-09-16 ## åè½è¯´æ - éæ±ï¼8 æå¯¼å ¥çãå®ç¨¿-æ¹åçåå¸å·è¿è¾éæ°æ®ï¼2026å¹´1-8æï¼.xlsxãä¸ä¸ªå·¥ä½ç°¿å å« 21â26 å¹´ï¼æºæä»¶ç¼º 2023 å¹´ï¼å ¨é¨å¹´åº¦æ°æ®ï¼è¦æ±æè¿äºæ°æ®å ¨é¨è¯»å ¥æ°æ®åºã - æ§è¡ä¸ºï¼`importFreightTurnover` åªè¯»ç¬¬ 1 个 Sheetï¼å¹¶æã模æ¿_è´§è¿éå¨è½¬é.xlsxãçå·¦å³ä¸¤åï¼å·¦åä»å¹´ 1âN æãå³åå»å¹´ 1â12 æï¼è§£æï¼å¯¼è´å ¶ä½å¹´åº¦ Sheet çæ°æ®è¢«ç´æ¥ä¸¢å¼ã - æ°è¡ä¸ºï¼å¯¼å ¥æ¶å 夿æ¯å¦ä¸ºãå¤å¹´åº¦å·¥ä½ç°¿ãï¼Sheet æ° â¥ 2ãæ¯ä¸ª Sheet åå½¢å¦ `2021å¹´`ãä¸é¦è¡ A åå«ãè´§è¿éããB åå«ãæãï¼ã - å½ä¸ï¼é Sheet è§£ææ´å¹´ 1â12 æçè´§è¿éåä¸å¨è½¬éåï¼**æ¯ä¸ªå¹´åº¦è½ä¸ä¸ªæ¥è¡¨æ**ï¼æ¥è¡¨æ = 该年æåä¸ä¸ªæè´§è¿éæ°æ®çæä»½ï¼æ¬æ¬¡ä¸º `YYYY-12`ï¼ï¼ä¸å¹´åæåä¸ä¸å¹´åº¦ Sheetã - æªå½ä¸ï¼å®å ¨åéåææåº¦è§£æè·¯å¾ï¼è¡ä¸ºä¸æ¹å¨åä¸è´ã - å¹çï¼ä»ææ¥è¡¨æãå å åæãï¼æ¯ä¸ªå¹´åº¦åå䏿¡ `import_batch` è®°å½ã ## æ¶åæ¹å¨ - å端 `traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java`ï¼+153 / â19ï¼ï¼ - `importFreightTurnover` æ¹ä¸ºåæµå ¥å£ï¼åé»è¾æ´ä½æ½ä¸º `importFreightTurnoverByMonth`ï¼é»è¾ä¸æ¹å¨åéè¡ä¸è´ï¼ã - æ°å¢ `detectYearSheets`ï¼å¤å¹´åº¦è¯å«ï¼ã`importFreightTurnoverByYear`ï¼æå¹´è§£æ + ä¸å¹´åæï¼ã`parseWholeYearSheet`ï¼æ´å¹´ Sheet è§£æï¼ã`persistFreightTurnover`ï¼ææ¥è¡¨æå å åæ + è®°æ¹æ¬¡ï¼ã - 顶鍿°å¢ `import java.util.TreeMap;`ã - æªæ¹æ°æ®åºç»æãæªæ¹åç«¯ãæªæ¹å¯¼å ¥æ¥å£ç¾åï¼ä»ä¸º `POST /api/import/freightTurnover?period=yyyy-MM`ï¼ã ## æµè¯ç¯å¢ - å端ï¼traffic-audit-server 8090ï¼å«æ¬æ¬¡æ¹å¨ï¼`start-dev.ps1` å¯å¨æåï¼backend.log åºç° `Tomcat started on port(s): 8090` / `Started TrafficAuditApplication`ï¼ã - å端ï¼traffic-audit-web 8080ï¼æ¬æ¬¡ä¸æ¶åå端ï¼ã - æ°æ®åºï¼æ¬æº MySQL `127.0.0.1:3308/traffic_audit`ï¼ç¨ mysql CLI ç´æ¥æ ¸å¯¹ã - æºæä»¶ï¼`D:\05_æ°æ®åç±»\é«é\å®ç¨¿-æ¹åçåå¸å·è¿è¾éæ°æ®ï¼2026å¹´1-8æï¼.xlsx`ï¼Sheet 为 `['2026å¹´','2025å¹´','2024å¹´','2022å¹´','2021å¹´']`ï¼2026/2025 å 38 è¡Ã15 åï¼2024 48 è¡Ã13 åï¼2022 40 è¡Ã15 åï¼2021 41 è¡Ã14 åï¼ã - è´å/è¾¹çç¨ä¾ä¸å¾å¨ä¸æ¬¡æ§æµè¯æ `2099-01` ~ `2099-04` å è¿è¡ï¼å ¨ç¨ä¸è§¦ç¢°çå®æä»½ï¼æµè¯åå·²éä¸ªæ¸ ç©ºã ## ç¨ä¾è¡¨ | # | ç¨ä¾ | è¾å ¥ | 颿 | å®é | ç»è®º | |---|---|---|---|---|---| | 1 | æ£å-å¤å¹´åº¦å¯¼å ¥ | ä¸ä¼ æºæä»¶ï¼`period=2026-08` | 21/22/24/25/26 äºä¸ªå¹´åº¦å ¨é¨å ¥åº | è¿åãå ± 90 æ¡è®°å½ãï¼5 个æ¥è¡¨æ à 18 è¡ï¼ï¼åºå æ°å¢/è¦ç `2021-12`ã`2022-12`ã`2024-12`ã`2025-12`ã`2026-08` | éè¿ | | 2 | æ£å-å ¥åºæ½æ¥ï¼é项对é½ï¼ | æºæä»¶éå¹´éå¸å·éæä¸åºå é项æ¯å¯¹ï¼ä»å¹´è´§è¿é/ä»å¹´å¨è½¬é/ä¸å¹´è´§è¿é/ä¸å¹´å¨è½¬éï¼ | å®å ¨ä¸è´ | æ¯å¯¹ **1080 个åå æ ¼ï¼å·®å¼ 0**ï¼èæ¬ `_verify_ft_multi.py`ï¼ | éè¿ | | 3 | æ£å-æ¥è¡¨æè¯ä¹ | æ¥çåæ `report_period` | æ¯å¹´åº¦ä¸ä¸ªæ¥è¡¨æ | `2021-12 / 2022-12 / 2024-12 / 2025-12 / 2026-08`ï¼æºæä»¶æ 2023 å¹´ï¼æ æªçæ `2023-12` | éè¿ | | 4 | æ£å-ä¸å¹´åæ | åæ `last_*` æ¯å¦åä¸ä¸å¹´åº¦ Sheet | æä¸ä¸å¹´åº¦çæå¼ãæ ç为空 | `2022-12`ã`2025-12`ã`2026-08` å 18 è¡ `last_*` å ¨é¨æå¼ï¼`2021-12`ï¼æ ä¸å¹´ï¼ã`2024-12`ï¼ç¼º 2023ï¼ä¸ºç©º | éè¿ | | 5 | æ£å-å¯¼å ¥æ¹æ¬¡ | æ¥è¯¢ `import_batch` | æ¯ä¸ªæ¥è¡¨æä¸æ¡è®°å½ | 馿¬¡å¯¼å ¥åå ¥ id 324â328ï¼2021-12/2022-12/2024-12/2025-12/2026-08ï¼ï¼5 æ¡å total=success=18ãfail=0ï¼file_name ä¸ºæºæä»¶å | éè¿ | | 6 | è´å-å Sheet æåº¦æ¨¡æ¿åé | å Sheet æåº¦æ¨¡æ¿æä»¶ + `period=2099-01` | è¯å«ä¸å½ä¸ï¼åéæåº¦è·¯å¾ | è¿åãå ± 18 æ¡è®°å½ãï¼ä¸æ¹å¨åä¸è´ | éè¿ | | 7 | è´å-é年度å½åå¤ Sheet åé | 两个é年度å½å Sheetï¼Sheet1/Sheet2ï¼+ `period=2099-02` | è¯å«ä¸å½ä¸ï¼åéæåº¦è·¯å¾ | `code=200`ï¼18 æ¡ | éè¿ | | 8 | è´å-æ··åå½ååé | 年度å + éå¹´åº¦åæ··åï¼2021å¹´/2022å¹´/夿³¨è¯´æï¼+ `period=2099-03` | è¯å«ä¸å½ä¸ï¼åéæåº¦è·¯å¾ | `code=200`ï¼18 æ¡ | éè¿ | | 9 | è´å-é Excel æä»¶ | ææ¬æä»¶å½ xlsx ä¸ä¼ + `period=2099-04` | æ¥éä¸ä¸è½åº | `{"code":500,"message":"å¯¼å ¥å¤±è´¥: Can't open workbook - unsupported file type: UNKNOWN"}` | éè¿ | | 10 | å¹ç-éå¤å¯¼å ¥ | å䏿ºæä»¶å坼䏿¬¡ | ä¸äº§çéå¤è¡ãå¼ä¸å | ä»è¿åãå ± 90 æ¡è®°å½ãï¼å¯¼å ¥ååå id 332â336ï¼**å ¨è¡¨ 216 è¡åå md5 ä¸è´**ï¼`a2a733b2c5321a9d5efa9be2e0c5dacb`ï¼ | éè¿ | | 11 | åå½-æµè¯ææ¸ ç | é个 `POST /api/import/clear?period=2099-0x` | æµè¯ææ°æ®ä¸æ¹æ¬¡å ¨é¨å é¤ | åæ dataRows=18ãbatchRows=1 å 餿åï¼å½ååº **0 æ¡ 2099 æ°æ®ã0 æ¡ 2099 æ¹æ¬¡** | éè¿ | | 12 | åå½-ç宿份æ»é | ç»è®¡ `freight_turnover_import` | ä¸å¯¼å ¥åå£å¾ä¸è´ | 12 个æ¥è¡¨æ à 18 è¡ = **216 è¡**ï¼2021-12 / 2022-12 / 2024-12 / 2025-12 / 2026-01â¦2026-08ï¼ | éè¿ | ## åç°çé®é¢ä¸å¤ç½® 1. **æºæä»¶ç¼º 2023 å¹´ Sheet**ï¼å¯¼è´ä¸çæ `2023-12` æ¥è¡¨æï¼`2024-12` æ ä¸å¹´åæï¼`last_*` 为空ï¼ã屿ºæ°æ®ç¼ºå£ï¼é代ç 缺é·ï¼å·²å¦å®åæ å¨åºå ã 2. **æ¥è¡¨æè¯ä¹ä¸ºãæ´å¹´ã**ï¼`2021-12` çæå®é æ¿è½½è¯¥å¹´ 1â12 æçå ¨å¹´æ°æ®ï¼èé 12 æåæï¼ãè¥åç»æ¥è¡¨/å®¡æ ¸æãåæãå£å¾åè¿äºæï¼éè¦ç¨æ·ç¡®è®¤å£å¾ï¼æ¬æ¬¡æªåæ¹å¨ã 3. **éå¤å¯¼å ¥ä¼è¦çåæ¥è¡¨æ**ï¼æ°é»è¾å»¶ç»ãå å åæãçå¹ççç¥ï¼é导 `2026-08` ä¼è¦ç该æåæå¼ãæ¬æ¬¡å·²éé¡¹æ ¸å¯¹æºæä»¶ä¸åºå ä¸è´ï¼å·®å¼ 0ï¼ï¼æ æ°æ®æå¤±ã 4. **å¤ä»½ä¸å®æ´ï¼å·²è®°å½ï¼**ï¼æ¹å¨åçå¤ä»½ `_backup_freight_turnover_before_multiyear_20260916.sql` åªæ 59642 åèä¸ä» è§£æåº `2026-04` ä¸å¤ INSERTï¼ä¸è½ä½ä¸ºå®æ´åæ»ä¾æ®ã**ä¸è¦æè¯¥æä»¶å½ä½å®æ´å¤ä»½ä½¿ç¨ã** 5. **2026-01â¦2026-07 ç `last_*` 为空**ï¼ç»æ ¸å¯¹å¤ä»½ï¼`2026-04`ï¼ç¡®è®¤è¿å æå¨æ¬æ¬¡æ¹å¨å `last_*` å³ä¸ºç©ºï¼ä¸æ¬æ¬¡å¯¼å ¥æªè§¦ç¢°è¿äºæ¥è¡¨æï¼æ¹æ¬¡è®°å½åªè¦ç 5 个æï¼ï¼æ éæ¬æ¬¡æ¹å¨å¼å ¥ã ## ç»è®º - éè¿ãå¤å¹´åº¦å·¥ä½ç°¿ï¼21â26 å¹´ï¼å·²å ¨é¨å ¥åºï¼éå¹´ä¸ä¸ªæ¥è¡¨æãéå¹´ä¸å¹´åæï¼1080 个åå æ ¼é项æ¯å¯¹é¶å·®å¼ï¼éå¤å¹´åº¦æä»¶èªå¨åéåææåº¦è·¯å¾ï¼è´åä¸è¾¹çç¨ä¾å符å颿ï¼éå¤å¯¼å ¥å¹çï¼æµè¯æå·²æ¸ çå¹²åï¼çå®æä»½æ°æ®ä¸æ¹å¨åå£å¾ä¸è´ï¼216 è¡ / 12 æï¼ã - å¾ ç¨æ·ç¡®è®¤ï¼`2021-12` çãæ´å¹´ãæ¥è¡¨æçä¸å¡å£å¾æ¯å¦ç¬¦ååç»æ¥è¡¨/å®¡æ ¸åæ°è¦æ±ï¼å¦éãéææ¥è¡¨æãï¼éè¦å¦è¡æ¹é ï¼æ¬æ¬¡æªåï¼ã docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_»õÔËҳǩÀÛ¼ÆÁÐÐÞ¸´ÓëÔàÆÚÇåÀí_2026-09-16.md
New file @@ -0,0 +1,176 @@ # åè½æµè¯æ¥å â è´§è¿é¡µç¾ã累计ãåä¿®å¤ + H2032 èææ¸ ç - **åè½å**ï¼æ±æ»å¤§è¡¨ã è´§è¿ã页ç¾ç´¯è®¡åä¿®å¤ï¼`h2032_enterprise_monthly` 2026-09 èææ¸ ç - **æ¥æ**ï¼2026-09-16 - **ç»è®º**ï¼**éè¿**ï¼6/6 累计å䏿ºæä»¶äººå·¥æ ¸ç®ä¸è´ï¼èæå·²æ¸ é¤ä¸çæå¯è¿åå¤ä»½ï¼ ## ä¸ãåè½è¯´æä¸èæ¯ ç¨æ·åé¦ï¼æ±æ»å¤§è¡¨ã è´§è¿ã页ç¾çãç´¯è®¡ãæ°æ®ï¼äººå·¥æ ¸å¯¹å**åªæåé¢å个è½å¯¹ä¸**ã ` è´§è¿` 页ç¾å ± 6 个累计åï¼å ¨çè¡ï¼ï¼ | å | 年度 | ä¿®å¤å | æºæä»¶æ ¸ç® | å·®å¼ | |---|---|---|---|---| | S | 2026(1-8æ) | 130311.8927 | 130311.8927 | 0 | | AT | 2025 | 195433.2232 | 195433.2232 | 0 | | BV | 2024 | 184938.5780 | 184938.5780 | 0 | | CW | 2023 | 173045.2932 | 173045.2964 | -0.0033 | | DZ | 2022 | 144979.2854 | 144979.2825 | +0.0029 | | EO | 2021 | 空 | 161309.5316 | æ´å缺失 | å¨è½¬éè¡åçï¼2023 -0.0017ã2022 +0.0025ã2021 空ï¼ã ## äºãæ ¹å å®ä½ ### 2.1 ç»æä¸æä»¶èè´£ æ¯çï¼`docs/çææ±æ»å¤§è¡¨/2026å¹´8æéè·¯è¿è¾éæ±æ»è¡¨.xlsx` â ` è´§è¿` 页ï¼118x147ï¼ã - `çæ_éè·¯è¿è¾éæ±æ»è¡¨.xlsx` ä» ä½**å宽çå¼åç §**ï¼`applySummaryReferenceLayout` åªè¯»å宽ä¸éèæ è®°ï¼ä¸è¯»æ°å¼ï¼ï¼ - `2026å¹´8æéè·¯è¿è¾éæ±æ»è¡¨_çå¼åå.xlsx` è¿è¡æ¶**æªè¢«ä»»ä½ä»£ç å¼ç¨**ã å ¨çå 6 è¡ï¼r5 è´§è¿éãr6 å¨è½¬éãr7 å ¶ä¸è§ä¸è´§è¿éãr8 å ¶ä¸è§ä¸å¨è½¬éãr9 å ¶ä¸è§ä¸è´§è¿éãr10 å ¶ä¸è§ä¸å¨è½¬éã 17 个å¸å·åæ¯å 6 è¡ï¼åé¦è¡ 11,17,...,107ï¼æ¦æ±å¸...æåºï¼ã å ³é®ï¼å ¨ç r5 = `=<m>7+<m>9`ï¼è§ä¸+è§ä¸ï¼ï¼r7 = 17 å¸å·è§ä¸ä¹åï¼å ¬å¼ï¼ï¼è **r9ï¼å ¨çè§ä¸ï¼æ¯åæ»ç常é**ã ### 2.2 å³å®æ§æµéï¼Excel COM éç®åéææ¯è¾ãå ¨çè¡ãä¸ã17 å¸å·è¡ä¹åãï¼ | 年度 | å计差 | è§ä¸å·® | è§ä¸å·® | |---|---|---|---| | 2026(1-8) | 2.8e-5 | 1.8e-12 | 2.8e-5 | | 2025 | 3.3e-11 | 9.1e-13 | 3.5e-11 | | 2024 | 1.5e-11 | 9.1e-13 | 1.3e-11 | | 2023 | **4.6e-3** | 4.5e-13 | **4.6e-3** | | 2022 | **3.1e-3** | 2.3e-13 | **3.1e-3** | | 2021 | 4.0e-5 | 4.0e-5 | 1.5e-4 | **ç»è®ºï¼è§ä¸æ°¸è¿å¯¹å¾ä¸ï¼å·®å¼å ¨é¨æ¥èªãå ¨çè§ä¸ãè¿ä¸è¡ç忻叏éä¸ 17 å¸å·è§ä¸ä¹åä¸çã** 忶宿µã17 å¸å·è¡ä¹åãçäºæºæä»¶æ¹åçè¡ï¼2022 累计 144979.2825ã2023 累计 173045.2964ï¼ä¸äººå·¥æ ¸ç®**å®å ¨ä¸è´**ã ### 2.3 å ¶ä½åå - **DZï¼2022 累计ï¼åæ»å¸¸é**ï¼ä¸éæ°æ®å·æ°ï¼å ¶å¼æ°å¥½çäºèªèº« 12 个æä¹åï¼æ æ¹æå ¬å¼å±ç弿¹å¨ï¼ï¼ - **EOï¼2021 ç´¯è®¡ï¼æ´å为空**ï¼æ¯ç仿ªå¡«è¿ç´¯è®¡å ¬å¼ï¼2021 å¹´ `EC:EN` åäºä¸ªæé½æå¼ï¼ï¼ - **EAï¼2022 ç´¯è®¡åæ¯ï¼ä¹æ¯åæ»å¸¸é**ï¼ - 导åºä»£ç åªåå¡«ãç®æ 彿ãä¸åï¼`SummaryWorkbookFiller.fillFreightSheet`ï¼ï¼å岿份ä¸å¾æ²¿ç¨æ¯ç â æ¯ç对ä¸ä¸å°±æ´ä½å¯¹ä¸ä¸ã ## ä¸ãä¿®æ¹å 容 ### 3.1 æ¯çã2026å¹´8æéè·¯è¿è¾éæ±æ»è¡¨.xlsxãâ ` è´§è¿` 页 | # | ä½ç½® | æ¹å | æ¹å | |---|---|---|---| | 1 | r7 å ¶ä¸è§ä¸è´§è¿éï¼2021-2025 åæï¼ | 常é/é¨åå ¬å¼ | `=SUM(<17 å¸å·è§ä¸è´§è¿éè¡>)` | | 2 | r9 å ¶ä¸è§ä¸è´§è¿éï¼2021-2025 åæï¼ | **忻叏é** | `=SUM(<17 å¸å·è§ä¸è´§è¿éè¡>)` | | 3 | r8 å ¶ä¸è§ä¸å¨è½¬éï¼2021-2025 åæï¼ | 常é/é¨åå ¬å¼ | `=SUM(<17 å¸å·è§ä¸å¨è½¬éè¡>)` | | 4 | r10 å ¶ä¸è§ä¸å¨è½¬éï¼2021-2025 åæï¼ | **忻叏é** | `=SUM(<17 å¸å·è§ä¸å¨è½¬éè¡>)` | | 5 | r5 è´§è¿éï¼2021-2025 åæï¼ | 常é/å ¬å¼ | `=<m>7+<m>9` | | 6 | r6 å¨è½¬éï¼2021-2025 åæï¼ | 常é/å ¬å¼ | `=<m>8+<m>10` | | 7 | DZ åï¼2022 累计ï¼è¡ 5-112ï¼ | 忻叏é | `=SUM(DM<r>:DX<r>)` | | 8 | EO åï¼2021 累计ï¼è¡ 5-112ï¼ | **空** | `=SUM(EC<r>:EN<r>)` | | 9 | EA åï¼2022 ç´¯è®¡åæ¯ï¼è¡ 5-112ï¼ | 忻叏é | `=IFERROR(DZ<r>/SUM(EC<r>:EN<r>)-1,"")` | å ±æ¹åæååå 360 个ã累计åå 324 个ã - 2026 å¹´åï¼C..Qï¼**ä¸å¨**ï¼å½æå¼ç±å¯¼åºä»£ç åå¡«ï¼ä¸å ¶ç´¯è®¡å·²ä¸æºæä»¶ä¸è´ï¼ - EPï¼2021 ç´¯è®¡åæ¯ï¼**ä¿æä¸ºç©º**ï¼é¡µå 没æ 2020 年度åï¼æ åæ¯åºæå¯å¼ç¨ï¼ - åªæ¹æ¯çè¿ä¸ä¸ªæä»¶ã`çæ_éè·¯è¿è¾éæ±æ»è¡¨.xlsx` æ¯å宽åç §ä»¶ï¼æ¹å®åèæå宽被 Excel éå带åçé£é©ï¼ï¼`_çå¼åå.xlsx` è¿è¡æ¶æªè¢«å¼ç¨ï¼ä¸¤è åä¸å¨ï¼ - åæå¤ä»½æ¯çè¿åæºå¶**ä¸ä¼**å²ææ¬æ¬¡æ¹å¨ï¼`resolveSummaryDonor(2026,8)` è¦æ±æä»¶å以 `_å¤ä»½_` å¼å¤´ä¸å«ã2026å¹´8æãï¼ç®å½ä¸æ å¹é æä»¶ï¼å¯¼åºæ¥å¿äº¦ç¡®è®¤ãæªæ¾å°åæå¤ä»½æ¯çãã æ¹å¨åå¤ä»½ï¼`docs/çææ±æ»å¤§è¡¨/_bak_202608æ¯çä¿®æ¹å_20260916/`ï¼3 个åæä»¶ï¼ã > å®ç°æ¹å¼ç¨ **Excel COM** æå¼æ¯çæ¹å ¬å¼å¹¶ `CalculateFullRebuild` åä¿åã**ä¸å¯ç¨ openpyxl å¦å**ï¼ä¼æ¸ ç©ºå ¨æ¬å ¬å¼ç¼åå¼ï¼2026-09-16 æ¾å æ¤è®© 2021 å¹´æ¹åçè¡åæ 0ï¼è§å·¥ä½æ¥ç»ç¬¬åå «èï¼ã ### 3.2 æ°æ®åº | æä½ | 对象 | å½±åè¡æ° | |---|---|---| | DELETE | `h2032_enterprise_monthly` WHERE `report_period='2026-09'` | 636 | | DELETE | `import_batch` WHERE `id=302` | 1 | 便®ï¼batch 302 çæä»¶åæ¯ãé路货ç©è¿è¾æåº¦ç产æ åµï¼2026å¹´8æï¼.xlsãï¼å´è¢«åæ `2026-09`ï¼2026-09-10 09:03:29 å¯¼å ¥ï¼ï¼2026-09-11 17:48 å·²ç¨æ£ç¡®ç 8 ææä»¶é导为 `2026-08`ï¼batch 320ï¼å为 636 è¡ / 90 åºåï¼ã å¤ä»½ï¼å¯è¿åï¼ï¼`_backup_h2032_2026-09_rows_20260916.sql`ï¼636 个å ç»ï¼ã`_backup_h2032_2026-09_batch302_20260916.sql`ã ## åãæµè¯ç¯å¢ | 项 | å¼ | |---|---| | å端 | Spring Bootï¼`http://127.0.0.1:8090`ï¼è¿è¡ä¸ï¼ | | æ°æ®åº | MySQL 8.0ï¼`127.0.0.1:3308`ï¼åº `traffic_audit` | | å¯¼åºæ¥å£ | `GET /api/report/export/summaryWorkbook?period=2026-08&mode=month` | | é¢è§æ¥å£ | `GET /api/report/preview?period=2026-08&mode=month&types=summaryWorkbook` | | å ¬å¼æ±å¼ | Excel COMï¼`CalculateFullRebuild`ï¼ââ导åºä»¶å ¬å¼**æ ç¼åå¼**ï¼openpyxl è¯»åºæ¥å ¨æ¯ Noneï¼å¿ é¡»ç¨ Excel éç® | | æºæä»¶ | `D:\05_æ°æ®åç±»\é«é\å®ç¨¿-æ¹åçåå¸å·è¿è¾éæ°æ®ï¼2026å¹´1-8æï¼.xlsx`ï¼2021/2022/2024/2025/2026 页ï¼+ `D:\05_æ°æ®åç±»\è´§è¿\7æ\å®ç¨¿-æ¹åçåå¸å·è¿è¾éæ°æ®ï¼2026å¹´1-7æï¼.xlsx`ï¼2023 é¡µï¼ | ## äºãç¨ä¾è¡¨ ### 5.1 æ£åç¨ä¾ | # | è¾å ¥/æä½ | 颿 | å®é | ç»è®º | |---|---|---|---|---| | P1 | éå¯¼åº 2026-08 æ±æ»å¤§è¡¨ï¼Excel éç®å读 ` è´§è¿` å ¨çè¡ 6 个累计å | 2021/2022/2023 䏿ºæä»¶ä¸è´ | 2026 å·® -1.8e-6ã2025 +4.1e-5ã2024 -2.1e-5ã2023 +2.9e-5ã2022 -2.9e-11ã2021 +2.0e-5ï¼å¨è½¬éåéçº§ï¼ | éè¿ | | P2 | åä¸ï¼è¯» 2021 累计å EO | æå¼ä¸çäº 161309.5316 | 161309.5316 | éè¿ | | P3 | 导åºä»¶ãå ¨çè¡ãéæ vsã17 å¸å·è¡ä¹åã | 差约çäº 0 | 2021<=5.5e-12ã2022<=5.5e-12ã2023<=3.6e-12ã2025<=5.5e-12ï¼å¨è½¬é <=9.3e-10ï¼ | éè¿ | | P4 | æ¯çéç®ååä¸ | 差约çäº 0 | 2021-2025 å ¨é¨ <=9.3e-10 | éè¿ | | P5 | 导åºä»¶ 2026 å¹´ 8 æå½æå¼ | å ¨çè´§è¿é 16888.76 | Q5=16888.7615ï¼Q11(æ¦æ±å¸)=5173.1802 | éè¿ | | P6 | é¢è§æ¥å£ `types=summaryWorkbook` | è¿åæ±æ»ææ | `ready=true`ã`rows=159`ã20 é¡¹ææ ï¼å½æè´§è¿é 16888.76ã累计 130311.89ï¼ | éè¿ | | P7 | 2021 ç´¯è®¡åæ¯ EA æ½æ¥ | åæ¯ä¸º 0 çè¡ä¸æ¾ç¤ºé误 | EA5=-0.1012355ãEA11=-0.0886607ãEA90 空ãEA111 空 | éè¿ | ### 5.2 è´åç¨ä¾ / åå½ç¨ä¾ | # | è¾å ¥/æä½ | 颿 | å®é | ç»è®º | |---|---|---|---|---| | N1 | ç¨ openpyxl å¦åæ¯çå导åºï¼åå²è¸©åå¤ç°ï¼ | ä¼ä¸¢å ¬å¼ç¼åå¼ï¼æ **ä¸éç¨**该å®ç° | æªéç¨ï¼æ¹ç¨ Excel COMï¼ç¼åå¼ä¿ç | è§é¿ | | N2 | æ¹æ¯çæ¶æå ¬å¼åæ `SUM(DM5)` ä¹ç±»æ®ç¼ºå¼ç¨ï¼é¦æ¬¡èæ¬ `"$m7"` 被 PowerShell å½åéåï¼ | åºåç°å¹¶åæ» | å·²åç°ï¼ä» `_bak` å¤ä»½è¿ååï¼æ¹ç¨ `${r}`/`${m}` å®çéè· | éè¿ | | N3 | 2026-07 æå¯¼åºï¼åå½ï¼æ¯çæªæ¹ï¼ | ä»è½æ£å¸¸å¯¼åº | `_regress_summary_2026-07.xlsx` 941,969 åèï¼` è´§è¿` 页 118x145 | éè¿ | | N4 | 导åºåæ¥è¯¢ `h2032_enterprise_monthly` æ¯å¦è¿æ 2026-09 | æ | 2026-01...2026-08 å 636 è¡ï¼æ 2026-09 | éè¿ | | N5 | `import_batch` æ¯å¦è¿æ id=302 | æ | å·²å é¤ | éè¿ | | N6 | å¤ä»½ SQL å¯è¿åæ§ | å ç»æ°åºä¸º 636 | 宿µ 636 个å ç» | éè¿ | ### 5.3 å ¥åºæ½æ¥ | # | æ½æ¥é¡¹ | ç»æ | |---|---|---| | D1 | `h2032_enterprise_monthly` 2026 å¹´åæè¡æ° / åºåæ° | 2026-01 636/91ï¼2026-02...08 å 636/90 | | D2 | å é¤åå rowcount | å 636 è¡ï¼`ROW_COUNT()` 宿µ 636ï¼ãå batch 1 è¡ | | D3 | å¤ä»½æä»¶åèæ° | rows 725,989 åè / batch 1,624 åè | ## å ãä¿®å¤åå对æ¯ï¼å¯¼åºä»¶å®æµï¼ | 年度 | å | ä¿®å¤å | ä¿®å¤å | æºæä»¶æ ¸ç® | ä¿®å¤åå·®å¼ | |---|---|---|---|---|---| | 2026(1-8æ) | S | 130311.8927 | 130311.8927 | 130311.8927 | -1.8e-6 | | 2025 | AT | 195433.2232 | 195433.2232 | 195433.2232 | +4.1e-5 | | 2024 | BV | 184938.5780 | 184938.5780 | 184938.5780 | -2.1e-5 | | 2023 | CW | 173045.2932 | **173045.2964** | 173045.2964 | +2.9e-5 | | 2022 | DZ | 144979.2854 | **144979.2825** | 144979.2825 | -2.9e-11 | | 2021 | EO | 空 | **161309.5316** | 161309.5316 | +2.0e-5 | å¨è½¬éè¡ï¼2021 `21961780.4134`ã2022 `20587594.6295`ã2023 `24243256.5443`ã2024 `25071499.8353`ã2025 `26403562.8772`ã2026 `17492129.0479`ï¼ä¸æºæä»¶å·®å¼å <=2.1e-4ã **6/6 累计åå¨ 4 ä½å°æ°æ¾ç¤ºå£å¾ä¸ä¸æºæä»¶äººå·¥æ ¸ç®å®å ¨ä¸è´ã** ## ä¸ãåç°çé®é¢ä¸å¤ç½® | # | 严é度 | é®é¢ | å¤ç½® | |---|---|---|---| | 1 | é« | `h2032_enterprise_monthly` å¤åº 2026-09 æï¼å®ä¸º 8 ææä»¶ï¼ | **å·²å é¤**ï¼å« batch 302ï¼ï¼çå¯è¿åå¤ä»½ | | 2 | é« | æ¯çãå ¨çè§ä¸ãè¡åæ»å¸¸éï¼å¯¼è´ 2022/2023 累计å差约 0.003 | **å·²æ¹ä¸º 17 å¸å·æ±åå ¬å¼** | | 3 | ä¸ | æ¯ç 2021 累计å EO æ´å为空 | **已补 `=SUM(EC:EN)`** | | 4 | ä¸ | æ¯ç 2022 累计å DZãç´¯è®¡åæ¯ EA ä¸ºåæ»å¸¸é | **å·²æ¹ä¸ºå ¬å¼** | | 5 | ä½ | æ¯ç Excel éåå导åºä»¶ä½ç§¯ç± 950,186 -> 1,331,599 åèï¼Excel èªèº«æ ¼å¼å¼éï¼`_çå¼åå.xlsx` å为 1.48MB éçº§ï¼ | è®°å½ï¼ä¸å½±åæ°æ® | | 6 | ä½ | 导åºä»¶ ` è´§è¿` 页åå¨ <=2.1e-4 çæµ®ç¹ç´¯å åªå£° | è®°å½ï¼4 ä½å°æ°æ¾ç¤ºä¸è´ | | 7 | æç¤º | å¦åç° 2026-09 æè¿æï¼`h204_vehicle_quarterly` 1284 è¡ï¼batch 142ï¼ä¸ 2026-08 ç batch 144 åæä»¶ï¼ã`investment_monthly` 31 è¡ï¼batch 107ï¼ä¸ batch 108 åæºï¼ã`audit_result` 2061 è¡ã`audit_run` 3 è¡ | **æ¬æ¬¡æªå¨**ï¼ä¸å¨ææèå´ï¼ï¼å¾ ç¨æ·ç¡®è®¤æ¯å¦ä¸å¹¶æ¸ ç | | 8 | æç¤º | 2026-07 æå¯¼åºä»¶ç ` è´§è¿` 页为 118x145ï¼æ¯ 8 æå° 2 åï¼ï¼å 7 ææ¯çæ¯ã1-4 æéª¨æ¶ã | åç¬è®®é¢ï¼å¾ 7 ææ¯çå®ç¨¿ | ## å «ãç»è®º 1. ç¨æ·é®é¢ãç´¯è®¡åªæåé¢å个对å¾ä¸ã**å·²å®ä½å¹¶è§£å³**ï¼æ ¹å ä¸å¨ç´¯è®¡å ¬å¼æ¬èº«ï¼è卿¯çãå ¨çè§ä¸ãè¡æ¯ä¸ 17 å¸å·ä¸ç¬¦ç忻叏éï¼å å 2021 ç´¯è®¡åæ¼å¡«ã2022 累计å忻叏éã 2. ä¿®å¤å 6 个累计åï¼S/AT/BV/CW/DZ/EOï¼å¨ 4 ä½å°æ°å£å¾ä¸ä¸æºæä»¶äººå·¥æ ¸ç®**å ¨é¨ä¸è´**ã 3. `h2032_enterprise_monthly` 2026-09 èæå·²æ¸ é¤ï¼å¤ä»½å¯è¿åã 4. 2026-07 导åºåå½éè¿ï¼é¢è§æ¥å£æ£å¸¸ã 5. éçï¼2026-09 å¨ `h204_vehicle_quarterly` / `investment_monthly` / `audit_result` / `audit_run` ä¸ä»ææ°æ®ï¼å¾ ç¨æ·ç¡®è®¤æ¯å¦æ¸ çã docs/¹¦ÄܲâÊÔ±¨¸æ/»ã×Ü´ó±íÓ붨¸å±È¶Ô_2026-09-16.md
New file @@ -0,0 +1,251 @@ # æ±æ»å¤§è¡¨é表æ¯å¯¹æ¥å_2026-09-16 ## é¶ãç»è®ºæè¦ï¼å çè¿éï¼ | # | ç»è®º | 说æ | |---|---|---| | 1 | **导åºç«¯åçæ¯å ¬å¼ï¼å®ç¨¿æ¯ç®å¥½çæ°å¼** | å¯¼åºæä»¶é 39,939 个åå æ ¼æ¯å ¬å¼ï¼å¦ `=C7+C9`ã`=C5/V5-1`ï¼ï¼ç¨ Excel æå¼ä¼èªå¨ç®åºæ¥ãæä»¥ã导åºç«¯å¤§ç空ç½ãæ¯å象ï¼ä¸æ¯ç¼ºæ°æ®ã | | 2 | **å ¬å¼ææ¬å°æ±å¼åï¼28,567 个ãå°åº+ææ +åãè¯ä¹é®ä¸å®ç¨¿ä¸è´** | åªæ 4,742 个é®ä¸ä¸è´ï¼å ¶ä¸å¤§é¨åéä¸å¨ä¸é¢ç¬¬ 3ã4 æ¡ã | | 3 | **` è´§è¿` 表ï¼å¯¼åºæ¯å®ç¨¿æ¯å¸å·å¤ä¸¤è¡ææ ** | å¯¼åº 6 è¡ï¼è§ä¸+è§ä¸è´§è¿é/è§ä¸è´§è¿é/è§ä¸è´§è¿é/è§ä¸+è§ä¸å¨è½¬é/è§ä¸è´§ç©å¨è½¬é/è§ä¸è´§ç©å¨è½¬éï¼ï¼å®ç¨¿ 4 è¡ï¼æ ãè§ä¸+è§ä¸è´§è¿éããè§ä¸è´§è¿éãï¼ã**åææ æ°å¼æ¬èº«ä¸è´ï¼0 夿°å¼å·®å¼ï¼**ã | | 4 | **2025 å¹´ãåå¸å®¢è¿ç±»ãæ°æ®æ²¡å ¥åºï¼æ¯æå¤§å·®å¼æ¥æº** | `city_bus_monthly / city_taxi_monthly / wyc_order_monthly / wyc_total_monthly` é½åªæ **2026-01~08**ï¼æ²¡æ 2025 å¹´ã导è´è¿äºè¡¨ãä¸å»å¹´åæ¯ãåç®æ `0` æ `-1`ã2025 年累计åå°ã | | 5 | **H203-1ï¼å ¬è·¯æ 客ï¼ç¼º 2025-01** | åºéæ¯ 2025-02~2025-12ï¼ç¨æ·å¯¼å ¥ç `.xls` æ¬èº«æ²¡æ 1 æã | | 6 | **导åºç«¯ãä¸å£å¾åæãå¤ä¸æ®µå½æå** | 导åºå¤åºã8æä¸å£å¾å®¢è¿éåå¨è½¬éãï¼ç¬¬ 10~16 è¡ï¼ï¼å®ç¨¿åªæ 1-8 æç´¯è®¡åï¼ä¸å¯¼åºç¼º 4 è¡ãå æ¯ãã | > ä¸å¥è¯ï¼**è¡¨æ ¼è½å¯¹ä¸ï¼çæ£è¦è¡¥çæ¯ 2025 å¹´åå¸å®¢è¿ï¼å ¬äº¤/åºç§/ç½çº¦è½¦ï¼æ°æ®**ï¼è¡¥ä¸ä»¥å忝忿å¼ã --- ## ä¸ãæ¯å¯¹å¯¹è±¡ä¸æ¹æ³ - 导åºç«¯ 19 个 Sheetãå®ç¨¿ç«¯ 19 个 Sheetï¼é¡µç¾åç§°å®å ¨ä¸è´ï¼æ å¤é¡µç¾/å°é¡µç¾ï¼ã - 导åºç«¯ç»æï¼æ¯å¸å· 6 è¡ææ åï¼å®ç¨¿ 4 è¡ï¼ãå¯¼åº 118 è¡ vs å®ç¨¿ 84 è¡çå·®å¼ï¼å æ¤**ä¸è½æåå æ ¼åæ æ¯**ï¼æ¹ç¨è¯ä¹é®ã - æ±å¼ï¼å¯¼åºç«¯ 39,939 ä¸ªå ¬å¼æ ¼æ¬å°æ±å¼ â 61,972 个æ°å¼æ ¼ã ## äºãæ»ä½ç»æ | Sheet | ä¸è´ | ä¸ä¸è´ | æ¡æ°/ç»æä¸å | 导åºç¼ºä¸å¹´åæ | æ°å¼ä¸å | |---|---|---|---|---|---| | è´§è¿ | 5430 | 268 | 267 | 1 | 0 | | 2025å¹´åå¸å®¢è¿é | 28 | 0 | 0 | 0 | 0 | | ä¸å£å¾å®¢è¿é | 3758 | 1194 | 0 | 486 | 708 | | ä¸å£å¾æç» | 3217 | 1400 | 94 | 291 | 1015 | | ä¸å£å¾è®¡ç®è¿ç¨ | 933 | 0 | 0 | 0 | 0 | | å ¬äº¤ | 2988 | 365 | 144 | 5 | 216 | | å ¬è·¯æ»å®¢è¿ | 828 | 145 | 0 | 1 | 144 | | åºç§ | 2304 | 145 | 72 | 1 | 72 | | åå¸åå¸å· | 28 | 0 | 0 | 0 | 0 | | åå¸å®¢è¿ | 1008 | 217 | 36 | 1 | 180 | | å叿±æ» | 7 | 2 | 1 | 0 | 1 | | ç线å 车 | 3950 | 740 | 596 | 97 | 47 | | ç½çº¦è½¦ | 3504 | 144 | 0 | 0 | 144 | | è´§è¿å¨è½¬éæå | 61 | 28 | 0 | 0 | 28 | | è´§è¿éæå | 78 | 60 | 0 | 0 | 60 | | 轨éã轮渡 | 436 | 34 | 23 | 1 | 10 | | éè·¯è¿è¾å¨è½¬é | 9 | 0 | 0 | 0 | 0 | | **å计** | **28567** | **4742** | **1233** | **884** | **2625** | ## ä¸ãå·®å¼åç±»æ ·ä¾ ### è´§è¿ - ãæ¡æ°/ç»æä¸åãå°åº=仿¡å¸ ææ =è§ä¸+è§ä¸å¨è½¬é(ä¸å¨å ¬é) å=10æä¸å»å¹´åæ¯ - 导åº=[-0.024796658657952775, 0.03874697951695838, 0.15669270257186785] - å®ç¨¿=[-0.0247966586579526, 0.0387469795169586] - ãæ¡æ°/ç»æä¸åãå°åº=仿¡å¸ ææ =è§ä¸+è§ä¸å¨è½¬é(ä¸å¨å ¬é) å=11æä¸å»å¹´åæ¯ - 导åº=[-0.01622232738005569, -0.019037012371566964, 0.07433934902579198] - å®ç¨¿=[-0.0162223273800557, -0.019037012371567] - ãæ¡æ°/ç»æä¸åãå°åº=仿¡å¸ ææ =è§ä¸+è§ä¸å¨è½¬é(ä¸å¨å ¬é) å=12æä¸å»å¹´åæ¯ - 导åº=[-0.03222870597621563, 0.04520985447367809, 0.11176470288481033] - å®ç¨¿=[-0.0322287059762133, 0.0452098544736756] - ãæ¡æ°/ç»æä¸åãå°åº=仿¡å¸ ææ =è§ä¸+è§ä¸å¨è½¬é(ä¸å¨å ¬é) å=1æä¸å»å¹´åæ¯ - 导åº=[0.18714531209236318, -0.10994255805562458, 0.4721261008370825] - å®ç¨¿=[0.187145312092363, -0.109942558055625, 0.472126100837083] ### ä¸å£å¾å®¢è¿é - ã导åºç¼ºä¸å¹´åæ(ç®æ0/-1)ãå°åº=仿¡å¸ ææ =åé åä¹¡å ¬äº¤å®¢è¿éï¼ä¸äººæ¬¡ï¼ å=10æä¸å»å¹´åæ¯ - 导åº=[-1.0] - å®ç¨¿=[-0.222741433021807] - ã导åºç¼ºä¸å¹´åæ(ç®æ0/-1)ãå°åº=仿¡å¸ ææ =åé åä¹¡å ¬äº¤å®¢è¿éï¼ä¸äººæ¬¡ï¼ å=11æä¸å»å¹´åæ¯ - 导åº=[-1.0] - å®ç¨¿=[-0.085603112840467] - ãæ°å¼ä¸åãå°åº=仿¡å¸ ææ =åé åä¹¡å ¬äº¤å®¢è¿éï¼ä¸äººæ¬¡ï¼ å=2025年累计 - 导åº=[53.3] - å®ç¨¿=[260.95] - ã导åºç¼ºä¸å¹´åæ(ç®æ0/-1)ãå°åº=仿¡å¸ ææ =åé åä¹¡å ¬äº¤å®¢è¿éï¼ä¸äººæ¬¡ï¼ å=3æä¸å»å¹´åæ¯ - 导åº=[-1.0] - å®ç¨¿=[-0.173913043478261] ### ä¸å£å¾æç» - ãæ°å¼ä¸åãå°åº=仿¡å¸ ææ =å ¬è·¯ç线客è¿éï¼ä¸äººæ¬¡ï¼ å=累计 - 导åº=[65.9545, 97.11030000000002] - å®ç¨¿=[76.2534, 97.1103] - ãæ¡æ°/ç»æä¸åãå°åº=仿¡å¸ ææ =å ¬è·¯ç线æ 客å¨è½¬éï¼ä¸äººå ¬éï¼ å=None - 导åº=[2552.6529, 4069.7147000000004] - å®ç¨¿=[3033.9412] - ãæ°å¼ä¸åãå°åº=仿¡å¸ ææ =å ¬è·¯ç线æ 客å¨è½¬éï¼ä¸äººå ¬éï¼ å=累计 - 导åº=[3343.7725, 4474.9138] - å®ç¨¿=[3888.4326, 4474.9138] - ã导åºç¼ºä¸å¹´åæ(ç®æ0/-1)ãå°åº=仿¡å¸ ææ =åé åä¹¡å ¬äº¤å®¢è¿éï¼ä¸äººæ¬¡ï¼ å=2025年累计 - 导åº=[0.0] - å®ç¨¿=[306.05] ### å ¬äº¤ - ãæ¡æ°/ç»æä¸åãå°åº=仿¡å¸ ææ =å ¶ä¸åå¸å 客è¿éï¼ä¸äººæ¬¡ï¼ å=6æä¸å»å¹´åæ¯ - 导åº=[-1.0] - å®ç¨¿=[-0.451242009524218, -0.267657408571069] - ãæ¡æ°/ç»æä¸åãå°åº=仿¡å¸ ææ =å ¶ä¸åå¸å 客è¿éï¼ä¸äººæ¬¡ï¼ å=None - 导åº=[1109.2] - å®ç¨¿=[134.49, 142.61, 115.16] - ãæ°å¼ä¸åãå°åº=仿¡å¸ ææ =å ¶ä¸åå¸å 客è¿éï¼ä¸äººæ¬¡ï¼ å=累计 - 导åº=[1680.22, 3687.98, 1710.0900000000001] - å®ç¨¿=[1913.31, 3687.98, 1710.09] - ãæ°å¼ä¸åãå°åº=仿¡å¸ ææ =å ¶ä¸åå¸å 客è¿éï¼ä¸äººæ¬¡ï¼ å=累计ä¸å»å¹´åæ¯ - 导åº=[3.532187201528175] - å®ç¨¿=[-0.387609454550148] ### å ¬è·¯æ»å®¢è¿ - ãæ°å¼ä¸åãå°åº=仿¡å¸ ææ =å¨è½¬éï¼ä¸äººå ¬éï¼ å=2025å¹´6æ - 导åº=[749.5794793494696] - å®ç¨¿=[2758.65947934947] - ãæ°å¼ä¸åãå°åº=仿¡å¸ ææ =å¨è½¬éï¼ä¸äººå ¬éï¼ å=忝 - 导åº=[-0.09741856370872848, -0.23580927957669318, -0.2044540674016434] - å®ç¨¿=[-0.0974185637087299, -0.235809279576693, -0.204454067401643] - ãæ°å¼ä¸åãå°åº=仿¡å¸ ææ =å¨è½¬éï¼ä¸äººå ¬éï¼ å=累计 - 导åº=[22177.14801567051, 36108.164028367806] - å®ç¨¿=[24186.2280156705, 36108.1640283678] - ãæ°å¼ä¸åãå°åº=仿¡å¸ ææ =å¨è½¬éï¼ä¸äººå ¬éï¼ å=ç´¯è®¡åæ¯ - 导åº=[-0.3340605811417364] - å®ç¨¿=[-0.273731562879588] ### åºç§ - ãæ¡æ°/ç»æä¸åãå°åº=仿¡å¸ ææ =å ¶ä¸åå¸å 客è¿éï¼ä¸äººæ¬¡ï¼ å=None - 导åº=[336.0] - å®ç¨¿=[64.67, 65.76, 64.39] - ãæ°å¼ä¸åãå°åº=仿¡å¸ ææ =å ¶ä¸åå¸å 客è¿éï¼ä¸äººæ¬¡ï¼ å=累计ä¸å»å¹´åæ¯ - 导åº=[7.4782758620689656] - å®ç¨¿=[0.0942145082331998] - ãæ¡æ°/ç»æä¸åãå°åº=仿¡å¸ ææ =å ¶ä¸åå¸å æ 客å¨è½¬é(ä¸äººå ¬é) å=None - 导åº=[1142.3999999999999] - å®ç¨¿=[261.27, 361.68, 347.06] - ãæ°å¼ä¸åãå°åº=仿¡å¸ ææ =å ¶ä¸åå¸å æ 客å¨è½¬é(ä¸äººå ¬é) å=累计ä¸å»å¹´åæ¯ - 导åº=[12.03843813387424] - å®ç¨¿=[0.682753475221865] ### åå¸å®¢è¿ - ãæ°å¼ä¸åãå°åº=仿¡å¸ ææ =å¨è½¬éï¼ä¸äººå ¬éï¼ å=2025å¹´1-7æç´¯è®¡ - 导åº=[8816.138448722153] - å®ç¨¿=[10139.2184487222] - ãæ°å¼ä¸åãå°åº=仿¡å¸ ææ =å¨è½¬éï¼ä¸äººå ¬éï¼ å=6æåæ¯ - 导åº=[6.255892181315063, -0.8966228676621759] - å®ç¨¿=[-0.00386729718753609, -0.246994577992483] - ãæ°å¼ä¸åãå°åº=仿¡å¸ ææ =å¨è½¬éï¼ä¸äººå ¬éï¼ å=8æåæ¯ - 导åº=[-1.0, -0.6067523598726108] - å®ç¨¿=[0.534128007747653, -0.606752359872611] - ãæ¡æ°/ç»æä¸åãå°åº=仿¡å¸ ææ =å¨è½¬éï¼ä¸äººå ¬éï¼ å=None - 导åº=[7768.398509034526] - å®ç¨¿=[1501.17761338372, 1549.99252838425, 1646.32707505095] ### å叿±æ» - ãæ¡æ°/ç»æä¸åãå°åº=轮渡 ææ =401.49 å=忝 - 导åº=[-0.004808764841484267, -0.004818943331851048, -0.0778759013031685] - å®ç¨¿=[-0.00480876484148429, -0.00481894333185107, -0.0778759013031685] - ãæ°å¼ä¸åãå°åº=轮渡 ææ =401.49 å=累计客è¿éï¼ä¸äººæ¬¡ï¼ - 导åº=[401.49, 557.59, 604.68] - å®ç¨¿=[401.49, 557.59, -0.107293274289419] ### ç线å 车 - ã导åºç¼ºä¸å¹´åæ(ç®æ0/-1)ãå°åº=仿¡å¸ ææ =客è¿éï¼ä¸äººï¼ å=10æä¸å»å¹´åææ¯ - 导åº=[-1.0] - å®ç¨¿=[-0.0555555555555556] - ãæ¡æ°/ç»æä¸åãå°åº=仿¡å¸ ææ =客è¿éï¼ä¸äººï¼ å=10æä¸å»å¹´åæ¯ - 导åº=[0.19738596294496547, -0.1137869352060421, 0.11167849164068455] - å®ç¨¿=[0.197385962944965, -0.113786935206042] - ãæ¡æ°/ç»æä¸åãå°åº=仿¡å¸ ææ =客è¿éï¼ä¸äººï¼ å=11æ - 导åº=[143.0, 146.0, 145.0] - å®ç¨¿=[143, 146] - ã导åºç¼ºä¸å¹´åæ(ç®æ0/-1)ãå°åº=仿¡å¸ ææ =客è¿éï¼ä¸äººï¼ å=11æä¸å»å¹´åææ¯ - 导åº=[-1.0] - å®ç¨¿=[-0.0629370629370629] ### ç½çº¦è½¦ - ãæ°å¼ä¸åãå°åº=仿¡å¸ ææ =å ¶ä¸åå¸å 客è¿éï¼ä¸äººæ¬¡ï¼ å=None - 导åº=[68.3882807969825] - å®ç¨¿=[100.83443064512] - ãæ°å¼ä¸åãå°åº=仿¡å¸ ææ =å ¶ä¸åå¸å 客è¿éï¼ä¸äººæ¬¡ï¼ å=累计ä¸å»å¹´åæ¯ - 导åº=[75.12915230414589] - å®ç¨¿=[4.63647104214023] - ãæ°å¼ä¸åãå°åº=仿¡å¸ ææ =å ¶ä¸åå¸å æ 客å¨è½¬é(ä¸äººå ¬é) å=None - 导åº=[158.2985090345263] - å®ç¨¿=[235.879860920795] - ãæ°å¼ä¸åãå°åº=仿¡å¸ ææ =å ¶ä¸åå¸å æ 客å¨è½¬é(ä¸äººå ¬é) å=累计ä¸å»å¹´åæ¯ - 导åº=[134.88943592662713] - å®ç¨¿=[9.10009426490351] ### è´§è¿å¨è½¬éæå - ãæ°å¼ä¸åãå°åº=仿¡ ææ =10269.9152 å=None - 导åº=[-10259.9] - å®ç¨¿=[9.3] - ãæ°å¼ä¸åãå°åº=仿¡ ææ =10269.9152 å=åå¸å·è§ä¸è§ä¸å æ¯ - 导åº=[10269.9] - å®ç¨¿=[0.7] - ãæ°å¼ä¸åãå°åº=å ¨ç ææ =4927161.7743 å=None - 导åº=[-4927151.8] - å®ç¨¿=[7.2] - ãæ°å¼ä¸åãå°åº=å ¨ç ææ =4927161.7743 å=åå¸å·è§ä¸è§ä¸å æ¯ - 导åº=[4927161.8] - å®ç¨¿=[2.8] ### è´§è¿éæå - ãæ°å¼ä¸åãå°åº=仿¡ ææ =156.5243 å=None - 导åº=[-146.5] - å®ç¨¿=[8.5] - ãæ°å¼ä¸åãå°åº=仿¡ ææ =156.5243 å=åå¸å·è§ä¸è§ä¸å æ¯ - 导åº=[156.5] - å®ç¨¿=[1.5] - ãæ°å¼ä¸åãå°åº=仿¡ ææ =156.5243 å=忝 - 导åº=[5.842293233082707, -0.0671, 0.07055908161393112] - å®ç¨¿=[5.84229323308271, -0.0670692068904155, 0.0705590816139312] - ãæ°å¼ä¸åãå°åº=å ¨ç ææ =31399.8248 å=None - 导åº=[-31389.8] - å®ç¨¿=[7.6] ### 轨éã轮渡 - ãæ¡æ°/ç»æä¸åãå°åº=å ¨ç ææ =轨é客è¿éï¼ä¸äººæ¬¡ï¼ å=8æä¸å»å¹´åæ¯ - 导åº=[0.017262201006441602, -0.03770383321016857] - å®ç¨¿=[-0.0377038332101686] - ãæ¡æ°/ç»æä¸åãå°åº=å ¨ç ææ =轨é客è¿éï¼ä¸äººæ¬¡ï¼ å=忝 - 导åº=[0.11922334580043414, -0.1488617459638799, -0.02133363151813339] - å®ç¨¿=[0.119223345800434, -0.14886174596388, -0.0213336315181334] - ãæ°å¼ä¸åãå°åº=å ¨ç ææ =轨é客è¿éï¼ä¸äººæ¬¡ï¼ å=ç´¯è®¡åæ¯ - 导åº=[7.79099782980099, -0.016560980913004952] - å®ç¨¿=[-0.0025188167282626, -0.016560980913005] - ãæ¡æ°/ç»æä¸åãå°åº=å ¨ç ææ =è½¨éæ å®¢å¨è½¬éï¼ä¸äººå ¬éï¼ å=8æä¸å»å¹´åæ¯ - 导åº=[0.030026968528849673, -0.05840192416196366] - å®ç¨¿=[-0.0584019241619637] ## åãæ°æ®å ¥åºç°ç¶ï¼å·®å¼æ ¹å ï¼ | æ°æ®è¡¨ | å·²ææ¥è¡¨æ | |---|---| | `freight_turnover_import`ï¼è´§è¿éå¨è½¬éï¼ | 2021-12 / 2022-12 / 2023-12 / 2024-12 / 2025-12 / 2026-01~08ï¼å ± 13 æ à 18 è¡ï¼ | | `h2031_enterprise_monthly`ï¼å ¬è·¯æ å®¢ï¼ | 2025-02~2025-12ã2026-01~08ï¼**缺 2025-01**ï¼ | | `passenger_individual_monthly`ï¼ä¸ªä½æ·ï¼ | 2025-01~12ã2026-01~08 | | `city_bus_monthly`ï¼å ¬äº¤ï¼ | **åªæ 2026-01~08** | | `city_taxi_monthly`ï¼åºç§ï¼ | **åªæ 2026-01~08** | | `wyc_order_monthly`ï¼ç½çº¦è½¦è®¢åï¼ | **åªæ 2026-01~08** | | `wyc_total_monthly`ï¼ç½çº¦è½¦æ»éï¼ | **åªæ 2026-01~08** | ç»è®ºï¼**åå¸å®¢è¿ç±»ï¼å ¬äº¤/åºç§/ç½çº¦è½¦ï¼2025 å¹´æ´å¹´æ°æ®æ²¡æå¯¼å ¥**ï¼è¿æ¯æ±æ»å¤§è¡¨éè¿å å¼ è¡¨ä¸å®ç¨¿å·®å¼ç主å ã ## äºãæ¬æ¬¡åæ¶å®æçä¸¤ä»¶äº 1. **`2024-12` ä¸å¹´åæåå¡«**ï¼ç¨ 7 ææä»¶ï¼å« `2023` Sheetï¼é导ï¼`2024-12` ç `last_*` ç°å·²çäº `2023-12`ã - ä¸é踩åï¼å ç¨ openpyxl å¦åä¸´æ¶æä»¶ï¼**å ¬å¼ç¼åå¼ä¸¢å¤±**ï¼å¯¼è´ `æ¹åç`ï¼`=SUM()` è¡ï¼è¢«åæ 0ï¼æ¹ç¨åå§ 7 ææä»¶é导åä¿®å¤ã - 夿 ¸ï¼7 æ/8 æä¸¤ä¸ªæä»¶ç 11 个年度 Sheet ä¸åºéæ ¼æ¯å¯¹ï¼**432 æ ¼ à 11 = 4,752 æ ¼å ¨é¨ 0 ä¸ä¸è´**ï¼ä¸å¹´åæé¾æ¡ 2022â2021ã2023â2022ã2024â2023ã2025â2024ã2026-07/08â2025 å ¨é¨ 0 ä¸ä¸è´ã 2. **H203-1 两å**ï¼æè¦æ±ä¸é导ï¼2026-01~08 ç `ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç ` / `å¡«æ¥åä½` ä¿æç©ºã ## å ãå¾ ç¨æ·ç¡®è®¤çå¤ç½® 1. æ¯å¦å¯¼å ¥ **2025 å¹´å ¬äº¤/åºç§/ç½çº¦è½¦ææ¥**ï¼1-12 æï¼ï¼å¯¼å ¥åè¿å å¼ è¡¨çåæ¯ä¸ 2025 年累计å³å¯ä¸å®ç¨¿å¯¹é½ã 2. ` è´§è¿` 表çè¡åç»æï¼å¯¼åº 6 è¡ / å®ç¨¿ 4 è¡ï¼ä»¥åªè¾¹ä¸ºåï¼ 3. 导åºç«¯ãä¸å£å¾åæãç彿忝å¦ä¿çï¼ docs/¹¦ÄܲâÊÔ±¨¸æ/»õÔËÀÛ¼ÆÁк˶ÔÓëµ¼ÈëÊý¾ÝÌå¼ì_2026-09-16.md
New file @@ -0,0 +1,82 @@ # åè½æµè¯æ¥å_è´§è¿é¡µç¾ç´¯è®¡åæ ¸å¯¹ä¸ 9/16 å¯¼å ¥æ°æ®ä½æ£_2026-09-16 ## ä¸ãåè½/ä»»å¡è¯´æ é对两个ä¸å¡é®é¢åæ ¸å¯¹ï¼ 1. 9/16 æ°å¯¼å ¥çãé路客è¿ï¼H2031/ä¸ªä½æ·ï¼ãä¸ãé路货è¿ï¼H2032/è´§è¿éå¨è½¬éï¼ãæ°æ®æ¯å¦åå¨éè¯¯ï¼ 2. æ±æ»å¤§è¡¨ã è´§è¿ã页ç¾çã累计ãåï¼ä¸ºä»ä¹åªæåå 个è½åäººå·¥æ ¸ç®å¯¹ä¸ã ## äºãæµè¯ç¯å¢ - å端ï¼Spring Boot 8090ï¼`/api/report/export/summaryWorkbook`ï¼ãMySQL 127.0.0.1:3308/traffic_audit - 导åºä»¶ï¼`_fresh_summary_2026-08.xlsx`ï¼period=2026-08&mode=monthï¼SHA 尺寸 950,186 åèï¼ - åç §ä»¶ï¼ - `D:\05_æ°æ®åç±»\é«é\å®ç¨¿-æ¹åçåå¸å·è¿è¾éæ°æ®ï¼2026å¹´1-8æï¼.xlsx`ï¼å« 2026å¹´/2025å¹´/2024å¹´/2022å¹´/2021å¹´ 页ï¼**æ 2023 页**ï¼ - `D:\05_æ°æ®åç±»\è´§è¿\7æ\å®ç¨¿-æ¹åçåå¸å·è¿è¾éæ°æ®ï¼2026å¹´1-7æï¼.xlsx`ï¼å« 2023 é¡µï¼ - `D:\05_æ°æ®åç±»\æ±æ»è¡¨\8ææ±æ»å®ç¨¿\2026å¹´8æå®¢è¿éãè´§è¿éå®ç¨¿.xlsx` - æ¯çï¼`docs/çææ±æ»å¤§è¡¨/çæ_éè·¯è¿è¾éæ±æ»è¡¨.xlsx`ï¼Sheetã è´§è¿ãï¼ - æ¹æ³ï¼å æè¯ä¹é®ï¼å°åº+ææ +åæ é¢ï¼å¯¹é½ï¼åéæ ¼æ¯å¯¹ï¼å¯¼åºç«¯å ¬å¼ç¨æ¬å°æ±å¼å¨ `_hy*.py` è¿åï¼openpyxl data_only 读ä¸å°å ¬å¼ç¼åï¼ã ## ä¸ãç»è®ºä¸ï¼æ±æ»è¡¨ã è´§è¿ãé¡µç¾ 6 个ã累计ãåæ ¸å¯¹ 页ç¾ä¸å ±æ 6 个累计åï¼åå«ä¸º S(2026 å¹´ 1-8 æ)ãAT(2025 å¹´)ãBV(2024 å¹´)ãCW(2023 å¹´)ãDZ(2022 å¹´)ãEO(2021 å¹´)ã ä»¥å ¨çè¡ãè´§è¿éã为ä¾ï¼åä½ï¼ä¸å¨ï¼ï¼ | 年度 | å | æ±æ»è¡¨æ¾ç¤º | æºæä»¶æ ¸ç®å¼ | å·®å¼ | ç»è®º | |---|---|---|---|---|---| | 2026(1-8æ) | S | 130311.8927 | 130311.8927 | 0.0000 | ä¸è´ | | 2025 | AT | 195433.2232 | 195433.2232 | 0.0000 | ä¸è´ | | 2024 | BV | 184938.5780 | 184938.5780 | 0.0000 | ä¸è´ | | 2023 | CW | 173045.2932 | 173045.2964 | **-0.0033** | ä¸ä¸è´ | | 2022 | DZ | 144979.2854 | 144979.2825 | **+0.0029** | ä¸ä¸è´ | | 2021 | EO | **空** | 161309.5316 | **-161309.5316** | **æ´å缺失** | ãè´§ç©å¨è½¬éãè¡ç»è®ºç¸åï¼2026/2025/2024 ä¸è´ï¼2023 å·® -0.0017ã2022 å·® +0.0025ã2021 æ´å为空ã å¸å·è¡ï¼17 å¸å·ï¼2026/2025/2024/2023/2022 ä¸åºå æ°æ®éæ ¼ä¸è´ï¼å·®å¼åªåºç°å¨ãå ¨çãè¡ä¸ 2021 åã ### åå ï¼å·²å®ä½å°æ¯çï¼ 1. **2021 å¹´åï¼EOï¼å¨æ¯çéæ ¹æ¬æ²¡æå¼**ï¼`çæ_éè·¯è¿è¾éæ±æ»è¡¨.xlsx` ç ` è´§è¿` 页 `EO5` = 空ã`EP5`ï¼ç´¯è®¡åæ¯ï¼= 空ï¼è `EC5:EN5`ï¼2021 å¹´ 1-12 æï¼é½æå¼ï¼å计 161309.5316ãå³**æ¯çæ¼å¡«äº 2021 å¹´çç´¯è®¡å ¬å¼**ã8 æå®ç¨¿åæ ·ä¸ºç©ºï¼`EP` 为空ï¼ï¼è¯´ææ¯åå²éçãéæ¬æ¬¡å¯¼åºé æã 2. **2022 å¹´åï¼DZï¼å¨æ¯ç鿝忻ç常é**ï¼`DZ5 = 144979.285376043`ï¼ç±»åæ¯æ°å¼ï¼ä¸æ¯å ¬å¼ï¼ï¼`EA5`ï¼ç´¯è®¡åæ¯ï¼= -0.101235470414284 乿¯å¸¸éãå®çäºæ¯çèªèº« 2022 å¹´åæå¼ä¹åï¼ä½ä¸ç°æºæä»¶ `2022å¹´` 页æ¹åçè¡ï¼144979.2825ï¼å·® 0.0029 ââ æ¯ç 2022 å¹´åææ¯å½å¹´æå·¥å½å ¥çæ§ç²¾åº¦æ°æ®ï¼å¦ 1 æ 10709.5265 vs æºæä»¶ 10709.5234ï¼ï¼**ä¸ä¼åéæ°æ®å·æ°**ã 3. **2023 å¹´åï¼CWï¼è½æ¯å ¬å¼ï¼ä½è¾å ¥æ¥èªæ¯ç**ï¼æ¯ç 2023 å¹´å ¨çè¡æ¯ãè§ä¸+è§ä¸ã两è¡ç¸å ï¼ç²¾åº¦ä¸æºæä»¶ `2023` 页æ¹åçè¡ä¸åï¼å计差 0.0033ï¼å ¨çè¡ï¼ãå¸å·è¡ä¸è´ã 4. 2026/2025/2024 ä¸å¹´ä¹æä»¥è½å¯¹ä¸ï¼æ¯å 为æ¯çè¿ä¸åçåæå¼ä¸ç°æºæä»¶å®å ¨ä¸è´ï¼éæ ¼ 0 å·®å¼ï¼ï¼ä¸ä»£ç `SummaryWorkbookFiller.fillFreightSheet` æ¯æ¬¡å¯¼åºåªåå¡«âç®æ 彿âä¸åï¼å岿份ä¸å¾æ²¿ç¨æ¯çï¼æä»¥æ¯ç对ä¸ä¸å°±æ´ä½å¯¹ä¸ä¸ã ### ä¿®å¤å»ºè®®ï¼å¾ ç¡®è®¤åæ§è¡ï¼ - æ¯ç ` è´§è¿` 页 EO åæåæå ¬å¼è¡¥é½ï¼`EO5 = EC5+EE5+EG5+EI5+EK5+EM5+EO5`⦠å®é åºä¸º 12 个æåï¼EC/ED/â¦/ENï¼ä¹åï¼EP è¡¥ç´¯è®¡åæ¯ã - DZ åæ¹ä¸ºå ¬å¼ï¼DM+DN+â¦+DX ä¹åï¼ï¼ä½¿å ¶éæ°æ®å·æ°ï¼é¿å ç»§ç»æ²¿ç¨ 2 使°åçæ§å¼ã - 2023/2022 ç 0.003 级差å¼å±æ¯çåå²å½å ¥ç²¾åº¦é®é¢ï¼å¦é䏿ºæä»¶å®å ¨å¯¹é½ï¼éææºæä»¶éå¡«è¿ä¸¤ä¸ªå¹´åº¦åã ## åãç»è®ºäºï¼9/16 æ°å¯¼å ¥æ°æ®ä½æ£ ### 4.1 æ¬æ¬¡å¯¼å ¥æ¸ åï¼import_batchï¼ | ç±»å | ææ¬¡ | è¡æ° | æ¥æºæä»¶ | |---|---|---|---| | FREIGHT_TURNOVER | 2021-12 / 2022-12 / 2023-12 / 2024-12 / 2025-12 / 2026-07 / 2026-08 | å 18 | å®ç¨¿-æ¹åçåå¸å·è¿è¾éæ°æ®ï¼2026å¹´1-8æ / 1-7æï¼.xlsx | | H2031ï¼å ¬è·¯æ å®¢ï¼ | 2025-02 ~ 2025-12ï¼11 æï¼ | 814/809/798/795/791/806/800/796/796/798/792 | å ¬è·¯æ 客è¿è¾æåº¦ç产æ åµï¼2025ï¼*.xls | | PASSENGER_AUTH | 2025-02 ~ 2025-12 | **0** | åä¸ | | PASSENGER_INDIVIDUAL | 2025-01 ~ 2025-12 | å 7 | æ¹åçå ¬è·¯æ 客è¿è¾ä¸ªä½æ·æåº¦ç产æ åµï¼2025.*ï¼.xlsx | | H2032ï¼é路货è¿ï¼ | 2025-04 | 664 | é路货ç©è¿è¾æåº¦ç产æ åµï¼2025å¹´4æï¼.xls | ### 4.2 åç°çé®é¢ | # | 严é度 | é®é¢ | è¯æ® | å½±å | |---|---|---|---|---| | 1 | é« | `h2032_enterprise_monthly` å¤åºä¸ä¸ª **2026-09 æ**ï¼å ¶æºæä»¶åå´æ¯ãé路货ç©è¿è¾æåº¦ç产æ åµï¼2026å¹´8æï¼.xlsãï¼2026-09-10 å¯¼å ¥ï¼batch id 302ï¼ | ä¸ 2026-08 æéä¼ä¸æ¯å¯¹ï¼å为 636 æ¡ã90 个åºåã**ä¼ä¸éåå®å ¨ç¸å**ï¼ä» 38 å®¶ä¼ä¸æ°å¼ä¸åï¼å ¨çå计 08=3665.3638 / 09=3690.5636 | 8 ææ¥è¡¨ä¸åå½±åï¼ç´¯è®¡åªå 1-8 æï¼ï¼ä½çæ 9 ææ¥è¡¨æ¶ä¼æè¿ä»½ã8 æå¯æ¬ã彿 9 ææ°æ® | | 2 | é« | `h2031_enterprise_monthly` **缺 2025-01** | 2025 å¹´åªæ 2025-02~2025-12 å ± 11 æï¼`import_batch` æ 2025-01 ç H2031 è®°å½ | å ¬è·¯æ 客 2025 å¹´ç´¯è®¡å° 1 个æï¼ãä¸å»å¹´åæ¯ãæ´ä½åç§» | | 3 | ä¸ | `passenger_individual_monthly` 2026-08 **缺é»åå¸**ï¼åªæ 6 æ¡ï¼å ¶ä½æä»½ 7 æ¡ï¼ | 2026-07 æ é»å/é»ç³/èé¨/éå·/è¥é³/åæÃ2ï¼2026-08 æ é»å | 2026-08 ç线å 车/å ¬è·¯æ»å®¢è¿çãå ¶ä¸ä¸ªä½ãå°é»åä¸å®¶ | | 4 | ä½ | PASSENGER_AUTH æ¯æ 0 è¡ | 11 ä¸ªæ¹æ¬¡ success_rows å为 0 | ææ å½±åï¼è¯¥å°è´¦æ¬ææ æææ°æ®ï¼ï¼ä½é确认æ¯å¦åºææ°æ® | | 5 | æç¤º | 2025-04 ç H2032 æ¤åç¼ºå¤±ï¼æ¬æ¬¡å·²è¡¥é½ | batch id 382ï¼664 è¡å ¨æå | å·²ä¿®å¤ | | 6 | æç¤º | h2032 åºåéåå¹´åº¦é´æåå¨ | 2025-12 æ 87 个åºåã2026-08 æ 90 个ï¼2026 æ°å¢ 420822/420921/420922/420982ï¼2025 ç¬æ 420161 | å±ä¼ä¸è¿éè§çæ£å¸¸åå¨ï¼ä» æç¤º | ### 4.3 å ¥åºæ½æ¥ï¼ä¸æºæä»¶é项对é½ï¼ - H2032 2025 å ¨å¹´è§ä¸è´§è¿é = 50117.0940 ä¸å¨ãè§ä¸å¨è½¬é = 7435040.9971 ä¸å¨å ¬é â 䏿±æ»è¡¨ 2025 累计å **å®å ¨ä¸è´**ã - H2032 2026 å¹´ 1-8 æè§ä¸è´§è¿é = 31399.8248 ä¸å¨ï¼éå¸å·ï¼æ¦æ± 10072.9811ãé»ç³ 1141.0468ãåå ° 97.1046ã宿 5925.3101ãè¥é³ 2528.7835ãéå· 861.4684ãèé¨ 632.9213ãåæ 1384.5256ãèå· 1278.1560ãé»å 5397.3567ãå¸å® 730.5726ãéå· 453.8854ãæ©æ½å· 46.4794ã仿¡ 156.5243ãæ½æ± 304.9884ãå¤©é¨ 347.0714ãæåº 40.6492ï¼â ä¸å¯¼åºä»¶ãè´§è¿éæåã累计表 **17/17 å ¨é¨ä¸è´**ã - FREIGHT_TURNOVER 2021~2026 åæåè®¡ä¸æºæä»¶å年度页æ±åä¸è´ï¼é¤ä¸è¡¨ 2021/2022/2023 ä¸å¤å·®å¼ï¼ã - 2026-09 ææ°æ®æ¥èªã2026å¹´8æãæä»¶ï¼å¤å®ä¸º**ææ¬¡é误**ï¼å»ºè®®æ ¸å®åå é¤ææ¹æã ## äºãéçé®é¢ 1. æ¯ç 2021 累计åï¼EO/EPï¼ç¼ºå¤±ã2022 累计å为常éï¼æ¯å¦ææä¿®æ¹éä¸å¡ç¡®è®¤ã 2. H2031 2025-01 è¡¥é½æéæºæä»¶å¾ ç¨æ·æä¾ã 3. h2032 ç 2026-09 èæå¤ç½®æ¹å¼å¾ 确认ï¼å é¤ or ä¿çæ¹åï¼ã ## å ãç»è®º - ãç´¯è®¡åªæåå 个对å¾ä¸ãçç´æ¥åå æ¯**æ¯çé 2021 累计å为空ã2022 累计åä¸ºåæ»å¸¸éï¼2023 累计åè¾å ¥ç²¾åº¦ä¸æºæä»¶ä¸ç¬¦**ï¼2026/2025/2024 ä¸å¹´ä¸æºæä»¶å®å ¨ä¸è´ã - æ¬æ¬¡å¯¼å ¥çãé路货è¿ãåå¨ 1 å¤ææ¬¡é误ï¼2026-09 å®ä¸º 8 ææ°æ®å¯æ¬ï¼ï¼ãé路客è¿ãåå¨ 2025-01 缺æã2026-08 ä¸ªä½æ·ç¼ºé»å两å¤ç¼ºå£ã docs/³ÇÊпÍÔË/ÍøÔ¼³µ²ð·Ö.xlsxBinary files differ
docs/³ÇÊпÍÔË/ÍøÔ¼³µ²ð·Ö_2026Äê7ÔÂ.xlsxBinary files differ
docs/ÉóºË½çÃæÔ±¨Ä£°å/Ä£°å_¹«Â·ÂÿÍÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2026£©.xlsxBinary files differ
docs/ÉóºË½çÃæÔ±¨Ä£°å/Ä£°å_³ÇÊй«¹²½»Í¨Ô¶ÈÔËÓªÇé¿ö£¨2026£©(1).xlsxBinary files differ
docs/ÉóºË½çÃæÔ±¨Ä£°å/Ä£°å_ÉóºË½á¹û.xlsxBinary files differ
docs/ÉóºË½çÃæÔ±¨Ä£°å/Ä£°å_ÉóºË½á¹û_.xlsxBinary files differ
docs/ÉóºË½çÃæÔ±¨Ä£°å/Ä£°å_ѲÓγö×âÆû³µÔËÓª·þÎñÇé¿öÔ±¨£¨2026£©(1).xlsxBinary files differ
docs/ÉóºË½çÃæÔ±¨Ä£°å/Ä£°å_µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2026£©(1).xlsxBinary files differ
docs/¹¤×÷ÈÕ½á/¹¤×÷ÈÕ½á_2026-09-05.md
New file @@ -0,0 +1,21 @@ # 工使¥ç»_2026-09-05ï¼å¨å å çï¼ ## 仿¥å·¥ä½ï¼åä¸ºæ°æ®åæä¸äº¤ä»ï¼æ ä»£ç æ¹å¨ï¼ 1. 8 æè´§è¿ä¼ä¸å¹³åè¿è·å¼å¸¸çéï¼å¤è½®å£å¾ï¼äº¤ä»æ¡é¢ï¼ï¼ - ä¸¥æ ¼å£å¾ï¼åæ¯>50% ä¸ ç¯æ¯>50% ä¸åæ¯/ç¯æ¯å¢éå>50kmï¼å½ä¸ 3 å®¶ï¼è°·åå©éãç¥åæ¶åå©ãæ¹ååæ¶ï¼ï¼ - å¤éå£å¾Aï¼åæ¯>50% ä¸ åæ¯å¢é¿é>50kmï¼70 å®¶ãå£å¾Bï¼åæ¯æç¯æ¯åèªå¢é>50kmï¼74 å®¶ï¼ä» ç¯æ¯æ°å¢ 4 å®¶ï¼ï¼åºå¯¹æ¯æä»¶ï¼ - âè´§ç©å¨è½¬é忝>è´§è¿é忝 ä¸ å¹³åè¿è·åæ¯>15% ä¸ å¢é¿é>50kmâï¼ä¸å«è½¨è¿¹å·®å¼çï¼106 å®¶ï¼å·²ä¸ 38 å®¶çï¼å«å·®å¼ç>30%ï¼æ ¸éªï¼å 38 å®¶å ¨é¨å å«ã 2. ä¸äººå·¥/åäºè¡¨ï¼ã8æé路货ç©ä¼ä¸è¿è·é®é¢æ±æ»æç»2ãï¼105 å®¶ï¼éå®¶æ ¸å¯¹ï¼ - å¯ä¸å·®å¼ï¼æ¹åé¿å³¡å¯ç¨ç»¿çµä¾åºé¾æéå ¬å¸ï¼106 å®¶çæãæç»2 æ ï¼ã - æ ¹å ï¼è¯¥ä¼ä¸ 2025-10 ç±âæ¹åä¸å³¡å¯ç¨ç»¿çµâæ¹åï¼ç³»ç»æç»ä¸ä¿¡ç¨ä»£ç è¯å«ä¸ºåæå¯æ¯ï¼2025-08 è¿è· 183.7â2026-08 238.0kmï¼å¢é 54.3km 贴线ï¼è½¨è¿¹æµç®å·®å¼ç 13%<30%ï¼ï¼åäºè¡¨æåç§°å¹é æªæ¥ä¸ã537 家坿¯æ ·æ¬ä¸æ¹åä¼ä¸ä» æ¤ 1 å®¶ã 3. çæãæ¬å¨å·¥ä½æ±æ¥æ¸ å_2026-08-31è³09-05.xlsxãï¼æ¡é¢ï¼ï¼ä¾å¨ä¸é¢å¯¼æ±æ¥ï¼å¾ åä¸éçå¦é¡µã ## æµè¯ç»ææè¦ - æ ä»£ç æ¹å¨ï¼çéç»æä¸æ°æ®åºéæ¡æ ¸å¯¹ï¼SQL ä¸èæ¬åå£å¾ä¸è´ï¼å¯æ¯ 537 å®¶ãå½ä¸æ°æ ¸éªéè¿ï¼ã ## éçé®é¢ä¸å¾ å - è¿è·å¼å¸¸ååå£å¾å¾ ç¨æ·å®ç¨¿ï¼70/74/106 å®¶ä¸é䏿å¦å®ï¼ï¼å®ç¨¿ååºæ£å¼é¢å¯¼çå¹¶ç»ç»ä¼ä¸æ ¸å®åé¦ã - âé¿å³¡/ä¸å³¡å¯ç¨âä¸å®¶æ¯å¦çº³å ¥ååå¾ ä¸å¡çå¤ã ## æå¤©è®¡å - å¨ä¸ï¼æç¨æ·å®ç¨¿å£å¾æ´çè¿è·å忣å¼çï¼ç»§ç» P1 å¾ åï¼æ¯çéª¨æ¶æäº¤ãåäºç模æ¿å ¼å®¹ãæèµ 8 æåºåéè·å®¡æ ¸ï¼ã docs/¹¤×÷ÈÕ½á/¹¤×÷ÈÕ½á_2026-09-16.md
New file @@ -0,0 +1,382 @@ # 工使¥ç»_2026-09-16 ## ä¸ãä»å¤©åäºä»ä¹ ### 1. ç¯å¢å¯å¨ - 11:12 ç¨ `start-dev.ps1` å¯å¨åå端ï¼å¯å¨å 8090/8080 å空é²ï¼ã - 就绪æ å¿ï¼å端 `Tomcat started on port(s): 8090` / `Started TrafficAuditApplication`ï¼å端 `Compiled successfully` / `App running at:`ã ### 2. ä¿®å¤ãç¨å±åç½ IP æå¼é¡µé¢åç»å½å¤±è´¥ã - **ç¨æ·åé¦**ï¼ç¨ `http://192.168.177.26:8080/` ç»å½æç¤ºãç½ç»é误ï¼ç»å½å¤±è´¥ãï¼è `http://localhost:8080/` æ£å¸¸ã - **ææ¥è·¯å¾**ï¼curl ç´ååä¸ URL ç POST `/api/auth/login` æ£å¸¸è¿åï¼è¯´æå端ä¸ä»£çé½éï¼â ç¨åºç¨å æµè§å¨å¨ LAN å°åå¤ç°ï¼ç¡®å®æç¤ºãç½ç»é误ï¼ç»å½å¤±è´¥ãï¼â 对æ¯åºå·®å¼åªå¨ `Origin` 头 â curl è¡¥ `Origin: http://192.168.177.26:8080` å¾å° `403 Invalid CORS request`ï¼æ ¹å è½å°ã - **æ ¹å **ï¼æµè§å¨ POST/PUT/DELETE å¿ å¸¦ `Origin`ï¼GET ä¸å¸¦ï¼ï¼9-14 è·¨åæ¶ç´§åç½åååªåäº `localhost:8080 / 127.0.0.1:8080`ï¼ç» dev-server 代ç转åè¿æ¥ç `Origin: http://192.168.177.26:8080` å½ä¸ä¸äºï¼è¢« `CorsFilter` 403 æ¦æã页颿¬èº«å `GET /api/auth/captcha-config` ä¸å¸¦ `Origin` æä»¥æ£å¸¸ï¼è¡¨ç°ä¸º"页é¢è½å¼ãä¸ç»å½å°±ç½ç»é误"ã - **顺带åç°**ï¼æå é¨ç½²ï¼å端å åµãç¨ `http://<é¨ç½²æºIP>:8090` 访é®ï¼æ¶ POST åæ ·å¸¦ `Origin: http://<IP>:8090`ï¼ä¹ä¼è¢« 403 æ¡ä½ç»å½ââå±äºåç±»éæ£ï¼æ¬æ¬¡ä¸å¹¶è§£å³ã - **æ¹å¨ï¼2 æä»¶ï¼**ï¼`CorsConfig.java` ç± `setAllowedOrigins` æ¹ä¸º `setAllowedOriginPatterns`ï¼é»è®¤æ¾è¡ `http://localhost:*`ã`http://127.0.0.1:*`ã`http://192.168.*:*`ã`http://10.*:*`ã`http://172.*:*`ï¼`application.yml` ç `app.cors.allowed-origins` åæ¥å¹¶è¡¥æ³¨éãç½ååæ ¡éªæºå¶ä¸ `allowCredentials=false` åæªæ¾æ¾ã - **éªè¯**ï¼æ PID ç²¾ç¡®åæ§å端é¾ï¼`cmd 3608 â java(maven) 23704 â java(app) 12636`ï¼åéå¯ï¼åºç¨å æµè§å¨å¨ LAN å°åå®ç»æåè¿å ¥ `#/dashboard`ï¼ç½ååè´åç¨ä¾ï¼`http://evil.example.com`ï¼ä» 403ã详è§ãåè½æµè¯æ¥å_å±åç½IP访é®ç»å½CORSä¿®å¤_2026-09-16.mdãã ## äºãæµè¯ç»ææè¦ - CORS ä¿®å¤ 12 æ¡ç¨ä¾å ¨éè¿ï¼æ£åï¼LAN æ¥æºãåæº 8090 æ¥æºãå ç½ç½æ®µæ¥æºã带令çä¸å¡æ¥å£ã颿£ OPTIONSï¼ãè´åï¼éæ³æ¥æº 403ï¼ãåå½ï¼localhost æ¥æºãæ Origin 头ï¼ã - ç宿µè§å¨ç«¯å°ç«¯ï¼`http://192.168.177.26:8080/#/login` è¾å ¥ `admin/123456` â æç¤ºãç»å½æåãâ 跳转工ä½å°ï¼é¡¶é¨æ¾ç¤º adminã - 仿¥æ å¯¼å ¥/æ°æ®åºåå ¥æä½ï¼æªåå ¥åºæ½æ¥ï¼æ¹å¨åªæ¶åè·¨åæ ¡éªï¼ä¸è§¦ç¢°æ°æ®é¾è·¯ï¼ã ## ä¸ãéçé®é¢ä¸å¾ å 1. **æ¹ç¨ååè®¿é®æ¶éè¡¥ç½åå**ï¼`app.cors.allowed-origins` é»è®¤åªè¦çæ¬æº + å ç½ç½æ®µï¼è¥å°æ¥ç¨ååæå ¬ç½ IP 访é®ï¼éæè¯¥æ¥æºï¼å«ç«¯å£ï¼è¿½å è¿å»ï¼yml 注éå·²åæï¼ã 2. `Login.vue` æææå¤±è´¥é½æç¤ºä¸ºãç½ç»é误ï¼ç»å½å¤±è´¥ãï¼403/500 è¿ç±»æååºçé误ä¹è¢«å½å°"ç½ç»"ï¼ææ¥æè¯¯å¯¼ï¼å»ºè®®åç»æç¶æç ç»åæç¤ºï¼æªåï¼çç¨æ·ç¡®è®¤ï¼ã 3. 9-15 éçç»§ç»æè´¦ï¼AI å¤åè±æè¡¥é½ï¼system prompt ä¼ä¸å/è§£éåææªè±æï¼ãä¿å¯æ°æ®é¨ç½²è·¯çº¿ç¡®è®¤ã4 å¼ æç»æ¥è¡¨æ¨¡æ¿æ©åãå®¡æ ¸æ¯å¯¹åºåç¼ºå¤±ä¿æ¤ã`sys_role` æéè½å°ã3D éªè¯ç ç产å¼å¯ã`backend.log` åå²æææ¸ çã 4. ä»åºæ ¹ç®å½ä»æå¤§éæªè·è¸ªä¸´æ¶æä»¶ï¼`_*.py`/`_*.sql`/`_*.ps1` çï¼æªè¢« `.gitignore` è¦çï¼æ¸ çåéç¨æ·ç¡®è®¤ã 5. **å ¬å¸ gitea 仿¥æ¨ä¸ä¸å»ï¼ç½ç»é®é¢ï¼éåæ®ï¼**ï¼TCP 3000 å¯è¿éï¼`Test-NetConnection` è¿å Trueï¼ï¼ä½ HTTP æ ååºââ`curl http://61.183.254.94:3000/r/trafficAudit.git/info/refs?service=git-upload-pack` 20 ç§è¶ æ¶ï¼`000`ï¼ï¼`git fetch gitea` ä¸ `git push gitea` åæ éæèµ·ï¼åçå¾ 2~4 åéåæå¨ç»æ¢ï¼ãå¾ ç½ç»æ¢å¤åè¡¥æ¨ï¼è¡¥æ¨åå `git fetch gitea` ä¸è¿ç«¯ `main` æ¯å¯¹åå¹¶ï¼ç¦å¼ºæ¨ï¼ã ## åãæå¤©è®¡å 1. ä¸ç¨æ·ç¡®è®¤åå/å ¶ä»è®¿é®æ¹å¼æ¯å¦éè¦ä¸å¹¶å ç½ååï¼å¹¶ç¡®è®¤ `Login.vue` é误æç¤ºç»åæ¹æ¡æ¯å¦å®æ½ã 2. æ¨è¿ AI å¤åè±æè¡¥é½ï¼çº¦ 20 è¡æ¹å¨ï¼ï¼å®æååãåè½æµè¯æ¥åãï¼æ²¿ç¨"å DeepSeek æå¡æå "忥æçº§éªè¯ã 3. ç»§ç»æ¨è¿æ¥è¡¨æ¨¡æ¿æ©å / å®¡æ ¸åºåä¿æ¤çæè´¦é¡¹ã ## äºãgit è®°å½ - æ¬æ¬¡æ¹å¨ï¼4 æä»¶ï¼ï¼`CorsConfig.java`ã`application.yml.example`ãæ¬æ¥åãæ¬æ¥ç»ã - 说æï¼`application.yml` 被 `.gitignore` 忽ç¥ï¼ä»åºå æ¨¡æ¿æ¯ `application.yml.example`ï¼ï¼æ 模æ¿åæ¥ä¿®æ¹åä¸å¹¶æäº¤ã - æµç¨ä¸ç»æï¼ 1. å åãåè½æµè¯æ¥åã䏿¬ã工使¥ç»ãï¼å `git fetch origin`ï¼giteeï¼`master`ï¼ââæ æ°æäº¤ï¼æ¬å°å·²å å«è¿ç«¯å ¨é¨æäº¤ï¼ 2. æäº¤ `0d2a5fc`ï¼`fix(cors): æ¾è¡å ç½ç½æ®µæ¥æºï¼ä¿®å¤å±åç½ IP è®¿é®æ¶ç»å½ 403`ï¼ 3. æ¨ä¸ªäººä»åº `origin`ï¼`git push origin main:master` æåï¼`82100d6..0d2a5fc`ï¼ï¼ 4. æ¨å ¬å¸ `gitea`ï¼`git fetch gitea`ã`git push gitea main:main` åå HTTP æ ååºèæèµ·ï¼æªæ¨éæåï¼è¯¦è§éçé®é¢ 5ï¼ï¼æ¬æ¬¡ä¸ºå¿«è¿æ¨éï¼ä¸æ¶å强æ¨ã --- ## å ãä¸å追å ï¼ä¸¤æ¡ç¨æ·éæ±ï¼2026-09-16ï¼ ### 1. æ 8 æå¯¼å ¥çãè´§è¿éå¨è½¬é表ãä¸ç 21â26 å¹´æ°æ®å ¨é¨è¯»å ¥æ°æ®åº - **èæ¯**ï¼ç¨æ· 8 æå¯¼å ¥ç `å®ç¨¿-æ¹åçåå¸å·è¿è¾éæ°æ®ï¼2026å¹´1-8æï¼.xlsx` ä¸ä¸ªå·¥ä½ç°¿å å« 5 个年度 Sheetï¼`2026å¹´ / 2025å¹´ / 2024å¹´ / 2022å¹´ / 2021å¹´`ï¼æºæä»¶æ 2023 å¹´ï¼ï¼èèé»è¾åªè¯»ç¬¬ 1 个 Sheet å¹¶æãå·¦åä»å¹´ 1âN æ / å³åå»å¹´ 1â12 æãçæåº¦æ¨¡æ¿è§£æï¼å ¶ä½å¹´åº¦æ°æ®è¢«ä¸¢å¼ã - **æ¹å¨ï¼å端 1 æä»¶ï¼+153/â19ï¼**ï¼`DataImportService.java` ä¸ `importFreightTurnover` æ¹ä¸ºåæµå ¥å£ï¼åé»è¾æ½ä¸º `importFreightTurnoverByMonth`ï¼éè¡ä¸åï¼ï¼æ°å¢ `detectYearSheets`ï¼è¯å«å¤å¹´åº¦å·¥ä½ç°¿ï¼ã`importFreightTurnoverByYear`ï¼æå¹´å ¥åº + ä¸å¹´åæåèªä¸ä¸å¹´åº¦ Sheetï¼ã`parseWholeYearSheet`ï¼æ´å¹´ Sheet çè´§è¿éå/å¨è½¬éåè§£æï¼ã`persistFreightTurnover`ï¼ææ¥è¡¨æå å åæå¹¶è®°æ¹æ¬¡ï¼ã - **ç»æ**ï¼æºæä»¶ 5 ä¸ªå¹´åº¦å ¨é¨å ¥åºï¼è¿åãå ± 90 æ¡è®°å½ãï¼æ¥è¡¨æä¸º `2021-12 / 2022-12 / 2024-12 / 2025-12 / 2026-08`ï¼æ¯æ 18 è¡ï¼ä¸æºæä»¶é项æ¯å¯¹ **1080 个åå æ ¼é¶å·®å¼**ï¼éå¤å¯¼å ¥å¹çï¼å ¨è¡¨ 216 è¡ md5 ååä¸è´ï¼ï¼éå¤å¹´åº¦æä»¶èªå¨åéåæåº¦è·¯å¾ã - 详è§ãåè½æµè¯æ¥å_è´§è¿éå¨è½¬éå¤å¹´åº¦å¯¼å ¥_2026-09-16.mdãã ### 2. æ¥è¡¨çæ-æ±æ»å¤§è¡¨é¢è§ï¼å æãä¸å£å¾ãä¹åçè¡¨æ ¼ - **æ¹å¨ï¼å端 1 æä»¶ï¼åè¡ï¼**ï¼`ReportExport.vue` 第 133 è¡ç± `v-else-if="it.summary && it.summary.length"` æ¹ä¸º `v-if="it.key !== 'summaryWorkbook' && it.summary && it.summary.length"`ãæ ¹å æ¯ä¸é¢çæ±æ»è¡¨ç¨ `v-if`ã第äºå¼ è¡¨ç¨ `v-else-if`ï¼å¯¹ `summaryWorkbook` ä¹ç §æ ·æ¸²æã - **éªè¯ï¼æ¨ç¿»ä¸ä¸è½®çæ æåè¯ï¼**ï¼æ©ææªå¾æ²¡æå°å¼¹çªãAX æ 读å°çæ¯ç¼åï¼åä¸ºæ æè¯æ®ï¼æ¬è½®æ¹ç¨ `tab.playwright.evaluate` ç´æ¥è¯» DOM ââ å¼¹çªå æä¸ä» æ 1 å¼ è¡¨ï¼`preview-summary wb-table`ï¼12 è¡ææ ï¼ï¼è¡¨æ ¼ä¸æ¹åªæä¸¤æ¡åæ¯ç¼ºå¤±æç¤ºä¸ãå ³éãæé®ï¼**第äºå¼ è¡¨å·²å½»åºæ¶å¤±**ãæææªå¾ï¼`_qa_out/preview_summaryWorkbook_2026-08_verified_20260916.png`ï¼æ¬è½®å¤æ ¸éæ `..._verified2_20260916.png`ï¼å 54006 åèï¼ã - 详è§ãåè½æµè¯æ¥å_æ±æ»å¤§è¡¨é¢è§å é¤ä¸å£å¾åæç»è¡¨_2026-09-16.mdãã ## ä¸ãæµè¯ç»ææè¦ï¼ä¸å追å é¨åï¼ - å¤å¹´åº¦å¯¼å ¥ï¼12 æ¡ç¨ä¾å ¨éè¿ââæ£åï¼å¤å¹´åº¦å ¥åºã1080 åå æ ¼éé¡¹æ½æ¥é¶å·®å¼ãæ¥è¡¨æè¯ä¹ãä¸å¹´åæãæ¹æ¬¡è®°å½ï¼ãè´åï¼å Sheet æåº¦æ¨¡æ¿åéãé年度å½åå Sheet åéãæ··åå½ååéãé Excel æä»¶æ¥éï¼ãå¹çï¼éå¤å¯¼å ¥å ¨è¡¨ md5 ä¸è´ï¼ãåå½ï¼æµè¯ææ¸ çå¹²åãç宿份 216 è¡ / 12 æå£å¾ä¸åï¼ã - é¢è§å¼¹çªï¼7 æ¡ç¨ä¾å ¨éè¿ââDOM 宿µå¼¹çªå `table` æ°é为 1ãç±»åä¸è¡æ°æ£ç¡®ã12 è¡æ°å¼ä¸åæ¯å®æ´ãè¡¨æ ¼ä¸æ¹æ 第äºå¼ 表ã`git diff` ä» 1 è¡æ¹å¨ä¸åå½ã - æµè¯ææ¸ çï¼`2099-01` ~ `2099-04` å ¨é¨ç¨ `POST /api/import/clear?period=â¦` æ¸ ç©ºï¼å dataRows=18ãbatchRows=1ï¼ï¼å½ååº **0 æ¡ 2099 æ®ç**ã`freight_turnover_import` 216 è¡ / 12 个æ¥è¡¨æã ## å «ãéçé®é¢ä¸å¾ åï¼æ´æ°ï¼ 1. **`2021-12` çæ¥è¡¨ææ¯ãæ´å¹´ãè¯ä¹**ï¼è¿äºææ¿è½½è¯¥å¹´ 1â12 æå ¨å¹´æ°æ®ï¼èé 12 æåæï¼åç»æ¥è¡¨/å®¡æ ¸è¥æåæå£å¾åæ°éç¨æ·ç¡®è®¤å£å¾ï¼å¿ è¦æ¶åæ¹é ã 2. **æºæä»¶ç¼º 2023 å¹´ Sheet**ï¼å¯¼è´ä¸çæ `2023-12`ï¼`2024-12` æ ä¸å¹´åæã屿ºæ°æ®ç¼ºå£ã 3. **`2026-01` ~ `2026-07` ç `last_*` 为空**ï¼ç»æ¯å¯¹æ¹å¨åå¤ä»½ï¼`2026-04` ç INSERTï¼ç¡®è®¤è¿å ææ¹å¨åå³ä¸ºç©ºï¼ä¸æ¬æ¬¡å¯¼å ¥æªè§¦ç¢°è¿äºæ¥è¡¨æï¼æ¹æ¬¡åªè¦ç 5 个æï¼ï¼**éæ¬æ¬¡æ¹å¨å¼å ¥**ï¼å¦éè¡¥ä¸å¹´åæééæ°å¯¼å ¥å¯¹åºå¹´åº¦æ°æ®ã 4. **æ¹å¨åçå¤ä»½ä¸å®æ´**ï¼`_backup_freight_turnover_before_multiyear_20260916.sql` ä» 59642 åèãåªè§£æåº `2026-04` ä¸å¤ INSERTï¼**ä¸è½ä½ä¸ºå®æ´åæ»ä¾æ®**ã 5. å¼¹çªå ãå ± 0 è¡ãä¸ãæåº¦è¦çï¼1~8æåææ°æ®ãå£å¾ä¸åï¼åè æ¯æç»è¡æ°ï¼ï¼æè¯¯è§£ï¼å¯èèæ¹ææ¡ï¼æªåï¼çç¨æ·ç¡®è®¤ï¼ã 6. ä¸åéçç»§ç»æè´¦ï¼åå/å ¬ç½è®¿é®çç½ååè¡¥å ã`Login.vue` é误æç¤ºç»åãAI å¤åè±æè¡¥é½ã4 å¼ æç»æ¥è¡¨æ¨¡æ¿æ©åãå®¡æ ¸æ¯å¯¹åºåç¼ºå¤±ä¿æ¤ã`sys_role` æéè½å°ã3D éªè¯ç ç产å¼å¯ã`backend.log` åå²æææ¸ çãä»åºæ ¹ç®å½ä¸´æ¶æä»¶æ¸ çã 7. **å ¬å¸ gitea ä»å¾ è¡¥æ¨**ï¼ç½ç»é®é¢ï¼éåæ®ï¼ï¼è¡¥æ¨åå `git fetch gitea` ä¸è¿ç«¯ `main` 对æ¯åå¹¶ï¼ç¦å¼ºæ¨ã ## ä¹ãæå¤©è®¡å 1. ä¸ç¨æ·ç¡®è®¤ `2021-12` / `2022-12` çãæ´å¹´æ¥è¡¨æãçä¸å¡å£å¾ï¼ä»¥åæ¯å¦éè¦æå¹´åº¦æ°æ®ææéææ¥è¡¨æã 2. 确认æ¯å¦éè¦è¡¥ 2023 å¹´æ°æ®ã以å `2026-01`~`2026-07` çä¸å¹´åææ¯å¦éè¦è¡¥é½ã 3. è§ç¨æ·æè§å¤çé¢è§å¼¹çªãå ± 0 è¡ãææ¡ã 4. ç½ç»æ¢å¤åè¡¥æ¨å ¬å¸ giteaã --- ## åãåæè¿½å ï¼ç¬¬ 3 è½®ç¨æ·åé¦ 6 æ¡ï¼2026-09-16ï¼ ç¨æ·æ¬è½®æåº 6 æ¡åé¦ï¼éæ¡å¤çç»æå¦ä¸ï¼ | # | ç¨æ·åé¦ | å¤çç»æ | |---|----------|----------| | 1 | 21â26 å¹´è´§è¿éå¨è½¬éè¡¨æ°æ®å ¥åº | ä¸è½®å·²å®æï¼`0cfd6e0`ï¼ï¼æ¬è½®è¡¥é½ 2023 å¹´ï¼è§ #2ï¼ | | 2 | ç¨æ·æ ¸å®ã23 å¹´æ 12 æçæ°æ®ã | **å±å®**ã8 ææºæä»¶ç¡®å®æ²¡æ 2023 å¹´ Sheetï¼ä½ 7 ææä»¶ `D:\05_æ°æ®åç±»\è´§è¿\7æ\å®ç¨¿-æ¹åçåå¸å·è¿è¾éæ°æ®ï¼2026å¹´1-7æï¼.xlsx` éæä¸ä¸ªå为 `2023` ç Sheetãå·²å¦å `_2023_import_tmp.xlsx`ï¼`2023` + `2022å¹´` 两个 Sheetï¼å¯¼å ¥ï¼çæ `2023-12`ï¼18 è¡ï¼ï¼**432 é¡¹éæ ¼æ¯å¯¹é¶å·®å¼** | | 3 | è¦ä¸ä»½ãææè¦æ³¨æçç¹ãçæ±æ»ææ¡£ | æ°å»º `docs/é®é¢æ±æ»/é®é¢ä¸æ³¨æäºé¡¹æ±æ»_2026-09-16.md`ï¼11 ç« + éæ¥è¡¨ï¼å«å¯å¨/è¿ç¨ãæ¥å¿éªè¯ãæ°æ®åºãå¯¼å ¥è·¯å¾ä¸ææ¬¡çº¦å®ãæ¥è¡¨ãéªè¯ç ãæä»¶ç¼ç ãæµè§å¨åè¯ãgit åä»åºãéçé®é¢ï¼ | | 4 | æ¢ WiFi åç»å½é¡µåºç°éªè¯ç ç½æ¡ + ãéªè¯ç å 载失败ã | 已修å¤ï¼å端é»è®¤å¼ + fail-safeï¼ï¼æ¬è½®æµè§å¨å¤æµéè¿ | | 5 | é¢è§ç¹ä¸ä¸å¼¹ã导åºå¤±è´¥ï¼è¯·ç¡®è®¤å¯¼å ¥æ°æ®ã | å·²ä¿®å¤æç¤ºé»è¾ï¼åºåç½ç»/å端åå ï¼ï¼å¦å¤ä¸¤å°é¡¹ï¼ææ éä½ãå¼¹çªæå¨åè§ï¼æ¬è½®æµè§å¨å®æµéè¿ | | 6 | å ¬è·¯æ 客 H203-1 模æ¿è¢«ä¿®æ¹ | å·²éé å¹¶éªè¯ï¼æ°å¢ `ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç ` / `å¡«æ¥åä½` 两åå ¥åºï¼æ°èæ ¼å¼ååå ¼å®¹ | ### 1. 2023 å¹´è´§è¿æ°æ®è¡¥å½ï¼ç¨æ·ç¬¬ 2 æ¡ï¼ - **ææ¥è¿ç¨**ï¼å 确认 8 ææºæä»¶ 5 个 Sheet å ¨ä¸ºå¯è§ãæ 2023ï¼åå ¨çæç´¢ `*è¿è¾é*`ã`*23å¹´*`ã`*è´§è¿é*` æä»¶åï¼æåæ«æ `D:\05_æ°æ®åç±»` ä¸ `D:\æ¡é¢` 䏿æ `.xlsx` ç **Sheet å**ï¼å½ä¸ 7 ææä»¶ç `2023` Sheetã - **ä¸è´æ§é¢æ£**ï¼7 æä¸ 8 ææä»¶ç `2021å¹´ / 2022å¹´ / 2024å¹´` ä¸å¹´æ°æ®éæ ¼æ¯å¯¹ï¼`onlyJuly / onlyAug / differ` å ¨ä¸ºç©º â ä¸å¹´**é¶å·®å¼**ï¼å¯å®å ¨ç¨ 7 ææä»¶è¡¥ 2022ï¼ä½ä¸º 2023 çä¸å¹´åææ¥æºï¼ã - **å¯¼å ¥**ï¼`POST /api/import/freightTurnover?period=2023-12`ï¼è¿åãå ± 36 æ¡è®°å½ãã - **éªè¯**ï¼`2023-12` 18 è¡ï¼è´§è¿é + å¨è½¬éå ± 432 é¡¹ä¸ Excel éæ ¼æ¯å¯¹ **mismatches=0**ï¼`last_*` ä¸ `2022-12` éå¼ç¸åï¼å ¨é¨æ¥è¡¨æ 2021-12 â 2026-08 å ± 13 æãæ¯æ 18 è¡ã - 详è§ãåè½æµè¯æ¥å_è´§è¿éå¨è½¬é2023å¹´æ°æ®è¡¥å½_2026-09-16.mdãã ### 2. H203-1 æ¨¡æ¿æ°å¢åéé ï¼ç¨æ·ç¬¬ 6 æ¡ï¼ - **æ¨¡æ¿ diff ç»è®º**ï¼Sheet1 ç± 773Ã50 â 816Ã52ï¼å¨ãä¼ä¸åç§°ãåæå ¥ `ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç `ã`å¡«æ¥åä½` 两åï¼å ¶ä½ 48 åæ´ä½å³ç§»ã - **æ¹å¨ 6 å¤**ï¼åº DDLã`docs/init.sql`ã`docs/database.md`ã`PassengerEnterpriseMonthly.java`ã`DataImportService.java`ã`DataViewController.java`ï¼æ°æ®æ¥ç页åï¼ã - **éªè¯**ï¼æ°æ¨¡æ¿å¯¼å ¥ 814 æ¡ 0 失败ï¼åé¡¹æ±æ»ï¼å®¢è¿è½¦è¾ 24584 / æ ¸å®è½½å®¢ä½ 711018 / 客è¿é 16371625 / å¨è½¬é 1023386179ï¼ä¸æºæä»¶å ¨çï¼èæ ¼å¼ `.xls` å¯¼å ¥ 767 æ¡ 0 å¤±è´¥ä¸æ°åæå¼ï¼**èæä»¶å ¶å®ä¹å¸¦è¿ä¸¤å**ï¼ï¼æ°å¼ä¸æ¢æ 2026-08 å®å ¨ä¸è´ï¼è´åç¨ä¾ï¼ééç±»åï¼æ¥éæ¸ æ°ã - **è¿ç¨ä¸ç失误**ï¼`docs/database.md` é `| enterprise_name | varchar(200) | ä¼ä¸åç§° |` åºç° 4 次ï¼é¦æ¬¡æ¹éæ¿æ¢è¯¯æ¹ 3 å¼ è¡¨ï¼å·² `git checkout` åéåæ¹ä¸ºãæªåç« èåæ¿æ¢ãã - 详è§ãåè½æµè¯æ¥å_H2031æ¨¡æ¿æ°å¢åéé _2026-09-16.mdãã ### 3. ç»å½éªè¯ç 容é + æ¥è¡¨é¢è§æ´æ¹ï¼ç¨æ·ç¬¬ 4ã5 æ¡ï¼ - **éªè¯ç **ï¼`Login.vue` é»è®¤ `captchaRequired=false`ï¼æ¹ä¸º fail-safeï¼ä» å端æç¡®è¿å `required===true` ææ¾ç¤ºï¼ï¼æ¢ WiFi/å端ä¸å¯è¾¾æ¶ä¸åæ®çéªè¯ç ç½æ¡ã - **失败æç¤º**ï¼`failWith(err, action)` + `errReason(raw)` éåï¼åºåãè¿ä¸ä¸æå¡å¨ãä¸ãå端çå®åå ãï¼é¢è§è°ç¨å¸¦ `action='é¢è§'`ï¼Blob é误å `text()` åè§£æã - **ææ éä½**ï¼é¢è§è¡¨å¤´ç± 3 å补为 4 åï¼åç±»/ææ /æ°æ®/忝ï¼ï¼å®æµ x åæ 35 / 118 / 394 / 587ï¼`16888.76` è½å¨ãæ°æ®ãåã - **å¼¹çªæå¨ + åè§**ï¼æ°å¢ `dialogDrag.js` æä»¤ï¼Element UI 2.15.14 æ `draggable`ï¼ï¼`border-radius:10px`ï¼å®æµæå¨ `(0,40) â (120,200)`ï¼`transform=matrix(1,0,0,1,120,160)`ï¼å ³éåå¤ä½ `none`ã - ãä¸å£å¾ä¹åä¸å渲æè¡¨æ ¼ãä¸è½®å·²ä¿®ï¼æ¬è½®å¤æ ¸å¼¹çªå **æä¸ä» æä¸å¼ 表**ã - 详è§ãåè½æµè¯æ¥å_ç»å½éªè¯ç 容é䏿¥è¡¨é¢è§æ´æ¹_2026-09-16.mdãã ### 4. 注æäºé¡¹æ±æ»ææ¡£ï¼ç¨æ·ç¬¬ 3 æ¡ï¼ æ°å»º `docs/é®é¢æ±æ»/é®é¢ä¸æ³¨æäºé¡¹æ±æ»_2026-09-16.md`ï¼å ± 11 ç« ï¼ éæ¥è¡¨ï¼10 æ¡ï¼ãå¯å¨ä¸è¿ç¨ç®¡çãæå¡ç¶æéªè¯ãæ°æ®åºãæ°æ®å¯¼å ¥ï¼è·¯å¾ + ææ¬¡çº¦å® + å¤å¹´åº¦å·¥ä½ç°¿è¯å«è§åï¼ãæ¥è¡¨çæãç»å½ä¸éªè¯ç ãæä»¶åå ¥ä¸ææ¬å¤ççåãæµè§å¨èªå¨ååè¯çåãGit åä»åºå·¥ä½æµãå½åå·²ç¥éçé®é¢ã ## åä¸ãæµè¯ç»ææè¦ï¼åæè¿½å é¨åï¼ - **2023 è¡¥å½**ï¼5 æ¡ç¨ä¾ï¼ï¼æ£åå ¥åºã432 é¡¹éæ ¼æ¯å¯¹é¶å·®å¼ãä¸å¹´åæåèª 2022ãæ¥è¡¨ææ¸ åæ éå¤/æ æ®çã2022-12 éååéå¼ä¸å ââ å ¨é¨éè¿ã - **H203-1 æ°å¢å**ï¼9 æ¡ç¨ä¾ï¼ï¼æ°æ¨¡æ¿ 814 æ¡ 0 失败ã两å 814/814 æå¼ãé¦è¡ä¸æ±æ»å项䏿ºæä»¶å ¨çãèæ ¼å¼ 767 æ¡ 0 å¤±è´¥ä¸æ°å¼ä¸ 2026-08 å ¨çãExcel COM æ½æ¥é¦è¡ä¸è´ãè´åééç±»åæ¥éæ¸ æ°ãåå³ç§»ä¸å½±åæ§å段 ââ å ¨é¨éè¿ã - **ç»å½éªè¯ç + é¢è§æ´æ¹**ï¼10 æ¡ç¨ä¾ï¼ï¼æ éªè¯ç ç½æ¡ãæ¥å£ `required=false`ã表头 4 åä¸ x åæ å¯¹é½ãåè§ 10pxãæå¨ä½ç§» 120/160ãå ³éå¤ä½ãå¼¹çªå ä» 1 å¼ è¡¨ã失败æç¤ºå·²ç»åãå¯¼åºæå ââ å ¨é¨éè¿ã - **æµè¯æ°æ®æ¸ ç**ï¼H203-1 å¯¼å ¥éªè¯äº§çç `2099-06 / 2099-07 / 2099-09` ä¸ä¸ªæµè¯æï¼å ± 2395 è¡ï¼åå ¶ `import_batch` è®°å½å·²å é¤ï¼`h2031_enterprise_monthly` æ¢å¤ä¸º 2026-01 ~ 2026-08 å ± 8 æï¼`freight_turnover_import` 为 13 æ à 18 è¡ã ## åäºãéçé®é¢ä¸å¾ åï¼åææ´æ°ï¼ | # | é®é¢ | ç¶æ | |---|------|------| | 1 | 8 ææºæä»¶ç¼º 2023 å¹´ Sheet | **已解å³**ï¼ç¨ 7 ææä»¶è¡¥å½ `2023-12`ï¼ | | 2 | `2026-01` ~ `2026-07` ç `last_*` 为空 | å¾ ç¨æ·ç¡®è®¤æ¯å¦è¡¥ | | 3 | `2026-01` ~ `2026-08` ç H203-1 `unified_credit_code` / `report_unit` ä¸ºç©ºï¼æ¤åä»£ç æªè¯»è¿ä¸¤åï¼ | **å¾ ç¨æ·ç¡®è®¤æ¯å¦é导å岿件åå¡«** | | 4 | `2024-12` çä¸å¹´åææªåå¡«ï¼éé导 2024 å¹´æ°æ®ï¼ | å¾ ç¨æ·ç¡®è®¤ | | 5 | é¢è§å¼¹çªãå ± 0 è¡ãä¸ãæåº¦è¦çï¼1~8æåææ°æ®ãå£å¾ææ¡ä¸å | å¾ ç¨æ·ç¡®è®¤æ¹ææ¡ | | 6 | `2021-12` çãæ´å¹´æ¥è¡¨æãçä¸å¡å£å¾ | å¾ ç¨æ·ç¡®è®¤ | | 7 | å ¬å¸ gitea æ¨éï¼ç½ç»æ ååºï¼ | å¾ è¡¥æ¨ï¼**ç¦å¼ºæ¨** | | 8 | ä»åºæ ¹ç®å½å¤§é `_*.*` ä¸´æ¶æä»¶ | ç»ç¨æ·åæå忏 ç | ## åä¸ãä¸ä¸æ¥è®¡åï¼åææ´æ°ï¼ 1. çç¨æ·ç¡®è®¤ 3 ä»¶äºï¼æ¯å¦é导 2026 å¹´åå² H203-1 æä»¶å填两åãæ¯å¦è¡¥ `last_*` / `2024-12` ä¸å¹´åæãé¢è§å¼¹çªææ¡æ¯å¦è°æ´ã 2. ç½ç»æ¢å¤åè¡¥æ¨å ¬å¸ giteaï¼å fetch åå¹¶ï¼ç¦å¼ºæ¨ï¼ã 3. è§ç¨æ·æè§æ¸ çä»åºæ ¹ç®å½ `_*.*` ä¸´æ¶æä»¶ã ## ååãgit å®é ç»æï¼åæè¡¥è®°ï¼ 1. `git fetch origin`ï¼ä¸ªäºº giteeï¼`master`ï¼ï¼è¿ç«¯ä¸æ¬å°ä¸è´ï¼`HEAD...origin/master = 0 0`ï¼ï¼**æ åäº/ç¨æ·æ°æäº¤**ï¼æ éåå¹¶ã 2. æäº¤ `24b4c28`ï¼`feat(h2031): éé æ¨¡æ¿æ°å¢ãç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç /å¡«æ¥åä½ã两åå¹¶å ¥åºï¼fix(import): è¡¥å½ 2023 å¹´è´§è¿éå¨è½¬éï¼fix(login/report): éªè¯ç 容éãé¢è§ææ 对é½ãå¼¹çªå¯æå¨åè§ã失败æç¤ºç»åï¼docs: æ°å¢é®é¢ä¸æ³¨æäºé¡¹æ±æ»`ï¼10 个æ¹å¨ + 4 个æ°å¢ï¼å ± 14 个æä»¶ï¼ã 3. æ¨ä¸ªäººä»åº `origin`ï¼`git push origin main:master` æåï¼`0cfd6e0..24b4c28`ï¼ã 4. æ¨å ¬å¸ `gitea`ï¼`git fetch gitea` æ¥ `Operation too slow. Less than 1000 bytes/sec transferred the last 15 seconds`ï¼`curl --max-time 20 http://61.183.254.94:3000/` è¿å `http_code=000 time=20.01`ï¼ç¡®è®¤**å ¬å¸å ç½ä¸å¯è¾¾**ï¼ç½ç»é®é¢ï¼éåæ®ï¼ï¼æ¬æ¬¡æªæ¨éæåï¼å·²å为éçé®é¢ï¼è¡¥æ¨åå `git fetch gitea` ä¸è¿ç«¯ `main` åå¹¶ï¼**ç¦å¼ºæ¨**ã ## åäºãç¨æ· 4 æ¡ç¡®è®¤çè½å®ï¼2026-09-16 æ¶å°¾ï¼ | ç¨æ·åé¦ | ç»è®ºä¸å¤ç½® | |---|---| | 1-2ãæå¯¼å ¥çè´§è¿éå¨è½¬éè¡¨éæ 23 å¹´æ°æ®ã | å·²éæ ¼å¤æ ¸ï¼8 ææºæä»¶åªæ `2026å¹´ / 2025å¹´ / 2024å¹´ / 2022å¹´ / 2021å¹´` äºä¸ª Sheetï¼å ææ ä»»ä½ 2023 æ è¯ï¼å½ä¸é¡¹åä¸ºæµ®ç¹æ°éçæ°åå·§åï¼ï¼`2023` Sheet åºç°å¨**7 æ**æä»¶éãå·²ç¨ 7 ææä»¶ç `2023` Sheet è¡¥å½ `2023-12`ï¼æ éå导ã | | 1ã让ä»ç©ºçå§ã | 2026-01~08 ç H203-1 `unified_credit_code` / `report_unit` ä¿æç©ºï¼**ä¸é导**å岿件ã | | 2ãæ¯ä¸æ¯æ 23 å¹´ä¹å¯¼è¿å»ã | æ¯ï¼å·²å¯¼å ¥ `2023-12`ï¼18 è¡ï¼ãè¥è¦åå¡« `2024-12` çä¸å¹´åæå¼ï¼éåé坼䏿¬¡ 2024 å¹´æ°æ®ï¼å¾ ç¨æ·ç¡®è®¤ï¼ã | | 3ãå¯ä»¥ã | é¢è§å¼¹çªææ¡å·²æç¡®è®¤ä¿®æ¹ï¼æ±æ»å¤§è¡¨ãææ N 项ãï¼å ¶å®æ¥è¡¨ãå ± N è¡æç»ãï¼ï¼å¹¶å·²å¨æµè§å¨å®æµã | | 4ãä»ä¹æ¶åå¼å§è¿ä¸ä¸çã | å ¬å¸ gitea **èª 2026-09-15 èµ·ä¸å¯ç¨**ï¼09-15 ä¸ºåæ®å¼¹çªæªæ¨æåï¼09-16 èµ·å为 TCP 3000 å¯è¿ä½ HTTP æ ååºã仿¥å¤æµ `Test-NetConnection` 为 Trueã`curl` 25s è¶ æ¶ `code=000`ã | ## åå ãgit å®é ç»æï¼æ¶å°¾è¡¥è®°ï¼ - `git fetch origin`ï¼ä¸ªäºº giteeï¼ï¼`HEAD...origin/master = 0 0`ï¼æ æ°æäº¤ï¼æ éåå¹¶ã - æäº¤ `e7cddc4`ï¼`fix(report): é¢è§å¼¹çªè¡æ°ææ¡ææ¥è¡¨ç±»ååºå`ï¼4 个æä»¶ï¼+25/-1ï¼ã - æ¨ä¸ªäººä»åº `origin`ï¼`git push origin main:master` æåï¼`b0c8b4f..e7cddc4`ï¼ã - æ¨å ¬å¸ `gitea`ï¼`git fetch gitea` ä»å¤±è´¥ï¼æ¥ `fatal: unable to access ... Recv failure: Connection was reset`ï¼`fetch_exit=128`ï¼ï¼æ¬æ¬¡**æªæ¨éæå**ï¼ç»§ç»å为éçé®é¢ï¼è¡¥æ¨åå `git fetch gitea` ä¸è¿ç«¯ `main` åå¹¶ï¼**ç¦å¼ºæ¨**ã ## åä¸ãç¨æ·ç¬¬ 5 æ¡ï¼æ±æ»å¤§è¡¨ä¸ 8 æå®ç¨¿é表æ¯å¯¹ **æ¯å¯¹å¯¹è±¡**ï¼`D:\æ¡é¢\çæ_éè·¯è¿è¾éæ±æ»è¡¨.xlsx`ï¼ç¨æ· 14:39 导åºï¼ vs `D:\05_æ°æ®åç±»\æ±æ»è¡¨\8ææ±æ»å®ç¨¿\2026å¹´8æå®¢è¿éãè´§è¿éå®ç¨¿.xlsx`ã鿰坼åºä¸æ¬¡ï¼`GET /api/report/export/summaryWorkbook?period=2026-08&mode=month`ï¼å¾å°çæä»¶ä¸æ¡é¢é£ä»½**åèæ°å®å ¨ä¸è´ï¼950,186ï¼**ï¼æé¤âæä»¶è¿æâã **踩çåï¼éè¦ï¼**ï¼ 1. 两边**è¡åé«åº¦ä¸å**ï¼å¯¼åºæ¯å¸å· 6 è¡ãå®ç¨¿ 4 è¡ï¼å¯¼åº 118 è¡ vs å®ç¨¿ 84 è¡ï¼ï¼ç´æ¥æåå æ ¼åæ æ¯ä¼å¾åº 4.6 ä¸ä¸ªâå·®å¼âï¼å ¨æ¯éä½åªå£° â æ¹ç¨ãå°åº+ææ +åæ é¢ã**è¯ä¹é®**对é½ã 2. 导åºç«¯æ **39,939 ä¸ªå ¬å¼æ ¼**ï¼`=C7+C9`ã`=C5/V5-1`ã`RANK(...)`ï¼ï¼`openpyxl(data_only=True)` è¯»åºæ¥å ¨æ¯ None â è¯¯å¤æâæ´è¡¨æ²¡æ°æ®âãExcel COM æä¸å¼ï¼ç¨æ·å·²å¼ç Excelï¼ä¸è½ä¹±å¨ï¼ï¼æå**èªå·±åå ¬å¼æ±å¼å¨**ï¼SUM/RANK/ROUND+åå+跨表å¼ç¨ï¼ç®åº 61,972 个æ°å¼æ ¼åæ¯ã **ç»è®º**ï¼è¯ä¹é®ä¸è´ 28,567 个ï¼ä¸ä¸è´ 4,742 个ã * ` è´§è¿` 表ï¼å¯¼åºæ¯å¸å·æ¯å®ç¨¿**å¤ä¸¤è¡**ï¼ãè§ä¸+è§ä¸è´§è¿éããè§ä¸è´§è¿éãï¼ï¼åææ æ°å¼**é¶å·®å¼**ï¼å®ç¨¿è¿æãè§ä¸+è§ä¸å¨è½¬éãè¡è导åºè¯¥è¡ä¸ºç©ºã * **æå¤§å·®å¼æ¥æº**ï¼`city_bus_monthly / city_taxi_monthly / wyc_order_monthly / wyc_total_monthly` **åªæ 2026-01~08ï¼æ²¡æ 2025 å¹´** â å ¬äº¤/åºç§/ç½çº¦è½¦/ä¸å£å¾å å¼ è¡¨çãä¸å»å¹´åæ¯ãè¢«ç®æ `0`/`-1`ã2025 年累计åå°ã * `h2031_enterprise_monthly` 缺 `2025-01`ï¼æºæä»¶æ¬èº«æ²¡æ 1 æï¼ã * 导åºç«¯ãä¸å£å¾åæãå¤ä¸æ®µå½æåã缺 4 è¡âå æ¯âã 详è§ãåè½æµè¯æ¥å/æ±æ»å¤§è¡¨ä¸å®ç¨¿æ¯å¯¹_2026-09-16.mdãã ## åå «ãç¨æ·ç¬¬ 2 æ¡ï¼2024 å¹´æ°æ®é导ï¼åå¡«ä¸å¹´åæï¼ **èæ¯**ï¼`last_*`ï¼ä¸å¹´åæï¼åªä»**åä¸ä¸ªå·¥ä½ç°¿çä¸ä¸å¹´ Sheet** åï¼8 ææä»¶æ²¡æ `2023` Sheetï¼æä»¥ `2024-12` ç `last_*` ä¸ç´æ¯ NULLã **è¿ç¨**ï¼å ç¨ 7 ææä»¶ï¼å« `2023` Sheetï¼å¦ååªç 4 个年度 Sheet çä¸´æ¶æä»¶å¯¼å ¥ â `2024-12` ç `last_*` å¡«ä¸äºï¼ä½ **`2021-12` çãæ¹åçãè¡ 1 æå¼ä» 14945.34 åæäº 0**ãææ¥åç°ãæ¹åçãè¡æ¯ `=SUM()` **å ¬å¼**ï¼openpyxl å¦åä¼**丢æå ¬å¼çç¼åå¼**ï¼POI 读å°ç©ºå ¬å¼å°±å 0ã **ä¿®æ£**ï¼æ¹ç¨**åå§ 7 ææä»¶**æ´ä»½é导ï¼`POST /api/import/freightTurnover?period=2026-07`ï¼è¿åãå ± 108 æ¡è®°å½ã= 6 æ à 18 è¡ï¼ã **夿 ¸**ï¼7 æ/8 æä¸¤ä¸ªæä»¶ç 11 个年度 Sheet ä¸åºéæ ¼æ¯å¯¹ **4,752 æ ¼å ¨é¨ 0 ä¸ä¸è´**ï¼ä¸å¹´åæé¾æ¡ 2022â2021ã2023â2022ã2024â2023ã2025â2024ã2026-07/08â2025 **å ¨é¨ 0 ä¸ä¸è´**ã **æè®**ï¼ä»¥åä¸è½ç¨ openpyxl å¦å Excel ååç»å端ï¼å ¬å¼ç¼åä¼ä¸¢ï¼è¦ä¹ç¨åå§æä»¶ï¼è¦ä¹ç¨ Excel COM å¦åã ## åä¹ãç¨æ·ç¬¬ 3 è½®æé®ï¼è´§è¿é¡µç¾ã累计ã为ä»ä¹åªæåå个对å¾ä¸ + æ°å¯¼å ¥æ°æ®ä½æ£ ### 19.1 å®ä½è¿ç¨ 1. è§£å导åºä»¶ã è´§è¿ã页ç¾ï¼å ± 6 个累计å ââ `S`(2026 1-8æ)ã`AT`(2025)ã`BV`(2024)ã`CW`(2023)ã`DZ`(2022)ã`EO`(2021)ã 2. 读æ¯ç `docs/çææ±æ»å¤§è¡¨/çæ_éè·¯è¿è¾éæ±æ»è¡¨.xlsx` çåå页ï¼`S5/AT5/BV5/CW5` æ¯ **Î£å ¬å¼**ï¼`DZ5` æ¯ **æ°å¼å¸¸é 144979.285376043**ï¼`EO5/EP5` **为空**ã2021 å¹´ `EC5:EN5` åäºä¸ªæé½æå¼ï¼å计 161309.5316ï¼ï¼åªæ¯ç´¯è®¡åæ¼äºã 3. ç¨æºæä»¶ï¼`D:\05_æ°æ®åç±»\é«é\å®ç¨¿-æ¹åçåå¸å·è¿è¾éæ°æ®ï¼2026å¹´1-8æï¼.xlsx`ï¼å¦æ 7 ææä»¶å« 2023 页ï¼å¤ç®å ¨çè¡ï¼ | 年度 | å | æ±æ»è¡¨ | æºæä»¶æ ¸ç® | å·®å¼ | |---|---|---|---|---| | 2026(1-8æ) | S | 130311.8927 | 130311.8927 | 0 | | 2025 | AT | 195433.2232 | 195433.2232 | 0 | | 2024 | BV | 184938.5780 | 184938.5780 | 0 | | 2023 | CW | 173045.2932 | 173045.2964 | â0.0033 | | 2022 | DZ | 144979.2854 | 144979.2825 | +0.0029 | | 2021 | EO | 空 | 161309.5316 | æ´å缺失 | å¨è½¬éè¡åçï¼2023 â0.0017ã2022 +0.0025ã2021 空ï¼ãå¸å·è¡ 2026~2022 éæ ¼ä¸è´ï¼å·®å¼åªå¨ãå ¨çãè¡å 2021 åã ### 19.2 åå * **2021 累计åï¼EOï¼å¨æ¯çéå°±æ¯ç©ºç** ââ æ¼å¡«ç´¯è®¡å ¬å¼ï¼8 æå®ç¨¿åæ ·ä¸ºç©ºï¼å±åå²éçã * **2022 累计åï¼DZï¼æ¯åæ»å¸¸é**ï¼ä¸ä¼éå¯¼å ¥æ°æ®å·æ°ï¼å ¶åæå¼ä¹æ¯å½å¹´æå·¥å½å ¥çæ§ç²¾åº¦ï¼1 æ 10709.5265 vs æºæä»¶ 10709.5234ï¼ã * **2023 累计åï¼CWï¼æ¯å ¬å¼ï¼ä½è¾å ¥æ¥èªæ¯ç**ï¼æ¯ç 2023 å ¨çè¡ = è§ä¸+è§ä¸ä¸¤è¡ç¸å ï¼ä¸æºæä»¶ `2023` 页æ¹åçè¡ç²¾åº¦ä¸åï¼å·® 0.0033ã * ä»£ç æ¯æ¬¡å¯¼åºåªåå¡«ãç®æ 彿ãä¸åï¼`SummaryWorkbookFiller.fillFreightSheet`ï¼ï¼åå²æä»½å ¨é¨æ²¿ç¨æ¯ç â æ¯ç对ä¸ä¸å°±æ´ä½å¯¹ä¸ä¸ã ### 19.3 æ°å¯¼å ¥æ°æ®ä½æ£ï¼é®é¢æ¸ åï¼ | # | 严é度 | é®é¢ | |---|---|---| | 1 | é« | `h2032_enterprise_monthly` å¤åºä¸ä¸ª **2026-09 æ**ï¼æºæä»¶åæ¯ãé路货ç©è¿è¾æåº¦ç产æ åµï¼2026å¹´8æï¼.xlsãï¼batch 302ï¼ãä¸ 2026-08 æéä¼ä¸æ¯ï¼636 æ¡ä¼ä¸å®å ¨åéã90 个åºåï¼ä» 38 å®¶ä¼ä¸æ°å¼ä¸å â æ¯ 8 ææ°æ®çå¦ä¸çæ¬è¢«åæ 9 æ | | 2 | é« | `h2031_enterprise_monthly` **缺 2025-01**ï¼ä»å¤©åªå¯¼äº 02~12ï¼ï¼2025 年累计ä¼å° 1 个æ | | 3 | ä¸ | `passenger_individual_monthly` 2026-08 **缺é»åå¸**ï¼7 æ¡å 6 æ¡ï¼ | | 4 | ä½ | PASSENGER_AUTH 11 æå ¨ 0 è¡ï¼é确认æ¯å¦æ£å¸¸ | | 5 | æç¤º | 2025-04 ç H2032 æ¤åç¼ºå¤±ï¼æ¬æ¬¡å·²è¡¥é½ï¼batch 382ï¼664 è¡ï¼ï¼h2032 åºåæ° 2025=87 / 2026=90ï¼å±ä¼ä¸è¿éè§æ£å¸¸åå¨ | å ¥åºæ½æ¥ï¼H2032 2025 å ¨å¹´è§ä¸ 50117.0940 ä¸å¨ / 7435040.9971 ä¸å¨å ¬éã2026 å¹´ 1-8 æè§ä¸ 31399.8248 ä¸å¨ï¼éå¸å· 17/17 ä¸å¯¼åºä»¶ãè´§è¿éæåã累计表ä¸è´ã 详è§ãåè½æµè¯æ¥å/è´§è¿ç´¯è®¡åæ ¸å¯¹ä¸å¯¼å ¥æ°æ®ä½æ£_2026-09-16.mdãã ### 19.4 git ç»æï¼æ¬è½®ï¼ - æäº¤ `27574bc`ï¼åè½æµè¯æ¥å + æ¬è + .gitignore è¡¥ `_pylibs/`ãä¿®æ£ `~$*` åå¯¼ç©ºæ ¼ï¼â **å·²æ¨ originï¼gitee masterï¼**ï¼`559e937..27574bc`ã - **å ¬å¸ gitea ä»ä¸å¯ç¨**ï¼`Test-NetConnection 61.183.254.94:3000` è¿å Trueï¼TCP éï¼ï¼ä½ `GET /r/trafficAudit.git/info/refs?service=git-upload-pack` 25 ç§æ ä»»ä½ååºï¼HTTP 000ï¼ï¼`git fetch gitea` æ¥ `Operation too slow. Less than 1000 bytes/sec`ãå¤æä¸ºæå¡ç«¯æªæ£å¸¸æä¾ HTTP ååºï¼å¾ æ¢å¤åè¡¥æ¨ï¼**ç¦å¼ºæ¨**ã ## äºåãç¨æ·ãå¯ä»¥ãææé¡¹è½å®ï¼è´§è¿é¡µç¾ç´¯è®¡åä¿®å¤ + H2032 èææ¸ ç ### 20.1 å ³é®åç°ï¼æ ¹å 䏿¯ç´¯è®¡å ¬å¼ï¼èæ¯ãå ¨çè§ä¸ãè¡ ä¸ä¸èæå¤å®ä¸ºã2021 累计å空 + 2022 忻叏é + 2023 精度差ãï¼æ¬è½®ç¨ Excel COM éæå®æµå**ä¿®æ£äºç»è®º**ã对 6 个年度åéææ¯è¾ãå ¨çè¡ãä¸ã17 å¸å·è¡ä¹åãï¼ | 年度 | å计差 | è§ä¸å·® | è§ä¸å·® | |---|---|---|---| | 2026(1-8) | 2.8e-5 | 1.8e-12 | 2.8e-5 | | 2025 | 3.3e-11 | 9.1e-13 | 3.5e-11 | | 2024 | 1.5e-11 | 9.1e-13 | 1.3e-11 | | 2023 | **4.6e-3** | 4.5e-13 | **4.6e-3** | | 2022 | **3.1e-3** | 2.3e-13 | **3.1e-3** | | 2021 | 4.0e-5 | 4.0e-5 | 1.5e-4 | - ãè§ä¸ãå ¨çè¡æ°¸è¿æ¯ 17 å¸å·ä¹åï¼å ¬å¼ï¼ï¼**ä¸å¤ä¸å·®**ï¼ - å·®å¼ 100% æ¥èªãå ¨çè§ä¸ãè¡ ââ 宿¯**åæ»ç常é**ï¼ä¸ 17 å¸å·è§ä¸ä¹åä¸çï¼ - èã17 å¸å·è¡ä¹åãæ°å¥½çäºæºæä»¶æ¹åçè¡ï¼2022 = 144979.2825ã2023 = 173045.2964ï¼ï¼æ£æ¯ç¨æ·äººå·¥æ ¸ç®çé£ä¸ªæ°ã æä»¥åªè¦æãå ¨ç è§ä¸/è§ä¸ã两è¡é½æ¹æ 17 å¸å·æ±åå ¬å¼ï¼å ¨çè¡èªç¶çäºå¸å·ä¹åï¼ç´¯è®¡åéä¹èªå¨å¯¹ä¸ã ### 20.2 æ¯çæ¹å¨ï¼docs/çææ±æ»å¤§è¡¨/2026å¹´8æéè·¯è¿è¾éæ±æ»è¡¨.xlsx çã è´§è¿ãé¡µï¼ | ä½ç½® | æ¹å | æ¹å | |---|---|---| | r7/r8/r9/r10ï¼å ¨ç è§ä¸/è§ä¸ è´§è¿é·å¨è½¬éï¼2021-2025 åæï¼ | 忻叏é | SUM(17 å¸å·å¯¹åºè¡) | | r5/r6ï¼å ¨ç è´§è¿é/å¨è½¬éï¼2021-2025 åæï¼ | 常é | m7+m9 / m8+m10 | | DZï¼2022 累计ï¼è¡ 5-112ï¼ | 忻叏é | SUM(DM:DX) | | EOï¼2021 累计ï¼è¡ 5-112ï¼ | 空 | SUM(EC:EN) | | EAï¼2022 ç´¯è®¡åæ¯ï¼è¡ 5-112ï¼ | 忻叏é | IFERROR(DZ/SUM(EC:EN)-1,"") | å ± 360 + 324 个åå ã2026 å¹´åä¸å¨ï¼å½æå¼ç±å¯¼åºä»£ç åå¡«ï¼ï¼EPï¼2021 ç´¯è®¡åæ¯ï¼ä¿æä¸ºç©ºï¼é¡µå 没æ 2020 åï¼æ åæ¯åºæï¼ãæ¹åå¤ä»½ docs/çææ±æ»å¤§è¡¨/_bak_202608æ¯çä¿®æ¹å_20260916/ã **åªæ¹æ¯çè¿ä¸ä¸ªæä»¶**ï¼çæ_éè·¯è¿è¾éæ±æ»è¡¨.xlsx æ¯å宽åç §ä»¶ï¼ä»£ç åªè¯»å宽/éèæ è®°ï¼ï¼_çå¼åå.xlsx è¿è¡æ¶æ ä»»ä½ä»£ç å¼ç¨ï¼åæå¤ä»½æ¯ç resolveSummaryDonor(2026,8) è¦æ±æä»¶å以 _å¤ä»½_ å¼å¤´ä¸å«ã2026å¹´8æãï¼ç®å½ä¸æ å¹é ï¼å¯¼åºæ¥å¿ç¡®è®¤ãæªæ¾å°åæå¤ä»½æ¯çãï¼ï¼ä¸ä¼å²ææ¹å¨ã ### 20.3 æ°æ®åºæ¸ ç - DELETE FROM h2032_enterprise_monthly WHERE report_period='2026-09' â 636 è¡ï¼ROW_COUNT() 宿µï¼ - DELETE FROM import_batch WHERE id=302 â 1 è¡ - å¤ä»½ï¼_backup_h2032_2026-09_rows_20260916.sqlï¼636 å ç»ï¼ã_backup_h2032_2026-09_batch302_20260916.sql ### 20.4 ä¿®å¤å宿µï¼éå¯¼åº 2026-08ï¼Excel éç®ï¼ | 年度 | å | ä¿®å¤å | ä¿®å¤å | æºæä»¶æ ¸ç® | |---|---|---|---|---| | 2026(1-8æ) | S | 130311.8927 | 130311.8927 | 130311.8927 | | 2025 | AT | 195433.2232 | 195433.2232 | 195433.2232 | | 2024 | BV | 184938.5780 | 184938.5780 | 184938.5780 | | 2023 | CW | 173045.2932 | **173045.2964** | 173045.2964 | | 2022 | DZ | 144979.2854 | **144979.2825** | 144979.2825 | | 2021 | EO | 空 | **161309.5316** | 161309.5316 | å ¨é¨ 4 ä½å°æ°ä¸è´ï¼æå¤§æ®å·® 4.1e-5ï¼ä¸ºæµ®ç¹ç´¯å åªå£°ï¼ã导åºä»¶ãå ¨çè¡ãvsã17 å¸å·è¡ä¹åãéæ å°äºçäº 9.3e-10ãé¢è§æ¥å£ types=summaryWorkbook è¿å ready=trueã20 é¡¹ææ ï¼å½æè´§è¿é 16888.76ã累计 130311.89ï¼ã2026-07 导åºåå½éè¿ã ### 20.5 踩å 1. **PowerShell åå¼å·éç "$m7" ä¼è¢«å½æåé m7**ï¼å ¬å¼ä¸² "=SUM(DM$r:DX$r)" ä¸ç $r:DX è¢«å½æã驱å¨å¨ r:ãèåæï¼å ¬å¼è¢«åæ =SUM(DM5) ââ 馿¬¡èæ¬å·²ææ¯çæ¹åï¼é å¤ä»½è¿ååæ¹ç¨ ${m}/${r} å®çéè·ã 2. **åµå¥çåå¼å· here-string 伿åç»æ¢å¤å± here-string** â æ¹ä¸ºãå Out-File åè¡¥ä¸æä»¶ï¼å Get-Content -Raw ä¼ ç» codex.exe --codex-run-as-apply-patchãã 3. æ¯ç被 Excel éååä½ç§¯ 959,706 â 1,480,392 åèï¼å¯¼åºä»¶ 950,186 â 1,331,599ï¼Excel èªèº«æ ¼å¼å¼éï¼ä¸å½±åæ°æ®ï¼ã 4. 2026å¹´8æéè·¯è¿è¾éæ±æ»è¡¨_çå¼åå.xlsx ç S åæ¼äº 8 æï¼=C+E+G+I+K+M+Oï¼ç¼º Q5ï¼ï¼ä½å®è¿è¡æ¶ä¸è¢«å¼ç¨ï¼æ¬æ¬¡æªæ¹ã ### 20.6 éç - 2026-09 æå¨ h204_vehicle_quarterlyï¼1284 è¡ï¼batch 142/144 åæä»¶ï¼ãinvestment_monthlyï¼31 è¡ï¼batch 107/108 åæºï¼ãaudit_resultï¼2061 è¡ï¼ãaudit_runï¼3 è¡ï¼ä¸ä»å¨ï¼æ¬æ¬¡æªå¨ï¼å¾ ç¨æ·ç¡®è®¤æ¯å¦æ¸ çã - 2026-07 æå¯¼åºä»¶ã è´§è¿ã页为 118x145ï¼æ¯ 8 æå° 2 åï¼ï¼å 7 ææ¯çæ¯ã1-4 æéª¨æ¶ãã 详è§ãåè½æµè¯æ¥å/åè½æµè¯æ¥å_è´§è¿é¡µç¾ç´¯è®¡åä¿®å¤ä¸èææ¸ ç_2026-09-16.mdãã --- ## äºåä¸ã2026-07 æ¯çè¡¥é½ + 导åºä»¶ãExcel æä¸å¼ãæ ¹å ä¿®å¤ æ¥æï¼2026-09-16ï¼ç¬¬ 9 è½®ï¼æ¥äºåèï¼ ### 21.1 ä»å¤©åäºä»ä¹ | # | äºé¡¹ | ç»æ | |---|---|---| | 1 | æ¸ ç 2026-09 æ®çæ°æ®ï¼ç¨æ·ç¬¬ 1 æ¡ï¼ | **宿**ï¼h204_vehicle_quarterly 1284 / investment_monthly 31 / audit_result 2061 / audit_run 3 / import_batch 5 / h2032 636ï¼å ¨é¨å¤æ ¸ä¸º 0 æ®çï¼å·²çå¯è¿å SQL å¤ä»½ `_backup_2026-09_residual_all_20260916.sql` | | 2 | ä¿® 2026-07 导åºä»¶ãExcel æä¸å¼ã | **宿**ï¼P0ï¼è§ 21.2ï¼ | | 3 | è¡¥é½ 2026-07 æ¯çï¼ç¨æ·ç¬¬ 3 æ¡ãå¯ä»¥è¡¥é½ãï¼ | **宿**ï¼è§ 21.3ï¼ | | 4 | ä¿®å¤ä»½æ¯çåå¡«æè¡¥é½ãæååå½¢ã | **宿**ï¼è§ 21.4ï¼ | ### 21.2 æ ¹å ï¼openpyxl æ¯ç + å¤ä»½åå¡« â æ®ç <is> éæ³æ ¼ - åä»¶é 19 ä¸ªæ ¼åå½¢å¦ `<c r="E15" s="111" t="n"><v>67.0</v><is><t>67.00</t></is></c>`ï¼`t="n"` å´å¸¦ `<is>`ï¼æ¨¡å¼éæ³ï¼Excel ç´æ¥æå¼ï¼COM æ¥ãä¸è½åå¾ç±» Workbooks ç Open 屿§ãï¼è¿ä¿®å¤æ¨¡å¼ `CorruptLoad=1` 乿ä¸å¼ï¼ã - 7 ææ¯çæ¯ **openpyxl ååº**ï¼ææ¬å `<is>`ï¼ï¼8 ææ¯çæ¯ **Excel åç**ï¼ææ¬èµ° sharedStringsï¼â å代ç ä¸åªæ 7 æåã - 触åè æ¯ `restoreSummaryMonthlyBlocks`ï¼7 ææ `_å¤ä»½_2026å¹´7æâ¦æ¸ çåâ¦xlsx`ï¼æ´æ ¼åå¡«æ¶å¾ inlineStr æ ¼éåå¼ï¼ç䏿§ `<is>`ï¼8 ææ²¡æ `_å¤ä»½_*`ï¼ä¸èµ°åå¡«ï¼æä»¥ä¸ç´æ¯å¥½çã - å®ä½ææ³ï¼å¼å¾è®°ä½ï¼ï¼åä»¶/好件**é¤ worksheets/styles/sharedStrings å¤å ¨é¨é¨ä»¶éåèç¸å** â zip æäº¤ + Excel éä¸å¼æ¡£ leave-one-out â éå® **sheet9ãå ¬äº¤ã17 æ ¼ + sheet12ã轨éã轮渡ã2 æ ¼**ã ### 21.3 ä¿®å¤ 1. `ReportExportService.exportSummaryWorkbook`ï¼è½çåæ°å¢ `normalizeStaleInlineStrings(wb)`ï¼æ¸ æææãé inlineStr å´æ®ç `<is>`ãçæ ¼åï¼å¹ç + warn æ¥å¿ï¼ã 2. `ReportExportService.restoreSummaryMonthlyBlocks`ï¼æ°å¢ `skipFreightHistoryBlocks`ï¼ã è´§è¿ã页 **T åå以å**ï¼2025..2021 äºä¸ªå¹´åº¦å + å年累计åï¼æ°¸ä¸ä»å¤ä»½æ¯çåå¡« ââ 䏿¢æãä¸å£å¾æåå·¦åãä¿æ¤åä¸æè·¯ï¼é²ãçæå夿´»ãã ### 21.4 7 ææ¯çè¡¥é½ï¼Excel COMï¼360 + 324 æ ¼ï¼ æ `_fix_mother.ps1`ï¼8 ææ¯çé£çï¼**æ´ä½å·¦ç§» 2 å**æ¹åï¼ - 年度åï¼2025 `T,V,X,Z,AB,AD,AF,AH,AJ,AL,AN,AP`ï¼2024 `AV..BR` éåï¼2023 `BW..CS` éåï¼2022 `DK..DV` è¿ç»ï¼2021 `EA..EL` è¿ç»ï¼æ¯åå `r7/r9/r8/r10 = SUM(17 å¸å·)`ã`r5=r7+r9`ã`r6=r8+r10` â **360 æ ¼**ï¼ - 累计åï¼`DX=SUM(DK:DV)`ã`EM=SUM(EA:EL)`ã`DY=IFERROR(DX/SUM(EA:EL)-1,"")`ï¼è¡ 5..112 â **324 æ ¼**ï¼ - `CalculateFullRebuild` åä¿åãæ¯ç 921,559 â 1,440,038 åèï¼è½¬ Excel åçï¼ã ### 21.5 æµè¯ç»ææè¦ | ç¨ä¾ | ç»æ | |---|---| | 2026-07 导åºï¼ä¿®å¤åï¼ | FAILï¼å¤ç°ï¼ | | ç¯å¢/è·¯å¾æé¤ï¼å°ä»¶ãä¸¤æ¬æ¯çã09-08 æ§å¯¼åºãæ¹åå¤å¶ï¼ | å ¨é¨ OKï¼ç¡®è®¤éç¯å¢é®é¢ | | ä¿®å¤å 2026-07 å¯¼åº | **OK sheets=19**ï¼`DX5=144979.2825`ã`DY5=-0.101235487797891`ã`EM5=161309.53162`ã`CU5=173045.296428512` | | ä¿®å¤å 2026-08 å¯¼åº | **OK sheets=19**ï¼`DZ5=144979.2825`ã`EO5=161309.53162`ã`CW5=173045.296428512` | | è·¨æä¸è´æ§ | 7 æä¸ 8 æç 2022/2021/2023 累计**å®å ¨ç¸ç** | | éæ³æ ¼å¤æ« | 0 个 | | 2026-09 æ®ç夿 ¸ | 5 å¼ è¡¨å ¨ 0 | > 注ï¼8 ææ¯ç计ç®å `DZ5` ç±æ§ç忻叏é `144979.285376043` å为 `144979.2825`ï¼å·® 0.0029 ââ æ£æ¯ç¬¬åäºèè®°å½çãå ¨çè§ä¸å¸¸é â 17 å¸å·ä¹åãé£ç¬å·®é¢ï¼å±**ä¿®æ£**èéåéã ### 21.6 踩å 1. **Excel COM å¤å¿è¿ç¨ä¼è®© `Workbooks.Open` é´ææ§åæ¥åä¸ä¸ªé**ï¼æ¯ä¾æµå®å¿ é¡»å¼ºææ¬æ¬¡æ°å»ºç `EXCEL` è¿ç¨ãææ¥åæå°±å å¤å¿è¿ç¨è¯¯å¤ã8 æä»¶ä¹æä¸å¼ãï¼æµªè´¹äºä¸è½®ã 2. `CTWorksheet` **没æ** `isSetSheetData()`ï¼sheetData æ¯å¿ å¡«ï¼ï¼è¦ç¨ `getSheetData() != null`ã 3. æ¯çè¡¥é½çå¤ä»½æä»¶**ä¸è½**ç¨ `_å¤ä»½_` åç¼ï¼ä¼è¢« `resolveSummaryDonor` å½ donor åå¡«ï¼ï¼æ¬æ¬¡ç¨ `_bak_2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨_è¡¥é½å_20260916.xlsx`ã ### 21.7 éç - 2026-06 / 2026-09 æ æ¯ç â é¢è§ `ready=False`ãæªæ¾å°æ¨¡æ¿æä»¶ãï¼éå 建æ¯çã - 第 8 æ£éçæªå¨ï¼`h2031` 缺 2025-01ã`passenger_individual_monthly` 2026-08 缺é»åã`PASSENGER_AUTH` 11 æå ¨ 0ã - ä»åºæ ¹ `_*.*`ï¼å«æ¬æ¬¡ `_hyb_*` / `_loo_*` / `_v2_*` / `_final_*` / `_fixed_*` / `_t7_*` / `_poijar`ï¼æªå ï¼å¾ ç¨æ·åæã 详è§ãåè½æµè¯æ¥å/åè½æµè¯æ¥å_2026-07æ¯çè¡¥é½ä¸å¯¼åºä»¶æä¸å¼ä¿®å¤_2026-09-16.mdãã ### 21.8 æ¶å·¥è®°å½ï¼2026-09-16ï¼ - æ¬è½®ä»£ç /ææ¡£å·² commit `80e0879`ï¼å¹¶ **push å°ä¸ªäºº gitee `origin/master`**ï¼`e29485b..80e0879`ï¼ã - å ¬å¸ gitea ä»ä¸éï¼`git fetch gitea` æèµ·çº¦ 5 åéæ ååºï¼å·²æçº¦å®**ä¸å¼ºæ¨**ï¼å¾ ç½ç»æ¢å¤åè¡¥æ¨ï¼æ¬å°ç° `ahead 16`ï¼ã - æ¶å·¥æ¶ç¯å¢ï¼å端 8090ãå端 8080 åå¨è·ï¼Excel å¤å¿è¿ç¨å·²æ¸ å¹²åï¼åªä¿çç¨æ·èªå·±ç 18564/25868ï¼ã - æªæäº¤å 容ï¼**ææä¿çï¼çç¨æ·ç¡®è®¤**ï¼ï¼`docs/æèµ/` ä¸çæ¢æå¢å ï¼`Xæâ¦` æ¹åçï¼éæ¬è½®æ¹å¨ï¼ãä»åºæ ¹ `_*.*` ææ¥ä¸´æ¶æä»¶ã - æå¤©å¯åï¼æ°å»º 2026-09ï¼å 2026-06ï¼æ¯çï¼è®© 9 ææºæ°æ®å¯¼å ¥åè½ç´æ¥åºæ±æ»å¤§è¡¨ï¼å ¬å¸ gitea è¡¥æ¨ã docs/Ͷ×Ê/ÊäÈë7ÔµÄÄÚÈÝÒªÓë¡¶Ä£°å_²éѯ½á¹û(Ͷ×Êϵͳ-¿ÍÔË+ÎïÁ÷ 2026.7)¡·½øÐÐУÑ飬´æÔÚÊý¾Ý²»Ò»Öµĵ¯´°Ìáʾ.txt
docs/±¨±íÉú³É_¹ØÏµÂß¼ÓëÿÈÕ½ø¶È×ܱí.xlsxBinary files differ
docs/Éú³É»ã×Ü´ó±í/2026Äê7ÔµÀ·ÔËÊäÁ¿»ã×ܱí.xlsxBinary files differ
docs/Éú³É»ã×Ü´ó±í/2026Äê8ÔµÀ·ÔËÊäÁ¿»ã×ܱí.xlsxBinary files differ
docs/Éú³É»ã×Ü´ó±í/2026Äê8ÔµÀ·ÔËÊäÁ¿»ã×ܱí_°æÊ½ÔÐÍ.xlsxBinary files differ
docs/Éú³É»ã×Ü´ó±í/»ã×ܱíÔ¤ÀÀ¸ñʽ.xlsxBinary files differ
docs/Éú³É»ã×Ü´ó±í/Éú³É_µÀ·ÔËÊäÁ¿»ã×ܱí.xlsxBinary files differ
docs/Éú³É»ã×Ü´ó±í/Êä³ö/Éú³É_µÀ·ÔËÊäÁ¿»ã×ܱí_2026-07_¸ñʽÑéÖ¤.xlsxBinary files differ
docs/Éú³É»ã×Ü´ó±í/Êä³ö/Éú³É_µÀ·ÔËÊäÁ¿»ã×ܱí_2026-07_ÑéÖ¤.xlsxBinary files differ
docs/Éú³É»ã×Ü´ó±í/Êä³ö/Éú³É_µÀ·ÔËÊäÁ¿»ã×ܱí_2026-08_ËÄÒ³Êý¾ÝÇý¶¯_2026-09-13.xlsxBinary files differ
docs/Éú³É»ã×Ü´ó±í/Êä³ö/Éú³É_µÀ·ÔËÊäÁ¿»ã×ܱí_2026-08_ÅÅÃûË¢ÐÂÓëͬ±È°Ù·ÖÊý_2026-09-11.xlsxBinary files differ
docs/Éú³É»ã×Ü´ó±í/Êä³ö/Éú³É_µÀ·ÔËÊäÁ¿»ã×ܱí_2026-08_¸ñʽÑéÖ¤.xlsxBinary files differ
docs/Éú³É»ã×Ü´ó±í/Êä³ö/Éú³É_µÀ·ÔËÊäÁ¿»ã×ܱí_2026-08_ÇåÀíÑéÖ¤.xlsxBinary files differ
docs/Éú³É»ã×Ü´ó±í/Êä³ö/µÀ·ÔËÊäÁ¿»ã×ܱí_2026-07_ÅÅÃû×ó¿éɾ³ýÑéÖ¤.xlsxBinary files differ
docs/Éú³É»ã×Ü´ó±í/Êä³ö/µÀ·ÔËÊäÁ¿»ã×ܱí_2026-07_°æÊ½Í³Ò»ÑéÖ¤.xlsxBinary files differ
docs/Éú³É»ã×Ü´ó±í/Êä³ö/µÀ·ÔËÊäÁ¿»ã×ܱí_2026-08_À©ÁÐÑéÖ¤.xlsxBinary files differ
docs/Éú³É»ã×Ü´ó±í/Êä³ö/µÀ·ÔËÊäÁ¿»ã×ܱí_2026-08_°æÊ½Í³Ò»ÑéÖ¤.xlsxBinary files differ
docs/Éú³É»ã×Ü´ó±í/Ô¤ÀÀ½çÃæ.png
docs/»õÔËÆóҵƽ¾ùÔ˾àÔö·ùɸ²éÃûµ¥_2026-08ÓëÀÛ¼Æ_2026-09-05.xlsxBinary files differ
docs/»õÔËÆóҵƽ¾ùÔ˾àÔö·ùɸ²éÃûµ¥_2026-08ÓëÀÛ¼Æ_8ÔÂÀۼƾù50¿Ú¾¶_2026-09-05.xlsxBinary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2025ÄêÔ±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2025Äê10Ô£©.xlsBinary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2025ÄêÔ±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2025Äê11Ô£©.xlsBinary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2025ÄêÔ±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2025Äê12Ô£©.xlsBinary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2025ÄêÔ±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2025Äê1Ô£©.xlsBinary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2025ÄêÔ±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2025Äê2Ô£©.xlsBinary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2025ÄêÔ±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2025Äê3Ô£©.xlsBinary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2025ÄêÔ±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2025Äê4Ô£©.xlsBinary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2025ÄêÔ±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2025Äê5Ô£©.xlsBinary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2025ÄêÔ±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2025Äê6Ô£©.xlsBinary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2025ÄêÔ±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2025Äê7Ô£©.xlsBinary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2025ÄêÔ±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2025Äê8Ô£©.xlsBinary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2025ÄêÔ±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2025Äê9Ô£©.xlsBinary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2026Äê1-7Ô±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2026Äê1Ô£©.xlsBinary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2026Äê1-7Ô±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2026Äê2Ô£©.xlsBinary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2026Äê1-7Ô±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2026Äê3Ô£©.xlsBinary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2026Äê1-7Ô±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2026Äê4Ô£©.xlsBinary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2026Äê1-7Ô±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2026Äê5Ô£©.xlsBinary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2026Äê1-7Ô±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2026Äê6Ô£©.xlsBinary files differ
docs/»õÔËÐèµ¼ÈëµÄÊý¾Ý/»õÔË/2026Äê1-7Ô±¨/µÀ·»õÎïÔËÊäÔ¶ÈÉú²úÇé¿ö£¨2026Äê7Ô£©.xlsBinary files differ
docs/ÎÊÌâ»ã×Ü/ÎÊÌâÓë×¢ÒâÊÂÏî»ã×Ü_2026-09-16.md
New file @@ -0,0 +1,289 @@ # 交éè´§è¿ç»è®¡å®¡æ ¸ç³»ç» â é®é¢ä¸æ³¨æäºé¡¹æ±æ» > ç¨éï¼æé¡¹ç®è¿è¡ãæ°æ®å¯¼å ¥ãæ¥è¡¨çæãä»åºåä½ä¸ææã踩è¿çåãéä¸è®°å½ï¼ä¾åç»å¼åä¸è¿ç»´å¿«éæ¥é ã > ç»´æ¤æ¹å¼ï¼æ°åç°é®é¢è¯·ç´æ¥å¨æ¬æä»¶è¿½å ï¼å¹¶æ³¨ææ¥æã > æåæ´æ°ï¼2026-09-16 --- ## ä¸ãéæ¥è¡¨ï¼æå¸¸è§ç 10 æ¡ï¼ | # | äºé¡¹ | æ£ç¡®åæ³ | |---|------|----------| | 1 | å¯å¨åå端 | é¡¹ç®æ ¹ç®å½æ§è¡ `powershell -NoProfile -ExecutionPolicy Bypass -File start-dev.ps1` | | 2 | 端å£å ç¨å¤æ | ç `backend.log` / `traffic-audit-web/frontend.log`ï¼**ä¸è¦**ä¾èµ `Get-NetTCPConnection` | | 3 | å端就绪æ å¿ | æ¥å¿åºç° `Started TrafficAuditApplication` + `Tomcat started on port(s): 8090` | | 4 | å端就绪æ å¿ | æ¥å¿åºç° `Compiled successfully` + `App running at:` | | 5 | è¿æ°æ®åº | `mysql.exe --host=127.0.0.1 --port=3308 --user=root --default-character-set=utf8mb4 -D traffic_audit` | | 6 | åæ§è¿ç¨ | æ PID 精确å `cmd â java(maven) â java(app)` é¾ï¼**ä¸è¦æ node_repl åç¨æ·èªå·±ç cmd çªå£** | | 7 | èæ¬æ¥ã已添å äºå ·æç¸åé®ç项ã | æ¬æºåæ¶åå¨ `Path` ä¸ `PATH`ï¼æ¹ç¨ `cmd.exe /c ... > log 2>&1`ï¼**严ç¦ç¨ `Start-Process`** | | 8 | å䏿æä»¶ | ç¨ UTF-8ï¼`main.js` 带 BOM å¿ é¡»åå BOMï¼æ¹æä»¶åå 确认åæä»¶æ¯ CRLF è¿æ¯ LF | | 9 | æäº¤å | å æµè¯ + åãåè½æµè¯æ¥åã+ æ´æ°ã工使¥ç»ãï¼å fetch/åå¹¶/æ¨é | | 10 | æ¨å ¬å¸ gitea | å `git fetch gitea` ä¸è¿ç«¯ `main` åå¹¶ï¼**ç¦æ¢å¼ºæ¨** | --- ## äºãå¯å¨ä¸è¿ç¨ç®¡ç | é®é¢ | åå | å¤ç½® | |------|------|------| | `Start-Process` æ¥ã已添å äºå ·æç¸åé®ç项ã | ç¯å¢åéåæ¶åå¨ `Path` ä¸ `PATH`ï¼å¼ç¸åï¼ | ç»ä¸ç¨ `cmd.exe /c ... > log 2>&1` æ `ProcessStartInfo` å¯å¨ | | åç«¯å¨æ²ç®±å èµ·ä¸æ¥ï¼`EPERM: lstat`ï¼ | node 访é®ç¨æ·ç®å½è¢«æ²ç®±æ¦æª | `start-dev.ps1` æ´ä½å¨æ²ç®±å¤æ§è¡ | | åµå¥ `powershell.exe -Command` å¼å·è¢«ç ´å | å¤å± shell å è§£æä¸å±å¼å· | ç´æ¥è¿è¡ `.ps1` æä»¶ï¼ä¸ååµå¥ | | é坿¶è¯¯æ Codex å æ ¸ | æååæ `node.exe` ä¼å½ä¸ `node_repl` | æ PID 精确ååç«¯é¾ `cmd â java(maven) â java(app)`ãåç«¯é¾ `cmd â node(npm) â cmd â node(vue-cli-service)` | | å端æ¥å¿æ¾ä¸å° | æ¥å¿å¨åç®å½ | `traffic-audit-web/frontend.log`ï¼å端 `backend.log` å¨ä»åºæ ¹ç®å½ | **é坿 åæµç¨**ï¼ååº `java.exe` è¿ç¨ â å `app` â `maven` â `cmd` â è¿è¡ `start-dev.ps1`ï¼èæ¬èªå¨è·³è¿å·²å¨çå¬ç端å£ï¼ã --- ## ä¸ãæå¡ç¶æéªè¯ - æ²ç®±å `Get-NetTCPConnection` ä¼å æéãæç»è®¿é®ãè**éé»å¤±è´¥**ï¼æ®æ¤å¤å®ç«¯å£æªç嬿¯éçã - 夿æå¡ç¶æä¸å¾ä»¥æ¥å¿ä¸ºåï¼HTTP æ¢æ´»ç¨ï¼ - å端ï¼`GET http://127.0.0.1:8090/api/auth/captcha-config`ï¼è¿å `{"code":200,...}` å³éï¼ - å端ï¼`http://localhost:8080/#/login` - å端æ¥å¿åºç° `Proxy error: Could not proxy request /api/... (ECONNREFUSED)` 说æ**åç«¯å½æ¶æ²¡èµ·æ¥**ï¼ä¸æ¯å端é®é¢ã --- ## åãæ°æ®åº - è¿æ¥ï¼æ¬å°å¼ååºï¼ï¼ `& 'C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe' --host=127.0.0.1 --port=3308 --user=root --password=<è§ AGENTS.md> --default-character-set=utf8mb4 -D traffic_audit` - **å¿ é¡»å `--host=127.0.0.1`**ï¼åæ `-h127.0.0.1` ä¼è¢«è§£ææ host `127`ï¼è¿æ¥å¤±è´¥ã - è¾åºè¿æ»¤ `2>&1 | Select-String -NotMatch 'Warning'` å¯å±è½å¯ç è¦åã - 常ç¨è¡¨ä¸å ³é®åï¼ | 表 | 说æ | å ³é®å | |----|------|--------| | `freight_turnover_import` | è´§è¿é/å¨è½¬é | `report_period`ã`region_name`ã`freight_m01..m12`ã`turnover_m01..m12`ã`last_*` | | `h2031_enterprise_monthly` | å ¬è·¯æ 客 H203-1 ææ¥ | `report_period`ã`enterprise_code`ã`unified_credit_code`ã`report_unit` | | `import_batch` | å¯¼å ¥æ¹æ¬¡ | `import_type`ã`report_period`ã`file_name`ã`success_rows` | | `audit_result` / `audit_run` | å®¡æ ¸ç»æ/è¿è¡ | `report_period` | - ææ¥ãæææ°æ®å¨ä¸å¨ãï¼`SELECT report_period, COUNT(*) FROM <表> GROUP BY report_period ORDER BY report_period;` - ææ¥ãææå¯¼å ¥æ¥èªåªä¸ªæä»¶ãï¼æ¥ `import_batch` ç `file_name`ã - **è¡¨ç»æåæ´è¦åæ¥ä¸å¤**ï¼å®é åº DDLã`docs/init.sql`ã`docs/database.md`ã - æµè¯ç¨æ¥è¡¨æå»ºè®®ç¨ `2099-xx`ï¼æµå®ç¨ `POST /api/import/clear?period=...` æç´æ¥ DELETE æ¸ çï¼é¿å 污æç宿份䏿项ã --- ## äºãæ°æ®å¯¼å ¥ï¼æä»¶è·¯å¾ä¸ææ¬¡çº¦å® ### 5.1 è´§è¿é/å¨è½¬éï¼`/api/import/freightTurnover`ï¼ | æºæä»¶ | è¦çææ¬¡ | 夿³¨ | |--------|----------|------| | `D:\05_æ°æ®åç±»\é«é\å®ç¨¿-æ¹åçåå¸å·è¿è¾éæ°æ®ï¼2026å¹´1-8æï¼.xlsx` | 2021-12 / 2022-12 / 2024-12 / 2025-12 / 2026-08 | **æ 2023 å¹´ Sheet** | | `D:\05_æ°æ®åç±»\è´§è¿\7æ\å®ç¨¿-æ¹åçåå¸å·è¿è¾éæ°æ®ï¼2026å¹´1-7æï¼.xlsx` | å¤ä¸ä¸ª `2023` Sheet | 2023 å¹´æ°æ®çæ¥æºï¼2021/2022/2024 ä¸ 8 ææä»¶éå¼ä¸è´ | - å¤å¹´åº¦å·¥ä½ç°¿è¯å«è§åï¼`detectYearSheets`ï¼ï¼ 1. **è³å° 2 个 Sheet**ï¼å Sheet æä»¶ä¸è¯å«ä¸ºå¤å¹´åº¦å·¥ä½ç°¿ï¼ä¼èµ°èçæåº¦æ¨¡æ¿è·¯å¾ï¼ï¼ 2. æ¯ä¸ª Sheet åå¹é `^\d{4}\s*å¹´?$`ï¼`2023å¹´`ã`2023` é½å¯ä»¥ï¼ï¼ 3. æ¯ä¸ª Sheet é¦è¡ A1 å«ãè´§è¿éããB1 å«ãæãã 任䏿¡ä»¶ä¸æ»¡è¶³ â æ´ä½åéèçæåº¦æ¨¡æ¿è§£æã - æ¯ä¸ªå¹´åº¦ Sheet çç»æï¼ä¸æ¹æ¯ãè´§è¿é(ä¸å¨)ãåï¼çº¦ 20 è¡ï¼ï¼ä¸æ¹æ¯ãå¨è½¬é(ä¸å¨å ¬é)ãåï¼**åä¸å¸å·åç¬¬äºæ¬¡åºç°å³è§ä¸ºå¨è½¬éå**ã - æ¥è¡¨æè¯ä¹ï¼**`2021-12` è¿ç±»ææ¾çæ¯è¯¥å¹´ 1â12 æçå ¨å¹´æ°æ®**ï¼`m01..m12` å ¨é¨æå¼ï¼ï¼ä¸æ¯ 12 æåæã该年æåææ°æ®çæä»½å³å®æå·ï¼2026 å¹´åªæ 1â8 æ â `2026-08`ï¼ã - ä¸å¹´åæï¼å¤å¹´åº¦æä»¶éèªå¨å**ä¸ä¸å¹´åº¦ Sheet**ï¼è¥ä¸ä¸å¹´åº¦ä¸åå¨ï¼å¦ 2021 æ 2020 Sheetï¼ï¼`last_*` 为空ã - åªè¡¥æä¸å¹´æ¶ï¼å¯å¦åä¸ä¸ªåªå«è¯¥å¹´ + ä¸ä¸å¹´ç临æ¶å·¥ä½ç°¿åå¯¼å ¥ï¼æ³¨æãè³å° 2 个 Sheetãè§åï¼ã ### 5.2 å ¬è·¯æ 客 H203-1ï¼`/api/import/passengerMonthly`ï¼ | æºæä»¶ | 夿³¨ | |--------|------| | `docs\å ¬è·¯æ 客\模æ¿_交ä¼ç»H203-1表_å ¬è·¯æ 客è¿è¾æåº¦ç产æ åµ.xlsx` | ç¨æ·ä¿®æ¹åçæ¨¡æ¿ | | `D:\æ¡é¢\æµè¯æ°æ®\å ¬è·¯æ 客\å «æ\å ¬è·¯æ 客è¿è¾æåº¦ç产æ åµï¼2026ï¼_2026-09-09 09_18_45.xls` | ç³»ç»å¯¼åºçèæ ¼å¼æ ·ä¾ | | `D:\éè¦å¯¼å ¥çæ°æ®\å ¬è·¯æ 客\*.xls` | åå²åæå¯¼åºæä»¶ | - è§£æ**æè¡¨å¤´ååå¼**ï¼`buildHeaderMap`ï¼ï¼å æ¤æ¨¡æ¿å¨ä¸é´æå/æ´ä½å³ç§»**ä¸ä¼**ç ´åå ¶å®å段ã - æ°æ¨¡æ¿å¨ãä¼ä¸åç§°ãåæ°å¢ 2 åï¼`ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç `ã`å¡«æ¥åä½`ï¼èæ ¼å¼æä»¶å ¶å®ä¹å¸¦è¿ä¸¤åï¼æ¤åä»£ç æªè¯»åï¼ã - å¿ éå缺失ä¼ç´æ¥æ¥éï¼ä¾å¦ééç±»åæ¶æç¤ºã表头缺å°å¿ éåãä¼ä¸åç§°ãã客è¿é_æ»è®¡ããã ### 5.3 å ¶å® - å¯¼å ¥å¤±è´¥å¿ é¡»å¨é¡µé¢æ¾ç¤º**è¡å·**ï¼ç¨æ·è¦æ±ï¼ï¼æ°å¢è§£æé»è¾æ¶ä¸è¦åæè¡å·ä¿¡æ¯ã --- ## å ãæ¥è¡¨çæ - ãæ±æ»å¤§è¡¨ãé¢è§å¼¹çªç± `ReportExport.vue` 渲æï¼ - å¼¹çªå **åªä¿çä¸å¼ ææ è¡¨**ï¼åç±» / ææ / æ°æ® / 忝ï¼ï¼ãä¸å£å¾ãä¹åä¸å渲æä»»ä½è¡¨æ ¼ï¼ - å¼¹çªæ¯ææå¨ï¼`v-dialog-drag` æä»¤ï¼ææ 颿 ï¼+ 10px åè§ã - 导åºä¾èµ**æ¯çæ¨¡æ¿æä»¶**ï¼`docs/çææ±æ»å¤§è¡¨/YYYYå¹´Mæéè·¯è¿è¾éæ±æ»è¡¨.xlsx`ãç¼ºå¤±æ¶æ¥ãæ¯çå®ä½å¤±è´¥ï¼æªæ¾å°æ¨¡æ¿æä»¶ãï¼**䏿¯æ°æ®é®é¢**ã - æ¥å£å±é¢èªæ¥ï¼ç»è¿å端ï¼å®ä½æ¯åç«¯è¿æ¯å端é®é¢ï¼ï¼ - é¢è§ï¼`GET /api/report/preview?period=2026-08&mode=month&types=summaryWorkbook` - 导åºï¼`GET /api/report/export/summaryWorkbook?...` - 失败æç¤ºå·²ç»åï¼è½åºåãè¿ä¸ä¸æå¡å¨ãåãå端è¿åçå ·ä½åå ãï¼å¯¼åºæ¥å£æ¯ `responseType:'blob'`ï¼æ¥éæ¶ `data` 乿¯ Blobï¼å¿ é¡»å `text()` åè§£æã --- ## ä¸ãç»å½ä¸éªè¯ç | é®é¢ | åå | å¤ç½® | |------|------|------| | ç»å½é¡µåºç°ç©ºç½æ¹æ¡ + ãéªè¯ç å 载失败ï¼è¯·æ£æ¥ç½ç»ã | å端 `captchaRequired` é»è®¤ `true`ï¼è¯»å `/api/auth/captcha-config` 失败æ¶éé»å¿½ç¥ï¼é¡µé¢æ®çå è½½ä¸åºæ¥çéªè¯ç æ¡ | é»è®¤å¼æ¹ `false`ï¼æ¹ä¸º fail-safeï¼åªæå端æç¡®è¿å `required === true` ææ¾ç¤ºï¼è¯·æ±å¤±è´¥æãä¸éè¦éªè¯ç ãå¤ç | | å¼å ³ä½ç½® | å端 `application.yml` ç `app.captcha.required` | å ³æååºæ¾ç¤ºãæµè¯æ¨¡å¼ï¼è¡ä¸ºéªè¯ç 已跳è¿ã | | æ¢ç½ç»/æ¢ IP åæ¥å£ 403 | è·¨åç½åå | CORS éæ¾è¡å ç½ç½æ®µï¼å·²ä¿®å¤ `0d2a5fc`ï¼ | --- ## å «ãæä»¶åå ¥ä¸ææ¬å¤ççå - æ¬æºæä»¶**æ¢è¡ç¬¦ä¸ç»ä¸**ï¼`Login.vue`ã`main.js` æ¯ CRLFï¼`ReportExport.vue`ã`DataImportService.java`ã`docs/*.md` æ¯ LFãç¨ `[System.IO.File]::WriteAllText` æ¶å¿ é¡»å¹é 忢è¡ç¬¦ï¼å¦ååç» `-replace` / å符串å¹é ä¼å¤±è´¥ã - `main.js` 带 BOMï¼`EF BB BF`ï¼ï¼æ¹åæ¶è¦ç¨ `New-Object System.Text.UTF8Encoding($true)`ã - **`git checkout -- <æä»¶>` 伿 LF 转æ CRLF**ï¼æ¬ä»åº `core.autocrlf=true`ï¼ï¼ä¼è®©åç»åºäº LF çæ¿æ¢å¤±æï¼æä½åå 确认ç宿¢è¡ç¬¦ã - PowerShell å¤è¡ä¸ææ¿æ¢å»ºè®®å `*.py` èæ¬ç¨ `python` æ§è¡ï¼`apply_patch` 卿¬æºä¸å¯ç¨ï¼ã - åç¬¦ä¸²æ¿æ¢**注æéç¹å¯ä¸æ§**ï¼`| enterprise_name | varchar(200) | ä¼ä¸åç§° |` å¨ `docs/database.md` åºç° 4 次ï¼ç´æ¥ replace 伿¹é表ï¼å¿ é¡»å æªåç®æ ç« èåæ¿æ¢ã - 读 `.xls`ï¼æ¬æº python æ `xlrd`ï¼å¯ç¨ Excel COMï¼`New-Object -ComObject Excel.Application` â `Workbooks.Open` â `Cells.Item(r,c).Text`ï¼è®°å¾ `Quit()` + `ReleaseComObject`ï¼ã --- ## ä¹ãæµè§å¨èªå¨ååè¯çå - `tab.playwright.evaluate()` 读 DOM æå¯ä¿¡ï¼AX æ å¯è½è¯»å°ç¼åã - Playwright locator 对 Element UI è¡¨æ ¼å æé®**ä¼è¶ æ¶**ï¼`isVisible()` æä¸º falseï¼ï¼æ¹ç¨ AX ç´¢å¼ `tab.click(index)`ã - `tab.drag([x1,y1],[x2,y2])` ææ½æ¶ï¼åæ å¿ é¡»è½å¨**å½åè§å£**å ï¼æ¬æºå 嵿µè§å¨è§å£å¾å°ï¼çº¦ 319Ã790ï¼ï¼å¦åæ¥ `Coordinate is outside the active tab content viewport`ã - `tab.click` ç AX ç´¢å¼**å¨é¡µé¢å·æ°åä¼å¤±æ**ï¼å¯è½å½ä¸å«çæ§ä»¶ï¼æ¯æ¬¡æä½åéæ° `cua.getTab(...)` åæ°ç´¢å¼ã - æªå¾ï¼`const fs = await import('fs'); fs.writeFileSync(path, Buffer.from(await tab.getScreenshot()))`ï¼`require` ä¸å¯ç¨ï¼ã - æ¹ `.vue` åéè¦ `tab.reload()`ã - 临æ¶èæ¬/æä»¶ï¼`_*.*`ï¼æªç»ç¨æ·åæ**ä¸è¦å **ã --- ## åãGit åä»åºå·¥ä½æµ | ä»åº | remote | 忝 | å°å | |------|--------|------|------| | 个人 | `origin` | `master` | `https://gitee.com/zhizhijie/traffic-audit.git` | | å ¬å¸ | `gitea` | `main` | `http://61.183.254.94:3000/r/trafficAudit.git`ï¼è´¦å· zyjï¼ | æ¯æ¬¡æ¹å¨çåºå®é¡ºåºï¼ 1. æµè¯ + åãåè½æµè¯æ¥åã + æ´æ°ã工使¥ç»ãï¼ 2. `git fetch origin` â å并个人ä»åºæ°æäº¤ï¼é¿å è¦çç¨æ·æ¹å¨ï¼ï¼ 3. `git fetch gitea` â ä¸è¿ç«¯ `main` 对æ¯åå¹¶ â **ç¦æ¢å¼ºæ¨**ï¼ 4. `git commit` â `git push`ã - åæ®åªèµ°æ¬æº git/ä¸´æ¶ askpassï¼**ç¦æ¢åè¿ä»åºä»»ä½æä»¶**ã - å ¬å¸ gitea ç½ç»ä¸éæ¶è®°å½ä¸ºéçé®é¢ï¼**ä¸è¦**ç¨å¼ºæ¨ç»è¿ã --- ## åä¸ãå½åå·²ç¥éçé®é¢ï¼æªè³ 2026-09-16ï¼ | # | é®é¢ | å½±å | ç¶æ | |---|------|------|------| | 1 | 8 ææºæä»¶ç¼º 2023 å¹´ Sheet | å·²ç¨ 7 ææä»¶è¡¥å½ `2023-12` è§£å³ | å·²è§£å³ | | 2 | 2026-01 ~ 2026-07 ç `last_*` 为空 | è¿å ææ¹å¨åå³ä¸ºç©ºï¼éæ¬æ¬¡å¼å ¥ | å¾ ç¨æ·ç¡®è®¤æ¯å¦è¡¥ | | 3 | 2026-01 ~ 2026-07 ç H203-1 `unified_credit_code` / `report_unit` 为空 | æ°åæ¬ææè¯»åï¼å岿æªåå¡« | å¾ ç¨æ·ç¡®è®¤æ¯å¦é导 | | 4 | é¢è§å¼¹çªãå ± 0 è¡ãä¸ãæåº¦è¦çï¼1~8æåææ°æ®ãå£å¾ä¸å | æè¯¯è§£ | å¾ ç¨æ·ç¡®è®¤æ¹ææ¡ | | 5 | å ¬å¸ gitea æ¨é | ç½ç»æ ååºï¼æªæ¨æå | å¾ è¡¥æ¨ | | 6 | ä»åºæ ¹ç®å½å¤§é `_*.*` ä¸´æ¶æä»¶ | ä½ç§¯/å¯è¯»æ§ | ç»ç¨æ·åæå忏 ç | > 2026-09-16 åææ´æ°ï¼éçé®é¢ 4ï¼é¢è§å¼¹çªãå ± 0 è¡ãææ¡ï¼å·²æç¨æ·ç¡®è®¤ä¿®æ¹å®æ¯ââæ±æ»å¤§è¡¨æ¹ä¸ºæ¾ç¤ºãææ N 项ãï¼å ¶å®æ¥è¡¨æ¾ç¤ºãå ± N è¡æç»ãã --- ## åäºã2026-09-16 è¡¥å ï¼è´§è¿é¡µç¾ã累计ãåä¿®å¤ï¼éè¦å£å¾ï¼ ### 12.1 æ¯çæ´¾çå£å¾ï¼å¿ é¡»éµå®ï¼ ã è´§è¿ã页è¡ç»æï¼ - å ¨çåï¼r5 è´§è¿é / r6 å¨è½¬é / r7 å ¶ä¸è§ä¸è´§è¿é / r8 å ¶ä¸è§ä¸å¨è½¬é / r9 å ¶ä¸è§ä¸è´§è¿é / r10 å ¶ä¸è§ä¸å¨è½¬éï¼ - 17 个å¸å·åæ¯å 6 è¡ï¼é¦è¡ 11,17,23,...,107ï¼æ¦æ±å¸...æåºï¼ï¼åå 顺åºï¼å计货è¿é / è§ä¸è´§è¿é / è§ä¸è´§è¿é / å计å¨è½¬é / è§ä¸å¨è½¬é / è§ä¸å¨è½¬éã **è§åï¼å ¨çè¡å¿ é¡»å®å ¨ç± 17 å¸å·è¡æ´¾çã** - r7 / r8 / r9 / r10 = SUM(17 å¸å·å¯¹åºè¡)ï¼ - r5 = m7+m9ï¼r6 = m8+m10ã å岿è®ï¼r9/r10ï¼å ¨çè§ä¸ï¼æ¾æ¯**忻叏é**ï¼ä¸ 17 å¸å·è§ä¸ä¹åä¸ç ââ 2023 å·® 4.6e-3ã2022 å·® 3.1e-3ã2021 å·® 1.5e-4ï¼2024/2025/2026 æ°å¥½ä¸º 0ï¼ï¼å¯¼è´ 6 个累计åé 2022/2023 æ¯æºæä»¶äººå·¥æ ¸ç®å·® 0.003 å·¦å³ã2021 æ´å为空ã2026-09-16 å·²å ¨é¨æ¹ä¸ºå ¬å¼ã 累计åç°ç¶ï¼å ¨çè¡ï¼4 ä½å°æ°ä¸æºæä»¶ä¸è´ï¼ï¼ | å | 年度 | å ¬å¼ | |---|---|---| | S | 2026(1-8æ) | C+E+G+I+K+M+O+Q | | AT | 2025 | V+X+...+AR | | BV | 2024 | AX+AZ+...+BT | | CW | 2023 | BY+CA+...+CU | | DZ | 2022 | =SUM(DM:DX)ï¼åä¸ºåæ»å¸¸éï¼ | | EO | 2021 | =SUM(EC:EN)ï¼å为**空**ï¼ | | EP | 2021 ç´¯è®¡åæ¯ | ä¿æä¸ºç©ºï¼é¡µå æ 2020 åï¼æ åºæï¼ | | EA | 2022 ç´¯è®¡åæ¯ | =IFERROR(DZ/SUM(EC:EN)-1, 空串)ï¼åä¸ºåæ»å¸¸éï¼ | ### 12.2 æ¯çæ¹å¨æ¹å¼ä¸æä»¶èè´£ - **å¿ é¡»ç¨ Excel COM**ï¼æ¹å ¬å¼ -> CalculateFullRebuild -> Saveï¼ï¼**ä¸å¯ç¨ openpyxl å¦å**ï¼ä¼æ¸ ç©ºå ¨æ¬å ¬å¼ç¼åå¼ï¼æ¾å¯¼è´ 2021 å¹´æ¹åçè¡å 0ï¼ã - 导åºä»¶éçå ¬å¼**æ ç¼åå¼**ï¼openpyxl(data_only=True) è¯»åºæ¥å ¨æ¯ Noneï¼æ ¸å¯¹æ°å¼å¿ é¡»ç¨ Excel COM éç®æèªåæ±å¼å¨ã - æä»¶èè´£ï¼ - YYYYå¹´Mæéè·¯è¿è¾éæ±æ»è¡¨.xlsx = **æ¯ç**ï¼å¯ä¸æ°æ®æ¥æºï¼ï¼ - çæ_éè·¯è¿è¾éæ±æ»è¡¨.xlsx = **åªä½å宽åç §**ï¼applySummaryReferenceLayout åªè¯»å宽/éèæ è®°ï¼ä¸è¯»æ°å¼ï¼ï¼ - 2026å¹´8æéè·¯è¿è¾éæ±æ»è¡¨_çå¼åå.xlsx = è¿è¡æ¶**æ ä»»ä½ä»£ç å¼ç¨**ã - åæå¤ä»½æ¯çè¿åæºå¶ï¼resolveSummaryDonor åªè®¤æä»¶å**以 `_å¤ä»½_` å¼å¤´ä¸å«ã{å¹´}æã**çæä»¶ï¼å½ä¸å³æ´æ ¼åå¡«è¦çæ¯çã=> èªå»ºçå¤ä»½æä»¶/ç®å½**ä¸è¦**ç¨ `_å¤ä»½_` åç¼ï¼å¦åå¯è½è¢«å½æ donor ææ¯çæ¹åæ§å¼ã ### 12.3 ææ¬å¤ççåï¼æ¬æº PowerShell / gitï¼ | é®é¢ | åå | å¤ç½® | |---|---|---| | å ¬å¼è¢«åæ =SUM(DM5) | "$m7" 被解æä¸ºåé m7ï¼"$r:DX" éç $r:DX è¢«å½æã驱å¨å¨ r:ãèåæ | ä¸å¾ç¨ ${m} / ${r} å®ç | | å½ä»¤æ´ä½ä¸æ§è¡ãæ è¾åºãéåºç 1 | ä¸ä¸ªå½ä»¤éåºç°**åµå¥çåå¼å· here-string**ï¼å¤å±å¨ç¬¬ä¸ä¸ªç»æç¬¦å¤æåç»æ | ä¸ä¸ªå½ä»¤åªæ¾ä¸ä¸ª here-stringï¼æå Out-File åè¡¥ä¸æä»¶ï¼åç¨ Get-Content -Raw | | apply_patch ä¼ å¤è¡åæ°å¤±è´¥ | .bat å è£ å¨ç ´åäºå¤è¡åæ° | ç´æ¥è° codex.exe --codex-run-as-apply-patch $patch | | git commit -m æ¥ "outside repository" | PowerShell ç¨åå¼å·è½¬ä¹ï¼æ¶æ¯éçåææ +å¼å·ä¼æåç»æå符串 | ç¨ git commit -F <æ¶æ¯æä»¶> | | PS5.1 æ¥ä¹±ç è·¯å¾ãæ æ³æ¾å° ...ã | PS7 ç Out-File -Encoding utf8 åçæ¯**æ BOM** UTF-8ï¼PS5.1 æ GBK è¯»èæ¬ | å .ps1 æ¶ç¨ -Encoding utf8BOM | ### 12.4 éçé®é¢å¢éï¼æªè³ 2026-09-16 æï¼ | # | é®é¢ | å½±å | ç¶æ | |---|---|---|---| | 7 | h2032_enterprise_monthly 2026-09 èæï¼å®ä¸º 8 ææä»¶è¯¯å为 9 æï¼ | 636 è¡ + import_batch 302 | **å·²å é¤**ï¼çå¯è¿å SQL å¤ä»½ | | 8 | ã è´§è¿ã页累计å 2021/2022/2023 对ä¸ä¸äººå·¥æ ¸ç® | 已修æ¯çæ´¾çå£å¾ï¼6 åå ¨é¨å¯¹ä¸ | **已解å³** | | 9 | 2026-09 æè¿å¨ h204_vehicle_quarterly(1284 è¡) / investment_monthly(31 è¡) / audit_result(2061 è¡) / audit_run(3 è¡) | è¥æ 2026-09 åºæ¥è¡¨ä¼åå°èæ°æ® | å¾ ç¨æ·ç¡®è®¤æ¯å¦æ¸ ç | | 10 | 2026-07 导åºä»¶ã è´§è¿ã页为 118x145ï¼æ¯ 8 æå° 2 åï¼ | 7 ææ¯çæ¯ã1-4 æéª¨æ¶ãï¼é宿´æ¯ç | å¾ 7 ææ¯çå®ç¨¿ | | 11 | 2026å¹´8æéè·¯è¿è¾éæ±æ»è¡¨_çå¼åå.xlsx ç S åæ¼ 8 æï¼ç¼º Q5ï¼ | è¿è¡æ¶æªè¢«å¼ç¨ï¼ææ å½±å | å¾ ç¡®è®¤è¯¥æä»¶å»ç | | 12 | æ¯çç» Excel éååä½ç§¯ 959,706 -> 1,492,121 åèï¼å¯¼åºä»¶ 950,186 -> 1,331,599ï¼ | çº¯æ ¼å¼å¼éï¼æ°æ®æ å½±å | è®°å½ | 详è§ãåè½æµè¯æ¥å/åè½æµè¯æ¥å_è´§è¿é¡µç¾ç´¯è®¡åä¿®å¤ä¸èææ¸ ç_2026-09-16.mdãã --- ## åä¸ã2026-09-16 è¡¥å ï¼2026-07 æ¯çè¡¥é½ & 导åºä»¶ãExcel æä¸å¼ãæ ¹å ï¼P0ï¼ ### 13.1 çç¶ä¸æ ¹å | 项 | å 容 | |---|---| | çç¶ | `GET /api/report/export/summaryWorkbook?period=2026-07&mode=month` çæç xlsxï¼**Excel æä¸å¼**ï¼COM æ¥ãä¸è½åå¾ç±» Workbooks ç Open 屿§ãï¼`CorruptLoad=1` ä¿®å¤æ¨¡å¼åæ ·æä¸å¼ï¼ï¼2026-08 忥壿£å¸¸ | | ç´æ¥åå | 导åºä»¶éæ **19 个模å¼éæ³æ ¼**ï¼`<c r="E15" s="111" t="n"><v>67.0</v><is><t>67.00</t></is></c>` ââ `t="n"` ä¸å 许带 `<is>`ï¼inlineStr ä¸ç¨ï¼ | | æ·±å±åå | 7 ææ¯çç± **openpyxl** ååºï¼`docProps/app.xml` = `Microsoft Excel Compatible / Openpyxl 3.1.5`ï¼ææ¬å `<is>`ï¼ï¼8 ææ¯çæ¯ **Excel åç**ï¼ææ¬èµ° sharedStringsï¼ãPOI çé¨ååå ¥è·¯å¾åªæ¹ `t`/`<v>`ã䏿¸ æ§ `<is>` | | 触åè·¯å¾ | 7 æåå¨ `_å¤ä»½_2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨_æ¸ çå_20260904.xlsx` â `restoreSummaryMonthlyBlocks` æ´æ ¼åå¡« â å¾ inlineStr æ ¼éåå¼ç䏿§ `<is>`ã8 ææ `_å¤ä»½_*`ï¼ä¸èµ°åå¡«ï¼æ æ£å¸¸ | | å½ä¸ä½ç½® | leave-one-out å®ä½å° **sheet9ãå ¬äº¤ã17 æ ¼ + sheet12ã轨éã轮渡ã2 æ ¼** | ### 13.2 ä¿®å¤ï¼`traffic-audit-server`ï¼ 1. **`exportSummaryWorkbook` æ°å¢ `normalizeStaleInlineStrings(wb)`**ï¼è½ç忏 æææãé `inlineStr` å´æ®ç `<is>`ãçæ ¼åï¼å¹çï¼ï¼å½ä¸å³æ warn æ¥å¿ã 2. **`restoreSummaryMonthlyBlocks` æ°å¢ `skipFreightHistoryBlocks`**ï¼ã è´§è¿ã页 **T åå以å**ï¼2025/2024/2023/2022/2021 年度å + å年累计/ç´¯è®¡åæ¯åï¼**æ°¸ä¸ä»å¤ä»½æ¯çåå¡«** ââ 䏿¢æãä¸å£å¾æå左忰¸ä¸åå¡«ãåä¸æè·¯ï¼é¿å è¡¥é½è¢«ãçæå夿´»ãã ### 13.3 2026-07 æ¯çè¡¥é½ï¼å£å¾ä¸ 8 ææ¯ç对é½ï¼ - 年度åï¼æ¯åï¼ï¼`r7/r9/r8/r10 = SUM(17 å¸å·å¯¹åºè¡)`ã`r5 = r7+r9`ã`r6 = r8+r10` â 360 æ ¼ï¼ - 累计åï¼`DX = SUM(DK:DV)`ï¼2022ï¼ã`EM = SUM(EA:EL)`ï¼2021ï¼å**æ´å为空**ï¼ã`DY = IFERROR(DX/SUM(EA:EL)-1,"")`ï¼2022 ç´¯è®¡åæ¯ï¼å为**忻叏é**ï¼â 324 æ ¼ï¼ - 2023 累计 `CU = BW+BY+â¦+CS` æ¬æ¥å°±æ£ç¡®ï¼æªæ¹ï¼`EN`ï¼2021 ç´¯è®¡åæ¯ï¼æå£å¾ä¿æä¸ºç©ºã - ä¸æè¯æ®ï¼æ¯ç `DX5=144979.2825`ï¼æ§å¸¸é `144979.285376043`ï¼å·® 0.0029 = å ¨çè§ä¸å¸¸éä¸ 17 å¸å·ä¹åçå·®ï¼ã`EM5=161309.53162`ã`CU5=173045.296428512`ï¼ä¸ 8 ææ¯ç `DZ5/EO5/CW5` **å®å ¨ç¸ç**ã - å¤ä»½ï¼`docs/çææ±æ»å¤§è¡¨/_bak_2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨_è¡¥é½å_20260916.xlsx`ã**åå¿æ¹å为 `_å¤ä»½_` å¼å¤´**ï¼å¦åä¼è¢« `resolveSummaryDonor` å½ donor åå¡«ã ### 13.4 æ¬æ¬¡æ°å¢çææ¥å | é®é¢ | åå | å¤ç½® | |---|---|---| | Excel COM **é´ææ§**æ¥åä¸ä¸ªéï¼å¯¼è´è¯¯å¤ã8 æä»¶ä¹æä¸å¼ã | æ¯æ¬¡ `New-Object -ComObject Excel.Application` çä¸ç**å¤å¿ EXCEL è¿ç¨**伿±¡æåç»å®ä¾ | æ¯ä¾æµå®æãæ¬æ¬¡æ°å»ºç EXCEL è¿ç¨ã强æåæµä¸ä¸ä¾ï¼`Quit()`+`ReleaseComObject` å¹¶ä¸å¤ | | ç¼è¯æ¥ãæ¾ä¸å° isSetSheetData()ã | `CTWorksheet.sheetData` æ¯ XSD **å¿ å¡«**å ç´ ï¼ä¸çæ `isSetXxx` | æ¹ç¨ `ctw.getSheetData() != null` | | é¨ä»¶çº§ diff 太大è·ä¸å¨ | 对 519KB ç `styles.xml` ç´æ¥ `difflib` æ¯ O(n²) | å æé¨ä»¶æ¯åè尺寸/æ¯å¦ç¸çï¼åªå¨å¿ è¦çå°é¨ä»¶ä¸å diff | ### 13.5 éçé®é¢å¢é | # | é®é¢ | å½±å | ç¶æ | |---|---|---|---| | 13 | 2026-06 / 2026-09 æ æ¯ç | é¢è§ `ready=False`ãæªæ¾å°æ¨¡æ¿æä»¶ãï¼æ æ³åºæ° | éå 建æ¯çï¼ç¨æ·ç¬¬ 5 é®çå»¶ä¼¸ï¼ | | 14 | ä»åºæ ¹ `_*.*` ä¸´æ¶æä»¶ç»§ç»å¢å¤ï¼`_hyb_*` / `_loo_*` / `_v2_*` / `_final_*` / `_fixed_*` / `_t7_*` / `_poijar`ï¼ | ä½ç§¯/å¯è¯»æ§ | ç»ç¨æ·åæå忏 ç | > 第 10 项ï¼2026-07 导åºä»¶å° 2 å / 7 ææ¯çæ¯ã1-4 æéª¨æ¶ãï¼æ¬èå·²å¤çï¼å¯¼åºç«¯ä¼**èªå¨è¡¥åº 5/6/7 æè¡¨å¤´ä¸å ¬å¼**å¹¶éç®ç´¯è®¡å ¬å¼ï¼æ¯çå·²è¡¥é½ 2021/2022/2023 累计åï¼æ å ³é该项ã traffic-audit-server/src/main/java/com/trafficaudit/common/config/CorsConfig.java
@@ -12,14 +12,16 @@ import java.util.List; /** * è·¨åé ç½®ï¼åªå 许é ç½®ä¸ååºçæ¥æºè®¿é®æ¥å£ã * åå端å离æ¬å°å¼åé»è®¤æ¾è¡ 8080ï¼åç«¯ç» dev-server 代çæä¸åç«¯åæºé¨ç½²æ¶åä¸éè¦é¢å¤æ¾è¡ã * è·¨åé ç½®ï¼åªå 许é ç½®ä¸ååºçæ¥æºï¼æ¯æ * éé ï¼è®¿é®æ¥å£ã * æµè§å¨åèµ· POST/PUT/DELETE æ¶ä¼å¸¦ Origin 头ï¼GET ä¸å¸¦ï¼ï¼å æ¤ç¨å±åç½ IP æå¼é¡µé¢æ¶ï¼ * è¥è¯¥æ¥æºä¸å¨æ¾è¡å表å ä¼è¢« CorsFilter å¤ä¸ºéæ³å¹¶è¿å 403ï¼è¡¨ç°ä¸ºç»å½æ¶æç¤ºâç½ç»é误âã * é»è®¤æ¾è¡æ¬æºä¸å ç½ç½æ®µçä»»æç«¯å£ï¼æ¬å°å¼åãå±åç½è®¿é®ãIP æ¹å¼è®¿é® 8090 åæºé¨ç½²é½è¦çï¼ã * 注æï¼ä¸å¼å¯ allowCredentialsï¼æ¥å£ç¨ Bearer 令çé´æï¼ä¸ä¾èµ Cookieï¼ï¼é¿å ä»»æç«ç¹æºå¸¦åè¯è°ç¨ã */ @Configuration public class CorsConfig { @Value("${app.cors.allowed-origins:http://localhost:8080,http://127.0.0.1:8080}") @Value("${app.cors.allowed-origins:http://localhost:*,http://127.0.0.1:*,http://192.168.*:*,http://10.*:*,http://172.*:*}") private String allowedOrigins; private List<String> originList() { @@ -29,7 +31,7 @@ @Bean public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration config = new CorsConfiguration(); config.setAllowedOrigins(originList()); config.setAllowedOriginPatterns(originList()); config.setAllowedHeaders(Arrays.asList("Authorization", "Content-Type", "Accept", "X-Requested-With")); config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS")); config.setAllowCredentials(false); @@ -43,4 +45,4 @@ public CorsFilter corsFilter() { return new CorsFilter(corsConfigurationSource()); } } } traffic-audit-server/src/main/java/com/trafficaudit/dataimport/controller/DataViewController.java
@@ -359,6 +359,8 @@ H2031_COLUMNS.add(col("regionCode", "æå±å°åº", 100)); H2031_COLUMNS.add(col("enterpriseCode", "ä¼ä¸ä»£ç ", 130)); H2031_COLUMNS.add(col("enterpriseName", "ä¼ä¸åç§°", 220)); H2031_COLUMNS.add(col("unifiedCreditCode", "ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç ", 180)); H2031_COLUMNS.add(col("reportUnit", "å¡«æ¥åä½", 160)); H2031_COLUMNS.add(col("vehicleTotal", "客è¿è½¦è¾å计", 110)); H2031_COLUMNS.add(col("seatTotal", "æ ¸å®è½½å®¢ä½å计", 130)); H2031_COLUMNS.add(col("vehicleSchedule", "ççº¿è½¦è¾æ°", 110)); traffic-audit-server/src/main/java/com/trafficaudit/dataimport/entity/PassengerEnterpriseMonthly.java
@@ -22,6 +22,10 @@ private String enterpriseCode; /** ä¼ä¸åç§° */ private String enterpriseName; /** ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç */ private String unifiedCreditCode; /** å¡«æ¥åä½ */ private String reportUnit; /** 客è¿è½¦è¾_æ»è®¡ */ private Integer vehicleTotal; traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java
@@ -85,6 +85,7 @@ import java.util.Arrays; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.TreeMap; import java.util.stream.Collectors; import java.text.SimpleDateFormat; @@ -318,6 +319,9 @@ entity.setRegionCode(gs(row, colMap, "æå±å°åº")); entity.setEnterpriseCode(gs(row, colMap, "ä¼ä¸ä»£ç ")); entity.setEnterpriseName(name.trim()); // æ°ç模æ¿å¨ãä¼ä¸åç§°ãåæ°å¢äºä¸¤åï¼ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç /å¡«æ¥åä½ï¼ï¼æè¡¨å¤´åå¼ï¼èæ¨¡æ¿æ è¯¥åæ¶ä¸º null entity.setUnifiedCreditCode(gs(row, colMap, "ç»ä¸ç¤¾ä¼ä¿¡ç¨ä»£ç ")); entity.setReportUnit(gs(row, colMap, "å¡«æ¥åä½")); entity.setVehicleTotal(gi(row, colMap, "客è¿è½¦è¾_æ»è®¡")); entity.setSeatTotal(gi(row, colMap, "æ ¸å®è½½å®¢ä½_æ»è®¡")); entity.setVehicleSchedule(gi(row, colMap, "è½¦è¾æ°_客è¿ç车ï¼å«å®çº¿æ 游客è¿å®¢è½¦ï¼")); @@ -1054,11 +1058,22 @@ // ========== è´§è¿éå¨è½¬éï¼æ¨¡æ¿_è´§è¿éå¨è½¬é.xlsxï¼æ¯æå¯¼å ¥ï¼ ========== public int importFreightTurnover(MultipartFile file, String period) throws Exception { try (Workbook wb = WorkbookFactory.create(file.getInputStream())) { // å¤å¹´åº¦å·¥ä½ç°¿ï¼ä¸å¹´ä¸ä¸ª Sheetï¼æ´å¹´ 1-12 æï¼å¦ 21-26 å¹´å®ç¨¿æä»¶ï¼â å ¨é¨å¹´ä»½å ¥åº List<String> yearSheets = detectYearSheets(wb); if (!yearSheets.isEmpty()) { return importFreightTurnoverByYear(wb, file, yearSheets); } return importFreightTurnoverByMonth(wb, file, period); } } /** æ¯æå¯¼å ¥ï¼æ¨¡æ¿_è´§è¿éå¨è½¬é.xlsxï¼ï¼å·¦åä»å¹´ 1-N æï¼å³åå»å¹´ 1-12 æ */ private int importFreightTurnoverByMonth(Workbook wb, MultipartFile file, String period) throws Exception { List<FreightTurnoverImport> list = new ArrayList<>(); int failRows = 0; // æ¥è¡¨æ N æï¼å·¦å为ä»å¹´ 1-N æï¼åæ°ä¸åºå®ï¼ï¼å³ååºå®ä¸ºå»å¹´ 1-12 æï¼ç®åæ¯ç¨ï¼ int monthCount = Integer.parseInt(period.split("-")[1]); try (Workbook wb = WorkbookFactory.create(file.getInputStream())) { { Sheet sheet = wb.getSheetAt(0); Row header = sheet.getRow(0); String h0 = header == null ? null : getString(header, 0); @@ -1123,27 +1138,149 @@ } list.add(entity); } } catch (Exception e) { throw e; } Map<String, List<FreightTurnoverImport>> byPeriod = new LinkedHashMap<>(); byPeriod.put(period, list); return persistFreightTurnover(byPeriod, file.getOriginalFilename()); } // å¹çï¼åæ¥è¡¨æå å é¤ freightTurnoverMapper.delete(new LambdaQueryWrapper<FreightTurnoverImport>() .eq(FreightTurnoverImport::getReportPeriod, period)); /** è¯å«ãå¤å¹´åº¦å·¥ä½ç°¿ãï¼æ¯ä¸ª Sheet ä¸å¹´ï¼Sheet å 2021å¹´/2022å¹´â¦ï¼ï¼ä¸è¡¨å¤´ä¸ºãè´§è¿é/1æâ¦12æãï¼å¦åè¿å空å表 */ private List<String> detectYearSheets(Workbook wb) { List<String> names = new ArrayList<>(); if (wb.getNumberOfSheets() < 2) return names; for (int i = 0; i < wb.getNumberOfSheets(); i++) { Sheet sheet = wb.getSheetAt(i); String nm = sheet.getSheetName() == null ? "" : sheet.getSheetName().trim(); if (!nm.matches("\\d{4}\\s*å¹´?")) { names.clear(); return names; } Row header = sheet.getRow(0); String h0 = header == null ? null : getString(header, 0); String h1 = header == null ? null : getString(header, 1); if (h0 == null || !h0.contains("è´§è¿é") || h1 == null || !h1.contains("æ")) { names.clear(); return names; } names.add(nm); } return names; } int success = 0; for (FreightTurnoverImport entity : list) { try { freightTurnoverMapper.insert(entity); success++; } catch (Exception e) { log.error("freight turnover insert error: {}", entity.getRegionName(), e); failRows++; /** å¤å¹´åº¦å·¥ä½ç°¿å¯¼å ¥ï¼é年䏿¡æ¥è¡¨æï¼æ¥è¡¨æ=该年æåææ°æ®çæä»½ï¼ï¼ä¸å¹´åæåä¸ä¸å¹´åº¦ Sheet */ private int importFreightTurnoverByYear(Workbook wb, MultipartFile file, List<String> yearSheets) { Map<Integer, String> sheetByYear = new TreeMap<>(); for (String sheetName : yearSheets) { sheetByYear.put(Integer.parseInt(sheetName.replace("å¹´", "").trim()), sheetName); } Map<Integer, Map<String, FreightTurnoverImport>> byYear = new TreeMap<>(); Map<Integer, Integer> maxMonthByYear = new HashMap<>(); for (Map.Entry<Integer, String> entry : sheetByYear.entrySet()) { Map<String, FreightTurnoverImport> parsed = new LinkedHashMap<>(); int maxMonth = parseWholeYearSheet(wb.getSheet(entry.getValue()), parsed); if (parsed.isEmpty()) continue; byYear.put(entry.getKey(), parsed); maxMonthByYear.put(entry.getKey(), Math.max(1, Math.min(12, maxMonth))); } Map<String, List<FreightTurnoverImport>> byPeriod = new LinkedHashMap<>(); for (Map.Entry<Integer, Map<String, FreightTurnoverImport>> entry : byYear.entrySet()) { int year = entry.getKey(); String yearPeriod = year + "-" + String.format("%02d", maxMonthByYear.get(year)); Map<String, FreightTurnoverImport> lastYear = byYear.get(year - 1); List<FreightTurnoverImport> rows = new ArrayList<>(); for (Map.Entry<String, FreightTurnoverImport> regionEntry : entry.getValue().entrySet()) { FreightTurnoverImport entity = regionEntry.getValue(); entity.setReportPeriod(yearPeriod); // ä¸å¹´åæ = ä¸ä¸å¹´åº¦ Sheetï¼å¤å¹´åº¦æä»¶æ²¡æå³åãå»å¹´1-12æãåºåï¼ FreightTurnoverImport last = lastYear == null ? null : lastYear.get(regionEntry.getKey()); if (last != null) { for (int m = 1; m <= 12; m++) { setLastFreight(entity, m, getFreight(last, m)); setLastTurnover(entity, m, getTurnover(last, m)); } } rows.add(entity); } byPeriod.put(yearPeriod, rows); } return persistFreightTurnover(byPeriod, file.getOriginalFilename()); } /** è§£ææ´å¹´ Sheetï¼1-12 æåï¼ï¼è´§è¿éå + å¨è½¬éåï¼è¿åæåä¸ä¸ªæè´§è¿éæ°æ®çæä»½ */ private int parseWholeYearSheet(Sheet sheet, Map<String, FreightTurnoverImport> out) { Map<String, FreightTurnoverImport> freightMap = new LinkedHashMap<>(); Map<String, FreightTurnoverImport> turnoverMap = new LinkedHashMap<>(); Set<String> seen = new HashSet<>(); int maxMonth = 0; for (int r = 1; r <= sheet.getLastRowNum(); r++) { Row row = sheet.getRow(r); if (row == null) continue; String name = getString(row, 0); if (name == null || name.trim().isEmpty()) continue; String region = RegionUtil.normalizeCityName(name); boolean isCity = RegionUtil.cityList().contains(region); if (!isCity && !"æ¹åç".equals(region)) continue; // 表头/说æè¡ if (seen.contains(region)) { // 该åç§°å·²åºç°è¿ -> å¨è½¬éåºå FreightTurnoverImport entity = turnoverMap.get(region); if (entity == null) { entity = new FreightTurnoverImport(); entity.setRegionName(name.trim()); turnoverMap.put(region, entity); } for (int m = 1; m <= 12; m++) { setTurnover(entity, m, getDecimalOrNull(row, m)); } } else { seen.add(region); FreightTurnoverImport entity = freightMap.get(region); if (entity == null) { entity = new FreightTurnoverImport(); entity.setRegionName(name.trim()); freightMap.put(region, entity); } for (int m = 1; m <= 12; m++) { Double v = getDecimalOrNull(row, m); setFreight(entity, m, v); if (v != null && m > maxMonth) maxMonth = m; } } } recordBatch(file.getOriginalFilename(), "FREIGHT_TURNOVER", period, list.size(), success, failRows, null); log.info("Freight turnover imported: {} rows for {}", success, period); return success; // åå¹¶ï¼ä¸ä¸ªå¸å·ä¸è¡ï¼è´§è¿é + å¨è½¬éï¼ for (Map.Entry<String, FreightTurnoverImport> entry : freightMap.entrySet()) { FreightTurnoverImport entity = entry.getValue(); FreightTurnoverImport turnover = turnoverMap.get(entry.getKey()); if (turnover != null) { for (int m = 1; m <= 12; m++) { setTurnover(entity, m, getTurnover(turnover, m)); } } out.put(entry.getKey(), entity); } return maxMonth; } /** è½åºï¼ææ¥è¡¨æå å åæï¼å¹çï¼ï¼æ¯ä¸ªæ¥è¡¨æä¸æ¡å¯¼å ¥æ¹æ¬¡è®°å½ï¼è¿åæåæ¡æ° */ private int persistFreightTurnover(Map<String, List<FreightTurnoverImport>> byPeriod, String fileName) { int total = 0; for (Map.Entry<String, List<FreightTurnoverImport>> entry : byPeriod.entrySet()) { String p = entry.getKey(); List<FreightTurnoverImport> rows = entry.getValue(); freightTurnoverMapper.delete(new LambdaQueryWrapper<FreightTurnoverImport>() .eq(FreightTurnoverImport::getReportPeriod, p)); int failRows = 0; int success = 0; for (FreightTurnoverImport entity : rows) { try { freightTurnoverMapper.insert(entity); success++; } catch (Exception e) { log.error("freight turnover insert error: {}", entity.getRegionName(), e); failRows++; } } recordBatch(fileName, "FREIGHT_TURNOVER", p, rows.size(), success, failRows, null); log.info("Freight turnover imported: {} rows for {}", success, p); total += success; } return total; } /** è§£æè´§è¿éåºåè¡ï¼å·¦å B èµ· N å为ä»å¹´ 1-N æï¼å³å为å»å¹´ 1-12 æ */ traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
@@ -3360,12 +3360,41 @@ + "æãçæ_éè·¯è¿è¾éæ±æ»è¡¨ã对é½å宽忰={}ï¼ç¼ºæ°æç¤º={}", dbFilled, yoyFilled, monthFormulaFilled, rankRefreshed, cumulativeRefreshed, widthApplied, dbProblems); applyTwoDecimalFormat(wb); // æ°å¼æ¾ç¤ºä¸¤ä½å°æ°ï¼ä¿çå ¨ç²¾åº¦ï¼ï¼% / æ¥æçæ¢ææ ·å¼ä¸æ¹å int inlineFixed = normalizeStaleInlineStrings(wb); // æ¸ æãé inlineStr å´æ®ç <is>ãçéæ³æ ¼ï¼å¦å Excel æç»æå¼ if (inlineFixed > 0) log.warn("æ±æ»å·¥ä½ç°¿æ¸ ææ®ç inlineStr éæ³æ ¼ {} ä¸ªï¼æ¯çç± openpyxl ååºæ¶çå ¸åé®é¢ï¼", inlineFixed); if (!wb.getCTWorkbook().isSetCalcPr()) wb.getCTWorkbook().addNewCalcPr(); wb.getCTWorkbook().getCalcPr().setFullCalcOnLoad(true); // è¿å/æ¹åå ¬å¼åæå¼å³éç® return toBytes(wb); } finally { ZipSecureFile.setMinInflateRatio(savedZipRatio); } } /** * æ¸ æãé inlineStr å´æ®ç <is>ãçéæ³åå æ ¼ã * * æ¯çè¥ç± openpyxl ååºï¼ææ¬åå æ ¼ç¨ <is>ï¼inlineStrï¼åå¨ï¼POI ç setCellValue åªæ¹å t ä¸ <v>ï¼ * ä¸ä¼æ¸ ææ§ <is>ï¼äºæ¯äº§åº <c t="n"><v>67.0</v><is><t>67.00</t></is></c> è¿ç§éæ³æ ¼ï¼ * Excel å¤å®ä¸ºãæ æ³è¯»åçå 容ãèç´æ¥æç»æå¼ï¼COM 表ç°ä¸ºãä¸è½åå¾ç±» Workbooks ç Open 屿§ãï¼ã * 2026-07 导åºä»¶å³å æ¤æä¸å¼ï¼ãå ¬äº¤ã17 æ ¼ +ã轨éã轮渡ã2 æ ¼ï¼ãè½çåç»ä¸æ¸ çï¼å¹çã */ private int normalizeStaleInlineStrings(XSSFWorkbook wb) { int fixed = 0; for (int i = 0; i < wb.getNumberOfSheets(); i++) { org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet ctw = wb.getSheetAt(i).getCTWorksheet(); if (ctw == null || ctw.getSheetData() == null) continue; for (org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow row : ctw.getSheetData().getRowArray()) { for (org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell c : row.getCArray()) { if (!c.isSetIs()) continue; STCellType.Enum t = c.getT(); if (t == null || !STCellType.INLINE_STR.equals(t)) { c.unsetIs(); fixed++; } } } } return fixed; } /** @@ -4454,6 +4483,9 @@ if (bs == null) continue; // ä¸å£å¾æå页 A..H éæ§å·¦åå·²äº 2026-09-09 ææ¿æ´åå é¤ï¼è¯¥åºåæ°¸ä¸ä»å¤ä»½æ¯çåå¡«ï¼é¿å âçæå夿´»â boolean skipMidRankLeftBlock = "ä¸å£å¾æå".equals(ds.getSheetName()); // ã è´§è¿ã页 2025..2021 年度åï¼T åèµ·ï¼å«å年累计/ç´¯è®¡åæ¯åï¼å¨æ¯ç鿝ãå¸å·æ´¾çå ¬å¼ãï¼ // å¤ä»½æ¯çååºä»æ¯æ§ç忻叏éï¼å ¨çè§ä¸çï¼ï¼åå¡«ä¼è®© 2021/2022/2023 累计å对ä¸ä¸ï¼âçæå夿´»âï¼ï¼æ 该åºä¸åå¡«ã boolean skipFreightHistoryBlocks = " è´§è¿".equals(ds.getSheetName()); for (int r = ds.getFirstRowNum(); r <= ds.getLastRowNum(); r++) { Row dr = ds.getRow(r); if (dr == null) continue; @@ -4461,6 +4493,7 @@ for (Cell dc : dr) { if (dc == null) continue; if (skipMidRankLeftBlock && dc.getColumnIndex() < 8) continue; if (skipFreightHistoryBlocks && dc.getColumnIndex() >= 19) continue; // T åå以å = 2025..2021 年度å CellType t = dc.getCellType(); if (t == CellType.BLANK) continue; String dtx = summaryCellText(dc); traffic-audit-server/src/main/resources/application.yml.example
@@ -70,7 +70,9 @@ # Behavior captcha on login. Set to false to skip verification during test phase; enable before production release. app: cors: # å 许跨åè®¿é®æ¥å£çæ¥æºï¼éå·åéï¼ allowed-origins: http://localhost:8080,http://127.0.0.1:8080 # å 许跨åè®¿é®æ¥å£çæ¥æºï¼éå·åéï¼æ¯æ * éé 主æºä¸ç«¯å£ï¼ï¼ # æµè§å¨ POST/PUT/DELETE å¿ å¸¦ Originï¼GET ä¸å¸¦ï¼ï¼æ ç¨ IP/ååæå¼é¡µé¢æ¶è¯¥æ¥æºå¿ é¡»å½ä¸æ¤å表ï¼å¦å 403ã # é»è®¤æ¾è¡æ¬æºä¸å ç½ç½æ®µï¼è¥éè¿åå访é®ï¼è¯·æè¯¥ååï¼å«ç«¯å£ï¼è¿½å å°æ¤å¤ã allowed-origins: http://localhost:*,http://127.0.0.1:*,http://192.168.*:*,http://10.*:*,http://172.*:* captcha: required: false traffic-audit-web/src/directives/dialogDrag.js
New file @@ -0,0 +1,61 @@ /** * v-dialog-dragï¼è®© Element UI 2.x ç el-dialog è½ç¨æ 颿 æå¨ã * Element UI 2.x ç el-dialog 没æ draggable 屿§ï¼é£æ¯ Element Plus çåè½ï¼ï¼ * æä»¥è¿éç¨æä»¤å®ç°ï¼åªæ¹ .el-dialog ç transformï¼ä¸æ¹å¸å±ï¼ * å¼¹çªå ³éï¼wrapper 被置为 display:noneï¼æ¶èªå¨å¤ä½ï¼ä¸æ¬¡æå¼ä»å¨åä½ã * ç¨æ³ï¼<el-dialog v-dialog-drag custom-class="xxx"> */ export default { inserted(el) { const dialog = el.querySelector('.el-dialog') const header = el.querySelector('.el-dialog__header') if (!dialog || !header) return let startX = 0 let startY = 0 let baseX = 0 let baseY = 0 let curX = 0 let curY = 0 let dragging = false const reset = () => { curX = 0 curY = 0 dialog.style.transform = '' } const onMove = (e) => { if (!dragging) return curX = baseX + (e.clientX - startX) curY = baseY + (e.clientY - startY) dialog.style.transform = 'translate(' + curX + 'px, ' + curY + 'px)' if (e.preventDefault) e.preventDefault() } const onUp = () => { if (!dragging) return dragging = false document.removeEventListener('mousemove', onMove) document.removeEventListener('mouseup', onUp) } const onDown = (e) => { if (e.button !== 0) return const t = e.target if (t && t.closest && t.closest('.el-dialog__headerbtn')) return dragging = true startX = e.clientX startY = e.clientY baseX = curX baseY = curY document.addEventListener('mousemove', onMove) document.addEventListener('mouseup', onUp) if (e.preventDefault) e.preventDefault() } header.addEventListener('mousedown', onDown) if (typeof MutationObserver !== 'undefined') { const mo = new MutationObserver(() => { if (el.style.display === 'none') reset() }) mo.observe(el, { attributes: true, attributeFilter: ['style'] }) } } } traffic-audit-web/src/main.js
@@ -3,8 +3,10 @@ import 'element-ui/lib/theme-chalk/index.css' import App from './App.vue' import router from './router' import dialogDrag from './directives/dialogDrag' Vue.use(ElementUI) Vue.directive('dialog-drag', dialogDrag) // 让 el-dialog 坿å¨ï¼Element UI 2.x æ draggable 屿§ï¼ Vue.config.productionTip = false // å ¨å±ç»åºï¼æ¸ é¤ç»å½æå¹¶åç»å½é¡µï¼å页é¢ä¾§è¾¹æ ãéåºç»å½ãèåå ±ç¨ï¼ traffic-audit-web/src/views/Login.vue
@@ -40,16 +40,20 @@ captchaId: '', clickIds: [], loggingIn: false, captchaRequired: true captchaRequired: false } }, created() { // éªè¯ç æ¯å¦å¯ç¨ä¸å¾ä»¥å端 /api/auth/captcha-config 为åï¼ // é»è®¤ä¸æ¾ç¤ºï¼åªæå端æç¡®è¿å required=true ææ¸²æéªè¯ç ç»ä»¶ã // ä¿®å¤ï¼æ¤åé»è®¤ true ä¸è¯·æ±å¤±è´¥æ¶éé»å¿½ç¥ï¼åæ¢ç½ç»å该é 置读ä¸å°ï¼ // ç»å½é¡µå°±ä¼æ®çä¸ä¸ªå è½½ä¸åºæ¥çéªè¯ç ç½æ¡å¹¶æç¤ºâéªè¯ç å 载失败ï¼è¯·æ£æ¥ç½ç»âã axios.get('/api/auth/captcha-config', { timeout: 10000 }) .then(res => { const d = res.data if (d && d.code === 200) this.captchaRequired = d.data.required !== false this.captchaRequired = !!(d && d.code === 200 && d.data && d.data.required === true) }) .catch(() => {}) .catch(() => { this.captchaRequired = false }) }, methods: { onCaptchaVerified(payload) { traffic-audit-web/src/views/ReportExport.vue
@@ -99,12 +99,14 @@ </div> </el-alert> </div> <el-dialog :title="'é¢è§æ°æ® - ' + previewModule + 'ï¼' + previewPeriod + 'ï¼'" :visible.sync="previewVisible" width="760px"> <el-dialog :title="'é¢è§æ°æ® - ' + previewModule + 'ï¼' + previewPeriod + 'ï¼'" :visible.sync="previewVisible" width="760px" top="5vh" custom-class="pv-dialog" v-dialog-drag> <div class="preview-body"> <div v-for="it in previewItems" :key="it.key" class="preview-item"> <div class="preview-head"> <span class="preview-name">{{ it.label }}</span> <span class="preview-rows">å ± {{ it.rowCount || 0 }} è¡</span> <span class="preview-rows" v-if="it.key === 'summaryWorkbook'">ææ {{ (it.summary || []).length }} 项</span> <span class="preview-rows" v-else>å ± {{ it.rowCount || 0 }} è¡æç»</span> </div> <div class="preview-coverage"> <span class="cov-label">æåº¦è¦çï¼</span> @@ -114,7 +116,7 @@ </div> <table class="preview-summary wb-table" v-if="it.key === 'summaryWorkbook' && it.summary && it.summary.length"> <thead> <tr><th style="width:44%">ææ </th><th style="width:30%">æ°æ®</th><th>忝</th></tr> <tr><th style="width:12%">åç±»</th><th style="width:40%">ææ </th><th style="width:28%">æ°æ®</th><th>忝</th></tr> </thead> <tbody> <template v-for="(sec, si) in wbRows(it.summary)"> @@ -130,7 +132,7 @@ <div v-if="it.key === 'summaryWorkbook' && wbMissing(it.summary)" class="wb-note"> é¨åææ ç¼ºå°ä¸å¹´åæï¼{{ wbPrevYear() }}ï¼åºææ°æ®ï¼åæ¯ææªè®¡ç® </div> <table class="preview-summary" v-else-if="it.summary && it.summary.length"> <table class="preview-summary" v-if="it.key !== 'summaryWorkbook' && it.summary && it.summary.length"> <tbody> <tr v-for="(s, i) in it.summary" :key="i"> <td>{{ s.label }}</td> @@ -388,7 +390,7 @@ this.previewVisible = true this.loading = '' }) .catch(err => this.failWith(err)) .catch(err => this.failWith(err, 'é¢è§')) }, fmtVal(v) { if (v === null || v === undefined || v === '') return 'â' @@ -505,13 +507,45 @@ }) .catch(() => doExport()) }, failWith(err) { // é¢è§/导åºå¤±è´¥ç»ä¸æç¤ºï¼åºåâè¿ä¸ä¸æå¡å¨âä¸âå端è¿åçé误åå âã // å¯¼åºæ¥å£ç¨ responseType: 'blob'ï¼æ¥éæ¶ data 乿¯ Blobï¼å¿ é¡»å è¯»ææ¬åè§£æï¼ // å¦åæ¿ä¸å°å端çå®åå ï¼åªä¼æ¾ç¤ºç¬¼ç»çâè¯·ç¡®è®¤å·²å¯¼å ¥å¯¹åºæ°æ®âã failWith(err, action) { if (err && err._toast) { this.loading = ''; return } let msg = '' const d = err && err.response && err.response.data if (d && typeof d === 'object' && d.message) msg = d.message this.$message.error('导åºå¤±è´¥ï¼' + (msg || 'è¯·ç¡®è®¤å·²å¯¼å ¥å¯¹åºæ°æ®ï¼ææ¥çå端æ¥å¿')) this.loading = '' const act = action || '导åº' const finish = (reason) => { this.$message.error(act + '失败ï¼' + reason) this.loading = '' } if (!err || !err.response) { if (err && err.code === 'ECONNABORTED') { finish('请æ±è¶ æ¶ï¼è¯·ç¨åéè¯'); return } finish('æ æ³è¿æ¥æå¡å¨ï¼è¯·æ£æ¥ç½ç»è¿æ¥ï¼æç¡®è®¤å端æå¡æ¯å¦å·²å¯å¨') return } const d = err.response.data const fallback = 'è¯·ç¡®è®¤å·²å¯¼å ¥å¯¹åºæ°æ®ï¼ææ¥çå端æ¥å¿' if (d && typeof d.text === 'function') { Promise.resolve(d.text()).then(txt => finish(this.errReason(txt) || fallback)).catch(() => finish(fallback)) return } finish(this.errReason(typeof d === 'string' ? d : (d && d.message)) || fallback) }, // å端å¼å¸¸ååºå¯è½æ¯ JSON/HTML/çº¯ææ¬ï¼å°½éæååºå¯è¯»çåå errReason(raw) { if (!raw) return '' let text = String(raw).trim() if (text.charAt(0) === '{' || text.charAt(0) === '[') { try { const j = JSON.parse(text) if (j && j.message) return j.message } catch (e) { /* é JSONï¼æçº¯ææ¬å¤ç */ } } text = text.replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim() // å¼å代ç/ç½ç»å±æ¥é转æäººè¯ï¼é¿å ç´æ¥æ ECONNREFUSED ä¹ç±»æç»ç¨æ· if (/ECONNREFUSED|ECONNRESET|Proxy error|socket hang up|Network Error|Failed to fetch/i.test(text)) { return 'æ æ³è¿æ¥æå¡å¨ï¼è¯·æ£æ¥ç½ç»è¿æ¥ï¼æç¡®è®¤å端æå¡æ¯å¦å·²å¯å¨' } return text.length > 200 ? text.slice(0, 200) + 'â¦' : text }, downloadBlob(res, fileName) { const isZip = /\.zip$/.test(fileName) @@ -579,3 +613,11 @@ .wb-yoy.yoy-empty { color:#C0C4CC; } .wb-note { color:#E6A23C; font-size:12px; margin:2px 0 8px; } </style> <style> /* é¢è§æ°æ®å¼¹çªï¼åè§ + å¯éè¿æ 颿 æå¨ï¼v-dialog-drag æä»¤ï¼ã ä¸è½åè¿ scopedï¼el-dialog é»è®¤ append-to-bodyï¼DOM æå¨ body ä¸ï¼scoped éæ©å¨å¹é ä¸å°ã */ .pv-dialog { border-radius: 10px; overflow: hidden; } .pv-dialog .el-dialog__header { cursor: move; user-select: none; -webkit-user-select: none; } .pv-dialog .el-dialog__headerbtn { cursor: pointer; } </style>