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<AppHealthPopularizationListItemVO> list(Integer contentType) {
|
List<HealthPopularization> items = healthPopularizationMapper.selectList(new LambdaQueryWrapper<HealthPopularization>()
|
.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<AppHealthPopularizationListItemVO> result =
|
new ArrayList<AppHealthPopularizationListItemVO>(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<HealthPopularization>()
|
.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;
|
}
|
}
|