UNPKG

uscc-utils

Version:

Utils about unified social credit code | 统一社会信用代码工具方法

187 lines (183 loc) 3.13 kB
const USCC_PATTERN = ( // cSpell: disable-next-line /[1-9ANY][1-59]\d{6}[\dA-Z]{8}[\dX][\dA-HJ-NP-RTUW-Y]/ ); const USCC_CATEGORY_MAP = { 1: { category: "机构编制", map: { 1: "机关", 2: "事业单位", 3: "编办直接管理机构编制的群众团体", 9: "其他" } }, 2: { category: "外交", map: { 1: "外国常驻新闻机构", 9: "其他" } }, 3: { category: "司法行政", map: { 1: "律师执业机构", 2: "公证处", 3: "基层法律服务所", 4: "司法鉴定机构", 5: "仲裁委员会", 9: "其他" } }, 4: { category: "文化", map: { 1: "外国在华文化中心", 9: "其他" } }, 5: { category: "民政", map: { 1: "社会团体", 2: "民办非企业单位", 3: "基金会", 9: "其他" } }, 6: { category: "旅游", map: { 1: "外国旅游部门常驻代表机构", 2: "港澳台地区旅游部门常驻内地(大陆)代表机构", 9: "其他" } }, 7: { category: "宗教", map: { 1: "宗教活动场所", 2: "宗教院校", 9: "其他" } }, 8: { category: "工会", map: { 1: "基层工会", 9: "其他" } }, 9: { category: "工商", map: { 1: "企业", 2: "个体工商户", 3: "农民专业合作社" } }, A: { category: "中央军委改革和编制办公室", map: { 1: "军队事业单位", 9: "其他" } }, N: { category: "农业", map: { 1: "组级集体经济组织", 2: "村级集体经济组织", 3: "乡镇级集体经济组织", 9: "其他" } }, Y: { category: "其他", map: {} } }; const USCC_LENGTH = 18; const USCC_MOD = 31; const USCC_CHARS = [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "T", "U", "W", "X", "Y" ]; const USCC_WEIGHTS = [ 1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28 ]; function validateUSCC(code) { if (code.length !== USCC_LENGTH) return false; if (!USCC_PATTERN.test(code)) return false; const sum = code.split("").filter((_, idx) => idx < 17).reduce( (acc, char, idx) => acc + USCC_CHARS.indexOf(char) * USCC_WEIGHTS[idx], 0 ); return USCC_CHARS[(USCC_MOD - sum % USCC_MOD) % USCC_MOD] === code.charAt(17); } function parseUSCC(code, options = {}) { const { unknownCategory = "", unknownType = "" } = options; const isValid = validateUSCC(code); if (!isValid) { return { isValid, category: unknownCategory, type: unknownType }; } const matched = USCC_CATEGORY_MAP[code.charAt(0)]; const category = matched.category; const type = matched.map[code.charAt(1)] || unknownType; return { isValid, category, type }; } export { USCC_CATEGORY_MAP, USCC_PATTERN, parseUSCC, validateUSCC };