| docs/功能测试报告/功能测试报告_数据导入清空按钮按报表期清库_2026-09-10.md | ●●●●● 补丁 | 查看 | 原始文档 | 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,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,23 @@ # 工使¥ç» 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ãç½çº¦è½¦æåè¾å ¥ï¼ã ## éï¼æäº¤ - æ¬æ¬¡æ¹å¨ 3 ä¸ªä»£ç æä»¶ + æ¬æ¥å䏿¥ç»ï¼æè§èå `git fetch gitea/origin` 对æ¯åå¹¶ï¼å commit å¹¶å端æ¨éï¼gitea mainã个人 gitee masterï¼ã traffic-audit-server/src/main/java/com/trafficaudit/dataimport/controller/DataImportController.java
@@ -443,4 +443,16 @@ return Result.ok(result); } /** æ¸ ç©ºæå®æ¥è¡¨æå ¨é¨å·²å¯¼å ¥æ°æ®ä¸å®¡æ ¸ç»æï¼æ°æ®å¯¼å ¥é¡µ"æ¸ ç©º"æé®è°ç¨ï¼ï¼ä¾¿äºæ´æéæ°å¯¼å ¥ */ @PostMapping("/clear") public Result<Map<String, Object>> clearData(@RequestParam("period") String period) { try { Map<String, Object> stats = importService.clearPeriod(period); return Result.ok(stats); } catch (Exception e) { log.error("clear period {} error", period, 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,64 @@ } } /** æ¸ ç©ºæå®æ¥è¡¨æå ¨é¨å·²å¯¼å ¥æ°æ®ä¸å®¡æ ¸ç»æï¼å«å¯¼å ¥æ¹æ¬¡ãå®¡æ ¸éè¿æ è®°ï¼ï¼ç¨äºæ´æéå¯¼ï¼æèµé¡¹ç®ä¸»æ¡£ä¿ç */ @Transactional(rollbackFor = Exception.class) public Map<String, Object> clearPeriod(String period) { if (period == null || !period.matches("\\d{4}-\\d{2}")) { throw new IllegalArgumentException("æ¥è¡¨ææ ¼å¼ä¸æ£ç¡®ï¼åºä¸º yyyy-MM"); } int dataRows = 0; 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)); int auditRows = auditResultMapper.delete(new LambdaQueryWrapper<AuditResult>() .eq(AuditResult::getReportPeriod, period)); int auditRunRows = auditRunMapper.delete(new LambdaQueryWrapper<AuditRun>() .eq(AuditRun::getReportPeriod, period)); int batchRows = importBatchMapper.delete(new LambdaQueryWrapper<ImportBatch>() .eq(ImportBatch::getReportPeriod, period)); Map<String, Object> stats = new LinkedHashMap<>(); stats.put("period", period); stats.put("dataRows", dataRows); stats.put("auditRows", auditRows); stats.put("auditRunRows", auditRunRows); stats.put("batchRows", batchRows); log.info("æ¸ ç©ºæ¥è¡¨æ {} 宿ï¼ä¸å¡æ°æ® {} è¡ãå®¡æ ¸ç»æ {} è¡ãå®¡æ ¸æ è®° {} è¡ãå¯¼å ¥æ¹æ¬¡ {} è¡", period, dataRows, auditRows, auditRunRows, batchRows); return stats; } /** æ°æ®åååå 餿宿¥è¡¨ç±»åæå®æ¥è¡¨æçå®¡æ ¸ç»æï¼ééæ°æ§è¡å®¡æ ¸ï¼ */ private void deleteRuleResults(String reportType, String period) { List<Long> ruleIds = new ArrayList<>(); traffic-audit-web/src/views/DataImport.vue
@@ -103,7 +103,11 @@ <div v-show="sideOpen" class="side-content"> <div class="side-head"> <span>æ¬æå¯¼å ¥è¿åº¦ï¼{{ period || 'æªéæ©æ¥è¡¨æ' }}ï¼</span> <el-button type="text" icon="el-icon-refresh" @click="loadData">å·æ°</el-button> <span class="side-head-btns"> <el-button type="text" icon="el-icon-refresh" @click="loadData">å·æ°</el-button> <el-button type="text" icon="el-icon-delete" style="color:#F56C6C" :loading="clearing" :disabled="!period || clearing || importing" @click="clearPeriodData">æ¸ ç©º</el-button> </span> </div> <div v-if="!period" class="tip">请å å¨ä¸æ¹éæ©æ¥è¡¨æ</div> <div v-else class="overview-grid"> @@ -158,6 +162,7 @@ period: (() => { const d = new Date(); return d.getFullYear() + '-' + String(d.getMonth() + 1).padStart(2, '0') })(), cityDirLoading: false, importing: false, clearing: false, sideOpen: false, result: '', error: '', @@ -520,6 +525,28 @@ .catch(e => { if (!e || !e._toast) this.$message.error('å¯¼å ¥è®°å½å 载失败ï¼è¯·å·æ°éè¯') }) .finally(() => { this.batchLoading = false }) }, clearPeriodData() { if (!this.period) { this.$message.warning('请å éæ©æ¥è¡¨æ'); return } if (this.importing) { this.$message.warning('æ£å¨å¯¼å ¥æ°æ®ï¼è¯·çå¾ å¯¼å ¥å®æå忏 空'); return } if (this.clearing) return this.$confirm( 'å°æ¸ 空 ' + this.period + ' æ¥è¡¨æå¨æ°æ®åºä¸çå ¨é¨å·²å¯¼å ¥æ°æ®ï¼åæ¶å é¤è¯¥æ¥è¡¨æçå®¡æ ¸ç»æä¸å¯¼å ¥æ¹æ¬¡è®°å½ï¼ä¾¿äºæ´æéæ°å¯¼å ¥ï¼ã\næ¤æä½ä¸å¯æ¤éï¼æ¯å¦ç»§ç»ï¼', 'æ¸ ç©º ' + this.period + ' æ°æ®', { type: 'warning', confirmButtonText: 'ç¡®è®¤æ¸ ç©º', cancelButtonText: 'åæ¶' } ).then(() => { this.clearing = true api.post('/import/clear', null, { params: { period: this.period }, timeout: 600000 }) .then(() => { this.$message.success('å·²æ¸ ç©º ' + this.period + ' æ¥è¡¨æçæ°æ®ï¼å¯ä»¥éæ°å¯¼å ¥') 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 +618,8 @@ .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-head-btns { display: flex; align-items: center; gap: 2px; flex-shrink: 0; } .side-head-btns .el-button + .el-button { margin-left: 0; } .import-side .overview-grid { display: block; } .import-side .ov-row { display: block; margin-bottom: 6px; } .import-side .ov-group { width: auto; }