|
|
@@ -12,7 +12,6 @@ import cn.reghao.tnb.common.db.SelectOption;
|
|
|
import cn.reghao.tnb.content.app.disk.db.mapper.DiskAlbumMapper;
|
|
|
import cn.reghao.tnb.content.app.disk.db.mapper.DiskFileMapper;
|
|
|
import cn.reghao.tnb.content.app.disk.db.repository.DiskAlbumRepository;
|
|
|
-import cn.reghao.tnb.content.app.disk.model.dto.AlbumAdd;
|
|
|
import cn.reghao.tnb.content.app.disk.model.dto.AlbumCreate;
|
|
|
import cn.reghao.tnb.content.app.disk.model.po.DiskAlbum;
|
|
|
import cn.reghao.tnb.content.app.disk.model.po.DiskAlbumFile;
|
|
|
@@ -37,6 +36,7 @@ public class DiskAlbumService {
|
|
|
private OssService ossService;
|
|
|
private final int channelCode = 111;
|
|
|
private final int albumMaxFiles = 1000;
|
|
|
+ private final int pageSize = 12;
|
|
|
private final DiskFileMapper diskFileMapper;
|
|
|
private final DiskAlbumMapper diskAlbumMapper;
|
|
|
private final DiskAlbumRepository diskAlbumRepository;
|
|
|
@@ -54,65 +54,124 @@ public class DiskAlbumService {
|
|
|
|
|
|
public void createAlbum(AlbumCreate albumCreate) {
|
|
|
long albumId = idGenerator.nextId();
|
|
|
- DiskAlbum diskAlbum = new DiskAlbum(albumId, albumCreate.getAlbumName());
|
|
|
+ DiskAlbum diskAlbum = new DiskAlbum(albumId, albumCreate);
|
|
|
diskAlbumMapper.save(diskAlbum);
|
|
|
}
|
|
|
|
|
|
- public Result addAlbumFile(AlbumAdd albumAdd) {
|
|
|
- long albumId = albumAdd.getAlbumId();
|
|
|
- Set<String> existFileIds = diskAlbumMapper.findDiskAlbumFiles(albumId).stream()
|
|
|
- .map(DiskAlbumFile::getFileId)
|
|
|
- .collect(Collectors.toSet());
|
|
|
- if (existFileIds.size() >= albumMaxFiles) {
|
|
|
- return Result.fail(String.format("单个相册最多能容纳 %s 张照片", albumMaxFiles));
|
|
|
- }
|
|
|
-
|
|
|
- Set<String> existSha256sums = new HashSet<>();
|
|
|
- if (!existFileIds.isEmpty()) {
|
|
|
- existSha256sums = diskFileMapper.findByFileIds(new ArrayList<>(existFileIds)).stream()
|
|
|
- .map(DiskFile::getSha256sum)
|
|
|
- .collect(Collectors.toSet());
|
|
|
+ /**
|
|
|
+ * 添加新文件到合集中
|
|
|
+ *
|
|
|
+ * @param
|
|
|
+ * @return
|
|
|
+ * @date 2025-09-04 17:47:40
|
|
|
+ */
|
|
|
+ public synchronized Result addAlbumFile(long albumId, List<String> fileIds) {
|
|
|
+ DiskAlbum diskAlbum = diskAlbumMapper.findDiskAlbum(albumId);
|
|
|
+ if (diskAlbum == null) {
|
|
|
+ return Result.fail("album not exist");
|
|
|
}
|
|
|
|
|
|
- List<String> fileIds = albumAdd.getFileIds().stream()
|
|
|
- .filter(fileId -> !existFileIds.contains(fileId))
|
|
|
+ List<String> existSha256sumList = diskAlbumMapper.findDiskAlbumFiles(albumId).stream()
|
|
|
+ .map(DiskAlbumFile::getSha256sum)
|
|
|
.collect(Collectors.toList());
|
|
|
- if (fileIds.isEmpty()) {
|
|
|
- return Result.fail("添加的照片在当前相册中已存在");
|
|
|
+ if (existSha256sumList.size() >= albumMaxFiles) {
|
|
|
+ return Result.fail(String.format("单个合集最多能容纳 %s 张文件", albumMaxFiles));
|
|
|
}
|
|
|
|
|
|
+ Set<String> set = new HashSet<>(existSha256sumList);
|
|
|
long loginUser = UserContext.getUserId();
|
|
|
- List<DiskFile> diskFileList = diskFileMapper.findByFileIds(fileIds).stream()
|
|
|
+ int fileType = diskAlbum.getFileType();
|
|
|
+ List<DiskFile> diskFileList = diskFileService.findByFileIds(fileIds).stream()
|
|
|
+ .filter(diskFile -> !set.contains(diskFile.getSha256sum()))
|
|
|
.filter(diskFile -> diskFile.getOwner() == loginUser)
|
|
|
- .filter(diskFile -> diskFile.getFileType() == ObjectType.Image.getCode()
|
|
|
- || diskFile.getFileType() == ObjectType.Video.getCode())
|
|
|
+ .filter(diskFile -> diskFile.getFileType() == fileType)
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
|
- int startPos = existFileIds.size()+1;
|
|
|
+ if (diskFileList.isEmpty()) {
|
|
|
+ return Result.fail("添加的文件在当前合集中已存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ int startPos = existSha256sumList.size()+1;
|
|
|
List<DiskAlbumFile> list = new ArrayList<>();
|
|
|
for (DiskFile diskFile : diskFileList) {
|
|
|
- if (existSha256sums.add(diskFile.getSha256sum())) {
|
|
|
- list.add(new DiskAlbumFile(albumId, diskFile, startPos));
|
|
|
- startPos++;
|
|
|
+ list.add(new DiskAlbumFile(albumId, diskFile, startPos));
|
|
|
+ startPos++;
|
|
|
+ }
|
|
|
+
|
|
|
+ String coverFileId = diskFileList.get(0).getFileId();
|
|
|
+ int num = existSha256sumList.size() + diskFileList.size();
|
|
|
+ diskAlbumRepository.saveDiskAlbum(albumId, coverFileId, num, list);
|
|
|
+ return Result.successWithMsg(String.format("当前合集中新添加了 %s 张文件", list.size()));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 调整合集内文件的顺序
|
|
|
+ *
|
|
|
+ * @param
|
|
|
+ * @return
|
|
|
+ * @date 2025-09-04 17:47:19
|
|
|
+ */
|
|
|
+ public Result updateAlbumFilePosition(long albumId, List<String> fileIds) {
|
|
|
+ // fileId -> pos
|
|
|
+ Map<String, Integer> positionMap = new HashMap<>();
|
|
|
+ int startPos = 1;
|
|
|
+ for (int i = 0; i < fileIds.size(); i++) {
|
|
|
+ positionMap.put(fileIds.get(i), i+startPos);
|
|
|
+ }
|
|
|
+
|
|
|
+ // sha256sum -> fileId
|
|
|
+ Map<String, String> map = new HashMap<>();
|
|
|
+ diskFileService.findByFileIds(fileIds).forEach(diskFile -> {
|
|
|
+ map.put(diskFile.getSha256sum(), diskFile.getFileId());
|
|
|
+ });
|
|
|
+
|
|
|
+ List<DiskAlbumFile> diskAlbumFileList = diskAlbumMapper.findDiskAlbumFileList(albumId, map.keySet());
|
|
|
+ for (DiskAlbumFile diskAlbumFile : diskAlbumFileList) {
|
|
|
+ int id = diskAlbumFile.getId();
|
|
|
+ String sha256sum = diskAlbumFile.getSha256sum();
|
|
|
+ Integer pos = positionMap.get(map.get(sha256sum));
|
|
|
+ if (pos != null) {
|
|
|
+ diskAlbumMapper.updateDiskAlbumFilePos(id, pos);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (list.isEmpty()) {
|
|
|
- return Result.fail("添加的照片在当前相册中已存在");
|
|
|
+ return Result.success();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除合集内的文件
|
|
|
+ *
|
|
|
+ * @param
|
|
|
+ * @return
|
|
|
+ * @date 2025-09-04 17:48:05
|
|
|
+ */
|
|
|
+ public Result deleteAlbumFile(long albumId, List<String> fileIds) {
|
|
|
+ Set<String> deletedSha256sumSet = diskFileService.findByFileIds(fileIds).stream()
|
|
|
+ .map(DiskFile::getSha256sum)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+
|
|
|
+ DiskAlbum diskAlbum = diskAlbumMapper.findDiskAlbum(albumId);
|
|
|
+ int num = diskAlbum.getNum()-deletedSha256sumSet.size();
|
|
|
+ if (!deletedSha256sumSet.isEmpty()) {
|
|
|
+ diskAlbumRepository.deleteDiskAlbumFiles(albumId, num, deletedSha256sumSet);
|
|
|
}
|
|
|
|
|
|
- DiskAlbumFile diskAlbumFile = list.get(0);
|
|
|
- String objectId = diskAlbumFile.getFileId();
|
|
|
- String coverUrl = "";
|
|
|
- try {
|
|
|
- ObjectInfo objectInfo = ossService.getObjectInfo(channelCode, objectId);
|
|
|
- coverUrl = objectInfo.getUrl();
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
+ DiskFile diskFile = diskFileService.findByFileId(diskAlbum.getCoverFileId());
|
|
|
+ if (diskFile != null && deletedSha256sumSet.contains(diskFile.getSha256sum())) {
|
|
|
+ List<DiskAlbumFile> diskAlbumFileList = diskAlbumMapper.findDiskAlbumFiles(albumId);
|
|
|
+ String coverFileId = "";
|
|
|
+ if (!diskAlbumFileList.isEmpty()) {
|
|
|
+ String sha256sum = diskAlbumFileList.get(diskAlbumFileList.size()-1).getSha256sum();
|
|
|
+ List<DiskFile> diskFileList = diskFileService.findBySha256sum(sha256sum);
|
|
|
+ if (!diskFileList.isEmpty()) {
|
|
|
+ coverFileId = diskFileList.get(0).getFileId();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ diskAlbumMapper.updateDiskAlbumCover(albumId, coverFileId);
|
|
|
}
|
|
|
|
|
|
- diskAlbumRepository.saveDiskAlbum(albumId, coverUrl, existSha256sums.size(), list);
|
|
|
- return Result.successWithMsg(String.format("当前相册中新添加了 %s 张照片", list.size()));
|
|
|
+ return Result.success();
|
|
|
}
|
|
|
|
|
|
public List<SelectOption> getAlbumKeyValues() {
|
|
|
@@ -124,23 +183,21 @@ public class DiskAlbumService {
|
|
|
}).collect(Collectors.toList());
|
|
|
}
|
|
|
|
|
|
- public List<DiskAlbum> getAlbumList() {
|
|
|
+ public List<DiskAlbumInfo> getAlbumList() {
|
|
|
long loginUser = UserContext.getUserId();
|
|
|
- List<DiskAlbum> diskAlbumList = diskAlbumMapper.findByCreateBy(loginUser);
|
|
|
- diskAlbumList.forEach(diskAlbum -> {
|
|
|
- String coverUrl = diskAlbum.getCoverUrl();
|
|
|
+ return diskAlbumMapper.findByCreateBy(loginUser).stream().map(diskAlbum -> {
|
|
|
+ String coverUrl = "";
|
|
|
try {
|
|
|
- String signedUrl = ossService.getSignedUrlByUrl(channelCode, coverUrl);
|
|
|
- diskAlbum.setCoverUrl(signedUrl);
|
|
|
+ String coverFileId = diskAlbum.getCoverFileId();
|
|
|
+ coverUrl = ossService.getSignedUrl(channelCode, coverFileId);
|
|
|
} catch (Exception e) {
|
|
|
- log.error("{}", e.getMessage());
|
|
|
+ log.error("getSignedUrl error: {}", e.getMessage());
|
|
|
}
|
|
|
- });
|
|
|
-
|
|
|
- return diskAlbumList;
|
|
|
+ return new DiskAlbumInfo(diskAlbum, coverUrl);
|
|
|
+ }).collect(Collectors.toList());
|
|
|
}
|
|
|
|
|
|
- public DiskAlbumDetail getDiskAlbumDetail(long albumId) {
|
|
|
+ public DiskAlbumDetail getDiskAlbumDetail(long albumId, int pageNumber) {
|
|
|
long loginUser = UserContext.getUserId();
|
|
|
DiskAlbum diskAlbum = diskAlbumMapper.findDiskAlbum(albumId);
|
|
|
if (diskAlbum == null) {
|
|
|
@@ -152,61 +209,55 @@ public class DiskAlbumService {
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- List<DiskAlbumFile> diskAlbumFileList = diskAlbumMapper.findDiskAlbumFiles(albumId);
|
|
|
- List<String> fileIds = diskAlbumFileList.stream().map(DiskAlbumFile::getFileId).collect(Collectors.toList());
|
|
|
- if (fileIds.isEmpty()) {
|
|
|
- return new DiskAlbumDetail(diskAlbum, Collections.emptyList());
|
|
|
+ int total = diskAlbumMapper.countDiskAlbumFile(albumId);
|
|
|
+ Page page = new Page(pageNumber, pageSize);
|
|
|
+ List<DiskAlbumFile> diskAlbumFileList = diskAlbumMapper.findDiskAlbumFileByPage(page, albumId);
|
|
|
+ List<String> sha256sumList = diskAlbumFileList.stream().map(DiskAlbumFile::getSha256sum).collect(Collectors.toList());
|
|
|
+ if (sha256sumList.isEmpty()) {
|
|
|
+ return new DiskAlbumDetail(diskAlbum, PageList.empty());
|
|
|
}
|
|
|
|
|
|
Map<String, Integer> map = new HashMap<>();
|
|
|
for (DiskAlbumFile diskAlbumFile : diskAlbumFileList) {
|
|
|
- map.put(diskAlbumFile.getFileId(), diskAlbumFile.getPos());
|
|
|
+ map.put(diskAlbumFile.getSha256sum(), diskAlbumFile.getPos());
|
|
|
}
|
|
|
|
|
|
- List<DiskFileDetail> diskFileDetailList = diskFileMapper.findByFileIds(fileIds).stream().
|
|
|
- map(diskFile -> {
|
|
|
+ List<DiskFileDetail> diskFileDetailList = diskFileService.findBySha256sumList(sha256sumList).stream()
|
|
|
+ .sorted(Comparator.comparingInt(o -> map.get(o.getSha256sum())))
|
|
|
+ .map(diskFile -> {
|
|
|
String objectId = diskFile.getFileId();
|
|
|
return diskFileService.getDiskFileDetail(channelCode, objectId);
|
|
|
})
|
|
|
.filter(Objects::nonNull)
|
|
|
- .sorted(Comparator.comparingInt(o -> map.get(o.getFileId())))
|
|
|
.collect(Collectors.toList());
|
|
|
- return new DiskAlbumDetail(diskAlbum, diskFileDetailList);
|
|
|
+
|
|
|
+ PageList<DiskFileDetail> pageList = PageList.pageList(pageNumber, pageSize, total, diskFileDetailList);
|
|
|
+ return new DiskAlbumDetail(diskAlbum, pageList);
|
|
|
}
|
|
|
|
|
|
- public PageList<DiskAlbumImage> getAlbumImages(int pageNumber, int pageSize) {
|
|
|
+ /**
|
|
|
+ * 获取不存在于合集中的文件
|
|
|
+ *
|
|
|
+ * @param
|
|
|
+ * @return
|
|
|
+ * @date 2025-09-04 17:42:38
|
|
|
+ */
|
|
|
+ public PageList<DiskFileDetail> getAlbumExcludeFiles(int fileType, int pageNumber) {
|
|
|
long loginUser = UserContext.getUserId();
|
|
|
- List<Long> albumIds = diskAlbumMapper.findByCreateBy(loginUser).stream()
|
|
|
- .map(DiskAlbum::getAlbumId)
|
|
|
- .collect(Collectors.toList());
|
|
|
- Set<String> imageFileIdSet = new HashSet<>();
|
|
|
- if (!albumIds.isEmpty()) {
|
|
|
- imageFileIdSet.addAll(diskAlbumMapper.findBykAlbumIds(albumIds));
|
|
|
- }
|
|
|
-
|
|
|
- DiskQuery.Builder builder = new DiskQuery.Builder()
|
|
|
- .pageNumber(pageNumber)
|
|
|
- .pageSize(pageSize)
|
|
|
- .fileType(ObjectType.Image.getCode())
|
|
|
- .owner(loginUser);
|
|
|
- DiskQuery diskQuery = builder.build();
|
|
|
Page page = new Page(pageNumber, pageSize);
|
|
|
- int total = diskFileMapper.countSha256sumGroupByDiskQuery(diskQuery).size();
|
|
|
-
|
|
|
- List<DiskFile> diskFileList = diskFileMapper.findSha256sumGroupByPage(page, diskQuery).stream()
|
|
|
- .filter(diskFile -> !imageFileIdSet.contains(diskFile.getFileId()))
|
|
|
- .collect(Collectors.toList());
|
|
|
+ List<DiskFile> diskFileList = diskFileMapper.findSha256sumGroupByPage(page, fileType, loginUser);
|
|
|
+ int total = diskFileMapper.countSha256sumGroupByDiskQuery(fileType, loginUser).size();
|
|
|
|
|
|
- List<DiskAlbumImage> list = diskFileList.stream().map(DiskAlbumImage::new).collect(Collectors.toList());
|
|
|
- for (DiskAlbumImage diskAlbumImage : list) {
|
|
|
- String fileId = diskAlbumImage.getFileId();
|
|
|
+ List<DiskFileDetail> list = diskFileList.stream().map(DiskFileDetail::new).collect(Collectors.toList());
|
|
|
+ for (DiskFileDetail diskFileDetail : list) {
|
|
|
+ String fileId = diskFileDetail.getFileId();
|
|
|
try {
|
|
|
String signedUrl = ossService.getSignedUrl(channelCode, fileId);
|
|
|
- diskAlbumImage.setUrl(signedUrl);
|
|
|
+ diskFileDetail.setUrl(signedUrl);
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
}
|
|
|
}
|
|
|
- return PageList.pageList(diskQuery.getPageNumber(), diskQuery.getPageSize(), total, list);
|
|
|
+ return PageList.pageList(pageNumber, pageSize, total, list);
|
|
|
}
|
|
|
}
|