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:
Binary file not shown.
Binary file not shown.
@@ -119,6 +119,19 @@ class Issue(Base):
|
||||
duplicate_of_issue_id = Column(Integer, ForeignKey("issues.id")) # 중복 대상 이슈 ID
|
||||
duplicate_reporters = Column(JSONB, default=lambda: []) # 중복 신고자 목록
|
||||
|
||||
# 관리함에서 사용할 추가 필드들
|
||||
completion_photo_path = Column(String) # 완료 사진 경로
|
||||
solution = Column(Text) # 해결방안 (관리함에서 입력)
|
||||
responsible_department = Column(Enum(DepartmentType)) # 담당부서
|
||||
responsible_person = Column(String(100)) # 담당자
|
||||
expected_completion_date = Column(DateTime) # 조치 예상일
|
||||
actual_completion_date = Column(DateTime) # 완료 확인일
|
||||
cause_department = Column(Enum(DepartmentType)) # 원인부서
|
||||
management_comment = Column(Text) # ISSUE에 대한 의견
|
||||
project_sequence_no = Column(Integer) # 프로젝트별 순번 (No)
|
||||
final_description = Column(Text) # 최종 내용 (수정본 또는 원본)
|
||||
final_category = Column(Enum(IssueCategory)) # 최종 카테고리 (수정본 또는 원본)
|
||||
|
||||
# Relationships
|
||||
reporter = relationship("User", back_populates="issues", foreign_keys=[reporter_id])
|
||||
reviewer = relationship("User", foreign_keys=[reviewed_by_id], overlaps="reviewed_issues")
|
||||
|
||||
@@ -128,6 +128,19 @@ class Issue(IssueBase):
|
||||
duplicate_of_issue_id: Optional[int] = None
|
||||
duplicate_reporters: Optional[List[Dict[str, Any]]] = None
|
||||
|
||||
# 관리함에서 사용할 추가 필드들
|
||||
completion_photo_path: Optional[str] = None # 완료 사진 경로
|
||||
solution: Optional[str] = None # 해결방안
|
||||
responsible_department: Optional[DepartmentType] = None # 담당부서
|
||||
responsible_person: Optional[str] = None # 담당자
|
||||
expected_completion_date: Optional[datetime] = None # 조치 예상일
|
||||
actual_completion_date: Optional[datetime] = None # 완료 확인일
|
||||
cause_department: Optional[DepartmentType] = None # 원인부서
|
||||
management_comment: Optional[str] = None # ISSUE에 대한 의견
|
||||
project_sequence_no: Optional[int] = None # 프로젝트별 순번
|
||||
final_description: Optional[str] = None # 최종 내용
|
||||
final_category: Optional[IssueCategory] = None # 최종 카테고리
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
@@ -149,6 +162,17 @@ class IssueStatusUpdateRequest(BaseModel):
|
||||
"""부적합 상태 변경 요청"""
|
||||
review_status: ReviewStatus
|
||||
notes: Optional[str] = None
|
||||
completion_photo: Optional[str] = None # 완료 사진 (Base64)
|
||||
|
||||
class ManagementUpdateRequest(BaseModel):
|
||||
"""관리함에서 사용할 필드 업데이트 요청"""
|
||||
solution: Optional[str] = None # 해결방안
|
||||
responsible_department: Optional[DepartmentType] = None # 담당부서
|
||||
responsible_person: Optional[str] = None # 담당자
|
||||
expected_completion_date: Optional[datetime] = None # 조치 예상일
|
||||
cause_department: Optional[DepartmentType] = None # 원인부서
|
||||
management_comment: Optional[str] = None # ISSUE에 대한 의견
|
||||
completion_photo: Optional[str] = None # 완료 사진 (Base64)
|
||||
|
||||
class InboxIssue(BaseModel):
|
||||
"""수신함용 부적합 정보 (간소화된 버전)"""
|
||||
|
||||
Reference in New Issue
Block a user