haw-utils
Version:
一个基于业务场景的工具方法库
123 lines (112 loc) • 3.74 kB
JavaScript
(function (global, factory) {
if (typeof define === "function" && define.amd) {
define(["exports"], factory);
} else if (typeof exports !== "undefined") {
factory(exports);
} else {
var mod = {
exports: {}
};
factory(mod.exports);
global.isSocialCreditCode = mod.exports;
}
})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports["default"] = void 0;
// 基础规则,由18位数字和大写字母组成,不使用I、O、Z、S、V。
var baseReg = /^[\dA-HJ-NPQRTUWXY]{2}\d{6}[\dA-HJ-NPQRTUWXY]{10}/;
// 基础字符组成
var baseCodeArr = '0123456789ABCDEFGHJKLMNPQRTUWXY'.split('');
//加权因子
var weightFactor = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];
/**
* 获取字符位置
*
* @private
* @param {String} code 字符
* @returns {Number} 字符所在基础字符的位置
*/
function getBaseCodeIndex(code) {
var ret;
baseCodeArr.some(function (item, index) {
if (item === code) {
ret = index;
return true;
}
return false;
});
return ret;
}
/**
* 计算校验码
*
* @private
* @since 1.1.0
* @param {String} preCode 统一代码前17位
* @returns {String} 校验码
*/
function sumCheckCode(preCode) {
// const preCodeArr = preCode.split('');
var total = 0;
// 计算字符位置对应序号和加权因子的乘积,总和
for (var i = 0; i < 17; i++) {
// 字符位置对应的基础编码序号
var index = getBaseCodeIndex(preCode[i]);
// 加权因子
var wf = weightFactor[i];
// 计算序号和加权因子的乘积,并计算级数之和
total += index * wf;
}
// 计算整数求余函数MOD
var remainder = total % 31;
// 校验码字符值序号
var checkCodeIndex = 31 - remainder;
return baseCodeArr[checkCodeIndex];
}
/**
* 检测值是否为统一社会信用代码,也叫三证合一组织代码。由18位数字和大写字母组成,不使用I、O、Z、S、V。
*
* @static
* @alias module:Validator.isSocialCreditCode
* @see {@link https://zh.wikisource.org/zh-hans/GB_32100-2015_法人和其他组织统一社会信用代码编码规则|GB 32100-2015 法人和其他组织统一社会信用代码编码规则}
* @since 1.1.0
* @param {String} value 要检测的值
* @param {Object} [options] 配置项
* @param {Boolean} [options.loose=false] 宽松模式。如果为true,不校验校验位。
* @returns {Boolean} 值是否为统一社会信用代码
* @example
*
* isSocialCreditCode('91350100M000100Y4A3');
* // => true
*
* isSocialCreditCode('91350100M000100Y4AB');
* // => false
*
* // 宽松模式,不校验校验位。所以也可以通过
* isSocialCreditCode('91350100M000100Y4AB', {loose: true});
* // => true
*
*/
function isSocialCreditCode(value) {
var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
_ref$loose = _ref.loose,
loose = _ref$loose === void 0 ? false : _ref$loose;
var passBaseRule = baseReg.test(value);
// 宽松模式 或 基础规则不通过直接返回
if (loose || !passBaseRule) {
return passBaseRule;
}
// 前17位
var preCode = value.substr(0, 17);
// 校验码
var lastCode = value.substr(-1);
// 计算校验码
var checkCode = sumCheckCode(preCode);
return lastCode === checkCode;
}
var _default = isSocialCreditCode;
_exports["default"] = _default;
});