package com.ruoyi.basic.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.basic.entity.StorageAttachment;
import com.ruoyi.basic.entity.StorageBlob;
import com.ruoyi.basic.entity.dto.StorageBlobDTO;
import com.ruoyi.basic.mapper.StorageAttachmentMapper;
import com.ruoyi.basic.mapper.StorageBlobMapper;
import com.ruoyi.basic.service.StorageBlobService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.config.MinioConfig;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.MinioResult;
import com.ruoyi.common.exception.file.InvalidExtensionException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.MinioUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import java.util.List;
/**
*
* 通用文件上传的附件信息 服务实现类
*
*
* @author ruoyi
* @since 2025-05-29
*/
@Service
@RequiredArgsConstructor
public class StorageBlobServiceImpl extends ServiceImpl implements StorageBlobService {
@Autowired
private StorageAttachmentMapper storageAttachmentMapper;
@Autowired
private StorageBlobMapper storageBlobMapper;
@Autowired
private MinioUtils minioUtils;
@Override
public List updateStorageBlobs(List files, String bucketName) {
// 若没传入bucketName,则使用默认bucketName
if (StringUtils.isEmpty(bucketName)) {
bucketName = minioUtils.getDefaultBucket();
}
List storageBlobDTOs = new ArrayList<>();
for (MultipartFile file : files) {
try {
MinioResult res = minioUtils.upload(bucketName, file, false);
StorageBlobDTO dto = new StorageBlobDTO();
dto.setContentType(file.getContentType());
dto.setBucketFilename(res.getBucketFileName());
dto.setOriginalFilename(res.getOriginalName());
dto.setByteSize(file.getSize());
dto.setKey(IdUtils.simpleUUID());
dto.setBucketName(bucketName);
dto.setCreateTime(DateUtils.getNowDate());
dto.setUrl(minioUtils.getPreviewUrl(res.getBucketFileName(), bucketName, false));
// 插入数据库
storageBlobMapper.insert(dto);
storageBlobDTOs.add(dto);
} catch (InvalidExtensionException e) {
throw new RuntimeException("minio文件上传异常:" + e);
}
}
return storageBlobDTOs;
}
@Override
public int deleteStorageBlobs(StorageAttachment attachment) {
List attachments = storageAttachmentMapper.selectList(new LambdaQueryWrapper()
.eq(StorageAttachment::getRecordId, attachment.getRecordId())
.eq(StorageAttachment::getRecordType, attachment.getRecordType())
.eq(StorageAttachment::getName, attachment.getName()));
List ids = attachments.stream().map(StorageAttachment::getStorageBlobId).toList();
List storageBlobs = storageBlobMapper.selectList(new LambdaQueryWrapper()
.in(StorageBlob::getId, ids));
if (!storageBlobs.isEmpty()) {
for (StorageBlob storageBlob : storageBlobs) {
// 移除桶内文件
minioUtils.removeObjectsResult(storageBlob.getBucketName(), storageBlob.getBucketName());
}
}
if (!ids.isEmpty()) {
return storageBlobMapper.delete(new QueryWrapper().lambda().in(StorageBlob::getId, ids));
}
return 0;
}
}