接口分析
(1)根据预约周期,展示可预约日期数据
(资料图片)
(2)选择日期展示当天可预约列表
1、获取可预约日期接口1.1、Controllerservice-hosp微服务创建FrontScheduleController
package com.atguigu.syt.hosp.controller.front;@Api(tags = "排班")@RestController@RequestMapping("/front/hosp/schedule")public class FrontScheduleController { @Resource private ScheduleService scheduleService; @ApiOperation(value = "获取可预约排班日期数据") @ApiImplicitParams({ @ApiImplicitParam(name = "hoscode",value = "医院编码", required = true), @ApiImplicitParam(name = "depcode",value = "科室编码", required = true)}) @GetMapping("getBookingScheduleRule/{hoscode}/{depcode}") public Result
1.2、辅助方法在ScheduleServiceImpl中添加两个辅助方法
/** * 根据日期对象和时间字符串获取一个日期时间对象 * @param dateTime * @param timeString * @return */private DateTime getDateTime(DateTime dateTime, String timeString) { String dateTimeString = dateTime.toString("yyyy-MM-dd") + " " + timeString; return DateTimeFormat.forPattern("yyyy-MM-dd HH:mm").parseDateTime(dateTimeString);}
/** * 根据预约规则获取可预约日期列表 */private List getDateList(BookingRule bookingRule) { //预约周期 int cycle = bookingRule.getCycle(); //当天放号时间 DateTime releaseTime = this.getDateTime(new DateTime(), bookingRule.getReleaseTime()); //如果当天放号时间已过,则预约周期后一天显示即将放号,周期加1 if (releaseTime.isBeforeNow()) { cycle += 1; } //计算当前可显示的预约日期,并且最后一天显示即将放号倒计时 List dateList = new ArrayList<>(); for (int i = 0; i < cycle; i++) { //计算当前可显示的预约日期 DateTime curDateTime = new DateTime().plusDays(i); String dateString = curDateTime.toString("yyyy-MM-dd"); dateList.add(new DateTime(dateString).toDate()); } return dateList;}
1.3、Service接口:ScheduleService
/** * 根据医院编码和科室编码查询医院排班日期列表 * @param hoscode * @param depcode * @return */Map getBookingScheduleRule(String hoscode, String depcode);
实现:ScheduleServiceImpl
@Resourceprivate HospitalRepository hospitalRepository;@Resourceprivate DepartmentRepository departmentRepository;
@Overridepublic Map getBookingScheduleRule(String hoscode, String depcode) { //获取医院 Hospital hospital = hospitalRepository.findByHoscode(hoscode); //获取预约规则 BookingRule bookingRule = hospital.getBookingRule(); //根据预约规则获取可预约日期列表 List dateList = this.getDateList(bookingRule); //查询条件:根据医院编号、科室编号以及预约日期查询 Criteria criteria = Criteria.where("hoscode").is(hoscode).and("depcode").is(depcode).and("workDate").in(dateList); //根据工作日workDate期进行分组 Aggregation agg = Aggregation.newAggregation( //查询条件 Aggregation.match(criteria), Aggregation //按照日期分组 select workDate as workDate from schedule group by workDate .group("workDate").first("workDate").as("workDate") //剩余预约数 .sum("availableNumber").as("availableNumber") ); //执行查询 AggregationResults aggResults = mongoTemplate.aggregate(agg, Schedule.class, BookingScheduleRuleVo.class); //获取查询结果 List list = aggResults.getMappedResults(); //将list转换成Map,日期为key,BookingScheduleRuleVo对象为value Map scheduleVoMap = new HashMap<>(); if (!CollectionUtils.isEmpty(list)) { scheduleVoMap = list.stream().collect( Collectors.toMap(bookingScheduleRuleVo -> bookingScheduleRuleVo.getWorkDate(), bookingScheduleRuleVo -> bookingScheduleRuleVo) ); } //获取可预约排班规则 List bookingScheduleRuleVoList = new ArrayList<>(); int size = dateList.size(); for (int i = 0; i < size; i++) { Date date = dateList.get(i); BookingScheduleRuleVo bookingScheduleRuleVo = scheduleVoMap.get(date); if (bookingScheduleRuleVo == null) { // 说明当天没有排班数据 bookingScheduleRuleVo = new BookingScheduleRuleVo(); bookingScheduleRuleVo.setWorkDate(date); //科室剩余预约数 -1表示无号 bookingScheduleRuleVo.setAvailableNumber(-1); } bookingScheduleRuleVo.setWorkDateMd(date); //计算当前预约日期为周几 String dayOfWeek = DateUtil.getDayOfWeek(new DateTime(date)); bookingScheduleRuleVo.setDayOfWeek(dayOfWeek); if (i == size - 1) { //最后一条记录为即将放号 bookingScheduleRuleVo.setStatus(1); } else { bookingScheduleRuleVo.setStatus(0); } //设置预约状态: 0正常; 1即将放号; -1当天已停止挂号 if (i == 0) { //当天如果过了停挂时间, 则不能挂号 DateTime stopTime = this.getDateTime(new DateTime(), bookingRule.getStopTime()); if (stopTime.isBeforeNow()) { bookingScheduleRuleVo.setStatus(-1);//停止挂号 } } bookingScheduleRuleVoList.add(bookingScheduleRuleVo); } //医院基本信息 Map info = new HashMap<>(); //医院名称 info.put("hosname", hospitalRepository.findByHoscode(hoscode).getHosname()); //科室 Department department = departmentRepository.findByHoscodeAndDepcode(hoscode, depcode); //大科室名称 info.put("bigname", department.getBigname()); //科室名称 info.put("depname", department.getDepname()); //当前月份 info.put("workDateString", new DateTime().toString("yyyy年MM月")); //放号时间 info.put("releaseTime", bookingRule.getReleaseTime()); Map result = new HashMap<>(); //可预约日期数据 result.put("bookingScheduleList", bookingScheduleRuleVoList);//排班日期列表 result.put("info", info);//医院基本信息 return result;}
2、获取排班数据接口2.1、Controller在FrontScheduleController添加方法
@ApiOperation("获取排班数据")@ApiImplicitParams({ @ApiImplicitParam(name = "hoscode",value = "医院编码", required = true), @ApiImplicitParam(name = "depcode",value = "科室编码", required = true), @ApiImplicitParam(name = "workDate",value = "排班日期", required = true)})@GetMapping("getScheduleList/{hoscode}/{depcode}/{workDate}")public Result> getScheduleList( @PathVariable String hoscode, @PathVariable String depcode, @PathVariable String workDate) { List scheduleList = scheduleService.getScheduleList(hoscode, depcode, workDate); return Result.ok(scheduleList);}
2.2、Service之前已经实现的业务
注意:如果我们在MongoDB集合的实体中使用了ObjectId作为唯一标识,那么需要对数据进行如下转换,以便将字符串形式的id传到前端
@Overridepublic List getScheduleList(String hoscode, String depcode, String workDate) { //注意:最后一个参数需要进行数据类型的转换 List scheduleList = scheduleRepository.findByHoscodeAndDepcodeAndWorkDate( hoscode, depcode, new DateTime(workDate).toDate());//数据类型的转换 //id为ObjectId类型时需要进行转换 scheduleList.forEach(schedule -> { schedule.getParam().put("id", schedule.getId().toString()); }); return scheduleList;}
3、前端整合3.1、预约挂号页面跳转修改/pages/hospital/_hoscode.vue组件的schedule方法
添加模块引用:
import cookie from "js-cookie"import userInfoApi from "~/api/userInfo"
methods中添加如下方法:
schedule(depcode) { //window.location.href = "/hospital/schedule?hoscode=" + this.$route.params.hoscode + "&depcode="+ depcode // 登录判断 let token = cookie.get("refreshToken") if (!token) { this.$alert("请先进行用户登录", { type: "warning" }) return } //判断认证 userInfoApi.getUserInfo().then((response) => { let authStatus = response.data.authStatus // 状态为2认证通过 if (authStatus != 2) { this.$alert("请先进行用户认证", { type: "warning", callback: () => { window.location.href = "/user" }, }) return } window.location.href = "/hospital/schedule?hoscode=" + this.$route.params.hoscode + "&depcode=" + depcode })}
3.2、api在api/hosp.js添加方法
//获取可预约排班日期列表getBookingScheduleRule(hoscode, depcode) { return request({ url: `/front/hosp/schedule/getBookingScheduleRule/${hoscode}/${depcode}`, method: "get" })},//获取排班数据getScheduleList(hoscode, depcode, workDate) { return request({ url: `/front/hosp/schedule/getScheduleList/${hoscode}/${depcode}/${workDate}`, method: "get" })},
3.3、页面渲染/pages/hospital/schedule.vue
第02章-预约确认1、后端接口1.1、Controller在FrontScheduleController中添加方法
@ApiOperation("获取预约详情")@ApiImplicitParam(name = "id",value = "排班id", required = true)@GetMapping("getScheduleDetail/{id}")public Result getScheduleDetail(@PathVariable String id) { Schedule schedule = scheduleService.getDetailById(id); return Result.ok(schedule);}
1.2、Service接口:ScheduleService
/** * 排班记录详情 * @param id * @return */Schedule getDetailById(String id);
实现:ScheduleServiceImpl
@Overridepublic Schedule getDetailById(String id) { Schedule schedule = scheduleRepository.findById(new ObjectId(id)).get(); return this.packSchedule(schedule);}
辅助方法
/** * 封装医院名称,科室名称和周几 * @param schedule * @return */private Schedule packSchedule(Schedule schedule) { //医院名称 String hosname = hospitalRepository.findByHoscode(schedule.getHoscode()).getHosname(); //科室名称 String depname = departmentRepository.findByHoscodeAndDepcode(schedule.getHoscode(),schedule.getDepcode()).getDepname(); //周几 String dayOfWeek = DateUtil.getDayOfWeek(new DateTime(schedule.getWorkDate())); Integer workTime = schedule.getWorkTime(); String workTimeString = workTime.intValue() == 0 ? "上午" : "下午"; schedule.getParam().put("hosname",hosname); schedule.getParam().put("depname",depname); schedule.getParam().put("dayOfWeek",dayOfWeek); schedule.getParam().put("workTimeString", workTimeString); //id为ObjectId类型时需要进行转换 schedule.getParam().put("id",schedule.getId().toString()); return schedule;}
2、前端整合2.1、api在api/hosp.js添加方法
//获取预约详情getScheduleDetail(id) { return request({ url: `/front/hosp/schedule/getScheduleDetail/${id}`, method: "get" })}
2.2、页面渲染pages/hospital/booking.vue
源码:https://gitee.com/dengyaojava/guigu-syt-parent
关键词:
尚医通day13【预约挂号】(内附源码)_世界要闻
中国青年初婚越来越迟 黑龙江平均超31岁 河南超29岁
天风证券:历史上一揽子政策有哪些?-全球热闻
Babycare 踏入「无人之境」:当一家新消费公司开出第 100 家门店_全球观天下
环球快看:桐柏县:做好税费服务“五端优化” 擦亮纳税服务“金字招牌”
【报资讯】【晚安余杭】明天10点!看余杭618狂欢大派“兑”,双重福利来咯;161人,事业编!余杭最新招聘;每人两张门票,看余杭请你看演出;欠钱不还!9人被实名曝光;提醒,端午高速不免费;浙江定向培养这类人才!
对招用童工说“不”
美国是什么国家创立的_美国是什么国家
西安市中考首日平稳有序 一把把“雨伞” 撑起少年前行路
129分钟点球绝杀!西甲第20队诞生:最后1秒,地狱到天堂_热议
海参和山药怎么炖好吃?-动态焦点
速看:破窗器原理动图_破窗器原理
有伦农业公司党支部志愿服务队_对于有伦农业公司党支部志愿服务队简单介绍
默默地等等你在红尘中是什么歌曲歌词_默默的等等你在红尘中是什么歌
天天热推荐:湖南新邵:青枝杨梅熟 游客采摘忙
当前关注:端午档新片预售总票房破2000万元 整体表现获业内高期待
黄渤唱歌视频现场版中国好声音_黄渤中国好声音第几期-环球热闻
市级特色学校!天府新区4所学校上榜_天天即时
“新征程·有力量”全市职工宣讲比赛决赛圆满落幕 天天新视野
高合汽车亮相2023粤港澳大湾区车展,引领高端电动汽车创新发展|全球观察
焦点速读:巴州首次口头审理专利侵权纠纷案件
环球观焦点:生态修复力度不断加大 打造野生动物栖息乐园
天天精选!欧洲光伏能源专家:中国光伏技术处世界领先地位
国家能源局:1-8月太阳能发电装机容量约3.5亿千瓦 同比增长27.2%-每日视讯
“爱我商洛”短视频大赛火热进行中,20多名网络达人走进洛南采风! 世界新消息
习近平向第十五届海峡论坛致贺信|全球热点
全球观察:新片场怎么关闭自动播放?新片场关闭自动播放教程
明犯强汉者虽远必诛出自什么时候_明犯强汉者虽远必诛出自
倒计时100天丨杭州亚运会精彩抢先看!
cad2016加快运行速度-天天快资讯