当前位置:   article > 正文

举例详细学习和分析后端业务逻辑代码开发思路(二)

举例详细学习和分析后端业务逻辑代码开发思路(二)

今天继续来一个简单清晰的业务逻辑开发!

业务:取消订单(管理端)

业务规则:

  • 取消订单其实就是将订单状态修改为“已取消”

  • 商家取消订单时需要指定取消原因

  • 商家取消订单时,如果用户已经完成了支付,需要为用户退款

接口设计:

        基本信息:Path:/admin/order/cancel

                          Method:PUT

        请求参数:无

代码实现:

DTO类,可以简单当做一个实体类,这个只是准确地根据数据库进行比较严格的封装。

OrdersCancelDTO 
  1. @Data
  2. public class OrdersCancelDTO implements Serializable {
  3. private Long id;
  4. //订单取消原因
  5. private String cancelReason;
  6. }

@Data注解就不用多说了,省略了get,set...等方法的啰嗦写法。纯属正常实体类的书写。

 Controller类:

OrderController
  1.   /**
  2.      * 取消订单
  3.      *
  4.      * @return
  5.      */
  6.     @PutMapping("/cancel")
  7.     @ApiOperation("取消订单")
  8.     public Result cancel(@RequestBody OrdersCancelDTO ordersCancelDTO) throws Exception {
  9.         orderService.cancel(ordersCancelDTO);
  10.         return Result.success();
  11.     }

到了日常开始的控制层,这里cancel内部用来接收取消订单的整个实体对象,然后对其进行取消处理。上面也提到,取消订单就是修改其状态罢了,先对其进行封装接收,再对其进行修改。

 service接口层:

OrderService

 

  1. /**
  2. * 商家取消订单
  3. *
  4. * @param ordersCancelDTO
  5. */
  6. void cancel(OrdersCancelDTO ordersCancelDTO) throws Exception;

接着就是服务层,这个就不说了,很常规的创建方法。

 实现类:

OrderServiceImpl

  

  1. /**
  2.      * 取消订单
  3.      *
  4.      * @param ordersCancelDTO
  5.      */
  6.     public void cancel(OrdersCancelDTO ordersCancelDTO) throws Exception {
  7.         // 根据id查询订单
  8.         Orders ordersDB = orderMapper.getById(ordersCancelDTO.getId());
  9.         //支付状态
  10.         Integer payStatus = ordersDB.getPayStatus();
  11.         if (payStatus == 1) {
  12.             //用户已支付,需要退款
  13.             String refund = weChatPayUtil.refund(
  14.                     ordersDB.getNumber(),
  15.                     ordersDB.getNumber(),
  16.                     new BigDecimal(0.01),
  17.                     new BigDecimal(0.01));
  18.             log.info("申请退款:{}", refund);
  19.         }
  20.         // 管理端取消订单需要退款,根据订单id更新订单状态、取消原因、取消时间
  21.         Orders orders = new Orders();
  22.         orders.setId(ordersCancelDTO.getId());
  23.         orders.setStatus(Orders.CANCELLED);
  24.         orders.setCancelReason(ordersCancelDTO.getCancelReason());
  25.         orders.setCancelTime(LocalDateTime.now());
  26.         orderMapper.update(orders);
  27.     }

这里来实现接口层创建的方法,里面的操作自己可以去理解理解,其中用到了两个逻辑方法,getById()和update(),都在持久层mapper中进行扩展。

 持久层mapper:

OrderMapper

 

  1. /**
  2. * 根据id查询订单
  3. * @param id
  4. * @return
  5. */
  6. @Select("select * from orders where id = #{id};")
  7. Orders getById(Long id);
  8. /**
  9. * 修改订单信息
  10. * @param orders
  11. */
  12. void update(Orders orders);

这里就是对上面两个方法进行实现,可以看到,之前发的文章中提到的简单的sql语句和复杂的动态sql语句,在这里都体现出来了,getById()简单的编写出来,二update()则在下面的XML映射文件中进行编写。

 XML映射文件:

OrderMapper.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  4. <mapper namespace="com.sky.mapper.OrderMapper">
  5. <update id="update" parameterType="com.sky.entity.Orders">
  6. update orders
  7. <set>
  8. <if test="cancelReason != null and cancelReason!='' ">
  9. cancel_reason=#{cancelReason},
  10. </if>
  11. <if test="rejectionReason != null and rejectionReason!='' ">
  12. rejection_reason=#{rejectionReason},
  13. </if>
  14. <if test="cancelTime != null">
  15. cancel_time=#{cancelTime},
  16. </if>
  17. <if test="payStatus != null">
  18. pay_status=#{payStatus},
  19. </if>
  20. <if test="payMethod != null">
  21. pay_method=#{payMethod},
  22. </if>
  23. <if test="checkoutTime != null">
  24. checkout_time=#{checkoutTime},
  25. </if>
  26. <if test="status != null">
  27. status = #{status},
  28. </if>
  29. <if test="deliveryTime != null">
  30. delivery_time = #{deliveryTime}
  31. </if>
  32. </set>
  33. where id = #{id}
  34. </update>
  35. </mapper>

到这里,可以理解为什么要在xml单独写sql了吧,因为有写动态sql确实很复杂,总不能都写在mapper层里面或service层里面吧!

 今天,就到这里了!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/938099

推荐阅读
相关标签