123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- import { Component, OnInit } from '@angular/core';
- import { CommonModule } from '@angular/common';
- import { RouterModule } from '@angular/router';
- import { ProjectService } from '../../../services/project.service';
- import { Task, RenderProgress, CustomerFeedback } from '../../../models/project.model';
- @Component({
- selector: 'app-dashboard',
- imports: [CommonModule, RouterModule],
- templateUrl: './dashboard.html',
- styleUrl: './dashboard.scss'
- })
- export class Dashboard implements OnInit {
- tasks: Task[] = [];
- overdueTasks: Task[] = [];
- urgentTasks: Task[] = [];
- pendingFeedbacks: {task: Task, feedback: CustomerFeedback}[] = [];
- reminderMessage: string = '';
- feedbackProjectId: string = '';
- countdowns: Map<string, string> = new Map();
- constructor(private projectService: ProjectService) {}
- ngOnInit(): void {
- this.loadTasks();
- }
- loadTasks(): void {
- this.projectService.getTasks().subscribe(tasks => {
- // 按阶段优先级排序:建模 > 渲染 > 对图 > 反馈处理 > 后期 > 其他
- this.tasks = tasks.sort((a, b) => {
- const stagePriority: Record<string, number> = {
- '建模': 5,
- '渲染': 4,
- '对图': 3,
- '反馈处理': 2,
- '后期': 1,
- '完成': 0
- };
-
- const priorityA = stagePriority[a.stage] || 0;
- const priorityB = stagePriority[b.stage] || 0;
-
- if (priorityA !== priorityB) {
- return priorityB - priorityA;
- }
-
- // 优先级相同时,按截止日期排序
- return a.deadline.getTime() - b.deadline.getTime();
- });
-
- // 筛选超期任务
- this.overdueTasks = this.tasks.filter(task => task.isOverdue);
-
- // 筛选紧急任务(渲染超时预警,交付前3小时/1小时)
- this.urgentTasks = this.tasks.filter(task => {
- const now = new Date();
- const diffHours = (task.deadline.getTime() - now.getTime()) / (1000 * 60 * 60);
- return diffHours <= 3 && diffHours > 0 && task.stage === '渲染';
- });
-
- // 设置反馈项目ID
- if (this.overdueTasks.length > 0) {
- this.feedbackProjectId = this.overdueTasks[0].projectId;
- }
-
- // 加载待处理反馈
- this.loadPendingFeedbacks();
-
- // 启动倒计时
- this.startCountdowns();
- });
- }
-
- loadPendingFeedbacks(): void {
- this.pendingFeedbacks = [];
-
- // 模拟加载待处理反馈数据
- this.tasks.forEach(task => {
- // 使用模拟数据代替API调用
- const mockFeedbacks = [
- {
- id: 'fb-' + task.id,
- projectId: task.projectId,
- content: '客户对色彩不满意,需要调整',
- isSatisfied: false,
- problemLocation: '色彩',
- expectedEffect: '更明亮的色调',
- referenceCase: '无',
- status: '待处理' as const,
- createdAt: new Date(Date.now() - 30 * 60 * 1000) // 30分钟前
- },
- {
- id: 'fb-' + task.id + '-2',
- projectId: task.projectId,
- content: '家具款式需要调整',
- isSatisfied: false,
- problemLocation: '家具',
- expectedEffect: '更现代的款式',
- referenceCase: '无',
- status: '待处理' as const,
- createdAt: new Date(Date.now() - 45 * 60 * 1000) // 45分钟前
- }
- ];
-
- const pending = mockFeedbacks.filter(feedback =>
- feedback.status === '待处理' &&
- !feedback.isSatisfied
- );
-
- if (pending.length > 0) {
- this.pendingFeedbacks.push({task, feedback: pending[0]});
- }
- });
- }
-
- startCountdowns(): void {
- // 清除之前的定时器
- this.countdowns.clear();
-
- // 为渲染任务启动倒计时
- this.tasks.forEach(task => {
- if (task.stage === '渲染') {
- this.updateCountdown(task.id, task.deadline);
- }
- });
-
- // 定期更新倒计时
- setInterval(() => {
- this.tasks.forEach(task => {
- if (task.stage === '渲染') {
- this.updateCountdown(task.id, task.deadline);
- }
- });
- }, 60000); // 每分钟更新一次
- }
-
- updateCountdown(taskId: string, deadline: Date): void {
- const now = new Date();
- const diffMs = deadline.getTime() - now.getTime();
-
- if (diffMs <= 0) {
- this.countdowns.set(taskId, '已超期');
- return;
- }
-
- const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
- const diffMinutes = Math.floor((diffMs % (1000 * 60 * 60)) / (1000 * 60));
-
- if (diffHours > 0) {
- this.countdowns.set(taskId, `${diffHours}小时${diffMinutes}分钟`);
- } else {
- this.countdowns.set(taskId, `${diffMinutes}分钟`);
- }
- }
-
- getTaskCountdown(taskId: string): string {
- return this.countdowns.get(taskId) || '';
- }
-
- getTaskStageProgress(taskId: string): number {
- // 在实际应用中,这里会从服务中获取真实的进度
- const stageProgress: Record<string, number> = {
- '建模': Math.floor(Math.random() * 100),
- '渲染': Math.floor(Math.random() * 100),
- '对图': Math.floor(Math.random() * 100),
- '反馈处理': Math.floor(Math.random() * 100),
- '后期': Math.floor(Math.random() * 100)
- };
-
- const task = this.tasks.find(t => t.id === taskId);
- return task ? (stageProgress[task.stage] || 0) : 0;
- }
- markTaskAsCompleted(taskId: string): void {
- this.projectService.markTaskAsCompleted(taskId).subscribe(() => {
- this.loadTasks(); // 重新加载任务列表
- });
- }
-
- handleFeedback(taskId: string): void {
- const task = this.tasks.find(t => t.id === taskId);
- if (task) {
- // 跳转到项目详情的反馈处理页面
- window.location.href = `/designer/project-detail/${task.projectId}#feedback`;
- }
- }
- generateReminderMessage(): void {
- this.projectService.generateReminderMessage('overdue').subscribe(message => {
- this.reminderMessage = message;
- });
- }
- clearReminder(): void {
- this.reminderMessage = '';
- }
- }
|