From bc1f1fe60d4ce20de619275806483a5d0b07f939 Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期五, 04 九月 2026 20:33:53 +0800
Subject: [PATCH] \ feat: 汇总大表生成支持toMonth裁剪(1-6月生成+1-7月扩列)及验证产物与测试报告\
---
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java | 174 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 171 insertions(+), 3 deletions(-)
diff --git a/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java b/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java
index 50b64f8..894487e 100644
--- a/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java
+++ b/traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java
@@ -18,6 +18,8 @@
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;
@@ -36,6 +38,8 @@
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;
@@ -162,6 +166,10 @@
private CityTaxiMonthlyMapper cityTaxiMapper;
@Resource
private CityTaxiAuthMapper cityTaxiAuthMapper;
+ @Resource
+ private WycTotalMonthlyMapper wycTotalMapper;
+ @Resource
+ private WycOrderMonthlyMapper wycOrderMapper;
@Resource
private SqlSessionFactory sqlSessionFactory;
@@ -916,10 +924,11 @@
List<ScaleSplitTransport> list = new ArrayList<>();
int failRows = 0;
try (Workbook wb = WorkbookFactory.create(file.getInputStream())) {
+ int targetMonth = Integer.parseInt(period.split("-")[1]); // 浠呭鍏ョ洰鏍囨湡鎵�鍦ㄦ湀鐨勯〉绛撅紙1-N鏈堟枃浠舵寜鐩爣鏈熷彇褰撴湀/绱锛�
boolean hasPeriodSheet = false;
for (int i = 0; i < wb.getNumberOfSheets(); i++) {
String sn = wb.getSheetAt(i).getSheetName();
- if (sn != null && (sn.contains("褰撴湀") || sn.contains("绱"))) { hasPeriodSheet = true; break; }
+ if (sn != null && (sn.contains("褰撴湀") || sn.contains("鏈堜唤") || sn.contains("绱"))) { hasPeriodSheet = true; break; }
}
if (!hasPeriodSheet) {
throw new RuntimeException("鎵�閫夋暟鎹被鍨嬨�愯涓婅涓嬫媶鍒嗐�戜笌鏂囦欢鍐呭涓嶇锛氭湭鎵惧埌鍚� 褰撴湀/绱 鐨� sheet锛岃纭鏄惁閫夐敊浜嗘暟鎹被鍨�");
@@ -928,8 +937,16 @@
Sheet sheet = wb.getSheetAt(i);
String sheetName = sheet.getSheetName();
String periodType = null;
- if (sheetName.contains("褰撴湀")) periodType = "MONTH";
- else if (sheetName.contains("绱")) periodType = "CUMULATIVE";
+ java.util.regex.Matcher mSheetMonth = java.util.regex.Pattern.compile("(\\d{1,2})\\u6708(\\u4efd|\\u7d2f\\u8ba1)").matcher(sheetName);
+ if (mSheetMonth.find()) {
+ int sheetMonth = Integer.parseInt(mSheetMonth.group(1));
+ if (sheetMonth == targetMonth) {
+ periodType = "浠�".equals(mSheetMonth.group(2)) ? "MONTH" : "CUMULATIVE";
+ }
+ } else {
+ if (sheetName.contains("褰撴湀")) periodType = "MONTH";
+ else if (sheetName.contains("绱")) periodType = "CUMULATIVE";
+ }
if (periodType == null) continue;
// 鏍¢獙 sheet 甯冨眬锛氱2琛屽簲鍚�屽競宸�/瑙勪笂浼佷笟杩愯緭閲忋�嶏紝绗�3琛屽瓙琛ㄥご搴斿惈銆屽懆杞噺銆嶆垨銆岃揣杩愰噺銆嶏紙鎵╁睍甯冨眬锛�
@@ -2704,6 +2721,155 @@
return success;
}
+
+ // ========== 缃戠害杞︽湀搴﹁緭鍏ュ鍏ワ紙鍏ㄧ渷 pin / 璁㈠崟锛� ==========
+
+ /** 缃戠害杞︽�绘暟鏈堝害杈撳叆锛氭ā鏉縚缃戠害杞︽�绘暟.xlsx锛坰heet1锛汚 鍒�=鏈堜唤鏃ユ湡锛汢=鍏ㄧ渷瀹㈣繍閲� 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锛圓=鏈堜唤锛汢-E=鍏ㄧ渷 pin锛汧=璁㈠崟鍚堣锛汫-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锛孊-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;
+ }
+
/** 杩愭斂鍑虹杞﹀競宸炴彁鍙栵細閬撹矾杩愯緭璇佸瓧鍙封啋妗f鍙封啋缁忚惀鏉冨彿鈫掍笟鎴峰湴鍧�锛屽彇 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})");
@@ -3040,6 +3206,8 @@
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);
}
}
--
Gitblit v1.9.1