一 准备
1 订单工具类
/**
* @className: OrderNoUtils
* @description: 订单号工具类
* @date: 2021/1/2
* @author: cakin
*/
public class OrderNoUtils {
/**
* 功能描述:获取订单号
*
* @return String 订单号
* @author cakin
* @date 2021/1/2
*/
public static String getOrderNo() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String newDate = sdf.format(new Date());
String result = "";
Random random = new Random();
for (int i = 0; i < 3; i++) {
result += random.nextInt(10);
}
return newDate + result;
}
}2 课程Dto对象
/**
* @className: CourseDto
* @description: 课程Dto
* @date: 2021/1/2
* @author: cakin
*/
@Data
public class CourseDto implements Serializable {
private static final long serialVersionUID = 1L;
private String id; // 课程ID
private String title; // 课程标题
private BigDecimal price; // 课程销售价格,设置为0则可免费观看
private String cover; // 课程封面图片路径
private String teacherName; // 课程讲师
}DTO(Data Transfer Object):服务和服务之间的数据传输对象。
3 会员Dto
/**
* @className: MemberDto
* @description: 会员Dto
* @date: 2021/1/2
* @author: cakin
*/
@Data
public class MemberDto implements Serializable {
private static final long serialVersionUID = 1L;
private String id; // 会员id
private String mobile; // 手机号
private String nickname; // 昵称
}二 service_edu中创建接口
根据课程id获取订单中需要的课程和讲师信息
1 controller
ApiCourseController
/**
* 功能描述:根据课程id查询课程信息
*
* @param courseId 课程Id
* @return CourseDto 课程Dto
* @author cakin
* @date 2021/1/2
*/
@ApiOperation("根据课程id查询课程信息")
@GetMapping("inner/get-course-dto/{courseId}")
public CourseDto getCourseDtoById(@ApiParam(value = "课程ID", required = true) @PathVariable String courseId) {
CourseDto courseDto = courseService.getCourseDtoById(courseId);
return courseDto;
}2 service层
接口
/**
* 功能描述:根据课程id查询课程信息
*
* @param courseId 课程Id
* @return CourseDto 课程Dto
* @author cakin
* @date 2021/1/2
*/
CourseDto getCourseDtoById(String courseId);实现
/**
* 功能描述:根据课程id查询课程信息
*
* @param courseId 课程Id
* @return CourseDto 课程Dto
* @author cakin
* @date 2021/1/2
*/
@Override
public CourseDto getCourseDtoById(String courseId) {
return baseMapper.selectCourseDtoById(courseId);
}3 mapper
接口
/**
* 功能描述:根据课程id查询课程信息
*
* @param courseId 课程Id
* @return CourseDto 课程Dto
* @author cakin
* @date 2021/1/2
*/
CourseDto selectCourseDtoById(String courseId);XML文件
<select id="selectCourseDtoById" resultType="com.atguigu.guli.service.base.dto.CourseDto">
SELECT
c.id,
c.title,
CONVERT(c.price, DECIMAL(8,2)) AS price,
c.cover,
t.name AS teacherName
FROM edu_course c
LEFT JOIN edu_teacher t ON c.teacher_id = t.id
WHERE
c.id = #{id}
</select>三 service_ucenter中创建接口
根据用户id获取订单中需要的会员信息
1 controller
ApiMemberController
/**
* 功能描述:根据会员id查询会员信息
*
* @param memberId 会员id
* @return MemberDto 会员Dto
* @author cakin
* @date 2021/1/2
*/
@ApiOperation("根据会员id查询会员信息")
@GetMapping("inner/get-member-dto/{memberId}")
public MemberDto getMemberDtoByMemberId(
@ApiParam(value = "会员ID", required = true)
@PathVariable String memberId) {
MemberDto memberDto = memberService.getMemberDtoByMemberId(memberId);
return memberDto;
}2 service
接口
/**
* 功能描述:根据会员id查询会员信息
*
* @param memberId 会员id
* @return MemberDto 会员Dto
* @author cakin
* @date 2021/1/2
*/
MemberDto getMemberDtoByMemberId(String memberId);实现
/**
* 功能描述:根据会员id查询会员信息
*
* @param memberId 会员id
* @return MemberDto 会员Dto
* @author cakin
* @date 2021/1/2
*/
@Override
public MemberDto getMemberDtoByMemberId(String memberId) {
Member member = baseMapper.selectById(memberId);
MemberDto memberDto = new MemberDto();
BeanUtils.copyProperties(member, memberDto);
return memberDto;
}四 service_trade远程调用
1 调用service_edu
接口:
@Service
@FeignClient(value = "service-edu", fallback = EduCourseServiceFallback.class)
public interface EduCourseService {
/**
* @className: EduCourseService
* @description: 根据课程Id获得课程信息
* @date: 2021/1/2
* @author: cakin
*/
@GetMapping("/api/edu/course/inner/get-course-dto/{courseId}")
CourseDto getCourseDtoById(@PathVariable(value = "courseId") String courseId);
}容错:
/**
* @className: EduCourseServiceFallback
* @description: 容错处理
* @date: 2021/1/2
* @author: cakin
*/
@Service
@Slf4j
public class EduCourseServiceFallback implements EduCourseService {
@Override
public CourseDto getCourseDtoById(String courseId) {
log.info("熔断保护");
return null;
}
}2 调用service_ucenter
接口:
/**
* 功能描述:根据会员Id获得会员信息
*
* @param memberId 会员id
* @return MemberDto 会员Dto
* @author cakin
* @date 2021/1/2
*/
@GetMapping("/api/ucenter/member/inner/get-member-dto/{memberId}")
MemberDto getMemberDtoByMemberId(@PathVariable(value = "memberId") String memberId);容错:
/**
* @className: UcenterMemberServiceFallback
* @description: 会员容错
* @date: 2021/1/2
* @author: cakin
*/
@Service
@Slf4j
public class UcenterMemberServiceFallback implements UcenterMemberService {
@Override
public MemberDto getMemberDtoByMemberId(String memberId) {
log.info("熔断保护");
return null;
}
}五 在service_trade中保存订单
1 controller
ApiOrderController创建新增订单方法
/**
* 功能描述:新增订单
*
* @author cakin
* @date 2021/1/2
* @param courseId 课程id
* @param request 从中会得到jwtInfo
* @return R 返回给前端的数据
*/
@ApiOperation("新增订单")
@PostMapping("auth/save/{courseId}")
public R save(@PathVariable String courseId, HttpServletRequest request){
JwtInfo jwtInfo = JwtUtils.getMemberIdByJwtToken(request);
String orderId = orderService.saveOrder(courseId, jwtInfo.getId());
return R.ok().data("orderId", orderId);
}2 service
OrderService接口
/**
* 功能描述:新增订单
*
* @author cakin
* @date 2021/1/2
* @param courseId 课程id
* @param memberId 会员Id
* @return String 订单号
*/
String saveOrder(String courseId, String memberId);OrderServiceImpl实现
/**
* 功能描述:新增订单
*
* @author cakin
* @date 2021/1/2
* @param courseId 课程id
* @param memberId 会员Id
* @return String 订单号
*/
@Override
public String saveOrder(String courseId, String memberId) {
// 查询当前用户是否已有当前课程的订单
QueryWrapper<Order> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("course_id", courseId);
queryWrapper.eq("member_id", memberId);
Order orderExist = baseMapper.selectOne(queryWrapper);
if(orderExist != null){
return orderExist.getId(); // 如果订单已存在,则直接返回订单id
}
// 查询课程信息
CourseDto courseDto = eduCourseService.getCourseDtoById(courseId);
if(courseDto == null){
throw new GuliException(ResultCodeEnum.PARAM_ERROR);
}
// 查询用户信息
MemberDto memberDto = ucenterMemberService.getMemberDtoByMemberId(memberId);
if(memberDto == null){
throw new GuliException(ResultCodeEnum.PARAM_ERROR);
}
// 创建订单
Order order = new Order();
order.setOrderNo(OrderNoUtils.getOrderNo()); //订单号
order.setCourseId(courseId);
order.setCourseTitle(courseDto.getTitle());
order.setCourseCover(courseDto.getCover());
order.setTeacherName(courseDto.getTeacherName());
order.setTotalFee(courseDto.getPrice().multiply(new BigDecimal(100))); // 单位:分
order.setMemberId(memberId);
order.setMobile(memberDto.getMobile());
order.setNickname(memberDto.getNickname());
order.setStatus(0); // 未支付
order.setPayType(1); // 微信支付
baseMapper.insert(order);
return order.getId();
}
版权声明:本文为chengqiuming原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。