DESIGNER_ASSIGNMENT_SYNC_FIX_VERIFICATION.md 15 KB

设计师分配弹窗数据同步修复 - 验证指南

修复内容总结

✅ 修改文件

  1. project-management.html(第268-282行)
  2. project-management.ts(第322-347行)

✅ 核心修改

1️⃣ HTML 模板 - 添加关键输入参数

<app-designer-team-assignment-modal
  [visible]="showTeamAssignmentModal"
  [loadRealData]="true"                     ← ✅ 新增:启用真实数据加载
  [projectId]="selectedProject?.id || ''"   ← ✅ 新增:传递项目ID(关键!)
  [loadRealSpaces]="false"                  ← ✅ 新增:禁用空间加载(项目管理端不需要)
  [enableSpaceAssignment]="false"           ← ✅ 新增:禁用空间分配(项目管理端不需要)
  [projectTeams]="projectTeams"
  [selectedTeamId]="currentTeamAssignment.primaryTeamId"
  [selectedDesigners]="currentTeamAssignment.quotationAssignments"
  [crossTeamCollaborators]="currentTeamAssignment.crossTeamCollaborators"
  [quotationItems]="currentQuotationItems"
  [calendarViewMode]="'month'"
  (close)="closeTeamAssignmentModal()"
  (confirm)="confirmTeamAssignment($event)"
></app-designer-team-assignment-modal>

2️⃣ TypeScript 逻辑 - 移除模拟数据

openTeamAssignmentModal(project: Project): void {
  this.selectedProject = project;
  
  // ✅ 修改:不再使用模拟数据,让弹窗组件自动加载真实数据
  // ❌ 旧代码:this.projectTeams = this.mockProjectTeams;
  this.projectTeams = [];  // 空数组,让弹窗自动加载
  
  this.currentTeamAssignment = {
    primaryTeamId: project.assigneeId || null,
    quotationAssignments: [],
    crossTeamCollaborators: []
  };
  
  this.currentQuotationItems = [];
  this.showTeamAssignmentModal = true;
  
  // ✅ 新增:详细的日志输出
  console.log('✅ [项目管理] 打开团队分配弹窗:', {
    projectId: project.id,
    projectTitle: project.title,
    currentAssignee: project.assignee
  });
}

验证步骤

第1步:启动应用并打开项目管理页面

npm start

访问:http://localhost:4200/admin/project-management

第2步:点击任意项目的"分配设计师"按钮

找到项目列表中的任意项目,点击操作列的"分配设计师"按钮。

第3步:检查浏览器控制台日志

打开浏览器开发者工具(F12),查看 Console 面板,应该看到以下日志:

✅ 正确的日志输出

✅ [项目管理] 打开团队分配弹窗: {
  projectId: "abc123",
  projectTitle: "某某项目",
  currentAssignee: "张三"
}

🚀 [设计师分配弹窗] 初始化,loadRealData: true
成功加载项目组数据: (3) [{…}, {…}, {…}]

═════════════════════════════════════════════════════════════════════════════
🚀🚀🚀 [项目数据加载] ===== 开始加载所有成员的项目分配 =====
═════════════════════════════════════════════════════════════════════════════

📊 [项目数据加载] 总成员数: 6
📊 [项目数据加载] 成员列表: 张佳乐, 未知设计师, 江集, 李明, 王芳, 赵磊

🔍 [项目数据加载] 目标成员 IDs:
  - 张佳乐 (ID: designer-1)
  - 未知设计师 (ID: designer-2)
  - 江集 (ID: designer-3)
  ...

✅ [项目数据加载] ProjectTeam 查询成功!
📊 [项目数据加载] 查询结果: 8 条记录

📋 [ProjectTeam 记录详情]
  1. Profile: 张佳乐 (designer-1)
     Project: 某某项目 (project-1)
     状态: 进行中, 阶段: 建模
  2. Profile: 张佳乐 (designer-1)
     Project: 另一个项目 (project-2)
     状态: 进行中, 阶段: 渲染
  ...

📊 [项目数据加载] 查询阶段完成,开始处理数据...

🔍 [张佳乐] Member ID: designer-1
   从 profileIdToProjects 获取到 3 个项目
   📋 项目详情:
      1. 某某项目 (状态: 进行中, 阶段: 建模)
      2. 另一个项目 (状态: 进行中, 阶段: 渲染)
      3. 第三个项目 (状态: 进行中, 阶段: 方案深化)
   ✅ 已设置 currentProjects(所有项目) = 3
🟠 [张佳乐] 3个项目 - 有项目 (工作量:60%, 闲置:0天)

🔍 [未知设计师] Member ID: designer-2
   从 profileIdToProjects 获取到 0 个项目
   ⚠️ 没有找到项目!
   ✅ 已设置 currentProjects(所有项目) = 0
🟢 [未知设计师] 0个项目 - 空闲 (工作量:0%, 闲置:6天)

✅ [项目数据加载] 所有成员项目数据加载完成
💾 [项目数据加载] 已更新缓存,有效期30秒

❌ 如果看到错误日志

❌ [项目数据加载] ProjectTeam 查询失败
错误详情: {message: "...", code: ...}

可能原因:

  1. Parse Server 连接失败
  2. ProjectTeam 表不存在
  3. 权限配置问题

解决方案:

  • 检查 Parse Server 配置
  • 检查数据库表是否存在
  • 检查用户权限

第4步:检查设计师卡片显示

在弹窗中,应该看到:

✅ 正确显示(有项目的设计师)

┌─────────────────────────────────────┐
│ 🟠 张佳乐 (组长)                    │
├─────────────────────────────────────┤
│ 状态: 有项目                        │
│ 当前项目: 3个                       │
│ 工作量: ████████░░ 60%              │
│ 近30天接单: 3单                     │
│ 闲置天数: 0天                       │
│                                     │
│ [📅 查看日历] [选择设计师]          │
└─────────────────────────────────────┘

✅ 正确显示(无项目的设计师)

┌─────────────────────────────────────┐
│ 🟢 未知设计师                       │
├─────────────────────────────────────┤
│ 状态: 空闲                          │
│ 当前项目: 0个                       │
│ 工作量: ░░░░░░░░░░ 0%               │
│ 近30天接单: 0单                     │
│ 闲置天数: 6天                       │
│                                     │
│ [📅 查看日历] [选择设计师]          │
└─────────────────────────────────────┘

✅ 正确显示(繁忙的设计师)

┌─────────────────────────────────────┐
│ 🔴 李明                             │
├─────────────────────────────────────┤
│ 状态: 繁忙                          │
│ 当前项目: 7个                       │
│ 工作量: ██████████ 100%             │
│ 近30天接单: 7单                     │
│ 闲置天数: 0天                       │
│                                     │
│ [📅 查看日历] [选择设计师]          │
└─────────────────────────────────────┘

❌ 如果显示错误(所有设计师都是空闲)

┌─────────────────────────────────────┐
│ 🟢 张佳乐 (组长)                    │
├─────────────────────────────────────┤
│ 状态: 空闲                          │
│ 当前项目: 0个        ← ❌ 错误!    │
│ 工作量: ░░░░░░░░░░ 0%               │
│ 近30天接单: 0单                     │
│ 闲置天数: 0天                       │
└─────────────────────────────────────┘

可能原因:

  1. 没有传递 projectId 参数
  2. ProjectTeam 表没有数据
  3. Project.assignee 字段未设置

第5步:测试不同状态的设计师

测试场景1:空闲设计师(0个项目)

  • 状态颜色:🟢 绿色
  • 状态文本:"空闲"
  • 项目数量:0个
  • 工作量:0%
  • 闲置天数:根据最后接单日期计算

测试场景2:有项目的设计师(1-5个项目)

  • 状态颜色:🟠 橙色
  • 状态文本:"有项目"
  • 项目数量:1-5个
  • 工作量:20%-100%
  • 闲置天数:0天

测试场景3:繁忙的设计师(>5个项目)

  • 状态颜色:🔴 红色
  • 状态文本:"繁忙"
  • 项目数量:6个及以上
  • 工作量:100%
  • 闲置天数:0天

第6步:测试日历功能

点击任意设计师卡片的"📅 查看日历"按钮,应该:

  1. ✅ 弹出日历面板
  2. ✅ 显示该设计师的项目事件
  3. ✅ 显示对图日期(review 事件)
  4. ✅ 显示项目截止日期(project 事件)
  5. ✅ 日历数据与项目数据一致

对比测试

测试A:其他端(设计师端/组长端)

  1. 打开设计师端或组长端的项目详情页
  2. 点击"分配设计师"按钮
  3. 记录设计师的状态和项目数量

测试B:项目管理端(修复后)

  1. 打开总管理员端的项目管理页
  2. 点击"分配设计师"按钮
  3. 对比设计师的状态和项目数量

✅ 验证标准

项目 其他端 项目管理端 结果
张佳乐 - 状态 🟠 有项目 🟠 有项目 ✅ 一致
张佳乐 - 项目数 3个 3个 ✅ 一致
张佳乐 - 工作量 60% 60% ✅ 一致
未知设计师 - 状态 🟢 空闲 🟢 空闲 ✅ 一致
未知设计师 - 闲置天数 6天 6天 ✅ 一致

常见问题排查

Q1: 所有设计师都显示为空闲状态

原因:

  • projectId 参数未正确传递
  • ProjectTeam 表为空且 Project.assignee 未设置

解决方案:

  1. 检查 HTML 中是否有 [projectId]="selectedProject?.id || ''"
  2. 检查控制台日志,确认 projectId 不为空
  3. 检查数据库中的 ProjectTeam 表和 Project.assignee 字段

Q2: 控制台报错 "ProjectTeam 查询失败"

原因:

  • Parse Server 连接问题
  • 权限配置问题

解决方案:

  1. 检查 Parse Server 是否正常运行
  2. 检查用户是否有查询 ProjectTeam 的权限
  3. 检查 ProjectTeam 表是否存在

Q3: 项目数量统计不准确

原因:

  • ProjectTeam 表数据不完整
  • 项目状态过滤逻辑问题

解决方案:

  1. 检查 ProjectTeam 表中的记录是否完整
  2. 确认项目的 status 和 currentStage 字段是否正确
  3. 查看控制台日志,确认项目是否被过滤

Q4: 修改后仍显示模拟数据

原因:

  • 浏览器缓存问题
  • 代码未保存或未编译

解决方案:

  1. 硬刷新浏览器(Ctrl+Shift+R 或 Cmd+Shift+R)
  2. 重启开发服务器
  3. 清除浏览器缓存

数据流程验证

完整数据流程

1. 用户点击"分配设计师"按钮
        ↓
2. openTeamAssignmentModal(project)
   - 设置 selectedProject = project
   - 清空 projectTeams 数组
        ↓
3. 弹窗组件接收输入参数
   - [loadRealData]="true"
   - [projectId]="project.id"
        ↓
4. ngOnInit() 自动执行
   - 调用 loadRealProjectTeams()
        ↓
5. 查询 Department 和 Profile 表
   - 加载所有项目组和设计师
        ↓
6. enrichMembersWithProjectAssignments()
   - 查询 ProjectTeam 表(优先)
   - 或查询 Project.assignee(降级)
        ↓
7. 为每个设计师统计项目数据
   - currentProjects = 实际项目数
   - workload = min(100, projects * 20)
   - status = idle/reviewing/stagnant
   - idleDays = 计算闲置天数
   - recentOrders = 近30天接单数
        ↓
8. 显示设计师卡片
   - 状态指示器(绿/橙/红)
   - 项目数量
   - 工作量进度条
   - 接单情况
        ↓
9. 用户选择设计师并确认
        ↓
10. 保存分配结果到数据库

预期效果对比

修复前 ❌

设计师 状态 项目数 工作量 接单情况
张佳乐 🟢 空闲 0个 0% 0单
未知设计师 🟢 空闲 0个 0% 0单
江集 🟢 空闲 0个 0% 0单

问题:所有设计师都显示为空闲状态,无法看到真实的繁忙情况。

修复后 ✅

设计师 状态 项目数 工作量 接单情况
张佳乐 🟠 有项目 3个 60% 3单
未知设计师 🟢 空闲 0个 0% 已闲置6天
江集 🟠 有项目 2个 40% 2单
李明 🔴 繁忙 7个 100% 7单

效果:显示真实的繁忙情况,方便管理员合理分配任务。


技术细节说明

为什么需要 projectId?

虽然 projectIdenrichMembersWithProjectAssignments() 中没有直接使用,但它是必需的,原因如下:

  1. 未来扩展:可能需要根据项目类型筛选合适的设计师
  2. 空间分配:如果启用 loadRealSpaces,需要 projectId 加载空间数据
  3. 上下文信息:为日志和调试提供项目上下文
  4. 一致性:与其他端保持一致的参数传递方式

为什么设置 loadRealSpaces=false?

项目管理端主要用于:

  • 查看设计师状态
  • 分配设计师到项目

不需要:

  • 空间分配功能(这是设计师端和组长端的功能)
  • 空间数据加载(减少不必要的查询)

数据缓存机制

弹窗组件使用30秒缓存,避免频繁查询:

private projectDataCache: Map<string, any> = new Map();
private lastCacheTime: number = 0;
private CACHE_DURATION = 30000; // 30秒

// 检查缓存
if (now - this.lastCacheTime < this.CACHE_DURATION) {
  console.log('⚡ 使用缓存数据,跳过查询');
  this.applyProjectDataFromCache(allMembers);
  return;
}

注意: 如果需要强制刷新,关闭弹窗等待30秒后重新打开。


总结

✅ 修复完成

  1. HTML 模板:添加了 loadRealDataprojectIdloadRealSpacesenableSpaceAssignment 参数
  2. TypeScript 逻辑:移除了模拟数据,让弹窗组件自动加载真实数据
  3. 日志输出:添加了详细的日志,便于调试

✅ 预期效果

  • 设计师状态显示准确(空闲/有项目/繁忙)
  • 项目数量显示正确
  • 工作量计算准确
  • 接单情况显示真实
  • 与其他端数据一致

✅ 验证要点

  1. 控制台日志正常输出
  2. 设计师卡片显示正确
  3. 状态颜色正确(绿/橙/红)
  4. 与其他端数据一致

如果验证过程中发现任何问题,请参考"常见问题排查"部分。