20251024-admin-project-data-fix.md 5.2 KB

管理员端项目管理数据对接修复

日期: 2025年10月24日
问题: 管理员端项目管理页面无法显示Parse Server的真实数据
状态: ✅ 已修复

问题分析

管理员端项目管理页面显示"没有找到符合条件的项目",经检查发现是数据库字段名称不匹配导致的。

根本原因

ProjectService 中使用了错误的字段名称:

  • ❌ 使用了 customer 字段
  • ✅ 应该使用 contact 字段

Parse Server数据库中的Project表使用 contact 字段来关联客户信息(ContactInfo表),而不是 customer

修复内容

文件: src/app/pages/admin/services/project.service.ts

1. 修复查询项目列表的include字段

// 修复前
include: ['customer', 'assignee']

// 修复后
include: ['contact', 'assignee']  // 使用 contact 而不是 customer

2. 修复获取单个项目的include字段

// 修复前
return await this.adminData.getById('Project', objectId, [
  'customer',
  'assignee'
]);

// 修复后
return await this.adminData.getById('Project', objectId, [
  'contact',  // 使用 contact 而不是 customer
  'assignee'
]);

3. 修复创建项目时的字段名

// 修复前
if (data.customerId) {
  projectData.customer = {
    __type: 'Pointer',
    className: 'ContactInfo',
    objectId: data.customerId
  };
}

// 修复后
if (data.customerId) {
  projectData.contact = {  // 使用 contact 而不是 customer
    __type: 'Pointer',
    className: 'ContactInfo',
    objectId: data.customerId
  };
}

4. 修复更新项目时的字段名

// 修复前
if (updates.customerId !== undefined) {
  project.set('customer', {
    __type: 'Pointer',
    className: 'ContactInfo',
    objectId: updates.customerId
  });
}

// 修复后
if (updates.customerId !== undefined) {
  project.set('contact', {  // 使用 contact 而不是 customer
    __type: 'Pointer',
    className: 'ContactInfo',
    objectId: updates.customerId
  });
}

5. 修复JSON转换时的字段名

// 修复前
if (json.customer && typeof json.customer === 'object') {
  json.customerName = json.customer.name || '';
  json.customerId = json.customer.objectId;
}

// 修复后
if (json.contact && typeof json.contact === 'object') {
  json.customerName = json.contact.name || '';
  json.customerId = json.contact.objectId;
}

数据库字段对照

Project表关键字段

字段名 类型 说明 关联表
title String 项目标题 -
contact Pointer 客户信息(正确) ContactInfo
assignee Pointer 负责人 Profile
status String 项目状态 -
currentStage String 当前阶段 -
company Pointer 所属公司 Company
isDeleted Boolean 是否删除 -
createdAt Date 创建时间 -
updatedAt Date 更新时间 -

验证结果

修复后的效果:

  • ✅ 项目列表正确显示Parse Server中的真实数据
  • ✅ 客户名称正确显示(从contact关联获取)
  • ✅ 负责人名称正确显示(从assignee关联获取)
  • ✅ 项目状态统计正确
  • ✅ 筛选和搜索功能正常
  • ✅ 分页功能正常

相关服务

AdminDataService

  • 提供统一的Parse数据访问接口
  • 自动添加公司过滤(cDL6R1hgSi)
  • 自动添加软删除过滤
  • 位置: src/app/pages/admin/services/admin-data.service.ts

ProjectService

  • 封装项目相关的CRUD操作
  • 依赖AdminDataService
  • 位置: src/app/pages/admin/services/project.service.ts

注意事项

  1. 字段命名统一性

    • Parse Server中使用 contact 表示客户
    • 前端界面显示时仍使用"客户"中文名称
    • 内部变量名使用 customerNamecustomerId 保持语义清晰
  2. 关联查询

    • 使用 include: ['contact', 'assignee'] 进行关联查询
    • 可以一次性获取关联对象的完整信息
    • 减少数据库查询次数
  3. 公司隔离

    • 所有查询自动过滤到映三色帐套(cDL6R1hgSi)
    • 确保数据安全和隔离
  4. 软删除

    • 使用 isDeleted 字段标记删除状态
    • 查询时自动过滤已删除数据
    • 数据可恢复

后续建议

  1. 统一数据模型文档

    • 建议创建完整的数据模型文档
    • 明确所有表的字段名称和类型
    • 避免类似的字段名称混淆
  2. 类型定义优化

    • 考虑创建TypeScript接口来定义Parse对象结构
    • 提供更好的类型安全性
  3. 错误处理增强

    • 添加更详细的错误日志
    • 在控制台显示数据加载状态
    • 帮助快速定位问题

测试清单

  • 项目列表加载
  • 项目详情查看
  • 项目搜索功能
  • 项目状态筛选
  • 项目统计数据
  • 分页功能
  • 排序功能

总结

本次修复解决了管理员端项目管理页面无法显示数据的问题,根本原因是字段名称不匹配。通过将所有 customer 字段统一修改为 contact,使代码与Parse Server数据库结构保持一致,数据现在可以正常显示。

修复涉及5处代码修改,全部位于 ProjectService 中,不影响其他模块。修复后经过完整测试,所有功能正常运行。