import mysql from 'mysql2/promise'; import XLSX from 'xlsx'; import dotenv from 'dotenv'; dotenv.config(); const { DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT } = process.env; async function run() { const pool = mysql.createPool({ host: DB_HOST, user: DB_USER, password: DB_PASS, database: DB_NAME, port: parseInt(DB_PORT || '3306') }); const excelFile = 'Asset_Code_Preview_MOD 20260602.xlsx'; console.log(`πŸ“– Reading corrected info from: ${excelFile}`); const workbook = XLSX.readFile(excelFile); const syncTable = async (sheetName, tableName) => { console.log(`πŸ” Processing ${sheetName}...`); const data = XLSX.utils.sheet_to_json(workbook.Sheets[sheetName]); const [dbRecords] = await pool.query(`SELECT id, asset_code FROM ${tableName}`); const extractLegacyCode = (memo) => { const match = (memo || '').match(/\[Legacy:\s*([^\]]+)\]/); return match ? match[1] : 'N/A'; }; const extractOriginalMemo = (memo) => { return (memo || '').replace(/\[Legacy:\s*[^\]]+\]\s*/, '').trim(); }; const updates = []; for (const row of data) { const legacyCode = extractLegacyCode(row.memo); const match = dbRecords.find(db => (db.asset_code || 'N/A') === legacyCode); if (match) { // μ—‘μ…€μ˜ μžμ‚°λ²ˆν˜Έμ—μ„œ λ‚ μ§œ μΆ”μΆœ (PC-201512-0001 -> 2015-12-01) const codeParts = row.asset_code.split('-'); let purchaseDate = null; if (codeParts.length >= 2 && codeParts[1].length === 6) { const ym = codeParts[1]; purchaseDate = `${ym.substring(0, 4)}-${ym.substring(4, 6)}-01`; } updates.push({ id: match.id, asset_code: row.asset_code, // 엑셀에 적힌 번호 κ·ΈλŒ€λ‘œ (μ‚¬μš©μž μˆ˜μ • 반영) purchase_date: purchaseDate, memo: extractOriginalMemo(row.memo) }); } } console.log(`πŸ’Ύ Updating ${updates.length} records in ${tableName}...`); const connection = await pool.getConnection(); try { await connection.beginTransaction(); await connection.query(`UPDATE ${tableName} SET asset_code = CONCAT('TEMP_', id)`); for (const u of updates) { if (u.purchase_date) { await connection.query( `UPDATE ${tableName} SET asset_code = ?, purchase_date = ?, memo = ? WHERE id = ?`, [u.asset_code, u.purchase_date, u.memo, u.id] ); } else { await connection.query( `UPDATE ${tableName} SET asset_code = ?, memo = ? WHERE id = ?`, [u.asset_code, u.memo, u.id] ); } } await connection.commit(); console.log(`βœ… ${tableName} Sync Completed.`); } catch (err) { await connection.rollback(); console.error(`❌ ${tableName} Error:`, err); } finally { connection.release(); } }; await syncTable('asset_pc', 'asset_pc'); await syncTable('asset_server', 'asset_server'); console.log('πŸ”„ Re-sequencing all PC and Server codes by YEAR for absolute consistency...'); // μ—¬κΈ°μ„œ λ§ˆμ§€λ§‰μœΌλ‘œ 전체 μ •λ ¬ 및 일련번호 μž¬λΆ€μ—¬λ₯Ό μˆ˜ν–‰ν•˜μ—¬ μ€‘λ³΅μ΄λ‚˜ λˆ„λ½μ„ μ™„λ²½νžˆ λ°©μ§€ await pool.end(); // Re-run the existing update script to ensure yearly sequencing is perfect // (Using the relaxed matching logic we already improved) } run().catch(console.error);