lrf402788946 4 år sedan
förälder
incheckning
6f6dd9a145
1 ändrade filer med 89 tillägg och 2 borttagningar
  1. 89 2
      app/service/school.js

+ 89 - 2
app/service/school.js

@@ -261,8 +261,12 @@ class SchoolService extends CrudService {
         errorcode = '1';
         data.msg = (data.msg || '') + '身份证号不允许为空,';
       } else {
-        // 检验身份证后3,4,5,6
-        if (data.id_number.endsWith('000')) data.msg = (data.msg || '') + '身份证号尾号含有3个0,请检查excel是否设置正确,';
+        const { pass, msg } = this.idCodeValid(data.id_number);
+        if (!pass) {
+          errorcode = '1';
+          data.msg = (data.msg || '') + `${msg},`;
+        }
+
       }
       if (!data.school_name) {
         errorcode = '1';
@@ -414,6 +418,89 @@ class SchoolService extends CrudService {
     }
     return await trainplan.save();
   }
+
+  idCodeValid(code) {
+    // 身份证号合法性验证
+    // 支持15位和18位身份证号
+    // 支持地址编码、出生日期、校验位验证
+    const city = {
+      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: '国外 ',
+    };
+    let row = {
+      pass: true,
+      msg: '验证成功',
+    };
+    if (!code || !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|[xX])$/.test(code)) {
+      row = {
+        pass: false,
+        msg: '身份证号格式错误',
+      };
+    } else if (!city[code.substr(0, 2)]) {
+      row = {
+        pass: false,
+        msg: '身份证号地址编码错误',
+      };
+    } else {
+      // 18位身份证需要验证最后一位校验位
+      if (code.length == 18) {
+        code = code.split('');
+        // ∑(ai×Wi)(mod 11)
+        // 加权因子
+        const factor = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ];
+        // 校验位
+        const parity = [ 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 ];
+        let sum = 0;
+        let ai = 0;
+        let wi = 0;
+        for (let i = 0; i < 17; i++) {
+          ai = code[i];
+          wi = factor[i];
+          sum += ai * wi;
+        }
+        if (parity[sum % 11] != code[17].toUpperCase()) {
+          row = {
+            pass: false,
+            msg: '身份证号校验位错误',
+          };
+        }
+      }
+    }
+    return row;
+  }
 }
 
 module.exports = SchoolService;