regular/checkLicense.js

/**
 * @module Regular/checkLicense
* @description 校验统一社会信用代码
* @param {String} value 需要校验的值
* @param {Function} callback 回调函数
* @return {String} 错误信息
*
* @example
* checkLicense('91430100MA7GDNGR00')
* =>
* ''
*/
function checkLicense(value, callback) {
  let error = null
  if (!value || (!!value && value.length !== 18)) {
    error = new Error('社会信用代码长度错误!')
    if (callback) {
      error ? callback(error) : callback()
    } else {
      return error
    }
    return
  }
  var reg = /^([159Y]{1})([1239]{1})([0-9]{6})([0-9ABCDEFGHJKLMNPQRTUWXY]{9})([0-9ABCDEFGHJKLMNPQRTUWXY]{1})$/
  if (!reg.test(value)) {
    error = new Error('请输入正确的社会信用代码!')
  }
  // 不用I、O、S、V、Z
  var str = '0123456789ABCDEFGHJKLMNPQRTUWXY'
  var ws = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28]

  var codes = []
  var sum = 0
  codes[0] = value.substr(0, value.length - 1)
  codes[1] = value.substr(value.length - 1, value.length)

  for (var i = 0; i < codes[0].length; i++) {
    var Ancode = codes[0].charAt(i)
    var Ancodevalue = str.indexOf(Ancode)
    sum += Ancodevalue * ws[i]
  }
  var indexOfc18 = 31 - (sum % 31)
  // fix:  边界问题
  if (indexOfc18 === 31) {
    indexOfc18 = 0
  }
  var c18 = str.charAt(indexOfc18)
  if (c18 !== codes[1]) {
    error = new Error('社会信用代码有误!')
  }
  if (callback) {
    error ? callback(error) : callback()
  } else {
    return error
  }

}

export default checkLicense;