AGENTS.md
@@ -43,3 +43,7 @@ - åå ¥ `docs/工使¥ç»/`ï¼å½åï¼`工使¥ç»_<YYYY-MM-DD>.md`ã - å 容è³å°å å«ï¼ä»å¤©åäºä»ä¹ï¼åè½/ä¿®å¤ï¼ãæµè¯ç»ææè¦ãéçé®é¢ä¸å¾ åãæå¤©è®¡åã - å½å¤©æ²¡æä»£ç /æµè¯å·¥ä½æ¶ï¼ä¹è¦åï¼ä¸å¥è¯è¯´æâ仿¥æ ä»£ç æ¹å¨âå³å¯ï¼ã 3. **git 工使µï¼2026-09-03 ç¨æ·ææï¼æ éåè¯¢é®æ¯å¦æ¨éï¼** - æ¯æ¬¡ä¿®æ¹ä»£ç /ææ¡£åï¼å æµè¯å¹¶åãåè½æµè¯æ¥åã/æ´æ°ã工使¥ç»ãï¼å `git fetch gitea` ä¸è¿ç«¯ `main` 对æ¯åå¹¶ï¼å¿ è¦æ¶è§£å³å²çªï¼ï¼ç¡®è®¤æ 误å commit å¹¶ push å°å ¬å¸ giteaï¼`http://61.183.254.94:3000/r/trafficAudit.git`ï¼è´¦å· zyjï¼ã - è¥è¿ç«¯å·²æåäºæ°æäº¤ï¼å¿ é¡»å åå¹¶/åºäºææ°åæ¨ï¼ç¦æ¢å¼ºæ¨è¦çåäºä»£ç ã - å ¬å¸ git è´¦å·å¯ç åªéè¿æ¬æº git åæ®/ä¸´æ¶ askpass 使ç¨ï¼ç¦æ¢åè¿ä»åºå ä»»ä½ææ¡£ææäº¤å 容ã docs/¹«Â·ÂÿÍ/Ä£°å_¸öÌå¿ÍÔË£¨2026.7£©.xlsxBinary files differ
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_¹«Â·Âÿͱ¨±í²¢Èë¸öÌå¿ÍÔË_2026-09-03.md
New file @@ -0,0 +1,33 @@ # åè½æµè¯æ¥åï¼å ¬è·¯æ 客æ¥è¡¨å¹¶å ¥ä¸ªä½å®¢è¿ï¼2026-09-03ï¼ ## åè½è¯´æ æ 2026-09-03 ä¸å¡å£å¾ç¡®è®¤ï¼ãå¾ ä¸å¡ç¨æ·ç¡®è®¤æ¸ åã#1/#2/#3ï¼ï¼ - åå¸å·è¡¨ãçæ_å ¬è·¯æ 客åå¸å·ã客è¿é/å¨è½¬é æ»è¡ = ä¼ä¸(H2031) + 个ä½ï¼å ¶ä¸ä¸ªä½è¡ä¿çãåªæ¾ç¤ºä¸ªä½ï¼ - ä¸å£å¾ æç»/æå/åæ ä¸è¡¨ç æ»éè¡ãå ¬è·¯ççº¿è¡ å®¢è¿é/å¨è½¬é åæ ·å¹¶å ¥ä¸ªä½ï¼åæ¯åå£å¾ï¼æ å»å¹´æ°æ®ç空ï¼ï¼ - åæä¸ªä½åºå 2 è¡ï¼æ¥è¡¨å±æå¸å·å并为 1 è¡ï¼ä¸æ¹å¯¼å ¥å»éï¼ã ä»£ç æ¹å¨ï¼traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java - passengerMonthValï¼metricIdx 0/1ï¼å®¢è¿é/å¨è½¬éæ»è¡ï¼æ¹ä¸º ä¼ä¸+个ä½ï¼ - loadMidClassMapï¼ä¸ªä½å®¢è¿æ°æ®å¹¶å ¥ dim1(å ¬è·¯ç线)/dim0(æ»é)ã 夿³¨ï¼æ¬æ¬¡ä»£ç æªæäº¤ãæªæ¨éã ## æµè¯ç¯å¢ - å端 8090ï¼spring-boot:runï¼ï¼æ°æ®åº MySQL 127.0.0.1:3308/traffic_auditã - æ°æ®ï¼2026-07 H2031 ä¼ä¸ææ¥ 771 è¡ + 个ä½å®¢è¿ 7 è¡ï¼6 å¸å·ï¼å ¶ä¸åæ 2 è¡ï¼ï¼2026-03 ä¼ä¸ 778 è¡ï¼åå¸å ¬äº¤å乡 2026-06/07 å 142 è¡ã - 模æ¿ï¼docs/å ¬è·¯æ 客/ ä¸ çæ_å ¬è·¯æ 客åå¸å·.xlsxãçæ_ä¸å£å¾æç».xlsx çã - æ¹æ³ï¼è°ç¨ /api/report/export/*?period=2026-07 çæ 4 å¼ è¡¨ï¼ä¸åºå æå¸å· SQL èåå¼éæ ¼æ¯å¯¹ï¼å®¹å·® 0.002ï¼æ ¼å¼æ 4 ä½å°æ°ï¼ã ## ç¨ä¾ä¸ç»æ 1. åå¸å·è¡¨ 2026-07ï¼æ£åï¼ï¼18 åºåï¼å ¨ç+17 å¸å·ï¼x 客è¿é/å¨è½¬é/å ¶ä¸ä¸ªä½ ä¸¤ä¸¤æ ¸å¯¹ï¼å ¨é¨ä¸è´ã示ä¾ï¼é»ç³æ»å®¢è¿é 71.2988=70.8(ä¼ä¸)+0.4988(个ä½)ï¼åææ»å®¢è¿é 56.9534=54.7732+2.1802ï¼ä¸¤è¡åä¸ï¼ï¼å ¨ç 1631.2013/113731.3141ãç»è®º PASSã 2. ä¸å£å¾æç» 2026-07 客è¿éåï¼æ£åï¼ï¼ç线è¡=ä¼ä¸+个ä½ãå ¬äº¤è¡=å ¬äº¤åä¹¡ãæ»éè¡=ç线+å ¬äº¤ï¼1-6 æåéæ ¼ä¸è´ï¼æ¦æ± 3 æç线 326.996 çï¼ï¼7 æåä¸ºæ¢ææ©å空ç½é®é¢ï¼è§é®é¢ 1ãç»è®º PASSï¼<=6 æèå´ï¼ã 3. ä¸å£å¾æå 2026-07ï¼æ£åï¼ï¼å ¨ç+17 å¸å· 累计(1-7æ)/彿 客è¿éãå¨è½¬éå ± 4 å x 18 è¡æ ¸å¯¹ä¸è´ï¼å¦å ¨ç累计 6170.906/286093.3504ã彿 3097.8613/141613.7241ï¼åå«ä¸ªä½ï¼ãç»è®º PASSã 4. ä¸å£å¾åæ 2026-07ï¼æ£åï¼ï¼å ¨ç 累计/彿 æ»/ç线/å ¬äº¤ 客è¿éãå¨è½¬éåå æ¯å ¬å¼æ ¸å¯¹ä¸è´ï¼ç线累计 3186.726/228737.9404ã彿 1631.2013/113731.3141 å«ä¸ªä½ï¼ãç»è®º PASSã 5. åå½ï¼passengerSeries 2026-07 æå æ¥å£ 200ï¼passengerCityDetail 2026-06ï¼æ ä¸ªä½æä»½ï¼æ£å¸¸çææ æ¥éãç»è®º PASSã ## åç°çé®é¢ä¸å¤ç½® 1. ä¸å£å¾æç» 2026-07 è³ 12 æåå æ ¼ä¸ç´¯è®¡åä¸å« >6 ææ°æ®ï¼æ¨¡æ¿æ©ååæ°åæ å ¬å¼ï¼å¯¼åºé»è¾åªå¡«å å·²æå ¬å¼åå æ ¼ã屿¢æé®é¢ï¼ä¸æ¬æ¬¡ä¸ªä½å¹¶å ¥æ¹å¨æ å ³ï¼ï¼å·²å¨æ¸ åè½çï¼å¦ç«ä»»å¡ä¿®å¤ extendMonthlyColumns 䏿ç»å¡«å ã 2. åå¸å·æ¨¡æ¿ç¥åæ¶åºå A åç®å为 æåºï¼æ¯å¯¹èæ¬æå«åæ å°åä¸è´ï¼éæ°æ®é®é¢ã ## ç»è®º 个ä½å¹¶å ¥å£å¾æä¸å¡ç¡®è®¤å®ç°ï¼åå¸å·ãä¸å£å¾æç»/æå/åæ 4 å¼ æ¥è¡¨æ°å¼ä¸æ°æ®åºèåä¸è´ï¼æ éé»éä½ï¼åè½éè¿ãä»£ç æªæäº¤æªæ¨éï¼å¾ ç¨æ·ç¡®è®¤åæäº¤ã docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_³ÇÊпÍÔËÐÂÔöÍøÔ¼³µ²ð·Ö±íÓë»ã×ܹ¤×÷²¾¼°Á½Î»Ð¡ÊýÏÔʾ_2026-09-03.md
New file @@ -0,0 +1,35 @@ # åè½æµè¯æ¥åï¼åå¸å®¢è¿æ¥è¡¨æ°å¢ãç½çº¦è½¦å®¢è¿éæå表ããéè·¯è¿è¾éæ±æ»è¡¨ã䏿°å¼ä¸¤ä½å°æ°æ¾ç¤ºï¼2026-09-03ï¼ ## åè½è¯´æ æ 2026-09-03 确认çä¸ä¸æ¥éæ±è½å°ä¸ä»¶äºï¼ 1. æ¥è¡¨çæ-åå¸å®¢è¿æ¥è¡¨ å表æ°å¢ä¸¤é¡¹ï¼`ç½çº¦è½¦å®¢è¿éæå表`ï¼key=wycSplitï¼ã`éè·¯è¿è¾éæ±æ»è¡¨ï¼æ´æ¬ï¼`ï¼key=summaryWorkbookï¼ï¼åé导åºèµ° `/api/report/export/{key}`ï¼å¤éæå èµ° `/api/report/export/selected`ï¼åè¡¨âæ°æ®å°±ç»ªâç¶æç± `/api/report/ready` ç»ä¸è®¡ç®ï¼å·²æ¥å ¥ï¼ã 2. ç½çº¦è½¦æåç®æ³ä¸ãç½çº¦è½¦æå.xlsxãæé¡µäººå·¥å£å¾ä¸è´ï¼å®¢è¿é=订åå æ¯Ãå ¨çç½çº¦è½¦å®¢è¿é pinï¼åå¸å =巡游åºç§åå¸å å æ¯ä»£çï¼æ¦æ±ä¿æèªèº«ãå ¶ä½æå©ä½å æ¯åæè³å ¨çåå¸å pinï¼åé å乡=æ»éâåå¸å ï¼å¨è½¬é=客è¿éÃ巡游åºç§å¹³åè¿è·å æ¯åæå ¨çå¨è½¬é pinï¼åå¸å åæ³ï¼ãè¾å ¥=ãç½çº¦è½¦è®¢ååå ¨çæ»é.xlsxã2026-07 è¡ï¼B-E å ¨ç pinãG-W 17 å¸å·è®¢åï¼+ ç³»ç»å·¡æ¸¸åºç§ææ¥ï¼city_taxi_monthlyï¼å«å¹³åè¿è·ï¼ã 3. ææçæè¡¨æ°å¼âæ¾ç¤ºä¸¤ä½å°æ°ãä¿çå ¨ç²¾åº¦âï¼`toBytes(XSSFWorkbook)`/`toBytesHssf(HSSFWorkbook)` åºå£ç»ä¸æ§è¡ `applyTwoDecimalFormat`ââéæ´æ°ç General/0/0.0/#,##0 ç纯æ°å¼æ ¼å¼æ¹ä¸º `0.00` æ¾ç¤ºï¼åå¨å¼ä¸å¨ï¼æ´æ°ãç¾åæ¯ãæ¥æãç§å¦è®¡æ°ãå·²å« `0.00` çæ ·å¼ä¸å¾ä¸æ¹åã ä»£ç æ¹å¨ï¼æªæäº¤ãæªæ¨éï¼ï¼ReportExportService.javaï¼æ°å¢ exportSummaryWorkbook/exportWycSplit/resolveSummaryMother/loadWycMonthlyInput/applyTwoDecimalFormat å selected/ready 忝ï¼ãReportExportController.javaï¼æ°å¢ä¸¤ä¸ª GET 端ç¹ï¼ãReportExport.vueï¼åå¸å®¢è¿æ¥è¡¨å表å 两项ï¼ãæ¬æå¦ä¿®å¤æ¯ç缺æéé»åéé®é¢ï¼è§âåç°çé®é¢â第 1 æ¡ï¼ã ## æµè¯ç¯å¢ - å端 8090ï¼mvn spring-boot:runï¼Started OK 16:32ï¼ï¼å端 8080 就绪ï¼MySQL 127.0.0.1:3308ã - 人工å£å¾åèï¼docs/åå¸å®¢è¿/ç½çº¦è½¦æå_2026å¹´7æ.xlsxï¼âä¸äººå·¥å¤§è¡¨æ ¸å¯¹â页ï¼ï¼è¾å ¥æä»¶ docs/åå¸å®¢è¿/ç½çº¦è½¦è®¢ååå ¨çæ»é.xlsxï¼2026-07 è¡ï¼ã - æ¯çï¼docs/çææ±æ»å¤§è¡¨/2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨.xlsxï¼19 页ç¾ï¼4 éè页ï¼ã - æ¹æ³ï¼HTTP è°ç¨æ¥å£ä¸è½½äº§ç©ï¼openpyxl éæ ¼æ¯å¯¹ã ## ç¨ä¾ä¸ç»æï¼è¾å ¥ / 颿 / å®é / ç»è®ºï¼ 1. æ£å-æ°æ®å°±ç»ªï¼wycSplitãsummaryWorkbook æ¥ 2026-07 ready â å ready=trueï¼rows 17/159ï¼note 空ï¼ãPASSã 2. æ£å-wycSplit 导åºï¼GET /export/wycSplit?period=2026-07 â 200ï¼äº§ç© 7371Bï¼å页 `2026-07æå`ï¼å®¢è¿éåï¼å ¨ç+17 å¸å·ï¼+ å¨è½¬éåç»æå®æ´ãPASSã 3. æ£å-å é¨å¾ç¨½ï¼å ¨çè¡è®¢å/客è¿é/巡游é/åå¸å /åé åä¹¡ä¸ 17 å¸å·æ±åä¸è´ 13 项ãåå¸å· åé å乡=æ»éâåå¸å ãè¾å ¥ pinï¼4852.3/4430.84/28348.02/22705.61/订å 29730791ï¼é项å½ä¸ãPASSã 4. æ£å-ä¸äººå·¥å£å¾ä¸è´ï¼17 å¸å·åææ ï¼å®¢è¿éãåå¸å 客è¿éãå¨è½¬éãåå¸å å¨è½¬éï¼éå¸å·ä¸âä¸äººå·¥å¤§è¡¨æ ¸å¯¹âæ¯è¾ï¼æå¤§ç»å¯¹åå·® 0.00000000ï¼éå¼ 0.02ï¼ãPASSã 5. æ£å-两ä½å°æ°/å ¨ç²¾åº¦ï¼äº§ç© 185 ä¸ªéæ´æ°æ°å¼æ ¼ number_format å ¨é¨ä¸º `0.00`ï¼åå¨å¼ä¿çå ¨ç²¾åº¦ï¼å¦ 1825.1975355818822ã0.9131422212146817ï¼ï¼è®¢åçæ´æ°å¼ä¿æ General ä¸åºç° `.00`ãPASSã 6. æ£å-summaryWorkbook 导åºï¼GET /export/summaryWorkbook?period=2026-07 â 200ï¼äº§ç© 1,269,456Bï¼19 页ç¾åç§°/顺åº/éèç¶æä¸æ¯çä¸è´ï¼å ¨ç°¿åå æ ¼å¼ 0 å·®å¼ï¼ä» 10,588 夿¾ç¤ºæ ¼å¼ç± General è°æ´ä¸º `0.00`ï¼æ¯çç¼åå°æ°ï¼å¼ä¸åï¼ãPASSã 7. æ£å-æ¹éæå ï¼/export/selected?types=wycSplit,summaryWorkbook â zip 1,206,867B å«ä¸¤ä¸ªæä»¶ãPASSã 8. è´å-wycSplit 缺è¾å ¥ï¼2026-08ï¼è¾å ¥è¡¨è¯¥è¡æªç»´æ¤ï¼â HTTP500ï¼messageâç½çº¦è½¦è¾å ¥ 2026-08 è¡ä¸å®æ´ï¼å ¨ç pin / 订å缺失ï¼è¯·æ ¸å¯¹ãç½çº¦è½¦è®¢ååå ¨çæ»é.xlsxãâï¼ready=false å¹¶éç¼ºæ°æ®è¯´æãPASSï¼é¢æå¤±è´¥ãæç¤ºæç¡®ï¼ã 9. è´å-summaryWorkbook 缺æ¯çï¼2026-08ï¼docs/çææ±æ»å¤§è¡¨ æ 8 ææ¯çï¼â HTTP500âæªæ¾å°æ¨¡æ¿æä»¶: 2026å¹´8æéè·¯è¿è¾éæ±æ»è¡¨.xlsxâï¼ready=falseãPASSï¼é¢æå¤±è´¥ãæç¤ºæç¡®ï¼ä¿®å¤åéªè¯ï¼ã 10. ç¼è¯åå½ï¼mvn compile EXIT=0ï¼å端é坿 å¼å¸¸ãPASSã ## åç°çé®é¢ä¸å¤ç½® 1. ä¿®å¤ï¼summaryWorkbook æ¯çå®ä½å带ââ¤ç®æ æææ°æ¯çåéâï¼å¯¼è´ 2026-08 请æ±éé»ä½¿ç¨ 7 ææ¯ççæãæä»¶å为 2026-08 èå 容ä»ä¸º 2026 å¹´ 7 æï¼è·¨å¹´åºæ¯è¿ä¼åªæ¢å¹´ä»½ä¸æ¢æä»½ï¼ï¼å±è¯¯å¯¼æ§è¾åºãå·²å é¤åéé»è¾ï¼æ¹ä¸ºä» 精确å¹é `{å¹´}å¹´{æ}æéè·¯è¿è¾éæ±æ»è¡¨.xlsx`ï¼ç¼ºå¤±å³æç¡®æ¥éï¼æä»½æ©å±è§åçå¾ P0 æ¯çå®ç¨¿ã 2. è§å¯é¡¹ï¼ä¸æ¬æ¬¡æ¹å¨æ å ³ï¼ï¼cityTaxiDetail 导åºä» 500âæªæ¾å°æ¨¡æ¿æä»¶: çæ_巡游åºç§å®¢è¿éåå¸å·æç».xlsxâï¼docs/åå¸å®¢è¿ ä¸è¯¥è¾åºæ¨¡æ¿æä»¶å½å缺失ï¼å¦ç«ä»»å¡è·è¿è¡¥é½æ°ç弿¨¡æ¿ã 3. 使ç¨è¯´æï¼ç½çº¦è½¦æåæ¯æéå¨ãç½çº¦è½¦è®¢ååå ¨çæ»é.xlsxãè¡¥ä¸è¡å½ææ°æ®ï¼B-E å ¨ç pinãG-W 17 å¸å·è®¢åãF å计ï¼ï¼ready ç¶æä¼æç¤ºç¼ºå¤±ï¼ä¸ä¼éé»ç©ºè·ã ## ç»è®º 两个æ°å表é项ä¸â两ä½å°æ°æ¾ç¤ºãå ¨ç²¾åº¦åå¨âæå£å¾å®ç°å¹¶éè¿æ£å/è´ååå½ï¼ç½çº¦è½¦æå 2026-07 ä¸äººå·¥å£å¾å¤§è¡¨å®å ¨ä¸è´ï¼æå¤§åå·® 0ï¼ï¼æ±æ»å·¥ä½ç°¿éª¨æ¶ä¸æ¯çé¶å¼å·®å¼ï¼ç¼ºæ/缺è¾å ¥åæç¡®æ¥éä¸éé»ãä»£ç æªæäº¤æªæ¨éã docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_»ã×ܹ¤×÷²¾¹Ç¼ÜÉú³É_2026-09-03.md
New file @@ -0,0 +1,34 @@ # åè½æµè¯æ¥åï¼æ±æ»å·¥ä½ç°¿éª¨æ¶çæï¼P0-P1ï¼ï¼2026-09-03ï¼ ## åè½è¯´æ æ 2026-09-03 å£å¾ç¡®è®¤ï¼ãèªå¨çææ±æ»å·¥ä½ç°¿è½å°æ¹æ¡ãv0.1ï¼`#REF!` 以åå¤çï¼2025 å¹´åææ¶ä¿çæ¯çç¼åå¼ï¼å è¯ P0-P1 骨æ¶ï¼ï¼æ°å¢æ±æ»å·¥ä½ç°¿çææ¥å£ï¼ - åç«¯ä» `docs/çææ±æ»å¤§è¡¨/` å®ä½æ¯çãYYYYå¹´Mæéè·¯è¿è¾éæ±æ»è¡¨.xlsxãå¹¶æ´æ¬å¤å¶ï¼ä¿çå ¨é¨ 19 个页ç¾ãçå¼ãå ¬å¼ä¸ 2025/2024 åèåç¼åå¼ï¼ - ä» å½ç®æ å¹´ â 2026 æ¶ï¼å°åå æ ¼ææ¬ä¸ç `2026å¹´` åç¼æ¿æ¢ä¸ºç®æ å¹´ï¼å¦ 2027å¹´ï¼ï¼2025/2024 åæ ·ä¸é¡µç¾åä¸å¨ï¼ç®æ 年为 2026 æ¶ä¸å任使¿æ¢ï¼ä¸æ¯çä¸è´ï¼ï¼ - æ°æ®å¡«å ï¼å°è´¦âå£å¾åæâæåï¼ææ¹æ¡ P2 èµ·éæ¥æ¥å ¥ï¼æ¬æä» éªè¯éª¨æ¶å¯çæãæ æåã ä»£ç æ¹å¨ï¼æªæäº¤ãæªæ¨éï¼ï¼ - traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java - æ°å¢ `summary.template-dir` é 置项ï¼é»è®¤ `docs/çææ±æ»å¤§è¡¨`ï¼ï¼ - æ°å¢ `exportSummaryWorkbook(period, mode)` ä¸ `dynamicSummaryYear(wb, year)`ï¼ - `selectedReportData` å¢å `summaryWorkbook` 忝ï¼`REPORT_FILE_NAMES` å¢å `summaryWorkbook`ã - traffic-audit-server/src/main/java/com/trafficaudit/reportexport/controller/ReportExportController.java - æ°å¢ `GET /api/report/export/summaryWorkbook?period=â¦&mode=month`ã ## æµè¯ç¯å¢ - å端 8090ï¼start-dev.ps1 å¯å¨ï¼å°±ç»ªæ¥å¿ OKï¼ï¼MySQL 127.0.0.1:3308ã - æ¯çï¼docs/çææ±æ»å¤§è¡¨/2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨.xlsxï¼19 页ç¾ï¼éè 4 页ï¼å ¬è·¯æ»å®¢è¿ã2025å¹´åå¸å®¢è¿éãä¸å£å¾å®¢è¿éãä¸å£å¾è®¡ç®è¿ç¨ï¼ã - æ¹æ³ï¼è°ç¨æ¥å£ä¸è½½çææä»¶ï¼openpyxl 䏿¯çé项æ¯å¯¹ï¼é¡µç¾æ¸ å/顺åº/éèç¶æ/å¹´ä»½ææ¬è®¡æ°/åä¸è¡çå¼ï¼ã ## ç¨ä¾ä¸ç»æ 1. 2026-07 骨æ¶çæï¼æ£åï¼ï¼æ¥å£ 200ï¼äº§ç© 1.23MBï¼é¡µç¾ 19 个ä¸é¡ºåºä¸æ¯çä¸è´ï¼4 个éèé¡µä¿æ hiddenãç»è®º PASSã 2. çå¼ä¿çï¼æ£åï¼ï¼19 页åä¸è¡åå æ ¼åç¬¦ä¸²ä¸æ¯ç 0 å·®å¼ï¼å«è¡¨å¤´å¹´ä»½ 2026å¹´ï¼ï¼æ 页ç¾è¢«æ¹å/å¢å ãç»è®º PASSã 3. å¹´ä»½ææ¬æªè¢«è¯¯æ¿æ¢ï¼æ£åï¼ï¼å ¨è¡¨ç»è®¡ `2025å¹´`146 å¤ã`2024å¹´`160 å¤ã`2026å¹´`59 å¤ï¼çææä»¶ä¸æ¯çå®å ¨ä¸è´ï¼ç®æ å¹´=2026 æ¶ä¸åæ¿æ¢ï¼ãç»è®º PASSã 4. 缺失æä»½è´åï¼period=2026-08 请æ±è¿å 500ï¼å端æ¥å¿æ¥ `æªæ¾å°æ¨¡æ¿æä»¶: 2026å¹´8æéè·¯è¿è¾éæ±æ»è¡¨.xlsx`ï¼ç¬¦åé¢æï¼æ¯çä» 7 æï¼ãç»è®º PASSï¼é¢æå¤±è´¥ï¼ã 5. ç¼è¯åå½ï¼æ¹å¨å mvn ç¼è¯ EXIT=0ï¼compile2.logï¼ï¼å端å¯å¨æ å¼å¸¸ãç»è®º PASSã ## åç°çé®é¢ä¸å¤ç½® 1. å¨æå¹´ä»½æ¿æ¢ï¼å¦ 2027 å¹´ï¼é»è¾ä» åäºä»£ç èµ°æ¥ + 2026 æçéªè¯ï¼æªç«¯å°ç«¯å®æµï¼æ¯çåªæ 2026 å¹´ 7 æãç®å½ä¸æ å ¶å®å¹´ä»½æ¨¡æ¿ï¼å±é¢æï¼ï¼P2 é¶æ®µè¡¥ä¸ä¸ªä¸´æ¶ 2027 模æ¿åæ¿æ¢åå½ã 2. æ¹æ¡éçå¾ ææ¿é¡¹ï¼è¡åè¾¹çãæä»½æ©å±ã2024 åã轨éè½®æ¸¡å ¥åºãè¾åºç®å½ï¼æ¬æä¸å¤çï¼æ¨è¿ P2ï¼å°è´¦é¡µæ°æ®å¡«å ï¼åé确认ã ## ç»è®º æ±æ»å·¥ä½ç°¿ P0-P1 éª¨æ¶æå£å¾å®ç°å¹¶éè¿éªè¯ï¼æ´æ¬å¤å¶æ¯ççææåï¼é¡µç¾/éè/çå¼/2025-2024 ç¼åå¼é¶æåï¼ç®æ å¹´ 2026 æ¶ä¸æ¯çä¸è´ï¼ç¼ºå¤±æä»½æâæªæ¾å°æ¨¡æ¿æä»¶âæç¡®æ¥éï¼æ éé»é误ãä»£ç æªæäº¤æªæ¨éã docs/³ÇÊпÍÔË/ÍøÔ¼³µ¶©µ¥¼°È«Ê¡×ÜÁ¿.xlsxBinary files differ
docs/¹¤×÷ÈÕ½á/¹¤×÷ÈÕ½á_2026-09-03.md
New file @@ -0,0 +1,39 @@ # 工使¥ç»_2026-09-03 ## ä»å¤©åäºä»ä¹ 1. å ¬è·¯æ 客â个ä½å¹¶å ¥âå£å¾è½å°ï¼åå¸å·æ»è¡=ä¼ä¸+个ä½ï¼ä¸å£å¾æç»/æå/åæçççº¿ä¸æ»éå¹¶å ¥ä¸ªä½ï¼åæåºå 2 è¡æ¥è¡¨åå¹¶ 1 è¡ï¼ï¼å·²æµè¯å¹¶åºæ¥åï¼docs/åè½æµè¯æ¥å/åè½æµè¯æ¥å_å ¬è·¯æ 客æ¥è¡¨å¹¶å ¥ä¸ªä½å®¢è¿_2026-09-03.mdã 2. ã2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨ãå£å¾æ¢³ç宿ï¼äº§åº docs/çææ±æ»å¤§è¡¨/页ç¾é»è¾å ³ç³»è¯´æ.md ä¸ èªå¨çææ±æ»å·¥ä½ç°¿è½å°æ¹æ¡.mdï¼v0.1ï¼P0-P7 计åï¼ã 3. æ±æ»å·¥ä½ç°¿ P0-P1 骨æ¶å®ç°ï¼æç¨æ·çå¤ï¼`#REF!` 以åå¤çã2025 ä¿çæ¯çç¼åå¼ãå è¯ä¸ä¸ï¼ï¼æ°å¢ GET /api/report/export/summaryWorkbookï¼æ´æ¬å¤å¶æ¯çãç®æ å¹´ 2026 æ¶é¶æ¹å¨ï¼å·²ç¼è¯ãå¯å¨å¹¶éªè¯éè¿ï¼æ¥åï¼docs/åè½æµè¯æ¥å/åè½æµè¯æ¥å_æ±æ»å·¥ä½ç°¿éª¨æ¶çæ_2026-09-03.mdã 4. æ°æ®å¯¼å ¥çé¢âå¹´æ¥âæ°æ®ç±»åå ¥å£æ¹ä¸ºéèï¼DataImport.vueï¼å¾ 忏 å已忥ï¼ã ## æµè¯ç»ææè¦ - å ¬è·¯æ å®¢å¹¶å ¥ä¸ªä½ï¼4 å¼ æ¥è¡¨æ°å¼ä¸åºå SQL èåéæ ¼ä¸è´ï¼å®¹å·® 0.002ï¼ï¼PASSï¼ä¸å£å¾æç» 7-12 ææ©å空ç½ä¸ºæ¢æé®é¢ï¼å¦ç«ä»»å¡ã - æ±æ»å·¥ä½ç°¿éª¨æ¶ï¼19 页ç¾/éè页/çå¼/2025-2024 ç¼åå¼ä¸æ¯çé¶å·®å¼ï¼2026-08ï¼æ æ¯çï¼æ¥âæªæ¾å°æ¨¡æ¿æä»¶âï¼ç¬¦å颿ï¼å¨æå¹´æ¿æ¢å¾ P2 è¡¥æµã ## éçé®é¢ä¸å¾ å - æ¨è¿ P2ï¼å°è´¦é¡µæ°æ®å¡«å ï¼åéææ¿ï¼è¡åè¾¹çãæä»½æ©å±ã2024 åå¤çã轨éè½®æ¸¡æ°æ®æ¯å¦å ¥åºãè¾åºç®å½ã - ç³»ç»å¾ åï¼#9 客è¿éåæ¯ç¯æ¯ 0% å®¡æ ¸è§åã#16 å¯¼å ¥å®æ¶è¿åº¦âå·²å¤ç N/M è¡âã#5 ç½çº¦è½¦æåå¡«å¼ï¼çæ°æ®æºï¼ï¼ä¸å£å¾æç» 7-12 æåå¡«å ã ## æå¤©è®¡å - æç¨æ·ç¡®è®¤æ¨è¿æ±æ»å·¥ä½ç°¿ P2ï¼å åºå°è´¦é¡µæ°æ®æ¥æºä¸å¡«å æ¹æ¡ï¼ï¼åæ¥æ¯æ¥åè½æµè¯æ¥åã - 09-03 代ç ä¸ææ¡£åæª commit/pushï¼ç¨æ·æªè¦æ±ï¼ç»ä¸æ¨éï¼ã ## 追å ï¼å½æ¥åç»ä¼è¯ï¼ 5. æ¥è¡¨çæ-åå¸å®¢è¿æ¥è¡¨å表æ°å¢ä¸¤é¡¹ï¼`ç½çº¦è½¦å®¢è¿éæå表`ï¼wycSplitï¼ã`éè·¯è¿è¾éæ±æ»è¡¨ï¼æ´æ¬ï¼`ï¼summaryWorkbookï¼ï¼å/å¤é导åºä¸ ready åç½®åæ¥å ¥ã 6. â两ä½å°æ°æ¾ç¤ºãä¿çå ¨ç²¾åº¦âè½å°ï¼xlsx/xls åºå£ç»ä¸ applyTwoDecimalFormatï¼éæ´æ°çº¯æ°å¼æ¾ç¤º 0.00ï¼æ´æ°/%/æ¥æä¸å¨ï¼ã 7. ä¿®å¤ï¼summaryWorkbook æ¯çå®ä½ååå¨â缺æéé»åéâï¼2026-08 ä¼ç¨ 7 ææ¯ççæè¯¯å¯¼æä»¶ï¼ï¼æ¹ä¸ºä» 精确å¹é ã缺æ¯çæç¡®æ¥éã 8. 产åºãè¾å ¥è¾åºä¸é»è¾å ³ç³»æ»è¡¨_2026-09-03.mdãï¼æ¥è¡¨çæè¾å ¥/页ç¾/è¿ç®æ±æ»ï¼ä¸ãåè½æµè¯æ¥å_åå¸å®¢è¿æ°å¢ç½çº¦è½¦æåè¡¨ä¸æ±æ»å·¥ä½ç°¿å两ä½å°æ°æ¾ç¤º_2026-09-03.mdãã ### è¿½å æµè¯æè¦ - wycSplit 2026-07ï¼å é¨å¾ç¨½ 13 项 PASSï¼ä¸äººå·¥å£å¾å¤§è¡¨åææ 17 å¸å·æå¤§åå·® 0.00000000ï¼185 ä¸ªéæ´æ°æ°å¼æ ¼å ¨é¨ 0.00 æ¾ç¤ºä¸åå¨å ¨ç²¾åº¦ã - summaryWorkbook 2026-07ï¼19 页ç¾/å¼ä¸æ¯çé¶å·®å¼ï¼ä» 10,588 夿¾ç¤ºæ ¼å¼ Generalâ0.00ï¼ï¼2026-08 缺æ¯çæ¥âæªæ¾å°æ¨¡æ¿æä»¶âä¸éé»ã - mvn compile EXIT=0ï¼å端已éå¯å¹¶å¨ 8090 è¿è¡ï¼è§å¯é¡¹ cityTaxiDetail 模æ¿ç¼ºå¤± 500 䏿¬æ¬¡æ¹å¨æ å ³ï¼å¦ç«ä»»å¡ã ### 追å 2ï¼16:40-17:10 ä¼è¯ï¼ 9. æ¢å¤å·¥ä½åºè¢«è¯¯å ç 13 个æ¥è¡¨è¾åºæ¨¡æ¿ï¼docs/å ¬è·¯æ 客ãdocs/åå¸å®¢è¿ãdocs/è´§è¿ ä¸ççæ_*.xlsxï¼ä»çæ¬åºæ¢å¤ï¼ï¼cityTaxiDetail çåå¸å®¢è¿å¯¼åºæ¢å¤ 200ï¼ä¸å 500ï¼cityTaxiDetail 132 ä¸ªå°æ°æ ¼å ¨é¨ 0.00 æ¾ç¤ºã 10. å£å¾æ ¸å®å¹¶æ´æ£ï¼åºç§/ç½çº¦è½¦âå ¨éâ åå¸å âï¼æ¦æ±é¤å¤ï¼ã2026-07 åºç§å ¨ç 5860.24/åå¸å 5351.24ï¼å乡差 509.00ï¼ï¼ç½çº¦è½¦æå 4852.30/4430.84ï¼å乡差 421.46ï¼ãæ¯çåºç§/ç½çº¦è½¦é¡µæ¬èº«å«æ»éè¡+å ¶ä¸åå¸å è¡ï¼åå¸å®¢è¿å£å¾ç¨å页âå ¶ä¸åå¸å âè¡ãå·²åæ¥ä¿®è®¢ã页ç¾é»è¾å ³ç³»è¯´æ.mdãä¸ãè¾å ¥è¾åºä¸é»è¾å ³ç³»æ»è¡¨_2026-09-03.mdãã 11. è½å°âå¯ä¸æ»è¡¨âï¼docs/æ¥è¡¨çæ_å ³ç³»é»è¾ä¸æ¯æ¥è¿åº¦æ»è¡¨.xlsxï¼5 页ç¾ï¼è¯´æ/æ¥è¡¨å ³ç³»æ»è¡¨/æ±æ»è¡¨é¡µç¾ä¸å£å¾/çé®ä¸å¾ ç¡®è®¤æ¸ å/æ¯æ¥å¾ åä¸å®æè¿åº¦ï¼ã ### 追å 3ï¼ä¸çåï¼17:10-17:40ï¼ 12. æ»è¡¨âæ¯æ¥å¾ åâä¸âç鮿¸ åâå¢å ä¼å 级åï¼P0 æ¬¡æ¥æå / P1 æ¬å¨ / P2 æç©ºï¼ï¼å¹¶é¢æ 09-04 å¾ å 6 æ¡ï¼å æ§çæ»è¡¨è¢« WPS å ç¨æ æ³è¦çï¼æ°çå¦å为 docs/æ¥è¡¨çæ_å ³ç³»é»è¾ä¸æ¯æ¥è¿åº¦æ»è¡¨_2026-09-03.xlsxï¼å ³éæ§æä»¶å坿¿æ¢åæ£å¼åï¼ã 13. ç¨æ·ææï¼è®°å ¥ AGENTS.md å·¥ä½è§èï¼ï¼ä»¥åæ¯æ¬¡æ¹å®ä»£ç å æå ¬å¸ gitea ææ°å¯¹æ¯åå¹¶ï¼å commit+pushï¼ä¸å鿬¡å¾æ±âæ¯å¦æ¨éâãæ¬æ¬¡å·²æ§è¡è¯¥æµç¨ã 14. 模æ¿ç»è®ºï¼å·¡æ¸¸åºç§æç»ççæç¨âç©ºæ°æ®æ¯ç + 导åºå¡«å¼âæ¹æ¡ï¼ä¸æ¹ç¨å¸¦æ°æ®ç模æ¿ã docs/´ýÒµÎñÓû§È·ÈÏÇåµ¥_2026-09-02.md
@@ -49,3 +49,42 @@ - æ¨¡æ¿æä»¶æ£è¢«å¦ä¸ä¼è¯ä¿®æ¹ï¼ä»¥ä¸ â æç 项䏿¶åæ¨¡æ¿æ ·å¼çï¼6/8/10/12/14ï¼å»ºè®®ä»¥âå¦ä¸ä¼è¯å®ç¨¿åççæ¬âåå½é¢æ ¸å¯¹ä¸æ¬¡ï¼é¿å é夿¹ä¸¤éã ## ç¨æ· 2026-09-03 éæ¡çå¤ä¸æ§è¡ç¶æï¼ææ°ï¼ä»¥æ¤ä¸ºåï¼ | # | 模å | ç¨æ·çå¤ï¼09-03ï¼ | æ§è¡ç¶æ / 计å | |---|---|---|---| | 1 | å ¬è·¯æ 客 | åæä¸¤è¡å并为ä¸è¡ï¼è·¨å¿+å¿å ç线ï¼ï¼å£å¾ç»ä¸ä¸ºç线 | æ¥è¡¨å±å·²æå¸å·å计ï¼åº 2 è¡â表 1 è¡ï¼ï¼å¾ 确认æ¯å¦å ¥åºä¹å并为ä¸è¡ï¼æ¹å¯¼å ¥å»éï¼ | | 2 | å ¬è·¯æ 客 | åå¸å·/ä¸å£å¾æç»/æå/åæè¡¨çâç线客è¿éãå¨è½¬éâé½åºæ¶µçä¸ªä½æ°æ®ï¼åé®âä½ æçåªä¸ªè¡¨âï¼ | ç°ç¶ï¼åå¸å·è¡¨æâå ¶ä¸ä¸ªä½âè¡ï¼å·²å¡«ï¼ï¼â客è¿é/å¨è½¬éâè¡ä¸ä¸å£å¾ççº¿è¡æªå¹¶å ¥ä¸ªä½ â å¾ ç¡®è®¤å£å¾åå¹¶å ¥ï¼è§ä¸æ¹å¾ 确认Aï¼ | | 3 | å ¬è·¯æ 客 | ç¨æ·ç´æ¥å¯¼å ¥ä¸ªä½å®¢è¿æ°æ®ï¼ç´æ¥æä¸ªä½æ°æ®æ±æ»å°ãçæ_å ¬è·¯æ 客åå¸å·ã | å¾ æ A å£å¾è½å®ï¼å¹¶å ¥æ»éè¡ï¼ä¿çâå ¶ä¸ä¸ªä½âè¡æåï¼å¹¶æ©å±å°ä¸å£å¾ä¸è¡¨ | | 4 | å ¬è·¯æ 客 | å¾ å | â æ¹æï¼H2031 缺æ/2025 åºæåç»è¡¥ | | 5 | åå¸å®¢è¿ | ç½çº¦è½¦åææåå ¬å¼å¡«å¼ï¼æ°æ®æ¥æºåç»è¡¥å 说æ | ç»´æç空ï¼çâé¨çº§æ»é/è®¢åæ°âæ¥æºè¯´æååå®ç°æå | | 6 | åå¸å®¢è¿ | æ¨¡æ¿ææ¶ç空ï¼å»å¹´æ°æ®åç»è¡¥å | â ç»´æç°ç¶ï¼å»å¹´å/忝çç©ºï¼ | | 7 | åå¸å®¢è¿ | ç空ï¼åç»è¡¥å | â ç»´æç°ç¶ï¼ç¼ºæåçç©ºï¼ | | 8 | åå¸å®¢è¿ | ä¸å®æ¹æ ·å¼ ä¸è´å³å¯ | â ç»´æç°ç¶ï¼è½¨éåªæå ¨ç/æ¦æ±/é»ç³çï¼ | | 9 | åå¸å®¢è¿ | 忝/ç¯æ¯ 0% éæ ¸å® â å å° åå¸å ¬äº¤ãè´§è¿ãå ¬è·¯æ 客 çå®¡æ ¸è§åé | 计åï¼è°ç å®¡æ ¸è§åæ¡æ¶åæ°å¢è§åï¼è§å¾ åéå R1ï¼ | | 10 | è´§è¿ | å·²å¨è¡¨æ ¼éé¢ä¿®è®¢ | â 已宿ï¼9/2 第äºé¡µå¡«å½æ + å头â彿宿âï¼ | | 11 | è´§è¿ | å¯¹ç §å®æ¹æ ·å¼ 确认 | å¾ åï¼é宿¹æ ·å¼ å¯¹ç §åå¸å·æç»çå¼ï¼ | | 12 | è´§è¿ | å ä¸ä¿®æ¹ï¼æ°æ®åç»è¡¥å½ï¼ä¸å£å¾å»å¹´æç»é¡µï¼ | â æ¹æ | | 13 | è½è | å¾ å | â æ¹æï¼åæ¯ç空维æç°ç¶ï¼ | | 14 | æèµ | ææ¶ææ¨¡æ¿åæ ·ï¼åç»æ¹å¨åäº¤æµ | â ç»´æç°ç¶ï¼.xls èæ ¼å¼ï¼ | | 15 | åè½ | ææ¶ä¸åå¹´æ¥å¯¼å ¥ï¼å¯ä»¥éèä¸ä¸ | â å·²å®ç°ï¼09-03 å端éèå¹´æ¥å ¥å£ï¼æ°æ®ä¿çï¼ | | 16 | ä½éª | ææå¯¼å ¥ä¸æ¾ç¤ºâå·²å¤ç N/M è¡â宿¶è¿åº¦ | 计åï¼è°ç ç°æå¯¼å ¥æ¹æ¬¡æºå¶åå®ç°ï¼è§å¾ åéå R2ï¼ | ### å¾ åéåï¼ææ¹ 09-03 èµ·ï¼ - [x] 15 å¹´æ¥å ¥å£éèï¼å·²æ¹ DataImport.vueï¼annual ç» hidden + visibleGroups è¿æ»¤ï¼ - [ ] 1/2/3 个ä½å®¢è¿å¹¶å ¥å ¬è·¯æ 客æ¥è¡¨ï¼å¾ 确认 Aï¼å¹¶å ¥å£å¾ï¼ - [ ] 1 åæä¸¤è¡å ¥åºåå¹¶ or æ¥è¡¨å±å计å³å¯ï¼å¾ 确认 Bï¼ - [ ] R1(9) 客è¿é忝/ç¯æ¯ 0% å®¡æ ¸è§åï¼åå¸å ¬äº¤/è´§è¿/å ¬è·¯æ å®¢ï¼ - [ ] R2(16) å¯¼å ¥âå·²å¤ç N/M è¡â宿¶è¿åº¦ï¼å端è¿åº¦æ¥è¯¢ + åç«¯è½®è¯¢ï¼ - [ ] 5 ç½çº¦è½¦æåå¡«å¼ï¼çä¸å¡æä¾æåæ°æ®æ¥æºï¼ - [ ] 11 è´§è¿åå¸å·æç»å¯¹ç §å®æ¹æ ·å¼ ## 09-03 ä¸åæ§è¡æ´æ°ï¼ä¸ªä½å¹¶å ¥å ¬è·¯æ 客æ¥è¡¨ï¼å·²å®ç°å¹¶éè¿åè½æµè¯ï¼ - [x] #1 åæï¼ç»´ææ¥è¡¨å±æå¸å·å并为ä¸è¡ï¼åºå 两è¡å计 21802/436433 -> 表å ä¸è¡ 2.1802/43.6433ï¼ï¼ä¸æ¹å¯¼å ¥å»éã - [x] #2/#3 åå¸å·è¡¨ 客è¿é/å¨è½¬é æ»è¡ = ä¼ä¸(H2031)+个ä½ï¼ä¸å£å¾ æç»/æå/åæ ä¸è¡¨ æ»é/å ¬è·¯ç线 è¡åæ ·å¹¶å ¥ä¸ªä½ï¼åæ¯åå£å¾ï¼æ å»å¹´æ°æ®ç空ï¼ã - æ¹å¨ï¼traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java - passengerMonthValï¼metricIdx 0/1 æ¹ä¸º ä¼ä¸+个ä½ï¼ - loadMidClassMapï¼ä¸ªä½å¹¶å ¥ dim1(å ¬è·¯ç线)/dim0(æ»é)ï¼ - éªè¯ï¼2026-07ï¼H2031 771 è¡ + ä¸ªä½ 7 è¡ï¼4 å¼ è¡¨æ°å¼ä¸åºå èåéæ ¼ä¸è´ï¼è¯¦è§ docs/åè½æµè¯æ¥å/åè½æµè¯æ¥å_å ¬è·¯æ 客æ¥è¡¨å¹¶å ¥ä¸ªä½å®¢è¿_2026-09-03.mdï¼ã - éçï¼ä¸æ¬æ¬¡æ¹å¨æ å ³ï¼ï¼ä¸å£å¾æç»æ¨¡æ¿æ©åå 2026-07~12 æåå æ ¼ä¸ç´¯è®¡ä¸å« >6 ææ°æ®ï¼å¦ç«ä»»å¡å¤çã docs/±¨±íÉú³É_¹ØÏµÂß¼ÓëÿÈÕ½ø¶È×ܱí_2026-09-03.xlsxBinary files differ
docs/Éú³É»ã×Ü´ó±í/2026Äê7ÔµÀ·ÔËÊäÁ¿»ã×ܱí.xlsxBinary files differ
docs/Éú³É»ã×Ü´ó±í/2026Äê7ÔµÀ·ÔËÊäÁ¿»ã×ܱí_7ÔÂÇå¿Õ²âÊÔ°æ.xlsxBinary files differ
docs/Éú³É»ã×Ü´ó±í/2026Äê7ÔµÀ·ÔËÊäÁ¿»ã×ܱí_7ÔÂÇå¿Õ²âÊÔ°æv2.xlsxBinary files differ
docs/Éú³É»ã×Ü´ó±í/×Ô¶¯Éú³É»ã×ܹ¤×÷²¾Â䵨·½°¸.md
New file @@ -0,0 +1,69 @@ # èªå¨çæãéè·¯è¿è¾éæ±æ»è¡¨ãè½å°æ¹æ¡ï¼v0.1ï¼2026-09-03ï¼ ## 1 ç®æ ä¸äº¤ä»ç© - ç³»ç»ææ¥è¡¨æèªå¨çæä¸æ¬æ±æ»å·¥ä½ç°¿ï¼2026-07 æ ·ä¾å·²ç±ç¨æ·æå·¥å¶ä½ï¼ä½äº docs/çææ±æ»å¤§è¡¨/2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨.xlsxï¼ã - 交ä»ç©å½¢æï¼ä¸ä¸ª .xlsx å·¥ä½ç°¿ï¼å å« 15 个å¯è§é¡µç¾ï¼çå¼ãå ¬å¼ãæ ·å¼ä¸äººå·¥æ¯çä¸è´ï¼ï¼éè页ï¼å ¬è·¯æ»å®¢è¿ã2025å¹´åå¸å®¢è¿éãä¸å£å¾å®¢è¿éãä¸å£å¾è®¡ç®è¿ç¨ï¼ä¿çä½éèï¼æ¬æ¬¡ä¸çº³å ¥æ°æ®å å·¥ã - ä¸ååç¬çæåå°è¡¨æä»¶ï¼ååå°è¡¨å¯¼åºåè½ä¿çä¸åï¼ä¾åè¡¨åºæ¯ä½¿ç¨ï¼ã ## 2 æ»ä½çç¥ï¼æ¨¡æ¿é©±å¨ + ä¸å±æµæ°´çº¿ - ä»¥ç¨æ·äººå·¥å·¥ä½ç°¿ä¸ºæ¯çï¼å¤å¶å ¶çå¼/æ ·å¼/åå¹¶/å ¬å¼ï¼ç³»ç»åªæ¸ ç©ºæ°æ®åºå¹¶åå¡«ï¼ä¿ç页å 累计ã忝ãæåãå æ¯å ¬å¼å¹¶éç®ãä¸ç°æ ReportExportService çæ¨¡æ¿æ¿æ¢æ¨¡å¼ä¸è´ï¼é£é©æå°ãä¸äººå·¥ææ¥è¿ã - æµæ°´çº¿åä¸å±ï¼ä¸ã页ç¾é»è¾å ³ç³»è¯´æãä¸è´ï¼ 1ï¼å°è´¦é¡µå¡«å ï¼ç线å 车ãå ¬äº¤ãåºç§ãç½çº¦è½¦ã轨é轮渡ï¼åæ¹å¼ãåå¸å·ãéæï¼ã 2ï¼å£å¾åæé¡µï¼åå¸å®¢è¿ï¼åå¸å å£å¾ï¼ãä¸å£å¾æç»ï¼åé å乡å£å¾ï¼ã 3ï¼æå页ï¼å叿±æ»ãåå¸åå¸å·ãè´§è¿ãè´§è¿éæåãè´§è¿å¨è½¬éæåãä¸å£å¾æåãä¸å£å¾åæãéè·¯è¿è¾å¨è½¬éã - æ ¡éªå±ï¼é¡µå å ¬å¼é recalc éç®ï¼çæåç¨åºå SQL èå䏿åéæ ¼å¯¹ç §ï¼éå¼ï¼æå¼ 0.005 以å ï¼ã ## 3 é¡µç¾æ¸ å䏿°æ®æºæ å° | é¡µç¾ | å± | å£å¾ä¸å 容 | æ°æ®æºï¼åºè¡¨/å¯¼å ¥ç±»åï¼ | å¤ç¨ç°æé»è¾ | |---|---|---|---|---| | ç线å 车 | 1 | å ¬è·¯ç线+å 车ï¼å®¢è¿éè¡å«ä¸ªä½ï¼å ¶ä¸ä¸ªä½åç¬è¡ | h2031_enterprise_monthlyãpassenger_individual_monthly | çæ_å ¬è·¯æ 客åå¸å· æ¹é ï¼ä¸ªä½å¹¶å ¥æ»è¡å·²å®ç°ï¼2026-09-03ï¼ | | å ¬äº¤ | 1 | å ¨ç+å¸å· æ»éä¸å ¶ä¸åå¸å | city_bus_monthly | åå¸å®¢è¿å¯¼åºæ¨¡æ¿é»è¾æ©å± | | åºç§ | 1 | 巡游åºç§ï¼æ»é=åå¸å | åºç§å¯¼å ¥è¡¨ï¼city_taxi ç¸å ³ï¼ | åä¸ | | ç½çº¦è½¦ | 1 | æ»é=åå¸å ï¼æåæ¥æºå¾ å®ï¼ | ç½çº¦è½¦å¯¼å ¥è¡¨ | åä¸ | | 轨é轮渡 | 1 | 轨éï¼æ¦æ±ãé»ç³ï¼è½®æ¸¡ï¼ä» æ¦æ± | 轨é/è½®æ¸¡å¯¼å ¥æ°æ® | åå¸å®¢è¿å¯¼åºæ©å± | | åå¸å®¢è¿ | 2 | å ¬äº¤åå¸å +åºç§+ç½çº¦è½¦+轨é轮渡 | ç±ç¬¬ 1 å±åæ | æ°åæé»è¾ | | ä¸å£å¾æç» | 2 | ç线+å ¬äº¤å乡差+åºç§å乡差+ç½çº¦è½¦å乡差 | ç±ç¬¬ 1 å±åæ | ç°ä¸å£å¾å¯¼åºæ¹çå¼ä¸ºé¡µå å¡«å | | ä¸å£å¾æå | 3 | ä¸å£å¾å£å¾å¸å·æå | 第 2 å± | ç°ä¸å£å¾æåå¯¼åº | | ä¸å£å¾åæ | 3 | ä¸å£å¾å£å¾å ¨çç»æå æ¯ | 第 2 å± | ç°ä¸å£å¾åæå¯¼åº | | å叿±æ» | 3 | åæ¹å¼åå¸å®¢è¿ç´¯è®¡/彿 | 第 2 å± | ç°åå¸å®¢è¿æ±æ»å¯¼åº | | åå¸åå¸å· | 3 | åå¸å·åå¸å®¢è¿æç»ä¸æå | 第 2 å± | ç°åå¸å®¢è¿åå¸å·å¯¼åº | | è´§è¿ | 3 | è´§è¿é/å¨è½¬é è§ä¸+è§ä¸ | 模æ¿_è´§è¿éå¨è½¬éãæå表 | ç°è´§è¿å¯¼åº | | è´§è¿éæå | 3 | è´§è¿éå£å¾æå | åä¸ | ç°è´§è¿éæåå¯¼åº | | è´§è¿å¨è½¬éæå | 3 | å¨è½¬éå£å¾æå | åä¸ | ç°å¨è½¬éæåå¯¼åº | | éè·¯è¿è¾å¨è½¬é | 3 | B=G+L/2+Q/10 | è´§è¿é¡µ+åå¸å®¢è¿é¡µ+ä¸å£å¾æç»é¡µ | æ°åæé¡µ | ## 4 å ³é®è§åæ¸ åï¼ä¸è¯´æææ¡£ç¬¬ 2ã4 èä¸è´ï¼ - æä»½åï¼2026 å¹´ 1-7 æå¼å C/E/G/I/K/M/Oï¼å¶æ°åä¸ºåæ¯ï¼Q å=1-7 æç´¯è®¡ï¼å·²ç¡®è®¤æ£ç¡®å è³ 7 æï¼ã - åæ¯ï¼æ¬æ/2025 å¹´åæ-1ï¼2025 åæåå¨å³ä¾§ T èµ·ï¼æ å»å¹´æ°æ®ç空ã - å乡差=å ¨é-åå¸å ï¼å ¬äº¤ï¼ï¼åºç§ãç½çº¦è½¦ å ¨é=åå¸å ï¼å乡差 0ï¼ã - ç线å 车客è¿éè¡å«ä¸ªä½ï¼å ¶ä¸ä¸ªä½ä¸ºåéï¼ã - 轨é轮渡ï¼è½¨é æ¦æ±+é»ç³ï¼è½®æ¸¡ ä» æ¦æ±ã - å ¨çè¡=17 å¸å·æ±åï¼å ¬å¼ä¿çï¼ã - éè·¯è¿è¾å¨è½¬éï¼B=Gï¼è´§è¿è§ä¸+è§ä¸å¨è½¬éï¼ä¸å¨å ¬éï¼+Lï¼åå¸å®¢è¿éï¼ä¸äººæ¬¡ï¼/2+Qï¼ä¸å£å¾æ»æ 客å¨è½¬éï¼ä¸äººå ¬éï¼/10ï¼ç³»æ° 2 ä¸ 10 æç¨æ·å ¬å¼åæ ·å®ç°ï¼ä¸å¡æç®ä¾æ®å¦è¡å¤æ³¨ã - æåç¨ RANKãå æ¯ç¨ å项/æ»è¡ å ¬å¼ï¼é recalc éç®ã ## 5 宿½æ¥éª¤ä¸éªæ¶ - P0 æ¯çå®ç¨¿ï¼ç¡®è®¤ #REF! æ¸ é¤æ¹å¼ï¼åºå®æ¯é¡µæ°æ®åºè¾¹çï¼è¡ãåãæä»½ä¸é 12 ææ©å±è§åï¼ï¼ç¡®è®¤ 2025 åä¸ 2024 åçå¡«å çç¥ãéªæ¶ï¼æ¯çæ #REF!ãè¡åæ å°æ¸ åè¯å®¡éè¿ã - P1 骨æ¶çæï¼æ°å¢ workbook 级模æ¿å¤å¶ä¸é¡µç¾ç®¡çå·¥å ·ç±»ï¼çæå¨å ¥å£ exportSummaryWorkbook(period, mode)ï¼è¾åºæ´æ¬å·¥ä½ç°¿ï¼éè页éèï¼ãéªæ¶ï¼ç©ºè¡¨å¯å¯¼åºãæ ·å¼ä¿çã页ç¾é½å ¨ã - P2 å°è´¦é¡µå¡«å ï¼ç线å 车ãå ¬äº¤ãåºç§ãç½çº¦è½¦ã轨é轮渡ãéªæ¶ï¼ä»¥ 2026-07 æ°æ®ä¸äººå·¥æ¯çåé¡µéæ ¼æ¯å¯¹éè¿ã - P3 åæé¡µå¡«å ï¼åå¸å®¢è¿ãä¸å£å¾æç»ï¼åä¹¡å·®å ¬å¼ï¼ãéªæ¶ï¼ä¸å£å¾æç»æ ¡éªè¡ Q1 约çäº 0ï¼åå¸å®¢è¿=åæ¹å¼åå¸å æ±åã - P4 æå页填å ï¼å叿±æ»ãåå¸åå¸å·ãä¸å£å¾æåãä¸å£å¾åæãè´§è¿åä¸¤å¼ æåãéªæ¶ï¼å页ä¸äººå·¥æ¯çéæ ¼æ¯å¯¹ã - P5 æ»å¨è½¬éåæï¼éè·¯è¿è¾å¨è½¬é B=G+L/2+Q/10 ä¸å»å¹´å¯¹ç §åãéªæ¶ï¼B åå ¨ç=åå¸å·æ±åãä¸äººå·¥æ¯çä¸è´ã - P6 å端æ¥å ¥ï¼æ¥è¡¨çæé¡µæ°å¢ æ±æ»å·¥ä½ç°¿ ç±»åï¼å« ready æ°æ®å°±ç»ªæ£æ¥ãçæãä¸è½½ãå¯¼å ¥è®°å½/æä½æ¥å¿ï¼ãéªæ¶ï¼é¡µé¢ä¸å¯ä¸é®çæ 2026-07 å¹¶ä¸è½½ã - P7 åå½ä¸æ¥åï¼å ¨éå¯¹ç § 2026-07 人工æ¯çï¼è¾åºãåè½æµè¯æ¥å_æ±æ»å·¥ä½ç°¿çæ_<æ¥æ>.mdãï¼æ£åéæ ¼å¯¹ç §ãè´åç¼ºæ°æ®æç¤ºãå ¥åºæ½æ¥ï¼ã ## 6 æ°æ®ç¼ºå£ä¸é£é© - 2025 åºæï¼åºå H2031 ä» 2026-03/07ãåå¸å®¢è¿ä» 2026-06/07ï¼æ 2025 æ°æ®ï¼2025 åæååªè½ ç空 æ ä¿çæ¯çç¼åå¼ï¼éææ¿ã - ç½çº¦è½¦æåæ°æ®æºæªå®ï¼ææ¯çç°ç¶å å®ç° æ»é=åå¸å ï¼å乡差 0ï¼ï¼çæå说æååæ¹ã - 轨é轮渡æåº¦æ°æ®æ¯å¦å·²å ¥åºãåæ®µå£å¾ï¼æ¦æ±/é»ç³ï¼å¾ æ ¸å¯¹ã - åå¸åå¸å·ãå叿±æ» çå¼ç»èéå¯¹ç §å®æ¹æ ·å¼ éæ ¼ç¡®è®¤ã - è´§è¿è§ä¸è§ä¸æå表ä¸å¨è½¬éæ¨¡æ¿æ¯ææ¯å¦æå¯¹åºæä»½æ°æ®å¾ 确认ï¼ç¼ºææ¶è¯¥é¡µç空并æç¤ºï¼ã - æ¯çæä»¶å¯è½è¢« Excel å ç¨ï¼çææ¶ä¸å¾å¦åæ°æä»¶ï¼ä¸æ¹æ¯çã - æä»½>7 æ¶ï¼8-12 æï¼éå è§£å³æ¨¡æ¿æ©åé®é¢ï¼ç°ä¸å£å¾æç» 7 æå空ç½é®é¢ï¼å¦ç«ä»»å¡ï¼ã ## 7 å¾ ç¨æ·ææ¿æ¸ å 1. #REF! æ¸ é¤ï¼ç±æç¨åºæ¸ é¤è¿ 9 å¤åå æ ¼ï¼ç½®ç©ºï¼ï¼è¿æ¯ä¿ç人工å¤çï¼ 2. 2025 åæåï¼ç空 æ ä¿çæ¯çç¼åå¼ï¼ï¼æ¶å忝忝妿¾ç¤ºï¼ 3. 轨éè½®æ¸¡æ°æ®æ¯å¦å·²å¯¼å ¥ç³»ç»ãæ¯å¦æ¬æå 人工补导æµè¯ã 4. æ±æ»å·¥ä½ç°¿è¾åºç®å½ä¸å½åï¼å»ºè®® docs/çææ±æ»å¤§è¡¨/è¾åº/çæ_éè·¯è¿è¾éæ±æ»è¡¨_YYYY-MM.xlsxï¼ã 5. æ¯å¦æ¬æå°±ä»¥ 2026-07 æ¯ç为åºç¨¿ï¼å å P0-P1 è¯è·ç¬¬ä¸ç骨æ¶ã docs/Éú³É»ã×Ü´ó±í/ÊäÈëÊä³öÓëÂß¼¹ØÏµ×ܱí_2026-09-03.md
New file @@ -0,0 +1,34 @@ # æ¥è¡¨çæè¾å ¥è¾åºä¸é»è¾å ³ç³»æ»è¡¨ï¼2026-09-03 çï¼ > å£å¾æ±æ»å ¥å£ï¼æâæ¥è¡¨çæï¼åå¸å®¢è¿/æ±æ»å·¥ä½ç°¿ï¼âç¸å ³åè½çè¾å ¥è¡¨ã页ç¾å ³ç³»ãé»è¾è¿ç®æ±æ»å¦ä¸ã > 详ç»å±å¼è§ä¸¤ç¯ä¸é¢ï¼`docs/çææ±æ»å¤§è¡¨/页ç¾é»è¾å ³ç³»è¯´æ.md`ï¼19 页ä¸å±ç»æä¸å¾ç¨½ï¼ã`docs/çææ±æ»å¤§è¡¨/èªå¨çææ±æ»å·¥ä½ç°¿è½å°æ¹æ¡.md`ï¼P0-P7 è½å°æ¹æ¡ï¼ã ## 1 å ³ç³»æ»è¡¨ | åè½/æ¥è¡¨é¡¹ | è¾å ¥ï¼æä»¶/åºè¡¨ï¼ | åä¸é¡µç¾ | å ³é®è¿ç® | è¾åº | å£å¾å¤æ³¨ | |---|---|---|---|---|---| | ç½çº¦è½¦å®¢è¿éæå表ï¼wycSplitï¼æåº¦ï¼ | ãç½çº¦è½¦è®¢ååå ¨çæ»é.xlsxã彿è¡ï¼B-E=ç½çº¦è½¦å ¨ç客è¿é/åå¸å 客è¿é/å¨è½¬é/åå¸å å¨è½¬éï¼æºèªãç½çº¦è½¦æ»æ°.xlsxãï¼ï¼F=订åå计ï¼G-W=17 å¸å·è®¢åï¼æºèªãæ¹åç½ç»é¢çº¦åºç§æ±½è½¦â¦åææ¥åãéä»¶1ï¼ï¼city_taxi_monthly 巡游åºç§ææ¥ï¼å®¢è¿é/åå¸å /å¹³åè¿è·/åå¸å å¹³åè¿è·ï¼ | æ ï¼ç¬ç«é¡µ `yyyy-MMæå`ï¼å®¢è¿éå+å¨è½¬éåï¼ | 客è¿é=订åå æ¯Ãå ¨ç pinï¼åå¸å Hï¼æ¦æ±=èªèº«ãå ¶ä½æå·¡æ¸¸åå¸å å æ¯å©ä½åæè³ pinCKï¼åé å乡=æ»éâåå¸å ï¼å¨è½¬é G=客è¿éÃ巡游平åè¿è·å æ¯åæ pinZï¼åå¸å åæ³ï¼ç¨åå¸å å¹³åè¿è·ï¼ | çæ_ç½çº¦è½¦å®¢è¿éæå表_{æ}.xlsx | ä¾ãéè·¯è¿è¾éæ±æ»è¡¨ãç½çº¦è½¦å°è´¦é¡µå¼ç¨ï¼2026-07 ä¸äººå·¥å£å¾åææ æå¤§åå·® 0 | | éè·¯è¿è¾éæ±æ»è¡¨ï¼summaryWorkbookï¼æ´æ¬ï¼ | æ¯ç docs/çææ±æ»å¤§è¡¨/{å¹´}å¹´{æ}æéè·¯è¿è¾éæ±æ»è¡¨.xlsxï¼P0-P1 æ´æ¬å¤å¶ï¼P2 èµ·éæ¥æ¹ä¸º å°è´¦/å£å¾åæ/æå ä¸å±åå¡«ï¼ | 19 页ï¼ç线å 车ãå ¬äº¤ãåºç§ãç½çº¦è½¦ã轨é轮渡ï¼å°è´¦ï¼ï¼åå¸å®¢è¿ãä¸å£å¾æç»ï¼å£å¾åæï¼ï¼å叿±æ»ãåå¸åå¸å·ãè´§è¿ãä¸¤å¼ æåãä¸å£å¾æå/åæãéè·¯è¿è¾å¨è½¬éï¼æåï¼ç | ç®æ å¹´=2026 é¶æ¹å¨ï¼è·¨å¹´åªæ¿æ¢ææ¬ `2026å¹´`âç®æ å¹´ï¼æ°æ®å¡«å /æä»½æ©å± P2 å¾ å® | çæ_éè·¯è¿è¾éæ±æ»è¡¨_{æ}.xlsx | æ¯çå¿ é¡»éæåå¨ï¼ç¼ºææç¡®æ¥éï¼ä¸è·¨æåéï¼ï¼2025/2024 åä¿çæ¯çç¼åå¼ï¼#REF! å¾ å¤ç | | åå¸å®¢è¿æ¢æ 9 å¼ ï¼å ¬äº¤/åºç§/轨é轮渡/æ±æ»/累计çï¼ | åå¸å ¬äº¤/巡游åºç§çææ¥åºè¡¨ + docs/åå¸å®¢è¿ æ°ç弿¨¡æ¿ | åèªå页/å页 | æå表å£å¾èåã忝ã累计 | çæ_xxx.xlsx | 䏿¬æ¬¡æ°å¢é¡¹åå表ï¼ç»ä¸èµ°ä¸¤ä½å°æ°æ¾ç¤ºè§å | ## 2 ç½çº¦è½¦æåç®æ³ï¼ä¸ãç½çº¦è½¦æå.xlsxãæé¡µä¸è´ï¼ 设 17 å¸å· iï¼0=æ¦æ±ï¼ï¼å ¨ç pinï¼å®¢è¿é K=4852.3ãåå¸å CK=4430.84ãå¨è½¬é Z=28348.02ãåå¸å CZ=22705.61ï¼2026-07ï¼ã - C_i = 订å_i ÷ Σ订å à Kï¼ç½çº¦è½¦å®¢è¿éï¼ã - å·¡æ¸¸å æ¯ F_i = åºç§åå¸å 客è¿é_i ÷ åºç§å®¢è¿é_iã - åå¸å 客è¿é H_iï¼æ¦æ± H_0 = C_0ÃF_0ï¼å ¶ä½ H_i = (C_iÃF_i) ÷ (ΣC_jF_j â C_0F_0) à (CK â C_0F_0)ãåé å乡 I_i = C_i â H_iã - å¨è½¬é G_i = (C_iÃå¹³åè¿è·_i) ÷ Σ(C_jÃå¹³åè¿è·_j) à Zï¼åå¸å å¨è½¬é Hl_iï¼æ¦æ± = G_0ï¼å ¶ä½ = (H_iÃåå¸å å¹³åè¿è·_i) ÷ (ΣH_jÃåå¸å å¹³åè¿è·_j â H_0Ãåå¸å å¹³åè¿è·_0) à (CZ â G_0)ï¼åé å乡å¨è½¬é Il_i = G_i â Hl_iã - å¹³åè¿è·ç¼ºçå åº = å¨è½¬é ÷ 客è¿éï¼åå¸å åçï¼ï¼æ¦æ±æ åé å乡ï¼H=KãI=0ï¼ã ## 3 æ±æ»å·¥ä½ç°¿ä¸å±å£å¾ï¼æè¦ï¼è¯¦è§é¡µç¾é»è¾å ³ç³»è¯´æ.mdï¼ - 第 1 å±å°è´¦é¡µï¼åæ¹å¼æç»ï¼ï¼ç线å 车ï¼å«ä¸ªä½ï¼ãå ¬äº¤ãåºç§ãç½çº¦è½¦ã轨é轮渡ï¼å ¨ç+17 å¸å·éæï¼è¡ç»æ 4 è¡/å¸å·ï¼å®¢è¿é/å¨è½¬é/å ¶ä¸å®¢è¿é/å ¶ä¸å¨è½¬éï¼ã - 第 2 å±å£å¾åæï¼åå¸å®¢è¿ï¼=å ¬äº¤åå¸å +åºç§åå¸å +ç½çº¦è½¦åå¸å +轨é轮渡ï¼ï¼ä¸å£å¾æç»ï¼=ççº¿å ¨é+å ¬äº¤å乡差+åºç§å乡差+ç½çº¦è½¦å乡差ï¼ãå乡差=å°è´¦é¡µâæ»éè¡âå ¶ä¸åå¸å è¡âï¼2026-07ï¼åºç§å ¨ç 509.00ãç½çº¦è½¦ 421.46ï¼æ¦æ±å乡差=0ï¼ã - 第 3 屿åï¼å叿±æ»ãåå¸åå¸å·ãè´§è¿/æåãä¸å£å¾æå/åæãéè·¯è¿è¾å¨è½¬éï¼B=G+L/2+Q/10ï¼è´§è¿å¨è½¬é+åå¸å®¢è¿é/2+ä¸å£å¾æ»æ 客å¨è½¬é/10ï¼ã - 轨é轮渡ï¼è½¨é=æ¦æ±+é»ç³ï¼è½®æ¸¡ä» æ¦æ±ï¼é»ç³æ 轮渡ã ## 4 å ±æ§è§å 1. æ°å¼âæ¾ç¤ºä¸¤ä½å°æ°ãä¿çå ¨ç²¾åº¦âï¼ææçæå·¥ä½ç°¿åºå£ç»ä¸æ§è¡ applyTwoDecimalFormatï¼`0.00` æ¾ç¤ºï¼æ´æ°/%/æ¥æ/ç§å¦è®¡æ°/å·²å« 0.00 æ ·å¼ä¸å¨ï¼ã 2. ç¼ºæ°æ®ä¸éé»ï¼wycSplit 缺è¾å ¥è¡ãsummaryWorkbook ç¼ºå½ææ¯çãready åç½®æ ¡éªç¼ºåºè¡¨æ°æ®æ¶ï¼å表置âç¼ºæ°æ®âå¹¶ç»åºåå ï¼å¯¼åºæç¡®æ¥éã 3. ç¶ææ¥è¯¢ï¼/api/report/readyï¼æ°æ®å°±ç»ªï¼ã/api/report/previewã/api/report/export/{key}ï¼å个ï¼ã/api/report/export/selectedï¼å¤é zipï¼åå·²è¦çæ°ç±»åã docs/Éú³É»ã×Ü´ó±í/ҳǩÂß¼¹ØÏµËµÃ÷.md
New file @@ -0,0 +1,79 @@ # 页ç¾é»è¾å ³ç³»è¯´æï¼2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨ï¼ ## 0 说æä¸ä¾æ® - 便®æä»¶ï¼docs/çææ±æ»å¤§è¡¨/2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨.xlsxï¼å«å ¬å¼å稿ï¼2026-09-03 åæï¼ã - ç¨éï¼ä½ä¸ºç³»ç»èªå¨çæè¯¥æ±æ»å·¥ä½ç°¿çåæ°ä¸å£å¾ä¾æ®ãæç»äº¤ä»ç©ä¸ºè¿ä¸æ¬æ±æ»å·¥ä½ç°¿ï¼ä¸ååç¬çæå°è¡¨æä»¶ã - éè页æä¸çº³å ¥æ¬æ¬¡èå´ï¼å ¬è·¯æ»å®¢è¿ã2025å¹´åå¸å®¢è¿éãä¸å£å¾å®¢è¿éãä¸å£å¾è®¡ç®è¿ç¨ï¼å·¥ä½ç°¿å ä»ä¿çï¼çææ¶å¯åæ¥éèï¼ã - ç¨æ·å£å¾ç¡®è®¤ï¼2026-09-03ï¼ï¼ 1ï¼ç线å 车ç页 Q åï¼2026年累计ï¼ä¸º 1-7 æåè®¡ï¼æ¦æ±ç´¯è®¡æ£ç¡®å å° 7 æï¼ 2ï¼æé¾å ¬å¼ #REF! æ®ä½ä» 使¸ ç项ï¼ä¸å½±åä¸»æ°æ®åºï¼ 3ï¼è½¨éãè½®æ¸¡åªææ¦æ±åé»ç³ææ°æ®ï¼éè·¯è¿è¾å¨è½¬é =ï¼è´§è¿é¡µï¼è§ä¸+è§ä¸å¨è½¬éï¼+ï¼åå¸å®¢è¿é¡µï¼å®¢è¿é/2ï¼+ï¼ä¸å£å¾æç»é¡µï¼æ»æ 客å¨è½¬é/10ï¼ï¼ 4ï¼ç线å 车页ç客è¿éè¡å å«ä¸ªä½ï¼å ¶ä¸ä¸ªä½ä¸ºå ¶åéè¡ï¼ã 5ï¼è¡¥å 确认ï¼2026-09-03 第äºè½®ï¼ï¼é»ç³åªæè½¨éãæ²¡æè½®æ¸¡ï¼è½®æ¸¡ä» æ¦æ±è¡ï¼ï¼éè·¯è¿è¾å¨è½¬éåæå ¬å¼ G+L/2+Q/10 确认æ 误ï¼#REF! å¤çæè§è§ç¬¬ 6 èã 6ï¼å£å¾ä¿®è®¢ï¼2026-09-03 第ä¸è½®ï¼ï¼åºç§ä¸ç½çº¦è½¦ååå¨åé å乡é¨åï¼å ¨é â åå¸å ï¼ä» æ¦æ±å ¨é=åå¸å ï¼ï¼åå¸å®¢è¿å£å¾ä½¿ç¨åå°è´¦é¡µâå ¶ä¸åå¸å âè¡ï¼æ¬æç¬¬ 3ã4 èå·²ææ¯çå ¬å¼ä¸ 2026-07 å®é æ°æ®æ ¸å¯¹æ´æ£ï¼åºç§å ¨çå乡差 509.00ãç½çº¦è½¦ 421.46ï¼ã ## 1 æ»ä½ç»æ å·¥ä½ç°¿å ± 19 é¡µï¼ææ°æ®å å·¥ç¨åº¦åä¸å±ï¼æ¬è¯´æåªè¦çå¯è§ 15 页ï¼ä¸å±å½åå·²æä¸å¡æé®æ ¡æ£ï¼ï¼ - æ¯è¯åçï¼å°è´¦é¡µå°±æ¯åæ¹å¼çæåº¦æç»åºç¨¿ï¼æå¸å·éæï¼ï¼å£å¾åæé¡µæ¯è·¨æ¹å¼å æ»é¡µï¼ä¸å£å¾æç»æ¯ä»£è¡¨ï¼åå¸å®¢è¿é¡µå屿¤ç±»ï¼æåé¡µæ¯æææç»æ¥éçå¼é¡µï¼æååªæ¯å ¶ä¸ä¸ç±»ï¼è¿å æ¬æ±æ»ãåæãæ»å¨è½¬éçã ã第 1 å±ï¼åæ¹å¼æç»å°è´¦é¡µï¼æç»åºç¨¿ï¼ãç线å 车ãå ¬äº¤ãåºç§ãç½çº¦è½¦ã轨é轮渡 - æ å ¨ç+17 å¸å· éæå 客è¿éãå¨è½¬éï¼å¹¶å¸¦åéè¡ï¼å ¶ä¸ä¸ªä½ / å ¶ä¸åå¸å ï¼ã ã第 2 å±ï¼è·¨æ¹å¼å£å¾åæé¡µãåå¸å®¢è¿ãä¸å£å¾æç» - åå¸å®¢è¿ï¼åå¸å å£å¾æ±æ»ï¼å ¬äº¤åå¸å + åºç§åå¸å + ç½çº¦è½¦åå¸å + 轨é轮渡ï¼å ¬å¼è§ç¬¬ 3 èé项å¼ç¨å页âå ¶ä¸åå¸å âè¡ï¼ã - ä¸å£å¾æç»ï¼åé å乡å£å¾æ±æ»ï¼å ¬è·¯ç线 + å ¬äº¤å乡 + åºç§å乡 + ç½çº¦è½¦å乡ï¼ï¼æ¯ä¸å£å¾æåãä¸å£å¾åæçæ°æ®æ¥æºã ã第 3 å±ï¼æåæ¥è¡¨é¡µãå叿±æ»ãåå¸åå¸å·ãè´§è¿ãè´§è¿éæåãè´§è¿å¨è½¬éæåãä¸å£å¾æåãä¸å£å¾åæãéè·¯è¿è¾å¨è½¬é - ç±ç¬¬ 1ã2 屿°æ®æ±æ»è®¡ç®å½¢ææç»æ¥éçå¼ã ## 2 éç¨çå¼ï¼å°è´¦é¡µä¸æç»é¡µä¸è´ï¼ - 2026 å¹´ 1-7 æå¼åï¼CãEãGãIãKãMãOï¼å¶æ°åä¸ºå½æåæ¯ï¼ã - Q åï¼2026 å¹´ 1-7 æç´¯è®¡ï¼C+E+G+I+K+M+Oï¼å å° 7 æï¼å·²ç¡®è®¤ï¼ã - å³ä¾§ T 起为 2025 å¹´ 1-12 æåæåï¼å¼å TãVãXãZãABãADãAFãAHãAJãALãANãAPï¼ï¼åæ¯å ¬å¼å½¢å¦ D=C/T-1ã - åå³ä¾§åå¨ 2024 å¹´åæ´æ©åèåï¼é¨å页æ #REF! æ®ä½ï¼è§ç¬¬ 6 èï¼ã - è¡ç»æï¼å ¨çåå¨åï¼å« å ¶ä¸ è¡ï¼ï¼éåæ¯ä¸ªå¸å·å 4 è¡ï¼å®¢è¿éãå¨è½¬éãå ¶ä¸å®¢è¿éãå ¶ä¸å¨è½¬éï¼ã ## 3 å页èè´£ä¸ä¸»è¦åæ° - ç线å 车ï¼å ¬è·¯ç线ï¼å«å 车ï¼ãå ¨çè¡ r4/r5 为客è¿é/å¨è½¬éï¼å®¢è¿éå«ä¸ªä½ï¼å·²ç¡®è®¤ï¼ï¼r6/r7 ä¸ºå ¶ä¸ä¸ªä½å®¢è¿é/å¨è½¬éãå¸å·è¡èª r8 èµ·æ¯ 4 è¡ä¸åãæ°æ®æºï¼H203-1 ä¼ä¸ææ¥ + ä¸ªä½æ·ææ¥ã - å ¬äº¤ï¼æ»éè¡ r5/r6ï¼å ¶ä¸åå¸å r7/r8ï¼å ¬äº¤å乡 = æ»é - åå¸å ãæ°æ®æºï¼åå¸å ¬äº¤ææ¥ã - åºç§ï¼å·¡æ¸¸åºç§ï¼ç»æåå ¬äº¤ï¼å ¨çå r5-r8ï¼å®¢è¿é/å¨è½¬é/å ¶ä¸åå¸å 客è¿é/å ¶ä¸åå¸å å¨è½¬éï¼ï¼æ¯å¸å· 4 è¡ä¸åï¼æ¦æ± r9-r12ãé»ç³ r13-r16ï¼ä¾æ¤ç±»æ¨ï¼ãæ»éè¡ä¸âå ¶ä¸åå¸å âè¡å¹¶åï¼æ»é ⥠åå¸å ï¼ä» æ¦æ±ä¸¤è¡ç¸çï¼å乡差 0ï¼ï¼å ¶ä½å¸å·åå¨åé å乡差ã2026-07ï¼å ¨çåºç§å®¢è¿é 5860.24 ä¸äººæ¬¡ãå ¶ä¸åå¸å 5351.24ãåé å乡差 509.00ï¼æº=city_taxi_monthly ç passenger_volume/passenger_cityï¼å¦é»ç³ 283.02/258.57ï¼ã - ç½çº¦è½¦ï¼ç»æåå ¬äº¤ï¼æ»éè¡+å ¶ä¸åå¸å è¡ï¼æ¯å¸å· 4 è¡ï¼ãå ¨éä¸åå¸å æ¥èªãç½çº¦è½¦å®¢è¿éæå表ãï¼å®¢è¿é Câæ»éè¡ãåå¸å Hâå ¶ä¸åå¸å è¡ãåé å乡 Iâå乡差è¡ã2026-07ï¼å ¨ç 4852.30 / 4430.84 / 421.46ï¼æ¦æ±æ å乡差ï¼I=0ï¼ï¼æ¯çç½çº¦è½¦é¡µå½æå¼å³æåç»æï¼å¦é»ç³åå¸å 140.344963641575ï¼ã - 轨é轮渡ï¼ä¸åå轨éï¼å ¨ç r4/r5ï¼æ¦æ± r6/r7ï¼é»ç³ r8/r9ï¼å ¨ç=æ¦æ±+é»ç³ï¼ï¼ä¸åå轮渡ï¼å ¨ç r13/r14ï¼æ¦æ± r15/r16ï¼å ¨ç=æ¦æ±ï¼ãé»ç³åªæè½¨éãæ²¡æè½®æ¸¡ï¼å·²äºæ¬¡ç¡®è®¤ï¼ï¼è½®æ¸¡é¡µä» æ¦æ±è¡ï¼å ¨ç=æ¦æ±ï¼ï¼æ é为é»ç³æ©è¡ã - åå¸å®¢è¿ï¼åå¸å å£å¾ãå¸å·è¡å ¬å¼ç¤ºä¾ï¼æ¦æ±ï¼C å=1 æï¼ï¼C6=å ¬äº¤!C11+åºç§!C11+ç½çº¦è½¦!C11+轨é轮渡!C6+轨é轮渡!C15ââå ¬äº¤/åºç§/ç½çº¦è½¦å¼ç¨ç C11 å为该页âå ¶ä¸åå¸å 客è¿éâè¡ï¼è½¨é轮渡å¼è½¨éå C6 ä¸è½®æ¸¡å C15ï¼å¨è½¬éåçå¼ç¨å页åå¸å å¨è½¬éè¡ï¼å¦åºç§!C12ï¼ãå ¨çè¡=åå¸å·æ±åãæ°æ®æº=å ¬äº¤åå¸å +åºç§åå¸å +ç½çº¦è½¦åå¸å +轨é轮渡ã - ä¸å£å¾æç»ï¼åé å乡å£å¾ãé¡µå æ³¨è®°ï¼ä¸å£å¾=å ¬è·¯ç线+åé åä¹¡å ¬äº¤+åé å乡åºç§+åé å乡ç½çº¦è½¦ãå ¬äº¤/åºç§/ç½çº¦è½¦å乡é¨åå å°è´¦é¡µæ»é-åå¸å å·®é¢ï¼æ ¡éªå ¬å¼ Q1=Q5-(ç½çº¦è½¦!Q5-ç½çº¦è½¦!Q7)-(åºç§!Q5-åºç§!Q7)-(å ¬äº¤!Q5-å ¬äº¤!Q7)-ç线å 车!Q4ï¼ã - ä¸å£å¾æåï¼å¨ä¸å£å¾æ»éï¼æç»é¡µ Q 累计å£å¾ï¼ä¸æå¸å·æåï¼å«å å ¨çæ¯ä¾ã忝ä¸å¢éæåã - ä¸å£å¾åæï¼å ¨çå£å¾ç»æå æ¯ï¼å¦ D å=åå项/æ»è¡å æ¯å ¬å¼ï¼ã - å叿±æ»ï¼å ¨çåå¸å®¢è¿åæ¹å¼ç´¯è®¡/å½æä¸¤æ®µï¼æ»å®¢è¿éãå ¬äº¤ãåºç§ãå ¶ä¸å·¡æ¸¸ãç½çº¦è½¦ã轨éã轮渡ï¼ï¼å·¦å 2026ï¼å³å 2025 åºæå忝ã - åå¸åå¸å·ï¼åå¸å·åå¸å®¢è¿æç»ä¸æåï¼B=G+L+Q+V+X ä¹ç±»ç»ååæ±åç»æï¼ã - è´§è¿ãè´§è¿éæåãè´§è¿å¨è½¬éæåï¼è´§è¿å£å¾å°è¡¨ï¼è´§è¿é=è§ä¸+è§ä¸ï¼å¨è½¬é=è§ä¸+è§ä¸ï¼ã - éè·¯è¿è¾å¨è½¬éï¼æç» GDP æ ¸ç®å£å¾é¡µãB åå ¬å¼ B=G+L/2+Q/10ï¼å ¶ä¸ï¼ - G = è´§è¿é¡µè§ä¸+è§ä¸å¨è½¬éï¼ä¸å¨å ¬éï¼ï¼ - L = åå¸å®¢è¿éï¼ä¸äººæ¬¡ï¼ååå¸å®¢è¿å£å¾ç´¯è®¡ï¼ï¼ - Q = å ¬è·¯å®¢è¿å¨è½¬éï¼ä¸äººå ¬éï¼åä¸å£å¾æç»æ»æ 客å¨è½¬éï¼ã å³ä¾§å¦å«å»å¹´ç´¯è®¡å¯¹ç §ï¼V å=W+X/2+Y/10ï¼ä¸æåãå å ¨çæ¯ä¾ã忝ã ## 4 ä¸ä¸ªå£å¾çå¾ç¨½å ³ç³» 设æåæ¹å¼ï¼å ¬äº¤/åºç§/ç½çº¦è½¦ï¼ï¼ - å ¨é = å°è´¦é¡µå®¢è¿éè¡ï¼ - åå¸å = å°è´¦é¡µå ¶ä¸åå¸å è¡ï¼ - å乡差 = å ¨é - åå¸å ï¼å ¬è·¯ä¸å£å¾ä½¿ç¨ï¼ã åï¼ - åå¸å®¢è¿å£å¾ = å ¬äº¤åå¸å + åºç§åå¸å + ç½çº¦è½¦åå¸å + 轨é轮渡ï¼2026-09-03 修订ï¼åºç§/ç½çº¦è½¦å ¨é â åå¸å ï¼åå¸å®¢è¿é¡µå ¬å¼å®é å¼ç¨å页âå ¶ä¸åå¸å âè¡ï¼ä¸åå¨âå ¨éçä»·âåæ³ï¼ã - ä¸å£å¾ = ç线å è½¦å ¨éï¼å«ä¸ªä½ï¼ + å ¬äº¤å乡差 + åºç§å乡差 + ç½çº¦è½¦å乡差ã - ç线å è½¦å ¨é = å ¶ä¸ä¸ªä½ + å ¶ä½ä¼ä¸é¨åï¼ä¸ªä½åéå ³ç³»ï¼å·²ç¡®è®¤ï¼ã ## 5 æ°æ®æ¥æºä¸ç³»ç»æ å°ï¼å»ºè®®ï¼ - ç线å 车ï¼h2031_enterprise_monthly + passenger_individual_monthlyï¼å®¢è¿é=ä¼ä¸+个ä½ï¼å ¶ä¸ä¸ªä½åç¬è¡ï¼ã - å ¬äº¤ï¼city_bus_monthlyï¼æ³¨æåºååå¸å /å乡忮µå£å¾ï¼å½åç³»ç»æ passenger_chengxiang åå乡ï¼ã - åºç§ï¼city_taxi_monthlyï¼æ»é=passenger_volume 客è¿éè¡ï¼åå¸å =passenger_cityâå ¶ä¸åå¸å âè¡ï¼ä¸ U402 䏿¥åæºï¼ã - ç½çº¦è½¦ï¼æå表è¾åºï¼æ»éè¡=æå客è¿é Cãå ¶ä¸åå¸å è¡=æå Hãå乡差è¡=æå Iï¼è¾å ¥=é¨çº§è®¢åéä»¶1 17 å¸å·è®¢å + å ¨ç pin + 巡游åºç§ææ¥å¹³åè¿è·ï¼ï¼2026-07 æåç»æå·²ææ¤å£å¾å¡«åæ¯çç½çº¦è½¦é¡µã - 轨éè½®æ¸¡ï¼æ¦æ±/é»ç³è½¨éãæ¦æ±è½®æ¸¡ä¸ç¨å¯¼å ¥è¡¨ã - è´§è¿ï¼h2032 çè§ä¸è§ä¸æåè¡¨ï¼æ¨¡æ¿_è´§è¿éå¨è½¬é + æå表ï¼ã ## 6 éçé®é¢ä¸å¾ å 1. #REF! æ®ä½ï¼å¯è§é¡µ ä¸å£å¾æç» AU4/AU97ãè´§è¿ BQ108ãç线å 车 IJ4/JW4/IJ5/JW5/JF28/JF29ï¼åå¨è¿ç¦» 1-7 æä¸»æ°æ®åºç年份/è¾ å©åãä¸å¡çå¤ä¸º å·²å /æ¸ é¤ï¼2026-09-03 11:01 夿¥æä»¶ä»åå¨ï¼ï¼æ¸ 餿¹å¼å¾ æç»ç¡®è®¤ï¼ç¨åºæ¸ é¤ç½®ç©ºï¼æäººå·¥å¤çã 2. ç½çº¦è½¦æåå ¬å¼æ°æ®æºï¼é¨çº§æ»é/è®¢åæ°ï¼å¾ ä¸å¡è¡¥å ååæ¥å ¥ï¼åæ¸ å第 5 æ¡ï¼ã 3. å·²äºæ¬¡ç¡®è®¤é¡¹ï¼é»ç³æè½¨éæ 轮渡ï¼éè·¯è¿è¾å¨è½¬éåæå ¬å¼æ 误ï¼ä¸å±ç»æå½åè§ç¬¬ 1 èã ## 7 ç»è®º æä»¥ä¸é¡µç¾èè´£ä¸ä¸ä¸ªå£å¾ï¼å ¨é/åå¸å /å乡差ï¼å³å¯å¤ç°è¯¥æ±æ»å·¥ä½ç°¿çåæé»è¾ï¼éè页ä¸å䏿¬æ¬¡äº¤ä»ã traffic-audit-server/src/main/java/com/trafficaudit/reportexport/controller/ReportExportController.java
@@ -84,6 +84,22 @@ return buildResponse(reportService.exportPassengerMidAnalysis(period, mode), "çæ_å ¬è·¯æ 客ä¸å£å¾åæ.xlsx"); } /** çæ_éè·¯è¿è¾éæ±æ»è¡¨.xlsxï¼æ±æ»å·¥ä½ç°¿ P0-P1 骨æ¶ï¼æ´æ¬å¤å¶æ¯çï¼é¡µç¾/å ¬å¼/2025 ç¼åä¿çï¼ */ @GetMapping("/export/summaryWorkbook") public ResponseEntity<byte[]> exportSummaryWorkbook(@RequestParam("period") String period, @RequestParam(value = "mode", defaultValue = "month") String mode) throws Exception { logExport("éè·¯è¿è¾éæ±æ»è¡¨.xlsx", period); return buildResponse(reportService.exportSummaryWorkbook(period, mode), String.format("çæ_éè·¯è¿è¾éæ±æ»è¡¨_%s.xlsx", period)); } /** çæ_ç½çº¦è½¦å®¢è¿éæå表.xlsxï¼æåº¦ï¼è®¢åéä»¶1 + å ¨ç pin + 巡游åºç§ææ¥ï¼ */ @GetMapping("/export/wycSplit") public ResponseEntity<byte[]> exportWycSplit(@RequestParam("period") String period, @RequestParam(value = "mode", defaultValue = "month") String mode) throws Exception { logExport("çæ_ç½çº¦è½¦å®¢è¿éæå表.xlsx", period); return buildResponse(reportService.exportWycSplit(period, mode), String.format("çæ_ç½çº¦è½¦å®¢è¿éæå表_%s.xlsx", period)); } /** çæ_è½è¿æ±æ»è¡¨.xlsxï¼H204ï¼å ¨ç + åå¸å· sheetï¼ */ @GetMapping("/export/energySummary") public ResponseEntity<byte[]> exportEnergySummary(@RequestParam("period") String period) throws Exception { traffic-audit-server/src/main/java/com/trafficaudit/reportexport/service/ReportExportService.java
@@ -107,6 +107,10 @@ @Value("${passenger.template-dir:docs/å ¬è·¯æ 客+è½è/è¾åº}") private String passengerTemplateDir; /** æ±æ»å·¥ä½ç°¿æ¨¡æ¿ç®å½ï¼application.yml summary.template-dirï¼ */ @Value("${summary.template-dir:docs/çææ±æ»å¤§è¡¨}") private String summaryTemplateDir; /** è´§è¿æ¥è¡¨æ¨¡æ¿ç®å½ï¼application.yml freight.template-dirï¼ */ @Value("${freight.template-dir:docs/è´§è¿}") private String freightTemplateDir; @@ -171,6 +175,43 @@ rows = addReadyCount(() -> energyMapper.selectCount(periodQw(period, mode, EnergyVehicleQuarterly::getReportPeriod)), "è½è车è¾å£åº¦æ°æ®", notes); auditTypes.add("H204"); break; case "wycSplit": { rows = addReadyCount(() -> cityTaxiMapper.selectCount(periodQw(period, mode, CityTaxiMonthly::getReportPeriod)), "巡游åºç§ææ¥", notes); try { Map<String, Object> inp = loadWycMonthlyInput(period, mode); if (inp == null) { rows = 0; notes.add("ãç½çº¦è½¦è®¢ååå ¨çæ»é.xlsxã缺 " + period + " è¡ï¼éå ç»´æ¤å½æè®¢åä¸å ¨ç pinï¼"); } else { double pinK = (Double) inp.get("pinK"), pinCK = (Double) inp.get("pinCK"); double pinZ = (Double) inp.get("pinZ"), pinCZ = (Double) inp.get("pinCZ"); double orderSum = (Double) inp.get("orderSum"); if (pinK <= 0 || pinCK <= 0 || pinZ <= 0 || pinCZ <= 0 || orderSum <= 0) { rows = 0; notes.add("ç½çº¦è½¦è¾å ¥ " + period + " è¡ä¸å®æ´ï¼è®¢å/å ¨ç pin 缺失ï¼"); } } } catch (Exception ex) { rows = 0; notes.add("ç½çº¦è½¦è¾å ¥è¯»å失败ï¼" + ex.getMessage()); } break; } case "summaryWorkbook": { rows = addReadyCount(() -> cityTaxiMapper.selectCount(periodQw(period, mode, CityTaxiMonthly::getReportPeriod)), "巡游åºç§ææ¥", notes) + addReadyCount(() -> cityBusMapper.selectCount(periodQw(period, mode, CityBusMonthly::getReportPeriod)), "åå¸å ¬äº¤ææ¥", notes); if (rows <= 0) notes.add("æ±æ»è¡¨ä¾èµçå ¬äº¤/åºç§ææ¥æ°æ®ç¼ºå¤±"); try { if (resolveSummaryMother(period, mode) == null) { rows = 0; notes.add("docs/çææ±æ»å¤§è¡¨ ä¸ç¼ºå°å¯å¤å¶çæ¯çæ±æ»è¡¨"); } } catch (Exception ex) { rows = 0; notes.add("æ¯çå®ä½å¤±è´¥ï¼" + ex.getMessage()); } break; } default: rows = 0; notes.add("æªç¥æ¥è¡¨ç±»åï¼" + t); @@ -181,6 +222,7 @@ auditRows += auditRowsOf(period, mode, at); audited = audited || auditedMarked(period, mode, at); } if (auditTypes.isEmpty()) audited = true; it.put("rows", rows); it.put("ready", rows > 0); it.put("auditRows", auditRows); @@ -212,7 +254,8 @@ for (String t : types) { if (isFreightType(t)) freight = true; else if (isPassengerType(t)) passenger = true; else if ("cityTaxiDetail".equals(t) || isCityPassengerType(t)) { cityTaxi = true; cityBus = true; } else if ("cityTaxiDetail".equals(t) || "wycSplit".equals(t)) { cityTaxi = true; } else if (isCityPassengerType(t) || "summaryWorkbook".equals(t)) { cityTaxi = true; cityBus = true; } else if (isInvestType(t)) invest = true; else if ("energySummary".equals(t)) energy = true; } @@ -256,7 +299,51 @@ List<Integer> missing = new ArrayList<>(); List<Integer> coverage = new ArrayList<>(); if (Boolean.FALSE.equals(it.get("audited"))) problems.add("该æ¥è¡¨æå°æªå®¡æ ¸éè¿"); if (isFreightType(t)) { if ("wycSplit".equals(t)) { coverage.addAll(taxiCover); missing = missingMonths(taxiCover, month); try { Map<String, Object> inp = loadWycMonthlyInput(period, mode); if (inp == null) { problems.add("缺ç½çº¦è½¦è¾å ¥ï¼è¯·å¨ãç½çº¦è½¦è®¢ååå ¨çæ»é.xlsxãè¡¥ " + period + " è¡"); } else { double pinK = (Double) inp.get("pinK"), pinCK = (Double) inp.get("pinCK"); double pinZ = (Double) inp.get("pinZ"), pinCZ = (Double) inp.get("pinCZ"); double orderSum = (Double) inp.get("orderSum"); if (pinK <= 0 || pinCK <= 0 || pinZ <= 0 || pinCZ <= 0 || orderSum <= 0) { problems.add("ç½çº¦è½¦è¾å ¥ " + period + " è¡ä¸å®æ´ï¼è®¢å/å ¨ç pin 缺失ï¼"); } else { addSum(summary, "å ¨çç½çº¦è½¦å®¢è¿é", pinK, "ä¸äºº"); addSum(summary, "å ¶ä¸åå¸å 客è¿é", pinCK, "ä¸äºº"); addSum(summary, "å ¨çç½çº¦è½¦å¨è½¬é", pinZ, "ä¸äººå ¬é"); addSum(summary, "å ¶ä¸åå¸å å¨è½¬é", pinCZ, "ä¸äººå ¬é"); addSum(summary, "é¨çº§è®¢åå计", orderSum, "å"); } } } catch (Exception ex) { problems.add("ç½çº¦è½¦è¾å ¥è¯»å失败ï¼" + ex.getMessage()); } } else if ("summaryWorkbook".equals(t)) { java.util.Set<Integer> cov = new java.util.TreeSet<>(); cov.addAll(busCover); cov.addAll(taxiCover); coverage.addAll(cov); missing = missingMonths(cov, month); try { if (resolveSummaryMother(period, mode) == null) { problems.add("docs/çææ±æ»å¤§è¡¨ ä¸ç¼ºå°å¯å¤å¶çæ¯çæ±æ»è¡¨"); } else { Map<Integer, Map<String, double[]>> busM = loadCityBusByMonth(yearPrefix, month); Map<Integer, Map<String, double[]>> taxiM = loadCityTaxiByMonth(yearPrefix, month); Map<String, double[]> bc = busM.get(month); Map<String, double[]> tc = taxiM.get(month); if (bc != null && bc.get("å ¨ç") != null) addSum(summary, "åå¸å ¬äº¤å®¢è¿éï¼å ¨ç彿ï¼", bc.get("å ¨ç")[0], "ä¸äºº"); if (tc != null && tc.get("å ¨ç") != null) addSum(summary, "巡游åºç§å®¢è¿éï¼å ¨ç彿ï¼", tc.get("å ¨ç")[0], "ä¸äºº"); } } catch (Exception ex) { problems.add(ex.getMessage()); } } else if (isFreightType(t)) { coverage.addAll(freightCover); missing = missingMonths(freightCover, month); freightPreview(period, month, summary, problems); @@ -954,14 +1041,15 @@ return org.apache.poi.ss.util.CellReference.convertNumToColString(colIdx); } /** æ 客åå¸å·æå¼ï¼0=客è¿é/1=å¨è½¬é/2=个ä½å®¢è¿é/3=个ä½å¨è½¬éï¼ */ /** æ 客åå¸å·æå¼ï¼0=客è¿é/1=å¨è½¬é/2=个ä½å®¢è¿é/3=个ä½å¨è½¬éï¼0/1=ä¼ä¸H2031+个ä½ï¼2026-09-03 å£å¾ç¡®è®¤ï¼ */ private double passengerMonthVal(Map<Integer, Map<String, PassengerAgg>> data, Map<Integer, Map<String, double[]>> indi, int year, int month, String region, int metricIdx) { if (metricIdx <= 1) { if (metricIdx == 0 || metricIdx == 1) { // 客è¿é/å¨è½¬éæ»è¡ï¼ä¼ä¸+ä¸ªä½ PassengerAgg agg = aggOf(data, year, month, region); Double val = agg == null ? null double ent = agg == null ? 0.0 : (metricIdx == 0 ? agg.passengerTotal / 10000.0 : agg.turnoverTotal / 10000.0); return val == null ? 0.0 : val; double ind = individualVal(indi, year, month, region, metricIdx == 0 ? 0 : 1); return ent + ind; } return individualVal(indi, year, month, region, metricIdx - 2); } @@ -2106,7 +2194,7 @@ /** * ä¸å£å¾åç±»æåº¦æ°æ®ï¼å¹´*100+æ -> (å¸å·/å ¨ç -> double[5][2]) * 维度 0=æ»é 1=å ¬è·¯ç线(h2031) 2=åé åä¹¡å ¬äº¤(cityBus) 3=巡游åºç§ 4=ç½çº¦è½¦ï¼[客è¿é(ä¸äºº), å¨è½¬é(ä¸äººå ¬é)] * 维度 0=æ»é 1=å ¬è·¯ç线(h2031+个ä½) 2=åé åä¹¡å ¬äº¤(cityBus) 3=巡游åºç§ 4=ç½çº¦è½¦ï¼[客è¿é(ä¸äºº), å¨è½¬é(ä¸äººå ¬é)] */ private Map<Integer, Map<String, double[][]>> loadMidClassMap() { Map<Integer, Map<String, double[][]>> mid = new HashMap<>(); @@ -2128,6 +2216,25 @@ + nz(e.getPassengerClass4()) + nz(e.getPassengerCharter())) / 10000.0; double turn = (nz(e.getTurnoverClass1()) + nz(e.getTurnoverClass2()) + nz(e.getTurnoverClass3()) + nz(e.getTurnoverClass4()) + nz(e.getTurnoverCharter())) / 10000.0; addMidClass(mid, key, city, 1, pass, turn); addMidClass(mid, key, "æ¹åç", 1, pass, turn); } for (PassengerIndividualMonthly e : passengerIndividualMapper.selectList(null)) { // 个ä½å¹¶å ¥å ¬è·¯ç线/æ»éï¼09-03 å£å¾ï¼ if (e.getReportPeriod() == null) continue; String[] parts = e.getReportPeriod().split("-"); if (parts.length != 2) continue; int y, m; try { y = Integer.parseInt(parts[0]); m = Integer.parseInt(parts[1]); } catch (NumberFormatException ex) { continue; } String city = RegionUtil.cityByCode(e.getRegionCode()); if (city == null) continue; int key = y * 100 + m; double pass = nz(e.getPassengerCount()) / 10000.0; double turn = nz(e.getTurnover()) / 10000.0; addMidClass(mid, key, city, 1, pass, turn); addMidClass(mid, key, "æ¹åç", 1, pass, turn); } @@ -3087,6 +3194,307 @@ return bos.toByteArray(); } /** * çæ_éè·¯è¿è¾éæ±æ»è¡¨.xlsxï¼P0-P1 骨æ¶ï¼ï¼æ´æ¬å¤å¶æ¯çãYYYYå¹´Mæéè·¯è¿è¾éæ±æ»è¡¨.xlsxãï¼ * ä¿çå ¨é¨é¡µç¾/çå¼/å ¬å¼/2025 å¹´ç¼åå¼ï¼ä» æè¡¨å¤´å¹´ä»½å¨æåä¸ºç®æ å¹´ï¼æ°æ®å¡«å æ P2 èµ·éæ¥æ¥å ¥ã */ public byte[] exportSummaryWorkbook(String period, String mode) throws Exception { int year = Integer.parseInt(period.contains("-") ? period.split("-")[0] : period); int month = period.contains("-") ? monthOf(period, mode) : 12; File template = resolveSummaryMother(period, mode); if (template == null) { throw new RuntimeException("æªæ¾å°æ±æ»è¡¨æ¯çã" + year + "å¹´" + month + "æéè·¯è¿è¾éæ±æ»è¡¨.xlsxãï¼docs/çææ±æ»å¤§è¡¨ï¼"); } try (InputStream in = new FileInputStream(template); XSSFWorkbook wb = new XSSFWorkbook(in)) { dynamicSummaryYear(wb, year); return toBytes(wb); } } /** æ±æ»è¡¨æ¯çå®ä½ï¼ä» 精确å¹é {year}å¹´{month}æâ¦ï¼P0-P1 éª¨æ¶æä¸å 许跨æ/跨年éé»åéï¼ * ç®æ ææ å¯¹åºæ¯çæ¶æç¡®æ¥éï¼æä»½æ©å±è§åå¾ P0 æ¯çå®ç¨¿ååæ¾å¼ï¼ */ private File resolveSummaryMother(String period, String mode) throws Exception { String year = period != null && period.contains("-") ? period.split("-")[0] : (period == null ? "" : period); int month = period != null && period.contains("-") ? monthOf(period, mode) : 12; String name = year + "å¹´" + month + "æéè·¯è¿è¾éæ±æ»è¡¨.xlsx"; return resolveAnyTemplate(summaryTemplateDir, name); } // ==================== ç½çº¦è½¦å®¢è¿éæåè¡¨ï¼æåº¦ï¼ ==================== /** ç½çº¦è½¦å®¢è¿éæå表ï¼è¾å ¥=é¨çº§è®¢åï¼ç½çº¦è½¦è®¢ååå ¨çæ»é.xlsx G-Wï¼+ å ¨ç pinï¼B-Eï¼+ 巡游åºç§ææ¥ï¼DBï¼ï¼ * ç®æ³ä¸ãç½çº¦è½¦æå.xlsxãæé¡µä¸è´ï¼å®¢è¿é=订åå æ¯Ãå ¨çæ»éï¼åå¸å =巡游åºç§åå¸å å æ¯ä»£çãæ¦æ±ä¿æèªèº«å ¶ä½æå©ä½åæï¼ * å¨è½¬é=客è¿éÃ巡游åºç§å¹³åè¿è·å æ¯åæå ¨çå¨è½¬é pinï¼åå¸å å¨è½¬éåæ³ã */ public byte[] exportWycSplit(String period, String mode) throws Exception { if (period == null || !period.contains("-")) { throw new RuntimeException("ç½çº¦è½¦å®¢è¿éæåè¡¨ä» æ¯æææçæï¼è¯·éæ©å ·ä½æä»½"); } int year = Integer.parseInt(period.split("-")[0]); int month = parseMonth(period); Map<String, Object> inp = loadWycMonthlyInput(period, mode); if (inp == null) { throw new RuntimeException("ãç½çº¦è½¦è®¢ååå ¨çæ»é.xlsxãç¼ºå°æ¥è¡¨æ " + period + " çæ°æ®è¡ï¼è¯·å ç»´æ¤å½æè®¢åä¸å ¨ç pin"); } double pinK = (Double) inp.get("pinK"); double pinCK = (Double) inp.get("pinCK"); double pinZ = (Double) inp.get("pinZ"); double pinCZ = (Double) inp.get("pinCZ"); double orderSum = (Double) inp.get("orderSum"); double[] orderArr = (double[]) inp.get("orders"); if (pinK <= 0 || pinCK <= 0 || pinZ <= 0 || pinCZ <= 0 || orderSum <= 0) { throw new RuntimeException("ç½çº¦è½¦è¾å ¥ " + period + " è¡ä¸å®æ´ï¼å ¨ç pin / 订å缺失ï¼è¯·æ ¸å¯¹ãç½çº¦è½¦è®¢ååå ¨çæ»é.xlsxã"); } List<String> cities = RegionUtil.cityList(); int n = cities.size(); if (orderArr == null || orderArr.length < n) { throw new RuntimeException("ç½çº¦è½¦è®¢ååæ°ä¸è¶³ï¼åºä¸º 17 å¸å·è®¢ååï¼"); } Map<String, double[]> taxi = taxiMonthlyOf(period); java.util.List<String> missingTaxi = new java.util.ArrayList<>(); double[] Dtax = new double[n]; double[] Etax = new double[n]; double[] avgD = new double[n]; double[] avgDc = new double[n]; for (int i = 0; i < n; i++) { double[] a = taxi.get(cities.get(i)); if (a == null || a[0] <= 0) { missingTaxi.add(cities.get(i)); continue; } Dtax[i] = a[0]; Etax[i] = a[2]; avgD[i] = a[4]; avgDc[i] = a[5]; } if (!missingTaxi.isEmpty()) { throw new RuntimeException("巡游åºç§ææ¥ç¼ºå°ä»¥ä¸å¸å·æ°æ®ï¼" + String.join("ã", missingTaxi)); } double[] C = new double[n]; double[] H = new double[n]; double[] I = new double[n]; double[] Gl = new double[n]; double[] Hl = new double[n]; double[] Il = new double[n]; double sumG = 0; double sumDl = 0; double sumEl = 0; for (int i = 0; i < n; i++) { C[i] = orderArr[i] / orderSum * pinK; double F = Etax[i] / Dtax[i]; double G = C[i] * F; sumG += G; double Dl = C[i] * avgD[i]; double El = H[i] * avgDc[i]; sumDl += Dl; sumEl += El; } // åå¸å ï¼æ¦æ±ä¿æèªèº«ï¼å ¶ä½æ G å©ä½å æ¯åæè³å ¨çåå¸å pin for (int i = 0; i < n; i++) { if (i == 0) { H[i] = C[i] * (Etax[i] / Dtax[i]); } else { H[i] = (C[i] * (Etax[i] / Dtax[i])) / (sumG - C[0] * (Etax[0] / Dtax[0])) * (pinCK - C[0] * (Etax[0] / Dtax[0])); } I[i] = C[i] - H[i]; } // å¨è½¬éï¼æ 客è¿éÃ巡游åºç§å¹³åè¿è· å æ¯åæå ¨çå¨è½¬é pin double whG = C[0] * (Etax[0] / Dtax[0]); double whDl = C[0] * avgD[0]; double[] El2 = new double[n]; double sumEl2 = 0; for (int i = 0; i < n; i++) { double Dl = C[i] * avgD[i]; double El2v = H[i] * avgDc[i]; El2[i] = El2v; sumEl2 += El2v; Gl[i] = Dl / sumDl * pinZ; } for (int i = 0; i < n; i++) { if (i == 0) { Hl[i] = Gl[i]; } else { Hl[i] = El2[i] / (sumEl2 - El2[0]) * (pinCZ - Gl[0]); } Il[i] = Gl[i] - Hl[i]; } return writeWycSplitWorkbook(period, cities, orderArr, C, Dtax, Etax, H, I, avgD, avgDc, Gl, Hl, Il, pinK, pinCK, pinZ, pinCZ, orderSum); } private byte[] writeWycSplitWorkbook(String period, List<String> cities, double[] orders, double[] C, double[] Dtax, double[] Etax, double[] H, double[] I, double[] avgD, double[] avgDc, double[] Gl, double[] Hl, double[] Il, double pinK, double pinCK, double pinZ, double pinCZ, double orderSum) throws Exception { XSSFWorkbook wb = new XSSFWorkbook(); XSSFSheet sh = wb.createSheet(period + "æå"); int n = cities.size(); // 客è¿éå Row t = sh.createRow(0); t.createCell(0).setCellValue("ç½çº¦è½¦å®¢è¿éæåï¼ä¸äººï¼ æ¥è¡¨æï¼" + period); String[] head1 = {"å¸å·", "è®¢åæ»æ°ï¼åï¼", "ç½çº¦è½¦å®¢è¿éï¼ä¸äººï¼", "巡游åºç§å®¢è¿éï¼ä¸äººï¼", "巡游åºç§åå¸å 客è¿éï¼ä¸äººï¼", "åå¸å å æ¯", "ç½çº¦è½¦åå¸å 客è¿éï¼ä¸äººï¼", "ç½çº¦è½¦åé å乡客è¿éï¼ä¸äººï¼"}; Row h1 = sh.createRow(1); for (int j = 0; j < head1.length; j++) h1.createCell(j).setCellValue(head1[j]); int r = 2; writeWycRow(sh, r++, "å ¨ç", orderSum, pinK, sum(Dtax), sum(Etax), pinK > 0 ? pinCK / pinK : 0, pinCK, pinK - pinCK); for (int i = 0; i < n; i++) { writeWycRow(sh, r++, cities.get(i), orders[i], C[i], Dtax[i], Etax[i], Dtax[i] > 0 ? Etax[i] / Dtax[i] : 0, H[i], I[i]); } r += 1; Row t2 = sh.createRow(r++); t2.createCell(0).setCellValue("æ 客å¨è½¬éæåï¼ä¸äººå ¬éï¼"); String[] head2 = {"å¸å·", "åºç§è½¦å¹³åè¿è·ï¼å ¬éï¼", "åºç§è½¦åå¸å å¹³åè¿è·ï¼å ¬éï¼", "ç½çº¦è½¦æ 客å¨è½¬éï¼ä¸äººå ¬éï¼", "ç½çº¦è½¦åå¸å æ 客å¨è½¬éï¼ä¸äººå ¬éï¼", "ç½çº¦è½¦åé å乡æ 客å¨è½¬éï¼ä¸äººå ¬éï¼"}; Row h2 = sh.createRow(r++); for (int j = 0; j < head2.length; j++) h2.createCell(j).setCellValue(head2[j]); writeWycRow2(sh, r++, "å ¨ç", 0, 0, pinZ, pinCZ, pinZ - pinCZ); for (int i = 0; i < n; i++) { writeWycRow2(sh, r++, cities.get(i), avgD[i], avgDc[i], Gl[i], Hl[i], Il[i]); } r += 1; String[] notes = { "注ï¼1) 客è¿é C = 订åå æ¯ Ã å ¨çç½çº¦è½¦å®¢è¿éï¼åå¸å Hï¼æ¦æ±=èªèº«ï¼å ¶ä½æ G å©ä½å æ¯åæè³å ¨çåå¸å pinï¼åé å乡 = æ»é - åå¸å ã", " 2) å¨è½¬é G = 客è¿é à 巡游åºç§å¹³åè¿è· çå æ¯ Ã å ¨çç½çº¦è½¦å¨è½¬é pinï¼åå¸å å¨è½¬éåæ³ï¼ç¨åå¸å å¹³åè¿è·ï¼ã", " 3) è¾å ¥ï¼è®¢å = 彿忿¥åéä»¶1ï¼17 å¸å·è®¢åæ°ï¼ï¼å ¨ç pin = ç½çº¦è½¦æ»æ°.xlsxï¼å·¡æ¸¸åºç§ = 巡游åºç§ææ¥ï¼ç³»ç»å¯¼å ¥ï¼å«å¹³åè¿è·ï¼ã", " 4) æ¦æ±æ åé åä¹¡ï¼æ°å¼ä¿çå ¨ç²¾åº¦ï¼çé¢/æä»¶æ¾ç¤ºä¸¤ä½å°æ°ã" }; for (String nt : notes) { Row nr = sh.createRow(r++); nr.createCell(0).setCellValue(nt); } for (int j = 0; j < 8; j++) sh.setColumnWidth(j, 18 * 256); return toBytes(wb); } private void writeWycRow(Sheet sh, int r, String name, double ord, double k, double dt, double et, double f, double h, double i) { Row row = sh.createRow(r); row.createCell(0).setCellValue(name); row.createCell(1).setCellValue(ord); row.createCell(2).setCellValue(k); row.createCell(3).setCellValue(dt); row.createCell(4).setCellValue(et); row.createCell(5).setCellValue(f); row.createCell(6).setCellValue(h); row.createCell(7).setCellValue(i); } private void writeWycRow2(Sheet sh, int r, String name, double ad, double adc, double g, double h, double i) { Row row = sh.createRow(r); row.createCell(0).setCellValue(name); row.createCell(1).setCellValue(ad); row.createCell(2).setCellValue(adc); row.createCell(3).setCellValue(g); row.createCell(4).setCellValue(h); row.createCell(5).setCellValue(i); } private double sum(double[] a) { double s = 0; for (double v : a) s += v; return s; } /** 读å docs/åå¸å®¢è¿/ç½çº¦è½¦è®¢ååå ¨çæ»é.xlsxï¼æ period(yyyy-MM) è¡å pin(B-E) ä¸ 17 å¸å·è®¢å(G-W) */ private Map<String, Object> loadWycMonthlyInput(String period, String mode) throws Exception { String target = period; File f; try { f = resolveAnyTemplate(templateDir, "ç½çº¦è½¦è®¢ååå ¨çæ»é.xlsx"); } catch (Exception e) { throw new RuntimeException("æªæ¾å°ãç½çº¦è½¦è®¢ååå ¨çæ»é.xlsxãï¼è¯·æ¾å° docs/åå¸å®¢è¿ ç®å½"); } try (InputStream in = new FileInputStream(f); org.apache.poi.ss.usermodel.Workbook wb = org.apache.poi.ss.usermodel.WorkbookFactory.create(in)) { org.apache.poi.ss.usermodel.Sheet sh = wb.getSheetAt(0); org.apache.poi.ss.usermodel.DataFormatter df = new org.apache.poi.ss.usermodel.DataFormatter(); List<String> cities = RegionUtil.cityList(); int n = cities.size(); for (int i = 1; i <= sh.getLastRowNum(); i++) { Row row = sh.getRow(i); if (row == null) continue; Cell c0 = row.getCell(0); if (c0 == null) continue; String m = df.formatCellValue(c0).trim(); if (m == null || m.isEmpty()) continue; if (m.length() > 7) m = m.substring(0, 7); if (!target.equals(m)) continue; Map<String, Object> map = new HashMap<>(); map.put("pinK", cellNum(row, 1, df, 0.0)); map.put("pinCK", cellNum(row, 2, df, 0.0)); map.put("pinZ", cellNum(row, 3, df, 0.0)); map.put("pinCZ", cellNum(row, 4, df, 0.0)); double[] orders = new double[n]; double orderSum = 0; for (int k = 0; k < n; k++) { orders[k] = cellNum(row, 6 + k, df, 0.0); orderSum += orders[k]; } if (orderSum <= 0) { orderSum = cellNum(row, 5, df, 0.0); // F åå计å åº } map.put("orders", orders); map.put("orderSum", orderSum); return map; } return null; } } private double cellNum(Row row, int idx, org.apache.poi.ss.usermodel.DataFormatter df, double def) { Cell c = row.getCell(idx); if (c == null) return def; if (c.getCellType() == CellType.NUMERIC) return c.getNumericCellValue(); String s = df.formatCellValue(c).replace(",", "").trim(); if (s == null || s.isEmpty()) return def; try { return Double.parseDouble(s); } catch (Exception e) { return def; } } /** 巡游åºç§ææ¥ï¼DBï¼ææå è½½ï¼å¸å· -> [客è¿é, å¨è½¬é, åå¸å 客è¿é, åå¸å å¨è½¬é, å¹³åè¿è·, åå¸å å¹³åè¿è·] */ private Map<String, double[]> taxiMonthlyOf(String period) { Map<String, double[]> map = new java.util.LinkedHashMap<>(); List<CityTaxiMonthly> rows = cityTaxiMapper.selectList( new LambdaQueryWrapper<CityTaxiMonthly>().eq(CityTaxiMonthly::getReportPeriod, period)); for (CityTaxiMonthly r : rows) { String city = RegionUtil.normalizeCityName(r.getCity()); if (city == null || city.isEmpty()) city = "æªç¥"; double[] a = map.computeIfAbsent(city, k -> new double[6]); a[0] += nz(r.getPassengerVolume()); a[1] += nz(r.getTurnover()); a[2] += nz(r.getPassengerCity()); a[3] += nz(r.getTurnoverCity()); if (r.getAvgDistance() != null && r.getAvgDistance() > 0) a[4] = r.getAvgDistance(); if (r.getAvgDistanceCity() != null && r.getAvgDistanceCity() > 0) a[5] = r.getAvgDistanceCity(); } for (double[] a : map.values()) { if (a[4] <= 0 && a[0] > 0) a[4] = round(a[1] / a[0], 2); if (a[5] <= 0 && a[2] > 0) a[5] = round(a[3] / a[2], 2); } return map; } /** æ±æ»å·¥ä½ç°¿å¹´ä»½å¨æåï¼ä» æ 2026å¹´ åç¼æ¿æ¢ä¸ºç®æ å¹´ï¼2025/2024 åèåä¸å¨ï¼ */ private void dynamicSummaryYear(XSSFWorkbook wb, int year) { String oldPrefix = "2026å¹´"; String newPrefix = year + "å¹´"; if (oldPrefix.equals(newPrefix)) return; for (int i = 0; i < wb.getNumberOfSheets(); i++) { Sheet sh = wb.getSheetAt(i); if (sh == null) continue; for (Row row : sh) { if (row == null) continue; for (Cell c : row) { if (c == null || c.getCellType() != CellType.STRING) continue; String v = c.getStringCellValue(); if (v != null && v.contains(oldPrefix)) { c.setCellValue(v.replace(oldPrefix, newPrefix)); } } } } } /** çæ_æèµæ¥è¡¨ç³»å.zipï¼é¢å®æ + åäºäº + 亿å + ç»æµå¼ºå¿ */ public byte[] exportInvestSeries(String period, String mode) throws Exception { java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream(); @@ -3127,6 +3535,7 @@ case "passengerMidDetail": return exportPassengerMidDetail(period, mode); case "passengerMidRank": return exportPassengerMidRank(period, mode); case "passengerMidAnalysis": return exportPassengerMidAnalysis(period, mode); case "summaryWorkbook": return exportSummaryWorkbook(period, mode); case "energySummary": return exportEnergySummary(period); case "investPlan": return investPlan(period, mode); case "investFiveYearLogistics": return investFiveYearLogistics(period, mode); @@ -3138,6 +3547,7 @@ case "cityPassengerCitySum": return exportCityPassengerCitySum("çæ_åå¸å®¢è¿å®¢è¿éåå¸å·ç´¯è®¡.xlsx", period, mode); case "cityPassengerDetailSum": return exportCityPassengerCitySum("çæ_åå¸å®¢è¿åå¸å·æç»è¡¨.xlsx", period, mode); case "cityPassengerSummary": return exportCityPassengerSummary(period, mode); case "wycSplit": return exportWycSplit(period, mode); default: return null; } } @@ -3162,6 +3572,8 @@ REPORT_FILE_NAMES.put("cityPassengerCitySum", "çæ_åå¸å®¢è¿å®¢è¿éåå¸å·ç´¯è®¡.xlsx"); REPORT_FILE_NAMES.put("cityPassengerDetailSum", "çæ_åå¸å®¢è¿åå¸å·æç»è¡¨.xlsx"); REPORT_FILE_NAMES.put("cityPassengerSummary", "çæ_åå¸å®¢è¿æ±æ».xlsx"); REPORT_FILE_NAMES.put("summaryWorkbook", "çæ_éè·¯è¿è¾éæ±æ»è¡¨.xlsx"); REPORT_FILE_NAMES.put("wycSplit", "çæ_ç½çº¦è½¦å®¢è¿éæå表.xlsx"); } private void addZipEntry(java.util.zip.ZipOutputStream zos, String name, byte[] data) throws Exception { @@ -3412,6 +3824,7 @@ } private byte[] toBytesHssf(HSSFWorkbook wb) throws Exception { applyTwoDecimalFormat(wb); try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { wb.write(out); wb.close(); @@ -4145,7 +4558,45 @@ private double nz(Double v) { return v == null ? 0.0 : v; } /** çæè¡¨æ°å¼åç»ä¸æ ·å¼ï¼ä¿çå ¨ç²¾åº¦æ°å¼ï¼æ¾ç¤ºä¸¤ä½å°æ°ï¼æ´æ°å¼ä¸ %/æ¥æ/ç§å¦è®¡æ°çæ¢ææ ·å¼ä¸æ¹å */ private void applyTwoDecimalFormat(org.apache.poi.ss.usermodel.Workbook wb) { if (wb == null) return; org.apache.poi.ss.usermodel.DataFormat df = wb.createDataFormat(); short fmtTwo = df.getFormat("0.00"); for (int s = 0; s < wb.getNumberOfSheets(); s++) { org.apache.poi.ss.usermodel.Sheet sh = wb.getSheetAt(s); if (sh == null) continue; for (org.apache.poi.ss.usermodel.Row row : sh) { if (row == null) continue; for (org.apache.poi.ss.usermodel.Cell cell : row) { if (cell == null) continue; try { CellType ct = cell.getCellType(); if (ct != CellType.NUMERIC && ct != CellType.FORMULA) continue; if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) continue; if (ct == CellType.NUMERIC && Math.rint(cell.getNumericCellValue()) == cell.getNumericCellValue()) continue; org.apache.poi.ss.usermodel.CellStyle cs = cell.getCellStyle(); if (cs == null) continue; String f = cs.getDataFormatString(); if (f == null) f = ""; if (f.contains("%") || f.contains("E") || f.contains("0.00")) continue; boolean plain = f.isEmpty() || "General".equals(f) || "general".equals(f) || "0".equals(f) || "#,##0".equals(f) || "0.0".equals(f) || "#,##0.0".equals(f); if (!plain) continue; org.apache.poi.ss.usermodel.CellStyle ns = wb.createCellStyle(); ns.cloneStyleFrom(cs); ns.setDataFormat(fmtTwo); cell.setCellStyle(ns); } catch (Exception ignore) { // 个å«åå æ ¼æ ¼å¼å¼å¸¸ä¸é»å¡å¯¼åº } } } } } private byte[] toBytes(XSSFWorkbook wb) throws Exception { applyTwoDecimalFormat(wb); try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { wb.write(out); wb.close(); traffic-audit-web/src/views/DataImport.vue
@@ -29,10 +29,10 @@ <div class="card-head">éæ©æ°æ®ç±»å</div> <div class="module-tabs-head"> <el-radio-group v-model="activeModule" size="small" @change="onModuleSwitch"> <el-radio-button v-for="g in groups" :key="g.key" :label="g.key">{{ g.name }}</el-radio-button> <el-radio-button v-for="g in visibleGroups" :key="g.key" :label="g.key">{{ g.name }}</el-radio-button> </el-radio-group> </div> <div v-for="g in groups" :key="g.key" v-show="activeModule === g.key" class="module-tab-pane"> <div v-for="g in visibleGroups" :key="g.key" v-show="activeModule === g.key" class="module-tab-pane"> <div class="module-sel"> <div class="module-sel-row"> <el-select v-model="moduleSel[g.key]" placeholder="éæ©æ°æ®ç±»å" style="width:260px" @@ -107,7 +107,7 @@ </div> <div v-if="!period" class="tip">请å å¨ä¸æ¹éæ©æ¥è¡¨æ</div> <div v-else class="overview-grid"> <div class="ov-row" v-for="g in groups" :key="g.key"> <div class="ov-row" v-for="g in visibleGroups" :key="g.key"> <div class="ov-group">{{ g.name }}</div> <div class="ov-item" v-for="t in g.types" :key="t.value" :class="overviewState(t.value).cls"> <div class="ov-name">{{ t.label }}</div> @@ -206,7 +206,7 @@ ] }, { key: 'annual', name: 'å¹´æ¥', types: [ key: 'annual', hidden: true, name: 'å¹´æ¥', types: [ { value: 'annualCompanyBasic', label: 'åä½åºæ¬æ åµ' }, { value: 'annualEnterpriseFinance', label: 'æ³äººä¼ä¸è´¢å¡ç¶åµ' }, { value: 'annualPassengerEnergy', label: 'å ¬è·¯æ 客è¿è¾è½æºæ¶èæ åµ' }, @@ -224,6 +224,8 @@ } }, computed: { // å¹´æ¥æä¸å¼æ¾ï¼éèå ¥å£ï¼æ°æ®ä¿çï¼å端å®ç°åå¯ç§»é¤ hiddenï¼ visibleGroups() { return this.groups.filter(g => !g.hidden) }, failBatches() { return this.batches.filter(b => b.failRows > 0) }, failRowsFlat() { const out = [] traffic-audit-web/src/views/ReportExport.vue
@@ -190,7 +190,9 @@ { key: 'cityRailFerryDetail', label: '轨é轮渡客è¿éåå¸å·æç»', fileName: 'çæ_轨é轮渡客è¿éåå¸å·æç».xlsx', status: null, statusNote: '' }, { key: 'cityPassengerCitySum', label: 'åå¸å®¢è¿å®¢è¿éåå¸å·ç´¯è®¡', fileName: 'çæ_åå¸å®¢è¿å®¢è¿éåå¸å·ç´¯è®¡.xlsx', status: null, statusNote: '' }, { key: 'cityPassengerDetailSum', label: 'åå¸å®¢è¿åå¸å·æç»è¡¨', fileName: 'çæ_åå¸å®¢è¿åå¸å·æç»è¡¨.xlsx', status: null, statusNote: '' }, { key: 'cityPassengerSummary', label: 'åå¸å®¢è¿æ±æ»', fileName: 'çæ_åå¸å®¢è¿æ±æ».xlsx', status: null, statusNote: '' } { key: 'cityPassengerSummary', label: 'åå¸å®¢è¿æ±æ»', fileName: 'çæ_åå¸å®¢è¿æ±æ».xlsx', status: null, statusNote: '' }, { key: 'wycSplit', label: 'ç½çº¦è½¦å®¢è¿éæå表', fileName: 'çæ_ç½çº¦è½¦å®¢è¿éæå表.xlsx', status: null, statusNote: '' }, { key: 'summaryWorkbook', label: 'éè·¯è¿è¾éæ±æ»è¡¨ï¼æ´æ¬ï¼', fileName: 'çæ_éè·¯è¿è¾éæ±æ»è¡¨.xlsx', status: null, statusNote: '' } ], checked: [] }, {