Commit Graph

5679 Commits

Author SHA1 Message Date
k88936 c9ad084f78 fix(后台权限): 补上 membership-plans Tab 授权
- ADMIN_TAB_PERMISSIONS 增加 membership-plans 并把数组长度改为 22,使非 owner 管理员可被授予会员档位页权限,修复该页接口对普通管理员恒 403。
- every_assignable_admin_tab_has_a_backend_route 增加断言:路由使用的每个 Tab 必须登记在 ADMIN_TAB_PERMISSIONS。
2026-10-03 17:36:43 +08:00
k88936 78a43b6a13 docs(会员目录): 说明档位校验不覆盖展示型权益
- validate_runtime_profile_membership_plan_row_against_catalog 文档注明 model_access 与 concurrent_job_limit 本期仅落字段供展示,不参与随 rank 的单调校验。
2026-10-03 17:33:50 +08:00
k88936 1d2574a43f fix(会员计价): 升级报价拒绝到期日早于刷新日的入参
- validate_runtime_profile_membership_upgrade_quote_input 增加 expires_at >= cycle_resets_at 校验,避免回显早于下次刷新日的到期时间。
- 补充到期时刻早于本期刷新时刻的回归断言,并更新函数文档说明。
2026-10-03 17:33:23 +08:00
k88936 1811b2206f fix(会员计价): 升级报价先做领域校验再做数值校验
- quote_runtime_profile_membership_upgrade 先跑账期变更 / 档位合法性校验,再跑期号与窗口数值校验,使年付转月付等高期号场景返回 CycleKindChangeUnsupported 而非 InvalidQuoteInput。
- 补充年付转月付的回归断言,覆盖目标账期 period 数小于当前期号的拒绝路径。
2026-10-03 17:32:00 +08:00
k88936 da0ef16df5 refactor(会员下单): 下单入参去掉未使用的 kind
- useAccountWallet.buyRechargeProduct 入参收窄为仅 productId,会员结算调用同步删除未被消费的 kind: 'membership'。
2026-10-03 17:31:20 +08:00
k88936 9af6625514 docs(充点弹窗): 说明默认预选第 3 档的原因
- 为点卡默认选中索引 2 的取值补上中文注释,说明其只影响默认选中项、不改变计费。
2026-10-03 17:31:00 +08:00
k88936 cec4b7ec5e fix(充点弹窗): 方向键切换页签与档位后移动焦点
- PlatformRechargeTabNav 与 PlatformPointProductGrid 在方向键 / Home / End 改变选中项后,用 ref 把焦点移到新按钮,保持 roving tabindex 焦点与选中一致。
2026-10-03 17:30:05 +08:00
k88936 803d5ccb0a refactor(充点弹窗): 升级报价状态改由具名函数返回
- 抽出 resolveMembershipQuoteErrorState,用提前返回替代嵌套三元,消除升级报价错误 / 加载 / 空三态的深层条件表达式。
2026-10-03 17:28:55 +08:00
k88936 2514759949 fix(充点弹窗): 升级报价按目标档位与账期双重匹配
- PlatformProfileRechargeModal 的 quoteForTarget 同时校验 targetPlan 与 cycleKind,账期不一致的陈旧报价按“暂无报价”处理,避免展示错误金额并解锁下单。
2026-10-03 17:28:17 +08:00
k88936 cf6004718e fix(后台订单): 会员变更摘要无账期时不再输出悬空分隔符
- AdminRechargeOrderPage 的会员变更摘要仅在存在账期时才追加 "/ 月付|年付",避免输出 “新购 Pro / ”。
2026-10-03 17:27:49 +08:00
k88936 af0721fb78 fix(会员): 回灌后收敛充点商品目录并清理退役会员商品行
- profile.rs 新增 converge_default_profile_recharge_product_config,在存量库读取路径补齐缺失的 points_1280 / points_3280 档位。

- 同一步骤删除已退役的 membership 类型充点商品配置行,避免冲突迁移把旧 member_* 行原样带回后残留。

- 存量库充值商品目录因此幂等收敛到当前六档点卡,不再停留在旧四档 + 四行会员商品。
2026-10-03 17:24:00 +08:00
k88936 21f69ef13b fix(迁移): 补齐会员重构的破坏性迁移导入兼容
- migration.rs 为旧迁移包回填 profile_membership 的 plan / cycle_index / cycle_count / cycle_kind 默认值。

- migration.rs 为旧迁移包回填 profile_recharge_order 的 14 个 membership_* 快照默认值,避免回灌导入因缺列失败。

- 新增两条单元测试守护会员表与订单快照的旧包默认值。

- 同步后端架构文档的 profile_membership / profile_recharge_product_config / profile_recharge_order 表目录。

- 记录 SpacetimeDB 2.8.3 持久表删列需显式迁移的实测结论与既有 run_conflict_migration_publish 路径。
2026-10-03 17:11:04 +08:00
k88936 1a106eadef 每日免费发放额为 0 时前端隐藏该池
- 后端:module-runtime 的 daily_free_points_per_day 校验由「必须大于 0」放宽为只校验上界,错误变体改名 DailyFreePointsPerDayOverflow
- 前端共享层:mudPoints 新增 shouldShowProfileDailyFreePool,判定 remaining > 0 || reset > 0,判定收口一处
- 钱包入口:PlatformMudPointWalletEntry 在每日免费发放额为 0 且无存量时隐藏该行
- 充值弹层:PlatformProfileRechargeModal 池概览按可见池渲染(三列变两列),扣点顺序提示与泥点确认页文案随可见性切换
- Admin Web:账号配置页每日免费泥点允许填 0(校验、min 与文案同步)
- 测试:删除「每日免费必然存在」断言,新增隐藏 / 有存量仍显示 / 发放额为正三类用例,并修正钱包入口测试在 HEAD 上失效的选择器
- 文档:更新会员与泥点前端改造设计文档 §14 与 shared-memory 决策记录
2026-10-03 16:48:12 +08:00
k88936 43f0c51120 后台用户详情改走只读会员快照
新增只读会员快照 procedure get_profile_membership_snapshot_and_return,不刷新钱包 / 账期、不写库
module-runtime 新增 RuntimeProfileMembershipGetInput 与 RuntimeProfileMembershipSnapshotProcedureResult 及入参构造器
spacetime-client 增加 get_profile_membership_snapshot facade、From 转换与结果映射,并同步生成绑定
build_profile_membership_snapshot 拆成写库与纯读两条路径,共用 from_row 投影
admin_get_user_detail 改用只读会员快照,打开详情不再改用户钱包与会员账期
2026-10-03 16:42:48 +08:00
k88936 6f0d773dde 会员档位目录种子改由模块初始化播种
新增 init 生命周期 reducer,数据库首次创建时把 profile_membership_plan 整表播种
membership_plan_row 与 membership_plan_records 去掉懒播种,只读路径不再写库
ensure_default_profile_recharge_product_config 不再顺带初始化会员目录
存量数据库此前已由懒播种写入目录行,新建数据库由 init reducer 播种
2026-10-03 16:27:04 +08:00
k88936 4c6af9f190 会员目录响应下发推荐档位与不设并发上限标志
ProfileMembershipPlanResponse 新增 recommended 与 unlimitedConcurrency 两个派生布尔
module-runtime 新增 PROFILE_MEMBERSHIP_RECOMMENDED_PLAN 常量并导出,作为推荐档位唯一真相源
api-server 目录响应按该常量与 is_unlimited_concurrency 派生标志
前端 ProfileMembershipPlanRecord 契约补上两个字段
membershipCopy 删除硬编码的 'plus' 与 128,并发文案改读 unlimitedConcurrency
充值弹窗推荐标签改读 plan.recommended
更新充值弹窗测试夹具
2026-10-03 16:18:14 +08:00
k88936 3031f58875 会员升级结算前校验订单冻结的变更前状态
结算补差升级单前比对 settlement.plan_before / cycle_kind_before 与当前会员行,不一致直接拒绝「会员状态已变化,请重新下单」
避免用户先付更高档位升级单后,旧升级单落地把档位 / 周期覆盖回去,出现降档或「年付 + 一个月到期」的矛盾行
api-server 把该业务拒绝映射为 400
2026-10-03 16:16:07 +08:00
k88936 3e2ab3cf78 会员充值下单不再接受客户端时间参数
RuntimeProfileRechargeOrderCreateInput 删除 created_at_micros 字段,procedure 入参不再携带时间
build_runtime_profile_recharge_order_create_input 同步去掉时间参数
spacetime-module 建单时刻改用 ctx.timestamp,避免客户端把时间设到会员到期前夕压低补差金额
spacetime-client facade 与 mapper、生成绑定同步去掉该字段
api-server 不再自算 current_unix_micros 传入
更新受影响的 module-runtime 单测调用
2026-10-03 16:15:36 +08:00
k88936 f9b0cf786d 会员升级补差订单到期后按新购价校验结算
新增 check_expired_membership_upgrade_settlement:补差订单在支付前会员已到期时,订单金额必须达到目标周期当前目录价才允许按新购结算,否则拒绝
新增 RuntimeProfileMembershipUpgradeRejection::MembershipExpiredBeforeSettlement 及错误码字符串
module-runtime 导出该判定函数供结算侧复用
spacetime-module 结算分支调用该判定,目录缺档位时返回明确错误
api-server 把「会员已到期,请按新购价格重新下单」映射为 400 业务错误
补充过期补差订单必须覆盖整期新购价的单元用例
2026-10-03 16:06:06 +08:00
k88936 4621f76a58 会员升级报价拒绝已刷新账期的过期窗口
修正 upgrade.rs 报价校验:now 必须落在 [cycle_started_at, cycle_resets_at) 内,越界按 InvalidQuoteInput 拒绝,避免旧 cycle_index 配零剩余比例多收一个完整月
同步模块头注释、校验函数文档与 InvalidQuoteInput 枚举说明
把「过期窗口只收完整月」的用例改为「过期窗口被拒绝」,保留剩余比例自身的 0 断言

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 15:32:33 +08:00
k88936 c165a032c9 fix(充点弹窗): 删除硬编码的充值汇率文案
删除「常规充值 ¥1 = 10 永久泥点」的写死文案,档位价格与点数完全由后台商品目录决定,避免目录改价后文案与实际不一致。

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 15:29:32 +08:00
k88936 873bd5bee9 fix(会员报价): 切换账号时清理报价状态
- usePlatformProfileCenterController.ts:账号生命周期重置时清空 membershipQuote / loading / error 并作废未完成报价令牌,避免上一个账号的报价串到新账号

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 15:00:08 +08:00
k88936 a0c48d85a5 fix(后台会员): 标题为空时禁用保存
- AdminMembershipPlanPage.tsx:标题去空格为空时禁用保存按钮,不必等确认弹窗后才收到 MissingProductTitle 报错

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 15:00:06 +08:00
k88936 071cc3284a fix(桌面壳校验): 补上会员报价命令到 allowlist
- apps/ai-game-creator-shell/scripts/check-config.mjs:allowedUncalledTauriCommands 增加 read_profile_membership_upgrade_quote,node scripts/check-config.mjs 恢复通过

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 14:59:42 +08:00
k88936 aca58b6b25 fix(后台接口): 会员升级与档位目录的业务拒绝改为 400
- runtime_profile.rs:新增 is_runtime_profile_membership_domain_error,会员升级报价(非会员 / 重复购买 / 月年互换 / 档位下架 / 非法报价入参)与会员档位目录校验失败统一映射为 400,基础设施错误仍保持 502

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 14:59:37 +08:00
k88936 c1b96f6bff refactor(会员下单): 收窄平台面板下单入参为 productId 与 kind
- usePlatformProfileCenterController.ts:buyRechargeProduct 只接受 productId 与 kind,会员下单不再传 priceCents 等无用字段

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 14:59:35 +08:00
k88936 44952704b6 refactor(会员下单): 收窄桌面端下单入参为 productId 与 kind
- useAccountWallet.ts:buyRechargeProduct 只接受 productId 与 kind,会员下单不再伪造价格等无用字段

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 14:59:32 +08:00
k88936 40c754ee0e fix(后台本地预览): 修正会员账期期号越界
- scripts/admin-web-fake-api.mjs:月付用户详情 cycleIndex 由 2 改为 1,避免出现「第 2/1 期」

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 14:59:30 +08:00
k88936 adfae5adee fix(会员计价): 零时长账期窗口按非法入参拒绝
- module-runtime/membership/upgrade.rs:账期窗口校验由 < 改为 <=,cycle_resets_at 等于 cycle_started_at 时不再退化成「剩余比例为 0」

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 14:59:26 +08:00
k88936 58e07ba282 fix(后台会员): 每期泥点改为提交前校验
- AdminMembershipPlanPage.tsx:非 normal 档位要求每期泥点大于 0,不再等后端返回笼统目录错误

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 14:59:24 +08:00
k88936 7dd26b9cda refactor(后台会员): 收窄会员状态的字面量联合
- adminApiTypes.ts:AdminProfileMembershipPayload.status 由 string 收窄为 'normal' | 'active'

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 14:59:22 +08:00
k88936 3a998e15bb fix(会员报价): 平台资料面板报价请求增加序号守卫
- usePlatformProfileCenterController.ts:requestMembershipQuote 增加 membershipQuoteRequestRef 令牌,过期响应不再覆盖新报价或提前结束 loading

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 14:58:30 +08:00
k88936 5361d89639 fix(会员报价): 桌面端报价请求增加序号守卫
- useAccountWallet.ts:requestMembershipQuote 记录请求令牌,只有最新请求可以写入报价、错误与 loading

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 14:58:28 +08:00
k88936 8cfa5a45a9 fix(后台本地预览): 补上会员档位 mock 接口
- scripts/admin-web-fake-api.mjs:新增 /admin/api/profile/membership-plans 的 GET 列表与 POST 回显,避免页面 response.entries 为 undefined

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 14:58:26 +08:00
k88936 73b53a9dd1 fix(会员计价): ceil_div 零分母改为 debug_assert 暴露
- module-runtime/membership/upgrade.rs:ceil_div 增加 debug_assert!(denominator != 0),零分母在测试里立即失败,不再被静默算成 0 元

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 14:58:21 +08:00
k88936 5f31c8c9df fix(会员充值): 套餐卡不再重复触发下单回调
- PlatformProfileRechargeModal/index.tsx:去掉套餐卡外层 div 的 onClick,点击 CTA 时不再因事件冒泡触发两次 openMembershipCheckout

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 14:58:18 +08:00
k88936 bfd96a7c25 fix(后台会员): 数值输入改用 Number 与 isSafeInteger 解析
- AdminMembershipPlanPage.tsx:parseInteger 改为 Number + Number.isSafeInteger,避免 "1e2" / "1.9" 被 parseInt 静默截断后保存错误价格

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 14:58:16 +08:00
k88936 cf6391962e refactor(会员充值): 并发文案复用统一的不设上限判定
- membershipCopy.ts:resolveMembershipConcurrencyLabel / resolveMembershipConcurrencyShortLabel 改为调用 isUnlimitedConcurrency,去掉重复的 128 判定

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 14:58:14 +08:00
k88936 cd0cbacf18 refactor(后台会员): 收窄订单变更类型的字面量联合
- adminApiTypes.ts:AdminMembershipOrderChangePayload.changeKind 去掉多余的 string 分支,非法取值改由编译期暴露

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 14:58:12 +08:00
k88936 14ddf09f30 Merge remote-tracking branch 'origin/master' into feat/pricing-plan
Project CI / AI game creator shell Rust crates (pull_request) Successful in 1m28s
Project CI / Backend tests (pull_request) Failing after 53s
Project CI / Native shell tests (pull_request) Failing after 1m33s
Project CI / Frontend tests (pull_request) Failing after 1m2s
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Successful in 5m43s
Project CI / AI game creator shell web tests (pull_request) Failing after 45s
Project CI / Repository checks (pull_request) Failing after 1m3s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Successful in 5m24s
2026-10-03 13:36:04 +08:00
k88936 90e520fdba refactor(会员): 升级报价改为只读,不再刷新账期与钱包
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Has been cancelled
Project CI / AI game creator shell Rust smoke (pull_request) Has been cancelled
Project CI / AI game creator shell Rust crates (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled
- profile.rs:build_profile_membership_upgrade_quote_record 不再调用 refresh_profile_wallet_expiring_points,改用只读投射 project_profile_membership_cycle_at 把账期推进到当前时刻
- profile.rs:报价接口不再写库 / 发账本,不会提前消耗用户的懒刷新,同时保持与建单、结算同口径

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 13:32:54 +08:00
k88936 4eb4c6ae17 docs(会员): 补充会员账期推进与升级报价的逻辑注释
- profile.rs:advance_profile_membership_cycle_to 补充「锚点恒定、期号可推导、落库仅作单调水位、时钟回拨不重放」说明
- profile.rs:refresh_profile_membership_cycle 补充未换期(含时钟回拨)直接返回的守卫注释
- profile.rs:membership_upgrade_quote_input 注明期号即账期水位、年付补差按剩余整月折算
- profile.rs:build_profile_membership_upgrade_quote_record 与 build_profile_membership_order_snapshot 补充账期口径说明
- upgrade.rs:注明年付补差剩余整月来自单调水位、不会因重复刷新漂移

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 13:31:25 +08:00
k88936 16f92f2110 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>
2026-10-03 13:14:04 +08:00
k88936 e5de57f7f8 feat(会员): 管理接口校验调用方身份、写入侧拦倒挂目录、会员订单冻结结算快照
- profile.rs:10 个配置管理 procedure(任务/钱包/充值商品/会员档位/升级报价)补 require_editor_generation_runtime_service_identity,只允许 api-server 服务身份调用
- catalog.rs:新增 validate_runtime_profile_membership_plan_row_against_catalog,写入侧校验 rank 与月价/年价/每期泥点严格递增并拒绝倒挂
- errors.rs:新增 RuntimeProfileFieldError::InvalidMembershipPlanOrder 及中文文案
- lib.rs:导出 validate_runtime_profile_membership_plan_row_against_catalog
- catalog.rs:新增 4 个单测覆盖种子目录、单调改价、倒挂价格/泥点与重复 rank
- profile.rs:会员订单建单时冻结档位/价格/补点快照到订单行,支付结算只认快照,历史 Pending 订单回退按目录重算
- profile.rs:新增 project_profile_membership_cycle_at 只读投射账期,建单金额不再写库刷新,与预览/结算口径一致
- profile.rs:支付结算不再因档位下架拒绝已受理订单,避免付款回调卡死
- profile.rs:新增 2 个单测覆盖订单快照写入读回与无快照回退

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 12:46:50 +08:00
k88936 484db6cb7b 补充会员与泥点前端改造技术设计文档
- 新增技术设计文档,记录拷问结论、现状核实、改动清单与验收判据
- docs/README.md 登记该技术设计

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 12:12:29 +08:00
k88936 6b4b248879 AGC 桌面壳接入会员升级报价与会员下单
- 新增 Tauri 命令 read_profile_membership_upgrade_quote 并注册到桌面端
- accountHost 新增会员升级报价调用
- useAccountWallet 与 AccountWallet 接通报价、会员下单与共享弹层新 props
- 补充 accountHost 报价调用测试

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 12:12:18 +08:00
k88936 f33d11b050 平台入口与图片编辑器接入会员购买与升级
- platformProfileClient 新增会员升级报价接口调用
- usePlatformProfileCenterController 增加报价状态与会员下单入口
- PlatformEntryActiveFlowShell 与 ImageCanvasEditorView 向共享弹层透传报价与会员下单回调
- 同步修正平台入口与图片编辑器顶栏受入口文案变化影响的测试断言

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 12:12:12 +08:00
k88936 9ba3aec026 新增会员与泥点共享弹层并改版钱包入口
- PlatformProfileRechargeModal 重写为「会员订阅 / 泥点充值」双 Tab,含三池概览、套餐卡、周期切换、会员状态、套餐对比表与确认订单页
- 新增 membershipCopy 收敛数量估算、推荐标签、模型权限与并发展示文案,价格与权益仍读后端目录
- 新增 membershipProduct 提供由档位与周期拼出的会员 productId,避免与组件混导出
- PlatformMudPointWalletEntry 入口改为「可用总额 + 行内月度/永久 + 会员与泥点」,使用详情与兑换码保留为次级入口
- 同步改写共享弹层测试,覆盖双 Tab、升级报价与确认页

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 12:12:05 +08:00
k88936 76fd96fa06 后台管理端呈现会员快照、用户会员状态与三池命名
- 新增 config/membershipDisplay.ts 收敛档位与账期展示并供三处复用
- 用户详情对话框新增会员区块,钱包月度池改名「月度泥点」
- 充值订单列表与退款弹窗渲染会员变更快照
- 通用表浏览器补 profile_membership_plan 标签
- 补齐管理端类型、用例与本地假数据

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 11:48:36 +08:00
k88936 7acae0d308 后台契约与接口透出会员变更快照与用户会员状态
- shared-contracts 新增 AdminMembershipOrderChangePayload 与 AdminProfileMembershipPayload
- AdminProfileWalletPayload.membership_limited_points 改名 monthly_points
- AdminRechargeOrderEntryPayload 增加 membership_change 快照字段
- AdminUserDetailResponse 增加 membership 字段
- admin_recharge 映射会员订单快照与用户会员中心投影

Co-authored-by: Junie <junie@jetbrains.com>
2026-10-03 11:48:24 +08:00