You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
233 lines
8.0 KiB
233 lines
8.0 KiB
2 years ago
|
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<String, String> 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<String> 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;
|
||
|
}
|
||
|
}
|