You've already forked FrameTour-BE
feat(order): 增加faceId校验的订单购买检查功能
- 新增checkUserBuyFaceItem方法,支持校验用户购买商品时的人脸ID匹配 - 修改PriceBiz中商品类型设置,从13改为5 - 更新FaceServiceImpl中的购买检查逻辑,使用新的带faceId校验的方法 - 调整OrderServiceImpl中订单项的goodsType和goodsId设置逻辑 - 移除旧的checkUserBuyItem方法及相关缓存逻辑 - 新增ORDER_USER_FACE_TYPE_BUY_ITEM_CACHE_KEY缓存键定义
This commit is contained in:
@@ -23,7 +23,7 @@ public class OrderRepository {
|
||||
public static final String ORDER_CACHE_KEY = "order:%s";
|
||||
public static final String ORDER_ITEMS_CACHE_KEY = "order:%s:items";
|
||||
public static final String ORDER_ITEM_CACHE_KEY = "order:item:%s";
|
||||
public static final String ORDER_USER_TYPE_BUY_ITEM_CACHE_KEY = "order:user:%s:type:%s:id:%s";
|
||||
public static final String ORDER_USER_FACE_TYPE_BUY_ITEM_CACHE_KEY = "order:user:%s:face:%s:type:%s:id:%s";
|
||||
|
||||
public OrderEntity getOrder(Long orderId) {
|
||||
if (redisTemplate.hasKey(String.format(ORDER_CACHE_KEY, orderId))) {
|
||||
@@ -62,40 +62,12 @@ public class OrderRepository {
|
||||
return orderItemEntity;
|
||||
}
|
||||
|
||||
public boolean checkUserBuyItem(Long userId, int goodsType, Long goodsId) {
|
||||
synchronized (this) {
|
||||
if (redisTemplate.hasKey(String.format(ORDER_USER_TYPE_BUY_ITEM_CACHE_KEY, userId, goodsType, goodsId))) {
|
||||
return "1".equals(redisTemplate.opsForValue().get(String.format(ORDER_USER_TYPE_BUY_ITEM_CACHE_KEY, userId, goodsType, goodsId)));
|
||||
}
|
||||
OrderEntity orderEntity = orderMapper.getUserBuyItem(userId, goodsType, goodsId);
|
||||
if (orderEntity == null) {
|
||||
redisTemplate.opsForValue().set(String.format(ORDER_USER_TYPE_BUY_ITEM_CACHE_KEY, userId, goodsType, goodsId), "0", 60, TimeUnit.SECONDS);
|
||||
return false;
|
||||
}
|
||||
if (Integer.valueOf(1).equals(orderEntity.getStatus())) {
|
||||
redisTemplate.opsForValue().set(String.format(ORDER_USER_TYPE_BUY_ITEM_CACHE_KEY, userId, goodsType, goodsId), "1");
|
||||
return true;
|
||||
} else {
|
||||
redisTemplate.opsForValue().set(String.format(ORDER_USER_TYPE_BUY_ITEM_CACHE_KEY, userId, goodsType, goodsId), "0", 60, TimeUnit.SECONDS);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public OrderEntity getUserBuyItem(Long userId, int goodsType, Long goodsId) {
|
||||
return orderMapper.getUserBuyItem(userId, goodsType, goodsId);
|
||||
}
|
||||
|
||||
public void clearUserBuyItemCache(Long userId, int goodsType, Long goodsId) {
|
||||
redisTemplate.delete(String.format(ORDER_USER_TYPE_BUY_ITEM_CACHE_KEY, userId, goodsType, goodsId));
|
||||
}
|
||||
|
||||
public void clearOrderCache(Long orderId) {
|
||||
OrderEntity order = getOrder(orderId);
|
||||
redisTemplate.delete(String.format(ORDER_CACHE_KEY, orderId));
|
||||
getOrderItems(orderId).forEach(orderItem -> {
|
||||
redisTemplate.delete(String.format(ORDER_ITEM_CACHE_KEY, orderItem.getId()));
|
||||
clearUserBuyItemCache(order.getMemberId(), orderItem.getGoodsType(), orderItem.getGoodsId());
|
||||
clearUserBuyFaceItemCache(order.getMemberId(), order.getFaceId(), orderItem.getGoodsType(), orderItem.getGoodsId());
|
||||
});
|
||||
redisTemplate.delete(String.format(ORDER_ITEMS_CACHE_KEY, orderId));
|
||||
}
|
||||
@@ -105,4 +77,37 @@ public class OrderRepository {
|
||||
orderMapper.updateOrder(updateEntity);
|
||||
clearOrderCache(orderId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查用户是否购买了指定商品,并额外校验订单的faceId是否匹配
|
||||
* @param userId 用户ID
|
||||
* @param faceId 人脸ID
|
||||
* @param goodsType 商品类型
|
||||
* @param goodsId 商品ID
|
||||
* @return 是否已购买且faceId匹配
|
||||
*/
|
||||
public boolean checkUserBuyFaceItem(Long userId, Long faceId, int goodsType, Long goodsId) {
|
||||
synchronized (this) {
|
||||
String cacheKey = String.format(ORDER_USER_FACE_TYPE_BUY_ITEM_CACHE_KEY, userId, faceId, goodsType, goodsId);
|
||||
if (redisTemplate.hasKey(cacheKey)) {
|
||||
return "1".equals(redisTemplate.opsForValue().get(cacheKey));
|
||||
}
|
||||
OrderEntity orderEntity = orderMapper.getUserBuyFaceItem(userId, faceId, goodsType, goodsId);
|
||||
if (orderEntity == null) {
|
||||
redisTemplate.opsForValue().set(cacheKey, "0", 60, TimeUnit.SECONDS);
|
||||
return false;
|
||||
}
|
||||
if (Integer.valueOf(1).equals(orderEntity.getStatus())) {
|
||||
redisTemplate.opsForValue().set(cacheKey, "1");
|
||||
return true;
|
||||
} else {
|
||||
redisTemplate.opsForValue().set(cacheKey, "0", 60, TimeUnit.SECONDS);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void clearUserBuyFaceItemCache(Long userId, Long faceId, int goodsType, Long goodsId) {
|
||||
redisTemplate.delete(String.format(ORDER_USER_FACE_TYPE_BUY_ITEM_CACHE_KEY, userId, faceId, goodsType, goodsId));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user