From 90e520fdba4b23fcdc5efebbbfcb3149badf58e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Sat, 3 Oct 2026 13:32:54 +0800 Subject: [PATCH] =?UTF-8?q?refactor(=E4=BC=9A=E5=91=98):=20=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E6=8A=A5=E4=BB=B7=E6=94=B9=E4=B8=BA=E5=8F=AA=E8=AF=BB?= =?UTF-8?q?=EF=BC=8C=E4=B8=8D=E5=86=8D=E5=88=B7=E6=96=B0=E8=B4=A6=E6=9C=9F?= =?UTF-8?q?=E4=B8=8E=E9=92=B1=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - profile.rs:build_profile_membership_upgrade_quote_record 不再调用 refresh_profile_wallet_expiring_points,改用只读投射 project_profile_membership_cycle_at 把账期推进到当前时刻 - profile.rs:报价接口不再写库 / 发账本,不会提前消耗用户的懒刷新,同时保持与建单、结算同口径 Co-authored-by: Junie --- .../spacetime-module/src/runtime/active/profile.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/server-rs/crates/spacetime-module/src/runtime/active/profile.rs b/server-rs/crates/spacetime-module/src/runtime/active/profile.rs index f36cad305..a4891d3d3 100644 --- a/server-rs/crates/spacetime-module/src/runtime/active/profile.rs +++ b/server-rs/crates/spacetime-module/src/runtime/active/profile.rs @@ -8168,9 +8168,9 @@ fn list_profile_membership_plan_records( /// 补差升级报价。非会员、降档、月年互换、当前套餐重复购买都返回可读错误,不做静默兜底。 /// -/// 注意:本函数会先刷新该用户的会员 / 钱包账期(写库),因此「预览报价」并非纯只读操作。 -/// 这是有意保留的现状——保证预览、建单、结算三处读到同一口径的账期;副作用仅限与刷新一致, -/// 不额外引入其它写入。 +/// 全程只读:不刷新账期 / 钱包(不写库、不发账本),改用 [`project_profile_membership_cycle_at`] +/// 在内存里把会员行投射到当前时刻再报价,因此与建单、结算读到的账期口径一致, +/// 也不会让「预览报价」提前消耗用户的懒刷新。 fn build_profile_membership_upgrade_quote_record( ctx: &ReducerContext, input: RuntimeProfileMembershipUpgradeQuoteGetInput, @@ -8178,8 +8178,6 @@ fn build_profile_membership_upgrade_quote_record( let validated = build_runtime_profile_membership_upgrade_quote_input(input.user_id, input.target_plan) .map_err(|error| error.to_string())?; - // 有意保留的写操作:先把账期推进到当前时刻再报价;改成只读投影需先确认契约与前端预期。 - refresh_profile_wallet_expiring_points(ctx, &validated.user_id, ctx.timestamp); let Some(row) = ctx .db @@ -8190,6 +8188,8 @@ fn build_profile_membership_upgrade_quote_record( else { return Err("当前不是会员,请直接选择套餐购买".to_string()); }; + // 只读投射账期到当前时刻:不落库、不发账本,避免预览就改会员 / 钱包状态。 + let row = project_profile_membership_cycle_at(ctx, row, ctx.timestamp); if row.plan == validated.target_plan { return Err("当前套餐已生效,无需重复购买".to_string()); }