SA管理后台需求
1. 文档定位
本文定义 PocketBuy SA 入驻审核管理后台能力,包括 SA 信息查看、审核处理、资料修改、培训状态标记、Merchant / Store 信息登记与批量导入、Store 准入审核、培训通过后的 Merchant / Store 归属维护、账号启停、各角色绩效统计/明细导出、权限控制和审计日志。
后台基于现有后台管理体系扩展:
- 需求目录:
D:\Africa\blueprint\12-迭代需求管理\11-后台管理需求 - 原型目录:
D:\Africa\blueprint\12-迭代需求管理\11-后台管理需求\后台原型
SA 审核管理是 PocketBuy 专项运营能力,首期不接入通用审批中心,只预留后续审批流扩展点。
2. 菜单与角色
新增菜单:
| 一级菜单 | 二级菜单 | 定位 |
|---|---|---|
| PocketBuy Operations | SA Review Management | SA 入驻审核、培训、账号启停和资料维护 |
| PocketBuy Operations | Merchant Management | Merchant 信息登记、查询、编辑、状态调整和批量导入 |
| PocketBuy Operations | Store Management | Store 信息登记、查询、编辑、状态调整和批量导入 |
| PocketBuy Operations | Performance Reports | 店员、店长、SA、SM、RM 绩效统计与明细查询、导出 |
菜单权限:
sa.review.read:查看菜单、列表和详情。sa.review.approve:审核通过、拒绝。sa.profile.edit_rejected:修改rejected状态下的 SA 基础信息。sa.training.update:标记培训状态。sa.store.assign:在培训通过后维护 SA 归属 Merchant / Store。sa.account.toggle:启用或停用 SA 账号。sa.sensitive.read:查看敏感字段明文或敏感材料详情。sa.material.upload:通过后台上传或替换 SA 图片材料,原因必填并写审计。merchant.read、merchant.create、merchant.edit、merchant.status:分别控制 Merchant 查看、登记、编辑和状态调整。store.read、store.create、store.edit、store.review、store.status:分别控制 Store 查看、登记、编辑、准入审核和状态调整。store.submission.read、store.submission.convert:分别控制查看 SA/SM/RM 的 Merchant + Store 资料提交,以及完成去重校验后创建/关联 Merchant、创建待审核 Store 的受控转换。commission.performance.read、commission.performance.export:分别控制五类角色绩效统计/明细查询与导出;导出权限不由普通列表查看权限隐式获得。
权限原则:
- 前端可按权限隐藏或禁用按钮,但所有操作必须由后端强校验。
rejected状态下的资料修改仅特定权限人员可操作。- Merchant / Store 归属不是 SA 基础资料,不能通过
Edit Profile修改;仅具备sa.store.assign权限的人员可在培训通过后维护。 - Merchant / Store 信息登记与状态调整是独立管理能力,不能通过 SA 详情页的
Manage stores新建或修改 Merchant / Store 主数据。 - 任何角色都不能在该页面修改 BVN、BVN KYC 结果、人脸比对结果、银行名称、NUBAN、银行校验结果。
- Store 与 SA 图片材料必须通过后台文件上传能力维护,页面不得要求运营手工填写或维护图片 URL。
3. Merchant / Store 信息管理
3.1 数据源与页面边界
- Merchant 主数据对应
sa_channel.merchant,Store 主数据对应sa_channel.store,Store 通过merchant_id归属 Merchant。 - Merchant / Store 状态变更统一写入
sa_channel.state_change_log,记录目标类型、目标 ID、变更前后状态、原因、操作人和时间。 Merchant Management、Store Management负责主数据登记和管理;SA 详情页的Manage stores只消费已经存在且有效的 Merchant / Store,不得在分配过程中临时创建主数据。- 页面展示数据为后台主数据;SA App 不展示平台审核规则、Merchant / Store 管理状态、收款校验结果或后台操作人。
3.1.1 SA/SM/RM 新建 Store 的 Merchant 信息提交
- SA、SM、RM 通过 H5 的
Merchant Information → Store → Manager → Clerks → Review流程发起资料;Merchant Information 是独立第一步,可搜索选择已有有效 Merchant,或录入新的 Merchant 名称、短名称、类型和必传 CAC Certificate。 - H5 的“录入新 Merchant”仅保存到
store_submission及其 Merchant 草稿,不直接写入sa_channel.merchant,不允许客户端提供merchant_id、store_id、状态或审核结果。 - 后台在
Store Management查看来源为SA/SM/RM submission的资料。服务端完成 Merchant 名称规范化去重、CAC Certificate 文件类型/大小/可访问性、发起人角色/区域、材料完整性和幂等校验后,在受控事务中创建或关联 Merchant,再创建 Store;新 Store 固定为review_status=pending、status=inactive。 - 同名 Merchant 命中时不得静默新建或合并:返回已有 Merchant 摘要供提交人选择或由运营处理;Store 审核和 Merchant 停用/启用仍由后台权限独立控制。
- 保存提交人
submitted_by_person_id、提交时角色、区域快照、来源和 submission ID。SM/RM 直接发起时记录其本人,不虚构为下属 SA,不改变组织关系、历史订单或佣金快照。
3.2 系统自动编号
- 单笔登记和批量导入均不允许前端填写、上传或覆盖
merchant_id、store_id。 - Merchant 保存成功时由后端生成
MCH-{yyyyMMdd}-{6位流水号};Store 保存成功时由后端生成STORE-{yyyyMMdd}-{6位流水号}。 - 流水号必须由数据库序列、号段或其他并发安全的服务端机制生成,不能使用“查询最大值后加一”的非原子实现。
- ID 在同一事务中生成并写入,必须全局唯一、生成后不可修改、删除后不可复用;批量导入预览中的 ID 仅为预分配结果,事务回滚后不得占用正式业务编号。
- 前端新建弹窗显示“保存后由系统生成”,详情、列表、导入结果和审计日志展示最终 ID。
3.3 Merchant Management
Merchant 字段与 sa_channel.merchant 对齐:
| 字段 | 登记规则 |
|---|---|
merchant_id | 后端自动生成,前端只读 |
merchant_name | 必填,最长 100,数据库唯一;保存前做大小写无关重复校验 |
short_label | 可选,最长 50 |
merchant_type | 可选,最长 20 |
cac_certificate | 新 Merchant 单笔登记和 SA/SM/RM 新 Merchant 提交必填;存于 Merchant 附件关系而非 sa_channel.merchant 主表,保存私有文件 file_id、storage_key、文件名、类型、大小、上传人、时间和校验结果;仅接受 PDF、JPG、PNG、WEBP,单文件最多 10 MB |
status | 必填,active / inactive;默认 active |
created_at / updated_at | 数据库自动生成,详情只读展示 |
页面能力:
- 支持按 Merchant ID、名称、短名称、类型、状态查询。
- 支持单笔登记、编辑、详情新 Tab、批量导入、启用和停用。
- 单笔登记 Merchant 时 CAC Certificate 必填;详情展示可预览图片或下载受限 PDF 的文件摘要。编辑替换证书须保留旧附件、替换原因、操作人和时间,不覆盖审计记录。
merchant_name冲突时禁止保存或导入,不自动合并或覆盖已有 Merchant。- 停用 Merchant 必须填写原因。停用后禁止其下 Store 新启用、新 SA 绑定和新订单进件,但不级联改写 Store 原始状态,不删除既有 SA-Store 关系,不取消已提交订单。
- Store 列表和详情同时展示 Store 自身状态与 Effective Status;Merchant 停用时,其下 Store 的 Effective Status 为
unavailable / merchant inactive。
3.4 Store Management
Store 字段与 sa_channel.store 对齐:
| 分组 | 字段 |
|---|---|
| 基础信息 | store_id、merchant_id、store_name、store_type、business_district、business_license |
| 门店材料 | exterior_photo、interior_photos、manager_owner_photo |
| 负责人 | owner_name、owner_phone、owner_nin |
| 收款账户 | payee_bvn(非一期 SA 录入必填)、payee_bank_account、payee_bank_code、payee_bank_name、payee_account_name |
| 经营与地址 | open_date、monthly_sales_avg、store_area、address、gps_location、state、city |
| 合作与合同 | cooperation_mode、deposit_amount、contract_sign_date、contract_valid_until |
| 管理字段 | review_status、review_date、status、created_at、updated_at |
字段和状态规则:
store_id由后端自动生成;merchant_id、store_name、payee_bank_account、payee_account_name必填。payee_bvn保留为存量兼容字段,但一期 SA 录入不采集,也不得作为该流程的审核或激活前置条件。payee_bank_account为 10 位 NUBAN;仅通过长度校验不代表账户真实有效,后端仍须调用银行账户校验能力。若其他受控来源已提供payee_bvn,才按 11 位数字校验和加密存储。exterior_photo、interior_photos、manager_owner_photo均为非必填图片字段,仅在单笔登记或导入后的 Store 编辑页补充;页面通过后台上传图片,保存file_id、storage_key、文件名、上传人和上传时间等文件元数据,不允许运营手工填写图片链接。interior_photos允许多图,数据库如仍使用 JSON 字段,应保存文件元数据数组,而不是外部 URL 字符串数组。review_status支持pending、approved、rejected;status支持active、inactive。单笔登记和批量导入新建 Store 时,后端统一写入review_status=pending、status=inactive、review_date=null,前端不得允许录入或覆盖。- 只有所属 Merchant 为
active且 Store 为approved + active时,Effective Status 才是available;pending或rejectedStore 不允许绑定新 SA 或承接新订单。 - Store 准入审核需
store.review权限,审核通过时写入review_status=approved、review_date=当前时间,并在所属 Merchant 为active时同步置为active;审核拒绝时写入review_status=rejected、status=inactive。审核原因必填并写入state_change_log。 - 停用 Store 必须填写原因;停用后禁止新 SA 绑定和新订单进件,既有绑定、历史订单和已提交订单保留并继续原生命周期。
- Store 重新启用时,后端必须复验所属 Merchant 为
active且 Store 审核状态为approved。
3.5 收款银行选择
- 可搜索银行选项来源为
bns_kasykredit.bns_support_bank_list,仅查询status=1的记录。 - 下拉支持按
bank_name、bank_code、nip模糊搜索,选项展示bank_name / bank_code。 - 选择银行后写入
payee_bank_name=bank_name、payee_bank_code=bank_code;银行代码由系统回填,前端不可手工修改。 bns_support_bank_list不包含账户持有人姓名,因此不能用它作为payee_account_name的选项来源。payee_account_name表示真实账户户名,应由 NUBAN 账户校验接口返回并回填;如因第三方异常允许人工暂存,必须保持“待校验”,不能视为验证通过。- 银行列表在后端统一查询和缓存;页面不得把 334 条银行记录硬编码为最终生产数据,缓存失效时回源数据库。
3.6 Merchant / Store 批量导入
入口和文件:
- Merchant、Store 列表页分别提供
Batch Import和模板下载,模板字段不得混用。 - 支持
.xlsx、.xls、.csv,读取第一个工作表;单次最多 500 条。 - 模板不包含
merchant_id、store_id、created_at、updated_at。上传文件中的merchant_id或store_id有值时按行报错并禁止导入;时间字段由数据库生成,上传值一律忽略且不能覆盖系统字段。 - Store 标准导入模板不包含准入审核字段
review_status、review_date、status,也不包含非必填图片字段exterior_photo、interior_photos、manager_owner_photo;批量创建成功后统一进入pending + inactive,由有权限的运营人员在线审核和补充图片。 - 图片材料不进入批量导入模板;后台上传支持 JPG、JPEG、PNG、WEBP,单文件大小上限建议 10 MB,上传失败不得保存业务表单。
- Store 模板的
merchant_id必须引用已经成功落库的 Merchant;如需同时导入,必须先完成 Merchant 导入,再下载或填写 Store 模板。
校验和预览:
- 上传后先解析并展示总行数、可导入数、错误数、预分配 ID、名称和逐行错误,不立即写库。
- Merchant 校验必填、长度、状态、库内重名和文件内重名。
- Store 校验 Merchant 存在且状态有效、必填字段、NIN/NUBAN 格式、银行是否在有效银行列表、金额格式;若文件提供 BVN 再校验其格式。上传文件如包含
review_status、review_date或status且有值,应逐行报错,不能绕过 Store 准入审核。 - Store 在同一 Merchant 下按
merchant_id + store_name做库内及文件内重复校验;发现重复时禁止自动覆盖。 - 所有错误必须定位到 Excel 行号和字段;任一错误存在时禁用正式导入。
执行和结果:
- 批量导入采用全有或全无事务。校验全部通过后,后端在事务内重新复验数据、生成 ID 并批量写入;任一行失败则整批回滚。
- 使用
import_batch_id + file_hash做幂等控制;重复提交同一文件返回上次结果,不重复创建数据。 - 成功后展示批次号、成功数、生成 ID 列表、操作人和完成时间;失败后提供可下载错误清单。
- 导入文件原文不得长期保存敏感 BVN、NIN、NUBAN;如因审计必须留存,应加密、限权并配置明确保留期限。
3.7 Merchant / Store 页面交互
- 列表、筛选卡片、指标卡、详情新 Tab、状态弹窗、Radio 状态选择和审计时间线沿用现有后台 Ant Design 交互。
- 单笔登记使用分组表单;Store 长表单在弹窗内滚动,银行下拉挂载到
body,不得被弹窗遮挡。 - 来源为 SA/SM/RM 的新建流程先展示
Merchant Information页面,再展示 Store 表单;已有 Merchant 必须由服务端搜索结果选择,新 Merchant 的 CAC Certificate 必传且仅以私有附件元数据保存。转换完成后,详情页展示 submission ID、提交人、Merchant 创建/关联结果和 CAC Certificate 摘要;不把 H5 提交过程误展示为已生效主数据。 - 状态调整弹窗必须先展示对新绑定、新订单、既有关系和已提交订单的影响,再要求填写原因。
- 新建、编辑、批量导入、状态变更均展示明确成功/失败反馈;前端成功提示必须等待后端事务完成。
4. SA Review Management 列表页
4.1 查询条件
列表支持组合筛选:
- Keyword:SA ID、姓名、手机号、merchant、store。
- 审核状态:
pending_review、rejected、approved_pending_training、approved。 - 培训状态:
pending、scheduled、passed、failed。 - 账号状态:
active、disabled。 - Merchant。
- Store,支持按任一绑定门店筛选。
- 审核人。
- 提交时间范围。
- 更新时间范围。
4.2 列表字段
| 字段 | 说明 |
|---|---|
| SA ID | SA 主键 |
| 姓名 | SA 姓名 |
| 手机号 | 默认脱敏 |
| Merchant / Stores | 当前绑定门店,支持展示多个门店 |
| 门店分配状态 | not_ready、pending、assigned;仅 assigned 可进入办单资格判断 |
| KYC 状态 | BVN KYC 摘要 |
| Face 状态 | 人脸比对摘要 |
| 审核状态 | 当前入职审核状态 |
| 培训状态 | 当前培训状态 |
| 账号状态 | 可登录/停用 |
| 提交时间 | 入驻提交时间 |
| 最后操作人 | 最近一次后台操作人 |
| 更新时间 | 最近一次状态更新时间 |
4.3 列表操作
Detail:在后台工作区新 Tab 打开 SA 审核详情,不使用弹窗承载详情页。Review:对待审核记录进行审核处理。Edit Profile:仅在rejected状态可见,且需sa.profile.edit_rejected权限。Training:标记培训状态。Manage stores:培训通过后维护 SA 归属 Merchant / Store。Enable/Disable:启用或停用 SA 账号。
5. 详情页设计
详情页必须在工作区新 Tab 中展示,支持和客户、工单、借款详情一样保留多 Tab 操作上下文。详情页页头右侧提供操作按钮:Review、Edit Profile、Training、Manage stores、Enable/Disable;按钮按当前状态和权限禁用或隐藏,后端仍需强校验。
详情页分区展示:
5.1 基础信息
- SA ID、姓名、手机号、备用手机号、邮箱。
- 性别、生日、地址、State、City。
- 教育信息、学校、工作经验。
- 紧急联系人。
- 备注。
5.2 门店信息
- 展示后台已维护的 Merchant ID / 名称和 Store ID / 名称,支持多个门店。
- 每个门店展示绑定状态、门店状态、绑定时间和最近变更摘要。
- 未培训通过时仅只读展示,无
Manage stores操作;培训通过后,具备sa.store.assign权限的人员才可操作。 Manage stores在当前详情 Tab 内打开编辑区:先选择 Merchant,再多选该 Merchant 下可用的 Store;保存前必须至少保留一个有效 Store。- 保存时后端校验 Merchant / Store 有效性、Store 与 Merchant 的隶属关系、SA 账号状态和培训状态;不能绑定停用、删除或不属于所选 Merchant 的 Store。
- 已分配后再次维护时,后端按完整集合更新
sa_store关系;不得将有效 Store 全部解绑。被解绑、停用或删除的 Store 不再计入办单资格。 - 归属维护不向 SA App 展示 Merchant / Store 名称、后台操作人或处理状态。
5.3 收款信息
- 银行名称。
- NUBAN 脱敏展示。
- 银行账户校验结果。
- 最近更新时间。
该分区只读,不允许在 SA 审核管理页面修改。
5.4 KYC 与审核材料
- BVN 脱敏展示。
- BVN KYC 结果摘要。
- 人脸比对结果摘要。
- BVN / KYC 图片材料、人脸材料、用户活体验证照片,默认以脱敏/水印方式展示。
- 设备采集状态。
- 定位采集状态。
- 采集失败原因。
- 操作时间。
该分区默认展示摘要;明文或敏感材料查看需 sa.sensitive.read 并写审计日志。
图片材料维护:
- SA 图片材料只能通过
Upload Materials后台上传入口维护,不允许录入或修改图片 URL。 - 上传或替换 SA 图片材料需
sa.material.upload权限、上传原因和操作审计;保存文件元数据,不改变 BVN、BVN KYC 结果、人脸比对结果、银行名称、NUBAN 或银行校验结果。 - 后台上传接口返回
file_id、storage_key、文件名、文件类型、大小、上传人和上传时间;页面详情只展示文件摘要,敏感原图查看仍受sa.sensitive.read控制。
5.5 审核轨迹
展示提交、审核、拒绝、培训标记、密码下发、账号启停、资料修改等事件。
每条轨迹包含:
- 时间。
- 操作人。
- 动作。
- 操作前状态。
- 操作后状态。
- 备注或原因。
- trace_id。
6. 审核动作
6.1 Approve
适用状态:pending_review。
结果:
- 审核状态进入
approved_pending_training。 - 培训状态保持
pending或scheduled。 - App Home 展示待培训状态。
- 不直接允许办单。
操作要求:
- 必须由
sa.review.approve权限人员操作。 - 可填写审核备注。
- 后端复验 BVN KYC、人脸比对、银行账户和审核材料状态;此阶段不要求、也不维护门店归属。
6.2 Reject
适用状态:pending_review。
结果:
- 审核状态进入
rejected。 - App Home 展示入驻未通过。
- SA 不允许办单。
操作要求:
- 必须填写拒绝原因。
- 拒绝不删除 SA 资料和审核材料。
rejected后如需人工更正基础资料,只允许特定权限人员通过 Edit Profile 修改。
7. 资料修改
7.1 可修改状态
仅 rejected 状态允许后台修改 SA 基础信息。
pending_review、approved_pending_training、training_passed、active、disabled 状态不允许通过 SA 审核管理页面修改基础信息。
7.2 可修改字段
允许修改:
- 姓名。
- 备用手机号。
- 邮箱。
- 地址。
- State。
- City。
- 教育信息。
- 学校。
- 工作经验。
- 紧急联系人。
- 备注。
7.3 禁止修改字段
禁止修改:
- BVN。
- BVN KYC 结果。
- 人脸比对结果。
- 人脸材料。
- 用户活体验证照片。
- 银行名称。
- NUBAN。
- 银行账户校验结果。
- OTP 验证结果。
- 密码下发结果。
7.4 rejected 状态特殊规则
rejected状态修改基础资料需sa.profile.edit_rejected权限。- 必须填写修改原因。
- 修改后不自动变成通过;仍保持
rejected,除非有权限人员重新执行审核动作。 - 审计日志必须记录修改前后摘要和原因。
8. 培训状态
培训状态:
pending:待安排或待确认。scheduled:已安排培训。passed:培训通过。failed:培训未通过。
操作规则:
- 需
sa.training.update权限。 - 培训
passed后写入store_assignment_status=pending,并开放Manage stores;此时不得立即下发初始登录密码或允许办单。 - 至少一个有效 Store 保存成功后,写入
store_assignment_status=assigned,再触发初始登录密码下发。 - 密码下发成功后写入
login_password_issued=true;审核通过、培训通过、至少一个 Store 有效、密码已下发且账号启用时,才允许办单。 - 培训未通过时不允许办单。
- 培训状态变更必须写审计日志。
初始密码短信模板:
Welcome to PocketBuy. Your SA account is approved. Login phone: {phone}. Initial password: {password}. Please change it after login.uSpeedo 报备信息:
| Template Name | Template ID | uSpeedo 模板内容 | 变量映射 | 预估长度 | 长度判断 |
|---|---|---|---|---|---|
PB_SA_ACCOUNT_APPROVED_ADMIN | UTB260807D1JWO2 | Welcome to PocketBuy. Your SA account is approved. Login phone: {1}. Initial password: {2}. Please change it after login. | {1}=phone, {2}=password | 142 | OK: 1 segment |
说明:该后台触发场景与 App 文档中的初始密码短信内容完全一致,uSpeedo 不允许重复创建相同内容模板,后台场景复用同一供应商 Template ID。
短信发送规则:
- 仅在培训状态为
passed、store_assignment_status=assigned、至少一个 Store 有效且login_password_issued=false时触发。 {phone}使用 SA 注册手机号。{password}使用服务端生成的一次性初始密码,不能由前端生成。- 短信发送成功后记录密码已下发;发送失败时记录失败原因并允许后台重试。
- 短信内容、发送时间、发送结果、操作人和 trace_id 必须写入审计日志;审计中密码字段需脱敏。
9. 账号启停
账号状态:
active:允许登录;是否可办单仍需满足审核、培训、门店和密码条件。disabled:阻断登录或创建客户申请。
操作规则:
- 需
sa.account.toggle权限。 - 停用账号必须填写原因,并在确认前展示对现有订单和新进件的影响。
- 启用账号不改变审核状态、培训状态或历史订单。
- 停用账号不删除 SA 资料、审核材料、培训记录或订单关联。
9.1 停用时的订单与进件处理
- 停用立即阻断登录、创建新客户申请和新进件提交;已打开但尚未提交的草稿保存为只读,提示联系平台。
- SA 已有的处理中订单不取消、不回滚、不重新分配。订单继续由后端按原有状态机推进,必要的系统任务、支付回调、风控和审核节点不受账号停用影响。
- 代办单用户已提交的客户申请不受 SA 停用影响。客户仍可查询申请进度、补充必要资料并完成后续待办步骤;必须由 SA 发起的新动作展示“当前 SA 暂停服务,请联系平台或选择其他可用 SA”,不得无提示失败。
- 对尚未生成订单的客户草稿,停用后禁止继续创建订单;平台运营可将客户转派给其他有效 SA,转派关系和原因写入审计日志。
- 停用不影响历史订单查询、还款、售后和审计追溯;重新启用后是否恢复新进件资格,仍需同时满足审核、培训、密码和有效门店条件。
10. 前后端接口草案
10.1 绩效报表与导出
Performance Reports 提供“统计”和“明细”两个视图,覆盖 CLERK、STORE_MANAGER、SA、SA_MANAGER、REGIONAL_MANAGER。筛选至少包含绩效月、角色、区域、SM/RM、门店、人员、快照状态和发放状态;页面与导出必须使用同一服务端查询快照。
- 统计数据:角色/人员、90 天观察窗、去重合格订单数、是否命中
<10单小样本保护、D/E、CPD7、绩效系数、基础金额、调整额、扣减来源月、应发/已发和异常数。 - 明细数据:订单、资格时间、实际办单人/推荐人、受益组件、归属快照、风险快照、政策版本、结算批次和状态。
- 导出默认脱敏手机号和收款账号;按当前筛选异步生成文件,返回任务 ID、文件 hash、过期时间和下载地址。前端不得分页拉取后自行拼接全量文件。
- 空结果允许生成带表头文件;数据量/时间范围超限返回明确错误;下载再次校验用户、权限和文件有效期。
| 接口 | 用途 |
|---|---|
GET /api/admin/sa-onboarding/list | 查询 SA 入驻列表 |
GET /api/admin/sa-onboarding/{sa_id} | 查询 SA 入驻详情 |
POST /api/admin/sa-onboarding/{sa_id}/approve | 审核通过 |
POST /api/admin/sa-onboarding/{sa_id}/reject | 审核拒绝 |
POST /api/admin/sa-onboarding/{sa_id}/profile | 修改基础信息 |
POST /api/admin/sa-onboarding/{sa_id}/stores | 培训通过后维护 SA 归属 Merchant / Store,多选 Store;请求按完整集合更新 sa_store |
POST /api/admin/sa-onboarding/{sa_id}/training | 标记培训状态 |
POST /api/admin/sa-onboarding/{sa_id}/password/issue | 下发或重试初始密码短信 |
POST /api/admin/sa-onboarding/{sa_id}/account-status | 启用或停用账号 |
POST /api/admin/sa-onboarding/{sa_id}/sensitive-view | 申请查看敏感材料 |
POST /api/admin/sa-onboarding/{sa_id}/materials | 通过后台上传或替换 SA 图片材料,原因必填并写审计 |
GET /api/admin/pocketbuy/merchants | 分页查询 Merchant |
GET /api/admin/pocketbuy/merchants/{merchant_id} | 查询 Merchant 详情及关联 Store 摘要 |
POST /api/admin/pocketbuy/merchants | 单笔登记 Merchant;后端生成 merchant_id |
PUT /api/admin/pocketbuy/merchants/{merchant_id} | 编辑 Merchant 非状态字段 |
POST /api/admin/pocketbuy/merchants/{merchant_id}/status | 调整 Merchant 状态,原因必填 |
GET /api/admin/pocketbuy/stores | 分页查询 Store |
GET /api/admin/pocketbuy/store-submissions | 查询 SA/SM/RM 发起的 Merchant + Store 资料提交及其转换、审核状态 |
POST /api/admin/pocketbuy/store-submissions/{submission_id}/convert | 在服务端去重、权限和完整性校验后创建/关联 Merchant,并创建 pending + inactive Store;请求需幂等键 |
GET /api/admin/pocketbuy/stores/{store_id} | 查询 Store 完整详情 |
POST /api/admin/pocketbuy/stores | 单笔登记 Store;后端生成 store_id |
PUT /api/admin/pocketbuy/stores/{store_id} | 编辑 Store 非状态字段 |
POST /api/admin/pocketbuy/stores/{store_id}/materials | 通过后台上传或替换 Store 图片材料 |
POST /api/admin/pocketbuy/stores/{store_id}/review | Store 准入审核,通过后才可用;原因必填并写审计 |
POST /api/admin/pocketbuy/stores/{store_id}/status | 调整 Store 状态,原因必填并复验 Merchant / Review |
GET /api/admin/pocketbuy/support-banks | 从 bns_support_bank_list 查询有效银行,支持名称、bank_code、nip 搜索 |
| `GET /api/admin/pocketbuy/{merchant | store}/import-template` |
POST /api/admin/pocketbuy/files | 上传 Store / SA 图片文件,返回文件元数据供业务表单引用 |
| `POST /api/admin/pocketbuy/{merchant | store}/import-preview` |
| `POST /api/admin/pocketbuy/{merchant | store}/import-commit` |
| `GET /api/admin/pocketbuy/{merchant | store}/import/{import_batch_id}` |
GET /api/admin/pocketbuy/performance/summary | 按五类角色查询绩效统计数据 |
GET /api/admin/pocketbuy/performance/details | 按五类角色查询绩效明细数据 |
POST /api/admin/pocketbuy/performance/exports | 按当前筛选创建统计/明细异步导出任务 |
GET /api/admin/pocketbuy/performance/exports/{export_id} | 查询导出状态并在权限校验后获取短期下载地址 |
11. 审计日志
必须审计:
- 列表查询。
- 详情查看。
- 敏感字段查看。
- 审核通过、拒绝。
- 基础资料修改。
- Merchant / Store 归属维护:操作人、培训状态、Merchant、变更前后 Store 列表、有效性校验结果、原因和 trace_id。
- Merchant / Store 单笔登记、编辑和状态调整:对象 ID、变更前后摘要、状态影响确认、原因、操作人、结果和 trace_id。
- Merchant CAC Certificate:Merchant ID 或 submission ID、文件 ID/存储键/文件 hash、类型/大小、校验结果、替换前后文件摘要、操作人、原因、结果和 trace_id;不得写入文件内容或公开 URL。
- SA/SM/RM Merchant + Store 资料提交及转换:submission ID、提交人/角色/区域快照、Merchant 匹配或创建结果、Store ID、重复校验摘要、操作人、结果和 trace_id。
- Merchant / Store 批量导入:批次号、文件名、文件 hash、总行数、成功/失败数、生成 ID 列表、错误摘要、操作人、开始/完成时间和 trace_id;BVN、NIN、NUBAN 仅保留脱敏摘要。
- 支持银行查询和选择:记录所选
bank_code,不记录完整下拉结果。 - 培训状态变更。
- 初始密码下发。
- 账号启用、停用。
- 权限不足或操作失败。
- 绩效统计/明细导出:导出类型、筛选条件、数据快照、行数、文件 hash、生成/过期时间、下载人、下载时间、结果和 trace_id;不记录明文手机号或收款账号。
资料修改审计字段:
| 字段 | 说明 |
|---|---|
| 操作人 | 后台账号 |
| SA ID | 被修改对象 |
| 操作状态 | rejected |
| 修改字段 | 字段名列表 |
| 修改前摘要 | 脱敏摘要 |
| 修改后摘要 | 脱敏摘要 |
| 修改原因 | 必填 |
| 操作结果 | 成功/失败 |
| trace_id | 请求追踪 ID |
12. 验收口径
- 菜单
PocketBuy Operations / SA Review Management可打开。 - 菜单
PocketBuy Operations / Merchant Management、Store Management可打开,并按 read/create/edit/review/status 权限控制入口和操作。 - 菜单
PocketBuy Operations / Performance Reports可按权限打开;五类角色的统计和明细可按同一筛选导出,金额与佣金台账一致、敏感字段脱敏、大数据量异步生成且全程可审计。 - 单笔登记 Merchant / Store 时不能填写 ID;保存成功后返回符合规则且不可修改的系统 ID。新增 Store 默认进入
pending + inactive,不可直接用于 SA 绑定或新订单。 - SA/SM/RM 新建 Store 时先完成 Merchant Information 页面;一期新 Merchant 草稿仅填写名称,不要求 CAC,由后台受控转换创建/关联 Merchant。新 Store 仍默认
pending + inactive,不可直接用于 SA 绑定或新订单。 - SA/SM/RM 门店提交仅在门店名称与既有门店完全相同时阻断;Store 归属 Merchant 无效、Store 未审核通过却启用等场景也必须阻断并给出明确原因。
- 只有具备
store.review权限的用户可审核 Store;审核通过后 Store 才能变为approved + active并进入 Effective Available,拒绝后保持不可用。 - Store 收款银行可按银行名或代码搜索,选择后自动回填
payee_bank_name和payee_bank_code;payee_account_name保持账户户名语义。 - Store 图片字段在单笔登记或编辑页通过后台上传补充,详情页展示文件摘要,不出现需要运营维护的图片链接输入。
- Merchant / Store 均可下载独立模板,上传 Excel/CSV 后先预览逐行校验结果;含错误时不能提交。
- 批量导入不接受文件内自带 ID,全部通过后原子导入并生成 ID;重复文件提交不重复创建数据。
- 批量 Store 导入可校验 Merchant、受支持银行、NUBAN 和金额;BVN 仅在模板提供时校验。标准模板不出现审核/状态字段和非必填图片字段,导入结果统一为待审核不可用。
- Merchant / Store 停用前展示影响并要求原因;停用不删除历史关系或取消已提交订单,Store 列表能区分自身状态与 Effective Status。
- 列表可按 SA、审核、培训、账号、门店等条件筛选。
- 点击列表 Detail 后在新 Tab 打开详情页。
- 详情页页头有 Review、Edit Profile、Training、Manage stores、Enable/Disable 操作按钮。
- 详情页能查看基础信息、多门店、收款、KYC/风控材料、用户活体验证照片和审核轨迹;SA 图片材料可由有权限人员通过后台上传入口补充或替换。
- 审核通过后进入待培训,不允许立即办单。
- 拒绝必须填写原因。
rejected状态只有特定权限人员可修改基础信息。- BVN、BVN KYC 结果、人脸比对结果、银行信息在任何状态下都不可通过该页面修改;人脸材料和活体验证照片只允许通过后台上传入口替换文件,不允许维护图片链接。
- SA App 入驻阶段不采集 Merchant / Store;培训通过后,具备
sa.store.assign权限的后台人员可通过 Manage stores 选择 Merchant 并多选有效 Store。 - 未保存至少一个有效 Store 前不得下发初始密码或允许办单;Store 支持多选,一个 SA 可绑定多个门店展业。
- Merchant / Store 归属变更、培训状态和密码下发均可在审核轨迹中追溯。
- 停用账号阻断登录和新进件,但处理中订单继续推进,代办单用户仍可查询和完成不依赖 SA 实时操作的后续步骤。
- 所有操作均有审计日志。