# 组长看板四阶段导航修复完成
## 📋 问题描述
从组长看板 `http://localhost:4200/team-leader/dashboard` 点击**交付执行阶段**的项目时,错误地跳转到了**订单分配阶段**,而不是交付执行阶段。
## ✅ 解决方案
参考客服板块 (`customer-service/project-list`) 的实现,修改组长看板的项目跳转逻辑,使其根据项目所在的**看板列**直接跳转到对应阶段。
## 🎯 核心改动
### 1. HTML 模板修改 (`dashboard.html`)
#### 修改前
```html
```
#### 修改后
```html
```
**说明**:
- 将项目卡片的点击事件从 `viewProjectDetails(project.id)` 改为 `viewProjectDetailsByPhase(project.id, core.id)`
- 传递 `core.id` 参数,明确告知项目所在的看板列(订单分配/确认需求/交付执行/售后)
### 2. TypeScript 逻辑新增 (`dashboard.ts`)
新增 `viewProjectDetailsByPhase` 方法:
```typescript
/**
* 根据看板列跳转到项目详情(参考客服板块实现)
* @param projectId 项目ID
* @param corePhaseId 核心阶段ID (order/requirements/delivery/aftercare)
*/
viewProjectDetailsByPhase(projectId: string, corePhaseId: string): void {
if (!projectId) {
return;
}
// 🔥 标记从组长看板进入(用于跳过激活检查和显示审批按钮)
try {
localStorage.setItem('enterAsTeamLeader', '1');
localStorage.setItem('teamLeaderMode', 'true');
// 🔥 关键:清除客服端标记,避免冲突
localStorage.removeItem('enterFromCustomerService');
localStorage.removeItem('customerServiceMode');
console.log('✅ 已标记从组长看板进入,启用组长模式');
} catch (e) {
console.warn('无法设置 localStorage 标记:', e);
}
// 获取公司ID
const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
// 🔥 根据看板列ID直接映射到路由路径(与客服板块保持一致)
// corePhaseId已经是路由路径格式:order, requirements, delivery, aftercare
const stagePath = corePhaseId;
console.log(`🎯 从看板列「${this.corePhases.find(c => c.id === corePhaseId)?.name}」进入项目,跳转到: ${stagePath}`);
// ✅ 跳转到对应阶段,并通过查询参数标识为组长视角
this.router.navigate(['/wxwork', cid, 'project', projectId, stagePath], {
queryParams: { roleName: 'team-leader' }
});
}
```
**核心逻辑**:
1. **直接使用看板列ID作为路由路径**:`corePhaseId` 已经是 `order`, `requirements`, `delivery`, `aftercare` 格式,无需再次映射
2. **设置组长模式标记**:确保进入项目后显示审批按钮
3. **清除客服标记**:避免权限冲突
4. **添加 `roleName=team-leader` 查询参数**:明确标识组长身份
### 3. 保留原有方法
`viewProjectDetails(projectId)` 方法保持不变,用于其他非看板场景的跳转(如时间线、员工详情面板等)。
## 🔍 四个阶段映射关系
| 看板列名称 | `corePhaseId` | 路由路径 | 跳转URL示例 |
|-----------|--------------|---------|------------|
| 订单分配 | `order` | `order` | `/wxwork/{cid}/project/{projectId}/order?roleName=team-leader` |
| 确认需求 | `requirements` | `requirements` | `/wxwork/{cid}/project/{projectId}/requirements?roleName=team-leader` |
| 交付执行 | `delivery` | `delivery` | `/wxwork/{cid}/project/{projectId}/delivery?roleName=team-leader` |
| 售后 | `aftercare` | `aftercare` | `/wxwork/{cid}/project/{projectId}/aftercare?roleName=team-leader` |
## 📊 与客服板块对比
### 客服板块 (`project-list.ts`)
```typescript
navigateToProject(project: ProjectListItem, columnId: 'order' | 'requirements' | 'delivery' | 'aftercare') {
const cid = localStorage.getItem('company') || '';
const stagePathMapping = {
'order': 'order',
'requirements': 'requirements',
'delivery': 'delivery',
'aftercare': 'aftercare'
};
const stagePath = stagePathMapping[columnId];
// 标记从客服板块进入
localStorage.setItem('enterFromCustomerService', '1');
localStorage.setItem('customerServiceMode', 'true');
this.router.navigate(['/wxwork', cid, 'project', project.id, stagePath]);
}
```
### 组长看板 (`dashboard.ts`) - 新增
```typescript
viewProjectDetailsByPhase(projectId: string, corePhaseId: string): void {
const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
// 直接使用corePhaseId作为路由路径(格式相同)
const stagePath = corePhaseId;
// 标记从组长看板进入
localStorage.setItem('enterAsTeamLeader', '1');
localStorage.setItem('teamLeaderMode', 'true');
localStorage.removeItem('enterFromCustomerService');
localStorage.removeItem('customerServiceMode');
this.router.navigate(['/wxwork', cid, 'project', projectId, stagePath], {
queryParams: { roleName: 'team-leader' }
});
}
```
**相似点**:
- ✅ 都根据看板列ID直接跳转到对应阶段
- ✅ 都设置身份标记(客服 vs 组长)
- ✅ 都使用相同的路由格式
**差异点**:
- 🔹 组长看板额外添加 `?roleName=team-leader` 查询参数(用于审批按钮显示)
- 🔹 组长看板清除客服标记,确保权限不冲突
## 🧪 测试场景
### 测试1:点击订单分配列的项目
- **预期**:跳转到 `/wxwork/{cid}/project/{projectId}/order?roleName=team-leader`
- **验证**:打开的是订单分配页面,显示审批按钮(如果有待审批)
### 测试2:点击确认需求列的项目
- **预期**:跳转到 `/wxwork/{cid}/project/{projectId}/requirements?roleName=team-leader`
- **验证**:打开的是确认需求页面
### 测试3:点击交付执行列的项目 ⭐
- **预期**:跳转到 `/wxwork/{cid}/project/{projectId}/delivery?roleName=team-leader`
- **验证**:打开的是交付执行页面,显示审批按钮(如果有待审批)
### 测试4:点击售后列的项目
- **预期**:跳转到 `/wxwork/{cid}/project/{projectId}/aftercare?roleName=team-leader`
- **验证**:打开的是售后归档页面
## 🔧 控制台日志
成功跳转时,控制台会输出:
```
✅ 已标记从组长看板进入,启用组长模式
🎯 从看板列「交付执行」进入项目,跳转到: delivery
```
## ✨ 优化点
1. **精准跳转**:不再依赖项目的 `currentStage` 字段,而是根据看板列位置直接跳转
2. **逻辑清晰**:看板列ID即路由路径,无需复杂映射
3. **一致性**:与客服板块保持相同的跳转逻辑
4. **身份明确**:通过查询参数和 localStorage 双重标识组长身份
## 📝 相关文件
### 修改的文件
- `yss-project/src/app/pages/team-leader/dashboard/dashboard.html`
- 修改项目卡片点击事件,传递 `core.id` 参数
- `yss-project/src/app/pages/team-leader/dashboard/dashboard.ts`
- 新增 `viewProjectDetailsByPhase(projectId, corePhaseId)` 方法
- 保留原有 `viewProjectDetails(projectId)` 方法
### 参考的文件
- `yss-project/src/app/pages/customer-service/project-list/project-list.ts`
- 参考 `navigateToProject()` 方法的实现
## 🎉 总结
现在从组长看板的四个阶段列点击项目时:
- ✅ **订单分配列** → 跳转到订单分配页面
- ✅ **确认需求列** → 跳转到确认需求页面
- ✅ **交付执行列** → 跳转到交付执行页面 ⭐ **已修复**
- ✅ **售后列** → 跳转到售后归档页面
每个阶段都会自动带上 `?roleName=team-leader` 参数,确保组长身份被正确识别,审批按钮能够正常显示!