From 78cd4c26963fe43eb27802b2f90651c2c45a97da Mon Sep 17 00:00:00 2001 From: OuYingJun1024 <1034284404@qq.com> Date: Tue, 2 Jun 2026 14:23:48 +0800 Subject: [PATCH] =?UTF-8?q?feat(wallet):=20=E6=B5=81=E6=B0=B4=20remark=20?= =?UTF-8?q?=E8=AF=AD=E4=B9=89=E5=8C=96=20+=20=E6=AF=94=E4=BB=B7=E9=87=8C?= =?UTF-8?q?=E7=A8=8B=E7=A2=91=E6=9A=82=E4=B8=8D=E5=8F=91=E9=87=91=E5=B8=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 签到发奖 remark='每日签到 第N天';看视频发奖 remark='看视频奖励金币'(原'看广告奖励') - 比价战绩里程碑领取暂不真发金币(产品定,后续删该功能):仍记领取/标记已领,但不调 grant_coins、余额不变、coin_awarded 恒 0 - 同步 test_compare_milestone(领取后余额不变/coin_awarded==0) + docs/api/compare-milestone-claim Co-Authored-By: Claude Opus 4.8 --- app/repositories/ad_reward.py | 2 +- app/repositories/comparison_milestone.py | 11 +++++------ app/repositories/signin.py | 3 ++- docs/api/compare-milestone-claim.md | 17 +++++++++-------- tests/test_compare_milestone.py | 8 ++++---- 5 files changed, 21 insertions(+), 20 deletions(-) diff --git a/app/repositories/ad_reward.py b/app/repositories/ad_reward.py index d42aab5..5e7388d 100644 --- a/app/repositories/ad_reward.py +++ b/app/repositories/ad_reward.py @@ -85,7 +85,7 @@ def grant_ad_reward( # 发金币 + 记一笔,同事务 crud_wallet.grant_coins( db, user_id, coin, - biz_type="ad_reward", ref_id=trans_id, remark="看广告奖励", + biz_type="ad_reward", ref_id=trans_id, remark="看视频奖励金币", ) rec = AdRewardRecord( trans_id=trans_id, user_id=user_id, coin=coin, status="granted", diff --git a/app/repositories/comparison_milestone.py b/app/repositories/comparison_milestone.py index 88f8152..4b43c05 100644 --- a/app/repositories/comparison_milestone.py +++ b/app/repositories/comparison_milestone.py @@ -103,14 +103,13 @@ def claim(db: Session, user_id: int, milestone: int) -> tuple[int, int]: if crud_compare.count_success(db, user_id) < milestone: raise MilestoneLockedError - coin = record_milestone_reward(milestone) + # ⚠️ 比价战绩里程碑暂不真发金币(产品定,后续整体删除该功能):仍记一条领取(去重/标记已领), + # 但不调 grant_coins、不写 coin_transaction,余额不变,返回发放 0 金币 + 当前余额。 db.add( ComparisonMilestoneClaim( - user_id=user_id, milestone=milestone, coin_awarded=coin + user_id=user_id, milestone=milestone, coin_awarded=0 ) ) - acc, _ = crud_wallet.grant_coins( - db, user_id, coin, biz_type="compare_milestone", ref_id=str(milestone) - ) + acc = crud_wallet.get_or_create_account(db, user_id, commit=False) db.commit() - return coin, acc.coin_balance + return 0, acc.coin_balance diff --git a/app/repositories/signin.py b/app/repositories/signin.py index 024f5dc..14bda73 100644 --- a/app/repositories/signin.py +++ b/app/repositories/signin.py @@ -119,7 +119,8 @@ def do_signin(db: Session, user_id: int) -> tuple[SigninRecord, int]: ) db.add(record) acc, _ = crud_wallet.grant_coins( - db, user_id, coin, biz_type="signin", ref_id=today.isoformat() + db, user_id, coin, biz_type="signin", ref_id=today.isoformat(), + remark=f"每日签到 第{cycle_day}天", ) db.commit() db.refresh(record) diff --git a/docs/api/compare-milestone-claim.md b/docs/api/compare-milestone-claim.md index 40472ad..97f2fd3 100644 --- a/docs/api/compare-milestone-claim.md +++ b/docs/api/compare-milestone-claim.md @@ -2,9 +2,10 @@ > 所属:比价记录组(前缀 `/api/v1/compare`) | 鉴权:Bearer | [← 返回 API 索引](./README.md) -领取某一档(第 `milestone` 次)的金币奖励,真实入账金币钱包。领取记录写 -`comparison_milestone_claim`((user_id, milestone) 唯一)+ `grant_coins` 同一事务原子提交, -**每档只能领一次**。进度口径见 [milestones 进度接口](./compare-milestones.md)。 +领取某一档(第 `milestone` 次)。⚠️ **当前不真发金币**(产品定,后续整体删除该功能):仍写 +`comparison_milestone_claim`((user_id, milestone) 唯一)标记该档已领、**每档只能领一次**,但不调 +`grant_coins`、不写 `coin_transaction`,余额不变,`coin_awarded` 恒为 0。进度口径见 +[milestones 进度接口](./compare-milestones.md)。 ## 入参 - 路径参数 `milestone`(int):档位序号,1..6(= `RECORD_MILESTONES` 长度)。 @@ -15,11 +16,11 @@ | 字段 | 类型 | 说明 | |---|---|---| | `milestone` | int | 本次领取的档位序号 | -| `coin_awarded` | int | 本次发放金币 | -| `coin_balance` | int | 领奖后金币余额 | +| `coin_awarded` | int | 本次发放金币(当前恒为 `0`,暂不真发) | +| `coin_balance` | int | 领奖后金币余额(当前不变) | ```json -{ "milestone": 1, "coin_awarded": 120, "coin_balance": 29087 } +{ "milestone": 1, "coin_awarded": 0, "coin_balance": 29087 } ``` ## 错误 @@ -29,5 +30,5 @@ - `409` 该档已领过(`milestone already claimed`) ## 说明 -- 领取金币后,客户端应刷新钱包余额([`GET /api/v1/wallet/account`](./wallet-account.md))与本档状态。 -- 幂等:重复领同一档返回 409 且**不会重复发金币**(唯一约束 + 领取前查重)。 +- 当前不发金币,客户端领取后只需把本档状态刷成 claimed 即可;若后续恢复发奖,再按 `coin_awarded` 刷新钱包余额([`GET /api/v1/wallet/account`](./wallet-account.md))。 +- 幂等:重复领同一档返回 409(唯一约束 + 领取前查重)。 diff --git a/tests/test_compare_milestone.py b/tests/test_compare_milestone.py index bf3f2c9..06165b4 100644 --- a/tests/test_compare_milestone.py +++ b/tests/test_compare_milestone.py @@ -82,8 +82,8 @@ def test_unlock_progresses_with_success(client) -> None: assert states[2] == "locked" -def test_claim_grants_coin_and_becomes_claimed(client) -> None: - """领第 1 档:发对应金币,进金币余额,该档变 claimed。""" +def test_claim_marks_claimed_without_coin(client) -> None: + """领第 1 档:暂不真发金币(产品定,后续删该功能),余额不变,但该档变 claimed。""" token = _login(client, "13800003003") _report_success(client, token, "s-1") @@ -93,8 +93,8 @@ def test_claim_grants_coin_and_becomes_claimed(client) -> None: assert r.status_code == 200, r.text res = r.json() assert res["milestone"] == 1 - assert res["coin_awarded"] == RECORD_MILESTONES[0] - assert res["coin_balance"] == bal_before + RECORD_MILESTONES[0] + assert res["coin_awarded"] == 0 # 不再发金币 + assert res["coin_balance"] == bal_before # 余额不变 d = client.get("/api/v1/compare/milestones", headers=_auth(token)).json() assert d["milestones"][0]["state"] == "claimed"