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 page(int page, int pageSize, String keyword, Integer contentType, Integer status) { LambdaQueryWrapper qw = new LambdaQueryWrapper() .eq(HealthPopularization::getDeleted, 0) .orderByAsc(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 result = healthPopularizationMapper.selectPage(new Page(page, pageSize), qw); List list = new ArrayList(); 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() .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; } }