后端订单接口开发

一 准备

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版权协议,转载请附上原文出处链接和本声明。