From a08c70db67e49bf6cd125df04ebaf68c26f0d8dd Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期日, 20 九月 2026 16:19:16 +0800
Subject: [PATCH] feat(投资): 市州月报统一填报模板 + 县(市、区)列解析 + 表头行判定收紧
---
traffic-audit-server/src/main/java/com/trafficaudit/dataimport/service/DataImportService.java | 60 ++++++++++++++++++++++++++++++++++++++++--------------------
1 files changed, 40 insertions(+), 20 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 049d707..c694e75 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
@@ -2489,6 +2489,8 @@
project.setProjectName(nt);
project.setCategory(category);
project.setCity(currentCity);
+ String countyCell = cellStr(row, col.get("county"));
+ if (countyCell != null && !countyCell.trim().isEmpty()) project.setCounty(countyCell.trim());
project.setBuilderName(cellStr(row, col.get("builder")));
project.setConstructNature(cellStr(row, col.get("nature")));
project.setStartTime(investTime(cellStr(row, col.get("start"))));
@@ -2524,11 +2526,19 @@
Row row = sh.getRow(r);
if (row == null) continue;
boolean hasName = false;
+ int headerCells = 0;
for (int c = 0; c <= row.getLastCellNum(); c++) {
String v = cellStr(row, c);
- if (v != null && v.contains("椤圭洰鍚嶇О")) { hasName = true; break; }
+ if (v == null) continue;
+ String t = v.trim();
+ if (t.isEmpty() || t.length() > 20) continue; // 璇存槑鎬ч暱鍙ヤ笉绠楄〃澶村瓧娈�
+ String k = investHeaderKey(t);
+ if (k == null) continue;
+ headerCells++;
+ if ("name".equals(k)) hasName = true;
}
- if (!hasName) continue;
+ // 鐪熻〃澶磋鑷冲皯鏈� 2 涓煭琛ㄥご瀛楁锛涘彧鏈変竴鏍奸暱鍙ュ惈銆岄」鐩悕绉般�嶇殑璇存槑椤典細琚帓闄�
+ if (!hasName || headerCells < 2) continue;
Map<Integer, String> colTexts = new HashMap<>();
int scanEnd = investHeaderScanEnd(sh, r, row);
for (int rr = r; rr <= scanEnd; rr++) {
@@ -2542,23 +2552,8 @@
}
Map<String, Integer> col = new HashMap<>();
for (Map.Entry<Integer, String> e : colTexts.entrySet()) {
- int c = e.getKey();
- String v = e.getValue();
- if (v.contains("椤圭洰鍚嶇О")) col.putIfAbsent("name", c);
- else if (v.contains("鎶曡祫寤鸿") || v.contains("寤鸿鍗曚綅") || v.contains("椤圭洰涓氫富")) col.putIfAbsent("builder", c);
- else if (v.contains("寤鸿鎬ц川")) col.putIfAbsent("nature", c);
- else if (v.contains("寮�宸�")) col.putIfAbsent("start", c);
- else if (v.contains("绔e伐") || v.contains("寤烘垚")) col.putIfAbsent("end", c);
- else if ((v.contains("璁″垝鎬绘姇璧�") || v.contains("鎬绘姇璧�")) && !v.contains("绱")) col.putIfAbsent("total", c);
- else if (v.contains("鑷紑濮嬪缓璁�")) col.putIfAbsent("startcum", c);
- else if (v.contains("鏈勾璁″垝")) col.putIfAbsent("yearplan", c);
- else if (v.contains("鑷勾鍒濈疮璁�")) col.putIfAbsent("yearcum", c);
- else if (v.contains("鏈湀瀹屾垚")) col.putIfAbsent("monthdone", c);
- else if (v.contains("寤鸿闃舵")) col.putIfAbsent("stage", c);
- else if (v.contains("褰㈣薄杩涘害") || v.contains("寤鸿杩涘睍")) col.putIfAbsent("desc", c);
- else if (v.contains("宸ュ彲") && !v.contains("椤圭洰鍚嶇О")) col.putIfAbsent("gk", c);
- else if (v.contains("鍒濊") && !v.contains("椤圭洰鍚嶇О")) col.putIfAbsent("cs", c);
- else if (v.contains("寤虹瓚闈㈢Н") && !v.contains("鏂板")) col.putIfAbsent("area", c);
+ String k = investHeaderKey(e.getValue());
+ if (k != null) col.putIfAbsent(k, e.getKey());
}
if (!col.containsKey("name")) continue;
for (int c = 0; c <= row.getLastCellNum(); c++) {
@@ -2582,7 +2577,7 @@
if (dc <= row.getLastCellNum()) col.put("desc", dc);
}
for (String k : new String[]{"builder", "nature", "start", "end", "total", "startcum",
- "yearplan", "yearcum", "monthdone", "stage", "desc", "gk", "cs", "area"}) {
+ "yearplan", "yearcum", "monthdone", "stage", "desc", "gk", "cs", "area", "county"}) {
col.putIfAbsent(k, -1);
}
col.put("headerRow", r);
@@ -2591,6 +2586,31 @@
return null;
}
+ /** 鍗曚釜琛ㄥご鍗曞厓鏍� -> 瀛楁閿紙null 琛ㄧず涓嶆槸琛ㄥご瀛楁锛夛紱渚涜〃澶磋鍒ゅ畾涓庡垪鏄犲皠鍏辩敤 */
+ private String investHeaderKey(String v) {
+ if (v == null) return null;
+ String flat = v.replace(" ", "");
+ if (v.contains("椤圭洰鍚嶇О")) return "name";
+ // 銆屽幙锛堝競銆佸尯锛夈�嶇殑鍚勭鍐欐硶锛氬崐/鍏ㄨ鎷彿銆侀】鍙�/閫楀彿銆佹湁鏃犳嫭鍙凤紝缁熶竴褰掍竴鍖栧悗鍐嶅垽瀹�
+ String flatCounty = flat.replace("锛�", "(").replace("锛�", ")").replace("銆�", "").replace("锛�", "").replace(",", "");
+ if (flatCounty.contains("鍘�(甯傚尯)") || flatCounty.contains("鍘垮競鍖�") || flatCounty.contains("鍖哄幙")) return "county";
+ if (v.contains("鎶曡祫寤鸿") || v.contains("寤鸿鍗曚綅") || v.contains("椤圭洰涓氫富")) return "builder";
+ if (v.contains("寤鸿鎬ц川")) return "nature";
+ if (v.contains("寮�宸�")) return "start";
+ if (v.contains("绔e伐") || v.contains("寤烘垚")) return "end";
+ if ((v.contains("璁″垝鎬绘姇璧�") || v.contains("鎬绘姇璧�")) && !v.contains("绱")) return "total";
+ if (v.contains("鑷紑濮嬪缓璁�")) return "startcum";
+ if (v.contains("鏈勾璁″垝")) return "yearplan";
+ if (v.contains("鑷勾鍒濈疮璁�")) return "yearcum";
+ if (v.contains("鏈湀瀹屾垚")) return "monthdone";
+ if (v.contains("寤鸿闃舵")) return "stage";
+ if (v.contains("褰㈣薄杩涘害") || v.contains("寤鸿杩涘睍")) return "desc";
+ if (v.contains("宸ュ彲") && !v.contains("椤圭洰鍚嶇О")) return "gk";
+ if (v.contains("鍒濊") && !v.contains("椤圭洰鍚嶇О")) return "cs";
+ if (v.contains("寤虹瓚闈㈢Н") && !v.contains("鏂板")) return "area";
+ return null;
+ }
+
/** 琛ㄥご鏂囨湰鎵弿涓嬬晫锛氶粯璁よ〃澶磋 +3锛涜嫢銆岄」鐩悕绉般�嶅垪棣栦釜鏁版嵁琛屾洿闈犱笅锛屽垯鎵╁睍鍒版暟鎹鍓嶄竴琛岋紙涓婇檺 +12锛夈��
* 鑳屾櫙锛氬捀瀹�/鍗佸牥绛夊競宸炴妸銆屽缓璁鹃樁娈�/褰㈣薄杩涘害銆嶆爣绛惧啓鍦ㄨ〃澶翠笅绗� 4~8 琛岋紝鍥哄畾 +3 浼氭紡鍒楋紙褰㈣薄杩涘害璇讳笉鍒帮級銆� */
private int investHeaderScanEnd(Sheet sh, int headerRow, Row headerRowObj) {
--
Gitblit v1.9.1