| New file |
| | |
| | | package com.trafficaudit.reportexport.calc; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.trafficaudit.dataimport.entity.CityBusMonthly; |
| | | import com.trafficaudit.dataimport.entity.CityTaxiMonthly; |
| | | import com.trafficaudit.dataimport.mapper.CityBusMonthlyMapper; |
| | | import com.trafficaudit.dataimport.mapper.CityTaxiMonthlyMapper; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.HashMap; |
| | | import java.util.LinkedHashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * åå¸å®¢è¿å£å¾è®¡ç®æå¡ï¼æ±æ»å¤§è¡¨æ°æ®é©±å¨æ¹é M1-åå¸å®¢è¿-å
¬äº¤/åºç§/轨é轮渡ï¼2026-09-08ï¼ã |
| | | * |
| | | * å£å¾ä¸æ¢æå¤è¡¨å¯¼åº loadCityBusByMonth / loadCityTaxiByMonth / loadCityRailFerryByMonth å®å
¨ä¸è´ |
| | | * ï¼å³çåºçº¿ A2/B4/B5/C7ï¼2026-07 ä¸ _å¤ä»½â¦_æ¸
çå_20260904.xlsx å
¬äº¤/åºç§/轨é轮渡å°è´¦é¡µ O ååå½ 0 å·®å¼ï¼ï¼ |
| | | * - å
¬äº¤/åºç§ï¼ææ â å¸å· â [客è¿é, æ
客å¨è½¬é, åå¸å
客è¿é, åå¸å
æ
客å¨è½¬é]ï¼æ DB city åæ®µåç»ï¼"å
¨ç"=å
¨é¨å¸å·åè®¡ï¼ |
| | | * - 轨é/轮渡ï¼åä¸ city_bus_monthly 表ç rail / ferry åæ®µï¼è½¨é=æ¦æ±/é»ç³ï¼è½®æ¸¡=æ¦æ±ï¼å
¨ç=å计ï¼ã |
| | | * |
| | | * è¾åºä¸ºâæ â å¸å· â double[4]âï¼ç´¯è®¡ç±ååå±å¯¹ 1..m ææ±åã忝æ Q1 以æ¯çç¼å 2025 åç
§ç»ä¸ºåºåï¼ä¸å¨æ¬æå¡è®¡ç®ã |
| | | */ |
| | | @Service |
| | | public class PaxCalc { |
| | | |
| | | public static final String PROVINCE = "å
¨ç"; |
| | | |
| | | @Resource |
| | | private CityBusMonthlyMapper cityBusMapper; |
| | | @Resource |
| | | private CityTaxiMonthlyMapper cityTaxiMapper; |
| | | |
| | | /** å
¬äº¤ï¼æ â å¸å· â [客è¿é,å¨è½¬é,åå¸å
客è¿é,åå¸å
å¨è½¬é] */ |
| | | public Map<Integer, Map<String, double[]>> busMonthly(String yearPrefix, int limit) { |
| | | Map<Integer, Map<String, double[]>> result = new LinkedHashMap<>(); |
| | | List<CityBusMonthly> rows = cityBusMapper.selectList( |
| | | new LambdaQueryWrapper<CityBusMonthly>().likeRight(CityBusMonthly::getReportPeriod, yearPrefix)); |
| | | for (CityBusMonthly r : rows) { |
| | | int m = monthOf(r.getReportPeriod()); |
| | | if (m < 1 || m > limit) continue; |
| | | String city = r.getCity() == null ? "æªç¥" : r.getCity(); |
| | | accumulate(result, city, m, |
| | | nz(r.getPassengerVolume()), nz(r.getTurnover()), |
| | | nz(r.getPassengerCity()), nz(r.getTurnoverCity())); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | /** 巡游åºç§ï¼æ â å¸å· â [客è¿é,å¨è½¬é,åå¸å
客è¿é,åå¸å
å¨è½¬é] */ |
| | | public Map<Integer, Map<String, double[]>> taxiMonthly(String yearPrefix, int limit) { |
| | | Map<Integer, Map<String, double[]>> result = new LinkedHashMap<>(); |
| | | List<CityTaxiMonthly> rows = cityTaxiMapper.selectList( |
| | | new LambdaQueryWrapper<CityTaxiMonthly>().likeRight(CityTaxiMonthly::getReportPeriod, yearPrefix)); |
| | | for (CityTaxiMonthly r : rows) { |
| | | int m = monthOf(r.getReportPeriod()); |
| | | if (m < 1 || m > limit) continue; |
| | | String city = r.getCity() == null ? "æªç¥" : r.getCity(); |
| | | accumulate(result, city, m, |
| | | nz(r.getPassengerVolume()), nz(r.getTurnover()), |
| | | nz(r.getPassengerCity()), nz(r.getTurnoverCity())); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | /** 轨é/è½®æ¸¡ï¼æ â å¸å· â [轨é客è¿é,轨éå¨è½¬é,轮渡客è¿é,轮渡å¨è½¬é] */ |
| | | public Map<Integer, Map<String, double[]>> railFerryMonthly(String yearPrefix, int limit) { |
| | | Map<Integer, Map<String, double[]>> result = new LinkedHashMap<>(); |
| | | List<CityBusMonthly> rows = cityBusMapper.selectList( |
| | | new LambdaQueryWrapper<CityBusMonthly>().likeRight(CityBusMonthly::getReportPeriod, yearPrefix)); |
| | | for (CityBusMonthly r : rows) { |
| | | int m = monthOf(r.getReportPeriod()); |
| | | if (m < 1 || m > limit) continue; |
| | | String city = r.getCity() == null ? "æªç¥" : r.getCity(); |
| | | accumulate(result, city, m, |
| | | nz(r.getRailPassengerVolume()), nz(r.getRailTurnover()), |
| | | nz(r.getFerryPassengerVolume()), nz(r.getFerryTurnover())); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | private void accumulate(Map<Integer, Map<String, double[]>> result, String city, int m, |
| | | double v0, double v1, double v2, double v3) { |
| | | Map<String, double[]> cityMap = result.computeIfAbsent(m, k -> new HashMap<>()); |
| | | double[] arr = cityMap.computeIfAbsent(city, k -> new double[4]); |
| | | arr[0] += v0; |
| | | arr[1] += v1; |
| | | arr[2] += v2; |
| | | arr[3] += v3; |
| | | double[] prov = cityMap.computeIfAbsent(PROVINCE, k -> new double[4]); |
| | | prov[0] += v0; |
| | | prov[1] += v1; |
| | | prov[2] += v2; |
| | | prov[3] += v3; |
| | | } |
| | | |
| | | private int monthOf(String reportPeriod) { |
| | | if (reportPeriod == null) return 0; |
| | | String[] parts = reportPeriod.split("-"); |
| | | if (parts.length < 2) return 0; |
| | | try { |
| | | return Integer.parseInt(parts[1]); |
| | | } catch (NumberFormatException e) { |
| | | return 0; |
| | | } |
| | | } |
| | | |
| | | private double nz(Double v) { return v == null ? 0.0 : v; } |
| | | } |
| | | |