一、立项背景与目标
传统美容/美甲美睫/养生门店普遍依赖手工记账:老板用本子记次卡易错漏记、提成靠手工核算易扯皮、微信群里预约常撞单、卡到期客户流失没有任何提醒。本项目旨在打造一套多租户 SaaS 化的美业会员次卡管理系统,用「排班预约 + 次卡/储值管理 + 收银耗卡与提成自动核算 + 会员提醒 + 双口径经营看板」一套系统解决上述痛点,每家门店即一个租户,支持多门店数据隔离。
二、软件功能与核心模块
1. Web 管理端(老板/店长/前台使用):服务项目(含提成规则)、卡产品(次卡/储值+充值档位)、员工档案与排班(营业时间管理)、会员档案(等级/推荐人/Excel 批量导入/会员码)、售卡开卡与延期退款、预约处理(确认/取消/爽约标记)、收银开单(一单多项目+卡扣与现金/微信组合支付)、作废冲正、提成报表、双口径经营看板。
2. 会员微信小程序(C 端):自助预约(排班驱动、DB 唯一索引防撞单、爽约限制)、会员码出示、卡包(剩余次数/余额/有效期)、消费记录、在线购卡下单、到期/次数不足订阅消息提醒。
三、业务流程与功能路径
员工排班 → 会员线上/前台预约(可约时段=排班∩营业时间)→ 到店收银开单(次卡扣减+现金补差组合支付)→ 提成按服务/售卡双归属自动落库 → 报表与看板对账;系统定时扫描到期/次数不足/沉睡/生日会员,经订阅消息+短信双通道自动触达促复购。
一、整体架构与设计思路
技术栈:JDK 17 + Spring Boot 3.2 + MyBatis-Plus 3.5 + Sa-Token + XXL-Job + Redis + Druid + MySQL,Docker Compose 一键部署,springdoc 接口文档。Maven 多模块分层:xin-common(统一响应 R、全局异常、多租户上下文+MP 租户拦截器、Sa-Token 拦截器、Redis 封装、微信小程序客户端)、xin-system(租户/用户/角色/菜单、附件、审计日志)、xin-beauty(美业业务域,11 张 bty_ 业务表)、xin-api(启动模块)。多租户基于 MP 租户拦截器做行级隔离,登录态租户 ID 存 Sa-Token session 由拦截器注入上下文,Job 场景手动 set 防越权。金额统一存分(bigint),卡号/单号用 Redis INCR 按租户+日期发号。
二、负责模块与结果
主导 PRD 评审对标(fuint 等多套开源系统)与全部业务表设计,独立完成 xin-beauty 模块:基础档案 CRUD、排班预约、售卡收银、提成落库、提醒任务、报表看板及 C 端小程序接口。达成:并发压测 0 超扣、预约撞单 0 发生、提成月报汇总=逐笔明细和、看板双口径(实收/耗卡+卡耗率)可对账。
三、难点、坑与解决方案
1. 并发超扣:收银扣卡用条件更新 SQL(remain_count>0 / remain_amount>=扣减额)替代先查后改,杜绝并发超扣。
2. 预约撞单:可约时段=员工排班∩营业时间,应用层校验外再以 (tenant_id, staff_id, apt_start_time) 唯一索引兜底。
3. 发号重复:Redis INCR 按「租户+日期」隔离,SETNX 预热 + DB 兜底防重启丢号。
4. 数据一致性:作废冲正逐明细回滚卡余额与提成;提成服务/售卡双归属分列,报表与明细强一致。
5. C 端免登录:SaTokenConfig notMatch 放行 + controller 手动注入租户上下文,兼顾安全与隔离。
6. 提醒骚扰:订阅消息优先、短信兜底,同类型 30 天频控,XXL-Job 定时任务错峰执行。