健身管理系统开发实战:消息通知、预约排队、售后工单模块

简介: 本项目实战开发健身管理系统三大核心模块:消息通知(MQ异步+幂等防重)、预约排队(Redis有序队列+FIFO自动转正+分布式锁)、售后工单(状态机驱动+全链路通知)。三模块通过统一事件驱动模型深度联动,解决推送失效、资源闲置、售后难闭环等业务痛点,兼顾高并发与数据一致性。

健身管理系统开发实战:消息通知、预约排队、售后工单模块

一、业务痛点分析

健身房系统在落地时,经常遇到三类典型问题。消息推送杂乱无章,重复推送、消息丢失、课前提醒失效,会员错过课程;预约模块在课程满员后缺少排队替补机制,有人取消预约时空位无法自动流转,资源利用率低;设备报修、会员投诉没有标准化工单流程,问题口头传递、处理进度无法追溯,售后闭环难以形成。
这三个模块存在强联动关系:预约变更、排队替补、工单状态变更都需要触发消息通知,单独开发很容易出现状态不一致、并发超卖、消息幂等性失效等问题,需要统一事件驱动模型来串联。
健身3.jpeg

二、消息通知模块设计与实现

消息通知采用事件驱动架构,不与业务主流程强耦合,使用消息队列异步消费,支持站内消息、小程序模板消息、短信多渠道分发,同时做幂等、重试、消息模板管理。
核心设计要点:事件源统一发布通知事件,通知服务做渠道分发、消息持久化、已读状态管理;增加消息防重表,基于业务唯一key防止重复推送;失败消息进入死信队列,支持后台重发。

@Service
public class FitnessNotifyService {
    @Autowired
    private NotifyRecordMapper notifyRecordMapper;
    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void sendNotify(NotifyEvent event) {
        // 幂等校验,防止重复发送
        LambdaQueryWrapper<NotifyRecord> wrapper = Wrappers.lambdaQuery();
        wrapper.eq(NotifyRecord::getBizKey, event.getBizKey());
        if (notifyRecordMapper.selectCount(wrapper) > 0) {
            return;
        }
        // 持久化通知记录
        NotifyRecord record = new NotifyRecord();
        record.setUserId(event.getUserId());
        record.setBizType(event.getBizType());
        record.setBizKey(event.getBizKey());
        record.setContent(event.getContent());
        record.setStatus(0);
        notifyRecordMapper.insert(record);
        // 投递消息队列异步推送
        rabbitTemplate.convertAndSend("fitness.notify.exchange", "notify.send", event);
    }
}

通知场景覆盖:预约成功通知、课前定时提醒、排队替补成功通知、售后工单接单/完结通知。定时提醒可以结合延时队列实现,避免定时轮询数据库带来的性能损耗。

健身4.jpeg

三、预约排队模块设计与实现

预约排队分为预约主流程和候补排队流程。预约时先校验课程容量,余量充足直接生成预约单;课程已满,则加入FIFO候补队列,存入Redis有序集合,保证排队顺序。
当已有会员取消预约,系统释放名额,自动取出队首候补用户,自动转正预约并触发通知事件。这里必须使用分布式锁,防止并发取消、并发转正造成超卖。

@Service
public class CourseBookingService {
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    private RedissonClient redissonClient;
    @Autowired
    private FitnessNotifyService notifyService;

    public void booking(Long courseId, Long userId) {
        String lockKey = "course:booking:lock:" + courseId;
        RLock lock = redissonClient.getLock(lockKey);
        try {
            lock.lock(5, TimeUnit.SECONDS);
            CourseInfo course = getCourseById(courseId);
            Long bookedCount = getBookedCount(courseId);
            if (bookedCount < course.getMaxNum()) {
                // 直接预约成功
                createBookingOrder(courseId, userId);
                notifyService.sendNotify(buildSuccessEvent(courseId, userId));
            } else {
                // 进入候补排队
                String queueKey = "course:wait:" + courseId;
                redisTemplate.opsForZSet().add(queueKey, userId.toString(), System.currentTimeMillis());
                notifyService.sendNotify(buildWaitEvent(courseId, userId));
            }
        } finally {
            if (lock.isHeldByCurrentThread()) {
                lock.unlock();
            }
        }
    }
}

候补队列需要设置有效期,超过开课时间自动清理队列,避免无效数据堆积。同时支持会员主动退出排队,删除Redis队列内对应记录。

健身1.jpeg

四、售后工单模块设计与实现

售后工单用于处理健身器械故障报修、会员服务投诉、场地问题反馈,完整生命周期:工单创建、分派、接单、处理、复核、完结、关闭。
状态流转控制:新建→待分派→已接单→处理中→待复核→已完结,支持驳回重新处理,所有状态变更记录日志,每次状态变更都推送消息通知对应会员和处理人员。
工单支持自动分派和手动派单两种模式,自动分派可以根据处理人员负载、擅长类型进行路由。

@Service
public class WorkOrderService {
    @Autowired
    private WorkOrderMapper orderMapper;
    @Autowired
    private FitnessNotifyService notifyService;

    @Transactional(rollbackFor = Exception.class)
    public void changeStatus(Long orderId, Integer status, Long operatorId) {
        WorkOrder order = orderMapper.selectById(orderId);
        // 状态机校验,非法状态流转直接拦截
        if (!checkStatusFlow(order.getStatus(), status)) {
            throw new RuntimeException("工单状态流转不合法");
        }
        order.setStatus(status);
        order.setOperatorId(operatorId);
        orderMapper.updateById(order);
        // 状态变更触发通知
        notifyService.sendNotify(buildOrderEvent(order));
    }
}

工单表除基础描述、故障类型、图片附件字段外,保留状态变更日志表,用于后续统计工单响应时长、故障类型分布,辅助场馆运维优化。

健身2.jpeg

五、模块联动与落地注意事项

三个模块共用一套事件发布能力,预约转正、工单状态变更作为事件源,统一交给通知模块消费。开发时需要重点关注并发安全:预约扣减、名额释放、候补转正全部加分布式锁;消息通知做好幂等,避免重复推送;延时任务做好补偿,防止MQ消息丢失导致课前提醒漏发。
数据库层面,预约单、工单、通知记录做好分库索引,课程ID、用户ID作为高频查询字段建立索引;Redis只做排队队列、热点容量缓存,核心业务数据持久落库。
测试重点覆盖高并发场景:多人同时取消预约、候补队列连续转正、短时间大量报修工单提交,验证是否存在超约、消息风暴、工单状态错乱问题。

六、总结

健身管理系统里消息通知、预约排队、售后工单是支撑场馆运营的核心业务模块,三者不是独立功能,而是依靠事件驱动机制串联起来。消息通知模块作为基础设施,统一承载各类业务变更的触达能力;预约排队解决课程资源高效复用,降低空课率;售后工单完成会员问题闭环,沉淀运维数据。
在技术实现上,通过MQ异步解耦、Redis实现排队队列、分布式锁保障并发安全、状态机管控工单流转,能够在保证性能的前提下,规避超卖、消息重复、状态异常等常见问题。这套方案可以直接复用在私教预约、团课管理、场地预约等场景,在后续迭代中,可以在此基础上叠加智能排班、工单SLA超时预警等能力,持续完善整套健身管理系统。

相关文章
|
6天前
|
JavaScript API iOS开发
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(DSH)是DeepSeek于2026年开源的MIT协议AI Agent框架,支持插件化组装模型、工具、沙箱与UI,兼容主流大模型。本文提供免Node.js的桌面端安装包(Win/macOS),含详细图文教程及热门插件推荐。
2914 22
|
1天前
|
云安全 人工智能 安全
|
6天前
|
Linux 开发工具 iOS开发
Codex保姆级教程(下载+安装+登录+使用,含所有版本,2026最新)
Codex是OpenAI推出的开源AI编程智能体,本地运行,可理解整个代码库,支持自然语言指令改代码、执行命令、跑测试、修Bug,兼容Win/macOS/Linux。(239字)
|
7天前
|
iOS开发 Docker MacOS
【2026实测】Docker Desktop下载、安装、汉化、配置教程(附官网安装包)
Docker Desktop 是 Docker 官方推出的桌面容器管理工具,集成引擎、CLI、图形界面与 Kubernetes,支持 Win/macOS/Linux。2026 最新版 4.88.1 强化 ARM 原生运行、镜像加速及资源可视化,附中文汉化与国内镜像配置指南。
1281 5
|
云安全 安全 网络安全
|
7天前
|
安全 算法 定位技术
《高性价比人生指南》完整原版:普通人用最少的资源,过好这一生的底层逻辑~How To Live Better
📖《高性价比人生指南》是一份基于实证、拒绝焦虑的生存手册,倡导以“人生时薪”为视角,重新计算时间、金钱与精力的成本与收益。它不承诺逆袭,只教人算清账:省下的钱若耗掉时间便亏;买体验比买物品更值;睡眠是最高杠杆的健康投资;关系贵在情绪价值而非表面热络;学习重在改变行为而非自我安慰。核心理念:用低成本、高回报的微小行动,换取长期的选择权——不是成为谁,而是掌控自己人生的主动权。
|
19天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
3399 52
|
12天前
|
人工智能 JSON Linux
【保姆级】ComfyUI部署教程(下载+安装+配置+工作流,2026最新)
ComfyUI 是一款开源节点式AI生成工具,支持图像、视频、音频及3D内容创作。通过拖拽连线组合模型加载、提示词、采样等节点,构建可复用、易修改的工作流,兼容SD1.5、SDXL、Flux、Qwen Image等主流模型。