Browse Source

fix 新增输入身份证自动识别生日和性别(字段翻译器)

Administrator 4 years ago
parent
commit
7292179964

+ 173 - 0
boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/fieldTranslator/IdCardUtils.java

@@ -0,0 +1,173 @@
+package com.boman.common.core.utils.fieldTranslator;
+
+import com.boman.common.core.utils.StringUtils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * @author tjf
+ * @Date: 2021/06/07/15:02
+ */
+public class IdCardUtils {
+    /**
+     * 15位身份证号
+     */
+    private static final Integer FIFTEEN_ID_CARD=15;
+    /**
+     * 18位身份证号
+     */
+    private static final Integer EIGHTEEN_ID_CARD=18;
+    private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+
+    /**
+     * 根据身份证号获取性别
+     * @param IDCard
+     * @return
+     */
+    public static String getSex(String IDCard){
+        String sex ="";
+        if (StringUtils.isNotBlank(IDCard)){
+            //15位身份证号
+            if (IDCard.length() == FIFTEEN_ID_CARD){
+                if (Integer.parseInt(IDCard.substring(14, 15)) % 2 == 0) {
+                    sex = "女";
+                } else {
+                    sex = "男";
+                }
+                //18位身份证号
+            }else if(IDCard.length() == EIGHTEEN_ID_CARD){
+                // 判断性别
+                if (Integer.parseInt(IDCard.substring(16).substring(0, 1)) % 2 == 0) {
+                    sex = "女";
+                } else {
+                    sex = "男";
+                }
+            }
+        }
+        return sex;
+    }
+
+    /**
+     * 根据身份证号获取年龄
+     * @param IDCard
+     * @return
+     */
+    public static Integer getAge(String IDCard){
+        Integer age = 0;
+        Date date = new Date();
+        if (StringUtils.isNotBlank(IDCard)&& isValid(IDCard)){
+            //15位身份证号
+            if (IDCard.length() == FIFTEEN_ID_CARD){
+                // 身份证上的年份(15位身份证为1980年前的)
+                String uyear = "19" + IDCard.substring(6, 8);
+                // 身份证上的月份
+                String uyue = IDCard.substring(8, 10);
+                // 当前年份
+                String fyear = format.format(date).substring(0, 4);
+                // 当前月份
+                String fyue = format.format(date).substring(5, 7);
+                if (Integer.parseInt(uyue) <= Integer.parseInt(fyue)) {
+                    age = Integer.parseInt(fyear) - Integer.parseInt(uyear) + 1;
+                    // 当前用户还没过生
+                } else {
+                    age = Integer.parseInt(fyear) - Integer.parseInt(uyear);
+                }
+                //18位身份证号
+            }else if(IDCard.length() == EIGHTEEN_ID_CARD){
+                // 身份证上的年份
+                String year = IDCard.substring(6).substring(0, 4);
+                // 身份证上的月份
+                String yue = IDCard.substring(10).substring(0, 2);
+                // 当前年份
+                String fyear = format.format(date).substring(0, 4);
+                // 当前月份
+                String fyue = format.format(date).substring(5, 7);
+                // 当前月份大于用户出身的月份表示已过生日
+                if (Integer.parseInt(yue) <= Integer.parseInt(fyue)) {
+                    age = Integer.parseInt(fyear) - Integer.parseInt(year) + 1;
+                    // 当前用户还没过生日
+                } else {
+                    age = Integer.parseInt(fyear) - Integer.parseInt(year);
+                }
+            }
+        }
+        return age;
+    }
+
+    /**
+     * 获取出生日期  yyyy年MM月dd日
+     * @param iDCard
+     * @return
+     */
+    public static String getBirthday(String iDCard){
+        String birthday="";
+        String year="";
+        String month="";
+        String day="";
+        if (StringUtils.isNotBlank(iDCard)){
+            //15位身份证号
+            if (iDCard.length() == FIFTEEN_ID_CARD){
+                // 身份证上的年份(15位身份证为1980年前的)
+                year = "19" + iDCard.substring(6, 8);
+                //身份证上的月份
+                month = iDCard.substring(8, 10);
+                //身份证上的日期
+                day= iDCard.substring(10, 12);
+                //18位身份证号
+            }else if(iDCard.length() == EIGHTEEN_ID_CARD){
+                // 身份证上的年份
+                year = iDCard.substring(6).substring(0, 4);
+                // 身份证上的月份
+                month = iDCard.substring(10).substring(0, 2);
+                //身份证上的日期
+                day=iDCard.substring(12).substring(0,2);
+            }
+            birthday=year+"-"+month+"-"+day;
+        }
+        return birthday;
+    }
+
+    /**
+     * 身份证验证
+     * @param id 号码内容
+     * @return 是否有效
+     */
+    public static boolean isValid(String id){
+        Boolean validResult = true;
+        //校验长度只能为15或18
+        int len = id.length();
+        if (len != FIFTEEN_ID_CARD && len != EIGHTEEN_ID_CARD){
+            validResult = false;
+        }
+        //校验生日
+        if (!validDate(id)){
+            validResult = false;
+        }
+        return validResult;
+    }
+
+    /**
+     * 校验生日
+     * @param id
+     * @return
+     */
+    private static boolean validDate(String id)
+    {
+        try
+        {
+            String birth = id.length() == 15 ? "19" + id.substring(6, 12) : id.substring(6, 14);
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+            Date birthDate = sdf.parse(birth);
+            if (!birth.equals(sdf.format(birthDate))){
+                return false;
+            }
+        }
+        catch (ParseException e)
+        {
+            return false;
+        }
+        return true;
+    }
+}

+ 2 - 21
boman-modules/boman-gen/src/main/java/com/boman/gen/service/GenTableColumnServiceImpl.java

@@ -141,7 +141,7 @@ public class GenTableColumnServiceImpl implements IGenTableColumnService {
         isAk(list);
         insertCreateLog(list, BusinessType.INSERT);
         //处理字段翻译器
-        fieldTranslator(list);
+        //fieldTranslator(list);
         return i;
     }
 
@@ -157,7 +157,7 @@ public class GenTableColumnServiceImpl implements IGenTableColumnService {
         list.add(genTableColumn);
         isAk(list);
         insertCreateLog(list, BusinessType.UPDATE);
-        fieldTranslator(list);
+        //fieldTranslator(list);
         return genTableColumnMapper.updateGenTableColumn(genTableColumn);
     }
 
@@ -261,25 +261,6 @@ public class GenTableColumnServiceImpl implements IGenTableColumnService {
         }
     }
 
-
-
-    /**
-     * 处理字段翻译器
-     * @param genTableColumnList
-     */
-    @Async
-    public void fieldTranslator (List<GenTableColumn> genTableColumnList) {
-        for (GenTableColumn genTableColumn : genTableColumnList) {
-            String fieldTranslator = genTableColumn.getFieldTranslator();
-            if (StringUtils.isNotBlank(fieldTranslator)){
-                RestTemplate restTemplate = new RestTemplate();
-                restTemplate.postForObject("http://" + fieldTranslator, genTableColumn, GenTableColumn.class);
-            }
-        }
-    }
-
-
-
     /**
      * 删除业务字段对象
      *

+ 30 - 0
boman-web-core/src/main/java/com/boman/web/core/controller/FieldTranslatorController.java

@@ -0,0 +1,30 @@
+package com.boman.web.core.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.boman.web.core.service.fieldTranslator.IFieldTranslatorService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**字段翻译器出来
+ * @author tjf
+ * @Date: 2021/06/07/15:08
+ */
+@RestController
+@RequestMapping("/fieldTranslator")
+public class FieldTranslatorController {
+    @Autowired
+    private IFieldTranslatorService fieldTranslatorService;
+
+    /**
+     * 身份证号解析出出生日期和性别
+     * @param commitData
+     * @return
+     */
+    @PostMapping("/idCardTranslator")
+    public JSONObject idCardTranslator(@RequestBody JSONObject commitData){
+       return fieldTranslatorService.idCardTranslator(commitData);
+    }
+}

+ 3 - 0
boman-web-core/src/main/java/com/boman/web/core/service/TableServiceCmdService.java

@@ -36,6 +36,7 @@ import com.google.common.collect.Lists;
 import org.apache.commons.lang3.BooleanUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 import org.springframework.web.client.RestTemplate;
 
@@ -104,6 +105,8 @@ public class TableServiceCmdService {
         handleRequired(commitData, context.getColumns());
         // 处理输入类型
         handleInputType(commitData, context.getColumns());
+        //判断是否有字段翻译器,进行设置
+        fieldTranslator(context);
 
         AjaxResult result;
         // 新增

+ 31 - 0
boman-web-core/src/main/java/com/boman/web/core/service/fieldTranslator/FieldTranslatorServiceImpl.java

@@ -0,0 +1,31 @@
+package com.boman.web.core.service.fieldTranslator;
+
+import com.alibaba.fastjson.JSONObject;
+import com.boman.common.core.utils.fieldTranslator.IdCardUtils;
+import com.boman.common.core.utils.obj.ObjectUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.Set;
+
+/**
+ * @author tjf
+ * @Date: 2021/06/07/15:13
+ */
+@Service
+public class FieldTranslatorServiceImpl implements IFieldTranslatorService{
+
+    @Override
+    public JSONObject idCardTranslator(JSONObject commitData) {
+        Object idCard = commitData.get("id_card");
+        Set<String> columnNameSet = commitData.keySet();
+        if (columnNameSet.contains("birthday_user")){
+            String birthday = IdCardUtils.getBirthday(String.valueOf(idCard));
+            commitData.put("birthday_user",birthday);
+        }
+        if (columnNameSet.contains("gender_user")){
+            String sex = IdCardUtils.getSex(String.valueOf(idCard));
+            commitData.put("gender_user",sex);
+        }
+        return commitData;
+    }
+}

+ 17 - 0
boman-web-core/src/main/java/com/boman/web/core/service/fieldTranslator/IFieldTranslatorService.java

@@ -0,0 +1,17 @@
+package com.boman.web.core.service.fieldTranslator;
+
+import com.alibaba.fastjson.JSONObject;
+
+/**
+ * @author tjf
+ * @Date: 2021/06/07/15:13
+ */
+public interface IFieldTranslatorService {
+
+    /**
+     * 身份证号解析出出生日期和性别
+     * @param commitData
+     * @return
+     */
+    JSONObject idCardTranslator (JSONObject commitData);
+}

+ 1 - 0
boman-web-core/src/main/java/com/boman/web/core/service/save/BaseSaveServiceImpl.java

@@ -56,6 +56,7 @@ public class BaseSaveServiceImpl implements IBaseSaveService {
         buildBillRule(context.getTableName(), commitData, columns);
 
         commitData.put(context.getPkName(), maxId);
+
         int ret = mapper.insert(context.getTableName(), commitData);
         if (ret > 0) {
             LOGGER.info("保存成功,保存的数据为:{}", commitData);

+ 18 - 0
boman-web-core/src/main/java/com/boman/web/core/utils/ColumnUtils.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.util.TypeUtils;
 import com.boman.common.core.constant.GenConstants;
 import com.boman.common.core.utils.SecurityUtils;
+import com.boman.common.core.utils.SpringUtils;
 import com.boman.common.core.utils.StringUtils;
 import com.boman.common.core.utils.array.ArrayUtils;
 import com.boman.common.core.utils.collection.CollectionUtils;
@@ -12,10 +13,12 @@ import com.boman.common.core.utils.obj.ObjectUtils;
 import com.boman.domain.GenTableColumn;
 import com.boman.domain.constant.MysqlDataTypeConst;
 import com.boman.domain.exception.UnknownColumnException;
+import com.boman.web.core.domain.TableContext;
 import com.google.common.base.Joiner;
 import com.google.common.collect.Lists;
 import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.math.NumberUtils;
+import org.springframework.web.client.RestTemplate;
 
 import java.sql.Timestamp;
 import java.util.Comparator;
@@ -397,4 +400,19 @@ public class ColumnUtils {
 
         return value;
     }
+
+    /**
+     * 处理字段翻译器
+     */
+    public static void fieldTranslator (TableContext context) {
+        JSONObject commitData = context.getCommitData();
+        List<GenTableColumn> genTableColumnList = context.getColumns();
+        for (GenTableColumn genTableColumn : genTableColumnList) {
+            String fieldTranslator = genTableColumn.getFieldTranslator();
+            if (StringUtils.isNotBlank(fieldTranslator)){
+                commitData = SpringUtils.getBean(RestTemplate.class).postForObject("http://" + fieldTranslator, commitData, JSONObject.class);
+            }
+        }
+        context.setCommitData(commitData);
+    }
 }