feat(payment): separate creator income settlement
This commit is contained in:
1 parent
cd93ea1656
commit
e20418e909
17 files changed
+451
-445
No files matched your search
@@ -7,7 +7,7 @@
|
||||
- **作者收益与推广返佣分离**:创作中心只读取付费文章作者收益,不读取 `Rebate` 推广返佣数据。
|
||||
- **收益记录以订单为源**:支付成功且权益发放完成后,每笔符合条件的付费订单最多生成一条作者收益记录。
|
||||
- **收益生成时快照**:保存原始支付金额、货币、作者分成比例和适用会员等级,后续配置或等级变化不影响历史记录。
|
||||
- **现金与积分彻底分离**:分别记录、统计、结算、写入流水和执行冲正;不换算、不合并。
|
||||
- **现金与积分彻底分离**:分别记录、统计、结算和写入流水;不换算、不合并,退款不改变作者收益。
|
||||
- **统一认证边界**:前台作者 ID 始终取当前登录用户,后台接口复用支付中心权限模型;所有 REST 路由必须提供 `permission_callback`。
|
||||
- **原子余额操作**:现金和积分余额只能通过现有余额服务变更,不直接修改用户 meta。
|
||||
- **最终结构替换**:新增或调整表结构时直接更新最终 schema 版本,不增加旧字段双读、迁移层或兼容路径。
|
||||
@@ -37,22 +37,21 @@
|
||||
|
||||
---
|
||||
|
||||
## Phase 2 — 收益自动/手动结算与退款冲正
|
||||
## Phase 2 — 收益周期结算与退款保持
|
||||
|
||||
**用户故事**:7、10、11、12、13、14
|
||||
|
||||
### What to build
|
||||
|
||||
实现待结算收益的到期判断、自动结算、后台手动逐笔/批量结算,以及退款或取消后的取消、冲正和待追缴流程。现金收益写入现金余额,积分收益写入积分余额;所有状态转换和余额操作具备幂等性。
|
||||
实现待结算收益按配置周期自动结算、后台手动逐笔/批量重试。现金收益写入现金余额,积分收益写入积分余额;退款或取消订单不再改变作者收益,所有入账操作具备幂等性。
|
||||
|
||||
### Done when
|
||||
|
||||
- [x] `src/Payment/Revenue.php` 或拆分后的结算服务实现 `settle(record_ids, actor)`,现金和积分分别调用对应原子余额服务并写入对应流水。
|
||||
- [x] `settlement scheduler` 仅在自动模式下处理达到配置延迟时间的待结算记录,默认延迟 24 小时;手动模式下定时任务不入账。
|
||||
- [x] `settlement scheduler` 按站点时区处理达到配置结算周期的待结算记录;结算周期结束后自动入对应钱包,不再配置延迟小时或自动/手动模式。
|
||||
- [x] 同一收益被重复结算、并发结算或重复定时扫描时,只能成功入账一次。
|
||||
- [x] `Refund reversal handler` 实现 `cancel_or_reverse(order_id, reason)`:未入钱包记录变为已取消/退款,已入钱包记录按货币执行冲正。
|
||||
- [x] 冲正时余额不足不会产生负余额,收益记录转为待追缴,并保存应冲正金额、错误信息和审计信息。
|
||||
- [ ] 重复退款通知和重复冲正请求保持幂等;服务测试覆盖自动结算、手动结算、退款前结算、退款后结算和余额不足场景。
|
||||
- [x] 订单退款或取消不会取消 pending 收益、冲正 settled 收益或产生待追缴记录;收益只按正常周期进入对应钱包。
|
||||
- [ ] 服务测试覆盖现金/积分比例快照、周期边界、自动结算、手动重试、退款后收益保持和并发幂等场景。
|
||||
|
||||
---
|
||||
|
||||
@@ -62,7 +61,7 @@
|
||||
|
||||
### What to build
|
||||
|
||||
将用户中心“创作中心”从文章管理页面改造成作者收益页面。实现现金/积分双货币收益卡片、待结算与已入钱包展示、创作分成说明 Tab、收入明细 Tab,以及基于现有用户中心 REST/Ajax 机制的无刷新筛选和分页。
|
||||
将用户中心“创作中心”改造成作者收益页面。实现现金/积分双货币收益卡片、待结算与已结算展示、结算备注和三列收入明细,并保留基于现有用户中心 REST/Ajax 机制的分页加载。
|
||||
|
||||
保留独立的“收益中心”推广返佣入口,确保两个页面的数据和开关互不影响。
|
||||
|
||||
@@ -70,11 +69,11 @@
|
||||
|
||||
- [ ] `src/User/Center.php`、`inc/helpers/user-center-renderers/sidebar-commerce.php` 和相关侧栏逻辑在创作分成关闭时隐藏创作中心入口,但仍显示独立的收益中心入口。
|
||||
- [ ] 用户中心创作中心渲染器不再输出文章发布、草稿、审核、编辑、删除或文章管理内容。
|
||||
- [ ] `Creator income view model and renderers` 实现现金/积分今日收入、累计收益、待结算和已入钱包数据,并排除取消、退款和待追缴金额。
|
||||
- [ ] `Creator income view model and renderers` 实现现金/积分今日收入、累计收益、待结算和已结算数据,列表只输出“现金收益/积分收益、+金额、待结算/已结算”。
|
||||
- [ ] `GET /wp-json/aksrt/v1/user-center/...` 作者收益接口只使用当前认证用户,未登录或访问他人数据时被拒绝;路由均具备 `permission_callback`。
|
||||
- [ ] 创作分成 Tab 输出经过 `wp_kses` 处理的后台 HTML;收入明细默认每页 20 条、按产生时间倒序,并包含文章、订单、支付金额、作者分成金额、货币和收益状态。
|
||||
- [ ] `assets/js/routes/user-center.js` 完成两个 Tab、筛选、分页和 History API 无刷新加载;请求失败时保留卡片和布局并显示可重试提示。
|
||||
- [ ] 前台交互测试验证现金/积分分栏、空状态、筛选组合、退款/待追缴展示、移动端无横向溢出,以及创作中心与收益中心数据隔离。
|
||||
- [ ] 结算备注输出经过 `wp_kses` 处理的后台 HTML;收入明细默认每页 20 条、按产生时间倒序,移除货币 Tab 和状态筛选。
|
||||
- [ ] `assets/js/routes/user-center.js` 只转发创作中心分页参数并保持 History API 无刷新加载;请求失败时保留卡片和布局并显示可重试提示。
|
||||
- [ ] 前台交互测试验证现金/积分分栏、空状态、分页、退款后收益保持、移动端无横向溢出,以及创作中心与收益中心数据隔离。
|
||||
|
||||
---
|
||||
|
||||
@@ -84,16 +83,16 @@
|
||||
|
||||
### What to build
|
||||
|
||||
在“支付&付费 > 创作中心”集中提供创作开关、三档独立分成比例、处理模式、延迟时间、现金提示阈值和说明 HTML 配置。复用现有支付中心“创作分成”Native 运营页面,补齐作者收益查询、筛选、逐笔/批量结算、退款冲正和待追缴查看。
|
||||
在“支付&付费 > 创作中心”集中提供开关、现金/积分两套三档分成比例、结算周期和结算备注文案 HTML。复用现有支付中心“创作分成”Native 运营页面,提供作者收益查询、筛选、逐笔/批量结算重试。
|
||||
|
||||
### Done when
|
||||
|
||||
- [ ] `src/Admin/Schema/SchemaPayment.php`、`assets/admin/src/schema/sections/payment/index.js` 和支付菜单文件共同注册“创作中心”配置项。
|
||||
- [ ] 配置 REST 能加载和保存开关、60/70/80 比例、自动/手动模式、延迟小时数、50 元提示阈值和 HTML 说明;非法比例、负数延迟和不允许的模式值被拒绝。
|
||||
- [ ] 配置 REST 能加载和保存开关、两套 60/70/80 默认比例、结算周期和 HTML 备注;非法比例和周期值被拒绝。
|
||||
- [ ] `src/Settings/PaymentRuntime.php` 或对应 `AKSRT_Settings` 运行时读取器只读取新的创作中心配置,不增加旧配置双读或静默 fallback。
|
||||
- [ ] `src/Admin/PaymentController.php` 和现有 Native 支付运营页面支持按作者、文章、货币、收益状态、订单状态和时间查询收益记录。
|
||||
- [ ] 管理员可逐笔或批量结算,已处理记录不会重复入账;普通用户无法访问运营接口。
|
||||
- [ ] 后台可查看已取消/退款、冲正和待追缴记录,并显示失败原因与审计信息。
|
||||
- [ ] 后台只运营 pending/settled 收益记录;退款不提供作者收益冲正或追缴入口。
|
||||
- [ ] `php tools/audit-admin-contracts.php` 通过,后台配置与运营测试覆盖保存、权限、查询和操作结果。
|
||||
|
||||
---
|
||||
@@ -104,13 +103,13 @@
|
||||
|
||||
### What to build
|
||||
|
||||
对收益生成、结算、退款冲正、用户中心、后台配置和运营页面进行跨模块联调,完成静态检查、前端构建、契约审计和可用的 WordPress/外部 Docker harness 验证。修复跨阶段集成问题,并明确记录环境不可用时未执行的运行时验证。
|
||||
对收益生成、周期结算、退款保持、用户中心、后台配置和运营页面进行跨模块联调,完成静态检查、前端构建、契约审计和可用的 WordPress/外部 Docker harness 验证。修复跨阶段集成问题,并明确记录环境不可用时未执行的运行时验证。
|
||||
|
||||
### Done when
|
||||
|
||||
- [ ] 收益服务测试覆盖比例快照、货币分离、订单幂等、到期结算、退款冲正、待追缴和并发重复操作。
|
||||
- [ ] 前台交互测试覆盖开关门控、本人数据隔离、双货币卡片、Tab 无刷新、分页筛选、错误重试、移动端布局和推广返佣隔离。
|
||||
- [ ] 后台配置与运营测试覆盖 Schema/REST 契约、权限、自动/手动模式、批量结算、退款记录和待追缴查询。
|
||||
- [ ] 收益服务测试覆盖现金/积分比例快照、货币分离、订单幂等、周期到期结算、退款后收益保持和并发重复操作。
|
||||
- [ ] 前台交互测试覆盖开关门控、本人数据隔离、双货币卡片、分页、错误重试、移动端布局和推广返佣隔离。
|
||||
- [ ] 后台配置与运营测试覆盖 Schema/REST 契约、权限、周期自动结算、批量结算重试和现金/积分查询。
|
||||
- [ ] `php tools/audit-admin-contracts.php` 返回成功状态。
|
||||
- [ ] `assets/admin` 执行 `npm run build` 成功,生成的 `assets/admin/build/` 文件保持可加载。
|
||||
- [ ] 按环境条件完成 PHP 静态检查和 WordPress/外部 Docker harness 运行验证;缺少运行环境时,在交付记录中明确列出未执行项及原因。
|
||||
@@ -127,11 +126,11 @@
|
||||
- 本次不提供站内作者与购买者之间的订单争议处理流程。
|
||||
- 本次不允许现金与积分互相兑换、折算或合并统计。
|
||||
- 本次不设置作者收益进入钱包的 50 元结算门槛;该金额只用于现金提现提示。
|
||||
- 本次不允许余额因冲正而变为负数,也不实现自动追缴扣款之外的催收流程。
|
||||
- 本次不实现退款后的作者收益冲正、余额扣回或追缴。
|
||||
- 本次不为旧收益结构增加兼容读取、双路实现或历史数据迁移。
|
||||
- 本次不新增独立后台收益工作台,后台运营继续复用现有支付中心“创作分成”页面。
|
||||
- 本次不引入新的前端框架、支付网关或货币体系。
|
||||
|
||||
## Open Questions
|
||||
|
||||
暂无。PRD 中的收益口径、结算策略、货币处理、权限、退款冲正和后台入口均已确定。
|
||||
暂无。PRD 中的收益口径、结算策略、货币处理、权限、退款保持和后台入口均已确定。
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
当前用户中心的“创作中心”主要承担文章发布与管理,尚未提供付费文章作者收益的统一查看和结算状态反馈;现有“收益中心”又主要面向推广返佣,容易让用户混淆两类收益来源。
|
||||
|
||||
本需求将“创作中心”改造成只面向付费文章作者收益的页面,展示作者从付费内容订单中获得的现金和积分分成,并提供创作分成说明与收入明细。文章发布、草稿、审核、编辑和删除等管理功能本次不再显示于用户中心。
|
||||
本需求将“创作中心”改造成只面向付费文章作者收益的页面,展示作者从付费内容订单中获得的现金和积分分成,并提供结算备注与收入明细。文章发布、草稿、审核、编辑和删除等管理功能本次不再显示于用户中心。
|
||||
|
||||
创作分成功能需要独立开关。关闭后,用户中心隐藏创作中心入口,停止新作者收益生成、自动结算和手动结算;已有收益记录仍保留在后台供查询,不新增兼容读取或历史迁移逻辑。
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
系统已有用户中心面板注册与 REST 延迟加载机制,可用于实现无刷新页面切换;已有付费订单、积分余额、现金余额、作者收益台账、结算服务及支付后台配置体系。
|
||||
|
||||
现有创作中心页面包含文章管理功能,现有收益中心主要展示推广返佣。现有作者收益能力尚未完整接入付费文章作者视图,也未提供现金与积分分开统计、按收益记录分页筛选及退款冲正状态展示。
|
||||
现有创作中心页面包含文章管理功能,现有收益中心主要展示推广返佣。现有作者收益能力尚未完整接入付费文章作者视图,也未提供现金与积分分开统计、按收益记录分页展示及退款后收益保持。
|
||||
|
||||
## Solution
|
||||
|
||||
@@ -30,9 +30,9 @@
|
||||
|
||||
#### 今日收入
|
||||
|
||||
- 统计当天产生的有效作者分成记录,包括待结算和已入钱包的收益。
|
||||
- 统计当天产生的有效作者分成记录,包括待结算和已结算的收益。
|
||||
- 现金收益与积分收益分栏展示,不进行汇率换算或合并。
|
||||
- 退款、取消及已冲正的记录不计入有效收入。
|
||||
- 退款或取消订单不改变作者收益记录;统计只包含 pending 和 settled 状态。
|
||||
- 无当日收益时显示零值和合理的空状态,不隐藏卡片。
|
||||
|
||||
#### 我的收入
|
||||
@@ -44,47 +44,13 @@
|
||||
- 积分收益不受 50 元提现提示影响。
|
||||
- 卡片不混入推广返佣数据。
|
||||
|
||||
### 主内容 Tab
|
||||
### 收入明细
|
||||
|
||||
页面主体包含两个 Tab,不设置 Tab 侧边滚动栏:
|
||||
页面不再输出顶部 hero 或货币 Tab,现金收益和积分收益统计卡片直接置顶。结算备注和收入明细在同一页面展示,分页使用 Ajax/REST 局部加载,不刷新整个用户中心页面。
|
||||
|
||||
1. 创作分成
|
||||
2. 收入明细
|
||||
后台可配置安全 HTML 格式的结算备注文案,前台经过 `wp_kses_post` 清洗后输出。收入明细按单笔作者收益记录、产生时间倒序排列,每页 20 条;每行固定为三列:左侧“现金收益/积分收益”,中间“+XX现金/+XX积分”,右侧“待结算/已结算”。不再提供货币 Tab 或状态筛选。
|
||||
|
||||
Tab 切换、收入明细分页和筛选均使用 Ajax/REST 局部加载,不刷新整个用户中心页面;切换后保留当前用户中心布局,并同步更新浏览器历史状态。
|
||||
|
||||
#### 创作分成 Tab
|
||||
|
||||
允许后台配置 HTML 格式的说明内容。默认内容为:
|
||||
|
||||
> 在本站发布付费内容,获得的收益将参与收入分成<br>
|
||||
> 发布付费内容,请注意以下事项<br>
|
||||
> 普通用户分成比例为:60%<br>
|
||||
> 黄金会员分成比例为:70%<br>
|
||||
> 钻石会员分成比例为:80%<br>
|
||||
> 分成比例的计算方式为:付费文章实际收益x分成比例<br>
|
||||
> 获得收入超过50元后可申请现金提现<br>
|
||||
> 申请提现后,需后台人工处理,一般2-3小时,请耐心等待<br>
|
||||
|
||||
实际显示的比例和会员名称应根据后台当前配置渲染;收益记录使用生成时锁定的比例,不因后续配置修改而改变。
|
||||
|
||||
#### 收入明细 Tab
|
||||
|
||||
按单笔作者收益记录展示付费文章收益,默认按产生时间倒序排列,每页 20 条。每条记录至少包含:
|
||||
|
||||
- 付费文章标题,并链接至文章详情。
|
||||
- 实际支付金额及货币类型(现金或积分)。
|
||||
- 作者分成金额及对应货币类型。
|
||||
- 订单号、购买时间和订单状态。
|
||||
- 作者收益状态:待结算、已入钱包、已取消/退款或待追缴。
|
||||
|
||||
支持以下筛选,并通过 Ajax 无刷新更新列表:
|
||||
|
||||
- 货币类型:全部、现金、积分。
|
||||
- 收益状态:全部、待结算、已入钱包、已取消/退款、待追缴。
|
||||
- 日期范围。
|
||||
|
||||
无记录时显示统一空状态;请求失败时显示可重试的错误提示,不破坏已加载的卡片和 Tab 布局。
|
||||
无记录时显示统一空状态;请求失败时显示可重试的错误提示,不破坏已加载的卡片和列表布局。
|
||||
|
||||
### 作者收益规则
|
||||
|
||||
@@ -95,43 +61,37 @@ Tab 切换、收入明细分页和筛选均使用 Ajax/REST 局部加载,不
|
||||
- 普通用户默认 60%,一级会员默认 70%,二级会员默认 80%。这些比例在创作中心中独立配置,不跟随其他会员或商品分成设置变化。
|
||||
- 生成收益记录时锁定分成比例及适用等级;历史收益不因后台比例或用户等级后续变化而重新计算。
|
||||
- 现金订单只生成现金作者收益,积分订单只生成积分作者收益。
|
||||
- 两种货币共用普通用户、一级会员、二级会员三档比例,但分别统计、分别建立台账、分别结算。
|
||||
- 现金与积分分别配置普通用户、一级会员、二级会员三档比例,分别统计、分别建立台账、分别结算。
|
||||
- 现金作者收益结算至现金余额,积分作者收益结算至积分余额。
|
||||
- 50 元仅作为现金提现提示,不作为作者收益进入钱包的结算门槛;积分收益不受该提示影响。
|
||||
|
||||
### 结算策略
|
||||
|
||||
- 默认收益产生后延迟 24 小时进入可处理状态。
|
||||
- 后台可选择自动处理或手动处理。
|
||||
- 自动处理模式由定时任务处理已达到延迟小时数的待结算收益;默认延迟时间为 24 小时,后台可配置延迟小时数。
|
||||
- 手动处理模式下,管理员在现有支付中心“创作分成”运营页面中查询、筛选并逐笔或批量结算收益。
|
||||
- 自动和手动处理均必须保证每条收益只能成功结算一次,现金和积分分别执行原子入账。
|
||||
- 结算成功后更新收益状态并写入对应余额流水;失败时保留待结算状态和错误信息供后台重试。
|
||||
- 后台只配置结算周期(默认 30 天),不再配置最小结算金额、延迟小时或自动/手动模式。
|
||||
- 定时任务按 WordPress 站点时区扫描 created_at 已早于当前时间减去结算周期的 pending 记录,周期结束后自动将现金/积分分别写入对应钱包。
|
||||
- 管理员仍可在现有支付中心“创作分成”运营页面逐笔或批量手动重试结算,但这不是用户可配置的处理模式。
|
||||
- 每条收益只能成功入账一次;失败时保留 pending 状态供后续扫描或后台重试。
|
||||
|
||||
### 退款与冲正
|
||||
### 退款处理
|
||||
|
||||
- 退款或取消订单后,对应作者收益标记为已取消/退款,不再计入有效收入。
|
||||
- 尚未入钱包的作者收益直接取消,不得继续结算。
|
||||
- 已入钱包的作者收益执行对应货币的原子冲正:现金从现金余额扣回,积分从积分余额扣回。
|
||||
- 余额不足时不得静默扣成负数;收益记录进入待追缴状态,并保留后台处理入口、原始收益、应冲正金额和处理审计信息。
|
||||
- 冲正和结算必须具备幂等性,重复退款通知或重复后台操作不能重复扣款或重复改变状态。
|
||||
- 退款或取消订单不会取消 pending 收益、冲正 settled 收益或产生追缴记录。
|
||||
- 收益仍按正常结算周期进入对应钱包,现金和积分余额操作始终通过各自原子服务完成。
|
||||
|
||||
## User Stories
|
||||
|
||||
1. 作为登录用户,我可以从用户中心进入创作中心,查看付费文章产生的作者收益。
|
||||
2. 作为作者,我可以在顶部同时看到今日现金收益、今日积分收益及其累计状态,而不会将两种货币混为一个数字。
|
||||
3. 作为作者,我可以查看创作分成规则,并看到后台配置的最新说明内容。
|
||||
4. 作为作者,我可以按订单级别查看每笔付费文章收益,确认文章、订单、支付金额、货币和收益状态。
|
||||
5. 作为作者,我可以按货币、收益状态和日期筛选收入明细,并通过分页加载更多记录而不刷新页面。
|
||||
4. 作为作者,我可以按订单级别查看每笔付费文章收益,并看到现金/积分金额和结算状态。
|
||||
5. 作为作者,我可以通过分页查看混合现金/积分收入明细而不刷新页面。
|
||||
6. 作为无收益用户,我可以看到清晰的零值和空状态,而不是空白页面或错误。
|
||||
7. 作为作者,我可以看到待结算收益与已入钱包收益的区别,并知道现金提现提示不等同于作者收益结算门槛。
|
||||
7. 作为作者,我可以看到待结算收益与已结算收益的区别。
|
||||
8. 作为管理员,我可以独立开启或关闭创作分成功能;关闭后前台入口和收益处理流程均停止。
|
||||
9. 作为管理员,我可以配置普通用户、一级会员和二级会员的作者分成比例,默认值分别为 60%、70% 和 80%。
|
||||
10. 作为管理员,我可以配置自动或手动处理收益,并配置默认 24 小时的延迟处理时间。
|
||||
11. 作为管理员,我可以在现有支付中心创作分成运营页面查看作者、文章、货币、状态和时间,并手动逐笔或批量结算。
|
||||
12. 作为管理员,我可以查看退款、取消和待追缴记录,并区分已入钱包后的冲正情况。
|
||||
13. 作为作者,订单退款后可以看到对应收益被取消或冲正,而不会继续获得已失效收入。
|
||||
14. 作为作者,即使余额不足以完成退款冲正,系统也不会产生负余额,而会将记录标记为待追缴。
|
||||
9. 作为管理员,我可以分别配置现金和积分的普通用户、一级会员、二级会员分成比例。
|
||||
10. 作为管理员,我可以配置结算周期,周期结束后收益自动进入对应钱包。
|
||||
11. 作为管理员,我可以在现有支付中心创作分成运营页面查看作者、文章、货币、状态和时间,并手动逐笔或批量重试结算。
|
||||
12. 作为管理员,我可以按现金/积分、作者、文章和状态查询收益记录。
|
||||
13. 作为作者,订单退款后收益不会被取消、冲正或追缴。
|
||||
15. 作为用户,创作中心与推广返佣收益中心仍然是两个独立入口,页面数据不会相互混淆。
|
||||
16. 作为未登录访客,我不能访问创作中心收益数据或其他用户的收入明细。
|
||||
|
||||
@@ -141,20 +101,19 @@ Tab 切换、收入明细分页和筛选均使用 Ajax/REST 局部加载,不
|
||||
|
||||
#### Creator income service
|
||||
|
||||
负责作者收益的统一业务入口,隐藏订单筛选、比例快照、金额计算、状态转换、结算和冲正细节。
|
||||
负责作者收益的统一业务入口,隐藏订单筛选、比例快照、金额计算、状态转换和结算细节。
|
||||
|
||||
主要接口:
|
||||
|
||||
- `create_from_paid_order(order)`:支付成功且权益完成后创建待结算作者收益。
|
||||
- `get_user_summary(user_id, date)`:返回今日与累计的现金/积分有效收益、待结算和已入钱包金额。
|
||||
- `get_user_summary(user_id, date)`:返回今日与累计的现金/积分有效收益、待结算和已结算金额。
|
||||
- `get_user_records(user_id, filters, page, per_page)`:返回作者本人分页明细及总数。
|
||||
- `settle(record_ids, actor)`:按货币原子结算指定收益记录。
|
||||
- `cancel_or_reverse(order_id, reason)`:处理未结算取消或已结算冲正。
|
||||
- `get_admin_records(filters, page, per_page)`:为现有支付中心运营页面提供管理员查询数据。
|
||||
|
||||
#### Creator income view model and renderers
|
||||
|
||||
负责将收益服务数据转换为用户中心卡片、Tab 内容、明细行、分页、筛选项和空/错状态所需的前台结构。创作分成说明内容必须经过允许 HTML 的清洗后输出。
|
||||
负责将收益服务数据转换为用户中心双货币卡片、结算备注、三列明细行、分页和空/错状态所需的前台结构。结算备注必须经过允许 HTML 的清洗后输出。
|
||||
|
||||
#### Creator income REST endpoints
|
||||
|
||||
@@ -162,11 +121,7 @@ Tab 切换、收入明细分页和筛选均使用 Ajax/REST 局部加载,不
|
||||
|
||||
#### Settlement scheduler
|
||||
|
||||
负责扫描已达到延迟小时数的待结算收益,在自动模式下触发现金/积分分别结算。任务必须可重复执行且具备锁定、幂等和失败重试行为。
|
||||
|
||||
#### Refund reversal handler
|
||||
|
||||
负责监听付费订单退款或取消事件,取消未结算收益,或调用现金/积分余额服务完成冲正;余额不足时写入待追缴状态。
|
||||
负责按站点时区扫描已达到结算周期的待结算收益,触发现金/积分分别结算。任务必须可重复执行且具备幂等和失败重试行为;退款或取消事件不挂接作者收益处理。
|
||||
|
||||
### Architectural Decisions
|
||||
|
||||
@@ -185,13 +140,9 @@ Tab 切换、收入明细分页和筛选均使用 Ajax/REST 局部加载,不
|
||||
在“支付&付费 > 创作中心”下集中配置:
|
||||
|
||||
- 创作分成独立开关,默认关闭或沿用产品确定的启用初始状态。
|
||||
- 普通用户作者分成比例,默认 60%。
|
||||
- 一级会员作者分成比例,默认 70%。
|
||||
- 二级会员作者分成比例,默认 80%。
|
||||
- 收益处理模式:自动或手动。
|
||||
- 自动处理延迟小时数,默认 24 小时。
|
||||
- 现金提现提示阈值,默认 50,仅用于前台说明文案,不参与钱包结算门槛。
|
||||
- 创作分成 Tab 的 HTML 说明内容,默认填充需求中的说明文案。
|
||||
- 现金收益和积分收益各自配置普通用户、一级会员、二级会员比例,默认现金为 60%/70%/80%,积分默认 0%/0%/0%(需显式开启积分分成)。
|
||||
- 结算周期,默认 30 天;周期结束后自动进入对应钱包。
|
||||
- 结算备注文案,支持安全 HTML;不再配置最小结算金额、延迟小时、处理模式或展示设置。
|
||||
|
||||
作者收益记录需要能够保存:
|
||||
|
||||
@@ -199,9 +150,8 @@ Tab 切换、收入明细分页和筛选均使用 Ajax/REST 局部加载,不
|
||||
- 原始实际支付金额及货币。
|
||||
- 生成时锁定的分成比例和会员等级。
|
||||
- 作者分成金额及结算货币。
|
||||
- 待结算、已入钱包、已取消/退款、待追缴等状态。
|
||||
- 生成、到期、结算、取消、冲正时间。
|
||||
- 冲正金额、错误信息和后台处理审计信息。
|
||||
- 待结算、已结算两种新状态。
|
||||
- 生成、到期和结算时间;历史 reversal 字段不再被新业务读取。
|
||||
|
||||
新增或调整存储结构时直接采用最终结构并更新数据库 schema 版本;不对旧结构增加兼容字段、双读路径或数据迁移层。现有历史收益只作为后台已有记录处理,不纳入新作者收益统计口径。
|
||||
|
||||
@@ -209,9 +159,9 @@ Tab 切换、收入明细分页和筛选均使用 Ajax/REST 局部加载,不
|
||||
|
||||
用户端接口应提供:
|
||||
|
||||
- 作者收益摘要:现金/积分今日收益、累计收益、待结算和已入钱包金额。
|
||||
- 创作分成说明:经过安全 HTML 处理的配置内容及当前比例展示数据。
|
||||
- 收入明细:支持货币、状态、日期范围、页码和每页数量;返回记录列表、总数、当前页和分页信息。
|
||||
- 作者收益摘要:现金/积分今日收益、累计收益、待结算和已结算金额。
|
||||
- 结算备注:经过安全 HTML 处理的配置内容。
|
||||
- 收入明细:支持页码和每页数量;返回混合现金/积分记录、总数、当前页和分页信息。
|
||||
|
||||
收入记录响应至少包含:
|
||||
|
||||
@@ -219,7 +169,7 @@ Tab 切换、收入明细分页和筛选均使用 Ajax/REST 局部加载,不
|
||||
- 订单号、订单状态、支付时间。
|
||||
- 原始支付金额与货币。
|
||||
- 作者分成金额与货币。
|
||||
- 收益状态及必要的取消、退款或待追缴说明。
|
||||
- 收益状态:待结算或已结算。
|
||||
|
||||
所有用户接口必须验证登录状态、规范化分页参数、限制日期范围和筛选值,并将作者 ID 从当前认证用户上下文取得,不接受客户端传入的任意作者 ID。
|
||||
|
||||
@@ -243,35 +193,31 @@ Tab 切换、收入明细分页和筛选均使用 Ajax/REST 局部加载,不
|
||||
- 现金订单只进入现金收益,积分订单只进入积分收益。
|
||||
- 订单支付成功且权益完成时生成收益;重复通知不重复生成。
|
||||
- 非付费文章、其他订单类型、作者购买自己的文章不会生成作者收益。
|
||||
- 今日统计按站点时间计算,累计统计排除取消、退款和待追缴的无效金额。
|
||||
- 默认 24 小时前不可自动结算,达到延迟时间后可结算。
|
||||
- 自动和手动结算均不能重复入账;现金和积分余额流水分别正确写入。
|
||||
- 退款前结算和退款后结算两种路径都能正确取消或冲正。
|
||||
- 余额不足时不产生负余额,收益进入待追缴并保留审计信息。
|
||||
- 重复退款通知、重复结算请求和并发任务均保持幂等。
|
||||
- 今日统计按站点时间计算,累计统计只包含 pending/settled,现金与积分不混加。
|
||||
- 收益达到配置结算周期后自动结算;管理员手动重试和定时任务均不能重复入账。
|
||||
- 退款或取消订单不改变收益状态、不扣回余额、不产生追缴。
|
||||
- 重复结算请求和并发任务均保持幂等。
|
||||
|
||||
### 前台交互测试
|
||||
|
||||
- 创作分成开关关闭时,侧栏入口隐藏、页面不可访问、新收益不生成且不执行结算。
|
||||
- 登录用户只能看到自己的摘要和明细;未登录访问被拒绝或按用户中心既有规则处理。
|
||||
- 顶部两张卡片正确分栏显示现金与积分,并显示待结算和已入钱包金额。
|
||||
- 创作分成说明支持安全 HTML 输出,并正确展示默认内容和后台修改内容。
|
||||
- 两个 Tab Ajax 切换无整页刷新,不出现 Tab 侧边滚动栏。
|
||||
- 收入明细默认 20 条、时间倒序,翻页无刷新并保持筛选条件。
|
||||
- 货币、状态、日期筛选组合正确,空结果显示空状态,请求失败显示可重试提示。
|
||||
- 文章链接、订单信息、支付金额、作者分成金额和收益状态显示正确。
|
||||
- 退款、取消和待追缴记录在明细中可见且不计入有效收入卡片。
|
||||
- 顶部两张卡片直接显示现金与积分,并显示待结算和已结算金额。
|
||||
- 结算备注支持安全 HTML 输出,并正确展示默认内容和后台修改内容。
|
||||
- 页面不出现 hero 或货币/状态 Tab;收入明细默认 20 条、时间倒序,翻页无刷新。
|
||||
- 明细三列正确显示收益货币、带单位的正数金额和待结算/已结算状态。
|
||||
- 退款后记录仍保持原状态,不出现冲正或追缴文案。
|
||||
- 创作中心与推广返佣收益中心数据和页面入口保持独立。
|
||||
- 移动端沿用用户中心现有抽屉/Tab 行为,卡片和明细不发生横向溢出。
|
||||
|
||||
### 后台配置与运营测试
|
||||
|
||||
- 创作中心配置页面正确加载默认值、保存合法值并拒绝无效比例和负数延迟时间。
|
||||
- 比例、开关、处理模式、延迟小时数、提现提示阈值和 HTML 说明可独立保存。
|
||||
- 自动模式按延迟小时数处理到期收益,手动模式不会被定时任务自动结算。
|
||||
- 创作中心配置页面正确加载默认值、保存合法值并拒绝无效比例和周期值。
|
||||
- 现金/积分两套比例、开关、结算周期和 HTML 备注可独立保存。
|
||||
- 定时任务按站点时区和结算周期处理到期收益,不再存在自动/手动模式或延迟小时配置。
|
||||
- 手动结算支持逐笔和批量操作,并正确反馈成功、失败和已处理记录。
|
||||
- 后台列表支持作者、文章、货币、收益状态、订单状态和时间查询。
|
||||
- 管理员可查看退款冲正和待追缴记录,普通用户不能访问运营接口。
|
||||
- 管理员可按现金/积分、作者、文章、状态和时间查询记录,普通用户不能访问运营接口;退款不提供冲正或追缴入口。
|
||||
- 配置和路由契约审计通过:`php tools/audit-admin-contracts.php`。
|
||||
- 按项目现有条件完成 PHP 静态检查、前端构建和人工/运行时验证;若测试环境不具备 WordPress 或外部 Docker harness,应明确记录未执行项,不以静态通过替代运行验证。
|
||||
|
||||
@@ -285,7 +231,7 @@ Tab 切换、收入明细分页和筛选均使用 Ajax/REST 局部加载,不
|
||||
- 本次不提供站内作者与购买者之间的订单争议处理流程。
|
||||
- 本次不允许现金与积分互相兑换、折算或合并统计。
|
||||
- 本次不设置作者收益进入钱包的 50 元结算门槛;该金额只用于现金提现提示。
|
||||
- 本次不允许余额因冲正而变为负数,也不实现自动追缴扣款之外的催收流程。
|
||||
- 本次不实现退款后的作者收益冲正、余额扣回或追缴。
|
||||
- 本次不为旧收益结构增加兼容读取、双路实现或历史数据迁移。
|
||||
- 本次不新增独立后台收益工作台,后台运营继续复用现有支付中心“创作分成”页面。
|
||||
- 本次不引入新的前端框架、支付网关或货币体系。
|
||||
Reference in new issue
Block a user