import mysql from 'mysql2/promise'; import dotenv from 'dotenv'; dotenv.config(); const pool = mysql.createPool({ host: process.env.DB_HOST, user: process.env.DB_USER, password: process.env.DB_PASS, database: process.env.DB_NAME, port: parseInt(process.env.DB_PORT || '3306'), }); async function run() { const connection = await pool.getConnection(); try { // 먼저 잘못 들어간 0000-00-01 등 복구 console.log('잘못된 형식(0000-00-01 등)을 초기화합니다...'); await connection.query("UPDATE asset_core SET purchase_date = '-' WHERE purchase_date LIKE '0000%' OR purchase_date = '2020-01-01'"); const [rows] = await connection.query('SELECT id, asset_code, purchase_date, category FROM asset_core'); const updates = []; const missing = []; for (const row of rows) { const code = (row.asset_code || '').trim(); const currentVal = (row.purchase_date || '').trim(); // 구매일자가 없거나 '-', 'undefined' 인 경우 대상 if (!currentVal || currentVal === '-' || currentVal === 'undefined') { let inferredDate = null; // 1. PREFIX-YYYYMM-NNNN 형식 (예: PC-202406-0001) const match6 = code.match(/[A-Z]+-(\d{4})(0[1-9]|1[0-2])-\d+/); if (match6) { inferredDate = `${match6[1]}-${match6[2]}-01`; } else { // 2. PREFIX-YYYYNN 형식 (예: PC-202423) -> 연도만 있고 뒤에 순번 2자리 const matchYearSeq = code.match(/[A-Z]+-(20\d{2})(\d{2})$/); if (matchYearSeq) { inferredDate = `${matchYearSeq[1]}-01-01`; // 월을 모르므로 1월로 통일 } else { // 3. PREFIX-YYNNN 형식 (예: PC-24001) const matchShort = code.match(/[A-Z]+-(1\d|2\d)(\d{3})/); if (matchShort) { inferredDate = `20${matchShort[1]}-01-01`; } } } // 0000 등의 잘못된 매칭 방지 if (inferredDate && !inferredDate.startsWith('0000')) { updates.push({ id: row.id, date: inferredDate, code: code }); } else { missing.push({ id: row.id, code: code, category: row.category }); } } } console.log(`총 ${updates.length}건의 자산을 업데이트합니다.`); for (const item of updates) { await connection.query('UPDATE asset_core SET purchase_date = ? WHERE id = ?', [item.date, item.id]); console.log(`[Update] ${item.code} -> ${item.date}`); } console.log('\n--- 구매일자를 추정할 수 없는 자산 목록 ---'); if (missing.length === 0) { console.log('없음'); } else { // 중복 제거 및 정렬하여 보고 const uniqueMissing = missing.filter(m => m.code !== ''); uniqueMissing.forEach(m => { console.log(`[Missing] 코드: ${m.code.padEnd(20)} | 카테고리: ${m.category}`); }); } console.log(`\n완료: ${updates.length}건 업데이트됨, ${missing.length}건 미결정.`); } catch (err) { console.error('Error:', err); } finally { connection.release(); pool.end(); } } run();