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로 사용자 경험 향상
This commit is contained in:
BIN
backend/routers/__pycache__/management.cpython-311.pyc
Normal file
BIN
backend/routers/__pycache__/management.cpython-311.pyc
Normal file
Binary file not shown.
103
backend/routers/management.py
Normal file
103
backend/routers/management.py
Normal file
@@ -0,0 +1,103 @@
|
||||
from fastapi import APIRouter, Depends, HTTPException
|
||||
from sqlalchemy.orm import Session
|
||||
from datetime import datetime
|
||||
from typing import List
|
||||
|
||||
from database.database import get_db
|
||||
from database.models import Issue, User, ReviewStatus
|
||||
from database.schemas import (
|
||||
ManagementUpdateRequest, AdditionalInfoUpdateRequest, Issue as IssueSchema
|
||||
)
|
||||
from routers.auth import get_current_user
|
||||
from routers.page_permissions import check_page_access
|
||||
|
||||
router = APIRouter(prefix="/api/management", tags=["management"])
|
||||
|
||||
@router.get("/", response_model=List[IssueSchema])
|
||||
async def get_management_issues(
|
||||
current_user: User = Depends(get_current_user),
|
||||
db: Session = Depends(get_db)
|
||||
):
|
||||
"""
|
||||
관리함 - 진행 중 및 완료된 부적합 목록 조회
|
||||
"""
|
||||
# 관리함 페이지 권한 확인
|
||||
if not check_page_access(current_user.id, 'issues_management', db):
|
||||
raise HTTPException(status_code=403, detail="관리함 접근 권한이 없습니다.")
|
||||
|
||||
# 진행 중 또는 완료된 이슈들 조회
|
||||
issues = db.query(Issue).filter(
|
||||
Issue.review_status.in_([ReviewStatus.in_progress, ReviewStatus.completed])
|
||||
).order_by(Issue.reviewed_at.desc()).all()
|
||||
|
||||
return issues
|
||||
|
||||
@router.put("/{issue_id}/additional-info")
|
||||
async def update_additional_info(
|
||||
issue_id: int,
|
||||
additional_info: AdditionalInfoUpdateRequest,
|
||||
current_user: User = Depends(get_current_user),
|
||||
db: Session = Depends(get_db)
|
||||
):
|
||||
"""
|
||||
추가 정보 업데이트 (원인부서, 해당자 상세, 원인 상세)
|
||||
"""
|
||||
# 관리함 페이지 권한 확인
|
||||
if not check_page_access(current_user.id, 'issues_management', db):
|
||||
raise HTTPException(status_code=403, detail="관리함 접근 권한이 없습니다.")
|
||||
|
||||
# 이슈 조회
|
||||
issue = db.query(Issue).filter(Issue.id == issue_id).first()
|
||||
if not issue:
|
||||
raise HTTPException(status_code=404, detail="부적합을 찾을 수 없습니다.")
|
||||
|
||||
# 진행 중 상태인지 확인
|
||||
if issue.review_status != ReviewStatus.in_progress:
|
||||
raise HTTPException(status_code=400, detail="진행 중 상태의 부적합만 추가 정보를 입력할 수 있습니다.")
|
||||
|
||||
# 추가 정보 업데이트
|
||||
update_data = additional_info.dict(exclude_unset=True)
|
||||
|
||||
for field, value in update_data.items():
|
||||
setattr(issue, field, value)
|
||||
|
||||
# 추가 정보 입력 시간 및 입력자 기록
|
||||
issue.additional_info_updated_at = datetime.now()
|
||||
issue.additional_info_updated_by_id = current_user.id
|
||||
|
||||
db.commit()
|
||||
db.refresh(issue)
|
||||
|
||||
return {
|
||||
"message": "추가 정보가 성공적으로 업데이트되었습니다.",
|
||||
"issue_id": issue.id,
|
||||
"updated_at": issue.additional_info_updated_at,
|
||||
"updated_by": current_user.username
|
||||
}
|
||||
|
||||
@router.get("/{issue_id}/additional-info")
|
||||
async def get_additional_info(
|
||||
issue_id: int,
|
||||
current_user: User = Depends(get_current_user),
|
||||
db: Session = Depends(get_db)
|
||||
):
|
||||
"""
|
||||
추가 정보 조회
|
||||
"""
|
||||
# 관리함 페이지 권한 확인
|
||||
if not check_page_access(current_user.id, 'issues_management', db):
|
||||
raise HTTPException(status_code=403, detail="관리함 접근 권한이 없습니다.")
|
||||
|
||||
# 이슈 조회
|
||||
issue = db.query(Issue).filter(Issue.id == issue_id).first()
|
||||
if not issue:
|
||||
raise HTTPException(status_code=404, detail="부적합을 찾을 수 없습니다.")
|
||||
|
||||
return {
|
||||
"issue_id": issue.id,
|
||||
"cause_department": issue.cause_department.value if issue.cause_department else None,
|
||||
"responsible_person_detail": issue.responsible_person_detail,
|
||||
"cause_detail": issue.cause_detail,
|
||||
"additional_info_updated_at": issue.additional_info_updated_at,
|
||||
"additional_info_updated_by_id": issue.additional_info_updated_by_id
|
||||
}
|
||||
Reference in New Issue
Block a user