PRD-019 拍卖行
文档编号:PRD-019
版本:v1.0
状态:已通过
适用端:服务端 / 客户端
关联模块:AuctionManager、RecordServer、BillServer
1. 背景与目标
拍卖行为玩家提供非绑定物品的流通渠道。当前存在挂单重复、竞价后下架、成交不扣手续费等问题。本 PRD 统一挂单、竞价、一口价、结算、过期与手续费。
2. 核心规则
2.1 交易方式
| 方式 | 规则 |
|---|---|
| 拍卖 | 起拍价 + 加价幅度,到时最高价成交 |
| 一口价 | 买家直接按一口价成交 |
| 拍卖 + 一口价 | 竞价期间可被一口价直接买走 |
2.2 挂单
- 仅非绑定、可交易物品可挂单。
- 挂单时长 12/24/48 小时,可配置。
- 收取上架费(固定 + 按价格比例),下架不退。
- 同一物品可拆分成多单,单笔数量受堆叠限制。
2.3 竞价与结算
- 竞价需高于当前价 + 最小加价,冻结买家货币。
- 被超价后,前一位买家货币解冻。
- 成交后扣除卖家手续费,剩余货币邮件发放。
- 到期无人出价,物品邮件退回;一口价成交立即结算。
2.4 价格限制
- 设置最低/最高单价,防止异常转移。
- 同一买卖双方频繁交易触发风控标记。
- 异常价格订单进入人工审核(可配置)。
3. 服务端设计
3.1 数据结构
struct AuctionOrder {
uint64_t order_id;
uint64_t seller_id;
uint32_t item_id;
uint32_t count;
uint64_t start_price;
uint64_t buyout_price;
uint64_t current_price;
uint64_t current_bidder;
uint32_t expire_ms;
uint8_t state; // LISTED/BIDDING/SOLD/EXPIRED/CANCELED
};
3.2 协议
| 方向 | 协议 | 说明 |
|---|---|---|
| C→S | CS_AuctionList | 上架 |
| C→S | CS_AuctionCancel | 下架 |
| C→S | CS_AuctionBid | 出价 |
| C→S | CS_AuctionBuyout | 一口价 |
| C→S | CS_AuctionQuery | 搜索/筛选 |
| S→C | SC_AuctionList | 列表 |
| S→C | SC_AuctionResult | 竞价/成交结果 |
3.3 结算流程
出价/一口价
→ 校验订单状态、价格、余额
→ 冻结买家货币
→ 解冻前一位买家
→ 更新当前价/买家
→ 到期/一口价 → 成交
→ 扣手续费、邮件发卖家、物品入买家
→ 写 auction_log
3.4 一致性与风控
- 货币冻结/解冻/结算使用事务,失败回滚。
- 订单状态机单向流转,禁止回退。
- 同一
order_id的结算幂等。 - 记录买卖双方 IP/设备/交易频次,异常自动下架。
4. 客户端设计
- 搜索:物品名/品质/等级/价格区间/剩余时间排序。
- 列表:单价、总价、当前价、一口价、剩余时间。
- 出价:显示最小加价、当前最高价、冻结金额。
- 我的挂单:状态、被出价次数、下架/改价(未出价时)。
- 成交/过期通过邮件通知,点击跳转邮件。
5. 配置
Auction.xml:duration、listing_fee_rate、fee_rate、min_increment、price_min、price_max、max_orders。
6. 边界与异常
| 场景 | 处理 |
|---|---|
| 竞价相同价格 | 拒绝,需高于最小加价 |
| 卖家竞价自己的物品 | 拒绝 |
| 下架时已有出价 | 拒绝或需赔偿(配置) |
| 成交时背包满 | 物品转邮件 |
| 服务器重启 | 从 DB 恢复订单,冻结货币对账 |
| 重复结算 | 幂等,按订单状态返回 |
7. 验收标准
- 挂单/竞价/一口价/下架/过期全流程正确。
- 货币冻结、解冻、手续费、邮件发放一致。
- 订单状态不可逆向,重复请求不重复结算。
- 搜索/排序/剩余时间准确。
- 异常价格与自买自卖被拦截。