import { Injectable } from '@angular/core'; import { FmodeParse } from 'fmode-ng/parse'; import { IssueStatus, IssuePriority, IssueType } from '../../../../modules/project/services/project-issue.service'; import { TodoTaskFromIssue } from '../dashboard/dashboard.model'; @Injectable({ providedIn: 'root' }) export class TodoTaskService { constructor() { } /** * 从问题板块加载待办任务 */ async getTodoTasks(): Promise { try { const Parse: any = FmodeParse.with('nova'); const query = new Parse.Query('ProjectIssue'); // 筛选条件:待处理 + 处理中 query.containedIn('status', ['待处理', '处理中']); query.notEqualTo('isDeleted', true); // 关联数据 query.include(['project', 'creator', 'assignee']); // 排序:更新时间倒序 query.descending('updatedAt'); // 限制数量 query.limit(50); const results = await query.find(); console.log(`📥 查询到 ${results.length} 条问题记录`); // 数据转换 const tasks = await Promise.all(results.map(async (obj: any) => { let project = obj.get('project'); const assignee = obj.get('assignee'); const creator = obj.get('creator'); const data = obj.get('data') || {}; let projectName = '未知项目'; let projectId = ''; if (project) { projectId = project.id; projectName = project.get('name'); if (!projectName && projectId) { try { const projectQuery = new Parse.Query('Project'); const fetchedProject = await projectQuery.get(projectId); projectName = fetchedProject.get('name') || fetchedProject.get('title') || '未知项目'; } catch (error) { console.warn(`⚠️ 无法加载项目 ${projectId}:`, error); projectName = `项目-${projectId.slice(0, 6)}`; } } } else { console.warn('⚠️ 问题缺少关联项目:', { issueId: obj.id, title: obj.get('title') }); } return { id: obj.id, title: obj.get('title') || obj.get('description')?.slice(0, 40) || '未命名问题', description: obj.get('description'), priority: obj.get('priority') as IssuePriority || 'medium', type: obj.get('issueType') as IssueType || 'task', status: this.zh2enStatus(obj.get('status')) as IssueStatus, projectId, projectName, relatedSpace: obj.get('relatedSpace') || data.relatedSpace, relatedStage: obj.get('relatedStage') || data.relatedStage, assigneeName: assignee?.get('name') || assignee?.get('realname') || '未指派', creatorName: creator?.get('name') || creator?.get('realname') || '未知', createdAt: obj.createdAt || new Date(), updatedAt: obj.updatedAt || new Date(), dueDate: obj.get('dueDate'), tags: (data.tags || []) as string[] } as TodoTaskFromIssue; })); // 排序:优先级 -> 时间 return tasks.sort((a, b) => { const priorityA = this.getPriorityOrder(a.priority); const priorityB = this.getPriorityOrder(b.priority); if (priorityA !== priorityB) { return priorityA - priorityB; } return +new Date(b.updatedAt) - +new Date(a.updatedAt); }); } catch (error) { console.error('❌ 加载待办任务失败:', error); throw error; } } // 状态映射辅助方法 private zh2enStatus(status: string): IssueStatus { const map: Record = { '待处理': 'open', '处理中': 'in_progress', '已解决': 'resolved', '已关闭': 'closed' }; return map[status] || 'open'; } private getPriorityOrder(priority: IssuePriority): number { const config: Record = { urgent: 0, critical: 0, high: 1, medium: 2, low: 3 }; return config[priority] || 2; } }