日期: 2025-10-24
需求: 组长端点击项目卡片时,能够跳转到管理员端的真实项目详情页
组长端 (/team-leader/dashboard) 的项目看板中:
/admin/project-detail/{projectId}/order/admin/project-detail/iKvYck89zE/order/admin/project-detail/7EFEsEd0ht/order/admin/project-detail/abc123xyz/order文件: src/app/pages/team-leader/dashboard/dashboard.html
位置: 第227-258行(项目卡片区域)
修改内容:
<!-- ❌ 旧代码 -->
<h4 [routerLink]="['/team-leader/project-detail', project.id]" 
    (click)="$event.stopPropagation()">
  {{ project.name }}
</h4>
<!-- ✅ 新代码 -->
<h4 [routerLink]="['/admin/project-detail', project.id, 'order']" 
    (click)="$event.stopPropagation()">
  {{ project.name }}
</h4>
说明:
/team-leader/project-detail/:id 改为管理员端路由order(订单分配阶段)$event.stopPropagation() 防止触发卡片的点击事件<div class="project-card" 
     (click)="viewProjectDetails(project.id)"
     [class.overdue]="project.isOverdue" 
     [class.high-urgency]="project.urgency === 'high'"
     [class.due-soon]="project.dueSoon && !project.isOverdue">
  <!-- ... 卡片内容 ... -->
</div>
说明:
viewProjectDetails()project.id<button (click)="viewProjectDetails(project.id); $event.stopPropagation()" 
        class="btn-view">
  查看详情
</button>
文件: src/app/pages/team-leader/dashboard/dashboard.ts
位置: 第2471-2514行(文件末尾)
新增方法:
/**
 * 查看项目详情 - 跳转到管理员端真实项目详情页
 */
viewProjectDetails(projectId: string): void {
  if (!projectId) {
    console.warn('项目ID为空,无法跳转');
    return;
  }
  
  // 跳转到管理员端的项目详情页,使用真实的项目ID
  // 路由格式:/admin/project-detail/:projectId/order
  this.router.navigate(['/admin/project-detail', projectId, 'order']);
  
  console.log('✅ 跳转到项目详情页:', projectId);
}
功能:
projectId 是否为空Router.navigate() 跳转到管理员端项目详情页/**
 * 快速分配项目
 */
quickAssignProject(projectId: string): void {
  console.log('快速分配项目:', projectId);
  // TODO: 实现快速分配逻辑
  alert('快速分配功能待实现');
}
用途:
/**
 * 打开智能推荐弹窗
 */
openSmartMatch(project: any): void {
  console.log('打开智能推荐:', project);
  // TODO: 实现智能推荐逻辑
  alert('智能推荐功能待实现');
}
用途:
/**
 * 质量评审
 */
reviewProjectQuality(projectId: string, quality: 'excellent' | 'qualified' | 'unqualified'): void {
  console.log('质量评审:', projectId, quality);
  // TODO: 实现质量评审逻辑
  const qualityText = quality === 'excellent' ? '优秀' : quality === 'qualified' ? '合格' : '不合格';
  alert(`已将项目评为${qualityText}`);
}
用途:
✅ src/app/pages/team-leader/dashboard/dashboard.html
routerLink/team-leader/project-detail/:id 改为 /admin/project-detail/:id/order✅ src/app/pages/team-leader/dashboard/dashboard.ts
viewProjectDetails() 方法(第2471-2485行)quickAssignProject() 方法(第2487-2494行)openSmartMatch() 方法(第2496-2503行)reviewProjectQuality() 方法(第2505-2513行)src/app/app.routes.ts - 管理员端项目详情页路由配置src/modules/project/pages/project-detail/project-detail.component.ts - 项目详情页组件组长可以通过以下方式进入项目详情页:
| 入口 | 触发方式 | HTML元素 | 
|---|---|---|
| ✅ 项目标题 | 点击标题文字 | <h4 [routerLink]="..."> | 
| ✅ 卡片整体 | 点击卡片任意空白处 | <div class="project-card" (click)="..."> | 
| ✅ 查看详情按钮 | 点击"查看详情"按钮 | <button (click)="viewProjectDetails(...)"> | 
<!-- 标题点击:阻止冒泡,只触发routerLink -->
<h4 [routerLink]="[...]" (click)="$event.stopPropagation()">
<!-- 按钮点击:阻止冒泡,只触发按钮的事件 -->
<button (click)="viewProjectDetails(project.id); $event.stopPropagation()">
原理:
$event.stopPropagation() 阻止事件向上冒泡// ✅ 使用真实的项目ID
this.router.navigate(['/admin/project-detail', projectId, 'order']);
// 生成的URL示例:
// /admin/project-detail/iKvYck89zE/order
// /admin/project-detail/7EFEsEd0ht/order
// /admin/project-detail/abc123xyz/order
优势:
启动开发服务器
npm start
访问组长端Dashboard
http://localhost:4200/team-leader/dashboard
测试项目卡片点击
测试1: 点击项目标题
/admin/project-detail/{projectId}/orderprojectId 是真实的项目ID测试2: 点击"查看详情"按钮
测试3: 点击卡片空白处
测试4: 点击不同项目
projectId验证项目详情页加载
| 操作 | 预期结果 | 
|---|---|
| 点击项目1 | 跳转到 /admin/project-detail/iKvYck89zE/order | 
| 点击项目2 | 跳转到 /admin/project-detail/7EFEsEd0ht/order | 
| 点击项目3 | 跳转到 /admin/project-detail/abc123/order | 
| 刷新页面 | 项目详情页保持显示,数据不丢失 | 
| 点击浏览器"后退" | 返回组长端Dashboard | 
项目卡片已有的样式:
.project-card {
  cursor: pointer;  // 鼠标悬停显示手型
  transition: all 0.3s ease;
  
  &:hover {
    transform: translateY(-4px);  // 悬停时上移
    box-shadow: 0 8px 16px rgba(0,0,0,0.1);  // 增强阴影
  }
}
项目详情页会显示加载动画:
loading: boolean = true;  // 初始加载状态
if (!projectId) {
  console.warn('项目ID为空,无法跳转');
  return;
}
/admin/project-detail/:projectId/order/admin/project-detail/:projectId/order/designer/project-detail/:id好处:
src/app/app.routes.ts - 路由配置文件docs/task/2025102217-wxwork-sdk-init-fix.md - 企微SDK初始化修复文档docs/task/2025102216-team-leader-database-integration.md - Parse数据库集成文档viewProjectDetails() 等方法功能实现完成! ✨