package com.tcm.training.admin.live.service;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.tcm.training.admin.common.PageResponse;
|
import com.tcm.training.admin.live.dto.HealthPopularizationSaveRequest;
|
import com.tcm.training.admin.live.entity.HealthPopularization;
|
import com.tcm.training.admin.live.mapper.HealthPopularizationMapper;
|
import com.tcm.training.admin.live.vo.HealthPopularizationDetailVO;
|
import com.tcm.training.admin.live.vo.HealthPopularizationListItemVO;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.util.ArrayList;
|
import java.util.List;
|
|
@Service
|
public class HealthPopularizationAppService {
|
|
private final HealthPopularizationMapper healthPopularizationMapper;
|
|
public HealthPopularizationAppService(HealthPopularizationMapper healthPopularizationMapper) {
|
this.healthPopularizationMapper = healthPopularizationMapper;
|
}
|
|
public PageResponse<HealthPopularizationListItemVO> page(int page,
|
int pageSize,
|
String keyword,
|
Integer contentType,
|
Integer status) {
|
LambdaQueryWrapper<HealthPopularization> qw = new LambdaQueryWrapper<HealthPopularization>()
|
.eq(HealthPopularization::getDeleted, 0)
|
.orderByDesc(HealthPopularization::getSort)
|
.orderByDesc(HealthPopularization::getId);
|
String trimmedKeyword = trimToNull(keyword);
|
if (trimmedKeyword != null) {
|
qw.like(HealthPopularization::getTitle, trimmedKeyword);
|
}
|
if (contentType != null) {
|
qw.eq(HealthPopularization::getContentType, contentType);
|
}
|
if (status != null) {
|
qw.eq(HealthPopularization::getStatus, status);
|
}
|
|
IPage<HealthPopularization> result = healthPopularizationMapper.selectPage(new Page<HealthPopularization>(page, pageSize), qw);
|
List<HealthPopularizationListItemVO> list = new ArrayList<HealthPopularizationListItemVO>();
|
for (HealthPopularization item : result.getRecords()) {
|
list.add(toListItem(item));
|
}
|
return PageResponse.of(list, result.getTotal(), result.getCurrent(), result.getSize());
|
}
|
|
public HealthPopularizationDetailVO detail(Long id) {
|
return toDetailVO(requireItem(id));
|
}
|
|
@Transactional
|
public HealthPopularizationDetailVO create(HealthPopularizationSaveRequest req) {
|
HealthPopularization item = new HealthPopularization();
|
fillEntity(item, req);
|
item.setClickCount(0);
|
item.setDeleted(0);
|
healthPopularizationMapper.insert(item);
|
return detail(item.getId());
|
}
|
|
@Transactional
|
public HealthPopularizationDetailVO update(Long id, HealthPopularizationSaveRequest req) {
|
HealthPopularization item = requireItem(id);
|
fillEntity(item, req);
|
healthPopularizationMapper.updateById(item);
|
return detail(id);
|
}
|
|
@Transactional
|
public void delete(Long id) {
|
requireItem(id);
|
healthPopularizationMapper.deleteById(id);
|
}
|
|
private void fillEntity(HealthPopularization item, HealthPopularizationSaveRequest req) {
|
int contentType = validateContentType(req.getContentType());
|
item.setTitle(req.getTitle().trim());
|
item.setCoverImg(req.getCoverImg().trim());
|
item.setContentType(contentType);
|
item.setStatus(req.getStatus());
|
item.setIsHomeRecommend(req.getIsHomeRecommend());
|
item.setSort(req.getSort());
|
if (contentType == HealthPopularization.CONTENT_TYPE_ARTICLE) {
|
String content = trimToNull(req.getContent());
|
if (content == null) {
|
throw new IllegalArgumentException("请输入科普内容");
|
}
|
item.setContent(content);
|
item.setVideoUrl(null);
|
item.setVideoFileName(null);
|
return;
|
}
|
|
String videoUrl = trimToNull(req.getVideoUrl());
|
if (videoUrl == null) {
|
throw new IllegalArgumentException("请填写视频地址或上传本地视频");
|
}
|
item.setContent(null);
|
item.setVideoUrl(videoUrl);
|
item.setVideoFileName(trimToNull(req.getVideoFileName()));
|
}
|
|
private int validateContentType(Integer contentType) {
|
if (contentType == null) {
|
throw new IllegalArgumentException("请选择科普内容类型");
|
}
|
if (contentType != HealthPopularization.CONTENT_TYPE_ARTICLE
|
&& contentType != HealthPopularization.CONTENT_TYPE_VIDEO) {
|
throw new IllegalArgumentException("科普内容类型不合法");
|
}
|
return contentType;
|
}
|
|
private HealthPopularization requireItem(Long id) {
|
HealthPopularization item = healthPopularizationMapper.selectOne(new LambdaQueryWrapper<HealthPopularization>()
|
.eq(HealthPopularization::getId, id)
|
.eq(HealthPopularization::getDeleted, 0)
|
.last("limit 1"));
|
if (item == null) {
|
throw new IllegalArgumentException("健康科普不存在");
|
}
|
return item;
|
}
|
|
private HealthPopularizationListItemVO toListItem(HealthPopularization item) {
|
HealthPopularizationListItemVO vo = new HealthPopularizationListItemVO();
|
vo.setId(item.getId());
|
vo.setTitle(item.getTitle());
|
vo.setCoverImg(item.getCoverImg());
|
vo.setClickCount(defaultNumber(item.getClickCount()));
|
vo.setSort(defaultNumber(item.getSort()));
|
vo.setContentType(item.getContentType());
|
vo.setStatus(item.getStatus());
|
vo.setIsHomeRecommend(item.getIsHomeRecommend());
|
vo.setCreatedAt(item.getCreatedAt());
|
return vo;
|
}
|
|
private HealthPopularizationDetailVO toDetailVO(HealthPopularization item) {
|
HealthPopularizationDetailVO vo = new HealthPopularizationDetailVO();
|
vo.setId(item.getId());
|
vo.setTitle(item.getTitle());
|
vo.setCoverImg(item.getCoverImg());
|
vo.setContentType(item.getContentType());
|
vo.setContent(item.getContent());
|
vo.setVideoUrl(item.getVideoUrl());
|
vo.setVideoFileName(item.getVideoFileName());
|
vo.setStatus(item.getStatus());
|
vo.setIsHomeRecommend(item.getIsHomeRecommend());
|
vo.setClickCount(defaultNumber(item.getClickCount()));
|
vo.setSort(defaultNumber(item.getSort()));
|
vo.setCreatedAt(item.getCreatedAt());
|
vo.setUpdatedAt(item.getUpdatedAt());
|
return vo;
|
}
|
|
private Integer defaultNumber(Integer value) {
|
return value == null ? 0 : value;
|
}
|
|
private String trimToNull(String value) {
|
if (value == null) {
|
return null;
|
}
|
String trimmed = value.trim();
|
return trimmed.isEmpty() ? null : trimmed;
|
}
|
}
|