Browse Source

【证件类型】护照-完成正则工具类,并且修改居民导入逻辑为正则工具类

dev
wangxianzhang 3 years ago
parent
commit
e5a08afb8c
  1. 123
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/IdCardRegexUtils.java
  2. 101
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java

123
epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/utils/IdCardRegexUtils.java

@ -0,0 +1,123 @@
package com.epmet.commons.tools.utils;
import com.epmet.commons.tools.enums.IdCardTypeEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 唯一整件正则工具
*/
public class IdCardRegexUtils {
/**
* 15位身份证号的正则表达式
*/
private static final Pattern PATTERN_15_ID = Pattern.compile("^\\d{6}(?<year>\\d{2})(?<month>0[1-9]|1[0-2])(?<day>[0-2][0-9]|3[0-1])\\d{2}(?<sex>\\d)$");
/**
* 18位身份证号的正则表达式
*/
private static final Pattern PATTERN_18_ID = Pattern.compile("^\\d{6}(?<year>\\d{4})(?<month>0[1-9]|1[0-2])(?<day>[0-2][0-9]|3[0-1])\\d{2}(?<sex>\\d)[0-9a-xA-X]$");
/**
* 9位护照
*/
private static final Pattern PATTERN_9_PASSPORT = Pattern.compile("^\\w{2}\\d{7}$|^\\w{1}\\d{8}$");
private String inputText;
private Matcher matcher;
private IdCardTypeEnum idCardType;
private IdCardRegexUtils(IdCardTypeEnum idCardType, Matcher matcher, String inputText) {
this.idCardType = idCardType;
this.matcher = matcher;
this.inputText = inputText;
}
/**
* 正则解析结果
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class ParsedContent {
private String birthdayYear;
private String birthdayMonth;
private String birthdayDay;
private String sex;
}
/**
* 解析正则
* @param input
* @return
*/
public static IdCardRegexUtils parse(String input) {
if (input == null) {
return null;
}
if (input.length() == 15) {
Matcher matcher = PATTERN_15_ID.matcher(input);
if (matcher.matches()) {
return new IdCardRegexUtils(IdCardTypeEnum.SFZH, matcher, input);
}
}
if (input.length() == 18) {
Matcher matcher = PATTERN_18_ID.matcher(input);
if (matcher.matches()) {
return new IdCardRegexUtils(IdCardTypeEnum.SFZH, matcher, input);
}
}
if (input.length() == 9) {
Matcher matcher = PATTERN_9_PASSPORT.matcher(input);
if (matcher.matches()) {
return new IdCardRegexUtils(IdCardTypeEnum.PASSPORT, matcher, input);
}
}
return null;
}
/**
* 获取解析结果
* @return
*/
public ParsedContent getParsedResult() {
if (matcher == null || idCardType == null) {
return null;
}
if (IdCardTypeEnum.SFZH == idCardType) {
//是身份证号,可以解析
String year;
if (inputText.length() == 15) {
// 15位身份证号,years前需要拼上19
year = "19".concat(matcher.group("year"));
} else {
year = matcher.group("year");
}
String month = matcher.group("month");
String day = matcher.group("day");
String sex = matcher.group("sex");
return new ParsedContent(year, month, day, sex);
}
// 其他类型暂时不可解析
return null;
}
/**
* 获取类型枚举
* @return
*/
public IdCardTypeEnum getTypeEnum() {
return idCardType;
}
}

101
epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcResiUserImportServiceImpl.java

@ -90,20 +90,6 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
public static final List<String> controlGroup1 = Arrays.asList("input", "textarea", "datepicker", "daterange");
public static final List<String> controlGroup2 = Arrays.asList("select", "radio", "cascader");
/**
* 15位身份证号的正则表达式
*/
private final Pattern PATTERN_15_ID = Pattern.compile("^\\d{6}(?<year>\\d{2})(?<month>0[1-9]|1[0-2])(?<day>[0-2][0-9]|3[0-1])\\d{2}(?<sex>\\d)$");
/**
* 18位身份证号的正则表达式
*/
private final Pattern PATTERN_18_ID = Pattern.compile("^\\d{6}(?<year>\\d{4})(?<month>0[1-9]|1[0-2])(?<day>[0-2][0-9]|3[0-1])\\d{2}(?<sex>\\d)[0-9a-xA-X]$");
/**
* 9位护照
*/
private final Pattern PATTERN_9_PASSPORT = Pattern.compile("^\\w{2}\\d{7}|\\w{1}\\d{8}$");
/**
* 日期解析不含时间
*/
@ -646,48 +632,61 @@ public class IcResiUserImportServiceImpl implements IcResiUserImportService, Res
// ================== 数据补充 ===================
String year = null, month = null, day = null, sex = null;
// 证件类型,默认是1身份证号
String idCardType = IdCardTypeEnum.SFZH.getType();
if (idCard.length() == 15) {
// 身份证
Matcher matcher = PATTERN_15_ID.matcher(idCard);
if (matcher.matches()) {
year = "19".concat(matcher.group("year"));
month = matcher.group("month");
day = matcher.group("day");
sex = matcher.group("sex");
} else {
String s = "证件号解析错误";
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), s, s);
}
} else if (idCard.length() == 18) {
// 身份证
Matcher matcher = PATTERN_18_ID.matcher(idCard);
if (matcher.matches()) {
year = matcher.group("year");
month = matcher.group("month");
day = matcher.group("day");
sex = matcher.group("sex");
} else {
String s = "证件号解析错误";
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), s, s);
}
} else if (idCard.length() == 9) {
// 护照
Matcher matcher = PATTERN_9_PASSPORT.matcher(idCard);
if (matcher.matches()) {
idCardType = IdCardTypeEnum.PASSPORT.getType();
}
} else {
String s = "证件号解析错误";
//if (idCard.length() == 15) {
// // 身份证
// Matcher matcher = PATTERN_15_ID.matcher(idCard);
// if (matcher.matches()) {
// year = "19".concat(matcher.group("year"));
// month = matcher.group("month");
// day = matcher.group("day");
// sex = matcher.group("sex");
// } else {
// String s = "证件号解析错误";
// throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), s, s);
// }
//} else if (idCard.length() == 18) {
// // 身份证
// Matcher matcher = PATTERN_18_ID.matcher(idCard);
// if (matcher.matches()) {
// year = matcher.group("year");
// month = matcher.group("month");
// day = matcher.group("day");
// sex = matcher.group("sex");
// } else {
// String s = "证件号解析错误";
// throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), s, s);
// }
//} else if (idCard.length() == 9) {
// // 护照
// Matcher matcher = PATTERN_9_PASSPORT.matcher(idCard);
// if (matcher.matches()) {
// idCardType = IdCardTypeEnum.PASSPORT.getType();
// }
//} else {
// String s = "证件号解析错误";
// throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), s, s);
//}
IdCardRegexUtils regexUtilInstance = IdCardRegexUtils.parse(idCard);
IdCardTypeEnum idCardType = regexUtilInstance.getTypeEnum();
if (idCardType == null || IdCardTypeEnum.OTHERS == idCardType) {
String s = "证件号解析错误,或不支持的证件类型。(请使用身份证号或者护照号)";
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), s, s);
}
IdCardRegexUtils.ParsedContent parsedResult = regexUtilInstance.getParsedResult();
if (parsedResult != null) {
year = parsedResult.getBirthdayYear();
month = parsedResult.getBirthdayMonth();
day = parsedResult.getBirthdayDay();
sex = parsedResult.getSex();
}
// 存储证件类型
columnAndValues.put("ID_CARD_TYPE", idCardType);
columnAndValues.put("ID_CARD_TYPE", idCardType.getType());
if (idCardType.equals(IdCardTypeEnum.SFZH.getType())) {
if (idCardType == IdCardTypeEnum.SFZH) {
//只有证件类型是身份证号才做相关解析
// 出生日期 & 年龄
LocalDate birthday = null;

Loading…
Cancel
Save