# 定时任务文档索引

本文件夹包含所有与 **PDF标签缓存定时任务** 相关的文档说明。

## 📚 文档清单

### 1. 核心文档

| 文档 | 说明 | 最后更新 |
|------|------|---------|
| [定时任务暂停指南](定时任务暂停指南.md) | 如何暂停、恢复定时任务，以及API接口管理 | 2026-05-14 |
| [定时任务执行范围修改说明](定时任务执行范围修改说明_2026-05-14.md) | 限制定时任务仅处理2026-05-10之后订单的修改 | 2026-05-14 |
| [定时任务与API隔离修改](定时任务与API隔离修改_2026-05-14.md) | 时间限制条件仅应用于定时任务，batch-parse接口无限制 | 2026-05-14 |
| [Background Task Scope Improvement](Background_Task_Scope_Improvement.md) | 定时任务执行范围优化总结 | 2026-05-13 |

### 2. 操作指南

#### 暂停与恢复定时任务

参考：[定时任务暂停指南](定时任务暂停指南.md)

**3种方法**：
- 方法1：配置文件方式（生产环保境）
- 方法2：环境变量方式（Docker）
- 方法3：API接口方式（最灵活）

#### 定时任务的执行时间限制

参考：[定时任务与API隔离修改](定时任务与API隔离修改_2026-05-14.md)

**关键点**：
- 定时任务：仅处理 >= 2026-05-10 的新订单
- batch-parse 接口：处理所有订单，无时间限制
- 两者完全隔离，互不影响

### 3. 相关配置

#### 定时任务类
- **位置**: `src/CONTROLLER/BackgroundServices/LabelPdfCacheBackgroundService.cs`
- **执行间隔**: 5分钟
- **主要方法**: `ExecuteAsync()` 和 `ProcessPendingTasksAsync()`

#### 后台服务管理器
- **位置**: `src/CONTROLLER/BackgroundServices/BackgroundServiceManager.cs`
- **用途**: 提供暂停/恢复定时任务的功能

#### 缓存服务
- **位置**: `src/BLL/Services/LabelPdfCacheService.cs`
- **主要方法**: `ProcessPendingTasksAsync()`, `ProcessSingleCacheTaskAsync()`

---

## 🔄 定时任务工作流程

```
定时任务 (每5分钟)
    │
    ├─ 第一步：处理失效缓存
    │  └─ 获取 Status=3 的缓存记录
    │  └─ 重新处理这些订单
    │
    ├─ 第二步：处理待处理任务
    │  └─ 获取 Status=0 或 Status=2 的缓存记录
    │  └─ 尝试重新处理
    │
    └─ 第三步：处理新订单 ⭐ 时间限制在此
       └─ 获取订单表中有标签但缓存表无记录的订单
       └─ 仅处理创建时间 >= 2026-05-10 的订单
       └─ 创建新的缓存记录
```

---

## ⚙️ 配置参数

### 定时任务执行间隔
**文件**: `src/CONTROLLER/BackgroundServices/LabelPdfCacheBackgroundService.cs` (第18行)
```csharp
private const int TaskIntervalMinutes = 5;
```

### 批处理大小
**文件**: `src/BLL/Services/LabelPdfCacheService.cs` (ProcessPendingTasksAsync方法参数)
```csharp
public async Task<int> ProcessPendingTasksAsync(int maxRetryCount = 3, int batchSize = 100)
```

### 时间截断日期
**文件**: `src/DAL/Repositories/LabelPdfCacheRepository.cs`
```csharp
var cutoffDate = new DateTime(2026, 5, 10, 0, 0, 0);
```

---

## 🚀 常用操作

### 查看定时任务状态
```bash
curl -X GET http://localhost:5002/api/label/background-service/status
```

### 暂停定时任务
```bash
curl -X POST http://localhost:5002/api/label/background-service/pause
```

### 恢复定时任务
```bash
curl -X POST http://localhost:5002/api/label/background-service/resume
```

### 手动触发批量解析
```bash
# 处理所有订单（无时间限制）
curl -X POST http://localhost:5002/api/label/batch-parse \
  -H "Content-Type: application/json" \
  -d '{"mode":"all","limit":500}'

# 处理单个订单（包括旧订单）
curl -X POST http://localhost:5002/api/label/batch-parse \
  -H "Content-Type: application/json" \
  -d '{"mode":"single","waybillNumber":"ORDER_NUMBER"}'
```

---

## 📊 监控指标

### 缓存统计信息
```bash
curl -X GET http://localhost:5002/api/label/cache-statistics
```

**返回字段**:
- `totalRecords` - 总缓存记录数
- `successRecords` - 成功处理的记录
- `failedRecords` - 失败的记录
- `invalidRecords` - 无效的记录
- `pendingRecords` - 待处理的记录
- `withBarcodeRecords` - 包含条码的记录
- `averageParseDurationMs` - 平均解析时间
- `maxParseDurationMs` - 最大解析时间
- `minParseDurationMs` - 最小解析时间

---

## 🔧 故障排查

### 定时任务不执行

**可能原因**:
1. 服务未启动
2. 定时任务已暂停
3. 数据库连接失败

**解决方案**:
```bash
# 检查状态
curl -X GET http://localhost:5002/api/label/background-service/status

# 如果已暂停，恢复它
curl -X POST http://localhost:5002/api/label/background-service/resume

# 查看日志
tail -f logs/development_api_log-*.txt
```

### 定时任务处理缓慢

**可能原因**:
1. 待处理任务过多
2. 网络延迟
3. PDF渲染时间过长

**解决方案**:
```bash
# 查看缓存统计
curl -X GET http://localhost:5002/api/label/cache-statistics

# 手动处理部分任务
curl -X POST http://localhost:5002/api/label/batch-parse \
  -H "Content-Type: application/json" \
  -d '{"mode":"all","limit":100}'
```

### 新订单未被处理

**检查清单**:
1. ✅ 订单是否在 >= 2026-05-10 之后创建
2. ✅ 订单是否有标签数据
3. ✅ 定时任务是否正在运行
4. ✅ 缓存表中是否已有该订单的记录

**手动处理**:
```bash
curl -X POST http://localhost:5002/api/label/batch-parse \
  -H "Content-Type: application/json" \
  -d '{"mode":"single","waybillNumber":"WAYBILL_NUMBER"}'
```

---

## 📝 修改历史

| 日期 | 修改内容 | 文档 |
|------|--------|------|
| 2026-05-14 | 隔离定时任务和API的时间限制条件 | [定时任务与API隔离修改](定时任务与API隔离修改_2026-05-14.md) |
| 2026-05-14 | 添加定时任务暂停/恢复功能 | [定时任务暂停指南](定时任务暂停指南.md) |
| 2026-05-14 | 限制定时任务仅处理2026-05-10之后订单 | [定时任务执行范围修改说明](定时任务执行范围修改说明_2026-05-14.md) |
| 2026-05-13 | 优化定时任务执行范围 | [Background Task Scope Improvement](Background_Task_Scope_Improvement.md) |

---

## ❓ 常见问题

### Q: 定时任务多久执行一次？
A: 每5分钟执行一次。可以在 `LabelPdfCacheBackgroundService.cs` 中修改 `TaskIntervalMinutes` 常量来改变执行频率。

### Q: 如何手动处理2026-05-10之前的订单？
A: 使用 `mode=single` 通过 batch-parse 接口手动处理单个订单，该模式不受时间限制。

### Q: 定时任务会处理失败的订单吗？
A: 会的。定时任务会重试失败的订单，最多重试3次（可配置）。

### Q: 能否改变定时任务的执行时间？
A: 可以。修改 `LabelPdfCacheBackgroundService.cs` 中的 `TaskIntervalMinutes` 常量。

### Q: 暂停定时任务后，待处理的任务会丢失吗？
A: 不会。暂停只是停止周期性执行，待处理的任务会保留在数据库中，恢复后继续处理。

---

## 🔗 相关资源

- **API文档**: 根目录下的 `API_Documentation_zh.md`
- **完整系统流程**: 根目录下的 `SystemFlowDocument.md`
- **项目README**: 根目录下的 `README.md`

---

**最后更新**: 2026-05-14  
**维护者**: 开发团队  
**状态**: ✅ 完整
