feat: 수신함 완료 사진 업로드 및 최종 부적합 사항 DB 구조 구현

📸 Completion Photo Upload:
- 수신함에서 '완료됨' 상태 선택 시 완료 사진 업로드 기능 추가 (1장 제한)
- Base64 인코딩으로 사진 업로드 및 미리보기 기능
- 완료 상태 변경 시 actual_completion_date 자동 설정

🗄️ Final Issue DB Structure:
- 최종 부적합 사항을 위한 포괄적인 DB 스키마 설계 및 구현
- 프로젝트별 순번 (project_sequence_no) 자동 생성 시스템

📋 New Database Fields:
- completion_photo_path: 완료 사진 경로
- solution: 해결방안 (관리함에서 입력)
- responsible_department: 담당부서 (department_type ENUM)
- responsible_person: 담당자 (VARCHAR 100)
- expected_completion_date: 조치 예상일 (DATE)
- actual_completion_date: 완료 확인일 (DATE, 자동 설정)
- cause_department: 원인부서 (department_type ENUM)
- management_comment: ISSUE에 대한 의견 (TEXT)
- final_description: 최종 내용 (수정본 또는 원본)
- final_category: 최종 카테고리 (수정본 또는 원본)

🔧 Backend Implementation:
- Issue 모델에 11개 새 필드 추가
- IssueStatusUpdateRequest에 completion_photo 필드 추가
- ManagementUpdateRequest 스키마 신규 생성
- update_issue_status API에 완료 사진 처리 로직 추가
- generate_project_sequence_no() 함수로 프로젝트별 순번 자동 생성

🎨 Frontend Implementation:
- 상태 결정 모달에 완료 사진 업로드 섹션 추가
- 완료 상태 선택 시에만 사진 업로드 UI 표시
- 파일 크기 제한 (5MB), 이미지 파일 검증
- 사진 미리보기 및 Base64 변환 처리
- 완료 사진 없이 완료 처리 시 확인 다이얼로그

🚀 User Experience:
- 직관적인 완료 사진 업로드 워크플로우
- 실시간 사진 미리보기로 업로드 확인 가능
- 완료 처리 시 자동으로 완료 확인일 기록
- 프로젝트별 순번으로 체계적인 이슈 관리

🔍 Database Migration:
- 016_add_management_fields.sql 마이그레이션 성공적으로 실행
- 멱등성 보장 및 기존 데이터 보존
- 인덱스 최적화 (project_sequence, responsible_department, expected_completion)
- 기존 이슈들의 final_description/final_category 자동 초기화

Expected Result:
 수신함에서 완료 상태 선택 시 완료 사진 업로드 가능
 완료 처리 시 완료 확인일 자동 기록
 프로젝트별 순번으로 체계적인 이슈 번호 관리
 관리함에서 사용할 모든 필드 준비 완료
 최종 부적합 사항 리포트 생성을 위한 DB 구조 완성
This commit is contained in:
Hyungi Ahn
2025-10-25 14:18:24 +09:00
parent 8996f5b432
commit d77a71493a
8 changed files with 365 additions and 7 deletions

View File

@@ -7,10 +7,11 @@ from database.database import get_db
from database.models import Issue, User, Project, ReviewStatus, DisposalReasonType
from database.schemas import (
InboxIssue, IssueDisposalRequest, IssueReviewRequest,
IssueStatusUpdateRequest, ModificationLogEntry
IssueStatusUpdateRequest, ModificationLogEntry, ManagementUpdateRequest
)
from routers.auth import get_current_user, get_current_admin
from routers.page_permissions import check_page_access
from services.file_service import save_base64_image
router = APIRouter(prefix="/api/inbox", tags=["inbox"])
@@ -260,6 +261,18 @@ async def update_issue_status(
issue.reviewed_by_id = current_user.id
issue.reviewed_at = datetime.now()
# 완료 사진 업로드 처리
if status_request.completion_photo and status_request.review_status == ReviewStatus.completed:
try:
completion_photo_path = save_base64_image(status_request.completion_photo, "completion")
issue.completion_photo_path = completion_photo_path
except Exception as e:
raise HTTPException(status_code=400, detail=f"완료 사진 저장 실패: {str(e)}")
# 완료 상태로 변경 시 완료 확인일 설정
if status_request.review_status == ReviewStatus.completed:
issue.actual_completion_date = datetime.now().date()
# 노트가 있으면 detail_notes에 추가
if status_request.notes:
current_notes = issue.detail_notes or ""