Files
LabelChange-server/.trae/docs/BackgroundTasks/03-定时任务与API隔离修改.md
2026-06-01 16:30:29 +08:00

194 lines
6.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 定时任务与批量解析接口隔离修改
## 修改概述
根据用户需求,将 **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
**编译状态**: ✅ 成功
**部署状态**: 等待确认