|
|
@@ -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());
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|