From b73970108cd04c56f079a17720f130f50103121e Mon Sep 17 00:00:00 2001 From: Xusan <1105644308@QQ.COM> Date: Thu, 16 May 2024 09:40:25 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=9A=E8=AE=AF=E5=BD=95=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/whdc/model/dto/AddressBootDto.java | 3 + .../service/impl/AddressBookServiceImpl.java | 12 +- src/main/java/com/whdc/utils/AdinfoUtils.java | 246 ++++++++++++++++++ .../resources/mapper/AddressBookMapper.xml | 2 +- 4 files changed, 261 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/whdc/utils/AdinfoUtils.java 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}, '%')