package com.tcm.training.admin.app.search.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.tcm.training.admin.app.search.vo.AppSearchHealthCourseVO; import com.tcm.training.admin.app.search.vo.AppSearchHealthPopularizationVO; import com.tcm.training.admin.app.search.vo.AppSearchResultVO; import com.tcm.training.admin.live.entity.HealthPopularization; import com.tcm.training.admin.live.mapper.HealthCourseMapper; import com.tcm.training.admin.live.mapper.HealthPopularizationMapper; import com.tcm.training.admin.live.vo.HealthCourseListRow; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * APP 首页搜索聚合服务。 */ @Service public class AppSearchService { private static final int STATUS_ENABLED = 1; private final HealthCourseMapper healthCourseMapper; private final HealthPopularizationMapper healthPopularizationMapper; /** * 注入 APP 搜索所需依赖。 */ public AppSearchService(HealthCourseMapper healthCourseMapper, HealthPopularizationMapper healthPopularizationMapper) { this.healthCourseMapper = healthCourseMapper; this.healthPopularizationMapper = healthPopularizationMapper; } /** * 按关键词聚合搜索养生课程与健康科普。 */ public AppSearchResultVO search(String keyword) { String normalizedKeyword = trimToNull(keyword); AppSearchResultVO resultVO = new AppSearchResultVO(); if (normalizedKeyword == null) { resultVO.setCourses(Collections.emptyList()); resultVO.setPopularizations(Collections.emptyList()); return resultVO; } resultVO.setCourses(toCourseList(healthCourseMapper.selectAppSearchCourses(normalizedKeyword))); resultVO.setPopularizations(toPopularizationList(listPopularizations(normalizedKeyword))); return resultVO; } /** * 查询命中的健康科普内容。 */ private List listPopularizations(String keyword) { List list = healthPopularizationMapper.selectList(new LambdaQueryWrapper() .eq(HealthPopularization::getDeleted, 0) .eq(HealthPopularization::getStatus, STATUS_ENABLED) .and(wrapper -> wrapper .like(HealthPopularization::getTitle, keyword) .or() .like(HealthPopularization::getContent, keyword) .or() .like(HealthPopularization::getCreatedBy, keyword)) .orderByAsc(HealthPopularization::getSort) .orderByDesc(HealthPopularization::getId)); return list == null ? Collections.emptyList() : list; } /** * 将课程搜索结果转换为 APP 搜索页卡片响应。 */ private List toCourseList(List rows) { if (rows == null || rows.isEmpty()) { return Collections.emptyList(); } List result = new ArrayList(rows.size()); for (HealthCourseListRow row : rows) { AppSearchHealthCourseVO courseVO = new AppSearchHealthCourseVO(); courseVO.setId(row.getId()); courseVO.setTitle(trimToEmpty(row.getTitle())); courseVO.setCoverImage(trimToEmpty(row.getCoverImg())); courseVO.setLevelName(trimToEmpty(row.getLevelName())); courseVO.setDifficultyName(trimToEmpty(row.getDifficultyName())); courseVO.setSalePrice(defaultPrice(row.getSalePrice())); courseVO.setLearnUserCount(defaultNumber(row.getLearnUserCount())); courseVO.setStudyingCount(defaultNumber(row.getStudyingCount())); result.add(courseVO); } return result; } /** * 将健康科普搜索结果转换为 APP 搜索页卡片响应。 */ private List toPopularizationList(List items) { if (items == null || items.isEmpty()) { return Collections.emptyList(); } List result = new ArrayList(items.size()); for (HealthPopularization item : items) { AppSearchHealthPopularizationVO popularizationVO = new AppSearchHealthPopularizationVO(); popularizationVO.setId(item.getId()); popularizationVO.setTitle(trimToEmpty(item.getTitle())); popularizationVO.setCoverImage(trimToEmpty(item.getCoverImg())); popularizationVO.setContentType(item.getContentType()); result.add(popularizationVO); } return result; } /** * 兜底空价格字段。 */ private BigDecimal defaultPrice(BigDecimal value) { return value == null ? BigDecimal.ZERO : value; } /** * 兜底空数字字段。 */ private Integer defaultNumber(Integer value) { return value == null ? 0 : value; } /** * 将可空文本转换为空字符串。 */ private String trimToEmpty(String value) { if (value == null) { return ""; } String trimmed = value.trim(); return trimmed.isEmpty() ? "" : trimmed; } /** * 将可空关键字转换为可搜索文本。 */ private String trimToNull(String value) { if (value == null) { return null; } String trimmed = value.trim(); return trimmed.isEmpty() ? null : trimmed; } }