const XLSX = require('xlsx'); const mysql = require('mysql2/promise'); const dotenv = require('dotenv'); const path = require('path'); dotenv.config({ path: path.join(__dirname, '../.env') }); const { DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT } = process.env; async function restoreAndMerge() { const connection = await mysql.createConnection({ host: DB_HOST, user: DB_USER, password: DB_PASS, database: DB_NAME, port: parseInt(DB_PORT || '3306') }); console.log('๐Ÿ”„ ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ ๋ฐ ๋ณ‘ํ•ฉ ์‹œ์ž‘...'); // 1. ๋ฐฑ์—… ํŒŒ์ผ์—์„œ ๊ธฐ์กด ๋ฐ์ดํ„ฐ(212๊ฑด) ๋กœ๋“œ const workbookBackup = XLSX.readFile('backupDB_20260602.xlsx'); const oldUsers = XLSX.utils.sheet_to_json(workbookBackup.Sheets['system_users']); // 2. ์‹ ๊ทœ ํŒŒ์ผ์—์„œ ๋ฐ์ดํ„ฐ(987๊ฑด) ๋กœ๋“œ const workbookNew = XLSX.readFile('system_User (20260615).xlsx'); const newUsers = XLSX.utils.sheet_to_json(workbookNew.Sheets[workbookNew.SheetNames[0]]); console.log(`๊ธฐ๋ณธ ๋ฐฑ์—… ๋ฐ์ดํ„ฐ: ${oldUsers.length}๊ฑด`); console.log(`์‹ ๊ทœ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ: ${newUsers.length}๊ฑด`); // ํ…Œ์ด๋ธ” ๋น„์šฐ๊ธฐ (์‹ค์ˆ˜๋ฅผ ๋ฐ”๋กœ์žก๊ธฐ ์œ„ํ•ด ๋‹ค์‹œ ์‹œ์ž‘) await connection.query('DELETE FROM system_users'); const insertedEmpNos = new Set(); let restoreCount = 0; let addCount = 0; // 3. ๊ธฐ์กด ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ (ID ๋ณด์กด ์‹œ๋„) for (const user of oldUsers) { const { id, emp_no, user_name, dept_name, position, status, created_at } = user; // ์—‘์…€ ๋‚ ์งœ ์ฒ˜๋ฆฌ (์ˆซ์ž๋กœ ๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ) let finalCreatedAt = created_at; if (typeof created_at === 'number') { const date = new Date((created_at - 25569) * 86400 * 1000); finalCreatedAt = date.toISOString().replace('T', ' ').substring(0, 19); } try { await connection.query( 'INSERT INTO system_users (id, emp_no, user_name, dept_name, position, status, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)', [id, String(emp_no), user_name, dept_name, position, status, finalCreatedAt] ); insertedEmpNos.add(String(emp_no)); restoreCount++; } catch (err) { console.error(`โŒ ๋ณต๊ตฌ ์‹คํŒจ (emp_no: ${emp_no}):`, err.message); } } // 4. ์‹ ๊ทœ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ (์ค‘๋ณต ์ œ์™ธ) for (let i = 0; i < newUsers.length; i++) { const user = newUsers[i]; const { emp_no, user_name, dept_name, position, status } = user; const strEmpNo = String(emp_no); if (insertedEmpNos.has(strEmpNo)) { continue; // ์ด๋ฏธ ๋ณต๊ตฌ๋œ ๋ฐ์ดํ„ฐ๋Š” ์Šคํ‚ต } // ์‹ ๊ทœ ๋ฐ์ดํ„ฐ์šฉ ID ์ƒ์„ฑ (๊ธฐ์กด ID์™€ ๊ฒน์น˜์ง€ ์•Š๊ฒŒ 'NEW_' ์ ‘๋‘์–ด ๋˜๋Š” ์‹œํ€€์Šค ์‚ฌ์šฉ) // ์—ฌ๊ธฐ์„œ๋Š” ๋‹จ์ˆœํžˆ ์‹œํ€€์Šค๋กœ ์ฒ˜๋ฆฌ (์ตœ๋Œ€ ID ํ™•์ธ ํ›„ +1 ํ•˜๋Š” ๋ฐฉ์‹์ด ์ข‹์œผ๋‚˜ ์—ฌ๊ธฐ์„  ๊ฐ„๋‹จํžˆ) const id = `USR_N_${String(i + 1).padStart(4, '0')}`; const createdAt = new Date().toISOString().replace('T', ' ').substring(0, 19); try { await connection.query( 'INSERT INTO system_users (id, emp_no, user_name, dept_name, position, status, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)', [id, strEmpNo, user_name, dept_name, position, status, createdAt] ); addCount++; } catch (err) { console.error(`โŒ ์ถ”๊ฐ€ ์‹คํŒจ (emp_no: ${emp_no}):`, err.message); } } console.log(`โœ… ๋ณต๊ตฌ ์™„๋ฃŒ: ๊ธฐ์กด ${restoreCount}๊ฑด ๋ณต๊ตฌ, ์‹ ๊ทœ ${addCount}๊ฑด ์ถ”๊ฐ€ (์ด ${restoreCount + addCount}๊ฑด)`); await connection.end(); } restoreAndMerge().catch(console.error);