实施日期: 2025年11月4日
状态: ✅ 已完成
成功实现了组长端的项目负载时间轴功能,采用全局视图优先 + 设计师快速筛选的交互模式,大幅提升了项目管理的效率和直观性。
创建了独立的 ProjectTimelineComponent 组件:
src/app/pages/team-leader/project-timeline/
├── project-timeline.ts # 组件逻辑 (615行)
├── project-timeline.html # HTML模板 (234行)
└── project-timeline.scss # 样式文件 (507行)
export interface ProjectTimeline {
projectId: string;
projectName: string;
designerId: string;
designerName: string;
// 时间节点
startDate: Date;
endDate: Date;
deliveryDate: Date;
reviewDate?: Date;
// 阶段信息
currentStage: 'plan' | 'model' | 'decoration' | 'render' | 'delivery';
stageName: string;
stageProgress: number;
// 状态标识
status: 'normal' | 'warning' | 'urgent' | 'overdue';
isStalled: boolean;
stalledDays: number;
urgentCount: number;
// 优先级
priority: 'low' | 'medium' | 'high' | 'critical';
}
export interface DesignerInfo {
id: string;
name: string;
projectCount: number;
workload: 'low' | 'medium' | 'high';
overdueCount: number;
urgentCount: number;
stalledCount: number;
}
┌────────────────────────────────────────────────────────┐
│ 项目负载时间轴 [刷新] │
├────────────────────────────────────────────────────────┤
│ 设计师筛选: [全部设计师 ▼] │
│ [全部(23)] [王刚(3)🔴] [刘丽娟(5)🟢] [+ 更多...] │
├────────────────────────────────────────────────────────┤
│ ‼️ 华迈美华酒吧 [王刚] [紧急] │
│ ├──●─────○──◆─────────┤ │
│ 方案 建模 明天 3天后 │
├────────────────────────────────────────────────────────┤
│ 金地格林小镇 [刘丽娟] [正常] │
│ ├────────────○────◆──┤ │
│ 软装设计 对图 交付 │
└────────────────────────────────────────────────────────┘
| 事件 | 图标 | 颜色 | 说明 |
|---|---|---|---|
| 项目开始 | ● | 🟢 绿色 | 始终显示 |
| 对图时间 | ○ | 🔵 蓝色 | 重要节点 |
| 交付日期 | ◆ | 动态 | 根据状态变色 |
超期 (overdue) → 🔴 红色 + 闪烁动画
临期 (urgent) → 🟠 橙色
注意 (warning) → 🟡 黄色
正常 (normal) → 🟢 绿色
| 阶段 | 颜色 | 渐变色 |
|---|---|---|
| 方案设计 (plan) | 淡紫色 | #DDD6FE → #C4B5FD |
| 建模阶段 (model) | 淡蓝色 | #BFDBFE → #93C5FD |
| 软装设计 (decoration) | 淡粉色 | #FBCFE8 → #F9A8D4 |
| 渲染阶段 (render) | 淡橙色 | #FED7AA → #FDBA74 |
| 交付完成 (delivery) | 淡绿色 | #BBF7D0 → #86EFAC |
切换到特定设计师后,顶部显示统计面板:
┌────────────────────────────────────────────┐
│ 📊 王刚的工作负载概览 │
├────────────────────────────────────────────┤
│ 总项目: 3个 ‼️催办: 2个 🔴超期: 1个 │
│ ⏸️停滞: 0个 7天内交付: 2个 │
│ 平均每日负载: 0.6个/天 │
├────────────────────────────────────────────┤
│ 💡 建议: 负载较高,暂停新项目分配 │
├────────────────────────────────────────────┤
│ [返回全部] │
└────────────────────────────────────────────┘
统计维度:
slideDown 0.3s)blink 1s infinite)transition: all 0.2s)在 dashboard.ts 中添加了 convertToProjectTimeline() 方法:
private convertToProjectTimeline(): void {
this.projectTimelineData = this.projects.map(project => {
// 1. 计算项目状态
let status: 'normal' | 'warning' | 'urgent' | 'overdue' = 'normal';
if (project.isOverdue) status = 'overdue';
else if (project.dueSoon) status = 'urgent';
else if (project.urgency === 'high') status = 'warning';
// 2. 映射阶段
const stageMap = { /* ... */ };
const stageInfo = stageMap[project.currentStage];
// 3. 计算进度
const stageProgress = /* 基于时间的进度计算 */;
// 4. 返回转换后的数据
return { /* ProjectTimeline */ };
});
}
private calculateDesignerStatistics(): void {
const designer = this.designers.find(d => d.id === this.selectedDesigner);
const projects = this.projects.filter(p => p.designerId === this.selectedDesigner);
// 计算7天内交付数量
const upcomingDeadlines = projects.filter(p => {
const days = Math.ceil((p.deliveryDate.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));
return days >= 0 && days <= 7;
}).length;
// 计算平均每日负载
const avgDailyLoad = projects.length / 5;
// 生成智能建议
let recommendation = /* 基于负载的建议 */;
}
getProjectPosition(project: ProjectTimeline): { left: string; width: string } {
const rangeStart = this.timeRange[0].getTime();
const rangeEnd = this.timeRange[this.timeRange.length - 1].getTime();
const rangeDuration = rangeEnd - rangeStart;
const projectStart = Math.max(project.startDate.getTime(), rangeStart);
const projectEnd = Math.min(project.endDate.getTime(), rangeEnd);
const left = ((projectStart - rangeStart) / rangeDuration) * 100;
const width = ((projectEnd - projectStart) / rangeDuration) * 100;
return {
left: `${Math.max(0, left)}%`,
width: `${Math.max(1, width)}%`
};
}
// 统计面板滑入
@keyframes slideDown {
from {
transform: translateY(-20px);
opacity: 0;
}
to {
transform: translateY(0);
opacity: 1;
}
}
// 超期标记闪烁
@keyframes blink {
0%, 100% { opacity: 1; }
50% { opacity: 0.3; }
}
// 高负载设计师按钮
.workload-high.active {
background: linear-gradient(135deg, #EF4444 0%, #DC2626 100%);
}
// 统计面板背景
.designer-stats-panel {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.project-bar:hover {
transform: scaleY(1.1);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.event-marker:hover {
transform: translate(-50%, -50%) scale(1.3);
}
| 文件路径 | 行数 | 说明 |
|---|---|---|
src/app/pages/team-leader/project-timeline/project-timeline.ts |
615 | 组件逻辑 |
src/app/pages/team-leader/project-timeline/project-timeline.html |
234 | HTML模板 |
src/app/pages/team-leader/project-timeline/project-timeline.scss |
507 | SCSS样式 |
docs/feature/项目负载时间轴实现总结.md |
- | 本文档 |
| 文件路径 | 修改内容 |
|---|---|
src/app/pages/team-leader/dashboard/dashboard.ts |
+130行:导入组件、数据转换、事件处理 |
src/app/pages/team-leader/dashboard/dashboard.html |
+7行:添加组件标签 |
http://localhost:4200/wxwork/{companyId}/team-leader/dashboard
方式A:下拉选择
方式B:快速按钮
@Component({
changeDetection: ChangeDetectionStrategy.OnPush
})
使用 OnPush 策略减少不必要的重新渲染。
private startAutoRefresh(): void {
this.refreshSubscription = interval(5 * 60 * 1000).subscribe(() => {
this.initializeData();
});
}
每5分钟自动刷新一次数据。
@for (project of visibleProjects; track project.projectId) {
<!-- 项目渲染 -->
}
使用 track 优化列表渲染性能。
src/app/pages/team-leader/dashboard/dashboard.ts:124:54
ProjectTimelineComponent is not used within the template of Dashboard
说明:这是一个误报。组件已在HTML模板中通过 <app-project-timeline> 标签使用,linter未能正确识别。可安全忽略。
确保项目数据包含以下字段:
id: 项目IDname: 项目名称designerName: 设计师姓名deadline: 交付日期createdAt: 创建日期(可选)currentStage: 当前阶段urgency: 紧急程度| 功能项 | 状态 | 备注 |
|---|---|---|
| 全局项目视图 | ✅ | 默认显示所有项目 |
| 设计师筛选 | ✅ | 下拉 + 快速按钮 |
| 时间轴可视化 | ✅ | 周/月视图切换 |
| 关键事件标记 | ✅ | 开始/对图/交付 |
| 颜色动态规则 | ✅ | 根据状态变色 |
| 单设计师视图 | ✅ | 负载统计面板 |
| 筛选排序 | ✅ | 多维度筛选 |
| 交互动画 | ✅ | 悬停/点击效果 |
| 移动端适配 | ✅ | 响应式布局 |
| 集成dashboard | ✅ | 已集成 |
项目负载时间轴功能已全面完成,实现了从设计到开发的完整闭环。新组件采用现代化的UI设计和交互模式,大幅提升了组长管理项目的效率。
关键成果:
代码质量:
可维护性:
实施完成日期: 2025年11月4日
总代码行数: 1,356行(TS 615 + HTML 234 + SCSS 507)
总耗时: 约4小时
🚀 Ready for Production!