feat(收口): 补齐 8 月迭代缺口并同步 Spec 与证据链
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled
- 新增六对成对迁移 000232–000237:H5 弹窗类型、退款结算标识与申请人备注、优先轮询事实字段与两个新终态、通道阈值命中留痕、手机号最近解绑人、提现资格校验留痕 - 退款:原因必填与申请人备注、来源支付与渠道流水冻结、线下处理流水号补录审计、按订单查询可选退款方式、企微审批材料补齐且新增字段缺失映射即明确失败 - 优先轮询:人工关闭、有效期到期独立周期任务、失败与过期人工重触发、事实字段与异常重试查询、资产解析端点只读投影 - 通道阈值:命中事实同事务留痕与命中记录查询;员工账单:列表筛选与详情投影;商户池:列表投影与统计周期语义;H5:弹窗类型与类别排序 - 手机号:有效关联数量与最近解绑人、短信验证码失败次数限制;导出:佣金明细十五列与报表序号列 - 时间筛选:三处新增筛选纳入统一严格解析契约,员工账单产生时间参数改名 - 同步 12 份主 Spec 需求、两端点与异步任务证据链,门禁 context-health 与 OpenSpec 校验通过
This commit is contained in:
@@ -81,6 +81,8 @@
|
||||
|
||||
线上订单原路可退条件按渠道契约在创建、提交和执行前重复预检:冻结实际商户的退款必需凭证不完整、服务商类型不具备退款能力、或原交易超出渠道可退时限时禁用原路并说明原因,只允许客户收款信息退款。富友原交易的原始日期必须回传渠道;未回传时仅支持 30 天内原交易,回传后可退 360 天内原交易,超出该范围的申请不得选择原路。
|
||||
|
||||
系统 SHALL 提供按来源订单查询可选退款方式的只读接口,返回可选方式集合、每种方式当前是否可用与不可用原因、原收款商户标识与名称、原支付渠道交易流水号与商户退款能力校验结果。该查询 MUST 与创建、重提使用同一方式判定实现,且原路可退的凭证判定 MUST 复用执行前预检所用的同一凭证判定来源,MUST NOT 引入第二套独立判定或独立开关;审批提交只消费已冻结的申请材料,MUST NOT 在提交环节引入新的方式判定。判定所需事实缺失时 MUST 返回不可用原因而非报错。查询 MUST 受既有订单数据范围约束,越权与订单不存在 MUST 不可区分。
|
||||
|
||||
#### Scenario: 无权威实收金额
|
||||
|
||||
- **WHEN** 来源订单无法取得权威实收金额,或取得的金额非正
|
||||
@@ -106,6 +108,17 @@
|
||||
|
||||
- **WHEN** 富友原交易的原始支付时间早于可退时限
|
||||
- **THEN** 系统禁用原路退款并说明原因,只允许客户收款信息退款
|
||||
|
||||
#### Scenario: 查询可选退款方式
|
||||
|
||||
- **GIVEN** 一张线上支付订单的原收款商户凭证不完整
|
||||
- **WHEN** 授权账号查询该订单的可选退款方式
|
||||
- **THEN** 系统返回客户收款信息退款为可用、原路退款为不可用及缺失凭证原因,并返回原收款商户与原支付渠道交易流水号
|
||||
|
||||
#### Scenario: 查询越权订单
|
||||
|
||||
- **WHEN** 调用者查询其数据范围外订单的可选退款方式
|
||||
- **THEN** 响应与订单不存在不可区分
|
||||
### Requirement: 企业微信唯一终审与审批尝试重提
|
||||
|
||||
退款申请 SHALL 保存退款原因、冻结实收金额、唯一关联套餐及其使用情况、方式、金额和当次材料快照。超级管理员、平台用户和代理可在各自订单数据范围内创建、修改并重提未成功申请;企业微信是唯一终审,本地 MUST NOT 人工通过、拒绝或退回已关联审批实例的申请。每次创建或重提 MUST 新增一条不可变的审批尝试记录,并以该尝试记录作为通用审批业务标识;同一申请每次提交各自持有独立审批实例,历史尝试材料与审批结果不被覆盖。退款单 SHALL 仅保存最新尝试与最新审批实例引用用于展示。
|
||||
@@ -347,6 +360,74 @@
|
||||
- **WHEN** 换货记录的迁移状态为 `failed`,且该记录保存了最近一次失败原因
|
||||
- **THEN** 导出行的迁移状态为“迁移失败”,且导出不输出该失败原因
|
||||
|
||||
|
||||
### Requirement: 退款原因必填与申请人备注
|
||||
|
||||
退款申请创建与重新提交时 SHALL 强制填写退款原因:原因去除首尾空白后为空 MUST 以参数非法错误拒绝,MUST NOT 落库申请或审批尝试。该校验 MUST 只作用于创建与重提用例:历史申请与补发历史审批的路径不受本约束、MUST NOT 因历史原因缺失而阻断。退款申请 SHALL 支持可选申请人备注,创建与重提均可填写或替换,并 MUST 冻结进当次审批尝试快照;既有申请的历史尝试快照 MUST NOT 因重提被改写,且申请人备注 MUST NOT 复用或改写退款单既有的审批备注字段(该字段语义与展示口径不变)。退款原因与备注的冻结语义 MUST 与既有实收金额、方式、金额、材料快照一致,MUST 随每次重提新增而非覆盖。
|
||||
|
||||
#### Scenario: 原因为空被拒绝
|
||||
|
||||
- **WHEN** 创建或重提请求的退款原因缺失或仅含空白字符
|
||||
- **THEN** 系统以参数非法错误拒绝,且不创建申请、不创建审批实例
|
||||
|
||||
#### Scenario: 备注冻结进当次快照
|
||||
|
||||
- **WHEN** 提交人填写备注后提交退款申请
|
||||
- **THEN** 该次审批尝试快照保存该备注,后续重提修改备注 MUST NOT 改写历史尝试快照
|
||||
|
||||
|
||||
### Requirement: 退款渠道标识与线下处理流水号
|
||||
|
||||
退款单 MUST 持久化并可查询「来源支付单号」与「原支付渠道交易流水号」,不得仅通过订单与支付单关联在读取时推导;两者取创建申请时冻结的原成功支付事实;重提时两者 MUST 与冻结实收金额同批从同一原成功支付事实重新冻结,历史尝试快照 MUST NOT 被改写。原路退款成功后的渠道退款流水号沿用既有事实,MUST NOT 被本要求改变。退款申请 SHALL 支持登记线下退款处理流水号或凭证编号:仅客户收款信息退款(线下到账)方式允许由授权账号在申请创建后补录或更正,其余退款方式 MUST NOT 登记(登记请求 MUST 以状态非法拒绝);每次登记 MUST 写入审计(操作者、时间、前后值),MUST NOT 因登记改变退款状态、实收金额、套餐失效或佣金回溯规则。列表、详情与导出 SHALL 返回来源支付单号、原支付渠道交易流水号与线下退款处理流水号。
|
||||
|
||||
#### Scenario: 退款单保存来源支付事实
|
||||
|
||||
- **GIVEN** 来源订单存在成功支付记录
|
||||
- **WHEN** 创建退款申请
|
||||
- **THEN** 退款单持久化该来源支付单号与原支付渠道交易流水号,列表、详情与导出均返回这两个值
|
||||
|
||||
#### Scenario: 原支付事实缺失
|
||||
|
||||
- **GIVEN** 来源订单为后台线下订单或员工代收订单,没有线上支付记录
|
||||
- **WHEN** 创建退款申请
|
||||
- **THEN** 两个字段以空值保存并返回,不阻断申请创建
|
||||
|
||||
#### Scenario: 登记线下退款处理流水号
|
||||
|
||||
- **GIVEN** 一笔客户收款信息退款已完成
|
||||
- **WHEN** 授权账号登记线下退款处理流水号或凭证编号
|
||||
- **THEN** 系统保存该值并写审计,退款状态、实收金额与佣金回溯行为不变
|
||||
|
||||
#### Scenario: 登记操作留痕
|
||||
|
||||
- **WHEN** 同一字段被再次更正
|
||||
- **THEN** 审计记录包含操作者、时间与前后值,历史值可追溯
|
||||
|
||||
|
||||
### Requirement: 企业微信退款审批材料字段
|
||||
|
||||
退款审批材料 SHALL 在既有字段之外带出:资产类型(卡或设备)、设备类型与设备型号(资产为设备时)、当前退款套餐已用量与套餐总量、原支付渠道交易流水号。套餐已用量与总量 MUST 采用与退款展示字段相同的解析规则与真流量口径;资产类型 MUST 沿用退款申请的下单快照推导;设备类型与设备型号 MUST 取退款申请关联设备,无关联设备时以空值提交;原支付渠道交易流水号 MUST 取创建申请时冻结的原成功支付事实。上述字段 MUST 在提交时冻结进当次审批尝试快照,使审批人在企业微信侧可直接看到用量数字。任一材料在提交时不可解析 MUST 以空值或零值提交并 MUST NOT 阻断审批提交;材料 MUST NOT 包含凭证内容、完整收款文本或商户密钥。
|
||||
|
||||
企业微信模板控件缺失导致本次新增字段无法提交时 MUST 明确失败并提示需配置控件,MUST NOT 静默丢弃该字段;本约束 MUST 只作用于本次新增字段,既有未映射的可选控件 MUST 保持既有跳过行为。
|
||||
|
||||
#### Scenario: 审批材料带出套餐用量
|
||||
|
||||
- **GIVEN** 退款申请关联的套餐使用记录存在真已用量与真总量
|
||||
- **WHEN** 提交企业微信退款审批
|
||||
- **THEN** 审批材料包含资产类型、设备类型与型号(适用时)、套餐已用量与总量及原支付渠道交易流水号
|
||||
|
||||
#### Scenario: 套餐事实不可解析
|
||||
|
||||
- **GIVEN** 退款申请未关联任何套餐使用记录
|
||||
- **WHEN** 提交企业微信退款审批
|
||||
- **THEN** 套餐已用量与总量以零值或空值提交,审批提交正常完成
|
||||
|
||||
#### Scenario: 模板缺少控件
|
||||
|
||||
- **GIVEN** 企业微信退款审批场景未配置套餐用量控件映射
|
||||
- **WHEN** 提交退款审批
|
||||
- **THEN** 系统明确失败并指出缺失控件,不静默丢弃该字段
|
||||
|
||||
## 可达操作索引
|
||||
|
||||
本节只用于入口导航,不是行为 Requirement;业务义务以上述 Requirements 为准。
|
||||
@@ -357,7 +438,7 @@
|
||||
|
||||
### 退款管理
|
||||
|
||||
`GET /api/admin/refunds`(退款申请列表);`POST /api/admin/refunds`(创建退款申请);`GET /api/admin/refunds/{id}`(退款申请详情);`POST /api/admin/refunds/{id}/trigger-approval`(补发历史退款审批);`POST /api/admin/refunds/{id}/approve`(审批通过退款申请);`POST /api/admin/refunds/{id}/reject`(审批拒绝退款申请);`POST /api/admin/refunds/{id}/resubmit`(重新提交退款申请);`POST /api/admin/refunds/{id}/return`(退回退款申请)。
|
||||
`GET /api/admin/refunds`(退款申请列表);`POST /api/admin/refunds`(创建退款申请);`GET /api/admin/refunds/{id}`(退款申请详情);`POST /api/admin/refunds/{id}/trigger-approval`(补发历史退款审批);`POST /api/admin/refunds/{id}/approve`(审批通过退款申请);`POST /api/admin/refunds/{id}/reject`(审批拒绝退款申请);`POST /api/admin/refunds/{id}/resubmit`(重新提交退款申请);`POST /api/admin/refunds/{id}/return`(退回退款申请);`GET /api/admin/refunds/order-options`(按来源订单查询可选退款方式);`POST /api/admin/refunds/{id}/offline-settlement`(登记或更正线下退款处理流水号)。
|
||||
|
||||
### 换货管理
|
||||
|
||||
|
||||
Reference in New Issue
Block a user