springboot雅集社区养老管理系统04456-计算机课程设计、毕业设计

1 绪论

1.1 研究背景

  养老服务领域的结构性供需矛盾十分突出。截至2025年底,我国60岁及以上人口已超过3亿,老龄化程度不断加深,社区养老服务资源分散、管理手段落后的问题一直未能得到根本性解决。传统的养老机构大多采取人工登记、纸质档案的方式进行服务信息的管理,服务信息更新迟缓,家属和机构之间的沟通不畅,造成服务响应速度慢。王树明1认为,在农村养老服务体系建设过程中,缺少数字化工具会严重影响到服务覆盖面的扩大。数字化技术飞速发展给养老服务模式创新赋予了技术支撑,智慧养老平台可以很好地整合分散的服务资源,冲破信息传递的障碍。王茜2认为社区养老服务数字化协同路径可以提高资源配置效率。吴兆华认为智慧养老平台推动养老服务产业数字化转型具有内在原因3。以上研究共同指向一个现实需求,即创建起一个包含用户管理、服务预约、健康监测在内的综合性养老管理系统,已经成为提高社区养老服务质量、回应老龄化社会需求的紧迫任务。

1.2 研究意义

  本文所设计并实现的雅集社区养老管理系统有明显的应用价值。系统把传统的手工操作变成线上流程,大大缩减了服务响应时间。管理员利用统一后台对用户的个人信息进行修改,服务类型进行配置,预约进行审核等,可以省去各个部门之间信息传递的重复工作以及差错风险。家属用户可以在线上自由浏览养老服务信息,可以在线预约服务,还可以查询自己的健康档案等信息,从根本上解决了之前电话咨询、线下填写表格的麻烦。服务人员可以即时得到排班表、服务日志的更新、异常情况的上报,工作流程更清晰可控。该系统促使社区养老管理由分散化走向集约化,给行业供应了可以复用的信息化解决办法。系统成功运用之后可以起到示范作用,在更大范围内的同类机构管理上起到推动作用,为创建更完善的社会养老服务体系提供技术支持。

1.3 国内外研究现状

  国内对于社区养老管理系统的研究开始得比较晚,但是发展很快。早期研究主要是对基本的信息记录和查询进行研究,近些年来开始向智能化、集成化发展。研究热点由原来的单一功能模块开发,转向多角色协同、数据驱动的综合服务平台创建。学术界普遍认为社区养老管理系统最根本的价值就是打通信息孤岛,实现服务资源的合理调配。

  严灿璨、胡秋秋(2017)运用扎根理论方法,对智慧社区养老服务体系进行创新设计研究,从用户需求出发构建起多层次的养老服务体系,得出结论认为养老服务系统的设计要重视用户体验和服务流程的有机融合4。该研究给本系统前端交互设计带来了重要的启示,系统界面要考虑到老年用户和家属用户的操作习惯的不同。吴兆华(2016)从产业数字化转型角度出发,认为智慧养老平台驱动机制在于平台化运作把分散的服务资源整合起来,从而提高供给效率。该研究对于本系统架构设计有借鉴作用,系统要具备良好的扩展性来适应业务量的增加。该观点直接决定了本系统角色权限划分的方式,管理员、家属用户、服务人员三类角色功能界限要明确。李怡淼5对社区嵌入式养老服务主要问题进行了研究,认为服务流程标准化、信息透明化是解决难题的两个重要途径。该研究给本系统服务预约和记录模块的设计提供理论基础,保证服务过程可追溯、可监督。张会霞6从数字经济赋能的角度出发,对农村养老服务高质量发展进行了逻辑上的分析,认为数据资源是农村养老服务高质量发展的关键因素。该思想指导了本系统健康记录模块的设计,系统要给服务评价和改进提供数据支持。

  就国内的研究现状而言,目前有关文献在理论方面给社区养老管理系统提供了一个比较完整的框架,但是对系统功能实际应用的实践研究较少7。大部分的研究都停留在宏观政策分析和理论模式建构上,缺少对具体功能模块实现细节的阐述。本系统在功能设计上对已有研究进行了补充,创建起包含服务预约、订单支付、健康记录、异常上报的完整业务闭环,把理论框架变成可以运行的系统。

  国外对于智慧养老的研究开始得比较早,在技术和服务的融合上有所侧重。研究特点有两方面,第一,重视数据驱动决策在养老服务中的重要性,第二,重视数字工具对服务质量、安全性的改善作用。Antonucci和D'Andreamatteo8就意大利近距离医疗服务的数字化展开研究,得出结论全科医生和患者对于数字服务链条起着关键的作用。该研究对于本系统来说有如下启示,即服务人员和家属用户之间信息交互的节点要更加透明、高效。Duchateau等人认为,利用数字创新和数据驱动干预来提高老年护理质量、安全性的办法,把数据标准化作为系统的运行基础9。该观点给本系统数据库的设计指明了方向,各个业务表之间数据的关联要保证一致性和完整性。Bray等10对使用interRAI信息系统指导老年护理管理的干预措施进行范围综述,证明了信息系统在护理评估和管理中有效。该研究给系统健康记录模块功能设计赋予了循证支撑。Melkas等11对芬兰数字家庭医疗服务的可持续性做了气候和社会影响的评价,提出数字服务在资源分配上具有的效率优势。该研究为本系统排班信息管理模块的设计思路提供支持,合理的安排服务人员的资源可以提高整个运营效率。Bail等12用参与式行动研究的方法开发出养老机构电子仪表板信息工具,证明了数字化反馈系统可以有效地提高护理质量。该结果证明了本系统中健康记录、在线反馈模块的设计是可行的,实时数据反馈可以起到改善服务质量的作用。

  就目前而言,国外的相关研究在技术应用的深度以及数据价值的挖掘方面给本系统提供了一些重要的借鉴。国外的研究大多会重视数据的标准化、服务的透明度和持续性的反馈,这些思想也已经被应用到本系统的创建当中。本系统在吸收上述研究成果的基础上,根据国内社区养老实际应用情况,把数据驱动的管理思想转化成具体的功能模块,使理论同实践有效衔接。

1.4 研究内容

  本文主要针对雅集社区养老管理系统的设计和实现进行研究,主要的工作有如下五个部分。第一,对社区养老管理实际业务流程进行梳理,确定管理员、家属用户、服务人员三个角色的功能需求,规定系统边界和数据流转规则。第二,系统设计阶段按照前后端分离架构的原则来完成系统的总体架构设计、功能模块的划分、数据库的概念模型和逻辑模型的建立,保证系统结构清晰、扩展性好。第三,技术选型和实现阶段,使用SpringBoot搭建后端服务,使用Vue框架搭建前端界面,用MySQL数据库做数据持久化工作,实现用户管理、服务预约、订单支付、健康记录、排班调度等功能模块的编码。第四,系统测试阶段设计功能测试用例,保证系统各个模块的正确运行,保证业务逻辑的完整性以及数据的一致性。第五,在对文档进行撰写与总结的时候,整理出整个研究的过程,发现系统存在的不足之处并提出改进方向。本文主要对完整业务流程的数字化进行研究,并没有对智能算法优化或者硬件设备集成等扩展内容展开研究。经过以上的工作,最终得到一个可以运行、功能齐全、使用方便的社区养老管理系统原型,为以后的功能迭代和推广应用打下技术基础。

2 系统分析

2.1 系统概述

  雅集社区养老管理系统是以社区养老服务机构、家属用户和服务人员为对象,以三端协同管理为特点的B/S架构的系统,用前后端分离的方式把传统的线下人工管理流程转变为线上规范化的操作。系统为管理员、家属用户、服务人员这三个角色提供不同的功能界面和操作权限,管理员端承担用户账户管理、服务类型配置、预约审核、健康档案维护、反馈处理、异常上报审核、排班计划制定等全局配置任务,家属用户端提供服务浏览检索、预约申请提交、在线支付、家庭信息维护、预约进度跟踪、历史服务查询、健康记录查阅、意见反馈等一站式服务功能,服务人员端支持服务信息维护、预约请求处理、服务记录填写、异常情况上报、个人排班查看等日常操作。后端用Spring Boot框架创建RESTful风格的接口,前端使用Vue框架创建响应式的用户界面,数据存储使用MySQL关系型数据库,系统打包之后可以直接部署运行,给社区养老管理数字化转型提供完整的解决方案。

2.2 可行性分析

  雅集社区养老管理系统在正式开发前需要从技术、经济、操作、法律、社会等各方面对它的可行性进行综合评价。系统采用Spring Boot、Vue、MySQL成熟的开发技术栈来创建,各个技术组件之间兼容性较好,开发工具和运行环境都可以从开源渠道获取,技术实现路径明确可控。系统所需要的软件资源不需要商业授权费用,硬件投入主要是个人计算机和轻量级云服务器,初期开发成本以及后期运维成本都处在合理的范围内。系统界面设计考虑到三类用户操作习惯的不同,管理员后台用表格形式进行信息管理,家属用户端用卡片式展示降低学习成本,服务人员端简化界面突出主要操作,不同的计算机操作水平的用户都可以快速上手。系统对数据采集和存储进行如下规定,即按照个人信息保护法的相关规定执行,用户授权、操作日志、支付接口等各方面都符合监管要求。系统以老龄社会社区养老服务供给不足的现实痛点为出发点,用数字化手段提高服务响应速度和服务信息透明度,有较好的社会接受度和推广应用价值。

2.2.1 技术可行性

  Spring Boot、Vue、MySQL三者的组合构成了一套成熟稳定的技术栈13。Spring Boot框架具有完善的依赖管理功能,可以快速集成数据访问、事务控制等基础功能,降低项目构建过程中重复劳动的工作量。Vue框架在前端界面开发中具有响应式、组件化的特点,使得复杂的交互场景的代码组织更加规范14。MySQL数据库在数据存储中使用广泛,和Java后端配合时连接稳定,事务支持齐全15。以上技术都有活跃的开源社区支持,在遇到开发问题的时候可以迅速得到解决。系统所用的三层架构结构清楚,数据流向明确,现有的技术条件可以保证系统开发工作能够顺利进行。

2.2.2 经济可行性

  系统开发所用的软件资源都可以在开源渠道中获得,不需要支付软件采购费用。Spring Boot、Vue、MySQL均为开源技术,开发阶段无需购买商业许可证16。开发环境的搭建以个人电脑为主,硬件投入较少。系统部署阶段可以选用云服务商提供的轻量级应用服务器,初期投资小。系统运行后的人力成本主要是日常维护和数据备份,单次操作耗时较短。从整体上看,系统建设及运行成本结构满足经济性要求,投入产出比处在合理区间。

2.2.3 操作可行性

  系统针对三类用户群体的操作习惯做了交互设计。管理员所用的后台界面使用表格布局加筛选控件的方式进行设计,信息管理的操作都在同一个页面上完成,从而降低了页面跳转的次数。家属用户端使用卡片式服务展示和表单式预约填写,页面结构简单,预约、支付、查询等高频操作按钮位置固定。服务人员端简化了界面元素,突出待办事项和服务记录的入口,降低了日常使用中认知的负担。界面交互流程同用户使用各类应用的习惯相接近,学习成本处于一个合理的范围内,各个层次的用户都能很好地完成基本操作。

2.2.4 法律可行性

  系统运行时会涉及到用户个人信息、服务交易记录、健康档案数据等敏感信息的收集和保存,必须符合现行法律法规有关数据安全和隐私保护的规定。中华人民共和国个人信息保护法规定,处理个人信息必须符合合法性、正当性、必要性三个原则,并且要公开处理规则并且取得个人的同意。系统在设计阶段就将用户授权机制加入到流程当中,家属用户注册时需要同意服务条款,健康数据录入时还要单独提示用途说明。系统操作记录保留完整的日志信息,所有的数据修改和查询行为都可以被追溯,符合监管对于数据审计的要求。服务交易环节包含电子支付和费用结算,系统对接第三方支付接口时按照金融监管机构有关非银行支付机构业务的规定执行,不会存储银行卡号等敏感的金融信息。系统发布之前会做合规性自查,保证所有的业务流程都不越线。

2.3 需求分析

2.3.1 功能需求

  管理员角色功能需求

  管理员能够管理系统用户账户、维护家庭信息、配置服务类型、审核预约申请、查看服务记录、管理健康档案、处理在线反馈、审核异常上报、安排排班计划。管理员具备全系统数据的查询与操作权限,负责业务流程的监督与异常处理。

图1 管理员用例图

  家属用户角色功能需求

  家属用户能够浏览养老服务列表、检索服务信息、提交服务预约、完成订单支付、维护个人家庭信息、查看预约进度、查询服务记录、查阅健康档案、提交在线反馈。家属用户的操作范围限定于本人关联的家庭信息与预约记录。

图2 家属用户用例图

  服务人员角色功能需求

  服务人员能够管理服务信息、查看预约安排、更新服务进度、记录服务过程、上报异常情况、查询个人排班。服务人员的操作权限限定于本人负责的服务项目与预约记录。

图3 服务人员用例图

2.3.2 性能需求

  系统在正常负载时应该保证核心业务操作响应速度。服务列表加载时间控制在3秒以内,预约申请提交操作从用户点击到结果反馈的时间不超过5秒。健康记录查询需要多条件筛选和数据统计,在用户设置查询条件之后的6秒内返回结果。并发访问能力要保证系统可以同时有50个用户在线操作,核心接口的并发请求处理能力不能少于30次每秒。从数据存储的角度来说,业务数据必须是持久化的、可靠的,所有的事务提交成功率要达到99.9%以上。系统运行期间要保持稳定,非硬件故障情况下单次运行周期内不能出现服务中断。

2.3.3 环境需求

  硬件需求

  系统运行所必需的硬件环境分为服务端和客户端两大部分。服务端需要至少4个核心处理器,主频不低于2.5GHz,内存大于8GB,硬盘留出50GB给系统文件和数据库文件使用。如果使用物理服务器来部署网络接口,应该选择千兆以太网,否则会造成数据传输低效,如果使用云服务器实例,则可以选择公网带宽5Mbps以上来满足多用户同时访问的需求。客户端设备中管理员和家属用户的计算机应具有2GB以上的内存,显示器的分辨率为1366×768,保证系统界面元素全部显示出来。

  软件需求

  软件环境配置包含操作系统、数据库、运行环境、浏览器这四个部分。服务器操作系统可选择Windows Server 2016及以上版本,或CentOS 7、Ubuntu 20.04等Linux发行版。系统运行前必须安装JDK 1.8及以上版本的Java运行环境,还要正确设置环境变量。数据库使用的是MySQL 5.7版的,在MySQL中需要开启InnoDB存储引擎来支持事务。应用服务使用的是Spring Boot框架内嵌的Tomcat容器来运行,不需要安装独立的Web服务器软件。客户端需要安装主流浏览器,如Chrome 80、Firefox 75或者Edge 90及以上版本,浏览器要开启JavaScript脚本执行和Cookie存储功能,才能保证前端页面交互逻辑正常运行17。系统开发阶段使用的工具包括IntelliJ IDEA集成开发环境、Navicat数据库可视化管理工具、Visual Studio Code前端代码编辑器,上述软件均可在Windows 10或Windows 11操作系统环境下稳定运行。

3.1 系统总体设计

3.1 系统总体设计

3.1.1 功能模块设计

  系统以社区养老管理的主要业务流程为基础来创建功能模块,给不同的用户群体提供不一样的操作界面。管理员端包含系统用户管理、家庭信息管理、服务类型设置、预约审核、服务记录查询、健康档案管理、在线反馈处理、异常上报审核、排班计划制定等模块,实现对整个系统的资源进行统一调度。家属端包含养老服务浏览、服务预约申请、订单支付确认、家庭信息修改、预约状态查询、历史服务回顾、健康记录查看、在线反馈提交等模块,可以实现整个家庭养老服务体系全过程的服务。服务人员端包含养老服务管理、预约信息处理、异常上报操作、排班计划查看等主要功能,可以进行日常服务工作。该系统的功能模块如图5所示。

图5 系统功能模块图

3.1.2 功能模块说明

3.2 系统数据库的分析与设计

  数据库设计是系统开发的核心环节,直接影响系统的数据一致性、查询效率与扩展能力。雅集社区养老管理系统涉及用户信息、服务项目、预约记录、健康档案等多类业务数据,各数据实体之间存在复杂的关联关系。合理的数据库结构设计能够有效支撑业务流程的顺畅运行,避免数据冗余与操作异常。

  本系统数据库设计遵循规范化原则,从概念模型构建入手,明确实体间的关联关系与业务约束,进而转换为逻辑模型并完成物理表结构设计。概念设计阶段采用实体-关系模型描述系统数据特征,识别出家

3.2.1 数据库的概念结构设计

  建立社区养老管理系统概念模型,关键就是理清用户角色和服务流程之间的各种联系。家属用户和服务人员属于两种不同的参与者,分别同家庭信息、预约记录、服务记录这些实体展开互动,各个实体之间依靠外键约束来构成完整的数据链。概念模型是用实体和联系来表示现实世界中业务规则的方法,实体代表数据对象本身,联系体现实体之间的业务关系。系统中存在着一对多的关系,即一个家属用户可以对应多个老人信息,一个服务人员可以负责多项服务预约,也存在着多对多的关系,即服务类型和养老服务之间通过类型字段建立关联。E-R图属于概念模型的视觉表现手段,可以清楚地展示出实体之间的联系架构,给后面逻辑模型的设计工作赋予根基。根据以上分析可知,系统包含家属用户、服务人员、家庭信息、服务类型、养老服务、预约信息、服务记录、健康记录、在线反馈、异常上报、排班信息等主要实体。李怡淼认为确定实体关系是保证系统数据一致性前提。全局E-R模型如图11所示18。

图11 全局ER图

  根据系统分析,系统的主要实体有:家属用户、服务人员、家庭信息、服务类型、养老服务、预约信息、服务记录、健康记录、在线反馈、异常上报,各个实体具体的属性如下图所示。

  (1)家属用户实体主要包括家属用户id、家属姓名、家属电话、家属性别等属性。如图12所示。

图12 家属用户实体属性图

  (2)服务人员实体主要包括服务人员id、人员姓名、人员年龄、人员性别等属性。如图13所示。

图13 服务人员实体属性图

  (3)家庭信息实体主要包括家庭信息id、老人姓名、老人年龄、老人性别、家属关系、家属用户等属性。如图14所示。

图14 家庭信息实体属性图

  (4)服务类型实体主要包括服务类型id、服务类型等属性。如图15所示。

图15 服务类型实体属性图

  (5)养老服务实体主要包括养老服务id、服务名称、服务类型、服务人员、服务价格等属性。如图16所示。

图16 养老服务实体属性图

  (6)预约信息实体主要包括预约信息id、服务名称、服务类型、服务人员、服务价格、家属用户、老人姓名、预约日期、审核状态、支付状态等属性。如图17所示。

图17 预约信息实体属性图

  (7)服务记录实体主要包括服务记录id、服务名称、服务类型、服务人员、家属用户、老人姓名、服务进度、记录日期等属性。如图18所示。

图18 服务记录实体属性图

  (8)健康记录实体主要包括健康记录id、服务人员、家属用户、老人姓名、老人血压、老人心率、老人血糖、记录日期等属性。如图19所示。

图19 健康记录实体属性图

  (9)在线反馈实体主要包括在线反馈id、标题名称、反馈类型、家属用户、反馈日期、反馈内容、审核状态等属性。如图20所示。

图20 在线反馈实体属性图

  (10)异常上报实体主要包括异常上报id、服务人员、人员姓名、上报日期、上报内容、审核状态等属性。如图21所示。

图21 异常上报实体属性图

3.2.2 数据库的逻辑结构设计

  家属用户表

  DependentsUsers(家属用户id,家属姓名,家属电话,家属性别,审核状态,用户ID,创建时间)

  说明:家属用户id是该关系模式的主码。用户ID作为外码关联用户账户表,建立家属用户与系统登录账户之间的对应关系。

  服务人员表

  说明:ServiceStaff(服务人员id,人员姓名,人员年龄,人员性别,资质证明,审核状态,用户ID,创建时间)

  说明:服务人员id是该关系模式的主码。用户ID作为外码关联用户账户表,实现服务人员信息与系统账户的统一管理。

  家庭信息表

  FamilyInformation(家庭信息id,老人姓名,老人年龄,老人性别,家属用户,家属关系,备注信息,创建时间)

  说明:家庭信息id是该关系模式的主码。家属用户作为外码关联家属用户表,建立老人信息与家属账户之间的关联关系。

  服务类型表

  ServiceType(服务类型id,服务类型,创建时间)

  说明:服务类型id是该关系模式的主码,服务类型字段用于区分不同类别的养老服务项目。

  养老服务表

  PensionService(养老服务id,服务名称,服务类型,封面图片,服务人员,服务价格,服务须知,服务内容,创建时间)

  说明:养老服务id是该关系模式的主码。服务类型作为外码关联服务类型表,服务人员作为外码关联服务人员表,实现服务项目与分类、负责人员的关联。

  预约信息表

  ReservationInformation(预约信息id,服务名称,服务类型,服务人员,服务价格,家属用户,老人姓名,预约方式,预约日期,预约备注,审核状态,支付状态,支付类型,创建时间)

  说明:预约信息id是该关系模式的主码。服务类型、服务人员、家属用户分别作为外码关联服务类型表、服务人员表、家属用户表,建立预约记录与相关实体的联系。

  服务记录表

  ServiceRecords(服务记录id,服务名称,服务类型,服务人员,家属用户,老人姓名,服务进度,记录日期,记录内容,创建时间)

  说明:服务记录id是该关系模式的主码。服务类型、服务人员、家属用户分别作为外码关联对应的实体表,记录已完成服务的执行情况。

  健康记录表

  说明:HealthRecords(健康记录id,服务人员,家属用户,老人姓名,老人血压,老人心率,老人血糖,记录日期,详情备注,创建时间)

  说明:健康记录id是该关系模式的主码。服务人员与家属用户作为外码分别关联服务人员表与家属用户表,建立健康监测数据与人员信息的关联。

  在线反馈表

  OnlineFeedback(在线反馈id,标题名称,反馈类型,家属用户,反馈日期,反馈内容,审核状态,审核回复,创建时间)

  说明:在线反馈id是该关系模式的主码。家属用户作为外码关联家属用户表,实现反馈信息与提交用户的关联追溯。

  异常上报表

  AbnormalReporting(异常上报id,服务人员,人员姓名,上报日期,上报内容,审核状态,审核回复,创建时间)

  说明:异常上报id是该关系模式的主码。服务人员作为外码关联服务人员表,建立异常上报记录与上报人员的关联关系。

  排班信息表

  ScheduleInformation(排班信息id,标题名称,上班时间,工作地点,排班人员,创建时间)

  说明:排班信息id是该关系模式的主码。排班人员字段存储服务人员的标识信息,用于安排值班任务。

3.2.3 数据库表的结构设计

  数据库逻辑模型把概念模型中实体转化成具体的表结构,用字段类型、约束条件和关联关系来实现数据的高效存取19。逻辑设计阶段主要关注数据完整性约束的设定,主键保证记录的唯一性,外键保证表之间的关联完整性,非空约束防止关键数据缺失。索引机制对高频查询字段进行优化,提高检索速度。系统各个表之间用外键建立数据链,用户删除时级联处理相关的记录,防止产生孤岛数据。以下为系统核心数据表的设计。

  (1)家属用户表主要是用来存储家属用户的基本信息。主要包括家属用户id、家属姓名、家属电话、家属性别等字段。如表1所示。

表1 家属用户表

序号 字段名 数据类型 长度 备注
1 家属用户id int 11 主键
2 家属姓名 varchar 64 家属姓名
3 家属电话 varchar 64 联系电话
4 家属性别 varchar 64 性别
5 审核状态 varchar 16 状态标识
6 用户ID int 11 关联用户账户
7 创建时间 timestamp - 记录生成时间

  (2)服务人员表主要是用来存储服务人员的基本信息。主要包括服务人员id、人员姓名、人员年龄、人员性别等字段。如表2所示。

表2 服务人员表

序号 字段名 数据类型 长度 备注
1 服务人员id int 11 主键
2 人员姓名 varchar 64 姓名
3 人员年龄 varchar 64 年龄
4 人员性别 varchar 64 性别
5 资质证明 varchar 255 证书材料
6 审核状态 varchar 16 状态标识
7 用户ID int 11 关联用户账户
8 创建时间 datetime - 记录生成时间

  (3)家庭信息表主要是用来存储老人的基本信息与家属关联关系。主要包括家庭信息id、老人姓名、老人年龄、老人性别、家属关系、家属用户等字段。如表3所示。

表3 家庭信息表

序号 字段名 数据类型 长度 备注
1 家庭信息id int 11 主键
2 老人姓名 varchar 64 姓名
3 老人年龄 varchar 64 年龄
4 老人性别 varchar 64 性别
5 家属用户 int 11 关联家属
6 家属关系 varchar 64 关系说明
7 备注信息 text - 补充说明
8 创建时间 datetime - 记录生成时间

  (4)服务类型表主要是用来存储养老服务的分类信息。主要包括服务类型id、服务类型等字段。如表4所示。

表4 服务类型表

序号 字段名 数据类型 长度 备注
1 服务类型id int 11 主键
2 服务类型 varchar 64 分类名称
3 创建时间 datetime - 记录生成时间

  (5)养老服务表主要是用来存储可供预约的服务项目信息。主要包括养老服务id、服务名称、服务类型、服务人员、服务价格等字段。如表5所示。

表5 养老服务表

序号 字段名 数据类型 长度 备注
1 养老服务id int 11 主键
2 服务名称 varchar 64 名称
3 服务类型 varchar 64 分类
4 封面图片 varchar 255 图片路径
5 服务人员 int 11 负责人员
6 服务价格 double 8 价格
7 服务须知 varchar 64 注意事项
8 服务内容 longtext - 详细说明
9 创建时间 datetime - 记录生成时间

  (6)预约信息表主要是用来存储家属提交的服务预约记录。主要包括预约信息id、服务名称、服务类型、服务人员、服务价格、家属用户、老人姓名、预约日期、审核状态、支付状态等字段。如表6所示。

表6 预约信息表

序号 字段名 数据类型 长度 备注
1 预约信息id int 11 主键
2 服务名称 varchar 64 预约服务
3 服务类型 varchar 64 服务分类
4 服务人员 int 11 服务人员
5 服务价格 double 8 费用
6 家属用户 int 11 预约家属
7 老人姓名 varchar 64 服务对象
8 预约日期 date - 服务日期
9 预约备注 text - 补充说明
10 审核状态 varchar 16 审核进度
11 支付状态 varchar 16 支付进度
12 创建时间 datetime - 记录生成时间

  (7)服务记录表主要是用来存储已完成服务的执行情况。主要包括服务记录id、服务名称、服务类型、服务人员、家属用户、老人姓名、服务进度、记录日期等字段。如表7所示。

表7 服务记录表

序号 字段名 数据类型 长度 备注
1 服务记录id int 11 主键
2 服务名称 varchar 64 服务项目
3 服务类型 varchar 64 分类
4 服务人员 int 11 执行人员
5 家属用户 int 11 关联家属
6 老人姓名 varchar 64 服务对象
7 服务进度 varchar 64 完成状态
8 记录日期 date - 执行日期
9 记录内容 text - 详情描述
10 创建时间 datetime - 记录生成时间

  (8)健康记录表主要是用来存储老人的健康监测数据。主要包括健康记录id、服务人员、家属用户、老人姓名、老人血压、老人心率、老人血糖、记录日期等字段。如表8所示。

表8 健康记录表

序号 字段名 数据类型 长度 备注
1 健康记录id int 11 主键
2 服务人员 int 11 测量人员
3 家属用户 int 11 关联家属
4 老人姓名 varchar 64 老人
5 老人血压 double 8 血压值
6 老人心率 double 8 心率值
7 老人血糖 double 8 血糖值
8 记录日期 date - 测量日期
9 详情备注 text - 补充说明
10 创建时间 datetime - 记录生成时间

  (9)在线反馈表主要是用来存储家属提交的意见建议信息。主要包括在线反馈id、标题名称、反馈类型、家属用户、反馈日期、反馈内容、审核状态等字段。如表9所示。

表9 在线反馈表

序号 字段名 数据类型 长度 备注
1 在线反馈id int 11 主键
2 标题名称 varchar 64 反馈主题
3 反馈类型 varchar 64 分类
4 家属用户 int 11 反馈人
5 反馈日期 date - 提交日期
6 反馈内容 text - 详细内容
7 审核状态 varchar 16 处理进度
8 审核回复 varchar 255 处理意见
9 创建时间 datetime - 记录生成时间

  (10)异常上报表主要是用来存储服务过程中出现的异常情况。主要包括异常上报id、服务人员、人员姓名、上报日期、上报内容、审核状态等字段。如表10所示。

表10 异常上报表

序号 字段名 数据类型 长度 备注
1 异常上报id int 11 主键
2 服务人员 int 11 上报人员
3 人员姓名 varchar 64 姓名
4 上报日期 date - 上报时间
5 上报内容 text - 异常描述
6 审核状态 varchar 16 处理进度
7 审核回复 varchar 255 处理意见
8 创建时间 datetime - 记录生成时间

4 系统详细设计

4.1 服务预约流程设计

  家属用户发起服务预约时,系统需完成服务信息确认、预约信息填写、审核状态跟踪三个环节。用户从养老服务列表中选择所需服务,系统展示服务详情后进入预约表单填写页面,用户需选择服务对象老人、设定预约日期并填写备注信息。提交预约申请后,系统将预约记录状态设为待审核,管理员审核通过后预约生效。服务预约流程图如图22所示。

图22服务预约流程图

4.2 订单支付流程设计

  家属用户完成服务预约后需在规定时间内完成订单支付。系统展示订单详情与应付金额,用户选择微信支付、支付宝或网银支付方式后跳转至支付网关。支付成功后系统更新订单状态,支付失败时允许用户重新发起支付或取消订单。订单支付流程图如图23所示。

图24订单支付流程图

4.3 异常上报流程设计

  服务人员在服务过程中发现异常情况时通过系统上报问题。系统记录上报内容、服务人员信息与上报时间,将上报记录状态设为待处理。管理员审核上报内容后填写处理意见并更新状态,服务人员可查看审核结果。异常上报流程图如图25所示。

图25异常上报流程图

4.4 健康记录管理流程设计

  服务人员定期为老人测量健康指标并录入系统。系统记录血压、心率、血糖等数据,将数据与老人档案关联存储。家属用户可在个人端查看健康记录,了解老人的健康变化趋势。健康记录管理流程图如图26所示。

图26健康记录管理流程图

4.5 排班信息管理流程设计

  管理员根据服务人员配置与预约情况制定排班计划。系统支持按日期、服务类型筛选查看排班情况,管理员可新增、修改或删除排班记录。排班计划确定后服务人员可在个人端查看值班安排。排班信息管理流程图如图27所示。

图27排班信息管理流程图

5 系统实现

5.1 管理员角色功能实现

系统用户管理

  系统用户管理模块主要是对家属用户与服务人员账户进行统一管理。管理员进入用户管理页面后,系统加载所有注册用户列表并展示用户的基本身份信息与所属角色类型。管理员可以通过筛选条件快速定位目标用户,选择某条用户记录后可以查看详情或修改账户状态。当需要删除用户时,系统弹出二次确认对话框避免误操作,确认后执行删除并将关联数据一并处理。系统用户管理界面如图22所示。

图22 系统用户管理界面

  系统用户管理功能主要代码如下。

  java

复制代码
@RestController

@RequestMapping("user")

public class UserController extends BaseController<User, UserService> {

@Autowired

public UserController(UserService service) {

  setService(service);

  }

  /**

  * 用户注册

  */

  @PostMapping("register")

  public Map<String, Object> signUp(@RequestBody User user) {

  Map<String, String> query = new HashMap<>();

  query.put("username", user.getUsername());

  List list = service.selectBaseList(service.select(query, new HashMap<>()));

  if (list.size() > 0) {

  return error(30000, "用户已存在");

  }

  Map<String,Object> map = JSON.parseObject(JSON.toJSONString(user));

复制代码
map.put("password", String.valueOf(map.get("password")));

service.insert(map);

return success(1);

  }

  /**

  * 用户登录

  */

复制代码
@PostMapping("login")

public Map&lt;String, Object&gt; login(@RequestBody Map&lt;String, String&gt; data) {

String username = data.get("username");

String password = data.get("password");

  Map<String, String> map = new HashMap<>();

  map.put("username", username);

  List resultList = service.selectBaseList(service.select(map, new HashMap<>()));

  if (resultList == null || resultList.size() <= 0) {

  return error(30000, "用户不存在");

  }

  User user = (User) resultList.get(0);

  if (user.getPassword().equals(password)) {

  String token = UUID.randomUUID().toString().replaceAll("-", "");

  JSONObject result = JSONObject.parseObject(JSONObject.toJSONString(user));

  result.put("token", token);

  return success(result);

  } else {

  return error(30000, "账号或密码不正确");

  }

  }

  }

5.1.1 用户家庭信息管理

  用户家庭信息管理模块主要就是对老人档案以及家属之间联系关系的管理。管理员查看家庭信息列表的时候可以按照老人姓名来查找,每一条记录都有老人的基本信息以及相关的家属账户。点击详情按钮就会显示出完整的家庭信息内容,也就是老人和家属之间的关系说明以及补充的备注信息。管理员发现信息有误后可以直接对老人档案信息进行修改更新。用户家庭信息管理界面如下图23所示。

图23 用户家庭信息管理界面

  用户家庭信息管理功能主要代码如下。

  java

复制代码
@RestController

@RequestMapping("/family_information")

public class FamilyInformationController extends BaseController&lt;FamilyInformation, FamilyInformationService&gt; {

  @Autowired

  public FamilyInformationController(FamilyInformationService service) {

  setService(service);

  }

  /**

  * 新增家庭信息

  */

  @PostMapping("/add")

  @Transactional

  public Map<String, Object> add(HttpServletRequest request) throws IOException {

  Map<String,Object> paramMap = service.readBody(request.getReader());

  paramMap.entrySet().removeIf(entry -> {

  Object value = entry.getValue();

  return value instanceof String && ((String) value).isEmpty();

  });

  FamilyInformation family_information = new FamilyInformation();

复制代码
family_information.setElders_name(paramMap.get("elders_name") == null ? null :

String.valueOf(paramMap.get("elders_name")));

family_information.setAge_of_the_elderly(paramMap.get("age_of_the_elderly") == null ? null :

String.valueOf(paramMap.get("age_of_the_elderly")));

family_information.setElderly_persons_gender(paramMap.get("elderly_persons_gender") == null ? null :

String.valueOf(paramMap.get("elderly_persons_gender")));

family_information.setDependents_users(paramMap.get("dependents_users") == null ? null :

Integer.valueOf(String.valueOf(paramMap.get("dependents_users"))));

family_information.setFamily_relationship(paramMap.get("family_relationship") == null ? null :

String.valueOf(paramMap.get("family_relationship")));

family_information.setNote_information(paramMap.get("note_information") == null ? null :

String.valueOf(paramMap.get("note_information")));

  this.addEntity(family_information);

  return success(1);

  }

  /**

  * 修改家庭信息

  */

  @PostMapping("/set")

  @Transactional

  public Map<String, Object> set(HttpServletRequest request) throws IOException {

  Map<String,String> queryMap = service.readQuery(request);

  Map<String,String> configMap = service.readConfig(request);

  Map<String,Object> paramMap = service.readBody(request.getReader());

  paramMap.entrySet().removeIf(entry -> {

  Object value = entry.getValue();

  return value instanceof String && ((String) value).isEmpty();

  });

  FamilyInformation family_information = new FamilyInformation();

复制代码
family_information.setElders_name(paramMap.get("elders_name") == null ? null :

String.valueOf(paramMap.get("elders_name")));

family_information.setAge_of_the_elderly(paramMap.get("age_of_the_elderly") == null ? null :

String.valueOf(paramMap.get("age_of_the_elderly")));

family_information.setElderly_persons_gender(paramMap.get("elderly_persons_gender") == null ? null :

String.valueOf(paramMap.get("elderly_persons_gender")));

family_information.setDependents_users(paramMap.get("dependents_users") == null ? null :

Integer.valueOf(String.valueOf(paramMap.get("dependents_users"))));

family_information.setFamily_relationship(paramMap.get("family_relationship") == null ? null :

String.valueOf(paramMap.get("family_relationship")));

family_information.setNote_information(paramMap.get("note_information") == null ? null :

String.valueOf(paramMap.get("note_information")));

  this.setEntity(queryMap, configMap, family_information);

  return success(1);

  }

  }

5.1.2 服务类型管理

  服务类型管理模块是对养老服务分类体系进行配置。管理员可以新增服务类型,输入类型名称之后系统就会自动生成创建时间和更新时间。服务类型列表可以按照名称进行搜索,每一行显示类型名称和时间信息。管理员可以对已经存在的类型进行编辑或者删除操作,删除之前系统会检查该类型是否被服务项目引用,防止因为删除而造成数据不一致。服务类型管理界面如下图24所示。

图24 服务类型管理界面

  服务类型管理功能主要代码如下。

  java

复制代码
@RestController

@RequestMapping("/service_type")

public class ServiceTypeController extends BaseController&lt;ServiceType, ServiceTypeService&gt; {

  @Autowired

  public ServiceTypeController(ServiceTypeService service) {

  setService(service);

  }

  /**

  * 新增服务类型

  */

  @PostMapping("/add")

  @Transactional

  public Map<String, Object> add(HttpServletRequest request) throws IOException {

  Map<String,Object> paramMap = service.readBody(request.getReader());

  paramMap.entrySet().removeIf(entry -> {

  Object value = entry.getValue();

  return value instanceof String && ((String) value).isEmpty();

  });

  ServiceType service_type = new ServiceType();

复制代码
service_type.setService_type(paramMap.get("service_type") == null ? null :

String.valueOf(paramMap.get("service_type")));

this.addEntity(service_type);

return success(1);

  }

  /**

  * 修改服务类型

  */

  @PostMapping("/set")

  @Transactional

  public Map<String, Object> set(HttpServletRequest request) throws IOException {

  Map<String,String> queryMap = service.readQuery(request);

  Map<String,String> configMap = service.readConfig(request);

  Map<String,Object> paramMap = service.readBody(request.getReader());

  paramMap.entrySet().removeIf(entry -> {

  Object value = entry.getValue();

  return value instanceof String && ((String) value).isEmpty();

  });

  ServiceType service_type = new ServiceType();

复制代码
service_type.setService_type(paramMap.get("service_type") == null ? null :

String.valueOf(paramMap.get("service_type")));

this.setEntity(queryMap, configMap, service_type);

return success(1);

  }

  }

5.3.1 养老服务管理

  养老服务管理模块主要对可预约服务项目进行维护。管理员可以添加新的服务项目,填写服务名称、选择服务类型、设定服务价格、编写服务须知和服务内容。现有的服务项目列表显示了基本信息,管理员可以查看并删除服务。服务项目的状态变更就会立刻对家属端服务列表的显示产生影响。养老服务管理界面图如图25所示。

图25 养老服务管理界面

  养老服务管理功能主要代码如下。

  java

复制代码
@RestController

@RequestMapping("/pension_service")

public class PensionServiceController extends BaseController&lt;PensionService, PensionServiceService&gt; {

  @Autowired

  public PensionServiceController(PensionServiceService service) {

  setService(service);

  }

  /**

  * 新增养老服务

  */

  @PostMapping("/add")

  @Transactional

  public Map<String, Object> add(HttpServletRequest request) throws IOException {

  Map<String,Object> paramMap = service.readBody(request.getReader());

  paramMap.entrySet().removeIf(entry -> {

  Object value = entry.getValue();

  return value instanceof String && ((String) value).isEmpty();

  });

  PensionService pension_service = new PensionService();

复制代码
pension_service.setService_name(paramMap.get("service_name") == null ? null :

String.valueOf(paramMap.get("service_name")));

pension_service.setService_type(paramMap.get("service_type") == null ? null :

String.valueOf(paramMap.get("service_type")));

pension_service.setCover_image(paramMap.get("cover_image") == null ? null :

String.valueOf(paramMap.get("cover_image")));

pension_service.setService_staff(paramMap.get("service_staff") == null ? null :

Integer.valueOf(String.valueOf(paramMap.get("service_staff"))));

pension_service.setService_prices(paramMap.get("service_prices") == null ? null :

Double.valueOf(String.valueOf(paramMap.get("service_prices"))));

pension_service.setService_instructions(paramMap.get("service_instructions") == null ? null :

String.valueOf(paramMap.get("service_instructions")));

pension_service.setService_content(paramMap.get("service_content") == null ? null :

String.valueOf(paramMap.get("service_content")));

  this.addEntity(pension_service);

  return success(1);

  }

  /**

  * 修改养老服务

  */

  @PostMapping("/set")

  @Transactional

  public Map<String, Object> set(HttpServletRequest request) throws IOException {

  Map<String,String> queryMap = service.readQuery(request);

  Map<String,String> configMap = service.readConfig(request);

  Map<String,Object> paramMap = service.readBody(request.getReader());

  paramMap.entrySet().removeIf(entry -> {

  Object value = entry.getValue();

  return value instanceof String && ((String) value).isEmpty();

  });

  PensionService pension_service = new PensionService();

复制代码
pension_service.setService_name(paramMap.get("service_name") == null ? null :

String.valueOf(paramMap.get("service_name")));

pension_service.setService_type(paramMap.get("service_type") == null ? null :

String.valueOf(paramMap.get("service_type")));

pension_service.setCover_image(paramMap.get("cover_image") == null ? null :

String.valueOf(paramMap.get("cover_image")));

pension_service.setService_staff(paramMap.get("service_staff") == null ? null :

Integer.valueOf(String.valueOf(paramMap.get("service_staff"))));

pension_service.setService_prices(paramMap.get("service_prices") == null ? null :

Double.valueOf(String.valueOf(paramMap.get("service_prices"))));

pension_service.setService_instructions(paramMap.get("service_instructions") == null ? null :

String.valueOf(paramMap.get("service_instructions")));

pension_service.setService_content(paramMap.get("service_content") == null ? null :

String.valueOf(paramMap.get("service_content")));

  this.setEntity(queryMap, configMap, pension_service);

  return success(1);

  }

  }

5.3.2 预约信息管理

  预约信息管理模块主要是对家属提交的预约申请进行审核。管理员进入预约列表之后可以根据服务名称、服务类型、审核状态等条件进行筛选。选择需要审核的预约,系统会显示预约服务内容、预约时间、家属信息、老人信息。管理员确认无误之后通过审核,预约状态变为已通过;如果预约不符合条件可以填写意见后驳回。预约信息管理界面如图26所示。

图26 预约信息管理界面

  预约信息管理功能主要代码如下。

  java

复制代码
@RestController

@RequestMapping("/reservation_information")

public class ReservationInformationController extends BaseController&lt;ReservationInformation, ReservationInformationService&gt; {

  @Autowired

  public ReservationInformationController(ReservationInformationService service) {

  setService(service);

  }

  /**

  * 修改审核状态

  */

  @Transactional

复制代码
@GetMapping("/update_examine_state")

public String updateExamineState(Long id, String newState) throws IOException {

if (!newState.equals("未审核") &amp;&amp; !newState.equals("已通过") &amp;&amp; !newState.equals("未通过")) {

  return "非法的审核状态";

  }

  Map<String,String> queryMap = new HashMap<>();

  queryMap.put("id", String.valueOf(id));

  ReservationInformation reservation = service.findOne(queryMap);

复制代码
if (reservation != null) {

reservation.setExamine_state(newState);

this.setEntity(queryMap, new HashMap&lt;&gt;(), reservation);

return "审核成功";

  } else {

  return "审核失败:记录不存在";

  }

  }

  /**

  * 修改支付状态

  */

  @Transactional

复制代码
@GetMapping("/update_pay_state")

public String updatePayState(Long id, String newState) throws IOException {

if (!newState.equals("未支付") &amp;&amp; !newState.equals("已支付")) {

  return "非法的支付状态";

  }

  Map<String,String> queryMap = new HashMap<>();

  queryMap.put("id", String.valueOf(id));

  ReservationInformation reservation = service.findOne(queryMap);

复制代码
if (reservation != null) {

reservation.setPay_state(newState);

this.setEntity(queryMap, new HashMap&lt;&gt;(), reservation);

return "支付成功";

  } else {

  return "支付失败:记录不存在";

  }

  }

  }

5.1.5 服务记录管理

  服务记录管理模块是对已经完成的养老服务进行归档查阅。管理员可以按照服务名称或者服务类型来检索历史服务记录,列表显示服务执行情况以及相关家属用户的个人信息。点击详情可以查看完整的服务过程描述和服务进度状态。系统可以将服务记录导出,方便管理员对统计数据进行统计、核算。服务记录管理界面如下图27所示。

图27 服务记录管理界面

  服务记录管理功能主要代码如下。

  java

复制代码
@RestController

@RequestMapping("/service_records")

public class ServiceRecordsController extends BaseController&lt;ServiceRecords, ServiceRecordsService&gt; {

  @Autowired

  public ServiceRecordsController(ServiceRecordsService service) {

  setService(service);

  }

  /**

  * 新增服务记录

  */

  @PostMapping("/add")

  @Transactional

  public Map<String, Object> add(HttpServletRequest request) throws IOException {

  Map<String,Object> paramMap = service.readBody(request.getReader());

  paramMap.entrySet().removeIf(entry -> {

  Object value = entry.getValue();

  return value instanceof String && ((String) value).isEmpty();

  });

  ServiceRecords service_records = new ServiceRecords();

复制代码
service_records.setService_name(paramMap.get("service_name") == null ? null :

String.valueOf(paramMap.get("service_name")));

service_records.setService_type(paramMap.get("service_type") == null ? null :

String.valueOf(paramMap.get("service_type")));

service_records.setService_staff(paramMap.get("service_staff") == null ? null :

Integer.valueOf(String.valueOf(paramMap.get("service_staff"))));

service_records.setFamily_member_user(paramMap.get("family_member_user") == null ? null :

Integer.valueOf(String.valueOf(paramMap.get("family_member_user"))));

service_records.setElders_name(paramMap.get("elders_name") == null ? null :

String.valueOf(paramMap.get("elders_name")));

service_records.setService_progress(paramMap.get("service_progress") == null ? null :

String.valueOf(paramMap.get("service_progress")));

  if (paramMap.get("record_date") != null &&

  !StringUtils.isEmpty(String.valueOf(paramMap.get("record_date")))) {

  String timStr = String.valueOf(paramMap.get("record_date"));

  service_records.setRecord_date(parseToTimestamp(timStr));

  }

  service_records.setRecord_content(paramMap.get("record_content") == null ? null :

  String.valueOf(paramMap.get("record_content")));

  this.addEntity(service_records);

  return success(1);

  }

  /**

  * 修改服务记录

  */

  @PostMapping("/set")

  @Transactional

  public Map<String, Object> set(HttpServletRequest request) throws IOException {

  Map<String,String> queryMap = service.readQuery(request);

  Map<String,String> configMap = service.readConfig(request);

  Map<String,Object> paramMap = service.readBody(request.getReader());

  paramMap.entrySet().removeIf(entry -> {

  Object value = entry.getValue();

  return value instanceof String && ((String) value).isEmpty();

  });

  ServiceRecords service_records = new ServiceRecords();

复制代码
service_records.setService_name(paramMap.get("service_name") == null ? null :

String.valueOf(paramMap.get("service_name")));

service_records.setService_type(paramMap.get("service_type") == null ? null :

String.valueOf(paramMap.get("service_type")));

service_records.setService_staff(paramMap.get("service_staff") == null ? null :

Integer.valueOf(String.valueOf(paramMap.get("service_staff"))));

service_records.setFamily_member_user(paramMap.get("family_member_user") == null ? null :

Integer.valueOf(String.valueOf(paramMap.get("family_member_user"))));

service_records.setElders_name(paramMap.get("elders_name") == null ? null :

String.valueOf(paramMap.get("elders_name")));

service_records.setService_progress(paramMap.get("service_progress") == null ? null :

String.valueOf(paramMap.get("service_progress")));

  if (paramMap.get("record_date") != null &&

  !StringUtils.isEmpty(String.valueOf(paramMap.get("record_date")))) {

  String timStr = String.valueOf(paramMap.get("record_date"));

  service_records.setRecord_date(parseToTimestamp(timStr));

  }

  service_records.setRecord_content(paramMap.get("record_content") == null ? null :

  String.valueOf(paramMap.get("record_content")));

  this.setEntity(queryMap, configMap, service_records);

  return success(1);

  }

  }

5.1.6 健康记录管理

  健康记录管理模块是对老人健康监测数据进行统一管理的模块。管理员可以根据老人姓名或者记录日期范围来筛选健康记录,列表显示老人的血压、心率、血糖等主要指标。系统有数据分析功能,可以生成健康趋势图供管理员使用。管理员可以对异常数据进行标注,提醒家属注意。健康记录管理界面如图28所示。

图28 健康记录管理界面

  健康记录管理功能主要代码如下。

  java

复制代码
@RestController

@RequestMapping("/health_records")

public class HealthRecordsController extends BaseController&lt;HealthRecords, HealthRecordsService&gt; {

  @Autowired

  public HealthRecordsController(HealthRecordsService service) {

  setService(service);

  }

  /**

  * 新增健康记录

  */

  @PostMapping("/add")

  @Transactional

  public Map<String, Object> add(HttpServletRequest request) throws IOException {

  Map<String,Object> paramMap = service.readBody(request.getReader());

  paramMap.entrySet().removeIf(entry -> {

  Object value = entry.getValue();

  return value instanceof String && ((String) value).isEmpty();

  });

  HealthRecords health_records = new HealthRecords();

复制代码
health_records.setService_staff(paramMap.get("service_staff") == null ? null :

Integer.valueOf(String.valueOf(paramMap.get("service_staff"))));

health_records.setFamily_member_user(paramMap.get("family_member_user") == null ? null :

Integer.valueOf(String.valueOf(paramMap.get("family_member_user"))));

health_records.setElders_name(paramMap.get("elders_name") == null ? null :

String.valueOf(paramMap.get("elders_name")));

health_records.setElderly_blood_pressure(paramMap.get("elderly_blood_pressure") == null ? null :

Double.valueOf(String.valueOf(paramMap.get("elderly_blood_pressure"))));

health_records.setElderly_heart_rate(paramMap.get("elderly_heart_rate") == null ? null :

Double.valueOf(String.valueOf(paramMap.get("elderly_heart_rate"))));

health_records.setBlood_sugar_of_the_elderly(paramMap.get("blood_sugar_of_the_elderly") == null ? null :

Double.valueOf(String.valueOf(paramMap.get("blood_sugar_of_the_elderly"))));

  if (paramMap.get("record_date") != null &&

  !StringUtils.isEmpty(String.valueOf(paramMap.get("record_date")))) {

  String timStr = String.valueOf(paramMap.get("record_date"));

  health_records.setRecord_date(parseToTimestamp(timStr));

  }

  health_records.setSpecificssremarks(paramMap.get("specificssremarks") == null ? null :

  String.valueOf(paramMap.get("specificssremarks")));

  this.addEntity(health_records);

  return success(1);

  }

  /**

  * 修改健康记录

  */

  @PostMapping("/set")

  @Transactional

  public Map<String, Object> set(HttpServletRequest request) throws IOException {

  Map<String,String> queryMap = service.readQuery(request);

  Map<String,String> configMap = service.readConfig(request);

  Map<String,Object> paramMap = service.readBody(request.getReader());

  paramMap.entrySet().removeIf(entry -> {

  Object value = entry.getValue();

  return value instanceof String && ((String) value).isEmpty();

  });

  HealthRecords health_records = new HealthRecords();

复制代码
health_records.setService_staff(paramMap.get("service_staff") == null ? null :

Integer.valueOf(String.valueOf(paramMap.get("service_staff"))));

health_records.setFamily_member_user(paramMap.get("family_member_user") == null ? null :

Integer.valueOf(String.valueOf(paramMap.get("family_member_user"))));

health_records.setElders_name(paramMap.get("elders_name") == null ? null :

String.valueOf(paramMap.get("elders_name")));

health_records.setElderly_blood_pressure(paramMap.get("elderly_blood_pressure") == null ? null :

Double.valueOf(String.valueOf(paramMap.get("elderly_blood_pressure"))));

health_records.setElderly_heart_rate(paramMap.get("elderly_heart_rate") == null ? null :

Double.valueOf(String.valueOf(paramMap.get("elderly_heart_rate"))));

health_records.setBlood_sugar_of_the_elderly(paramMap.get("blood_sugar_of_the_elderly") == null ? null :

Double.valueOf(String.valueOf(paramMap.get("blood_sugar_of_the_elderly"))));

  if (paramMap.get("record_date") != null &&

  !StringUtils.isEmpty(String.valueOf(paramMap.get("record_date")))) {

  String timStr = String.valueOf(paramMap.get("record_date"));

  health_records.setRecord_date(parseToTimestamp(timStr));

  }

  health_records.setSpecificssremarks(paramMap.get("specificssremarks") == null ? null :

  String.valueOf(paramMap.get("specificssremarks")));

  this.setEntity(queryMap, configMap, health_records);

  return success(1);

  }

  }

5.1.7 在线反馈管理

  在线反馈管理模块主要是对家属提出的建议意见进行处理。管理员进入反馈列表之后可以按照标题、反馈类型、审核状态等条件进行筛选。选择要处理的反馈可以查看详细信息,管理员阅读后填写回复意见并修改审核状态。处理过的反馈家属端可以查看回复内容。在线反馈管理界面如图29所示。

图29 在线反馈管理界面

  在线反馈管理功能主要代码如下。

  java

复制代码
@RestController

@RequestMapping("/online_feedback")

public class OnlineFeedbackController extends BaseController&lt;OnlineFeedback, OnlineFeedbackService&gt; {

  @Autowired

  public OnlineFeedbackController(OnlineFeedbackService service) {

  setService(service);

  }

  /**

  * 新增在线反馈

  */

  @PostMapping("/add")

  @Transactional

  public Map<String, Object> add(HttpServletRequest request) throws IOException {

  Map<String,Object> paramMap = service.readBody(request.getReader());

  paramMap.entrySet().removeIf(entry -> {

  Object value = entry.getValue();

  return value instanceof String && ((String) value).isEmpty();

  });

  OnlineFeedback online_feedback = new OnlineFeedback();

复制代码
online_feedback.setTitle_name(paramMap.get("title_name") == null ? null :

String.valueOf(paramMap.get("title_name")));

online_feedback.setType_of_feedback(paramMap.get("type_of_feedback") == null ? null :

String.valueOf(paramMap.get("type_of_feedback")));

online_feedback.setFamily_member_user(paramMap.get("family_member_user") == null ? null :

Integer.valueOf(String.valueOf(paramMap.get("family_member_user"))));

  if (paramMap.get("feedback_date") != null &&

  !StringUtils.isEmpty(String.valueOf(paramMap.get("feedback_date")))) {

  String timStr = String.valueOf(paramMap.get("feedback_date"));

  online_feedback.setFeedback_date(parseToTimestamp(timStr));

  }

复制代码
online_feedback.setFeedback_content(paramMap.get("feedback_content") == null ? null :

String.valueOf(paramMap.get("feedback_content")));

online_feedback.setExamine_state("未审核");

  this.addEntity(online_feedback);

  return success(1);

  }

  /**

  * 修改审核状态

  */

  @Transactional

复制代码
@GetMapping("/update_examine_state")

public String updateExamineState(Long id, String newState) throws IOException {

if (!newState.equals("未审核") &amp;&amp; !newState.equals("已通过") &amp;&amp; !newState.equals("未通过")) {

  return "非法的审核状态";

  }

  Map<String,String> queryMap = new HashMap<>();

  queryMap.put("id", String.valueOf(id));

  OnlineFeedback feedback = service.findOne(queryMap);

复制代码
if (feedback != null) {

feedback.setExamine_state(newState);

this.setEntity(queryMap, new HashMap&lt;&gt;(), feedback);

return "审核成功";

  } else {

  return "审核失败:记录不存在";

  }

  }

  }

5.3.3 异常上报管理

  异常上报管理模块是对服务人员上报的异常情况作出处理。管理员可以根据上报日期或者审核状态来筛选上报记录,列表显示上报人员、上报日期和上报内容摘要。进入详情页可以看到完整的上报信息,管理员填写审核意见并确认之后,状态就会被修改。异常上报管理界面如下图30所示。

图30 异常上报管理界面

  异常上报管理功能主要代码如下。

  java

复制代码
@RestController

@RequestMapping("/abnormal_reporting")

public class AbnormalReportingController extends BaseController&lt;AbnormalReporting, AbnormalReportingService&gt; {

  @Autowired

  public AbnormalReportingController(AbnormalReportingService service) {

  setService(service);

  }

  /**

  * 新增异常上报

  */

  @PostMapping("/add")

  @Transactional

  public Map<String, Object> add(HttpServletRequest request) throws IOException {

  Map<String,Object> paramMap = service.readBody(request.getReader());

  paramMap.entrySet().removeIf(entry -> {

  Object value = entry.getValue();

  return value instanceof String && ((String) value).isEmpty();

  });

  AbnormalReporting abnormal = new AbnormalReporting();

复制代码
abnormal.setService_staff(paramMap.get("service_staff") == null ? null :

Integer.valueOf(String.valueOf(paramMap.get("service_staff"))));

abnormal.setName_of_personnel(paramMap.get("name_of_personnel") == null ? null :

String.valueOf(paramMap.get("name_of_personnel")));

  if (paramMap.get("date_of_report") != null &&

  !StringUtils.isEmpty(String.valueOf(paramMap.get("date_of_report")))) {

  String timStr = String.valueOf(paramMap.get("date_of_report"));

  abnormal.setDate_of_report(parseToTimestamp(timStr));

  }

复制代码
abnormal.setReporting_content(paramMap.get("reporting_content") == null ? null :

String.valueOf(paramMap.get("reporting_content")));

abnormal.setExamine_state("未审核");

  this.addEntity(abnormal);

  return success(1);

  }

  /**

  * 修改审核状态

  */

  @Transactional

复制代码
@GetMapping("/update_examine_state")

public String updateExamineState(Long id, String newState) throws IOException {

if (!newState.equals("未审核") &amp;&amp; !newState.equals("已通过") &amp;&amp; !newState.equals("未通过")) {

  return "非法的审核状态";

  }

  Map<String,String> queryMap = new HashMap<>();

  queryMap.put("id", String.valueOf(id));

  AbnormalReporting abnormal = service.findOne(queryMap);

复制代码
if (abnormal != null) {

abnormal.setExamine_state(newState);

this.setEntity(queryMap, new HashMap&lt;&gt;(), abnormal);

return "审核成功";

  } else {

  return "审核失败:记录不存在";

  }

  }

  }

5.1.9 排班信息管理

  排班信息管理模块主要是对服务人员的值班安排进行设置。管理员可以新增排班记录,填写标题名称、上班时间、上班地点、排班人员。已有的排班记录以列表形式显示出来,可以按照标题名称进行检索。管理员可以对排班进行编辑或者删除,排班变更之后服务人员端就会立即显示最新的安排。排班信息管理界面如下图31所示。

​编辑 图31 排班信息管理界面

  排班信息管理功能主要代码如下。

  java

复制代码
@RestController

@RequestMapping("/schedule_information")

public class ScheduleInformationController extends BaseController&lt;ScheduleInformation, ScheduleInformationService&gt; {

  @Autowired

  public ScheduleInformationController(ScheduleInformationService service) {

  setService(service);

  }

  /**

  * 新增排班信息

  */

  @PostMapping("/add")

  @Transactional

  public Map<String, Object> add(HttpServletRequest request) throws IOException {

  Map<String,Object> paramMap = service.readBody(request.getReader());

  paramMap.entrySet().removeIf(entry -> {

  Object value = entry.getValue();

  return value instanceof String && ((String) value).isEmpty();

  });

  ScheduleInformation schedule = new ScheduleInformation();

复制代码
schedule.setTitle_name(paramMap.get("title_name") == null ? null :

String.valueOf(paramMap.get("title_name")));

schedule.setWorking_time(paramMap.get("working_time") == null ? null :

String.valueOf(paramMap.get("working_time")));

schedule.setWork_location(paramMap.get("work_location") == null ? null :

String.valueOf(paramMap.get("work_location")));

schedule.setShift_scheduling_personnel(paramMap.get("shift_scheduling_personnel") == null ? null :

String.valueOf(paramMap.get("shift_scheduling_personnel")));

  this.addEntity(schedule);

  return success(1);

  }

  /**

  * 修改排班信息

  */

  @PostMapping("/set")

  @Transactional

  public Map<String, Object> set(HttpServletRequest request) throws IOException {

  Map<String,String> queryMap = service.readQuery(request);

  Map<String,String> configMap = service.readConfig(request);

  Map<String,Object> paramMap = service.readBody(request.getReader());

  paramMap.entrySet().removeIf(entry -> {

  Object value = entry.getValue();

  return value instanceof String && ((String) value).isEmpty();

  });

  ScheduleInformation schedule = new ScheduleInformation();

复制代码
schedule.setTitle_name(paramMap.get("title_name") == null ? null :

String.valueOf(paramMap.get("title_name")));

schedule.setWorking_time(paramMap.get("working_time") == null ? null :

String.valueOf(paramMap.get("working_time")));

schedule.setWork_location(paramMap.get("work_location") == null ? null :

String.valueOf(paramMap.get("work_location")));

schedule.setShift_scheduling_personnel(paramMap.get("shift_scheduling_personnel") == null ? null :

String.valueOf(paramMap.get("shift_scheduling_personnel")));

  this.setEntity(queryMap, configMap, schedule);

  return success(1);

  }

  }

5.2 家属用户角色功能实现

5.2.1 养老服务查看

  养老服务查看模块主要给家属用户提供服务项目浏览、检索的功能。家属进入养老服务页面之后,就会出现所有的可预约服务项目卡片,卡片中显示的是各个服务项目的名字、服务种类和大致的价格。用户可以利用服务名称输入框或者服务类型下拉框来对服务进行筛选,系统会按照输入的条件对列表进行实时过滤。点击卡片可以进入详情页面查看全部的服务内容和服务须知说明。养老服务查看界面如图32所示。

图32 养老服务查看界面

  养老服务查看功能主要代码如下。

  java

复制代码
@RestController

@RequestMapping("/pension_service")

public class PensionServiceController extends BaseController&lt;PensionService, PensionServiceService&gt; {

  @Autowired

  public PensionServiceController(PensionServiceService service) {

  setService(service);

  }

  /**

  * 获取服务列表(支持分页和筛选)

  */

  @RequestMapping("/get_list")

  public Map<String, Object> getList(HttpServletRequest request) {

  Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));

  return success(map);

  }

  /**

  * 获取服务详情

  */

  @RequestMapping("/get_obj")

  public Map<String, Object> obj(HttpServletRequest request) {

  Map<String, String> query = service.readQuery(request);

  Map<String, String> config = service.readConfig(request);

  List resultList = service.selectBaseList(service.select(query, config));

  if (resultList.size() > 0) {

  JSONObject jsonObject = new JSONObject();

  jsonObject.put("obj", resultList.get(0));

  return success(jsonObject);

  } else {

  return success(null);

  }

  }

  }

5.2.2 服务预约

  服务预约模块主要是给家属用户提供预约申请提交的功能。家属在服务详情页点击预约按钮后进入到预约表单页面,系统会自动把服务名称、服务类型、服务人员和服务价格等信息填入表单中。用户需要输入本次服务对应的老人姓名,如果家庭信息里没有添加老人,则需要先进行老人信息的录入。用户输入预约的日期、备注之后提交预约申请,管理员审核后将预约记录反馈给用户。服务预约界面如下图33所示。

图33 服务预约界面

  服务预约功能主要代码如下。

  java

复制代码
@RestController

@RequestMapping("/reservation_information")

public class ReservationInformationController extends BaseController&lt;ReservationInformation, ReservationInformationService&gt; {

  @Autowired

  public ReservationInformationController(ReservationInformationService service) {

  setService(service);

  }

  /**

  * 新增预约信息

  */

  @PostMapping("/add")

  @Transactional

  public Map<String, Object> add(HttpServletRequest request) throws IOException {

  Map<String,Object> paramMap = service.readBody(request.getReader());

  paramMap.entrySet().removeIf(entry -> {

  Object value = entry.getValue();

  return value instanceof String && ((String) value).isEmpty();

  });

  ReservationInformation reservation = new ReservationInformation();

复制代码
reservation.setService_name(paramMap.get("service_name") == null ? null :

String.valueOf(paramMap.get("service_name")));

reservation.setService_type(paramMap.get("service_type") == null ? null :

String.valueOf(paramMap.get("service_type")));

reservation.setService_staff(paramMap.get("service_staff") == null ? null :

Integer.valueOf(String.valueOf(paramMap.get("service_staff"))));

reservation.setService_prices(paramMap.get("service_prices") == null ? null :

Double.valueOf(String.valueOf(paramMap.get("service_prices"))));

reservation.setFamily_member_user(paramMap.get("family_member_user") == null ? null :

Integer.valueOf(String.valueOf(paramMap.get("family_member_user"))));

reservation.setElders_name(paramMap.get("elders_name") == null ? null :

String.valueOf(paramMap.get("elders_name")));

reservation.setAppointment_method(paramMap.get("appointment_method") == null ? null :

String.valueOf(paramMap.get("appointment_method")));

  if (paramMap.get("appointment_date") != null &&

  !StringUtils.isEmpty(String.valueOf(paramMap.get("appointment_date")))) {

  String timStr = String.valueOf(paramMap.get("appointment_date"));

  reservation.setAppointment_date(parseToTimestamp(timStr));

  }

复制代码
reservation.setAppointment_remarks(paramMap.get("appointment_remarks") == null ? null :

String.valueOf(paramMap.get("appointment_remarks")));

reservation.setExamine_state("未审核");

reservation.setPay_state("未支付");

  this.addEntity(reservation);

  return success(1);

  }

  }

5.2.3 订单支付

  订单支付模块主要是给家属用户预约订单提供支付功能。预约申请审核通过之后订单状态变为待支付,家属进入订单页面可以查看待支付订单列表。订单选好后系统会显示出服务名称、服务人员、预约日期、订单金额等信息。用户可以选择微信支付、支付宝或者网银支付方式,确认之后就跳转到支付网关进行支付。支付成功之后,订单状态变为已支付。订单支付界面如图34所示。

图34 订单支付界面

  订单支付功能主要代码如下。

  java

复制代码
@RestController

@RequestMapping("/reservation_information")

public class ReservationInformationController extends BaseController&lt;ReservationInformation, ReservationInformationService&gt; {

  /**

  * 修改支付状态

  */

  @Transactional

复制代码
@GetMapping("/update_pay_state")

public String updatePayState(Long id, String newState) throws IOException {

if (!newState.equals("未支付") &amp;&amp; !newState.equals("已支付")) {

  return "非法的支付状态";

  }

  Map<String,String> queryMap = new HashMap<>();

  queryMap.put("id", String.valueOf(id));

  ReservationInformation reservation = service.findOne(queryMap);

复制代码
if (reservation != null) {

reservation.setPay_state(newState);

this.setEntity(queryMap, new HashMap&lt;&gt;(), reservation);

return "支付成功";

  } else {

  return "支付失败:记录不存在";

  }

  }

  }

5.2.4 个人家庭信息管理

  个人家庭信息管理模块主要用来保存家属用户的老人档案信息。家属可以查看已经添加好的老人信息列表,每条记录包括老人姓名、年龄、性别和家属关系。需要新增老人信息时填写老人基本资料和备注信息后保存。已经存在的老人信息可以进行编辑和删除,删除之前系统会确认是否和未完成的服务预约有关联。个人家庭信息管理界面如下图35所示。

图35 个人家庭信息管理界面

  个人家庭信息管理功能主要代码如下。

  java

复制代码
@RestController

@RequestMapping("/family_information")

public class FamilyInformationController extends BaseController&lt;FamilyInformation, FamilyInformationService&gt; {

  @Autowired

  public FamilyInformationController(FamilyInformationService service) {

  setService(service);

  }

  /**

  * 新增家庭信息

  */

  @PostMapping("/add")

  @Transactional

  public Map<String, Object> add(HttpServletRequest request) throws IOException {

  Map<String,Object> paramMap = service.readBody(request.getReader());

  paramMap.entrySet().removeIf(entry -> {

  Object value = entry.getValue();

  return value instanceof String && ((String) value).isEmpty();

  });

  FamilyInformation family_information = new FamilyInformation();

复制代码
family_information.setElders_name(paramMap.get("elders_name") == null ? null :

String.valueOf(paramMap.get("elders_name")));

family_information.setAge_of_the_elderly(paramMap.get("age_of_the_elderly") == null ? null :

String.valueOf(paramMap.get("age_of_the_elderly")));

family_information.setElderly_persons_gender(paramMap.get("elderly_persons_gender") == null ? null :

String.valueOf(paramMap.get("elderly_persons_gender")));

family_information.setDependents_users(paramMap.get("dependents_users") == null ? null :

Integer.valueOf(String.valueOf(paramMap.get("dependents_users"))));

family_information.setFamily_relationship(paramMap.get("family_relationship") == null ? null :

String.valueOf(paramMap.get("family_relationship")));

family_information.setNote_information(paramMap.get("note_information") == null ? null :

String.valueOf(paramMap.get("note_information")));

  this.addEntity(family_information);

  return success(1);

  }

  /**

  * 修改家庭信息

  */

  @PostMapping("/set")

  @Transactional

  public Map<String, Object> set(HttpServletRequest request) throws IOException {

  Map<String,String> queryMap = service.readQuery(request);

  Map<String,String> configMap = service.readConfig(request);

  Map<String,Object> paramMap = service.readBody(request.getReader());

  paramMap.entrySet().removeIf(entry -> {

  Object value = entry.getValue();

  return value instanceof String && ((String) value).isEmpty();

  });

  FamilyInformation family_information = new FamilyInformation();

复制代码
family_information.setElders_name(paramMap.get("elders_name") == null ? null :

String.valueOf(paramMap.get("elders_name")));

family_information.setAge_of_the_elderly(paramMap.get("age_of_the_elderly") == null ? null :

String.valueOf(paramMap.get("age_of_the_elderly")));

family_information.setElderly_persons_gender(paramMap.get("elderly_persons_gender") == null ? null :

String.valueOf(paramMap.get("elderly_persons_gender")));

family_information.setDependents_users(paramMap.get("dependents_users") == null ? null :

Integer.valueOf(String.valueOf(paramMap.get("dependents_users"))));

family_information.setFamily_relationship(paramMap.get("family_relationship") == null ? null :

String.valueOf(paramMap.get("family_relationship")));

family_information.setNote_information(paramMap.get("note_information") == null ? null :

String.valueOf(paramMap.get("note_information")));

  this.setEntity(queryMap, configMap, family_information);

  return success(1);

  }

  /**

  * 删除家庭信息

  */

  @RequestMapping(value = "/del")

  @Transactional

  public Map<String, Object> del(HttpServletRequest request) {

  Map<String, String> query = service.readQuery(request);

  Map<String, String> config = service.readConfig(request);

  this.service.delete(query, config);

  return success(1);

  }

  }

5.2.5 预约信息查看

  预约信息查看模块主要是给家属用户提供预约申请处理进度的查询功能。家属进入预约列表之后可以按照服务名称、服务种类、审核情况、支付状况等要素来挑选记录。以列表的形式展示预约服务的信息和预约的日期,可以查看到当前的审核状态以及支付情况。未审核的预约可以取消申请,已经完成的预约可以进行服务评价。预约信息查看界面如下图36所示。

图36 预约信息查看界面

  预约信息查看功能主要代码如下。

  java

复制代码
@RestController

@RequestMapping("/reservation_information")

public class ReservationInformationController extends BaseController&lt;ReservationInformation, ReservationInformationService&gt; {

  @Autowired

  public ReservationInformationController(ReservationInformationService service) {

  setService(service);

  }

  /**

  * 获取预约信息列表(支持分页和筛选)

  */

  @RequestMapping("/get_list")

  public Map<String, Object> getList(HttpServletRequest request) {

  Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));

  return success(map);

  }

  /**

  * 获取预约信息详情

  */

  @RequestMapping("/get_obj")

  public Map<String, Object> obj(HttpServletRequest request) {

  Map<String, String> query = service.readQuery(request);

  Map<String, String> config = service.readConfig(request);

  List resultList = service.selectBaseList(service.select(query, config));

  if (resultList.size() > 0) {

  JSONObject jsonObject = new JSONObject();

  jsonObject.put("obj", resultList.get(0));

  return success(jsonObject);

  } else {

  return success(null);

  }

  }

  /**

  * 删除预约信息(取消预约)

  */

  @RequestMapping(value = "/del")

  @Transactional

  public Map<String, Object> del(HttpServletRequest request) {

  Map<String, String> query = service.readQuery(request);

  Map<String, String> config = service.readConfig(request);

  this.service.delete(query, config);

  return success(1);

  }

  }

5.2.6 服务记录查看

  服务记录查看模块是给家属用户提供查阅历史服务执行情况的入口。家属进入服务记录页面后可以按照服务名称或者服务类型检索已经完成的服务记录,列表中包含服务名称、服务类型、服务人员、服务对象和服务进度信息。点击详情按钮可以查看服务记录的详细信息及服务过程说明,掌握服务全部执行情况。服务记录查看界面如下图37所示。

图37 服务记录查看界面

  服务记录查看功能主要代码如下。

  java

复制代码
@RestController

@RequestMapping("/service_records")

public class ServiceRecordsController extends BaseController&lt;ServiceRecords, ServiceRecordsService&gt; {

  @Autowired

  public ServiceRecordsController(ServiceRecordsService service) {

  setService(service);

  }

  /**

  * 获取服务记录列表(支持分页和筛选)

  */

  @RequestMapping("/get_list")

  public Map<String, Object> getList(HttpServletRequest request) {

  Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));

  return success(map);

  }

  /**

  * 获取服务记录详情

  */

  @RequestMapping("/get_obj")

  public Map<String, Object> obj(HttpServletRequest request) {

  Map<String, String> query = service.readQuery(request);

  Map<String, String> config = service.readConfig(request);

  List resultList = service.selectBaseList(service.select(query, config));

  if (resultList.size() > 0) {

  JSONObject jsonObject = new JSONObject();

  jsonObject.put("obj", resultList.get(0));

  return success(jsonObject);

  } else {

  return success(null);

  }

  }

  }

5.2.7 健康记录查看

  健康记录查看模块主要给家属用户提供查看老人健康监测数据的功能。家属进入健康记录页面之后选择需要查看的老人姓名,可以设定开始日期和结束日期来限定记录范围。列出血压、心率、血糖等测量指标和记录日期。系统具有数据统计功能,可以生成健康趋势图,使家属可以清楚地看到老人健康状况的变化。健康记录查看界面如下图38所示。

图38 健康记录查看界面

  健康记录查看功能主要代码如下。

  java

复制代码
@RestController

@RequestMapping("/health_records")

public class HealthRecordsController extends BaseController&lt;HealthRecords, HealthRecordsService&gt; {

  @Autowired

  public HealthRecordsController(HealthRecordsService service) {

  setService(service);

  }

  /**

  * 获取健康记录列表(支持分页和筛选)

  */

  @RequestMapping("/get_list")

  public Map<String, Object> getList(HttpServletRequest request) {

  Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));

  return success(map);

  }

  /**

  * 获取健康记录详情

  */

  @RequestMapping("/get_obj")

  public Map<String, Object> obj(HttpServletRequest request) {

  Map<String, String> query = service.readQuery(request);

  Map<String, String> config = service.readConfig(request);

  List resultList = service.selectBaseList(service.select(query, config));

  if (resultList.size() > 0) {

  JSONObject jsonObject = new JSONObject();

  jsonObject.put("obj", resultList.get(0));

  return success(jsonObject);

  } else {

  return success(null);

  }

  }

  }

5.2.8 在线反馈

  在线反馈模块主要是给家属用户提供意见和建议的提出以及咨询问题的提出。家属进入反馈页面之后填写标题名称、选择反馈类型,系统会自动填充家属用户信息和当前日期。用户填写完反馈内容后提交,系统把反馈记录状态设置为待审核。管理员处理完之后,家属就可以在反馈列表里查看到回复内容。在线反馈界面如下图39所示。

图39 在线反馈界面

  在线反馈功能主要代码如下。

  java

复制代码
@RestController

@RequestMapping("/online_feedback")

public class OnlineFeedbackController extends BaseController&lt;OnlineFeedback, OnlineFeedbackService&gt; {

  @Autowired

  public OnlineFeedbackController(OnlineFeedbackService service) {

  setService(service);

  }

  /**

  * 新增在线反馈

  */

  @PostMapping("/add")

  @Transactional

  public Map<String, Object> add(HttpServletRequest request) throws IOException {

  Map<String,Object> paramMap = service.readBody(request.getReader());

  paramMap.entrySet().removeIf(entry -> {

  Object value = entry.getValue();

  return value instanceof String && ((String) value).isEmpty();

  });

  OnlineFeedback online_feedback = new OnlineFeedback();

复制代码
online_feedback.setTitle_name(paramMap.get("title_name") == null ? null :

String.valueOf(paramMap.get("title_name")));

online_feedback.setType_of_feedback(paramMap.get("type_of_feedback") == null ? null :

String.valueOf(paramMap.get("type_of_feedback")));

online_feedback.setFamily_member_user(paramMap.get("family_member_user") == null ? null :

Integer.valueOf(String.valueOf(paramMap.get("family_member_user"))));

  if (paramMap.get("feedback_date") != null &&

  !StringUtils.isEmpty(String.valueOf(paramMap.get("feedback_date")))) {

  String timStr = String.valueOf(paramMap.get("feedback_date"));

  online_feedback.setFeedback_date(parseToTimestamp(timStr));

  }

复制代码
online_feedback.setFeedback_content(paramMap.get("feedback_content") == null ? null :

String.valueOf(paramMap.get("feedback_content")));

online_feedback.setExamine_state("未审核");

  this.addEntity(online_feedback);

  return success(1);

  }

  /**

  * 获取反馈列表

  */

  @RequestMapping("/get_list")

  public Map<String, Object> getList(HttpServletRequest request) {

  Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));

  return success(map);

  }

  }

5.3 服务人员角色功能实现

5.3.1 养老服务管理

  养老服务管理模块主要为服务人员维护个人所负责的服务项目信息。服务人员进入服务管理页面之后可以查看自己负责的所有服务,服务列表会显示服务名称、服务类型、服务价格和服务内容摘要。服务人员可以对服务项目的信息进行更新,修改服务须知或者服务内容说明。系统保存每次修改的时间,保证服务信息最新的状态可以被追溯。养老服务管理界面如图40所示。

图40 养老服务管理界面

  养老服务管理功能主要代码如下。

  java

复制代码
@RestController

@RequestMapping("/pension_service")

public class PensionServiceController extends BaseController&lt;PensionService, PensionServiceService&gt; {

  @Autowired

  public PensionServiceController(PensionServiceService service) {

  setService(service);

  }

  /**

  * 修改养老服务

  */

  @PostMapping("/set")

  @Transactional

  public Map<String, Object> set(HttpServletRequest request) throws IOException {

  Map<String,String> queryMap = service.readQuery(request);

  Map<String,String> configMap = service.readConfig(request);

  Map<String,Object> paramMap = service.readBody(request.getReader());

  paramMap.entrySet().removeIf(entry -> {

  Object value = entry.getValue();

  return value instanceof String && ((String) value).isEmpty();

  });

  PensionService pension_service = new PensionService();

复制代码
pension_service.setService_name(paramMap.get("service_name") == null ? null :

String.valueOf(paramMap.get("service_name")));

pension_service.setService_type(paramMap.get("service_type") == null ? null :

String.valueOf(paramMap.get("service_type")));

pension_service.setCover_image(paramMap.get("cover_image") == null ? null :

String.valueOf(paramMap.get("cover_image")));

pension_service.setService_staff(paramMap.get("service_staff") == null ? null :

Integer.valueOf(String.valueOf(paramMap.get("service_staff"))));

pension_service.setService_prices(paramMap.get("service_prices") == null ? null :

Double.valueOf(String.valueOf(paramMap.get("service_prices"))));

pension_service.setService_instructions(paramMap.get("service_instructions") == null ? null :

String.valueOf(paramMap.get("service_instructions")));

pension_service.setService_content(paramMap.get("service_content") == null ? null :

String.valueOf(paramMap.get("service_content")));

  this.setEntity(queryMap, configMap, pension_service);

  return success(1);

  }

  }

5.3.2 预约信息管理

  预约信息管理模块主要用来查看服务人员自己所负责的预约申请。服务人员进入预约列表之后可以按照服务名称、服务类型、审核状态进行筛选,列表中显示预约的服务信息以及家属用户的个人信息。服务人员可以查看预约详情,知道服务对象和预约时间,根据实际情况修改服务进度状态。预约信息管理界面如下图41所示。

图41 预约信息管理界面

  预约信息管理功能主要代码如下。

  java

复制代码
@RestController

@RequestMapping("/reservation_information")

public class ReservationInformationController extends BaseController&lt;ReservationInformation, ReservationInformationService&gt; {

  @Autowired

  public ReservationInformationController(ReservationInformationService service) {

  setService(service);

  }

  /**

  * 获取预约信息列表(支持分页和筛选)

  */

  @RequestMapping("/get_list")

  public Map<String, Object> getList(HttpServletRequest request) {

  Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));

  return success(map);

  }

  /**

  * 获取预约信息详情

  */

  @RequestMapping("/get_obj")

  public Map<String, Object> obj(HttpServletRequest request) {

  Map<String, String> query = service.readQuery(request);

  Map<String, String> config = service.readConfig(request);

  List resultList = service.selectBaseList(service.select(query, config));

  if (resultList.size() > 0) {

  JSONObject jsonObject = new JSONObject();

  jsonObject.put("obj", resultList.get(0));

  return success(jsonObject);

  } else {

  return success(null);

  }

  }

  }

5.3.3 异常上报管理

  异常上报管理模块主要用以服务人员在服务过程中对异常情况进行记录。服务人员进入到异常上报页面之后输入人员姓名、选择上报日期、填写上报内容并提交之后系统把上报记录的状态设置为待审核。服务人员可以在异常上报列表中查看已经提交的记录和审核状态,管理员处理之后可以查看审核回复的内容。异常上报管理界面如下图42所示。

图42 异常上报管理界面

  异常上报管理功能主要代码如下。

  java

复制代码
@RestController

@RequestMapping("/abnormal_reporting")

public class AbnormalReportingController extends BaseController&lt;AbnormalReporting, AbnormalReportingService&gt; {

@Autowired

public AbnormalReportingController(AbnormalReportingService service) {

  setService(service);

  }

  /**

  * 新增异常上报

  */

  @PostMapping("/add")

  @Transactional

  public Map<String, Object> add(HttpServletRequest request) throws IOException {

  Map<String,Object> paramMap = service.readBody(request.getReader());

  paramMap.entrySet().removeIf(entry -> {

  Object value = entry.getValue();

  return value instanceof String && ((String) value).isEmpty();

  });

  AbnormalReporting abnormal = new AbnormalReporting();

复制代码
abnormal.setService_staff(paramMap.get("service_staff") == null ? null :

Integer.valueOf(String.valueOf(paramMap.get("service_staff"))));

abnormal.setName_of_personnel(paramMap.get("name_of_personnel") == null ? null :

String.valueOf(paramMap.get("name_of_personnel")));

  if (paramMap.get("date_of_report") != null &&

  !StringUtils.isEmpty(String.valueOf(paramMap.get("date_of_report")))) {

  String timStr = String.valueOf(paramMap.get("date_of_report"));

  abnormal.setDate_of_report(parseToTimestamp(timStr));

  }

复制代码
abnormal.setReporting_content(paramMap.get("reporting_content") == null ? null :

String.valueOf(paramMap.get("reporting_content")));

abnormal.setExamine_state("未审核");

  this.addEntity(abnormal);

  return success(1);

  }

  /**

  * 获取异常上报列表

  */

  @RequestMapping("/get_list")

  public Map<String, Object> getList(HttpServletRequest request) {

  Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));

  return success(map);

  }

  }

5.3.4 排班信息查看

  排班信息查看模块主要是为服务人员查询个人值班安排。服务人员进入排班列表后,可依据标题名称展开筛选,列表中会出现上班时间和地点、排班人员的相关信息。服务人员可以查看到具体的排班安排,即每一个工作日的值班任务和地点。排班信息查看界面如下图43所示。

图43 排班信息查看界面

  排班信息查看功能主要代码如下。

  java

复制代码
@RestController

@RequestMapping("/schedule_information")

public class ScheduleInformationController extends BaseController&lt;ScheduleInformation, ScheduleInformationService&gt; {

  @Autowired

  public ScheduleInformationController(ScheduleInformationService service) {

  setService(service);

  }

  /**

  * 获取排班信息列表

  */

  @RequestMapping("/get_list")

  public Map<String, Object> getList(HttpServletRequest request) {

  Map<String, Object> map = service.selectToPage(service.readQuery(request), service.readConfig(request));

  return success(map);

  }

  /**

  * 获取排班信息详情

  */

  @RequestMapping("/get_obj")

  public Map<String, Object> obj(HttpServletRequest request) {

  Map<String, String> query = service.readQuery(request);

  Map<String, String> config = service.readConfig(request);

  List resultList = service.selectBaseList(service.select(query, config));

  if (resultList.size() > 0) {

  JSONObject jsonObject = new JSONObject();

  jsonObject.put("obj", resultList.get(0));

  return success(jsonObject);

  } else {

  return success(null);

  }

  }

  }

6 系统测试

6.1 测试目的

  系统测试就是对雅集社区养老管理系统进行功能测试和性能测试,看其是否达到设计阶段所确定的要求。测试过程集中到业务逻辑和设计规格之间的匹配程度上,利用已有的测试用例来检验各个功能模块的输出结果与预期结果是否一致20。对测试覆盖服务预约、订单支付、健康记录管理等主要业务流程进行测试,保证用户操作可以引起相应的系统响应,数据的流转过程中不会出现丢失或者错乱的情况。边界条件下的系统容错机制也是测试的重点,无效输入或者异常操作应该被系统正确地拦截并给出明确的提示。测试阶段出现的问题会在开发环境里修复,并且再次执行回归测试,保证系统上线之前可以正常使用。

6.2 测试方法

  系统测试使用黑盒测试的方法,从用户的角度来检验功能实现是否正确。测试用例的设计包含正常的业务流程以及异常处理的情况所对应的输入数据,依照功能规格说明书来设计。测试过程分为单元测试、集成测试、系统测试这三部分。单元测试对各个功能模块内部逻辑进行验证,保证基础操作的正确性。集成测试主要对模块之间的交互以及数据流转进行测试,看预约信息生成之后,在服务记录模块中是否可以正确地显示出来。系统测试是在完整的运行环境下进行的,模拟出三种用户所用到的各种操作场景,检验整个系统的运行情况。测试环境配置和开发环境一致,使用独立的数据库来保证测试数据和开发数据的隔离。测试时出现的缺陷记入缺陷表,开发人员更改后再行测试,直到全部功能检验合格为止。

6.3 测试环境

  系统测试是在相同的软硬件环境下进行的,以保证测试结果的准确性以及可重复性。硬件上测试服务器使用的是Intel Core i5-10400处理器,主频2.9GHz,内存16GB,硬盘是512GB固态硬盘,网络环境是千兆局域网。客户端测试机采用Intel Core i3-10100处理器,内存8GB,硬盘256GB固态硬盘,显示器分辨率1920×1080。

  软件环境配置方面,服务器操作系统选用Windows Server 2019 Standard版本,JDK版本为1.8.0_301,数据库采用MySQL 8.0.28,应用服务运行于Spring Boot内嵌的Tomcat 9.0容器。客户端操作系统使用的是Windows 11专业版,浏览器测试使用Chrome 120.0、Microsoft Edge 120.0、Firefox 121.0这三个主流版本,测试期间所有的浏览器都处于默认状态,没有安装可能会对测试结果产生影响的插件或者扩展程序。

  测试工具上用Postman 10.0版本做API请求的验证,数据库操作验证用Navicat Premium 16.0做数据查询和核对,前端页面响应时间测试用Chrome开发者工具的Network面板来记录。测试数据单独存放在测试数据库里,和开发环境的数据分开,测试结束之后测试数据库就会被清空重新初始化。

6.4 测试用例与结果

  服务预约功能测试如表11所示。

表11 服务预约功能测试表

测试内容 测试步骤 预期结果 实际结果
正常预约流程 选择服务、填写预约信息、提交申请 预约记录保存成功,状态为待审核 符合预期
缺少必要信息 不选择服务对象直接提交 系统提示选择老人姓名 符合预期
重复预约检测 对同一服务提交多次预约 系统提示预约次数限制 符合预期

  结果图如下:

​编辑 图44 测试结果图

  订单支付功能测试如表12所示。

表12 订单支付功能测试表

测试内容 测试步骤 预期结果 实际结果
正常支付流程 选择订单、选择支付方式、确认支付 订单状态更新为已支付 符合预期
支付取消操作 进入支付页面后返回 订单状态保持待支付 符合预期
已支付订单重复支付 对已支付订单再次发起支付 系统提示订单已支付 符合预期

  结果图如下:

​编辑 图45 测试结果图

  健康记录管理功能测试如表13所示。

表13 健康记录管理功能测试表

测试内容 测试步骤 预期结果 实际结果
新增健康记录 选择老人、填写健康指标、保存 记录保存成功并显示在列表 符合预期
按日期筛选记录 设定开始日期和结束日期、查询 列表仅显示日期范围内的记录 符合预期
健康趋势查看 点击数据分析按钮 生成趋势图表 符合预期

  结果图如下:

​编辑 图46 测试结果图

  异常上报功能测试如表14所示。

表14 异常上报功能测试表

测试内容 测试步骤 预期结果 实际结果
上报异常情况 填写上报内容、提交 上报记录保存成功,状态为待审核 符合预期
查看审核结果 进入上报列表、查看状态 显示审核状态与回复内容 符合预期
空内容提交检测 不填写上报内容直接提交 系统提示填写上报内容 符合预期

  结果图如下:

​编辑 图47 测试结果图

  排班信息管理功能测试如表15所示。

表15 排班信息管理功能测试表

测试内容 测试步骤 预期结果 实际结果
新增排班记录 填写排班信息、选择人员、保存 排班记录保存成功 符合预期
按标题筛选排班 输入标题关键词、查询 列表显示匹配的排班记录 符合预期
删除排班记录 选择记录、确认删除 记录从列表中移除 符合预期

  结果图如下:

图48 测试结果图

6.5 测试结论

  服务预约功能测试中,正常的预约流程可以正确保存预约记录并将其状态设置为待审核,缺少必要信息时系统会给出提示,重复提交同一个服务时系统会发出预约次数限制的提示。订单支付功能测试完毕之后,订单状态变为已支付,支付取消操作之后订单状态不变为待支付,对已经支付过的订单再进行支付时,系统会给出订单已支付的提示。健康记录管理功能测试中,新创建的健康记录会被存入数据库,然后根据老人姓名、日期进行筛选。点击数据分析按钮之后,系统就会自动生成健康趋势图。异常上报功能测试中,上报记录提交之后状态变为待审核,管理员审核之后状态会更新并且可以查看回复内容,空内容提交时系统返回填写提示。排班信息管理功能测试中,新增排班记录可以正确保存,按照标题关键词筛选可以正确匹配结果,删除操作后记录从列表中移除。所有的测试用例执行结果和预期的结果一致,系统的核心功能模块可以正常工作,业务流程可以闭环。

项目分享:大家可自取用于参考学习,获取方式可私信哦!

相关推荐
知守观1 小时前
Spring Boot 2.1.0 停维护5年,10个依赖4个有CVE——2022年老项目的安全体检报告
spring boot·后端
FYKJ_20101 小时前
express皖美特色农产品网售系统53118-计算机课程设计、毕业设计
javascript·vue.js·spring boot·mysql·typescript·spark·express
zhanghaha13141 小时前
Python进阶教程:35_PyQt (保姆级零基础教程)
开发语言·python·pyqt
信誓旦旦的程序猿2 小时前
【Python 量化取数指南 #09】Python 拿港股通数据:港股通成交与港股财报实测
java·python·股票数据api·股票数据·股票数据api接口·股票api数据接口·股票量化数据api
FYKJ_20102 小时前
springboot羽毛球场地管理系统00626-计算机课程设计、毕业设计
vue.js·spring boot·python·mysql·typescript·spark·django
Wx-bishekaifayuan2 小时前
django医院营收信息预测系统49414-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游
Wx-bishekaifayuan2 小时前
springboot会议室预约管理系统42030-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游
IT毕设梦工厂2 小时前
计算机毕业设计选题推荐:基于大数据的广告投放数据可视化分析系统|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·hadoop·信息可视化·数据分析·spark·毕业设计·课程设计
IT毕设梦工厂2 小时前
计算机毕业设计选题推荐:基于大数据的房地产交易数据分析与可视化|毕业设计选题|计算机毕设|选题推荐|毕设指导|项目定制|源码|高质量项目
大数据·hive·hadoop·python·数据分析·spark·课程设计