Files
M-Project/backend/migrations/018_add_additional_info_fields.sql
Hyungi Ahn 61f5720af3 feat: 관리함 진행중 페이지에 추가 정보 입력 기능 구현
🎯 관리함 진행중 페이지 추가 정보 입력 시스템:

📊 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로 사용자 경험 향상
2025-10-26 11:39:30 +09:00

86 lines
4.2 KiB
SQL
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 수신함 추가 정보 필드 추가
-- 원인부서, 해당자, 원인 상세 정보를 기록하기 위한 필드들
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;