feat: update backend OCR parser, web app, mobile app camera/preview UI, tests, and documentation with sample images
This commit is contained in:
1 parent
aa3233e411
commit
bdb3a49742
71 files changed
+3360
-764
No files matched your search
@@ -0,0 +1,114 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const { Client } = require('pg');
|
||||
|
||||
async function main() {
|
||||
console.log('=== STARTING SKU MASTER TSV IMPORT ===');
|
||||
|
||||
const client = new Client({
|
||||
host: 'paddleocr-db',
|
||||
port: 5432,
|
||||
user: 'postgres',
|
||||
password: 'postgres',
|
||||
database: 'dopfm'
|
||||
});
|
||||
|
||||
try {
|
||||
await client.connect();
|
||||
console.log('Connected to database.');
|
||||
|
||||
// 1. Alter table to add new packaging columns if they don't exist
|
||||
console.log('Ensuring table schema has new packaging columns...');
|
||||
await client.query(`
|
||||
ALTER TABLE sku_master ADD COLUMN IF NOT EXISTS standar_jumlah VARCHAR(50);
|
||||
ALTER TABLE sku_master ADD COLUMN IF NOT EXISTS berat_kemasan NUMERIC(10, 3);
|
||||
ALTER TABLE sku_master ADD COLUMN IF NOT EXISTS isi_outer_kg NUMERIC(10, 3);
|
||||
ALTER TABLE sku_master ADD COLUMN IF NOT EXISTS isi_outer_pac INTEGER;
|
||||
ALTER TABLE sku_master ADD COLUMN IF NOT EXISTS jenis_outer VARCHAR(50);
|
||||
`);
|
||||
console.log('Table schema verified/updated.');
|
||||
|
||||
// 2. Truncate old data
|
||||
console.log('Clearing old SKU master data...');
|
||||
await client.query('TRUNCATE TABLE sku_master RESTART IDENTITY CASCADE');
|
||||
console.log('Old SKU master data cleared.');
|
||||
|
||||
// 3. Read and parse TSV file
|
||||
const tsvPath = path.join(__dirname, 'sku_master.tsv');
|
||||
if (!fs.existsSync(tsvPath)) {
|
||||
throw new Error(`File not found at ${tsvPath}`);
|
||||
}
|
||||
|
||||
const tsvContent = fs.readFileSync(tsvPath, 'utf8');
|
||||
const lines = tsvContent.split(/\r?\n/);
|
||||
|
||||
let insertCount = 0;
|
||||
let skipCount = 0;
|
||||
|
||||
console.log(`Parsing ${lines.length} lines from TSV...`);
|
||||
|
||||
// We start from line 5 (0-indexed 4 is the header row, lines before are title headers)
|
||||
for (let i = 5; i < lines.length; i++) {
|
||||
const line = lines[i].trim();
|
||||
if (!line) continue;
|
||||
|
||||
const cols = line.split('\t').map(c => c.trim());
|
||||
if (cols.length < 3) {
|
||||
skipCount++;
|
||||
continue;
|
||||
}
|
||||
|
||||
const noSku = cols[1];
|
||||
const namaItem = cols[2];
|
||||
|
||||
// Verify SKU code format (must be standard 8-digit)
|
||||
if (!noSku || !/^\d{8}$/.test(noSku)) {
|
||||
skipCount++;
|
||||
continue;
|
||||
}
|
||||
|
||||
const standarJumlah = cols[3] || null;
|
||||
|
||||
// Parse numeric columns
|
||||
const beratKemasan = cols[4] ? parseFloat(cols[4].replace(',', '.')) : null;
|
||||
const isiOuterKg = cols[5] ? parseFloat(cols[5].replace(',', '.')) : null;
|
||||
const isiOuterPac = cols[6] ? parseInt(cols[6], 10) : null;
|
||||
const jenisOuter = cols[7] || null;
|
||||
|
||||
await client.query(`
|
||||
INSERT INTO sku_master (
|
||||
no_sku, nama_item, standar_jumlah, berat_kemasan, isi_outer_kg, isi_outer_pac, jenis_outer
|
||||
) VALUES ($1, $2, $3, $4, $5, $6, $7)
|
||||
ON CONFLICT (no_sku) DO UPDATE SET
|
||||
nama_item = EXCLUDED.nama_item,
|
||||
standar_jumlah = EXCLUDED.standar_jumlah,
|
||||
berat_kemasan = EXCLUDED.berat_kemasan,
|
||||
isi_outer_kg = EXCLUDED.isi_outer_kg,
|
||||
isi_outer_pac = EXCLUDED.isi_outer_pac,
|
||||
jenis_outer = EXCLUDED.jenis_outer
|
||||
`, [
|
||||
noSku,
|
||||
namaItem,
|
||||
standarJumlah,
|
||||
isNaN(beratKemasan) ? null : beratKemasan,
|
||||
isNaN(isiOuterKg) ? null : isiOuterKg,
|
||||
isNaN(isiOuterPac) ? null : isiOuterPac,
|
||||
jenisOuter
|
||||
]);
|
||||
|
||||
insertCount++;
|
||||
}
|
||||
|
||||
console.log(`\nImport Completed Successfully:`);
|
||||
console.log(`- Inserted/Updated: ${insertCount} SKU records`);
|
||||
console.log(`- Skipped (headers/invalid): ${skipCount} lines`);
|
||||
|
||||
} catch (err) {
|
||||
console.error('Import process failed:', err);
|
||||
} finally {
|
||||
await client.end();
|
||||
console.log('Database connection closed.');
|
||||
}
|
||||
}
|
||||
|
||||
main();
|
||||
Reference in new issue
Block a user