自学内容网 自学内容网

医院信息化与智能化系统(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中执行两个操作:

  1. 获取路由id
  2. 调用方法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:返回四列

  1. workDate:工作日期,作为分组字段的值。
  2. docCount:统计的号源数量,即每个 workDate 下对应的医生数量(能挂上号的)
  3. reservedNumber:已预约数量的总和,表示在该日期已被预约的号源数量。
  4. 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)!