SpringCloud天机学堂:我的课表(三)
1、添加课程到课表
首先,用户支付完成后,需要将购买的课程加入课表:
而支付成功后,交易服务会基于MQ通知的方式,通知学习服务来执行加入课表的动作。因此,我们要实现的第一个接口就是:
支付或报名课程后,监听到MQ通知,将课程加入课表。
在trade-service
的OrderController
中,有一个报名免费课程的接口:
@ApiOperation("免费课立刻报名接口")
@PostMapping("/freeCourse/{courseId}")
public PlaceOrderResultVO enrolledFreeCourse(
@ApiParam("免费课程id") @PathVariable("courseId") Long courseId) {
return orderService.enrolledFreeCourse(courseId);
}
可以看到这里调用了OrderService
的enrolledFreeCourse()
方法:
@Override
@Transactional
public PlaceOrderResultVO enrolledFreeCourse(Long courseId) {
Long userId = UserContext.getUser();
// 1.查询课程信息
List<Long> cIds = CollUtils.singletonList(courseId);
List<CourseSimpleInfoDTO> courseInfos = getOnShelfCourse(cIds);
if (CollUtils.isEmpty(courseInfos)) {
// 课程不存在
throw new BizIllegalException(TradeErrorInfo.COURSE_NOT_EXISTS);
}
CourseSimpleInfoDTO courseInfo = courseInfos.get(0);
if(!courseInfo.getFree()){
// 非免费课程,直接报错
throw new BizIllegalException(TradeErrorInfo.COURSE_NOT_FREE);
}
// 2.创建订单
Order order = new Order();
// 2.1.基本信息
order.setUserId(userId);
order.setTotalAmount(0);
order.setDiscountAmount(0);
order.setRealAmount(0);
order.setStatus(OrderStatus.ENROLLED.getValue());
order.setFinishTime(LocalDateTime.now());
order.setMessage(OrderStatus.ENROLLED.getProgressName());
// 2.2.订单id
Long orderId = IdWorker.getId(order);
order.setId(orderId);
// 3.订单详情
OrderDetail detail = packageOrderDetail(courseInfo, order);
// 4.写入数据库
saveOrderAndDetails(order, CollUtils.singletonList(detail));
// 5.发送MQ消息,通知报名成功
rabbitMqHelper.send(
MqConstants.Exchange.ORDER_EXCHANGE,
MqConstants.Key.ORDER_PAY_KEY,
OrderBasicDTO.builder().orderId(orderId).userId(userId).courseIds(cIds).build());
// 6.返回vo
return PlaceOrderResultVO.builder()
.orderId(orderId)
.payAmount(0)
.status(order.getStatus())
.build();
}
其中,通知报名成功的逻辑是这部分:
由此,我们可以得知发送消息的Exchange、RoutingKey,以及消息体。消息体的格式是OrderBasicDTO,包含四个字段:
- orderId:订单id
- userId:下单的用户id
- courseIds:购买的课程id集合
- finishTime:支付完成时间
因此,在学习服务,我们需要编写的消息监听接口规范如下:
接口说明 | 当用户购买/报名课程后,交易服务(trade-service)会通过MQ消息通知其它微服务。学习服务(learning-service)需要监听该通知,将用户报名的课程加入我的课表中。 |
---|---|
请求方式 | MQ异步通知:exchange :MqConstants.Exchange.ORDER_EXCHANGE routingKey :MqConstants.Key.ORDER_PAY_KEY |
请求路径 | – |
请求参数格式 | { "orderId": "1578558664933920770", // 订单id "userId": "2", // 用户id "courseIds": [ "1549025085494521857" // 购买的课程id集合 ], "finishTime": "2023-02-21" // 支付完成 |