| docs/功能测试报告/功能测试报告_导入清空按类型与按钮防误触_2026-09-10.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/功能测试报告/功能测试报告_数据导入清空按钮按报表期清库_2026-09-10.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/工作日结/工作日结_2026-09-10.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/货运/【20230531】湖北省道路货物运输量统计方法(2023年)编制说明.docx | 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/货运/学习笔记_分市州道路货物运输量统计方法_2026-09-10.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| traffic-audit-server/src/main/java/com/trafficaudit/dataimport/controller/DataImportController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| traffic-audit-web/src/views/DataImport.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_µ¼ÈëÇå¿Õ°´ÀàÐÍÓë°´Å¥·ÀÎó´¥_2026-09-10.md
New file @@ -0,0 +1,42 @@ # åè½æµè¯æ¥åï¼æ°æ®å¯¼å ¥é¡µâæ¸ ç©ºæ°æ®âå¢å¼ºï¼æç±»åæ¸ ç©º + æé®ç§»åºå·æ°è¡é²è¯¯è§¦ï¼ 2026-09-10 ## åè½è¯´æ - æ°æ®å¯¼å ¥é¡µå³ä¾§âå¯¼å ¥è¿åº¦âä¾§æ å¨åâå·æ°âæå»æâæ¸ ç©ºâï¼æ¹ä¸ºå¨ä¾§æ æ é¢è¡ä¸æ¹æ°å¢ç¬ç«å±é©æä½åºï¼æµ çº¢åº + è¾¹æ¡ï¼ï¼å å« `el-button type="danger" plain` çâæ¸ ç©ºæ°æ®â¦âæé®ä¸è¯´æâææ¥è¡¨ææ¸ åºï¼ç¨äºæ´æé导âï¼ä¸âå·æ°âç©çåå¼ï¼éä½è¯¯è§¦ã - æ°å¢æ¸ 空弹çªï¼æ¾ç¤ºå½åæ¥è¡¨æï¼éæ©âæ¸ ç©ºè¯¥æ¥è¡¨æå ¨é¨å·²å¯¼å ¥æ°æ®âæâåªæ¸ 空æå®ç±»åâï¼éç±»åæ¶ç¨ `el-select multiple filterable`ï¼æåç»ååºå¯éç±»åå¹¶æ æ³¨âï¼å·²å¯¼å ¥ N è¡/æªå¯¼å ¥ï¼âï¼åºé¨çº¢è²è¦ç¤ºè¯è¯´æä¼åæ¥å é¤å®¡æ ¸ç»æãå·²å®¡æ ¸æ è®°ä¸å¯¼å ¥æ¹æ¬¡ï¼æèµé¡¹ç®ä¸»æ¡£ä¿çï¼ä¸ä¸å¯æ¤éã - å端 `POST /api/import/clear` å¢å å¯éåæ° `types`ï¼éå·åéï¼ï¼ä¸ºç©º = æ¸ ç©ºè¯¥æ¥è¡¨æå ¨é¨ç±»åï¼åè¡ä¸ºä¸åï¼ï¼é空 = åªæ¸ 空æå®æ°æ®ç±»åï¼å¹¶åæ¥æ¸ çå ¶å ³èç audit_result / audit_run / import_batchã ## æ¶åæ¹å¨ - å端 `DataImportService`ï¼`clearPeriod(period, types)` éè½½ï¼æ°å¢éææ å° `CLEAR_TYPE_TO_OP`ï¼ç±»åâæ°æ®è¡¨æä½é®ï¼å表å½å¹¶å»éï¼ã`CLEAR_TYPE_TO_AUDIT`ï¼ç±»åâå®¡æ ¸è§åç±»åï¼ã`CLEAR_TYPE_TO_BATCH`ï¼ç±»åâimportTypeï¼ï¼æ°å¢ `clearTypeData(op, period)` åæ´¾ä¸ `deleteInvestmentMonthly(period, category)`ï¼æèµæåº¦æé¡¹ç®ç±»å«è¿æ»¤ï¼ä» å æ¬ææç»ï¼æèµä¸»æ¡£ä¿çï¼ãè¿å弿°å¢ `scope` ä¸ `types`ï¼ä¾¿äºå端æç¤ºæ¸ 空èå´ã - å端 `DataImportController`ï¼`clearData` å¢å `types` åæ°è§£æï¼ç©ºä¸²/空项忽ç¥ï¼ã - å端 `DataImport.vue`ï¼ç§»é¤ `.side-head-btns` 䏿§ `clearPeriodData()`ï¼æ°å¢ `.side-danger` å±é©æä½åºãæ¸ ç©ºå¼¹çªã`openClearDialog()/clearableGroups()/confirmClear()` ä¸ `clearDialog/clearScope/clearTypes` ç¶æï¼ç¡®è®¤ååèµ°ä¸æ¬¡ `$confirm` äºæ¬¡ç¡®è®¤ï¼æåæç¤ºå¸¦å é¤è¡æ°ã ## æµè¯ç¯å¢ - å端ï¼traffic-audit-server 8090ï¼å«æ¬æ¬¡æ¹å¨ï¼`start-dev.ps1` å¯å¨ï¼PID 21884ï¼å¯å¨æ¶é´ 2026-09-10 08:54:02ï¼å è½½ `target/classes` ææ°ç¼è¯äº§ç©ï¼ã - å端ï¼traffic-audit-web 8080 devï¼`frontend.log` æè¿ä¸æ¬¡ `Compiled successfully in 347ms`ï¼08:53:29ï¼ï¼çæ´æ°å·²çæã - æ°æ®åºï¼æ¬æº MySQL `localhost:3308/traffic_audit`ï¼mysql CLI ç´æ¥æ ¸å¯¹ï¼ç»å½è´¦å· `admin/123456`ã - æµè¯æ°æ®ï¼ä¸æ¬¡æ§æµè¯æ `2099-01 / 2099-02`ï¼ä½¿ç¨ `docs/è´§è¿éå¯¼å ¥çæ°æ®/è´§è¿/2026å¹´1-7ææ¥/é路货ç©è¿è¾æåº¦ç产æ åµï¼2026å¹´6æï¼.xls`ï¼636 è¡ï¼ä¸ 2026-07 åå¸å ¬äº¤æ ·æ¬ï¼çå®æä»½ä» ååå½å¯¹æ¯ï¼ä¸è¢«åå ¥æå é¤ã ## ç¨ä¾è¡¨ | # | ç¨ä¾ | è¾å ¥ | 颿 | å®é | ç»è®º | |---|---|---|---|---|---| | 1 | ç¼è¯ | `mvn -o -q compile` | éè¿ | æ æ¥é | éè¿ | | 2 | æ£å-æç±»åæ¸ ç©º | `POST /import/clear?period=2099-01&types=h2032` | åªå h2032 åå ¶ H2032 å®¡æ ¸ç»æ/æ¹æ¬¡ | dataRows=636ãauditRows=31ãauditRunRows=1ãbatchRows=1ï¼DB æ ¸å¯¹ h2032=0ãH2032 è§åå®¡æ ¸ç»æ=0ãaudit_run(H2032)=0ãæ¹æ¬¡(H2032)=0 | éè¿ | | 3 | é离æ§-å ¶å®ç±»åä¸åå½±å | åä¸ï¼æ¸ h2032 忥 cityBus | cityBus æ°æ®ä¸å®¡æ ¸/æ¹æ¬¡ä¿ç | cityBus ä¸å¡ 142 è¡ãCITY_BUS å®¡æ ¸ 53 è¡ãaudit_run(CITY_BUS)=1ãæ¹æ¬¡(CITY_BUS)=1 åä¿ç | éè¿ | | 4 | é离æ§-å ¶å®æ¥è¡¨æä¸åå½±å | åä¸ï¼æ¥ 2099-02 | 2099-02 æ°æ®ä¸åå½±å | 2099-02 æ°æ®å®å¥½ | éè¿ | | 5 | è´å-éæ³ç±»å | `types=notAType` | æç»å¹¶æç¤º | HTTP 500ï¼`æ¸ ç©ºå¤±è´¥: æªæå®ææçæ°æ®ç±»å` | éè¿ | | 6 | è¾¹ç-ææ+æªç¥æ··å | `types=cityBus,notAType` | å¿½ç¥æªç¥ãæææç±»åæ§è¡ | æåï¼è¿å `scope=types, types=[cityBus,notAType]`ï¼å é¤ 0 è¡ï¼è¯¥ææ æ°æ®ï¼ | éè¿ | | 7 | è¾¹ç-空类åå表 | ä¸ä¼ `types` | æå ¨é¨ç±»åæ¸ ç©ºï¼åè¡ä¸ºï¼ | æåï¼`scope=all` | éè¿ | | 8 | æèµæç±»å« | æå ¥ 2099-01 客è¿ç«åº/ç©æµååºæµè¯è¡åå嫿¸ 空 | åªå 对åºç±»å«ï¼æèµä¸»æ¡£ä¿ç | `types=investment` åªå 客è¿ç«åºã`types=investmentLogistics` åªå ç©æµååºï¼`investment_project` 主档ä¿ç | éè¿ | | 9 | UI-æé®ä½ç½® | æå¼æ°æ®å¯¼å ¥é¡µï¼å±å¼âå¯¼å ¥è¿åº¦â | âå·æ°âææ æ¸ ç©ºï¼æ¸ 空æé®å¨ç¬ç«çº¢è²å±é©åº | ä¸é¢æä¸è´ï¼å¯è®¿é®æ§æ å¯è¯»å°âæ¸ ç©ºæ°æ®â¦âæé®ä¸æç¤ºææ¡ï¼ | éè¿ | | 10 | UI-å¼¹çªé项 | ç¹âæ¸ ç©ºæ°æ®â¦â | å¼¹çªå«æ¥è¡¨æãå ¨é¨/æå®ç±»ååéãç±»åä¸æå¸¦å¯¼å ¥ç¶æ | éä¸âé路货ç©è¿è¾æåº¦ç产æ åµï¼å·²å¯¼å ¥ 636 è¡ï¼âï¼é项æ ç¾ä¸ç¶æä¸è´ | éè¿ | | 11 | UI-ç¡®è®¤æ¸ ç©º | éä¸ h2032 åç¹âç¡®è®¤æ¸ ç©ºâ | äºæ¬¡ç¡®è®¤ â æåæç¤ºå«è¡æ°ãè¿åº¦åâæªå¯¼å ¥â | æç¤ºâå·²æ¸ ç©º 2099-01 æ°æ®ï¼ä¸å¡æ°æ® 636 è¡ãå®¡æ ¸ç»æ 0 è¡ãå¯¼å ¥æ¹æ¬¡ 1 æ¡ï¼å¯ä»¥éæ°å¯¼å ¥âï¼è¿åº¦åâæªå¯¼å ¥â | éè¿ | | 12 | åå½-ç宿份 | æ¸ ç©ºååå¯¹æ¯ | æ åå | 2099-01 æ®ç=0ï¼2026-09=636ã2026-07=636ã2025-07=664 æªåï¼ç宿¹æ¬¡æ»æ° 239 æªå | éè¿ | ## åç°çé®é¢ä¸å¤ç½® - æ åè½æ§ç¼ºé·ãæµè¯ææ°æ®å¨éªè¯ç»æåå·²å ¨é¨æ¸ é¤ï¼æªæ®çã - 说æï¼ä¿çç¹æ§ï¼ï¼ä¸æ¬¡æ¸ 空ä¼å é¤è¯¥æ¥è¡¨æâå ¨é¨ç±»åâçä¸å¡æ°æ®åå®¡æ ¸ç»æ/å·²å®¡æ ¸æ è®°/å¯¼å ¥æ¹æ¬¡ï¼å¼¹çªå·²ç¨çº¢è²ææ¡æç¤ºä¸å¯æ¤éï¼åªæ³æ¸ åä¸ç±»åæ¶ä½¿ç¨âåªæ¸ 空æå®ç±»åâï¼æªå¯¼å ¥çç±»åä»å¯å¾éä½ä¸äº§çå é¤ã - ç¯å¢å¤æ³¨ï¼æ¬æºåº `admin` å¯ç 为 `123456`ï¼`admin123` 卿¬æºä¸å¹é ï¼ã ## ç»è®º - éè¿ãâæ¸ ç©ºæ°æ®â¦âå·²ä»âå·æ°âæç§»åºå¹¶åè§è§é离ï¼å¼¹çªæ¯æææ´æææç±»åæ¸ ç©ºï¼æ¥å£æèå´ç²¾ç¡®å é¤ä¸å¡æ°æ®ãå®¡æ ¸ç»æãå·²å®¡æ ¸æ è®°ä¸å¯¼å ¥æ¹æ¬¡ï¼ä¸å¯¹å ¶å®ç±»åãå ¶å®æ¥è¡¨æä¸ç宿份é¶å½±åã - å¾ ç¨æ·å¨èªå·±æµè§å¨éªæ¶ä¸æ¬¡æé®ä½ç½®ä¸å¼¹çªææ¡ã docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_Êý¾Ýµ¼ÈëÇå¿Õ°´Å¥°´±¨±íÆÚÇå¿â_2026-09-10.md
New file @@ -0,0 +1,41 @@ # åè½æµè¯æ¥åï¼æ°æ®å¯¼å ¥é¡µâå¯¼å ¥è¿åº¦Â·æ¸ 空âæé®ï¼ææ¥è¡¨ææ¸ ç©ºæ°æ®åºï¼ 2026-09-10 ## åè½è¯´æ - æ°æ®å¯¼å ¥é¡µå³ä¾§âå¯¼å ¥è¿åº¦âä¾§æ æ 颿æ°å¢çº¢è²âæ¸ ç©ºâæé®ï¼ä¸âå·æ°âå¹¶åï¼ï¼éä¾§æ å±å¼å¯è§ã - ä½ç¨ï¼ä¸é®æ¸ 空å½åæéæ¥è¡¨æå¨æ°æ®åºä¸çå ¨é¨å·²å¯¼å ¥ä¸å¡æ°æ®ï¼å¹¶åæ¥å é¤è¯¥æ¥è¡¨æçå®¡æ ¸ç»æãå®¡æ ¸éè¿æ è®°ï¼audit_runï¼ä¸å¯¼å ¥æ¹æ¬¡è®°å½ï¼import_batchï¼ï¼ç¨äºæ´æéæ°å¯¼å ¥ï¼æèµé¡¹ç®ä¸»æ¡£ï¼investment_projectï¼ä¿çä¸å¨ã - 交äºï¼ç¹å» â äºæ¬¡ç¡®è®¤å¼¹çªï¼æ é¢å«æ¥è¡¨æï¼æç¤ºä¸å¯æ¤éï¼â 确认åè°ç¨ `POST /api/import/clear?period=yyyy-MM`ï¼æ¸ 空è¿ç¨ä¸æé®è¿å ¥ loading å¹¶ç¦ç¨ï¼æªéæ¥è¡¨æææ£å¨å¯¼å ¥æ¶æé®ç¦ç¨ï¼æååæç¤ºâå·²æ¸ ç©º xxx æ¥è¡¨æçæ°æ®ï¼å¯ä»¥éæ°å¯¼å ¥âå¹¶èªå¨å·æ°å¯¼å ¥è¿åº¦ã ## æ¶åæ¹å¨ - å端 `DataImportService.clearPeriod(period)`ï¼`@Transactional`ï¼å æ ¡éªæ¥è¡¨ææ ¼å¼ï¼åææ¥è¡¨æå é¤ h2032/è¿æ¿è½¦è¾/轨迹éç¨/è§ä¸è§ä¸/è´§è¿éå¨è½¬é/æ å®¢ææ¥/个ä½/æ å®¢è¿æ¿/è½è/è½èè¿æ¿/æèµæåº¦/æèµç³»ç»/åå¸å ¬äº¤/巡游åºç§/åºç§è½¦è¿æ¿/ç½çº¦è½¦æ»æ°/ç½çº¦è½¦è®¢ååè¡¨æ°æ®ï¼å¹¶å é¤è¯¥æ audit_resultãaudit_runãimport_batchï¼è¿åå表å é¤è¡æ°ç»è®¡ã - å端 `DataImportController` æ°å¢ `POST /api/import/clear`ï¼åæ° periodï¼ã - å端 `DataImport.vue`ï¼æ°å¢ `clearing` ç¶æã`clearPeriodData()` æ¹æ³ä¸ä¾§æ æé®/æ ·å¼ã ## æµè¯ç¯å¢ - å端ï¼traffic-audit-server 8090ï¼å«æ¬æ¬¡æ¹å¨ï¼`start-dev.ps1` å¯å¨æåï¼backend.log åºç° `Started TrafficAuditApplication`ï¼ã - å端ï¼traffic-audit-web 8080 devï¼Compiled successfullyï¼ï¼æµè§å¨ä¸º Codex åºç¨å æµè§å¨ï¼`admin` ç»å½ã - æ°æ®åºï¼æ¬æº MySQL `localhost:3308/traffic_audit`ï¼ç¨ mysql CLI ç´æ¥æ ¸å¯¹ã - æµè¯æ°æ®ï¼`docs/è´§è¿éå¯¼å ¥çæ°æ®/è´§è¿/2026å¹´1-7ææ¥/é路货ç©è¿è¾æåº¦ç产æ åµï¼2026å¹´6æï¼.xls`ï¼636 è¡ï¼ï¼å¯¼å ¥å°ä¸æ¬¡æ§æµè¯æ `2099-01`ï¼å ¨ç¨ä¸è§¦ç¢°ä»»ä½ç宿份ã ## ç¨ä¾è¡¨ | # | ç¨ä¾ | è¾å ¥ | 颿 | å®é | ç»è®º | |---|---|---|---|---|---| | 1 | åºçº¿æ£æ¥ | æ¥è¯¢ 2099-01 çæ¹æ¬¡ä¸å®¡æ ¸ç»æ | å为空 | æ¹æ¬¡ 0 æ¡ãå®¡æ ¸ç»æ 0 æ¡ | éè¿ | | 2 | æ£å-å¯¼å ¥ | ä¸ä¼ 6 æè´§è¿ xlsï¼period=2099-01 | æåä¸è¡æ° 636 | è¿åâH2032ææ¥å¯¼å ¥æåï¼å ± 636 æ¡è®°å½âï¼æ¹æ¬¡ 1 æ¡ | éè¿ | | 3 | æ£å-å®¡æ ¸ | `POST /audit/execute?period=2099-01&reportType=H2032` | çæå®¡æ ¸ç»æä¸å·²å®¡æ ¸æ è®° | çæ audit_result 31 è¡ãaudit_run 1 è¡ | éè¿ | | 4 | æ£å-æ¸ ç©ºï¼æ¥å£ï¼ | `POST /import/clear?period=2099-01` | è¿åå é¤ç»è®¡ï¼åºå è¯¥ææ¸ 空 | è¿å dataRows=636ãauditRows=31ãauditRunRows=1ãbatchRows=1ï¼DB ç´æ¥ h2032/audit_result/audit_run/import_batch å为 0 | éè¿ | | 5 | æ£å-æ¸ ç©ºåé导 | 忬¡ä¸ä¼ å䏿件 period=2099-01 | 坿£å¸¸éæ°å¯¼å ¥ | æå 636 æ¡ï¼DB h2032=636ãimport_batch=1 | éè¿ | | 6 | è´å-éæ³æ¥è¡¨æ | `period=abc` | æç»å¹¶æç¤ºæ ¼å¼ | code=500ï¼âæ¸ ç©ºå¤±è´¥: æ¥è¡¨ææ ¼å¼ä¸æ£ç¡®ï¼åºä¸º yyyy-MMâ | éè¿ | | 7 | è¾¹ç-空æ¥è¡¨æ | `period=2098-12`ï¼æ æ°æ®ï¼ | æåä¸å项为 0 | dataRows/auditRows/auditRunRows/batchRows å为 0 | éè¿ | | 8 | UI-æé®åå¨ | æå¼æ°æ®å¯¼å ¥é¡µï¼é 2099-01ï¼å±å¼âå¯¼å ¥è¿åº¦â | æ 颿åºç°âå·æ°/æ¸ ç©ºâï¼è¿åº¦æ¾ç¤º H203-2 å·²å¯¼å ¥ 636 è¡ | ä¸é¢æä¸è´ï¼å¯è®¿é®æ§æ 读å°âæ¸ ç©ºâæé®ä¸âå·²å¯¼å ¥ 636 è¡âï¼ | éè¿ | | 9 | UI-äºæ¬¡ç¡®è®¤ | ç¹âæ¸ ç©ºâ | å¼¹åºç¡®è®¤æ¡ï¼æ é¢å«æ¥è¡¨æ | å¼¹çªæ é¢âæ¸ ç©º 2099-01 æ°æ®âï¼æ£ææç¤ºä¸å¯æ¤éï¼æé®âåæ¶/ç¡®è®¤æ¸ ç©ºâ | éè¿ | | 10 | UI-ç¡®è®¤æ¸ ç©º | ç¹âç¡®è®¤æ¸ ç©ºâ | æç¤ºæåãè¿åº¦å ¨é¨åâæªå¯¼å ¥âãåºå æ¸ ç©º | æç¤ºâå·²æ¸ ç©º 2099-01 æ¥è¡¨æçæ°æ®ï¼å¯ä»¥éæ°å¯¼å ¥âï¼è¿åº¦å ¨é¨æªå¯¼å ¥ï¼DB ç´æ¥å表å为 0 | éè¿ | | 11 | åå½-ç宿份ä¸åå½±å | æ¸ ç©ºååå¯¹æ¯æ¹æ¬¡åå¸ä¸åºå è¡æ° | ç宿份æ åå | æ¹æ¬¡åå¸ä¸æ¹å¨åå®å ¨ä¸è´ï¼2025 åæ 1 æ¡ã2026-07 45 æ¡ã2026-08 48 æ¡ã2026-09 7 æ¡ï¼ï¼h2032ï¼2025-07=664ã2026-07=636ã2026-09=636 | éè¿ | ## åç°çé®é¢ä¸å¤ç½® - æªåç°åè½ç¼ºé·ã - 说æï¼ä¸æ¬¡æ¸ 空ä¼å é¤è¯¥æ¥è¡¨æâå ¨é¨ç±»åâçä¸å¡æ°æ®åå®¡æ ¸ç»æ/å·²å®¡æ ¸æ è®°ï¼å¼¹çªå·²æç¡®æç¤ºä¸å¯æ¤éï¼è¥åªæ³æ¸ åä¸ç±»åï¼ç®åéæ´ææ¸ 空åé导ï¼å¯ä½ä¸ºåç»å¢å¼ºï¼æç±»åæ¸ ç©ºï¼ã - ç¯å¢å¤æ³¨ï¼æ¬æºåº `admin` å¯ç 为 `123456`ï¼è§ docs/äº¤æ¥ææ¡£-20260831.mdï¼8/31 宿µï¼ï¼`admin123` 卿¬æºä¸å¹é ã ## ç»è®º - éè¿ãæ¸ ç©ºæé®å¨çé¢å¯ç¨ã确认弹çªè¯ä¹æ¸ æ°ï¼æ¥å£ææ¥è¡¨æå®æ´æ¸ é¤ä¸å¡æ°æ®ãå®¡æ ¸ç»æãå®¡æ ¸æ è®°ä¸å¯¼å ¥æ¹æ¬¡ï¼æ¸ 空åå¯ç«å³æ´æé导ï¼å¯¹çå®æä»½æ°æ®é¶å½±åã - å¾ ç¨æ·å®é æµè§å¨éªæ¶ï¼å¨èªå·±å·¥ä½æºä¸ç¹ä¸æ¬¡âæ¸ ç©ºâï¼å»ºè®®å 确认æéæ¥è¡¨æä¸å¤ä»½ï¼ç¡®è®¤å¼¹çªææ¡ä¸é¢æä¸è´ã docs/¹¤×÷ÈÕ½á/¹¤×÷ÈÕ½á_2026-09-10.md
New file @@ -0,0 +1,77 @@ # 工使¥ç» 2026-09-10 ## ä¸åï¼2026-09-10ï¼æ°æ®å¯¼å ¥é¡µæ°å¢âæ¸ ç©ºï¼ææ¥è¡¨ææ¸ åºï¼âå¹¶å®æç«¯å°ç«¯éªè¯ ### 宿å 容 - æ°æ®å¯¼å ¥é¡µå³ä¾§âå¯¼å ¥è¿åº¦âä¾§æ æ 颿æ°å¢çº¢è²âæ¸ ç©ºâæé®ï¼ä¸é®æ¸ 空æéæ¥è¡¨æå¨æ°æ®åºä¸çå ¨é¨å·²å¯¼å ¥æ°æ®ï¼å¹¶åæ¥å é¤è¯¥æå®¡æ ¸ç»æãå®¡æ ¸éè¿æ è®°ï¼audit_runï¼ä¸å¯¼å ¥æ¹æ¬¡ï¼import_batchï¼ï¼ç¨äºæ´æéå¯¼ï¼æèµé¡¹ç®ä¸»æ¡£ä¿çã - å端æ°å¢ `DataImportService.clearPeriod(period)`ï¼`@Transactional` + æ¥è¡¨ææ ¼å¼æ ¡éª + å é¤è¡æ°ç»è®¡ï¼ä¸ `POST /api/import/clear`ï¼è¦ç h2032/è¿æ¿è½¦è¾/轨迹éç¨/è§ä¸è§ä¸/è´§è¿éå¨è½¬é/æ å®¢ææ¥/个ä½/æ å®¢è¿æ¿/è½è/è½èè¿æ¿/æèµæåº¦/æèµç³»ç»/åå¸å ¬äº¤/巡游åºç§/åºç§è½¦è¿æ¿/ç½çº¦è½¦æ»æ°/ç½çº¦è½¦è®¢å ç表ã - å端交äºï¼äºæ¬¡ç¡®è®¤å¼¹çªï¼æ é¢å«æ¥è¡¨æãæç¤ºä¸å¯æ¤éï¼ãæ¸ ç©ºä¸ loading/ç¦ç¨ãæªéæ¥è¡¨ææå¯¼å ¥ä¸ç¦ç¨ãæååèªå¨å·æ°å¯¼å ¥è¿åº¦ã ### æµè¯ç»ææè¦ - 䏿¬¡æ§æµè¯æ 2099-01 å ¨æµç¨ï¼å¯¼å ¥ 636 è¡ â å®¡æ ¸çæ audit_result 31 è¡/audit_run 1 è¡ â çé¢ç¹âæ¸ ç©ºâ确认 â è¿å dataRows=636/auditRows=31/auditRunRows=1/batchRows=1ï¼DB ç´æ¥åè¡¨å ¨ 0 â åå¯¼å ¥ä» 636 è¡æåã - UI 宿µï¼Codex åºç¨å æµè§å¨ï¼admin ç»å½ï¼ï¼æé®æ¾ç¤ºæ£å¸¸ï¼å¼¹çªæ é¢âæ¸ ç©º 2099-01 æ°æ®âï¼ç¡®è®¤åæç¤ºâå·²æ¸ ç©º 2099-01 æ¥è¡¨æçæ°æ®âï¼è¿åº¦å ¨é¨åâæªå¯¼å ¥âã - ååç¨ä¾ï¼éæ³æ¥è¡¨æ `abc` 被æå¹¶æç¤ºæ ¼å¼ï¼ç©ºæ¥è¡¨æ `2098-12` è¿åå ¨ 0 æåã - åå½ï¼æ¸ 空ååçå®æä»½æ¹æ¬¡åå¸ä¸åºå è¡æ°å®å ¨ä¸è´ï¼2025-07=664ã2026-07=636ã2026-09=636 çï¼ï¼é¶å½±åã - å端 `start-dev.ps1` å¯å¨å°±ç»ªï¼backend.log `Started TrafficAuditApplication`ï¼ï¼å端 dev Compiled successfullyã - æµè¯æ¥åï¼docs/åè½æµè¯æ¥å/åè½æµè¯æ¥å_æ°æ®å¯¼å ¥æ¸ 空æé®ææ¥è¡¨ææ¸ åº_2026-09-10.mdã ### éçé®é¢ä¸å¾ å - å¾ ç¨æ·å®é æµè§å¨éªæ¶âæ¸ ç©ºâæé®ï¼å»ºè®®å 确认æéæ¥è¡¨æä¸å¤ä»½ï¼ï¼å¦éåªæ¸ æä¸æ°æ®ç±»åï¼å¯åç»åâæç±»åæ¸ ç©ºâã - æ²¿ç¨æ¨æ¥æªå¨å¾ åï¼æ±æ»å¤§è¡¨ M3ï¼ç½çº¦è½¦å°è´¦åæ°ãè´§è¿é¡µ FreightCalc è§ä¸/è§ä¸ãåå¸å®¢è¿/ä¸å£å¾åæé¡µï¼ä¸â9 æ+æ æ¯çèªå¨æ©åâï¼8 æä»ç¼º 4 ç±»æºæ°æ®è¡¨è¡ï¼freight_turnover_importãscale_split_transportãpassenger_individual_monthlyãç½çº¦è½¦æåè¾å ¥ï¼ã ## ä¸åï¼2026-09-10ï¼æ¸ 空åè½å¢å¼ºï¼æ¯ææç±»åæ¸ ç©º + æ¸ ç©ºæé®ç§»åºâå·æ°âé²è¯¯è§¦ ### 宿å 容 - ç¨æ·åé¦âæ¸ ç©ºæ¾å¨å·æ°æè¾¹æè¯¯è§¦âï¼ä¸éè¦è½åªæ¸ æä¸æ°æ®ç±»åï¼ææ¸ ç©ºä»ä¾§æ æ é¢è¡ï¼å·æ°æï¼ç§»é¤ï¼æ¹å°æ é¢è¡ä¸æ¹ç¬ç«çº¢è²å±é©æä½åºï¼æµ çº¢åº + è¾¹æ¡ï¼âæ¸ ç©ºæ°æ®â¦âæé® + æç¤ºâææ¥è¡¨ææ¸ åºï¼ç¨äºæ´æé导âï¼ï¼ä¸å·æ°ç©çéå¼ã - æ°å¢æ¸ 空弹çªï¼åéâæ¸ ç©ºå ¨é¨ / åªæ¸ 空æå®ç±»åâï¼æå®ç±»åç¨å¤é䏿并æåç»ååºãæ ç¾å¸¦âï¼å·²å¯¼å ¥ N è¡/æªå¯¼å ¥ï¼âï¼åºé¨çº¢è²è¦ç¤ºè¯´æä¼åæ¥å å®¡æ ¸ç»æãå·²å®¡æ ¸æ è®°ãå¯¼å ¥æ¹æ¬¡ï¼æèµé¡¹ç®ä¸»æ¡£ä¿çï¼ä¸ä¸å¯æ¤éï¼ç¡®è®¤ååèµ°ä¸æ¬¡äºæ¬¡ç¡®è®¤ã - å端 `POST /api/import/clear` å¢å å¯é `types`ï¼éå·åéï¼ï¼ç©º=æ´æå ¨æ¸ ï¼åè¡ä¸ºä¸åï¼ï¼é空=åªæ¸ æå®ç±»åï¼å¹¶åæ¥æ¸ çå ³è audit_result/audit_run/import_batchï¼è¿åå¼å¢å `scope` ä¸ `types`ãæ°å¢ç±»åâ表/å®¡æ ¸ç±»å/æ¹æ¬¡ç±»åä¸å¼ éææ å°ä¸ `clearTypeData` åæ´¾ï¼æèµæåº¦æé¡¹ç®ç±»å«è¿æ»¤ï¼ä¸»æ¡£ä¿çï¼ã ### æµè¯ç»ææè¦ - ç¨ä¸æ¬¡æ§æµè¯æ 2099-01/2099-02 éªè¯ï¼æ¸ h2032 â dataRows=636ãauditRows=31ãauditRunRows=1ãbatchRows=1ï¼DB æ ¸å¯¹å表对åºè®°å½å ¨ 0ï¼åæç cityBus ä¸å¡ 142 è¡ãCITY_BUS å®¡æ ¸ 53 è¡ãaudit_run 䏿¹æ¬¡åä¿çï¼2099-02 æ°æ®ä¸åå½±åã - è´åï¼`types=notAType` â 500âæªæå®ææçæ°æ®ç±»åâï¼ææ+æªç¥æ··å â å¿½ç¥æªç¥ææææ§è¡ï¼ä¸ä¼ types â æ´æå ¨æ¸ ã - æèµç±»å«ï¼`types=investment` åªå 客è¿ç«åºã`types=investmentLogistics` åªå ç©æµååºï¼æèµä¸»æ¡£ä¿çã - UI 宿µï¼åºç¨å æµè§å¨ï¼admin ç»å½ï¼ï¼âå·æ°âæå·²æ æ¸ ç©ºï¼æ°å±é©åºæé®ä¸å¼¹çªææ¡æ£å¸¸ï¼éä¸âé路货ç©è¿è¾æåº¦ç产æ åµï¼å·²å¯¼å ¥ 636 è¡ï¼â确认åæç¤ºâå·²æ¸ ç©º 2099-01 æ°æ®ï¼ä¸å¡æ°æ® 636 è¡ãå®¡æ ¸ç»æ 0 è¡ãå¯¼å ¥æ¹æ¬¡ 1 æ¡ï¼å¯ä»¥éæ°å¯¼å ¥âï¼è¿åº¦åâæªå¯¼å ¥âã - åå½ï¼æµè¯ææ æ®çï¼ç宿份 2026-09=636ã2026-07=636ã2025-07=664 ä¸ç宿¹æ¬¡æ»æ° 239 åæªåã - å端 `mvn -o -q compile` éè¿ï¼æå¡å·²éå¯ï¼PID 21884ï¼08:54 å¯å¨ï¼ï¼å端 dev `Compiled successfully`ã - æµè¯æ¥åï¼docs/åè½æµè¯æ¥å/åè½æµè¯æ¥å_å¯¼å ¥æ¸ ç©ºæç±»å䏿é®é²è¯¯è§¦_2026-09-10.mdã ### éçé®é¢ä¸å¾ å - å¾ ç¨æ·å¨èªå·±æµè§å¨éªæ¶æ°æé®ä½ç½®ä¸å¼¹çªææ¡ï¼å¦ä»è§å¾å±é©åºå¤ªæ¾ç¼å¯åæ¶è¿âæ´å¤æä½âæå ã - æ²¿ç¨æªå¨å¾ åï¼æ±æ»å¤§è¡¨ M3ï¼ç½çº¦è½¦å°è´¦åæ°ãè´§è¿é¡µ FreightCalc è§ä¸/è§ä¸ãåå¸å®¢è¿/ä¸å£å¾åæé¡µï¼ä¸â9 æ+æ æ¯çèªå¨æ©åâï¼8 æä»ç¼º 4 ç±»æºæ°æ®è¡¨è¡ï¼freight_turnover_importãscale_split_transportãpassenger_individual_monthlyãç½çº¦è½¦æåè¾å ¥ï¼ã ## éï¼æäº¤ - æ¬æ¬¡æ¹å¨ 3 ä¸ªä»£ç æä»¶ + åè½æµè¯æ¥å䏿¥ç»ï¼æè§èå `git fetch gitea/origin` 对æ¯åå¹¶ï¼å commit å¹¶å端æ¨éï¼gitea mainã个人 gitee masterï¼ã ## æé´ï¼2026-09-10ï¼ä¸å¡å¦ä¹ ï¼åå¸å·è´§è¿éç»è®¡æ¹æ³ç¼å¶è¯´æå½æ¡£ ### 宿å 容 - è§£æç¨æ·æä¾ç `ã20230531ãæ¹åçé路货ç©è¿è¾éç»è®¡æ¹æ³ï¼2023å¹´ï¼ç¼å¶è¯´æ.docx`ï¼2023å¹´5æç¼å¶ï¼æ£æçº¦ 3494 å + 45 å¤ OMML å ¬å¼ï¼ï¼æ´ç为å¯ç´æ¥æ¥é çå¦ä¹ ææ¡£ï¼ `docs/è´§è¿/å¦ä¹ ç¬è®°_åå¸å·é路货ç©è¿è¾éç»è®¡æ¹æ³_2026-09-10.md` - åæ docx ä¸å¹¶å½æ¡£å° `docs/è´§è¿/`ï¼ä¾¿äºå¢éåç»å¯¹ç §ã - ç¬è®°å 容ï¼è§ä¸/è§ä¸çå®ãåºæï¼2021å¹´9æï¼éå¹´æ»å¨ï¼ç¡®å®æ¹æ³ãé«é/å½çé/è¿åä¸ç±»æ³¢å¨ç³»æ°ä¸ 0.5/0.3/0.2 å æãè§ä¸è§ä¸ååå¹´åº¦åæ¢çåºæåºæ°è°æ´ãä¸ççº§æ°æ®è¡æ¥ç¼©æ¾ãå¸å·é´å¢éåè°æ§è°æ´ï¼1.5Ï å ãæåä¸åï¼ãææ°å¢é忍ç»å¯¹éå¹¶äºæ¬¡è¡æ¥ï¼å¦é宿´æµç¨ä¸²èã符å·å¯¹ç §è¡¨ã常è§çé®ä¸ 45 å¤å ¬å¼æ¸ åã ### ææ¯å¤æ³¨ - åæå ¬å¼æ¯ Word å ¬å¼å¯¹è±¡ï¼OMMLï¼ï¼å¨ Word 䏿£æå¯¹åºä½ç½®ä¸ºç©ºç½ï¼ç´æ¥çå®¹ææ¼ï¼å·²ç¨èæ¬æ `m:oMath` è¿åæå¯è¯»å ¬å¼ï¼å«åå¼ãä¸ä¸æ ãæ±å符å·ï¼ï¼ç¡®è®¤æ«å¼ä¸º `H_i''' = H_i'' à H / âH_i''`ã ### éçé®é¢ä¸å¾ å - æ ¹ç®å½çä¸çè§£æä¸´æ¶æä»¶ `doc_extract.txt`ã`doc_extract2.txt`ã`tmp_extract.py` æªç»ç¨æ·åæä¸å é¤ï¼å¾ ç¡®è®¤åæ¸ çã - æ²¿ç¨æªå¨å¾ åï¼æ±æ»å¤§è¡¨ M3ï¼ç½çº¦è½¦å°è´¦åæ°ãè´§è¿é¡µ FreightCalc è§ä¸/è§ä¸ãåå¸å®¢è¿/ä¸å£å¾åæé¡µï¼ä¸ã9 æ+æ æ¯çèªå¨æ©åãï¼8 æä»ç¼º 4 ç±»æºæ°æ®è¡¨è¡ã ## æé´ï¼2026-09-10ï¼ææ¡£æ´çï¼`åºç.docx` 修订ï¼è¡¨æ ¼è¿å + æè¯¯æ°æ®ä¿®æ£ï¼ ### 宿å 容 - ç¨æ·æä¾ç `D:\æ¡é¢\åºç.docx` åå¨ç»ææ§ç¼ºé·ï¼90 段è½ã**0 个çå®è¡¨æ ¼**ï¼å ¨é¨è¡¨æ ¼å®ä¸º Markdown 管éç¬¦ææ¬è¡ï¼`| a | b |`ï¼ï¼å¨ Word ä¸ä¸å¯é 读ã - å·²é建为è§èææ¡£ï¼`D:\æ¡é¢\åºç_修订_2026-09-10.docx`ï¼46 段è½ã**8 个 Word çè¡¨æ ¼**ï¼ã - è¡¨æ ¼ 1ï¼å¸å·æ±æ»è¡¨ 9 è¡ Ã 9 åï¼è¡¨æ ¼ 2-8ï¼7 个å¸å·çä¼ä¸æç»è¡¨ï¼å 4 è¡ Ã 7 åã - æ ¼å¼ï¼å线边æ¡ï¼7F7F7F / 4ptï¼ã表头åºçº¹ F2F2F2ãåå æ ¼æ°´å¹³å± ä¸ãå宽æ mm æå®ãåå· 8ptï¼å¸å·è¡¨ï¼/ 8.5ptï¼ä¼ä¸è¡¨ï¼ã - æ°å¢ Heading 1 æ é¢ï¼7 个å¸å·åï¼æ¦æ± / é»ç³ / 宿 / è¥é³ / èå· / é»å / å¸å®ï¼å¥ç¨ Heading 3ï¼Heading 1/2/3 åä½è²ç»ä¸ä¸ºé»è²ã - åæ¥ä¿®æ£ 4 å¤æè¯¯å å®¹ï¼æ¦æ± `+0.57%`->`+0.6%`ï¼é»ç³"éä»·è离"表述æ¹ä¸º"è´§éä¸å¨è½¬éèµ°å¿ä¸ååæææ¾"ï¼å®æå·®å¼è¦çç表述éåï¼>=30% ç 50 å®¶ï¼è¦ç 100%ï¼å ¶ä¸ 29 å®¶ >=100%ï¼8 æå·®å¼ç +77.0% å± å ¨ç第äºï¼ï¼é»åæ°åå£å¾ä¿®æ£ï¼>=30% ç 49 å®¶ã>=100% ç 39 å®¶å 75% å ¨çæé«ï¼8 æå·®å¼ç +120.2%ï¼ã - çæèæ¬ `_fix_docx.py`ï¼åæä»¶ `D:\æ¡é¢\åºç.docx` ä¿æä¸å¨ã ### æµè¯ç»ææè¦ï¼æ¸²æ + è§è§æ ¡éªï¼ - æ¬æºæ LibreOfficeï¼æ¹ç¨ Word COM å¯¼åº PDFï¼`_render_check\publish_rev.pdf`ï¼ï¼åç¨ pypdfium2 转 150 DPI PNG éé¡µç®æ£ã - 6 页ï¼page01-page06ï¼å ¨é¨æ¸²ææ£å¸¸ï¼è¡¨æ ¼æ è¶çãæ æåè£åãæ æé¡µå¼å¸¸ï¼æªåç°é®é¢ã ### éçé®é¢ä¸å¾ å - å¾ ç¨æ·ç¡®è®¤ 4 夿åä¿®æ£å£å¾æ¯å¦å¯æ¥åï¼å¦è¿æå ¶ä»"æè¯¯çé¨å"éåæ¹ã - 渲æä¸´æ¶ç®å½ `_render_check\` ä¸èæ¬ `_fix_docx.py`ã`_word2pdf.ps1` æªç»ç¨æ·åæä¸å é¤ã - æ²¿ç¨æªå¨å¾ åï¼æ±æ»å¤§è¡¨ M3ï¼ç½çº¦è½¦å°è´¦åæ°ãè´§è¿é¡µ FreightCalc è§ä¸/è§ä¸ãåå¸å®¢è¿/ä¸å£å¾åæé¡µï¼ä¸ã9 æ+æ æ¯çèªå¨æ©åãï¼8 æä»ç¼º 4 ç±»æºæ°æ®è¡¨è¡ã docs/»õÔË/¡¾20230531¡¿ºþ±±Ê¡µÀ·»õÎïÔËÊäÁ¿Í³¼Æ·½·¨£¨2023Ä꣩±àÖÆËµÃ÷.docxBinary files differ
docs/»õÔË/ѧϰ±Ê¼Ç_·ÖÊÐÖݵÀ·»õÎïÔËÊäÁ¿Í³¼Æ·½·¨_2026-09-10.md
New file @@ -0,0 +1,219 @@ # å¦ä¹ ç¬è®°ï¼æ¹åçé路货ç©è¿è¾éåå¸å·ç»è®¡æ¹æ³ï¼2023å¹´ç¼å¶è¯´æï¼ - æ´çæ¥æï¼2026-09-10 - åææ¥æºï¼`ã20230531ãæ¹åçé路货ç©è¿è¾éç»è®¡æ¹æ³ï¼2023å¹´ï¼ç¼å¶è¯´æ.docx`ï¼2023å¹´5æç¼å¶ï¼ - åæå¯æ¬ï¼æ¬ç®å½ `ã20230531ãæ¹åçé路货ç©è¿è¾éç»è®¡æ¹æ³ï¼2023å¹´ï¼ç¼å¶è¯´æ.docx` - 说æï¼åæå ¬å¼ä¸º Word å ¬å¼å¯¹è±¡ï¼OMMLï¼ï¼å¨ Word 鿣æä¸ç符å·ä½ç½®æ¯ç©ºç½çï¼å®¹æçæ¼ãæ¬ç¬è®°å·²æ 45 å¤å ¬å¼å ¨é¨è¿åå¹¶éäºææ«ã --- ## ä¸ãä¸å¥è¯çè§£ å ¨çè´§è¿éæ¯å·²ç¥çï¼ç级å£å¾ï¼ï¼æ¥åè¦çæ¯**åå¸å·ï¼17个å°å¸ï¼**çæ°æ®ã > è·¯å¾æ¯ï¼è§ä¸ä¼ä¸æä¼ä¸ç´æ¥ï¼çæ°æ®ï¼ï¼è§ä¸ä¸æ·æ²¡æ³éä¸ç»è®¡ï¼å°±ç¨ã**åºæè¿è¾é Ã æ¬ææ³¢å¨ç³»æ°**ãæ¨ç®ï¼æååä¸¤æ¬¡å ¨çæ ¡å + 䏿¬¡å¢éåè°ã ``` é路货ç©è¿è¾é = è§ä¸é路货ç©è¿è¾ä¼ä¸è¿è¾éï¼ç´æ¥ï¼+ è§ä¸é路货ç©è¿è¾ç»è¥ä¸æ·è¿è¾éï¼æ¨ç®ï¼ ``` ### è§ä¸ / è§ä¸ççå® | å£å¾ | å®ä¹ | æ°æ®æ¥æº | | --- | --- | --- | | è§ä¸ | 主è¥é路货ç©è¿è¾ãå¹´è¥ä¸æ¶å ¥ **1000ä¸å 以ä¸** 䏿¥æè´§è¿è½¦è¾ **50è¾å以ä¸** çéè·¯è´§è¿æ³äººä¼ä¸ | ä¼ä¸æ¯æå¨ã交éè¿è¾ä¼ä¸ä¸å¥è¡¨èç½ç´æ¥ç³»ç»ãå¡«æ¥ | | è§ä¸ | é¤è§ä¸ä»¥å¤çå ¨é¨ç»è¥ä¸æ·ï¼ä¸ªä½æ·ãå°ä¼ä¸çï¼ | æ æ³ç´æ¥ï¼ææ¬æ¹æ¡æ¨ç® | --- ## äºãæ»ä½éª¨æ¶ï¼åæ¡è ¿ï¼ | ç¯è | ä½ç¨ | | --- | --- | | â åºæï¼2021å¹´9æï¼ | æ¨ç®çãéç¹ãï¼ç»åºåå¸å·è§ä¸è¿è¾éçèµ·ç¹å¼ | | â¡ ä¸ä¸ªæ³¢å¨ç³»æ° | ç¨é«éå ¬è·¯ãå½çé交ééãè¿åä¸å¥æ°æ®ï¼è¡¡éæ¬æç¸å¯¹åºæçæ¶¨è· | | â¢ å æ 0.5 / 0.3 / 0.2 | ä¸å¥æ°æ®åæä¸ºä¸ä¸ªç³»æ° | | â£ ä¸¤æ¬¡å ¨çæ ¡å + 䏿¬¡å¢éåè° | ä¿è¯ 17 个å¸å·å æ»çäºå ¨çï¼ä¸å¢éå·®å¼å¯æ§ | --- ## ä¸ãæ¨ç®ä¸»æµç¨ï¼è§ä¸é¨åï¼ ### 第 1 æ¥ï¼ç¡®å®åºææ°æ®ï¼åºæå¼ï¼ å 为ä¸ç´ç¼ºä¹æ¥å¸¸åå¸å·è¿è¾éç»è®¡ï¼éå ç¡®å®åºæï¼2021å¹´9æï¼åå¸å·è¿è¾éãæ¹æ³ä¸ºä¸¤ä¸ªæ¥æºåå 50%ï¼ - **æ¥æºAï¼2019å¹´å ¨å½é路货ç©è¿è¾éä¸é¡¹è°æ¥æ°æ®** ç¨è°æ¥æåå°å¸è´§è¿é/å¨è½¬é计ç®åå°å¸å æ¯ï¼ä¹ä»¥ 2021å¹´9æå ¨çè´§è¿é/å¨è½¬éæ»éã - **æ¥æºBï¼2021å¹´9æåå°å¸è¿åæ°æ®** ç¨åå°å¸è½½è´§æ±½è½¦å¨ä½å计æ°è®¡ç®å æ¯ï¼ä¹ä»¥ 2021å¹´9æå ¨çæ»éã ``` åå°å¸åºæè¿è¾é = åºäºä¸é¡¹è°æ¥æ¨ç®å¼ à 0.5 + åºäº2021å¹´9æè¿åæ¨ç®å¼ à 0.5 ``` > åºææ»å¨è§åï¼ä»¥ 2021å¹´9æä¸ºåºæï¼**æ¤åæ¯å¹´1æèµ·ï¼å°å1å¹´9æçè¿è¾éä½ä¸ºæ°çåºæ**ã ### 第 2 æ¥ï¼è®¡ç®ä¸ä¸ªæ³¢å¨ç³»æ° | æ¥æº | æ°æ®æä¾æ¹ | è´§è¿éç³»æ° | å¨è½¬éç³»æ° | æé | | --- | --- | --- | --- | --- | | é«éå ¬è·¯æ¶è´¹æ°æ® | æ¹åçé«éå ¬è·¯èç½æ¶è´¹ä¸å¿ | 车货æ»é `C` | â(车货æ»é à è¡é©¶éç¨) `S` | **0.5** | | æ®éå½çé交éé | æ¹åçå ¬è·¯äºä¸åå±ä¸å¿ | æ¥åæé¢äº¤éé `L` | å `L` | **0.3** | | è¿åï¼è¿æ¿åºï¼ | æ¹åçè´§è¿ç©æµäºä¸åå±ä¸å¿ | è¥è¿è´§è½¦å¨ä½æ° `D` | å `D` | **0.2** | å ¬å¼ï¼`_d` è¡¨ç¤ºåºæå¼ï¼`H`=è´§è¿éï¼`Z`=è´§ç©å¨è½¬éï¼ï¼ ``` Hâ½Â¹â¾ = H_d à C / C_d Zâ½Â¹â¾ = Z_d à S / S_d ï¼é«éï¼ Hâ½Â²â¾ = H_d à L / L_d Zâ½Â²â¾ = Z_d à L / L_d ï¼å½çéï¼ Hâ½Â³â¾ = H_d à D / D_d Zâ½Â³â¾ = Z_d à D / D_d ï¼è¿åï¼ ``` ### 第 3 æ¥ï¼å æåæåæ¥æ¨ç®ç»æ ``` H' = Hâ½Â¹â¾ à Wâ½Â¹,¹⾠+ Hâ½Â²â¾ à Wâ½Â¹,²⾠+ Hâ½Â³â¾ à Wâ½Â¹,³⾠Z' = Zâ½Â¹â¾ à Wâ½Â²,¹⾠+ Zâ½Â²â¾ à Wâ½Â²,²⾠+ Zâ½Â³â¾ à Wâ½Â²,³⾠æéï¼Wâ½Â¹,¹â¾=Wâ½Â²,¹â¾=0.5ï¼Wâ½Â¹,²â¾=Wâ½Â²,²â¾=0.3ï¼Wâ½Â¹,³â¾=Wâ½Â²,³â¾=0.2 ``` ### 第 4 æ¥ï¼è§ä¸åºæè°æ´ï¼è§ä¸/è§ä¸ååå¹´åº¦æ´æ°ï¼ ä¼ä¸è§æ¨¡åå导è´ãè§ä¸âè§ä¸ã身份å卿¶ï¼æå¹´è°æ´åºæè§ä¸åºæ°ï¼ ``` åºæè§ä¸è¿è¾éåºæ° = ä¸ä¸å¹´åºæè§ä¸è¿è¾é â æ¬å¹´ååè½¦è¾æ° à å车è¿è¾é æ¬å¹´ååè½¦è¾æ° = æ¬å¹´è§ä¸è½¦è¾æ° â ä¸ä¸å¹´åºæè§ä¸è½¦è¾æ° ï¼æ¥èªäº¤ä¼ç»101è¡¨ï¼ å车è¿è¾é = ä¸ä¸å¹´åºæè§ä¸è¿è¾é ÷ ä¸ä¸å¹´åºæè§ä¸è½¦è¾æ° ``` --- ## åã䏿¥ãè°æ´ãï¼æå®¹æè¢«ç»æçé¨åï¼ ### è°æ´â ä¸ççº§æ°æ®è¡æ¥ï¼æ¯ä¾ç¼©æ¾ï¼ åå¸å·åæ¥æ¨ç®ç»æå æ»åä¸å ¨çæ¨ç®ç»ææå·®å¼ï¼éæå ¨çæ»éçæ¯è°æ´ï¼ ``` H_i' = H_i à H / âH_i Z_i' = Z_i à Z / âZ_i ``` å«ä¹ï¼ç¬¬ i 个å¸å·ç»æ Ãï¼å ¨çæ»é ÷ åå¸å·åæ¥æ¨ç®å æ»ï¼ã ### è°æ´â¡ å¸å·é´å¢éåè°æ§è°æ´ - **èæ¯**ï¼è´§è¿éå¢éæå¡äºå£åº¦ GDP è¯ä¼°åè¡ä¸å¢å 弿 ¸ç®ï¼å¯¹ä»£è¡¨æ§ãç¨³å®æ§è¦æ±é«ï¼ä½å¸å·ä¸çº§é«éæ¶è´¹ç«åå½çéè§æµç«ç¹å¸å±æéï¼ç´æ¥æ¨ç®ç²¾åº¦åéã - **ç®ç**ï¼é¿å åå¸å·å¢éä¸å¨è¾¹å·®å¼è¿å¤§å¼èµ·äºè®®ãåæ³æ¯æå¢éå·®å¼å线æ§åæ¢ï¼**ä½¿ç»æè½å¨åå¢éç 1.5 åæ åå·®å **ï¼åæ¶**䏿¹ååå¸å·å¢éæå**ã ``` 1) 计ç®åå¸å·å¢é h_i 2) h_i' = (h_i â h_min) / (h_max â h_min) à 1.5 à h_std â å½ä¸ååè½å° 0 ~ 1.5Ï h_i'' = h_i' â hÌ + hÌ' â æ´ä½å¹³ç§»ï¼ä½¿åå¼åå°ååå¼ 3) ææ°å¢é忍ç»å¯¹éï¼åæå ¨çæ»éè°æ´ä¸æ¬¡ ``` 符å·ï¼`h_i`忥æ¨ç®å¢éã`h_max`/`h_min`åå¸å·å¢éæå¤§å¼/æå°å¼ã`h_std`å¢éæ åå·®ã`hÌ`è°æ´ä¸é´ç»æçå¢éåå¼ã`hÌ'`ï¼åï¼å¸çº§è¿è¾éå¢éã`h_i'`è°æ´ä¸é´ç»æã`h_i''`è°æ´åå¢éã ### è°æ´â¢ ææ°å¢é忍ç»å¯¹é并忬¡è¡æ¥å ¨ç ``` H_i'' = HL_i à (1 + h_i'') ï¼HL_iï¼ä¸ä¸å¹´åæç¬¬ i 个å¸å·çæåº¦è´§è¿é/å¨è½¬éï¼ H_i''' = H_i'' à H / âH_i'' ï¼åæå ¨çæ»é缩æ¾ï¼å¾å°æç»å¼ï¼ ``` `H_i'''` 峿ç»ä¸æ¥ç第 i 个å¸å·å½æé路货è¿éï¼å¨è½¬éï¼ã --- ## äºã宿´æµç¨ä¸²ä¸é ``` â æ¯æééï¼é«éæ¶è´¹æ°æ® + æ®éå½çé交éé + è¿æ¿åºè¿åæ°æ® â â¡ ä¸ç±»æ°æ®åèªç®ãæ¬æ ÷ åºæãæ³¢å¨ç³»æ°ï¼å¾å° Hâ½Â¹â¾/Zâ½Â¹â¾ãHâ½Â²â¾/Zâ½Â²â¾ãHâ½Â³â¾/Zâ½Â³â¾ â â¢ å æ 0.5 / 0.3 / 0.2 â è§ä¸è¿è¾é忥æ¨ç®å¼ H' / Z' â ⣠å è§ä¸ä¼ä¸ç´æ¥å¼ â åå¸å·è¿è¾é â ⤠æå ¨çæ»éçæ¯ç¼©æ¾ï¼ä¸ççº§æ°æ®è¡æ¥ï¼ â ⥠å¸å·é´å¢éåè°æ§è°æ´ï¼åå° 1.5Ï å ï¼æåä¸åï¼ â â¦ ææ°å¢é忍ç»å¯¹éï¼åæå ¨çæ»éç¼©æ¾ â æç»åå¸å·è´§è¿é / å¨è½¬é ``` --- ## å ã常è§çé® | çé® | è§£ç | | --- | --- | | è§ä¸ä¸ºä»ä¹ç¨ãæ¨ç®ãè䏿¯ç»è®¡ï¼ | ä¸ªä½æ·æ°éåºå¤§ä¸æ åå½ï¼æ æ³éä¸ééï¼åªè½ç¨è¡ä¸ææ çç¸å¯¹å忍ç®ã | | 为ä»ä¹å¿ 须设ãåºæãï¼ | 仿¥æ²¡æåå¸å·åå²ç»å¯¹å¼ï¼åªè½å®ä¸ä¸ªéç¹ï¼ä¹åçç¸å¯¹ååã | | æé为ä»ä¹æ¯ 0.5 / 0.3 / 0.2ï¼ | 沿ç¨ççº§æ¹æ¡ï¼é«éæ°æ®è¦çæå ¨æåï¼0.5ï¼ï¼å½çéè¦ç广ä½å¸å·çº§ç«ç¹æéï¼0.3ï¼ï¼è¿åæ°æ®ç¸å ³æ§è¾å¼ºä½æ´æ°/å£å¾ææ»åï¼0.2ï¼ã | | 为ä»ä¹ãå ¨çæ ¡åãåä¸¤æ¬¡ï¼ | ç¬¬ä¸æ¬¡æ¯åæ¥æ¨ç®åå½å£å°å ¨çï¼ç¬¬äºæ¬¡æ¯å¢éè°æ´åæ°å¼ååäºï¼éè¦åå½å£ä¸æ¬¡ï¼ä¿è¯åå¸å·å æ»ä¸¥æ ¼çäºå ¨çæ»éã | | ãå¢éåè°ãæ¯ä¸æ¯å¨æ¹æ°æ®ï¼ | åæå£å¾ï¼**æåä¸å**ï¼åªæå¸å·é´å·®è·æ 1.5 åæ åå·®æ¶æï¼é¿å 个å«å¸å·å ç«ç¹å°è大起大è½ã | | é«éæ°æ®ååªä¸ªæ¹åï¼ | åæè¡¨è¿°ä¸ºãå£å¾å æ¬åç«å ¥å£æ¹åçéè¡æ°æ®ãï¼å³æå ¥å£æ¹åå£å¾æ±æ»ã | --- ## ä¸ã符å·å¯¹ç §è¡¨ | ç¬¦å· | å«ä¹ | | --- | --- | | `H` / `Z` | é路货è¿é / è´§ç©å¨è½¬éï¼å ¨çå½æï¼ | | `H_d` / `Z_d` | åºææåº¦è§ä¸é路货è¿é / è´§ç©å¨è½¬é | | `H_i` / `Z_i` | 第 i 个å¸å·å½æåæ¥æ¨ç®ç»æ | | `H_i'` / `Z_i'` | 第 i 个å¸å·è°æ´åçç»æ | | `C` / `S` | 彿æåº¦è½¦è´§æ»é / â(车货æ»é à è¡é©¶éç¨) | | `L` | æ¥åæé¢äº¤ééï¼æ®éå½çéï¼ | | `D` | è¥è¿è´§è½¦å¨ä½æ°ï¼è¿æ¿åºï¼ | | 䏿 `(1)(2)(3)` | åå«ä»£è¡¨é«éãå½çéãè¿åä¸ä¸ªæ¥æº | | `W^(m,n)` | å ææéï¼0.5 / 0.3 / 0.2ï¼ | | `h_i` / `h_i'` / `h_i''` | 第 i 个å¸å·åæ¥æ¨ç®å¢é / è°æ´ä¸é´ç»æ / è°æ´åå¢é | | `HL_i` | ä¸ä¸å¹´åæç¬¬ i 个å¸å·çæåº¦è´§è¿éï¼å¨è½¬éï¼ | --- ## éï¼åæå ¬å¼å ¨æ¸ åï¼45 å¤ï¼ ``` ãåºææ°æ®ã åå°å¸åºæè¿è¾é = åºäºä¸é¡¹è°æ¥æ¨ç®å¼ à 0.5 + åºäº2021å¹´9æè¿åæ¨ç®å¼ à 0.5 ãè§ä¸åºæè°æ´ã åºæè§ä¸è¿è¾éåºæ° = ä¸ä¸å¹´åºæè§ä¸è¿è¾é â æ¬å¹´ååè½¦è¾æ° à å车è¿è¾é æ¬å¹´ååè½¦è¾æ° = æ¬å¹´è§ä¸è½¦è¾æ° â ä¸ä¸å¹´åºæè§ä¸è½¦è¾æ° å车è¿è¾é = ä¸ä¸å¹´åºæè§ä¸è¿è¾é ÷ ä¸ä¸å¹´åºæè§ä¸è½¦è¾æ° ãé«éæ°æ®æ¨ç®ã Hâ½Â¹â¾ = H_d à C / C_d Zâ½Â¹â¾ = Z_d à S / S_d ãæ®éå½çé交é鿍ç®ã Hâ½Â²â¾ = H_d à L / L_d Zâ½Â²â¾ = Z_d à L / L_d ãè¿åæ°æ®æ¨ç®ã Hâ½Â³â¾ = H_d à D / D_d Zâ½Â³â¾ = Z_d à D / D_d ãå æè®¡ç®ã H' = Hâ½Â¹â¾ à Wâ½Â¹,¹⾠+ Hâ½Â²â¾ à Wâ½Â¹,²⾠+ Hâ½Â³â¾ à Wâ½Â¹,³⾠Z' = Zâ½Â¹â¾ à Wâ½Â²,¹⾠+ Zâ½Â²â¾ à Wâ½Â²,²⾠+ Zâ½Â³â¾ à Wâ½Â²,³⾠Wâ½Â¹,¹â¾=Wâ½Â²,¹â¾=0.5ï¼Wâ½Â¹,²â¾=Wâ½Â²,²â¾=0.3ï¼Wâ½Â¹,³â¾=Wâ½Â²,³â¾=0.2 ãä¸ççº§æ°æ®è¡æ¥è°æ´ã H_i' = H_i à H / âH_i Z_i' = Z_i à Z / âZ_i ãå¸å·é´å¢éåè°æ§è°æ´ã h_i' = (h_i â h_min) / (h_max â h_min) à 1.5 à h_std h_i'' = h_i' â hÌ + hÌ' ãææ°å¢é忍ç»å¯¹é并忬¡è¡æ¥ã H_i'' = HL_i à (1 + h_i'') H_i''' = H_i'' à H / âH_i'' ``` traffic-audit-server/src/main/java/com/trafficaudit/dataimport/controller/DataImportController.java
@@ -443,4 +443,27 @@ return Result.ok(result); } /** * æ¸ ç©ºæå®æ¥è¡¨æå·²å¯¼å ¥æ°æ®ä¸å®¡æ ¸ç»æï¼æ°æ®å¯¼å ¥é¡µ"æ¸ ç©ºæ°æ®"å ¥å£è°ç¨ï¼ï¼ä¾¿äºæ´æéæ°å¯¼å ¥ã * types ä¸ºç©ºè¡¨ç¤ºæ¸ ç©ºè¯¥æ¥è¡¨æå ¨é¨ç±»åï¼å¦ååªæ¸ 空æå®æ°æ®ç±»åï¼éå·åéï¼å¦ h2032,cityBusï¼ã */ @PostMapping("/clear") public Result<Map<String, Object>> clearData(@RequestParam("period") String period, @RequestParam(value = "types", required = false) String types) { try { List<String> typeList = new java.util.ArrayList<>(); if (types != null) { for (String t : types.split(",")) { String s = t.trim(); if (!s.isEmpty()) typeList.add(s); } } Map<String, Object> stats = importService.clearPeriod(period, typeList); return Result.ok(stats); } catch (Exception e) { log.error("clear period {} types {} error", period, types, e); return Result.error("æ¸ ç©ºå¤±è´¥: " + e.getMessage()); } } } traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java
@@ -2,7 +2,9 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.trafficaudit.auditengine.entity.AuditResult; import com.trafficaudit.auditengine.entity.AuditRun; import com.trafficaudit.auditengine.mapper.AuditResultMapper; import com.trafficaudit.auditengine.mapper.AuditRunMapper; import com.trafficaudit.common.util.RegionUtil; import com.trafficaudit.dataimport.entity.EnergyAuthVehicle; import com.trafficaudit.dataimport.entity.EnergyVehicleQuarterly; @@ -56,6 +58,7 @@ import org.apache.poi.ss.usermodel.WorkbookFactory; import cn.hutool.core.io.IoUtil; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; @@ -142,6 +145,8 @@ private FreightTurnoverImportMapper freightTurnoverMapper; @Resource private AuditResultMapper auditResultMapper; @Resource private AuditRunMapper auditRunMapper; @Resource private PassengerEnterpriseMonthlyMapper passengerMapper; @Resource @@ -1312,6 +1317,273 @@ } } /** æ¯æâæç±»åæ¸ ç©ºâçæ°æ®ç±»å -> æ°æ®è¡¨æä½é®ï¼å表åç±»å«å½å¹¶ï¼é¿å éå¤å é¤ï¼ */ private static final Map<String, String> CLEAR_TYPE_TO_OP = new LinkedHashMap<>(); /** æ°æ®ç±»å -> å ³èå®¡æ ¸è§åç±»åï¼åæ¥æ¸ é¤å®¡æ ¸ç»æä¸å·²å®¡æ ¸æ è®°ï¼ */ private static final Map<String, String[]> CLEAR_TYPE_TO_AUDIT = new HashMap<>(); /** æ°æ®ç±»å -> å ³èå¯¼å ¥æ¹æ¬¡ importTypeï¼åæ¥æ¸ é¤å¯¼å ¥æ¹æ¬¡è®°å½ï¼ */ private static final Map<String, String[]> CLEAR_TYPE_TO_BATCH = new HashMap<>(); static { CLEAR_TYPE_TO_OP.put("h2032", "H2032"); CLEAR_TYPE_TO_OP.put("transportAuth", "TRANSPORT_AUTH"); CLEAR_TYPE_TO_OP.put("trackMileage", "TRACK_MILEAGE"); CLEAR_TYPE_TO_OP.put("scaleSplit", "SCALE_SPLIT"); CLEAR_TYPE_TO_OP.put("freightTurnover", "FREIGHT_TURNOVER"); CLEAR_TYPE_TO_OP.put("passengerMonthly", "H2031"); CLEAR_TYPE_TO_OP.put("passengerAuth", "PASSENGER_AUTH"); CLEAR_TYPE_TO_OP.put("passengerIndividual", "PASSENGER_INDIVIDUAL"); CLEAR_TYPE_TO_OP.put("energyMonthly", "H204"); CLEAR_TYPE_TO_OP.put("energyAuth", "ENERGY_AUTH"); CLEAR_TYPE_TO_OP.put("investment", "INVEST_MONTHLY_PASSENGER"); CLEAR_TYPE_TO_OP.put("investCityPassenger", "INVEST_MONTHLY_PASSENGER"); CLEAR_TYPE_TO_OP.put("investmentLogistics", "INVEST_MONTHLY_LOGISTICS"); CLEAR_TYPE_TO_OP.put("investCityLogistics", "INVEST_MONTHLY_LOGISTICS"); CLEAR_TYPE_TO_OP.put("investmentSystem", "INVEST_SYSTEM"); CLEAR_TYPE_TO_OP.put("cityBus", "CITY_BUS"); CLEAR_TYPE_TO_OP.put("cityTaxi", "CITY_TAXI"); CLEAR_TYPE_TO_OP.put("cityTaxiAuth", "CITY_TAXI_AUTH"); CLEAR_TYPE_TO_OP.put("wycTotal", "WYC_TOTAL"); CLEAR_TYPE_TO_OP.put("wycOrder", "WYC_ORDER"); CLEAR_TYPE_TO_AUDIT.put("h2032", new String[]{"H2032"}); CLEAR_TYPE_TO_AUDIT.put("transportAuth", new String[]{"H2032"}); CLEAR_TYPE_TO_AUDIT.put("trackMileage", new String[]{"H2032"}); CLEAR_TYPE_TO_AUDIT.put("scaleSplit", new String[]{"H2032"}); CLEAR_TYPE_TO_AUDIT.put("freightTurnover", new String[]{"H2032"}); CLEAR_TYPE_TO_AUDIT.put("passengerMonthly", new String[]{"H2031"}); CLEAR_TYPE_TO_AUDIT.put("passengerAuth", new String[]{"H2031"}); CLEAR_TYPE_TO_AUDIT.put("passengerIndividual", new String[]{"H2031"}); CLEAR_TYPE_TO_AUDIT.put("energyMonthly", new String[]{"H204"}); CLEAR_TYPE_TO_AUDIT.put("energyAuth", new String[]{"H204"}); CLEAR_TYPE_TO_AUDIT.put("investment", new String[]{"INVEST"}); CLEAR_TYPE_TO_AUDIT.put("investmentLogistics", new String[]{"INVEST"}); CLEAR_TYPE_TO_AUDIT.put("investCityPassenger", new String[]{"INVEST"}); CLEAR_TYPE_TO_AUDIT.put("investCityLogistics", new String[]{"INVEST"}); CLEAR_TYPE_TO_AUDIT.put("investmentSystem", new String[]{"INVEST"}); CLEAR_TYPE_TO_AUDIT.put("cityBus", new String[]{"CITY_BUS"}); CLEAR_TYPE_TO_AUDIT.put("cityTaxi", new String[]{"CITY_TAXI"}); CLEAR_TYPE_TO_AUDIT.put("cityTaxiAuth", new String[]{"CITY_TAXI"}); String[] investPassengerBatch = {"INVEST_客è¿ç«åº", "INVEST_客è¿ç«åº_CITY"}; String[] investLogisticsBatch = {"INVEST_ç©æµååº", "INVEST_ç©æµååº_CITY"}; CLEAR_TYPE_TO_BATCH.put("h2032", new String[]{"H2032"}); CLEAR_TYPE_TO_BATCH.put("transportAuth", new String[]{"TRANSPORT_AUTH"}); CLEAR_TYPE_TO_BATCH.put("trackMileage", new String[]{"TRACK_MILEAGE"}); CLEAR_TYPE_TO_BATCH.put("scaleSplit", new String[]{"SCALE_SPLIT"}); CLEAR_TYPE_TO_BATCH.put("freightTurnover", new String[]{"FREIGHT_TURNOVER"}); CLEAR_TYPE_TO_BATCH.put("passengerMonthly", new String[]{"H2031"}); CLEAR_TYPE_TO_BATCH.put("passengerAuth", new String[]{"PASSENGER_AUTH"}); CLEAR_TYPE_TO_BATCH.put("passengerIndividual", new String[]{"PASSENGER_INDIVIDUAL"}); CLEAR_TYPE_TO_BATCH.put("energyMonthly", new String[]{"H204"}); CLEAR_TYPE_TO_BATCH.put("energyAuth", new String[]{"ENERGY_AUTH"}); CLEAR_TYPE_TO_BATCH.put("investment", investPassengerBatch); CLEAR_TYPE_TO_BATCH.put("investCityPassenger", investPassengerBatch); CLEAR_TYPE_TO_BATCH.put("investmentLogistics", investLogisticsBatch); CLEAR_TYPE_TO_BATCH.put("investCityLogistics", investLogisticsBatch); CLEAR_TYPE_TO_BATCH.put("investmentSystem", new String[]{"INVEST_SYSTEM"}); CLEAR_TYPE_TO_BATCH.put("cityBus", new String[]{"CITY_BUS"}); CLEAR_TYPE_TO_BATCH.put("cityTaxi", new String[]{"CITY_TAXI"}); CLEAR_TYPE_TO_BATCH.put("cityTaxiAuth", new String[]{"CITY_TAXI_AUTH"}); CLEAR_TYPE_TO_BATCH.put("wycTotal", new String[]{"WYC_TOTAL"}); CLEAR_TYPE_TO_BATCH.put("wycOrder", new String[]{"WYC_ORDER"}); } /** * æ¸ ç©ºæå®æ¥è¡¨æå·²å¯¼å ¥æ°æ®ä¸å®¡æ ¸ç»æï¼ç¨äºæ´æéå¯¼ï¼æèµé¡¹ç®ä¸»æ¡£ä¿çã * * @param types 鿏 ç©ºçæ°æ®ç±»åï¼å端类åé®ï¼å¦ h2032/cityBusï¼ï¼ä¸ºç©ºåæ¸ ç©ºè¯¥æ¥è¡¨æå ¨é¨ç±»å */ @Transactional(rollbackFor = Exception.class) public Map<String, Object> clearPeriod(String period, List<String> types) { if (period == null || !period.matches("\\d{4}-\\d{2}")) { throw new IllegalArgumentException("æ¥è¡¨ææ ¼å¼ä¸æ£ç¡®ï¼åºä¸º yyyy-MM"); } Set<String> selected = new LinkedHashSet<>(); if (types != null) { for (String t : types) { if (t != null && !t.trim().isEmpty()) selected.add(t.trim()); } } boolean clearAll = selected.isEmpty(); int dataRows = 0; int auditRows = 0; int auditRunRows = 0; int batchRows = 0; if (clearAll) { dataRows += h2032Mapper.delete(new LambdaQueryWrapper<H2032EnterpriseMonthly>() .eq(H2032EnterpriseMonthly::getReportPeriod, period)); dataRows += transportAuthMapper.delete(new LambdaQueryWrapper<TransportAuthVehicle>() .eq(TransportAuthVehicle::getReportPeriod, period)); dataRows += trackMileageMapper.delete(new LambdaQueryWrapper<VehicleTrackMileage>() .eq(VehicleTrackMileage::getReportPeriod, period)); dataRows += scaleSplitMapper.delete(new LambdaQueryWrapper<ScaleSplitTransport>() .eq(ScaleSplitTransport::getReportPeriod, period)); dataRows += freightTurnoverMapper.delete(new LambdaQueryWrapper<FreightTurnoverImport>() .eq(FreightTurnoverImport::getReportPeriod, period)); dataRows += passengerMapper.delete(new LambdaQueryWrapper<PassengerEnterpriseMonthly>() .eq(PassengerEnterpriseMonthly::getReportPeriod, period)); dataRows += passengerIndividualMapper.delete(new LambdaQueryWrapper<PassengerIndividualMonthly>() .eq(PassengerIndividualMonthly::getReportPeriod, period)); dataRows += passengerAuthMapper.delete(new LambdaQueryWrapper<PassengerAuthVehicle>() .eq(PassengerAuthVehicle::getReportPeriod, period)); dataRows += energyMapper.delete(new LambdaQueryWrapper<EnergyVehicleQuarterly>() .eq(EnergyVehicleQuarterly::getReportPeriod, period)); dataRows += energyAuthMapper.delete(new LambdaQueryWrapper<EnergyAuthVehicle>() .eq(EnergyAuthVehicle::getReportPeriod, period)); dataRows += investMonthlyMapper.delete(new LambdaQueryWrapper<InvestmentMonthly>() .eq(InvestmentMonthly::getReportPeriod, period)); dataRows += investSystemMapper.delete(new LambdaQueryWrapper<InvestmentSystem>() .eq(InvestmentSystem::getReportPeriod, period)); dataRows += cityBusMapper.delete(new LambdaQueryWrapper<CityBusMonthly>() .eq(CityBusMonthly::getReportPeriod, period)); dataRows += cityTaxiMapper.delete(new LambdaQueryWrapper<CityTaxiMonthly>() .eq(CityTaxiMonthly::getReportPeriod, period)); dataRows += cityTaxiAuthMapper.delete(new LambdaQueryWrapper<CityTaxiAuth>() .eq(CityTaxiAuth::getReportPeriod, period)); dataRows += wycTotalMapper.delete(new LambdaQueryWrapper<WycTotalMonthly>() .eq(WycTotalMonthly::getReportPeriod, period)); dataRows += wycOrderMapper.delete(new LambdaQueryWrapper<WycOrderMonthly>() .eq(WycOrderMonthly::getReportPeriod, period)); auditRows = auditResultMapper.delete(new LambdaQueryWrapper<AuditResult>() .eq(AuditResult::getReportPeriod, period)); auditRunRows = auditRunMapper.delete(new LambdaQueryWrapper<AuditRun>() .eq(AuditRun::getReportPeriod, period)); batchRows = importBatchMapper.delete(new LambdaQueryWrapper<ImportBatch>() .eq(ImportBatch::getReportPeriod, period)); } else { Set<String> ops = new LinkedHashSet<>(); Set<String> auditTypes = new LinkedHashSet<>(); Set<String> batchTypes = new LinkedHashSet<>(); for (String t : selected) { String op = CLEAR_TYPE_TO_OP.get(t); if (op == null) { log.warn("æ¸ ç©ºæ°æ®ï¼æªç¥æ°æ®ç±»å {}ï¼å·²å¿½ç¥", t); continue; } ops.add(op); String[] at = CLEAR_TYPE_TO_AUDIT.get(t); if (at != null) java.util.Collections.addAll(auditTypes, at); String[] bt = CLEAR_TYPE_TO_BATCH.get(t); if (bt != null) java.util.Collections.addAll(batchTypes, bt); } if (ops.isEmpty()) { throw new IllegalArgumentException("æªæå®ææçæ°æ®ç±»å"); } for (String op : ops) { dataRows += clearTypeData(op, period); } if (!auditTypes.isEmpty()) { List<Long> ruleIds = new ArrayList<>(); for (com.trafficaudit.rulemanage.entity.AuditRule rule : ruleMapper.selectList(null)) { if (rule.getReportType() != null && auditTypes.contains(rule.getReportType())) { ruleIds.add(rule.getId()); } } if (!ruleIds.isEmpty()) { auditRows = auditResultMapper.delete(new LambdaQueryWrapper<AuditResult>() .eq(AuditResult::getReportPeriod, period) .in(AuditResult::getRuleId, ruleIds)); } for (String rt : auditTypes) { auditRunRows += auditRunMapper.delete(new LambdaQueryWrapper<AuditRun>() .eq(AuditRun::getReportPeriod, period) .eq(AuditRun::getReportType, rt)); } } if (!batchTypes.isEmpty()) { batchRows = importBatchMapper.delete(new LambdaQueryWrapper<ImportBatch>() .eq(ImportBatch::getReportPeriod, period) .in(ImportBatch::getImportType, batchTypes)); } } Map<String, Object> stats = new LinkedHashMap<>(); stats.put("period", period); stats.put("scope", clearAll ? "all" : "types"); if (!clearAll) stats.put("types", new ArrayList<>(selected)); stats.put("dataRows", dataRows); stats.put("auditRows", auditRows); stats.put("auditRunRows", auditRunRows); stats.put("batchRows", batchRows); log.info("æ¸ ç©ºæ¥è¡¨æ {}ï¼{}ï¼å®æï¼ä¸å¡æ°æ® {} è¡ãå®¡æ ¸ç»æ {} è¡ãå®¡æ ¸æ è®° {} è¡ãå¯¼å ¥æ¹æ¬¡ {} è¡", period, clearAll ? "å ¨é¨ç±»å" : String.join(",", selected), dataRows, auditRows, auditRunRows, batchRows); return stats; } /** æâæ°æ®è¡¨æä½é®âæ¸ ç©ºå¯¹åºä¸å¡è¡¨ï¼æèµæåº¦æé¡¹ç®ç±»å«è¿æ»¤ï¼ï¼è¿åå é¤è¡æ° */ private int clearTypeData(String op, String period) { switch (op) { case "H2032": return h2032Mapper.delete(new LambdaQueryWrapper<H2032EnterpriseMonthly>() .eq(H2032EnterpriseMonthly::getReportPeriod, period)); case "TRANSPORT_AUTH": return transportAuthMapper.delete(new LambdaQueryWrapper<TransportAuthVehicle>() .eq(TransportAuthVehicle::getReportPeriod, period)); case "TRACK_MILEAGE": return trackMileageMapper.delete(new LambdaQueryWrapper<VehicleTrackMileage>() .eq(VehicleTrackMileage::getReportPeriod, period)); case "SCALE_SPLIT": return scaleSplitMapper.delete(new LambdaQueryWrapper<ScaleSplitTransport>() .eq(ScaleSplitTransport::getReportPeriod, period)); case "FREIGHT_TURNOVER": return freightTurnoverMapper.delete(new LambdaQueryWrapper<FreightTurnoverImport>() .eq(FreightTurnoverImport::getReportPeriod, period)); case "H2031": return passengerMapper.delete(new LambdaQueryWrapper<PassengerEnterpriseMonthly>() .eq(PassengerEnterpriseMonthly::getReportPeriod, period)); case "PASSENGER_AUTH": return passengerAuthMapper.delete(new LambdaQueryWrapper<PassengerAuthVehicle>() .eq(PassengerAuthVehicle::getReportPeriod, period)); case "PASSENGER_INDIVIDUAL": return passengerIndividualMapper.delete(new LambdaQueryWrapper<PassengerIndividualMonthly>() .eq(PassengerIndividualMonthly::getReportPeriod, period)); case "H204": return energyMapper.delete(new LambdaQueryWrapper<EnergyVehicleQuarterly>() .eq(EnergyVehicleQuarterly::getReportPeriod, period)); case "ENERGY_AUTH": return energyAuthMapper.delete(new LambdaQueryWrapper<EnergyAuthVehicle>() .eq(EnergyAuthVehicle::getReportPeriod, period)); case "INVEST_MONTHLY_PASSENGER": return deleteInvestmentMonthly(period, "客è¿ç«åº"); case "INVEST_MONTHLY_LOGISTICS": return deleteInvestmentMonthly(period, "ç©æµååº"); case "INVEST_SYSTEM": return investSystemMapper.delete(new LambdaQueryWrapper<InvestmentSystem>() .eq(InvestmentSystem::getReportPeriod, period)); case "CITY_BUS": return cityBusMapper.delete(new LambdaQueryWrapper<CityBusMonthly>() .eq(CityBusMonthly::getReportPeriod, period)); case "CITY_TAXI": return cityTaxiMapper.delete(new LambdaQueryWrapper<CityTaxiMonthly>() .eq(CityTaxiMonthly::getReportPeriod, period)); case "CITY_TAXI_AUTH": return cityTaxiAuthMapper.delete(new LambdaQueryWrapper<CityTaxiAuth>() .eq(CityTaxiAuth::getReportPeriod, period)); case "WYC_TOTAL": return wycTotalMapper.delete(new LambdaQueryWrapper<WycTotalMonthly>() .eq(WycTotalMonthly::getReportPeriod, period)); case "WYC_ORDER": return wycOrderMapper.delete(new LambdaQueryWrapper<WycOrderMonthly>() .eq(WycOrderMonthly::getReportPeriod, period)); default: log.warn("æ¸ ç©ºæ°æ®ï¼æªç¥æ°æ®è¡¨æä½ {}", op); return 0; } } /** æèµæåº¦æé¡¹ç®ç±»å«æ¸ é¤ï¼æèµé¡¹ç®ä¸»æ¡£ä¿çï¼ */ private int deleteInvestmentMonthly(String period, String category) { List<Long> projectIds = new ArrayList<>(); for (InvestmentProject p : investProjectMapper.selectList(new LambdaQueryWrapper<InvestmentProject>() .eq(InvestmentProject::getCategory, category))) { projectIds.add(p.getId()); } if (projectIds.isEmpty()) return 0; return investMonthlyMapper.delete(new LambdaQueryWrapper<InvestmentMonthly>() .eq(InvestmentMonthly::getReportPeriod, period) .in(InvestmentMonthly::getProjectId, projectIds)); } /** æ°æ®åååå 餿宿¥è¡¨ç±»åæå®æ¥è¡¨æçå®¡æ ¸ç»æï¼ééæ°æ§è¡å®¡æ ¸ï¼ */ private void deleteRuleResults(String reportType, String period) { List<Long> ruleIds = new ArrayList<>(); traffic-audit-web/src/views/DataImport.vue
@@ -105,6 +105,11 @@ <span>æ¬æå¯¼å ¥è¿åº¦ï¼{{ period || 'æªéæ©æ¥è¡¨æ' }}ï¼</span> <el-button type="text" icon="el-icon-refresh" @click="loadData">å·æ°</el-button> </div> <div v-if="period" class="side-danger"> <el-button size="mini" type="danger" plain icon="el-icon-delete" :disabled="clearing || importing" @click="openClearDialog">æ¸ ç©ºæ°æ®â¦</el-button> <span class="side-danger-tip">ææ¥è¡¨ææ¸ åºï¼ç¨äºæ´æé导</span> </div> <div v-if="!period" class="tip">请å å¨ä¸æ¹éæ©æ¥è¡¨æ</div> <div v-else class="overview-grid"> <div class="ov-row" v-for="g in visibleGroups" :key="g.key"> @@ -119,6 +124,32 @@ </div> </div> </div> <el-dialog title="æ¸ ç©ºæ°æ®" :visible.sync="clearDialog" width="560px" append-to-body :close-on-click-modal="false"> <div class="clear-dlg"> <div class="clear-period">æ¥è¡¨æï¼<b>{{ period }}</b></div> <el-radio-group v-model="clearScope"> <el-radio label="all">æ¸ ç©ºè¯¥æ¥è¡¨æå ¨é¨å·²å¯¼å ¥æ°æ®</el-radio> <el-radio label="types">åªæ¸ 空æå®ç±»å</el-radio> </el-radio-group> <div v-if="clearScope === 'types'" class="clear-types"> <el-select v-model="clearTypes" multiple filterable collapse-tags placeholder="éæ©è¦æ¸ ç©ºçæ°æ®ç±»å" style="width:100%"> <el-option-group v-for="g in clearableGroups()" :key="g.key" :label="g.name"> <el-option v-for="t in g.types" :key="t.value" :value="t.value" :label="t.label + 'ï¼' + overviewState(t.value).text + 'ï¼'"></el-option> </el-option-group> </el-select> <div class="tip" style="margin-top:6px">å¯å¤éï¼æªå¯¼å ¥çç±»åæ²¡ææ°æ®å¯å ã</div> </div> <div class="clear-warn"> å°å 餿éèå´å 该æ¥è¡¨æçæ°æ®åºæ°æ®ï¼å¹¶åæ¥å é¤å¯¹åºå®¡æ ¸ç»æãå·²å®¡æ ¸æ è®°ä¸å¯¼å ¥æ¹æ¬¡è®°å½ï¼æèµé¡¹ç®ä¸»æ¡£ä¿çï¼ãæ¤æä½ä¸å¯æ¤éï¼è¯·ç¡®è®¤å·²æå¤ä»½æåå¤éæ°å¯¼å ¥ã </div> </div> <span slot="footer"> <el-button @click="clearDialog = false">åæ¶</el-button> <el-button type="danger" :loading="clearing" :disabled="clearScope === 'types' && !clearTypes.length" @click="confirmClear">ç¡®è®¤æ¸ ç©º</el-button> </span> </el-dialog> </el-main> </el-container> </el-container> @@ -158,6 +189,10 @@ period: (() => { const d = new Date(); return d.getFullYear() + '-' + String(d.getMonth() + 1).padStart(2, '0') })(), cityDirLoading: false, importing: false, clearing: false, clearDialog: false, clearScope: 'all', clearTypes: [], sideOpen: false, result: '', error: '', @@ -520,6 +555,44 @@ .catch(e => { if (!e || !e._toast) this.$message.error('å¯¼å ¥è®°å½å 载失败ï¼è¯·å·æ°éè¯') }) .finally(() => { this.batchLoading = false }) }, openClearDialog() { if (!this.period) { this.$message.warning('请å éæ©æ¥è¡¨æ'); return } if (this.importing) { this.$message.warning('æ£å¨å¯¼å ¥æ°æ®ï¼è¯·çå¾ å¯¼å ¥å®æå忏 空'); return } this.clearScope = 'all' this.clearTypes = [] this.clearDialog = true }, clearableGroups() { return this.groups.filter(g => !g.hidden) }, confirmClear() { if (!this.period) { this.$message.warning('请å éæ©æ¥è¡¨æ'); return } if (this.clearing) return if (this.clearScope === 'types' && !this.clearTypes.length) { this.$message.warning('è¯·éæ©è¦æ¸ ç©ºçæ°æ®ç±»å'); return } const scopeText = this.clearScope === 'all' ? '该æ¥è¡¨æå ¨é¨å·²å¯¼å ¥æ°æ®' : 'ä»¥ä¸ ' + this.clearTypes.length + ' 个类åï¼' + this.clearTypes.map(t => this.typeLabel(t)).join('ã') this.$confirm('å°æ¸ 空 ' + this.period + ' ç' + scopeText + 'ï¼å¹¶åæ¥å é¤å¯¹åºå®¡æ ¸ç»æãå·²å®¡æ ¸æ è®°ä¸å¯¼å ¥æ¹æ¬¡è®°å½ãæ¤æä½ä¸å¯æ¤éï¼æ¯å¦ç»§ç»ï¼', 'æ¸ ç©ºç¡®è®¤', { type: 'warning', confirmButtonText: 'ç¡®è®¤æ¸ ç©º', cancelButtonText: 'åæ¶' }) .then(() => { this.clearing = true const params = { period: this.period } if (this.clearScope === 'types') params.types = this.clearTypes.join(',') return api.post('/import/clear', null, { params, timeout: 600000 }) .then(res => { const d = (res && res.data) || {} this.$message.success('å·²æ¸ ç©º ' + this.period + ' æ°æ®ï¼ä¸å¡æ°æ® ' + (d.dataRows || 0) + ' è¡ãå®¡æ ¸ç»æ ' + (d.auditRows || 0) + ' è¡ãå¯¼å ¥æ¹æ¬¡ ' + (d.batchRows || 0) + ' æ¡ï¼å¯ä»¥éæ°å¯¼å ¥') this.clearDialog = false this.loadData() }) .catch(e => { if (e && e._toast) return this.$message.error((e.response && e.response.data && e.response.data.message) || 'æ¸ ç©ºå¤±è´¥ï¼è¯·ç¨åéè¯') }) .finally(() => { this.clearing = false }) }).catch(() => {}) }, batchKeyToType(k) { if (BATCH_TYPE_MAP[k]) return BATCH_TYPE_MAP[k] if (k && k.indexOf('INVEST_') === 0) { @@ -591,6 +664,12 @@ .import-side.side-open .side-toggle-text { writing-mode: horizontal-tb; letter-spacing: normal; margin-top: 0; } .side-content { padding: 8px 12px 12px; max-height: calc(100vh - 220px); overflow-y: auto; overscroll-behavior: contain; } .side-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-weight: 600; margin-bottom: 6px; } .side-danger { display: flex; align-items: center; gap: 8px; margin: 4px 0 10px; padding: 6px 8px; background: #FEF0F0; border: 1px solid #FDE2E2; border-radius: 4px; } .side-danger-tip { font-size: 12px; color: #F56C6C; line-height: 1.3; } .clear-dlg { line-height: 1.7; } .clear-period { margin-bottom: 6px; } .clear-types { margin-top: 10px; } .clear-warn { margin-top: 12px; padding: 8px 10px; background: #FEF0F0; border: 1px solid #FDE2E2; border-radius: 4px; color: #F56C6C; font-size: 12px; line-height: 1.6; } .import-side .overview-grid { display: block; } .import-side .ov-row { display: block; margin-bottom: 6px; } .import-side .ov-group { width: auto; }