70 lines
2.6 KiB
JavaScript
70 lines
2.6 KiB
JavaScript
const XLSX = require('xlsx');
|
|
const mysql = require('mysql2/promise');
|
|
require('dotenv').config();
|
|
|
|
async function deepAudit() {
|
|
const workbook = XLSX.readFile('asset_pc (2026.06.15).xlsx');
|
|
const sheet = workbook.Sheets[workbook.SheetNames[0]];
|
|
const excelData = XLSX.utils.sheet_to_json(sheet);
|
|
|
|
console.log('📊 [Excel Audit] Total Rows:', excelData.length);
|
|
|
|
// 1. 엑셀 내 asset_type 종류 확인
|
|
const excelTypes = new Set();
|
|
excelData.forEach(r => excelTypes.add(r.asset_type));
|
|
console.log('Excel Asset Types:', Array.from(excelTypes));
|
|
|
|
// 2. '공용' 키워드가 들어간 모든 행 추출
|
|
const publicKeywords = ['공용', '공통', '테스트', 'TEST'];
|
|
const potentialPublicInExcel = excelData.filter(r => {
|
|
const name = String(r.user_current || '');
|
|
const type = String(r.asset_type || '');
|
|
const memo = String(r.memo || '');
|
|
return publicKeywords.some(k => name.includes(k) || type.includes(k) || memo.includes(k)) || !r.emp_no;
|
|
});
|
|
|
|
console.log(`\n🔍 [Potential Public/Issue Rows in Excel]: ${potentialPublicInExcel.length}건`);
|
|
console.table(potentialPublicInExcel.slice(0, 30).map(r => ({
|
|
emp_no: r.emp_no,
|
|
user: r.user_current,
|
|
dept: r.current_dept,
|
|
type: r.asset_type,
|
|
memo: r.memo
|
|
})));
|
|
|
|
// 3. DB와 대조 (특히 엑셀엔 사번이 있는데 DB엔 공용으로 된 게 있는지)
|
|
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')
|
|
});
|
|
|
|
const [dbRows] = await connection.query('SELECT id, user_current, emp_no, asset_type FROM asset_core WHERE id LIKE "PC_20260615_%"');
|
|
|
|
// 엑셀은 개인PC인데 DB는 공용인 경우 (또는 그 반대)
|
|
const issues = [];
|
|
for (let i = 0; i < excelData.length; i++) {
|
|
const ex = excelData[i];
|
|
const id = `PC_20260615_${String(i + 1).padStart(4, '0')}`;
|
|
const db = dbRows.find(r => r.id === id);
|
|
|
|
if (!db) continue;
|
|
|
|
const isExcelPublic = !ex.emp_no || String(ex.user_current).includes('공용');
|
|
const isDbPublic = !db.emp_no || String(db.user_current).includes('공용');
|
|
|
|
if (isExcelPublic !== isDbPublic) {
|
|
issues.push({ id, excel_user: ex.user_current, db_user: db.user_current, excel_emp: ex.emp_no, db_emp: db.emp_no });
|
|
}
|
|
}
|
|
|
|
console.log(`\n⚠️ [Consistency Issues]: ${issues.length}건`);
|
|
if (issues.length > 0) console.table(issues);
|
|
|
|
await connection.end();
|
|
}
|
|
|
|
deepAudit().catch(console.error);
|