refactor: standardize modal system, unify hardware DB schemas, and implement automatic asset reclassification
This commit is contained in:
178
db_init.js
178
db_init.js
@@ -10,50 +10,28 @@ async function initDB() {
|
||||
host: DB_HOST,
|
||||
user: DB_USER,
|
||||
password: DB_PASS,
|
||||
port: parseInt(DB_PORT || '3306')
|
||||
database: DB_NAME,
|
||||
port: parseInt(DB_PORT || '3306'),
|
||||
multipleStatements: true
|
||||
});
|
||||
|
||||
console.log('🚀 DB 초기화 시작...');
|
||||
console.log('🔄 DB 초기화 시작 (표준화 스키마 적용)...');
|
||||
|
||||
// 1. 데이터베이스 생성
|
||||
await connection.query(`CREATE DATABASE IF NOT EXISTS ${DB_NAME};`);
|
||||
await connection.query(`USE ${DB_NAME};`);
|
||||
console.log(`✅ 데이터베이스 생성 완료: ${DB_NAME}`);
|
||||
// 기존 테이블 삭제
|
||||
const tablesToDrop = ['pc_assets', 'server_assets', 'storage_assets', 'equip_assets', 'mobile_assets', 'sw_sub_assets', 'sw_perm_assets', 'sw_users'];
|
||||
for (const table of tablesToDrop) {
|
||||
await connection.query(`DROP TABLE IF EXISTS ${table}`);
|
||||
}
|
||||
|
||||
// 2. 개인PC 테이블
|
||||
const createPcTable = `
|
||||
CREATE TABLE IF NOT EXISTS pc_assets (
|
||||
id VARCHAR(50) PRIMARY KEY,
|
||||
corp VARCHAR(100) COMMENT '구매법인',
|
||||
asset_code VARCHAR(100) COMMENT '자산번호/코드',
|
||||
user VARCHAR(100) COMMENT '사용자',
|
||||
location VARCHAR(255) COMMENT '설치위치',
|
||||
cpu VARCHAR(255),
|
||||
gpu VARCHAR(255),
|
||||
ram VARCHAR(100),
|
||||
ssd1 VARCHAR(100),
|
||||
ssd2 VARCHAR(100),
|
||||
hdd1 VARCHAR(100),
|
||||
hdd2 VARCHAR(100),
|
||||
ip_address VARCHAR(100),
|
||||
hw_spec TEXT COMMENT 'HW사양 상세',
|
||||
purchase_date VARCHAR(50),
|
||||
price VARCHAR(100),
|
||||
vendor VARCHAR(255),
|
||||
doc_name VARCHAR(255),
|
||||
remarks TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
`;
|
||||
|
||||
// 3. 서버 테이블
|
||||
const createServerTable = `
|
||||
CREATE TABLE IF NOT EXISTS server_assets (
|
||||
// 공통 하드웨어 테이블 생성 함수
|
||||
const createHardwareTable = (tableName, comment) => `
|
||||
CREATE TABLE ${tableName} (
|
||||
id VARCHAR(50) PRIMARY KEY,
|
||||
corp VARCHAR(100) COMMENT '구매법인',
|
||||
asset_code VARCHAR(100) COMMENT '자산번호',
|
||||
purchase_date VARCHAR(50) COMMENT '구매일자',
|
||||
type VARCHAR(50) DEFAULT '물리' COMMENT '물리/가상',
|
||||
type VARCHAR(50) COMMENT '유형',
|
||||
detail_purpose VARCHAR(50) COMMENT '상세용도',
|
||||
purpose VARCHAR(255) COMMENT '용도',
|
||||
details TEXT COMMENT '상세내용',
|
||||
current_org VARCHAR(255) COMMENT '현 사용조직',
|
||||
@@ -74,122 +52,74 @@ async function initDB() {
|
||||
storage2 VARCHAR(255),
|
||||
storage3 VARCHAR(255),
|
||||
monitoring VARCHAR(100),
|
||||
price VARCHAR(100) COMMENT '금액',
|
||||
remarks TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='${comment}';
|
||||
`;
|
||||
|
||||
// 4. 스토리지 테이블
|
||||
const createStorageTable = `
|
||||
CREATE TABLE IF NOT EXISTS storage_assets (
|
||||
id VARCHAR(50) PRIMARY KEY,
|
||||
corp VARCHAR(100) COMMENT '구매법인',
|
||||
type VARCHAR(50) COMMENT '유형',
|
||||
asset_code VARCHAR(100) COMMENT '자산코드',
|
||||
asset_name VARCHAR(255) COMMENT '명칭',
|
||||
location VARCHAR(255) COMMENT '설치위치',
|
||||
model_name VARCHAR(255),
|
||||
capacity VARCHAR(100) COMMENT '용량',
|
||||
manager_main VARCHAR(100) COMMENT '담당자(정)',
|
||||
manager_sub VARCHAR(100) COMMENT '담당자(부)',
|
||||
ip_address VARCHAR(100),
|
||||
mac_address VARCHAR(100),
|
||||
purchase_date VARCHAR(50),
|
||||
price VARCHAR(100),
|
||||
vendor VARCHAR(255),
|
||||
doc_name VARCHAR(255),
|
||||
remarks TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
`;
|
||||
await connection.query(createHardwareTable('pc_assets', '개인PC 자산'));
|
||||
await connection.query(createHardwareTable('server_assets', '서버 자산'));
|
||||
await connection.query(createHardwareTable('storage_assets', '스토리지 자산'));
|
||||
await connection.query(createHardwareTable('equip_assets', '전산비품 자산'));
|
||||
await connection.query(createHardwareTable('mobile_assets', '모바일기기 자산'));
|
||||
|
||||
// 5. 전산비품 테이블
|
||||
const createEquipTable = `
|
||||
CREATE TABLE IF NOT EXISTS equip_assets (
|
||||
id VARCHAR(50) PRIMARY KEY,
|
||||
corp VARCHAR(100) COMMENT '구매법인',
|
||||
type VARCHAR(50) COMMENT '비품유형',
|
||||
asset_code VARCHAR(100) COMMENT '자산코드',
|
||||
asset_name VARCHAR(255) COMMENT '명칭',
|
||||
location VARCHAR(255) COMMENT '설치위치',
|
||||
manager VARCHAR(100) COMMENT '관리자',
|
||||
ip_address VARCHAR(100),
|
||||
mac_address VARCHAR(100),
|
||||
hw_spec TEXT,
|
||||
os VARCHAR(100),
|
||||
purchase_date VARCHAR(50),
|
||||
price VARCHAR(100),
|
||||
vendor VARCHAR(255),
|
||||
doc_name VARCHAR(255),
|
||||
remarks TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
`;
|
||||
|
||||
// 6. 구독SW 테이블
|
||||
// 소프트웨어 구독 테이블
|
||||
const createSubSwTable = `
|
||||
CREATE TABLE IF NOT EXISTS subscription_sw (
|
||||
CREATE TABLE sw_sub_assets (
|
||||
id VARCHAR(50) PRIMARY KEY,
|
||||
category VARCHAR(100) COMMENT '분야',
|
||||
corp VARCHAR(100) COMMENT '구매법인',
|
||||
dept VARCHAR(100) COMMENT '부서',
|
||||
product_name VARCHAR(255) NOT NULL,
|
||||
purchase_date VARCHAR(50),
|
||||
subscription_date VARCHAR(50),
|
||||
price VARCHAR(100),
|
||||
quantity INT DEFAULT 1,
|
||||
account_id VARCHAR(255) COMMENT '계정명',
|
||||
vendor VARCHAR(255),
|
||||
remarks TEXT,
|
||||
asset_code VARCHAR(100) COMMENT '자산번호',
|
||||
product_name VARCHAR(255) COMMENT '제품명',
|
||||
license_type VARCHAR(100) COMMENT '라이선스 유형',
|
||||
quantity INT COMMENT '수량',
|
||||
price VARCHAR(100) COMMENT '금액',
|
||||
purchase_date VARCHAR(50) COMMENT '구매일',
|
||||
expiry_date VARCHAR(50) COMMENT '만료일',
|
||||
vendor VARCHAR(255) COMMENT '납품업체',
|
||||
remarks TEXT COMMENT '비고',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
`;
|
||||
|
||||
// 7. 영구SW 테이블
|
||||
// 소프트웨어 영구 테이블
|
||||
const createPermSwTable = `
|
||||
CREATE TABLE IF NOT EXISTS permanent_sw (
|
||||
CREATE TABLE sw_perm_assets (
|
||||
id VARCHAR(50) PRIMARY KEY,
|
||||
category VARCHAR(100) COMMENT '분야',
|
||||
corp VARCHAR(100) COMMENT '구매법인',
|
||||
dept VARCHAR(100) COMMENT '부서',
|
||||
product_name VARCHAR(255) NOT NULL,
|
||||
purchase_date VARCHAR(50),
|
||||
maintenance_status TINYINT(1) DEFAULT 0,
|
||||
price VARCHAR(100),
|
||||
quantity INT DEFAULT 1,
|
||||
account_id VARCHAR(255) COMMENT '계정명',
|
||||
vendor VARCHAR(255),
|
||||
remarks TEXT,
|
||||
asset_code VARCHAR(100) COMMENT '자산번호',
|
||||
product_name VARCHAR(255) COMMENT '제품명',
|
||||
license_key VARCHAR(255) COMMENT '라이선스 키',
|
||||
quantity INT COMMENT '수량',
|
||||
price VARCHAR(100) COMMENT '금액',
|
||||
purchase_date VARCHAR(50) COMMENT '구매일',
|
||||
vendor VARCHAR(255) COMMENT '납품업체',
|
||||
remarks TEXT COMMENT '비고',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
`;
|
||||
|
||||
// 8. SW 사용자 매핑 테이블 (FK 제약조건 제거하여 유연하게 관리)
|
||||
// 소프트웨어 사용자 매핑 테이블
|
||||
const createSwUsersTable = `
|
||||
CREATE TABLE IF NOT EXISTS sw_users (
|
||||
id VARCHAR(50) PRIMARY KEY,
|
||||
sw_id VARCHAR(50),
|
||||
corp VARCHAR(100),
|
||||
dept VARCHAR(100),
|
||||
team VARCHAR(100),
|
||||
position VARCHAR(50),
|
||||
name VARCHAR(100),
|
||||
usage_period VARCHAR(100),
|
||||
doc_name VARCHAR(255)
|
||||
CREATE TABLE sw_users (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
sw_id VARCHAR(50) COMMENT 'SW 자산 ID',
|
||||
corp VARCHAR(100) COMMENT '법인',
|
||||
dept VARCHAR(100) COMMENT '부서',
|
||||
position VARCHAR(50) COMMENT '직위',
|
||||
user_name VARCHAR(100) COMMENT '이름',
|
||||
usage_period VARCHAR(100) COMMENT '사용기간',
|
||||
doc_name VARCHAR(255) COMMENT '신청서명',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
`;
|
||||
|
||||
await connection.query(createPcTable);
|
||||
await connection.query(createServerTable);
|
||||
await connection.query(createStorageTable);
|
||||
await connection.query(createEquipTable);
|
||||
await connection.query(createSubSwTable);
|
||||
await connection.query(createPermSwTable);
|
||||
await connection.query(createSwUsersTable);
|
||||
|
||||
console.log('✅ 6개 전용 테이블 생성 완료!');
|
||||
console.log('✅ 모든 테이블이 표준화된 스키마로 재생성되었습니다.');
|
||||
await connection.end();
|
||||
console.log('🏁 DB 초기화 프로세스 종료.');
|
||||
}
|
||||
|
||||
initDB().catch(err => {
|
||||
|
||||
Reference in New Issue
Block a user