Просмотр исходного кода

fix(db): 导入全量全国省市区数据到 streets 表(31省/369市/2813区)

Xiaogang Liao 2 месяцев назад
Родитель
Сommit
147b42d5e5

+ 108 - 0
cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java

@@ -2939,6 +2939,7 @@ log.info("已添加template_id列到tasks表");
         seedHealthNorms();
         runLateMigrations();
         migration102();
+        seedFullRegionData();
     }
 
     private void migrateHealthDimensionsTable() {
@@ -8906,4 +8907,111 @@ private void runMigration100() {
 			log.warn("创建idx_source索引失败(可能已存在): " + e.getMessage());
 		}
 	}
+
+	/**
+	 * 导入全量全国省市区数据到 streets 表
+	 * 读取 classpath:region_data.json(31省/369市/2813区)
+	 * 仅在 streets 表省份级数据不足(<20 条)时执行
+	 */
+	private void seedFullRegionData() {
+		try {
+			Integer count = jdbcTemplate.queryForObject("SELECT COUNT(*) FROM streets WHERE level = 1", Integer.class);
+			if (count != null && count >= 20) {
+				log.info("全国省市区数据已存在({}个省份),跳过导入", count);
+				return;
+			}
+		} catch (Exception e) {
+			log.warn("检查省份数据失败,跳过全量导入: {}", e.getMessage());
+			return;
+		}
+
+		org.springframework.core.io.Resource resource = resourceLoader.getResource("classpath:region_data.json");
+		if (!resource.exists()) {
+			log.warn("region_data.json 不存在,跳过全量省市区数据导入");
+			return;
+		}
+
+		try {
+			String content = new String(StreamUtils.copyToByteArray(resource.getInputStream()), StandardCharsets.UTF_8);
+			com.alibaba.fastjson.JSONArray provinces = com.alibaba.fastjson.JSON.parseArray(content);
+
+			for (int pi = 0; pi < provinces.size(); pi++) {
+				com.alibaba.fastjson.JSONObject prov = provinces.getJSONObject(pi);
+				String provName = prov.getString("name");
+				String provCode = prov.getString("code");
+
+				java.sql.Connection conn = jdbcTemplate.getDataSource().getConnection();
+				java.sql.PreparedStatement ps = conn.prepareStatement(
+					"INSERT INTO streets (province, province_code, full_name, level, parent_id, sort_order) VALUES (?, ?, ?, 1, NULL, ?)",
+					java.sql.Statement.RETURN_GENERATED_KEYS
+				);
+				ps.setString(1, provName);
+				ps.setString(2, provCode);
+				ps.setString(3, provName);
+				ps.setInt(4, pi + 1);
+				ps.executeUpdate();
+				java.sql.ResultSet rs = ps.getGeneratedKeys();
+				long provId = 0;
+				if (rs.next()) provId = rs.getLong(1);
+				rs.close();
+				ps.close();
+
+				com.alibaba.fastjson.JSONArray cities = prov.getJSONArray("cities");
+				if (cities == null) continue;
+
+				for (int ci = 0; ci < cities.size(); ci++) {
+					com.alibaba.fastjson.JSONObject city = cities.getJSONObject(ci);
+					String cityName = city.getString("name");
+					String cityCode = city.getString("code");
+
+					java.sql.PreparedStatement ps2 = conn.prepareStatement(
+						"INSERT INTO streets (province, province_code, city, city_code, full_name, level, parent_id, sort_order) VALUES (?, ?, ?, ?, ?, 2, ?, ?)",
+						java.sql.Statement.RETURN_GENERATED_KEYS
+					);
+					ps2.setString(1, provName);
+					ps2.setString(2, provCode);
+					ps2.setString(3, cityName);
+					ps2.setString(4, cityCode);
+					ps2.setString(5, provName + cityName);
+					ps2.setLong(6, provId);
+					ps2.setInt(7, ci + 1);
+					ps2.executeUpdate();
+					java.sql.ResultSet rs2 = ps2.getGeneratedKeys();
+					long cityId = 0;
+					if (rs2.next()) cityId = rs2.getLong(1);
+					rs2.close();
+					ps2.close();
+
+					com.alibaba.fastjson.JSONArray districts = city.getJSONArray("districts");
+					if (districts == null) continue;
+
+					for (int di = 0; di < districts.size(); di++) {
+						com.alibaba.fastjson.JSONObject dist = districts.getJSONObject(di);
+						String distName = dist.getString("name");
+						String distCode = dist.getString("code");
+
+						java.sql.PreparedStatement ps3 = conn.prepareStatement(
+							"INSERT INTO streets (province, province_code, city, city_code, district, district_code, full_name, level, parent_id, sort_order) VALUES (?, ?, ?, ?, ?, ?, ?, 3, ?, ?)",
+							java.sql.Statement.RETURN_GENERATED_KEYS
+						);
+						ps3.setString(1, provName);
+						ps3.setString(2, provCode);
+						ps3.setString(3, cityName);
+						ps3.setString(4, cityCode);
+						ps3.setString(5, distName);
+						ps3.setString(6, distCode);
+						ps3.setString(7, provName + cityName + distName);
+						ps3.setLong(8, cityId);
+						ps3.setInt(9, di + 1);
+						ps3.executeUpdate();
+						ps3.close();
+					}
+				}
+				conn.close();
+			}
+			log.info("全国省市区数据导入完成:{}省/{}市/{}区", provinces.size(), 0, 0);
+		} catch (Exception e) {
+			log.warn("导入全国省市区数据失败: {}", e.getMessage());
+		}
+	}
 }

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
cfc-backend/src/main/resources/region_data.json


Некоторые файлы не были показаны из-за большого количества измененных файлов