From d04ce093841ca1a1b16ffb02bb8bb38dbcf7e4a8 Mon Sep 17 00:00:00 2001 From: yml2213 Date: Sat, 8 Aug 2026 00:57:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B1=95=E7=A4=BA=E7=82=B9=E5=88=B8/10=20?= =?UTF-8?q?=E6=AD=A3=E5=B8=B8=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_douyu_xpd_exchange.py | 30 +++++++++++++++++++++++ web/frontend/src/pages/DouyuTasksPage.tsx | 16 +++++++++--- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/tests/test_douyu_xpd_exchange.py b/tests/test_douyu_xpd_exchange.py index 55323ba..6a8cbdd 100644 --- a/tests/test_douyu_xpd_exchange.py +++ b/tests/test_douyu_xpd_exchange.py @@ -107,5 +107,35 @@ class XpdExchangeTests(unittest.TestCase): self.assertEqual((second_params['page_begin'], second_params['page_num']), ('10', '2')) + def test_exchange_keeps_raw_price_from_goods_list(self): + self.client._request = Mock(side_effect=[ + SimpleNamespace( + text='var recommend={"errcode":0,"data":{"client_data":{"itemsdetail":[{' + '"iGoodsId":"goods-1","sGoodsName":"测试商品","iPrice":"6800",' + '"iJb2Price":"0","iGoodsLeft":"-1"}]}}};', + ), + SimpleNamespace(text='var buyInfo={"ret":"0","msg":"ok","serial":"order-1","newBalance":88};'), + ]) + + goods = self.client.xpd_list_goods( + embed_query={}, act_id='46195', openid='openid', roleid='roleid', + )['goods'] + result = self.client.xpd_exchange_goods( + embed_query={'code': 'fresh-code'}, + act_id='46195', + rid='9263298', + commodity_id=goods[0]['commodity_id'], + price=goods[0]['price'], + picture='', + pay_type=1, + action_id='46195', + ) + + self.assertEqual(goods[0]['price'], 6800) + self.assertEqual(result['serial'], 'order-1') + params = self.client._request.call_args.kwargs['params'] + self.assertEqual(json.loads(params['appext'])['user_price'], 6800) + + if __name__ == '__main__': unittest.main() diff --git a/web/frontend/src/pages/DouyuTasksPage.tsx b/web/frontend/src/pages/DouyuTasksPage.tsx index de4ee5d..e5d7a5d 100644 --- a/web/frontend/src/pages/DouyuTasksPage.tsx +++ b/web/frontend/src/pages/DouyuTasksPage.tsx @@ -231,10 +231,21 @@ function goodsLabel(item: DouyuGoodsItem): string { return `${item.name || item.commodity_id}${item.score ? ` / ${item.score}积分` : ''}${stockText}`; } +// 道聚城 iPrice 为 10 倍点券单位(如 6800=680 点券),仅展示层换算,兑换请求仍传原值。 +const XPD_POINT_PRICE_SCALE = 10; + +function xpdPointPrice(item: DouyuGoodsItem): number { + const xpd = item as DouyuGoodsItem & { price?: number | null }; + const raw = item.raw?.raw as Record | undefined; + const rawPrice = Number(xpd.price ?? raw?.iPrice); + if (!Number.isFinite(rawPrice) || rawPrice <= 0) return 0; + return Math.round(rawPrice / XPD_POINT_PRICE_SCALE); +} + function xpdGoodsLabel(item: DouyuGoodsItem): string { const xpd = item as DouyuGoodsItem & { price?: number | null; goods_left?: number | null }; const raw = item.raw?.raw as Record | undefined; - const pointPrice = Number(xpd.price ?? raw?.iPrice); + const pointPrice = xpdPointPrice(item); const fragmentPrice = Number(raw?.iJb2Price); const prices = [ Number.isFinite(pointPrice) && pointPrice > 0 ? `${pointPrice}点券` : '', @@ -249,9 +260,8 @@ function xpdGoodsLabel(item: DouyuGoodsItem): string { function xpdGoodsPaymentOptions(item: DouyuGoodsItem | undefined): Array<{ value: '1' | '5'; label: string }> { if (!item) return []; - const xpd = item as DouyuGoodsItem & { price?: number | null }; const raw = item.raw?.raw as Record | undefined; - const pointPrice = Number(xpd.price ?? raw?.iPrice); + const pointPrice = xpdPointPrice(item); const fragmentPrice = Number(raw?.iJb2Price); return [ Number.isFinite(pointPrice) && pointPrice > 0