refactor(会员): 会员档位目录移除无用的 sort_order,统一按 rank 排序
- 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 <junie@jetbrains.com>
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -68,7 +68,6 @@ export function AdminMembershipPlanPage({
|
||||
useState<ProfileMembershipModelAccess>('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({
|
||||
))}
|
||||
</select>
|
||||
</AdminField>
|
||||
<AdminField label="排序">
|
||||
<input
|
||||
inputMode="numeric"
|
||||
value={sortOrder}
|
||||
onChange={(event) => setSortOrder(event.target.value)}
|
||||
/>
|
||||
</AdminField>
|
||||
</AdminFormRow>
|
||||
|
||||
{!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) {
|
||||
|
||||
@@ -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<u8>` / `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`);「充值商品」页收敛为纯泥点商品
|
||||
|
||||
@@ -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', () => ({
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -163,7 +163,6 @@ export type ProfileMembershipPlanRecord = {
|
||||
modelAccess: ProfileMembershipModelAccess;
|
||||
/** 并发上限;`128` 表示不设上限。 */
|
||||
concurrentJobLimit: number;
|
||||
sortOrder: number;
|
||||
enabled: boolean;
|
||||
};
|
||||
|
||||
|
||||
@@ -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,
|
||||
}],
|
||||
|
||||
|
||||
@@ -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<RuntimeProfileMembershipPlanAdminUpsertInput, RuntimeProfileFieldError> {
|
||||
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,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
|
||||
@@ -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<RuntimeProfileMembership
|
||||
period_points: 0,
|
||||
model_access: Basic,
|
||||
concurrent_job_limit: 1,
|
||||
sort_order: 0,
|
||||
enabled: false,
|
||||
},
|
||||
RuntimeProfileMembershipPlanRecord {
|
||||
@@ -90,7 +88,6 @@ pub fn runtime_profile_membership_plan_catalog() -> Vec<RuntimeProfileMembership
|
||||
period_points: 400,
|
||||
model_access: Basic,
|
||||
concurrent_job_limit: 1,
|
||||
sort_order: 10,
|
||||
enabled: true,
|
||||
},
|
||||
RuntimeProfileMembershipPlanRecord {
|
||||
@@ -102,7 +99,6 @@ pub fn runtime_profile_membership_plan_catalog() -> Vec<RuntimeProfileMembership
|
||||
period_points: 1_150,
|
||||
model_access: Full,
|
||||
concurrent_job_limit: 3,
|
||||
sort_order: 20,
|
||||
enabled: true,
|
||||
},
|
||||
RuntimeProfileMembershipPlanRecord {
|
||||
@@ -114,7 +110,6 @@ pub fn runtime_profile_membership_plan_catalog() -> Vec<RuntimeProfileMembership
|
||||
period_points: 3_650,
|
||||
model_access: Full,
|
||||
concurrent_job_limit: 5,
|
||||
sort_order: 30,
|
||||
enabled: true,
|
||||
},
|
||||
RuntimeProfileMembershipPlanRecord {
|
||||
@@ -126,7 +121,6 @@ pub fn runtime_profile_membership_plan_catalog() -> Vec<RuntimeProfileMembership
|
||||
period_points: 8_650,
|
||||
model_access: Full,
|
||||
concurrent_job_limit: crate::MEMBERSHIP_UNLIMITED_CONCURRENCY,
|
||||
sort_order: 40,
|
||||
enabled: true,
|
||||
},
|
||||
]
|
||||
@@ -279,12 +273,9 @@ mod tests {
|
||||
]
|
||||
);
|
||||
|
||||
let mut sorted = catalog.clone();
|
||||
sorted.sort_by_key(|row| row.sort_order);
|
||||
assert_eq!(catalog, sorted, "目录必须按 sort_order 升序");
|
||||
assert!(
|
||||
catalog.windows(2).all(|pair| pair[0].rank < pair[1].rank),
|
||||
"rank 必须严格递增"
|
||||
"目录必须按 rank 升序,且 rank 严格递增"
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -274,7 +274,6 @@ pub struct ProfileMembershipPlanResponse {
|
||||
pub model_access: String,
|
||||
/// 并发上限;`128` 表示不设上限。
|
||||
pub concurrent_job_limit: u32,
|
||||
pub sort_order: i32,
|
||||
pub enabled: bool,
|
||||
}
|
||||
|
||||
@@ -730,8 +729,6 @@ pub struct AdminUpsertProfileMembershipPlanRequest {
|
||||
pub concurrent_job_limit: u32,
|
||||
#[serde(default = "default_true")]
|
||||
pub enabled: bool,
|
||||
#[serde(default)]
|
||||
pub sort_order: Option<i32>,
|
||||
}
|
||||
|
||||
#[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,
|
||||
|
||||
@@ -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<module_runtime::RuntimeProfileMembershipPlanAdminUpsertInput>
|
||||
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,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<module_runtime::RuntimeProfileMembershipPlanRecord, SpacetimeClientError> {
|
||||
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)?
|
||||
|
||||
@@ -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<ProfileMembershipPlan, RuntimeProfileMembershipModelAccess>,
|
||||
pub concurrent_job_limit: __sdk::__query_builder::Col<ProfileMembershipPlan, u32>,
|
||||
pub sort_order: __sdk::__query_builder::Col<ProfileMembershipPlan, i32>,
|
||||
pub enabled: __sdk::__query_builder::Col<ProfileMembershipPlan, bool>,
|
||||
pub created_by: __sdk::__query_builder::Col<ProfileMembershipPlan, String>,
|
||||
pub created_at: __sdk::__query_builder::Col<ProfileMembershipPlan, __sdk::Timestamp>,
|
||||
@@ -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"),
|
||||
|
||||
-1
@@ -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,
|
||||
}
|
||||
|
||||
|
||||
-1
@@ -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,
|
||||
}
|
||||
|
||||
|
||||
@@ -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<RuntimeProfileMembershipPlanRecord> {
|
||||
ensure_default_profile_membership_plan(ctx);
|
||||
let mut rows = ctx.db.profile_membership_plan().iter().collect::<Vec<_>>();
|
||||
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<RuntimeProfileMembership
|
||||
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,
|
||||
})
|
||||
.collect()
|
||||
|
||||
Reference in New Issue
Block a user