Просмотр исходного кода

定时任务更新用户端热门推荐

wangzhijun 2 дней назад
Родитель
Сommit
b1f7c02420

+ 1 - 1
nightFragrance-common/src/main/java/com/ylx/common/constant/Constants.java

@@ -157,7 +157,7 @@ public class Constants
     /**
      * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加)
      */
-    public static final String[] JOB_WHITELIST_STR = { "com.ylx.quartz.task", "com.ylx.massage.task" };
+    public static final String[] JOB_WHITELIST_STR = { "com.ylx.quartz.task", "com.ylx.massage.task", "com.ylx.home.hot.task" };
 
     /**
      * 定时任务违规的字符

+ 5 - 0
nightFragrance-massage/src/main/java/com/ylx/home/hot/service/HomeHotRecommendService.java

@@ -7,4 +7,9 @@ import com.ylx.home.hot.domain.vo.HotRecommendVO;
 public interface HomeHotRecommendService {
 
     Page<HotRecommendVO> getHotRecommendPage(HotRecommendDTO dto);
+
+    /**
+     * 全量同步热门排行 Redis ZSet,并校准项目销量冗余字段。
+     */
+    void syncAllHotRank();
 }

+ 36 - 4
nightFragrance-massage/src/main/java/com/ylx/home/hot/service/impl/HomeHotRecommendServiceImpl.java

@@ -9,11 +9,14 @@ import com.ylx.common.utils.DictUtils;
 import com.ylx.common.utils.DistanceUtil;
 import com.ylx.home.hot.domain.dto.HotRecommendDTO;
 import com.ylx.home.hot.domain.vo.HotRecommendVO;
+import com.ylx.home.hot.domain.vo.ProjectSalesVO;
 import com.ylx.home.hot.service.HomeHotRecommendService;
 import com.ylx.massage.domain.MaTechnician;
+import com.ylx.massage.mapper.MaTechnicianMapper;
 import com.ylx.massage.service.IMaTechnicianService;
 import com.ylx.merchant.domain.vo.MerchantWithAddressVO;
 import com.ylx.project.domain.Project;
+import com.ylx.project.mapper.ProjectMapper;
 import com.ylx.project.service.ProjectService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -39,6 +42,13 @@ public class HomeHotRecommendServiceImpl implements HomeHotRecommendService {
     private ProjectService projectService;
     @Resource
     private IMaTechnicianService maTechnicianService;
+    @Resource
+    private MaTechnicianMapper techMapper;
+    @Resource
+    private ProjectMapper projectMapper;
+
+    private static final String HOT_MERCHANT_RANK_KEY = "hot:merchant:rank";
+    private static final String HOT_PROJECT_RANK_KEY = "hot:project:rank";
 
     @Override
     public Page<HotRecommendVO> getHotRecommendPage(HotRecommendDTO dto) {
@@ -58,8 +68,8 @@ public class HomeHotRecommendServiceImpl implements HomeHotRecommendService {
         boolean redisDown = false;
         try {
             // 1. Redis ZSet倒序分页获取ID
-            Set<String> techIdStrSet = redisTemplate.opsForZSet().reverseRange("hot:merchant:rank", offset, end);
-            Set<String> projectIdStrSet = redisTemplate.opsForZSet().reverseRange("hot:project:rank", offset, end);
+            Set<String> techIdStrSet = redisTemplate.opsForZSet().reverseRange(HOT_MERCHANT_RANK_KEY, offset, end);
+            Set<String> projectIdStrSet = redisTemplate.opsForZSet().reverseRange(HOT_PROJECT_RANK_KEY, offset, end);
 
             // 转Long ID集合
             List<Integer> techIds = techIdStrSet.stream().map(Integer::valueOf).collect(Collectors.toList());
@@ -88,8 +98,8 @@ public class HomeHotRecommendServiceImpl implements HomeHotRecommendService {
         // 5. 分页总数
         Long totalTech, totalProject;
         if (!redisDown) {
-            totalTech = redisTemplate.opsForZSet().zCard("hot:merchant:rank");
-            totalProject = redisTemplate.opsForZSet().zCard("hot:project:rank");
+            totalTech = redisTemplate.opsForZSet().zCard(HOT_MERCHANT_RANK_KEY);
+            totalProject = redisTemplate.opsForZSet().zCard(HOT_PROJECT_RANK_KEY);
         } else {
             totalTech = this.maTechnicianService.countValidTech();
             totalProject = this.projectService.countValidProject();
@@ -100,6 +110,28 @@ public class HomeHotRecommendServiceImpl implements HomeHotRecommendService {
         return page;
     }
 
+    @Override
+    public void syncAllHotRank() {
+        redisTemplate.delete(HOT_MERCHANT_RANK_KEY);
+        List<MaTechnician> validTechList = techMapper.selectAllValidTech();
+        for (MaTechnician tech : validTechList) {
+            double score = tech.getNNum() != null ? tech.getNNum() : 0;
+            redisTemplate.opsForZSet().add(HOT_MERCHANT_RANK_KEY, tech.getId().toString(), score);
+        }
+
+        redisTemplate.delete(HOT_PROJECT_RANK_KEY);
+        List<ProjectSalesVO> allProjectSales = projectMapper.selectAllProjectSalesCount();
+        for (ProjectSalesVO vo : allProjectSales) {
+            Project project = new Project();
+            project.setId(vo.getId());
+            project.setSalesCompleted(vo.getSalesCount());
+            projectMapper.updateById(project);
+            long salesCount = vo.getSalesCount() != null ? vo.getSalesCount() : 0L;
+            redisTemplate.opsForZSet().add(HOT_PROJECT_RANK_KEY, vo.getId().toString(), salesCount);
+        }
+        log.info("热门排行ZSet全量同步完成,商户数量:{}, 项目数量:{}", validTechList.size(), allProjectSales.size());
+    }
+
     /**
      * 交替合并:商户1、项目1、商户2、项目2
      */

+ 21 - 0
nightFragrance-massage/src/main/java/com/ylx/home/hot/task/HotRankSyncTask.java

@@ -0,0 +1,21 @@
+package com.ylx.home.hot.task;
+
+import com.ylx.home.hot.service.HomeHotRecommendService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Slf4j
+@Component("hotRankSyncTask")
+public class HotRankSyncTask {
+
+    @Resource
+    private HomeHotRecommendService homeHotRecommendService;
+
+    public void syncAllHotRank() {
+        log.info("全量同步热门排行 Redis ZSet 开始");
+        homeHotRecommendService.syncAllHotRank();
+        log.info("全量同步热门排行 Redis ZSet 结束");
+    }
+}

+ 5 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/mapper/MaTechnicianMapper.java

@@ -209,7 +209,6 @@ public interface MaTechnicianMapper extends BaseMapper<MaTechnician> {
             "      AND t.merchant_status = 0" +
             "      AND p.is_delete = 0" +
             "      AND p.audit_status = 1" +
-            "      AND p.merchant_type = 0" +
             "      AND p.project_is_enable = 1" +
             ") AS has_merchant_with_service")
     Boolean isHasMerchantCity(@Param("areaCode") String areaCode);
@@ -235,5 +234,10 @@ public interface MaTechnicianMapper extends BaseMapper<MaTechnician> {
     List<MerchantWithAddressVO> selectTechWithAddressByIds(@Param("ids") List<Integer> ids);
 
     List<MerchantWithAddressVO> listValidTechWithAddress(@Param("offset") long offset, @Param("fetchCount") long fetchCount);
+
+    /**
+     * 查询全部有效技师(未删除、正常、审核通过、非休息)
+     */
+    List<MaTechnician> selectAllValidTech();
 }
 

+ 8 - 3
nightFragrance-massage/src/main/java/com/ylx/project/mapper/ProjectMapper.java

@@ -1,17 +1,17 @@
 package com.ylx.project.mapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ylx.home.hot.domain.vo.ProjectSalesVO;
 import com.ylx.massage.domain.dto.OptionDTO;
 import com.ylx.massage.domain.dto.ServiceOptionDTO;
 import com.ylx.massage.domain.vo.ProductOptionVO;
 import com.ylx.massage.domain.vo.ProductServiceOptionVO;
 import com.ylx.project.domain.Project;
 import com.ylx.project.domain.vo.ProjectDetailVo;
-import lombok.extern.slf4j.Slf4j;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
-import java.util.Date;
+
 import java.util.List;
 
 @Mapper
@@ -31,4 +31,9 @@ public interface ProjectMapper extends BaseMapper<Project> {
     List<Project> selectProjectPage(@Param("offset") long offset, @Param("fetchCount") long fetchCount);
 
     Long countValidProject();
+
+    /**
+     * 查询全部上架有效项目及实时完成订单销量
+     */
+    List<ProjectSalesVO> selectAllProjectSalesCount();
 }

+ 9 - 0
nightFragrance-massage/src/main/resources/mapper/massage/MaTechnicianMapper.xml

@@ -727,4 +727,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             LIMIT #{offset}, #{size}
     </select>
 
+    <select id="selectAllValidTech" resultType="com.ylx.massage.domain.MaTechnician">
+        SELECT id, n_num
+        FROM ma_technician
+        WHERE is_delete = 0
+          AND merchant_status = 0
+          AND audit_status = 2
+          AND service_state != 2
+    </select>
+
 </mapper>

+ 14 - 0
nightFragrance-massage/src/main/resources/mapper/project/ProjectMapper.xml

@@ -199,5 +199,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         AND status = 0
     </select>
 
+    <!-- 查询全部上架有效项目及实时完成订单销量 -->
+    <select id="selectAllProjectSalesCount" resultType="com.ylx.home.hot.domain.vo.ProjectSalesVO">
+        SELECT
+            p.id AS id,
+            COALESCE(COUNT(o.id), 0) AS salesCount
+        FROM project p
+        LEFT JOIN t_order o ON o.project_id = p.id
+            AND o.status = 5
+            AND o.is_delete = 0
+        WHERE p.is_delete = 0
+          AND p.status = 0
+        GROUP BY p.id
+    </select>
+
 
 </mapper>