uscc-utils
Version:
Utils about unified social credit code | 统一社会信用代码工具方法
187 lines (183 loc) • 3.13 kB
JavaScript
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 };