# 定时任务与批量解析接口隔离修改
## 修改概述
根据用户需求,将 **2026-05-10 之后的订单** 这个时间限制条件改为**仅应用于定时任务**,而 **batch-parse 接口不受此限制**。
这样实现了两个不同的数据查询范围:
- **定时任务** (`ProcessPendingTasksAsync`) - 仅处理 >= 2026-05-10 的订单
- **batch-parse 接口** - 处理**所有**订单,无时间限制
---
## 修改详情
### 1. 新增方法
为了实现隔离,在两个 Repository 中都添加了**新的专用方法**:
#### ILabelReplaceRepository 接口
```csharp
///
/// 获取定时任务新订单(仅2026-05-10之后的订单)
///
Task> GetNewOrdersWithLabelsForBackgroundTaskAsync(int limit);
```
#### ILabelPdfCacheRepository 接口
```csharp
///
/// 获取定时任务新订单(仅2026-05-10之后的订单)
///
Task> GetNewOrdersWithLabelsForBackgroundTaskAsync(int limit);
```
### 2. 原有方法恢复
以下方法已恢复为**无时间限制**的原始实现:
| 方法名 | 位置 | 修改 |
|--------|------|------|
| `GetNewOrdersWithLabelsAsync()` | LabelPdfCacheRepository | ✅ 移除时间过滤,恢复原始 |
| `GetAllOrdersWithLabelsAsync()` | LabelReplaceRepository | ✅ 移除时间过滤,恢复原始 |
| `GetOrdersWithLabelsByDateRangeAsync()` | LabelReplaceRepository | ✅ 移除时间过滤,恢复原始 |
| `GetOrdersWithLabelsByCustomerAsync()` | LabelReplaceRepository | ✅ 移除时间过滤,恢复原始 |
### 3. 定时任务调用修改
在 `LabelPdfCacheService.cs` 的 `ProcessPendingTasksAsync()` 方法中:
**修改前**:
```csharp
var newOrders = await _cacheRepository.GetNewOrdersWithLabelsAsync(newBatchSize);
```
**修改后**:
```csharp
// 仅处理创建时间>=2026-05-10的订单
var newOrders = await _cacheRepository.GetNewOrdersWithLabelsForBackgroundTaskAsync(newBatchSize);
```
---
## 工作流程对比
### batch-parse 接口行为
| 模式 | 支持范围 | 说明 |
|------|--------|------|
| `all` | **所有订单** | ✅ 不受时间限制 |
| `range` | **指定范围** | ✅ 按用户指定的日期范围处理 |
| `customer` | **指定客户订单** | ✅ 不受时间限制 |
| `single` | **单条订单** | ✅ 不受任何限制 |
### 定时任务行为
```
定时任务 (每5分钟)
├─ GetInvalidCachesAsync()
│ └─ 处理所有状态=3的无效缓存(无时间限制)
├─ GetPendingTasksAsync()
│ └─ 处理所有待处理缓存(无时间限制)
└─ GetNewOrdersWithLabelsForBackgroundTaskAsync() ← 【新增:仅>=2026-05-10】
└─ 只处理创建时间>=2026-05-10的新订单
```
---
## 使用场景
### 场景1:使用批量解析处理历史订单
```bash
# 处理所有订单(包括2026-05-10之前的)
curl -X POST http://localhost:5002/api/label/batch-parse \
-H "Content-Type: application/json" \
-d '{"mode":"all","limit":500}'
```
✅ **可以成功** - 返回所有有标签的订单
### 场景2:定时任务自动处理
定时任务每5分钟自动执行,会:
- ✅ 处理所有失效缓存
- ✅ 处理所有待处理缓存
- ✅ **仅处理**创建时间 >= 2026-05-10 的新订单
---
## 涉及文件修改
| 文件 | 修改内容 |
|------|---------|
| `src/DAL/Interfaces/ILabelReplaceRepository.cs` | 新增 `GetNewOrdersWithLabelsForBackgroundTaskAsync()` |
| `src/DAL/Repositories/LabelReplaceRepository.cs` | 实现新方法,恢复旧方法 |
| `src/DAL/Interfaces/ILabelPdfCacheRepository.cs` | 新增 `GetNewOrdersWithLabelsForBackgroundTaskAsync()` |
| `src/DAL/Repositories/LabelPdfCacheRepository.cs` | 实现新方法,恢复旧方法 |
| `src/BLL/Services/LabelPdfCacheService.cs` | 调用新方法 |
---
## 编译验证
✅ **编译成功** - 整个项目编译无错误
---
## 方法汇总
### 查询范围明细
| 方法 | 作用 | 时间限制 | 使用场景 |
|------|------|---------|---------|
| `GetAllOrdersWithLabelsAsync()` | 查询所有有标签订单 | ❌ 无 | batch-parse mode=all |
| `GetOrdersWithLabelsByDateRangeAsync()` | 按日期范围查询 | ❌ 无 | batch-parse mode=range |
| `GetOrdersWithLabelsByCustomerAsync()` | 按客户查询 | ❌ 无 | batch-parse mode=customer |
| `GetNewOrdersWithLabelsAsync()` | 查询新订单 | ❌ 无 | batch-parse 补充查询 |
| `GetNewOrdersWithLabelsForBackgroundTaskAsync()` | 查询定时任务新订单 | ✅ >= 2026-05-10 | 定时任务专用 |
---
## 回滚方案
如需恢复到之前的行为(定时任务和API都受时间限制),只需:
1. 将 `ProcessPendingTasksAsync()` 中的调用改回:
```csharp
var newOrders = await _cacheRepository.GetNewOrdersWithLabelsAsync(newBatchSize);
```
2. 为通用方法添加时间限制条件
3. 移除专用的 `GetNewOrdersWithLabelsForBackgroundTaskAsync()` 方法
---
## 常见问题
### Q: 使用batch-parse接口处理2026-05-10之前的订单,会成功吗?
A: **是的,会成功**。现在batch-parse接口不受时间限制,可以处理任何时间的订单。
### Q: 定时任务会处理2026-05-10之前的新订单吗?
A: **不会**。定时任务仅处理 >= 2026-05-10 的新订单。如需处理旧订单,请使用 `mode=single` 手动处理。
### Q: 如何手动处理单个旧订单?
A: 使用 `mode=single` 模式:
```bash
curl -X POST http://localhost:5002/api/label/batch-parse \
-H "Content-Type: application/json" \
-d '{"mode":"single","waybillNumber":"OLD_WAYBILL_NUMBER"}'
```
### Q: 时间限制条件会影响定时任务的其他步骤吗?
A: **不会**。时间限制仅应用于获取新订单的步骤,不影响处理失效缓存和待处理任务的步骤。
---
## 测试验证清单
- [ ] 编译成功且无错误
- [ ] 使用 `mode=all` 查询到2026-05-10之前的订单
- [ ] 使用 `mode=range` 查询到指定日期范围的所有订单
- [ ] 使用 `mode=customer` 查询到该客户的所有订单(含旧订单)
- [ ] 定时任务仅处理>=2026-05-10的新订单
- [ ] 定时任务正常处理失效缓存(无时间限制)
- [ ] 定时任务正常处理待处理缓存(无时间限制)
- [ ] 缓存统计接口统计正确
---
**修改完成于**: 2026-05-14
**编译状态**: ✅ 成功
**部署状态**: 等待确认