From f83092193c8cb1782a918caaa56866f8f97a91f8 Mon Sep 17 00:00:00 2001 From: 陶杰 <1378534974@qq.com> Date: 星期日, 29 十二月 2024 14:58:19 +0800 Subject: [PATCH] 1.行政区划对接-高德 2.行政区划对接-腾讯 --- src/main/java/com/mzl/flower/mapper/district/DistrictMapperCustom.java | 18 src/main/java/com/mzl/flower/dto/response/system/AreaDTO.java | 13 src/main/java/com/mzl/flower/dto/response/district/DistrictVO.java | 48 + src/main/java/com/mzl/flower/mapper/district/DistrictTengxunMapper.java | 17 src/main/java/com/mzl/flower/mapper/district/DistrictMapper.java | 16 src/main/resources/mapper/district/DistrictMapperCustom.xml | 10 src/main/java/com/mzl/flower/service/impl/map/MapTengxunServiceImpl.java | 154 ++++ src/main/java/com/mzl/flower/service/impl/district/DistrictServiceImpl.java | 303 ++++++++ src/main/java/com/mzl/flower/dto/map/gaode/CityCodeTypeAdapter.java | 43 + src/main/java/com/mzl/flower/service/map/MapTengxunService.java | 11 src/main/resources/mapper/district/DistrictMapper.xml | 22 src/main/java/com/mzl/flower/dto/map/gaode/GaodeDistrict.java | 99 ++ src/main/java/com/mzl/flower/config/TengxunMapProperties.java | 17 src/main/java/com/mzl/flower/config/GaodeMapProperties.java | 17 src/main/java/com/mzl/flower/service/impl/district/DistrictTengxunServiceImpl.java | 367 ++++++++++ src/main/java/com/mzl/flower/entity/district/DistrictTengxunDO.java | 46 + src/main/resources/mapper/district/DistrictTengxunMapperCustom.xml | 10 src/main/java/com/mzl/flower/web/v2/district/DistrictTengxunController.java | 76 ++ src/main/java/com/mzl/flower/dto/map/tengxun/TengxunLocation.java | 25 src/main/java/com/mzl/flower/dto/request/district/QueryDistrictTengxunDTO.java | 8 src/main/java/com/mzl/flower/dto/request/district/CreateDistrictGaodeDTO.java | 59 + src/main/resources/mapper/district/DistrictTengxunMapper.xml | 20 src/main/java/com/mzl/flower/schedule/MapScheduleService.java | 43 + src/main/java/com/mzl/flower/service/district/DistrictTengxunService.java | 71 + src/main/java/com/mzl/flower/service/impl/map/MapGaodeServiceImpl.java | 107 ++ src/main/java/com/mzl/flower/dto/request/district/CreateDistrictTengxunDTO.java | 50 + src/main/java/com/mzl/flower/dto/response/district/DistrictTengxunVO.java | 13 src/main/java/com/mzl/flower/dto/map/gaode/GaodeMapResponse.java | 33 src/main/java/com/mzl/flower/service/map/MapGaodeService.java | 11 src/main/java/com/mzl/flower/web/system/ProvinceController.java | 24 src/main/java/com/mzl/flower/web/v2/district/DistrictGaodeController.java | 79 ++ src/main/java/com/mzl/flower/mapper/district/DistrictTengxunMapperCustom.java | 19 src/main/java/com/mzl/flower/dto/map/tengxun/TencentMapResponse.java | 40 + src/main/java/com/mzl/flower/service/district/DistrictService.java | 80 ++ src/main/java/com/mzl/flower/entity/district/DistrictDO.java | 58 + src/main/resources/application.yml | 13 src/main/java/com/mzl/flower/dto/map/tengxun/TengxunDistrict.java | 77 ++ 37 files changed, 2,113 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/mzl/flower/config/GaodeMapProperties.java b/src/main/java/com/mzl/flower/config/GaodeMapProperties.java new file mode 100644 index 0000000..1120473 --- /dev/null +++ b/src/main/java/com/mzl/flower/config/GaodeMapProperties.java @@ -0,0 +1,17 @@ +package com.mzl.flower.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "map.gaode") +public class GaodeMapProperties { + + /** + * 高德地图地址行政区划查询接口 + */ + private String administrativeDivisionsUrl; + +} diff --git a/src/main/java/com/mzl/flower/config/TengxunMapProperties.java b/src/main/java/com/mzl/flower/config/TengxunMapProperties.java new file mode 100644 index 0000000..9800a52 --- /dev/null +++ b/src/main/java/com/mzl/flower/config/TengxunMapProperties.java @@ -0,0 +1,17 @@ +package com.mzl.flower.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "map.tengxun") +public class TengxunMapProperties { + + /** + * 腾讯地图地址行政区划查询接口 + */ + private String administrativeDivisionsUrl; + +} diff --git a/src/main/java/com/mzl/flower/dto/map/gaode/CityCodeTypeAdapter.java b/src/main/java/com/mzl/flower/dto/map/gaode/CityCodeTypeAdapter.java new file mode 100644 index 0000000..3bc877a --- /dev/null +++ b/src/main/java/com/mzl/flower/dto/map/gaode/CityCodeTypeAdapter.java @@ -0,0 +1,43 @@ +package com.mzl.flower.dto.map.gaode; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonToken; +import com.google.gson.stream.JsonWriter; + +import java.io.IOException; + +public class CityCodeTypeAdapter extends TypeAdapter<String> { + @Override + public void write(JsonWriter out, String value) throws IOException { + if (value == null) { + out.nullValue(); + } else { + out.value(value); + } + } + + @Override + public String read(JsonReader in) throws IOException { + if (in.peek() == JsonToken.BEGIN_ARRAY) { + // 处理数组类型 + StringBuilder result = new StringBuilder(); + in.beginArray(); + while (in.hasNext()) { + if (result.length() > 0) { + result.append(","); + } + result.append(in.nextString()); + } + in.endArray(); + return result.toString(); + } else if (in.peek() == JsonToken.STRING) { + // 处理字符串类型 + return in.nextString(); + } else if (in.peek() == JsonToken.NULL) { + in.nextNull(); + return ""; + } else { + throw new IllegalStateException("Unexpected JSON type: " + in.peek()); + } + } +} diff --git a/src/main/java/com/mzl/flower/dto/map/gaode/GaodeDistrict.java b/src/main/java/com/mzl/flower/dto/map/gaode/GaodeDistrict.java new file mode 100644 index 0000000..4e7759a --- /dev/null +++ b/src/main/java/com/mzl/flower/dto/map/gaode/GaodeDistrict.java @@ -0,0 +1,99 @@ +package com.mzl.flower.dto.map.gaode; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.google.gson.annotations.JsonAdapter; +import com.mzl.flower.dto.map.tengxun.TengxunLocation; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +// 行政区划对象 + +/** + * 代码共6位,前两位代表省(一级)、中间两位为市/地区(二级),最后两位为区县(三级) + * 1)省级:前两位有值,后4位置0,如,河北省:130000 + * 2)市/地区:前4四位有值,包含省代码与市代码,最后两位置0,如河北省保定市:130600 + * 3)区县:6位全有值,包含前4位省市代码及区县代码,河北省保定市涿州市:130681 + * 4)直辖市、香港、澳门: + * 同省级,在行政区划接口(ws/district/v1/list)中,其下直接为区级(没有二级结构填充) + * 例:北京,东城区 (而非:“北京,北京,东城区”) + * 5)直辖县:第3、4位为90的,为省直辖县 + * 6)中国范围内,省市区行政区划以外的区域值为999999(如中国东海) + * 7)东莞市、中山市、儋州市、嘉峪关市 因其下无区县级,因此增加了末位为99代码的同名子级,用于补齐到三级区划的结构 + * + * 如何获取城市编码(city_code): + * 1)编码前4位不为0,第5、6位为0的,为常规城市,可直接取用 + * 2)北京、上海、重庆、天津、香港、澳门,编码和省一致,需要单独提出 + * 3)第3、4位为90的为省直辖县,一般当做城市来应用,也需要单独提出 + */ + +@Data +@NoArgsConstructor +@AllArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) +public class GaodeDistrict { + + private String id; + /** + * 城市编码 + */ + @JsonAdapter(CityCodeTypeAdapter.class) + private String citycode; + /** + * 区域编码 + * 街道没有独有的 adcode,均继承父类(区县)的 adcode + */ + private String adcode; + /** + * 行政区名称 + */ + private String name; + + /** + * 行政区边界坐标点 + * 当一个行政区范围,由完全分隔两块或者多块的地块组 + * + * 成,每块地的 polyline 坐标串以 | 分隔 。 + * + * 如北京 的 朝阳区 + * + */ + private String polyline; + + + /** + * + * 区域中心点 + * 乡镇级别返回的center是边界线上的形点,其他行政级别返回的center不一定是中心点,若政府机构位于面内,则返回政府坐标,政府不在面内,则返回繁华点坐标 + */ + private String center; + + /** + * 行政区划级别 + * + * country:国家 + * + * province:省份(直辖市会在province显示) + * + * city:市(直辖市会在province显示) + * + * district:区县 + * + * street:街道 + * + */ + private String level; + + /** + * 下级行政区列表,包含 district 元素 + */ + private List<GaodeDistrict> districts; + + /** + * 行政区划父级别唯一标识(adcode) + */ + private String parentId; +} \ No newline at end of file diff --git a/src/main/java/com/mzl/flower/dto/map/gaode/GaodeMapResponse.java b/src/main/java/com/mzl/flower/dto/map/gaode/GaodeMapResponse.java new file mode 100644 index 0000000..8ced6d9 --- /dev/null +++ b/src/main/java/com/mzl/flower/dto/map/gaode/GaodeMapResponse.java @@ -0,0 +1,33 @@ +package com.mzl.flower.dto.map.gaode; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.Data; + +import java.util.List; + +// 顶层对象 +@JsonIgnoreProperties(ignoreUnknown = true) +@Data +public class GaodeMapResponse { + /** + * 返回结果状态值 + * 值为0或1,0表示失败;1表示成功 + */ + private String status; + /** + * 返回状态说明 + */ + private String info; + /** + * 状态码 + * 返回状态说明,10000代表正确,详情参阅 info 状态表 + */ + private String infocode; + private int count; + /** + * 行政区列表 + */ + private List<GaodeDistrict> districts; +} + + diff --git a/src/main/java/com/mzl/flower/dto/map/tengxun/TencentMapResponse.java b/src/main/java/com/mzl/flower/dto/map/tengxun/TencentMapResponse.java new file mode 100644 index 0000000..d8c0cbe --- /dev/null +++ b/src/main/java/com/mzl/flower/dto/map/tengxun/TencentMapResponse.java @@ -0,0 +1,40 @@ +package com.mzl.flower.dto.map.tengxun; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; + +import java.util.List; + +// 顶层对象 +@JsonIgnoreProperties(ignoreUnknown = true) +@Data +public class TencentMapResponse { + private int status; + private String message; + private String requestId; + private int dataVersion; + private List<TengxunDistrict> result; + + @SerializedName("request_id") + public String getRequestId() { + return requestId; + } + + @SerializedName("request_id") + public void setRequestId(String requestId) { + this.requestId = requestId; + } + + @SerializedName("data_version") + public int getDataVersion() { + return dataVersion; + } + + @SerializedName("data_version") + public void setDataVersion(int dataVersion) { + this.dataVersion = dataVersion; + } +} + + diff --git a/src/main/java/com/mzl/flower/dto/map/tengxun/TengxunDistrict.java b/src/main/java/com/mzl/flower/dto/map/tengxun/TengxunDistrict.java new file mode 100644 index 0000000..f4c54a6 --- /dev/null +++ b/src/main/java/com/mzl/flower/dto/map/tengxun/TengxunDistrict.java @@ -0,0 +1,77 @@ +package com.mzl.flower.dto.map.tengxun; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import java.util.List; + +// 行政区划对象 + +/** + * 代码共6位,前两位代表省(一级)、中间两位为市/地区(二级),最后两位为区县(三级) + * 1)省级:前两位有值,后4位置0,如,河北省:130000 + * 2)市/地区:前4四位有值,包含省代码与市代码,最后两位置0,如河北省保定市:130600 + * 3)区县:6位全有值,包含前4位省市代码及区县代码,河北省保定市涿州市:130681 + * 4)直辖市、香港、澳门: + * 同省级,在行政区划接口(ws/district/v1/list)中,其下直接为区级(没有二级结构填充) + * 例:北京,东城区 (而非:“北京,北京,东城区”) + * 5)直辖县:第3、4位为90的,为省直辖县 + * 6)中国范围内,省市区行政区划以外的区域值为999999(如中国东海) + * 7)东莞市、中山市、儋州市、嘉峪关市 因其下无区县级,因此增加了末位为99代码的同名子级,用于补齐到三级区划的结构 + * + * 如何获取城市编码(city_code): + * 1)编码前4位不为0,第5、6位为0的,为常规城市,可直接取用 + * 2)北京、上海、重庆、天津、香港、澳门,编码和省一致,需要单独提出 + * 3)第3、4位为90的为省直辖县,一般当做城市来应用,也需要单独提出 + */ + +@Data +@NoArgsConstructor +@AllArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) +public class TengxunDistrict { + + /** + * 行政区划唯一标识(adcode) + */ + private String id; + /** + * 行政区划唯一标识(adcode) + */ + private String code; + /** + * 简称,如“内蒙古” + */ + private String name; + /** + * 全称,如“内蒙古自治区” + */ + private String fullname; + + /** + * 行政区划级别 + */ + private Integer level; + + /** + * 行政区划拼音,每一下标为一个字的全拼,如: + * [“nei”,“meng”,“gu”] + */ + private List<String> pinyin; + /** + * 经纬度 + */ + private TengxunLocation tengxunLocation; + /** + * 当前区划的下级区划信息,结构与当前区划一致,如果没有下级区划则不返回此字段 + * 行政区划代码(adcode)规则说明 + */ + private List<TengxunDistrict> districts; + + + /** + * 行政区划父级别唯一标识(adcode) + */ + private String parentId; +} \ No newline at end of file diff --git a/src/main/java/com/mzl/flower/dto/map/tengxun/TengxunLocation.java b/src/main/java/com/mzl/flower/dto/map/tengxun/TengxunLocation.java new file mode 100644 index 0000000..f9d48aa --- /dev/null +++ b/src/main/java/com/mzl/flower/dto/map/tengxun/TengxunLocation.java @@ -0,0 +1,25 @@ +package com.mzl.flower.dto.map.tengxun; + + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +// 经纬度对象 +@NoArgsConstructor +@AllArgsConstructor +@Data +@JsonIgnoreProperties(ignoreUnknown = true) +public class TengxunLocation { + + /** + * 纬度 + */ + private double lat; + /** + * 经度 + */ + private double lng; + +} diff --git a/src/main/java/com/mzl/flower/dto/request/district/CreateDistrictGaodeDTO.java b/src/main/java/com/mzl/flower/dto/request/district/CreateDistrictGaodeDTO.java new file mode 100644 index 0000000..7a9c53e --- /dev/null +++ b/src/main/java/com/mzl/flower/dto/request/district/CreateDistrictGaodeDTO.java @@ -0,0 +1,59 @@ +package com.mzl.flower.dto.request.district; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; + +@Data +@ApiModel("高德地图的行政区划 ") +public class CreateDistrictGaodeDTO { + + private String id; + + /** + * 名称 + */ + @ApiModelProperty(value = "name") + @NotEmpty(message = "名称不能为空") + private String name; + + /** + * 区域编码 + */ + @ApiModelProperty(value = "citycode") + private String citycode; + + /** + * 区域编码 + */ + @NotEmpty(message = "区域编码不能为空") + @ApiModelProperty(value = "adcode") + private String adcode; + + + /** + * 行政区域边界坐标点 + */ + @ApiModelProperty(value = "adcode") + private String polyline; + + /** + * 区域中心点 + */ + @ApiModelProperty(value = "adcode") + private String center; + + + @ApiModelProperty(value = "等级") + private Integer level; + + /** + * 父id + */ + @ApiModelProperty(value = "父id") + private String parentId; + + +} diff --git a/src/main/java/com/mzl/flower/dto/request/district/CreateDistrictTengxunDTO.java b/src/main/java/com/mzl/flower/dto/request/district/CreateDistrictTengxunDTO.java new file mode 100644 index 0000000..f0f918e --- /dev/null +++ b/src/main/java/com/mzl/flower/dto/request/district/CreateDistrictTengxunDTO.java @@ -0,0 +1,50 @@ +package com.mzl.flower.dto.request.district; + +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiOperation; +import lombok.Data; + +import javax.validation.constraints.NotEmpty; + +@Data +@ApiModel("腾讯地图的行政区划 ") +public class CreateDistrictTengxunDTO { + + private String id; + + /** + * 名称 + */ + @ApiModelProperty(value = "name") + @NotEmpty(message = "名称不能为空") + private String name; + + /** + * 全称 + */ + @ApiModelProperty(value = "fullname") + @NotEmpty(message = "全称不能为空") + private String fullname; + + /** + * 区域编码 + */ + @ApiModelProperty(value = "code") + @NotEmpty(message = "编码不能为空") + private String code; + + + @ApiModelProperty(value = "等级") + private Integer level; + + /** + * 父id + */ + @ApiModelProperty(value = "父id") + private String parentId; + + + +} diff --git a/src/main/java/com/mzl/flower/dto/request/district/QueryDistrictTengxunDTO.java b/src/main/java/com/mzl/flower/dto/request/district/QueryDistrictTengxunDTO.java new file mode 100644 index 0000000..c5333cc --- /dev/null +++ b/src/main/java/com/mzl/flower/dto/request/district/QueryDistrictTengxunDTO.java @@ -0,0 +1,8 @@ +package com.mzl.flower.dto.request.district; + +import lombok.Data; + +@Data +public class QueryDistrictTengxunDTO { + +} diff --git a/src/main/java/com/mzl/flower/dto/response/district/DistrictTengxunVO.java b/src/main/java/com/mzl/flower/dto/response/district/DistrictTengxunVO.java new file mode 100644 index 0000000..969dadd --- /dev/null +++ b/src/main/java/com/mzl/flower/dto/response/district/DistrictTengxunVO.java @@ -0,0 +1,13 @@ +package com.mzl.flower.dto.response.district; + +import com.mzl.flower.entity.district.DistrictTengxunDO; +import lombok.Data; + +import java.util.List; + +@Data +public class DistrictTengxunVO extends DistrictTengxunDO { + + List<DistrictTengxunVO> children; + +} diff --git a/src/main/java/com/mzl/flower/dto/response/district/DistrictVO.java b/src/main/java/com/mzl/flower/dto/response/district/DistrictVO.java new file mode 100644 index 0000000..8e94a7c --- /dev/null +++ b/src/main/java/com/mzl/flower/dto/response/district/DistrictVO.java @@ -0,0 +1,48 @@ +package com.mzl.flower.dto.response.district; + +import lombok.Data; + +import java.util.List; + +@Data +public class DistrictVO { + + private String id; + + /** + * 名称 + */ + private String name; + + /** + * 城市编码 + */ + private String citycode; + + /** + * 区域编码 + */ + private String adcode; + + /** + * 行政区域边界坐标点 + */ + private String polyline; + + /** + * 区域中心点 + */ + private String center; + + /** + * 行政区划级别(country国家 province 省份 city市 district 区县 street街道) + */ + private String level; + /** + * 父id + */ + private String parentId; + + + List<DistrictVO> children; +} diff --git a/src/main/java/com/mzl/flower/dto/response/system/AreaDTO.java b/src/main/java/com/mzl/flower/dto/response/system/AreaDTO.java index fd56223..8c45a82 100644 --- a/src/main/java/com/mzl/flower/dto/response/system/AreaDTO.java +++ b/src/main/java/com/mzl/flower/dto/response/system/AreaDTO.java @@ -1,12 +1,23 @@ package com.mzl.flower.dto.response.system; +import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; +import java.util.ArrayList; import java.util.List; @Data +@NoArgsConstructor +@AllArgsConstructor public class AreaDTO { private String code; private String name; - private List<AreaDTO> children; + private List<AreaDTO> children=new ArrayList<>(); + + public AreaDTO(String code, String name) { + this.code = code; + this.name = name; + } + } diff --git a/src/main/java/com/mzl/flower/entity/district/DistrictDO.java b/src/main/java/com/mzl/flower/entity/district/DistrictDO.java new file mode 100644 index 0000000..3e6b79e --- /dev/null +++ b/src/main/java/com/mzl/flower/entity/district/DistrictDO.java @@ -0,0 +1,58 @@ +package com.mzl.flower.entity.district; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.mzl.flower.base.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 对接高德地图行政区划 + * + * @author @TaoJie + * @since 2024-12-19 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@TableName("t_district") +public class DistrictDO extends BaseEntity { + + + /** + * 名称 + */ + private String name; + + /** + * 城市编码 + */ + private String citycode; + + /** + * 区域编码 + */ + private String adcode; + + /** + * 行政区域边界坐标点 + */ + private String polyline; + + /** + * 区域中心点 + */ + private String center; + + /** + * 行政区划级别(country国家 province 省份 city市 district 区县 street街道) + */ + private String level; + + /** + * 父id + */ + private String parentId; + + +} diff --git a/src/main/java/com/mzl/flower/entity/district/DistrictTengxunDO.java b/src/main/java/com/mzl/flower/entity/district/DistrictTengxunDO.java new file mode 100644 index 0000000..3bc8f84 --- /dev/null +++ b/src/main/java/com/mzl/flower/entity/district/DistrictTengxunDO.java @@ -0,0 +1,46 @@ +package com.mzl.flower.entity.district; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.mzl.flower.base.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 对接高德地图行政区划 + * + * @author @TaoJie + * @since 2024-12-19 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@TableName("t_district_tengxun") +public class DistrictTengxunDO extends BaseEntity { + + + /** + * 名称 + */ + private String name; + + /** + * 城市编码 + */ + private String fullname; + + /** + * 区域编码 + */ + private String code; + + + private Integer level; + + /** + * 父id + */ + private String parentId; + + +} diff --git a/src/main/java/com/mzl/flower/mapper/district/DistrictMapper.java b/src/main/java/com/mzl/flower/mapper/district/DistrictMapper.java new file mode 100644 index 0000000..546b0a0 --- /dev/null +++ b/src/main/java/com/mzl/flower/mapper/district/DistrictMapper.java @@ -0,0 +1,16 @@ +package com.mzl.flower.mapper.district; + +import com.mzl.flower.entity.district.DistrictDO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * <p> + * 对接高德地图行政区划 Mapper 接口 + * </p> + * + * @author @TaoJie + * @since 2024-12-19 + */ +public interface DistrictMapper extends BaseMapper<DistrictDO> { + +} diff --git a/src/main/java/com/mzl/flower/mapper/district/DistrictMapperCustom.java b/src/main/java/com/mzl/flower/mapper/district/DistrictMapperCustom.java new file mode 100644 index 0000000..a4c598f --- /dev/null +++ b/src/main/java/com/mzl/flower/mapper/district/DistrictMapperCustom.java @@ -0,0 +1,18 @@ +package com.mzl.flower.mapper.district; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mzl.flower.entity.district.DistrictDO; + +/** + * <p> + * 对接高德地图行政区划 Mapper 接口 + * </p> + * + * @author @TaoJie + * @since 2024-12-19 + */ +public interface DistrictMapperCustom extends BaseMapper<DistrictDO> { + + void removeAllDistricts(); + +} diff --git a/src/main/java/com/mzl/flower/mapper/district/DistrictTengxunMapper.java b/src/main/java/com/mzl/flower/mapper/district/DistrictTengxunMapper.java new file mode 100644 index 0000000..1a9d587 --- /dev/null +++ b/src/main/java/com/mzl/flower/mapper/district/DistrictTengxunMapper.java @@ -0,0 +1,17 @@ +package com.mzl.flower.mapper.district; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mzl.flower.entity.district.DistrictDO; +import com.mzl.flower.entity.district.DistrictTengxunDO; + +/** + * <p> + * 对接高德地图行政区划 Mapper 接口 + * </p> + * + * @author @TaoJie + * @since 2024-12-19 + */ +public interface DistrictTengxunMapper extends BaseMapper<DistrictTengxunDO> { + +} diff --git a/src/main/java/com/mzl/flower/mapper/district/DistrictTengxunMapperCustom.java b/src/main/java/com/mzl/flower/mapper/district/DistrictTengxunMapperCustom.java new file mode 100644 index 0000000..42215a2 --- /dev/null +++ b/src/main/java/com/mzl/flower/mapper/district/DistrictTengxunMapperCustom.java @@ -0,0 +1,19 @@ +package com.mzl.flower.mapper.district; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mzl.flower.entity.district.DistrictDO; +import com.mzl.flower.entity.district.DistrictTengxunDO; + +/** + * <p> + * 对接高德地图行政区划 Mapper 接口 + * </p> + * + * @author @TaoJie + * @since 2024-12-19 + */ +public interface DistrictTengxunMapperCustom extends BaseMapper<DistrictTengxunDO> { + + void removeAllDistricts(); + +} diff --git a/src/main/java/com/mzl/flower/schedule/MapScheduleService.java b/src/main/java/com/mzl/flower/schedule/MapScheduleService.java new file mode 100644 index 0000000..9291121 --- /dev/null +++ b/src/main/java/com/mzl/flower/schedule/MapScheduleService.java @@ -0,0 +1,43 @@ +package com.mzl.flower.schedule; + +import com.mzl.flower.service.district.DistrictTengxunService; +import com.mzl.flower.service.map.MapGaodeService; +import com.mzl.flower.service.map.MapTengxunService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class MapScheduleService { + + @Autowired + private MapTengxunService mapTengxunService; + + @Autowired + private MapGaodeService mapGaodeService; + + @Autowired + private DistrictTengxunService districtTengxunService; + + + + + /** + * 积分兑换券过期 + */ + @Scheduled(cron = "5 * * * * ?") + public void expiredPointGoodsRecord() { + + // 高德地图解析-行政区划 +// mapGaodeService.getAdministrativeDivision(); + // 腾讯地图解析-行政区划 +// mapTengxunService.getAdministrativeDivision(); + +// districtTengxunService.refreshDistrict(); + + } + + +} diff --git a/src/main/java/com/mzl/flower/service/district/DistrictService.java b/src/main/java/com/mzl/flower/service/district/DistrictService.java new file mode 100644 index 0000000..91769e2 --- /dev/null +++ b/src/main/java/com/mzl/flower/service/district/DistrictService.java @@ -0,0 +1,80 @@ +package com.mzl.flower.service.district; + +import com.mzl.flower.dto.request.district.CreateDistrictGaodeDTO; +import com.mzl.flower.dto.response.district.DistrictVO; +import com.mzl.flower.dto.response.system.AreaDTO; +import com.mzl.flower.entity.district.DistrictDO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** + * <p> + * 对接高德地图行政区划 服务类 + * </p> + * + * @author @TaoJie + * @since 2024-12-19 + */ +public interface DistrictService extends IService<DistrictDO> { + + void removeAllDistricts(); + + void refreshDistrict(); + + /** + * 获取所有的行政区划列表 + * @return + */ + List<DistrictDO> getAllDistrict(); + + /** + * 从数据库里面获取 + * @return + */ + List<AreaDTO> getAreaDTOListByDB(); + + /** + * 从JSON文件里面获取 + * @return + */ + List<AreaDTO> getAreaDTOListByJsonFile(); + + + /** + * 保存高德数据库入数据库 + * @param districtDOList + */ + void saveRemoteDistricts(List<DistrictDO> districtDOList); + + List<DistrictVO> getDistrictTreeList(); + + /** + * 创建行政区划 + * @param dto + * @return + */ + boolean createDistrict(CreateDistrictGaodeDTO dto); + + /** + * 更新行政区划 + * @param dto + * @return + */ + boolean updateDistrict(CreateDistrictGaodeDTO dto); + + /** + * 删除行政区划 + * @param id + * @return + */ + boolean deleteDistrict(String id); + + /** + * 获取行政区划 + * @return + */ + String getChineseArea(); + + void clearChineseDataCache(); +} diff --git a/src/main/java/com/mzl/flower/service/district/DistrictTengxunService.java b/src/main/java/com/mzl/flower/service/district/DistrictTengxunService.java new file mode 100644 index 0000000..5b7f829 --- /dev/null +++ b/src/main/java/com/mzl/flower/service/district/DistrictTengxunService.java @@ -0,0 +1,71 @@ +package com.mzl.flower.service.district; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mzl.flower.dto.request.district.CreateDistrictTengxunDTO; +import com.mzl.flower.dto.response.district.DistrictTengxunVO; +import com.mzl.flower.dto.response.system.AreaDTO; +import com.mzl.flower.entity.district.DistrictTengxunDO; + +import java.util.List; + +/** + * <p> + * 对接高德地图行政区划 服务类 + * </p> + * + * @author @TaoJie + * @since 2024-12-19 + */ +public interface DistrictTengxunService extends IService<DistrictTengxunDO> { + + void removeAllDistricts(); + + void refreshDistrict(); + + /** + * 获取所有的行政区划列表 + * @return + */ + List<DistrictTengxunDO> getAllDistrict(); + + /** + * 从数据库里面获取 + * @return + */ + List<AreaDTO> getAreaDTOListByDB(); + + /** + * 从JSON文件里面获取 + * @return + */ + List<AreaDTO> getAreaDTOListByJsonFile(); + + + /** + * 将远程的数据保存入库 + * @param districtTengxunDOList + */ + void saveRemoteDistricts(List<DistrictTengxunDO> districtTengxunDOList); + + List<DistrictTengxunVO> getDistrictTreeList(); + + /** + * 创建行政区 + * @param dto + * @return + */ + boolean createDistrict(CreateDistrictTengxunDTO dto); + + /** + * 删除行政区划及所有下级 + * @param id + * @return + */ + boolean deleteDistrict(String id); + + boolean updateDistrict(CreateDistrictTengxunDTO dto); + + String getChineseArea(); + + void clearChineseDataCache(); +} diff --git a/src/main/java/com/mzl/flower/service/impl/district/DistrictServiceImpl.java b/src/main/java/com/mzl/flower/service/impl/district/DistrictServiceImpl.java new file mode 100644 index 0000000..9eebb91 --- /dev/null +++ b/src/main/java/com/mzl/flower/service/impl/district/DistrictServiceImpl.java @@ -0,0 +1,303 @@ +package com.mzl.flower.service.impl.district; + +import cn.hutool.core.util.IdUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.google.gson.Gson; +import com.mzl.flower.base.cache.StringCacheClient; +import com.mzl.flower.config.exception.ValidationException; +import com.mzl.flower.config.security.SecurityUtils; +import com.mzl.flower.dto.request.district.CreateDistrictGaodeDTO; +import com.mzl.flower.dto.response.district.DistrictVO; +import com.mzl.flower.dto.response.system.AreaDTO; +import com.mzl.flower.entity.district.DistrictDO; +import com.mzl.flower.entity.district.DistrictTengxunDO; +import com.mzl.flower.mapper.district.DistrictMapper; +import com.mzl.flower.mapper.district.DistrictMapperCustom; +import com.mzl.flower.service.district.DistrictService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mzl.flower.utils.ConverterUtil; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * <p> + * 对接高德地图行政区划 服务实现类 + * </p> + * + * @author @TaoJie + * @since 2024-12-19 + */ +@Service +public class DistrictServiceImpl extends ServiceImpl<DistrictMapper, DistrictDO> implements DistrictService { + + @Autowired + private DistrictMapperCustom districtMapperCustom; + + @Autowired + private StringCacheClient stringCacheClient; + @Override + public void removeAllDistricts() { + districtMapperCustom.removeAllDistricts(); + } + + @Override + public void refreshDistrict() { + // 获取所有的数据,并组织成树形结构 + List<DistrictDO> districtDOList = getAllDistrict(); + List<DistrictVO> districtVOList= ConverterUtil.transList(districtDOList, DistrictVO.class); + if(CollectionUtils.isNotEmpty(districtDOList)){ + // 找出parent_id 是null的为根节点 + Optional<DistrictVO> root = districtVOList.stream().filter(districtVO -> districtVO.getParentId() == null).findFirst(); + // 遍历districtDOList,形成树形结构 + if(null!=root && root.isPresent()){ + DistrictVO rootNode = root.get(); + // 构建树形结构 + buildTree(rootNode, districtVOList); + // 查看这里的树形状结构,将这里的树型转换成之前前端使用的结构 + AreaDTO areaDTO = transform(rootNode); + Gson gson=new Gson(); + System.out.println("整个中国地图的json"); + System.out.println(gson.toJson(areaDTO)); + System.out.println("整个中国地图下城市的json"); + System.out.println(gson.toJson(areaDTO.getChildren())); + + } + + } + // 根据id和partent_id 构造出行政区划字典 +// AreaDTO areaDTO = AreaDTO.build(districtDOList); + + } + + + // 递归构建树形结构 + private static void buildTree(DistrictVO parent, List<DistrictVO> allNodes) { + List<DistrictVO> children = allNodes.stream() + .filter(node -> parent.getId().equals(node.getParentId())) + .collect(Collectors.toList()); + + parent.setChildren(children); + + for (DistrictVO child : children) { + buildTree(child, allNodes); + } + } + + // 转换方法 + public static AreaDTO transform(DistrictVO sourceNode) { + if (sourceNode == null) { + return null; + } + + // 映射当前节点 + AreaDTO targetNode = new AreaDTO(sourceNode.getName(), sourceNode.getName()); + + // 递归映射子节点 + if (sourceNode.getChildren() != null) { + for (DistrictVO child : sourceNode.getChildren()) { + targetNode.getChildren().add(transform(child)); + } + } + + return targetNode; + } + + + @Override + public List<DistrictDO> getAllDistrict() { + return baseMapper.selectList(new LambdaQueryWrapper<DistrictDO>().eq(DistrictDO::getDeleted, false).orderByAsc(DistrictDO::getAdcode)); + } + + @Override + public List<AreaDTO> getAreaDTOListByDB() { + return null; + } + + @Override + public List<AreaDTO> getAreaDTOListByJsonFile() { + return null; + } + + @Override + public void saveRemoteDistricts(List<DistrictDO> districtDOList) { + // 先把所有数据放入缓存 + removeAllDistricts(); + + districtDOList.stream().forEach(districtDO -> { + districtDO.create(); + districtDO.setCreateBy("system"); + districtDO.setUpdateBy("system"); + }); + // 保存数据入库 + saveBatch(districtDOList); + +// saveOrUpdateBatch(districtDOList) + } + + @Override + public List<DistrictVO> getDistrictTreeList() { + // 获取所有的数据,并组织成树形结构 + List<DistrictDO> districtDOList = getAllDistrict(); + List<DistrictVO> districtVOList= ConverterUtil.transList(districtDOList, DistrictVO.class); + if(CollectionUtils.isNotEmpty(districtDOList)){ + // 找出parent_id 是null的为根节点 + Optional<DistrictVO> root = districtVOList.stream().filter(districtVO -> districtVO.getParentId() == null).findFirst(); + // 遍历districtDOList,形成树形结构 + if(null!=root && root.isPresent()){ + DistrictVO rootNode = root.get(); + // 构建树形结构 + buildTree(rootNode, districtVOList); + return rootNode.getChildren(); + + } + + } + return null; + } + + @Transactional + @Override + public boolean createDistrict(CreateDistrictGaodeDTO dto) { + + // 查看相同节点下的名称是否存在,这里的partentId可能是null的情况 + + if(StringUtils.isBlank(dto.getParentId())){ + // 获取根节点 adcode=100000 + LambdaQueryWrapper<DistrictDO> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DistrictDO::getDeleted, false).eq(DistrictDO::getAdcode,"100000"); + List<DistrictDO> list = list(queryWrapper); + if(CollectionUtils.isNotEmpty(list)){ + DistrictDO districtDO = list.get(0); + dto.setParentId(districtDO.getId()); + } + + } + + if(StringUtils.isNotBlank(dto.getName())){ + LambdaQueryWrapper<DistrictDO> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DistrictDO::getDeleted, false).eq(DistrictDO::getName, dto.getName()); + if (dto.getParentId() == null) { + queryWrapper.isNull(DistrictDO::getParentId); + } else { + queryWrapper.eq(DistrictDO::getParentId, dto.getParentId()); + } + if (count(queryWrapper)>0) { + throw new ValidationException("当前名称已经存在"); + } + } + + + DistrictDO districtDO =new DistrictDO(); + BeanUtils.copyProperties(dto,districtDO); + + districtDO.setId(IdUtil.simpleUUID()); + districtDO.create(SecurityUtils.getUserId()); + + + boolean result= save(districtDO); + // 清空缓存 + clearChineseDataCache(); + return result; + } + + @Transactional + @Override + public boolean updateDistrict(CreateDistrictGaodeDTO dto) { + DistrictDO existsDistrict = getById(dto.getId()); + if(Objects.isNull(existsDistrict)){ + throw new ValidationException("当前id不存在"); + } + + if(StringUtils.isNotBlank(dto.getName())){ + LambdaQueryWrapper<DistrictDO> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DistrictDO::getDeleted, false) + .eq(DistrictDO::getName, dto.getName()) + .ne(DistrictDO::getId,dto.getId()); + if (dto.getParentId() == null) { + queryWrapper.isNull(DistrictDO::getParentId); + } else { + queryWrapper.eq(DistrictDO::getParentId, dto.getParentId()); + } + if (count(queryWrapper)>0) { + throw new ValidationException("当前名称已经存在"); + } + } + + + BeanUtils.copyProperties(dto, existsDistrict); + existsDistrict.update(SecurityUtils.getUserId()); + + boolean result= updateById(existsDistrict); + // 清空缓存 + clearChineseDataCache(); + + return result; + + } + + @Transactional + @Override + public boolean deleteDistrict(String id) { + DistrictDO existsDistrict = getById(id); + existsDistrict.update(SecurityUtils.getUserId()); + existsDistrict.setDeleted(true); + updateById(existsDistrict); + + List<DistrictDO> childrenList = list(new LambdaQueryWrapper<DistrictDO>().eq(DistrictDO::getParentId, id)); + if(CollectionUtils.isNotEmpty(childrenList)){ + childrenList.stream().forEach(districtTengxunDO -> { + deleteDistrict(districtTengxunDO.getId()); + }); + } + // 清空缓存 + clearChineseDataCache(); + return true; + } + + @Override + public String getChineseArea() { + String result = stringCacheClient.get("CHINA_AREA_DATA"); + if (StringUtils.isNotBlank(result)) { + return result; + } else { List<DistrictDO> districtDOList = getAllDistrict(); + List<DistrictVO> districtVOList= ConverterUtil.transList(districtDOList, DistrictVO.class); + if(CollectionUtils.isNotEmpty(districtDOList)){ + // 找出parent_id 是null的为根节点 + Optional<DistrictVO> root = districtVOList.stream().filter(districtVO -> districtVO.getParentId() == null).findFirst(); + // 遍历districtDOList,形成树形结构 + if(null!=root && root.isPresent()){ + DistrictVO rootNode = root.get(); + // 构建树形结构 + buildTree(rootNode, districtVOList); + // 查看这里的树形状结构,将这里的树型转换成之前前端使用的结构 + AreaDTO areaDTO = transform(rootNode); + Gson gson=new Gson(); + result=gson.toJson(areaDTO.getChildren()); +// System.out.println(result); + if(StringUtils.isNotBlank(result)){ + stringCacheClient.set("CHINA_AREA_DATA", result); + } + return result; + } + + } + return null; + } + } + + @Override + public void clearChineseDataCache() { + stringCacheClient.delete("CHINA_AREA_DATA"); + } + +} diff --git a/src/main/java/com/mzl/flower/service/impl/district/DistrictTengxunServiceImpl.java b/src/main/java/com/mzl/flower/service/impl/district/DistrictTengxunServiceImpl.java new file mode 100644 index 0000000..b2ec3f5 --- /dev/null +++ b/src/main/java/com/mzl/flower/service/impl/district/DistrictTengxunServiceImpl.java @@ -0,0 +1,367 @@ +package com.mzl.flower.service.impl.district; + +import cn.hutool.core.util.IdUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.gson.Gson; +import com.mzl.flower.base.cache.StringCacheClient; +import com.mzl.flower.config.exception.ValidationException; +import com.mzl.flower.config.security.SecurityUtils; +import com.mzl.flower.dto.request.district.CreateDistrictTengxunDTO; +import com.mzl.flower.dto.response.district.DistrictTengxunVO; +import com.mzl.flower.dto.response.system.AreaDTO; +import com.mzl.flower.entity.district.DistrictTengxunDO; +import com.mzl.flower.entity.district.DistrictTengxunDO; +import com.mzl.flower.mapper.district.DistrictTengxunMapper; +import com.mzl.flower.mapper.district.DistrictTengxunMapperCustom; +import com.mzl.flower.service.district.DistrictTengxunService; +import com.mzl.flower.utils.ConverterUtil; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * <p> + * 对接高德地图行政区划 服务实现类 + * </p> + * + * @author @TaoJie + * @since 2024-12-19 + */ +@Service +public class DistrictTengxunServiceImpl extends ServiceImpl<DistrictTengxunMapper, DistrictTengxunDO> implements DistrictTengxunService { + + @Autowired + private DistrictTengxunMapperCustom districtTengxunMapperCustom; + @Override + public void removeAllDistricts() { + districtTengxunMapperCustom.removeAllDistricts(); + } + + @Autowired + private StringCacheClient stringCacheClient; + @Override + public void refreshDistrict() { + List<DistrictTengxunDO> districtTengxunDOList = getAllDistrict(); + List<DistrictTengxunVO> districtTengxunVOList = ConverterUtil.transList(districtTengxunDOList, DistrictTengxunVO.class); + + if (CollectionUtils.isNotEmpty(districtTengxunDOList)) { + // 找出所有 parent_id 为 null 的节点作为根节点集合 + List<DistrictTengxunVO> roots = districtTengxunVOList.stream() + .filter(districtTengxunVO -> districtTengxunVO.getParentId() == null) + .collect(Collectors.toList()); + + // 遍历根节点,构建每棵树形结构 + List<AreaDTO> areaDTOList = new ArrayList<>(); + for (DistrictTengxunVO rootNode : roots) { + // 构建树形结构 + buildTree(rootNode, districtTengxunVOList); + + // 将树形转换成前端需要的结构 + AreaDTO areaDTO = transform(rootNode); + areaDTOList.add(areaDTO); + + // 打印每个根节点对应的树形 JSON + Gson gson = new Gson(); + System.out.println("根节点:" + rootNode.getName()); + System.out.println("树形结构 JSON:" + gson.toJson(areaDTO)); + } + + // 如果需要整个树形结构的 JSON + Gson gson = new Gson(); + System.out.println("整个中国地图的 JSON:" + gson.toJson(areaDTOList)); + } + + } + + + // 递归构建树形结构 + private static void buildTree(DistrictTengxunVO parent, List<DistrictTengxunVO> allNodes) { + List<DistrictTengxunVO> children = allNodes.stream() + .filter(node -> parent.getId().equals(node.getParentId())) + .collect(Collectors.toList()); + + parent.setChildren(children); + + for (DistrictTengxunVO child : children) { + buildTree(child, allNodes); + } + } + + // 转换方法 + public static AreaDTO transform(DistrictTengxunVO sourceNode) { + if (sourceNode == null) { + return null; + } + + // 映射当前节点 + AreaDTO targetNode = new AreaDTO(sourceNode.getName(), sourceNode.getName()); + + // 递归映射子节点 + if (sourceNode.getChildren() != null) { + for (DistrictTengxunVO child : sourceNode.getChildren()) { + targetNode.getChildren().add(transform(child)); + } + } + + return targetNode; + } + + + @Override + public List<DistrictTengxunDO> getAllDistrict() { + return baseMapper.selectList(new LambdaQueryWrapper<DistrictTengxunDO>().eq(DistrictTengxunDO::getDeleted, false).orderByAsc(DistrictTengxunDO::getCode)); + } + + @Override + public List<AreaDTO> getAreaDTOListByDB() { + + return null; + } + + @Override + public List<AreaDTO> getAreaDTOListByJsonFile() { + return null; + } + + @Override + public void saveRemoteDistricts(List<DistrictTengxunDO> districtTengxunDOList) { + + districtTengxunDOList.stream().forEach(districtTengxunDO -> { + // 保存数据库中必要的信息 + districtTengxunDO.create(); + districtTengxunDO.setCreateBy("system"); + districtTengxunDO.setUpdateBy("system"); + }); + + saveOrUpdateBatch(districtTengxunDOList); + /* + List<DistrictTengxunDO> existList=new ArrayList<>(); + List<DistrictTengxunDO> noneExistList=new ArrayList<>(); + + // 查看是否已经存在code,如果存在则更新,不存在则插入 + districtTengxunDOList.stream().forEach(districtTengxunDO -> { + List<DistrictTengxunDO> list = list(new LambdaQueryWrapper<DistrictTengxunDO>().eq(DistrictTengxunDO::getDeleted, false).eq(DistrictTengxunDO::getCode,districtTengxunDO.getCode() )); + if (CollectionUtils.isNotEmpty(list)) { + existList.add(districtTengxunDO); + } else { + // 插入 + noneExistList.add(districtTengxunDO); + } + }); + + + + removeAllDistricts(); + System.out.println("删除成功"); + // 保存数据入库 + saveBatch(districtTengxunDOList);*/ + System.out.println("保存成功"); + } + + @Override + public List<DistrictTengxunVO> getDistrictTreeList() { + List<DistrictTengxunDO> districtTengxunDOList = getAllDistrict(); + List<DistrictTengxunVO> districtTengxunVOList = ConverterUtil.transList(districtTengxunDOList, DistrictTengxunVO.class); + + if (CollectionUtils.isNotEmpty(districtTengxunDOList)) { + // 找出所有 parent_id 为 null 的节点作为根节点集合 + List<DistrictTengxunVO> roots = districtTengxunVOList.stream() + .filter(districtTengxunVO -> districtTengxunVO.getParentId() == null) + .collect(Collectors.toList()); + + + for (DistrictTengxunVO rootNode : roots) { + // 构建树形结构 + buildTree(rootNode, districtTengxunVOList); + + } + return roots; + } + return null; + } + + @Transactional + @Override + public boolean createDistrict(CreateDistrictTengxunDTO dto) { + + // 查看编码是否存在 + if (count(new LambdaQueryWrapper<DistrictTengxunDO>() + .eq(DistrictTengxunDO::getDeleted, false) + .eq(DistrictTengxunDO::getCode, dto.getCode()))>0) { + throw new ValidationException("当前编码已经存在,code全局唯一"); + } + // 查看相同节点下的名称是否存在,这里的partentId可能是null的情况 + + if(StringUtils.isNotBlank(dto.getName())){ + LambdaQueryWrapper<DistrictTengxunDO> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DistrictTengxunDO::getDeleted, false) + .eq(DistrictTengxunDO::getName, dto.getName()); + if (dto.getParentId() == null) { + queryWrapper.isNull(DistrictTengxunDO::getParentId); + } else { + queryWrapper.eq(DistrictTengxunDO::getParentId, dto.getParentId()); + } + if (count(queryWrapper)>0) { + throw new ValidationException("当前名称已经存在"); + } + } + + if(StringUtils.isNotBlank(dto.getFullname())){ + LambdaQueryWrapper<DistrictTengxunDO> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DistrictTengxunDO::getDeleted, false) + .eq(DistrictTengxunDO::getFullname, dto.getFullname()); + if (dto.getParentId() == null) { + queryWrapper.isNull(DistrictTengxunDO::getParentId); + } else { + queryWrapper.eq(DistrictTengxunDO::getParentId, dto.getParentId()); + } + if (count(queryWrapper)>0) { + throw new ValidationException("当前全称已经存在"); + } + } + + DistrictTengxunDO districtTengxunDO =new DistrictTengxunDO(); + BeanUtils.copyProperties(dto,districtTengxunDO); + + districtTengxunDO.setId(IdUtil.simpleUUID()); + districtTengxunDO.create(SecurityUtils.getUserId()); + + // 保存 + boolean result=save(districtTengxunDO); + // 清空缓存 + clearChineseDataCache(); + return result; + } + + @Transactional + @Override + public boolean deleteDistrict(String id) { + DistrictTengxunDO existsDistrict = getById(id); + existsDistrict.update(SecurityUtils.getUserId()); + existsDistrict.setDeleted(true); + updateById(existsDistrict); + + List<DistrictTengxunDO> childrenList = list(new LambdaQueryWrapper<DistrictTengxunDO>().eq(DistrictTengxunDO::getParentId, id)); + if(CollectionUtils.isNotEmpty(childrenList)){ + childrenList.stream().forEach(districtTengxunDO -> { + deleteDistrict(districtTengxunDO.getId()); + }); + } + // 清空缓存 + clearChineseDataCache(); + return true; + } + + @Transactional + @Override + public boolean updateDistrict(CreateDistrictTengxunDTO dto) { + DistrictTengxunDO existsDistrict = getById(dto.getId()); + if(Objects.isNull(existsDistrict)){ + throw new ValidationException("当前id不存在"); + } + + // 查看编码是否存在 + if (count(new LambdaQueryWrapper<DistrictTengxunDO>() + .eq(DistrictTengxunDO::getDeleted, false) + .eq(DistrictTengxunDO::getCode, dto.getCode()).ne(DistrictTengxunDO::getId,dto.getId()))>0) { + throw new ValidationException("当前编码已经存在,code全局唯一"); + } + // 查看相同节点下的名称是否存在,这里的partentId可能是null的情况 + + if(StringUtils.isNotBlank(dto.getName())){ + LambdaQueryWrapper<DistrictTengxunDO> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DistrictTengxunDO::getDeleted, false) + .eq(DistrictTengxunDO::getName, dto.getName()) + .ne(DistrictTengxunDO::getId,dto.getId()); + if (dto.getParentId() == null) { + queryWrapper.isNull(DistrictTengxunDO::getParentId); + } else { + queryWrapper.eq(DistrictTengxunDO::getParentId, dto.getParentId()); + } + if (count(queryWrapper)>0) { + throw new ValidationException("当前名称已经存在"); + } + } + + if(StringUtils.isNotBlank(dto.getFullname())){ + LambdaQueryWrapper<DistrictTengxunDO> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DistrictTengxunDO::getDeleted, false) + .eq(DistrictTengxunDO::getFullname, dto.getFullname()) + .ne(DistrictTengxunDO::getId,dto.getId()); + if (dto.getParentId() == null) { + queryWrapper.isNull(DistrictTengxunDO::getParentId); + } else { + queryWrapper.eq(DistrictTengxunDO::getParentId, dto.getParentId()); + } + if (count(queryWrapper)>0) { + throw new ValidationException("当前全称已经存在"); + } + } + + BeanUtils.copyProperties(dto, existsDistrict); + existsDistrict.update(SecurityUtils.getUserId()); + + boolean result= updateById(existsDistrict); + // 清空缓存 + clearChineseDataCache(); + return result; + } + + @Override + public String getChineseArea() { + + String result = stringCacheClient.get("CHINA_AREA_DATA"); + if (StringUtils.isNotBlank(result)) { + return result; + } else { + // 打印每个根节点对应的树形 JSON + Gson gson = new Gson(); + + List<DistrictTengxunDO> districtTengxunDOList = getAllDistrict(); + List<DistrictTengxunVO> districtTengxunVOList = ConverterUtil.transList(districtTengxunDOList, DistrictTengxunVO.class); + + if (CollectionUtils.isNotEmpty(districtTengxunDOList)) { + // 找出所有 parent_id 为 null 的节点作为根节点集合 + List<DistrictTengxunVO> roots = districtTengxunVOList.stream() + .filter(districtTengxunVO -> districtTengxunVO.getParentId() == null) + .collect(Collectors.toList()); + + // 遍历根节点,构建每棵树形结构 + List<AreaDTO> areaDTOList = new ArrayList<>(); + for (DistrictTengxunVO rootNode : roots) { + // 构建树形结构 + buildTree(rootNode, districtTengxunVOList); + + // 将树形转换成前端需要的结构 + AreaDTO areaDTO = transform(rootNode); + areaDTOList.add(areaDTO); + } + result=gson.toJson(areaDTOList); + if(StringUtils.isNotBlank(result)){ + stringCacheClient.set("CHINA_AREA_DATA", result); + } + + return result; + } + return ""; + } + + + } + + @Override + public void clearChineseDataCache() { + stringCacheClient.delete("CHINA_AREA_DATA"); + } + +} diff --git a/src/main/java/com/mzl/flower/service/impl/map/MapGaodeServiceImpl.java b/src/main/java/com/mzl/flower/service/impl/map/MapGaodeServiceImpl.java new file mode 100644 index 0000000..24935d5 --- /dev/null +++ b/src/main/java/com/mzl/flower/service/impl/map/MapGaodeServiceImpl.java @@ -0,0 +1,107 @@ +package com.mzl.flower.service.impl.map; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.http.HttpUtil; +import com.google.gson.Gson; +import com.mzl.flower.config.GaodeMapProperties; +import com.mzl.flower.dto.map.gaode.GaodeDistrict; +import com.mzl.flower.dto.map.gaode.GaodeMapResponse; +import com.mzl.flower.dto.response.coupon.CouponTemplateActivyVO; +import com.mzl.flower.entity.district.DistrictDO; +import com.mzl.flower.service.district.DistrictService; +import com.mzl.flower.service.map.MapGaodeService; +import com.mzl.flower.utils.ConverterUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.codec.digest.Md5Crypt; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +@Service +@Slf4j +public class MapGaodeServiceImpl implements MapGaodeService { + + @Autowired + private GaodeMapProperties gaodeMapProperties; + + @Autowired + private DistrictService districtService; + + @Override + public void getAdministrativeDivision() { + + String administrativeDivisionsUrl = gaodeMapProperties.getAdministrativeDivisionsUrl(); + System.out.println(administrativeDivisionsUrl); + //可以单独传入http参数,这样参数会自动做URL编码,拼接在URL中 + HashMap<String, Object> paramMap = new HashMap<>(); + + String result= HttpUtil.get(administrativeDivisionsUrl, paramMap); + System.out.println(result); + // 使用 Gson 解析 JSON 字符串 + Gson gson = new Gson(); + GaodeMapResponse response = gson.fromJson(result, GaodeMapResponse.class); + if(response.getStatus().equals("1")&&response.getInfocode().equals("10000")){ + log.info("高德地图获取行政区划成功"); + log.info(response.getDistricts().toString()); + List<GaodeDistrict> allTengxunDistricts = new ArrayList<>(); + for (GaodeDistrict gaodeDistrict : response.getDistricts()){ + addDistrictToList(gaodeDistrict, null, allTengxunDistricts); // 从根节点开始,父节点 ID 为 null + } + // 打印所有区划信息 + for (GaodeDistrict gaodeDistrict :allTengxunDistricts){ + printDistrictInfo(gaodeDistrict); + } + // 保存所有的行政区划数据到数据库中 + // 将allTengxunDistricts转换成List<DsitrictVO> + List<DistrictDO> districtDOList= ConverterUtil.transList(allTengxunDistricts, DistrictDO.class); + + /** + * 保存数据到数据库中 + */ + districtService.saveRemoteDistricts(districtDOList); + + + System.out.println("保存成功"); + }else{ + log.error("高德地图获取行政区划失败"); + } + + + + } + + public static void addDistrictToList(GaodeDistrict gaodeDistrict, String parentId, List<GaodeDistrict> allTengxunDistricts) { + // 设置id + gaodeDistrict.setId(IdUtil.simpleUUID()); +// String idStr=gaodeDistrict.getAdcode()+gaodeDistrict.getLevel(); +// gaodeDistrict.setId(idStr); + // 设置父节点 ID + gaodeDistrict.setParentId(parentId); + // 将当前区划添加到结果列表 + allTengxunDistricts.add(gaodeDistrict); + + // 递归遍历子区划 + if (gaodeDistrict.getDistricts() != null) { + for (GaodeDistrict child : gaodeDistrict.getDistricts()) { + addDistrictToList(child, gaodeDistrict.getId(), allTengxunDistricts); // 将当前节点的 ID 作为子节点的父节点 ID + } + } + } + + public static void printDistrictInfo(GaodeDistrict gaodeDistrict) { + // 打印相关信息 + System.out.println("ID: " + gaodeDistrict.getId() + ", 父节点ID: " + gaodeDistrict.getParentId()); + System.out.println("名称: " + gaodeDistrict.getName()); + System.out.println("编码: " + gaodeDistrict.getAdcode()); + System.out.println("级别: " + gaodeDistrict.getLevel()); + System.out.println("边界线: " + gaodeDistrict.getPolyline()); + System.out.println("中心点: " + gaodeDistrict.getCenter()); + System.out.println("子节点数量: " + gaodeDistrict.getDistricts().size()); + + System.out.println("--------------------------"); + } + +} diff --git a/src/main/java/com/mzl/flower/service/impl/map/MapTengxunServiceImpl.java b/src/main/java/com/mzl/flower/service/impl/map/MapTengxunServiceImpl.java new file mode 100644 index 0000000..51722a5 --- /dev/null +++ b/src/main/java/com/mzl/flower/service/impl/map/MapTengxunServiceImpl.java @@ -0,0 +1,154 @@ +package com.mzl.flower.service.impl.map; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.http.HttpUtil; +import com.google.gson.Gson; +import com.mzl.flower.config.TengxunMapProperties; +import com.mzl.flower.dto.map.gaode.GaodeDistrict; +import com.mzl.flower.dto.map.tengxun.TengxunDistrict; +import com.mzl.flower.dto.map.tengxun.TencentMapResponse; +import com.mzl.flower.entity.district.DistrictDO; +import com.mzl.flower.entity.district.DistrictTengxunDO; +import com.mzl.flower.service.BaseService; +import com.mzl.flower.service.district.DistrictTengxunService; +import com.mzl.flower.service.map.MapTengxunService; +import com.mzl.flower.utils.ConverterUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +@Slf4j +@Service +public class MapTengxunServiceImpl extends BaseService implements MapTengxunService { + + @Autowired + private TengxunMapProperties tengxunMapProperties; + + @Autowired + private DistrictTengxunService districtTengxunService; + + @Override + public void getAdministrativeDivision() { + // TODO: 获取行政区域数据 + String administrativeDivisionsUrl = tengxunMapProperties.getAdministrativeDivisionsUrl(); + System.out.println(administrativeDivisionsUrl); + //可以单独传入http参数,这样参数会自动做URL编码,拼接在URL中 + HashMap<String, Object> paramMap = new HashMap<>(); + + String result= HttpUtil.get(administrativeDivisionsUrl, paramMap); + System.out.println(result); + // 使用 Gson 解析 JSON 字符串 + Gson gson = new Gson(); + TencentMapResponse response = gson.fromJson(result, TencentMapResponse.class); + + if(response.getStatus()==0){ + + + List<TengxunDistrict> allDistricts = response.getResult(); + // 将腾讯地图返回的数据格式转换成标准的三层结构 + List<TengxunDistrict> formatterDistrict =normalizeTreeToThreeLevels(allDistricts); + + List<TengxunDistrict> allTengxunDistricts = new ArrayList<>(); + // 递归遍历所有的节点,然后把所有节点加入到 allDistricts 列表中 + for (TengxunDistrict tengxunDistrict : formatterDistrict){ + addDistrictToList(tengxunDistrict, null, allTengxunDistricts); // 从根节点开始,父节点 ID 为 null + } + List<DistrictTengxunDO> districtTengxunDOList= ConverterUtil.transList(allTengxunDistricts, DistrictTengxunDO.class); + + districtTengxunService.saveRemoteDistricts(districtTengxunDOList); + + +// for (TengxunDistrict tengxunDistrict : allTengxunDistricts) { +// printDistrictInfo(tengxunDistrict); +// } + + } + + } + + public static List<TengxunDistrict> normalizeTreeToThreeLevels(List<TengxunDistrict> tree) { + List<TengxunDistrict> result = new ArrayList<>(); + for (TengxunDistrict node : tree) { + int depth = getTreeDepth(node); + if(depth<3){ + List<TengxunDistrict> childrenList=new ArrayList<>(); + childrenList.add(node); + + TengxunDistrict tengxunDistrict= new TengxunDistrict(); + BeanUtils.copyProperties(node, tengxunDistrict); + tengxunDistrict.setDistricts(childrenList); + // 虚拟的id、code + tengxunDistrict.setId(tengxunDistrict.getId()+"virtual"); + // 虚拟的层级 + tengxunDistrict.setLevel(-1); + result.add(tengxunDistrict); + continue; + }else{ + result.add(node); + } + + } + return result; + } + + /** + * 遍历树的深度 + * @param node + * @return + */ + private static int getTreeDepth(TengxunDistrict node) { + if (node == null || node.getDistricts() == null || node.getDistricts().isEmpty()) { + return 1; + } + int maxDepth = 0; + for (TengxunDistrict child : node.getDistricts()) { + maxDepth = Math.max(maxDepth, getTreeDepth(child)); + } + return maxDepth + 1; + } + + // 打印区划信息的辅助方法 + public static void printDistrictInfo(TengxunDistrict tengxunDistrict) { + System.out.println("ID: " + tengxunDistrict.getId() + ", 父节点ID: " + tengxunDistrict.getParentId()); + System.out.println("名称: " + tengxunDistrict.getName()); + System.out.println("全称: " + tengxunDistrict.getFullname()); + System.out.println("级别: " + tengxunDistrict.getLevel()); + System.out.println("拼音: " + tengxunDistrict.getPinyin()); + System.out.println("经纬度: " + tengxunDistrict.getTengxunLocation()); + System.out.println("--------------------------"); + } + + + // 递归遍历区划节点,并将它们添加到 allDistricts 列表 + public static void addDistrictToList(TengxunDistrict tengxunDistrict, String parentId, List<TengxunDistrict> allTengxunDistricts) { + // 将腾讯地图返回的id作为code存放到code中 + tengxunDistrict.setCode(tengxunDistrict.getId()); + // 如果name 是空的话,则将fullname赋值给name + if(StringUtils.isBlank(tengxunDistrict.getName())){ + tengxunDistrict.setName(tengxunDistrict.getFullname()); + } + +// tengxunDistrict.setId(IdUtil.simpleUUID()); + // 设置父节点 ID + tengxunDistrict.setParentId(parentId); + + // 将当前区划添加到结果列表 + allTengxunDistricts.add(tengxunDistrict); + + // 递归遍历子区划 + if (tengxunDistrict.getDistricts()!= null) { + for (TengxunDistrict child : tengxunDistrict.getDistricts()) { + addDistrictToList(child, tengxunDistrict.getId(), allTengxunDistricts); // 将当前节点的 ID 作为子节点的父节点 ID + } + } + } + + +} diff --git a/src/main/java/com/mzl/flower/service/map/MapGaodeService.java b/src/main/java/com/mzl/flower/service/map/MapGaodeService.java new file mode 100644 index 0000000..054451e --- /dev/null +++ b/src/main/java/com/mzl/flower/service/map/MapGaodeService.java @@ -0,0 +1,11 @@ +package com.mzl.flower.service.map; + +public interface MapGaodeService { + + /** + * 获取腾讯的行政区划 + */ + void getAdministrativeDivision(); + + +} diff --git a/src/main/java/com/mzl/flower/service/map/MapTengxunService.java b/src/main/java/com/mzl/flower/service/map/MapTengxunService.java new file mode 100644 index 0000000..d64246c --- /dev/null +++ b/src/main/java/com/mzl/flower/service/map/MapTengxunService.java @@ -0,0 +1,11 @@ +package com.mzl.flower.service.map; + +public interface MapTengxunService { + + /** + * 获取腾讯的行政区划 + */ + void getAdministrativeDivision(); + + +} diff --git a/src/main/java/com/mzl/flower/web/system/ProvinceController.java b/src/main/java/com/mzl/flower/web/system/ProvinceController.java index 1d9c307..d7aec5a 100644 --- a/src/main/java/com/mzl/flower/web/system/ProvinceController.java +++ b/src/main/java/com/mzl/flower/web/system/ProvinceController.java @@ -2,6 +2,8 @@ import com.mzl.flower.base.BaseController; import com.mzl.flower.base.R; +import com.mzl.flower.service.district.DistrictService; +import com.mzl.flower.service.district.DistrictTengxunService; import com.mzl.flower.service.system.ProvinceService; import com.mzl.flower.utils.LocalUtil; import io.swagger.annotations.Api; @@ -23,6 +25,18 @@ @Autowired private ProvinceService provinceService; + + /** + * 腾讯地图获取中国省市区数据 + */ + @Autowired + private DistrictTengxunService districtTengxunService; + + /** + * 高德地图获取中国省市区数据 + */ + @Autowired + private DistrictService districtService; @ApiOperation(value = "获取省份") @GetMapping("/provinces") @@ -58,13 +72,19 @@ @ApiOperation(value = "获取中国省市区数据") @GetMapping("/area/json") public ResponseEntity<String> getChineseArea() { - return returnData(R.SUCCESS.getCode(), provinceService.getChineseArea()); + + // 高德地图 +// return returnData(R.SUCCESS.getCode(), districtService.getChineseArea()); + return returnData(R.SUCCESS.getCode(), districtTengxunService.getChineseArea()); +// return returnData(R.SUCCESS.getCode(), provinceService.getChineseArea()); } @ApiOperation(value = "刷新中国省市区数据缓存") @GetMapping("/area/json/refresh") public ResponseEntity<String> refresh() { - provinceService.refreshChineseData(); +// provinceService.refreshChineseData(); +// districtService.clearChineseDataCache(); + districtTengxunService.clearChineseDataCache(); return returnData(R.SUCCESS.getCode(), null); } } diff --git a/src/main/java/com/mzl/flower/web/v2/district/DistrictGaodeController.java b/src/main/java/com/mzl/flower/web/v2/district/DistrictGaodeController.java new file mode 100644 index 0000000..5b348ce --- /dev/null +++ b/src/main/java/com/mzl/flower/web/v2/district/DistrictGaodeController.java @@ -0,0 +1,79 @@ +package com.mzl.flower.web.v2.district; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.mzl.flower.base.BaseController; +import com.mzl.flower.base.R; +import com.mzl.flower.base.ReturnDataDTO; + + +import com.mzl.flower.dto.request.district.CreateDistrictGaodeDTO; +import com.mzl.flower.dto.request.district.CreateDistrictTengxunDTO; +import com.mzl.flower.dto.request.district.QueryDistrictTengxunDTO; +import com.mzl.flower.dto.response.district.DistrictVO; +import com.mzl.flower.service.district.DistrictService; + +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import com.mzl.flower.entity.district.DistrictDO; + +/** + * 对接高德地图行政区划前端控制器 + * +* @author @TaoJie +* @since 2024-12-19 +*/ +@RestController +@RequestMapping("/v2/district-gaode") +public class DistrictGaodeController extends BaseController { + + @Autowired + private DistrictService districtService; + + @PostMapping("") + @ApiOperation(value = "新增", notes = "新增") + public ResponseEntity<ReturnDataDTO> create(@Validated @RequestBody CreateDistrictGaodeDTO dto) { + return returnData(R.SUCCESS.getCode(), districtService.createDistrict(dto)); + } + + @PutMapping("/{id}") + @ApiOperation(value = "修改", notes = "修改") + public ResponseEntity<ReturnDataDTO> update(@PathVariable String id,@Validated @RequestBody CreateDistrictGaodeDTO dto) { + dto.setId(id); + return returnData(R.SUCCESS.getCode(), districtService.updateDistrict(dto)); + } + + @DeleteMapping("/{id}") + @ApiOperation(value = "删除", notes = "删除") + public ResponseEntity<ReturnDataDTO> delete(@PathVariable String id) { + return returnData(R.SUCCESS.getCode(), districtService.deleteDistrict(id)); + } + + @GetMapping("/{id}") + @ApiOperation(value = "详情", notes = "详情") + public DistrictDO get(@PathVariable String id) { + return districtService.getById(id); + } + + @GetMapping("/page") + @ApiOperation(value = "查询-分页", notes = "查询-分页") + public ResponseEntity<ReturnDataDTO<Page<DistrictDO>>> page(Page page, QueryDistrictTengxunDTO dto + ) { +// return returnData(R.SUCCESS.getCode(), ConverterUtil.transPage(resultPage, CouponTemplateActivyVO.class)); + return null; + } + + @GetMapping("/list") + @ApiOperation(value = "查询-全部", notes = "查询-全部") + public ResponseEntity<ReturnDataDTO<Page<DistrictVO>>> list(QueryDistrictTengxunDTO dto) { + + return returnData(R.SUCCESS.getCode(), districtService.getDistrictTreeList()); + + } + + + +} diff --git a/src/main/java/com/mzl/flower/web/v2/district/DistrictTengxunController.java b/src/main/java/com/mzl/flower/web/v2/district/DistrictTengxunController.java new file mode 100644 index 0000000..8451dac --- /dev/null +++ b/src/main/java/com/mzl/flower/web/v2/district/DistrictTengxunController.java @@ -0,0 +1,76 @@ +package com.mzl.flower.web.v2.district; + + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.mzl.flower.base.BaseController; +import com.mzl.flower.base.R; +import com.mzl.flower.base.ReturnDataDTO; +import com.mzl.flower.dto.request.district.CreateDistrictTengxunDTO; +import com.mzl.flower.dto.request.district.QueryDistrictTengxunDTO; +import com.mzl.flower.dto.response.district.DistrictTengxunVO; +import com.mzl.flower.entity.district.DistrictDO; +import com.mzl.flower.entity.district.DistrictTengxunDO; +import com.mzl.flower.service.district.DistrictTengxunService; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 对接腾讯地图行政区划前端控制器 + * +* @author @TaoJie +* @since 2024-12-19 +*/ +@RestController +@RequestMapping("/v2/district-tengxun") +public class DistrictTengxunController extends BaseController { + + @Autowired + private DistrictTengxunService districtTengxunService; + + @PostMapping("") + @ApiOperation(value = "新增", notes = "新增") + public ResponseEntity<ReturnDataDTO> create(@Validated @RequestBody CreateDistrictTengxunDTO dto) { + return returnData(R.SUCCESS.getCode(), districtTengxunService.createDistrict(dto)); + } + + @PutMapping("/{id}") + @ApiOperation(value = "修改", notes = "修改") + public ResponseEntity<ReturnDataDTO> update(@PathVariable String id,@Validated @RequestBody CreateDistrictTengxunDTO dto) { + dto.setId(id); + return returnData(R.SUCCESS.getCode(), districtTengxunService.updateDistrict(dto)); + } + + @DeleteMapping("/{id}") + @ApiOperation(value = "删除", notes = "删除") + public ResponseEntity<ReturnDataDTO> delete(@PathVariable String id) { + return returnData(R.SUCCESS.getCode(), districtTengxunService.deleteDistrict(id)); + } + + @GetMapping("/{id}") + @ApiOperation(value = "详情", notes = "详情") + public DistrictTengxunDO get(@PathVariable String id) { + return districtTengxunService.getById(id); + } + + @GetMapping("/page") + @ApiOperation(value = "查询-分页", notes = "查询-分页") + public ResponseEntity<ReturnDataDTO<Page<DistrictDO>>> page(Page page, QueryDistrictTengxunDTO dto + ) { +// return returnData(R.SUCCESS.getCode(), ConverterUtil.transPage(resultPage, CouponTemplateActivyVO.class)); + return null; + } + + @GetMapping("/list") + @ApiOperation(value = "查询-全部", notes = "查询-全部") + public ResponseEntity<ReturnDataDTO<Page<DistrictTengxunVO>>> list(QueryDistrictTengxunDTO dto) { + + return returnData(R.SUCCESS.getCode(), districtTengxunService.getDistrictTreeList()); + + } + + + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 6ad42f0..3094aba 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -87,4 +87,15 @@ secret: 9121c703fb0c416b21a8c289dd73ae9b #secret sms: - verificationCode: SMS_301300012 #验证码通用模版 \ No newline at end of file + verificationCode: SMS_301300012 #验证码通用模版 + +map: + tengxun: +# apiKey: GSBBZ-CJA3U-NNDVH-GE65N-6FIF6-ZGBCU + apiKey: PRFBZ-INBLB-PYEU6-JCKUM-AYD7V-V7BIF + # 新政区划接口url + administrative_divisions_url : https://apis.map.qq.com/ws/district/v1/list?key=${map.tengxun.apiKey}&&struct_type=1 + gaode: + apiKey: 19b8a6e7325089d484fcee00076746fa + # 新政区划接口url + administrative_divisions_url: https://restapi.amap.com/v3/config/district?key=${map.gaode.apiKey}&subdistrict=3&subdistrict=3&extensions=base \ No newline at end of file diff --git a/src/main/resources/mapper/district/DistrictMapper.xml b/src/main/resources/mapper/district/DistrictMapper.xml new file mode 100644 index 0000000..dc74ec4 --- /dev/null +++ b/src/main/resources/mapper/district/DistrictMapper.xml @@ -0,0 +1,22 @@ +<?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.mzl.flower.mapper.district.DistrictMapper"> + + <!-- 通用查询映射结果 --> + <resultMap id="BaseResultMap" type="com.mzl.flower.entity.district.DistrictDO"> + <id column="id" property="id" /> + <result column="deleted" property="deleted" /> + <result column="create_by" property="createBy" /> + <result column="create_time" property="createTime" /> + <result column="update_by" property="updateBy" /> + <result column="update_time" property="updateTime" /> + <result column="name" property="name" /> + <result column="citycode" property="citycode" /> + <result column="adcode" property="adcode" /> + <result column="polyline" property="polyline" /> + <result column="center" property="center" /> + <result column="level" property="level" /> + <result column="parent_id" property="parentId" /> + </resultMap> + +</mapper> diff --git a/src/main/resources/mapper/district/DistrictMapperCustom.xml b/src/main/resources/mapper/district/DistrictMapperCustom.xml new file mode 100644 index 0000000..93a7269 --- /dev/null +++ b/src/main/resources/mapper/district/DistrictMapperCustom.xml @@ -0,0 +1,10 @@ +<?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.mzl.flower.mapper.district.DistrictMapperCustom"> + + <delete id="removeAllDistricts"> + delete from t_district + </delete> + + +</mapper> diff --git a/src/main/resources/mapper/district/DistrictTengxunMapper.xml b/src/main/resources/mapper/district/DistrictTengxunMapper.xml new file mode 100644 index 0000000..61467b0 --- /dev/null +++ b/src/main/resources/mapper/district/DistrictTengxunMapper.xml @@ -0,0 +1,20 @@ +<?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.mzl.flower.mapper.district.DistrictTengxunMapper"> + + <!-- 通用查询映射结果 --> + <resultMap id="BaseResultMap" type="com.mzl.flower.entity.district.DistrictTengxunDO"> + <id column="id" property="id" /> + <result column="deleted" property="deleted" /> + <result column="create_by" property="createBy" /> + <result column="create_time" property="createTime" /> + <result column="update_by" property="updateBy" /> + <result column="update_time" property="updateTime" /> + <result column="name" property="name" /> + <result column="fullname" property="fullname" /> + <result column="code" property="code" /> + <result column="level" property="level" /> + <result column="parent_id" property="parentId" /> + </resultMap> + +</mapper> diff --git a/src/main/resources/mapper/district/DistrictTengxunMapperCustom.xml b/src/main/resources/mapper/district/DistrictTengxunMapperCustom.xml new file mode 100644 index 0000000..a52e60d --- /dev/null +++ b/src/main/resources/mapper/district/DistrictTengxunMapperCustom.xml @@ -0,0 +1,10 @@ +<?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.mzl.flower.mapper.district.DistrictTengxunMapperCustom"> + + <delete id="removeAllDistricts"> + delete from t_district_tengxun + </delete> + + +</mapper> -- Gitblit v1.9.3