membership-flow.md 17 KB

用户使用流程图 — 会员与订阅

端口说明: 📱 小程序 | 🖥 管理后台 | 📋 规划师端 | ⚙️ 系统自动

分层说明: 🏠 页面 → 🔗 API → ⚙️ Service → 📦 数据实体

flowchart TD
    %% ============ 颜色定义 ============
    classDef page fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
    classDef api fill:#fff3e0,stroke:#f57c00,stroke-width:1px
    classDef service fill:#e8f5e9,stroke:#388e3c,stroke-width:1px
    classDef data fill:#f3e5f5,stroke:#7b1fa2,stroke-width:1px
    classDef external fill:#fce4ec,stroke:#d32f2f,stroke-width:1px,stroke-dasharray:3 2
    classDef actor fill:#e1f5fe,stroke:#0288d1,stroke-width:2px,stroke-dasharray:5 3

    %% ============ 角色 ============
    ROLE_PARENT(("👤 家长")):::actor
    ROLE_PAY(("💳 微信支付")):::external
    ROLE_SYS(("⚙️ 定时任务")):::actor

    %% ================================================================
    %% 阶段一:会员信息查看
    %% ================================================================
    subgraph 阶段一[阶段一:会员信息查看]
        direction TB

        P1["🏠 小程序:会员中心页"]:::page
        P1 -->|"查看等级列表"| A1["🔗 POST /api/membership/levels"]:::api
        A1 -->|"无参数"| S1["⚙️ MembershipService.getAllLevels()"]:::service
        S1 -->|"查询所有等级配置"| D_LEVELS["📦 membership_levels 表"]:::data

        P1 -->|"查看我的会员"| A2["🔗 POST /api/membership/my"]:::api
        A2 -->|"userId(从token提取)"| S2["⚙️ 组装会员信息"]:::service
        S2 -->|"用户等级, 过期时间"| D_USER["📦 users 表(memberLevel, memberExpireTime)"]:::data
        S2 -->|"家庭会员记录"| D_FAM["📦 family_memberships 表"]:::data

        P1 -->|"查看当前等级"| A3["🔗 POST /api/membership/level"]:::api
        A3 -->|"userId"| S3["⚙️ MembershipService.getMemberLevel()"]:::service
        S3 -->|"FREE/FAMILY/PREMIUM + 过期校验"| D_USER

        P1 -->|"查看等级详情"| A4["🔗 POST /api/membership/current"]:::api
        A4 -->|"familyId"| S4["⚙️ MembershipService.getCurrentLevel()"]:::service
        S4 -->|"查询家庭当前有效等级"| D_LEVELS
        S4 -->|"无会员则返回免费版"| D_LEVELS

        P1 -->|"查看升级记录"| A5["🔗 POST /api/membership/records"]:::api
        A5 -->|"userId, page, size"| S5["⚙️ MemberUpgradeRecordMapper 分页查询"]:::service
        S5 -->|"用户升级记录"| D_REC["📦 member_upgrade_records 表"]:::data

        P1 -->|"查看价格方案"| A6["🔗 POST /api/membership/plans"]:::api
        A6 -->|"无参数"| S6["⚙️ 组装定价方案"]:::service
        S6 -->|"等级配置 + sys_config定价"| D_LEVELS
        S6 -->|"FAMILY/PREMIUM价格"| D_CFG["📦 sys_config 表"]:::data
    end

    %% ================================================================
    %% 阶段二:会员购买与升级
    %% ================================================================
    subgraph 阶段二[阶段二:会员购买与升级]
        D_LEVELS -->|"等级+价格"| P2["🏠 会员升级选择页"]:::page
        P2 -->|"选择套餐"| P2a{"选择付费方式"}:::page

        P2a -->|"创建升级订单"| A7["🔗 POST /api/membership/upgrade"]:::api
        A7 -->|"userId, familyId, levelCode, paymentType, period, couponId"| S7["⚙️ MembershipService.createOrder()"]:::service
        S7 -->|"从sys_config读取定价"| D_CFG
        S7 -->|"应用优惠券折扣"| S7a["⚙️ CouponService.apply()"]:::service
        S7a -->|"优惠后金额"| D_COUPON["📦 user_coupons 表"]:::data
        S7 -->|"写入订单, 状态=pending"| D_ORD["📦 payment_orders 表"]:::data

        A7 -->|"orderNo, amount, status"| P2b["🏠 确认订单页"]:::page
        P2b -->|"调起微信支付"| PAY["💳 微信支付"]:::external
        PAY -->|"支付结果通知"| A8["🔗 POST /api/membership/notify"]:::api
        A8 -->|"orderNo, transactionId, payMethod"| S8["⚙️ MembershipService.processPaymentCallback()"]:::service
        S8 -->|"更新订单状态=paid"| D_ORD

        S8 -->|"插入家庭会员记录"| D_FAM
        S8 -->|"升级用户等级, 设置过期时间"| D_USER
        S8 -->|"创建升级记录"| D_REC
        S8 -->|"结算两级佣金"| S8a["⚙️ CommissionService.settleTwoLevel()"]:::service
        S8a -->|"佣金记录"| D_COMM["📦 commission_records 表"]:::data

        P2a -->|"创建任意订单"| A9["🔗 POST /api/membership/orders"]:::api
        A9 -->|"levelCode, paymentType, period, couponId"| S7

        P2a -->|"试用会员"| A10["🔗 POST /api/membership/trial"]:::api
        A10 -->|"userId, familyId"| S9["⚙️ MembershipService.createOrder(trial)"]:::service
        S9 -->|"创建金额=0的订单, 状态=paid"| D_ORD

        S9 -->|"激活试用期"| S9a["⚙️ 写入TrialMembership + FamilyMembership"]:::service
        S9a -->|"试用记录"| D_TRIAL["📦 trial_memberships 表"]:::data
        S9a -->|"家庭会员记录(试用)"| D_FAM
        S9a -->|"用户等级= FAMILY, expireTime=7天后"| D_USER
        S9a -->|"试用升级记录"| D_REC
    end

    %% ================================================================
    %% 阶段三:会员权益
    %% ================================================================
    subgraph 阶段三[阶段三:会员权益]
        D_USER -->|"会员等级"| P3["🏠 会员权益页"]:::page
        P3 -->|"检查功能权限"| A11["🔗 POST /api/membership/can-use"]:::api
        A11 -->|"familyId, feature"| S10["⚙️ MembershipService.canUseFeature()"]:::service
        S10 -->|"按FREE/FAMILY/PREMIUM判定功能白名单"| D_USER

        P3 -->|"应用会员折扣"| A12["🔗 POST /api/membership/discount"]:::api
        A12 -->|"userId, amount"| S11["⚙️ MembershipService.applyMemberDiscount()"]:::service
        S11 -->|"从sys_config读取折扣率"| D_CFG
        S11 -->|"FREE无折扣, FAMILY/PREMIUM按折扣bps计算"| D_CFG
    end

    %% ================================================================
    %% 阶段四:订阅管理
    %% ================================================================
    subgraph 阶段四[阶段四:订阅管理]
        P1 -->|"订阅管理"| P4["🏠 订阅管理页"]:::page
        P4 -->|"查看订阅状态"| A13["🔗 POST /api/subscription/status"]:::api
        A13 -->|"familyId"| S12["⚙️ MemberSubscriptionService.getActiveSubscription()"]:::service
        S12 -->|"活跃订阅 + 过期时间校验"| D_SUB["📦 member_subscriptions 表"]:::data

        P4 -->|"查看订阅方案"| A14["🔗 POST /api/subscription/plans"]:::api
        A14 -->|"无参数"| S13["⚙️ 硬编码L1/L2方案"]:::service
        S13 -->|"L1=36500/年, L2=131400/年"| D_MOCK["📦 内存数据(L1_BENEFITS, L2_BENEFITS)"]:::data

        P4 -->|"创建订阅"| A15["🔗 POST /api/subscription/create"]:::api
        A15 -->|"familyId, level, amount, paymentType"| S14["⚙️ 创建微信预支付"]:::service
        S14 -->|"openid, 金额"| PAY
        S14 -->|"订阅服务激活"| S14a["⚙️ MemberSubscriptionService.subscribe()"]:::service
        S14a -->|"写入订阅记录, 状态=active"| D_SUB

        P4 -->|"确认订阅"| A16["🔗 POST /api/subscription/subscribe"]:::api
        A16 -->|"familyId, level, amount, paymentType, transactionId"| S14a

        P4 -->|"取消订阅"| A17["🔗 POST /api/subscription/cancel"]:::api
        A17 -->|"familyId"| S15["⚙️ MemberSubscriptionService.cancelSubscription()"]:::service
        S15 -->|"更新订阅状态=cancelled"| D_SUB

        P4 -->|"设置自动续费"| A18["🔗 POST /api/subscription/auto-renew"]:::api
        A18 -->|"familyId, enabled(0/1)"| S16["⚙️ MemberSubscriptionService.setAutoRenew()"]:::service
        S16 -->|"更新自动续费标记"| D_SUB
    end

    %% ================================================================
    %% 阶段五:订阅权益与推广等级
    %% ================================================================
    subgraph 阶段五[阶段五:订阅权益与推广等级]
        D_SUB -->|"订阅记录"| P5["🏠 订阅权益页"]:::page
        P5 -->|"查看我的权益"| A19["🔗 POST /api/subscription/benefits/my"]:::api
        A19 -->|"familyId"| S17["⚙️ 查询权益使用记录"]:::service
        S17 -->|"订阅下的所有权益日志"| D_BEN["📦 subscription_benefit_logs 表"]:::data

        P5 -->|"使用/检查权益"| A20["🔗 POST /api/subscription/benefit/check"]:::api
        A20 -->|"familyId, benefitCode"| S18["⚙️ 创建权益使用记录"]:::service
        S18 -->|"写入一条权益使用日志"| D_BEN

        P5 -->|"查看推广等级"| A21["🔗 POST /api/subscription/tier"]:::api
        A21 -->|"userId"| S19["⚙️ PromotionTierService.getCurrentTier()"]:::service
        S19 -->|"用户当前推广等级"| D_TIER["📦 promotion_tiers 表"]:::data

        P5 -->|"更新推广等级(管理员)"| A22["🔗 POST /api/subscription/tier/update"]:::api
        A22 -->|"userId, tierCode, role=admin"| S20["⚙️ PromotionTierService.updateTier()"]:::service
        S20 -->|"更新推广等级"| D_TIER
    end

    %% ================================================================
    %% 阶段六:定时任务
    %% ================================================================
    subgraph 阶段六[阶段六:系统定时任务]
        ROLE_SYS -->|"每日3:30"| T1["⚙️ 消费达标自动升级"]:::service
        T1 -->|"查询消费≥threshold的FREE用户"| D_USER
        T1 -->|"升级为FAMILY"| D_USER
        T1 -->|"创建升级记录"| D_REC

        ROLE_SYS -->|"每日4:00"| T2["⚙️ 过期会员降级"]:::service
        T2 -->|"查询已过期FAMILY用户"| D_USER
        T2 -->|"降级为FREE"| D_USER
    end

    %% ================================================================
    %% 角色关联
    %% ================================================================
    ROLE_PARENT -.- P1
    ROLE_PARENT -.- P2
    ROLE_PARENT -.- P3
    ROLE_PARENT -.- P4
    ROLE_PARENT -.- P5
    ROLE_PAY -.- PAY

端点明细

会员信息

端点 说明 端口 请求数据 响应数据
POST /api/membership/levels 获取所有会员等级列表 📱小程序 [MembershipLevelDTO]
POST /api/membership/my 获取我的会员信息 📱小程序 Header: Authorization {memberLevel, memberExpireTime, membership, totalConsumption}
POST /api/membership/level 获取当前有效会员等级 📱小程序 Header: Authorization {memberLevel, memberExpireTime}
POST /api/membership/current 获取当前等级详情 📱小程序 Header: Authorization MembershipLevelDTO(含功能权限列表)
POST /api/membership/records 获取升级记录 📱小程序 {page, size} Page<MemberUpgradeRecord>
POST /api/membership/plans 获取会员方案价格列表 📱小程序 [{levelCode, levelName, levelDesc, monthly, quarterly, yearly}]

会员购买与升级

端点 说明 端口 请求数据 响应数据
POST /api/membership/upgrade 创建会员升级订单 📱小程序 {levelCode, paymentType, period, couponId} PaymentOrderDTO
POST /api/membership/orders 创建支付订单 📱小程序 {levelCode, paymentType, period, couponId} PaymentOrderDTO
POST /api/membership/trial 激活试用会员 📱小程序 Header: Authorization PaymentOrderDTO(金额=0)
POST /api/membership/notify 支付回调 ⚙️系统自动 {orderNo, transactionId, payMethod} boolean

会员权益

端点 说明 端口 请求数据 响应数据
POST /api/membership/can-use 检查功能权限 📱小程序 {feature} boolean
POST /api/membership/discount 应用会员折扣 📱小程序 {amount} {originalPrice, discountedPrice}

订阅管理

端点 说明 端口 请求数据 响应数据
POST /api/subscription/status 获取当前家庭订阅状态 📱小程序 Header: familyId {subscription, hasActiveSubscription}
POST /api/subscription/plans 获取订阅方案列表 📱小程序 {L1: {name, price, benefits}, L2: {name, price, benefits}}
POST /api/subscription/create 创建订阅订单(JSON) 📱小程序 {level, amount, paymentType} {orderNo, amount, paymentUrl}
POST /api/subscription/subscribe 确认订阅(参数式) 📱小程序 {level, amount, paymentType, transactionId} null
POST /api/subscription/cancel 取消订阅 📱小程序 Header: familyId null
POST /api/subscription/auto-renew 设置自动续费 📱小程序 {enabled} null

订阅权益与推广

端点 说明 端口 请求数据 响应数据
POST /api/subscription/benefits/my 获取我的权益列表 📱小程序 Header: familyId [{code, used, usedAt, detail}]
POST /api/subscription/benefit/check 使用/检查权益 📱小程序 {benefitCode} {success, logId}
POST /api/subscription/tier 获取推广等级 📱小程序 Header: userId PromotionTier
POST /api/subscription/tier/update 更新推广等级(管理员) 🖥管理后台 {tierCode}, role=admin null

数据实体关系

erDiagram
    MembershipLevel ||--o{ FamilyMembership : "等级配置"
    User ||--o{ FamilyMembership : "家庭(通过familyId)"
    User ||--o{ MemberUpgradeRecord : "userId"
    FamilyMembership ||--o{ PaymentOrder : "订单"
    TrialMembership ||--o{ User : "试用"
    MemberSubscription ||--o{ SubscriptionBenefitLog : "权益使用"
    PromotionTier ||--o{ User : "userId"

    MembershipLevel {
        Long id PK
        string levelCode "FREE/FAMILY/PREMIUM/PROVIDER"
        string levelName
        string levelDesc
        int priceMonthly "月费(分)"
        int priceQuarterly "季费(分)"
        int priceYearly "年费(分)"
        text features "功能权限列表JSON"
        int maxChildren "可添加孩子数"
        int maxTasksPerDay "每日任务上限"
    }

    FamilyMembership {
        Long id PK
        Long familyId FK
        string levelCode "FREE/FAMILY/PREMIUM"
        date startDate
        date endDate
        string paymentStatus "paid/pending"
        string paymentMethod "wechat/trial"
        string orderNo
    }

    PaymentOrder {
        Long id PK
        String orderNo "ORD+时间戳"
        Long familyId FK
        string levelCode
        string paymentType "trial/yearly/monthly"
        string period
        int amount "分"
        string status "pending/paid"
        string transactionId "微信交易号"
    }

    MemberUpgradeRecord {
        Long id PK
        Long userId FK
        string fromLevel
        string toLevel
        string upgradeType "pay/trial/consumption"
        date expireTime
    }

    TrialMembership {
        Long id PK
        Long userId FK
        Long familyId FK
        date startDate
        date endDate
        int trialDays
        string status "ACTIVE/EXPIRED"
    }

    MemberSubscription {
        Long id PK
        Long familyId FK
        string level "L1/L2"
        string status "active/cancelled"
        date expireTime
        int autoRenew "0/1"
    }

    SubscriptionBenefitLog {
        Long id PK
        Long subscriptionId FK
        string benefitCode
        date usedAt
        text detail
    }

    PromotionTier {
        Long id PK
        Long userId FK
        string tierCode
    }

完整性分析

# 维度 评估 说明
1 流程完整性 ✅ 完整 覆盖会员信息查看(5种查询)、购买升级(付费/试用/优惠券)、会员权益(权限检查+折扣)、订阅管理(创建/取消/自动续费)、订阅权益与推广等级、系统定时任务(自动升级/过期降级)6个阶段,路径完整
2 异常路径 ⚠️ 部分覆盖 会员过期自动降级由定时任务处理(图中阶段六已体现);支付失败/取消场景未画入(支付回调仅处理成功通知);试用只能激活一次(代码中无防重复判断)
3 端点覆盖 ✅ 完整 22个端点全部映射到流程图中,与代码实际暴露的/api/membership/*(MembershipController)和/api/subscription/*(SubscriptionController)一致
4 角色覆盖 ✅ 完整 购买/查看为📱家长端(role=parent);tier/update为🖥管理后台(role=admin);notify为⚙️微信支付回调;定时任务为⚙️系统自动
5 数据实体 ✅ 完整 membership_levels、family_memberships、payment_orders、member_upgrade_records、trial_memberships、member_subscriptions、subscription_benefit_logs、promotion_tiers、user_coupons、commission_records、sys_config共11张表均在图中映射
6 一致性 ✅ 与代码一致 所有端点路径与实际Controller中的@PostMapping匹配;等级代码(FREE/FAMILY/PREMIUM)和功能白名单与代码逻辑一致;订阅方案(L1=36500/年, L2=131400/年)与硬编码值一致