@page "/admin/dashboard" @attribute [Authorize] @using TaxBaik.Application.Services @inject AdminDashboardService DashboardService @inject TaxFilingService FilingService @inject NavigationManager Nav 대시보드 Overview 대시보드 문의 흐름과 콘텐츠 상태를 한 화면에서 확인합니다. 새 포스트 작성 Nav.NavigateTo("/taxbaik/admin/inquiries"))' Style="cursor: pointer; transition: transform 0.2s, box-shadow 0.2s;"> 이번달 문의 @summary.ThisMonthInquiries 월간 상담 유입 (클릭 시 이동) Nav.NavigateTo("/taxbaik/admin/inquiries?status=new"))' Style="cursor: pointer; transition: transform 0.2s, box-shadow 0.2s;"> 신규 문의 @summary.NewInquiries 처리 대기 (클릭 시 이동) Nav.NavigateTo("/taxbaik/admin/blog"))' Style="cursor: pointer; transition: transform 0.2s, box-shadow 0.2s;"> 전체 포스트 @summary.TotalPosts 콘텐츠 자산 (클릭 시 이동) Nav.NavigateTo("/taxbaik/admin/blog"))' Style="cursor: pointer; transition: transform 0.2s, box-shadow 0.2s;"> 발행된 포스트 @summary.PublishedPosts 검색 노출 대상 (클릭 시 이동) @if (upcomingFilings.Count > 0) { 이번 달 마감 임박 신고 30일 이내 신고 예정 건 (고객명 클릭 시 상세 카드로 연결) 전체 일정 보기 고객 신고 유형 기한 D-day @foreach (var f in upcomingFilings) { var dday = (f.DueDate.Date - DateTime.Today).Days; @f.ClientName @f.FilingType @f.DueDate.ToString("yyyy-MM-dd") @if (dday < 0) { 기한 초과 (@(-dday)일) } else if (dday <= 7) { D-@dday } else { D-@dday } } } 최근 문의 최근 유입된 상담 요청을 빠르게 확인합니다. (이름 클릭 시 상세 관리 화면으로 연계) 문의 전체 보기 이름 전화 분야 상태 날짜 @foreach (var inquiry in summary.RecentInquiries) { @inquiry.Name @inquiry.Phone @inquiry.ServiceType @GetStatusLabel(inquiry.Status) @inquiry.CreatedAt.ToString("yyyy-MM-dd") } @code { private AdminDashboardSummary summary = new(0, 0, 0, 0, []); private List upcomingFilings = []; protected override async Task OnInitializedAsync() { var summaryTask = DashboardService.GetSummaryAsync(); var filingsTask = FilingService.GetUpcomingAsync(30); await Task.WhenAll(summaryTask, filingsTask); summary = await summaryTask; upcomingFilings = (await filingsTask).ToList(); } private static string GetStatusLabel(string status) => InquiryStatusMapper.Labels.GetValueOrDefault(status, status); private static Color StatusColor(string status) => status switch { "new" => Color.Warning, "consulting" => Color.Info, "contracted" => Color.Success, "rejected" => Color.Error, "closed" => Color.Dark, _ => Color.Default }; }