feat:订单支付流程完成和验证,添加日志

This commit is contained in:
haoxr 2021-03-20 01:32:27 +08:00
parent 382fc87127
commit 5aec657f19
7 changed files with 55 additions and 37 deletions

View File

@ -1,5 +1,6 @@
package com.youlai.mall.oms.controller.app;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.youlai.common.result.Result;
import com.youlai.mall.oms.pojo.vo.CartVO;
import com.youlai.mall.oms.service.ICartService;
@ -27,30 +28,27 @@ public class CartController {
@ApiOperation(value = "查询购物车")
@GetMapping
@ApiOperationSupport(order = 1)
public Result getCart() {
CartVO cart = cartService.getCart();
return Result.success(cart);
}
@ApiOperation(value = "全选/全不选 购物车商品")
@ApiImplicitParam(name = "checked", value = "全选/全不选", required = true, paramType = "param", dataType = "Boolean")
@PatchMapping("/_check")
public Result check(boolean checked) {
boolean result = cartService.checkAll(checked);
return Result.judge(result);
}
@ApiOperation(value = "清空购物车")
@ApiOperation(value = "删除购物车")
@DeleteMapping
@ApiOperationSupport(order = 2)
public Result deleteCart() {
boolean result = cartService.deleteCart();
return Result.judge(result);
}
@ApiOperation(value = "添加购物车商品")
@ApiImplicitParam(name = "skuId", value = "SKU ID", required = true, paramType = "param", dataType = "Long")
@PostMapping
@ApiOperationSupport(order = 3)
public Result addCartItem(@RequestParam Long skuId) {
cartService.addCartItem(skuId);
return Result.success();
@ -58,20 +56,30 @@ public class CartController {
@ApiOperation(value = "更新购物车商品")
@PutMapping("/skuId/{skuId}")
@ApiOperationSupport(order = 4)
public Result updateCartItem(@PathVariable Long skuId,@RequestBody CartVO.CartItem cartItem) {
cartItem.setSkuId(skuId);
boolean result = cartService.updateCartItem(cartItem);
return Result.judge(result);
}
@ApiOperation(value = "删除购物车商品")
@ApiImplicitParam(name = "skuId", value = "SKU ID", required = true, paramType = "param", dataType = "Long")
@DeleteMapping("/skuId/{skuId}")
@ApiOperationSupport(order = 5)
public Result removeCartItem(@PathVariable Long skuId) {
boolean result = cartService.removeCartItem(skuId);
return Result.judge(result);
}
@ApiOperation(value = "全选/全不选购物车商品")
@ApiImplicitParam(name = "checked", value = "全选/全不选", required = true, paramType = "param", dataType = "Boolean")
@PatchMapping("/_check")
@ApiOperationSupport(order = 6)
public Result check(boolean checked) {
boolean result = cartService.checkAll(checked);
return Result.judge(result);
}
}

View File

@ -31,9 +31,17 @@ import java.util.List;
public class OrderController {
private IOrderService orderService;
private IOrderPayService orderPayService;
@ApiOperation("订单列表")
@GetMapping
@ApiImplicitParam(name = "status", value = "订单状态", required = true, defaultValue = "0")
public Result<List<OrderListVO>> list(Integer status) {
List<OrderListVO> orderList = orderService.list(status);
return Result.success(orderList);
}
@ApiOperation( "订单确认")
@ApiImplicitParam(name = "orderConfirm",value = "确认订单信息",required = true, paramType = "body", dataType = "OrderConfirmDTO")
@PostMapping("/_confirm")
@ -69,12 +77,5 @@ public class OrderController {
return Result.success();
}
@ApiOperation("订单列表")
@GetMapping
public Result<List<OrderListVO>> list(
@ApiParam(name = "status", value = "订单状态", required = true, defaultValue = "0")
@RequestParam(value = "status", defaultValue = "0") Integer status) {
List<OrderListVO> orderList = orderService.list(status);
return Result.success(orderList);
}
}

View File

@ -32,17 +32,18 @@ public class OmsListener {
*/
@RabbitListener(queues = "order.close.queue")
public void closeOrder(String orderToken, Message message, Channel channel) {
log.info("=======================订单超时未支付,开始系统自动关闭订单=======================");
try {
if (orderService.closeOrder(orderToken)) {
// 如果关单成功释放库存
log.info("=======================关闭订单成功,开始释放已锁定的库存=======================");
skuFeignService.unlockStock(orderToken);
} else {
// 如果关单失败则订单可能已经被处理直接手动ACK确认消息
log.info("=======================关单失败,订单状态已处理,手动确认消息处理完毕=======================");
// basicAck(tag,multiple)multiple为true开启批量确认小于tag值队列中未被消费的消息一次性确认
channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
}
} catch (IOException e) {
// 消费失败后重新入队
log.info("=======================系统自动关闭订单消息消费失败,重新入队=======================");
try {
channel.basicReject(message.getMessageProperties().getDeliveryTag(), true);
} catch (IOException ioException) {

View File

@ -64,6 +64,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OmsOrder> impleme
*/
@Override
public OrderConfirmVO confirm(OrderConfirmDTO orderConfirmDTO) {
log.info("=======================订单确认=======================");
OrderConfirmVO orderConfirmVO = new OrderConfirmVO();
Long memberId = RequestUtils.getUserId();
// 获取购买商品信息
@ -111,6 +112,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OmsOrder> impleme
}, threadPoolExecutor);
CompletableFuture.allOf(orderItemsCompletableFuture, addressesCompletableFuture, orderTokenCompletableFuture).join();
log.info("获取确认信息",orderConfirmVO.toString());
return orderConfirmVO;
}
@ -120,7 +122,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OmsOrder> impleme
@Override
@GlobalTransactional
public OrderSubmitVO submit(OrderSubmitDTO submitDTO) {
log.info("=======================订单提交=======================");
// 订单重复提交校验
String orderToken = submitDTO.getOrderToken();
DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>(RELEASE_LOCK_LUA_SCRIPT, Long.class);
@ -188,6 +190,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OmsOrder> impleme
OrderSubmitVO submitVO = new OrderSubmitVO();
submitVO.setOrderId(order.getId());
submitVO.setOrderSn(order.getOrderSn());
log.info("订单提交返回结果:{}",submitVO.toString());
return submitVO;
}
@ -259,10 +262,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, OmsOrder> impleme
@Override
public OmsOrder getByOrderId(Long id) {
Long userId = RequestUtils.getUserId();
Long memberId = RequestUtils.getUserId();
OmsOrder order = this.getOne(new LambdaQueryWrapper<OmsOrder>()
.eq(OmsOrder::getId, id)
.eq(OmsOrder::getMemberId, userId));
.eq(OmsOrder::getMemberId, memberId));
if (order == null) {
throw new BizException("订单不存在订单ID非法");
}

View File

@ -6,7 +6,7 @@ package com.youlai.mall.pms.common.constant;
*/
public interface PmsConstants {
String STOCK_LOCKED_PREFIX = "stock:locked:";
String LOCKED_STOCK_PREFIX = "stock:locked:";
String LOCK_SKU_PREFIX="lock:sku:";
}

View File

@ -8,7 +8,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.common.web.exception.BizException;
import com.youlai.mall.pms.common.constant.PmsConstants;
import com.youlai.mall.pms.mapper.PmsSkuMapper;
import com.youlai.mall.pms.pojo.domain.PmsSku;
import com.youlai.mall.pms.pojo.dto.SkuDTO;
@ -24,8 +23,8 @@ import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
import static com.youlai.mall.pms.common.constant.PmsConstants.LOCKED_STOCK_PREFIX;
import static com.youlai.mall.pms.common.constant.PmsConstants.LOCK_SKU_PREFIX;
import static com.youlai.mall.pms.common.constant.PmsConstants.STOCK_LOCKED_PREFIX;
@Service
@Slf4j
@ -41,7 +40,8 @@ public class PmsSkuServiceImpl extends ServiceImpl<PmsSkuMapper, PmsSku> impleme
*/
@Override
public boolean lockStock(List<SkuLockDTO> skuLockList) {
log.info("=======================创建订单,开始锁定商品库存=======================");
log.info("锁定商品信息:{}", skuLockList.toString());
if (CollectionUtil.isEmpty(skuLockList)) {
throw new BizException("锁定的商品列表为空");
}
@ -80,7 +80,7 @@ public class PmsSkuServiceImpl extends ServiceImpl<PmsSkuMapper, PmsSku> impleme
// 将锁定的商品保存至Redis中
String orderToken = skuLockList.get(0).getOrderToken();
redisTemplate.opsForValue().set(STOCK_LOCKED_PREFIX + orderToken, JSONUtil.toJsonStr(skuLockList));
redisTemplate.opsForValue().set(LOCKED_STOCK_PREFIX + orderToken, JSONUtil.toJsonStr(skuLockList));
return true;
}
@ -89,7 +89,9 @@ public class PmsSkuServiceImpl extends ServiceImpl<PmsSkuMapper, PmsSku> impleme
*/
@Override
public boolean unlockStock(String orderToken) {
String json = redisTemplate.opsForValue().get(STOCK_LOCKED_PREFIX + orderToken);
log.info("=======================订单超时未支付系统自动关单释放库存=======================");
String json = redisTemplate.opsForValue().get(LOCKED_STOCK_PREFIX + orderToken);
log.info("释放库存信息:{}", json);
if (StrUtil.isNotBlank(json)) {
return true;
}
@ -103,7 +105,7 @@ public class PmsSkuServiceImpl extends ServiceImpl<PmsSkuMapper, PmsSku> impleme
);
// 删除redis中锁定的库存
redisTemplate.opsForValue().decrement(STOCK_LOCKED_PREFIX + orderToken);
redisTemplate.delete(LOCKED_STOCK_PREFIX + orderToken);
return true;
}
@ -112,7 +114,9 @@ public class PmsSkuServiceImpl extends ServiceImpl<PmsSkuMapper, PmsSku> impleme
*/
@Override
public boolean deductStock(String orderToken) {
String json = redisTemplate.opsForValue().get(STOCK_LOCKED_PREFIX + orderToken);
log.info("=======================支付成功扣减订单中商品库存=======================");
String json = redisTemplate.opsForValue().get(LOCKED_STOCK_PREFIX + orderToken);
log.info("订单商品信息:{}", json);
if (StrUtil.isBlank(json)) {
return true;
}
@ -131,7 +135,7 @@ public class PmsSkuServiceImpl extends ServiceImpl<PmsSkuMapper, PmsSku> impleme
});
// 删除redis中锁定的库存
redisTemplate.opsForValue().decrement(STOCK_LOCKED_PREFIX + orderToken);
redisTemplate.delete(LOCKED_STOCK_PREFIX + orderToken);
return true;
}
@ -148,7 +152,7 @@ public class PmsSkuServiceImpl extends ServiceImpl<PmsSkuMapper, PmsSku> impleme
public Integer getStockById(Long id) {
Integer stock = 0;
// ->缓存
Object cacheVal = redisTemplate.opsForValue().get(STOCK_LOCKED_PREFIX + id);
Object cacheVal = redisTemplate.opsForValue().get(LOCKED_STOCK_PREFIX + id);
if (cacheVal != null) {
stock = Convert.toInt(cacheVal);
return stock;
@ -162,7 +166,7 @@ public class PmsSkuServiceImpl extends ServiceImpl<PmsSkuMapper, PmsSku> impleme
if (pmsSku != null) {
stock = pmsSku.getStock();
// ->缓存
redisTemplate.opsForValue().set(PmsConstants.STOCK_LOCKED_PREFIX + id, String.valueOf(stock));
redisTemplate.opsForValue().set(LOCKED_STOCK_PREFIX + id, String.valueOf(stock));
}
return stock;

View File

@ -60,7 +60,8 @@
</logger>
<!-- 根logger -->
<root level="INFO">
<root>
<level>INFO</level>
<appender-ref ref="CONSOLE"/>
</root>
</configuration>