| docs/功能测试报告/功能测试报告_M1-班线包车MidCalc_2026-09-08.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| docs/工作日结/工作日结_2026-09-08.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| traffic-audit-server/src/main/java/com/trafficaudit/reportexport/calc/MidCalc.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
docs/¹¦ÄܲâÊÔ±¨¸æ/¹¦ÄܲâÊÔ±¨¸æ_M1-°àÏß°ü³µMidCalc_2026-09-08.md
New file @@ -0,0 +1,44 @@ # åè½æµè¯æ¥åï¼M1-ç线å 车ï¼MidCalc ä¼ä¸+个ä½åæ°ï¼ä¸ 7 æåå½ï¼2026-09-08ï¼ ## ä¸ãåè½è¯´æ æ±æ»å¤§è¡¨æ°æ®é©±å¨æ¹é M1 第äºåï¼æâç线å 车页âçæ°æ®åºåæ°åºå为å¯å¤ç¨ Java è®¡ç®æå¡ `MidCalc`ï¼`traffic-audit-server/.../reportexport/calc/MidCalc.java`ï¼ï¼è¾åº âæ â å¸å·/å ¨ç â [客è¿é(å«ä¸ªä½), å¨è½¬é(å«ä¸ªä½), 个ä½å®¢è¿é, 个ä½å¨è½¬é]ï¼ä¸äºº/ä¸äººå ¬éï¼âã 宿¯ä¸å£å¾æç»/æå/åæ/éè·¯è¿è¾å¨è½¬éçæ´¾ç页卿°æ®åºä¸å¯ä¸çå ¬è·¯ççº¿æ°æ®æºã ## äºãæµè¯ç¯å¢ - åºï¼`traffic_audit`ï¼127.0.0.1:3308ï¼ï¼æ°æ® = 2026-01~07 å·²å¯¼å ¥ç°ç¶ï¼ - æ¯çåºçº¿ï¼`docs/çææ±æ»å¤§è¡¨/_å¤ä»½_2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨_æ¸ çå_20260904.xlsx`ï¼ç线å 车页ï¼2026 æåº¦æ°å¼å C/E/G/I/K/M/O åå·²ç¼åï¼ï¼ - å·¥å ·ï¼mysql CLI åæ° + Python éæ ¼æ¯å¯¹ï¼`_m1_mid_regress.py`ï¼ç»æ `_m1_mid_regress.txt`ï¼ï¼å端 `mvn -q -DskipTests compile` éè¿ï¼exit=0ï¼ã ## ä¸ãåæ°å£å¾ï¼ç»æ¯çéæ ¼åæ¨ç¡®è®¤ï¼2026-07 ä¸ 1-7 æå ¨é¨å½ä¸ï¼ | æ¯çè¡ | å£å¾ | æ¥æº | |---|---|---| | 客è¿é / æ 客å¨è½¬éï¼ä¸äºº / ä¸äººå ¬éï¼ | **ä¼ä¸æ»è®¡ + 个ä½å¹¶å ¥** | `h2031_enterprise_monthly.passenger_total / turnover_total`ï¼äºº/äººå ¬éï¼Ã·10000ï¼å å `passenger_individual_monthly.passenger_count / turnover` ÷10000 | | å ¶ä¸ï¼ä¸ªä½å®¢è¿é / ä¸ªä½æ 客å¨è½¬é | ä¸ªä½æ° ÷10000 | ä» é»ç³/è¥é³/èé¨/åæ/é»å/éå· 6 å¸ææ° | | æ¹åçï¼å ¨çï¼è¡ | 17 å¸å·ä¹å | 䏿¯çâå ¨çè¡=Σåå¸è¡âå ¬å¼ä¸è´ | | 忝 | ä¸è®¡ç® | Q1ï¼ä»¥æ¯çç¼å 2025 åç §ç»ä¸ºåºåï¼ç±ååå±å¡«è¡¨æ¶è®¡ç® | ## åãç¨ä¾è¡¨ | # | ç¨ä¾ | è¾å ¥ | 颿 | å®é | ç»è®º | |---|---|---|---|---|---| | 1 | ä¼ä¸å®¢è¿é/å¨è½¬éï¼å«ä¸ªä½å¹¶å ¥ï¼ | åº 2026-01~07 | 䏿¯çç线å 车åå¸è¡â客è¿é/å¨è½¬éâåéæ ¼ä¸è´ | 350 æ ¼ diff=0 | éè¿ | | 2 | å ¶ä¸ä¸ªä½å®¢è¿é/å¨è½¬é | åº 2026-01~07 | 䏿¯çâå ¶ä¸ä¸ªä½âè¡éæ ¼ä¸è´ï¼6 å¸ï¼ | å«äºä¸è¿° 350 æ ¼ï¼diff=0 | éè¿ | | 3 | æ¹åçè¡ = Σ 17 å¸å· | åºæ±æ» | 䏿¯çå ¬å¼å£å¾ä¸è´ | ä¸è´ | éè¿ | | 4 | ä¸å£å¾åæâå ¬è·¯ç线âéç¹ | åº 2026-07 / 1-7 累计 | 彿 1631.2013ã累计 11204.5406ï¼æ¯çç¼åå¼ï¼ | 1612.2015+18.9998=1631.2013ï¼11062.7993+141.7413=11204.5406 | éè¿ | | 5 | åé åä¹¡å ¬äº¤/åºç§/ç½çº¦æ´¾ç页éç¹ | æ¯çæºé¡µ O å/累计å | ä¸ä¸å£å¾åæç¼åä¸è´ | å ¬äº¤å½æ 1466.66ãåºç§ 509ãç½çº¦ 421.46 å ¨ä¸ï¼ç´¯è®¡å ¬äº¤è§é®é¢ 2ï¼ | é¨åå½ä¸ | | 6 | Java ç¼è¯ | `mvn -q -DskipTests compile` | æ é误 | exit=0 | éè¿ | ## äºãåç°çé®é¢ä¸å¤ç½® 1. åçåå½è¯¯æâ客è¿éâè¡å½ä½çº¯ä¼ä¸æ°ï¼æ¯å¯¹åç°é»ç³ç 6 叿¯çå¼ = ä¼ä¸+个ä½ï¼å·®éæ°ä¸ºè¯¥å¸ä¸ªä½å¼ï¼ï¼ ç»éæ ¼åæ¨ç¡®è®¤**ç线å 车â客è¿é/å¨è½¬éâå£å¾å«ä¸ªä½**ï¼âå ¶ä¸ä¸ªä½âè¡ä¸ºå ¶åé â å·²æå«ä¸ªä½å£å¾å®ç°å¹¶å¤è· 0 å·®å¼ã 2. æ¯çå é¨ä¸ä¸è´ï¼éæ¬æ¬¡ä»£ç é®é¢ï¼è®°å ¥å¾ åï¼ï¼ä¸å£å¾åæé¡µâ累计åé åä¹¡å ¬äº¤=10194.09âï¼ ä¸æ¯çå ¬äº¤å°è´¦é¡µ 1-7 æåé å乡鿿±å 8676.57 ä¸ç¬¦ï¼å·® 1517.52ï¼ï¼ç为该页æ§è®¡ç®æ®å¼ï¼ 彿忴¾ç页éç¹ä¸æºé¡µä¸è´ãå¤ç½®ï¼M2 以æºé¡µï¼æ¬æå¡+å·²éªæ¶ç Pax/Wyc æå¡ï¼æ°å¼éç®æå页åå¤éªã 3. ä¸å£å¾æå页彿/累计æ°å¼æ æ³ç¨æ¯çæºé¡µå½åæ°å¼è§£éï¼é¨åå¸å·å·®éæå®ï¼ï¼å¤å®å为æ§è®¡ç®æ®å¼ï¼ é M2 æå页éç®ä¸å¹¶æ ¸å¯¹ï¼ä¸å¨ M1 åæ°å±å¤çã ## å ãç»è®ºä¸ä¸ä¸æ¥ - ç»è®ºï¼ç线å 车页å¯ä»åºå®æ´å¤ç®ï¼350 æ ¼ 0 å·®å¼ï¼ï¼å£å¾éå®ï¼`MidCalc` å·²å ¥åºå¹¶éè¿ç¼è¯ã - ä¸ä¸æ¥ï¼â M1 å©ä½æ´¾ç页å£å¾æ ¸å¯¹ï¼æå/åæ/éè·¯è¿è¾å¨è½¬éï¼å»ºè®®é M2 éç®å®ç°ï¼ï¼â¡ M2 SummaryFiller ååå°è´¦+æåé¡µå¹¶éæ ¼ diffï¼å«æ¬æ¥åé®é¢ 2/3 çä¿®å¤éªè¯ï¼ï¼â¢ 8 æå®å¼¹ã docs/¹¤×÷ÈÕ½á/¹¤×÷ÈÕ½á_2026-09-08.md
@@ -6,15 +6,22 @@ - æ§è¡é¡ºåºæ E1ï¼å åå½ 7 æãåå¡« 8 æï¼ - è´§è¿/å ¬è·¯æ 客/åå¸å®¢è¿ä¸ç±»ç¬ç«å°è¡¨åç«¯å ¨é¨éèï¼å é¨ä¸é´è¡¨ä¿çï¼ - ç¡®ç«çºªå¾ï¼ä»¥åæ§ææ¡£ä¸ºå¯ä¸å³çåºçº¿ï¼å·²ç¡®è®¤é¡¹ä¸åé夿é®ã 2. å¯å¨ M0ï¼æéæ©åï¼å®ç°åå¤ï¼åææ¯çå°è´¦é¡µâ2026-07 â 2026-08 æ©åâå½±åé¢ï¼å¾ è¡¥å ç»æï¼ã 2. M0 å½±åé¢å®æµä¸å®ç°çç¥ï¼æéæ©åï¼10 é¿è¡¨é¡µéææ©åãæå页䏿©ï¼ââè§ `docs/æ±æ»å¤§è¡¨æ°æ®é©±å¨æ¹é æ¹æ¡â¦` éå½ã 3. M1 è®¡ç®æå¡æ½åä¸ 7 æåå½ï¼éåæµè¯æ¥åè§ `docs/åè½æµè¯æ¥å/`ï¼å 0 å·®å¼ï¼ï¼ - M1-è´§è¿ï¼æ°å¢ `FreightCalc`ï¼è§ä¸/è§ä¸/å计 à 货è¿é/å¨è½¬é Ã å½æ/累计ï¼ï¼ - M1-åå¸å®¢è¿ï¼æ°å¢ `PaxCalc`ï¼å ¬äº¤/åºç§/轨é轮渡å°è´¦é¡µï¼ï¼ - M1-ç½çº¦è½¦ï¼æ°å¢ `WycSplitCalc`ï¼17 å¸å·æå + å ¨ç pinï¼ï¼ - M1-åå¸å®¢è¿æ´é¾åå½ï¼å叿±æ»é¡µå½æ r14-20ã累计 r3-9 0 å·®å¼ï¼ï¼ - M1-ç线å è½¦ï¼æ°å¢ `MidCalc`ï¼h2031 ä¼ä¸æ»è®¡ + 个ä½å¹¶å ¥å£å¾ï¼350 æ ¼ 0 å·®å¼ï¼ã ## æµè¯ç»ææè¦ - æ ä»£ç æ¹å¨ï¼ææ¡£ä¿®è®¢é¶æ®µï¼ã - äºä¸ª M1 ååèª 7 æåå½ 0 å·®å¼å¹¶éè¿ `mvn -q -DskipTests compile`ï¼exit=0ï¼ã - åå½ä¸åç°æ¯çæå页æ§è®¡ç®æ®å¼ï¼è®°å¾ åï¼ï¼ä¸å£å¾åæâ累计åé åä¹¡å ¬äº¤ 10194.09âä¸å ¬äº¤å°è´¦é¡µ 1-7 ææ±å 8676.57 ä¸ç¬¦ï¼ ä¸å£å¾æå页æ°å¼äº¦ä¸æ¯çæºé¡µå½åæ°å¼ä¸ä¸è´ââå¤å® M2 éç®æå页æ¶ä¸å¹¶ä¿®å¤æ ¸å¯¹ã ## éçé®é¢ä¸å¾ å - M0ï¼æéæ©åå®ç°ï¼å½æå¼å+忝åæå ¥ç´¯è®¡åã累计æ»å¨ã2025+ åç §ç»å³ç§»ï¼ââå½±åé¢åæä¸ï¼ - M1ï¼è®¡ç®æå¡æ½åä¸ 7 æå¯¹è´¦ï¼M2ï¼SummaryFiller åå½ 7 æï¼M3ï¼8 æå®å¼¹ï¼M4ï¼å°è¡¨å端éè+å å¤ä»½è¿åã ### 追å ï¼M0 å½±åé¢å®æµä¸å®ç°çç¥ï¼æé´ï¼ - 宿µç¡®è®¤ééææ©åç页=10 个é¿è¡¨é¡µï¼è´§è¿/ç线å 车/å ¬è·¯æ»å®¢è¿/åå¸å®¢è¿/å ¬äº¤/åºç§/ç½çº¦è½¦/轨é轮渡/ä¸å£å¾æç»/ä¸å£å¾å®¢è¿éï¼ï¼6 个æå页+计ç®é¡µä¸æ©åã - M0 宿¡ï¼å®ç°âæåº¦çå¼é建å¨âï¼åå¸å±åæ°åæç®æ æé建ï¼é POI å°±å°å¹³ç§»ï¼ï¼è¯¦è§æ¹æ¡éå½ã - M0ï¼æåº¦çå¼é建å¨ï¼æéæ©åï¼å®ç°ï¼ - M1ï¼æ´¾ç页ï¼ä¸å£å¾æç»/æå/åæ/éè·¯è¿è¾å¨è½¬é/å ¬è·¯æ»å®¢è¿ï¼å£å¾æ ¸å¯¹å»ºè®®å¹¶å ¥ M2 æå页éç®ä¸å¹¶éªè¯ï¼ - M2ï¼SummaryFiller ååå°è´¦é¡µ+æå页ï¼éæ ¼ diffï¼å«æ¬æ¥âæ§è®¡ç®æ®å¼âä¿®å¤éªè¯ï¼ï¼ - M3ï¼8 æå®å¼¹ï¼å æ©å 2026-08ï¼åå¯¼å ¥ 8 ææ°æ®çæï¼ï¼ - M4ï¼å°è¡¨å端éè + å¤ä»½è¿å/æ¸ çã traffic-audit-server/src/main/java/com/trafficaudit/reportexport/calc/MidCalc.java
New file @@ -0,0 +1,110 @@ package com.trafficaudit.reportexport.calc; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.trafficaudit.common.util.RegionUtil; import com.trafficaudit.dataimport.entity.PassengerEnterpriseMonthly; import com.trafficaudit.dataimport.entity.PassengerIndividualMonthly; import com.trafficaudit.dataimport.mapper.PassengerEnterpriseMonthlyMapper; import com.trafficaudit.dataimport.mapper.PassengerIndividualMonthlyMapper; 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ï¼ã * * å£å¾ï¼2026-07 ä¸ _å¤ä»½_2026å¹´7æéè·¯è¿è¾éæ±æ»è¡¨_æ¸ çå_20260904.xlsx ç线å 车页 * ä¼ä¸/个ä½è¡ 1-7 æéæ ¼åå½ 0 å·®å¼ï¼350 æ ¼å ¨ä¸ï¼ï¼ * 1. ç线å 车页â客è¿é/æ 客å¨è½¬éâè¡ = h2031_enterprise_monthly æ 17 å¸å·æ±æ» * ï¼passenger_total / turnover_totalï¼äºº / äººå ¬éï¼é¤ä»¥ 10000ï¼åå¹¶å ¥ä¸ªä½å®¢è¿ * ï¼passenger_individual_monthly åå£å¾ï¼ï¼âå ¶ä¸ä¸ªä½å®¢è¿é/å¨è½¬éâè¡ = ä¸ªä½æ°é¤ä»¥ 10000 * ï¼å½åä» é»ç³/è¥é³/èé¨/åæ/é»å/éå·ææ°ï¼ã * 2. å ¨çè¡ = 17 å¸å·ä¹åï¼ä¸æ¯çâå ¨çè¡=åå¸è¡æ±åâå ¬å¼ä¸è´ï¼ä¸å£å¾åæé¡µâå ¬è·¯ç线â * = æ¬å£å¾å ¨çå计ï¼å½æ 1631.2013ã累计 11204.5406 䏿¯ç 0 å·®å¼ï¼ã * 3. 忝以æ¯çç¼å 2025 åç §ç»ä¸ºåºåï¼Q1ï¼ï¼ä¸å¨æ¬æå¡è®¡ç®ã * * è¾åºï¼æ â å¸å·ï¼å« PROVINCE=æ¹åçï¼ â double[4] = * [客è¿é(å«ä¸ªä½), å¨è½¬é(å«ä¸ªä½), 个ä½å®¢è¿é, 个ä½å¨è½¬é]ï¼ * åä½å为æ¯çå±ç¤ºå£å¾ï¼ä¸äºº / ä¸äººå ¬éï¼ï¼ä¼ä¸åç¬é = arr[0]-arr[2] ä¸ arr[1]-arr[3]ã */ @Service public class MidCalc { public static final String PROVINCE = "æ¹åç"; @Resource private PassengerEnterpriseMonthlyMapper passengerMapper; @Resource private PassengerIndividualMonthlyMapper individualMapper; /** ç线å 车页æ°å¼ç©éµï¼æ â å¸å·/å ¨ç â [客è¿é,å¨è½¬é,个ä½å®¢è¿é,个ä½å¨è½¬é] */ public Map<Integer, Map<String, double[]>> banxianMonthly(String yearPrefix, int limit) { Map<Integer, Map<String, double[]>> result = new LinkedHashMap<>(); List<PassengerEnterpriseMonthly> entRows = passengerMapper.selectList( new LambdaQueryWrapper<PassengerEnterpriseMonthly>().likeRight( PassengerEnterpriseMonthly::getReportPeriod, yearPrefix)); for (PassengerEnterpriseMonthly r : entRows) { int m = monthOf(r.getReportPeriod()); if (m < 1 || m > limit) continue; String city = RegionUtil.cityByCode(r.getRegionCode()); if (city == null) continue; double pax = nz(r.getPassengerTotal()); double turn = nz(r.getTurnoverTotal()); if (pax == 0.0 && turn == 0.0) { pax = nz(r.getPassengerClass1()) + nz(r.getPassengerClass2()) + nz(r.getPassengerClass3()) + nz(r.getPassengerClass4()) + nz(r.getPassengerCharter()); turn = nz(r.getTurnoverClass1()) + nz(r.getTurnoverClass2()) + nz(r.getTurnoverClass3()) + nz(r.getTurnoverClass4()) + nz(r.getTurnoverCharter()); } accumulate(result, m, city, pax / 10000.0, turn / 10000.0, 0.0, 0.0); } List<PassengerIndividualMonthly> indRows = individualMapper.selectList( new LambdaQueryWrapper<PassengerIndividualMonthly>().likeRight( PassengerIndividualMonthly::getReportPeriod, yearPrefix)); for (PassengerIndividualMonthly r : indRows) { int m = monthOf(r.getReportPeriod()); if (m < 1 || m > limit) continue; String city = RegionUtil.cityByCode(r.getRegionCode()); if (city == null) continue; double pax = nz(r.getPassengerCount()) / 10000.0; double turn = nz(r.getTurnover()) / 10000.0; accumulate(result, m, city, pax, turn, pax, turn); } return result; } private void accumulate(Map<Integer, Map<String, double[]>> result, int m, String city, double paxAll, double turnAll, double paxIndi, double turnIndi) { Map<String, double[]> monthMap = result.computeIfAbsent(m, k -> new HashMap<>()); add(monthMap.computeIfAbsent(city, k -> new double[4]), paxAll, turnAll, paxIndi, turnIndi); add(monthMap.computeIfAbsent(PROVINCE, k -> new double[4]), paxAll, turnAll, paxIndi, turnIndi); } private void add(double[] arr, double paxAll, double turnAll, double paxIndi, double turnIndi) { arr[0] += paxAll; arr[1] += turnAll; arr[2] += paxIndi; arr[3] += turnIndi; } 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; } }