| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- 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<TodoTaskFromIssue[]> {
- 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<string, IssueStatus> = {
- '待处理': 'open',
- '处理中': 'in_progress',
- '已解决': 'resolved',
- '已关闭': 'closed'
- };
- return map[status] || 'open';
- }
-
- private getPriorityOrder(priority: IssuePriority): number {
- const config: Record<IssuePriority, number> = {
- urgent: 0,
- critical: 0,
- high: 1,
- medium: 2,
- low: 3
- };
- return config[priority] || 2;
- }
- }
|