fix: 周期性套餐等价计算使用整个有效期的总额度
之前只用了单次周期的 quota 计算等价,导致每日重置套餐(如 $1/天 × 30天) 只显示 $45 等价,实际应该是 $30 总额度 × 45倍 = $1359 等价 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
1 parent
b27fa4df53
commit
31e4bd22e4
43 files changed
+98
-38
No files matched your search
+13
-2
@@ -166,8 +166,19 @@ export default function Packages() {
|
||||
{enabled.map((pkg, i) => {
|
||||
const resetPeriod = pkg.quota_reset_period || 'never';
|
||||
const isSubscription = resetPeriod !== 'never';
|
||||
const quotaDollars = pkg.quota_amount > 0 ? pkg.quota_amount / Q : 0;
|
||||
const equivList = calcOfficialEquivList(enabledModels, quotaDollars);
|
||||
// For subscription packages, calculate TOTAL quota over the entire duration
|
||||
// e.g. daily reset + 30 day duration = 30x single-period quota
|
||||
const singleQuotaDollars = pkg.quota_amount > 0 ? pkg.quota_amount / Q : 0;
|
||||
let totalQuotaDollars = singleQuotaDollars;
|
||||
if (isSubscription && pkg.duration > 0 && singleQuotaDollars > 0) {
|
||||
let resetCount = 1;
|
||||
if (resetPeriod === 'daily') resetCount = pkg.duration;
|
||||
else if (resetPeriod === 'weekly') resetCount = Math.floor(pkg.duration / 7);
|
||||
else if (resetPeriod === 'monthly') resetCount = Math.floor(pkg.duration / 30);
|
||||
if (resetCount < 1) resetCount = 1;
|
||||
totalQuotaDollars = singleQuotaDollars * resetCount;
|
||||
}
|
||||
const equivList = calcOfficialEquivList(enabledModels, totalQuotaDollars);
|
||||
|
||||
return (
|
||||
<div
|
||||
|
||||
@@ -143,7 +143,14 @@ export default function ClaudeHome() {
|
||||
<div className="grid md:grid-cols-3 gap-4 max-w-4xl">
|
||||
{packages.filter(p => p.enabled).slice(0, 3).map((pkg, i) => {
|
||||
const quotaDollars = pkg.quota_amount > 0 ? pkg.quota_amount / Q : 0;
|
||||
const equiv = calcOfficialEquivList(enabledModels, quotaDollars);
|
||||
const rp = pkg.quota_reset_period || 'never';
|
||||
let tqd = quotaDollars;
|
||||
if (rp !== 'never' && pkg.duration > 0 && quotaDollars > 0) {
|
||||
let n = rp === 'daily' ? pkg.duration : rp === 'weekly' ? Math.floor(pkg.duration / 7) : rp === 'monthly' ? Math.floor(pkg.duration / 30) : 1;
|
||||
if (n < 1) n = 1;
|
||||
tqd = quotaDollars * n;
|
||||
}
|
||||
const equiv = calcOfficialEquivList(enabledModels, tqd);
|
||||
return (
|
||||
<div key={pkg.id} className={`rounded-xl p-6 flex flex-col border transition-all ${
|
||||
i === 1 ? 'border-[#D97757]/30 bg-[#D97757]/[0.04]' : 'border-[#E8DDD0] hover:border-[#D9C5B2]'
|
||||
|
||||
@@ -156,7 +156,14 @@ export default function CleanHome() {
|
||||
<div className="grid md:grid-cols-3 gap-4 max-w-4xl">
|
||||
{packages.filter(p => p.enabled).slice(0, 3).map((pkg, i) => {
|
||||
const quotaDollars = pkg.quota_amount > 0 ? pkg.quota_amount / Q : 0;
|
||||
const equiv = calcOfficialEquivList(enabledModels, quotaDollars);
|
||||
const rp = pkg.quota_reset_period || 'never';
|
||||
let tqd = quotaDollars;
|
||||
if (rp !== 'never' && pkg.duration > 0 && quotaDollars > 0) {
|
||||
let n = rp === 'daily' ? pkg.duration : rp === 'weekly' ? Math.floor(pkg.duration / 7) : rp === 'monthly' ? Math.floor(pkg.duration / 30) : 1;
|
||||
if (n < 1) n = 1;
|
||||
tqd = quotaDollars * n;
|
||||
}
|
||||
const equiv = calcOfficialEquivList(enabledModels, tqd);
|
||||
return (
|
||||
<div key={pkg.id} className={`rounded-xl p-6 flex flex-col border transition-all ${
|
||||
i === 1 ? 'border-blue-200 bg-blue-50/50 shadow-sm' : 'border-gray-100 hover:border-gray-200'
|
||||
|
||||
@@ -155,7 +155,14 @@ export default function CorporateHome() {
|
||||
<div className="grid md:grid-cols-3 gap-5 max-w-4xl">
|
||||
{packages.filter(p => p.enabled).slice(0, 3).map((pkg, i) => {
|
||||
const quotaDollars = pkg.quota_amount > 0 ? pkg.quota_amount / Q : 0;
|
||||
const equiv = calcOfficialEquivList(enabledModels, quotaDollars);
|
||||
const rp = pkg.quota_reset_period || 'never';
|
||||
let tqd = quotaDollars;
|
||||
if (rp !== 'never' && pkg.duration > 0 && quotaDollars > 0) {
|
||||
let n = rp === 'daily' ? pkg.duration : rp === 'weekly' ? Math.floor(pkg.duration / 7) : rp === 'monthly' ? Math.floor(pkg.duration / 30) : 1;
|
||||
if (n < 1) n = 1;
|
||||
tqd = quotaDollars * n;
|
||||
}
|
||||
const equiv = calcOfficialEquivList(enabledModels, tqd);
|
||||
return (
|
||||
<div key={pkg.id} className={`rounded-xl p-6 flex flex-col border transition-all ${
|
||||
i === 1 ? 'border-slate-900 shadow-sm' : 'border-slate-200 hover:border-slate-300'
|
||||
|
||||
@@ -146,7 +146,14 @@ export default function DarkHome() {
|
||||
<div className="grid md:grid-cols-3 gap-4 max-w-4xl">
|
||||
{packages.filter(p => p.enabled).slice(0, 3).map((pkg, i) => {
|
||||
const quotaDollars = pkg.quota_amount > 0 ? pkg.quota_amount / Q : 0;
|
||||
const equiv = calcOfficialEquivList(enabledModels, quotaDollars);
|
||||
const rp = pkg.quota_reset_period || 'never';
|
||||
let tqd = quotaDollars;
|
||||
if (rp !== 'never' && pkg.duration > 0 && quotaDollars > 0) {
|
||||
let n = rp === 'daily' ? pkg.duration : rp === 'weekly' ? Math.floor(pkg.duration / 7) : rp === 'monthly' ? Math.floor(pkg.duration / 30) : 1;
|
||||
if (n < 1) n = 1;
|
||||
tqd = quotaDollars * n;
|
||||
}
|
||||
const equiv = calcOfficialEquivList(enabledModels, tqd);
|
||||
return (
|
||||
<div key={pkg.id} className={`rounded-xl p-6 flex flex-col border transition-colors ${
|
||||
i === 1 ? 'border-emerald-500/25 bg-emerald-500/[0.04]' : 'border-neutral-800/60 hover:border-neutral-700'
|
||||
|
||||
@@ -155,7 +155,14 @@ export default function DefaultHome() {
|
||||
<div className="grid md:grid-cols-3 gap-4 max-w-4xl">
|
||||
{packages.filter(p => p.enabled).slice(0, 3).map((pkg, i) => {
|
||||
const quotaDollars = pkg.quota_amount > 0 ? pkg.quota_amount / Q : 0;
|
||||
const equiv = calcOfficialEquivList(enabledModels, quotaDollars);
|
||||
const rp = pkg.quota_reset_period || 'never';
|
||||
let tqd = quotaDollars;
|
||||
if (rp !== 'never' && pkg.duration > 0 && quotaDollars > 0) {
|
||||
let n = rp === 'daily' ? pkg.duration : rp === 'weekly' ? Math.floor(pkg.duration / 7) : rp === 'monthly' ? Math.floor(pkg.duration / 30) : 1;
|
||||
if (n < 1) n = 1;
|
||||
tqd = quotaDollars * n;
|
||||
}
|
||||
const equiv = calcOfficialEquivList(enabledModels, tqd);
|
||||
return (
|
||||
<div key={pkg.id} className={`rounded-2xl p-6 flex flex-col border transition-colors ${
|
||||
i === 1 ? 'bg-white/[0.04] border-white/[0.12]' : 'bg-white/[0.02] border-white/[0.06] hover:border-white/[0.1]'
|
||||
|
||||
@@ -141,7 +141,14 @@ export default function MinimalHome() {
|
||||
<div className="grid md:grid-cols-3 gap-4 max-w-4xl">
|
||||
{packages.filter(p => p.enabled).slice(0, 3).map((pkg) => {
|
||||
const quotaDollars = pkg.quota_amount > 0 ? pkg.quota_amount / Q : 0;
|
||||
const equiv = calcOfficialEquivList(enabledModels, quotaDollars);
|
||||
const rp = pkg.quota_reset_period || 'never';
|
||||
let tqd = quotaDollars;
|
||||
if (rp !== 'never' && pkg.duration > 0 && quotaDollars > 0) {
|
||||
let n = rp === 'daily' ? pkg.duration : rp === 'weekly' ? Math.floor(pkg.duration / 7) : rp === 'monthly' ? Math.floor(pkg.duration / 30) : 1;
|
||||
if (n < 1) n = 1;
|
||||
tqd = quotaDollars * n;
|
||||
}
|
||||
const equiv = calcOfficialEquivList(enabledModels, tqd);
|
||||
return (
|
||||
<div key={pkg.id} className="rounded-xl p-6 flex flex-col border border-neutral-800/60 hover:border-neutral-700 transition-colors">
|
||||
<h3 className="text-base font-semibold text-white">{pkg.name}</h3>
|
||||
|
||||
@@ -161,7 +161,14 @@ export default function StarterHome() {
|
||||
<div className="grid md:grid-cols-3 gap-4 max-w-4xl">
|
||||
{packages.filter(p => p.enabled).slice(0, 3).map((pkg, i) => {
|
||||
const quotaDollars = pkg.quota_amount > 0 ? pkg.quota_amount / Q : 0;
|
||||
const equiv = calcOfficialEquivList(enabledModels, quotaDollars);
|
||||
const rp = pkg.quota_reset_period || 'never';
|
||||
let tqd = quotaDollars;
|
||||
if (rp !== 'never' && pkg.duration > 0 && quotaDollars > 0) {
|
||||
let n = rp === 'daily' ? pkg.duration : rp === 'weekly' ? Math.floor(pkg.duration / 7) : rp === 'monthly' ? Math.floor(pkg.duration / 30) : 1;
|
||||
if (n < 1) n = 1;
|
||||
tqd = quotaDollars * n;
|
||||
}
|
||||
const equiv = calcOfficialEquivList(enabledModels, tqd);
|
||||
return (
|
||||
<div key={pkg.id} className={`rounded-xl p-6 flex flex-col border transition-colors ${
|
||||
i === 1 ? 'border-brand-500/30 bg-brand-500/[0.04]' : 'border-neutral-800/60 hover:border-neutral-700'
|
||||
|
||||
Reference in new issue
Block a user