package com.ynxbd.common.helper.common; import com.baidu.aip.ocr.AipOcr; import com.ynxbd.common.bean.Patient; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Iterator; /** * @Author wsq * @Date 2020/10/12 11:56 * @Copyright @ 2020 云南新八达科技有限公司 All rights reserved. */ @Slf4j public class IDNumberHelper { private static String APP_ID; private static String API_KEY; private static String SECRET_KEY; // front:身份证含照片的一面,back:身份证带国徽的一面,必须正确声明,否则"error_msg": "recognize id card error" private final static String ID_CARD_SIDE = "front"; // 图片存储文件夹名 private final static String FOLDER_NAME = "idCard"; static { // Properties properties = FileHelper.readProperties("idcard.properties"); // if (properties != null) { // APP_ID = FileHelper.propertiesGetString(properties, "baidu.appId"); // API_KEY = FileHelper.propertiesGetString(properties, "baidu.apiKey"); // SECRET_KEY = FileHelper.propertiesGetString(properties, "baidu.secretKey"); // } } /** * 根据身份证号获取性别 * * @param idNumber 身份证号码 * @return 性别 */ public static String getSex(String idNumber) { if (isValid(idNumber)) return null; String sex = null; if (StringUtils.isNotBlank(idNumber)) { if (idNumber.length() == 18) { sex = Integer.parseInt(idNumber.substring(16, 17)) % 2 == 1 ? "男" : "女"; } else { sex = Integer.parseInt(idNumber.substring(14, 15)) % 2 == 1 ? "男" : "女"; } } return sex; } /** * 根据身份证号获取年龄 * * @param idNumber 身份证号码 * @return 年龄 */ public static Integer getAge(String idNumber) { if (isValid(idNumber)) return null; String year, month, day; if (idNumber.length() == 18) { year = idNumber.substring(6, 10);// 得到年份 month = idNumber.substring(10, 12);// 得到月份 day = idNumber.substring(12, 14);//得到日 } else { year = "19" + idNumber.substring(6, 8);// 年份 month = idNumber.substring(8, 10);// 月份 day = idNumber.substring(10, 12);//日 } Date date = new Date();// 得到当前的系统时间 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); String curYear = format.format(date).substring(0, 4);// 当前年份 String curMonth = format.format(date).substring(5, 7);// 月份 String curDay = format.format(date).substring(8, 10);// int age = Integer.parseInt(curYear) - Integer.parseInt(year); if (Integer.parseInt(month) > Integer.parseInt(curMonth) //如果当前月份小于出生月份,说明生日还没过 || (Integer.parseInt(month) == Integer.parseInt(curMonth) && Integer.parseInt(day) > Integer.parseInt(curDay))) { age--; } return age; } /** * 获取出生日期 * * @param idNumber 身份证号码 * @return 出生日期 yyyy-mm-dd */ public static String getBirthday(String idNumber) { if (isValid(idNumber)) return null; String y, m, d; if (idNumber.length() == 18) { //18位身份证号 y = idNumber.substring(6, 10); m = idNumber.substring(10, 12); d = idNumber.substring(12, 14); } else { // 身份证上的年份(15位身份证为1980年前的) y = "19" + idNumber.substring(6, 8); m = idNumber.substring(8, 10); d = idNumber.substring(10, 12); } return y + "-" + m + "-" + d; } /** * 身份证验证 * * @param idNumber 身份证号码 * @return 是否有效 */ public static boolean isValid(String idNumber) { if (idNumber == null || "".equals(idNumber)) { return false; } int len = idNumber.length(); if (len != 15 && len != 18) { // 校验长度只能为15或18 log.info("身份证位数异常"); return true; } // 校验生日 if (!validDate(idNumber)) { log.info("生日异常"); return true; } return false; } /** * 校验生日 * * @param idNumber 身份证号码 * @return 是否有效 */ private static boolean validDate(String idNumber) { try { SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); String birth = idNumber.length() == 15 ? "19" + idNumber.substring(6, 12) : idNumber.substring(6, 14); if (new Date().compareTo(format.parse(birth)) < 0) { return false; } Date birthDate = format.parse(birth); if (!birth.equals(format.format(birthDate))) { return false; } } catch (ParseException e) { return false; } return true; } public static void main(String[] args) { System.out.println(getAge("53233119851015381X")); System.out.println(getSex("410527200002175438")); System.out.println(getBirthday("53233119861025381X")); } // 百度身份证识别 public static Patient getCardInfo(String image) { String imagePath = FileHelper.saveBase64Image(image, FOLDER_NAME, "time-" + System.currentTimeMillis() + ".png", true, false); if (imagePath == null) return null; AipOcr client = new AipOcr(APP_ID, API_KEY, SECRET_KEY);// 初始化一个AipOcr client.setConnectionTimeoutInMillis(3000); client.setSocketTimeoutInMillis(10000); HashMap options = new HashMap<>(); options.put("detect_direction", "true"); // 是否开启身份证风险类型(身份证复印件、临时身份证、身份证翻拍、修改过的身份证)功能, options.put("detect_risk", "false"); // client.idcard() ==>识别图片的方法是==>身份证识别 org.json.JSONObject resJson = client.idcard(imagePath, ID_CARD_SIDE, options); // 获取JSON中的==>words_result对象 org.json.JSONObject words_result = resJson.getJSONObject("words_result"); Patient patient = new Patient(); Iterator it = words_result.keys(); while (it.hasNext()) { String key = it.next(); String value = words_result.getJSONObject(key).getString("words"); // 获取JSON中的==>words值 if (value == null || "".equals(value)) { log.info("缺少" + key + "参数"); return null; } switch (key) { case "姓名": patient.setName(value); break; case "民族": patient.setNation(value); break; case "住址": patient.setAddress(value); break; case "公民身份号码": patient.setIdCardNo(value); break; case "出生": patient.setBirthday(value); break; case "性别": patient.setSex(value); break; default: System.out.println("param is not find"); break; } } FileHelper.updateFileName(imagePath, patient.getIdCardNo()); return patient; } }