医院信息化与智能化系统(16)
医院信息化与智能化系统(16)
这里只描述对应过程,和可能遇到的问题及解决办法以及对应的参考链接,并不会直接每一步详细配置
如果你想通过文字描述或代码画流程图,可以试试PlantUML
,告诉GPT你的文件结构,让他给你对应的代码
预约挂号微服务模块搭建
前端知识点补充,此章节不会详细讲具体前端的每个知识点
1、更新医院上线状态 | 医院详情
更新医院上线状态
在HospitalController
创建更新医院上线方法,其中具体逻辑在Impl类中updateStatus
方法中实现
findById
方法查找的是 Hospital 类在其父类 BaseMongoEntity 中定义的 id 字段
其返回的是一个 Optional<T>
对象,其中 T 是你的实体类。通过get
获取实体对象
public void updateStatus(String id, Integer status) {
//根据id查询医院信息
Hospital hospital = hospitalRepository.findById(id).get();
hospital.setStatus(status);
hospital.setUpdateTime(new Date());
hospitalRepository.save(hospital);
}
前端在操作
这一标签处添加判断按钮
标签,根据状态显示上线
|下线
。并绑定updateStatus
方法,其内部调用刚刚的方法接口。
医院详情
也是同样的流程,这里说一下关于接口函数的设计。
setHospitalHosType
是之前设计的,返回的hospital是包含等级
和全部地址
的,而不是单单的value
bookingRule
是医院预约规则的字段,单独提取出来放入 result 中,能够让返回的数据结构更清晰。
@Override
public Map<String, Object> getHospById(String id) {
HashMap<String, Object> result = new HashMap<>();
//医院基本信息(包含医院等级)
Hospital hospital = this.setHospitalHosType(hospitalRepository.findById(id).get());
result.put("hospital",hospital);
//单独处理
result.put("bookingRule", hospital.getBookingRule());
//不需要重复返回
hospital.setBookingRule(null);
return result;
前端,添加一个查看按钮
,为其配置隐藏路由,同时需要在路由设置的index.js里面做添加。
{
path: 'hospital/show/:id',
name: '查看',
component: () =>import('@/views/hosp/show'),
meta: { title: '查看', noCache: true },
hidden: true
}
在show.vue中进行设置
定义两个初始变量医院 hospital
医院信息、 bookingRule
预约信息
在created中执行两个操作:
- 获取路由id
- 调用方法
fetachHospDetail
,根据id查询医院详情
再设置一个返回按钮,绑定方法back
,里面执行路由跳转,跳转到医院列表即可。
在资料中找到show.css样式文件,放入到前端工作区styles
文件夹,再到main.js引入
2、查看医院排班
显示科室接口开发
希望根据医院编号
查询医院所有科室列表;并把所有科室按照树结构
显示。
创建DepartmentController
,创建方法getDeptList
,根据医院编号,查询医院所有科室列表。在findDeptTree
方法体具体实现该功能,该方法返回DepartmentVo
类型的List,因为其包含了下级节点的List属性
,这是Department类没有的。
代码解读:
Department::getBigcode
表示按这个方法返回的值进行分组。
Map<String, List<Department>> departmentMap
这个 Map 的键是 getBigcode() 方法的返回值,值是对应的 Department 对象列表
假设 departmentList 中有多个部门对象,每个对象都有一个 bigcode 属性。执行这段代码后,你会得到一个按 bigcode 分组的 Map,其中每个bigcode
对应的值是所有具有该 bigcode 的 Department 对象的列表
departmentVo1
负责将大科室的编号
与名称
封装,departmentVo2
负责将子科室编号
与名称
封装,后将departmentVo2设置为departmentVo1的children
属性。
public List<DepartmentVo> findDeptTree(String hoscode) {
//创建list集合,用于最终数据封装
List <DepartmentVo> result = new ArrayList<>();
//根据医院编号查询医院所有科室信息
Department departmentQuery = new Department();
departmentQuery.setHoscode(hoscode);
Example<Department> example = Example.of(departmentQuery);
//所有科室的列表信息
List<Department> departmentList = departmentRepository.findAll(example);
//根据大科室编号(bigCode)分组,再获取每个大科室里面的下级子科室
Map<String, List<Department>> departmentMap = departmentList.stream().collect(Collectors.groupingBy(Department::getBigcode));
//遍历map集合
for (Map.Entry<String,List<Department>> entry: departmentMap.entrySet()){
//大科室编号
String bigcode = entry.getKey();
//大科室编号对应的全局数据
List<Department> department1List = entry.getValue();
//封装大科室
DepartmentVo departmentVo1 = new DepartmentVo();
//科室编号
departmentVo1.setDepcode(bigcode);
//科室名称
departmentVo1.setDepname(department1List.get(0).getBigname());
//封装小科室
List<DepartmentVo> children = new ArrayList<>();
for (Department department : department1List){
DepartmentVo departmentVo2 = new DepartmentVo();
departmentVo2.setDepname(department.getDepname());
departmentVo2.setDepcode(department.getDepcode());
children.add(departmentVo2);
}
//把小科室的list放到大科室children里
departmentVo1.setChildren(children);
result.add(departmentVo1);
}
return result;
}
前端整合
添加隐藏路由,在点击排班
按钮时进行跳转schedule.vue
,对应list.vue
添加类似查看
按钮的element-ui
代码
在hosp.js定义方法接口,要求内容在左端显示,这里使用el-aside
标签,树形结构,使用el-tree
标签。
:data="data":
这个属性用于绑定树形组件的数据源,data 应该是一个包含树节点的数组。每个节点通常包含 label 和 children 等属性。
:props="defaultProps":
这里的 defaultProps 是一个对象,用于定义树节点的属性映射。可以指定哪个属性作为节点的标签(label),哪个属性表示子节点(children)。
<templete>部分
<el-tree
:data="data"
:props="defaultProps"
:default-expand-all="true"
@node-click="handleNodeClick">
</el-tree>
...
<script>部分
data: [],
defaultProps: {
children: 'children',
label: 'depname'
}
排班规则 接口
新建一个ScheduleService
里面创建一个getScheduleRule
方法用于根据医院编号、科室编号查询排班规则数据。它需要四个参数:当前页、每页记录数、医院编号、科室编号。
这里使用MongoTemplate
类进行查询及分页操作。
执行逻辑对应的SQL:返回四列
- workDate:工作日期,作为分组字段的值。
- docCount:统计的号源数量,即每个 workDate 下对应的医生数量(
能挂上号的
) - reservedNumber:已预约数量的总和,表示在该日期已被预约的号源数量。
- availableNumber:可用数量的总和,表示在该日期还可预约的号源数量。
SELECT
work_date,
COUNT(*) AS docCount,
SUM(reserved_number) AS reservedNumber,
SUM(available_number) AS availableNumber
FROM
schedule
WHERE
hoscode = '1000_0' AND depcode = '200040878'
GROUP BY
work_date
ORDER BY
work_date DESC
LIMIT
{limit} OFFSET {(page - 1) * limit}
随后分组查询有多少个不同的工作日期
SELECT
work_date
FROM schedule
WHERE
hoscode = '1000_0' AND depcode = '200040878'
GROUP BY
work_date;
引入joda-time
相关依赖,在类中创建getDayOfWeek
方法,把日期
对应的星期
获取
最终将条件返回结果
、时间信息
、医院名称
打包返回
//把日期对应星期获取
for (BookingScheduleRuleVo bookingScheduleRuleVo:bookingScheduleRuleVoList){
Date workDate = bookingScheduleRuleVo.getWorkDate();
String dayOfWeek = this.getDayOfWeek(new DateTime(workDate));
bookingScheduleRuleVo.setDayOfWeek(dayOfWeek);
}
//设置最终数据,进行返回
Map<String,Object> result = new HashMap<>();
result.put("bookingScheduleRuleList",bookingScheduleRuleVoList);
result.put("total",total);
//获取医院名称
String hosName = hospitalService.getHospName(hoscode);
//其他基础数据
Map<String, String> baseMap = new HashMap<>();
baseMap.put("hosname",hosName);
result.put("baseMap",baseMap);
前端整合
主要关于element-ui
组件整合与数据、方法绑定,这里不赘述,下图为展示效果。
排班详情 接口
根据医院编号
、科室编号
、工作日期
,查询排班详细信息
逻辑:
scheduleRepository.findScheduleByHoscodeAndDepcodeAndWorkDate
获取对应的Schedule
集合
然而Schedule类并没有医院名称
、科室名称
、日期对应星期
选择遍历该集合,使用packageSchedule
方法,Schedule是继承BaseMongoEntity
类的,通过设置param键值对,可以存储这些信息。
前端整合
原文地址:https://blog.csdn.net/thm19990903/article/details/143446353
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!