refactor(tkqc): UI 스타일 통일 + 일일공수 제거 + 메뉴 정리

- UI: tkuser 스타일로 통일 (dark slate 헤더, flat 배경, gradient/glass 제거)
- tkqc-common.css 공통 스타일시트 신규 생성
- 의견 제시 API 별도 엔드포인트 추가 (모든 사용자 접근 가능)
- 일일 공수 기능 완전 제거 (라우터, 모델, 스키마, DB 테이블 DROP)
- 프로젝트 관리/사용자 관리 메뉴 숨김 (통합관리 페이지로 이관)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Hyungi Ahn
2026-02-13 10:43:37 +09:00
parent ce270b9e4a
commit c52734154f
26 changed files with 294 additions and 782 deletions

View File

@@ -246,6 +246,42 @@ async def delete_issue(
db.commit()
return {"detail": "Issue deleted successfully", "logged": True}
@router.post("/{issue_id}/opinion")
async def add_opinion(
issue_id: int,
opinion_request: schemas.OpinionRequest,
current_user: User = Depends(get_current_user),
db: Session = Depends(get_db)
):
"""
의견 제시 — 로그인한 모든 사용자가 사용 가능 (권한 체크 없음)
solution 필드에 의견을 추가합니다.
"""
issue = db.query(Issue).filter(Issue.id == issue_id).first()
if not issue:
raise HTTPException(status_code=404, detail="부적합을 찾을 수 없습니다.")
# 새 의견 형식: [작성자] (날짜시간)\n내용
now = datetime.now()
date_str = now.strftime("%Y. %m. %d. %H:%M")
author = current_user.full_name or current_user.username
new_opinion = f"[{author}] ({date_str})\n{opinion_request.opinion}"
# 기존 solution에 추가 (최신이 위로)
separator = "" * 50
if issue.solution:
issue.solution = f"{new_opinion}\n{separator}\n{issue.solution}"
else:
issue.solution = new_opinion
db.commit()
db.refresh(issue)
return {
"message": "의견이 추가되었습니다.",
"issue_id": issue.id
}
@router.get("/stats/summary")
async def get_issue_stats(
current_user: User = Depends(get_current_user),

View File

@@ -50,10 +50,7 @@ DEFAULT_PAGES = {
'issues_management': {'title': '관리함', 'default_access': False},
'issues_archive': {'title': '폐기함', 'default_access': False},
'issues_dashboard': {'title': '현황판', 'default_access': True},
'projects_manage': {'title': '프로젝트 관리', 'default_access': False},
'daily_work': {'title': '일일 공수', 'default_access': False},
'reports': {'title': '보고서', 'default_access': False},
'users_manage': {'title': '사용자 관리', 'default_access': False}
'reports': {'title': '보고서', 'default_access': False}
}
@router.post("/page-permissions/grant")

View File

@@ -13,7 +13,7 @@ from openpyxl.drawing.image import Image as XLImage
import os
from database.database import get_db
from database.models import Issue, DailyWork, IssueStatus, IssueCategory, User, UserRole, ReviewStatus
from database.models import Issue, IssueStatus, IssueCategory, User, UserRole, ReviewStatus
from database import schemas
from routers.auth import get_current_user
from utils.tkuser_client import get_token_from_request
@@ -30,14 +30,9 @@ async def generate_report_summary(
"""보고서 요약 생성"""
start_date = report_request.start_date
end_date = report_request.end_date
# 일일 공수 합계
daily_works = db.query(DailyWork).filter(
DailyWork.date >= start_date.date(),
DailyWork.date <= end_date.date()
).all()
total_hours = sum(w.total_hours for w in daily_works)
total_hours = 0
# 이슈 통계
issues_query = db.query(Issue).filter(
Issue.report_date >= start_date,
@@ -116,29 +111,6 @@ async def get_report_issues(
"detail_notes": issue.detail_notes
} for issue in issues]
@router.get("/daily-works")
async def get_report_daily_works(
start_date: datetime,
end_date: datetime,
current_user: User = Depends(get_current_user),
db: Session = Depends(get_db)
):
"""보고서용 일일 공수 목록"""
works = db.query(DailyWork).filter(
DailyWork.date >= start_date.date(),
DailyWork.date <= end_date.date()
).order_by(DailyWork.date).all()
return [{
"date": work.date,
"worker_count": work.worker_count,
"regular_hours": work.regular_hours,
"overtime_workers": work.overtime_workers,
"overtime_hours": work.overtime_hours,
"overtime_total": work.overtime_total,
"total_hours": work.total_hours
} for work in works]
@router.get("/daily-preview")
async def preview_daily_report(
project_id: int,