This commit is contained in:
2026-09-24 16:25:22 +08:00
commit 7428184f01
1198 changed files with 314515 additions and 0 deletions
@@ -0,0 +1,70 @@
class code128b {
// 输入数据
data = ""
// Code 128 模式表:索引0..106 -> 二进制模块串(1=黑,0=白),来自业界通用表
// 参考:StartB=104 -> 11010010000, Stop=106 -> 1100011101011
private static PATTERNS = [
"11011001100","11001101100","11001100110","10010011000","10010001100","10001001100",
"10011001000","10011000100","10001100100","11001001000","11001000100","11000100100",
"10110011100","10011011100","10011001110","10111001100","10011101100","10011100110",
"11001110010","11001011100","11001001110","11011100100","11001110100","11101101110",
"11101001100","11100101100","11100100110","11101100100","11100110100","11100110010",
"11011011000","11011000110","11000110110","10100011000","10001011000","10001000110",
"10110001000","10001101000","10001100010","11010001000","11000101000","11000100010",
"10110111000","10110001110","10001101110","10111011000","10111000110","10001110110",
"11101110110","11010001110","11000101110","11011101000","11011100010","11011101110",
"11101011000","11101000110","11100010110","11101101000","11101100010","11100011010",
"11101111010","11001000010","11110001010","10100110000","10100001100","10010110000",
"10010000110","10000101100","10000100110","10110010000","10110000100","10011010000",
"10011000010","10000110100","10000110010","11000010010","11001010000","11110111010",
"11000010100","10001111010","10100111100","10010111100","10010011110","10111100100",
"10011110100","10011110010","11110100100","11110010100","11110010010","11011011110",
"11011110110","11110110110","10101111000","10100011110","10001011110","10111101000",
"10111100010","11110101000","11110100010","10111011110","10111101110","11101011110",
"11110101110","11010000100","11010010000","11010011100","1100011101011"
]
// Code Set B: 字符到值(0..95 => ASCII 32..127
private mapCharToValueB(ch:string):number {
const code = ch.charCodeAt(0)!;
if (code < 32 || code > 127) {
return -1
}
return code - 32
}
constructor(text:string) {
this.data = text
}
encode():string {
if (this.data.length == 0) return ""
const values = [] as number[]
for (let i = 0; i < this.data.length; i++) {
values.push(this.mapCharToValueB(this.data.charAt(i)))
}
// 起始码 CodeB=104
const startVal = 104
let checksum = startVal
for (let i = 0; i < values.length; i++) {
checksum += values[i] * (i + 1)
}
checksum = checksum % 103
// 组合:StartB + 数据 + 校验 + Stop
const bits = [] as string[]
bits.push(code128b.PATTERNS[startVal])
for (let i = 0; i < values.length; i++) {
bits.push(code128b.PATTERNS[values[i]])
}
bits.push(code128b.PATTERNS[checksum])
// Stop=106
bits.push(code128b.PATTERNS[106])
return bits.join("")
}
}
export { code128b };
@@ -0,0 +1,87 @@
/**
* 商品条码严格按照国际通用码
* @author tmzdy
* @description 资料参考:https://zhuanlan.zhihu.com/p/120676811
*/
class ean13 {
//编码数据
data=""
//护码
safeCode = "101"
middleCode = "01010"
//编码方式,我们中国是6:LGGGLL
EAN13_STRUCTURE = [
'LLLLLL', 'LLGLGG', 'LLGGLG', 'LLGGGL', 'LGLLGG',
'LGGLLG', 'LGGGLL', 'LGLGLG', 'LGLGGL', 'LGGLGL'
];
constructor(text:string) {
let data = text;
if (data.search(/^[0-9]{12}$/)!== -1 as number ) {
data += (this.checksum(data)).toString();
}
this.data = data.toUpperCase();
}
//校验码。
checksum(codestr:string):number{
const res = codestr.substring(0, 12).split('')
const resNumber = res.map((n:string):number => parseInt(n))
const jg=resNumber.reduce((sum:number, a:number, idx:number):number => (idx % 2) > 0 ? sum + a * 3 : sum + a, 0);
return (10 - (jg % 10)) % 10;
}
//按钮编码规则提取逻辑值,
getEan13Str(key:string):string[]{
if(key=="L") return [
'0001101', '0011001', '0010011', '0111101', '0100011',
'0110001', '0101111', '0111011', '0110111', '0001011'
]
if(key=="G") return [
'0100111', '0110011', '0011011', '0100001', '0011101',
'0111001', '0000101', '0010001', '0001001', '0010111'
]
if(key=="R") return [
'1110010', '1100110', '1101100', '1000010', '1011100',
'1001110', '1010000', '1000100', '1001000', '1110100'
]
return [] as string[];
}
encodeByGuzhe(dataStr:string, structure:string):string{
let encoded = dataStr.split('')
let atrartys = [] as string[][]
for(let i=0;i<encoded.length;i++){
let chart = structure.substring(i,i+1)
atrartys.push(this.getEan13Str(chart))
}
let encoded_str = atrartys.map((val:string[], idx:number):string => {
let stur = dataStr.substring(idx,idx+1)
return val[parseInt(stur)]
});
return encoded_str.join("")
};
encode():string[] {
// 取编码方式。
let codeFang = this.EAN13_STRUCTURE[parseInt(this.data.substring(0,1))]
//取后面的12位数字
let data = this.data.substring(1,13)
let leftCode = data.substring(0,6)
let rightCode = data.substring(6,13)
let left_code_str = this.encodeByGuzhe(leftCode,codeFang);
//右资料码按规则是物料码+校验码
let right_code_str = this.encodeByGuzhe(rightCode,"RRRRRR");
// 组合码制
//护码+左资料码+中间码+右资料码+护码
// let totalcode = this.safeCode+left_code_str+this.middleCode+right_code_str+this.safeCode
return [this.safeCode,left_code_str,this.middleCode,right_code_str,this.safeCode]
}
}
export { ean13 };