SOP-505:订单添加政策补差款审批

标准 SOP 测试文档;每个任务(Task ID)代表一个独立的测试步骤,便于人工/自动化测试按序号完成并记录进度。

文档元数据

  • 文档类型:SOP / Checklist
  • 适用场景:订单项 ProductType=PRODUCT_TYPE_POLICY_COMPENSATION(政策补差款)提交时的两步审批流程
  • 配置文件
  • 20260422_create_policy_compensation_item_review_template.sql(SOP-505 审批模板)
  • 20260422_rollback_policy_compensation_item_review_template.sql(回滚脚本)
  • 创建者:财务 / 运营 / QA
  • 最近更新时间:2026-04-24
  • 相关接口定义:参考 crm.swagger.jsonOrderServiceReviewService 模块(特别是 POST /api/v1/ordersGET /api/v1/reviews/{flow_id}POST /api/v1/reviews/{flow_id}/actions

工作流概述

流程图

graph LR
    A[提交订单含政策补差项] --> B[逐级领导审批<br/>all 模式]
    B --> C[财务审批<br/>any 模式]
    C -->|通过| D[OrderItem.status=SUCCESS]
    C -.->|驳回| E[OrderItem.status=REJECTED]

审批角色

步骤 审批人 required_mode 说明
逐级领导审批 提交人所在部门向上所有层级 leader all depth=-1 全层级串行;skip_roles=[u:admin];多层时需每层都 approve
财务审批 往来会计 / 总账会计 / 税务会计 / 财务主管 / 财务总 any 任一财务 position 通过即可

核心配置(模板 SOP-505)

  • 触发事件order.items.add_policy_compensation
  • 资源类型model.OrderItem
  • on_approved_actionsupdate_status → OrderItem.status = "SUCCESS"
  • on_rejected_actionsupdate_status → OrderItem.status = "REJECTED"

前置条件

条件 检查方式
已使用有权限的用户登录 登录成功,订单菜单可见
SOP-505 审批模板已加载 SELECT id FROM review_templates WHERE sop_number='SOP-505' AND is_active=1 返回 1 行
已存在 ProductType=PRODUCT_TYPE_POLICY_COMPENSATION 的产品 SELECT id,name FROM products WHERE type='PRODUCT_TYPE_POLICY_COMPENSATION' 至少 1 条
提交人所在部门向上至少有 1 个能登录的 leader department_leaders JOIN departments 递归查到可登录用户
财务 position 有能登录的用户(同 SOP-604) SELECT username FROM users WHERE position IN ('往来会计','总账会计','税务会计','财务主管','财务总')

任务矩阵

任务 T1:创建订单并提交政策补差项

入口:CRM 菜单 → 订单 → 新建订单

Action Steps Input / Payload 预期结果 验证方式 证据 状态 下游任务
步骤1:新建订单 选客户/账户 订单表单展开 页面展示 截图 [ ] 步骤 2
步骤2:添加订单项 选产品 ProductType=PRODUCT_TYPE_POLICY_COMPENSATION,填金额 / 日期 / 备注 订单项行展示 字段回显 截图 [ ] 步骤 3
步骤3:提交订单 点击"提交" 订单创建 + 一个 review flow 触发 trans_orders 新行 + review_instances 新 flow,resource_type='model.OrderItem', template.sop_number='SOP-505' 截图 [ ] 任务 T2
步骤4:边界——非政策补差产品 ProductType=PRODUCT_TYPE_RECHARGE_CASH 不触发 SOP-505 review_instances 不含 SOP-505 flow 截图 [ ]
步骤5:边界——同订单含多个政策补差项 N 个 POLICY_COMPENSATION 订单项 触发 N 个独立 flow N 个 SOP-505 flow 截图 [ ]

任务 T2:查看 review 详情

入口:审批中心 → 我发起的

Action Steps Input / Payload 预期结果 验证方式 证据 状态 下游任务
步骤1:打开审批详情 点击 SOP-505 flow 页面加载详情 页面标题 "订单添加政策补差款审批" 截图 [ ] 步骤 2
步骤2:核对 payload 订单项扁平字段:金额/产品/备注/客户名 肉眼核对 截图 [ ] 任务 T3
步骤3:核对当前步骤 current_step=1, status=REVIEWING, 当前审批人为 leader DB 查询 review_instances 截图 [ ]

任务 T3:逐级领导审批(step 1, all 模式)

入口:审批中心 → 待我审批(提交人各层级 leader 依次登录)

Action Steps Input / Payload 预期结果 验证方式 证据 状态 下游任务
步骤1:Level-0 leader 登录 直属部门 leader 待审批列表含该 flow 列表查询 截图 [ ] 步骤 2
步骤2:Level-0 通过 点击"通过" 生成下一层级 task(仍 step_order=1) review_tasks 新增记录 截图 [ ] 步骤 3
步骤3:Level-1 leader 登录 上级部门 leader 出现新待审批 列表查询 截图 [ ] 步骤 4
步骤4:Level-N 全部通过 直到最高层级 current_step=2 review_instances.current_step 截图 [ ] 任务 T4
步骤5:任意一层驳回 某层 leader 点"驳回" review_instances.status=REJECTED + OrderItem.status=REJECTED DB + 订单项状态查询 截图 [ ]
步骤6:admin 跳过 若某层是 u:admin 角色 跳过该层(不生成 task) 无 task 产生 截图 [ ]

任务 T4:财务审批(step 2, any 模式)

入口:审批中心 → 待我审批(任一财务 position 登录)

Action Steps Input / Payload 预期结果 验证方式 证据 状态 下游任务
步骤1:财务登录 position ∈ 财务列表 待审批列表含该 flow 列表查询 截图 [ ] 步骤 2
步骤2:通过 点击"通过" review_instances.status=APPROVED + 触发 on_approved_actions DB 查询 截图 [ ] 任务 T5
步骤3:驳回 点击"驳回"(另一测试用例) review_instances.status=REJECTED + 触发 on_rejected_actions DB 查询 截图 [ ]

任务 T5:验证 OrderItem 状态联动

入口:MySQL 直查

Action Steps Input / Payload 预期结果 验证方式 证据 状态 下游任务
步骤1:APPROVED 路径 审批通过 OrderItem.status='SUCCESS' SELECT status FROM order_items WHERE id=ITEM_ID 截图 [ ] 步骤 2
步骤2:REJECTED 路径 审批驳回 OrderItem.status='REJECTED' 同上 截图 [ ] 步骤 3
步骤3:action 失败感知 若 update_status 失败 OrderItem.err_msg 写入错误信息(SOP-604 同路径已修复 helper.go 静默吞错) SELECT err_msg FROM order_items WHERE id=ITEM_ID 截图 [ ]

任务 T6:审批历史与日志

入口:工作流详情页 → 审批记录

Action Steps Input / Payload 预期结果 验证方式 证据 状态 下游任务
步骤1:查看审批记录 打开审核历史 显示每位 leader + 财务审批的人/时间/结果 review_actions 有完整记录 截图 [ ]

API 参考

相关接口

接口 方法 描述
/api/v1/orders POST 创建订单(含政策补差项时触发 SOP-505)
/api/v1/reviews/{flow_id} GET 审批详情
/api/v1/reviews/{flow_id}/actions POST approve / reject
/api/v1/reviews/{flow_id}/history GET 审批历史

测试数据示例

成功案例(订单项)

{
  "product_id": 123,
  "product_type": "PRODUCT_TYPE_POLICY_COMPENSATION",
  "amount": 500,
  "memo": "补差款测试"
}

审批通过后 OrderItem 状态

SELECT id, product_type, status, err_msg
  FROM order_items
  WHERE id = ITEM_ID;
-- 预期:status='SUCCESS', err_msg=NULL

失败案例

场景 预期行为
订单项产品类型不是 POLICY_COMPENSATION 不触发 SOP-505
SOP-505 模板未配置 no matching template found 错误被吞(不阻断订单创建),订单项状态保持提交态
审批驳回 OrderItem.status=REJECTED
审批通过但 update_status action 失败 OrderItem.err_msg 填写错误信息;状态保持 REVIEWING

异常处理

异常场景 预期行为 处理方法
订单创建 OK 但找不到 SOP-505 flow 模板未加载 / event 拼写 重跑 20260422_create_policy_compensation_item_review_template.sql
step1 卡住不进 step2 all 模式要求每层 leader 都通过 登录每一级 leader 依次通过;u:admin 层会被 skip
step2 无人审批 当前环境无财务 position 用户 补财务 position 账号
APPROVED 后 OrderItem 仍是 REVIEWING update_status action 失败 order_items.err_msg;或 server 日志

进度采集模板

任务ID 任务名称 执行人 开始时间 结束时间 状态 备注
T1 创建订单并提交政策补差项
T2 查看 review 详情
T3 逐级领导审批
T4 财务审批
T5 验证 OrderItem 状态联动
T6 审批历史与日志

附录

相关配置文件

  • migrations/20260422_create_policy_compensation_item_review_template.sql - SOP-505 模板
  • migrations/20260422_rollback_policy_compensation_item_review_template.sql - 回滚

相关文档

  • docs/SOP/sop-501-discount-adjust.md - 折扣率调整
  • docs/SOP/sop-503-batch-policy-label-adjust.md - 批量政策标签
  • docs/SOP/sop-504-batch-account-policy-label.md - 批量账户政策标签
  • docs/SOP/sop-604-external-payment.md - 外采付款审批

关联代码

  • services/order/service.go:1712-1729 — OrderItem 提交时根据 ProductType 触发 SOP-505
  • internal/review/executor/action_executor.go#executeUpdateStatus — on_approved / on_rejected action 实现

文档版本:v1.0.0 最后更新:2026-04-24 维护者:财务团队 / 运营团队 / QA