fix: 캘린더 모달 중복 카드 문제 및 삭제 권한 개선
- monthly_worker_status 조회 시 GROUP BY로 중복 데이터 합산 - 작업보고서 삭제 권한을 그룹장 이상으로 제한 (admin, system, group_leader) - 중복 데이터 정리를 위한 마이그레이션 SQL 추가 (009_fix_duplicate_monthly_status.sql) - synology_deployment 버전에도 동일 수정 적용
This commit is contained in:
@@ -0,0 +1,115 @@
|
||||
-- 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;
|
||||
@@ -0,0 +1,56 @@
|
||||
-- migrations/003_normalize_table_names.sql
|
||||
-- 모든 테이블명을 snake_case로 변경하여 룰 준수
|
||||
|
||||
-- 기존 PascalCase 테이블들을 snake_case로 변경
|
||||
|
||||
-- 1. Users -> users
|
||||
RENAME TABLE Users TO users;
|
||||
|
||||
-- 2. CuttingPlan -> cutting_plan
|
||||
RENAME TABLE CuttingPlan TO cutting_plan;
|
||||
|
||||
-- 3. DailyIssueReports -> daily_issue_reports
|
||||
RENAME TABLE DailyIssueReports TO daily_issue_reports;
|
||||
|
||||
-- 4. EquipmentList -> equipment_list
|
||||
RENAME TABLE EquipmentList TO equipment_list;
|
||||
|
||||
-- 5. FactoryInfo -> factory_info
|
||||
RENAME TABLE FactoryInfo TO factory_info;
|
||||
|
||||
-- 6. IssueTypes -> issue_types
|
||||
RENAME TABLE IssueTypes TO issue_types;
|
||||
|
||||
-- 7. PipeSpecs -> pipe_specs
|
||||
RENAME TABLE PipeSpecs TO pipe_specs;
|
||||
|
||||
-- 8. Processes -> processes (이미 소문자이지만 통일성 위해)
|
||||
-- RENAME TABLE Processes TO processes; -- 이미 소문자면 스킵
|
||||
|
||||
-- 9. Projects -> projects
|
||||
RENAME TABLE Projects TO projects;
|
||||
|
||||
-- 10. Tasks -> tasks
|
||||
RENAME TABLE Tasks TO tasks;
|
||||
|
||||
-- 11. WorkReports -> work_reports
|
||||
RENAME TABLE WorkReports TO work_reports;
|
||||
|
||||
-- 12. Workers -> workers
|
||||
RENAME TABLE Workers TO workers;
|
||||
|
||||
-- 이미 snake_case인 테이블들은 그대로 유지:
|
||||
-- activity_logs
|
||||
-- daily_work_reports
|
||||
-- daily_worker_summary
|
||||
-- error_types
|
||||
-- login_logs
|
||||
-- password_change_logs
|
||||
-- uploaded_documents
|
||||
-- work_report_audit_log
|
||||
-- work_status_types
|
||||
-- work_types
|
||||
-- worker_groups
|
||||
|
||||
-- 변경 완료 로그
|
||||
SELECT 'Table names normalized to snake_case according to project rules' as migration_status;
|
||||
@@ -0,0 +1,45 @@
|
||||
-- hyungi 계정을 시스템 권한으로 업데이트
|
||||
-- 실행 날짜: 2025-01-XX
|
||||
|
||||
-- hyungi 계정의 role을 system으로 변경
|
||||
UPDATE Users
|
||||
SET
|
||||
role = 'system',
|
||||
access_level = 'system',
|
||||
name = '시스템 관리자',
|
||||
updated_at = NOW()
|
||||
WHERE username = 'hyungi';
|
||||
|
||||
-- 변경 결과 확인
|
||||
SELECT
|
||||
user_id,
|
||||
username,
|
||||
name,
|
||||
role,
|
||||
access_level,
|
||||
is_active,
|
||||
updated_at
|
||||
FROM Users
|
||||
WHERE username = 'hyungi';
|
||||
|
||||
-- 시스템 권한 확인을 위한 쿼리
|
||||
SELECT
|
||||
username,
|
||||
name,
|
||||
role,
|
||||
access_level,
|
||||
CASE
|
||||
WHEN role = 'system' THEN '✅ 시스템 관리자'
|
||||
WHEN role = 'admin' THEN '🔧 관리자'
|
||||
WHEN role = 'leader' THEN '👨🏫 그룹장'
|
||||
ELSE '👤 일반 사용자'
|
||||
END as permission_level
|
||||
FROM Users
|
||||
ORDER BY
|
||||
CASE role
|
||||
WHEN 'system' THEN 1
|
||||
WHEN 'admin' THEN 2
|
||||
WHEN 'leader' THEN 3
|
||||
ELSE 4
|
||||
END,
|
||||
username;
|
||||
Reference in New Issue
Block a user