From 2f2376ca4edb5326b546af7c9b3c69eae3db0261 Mon Sep 17 00:00:00 2001 From: TS-QD1 Date: Fri, 10 Mar 2023 16:00:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=BA=AB=E4=BB=BD=E8=AF=81?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E6=A0=A1=E9=AA=8C=E6=96=B9=E6=B3=95=EF=BC=8C?= =?UTF-8?q?=E5=8E=9F=E5=BA=9F=E5=BC=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/start.jar | Bin 0 -> 46294 bytes .../service/apply/impl/ApplyServiceImpl.java | 2 +- .../impl/ApplyStudentsServiceImpl.java | 2 +- .../ImportExamScoreListener.java | 2 +- .../cn/com/tenlion/util/IdCardVerifyUtil.java | 424 +++++++++++++++++- .../java/cn/com/tenlion/util/SignUpUtil.java | 4 +- 6 files changed, 428 insertions(+), 6 deletions(-) create mode 100644 libs/start.jar diff --git a/libs/start.jar b/libs/start.jar new file mode 100644 index 0000000000000000000000000000000000000000..3e473694b5908de8dc55cbb2c14f9d3dda137872 GIT binary patch literal 46294 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 literal 0 HcmV?d00001 diff --git a/src/main/java/cn/com/tenlion/service/apply/impl/ApplyServiceImpl.java b/src/main/java/cn/com/tenlion/service/apply/impl/ApplyServiceImpl.java index b37e367..f562d10 100644 --- a/src/main/java/cn/com/tenlion/service/apply/impl/ApplyServiceImpl.java +++ b/src/main/java/cn/com/tenlion/service/apply/impl/ApplyServiceImpl.java @@ -688,7 +688,7 @@ public class ApplyServiceImpl extends DefaultBaseService implements IApplyServic item.setApplyParentWorkTypeId(workTypeDTO.getWorkTypeParentId()); item.setApplyParentWorkTypeName(workTypeDTO.getWorkTypeParentName()); item.setMaxAge(SignUpUtil.getMaxAge(item.getApplyLeiBie(), item.getApplyCardNumber())); - if (IdCardVerifyUtil.isIDCard(item.getApplyCardNumber())) { + if (IdCardVerifyUtil.isValidatedAllIdcard(item.getApplyCardNumber())) { item.setAge(IdCardVerifyUtil.getIdCardAge(item.getApplyCardNumber())); } else { item.setAge(-1); diff --git a/src/main/java/cn/com/tenlion/service/applystudents/impl/ApplyStudentsServiceImpl.java b/src/main/java/cn/com/tenlion/service/applystudents/impl/ApplyStudentsServiceImpl.java index 1ba1bc3..0d43f63 100644 --- a/src/main/java/cn/com/tenlion/service/applystudents/impl/ApplyStudentsServiceImpl.java +++ b/src/main/java/cn/com/tenlion/service/applystudents/impl/ApplyStudentsServiceImpl.java @@ -274,7 +274,7 @@ public class ApplyStudentsServiceImpl extends DefaultBaseService implements IApp while (applyStudentsDTOIterator.hasNext()) { ApplyStudentsDTO applyStudentsDTO = applyStudentsDTOIterator.next(); applyStudentsDTO.setMaxAge(SignUpUtil.getMaxAge(applyStudentsDTO.getApplyLeiBie(), applyStudentsDTO.getApplyCardNumber())); - if (IdCardVerifyUtil.isIDCard(applyStudentsDTO.getApplyCardNumber())) { + if (IdCardVerifyUtil.isValidatedAllIdcard(applyStudentsDTO.getApplyCardNumber())) { applyStudentsDTO.setAge(IdCardVerifyUtil.getIdCardAge(applyStudentsDTO.getApplyCardNumber())); } else { applyStudentsDTO.setAge(-1); diff --git a/src/main/java/cn/com/tenlion/uploadlistener/ImportExamScoreListener.java b/src/main/java/cn/com/tenlion/uploadlistener/ImportExamScoreListener.java index 1d34349..ee94fcf 100644 --- a/src/main/java/cn/com/tenlion/uploadlistener/ImportExamScoreListener.java +++ b/src/main/java/cn/com/tenlion/uploadlistener/ImportExamScoreListener.java @@ -32,7 +32,7 @@ public class ImportExamScoreListener extends AnalysisEventListener data, AnalysisContext context) { try { Map params = new HashMap<>(8); - if(data.size() >= 5 && IdCardVerifyUtil.isIDCard(data.get(4) + "")){ + if(data.size() >= 5 && IdCardVerifyUtil.isValidatedAllIdcard(data.get(4) + "")){ params.put("classPlanId",classPlanId); params.put("applyCardNumber",data.get(4) + ""); int examScore = 0; diff --git a/src/main/java/cn/com/tenlion/util/IdCardVerifyUtil.java b/src/main/java/cn/com/tenlion/util/IdCardVerifyUtil.java index bd8b0a3..eee573c 100644 --- a/src/main/java/cn/com/tenlion/util/IdCardVerifyUtil.java +++ b/src/main/java/cn/com/tenlion/util/IdCardVerifyUtil.java @@ -70,11 +70,12 @@ public class IdCardVerifyUtil { } /** - * 身份证验证 + * 身份证验证,废弃,此方法有遗漏 * * @param certNo 号码内容 * @return 是否有效 null和"" 都是false */ + @Deprecated public static boolean isIDCard(String certNo) { if (certNo == null || (certNo.length() != 15 && certNo.length() != 18)) { return false; @@ -131,6 +132,427 @@ public class IdCardVerifyUtil { return cs[cs.length - 1] == PARITYBIT[power % 11]; } + /** + * 省、直辖市代码表: + * 11 : 北京 12 : 天津 13 : 河北 14 : 山西 15 : 内蒙古 + * 21 : 辽宁 22 : 吉林 23 : 黑龙江 31 : 上海 32 : 江苏 + * 33 : 浙江 34 : 安徽 35 : 福建 36 : 江西 37 : 山东 + * 41 : 河南 42 : 湖北 43 : 湖南 44 : 广东 45 : 广西 46 : 海南 + * 50 : 重庆 51 : 四川 52 : 贵州 53 : 云南 54 : 西藏 + * 61 : 陕西 62 : 甘肃 63 : 青海 64 : 宁夏 65 : 新疆 + * 71 : 台湾 + * 81 : 香港 82 : 澳门 + * 91 : 国外 + */ + private static String[] cityCode = {"11", "12", "13", "14", "15", "21", + "22", "23", "31", "32", "33", "34", "35", "36", "37", "41", "42", + "43", "44", "45", "46", "50", "51", "52", "53", "54", "61", "62", + "63", "64", "65", "71", "81", "82", "91"}; + + /** + * 每位加权因子 + */ + private static int power[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, + 8, 4, 2}; + + /** + * 验证所有的身份证的合法性 + * + * @param idcard 身份证 + * @return 合法返回true,否则返回false + */ + public static boolean isValidatedAllIdcard(String idcard) { + if (idcard == null || "".equals(idcard)) { + return false; + } + int s = 15; + if (idcard.length() == s) { + return validate15IDCard(idcard); + } + int s1 = 18; + if (idcard.length() == s1) { + return validate18Idcard(idcard); + } + return false; + + } + + /** + * 判断18位身份证的合法性 + * 根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。 + * 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。 + *

+ * 顺序码: 表示在同一地址码所标识的区域范围内,对同年、同月、同 日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配 给女性。 + *

+ *

+ * 1.前1、2位数字表示:所在省份的代码; 2.第3、4位数字表示:所在城市的代码; 3.第5、6位数字表示:所在区县的代码; + * 4.第7~14位数字表示:出生年、月、日; 5.第15、16位数字表示:所在地的派出所的代码; + * 6.第17位数字表示性别:奇数表示男性,偶数表示女性; + * 7.第18位数字是校检码:也有的说是个人信息码,一般是随计算机的随机产生,用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示。 + *

+ *

+ * 第十八位数字(校验码)的计算方法为: 1.将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 + * 2 1 6 3 7 9 10 5 8 4 2 + *

+ *

+ * 2.将这17位数字和系数相乘的结果相加。 + *

+ *

+ * 3.用加出来和除以11,看余数是多少 + *

+ * 4.余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 + * 2。 + *

+ * 5.通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。 + * + * @param idcard + * @return + */ + public static boolean validate18Idcard(String idcard) { + if (idcard == null) { + return false; + } + + // 非18位为假 + int s = 18; + if (idcard.length() != s) { + return false; + } + // 获取前17位 + String idcard17 = idcard.substring(0, 17); + + // 前17位全部为数字 + if (!isDigital(idcard17)) { + return false; + } + + String provinceid = idcard.substring(0, 2); + // 校验省份 + if (!checkProvinceid(provinceid)) { + return false; + } + + // 校验出生日期 + String birthday = idcard.substring(6, 14); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + + try { + Date birthDate = sdf.parse(birthday); + String tmpDate = sdf.format(birthDate); + // 出生年月日不正确 + if (!tmpDate.equals(birthday)) { + return false; + } + + } catch (ParseException e1) { + + return false; + } + + // 获取第18位 + String idcard18Code = idcard.substring(17, 18); + + char c[] = idcard17.toCharArray(); + + int bit[] = converCharToInt(c); + + int sum17 = 0; + + sum17 = getPowerSum(bit); + + // 将和值与11取模得到余数进行校验码判断 + String checkCode = getCheckCodeBySum(sum17); + if (null == checkCode) { + return false; + } + // 将身份证的第18位与算出来的校码进行匹配,不相等就为假 + if (!idcard18Code.equalsIgnoreCase(checkCode)) { + return false; + } + //System.out.println("正确"); + return true; + } + + /** + * 校验15位身份证 + *

+ * 只校验省份和出生年月日 + * + * @param idcard + * @return + */ + public static boolean validate15IDCard(String idcard) { + if (idcard == null) { + return false; + } + // 非15位为假 + int s = 15; + if (idcard.length() != s) { + return false; + } + + // 15全部为数字 + if (!isDigital(idcard)) { + return false; + } + + String provinceid = idcard.substring(0, 2); + // 校验省份 + if (!checkProvinceid(provinceid)) { + return false; + } + + String birthday = idcard.substring(6, 12); + + SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd"); + + try { + Date birthDate = sdf.parse(birthday); + String tmpDate = sdf.format(birthDate); + // 身份证日期错误 + if (!tmpDate.equals(birthday)) { + return false; + } + + } catch (ParseException e1) { + + return false; + } + + return true; + } + + /** + * 将15位的身份证转成18位身份证 + * + * @param idcard + * @return + */ + public static String convertIdcarBy15bit(String idcard) { + if (idcard == null) { + return null; + } + + // 非15位身份证 + int s = 15; + if (idcard.length() != s) { + return null; + } + + // 15全部为数字 + if (!isDigital(idcard)) { + return null; + } + + String provinceid = idcard.substring(0, 2); + // 校验省份 + if (!checkProvinceid(provinceid)) { + return null; + } + + String birthday = idcard.substring(6, 12); + + SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd"); + + Date birthdate = null; + try { + birthdate = sdf.parse(birthday); + String tmpDate = sdf.format(birthdate); + // 身份证日期错误 + if (!tmpDate.equals(birthday)) { + return null; + } + + } catch (ParseException e1) { + return null; + } + + Calendar cday = Calendar.getInstance(); + cday.setTime(birthdate); + String year = String.valueOf(cday.get(Calendar.YEAR)); + + String idcard17 = idcard.substring(0, 6) + year + idcard.substring(8); + + char c[] = idcard17.toCharArray(); + String checkCode = ""; + + // 将字符数组转为整型数组 + int bit[] = converCharToInt(c); + + int sum17 = 0; + sum17 = getPowerSum(bit); + + // 获取和值与11取模得到余数进行校验码 + checkCode = getCheckCodeBySum(sum17); + + // 获取不到校验位 + if (null == checkCode) { + return null; + } + // 将前17位与第18位校验码拼接 + idcard17 += checkCode; + return idcard17; + } + + /** + * 校验省份 + * + * @param provinceid + * @return 合法返回TRUE,否则返回FALSE + */ + private static boolean checkProvinceid(String provinceid) { + for (String id : cityCode) { + if (id.equals(provinceid)) { + return true; + } + } + return false; + } + + /** + * 数字验证 + * + * @param str + * @return + */ + private static boolean isDigital(String str) { + return str.matches("^[0-9]*$"); + } + + /** + * 将身份证的每位和对应位的加权因子相乘之后,再得到和值 + * + * @param bit + * @return + */ + private static int getPowerSum(int[] bit) { + + int sum = 0; + + if (power.length != bit.length) { + return sum; + } + + for (int i = 0; i < bit.length; i++) { + for (int j = 0; j < power.length; j++) { + if (i == j) { + sum = sum + bit[i] * power[j]; + } + } + } + return sum; + } + + /** + * 将和值与11取模得到余数进行校验码判断 + * + * @param + * @param sum17 + * @return 校验位 + */ + private static String getCheckCodeBySum(int sum17) { + String checkCode = null; + switch (sum17 % 11) { + case 10: + checkCode = "2"; + break; + case 9: + checkCode = "3"; + break; + case 8: + checkCode = "4"; + break; + case 7: + checkCode = "5"; + break; + case 6: + checkCode = "6"; + break; + case 5: + checkCode = "7"; + break; + case 4: + checkCode = "8"; + break; + case 3: + checkCode = "9"; + break; + case 2: + checkCode = "x"; + break; + case 1: + checkCode = "0"; + break; + case 0: + checkCode = "1"; + break; + default: + } + return checkCode; + } + + /** + * 将字符数组转为整型数组 + * + * @param c + * @return + * @throws NumberFormatException + */ + private static int[] converCharToInt(char[] c) throws NumberFormatException { + int[] a = new int[c.length]; + int k = 0; + for (char temp : c) { + a[k++] = Integer.parseInt(String.valueOf(temp)); + } + return a; + } + + /** + * 通过身份证号码获取出生日期、性别、年龄 + * + * @param certificateNo + * @return 返回的出生日期格式:1990-01-01 性别格式:F-女,M-男 + */ + public static Map getBirAgeSex(String certificateNo) { + String birthday = ""; + String age = ""; + String sexCode = ""; + + int year = Calendar.getInstance().get(Calendar.YEAR); + char[] number = certificateNo.toCharArray(); + boolean flag = true; + if (number.length == 15) { + for (int x = 0; x < number.length; x++) { + if (!flag) return new HashMap(); + flag = Character.isDigit(number[x]); + } + } else if (number.length == 18) { + for (int x = 0; x < number.length - 1; x++) { + if (!flag) return new HashMap(); + flag = Character.isDigit(number[x]); + } + } + if (flag && certificateNo.length() == 15) { + birthday = "19" + certificateNo.substring(6, 8) + "-" + + certificateNo.substring(8, 10) + "-" + + certificateNo.substring(10, 12); + sexCode = Integer.parseInt(certificateNo.substring(certificateNo.length() - 3, certificateNo.length())) % 2 == 0 ? "F" : "M"; + age = (year - Integer.parseInt("19" + certificateNo.substring(6, 8))) + ""; + } else if (flag && certificateNo.length() == 18) { + birthday = certificateNo.substring(6, 10) + "-" + + certificateNo.substring(10, 12) + "-" + + certificateNo.substring(12, 14); + sexCode = Integer.parseInt(certificateNo.substring(certificateNo.length() - 4, certificateNo.length() - 1)) % 2 == 0 ? "F" : "M"; + age = (year - Integer.parseInt(certificateNo.substring(6, 10))) + ""; + } + Map map = new HashMap(); + map.put("birthday", birthday); + map.put("age", age); + map.put("sexCode", sexCode); + return map; + } + private static String getIdCardCalendar(String certNo) { // 获取出生年月日 String birthday = certNo.substring(6, 12); diff --git a/src/main/java/cn/com/tenlion/util/SignUpUtil.java b/src/main/java/cn/com/tenlion/util/SignUpUtil.java index 3767414..4c5eb81 100644 --- a/src/main/java/cn/com/tenlion/util/SignUpUtil.java +++ b/src/main/java/cn/com/tenlion/util/SignUpUtil.java @@ -13,7 +13,7 @@ public class SignUpUtil { if (!StringUtils.equals("安全管理人员", type) && !StringUtils.isBlank(type)) { return -1; } - if (!IdCardVerifyUtil.isIDCard(idCard)) { + if (!IdCardVerifyUtil.isValidatedAllIdcard(idCard)) { return -1; } String gender = IdCardVerifyUtil.getIdCardGender(idCard); @@ -60,7 +60,7 @@ public class SignUpUtil { if (!StringUtils.equals("安全管理人员", type) && !StringUtils.isBlank(type)) { return; } - if (!IdCardVerifyUtil.isIDCard(idCard)) { + if (!IdCardVerifyUtil.isValidatedAllIdcard(idCard)) { throw new ParamsException("身份证格式错误"); } Integer age = IdCardVerifyUtil.getIdCardAge(idCard);