project-progress-modal.html 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. <!-- 弹窗遮罩 -->
  2. <div class="modal-overlay" *ngIf="visible" (click)="onClose()">
  3. <!-- 弹窗内容 -->
  4. <div class="modal-content" (click)="onContentClick($event)">
  5. <!-- 标题栏 -->
  6. <div class="modal-header">
  7. <h2 class="modal-title">
  8. <span class="icon">📊</span>
  9. 项目进度详情
  10. </h2>
  11. <button class="close-btn" (click)="onClose()" aria-label="关闭">
  12. <span>✕</span>
  13. </button>
  14. </div>
  15. <!-- 项目基本信息 -->
  16. <div class="project-info" *ngIf="summary">
  17. <div class="info-row">
  18. <span class="label">项目名称:</span>
  19. <span class="value">{{ summary.projectName }}</span>
  20. </div>
  21. <div class="info-row">
  22. <span class="label">空间总数:</span>
  23. <span class="value">{{ summary.totalSpaces }} 个</span>
  24. </div>
  25. <div class="info-row">
  26. <span class="label">已完成空间:</span>
  27. <span class="value">{{ summary.spacesWithDeliverables }} / {{ summary.totalSpaces }}</span>
  28. </div>
  29. </div>
  30. <!-- 整体进度 -->
  31. <div class="overall-progress" *ngIf="summary">
  32. <div class="progress-header">
  33. <span class="label">整体完成率</span>
  34. <span class="percentage" [style.color]="getOverallProgressColor()">
  35. {{ summary.overallCompletionRate }}%
  36. </span>
  37. <span class="status-badge" [style.background-color]="getOverallProgressColor()">
  38. {{ getOverallStatusLabel() }}
  39. </span>
  40. </div>
  41. <div class="progress-bar-container">
  42. <div class="progress-bar-bg">
  43. <div
  44. class="progress-bar-fill"
  45. [style.width.%]="summary.overallCompletionRate"
  46. [style.background-color]="getOverallProgressColor()">
  47. </div>
  48. </div>
  49. </div>
  50. </div>
  51. <!-- 文件统计 -->
  52. <div class="file-stats" *ngIf="summary">
  53. <div class="stats-title">交付文件统计</div>
  54. <div class="stats-grid">
  55. <div class="stat-item">
  56. <span class="stat-icon">🏗️</span>
  57. <span class="stat-label">白模</span>
  58. <span class="stat-value">{{ summary.totalByType.whiteModel }}</span>
  59. </div>
  60. <div class="stat-item">
  61. <span class="stat-icon">🎨</span>
  62. <span class="stat-label">软装</span>
  63. <span class="stat-value">{{ summary.totalByType.softDecor }}</span>
  64. </div>
  65. <div class="stat-item">
  66. <span class="stat-icon">🖼️</span>
  67. <span class="stat-label">渲染</span>
  68. <span class="stat-value">{{ summary.totalByType.rendering }}</span>
  69. </div>
  70. <div class="stat-item">
  71. <span class="stat-icon">✨</span>
  72. <span class="stat-label">后期</span>
  73. <span class="stat-value">{{ summary.totalByType.postProcess }}</span>
  74. </div>
  75. </div>
  76. <div class="stats-total">
  77. 总计:<strong>{{ summary.totalDeliverableFiles }}</strong> 个文件
  78. </div>
  79. </div>
  80. <!-- 各阶段进度详情 -->
  81. <div class="phase-progress" *ngIf="summary">
  82. <div class="section-title">各阶段进度明细</div>
  83. <div class="phase-list">
  84. <div
  85. *ngFor="let phase of getPhases()"
  86. class="phase-item"
  87. [class.expanded]="isPhaseExpanded(phase.name)">
  88. <!-- 阶段概览(可点击展开/收起) -->
  89. <div class="phase-overview" (click)="togglePhase(phase.name)">
  90. <div class="phase-header">
  91. <span class="phase-icon">{{ PHASE_INFO[phase.name].icon }}</span>
  92. <span class="phase-label">{{ phase.info.phaseLabel }}</span>
  93. <span class="phase-progress-badge" [style.background-color]="getPhaseProgressColor(phase.info.completionRate)">
  94. {{ phase.info.completionRate }}%
  95. </span>
  96. <span class="expand-icon">{{ isPhaseExpanded(phase.name) ? '▼' : '▶' }}</span>
  97. </div>
  98. <div class="phase-summary">
  99. <span class="summary-text">
  100. 已完成 {{ phase.info.completedSpaces }} / {{ phase.info.requiredSpaces }} 个空间
  101. ({{ phase.info.totalFiles }} 个文件)
  102. </span>
  103. </div>
  104. <!-- 阶段进度条 -->
  105. <div class="phase-progress-bar">
  106. <div class="progress-bar-bg">
  107. <div
  108. class="progress-bar-fill"
  109. [style.width.%]="phase.info.completionRate"
  110. [style.background-color]="getPhaseProgressColor(phase.info.completionRate)">
  111. </div>
  112. </div>
  113. </div>
  114. </div>
  115. <!-- 未完成空间详情(展开时显示) -->
  116. <div class="phase-details" *ngIf="isPhaseExpanded(phase.name)">
  117. <div class="details-header">
  118. <span class="details-title">未完成空间列表</span>
  119. <span class="details-count">({{ phase.info.incompleteSpaces.length }} 个)</span>
  120. </div>
  121. <div class="incomplete-spaces" *ngIf="phase.info.incompleteSpaces.length > 0">
  122. <div
  123. *ngFor="let space of phase.info.incompleteSpaces"
  124. class="space-item">
  125. <span class="space-icon">📦</span>
  126. <span class="space-name">{{ space.spaceName }}</span>
  127. <span class="assignee" *ngIf="space.assignee">
  128. 负责人:{{ space.assignee }}
  129. </span>
  130. </div>
  131. </div>
  132. <div class="no-incomplete" *ngIf="phase.info.incompleteSpaces.length === 0">
  133. <span class="success-icon">✅</span>
  134. <span>所有空间已完成此阶段交付</span>
  135. </div>
  136. </div>
  137. </div>
  138. </div>
  139. </div>
  140. <!-- 操作按钮 -->
  141. <div class="modal-footer">
  142. <button class="btn btn-secondary" (click)="onClose()">
  143. 关闭
  144. </button>
  145. <button class="btn btn-primary" (click)="onReportIssue()">
  146. <span class="btn-icon">🐛</span>
  147. 提交问题
  148. </button>
  149. </div>
  150. </div>
  151. </div>