fxkh-txl-service/src/main/java/com/whdc/utils/AdinfoUtils.java

247 lines
6.4 KiB
Java
Raw Normal View History

2024-05-16 09:40:25 +08:00
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;
}
}