口令码与队列规则说明 迭代2 - xiaochu-dev/online-shopping-group5 GitHub Wiki
口令码与队列规则说明(迭代2 · Java版)
初稿:周到(产品经理),2026-10-07;v2.0修订2026-10-20;2026-10-22按已合入671ae63同步。迭代1规则仍见口令码与队列规则说明,本页只描述当前Java实现。
1 买家身份与旧码兼容
新意向必须登录买家账号,写入buyer_id及姓名、电话、交易地点快照。token_code为NULL,不生成或展示32位口令码;TimeUtils中保留的随机码工具不等于提交入口仍在调用它。同一买家同一商品最多一条pending/trading,由服务校验和部分唯一索引共同约束。
旧接口POST /intents/cancel保留tokenCode参数,仅精确命中pending意向才置cancelled,并填写finished_at。其他状态返回相同无效提示;买家页面无凭码撤销入口。token_code非空记录由部分唯一索引uq_intent_token约束,不在这里承诺旧匿名库迁移后一定保留全部旧码;迁移边界见数据库设计-迭代2。
2 排队与交易
| 动作 | 意向变化 | 商品和库存 |
|---|---|---|
| 买家提交 | 新pending,按created_at、id先到先得 | 要求on_sale、库存>0;不扣库存 |
| 卖家确认 | 仅队首pending可转trading,同商品不能已有trading | freeze:on_sale转frozen,不扣库存 |
| 标成功 | trading转success,填写trade_result与finished_at | 原子扣1,归零自动off_shelf/auto并结束其余pending |
| 标失败并作废 | trading转failed,记录原因与时间 | 不扣库存,release只释放frozen |
| 标失败并重排 | trading回pending、刷新created_at | 不扣库存;下一位仍需人工确认 |
| 旧码撤销 | pending转cancelled | 不扣库存,实时队列自然前移 |
位次不落库。队列按created_at ASC、id ASC读取;重排队尾刷新created_at。交易失败不会自动递补下一位为trading,这与旧Python流程不同。
stateDiagram-v2
[*] --> pending: 登录后提交
pending --> trading: 卖家确认队首
trading --> success: 成交扣1
trading --> failed: 失败作废
trading --> pending: 失败重排队尾
pending --> failed: 库存归零
pending --> cancelled: 仅旧码兼容
3 冻结、下架与补货
整件商品冻结,同一时刻一笔交易。frozen详情可查看但不再接收新意向,列表仅显示on_sale。成功后仍有库存,release恢复在售;库存0时自动下架,剩余pending失败并带原因。一次成交不必结束整个商品生命周期。
手动下架写off_shelf/manual,已有交易仍可完成,其他pending保留。release不覆盖手动下架。调整库存为0会自动下架并结束pending,但存在trading时禁止调0。补货不会自动上架;手动重新上架时若仍有trading,恢复frozen,否则on_sale。
4 数据与验证
intent状态允许pending/trading/success/failed/cancelled;新买家订单与客户购买历史只显示success/failed,按finished_at倒序。buyer_id是逻辑关联,不写成已有数据库外键。
PortalFlowTest14项、SellerTradeFlowTest9项、MyOrdersFlowTest3项,均包含在2026-10-21 23:19已记录的全量83项中。商品库存与回滚场景另见ProductCenterTest和ProductMigrationTest。本次只同步文档,未复跑业务测试或生成录屏。
详见买家门户与交易模块-迭代2、商品中心模块-迭代2、商品中心测试记录-迭代2。原始PM澄清记录保留原文;文档描述当前实现不等于需求方已批准所有差异。