project-review.html 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <header class="project-review-header">
  2. <h1>项目评审</h1>
  3. </header>
  4. <main class="project-review-main">
  5. <!-- 效果图可行性测试 -->
  6. <section class="feasibility-section">
  7. <div class="section-header">
  8. <h2>效果图可行性测试</h2>
  9. </div>
  10. <div class="test-form">
  11. <div class="form-group">
  12. <label>客户需求对图描述</label>
  13. <textarea [(ngModel)]="testForm.description" placeholder="请输入客户需求描述..."></textarea>
  14. </div>
  15. <div class="form-group">
  16. <label>上传效果图</label>
  17. <div class="file-upload">
  18. <input type="file" (change)="onFileSelected($event)" accept="image/png, image/jpeg">
  19. <div class="upload-placeholder">
  20. <span class="upload-icon">+</span>
  21. <p>点击或拖拽图片到此处上传</p>
  22. <p class="upload-hint">支持 PNG、JPG 格式</p>
  23. </div>
  24. </div>
  25. <div *ngIf="selectedImage" class="image-preview">
  26. <img [src]="selectedImage" alt="效果图预览">
  27. <button (click)="removeImage()" class="btn-remove">移除</button>
  28. </div>
  29. </div>
  30. <button (click)="runFeasibilityTest()" class="btn-run-test" [disabled]="!testForm.description || !selectedImage">
  31. 运行可行性测试
  32. </button>
  33. </div>
  34. <!-- 测试结果 -->
  35. <div *ngIf="testResult" class="test-result">
  36. <div class="result-header">
  37. <h3>测试结果分析</h3>
  38. <div class="result-tags">
  39. <span [class]="'tag ' + (testResult.overallStatus === 'pass' ? 'pass' : testResult.overallStatus === 'warning' ? 'warning' : 'fail')">
  40. {{ testResult.overallStatus === 'pass' ? '通过' : testResult.overallStatus === 'warning' ? '需修改' : '不通过' }}
  41. </span>
  42. </div>
  43. </div>
  44. <div class="result-content">
  45. <div class="result-section">
  46. <h4>技术角度评估</h4>
  47. <ul class="evaluation-list">
  48. <li *ngFor="let item of testResult.technicalEvaluation">
  49. <span class="eval-label">{{ item.name }}:</span>
  50. <span [class]="'eval-value ' + item.status">{{ item.value }}%</span>
  51. <span class="eval-status">{{ getStatusLabel(item.status) }}</span>
  52. </li>
  53. </ul>
  54. </div>
  55. <div class="result-section">
  56. <h4>需求角度评估</h4>
  57. <p class="requirement-match">{{ testResult.requirementMatch }}</p>
  58. <div class="suggestions">
  59. <h5>修改建议:</h5>
  60. <ul>
  61. <li *ngFor="let suggestion of testResult.modificationSuggestions">{{ suggestion }}</li>
  62. </ul>
  63. </div>
  64. </div>
  65. <div class="reference-images">
  66. <h4>参考案例</h4>
  67. <div class="image-grid">
  68. <div *ngFor="let ref of testResult.referenceImages" class="reference-item">
  69. <img [src]="ref.url" alt="参考案例">
  70. <p class="reference-hint">{{ ref.hint }}</p>
  71. </div>
  72. </div>
  73. </div>
  74. <div class="result-actions">
  75. <button (click)="submitToQualityManagement()" class="btn-submit">提交至质量管理</button>
  76. </div>
  77. </div>
  78. </div>
  79. </section>
  80. <!-- 项目分配审核与执行 -->
  81. <section class="assignment-section">
  82. <div class="section-header">
  83. <h2>项目分配审核与执行</h2>
  84. </div>
  85. <div class="assignment-form">
  86. <div class="form-group">
  87. <label>项目名称</label>
  88. <select [(ngModel)]="assignmentForm.projectId">
  89. <option value="">请选择项目</option>
  90. <option *ngFor="let project of availableProjects" [value]="project.id">{{ project.name }}</option>
  91. </select>
  92. </div>
  93. <div class="form-group">
  94. <label>分配方式</label>
  95. <select [(ngModel)]="assignmentForm.assignmentType" (change)="onAssignmentTypeChange()">
  96. <option value="customer-service">客服指定</option>
  97. <option value="system-recommend">系统推荐</option>
  98. </select>
  99. </div>
  100. <!-- 客服指定分配 -->
  101. <div *ngIf="assignmentForm.assignmentType === 'customer-service'" class="specified-assignment">
  102. <div class="form-group">
  103. <label>客服指定设计师</label>
  104. <select [(ngModel)]="assignmentForm.specifiedDesignerId" (change)="checkDesignerWorkload()">
  105. <option value="">请选择设计师</option>
  106. <option *ngFor="let designer of designers" [value]="designer.id">{{ designer.name }}</option>
  107. </select>
  108. </div>
  109. <div *ngIf="designerWorkloadStatus" class="workload-status">
  110. <span [class]="'status ' + designerWorkloadStatus.status">
  111. {{ designerWorkloadStatus.message }}
  112. </span>
  113. <div *ngIf="designerWorkloadStatus.status === 'busy'" class="alternative-suggestions">
  114. <p>推荐备选设计师:</p>
  115. <div class="designer-suggestions">
  116. <div *ngFor="let suggestion of alternativeDesigners" class="designer-card">
  117. <p class="designer-name">{{ suggestion.name }}</p>
  118. <p class="designer-skill">擅长: {{ suggestion.skills }}</p>
  119. <p class="designer-workload">工作量: {{ suggestion.workload }}%</p>
  120. <button (click)="selectAlternativeDesigner(suggestion.id)" class="btn-select">选择</button>
  121. </div>
  122. </div>
  123. </div>
  124. </div>
  125. </div>
  126. <!-- 系统推荐分配 -->
  127. <div *ngIf="assignmentForm.assignmentType === 'system-recommend'" class="recommended-assignment">
  128. <div *ngIf="recommendedDesigners.length > 0" class="designer-recommendations">
  129. <p>系统推荐设计师 (按能力匹配度排序):</p>
  130. <div class="designer-cards">
  131. <div *ngFor="let designer of recommendedDesigners" class="designer-card">
  132. <div class="card-header">
  133. <p class="designer-name">{{ designer.name }}</p>
  134. <p class="match-score">匹配度: {{ designer.matchScore }}%</p>
  135. </div>
  136. <div class="card-body">
  137. <p class="designer-skill">擅长: {{ designer.skills }}</p>
  138. <p class="designer-workload">工作量: {{ designer.workload }}%</p>
  139. <div class="designer-stats">
  140. <div class="stat-item">
  141. <span class="stat-label">完成率</span>
  142. <span class="stat-value">{{ designer.completionRate }}%</span>
  143. </div>
  144. <div class="stat-item">
  145. <span class="stat-label">满意度</span>
  146. <span class="stat-value">{{ designer.satisfactionRate }}%</span>
  147. </div>
  148. </div>
  149. </div>
  150. <div class="card-footer">
  151. <button (click)="confirmAssignment(designer.id)" class="btn-assign">确认分配</button>
  152. </div>
  153. </div>
  154. </div>
  155. </div>
  156. </div>
  157. <button (click)="executeAssignment()" class="btn-execute" [disabled]="!canExecuteAssignment()">
  158. 执行分配
  159. </button>
  160. </div>
  161. <!-- 分配结果 -->
  162. <div *ngIf="assignmentResult" class="assignment-result">
  163. <div class="result-content">
  164. <div class="result-icon success">✓</div>
  165. <h3>分配成功</h3>
  166. <p>{{ assignmentResult.message }}</p>
  167. <div class="result-details">
  168. <p><strong>项目:</strong> {{ assignmentResult.projectName }}</p>
  169. <p><strong>分配给:</strong> {{ assignmentResult.designerName }}</p>
  170. <p><strong>分配时间:</strong> {{ assignmentResult.assignTime | date:'yyyy-MM-dd HH:mm' }}</p>
  171. </div>
  172. </div>
  173. </div>
  174. </section>
  175. </main>