feat(orders.manager):新增缓存查询的订单信息的功能
This commit is contained in:
@@ -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);
|
||||
}
|
||||
@@ -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 < #{sortBy}
|
||||
</if>
|
||||
</where>
|
||||
LIMIT 10
|
||||
</select>
|
||||
</mapper>
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user