dashboard.html 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <!-- 顶部导航栏 -->
  2. <nav class="top-navbar">
  3. <div class="navbar-left">
  4. <h2 class="navbar-title">设计组长工作台</h2>
  5. </div>
  6. <div class="navbar-right">
  7. <div class="date-display">
  8. {{ currentDate.toLocaleDateString('zh-CN', { year: 'numeric', month: 'long', day: 'numeric', weekday: 'long' }) }}
  9. </div>
  10. <div class="user-profile">
  11. <img [src]="currentUser.avatar" [alt]="currentUser.name + '头像'" class="user-avatar">
  12. <span class="user-name">{{ currentUser.name }}</span>
  13. <span class="user-role">{{ currentUser.roleName }}</span>
  14. </div>
  15. </div>
  16. </nav>
  17. <header class="dashboard-header">
  18. <!-- 核心数据指标卡片(扩展为6个) -->
  19. <app-dashboard-metrics
  20. [overdueCount]="overdueProjects.length"
  21. [dueSoonCount]="dueSoonProjects.length"
  22. [pendingApprovalCount]="pendingApprovalProjects.length"
  23. [pendingAssignmentCount]="pendingAssignmentProjects.length"
  24. [overloadedDesignersCount]="overloadedDesignersCount"
  25. [averageWorkloadRate]="averageWorkloadRate"
  26. (filterStatus)="filterByStatus($event)">
  27. </app-dashboard-metrics>
  28. </header>
  29. <main class="dashboard-main">
  30. <!-- 项目监控大盘 -->
  31. <section class="monitoring-section">
  32. <div class="section-header">
  33. <h2>项目监控大盘</h2>
  34. <div class="section-actions">
  35. @if (selectedStatus !== 'all') {
  36. <button class="btn-link" (click)="resetStatusFilter()">返回全部项目</button>
  37. }
  38. </div>
  39. </div>
  40. <!-- 工作量负载概览 -->
  41. <app-workload-gantt
  42. [designerWorkloadMap]="designerWorkloadMap"
  43. [realDesigners]="realDesigners"
  44. [filteredProjects]="filteredProjects"
  45. (employeeClick)="onEmployeeClick($event)">
  46. </app-workload-gantt>
  47. <!-- 视图切换按钮(固定在此位置便于切换) -->
  48. <div class="view-toggle-bar">
  49. <button class="btn-toggle-view" (click)="toggleView()">
  50. <span class="toggle-icon">{{ showGanttView ? '📋' : '📊' }}</span>
  51. <span class="toggle-text">{{ showGanttView ? '切换到项目看板' : '切换到时间轴视图' }}</span>
  52. </button>
  53. </div>
  54. <!-- 项目负载时间轴(切换视图时显示) -->
  55. @if (showGanttView) {
  56. <app-project-timeline
  57. [projects]="projectTimelineData"
  58. [companyId]="currentUser.name"
  59. (projectClick)="onProjectTimelineClick($event)">
  60. </app-project-timeline>
  61. }
  62. @if (!showGanttView) {
  63. <app-dashboard-filter-bar
  64. [projects]="projects"
  65. [designers]="designers"
  66. [corePhases]="corePhases"
  67. [(searchTerm)]="searchTerm"
  68. [(selectedType)]="selectedType"
  69. [(selectedUrgency)]="selectedUrgency"
  70. [(selectedStatus)]="selectedStatus"
  71. [(selectedDesigner)]="selectedDesigner"
  72. [(selectedMemberType)]="selectedMemberType"
  73. [(selectedCorePhase)]="selectedCorePhase"
  74. [(selectedProjectId)]="selectedProjectId"
  75. [(selectedTimeWindow)]="selectedTimeWindow"
  76. (filterChange)="applyFilters()"
  77. (viewProject)="viewProjectDetails($event)">
  78. </app-dashboard-filter-bar>
  79. <!-- 项目看板组件 -->
  80. <app-project-kanban
  81. [corePhases]="corePhases"
  82. [projects]="filteredProjects"
  83. (viewProject)="viewProjectDetailsByPhase($event.projectId, $event.phaseId)"
  84. (openSmartMatch)="openSmartMatch($event)"
  85. (assignProject)="quickAssignProject($event)"
  86. (reviewProject)="reviewProjectQuality($event.projectId, $event.rating)">
  87. </app-project-kanban>
  88. }
  89. </section>
  90. <!-- 待办任务双栏布局(待办问题 + 紧急事件) -->
  91. <app-todo-section
  92. [todoTasksFromIssues]="todoTasksFromIssues"
  93. [loadingTodoTasks]="loadingTodoTasks"
  94. [todoTaskError]="todoTaskError"
  95. [urgentEvents]="urgentEvents"
  96. [loadingUrgentEvents]="loadingUrgentEvents"
  97. (refresh)="refreshTodoTasks()"
  98. (navigateToIssue)="navigateToIssue($event)"
  99. (markAsRead)="markAsRead($event)"
  100. (projectClick)="onProjectClick($event)"
  101. (confirmEventOnTime)="confirmEventOnTime($event)"
  102. (markEventAsStagnant)="markEventAsStagnant($event)"
  103. (resolveUrgentEvent)="resolveUrgentEvent($event)"
  104. (createTodoFromEvent)="createTodoFromEvent($event)">
  105. </app-todo-section>
  106. <!-- 超期/紧急项目提醒组件 -->
  107. <app-dashboard-alerts
  108. [showAlert]="showAlert"
  109. [overdueProjects]="overdueProjects"
  110. [urgentPinnedProjects]="urgentPinnedProjects"
  111. (viewAllOverdue)="viewAllOverdueProjects()"
  112. (closeAlert)="closeAlert()"
  113. (filterStatus)="filterByStatus($event)">
  114. </app-dashboard-alerts>
  115. </main>
  116. <!-- 员工详情面板组件 -->
  117. <app-employee-detail-panel
  118. [visible]="showEmployeeDetailPanel"
  119. [employeeName]="selectedEmployeeName"
  120. [projects]="selectedEmployeeProjects"
  121. (close)="closeEmployeeDetailPanel()"
  122. (projectClick)="navigateToProjectFromPanel($event)">
  123. </app-employee-detail-panel>
  124. <!-- 智能推荐弹窗 -->
  125. <app-smart-match-modal
  126. [visible]="showSmartMatch"
  127. [selectedProject]="selectedProject"
  128. [recommendations]="recommendations"
  129. (close)="closeSmartMatch()"
  130. (assign)="assignToDesigner($event)">
  131. </app-smart-match-modal>