20251024-project-list-real-data-integration.md 13 KB

客服项目列表真实数据对接完成总结

完成时间

2024-10-24

任务概述

完成客服板块项目列表页面(/customer-service/project-list)的真实Parse Server数据对接,并按照订单分配、确认需求、交付执行、售后四个阶段正确显示项目。


核心修改

1. 看板列定义修改 ✅

修改前

columns = [
  { id: 'pending', name: '待分配' },
  { id: 'req', name: '需求深化' },
  { id: 'delivery', name: '交付中' },
  { id: 'done', name: '已完成' }
]

修改后

columns = [
  { id: 'order', name: '订单分配' },
  { id: 'requirements', name: '确认需求' },
  { id: 'delivery', name: '交付执行' },
  { id: 'aftercare', name: '售后' }
]

2. 状态筛选选项修改 ✅

statusOptions = [
  { value: 'all', label: '全部' },
  { value: 'order', label: '订单分配' },
  { value: 'requirements', label: '确认需求' },
  { value: 'delivery', label: '交付执行' },
  { value: 'aftercare', label: '售后' }
]

数据对接逻辑

1. Parse Server查询

查询代码

async loadProjects(): Promise<void> {
  const ProjectQuery = new Parse.Query('Project');
  ProjectQuery.equalTo('company', this.getCompanyPointer());
  ProjectQuery.equalTo('isDeleted', false);
  ProjectQuery.include('contact', 'assignee', 'owner');
  ProjectQuery.descending('updatedAt');
  ProjectQuery.limit(500);

  const projectObjects = await ProjectQuery.find();
  
  // 转换为前端格式
  const projects: Project[] = projectObjects.map((obj: FmodeObject) => {
    const contact = obj.get('contact');
    const assignee = obj.get('assignee');
    const mappedStage = this.mapStage(obj.get('currentStage'));
    
    return {
      id: obj.id,
      name: obj.get('title') || '未命名项目',
      customerName: contact?.get('name') || '未知客户',
      status: this.mapStatus(obj.get('status')),
      currentStage: mappedStage,
      assigneeName: assignee?.get('name') || '未分配',
      deadline: obj.get('deadline') || new Date(),
      // ... 其他字段
    };
  });
}

关键字段

  • company: 公司指针(多租户隔离)
  • isDeleted: 软删除标记
  • contact: 客户信息(Pointer → ContactInfo)
  • assignee: 负责设计师(Pointer → Profile)
  • status: 项目状态(进行中/已完成/已暂停/已延期)
  • currentStage: 当前阶段(订单分配/需求沟通/建模/软装/渲染等)
  • deadline: 截止时间

2. 阶段映射

mapStage方法

private mapStage(parseStage: string): ProjectStage {
  // 直接返回Parse Server的阶段,不做转换
  // Parse Server的currentStage字段包含:
  // 订单分配、需求沟通、建模、软装、渲染、后期、尾款结算、投诉处理等
  if (!parseStage) {
    return '需求沟通'; // 默认阶段
  }
  return parseStage as ProjectStage;
}

支持的阶段

  • 订单分配
  • 需求沟通
  • 方案确认
  • 建模
  • 软装
  • 渲染
  • 后期
  • 尾款结算
  • 客户评价
  • 投诉处理

3. 状态映射

mapStatus方法

private mapStatus(parseStatus: string): ProjectStatus {
  const statusMap: Record<string, ProjectStatus> = {
    '进行中': '进行中',
    '已完成': '已完成',
    '已暂停': '已暂停',
    '已延期': '已延期'
  };
  return statusMap[parseStatus] || '进行中';
}

四阶段分组逻辑

1. 订单分配(Order Assignment)

判断条件

private isOrderAssignment(p: Project): boolean {
  // 未分配设计师 或 currentStage为"订单分配"
  return !p.assigneeId || p.assigneeId.trim() === '' || p.currentStage === '订单分配';
}

包含项目

  • 未分配设计师的项目
  • currentStage = "订单分配"

2. 确认需求(Requirements Confirmation)

判断条件

private isRequirementsConfirmation(p: Project): boolean {
  const requirementStages: ProjectStage[] = ['需求沟通', '方案确认'];
  return !this.isAftercare(p) && !this.isOrderAssignment(p) && 
         requirementStages.includes(p.currentStage);
}

包含阶段

  • 需求沟通
  • 方案确认

3. 交付执行(Delivery Execution)

判断条件

private isDeliveryExecution(p: Project): boolean {
  const deliveryStages: ProjectStage[] = ['建模', '软装', '渲染', '后期', '尾款结算'];
  return !this.isAftercare(p) && !this.isOrderAssignment(p) && 
         deliveryStages.includes(p.currentStage);
}

包含阶段

  • 建模
  • 软装
  • 渲染
  • 后期
  • 尾款结算

4. 售后(Aftercare)

判断条件

private isAftercare(p: Project): boolean {
  const aftercareStages: ProjectStage[] = ['投诉处理', '客户评价'];
  return p.status === '已完成' || aftercareStages.includes(p.currentStage);
}

包含情况

  • status = "已完成"
  • currentStage = "投诉处理"
  • currentStage = "客户评价"

方法更新

1. getProjectsByColumn

修改后

getProjectsByColumn(columnId: 'order' | 'requirements' | 'delivery' | 'aftercare'): ProjectListItem[] {
  const list = this.projects();
  switch (columnId) {
    case 'order':
      return list.filter(p => this.isOrderAssignment(p));
    case 'requirements':
      return list.filter(p => this.isRequirementsConfirmation(p));
    case 'delivery':
      return list.filter(p => this.isDeliveryExecution(p));
    case 'aftercare':
      return list.filter(p => this.isAftercare(p));
  }
}

2. getColumnIdForProject

修改后

getColumnIdForProject(project: ProjectListItem): 'order' | 'requirements' | 'delivery' | 'aftercare' {
  if (this.isOrderAssignment(project)) return 'order';
  if (this.isRequirementsConfirmation(project)) return 'requirements';
  if (this.isDeliveryExecution(project)) return 'delivery';
  if (this.isAftercare(project)) return 'aftercare';
  return 'requirements'; // 默认为确认需求阶段
}

3. navigateToProject

修改后

navigateToProject(project: ProjectListItem, columnId: 'order' | 'requirements' | 'delivery' | 'aftercare') {
  const stageMapping = {
    'order': '订单分配',
    'requirements': project.currentStage || '需求沟通',
    'delivery': project.currentStage || '建模',
    'aftercare': '客户评价'
  };
  
  this.router.navigate(['/designer/project-detail', project.id], { 
    queryParams: { 
      role: 'customer-service',
      activeTab: 'progress',
      currentStage: stageMapping[columnId]
    } 
  });
}

HTML模板修改

看板卡片徽章显示

修改前

@if (col.id === 'pending') {
  <span class="pending-badge">待分配</span>
}

修改后

@if (col.id === 'order') {
  <span class="pending-badge">待分配</span>
}

数据流程图

Parse Server (Project表)
  ↓
loadProjects() 查询
  ↓
mapStage() / mapStatus() 映射
  ↓
processProjects() 处理
  ↓
applyFiltersAndSorting() 筛选排序
  ↓
getProjectsByColumn() 按列分组
  ↓
HTML模板渲染
  ↓
四个看板列显示:
  - 订单分配 (order)
  - 确认需求 (requirements)
  - 交付执行 (delivery)
  - 售后 (aftercare)

阶段与列的映射关系

Parse Server currentStage 看板列 列ID
订单分配 订单分配 order
需求沟通 确认需求 requirements
方案确认 确认需求 requirements
建模 交付执行 delivery
软装 交付执行 delivery
渲染 交付执行 delivery
后期 交付执行 delivery
尾款结算 交付执行 delivery
投诉处理 售后 aftercare
客户评价 售后 aftercare
status=已完成 售后 aftercare

修改的文件

TypeScript

  • yss-project/src/app/pages/customer-service/project-list/project-list.ts
    • 修改看板列定义(columns)
    • 修改状态筛选选项(statusOptions)
    • 更新mapStage方法
    • 更新mapStatus方法
    • 重写isOrderAssignment等四个判断方法
    • 更新getProjectsByColumn方法
    • 更新getColumnIdForProject方法
    • 更新navigateToProject方法
    • 更新applyFiltersAndSorting方法

HTML

  • yss-project/src/app/pages/customer-service/project-list/project-list.html
    • 修改待分配徽章显示条件(col.id === 'order')

功能特性

✅ 已实现功能

  1. 真实数据对接

    • 从Parse Server的Project表查询项目
    • 多租户隔离(按company过滤)
    • 软删除过滤(isDeleted = false)
    • 关联查询(include contact, assignee, owner)
  2. 四阶段看板

    • 订单分配:显示未分配设计师的项目
    • 确认需求:显示需求沟通、方案确认阶段的项目
    • 交付执行:显示建模、软装、渲染、后期、尾款结算阶段的项目
    • 售后:显示已完成、投诉处理、客户评价的项目
  3. 数据映射

    • Parse Server字段 → 前端模型
    • currentStage → ProjectStage
    • status → ProjectStatus
    • 自动计算项目进度、截止天数等
  4. 筛选排序

    • 按阶段筛选
    • 按状态筛选
    • 按关键词搜索
    • 按截止日期/创建时间/名称排序
  5. 视图模式

    • 卡片视图(看板)
    • 列表视图
    • 监控大盘视图

编译状态

无TypeScript错误无Linter警告类型检查通过项目可正常运行


测试检查清单

  • Parse Server数据查询正常
  • 项目正确显示在四个看板列
  • 订单分配列显示未分配项目
  • 确认需求列显示需求沟通、方案确认项目
  • 交付执行列显示建模、软装、渲染等项目
  • 售后列显示已完成和投诉处理项目
  • 统计数字正确显示
  • 筛选功能正常
  • 排序功能正常
  • 搜索功能正常
  • 点击项目跳转正常

使用指南

访问页面

http://localhost:4200/customer-service/project-list

查看项目

  1. 页面加载后自动从Parse Server获取项目数据
  2. 项目按照currentStage自动分组到四个看板列
  3. 每列显示该阶段的项目数量

筛选项目

  • 按阶段筛选:选择具体阶段(需求沟通、建模、软装等)
  • 按状态筛选:选择看板列(订单分配、确认需求、交付执行、售后)
  • 关键词搜索:输入项目名称或客户名称

查看项目详情

  • 点击任意项目卡片
  • 跳转到项目详情页
  • 自动传递客服角色标识和当前阶段信息

数据表结构参考

Project表(Parse Server)

字段名 类型 说明 示例值
objectId String 项目ID "abc123"
title String 项目名称 "李总别墅设计"
company Pointer 所属公司 → Company
contact Pointer 客户信息 → ContactInfo
assignee Pointer 负责设计师 → Profile
owner Pointer 创建人 → Profile
status String 项目状态 "进行中"
currentStage String 当前阶段 "建模"
deadline Date 截止时间 2024-12-31
description String 项目描述 "..."
priority String 优先级 "high"
isDeleted Boolean 软删除 false
createdAt Date 创建时间 2024-01-01
updatedAt Date 更新时间 2024-10-24

后续优化建议

1. 性能优化

  • 添加分页加载(当前limit=500)
  • 实现虚拟滚动
  • 缓存已加载的项目数据

2. 功能增强

  • 拖拽项目切换阶段
  • 批量操作(批量分配、批量修改状态)
  • 导出项目列表
  • 项目统计图表

3. 实时更新

  • 使用Parse LiveQuery实时监听项目变化
  • 自动刷新项目列表
  • 显示新项目提示

4. 数据完善

  • 加载项目的Product(空间)数据
  • 显示项目进度百分比
  • 显示项目文件数量
  • 显示客户反馈评分

总结

本次更新成功完成了客服项目列表的真实数据对接,实现了以下核心目标:

真实数据显示 - 从Parse Server加载真实项目数据
四阶段看板 - 按订单分配、确认需求、交付执行、售后分组
正确映射 - Parse Server字段正确映射到前端模型
完整功能 - 筛选、排序、搜索、跳转等功能完整
类型安全 - TypeScript类型检查通过,无编译错误

项目列表现在可以正确显示后端的真实项目数据,并按照业务流程的四个阶段进行组织展示,为客服人员提供了清晰的项目管理视图。

项目现已可以正常编译和运行