feat: 报表新版式(上累计+下当月)与导入校验增强、I004 保护 + 09-02 测试文档
- 报表生成(ReportExportService):公路旅客中口径分析/排名、城市客运汇总/分市州累计按新版式补“当月”块并修正占比/排名公式范围;货运量/周转量排名第二页改填当月值、列头导出为“当月完成”;城市客运导出底稿由已删《导入模板_*》改回《生成_*》
- 导入:城市公交/巡游出租/投资系统导出表头列位校验、运政车辆/轨迹里程表头名称映射、投资市州月报多 sheet 识别与空序号行解析、I004 投资系统基准整期缺失保护
- 文档:docs 生成模板新版式落盘、09-02 功能测试报告/工作日结/待业务确认清单/导入功能体检报告
7个文件已删除
24个文件已修改
12个文件已添加
| | |
| | | ## éªè¯æ³¨æ |
| | | - æ²ç®±å
`Get-NetTCPConnection` ä¼å æéâæç»è®¿é®âèéé»å¤±è´¥ï¼**ä¸è¦**æ®æ¤å¤å®ç«¯å£æªçå¬ï¼å¤ææå¡ç¶æä»¥ backend.log / frontend.log 为åã |
| | | - ç¨æ·è¦æ±ï¼ä¸´æ¶èæ¬/æä»¶æªç»åæä¸å ï¼å¯¼å
¥å¤±è´¥è¦å¨é¡µé¢æ¾ç¤ºè¡å·ï¼AI åæç»æè¦ç»ç»æåæç + éåè¾åºå¨ç»ã |
| | | |
| | | ## å·¥ä½è§èï¼2026-09-02 èµ·ï¼å¿
é¡»éµå®ï¼ |
| | | 1. **æ¯åå®ä¸ä¸ªåè½ï¼ç«å³æµè¯å¹¶åãåè½æµè¯æ¥åã** |
| | | - æµè¯è³å°è¦çï¼æ£åç¨ä¾ï¼æ£å¸¸æ°æ®ï¼ãè´åç¨ä¾ï¼éç±»å/éåä½/缺åçï¼ãå
¥åºæ½æ¥ï¼ä¸æºæä»¶é项对é½ï¼ã |
| | | - æ¥ååå
¥ `docs/åè½æµè¯æ¥å/`ï¼å½åï¼`åè½æµè¯æ¥å_<åè½å>_<YYYY-MM-DD>.md`ã |
| | | - æ¥åé¡»å
å«ï¼åè½è¯´æãæµè¯ç¯å¢ãç¨ä¾è¡¨ï¼è¾å
¥/颿/å®é
/ç»è®ºï¼ãåç°çé®é¢ä¸å¤ç½®ãç»è®ºã |
| | | 2. **æ¯å¤©ä¸çååã工使¥ç»ãï¼å½å鿥æ** |
| | | - åå
¥ `docs/工使¥ç»/`ï¼å½åï¼`工使¥ç»_<YYYY-MM-DD>.md`ã |
| | | - å
容è³å°å
å«ï¼ä»å¤©åäºä»ä¹ï¼åè½/ä¿®å¤ï¼ãæµè¯ç»ææè¦ãéçé®é¢ä¸å¾
åãæå¤©è®¡åã |
| | | - å½å¤©æ²¡æä»£ç /æµè¯å·¥ä½æ¶ï¼ä¹è¦åï¼ä¸å¥è¯è¯´æâ仿¥æ ä»£ç æ¹å¨âå³å¯ï¼ã |
| New file |
| | |
| | | # äº¤æ¥ææ¡£ï¼2026-08-31ï¼æ¬å°å¼åä¼è¯ï¼ |
| | | |
| | | > ç¨éï¼æ°ä¼è¯æ ç¼æ¥åã弿°ä¼è¯å让 Codex å
è¯»æ¬æä»¶ + é¡¹ç®æ ¹ `AGENTS.md`ã |
| | | > 注æï¼æ¬æä»¶ä¸ºæ¬å°ä¼è¯ç¬ç«äº¤æ¥ï¼**ä¸è¦è¦ç/ä¿®æ¹åäºæ¨éç `HANDOFF.md`**ã |
| | | |
| | | ## ä¸ãé¡¹ç®æ¦åµ |
| | | - 交éè´§è¿ç»è®¡å®¡æ ¸ç³»ç»ï¼æ¹åè´§è¿é/å¨è½¬éçï¼ã |
| | | - å端 Spring Bootï¼`traffic-audit-server`ï¼ç«¯å£ 8090ï¼ï¼å端 Vue2 + Element UIï¼`traffic-audit-web`ï¼ç«¯å£ 8080ï¼`/api` 代ç 8090ï¼ã |
| | | - ä¸é®å¯å¨ï¼`powershell -NoProfile -ExecutionPolicy Bypass -File start-dev.ps1`ï¼å¿
é¡»æ²ç®±å¤è¿è¡ï¼ä¼èªå¨æ£æµ 8090/8080ï¼å·²å¨è·åè·³è¿ï¼ã |
| | | - æ¥å¿ï¼æ ¹ç®å½ `backend.log`ã`traffic-audit-web/frontend.log`ãæåæ å¿ï¼å端 `Started TrafficAuditApplication`+`Tomcat started on port(s): 8090`ï¼å端 `Compiled successfully`+`App running at:`ã |
| | | |
| | | ## äºãå½å代ç ç¶æ |
| | | - æ¬å° `main` 䏿å¡å¨ä¸è´ï¼`079d872`ï¼8/31 åäº 5 ä¸ªæ°æäº¤å·²åæ¥ï¼sessionStorage 强å¶ç»å½ c62a61cã/import ä¸ /report el-tabs ä¿®å¤ 684da41/d42a044ãå´©æºæ ¹å ææ¡£ f0597c2ã交æ¥çº¦å® 079d872ï¼ã |
| | | - åäº 8/28 æ¹å¨ï¼ |
| | | - `2bd663b` fixï¼ExplainReview.vue éå¤ components é®ï¼AppHeader 被 AiChatDialog è¦çï¼å·²åå¹¶ï¼RuleManage/UserManage å¸å±ç»ä¸ä¸º app-header ä¸ä¸å¸å±ï¼ç§»é¤èåå
失æéåºé¡¹ã |
| | | - `37496dc` docsï¼ç¨æ· 4 é®é¢ï¼å®¡æ ¸ç»æèåä¸é«äº®/横æ 缺失/éåºä¸æ¾ç¤º/强å¶ç»å½ï¼âââ¡â¢å·²ä¿®ï¼â£ token æ¹ sessionStorage = å¾
åï¼**/import æ°æ®å¯¼å
¥é¡µ JS 主线ç¨å¡æ»æ°åç°ï¼æªä¿®ï¼**ã |
| | | - æå¡å½å**å¨è¿è¡**ï¼8/31 ä¼è¯æ²¿ç¨ï¼8080/8090 åå¨çå¬ï¼backend.log / frontend.log æ£å¸¸ï¼ãéè¦é坿¶ç¨ start-dev.ps1ï¼æ²ç®±å¤ï¼ã |
| | | |
| | | ## ä¸ãè¿è¡ç¯å¢ï¼éè¦ï¼ |
| | | - æ°æ®åºï¼`localhost:3308`ï¼åº `traffic_audit`ï¼`root/123456`ï¼è§æ¬å° `traffic-audit-server/src/main/resources/application.yml`ï¼ä¸å
¥åºï¼ã |
| | | - â ï¸ åäº HANDOFF éåç `3305/root/root` å·²è¿æ¶ï¼3305 æªçå¬ï¼ï¼ä»¥ application.yml 为åã |
| | | - 该åºä¸º 8/27 æåäº Navicat åå¹¶åç宿´åºï¼27 表ã约 6 ä¸è¡ï¼sys_user 4 è´¦å· admin+zhangsan/lisi/wangwuï¼**æ¬æºåºä¸ 4 è´¦å·å¯ç å为 `123456`**ï¼8/31 bcrypt+ç»å½æ¥å£å®æµï¼admin/123456 è¿å 200ï¼ææ¡£æ§è®° admin/admin123 卿¬æºä¸å¹é
ï¼å¿åç¨ï¼ã |
| | | - ç»å½éªè¯ç ï¼æ¬å° `application.yml` å·²é
`app.captcha.required: false`ï¼æµè¯è·³è¿ï¼æ¥å£ /api/auth/captcha-config è¿å falseï¼ã该é
ç½®ä¸å
¥åºï¼**æ£å¼åå¸åæ¹å true**ã |
| | | - 客æ·ç«¯ï¼æ¬æº MySQL 客æ·ç«¯ `D:\mysql\mysql-5.7.41-winx64\bin\mysql.exe`ï¼è¿ 3308 ç¨ root/123456ï¼ï¼HANDOFF æéæ£å¼ç¨ 8.0 客æ·ç«¯ï¼æ¬æº `C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe`ï¼ã |
| | | |
| | | ## åãæè¿å®æçäºé¡¹- **认è¯ä¿¡æ¯ localStorage â sessionStorageï¼8/31 宿ï¼**ï¼ |
| | | - ç»å½æåé®ï¼token/username/realName/modulesï¼å
¨é¨æ¹å sessionStorageï¼Login.vueï¼åå
¥ï¼ãrouter/index.jsï¼å®å«è¯»ï¼ãapi/index.jsï¼è¯·æ±å¤´è¯» + 401 æ¸
é¤ï¼ãmain.jsï¼å
¨å± mixin logout æ¸
4 é®ï¼ãAppHeader.vueï¼ç¨æ·åæ¾ç¤º + ç»åºæ¸
4 é®ï¼ãReportExport.vueï¼ç¨æ·å/çå®å/模å读å + ç»åºæ¸
4 é®ï¼ã |
| | | - åå¥½ç±»ä¿æ localStorageï¼DataImport ç `dirLast_*`ï¼ç®å½è®°å¿ï¼ãReportExport ç `report_note_*`ï¼æ¥è¡¨å¤æ³¨è稿ï¼ã |
| | | - è¡ä¸ºï¼åæ ç¾é¡µ F5 å·æ°ä¿æç»å½ï¼å
³æ ç¾é¡µ/æ°å¼æ ç¾é¡µééæ°ç»å½ï¼å¼ºå¶ç»å½çæï¼ï¼ç»åºæ¸
空 4 é®åç»å½é¡µã |
| | | - éªè¯ï¼puppeteerï¼admin/123456 UI ç»å½ï¼ï¼æ token è®¿é® /#/dashboard ä¸ /#/audit åéå®å /#/loginï¼ç»å½å sessionStorage æ tokenãlocalStorage æ tokenï¼ç»åºæ¸
空ï¼/import 请æ±å¤´æºå¸¦ Bearer tokenãè¡¨æ ¼ 28 è¡æ£å¸¸ã |
| | | |
| | | - **/import 主线ç¨å¡æ»æ ¹å å®ä½å¹¶ä¿®å¤ï¼8/31ï¼**ï¼ |
| | | - å¤ç°ï¼puppeteer-core + ç³»ç» Chromeï¼CDPï¼ï¼/import å¨çªå£å®½åº¦ â¤1366 æ¶ JS 主线ç¨**æ°¸ä¹
**塿»ï¼800x600 / 1280x800 / 1366x768 åå»ç»ï¼1440+ æ£å¸¸ï¼ï¼åæ¢éä¸ /data /audit /report å
¨å®½åº¦æ£å¸¸ã |
| | | - æ ¹å ï¼Element UI `el-tabs`ï¼TabNavï¼`updated()` é©åéç `update()` æ DOM æµéåååºå¼ `scrollable`/`navOffset`ãæ¬é¡µå¸å±ä¸ `.el-tabs__nav-scroll` 宽度å¨é scrollable æå®æµ 0ãå æ»å¨æé®å宿µ 998ï¼å¯¼è´ `scrollable` å¨ falseâ{} é´æ¯è¡ â æ¸²æ watcher æ éèªå
¥éï¼`flushSchedulerQueue` æ°¸ä¸æç©ºï¼â ä¸»çº¿ç¨æ»å¾ªç¯ãCDP `Debugger.pause` ææ ï¼`flushSchedulerQueueâWatcher.runâupdateComponentâ_renderârender` ä¸ `updatedâupdateâreactiveSetter(key=scrollable)`ã |
| | | - å½±åï¼å³ãæ°æ®å¯¼å
¥é¡µæ ååºããç¹æ°æ®å¯¼å
¥èåæµè§å¨æ ååºãï¼ä¹è§£éãå®¡æ ¸ç»æèåä¸é«äº®ãï¼é¡µé¢ JS é»å¡âç¹å»/é«äº®æ´æ°å
¨è¢«å¡ä½ï¼/audit 页èªèº«æ é®é¢ï¼ã |
| | | - ä¿®å¤ï¼DataImport.vue ä¸ ReportExport.vue ç `el-tabs` æ¢æ `el-radio-group`/`el-radio-button` æé® + `v-show` 颿¿ï¼åäºæäº¤ 684da41/d42a044ï¼æ¬æºå·²åæ¥ï¼ç»å¼ TabNav æµé循ç¯ï¼ã |
| | | - éªè¯ï¼800/1280/1366/1440/1920 å
¨å®½åº¦ä¸¤é¡µåä¸åå»ç»ï¼10s æç» ping æ£å¸¸ï¼ãTab 忢æ£å¸¸ãbatches è¡¨æ ¼æ¸²ææ£å¸¸ï¼/import ç¹å»ãå®¡æ ¸ç»æãèå â `#/audit` é«äº®æ£å¸¸ã |
| | | - /report è½æµè¯æªå»ç»ï¼ä½åç»ä»¶æµéåæ ·ä¸å¯é ï¼1440x900 æ¶ nav-wrap ä»
97pxï¼ï¼å·²ä¸å¹¶æ¿æ¢é²åç±»éæ£ãæ¢éèæ¬å¨ `outputs/pptr/`ï¼probe*.jsãverify_*.jsï¼ã |
| | | |
| | | - 代ç 忥ï¼å¤æ¬¡ fetch/pull ä¿æä¸æå¡å¨ä¸è´ï¼åäºæ°å¢æäº¤åå·²æåã |
| | | - æå¡ç®¡çï¼å¤æ¬¡åæ§èµ·æ°ï¼ç²¾ç¡®æ PID åé¾ï¼å端 cmdâmavenâappï¼å端 cmdânpmâcmdâvue-cliï¼ä¸æ Codex å
æ ¸/IDEA ç»ç«¯ï¼ã |
| | | - éªè¯ç å
³éï¼æ¬æºé
ç½® `app.captcha.required: false` å¹¶éå¯å端éªè¯ã |
| | | - è´§è¿æ°æ®ä¸è´æ§æ ¸å¯¹ï¼8/29ï¼ï¼ |
| | | - å¯¹æ¯ `docs/è´§è¿é导å
¥çæ°æ®/è´§è¿/`ï¼2025 å
¨å¹´ 12 个æ + 2026 å¹´ 1-7 æï¼å
± 19 个æä»¶ï¼å®ä¸º xlsx æ¹ .xls æ©å±åï¼ä¸åºè¡¨ `h2032_enterprise_monthly`ã |
| | | - **18 个æä»½å®å
¨ä¸è´**ï¼ä¼ä¸æ°/车è¾/å¨ä½/è´§è¿é/å¨è½¬éé项å¹é
ï¼ã |
| | | - **2026-07 ä¸ä¸è´**ï¼åºä¸ 734 è¡ï¼98 å®¶ä¼ä¸éå¤ï¼æ¯æ· 2 è¡ï¼ï¼ææ å计å大约 12%ï¼import_batch_id å
¨ NULL = 8/27 Navicat å并带è¿ï¼éç³»ç»å¯¼å
¥äº§çï¼ãæªæ¸
çã |
| | | - åºä¸å¦æ 2026-08ï¼664 è¡ï¼8/26 æµè¯å¯¼å
¥ï¼ï¼ç®å½æ 8 ææä»¶ã |
| | | - 导å
¥å¹ç已确认ï¼ç³»ç»å¯¼å
¥æ report_period å
å åæï¼å次导å
¥åªåææ°ä¸æ¬¡ã |
| | | |
| | | ## äºãå¾
åï¼æ°ä¼è¯ä¼å
ï¼ |
| | | 1. ~~/import æ°æ®å¯¼å
¥é¡µ JS 主线ç¨å¡æ»~~ï¼8/31 已修å¤ï¼el-tabs TabNav updated é©å scrollable æ¯è¡ â æ 鿏²æå¾ªç¯ï¼åäºæäº¤å·²æ¢ el-radio-group æé® + v-show 颿¿ï¼è¯¦è§ç¬¬åèï¼ã |
| | | 2. ~~认è¯ä¿¡æ¯ localStorage â sessionStorageï¼å¼ºå¶ç»å½ï¼~~ï¼8/31 已宿并éªè¯ï¼è¯¦è§ç¬¬åèï¼ã |
| | | 3. 2026-07 éå¤ 98 è¡æ¸
çï¼å
å¤ä»½åå ï¼æéæ°å¯¼å
¥ 7 ææä»¶ï¼ã |
| | | 4. `docs/æå
é¨ç½²è¯´æ.docx` 第å
èãå¤ç½® application.yml éå
å«å®æ´é
ç½®ãæ¹ä¸ºã屿§çº§åå¹¶ãå鿰坼åºã |
| | | 5. æ£å¼åå¸åï¼captcha.required æ¹ trueï¼å´©æºæ ¹å 以 access log åè¯ï¼å¿å®£ç§°çº¿ç¨æ± å®é¤ï¼å·²è¢« 3 ç¨æ·åºæ¯å驳ï¼ã |
| | | |
| | | ## å
ãåå²ç»è®ºä¸åï¼é¿å
éå¤è¸©ï¼ |
| | | - æ°æ®å¯¼å
¥å´©æºææ¥ï¼å
误è¯è¿
é·æ©å± â åå®é¤ Tomcat çº¿ç¨æ± â å被 3 ç¨æ·åºæ¯å驳 â åäºåç°å端主线ç¨å¡æ»ï¼ææ°æ¹åï¼ã**å¯¹ç¨æ·ä¸è¦å®£ç§°çº¿ç¨æ± å®é¤**ã |
| | | - AGENTS.md ä¸åï¼â æ¬æºåæ¶åå¨ Path/PATH åç¯å¢åéï¼ç¦ç¨ Start-Processï¼ç¨ cmd.exe /c + ProcessStartInfoï¼ï¼â¡node æ²ç®±å
è®¿é® C:\Users 被æï¼èæ¬å¿
é¡»æ²ç®±å¤è·ï¼â¢ä¸è¦åµå¥ powershell å¼å·ã |
| | | - 临æ¶èæ¬/æä»¶ï¼é¡¹ç®æ ¹ `_probe*.py`ã`_compare_freight.py`ã`_probe*.sql`ã`docs.zip`ã`outputs/`ãæå
zipï¼æªç»åæä¸å ã |
| | | - æå
zipï¼traffic-audit-deploy-20260827.zip çï¼å
å«çå® DeepSeek key / JWT secretï¼å¿ä¸ä¼ git æå¤åï¼ä»åºåªæäº¤ `application.yml.example`ã |
| New file |
| | |
| | | # åè½æµè¯æ¥åï¼2026-07 导å
¥ä¸æ¥è¡¨çæåå½ï¼2026-09-02ï¼ |
| | | |
| | | > ç®çï¼éªè¯ä»æ¥ä¸æ¡æ°æ®é¾ã导å
¥âå
¥åºâæ¥è¡¨ãå
¨ç¨å¯ç¨ |
| | | > â åºç§è¿æ¿è½¦è¾ 7 æï¼D:\æ¡é¢\æµè¯æ°æ®\åå¸å®¢è¿\åºç§è½¦ä¿¡æ¯å表 (2).xlsï¼ |
| | | > ⡠个ä½å®¢è¿é/å¨è½¬é 7 æï¼æ°å¸å·æ±æ»æ¨¡æ¿ï¼æ¹åçå
¬è·¯æ
客è¿è¾ä¸ªä½æ·æåº¦ç产æ
åµï¼2026.7ï¼.xlsxï¼å¯¹åº docs\å
¬è·¯æ
客\模æ¿_*.xlsxï¼ |
| | | > â¢ è´§è¿ 7 ææ°æ®é½å
¨åçæ¥è¡¨å£å¾ï¼D:\æ¡é¢\æµè¯æ°æ®\è´§è¿\7æï¼ |
| | | > é¡ºå¸¦å®ææ°æ®æ±¡ææ¸
ç + 22 个æ¥è¡¨æ¥å£é误åå
æ ¼å
¨éæ«æã |
| | | |
| | | ## ä¸ã导å
¥åè½éªè¯ |
| | | |
| | | | ç±»å | æ¥è¡¨æ | æºæä»¶ | æ¹æ¬¡ | æ»æ°/æå/失败 | å
¥åºæ ¸å¯¹ | |
| | | |---|---|---|---|---|---| |
| | | | åºç§è¿æ¿è½¦è¾ CITY_TAXI_AUTH | 2026-07 | åºç§è½¦ä¿¡æ¯å表 (2).xlsï¼çå® 4.2 ä¸è¡ï¼ | #188 | 42636 / 42636 / 0 | city_taxi_auth 2026-07 = 42636 è¡ã17 å¸å·ï¼ä¸ 2026-08ï¼42636/17ï¼å®å
¨ä¸è´ | |
| | | | 个ä½å®¢è¿é PASSENGER_INDIVIDUAL | 2026-07 | æ¹åçå
¬è·¯æ
客è¿è¾ä¸ªä½æ·æåº¦ç产æ
åµï¼2026.7ï¼.xlsxï¼å¸å·æ±æ»æ¨¡æ¿ï¼ | #187 | 7 / 7 / 0 | passenger_individual_monthly å计 189998 人 / 4584040.2 人å
¬é = æºè¡¨å
¨çåè®¡ï¼æ½æ£é»å 5886/175992ãåæ 19636/386845 çä¸è´ | |
| | | | è´§è¿é/å¨è½¬éï¼æ°æ®å±è¡¥é½ï¼ | 2026-07 | 2026å¹´7æå®¢è¿éãè´§è¿é-5xlsx.xlsx | SQL è¡¥é½ | 18 è¡ï¼17 å¸å·+æ¹åçï¼ | å叿å计 16285.7105 ä¸ = æ¹åç 16285.7105ï¼å¨è½¬éåå¸å计 2181925.708 = æ¹åç 2181925.71ï¼æ¦æ± 4940.9715/667561.3739 䏿ºä¸è´ | |
| | | | è§ä¸è§ä¸æåï¼æ°æ®å±éå»ºï¼ | 2026-07 | åä¸ | SQL é建 | MONTH/CUMULATIVE å 18 è¡ | MONTH å计å¨è½¬é 2181925.71ï¼è§ä¸ 597278.64/è§ä¸ 1584647.07ï¼ãCUM å计 15222118.45ï¼æ¦æ± MONTH 204809.56/462751.81/667561.37 | |
| | | |
| | | è¡¥å
说æï¼ |
| | | - ä¿®å¤å 2026-07 æ¾åå¨é»ç³çè¡ freight_m07 为 NULL â åå¸å·æå£å·®åºç° -323.97 çè´å¼ï¼å·²æ¶é¤ã |
| | | - import_batch #177/#178/#179/#186 ä¸ºâæ¨¡æ¿ä»
表头/æ§æ¨¡æ¿é¦è¯â产çç 0 è¡æ¹æ¬¡ï¼æªäº§çæ°æ®ï¼ä¿çä½å®¡è®¡åå²ã |
| | | |
| | | ## äºãæ¥è¡¨çæåå½ï¼period=2026-07&mode=monthï¼ |
| | | |
| | | - 22 ä¸ªå¯¼åºæ¥å£å
¨é¨ HTTP 200ï¼è¾åºçæ¡£ï¼outputs\report_check\regression_2026-07\ |
| | | - å
¨æä»¶é误å
¬å¼æ«æï¼å« 4 个 series å
å
å±ï¼ï¼#REF! / #DIV/0! / #VALUE! ç **0 æ®ç**ã |
| | | - æ°å¼æ½æ¥ä¸å®æ¹æºè¡¨ä¸è´ï¼ |
| | | - cityDetailï¼å
¨ç 7 æè´§è¿é O5=16285.71ãæ¦æ± O11=4940.97ãæ¦æ± 1-7 累计 AA11=34306.78ã |
| | | - turnoverRankï¼å
¨ç累计è§ä¸ 4357157.34 / è§ä¸ 10864961.11 / å计 15222118.45ï¼ä¸ scale_split CUMULATIVE éä½ä¸è´ã |
| | | - freightRankï¼æ¦æ±ç´¯è®¡è§ä¸ 8905.15 / è§ä¸ 25401.63 / å计 34306.78ã |
| | | - å
¬äº¤/åºç§/轨é轮渡ä¸å¼ 表ï¼è¡¨å¤´ä¸ºã2026å¹´1æâ¦2026å¹´7æã2026年累计ãï¼æ 46082 æ°ååºåå·ï¼è½¨éå
¨çè¡æ±å = æ¦æ±+é»ç³ï¼6 æ 11921.16 = 11886.3+34.86 âï¼ã |
| | | - ç³»åå
ï¼cityPassengerSeries / passengerSeries / freightSeries / investSeriesï¼å
å±å
¨é¨ cleanã |
| | | - 说æï¼æèµåå¼ invest* 为 HSSF èæ ¼å¼å¯¼åºï¼æ©å±å .xlsxãå
容为äºè¿å¶ .xlsï¼Excel 坿£å¸¸æå¼ï¼ï¼æ¬æ¥æªåéæ ¼å
¬å¼æ«æã |
| | | |
| | | ## ä¸ãæ¬è½®ä¿®å¤ä¸æ¸
ç |
| | | |
| | | 代ç ï¼ReportExportService.java 为主ï¼ï¼ |
| | | 1. æ¥è¡¨åææ°æ®æ report_period åå¹´è¿æ»¤ ââ ä¿®å¤ H2032 å»å¹´åææ··å
¥å½å¹´å¯¼è´âè§ä¸è´§è¿éÃ2ãè§ä¸ä¸ºè´å¤§å¼âçæºå¤´é®é¢ã |
| | | 2. fixCityMonthHeaderTextï¼æªæ ¼å¼åæ¥æåºåå·ï¼46082 çï¼âãyyyyå¹´Mæãã |
| | | 3. clearFormulaErrorCells / clearFormulaErrorsAllï¼æ¸
空æ±å¼é误çå
¬å¼ç»æï¼æ¨¡æ¿è·¨ç°¿/è·¨è¡¨åæ¯ #REF!ãæ å»å¹´æ°æ® #DIV/0!ï¼ï¼ä¸æ¹åå
¬å¼ææ¬ã |
| | | 4. å·²æ¥å
¥ï¼exportCityByTemplateï¼å
¬äº¤/åºç§ï¼ãexportCityRailFerryDetailãexportPassengerMidDetailãexportEnergySummaryãexportCityPassengerCitySumãexportCityPassengerDetailSumã |
| | | 5. DataImportServiceï¼ä¸ªä½å®¢è¿å模æ¿ï¼ä¿çæ§âä¼ä¸åç§°âæ¨¡æ¿ + æ°å¢å¸å·æ±æ»æ¨¡æ¿ææ é¢åéè¡å
¥åºï¼ï¼RegionUtil å¢å å¸å·åâ6 ä½åºåç ååè§£æä¸çåå«åã |
| | | |
| | | æ°æ®ï¼SQL å·²æ§è¡ï¼çæ¡£ outputs\fill_2026-07_freight_scale.sqlï¼ï¼ |
| | | - freight_turnover_importãscale_split_transport 2026-07 è¡¥é½/é建ï¼è§ç¬¬ä¸èï¼ã |
| | | - h2032_enterprise_monthlyï¼2026-01~2026-08 å 636 æ·ã0 éå¤ï¼8/29 è®°å½ç 2026-07 â734 è¡ / 98 æ·éå¤âå·²æ¶é¤ï¼ï¼2025-01~12 å 664 æ·ä¸ºå»å¹´åºæï¼æ£å¸¸ã |
| | | |
| | | ## åãå·²ç¥ç¼ºå£ï¼æ°æ®æºé®é¢ï¼é代ç 缺é·ï¼ |
| | | |
| | | - åå¸å®¢è¿æåº¦æ°æ®ï¼å
¬äº¤ U203/åºç§ U402/轨é/轮渡ï¼åºå
并鿝æé½æçå®å¼ï¼è½¨é 2026 å¹´ä»
6ã7 æææ°æ® â æ¥è¡¨ 1-5 æåç空ãè¡¥é½åææºæä»¶å鿰坼å
¥å³å¯å®æ´ã |
| | | - ç½çº¦è½¦æ æºæ°æ®ï¼æ¨¡æ¿æ ·ä¾å·²æ¸
空ï¼è®¾è®¡ä¸ä¸è®¡å
¥åå¸å®¢è¿å计ï¼ã |
| | | - å端â导å
¥è¿åº¦æ æ¾ç¤ºâï¼æ¬æ¬¡å¯¼å
¥åèµ°æ¥å£å¹¶æåè½åºï¼æ¹æ¬¡å¯æ¥ï¼ï¼4.2 ä¸è¡å¤§æä»¶å¨é¡µé¢ä¸çè¿åº¦æç¤ºæªå¤ç°ææ¥ï¼å± UI ä¾§å¾
åã |
| | | |
| | | ## äºãç»è®º |
| | | |
| | | - 导å
¥åè½ï¼ä¸æ¡é¾ 0 失败ï¼å
¥åºå¼ä¸æºæä»¶éé¡¹æ ¸å¯¹ä¸è´ â å¯ç¨ã |
| | | - æ¥è¡¨çæï¼22 æ¥å£å¯åºæ°ï¼æ #REF!/#DIV/0! 污æï¼è´§è¿ 7 ææ°åä¸å®æ¹ workbook ä¸è´ â å¯ç¨ã |
| | | - éçï¼åå¸å®¢è¿ç¼ºææºæä»¶è¡¥é½ï¼æèµ .xls èæ ¼å¼å¦éå½»åºæ«æå¦è®®ï¼é¡µé¢è¿åº¦æ¡ UI å¤ç°ææ¥ã |
| New file |
| | |
| | | # åè½æµè¯æ¥å_导å
¥æ ¡éªå¢å¼º_2026-09-02 |
| | | |
| | | ## 1. åè½è¯´æ |
| | | å¯¹æ°æ®å¯¼å
¥æå¡ï¼`DataImportService`ï¼åâ导å
¥åç½®æ ¡éª + è§£æå¥å£®æ§âå¢å¼ºï¼é¿å
åè½èäºæ
飿 ·âåéä½éé»å¯¼å
¥âï¼ |
| | | - è¿æ¿è½¦è¾ã轨迹éç¨ï¼ç±âåºå®åä½âæ¹ä¸º**表头åç§°æ å°**ï¼ä¸ H2032 è´§è¿ææ¥ä¸è´ï¼ââå顺åºååä¹è½å¯¼å
¥ï¼ç¼ºå/ååä¸ç¬¦æç¡®æ¥éã |
| | | - åå¸å
¬äº¤ U203ã巡游åºç§ U402ãæèµç³»ç»å¯¼åºï¼æ°å¢**表头å使 ¡éª**ï¼`requireHeaderLayout`ï¼ï¼åä½éä½ç´æ¥æç»å¹¶æç¤ºâ第 X ååºä¸ºâ¦âã |
| | | - è´§è¿éå¨è½¬éï¼æ°å¢è¡¨å¤´æ ¡éªï¼é¦è¡é¡»ä¸ºãè´§è¿é(ä¸å¨)/1æâ¦ãå¸å±ï¼ã |
| | | - è§ä¸è§ä¸æåï¼æ°å¢ sheet å¸å±æ ¡éªï¼ç¬¬ 2 è¡ãå¸å·/è§ä¸ä¼ä¸è¿è¾éã+ 第 3 è¡ãå¨è½¬é/è´§è¿éãå表头ï¼ã |
| | | |
| | | ## 2. æµè¯ç¯å¢ |
| | | - å端ï¼Spring Bootï¼8090ï¼ï¼æ¬å°å¯å¨ï¼2026-09-02 éå¯åçæã |
| | | - æ°æ®åºï¼`traffic_audit`ï¼localhost:3308ï¼ã |
| | | - æ¹å¼ï¼`curl /api/import/<type>` ç´æ¥è°ç¨ï¼æµè¯æ¥è¡¨æ `2026-HT` / `2026-06`ï¼æµåå·²æ¸
çï¼ã |
| | | - æä»¶ï¼å®æ¹æ¨¡æ¿ï¼docs/è´§è¿ãdocs/åå¸å®¢è¿ãdocs/æèµï¼+ æé ç¨ä¾ï¼ååºæä¹±/éä½å/缺åï¼ã |
| | | |
| | | ## 3. ç¨ä¾ä¸ç»æ |
| | | | # | ç±»å | ç¨ä¾ | 颿 | å®é
| ç»è®º | |
| | | |---|---|---|---|---|---| |
| | | | 1 | è¿æ¿è½¦è¾ | æ¨¡æ¿æä»¶å¯¼å
¥ | æå导å
¥ | æå 2 æ¡ | â
| |
| | | | 2 | è¿æ¿è½¦è¾ | åé¡ºåºæä¹±ï¼ååä¸åï¼ | ä»è½å¯¼å
¥ä¸åæ®µå¯¹é½ | æå 2 æ¡ï¼å
¥åºä¸æ¨¡æ¿é项ä¸è´ | â
| |
| | | | 3 | è¿æ¿è½¦è¾ | 缺ãæè½¦æ»å¨ä½(å¨)ãå | æç¡®æ¥é | 表头缺å°å¿
éåãæè½¦æ»å¨ä½(å¨)ã | â
| |
| | | | 4 | 轨迹éç¨ | æ¨¡æ¿æä»¶å¯¼å
¥ | æå导å
¥ | æå 2 æ¡ | â
| |
| | | | 5 | 轨迹éç¨ | åé¡ºåºæä¹± | ä»è½å¯¼å
¥ä¸åæ®µå¯¹é½ | æå 2 æ¡ | â
| |
| | | | 6 | 轨迹éç¨ | ååæ¹ãæåº¦éç¨(å
¬é)ã | æç¡®æ¥é | 表头缺å°å¿
éåãæåº¦æ»éç¨(å
¬é)ã | â
| |
| | | | 7 | åå¸å
¬äº¤ | 表头第 6 åæãéä½åã | æç»å¹¶æç¤ºåä½ | â第 6 ååºä¸ºãå
Œ
±æ±½çµè½¦_è¿è¥è½¦æ°ãâ | â
| |
| | | | 8 | 巡游åºç§ | 表头第 5 åæãéä½åã | æç»å¹¶æç¤ºåä½ | â第 5 ååºä¸ºãè½½å®¢è½¦æ¬¡æ»æ°ãâ | â
| |
| | | | 9 | æèµç³»ç»å¯¼åº | 第 1 åãè¡å·ãæ¹ãåºå·ã | æç»å¹¶æç¤ºåä½ | â第 1 ååºä¸ºãè¡å·ãâ | â
| |
| | | | 10 | æèµç³»ç»å¯¼åº | æ£ç¡®è¡¨å¤´ | æå | æå 0 æ¡ | â
| |
| | | | 11 | è´§è¿éå¨è½¬é | æ¨¡æ¿æä»¶å¯¼å
¥ | æå导å
¥ | æå 18 æ¡ | â
| |
| | | | 12 | è´§è¿éå¨è½¬é | éç±»åæä»¶ï¼è¿æ¿è½¦è¾ï¼ | æç» | â表头åºä¸ºãè´§è¿é(ä¸å¨)/1æâ¦ãå¸å±â | â
| |
| | | | 13 | è§ä¸è§ä¸ | æ¨¡æ¿æä»¶å¯¼å
¥ | æå导å
¥ | æå 36 æ¡ | â
| |
| | | | 14 | è§ä¸è§ä¸ | sheet åå«â彿âä½å¸å±é误 | æç» | âsheetãæµè¯å½æãæªæ¾å°ãå¸å·/è§ä¸â¦ã表头â | â
| |
| | | | 15 | å
¬è·¯æ
å®¢è¿æ¿è½¦è¾æ° | 模æ¿å¯¼å
¥ï¼ä¸å使£ï¼ | æå | 767 æ¡ 0 失败 | â
| |
| | | | 16 | 个ä½å®¢è¿é | 表头è¯å«ï¼æ¨¡æ¿ä»
è¡¨å¤´ï¼ | 0 æ¡æ æ¥é | æå 0 æ¡ | â
| |
| | | | 17 | åºç§è½¦è¿æ¿ | 表头è¯å«ï¼æ¨¡æ¿ä»
è¡¨å¤´ï¼ | 0 æ¡æ æ¥é | æå 0 æ¡ | â
| |
| | | |
| | | ## 4. å
¥åºæ½æ¥ï¼ä¸æºæä»¶é项对é½ï¼ |
| | | - è¿æ¿è½¦è¾ï¼ååºæä¹±åï¼ï¼å®åæ±½è½¦ç©æµ çµå¼ 0/æ 96/å
¶å® 96/æè½¦å¨ä½ 1057.708/å
¶å®å¨ä½ 871.56 â
|
| | | - 轨迹éç¨ï¼æ¹åä¸åè¿è¾ æåº¦éç¨ 150427.03/æéç¨è½¦è¾ 29 â
|
| | | - è´§è¿éå¨è½¬éï¼æ¦æ± 1 æ=5367.97597ã6 æ=5041.04224ãå»å¹´ 1 æ=4656.86022 â
|
| | | - è§ä¸è§ä¸ï¼æ¦æ±å½æ è§ä¸=241659.5295/è§ä¸=445444.355/å计=687103.884ï¼ç´¯è®¡ sheet ä¸è´ï¼â
|
| | | |
| | | ## 5. åç°çé®é¢ä¸å¤ç½® |
| | | - æªåç°æ°ç¼ºé·ãéçï¼åºç§è½¦è¿æ¿æ¨¡æ¿æ æ°æ®è¡ï¼ä»
éªè¯è¡¨å¤´è¯å«ï¼2026-08 å·²çå®å¯¼å
¥ 42636 æ¡æåï¼å»ºè®®åç»ç¨çå®å¤§æä»¶åå½ä¸æ¬¡ã |
| | | |
| | | ## 6. ç»è®º |
| | | - ææå¯¼å
¥ç±»åç°å¨é½æç±»åè¯å«/æ ¡éªå
åºï¼è¿æ¿è½¦è¾/轨迹éç¨å
¼å®¹å顺åºååãåè½å¯ç¨ï¼å¯äº¤ä»ã |
| | | |
| | | ## 7. æ°æ®è¯´æ |
| | | - æµè¯æ°æ®ï¼2026-HTã2026-06 æµè¯æï¼å·²å
¨é¨æ¸
çï¼æªè§¦ç¢° 2026-07/08 ç宿°æ®ã |
| New file |
| | |
| | | # åè½æµè¯æ¥å_æèµå®¡æ ¸I004åºåç¼ºå¤±ä¿æ¤_2026-09-02 |
| | | |
| | | ## 1. åè½è¯´æ |
| | | é®é¢ï¼8 ææèµç©æµååº/客è¿ç«åºå¯¼å
¥åï¼å®¡æ ¸åºç°å¤§é RULE_I004ãæèµç³»ç»é¡¹ç®ç¼ºå¤±æ ¸å®ã误æ¥ï¼2026-08 å
± 163 æ¡ï¼ï¼åå æ¯åæ¥è¡¨æçæèµç³»ç»å¯¼åºåºåï¼investment_system 2026-08ï¼å°æªå¯¼å
¥ï¼åºéåªæ 2026-07 åºåï¼I001âI003 缺åºåæ¶ä¼è·³è¿ï¼sys==null ä¸å¯¹æ¯ï¼ï¼ä½ I004ï¼checkInvestExistenceï¼ç¼ºåºåæ¶ä»ææ¯ä¸ªé¡¹ç®æ æâæèµç³»ç»å¯¼åºä¸ä¸åå¨âã |
| | | ä¿®å¤ï¼AuditEngineServiceï¼ï¼ |
| | | - executeInvestmentAuditï¼åæ¥è¡¨ææèµç³»ç»åºåæ´æç¼ºå¤±ï¼sysMap ä¸ºç©ºï¼æ¶ï¼è·³è¿ EXISTENCE_SYS ç±»è§åï¼ä¸åæ´è¡¨è¯¯æ¥ã |
| | | - ruleSkippedï¼RULE_I004 å å
¥âåºåæ´æç¼ºå¤±âè·³è¿âå¤å®ï¼è§åç»è®¡é¡µæ è®° skipped=trueï¼ä¸ I001âI003 ä¸è´ï¼ã |
| | | |
| | | ## 2. æµè¯ç¯å¢ |
| | | - å端ï¼Spring Bootï¼8090ï¼ï¼2026-09-02 ä¿®å¤åéå¯çæã |
| | | - æ°æ®åºï¼traffic_auditï¼localhost:3308ï¼ã |
| | | - æ¹å¼ï¼`/api/audit/execute?period=2026-08&reportType=INVEST` + åºè¡¨è®¡æ°æ ¸å¯¹ã |
| | | |
| | | ## 3. ç¨ä¾ä¸ç»æ |
| | | | # | åºæ¯ | 颿 | å®é
| ç»è®º | |
| | | |---|---|---|---|---| |
| | | | 1 | åºå缺失ï¼2026-08 æ investment_system æ°æ®ï¼ï¼éè· 8 æå®¡æ ¸ | I004 ä¸åæ´è¡¨è¯¯æ¥ | ä¿®å¤å 163 æ¡ â ä¿®å¤å 0 æ¡ | â
| |
| | | | 2 | è§åç»è®¡ ruleStatsï¼åºåç¼ºå¤±ï¼ | I001âI004 å skipped=true | 4 æ¡è§åå
¨é¨ skipped=trueï¼hit=0 | â
| |
| | | | 3 | 导å
¥æµè¯åºåï¼7ææ¨¡æ¿â2026-08ï¼148 æ¡ï¼åéè·å®¡æ ¸ | I004 æ¢å¤çå®ç¼ºå¤±æ£æµ | I004=42 æ¡ï¼I001=35ãI002=54ãI003=37ï¼åæåºåæ£å¸¸å¯¹æ¯ï¼ | â
| |
| | | | 4 | æ¸
çæµè¯åºååéè·å®¡æ ¸ | åå° 0 误æ¥ã䏿®çæµè¯æ°æ® | INVEST ç»æ 0 æ¡ï¼investment_system 2026-08 0 è¡ | â
| |
| | | |
| | | ## 4. åç°çé®é¢ä¸å¤ç½® |
| | | - æ æ°å¢ç¼ºé·ãä¿®å¤å 8 æå®¡æ ¸ç»æå·²è¿å为干åç¶æï¼0 æ¡ï¼ï¼çå¾
8 ææèµç³»ç»å¯¼åºæä»¶å¯¼å
¥åéè·å®¡æ ¸å³å¯æ¢å¤å®æ´å¯¹æ¯ã |
| | | |
| | | ## 5. ç»è®º |
| | | - I004 ä¸ I001âI003 è¡ä¸ºä¸è´ï¼åºåæªå°ä½æ¶ä¸è¯¯æ¥ï¼æ è®°è·³è¿ï¼ï¼åºåå°ä½åæ£å¸¸æ£æµãåè½å¯ç¨ï¼å¯äº¤ä»ã |
| | | |
| | | ## 6. æ°æ®è¯´æ |
| | | - æµè¯åºåï¼investment_system 2026-08 148 æ¡ + 导å
¥è®°å½ï¼å·²æ¸
çï¼2026-07 çå®åºåæªå¨ï¼2026-08 å®¡æ ¸ç»æå·²é置为 0 æ¡ã |
| New file |
| | |
| | | # åè½æµè¯æ¥å_æèµå¸å·ææ¥å¤sheetè¯å«ä¸åºå·ç©ºæ ¼_2026-09-02 |
| | | |
| | | ## åè½è¯´æ |
| | | ä¿®å¤ãæèµï¼ç©æµååº/客è¿ç«åºï¼ãå¸å·ææ¥å¯¼å
¥ç 2 个é®é¢ï¼ |
| | | 1. **å¤ sheet é表é误**ï¼`ç¥åæ¶æåºç©æµæèµææ¥2026.08.xlsx` å
± 46 个 sheetï¼å 24 个为åå²"æ½æ±ä¼ å1æ~2021.8"éç sheetï¼å 22 个为ç¥åæ¶çå®ææ¥ `2024.10`â¦`2026.8`ï¼ï¼æ§é»è¾åªç"8æ"åæ ·ï¼è¯¯éåå² sheetãæ½æ±ä¼ å8æãï¼è¯»åºæ½æ±é¡¹ç®å½å±ç¥åæ¶ â 被å¸å·ä¸è´æ§æ ¡éªæç»ï¼å¯¼å
¥å¤±è´¥ï¼ã |
| | | 2. **åºå·ä¸ºç©ºç项ç®è¡è¢«è·³è¿**ï¼çæ°æ® sheet `2026.8` ä¸ãç¥åæ¶ç©æµåã项ç®è¡åºå·åä¸ºç©ºï¼æ§è§£ææç©ºåºå·è¡ä¸å¾å½å¸å·å°èè¡è·³è¿ï¼å¯¼è´ç宿°æ®ä»æªå
¥åºï¼åºéåªæå®¢è¿ãç¥åæ¶æ¢çº½ç«ãï¼æ ãç¥åæ¶ç©æµåãï¼ã |
| | | |
| | | ## ä¿®å¤æ¹æ¡ï¼DataImportService.javaï¼ |
| | | - `investSheetMatchesPeriod`ï¼æ¯æç¹å·æ¥è¡¨æï¼`2026.8`/`2026.08` â å½ä¸å为è¿å符åå¹é
ï¼ã |
| | | - é sheet å åï¼å¹é
æ¥è¡¨æä¸ sheet åå«å¹´ä»½åç¼ï¼`2026`ï¼æ¶é¢å¤ +100000 åï¼ä¼å
é彿ç宿¥è¡¨ï¼åå²çº¯æä»½å sheet æ æ¤å åã |
| | | - è§£æå¾ªç¯ï¼ç©ºåºå·è¡è¥éå¸å·åãä¸ `isLikelyInvestProjectName` 为ç â æé¡¹ç®è¡å¤çï¼éç©ºéæ°ååºå· â è·³è¿ã |
| | | - æ°å¢ helper `isLikelyInvestProjectName`ï¼é¿åº¦>4ãéå¸å·åãé夿³¨/说æ/注ï¼/填表/å®¡æ ¸/ç»è®¡/è´è´£å¼å¤´ã |
| | | - `countInvestRows` åæ¥æ¯æç©ºåºå·é¡¹ç®è¡è®¡æ°ã |
| | | |
| | | ## æµè¯ç¯å¢ |
| | | - å端ï¼traffic-audit-serverï¼Spring Bootï¼8090ï¼ï¼ä»£ç éæ°ç¼è¯åéå¯ï¼11:34 就绪ï¼ã |
| | | - æ°æ®åºï¼MySQL 3308 traffic_auditã |
| | | - æ¥å£ï¼`POST /api/import/batch`ï¼type=investmentLogisticsï¼period=2026-08ï¼ã |
| | | - æµè¯æä»¶ï¼`D:\æ¡é¢\æµè¯æ°æ®\å
«ææºæ°æ®\ç©æµ\ç¥åæ¶æåºç©æµæèµææ¥2026.08.xlsx`ã`æ½æ±2026.08.xlsx`ã |
| | | |
| | | ## ç¨ä¾è¡¨ |
| | | |
| | | | # | ç¨ä¾ | è¾å
¥ | 颿 | å®é
| ç»è®º | |
| | | |---|------|------|------|------|------| |
| | | | 1 | æ£åï¼ç¥åæ¶+æ½æ±ä¸¤æä»¶æ¹é导å
¥ | ç¥åæ¶æåºç©æµæèµææ¥2026.08.xlsx + æ½æ±2026.08.xlsx | total=2, success=2, fail=0 | total=2, success=2, fail=0ï¼ç¥åæ¶æåº 1 æ¡ãæ½æ±å¸ 1 æ¡ | â
éè¿ | |
| | | | 2 | å
¥åºéªè¯ï¼ç¥åæ¶ç©æµåé¡¹ç® | â | investment_project åå¨ãç¥åæ¶ç©æµåãï¼city=ç¥åæ¶æåº | id=228ï¼total_investment=7440.35ï¼city=ç¥åæ¶æåºï¼builder=彿éå¢äº¤æå
¬å¸ | â
éè¿ | |
| | | | 3 | å
¥åºéªè¯ï¼ç¥åæ¶ç©æµå 8 ææåº¦æ°æ® | â | investment_monthly 2026-08 æè®°å½ | year_plan=31ï¼year_cum=26.1ï¼month_done=0ï¼start_cum=7535.45 | â
éè¿ | |
| | | | 4 | å
¥åºéªè¯ï¼æ½æ±æä»¶ä¸åå½±å | â | æ½æ±ä¼ åå
¬è·¯æ¸¯é¡¹ç® 2026-08 æ£å¸¸ | year_plan=12000ï¼year_cum=5173ï¼month_done=1440 | â
éè¿ | |
| | | | 5 | åå对ç
§ï¼æ§ä»£ç è¯¥åºæ¯ | å䏿¹æä»¶ï¼ä¿®å¤å 11:32 è®°å½ï¼ | â | batch#170ï¼success=1, fail=1ï¼æ¥ãæ½æ±ä¼ åå
¬è·¯æ¸¯é¡¹ç®ãå¸å·éä½ | â
ä¿®å¤çæ | |
| | | |
| | | ## åç°çé®é¢ä¸å¤ç½® |
| | | - æ æ°é®é¢ãåå²éç说æï¼`import_batch` #170ï¼11:32:19ï¼ä¸ #168ï¼11:00:56ï¼ä¸ºä¿®å¤åæ§é»è¾ç失败记å½ï¼å±æµè¯å¯¹ç
§ï¼ä¸å½±åæ°æ®ã |
| | | - ä¿®å¤ååºéç¡®å®ç¼ºå¤±ç¥åæ¶ç©æµå 6/7/8 ææ°æ®ï¼ç宿°æ®ä¸ç´æ¼å¯¼ï¼ï¼æ¬æ¬¡å¯¼å
¥å 8 æå·²è¡¥é½ï¼6/7 æå¦é补导ï¼éç¨åé»è¾é导å岿件ã |
| | | |
| | | ## ç»è®º |
| | | å
¨é¨ç¨ä¾éè¿ãå¤ sheet é表ä¼å
彿另年份 sheetã空åºå·é¡¹ç®è¡å¯æ£ç¡®è§£æãå¸å·ä¸è´æ§æ ¡éªä¸å误伤ç¥åæ¶æä»¶ï¼æ½æ±æä»¶è§£æä¸åå½±åã |
| New file |
| | |
| | | # åè½æµè¯æ¥åï¼çææ¨¡æ¿æ°ç弿¹é ï¼2026-09-02ï¼ |
| | | |
| | | > åè½ï¼æç¨æ·æå·¥æ¹å¥½çâæ°çå¼â模æ¿ï¼ä¸ååã1-Næç´¯è®¡ã+ ä¸ååãNæå½æ/åæãï¼è°æ´è´§è¿ãå
¬è·¯æ
客ãåå¸å®¢è¿ä¸ç±»ãçæ_*.xlsxãæ¥è¡¨çå¡«å
é»è¾ã |
| | | > èå´ï¼åªæ¹æ¥è¡¨çæä»£ç ä¸åºç¨¿å¼ç¨ï¼ä¸æ¶åæ°æ®å¯¼å
¥ï¼ä»£ç æªæäº¤ãæªæ¨éã |
| | | |
| | | ## ä¸ãåè½è¯´æï¼ä»£ç æ¹å¨ï¼ |
| | | |
| | | ### 1. å
¬è·¯æ
客 |
| | | - `çæ_ä¸å£å¾åæ.xlsx`ï¼ä¸ååæ é¢ï¼A9ï¼å¨æå为ãYYYYå¹´Mæä¸å£å¾å®¢è¿éåå¨è½¬éãï¼æ°æ®è¡ R11-R15 填彿客è¿é/å¨è½¬éï¼å½æï¼Næç´¯è®¡âN-1æç´¯è®¡ï¼ä¸å½æåæ¯ï¼å æ¯å
¬å¼ D/H ç±æå B$3/F$3 æ¹ä¸ºæå B$11/F$11ï¼å½æåèªèº«ï¼ã |
| | | - `çæ_ä¸å£å¾æå.xlsx`ï¼å³ä¾§å½æå K1 æ é¢å¨æåãYYYYå¹´Mæå
¨çåå¸å·å®æé路客è¿ç产æ
åµãï¼L/P 填彿å¼ãN/R 填彿忝ï¼å·¦ä¾§ä»ä¸º 1-N æç´¯è®¡åã |
| | | |
| | | ### 2. åå¸å®¢è¿ |
| | | - `çæ_åå¸å®¢è¿æ±æ».xlsx`ï¼åºé¨æ°å¢åæåï¼æ é¢ A11ï¼æ°æ®è¡ R13-R19ï¼æ»å®¢è¿é/æ»å¨è½¬éãå
¬äº¤ãåºç§ã巡游åºç§ãç½çº¦è½¦=0ã轨éã轮渡ï¼ï¼å¡«å½æå®æéï¼åæ¯ç空ã |
| | | - `çæ_åå¸å®¢è¿å®¢è¿éåå¸å·ç´¯è®¡.xlsx`ã`çæ_åå¸å®¢è¿åå¸å·æç»è¡¨.xlsx`ï¼å½æåï¼å®¢è¿é R49-R66ãå¨è½¬é R71-R88ï¼æ¹å¡«å½æå¼ï¼å½æç´¯è®¡å·®ï¼ï¼å½æå RANK/å æ¯/å¢éæåå
¬å¼ç±å¤å¶ç´¯è®¡åèæ¥ï¼æ¹æå½æåèªèº«è¡ï¼å½ææ é¢ A45/A67 卿åã |
| | | - åºç¨¿å¼ç¨ä¿®å¤ï¼åå¸å®¢è¿ 6 å¤å·²å é¤çã导å
¥æ¨¡æ¿_åå¸å
¬äº¤/巡游åºç§/轨é轮渡/å叿±æ»/åå¸åå¸å·/åå¸å·æç»è¡¨ãå
¨é¨æ¹åååãçæ_*.xlsxãï¼ReportExportService/Controllerãä¸é®ç³»åå
å
忥ï¼ï¼å端 DataImport.vue åå¸å
¬äº¤/巡游åºç§âä¸è½½æ¨¡æ¿â龿¥åæ¥æ¹æãçæ_*ãã |
| | | |
| | | ### 3. è´§è¿ |
| | | - `çæ_è´§è¿éæå.xlsx`ã`çæ_å¨è½¬éæå.xlsx`ï¼R23 æ é¢å»æâ累计âåæ · âãYYYYå¹´Mæå
¨çåå¸å·å®æå
¬è·¯è´§è¿é/è´§ç©è¿è¾å¨è½¬éæ
åµãã |
| | | - **第äºé¡µæ°æ®æ¹å¡«â彿âå¼ï¼2026-09-02 16:40 确认并å®ç°ï¼**ï¼è´§è¿é第äºé¡µå计=模æ¿_è´§è¿éå¨è½¬é彿åï¼freight_mNï¼ãè§ä¸=H2032 彿å¨/1e4ãè§ä¸=å·®å¼ï¼åæ¯åå»å¹´åæï¼å¨è½¬é第äºé¡µç´æ¥ç¨æå表 MONTH è¡ï¼å«å½æåæ¯å段ï¼ã |
| | | - 第äºé¡µå头âç´¯è®¡å®æ (ä¸å¨/ä¸å¨å
¬éï¼âå¨å¯¼åºæ¶å
åæ¿æ¢ä¸ºâ彿宿âï¼`renameRankMonthHeader`ï¼ä¸æ¹æ¨¡æ¿æºæä»¶ï¼ã |
| | | |
| | | ## äºãæµè¯ç¯å¢ |
| | | - å端 8090 æ¬å°è¿è¡ï¼æ°æ®åº mysql localhost:3308 traffic_auditã |
| | | - æ°æ®ç°ç¶ï¼h2031ï¼å
¬è·¯æ
客ä¼ä¸ææ¥ï¼2026-03/07ï¼city_bus/city_taxi 2026-06/07ï¼h2032 2026-01~08 宿´ã |
| | | - æµè¯æ¥è¡¨æï¼2026-07ï¼mode=monthã产ç©çæ¡£ï¼outputs/report_check/regression_newtpl_2026-07/ |
| | | |
| | | ## ä¸ãç¨ä¾è¡¨ |
| | | |
| | | | # | ç±»å | è¾å
¥ | 颿 | å®é
| ç»è®º | |
| | | |---|---|---|---|---|---| |
| | | | 1 | æ£å | passengerMidAnalysis 2026-07 | ä¸åå=1-7æç´¯è®¡ï¼ä¸åå=7æå½æ | A1=ã2026å¹´1-7æä¸å£å¾â¦ãB3=6151.91 ä¸äººãF3=285634.95ï¼A9=ã2026å¹´7æä¸å£å¾â¦ãB11=3078.86 ä¸äººãF11=141155.32ï¼D12-H15 å æ¯å
¬å¼åæ¯=B$11/F$11 | éè¿ | |
| | | | 2 | æ£å | passengerMidRank 2026-07 | å·¦å累计æ é¢ãå³å彿æ é¢ä¸å½æå¼ | A1=1-7æç´¯è®¡æ é¢ï¼K1=ã2026å¹´7æå
¨çåå¸å·å®æâ¦ãï¼L3=3078.86ï¼å½æï¼ä¸å·¦å B å累计æ°å¼ææ¾åºå | éè¿ | |
| | | | 3 | æ£å | cityPassengerSummary 2026-07 | åºé¨åæå=åºå
2026-07 å计 | A11=ã2026å¹´7æå
¨ç宿åå¸å®¢è¿éæ
åµãï¼B13=30612.85ãD13=218186.08ï¼B14=12974.73ï¼å
¬äº¤ï¼ãB15=5860.24ï¼åºç§ï¼ãB18=11731.83ï¼è½¨éï¼ãB19=46.05ï¼è½®æ¸¡ï¼ï¼ä¸åºå
city_bus/city_taxi 2026-07 å项å计éä½ä¸è´ | éè¿ | |
| | | | 4 | æ£å | cityPassengerCitySum 2026-07 | 彿å=7æå½æãå
¬å¼æå½æè¡ | 彿客è¿éåæ¦æ± R50ï¼G=4218.74ï¼å
¬äº¤ï¼ãL=1093.91ï¼åºç§ï¼ãV=11701.74ï¼è½¨éï¼ãX=46.05ï¼è½®æ¸¡ï¼ãB=17060.44ï¼ä¸ DB 2026-07 ä¸è´ï¼C/H/M/R æåå
¬å¼èå´=B$50:B$66 ç彿è¡ï¼ç´¯è®¡åä¸å½æåæ°å¼åºåææ¾ | éè¿ | |
| | | | 5 | æ£å | freightRank / turnoverRank 2026-07 | R23 æ 颿 â累计âï¼ç¬¬äºé¡µ=å½æå¼ | R23=ã2026å¹´7æâ¦å®æâ¦ãï¼ä¸åå 1-7 累计ä¸åï¼ç¬¬äºé¡µ 2026-07 彿å¼ä¸åºå
é项ä¸è´ï¼è§ç¨ä¾ 11ï¼ | éè¿ | |
| | | | 11 | æ£å | freightRank/turnoverRank 2026-07 彿çï¼äº§åº freightRank_彿ç_2026-07.xlsx / turnoverRank_彿ç_2026-07.xlsxï¼ | 第äºé¡µå½æå¼ä¸ DB ä¸è´ãå头=彿宿 | è´§è¿é第äºé¡µï¼å
¨ç R26 B/G/L=3754.7823/12530.9282/16285.7105ãæ¦æ± R27 B=1227.5499ï¼DB H2032 2026-07 æ¦æ±å计 1227.5499 âï¼ãL=4940.9715ï¼å¨è½¬é第äºé¡µï¼å
¨ç R26=597278.64/1584647.07/2181925.71ãæ¦æ± R27=204809.5633/462751.8106/667561.3739ï¼ä¸ DB scale_split MONTH è¡ä¸è´ï¼B25/G25/L25 å头=â彿宿âï¼æ é误å
¬å¼ | éè¿ | |
| | | | 6 | æ£å | 10 ä¸ªå¯¼åºæ¥å£ï¼å«æªå¨è¡¨çå
¬äº¤/åºç§/轨é轮渡æç»ï¼2026-07 | å
¨é¨å¯åºæ° | å
¨é¨ HTTP 200ï¼å
¨æä»¶é误å
¬å¼æ«æ #REF!/#DIV/0!/#N/A = 0 æ®ç | éè¿ | |
| | | | 7 | è´å | æ æ°æ®æä»½ period=2026-05ï¼citySummary/freightRankï¼ | 䏿¥éã彿åç空 | HTTP 200ï¼ç©ºè¡¨æ£å¸¸çæï¼äº§ç© neg_citySummary_2026-05_nodata.xlsxï¼ | éè¿ | |
| | | | 8 | è´å | å¹´ååæ period=2026-01ï¼freightRankï¼ | 彿å=1ææ°æ® | HTTP 200ï¼äº§ç© neg_freightRank_2026-01.xlsxï¼ | éè¿ | |
| | | | 9 | è¾¹ç | è¶
è崿份 period=2026-13 | ä¸å´©ã软å¤ç | HTTP 200 æ£å¸¸åºæä»¶ | éè¿ï¼å®½æ¾å¤çï¼ | |
| | | | 10 | è´å | éæ³æ¥è¡¨æ period=bad-period | å好æ¥éæ 400 | HTTP 500ï¼æ å
¥åæ ¡éªï¼å端为åºå®ä¸æï¼æ£å¸¸è·¯å¾ä¸å¯è¾¾ï¼ | åç°ç¼ºé·ï¼ä½ä¼å
ï¼ | |
| | | |
| | | ## åãå
¥åºæ½æ¥ï¼ä¸æºåºé项对é½ï¼ |
| | | - åå¸å®¢è¿æ±æ»åºé¨åæåï¼B14/D14ï¼å
¬äº¤ 12974.73 / 87147.68ï¼ãB15/D15ï¼åºç§ 5860.24 / 34236.60ï¼ãB18/D18ï¼è½¨é 11731.83 / 96645.23ï¼ãB19/D19ï¼è½®æ¸¡ 46.05 / 156.57ï¼= SELECT SUM 2026-07 city_bus/city_taxi é项ä¸è´ã |
| | | - åå¸å®¢è¿å½æååå¸å·ï¼æ¦æ± R50 å
¬äº¤ 4218.74ãåºç§ 1093.91 = DB 2026-07 æ¦æ±å¸å计ï¼å
¶ä½ 16 å¸å·å
¬äº¤å¼ä¸ DB éå¸å·ä¸è´ï¼æ½æ¥ G å R50-R66ï¼ã |
| | | - å
¬è·¯æ
客ä¸å£å¾ä¸åå 3078.86 ä¸äºº / 141155.32 ä¸äººå
¬é = 2026-07 彿æºå¼ï¼ç´¯è®¡å·®å£å¾ï¼ä¸æ¢æåå½å£å¾ä¸è´ï¼ã |
| | | |
| | | ## äºãåç°çé®é¢ä¸å¤ç½® |
| | | 1. **è´§è¿ä¸¤å¼ æå表第äºé¡µâ彿âå¡«å
ï¼å·²å®ç°å¹¶éªè¯ï¼2026-09-02 16:40ï¼**ï¼ä¸å¡ç¡®è®¤ç¬¬äºé¡µè¦å½æå¼åï¼å·²å®ç°å½æå¡«å
ï¼è´§è¿éï¼è§ä¸=H2032 彿/å计=模æ¿å½æå/è§ä¸=å·®å¼ï¼å¨è½¬éï¼æå表 MONTH è¡ï¼ï¼å¹¶æç¬¬äºé¡µå头å
åæ¿æ¢ä¸ºâ彿宿âã2026-07 åå½ä¸ DB é项ä¸è´ãæ é误å
¬å¼ãæ¨¡æ¿æºæä»¶ï¼docs/è´§è¿/çæ_*.xlsxï¼æ¬èº«ä»åâç´¯è®¡å®æâåæ ·ï¼å¦éæºæä»¶ä¸å¹¶æ¹å¯å¨ Excel ä¸å¦åï¼ç¨åºå¯¼åºå·²èªå¨æ¾ç¤ºä¸ºâ彿宿âï¼ã |
| | | 2. **åå¸å®¢è¿å½æå Q å表头æ§ä¹ï¼å¾
ä¸å¡ç¡®è®¤ï¼**ï¼å½æå®¢è¿éåè¡¨å¤´è¡ 48 Q ååâå
¶ä¸ï¼åºç§âã彿å¨è½¬éåè¡¨å¤´è¡ 70 Q ååâå
¶ä¸ï¼ç½çº¦è½¦âï¼ç¨åºæâç½çº¦è½¦=0 ç空âå¡«å
ï¼é确认ä¸å¡å£å¾ï¼å·²è®°å
¥å¾
确认æ¸
åï¼ã |
| | | 3. **å¢é/å¢éæåå**ï¼E/J/O/T/W/Y æ å»å¹´åææ°æ®æ¶ç空ï¼å
¶æåå
¬å¼ï¼F/K/P/U çï¼ä¿çï¼æ å»å¹´æ°æ®æ¶æåæ ä¸å¡æä¹ï¼å¾
模æ¿å£å¾ç¡®è®¤åå³å®æ¯å¦æ´åæ¸
空ã |
| | | 4. **éæ³ period è¿å 500**ï¼æ¥è¡¨åæ°æªåæ ¼å¼æ ¡éªï¼å端åºå®ä¸æä¸å¯è¾¾ï¼ä½ä¼å
级ï¼å»ºè®®åç»ç»ä¸è¡¥ã |
| | | |
| | | ## å
ãç»è®º |
| | | - å
¬è·¯æ
客ãåå¸å®¢è¿æ°ç弿¹é å·²è½å°ï¼ä¸åâ累计â+ä¸åâ彿âååç»ææ£ç¡®ãå
¬å¼èå´æ£ç¡®ãæ°å¼ä¸åºå
2026-07 æ°æ®é项对é½ï¼æ é误å
¬å¼æ®ç â å¯ç¨ã |
| | | - è´§è¿ä¸¤å¼ æå表第äºé¡µâ彿âå¡«å
å·²å®ç°å¹¶éè¿ 2026-07 åå½ï¼ä¸åºå
H2032 / freight_turnover_import / scale_split MONTH è¡é项ä¸è´ï¼ã |
| | | |
| New file |
| | |
| | | # åè½æµè¯æ¥å_è¿æ¿è½¦è¾ä¸è½¨è¿¹éç¨å¯¼å
¥åå½_2026-09-02 |
| | | |
| | | ## åè½è¯´æ |
| | | åå½ãè¿æ¿è½¦è¾ãã轨迹éç¨ã导å
¥åè½ï¼è§£ææ¹å¼å·²äº 09-02 æ¹ä¸º"表头åç§°æ å°"ï¼å顺åºååä¹è½æ£ç¡®å¯¼å
¥ï¼ãç¨ docs éç 7 ææ°æ®æä»¶æµè¯ 2026-08 æ¥è¡¨æï¼éªè¯æ£å导å
¥ãå
¥åºå¯¹é½ãåä¹±åºãéç±»åè´åçåºæ¯ã |
| | | |
| | | ## æµè¯ç¯å¢ |
| | | - å端ï¼traffic-audit-serverï¼Spring Bootï¼8090ï¼ï¼13:21 éå¯å°±ç»ªã |
| | | - æ°æ®åºï¼MySQL 3308 traffic_auditã |
| | | - æ¥å£ï¼`POST /api/import/transportAuth`ï¼è¿æ¿è½¦è¾ï¼ã`POST /api/import/trackMileage`ï¼è½¨è¿¹éç¨ï¼ã |
| | | - æµè¯æä»¶ï¼docs å
ç宿°æ®å¿«ç
§ï¼ï¼ |
| | | - `docs/è´§è¿/模æ¿_è¿æ¿è½¦è¾.xlsx`ï¼è¡¨å¤´ï¼ä¼ä¸åç§°/æ»çµå¼è½¦æ°/æ»æè½¦æ°/å
¶å®è½¦è¾æ°/æè½¦æ»å¨ä½(å¨)/å
¶å®è½¦è¾æ»å¨ä½(å¨)ï¼635 è¡æ°æ®ï¼ |
| | | - `docs/è´§è¿/模æ¿_轨迹éç¨.xlsx`ï¼è¡¨å¤´ï¼åºå·/ä¼ä¸åç§°/æåº¦æ»éç¨(å
¬é)/æéç¨çè½¦è¾æ°ï¼628 è¡æ°æ®ï¼ |
| | | |
| | | ## ç¨ä¾è¡¨ |
| | | |
| | | | # | ç¨ä¾ | è¾å
¥ | 颿 | å®é
| ç»è®º | |
| | | |---|------|------|------|------|------| |
| | | | 1 | æ£åï¼è¿æ¿è½¦è¾å¯¼å
¥ | 模æ¿_è¿æ¿è½¦è¾.xlsx â transportAuth, period=2026-08 | æå 635 æ¡ | 635 æ¡æåï¼0 失败 | â
éè¿ | |
| | | | 2 | æ£åï¼è½¨è¿¹éç¨å¯¼å
¥ | 模æ¿_轨迹éç¨.xlsx â trackMileage, period=2026-08 | æå 628 æ¡ | 628 æ¡æåï¼0 失败 | â
éè¿ | |
| | | | 3 | å
¥åºå¯¹é½ï¼è¿æ¿ï¼ | æ½æ¥åºä¸ 2026-08 è®°å½ | 䏿ºæä»¶é项ä¸è´ | å®åæ±½è½¦ç©æµ 0/96/96/1057.708/871.56 çå 3 å®¶ä¸è´ | â
éè¿ | |
| | | | 4 | å
¥åºå¯¹é½ï¼è½¨è¿¹ï¼ | æ½æ¥åºä¸ 2026-08 è®°å½ | 䏿ºæä»¶é项ä¸è´ | æ¹åä¸åè¿è¾ 150427.03/29 çå 3 å®¶ä¸è´ | â
éè¿ | |
| | | | 5 | åä¹±åºä»å¯å¯¼å
¥ï¼è¿æ¿ï¼ | æä¹± 6 å顺åºç坿¬ â transportAuth | 635 æ¡æåï¼æ°å¼ä¸éä½ | 635 æ¡æåï¼æ½æ¥å¼ä¸æºæä»¶ä¸è´ï¼å¹çå
å åæï¼ | â
éè¿ | |
| | | | 6 | åä¹±åºä»å¯å¯¼å
¥ï¼è½¨è¿¹ï¼ | æä¹±å¹¶å»æåºå·åç坿¬ â trackMileage | 628 æ¡æåï¼æ°å¼ä¸éä½ | 628 æ¡æåï¼æ½æ¥å¼ä¸æºæä»¶ä¸è´ | â
éè¿ | |
| | | | 7 | è´åï¼éç±»åæä»¶ | è¿æ¿æä»¶è° trackMileage | æç¡®æ¥éãååºç¼ºå | æ¥"表头缺å°å¿
éåãæåº¦æ»éç¨(å
¬é)ããæéç¨çè½¦è¾æ°ãï¼è¯·ç¡®è®¤æ¯å¦ééäºæ°æ®ç±»å"ï¼æªè¯¯å æ°æ® | â
éè¿ | |
| | | | 8 | è´åï¼éç±»åæä»¶ | 轨迹æä»¶è° transportAuth | æç¡®æ¥éãååºç¼ºå | æ¥"表头缺å°å¿
éåãæ»çµå¼è½¦æ°ãâ¦"ï¼æªè¯¯å æ°æ® | â
éè¿ | |
| | | |
| | | ## åç°çé®é¢ä¸å¤ç½® |
| | | - æ æ°å¢é®é¢ã说æï¼æµè¯ç¨ 7 ææ°æ®å¯¼å
¥äº 2026-08 æ¥è¡¨æï¼transport_auth_vehicle / vehicle_track_mileage ç 2026-08 = 635/628 æ¡ï¼ï¼å±åè½æµè¯æ°æ®ï¼å·²åç¥ç¨æ·ï¼å¦éæ¸
çå¯å é¤å¯¹åºæ¥è¡¨æè®°å½ã |
| | | - 宿¹è½èæ ¼å¼ï¼15 å/ç»ï¼å¦ `é路货è¿è½¦è¾è½æºæ¶èæ
åµï¼2026ï¼2å£åº¦.xls`ï¼æç¨æ·ç¡®è®¤ç"ç³»ç»æ¨¡æ¿æ ¼å¼"å£å¾ï¼ä¸å®ç°å®æ¹æ ¼å¼ç´è¯»ï¼å¯¼å
¥æ¶ç±è¡¨å¤´å使 ¡éªæç»å¹¶æç¤º"请使ç¨ç³»ç»æ¨¡æ¿ã模æ¿_é路货è¿è½¦è¾è½æºæ¶èæ
åµï¼2026ï¼.xlsxãæ´çåå导å
¥"ï¼å®æµæ¥ï¼ç¬¬ 22 ååºä¸ºã车çå·ãï¼å®é
为ãâ¡åºå年份ï¼å¹´ï¼ãï¼ã |
| | | - 顺带补导ï¼`docs/æèµ/è¾å
¥/ç©æµï¼ç©æµååºï¼/6æ/æåºç©æµæèµææ¥2026.06.xlsx`ã`7æ/æåºç©æµæèµææ¥2026.07.24.xlsx` 导å
¥ 2026-06/2026-07 å 1 æ¡æåï¼ç¥åæ¶ç©æµå 6/7/8 ææ°æ®è¡¥å
¨ï¼ä¸éªè¯å¤ sheet ä¿®å¤å¯¹ 6/7 ææä»¶åæ ·çæï¼7 ææä»¶å« `2026.6` ä¸ `2026.7` 两个 sheetï¼æ£ç¡®éä¸ `2026.7`ï¼ã |
| | | |
| | | ## ç»è®º |
| | | å
¨é¨ç¨ä¾éè¿ãè¿æ¿è½¦è¾/轨迹éç¨æè¡¨å¤´åç§°æ å°è§£ææ£å¸¸ï¼å顺åºååä¸éä½ï¼éç±»åæä»¶æç¡®æ¥éä¸è¯¯å æ°æ®ï¼å®æ¹è½èæ"ç³»ç»æ¨¡æ¿æ ¼å¼"å£å¾æç»å¹¶æç¤ºæ´çã |
| New file |
| | |
| | | # 导å
¥ä¸çææ¨¡å使£é®é¢æ¸
åï¼2026-09-02ï¼ |
| | | |
| | | > æ¹å¼ï¼éæä»£ç å®¡æ¥ + æ°æ®åºåªè¯»æ ¸å¯¹ï¼æªå¨æ¨¡æ¿ãæªéå¯å端ï¼ãæ¨¡æ¿æä»¶æ£å¨ç±å¦ä¸ä¼è¯ä¿®æ¹ï¼æ¶å模æ¿èå¨çé®é¢æ 注ãåä½ãã |
| | | > ç¶æå«ä¹ï¼P0=ä¼é æå¯¼åº/导å
¥ç´æ¥å¤±è´¥ææ°æ®éé»é误ï¼P1=è¿åéæ±ï¼è¡å·æç¤º/å¯è¿½æº¯ï¼æå¯¼è´æ¥è¡¨å
容æ®ç¼ºï¼P2=ä½éª/ä¸è´æ§/æ½å¨è¯¯å ã |
| | | |
| | | ## ä¸ãP0ï¼ä¼ç´æ¥æææ°æ®éé»éï¼ |
| | | |
| | | ### 1.ãåä½ãåå¸å®¢è¿ 6 å¼ å¯¼åºçæ¨¡æ¿æä»¶å·²è¢«å é¤ï¼ä»£ç å¼ç¨æªåæ¥ |
| | | - è¯æ®ï¼`docs/åå¸å®¢è¿/导å
¥æ¨¡æ¿_åå¸å
¬äº¤.xlsx`ã`导å
¥æ¨¡æ¿_巡游åºç§.xlsx`ã`导å
¥æ¨¡æ¿_轨éã轮渡.xlsx`ã`导å
¥æ¨¡æ¿_åå¸åå¸å·.xlsx`ã`导å
¥æ¨¡æ¿_åå¸å®¢è¿åå¸å·æç»è¡¨.xlsx`ã`导å
¥æ¨¡æ¿_å叿±æ».xlsx` 已被å¦ä¸ä¼è¯å é¤ï¼git æ¾ç¤º Dï¼ï¼æ¢æ `çæ_*.xlsx` ç³»åã |
| | | - å½±åï¼`ReportExportService.java` ä»ç¡¬ç¼ç 读åä¸è¿° 6 个æä»¶åï¼`resolveTemplate("docs/åå¸å®¢è¿")`ï¼ï¼æä»¶ä¸å卿¶å¯¼åºæâæªæ¾å°æ¨¡æ¿æä»¶ââ cityBusDetail/cityTaxiDetail/cityRailFerryDetail/cityPassengerCitySum/cityPassengerDetailSum/cityPassengerSummary éå¯åå¿
500ã |
| | | - å¤ç½®ï¼æ¨¡æ¿ä¼è¯å®ç¨¿æ¶æä»£ç å¼ç¨åæ¥ä¸ºæ°ç `çæ_*.xlsx`ï¼ææ¢å¤æ§æä»¶ï¼ï¼æ¬ä¼è¯ä¸é夿¹ï¼å®ç¨¿åè· v2 åå½ã |
| | | |
| | | ### 2. æ°å¼è§£æéæ³ææ¬éé»ç½® 0ï¼getDecimal/getIntï¼ |
| | | - è¯æ®ï¼`DataImportService.getDecimal()` æè· `NumberFormatException` åè¿å `0.0`ï¼`getInt()` åå intValueãè¿æ¿è½¦è¾/轨迹éç¨/è§ä¸è§ä¸/è´§è¿éå¨è½¬éç大éèµ° `gd()/gi()`ã |
| | | - å½±åï¼æºæä»¶ææ ¼ä¸ºéæ°åææ¬ï¼å¦âæªå¡«ââââï¼æ¶ä¸æ¥éãæ è¡å·ï¼ç´æ¥å
¥åº 0ï¼success ç
§è®¡ â æ¥è¡¨æ°åææéï¼è¿èâ导å
¥å¤±è´¥æ¾ç¤ºè¡å·âçè¦æ±ã |
| | | - å¤ç½®å»ºè®®ï¼é空ä¸éæ°åçåå
æ ¼æâå¤±è´¥è¡ + è¡å· + åå âè®°å½ï¼ä¸ H2032/H204 ç failDetails ä¸è´ï¼ï¼è䏿¯éé» 0ã |
| | | |
| | | ## äºãP1 |
| | | |
| | | ### 3. 6 类导å
¥å¤±è´¥ä¸è®°è¡å·/åå ï¼errorDetail=nullï¼ |
| | | - èå´ï¼TRANSPORT_AUTHãTRACK_MILEAGEãSCALE_SPLITãFREIGHT_TURNOVERãINVEST_SYSTEMãCITY_TAXI_AUTHã |
| | | - è¯æ®ï¼`recordBatch(..., null)`ï¼å¤±è´¥ä»
卿å
¥ try/catch ä¸ `failRows++`ã |
| | | - å½±åï¼é¡µé¢â导å
¥ç»æâåªè½çå°â失败 N æ¡âï¼æ 失败ä½ç½®/åå ï¼å端å
åºæ¾ç¤ºâè¯¥æ¹æ¬¡æ 失败æç»âï¼ã |
| | | - å¤ç½®å»ºè®®ï¼ä¸ H2032/H2031/H204 对é½ï¼æ¶éè¡å·+ä¼ä¸å/车ç+åå ï¼CITY_TAXI_AUTH 42636 è¡åæ¹æå
¥å°¤å
¶éè¦è¡çº§å¤±è´¥æ¶éã |
| | | |
| | | ### 4. import_batch_id 仿ªåå¡«ï¼æ¹æ¬¡ä¸ä¸å¡æ°æ®æé¾ï¼ |
| | | - è¯æ®ï¼`freight_turnover_import` 18/18ã`scale_split_transport` 36/36ã`h2032_enterprise_monthly` 2026 å¹´ 5088/5088 è¡ `import_batch_id` å
¨ NULLï¼ä»£ç 䏿 ä»»ä½ `setImportBatchId` è°ç¨ã |
| | | - å½±åï¼æ æ³åçâè¿æ¹æ°æ®æ¥èªåªä¸ªæä»¶/åªæ¬¡å¯¼å
¥âï¼æ æ³ææ¹æ¬¡è¿½æº¯ä¸åæ»ï¼æ¥è¡¨æ ¸å¯¹åªè½é import_type+report_period é´æ¥çã |
| | | - å¤ç½®å»ºè®®ï¼`recordBatch()` è¿åæ¹æ¬¡ idï¼å¯¼å
¥æ¹æ³ææåå¡«å°ä¸å¡è¡¨ï¼è¡¨ç»æå·²å
·å¤è¯¥åï¼ã |
| | | |
| | | ### 5. æåº¦/åºææ°æ®ç¼ºå£ï¼å³å®æ¥è¡¨å®æ´åº¦ï¼é代ç 缺é·ï¼ |
| | | - è¯æ®ï¼`city_bus_monthly`/`city_taxi_monthly` ä»
2026-06ã07ï¼142/17 è¡ï¼ï¼`h2031_enterprise_monthly` ä»
2026-03ã07ï¼778/771ï¼ï¼2025 åºæå
¨åºæ åå¸å®¢è¿/å
¬è·¯æ
客æåº¦æ°æ®ã |
| | | - å½±åï¼åå¸å®¢è¿ 1-5 æå空ã忝åå
¨ç©ºï¼å»å¹´åºæç¼ºå¤±ï¼ï¼`#REF!` 忝å
¬å¼åªè½è¢«âæ¸
空âå¤çï¼ä¸å£å¾/å
¬è·¯æ
客æ¥è¡¨å¤æ°æä»½æ æ°æ®ãå
è¡¥æ°æ®ï¼æ¥è¡¨æææä¹ã |
| | | - å¤ç½®ï¼åå¸å®¢è¿æåº¦ï¼U203/U402ï¼ä¸è½¨é/轮渡 2026 å¹´ 1-5 æã8 æâ¦ææºæä»¶è¡¥å¯¼ï¼å
¬è·¯æ
客 H2031 è¡¥ 1/2/4/5/6/8 æï¼å»å¹´åæï¼2025 æ 2025 åæï¼æ°æ®è¡¥å¯¼å忝èªå¨æå¼ï¼éç¡®è®¤è¡¨ç»ææ¯æå»å¹´åï¼ã |
| | | |
| | | ## ä¸ãP2 |
| | | |
| | | ### 6. å端â导å
¥è¿åº¦âæè¯¯æ¾ç¤ºâæ æ°æ®âï¼å¤§æä»¶æ 宿¶è¿åº¦ |
| | | - è¯æ®ï¼`DataImport.vue loadData()` ç overview å**æ¯ä¸ªç±»åææ°ä¸æ¡æ¹æ¬¡**ï¼ç©ºæ¹æ¬¡ï¼0 è¡ï¼#177-179/#186 çï¼ä¼è¦çæ¾ç¤ºä¸ºâæ æ°æ®âï¼æ¹æ¬¡è¡¨åªå±ç¤º 50 æ¡ãæ å页ï¼åæä»¶å¯¼å
¥ä»
`status='uploading'`ï¼æ ç¾åæ¯ï¼42636 è¡ 20-40 ç§å
¨ç¨æ åé¦ï¼ä½æâ塿»/æ è¿åº¦âï¼ã |
| | | - å¤ç½®å»ºè®®ï¼â overview ç»è®¡æ¹ä¸ºâåç±»åæè¿ä¸æ¬¡ total>0 çæ¹æ¬¡âæå计ï¼â¡ æ¹æ¬¡å表å页ï¼â¢ 大æä»¶ç»é¶æ®µæç¤ºæè½®è¯¢è¿åº¦ï¼â£ è§£æå° 0 è¡çæä»¶æç¡®æç¤ºâæä»¶æ æææ°æ®è¡âèééé»æåæ¹æ¬¡ã |
| | | |
| | | ### 7. å端âå¹´æ¥âåç» 11 个类åå端æ å®ç° |
| | | - è¯æ®ï¼`DataImport.vue groups` å« annualCompanyBasic/annualEnterpriseFinance/⦠11 项ï¼å端 `DataImportService` switch ä¸ Controller åæ annual* æ¯æã |
| | | - å¤ç½®ï¼è¦ä¹ä»é¡µé¢ç§»é¤/ç¦ç¨ï¼æªå¼æ¾ï¼ï¼è¦ä¹è¡¥å®ç°ï¼å¦åç¨æ·ç¹å»å³â䏿¯æç导å
¥ç±»åâã |
| | | |
| | | ### 8. è¿æ¿è½¦è¾/轨迹éç¨å¹çå é¤å®¡æ ¸ç»æèå´è¿å®½ï¼æ½å¨è¯¯å ï¼ |
| | | - è¯æ®ï¼`importTransportAuth/importTrackMileage` å¹çå¤ç´æ¥ `auditResultMapper.delete(reportPeriod=period)`ï¼æªæè§å reportType è¿æ»¤ï¼ï¼å
¶å®ç±»ååèµ° `deleteRuleResults(ç±»å,period)`ã |
| | | - å½±åï¼åæ¥è¡¨æè¥å
¶å®ç±»åå·²å®æå®¡æ ¸ï¼åå¯¼è¿æ¿è½¦è¾ä¼è¿å¸¦æ¸
æå½æå
¶å®ç±»åå®¡æ ¸ç»æï¼å½åå¤ä¸ºæµè¯æå½±åå°ï¼ã |
| | | - å¤ç½®å»ºè®®ï¼ä¸å
¶å®ç±»åç»ä¸ä¸ºæ reportType çè§å id å é¤ã |
| | | |
| | | ### 9. çæä¾§æ¨¡æ¿èå¨é£é©ç¹ï¼ä¾æ¨¡æ¿ä¼è¯å¯¹ç
§ï¼å¿éæ¼ï¼ |
| | | - æå模æ¿ï¼æ é¢åæ» `row0/row22`ãæ°æ®åä» `row3/row25` èµ·ï¼freightRank/turnoverRankï¼â å¢å è¡ä¼éä½ã |
| | | - è´§è¿åå¸å·æç»ï¼æ°æ®åºä» 0-based row4 èµ·ï¼æâç 6 ææ + 17 å¸å·Ã6 ææ âè¿ç»å 108 è¡ã |
| | | - è½èæ±æ»ï¼å
éåºç¡ sheet åæ 0-based row2..7 å 6 ç§çæï¼æ´æ²¹/汽油/â¦/çæçµæ± ï¼ï¼D/J/L/M 为å
¬å¼åä¸å¨ã |
| | | - ä¸å£å¾æç»ï¼Sheet1 æ è¡ 5..94/99..188 äºæ®µå¼å®ä½ï¼Sheet2 å»å¹´æç»é¡µæ®ç #REF! é鿍¡æ¿ä¿®æ£éæ°ç¡®è®¤ã |
| | | - åå¸å®¢è¿ï¼æ°æ®åº â¥75 è¡å®å«ï¼è¡¨å¤´æä»½âå°åºâè¡å®ä½ï¼å 20 è¡ï¼ï¼å»å¹´åä» 19 èµ·æ¯ 2 åã |
| | | - å
¬å¼å¤ç½®çº¦å®ï¼è·¨ç°¿/跨表æ±ä¸åºå¼çå
¬å¼åªæ¸
ç©ºç»æï¼ä¸å å
¬å¼ææ¬ã䏿¹ååï¼ââæ¨¡æ¿è¥æ #REF! æ¹ä¸ºçå®å¼ç¨ï¼éåæ¥ç¡®è®¤ä»£ç åçåä½ç½®ä¸è´ã |
| | | |
| | | ## åãç»è®º |
| | | - 仿¥å·²éªè¯ç导å
¥ä¸é¾ä¸ 22 æ¥è¡¨ç»è®ºä»ææï¼ä½**åå¸å®¢è¿ 6 å¼ å¯¼åºä¾èµçæ¨¡æ¿æä»¶å·²ä¸å¨**ï¼æ¨¡æ¿ä¼è¯å®ç¨¿åå¿
é¡»åå¼ç¨åæ¥ + v2 åå½ï¼èæ¬å·²çæ¡£ outputs/report_checkï¼ã |
| | | - 代ç å±ä¼å
ä¿®ï¼éæ³æ°å¼éé» 0ï¼P0-2ï¼ã失败è¡å·è¡¥é½ï¼P1-3ï¼ãæ¹æ¬¡ id åå¡«ï¼P1-4ï¼ãè¿æ¿/è½¨è¿¹å®¡æ ¸ç»æè¯¯å èå´ï¼P2-8ï¼ã |
| | | - æ°æ®å±ä¼å
è¡¥ï¼åå¸å®¢è¿ 1-5 æä¸å
¬è·¯æ
客缺æã2025 åºæï¼P1-5ï¼ââè¿æ¯æ¥è¡¨âæå空/åæ¯ç©ºâçæ ¹å ã |
| | | - å端ä½éªï¼è¿åº¦å±ç¤ºï¼P2-6ï¼ãå¹´æ¥å
¥å£ï¼P2-7ï¼ã |
| New file |
| | |
| | | # 导å
¥åè½ä½æ£æ¥åï¼2026-09-02 å¼å§ï¼ |
| | | |
| | | > ç®çï¼éç±»åéªè¯"è§£æå¨åä½ â 宿¹æ¨¡æ¿ â 宿µå¯¼å
¥æ°æ®"ä¸è
ä¸è´ï¼æ¶é¤"å
¶ä»ç±»åä¼ä¸ä¼åè½è䏿 ·åºé®é¢"ççèã |
| | | > æ¹æ³ï¼â éæå¯¹æ¯è§£æå¨åä½ä¸å®æ¹æ¨¡æ¿è¡¨å¤´ â â¡ç¨ç宿¨¡æ¿æä»¶å®æµå¯¼å
¥ï¼æµè¯æ¥è¡¨æï¼â â¢æ½æ¥å
¥åºæ°æ®ä¸æºæä»¶éé¡¹å¯¹é½ â â£è®°å½ç¼ºå£ã |
| | | |
| | | ## ç»è®ºæ»è§ |
| | | |
| | | | ç±»å | è§£ææ¹å¼ | 宿µ | ç»è®º | é£é©ç¹ | |
| | | |---|---|---|---|---| |
| | | | è½è H204 壿¥ | åºå®åä½(18å/ç») | 7/8/9æå1284æ¡ 0失败 | â
已修å¤+å使 ¡éª | 宿¹æ ¼å¼(15å/ç»)æä¸æ¯æï¼éè½¬æ¨¡æ¿ | |
| | | | æèµï¼å®¢è¿ç«åº/ç©æµååºï¼ | åºå®åä½+å¸å·æ ¡éª | 6/7æç宿件ï¼å®¢è¿46+ç©æµ133ãåºå148ï¼ | â
åå²ä¼è¯å·²å¤§é宿µ | å表"å
¨çæ±æ»å¤§è¡¨"è·¯å¾å¾
夿 ¸ | |
| | | | åå¸å
¬äº¤ U203 | åºå®åä½(0-67) | 2026-04ï¼142æ¡ 0失败ï¼éä½æä»¶è¢«æ | â
å·²å å使 ¡éª | å顺åºåå䏿¯æï¼æç»èé导éï¼ | |
| | | | 巡游åºç§ U402 | åºå®åä½(0-40) | 2026-04ï¼17æ¡ 0失败ï¼éä½æä»¶è¢«æ | â
å·²å å使 ¡éª | åä¸ | |
| | | | H2032 è´§è¿ææ¥ | 表头åç§°æ å° | 18个æä¸è´æ§æ ¸å¯¹éè¿ | â
å®å
¨ | â | |
| | | | å
¬è·¯æ
å®¢ææ¥ H2031 | 表头åç§°æ å° | 7æè¡¥å¯¼å
¥46æ¡ | â
å®å
¨ | â | |
| | | | è¿æ¿è½¦è¾ | 表头åç§°æ å°ï¼æ¬æ¬¡æ¹é ï¼ | 模æ¿2è¡â
ååºæä¹±â
ç¼ºåæ¥éâ
| â
ä¸è´§è¿ææ¥åæ¹å¼ | 建议çå®å¤§æä»¶åå½ | |
| | | | 轨迹éç¨ | 表头åç§°æ å°ï¼æ¬æ¬¡æ¹é ï¼ | 模æ¿2è¡â
ååºæä¹±â
ç¼ºåæ¥éâ
| â
ä¸è´§è¿ææ¥åæ¹å¼ | åä¸ | |
| | | | æèµç³»ç»å¯¼åº | åºå®åä½(8å) | è¡¨å¤´æ ¡éªæ£/è´ç¨ä¾éè¿ | â
å·²å å使 ¡éª | åä½åºå®ï¼éä½æç» | |
| | | | è´§è¿éå¨è½¬é | ç¹æ®å¸å±(å¸å·è¡+å·¦å³å¹´æ®µ) | 2026-06ï¼18æ¡ 0失败ï¼éç±»åæä»¶è¢«æ | â
å·²è¡¥è¡¨å¤´æ ¡éª | åæ°éæä»½ååï¼é é¦åå¸å·+表头è¯å« | |
| | | | è§ä¸è§ä¸æå | ç¹æ®å¸å±(sheetå+å表头) | 2026-06ï¼36æ¡ 0失败ï¼éå¸å±è¢«æ | â
已补sheetå¸å±æ ¡éª | ä¾èµsheetåå« å½æ/累计 | |
| | | | å
¬è·¯æ
å®¢è¿æ¿è½¦è¾æ° | 表头åç§°æ å° | 2026-06ï¼767æ¡ 0失败 | â
| â | |
| | | | 个ä½å®¢è¿é | 表头åç§°æ å° | 表头è¯å«éè¿ï¼æ¨¡æ¿ä»
è¡¨å¤´ï¼ | â
| â | |
| | | | åºç§è½¦è¿æ¿è½¦è¾ | åºå®åä½(0-20) | 表头è¯å«éè¿ï¼æ¨¡æ¿ä»
è¡¨å¤´ï¼ | â
å·²æè½¦çå
³é®åæ ¡éª | çå®4.2ä¸è¡å»ºè®®åå½ | |
| | | |
| | | ## å·²æµæç» |
| | | |
| | | ### åå¸å
¬äº¤ï¼U203 交ä¼ç» 2026å¹´7ææä»¶ï¼ |
| | | - 导å
¥æµè¯æ¥è¡¨æ 2026-04ï¼æå 142 æ¡ï¼å¤±è´¥ 0 æ¡ã |
| | | - æ½æ¥ï¼æ¦æ±ä¸¤æ±è½®æ¸¡æé责任å
¬å¸ â è¿è¥è½¦æ° 0 / 客è¿é 0 / 填表人 ä½ç£ / çµè¯ 15802725070ï¼ä¸æºæä»¶é项ä¸è´ â
|
| | | |
| | | ### 巡游åºç§ï¼U402 交è¡ç» 2026æä»¶ï¼ |
| | | - 导å
¥æµè¯æ¥è¡¨æ 2026-04ï¼æå 17 æ¡ï¼å¤±è´¥ 0 æ¡ã |
| | | - æ½æ¥ï¼æ¦æ±å¸ â 载客车次 729.27 / 客è¿é 1093.91 / 填表人 忬 / çµè¯ 02768820261ï¼ä¸æºæä»¶ä¸è´ â
|
| | | |
| | | ### è¿æ¿è½¦è¾ï¼docs/è´§è¿/模æ¿_è¿æ¿è½¦è¾.xlsxï¼ |
| | | - æ¬æ¬¡å·²ä»"åºå®åä½"æ¹ä¸º"表头åç§°æ å°"ï¼ä¸ H2032 è´§è¿ææ¥ä¸è´ï¼ï¼å¿
é 6 åï¼ä¼ä¸åç§°/æ»çµå¼è½¦æ°/æ»æè½¦æ°/å
¶å®è½¦è¾æ°/æè½¦æ»å¨ä½(å¨)/å
¶å®è½¦è¾æ»å¨ä½(å¨)ã |
| | | - 宿µï¼æµè¯æ¥è¡¨æ 2026-HTï¼æµåå·²æ¸
çï¼ï¼æ¨¡æ¿å 2 è¡å¯¼å
¥æå 2 æ¡ï¼**åé¡ºåºæä¹±å仿å导å
¥ 2 æ¡**ï¼å
¥åºåæ®µä¸æ¨¡æ¿é项ä¸è´ï¼å®åæ±½è½¦ç©æµï¼çµå¼ 0/æ 96/å
¶å® 96/æè½¦å¨ä½ 1057.708/å
¶å®å¨ä½ 871.56ï¼ï¼å é¤ãæè½¦æ»å¨ä½(å¨)ãå â æ¥"表头缺å°å¿
éå"ã |
| | | |
| | | ### 轨迹éç¨ï¼docs/è´§è¿/模æ¿_轨迹éç¨.xlsxï¼ |
| | | - æ¬æ¬¡å·²ä»"åºå®åä½"æ¹ä¸º"表头åç§°æ å°"ï¼å¿
é 3 åï¼ä¼ä¸åç§°/æåº¦æ»éç¨(å
¬é)/æéç¨çè½¦è¾æ°ã |
| | | - 宿µï¼æ¨¡æ¿å 2 è¡å¯¼å
¥æå 2 æ¡ï¼åé¡ºåºæä¹±å仿å 2 æ¡ï¼å
¥åºä¸è´ï¼æ¹åä¸åè¿è¾ï¼150427.03/29ï¼ï¼ååæ¹ãæåº¦éç¨(å
¬é)ãâ æ¥"表头缺å°å¿
éå"ã |
| | | |
| | | ### åºå®å使¨¡å"å使 ¡éª"è´åç¨ä¾ï¼2026-09-02ï¼ |
| | | - åå¸å
¬äº¤ï¼è¡¨å¤´ç¬¬ 6 åæãéä½åãâ æç»ï¼"第 6 ååºä¸ºãå
Œ
±æ±½çµè½¦_è¿è¥è½¦æ°ãï¼å®é
为ãéä½åã"ã |
| | | - 巡游åºç§ï¼è¡¨å¤´ç¬¬ 5 åæãéä½åãâ æç»ï¼"第 5 ååºä¸ºãè½½å®¢è½¦æ¬¡æ»æ°ãï¼å®é
为ãéä½åã"ã |
| | | - æèµç³»ç»å¯¼åºï¼ç¬¬ 1 åãè¡å·ãæ¹ãåºå·ãâ æç»ï¼"第 1 ååºä¸ºãè¡å·ãï¼å®é
为ãåºå·ã"ã |
| | | |
| | | ### è´§è¿éå¨è½¬é / è§ä¸è§ä¸æåï¼docs/è´§è¿ï¼æµè¯æ 2026-06ï¼æµåå·²æ¸
çï¼ |
| | | - è´§è¿éå¨è½¬éï¼18 æ¡ 0 å¤±è´¥ï¼æ½æ¥æ¦æ±å¸ 1æ=5367.97597ã6æ=5041.04224ãå»å¹´1æ=4656.86022ï¼ä¸æ¨¡æ¿é项ä¸è´ â
|
| | | - è§ä¸è§ä¸æåï¼36 æ¡ï¼å½æ+累计å 18 个å¸å·ï¼0 å¤±è´¥ï¼æ½æ¥æ¦æ±å¸å½æ è§ä¸=241659.5295/è§ä¸=445444.355/å计=687103.884ï¼ç´¯è®¡åä¸è´ â
|
| | | - å·²è¡¥æ ¡éªï¼2026-09-02ï¼ï¼è´§è¿éå¨è½¬éæ£æ¥è¡¨å¤´ãè´§è¿é(ä¸å¨)/1æâ¦ãï¼è§ä¸è§ä¸æ£æ¥ sheet 第2è¡ãå¸å·/è§ä¸ä¼ä¸è¿è¾éã+ 第3è¡ãå¨è½¬é/è´§è¿éãå表头ãè´åç¨ä¾ï¼éç±»åæä»¶/éå¸å± sheetï¼å被æç¡®æç» â
|
| | | |
| | | ### å
¬è·¯æ
å®¢è¿æ¿è½¦è¾æ° / 个ä½å®¢è¿éï¼docs/å
¬è·¯æ
å®¢ï¼æµè¯æ 2026-06ï¼æµåå·²æ¸
çï¼ |
| | | - è¿æ¿è½¦è¾æ°ï¼æ¨¡æ¿_å
¬è·¯æ
å®¢è¿æ¿è½¦è¾æ°.xlsxï¼ï¼767 æ¡ 0 失败ï¼è¡¨å¤´åç§°æ å° â
|
| | | - 个ä½å®¢è¿éï¼ä¸ªä½å®¢è¿éæ±æ».xlsxï¼ä»
è¡¨å¤´æ æ°æ®è¡ï¼ï¼è¡¨å¤´è¯å«éè¿ï¼å¯¼å
¥ 0 æ¡ â
|
| | | |
| | | ### åºç§è½¦è¿æ¿è½¦è¾ï¼docs/åå¸å®¢è¿ï¼æµè¯æ 2026-06ï¼æµåå·²æ¸
çï¼ |
| | | - 导å
¥æ¨¡æ¿_åºç§è½¦ä¿¡æ¯(è¿æ¿è½¦è¾ä¿¡æ¯).xlsx ä»
è¡¨å¤´æ æ°æ®è¡ï¼è¡¨å¤´è¯å«éè¿ï¼å«"车ç"å
³é®åæ ¡éªï¼ï¼å¯¼å
¥ 0 æ¡ â
|
| | | - 2026-08 å·²æçå® 42636 æ¡åå²å¯¼å
¥æ°æ®ï¼æ¬è½®æªè§¦ç¢°ã |
| | | |
| | | ## å¾
æµæ¸
åï¼ä¸ä¸æ¥ï¼ |
| | | - å
¨é¨ç±»å已宿µå®æ¯ãå©ä½å»ºè®®é¡¹ï¼ |
| | | 1. åºç§è½¦è¿æ¿ 4.2 ä¸è¡çå®å¤§æä»¶åå½ï¼æ¤ååå²å¯¼å
¥ 42636 æ¡ï¼æ¨¡æ¿æ æ°æ®è¡æ æ³ç¨æ¨¡æ¿å®æµï¼ã |
| | | |
| | | ## å»ºè®®ï¼æä¼å
çº§ï¼ |
| | | 1. â
已宿ï¼åºå®åä½ç±»åè¡¥"表头å使 ¡éª"ï¼è½è/å
¬äº¤/åºç§/æèµç³»ç»å¯¼åºï¼ï¼è¿æ¿è½¦è¾/轨迹éç¨æ¹ä¸º"表头åç§°æ å°"ï¼ä¸è´§è¿ææ¥ä¸è´ï¼ã |
| | | 2. â
已宿ï¼è´§è¿éå¨è½¬é/è§ä¸è§ä¸è¡¥è¡¨å¤´æ ¡éªï¼ææå¯¼å
¥ç±»åç°å¨é½æç±»åè¯å«/æ ¡éªå
åºã |
| | | 3. å¹¶åäºæ¥éï¼æéï¼è½èå·²æï¼å
¶ä»ç±»åå端已é²è¿ç¹ï¼ã |
| | | 4. 宿¹è½èæ ¼å¼ï¼15å/ç»ï¼è§£æï¼å¾
ä¸å¡ç¡®è®¤åå®ç°ï¼æ¿ä»£è½¬æ¢èæ¬ã |
| | | 5. è¿æ¿è½¦è¾/轨迹éç¨è§£ææ¹å¼å·²åââå»ºè®®ç¨æ·æ¿çå®æåº¦å¤§æä»¶åå½ä¸æ¬¡ï¼å顺åºä¸æ¨¡æ¿ä¸è´æ¶ç»æä¸æ§é»è¾å®å
¨ç¸åï¼ã |
| | | |
| | | ## æµè¯æ°æ®è¯´æ |
| | | - 2026-04 æ¥è¡¨æç°æåå¸å
¬äº¤ 142 æ¡ã巡游åºç§ 17 æ¡ä¸ºæ¬æ¬¡ä½æ£æµè¯æ°æ®ï¼éç宿°æ®ï¼å¾
æ¸
çï¼ã |
| | | - 2026-09-02 æ°å¢ç 2026-HT æµè¯ææ°æ®ï¼è¿æ¿/轨迹å 2 æ¡ + 导å
¥ç»æè®°å½ï¼å·²æ¸
ç宿¯ã |
| | | - 2026-06 æµè¯ææ°æ®ï¼è´§è¿é 18 / è§ä¸è§ä¸ 36 / æ
å®¢è¿æ¿ 767 + 导å
¥ç»æè®°å½ï¼å·²æ¸
ç宿¯ï¼æªè§¦ç¢° 2026-07/08 ç宿°æ®ã |
| New file |
| | |
| | | # 工使¥ç»_2026-09-02 |
| | | |
| | | ## 仿¥å·¥ä½ |
| | | 1. **è½è导å
¥äºæ
å¤çä¸å¤ç½®ï¼ä¸åï¼** |
| | | - æ ¹å ï¼å®æ¹æ ¼å¼ï¼15 å/ç»ï¼ä¸ç³»ç»ç®å模æ¿ï¼18 å/ç»ï¼ä¸å¹é
ï¼åºå®åä½è§£æå¯¼è´æ´è¡¨éä½ã |
| | | - å¤ç½®ï¼æ¸
ç 8/9 æéä½è½èæ°æ®ï¼å 1284 æ¡ï¼7 æä¿çï¼ï¼å®æ¹æ ¼å¼è½¬æ¨¡æ¿å鿰坼å
¥ 2026-08/09 å 1284 æ¡ 0 失败并éªè¯å¯¹é½ã |
| | | 2. **导å
¥åè½å
¨é¢ä½æ£**ï¼`docs/导å
¥åè½ä½æ£æ¥å.md`ï¼ |
| | | - 宿µï¼åå¸å
¬äº¤ 142 æ¡ã巡游åºç§ 17 æ¡ãå
¬è·¯æ
å®¢è¿æ¿ 767 æ¡ãè´§è¿éå¨è½¬é 18 æ¡ãè§ä¸è§ä¸ 36 æ¡ãåºç§è½¦è¿æ¿è¡¨å¤´è¯å«çï¼æ½æ¥å
¥åºå䏿ºæä»¶ä¸è´ã |
| | | 3. **导å
¥æ ¡éªå¢å¼ºï¼ä»£ç æ¹å¨ï¼æªæäº¤/æªæ¨éï¼** |
| | | - åå¸å
¬äº¤/巡游åºç§/æèµç³»ç»å¯¼åºè¡¥â表头å使 ¡éªâï¼è¿æ¿è½¦è¾/轨迹éç¨æ¹ä¸ºâ表头åç§°æ å°âï¼å顺åºååä¹è½å¯¼å
¥ï¼ï¼è´§è¿éå¨è½¬é/è§ä¸è§ä¸è¡¥è¡¨å¤´/sheet å¸å±æ ¡éªã |
| | | 4. **建ç«å·¥ä½è§è** |
| | | - æ¯å®æä¸ä¸ªåè½ç«å³æµè¯å¹¶åãåè½æµè¯æ¥åãï¼æ¯å¤©åã工使¥ç»ãï¼å½å鿥æï¼ãå·²åå
¥ AGENTS.md å¹¶å建 `docs/åè½æµè¯æ¥å/`ã`docs/工使¥ç»/` ç®å½ã |
| | | 5. **æèµå®¡æ ¸ I004 åºå缺失误æ¥ä¿®å¤ï¼ä»£ç æ¹å¨ï¼æªæäº¤/æªæ¨éï¼** |
| | | - é®é¢ï¼8 ææèµç©æµååº/客è¿ç«åºå®¡æ ¸åºç° 163 æ¡ RULE_I004ãæèµç³»ç»é¡¹ç®ç¼ºå¤±æ ¸å®ã误æ¥ââåæ¥è¡¨ææèµç³»ç»åºåï¼2026-08ï¼å°æªå¯¼å
¥ï¼åºéåªæ 7 æåºåã |
| | | - ä¿®å¤ï¼åæ¥è¡¨æåºåæ´æç¼ºå¤±æ¶è·³è¿ I004ï¼ä¸ I001âI003 ä¸è´ï¼ï¼è§åç»è®¡æ è®° skippedï¼åºåå卿¶æ¢å¤ç宿£æµã |
| | | - éªè¯ï¼éè· 8 æå®¡æ ¸ 163 æ¡ â 0 æ¡ï¼å¯¼å
¥æµè¯åºåå I004 æ£å¸¸æ¥ 42 æ¡çå®ç¼ºå¤±ï¼æ¸
çåè¿å 0 æ¡ãæµè¯æ¥åï¼`docs/åè½æµè¯æ¥å/åè½æµè¯æ¥å_æèµå®¡æ ¸I004åºåç¼ºå¤±ä¿æ¤_2026-09-02.md`ã |
| | | 6. **æèµå¸å·ææ¥å¤ sheet è¯å«ä¸åºå·ç©ºæ ¼ä¿®å¤ï¼ä»£ç æ¹å¨ï¼æªæäº¤/æªæ¨éï¼** |
| | | - é®é¢ï¼`ç¥åæ¶æåºç©æµæèµææ¥2026.08.xlsx` æå¼çæ¯ç¥åæ¶æ°æ®ï¼å´è¢«å¸å·ä¸è´æ§æ ¡éªæç»ã |
| | | - æ ¹å 1ï¼æä»¶ 46 个 sheetï¼å 24 个æ¯åå²ãæ½æ±ä¼ å1æ~2021.8ãéç sheetï¼æ§é表é»è¾åªçã8æãåæ ·ï¼è¯¯éåå²ãæ½æ±ä¼ å8æãâ è¯»åºæ½æ±é¡¹ç®å½å±ç¥åæ¶ â æ ¡éªæç»ã |
| | | - æ ¹å 2ï¼çæ°æ® sheet `2026.8` éãç¥åæ¶ç©æµåã项ç®è¡åºå·ä¸ºç©ºï¼æ§è§£ææç©ºåºå·è¡ä¸å¾å½å¸å·å°èè¡è·³è¿ï¼ç宿°æ®ä»æªå
¥åºï¼åºéåªæå®¢è¿ç¥åæ¶æ¢çº½ç«ï¼ã |
| | | - ä¿®å¤ï¼é sheet æ¯æç¹å·æ¥è¡¨æå¹¶ç»ã带年份åç¼ãç彿 sheet å åä¼å
ï¼ç©ºåºå·è¡è¥å项ç®ååæé¡¹ç®è§£æï¼æ°å¢ `isLikelyInvestProjectName` 夿ã |
| | | - éªè¯ï¼ç¥åæ¶+æ½æ±ä¸¤æä»¶æ¹é导å
¥ 2 æå 0 失败ï¼ç¥åæ¶ç©æµåå·²å
¥åºï¼æ»æèµ 7440.35ï¼8 æ 31/26.1/0/7535.45ï¼ï¼æ½æ±ä¸åå½±åãæµè¯æ¥åï¼`docs/åè½æµè¯æ¥å/åè½æµè¯æ¥å_æèµå¸å·ææ¥å¤sheetè¯å«ä¸åºå·ç©ºæ ¼_2026-09-02.md`ã |
| | | 7. **è¿æ¿è½¦è¾/轨迹éç¨å¯¼å
¥åå½ï¼ä¸åï¼æ ä»£ç æ¹å¨ï¼** |
| | | - ç¨ docs 7 ææ°æ®ï¼`模æ¿_è¿æ¿è½¦è¾.xlsx` 635 å®¶ã`模æ¿_轨迹éç¨.xlsx` 628 å®¶ï¼æµ 2026-08 æ¥è¡¨æï¼æ£å 635/628 æåï¼å
¥åºä¸æºæä»¶é项ä¸è´ï¼æé åä¹±åºå¯æ¬å¯¼å
¥ä»æå䏿°å¼ä¸éä½ï¼éªè¯è¡¨å¤´åç§°æ å°ï¼ï¼éç±»åæä»¶æç¡®æ¥éååºç¼ºåä¸ä¸è¯¯å æ°æ®ã |
| | | - 宿¹è½èï¼15 å/ç»ï¼ï¼æç¨æ·ç¡®è®¤ãç³»ç»æ¨¡æ¿æ ¼å¼ãå£å¾ï¼å®æµå®æ¹æä»¶è¢«è¡¨å¤´å使 ¡éªæç»å¹¶æç¤ºç¨æ¨¡æ¿æ´çï¼ä¸å宿¹æ ¼å¼ç´è¯»ã |
| | | - 补导ï¼docs å
`æèµ/è¾å
¥/ç©æµï¼ç©æµååºï¼/6æã7æ` æåºç©æµæèµææ¥å¯¼å
¥ 2026-06/2026-07 æåï¼ç¥åæ¶ç©æµå 6/7/8 ææ°æ®è¡¥å
¨å¹¶ä¸æºæä»¶æ ¸å¯¹ä¸è´ï¼7 ææä»¶å« `2026.6`/`2026.7` 两 sheetï¼æ£ç¡®éä¸ `2026.7`ï¼ã |
| | | - æµè¯æ¥åï¼`docs/åè½æµè¯æ¥å/åè½æµè¯æ¥å_è¿æ¿è½¦è¾ä¸è½¨è¿¹éç¨å¯¼å
¥åå½_2026-09-02.md`ã |
| | | |
| | | |
| | | 8. **çææ¨¡æ¿æ°ç弿¹é ï¼å
¬è·¯æ
客/åå¸å®¢è¿/è´§è¿æåï¼ä»£ç æ¹å¨ï¼æªæäº¤/æªæ¨éï¼** |
| | | - ç¨æ·å·²ææ°çå¼æå·¥è°æ´ docs ä¸ãçæ_*.xlsxãï¼ä¸åâ累计â+ä¸åâ彿âï¼ï¼ç¨åºææ°çå¼è¡¥é½å¡«å
ç¹ï¼ä¸å£å¾åæä¸ååï¼å æ¯å
¬å¼æ¹æ B$11/F$11ï¼ãä¸å£å¾æåå³ä¾§å½æåãåå¸å®¢è¿æ±æ»åºé¨åæåãåå¸åå¸å·ç´¯è®¡/åå¸å·æç»è¡¨å½æåï¼å½æ=累计差ï¼RANK/å æ¯/å¢éæåå
¬å¼æ¹æå½æè¡ï¼ï¼è´§è¿é/å¨è½¬éæå R23 æ é¢å»â累计âã |
| | | - åå¸å®¢è¿å¯¼åºåºç¨¿ä»å·²å é¤çã导å
¥æ¨¡æ¿_*ãå
¨é¨æ¹åãçæ_*ãï¼æå¡/æ§å¶å¨/ä¸é®å
忥ï¼ï¼DataImport.vue ä¸è½½æ¨¡æ¿é¾æ¥ä¸å¹¶æ¹æã |
| | | - éªè¯ï¼10 æ¥å£ 2026-07 å
¨ 200ãé误å
¬å¼ 0 æ®çï¼å叿±æ»å½æåä¸åºå
2026-07 å项å计éä½ä¸è´ï¼å
¬äº¤ 12974.73 / åºç§ 5860.24 / 轨é 11731.83 / 轮渡 46.05ï¼ï¼ä¸å£å¾ä¸åå=7 æå½æ 3078.86 ä¸äºº / 141155.32 ä¸äººå
¬éï¼è´å/è¾¹çï¼æ æ°æ®æ 2026-05ãå¹´å 2026-01ãè¶
èå´ 2026-13ãéæ³ bad-periodï¼å·²æµå¹¶çæ¡£ã |
| | | - **è´§è¿æå两表第äºé¡µâ彿âå¡«å
å·²å®ç°ï¼16:40 确认åè¡¥åï¼**ï¼exportFreightRank/exportTurnoverRank 第äºé¡µæ¹å¡«å½æå¼ï¼è´§è¿ï¼H2032 彿è§ä¸+模æ¿å½æå计-å·®å¼ï¼å¨è½¬éï¼æå表 MONTH è¡ï¼ï¼ç¬¬äºé¡µåå¤´å¯¼åºæ¶æ¹â彿宿âï¼2026-07 å彿¦æ±/å
¨çä¸ DB é项ä¸è´ã0 é误å
¬å¼ï¼äº§ç© `freightRank_彿ç_2026-07.xlsx`ã`turnoverRank_彿ç_2026-07.xlsx`ã |
| | | - å¾
确认ï¼åå¸å®¢è¿å½æå Q å表头âåºç§/ç½çº¦è½¦âæ§ä¹ï¼æ¨¡æ¿æºæä»¶å头âç´¯è®¡å®æâå¦éä¸å¹¶è½çå¯å¨ Excel å¦åï¼å¯¼åºå·²èªå¨ä¸ºâ彿宿âï¼ã |
| | | |
| | | ## æµè¯ç»ææè¦ |
| | | - åè½æµè¯æ¥åï¼`docs/åè½æµè¯æ¥å/åè½æµè¯æ¥å_导å
¥æ ¡éªå¢å¼º_2026-09-02.md`ï¼17 个æ£/è´åç¨ä¾å
¨é¨éè¿ï¼ã |
| | | - åè½æµè¯æ¥åï¼`docs/åè½æµè¯æ¥å/åè½æµè¯æ¥å_æèµå®¡æ ¸I004åºåç¼ºå¤±ä¿æ¤_2026-09-02.md`ï¼4 个ç¨ä¾å
¨é¨éè¿ï¼ã |
| | | - åè½æµè¯æ¥åï¼`docs/åè½æµè¯æ¥å/åè½æµè¯æ¥å_æèµå¸å·ææ¥å¤sheetè¯å«ä¸åºå·ç©ºæ ¼_2026-09-02.md`ï¼5 个ç¨ä¾å
¨é¨éè¿ï¼ã |
| | | - åè½æµè¯æ¥åï¼`docs/åè½æµè¯æ¥å/åè½æµè¯æ¥å_è¿æ¿è½¦è¾ä¸è½¨è¿¹éç¨å¯¼å
¥åå½_2026-09-02.md`ï¼8 个ç¨ä¾å
¨é¨éè¿ï¼ã |
| | | - åè½æµè¯æ¥åï¼`docs/åè½æµè¯æ¥å/åè½æµè¯æ¥å_çææ¨¡æ¿æ°çå¼_2026-09-02.md`ï¼10 个ç¨ä¾ï¼æ£å 6 éè¿ãè´å/è¾¹ç 4 éè¿ï¼å¦è®°å½ 1 å¤ä½ä¼ç¼ºé·ï¼éæ³ period è¿å 500 æ æ ¡éªï¼ã |
| | | - è¿æ¿è½¦è¾/轨迹éç¨ 2026-08ï¼635/628 æ¡ï¼ä¸º 7 ææ°æ®æµè¯ç迹ï¼ä¿çä¸å¦å¾
ç¨æ·ç¡®è®¤ï¼å
¶ä½æµè¯æ°æ®å·²æ¸
çï¼æªè§¦ç¢° 2026-06/07 çå®æèµæ°æ®ï¼æ¬æ¬¡è¡¥å¯¼ä¸ºç宿°æ®ï¼ã |
| | | |
| | | ## éçé®é¢ä¸å¾
å |
| | | - åºç§è½¦è¿æ¿ï¼å¦ä¸ä¼è¯ä¿®æ£ä¸ï¼ä¿®æ£åéçå® 4.2 ä¸è¡å¤§æä»¶åå½ã |
| | | - 宿¹è½èï¼15 å/ç»ï¼ï¼å·²ç¡®è®¤ä¸å®ç°ç´è¯»ï¼æç³»ç»æ¨¡æ¿æ ¼å¼æ´ç导å
¥ï¼ç°ç¶è¡ä¸ºå·²å®æµï¼ã |
| | | - è¿æ¿è½¦è¾/轨迹éç¨ 2026-08 ç®å为 7 ææ°æ®æµè¯ç迹ï¼635/628 æ¡ï¼ï¼å¦éä¿çç¨äºåç» 8 æåè½æµè¯è¯·åç¥ï¼å¦åæ¸
çã |
| | | - **8 ææèµç³»ç»å¯¼åºæä»¶å¾
ç¨æ·æä¾**ï¼æ¿å°å导å
¥ï¼investmentSystem / period=2026-08ï¼å¹¶éè· 8 æå®¡æ ¸ï¼I001âI004 æ¢å¤å®æ´å¯¹æ¯ã |
| | | - ç¥åæ¶ç©æµå 6/7/8 ææ°æ®å·²å
¨é¨è¡¥å
¨ï¼docs å
6/7 ææä»¶å·²å¯¼å
¥ï¼ã |
| | | |
| | | ## æå¤©è®¡åï¼å¾
ç¨æ·ç¡®è®¤ï¼ |
| | | - ç¨æ·çå®æä»¶æ½æ¥åå½ï¼æéç»§ç»ä¸å¡åè½å¼åã |
| | | |
| | | |
| New file |
| | |
| | | # 模å â åè½ â éªè¯ç¶æç©éµï¼2026-09-02 å¿«ç
§ï¼ |
| | | |
| | | > ç¶æå£å¾ï¼ |
| | | > â
å·²éªè¯å¯ç¨ï¼ç宿°æ®/åå½è¯æ®ï¼è§âè¯æ®âåï¼ |
| | | > â ï¸ åè½å¯ç¨ä½æ°æ®æºæç¼ºå£ï¼ç¼ºæ/ç¼ºæ ¼å¼ï¼ï¼è¡¥æ°æ®å³å®æ´ |
| | | > ð¡ é¨åéªè¯ / æªåå
¨é¢åå½ |
| | | > æ°æ®èå´ï¼æ¬å° traffic_audit åºï¼127.0.0.1:3308ï¼+ 彿¥ï¼2026-09-02ï¼22 æ¥è¡¨æ¥å£åå½ã |
| | | |
| | | ## è´§è¿ï¼æ ¸å¿æ¨¡åï¼ä»æ¥åå½ï¼ |
| | | |
| | | | åè½ | éªè¯ç¶æ | è¯æ® / 夿³¨ | |
| | | |---|---|---| |
| | | | è´§è¿é/å¨è½¬éææ¥å¯¼å
¥ï¼2026-07ï¼ | â
| 18 è¡ 0 失败ï¼åå¸å计=æ¹åç 16285.7105 ä¸ / 2181925.708 ä¸å¨å
¬éï¼æ¦æ± 4940.97/667561.37 | |
| | | | è§ä¸è§ä¸æåï¼2026-07ï¼ | â
| MONTH/CUM å 18 è¡ï¼åè®¡ä¸ workbook ä¸è´ï¼æ¦æ± MONTH 204809.56/462751.81/667561.37ï¼ | |
| | | | H2032 ä¼ä¸ææ¥æ°æ® | â
| 2026-01~08 å 636 æ·æ éå¤ï¼2025 åºæ 12 个æå 664 æ·ï¼å»å¹´æ£å¸¸ï¼ | |
| | | | åå¸å·æç» cityDetail å¯¼åº | â
| æ¦æ± 7 æ 4940.97ã累计 34306.78ï¼æ éè¯¯æ ¼ | |
| | | | æå表 freightRank / turnoverRank | â
| ä¸ scale_split éä½ä¸è´ï¼ç´¯è®¡ 4357157.34/10864961.11/15222118.45ï¼ | |
| | | | è´§è¿ç³»å freightSeriesï¼zipï¼ | â
| å
å± 0 éè¯¯æ ¼ | |
| | | | è¿æ¿è½¦è¾ / 轨迹éç¨å¯¼å
¥ï¼2026-08ï¼ | â
| 635 / 628 æ¡ï¼ä¹±åºå + ç¼ºåæ¥éè´ä¾éè¿ï¼8/31 使£æ¥åï¼ | |
| | | |
| | | ## åå¸å®¢è¿ |
| | | |
| | | | åè½ | éªè¯ç¶æ | è¯æ® / 夿³¨ | |
| | | |---|---|---| |
| | | | å
¬äº¤ U203 导å
¥ | â
| 2026-04 142 æ¡ 0 失败 + éä½å被æï¼ä½æ£æ¥åï¼ | |
| | | | 巡游åºç§ U402 导å
¥ | â
| 2026-04 17 æ¡ 0 失败 + éä½å被æ | |
| | | | åºç§è¿æ¿è½¦è¾å¯¼å
¥ï¼2026-07ï¼ | â
| 42636 æ¡ 0 失败ã17 å¸å·ï¼ä¸ 2026-08 ä¸è´ï¼ä»æ¥ï¼ | |
| | | | å
¬äº¤ / åºç§åå¸å·æç»å¯¼åº | â
| 表头 2026 å¹´ 1-7 ææ£å¸¸ã0 éè¯¯æ ¼ï¼ä»æ¥ï¼ | |
| | | | 轨é / 轮渡åå¸å·æç»å¯¼åº | â
| 0 éè¯¯æ ¼ï¼å
¨çæ±å=æ¦æ±+é»ç³ï¼æ½æ¥ä¸è´ï¼ï¼ä»æ¥ï¼ | |
| | | | 轨é / 轮渡æåº¦æ°æ®æº | â ï¸ | åºå
2026 å¹´ä»
6ã7 ææå¼ â æ¥è¡¨ 1-5 æä¸ºç©ºï¼è¡¥ææºæä»¶åå³å®æ´ | |
| | | | åå¸å®¢è¿æ±æ» / åå¸å·ç´¯è®¡ / åå¸ç³»å | â
| ç´¯è®¡å æ¯ #DIV/0! å·²æ¸
ï¼ä»æ¥ï¼ï¼ç½çº¦è½¦æ æºç空 | |
| | | |
| | | ## å
¬è·¯æ
客 |
| | | |
| | | | åè½ | éªè¯ç¶æ | è¯æ® / 夿³¨ | |
| | | |---|---|---| |
| | | | H2031 ææ¥å¯¼å
¥ | â
| 2026-07 补导 46 æ¡ | |
| | | | 个ä½å®¢è¿éï¼æ°å¸å·æ±æ»æ¨¡æ¿ï¼2026-07ï¼ | â
| 7 æ¡ 0 失败ï¼å
¨çå计 189998 人 / 4584040.2 人å
¬é = æºè¡¨ï¼ä»æ¥ï¼ | |
| | | | 个ä½å®¢è¿éï¼æ§âä¼ä¸åç§°âæ¨¡æ¿ï¼ | â
| 忍¡æ¿å¹¶åï¼æ§æ¨¡æ¿å
¼å®¹ä¿ç | |
| | | | å
¬è·¯æ
å®¢è¿æ¿è½¦è¾æ°å¯¼å
¥ | â
| 2026-06 767 æ¡ | |
| | | | åå¸å· / ä¸å£å¾æç» / æå / åæå¯¼åº | â
| æç»å»å¹´åæé¡µ #REF! å·²æ¸
ï¼ä»æ¥ï¼ï¼0 éè¯¯æ ¼ | |
| | | | å
¬è·¯æ
客系å passengerSeriesï¼zipï¼ | â
| å
å± 0 éè¯¯æ ¼ï¼ä»æ¥ï¼ | |
| | | | ä¸å£å¾æåº¦æ°æ®è¦ç | â ï¸ | 䏿ºæä»¶æä»½å¯¹é½æ
嵿ªéææ ¸ï¼å¯¼åºæ éä½å»ºè®®è¡¥æ°æ®åå¤ç | |
| | | |
| | | ## è½è |
| | | |
| | | | åè½ | éªè¯ç¶æ | è¯æ® / 夿³¨ | |
| | | |---|---|---| |
| | | | H204 壿¥å¯¼å
¥ | â
| 7/8/9 æå 1284 æ¡ 0 失败ï¼ä½æ£æ¥åï¼ | |
| | | | è½èæ±æ»å¯¼åº energySummary | â
| æ å»å¹´æ°æ®ç #DIV/0! å·²æ¸
ï¼ä»æ¥ï¼ | |
| | | |
| | | ## æèµ |
| | | |
| | | | åè½ | éªè¯ç¶æ | è¯æ® / 夿³¨ | |
| | | |---|---|---| |
| | | | 客è¿ç«åº / ç©æµååºå¯¼å
¥ | â
| 6/7 æç宿件ï¼å®¢è¿ 46 + ç©æµ 133 / åºå 148ï¼ | |
| | | | æèµæ¥è¡¨ investPlan/Billion/County/FiveYear | ð¡ | HTTP 200ãExcel 坿å¼ï¼HSSF èæ ¼å¼ï¼.xls äºè¿å¶ï¼ï¼æªåéæ ¼å
¬å¼æ«æ | |
| | | | æèµç³»å investSeriesï¼zipï¼ | â
| å
å± 0 éè¯¯æ ¼ | |
| | | |
| | | ## æ°æ®è´¨é / æ±¡ææ¸
çï¼2026-09-02ï¼ |
| | | |
| | | | äºé¡¹ | éªè¯ç¶æ | 说æ | |
| | | |---|---|---| |
| | | | æ¥è¡¨ #REF! / #DIV/0! 污æ | â
å·²æ¸
| å
¬äº¤/åºç§/轨é轮渡/åå¸ç´¯è®¡/è½è/ä¸å£å¾æç»å
¨é¨ 0 æ®ç | |
| | | | è´§è¿ 2026-07 空æ´ä¸è´å¼ | â
已修 | é»ç³ç NULL è¡¥é½ï¼æå£å·® -323.97 è´å¼æ¶é¤ | |
| | | | H2032 2026-07 éå¤ï¼98 æ·/734 è¡ï¼ | â
å·²æ¶ | ç° 636 æ· 0 éå¤ | |
| | | | ç©ºæ¹æ¬¡ #177-179 / #186 | â¹ï¸ | 0 è¡æ 害ï¼ä¿ç审计åå² | |
| | | |
| | | ## ç³»ç» / å
¶ä» |
| | | |
| | | | åè½ | éªè¯ç¶æ | 说æ | |
| | | |---|---|---| |
| | | | 导å
¥æ¥å£ + æ¹æ¬¡è½åº | â
| 仿¥ä¸æ¹ï¼#187/#188 çï¼åè½åºå¯æ¥ | |
| | | | 导å
¥è¿åº¦ UI æ¾ç¤ºï¼4.2 ä¸è¡å¤§æä»¶ï¼ | ð¡ | ç¨æ·åé¦âæ æ¾ç¤ºâï¼æ¬æ¬¡èµ°æ¥å£å¯¼å
¥æåï¼é¡µé¢å¤ç°ææ¥å¾
å | |
| | | | ç»å½ / é¡µé¢ / å®¡æ ¸ï¼AuditEngineï¼ | ð¡ | ä¸å¨æ¬æ¬¡èå´ï¼æªåå½ | |
| | | |
| | | ## å¾
åï¼å»ºè®®ä¸ä¸æ¥ï¼ |
| | | |
| | | 1. è¡¥é½åå¸å®¢è¿ï¼å
¬äº¤/åºç§æåº¦ã轨é/轮渡ï¼ç¼ºææºæä»¶å¹¶éæ°å¯¼å
¥ â æ¥è¡¨æä»½åå
¨ã |
| | | 2. /import 页é¢å¤§æä»¶è¿åº¦æ¡å¤ç°ææ¥ï¼ç¨æ·å¯è§é®é¢ï¼ã |
| | | 3. å¦éâæèµå表 .xls èæ ¼å¼âéæ ¼æ«æï¼éè¦ xls è§£æ/转æ¢å·¥å
·ï¼LibreOffice çï¼ã |
| | | 4. æ¬å°ä»£ç æ¹å¨æªæäº¤ï¼ReportExportService/DataImportService/RegionUtil + 2 份æ¥åææ¡£ï¼ï¼ç¡®è®¤å commitã |
| New file |
| | |
| | | # å¾
ä¸å¡ç¨æ·ç¡®è®¤æ¸
åï¼æç/å£å¾ï¼2026-09-02ï¼ |
| | | |
| | | > ç¨éï¼æå°æå¯¹ç
§ï¼å½é¢éæ¡ç¡®è®¤ãâ
=æçç±»ï¼ä¸å¡ä½¿ç¨è
å¯ç´æ¥ææ¿ï¼ï¼â=å£å¾/æ°æ®ç±»ï¼éä¸å¡/ç»è®¡è§å确认ï¼ï¼â²=åè½èå´ã |
| | | > ç¶æåç空å¾
å¡«ï¼â¡å¾
确认 / â已确认 / âä¸é纳 / âæ¹æ |
| | | |
| | | ## ä¸ãå
¬è·¯æ
客ï¼å«ä¸ªä½å®¢è¿ï¼â
éç¹ |
| | | |
| | | | # | ç±»å« | ç°è±¡ï¼ç°ç¶è¯æ®ï¼ | éè¦ç¡®è®¤çé®é¢ | 建议é»è®¤ | |
| | | |---|---|---|---|---| |
| | | | 1 | â
æç | 个ä½å®¢è¿ 2026-07 导å
¥ 7 è¡ï¼ä½åªè¦ç 6 个å¸å·ï¼åæåºç° 2 è¡ï¼å计约 21802/436433ï¼ï¼å
¶ä½å¸å·å 1 è¡ | 模æ¿ç©¶ç«âä¸è¡ä¸å¸å·âè¿æ¯å
许ä¸å¸å·å¤è¡ï¼åæä¸¤è¡æ¯ä»ä¹å£å¾ï¼ååº/å¿æå or éå¤ï¼ï¼æ¥è¡¨æ¯å¦è¦âå
¨çå计âè¡ï¼ | ä¸ã模æ¿_æ¹åçå
¬è·¯æ
客è¿è¾ä¸ªä½æ·æåº¦ç产æ
åµï¼2026.7ï¼ãå®å
¨ä¸è´éè¡å±ç¤ºï¼è¯·ç¡®è®¤åæä¸¤è¡å½å± | |
| | | | 2 | â
æç/âå£å¾ | 个ä½å®¢è¿åªæâå¸å·æ±æ»è¡¨âæ°æ®ï¼ç³»ç»ç®å没æåç¬çâ个ä½å®¢è¿åå¸å·æ¥è¡¨âï¼å
¬è·¯æ
客导åºçåå¸å·/ä¸å£å¾æ¥è¡¨åªå«è§ä¸ä¼ä¸ | 个ä½å®¢è¿æ¯å¦è¦å¹¶å
¥âå
¬è·¯æ
客æ»éâæ¥è¡¨ï¼è§ä¸+个ä½å计ï¼ï¼è¥è¦ï¼ç弿乿ï¼è§ä¸å+个ä½å+å计è¡ï¼ï¼è¥ä¸è¦ï¼ä¸ªä½å®¢è¿æ°æ®ä»
ä¾å°è´¦/å®¡æ ¸ï¼ | åºä¸ä»½âå
¨çæ»é=è§ä¸+个ä½âçæ ¸å¯¹é¡µææ¥è¡¨ï¼å
é®ä¸å¡æ¯å¦æ¬æéè¦ | |
| | | | 3 | âå£å¾ | ä½ æå°â个ä½å®¢è¿æ°æ®æ¯æ ¹æ®åå¸å®¢è¿æ°æ®è®¡ç®å¾æ¥çâ | 确认æ¨å¯¼å£å¾ï¼ä¸ªä½å®¢è¿é/å¨è½¬é = åå¸å®¢è¿åªä¸ªææ ï¼åºç§ï¼æ»é-å
¬äº¤-轨é-轮渡ï¼ç³»æ°ï¼ï¼ï¼ä¾¿äºç³»ç»åå¾ç¨½æ ¡éªï¼å¦æèµé£æ ·å¯¼å
¥åå¼¹çªæ ¸å¯¹ï¼ | æä¾è®¡ç®å¼ï¼ç³»ç»å âä¸ªä½ vs åå¸å®¢è¿âä¸è´æ§æ ¡éª | |
| | | | 4 | âæ°æ® | åºå
H2031 å
¬è·¯æ
客ä¼ä¸ææ¥åªæ 2026-03(778)ã2026-07(771) | 1/2/4/5/6/8 ææ¯å¦å·²æä¸æ¥æä»¶éè¦è¡¥å¯¼ï¼2025 åºææ¯å¦æä¾ï¼å³å®åæ¯åï¼ï¼ | 缺ææä»¶è¡¥é½åååºå®æ´ 1-N ææ¥è¡¨ | |
| | | |
| | | ## äºãåå¸å®¢è¿ï¼æçéç¹ï¼ |
| | | |
| | | | # | ç±»å« | ç°è±¡ | éè¦ç¡®è®¤çé®é¢ | 建议é»è®¤ | |
| | | |---|---|---|---|---| |
| | | | 5 | â
æç/âå£å¾ | 8/11ãåå¸å®¢è¿æ°æ®ä¼åãåæâç½çº¦è½¦æå=é¨çº§ä¸åæ»éæå·¡æ¸¸åºç§æ¯ä¾æå°åå¸å·ï¼Excel éææåå
¬å¼âï¼èç³»ç»å¯¼åºçåå¸å·ç´¯è®¡/æç»è¡¨æç½çº¦è½¦åæ¸
空 | æ¥è¡¨ç½çº¦è½¦åæ¬æè¦ä¸è¦ææåå
¬å¼å¡«å¼ï¼æåæéçâé¨çº§æ»é/è®¢åæ»æ°âç±è°æä¾ï¼æå·¥è¡¨ or æ¥å£ï¼ï¼ | å
çç©ºå¹¶æ æ³¨âæ æ°æ®æºâï¼è¥æ¬æè¦ï¼è¯·æä¾æåè¡¨æ ·æ¬ | |
| | | | 6 | â
æç | å
¬äº¤/åºç§/轨é轮渡模æ¿çâ2025 å¹´ 1-12 æâåä¸åæ¯åå æ å»å¹´åºææ°æ® + 模æ¿å
¬å¼ #REF!ï¼å¯¼åºè¢«æ¸
空 | æ¬æäº¤ä»æ¯å¦éè¦å»å¹´åä¸åæ¯ï¼éè¦â请æä¾ 2025 åææ°æ®æå»å¹´æ®µæºè¡¨ï¼ä¸éè¦â模æ¿å é¤è¯¥åï¼ç颿´å¹²å | å
æâä¸éè¦ãç空â交ä»ï¼æ¨¡æ¿ç±å¦ä¸ä¼è¯ææ¤è£åª | |
| | | | 7 | âæ°æ® | åå¸å
¬äº¤/åºç§æåº¦åªæ 2026-06ã07ï¼è½¨é/è½®æ¸¡æ°æ®ä»
6ã7 æ | 1-5 æã8 æâ¦æºæä»¶å¯å¦è¡¥é½ï¼å³å®æ¥è¡¨æä»½å宿´åº¦ï¼ï¼è¥åªäº¤ 7 æï¼æ¥è¡¨åªå±ç¤º 6-7 æå坿¥åï¼ | è¡¥é½è½æ¿å°çæä»½ï¼å
¶ä½åç空 | |
| | | | 8 | â
æç | 轨é忍¡æ¿åªæäº å
¨ç/æ¦æ±/é»ç³ï¼é»ç³ 6 æ 34.86ã7 æ 30.09 æå¼ï¼ï¼è½®æ¸¡ååªæ å
¨ç/æ¦æ± | è¥æå
¶å®å¸å·è½¨é/è½®æ¸¡æ°æ®ï¼æ¨¡æ¿è¡æ¯å¦è¦é¢ç/èªå¨æ©å±ï¼å½åç弿¯å¦ç¬¦å䏿¥æ ¼å¼ï¼ | ä¸å®æ¹æ ·å¼ ä¸è´å³å¯ï¼è¯·å½åºæ ¸å¯¹æ ·å¼ | |
| | | | 9 | â²éç | docs/åå¸å®¢è¿ 䏿 8/14 空æä»¶â客è¿éçåæ¯ç¯æ¯æ¯0% éæ ¸å®ï¼ä¸»è¦åºç°å¨å
¬äº¤ï¼.txtâ | è¯¥æ ¸å®é¡¹æ¯å¦å·²å
³éï¼å
¬äº¤åæ¯/ç¯æ¯ 0% æ¯å¦ä»åå¨ï¼ä¸ç¬¬ 6 æ¡å»å¹´æ°æ®ç¼ºå¤±åæºï¼ï¼ | å·²å
³éåå å ä½æä»¶ï¼æªå
³éååå
¥å®¡æ ¸è§åéªè¯ | |
| | | |
| | | ## ä¸ãè´§è¿ï¼æçéç¹ï¼ |
| | | |
| | | | # | ç±»å« | ç°è±¡ | éè¦ç¡®è®¤çé®é¢ | 建议é»è®¤ | |
| | | |---|---|---|---|---| |
| | | | 10 | â
æç/âå£å¾ | `çæ_è´§è¿éæå/å¨è½¬éæå` å两页ï¼ç¬¬ä¸é¡µâ1-7æç´¯è®¡â¦âï¼ç¬¬äºé¡µæ é¢å·²å»â累计â | â 已确认ï¼ç¬¬äºé¡µå¡«å½æå¼ï¼9/2 16:40 å·²å®ç°å¹¶åå½ï¼ç¬¬äºé¡µå½ææ°ä¸åºä¸è´ï¼åå¤´å¯¼åºæ¶èªå¨æ¹â彿宿âï¼ãæ¨¡æ¿æºæä»¶å¦éä¸å¹¶è½çå¯å¨ Excel å¦å | 宿 | |
| | | | 11 | â
æç | `è´§è¿éåå¸å·æç»`ï¼å
¨ç 6 ææ ï¼æ»é/å¨è½¬é/è§ä¸/è§ä¸â¦ï¼+ 17 å¸å·Ã6 ææ ï¼1-N æ+累计 | ææ é¡ºåºãåä½ï¼ä¸å¨/ä¸å¨å
¬éï¼ãè¡é´è·æ¯å¦ç¬¦å䏿¥æ ¼å¼ï¼ | 对ç
§å®æ¹æ ·å¼ 确认 | |
| | | | 12 | â
æç | ä¸å£å¾æç»/æå/åææ¨¡æ¿æ£è¢«å¦ä¸ä¼è¯ä¿®æ¹ï¼å« Sheet2 å»å¹´æç»é¡µ #REF! 被æ¸
ç©ºï¼ | ä¸å£å¾æ¥è¡¨éçâå»å¹´åæé¡µâæ¬ææ¯å¦éè¦ä¿ç/å¡«å
ï¼å»å¹´æ°æ®æ¥æºï¼ | å
ç±æ¨¡æ¿ä¼è¯æâä¸éè¦âå¤çï¼äº¤ä»ååç®æ£ | |
| | | |
| | | ## åãè½è / æèµ |
| | | |
| | | | # | ç±»å« | ç°è±¡ | éè¦ç¡®è®¤çé®é¢ | 建议é»è®¤ | |
| | | |---|---|---|---|---| |
| | | | 13 | â
æç | è½èæ±æ»è¡¨æ å»å¹´æ°æ®ç忝/å æ¯å
¬å¼æ±å¼å¤±è´¥å被æ¸
空ï¼å¦ D4/J4/L4/M4ï¼ | ç空æ¯å¦å¯æ¥åï¼è¿æ¯è¦æ¾ç¤ºâââæâææ æ°æ®âå ä½ï¼ | ç空ï¼ä¸ç¼ºå»å¹´åçå
¶å®æ¥è¡¨ä¸è´ï¼ | |
| | | | 14 | â
æç/â² | æèµåå¼ æ¥è¡¨å¯¼åºä¸ºèæ ¼å¼ .xlsï¼Excel 坿å¼ï¼ï¼æªåéæ ¼éè¯¯æ«æ | æ¯å¦æ¬æå¿
é¡»äº¤ä» .xlsxï¼æçæ¯å¦ä¿ææ¨¡æ¿åæ ·å³å¯ï¼ | ä¿æç°ç¶ï¼æ¨¡æ¿ä¼è¯è¥ä¸å¹¶å¤çå以å®ççæ¬ä¸ºå | |
| | | |
| | | ## äºãåè½èå´ / ä½éª |
| | | |
| | | | # | ç±»å« | ç°è±¡ | éè¦ç¡®è®¤çé®é¢ | 建议é»è®¤ | |
| | | |---|---|---|---|---| |
| | | | 15 | â² | 导å
¥é¡µâå¹´æ¥âåç»æ 11 个类åå
¥å£ï¼å端æ å®ç° | å¹´æ¥å¯¼å
¥ä»å¹´æ¯å¦è¦åï¼ | ä¸åå°±éè/ç¦ç¨å
¥å£ï¼é¿å
è¯¯ç¹æ¥é | |
| | | | 16 | â²ä½éª | 4.2 ä¸è¡å¤§æä»¶å¯¼å
¥ 20-40 ç§ï¼é¡µé¢åªæâä¸ä¼ ä¸âæ ç¾åæ¯ï¼ä¾§æ âæ¬æå¯¼å
¥è¿åº¦âå¯è½è¢«ç©ºæ¹æ¬¡æ¾ç¤ºæâæ æ°æ®â | ææå¯¼å
¥ä¸æ¾ç¤ºâå·²å¤ç N/M è¡â宿¶è¿åº¦ï¼è¿æ¯å®æåå¼¹çªæ±æ»å³å¯ï¼ | 宿åå¼¹çª+ä¾§æ ç¶æï¼å½åï¼ï¼å¦é宿¶è¿åº¦åææ | |
| | | |
| | | ## 夿³¨ |
| | | - æ¬æ¬¡åªåâé®é¢ç¡®è®¤âï¼ä»£ç ä¿®å¤ï¼æ°å¼éé» 0/失败è¡å·/æ¹æ¬¡åå¡«/å®¡æ ¸è¯¯å çï¼å·²æä½ è¦æ±å»ç»ï¼çå¦ä¸ä¼è¯æ¨¡æ¿æ¹å®åååã |
| | | - æ¨¡æ¿æä»¶æ£è¢«å¦ä¸ä¼è¯ä¿®æ¹ï¼ä»¥ä¸ â
æç 项䏿¶åæ¨¡æ¿æ ·å¼çï¼6/8/10/12/14ï¼å»ºè®®ä»¥âå¦ä¸ä¼è¯å®ç¨¿åççæ¬âåå½é¢æ ¸å¯¹ä¸æ¬¡ï¼é¿å
é夿¹ä¸¤éã |
| | | |
| | | |
| | |
| | | .eq(InvestmentSystem::getReportPeriod, reportPeriod))) { |
| | | sysMap.computeIfAbsent(normInvestName(s.getProjectName()), k -> new ArrayList<>()).add(s); |
| | | } |
| | | // åæ¥è¡¨ææèµç³»ç»åºåæ´æç¼ºå¤±æ¶ï¼ä¸å"项ç®ç¼ºå¤±æ ¸å®"ï¼ç¼ºå¤±=åºåæªå¯¼å
¥ï¼ä¸çäºé¡¹ç®ä¸åå¨ï¼ï¼é¿å
æ´è¡¨è¯¯æ¥ |
| | | boolean benchmarkMissing = sysMap.isEmpty(); |
| | | |
| | | // å¹çï¼åªæ¸
é¤ INVEST è§åçæ§å®¡æ ¸ç»æ |
| | | List<Long> ruleIds = new ArrayList<>(); |
| | |
| | | String projectName = project == null ? "æªç¥é¡¹ç®" : project.getProjectName(); |
| | | InvestmentSystem sys = findInvestSystem(sysMap, projectName); |
| | | for (AuditRule rule : rules) { |
| | | if (benchmarkMissing && "EXISTENCE_SYS".equals(rule.getCompareType())) continue; |
| | | AuditResult result = checkInvestRule(rule, monthly, projectName, sys); |
| | | if (result != null) { |
| | | result.setRuleName(rule.getRuleName()); |
| | |
| | | case "RULE_I001": |
| | | case "RULE_I002": |
| | | case "RULE_I003": |
| | | case "RULE_I004": |
| | | return investSystemMapper.selectCount(new LambdaQueryWrapper<InvestmentSystem>() |
| | | .eq(InvestmentSystem::getReportPeriod, period)) == 0; |
| | | default: |
| | |
| | | CODE_PREFIX_MAP.put("429006", "天é¨å¸"); |
| | | CODE_PREFIX_MAP.put("429021", "ç¥åæ¶æåº"); |
| | | |
| | | ALIAS_MAP.put("æ¦æ±", "æ¦æ±å¸"); |
| | | ALIAS_MAP.put("é»ç³", "é»ç³å¸"); |
| | | ALIAS_MAP.put("åå °", "åå °å¸"); |
| | | ALIAS_MAP.put("宿", "宿å¸"); |
| | | ALIAS_MAP.put("è¥é³", "è¥é³å¸"); |
| | | ALIAS_MAP.put("éå·", "éå·å¸"); |
| | | ALIAS_MAP.put("èé¨", "èé¨å¸"); |
| | | ALIAS_MAP.put("åæ", "åæå¸"); |
| | | ALIAS_MAP.put("èå·", "èå·å¸"); |
| | | ALIAS_MAP.put("é»å", "é»åå¸"); |
| | | ALIAS_MAP.put("å¸å®", "å¸å®å¸"); |
| | | ALIAS_MAP.put("éå·", "éå·å¸"); |
| | | ALIAS_MAP.put("æ©æ½", "æ©æ½å·"); |
| | | ALIAS_MAP.put("æ©æ½å¸", "æ©æ½å·"); |
| | | ALIAS_MAP.put("æ©æ½åå®¶æèæèªæ²»å·", "æ©æ½å·"); |
| | |
| | | return CITY_LIST; |
| | | } |
| | | |
| | | /** è§èå¸å·å -> 6 ä½è¡æ¿åºå代ç ï¼æ å¹é
ææ¹åçè¿å nullï¼ */ |
| | | public static String codeOfCity(String normalizedName) { |
| | | if (normalizedName == null) return null; |
| | | String name = normalizeCityName(normalizedName); |
| | | if (name == null || "æ¹åç".equals(name)) return null; |
| | | for (Map.Entry<String, String> e : CODE_PREFIX_MAP.entrySet()) { |
| | | if (e.getValue().equals(name)) { |
| | | String code = e.getKey(); |
| | | return code.length() < 6 ? code + "00" : code; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** çæç©ºå¸å·ç»è®¡Map */ |
| | | public static Map<String, BigDecimalStat> emptyStatMap() { |
| | | Map<String, BigDecimalStat> map = new LinkedHashMap<>(); |
| | |
| | | |
| | | |
| | | |
| | | /** å
¬è·¯æ
客个ä½å®¢è¿é/å¨è½¬éï¼ä¼ä¸çº¿ä¸æ±æ¥æ°æ®ï¼ææå±å°åºå¯¼å
¥ï¼ä¾åå¸å·è¡¨ä¸ªä½è¡å¡«å
ï¼ */ |
| | | /** å
¬è·¯æ
客个ä½å®¢è¿é/å¨è½¬éï¼å¯¼å
¥åæå¸å·æ±æ»å¡«å
åå¸å·è¡¨ä¸ªä½è¡ï¼ï¼æ¯æä¸¤ç§æ¨¡æ¿ï¼ |
| | | * â ä¼ä¸çº¿ä¸æ±æ¥æç»ï¼è¡¨å¤´å«ãä¼ä¸åç§°ãï¼ï¼éä¼ä¸å
¥åºï¼ |
| | | * â¡ çå
å¸å·æ±æ»è¡¨ãæ¹åçå
¬è·¯æ
客è¿è¾ä¸ªä½æ·æåº¦ç产æ
åµï¼YYYY.Mï¼ãï¼ |
| | | * sheet å
为ãå
¨çNæä¸ªä½å®¢è¿éæ±æ»è¡¨ãæ é¢å + ãå¸å·/个ä½è½¦è¾æ°/â¦/个ä½å®¢è¿é/ä¸ªä½æ
客å¨è½¬éãè¡¨å¤´ï¼ |
| | | * æå¸å·éè¡å
¥åºï¼åä¸å¸å·å¤è¡å¦ å¿å
ç线+è·¨å¿ç线 åå
¥åºï¼æ¥è¡¨ä¾§æå¸å·èªå¨æ±æ»ï¼ã */ |
| | | public ImportResult importPassengerIndividual(MultipartFile file, String period) throws Exception { |
| | | List<PassengerIndividualMonthly> rows = new ArrayList<>(); |
| | | try (Workbook wb = WorkbookFactory.create(file.getInputStream())) { |
| | | Sheet sheet = wb.getSheetAt(0); |
| | | Map<String, Integer> colMap = buildHeaderMap(sheet.getRow(0)); |
| | | Integer codeCol = colMap.get("æå±å°åº"); |
| | | Integer entCol = colMap.get("ä¼ä¸ä»£ç "); |
| | | Integer nameCol = colMap.get("ä¼ä¸åç§°"); |
| | | Integer passCol = null; |
| | | Integer turnCol = null; |
| | | for (Map.Entry<String, Integer> e : colMap.entrySet()) { |
| | | String k = e.getKey(); |
| | | if (k != null && k.contains("个ä½") && k.contains("客è¿é")) passCol = e.getValue(); |
| | | if (k != null && k.contains("个ä½") && (k.contains("å¨è½¬é") || k.contains("å¨è½¬"))) turnCol = e.getValue(); |
| | | } |
| | | if (passCol == null && turnCol == null) { |
| | | throw new RuntimeException("æªæ¾å°ã个ä½å®¢è¿é/ä¸ªä½æ
客å¨è½¬éãåï¼è¯·æ£æ¥æ¨¡æ¿ï¼ååéå
å«â个ä½å®¢è¿éââ个ä½å¨è½¬éâï¼"); |
| | | } |
| | | for (int r = 1; r <= sheet.getLastRowNum(); r++) { |
| | | Row row = sheet.getRow(r); |
| | | if (row == null) continue; |
| | | String name = nameCol != null ? getString(row, nameCol) : null; |
| | | if (name == null || name.trim().isEmpty()) continue; |
| | | Double pass = passCol != null ? getDecimalOrNull(row, passCol) : null; |
| | | Double turn = turnCol != null ? getDecimalOrNull(row, turnCol) : null; |
| | | if ((pass == null || pass == 0.0) && (turn == null || turn == 0.0)) continue; |
| | | PassengerIndividualMonthly entity = new PassengerIndividualMonthly(); |
| | | entity.setReportPeriod(period); |
| | | entity.setRegionCode(codeCol != null ? getString(row, codeCol) : null); |
| | | entity.setEnterpriseCode(entCol != null ? getString(row, entCol) : null); |
| | | entity.setEnterpriseName(name.trim()); |
| | | entity.setPassengerCount(pass); |
| | | entity.setTurnover(turn); |
| | | rows.add(entity); |
| | | if (colMap.containsKey("ä¼ä¸åç§°")) { |
| | | parsePassengerIndividualEnterprise(sheet, colMap, period, rows); |
| | | } else { |
| | | parsePassengerIndividualCitySheet(sheet, period, rows); |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("Passenger individual parse error", e); |
| | |
| | | recordBatch(file.getOriginalFilename(), "PASSENGER_INDIVIDUAL", period, rows.size(), success, failDetails.size(), errorDetail); |
| | | log.info("Passenger individual imported: {} rows for {}", success, period); |
| | | return new ImportResult(success, failDetails.size(), failDetails); |
| | | } |
| | | |
| | | /** æ§ç个ä½å®¢è¿é模æ¿ï¼ä¼ä¸çº¿ä¸æ±æ¥æç»ï¼æå±å°åº/ä¼ä¸ä»£ç /ä¼ä¸åç§°/â¦ä¸ªä½å®¢è¿é/â¦ä¸ªä½æ
客å¨è½¬éï¼ */ |
| | | private void parsePassengerIndividualEnterprise(Sheet sheet, Map<String, Integer> colMap, String period, |
| | | List<PassengerIndividualMonthly> rows) { |
| | | Integer codeCol = colMap.get("æå±å°åº"); |
| | | Integer entCol = colMap.get("ä¼ä¸ä»£ç "); |
| | | Integer nameCol = colMap.get("ä¼ä¸åç§°"); |
| | | Integer passCol = null; |
| | | Integer turnCol = null; |
| | | for (Map.Entry<String, Integer> e : colMap.entrySet()) { |
| | | String k = e.getKey(); |
| | | if (k != null && k.contains("个ä½") && k.contains("客è¿é")) passCol = e.getValue(); |
| | | if (k != null && k.contains("个ä½") && (k.contains("å¨è½¬é") || k.contains("å¨è½¬"))) turnCol = e.getValue(); |
| | | } |
| | | if (passCol == null && turnCol == null) { |
| | | throw new RuntimeException("æªæ¾å°ã个ä½å®¢è¿é/ä¸ªä½æ
客å¨è½¬éãåï¼è¯·æ£æ¥æ¨¡æ¿ï¼ååéå
å«â个ä½å®¢è¿éââ个ä½å¨è½¬éâï¼"); |
| | | } |
| | | for (int r = 1; r <= sheet.getLastRowNum(); r++) { |
| | | Row row = sheet.getRow(r); |
| | | if (row == null) continue; |
| | | String name = nameCol != null ? getString(row, nameCol) : null; |
| | | if (name == null || name.trim().isEmpty()) continue; |
| | | Double pass = passCol != null ? getDecimalOrNull(row, passCol) : null; |
| | | Double turn = turnCol != null ? getDecimalOrNull(row, turnCol) : null; |
| | | if ((pass == null || pass == 0.0) && (turn == null || turn == 0.0)) continue; |
| | | PassengerIndividualMonthly entity = new PassengerIndividualMonthly(); |
| | | entity.setReportPeriod(period); |
| | | entity.setRegionCode(codeCol != null ? getString(row, codeCol) : null); |
| | | entity.setEnterpriseCode(entCol != null ? getString(row, entCol) : null); |
| | | entity.setEnterpriseName(name.trim()); |
| | | entity.setPassengerCount(pass); |
| | | entity.setTurnover(turn); |
| | | rows.add(entity); |
| | | } |
| | | } |
| | | |
| | | /** æ°çå¸å·æ±æ»æ¨¡æ¿ï¼ãå
¨çNæä¸ªä½å®¢è¿éæ±æ»è¡¨ãæ é¢è¡ â 表头è¡ï¼å¸å·/â¦/个ä½å®¢è¿é/ä¸ªä½æ
客å¨è½¬éï¼â å¸å·æ°æ®è¡ */ |
| | | private void parsePassengerIndividualCitySheet(Sheet sheet, String period, List<PassengerIndividualMonthly> rows) { |
| | | int targetMonth; |
| | | try { |
| | | targetMonth = Integer.parseInt(period.split("-")[1]); |
| | | } catch (Exception e) { |
| | | throw new RuntimeException("æ¥è¡¨ææ ¼å¼åºä¸º yyyy-MMï¼" + period); |
| | | } |
| | | int titleRow = -1; |
| | | for (int r = 0; r <= sheet.getLastRowNum(); r++) { |
| | | Row row = sheet.getRow(r); |
| | | if (row == null) continue; |
| | | String t = getString(row, 0); |
| | | if (t == null || !t.contains("å
¨ç") || !t.contains("æ")) continue; |
| | | java.util.regex.Matcher m = java.util.regex.Pattern.compile("å
¨ç(\\d+)æ").matcher(t); |
| | | if (!m.find()) continue; |
| | | if (Integer.parseInt(m.group(1)) == targetMonth) { titleRow = r; break; } |
| | | if (titleRow < 0) titleRow = r; // æ é¢ä¸å«ç®æ æä»½æ¶æè®°ç¬¬ä¸ä¸ªæ é¢åå
åº |
| | | } |
| | | if (titleRow < 0) { |
| | | throw new RuntimeException("æªæ¾å°ãå
¨çNæä¸ªä½å®¢è¿éæ±æ»è¡¨ãæ é¢åï¼è¯·ä½¿ç¨ã模æ¿_æ¹åçå
¬è·¯æ
客è¿è¾ä¸ªä½æ·æåº¦ç产æ
åµï¼YYYY.Mï¼ãæ´çå导å
¥"); |
| | | } |
| | | Row header = sheet.getRow(titleRow + 1); |
| | | if (header == null) { |
| | | throw new RuntimeException("ãå
¨ç" + targetMonth + "æâ¦æ±æ»è¡¨ãæ é¢å缺å°è¡¨å¤´è¡ï¼å¸å·/个ä½å®¢è¿é/ä¸ªä½æ
客å¨è½¬éï¼"); |
| | | } |
| | | int cityCol = -1, passCol = -1, turnCol = -1; |
| | | for (Cell c : header) { |
| | | String h = FORMATTER.formatCellValue(c).trim(); |
| | | if (h.isEmpty()) continue; |
| | | if (h.contains("å¸å·")) cityCol = c.getColumnIndex(); |
| | | else if (h.contains("个ä½") && h.contains("客è¿é")) passCol = c.getColumnIndex(); |
| | | else if (h.contains("个ä½") && (h.contains("å¨è½¬é") || h.contains("å¨è½¬"))) turnCol = c.getColumnIndex(); |
| | | } |
| | | if (cityCol < 0 || (passCol < 0 && turnCol < 0)) { |
| | | throw new RuntimeException("æªæ¾å°ãå¸å· / 个ä½å®¢è¿é / ä¸ªä½æ
客å¨è½¬éãåï¼è¯·ä½¿ç¨ç³»ç»æ¨¡æ¿æ´çå导å
¥"); |
| | | } |
| | | int lastRow = Math.min(sheet.getLastRowNum(), titleRow + 40); |
| | | for (int r = titleRow + 2; r <= lastRow; r++) { |
| | | Row row = sheet.getRow(r); |
| | | if (row == null) continue; |
| | | String first = getString(row, cityCol); |
| | | if (first == null) break; |
| | | String t = first.trim(); |
| | | if (t.isEmpty() || t.contains("å计") || t.contains("ç¯æ¯") || t.contains("å
¨ç")) break; |
| | | String city = RegionUtil.normalizeCityName(t); |
| | | if (!RegionUtil.cityList().contains(city)) continue; |
| | | Double pass = passCol >= 0 ? getDecimalOrNull(row, passCol) : null; |
| | | Double turn = turnCol >= 0 ? getDecimalOrNull(row, turnCol) : null; |
| | | if ((pass == null || pass == 0.0) && (turn == null || turn == 0.0)) continue; |
| | | PassengerIndividualMonthly entity = new PassengerIndividualMonthly(); |
| | | entity.setReportPeriod(period); |
| | | entity.setRegionCode(RegionUtil.codeOfCity(city)); |
| | | entity.setEnterpriseName(city); |
| | | entity.setPassengerCount(pass); |
| | | entity.setTurnover(turn); |
| | | rows.add(entity); |
| | | } |
| | | } |
| | | |
| | | /** å
¬è·¯æ
å®¢è¿æ¿è½¦è¾æ°ï¼ç¬ç«æ¨¡æ¿ï¼ä¼ä¸ä»£ç /ä¼ä¸åç§°/è½¦è¾æ°/è½½å®¢ä½æ°ï¼ */ |
| | |
| | | /** è½èæç»æ¯ç»åºå®18åï¼è½¦çå·èµ·å§åï¼0-basedï¼ï¼3,21,39,57,75 */ |
| | | private static final int[] ENERGY_GROUP_COLS = {3, 21, 39, 57, 75}; |
| | | |
| | | /** è½èæç»æ¨¡æ¿è¡¨å¤´å
³é®åï¼0-basedï¼ï¼ç¨åºæåºå®åä½è§£æï¼è§£æåæ ¡éªè¡¨å¤´ï¼éä½ç´æ¥æç» */ |
| | | private static final int[] ENERGY_HEADER_COLS = {3, 4, 5, 21, 39, 57, 75}; |
| | | private static final String[] ENERGY_HEADER_KEYWORDS = {"车çå·", "车è¾ç±»å", "çæç±»å", "车çå·", "车çå·", "车çå·", "车çå·"}; |
| | | |
| | | /** è½è导å
¥ææ¥è¡¨æäºæ¥éï¼H204 æç»ä¸è¿æ¿ä¿¡æ¯å
±ç¨ï¼é¿å
åæ¥è¡¨æå¹¶åé导äºç¸è¦çï¼ */ |
| | | private Object energyLock(String period) { |
| | | return energyImportLocks.computeIfAbsent(period == null ? "" : period, k -> new Object()); |
| | |
| | | // sheet0: 第äºå£åº¦è´§è½¦è½èæç»ï¼æ¯è¡å·¦å³å5ç»è½¦è¾ï¼æ¯ç»åºå®18åï¼ |
| | | Sheet sheet = wb.getSheetAt(0); |
| | | requireHeaderKeyword(sheet, "é路货è¿è½¦è¾è½æºæ¶èæ
åµ", "ä¼ä¸åç§°", "车çå·"); |
| | | requireEnergyHeaderLayout(sheet); |
| | | for (int r = 1; r <= sheet.getLastRowNum(); r++) { |
| | | Row row = sheet.getRow(r); |
| | | if (row == null) continue; |
| | |
| | | try (Workbook wb = WorkbookFactory.create(file.getInputStream())) { |
| | | Sheet sheet = wb.getSheetAt(0); |
| | | requireHeaderKeyword(sheet, "è½è车è¾è¿æ¿ä¿¡æ¯", "车çå·"); |
| | | Row authHeader = sheet.getRow(0); |
| | | String authH0 = authHeader == null ? null : FORMATTER.formatCellValue(authHeader.getCell(0)).trim(); |
| | | if (authH0 == null || authH0.isEmpty() || !authH0.contains("车çå·")) { |
| | | throw new RuntimeException("è½è车è¾è¿æ¿ä¿¡æ¯è¡¨å¤´ä¸ç³»ç»æ¨¡æ¿ä¸ä¸è´ï¼ç¬¬ 1 ååºä¸ºã车çå·ãï¼å®é
为ã" |
| | | + (authH0 == null || authH0.isEmpty() ? "空" : authH0) + "ãã请使ç¨ç³»ç»æ¨¡æ¿ã模æ¿_è½è车è¾è¿æ¿ä¿¡æ¯.xlsxãæ´çåå导å
¥"); |
| | | } |
| | | for (int r = 1; r <= sheet.getLastRowNum(); r++) { |
| | | Row row = sheet.getRow(r); |
| | | if (row == null) continue; |
| | |
| | | |
| | | // ========== è¿æ¿è½¦è¾ ========== |
| | | |
| | | /** è¿æ¿è½¦è¾å¯¼å
¥ï¼ä¸ H203-2 ææ¥ä¸è´ï¼æè¡¨å¤´åç§°å®ä½åï¼å顺åºååä¹è½æ£ç¡®å¯¼å
¥ */ |
| | | public int importTransportAuth(MultipartFile file, String period) throws Exception { |
| | | List<TransportAuthVehicle> list = new ArrayList<>(); |
| | | int failRows = 0; |
| | | try (Workbook wb = WorkbookFactory.create(file.getInputStream())) { |
| | | Sheet sheet = wb.getSheetAt(0); |
| | | requireHeaderKeyword(sheet, "è¿æ¿è½¦è¾", "ä¼ä¸åç§°"); |
| | | requireHeaderCols(sheet, "è¿æ¿è½¦è¾", "ä¼ä¸åç§°", "æ»çµå¼è½¦æ°", "æ»æè½¦æ°", "å
¶å®è½¦è¾æ°", "æè½¦æ»å¨ä½(å¨)", "å
¶å®è½¦è¾æ»å¨ä½(å¨)"); |
| | | Map<String, Integer> colMap = buildHeaderMap(sheet.getRow(0)); |
| | | for (int r = 1; r <= sheet.getLastRowNum(); r++) { |
| | | Row row = sheet.getRow(r); |
| | | if (row == null) continue; |
| | | String name = getString(row, 0); |
| | | String name = gs(row, colMap, "ä¼ä¸åç§°"); |
| | | if (name == null || name.trim().isEmpty()) continue; |
| | | TransportAuthVehicle entity = new TransportAuthVehicle(); |
| | | entity.setReportPeriod(period); |
| | | entity.setEnterpriseName(name); |
| | | entity.setTractorCount(getInt(row, 1)); |
| | | entity.setTrailerCount(getInt(row, 2)); |
| | | entity.setOtherCount(getInt(row, 3)); |
| | | entity.setTrailerTons(getDecimal(row, 4)); |
| | | entity.setOtherTons(getDecimal(row, 5)); |
| | | entity.setTractorCount(gi(row, colMap, "æ»çµå¼è½¦æ°")); |
| | | entity.setTrailerCount(gi(row, colMap, "æ»æè½¦æ°")); |
| | | entity.setOtherCount(gi(row, colMap, "å
¶å®è½¦è¾æ°")); |
| | | entity.setTrailerTons(gd(row, colMap, "æè½¦æ»å¨ä½(å¨)")); |
| | | entity.setOtherTons(gd(row, colMap, "å
¶å®è½¦è¾æ»å¨ä½(å¨)")); |
| | | list.add(entity); |
| | | } |
| | | } catch (Exception e) { |
| | |
| | | |
| | | // ========== 轨迹éç¨ ========== |
| | | |
| | | /** 轨迹éç¨å¯¼å
¥ï¼ä¸ H203-2 ææ¥ä¸è´ï¼æè¡¨å¤´åç§°å®ä½åï¼å顺åºååä¹è½æ£ç¡®å¯¼å
¥ */ |
| | | public int importTrackMileage(MultipartFile file, String period) throws Exception { |
| | | List<VehicleTrackMileage> list = new ArrayList<>(); |
| | | int failRows = 0; |
| | | try (Workbook wb = WorkbookFactory.create(file.getInputStream())) { |
| | | Sheet sheet = wb.getSheetAt(0); |
| | | requireHeaderKeyword(sheet, "轨迹éç¨", "ä¼ä¸åç§°"); |
| | | requireHeaderCols(sheet, "轨迹éç¨", "ä¼ä¸åç§°", "æåº¦æ»éç¨(å
¬é)", "æéç¨çè½¦è¾æ°"); |
| | | Map<String, Integer> colMap = buildHeaderMap(sheet.getRow(0)); |
| | | for (int r = 1; r <= sheet.getLastRowNum(); r++) { |
| | | Row row = sheet.getRow(r); |
| | | if (row == null) continue; |
| | | String name = getString(row, 1); |
| | | String name = gs(row, colMap, "ä¼ä¸åç§°"); |
| | | if (name == null || name.trim().isEmpty()) continue; |
| | | VehicleTrackMileage entity = new VehicleTrackMileage(); |
| | | entity.setEnterpriseName(name); |
| | | entity.setMonthlyMileage(getDecimal(row, 2)); |
| | | entity.setTrackedVehicles(getInt(row, 3)); |
| | | entity.setMonthlyMileage(gd(row, colMap, "æåº¦æ»éç¨(å
Ž)")); |
| | | entity.setTrackedVehicles(gi(row, colMap, "æéç¨çè½¦è¾æ°")); |
| | | entity.setReportPeriod(period); |
| | | list.add(entity); |
| | | } |
| | |
| | | if (sheetName.contains("彿")) periodType = "MONTH"; |
| | | else if (sheetName.contains("累计")) periodType = "CUMULATIVE"; |
| | | if (periodType == null) continue; |
| | | |
| | | // æ ¡éª sheet å¸å±ï¼ç¬¬2è¡åºå«ãå¸å·/è§ä¸ä¼ä¸è¿è¾éãï¼ç¬¬3è¡å表头åºå«ãå¨è½¬éãæãè´§è¿éãï¼æ©å±å¸å±ï¼ |
| | | Row headRow = sheet.getRow(1); |
| | | Row subHeadRow = sheet.getRow(2); |
| | | boolean layoutOk = headRow != null |
| | | && getString(headRow, 0) != null && getString(headRow, 0).contains("å¸å·") |
| | | && getString(headRow, 1) != null && getString(headRow, 1).contains("è§ä¸") |
| | | && subHeadRow != null |
| | | && ("è´§è¿é".equals(getString(subHeadRow, 0)) |
| | | || (getString(subHeadRow, 1) != null && getString(subHeadRow, 1).contains("å¨è½¬é"))); |
| | | if (!layoutOk) { |
| | | throw new RuntimeException("æéæ°æ®ç±»åãè§ä¸è§ä¸æåã䏿件å
容ä¸ç¬¦ï¼sheetã" + sheetName |
| | | + "ãæªæ¾å°ãå¸å·/è§ä¸ä¼ä¸è¿è¾é/å¨è½¬éã表头ï¼è¯·ç¡®è®¤æ¯å¦ééäºæ°æ®ç±»å"); |
| | | } |
| | | |
| | | // æ£æµåè¡¨å¤´ï¼æ¯å¦å
å«è´§è¿éåï¼æ©å±å¸å±ï¼ |
| | | Row subHeader = sheet.getRow(2); |
| | |
| | | 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); |
| | | String h1 = header == null ? null : getString(header, 1); |
| | | if (header == null || h0 == null || !h0.contains("è´§è¿é") || h1 == null || !h1.contains("æ")) { |
| | | throw new RuntimeException("æéæ°æ®ç±»åãè´§è¿éå¨è½¬éã䏿件å
容ä¸ç¬¦ï¼è¡¨å¤´åºä¸ºãè´§è¿é(ä¸å¨)/1æâ¦12æãå¸å±ï¼è¯·ç¡®è®¤æ¯å¦ééäºæ°æ®ç±»å"); |
| | | } |
| | | boolean cityRowFound = false; |
| | | for (int r = 1; r <= Math.min(sheet.getLastRowNum(), 30); r++) { |
| | | Row rr = sheet.getRow(r); |
| | |
| | | } |
| | | } |
| | | throw new RuntimeException("æéæ°æ®ç±»åã" + typeLabel + "ã䏿件å
容ä¸ç¬¦ï¼è¡¨å¤´æªå
å«ã" + String.join("ãã", keywords) + "ãçåï¼è¯·ç¡®è®¤æ¯å¦ééäºæ°æ®ç±»å"); |
| | | } |
| | | |
| | | /** è½èæç»è¡¨å¤´å使 ¡éªï¼ç³»ç»æ¨¡æ¿ä¸ºâå3å + 5ç»Ã18åâï¼ç¨åºæåºå®åä½è§£æï¼è¡¨å¤´éä½ä¼å¯¼è´æ´è¡¨éä¹±ï¼é使¶ç´æ¥æç» */ |
| | | private void requireEnergyHeaderLayout(Sheet sheet) { |
| | | Row header = sheet == null ? null : sheet.getRow(0); |
| | | if (header == null) { |
| | | throw new RuntimeException("è½èæç»è¡¨å¤´ç¼ºå¤±ï¼è¯·ä½¿ç¨ç³»ç»æ¨¡æ¿ã模æ¿_é路货è¿è½¦è¾è½æºæ¶èæ
åµï¼2026ï¼.xlsxãæ´çåå导å
¥"); |
| | | } |
| | | for (int i = 0; i < ENERGY_HEADER_COLS.length; i++) { |
| | | int col = ENERGY_HEADER_COLS[i]; |
| | | String keyword = ENERGY_HEADER_KEYWORDS[i]; |
| | | Cell cell = header.getCell(col); |
| | | String hv = cell == null ? null : FORMATTER.formatCellValue(cell).trim(); |
| | | if (hv == null || hv.isEmpty() || !hv.contains(keyword)) { |
| | | throw new RuntimeException("表头ä¸ç³»ç»æ¨¡æ¿ä¸ä¸è´ï¼ç¬¬ " + (col + 1) + " ååºä¸ºã" + keyword + "ãï¼å®é
为ã" |
| | | + (hv == null || hv.isEmpty() ? "空" : hv) + "ãã请使ç¨ç³»ç»æ¨¡æ¿ã模æ¿_é路货è¿è½¦è¾è½æºæ¶èæ
åµï¼2026ï¼.xlsxãæ´çåå导å
¥"); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** éç¨è¡¨å¤´å使 ¡éªï¼ç¨åºæåºå®åä½è§£æï¼è¡¨å¤´éä½ä¼å¯¼è´æ´è¡¨éä¹±ï¼é使¶ç´æ¥æç»å¯¼å
¥ */ |
| | | private void requireHeaderLayout(Sheet sheet, String typeLabel, String templateHint, |
| | | int[] cols, String[] keywords) { |
| | | Row header = sheet == null ? null : sheet.getRow(0); |
| | | if (header == null) { |
| | | throw new RuntimeException("æéæ°æ®ç±»åã" + typeLabel + "ãæä»¶è¡¨å¤´ç¼ºå¤±ï¼è¯·ä½¿ç¨ç³»ç»æ¨¡æ¿ã" + templateHint + "ãæ´çåå导å
¥"); |
| | | } |
| | | for (int i = 0; i < cols.length; i++) { |
| | | int col = cols[i]; |
| | | String keyword = keywords[i]; |
| | | Cell cell = header.getCell(col); |
| | | String hv = cell == null ? null : FORMATTER.formatCellValue(cell).trim(); |
| | | if (hv == null || hv.isEmpty() || !hv.contains(keyword)) { |
| | | throw new RuntimeException("表头ä¸ç³»ç»æ¨¡æ¿ä¸ä¸è´ï¼ç¬¬ " + (col + 1) + " ååºä¸ºã" + keyword + "ãï¼å®é
为ã" |
| | | + (hv == null || hv.isEmpty() ? "空" : hv) + "ããæéæ°æ®ç±»åã" + typeLabel + "ã请使ç¨ç³»ç»æ¨¡æ¿ã" + templateHint + "ãæ´çåå导å
¥"); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** æè¡¨å¤´å称建ç«åå·æ å°ï¼å
¼å®¹æ°æ§æ¨¡æ¿åä½å·®å¼ */ |
| | |
| | | if (name == null || name.isEmpty()) return false; |
| | | String norm = name.replace(" ", ""); |
| | | int month = Integer.parseInt(period.substring(5, 7)); |
| | | String normDash = norm.replace('.', '-'); // "2026.8"/"2026.08" -> "2026-8"/"2026-08" |
| | | return norm.contains(month + "æ") || norm.contains(String.format("%02d", month) + "æ") |
| | | || name.contains(period) || name.contains(period.replace("-0", "-")); |
| | | || name.contains(period) || name.contains(period.replace("-0", "-")) |
| | | || normDash.contains(period) || normDash.contains(period.replace("-0", "-")); |
| | | } |
| | | |
| | | /** è§£æå个å¸å·æ¥è¡¨ï¼é sheetï¼æ¥è¡¨æåä¼å
+ æ°æ®è¡æ°ï¼ï¼æååæ å°æå项ç®è¡ */ |
| | |
| | | if (col == null) continue; |
| | | int cnt = countInvestRows(sh, col); |
| | | int score = cnt + (cnt > 0 && investSheetMatchesPeriod(sh, period) ? 1000000 : 0); |
| | | if (cnt > 0 && investSheetMatchesPeriod(sh, period)) { |
| | | // 彿ç宿¥è¡¨ sheet åé常带年份ï¼å¦ 2026.8/2026å¹´8æï¼ï¼åå²sheetå¤ä¸ºçº¯æä»½åï¼8æï¼ï¼å¸¦å¹´ä»½çä¼å
|
| | | String norm = sh.getSheetName() == null ? "" : sh.getSheetName().replace(" ", ""); |
| | | if (norm.contains(period.substring(0, 4))) score += 100000; |
| | | } |
| | | if (score > bestScore) { |
| | | best = sh; |
| | | bestCol = col; |
| | |
| | | if (seq == null || seq.trim().isEmpty()) { |
| | | // å¸å·å°èè¡ï¼å¦ "æ¦æ±" "天 é¨"ï¼ï¼æ´æ°å½åå¸å· |
| | | String c = investmentCity(nt); |
| | | if (c != null) currentCity = c; |
| | | if (c != null) { currentCity = c; continue; } |
| | | // åºå·ä¸ºç©ºççå®é¡¹ç®è¡ï¼é¨åå¸å·ææ¥ä¸å¡«åºå·ï¼å¦ç¥åæ¶ç©æµåï¼ä¹æé¡¹ç®å¤ç |
| | | if (!isLikelyInvestProjectName(nt)) continue; |
| | | } else if (!seq.trim().matches("\\d+(\\.\\d+)?")) { |
| | | continue; |
| | | } |
| | | if (!seq.trim().matches("\\d+(\\.\\d+)?")) continue; |
| | | } else { |
| | | // æ åºå·åï¼éå·çï¼ï¼é¡¹ç®åé空å³é¡¹ç®è¡ï¼å¸å·å°èè¡ç¨ investmentCity è¯å« |
| | | String c = investmentCity(nt); |
| | |
| | | if (nt.length() > 4) count++; |
| | | } else { |
| | | String seq = cellStr(row, seqCol); |
| | | if (seq != null && seq.trim().matches("\\d+(\\.\\d+)?")) count++; |
| | | if (seq != null && seq.trim().matches("\\d+(\\.\\d+)?")) { |
| | | count++; |
| | | } else if ((seq == null || seq.trim().isEmpty()) && isLikelyInvestProjectName(nt)) { |
| | | count++; |
| | | } |
| | | } |
| | | } |
| | | return count; |
| | |
| | | log.error("load five year project names error", e); |
| | | } |
| | | return names; |
| | | } |
| | | |
| | | /** åºå·ä¸ºç©ºçéå¸å·è¡æ¯å¦å项ç®è¡ï¼é¿åº¦>4 ä¸é夿³¨/说æçæé¡¹ */ |
| | | private boolean isLikelyInvestProjectName(String nt) { |
| | | if (nt == null || nt.length() <= 4) return false; |
| | | if (investmentCity(nt) != null) return false; |
| | | return !nt.startsWith("夿³¨") && !nt.startsWith("说æ") && !nt.startsWith("注ï¼") |
| | | && !nt.startsWith("填表") && !nt.startsWith("å®¡æ ¸") && !nt.startsWith("ç»è®¡") |
| | | && !nt.startsWith("è´è´£"); |
| | | } |
| | | |
| | | /** 项ç®åè§èåï¼å»ç©ºç½/æ¢è¡/æ¬å·å
容/æ ç¹/ã项ç®ãåç¼ï¼ç¨äºåäºäºæ¸
åå¹é
*/ |
| | |
| | | } |
| | | } |
| | | /** æèµç³»ç»å¯¼åºå¯¼å
¥ï¼å®¡æ ¸æ¯å¯¹åºåï¼ï¼åºå®8åï¼è¡å·/åä½/æ¶æ/è®¡åæ»æèµ/èªå¼å§ç´¯è®¡/æ¬å¹´è®¡å/èªå¹´å累计/彿宿 */ |
| | | private static final int[] INVEST_SYSTEM_HEADER_COLS = {0, 1, 2, 3, 4, 5, 6, 7}; |
| | | private static final String[] INVEST_SYSTEM_HEADER_KEYWORDS = |
| | | {"è¡å·", "åä½", "æ¶æ", "è®¡åæ»æèµ", "èªå¼å§å»ºè®¾", "æ¬å¹´è®¡åæèµ", "èªå¹´å", "彿宿æèµ"}; |
| | | |
| | | public int importInvestmentSystem(MultipartFile file, String period) throws Exception { |
| | | List<InvestmentSystem> list = new ArrayList<>(); |
| | | int failRows = 0; |
| | | try (Workbook wb = WorkbookFactory.create(file.getInputStream())) { |
| | | Sheet sheet = wb.getSheetAt(0); |
| | | requireHeaderKeyword(sheet, "æèµç³»ç»å¯¼åº", "项ç®åç§°", "è®¡åæ»æèµ", "åä½"); |
| | | requireHeaderLayout(sheet, "æèµç³»ç»å¯¼åº", "模æ¿_æ¥è¯¢ç»æ(æèµç³»ç»-客è¿+ç©æµ 2026.7).xls", |
| | | INVEST_SYSTEM_HEADER_COLS, INVEST_SYSTEM_HEADER_KEYWORDS); |
| | | for (int r = 1; r <= sheet.getLastRowNum(); r++) { |
| | | Row row = sheet.getRow(r); |
| | | if (row == null) continue; |
| | |
| | | } |
| | | |
| | | /** åå¸å
¬äº¤ææ¥å¯¼å
¥ï¼åå¸å
Œ
±äº¤éæåº¦è¿è¥æ
åµï¼ä¼ä¸çº§æç»ï¼åå
Œ
±æ±½çµè½¦åæ®µï¼ */ |
| | | /** åå¸å
¬äº¤ï¼U203ï¼æ¨¡æ¿å
³é®åä½ï¼0-basedï¼ï¼æå±å°åº/ä¼ä¸ä»£ç /ä¼ä¸åç§°/è¿è¥è½¦æ°/客è¿é/轨é客è¿é/轮渡客è¿é/å¹³åè¿è·/填表人/èç³»çµè¯/æ¥åºæ¥æ */ |
| | | private static final int[] CITY_BUS_HEADER_COLS = {0, 1, 2, 5, 8, 13, 17, 19, 24, 25, 26}; |
| | | private static final String[] CITY_BUS_HEADER_KEYWORDS = |
| | | {"æå±å°åº", "ä¼ä¸ä»£ç ", "ä¼ä¸åç§°", "å
Œ
±æ±½çµè½¦_è¿è¥è½¦æ°", "å
Œ
±æ±½çµè½¦_客è¿é", "轨é交é_客è¿é", |
| | | "åå¸å®¢è¿è½®æ¸¡_客è¿é", "å
Œ
±æ±½çµè½¦å¹³åè¿è·", "填表人", "èç³»çµè¯", "æ¥åºæ¥æ"}; |
| | | |
| | | public ImportResult importCityBus(MultipartFile file, String period) throws Exception { |
| | | List<CityBusRow> rows = new ArrayList<>(); |
| | | try (Workbook wb = WorkbookFactory.create(file.getInputStream())) { |
| | | Sheet sheet = wb.getSheetAt(0); |
| | | Row header = sheet.getRow(0); |
| | | if (header == null || getString(header, 2) == null |
| | | || !getString(header, 2).contains("ä¼ä¸åç§°")) { |
| | | throw new RuntimeException("æªæ¾å°è¡¨å¤´è¡ï¼éå
å« ä¼ä¸åç§° åï¼"); |
| | | } |
| | | requireHeaderLayout(sheet, "åå¸å
¬äº¤", "模æ¿_交ä¼ç»U203表_åå¸å
Œ
±äº¤éæåº¦è¿è¥æ
åµï¼2026å¹´7æï¼.xls", |
| | | CITY_BUS_HEADER_COLS, CITY_BUS_HEADER_KEYWORDS); |
| | | for (int r = 1; r <= sheet.getLastRowNum(); r++) { |
| | | Row row = sheet.getRow(r); |
| | | if (row == null) continue; |
| | |
| | | } |
| | | |
| | | /** 巡游åºç§ææ¥å¯¼å
¥ï¼å¸å·çº§ï¼17 è¡ï¼å«æ ¸å®è¯´æ/䏿¥è¯´æ/ä¿®æ¹è®°å½ï¼ */ |
| | | /** 巡游åºç§ï¼U402ï¼æ¨¡æ¿å
³é®åä½ï¼0-basedï¼ï¼æå±å°åº/ä¼ä¸ä»£ç /ä¼ä¸åç§°/è½½å®¢è½¦æ¬¡æ»æ°/客è¿é/æ
客å¨è½¬é/è¿è¥è½¦è¾æ°/å¹³åè¿è·/填表人/èç³»çµè¯/æ¥åºæ¥æ */ |
| | | private static final int[] CITY_TAXI_HEADER_COLS = {0, 1, 2, 4, 6, 8, 10, 11, 15, 16, 17}; |
| | | private static final String[] CITY_TAXI_HEADER_KEYWORDS = |
| | | {"æå±å°åº", "ä¼ä¸ä»£ç ", "ä¼ä¸åç§°", "è½½å®¢è½¦æ¬¡æ»æ°", "客è¿é", "æ
客å¨è½¬é", "è¿è¥è½¦è¾æ°", |
| | | "巡游åºç§æ±½è½¦å¹³åè¿è·", "填表人", "èç³»çµè¯", "æ¥åºæ¥æ"}; |
| | | |
| | | public ImportResult importCityTaxi(MultipartFile file, String period) throws Exception { |
| | | List<TaxiRow> rows = new ArrayList<>(); |
| | | try (Workbook wb = WorkbookFactory.create(file.getInputStream())) { |
| | | Sheet sheet = wb.getSheetAt(0); |
| | | Row header = sheet.getRow(0); |
| | | if (header == null || getString(header, 2) == null |
| | | || !getString(header, 2).contains("ä¼ä¸åç§°")) { |
| | | throw new RuntimeException("æªæ¾å°è¡¨å¤´è¡ï¼éå
å« ä¼ä¸åç§° åï¼"); |
| | | } |
| | | requireHeaderLayout(sheet, "巡游åºç§", "模æ¿_交è¡ç»U402表-巡游åºç§æ±½è½¦è¿è¥æå¡æ
嵿æ¥(2026).xls", |
| | | CITY_TAXI_HEADER_COLS, CITY_TAXI_HEADER_KEYWORDS); |
| | | for (int r = 1; r <= sheet.getLastRowNum(); r++) { |
| | | Row row = sheet.getRow(r); |
| | | if (row == null) continue; |
| | |
| | | public ResponseEntity<byte[]> exportCityPassengerCitySum(@RequestParam("period") String period, |
| | | @RequestParam(value = "mode", defaultValue = "month") String mode) throws Exception { |
| | | logExport("çæ_åå¸å®¢è¿å®¢è¿éåå¸å·ç´¯è®¡.xlsx", period); |
| | | return buildResponse(reportService.exportCityPassengerCitySum("导å
¥æ¨¡æ¿_åå¸åå¸å·.xlsx", period, mode), "çæ_åå¸å®¢è¿å®¢è¿éåå¸å·ç´¯è®¡.xlsx"); |
| | | return buildResponse(reportService.exportCityPassengerCitySum("çæ_åå¸å®¢è¿å®¢è¿éåå¸å·ç´¯è®¡.xlsx", period, mode), "çæ_åå¸å®¢è¿å®¢è¿éåå¸å·ç´¯è®¡.xlsx"); |
| | | } |
| | | |
| | | /** çæ_åå¸å®¢è¿åå¸å·æç»è¡¨.xlsxï¼åå¸å®¢è¿åå¸å·æç»è¡¨_模æ¿åºç¨¿ï¼ */ |
| | |
| | | public ResponseEntity<byte[]> exportCityPassengerDetailSum(@RequestParam("period") String period, |
| | | @RequestParam(value = "mode", defaultValue = "month") String mode) throws Exception { |
| | | logExport("çæ_åå¸å®¢è¿åå¸å·æç»è¡¨.xlsx", period); |
| | | return buildResponse(reportService.exportCityPassengerCitySum("导å
¥æ¨¡æ¿_åå¸å®¢è¿åå¸å·æç»è¡¨.xlsx", period, mode), "çæ_åå¸å®¢è¿åå¸å·æç»è¡¨.xlsx"); |
| | | return buildResponse(reportService.exportCityPassengerCitySum("çæ_åå¸å®¢è¿åå¸å·æç»è¡¨.xlsx", period, mode), "çæ_åå¸å®¢è¿åå¸å·æç»è¡¨.xlsx"); |
| | | } |
| | | |
| | | /** çæ_åå¸å®¢è¿æ±æ».xlsxï¼å叿±æ»_模æ¿åºç¨¿ï¼ */ |
| | |
| | | .body(data); |
| | | } |
| | | } |
| | | |
| | | |
| | |
| | | totalYoy.put(city, freightCumYoy(ftMap.get(city), month)); |
| | | } |
| | | |
| | | |
| | | // ===== 第äºé¡µï¼å½æï¼æ°æ®ï¼è§ä¸=H2032 彿ãå计=模æ¿_è´§è¿éå¨è½¬é彿åãè§ä¸=å·®å¼ï¼åæ¯=å»å¹´åæ ===== |
| | | Map<String, Map<Integer, Double>> h2032MonthCur = loadH2032FreightByMonth(period); |
| | | String lastYearPeriod = (Integer.parseInt(year) - 1) + period.substring(4); |
| | | Map<String, Map<Integer, Double>> h2032MonthLast = loadH2032FreightByMonth(lastYearPeriod); |
| | | Map<String, Double> monthAbove = new HashMap<>(); |
| | | Map<String, Double> monthBelow = new HashMap<>(); |
| | | Map<String, Double> monthTotal = new HashMap<>(); |
| | | Map<String, Double> monthAboveYoy = new HashMap<>(); |
| | | Map<String, Double> monthBelowYoy = new HashMap<>(); |
| | | Map<String, Double> monthTotalYoy = new HashMap<>(); |
| | | double provMonthAbove = 0.0, provMonthAboveLast = 0.0; |
| | | for (String city : RegionUtil.cityList()) { |
| | | Double ma = monthFreightWan(h2032MonthCur, city, month); |
| | | Double maLast = monthFreightWan(h2032MonthLast, city, month); |
| | | Double mt = freightMonth(ftMap.get(city), month); |
| | | Double mtLast = lastFreightMonth(ftMap.get(city), month); |
| | | if (ma != null) provMonthAbove += ma; |
| | | if (maLast != null) provMonthAboveLast += maLast; |
| | | monthAbove.put(city, ma); |
| | | monthTotal.put(city, mt); |
| | | monthBelow.put(city, mt == null ? null : round(mt - (ma == null ? 0.0 : ma), 4)); |
| | | monthAboveYoy.put(city, growthYoy(ma, maLast)); |
| | | Double mb = monthBelow.get(city); |
| | | Double mbLast = mtLast == null ? null : round(mtLast - (maLast == null ? 0.0 : maLast), 4); |
| | | monthBelowYoy.put(city, growthYoy(mb, mbLast)); |
| | | monthTotalYoy.put(city, freightYoy(ftMap.get(city), month)); |
| | | } |
| | | Double provMonthAboveWan = provMonthAbove == 0.0 ? null : round(provMonthAbove, 4); |
| | | Double provMonthTotal = freightMonth(ftMap.get("æ¹åç"), month); |
| | | Double provMonthBelow = provMonthTotal == null ? null : round(provMonthTotal - provMonthAbove, 4); |
| | | Double provMonthAboveYoy = growthYoy(provMonthAbove == 0.0 ? null : provMonthAbove, provMonthAboveLast); |
| | | Double provMonthTotalLast = lastFreightMonth(ftMap.get("æ¹åç"), month); |
| | | Double provMonthBelowLast = provMonthTotalLast == null ? null |
| | | : round(provMonthTotalLast - provMonthAboveLast, 4); |
| | | Double provMonthBelowYoy = growthYoy(provMonthBelow, provMonthBelowLast); |
| | | Double provMonthTotalYoy = freightYoy(ftMap.get("æ¹åç"), month); |
| | | |
| | | // 以 docs/è´§è¿/çæ_è´§è¿éæå.xlsx 为åºç¨¿ï¼ä¿ç表头/åå¹¶/å宽/æ ·å¼ä¸ Q/R å æ¯å
¬å¼ï¼ä»
æ¿æ¢æ°æ® |
| | | File template = resolveFreightTemplate("çæ_è´§è¿éæå.xlsx"); |
| | | try (InputStream in = new FileInputStream(template); |
| | | XSSFWorkbook wb = new XSSFWorkbook(in)) { |
| | | Sheet sheet = wb.getSheetAt(0); |
| | | sheet.getRow(0).getCell(0).setCellValue(year + "å¹´" + cumRange(month) + "å
¨çåå¸å·ç´¯è®¡å®æå
¬è·¯è´§è¿éæ
åµ"); |
| | | sheet.getRow(22).getCell(0).setCellValue(year + "å¹´" + month + "æå
¨çåå¸å·ç´¯è®¡å®æå
¬è·¯è´§è¿éæ
åµ"); |
| | | sheet.getRow(22).getCell(0).setCellValue(year + "å¹´" + month + "æå
¨çåå¸å·å®æå
¬è·¯è´§è¿éæ
åµ"); |
| | | fillFreightRankBlock(sheet, 3, above, below, total, aboveYoy, belowYoy, totalYoy, |
| | | provAboveWan, provBelow, provTotal, provAboveYoy, provBelowYoy, provTotalYoy); |
| | | fillFreightRankBlock(sheet, 25, above, below, total, aboveYoy, belowYoy, totalYoy, |
| | | provAboveWan, provBelow, provTotal, provAboveYoy, provBelowYoy, provTotalYoy); |
| | | renameRankMonthHeader(sheet, 24); |
| | | fillFreightRankBlock(sheet, 25, monthAbove, monthBelow, monthTotal, |
| | | monthAboveYoy, monthBelowYoy, monthTotalYoy, |
| | | provMonthAboveWan, provMonthBelow, provMonthTotal, |
| | | provMonthAboveYoy, provMonthBelowYoy, provMonthTotalYoy); |
| | | try { |
| | | wb.getCreationHelper().createFormulaEvaluator().evaluateAll(); |
| | | } catch (Exception e) { |
| | |
| | | Map<String, ScaleSplitTransport> cumMap = loadCumulativeMap(period); |
| | | ScaleSplitTransport province = getProvinceCumulative(period); |
| | | |
| | | // 彿ï¼ç¬¬äºé¡µï¼ï¼å¨è½¬éæå表 MONTH è¡ï¼å«å½æåæ¯ï¼ |
| | | Map<String, ScaleSplitTransport> monthTurnover = new HashMap<>(); |
| | | for (ScaleSplitTransport rec : scaleSplitMapper.selectList( |
| | | new LambdaQueryWrapper<ScaleSplitTransport>() |
| | | .eq(ScaleSplitTransport::getPeriodType, "MONTH") |
| | | .eq(ScaleSplitTransport::getReportPeriod, period))) { |
| | | String name = RegionUtil.normalizeCityName(rec.getRegionName()); |
| | | if (name != null) monthTurnover.put(name, rec); |
| | | } |
| | | ScaleSplitTransport provinceMonth = monthTurnover.remove("æ¹åç"); |
| | | |
| | | // 以 docs/è´§è¿/çæ_å¨è½¬éæå.xlsx 为åºç¨¿ï¼ä¿ç表头/åå¹¶/å宽/æ ·å¼ï¼ä»
æ¿æ¢æ°æ®ï¼Q/R å æ¯ä¸ºæ¨¡æ¿ç¼åå¼ï¼ææ°æ°æ®éç® |
| | | File template = resolveFreightTemplate("çæ_å¨è½¬éæå.xlsx"); |
| | | try (InputStream in = new FileInputStream(template); |
| | | XSSFWorkbook wb = new XSSFWorkbook(in)) { |
| | | Sheet sheet = wb.getSheetAt(0); |
| | | sheet.getRow(0).getCell(0).setCellValue(year + "å¹´" + cumRange(month) + "å
¨çåå¸å·ç´¯è®¡å®æå
¬è·¯è´§ç©è¿è¾å¨è½¬éæ
åµ"); |
| | | sheet.getRow(22).getCell(0).setCellValue(year + "å¹´" + month + "æå
¨çåå¸å·ç´¯è®¡å®æå
¬è·¯è´§ç©è¿è¾å¨è½¬éæ
åµ"); |
| | | sheet.getRow(22).getCell(0).setCellValue(year + "å¹´" + month + "æå
¨çåå¸å·å®æå
¬è·¯è´§ç©è¿è¾å¨è½¬éæ
åµ"); |
| | | fillTurnoverRankBlock(sheet, 3, cumMap, province); |
| | | fillTurnoverRankBlock(sheet, 25, cumMap, province); |
| | | renameRankMonthHeader(sheet, 24); |
| | | fillTurnoverRankBlock(sheet, 25, monthTurnover, provinceMonth); |
| | | return toBytes(wb); |
| | | } |
| | | } |
| | |
| | | setFreightCell(row, cumCol + 1, cumYoy); |
| | | } |
| | | |
| | | /** H2032 è§ä¸ææå计ï¼å¨âä¸å¨ï¼ï¼æ è¯¥ææ°æ®è¿å null */ |
| | | private Double monthFreightWan(Map<String, Map<Integer, Double>> byCityMonth, String city, int month) { |
| | | Map<Integer, Double> byMonth = byCityMonth == null ? null : byCityMonth.get(city); |
| | | Double v = byMonth == null ? null : byMonth.get(month); |
| | | return v == null ? null : round(v / 10000.0, 4); |
| | | } |
| | | |
| | | /** 忝 = (æ¬æ-åºæ)/åºæï¼ä»»ä¸æç¼ºå¤±æåºæä¸º 0 è¿å null */ |
| | | private Double growthYoy(Double cur, Double last) { |
| | | if (cur == null || last == null || last == 0.0) return null; |
| | | return (cur - last) / last; |
| | | } |
| | | |
| | | /** æå表第äºé¡µå头ãç´¯è®¡å®æãâã彿宿ãï¼ä»
导åºå
åæ¿æ¢ï¼æ¨¡æ¿æä»¶ä¸æ¹ï¼ */ |
| | | private void renameRankMonthHeader(Sheet sheet, int headerRowIdx) { |
| | | Row row = sheet.getRow(headerRowIdx); |
| | | if (row == null) return; |
| | | for (int col : new int[]{1, 6, 11}) { |
| | | Cell c = row.getCell(col); |
| | | if (c == null || c.getCellType() != CellType.STRING) continue; |
| | | String s = c.getStringCellValue(); |
| | | if (s != null && s.contains("ç´¯è®¡å®æ")) c.setCellValue(s.replace("ç´¯è®¡å®æ", "彿宿")); |
| | | } |
| | | } |
| | | |
| | | /** è´§è¿éæååå¡«å
ï¼æ¨¡æ¿ 1-based r4 èµ·ï¼å
¨ç+17å¸å·ï¼ï¼Q/R å æ¯å
¬å¼ä¿çä¸å¨ */ |
| | | private void fillFreightRankBlock(Sheet sheet, int start, |
| | | Map<String, Double> above, Map<String, Double> below, Map<String, Double> total, |
| | |
| | | /** H2032è§ä¸: city -> month -> è´§è¿é(å¨) */ |
| | | private Map<String, Map<Integer, Double>> loadH2032FreightByMonth(String period) { |
| | | Map<String, Map<Integer, Double>> result = new HashMap<>(); |
| | | String yearPrefix = period.length() >= 4 ? period.substring(0, 4) : null; |
| | | List<H2032EnterpriseMonthly> list = h2032Mapper.selectList(null); |
| | | for (H2032EnterpriseMonthly record : list) { |
| | | if (record.getReportPeriod() == null || record.getReportPeriod().compareTo(period) > 0) continue; |
| | | // H2032 è¡¨åæ¶åæå¾å¹´ææ¥ï¼ç»è®¡å½å¹´è§ä¸å¼æ¶åªå䏿¥è¡¨æåå¹´çè®°å½ï¼é¿å
å»å¹´æ°æ®å å |
| | | if (yearPrefix != null && !record.getReportPeriod().startsWith(yearPrefix)) continue; |
| | | String city = RegionUtil.cityByCode(record.getRegionCode()); |
| | | if (city == null) continue; |
| | | int month = parseMonth(record.getReportPeriod()); |
| | |
| | | /** H2032è§ä¸ç´¯è®¡: city -> è´§è¿é(å¨) */ |
| | | private Map<String, Double> loadH2032FreightCumulative(String period) { |
| | | Map<String, Double> result = new HashMap<>(); |
| | | String yearPrefix = period.length() >= 4 ? period.substring(0, 4) : null; |
| | | List<H2032EnterpriseMonthly> list = h2032Mapper.selectList(null); |
| | | for (H2032EnterpriseMonthly record : list) { |
| | | if (record.getReportPeriod() == null || record.getReportPeriod().compareTo(period) > 0) continue; |
| | | if (yearPrefix != null && !record.getReportPeriod().startsWith(yearPrefix)) continue; |
| | | String city = RegionUtil.cityByCode(record.getRegionCode()); |
| | | if (city == null) continue; |
| | | double freight = record.getFreightTotal() == null ? 0.0 : record.getFreightTotal(); |
| | |
| | | // ç´¯è®¡åæ¯åï¼æ¨¡æ¿ #REF! â åºå
å»å¹´ 1..N æç´¯è®¡åæ¯æ°å¼ï¼ |
| | | fillMidCumYoyColumn(sheet, mid, currentYear, fillMonths, extended ? 27 : 15); |
| | | recalc(wb); |
| | | clearFormulaErrorsAll(wb); // å»å¹´åææç»é¡µæ®ç #REF! 忝å
¬å¼ â æ¸
空 |
| | | return toBytes(wb); |
| | | } |
| | | } |
| | |
| | | title.getCell(0).setCellValue(currentYear + "å¹´1-" + maxMonth + "æå
¨çåå¸å·ç´¯è®¡å®æé路客è¿ç产æ
åµ"); |
| | | } |
| | | } |
| | | // å³åï¼å½æï¼æ é¢ K1 |
| | | if (title != null && title.getCell(10) != null) { |
| | | title.getCell(10).setCellValue(currentYear + "å¹´" + maxMonth + "æå
¨çåå¸å·å®æé路客è¿ç产æ
åµ"); |
| | | } |
| | | // å
¨çè¡ r3ï¼B3/F3 为 SUM å
¬å¼ä¿çï¼D3/H3 忝填å¼ï¼0-based å 3/7ï¼ |
| | | setValOrBlank(sheet, 2, 3, yoyOf(midCumClass(mid, currentYear, "æ¹åç", maxMonth, 0, true), |
| | | midCumClass(mid, currentYear - 1, "æ¹åç", maxMonth, 0, true))); |
| | | setValOrBlank(sheet, 2, 7, yoyOf(midCumClass(mid, currentYear, "æ¹åç", maxMonth, 0, false), |
| | | midCumClass(mid, currentYear - 1, "æ¹åç", maxMonth, 0, false))); |
| | | // å³åå
¨çè¡ N3/R3ï¼å½æåæ¯ï¼L3/P3 为 SUM å
¬å¼ä¿çï¼ |
| | | setValOrBlank(sheet, 2, 13, yoyOf(midClassVal(mid, currentYear, maxMonth, "æ¹åç", 0, true), |
| | | midClassVal(mid, currentYear - 1, maxMonth, "æ¹åç", 0, true))); |
| | | setValOrBlank(sheet, 2, 17, yoyOf(midClassVal(mid, currentYear, maxMonth, "æ¹åç", 0, false), |
| | | midClassVal(mid, currentYear - 1, maxMonth, "æ¹åç", 0, false))); |
| | | // å¸å·è¡ r4-20ï¼B/F 累计å¼ãD/H 忝ï¼C/E/G/I æåå
¬å¼ä¿ç |
| | | List<String> cities = RegionUtil.CITY_LIST; |
| | | for (int i = 0; i < cities.size(); i++) { |
| | |
| | | setValOrBlank(sheet, r0, 3, yoyOf(pass, lastPass)); |
| | | setValOrBlank(sheet, r0, 5, turn == 0 ? null : round(turn, 4)); |
| | | setValOrBlank(sheet, r0, 7, yoyOf(turn, lastTurn)); |
| | | // å³å彿ï¼L/P å¼ãN/R 彿忝ï¼M/O/Q/S æåå
¬å¼ä¿çï¼ |
| | | double mPass = midClassVal(mid, currentYear, maxMonth, city, 0, true); |
| | | double mTurn = midClassVal(mid, currentYear, maxMonth, city, 0, false); |
| | | double mLastPass = midClassVal(mid, currentYear - 1, maxMonth, city, 0, true); |
| | | double mLastTurn = midClassVal(mid, currentYear - 1, maxMonth, city, 0, false); |
| | | setValOrBlank(sheet, r0, 11, mPass == 0 ? null : round(mPass, 4)); |
| | | setValOrBlank(sheet, r0, 13, mPass == 0 ? null : yoyOf(mPass, mLastPass)); |
| | | setValOrBlank(sheet, r0, 15, mTurn == 0 ? null : round(mTurn, 4)); |
| | | setValOrBlank(sheet, r0, 17, mTurn == 0 ? null : yoyOf(mTurn, mLastTurn)); |
| | | } |
| | | recalc(wb); |
| | | return toBytes(wb); |
| | |
| | | setValOrBlank(sheet, r0, 2, yoyOf(pass, lastPass)); |
| | | setValOrBlank(sheet, r0, 5, turn == 0 ? null : round(turn, 4)); |
| | | setValOrBlank(sheet, r0, 6, yoyOf(turn, lastTurn)); |
| | | } |
| | | // ä¸ååï¼å½æï¼ï¼æ é¢è¡9ãæ°æ®è¡11-15ï¼0-based 8ã10-14ï¼ |
| | | Row bottomTitle = sheet.getRow(8); |
| | | if (bottomTitle != null && bottomTitle.getCell(0) != null) { |
| | | bottomTitle.getCell(0).setCellValue(currentYear + "å¹´" + maxMonth + "æä¸å£å¾å®¢è¿éåå¨è½¬é"); |
| | | } |
| | | for (int i = 0; i < names.length; i++) { |
| | | int r0 = 10 + i; |
| | | double pass = midClassVal(mid, currentYear, maxMonth, "æ¹åç", dims[i], true); |
| | | double turn = midClassVal(mid, currentYear, maxMonth, "æ¹åç", dims[i], false); |
| | | double lastPass = midClassVal(mid, currentYear - 1, maxMonth, "æ¹åç", dims[i], true); |
| | | double lastTurn = midClassVal(mid, currentYear - 1, maxMonth, "æ¹åç", dims[i], false); |
| | | setValOrBlank(sheet, r0, 1, pass == 0 ? null : round(pass, 4)); |
| | | setValOrBlank(sheet, r0, 2, pass == 0 ? null : yoyOf(pass, lastPass)); |
| | | setValOrBlank(sheet, r0, 5, turn == 0 ? null : round(turn, 4)); |
| | | setValOrBlank(sheet, r0, 6, turn == 0 ? null : yoyOf(turn, lastTurn)); |
| | | } |
| | | // ä¸ååå æ¯å
¬å¼ç±æ ·ä¾æåä¸ååï¼B$3/F$3ï¼ï¼æ¹å为æ¬åæ»è¡ï¼B$11/F$11ï¼ï¼è¡12-15 |
| | | for (int i = 1; i < names.length; i++) { |
| | | int r0 = 10 + i; |
| | | Row rr = sheet.getRow(r0); |
| | | if (rr == null) continue; |
| | | Cell dc = rr.getCell(3); |
| | | if (dc != null && dc.getCellType() == CellType.FORMULA) { |
| | | dc.setCellFormula("B" + (r0 + 1) + "/B$11"); |
| | | } |
| | | Cell hc = rr.getCell(7); |
| | | if (hc != null && hc.getCellType() == CellType.FORMULA) { |
| | | hc.setCellFormula("F" + (r0 + 1) + "/F$11"); |
| | | } |
| | | } |
| | | recalc(wb); |
| | | return toBytes(wb); |
| | |
| | | fillEnergyTemplateSheet(s, agg); |
| | | } |
| | | recalc(wb); |
| | | clearFormulaErrorsAll(wb); // æ å»å¹´æ°æ®ç忝/å¢éå
¬å¼ #DIV/0! â æ¸
空 |
| | | return toBytes(wb); |
| | | } |
| | | } |
| | |
| | | public byte[] exportCityBusDetail(String period, String mode) throws Exception { |
| | | int year = Integer.parseInt(period.split("-")[0]); |
| | | int month = monthOf(period, mode); |
| | | return exportCityByTemplate("导å
¥æ¨¡æ¿_åå¸å
¬äº¤.xlsx", period, mode, |
| | | return exportCityByTemplate("çæ_åå¸å
¬äº¤å®¢è¿éåå¸å·æç».xlsx", period, mode, |
| | | loadCityBusByMonth(year + "-", month), |
| | | loadCityBusByMonth((year - 1) + "-", month)); |
| | | } |
| | |
| | | public byte[] exportCityTaxiDetail(String period, String mode) throws Exception { |
| | | int year = Integer.parseInt(period.split("-")[0]); |
| | | int month = monthOf(period, mode); |
| | | return exportCityByTemplate("导å
¥æ¨¡æ¿_巡游åºç§.xlsx", period, mode, |
| | | return exportCityByTemplate("çæ_巡游åºç§å®¢è¿éåå¸å·æç».xlsx", period, mode, |
| | | loadCityTaxiByMonth(year + "-", month), |
| | | loadCityTaxiByMonth((year - 1) + "-", month)); |
| | | } |
| | |
| | | int year = Integer.parseInt(period.split("-")[0]); |
| | | int month = monthOf(period, mode); |
| | | Map<Integer, Map<String, double[]>> monthCity = loadCityRailFerryByMonth(year + "-", month); |
| | | File template = resolveTemplate("导å
¥æ¨¡æ¿_轨éã轮渡.xlsx"); |
| | | File template = resolveTemplate("çæ_轨é轮渡客è¿éåå¸å·æç».xlsx"); |
| | | try (InputStream in = new FileInputStream(template); |
| | | XSSFWorkbook wb = new XSSFWorkbook(in)) { |
| | | Sheet sheet = wb.getSheetAt(0); |
| | |
| | | // 轮渡ï¼å®¢è¿éè¡ 13(å
¨ç)/15(æ¦æ±)ï¼ææ 2=轮渡客è¿é 3=轮渡å¨è½¬é |
| | | fillRailFerryBlock(sheet, monthCity, month, new String[][]{{"å
¨ç", "12"}, {"æ¦æ±å¸", "14"}}, 2); |
| | | recalc(wb); |
| | | clearFormulaErrorCells(sheet, 3, sheet.getLastRowNum(), 1, 39); |
| | | fixCityMonthHeaderText(sheet); |
| | | return toBytes(wb); |
| | | } |
| | | } |
| | |
| | | int year = Integer.parseInt(period.split("-")[0]); |
| | | int month = monthOf(period, mode); |
| | | Map<String, double[]> cum = loadCityPassengerCumulative(year + "-", month); |
| | | Map<String, double[]> monthMap = loadCityPassengerMonthMap(year + "-", month); |
| | | File template = resolveTemplate(templateFileName); |
| | | try (InputStream in = new FileInputStream(template); |
| | | XSSFWorkbook wb = new XSSFWorkbook(in)) { |
| | |
| | | List<String> areas = new java.util.ArrayList<>(); |
| | | areas.add("å
¨ç"); |
| | | areas.addAll(RegionUtil.cityList()); |
| | | fillCitySumBlock(sheet, cum, areas, 4, 0); // 客è¿éåºï¼åä½ï¼ä¸äººæ¬¡ï¼POI 0 åºï¼ |
| | | fillCitySumBlock(sheet, cum, areas, 26, 1); // å¨è½¬éåºï¼åä½ï¼ä¸äººæ¬¡å
¬éï¼POI 0 åºï¼ |
| | | fillCitySumBlock(sheet, cum, areas, 4, 0); // 累计客è¿éåºï¼åä½ï¼ä¸äººæ¬¡ï¼POI 0 åºï¼è¡5-22ï¼ |
| | | fillCitySumBlock(sheet, cum, areas, 26, 1); // 累计å¨è½¬éåºï¼åä½ï¼ä¸äººæ¬¡å
¬éï¼POI 0 åºï¼è¡27-44ï¼ |
| | | // å½æåæ é¢ï¼0åºè¡44/66ï¼ä¸æ°æ®ï¼0åºè¡48-65/70-87ï¼ |
| | | Row pTitle = sheet.getRow(44); |
| | | if (pTitle != null && pTitle.getCell(0) != null) { |
| | | pTitle.getCell(0).setCellValue("åå¸å®¢è¿å®¢è¿éåå¸å·" + month + "ææ
åµ"); |
| | | } |
| | | Row tTitle = sheet.getRow(66); |
| | | if (tTitle != null && tTitle.getCell(0) != null) { |
| | | tTitle.getCell(0).setCellValue("åå¸å®¢è¿å®¢è¿å¨è½¬éåå¸å·" + month + "ææ
åµ"); |
| | | } |
| | | fillCitySumBlock(sheet, monthMap, areas, 48, 0); // 彿客è¿éåºï¼è¡49-66ï¼ |
| | | fillCitySumBlock(sheet, monthMap, areas, 70, 1); // 彿å¨è½¬éåºï¼è¡71-88ï¼ |
| | | // 彿åæå/å æ¯å
¬å¼ç±ç´¯è®¡åå¤å¶èæ¥ï¼RANK èå´ä¸å æ¯åæ¯éæ¹æå½æåèªèº«è¡ |
| | | repairCityMonthRankShare(sheet, 50, 66, 49); |
| | | repairCityMonthRankShare(sheet, 72, 88, 71); |
| | | recalc(wb); |
| | | clearFormulaErrorsAll(wb); // æ å»å¹´ç´¯è®¡çå æ¯/å¢éå
¬å¼ #DIV/0! â æ¸
空 |
| | | return toBytes(wb); |
| | | } |
| | | } |
| | |
| | | setDataCell(sheet, rowIdx, 24, 0); |
| | | rowIdx++; |
| | | } |
| | | } |
| | | |
| | | /** 彿åæå/å æ¯å
¬å¼ä¿®æ£ï¼æ¨¡æ¿å½æåç±ç´¯è®¡åå¤å¶èæ¥ï¼RANK èå´ä¸å æ¯åæ¯éæ¹æå½æåèªèº«è¡ */ |
| | | private void repairCityMonthRankShare(Sheet sheet, int firstDataRow1, int lastDataRow1, int provRow1) { |
| | | String[] groups = {"B", "G", "L", "Q"}; |
| | | String[] growth = {"E", "J", "O", "T"}; |
| | | for (int r = firstDataRow1; r <= lastDataRow1; r++) { |
| | | int r0 = r - 1; |
| | | for (int g = 0; g < 4; g++) { |
| | | String base = groups[g]; |
| | | String grow = growth[g]; |
| | | setFormulaIfFormula(sheet, r0, 2 + g * 5, |
| | | "RANK(" + base + r + "," + base + "$" + firstDataRow1 + ":" + base + "$" + lastDataRow1 + ")"); |
| | | setFormulaIfFormula(sheet, r0, 3 + g * 5, base + r + "/" + base + "$" + provRow1); |
| | | setFormulaIfFormula(sheet, r0, 5 + g * 5, |
| | | "RANK(" + grow + r + "," + grow + "$" + firstDataRow1 + ":" + grow + "$" + lastDataRow1 + ")"); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** åå
æ ¼å为å
¬å¼æ¶æ¹åå
¬å¼ï¼æå/å æ¯åï¼ï¼éå
¬å¼åå
æ ¼ä¸å¨ï¼ä¿ææ¨¡æ¿å¼æ ·ï¼ */ |
| | | private void setFormulaIfFormula(Sheet sheet, int rowIdx, int colIdx, String formula) { |
| | | Row row = sheet.getRow(rowIdx); |
| | | if (row == null) return; |
| | | Cell c = row.getCell(colIdx); |
| | | if (c == null || c.getCellType() != CellType.FORMULA) return; |
| | | c.setCellFormula(formula); |
| | | } |
| | | |
| | | /** æå¹´ 1..limit æåå¸å®¢è¿ç´¯è®¡ï¼city â [å
¬äº¤å®¢è¿é,å
¬äº¤å¨è½¬é,åºç§å®¢è¿é,åºç§å¨è½¬é,轨é客è¿é,轨éå¨è½¬é,轮渡客è¿é,轮渡å¨è½¬é]ï¼å«"å
¨ç" */ |
| | |
| | | return cum; |
| | | } |
| | | |
| | | /** æå¹´åæåå¸å®¢è¿æ°æ®ï¼city â 8 ç»´æ°ç»ï¼å£å¾å累计ï¼ï¼å«"å
¨ç"ï¼= month 累计 - (month-1) 累计 */ |
| | | private Map<String, double[]> loadCityPassengerMonthMap(String yearPrefix, int month) { |
| | | Map<String, double[]> cum = loadCityPassengerCumulative(yearPrefix, month); |
| | | if (month <= 1) return cum; |
| | | Map<String, double[]> pre = loadCityPassengerCumulative(yearPrefix, month - 1); |
| | | Map<String, double[]> out = new HashMap<>(); |
| | | for (Map.Entry<String, double[]> e : cum.entrySet()) { |
| | | double[] prev = pre.get(e.getKey()); |
| | | double[] d = new double[8]; |
| | | for (int i = 0; i < 8; i++) { |
| | | d[i] = e.getValue()[i] - (prev == null ? 0 : prev[i]); |
| | | } |
| | | out.put(e.getKey(), d); |
| | | } |
| | | return out; |
| | | } |
| | | |
| | | // ==================== åå¸å®¢è¿ å
¨çæ±æ»ï¼å叿±æ»_模æ¿ï¼ ==================== |
| | | |
| | | /** çæ_åå¸å®¢è¿æ±æ».xlsxï¼ä»¥ å叿±æ»_模æ¿.xlsx 为åºç¨¿ï¼2026 段填åºå
1..N æç´¯è®¡ï¼åæ¯æ¸
空ï¼2025/2024 段ä¿ç模æ¿åå²åèå¼ï¼ */ |
| | |
| | | double taxiPax = prov[2], taxiTurn = prov[3]; |
| | | double railPax = prov[4], railTurn = prov[5]; |
| | | double ferryPax = prov[6], ferryTurn = prov[7]; |
| | | File template = resolveTemplate("导å
¥æ¨¡æ¿_å叿±æ».xlsx"); |
| | | File template = resolveTemplate("çæ_åå¸å®¢è¿æ±æ».xlsx"); |
| | | try (InputStream in = new FileInputStream(template); |
| | | XSSFWorkbook wb = new XSSFWorkbook(in)) { |
| | | Sheet sheet = wb.getSheetAt(0); |
| | |
| | | setDataCell(sheet, r, 2, 0); |
| | | setDataCell(sheet, r, 4, 0); |
| | | } |
| | | // åºé¨åæè¡¨ï¼æ°çå¼ï¼ï¼æ é¢è¡11ï¼0åº10ï¼ãæ°æ®è¡13-19ï¼0åº12-18ï¼ï¼å¡«å½æå®æé |
| | | Row mTitle = sheet.getRow(10); |
| | | if (mTitle != null && mTitle.getCell(0) != null) { |
| | | mTitle.getCell(0).setCellValue(year + "å¹´" + month + "æå
¨ç宿åå¸å®¢è¿éæ
åµ"); |
| | | } |
| | | double[] mProv = loadCityPassengerMonthMap(year + "-", month).getOrDefault("å
¨ç", new double[8]); |
| | | double mBusPax = mProv[0], mBusTurn = mProv[1]; |
| | | double mTaxiPax = mProv[2], mTaxiTurn = mProv[3]; |
| | | double mRailPax = mProv[4], mRailTurn = mProv[5]; |
| | | double mFerryPax = mProv[6], mFerryTurn = mProv[7]; |
| | | setDataCell(sheet, 12, 1, mBusPax + mTaxiPax + mRailPax + mFerryPax); // B13 æ»å®¢è¿é |
| | | setDataCell(sheet, 12, 3, mBusTurn + mTaxiTurn + mRailTurn + mFerryTurn); // D13 æ»å¨è½¬é |
| | | setDataCell(sheet, 13, 1, mBusPax); // B14 åå¸å
¬äº¤ |
| | | setDataCell(sheet, 13, 3, mBusTurn); // D14 |
| | | setDataCell(sheet, 14, 1, mTaxiPax); // B15 åå¸åºç§è½¦ |
| | | setDataCell(sheet, 14, 3, mTaxiTurn); // D15 |
| | | setDataCell(sheet, 15, 1, mTaxiPax); // B16 å
¶ä¸å·¡æ¸¸åºç§ |
| | | setDataCell(sheet, 15, 3, mTaxiTurn); // D16 |
| | | setZeroCell(sheet, 16, 1); // B17 åå¸ç½çº¦è½¦ |
| | | setZeroCell(sheet, 16, 3); // D17 |
| | | setDataCell(sheet, 17, 1, mRailPax); // B18 轨é |
| | | setDataCell(sheet, 17, 3, mRailTurn); // D18 |
| | | setDataCell(sheet, 18, 1, mFerryPax); // B19 轮渡 |
| | | setDataCell(sheet, 18, 3, mFerryTurn);// D19 |
| | | for (int r = 12; r <= 18; r++) { // åæè¡¨ C/E åæ¯ï¼æ ä¸å¹´åææº â æ¸
ç©ºæ ·ä¾ |
| | | setDataCell(sheet, r, 2, 0); |
| | | setDataCell(sheet, r, 4, 0); |
| | | } |
| | | recalc(wb); |
| | | clearFormulaErrorsAll(wb); // æ å»å¹´æ°æ®ç忝å
¬å¼ #DIV/0! â æ¸
空 |
| | | return toBytes(wb); |
| | | } |
| | | } |
| | |
| | | addZipEntry(zos, "çæ_åå¸å
¬äº¤å®¢è¿éåå¸å·æç».xlsx", exportCityBusDetail(period, mode)); |
| | | addZipEntry(zos, "çæ_巡游åºç§å®¢è¿éåå¸å·æç».xlsx", exportCityTaxiDetail(period, mode)); |
| | | addZipEntry(zos, "çæ_轨é轮渡客è¿éåå¸å·æç».xlsx", exportCityRailFerryDetail(period, mode)); |
| | | addZipEntry(zos, "çæ_åå¸å®¢è¿å®¢è¿éåå¸å·ç´¯è®¡.xlsx", exportCityPassengerCitySum("导å
¥æ¨¡æ¿_åå¸åå¸å·.xlsx", period, mode)); |
| | | addZipEntry(zos, "çæ_åå¸å®¢è¿åå¸å·æç»è¡¨.xlsx", exportCityPassengerCitySum("导å
¥æ¨¡æ¿_åå¸å®¢è¿åå¸å·æç»è¡¨.xlsx", period, mode)); |
| | | addZipEntry(zos, "çæ_åå¸å®¢è¿å®¢è¿éåå¸å·ç´¯è®¡.xlsx", exportCityPassengerCitySum("çæ_åå¸å®¢è¿å®¢è¿éåå¸å·ç´¯è®¡.xlsx", period, mode)); |
| | | addZipEntry(zos, "çæ_åå¸å®¢è¿åå¸å·æç»è¡¨.xlsx", exportCityPassengerCitySum("çæ_åå¸å®¢è¿åå¸å·æç»è¡¨.xlsx", period, mode)); |
| | | addZipEntry(zos, "çæ_åå¸å®¢è¿æ±æ».xlsx", exportCityPassengerSummary(period, mode)); |
| | | } |
| | | return bos.toByteArray(); |
| | |
| | | case "cityBusDetail": return exportCityBusDetail(period, mode); |
| | | case "cityTaxiDetail": return exportCityTaxiDetail(period, mode); |
| | | case "cityRailFerryDetail": return exportCityRailFerryDetail(period, mode); |
| | | case "cityPassengerCitySum": return exportCityPassengerCitySum("导å
¥æ¨¡æ¿_åå¸åå¸å·.xlsx", period, mode); |
| | | case "cityPassengerDetailSum": return exportCityPassengerCitySum("导å
¥æ¨¡æ¿_åå¸å®¢è¿åå¸å·æç»è¡¨.xlsx", period, mode); |
| | | case "cityPassengerCitySum": return exportCityPassengerCitySum("çæ_åå¸å®¢è¿å®¢è¿éåå¸å·ç´¯è®¡.xlsx", period, mode); |
| | | case "cityPassengerDetailSum": return exportCityPassengerCitySum("çæ_åå¸å®¢è¿åå¸å·æç»è¡¨.xlsx", period, mode); |
| | | case "cityPassengerSummary": return exportCityPassengerSummary(period, mode); |
| | | default: return null; |
| | | } |
| | |
| | | } catch (Exception e) { |
| | | log.warn("åå¸å®¢è¿æ¨¡æ¿å
¬å¼æ±å¼å¤±è´¥: {}", e.getMessage()); |
| | | } |
| | | clearFormulaErrorCells(sheet, 4, sheet.getLastRowNum(), 3, 39); |
| | | fixCityMonthHeaderText(sheet); |
| | | return toBytes(wb); |
| | | } |
| | | } |
| | | |
| | | /** æ¸
空æ±å¼ç»æä¸ºé误çå
¬å¼åå
æ ¼ï¼æ¨¡æ¿è·¨ç°¿åæ¯å
¬å¼æ®ç #REF! æ¶ç§»é¤å
¬å¼ï¼é¿å
å¯¼åºæ¾ç¤ºéè¯¯ï¼ */ |
| | | private void clearFormulaErrorCells(Sheet sheet, int startRow, int endRow, int startCol, int endCol) { |
| | | for (int r = startRow; r <= endRow; r++) { |
| | | Row row = sheet.getRow(r); |
| | | if (row == null) continue; |
| | | for (int c = startCol; c <= endCol; c++) { |
| | | Cell cell = row.getCell(c); |
| | | if (cell == null || cell.getCellType() != CellType.FORMULA) continue; |
| | | try { |
| | | if (cell.getCachedFormulaResultType() == CellType.ERROR) cell.setBlank(); |
| | | } catch (Exception ignore) { |
| | | // ç¼åç±»å读å失败æ¶å¿½ç¥ |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** æ¸
空工ä½ç°¿å
¨é¨å·¥ä½è¡¨å
æ±å¼ç»æä¸ºé误çå
¬å¼åå
æ ¼ï¼è·¨ç°¿/跨表 #REF!ã缺å»å¹´æ°æ® #DIV/0! çï¼ */ |
| | | private void clearFormulaErrorsAll(XSSFWorkbook wb) { |
| | | for (int i = 0; i < wb.getNumberOfSheets(); i++) { |
| | | Sheet s = wb.getSheetAt(i); |
| | | clearFormulaErrorCells(s, 2, s.getLastRowNum(), 1, 60); |
| | | } |
| | | } |
| | | |
| | | /** åå¸å®¢è¿ç±»æ¨¡æ¿è¡¨å¤´æä»½åè¥ä¸ºæªæ ¼å¼åæ¥æåºåå·ï¼å¦ 46082ï¼ï¼æ¹å为ãYYYYå¹´Mæãææ¬ */ |
| | | private void fixCityMonthHeaderText(Sheet sheet) { |
| | | for (int r = 0; r <= Math.min(sheet.getLastRowNum(), 20); r++) { |
| | | Row row = sheet.getRow(r); |
| | | if (row == null) continue; |
| | | Cell nameCell = row.getCell(0); |
| | | String nameText = nameCell == null ? null : cellText(nameCell); |
| | | if (nameText == null || !nameText.contains("å°åº")) continue; |
| | | for (int c = 2; c <= 40; c += 2) { |
| | | Cell cell = row.getCell(c); |
| | | if (cell == null || cell.getCellType() != CellType.NUMERIC) continue; |
| | | double v = cell.getNumericCellValue(); |
| | | if (v < 40000 || v > 60000) continue; |
| | | java.util.Date d = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(v); |
| | | cell.setCellValue(new java.text.SimpleDateFormat("yyyyå¹´Mæ").format(d)); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** æ¨¡æ¿æä»¶å®ä½ï¼é
ç½®ç®å½ â user.dir â user.dir/.. é级åé */ |
| | | private File resolveTemplate(String fileName) throws Exception { |
| | | return resolveAnyTemplate(templateDir, fileName); |
| | |
| | | passengerIndividual: 'å
¬è·¯æ
客/个ä½å®¢è¿éæ±æ».xlsx', |
| | | energyMonthly: 'è½è/模æ¿_é路货è¿è½¦è¾è½æºæ¶èæ
åµï¼2026ï¼.xlsx', |
| | | energyAuth: 'è½è/模æ¿_è½è车è¾è¿æ¿ä¿¡æ¯.xlsx', |
| | | cityBus: 'åå¸å®¢è¿/导å
¥æ¨¡æ¿_åå¸å
¬äº¤.xlsx', |
| | | cityTaxi: 'åå¸å®¢è¿/导å
¥æ¨¡æ¿_巡游åºç§.xlsx', |
| | | cityBus: 'åå¸å®¢è¿/çæ_åå¸å
¬äº¤å®¢è¿éåå¸å·æç».xlsx', |
| | | cityTaxi: 'åå¸å®¢è¿/çæ_巡游åºç§å®¢è¿éåå¸å·æç».xlsx', |
| | | cityTaxiAuth: 'åå¸å®¢è¿/导å
¥æ¨¡æ¿_åºç§è½¦ä¿¡æ¯(è¿æ¿è½¦è¾ä¿¡æ¯).xlsx', |
| | | investment: 'æèµ/è¾å
¥/客è¿ï¼å®¢è¿ç«ï¼/æ´æ°_7æå®¢è¿ç«æèµæç»è¡¨ï¼å¸å·æ±æ»å¤§è¡¨ï¼ç»é¢å¯¼ï¼.xlsx', |
| | | investmentLogistics: 'æèµ/è¾å
¥/ç©æµï¼ç©æµååºï¼/æ´æ°_7æç©æµç«åºæèµæç».xls', |