feat: 城市客运导入新增网约车总数/网约车订单及全省总量两母版导入 + 09-04 测试报告
| New file |
| | |
| | | -- åå¸å®¢è¿ç½çº¦è½¦æåº¦è¾å
¥å»ºè¡¨ï¼2026-09-04ï¼ |
| | | -- æ°æ®æº1ï¼æ¨¡æ¿_ç½çº¦è½¦æ»æ°.xlsxï¼æåº¦å
¨ç pinï¼å®¢è¿é/å
¶ä¸åå¸å
/å¨è½¬é/å
¶ä¸åå¸å
å¨è½¬éï¼ |
| | | -- æ°æ®æº2ï¼æ¨¡æ¿_ç½çº¦è½¦è®¢ååå
¨çæ»é.xlsxï¼æåº¦è¾å
¥é¡µï¼B-E å
¨ç pin + F 订åå计 + G-W 17å¸å·è®¢åï¼ |
| | | |
| | | CREATE TABLE IF NOT EXISTS wyc_total_monthly ( |
| | | id BIGINT NOT NULL AUTO_INCREMENT, |
| | | report_period VARCHAR(20) NOT NULL COMMENT 'æ¥è¡¨æ yyyy-MM', |
| | | pin_k DOUBLE DEFAULT NULL COMMENT 'å
¨çç½çº¦è½¦å®¢è¿é(ä¸äººæ¬¡)', |
| | | pin_ck DOUBLE DEFAULT NULL COMMENT 'å
¶ä¸åå¸å
客è¿é', |
| | | pin_z DOUBLE DEFAULT NULL COMMENT 'å
¨ç客è¿å¨è½¬é(ä¸äººå
Ž)', |
| | | pin_cz DOUBLE DEFAULT NULL COMMENT 'å
¶ä¸åå¸å
å¨è½¬é', |
| | | created_at DATETIME DEFAULT CURRENT_TIMESTAMP, |
| | | PRIMARY KEY (id), |
| | | UNIQUE KEY uk_wyc_total_period (report_period) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ç½çº¦è½¦æåº¦å
¨ç pin è¾å
¥'; |
| | | |
| | | CREATE TABLE IF NOT EXISTS wyc_order_monthly ( |
| | | id BIGINT NOT NULL AUTO_INCREMENT, |
| | | report_period VARCHAR(20) NOT NULL COMMENT 'æ¥è¡¨æ yyyy-MM', |
| | | pin_k DOUBLE DEFAULT NULL, |
| | | pin_ck DOUBLE DEFAULT NULL, |
| | | pin_z DOUBLE DEFAULT NULL, |
| | | pin_cz DOUBLE DEFAULT NULL, |
| | | order_sum DOUBLE DEFAULT NULL COMMENT '订åå计ï¼åï¼', |
| | | order_wuhan DOUBLE DEFAULT NULL, |
| | | order_huangshi DOUBLE DEFAULT NULL, |
| | | order_shiyan DOUBLE DEFAULT NULL, |
| | | order_yichang DOUBLE DEFAULT NULL, |
| | | order_xiangyang DOUBLE DEFAULT NULL, |
| | | order_ezhou DOUBLE DEFAULT NULL, |
| | | order_jingmen DOUBLE DEFAULT NULL, |
| | | order_xiaogan DOUBLE DEFAULT NULL, |
| | | order_jingzhou DOUBLE DEFAULT NULL, |
| | | order_huanggang DOUBLE DEFAULT NULL, |
| | | order_xianning DOUBLE DEFAULT NULL, |
| | | order_suizhou DOUBLE DEFAULT NULL, |
| | | order_enshi DOUBLE DEFAULT NULL, |
| | | order_xiantao DOUBLE DEFAULT NULL, |
| | | order_qianjiang DOUBLE DEFAULT NULL, |
| | | order_tianmen DOUBLE DEFAULT NULL, |
| | | order_shennong DOUBLE DEFAULT NULL, |
| | | created_at DATETIME DEFAULT CURRENT_TIMESTAMP, |
| | | PRIMARY KEY (id), |
| | | UNIQUE KEY uk_wyc_order_period (report_period) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ç½çº¦è½¦è®¢ååå
¨çæ»éæåº¦è¾å
¥'; |
| New file |
| | |
| | | # åè½æµè¯æ¥åï¼åå¸å®¢è¿å¯¼å
¥ä¸ææ°å¢ç½çº¦è½¦å¯¼å
¥ï¼2026-09-04ï¼ |
| | | |
| | | ## åè½è¯´æ |
| | | 2026-09-04 ç¨æ·ææ¿ï¼æ°æ®å¯¼å
¥ââåå¸å®¢è¿æ¨¡å䏿å¢å ãç½çº¦è½¦æ»æ°ãä¸ãç½çº¦è½¦è®¢ååå
¨çæ»éãä¸¤é¡¹ï¼æ¯çæ¾äº docs/åå¸å®¢è¿/ãæ¬æ¬¡å®ç°ï¼ |
| | | - å端æ°å¢å¯¼å
¥æ¥å£ï¼POST /api/import/wycTotalãPOST /api/import/wycOrderï¼ |
| | | - æ°å¢è¡¨ wyc_total_monthlyï¼å
¨ç pinï¼ä¸ wyc_order_monthlyï¼pin + 订åå计 + 17å¸å·è®¢åï¼ï¼ææ¥è¡¨æå
å åæãå¹ç upsertï¼åæ¶è®°å½æ¹æ¬¡ï¼WYC_TOTAL / WYC_ORDERï¼ä¾å¯¼å
¥è¿åº¦ä¸å岿¾ç¤ºï¼ |
| | | - å端 DataImport.vueï¼åå¸å®¢è¿ä¸ææ°å¢ä¸¤é¡¹ãTYPE_LABELS / BATCH_TYPE_MAPãæ¨¡æ¿å/ä¸è½½ URLï¼å¯¹åºæ¯çï¼ãendpoint æ å°å
¨é¨è¡¥é½ã |
| | | |
| | | ä»£ç æ¹å¨ï¼å¾
æ¨éï¼ï¼ |
| | | - traffic-audit-server/src/main/java/com/trafficaudit/dataimport/entity/WycTotalMonthly.javaãWycOrderMonthly.javaï¼æ°å¢ï¼@TableField åºå® pin_ck/pin_cz ååï¼ |
| | | - traffic-audit-server/src/main/java/com/trafficaudit/dataimport/mapper/WycTotalMonthlyMapper.javaãWycOrderMonthlyMapper.javaï¼æ°å¢ï¼ |
| | | - traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.javaï¼æ°å¢ importWycTotal/importWycOrder/upsertWyc/upsertWycTotal/periodOfCell/dbl/dblN ååå caseï¼ |
| | | - traffic-audit-server/src/main/java/com/trafficaudit/dataimport/controller/DataImportController.javaï¼æ°å¢ä¸¤ä¸ªç«¯ç¹ï¼ |
| | | - traffic-audit-web/src/views/DataImport.vueï¼ä¸æ/æ ç¾/模æ¿/端ç¹ï¼ |
| | | - docs/sql_wyc.sqlï¼å»ºè¡¨ DDL æ²æ·ï¼ |
| | | |
| | | ## æµè¯ç¯å¢ |
| | | - å端 8090ï¼éå¯å就绪ï¼ï¼å端 dev server 8080ï¼DataImport.vue æ¹å¨åçç¼è¯ Compiled successfullyï¼ï¼MySQL 127.0.0.1:3308 traffic_auditï¼æ¯ç为 docs/åå¸å®¢è¿/模æ¿_ç½çº¦è½¦æ»æ°.xlsxãæ¨¡æ¿_ç½çº¦è½¦è®¢ååå
¨çæ»é.xlsxï¼å®é
ç¼è¾çï¼å« 2026-01~07ï¼ã |
| | | - æ¹æ³ï¼HTTP å®é
导å
¥ï¼ä¸æºæä»¶é项对é½ãå¹çéå¯¼ãæ¨¡æ¿ä¸è½½ URLãç©ºæ°æ®è´åç¨ä¾ã |
| | | |
| | | ## ç¨ä¾ä¸ç»æ |
| | | 1. ç½çº¦è½¦æ»æ°å¯¼å
¥ï¼æ£åï¼ï¼ä¸ä¼ 模æ¿_ç½çº¦è½¦æ»æ°.xlsxï¼æ¥å£è¿åâ导å
¥æåï¼å
± 7 æâï¼DB ä¸ 2026-01~07 å
¨ç pin B-E 䏿¯çéæä¸è´ï¼å¦ 2026-07 = 4852.3/4430.84/28348.02/22705.61ï¼ãç»è®º PASSã |
| | | 2. ç½çº¦è½¦è®¢å导å
¥ï¼æ£åï¼ï¼ä¸ä¼ 模æ¿_ç½çº¦è½¦è®¢ååå
¨çæ»é.xlsxï¼å
± 7 æï¼2026-07 F=订åå计 29730791ãG-W 17å¸å·ä¸æ¯çä¸è´ï¼æ¦æ± 11183267â¦ç¥åæ¶ 3534ï¼ï¼2026-01~06 订åå为 NULLï¼æ¯çæ æ°æ®ï¼æ£ç¡®ï¼ãç»è®º PASSã |
| | | 3. å¹çéå¤å¯¼å
¥ï¼æ£åï¼ï¼åæä»¶éå¤ä¸ä¼ ï¼ä¸¤è¡¨æ°æ®ä»å 7 è¡ä¸å¼ä¸åï¼å
å åæï¼ï¼æ¹æ¬¡è¡¨æ¯æ¬¡å¯¼å
¥åè®°å½ãç»è®º PASSã |
| | | 4. 模æ¿ä¸è½½ï¼æ£åï¼ï¼GET /api/templates/åå¸å®¢è¿/模æ¿_ç½çº¦è½¦æ»æ°.xlsx ä¸ è®¢åçå 200ãç»è®º PASSã |
| | | 5. ç©ºæ°æ®æä»¶ï¼è´åï¼ï¼ä¸ä¼ åªå«è¡¨å¤´ç xlsxï¼è¿å code 500ãæç¤ºâæªè¯å«å°æææä»½è¡ï¼A ååºä¸ºæ¥æï¼å¦ 2026-07ï¼â¦âï¼éè¯¯ææ¡æ¸
æ°ãç»è®º PASSï¼é¢æå¤±è´¥ï¼ã |
| | | 6. ç¼è¯ä¸å¯å¨ï¼å端 mvn compile EXIT=0ï¼åç«¯èæ¬ node --check éè¿ä¸ dev server çç¼è¯æåãç»è®º PASSã |
| | | |
| | | ## åç°çé®é¢ä¸å¤ç½® |
| | | 1. æ°å¢ Mapper æ¥å£å°¾é¨æ®çâ{{}}âï¼æ½è±¡æ¹æ³ä½ï¼å¯¼è´ç¼è¯å¤±è´¥ï¼å·²ä¿®ä¸ºâ{}âã |
| | | 2. DataImportService.periodOfCell æ£å \d æªè½¬ä¹ä¸º \\dï¼Java å符串âéæ³è½¬ä¹âç¼è¯å¤±è´¥ï¼ï¼å·²ä¿®å¤ã |
| | | 3. 馿¬¡å¯¼å
¥è¿åâå
± 0 æâï¼åå 为å®ä½å段 pinCK/pinCZ ä¸å线çç¥æ å°ä¸º pin_c_k/pin_c_zï¼ä¸è¡¨å pin_ck/pin_cz ä¸å¹é
ï¼insert æ¥ Unknown columnï¼å¤çï¼å®ä½å¢å @TableField("pin_ck")/@TableField("pin_cz")ï¼å¤æµå 7 æå
¨é¨å
¥åºã |
| | | |
| | | ## ç»è®º |
| | | åå¸å®¢è¿å¯¼å
¥ä¸ææ°å¢ä¸¤é¡¹ç½çº¦è½¦å¯¼å
¥åè½å·²å®ç°å¹¶éè¿æµè¯ï¼æ£åï¼å®é
æ¯ç 1-7 æï¼ãå¹çéå¯¼ãæ¨¡æ¿ä¸è½½ãç©ºæ°æ®è´åå符å颿ï¼å
¥åºæ°æ®ä¸æºæä»¶é项ä¸è´ãåç«¯ä¸æé¡¹è¿éç¨æ·å¨é¡µé¢ç¹å»äººå·¥è¿ä¸ç¼ã |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | /** ç½çº¦è½¦æ»æ°ï¼æåº¦å
¨ç pinï¼æ¨¡æ¿_ç½çº¦è½¦æ»æ°.xlsxï¼ */ |
| | | @PostMapping("/wycTotal") |
| | | public Result<String> importWycTotal(@RequestParam("file") MultipartFile file, |
| | | @RequestParam("period") String period) { |
| | | try { |
| | | int count = importService.importWycTotal(file, period); |
| | | return Result.ok("ç½çº¦è½¦æ»æ°å¯¼å
¥æå, å
± " + count + " æ"); |
| | | } catch (Exception e) { |
| | | log.error("wycTotal import error", e); |
| | | return Result.error("导å
¥å¤±è´¥: " + e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | /** ç½çº¦è½¦è®¢ååå
¨çæ»éï¼æ¨¡æ¿_ç½çº¦è½¦è®¢ååå
¨çæ»é.xlsxï¼ */ |
| | | @PostMapping("/wycOrder") |
| | | public Result<String> importWycOrder(@RequestParam("file") MultipartFile file, |
| | | @RequestParam("period") String period) { |
| | | try { |
| | | int count = importService.importWycOrder(file, period); |
| | | return Result.ok("ç½çº¦è½¦è®¢ååå
¨çæ»é导å
¥æå, å
± " + count + " æ"); |
| | | } catch (Exception e) { |
| | | log.error("wycOrder import error", e); |
| | | return Result.error("导å
¥å¤±è´¥: " + e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | /** æèµææ¥ï¼å
¨çæ±æ»å¤§è¡¨ï¼ï¼category=客è¿ç«åº/ç©æµååº */ |
| | | @PostMapping("/investment") |
| | | public Result<String> importInvestment(@RequestParam("file") MultipartFile file, |
| New file |
| | |
| | | package com.trafficaudit.dataimport.entity; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** ç½çº¦è½¦è®¢ååå
¨çæ»éæåº¦è¾å
¥ï¼æºï¼æ¨¡æ¿_ç½çº¦è½¦è®¢ååå
¨çæ»é.xlsx æåº¦è¾å
¥é¡µï¼ */ |
| | | @Data |
| | | @TableName("wyc_order_monthly") |
| | | public class WycOrderMonthly { |
| | | @TableId(type = IdType.AUTO) |
| | | private Long id; |
| | | /** æ¥è¡¨æ yyyy-MM */ |
| | | private String reportPeriod; |
| | | /** B-E å
¨ç pin */ |
| | | private Double pinK; |
| | | @TableField("pin_ck") |
| | | private Double pinCK; |
| | | private Double pinZ; |
| | | @TableField("pin_cz") |
| | | private Double pinCZ; |
| | | /** F 订åå计ï¼åï¼ */ |
| | | private Double orderSum; |
| | | /** G-W 17 å¸å·è®¢åï¼æ RegionUtil.cityList é¡ºåº */ |
| | | private Double orderWuhan; |
| | | private Double orderHuangshi; |
| | | private Double orderShiyan; |
| | | private Double orderYichang; |
| | | private Double orderXiangyang; |
| | | private Double orderEzhou; |
| | | private Double orderJingmen; |
| | | private Double orderXiaogan; |
| | | private Double orderJingzhou; |
| | | private Double orderHuanggang; |
| | | private Double orderXianning; |
| | | private Double orderSuizhou; |
| | | private Double orderEnshi; |
| | | private Double orderXiantao; |
| | | private Double orderQianjiang; |
| | | private Double orderTianmen; |
| | | private Double orderShennong; |
| | | private LocalDateTime createdAt; |
| | | } |
| New file |
| | |
| | | package com.trafficaudit.dataimport.entity; |
| | | |
| | | import com.baomidou.mybatisplus.annotation.IdType; |
| | | import com.baomidou.mybatisplus.annotation.TableField; |
| | | import com.baomidou.mybatisplus.annotation.TableId; |
| | | import com.baomidou.mybatisplus.annotation.TableName; |
| | | import lombok.Data; |
| | | |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** ç½çº¦è½¦æ»æ°æåº¦è¾å
¥ï¼æºï¼æ¨¡æ¿_ç½çº¦è½¦æ»æ°.xlsxï¼B-E 为å
¨ç pinï¼ */ |
| | | @Data |
| | | @TableName("wyc_total_monthly") |
| | | public class WycTotalMonthly { |
| | | @TableId(type = IdType.AUTO) |
| | | private Long id; |
| | | /** æ¥è¡¨æ yyyy-MM */ |
| | | private String reportPeriod; |
| | | /** å
¨çç½çº¦è½¦å®¢è¿éï¼ä¸äººæ¬¡ï¼ */ |
| | | private Double pinK; |
| | | /** å
¶ä¸åå¸å
客è¿éï¼ä¸äººæ¬¡ï¼ */ |
| | | @TableField("pin_ck") |
| | | private Double pinCK; |
| | | /** å
¨çç½çº¦è½¦å¨è½¬éï¼ä¸äººå
¬éï¼ */ |
| | | private Double pinZ; |
| | | /** å
¶ä¸åå¸å
å¨è½¬éï¼ä¸äººå
¬éï¼ */ |
| | | @TableField("pin_cz") |
| | | private Double pinCZ; |
| | | private LocalDateTime createdAt; |
| | | } |
| New file |
| | |
| | | package com.trafficaudit.dataimport.mapper; |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.trafficaudit.dataimport.entity.WycOrderMonthly; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | @Mapper |
| | | public interface WycOrderMonthlyMapper extends BaseMapper<WycOrderMonthly> {} |
| New file |
| | |
| | | package com.trafficaudit.dataimport.mapper; |
| | | import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
| | | import com.trafficaudit.dataimport.entity.WycTotalMonthly; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | @Mapper |
| | | public interface WycTotalMonthlyMapper extends BaseMapper<WycTotalMonthly> {} |
| | |
| | | import com.trafficaudit.dataimport.entity.CityBusMonthly; |
| | | import com.trafficaudit.dataimport.entity.CityTaxiMonthly; |
| | | import com.trafficaudit.dataimport.entity.CityTaxiAuth; |
| | | import com.trafficaudit.dataimport.entity.WycOrderMonthly; |
| | | import com.trafficaudit.dataimport.entity.WycTotalMonthly; |
| | | import com.trafficaudit.dataimport.entity.ScaleSplitTransport; |
| | | import com.trafficaudit.dataimport.entity.TransportAuthVehicle; |
| | | import com.trafficaudit.dataimport.entity.VehicleTrackMileage; |
| | |
| | | import com.trafficaudit.dataimport.mapper.CityBusMonthlyMapper; |
| | | import com.trafficaudit.dataimport.mapper.CityTaxiMonthlyMapper; |
| | | import com.trafficaudit.dataimport.mapper.CityTaxiAuthMapper; |
| | | import com.trafficaudit.dataimport.mapper.WycOrderMonthlyMapper; |
| | | import com.trafficaudit.dataimport.mapper.WycTotalMonthlyMapper; |
| | | import com.trafficaudit.dataimport.mapper.ScaleSplitTransportMapper; |
| | | import com.trafficaudit.dataimport.mapper.TransportAuthVehicleMapper; |
| | | import com.trafficaudit.dataimport.mapper.VehicleTrackMileageMapper; |
| | |
| | | private CityTaxiMonthlyMapper cityTaxiMapper; |
| | | @Resource |
| | | private CityTaxiAuthMapper cityTaxiAuthMapper; |
| | | @Resource |
| | | private WycTotalMonthlyMapper wycTotalMapper; |
| | | @Resource |
| | | private WycOrderMonthlyMapper wycOrderMapper; |
| | | @Resource |
| | | private SqlSessionFactory sqlSessionFactory; |
| | | |
| | |
| | | return success; |
| | | } |
| | | |
| | | |
| | | // ========== ç½çº¦è½¦æåº¦è¾å
¥å¯¼å
¥ï¼å
¨ç pin / 订åï¼ ========== |
| | | |
| | | /** ç½çº¦è½¦æ»æ°æåº¦è¾å
¥ï¼æ¨¡æ¿_ç½çº¦è½¦æ»æ°.xlsxï¼sheet1ï¼A å=æä»½æ¥æï¼B=å
¨ç客è¿é C=å
¶ä¸åå¸å
D=å¨è½¬é E=å
¶ä¸åå¸å
å¨è½¬éï¼ãæ´è¡¨ææ¥è¡¨æè¦çã */ |
| | | public synchronized int importWycTotal(MultipartFile file, String period) throws Exception { |
| | | Map<String, WycTotalMonthly> rows = new LinkedHashMap<>(); |
| | | try (Workbook wb = WorkbookFactory.create(file.getInputStream())) { |
| | | Sheet sheet = wb.getSheetAt(0); |
| | | for (int r = 2; r <= sheet.getLastRowNum(); r++) { |
| | | Row row = sheet.getRow(r); |
| | | if (row == null) continue; |
| | | String rp = periodOfCell(row.getCell(0)); |
| | | if (rp == null) continue; |
| | | double pk = dbl(row, 1), pck = dbl(row, 2), pz = dbl(row, 3), pcz = dbl(row, 4); |
| | | if (pk <= 0 && pck <= 0 && pz <= 0 && pcz <= 0) continue; |
| | | WycTotalMonthly item = new WycTotalMonthly(); |
| | | item.setReportPeriod(rp); |
| | | item.setPinK(pk > 0 ? pk : null); |
| | | item.setPinCK(pck > 0 ? pck : null); |
| | | item.setPinZ(pz > 0 ? pz : null); |
| | | item.setPinCZ(pcz > 0 ? pcz : null); |
| | | rows.put(rp, item); |
| | | } |
| | | } |
| | | if (rows.isEmpty()) throw new RuntimeException("æªè¯å«å°æææä»½è¡ï¼A ååºä¸ºæ¥æï¼å¦ 2026-07ï¼ï¼B-E 为å
¨ç客è¿é/åå¸å
/å¨è½¬é/åå¸å
å¨è½¬é"); |
| | | int ok = upsertWycTotal(rows); |
| | | log.info("WycTotal imported: {} periods ok={}", rows.size(), ok); |
| | | return ok; |
| | | } |
| | | |
| | | /** ç½çº¦è½¦è®¢ååå
¨çæ»éï¼æ¨¡æ¿_ç½çº¦è½¦è®¢ååå
¨çæ»é.xlsx é¦ä¸ªæ°æ® sheetï¼A=æä»½ï¼B-E=å
¨ç pinï¼F=订åå计ï¼G-W=17 å¸å·è®¢åï¼ */ |
| | | public synchronized int importWycOrder(MultipartFile file, String period) throws Exception { |
| | | Map<String, WycOrderMonthly> rows = new LinkedHashMap<>(); |
| | | try (Workbook wb = WorkbookFactory.create(file.getInputStream())) { |
| | | Sheet sheet = wb.getSheetAt(0); |
| | | int head = -1; |
| | | for (int r = 0; r <= Math.min(sheet.getLastRowNum(), 4); r++) { |
| | | Row row = sheet.getRow(r); |
| | | if (row == null) continue; |
| | | String a = getString(row, 0); |
| | | if (a != null && a.contains("æä»½")) { head = r; break; } |
| | | } |
| | | if (head < 0) throw new RuntimeException("æªæ¾å°è¡¨å¤´ï¼A åéå«âæä»½â"); |
| | | for (int r = head + 1; r <= sheet.getLastRowNum(); r++) { |
| | | Row row = sheet.getRow(r); |
| | | if (row == null) continue; |
| | | String rp = periodOfCell(row.getCell(0)); |
| | | if (rp == null) continue; |
| | | double pk = dbl(row, 1), pck = dbl(row, 2), pz = dbl(row, 3), pcz = dbl(row, 4), sum = dbl(row, 5); |
| | | double citySum = 0; |
| | | for (int k = 0; k < 17; k++) citySum += dbl(row, 6 + k); |
| | | if (pk <= 0 && pck <= 0 && pz <= 0 && pcz <= 0 && sum <= 0 && citySum <= 0) continue; |
| | | WycOrderMonthly it = new WycOrderMonthly(); |
| | | it.setReportPeriod(rp); |
| | | it.setPinK(pk > 0 ? pk : null); |
| | | it.setPinCK(pck > 0 ? pck : null); |
| | | it.setPinZ(pz > 0 ? pz : null); |
| | | it.setPinCZ(pcz > 0 ? pcz : null); |
| | | if (sum <= 0 && citySum > 0) sum = citySum; |
| | | it.setOrderSum(sum > 0 ? sum : null); |
| | | it.setOrderWuhan(dblN(row, 6)); |
| | | it.setOrderHuangshi(dblN(row, 7)); |
| | | it.setOrderShiyan(dblN(row, 8)); |
| | | it.setOrderYichang(dblN(row, 9)); |
| | | it.setOrderXiangyang(dblN(row, 10)); |
| | | it.setOrderEzhou(dblN(row, 11)); |
| | | it.setOrderJingmen(dblN(row, 12)); |
| | | it.setOrderXiaogan(dblN(row, 13)); |
| | | it.setOrderJingzhou(dblN(row, 14)); |
| | | it.setOrderHuanggang(dblN(row, 15)); |
| | | it.setOrderXianning(dblN(row, 16)); |
| | | it.setOrderSuizhou(dblN(row, 17)); |
| | | it.setOrderEnshi(dblN(row, 18)); |
| | | it.setOrderXiantao(dblN(row, 19)); |
| | | it.setOrderQianjiang(dblN(row, 20)); |
| | | it.setOrderTianmen(dblN(row, 21)); |
| | | it.setOrderShennong(dblN(row, 22)); |
| | | rows.put(rp, it); |
| | | } |
| | | } |
| | | if (rows.isEmpty()) throw new RuntimeException("æªè¯å«å°æææä»½è¡ï¼A ååºä¸º yyyy-MMï¼B-E å
¨ç pin / F å计 / G-W 17 å¸å·è®¢å"); |
| | | int ok = upsertWyc(rows); |
| | | log.info("WycOrder imported: {} periods ok={}", rows.size(), ok); |
| | | return ok; |
| | | } |
| | | |
| | | private int upsertWyc(Map<String, WycOrderMonthly> rows) { |
| | | int ok = 0, fail = 0; |
| | | for (WycOrderMonthly item : rows.values()) { |
| | | try { |
| | | wycOrderMapper.delete(new LambdaQueryWrapper<WycOrderMonthly>().eq(WycOrderMonthly::getReportPeriod, item.getReportPeriod())); |
| | | wycOrderMapper.insert(item); |
| | | recordBatch("ç½çº¦è½¦è®¢ååå
¨çæ»é", "WYC_ORDER", item.getReportPeriod(), 1, 1, 0, null); |
| | | ok++; |
| | | } catch (Exception e) { |
| | | fail++; |
| | | log.error("WycOrder insert error period={}", item.getReportPeriod(), e); |
| | | } |
| | | } |
| | | return ok; |
| | | } |
| | | |
| | | private int upsertWycTotal(Map<String, WycTotalMonthly> rows) { |
| | | int ok = 0, fail = 0; |
| | | for (WycTotalMonthly item : rows.values()) { |
| | | try { |
| | | wycTotalMapper.delete(new LambdaQueryWrapper<WycTotalMonthly>().eq(WycTotalMonthly::getReportPeriod, item.getReportPeriod())); |
| | | wycTotalMapper.insert(item); |
| | | recordBatch("ç½çº¦è½¦æ»æ°", "WYC_TOTAL", item.getReportPeriod(), 1, 1, 0, null); |
| | | ok++; |
| | | } catch (Exception e) { |
| | | fail++; |
| | | log.error("WycTotal insert error period={}", item.getReportPeriod(), e); |
| | | } |
| | | } |
| | | return ok; |
| | | } |
| | | |
| | | private String periodOfCell(Cell c) { |
| | | if (c == null) return null; |
| | | if (c.getCellType() == CellType.NUMERIC) { |
| | | try { |
| | | double v = c.getNumericCellValue(); |
| | | if (v >= 40000 && v <= 60000) { |
| | | java.util.Date d = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(v); |
| | | java.text.SimpleDateFormat f = new java.text.SimpleDateFormat("yyyy-MM"); |
| | | return f.format(d); |
| | | } |
| | | } catch (Exception ignore) { } |
| | | } |
| | | String s = null; |
| | | try { s = c.getStringCellValue(); } catch (Exception ignore) { } |
| | | if (s != null) { |
| | | java.util.regex.Matcher m = java.util.regex.Pattern.compile("(\\d{4})[-/.å¹´](\\d{1,2})").matcher(s.trim()); |
| | | if (m.find()) return String.format("%04d-%02d", Integer.parseInt(m.group(1)), Integer.parseInt(m.group(2))); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | private double dbl(Row row, int idx) { |
| | | Double v = getDecimal(row, idx); |
| | | return v == null ? 0.0 : v; |
| | | } |
| | | |
| | | private Double dblN(Row row, int idx) { |
| | | Double v = getDecimal(row, idx); |
| | | return (v == null || v <= 0) ? null : v; |
| | | } |
| | | |
| | | /** è¿æ¿åºç§è½¦å¸å·æåï¼éè·¯è¿è¾è¯åå·âæ¡£æ¡å·âç»è¥æå·â䏿·å°åï¼å 6 ä½åºå代ç */ |
| | | private static final java.util.regex.Pattern TAXI_REGION_PAT = |
| | | java.util.regex.Pattern.compile("(4290\\d{2}|42(?:0[1-9]|1[0-3]|28)\\d{2})"); |
| | |
| | | case "trackMileage": return new ImportResult(importTrackMileage(file, period), 0, new ArrayList<>()); |
| | | case "freightTurnover": return new ImportResult(importFreightTurnover(file, period), 0, new ArrayList<>()); |
| | | case "scaleSplit": return new ImportResult(importScaleSplit(file, period), 0, new ArrayList<>()); |
| | | case "wycTotal": return new ImportResult(importWycTotal(file, period), 0, new ArrayList<>()); |
| | | case "wycOrder": return new ImportResult(importWycOrder(file, period), 0, new ArrayList<>()); |
| | | default: throw new RuntimeException("䏿¯æç导å
¥ç±»åï¼" + type); |
| | | } |
| | | } |
| | |
| | | <template> |
| | | SKIP/CHECK (0): TYPE_LABELS upper <template> |
| | | <el-container direction="vertical"> |
| | | <app-header title="交éç»è®¡æ¥è¡¨å®¡æ ¸ç³»ç» - æ°æ®å¯¼å
¥"></app-header> |
| | | <el-container> |
| | |
| | | investCityPassenger: 'å¸å·å表ï¼å®¢è¿ç«åºï¼', investCityLogistics: 'å¸å·å表ï¼ç©æµååºï¼', |
| | | 'INVEST_客è¿ç«åº_CITY': 'å¸å·å表ï¼å®¢è¿ç«åºï¼', 'INVEST_ç©æµååº_CITY': 'å¸å·å表ï¼ç©æµååºï¼', |
| | | cityBus: 'åå¸å
¬äº¤ææ¥', cityTaxi: '巡游åºç§ææ¥', cityTaxiAuth: 'åºç§è½¦è¿æ¿è½¦è¾', |
| | | wycTotal: 'ç½çº¦è½¦æ»æ°', wycOrder: 'ç½çº¦è½¦è®¢ååå
¨çæ»é', |
| | | H2032: 'H203-2ææ¥', H2031: 'H203-1æ
å®¢ææ¥', H204: 'H204è½è壿¥', PASSENGER_AUTH: 'æ
å®¢è¿æ¿è½¦è¾æ°', |
| | | PASSENGER_INDIVIDUAL: '个ä½å®¢è¿é/å¨è½¬é', ENERGY_AUTH: 'è½è车è¾è¿æ¿ä¿¡æ¯', TRANSPORT_AUTH: 'è¿æ¿è½¦è¾', |
| | | TRACK_MILEAGE: '轨迹éç¨', SCALE_SPLIT: 'è§ä¸è§ä¸æå', FREIGHT_TURNOVER: 'è´§è¿éå¨è½¬é', |
| | | INVEST_SYSTEM: 'æèµç³»ç»å¯¼åº', CITY_BUS: 'åå¸å
¬äº¤ææ¥', CITY_TAXI: '巡游åºç§ææ¥', CITY_TAXI_AUTH: 'åºç§è½¦è¿æ¿è½¦è¾' |
| | | INVEST_SYSTEM: 'æèµç³»ç»å¯¼åº', CITY_BUS: 'åå¸å
¬äº¤ææ¥', CITY_TAXI: '巡游åºç§ææ¥', CITY_TAXI_AUTH: 'åºç§è½¦è¿æ¿è½¦è¾', WYC_TOTAL: 'ç½çº¦è½¦æ»æ°', WYC_ORDER: 'ç½çº¦è½¦è®¢ååå
¨çæ»é' |
| | | } |
| | | const BATCH_TYPE_MAP = { |
| | | H2032: 'h2032', TRANSPORT_AUTH: 'transportAuth', TRACK_MILEAGE: 'trackMileage', |
| | |
| | | H2031: 'passengerMonthly', PASSENGER_AUTH: 'passengerAuth', PASSENGER_INDIVIDUAL: 'passengerIndividual', |
| | | H204: 'energyMonthly', ENERGY_AUTH: 'energyAuth', |
| | | CITY_BUS: 'cityBus', CITY_TAXI: 'cityTaxi', CITY_TAXI_AUTH: 'cityTaxiAuth', |
| | | WYC_TOTAL: 'wycTotal', WYC_ORDER: 'wycOrder', |
| | | INVEST_SYSTEM: 'investmentSystem' |
| | | } |
| | | export default { |
| | |
| | | key: 'city', name: 'åå¸å®¢è¿', types: [ |
| | | { value: 'cityBus', label: 'åå¸å
Œ
±äº¤éæåº¦è¿è¥æ
åµ' }, |
| | | { value: 'cityTaxi', label: '巡游åºç§æ±½è½¦è¿è¥æå¡æ
嵿æ¥' }, |
| | | { value: 'cityTaxiAuth', label: 'åºç§è½¦è¿æ¿è½¦è¾' } |
| | | { value: 'cityTaxiAuth', label: 'åºç§è½¦è¿æ¿è½¦è¾' }, |
| | | { value: 'wycTotal', label: 'ç½çº¦è½¦æ»æ°' }, |
| | | { value: 'wycOrder', label: 'ç½çº¦è½¦è®¢ååå
¨çæ»é' } |
| | | ] |
| | | }, |
| | | { |
| | |
| | | investCityLogistics: 'âï¼æ¹éæ«æç®å½ï¼æ 鿍¡æ¿ï¼', |
| | | cityBus: '导å
¥_åå¸å
Œ
±äº¤éæåº¦è¿è¥æ
åµï¼YYYYå¹´Mæï¼.xls/.xlsxï¼ä¼ä¸çº§æç»ï¼åå
Œ
±æ±½çµè½¦å段ï¼', |
| | | cityTaxi: '导å
¥_巡游åºç§æ±½è½¦è¿è¥æå¡æ
嵿æ¥ï¼YYYYå¹´Mæï¼.xlsï¼å¸å·çº§17è¡ï¼', |
| | | cityTaxiAuth: '导å
¥æ¨¡æ¿_åºç§è½¦ä¿¡æ¯(è¿æ¿è½¦è¾ä¿¡æ¯).xlsxï¼è½¦è¾çº§æç»ï¼ç¨äºè¿è¥è½¦æ°å¯¹æ¯ï¼' |
| | | cityTaxiAuth: '导å
¥æ¨¡æ¿_åºç§è½¦ä¿¡æ¯(è¿æ¿è½¦è¾ä¿¡æ¯).xlsxï¼è½¦è¾çº§æç»ï¼ç¨äºè¿è¥è½¦æ°å¯¹æ¯ï¼', |
| | | wycTotal: '模æ¿_ç½çº¦è½¦æ»æ°.xlsxï¼Aå=æä»½ï¼B-E=å
¨ç客è¿é/åå¸å
/å¨è½¬é/åå¸å
å¨è½¬éï¼', |
| | | wycOrder: '模æ¿_ç½çº¦è½¦è®¢ååå
¨çæ»é.xlsxï¼Aå=æä»½ï¼B-E=å
¨çpinï¼F=订åå计ï¼G-W=17å¸å·è®¢åï¼' |
| | | } |
| | | return map[this.importType] || '' |
| | | }, |
| | |
| | | cityBus: 'åå¸å®¢è¿/çæ_åå¸å
¬äº¤å®¢è¿éåå¸å·æç».xlsx', |
| | | cityTaxi: 'åå¸å®¢è¿/çæ_巡游åºç§å®¢è¿éåå¸å·æç».xlsx', |
| | | cityTaxiAuth: 'åå¸å®¢è¿/导å
¥æ¨¡æ¿_åºç§è½¦ä¿¡æ¯(è¿æ¿è½¦è¾ä¿¡æ¯).xlsx', |
| | | wycTotal: 'åå¸å®¢è¿/模æ¿_ç½çº¦è½¦æ»æ°.xlsx', |
| | | wycOrder: 'åå¸å®¢è¿/模æ¿_ç½çº¦è½¦è®¢ååå
¨çæ»é.xlsx', |
| | | investment: 'æèµ/è¾å
¥/客è¿ï¼å®¢è¿ç«ï¼/æ´æ°_7æå®¢è¿ç«æèµæç»è¡¨ï¼å¸å·æ±æ»å¤§è¡¨ï¼ç»é¢å¯¼ï¼.xlsx', |
| | | investmentLogistics: 'æèµ/è¾å
¥/ç©æµï¼ç©æµååºï¼/æ´æ°_7æç©æµç«åºæèµæç».xls', |
| | | investmentSystem: 'æèµ/模æ¿_æ¥è¯¢ç»æ(æèµç³»ç»-客è¿+ç©æµ 2026.7).xls' |
| | |
| | | investmentSystem: '/import/investmentSystem', |
| | | cityBus: '/import/cityBus', |
| | | cityTaxi: '/import/cityTaxi', |
| | | cityTaxiAuth: '/import/cityTaxiAuth' |
| | | cityTaxiAuth: '/import/cityTaxiAuth', |
| | | wycTotal: '/import/wycTotal', |
| | | wycOrder: '/import/wycOrder' |
| | | } |
| | | return map[t] || '' |
| | | }, |