信用代码校验(USCC)
灵感:能力工具箱 uscc-validate(轻量、纯本地)。
何时使用
- 录入/粘贴 18 位统一社会信用代码时做格式与校验位检查。
- CRM 客户建档、工商信息核对,且不能依赖联网接口。
硬约束
- 仅本地算法:不得调用工商/企查类 API;以校验位公式为准。
- 长度与字符集:去空白后转大写,须恰好 18 位;字符集为
0-9A-Z中的 GB 32100 允许字符(无 I/O/Z/S/V)。 - 输出:
valid+ 可读message;可选给出登记管理部门粗分类(首字符),勿编造企业名称。 - 校验位为 0 的情况:取模后映射字符时用
(31 - sum%31) % 31,避免索引越界。 - 交付:给出可运行 JS/TS 片段;说明「通过≠工商登记仍有效」。
推荐算法要点
const CODE_CHARS = '0123456789ABCDEFGHJKLMNPQRTUWXY'
const WEIGHTS = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28]
export function validateUscc(code: string) {
const raw = String(code || '').trim().toUpperCase()
if (!/^[0-9A-Z]{18}$/.test(raw)) {
return { valid: false, message: '格式错误:须 18 位数字或大写字母' }
}
let sum = 0
for (let i = 0; i < 17; i++) {
const idx = CODE_CHARS.indexOf(raw[i])
if (idx < 0) return { valid: false, message: `含非法字符:${raw[i]}` }
sum += idx * WEIGHTS[i]
}
const expect = CODE_CHARS[(31 - (sum % 31)) % 31]
if (expect !== raw[17]) {
return { valid: false, message: `校验位错误,期望 ${expect}` }
}
return { valid: true, message: '校验通过' }
}
Agent 执行步骤
- 实现
validateUscc;输入框失焦或提交前调用。 - 用已知样例与故意改错末位各测 1 次。
- 在 UI/说明中标注:校验通过只表示编码合规,不代表主体存续。
附加
- 说明见 README.md
- 排错见 reference.md
- 模板见 templates/usage.md