尚医通day13【预约挂号】(内附源码)|观天下
2023-06-18 13:35:07来源:博客园
接口分析
(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
责任编辑:hnmd003
相关阅读
相关阅读
-
尚医通day13【预约挂号】(内附源码)|观天下
页面预览 预约挂号-根据预约周期,展示可预约日期,根据有号、无号、
-
被砍的苹果 Apple Watch “高端款”运动硅胶表带流出_今日最新
IT之家6月18日消息,著名苹果产品收藏家Kosutami目前发布推文,曝光了
-
一加称不打算进军笔记本电脑市场,专注高端平板和折叠屏手机
IT之家6月18日消息,一加手机的总裁兼首席运营官KinderLiu在接受Truste
-
尼古拉斯 · 凯奇现身小岛秀夫东京工作室,或将客串《死亡搁浅 2》
IT之家6月18日消息,游戏开发者小岛秀夫于6月15日发布推文,晒出了他与
-
大规模网络钓鱼活动利用 6000 个网站,冒充 100 个知名品牌_全球球精选
自2022年6月以来,一场针对100多个流行服装、鞋类和服饰品牌的大范围品
-
基于扩散模型的音频驱动说话人生成,云从 & 上交数字人研究入选 ICASSP 2023 世界最新
机器之心发布机器之心专栏近日,国际语音及信号处理领域顶级会议ICASSP
-
小红书上的减肥训练营,背水一战还是饮鸩止渴?
图片来源@视觉中国文|五环外OUTSIDE,作者|刘奕然,编辑|车卯卯312斤女
-
环球快讯:夏天到了,给数据中心泼点“冷水”
图片来源@视觉中国文|脑极体气温上升,还有什么能比工作没了,更能让人
-
取代 AMD!英伟达成大摩“ AI 首选股”:股价狂飙 200% 后有望再涨 17%_世界新消息
作为今年美股市场上最耀眼的明星,英伟达无疑是AI芯片领域的霸主,而其
-
折扣店的“羊毛”,年轻人快薅不动了
图片来源@视觉中国文|Tech星球,作者|林京田雨最近逛嗨特购有些郁闷,
-
深刻感受西藏深厚历史底蕴和独特艺术魅力 天天实时
中国西藏自治区被称为“世界屋脊”,也被认为是一望无际的大地上拥有独
-
当前消息!为建设数字西藏添砖加瓦
盘石与西藏目前数字经济产业布局有很高的契合度,将致力于服务西藏数字
-
全球滚动:irr增额终身寿险是什么意思?收益如何?
IRR的全称是内部收益率(InternalRateofReturn),是指一个项目或投资
-
爱心人寿增额寿险可靠吗?特点有哪些?
可靠。作为一家颇具声誉的保险公司,爱心人寿保险公司在行业内拥有良好
-
大家鑫佑所享养老年金保险可靠吗?有什么保障?
可靠。作为一款由大家保险公司推出的养老保险产品,大家鑫佑所享养老年
-
世界看点:增额终身寿险保费一般要多少?要交多久?
不同的产品,不同的情况,价格都不一样,增额终身寿险一年交几千、几万
-
富德生命大富翁年金保险怎么样?好处有哪些?
很不错。富德生命大富翁年金保险是一种专门为退休生活提供保障的保险产
-
4天3涨停 特斯拉FSD入华传言“带火”概念股 仍临多重挑战|全球即时
【4天3涨停特斯拉FSD入华传言“带火”概念股仍临多重挑战】新晋“特斯
-
最新便民措施来了!事关医保转移接续、异地就医直接结算→-环球今亮点
6月17日,国家医保局发布了《关于实施医保服务十六项便民措施的通知》
-
今热点:vivo X100 Pro+ 假想图曝光 设计出人意料 明年年初登场
【手机中国新闻】近日,数码博主@定焦数码放出了根据相关爆料信息制作
-
视频版 Midjourney 又进化了:一句话生成视频,谷歌注资,网友大呼好莱坞已死! 热消息
提到国外的生成式AI大模型,文本生成领域有ChatGPT,图像生成领域有Mid
-
马斯克称人工智能对公众存在风险 这项技术应该受到监管
据央视新闻消息,法国科技万岁科技创新展正在巴黎举行,当地时间16日,
-
业内人士:市场的“城投信仰”在中短期内仍将延续 每日速读
受去年地产销售下滑、部分平台融资不规范等影响,14万亿规模的城投债市
-
腾讯电脑管家 6 月 20 日起下线“QQ 安全达人”功能
IT之家6月18日消息,腾讯电脑管家发布公告称,自2023年6月20日起,QQ安
-
中韩悦未来养老年金保险可靠吗?具体保障是什么?
可靠。中韩悦未来养老年金保险投保年龄在30天到60岁之间,保障期限到10
-
增额终身寿险4.025是什么意思?好吗?-全球今日报
4 025是指增额终身寿险的保险金额增长率,也就是说,保险人每年可以获
-
智惠安享年金保险条款有哪些?特点是什么? 天天时讯
投保年龄:本保险接受的被保险人投保年龄范围为0周岁—55周岁。保险费
-
定期增额终身寿险是什么意思?好不好? 天天热头条
定期增额终身寿险是指在传统的终身寿险基础上增加了现金价值积累和投资
-
珠江智尊宝年金保险好不好呢?保障有哪些?
很好。作为一款养老保险产品,珠江智尊宝年金保险具有以下几个好处:全
-
爱旭股份新品发布暨客户答谢晚宴闪耀慕尼黑_世界通讯
当地时间6月14日晚,爱旭股份(以下简称“爱旭”,证券代码:600732)
精彩推荐
阅读排行
精彩推送
- 从小红书到闲鱼海鲜市场,窥探Z...
- 热门看点:包粽子、造龙舟、收艾...
- 法拉第未来宣布首款车型 FF91 ...
- 时隔一个月,中国再度减持!|今...
- 超 73%QDII 基金今年取得正收...
- 疯狂小杨哥是下一个辛巴吗?-世...
- 五个正在省钱的年轻人,一个已经...
- 世界今日报丨第五届中国西藏旅游...
- 受贿2281余万元,甘肃省工信厅原...
- 福多多年金保险划算吗?有什么保...
- 香港增额寿险利率是多少?多少合...
- 增额寿险irr计算公式是什么?计...
- 补充养老保险和职业年金一样吗?...
- 当前动态:龙行富贵c款年金保险可...
- 一组长图看懂中国古代治乱兴衰史...
- 【世界独家】青春之光,闪耀追梦...
- 【当前热闻】为什么中国一有创新...
- 华为 MatePad Air 击破移动办...
- 聚焦新市民、年轻人,多地出台公...
- 新品发布会邀请函文案请帖-新品...
- 信泰如意享养老年金保险的优点与...
- 当前动态:增额寿险坑在哪?增额...
- 如意来年金保险条款有哪些?特点...
- 增额终身寿险调整哪些地方?怎么...
- 当前视讯!国寿寿险怎么样?有哪...
- 韵达股份变更持续督导保荐代表人...
- 在东京教课的马云回来了:现身杭...
- 试用了苹果新出的工具,Mac 畅...
- 法拉第未来宣布首款车型 FF91 ...
- 为什么中国一有创新,就被说套壳...