const XLSX = require('xlsx'); const mysql = require('mysql2/promise'); require('dotenv').config(); async function reexamineData() { const connection = await mysql.createConnection({ 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') }); console.log('๐Ÿง [์ „์ˆ˜ ์กฐ์‚ฌ] ์—‘์…€ vs DB ๋ฐ์ดํ„ฐ ๋น„๊ต ๋ถ„์„...'); // 1. ์—‘์…€ ๋ฐ์ดํ„ฐ ๋กœ๋“œ const workbook = XLSX.readFile('asset_pc (2026.06.15).xlsx'); const sheet = workbook.Sheets[workbook.SheetNames[0]]; const excelRows = XLSX.utils.sheet_to_json(sheet); // 2. DB ๋ฐ์ดํ„ฐ ๋กœ๋“œ const [dbRows] = await connection.query(` SELECT id, asset_code, asset_type, user_current, emp_no, current_dept FROM asset_core WHERE id LIKE "PC_20260615_%" `); const dbMap = new Map(); dbRows.forEach(r => dbMap.set(r.id, r)); const report = { total: excelRows.length, publicInExcelWithEmpNo: [], // ์—‘์…€์€ ๊ณต์šฉPC์ธ๋ฐ ์‚ฌ๋ฒˆ์ด ์žˆ๋Š” ๊ฒฝ์šฐ personalInExcelNoEmpNo: [], // ์—‘์…€์€ ๊ฐœ์ธPC์ธ๋ฐ ์‚ฌ๋ฒˆ์ด ์—†๋Š” ๊ฒฝ์šฐ typeMismatch: [], // ์—‘์…€๊ณผ DB์˜ asset_type์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ userMismatch: [] // ์‚ฌ์šฉ์ž๋ช…์ด ํฌ๊ฒŒ ๋‹ค๋ฅธ ๊ฒฝ์šฐ }; for (let i = 0; i < excelRows.length; i++) { const ex = excelRows[i]; const id = `PC_20260615_${String(i + 1).padStart(4, '0')}`; const db = dbMap.get(id); if (!db) continue; const exType = ex.asset_type || '๊ฐœ์ธPC'; const exEmpNo = ex.emp_no ? String(ex.emp_no) : null; const exUser = ex.user_current || ''; // A. ๊ณต์šฉPC์ธ๋ฐ ์‚ฌ๋ฒˆ์ด ์žˆ๋Š” ๊ฒฝ์šฐ (๊ฐ€์žฅ ํฐ ํ˜ผ๋ž€ ํฌ์ธํŠธ) if (exType === '๊ณต์šฉPC' && exEmpNo) { report.publicInExcelWithEmpNo.push({ id, exUser, exEmpNo, exDept: ex.current_dept }); } // B. ๊ฐœ์ธPC์ธ๋ฐ ์‚ฌ๋ฒˆ์ด ์—†๋Š” ๊ฒฝ์šฐ if (exType === '๊ฐœ์ธPC' && !exEmpNo) { report.personalInExcelNoEmpNo.push({ id, exUser, exDept: ex.current_dept }); } // C. DB์™€์˜ ํƒ€์ž… ๋ถˆ์ผ์น˜ (ํ˜„์žฌ DB ์ƒํƒœ ์ฒดํฌ) if (db.asset_type !== exType) { report.typeMismatch.push({ id, exType, dbType: db.asset_type, user: db.user_current }); } } console.log('\n================================================'); console.log(`๐Ÿ“Š ์ „์ˆ˜ ์กฐ์‚ฌ ์š”์•ฝ (์ด ${report.total}๊ฑด)`); console.log(`1. ์—‘์…€์€ '๊ณต์šฉPC'์ด๋‚˜ '์‚ฌ๋ฒˆ'์ด ์žˆ๋Š” ํ•ญ๋ชฉ: ${report.publicInExcelWithEmpNo.length}๊ฑด`); console.log(`2. ์—‘์…€์€ '๊ฐœ์ธPC'์ด๋‚˜ '์‚ฌ๋ฒˆ'์ด ์—†๋Š” ํ•ญ๋ชฉ: ${report.personalInExcelNoEmpNo.length}๊ฑด`); console.log(`3. ํ˜„์žฌ DB์™€ ์—‘์…€์˜ '์ž์‚ฐ์œ ํ˜•' ๋ถˆ์ผ์น˜: ${report.typeMismatch.length}๊ฑด`); console.log('================================================\n'); if (report.publicInExcelWithEmpNo.length > 0) { console.log('โš ๏ธ [๊ทธ๋ฃน 1] ๊ณต์šฉPC์ธ๋ฐ ์‹ค์‚ฌ์šฉ์ž/๊ด€๋ฆฌ์ž๊ฐ€ ์ง€์ •๋œ ์‚ฌ๋ก€ (์ƒ˜ํ”Œ 15๊ฑด):'); console.table(report.publicInExcelWithEmpNo.slice(0, 15)); } if (report.personalInExcelNoEmpNo.length > 0) { console.log('\nโš ๏ธ [๊ทธ๋ฃน 2] ๊ฐœ์ธPC์ธ๋ฐ ์‚ฌ๋ฒˆ ์ •๋ณด๊ฐ€ ๋ˆ„๋ฝ๋œ ์‚ฌ๋ก€ (์ƒ˜ํ”Œ 15๊ฑด):'); console.table(report.personalInExcelNoEmpNo.slice(0, 15)); } await connection.end(); } reexamineData().catch(console.error);