日期:2026-08-12 分支:cfclub 状态:待评审
现有系统有三套并行积分体系,职责不清、兑换能力空壳:
| 体系 | 维度 | 发放 | 消费 |
|---|---|---|---|
孩子积分 PointsService |
孩子(family_member) | 任务/打卡/签到/文章 | 心愿兑换、优惠券兑换、兑换商品 |
家长积分 User.totalPoints |
家长(user) | 无自动发放 | 商品订单积分抵扣(1积分=¥0.01) |
CF值 PlatformPointsService |
用户(user_id 唯一键) | 商品订单支付时、推荐分润、活动签到 | 仅提现;spend() 零调用 |
用户需求(已确认):
Coupon.pointsPrice)。user_platform_balance 余额一并迁入家庭池(按 user→family 归属;无家庭自动创建)。平台CF值(家庭维度,family_platform_balance)
├─ 发放:商品确认收货(实付×倍数)、推荐分润、活动签到
├─ 消费:会员续费抵扣、商品购买抵扣、提现
└─ 原语:earn / spend / freeze / unfreeze / getBalance / getLogs / adjust
家庭内部积分(个人维度)
├─ 孩子(family_member):任务/打卡 → 心愿、兑换商品、兑换优惠券(现状保持)
└─ 家长(user.total_points):仅家庭内部许愿兑换(商品抵扣入口移除)
family_platform_balanceCREATE TABLE family_platform_balance (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
family_id BIGINT NOT NULL,
total_earned INT NOT NULL DEFAULT 0, -- 累计获得
available INT NOT NULL DEFAULT 0, -- 可用
frozen INT NOT NULL DEFAULT 0, -- 提现冻结
withdrawn INT NOT NULL DEFAULT 0, -- 已提现
exchanged INT NOT NULL DEFAULT 0, -- 已消费(抵扣/兑换)
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_family (family_id)
);
family_platform_balance_logCREATE TABLE family_platform_balance_log (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
family_id BIGINT NOT NULL,
type VARCHAR(20) NOT NULL, -- earn/spend/freeze/unfreeze/withdraw/adjust
amount INT NOT NULL,
balance_after INT NOT NULL,
ref_type VARCHAR(50) NOT NULL, -- product_order/referral_dist/activity/withdrawal/adjust/refund
ref_id BIGINT,
remark VARCHAR(255),
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
KEY idx_family (family_id),
KEY idx_ref (ref_type, ref_id)
);
productsALTER TABLE products ADD COLUMN points_multiplier DECIMAL(4,2) NOT NULL DEFAULT 1.00 COMMENT '平台积分倍数,1元=1积分×倍数';
user_platform_balance 按 user.family_id 归属累加进 family_platform_balance;user 无 familyId 的自动创建家庭(无则 new)。family_platform_balance_log(refType=migration,remark=来源 userId 列表),避免重复。user_platform_balance 表保留(只读历史),新发放入家庭池。FamilyPlatformPointsService(新)仿 PlatformPointsService 实现,键为 familyId:
earn(familyId, amount, refType, refId, remark):total_earned+available,写流水,refId 幂等spend(familyId, amount, refType, refId, remark):available→exchanged,余额不足抛错freeze(familyId, amount, refId) / unfreeze(familyId, amount, refId) / confirmWithdraw(familyId, amount, refId):提现adjust(familyId, amount, remark):管理端手动调整(正负),写 adjust 流水getBalance(familyId) / getLogs(familyId, page, size) / getWithdrawable(familyId)SELECT ... FOR UPDATE 锁行触发点:ProductOrderService.confirmReceive()(L787-813)用户确认收货,status: pending_receipt → completed 成功分支之后。
计算:积分 = floor(moneyAmount / 100) × points_multiplier(向下取整)
moneyAmount:订单实付金额(分),即现金支付部分(totalAmount - pointsCost),积分抵扣的金额不产生积分,确认收货时已定points_multiplier:从 products 表按 productId 取familyPlatformPointsService.earn(familyId, points, "product_order", orderId, "购买商品: {productName}")ProductOrder.buyerId → user.familyIdcheckout.vue:积分抵扣输入从"家长积分"改为"家庭平台积分"CreateProductOrderDTO.pointsUsed 语义不变(数量)ProductOrderService:支付成功分支的 deductUserPoints 改为 familyPlatformPointsService.spend(familyId, pointsUsed, "product_order", orderId, "商品购买积分抵扣")refundUserPoints 改为 earn 回补(refType=refund)User.totalPoints 商品抵扣路径删除(保留字段,仅许愿兑换使用)MemberSubscriptionService.renew():增加可选平台积分抵扣参数
membership_points_deduct_ratio(默认如 1000 = 10%)spend(familyId, points, "membership", subId, "会员续费抵扣")WithdrawalService 改走家庭池(freeze/confirmWithdraw/unfreeze 换服务),新增提现记录含 familyId。
AdminFamilyBalanceController:/api/admin/family-platform-balance/*
list(分页:family_id/余额/流水摘要)logs(family_id + type/refType 筛选)adjust(手动调整 + remark)FamilyPlatformBalanceManage.vue 页面(余额列表 + 流水 + 调整弹窗)GET /api/family-platform/balance:家庭余额(含累计/冻结/可提现)GET /api/family-platform/logs:流水分页ProductDTO 增加 pointsMultiplier 字段(透出)utils/api.js:新增 getFamilyPlatformBalance / getFamilyPlatformLogs;ProductDTO.pointsMultiplier 透出product-detail.vue:价格区显示"购此商品可得 X 积分"(倍数>1 高亮"×N 倍积分")checkout.vue:积分抵扣改为家庭平台积分(余额取自新接口;1积分=¥0.01 规则沿用);显示"预计可得 X 积分"payment.vue:积分抵扣文案更新pages/wealth/index.vue 或新建):余额 + 流水 + 提现入口FamilyPlatformBalanceManage.vue:余额列表、流水、手动调整| 场景 | 处理 |
|---|---|
| 积分余额不足 | 抵扣/提现抛业务异常,前端提示"平台积分不足" |
| 并发抵扣 | 行锁 + 事务,二次校验余额 |
| 支付失败退款 | 回补积分(refType=refund),幂等 |
| 确认收货重复请求 | earn 按 refId 幂等跳过 |
| 孤儿 user(无 family) | 迁移时自动创建家庭 |
| 向下取整 | floor,不四舍五入(如 599元×1.5=898 积分) |
FamilyPlatformPointsService 原语points_log(孩子积分流水),仅迁移 user_platform_balance