| | |
| | | int yoyFilled = summaryWorkbookFiller.ensureMonthYoyFormulas(wb, year, effMonth); |
| | | int monthFormulaFilled = summaryWorkbookFiller.ensureMonthFormulas(wb, year, effMonth); |
| | | int rankRefreshed = refreshSummaryRankSheets(wb, effPeriod, "month"); |
| | | int cumulativeRefreshed = refreshSummaryCumulativeSheets(wb, year, effMonth); // åå¼ è·¨é¡µåæé¡µéæ¥è¡¨æå·æ° |
| | | int widthApplied = applySummaryReferenceLayout(wb); |
| | | log.info("æ±æ»å·¥ä½ç°¿æ°æ®é©±å¨å填宿ï¼åå
¥å½æå¼æ ¼æ°={}ï¼è¡¥å彿忝å
¬å¼æ ¼æ°={}ï¼è¡¥å彿å计å
¬å¼æ ¼æ°={}ï¼" |
| | | + "å·æ°æå页æ°å¼æ ¼æ°={}ï¼æãçæ_éè·¯è¿è¾éæ±æ»è¡¨ã对é½å宽忰={}ï¼ç¼ºæ°æç¤º={}", |
| | | dbFilled, yoyFilled, monthFormulaFilled, rankRefreshed, widthApplied, dbProblems); |
| | | + "å·æ°æå页æ°å¼æ ¼æ°={}ï¼å·æ°å页ï¼å叿±æ»/åå¸åå¸å·/ä¸å£å¾åæ/éè·¯è¿è¾å¨è½¬éï¼æ°å¼æ ¼æ°={}ï¼" |
| | | + "æãçæ_éè·¯è¿è¾éæ±æ»è¡¨ã对é½å宽忰={}ï¼ç¼ºæ°æç¤º={}", |
| | | dbFilled, yoyFilled, monthFormulaFilled, rankRefreshed, cumulativeRefreshed, widthApplied, dbProblems); |
| | | applyTwoDecimalFormat(wb); // æ°å¼æ¾ç¤ºä¸¤ä½å°æ°ï¼ä¿çå
¨ç²¾åº¦ï¼ï¼% / æ¥æçæ¢ææ ·å¼ä¸æ¹å |
| | | if (!wb.getCTWorkbook().isSetCalcPr()) wb.getCTWorkbook().addNewCalcPr(); |
| | | wb.getCTWorkbook().getCalcPr().setFullCalcOnLoad(true); // è¿å/æ¹åå
¬å¼åæå¼å³éç® |
| | |
| | | } |
| | | |
| | | /** å®ä½çå¼åç
§ä»¶ docs/çææ±æ»å¤§è¡¨/çæ_éè·¯è¿è¾éæ±æ»è¡¨.xlsxï¼ä¼å
çº§åæ¯çï¼é
ç½®ç®å½ â user.dir ç¸å¯¹ â ä¸çº§ï¼ */ |
| | | // ==================== æ±æ»å¤§è¡¨ï¼åå¼ â跨页åæâé¡µéæ¥è¡¨æå·æ° ==================== |
| | | // å叿±æ» / åå¸åå¸å· / ä¸å£å¾åæ / éè·¯è¿è¾å¨è½¬é æ¤åæ´é¡µæ²¿ç¨æ¯çéæå¼ï¼æ é¢åå¨ 1-7 æï¼ã |
| | | // æ¬æ®µæ 2026-09-13 å·²éªè¯å£å¾ï¼ä¸ 8 ææ¯çéæ ¼ 0 å·®å¼ï¼ä»æ¯çå°è´¦é¡µç°ç®ï¼ |
| | | // åå¸å®¢è¿é = åå¸å
å
¬äº¤ + åå¸å
巡游åºç§ + åå¸å
ç½çº¦è½¦ + 轨é + 轮渡 |
| | | // é路客è¿å¨è½¬é = å
¬è·¯ç线 + åé
å乡å
¬äº¤ + åé
å乡巡游åºç§ + åé
å乡ç½çº¦è½¦ |
| | | // é路货è¿å¨è½¬é = è´§è¿é¡µ å¸å· è§ä¸è´§ç©å¨è½¬é + è§ä¸è´§ç©å¨è½¬é |
| | | // 2026 å¹´ 1..N æåå°è´¦é¡µ 2026 åï¼C/E/Gâ¦ï¼ï¼å»å¹´åæåæ¯çç¼å 2025 åï¼V/X/Zâ¦ï¼ââåºé没æ 2025 å¹´åå¸å®¢è¿æ°æ®ã |
| | | |
| | | /** åå¸å®¢è¿å£å¾ææ ä½ï¼0..17 åå¸å®¢è¿ï¼18 è´§è¿å¨è½¬éï¼ */ |
| | | private static final int SM_BUS_PAX = 0, SM_BUS_TURN = 1; |
| | | private static final int SM_TAXI_PAX = 2, SM_TAXI_TURN = 3; |
| | | private static final int SM_WYC_PAX = 4, SM_WYC_TURN = 5; |
| | | private static final int SM_RAIL_PAX = 6, SM_RAIL_TURN = 7; |
| | | private static final int SM_FERRY_PAX = 8, SM_FERRY_TURN = 9; |
| | | private static final int SM_BX_PAX = 10, SM_BX_TURN = 11; |
| | | private static final int SM_BUS_CX_PAX = 12, SM_BUS_CX_TURN = 13; |
| | | private static final int SM_TAXI_CX_PAX = 14, SM_TAXI_CX_TURN = 15; |
| | | private static final int SM_WYC_CX_PAX = 16, SM_WYC_CX_TURN = 17; |
| | | private static final int SM_FREIGHT_TURN = 18; |
| | | private static final int SM_DIM = 19; |
| | | /** 2026 å¹´ 1 æå½æå¼åï¼0 åºï¼C åï¼ï¼2025 å¹´ 1 æå½æå¼åï¼0 åºï¼V åï¼ */ |
| | | private static final int SM_CUR_COL0 = 2; |
| | | private static final int SM_LAST_COL0 = 21; |
| | | |
| | | /** |
| | | * å·æ°åå¼ è·¨é¡µåæé¡µï¼å½å¹´ç´¯è®¡ï¼1..month æï¼ã彿ï¼month æï¼å对åºåæ¯ï¼ |
| | | * 2026 ä¸ 2025 åæé½åèªæ¯çå°è´¦é¡µç¼åï¼è¿ååå
¥åå
æ ¼æ°ã |
| | | */ |
| | | private int refreshSummaryCumulativeSheets(XSSFWorkbook wb, int year, int month) { |
| | | if (wb == null || month <= 0) return 0; |
| | | int[] cumMonths = new int[month]; |
| | | for (int m = 1; m <= month; m++) cumMonths[m - 1] = m; |
| | | int[] oneMonth = new int[]{month}; |
| | | Map<String, double[]> curCum = smReadLedgerMetrics(wb, true, cumMonths); |
| | | Map<String, double[]> lastCum = smReadLedgerMetrics(wb, false, cumMonths); |
| | | Map<String, double[]> curMon = smReadLedgerMetrics(wb, true, oneMonth); |
| | | Map<String, double[]> lastMon = smReadLedgerMetrics(wb, false, oneMonth); |
| | | if (curCum.isEmpty()) { |
| | | log.warn("æ±æ»å¤§è¡¨å页巿°ï¼å°è´¦é¡µæªè¯»å°å¸å·æ°æ®ï¼è·³è¿ï¼ä¿ææ¯çåå¼ï¼"); |
| | | return 0; |
| | | } |
| | | double[] pCurCum = smProvinceSum(curCum); |
| | | double[] pLastCum = smProvinceSum(lastCum); |
| | | double[] pCurMon = smProvinceSum(curMon); |
| | | double[] pLastMon = smProvinceSum(lastMon); |
| | | int n = 0; |
| | | n += smWriteCitySummary(wb, year, month, pCurCum, pLastCum, pCurMon, pLastMon); |
| | | n += smWriteCityByRegion(wb, month, curCum, lastCum, curMon, lastMon); |
| | | n += smWriteMidAnalysis(wb, month, pCurCum, pLastCum, pCurMon, pLastMon); |
| | | n += smWriteTurnoverSheets(wb, year, month, curCum, lastCum, curMon, lastMon); |
| | | return n; |
| | | } |
| | | |
| | | /** 17 å¸å·å计ï¼ä¸å«å°è´¦é¡µâå
¨çâå
¬å¼è¡ï¼ */ |
| | | private double[] smProvinceSum(Map<String, double[]> m) { |
| | | double[] p = new double[SM_DIM]; |
| | | for (String c : RegionUtil.cityList()) { |
| | | double[] a = m.get(c); |
| | | if (a == null) continue; |
| | | for (int i = 0; i < SM_DIM; i++) p[i] += a[i]; |
| | | } |
| | | return p; |
| | | } |
| | | |
| | | /** å°è´¦é¡µç´¯è®¡åæ°ï¼å¸å·è§èå -> 19 ç»´ææ */ |
| | | private Map<String, double[]> smReadLedgerMetrics(XSSFWorkbook wb, boolean curYear, int[] months) { |
| | | Map<String, double[]> out = new LinkedHashMap<>(); |
| | | smReadCityPaxPage(wb, "å
¬äº¤", curYear, months, out, SM_BUS_PAX, SM_BUS_TURN, SM_BUS_CX_PAX, SM_BUS_CX_TURN); |
| | | smReadCityPaxPage(wb, "åºç§", curYear, months, out, SM_TAXI_PAX, SM_TAXI_TURN, SM_TAXI_CX_PAX, SM_TAXI_CX_TURN); |
| | | smReadCityPaxPage(wb, "ç½çº¦è½¦", curYear, months, out, SM_WYC_PAX, SM_WYC_TURN, SM_WYC_CX_PAX, SM_WYC_CX_TURN); |
| | | smReadRailFerry(wb, curYear, months, out); |
| | | smReadBanxian(wb, curYear, months, out); |
| | | smReadFreightTurnover(wb, curYear, months, out); |
| | | return out; |
| | | } |
| | | |
| | | /** å
¬äº¤/åºç§/ç½çº¦è½¦é¡µï¼æ¯å¸å· 4 è¡ï¼å®¢è¿é/æ
客å¨è½¬é/å
¶ä¸åå¸å
客è¿é/å
¶ä¸åå¸å
æ
客å¨è½¬éï¼ */ |
| | | private void smReadCityPaxPage(XSSFWorkbook wb, String sheetName, boolean curYear, int[] months, |
| | | Map<String, double[]> out, int paxIdx, int turnIdx, int cxPaxIdx, int cxTurnIdx) { |
| | | Sheet sh = wb.getSheet(sheetName); |
| | | if (sh == null) return; |
| | | int last = sh.getLastRowNum(); |
| | | for (int r = sh.getFirstRowNum(); r <= last; r++) { |
| | | Row row = sh.getRow(r); |
| | | if (row == null) continue; |
| | | String city = smCityOf(row.getCell(0)); |
| | | if (city == null) continue; |
| | | int paxRow = -1, turnRow = -1, cxPaxRow = -1, cxTurnRow = -1; |
| | | for (int k = r; k <= Math.min(last, r + 4); k++) { |
| | | Row kr = sh.getRow(k); |
| | | if (kr == null) continue; |
| | | String b = smText(kr.getCell(1)); |
| | | if (b == null || b.contains("个ä½")) continue; |
| | | boolean inner = b.contains("åå¸å
"); |
| | | boolean turn = b.contains("å¨è½¬é"); |
| | | if (inner) { |
| | | if (turn) { if (cxTurnRow < 0) cxTurnRow = k; } |
| | | else if (cxPaxRow < 0) cxPaxRow = k; |
| | | } else { |
| | | if (turn) { if (turnRow < 0) turnRow = k; } |
| | | else if (paxRow < 0) paxRow = k; |
| | | } |
| | | } |
| | | double totalPax = smSumMonths(sh, paxRow, curYear, months); |
| | | double totalTurn = smSumMonths(sh, turnRow, curYear, months); |
| | | double cityPax = smSumMonths(sh, cxPaxRow, curYear, months); |
| | | double cityTurn = smSumMonths(sh, cxTurnRow, curYear, months); |
| | | double[] arr = out.computeIfAbsent(city, k -> new double[SM_DIM]); |
| | | arr[paxIdx] += cityPax; // åå¸å®¢è¿å£å¾åâåå¸å
â |
| | | arr[turnIdx] += cityTurn; |
| | | arr[cxPaxIdx] += totalPax - cityPax; // åé
å乡 = æ»é - åå¸å
|
| | | arr[cxTurnIdx] += totalTurn - cityTurn; |
| | | } |
| | | } |
| | | |
| | | /** 轨éã轮渡页ï¼è½¨éåï¼æ¦æ±/é»ç³ï¼+ 轮渡åï¼æ¦æ±ï¼ */ |
| | | private void smReadRailFerry(XSSFWorkbook wb, boolean curYear, int[] months, Map<String, double[]> out) { |
| | | Sheet sh = wb.getSheet("轨éã轮渡"); |
| | | if (sh == null) return; |
| | | int last = sh.getLastRowNum(); |
| | | int ferryTitle = -1; |
| | | for (int r = sh.getFirstRowNum(); r <= last; r++) { |
| | | Row row = sh.getRow(r); |
| | | if (row == null) continue; |
| | | String a = smText(row.getCell(0)); |
| | | if (a != null && a.contains("轮渡客è¿é")) { ferryTitle = r; break; } |
| | | } |
| | | smReadRailFerryBlock(sh, curYear, months, out, sh.getFirstRowNum(), |
| | | ferryTitle < 0 ? last : ferryTitle - 1, SM_RAIL_PAX); |
| | | if (ferryTitle >= 0) smReadRailFerryBlock(sh, curYear, months, out, ferryTitle, last, SM_FERRY_PAX); |
| | | } |
| | | |
| | | private void smReadRailFerryBlock(Sheet sh, boolean curYear, int[] months, Map<String, double[]> out, |
| | | int start, int end, int baseIdx) { |
| | | for (int r = start; r <= end; r++) { |
| | | Row row = sh.getRow(r); |
| | | if (row == null) continue; |
| | | String city = smCityOf(row.getCell(0)); |
| | | if (city == null) continue; |
| | | int paxRow = -1, turnRow = -1; |
| | | for (int k = r; k <= Math.min(end, r + 3); k++) { |
| | | Row kr = sh.getRow(k); |
| | | if (kr == null) continue; |
| | | String b = smText(kr.getCell(1)); |
| | | if (b == null) continue; |
| | | if (b.contains("å¨è½¬é")) { if (turnRow < 0) turnRow = k; } |
| | | else if (paxRow < 0) paxRow = k; |
| | | } |
| | | double[] arr = out.computeIfAbsent(city, k -> new double[SM_DIM]); |
| | | arr[baseIdx] += smSumMonths(sh, paxRow, curYear, months); |
| | | arr[baseIdx + 1] += smSumMonths(sh, turnRow, curYear, months); |
| | | } |
| | | } |
| | | |
| | | /** ç线å
è½¦é¡µï¼æ¯å¸å· 客è¿é / æ
客å¨è½¬éï¼âå
¶ä¸ä¸ªä½âè¡ä¸éå¤è®¡å
¥ï¼ */ |
| | | private void smReadBanxian(XSSFWorkbook wb, boolean curYear, int[] months, Map<String, double[]> out) { |
| | | Sheet sh = wb.getSheet("ç线å
车"); |
| | | if (sh == null) return; |
| | | int last = sh.getLastRowNum(); |
| | | for (int r = sh.getFirstRowNum(); r <= last; r++) { |
| | | Row row = sh.getRow(r); |
| | | if (row == null) continue; |
| | | String city = smCityOf(row.getCell(0)); |
| | | if (city == null) continue; |
| | | int paxRow = -1, turnRow = -1; |
| | | for (int k = r; k <= Math.min(last, r + 4); k++) { |
| | | Row kr = sh.getRow(k); |
| | | if (kr == null) continue; |
| | | String b = smText(kr.getCell(1)); |
| | | if (b == null || b.contains("个ä½")) continue; |
| | | if (b.contains("å¨è½¬é")) { if (turnRow < 0) turnRow = k; } |
| | | else if (b.contains("客è¿é") && paxRow < 0) paxRow = k; |
| | | } |
| | | double[] arr = out.computeIfAbsent(city, k -> new double[SM_DIM]); |
| | | arr[SM_BX_PAX] += smSumMonths(sh, paxRow, curYear, months); |
| | | arr[SM_BX_TURN] += smSumMonths(sh, turnRow, curYear, months); |
| | | } |
| | | } |
| | | |
| | | /** è´§è¿é¡µï¼æ¯å¸å· è§ä¸è´§ç©å¨è½¬é + è§ä¸è´§ç©å¨è½¬éï¼âè§ä¸+è§ä¸âè¡æ¬èº«æ¯æ±åå
¬å¼ï¼ä¸ç´æ¥åï¼ */ |
| | | private void smReadFreightTurnover(XSSFWorkbook wb, boolean curYear, int[] months, Map<String, double[]> out) { |
| | | Sheet sh = wb.getSheet(" è´§è¿"); |
| | | if (sh == null) sh = wb.getSheet("è´§è¿"); |
| | | if (sh == null) return; |
| | | int last = sh.getLastRowNum(); |
| | | for (int r = sh.getFirstRowNum(); r <= last; r++) { |
| | | Row row = sh.getRow(r); |
| | | if (row == null) continue; |
| | | String city = smCityOf(row.getCell(0)); |
| | | if (city == null) continue; |
| | | int above = -1, below = -1; |
| | | for (int k = r; k <= Math.min(last, r + 6); k++) { |
| | | Row kr = sh.getRow(k); |
| | | if (kr == null) continue; |
| | | String b = smText(kr.getCell(1)); |
| | | if (b == null || b.contains("å
¶ä¸")) continue; |
| | | if (b.contains("è§ä¸è´§ç©å¨è½¬é")) { if (above < 0) above = k; } |
| | | else if (b.contains("è§ä¸è´§ç©å¨è½¬é")) { if (below < 0) below = k; } |
| | | } |
| | | double[] arr = out.computeIfAbsent(city, k -> new double[SM_DIM]); |
| | | arr[SM_FREIGHT_TURN] += smSumMonths(sh, above, curYear, months) + smSumMonths(sh, below, curYear, months); |
| | | } |
| | | } |
| | | |
| | | private double smSumMonths(Sheet sh, int rowIdx, boolean curYear, int[] months) { |
| | | if (sh == null || rowIdx < 0) return 0; |
| | | Row row = sh.getRow(rowIdx); |
| | | if (row == null) return 0; |
| | | double s = 0; |
| | | for (int m : months) { |
| | | int col = (curYear ? SM_CUR_COL0 : SM_LAST_COL0) + 2 * (m - 1); |
| | | s += smNum(row.getCell(col)); |
| | | } |
| | | return s; |
| | | } |
| | | |
| | | /** å°è´¦é¡µåå
æ ¼åæ°ï¼æ°å / æ°åææ¬ / å
¬å¼ç¼åï¼ */ |
| | | private double smNum(Cell c) { |
| | | if (c == null) return 0; |
| | | try { |
| | | CellType t = c.getCellType(); |
| | | if (t == CellType.NUMERIC) return c.getNumericCellValue(); |
| | | if (t == CellType.FORMULA) { |
| | | return c.getCachedFormulaResultType() == CellType.NUMERIC ? c.getNumericCellValue() : 0; |
| | | } |
| | | if (t == CellType.STRING) { |
| | | String s = c.getStringCellValue(); |
| | | if (s == null) return 0; |
| | | s = s.replace(",", "").replace("%", "").trim(); |
| | | if (s.isEmpty()) return 0; |
| | | return Double.parseDouble(s); |
| | | } |
| | | } catch (Exception ignore) { |
| | | return 0; |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | private String smText(Cell c) { |
| | | if (c == null) return null; |
| | | try { |
| | | return c.getCellType() == CellType.STRING ? c.getStringCellValue() : null; |
| | | } catch (Exception e) { |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | /** å A ææ¡ -> è§èå¸å·åï¼âå
¨ç/æ¹åçâä¸éå¸å·è¡è¿å nullï¼ */ |
| | | private String smCityOf(Cell a) { |
| | | String t = smText(a); |
| | | if (t == null || t.trim().isEmpty()) return null; |
| | | String norm = RegionUtil.normalizeCityName(t.trim()); |
| | | if (norm == null) return null; |
| | | return RegionUtil.cityList().contains(norm) ? norm : null; |
| | | } |
| | | |
| | | private double smYoy(double cur, double last) { |
| | | return last == 0.0 ? 0.0 : (cur - last) / last; |
| | | } |
| | | |
| | | /** åå¼ï¼å
¬å¼æ ¼ä¸å¨ï¼ä¿çæ¯çå
¬å¼ï¼æå¼å³éç®ï¼ï¼0 ä¸åä¸ºç©ºæ ¼å䏿°å¢ */ |
| | | private int smSetVal(Sheet sh, int r0, int c0, double v) { |
| | | Row row = sh.getRow(r0); |
| | | if (row == null) return 0; |
| | | Cell c = row.getCell(c0); |
| | | if (c != null && c.getCellType() == CellType.FORMULA) return 0; |
| | | if (c == null) { |
| | | if (v == 0.0) return 0; |
| | | c = row.createCell(c0); |
| | | Cell left = row.getCell(c0 - 1); |
| | | if (left != null) c.setCellStyle(left.getCellStyle()); |
| | | } else if (v == 0.0 && c.getCellType() == CellType.BLANK) { |
| | | return 0; |
| | | } |
| | | c.setBlank(); |
| | | c.setCellValue(v); |
| | | return 1; |
| | | } |
| | | |
| | | private void smSetTitle(Sheet sh, int r0, int c0, String text) { |
| | | if (sh == null) return; |
| | | Row row = sh.getRow(r0); |
| | | if (row == null) return; |
| | | Cell c = row.getCell(c0); |
| | | if (c == null || c.getCellType() == CellType.FORMULA) return; |
| | | c.setBlank(); |
| | | c.setCellValue(text); |
| | | } |
| | | |
| | | /** å叿±æ»é¡µï¼å1ï¼1..N æç´¯è®¡ï¼è¡ 3-9ï¼å2ï¼å½æï¼è¡ 14-20ï¼å B/C/D/E = 客è¿é/忝/å¨è½¬é/忝 */ |
| | | private int smWriteCitySummary(XSSFWorkbook wb, int year, int month, |
| | | double[] pCurCum, double[] pLastCum, double[] pCurMon, double[] pLastMon) { |
| | | Sheet sh = wb.getSheet("å叿±æ»"); |
| | | if (sh == null) return 0; |
| | | smSetTitle(sh, 0, 0, year + "å¹´1-" + month + "æå
¨çç´¯è®¡å®æåå¸å®¢è¿éæ
åµ"); |
| | | smSetTitle(sh, 11, 0, year + "å¹´" + month + "æå
¨ç宿åå¸å®¢è¿éæ
åµ"); |
| | | int n = 0; |
| | | int[] rows = {2, 3, 4, 5, 6, 7, 8}; |
| | | for (int i = 0; i < rows.length; i++) { |
| | | double[] v = smCitySummaryRow(pCurCum, pLastCum, i); |
| | | n += smSetVal(sh, rows[i], 1, v[0]); |
| | | n += smSetVal(sh, rows[i], 2, v[2]); |
| | | n += smSetVal(sh, rows[i], 3, v[1]); |
| | | n += smSetVal(sh, rows[i], 4, v[3]); |
| | | } |
| | | for (int i = 0; i < rows.length; i++) { |
| | | double[] v = smCitySummaryRow(pCurMon, pLastMon, i); |
| | | n += smSetVal(sh, rows[i] + 11, 1, v[0]); |
| | | n += smSetVal(sh, rows[i] + 11, 2, v[2]); |
| | | n += smSetVal(sh, rows[i] + 11, 3, v[1]); |
| | | n += smSetVal(sh, rows[i] + 11, 4, v[3]); |
| | | } |
| | | return n; |
| | | } |
| | | |
| | | /** i=0 æ»å®¢è¿é 1 å
¬äº¤ 2 åºç§è½¦ 3 巡游åºç§ 4 ç½çº¦è½¦ 5 轨é 6 轮渡ï¼è¿å [客è¿é, å¨è½¬é, 客è¿é忝, å¨è½¬é忝] */ |
| | | private double[] smCitySummaryRow(double[] p, double[] pl, int i) { |
| | | double pax, turn, lPax, lTurn; |
| | | if (i == 0) { |
| | | pax = p[SM_BUS_PAX] + p[SM_TAXI_PAX] + p[SM_WYC_PAX] + p[SM_RAIL_PAX] + p[SM_FERRY_PAX]; |
| | | turn = p[SM_BUS_TURN] + p[SM_TAXI_TURN] + p[SM_WYC_TURN] + p[SM_RAIL_TURN] + p[SM_FERRY_TURN]; |
| | | lPax = pl[SM_BUS_PAX] + pl[SM_TAXI_PAX] + pl[SM_WYC_PAX] + pl[SM_RAIL_PAX] + pl[SM_FERRY_PAX]; |
| | | lTurn = pl[SM_BUS_TURN] + pl[SM_TAXI_TURN] + pl[SM_WYC_TURN] + pl[SM_RAIL_TURN] + pl[SM_FERRY_TURN]; |
| | | } else if (i == 1) { |
| | | pax = p[SM_BUS_PAX]; turn = p[SM_BUS_TURN]; lPax = pl[SM_BUS_PAX]; lTurn = pl[SM_BUS_TURN]; |
| | | } else if (i == 2) { |
| | | pax = p[SM_TAXI_PAX] + p[SM_WYC_PAX]; turn = p[SM_TAXI_TURN] + p[SM_WYC_TURN]; |
| | | lPax = pl[SM_TAXI_PAX] + pl[SM_WYC_PAX]; lTurn = pl[SM_TAXI_TURN] + pl[SM_WYC_TURN]; |
| | | } else if (i == 3) { |
| | | pax = p[SM_TAXI_PAX]; turn = p[SM_TAXI_TURN]; lPax = pl[SM_TAXI_PAX]; lTurn = pl[SM_TAXI_TURN]; |
| | | } else if (i == 4) { |
| | | pax = p[SM_WYC_PAX]; turn = p[SM_WYC_TURN]; lPax = pl[SM_WYC_PAX]; lTurn = pl[SM_WYC_TURN]; |
| | | } else if (i == 5) { |
| | | pax = p[SM_RAIL_PAX]; turn = p[SM_RAIL_TURN]; lPax = pl[SM_RAIL_PAX]; lTurn = pl[SM_RAIL_TURN]; |
| | | } else { |
| | | pax = p[SM_FERRY_PAX]; turn = p[SM_FERRY_TURN]; lPax = pl[SM_FERRY_PAX]; lTurn = pl[SM_FERRY_TURN]; |
| | | } |
| | | return new double[]{pax, turn, smYoy(pax, lPax), smYoy(turn, lTurn)}; |
| | | } |
| | | |
| | | /** åå¸åå¸å·é¡µï¼4 åï¼ç´¯è®¡å®¢è¿é/累计å¨è½¬é/彿客è¿é/彿å¨è½¬éï¼ï¼æ¯å å
¨ç 1 è¡ + 17 å¸å· */ |
| | | private int smWriteCityByRegion(XSSFWorkbook wb, int month, |
| | | Map<String, double[]> curCum, Map<String, double[]> lastCum, |
| | | Map<String, double[]> curMon, Map<String, double[]> lastMon) { |
| | | Sheet sh = wb.getSheet("åå¸åå¸å·"); |
| | | if (sh == null) return 0; |
| | | smSetTitle(sh, 0, 0, "åå¸å®¢è¿å®¢è¿éåå¸å·1-" + month + "æç´¯è®¡æ
åµ"); |
| | | smSetTitle(sh, 22, 0, "åå¸å®¢è¿å®¢è¿å¨è½¬éåå¸å·1-" + month + "æç´¯è®¡æ
åµ"); |
| | | smSetTitle(sh, 45, 0, "åå¸å®¢è¿å®¢è¿éåå¸å·" + month + "ææ
åµ"); |
| | | smSetTitle(sh, 67, 0, "åå¸å®¢è¿å®¢è¿å¨è½¬éåå¸å·" + month + "ææ
åµ"); |
| | | int n = 0; |
| | | n += smWriteCityByRegionBlock(sh, 4, true, curCum, lastCum); |
| | | n += smWriteCityByRegionBlock(sh, 26, false, curCum, lastCum); |
| | | n += smWriteCityByRegionBlock(sh, 49, true, curMon, lastMon); |
| | | n += smWriteCityByRegionBlock(sh, 71, false, curMon, lastMon); |
| | | return n; |
| | | } |
| | | |
| | | private int smWriteCityByRegionBlock(Sheet sh, int provRow, boolean pax, |
| | | Map<String, double[]> cur, Map<String, double[]> last) { |
| | | int n = 0; |
| | | double[] provCur = smProvinceSum(cur); |
| | | double[] provLast = smProvinceSum(last); |
| | | List<String> cities = RegionUtil.cityList(); |
| | | for (int i = -1; i < cities.size(); i++) { |
| | | int r = provRow + i + 1; |
| | | double[] c = i < 0 ? provCur : cur.get(cities.get(i)); |
| | | double[] l = i < 0 ? provLast : last.get(cities.get(i)); |
| | | if (c == null) c = new double[SM_DIM]; |
| | | if (l == null) l = new double[SM_DIM]; |
| | | double[] g = smCityGroupValues(c, l, pax); |
| | | n += smSetVal(sh, r, 1, g[0]); |
| | | n += smSetVal(sh, r, 4, g[6]); |
| | | n += smSetVal(sh, r, 6, g[1]); |
| | | n += smSetVal(sh, r, 9, g[7]); |
| | | n += smSetVal(sh, r, 11, g[2]); |
| | | n += smSetVal(sh, r, 14, g[8]); |
| | | n += smSetVal(sh, r, 16, g[3]); |
| | | n += smSetVal(sh, r, 19, g[9]); |
| | | n += smSetVal(sh, r, 21, g[4]); |
| | | n += smSetVal(sh, r, 22, g[10]); |
| | | n += smSetVal(sh, r, 23, g[5]); |
| | | n += smSetVal(sh, r, 24, g[11]); |
| | | } |
| | | return n; |
| | | } |
| | | |
| | | /** 6 ç»å¼ + 6 ç»å¢éï¼[æ»é, å
¬äº¤, åºç§, ç½çº¦è½¦, 轨é, 轮渡, æ»éå¢é, å
¬äº¤â¦, 轮渡] */ |
| | | private double[] smCityGroupValues(double[] c, double[] l, boolean pax) { |
| | | int busI = pax ? SM_BUS_PAX : SM_BUS_TURN; |
| | | int taxiI = pax ? SM_TAXI_PAX : SM_TAXI_TURN; |
| | | int wycI = pax ? SM_WYC_PAX : SM_WYC_TURN; |
| | | int railI = pax ? SM_RAIL_PAX : SM_RAIL_TURN; |
| | | int ferryI = pax ? SM_FERRY_PAX : SM_FERRY_TURN; |
| | | double bus = c[busI], taxi = c[taxiI], wyc = c[wycI], rail = c[railI], ferry = c[ferryI]; |
| | | double lBus = l[busI], lTaxi = l[taxiI], lWyc = l[wycI], lRail = l[railI], lFerry = l[ferryI]; |
| | | double total = bus + taxi + wyc + rail + ferry; |
| | | double lTotal = lBus + lTaxi + lWyc + lRail + lFerry; |
| | | return new double[]{total, bus, taxi, wyc, rail, ferry, |
| | | smYoy(total, lTotal), smYoy(bus, lBus), smYoy(taxi, lTaxi), smYoy(wyc, lWyc), |
| | | smYoy(rail, lRail), smYoy(ferry, lFerry)}; |
| | | } |
| | | |
| | | /** ä¸å£å¾åæé¡µï¼å1ï¼ç´¯è®¡ï¼è¡ 3-7ï¼å2ï¼å½æï¼è¡ 12-16ï¼å B/C/F/G = 客è¿é/忝/å¨è½¬é/忝 */ |
| | | private int smWriteMidAnalysis(XSSFWorkbook wb, int month, |
| | | double[] pCurCum, double[] pLastCum, double[] pCurMon, double[] pLastMon) { |
| | | Sheet sh = wb.getSheet("ä¸å£å¾åæ"); |
| | | if (sh == null) return 0; |
| | | smSetTitle(sh, 0, 0, "1-" + month + "æä¸å£å¾å®¢è¿éåå¨è½¬é"); |
| | | smSetTitle(sh, 9, 0, month + "æä¸å£å¾å®¢è¿éåå¨è½¬é"); |
| | | int n = 0; |
| | | int[] rows = {2, 3, 4, 5, 6}; |
| | | for (int i = 0; i < rows.length; i++) { |
| | | double[] v = smMidRow(pCurCum, pLastCum, i); |
| | | n += smSetVal(sh, rows[i], 1, v[0]); |
| | | n += smSetVal(sh, rows[i], 2, v[2]); |
| | | n += smSetVal(sh, rows[i], 5, v[1]); |
| | | n += smSetVal(sh, rows[i], 6, v[3]); |
| | | } |
| | | for (int i = 0; i < rows.length; i++) { |
| | | double[] v = smMidRow(pCurMon, pLastMon, i); |
| | | n += smSetVal(sh, rows[i] + 9, 1, v[0]); |
| | | n += smSetVal(sh, rows[i] + 9, 2, v[2]); |
| | | n += smSetVal(sh, rows[i] + 9, 5, v[1]); |
| | | n += smSetVal(sh, rows[i] + 9, 6, v[3]); |
| | | } |
| | | return n; |
| | | } |
| | | |
| | | /** i=0 æ» 1 å
¬è·¯ç线 2 åé
å乡å
¬äº¤ 3 åé
å乡巡游åºç§ 4 åé
å乡ç½çº¦è½¦ï¼è¿å [客è¿é, å¨è½¬é, 客è¿é忝, å¨è½¬é忝] */ |
| | | private double[] smMidRow(double[] p, double[] pl, int i) { |
| | | int[] paxIdx = {SM_BX_PAX, SM_BX_PAX, SM_BUS_CX_PAX, SM_TAXI_CX_PAX, SM_WYC_CX_PAX}; |
| | | int[] turnIdx = {SM_BX_TURN, SM_BX_TURN, SM_BUS_CX_TURN, SM_TAXI_CX_TURN, SM_WYC_CX_TURN}; |
| | | double pax, turn, lPax, lTurn; |
| | | if (i == 0) { |
| | | pax = p[SM_BX_PAX] + p[SM_BUS_CX_PAX] + p[SM_TAXI_CX_PAX] + p[SM_WYC_CX_PAX]; |
| | | turn = p[SM_BX_TURN] + p[SM_BUS_CX_TURN] + p[SM_TAXI_CX_TURN] + p[SM_WYC_CX_TURN]; |
| | | lPax = pl[SM_BX_PAX] + pl[SM_BUS_CX_PAX] + pl[SM_TAXI_CX_PAX] + pl[SM_WYC_CX_PAX]; |
| | | lTurn = pl[SM_BX_TURN] + pl[SM_BUS_CX_TURN] + pl[SM_TAXI_CX_TURN] + pl[SM_WYC_CX_TURN]; |
| | | } else { |
| | | pax = p[paxIdx[i]]; turn = p[turnIdx[i]]; |
| | | lPax = pl[paxIdx[i]]; lTurn = pl[turnIdx[i]]; |
| | | } |
| | | return new double[]{pax, turn, smYoy(pax, lPax), smYoy(turn, lTurn)}; |
| | | } |
| | | |
| | | /** éè·¯è¿è¾å¨è½¬é页ï¼å1ï¼ç´¯è®¡ï¼è¡ 4-21ï¼å2ï¼å½æï¼è¡ 26-43ï¼åªåå¼åï¼B/E/V çå
¬å¼ä¿çï¼ */ |
| | | private int smWriteTurnoverSheets(XSSFWorkbook wb, int year, int month, |
| | | Map<String, double[]> curCum, Map<String, double[]> lastCum, |
| | | Map<String, double[]> curMon, Map<String, double[]> lastMon) { |
| | | Sheet sh = wb.getSheet("éè·¯è¿è¾å¨è½¬é"); |
| | | if (sh == null) return 0; |
| | | smSetTitle(sh, 0, 0, year + "å¹´1-" + month + "æå
¨çç´¯è®¡å®æäº¤éå¨è½¬éæ
åµ"); |
| | | smSetTitle(sh, 22, 0, year + "å¹´" + month + "æå
¨çå®æäº¤éå¨è½¬éæ
åµ"); |
| | | int n = 0; |
| | | n += smWriteTurnoverBlock(sh, 3, curCum, lastCum); |
| | | n += smWriteTurnoverBlock(sh, 25, curMon, lastMon); |
| | | return n; |
| | | } |
| | | |
| | | private int smWriteTurnoverBlock(Sheet sh, int provRow, Map<String, double[]> cur, Map<String, double[]> last) { |
| | | int n = 0; |
| | | double[] provCur = smProvinceSum(cur); |
| | | double[] provLast = smProvinceSum(last); |
| | | List<String> cities = RegionUtil.cityList(); |
| | | for (int i = -1; i < cities.size(); i++) { |
| | | int r = provRow + i + 1; |
| | | double[] c = i < 0 ? provCur : cur.get(cities.get(i)); |
| | | double[] l = i < 0 ? provLast : last.get(cities.get(i)); |
| | | if (c == null) c = new double[SM_DIM]; |
| | | if (l == null) l = new double[SM_DIM]; |
| | | double freight = c[SM_FREIGHT_TURN], lFreight = l[SM_FREIGHT_TURN]; |
| | | double pax = c[SM_BUS_PAX] + c[SM_TAXI_PAX] + c[SM_WYC_PAX] + c[SM_RAIL_PAX] + c[SM_FERRY_PAX]; |
| | | double lPax = l[SM_BUS_PAX] + l[SM_TAXI_PAX] + l[SM_WYC_PAX] + l[SM_RAIL_PAX] + l[SM_FERRY_PAX]; |
| | | double road = c[SM_BX_TURN] + c[SM_BUS_CX_TURN] + c[SM_TAXI_CX_TURN] + c[SM_WYC_CX_TURN]; |
| | | double lRoad = l[SM_BX_TURN] + l[SM_BUS_CX_TURN] + l[SM_TAXI_CX_TURN] + l[SM_WYC_CX_TURN]; |
| | | n += smSetVal(sh, r, 6, freight); |
| | | n += smSetVal(sh, r, 9, smYoy(freight, lFreight)); |
| | | n += smSetVal(sh, r, 11, pax); |
| | | n += smSetVal(sh, r, 14, smYoy(pax, lPax)); |
| | | n += smSetVal(sh, r, 16, road); |
| | | n += smSetVal(sh, r, 19, smYoy(road, lRoad)); |
| | | n += smSetVal(sh, r, 22, lFreight); |
| | | n += smSetVal(sh, r, 23, lPax); |
| | | n += smSetVal(sh, r, 24, lRoad); |
| | | } |
| | | return n; |
| | | } |
| | | |
| | | |
| | | private File resolveSummaryLayoutRef() { |
| | | String rel = summaryTemplateDir; |
| | | while (rel != null && rel.startsWith("./")) rel = rel.substring(2); |