|
@@ -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;
|