CUSTOMER-SERVICE-TODO-URGENT-SYNC-COMPLETE.md 12 KB

客服板块紧急事件和待办任务功能复用完成

📋 功能概述

成功将设计师组长板块的紧急事件和待办任务功能复用到客服工作台,实现数据统一管理和展示一致性。

🎯 实现内容

1. 数据结构复用

新增接口 (dashboard.ts):

// 从问题板块映射的待办任务(复用组长端结构)
interface TodoTaskFromIssue {
  id: string;
  title: string;
  description?: string;
  priority: IssuePriority;  // 'low' | 'medium' | 'high' | 'critical' | 'urgent'
  type: IssueType;          // 'bug' | 'task' | 'feedback' | 'risk' | 'feature'
  status: IssueStatus;      // 'open' | 'in_progress' | 'resolved' | 'closed'
  projectId: string;
  projectName: string;
  relatedSpace?: string;
  relatedStage?: string;
  assigneeName?: string;
  creatorName?: string;
  createdAt: Date;
  updatedAt: Date;
  dueDate?: Date;
  tags?: string[];
}

新增 Signals:

// 从问题板块加载的待办任务列表(复用组长端)
todoTasksFromIssues = signal<TodoTaskFromIssue[]>([]);
loadingTodoTasks = signal(false);
todoTaskError = signal('');

2. 核心功能方法

2.1 加载待办任务 (loadTodoTasksFromIssues)

功能描述:

  • ProjectIssue 表查询所有待处理和处理中的问题
  • 转换为统一的待办任务格式
  • 按优先级自动排序
  • 自动筛选出紧急任务

查询逻辑:

// 查询条件
issueQuery.containedIn('status', ['open', 'in_progress']);
issueQuery.include(['project', 'assignee', 'creator', 'relatedSpace']);
issueQuery.descending('priority');
issueQuery.descending('createdAt');
issueQuery.limit(100);

优先级排序:

const priorityOrder: Record<IssuePriority, number> = {
  urgent: 0,    // 紧急
  critical: 0,  // 紧急
  high: 1,      // 高
  medium: 2,    // 中
  low: 3        // 低
};

2.2 同步紧急任务 (syncUrgentTasksFromTodos)

筛选规则:

  • 优先级为 urgentcriticalhigh 的任务自动显示在"紧急事件"区域
  • 自动转换为 Task 格式以兼容现有 UI

转换逻辑:

const urgentIssues = tasks.filter(task => 
  task.priority === 'urgent' || 
  task.priority === 'critical' || 
  task.priority === 'high'
);

2.3 辅助方法

优先级配置:

getPriorityConfig(priority: IssuePriority): { label, icon, color, order }
- urgent/critical: 🔴 紧急 (#dc2626)
- high: 🟠 高 (#ea580c)
- medium: 🟡 中 (#ca8a04)
- low: ⚪ 低 (#9ca3af)

类型标签:

getIssueTypeLabel(type: IssueType): string
- bug: 缺陷
- feature: 需求
- task: 任务
- feedback: 反馈
- risk: 风险

状态标签:

getIssueStatusLabel(status: IssueStatus): string
- open: 待处理
- in_progress: 处理中
- resolved: 已解决
- closed: 已关闭

3. UI 界面更新

3.1 紧急事件区域

特点:

  • 自动显示高优先级任务 (urgent/critical/high)
  • 保持原有的任务卡片样式
  • 支持标记完成、删除等操作
  • 实时同步更新

3.2 待办任务区域 (dashboard.html)

完整复用组长端设计:

<section class="todo-section-customer-service">
  <!-- 标题和刷新按钮 -->
  <div class="section-header">
    <h2>
      待办任务
      <span class="task-count">({{ todoTasksFromIssues().length }})</span>
    </h2>
    <button class="btn-refresh" (click)="refreshTodoTasks()">
      <svg [class.rotating]="loadingTodoTasks()">...</svg>
    </button>
  </div>
  
  <!-- 加载/错误/空状态 -->
  <div class="loading-state">...</div>
  <div class="error-state">...</div>
  <div class="empty-state">...</div>
  
  <!-- 待办任务列表 -->
  <div class="todo-list-compact">
    <div class="todo-item-compact" (click)="navigateToIssue(task)">
      <!-- 优先级指示条 -->
      <div class="priority-indicator" [attr.data-priority]="task.priority"></div>
      
      <!-- 任务内容 -->
      <div class="task-content">
        <div class="task-header">
          <span class="task-title">{{ task.title }}</span>
          <div class="task-badges">
            <span class="badge badge-priority">🔴 紧急</span>
            <span class="badge badge-type">缺陷</span>
          </div>
        </div>
        
        <div class="task-meta">
          <span>📋 {{ task.projectName }}</span>
          <span>🔄 {{ task.relatedStage }}</span>
          <span>👤 {{ task.assigneeName }}</span>
        </div>
        
        <div class="task-footer">
          <span>{{ formatDateTime(task.createdAt) }}</span>
          <span class="due-date">⏰ {{ task.dueDate | date }}</span>
        </div>
      </div>
    </div>
  </div>
</section>

4. 样式设计 (dashboard.scss)

完整复用组长端样式:

核心类名:

  • .todo-section-customer-service - 主容器
  • .todo-list-compact - 任务列表
  • .todo-item-compact - 单个任务卡片
  • .priority-indicator - 左侧优先级色条
  • .task-content - 任务内容区
  • .task-badges - 标签徽章

优先级色条:

.priority-indicator {
  width: 4px;
  
  &[data-priority="urgent"],
  &[data-priority="critical"] {
    background: linear-gradient(180deg, #dc2626 0%, #991b1b 100%); // 红色
  }
  
  &[data-priority="high"] {
    background: linear-gradient(180deg, #f97316 0%, #ea580c 100%); // 橙色
  }
  
  &[data-priority="medium"] {
    background: linear-gradient(180deg, #eab308 0%, #ca8a04 100%); // 黄色
  }
  
  &[data-priority="low"] {
    background: linear-gradient(180deg, #d1d5db 0%, #9ca3af 100%); // 灰色
  }
}

交互效果:

.todo-item-compact {
  cursor: pointer;
  transition: all 0.2s;
  
  &:hover {
    background: #f9fafb;
    border-color: #d1d5db;
    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.08);
    transform: translateY(-1px);
  }
}

加载动画:

@keyframes rotate {
  from { transform: rotate(0deg); }
  to { transform: rotate(360deg); }
}

svg.rotating {
  animation: rotate 1s linear infinite;
}

📊 数据流程

1. 数据加载流程

初始化 (ngOnInit)
    ↓
loadDashboardData()
    ↓
loadTodoTasksFromIssues() ← 查询 ProjectIssue 表
    ↓
转换数据格式 → TodoTaskFromIssue[]
    ↓
按优先级排序
    ↓
syncUrgentTasksFromTodos() ← 筛选紧急任务
    ↓
更新 todoTasksFromIssues signal
更新 urgentTasks signal
    ↓
UI 自动刷新

2. 紧急事件与待办任务的关系

ProjectIssue 表
    ↓
查询 status = ['open', 'in_progress']
    ↓
    ├─→ 全部任务 → 待办任务区域 (todoTasksFromIssues)
    │   └─ 点击跳转 → navigateToIssue()
    │
    └─→ 高优先级筛选 → 紧急事件区域 (urgentTasks)
        priority = ['urgent', 'critical', 'high']
        └─ 标记完成 → markTaskAsCompleted()

3. 数据更新机制

手动刷新:

refreshTodoTasks() {
  loadTodoTasksFromIssues()
  ↓
  重新查询数据库
  ↓
  更新两个区域
}

自动同步:

  • 待办任务更新时,紧急事件区域自动同步
  • 使用 Angular Signals 实现响应式更新

🎨 UI 特性

1. 视觉层次

优先级视觉表现:

  • ��急/紧急:红色指示条 + 红色徽章
  • 高优先级:橙色指示条 + 橙色徽章
  • 中优先级:黄色指示条 + 黄色徽章
  • 低优先级:灰色指示条 + 灰色徽章

2. 交互体验

状态反馈:

  • 加载中:旋转动画 + "加载待办任务中..."
  • 错误:错误图标 + 错误信息 + 重试按钮
  • 空状态:插图 + "暂无待办任务" + "所有问题都已处理完毕 🎉"
  • 成功:流畅的列表展示

鼠标悬停:

  • 卡片上浮效果
  • 阴影增强
  • 背景色变化
  • 边框高亮

3. 信息密度

紧凑设计:

  • 单行显示任务标题
  • 徽章显示优先级和类型
  • 元信息显示项目、阶段、责任人
  • 底部显示时间信息

🔧 技术要点

1. 类型安全

严格类型定义:

// IssueType 只有 5 种类型
type IssueType = 'bug' | 'task' | 'feedback' | 'risk' | 'feature';

// IssueStatus 只有 4 种状态
type IssueStatus = 'open' | 'in_progress' | 'resolved' | 'closed';

// IssuePriority 有 5 个级别
type IssuePriority = 'low' | 'medium' | 'high' | 'critical' | 'urgent';

2. 函数复用

避免重复定义:

  • 删除旧的 getIssueTypeLabel 实现
  • 统一使用新的方法
  • 确保类型匹配

3. 性能优化

查询优化:

  • 使用 include 预加载关联数据
  • 限制查询数量 (limit: 100)
  • 前端排序减少数据库压力

渲染优化:

  • 使用 track 优化列表渲染
  • Signals 实现精确更新
  • CSS 动画使用 transform (硬件加速)

🐛 问题修复

修复的编译错误

1. 重复函数定义:

error TS2393: Duplicate function implementation.
getIssueTypeLabel(type?: IssueType | string)  // 旧实现(已删除)
getIssueTypeLabel(type: IssueType)            // 新实现(保留)

2. 类型不匹配:

error TS2353: 'improvement' does not exist in type 'Record<IssueType, string>'
// 修复:移除不存在的类型 'improvement', 'question', 'documentation', 'other'

error TS2353: 'pending' does not exist in type 'Record<IssueStatus, string>'
// 修复:使用正确的状态 'open' 而不是 'pending'

数据兼容性处理

状态值统一:

  • 查询时使用英文状态:['open', 'in_progress']
  • 显示时使用中文标签:待处理, 处理中
  • 默认状态从 'pending' 改为 'open'

📈 使用效果

1. 数据统一

单一数据源:

  • 客服和组长看到相同的待办任务
  • 数据实时同步,避免信息差
  • 任务状态统一管理

2. 工作效率提升

快速定位问题:

  • 紧急事件优先显示
  • 一键跳转到项目详情
  • 清晰的优先级标识

减少重复工作:

  • 复用已有代码
  • 统一的交互逻辑
  • 一致的视觉体验

3. 维护性提升

代码复用:

  • 组长端和客服端共享核心逻辑
  • 统一的类型定义
  • 统一的样式规范

🔍 控制台日志

加载过程:

🔍 [客服-待办任务] 开始加载待办任务...
📊 [客服-待办任务] 找到 X 个问题
✅ [客服-待办任务] 加载完成: X 个任务
🔥 [客服-紧急事件] 筛选出 X 个紧急任务

错误处理:

❌ [客服-待办任务] 加载失败: [错误信息]

手动刷新:

🔄 [客服-待办任务] 手动刷新...

✅ 测试要点

1. 数据加载测试

  • ✅ 页面加载时自动获取待办任务
  • ✅ 正确显示加载状态
  • ✅ 错误时显示错误信息和重试按钮
  • ✅ 无数据时显示友好的空状态

2. 功能测试

  • ✅ 紧急任务自动筛选并显示在紧急事件区域
  • ✅ 点击任务跳转到项目详情页
  • ✅ 手动刷新按钮正常工作
  • ✅ 任务按优先级正确排序

3. UI 测试

  • ✅ 优先级色条颜色正确
  • ✅ 徽章显示正确
  • ✅ hover 效果流畅
  • ✅ 响应式布局正常

4. 性能测试

  • ✅ 100 个任务流畅加载
  • ✅ Signals 更新性能良好
  • ✅ 无内存泄漏

🎉 总结

成功实现客服板块与组长板块的紧急事件和待办任务功能复用:

  1. 数据统一:从同一个 ProjectIssue 表加载数据
  2. 逻辑复用:完全复用组长端的查询和筛选逻辑
  3. UI 一致:界面设计和交互体验保持一致
  4. 类型安全:严格的 TypeScript 类型定义
  5. 性能优化:使用 Signals 和高效的查询策略

客服人员现在可以:

  • 查看所有待办任务(待办任务区域)
  • 快速关注紧急问题(紧急事件区域)
  • 一键跳转到项目详情处理问题
  • 与组长端数据实时同步