package com.rongyichuang.judge.service; import com.rongyichuang.judge.dto.request.JudgeInput; import com.rongyichuang.judge.dto.response.JudgeResponse; import com.rongyichuang.judge.entity.Judge; import com.rongyichuang.judge.entity.Tag; import com.rongyichuang.judge.repository.JudgeRepository; import com.rongyichuang.common.entity.Media; import com.rongyichuang.common.repository.MediaRepository; import com.rongyichuang.common.dto.request.MediaInput; import com.rongyichuang.common.dto.response.MediaResponse; import com.rongyichuang.common.service.MediaService; import com.rongyichuang.judge.repository.TagRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @Service public class JudgeService { private static final Logger log = LoggerFactory.getLogger(JudgeService.class); private final JudgeRepository judgeRepository; private final TagRepository tagRepository; private final MediaRepository mediaRepository; private final MediaService mediaService; public JudgeService(JudgeRepository judgeRepository, TagRepository tagRepository, MediaRepository mediaRepository, MediaService mediaService) { this.judgeRepository = judgeRepository; this.tagRepository = tagRepository; this.mediaRepository = mediaRepository; this.mediaService = mediaService; } public List findAll() { return judgeRepository.findAll(Sort.by(Sort.Direction.DESC, "updateTime")).stream() .map(this::convertToResponse) .collect(Collectors.toList()); } public List findByName(String name) { return judgeRepository.findByNameContaining(name).stream() .map(this::convertToResponse) .collect(Collectors.toList()); } public JudgeResponse findById(Long id) { return judgeRepository.findById(id) .map(this::convertToResponse) .orElse(null); } @Transactional public JudgeResponse save(JudgeInput input) { Judge judge; if (input.getId() != null) { judge = judgeRepository.findById(input.getId()) .orElseThrow(() -> new RuntimeException("评委不存在")); } else { judge = new Judge(); // 新增评委时检查手机号是否已存在 if (judgeRepository.existsByPhone(input.getPhone())) { throw new RuntimeException("手机号码已存在,请使用其他手机号码"); } } judge.setName(input.getName()); judge.setPhone(input.getPhone()); judge.setGender(input.getGender()); judge.setDescription(input.getDescription()); // 头像处理已移除,因为数据库表结构中没有avatar_media_id字段 // 头像信息通过t_media表的target_type和target_id关联 // 设置专业标签 if (input.getMajorIds() != null && !input.getMajorIds().isEmpty()) { List specialties = tagRepository.findAllById(input.getMajorIds()); judge.setSpecialties(specialties); } else { judge.setSpecialties(Collections.emptyList()); } Judge savedJudge = judgeRepository.save(judge); return convertToResponse(savedJudge); } @Transactional public void delete(Long id) { Judge judge = judgeRepository.findById(id) .orElseThrow(() -> new RuntimeException("评委不存在")); judgeRepository.delete(judge); } private JudgeResponse convertToResponse(Judge judge) { log.info("=== convertToResponse called for judge: {} (ID: {})", judge.getName(), judge.getId()); JudgeResponse response = new JudgeResponse(); response.setId(judge.getId()); response.setName(judge.getName()); response.setPhone(judge.getPhone()); response.setGender(judge.getGender()); response.setDescription(judge.getDescription()); // 查询头像信息:target_type=1表示评委,target_id为评委ID log.info("=== Querying media for judge ID: {}", judge.getId()); List avatarMedias = mediaRepository.findByTargetTypeAndTargetIdAndState(1, judge.getId(), 1); log.info("=== Found {} media records", avatarMedias.size()); if (!avatarMedias.isEmpty()) { // 取第一个媒体作为头像 Media avatarMedia = avatarMedias.get(0); String avatarUrl = avatarMedia.getPath(); log.info("=== Setting avatarUrl: {}", avatarUrl); response.setAvatarUrl(avatarUrl); } else { log.info("=== No media found, avatarUrl will be null"); } if (judge.getSpecialties() != null) { response.setSpecialties(judge.getSpecialties().stream() .map(tag -> { JudgeResponse.TagResponse tagResponse = new JudgeResponse.TagResponse(); tagResponse.setId(tag.getId()); tagResponse.setName(tag.getName()); tagResponse.setCode(tag.getCode()); return tagResponse; }) .collect(Collectors.toList())); } return response; } /** * 保存媒体信息 */ public MediaResponse saveMediaInfo(MediaInput input) { Media media = mediaService.saveMedia( input.getName(), input.getPath(), input.getFileSize(), input.getFileExt(), input.getMediaType(), input.getTargetType(), input.getTargetId() ); MediaResponse response = new MediaResponse(); response.setId(media.getId()); response.setName(media.getName()); response.setPath(media.getPath()); response.setFileSize(media.getFileSize()); response.setFileExt(media.getFileExt()); response.setMediaType(media.getMediaType()); response.setTargetType(media.getTargetType()); response.setTargetId(media.getTargetId()); return response; } }