feat(orders.manager):新增缓存查询的订单信息的功能

This commit is contained in:
JIAN
2024-09-22 21:37:32 +08:00
parent bd63adf3c6
commit 35e760435d
3 changed files with 72 additions and 47 deletions

View File

@@ -1,12 +1,10 @@
package com.jzo2o.orders.base.mapper;
import com.jzo2o.orders.base.model.domain.Orders;
import com.jzo2o.orders.base.model.dto.OrderUpdateStatusDTO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jzo2o.orders.base.model.domain.Orders;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;
import java.time.LocalDateTime;
import java.util.List;
/**
* <p>
@@ -17,6 +15,10 @@ import java.time.LocalDateTime;
* @since 2023-08-02
*/
public interface OrdersMapper extends BaseMapper<Orders> {
}
/**
* 用户端滚动查询使用
*/
List<Long> selectOrderIdList(@Param("currentUserId") Long currentUserId,
@Param("ordersStatus") Integer ordersStatus,
@Param("sortBy") Long sortBy);
}

View File

@@ -1,5 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jzo2o.orders.base.mapper.OrdersMapper">
</mapper>
<select id="selectOrderIdList" resultType="java.lang.Long">
select id from orders
<where>
<if test="ordersStatus != null">
orders_status = #{ordersStatus}
</if>
and user_id = #{currentUserId}
and display = 1
<if test="sortBy != null">
and sort_by &lt; #{sortBy}
</if>
</where>
LIMIT 10
</select>
</mapper>

View File

@@ -1,30 +1,33 @@
package com.jzo2o.orders.manager.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jzo2o.api.orders.dto.response.OrderResDTO;
import com.jzo2o.api.orders.dto.response.OrderSimpleResDTO;
import com.jzo2o.common.enums.EnableStatusEnum;
import com.jzo2o.common.utils.BeanUtils;
import com.jzo2o.common.utils.CollUtils;
import com.jzo2o.common.utils.JsonUtils;
import com.jzo2o.common.utils.ObjectUtils;
import com.jzo2o.orders.base.constants.RedisConstants;
import com.jzo2o.orders.base.enums.OrderStatusEnum;
import com.jzo2o.orders.base.handler.OrderStateMachine;
import com.jzo2o.orders.base.mapper.OrdersMapper;
import com.jzo2o.orders.base.model.domain.Orders;
import com.jzo2o.orders.base.model.domain.OrdersCanceled;
import com.jzo2o.orders.base.model.dto.OrderSnapshotDTO;
import com.jzo2o.orders.manager.service.IOrdersCanceledService;
import com.jzo2o.orders.manager.service.IOrdersManagerService;
import com.jzo2o.redis.helper.CacheHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import static com.jzo2o.orders.base.constants.FieldConstants.SORT_BY;
import java.util.stream.Collectors;
/**
* <p>
@@ -36,8 +39,12 @@ import static com.jzo2o.orders.base.constants.FieldConstants.SORT_BY;
@Slf4j
@Service
public class OrdersManagerServiceImpl extends ServiceImpl<OrdersMapper, Orders> implements IOrdersManagerService {
@Resource
private OrderStateMachine orderStateMachine;
@Resource
private IOrdersCanceledService ordersCanceledService;
@Resource
private CacheHelper cacheHelper;
/**
* 订单超时时间
@@ -61,20 +68,27 @@ public class OrdersManagerServiceImpl extends ServiceImpl<OrdersMapper, Orders>
*/
@Override
public List<OrderSimpleResDTO> consumerQueryList(Long currentUserId, Integer ordersStatus, Long sortBy) {
// 1.构造查询条件
LambdaQueryWrapper<Orders> queryWrapper = Wrappers.<Orders>lambdaQuery()
.eq(ObjectUtils.isNotNull(ordersStatus), Orders::getOrdersStatus, ordersStatus)
.lt(ObjectUtils.isNotNull(sortBy), Orders::getSortBy, sortBy)
.eq(Orders::getUserId, currentUserId)
.eq(Orders::getDisplay, EnableStatusEnum.ENABLE.getStatus());
Page<Orders> queryPage = new Page<>();
queryPage.addOrder(OrderItem.desc(SORT_BY));
queryPage.setSearchCount(false);
// 获取待查询详情的订单id集合
List<Long> orderIdList = baseMapper.selectOrderIdList(currentUserId, ordersStatus, sortBy);
// 2.查询订单列表
Page<Orders> ordersPage = baseMapper.selectPage(queryPage, queryWrapper);
List<Orders> records = ordersPage.getRecords();
return BeanUtil.copyToList(records, OrderSimpleResDTO.class);
if (CollUtils.isEmpty(orderIdList)) {
return new ArrayList<>();
}
return cacheHelper.batchGet(
String.format(RedisConstants.RedisKey.ORDERS, currentUserId),
orderIdList,
(noCachedIds, clazz) -> {
List<Orders> ordersList = batchQuery(noCachedIds);
if (CollUtils.isEmpty(ordersList)) {
// 防止缓存穿透返回空数据
return new HashMap<>();
}
return ordersList.stream().collect(
Collectors.toMap(Orders::getId, orders -> BeanUtils.toBean(orders, clazz)));
},
OrderSimpleResDTO.class,
RedisConstants.Ttl.ORDERS_PAGE_TTL);
}
/**
@@ -84,29 +98,25 @@ public class OrdersManagerServiceImpl extends ServiceImpl<OrdersMapper, Orders>
*/
@Override
public OrderResDTO getDetail(Long id) {
Orders orders = baseMapper.selectById(id);
if (ObjectUtils.isEmpty(orders)) {
return new OrderResDTO();
OrderSnapshotDTO orderSnapshot = JsonUtils.toBean(orderStateMachine.getCurrentSnapshotCache(id.toString()), OrderSnapshotDTO.class);
if (ObjectUtils.isEmpty(orderSnapshot)) {
// 保证未使用状态机的数据可访问
Orders orders = baseMapper.selectById(id);
if (ObjectUtils.isEmpty(orders)) {
return new OrderResDTO();
}
orderSnapshot = BeanUtils.toBean(orders, OrderSnapshotDTO.class);
}
OrderResDTO orderResDTO = BeanUtil.toBean(orders, OrderResDTO.class);
// 订单超过15分钟未支付则自动取消
if (OrderStatusEnum.NO_PAY.getStatus().equals(orders.getOrdersStatus())
&& orders.getCreateTime().isBefore(LocalDateTime.now().minusMinutes(PAY_OVERTIME_MINUTE))) {
ordersCanceledService.cancelPayOverTimeOrder(orders);
orderResDTO.setOrdersStatus(OrderStatusEnum.CANCELED.getStatus());
if (OrderStatusEnum.NO_PAY.getStatus().equals(orderSnapshot.getOrdersStatus())
&& orderSnapshot.getCreateTime().isBefore(LocalDateTime.now().minusMinutes(PAY_OVERTIME_MINUTE))) {
ordersCanceledService.cancelPayOverTimeOrder(BeanUtils.toBean(orderSnapshot, Orders.class));
// 取消后重新获取最新的快照信息
orderSnapshot = JsonUtils.toBean(orderStateMachine.getCurrentSnapshotCache(id.toString()), OrderSnapshotDTO.class);
}
// 订单取消/关闭获取取消/关闭原因
Integer ordersStatus = orderResDTO.getOrdersStatus();
if (OrderStatusEnum.CANCELED.getStatus().equals(ordersStatus)
|| OrderStatusEnum.CLOSED.getStatus().equals(ordersStatus)) {
OrdersCanceled canceledDetail = ordersCanceledService.getById(id);
orderResDTO.setCancelTime(canceledDetail.getCancelTime());
orderResDTO.setCancelReason(canceledDetail.getCancelReason());
}
return orderResDTO;
return BeanUtils.toBean(orderSnapshot, OrderResDTO.class);
}
/**