89 lines
3.2 KiB
JavaScript
89 lines
3.2 KiB
JavaScript
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();
|