diff --git a/src/main/java/com/cm/population/controller/apis/basepopulationinfo/BasePopulationInfoController.java b/src/main/java/com/cm/population/controller/apis/basepopulationinfo/BasePopulationInfoController.java index d0b3b9a..6af780f 100644 --- a/src/main/java/com/cm/population/controller/apis/basepopulationinfo/BasePopulationInfoController.java +++ b/src/main/java/com/cm/population/controller/apis/basepopulationinfo/BasePopulationInfoController.java @@ -46,6 +46,10 @@ import java.util.*; @RequestMapping(ISystemConstant.API_PREFIX + "/basepopulationinfo") public class BasePopulationInfoController extends AbstractController { + private String [] headers = { + "公民身份证(请勿出现科学计数法)","姓名","曾用名","民族","籍贯","婚姻情况","政治面貌","学历","宗教信仰","职业类别", + "职业","服务处所","联系方式(请勿出现科学计数法)","户籍地门(楼)详址","现住地门(楼)详址" + }; @Autowired private IBasePopulationInfoService basePopulationInfoService; @Autowired @@ -133,17 +137,13 @@ public class BasePopulationInfoController extends AbstractController { return basePopulationInfoService.countBasePopulationInfo(params); } - @ApiOperation(value = "人员基础信息模板下载", notes = "党费管理Excel模板下载接口") + @ApiOperation(value = "人员基础信息模板下载", notes = "人员基础信息模板下载") @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) @GetMapping("downloadtemplate") public void downLoadTemplate(HttpServletResponse response) throws SearchException, IOException { response.setContentType("application/vnd.ms-excel"); String fileName = URLEncoder.encode("人员基础信息Excel模板", "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); - String [] headers = { - "公民身份证(请勿出现科学计数法)","姓名","曾用名","性别","出生日期(按照2020-01-01格式填写)","民族","籍贯","婚姻情况","政治面貌","学历","宗教信仰","职业类别", - "职业","服务处所","联系方式(请勿出现科学计数法)","户籍地","户籍地门(楼)详址","现住地", "现住地门(楼)详址" - }; List> listHeader = new ArrayList<>(); for (String item : headers){ List title = new ArrayList<>(); @@ -181,10 +181,6 @@ public class BasePopulationInfoController extends AbstractController { String excelName = "人员基础信息失败数据"; String fileName = URLEncoder.encode(excelName, "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx"); - String [] headers = { - "公民身份证(请勿出现科学计数法)","姓名","曾用名","性别","出生日期(按照2020-01-01格式填写)","民族","籍贯","婚姻情况","政治面貌","学历","宗教信仰","职业类别", - "职业","服务处所","联系方式(请勿出现科学计数法)","户籍地","户籍地门(楼)详址","现住地", "现住地门(楼)详址" - }; List> listHeader = new ArrayList<>(); for(String item : headers) { List title = new ArrayList<>(); @@ -198,8 +194,6 @@ public class BasePopulationInfoController extends AbstractController { el.add(item.get("idCardNumber")); el.add(item.get("fullName")); el.add(item.get("nameUsedBefore")); - el.add(item.get("gender")); - el.add(item.get("birthDate")); el.add(item.get("nation")); el.add(item.get("nativePlace")); el.add(item.get("maritalStatus")); @@ -210,14 +204,12 @@ public class BasePopulationInfoController extends AbstractController { el.add(item.get("occupation")); el.add(item.get("serviceSpace")); el.add(item.get("telephone")); - el.add(""); el.add(item.get("registeredResidenceAddr")); - el.add(""); el.add(item.get("currentResidenceAddr")); listData.add(el); } ImportErrorData.errorData.remove(guid); - EasyExcel.write(response.getOutputStream()).sheet("人员基础信息失败数据").head(listHeader).doWrite(listData); + EasyExcel.write(response.getOutputStream()).sheet("人员基础信息异常数据").head(listHeader).doWrite(listData); } @ApiOperation(value = "当前用户id信息", notes = "当前用户id信息接口") diff --git a/src/main/java/com/cm/population/pojo/vos/basepopulationinfo/BasePopulationInfoVO.java b/src/main/java/com/cm/population/pojo/vos/basepopulationinfo/BasePopulationInfoVO.java index 8a74b0e..c38fb44 100644 --- a/src/main/java/com/cm/population/pojo/vos/basepopulationinfo/BasePopulationInfoVO.java +++ b/src/main/java/com/cm/population/pojo/vos/basepopulationinfo/BasePopulationInfoVO.java @@ -17,10 +17,8 @@ import io.swagger.annotations.ApiModelProperty; public class BasePopulationInfoVO { @ApiModelProperty(name = "idCardNumber", value = "公民身份证号") - @CheckEmptyAnnotation(name = "公民身份证号") private String idCardNumber; @ApiModelProperty(name = "fullName", value = "全名") - @CheckEmptyAnnotation(name = "全名") private String fullName; @ApiModelProperty(name = "nameUsedBefore", value = "曾用名") private String nameUsedBefore; @@ -49,7 +47,6 @@ public class BasePopulationInfoVO { @ApiModelProperty(name = "serviceSpace", value = "服务处所") private String serviceSpace; @ApiModelProperty(name = "telephone", value = "联系方式(手机号码或固话)") - @CheckEmptyAnnotation(name = "联系方式(手机号码或固话)", verifyType = "phone") private String telephone; @ApiModelProperty(name = "registeredResidence", value = "户籍地") private String registeredResidence; @@ -58,7 +55,6 @@ public class BasePopulationInfoVO { @ApiModelProperty(name = "currentResidence", value = "现住地") private String currentResidence; @ApiModelProperty(name = "currentResidenceAddr", value = "现住地详细地址") - @CheckEmptyAnnotation(name = "现住地详细地址") private String currentResidenceAddr; public String getIdCardNumber() { diff --git a/src/main/java/com/cm/population/service/basepopulationinfo/impl/BasePopulationInfoServiceImpl.java b/src/main/java/com/cm/population/service/basepopulationinfo/impl/BasePopulationInfoServiceImpl.java index aa87d08..f907484 100644 --- a/src/main/java/com/cm/population/service/basepopulationinfo/impl/BasePopulationInfoServiceImpl.java +++ b/src/main/java/com/cm/population/service/basepopulationinfo/impl/BasePopulationInfoServiceImpl.java @@ -19,6 +19,7 @@ import com.cm.population.dao.basepopulationinfo.IBasePopulationInfoDao; import com.cm.population.pojo.dtos.basepopulationinfo.BasePopulationInfoDTO; import com.cm.population.pojo.vos.basepopulationinfo.BasePopulationInfoVO; import com.cm.population.service.basepopulationinfo.IBasePopulationInfoService; +import com.cm.population.utils.IdCardVerifyUtil; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import org.springframework.beans.factory.annotation.Autowired; @@ -86,6 +87,28 @@ public class BasePopulationInfoServiceImpl extends AbstractService implements IB */ private String saveBasePopulationInfoInfoReturnId(String token, BasePopulationInfoVO basePopulationInfoVO) throws Exception { String basePopulationInfoId = UUIDUtil.getUUID(); + if(!IdCardVerifyUtil.isIDCard(basePopulationInfoVO.getIdCardNumber().toUpperCase())){ + throw new SaveException("无效的身份证号码"); + } + // 判断当前身份证号是否已经存在 + Map query = new HashMap<>(4); + query.put("idCardNumber", basePopulationInfoVO.getIdCardNumber()); + BasePopulationInfoDTO isHaveDTO = basePopulationInfoDao.getBasePopulationInfo(query); + if(isHaveDTO != null && !"".equals(isHaveDTO.getIdCardNumber())){ + throw new SaveException("人员信息已存在"); + } + String birthDay = IdCardVerifyUtil.getIdCardBirthday(basePopulationInfoVO.getIdCardNumber()); + basePopulationInfoVO.setBirthDate(birthDay); + String gender = IdCardVerifyUtil.getIdCardGender(basePopulationInfoVO.getIdCardNumber()); + switch (gender){ + case "1" : + basePopulationInfoVO.setGender("46bec29f-2368-44f7-98d0-b33246e5e16d"); + break; + case "0" : + basePopulationInfoVO.setGender("4a5f549a-d339-4403-8d26-9058e80499b1"); + break; + default : basePopulationInfoVO.setGender("01fffb32-73ca-4872-9d2f-abb2158f0e07"); + } Map params = HashMapUtil.beanToMap(basePopulationInfoVO); params.put("basePopulationInfoId", basePopulationInfoId); if (token != null) { @@ -99,29 +122,33 @@ public class BasePopulationInfoServiceImpl extends AbstractService implements IB @Override public void saveBasePopulationInfoImport(Map dataObj) { - String idCardNumber = dataObj.get("idCardNumber").toString().toLowerCase(); - if("".equals(idCardNumber)){ - throw new SaveException("身份证号码错误"); - } - if(15 != idCardNumber.length() && 18 != idCardNumber.length()){ - throw new SaveException("身份证号码错误"); + String idCardNumber = dataObj.get("idCardNumber").toString().toUpperCase(); + if(!IdCardVerifyUtil.isIDCard(idCardNumber)){ + throw new SaveException("无效的身份证号码"); } Map queryMap = getHashMap(4); queryMap.put("idCardNumber",idCardNumber); - BasePopulationInfoDTO basePopulationInfo = basePopulationInfoDao.getBasePopulationInfo(queryMap); - if(basePopulationInfo == null){ - String basePopulationInfoId = UUIDUtil.getUUID(); - dataObj.put("basePopulationInfoId", basePopulationInfoId); - dataObj.put("idCardNumber",idCardNumber); - setSaveInfo(dataObj); - String year = idCardNumber.substring(6,10); - String month = idCardNumber.substring(10,12); - String day = idCardNumber.substring(12,14); - if(15 != idCardNumber.length()){ - dataObj.put("birthDate",year + "-" + month + "-" + day); - } - basePopulationInfoDao.saveBasePopulationInfo(dataObj); + BasePopulationInfoDTO isHaveDTO = basePopulationInfoDao.getBasePopulationInfo(queryMap); + if(isHaveDTO != null && !"".equals(isHaveDTO.getIdCardNumber())){ + throw new SaveException("人员信息已存在"); } + String basePopulationInfoId = UUIDUtil.getUUID(); + dataObj.put("basePopulationInfoId", basePopulationInfoId); + dataObj.put("idCardNumber",idCardNumber); + setSaveInfo(dataObj); + String birthDay = IdCardVerifyUtil.getIdCardBirthday(idCardNumber); + dataObj.put("birthDate",birthDay); + String gender = IdCardVerifyUtil.getIdCardGender(idCardNumber); + switch (gender){ + case "1" : + dataObj.put("gender", "46bec29f-2368-44f7-98d0-b33246e5e16d"); + break; + case "0" : + dataObj.put("gender", "4a5f549a-d339-4403-8d26-9058e80499b1"); + break; + default : dataObj.put("gender", "01fffb32-73ca-4872-9d2f-abb2158f0e07"); + } + basePopulationInfoDao.saveBasePopulationInfo(dataObj); } @Override diff --git a/src/main/java/com/cm/population/uploadexcellistener/populationbaseinfo/PopulationBaseInfoUploadListener.java b/src/main/java/com/cm/population/uploadexcellistener/populationbaseinfo/PopulationBaseInfoUploadListener.java index c8505b6..f073e69 100644 --- a/src/main/java/com/cm/population/uploadexcellistener/populationbaseinfo/PopulationBaseInfoUploadListener.java +++ b/src/main/java/com/cm/population/uploadexcellistener/populationbaseinfo/PopulationBaseInfoUploadListener.java @@ -29,7 +29,7 @@ public class PopulationBaseInfoUploadListener extends AnalysisEventListener data, AnalysisContext context) { - int columnCount = 19; + int columnCount = 15; for (int i = 0; i < columnCount; i++){ data.put(i,StringUtils.isEmpty(data.get(i)) ? "" : data.get(i).toString().trim()); } @@ -37,20 +37,18 @@ public class PopulationBaseInfoUploadListener extends AnalysisEventListener zoneNum = new HashMap(); + static { + zoneNum.put(11, "北京"); + zoneNum.put(12, "天津"); + zoneNum.put(13, "河北"); + zoneNum.put(14, "山西"); + zoneNum.put(15, "内蒙古"); + zoneNum.put(21, "辽宁"); + zoneNum.put(22, "吉林"); + zoneNum.put(23, "黑龙江"); + zoneNum.put(31, "上海"); + zoneNum.put(32, "江苏"); + zoneNum.put(33, "浙江"); + zoneNum.put(34, "安徽"); + zoneNum.put(35, "福建"); + zoneNum.put(36, "江西"); + zoneNum.put(37, "山东"); + zoneNum.put(41, "河南"); + zoneNum.put(42, "湖北"); + zoneNum.put(43, "湖南"); + zoneNum.put(44, "广东"); + zoneNum.put(45, "广西"); + zoneNum.put(46, "海南"); + zoneNum.put(50, "重庆"); + zoneNum.put(51, "四川"); + zoneNum.put(52, "贵州"); + zoneNum.put(53, "云南"); + zoneNum.put(54, "西藏"); + zoneNum.put(61, "陕西"); + zoneNum.put(62, "甘肃"); + zoneNum.put(63, "青海"); + zoneNum.put(64, "新疆"); + zoneNum.put(71, "台湾"); + zoneNum.put(81, "香港"); + zoneNum.put(82, "澳门"); + zoneNum.put(91, "外国"); + } + + final static int[] PARITYBIT = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'}; + final static int[] POWER_LIST = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; + + public IdCardVerifyUtil() { + + } + + /** + * 身份证验证 + *@param certNo 号码内容 + *@return 是否有效 null和"" 都是false + */ + public static boolean isIDCard(String certNo){ + if(certNo == null || (certNo.length() != 15 && certNo.length() != 18)){ + return false; + } + final char[] cs = certNo.toUpperCase().toCharArray(); + //校验位数 + int power = 0; + for(int i=0; i'9'){ + return false; + } + if(i < cs.length -1){ + power += (cs[i] - '0') * POWER_LIST[i]; + } + } + + //校验区位码 + if(!zoneNum.containsKey(Integer.valueOf(certNo.substring(0,2)))){ + return false; + } + + //校验年份 + String year = null; + year = certNo.length() == 15 ? getIdCardCalendar(certNo):certNo.substring(6, 10); + + + final int iyear = Integer.parseInt(year); + if(iyear < 1900 || iyear > Calendar.getInstance().get(Calendar.YEAR)){ + //1900年的PASS,超过今年的PASS + return false; + } + + //校验月份 + String month = certNo.length() == 15 ? certNo.substring(8, 10) : certNo.substring(10,12); + final int imonth = Integer.parseInt(month); + if(imonth <1 || imonth >12){ + return false; + } + + //校验天数 + String day = certNo.length() ==15 ? certNo.substring(10, 12) : certNo.substring(12, 14); + final int iday = Integer.parseInt(day); + if(iday < 1 || iday > 31){ + return false; + } + + //校验"校验码" + if(certNo.length() == 15){ + return true; + } + return cs[cs.length -1 ] == PARITYBIT[power % 11]; + } + + private static String getIdCardCalendar(String certNo){ + // 获取出生年月日 + String birthday = certNo.substring(6, 12); + SimpleDateFormat ft = new SimpleDateFormat("yyMMdd"); + Date birthdate = null; + try { + birthdate = ft.parse(birthday); + } catch (java.text.ParseException e) { + e.printStackTrace(); + } + Calendar cDay = Calendar.getInstance(); + cDay.setTime(birthdate); + String year = String.valueOf(cDay.get(Calendar.YEAR)); + return year; + } + + /** + * 获取身份证号中的出生日期 + * @param cardNo 身份证号 + * @return xxxx-xx-xx + */ + public static String getIdCardBirthday(String cardNo) { + try { + if(cardNo == null || cardNo.length() == 0){ + return "身份证号为空"; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + if(cardNo.length() == 15){ + String birthday = "19" + cardNo.substring(6,12); + Date date = sdf.parse(birthday); + sdf = new SimpleDateFormat("yyyy-MM-dd"); + return sdf.format(date); + } + if(cardNo.length() == 18){ + String birthday = cardNo.substring(6,14); + Date date = sdf.parse(birthday); + sdf = new SimpleDateFormat("yyyy-MM-dd"); + return sdf.format(date); + } + } catch (Exception e){} + return ""; + } + + /** + * 获取身份证号中的性别 + * @param cardNo + * @return -1 无法获取 1男性0女性 + */ + public static String getIdCardGender(String cardNo){ + try { + if(cardNo == null || cardNo.length() == 0){ + return "-1"; + } + if(cardNo.length() == 15){ + String genderCode = cardNo.substring(cardNo.length() - 1); + int res = Integer.parseInt(genderCode); + if(res % 2 == 0){ + return "0"; + } else { + return "1"; + } + } + if(cardNo.length() == 18){ + String genderCode = cardNo.substring(cardNo.length() - 2, cardNo.length() - 1); + int res = Integer.parseInt(genderCode); + if(res % 2 == 0){ + return "0"; + } else { + return "1"; + } + } + } catch (Exception e){} + return "-1"; + } + + public static void main(String[] args) { + //boolean isTrue = isIDCard("330622810725323"); + + //System.out.println(getIdCardGender("152822199310146919")); + } + +} diff --git a/src/main/resources/static/route/basepopulationinfo/list-basepopulationinfo.html b/src/main/resources/static/route/basepopulationinfo/list-basepopulationinfo.html index 5361187..f1fd4ec 100644 --- a/src/main/resources/static/route/basepopulationinfo/list-basepopulationinfo.html +++ b/src/main/resources/static/route/basepopulationinfo/list-basepopulationinfo.html @@ -18,7 +18,7 @@
- +
-
-
- -
- -
-
-
-
-
- -
- -
-
- -
@@ -64,17 +40,9 @@
- +
- -
-
-
-
-
- -
- +
@@ -82,10 +50,18 @@
- + +
+ +
+
+
+
+
+
-
-
- -
- -
-
- +
+
+
+ +
+ +
+
+
+
@@ -166,8 +144,6 @@
-
-
@@ -176,6 +152,8 @@
+
+
@@ -188,10 +166,10 @@
- +
-
-
- +
- +
- -
- -
-
-
-
-
- -
- -
-
-
-
-
-
-
- +
-
-
- -
- -
-
-
- +
+
+
- +
+
+
@@ -190,10 +167,10 @@
- +