SOP-503:批量调整广告账户政策标签 E2E 测试

支持复制到 Excel 的标准 SOP 模板;每个 任务(Task ID) 表示一个可打卡的子文档,便于人工/机器按照序号完成并记录进度。

快速摘要

本SOP文档详细记录了"批量调整广告账户政策标签"功能的完整E2E测试过程,包含:

功能概述: - 功能名称:批量调整广告账户政策标签 - 业务场景:在广告账户列表页面,批量选择多个广告账户,统一调整其政策标签(折扣、后返、扣款、奖励) - 操作方式:通过表格多选 checkbox + 批量操作按钮 + 对话框选择政策 - 审批流程:提交后创建审批流程,审批通过后批量生效

核心流程: 1. 进入广告账户列表 → 2. 批量选择账户 → 3. 打开批量调整对话框 → 4. 选择政策标签 → 5. 提交审批 → 6. 审批流程 → 7. 验证生效

功能特性: - 多选机制:支持单选、多选、全选广告账户 - 四种政策类型:折扣、后返、扣款、奖励 - 每种政策独立选择:可同时为账户设置多种政策类型 - 不设置选项:每种政策都有"不设置"选项,灵活配置 - 按钮状态:未选择账户时按钮禁用,选中后自动启用 - 已选账户展示:紧凑的徽章显示,可滚动查看

审批集成: - 提交后自动创建审批流程 - 显示审批链接对话框 - 支持查看审批进度 - 审批通过后自动执行批量调整

文档元数据

  • 文档类型:SOP / Checklist
  • 适用场景:批量调整多个广告账户的政策标签配置
  • 功能路径:广告账户列表 → 批量选择 → 批量调整政策标签按钮 → 对话框配置 → 提交审批
  • 审批流程:发起申请 → 部门审批 → 财务审批 → 生效 → 抄送
  • 配置文件503_batch_policy_label_adjust_prod.yaml
  • 创建者:开发团队
  • 创建时间:2026-01-20
  • 后端 APIPOST /api/v1/advertiser/batch_policy_label s
  • 前端组件batch-policy-label-dialog.tsx
  • 测试环境:http://localhost:3000

流程图

graph TD
    A[发起人提交] --> B{部门领导审批}
    B -->|通过| C{财务审批}
    B -->|驳回| Z[结束]
    C -->|通过| D[抄送相关人员]
    C -->|驳回| Z
    D --> E[批量政策调整生效]

审批角色

审批步骤说明

步骤 角色 审批人 说明
1 部门审批 部门领导 发起人的多级部门负责人,逐级向上审批(leader_depth: -1
2 财务审批 财务人员(2名) 从以下岗位中选择2名:往来会计、总账会计、税务会计、财务主管、财务总
3 抄送 相关人员 抄送给:媒介经理、媒介、往来会计、总账会计、税务会计、财务主管、财务总、部门领导

审批权限

  • 发起人:具有广告账户管理权限的用户
  • 部门领导:根据发起人所在部门层级,逐级向上审批
  • 财务人员:往来会计、总账会计、税务会计、财务主管、财务总(需2名审批)
  • 抄送人员:媒介、媒介经理、财务相关岗位、部门领导

审批超时设置

  • 超时时间:24小时
  • 超时处理:自动驳回

前置条件

条件 检查方式
本地或测试环境可访问 http://localhost:3000/crm/adaccount 浏览器打开,页面未返回 500/404
已使用具有广告账户管理权限的用户登录 登录成功,能访问广告账户列表页面
系统中存在多个有效的广告账户 广告账户列表中显示账户数据
已配置政策标签数据 客户有可用的政策标签(折扣、后返、扣款、奖励)
批量操作按钮可见 页面底部固定行显示"批量调整政策标签"按钮
审批流程已配置 系统中存在批量政策标签调整的审批模板

任务矩阵(Excel Checklist 行模板)

每个任务独立一个表格,依次执行并记录状态;状态列可直接粘贴到 Excel 以打勾 [ ][x]

任务 T1:进入广告账户列表页面

入口:http://localhost:3000/crm/adaccount

Action Steps Input / Payload 预期结果 验证方式 证据 状态 下游任务
步骤1:导航到广告账户页面 http://localhost:3000/crm/adaccount 页面加载成功 显示广告账户列表表格 屏幕截图 [ ] 步骤 2
步骤2:验证表格显示 表格正常显示,包含账户信息 列表中显示账户ID、客户名称、余额、政策标签等信息 屏幕截图 [ ] 步骤 3
步骤3:查看底部批量操作按钮 向下滚动到表格底部 显示固定的底部操作行 底部行显示"批量调整政策标签"按钮,初始状态为禁用(灰色) 屏幕截图 [ ] T2

验证要点: - 广告账户列表正常加载 - 表格列头包含:账户ID、客户名称、平台、行业、操作方式、余额、政策标签等 - 底部固定行显示批量操作按钮 - "批量调整政策标签"按钮初始为禁用状态(disabled={true}

任务 T2:批量选择广告账户

前置条件:T1 成功,页面已加载

Action Steps Input / Payload 预期结果 验证方式 证据 状态 下游任务
步骤1:单选账户测试 勾选第一行账户的 checkbox 账户被选中,批量操作按钮启用 checkbox 显示勾选状态;按钮从灰色变为可点击;按钮文本显示"批量调整政策标签 (1)" 屏幕截图 [ ] 步骤 2
步骤2:取消选择 取消勾选 checkbox 账户取消选中,按钮恢复禁用 checkbox 恢复空白;按钮变回灰色禁用状态;按钮文本恢复为"批量调整政策标签" 屏幕截图 [ ] 步骤 3
步骤3:多选账户测试 勾选3个账户的 checkbox 3个账户被选中,按钮显示数量 3个账户的 checkbox 被勾选;按钮显示"批量调整政策标签 (3)" 屏幕截图 [ ] 步骤 4
步骤4:全选测试 点击表头的全选 checkbox 当前页所有账户被选中 表头 checkbox 被勾选;所有行的 checkbox 被勾选;按钮显示选中的总数量 屏幕截图 [ ] 步骤 5
步骤5:记录选中的账户 选中账户已记录 记录账户ID和客户名称,用于后续验证 文本记录 [ ] T3

验证要点: - 单选功能正常:选中 → 按钮启用,取消 → 按钮禁用 - 多选功能正常:选中多个账户,按钮显示数量 - 全选功能正常:表头 checkbox 控制全选/全不选 - 按钮状态随选择实时变化 - 按钮文本动态显示选中数量:批量调整政策标签 (N)

测试数据示例: 假设选择了以下3个账户: - 账户1:账户ID 10001,客户:测试客户A - 账户2:账户ID 10002,客户:测试客户B - 账户3:账户ID 10003,客户:测试客户C

任务 T3:打开批量调整对话框

前置条件:T2 成功,已选中至少1个账户

Action Steps Input / Payload 预期结果 验证方式 证据 状态 下游任务
步骤1:点击批量操作按钮 点击"批量调整政策标签 (N)"按钮 打开批量调整对话框 对话框弹出,显示对话框标题和内容 屏幕截图 [ ] 步骤 2
步骤2:验证对话框结构 对话框包含所有必要元素 显示:标题"批量调整政策标签"、描述"为 N 个账户设置政策标签"、已选账户区域、4个政策类型分组、底部按钮 屏幕截图 [ ] 步骤 3
步骤3:验证已选账户显示 正确显示选中的账户 已选账户区域显示:用户图标 + "已选择账户 (N)";账户ID以紧凑徽章形式显示;可滚动查看所有账户 屏幕截图 [ ] 步骤 4
步骤4:验证政策类型分组 显示4个政策类型分组 4个分组:折扣政策(绿色图标)、后返政策(蓝色图标)、扣款政策(橙色图标)、奖励政策(紫色图标);每个分组有标题和分隔线 屏幕截图 [ ] T4

对话框UI结构

┌─────────────────────────────────────────┐
│ 批量调整政策标签                    × │
│ 为 3 个账户设置政策标签              │
├─────────────────────────────────────────┤
│ 👥 已选择账户 (3)                      │
│ ┌───────────────────────────────────┐ │
│ │ [10001] [10002] [10003]           │ │
│ └───────────────────────────────────┘ │
│                                         │
│ 🏷️ 折扣政策 ─────────────────────── │
│ ○ 不设置折扣政策                     │
│ ○ 标准折扣 - 5.00%                   │
│ ○ VIP折扣 - 10.00%                  │
│                                         │
│ 🏷️ 后返政策 ─────────────────────── │
│ ○ 不设置后返政策                     │
│ ○ 季度返点 - 1000.00元               │
│                                         │
│ 🏷️ 扣款政策 ─────────────────────── │
│ ○ 不设置扣款政策                     │
│ ○ 服务费 - 100.00元                  │
│                                         │
│ 🏷️ 奖励政策 ─────────────────────── │
│ ○ 不设置奖励政策                     │
│ ○ 业绩奖励 - 500.00元                │
│                                         │
│              [取消] [提交审批]          │
└─────────────────────────────────────────┘

任务 T4:选择政策标签

前置条件:T3 成功,对话框已打开

Action Steps Input / Payload 预期结果 验证方式 证据 状态 下游任务
步骤1:测试折扣政策选择 点击"标准折扣 - 5.00%"选项 该选项被选中 radio button 显示选中状态(实心圆点) 屏幕截图 [ ] 步骤 2
步骤2:测试后返政策选择 点击"季度返点 - 1000.00元"选项 该选项被选中 radio button 显示选中状态;折扣政策保持选中状态(多个政策可同时选择) 屏幕截图 [ ] 步骤 3
步骤3:测试不设置选项 点击"不设置扣款政策"选项 该选项被选中 扣款政策分组的 radio 显示选中"不设置" 屏幕截图 [ ] 步骤 4
步骤4:测试选项切换 在折扣政策中切换到"VIP折扣 - 10.00%" 新选项被选中,原选项取消 "VIP折扣"被选中,"标准折扣"取消选中(同一分组只能选一个) 屏幕截图 [ ] 步骤 5
步骤5:记录最终选择 选择已记录 记录最终选择的政策:折扣=VIP折扣 10%,后返=季度返点 1000元,扣款=不设置,奖励=不设置 文本记录 [ ] T5

选择规则: - 单选机制:每个政策类型分组内,只能选择一个选项(Radio Group) - 跨分组独立:不同政策类型之间独立,可以同时选择多个政策 - 不设置选项:每个分组都有"不设置"选项,选中后该政策不会被应用 - 默认状态:所有分组初始都未选中任何选项

测试场景示例

政策类型 选择的选项 说明
折扣政策 VIP折扣 - 10.00% 将为所有选中账户设置10%折扣
后返政策 季度返点 - 1000.00元 将为所有选中账户设置1000元返点
扣款政策 不设置扣款政策 不对账户设置扣款政策
奖励政策 不设置奖励政策 不对账户设置奖励政策

任务 T5:提交批量操作

前置条件:T4 成功,已选择至少一个政策

Action Steps Input / Payload 预期结果 验证方式 证据 状态 下游任务
步骤1:验证提交前状态 确认已选择政策 至少一个政策分组选中了非"不设置"的选项 屏幕截图 [ ] 步骤 2
步骤2:点击"提交审批"按钮 显示加载状态 按钮显示加载图标(Loading spinner);按钮文本可能变为"提交中..." 屏幕截图 [ ] 步骤 3
步骤3:等待提交完成 提交成功 API 返回成功响应;对话框关闭;显示审批链接对话框 屏幕截图 [ ] 步骤 4
步骤4:验证审批链接对话框 显示审批链接信息 显示"批量操作提交成功"标题;显示审批流程ID/链接;有"查看审批"和"关闭"按钮 屏幕截图 [ ] 步骤 5
步骤5:记录审批流程ID 审批ID已记录 记录 flowId 或审批链接,用于后续追踪 文本记录 [ ] T6

API 请求格式

{
  "operations": [
    {
      "account_id": "10001",
      "policy_label_type": "TAG_DISCOUNT",
      "new_policy_label_id": 123,
      "operation_mode": "DIRECT",
      "k_frame": "standard"
    },
    {
      "account_id": "10001",
      "policy_label_type": "TAG_REBATE",
      "new_policy_label_id": 456,
      "operation_mode": "DIRECT",
      "k_frame": "standard"
    },
    // ... 为每个账户生成操作记录
  ],
  "name": "批量政策调整 - 2026-01-20 15:30:45",
  "description": "批量调整 3 个账户的政策标签"
}

成功响应示例

{
  "code": 0,
  "review": {
    "flowId": "abc123-def456-ghi789",
    "status": "PENDING"
  },
  "message": "批量操作提交成功"
}

任务 T6:查看审批流程

前置条件:T5 成功,批量操作已提交

入口:http://localhost:3000/crm/reviews

Action Steps Input / Payload 预期结果 验证方式 证据 状态 下游任务
步骤1:导航到审批流程页面 点击"查看审批"按钮或导航到 /crm/reviews 跳转到审批列表页面 页面 URL 为 /crm/reviews 屏幕截图 [ ] 步骤 2
步骤2:查找批量操作审批 在审批列表中查找刚提交的审批 找到对应的审批记录 审批列表中显示:审批流程"批量政策标签调整";状态"待审批";创建者信息;创建时间 屏幕截图 [ ] 步骤 3
步骤3:打开审批详情 点击审批记录 打开审批详情对话框 对话框显示完整的审批信息 屏幕截图 [ ] 步骤 4
步骤4:查看批量操作详情 在审批详情中查看 显示批量操作明细 显示:操作类型"批量政策标签调整";影响的账户列表;政策调整详情(折扣、后返等);状态"待审批" 屏幕截图 [ ] 步骤 5
步骤5:查看审批历史 切换到"审批历史"标签 显示审批流程进度 显示审批节点、当前步骤、待审批人等信息 屏幕截图 [ ] T7

审批详情显示内容: - 审批流程名称 - 审批ID(flowId) - 发起人信息 - 发起时间 - 批量操作摘要 - 账户列表(受影响的账户) - 政策调整详情表格 - 审批流程状态 - 当前审批人

任务 T7:审批流程处理

前置条件:T6 成功,审批流程已创建

Action Steps Input / Payload 预期结果 验证方式 证据 状态 下游任务
步骤1:审批人登录 使用审批人账号登录系统 登录成功 页面显示审批人用户名 屏幕截图 [ ] 步骤 2
步骤2:查看待审批列表 导航到审批页面,切换到"要我审批"标签 显示待审批列表 列表中显示批量政策标签调整的审批记录 屏幕截图 [ ] 步骤 3
步骤3:打开审批详情 点击审批记录 打开审批详情页面 显示完整的批量操作详情 屏幕截图 [ ] 步骤 4
步骤4:审批通过 点击"通过"按钮,可选填写审批意见 审批成功 显示成功提示;审批状态更新;审批历史新增记录 屏幕截图 [ ] 步骤 5
步骤5:验证审批完成 刷新审批列表 审批流程已完成或流转到下一节点 审批状态更新;如果有多级审批,流转到下一审批人;如果是最后一级,状态变为"已批准" 屏幕截图 [ ] T8

审批操作说明: - 审批人可以选择"通过"或"拒绝" - 可以填写审批意见(可选) - 通过后审批流程自动流转 - 拒绝后审批流程终止,批量操作不会执行

任务 T8:验证批量操作生效

前置条件:T7 成功,审批流程已通过

Action Steps Input / Payload 预期结果 验证方式 证据 状态 下游任务
步骤1:返回广告账户列表 导航到 /crm/adaccount 页面加载成功 显示广告账户列表 屏幕截图 [ ] 步骤 2
步骤2:清空之前的选择 点击取消全选或刷新页面 选择已清空 所有 checkbox 为空白状态;批量操作按钮恢复禁用状态 屏幕截图 [ ] 步骤 3
步骤3:查看账户政策标签 在列表中查看之前选中的账户 政策标签已更新 账户的政策标签列显示新的政策:折扣10%、后返1000元等 屏幕截图 [ ] 步骤 4
步骤4:点击账户查看详情 点击账户ID打开详情 打开账户详情页面 显示完整的账户信息和政策标签详情 屏幕截图 [ ] 步骤 5
步骤5:验证政策生效 在详情页查看政策标签 政策已正确应用 详情页显示:折扣政策=10%,后返政策=1000元;政策状态为"生效" 屏幕截图 [ ]

验证要点: - 选中的所有账户都已应用新的政策标签 - 折扣政策正确:VIP折扣 10% - 后返政策正确:季度返点 1000元 - 未选择的政策(扣款、奖励)未被改变 - 政策标签状态为"生效"或"已生效" - 账户列表中的政策标签列显示更新后的值

API 参考(必须遵循的接口)

接口 方法 说明 关键字段 & 数据格式
/api/v1/advertiser/batch_apply_policy_labels POST 批量应用政策标签 - body: { operations: Array, name: string, description: string }
- operations: { account_id, policy_label_type, new_policy_label_id, operation_mode, k_frame }
- 返回:{ review: { flowId, status }, code, message }
/api/v1/customers/policy_labels POST 获取客户的政策标签列表 - body: { customer_id: number }
- 返回:{ policyLabels: Array }
/api/v1/reviews GET 查询审批流程列表 - 参数:status, userRelated, myApproval, needApproval
- 返回:{ reviews: Array, total: number }
/api/v1/reviews/{flowId} GET 获取审批详情 - 路径参数:flowId
- 返回:完整审批信息,包括 BatchPolicyLabelOperation 数据
/api/v1/reviews/{flowId}/approve POST 审批通过 - body: { action: "APPROVE", comment: string }
- 返回:{ code, message }

进度采集模板(机器辅助/人手填报)

Task ID Status Evidence Operator Timestamp Notes
T1 [ ] screenshot-t1.png "进入广告账户列表页面"
T2 [ ] screenshot-t2.png "批量选择广告账户"
T3 [ ] screenshot-t3.png "打开批量调整对话框"
T4 [ ] screenshot-t4.png "选择政策标签"
T5 [ ] screenshot-t5.png "提交批量操作"
T6 [ ] screenshot-t6.png "查看审批流程"
T7 [ ] screenshot-t7.png "审批流程处理"
T8 [ ] screenshot-t8.png "验证批量操作生效"

异常与恢复

前端错误处理

错误1:未选择账户就点击按钮 - 触发条件:在未选中任何账户的情况下,按钮应该是禁用状态 - 预期行为:按钮禁用,无法点击 - 错误提示:如果按钮被误点击,显示提示"请先选择要操作的广告账户" - 验证:按钮的 disabled 属性应为 true

错误2:提交时未选择任何政策 - 触发条件:在对话框中所有政策都选择"不设置"或都未选择 - 预期行为:点击"提交审批"按钮时显示错误提示 - 错误提示:"请至少选择一个政策标签" - 恢复方式:至少选择一个非"不设置"的政策选项

错误3:政策标签数据加载失败 - 原因:API 请求失败或超时 - 预期行为:对话框中的政策选项为空或显示加载错误 - 错误提示:显示网络错误或数据加载失败提示 - 恢复方式:关闭对话框重新打开,或刷新页面重试

API错误处理

401 Unauthorized - 原因:认证信息过期或无效 - 解决方案:重新登录系统

403 Forbidden - 原因:当前用户没有批量操作权限 - 解决方案:使用具有权限的账号

400 Bad Request - 原因:请求参数错误(如账户ID无效) - 解决方案:检查选中的账户是否有效

500 Internal Server Error - 原因:服务器内部错误 - 解决方案: 1. 检查服务器日志 2. 验证选中的账户和政策数据 3. 联系技术支持

审批流程异常

审批流程未创建 - 原因:批量操作提交失败或审批配置错误 - 解决方案: 1. 检查后端审批模板配置 2. 验证用户权限 3. 查看后端日志

审批被拒绝 - 原因:审批人拒绝了批量操作申请 - 解决方案: 1. 查看拒绝原因 2. 修改政策选择 3. 重新提交批量操作

测试数据示例

测试场景1:为3个账户设置折扣政策

选中账户: - 账户1:10001(客户A) - 账户2:10002(客户B) - 账户3:10003(客户C)

政策选择: - 折扣政策:VIP折扣 - 10.00% - 后返政策:不设置 - 扣款政策:不设置 - 奖励政策:不设置

预期结果: - 3个账户都设置了10%折扣 - 其他政策保持不变

测试场景2:同时设置多种政策

选中账户: - 账户1:10004(客户D) - 账户2:10005(客户E)

政策选择: - 折扣政策:标准折扣 - 5.00% - 后返政策:季度返点 - 1000.00元 - 扣款政策:服务费 - 100.00元 - 奖励政策:不设置

预期结果: - 2个账户设置了3种政策:5%折扣 + 1000元后返 + 100元扣款 - 奖励政策未设置

性能要求

指标 要求 测量方式
表格选择响应时间 < 200ms 从点击 checkbox 到按钮状态更新
对话框打开时间 < 1秒 从点击按钮到对话框显示
政策数据加载时间 < 2秒 对话框打开后政策选项显示
批量操作提交时间 < 5秒 从点击提交到返回结果
单次批量操作账户数量限制 < 1000个 一次最多选择1000个账户

FAQ

Q1:为什么我看不到"批量调整政策标签"按钮? A1:可能的原因: - 用户没有批量操作权限 - 页面需要滚动到底部才能看到固定行 - 功能未部署或被禁用

Q2:为什么按钮一直是禁用状态? A2:需要先选中至少一个账户,按钮才会启用。检查: - 是否勾选了账户的 checkbox - 表格是否正常加载 - 浏览器控制台是否有JavaScript错误

Q3:每个政策类型都必须选择吗? A3:不是。每个政策类型都可以选择"不设置"选项,或者不选(默认不设置)。但至少需要为一个政策类型选择非"不设置"的选项,否则无法提交。

Q4:可以为不同的账户设置不同的政策吗? A4:不可以。本功能是批量操作,会为所有选中的账户设置相同的政策标签。如需为不同账户设置不同政策,请分批操作或使用单个账户的政策调整功能。

Q5:批量操作提交后可以取消吗? A5:在审批流程中,发起人或审批人可以取消审批。一旦审批通过并执行,则无法自动回滚,需要重新提交反向操作。

Q6:如何查看批量操作的执行结果? A6:可以通过以下方式: - 在审批详情页查看操作状态 - 返回广告账户列表查看政策标签列 - 点击单个账户查看详情页的政策标签

Q7:全选时会选择所有账户吗? A7:在服务器端分页模式下,全选只会选择当前页可见的账户。如需操作更多账户,可以: - 调整每页显示数量 - 使用筛选条件缩小范围 - 分批次操作

附录

相关文档

技术实现文件

前端组件: - app/crm/adaccount/page.tsx - 广告账户列表页面 - app/crm/adaccount/components/batch-policy-label-dialog.tsx - 批量调整对话框 - lib/stores/adaccount.store.ts - 广告账户 Store(包含 batchApplyPolicyLabels 方法) - lib/types/adaccount.model.ts - 类型定义

后端接口: - proto/advertiser.proto - API 定义(BatchApplyPolicyLabels) - 审批模板配置文件

功能特性清单

  • [x] 表格多选功能(单选、多选、全选)
  • [x] 批量操作按钮状态管理(禁用/启用)
  • [x] 按钮显示选中数量
  • [x] 批量调整对话框UI
  • [x] 已选账户紧凑展示
  • [x] 4种政策类型分组
  • [x] Radio Group 选择机制
  • [x] "不设置"选项
  • [x] 提交审批功能
  • [x] 审批链接对话框
  • [x] 选择清空功能
  • [x] 表格刷新功能
  • [x] 类型定义完整
  • [x] Store 方法实现
  • [x] API 集成
  • [x] 审批视图注册

总结

本SOP文档详细记录了"批量调整广告账户政策标签"功能的完整E2E测试流程。核心功能点:

  1. 便捷的批量选择:支持单选、多选、全选,按钮状态实时响应
  2. 直观的对话框设计:Radio Group 分组方式,清晰展示4种政策类型
  3. 灵活的政策配置:每种政策独立选择,支持"不设置"选项
  4. 完整的审批集成:提交后自动创建审批流程,支持查看审批进度
  5. 可靠的状态管理:操作完成后自动清空选择和刷新表格

此功能大大提升了批量调整政策标签的效率,特别适用于: - 新客户上线,批量设置初始政策 - 季度/年度政策调整,统一更新政策 - 促销活动,临时调整折扣政策 - 政策标准化,统一规范政策配置

通过审批流程保证了操作的安全性和可追溯性,符合企业内控要求。