项目负载时间轴-实时移动今日线.md 8.2 KB

项目负载时间轴 - 实时移动今日线功能

📋 需求背景

问题描述

当前的项目负载时间轴在"当天"内无法精确展示多个事件的发生时间,因为:

  1. 今日时间线固定在当天的0点位置
  2. 一天只显示为一个刻度的宽度
  3. 无法展示当天内多个事件(如对图、交付等)的精确时间差

用户需求

  • 今日时间线应该跟随真实时间流动(精确到分钟)
  • 每10分钟自动刷新数据和时间线位置
  • 能够清晰看到当天内多个事件的先后顺序

✨ 实现功能

1. 实时移动的今日时间线

核心特性

  • 精确定位:今日线位置精确到分钟级别
  • 动态计算:根据当前时间在一天内的进度自动计算位置
  • 实时显示:显示"今日:MM/DD HH:mm"格式

位置计算逻辑

getTodayPosition(): string {
  const rangeStart = this.timeRangeStart.getTime();
  const rangeEnd = this.timeRangeEnd.getTime();
  const rangeDuration = rangeEnd - rangeStart;
  const currentTimeMs = this.currentTime.getTime();
  
  // 计算精确位置(包含小时和分钟)
  const position = ((currentTimeMs - rangeStart) / rangeDuration) * 100;
  return `${Math.max(0, Math.min(100, position))}%`;
}

视觉效果

  • 🔴 红色渐变线条:从上到下的渐变效果
  • 🟢 脉动动画:2秒循环的呼吸动画,强调实时性
  • 🔵 顶部圆点:带脉动效果的圆点指示器
  • 📍 时间标签:显示完整的日期和时间(MM/DD HH:mm)

2. 自动刷新机制

刷新周期

  • 周期:10分钟(600000毫秒)
  • 触发动作
    1. 更新当前精确时间
    2. 重新加载项目数据
    3. 重新应用筛选和排序
    4. 触发视图更新

实现代码

private startAutoRefresh(): void {
  // 立即更新一次当前时间
  this.updateCurrentTime();
  
  // 每10分钟刷新一次
  this.refreshTimer = setInterval(() => {
    console.log('🔄 项目时间轴:10分钟自动刷新触发');
    this.updateCurrentTime();
    this.initializeData(); // 重新加载数据和过滤
    this.cdr.markForCheck(); // 触发变更检测
  }, 600000);
  
  console.log('⏰ 项目时间轴:已启动10分钟自动刷新');
}

生命周期管理

  • 初始化ngOnInit() 时启动自动刷新
  • 清理ngOnDestroy() 时清理定时器
  • 避免内存泄漏:严格的资源管理

3. 手动刷新功能

UI控件

  • 位置:时间尺度切换按钮旁边
  • 样式:渐变紫色按钮,带旋转动画
  • 触发:点击"🔄 刷新"按钮
  • 提示:显示"刷新数据和时间线(自动10分钟刷新一次)"

交互效果

.refresh-btn {
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  
  &:active {
    animation: refresh-spin 0.6s ease-in-out; // 点击时旋转360度
  }
}

🎨 视觉优化

今日线增强样式

1. 主线条

.today-line {
  width: 3px;
  background: linear-gradient(180deg, #ef4444 0%, #dc2626 100%);
  box-shadow: 0 0 12px rgba(239, 68, 68, 0.6);
  animation: today-pulse 2s ease-in-out infinite;
}

2. 时间标签(::before)

  • 显示完整的日期和时间
  • 红色渐变背景
  • 白色加粗文字
  • 圆角卡片样式
  • 阴影效果

3. 顶部指示器(::after)

  • 10px 红色圆点
  • 白色边框
  • 独立的脉动动画(1.5秒周期)
  • 缩放效果(1 ~ 1.3倍)

4. 动画效果

// 主线条脉动
@keyframes today-pulse {
  0%, 100% {
    opacity: 1;
    box-shadow: 0 0 12px rgba(239, 68, 68, 0.6);
  }
  50% {
    opacity: 0.85;
    box-shadow: 0 0 20px rgba(239, 68, 68, 0.8);
  }
}

// 圆点脉动
@keyframes today-dot-pulse {
  0%, 100% {
    transform: translateX(-50%) scale(1);
  }
  50% {
    transform: translateX(-50%) scale(1.3);
  }
}

📊 实际应用场景

场景1:当天多个事件精确展示

问题:一个项目当天有"对图"和"交付"两个事件

  • 对图时间:14:00
  • 交付时间:18:00

解决

  • 今日线会精确显示当前时间(如 15:30)
  • 可以清楚看到:对图事件已过,交付事件即将到来
  • 时间差异一目了然

场景2:实时进度追踪

场景:组长在上午10:00查看时间轴

  • 今日线位置:约在当天的 41.7% 位置(10/24)
  • 下午15:00查看时:约在 62.5% 位置(15/24)
  • 线条自动移动,无需手动刷新

场景3:紧急事件响应

场景:临近交付时间,需要实时监控

  • 每10分钟自动刷新项目状态
  • 今日线精确显示当前时刻
  • 能够判断距离交付还有多少时间

🔧 技术实现细节

1. 时间精度处理

// 存储精确到毫秒的当前时间
currentTime: Date = new Date();

// 定期更新
private updateCurrentTime(): void {
  this.currentTime = new Date();
  console.log('⏰ 当前精确时间已更新:', this.currentTime.toLocaleString('zh-CN'));
}

2. 变更检测优化

使用 OnPush 策略 + 手动触发:

constructor(private cdr: ChangeDetectorRef) {}

refresh(): void {
  this.updateCurrentTime();
  this.initializeData();
  this.cdr.markForCheck(); // 手动触发变更检测
}

3. 内存管理

ngOnDestroy(): void {
  if (this.refreshTimer) {
    clearInterval(this.refreshTimer);
  }
}

📈 性能考虑

刷新频率选择

  • 10分钟周期:平衡实时性和性能
  • 避免过于频繁:1分钟刷新会增加服务器负担
  • 满足业务需求:项目管理场景下10分钟足够精确

优化措施

  1. 按需渲染:仅在时间轴视图时启用自动刷新
  2. 智能缓存:数据不变时跳过重新计算
  3. 批量更新:多个状态变化合并为一次渲染

🎯 使用说明

1. 自动刷新

  • 切换到"时间轴"视图时自动启动
  • 每10分钟自动刷新数据和时间线位置
  • 控制台会输出刷新日志

2. 手动刷新

  • 点击"🔄 刷新"按钮立即刷新
  • 按钮会有360度旋转动画
  • 适用于需要立即查看最新状态的场景

3. 今日线解读

  • 红色竖线:当前精确时刻
  • 顶部标签:显示"今日:MM/DD HH:mm"
  • 脉动效果:强调这是实时数据
  • 圆点指示器:额外的视觉提示

✅ 验证要点

功能验证

  • 今日线位置随时间变化(可以通过修改系统时间验证)
  • 今日线标签显示正确的日期和时间
  • 每10分钟自动刷新一次
  • 手动刷新按钮工作正常
  • 刷新时有旋转动画
  • 脉动动画流畅运行

视觉验证

  • 今日线在时间轴上清晰可见
  • 红色渐变效果正常
  • 顶部圆点指示器显示正常
  • 时间标签位置合适,不遮挡内容
  • 动画不卡顿

性能验证

  • 页面切换时定时器被正确清理
  • 长时间运行不会导致内存泄漏
  • 刷新时页面响应流畅

🔮 后续优化建议

1. 更灵活的刷新周期

// 允许用户自定义刷新周期
refreshInterval: 5 | 10 | 15 | 30 = 10; // 分钟

2. 今日线样式自定义

  • 允许用户切换颜色主题
  • 提供"简洁模式"(无动画)

3. 时间精度选项

  • 周视图:精确到分钟
  • 月视图:精确到小时
  • 季度视图:精确到天

4. 智能刷新

// 根据视图内容智能调整刷新频率
if (hasUrgentProjects) {
  refreshInterval = 5; // 5分钟
} else {
  refreshInterval = 15; // 15分钟
}

📝 总结

核心价值

  1. 精确性:今日线精确到分钟,能够清晰展示当天内多个事件
  2. 实时性:自动刷新机制确保数据时效性
  3. 易用性:手动刷新按钮提供即时控制
  4. 视觉化:丰富的动画效果强调时间流动

技术亮点

  • 精准的时间计算和位置映射
  • 完善的生命周期管理
  • 优雅的视觉动画效果
  • 性能和实时性的平衡

业务影响

  • 提升项目进度监控的精确度
  • 帮助组长更好地把控当天关键事件
  • 减少因时间不精确导致的沟通成本

实现日期:2025年11月5日
实现人员:AI Assistant
状态:✅ 已完成并验证