package com.whdc.utils; import com.whdc.exception.MyException; 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 MyException("不支持该行政区划等级"); } } /** * 根据行政区划等级获取模糊查询的行政区划代码 * * @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 MyException("不支持该行政区划等级"); } } /** * 根据行政区划等级获取模糊查询的行政区划代码 * * @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 MyException("不支持该行政区划等级"); } } /** * 根据行政区划等级获取和行政区划代码 * * @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 MyException 如果行政区划代码子串不匹配给定的等级,则抛出异常 */ private static void validateAdcd(String adcd, Integer adlevel, int startIndex) throws MyException { if (StringUtils.isBlank(adcd) || adcd.length() < startIndex) { throw new MyException("行政区划编码错误 " + adcd); } // String subAdcd = adcd.substring(startIndex); int adlevelBySubAdcd = getAdlevelBySubAdcd(adcd,startIndex); if (adlevel != adlevelBySubAdcd || adlevel+1 != adlevelBySubAdcd || adlevel-1 != adlevelBySubAdcd) { throw new MyException("行政区划编码和行政区划等级不匹配"); } } /** * 根据行政区划代码获取行政区划等级 * * @param adcd 行政区划代码 * @return */ public static int getAdlevel(String adcd) { if (StringUtils.isBlank(adcd) || adcd.length() != 15) { throw new MyException("行政区划编码错误 " + 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; } }