6.2 KiB
6.2 KiB
定时任务与批量解析接口隔离修改
修改概述
根据用户需求,将 2026-05-10 之后的订单 这个时间限制条件改为仅应用于定时任务,而 batch-parse 接口不受此限制。
这样实现了两个不同的数据查询范围:
- 定时任务 (
ProcessPendingTasksAsync) - 仅处理 >= 2026-05-10 的订单 - batch-parse 接口 - 处理所有订单,无时间限制
修改详情
1. 新增方法
为了实现隔离,在两个 Repository 中都添加了新的专用方法:
ILabelReplaceRepository 接口
/// <summary>
/// 获取定时任务新订单(仅2026-05-10之后的订单)
/// </summary>
Task<List<string>> GetNewOrdersWithLabelsForBackgroundTaskAsync(int limit);
ILabelPdfCacheRepository 接口
/// <summary>
/// 获取定时任务新订单(仅2026-05-10之后的订单)
/// </summary>
Task<List<string>> GetNewOrdersWithLabelsForBackgroundTaskAsync(int limit);
2. 原有方法恢复
以下方法已恢复为无时间限制的原始实现:
| 方法名 | 位置 | 修改 |
|---|---|---|
GetNewOrdersWithLabelsAsync() |
LabelPdfCacheRepository | ✅ 移除时间过滤,恢复原始 |
GetAllOrdersWithLabelsAsync() |
LabelReplaceRepository | ✅ 移除时间过滤,恢复原始 |
GetOrdersWithLabelsByDateRangeAsync() |
LabelReplaceRepository | ✅ 移除时间过滤,恢复原始 |
GetOrdersWithLabelsByCustomerAsync() |
LabelReplaceRepository | ✅ 移除时间过滤,恢复原始 |
3. 定时任务调用修改
在 LabelPdfCacheService.cs 的 ProcessPendingTasksAsync() 方法中:
修改前:
var newOrders = await _cacheRepository.GetNewOrdersWithLabelsAsync(newBatchSize);
修改后:
// 仅处理创建时间>=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:使用批量解析处理历史订单
# 处理所有订单(包括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都受时间限制),只需:
- 将
ProcessPendingTasksAsync()中的调用改回:
var newOrders = await _cacheRepository.GetNewOrdersWithLabelsAsync(newBatchSize);
-
为通用方法添加时间限制条件
-
移除专用的
GetNewOrdersWithLabelsForBackgroundTaskAsync()方法
常见问题
Q: 使用batch-parse接口处理2026-05-10之前的订单,会成功吗?
A: 是的,会成功。现在batch-parse接口不受时间限制,可以处理任何时间的订单。
Q: 定时任务会处理2026-05-10之前的新订单吗?
A: 不会。定时任务仅处理 >= 2026-05-10 的新订单。如需处理旧订单,请使用 mode=single 手动处理。
Q: 如何手动处理单个旧订单?
A: 使用 mode=single 模式:
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
编译状态: ✅ 成功
部署状态: 等待确认