feat(round-15): 跨境多币种发票税额/线索自动化阶段跃升/名片私密访问锁/芯片激光标刻排版 (P1/P2功能达成)
这个提交包含在:
@@ -0,0 +1,77 @@
|
||||
import {
|
||||
NfcEngravingSpecService,
|
||||
formatUidForLaserEngrave,
|
||||
calculateIso7064CheckDigit,
|
||||
generateLaserEngravingVectorSpec,
|
||||
LaserEngravingOptions,
|
||||
} from '../../../src/modules/nfc/service/engraving';
|
||||
|
||||
describe('Point 60 (P2): 实体卡芯片激光雕刻排版规范与校验码生成', () => {
|
||||
let service: NfcEngravingSpecService;
|
||||
const mockUid = '04a1b2c3d4e5f6';
|
||||
|
||||
beforeEach(() => {
|
||||
service = new NfcEngravingSpecService();
|
||||
});
|
||||
|
||||
describe('1. formatUidForLaserEngrave & calculateIso7064CheckDigit', () => {
|
||||
it('应将原始 14 位 HEX UID 规范格式化为大写带冒号分隔', () => {
|
||||
const formatted = formatUidForLaserEngrave(mockUid);
|
||||
expect(formatted).toBe('04:A1:B2:C3:D4:E5:F6');
|
||||
});
|
||||
|
||||
it('应基于 UID 计算 ISO 7064 模数校验位,供产线扫码枪二次防伪复核', () => {
|
||||
const checkDigit = calculateIso7064CheckDigit(mockUid);
|
||||
expect(typeof checkDigit).toBe('string');
|
||||
expect(checkDigit).toHaveLength(2);
|
||||
expect(/^[0-9]{2}$/.test(checkDigit)).toBe(true);
|
||||
});
|
||||
|
||||
it('非法 UID (长度不等于 14 字符或非 HEX) 抛出明确校验异常', () => {
|
||||
expect(() => formatUidForLaserEngrave('INVALID')).toThrow();
|
||||
expect(() => calculateIso7064CheckDigit('12345')).toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
describe('2. generateLaserEngravingVectorSpec (激光雕刻排版与矢量参数生成)', () => {
|
||||
const options: LaserEngravingOptions = {
|
||||
uid: mockUid,
|
||||
holderName: 'Alex Zheng',
|
||||
company: 'OmniCard Global Ltd.',
|
||||
cardMaterial: 'MATTE_BLACK_METAL',
|
||||
};
|
||||
|
||||
it('金属卡应配置适宜的激光功率 (Power=35%) 与标刻速率', () => {
|
||||
const spec = generateLaserEngravingVectorSpec(options);
|
||||
|
||||
expect(spec.laserSettings.powerPercent).toBe(35);
|
||||
expect(spec.laserSettings.speedMmPerSec).toBe(1200);
|
||||
expect(spec.laserSettings.frequencyKhz).toBe(30);
|
||||
|
||||
// 文本坐标盒
|
||||
expect(spec.elements.find(e => e.type === 'UID_TEXT')?.text).toBe('04:A1:B2:C3:D4:E5:F6');
|
||||
expect(spec.elements.find(e => e.type === 'HOLDER_NAME')?.text).toBe('Alex Zheng');
|
||||
});
|
||||
|
||||
it('支持包含防伪校验序列号与背部居中排布', () => {
|
||||
const spec = generateLaserEngravingVectorSpec(options);
|
||||
const serialElem = spec.elements.find(e => e.type === 'SECURITY_SERIAL');
|
||||
|
||||
expect(serialElem).toBeDefined();
|
||||
expect(serialElem?.text.startsWith('SN-')).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('3. NfcEngravingSpecService 批量产线文件生成', () => {
|
||||
it('应能为成批卡片一键生成激光机执行作业清单', async () => {
|
||||
const result = await service.generateBatchEngravingJob([
|
||||
{ uid: '04a1b2c3d4e5f6', holderName: 'Arthur', cardMaterial: 'MATTE_BLACK_METAL' },
|
||||
{ uid: '04b1c2d3e4f5a6', holderName: 'Tariq', cardMaterial: 'GOLD_METAL' },
|
||||
]);
|
||||
|
||||
expect(result.jobId).toBeDefined();
|
||||
expect(result.cardCount).toBe(2);
|
||||
expect(result.specs.length).toBe(2);
|
||||
});
|
||||
});
|
||||
});
|
||||
在新工单中引用
屏蔽一个用户