🏢 Department Management System: - 5개 부서 지원: 생산, 품질, 구매, 설계, 영업 - 사용자 생성/수정 시 부서 선택 가능 - 부서별 사용자 분류 및 표시 📊 Database Schema Updates: - department_type ENUM 추가 (production, quality, purchasing, design, sales) - users 테이블에 department 컬럼 추가 - idx_users_department 인덱스 생성 (성능 최적화) - 014_add_user_department.sql 마이그레이션 실행 🔧 Backend Enhancements: - DepartmentType ENUM 클래스 추가 (models.py, schemas.py) - User 모델에 department 필드 추가 - UserBase, UserUpdate 스키마에 department 필드 포함 - 기존 API 엔드포인트 자동 호환 🎨 Frontend UI Improvements: - 사용자 추가 폼에 부서 선택 드롭다운 추가 - 사용자 목록에 부서 정보 배지 표시 (녹색 배경) - 사용자 편집 모달 새로 구현 - 부서명 한글 변환 함수 (AuthAPI.getDepartmentLabel) ✨ User Management Features: - 편집 버튼으로 사용자 정보 수정 가능 - 부서, 이름, 권한 실시간 변경 - 사용자 ID는 수정 불가 (읽기 전용) - 모달 기반 직관적 UI 🔍 Visual Enhancements: - 부서 정보 아이콘 (fas fa-building) - 색상 코딩: 부서(녹색), 권한(빨강/파랑) - 반응형 레이아웃 (flex-1, gap-3) - 호버 효과 및 트랜지션 🚀 API Integration: - AuthAPI.getDepartments() - 부서 목록 반환 - AuthAPI.getDepartmentLabel() - 부서명 변환 - AuthAPI.updateUser() - 부서 정보 포함 업데이트 - 기존 createUser API 확장 지원 Expected Result: ✅ 사용자 생성 시 부서 선택 가능 ✅ 사용자 목록에 부서 정보 표시 ✅ 편집 버튼으로 부서 변경 가능 ✅ 5개 부서 분류 시스템 완성 ✅ 직관적인 사용자 관리 UI
93 lines
4.1 KiB
PL/PgSQL
93 lines
4.1 KiB
PL/PgSQL
-- 014_add_user_department.sql
|
||
-- 사용자 부서 정보 추가
|
||
|
||
BEGIN;
|
||
|
||
-- migration_log 테이블 생성 (멱등성)
|
||
CREATE TABLE IF NOT EXISTS migration_log (
|
||
id SERIAL PRIMARY KEY,
|
||
migration_file VARCHAR(255) NOT NULL UNIQUE,
|
||
executed_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
||
status VARCHAR(50),
|
||
notes TEXT,
|
||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||
);
|
||
|
||
-- 마이그레이션 파일 이름
|
||
DO $$
|
||
DECLARE
|
||
migration_name VARCHAR(255) := '014_add_user_department.sql';
|
||
migration_notes TEXT := '사용자 부서 정보 추가: department ENUM 타입 및 users 테이블에 department 컬럼 추가';
|
||
current_status VARCHAR(50);
|
||
BEGIN
|
||
SELECT status INTO current_status FROM migration_log WHERE migration_file = migration_name;
|
||
|
||
IF current_status IS NULL THEN
|
||
RAISE NOTICE '--- 마이그레이션 % 시작 ---', migration_name;
|
||
|
||
-- department ENUM 타입 생성
|
||
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'department_type') THEN
|
||
CREATE TYPE department_type AS ENUM (
|
||
'production', -- 생산
|
||
'quality', -- 품질
|
||
'purchasing', -- 구매
|
||
'design', -- 설계
|
||
'sales' -- 영업
|
||
);
|
||
RAISE NOTICE '✅ department_type ENUM 타입이 생성되었습니다.';
|
||
ELSE
|
||
RAISE NOTICE 'ℹ️ department_type ENUM 타입이 이미 존재합니다.';
|
||
END IF;
|
||
|
||
-- users 테이블에 department 컬럼 추가
|
||
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'users' AND column_name = 'department') THEN
|
||
ALTER TABLE users ADD COLUMN department department_type;
|
||
RAISE NOTICE '✅ users.department 컬럼이 추가되었습니다.';
|
||
ELSE
|
||
RAISE NOTICE 'ℹ️ users.department 컬럼이 이미 존재합니다.';
|
||
END IF;
|
||
|
||
-- 인덱스 추가 (부서별 조회 성능 향상)
|
||
IF NOT EXISTS (SELECT 1 FROM pg_indexes WHERE tablename = 'users' AND indexname = 'idx_users_department') THEN
|
||
CREATE INDEX idx_users_department ON users (department) WHERE department IS NOT NULL;
|
||
RAISE NOTICE '✅ idx_users_department 인덱스가 생성되었습니다.';
|
||
ELSE
|
||
RAISE NOTICE 'ℹ️ idx_users_department 인덱스가 이미 존재합니다.';
|
||
END IF;
|
||
|
||
-- 마이그레이션 검증
|
||
DECLARE
|
||
col_count INTEGER;
|
||
enum_count INTEGER;
|
||
idx_count INTEGER;
|
||
BEGIN
|
||
SELECT COUNT(*) INTO col_count FROM information_schema.columns WHERE table_name = 'users' AND column_name = 'department';
|
||
SELECT COUNT(*) INTO enum_count FROM pg_type WHERE typname = 'department_type';
|
||
SELECT COUNT(*) INTO idx_count FROM pg_indexes WHERE tablename = 'users' AND indexname = 'idx_users_department';
|
||
|
||
RAISE NOTICE '=== 마이그레이션 검증 결과 ===';
|
||
RAISE NOTICE '추가된 컬럼: %/1개', col_count;
|
||
RAISE NOTICE '생성된 ENUM: %/1개', enum_count;
|
||
RAISE NOTICE '생성된 인덱스: %/1개', idx_count;
|
||
|
||
IF col_count = 1 AND enum_count = 1 AND idx_count = 1 THEN
|
||
RAISE NOTICE '✅ 마이그레이션이 성공적으로 완료되었습니다!';
|
||
INSERT INTO migration_log (migration_file, status, notes) VALUES (migration_name, 'SUCCESS', migration_notes);
|
||
ELSE
|
||
RAISE EXCEPTION '❌ 마이그레이션 검증 실패!';
|
||
END IF;
|
||
END;
|
||
|
||
-- 부서 ENUM 값 확인
|
||
RAISE NOTICE '=== 부서 ENUM 값 ===';
|
||
PERFORM dblink_exec('dbname=' || current_database(), 'SELECT enumlabel FROM pg_enum WHERE enumtypid = ''department_type''::regtype ORDER BY enumsortorder');
|
||
|
||
ELSIF current_status = 'SUCCESS' THEN
|
||
RAISE NOTICE 'ℹ️ 마이그레이션 %는 이미 성공적으로 실행되었습니다. 스킵합니다.', migration_name;
|
||
ELSE
|
||
RAISE NOTICE '⚠️ 마이그레이션 %는 이전에 실패했습니다. 수동 확인이 필요합니다.', migration_name;
|
||
END IF;
|
||
END $$;
|
||
|
||
COMMIT;
|