|
|
@@ -0,0 +1,191 @@
|
|
|
+# Story 005.003: 集成订单支付成功打印功能
|
|
|
+
|
|
|
+## Status
|
|
|
+Draft
|
|
|
+
|
|
|
+## Story
|
|
|
+**As a** 商家用户
|
|
|
+**I want** 订单支付成功后自动打印小票
|
|
|
+**so that** 及时处理订单
|
|
|
+
|
|
|
+## Acceptance Criteria
|
|
|
+1. [ ] 订单支付成功后等待2分钟确认无退款再自动打印小票
|
|
|
+2. [ ] 实现基础打印失败重试机制(最多重试3次)
|
|
|
+3. [ ] 打印状态同步到订单备注
|
|
|
+4. [ ] 支持配置防退款延迟时间(默认120秒)
|
|
|
+5. [ ] 如果2分钟内发生退款,则自动取消打印任务
|
|
|
+
|
|
|
+## Tasks / Subtasks
|
|
|
+- [ ] 任务1:实现订单支付成功事件监听和延迟打印触发 (AC: 1,4,5)
|
|
|
+ - [ ] 在订单模块中监听支付成功事件
|
|
|
+ - [ ] 调用飞鹅打印模块API触发延迟打印任务
|
|
|
+ - [ ] 实现防退款延迟时间配置读取(默认120秒)
|
|
|
+ - [ ] 设置打印任务为DELAYED状态,记录scheduled_at时间
|
|
|
+- [ ] 任务2:实现防退款延迟打印调度器集成 (AC: 1,5)
|
|
|
+ - [ ] 集成飞鹅打印模块的延迟打印调度器
|
|
|
+ - [ ] 实现延迟时间到达后的打印执行逻辑
|
|
|
+ - [ ] 实现延迟期间退款事件监听和任务取消
|
|
|
+ - [ ] 实现订单状态验证(延迟时间到达后再次检查订单是否退款)
|
|
|
+- [ ] 任务3:实现打印失败重试机制 (AC: 2)
|
|
|
+ - [ ] 集成飞鹅打印模块的重试机制
|
|
|
+ - [ ] 实现最大重试次数配置(默认3次)
|
|
|
+ - [ ] 实现重试间隔配置
|
|
|
+ - [ ] 实现重试失败后的错误处理
|
|
|
+- [ ] 任务4:实现打印状态同步到订单备注 (AC: 3)
|
|
|
+ - [ ] 在打印任务状态更新时同步到订单备注
|
|
|
+ - [ ] 实现订单备注更新API调用
|
|
|
+ - [ ] 记录打印时间、打印机信息、任务状态等
|
|
|
+ - [ ] 支持打印失败时的错误信息记录
|
|
|
+- [ ] 任务5:实现退款事件监听和打印任务取消 (AC: 5)
|
|
|
+ - [ ] 监听订单退款事件
|
|
|
+ - [ ] 查询关联的打印任务(状态为PENDING、DELAYED、PRINTING)
|
|
|
+ - [ ] 调用飞鹅打印模块API取消打印任务
|
|
|
+ - [ ] 更新打印任务状态为CANCELLED,记录取消原因为REFUND
|
|
|
+- [ ] 任务6:编写集成测试和E2E测试 (AC: 1,2,3,4,5)
|
|
|
+ - [ ] 编写订单支付成功触发延迟打印的集成测试
|
|
|
+ - [ ] 编写防退款延迟打印取消的集成测试
|
|
|
+ - [ ] 编写打印失败重试机制的集成测试
|
|
|
+ - [ ] 编写打印状态同步的集成测试
|
|
|
+ - [ ] 编写E2E测试验证完整流程
|
|
|
+
|
|
|
+## Dev Notes
|
|
|
+
|
|
|
+### 相关架构信息
|
|
|
+根据史诗005的技术设计部分:
|
|
|
+
|
|
|
+1. **防退款延迟打印流程(支付成功后)**:
|
|
|
+ - 订单支付成功 → 触发打印事件 → 打印模块接收事件
|
|
|
+ - 打印模块查询租户打印配置 → 获取防退款延迟时间(默认120秒/2分钟)
|
|
|
+ - 生成打印内容(小票模板) → 创建延迟打印任务
|
|
|
+ - 记录打印任务到数据库,状态为`DELAYED`,设置`scheduled_at`为当前时间+延迟时间
|
|
|
+ - 启动延迟任务调度器,等待延迟时间到达
|
|
|
+ - **延迟期间监控退款事件**:
|
|
|
+ - 如果2分钟内发生退款 → 取消打印任务(状态改为`CANCELLED`,原因`REFUND`)
|
|
|
+ - 如果2分钟内无退款 → 继续执行打印
|
|
|
+ - 延迟时间到达后,检查订单状态:
|
|
|
+ - 如果订单已退款 → 取消打印任务
|
|
|
+ - 如果订单正常 → 调用飞鹅API提交打印任务
|
|
|
+ - 提交打印任务 → 状态改为`PRINTING` → 记录飞鹅任务ID
|
|
|
+ - 定时轮询打印状态 → 更新任务状态
|
|
|
+ - 打印成功 → 状态改为`SUCCESS` → 更新订单备注
|
|
|
+ - 打印失败 → 根据重试策略重试
|
|
|
+
|
|
|
+2. **数据库表结构**:
|
|
|
+ - `feie_print_task_mt`表已包含防退款延迟相关字段:
|
|
|
+ - `print_status`: 打印状态(PENDING, DELAYED, PRINTING, SUCCESS, FAILED, CANCELLED)
|
|
|
+ - `scheduled_at`: 计划打印时间(用于延迟打印)
|
|
|
+ - `cancelled_at`: 取消时间
|
|
|
+ - `cancel_reason`: 取消原因(REFUND, MANUAL, TIMEOUT)
|
|
|
+ - `retry_count`: 重试次数
|
|
|
+ - `max_retries`: 最大重试次数
|
|
|
+
|
|
|
+3. **配置管理**:
|
|
|
+ - 租户级配置项在`feie_config_mt`表中:
|
|
|
+ - `feie.anti_refund_delay`: 防退款延迟时间(秒,默认120秒/2分钟)
|
|
|
+ - `feie.retry_max_count`: 最大重试次数
|
|
|
+ - `feie.retry_interval`: 重试间隔(秒)
|
|
|
+ - `feie.auto_print_on_payment`: 支付成功时自动打印开关
|
|
|
+
|
|
|
+4. **模块结构**:
|
|
|
+ - 飞鹅打印模块:`@d8d/feie-printer-module-mt`
|
|
|
+ - 打印管理UI模块:`@d8d/feie-printer-management-ui-mt`
|
|
|
+ - 订单模块:需要集成打印功能
|
|
|
+
|
|
|
+5. **API设计**:
|
|
|
+ - 飞鹅打印模块API已实现:
|
|
|
+ - `POST /api/feie/print` - 提交打印任务(支持延迟打印)
|
|
|
+ - `POST /api/feie/tasks/{taskId}/cancel` - 取消打印任务
|
|
|
+ - `GET /api/feie/config` - 查询打印配置
|
|
|
+
|
|
|
+### 源树信息
|
|
|
+根据史诗005的模块结构部分:
|
|
|
+
|
|
|
+```
|
|
|
+packages/
|
|
|
+├── @d8d/feie-printer-module-mt/ # 飞鹅打印模块(故事005.001已创建)
|
|
|
+│ ├── src/
|
|
|
+│ │ ├── services/
|
|
|
+│ │ │ ├── feie-api.service.ts # 飞鹅API客户端(小票打印)
|
|
|
+│ │ │ ├── printer.service.ts # 打印机管理服务
|
|
|
+│ │ │ ├── print-task.service.ts # 打印任务服务
|
|
|
+│ │ │ ├── delay-scheduler.service.ts # 延迟打印调度器
|
|
|
+│ │ │ └── index.ts
|
|
|
+│ │ └── index.ts # 主入口文件
|
|
|
+└── @d8d/feie-printer-management-ui-mt/ # 打印管理UI模块(故事005.002已创建)
|
|
|
+```
|
|
|
+
|
|
|
+### 集成点
|
|
|
+根据史诗005的集成点部分:
|
|
|
+
|
|
|
+1. **订单模块集成**:
|
|
|
+ - 订单支付成功时触发打印事件(延迟2分钟执行)
|
|
|
+ - 订单退款时触发打印取消事件
|
|
|
+ - 打印状态同步到订单备注
|
|
|
+
|
|
|
+2. **事件系统集成**:
|
|
|
+ - 监听订单支付成功事件(触发延迟打印)
|
|
|
+ - 监听订单退款事件(触发打印取消)
|
|
|
+
|
|
|
+### 测试标准
|
|
|
+根据史诗005的测试策略部分:
|
|
|
+
|
|
|
+1. **集成测试**:
|
|
|
+ - 订单打印触发测试
|
|
|
+ - 防退款延迟打印测试
|
|
|
+ - 打印取消功能测试
|
|
|
+ - 打印状态同步测试
|
|
|
+
|
|
|
+2. **E2E测试**:
|
|
|
+ - 自动打印触发测试(支付成功延迟打印)
|
|
|
+ - 防退款取消打印测试
|
|
|
+ - 打印记录查询测试
|
|
|
+
|
|
|
+### 编码标准
|
|
|
+- 严格遵循项目多租户包架构模式,使用`-mt`后缀和租户ID隔离
|
|
|
+- 异步处理打印任务,不阻塞核心业务流程
|
|
|
+- 完善的错误处理和重试机制
|
|
|
+- 配置驱动,支持不同租户的不同需求
|
|
|
+- 实时同步打印状态到订单系统
|
|
|
+
|
|
|
+## Testing
|
|
|
+### 测试文件位置
|
|
|
+- 集成测试:在相关模块的`tests/`目录下
|
|
|
+- E2E测试:在项目根目录的`tests/e2e/`目录下
|
|
|
+
|
|
|
+### 测试框架和模式
|
|
|
+- 集成测试:使用Vitest
|
|
|
+- E2E测试:使用Playwright
|
|
|
+- 测试模式:遵循项目现有的测试模式
|
|
|
+
|
|
|
+### 特定测试要求
|
|
|
+1. **防退款延迟打印测试**:
|
|
|
+ - 验证支付成功后延迟2分钟打印
|
|
|
+ - 验证延迟期间退款自动取消打印
|
|
|
+ - 验证延迟时间到达后订单状态验证
|
|
|
+
|
|
|
+2. **重试机制测试**:
|
|
|
+ - 验证打印失败后自动重试(最多3次)
|
|
|
+ - 验证重试间隔配置生效
|
|
|
+ - 验证重试失败后的错误处理
|
|
|
+
|
|
|
+3. **状态同步测试**:
|
|
|
+ - 验证打印状态同步到订单备注
|
|
|
+ - 验证打印失败错误信息记录
|
|
|
+ - 验证打印时间记录
|
|
|
+
|
|
|
+## Change Log
|
|
|
+| Date | Version | Description | Author |
|
|
|
+|------|---------|-------------|--------|
|
|
|
+| 2025-12-06 | 1.0 | 初始创建故事文档 | Scrum Master |
|
|
|
+
|
|
|
+## Dev Agent Record
|
|
|
+
|
|
|
+### Agent Model Used
|
|
|
+
|
|
|
+### Debug Log References
|
|
|
+
|
|
|
+### Completion Notes List
|
|
|
+
|
|
|
+### File List
|
|
|
+
|
|
|
+## QA Results
|