尚医通 04
9. 预约挂号功能#
- 选择医院, 科室后, 显示可预约的挂号信息
- 接口分析
- 根据预约周期,展示可预约日期数据,按分页展示
- 选择日期展示当天可预约列表(该接口后台已经实现过)
- 代码实现, 前端逻辑, 点击科室后,首先请求http://localhost/api/hosp/hospital/auth/getBookingScheduleRule/1/7/1000_0/200040878 获得可预约排版数据, 再默认显示第一个日期对应的排班数据http://localhost/api/hosp/hospital/auth/findScheduleList/1000_0/200040878/2022-08-24
- 在serviceImpl中需要分页展示七天内的排版信息, 可预约天数保存在Hospital.bookingRule.cycle 中, 若当天无排班信息或无号, 均显示无号
//获取可预约排班数据
@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));
}
10. 预约下单功能#
10.1 需求分析#
下单参数:就诊人id与排班id
1、下单我们要获取就诊人信息
2、获取排班下单信息与规则信息
3、获取医院签名信息,然后通过接口去医院(localhost:9998)预约下单
4、下单成功更新排班信息与发送短信
10.2 搭建service-order模块#
10.3 封装Feign调取接口#
10.3.1 获取就诊人信息api接口#
@FeignClient(value = "service-user")
@Repository
public interface PatientFeignClient {
//获取就诊人
@GetMapping("/api/user/patient/inner/get/{id}")
Patient getPatient(@PathVariable("id") Long id);
}
10.3.2 获取排班下单信息api接口#
@FeignClient(value = "service-hosp")
@Repository
public interface HospitalFeignClient {
/**
* 根据排班id获取预约下单数据
*/
@GetMapping("/api/hosp/hospital/inner/getScheduleOrderVo/{scheduleId}")
ScheduleOrderVo getScheduleOrderVo(@PathVariable("scheduleId") String scheduleId);
/**
* 获取医院签名信息 在hospitalSet表中
*/
@GetMapping("/api/hosp/hospital/inner/getSignInfoVo/{hoscode}")
SignInfoVo getSignInfoVo(@PathVariable("hoscode") String hoscode);
}
10.4 订单实现#
order (生产者) -----》携带路由和交换机到hosp(消费者1)里进行库存 hosp里携带短信的交换机和路由到msm(消费者2)模块进行短信发送
10.4.1 引入rabbitMq#
- 新建模块rabbit-util
- 在该模块中配置生产者
@Service
public class RabbitService {
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* 发送消息
* @param exchange 交换机
* @param routingKey 路由键
* @param message 消息
*/
public boolean sendMessage(String exchange, String routingKey, Object message) {
rabbitTemplate.convertAndSend(exchange, routingKey, message);
return true;
}
}
- Service 中添加接口
@Override
public boolean sendEmail(MsmVo msmVo) {
if(!StringUtils.isEmpty(msmVo.getEmail())) {
String code = (String)msmVo.getParam().get("code");
return this.sendEmail(msmVo.getEmail(),code);
}
return false;
}
- 封装mq监听器
@Component("rabbitConsumer")
public class MsmReceiver {
@Autowired
private MsmService msmService;
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = MqConst.QUEUE_MSM_ITEM, durable = "true"),
exchange = @Exchange(value = MqConst.EXCHANGE_DIRECT_MSM),
key = {MqConst.ROUTING_MSM_ITEM}
))
public void sendEmail(MsmVo msmVo) {
msmService.sendEmail(msmVo);
}
}
- OrderServiceImpl 发送消息给rabbitmq
//保存订单
@Override
public Long saveOrder(String scheduleId, Long patientId) {
// ....
// ....
//发送mq消息,号源更新和邮箱通知
//发送mq信息更新号源
OrderMqVo orderMqVo = new OrderMqVo();
orderMqVo.setScheduleId(scheduleId);
orderMqVo.setReservedNumber(reservedNumber);
orderMqVo.setAvailableNumber(availableNumber);
// 短信提示
MsmVo msmVo = new MsmVo();
msmVo.setEmail(orderInfo.getPatientemail());
String reserveDate = new DateTime(orderInfo.getReserveDate()).toString("yyyy-MM-dd") + (orderInfo.getReserveTime()==0 ? "上午" : "下午");
Map<String,Object> param = new HashMap<String,Object>(){{
put("title", orderInfo.getHosname()+"|"+orderInfo.getDepname()+"|"+orderInfo.getTitle());
put("amount", orderInfo.getAmount());
put("reserveDate", reserveDate);
put("name", orderInfo.getPatientName());
put("quitTime", new DateTime(orderInfo.getQuitTime()).toString("yyyy-MM-dd HH:mm"));
}};
msmVo.setParam(param);
orderMqVo.setMsmVo(msmVo);
rabbitService.sendMessage(MqConst.EXCHANGE_DIRECT_ORDER, MqConst.ROUTING_ORDER, orderMqVo);
} else {
throw new HospitalException(result.getString("message"), ResultCodeEnum.FAIL.getCode());
}
return orderInfo.getId();
}
10.5 微信支付功能#
10.6 订单取消功能#
点击取消预约按钮-------> service-order模块 /api/order/orderInfo/auth/cancelOrder/{orderId} -------->得到订单信息,判断是否已过可取消时间 ---------> 调用医院接口(hospital-manage)实现预约取消 -----------> 调用微信退款方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异