zoujiajian 3 роки тому
батько
коміт
d1d3857589

+ 5 - 0
netflix-service/src/main/java/com/cyksj/redis/RedisService.java

@@ -575,6 +575,9 @@ public class RedisService {
     }
 
     public boolean setNx(String key, Object value, Long time) {
+        if (time == -1l) {
+            return redisTemplate.opsForValue().setIfAbsent(key, value);
+        }
         if (time > 0) {
             return redisTemplate.opsForValue().setIfAbsent(key, value, time, TimeUnit.SECONDS);
         }
@@ -618,6 +621,8 @@ public class RedisService {
         PHONE_AREA_CODE("phone_area_code:key", "国家或地区码", 60 * 60 * 24 * 15),
         CORP_CHAT_GROUP_CODE("corp_chat_group_code:", "企业微信群动态码", 60 * 60 * 24 * 15),
         GENERAL_POPULARIZE_CODE("general_popularize_code:", "普通推广者关联优惠券", 10l),
+        HOME_PAGE_GOODS_SOLD_NUM_KEY("home_page_goods_sold_num_key:", "平台销售量", 60 * 60 * 24 * 7l),
+        HOME_PAGE_REGISTER_GOODS_SOLD_NUM_KEY("home_page_register_goods_sold_num_key:", "注册产品销售量", 60 * 60 * 24 * 7l),
         ;
 
         private String name;

+ 11 - 0
netflix-service/src/main/java/com/cyksj/service/goods/GoodsDonFrontService.java

@@ -0,0 +1,11 @@
+package com.cyksj.service.goods;
+
+/*
+ *项目名: netflix
+ *文件名: GoodsDonFrontService
+ *创建者: JavaZou
+ *创建时间:2023/7/5 17:18
+ */
+public interface GoodsDonFrontService {
+	void incrGoodsSoldNum(Long goodsId);
+}

+ 44 - 0
netflix-service/src/main/java/com/cyksj/service/goods/impl/GoodsDonFrontServiceImpl.java

@@ -0,0 +1,44 @@
+package com.cyksj.service.goods.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.constant.Constant;
+import com.cyksj.mapper.GoodsDonMapper;
+import com.cyksj.mapper.OrderDonMapper;
+import com.cyksj.model.entity.GoodsDon;
+import com.cyksj.model.entity.OrderDon;
+import com.cyksj.redis.RedisService;
+import com.cyksj.service.goods.GoodsDonFrontService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/*
+ *项目名: netflix
+ *文件名: GoodsDonFrontServiceImpl
+ *创建者: JavaZou
+ *创建时间:2023/7/5 17:19
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class GoodsDonFrontServiceImpl implements GoodsDonFrontService {
+	private final OrderDonMapper orderDonMapper;
+
+	private final GoodsDonMapper goodsDonMapper;
+
+	private final RedisService redisService;
+
+	@Override
+	public void incrGoodsSoldNum(Long goodsId) {
+		String goodsSoldKey = RedisService.key.HOME_PAGE_GOODS_SOLD_NUM_KEY.getName() + goodsId;
+		Object soldNumObj = redisService.get(goodsSoldKey);
+		if (soldNumObj == null) {
+			GoodsDon goodsDon = goodsDonMapper.selectById(goodsId);
+			Integer sold = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
+					.eq(OrderDon::getGoodsId, goodsId).notIn(OrderDon::getStatus, Constant.noOrderStatus));
+			redisService.setNx(goodsSoldKey, goodsDon.getSoldNum() + sold, RedisService.key.HOME_PAGE_GOODS_SOLD_NUM_KEY.getTimeout());
+			return;
+		}
+		redisService.incr(goodsSoldKey, 1l);
+	}
+}

+ 9 - 0
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -63,6 +63,7 @@ import com.cyksj.service.coupon.CouponFontService;
 import com.cyksj.service.distribute.UserBusinessFrontService;
 import com.cyksj.service.distribute.equipment.EquipmentDistributeService;
 import com.cyksj.service.exchange.ExchangeCodeService;
+import com.cyksj.service.goods.GoodsDonFrontService;
 import com.cyksj.service.groups.GroupsFuncService;
 import com.cyksj.service.market.MarketFrontService;
 import com.cyksj.service.market.task.TaskService;
@@ -202,6 +203,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 	private final AliPayCommonService aliPayCommonService;
 
+	private final GoodsDonFrontService goodsDonFrontService;
+
 	private final List<String> noChekGoodsTemp = List.of("Apple One", "Youtube", "Spotify");
 
 	@Transactional(rollbackFor = Throwable.class)
@@ -492,6 +495,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				log.error("wx增加抽奖机会错误,orderId:{},error:{}", order.getId(), e);
 			}
 		});
+		//销量增加
+		goodsDonFrontService.incrGoodsSoldNum(order.getGoodsId());
 	}
 
 	@Override
@@ -817,6 +822,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 				log.error("zfb增加抽奖机会错误,orderId:{},error:{}", orderDon.getId(), e);
 			}
 		});
+		//销量增加
+		goodsDonFrontService.incrGoodsSoldNum(orderDon.getGoodsId());
 	}
 
 	public void setRelation(Long relationId, Long groupsId, Long userId, Long goodsId, Boolean isLoginPopularize) {
@@ -989,6 +996,8 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			orderDon.setPayTime(DateTime.now());
 		}
 		this.updateById(orderDon);
+		//销量增加
+		goodsDonFrontService.incrGoodsSoldNum(orderDon.getGoodsId());
 	}
 
 	public AliPayParams commonAliPay(Long orderId, String returnUrl, String productCode, String appId, String qrPayMode) throws Exception {

+ 47 - 16
netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java

@@ -15,8 +15,8 @@ import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
 import com.cyksj.mapper.GoodsDonSkuMapper;
 import com.cyksj.mapper.OrderDonMapper;
-import com.cyksj.mapper.SysConfigMapper;
 import com.cyksj.mapper.RegisterOrderDonMapper;
+import com.cyksj.mapper.SysConfigMapper;
 import com.cyksj.model.entity.*;
 import com.cyksj.model.views.*;
 import com.cyksj.redis.RedisService;
@@ -165,6 +165,10 @@ public class GoodsDonController {
         if (value != null) {
             try {
                 List<GoodsFrontListView> list = Jsons.parseObject(value, List.class);
+                list.forEach(data->{
+                    //销量
+	                data.setSold(data.getVirtualSold() + getSoldNumByGid(data.getId(), 1));;
+                });
                 if (CollUtil.isNotEmpty(list)) {
                     return GatewayResponse.SUCCESS.newBuilder().toResult(list);
                 }
@@ -180,9 +184,8 @@ public class GoodsDonController {
         list.forEach(data -> {
             data.setSpecs(beanSearcher.searchFirst(GoodsDonSpec.class, MapUtils.builder().field(GoodsDonSpec::getGoodsId, data.getId()).build()));
             data.setSkuList(beanSearcher.searchAll(GoodsDonFrontSkuView.class, MapUtils.builder().field(GoodsDonFrontSkuView::getGoodsId, data.getId()).field(GoodsDonFrontSkuView::getStatus, true).orderBy(GoodsDonFrontSkuView::getPrice).asc().build()));
-            Integer sold = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
-                    .eq(OrderDon::getGoodsId, data.getId()).notIn(OrderDon::getStatus, Constant.noOrderStatus));
-            data.setSold(sold + data.getVirtualSold());
+            //销量
+	        data.setSold(data.getVirtualSold() + getSoldNumByGid(data.getId(), 1));;
 
             Optional.ofNullable(data.getSkuList()).ifPresent(skuList -> {
                 if (skuList.size() > 0) {
@@ -197,11 +200,6 @@ public class GoodsDonController {
                     .orderBy(OrderCommentFrontView::getId).desc()
                     .build());
             data.setComments(comments);
-            OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
-                    .eq(OrderDon::getGoodsId, data.getId())
-                    .notIn(OrderDon::getStatus, Constant.noOrderStatus).select(OrderDon::getCreatedTime, OrderDon::getPayTime, OrderDon::getId)
-                    .orderByDesc(OrderDon::getId)
-                    .last("limit 1"));
 	        data.setNotifyMsg(getPayMsgTime(data.getId(), now, 1));
         });
         redisService.setNx(pcCacheKey, list, RedisService.key.YH_HOME_PAGHE_CACHE.getTimeout());
@@ -222,6 +220,10 @@ public class GoodsDonController {
         if (value != null) {
             try {
                 List<GoodsHomePageView> list = Jsons.parseObject(value, List.class);
+	            list.forEach(data -> {
+		            //销量
+		            data.setSold(data.getVirtualSold() + getSoldNumByGid(data.getId(), 1));;
+	            });
                 if (CollUtil.isNotEmpty(list)) {
                     return GatewayResponse.SUCCESS.newBuilder().toResult(list);
                 }
@@ -234,9 +236,8 @@ public class GoodsDonController {
         }
         List<GoodsHomePageView> dataList = beanSearcher.searchAll(GoodsHomePageView.class, builder.build());
         dataList.forEach(data -> {
-            Integer sold = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
-                    .eq(OrderDon::getGoodsId, data.getId()).notIn(OrderDon::getStatus, Constant.noOrderStatus));
-            data.setSold(sold + data.getVirtualSold());
+            //销量
+	        data.setSold(data.getVirtualSold() + getSoldNumByGid(data.getId(), 1));;
             GoodsDonFrontSkuView skuView = beanSearcher.searchFirst(GoodsDonFrontSkuView.class, MapUtils.builder().field(GoodsDonFrontSkuView::getGoodsId, data.getId()).field(GoodsDonFrontSkuView::getStatus, true).orderBy(GoodsDonFrontSkuView::getPrice).asc().build());
             if (skuView != null) {
                 data.setPrice(skuView.getPrice());
@@ -256,7 +257,11 @@ public class GoodsDonController {
         Object value = redisService.get(registerCacheKey);
         if (value != null) {
             try {
-                List<RegisterGoodsDonView> list = Jsons.parseList(value, RegisterGoodsDonView.class);
+	            List<RegisterGoodsDonView> list = Jsons.parseList(value, RegisterGoodsDonView.class);
+	            list.forEach(data -> {
+		            //销量
+		            data.setSold(data.getVirtualSold() + getSoldNumByGid(data.getId(), 2));
+	            });
                 if (CollUtil.isNotEmpty(list)) {
                     return GatewayResponse.SUCCESS.newBuilder().toResult(list);
                 }
@@ -267,9 +272,8 @@ public class GoodsDonController {
         List<RegisterGoodsDonView> dataList = beanSearcher.searchAll(RegisterGoodsDonView.class, builder.build());
 	    DateTime now = DateTime.now();
 	    dataList.forEach(data->{
-            Integer sold = registerOrderDonMapper.selectCount(Wrappers.lambdaQuery(RegisterOrderDon.class)
-                    .eq(RegisterOrderDon::getGoodsId, data.getId()).notIn(RegisterOrderDon::getStatus, Constant.noOrderStatus));
-            data.setSold(sold + data.getVirtualSold());
+		    //销量
+		    data.setSold(data.getVirtualSold() + getSoldNumByGid(data.getId(), 2));
 		    data.setNotifyMsg(getPayMsgTime(data.getId(), now, 2));
         });
         redisService.setNx(registerCacheKey, dataList, RedisService.key.REGISTER_HOME_PAGE_CACHE.getTimeout());
@@ -390,4 +394,31 @@ public class GoodsDonController {
 	    notifyMsg.append("前有人购买");
 	    return notifyMsg.toString();
     }
+
+	/**
+	 * 获取订单销售数据
+	 */
+	public Integer getSoldNumByGid(Long goodsId, Integer type) {
+		String goodsSoldKey = null;
+		if (type == 1) {
+			goodsSoldKey = RedisService.key.HOME_PAGE_GOODS_SOLD_NUM_KEY.getName() + goodsId;
+		} else if (type == 2) {
+			goodsSoldKey = RedisService.key.HOME_PAGE_REGISTER_GOODS_SOLD_NUM_KEY.getName() + goodsId;
+		}
+		Object soldNumObj = redisService.get(goodsSoldKey);
+		if (soldNumObj == null) {
+			Integer sold = 0;
+			if (type == 1) {
+				sold = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
+						.eq(OrderDon::getGoodsId, goodsId).notIn(OrderDon::getStatus, Constant.noOrderStatus));
+			} else if (type == 2) {
+				sold = registerOrderDonMapper.selectCount(Wrappers.lambdaQuery(RegisterOrderDon.class)
+						.eq(RegisterOrderDon::getGoodsId, goodsId).notIn(RegisterOrderDon::getStatus, Constant.noOrderStatus));
+			}
+			redisService.setNx(goodsSoldKey, sold, RedisService.key.HOME_PAGE_GOODS_SOLD_NUM_KEY.getTimeout());
+			return sold;
+		}
+		Integer soldNum = Integer.valueOf(soldNumObj.toString());
+		return soldNum;
+	}
 }