package com.tcm.training.admin.app.popularization.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.tcm.training.admin.app.popularization.vo.AppHealthPopularizationDetailVO; import com.tcm.training.admin.app.popularization.vo.AppHealthPopularizationListItemVO; import com.tcm.training.admin.live.entity.HealthPopularization; import com.tcm.training.admin.live.mapper.HealthPopularizationMapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * APP 健康科普详情聚合服务。 */ @Service public class AppHealthPopularizationService { private static final int STATUS_ENABLED = 1; private final HealthPopularizationMapper healthPopularizationMapper; /** * 注入 APP 健康科普详情所需依赖。 */ public AppHealthPopularizationService(HealthPopularizationMapper healthPopularizationMapper) { this.healthPopularizationMapper = healthPopularizationMapper; } /** * 获取 APP 健康科普列表页数据。 * * @param contentType 内容类型:1 健康知识、2 养生科普;为空则返回全部。 */ public List list(Integer contentType) { List items = healthPopularizationMapper.selectList(new LambdaQueryWrapper() .eq(HealthPopularization::getDeleted, 0) .eq(HealthPopularization::getStatus, STATUS_ENABLED) .eq(contentType != null, HealthPopularization::getContentType, contentType) .orderByDesc(HealthPopularization::getSort) .orderByDesc(HealthPopularization::getId)); if (items == null || items.isEmpty()) { return Collections.emptyList(); } List result = new ArrayList(items.size()); for (HealthPopularization item : items) { AppHealthPopularizationListItemVO listItemVO = new AppHealthPopularizationListItemVO(); listItemVO.setId(item.getId()); listItemVO.setTitle(trimToEmpty(item.getTitle())); listItemVO.setCoverImage(trimToEmpty(item.getCoverImg())); listItemVO.setContentType(item.getContentType()); listItemVO.setClickCount(defaultNumber(item.getClickCount())); result.add(listItemVO); } return result; } /** * 获取 APP 健康科普详情页数据,并在每次访问时累加点击量。 */ @Transactional public AppHealthPopularizationDetailVO detail(Long popularizationId) { HealthPopularization item = requireEnabledItem(popularizationId); // 参考项目介绍,APP 进入详情后累加点击量并回写。 item.setClickCount(defaultNumber(item.getClickCount()) + 1); healthPopularizationMapper.updateById(item); AppHealthPopularizationDetailVO detailVO = new AppHealthPopularizationDetailVO(); detailVO.setId(item.getId()); detailVO.setTitle(trimToEmpty(item.getTitle())); detailVO.setCoverImage(trimToEmpty(item.getCoverImg())); detailVO.setContentType(item.getContentType()); detailVO.setContentTypeText(resolveContentTypeText(item.getContentType())); detailVO.setContent(trimToEmpty(item.getContent())); detailVO.setVideoUrl(trimToEmpty(item.getVideoUrl())); detailVO.setVideoFileName(trimToEmpty(item.getVideoFileName())); detailVO.setVideoDescription(trimToEmpty(item.getVideoDescription())); detailVO.setClickCount(defaultNumber(item.getClickCount())); return detailVO; } /** * 查询启用中的健康科普详情,避免 APP 访问到后台下线内容。 */ private HealthPopularization requireEnabledItem(Long popularizationId) { HealthPopularization item = healthPopularizationMapper.selectOne(new LambdaQueryWrapper() .eq(HealthPopularization::getId, popularizationId) .eq(HealthPopularization::getDeleted, 0) .eq(HealthPopularization::getStatus, STATUS_ENABLED) .last("LIMIT 1")); if (item == null) { throw new IllegalArgumentException("健康科普不存在"); } return item; } /** * 解析内容类型文案,便于前端按类型渲染页面。 */ private String resolveContentTypeText(Integer contentType) { if (contentType != null && contentType.intValue() == HealthPopularization.CONTENT_TYPE_VIDEO) { return "视频"; } return "图文"; } /** * 将可空数字统一转换为默认值,避免前端列表展示空计数。 */ 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; } }