194 lines
6.2 KiB
Markdown
194 lines
6.2 KiB
Markdown
# 定时任务与批量解析接口隔离修改
|
||
|
||
## 修改概述
|
||
|
||
根据用户需求,将 **2026-05-10 之后的订单** 这个时间限制条件改为**仅应用于定时任务**,而 **batch-parse 接口不受此限制**。
|
||
|
||
这样实现了两个不同的数据查询范围:
|
||
- **定时任务** (`ProcessPendingTasksAsync`) - 仅处理 >= 2026-05-10 的订单
|
||
- **batch-parse 接口** - 处理**所有**订单,无时间限制
|
||
|
||
---
|
||
|
||
## 修改详情
|
||
|
||
### 1. 新增方法
|
||
|
||
为了实现隔离,在两个 Repository 中都添加了**新的专用方法**:
|
||
|
||
#### ILabelReplaceRepository 接口
|
||
```csharp
|
||
/// <summary>
|
||
/// 获取定时任务新订单(仅2026-05-10之后的订单)
|
||
/// </summary>
|
||
Task<List<string>> GetNewOrdersWithLabelsForBackgroundTaskAsync(int limit);
|
||
```
|
||
|
||
#### ILabelPdfCacheRepository 接口
|
||
```csharp
|
||
/// <summary>
|
||
/// 获取定时任务新订单(仅2026-05-10之后的订单)
|
||
/// </summary>
|
||
Task<List<string>> 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
|
||
**编译状态**: ✅ 成功
|
||
**部署状态**: 等待确认
|