温馨提示:本人主页置顶文章(点我)开头有 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




