diff --git a/src/main/java/com/whdc/model/dto/AddressBootDto.java b/src/main/java/com/whdc/model/dto/AddressBootDto.java
index 9219599..8049c0d 100644
--- a/src/main/java/com/whdc/model/dto/AddressBootDto.java
+++ b/src/main/java/com/whdc/model/dto/AddressBootDto.java
@@ -19,6 +19,9 @@ public class AddressBootDto extends CommDto{
@ApiModelProperty(value = "行政区划")
private String adcd;
+ @ApiModelProperty(value = "行政区划级别 0省,1市,2县,3镇,4村,5组 ,(点击树查询下级, 点击查询按钮查询本级)", example = "0")
+ private Integer adlevel;
+
@ApiModelProperty(value = "登录用户id")
private String userId;
}
diff --git a/src/main/java/com/whdc/service/impl/AddressBookServiceImpl.java b/src/main/java/com/whdc/service/impl/AddressBookServiceImpl.java
index 5b26ad4..ff9bbbd 100644
--- a/src/main/java/com/whdc/service/impl/AddressBookServiceImpl.java
+++ b/src/main/java/com/whdc/service/impl/AddressBookServiceImpl.java
@@ -12,6 +12,9 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.List;
+import java.util.Objects;
+
+import static com.whdc.utils.AdinfoUtils.likeAdcd;
/**
*
@@ -28,8 +31,15 @@ public class AddressBookServiceImpl extends ServiceImpl page(AddressBootDto dto) {
String adcd = dto.getAdcd();
- if (StringUtils.isNotBlank(adcd)) {
+ Integer adlevel = dto.getAdlevel();
+ if (StringUtils.isNotBlank(dto.getAdcd()) && Objects.nonNull(adlevel)) {
+ dto.setAdcd( "LIKE " + likeAdcd(dto.getAdcd(), adlevel) + "%");
+
+ } else {
+ if (StringUtils.isNotBlank(dto.getAdcd())) {
+ dto.setAdcd( "= " + dto.getAdcd());
+ }
}
return baseMapper.page(dto.getPage(), dto);
diff --git a/src/main/java/com/whdc/utils/AdinfoUtils.java b/src/main/java/com/whdc/utils/AdinfoUtils.java
new file mode 100644
index 0000000..058e399
--- /dev/null
+++ b/src/main/java/com/whdc/utils/AdinfoUtils.java
@@ -0,0 +1,246 @@
+package com.whdc.utils;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Objects;
+
+
+/**
+ * Description:
+ * Created by XuSan on 2024/3/14.
+ *
+ * @author XuSan
+ * @version 1.0
+ */
+public class AdinfoUtils {
+
+ /**
+ * 根据行政区划等级获取模糊查询的行政区划代码
+ *
+ * @param adcd
+ * @param adlevel
+ * @return
+ */
+ public static String likeAdcd(String adcd, Integer adlevel) {
+
+// // 判断行政区划和行政区划等级是否匹配
+// validateAdcdAndAdlevel(adcd, adlevel);
+
+
+
+ if (adlevel > 5) {
+ adlevel = 5;
+ }
+
+ switch (adlevel) {
+ case 0:
+ if (adcd.length() < 2){
+ return adcd;
+ }
+ return adcd.substring(0, 2);
+ case 1:
+ if (adcd.length() < 4){
+ return adcd;
+ }
+ return adcd.substring(0, 4);
+ case 2:
+ if (adcd.length() < 6){
+ return adcd;
+ }
+ return adcd.substring(0, 6);
+ case 3:
+ if (adcd.length() < 9){
+ return adcd;
+ }
+ return adcd.substring(0, 9);
+ case 4:
+ if (adcd.length() < 12){
+ return adcd;
+ }
+ return adcd.substring(0, 12);
+ case 5:
+ return adcd;
+ default:
+ throw new RuntimeException("不支持该行政区划等级");
+ }
+ }
+
+ /**
+ * 根据行政区划等级获取模糊查询的行政区划代码
+ *
+ * @param adcd
+ * @param adlevel
+ * @return
+ */
+ public static String getParentAdcd(String adcd, Integer adlevel) {
+
+ if (Objects.isNull(adlevel)){
+ adlevel = getAdlevel(adcd);
+ }
+
+ if (adlevel > 5) {
+ adlevel = 5;
+ }
+
+ switch (adlevel) {
+ case 0:
+ return adcd.substring(0, 2) + "0000000000000";
+ case 1:
+ return adcd.substring(0, 4) + "00000000000";
+ case 2:
+ return adcd.substring(0, 6) + "000000000";
+ case 3:
+ return adcd.substring(0, 9) + "000000";
+ case 4:
+ return adcd.substring(0, 12) + "000";
+ case 5:
+ return adcd;
+ default:
+ throw new RuntimeException("不支持该行政区划等级");
+ }
+ }
+
+ /**
+ * 根据行政区划等级获取模糊查询的行政区划代码
+ *
+ * @param adlevel
+ * @return
+ */
+ public static String getAdcdRight( Integer adlevel) {
+
+
+
+ if (adlevel > 5) {
+ adlevel = 5;
+ }
+
+ switch (adlevel) {
+ case 0:
+ return "0000000000000";
+ case 1:
+ return "00000000000";
+ case 2:
+ return "000000000";
+ case 3:
+ return "000000";
+ case 4:
+ return "000";
+ case 5:
+ return "";
+ default:
+ throw new RuntimeException("不支持该行政区划等级");
+ }
+ }
+
+ /**
+ * 根据行政区划等级获取和行政区划代码
+ *
+ * @param adcd
+ * @param adlevel
+ * @return
+ */
+ public static void validateAdcdAndAdlevel(String adcd, Integer adlevel) {
+
+ // 避免重复代码,提取为私有方法
+ validateAdcd(adcd, adlevel, 2);
+ validateAdcd(adcd, adlevel, 4);
+ validateAdcd(adcd, adlevel, 6);
+ validateAdcd(adcd, adlevel, 9);
+ validateAdcd(adcd, adlevel, 12);
+
+ }
+
+ /**
+ * 验证行政区划代码的子串是否与给定的等级匹配
+ *
+ * @param adcd 行政区划代码
+ * @param adlevel 参数行政区划等级
+ * @param startIndex 子串的开始索引
+ * @throws RuntimeException 如果行政区划代码子串不匹配给定的等级,则抛出异常
+ */
+ private static void validateAdcd(String adcd, Integer adlevel, int startIndex) throws RuntimeException {
+
+ if (StringUtils.isBlank(adcd) || adcd.length() < startIndex) {
+ throw new RuntimeException("行政区划编码错误 " + adcd);
+ }
+
+// String subAdcd = adcd.substring(startIndex);
+
+ int adlevelBySubAdcd = getAdlevelBySubAdcd(adcd,startIndex);
+
+ if (adlevel != adlevelBySubAdcd || adlevel+1 != adlevelBySubAdcd || adlevel-1 != adlevelBySubAdcd) {
+ throw new RuntimeException("行政区划编码和行政区划等级不匹配");
+ }
+ }
+
+ /**
+ * 根据行政区划代码获取行政区划等级
+ *
+ * @param adcd 行政区划代码
+ * @return
+ */
+ public static int getAdlevel(String adcd) {
+
+ if (StringUtils.isBlank(adcd) || adcd.length() != 15) {
+ throw new RuntimeException("行政区划编码错误 " + adcd);
+ }
+
+ // 避免重复代码,提取为私有方法
+ int subAdcd = getAdlevelBySubAdcd(adcd, 2);
+ if (5 != subAdcd) {
+ return subAdcd;
+ }
+ subAdcd = getAdlevelBySubAdcd(adcd, 4);
+ if (5 != subAdcd) {
+ return subAdcd;
+ }
+ subAdcd = getAdlevelBySubAdcd(adcd, 6);
+ if (5 != subAdcd) {
+ return subAdcd;
+ }
+ subAdcd = getAdlevelBySubAdcd(adcd, 9);
+ if (5 != subAdcd) {
+ return subAdcd;
+ }
+ subAdcd = getAdlevelBySubAdcd(adcd, 12);
+ return subAdcd;
+ }
+
+
+ /**
+ * 根据行政区划代码子串获取行政区划等级
+ *
+ * @param adcd
+ * @return
+ */
+ public static int getAdlevelBySubAdcd(String adcd, int startIndex) {
+
+ String subAdcd = adcd.substring(startIndex);
+
+ // 根据行政区划分析出的行政区划等级
+ int expectedLevel = 0;
+
+ switch (subAdcd) {
+ case "0000000000000": // 省
+ break;
+ case "00000000000": // 市
+ expectedLevel = 1;
+ break;
+ case "000000000": // 县
+ expectedLevel = 2;
+ break;
+ case "000000": // 镇
+ expectedLevel = 3;
+ break;
+ case "000": // 村
+ expectedLevel = 4;
+ break;
+ default:
+ // 村
+ expectedLevel = 5;
+ }
+
+ return expectedLevel;
+ }
+
+}
diff --git a/src/main/resources/mapper/AddressBookMapper.xml b/src/main/resources/mapper/AddressBookMapper.xml
index b03bef2..6c29a1a 100644
--- a/src/main/resources/mapper/AddressBookMapper.xml
+++ b/src/main/resources/mapper/AddressBookMapper.xml
@@ -21,7 +21,7 @@
AND AB.NAME LIKE CONCAT('%', #{dto.name}, '%')
- AND AB.ADCD LIKE CONCAT('', #{dto.adcd}, '%')
+ AND AB.ADCD #{dto.adcd}
AND AB.PHONE LIKE CONCAT('', #{dto.phone}, '%')