From 3f6f1508c52881770fc7e772d0b57bb1c5cb301c Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Sat, 13 Dec 2025 19:00:25 +0800 Subject: [PATCH] =?UTF-8?q?feat(order):=20=E5=A2=9E=E5=8A=A0faceId?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E7=9A=84=E8=AE=A2=E5=8D=95=E8=B4=AD=E4=B9=B0?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增checkUserBuyFaceItem方法,支持校验用户购买商品时的人脸ID匹配 - 修改PriceBiz中商品类型设置,从13改为5 - 更新FaceServiceImpl中的购买检查逻辑,使用新的带faceId校验的方法 - 调整OrderServiceImpl中订单项的goodsType和goodsId设置逻辑 - 移除旧的checkUserBuyItem方法及相关缓存逻辑 - 新增ORDER_USER_FACE_TYPE_BUY_ITEM_CACHE_KEY缓存键定义 --- .../java/com/ycwl/basic/biz/OrderBiz.java | 12 ++-- .../java/com/ycwl/basic/biz/PriceBiz.java | 8 +-- .../basic/repository/OrderRepository.java | 65 ++++++++++--------- .../service/pc/impl/FaceServiceImpl.java | 4 +- .../service/pc/impl/OrderServiceImpl.java | 12 ++-- 5 files changed, 54 insertions(+), 47 deletions(-) diff --git a/src/main/java/com/ycwl/basic/biz/OrderBiz.java b/src/main/java/com/ycwl/basic/biz/OrderBiz.java index 6a12f94a..ccdebf75 100644 --- a/src/main/java/com/ycwl/basic/biz/OrderBiz.java +++ b/src/main/java/com/ycwl/basic/biz/OrderBiz.java @@ -314,10 +314,14 @@ public class OrderBiz { } /** - * 检查用户是否购买了指定商品 - * 提供给PriceBiz使用,避免循环调用 + * 检查用户是否购买了指定商品,并额外校验订单的faceId是否匹配 + * @param userId 用户ID + * @param faceId 人脸ID + * @param goodsType 商品类型 + * @param goodsId 商品ID + * @return 是否已购买且faceId匹配 */ - public boolean checkUserBuyItem(Long userId, int goodsType, Long goodsId) { - return orderRepository.checkUserBuyItem(userId, goodsType, goodsId); + public boolean checkUserBuyFaceItem(Long userId, Long faceId, int goodsType, Long goodsId) { + return orderRepository.checkUserBuyFaceItem(userId, faceId, goodsType, goodsId); } } diff --git a/src/main/java/com/ycwl/basic/biz/PriceBiz.java b/src/main/java/com/ycwl/basic/biz/PriceBiz.java index c4a91bb7..2b97ee69 100644 --- a/src/main/java/com/ycwl/basic/biz/PriceBiz.java +++ b/src/main/java/com/ycwl/basic/biz/PriceBiz.java @@ -81,7 +81,7 @@ public class PriceBiz { GoodsListRespVO goods = new GoodsListRespVO(); goods.setGoodsId(puzzleTemplate.getId()); goods.setGoodsName(puzzleTemplate.getName()); - goods.setGoodsType(13); + goods.setGoodsType(5); goodsList.add(goods); }); return goodsList; @@ -280,7 +280,7 @@ public class PriceBiz { allContentsPurchased = false; break; } - boolean hasPurchasedTemplate = orderBiz.checkUserBuyItem(userId, -1, videoEntities.getFirst().getVideoId()); + boolean hasPurchasedTemplate = orderBiz.checkUserBuyFaceItem(userId, faceId, -1, videoEntities.getFirst().getVideoId()); if (!hasPurchasedTemplate) { allContentsPurchased = false; break; @@ -292,7 +292,7 @@ public class PriceBiz { if (scenicConfig != null) { // 检查录像集 if (!Boolean.TRUE.equals(scenicConfig.getDisableSourceVideo())) { - boolean hasPurchasedRecording = orderBiz.checkUserBuyItem(userId, 1, faceId); + boolean hasPurchasedRecording = orderBiz.checkUserBuyFaceItem(userId, faceId, 1, faceId); if (!hasPurchasedRecording) { allContentsPurchased = false; } @@ -300,7 +300,7 @@ public class PriceBiz { // 检查照片集 if (allContentsPurchased && !Boolean.TRUE.equals(scenicConfig.getDisableSourceImage())) { - boolean hasPurchasedPhoto = orderBiz.checkUserBuyItem(userId, 2, faceId); + boolean hasPurchasedPhoto = orderBiz.checkUserBuyFaceItem(userId, faceId, 2, faceId); if (!hasPurchasedPhoto) { allContentsPurchased = false; } diff --git a/src/main/java/com/ycwl/basic/repository/OrderRepository.java b/src/main/java/com/ycwl/basic/repository/OrderRepository.java index 4a60edad..7161a403 100644 --- a/src/main/java/com/ycwl/basic/repository/OrderRepository.java +++ b/src/main/java/com/ycwl/basic/repository/OrderRepository.java @@ -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)); + } } diff --git a/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java b/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java index ab168d68..ad62c7e5 100644 --- a/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/pc/impl/FaceServiceImpl.java @@ -473,9 +473,9 @@ public class FaceServiceImpl implements FaceService { contentPageVO.setLockType(1); } } - boolean buy = orderBiz.checkUserBuyItem(userId, contentPageVO.getGoodsType(), contentPageVO.getContentId()); + boolean buy = orderBiz.checkUserBuyFaceItem(userId, faceId, contentPageVO.getGoodsType(), contentPageVO.getContentId()); if (!buy) { - buy = orderBiz.checkUserBuyItem(userId, -1, contentPageVO.getTemplateId()); + buy = orderBiz.checkUserBuyFaceItem(userId, faceId, -1, contentPageVO.getTemplateId()); } if (buy) { contentPageVO.setIsBuy(1); diff --git a/src/main/java/com/ycwl/basic/service/pc/impl/OrderServiceImpl.java b/src/main/java/com/ycwl/basic/service/pc/impl/OrderServiceImpl.java index 3ebdc384..eca6d50b 100644 --- a/src/main/java/com/ycwl/basic/service/pc/impl/OrderServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/pc/impl/OrderServiceImpl.java @@ -916,15 +916,13 @@ public class OrderServiceImpl implements OrderService { List orderItems = goodsList.stream().map(goods -> { OrderItemEntity orderItem = new OrderItemEntity(); orderItem.setOrderId(orderId); - if (Long.valueOf(1L).equals(goods.getGoodsId())) { + orderItem.setGoodsId(goods.getGoodsId()); + orderItem.setGoodsType(goods.getGoodsType()); + if (Integer.valueOf(1).equals(goods.getGoodsType())) { orderItem.setGoodsId(batchOrderReqVO.getFaceId()); - orderItem.setGoodsType(1); - } else if (Long.valueOf(2L).equals(goods.getGoodsId())) { + } else if (Integer.valueOf(2).equals(goods.getGoodsType())) { orderItem.setGoodsId(batchOrderReqVO.getFaceId()); - orderItem.setGoodsType(2); - } else { - // templateId - orderItem.setGoodsId(goods.getGoodsId()); + } else if (Integer.valueOf(0).equals(goods.getGoodsType())) { orderItem.setGoodsType(-1); } return orderItem;