📝 상세 내용 인라인 편집 시스템: 🎨 프론트엔드 UI 개선: - 상세 내용 섹션에 '수정' 버튼 추가 - 읽기 모드 ↔ 편집 모드 토글 기능 - 편집 시 텍스트 영역으로 전환 - 취소/저장 버튼으로 편집 제어 - 실시간 UI 업데이트 🔧 백엔드 API 확장: - PUT /api/management/{issue_id} 엔드포인트 추가 - ManagementUpdateRequest에 final_description 필드 추가 - 진행중 상태 이슈만 수정 가능하도록 제한 - 권한 검증 및 오류 처리 💡 핵심 기능: - 부적합명은 유지하고 상세 내용만 수정 - 수신함에서 입력한 상세 부분을 관리함에서 보완 가능 - 원본 데이터와 수정 데이터 자동 결합 - 실시간 저장 및 화면 반영 🔐 보안 및 제한사항: - 관리함 페이지 권한 필요 - 진행중 상태 이슈만 편집 가능 - 완료된 이슈는 편집 불가 - 사용자 인증 및 권한 검증 🎯 사용 시나리오: 1. 관리함 진행중 탭에서 '수정' 버튼 클릭 2. 텍스트 영역에서 상세 내용 편집 3. 저장 시 부적합명과 자동 결합 4. 실시간으로 화면에 반영 Expected Result: ✅ 수신함 검토 후 관리함에서 상세 내용 보완 가능 ✅ 직관적인 인라인 편집 인터페이스 ✅ 데이터 일관성 유지 (부적합명 + 상세 내용) ✅ 안전한 권한 기반 편집 제어
145 lines
5.2 KiB
Python
145 lines
5.2 KiB
Python
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}")
|
|
async def update_issue(
|
|
issue_id: int,
|
|
update_request: ManagementUpdateRequest,
|
|
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 = update_request.dict(exclude_unset=True)
|
|
|
|
for field, value in update_data.items():
|
|
if field == 'completion_photo':
|
|
# 완료 사진은 별도 처리 (필요시)
|
|
continue
|
|
setattr(issue, field, value)
|
|
|
|
db.commit()
|
|
db.refresh(issue)
|
|
|
|
return {
|
|
"message": "이슈가 성공적으로 업데이트되었습니다.",
|
|
"issue_id": issue.id,
|
|
"updated_at": datetime.now()
|
|
}
|
|
|
|
@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
|
|
}
|