1、流程图
2、订单生成
-业务介绍
1. 支付成功
2. 进行订单数据保存
3. 异步清空对应的购物车数据
4. 异步修改商品的库存和销售信息
5. 单业务涉及多DML语句,注意添加事务
2.1功能实现
2.1.1 param定义
@JsonIgnoreProperties(ignoreUnknown = true)
@Data
public class OrderParam implements Serializable {
public static final Long serialVersionUID = 1L;
@JsonProperty("user_id")
private Integer userId;
private List<CartVo> products;
}
@Data
public class ProductNumberParam {
private Integer productId;
private Integer productNum;
}
2.1.2 pojo定义
@JsonIgnoreProperties(ignoreUnknown = true)
@Data
@TableName("orders")
public class Order implements Serializable {
@TableId(type = IdType.AUTO)
private Integer id;
@JsonProperty("order_id")
private Long orderId;
@JsonProperty("user_id")
private Integer userId;
@JsonProperty("product_id")
private Integer productId;
@JsonProperty("product_num")
private Integer productNum;
@JsonProperty("product_price")
private Double productPrice;
@JsonProperty("order_time")
private Long orderTime;
}
2.1.3 oderVo
@JsonIgnoreProperties(ignoreUnknown = true)
@Data
public class OrderVo extends Order {
@JsonProperty("product_name")
private String productName;
@JsonProperty("product_picture")
private String productPicture;
}
2.1.4 controller
@RequestMapping("/order")
public class OrderController {
@Autowired
private OrderService orderService;
@PostMapping("save")
public Object save(@RequestBody OrderParam orderParam){
return orderService.save(orderParam);
}
2.1.5 rabbitMQ关系绑定
2.1.6 service
public interface OrderService extends IService<Order> {
@Slf4j
@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper,Order> implements OrderService {
@Autowired
private ProductClient productClient;
@Autowired
private RabbitTemplate rabbitTemplate;
@Transactional
@Override
public Object save(OrderParam orderParam) {
List<Integer> cartIds = new ArrayList<>();
List<Order> orderList = new ArrayList<>();
List<ProductNumberParam> productNumberParamList =
new ArrayList<>();
Integer userId = orderParam.getUserId();
List<CartVo> products = orderParam.getProducts();
long ctime = System.currentTimeMillis();
for (CartVo cartVo : products) {
cartIds.add(cartVo.getId());
Order order = new Order();
order.setOrderId(ctime);
order.setUserId(userId);
order.setOrderTime(ctime);
order.setProductId(cartVo.getProductID());
order.setProductNum(cartVo.getNum());
order.setProductPrice(cartVo.getPrice());
orderList.add(order);
ProductNumberParam productNumberParam = new ProductNumberParam();
productNumberParam.setProductId(cartVo.getProductID());
productNumberParam.setProductNum(cartVo.getNum());
productNumberParamList.add(productNumberParam);
}
this.saveBatch(orderList);
rabbitTemplate.convertAndSend("topic.ex","sub.number",productNumberParamList);
rabbitTemplate.convertAndSend("topic.ex","clear.cart",cartIds);
R ok = R.ok("订单生成成功!");
log.info("OrderServiceImpl.save业务结束,结果:{}",ok);
return ok;
}
}
2.1.7 mapper
public interface OrderMapper extends BaseMapper<Order> {
}
2.1.8 productListener
@Component
public class ProductListener {
@Autowired
private ProductService productService;
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "sub.queue"),
exchange = @Exchange("topic.ex"),
key = "sub.number"
))
public void subNumber(List<ProductNumberParam> productNumberParams){
System.err.println("ProductListener.subNumber");
System.err.println("productNumberParams = " + productNumberParams);
productService.batchNumber(productNumberParams);
}
}
@Transactional
@Override
public void batchNumber(List<ProductNumberParam> productNumberParams) {
Map<Integer, ProductNumberParam> productNumberParamMap = productNumberParams.stream()
.collect(Collectors.toMap(ProductNumberParam::getProductId, v -> v));
Set<Integer> productIds = productNumberParamMap.keySet();
List<Product> productList = baseMapper.selectBatchIds(productIds);
for (Product product : productList) {
product.setProductNum(product.getProductNum() -
productNumberParamMap.get(product.getProductId()).getProductNum());
product.setProductSales(product.getProductSales() +
productNumberParamMap.get(product.getProductId()).getProductNum());
}
this.updateBatchById(productList);
}
2.1.8 cartListener
@Component
public class CartListener {
@Autowired
private CartService cartService;
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "clear.queue"),
exchange = @Exchange("topic.ex"),
key = "clear.cart"
))
public void subNumber(List<Integer> cartIds){
System.out.println("CartListener.subNumber");
System.out.println("cartIds = " + cartIds);
cartService.removeBatchByIds(cartIds);
}
}
public class CartServiceImpl extends ServiceImpl<CartMapper,Cart> implements CartService {