From 5f2007bf905eaadbd8e25987b4204975673ebe94 Mon Sep 17 00:00:00 2001 From: John Ye Date: Wed, 10 Dec 2025 20:44:08 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20Packy=20=E7=94=A8?= =?UTF-8?q?=E9=87=8F=E6=98=BE=E7=A4=BA=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题: - Packy API 返回的积分单位被错误地当作 cents 处理(÷100) - 导致显示的金额比实际高约 5000 倍(如显示 $2395 实际是 $0.48) - remaining 计算错误:total_available 已经是剩余额度,不应再减 total_used 修复: - 使用正确的转换因子:500000 积分 = 1 美元 - 修正 remaining_tokens 直接使用 total_available - 统一转换为 cents 单位,与 88code 显示层兼容 修复后效果: - 修复前:packy $2395.75/$5000 剩$208.50 - 修复后:packy $0.48/$1 ▓▓▓▓▓░░░░░ 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- src/api/mod.rs | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/api/mod.rs b/src/api/mod.rs index 8d81d44..7b81cd7 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -190,17 +190,37 @@ impl Code88UsageData { impl PackyUsageData { pub fn calculate(&mut self) { - self.used_tokens = self.total_used; - self.remaining_tokens = self.total_available.saturating_sub(self.total_used); - + // Packy API 返回的字段含义: + // - total_granted: 套餐总额度(积分) + // - total_used: 已使用额度(积分) + // - total_available: 剩余可用额度(积分)= total_granted - total_used + // + // 单位转换:Packy 使用 500000 积分 = 1 美元(从用户实际数据推算) + // 用户实际:$0.52 余额 + $0.48 已用 = $1.00 总额 + // API 返回:260425 + 239575 = 500000 + // 所以:500000 积分 = $1.00,转换因子 = 500000 + + const PACKY_CONVERSION_FACTOR: f64 = 500000.0; // 500000 积分 = 1 美元 + + // 计算美元金额 + let used_dollars = self.total_used as f64 / PACKY_CONVERSION_FACTOR; + let remaining_dollars = self.total_available as f64 / PACKY_CONVERSION_FACTOR; + let total_dollars = self.total_granted as f64 / PACKY_CONVERSION_FACTOR; + + // 转换为 cents(与 88code 统一,因为显示层会除以 100) + self.used_tokens = (used_dollars * 100.0) as u64; + self.remaining_tokens = (remaining_dollars * 100.0) as u64; + + // 百分比基于 total_granted(套餐总额度)计算 self.percentage_used = if self.total_granted > 0 { (self.total_used as f64 / self.total_granted as f64 * 100.0).clamp(0.0, 100.0) } else { 0.0 }; - self.credit_limit = (self.total_granted as f64) / 100.0; - self.current_credits = (self.remaining_tokens as f64) / 100.0; + // 设置美元金额(用于 get_credit_limit 等方法) + self.credit_limit = total_dollars; + self.current_credits = remaining_dollars; } pub fn is_exhausted(&self) -> bool {