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. 99
      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;
}
}

99
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> controlGroup1 = Arrays.asList("input", "textarea", "datepicker", "daterange");
public static final List<String> controlGroup2 = Arrays.asList("select", "radio", "cascader"); 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; String year = null, month = null, day = null, sex = null;
// 证件类型,默认是1身份证号 //if (idCard.length() == 15) {
String idCardType = IdCardTypeEnum.SFZH.getType(); // // 身份证
// Matcher matcher = PATTERN_15_ID.matcher(idCard);
if (idCard.length() == 15) { // if (matcher.matches()) {
// 身份证 // year = "19".concat(matcher.group("year"));
Matcher matcher = PATTERN_15_ID.matcher(idCard); // month = matcher.group("month");
if (matcher.matches()) { // day = matcher.group("day");
year = "19".concat(matcher.group("year")); // sex = matcher.group("sex");
month = matcher.group("month"); // } else {
day = matcher.group("day"); // String s = "证件号解析错误";
sex = matcher.group("sex"); // throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), s, s);
} else { // }
String s = "证件号解析错误"; //} else if (idCard.length() == 18) {
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), s, s); // // 身份证
} // Matcher matcher = PATTERN_18_ID.matcher(idCard);
} else if (idCard.length() == 18) { // if (matcher.matches()) {
// 身份证 // year = matcher.group("year");
Matcher matcher = PATTERN_18_ID.matcher(idCard); // month = matcher.group("month");
if (matcher.matches()) { // day = matcher.group("day");
year = matcher.group("year"); // sex = matcher.group("sex");
month = matcher.group("month"); // } else {
day = matcher.group("day"); // String s = "证件号解析错误";
sex = matcher.group("sex"); // throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), s, s);
} else { // }
String 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); throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), s, s);
} }
} else if (idCard.length() == 9) {
// 护照 IdCardRegexUtils.ParsedContent parsedResult = regexUtilInstance.getParsedResult();
Matcher matcher = PATTERN_9_PASSPORT.matcher(idCard); if (parsedResult != null) {
if (matcher.matches()) { year = parsedResult.getBirthdayYear();
idCardType = IdCardTypeEnum.PASSPORT.getType(); month = parsedResult.getBirthdayMonth();
} day = parsedResult.getBirthdayDay();
} else { sex = parsedResult.getSex();
String s = "证件号解析错误";
throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), s, s);
} }
// 存储证件类型 // 存储证件类型
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; LocalDate birthday = null;

Loading…
Cancel
Save