修复业务附件查询携带附件url接口不存在 附件时的错误

This commit is contained in:
chenbowen
2025-09-16 20:40:56 +08:00
parent 9ee1100b29
commit f82a2d76ec
6 changed files with 94 additions and 64 deletions

21
pom.xml
View File

@@ -32,7 +32,7 @@
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
<properties>
<revision>3.0.1</revision>
<revision>3.0.3</revision>
<!-- Maven 相关 -->
<java.version>17</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
@@ -133,6 +133,21 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<id>attach-sources</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<!-- 只对 yaml 文件过滤 -->
@@ -188,7 +203,7 @@
<repository>
<id>ZT</id>
<name>中铜 ZStack 私服</name>
<url>http://172.16.46.63:30708/repository/maven-hosted/</url>
<url>http://172.16.46.63:30708/repository/test/</url>
<releases>
<enabled>false</enabled>
</releases>
@@ -199,7 +214,7 @@
<repository>
<id>ZT</id>
<name>中铜 ZStack 私服</name>
<url>http://172.16.46.63:30708/repository/maven-hosted/</url>
<url>http://172.16.46.63:30708/repository/test/</url>
</repository>
<!-- <snapshotRepository>-->
<!-- <id>ZT</id>-->

View File

@@ -8,7 +8,7 @@
<repository>
<id>ZT</id>
<name>中铜 ZStack 私服</name>
<url>http://172.16.46.63:30708/repository/maven-hosted/</url>
<url>http://172.16.46.63:30708/repository/test/</url>
</repository>
<!-- <snapshotRepository>-->
<!-- <id>ZT</id>-->
@@ -26,7 +26,7 @@
<url>https://github.com/YunaiV/ruoyi-vue-pro</url>
<properties>
<revision>3.0.1</revision>
<revision>3.0.3</revision>
<flatten-maven-plugin.version>1.6.0</flatten-maven-plugin.version>
<!-- 统一依赖管理 -->
<spring.boot.version>3.4.5</spring.boot.version>

View File

@@ -1,35 +1,33 @@
package cn.iocoder.yudao.module.infra.controller.admin.businessfile;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.constraints.*;
import jakarta.validation.*;
import jakarta.servlet.http.*;
import java.util.*;
import java.io.IOException;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
import cn.iocoder.yudao.module.infra.controller.admin.businessfile.vo.*;
import cn.iocoder.yudao.module.infra.controller.admin.businessfile.vo.BusinessFilePageReqVO;
import cn.iocoder.yudao.module.infra.controller.admin.businessfile.vo.BusinessFileRespVO;
import cn.iocoder.yudao.module.infra.controller.admin.businessfile.vo.BusinessFileSaveReqVO;
import cn.iocoder.yudao.module.infra.controller.admin.businessfile.vo.BusinessFileWithUrlRespVO;
import cn.iocoder.yudao.module.infra.dal.dataobject.businessfile.BusinessFileDO;
import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO;
import cn.iocoder.yudao.module.infra.service.businessfile.BusinessFileService;
import cn.iocoder.yudao.module.infra.service.file.FileService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.util.List;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 业务附件关联")
@RestController
@@ -104,40 +102,7 @@ public class BusinessFileController {
@Operation(summary = "获得业务附件关联分页带URL")
@PreAuthorize("@ss.hasPermission('infra:business-file:query')")
public CommonResult<PageResult<BusinessFileWithUrlRespVO>> getBusinessFilePageWithUrl(@Valid BusinessFilePageReqVO pageReqVO) {
PageResult<BusinessFileDO> pageResult = businessFileService.getBusinessFilePage(pageReqVO);
PageResult<BusinessFileWithUrlRespVO> result = BeanUtils.toBean(pageResult, BusinessFileWithUrlRespVO.class);
// 批量获取文件信息并设置URL
List<Long> fileIds = result.getList().stream()
.map(BusinessFileWithUrlRespVO::getFileId)
.filter(Objects::nonNull)
.distinct()
.toList();
// 批量查询文件信息
Map<Long, FileDO> fileMap = new HashMap<>();
for (Long fileId : fileIds) {
FileDO fileDO = fileService.getActiveFileById(fileId);
if (fileDO != null) {
fileMap.put(fileId, fileDO);
}
}
// 设置文件相关信息
for (BusinessFileWithUrlRespVO vo : result.getList()) {
if (vo.getFileId() != null) {
FileDO fileDO = fileMap.get(vo.getFileId());
if (fileDO != null) {
vo.setFilePath(fileDO.getPath());
vo.setFileUrl(fileDO.getUrl());
vo.setIsEncrypted(fileDO.getIsEncrypted());
vo.setFileType(fileDO.getType());
vo.setFileSize(fileDO.getSize());
}
}
}
return success(result);
return success(businessFileService.getBusinessFilePageWithUrl(pageReqVO));
}
@GetMapping("/export-excel")

View File

@@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.iocoder.yudao.framework.common.util.spring.SpringUtils;
import cn.iocoder.yudao.module.infra.framework.file.core.client.AbstractFileClient;
import org.apache.commons.lang3.StringUtils;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
@@ -47,6 +48,10 @@ public class S3FileClient extends AbstractFileClient<S3FileClientConfig> {
} catch (Exception ignored) {}
realExpiration = Duration.ofSeconds(expireSeconds);
}
if (path == null){
return StringUtils.EMPTY;
}
// 使用 S3 官方支持的 responseCacheControl 参数,强制浏览器和代理不缓存
GetObjectRequest.Builder getObjectRequestBuilder = GetObjectRequest.builder()
.bucket(config.getBucket())

View File

@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.infra.service.businessfile;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.infra.controller.admin.businessfile.vo.BusinessFilePageReqVO;
import cn.iocoder.yudao.module.infra.controller.admin.businessfile.vo.BusinessFileSaveReqVO;
import cn.iocoder.yudao.module.infra.controller.admin.businessfile.vo.BusinessFileWithUrlRespVO;
import cn.iocoder.yudao.module.infra.dal.dataobject.businessfile.BusinessFileDO;
import jakarta.validation.Valid;
@@ -60,6 +61,8 @@ public interface BusinessFileService {
*/
PageResult<BusinessFileDO> getBusinessFilePage(BusinessFilePageReqVO pageReqVO);
PageResult<BusinessFileWithUrlRespVO> getBusinessFilePageWithUrl(BusinessFilePageReqVO pageReqVO);
List<Long> batchCreateBusinessFile(List<BusinessFileSaveReqVO> createReqVOList);
/**

View File

@@ -6,14 +6,16 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.infra.controller.admin.businessfile.vo.BusinessFilePageReqVO;
import cn.iocoder.yudao.module.infra.controller.admin.businessfile.vo.BusinessFileSaveReqVO;
import cn.iocoder.yudao.module.infra.controller.admin.businessfile.vo.BusinessFileWithUrlRespVO;
import cn.iocoder.yudao.module.infra.dal.dataobject.businessfile.BusinessFileDO;
import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO;
import cn.iocoder.yudao.module.infra.dal.mysql.businessfile.BusinessFileMapper;
import cn.iocoder.yudao.module.infra.service.file.FileService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.BUSINESS_FILE_NOT_EXISTS;
@@ -30,6 +32,9 @@ public class BusinessFileServiceImpl implements BusinessFileService {
@Resource
private BusinessFileMapper businessFileMapper;
@Resource
private FileService fileService;
@Override
public Long createBusinessFile(BusinessFileSaveReqVO createReqVO) {
// 插入
@@ -87,6 +92,43 @@ public class BusinessFileServiceImpl implements BusinessFileService {
return businessFileMapper.selectPage(pageReqVO);
}
@Override
public PageResult<BusinessFileWithUrlRespVO> getBusinessFilePageWithUrl(BusinessFilePageReqVO pageReqVO) {
PageResult<BusinessFileDO> pageResult = getBusinessFilePage(pageReqVO);
PageResult<BusinessFileWithUrlRespVO> result = BeanUtils.toBean(pageResult, BusinessFileWithUrlRespVO.class);
// 批量获取文件信息并设置URL
List<Long> fileIds = result.getList().stream()
.map(BusinessFileWithUrlRespVO::getFileId)
.filter(Objects::nonNull)
.distinct()
.toList();
// 批量查询文件信息
Map<Long, FileDO> fileMap = new HashMap<>();
for (Long fileId : fileIds) {
FileDO fileDO = fileService.getActiveFileById(fileId);
if (fileDO != null) {
fileMap.put(fileId, fileDO);
}
}
// 设置文件相关信息
for (BusinessFileWithUrlRespVO vo : result.getList()) {
if (vo.getFileId() != null) {
FileDO fileDO = fileMap.get(vo.getFileId());
if (fileDO != null) {
vo.setFilePath(fileDO.getPath());
vo.setFileUrl(fileDO.getUrl());
vo.setIsEncrypted(fileDO.getIsEncrypted());
vo.setFileType(fileDO.getType());
vo.setFileSize(fileDO.getSize());
}
}
}
return result;
}
@Override
public List<Long> batchCreateBusinessFile(List<BusinessFileSaveReqVO> createReqVOList) {
List<BusinessFileDO> businessFileList = BeanUtils.toBean(createReqVOList, BusinessFileDO.class);