Barcode-Teilenummer allein genuegt fuer Gruen, bekannter Code ueberspringt OCR

Der Teilenummer-Decoder kennt bislang nur das Samsung-Schema; ein Hynix-Modul
mit einwandfrei gelesenem, aber unbekanntem Barcode-Schema endete deshalb in
Rot. Zum Sortieren muss keine Kapazitaet bekannt sein - eine exakt gelesene
Teilenummer genuegt, um ein Modul wiederzuerkennen. recognize() greift jetzt
erst dann auf Rot zurueck, wenn auch die Texterkennung keine Kapazitaet und
keine eindeutige Teilenummer liefert; die bestehende Vorsicht bei
widerspruechlichen unverwertbaren Barcodes bleibt dabei unangetastet.

Zusaetzlich kann recognize() jetzt ueber deps.isKnownCode (optional) erfahren,
dass ein gelesener Code bereits einem Stapel bekannt ist, und die bis zu 20
Sekunden dauernde Texterkennung dann ueberspringen. Ohne diese Abhaengigkeit
verhaelt sich die Pipeline unveraendert. recognize() liefert zusaetzlich die
rohen gelesenen Barcode-Inhalte (codes), damit session.js sie einem Stapel
zuordnen kann.
This commit is contained in:
vchuser
2026-07-29 09:05:05 +02:00
parent 70f6a4fbce
commit 661bd07a26
2 changed files with 121 additions and 6 deletions
+90
View File
@@ -191,3 +191,93 @@ test('zwei unverwertbare Barcodes, die sich nur in einer Verwechslung unterschei
assert.equal(result.confidence, 'yellow');
assert.equal(result.spec.partNumber, '732O773');
});
// --- Erweiterung: unbekanntes Nummernschema mit gelesener Teilenummer genuegt fuer Gruen ---
test('Barcode mit unbekanntem Nummernschema und gelesener Teilenummer ergibt gruen, auch ohne Kapazitaet', async () => {
const result = await recognize({}, {
// Hynix-Teilenummer: Schema unbekannt (nur Samsung ist hinterlegt), aber
// exakt gelesen - und OCR findet auf dem Etikett ebenfalls nichts
// Verwertbares. Trotzdem genuegt die gelesene Teilenummer fuer Gruen.
decodeBarcodes: async () => ['HMA84GL7AFR4N-UH'],
runOcr: async () => '',
});
assert.equal(result.source, 'barcode');
assert.equal(result.confidence, 'green');
assert.equal(result.spec.partNumber, 'HMA84GL7AFR4N-UH');
assert.equal(result.spec.capacityGb, null);
});
test('findet OCR trotz unbekanntem Nummernschema eine Kapazitaet, wird sie uebernommen (weiterhin gelb, nicht gruen)', async () => {
const result = await recognize({}, {
decodeBarcodes: async () => ['HMA84GL7AFR4N-UH'],
runOcr: async () => OCR_TEXT,
});
assert.equal(result.source, 'ocr');
assert.equal(result.confidence, 'yellow');
assert.equal(result.spec.capacityGb, 64);
// Die Teilenummer aus dem Barcode ist exakter und bleibt erhalten.
assert.equal(result.spec.partNumber, 'HMA84GL7AFR4N-UH');
});
test('widersprechende unverwertbare Barcodes ohne jede OCR-Kapazitaet: die Vorsicht bleibt erhalten, kein Gruen', () => recognize({}, {
decodeBarcodes: async () => ['7325773', '9999999'],
runOcr: async () => '',
}).then((result) => {
assert.equal(result.source, 'none');
assert.equal(result.confidence, 'red');
}));
test('recognize liefert die gelesenen Rohcodes zur Weitergabe an die Stapelzuordnung', async () => {
const result = await recognize({}, {
decodeBarcodes: async () => ['HMA84GL7AFR4N-UH', 'SN-000123'],
runOcr: async () => '',
});
assert.deepEqual([...result.codes].sort(), ['HMA84GL7AFR4N-UH', 'SN-000123'].sort());
});
// --- Erweiterung: ein bekannter Code ueberspringt die Texterkennung ---
test('bekannter Code ueberspringt die Texterkennung vollstaendig', async () => {
let ocrCalled = false;
const result = await recognize({}, {
decodeBarcodes: async () => ['HMA84GL7AFR4N-UH'],
runOcr: async () => { ocrCalled = true; return ''; },
isKnownCode: (code) => code === 'HMA84GL7AFR4N-UH',
});
assert.equal(ocrCalled, false, 'ein bekannter Code macht die Texterkennung ueberfluessig');
assert.equal(result.source, 'barcode');
assert.equal(result.confidence, 'green');
});
test('bekannter Code unter mehreren Codes ueberspringt die Texterkennung trotzdem (Seriennummer laeuft ins Leere)', async () => {
let ocrCalled = false;
const result = await recognize({}, {
decodeBarcodes: async () => ['HMA84GL7AFR4N-UH', 'SN-000123'],
runOcr: async () => { ocrCalled = true; return ''; },
isKnownCode: (code) => code === 'HMA84GL7AFR4N-UH',
});
assert.equal(ocrCalled, false);
assert.equal(result.confidence, 'green');
});
test('unbekannter Code (isKnownCode liefert stets false) ueberspringt die Texterkennung nicht', async () => {
let ocrCalled = false;
const result = await recognize({}, {
decodeBarcodes: async () => ['HMA84GL7AFR4N-UH'],
runOcr: async () => { ocrCalled = true; return ''; },
isKnownCode: () => false,
});
assert.equal(ocrCalled, true);
assert.equal(result.confidence, 'green');
});
test('ohne isKnownCode-Abhaengigkeit bleibt die Pipeline ohne sie lauffaehig (Texterkennung laeuft wie bisher)', async () => {
let ocrCalled = false;
const result = await recognize({}, {
decodeBarcodes: async () => ['HMA84GL7AFR4N-UH'],
runOcr: async () => { ocrCalled = true; return ''; },
});
assert.equal(ocrCalled, true);
assert.equal(result.confidence, 'green');
});