# 项目负责人数据迁移指南
**日期**: 2025-10-24
**问题**: 项目列表中的"负责人"列显示"未分配"
---
## 🔍 问题原因
现有项目在数据库中还没有 `assignee` 或 `department` 字段,导致显示"未分配"。
---
## ✅ 解决方案
### 方案1: 使用迁移脚本(推荐)
**步骤**:
1. **打开浏览器控制台**
- 访问:`http://localhost:4200/admin/project-management`
- 按 `F12` 打开开发者工具
- 切换到"Console"标签
2. **运行迁移脚本**
```javascript
// 1. 检查项目状态
const ProjectMigrationService = await import('./src/app/pages/admin/services/project-migration.service').then(m => m.ProjectMigrationService);
const migrationService = new ProjectMigrationService();
// 查看需要迁移的项目数量
const status = await migrationService.checkProjectsStatus();
console.log('需要迁移的项目:', status.needsMigration);
// 2. 执行迁移
const result = await migrationService.migrateProjectAssignees();
console.log('迁移结果:', result);
```
3. **刷新页面**
- 按 `Ctrl+Shift+R` 强制刷新
- 查看项目列表,"负责人"列应显示组长名字
---
### 方案2: Angular注入方式(如果方案1不work)
**步骤**:
1. **修改项目管理组件,添加迁移按钮**
在 `src/app/pages/admin/project-management/project-management.ts` 中添加:
```typescript
import { ProjectMigrationService } from '../services/project-migration.service';
export class ProjectManagement {
constructor(
private projectService: ProjectService,
private migrationService: ProjectMigrationService // ✅ 添加
) {}
// ✅ 添加迁移方法
async migrateProjects() {
const confirmed = confirm('确定要批量更新所有项目的负责人吗?');
if (!confirmed) return;
try {
const result = await this.migrationService.migrateProjectAssignees();
alert(`迁移完成!\n总计: ${result.total}\n成功: ${result.success}\n失败: ${result.failed}`);
// 刷新项目列表
await this.loadProjects();
} catch (error) {
alert('迁移失败: ' + error);
}
}
}
```
2. **在HTML中添加按钮**
在 `src/app/pages/admin/project-management/project-management.html` 顶部添加:
```html
```
3. **重启开发服务器**
```bash
npm start
```
4. **点击按钮执行迁移**
---
### 方案3: Parse Dashboard 手动修复
如果上述方案都不work,可以在Parse Dashboard中手动修复:
**步骤**:
1. **打开Parse Dashboard**
2. **进入Project表**
3. **找到一个项目**
4. **编辑该项目**:
- 找到 `department` 列,选择一个Department
- 找到 `assignee` 列,选择该Department的leader
- 保存
5. **重复步骤3-4**,直到所有项目都有负责人
---
## 🧪 验证方法
### 1. 检查数据库
在浏览器控制台执行:
```javascript
// 使用FmodeParse直接查询
const Parse = FmodeParse.with('nova');
const query = new Parse.Query('Project');
query.include(['assignee', 'department', 'department.leader']);
query.limit(5);
const projects = await query.find();
projects.forEach(p => {
console.log('项目:', p.get('title'));
console.log('- assignee:', p.get('assignee')?.get('name'));
console.log('- department:', p.get('department')?.get('name'));
console.log('- leader:', p.get('department')?.get('leader')?.get('name'));
});
```
### 2. 检查项目列表
1. 访问:`http://localhost:4200/admin/project-management`
2. 查看"负责人"列
3. **预期**:应显示组长名字,而不是"未分配"
---
## 📝 迁移脚本逻辑
```
开始迁移
↓
查询所有项目
↓
遍历每个项目
↓
已有assignee? → 跳过
↓ No
有department? → 使用其leader作为assignee
↓ No
查找默认项目组 → 使用其leader作为assignee
↓
保存项目
↓
下一个项目
```
---
## 🔧 迁移脚本特性
1. **安全性**:
- 已有assignee的项目不会被覆盖
- 支持回滚(手动删除assignee字段)
2. **智能分配**:
- 优先使用项目的department.leader
- 如果没有department,使用默认项目组的leader
- 如果项目组没有leader,标记为失败
3. **详细日志**:
- 每个项目的处理状态
- 成功/失败统计
- 错误原因
4. **批量处理**:
- 一次处理最多1000个项目
- 支持断点续传(重新运行只处理未完成的)
---
## ⚠️ 注意事项
### 执行前
1. **备份数据**:
- 在Parse Dashboard中导出Project表数据
- 保存备份,以防需要回滚
2. **检查项目组**:
- 确保至少有一个项目组(Department表)
- 确保项目组有组长(leader字段)
### 执行中
1. **不要关闭浏览器**:迁移过程中保持页面打开
2. **观察控制台**:查看进度和错误信息
3. **网络稳定**:确保网络连接正常
### 执行后
1. **验证数据**:检查几个项目的assignee字段
2. **刷新页面**:强制刷新浏览器缓存
3. **查看日志**:确认成功/失败数量
---
## 🎯 预期结果
### 迁移前
```
Project表
- project1: { title: "项目A", assignee: null, department: null }
- project2: { title: "项目B", assignee: null, department: null }
```
项目列表显示:
```
项目A | 未分配
项目B | 未分配
```
### 迁移后
```
Project表
- project1: {
title: "项目A",
assignee: Pointer汪奥,
department: Pointer汪奥组
}
- project2: {
title: "项目B",
assignee: Pointer汪奥,
department: Pointer汪奥组
}
```
项目列表显示:
```
项目A | 汪奥
项目B | 汪奥
```
---
## 📚 相关文件
- 迁移服务:`src/app/pages/admin/services/project-migration.service.ts`
- 项目服务:`src/app/pages/admin/services/project.service.ts`
- 分配组件:`src/modules/project/components/team-assign/team-assign.component.ts`
---
## 💡 常见问题
### Q1: 迁移后仍显示"未分配"
**A**:
1. 强制刷新浏览器(Ctrl+Shift+R)
2. 检查浏览器缓存
3. 验证数据库中的assignee字段是否已设置
### Q2: 部分项目迁移失败
**A**:
1. 查看控制台错误信息
2. 检查失败项目是否有可用的项目组
3. 手动在Parse Dashboard中修复
### Q3: 没有可用的项目组
**A**:
1. 先创建项目组(Department表)
2. 设置项目组的leader字段
3. 重新运行迁移脚本
---
**准备好了吗?开始迁移吧!** 🚀