| | |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; |
| | | import com.ruoyi.basic.constant.ApplicationType; |
| | | import com.ruoyi.basic.constant.RecordType; |
| | | import com.ruoyi.basic.dto.StorageAttachmentDTO; |
| | | import com.ruoyi.basic.dto.StorageBlobVO; |
| | | import com.ruoyi.basic.enums.ApplicationTypeEnum; |
| | | import com.ruoyi.basic.enums.RecordTypeEnum; |
| | | import com.ruoyi.basic.mapper.StorageAttachmentMapper; |
| | | import com.ruoyi.basic.mapper.StorageBlobMapper; |
| | | import com.ruoyi.basic.pojo.StorageAttachment; |
| | | import com.ruoyi.basic.pojo.StorageBlob; |
| | | import com.ruoyi.common.config.FileProperties; |
| | | import io.jsonwebtoken.Jwts; |
| | | import io.jsonwebtoken.security.Keys; |
| | |
| | | private final FileProperties properties; |
| | | private final StorageAttachmentMapper storageAttachmentMapper; |
| | | private final StringRedisTemplate stringRedisTemplate; |
| | | private final StorageBlobMapper storageBlobMapper; |
| | | |
| | | private static final String TOKEN_USAGE_KEY_PREFIX = "file:token:usage:"; |
| | | private static final DateTimeFormatter YEAR_PATH_FORMATTER = DateTimeFormatter.ofPattern("yyyy"); |
| | |
| | | * @param recordId 关联记录id |
| | | * @param storageBlobVOS 文件信息 |
| | | */ |
| | | public void saveStorageAttachment(ApplicationType application, RecordType recordType, Long recordId, List<StorageBlobVO> storageBlobVOS) { |
| | | public void saveStorageAttachment(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId, List<StorageBlobVO> storageBlobVOS) { |
| | | if (CollectionUtils.isEmpty(storageBlobVOS)) { |
| | | throw new RuntimeException("文件信息不能为空"); |
| | | } |
| | | if (!application.isValid()) { |
| | | if (application == null) { |
| | | throw new RuntimeException("文件用途不能为空"); |
| | | } |
| | | if (!recordType.isValid()) { |
| | | if (recordType == null) { |
| | | throw new RuntimeException("关联记录类型不能为空"); |
| | | } |
| | | if (recordId == null || recordId <= 0) { |
| | |
| | | storageAttachment.setStorageBlobId(storageBlobVO.getId()); |
| | | storageAttachment.setDeleted(0L); |
| | | } |
| | | // todo fileChange |
| | | // storageAttachmentMapper.insert(storageAttachments); |
| | | storageAttachmentMapper.insert(storageAttachments); |
| | | } |
| | | |
| | | /** |
| | |
| | | * @param storageBlobIds 文件id |
| | | */ |
| | | public void deleteStorageBlobs(List<Long> storageBlobIds) { |
| | | // todo fileChange |
| | | // storageBlobMapper.deleteByIds(storageBlobIds); |
| | | storageBlobMapper.deleteByIds(storageBlobIds); |
| | | } |
| | | |
| | | /** |
| | |
| | | * @param storageAttachmentIds 文件id |
| | | */ |
| | | public void deleteStorageBlobsByStorageAttachmentIds(List<Long> storageAttachmentIds) { |
| | | // todo fileChange |
| | | // List<StorageAttachment> storageAttachments = storageAttachmentMapper.selectByIds(storageAttachmentIds); |
| | | // List<Long> storageBlobIds = storageAttachments.stream().map(StorageAttachment::getStorageBlobId).collect(Collectors.toList()); |
| | | // deleteStorageBlobs(storageBlobIds); |
| | | List<StorageAttachment> storageAttachments = storageAttachmentMapper.selectByIds(storageAttachmentIds); |
| | | List<Long> storageBlobIds = storageAttachments.stream().map(StorageAttachment::getStorageBlobId).collect(Collectors.toList()); |
| | | deleteStorageBlobs(storageBlobIds); |
| | | } |
| | | |
| | | /** |
| | |
| | | * @param recordType 关联记录类型 |
| | | * @param recordId 关联记录id |
| | | */ |
| | | public void deleteStorageBlobsByApplicationAndRecordTypeAndRecordId(ApplicationType application, RecordType recordType, Long recordId) { |
| | | if (!application.isValid()) { |
| | | throw new RuntimeException("文件用途不能为空"); |
| | | } |
| | | if (!recordType.isValid()) { |
| | | throw new RuntimeException("关联记录类型不能为空"); |
| | | } |
| | | public void deleteStorageBlobsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId) { |
| | | if (recordId == null || recordId <= 0) { |
| | | throw new RuntimeException("关联记录id不能为空"); |
| | | } |
| | | if (application == null) { |
| | | throw new RuntimeException("文件用途不能为空"); |
| | | } |
| | | if (recordType == null) { |
| | | throw new RuntimeException("关联记录类型不能为空"); |
| | | } |
| | | List<StorageAttachment> storageAttachments = storageAttachmentMapper.selectList(new LambdaQueryWrapper<StorageAttachment>() |
| | | .eq(StorageAttachment::getRecordType, recordType.getType()) |
| | |
| | | */ |
| | | public void deleteStorageAttachmentsByStorageAttachmentIds(List<Long> storageAttachmentIds) { |
| | | deleteStorageBlobsByStorageAttachmentIds(storageAttachmentIds); |
| | | // todo fileChange |
| | | // storageAttachmentMapper.deleteByIds(storageAttachmentIds); |
| | | storageAttachmentMapper.deleteByIds(storageAttachmentIds); |
| | | } |
| | | |
| | | public void deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordId(ApplicationType application, RecordType recordType, Long recordId) { |
| | | if (!application.isValid()) { |
| | | throw new RuntimeException("文件用途不能为空"); |
| | | } |
| | | if (!recordType.isValid()) { |
| | | throw new RuntimeException("关联记录类型不能为空"); |
| | | } |
| | | public void deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId) { |
| | | if (recordId == null || recordId <= 0) { |
| | | throw new RuntimeException("关联记录id不能为空"); |
| | | } |
| | | if (application == null) { |
| | | throw new RuntimeException("文件用途不能为空"); |
| | | } |
| | | if (recordType == null) { |
| | | throw new RuntimeException("关联记录类型不能为空"); |
| | | } |
| | | deleteStorageBlobsByApplicationAndRecordTypeAndRecordId(application, recordType, recordId); |
| | | storageAttachmentMapper.delete(new LambdaQueryWrapper<StorageAttachment>() |
| | |
| | | if (CollectionUtils.isEmpty(storageAttachmentIds)) { |
| | | throw new RuntimeException("文件id不能为空"); |
| | | } |
| | | // todo fileChange |
| | | // return storageAttachmentMapper.selectByIds(storageAttachmentIds); |
| | | return new ArrayList<>(); |
| | | return storageAttachmentMapper.selectByIds(storageAttachmentIds); |
| | | } |
| | | |
| | | /** |
| | |
| | | * @param recordType 关联记录类型 |
| | | * @param recordId 关联记录id |
| | | */ |
| | | public List<StorageAttachment> getStorageAttachmentsByApplicationAndRecordTypeAndRecordId(ApplicationType application, RecordType recordType, Long recordId) { |
| | | if (!application.isValid()) { |
| | | throw new RuntimeException("文件用途不能为空"); |
| | | } |
| | | if (!recordType.isValid()) { |
| | | throw new RuntimeException("关联记录类型不能为空"); |
| | | } |
| | | public List<StorageAttachment> getStorageAttachmentsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId) { |
| | | if (recordId == null || recordId <= 0) { |
| | | throw new RuntimeException("关联记录id不能为空"); |
| | | } if (application == null) { |
| | | throw new RuntimeException("文件用途不能为空"); |
| | | } |
| | | if (recordType == null) { |
| | | throw new RuntimeException("关联记录类型不能为空"); |
| | | } |
| | | return storageAttachmentMapper.selectList(new LambdaQueryWrapper<StorageAttachment>() |
| | | .eq(StorageAttachment::getRecordType, recordType.getType()) |
| | |
| | | return null; |
| | | } |
| | | List<Long> storageBlobIds = storageAttachments.stream().map(StorageAttachment::getStorageBlobId).collect(Collectors.toList()); |
| | | // todo fileChange |
| | | // List<StorageBlob> storageBlobs = storageBlobMapper.selectByIds(storageBlobIds); |
| | | // List<StorageBlobDTO> storageBlobDTOS = new ArrayList<>(); |
| | | // for (StorageBlob storageBlob : storageBlobs) { |
| | | // StorageBlobDTO storageBlobDTO = new StorageBlobDTO(); |
| | | // BeanUtils.copyProperties(storageBlob, storageBlobDTO); |
| | | // storageBlobDTO.setPreviewURL(buildSignedPreviewUrl(storageBlobDTO)); |
| | | // storageBlobDTO.setDownloadURL(buildSignedDownloadUrl(storageBlobDTO)); |
| | | // storageBlobDTOS.add(storageBlobDTO); |
| | | // } |
| | | return new ArrayList<>(); |
| | | List<StorageBlob> storageBlobs = storageBlobMapper.selectByIds(storageBlobIds); |
| | | List<StorageBlobVO> storageBlobDTOS = new ArrayList<>(); |
| | | for (StorageBlob storageBlob : storageBlobs) { |
| | | StorageBlobVO storageBlobVO = new StorageBlobVO(); |
| | | BeanUtils.copyProperties(storageBlob, storageBlobVO); |
| | | storageBlobVO.setPreviewURL(buildSignedPreviewUrl(storageBlobVO)); |
| | | storageBlobVO.setDownloadURL(buildSignedDownloadUrl(storageBlobVO)); |
| | | storageBlobDTOS.add(storageBlobVO); |
| | | } |
| | | return storageBlobDTOS; |
| | | } |
| | | |
| | | /** |
| | |
| | | return null; |
| | | } |
| | | List<Long> storageBlobIds = storageAttachments.stream().map(StorageAttachment::getStorageBlobId).collect(Collectors.toList()); |
| | | // todo fileChange |
| | | // List<StorageBlob> storageBlobs = storageBlobMapper.selectByIds(storageBlobIds); |
| | | // List<StorageBlobDTO> storageBlobDTOS = new ArrayList<>(); |
| | | // for (StorageBlob storageBlob : storageBlobs) { |
| | | // StorageBlobDTO storageBlobDTO = new StorageBlobDTO(); |
| | | // BeanUtils.copyProperties(storageBlob, storageBlobDTO); |
| | | // storageBlobDTO.setPreviewURL(buildSignedUrl(storageBlobDTO, "/preview/", expired)); |
| | | // storageBlobDTO.setDownloadURL(buildSignedUrl(storageBlobDTO, "/download/", expired)); |
| | | // storageBlobDTOS.add(storageBlobDTO); |
| | | // } |
| | | // return storageBlobDTOS; |
| | | return new ArrayList<>(); |
| | | List<StorageBlob> storageBlobs = storageBlobMapper.selectByIds(storageBlobIds); |
| | | List<StorageBlobVO> storageBlobDTOS = new ArrayList<>(); |
| | | for (StorageBlob storageBlob : storageBlobs) { |
| | | StorageBlobVO storageBlobVO = new StorageBlobVO(); |
| | | BeanUtils.copyProperties(storageBlob, storageBlobVO); |
| | | storageBlobVO.setPreviewURL(buildSignedUrl(storageBlobVO, "/preview/", expired)); |
| | | storageBlobVO.setDownloadURL(buildSignedUrl(storageBlobVO, "/download/", expired)); |
| | | storageBlobDTOS.add(storageBlobVO); |
| | | } |
| | | return storageBlobDTOS; |
| | | } |
| | | |
| | | /** |
| | |
| | | * @param recordType 记录类型 |
| | | * @param recordId 记录id |
| | | */ |
| | | public List<StorageAttachmentDTO> getStorageAttachmentDTOsByApplicationAndRecordTypeAndRecordId(ApplicationType application, RecordType recordType, Long recordId) { |
| | | public List<StorageAttachmentDTO> getStorageAttachmentDTOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId) { |
| | | List<StorageAttachment> storageAttachments = getStorageAttachmentsByApplicationAndRecordTypeAndRecordId(application, recordType, recordId); |
| | | if (CollectionUtils.isEmpty(storageAttachments)) { |
| | | return new ArrayList<>(); |
| | |
| | | * @param recordId 记录id |
| | | * @param expired 过期时间 |
| | | */ |
| | | public List<StorageAttachmentDTO> getStorageAttachmentDTOsByApplicationAndRecordTypeAndRecordId(ApplicationType application, RecordType recordType, Long recordId, BigDecimal expired) { |
| | | public List<StorageAttachmentDTO> getStorageAttachmentDTOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId, BigDecimal expired) { |
| | | List<StorageAttachment> storageAttachments = getStorageAttachmentsByApplicationAndRecordTypeAndRecordId(application, recordType, recordId); |
| | | if (CollectionUtils.isEmpty(storageAttachments)) { |
| | | return new ArrayList<>(); |