|
|
@@ -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
|
|
|
*/
|