forked from angelo/java-retail-app
## 行政区划新增(百度api)
This commit is contained in:
parent
bb0a714805
commit
b261ff7a61
|
@ -0,0 +1,17 @@
|
|||
package com.hzs.system.base;
|
||||
|
||||
import cn.hutool.json.JSONObject;
|
||||
import com.hzs.common.core.domain.R;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author hzs
|
||||
* @since 2025-10-10
|
||||
*/
|
||||
public interface IBdAreaNewServiceApi {
|
||||
|
||||
R<?> upAreaDate(JSONObject result);
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
package com.hzs.system.base.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.hzs.common.domain.system.base.BdAreaNew;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Mapper 接口
|
||||
* </p>
|
||||
*
|
||||
* @author hzs
|
||||
* @since 2025-10-10
|
||||
*/
|
||||
public interface BdAreaNewMapper extends BaseMapper<BdAreaNew> {
|
||||
|
||||
}
|
|
@ -0,0 +1,139 @@
|
|||
package com.hzs.system.base.provider;
|
||||
|
||||
import cn.hutool.json.JSONArray;
|
||||
import cn.hutool.json.JSONObject;
|
||||
import com.hzs.common.core.constant.CountryConstants;
|
||||
import com.hzs.common.core.constant.MagicNumberConstants;
|
||||
import com.hzs.common.core.domain.R;
|
||||
import com.hzs.common.domain.system.base.BdAreaNew;
|
||||
import com.hzs.system.base.IBdAreaNewServiceApi;
|
||||
import com.hzs.system.base.service.IBdAreaNewService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.dubbo.config.annotation.DubboService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.jdbc.core.JdbcTemplate;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author hzs
|
||||
* @since 2025-10-10
|
||||
*/
|
||||
|
||||
@Slf4j
|
||||
@DubboService
|
||||
public class BdAreaNewServiceProvider implements IBdAreaNewServiceApi {
|
||||
@Autowired
|
||||
private IBdAreaNewService iBdAreaNewService;
|
||||
|
||||
@Autowired
|
||||
private JdbcTemplate jdbcTemplate;
|
||||
|
||||
@Override
|
||||
public R<?> upAreaDate(JSONObject result) {
|
||||
|
||||
Set<String> allCodesFromApi = new HashSet<>();
|
||||
// 最外层,全国,直接过滤
|
||||
JSONArray country = result.getJSONArray("districts");
|
||||
// 省
|
||||
JSONObject provinces = country.getJSONObject(0);
|
||||
// 省列表
|
||||
JSONArray provincesArray = provinces.getJSONArray("districts");
|
||||
// 查询所有数据
|
||||
List<BdAreaNew> allDbAreas = iBdAreaNewService.list();
|
||||
Map<String, BdAreaNew> dbMap = allDbAreas.stream()
|
||||
.collect(Collectors.toMap(BdAreaNew::getCode, a -> a));
|
||||
|
||||
for (int i = 0; i < provincesArray.size(); i++) {
|
||||
// 迭代处理数据
|
||||
parseDistrict(provincesArray.getJSONObject(i), 0L, allCodesFromApi,dbMap);
|
||||
}
|
||||
|
||||
// 对数据库中未出现的地区进行逻辑删除标记
|
||||
for (BdAreaNew bdAreaNew : allDbAreas) {
|
||||
if (!allCodesFromApi.contains(bdAreaNew.getCode()) && bdAreaNew.getDelFlag() == 0) {
|
||||
bdAreaNew.setSyncStatus("DELETED");
|
||||
iBdAreaNewService.removeById(bdAreaNew);
|
||||
iBdAreaNewService.updateById(bdAreaNew);
|
||||
log.info("逻辑删除地区:{}", bdAreaNew.getName());
|
||||
}
|
||||
}
|
||||
return R.ok();
|
||||
}
|
||||
private void parseDistrict(JSONObject district, Long parentId, Set<String> allCodesFromApi,
|
||||
Map<String, BdAreaNew> dbMap) {
|
||||
if ("4".equals(district.getStr("level")) || "990000".equals(district.getStr("code"))) {
|
||||
// 第4级行政区划(街道)和990000这个地区不需要
|
||||
return;
|
||||
}
|
||||
// 操作用户
|
||||
Long userId = MagicNumberConstants.PK_ADMIN;
|
||||
// 所属国家
|
||||
Integer pkCountry = CountryConstants.CHINA_COUNTRY;
|
||||
// 当前时间
|
||||
Date nowDate = new Date();
|
||||
String name = district.getStr("name");
|
||||
String code = district.getStr("code");
|
||||
allCodesFromApi.add(code);
|
||||
|
||||
BdAreaNew existing = dbMap.get(code);
|
||||
|
||||
if (existing == null) {
|
||||
BdAreaNew area = new BdAreaNew();
|
||||
Integer newId = getNextSeqId();
|
||||
area.setPkId(newId);
|
||||
area.setName(name);
|
||||
area.setCode(code);
|
||||
area.setParent(parentId == null ? 0L : parentId);
|
||||
area.setEnableState(0);
|
||||
area.setDelFlag(0);
|
||||
area.setPkCountry(pkCountry);
|
||||
area.setPkCreator(userId);
|
||||
area.setCreationTime(nowDate);
|
||||
area.setBindNum(1);
|
||||
area.setSyncStatus("NEW");
|
||||
|
||||
iBdAreaNewService.save(area);
|
||||
dbMap.put(code, area);
|
||||
existing = area;
|
||||
log.info("新增地区:{} code={} pkId={}", name, code, newId);
|
||||
} else {
|
||||
boolean updated = false;
|
||||
if (!existing.getName().equals(name)) {
|
||||
existing.setName(name);
|
||||
updated = true;
|
||||
}
|
||||
if (!Objects.equals(existing.getParent(), parentId)) {
|
||||
existing.setParent(parentId == null ? 0L : parentId);
|
||||
updated = true;
|
||||
existing.setSyncStatus("MOVED");
|
||||
}
|
||||
if (updated) {
|
||||
existing.setModifiedTime(new Date());
|
||||
iBdAreaNewService.updateById(existing);
|
||||
log.info("更新地区:{} code={}", name, code);
|
||||
} else {
|
||||
existing.setSyncStatus("NORMAL");
|
||||
}
|
||||
}
|
||||
|
||||
Integer currentParentId = existing.getPkId();
|
||||
JSONArray subList = district.getJSONArray("districts");
|
||||
if (subList != null && !subList.isEmpty()) {
|
||||
for (int i = 0; i < subList.size(); i++) {
|
||||
parseDistrict(subList.getJSONObject(i), Long.valueOf(currentParentId), allCodesFromApi, dbMap);
|
||||
}
|
||||
}
|
||||
}
|
||||
private Integer getNextSeqId() {
|
||||
return jdbcTemplate.queryForObject("SELECT BD_AREA_NEW_SEQ.NEXTVAL FROM dual", Integer.class);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
package com.hzs.system.base.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.hzs.common.domain.system.base.BdAreaNew;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 服务类
|
||||
* </p>
|
||||
*
|
||||
* @author hzs
|
||||
* @since 2025-10-10
|
||||
*/
|
||||
public interface IBdAreaNewService extends IService<BdAreaNew> {
|
||||
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
package com.hzs.system.base.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.hzs.common.domain.system.base.BdAreaNew;
|
||||
import com.hzs.system.base.mapper.BdAreaNewMapper;
|
||||
import com.hzs.system.base.service.IBdAreaNewService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* 服务实现类
|
||||
* </p>
|
||||
*
|
||||
* @author hzs
|
||||
* @since 2025-10-10
|
||||
*/
|
||||
@Service
|
||||
public class BdAreaNewServiceImpl extends ServiceImpl<BdAreaNewMapper, BdAreaNew> implements IBdAreaNewService {
|
||||
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.hzs.system.base.mapper.BdAreaNewMapper">
|
||||
|
||||
</mapper>
|
|
@ -0,0 +1,56 @@
|
|||
package com.hzs.common.domain.system.base;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
import com.hzs.common.core.web.domain.BaseEntity;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
*
|
||||
* </p>
|
||||
*
|
||||
* @author hzs
|
||||
* @since 2025-10-10
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Accessors(chain = true)
|
||||
@TableName("BD_AREA_NEW")
|
||||
@KeySequence("BD_AREA_NEW_SEQ")
|
||||
public class BdAreaNew extends BaseEntity {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@TableField("PK_ID")
|
||||
@TableId(type = IdType.INPUT)
|
||||
private Integer pkId;
|
||||
|
||||
@TableField("NAME")
|
||||
private String name;
|
||||
|
||||
@TableField("CODE")
|
||||
private String code;
|
||||
|
||||
@TableField("PARENT")
|
||||
private Long parent;
|
||||
|
||||
@TableField("ENABLE_STATE")
|
||||
private Integer enableState;
|
||||
|
||||
@TableField("BIND_NUM")
|
||||
private Integer bindNum;
|
||||
|
||||
@TableField("LAST_SYNC_TIME")
|
||||
private Date lastSyncTime;
|
||||
|
||||
@TableField("SYNC_STATUS")
|
||||
private String syncStatus;
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,52 @@
|
|||
package com.hzs.third.job;
|
||||
|
||||
import cn.hutool.http.HttpUtil;
|
||||
import cn.hutool.json.JSONObject;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.hzs.common.core.domain.R;
|
||||
import com.hzs.common.core.web.domain.AjaxResult;
|
||||
import com.hzs.system.base.IBdAreaNewServiceApi;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.dubbo.config.annotation.DubboReference;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequestMapping("test-map")
|
||||
public class MapJob {
|
||||
|
||||
private static final String AK = "k5I8XpHFt78QaQ8GHclQ3wEN57XlvErC";
|
||||
|
||||
private static final String API_URL = "https://api.map.baidu.com/api_region_search/v1/";
|
||||
|
||||
@DubboReference(timeout = 60000)
|
||||
IBdAreaNewServiceApi iBdAreaNewServiceApi;
|
||||
|
||||
@RequestMapping("map-job")
|
||||
public AjaxResult map() {
|
||||
|
||||
Map<String, Object> params = new HashMap<>();
|
||||
params.put("ak", AK);
|
||||
params.put("keyword", "全国");
|
||||
params.put("extensions_code", "1");
|
||||
params.put("sub_admin", "3");
|
||||
|
||||
String resultStr = HttpUtil.get(API_URL, params);
|
||||
JSONObject result = JSONUtil.parseObj(resultStr);
|
||||
if (result.getInt("status") != 0) {
|
||||
log.error("百度地图API请求失败: {}", resultStr);
|
||||
return AjaxResult.error();
|
||||
}
|
||||
// 对行政区划进行处理
|
||||
R<?> R = iBdAreaNewServiceApi.upAreaDate(result);
|
||||
if (R.isSuccess()) {
|
||||
return AjaxResult.success();
|
||||
}
|
||||
return AjaxResult.error();
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.hzs.com.hzs.common.domain.mapper.BdAreaNewMapper">
|
||||
|
||||
<!-- 通用查询映射结果 -->
|
||||
<resultMap id="BaseResultMap" type="com.hzs.com.hzs.common.domain.entity.BdAreaNew">
|
||||
<id column="PK_ID" property="pkId" />
|
||||
<result column="CREATION_TIME" property="creationTime" />
|
||||
<result column="MODIFIED_TIME" property="modifiedTime" />
|
||||
<result column="DEL_FLAG" property="delFlag" />
|
||||
<result column="PK_COUNTRY" property="pkCountry" />
|
||||
<result column="PK_CREATOR" property="pkCreator" />
|
||||
<result column="PK_MODIFIED" property="pkModified" />
|
||||
<result column="NAME" property="name" />
|
||||
<result column="CODE" property="code" />
|
||||
<result column="PARENT" property="parent" />
|
||||
<result column="ENABLE_STATE" property="enableState" />
|
||||
<result column="BIND_NUM" property="bindNum" />
|
||||
<result column="LAST_SYNC_TIME" property="lastSyncTime" />
|
||||
<result column="SYNC_STATUS" property="syncStatus" />
|
||||
</resultMap>
|
||||
|
||||
<!-- 通用查询结果列 -->
|
||||
<sql id="Base_Column_List">
|
||||
CREATION_TIME,
|
||||
MODIFIED_TIME,
|
||||
DEL_FLAG,
|
||||
PK_COUNTRY,
|
||||
PK_CREATOR,
|
||||
PK_MODIFIED,
|
||||
PK_ID, NAME, CODE, PARENT, ENABLE_STATE, BIND_NUM, LAST_SYNC_TIME, SYNC_STATUS
|
||||
</sql>
|
||||
|
||||
</mapper>
|
Loading…
Reference in New Issue