feat: 完善移动端会员业务流程
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 186 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 645 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 718 B |
Binary file not shown.
|
After Width: | Height: | Size: 1.7 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 766 KiB |
+28
-32
@@ -2,12 +2,12 @@
|
||||
|
||||
> 版本:V1.0
|
||||
> 更新日期:2026-10-09
|
||||
> 适用项目:`im_workbench`
|
||||
> 适用项目:`olons_server`
|
||||
> 数据源:MySQL `olons_admin` 中的 `hg_*` 业务表
|
||||
|
||||
## 1. 文档说明
|
||||
|
||||
本文档用于移动端与 Workbench 后端联调。内容依据《移动端任务与账户平台需求文档》、当前代码实现和现有数据库表结构整理。
|
||||
本文档用于移动端与 Olons Server 后端联调。内容依据《移动端任务与账户平台需求文档》、当前代码实现和现有数据库表结构整理。
|
||||
|
||||
接口分为两类:
|
||||
|
||||
@@ -303,7 +303,7 @@ PATCH /v1/me/avatar
|
||||
}
|
||||
```
|
||||
|
||||
附件必须是 `app_id=workbench`、归属当前会员、状态有效且 MIME 类型为图片的 `hg_sys_attachment` 记录。上传接口未实现前,前端不能自行生成可用附件 ID。
|
||||
附件必须是 `app_id=olons_server`、归属当前会员、状态有效且 MIME 类型为图片的 `hg_sys_attachment` 记录。上传接口未实现前,前端不能自行生成可用附件 ID。
|
||||
|
||||
成功响应 `data`:
|
||||
|
||||
@@ -581,7 +581,7 @@ POST /v1/task-orders/claim
|
||||
|
||||
成功返回订单摘要,包括 `id`、`order_no`、`status`、`product`、`total_amount`、`commission_amount`、`currency` 和 `deadline_at`。
|
||||
|
||||
领单事务会锁定当前会员和钱包记录,重新校验大厅等级、账户状态、最低余额、当日次数、未完成订单、任务发布与有效期、任务每日上限及单会员上限。当前版本在事务内直接选中可用任务,创建 `status=pending` 的订单并记录 `matched_at`,客户端收到成功响应后即可进入订单详情并提交凭证;不依赖额外匹配进程。领取不扣款、不冻结余额,也不生成钱包流水。当前表结构没有任务与商品的直接绑定字段,因此 `product.id`、`total_amount` 和 `unit_price_amount` 允许为 `0`,任务名称和封面取自 `hg_task`。
|
||||
领单事务会锁定当前会员和钱包记录,重新校验大厅等级、账户状态、最低余额、会员等级每日领取次数和未完成订单。校验通过后先创建 `status=matching`、`order_type=2` 的派单中订单,此时商品、数量、金额和佣金均为空或 `0`,与后台订单列表的“派单中/匹配订单”原型一致。会员的 `auto_dispatch=1` 时,达到网站设置的 `autoOrderDelaySeconds` 延时后由系统自动匹配:从当前已发布、在有效期内、币种为 CNY,且价格同时满足会员可用余额与 `autoOrderMinAmount`/`autoOrderMaxAmount` 区间的 `hg_product` 中随机选取商品,按会员当前等级版本计算佣金,并将订单原子更新为 `status=pending`。匹配成功时在同一事务内从可用余额扣除订单本金并转入冻结余额,同时生成可用余额支出和冻结余额收入流水。订单完成时释放冻结本金、返回可用余额并另行入账佣金;订单超时时也必须释放并退回本金。`auto_dispatch=2` 或自动匹配暂时找不到商品时,订单保持“派单中”,管理员可在后台通过“匹配订单”人工指定商品,人工匹配也执行相同的本金扣除和冻结流程。自动和人工匹配共用同一状态条件,并发时只有一方能更新成功。新注册会员默认开启自动派单,管理员可在会员编辑弹窗修改派单模式。
|
||||
|
||||
| HTTP | `reason` | 说明 |
|
||||
| --- | --- | --- |
|
||||
@@ -642,15 +642,12 @@ POST /v1/task-orders/{order_id}/submissions
|
||||
```
|
||||
|
||||
```json
|
||||
{
|
||||
"evidence_text": "已完成任务",
|
||||
"evidence_attachment_ids": [1001, 1002]
|
||||
}
|
||||
{}
|
||||
```
|
||||
|
||||
成功返回 `submission_no`、`status=reviewing`、`submitted_at` 和最新订单状态。重复提交不得生成多笔审核记录或佣金流水。
|
||||
成功返回 `submission_no`、`status=settled`、`submitted_at` 和 `order_status=completed`。重复提交不得生成多笔提交记录或佣金流水。
|
||||
|
||||
仅 `pending` 订单允许提交。`evidence_text` 去除首尾空白后最长 2000 字符,附件最多 9 个,两者至少提供一项;附件必须属于当前租户和当前会员、`app_id=workbench`、状态有效,且类型为图片或 PDF。提交事务对订单加锁,超时订单自动置为 `expired`,有效提交创建唯一审核记录并把订单置为 `processing`。此步骤不生成佣金流水;审核通过并结算仍由后台流程负责。
|
||||
正常情况下仅 `pending` 订单允许提交。前端按原型提供“立即提交”确认操作,不要求用户填写凭证。接口仍兼容可选的 `evidence_text` 和 `evidence_attachment_ids`:文字最长 2000 字符、附件最多 9 个;附件必须属于当前租户和当前会员、`app_id=olons_server`、状态有效,且类型为图片或 PDF。提交事务对订单、钱包加锁,超时订单自动置为 `expired`;有效提交创建唯一的已结算记录、佣金流水并增加可用余额,最后把订单置为 `completed`。后台审核页保留已结算记录供查询,冻结、强制处理和人工补偿只作为异常兜底。
|
||||
|
||||
订单详情返回:
|
||||
|
||||
@@ -659,7 +656,7 @@ POST /v1/task-orders/{order_id}/submissions
|
||||
- `submission`:凭证、审核状态与驳回原因;
|
||||
- `timeline`:创建、匹配、提交、审核、结算、完成时间点;
|
||||
- `ledgers`:以订单号或提交号关联的钱包流水;
|
||||
- `allowed_actions`:待处理为 `submit`、`contact_support`,审核中/超时/冻结/失败仅为 `contact_support`。
|
||||
- `allowed_actions`:待处理为 `submit`、`contact_support`,超时/冻结/失败仅为 `contact_support`;提交成功后不再提供重复提交操作。
|
||||
|
||||
### 7.6 任务统计
|
||||
|
||||
@@ -857,7 +854,7 @@ GET /v1/wallet/ledgers?page=1&page_size=20&biz_type=task&direction=income
|
||||
|
||||
响应包含 `recharge_no`、`status`、`request_amount`、`payable_amount`、`currency`、`expire_at` 和经过校验的支付指引。不通过客服聊天发送临时个人收款账户。
|
||||
|
||||
公开状态:`pending_payment`、`reviewing`、`processing`、`succeeded`、`failed`、`expired`、`cancelled`。失败、驳回或过期必须返回 `reason_code` 和 `reason_text`。
|
||||
公开状态:`pending_payment`、`reviewing`、`processing`、`succeeded`、`failed`、`expired`、`cancelled`。当前人工审核流程创建后直接进入 `reviewing`;`pending_payment` 仅为后续接入真实支付通道和支付回调时保留。失败、驳回或过期必须返回 `reason_code` 和 `reason_text`。
|
||||
|
||||
## 11. 收款账户和取出(已实现,沙箱)
|
||||
|
||||
@@ -870,36 +867,34 @@ GET /v1/wallet/ledgers?page=1&page_size=20&biz_type=task&direction=income
|
||||
```http
|
||||
GET /v1/payment-accounts
|
||||
POST /v1/payment-accounts
|
||||
POST /v1/attachments/images
|
||||
```
|
||||
|
||||
新增请求:
|
||||
先分别上传微信和支付宝二维码。图片接口使用 `multipart/form-data`,字段名为 `file`,仅接受不超过 5MB 的 JPG、PNG、WebP,返回附件 `id` 和可访问的 `url`。随后提交新增请求:
|
||||
|
||||
```json
|
||||
{
|
||||
"account_type": "bank_card",
|
||||
"bank_code": "ICBC",
|
||||
"bank_name": "中国工商银行",
|
||||
"holder_name": "张三",
|
||||
"identity_no": "11010119900101123X",
|
||||
"account_no": "6222000000001234",
|
||||
"reserved_phone": "13800138000",
|
||||
"qr_attachment_id": 0,
|
||||
"trade_password": "654321"
|
||||
"wechat_qr_attachment_id": 101,
|
||||
"alipay_qr_attachment_id": 102
|
||||
}
|
||||
```
|
||||
|
||||
支持的账户类型:
|
||||
绑卡页面按原型固定为银行卡账户,字段规则如下:
|
||||
|
||||
| `account_type` | 必填字段 | 说明 |
|
||||
| 字段 | 是否必填 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| `bank_card` | `bank_code`、`bank_name`、`holder_name`、`account_no` | 卡号只允许 8–32 位数字,空格和连字符会被移除 |
|
||||
| `digital_wallet` | `holder_name`、`account_no` | 通用数字钱包 |
|
||||
| `unionpay` | `holder_name`、`account_no` | 银联账户 |
|
||||
| `alipay` | `holder_name`、`account_no` | 后端固定渠道名称和编码 |
|
||||
| `wechat` | `holder_name`、`account_no` | 后端固定渠道名称和编码 |
|
||||
| `holder_name` | 是 | 2–64 个字符 |
|
||||
| `identity_no` | 是 | 15 位或 18 位身份证号,18 位末位允许 X |
|
||||
| `account_no` | 是 | 8–32 位数字,空格和连字符会被移除 |
|
||||
| `bank_name` | 是 | 2–100 个字符 |
|
||||
| `wechat_qr_attachment_id` | 是 | 当前会员上传的有效图片附件 |
|
||||
| `alipay_qr_attachment_id` | 是 | 当前会员上传的有效图片附件,不能与微信二维码共用同一附件 |
|
||||
|
||||
`reserved_phone` 可选,传入时必须为 11 位中国大陆手机号;`qr_attachment_id` 可选,传入时必须是当前会员在 `workbench` 应用下有效的图片附件。绑定前必须校验 6 位数字交易密码,连续错误 5 次后锁定 15 分钟。
|
||||
|
||||
姓名、账号和手机号使用 AES-256-GCM 独立随机 nonce 加密,账号另存 HMAC-SHA256 检索哈希用于防重复。列表只返回脱敏信息,绝不返回明文或密文。新增账户初始 `verify_status=pending`,必须由后台核验为 `verified` 后才能用于取出。
|
||||
姓名、身份证号和银行卡号使用 AES-256-GCM 独立随机 nonce 加密,身份证号和银行卡号另存 HMAC-SHA256 检索哈希。列表只返回脱敏信息,绝不返回明文或密文。绑定不要求支付密码;支付密码只在取出提交时校验。当前产品不设置银行卡后台审核流程,绑定成功后直接写入 `verify_status=verified`,可立即用于取出。
|
||||
|
||||
列表项示例:
|
||||
|
||||
@@ -907,13 +902,14 @@ POST /v1/payment-accounts
|
||||
{
|
||||
"id": 1,
|
||||
"account_type": "bank_card",
|
||||
"bank_code": "ICBC",
|
||||
"bank_code": "BANK",
|
||||
"bank_name": "中国工商银行",
|
||||
"holder_mask": "张*",
|
||||
"mobile_mask": "138****8000",
|
||||
"identity_no_mask": "1101**********123X",
|
||||
"account_no_mask": "6222********1234",
|
||||
"qr_attachment_id": 0,
|
||||
"verify_status": "pending",
|
||||
"wechat_qr_attachment_id": 101,
|
||||
"alipay_qr_attachment_id": 102,
|
||||
"verify_status": "verified",
|
||||
"is_default": true,
|
||||
"created_at": "2026-10-09T10:00:00Z",
|
||||
"updated_at": "2026-10-09T10:00:00Z"
|
||||
|
||||
@@ -111,9 +111,9 @@
|
||||
| **状态** | **用户可见文案** | **允许操作** | **系统约束** |
|
||||
| --- | --- | --- | --- |
|
||||
| 匹配中 | 正在匹配任务 | 取消等待 | 只允许一个匹配请求 |
|
||||
| 待处理 | 请在截止时间前完成 | 查看详情、提交 | 倒计时与服务端时间一致 |
|
||||
| 处理中 | 已提交,等待确认 | 查看详情、联系客服 | 防重复提交 |
|
||||
| 已完成 | 本金与佣金已入账 | 查看流水 | 三笔或组合流水必须可核对 |
|
||||
| 待处理 | 请在截止时间前完成 | 查看详情、立即提交 | 倒计时与服务端时间一致 |
|
||||
| 处理中 | 系统正在结算 | 查看详情、联系客服 | 防重复提交;正常情况为瞬时状态 |
|
||||
| 已完成 | 佣金已入账 | 查看流水 | 订单、提交记录和佣金流水必须可核对 |
|
||||
| 超时或冻结 | 显示原因与处理路径 | 申诉、联系客服 | 需要人工复核和审计 |
|
||||
| 失败或取消 | 显示失败原因 | 重新领取 | 不得产生不一致余额 |
|
||||
|
||||
|
||||
Reference in New Issue
Block a user