|
|
|
@ -31,10 +31,7 @@ import com.youlai.boot.mini.model.entity.MiniStrayAnimalNote; |
|
|
|
import com.youlai.boot.mini.model.entity.MiniStrayAnimalNoteMedia; |
|
|
|
import com.youlai.boot.mini.model.form.StrayAnimalForm; |
|
|
|
import com.youlai.boot.mini.model.query.OwnStrayAnimalQuery; |
|
|
|
import com.youlai.boot.mini.model.vo.MiniStrayAnimalNoteMediaVO; |
|
|
|
import com.youlai.boot.mini.model.vo.StrayAnimalDetailsVO; |
|
|
|
import com.youlai.boot.mini.model.vo.StrayAnimalNearbyVO; |
|
|
|
import com.youlai.boot.mini.model.vo.StrayAnimalShortVO; |
|
|
|
import com.youlai.boot.mini.model.vo.*; |
|
|
|
import com.youlai.boot.mini.service.MiniPointRecordService; |
|
|
|
import com.youlai.boot.mini.service.StrayAnimalService; |
|
|
|
import com.youlai.boot.system.mapper.UserMapper; |
|
|
|
@ -86,11 +83,97 @@ public class StrayAnimalServiceImpl extends ServiceImpl<MiniStrayAnimalMapper, M |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
public List<String> saveFile(List<MultipartFile> images, List<MultipartFile> videos) { |
|
|
|
long currentTimestamp = System.currentTimeMillis(); |
|
|
|
List<String> urlList = new ArrayList<>(); |
|
|
|
// 处理图片
|
|
|
|
if (images != null) { |
|
|
|
for (MultipartFile image : images) { |
|
|
|
try { |
|
|
|
String objectName = "animal_note/image/" |
|
|
|
+ currentTimestamp + RandomNumberUtils.createRandomLowerLetterAndNumber(8) |
|
|
|
+ "." |
|
|
|
+ FilenameUtils.getExtension(image.getOriginalFilename()); |
|
|
|
String url = aliyunFileService.uploadFile(objectName, image.getInputStream()); |
|
|
|
MiniStrayAnimalNoteMedia miniStrayAnimalNoteMedia = new MiniStrayAnimalNoteMedia(); |
|
|
|
miniStrayAnimalNoteMedia.setUuid(UUID.randomUUID().toString()); |
|
|
|
miniStrayAnimalNoteMedia.setMediaType(AnimalNoteMediaTypeEnum.IMAGE.name().toLowerCase()); |
|
|
|
miniStrayAnimalNoteMedia.setSourceUrl(url); |
|
|
|
miniStrayAnimalNoteMedia.setStorageKey(objectName); |
|
|
|
BufferedImage imageInfo = ImageIO.read(image.getInputStream()); |
|
|
|
miniStrayAnimalNoteMedia.setWidth(imageInfo.getWidth()); |
|
|
|
miniStrayAnimalNoteMedia.setHeight(imageInfo.getHeight()); |
|
|
|
miniStrayAnimalNoteMedia.setCreateTimestamp(currentTimestamp); |
|
|
|
miniStrayAnimalNoteMedia.setCreateTime(new Date(currentTimestamp)); |
|
|
|
miniStrayAnimalNoteMedia.setCreateBy(SecurityUtils.getUserId()); |
|
|
|
|
|
|
|
int result = miniStrayAnimalNoteMediaMapper.insert(miniStrayAnimalNoteMedia); |
|
|
|
|
|
|
|
if (result > 0) { |
|
|
|
urlList.add(url); |
|
|
|
} |
|
|
|
} catch (Exception e) { |
|
|
|
log.error("image upload failed", e); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// 处理视频 (如果有)
|
|
|
|
if (videos != null) { |
|
|
|
String tmpPath = System.getProperty("user.dir") + "/tmp"; |
|
|
|
for (MultipartFile video : videos) { |
|
|
|
try { |
|
|
|
String fileName = currentTimestamp + RandomNumberUtils.createRandomLowerLetterAndNumber(8); |
|
|
|
String objectName = "animal_note/video/" |
|
|
|
+ fileName |
|
|
|
+ "." |
|
|
|
+ FilenameUtils.getExtension(video.getOriginalFilename()); |
|
|
|
String url = aliyunFileService.uploadFile(objectName, video.getInputStream()); |
|
|
|
MiniStrayAnimalNoteMedia miniStrayAnimalNoteMedia = new MiniStrayAnimalNoteMedia(); |
|
|
|
miniStrayAnimalNoteMedia.setUuid(UUID.randomUUID().toString()); |
|
|
|
miniStrayAnimalNoteMedia.setMediaType(AnimalNoteMediaTypeEnum.VIDEO.name().toLowerCase()); |
|
|
|
miniStrayAnimalNoteMedia.setSourceUrl(url); |
|
|
|
miniStrayAnimalNoteMedia.setStorageKey(objectName); |
|
|
|
miniStrayAnimalNoteMedia.setCreateTimestamp(currentTimestamp); |
|
|
|
miniStrayAnimalNoteMedia.setCreateTime(new Date(currentTimestamp)); |
|
|
|
miniStrayAnimalNoteMedia.setCreateBy(SecurityUtils.getUserId()); |
|
|
|
//时长
|
|
|
|
FileUtils.saveFile(video, tmpPath, fileName); |
|
|
|
String videoPath = tmpPath + File.separator + fileName; |
|
|
|
double duration = JavaVCUtils.getVideoDuration(videoPath); |
|
|
|
miniStrayAnimalNoteMedia.setDuration((int) Math.ceil(duration)); |
|
|
|
//缩略图
|
|
|
|
BufferedImage thumbnail = JavaVCUtils.getVideoThumbnail(videoPath, 1); |
|
|
|
String thumbnailFileName = currentTimestamp + RandomNumberUtils.createRandomLowerLetterAndNumber(8); |
|
|
|
String thumbnailObjectName = "animal_note/thumbnail/" |
|
|
|
+ thumbnailFileName |
|
|
|
+ ".png"; |
|
|
|
String thumbnailUrl = aliyunFileService.uploadFile(thumbnailObjectName, |
|
|
|
FileUtils.bufferedImageToInputStream(thumbnail, "png")); |
|
|
|
miniStrayAnimalNoteMedia.setThumbnailUrl(thumbnailUrl); |
|
|
|
|
|
|
|
int result = miniStrayAnimalNoteMediaMapper.insert(miniStrayAnimalNoteMedia); |
|
|
|
if (result > 0) { |
|
|
|
urlList.add(url); |
|
|
|
} |
|
|
|
|
|
|
|
FileUtils.delete(videoPath); |
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
log.error("video upload failed", e); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return urlList; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
@Transactional(rollbackFor = Exception.class) |
|
|
|
public String saveStrayAnimal(StrayAnimalForm formData, List<MultipartFile> images, List<MultipartFile> videos) { |
|
|
|
public SaveStrayAnimalVO saveStrayAnimal(StrayAnimalForm formData) { |
|
|
|
// 1. 参数校验
|
|
|
|
validateInput(images, videos); |
|
|
|
// validateInput(images, videos);
|
|
|
|
|
|
|
|
// 2. 保存流浪动物基本信息
|
|
|
|
MiniStrayAnimal miniStrayAnimal = saveAnimalInfo(formData); |
|
|
|
@ -99,14 +182,26 @@ public class StrayAnimalServiceImpl extends ServiceImpl<MiniStrayAnimalMapper, M |
|
|
|
MiniStrayAnimalNote note = saveNoteInfo(formData, miniStrayAnimal); |
|
|
|
|
|
|
|
// 4. 处理并保存媒体文件
|
|
|
|
saveMediaFiles(note, images, videos, miniStrayAnimal.getCreateTimestamp()); |
|
|
|
|
|
|
|
// saveMediaFiles(note, images, videos, miniStrayAnimal.getCreateTimestamp());
|
|
|
|
saveMediaFiles(note, formData); |
|
|
|
// 5. 积分
|
|
|
|
pointRecordService.giveRegisterAnimalReward(miniStrayAnimal.getMiniUserId(), miniStrayAnimal.getId()); |
|
|
|
|
|
|
|
// 6. 提交审核
|
|
|
|
|
|
|
|
return miniStrayAnimal.getUuid(); |
|
|
|
SaveStrayAnimalVO vo = new SaveStrayAnimalVO(); |
|
|
|
vo.setAnimalUuid(miniStrayAnimal.getUuid()); |
|
|
|
vo.setAnimalNoteUuid(note.getUuid()); |
|
|
|
return vo; |
|
|
|
} |
|
|
|
|
|
|
|
private void saveMediaFiles(MiniStrayAnimalNote note, StrayAnimalForm formData) { |
|
|
|
if (CollUtil.isNotEmpty(formData.getMediaUrlList())){ |
|
|
|
LambdaUpdateWrapper<MiniStrayAnimalNoteMedia> wrapper = new LambdaUpdateWrapper<>(); |
|
|
|
wrapper.in(MiniStrayAnimalNoteMedia::getSourceUrl, formData.getMediaUrlList()) |
|
|
|
.set(MiniStrayAnimalNoteMedia::getNoteId, note.getId()); |
|
|
|
miniStrayAnimalNoteMediaMapper.update(wrapper); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private void saveMediaFiles(MiniStrayAnimalNote note, List<MultipartFile> images, List<MultipartFile> videos, long currentTimestamp) { |
|
|
|
@ -236,12 +331,8 @@ public class StrayAnimalServiceImpl extends ServiceImpl<MiniStrayAnimalMapper, M |
|
|
|
} |
|
|
|
|
|
|
|
private void validateInput(List<MultipartFile> images, List<MultipartFile> videos) { |
|
|
|
// 验证必填图片
|
|
|
|
if (images == null || images.isEmpty()) { |
|
|
|
throw new MsgException("需要上传图片"); |
|
|
|
} |
|
|
|
// 验证图片数量
|
|
|
|
if (images.size() > CommonConstants.STRAY_ANIMAL_IMAGE_NUM_LIMIT) { |
|
|
|
if (!CollUtil.isEmpty(images) && images.size() > CommonConstants.STRAY_ANIMAL_IMAGE_NUM_LIMIT) { |
|
|
|
throw new MsgException( |
|
|
|
"最多只能上传" + CommonConstants.STRAY_ANIMAL_IMAGE_NUM_LIMIT + "张图片" |
|
|
|
); |
|
|
|
|