package org.jeecg.modules.test.seata.order.service.impl;
|
import com.baomidou.dynamic.datasource.annotation.DS;
|
|
import io.seata.spring.annotation.GlobalTransactional;
|
import lombok.extern.slf4j.Slf4j;
|
import org.jeecg.modules.test.seata.order.dto.PlaceOrderRequest;
|
import org.jeecg.modules.test.seata.order.entity.SeataOrder;
|
import org.jeecg.modules.test.seata.order.enums.OrderStatus;
|
import org.jeecg.modules.test.seata.order.feign.AccountClient;
|
import org.jeecg.modules.test.seata.order.feign.ProductClient;
|
import org.jeecg.modules.test.seata.order.mapper.SeataOrderMapper;
|
import org.jeecg.modules.test.seata.order.service.SeataOrderService;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import javax.annotation.Resource;
|
import java.math.BigDecimal;
|
|
/**
|
* @Description: 订单服务类
|
* @author: zyf
|
* @date: 2022/01/24
|
* @version: V1.0
|
*/
|
@Slf4j
|
@Service
|
public class SeataOrderServiceImpl implements SeataOrderService {
|
|
@Resource
|
private SeataOrderMapper orderMapper;
|
@Resource
|
private AccountClient accountClient;
|
@Resource
|
private ProductClient productClient;
|
|
@DS("order")
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
@GlobalTransactional
|
public void placeOrder(PlaceOrderRequest request) {
|
log.info("=============ORDER START=================");
|
Long userId = request.getUserId();
|
Long productId = request.getProductId();
|
Integer count = request.getCount();
|
log.info("收到下单请求,用户:{}, 商品:{},数量:{}", userId, productId, count);
|
|
|
SeataOrder order = SeataOrder.builder()
|
.userId(userId)
|
.productId(productId)
|
.status(OrderStatus.INIT)
|
.count(count)
|
.build();
|
|
orderMapper.insert(order);
|
log.info("订单一阶段生成,等待扣库存付款中");
|
// 扣减库存并计算总价
|
BigDecimal amount = productClient.reduceStock(productId, count);
|
// 扣减余额
|
accountClient.reduceBalance(userId, amount);
|
|
order.setStatus(OrderStatus.SUCCESS);
|
order.setTotalPrice(amount);
|
orderMapper.updateById(order);
|
log.info("订单已成功下单");
|
log.info("=============ORDER END=================");
|
}
|
}
|