QQ_3699076131头像
基于SpringBoot的养老服务系统的设计与实现-附源码封面图

基于SpringBoot的养老服务系统的设计与实现-附源码

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片!

课题介绍

课题名称:基于 SpringBoot 的养老服务系统
课题介绍:随着老龄化程度不断提升,居家养老、社区养老成为主流养老模式,传统养老服务依靠线下登记、电话预约,存在老人信息分散、健康档案不连续、服务工单流转混乱、家属无法实时了解老人情况、护工排班与服务监管缺失、紧急求助响应慢等痛点。很多养老机构和社区养老服务中心缺少统一信息化平台,老人基础信息、慢病记录、体检报告、用药记录分散在纸质档案;上门助餐、助浴、保洁、陪护、康复理疗等服务靠电话登记,工单容易漏派、错派;护工服务完成后缺少签到、评价记录,服务质量难以监管;家属不能线上查看老人服务记录、健康数据;老人紧急呼叫、异常情况没有线上预警,养老物资采购、库存管理、收费对账也缺乏统一台账。本系统基于 SpringBoot 开发养老服务系统,设置系统管理员、护工、家属、老人(用户)四类角色。系统管理员负责老人信息档案管理、服务项目配置、护工账号与排班管理、养老物资管理、收费项目设置、订单监管、服务数据统计;护工接收服务工单、上门签到打卡、完成服务记录、上传服务照片、登记老人健康数据、上报老人异常情况;家属可以绑定老人信息、预约养老服务、查看服务工单进度、查看老人健康档案、服务评价、接收老人异常提醒;老人可查看已预约服务、紧急求助、查看用药提醒。系统整合老人档案、健康管理、服务预约、工单派单、护工排班、物资库存、收费结算、紧急预警、家属联动、服务评价统计功能,实现社区养老、居家上门养老服务全流程线上化,提升养老服务响应效率与服务监管能力。

技术栈

后端:SpringBoot + MyBatis-Plus + MySQL + Redis
权限:SpringSecurity + JWT
前端:Vue3 + Element Plus
其他:图片上传、ECharts 可视化、定时任务(用药提醒、服务到期提醒)、Redis 缓存服务项目、消息通知、工单状态流转、文件上传(体检报告)
系统模块:权限模块、老人档案模块、健康档案模块、服务项目模块、工单派单模块、护工排班模块、物资管理模块、收费结算模块、紧急求助模块、评价模块、统计报表模块。

系统分析

角色:系统管理员、护工、家属、老人
系统管理员:录入维护老人基础档案、慢病信息、体检记录;配置助餐、助浴、保洁、康复等服务项目;管理护工账号、排班、护工资质;养老物资入库出库、库存预警;服务收费标准设置;工单审核、异常订单处理;查看服务量、老人健康分布、营收统计报表。
护工:接收分配给自己的服务工单;上门签到打卡;填写服务记录、上传现场照片;登记老人血压、血糖等健康指标;记录老人用药情况;上报老人身体异常;完成工单后提交,查看历史工单。
家属:注册账号,绑定老人;在线预约上门养老服务;查看工单进度、护工信息;查看老人健康档案、历史体检记录;服务完成后评价护工;接收老人异常预警消息;查看缴费记录。
老人:登录查看预约服务、用药提醒;一键紧急求助;查看自己的服务记录。

非功能性需求:老人档案信息唯一,身份证号不可重复;工单分配避免护工同一时间多个订单冲突;服务工单状态严格流转(待派单、已接单、服务中、已完成、已取消);护工必须签到打卡后才能填写服务记录;健康数据按时间顺序保存,支持历史追溯;紧急求助消息实时推送管理员与家属;物资库存不足自动预警;家属只能查看自己绑定老人的数据;护工只能处理分配给自己的工单;关键操作(异常上报、紧急求助、收费记录)留存日志;体检报告、服务照片支持上传存储。

系统截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

文档

在这里插入图片描述

系统设计

核心数据表:user 用户表、elder 老人档案表、health_record 健康记录表、service_item 服务项目表、service_order 工单表、worker 护工表、worker_schedule 护工排班表、material 物资表、material_record 物资流水表、charge 收费表、comment 评价表、emergency 紧急求助表。
业务流程:家属或者管理员录入老人信息 → 家属预约养老服务,生成工单 → 管理员派单给护工 → 护工接单、上门签到 → 完成服务、填写记录、上传照片、登记健康数据 → 工单提交完成 → 家属查看并评价;老人一键紧急求助,系统推送提醒给管理员和家属;管理员定期维护老人健康档案、管理物资、查看统计报表。

核心代码

@RestController
@RequestMapping("/elderly/service")
public class ElderlyServiceController {
    @Resource
    private IElderServiceOrderService orderService;
    @Resource
    private IElderInfoService elderInfoService;
    @Resource
    private IHealthRecordService healthRecordService;
    @Resource
    private IEmergencyService emergencyService;
    @Resource
    private IWorkerService workerService;

    // 新增老人档案
    @PostMapping("/elder/add")
    public Result addElder(@RequestBody ElderDTO dto) {
        if (dto.getIdCard() == null || dto.getIdCard().trim().isEmpty()) {
            return Result.fail("老人身份证号不能为空");
        }
        if (elderInfoService.existsIdCard(dto.getIdCard())) {
            return Result.fail("该身份证号老人档案已存在");
        }
        if (dto.getElderName() == null || dto.getElderName().trim().isEmpty()) {
            return Result.fail("老人姓名不能为空");
        }
        ElderVO vo = elderInfoService.addElder(dto);
        return Result.success("老人档案新增成功", vo.getId());
    }

    // 家属预约养老服务,生成工单
    @PostMapping("/order/apply")
    public Result applyServiceOrder(@RequestBody ServiceOrderDTO dto) {
        if (dto.getElderId() == null) {
            return Result.fail("请选择需要服务的老人");
        }
        if (dto.getServiceItemId() == null) {
            return Result.fail("请选择服务项目");
        }
        if (dto.getServiceTime() == null) {
            return Result.fail("请选择上门服务时间");
        }
        if (dto.getFamilyUserId() == null) {
            return Result.fail("家属信息不能为空");
        }
        ServiceOrderVO vo = orderService.createOrder(dto);
        return Result.success("服务预约成功,等待管理员派单", vo.getOrderNo());
    }

    // 管理员工单派单给护工
    @PostMapping("/order/distribute")
    public Result distributeOrder(@RequestParam Long orderId, @RequestParam Long workerId) {
        ServiceOrder order = orderService.getById(orderId);
        if (order == null) {
            return Result.fail("工单不存在");
        }
        if (!order.getOrderStatus().equals(1)) {
            return Result.fail("工单状态异常,仅待派单工单可以分配");
        }
        Worker worker = workerService.getById(workerId);
        if (worker == null || worker.getStatus() != 1) {
            return Result.fail("护工不存在或已离职");
        }
        boolean conflict = orderService.checkWorkerTimeConflict(workerId, order.getServiceTime());
        if (conflict) {
            return Result.fail("护工该时段已有其他工单,存在时间冲突,请更换护工");
        }
        orderService.distributeOrder(orderId, workerId);
        return Result.success("工单派单成功,护工已收到工单");
    }

    // 护工上门签到
    @PostMapping("/order/checkin")
    public Result workerCheckIn(@RequestParam Long orderId, @RequestParam Long workerId) {
        ServiceOrder order = orderService.getById(orderId);
        if (order == null) {
            return Result.fail("工单不存在");
        }
        if (!order.getWorkerId().equals(workerId)) {
            return Result.fail("您不是该工单对应护工,无法签到");
        }
        if (!order.getOrderStatus().equals(2)) {
            return Result.fail("工单状态异常,仅已接单工单可以签到");
        }
        orderService.workerCheckIn(orderId);
        return Result.success("上门签到成功,开始服务");
    }

    // 护工提交服务记录,登记健康数据
    @PostMapping("/order/finish")
    public Result finishOrder(@RequestBody OrderFinishDTO dto) {
        if (dto.getOrderId() == null) {
            return Result.fail("工单id不能为空");
        }
        ServiceOrder order = orderService.getById(dto.getOrderId());
        if (order == null) {
            return Result.fail("工单不存在");
        }
        if (!order.getWorkerId().equals(dto.getWorkerId())) {
            return Result.fail("无权提交该工单");
        }
        if (!order.getOrderStatus().equals(3)) {
            return Result.fail("工单未签到,不能提交完成记录");
        }
        // 保存健康记录
        if (dto.getBloodPressure() != null || dto.getBloodSugar() != null) {
            HealthRecordDTO healthDTO = new HealthRecordDTO();
            healthDTO.setElderId(order.getElderId());
            healthDTO.setBloodPressure(dto.getBloodPressure());
            healthDTO.setBloodSugar(dto.getBloodSugar());
            healthDTO.setRecordDesc(dto.getHealthDesc());
            healthRecordService.saveHealthRecord(healthDTO);
        }
        ServiceOrderVO vo = orderService.finishOrder(dto);
        return Result.success("服务记录提交成功,工单已完成", vo.getId());
    }

    // 老人一键紧急求助
    @PostMapping("/emergency/add")
    public Result emergencyHelp(@RequestBody EmergencyDTO dto) {
        if (dto.getElderId() == null) {
            return Result.fail("老人信息不能为空");
        }
        ElderInfo elder = elderInfoService.getById(dto.getElderId());
        if (elder == null) {
            return Result.fail("老人档案不存在");
        }
        if (dto.getHelpDesc() == null || dto.getHelpDesc().trim().isEmpty()) {
            dto.setHelpDesc("老人发起紧急求助");
        }
        EmergencyVO vo = emergencyService.createEmergency(dto);
        return Result.success("紧急求助已发送,管理员和家属将收到提醒", vo.getId());
    }

    // 家属评价工单
    @PostMapping("/order/comment")
    public Result commentOrder(@RequestBody CommentDTO dto) {
        if (dto.getOrderId() == null) {
            return Result.fail("工单id不能为空");
        }
        ServiceOrder order = orderService.getById(dto.getOrderId());
        if (order == null) {
            return Result.fail("工单不存在");
        }
        if (!order.getOrderStatus().equals(4)) {
            return Result.fail("工单未完成,暂时不能评价");
        }
        if (!order.getFamilyUserId().equals(dto.getFamilyUserId())) {
            return Result.fail("只有绑定家属可以评价");
        }
        if (dto.getScore() == null || dto.getScore() < 1 || dto.getScore() > 5) {
            return Result.fail("评分必须在1-5分之间");
        }
        CommentVO vo = orderService.addComment(dto);
        return Result.success("评价提交成功", vo.getId());
    }
}

系统测试

表格

测试编号测试模块测试目的输入数据预期结果实测结果是否通过
TC01角色登录四类角色权限隔离管理员、护工、家属、老人账号登录成功,权限区分权限正常通过
TC02老人档案新增身份证唯一校验已存在身份证号提示档案已存在,拦截拦截成功通过
TC03老人档案必填校验姓名为空提交姓名为空,身份证正常提示姓名不能为空拦截成功通过
TC04服务预约家属预约服务老人 id、服务项目、服务时间工单生成,状态待派单预约成功通过
TC05派单冲突校验护工时段已有工单同一护工同一时间段提示时间冲突,无法派单拦截成功通过
TC06护工状态校验派单给离职护工离职护工 id提示护工不可用拦截成功通过
TC07工单状态校验未接单工单签到待派单工单签到提示状态异常,不能签到拦截成功通过
TC08护工签到权限校验其他护工签到非本工单护工提示无权签到拦截成功通过
TC09工单提交校验未签到提交完成未签到工单提交提示未签到,不能提交拦截成功通过
TC10健康数据登记提交血压血糖正常数值健康档案保存成功保存成功通过
TC11紧急求助提交老人发起求助老人 id、求助描述求助记录生成,推送提醒提交成功通过
TC12评价校验未完成工单评价待接单工单提示工单未完成不能评价拦截成功通过
TC13评分范围校验评分 0 分评分 0提示评分 1-5 分拦截成功通过
TC14评价权限校验其他家属评价非绑定家属提示无权评价拦截成功通过
TC15物资入库新增物资入库物资名称、数量库存增加,生成入库流水入库成功通过
TC16物资库存预警库存低于预警线库存小于预警值触发库存预警预警正常通过
TC17工单取消家属取消未派单工单待派单工单工单取消,状态更新取消成功通过
TC18数据隔离家属查看其他老人档案未绑定老人 id无权限查看拦截成功通过
TC19护工工单查看护工查看别人工单其他护工工单看不到非本人工单隔离正常通过
TC20统计报表管理员查看服务统计选择时间范围展示服务量、健康统计图表统计正常通过

总结

本养老服务系统采用 SpringBoot+Vue3 架构,分为系统管理员、护工、家属、老人四类角色,实现老人基础档案管理、慢病与体检健康档案记录、助餐助浴保洁康复等服务项目配置、家属线上预约服务、工单派单、护工上门签到打卡、服务记录上传、健康指标登记、老人一键紧急求助、家属评价、养老物资出入库、库存预警、服务数据统计等功能。解决传统养老服务信息纸质化、工单错派漏派、护工服务缺少监管、家属无法实时掌握老人情况、紧急求助响应慢、物资和收费台账混乱的问题。系统对老人身份证做唯一性校验,派单时校验护工时间冲突,必须签到后才能提交服务记录,工单状态严格流转,家属仅可查看绑定老人信息,护工只能处理分配给自己的工单,紧急求助消息实时推送。经过测试,老人档案、服务预约、工单派单签到、服务提交、紧急求助、评价、物资管理、权限隔离等核心功能稳定运行。后续可以拓展老人用药定时提醒、定位监控、线上视频探视、智能手环健康数据对接、养老收费在线支付、多社区养老站点管理、老人能力评估、养老补贴申请模块等功能。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/2601_94837849/article/details/170358069

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--