blob: 40d996a140bbd7c3caa13c5320a78921529a2204 [file] [log] [blame]
package io.seata.samples.mutiple.datasource.service.impl;
import io.seata.core.context.RootContext;
import io.seata.samples.mutiple.datasource.common.OperationResponse;
import io.seata.samples.mutiple.datasource.common.order.Order;
import io.seata.samples.mutiple.datasource.common.order.OrderStatus;
import io.seata.samples.mutiple.datasource.common.order.PlaceOrderRequestVO;
import io.seata.samples.mutiple.datasource.config.DataSourceKey;
import io.seata.samples.mutiple.datasource.config.DynamicDataSourceContextHolder;
import io.seata.samples.mutiple.datasource.dao.OrderDao;
import io.seata.samples.mutiple.datasource.service.OrderService;
import io.seata.samples.mutiple.datasource.service.PayService;
import io.seata.samples.mutiple.datasource.service.StockService;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author HelloWoodes
*/
@Service
@Slf4j
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderDao orderDao;
@Autowired
private PayService payService;
@Autowired
private StockService stockService;
@GlobalTransactional
@Override
public OperationResponse placeOrder(PlaceOrderRequestVO placeOrderRequestVO) throws Exception {
log.info("=============ORDER=================");
DynamicDataSourceContextHolder.setDataSourceKey(DataSourceKey.ORDER);
log.info("当前 XID: {}", RootContext.getXID());
Integer amount = 1;
Integer price = placeOrderRequestVO.getPrice();
Order order = Order.builder()
.userId(placeOrderRequestVO.getUserId())
.productId(placeOrderRequestVO.getProductId())
.status(OrderStatus.INIT)
.payAmount(price)
.build();
Integer saveOrderRecord = orderDao.saveOrder(order);
log.info("保存订单{}", saveOrderRecord > 0 ? "成功" : "失败");
// 扣减库存
DynamicDataSourceContextHolder.setDataSourceKey(DataSourceKey.STOCK);
boolean operationStockResult = stockService.reduceStock(placeOrderRequestVO.getProductId(), amount);
// 扣减余额
DynamicDataSourceContextHolder.setDataSourceKey(DataSourceKey.PAY);
boolean operationBalanceResult = payService.reduceBalance(placeOrderRequestVO.getUserId(), price);
log.info("=============ORDER=================");
DynamicDataSourceContextHolder.setDataSourceKey(DataSourceKey.ORDER);
Integer updateOrderRecord = orderDao.updateOrder(order.getId(), OrderStatus.SUCCESS);
log.info("更新订单:{} {}", order.getId(), updateOrderRecord > 0 ? "成功" : "失败");
return OperationResponse.builder()
.success(operationStockResult && operationBalanceResult)
.build();
}
}