# 2.3.3 路径时间标签功能设计说明

## 2.3.3.1. 模块描述

路径时间标签模块是层级创建功能的重要组成部分，负责支持路径时间标签设置，以预估运输时间。该模块通过分析路径的长度、元素类型（如门、电梯、楼梯的速度限制）等因素，计算物流运输的预估时间，为路径规划提供时间维度的参考。

该模块与TimeTagService、TimeTagCalculator和PathRoute紧密集成，实现基于路径特征的时间估算功能。

## 2.3.3.2. 功能

### 核心功能
1. **时间估算**：基于路径特征估算运输时间
2. **分段计时**：对路径的不同段进行分段计时
3. **时间标签显示**：在路径上显示时间标签
4. **速度限制应用**：应用通道元素的速度限制
5. **时间导出**：导出时间估算结果

### 子功能
| 功能编号 | 功能名称 | 功能描述 |
|---------|---------|---------|
| 2.3.3.F1 | 路径分析 | 分析路径的长度、坡度等特征 |
| 2.3.3.F2 | 速度计算 | 根据元素类型计算各段速度 |
| 2.3.3.F3 | 时间计算 | 计算总运输时间和分段时间 |
| 2.3.3.F4 | 时间标签 | 在路径点显示时间标签 |
| 2.3.3.F5 | 分段显示 | 显示各段的预计时间 |
| 2.3.3.F6 | 时间导出 | 导出时间数据到文件 |
| 2.3.3.F7 | TimeLiner集成 | 与TimeLiner任务时间同步 |

## 2.3.3.3. 性能

### 性能指标
| 指标名称 | 目标值 | 说明 |
|---------|-------|------|
| 时间计算响应 | < 200ms | 计算路径时间的响应时间 |
| 批量计算时间 | < 1秒 | 批量计算多条路径的时间 |
| 标签渲染时间 | < 100ms | 渲染时间标签的时间 |
| 内存占用 | < 50MB | 时间计算的额外内存占用 |

### 性能优化策略
1. 缓存路径特征计算结果
2. 批量时间计算优化
3. 时间标签按需渲染

## 2.3.3.4. 输入输出项

### 1. 字段输入输出

#### 输入字段
| 字段名 | 类型 | 必填 | 说明 |
|-------|------|-----|------|
| Route | PathRoute | 是 | 要计算时间的路径 |
| ObjectSpeed | double | 否 | 物体移动速度（米/秒），默认0.8 |
| ApplySpeedLimits | bool | 否 | 是否应用速度限制，默认true |

#### 输出字段
| 字段名 | 类型 | 说明 |
|-------|------|------|
| TotalTime | double | 总运输时间（秒） |
| SegmentTimes | List<SegmentTime> | 分段时间列表 |
| TimeTags | List<TimeTag> | 时间标签列表 |
| AverageSpeed | double | 平均速度（米/秒） |

### 2. 界面交互输入输出

#### 界面输入
- 路径选择
- 速度参数设置
- 时间标签显示选项

#### 界面输出
- 总时间显示
- 分段时间表
- 时间标签可视化
- 导出结果提示

## 2.3.3.5. 算法

### 时间估算算法
```
算法：基于路径特征的时间估算
输入：路径，物体速度
输出：时间估算结果

1. 初始化总时间为0
2. 对于路径的每个段：
   3. 获取段长度
   4. 获取段的元素类型和速度限制
   5. 计算段速度：
      - 取物体速度和速度限制的较小值
   6. 计算段时间：长度 / 速度
   7. 累加到总时间
8. 返回总时间和分段详情
```

### 分段计时算法
```
算法：路径分段计时
输入：路径点列表
输出：分段时间列表

1. 对于每对相邻路径点：
   2. 计算两点间距离
   3. 识别经过的物流元素
   4. 获取元素的速度限制
   5. 计算通过时间
   6. 记录分段信息
7. 返回分段时间列表
```

## 2.3.3.6. 流程逻辑

```
开始
  │
  ▼
┌─────────────────┐
│  选择路径        │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  分析路径特征    │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  获取速度限制    │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  计算分段时间    │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  计算总时间      │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  生成时间标签    │
└────────┬────────┘
         │
    ┌────┴────┐
    ▼         ▼
┌────────┐  ┌────────┐
│显示标签│  │导出时间│
└───┬────┘  └───┬────┘
    │           │
    └─────┬─────┘
          │
          ▼
         结束
```

## 2.3.3.7. 接口

### 公共接口
```csharp
/// <summary>
/// 时间标签服务
/// </summary>
public class TimeTagService
{
    /// <summary>
    /// 计算路径时间
    /// </summary>
    /// <param name="route">路径对象</param>
    /// <param name="objectSpeed">物体速度</param>
    /// <returns>时间计算结果</returns>
    public TimeCalculationResult CalculatePathTime(PathRoute route, double objectSpeed = 0.8);
    
    /// <summary>
    /// 生成时间标签
    /// </summary>
    /// <param name="result">时间计算结果</param>
    /// <returns>时间标签列表</returns>
    public List<TimeTag> GenerateTimeTags(TimeCalculationResult result);
    
    /// <summary>
    /// 在视图中显示时间标签
    /// </summary>
    /// <param name="timeTags">时间标签</param>
    public void DisplayTimeTags(List<TimeTag> timeTags);
    
    /// <summary>
    /// 导出时间数据
    /// </summary>
    /// <param name="result">时间计算结果</param>
    /// <param name="filePath">导出路径</param>
    public void ExportTimeData(TimeCalculationResult result, string filePath);
}
```

### 辅助接口
```csharp
/// <summary>
/// 时间计算器
/// </summary>
public class TimeTagCalculator
{
    /// <summary>
    /// 计算段的通过时间
    /// </summary>
    public double CalculateSegmentTime(PathSegment segment, double speed);
    
    /// <summary>
    /// 获取元素的速度限制
    /// </summary>
    public double GetSpeedLimit(ModelItem element);
}
```

## 2.3.3.8. 注释设计

### 代码注释规范
```csharp
/// <summary>
/// 时间计算结果
/// </summary>
public class TimeCalculationResult
{
    /// <summary>
    /// 总运输时间（秒）
    /// </summary>
    public double TotalTimeSeconds { get; set; }
    
    /// <summary>
    /// 总运输时间（格式化为 mm:ss）
    /// </summary>
    public string TotalTimeFormatted => FormatTime(TotalTimeSeconds);
    
    /// <summary>
    /// 分段时间详情
    /// </summary>
    public List<SegmentTimeInfo> SegmentTimes { get; set; }
    
    /// <summary>
    /// 平均速度（米/秒）
    /// </summary>
    public double AverageSpeed { get; set; }
}

/// <summary>
/// 分段时间信息
/// </summary>
public class SegmentTimeInfo
{
    /// <summary>
    /// 段索引
    /// </summary>
    public int SegmentIndex { get; set; }
    
    /// <summary>
    /// 段长度（米）
    /// </summary>
    public double Length { get; set; }
    
    /// <summary>
    /// 通过时间（秒）
    /// </summary>
    public double TimeSeconds { get; set; }
    
    /// <summary>
    /// 段速度（米/秒）
    /// </summary>
    public double Speed { get; set; }
}
```

## 2.3.3.9. 数据结构

### TimeCalculationResult 结构
| 字段名 | 类型 | 说明 |
|-------|------|------|
| TotalTimeSeconds | double | 总运输时间（秒） |
| SegmentTimes | List<SegmentTimeInfo> | 分段时间列表 |
| AverageSpeed | double | 平均速度（米/秒） |
| RouteName | string | 路径名称 |
| CalculationTime | DateTime | 计算时间 |

### SegmentTimeInfo 结构
| 字段名 | 类型 | 说明 |
|-------|------|------|
| SegmentIndex | int | 段索引 |
| StartPoint | PathPoint | 起点 |
| EndPoint | PathPoint | 终点 |
| Length | double | 段长度（米） |
| TimeSeconds | double | 通过时间（秒） |
| Speed | double | 段速度（米/秒） |
| ElementType | LogisticsElementType | 主要元素类型 |

### TimeTag 结构
| 字段名 | 类型 | 说明 |
|-------|------|------|
| Position | Point3D | 标签位置 |
| TimeValue | double | 时间值（秒） |
| TimeText | string | 时间显示文本 |
| LabelType | TimeTagType | 标签类型 |

### TimeTagType 枚举
| 值 | 说明 |
|---|------|
| Start | 起点时间 |
| Segment | 分段点 |
| Cumulative | 累计时间 |
| End | 终点时间 |
