diff --git a/server-rs/crates/api-server/src/runtime_profile.rs b/server-rs/crates/api-server/src/runtime_profile.rs index 9d585f6c5..672c5da4f 100644 --- a/server-rs/crates/api-server/src/runtime_profile.rs +++ b/server-rs/crates/api-server/src/runtime_profile.rs @@ -1516,6 +1516,7 @@ fn is_runtime_profile_membership_domain_error(message: &str) -> bool { | "当前套餐已生效,无需重复购买" | "当前会员有效期内不支持月付 / 年付转换,到期后可重新选择" | "会员已到期,请按新购价格重新下单" + | "会员状态已变化,请重新下单" ) } 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 17811db29..737d1ff0c 100644 --- a/server-rs/crates/spacetime-module/src/runtime/active/profile.rs +++ b/server-rs/crates/spacetime-module/src/runtime/active/profile.rs @@ -9867,6 +9867,14 @@ fn apply_profile_membership_purchase( if settlement.change_kind == RuntimeProfileMembershipChangeKind::Upgrade { if let Some(row) = active_row { + // 中文注释:结算前比对订单冻结的变更前状态。若用户已先付了更高档位的升级单、 + // 或到期后按不同周期重新购买,旧升级单直接落库会把档位 / 周期覆盖回去, + // 只剩原到期日,产生降档或「年付 + 一个月到期」的矛盾行,因此拒绝并要求重新下单。 + if settlement.plan_before != Some(row.plan) + || settlement.cycle_kind_before != Some(row.cycle_kind) + { + return Err("会员状态已变化,请重新下单".to_string()); + } return apply_profile_membership_upgrade( ctx, user_id,