Files
TK-FB-Project/api.hyungi.net/migrations/002_add_master_tables.sql

115 lines
5.3 KiB
SQL

-- migrations/002_add_master_tables.sql
-- 기존 daily_work_reports 테이블을 유지하면서 필요한 마스터 테이블들만 추가
-- 1. 작업 유형 테이블 생성
CREATE TABLE IF NOT EXISTS work_types (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL COMMENT '작업 유형명',
description TEXT COMMENT '작업 유형 설명',
category VARCHAR(50) COMMENT '작업 카테고리',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 2. 업무 상태 유형 테이블 생성
CREATE TABLE IF NOT EXISTS work_status_types (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL COMMENT '상태명',
description TEXT COMMENT '상태 설명',
is_error BOOLEAN DEFAULT FALSE COMMENT '에러 상태 여부',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 3. 에러 유형 테이블 생성
CREATE TABLE IF NOT EXISTS error_types (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL COMMENT '에러 유형명',
description TEXT COMMENT '에러 설명',
severity ENUM('low', 'medium', 'high', 'critical') DEFAULT 'medium' COMMENT '심각도',
solution_guide TEXT COMMENT '해결 가이드',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 4. 감사 로그 테이블 생성 (누적입력 추적용)
CREATE TABLE IF NOT EXISTS work_report_audit_log (
log_id INT PRIMARY KEY AUTO_INCREMENT,
action ENUM('ADD_ACCUMULATE', 'DELETE_SINGLE', 'UPDATE', 'DELETE', 'CREATE', 'DELETE_BATCH') NOT NULL COMMENT '작업 유형',
report_id INT NULL COMMENT '관련 보고서 ID',
old_values JSON NULL COMMENT '변경 전 값',
new_values JSON NULL COMMENT '변경 후 값',
changed_by INT NOT NULL COMMENT '변경자 ID',
change_reason VARCHAR(500) COMMENT '변경 사유',
ip_address VARCHAR(45) COMMENT 'IP 주소',
user_agent TEXT COMMENT '사용자 에이전트',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '변경 시간',
INDEX idx_action_date (action, created_at),
INDEX idx_changed_by (changed_by),
INDEX idx_report_id (report_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 5. 기존 daily_work_reports 테이블에 누적입력을 위한 인덱스만 추가
ALTER TABLE daily_work_reports
ADD INDEX IF NOT EXISTS idx_created_by (created_by),
ADD INDEX IF NOT EXISTS idx_date_worker_creator (report_date, worker_id, created_by);
-- 6. 기본 데이터 삽입 (기존 데이터와 호환되도록)
-- 업무 상태 유형 기본 데이터
INSERT IGNORE INTO work_status_types (id, name, description, is_error) VALUES
(1, '정규', '정상적으로 완료된 작업', FALSE),
(2, '에러', '오류가 발생한 작업', TRUE);
-- 작업 유형 기본 데이터 (기존 데이터의 work_type_id=1과 호환)
INSERT IGNORE INTO work_types (id, name, description, category) VALUES
(1, '일반작업', '기본 작업 유형', '생산관리'),
(2, '생산', '제품 생산 작업', '생산관리'),
(3, '품질검사', '제품 품질 검사', '품질관리'),
(4, '안전점검', '안전 상태 점검', '안전관리'),
(5, '자재입고', '원자재 입고 작업', '구매관리'),
(6, '설비점검', '생산 설비 점검', '설비관리'),
(7, '재고관리', '재고 현황 관리', '창고관리'),
(8, '포장', '제품 포장 작업', '생산관리'),
(9, '출하', '제품 출하 작업', '물류관리');
-- 에러 유형 기본 데이터
INSERT IGNORE INTO error_types (id, name, description, severity, solution_guide) VALUES
(1, '설비고장', '생산 설비 고장', 'high', '즉시 설비팀에 연락하여 수리 요청'),
(2, '자재부족', '필요 자재 부족', 'medium', '구매팀에 긴급 주문 요청'),
(3, '품질불량', '제품 품질 기준 미달', 'high', '품질팀에 즉시 보고 및 생산 중단'),
(4, '안전사고', '작업 중 안전사고 발생', 'critical', '즉시 작업 중단 및 안전팀 신고'),
(5, '시스템오류', 'IT 시스템 오류', 'medium', 'IT팀에 장애 신고');
-- 7. 기존 데이터 호환성을 위한 뷰 생성
CREATE OR REPLACE VIEW v_daily_reports_with_names AS
SELECT
dwr.id,
dwr.report_date,
dwr.worker_id,
w.worker_name,
dwr.project_id,
p.project_name,
dwr.work_type_id,
COALESCE(wt.name, '일반작업') as work_type_name,
COALESCE(wt.category, '생산관리') as work_category,
dwr.work_status_id,
COALESCE(wst.name, '정규') as work_status_name,
COALESCE(wst.is_error, FALSE) as is_error,
dwr.error_type_id,
et.name as error_type_name,
et.severity as error_severity,
dwr.work_hours,
dwr.created_by,
u.name as created_by_name,
dwr.created_at,
dwr.updated_at
FROM daily_work_reports dwr
LEFT JOIN Workers w ON dwr.worker_id = w.worker_id
LEFT JOIN Projects p ON dwr.project_id = p.project_id
LEFT JOIN work_types wt ON dwr.work_type_id = wt.id
LEFT JOIN work_status_types wst ON dwr.work_status_id = wst.id
LEFT JOIN error_types et ON dwr.error_type_id = et.id
LEFT JOIN Users u ON dwr.created_by = u.user_id;
COMMIT;