[TOC]

一、预约挂号详情

1 需求分析

预约挂号 - 图1
1、接口分析
(1)根据预约周期,展示可预约日期数据,按分页展示
(2)选择日期展示当天可预约列表(该接口后台已经实现过)
2、页面展示分析
(1)分页展示可预约日期,根据有号、无号、约满等状态展示不同颜色,以示区分
(2)可预约最后一个日期为即将放号日期,根据放号时间页面展示倒计时

2 api接口

2.1 添加service接口

在ScheduleService类添加接口

/*
获取排班可预约日期数据
*
@param __page* @param __limit* @param __hoscode* @param __depcode* @return_/_Map getBookingScheduleRule(int page, *int limit, String hoscode, String depcode);

2.2 添加service接口实现

2.2.1 在ScheduleServiceImpl类实现接口

| @Override
public Map getBookingScheduleRule(int page, int limit, String hoscode, String depcode) {
Map result = new HashMap<>();

    _//获取预约规则<br />        _Hospital hospital = **hospitalService**.getByHoscode(hoscode);<br />        **if**(**null **== hospital) {<br />            **throw new **YyghException(ResultCodeEnum.**_DATA_ERROR_**);<br />        }<br />        BookingRule bookingRule = hospital.getBookingRule();

    _//获取可预约日期分页数据<br />        _IPage iPage = **this**.getListDate(page, limit, bookingRule);<br />        _//当前页可预约日期<br />        _List<Date> dateList = iPage.getRecords();<br />        _//获取可预约日期科室剩余预约数<br />        _Criteria criteria = Criteria._where_(**"hoscode"**).is(hoscode).and(**"depcode"**).is(depcode).and(**"workDate"**).in(dateList);<br />        Aggregation agg = Aggregation._newAggregation_(<br />                Aggregation._match_(criteria),<br />                Aggregation._group_(**"workDate"**)_//分组字段<br />                        _.first(**"workDate"**).as(**"workDate"**)<br />                        .count().as(**"docCount"**)<br />                        .sum(**"availableNumber"**).as(**"availableNumber"**)<br />                        .sum(**"reservedNumber"**).as(**"reservedNumber"**)<br />        );<br />        AggregationResults<BookingScheduleRuleVo> aggregationResults = **mongoTemplate**.aggregate(agg, Schedule.**class**, BookingScheduleRuleVo.**class**);<br />        List<BookingScheduleRuleVo> scheduleVoList = aggregationResults.getMappedResults();<br />        _//获取科室剩余预约数

    //合并数据 将统计数据ScheduleVo根据“安排日期”合并到BookingRuleVo<br />        _Map<Date, BookingScheduleRuleVo> scheduleVoMap = **new **HashMap<>();<br />        **if**(!CollectionUtils._isEmpty_(scheduleVoList)) {<br />            scheduleVoMap = scheduleVoList.stream().collect(Collectors._toMap_(BookingScheduleRuleVo::getWorkDate, BookingScheduleRuleVo -> BookingScheduleRuleVo));<br />        }<br />        _//获取可预约排班规则<br />        _List<BookingScheduleRuleVo> bookingScheduleRuleVoList = **new **ArrayList<>();<br />        **for**(**int **i=0, len=dateList.size(); i<len; i++) {<br />            Date date = dateList.get(i);

        BookingScheduleRuleVo bookingScheduleRuleVo = scheduleVoMap.get(date);<br />            **if**(**null **== bookingScheduleRuleVo) { _// 说明当天没有排班医生<br />                _bookingScheduleRuleVo = **new **BookingScheduleRuleVo();<br />                _//就诊医生人数<br />                _bookingScheduleRuleVo.setDocCount(0);<br />                _//科室剩余预约数  -1表示无号<br />                _bookingScheduleRuleVo.setAvailableNumber(-1);<br />            }<br />            bookingScheduleRuleVo.setWorkDate(date);<br />            bookingScheduleRuleVo.setWorkDateMd(date);<br />            _//计算当前预约日期为周几<br />            _String dayOfWeek = **this**.getDayOfWeek(**new **DateTime(date));<br />            bookingScheduleRuleVo.setDayOfWeek(dayOfWeek);

        _//最后一页最后一条记录为即将预约   状态 0:正常 1:即将放号 -1:当天已停止挂号<br />            _**if**(i == len-1 && page == iPage.getPages()) {<br />                bookingScheduleRuleVo.setStatus(1);<br />            } **else **{<br />                bookingScheduleRuleVo.setStatus(0);<br />            }<br />            _//当天预约如果过了停号时间, 不能预约<br />            _**if**(i == 0 && page == 1) {<br />                DateTime stopTime = **this**.getDateTime(**new **Date(), bookingRule.getStopTime());<br />                **if**(stopTime.isBeforeNow()) {<br />                    _//停止预约<br />                    _bookingScheduleRuleVo.setStatus(-1);<br />                }<br />            }<br />            bookingScheduleRuleVoList.add(bookingScheduleRuleVo);<br />        }

    _//可预约日期规则数据<br />        _result.put(**"bookingScheduleList"**, bookingScheduleRuleVoList);<br />        result.put(**"total"**, iPage.getTotal());<br />        _//其他基础数据<br />        _Map<String, String> baseMap = **new **HashMap<>();<br />        _//医院名称<br />        _baseMap.put(**"hosname"**, **hospitalService**.getHospName(hoscode));<br />        _//科室<br />        _Department department =**departmentService**.getDepartment(hoscode, depcode);<br />        _//大科室名称<br />        _baseMap.put(**"bigname"**, department.getBigname());<br />        _//科室名称<br />        _baseMap.put(**"depname"**, department.getDepname());_//月<br />        _baseMap.put(**"workDateString"**, **new **DateTime().toString(**"yyyy年MM月"**));_//放号时间<br />        _baseMap.put(**"releaseTime"**, bookingRule.getReleaseTime());_//停号时间<br />        _baseMap.put(**"stopTime"**, bookingRule.getStopTime());<br />        result.put(**"baseMap"**, baseMap);<br />        **return **result;<br />    }<br />    _/**<br />     * 获取可预约日期分页数据_**_     _**_*/<br />    _**private **IPage<Date> getListDate(**int **page, **int **limit, BookingRule bookingRule) {_//当天放号时间<br />        _DateTime releaseTime = **this**.getDateTime(**new **Date(), bookingRule.getReleaseTime());_//预约周期<br />        _**int **cycle = bookingRule.getCycle();_//如果当天放号时间已过,则预约周期后一天为即将放号时间,周期加1<br />        _**if**(releaseTime.isBeforeNow()) cycle += 1;_//可预约所有日期,最后一天显示即将放号倒计时<br />        _List<Date> dateList = **new **ArrayList<>();<br />        **for **(**int **i = 0; i < cycle; i++) {_//计算当前预约日期<br />            _DateTime curDateTime = **new **DateTime().plusDays(i);<br />            String dateString = curDateTime.toString(**"yyyy-MM-dd"**);<br />            dateList.add(**new **DateTime(dateString).toDate());<br />        }_//日期分页,由于预约周期不一样,页面一排最多显示7天数据,多了就要分页显示<br />        _List<Date> pageDateList = **new **ArrayList<>();<br />        **int **start = (page-1)*limit;<br />        **int **end = (page-1)*limit+limit;<br />        **if**(end >dateList.size()) end = dateList.size();<br />        **for **(**int **i = start; i < end; i++) {<br />            pageDateList.add(dateList.get(i));<br />        }<br />        IPage<Date> iPage = **new **com.baomidou.mybatisplus.extension.plugins.pagination.Page(page, 7, dateList.size());<br />        iPage.setRecords(pageDateList);<br />        **return **iPage;<br />    }<br />    _/**<br />     * 将Date日期(yyyy-MM-dd HH:mm)转换为DateTime_**_     _**_*/<br />    _**private **DateTime getDateTime(Date date, String timeString) {<br />        String dateTimeString = **new **DateTime(date).toString(**"yyyy-MM-dd"**) + **" "**+ timeString;<br />        DateTime dateTime = DateTimeFormat._forPattern_(**"yyyy-MM-dd HH:mm"**).parseDateTime(dateTimeString);<br />        **return **dateTime;<br />    } |

| —- |

2.2.2 在获取科室信息

1、在DepartmentService类添加接口

/*
获取部门
*_/_Department getDepartment(String hoscode, String depcode);

2、在DepartmentImpl类实现接口

@Overridepublic Department getDepartment(String hoscode, String depcode) { return departmentRepository.getDepartmentByHoscodeAndDepcode(hoscode, depcode);
}

2.3 添加controller方法

在HospitalApiController类添加方法

@Autowiredprivate ScheduleService scheduleService;@ApiOperation(value = “获取可预约排班数据”)@GetMapping(“auth/getBookingScheduleRule/{page}/{limit}/{hoscode}/{depcode}”)public Result getBookingSchedule(
@ApiParam(name = “page”, value = “当前页码”, required = true)
@PathVariable Integer page,
@ApiParam(name = “limit”, value = “每页记录数”, required = true)
@PathVariable Integer limit,
@ApiParam(name = “hoscode”, value = “医院code”, required = true)
@PathVariable String hoscode,
@ApiParam(name = “depcode”, value = “科室code”, required = true)
@PathVariable String depcode) {
return Result.ok(scheduleService.getBookingScheduleRule(page, limit, hoscode, depcode));
}
@ApiOperation(value = “获取排班数据”)@GetMapping(“auth/findScheduleList/{hoscode}/{depcode}/{workDate}”)public Result findScheduleList(
@ApiParam(name = “hoscode”, value = “医院code”, required = true)
@PathVariable String hoscode,
@ApiParam(name = “depcode”, value = “科室code”, required = true)
@PathVariable String depcode,
@ApiParam(name = “workDate”, value = “排班日期”, required = true)
@PathVariable String workDate) {
return Result.ok(scheduleService.getDetailSchedule(hoscode, depcode, workDate));
}

3、前端

3.1封装api请求

在/api/hosp.js添加方法

getBookingScheduleRule(page, limit, hoscode, depcode) {
return request({
url: ${api_name}/auth/getBookingScheduleRule/${page}/${limit}/${hoscode}/${depcode},
method: ‘get’
})
},

findScheduleList(hoscode, depcode, workDate) {
return request({
url: ${api_name}/auth/findScheduleList/${hoscode}/${depcode}/${workDate},
method: ‘get’
})
},

3.2 页面展示

创建/pages/hospital/schedule.vue组件


3 预约确认

  1. 根据排班id获取排班信息,在页面展示
  2. 选择就诊人
  3. 预约下单

    4 api接口

    1.1 添加service接口

    1、在ScheduleService类添加接口
/*
根据id获取排班
*
@param __id* @return_*/_Schedule getById(String id);

2、在ScheduleServiceImpl类添加实现

@Overridepublic Schedule getById(String id) {
Schedule schedule = scheduleRepository.findById(id).get(); return this.packSchedule(schedule);
}

1.2 添加controller方法

在HospitalApiController类添加方法

@ApiOperation(value = “根据排班id获取排班数据”)@GetMapping(“getSchedule/{scheduleId}”)public Result getSchedule(@ApiParam(name = “scheduleId”, value = “排班id”, required = true)@PathVariable String scheduleId) { return Result.ok(scheduleService.getById(scheduleId));
}

5 前端

2.1封装api请求

在/api/hosp/hospital.js添加方法

getSchedule(id) {return request({ url: `${api_name}/getSchedule/${id}`, method: ‘get’})
}

2.2 页面展示

创建/pages/hospital/booking.vue组件




6 预约下单

由于预约下单后台api接口相对复杂,我们先实现前端,前端配合调试api接口

3.1封装api请求

添加/api/order/orderInfo.js文件,定义下单接口

import request from ‘@/utils/request’
const
api_name = /api/order/orderInfo
export default
{ submitOrder(scheduleId, patientId) { return request({ url: `${api_name}/auth/submitOrder/${scheduleId}/${patientId}`, method: ‘post’ })
}
}

3.2 页面修改

在/pages/hosp/booking.vue组件完善下单方法

submitOrder() {
if(this.patient.id == null) {
this.$message.error(‘请选择就诊人’)
return
}
// 防止重复提交
if(this.submitBnt == ‘正在提交…’) {
this.$message.error(‘重复提交’)
return
}

this.submitBnt = ‘正在提交…’
orderInfoApi.submitOrder(this.scheduleId, this.patient.id).then(response => {
let orderId = response.data
window.location.href = ‘/order/show?orderId=’ + orderId
}).catch(e => {
this.submitBnt = ‘确认挂号’
})
},