Explorar el Código

修改店铺默认排序规则

codingliang hace 6 meses
padre
commit
0d10d5fb25

+ 2 - 0
db/update_251205.sql

@@ -0,0 +1,2 @@
+-- 创建订单表订单状态、支付时间、店铺ID索引 用于查询按店铺分组的订单状态、支付时间的统计信息
+CREATE INDEX idx_status_pay_time_shop ON tb_order(status, pay_time, shop_id);

+ 1 - 1
src/main/java/com/sqx/modules/errand/service/impl/TbIndentServiceImpl.java

@@ -2290,7 +2290,7 @@ public class TbIndentServiceImpl extends ServiceImpl<TbIndentDao, TbIndent> impl
                 goodsShopRelevancy1.setSales(goodsShopRelevancy.getSales() - goodsNum);//加销量
                 goodsShopRelevancy1.setInventory(goodsShopRelevancy.getInventory() + goodsNum);//减库存
                 goodsShopRelevancyDao.updateById(goodsShopRelevancy1);
-                goodsShopDao.updateShopSales(2, goodsNum, goodsShopRelevancy.getShopId());
+                // goodsShopDao.updateShopSales(2, goodsNum, goodsShopRelevancy.getShopId());
             }
         }
 

+ 7 - 0
src/main/java/com/sqx/modules/goods/service/GoodsShopService.java

@@ -8,6 +8,7 @@ import com.sqx.modules.goods.entity.GoodsShopRelevancy;
 import com.sqx.modules.goods.vo.GoodsShopVo;
 
 import java.util.List;
+import java.util.Map;
 
 public interface GoodsShopService extends IService<GoodsShop> {
 
@@ -70,4 +71,10 @@ public interface GoodsShopService extends IService<GoodsShop> {
      * @param vipPromotion 是否参与vip优惠活动,0否1是
      */
     void updateVipPromotion(Long shopId, String vipPromotion);
+
+    /**
+     * 更新店铺销售数量
+     * @param shopSalesMap 店铺销售数量映射表,key为店铺id,value为销售数量
+     */
+    void updateShopSales(Map<Long, Integer> shopSalesMap);
 }

+ 25 - 0
src/main/java/com/sqx/modules/goods/service/impl/GoodsShopServiceImpl.java

@@ -1,5 +1,6 @@
 package com.sqx.modules.goods.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
@@ -63,6 +64,8 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 @Service
 public class GoodsShopServiceImpl extends ServiceImpl<GoodsShopDao, GoodsShop> implements GoodsShopService {
@@ -615,4 +618,26 @@ public class GoodsShopServiceImpl extends ServiceImpl<GoodsShopDao, GoodsShop> i
         goodsShop.setVipPromotion(StrUtil.equals(vipPromotion,"1") ? "1" : "0");
         baseMapper.updateById(goodsShop);
     }
+
+    @Override
+    public void updateShopSales(Map<Long, Integer> shopSalesMap) {
+        LambdaQueryWrapper<GoodsShop> queryWrapper = Wrappers.lambdaQuery();
+        // 通过审核
+        queryWrapper.eq(GoodsShop::getStatus, 1);
+        // 已上架
+        queryWrapper.eq(GoodsShop::getPutawayFlag, 0);
+        // 未被封禁
+        queryWrapper.eq(GoodsShop::getBannedFlag, 0);
+        List<GoodsShop> goodsShops = list(queryWrapper);
+        if (CollUtil.isNotEmpty(goodsShops)) {
+            List<GoodsShop> newGoodsShops = goodsShops.stream().map(e -> {
+                GoodsShop goodsShop = new GoodsShop();
+                goodsShop.setShopId(e.getShopId());
+                goodsShop.setShopSales(shopSalesMap.getOrDefault(e.getShopId(), 0));
+                return goodsShop;
+            }).collect(Collectors.toList());
+
+            updateBatchById(newGoodsShops);
+        }
+    }
 }

+ 7 - 0
src/main/java/com/sqx/modules/order/dao/AppOrderDao.java

@@ -15,6 +15,7 @@ import org.apache.ibatis.annotations.Param;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.List;
+import java.util.Map;
 
 @Mapper
 public interface AppOrderDao extends BaseMapper<TbOrder> {
@@ -114,4 +115,10 @@ public interface AppOrderDao extends BaseMapper<TbOrder> {
     IPage<GoodsSkuSalesCountVO> getGoodsSkuSalesCount(Page<GoodsSkuSalesCountVO> pages, GoodsSkuQuery query);
 
     List<TbOrder> temp();
+
+    /**
+     * 统计近近30天每个店铺的已完成的订单数量
+     * @return 店铺id-订单数量映射列表
+     */
+    List<Map<Long, Integer>> countFinishByShopIdWithLast30Days();
 }

+ 7 - 0
src/main/java/com/sqx/modules/order/service/AppOrderService.java

@@ -16,6 +16,7 @@ import com.sqx.modules.utils.excel.ExcelData;
 
 import java.time.LocalDateTime;
 import java.util.List;
+import java.util.Map;
 
 public interface AppOrderService extends IService<TbOrder> {
 
@@ -205,4 +206,10 @@ public interface AppOrderService extends IService<TbOrder> {
      * @return 会员优惠单数量
      */
     int getCurDayVipPromotionByUserCount(Long userId);
+
+     /**
+      * 统计最近30天内每个店铺的订单完成数量
+      * @return 店铺id-订单完成数量映射
+      */
+    Map<Long, Integer> countFinishByShopIdWithLast30Days();
 }

+ 19 - 4
src/main/java/com/sqx/modules/order/service/impl/AppAppOrderServiceImpl.java

@@ -135,6 +135,7 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 @Service
 @Slf4j
@@ -657,7 +658,7 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
             //减库存
             goodsShopRelevancy1.setInventory(goodsShopRelevancy.getInventory() - goodsNum);
             goodsShopRelevancyDao.updateById(goodsShopRelevancy1);
-            goodsShopDao.updateShopSales(1, goodsNum, goodsShopRelevancy.getShopId());
+            // goodsShopDao.updateShopSales(1, goodsNum, goodsShopRelevancy.getShopId());
         }
     }
 
@@ -2018,7 +2019,7 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
                 goodsShopRelevancy1.setSales(goodsShopRelevancy.getSales() - goodsNum);//加销量
                 goodsShopRelevancy1.setInventory(goodsShopRelevancy.getInventory() + goodsNum);//减库存
                 goodsShopRelevancyDao.updateById(goodsShopRelevancy1);
-                goodsShopDao.updateShopSales(2, goodsNum, goodsShopRelevancy.getShopId());
+                // goodsShopDao.updateShopSales(2, goodsNum, goodsShopRelevancy.getShopId());
             }
 
             return Result.success("取消订单成功!");
@@ -2532,7 +2533,7 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
                 goodsShopRelevancy1.setSales(goodsShopRelevancy.getSales() - goodsNum);//加销量
                 goodsShopRelevancy1.setInventory(goodsShopRelevancy.getInventory() + goodsNum);//减库存
                 goodsShopRelevancyDao.updateById(goodsShopRelevancy1);
-                goodsShopDao.updateShopSales(2, goodsNum, goodsShopRelevancy.getShopId());
+                // goodsShopDao.updateShopSales(2, goodsNum, goodsShopRelevancy.getShopId());
             }
 
             // 取消跑腿订单
@@ -2690,7 +2691,7 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
                 goodsShopRelevancy1.setSales(goodsShopRelevancy.getSales() - goodsNum);//加销量
                 goodsShopRelevancy1.setInventory(goodsShopRelevancy.getInventory() + goodsNum);//减库存
                 goodsShopRelevancyDao.updateById(goodsShopRelevancy1);
-                goodsShopDao.updateShopSales(2, goodsNum, goodsShopRelevancy.getShopId());
+                // goodsShopDao.updateShopSales(2, goodsNum, goodsShopRelevancy.getShopId());
             }
 
             // 打印退款小票
@@ -2999,6 +3000,20 @@ public class AppAppOrderServiceImpl extends ServiceImpl<AppOrderDao, TbOrder> im
         return count(wrapper);
     }
 
+    @Override
+    public Map<Long, Integer> countFinishByShopIdWithLast30Days() {
+        // 统计近近30天每个店铺的已完成订单数量
+        List<Map<Long, Integer>> shopSalesList = baseMapper.countFinishByShopIdWithLast30Days();
+        // 转换为ShopId -> OrderCount的Map返回
+        return shopSalesList.stream()
+                .filter(map -> map.containsKey("shop_id") && map.containsKey("order_count"))
+                .filter(map -> map.get("shop_id") != null && map.get("order_count") != null)
+                .collect(Collectors.toMap(
+                        map -> Long.parseLong(map.get("shop_id").toString()),
+                        map -> Integer.parseInt(map.get("order_count").toString())
+                ));
+    }
+
     /**
      * 更新订单状态和支付顺序
      *

+ 5 - 0
src/main/java/com/sqx/scheduler/config/SchedulerLock.java

@@ -47,4 +47,9 @@ public interface SchedulerLock {
      * 用户优惠券自动过期锁
      */
     String INTEGRAL_OF_USER_EXPIRATION_LOCK = "wm:lock:integral:exp";
+
+    /**
+     * 更新店铺销量锁
+     */
+    String UPDATE_SHOP_SALES_LOCK = "wm:lock:shop:sales:update";
 }

+ 31 - 5
src/main/java/com/sqx/scheduler/order/OrderScheduler.java

@@ -2,8 +2,6 @@ package com.sqx.scheduler.order;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
-import com.baomidou.mybatisplus.core.conditions.Wrapper;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.ekyong.www.pay.pay.qrcode.api.RhtQrcodePayApi;
@@ -24,7 +22,6 @@ import com.sqx.modules.pay.service.PayDetailsService;
 import com.sqx.modules.shop.entity.ShopType;
 import com.sqx.modules.shop.service.ShopTypeService;
 import com.sqx.scheduler.config.SchedulerLock;
-import io.swagger.models.auth.In;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.redisson.api.RLock;
@@ -41,6 +38,7 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -58,9 +56,7 @@ public class OrderScheduler {
     private final AppOrderService orderService;
     private final CommonInfoService commonInfoService;
     private final PayDetailsService payDetailsService;
-
     private final ShopTypeService shopTypeService;
-
     private final GoodsShopService goodsShopService;
 
     private final static String RHT_PAY_BASE_URL = "https://api.ekbuyclub.com";
@@ -309,4 +305,34 @@ public class OrderScheduler {
             lock.unlock();
         }
     }
+
+    /**
+     * 更新店铺销量
+     *  每天1点、10点、13点、22点执行
+     */
+    @Async
+    @Scheduled
+    @Scheduled(cron = "0 0 1,10,13,22 * * ?")
+    public void updateShopSales() {
+        RLock lock = null;
+        try {
+            // 尝试获取锁,最多等待0秒(即立即返回),锁的过期时间为2分钟
+            lock = redissonClient.getLock(SchedulerLock.UPDATE_SHOP_SALES_LOCK);
+            boolean isLocked = lock.tryLock(0, 2, TimeUnit.MINUTES);
+            if (!isLocked) {
+                log.info("更新店铺销量任务:当前有其他服务实例正在执行,本次跳过");
+                return;
+            }
+            log.info("更新店铺销量任务开始运行");
+            Map<Long, Integer> shopSalesMap = orderService.countFinishByShopIdWithLast30Days();
+            goodsShopService.updateShopSales(shopSalesMap);
+            log.info("更新店铺销量任务运行成功");
+        } catch (Exception e) {
+            log.error("更新店铺销量任务运行失败,失败原因:{}", e.getMessage());
+        } finally {
+            if (lock != null && lock.isHeldByCurrentThread()) {
+                lock.unlock();
+            }
+        }
+    }
 }

+ 13 - 0
src/main/resources/mapper/order/OrderMapper.xml

@@ -812,4 +812,17 @@
 
     </select>
 
+    <select id="countFinishByShopIdWithLast30Days" resultType="java.util.Map">
+        SELECT
+            shop_id,
+            COUNT(*) AS order_count
+        FROM
+            tb_order
+        WHERE
+            status in (3, 4, 6)
+            AND pay_time >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
+        GROUP BY
+            shop_id
+    </select>
+
 </mapper>