From 16f92f2110d4f0ada26bf39b381ab064ffa26595 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:14:04 +0800 Subject: [PATCH] =?UTF-8?q?refactor(=E4=BC=9A=E5=91=98):=20=E4=BC=9A?= =?UTF-8?q?=E5=91=98=E6=A1=A3=E4=BD=8D=E7=9B=AE=E5=BD=95=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E6=97=A0=E7=94=A8=E7=9A=84=20sort=5Forder=EF=BC=8C=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E6=8C=89=20rank=20=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - module-runtime catalog.rs:RuntimeProfileMembershipPlanRecord 与种子目录去掉 sort_order,目录单测改为按 rank 断言 - module-runtime domain.rs/commands.rs:后台改价入参与构建函数去掉 sort_order - spacetime-module profile.rs:profile_membership_plan 表结构去掉排序列,membership_plan_records 改按 rank 升序读取 - shared-contracts runtime.rs:ProfileMembershipPlanResponse 与 AdminUpsertProfileMembershipPlanRequest 移除 sortOrder - spacetime-client:客户端签名、mapper 与 module_bindings 同步移除 sortOrder - api-server runtime_profile.rs:响应构建与测试夹具去掉 sortOrder - admin-web:AdminMembershipPlanPage 移除「排序」输入,档位列表改为按 rank 排序,契约类型同步 - packages/shared:ProfileMembershipPlanRecord 去掉 sortOrder,充值弹层改为直接沿用后端的 rank 顺序 - docs:泥点三池与会员计费后端设计同步目录字段与后台能力说明 Co-authored-by: Junie --- apps/admin-web/src/api/adminApiTypes.ts | 2 -- .../src/pages/AdminMembershipPlanPage.tsx | 21 +++---------------- ...®¾计】泥点三池与会员计费后端设计-2026-10-02.md | 8 +++---- .../index.test.tsx | 3 --- .../PlatformProfileRechargeModal/index.tsx | 8 +++---- packages/shared/src/contracts/runtime.ts | 1 - .../crates/api-server/src/runtime_profile.rs | 4 ---- .../crates/module-runtime/src/commands.rs | 3 --- server-rs/crates/module-runtime/src/domain.rs | 3 +-- .../module-runtime/src/membership/catalog.rs | 17 ++++----------- .../crates/shared-contracts/src/runtime.rs | 4 ---- .../src/active/mapper/runtime_profile.rs | 2 -- .../spacetime-client/src/active/runtime.rs | 2 -- .../profile_membership_plan_type.rs | 3 --- ...membership_plan_admin_upsert_input_type.rs | 1 - ...ime_profile_membership_plan_record_type.rs | 1 - .../src/runtime/active/profile.rs | 12 +++-------- 17 files changed, 19 insertions(+), 76 deletions(-) diff --git a/apps/admin-web/src/api/adminApiTypes.ts b/apps/admin-web/src/api/adminApiTypes.ts index f79e3dec4..0477cc868 100644 --- a/apps/admin-web/src/api/adminApiTypes.ts +++ b/apps/admin-web/src/api/adminApiTypes.ts @@ -795,7 +795,6 @@ export interface ProfileMembershipPlanAdminResponse { modelAccess: ProfileMembershipModelAccess; /** 并发上限;`128` 表示不设上限。 */ concurrentJobLimit: number; - sortOrder: number; enabled: boolean; } @@ -813,7 +812,6 @@ export interface AdminUpsertProfileMembershipPlanRequest { modelAccess: ProfileMembershipModelAccess; concurrentJobLimit: number; enabled: boolean; - sortOrder: number; } export interface ProfileWalletConfigAdminResponse { diff --git a/apps/admin-web/src/pages/AdminMembershipPlanPage.tsx b/apps/admin-web/src/pages/AdminMembershipPlanPage.tsx index 1f05bda26..8503377bc 100644 --- a/apps/admin-web/src/pages/AdminMembershipPlanPage.tsx +++ b/apps/admin-web/src/pages/AdminMembershipPlanPage.tsx @@ -68,7 +68,6 @@ export function AdminMembershipPlanPage({ useState('basic'); const [concurrentJobLimit, setConcurrentJobLimit] = useState('1'); const [enabled, setEnabled] = useState(false); - const [sortOrder, setSortOrder] = useState('0'); const [rankLabel, setRankLabel] = useState('0'); const [isLoading, setIsLoading] = useState(false); const [isSaving, setIsSaving] = useState(false); @@ -143,7 +142,6 @@ export function AdminMembershipPlanPage({ modelAccess, concurrentJobLimit: normalizedConcurrentJobLimit, enabled, - sortOrder: parseInteger(sortOrder), }); onResultChange(response); upsertEntry(response); @@ -171,7 +169,6 @@ export function AdminMembershipPlanPage({ setModelAccess(entry.modelAccess); setConcurrentJobLimit(String(entry.concurrentJobLimit)); setEnabled(entry.enabled); - setSortOrder(String(entry.sortOrder)); setRankLabel(String(entry.rank)); } @@ -185,7 +182,6 @@ export function AdminMembershipPlanPage({ setModelAccess('basic'); setConcurrentJobLimit('1'); setEnabled(false); - setSortOrder('0'); setRankLabel(''); } @@ -316,13 +312,6 @@ export function AdminMembershipPlanPage({ ))} - - setSortOrder(event.target.value)} - /> - {!isPurchasable ? ( @@ -350,7 +339,8 @@ export function AdminMembershipPlanPage({ key: 'plan', label: '档位', sortable: true, - sortValue: (entry) => entry.sortOrder, + sortDescription: '按升级基准 rank', + sortValue: (entry) => entry.rank, }, { key: 'price', @@ -433,12 +423,7 @@ export function AdminMembershipPlanPage({ } function sortPlanEntries(entries: ProfileMembershipPlanAdminResponse[]) { - return [...entries].sort((left, right) => { - if (left.sortOrder !== right.sortOrder) { - return left.sortOrder - right.sortOrder; - } - return left.rank - right.rank; - }); + return [...entries].sort((left, right) => left.rank - right.rank); } function formatPlanLimits(entry: ProfileMembershipPlanAdminResponse) { diff --git a/docs/technical/【技术设计】泥点三池与会员计费后端设计-2026-10-02.md b/docs/technical/【技术设计】泥点三池与会员计费后端设计-2026-10-02.md index 0cff5c155..d837d45b2 100644 --- a/docs/technical/【技术设计】泥点三池与会员计费后端设计-2026-10-02.md +++ b/docs/technical/【技术设计】泥点三池与会员计费后端设计-2026-10-02.md @@ -79,7 +79,6 @@ pub struct ProfileMembershipPlan { pub(crate) period_points: u64, pub(crate) model_access: RuntimeProfileMembershipModelAccess, pub(crate) concurrent_job_limit: u32, - pub(crate) sort_order: i32, pub(crate) enabled: bool, pub(crate) created_by: String, pub(crate) created_at: Timestamp, @@ -251,7 +250,7 @@ pub struct RuntimeProfileMembershipUpgradeQuote { - `runtime_profile_membership_plan_catalog()`:后台 `profile_membership_plan` 表的种子真相源, 一行一档(`title` / `rank` / `month_price_cents` / `year_price_cents` / `period_points` / - `model_access` / `concurrent_job_limit` / `sort_order` / `enabled`)。 + `model_access` / `concurrent_job_limit` / `enabled`)。目录展示顺序与升级次序统一由 `rank` 决定。 - `resolve_runtime_profile_membership_plan_snapshot(plan, cycle_kind)`: 「档位 + 周期 → 可下单套餐」的唯一解析入口,`price_cents` 取所选周期的价格字段。 - `runtime_profile_membership_plan_rank(plan) -> Option` / `is_runtime_profile_membership_plan_purchasable(plan) -> bool`: @@ -401,8 +400,8 @@ flowchart TD - `mudPointBalance` 用 §5.1;`membership` 用 §5.2。 - 会员列表改为 `membershipPlans: RuntimeProfileMembershipPlanRecord[]`:一行一档,含 `plan` / - `title` / `rank` / 月价 / 年价 / 每期泥点 / 模型权限 / 并发上限 / 排序 / 可购买, - 由 `profile_membership_plan` 表按 `sort_order` 升序读出。 + `title` / `rank` / 月价 / 年价 / 每期泥点 / 模型权限 / 并发上限 / 可购买, + 由 `profile_membership_plan` 表按 `rank` 升序读出。 - 删除 `walletBalance`、`membershipProducts`、`benefits`(旧 Month/Season/Year 权益矩阵)。 - `pointProducts` 只剩泥点商品(会员商品行不再出现在商品配置表里)。 @@ -410,6 +409,7 @@ flowchart TD - 新增 `GET|POST /admin/api/profile/membership-plans`(按档位枚举 CRUD 价格与权益)。 - `rank` 不进请求:升级比较基准由代码内目录决定,后台不能改。 + - 目录不再有独立「排序」字段:展示顺序与升级次序统一由 `rank` 升序决定。 - `normal` 是不可购买的非会员占位档位,价格与额度由后端按 0 落库、`enabled` 强制 `false`。 - 非 `normal` 档位要求月价 / 年价 / 并发上限都大于 0,否则 4xx。 - 后台页:新增「会员档位」页(`AdminMembershipPlanPage`);「充值商品」页收敛为纯泥点商品 diff --git a/packages/shared/src/components/PlatformProfileRechargeModal/index.test.tsx b/packages/shared/src/components/PlatformProfileRechargeModal/index.test.tsx index 1e14639b5..3855a4fcd 100644 --- a/packages/shared/src/components/PlatformProfileRechargeModal/index.test.tsx +++ b/packages/shared/src/components/PlatformProfileRechargeModal/index.test.tsx @@ -96,7 +96,6 @@ const STARTER_PLAN = { periodPoints: 400, modelAccess: 'basic' as const, concurrentJobLimit: 1, - sortOrder: 10, enabled: true, }; @@ -110,7 +109,6 @@ const PLUS_PLAN = { periodPoints: 1_150, modelAccess: 'full' as const, concurrentJobLimit: 3, - sortOrder: 20, }; const MAX_PLAN = { @@ -123,7 +121,6 @@ const MAX_PLAN = { periodPoints: 8_650, modelAccess: 'full' as const, concurrentJobLimit: 128, - sortOrder: 40, }; vi.mock('qrcode', () => ({ diff --git a/packages/shared/src/components/PlatformProfileRechargeModal/index.tsx b/packages/shared/src/components/PlatformProfileRechargeModal/index.tsx index d337dbdf1..0e5b88509 100644 --- a/packages/shared/src/components/PlatformProfileRechargeModal/index.tsx +++ b/packages/shared/src/components/PlatformProfileRechargeModal/index.tsx @@ -1216,12 +1216,12 @@ export function PlatformProfileRechargeModal({ const currentBalance = resolveProfileMudPointDisplayTotal( center?.mudPointBalance, ); + // 后端目录已按 rank 升序返回,这里只过滤不可购买与占位档。 const membershipPlans = useMemo( () => - (center?.membershipPlans ?? []) - .filter((plan) => plan.enabled && plan.plan !== 'normal') - .slice() - .sort((left, right) => left.sortOrder - right.sortOrder), + (center?.membershipPlans ?? []).filter( + (plan) => plan.enabled && plan.plan !== 'normal', + ), [center?.membershipPlans], ); const pointProducts = useMemo( diff --git a/packages/shared/src/contracts/runtime.ts b/packages/shared/src/contracts/runtime.ts index e8a184688..4abb20f2b 100644 --- a/packages/shared/src/contracts/runtime.ts +++ b/packages/shared/src/contracts/runtime.ts @@ -163,7 +163,6 @@ export type ProfileMembershipPlanRecord = { modelAccess: ProfileMembershipModelAccess; /** 并发上限;`128` 表示不设上限。 */ concurrentJobLimit: number; - sortOrder: number; enabled: boolean; }; diff --git a/server-rs/crates/api-server/src/runtime_profile.rs b/server-rs/crates/api-server/src/runtime_profile.rs index 8083f5065..da0dd03d0 100644 --- a/server-rs/crates/api-server/src/runtime_profile.rs +++ b/server-rs/crates/api-server/src/runtime_profile.rs @@ -1224,7 +1224,6 @@ pub async fn admin_upsert_profile_membership_plan( model_access, payload.concurrent_job_limit, payload.enabled, - payload.sort_order.unwrap_or(10), updated_at_micros as i64, ) .await @@ -2062,7 +2061,6 @@ fn build_profile_membership_plan_response( period_points: record.period_points, model_access: record.model_access.as_str().to_string(), concurrent_job_limit: record.concurrent_job_limit, - sort_order: record.sort_order, enabled: record.enabled, } } @@ -3565,7 +3563,6 @@ mod tests { period_points: 400, model_access: RuntimeProfileMembershipModelAccess::Basic, concurrent_job_limit: 1, - sort_order: 1, enabled: true, }], @@ -3789,7 +3786,6 @@ mod tests { period_points: 400, model_access: RuntimeProfileMembershipModelAccess::Basic, concurrent_job_limit: 1, - sort_order: 1, enabled: true, }], diff --git a/server-rs/crates/module-runtime/src/commands.rs b/server-rs/crates/module-runtime/src/commands.rs index 22765aa15..8e6b39f53 100644 --- a/server-rs/crates/module-runtime/src/commands.rs +++ b/server-rs/crates/module-runtime/src/commands.rs @@ -458,7 +458,6 @@ pub fn build_runtime_profile_membership_plan_admin_upsert_input( model_access: RuntimeProfileMembershipModelAccess, concurrent_job_limit: u32, enabled: bool, - sort_order: i32, updated_at_micros: i64, ) -> Result { let admin_user_id = normalize_runtime_profile_user_id(admin_user_id)?; @@ -479,7 +478,6 @@ pub fn build_runtime_profile_membership_plan_admin_upsert_input( model_access: baseline.model_access, concurrent_job_limit: baseline.concurrent_job_limit, enabled: false, - sort_order, updated_at_micros, }); } @@ -502,7 +500,6 @@ pub fn build_runtime_profile_membership_plan_admin_upsert_input( model_access, concurrent_job_limit, enabled, - sort_order, updated_at_micros, }) } diff --git a/server-rs/crates/module-runtime/src/domain.rs b/server-rs/crates/module-runtime/src/domain.rs index d1919d53c..5583aedae 100644 --- a/server-rs/crates/module-runtime/src/domain.rs +++ b/server-rs/crates/module-runtime/src/domain.rs @@ -1816,7 +1816,7 @@ pub struct RuntimeProfileMembershipPlanAdminListInput { /// 后台会员档位改价 / 改权益入参。 /// /// `rank` 不在入参里:升级比较基准由代码内的档位目录决定,后台不能改。 -/// `title` 与 `sort_order` 仍可编辑,`normal` 档位的价格与额度会被忽略(它不可购买)。 +/// `title` 仍可编辑,`normal` 档位的价格与额度会被忽略(它不可购买)。 #[cfg_attr(feature = "spacetime-types", derive(SpacetimeType))] #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct RuntimeProfileMembershipPlanAdminUpsertInput { @@ -1829,7 +1829,6 @@ pub struct RuntimeProfileMembershipPlanAdminUpsertInput { pub model_access: RuntimeProfileMembershipModelAccess, pub concurrent_job_limit: u32, pub enabled: bool, - pub sort_order: i32, pub updated_at_micros: i64, } diff --git a/server-rs/crates/module-runtime/src/membership/catalog.rs b/server-rs/crates/module-runtime/src/membership/catalog.rs index b2229d840..f6c1962fd 100644 --- a/server-rs/crates/module-runtime/src/membership/catalog.rs +++ b/server-rs/crates/module-runtime/src/membership/catalog.rs @@ -1,7 +1,7 @@ //! 会员计划目录(纯数据 + 解析)。 //! -//! 目录一行一档:标题、排序 `rank`、月价、独立可配置年价、每期泥点、模型权限、并发上限、 -//! 排序与上下架。月付与年付共享同一 `period_points`(年付 = 12 次同额度发放),`cycle_count` +//! 目录一行一档:标题、`rank`、月价、独立可配置年价、每期泥点、模型权限、并发上限与 +//! 上下架。月付与年付共享同一 `period_points`(年付 = 12 次同额度发放),`cycle_count` //! 由周期类型推导,不落目录字段。 //! //! 本模块是后台 `profile_membership_plan` 表的种子真相源,也是升级比较 `rank` 的唯一来源; @@ -36,7 +36,6 @@ pub struct RuntimeProfileMembershipPlanRecord { pub period_points: u64, pub model_access: RuntimeProfileMembershipModelAccess, pub concurrent_job_limit: u32, - pub sort_order: i32, pub enabled: bool, } @@ -57,7 +56,7 @@ pub struct RuntimeProfileMembershipPlanSnapshot { pub enabled: bool, } -/// 会员目录种子(一行一档,按 `sort_order` 升序)。 +/// 会员目录种子(一行一档,按 `rank` 升序)。 /// /// 数值来自产品原型 `充值与会员.html`,`Max` 的并发上限用哨兵 /// [`MEMBERSHIP_UNLIMITED_CONCURRENCY`](crate::MEMBERSHIP_UNLIMITED_CONCURRENCY) 表示「不设上限」。 @@ -78,7 +77,6 @@ pub fn runtime_profile_membership_plan_catalog() -> Vec Vec Vec Vec Vec, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] @@ -1702,7 +1699,6 @@ mod tests { period_points: 1_150, model_access: "full".to_string(), concurrent_job_limit: 3, - sort_order: 2, enabled: true, }], latest_order: None, diff --git a/server-rs/crates/spacetime-client/src/active/mapper/runtime_profile.rs b/server-rs/crates/spacetime-client/src/active/mapper/runtime_profile.rs index bc7d939be..e1aa0a557 100644 --- a/server-rs/crates/spacetime-client/src/active/mapper/runtime_profile.rs +++ b/server-rs/crates/spacetime-client/src/active/mapper/runtime_profile.rs @@ -1440,7 +1440,6 @@ pub(crate) fn map_runtime_profile_membership_plan_record( period_points: record.period_points, model_access: map_runtime_profile_membership_model_access_back(record.model_access), concurrent_job_limit: record.concurrent_job_limit, - sort_order: record.sort_order, enabled: record.enabled, } } @@ -2081,7 +2080,6 @@ impl From model_access: map_runtime_profile_membership_model_access(input.model_access), concurrent_job_limit: input.concurrent_job_limit, enabled: input.enabled, - sort_order: input.sort_order, updated_at_micros: input.updated_at_micros, } } diff --git a/server-rs/crates/spacetime-client/src/active/runtime.rs b/server-rs/crates/spacetime-client/src/active/runtime.rs index 83895efd5..88e7bc888 100644 --- a/server-rs/crates/spacetime-client/src/active/runtime.rs +++ b/server-rs/crates/spacetime-client/src/active/runtime.rs @@ -1768,7 +1768,6 @@ impl SpacetimeClient { model_access: module_runtime::RuntimeProfileMembershipModelAccess, concurrent_job_limit: u32, enabled: bool, - sort_order: i32, updated_at_micros: i64, ) -> Result { let procedure_input = build_runtime_profile_membership_plan_admin_upsert_input( @@ -1781,7 +1780,6 @@ impl SpacetimeClient { model_access, concurrent_job_limit, enabled, - sort_order, updated_at_micros, ) .map_err(SpacetimeClientError::validation_failed)? diff --git a/server-rs/crates/spacetime-client/src/module_bindings/profile_membership_plan_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/profile_membership_plan_type.rs index 848ab50fc..91d11708a 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/profile_membership_plan_type.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/profile_membership_plan_type.rs @@ -18,7 +18,6 @@ pub struct ProfileMembershipPlan { pub period_points: u64, pub model_access: RuntimeProfileMembershipModelAccess, pub concurrent_job_limit: u32, - pub sort_order: i32, pub enabled: bool, pub created_by: String, pub created_at: __sdk::Timestamp, @@ -43,7 +42,6 @@ pub struct ProfileMembershipPlanCols { pub model_access: __sdk::__query_builder::Col, pub concurrent_job_limit: __sdk::__query_builder::Col, - pub sort_order: __sdk::__query_builder::Col, pub enabled: __sdk::__query_builder::Col, pub created_by: __sdk::__query_builder::Col, pub created_at: __sdk::__query_builder::Col, @@ -66,7 +64,6 @@ impl __sdk::__query_builder::HasCols for ProfileMembershipPlan { table_name, "concurrent_job_limit", ), - sort_order: __sdk::__query_builder::Col::new(table_name, "sort_order"), enabled: __sdk::__query_builder::Col::new(table_name, "enabled"), created_by: __sdk::__query_builder::Col::new(table_name, "created_by"), created_at: __sdk::__query_builder::Col::new(table_name, "created_at"), diff --git a/server-rs/crates/spacetime-client/src/module_bindings/runtime_profile_membership_plan_admin_upsert_input_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/runtime_profile_membership_plan_admin_upsert_input_type.rs index 9e38b8171..c916c8adf 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/runtime_profile_membership_plan_admin_upsert_input_type.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/runtime_profile_membership_plan_admin_upsert_input_type.rs @@ -19,7 +19,6 @@ pub struct RuntimeProfileMembershipPlanAdminUpsertInput { pub model_access: RuntimeProfileMembershipModelAccess, pub concurrent_job_limit: u32, pub enabled: bool, - pub sort_order: i32, pub updated_at_micros: i64, } diff --git a/server-rs/crates/spacetime-client/src/module_bindings/runtime_profile_membership_plan_record_type.rs b/server-rs/crates/spacetime-client/src/module_bindings/runtime_profile_membership_plan_record_type.rs index 73361a190..1d344391e 100644 --- a/server-rs/crates/spacetime-client/src/module_bindings/runtime_profile_membership_plan_record_type.rs +++ b/server-rs/crates/spacetime-client/src/module_bindings/runtime_profile_membership_plan_record_type.rs @@ -18,7 +18,6 @@ pub struct RuntimeProfileMembershipPlanRecord { pub period_points: u64, pub model_access: RuntimeProfileMembershipModelAccess, pub concurrent_job_limit: u32, - pub sort_order: i32, pub enabled: 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 4c7175af6..98e74a997 100644 --- a/server-rs/crates/spacetime-module/src/runtime/active/profile.rs +++ b/server-rs/crates/spacetime-module/src/runtime/active/profile.rs @@ -495,7 +495,6 @@ pub struct ProfileMembershipPlan { pub(crate) period_points: u64, pub(crate) model_access: RuntimeProfileMembershipModelAccess, pub(crate) concurrent_job_limit: u32, - pub(crate) sort_order: i32, pub(crate) enabled: bool, pub(crate) created_by: String, pub(crate) created_at: Timestamp, @@ -8237,7 +8236,6 @@ fn upsert_profile_membership_plan_record( input.model_access, input.concurrent_job_limit, input.enabled, - input.sort_order, input.updated_at_micros, ) .map_err(|error| error.to_string())?; @@ -8263,7 +8261,6 @@ fn upsert_profile_membership_plan_record( period_points: validated.period_points, model_access: validated.model_access, concurrent_job_limit: validated.concurrent_job_limit, - sort_order: validated.sort_order, enabled: validated.enabled, created_by: existing .as_ref() @@ -8799,7 +8796,6 @@ fn ensure_default_profile_membership_plan(ctx: &ReducerContext) { period_points: row.period_points, model_access: row.model_access, concurrent_job_limit: row.concurrent_job_limit, - sort_order: row.sort_order, enabled: row.enabled, created_by: PROFILE_RECHARGE_PRODUCT_SYSTEM_USER_ID.to_string(), created_at: now, @@ -9166,7 +9162,6 @@ fn membership_plan_record_from_row( period_points: row.period_points, model_access: row.model_access, concurrent_job_limit: row.concurrent_job_limit, - sort_order: row.sort_order, enabled: row.enabled, } } @@ -9184,13 +9179,13 @@ fn membership_plan_snapshot( }) } -/// 充值中心与后台共用的目录行读取,按 `sort_order` 升序。 +/// 充值中心与后台共用的目录行读取,按 `rank` 升序。 fn membership_plan_records(ctx: &ReducerContext) -> Vec { ensure_default_profile_membership_plan(ctx); let mut rows = ctx.db.profile_membership_plan().iter().collect::>(); rows.sort_by(|left, right| { - left.sort_order - .cmp(&right.sort_order) + left.rank + .cmp(&right.rank) .then_with(|| left.plan.as_str().cmp(right.plan.as_str())) }); rows.into_iter() @@ -9203,7 +9198,6 @@ fn membership_plan_records(ctx: &ReducerContext) -> Vec