🎯 관리함 진행중 페이지 추가 정보 입력 시스템: 📊 DB 구조 확장: - responsible_person_detail: 해당자 상세 정보 (VARCHAR 200) - cause_detail: 원인 상세 정보 (TEXT) - additional_info_updated_at: 추가 정보 입력 시간 - additional_info_updated_by_id: 추가 정보 입력자 ID - 018_add_additional_info_fields.sql 마이그레이션 실행 완료 🔧 백엔드 API: - /api/management/{issue_id}/additional-info (PUT): 추가 정보 업데이트 - /api/management/{issue_id}/additional-info (GET): 추가 정보 조회 - AdditionalInfoUpdateRequest 스키마 추가 - management.py 라우터 생성 및 등록 🎨 프론트엔드 UI: - 진행중 탭 상단에 '추가 정보 입력' 버튼 추가 - 완료됨 탭에서는 버튼 자동 숨김 - 세련된 모달 디자인 (오렌지 테마) - 원인부서 드롭다운 (생산/품질/구매/설계/영업) - 해당자 상세 입력 필드 - 원인 상세 텍스트 영역 💡 핵심 특징: - 모든 필드 선택사항 (NULL 허용) - 기록용 정보로 외부 노출 없음 - 기존 데이터 자동 로드 및 수정 가능 - 입력 시간/입력자 자동 추적 - 진행중 상태 이슈만 대상 🔐 권한 관리: - issues_management 페이지 권한 필요 - 진행중 상태 이슈만 수정 가능 - 사용자별 입력 이력 추적 🎯 사용 시나리오: 1. 관리함 > 진행중 탭 접근 2. '추가 정보 입력' 버튼 클릭 3. 원인부서, 해당자, 원인상세 입력 4. 저장 후 내부 기록으로 보관 Expected Result: ✅ 관리함에서 상세한 원인 정보 기록 가능 ✅ 체계적인 이슈 추적 및 분석 기반 마련 ✅ 선택적 정보 입력으로 유연한 운영 ✅ 깔끔한 UI로 사용자 경험 향상
86 lines
4.2 KiB
SQL
86 lines
4.2 KiB
SQL
-- 수신함 추가 정보 필드 추가
|
||
-- 원인부서, 해당자, 원인 상세 정보를 기록하기 위한 필드들
|
||
|
||
DO $migration$
|
||
DECLARE
|
||
col_count INTEGER := 0;
|
||
idx_count INTEGER := 0;
|
||
BEGIN
|
||
RAISE NOTICE '=== 수신함 추가 정보 필드 추가 마이그레이션 시작 ===';
|
||
|
||
-- 1. 해당자 상세 정보 (responsible_person과 별도)
|
||
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'issues' AND column_name = 'responsible_person_detail') THEN
|
||
ALTER TABLE issues ADD COLUMN responsible_person_detail VARCHAR(200);
|
||
RAISE NOTICE '✅ issues.responsible_person_detail 컬럼이 추가되었습니다.';
|
||
ELSE
|
||
RAISE NOTICE 'ℹ️ issues.responsible_person_detail 컬럼이 이미 존재합니다.';
|
||
END IF;
|
||
|
||
-- 2. 원인 상세 정보 (기록용)
|
||
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'issues' AND column_name = 'cause_detail') THEN
|
||
ALTER TABLE issues ADD COLUMN cause_detail TEXT;
|
||
RAISE NOTICE '✅ issues.cause_detail 컬럼이 추가되었습니다.';
|
||
ELSE
|
||
RAISE NOTICE 'ℹ️ issues.cause_detail 컬럼이 이미 존재합니다.';
|
||
END IF;
|
||
|
||
-- 3. 추가 정보 입력 시간 (언제 입력되었는지 기록)
|
||
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'issues' AND column_name = 'additional_info_updated_at') THEN
|
||
ALTER TABLE issues ADD COLUMN additional_info_updated_at TIMESTAMP WITH TIME ZONE;
|
||
RAISE NOTICE '✅ issues.additional_info_updated_at 컬럼이 추가되었습니다.';
|
||
ELSE
|
||
RAISE NOTICE 'ℹ️ issues.additional_info_updated_at 컬럼이 이미 존재합니다.';
|
||
END IF;
|
||
|
||
-- 4. 추가 정보 입력자 ID (누가 입력했는지 기록)
|
||
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'issues' AND column_name = 'additional_info_updated_by_id') THEN
|
||
ALTER TABLE issues ADD COLUMN additional_info_updated_by_id INTEGER REFERENCES users(id);
|
||
RAISE NOTICE '✅ issues.additional_info_updated_by_id 컬럼이 추가되었습니다.';
|
||
ELSE
|
||
RAISE NOTICE 'ℹ️ issues.additional_info_updated_by_id 컬럼이 이미 존재합니다.';
|
||
END IF;
|
||
|
||
-- 인덱스 추가 (검색 성능 향상)
|
||
IF NOT EXISTS (SELECT 1 FROM pg_indexes WHERE tablename = 'issues' AND indexname = 'idx_issues_additional_info_updated_at') THEN
|
||
CREATE INDEX idx_issues_additional_info_updated_at ON issues (additional_info_updated_at);
|
||
RAISE NOTICE '✅ idx_issues_additional_info_updated_at 인덱스가 생성되었습니다.';
|
||
ELSE
|
||
RAISE NOTICE 'ℹ️ idx_issues_additional_info_updated_at 인덱스가 이미 존재합니다.';
|
||
END IF;
|
||
|
||
-- 검증
|
||
SELECT COUNT(*) INTO col_count FROM information_schema.columns
|
||
WHERE table_name = 'issues' AND column_name IN (
|
||
'responsible_person_detail', 'cause_detail', 'additional_info_updated_at', 'additional_info_updated_by_id'
|
||
);
|
||
|
||
SELECT COUNT(*) INTO idx_count FROM pg_indexes
|
||
WHERE tablename = 'issues' AND indexname = 'idx_issues_additional_info_updated_at';
|
||
|
||
RAISE NOTICE '=== 마이그레이션 검증 결과 ===';
|
||
RAISE NOTICE '추가된 컬럼: %/4개', col_count;
|
||
RAISE NOTICE '생성된 인덱스: %/1개', idx_count;
|
||
|
||
IF col_count = 4 AND idx_count = 1 THEN
|
||
RAISE NOTICE '✅ 모든 추가 정보 필드가 성공적으로 추가되었습니다.';
|
||
ELSE
|
||
RAISE WARNING '⚠️ 일부 필드나 인덱스가 누락되었습니다.';
|
||
END IF;
|
||
|
||
EXCEPTION
|
||
WHEN OTHERS THEN
|
||
RAISE EXCEPTION '❌ 마이그레이션 실행 중 오류 발생: %', SQLERRM;
|
||
END $migration$;
|
||
|
||
-- 마이그레이션 로그 기록
|
||
INSERT INTO migration_log (migration_file, executed_at, status, notes)
|
||
VALUES (
|
||
'018_add_additional_info_fields.sql',
|
||
NOW(),
|
||
'SUCCESS',
|
||
'수신함 추가 정보 필드 추가: 해당자 상세(responsible_person_detail), 원인 상세(cause_detail), 입력 시간/입력자 추적 필드'
|
||
) ON CONFLICT (migration_file) DO UPDATE SET
|
||
executed_at = NOW(),
|
||
status = EXCLUDED.status,
|
||
notes = EXCLUDED.notes;
|