Commit d788e771 by zhangxingmin

oss-v1版本

parent ad19eed7
package com.yd.oss.api.controller;
import com.yd.common.result.Result;
import com.yd.oss.api.service.ApiMaterialService;
import com.yd.oss.feign.client.ApiMaterialFeignClient;
import com.yd.oss.feign.request.ApiMaterialListRequest;
import com.yd.oss.feign.response.ApiMaterialListResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 材料基础信息
*
* @author zxm
* @since 2025-12-17
*/
@RestController
@RequestMapping("/material")
@Validated
public class ApiMaterialController implements ApiMaterialFeignClient {
@Autowired
private ApiMaterialService apiMaterialService;
/**
* 列表查询-材料基础信息
* @param request
* @return
*/
@Override
public Result<List<ApiMaterialListResponse>> list(ApiMaterialListRequest request) {
return apiMaterialService.list(request);
}
}
......@@ -3,6 +3,7 @@ package com.yd.oss.api.controller;
import com.yd.common.result.Result;
import com.yd.oss.api.service.ApiOssService;
import com.yd.oss.feign.client.ApiOssFeignClient;
import com.yd.oss.feign.request.ApiUploadFileRequest;
import com.yd.oss.feign.response.ApiFileMetadataResponse;
import com.yd.oss.feign.response.ApiUploadResponse;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -36,6 +37,17 @@ public class ApiOssController implements ApiOssFeignClient {
}
/**
* 上传文件 - body入参方式(新,推荐)
* @param file
* @param request
* @return
*/
@Override
public Result<ApiUploadResponse> uploadFileBody(MultipartFile file, ApiUploadFileRequest request) {
return apiOssService.uploadFileBody(file,request);
}
/**
* 下载文件
* @param fileKey 文件唯一标识
* @return
......@@ -96,9 +108,4 @@ public class ApiOssController implements ApiOssFeignClient {
public Result<ApiFileMetadataResponse> getFileMetadata(String fileKey) {
return apiOssService.getFileMetadata(fileKey,"","");
}
@Override
public Result uploadBatchFile() {
return apiOssService.uploadBatchFile();
}
}
package com.yd.oss.api.controller;
import com.yd.common.result.Result;
import com.yd.oss.api.service.ApiOssFileService;
import com.yd.oss.feign.client.ApiOssFileFeignClient;
import com.yd.oss.feign.request.ApiOssFileListRequest;
import com.yd.oss.feign.response.ApiOssFileListResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotBlank;
import java.util.List;
/**
* 文件元数据信息
*
* @author zxm
* @since 2025-08-22
*/
@RestController
@RequestMapping("/ossFile")
@Validated
public class ApiOssFileController implements ApiOssFileFeignClient {
@Autowired
private ApiOssFileService apiOssFileService;
/**
* 列表查询-文件元数据信息
* @param request
* @return
*/
@Override
public Result<List<ApiOssFileListResponse>> list(ApiOssFileListRequest request) {
return apiOssFileService.list(request);
}
/**
* 删除-文件元数据信息
* @param fileBizId
* @return
*/
@Override
public Result del(String fileBizId) {
return apiOssFileService.del(fileBizId);
}
}
package com.yd.oss.api.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yd.common.result.Result;
import com.yd.oss.api.service.ApiRelObjectMaterialService;
import com.yd.oss.feign.client.ApiRelObjectMaterialFeignClient;
import com.yd.oss.feign.request.ApiRelObjectMaterialListAddRequest;
import com.yd.oss.feign.request.ApiRelObjectMaterialPageRequest;
import com.yd.oss.feign.response.ApiRelObjectMaterialPageResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 对象材料关系表信息
*
* @author zxm
* @since 2025-12-17
*/
@RestController
@RequestMapping("/relObjectMaterial")
@Validated
public class ApiRelObjectMaterialController implements ApiRelObjectMaterialFeignClient {
@Autowired
private ApiRelObjectMaterialService apiRelObjectMaterialService;
/**
* 分页列表查询-对象材料关系表信息
* @param request
* @return
*/
@Override
public Result<IPage<ApiRelObjectMaterialPageResponse>> page(ApiRelObjectMaterialPageRequest request) {
return apiRelObjectMaterialService.page(request);
}
/**
* 删除-对象材料关系表信息
* @param relObjectMaterialBizId
* @return
*/
@Override
public Result del(String relObjectMaterialBizId) {
return apiRelObjectMaterialService.del(relObjectMaterialBizId);
}
/**
* 添加-单个对象和材料列表关系信息
* @param request
* @return
*/
@Override
public Result addRelObjectMaterialList(ApiRelObjectMaterialListAddRequest request) {
return apiRelObjectMaterialService.addRelObjectMaterialList(request);
}
}
package com.yd.oss.api.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 文件元数据表 前端控制器
* </p>
*
* @author zxm
* @since 2025-08-22
*/
@RestController
@RequestMapping("/ossFile")
public class OssFileController {
}
package com.yd.oss.api.service;
import com.yd.common.result.Result;
import com.yd.oss.feign.request.ApiMaterialListRequest;
import com.yd.oss.feign.response.ApiMaterialListResponse;
import java.util.List;
public interface ApiMaterialService {
Result<List<ApiMaterialListResponse>> list(ApiMaterialListRequest request);
}
package com.yd.oss.api.service;
import com.yd.common.result.Result;
import com.yd.oss.feign.request.ApiOssFileListRequest;
import com.yd.oss.feign.response.ApiOssFileListResponse;
import java.util.List;
public interface ApiOssFileService {
Result<List<ApiOssFileListResponse>> list(ApiOssFileListRequest request);
Result del(String fileBizId);
}
package com.yd.oss.api.service;
import com.yd.common.result.Result;
import com.yd.oss.feign.request.ApiUploadFileRequest;
import com.yd.oss.feign.response.ApiFileMetadataResponse;
import com.yd.oss.feign.response.ApiUploadResponse;
import org.springframework.web.multipart.MultipartFile;
......@@ -10,6 +11,8 @@ import javax.servlet.http.HttpServletResponse;
public interface ApiOssService {
Result<ApiUploadResponse> uploadFile(MultipartFile file, String bucket, String provider, String uploadUser);
Result<ApiUploadResponse> uploadFileBody(MultipartFile file, ApiUploadFileRequest request);
void downloadFile(String fileKey, String bucket, String provider, HttpServletResponse response);
Result<Boolean> deleteFile(String fileKey, String bucket, String provider, String operator);
......@@ -22,5 +25,4 @@ public interface ApiOssService {
Result<ApiFileMetadataResponse> getFileMetadata(String fileKey, String bucket, String provider);
Result uploadBatchFile();
}
package com.yd.oss.api.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yd.common.result.Result;
import com.yd.oss.feign.request.ApiRelObjectMaterialListAddRequest;
import com.yd.oss.feign.request.ApiRelObjectMaterialPageRequest;
import com.yd.oss.feign.response.ApiRelObjectMaterialPageResponse;
public interface ApiRelObjectMaterialService {
Result<IPage<ApiRelObjectMaterialPageResponse>> page(ApiRelObjectMaterialPageRequest request);
Result del(String relObjectMaterialBizId);
Result addRelObjectMaterialList(ApiRelObjectMaterialListAddRequest request);
}
package com.yd.oss.api.service.impl;
import com.yd.common.result.Result;
import com.yd.oss.api.service.ApiMaterialService;
import com.yd.oss.feign.request.ApiMaterialListRequest;
import com.yd.oss.feign.response.ApiMaterialListResponse;
import com.yd.oss.service.dto.MaterialDto;
import com.yd.oss.service.model.Material;
import com.yd.oss.service.service.IMaterialService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@Service
public class ApiMaterialServiceImpl implements ApiMaterialService {
@Autowired
private IMaterialService iMaterialService;
/**
* 列表查询-材料基础信息
* @param request
* @return
*/
@Override
public Result<List<ApiMaterialListResponse>> list(ApiMaterialListRequest request) {
List<Material> materialList = iMaterialService.queryList(MaterialDto.builder().objectType(request.getObjectType()).build());
if (!CollectionUtils.isEmpty(materialList)) {
List<ApiMaterialListResponse> responses = materialList.stream().map(dto -> {
ApiMaterialListResponse response = new ApiMaterialListResponse();
BeanUtils.copyProperties(dto,response);
return response;
}).collect(Collectors.toList());
return Result.success(responses);
}
return Result.success();
}
}
package com.yd.oss.api.service.impl;
import com.yd.common.enums.ResultCode;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.oss.api.service.ApiOssFileService;
import com.yd.oss.feign.request.ApiOssFileListRequest;
import com.yd.oss.feign.response.ApiOssFileListResponse;
import com.yd.oss.service.dto.OssFileDto;
import com.yd.oss.service.model.OssFile;
import com.yd.oss.service.model.RelObjectMaterial;
import com.yd.oss.service.service.IOssFileService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Slf4j
@Service
public class ApiOssFileServiceImpl implements ApiOssFileService {
@Autowired
private IOssFileService iOssFileService;
/**
* 列表查询-文件元数据信息
* @param request
* @return
*/
@Override
public Result<List<ApiOssFileListResponse>> list(ApiOssFileListRequest request) {
List<OssFile> list = iOssFileService.queryList(OssFileDto.builder().objectBizId(request.getObjectBizId()).build());
if (!CollectionUtils.isEmpty(list)) {
List<ApiOssFileListResponse> responses = list.stream().map(dto -> {
ApiOssFileListResponse response = new ApiOssFileListResponse();
BeanUtils.copyProperties(dto,response);
return response;
}).collect(Collectors.toList());
return Result.success(responses);
}
return Result.success();
}
/**
* 删除-文件元数据信息
* @param fileBizId
* @return
*/
@Override
public Result del(String fileBizId) {
Result<OssFile> result = checkOssFileIsExist(fileBizId);
OssFile ossFile = result.getData();
iOssFileService.removeById(ossFile.getId());
return Result.success();
}
/**
* 校验文件元数据信息是否存在
* @param fileBizId
* @return
*/
public Result<OssFile> checkOssFileIsExist(String fileBizId) {
OssFile ossFile = iOssFileService.queryOne(fileBizId);
if (Objects.isNull(ossFile)) {
//数据不存在
throw new BusinessException(ResultCode.NULL_ERROR.getCode(),ResultCode.NULL_ERROR.getMessage());
}
return Result.success(ossFile);
}
}
......@@ -3,13 +3,14 @@ package com.yd.oss.api.service.impl;
import com.alibaba.cloud.commons.lang.StringUtils;
import com.yd.common.result.Result;
import com.yd.oss.api.service.ApiOssService;
import com.yd.oss.feign.request.ApiUploadFileRequest;
import com.yd.oss.feign.response.ApiFileMetadataResponse;
import com.yd.oss.feign.response.ApiUploadResponse;
import com.yd.oss.service.dto.FileMetadata;
import com.yd.oss.service.dto.OssUploadFileDto;
import com.yd.oss.service.dto.OssUploadFileReqDto;
import com.yd.oss.service.dto.OssUploadFileResDto;
import com.yd.oss.service.dto.UploadResult;
import com.yd.oss.service.service.OssService;
import com.yd.oss.service.service.impl.FileUploadService;
import com.yd.oss.service.utils.FileUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
......@@ -21,6 +22,7 @@ import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.time.Duration;
import java.util.Objects;
@Slf4j
@Service
......@@ -29,9 +31,6 @@ public class ApiOssServiceImpl implements ApiOssService {
@Autowired
private OssService ossService;
@Autowired
private FileUploadService fileUploadService;
/**
* 上传文件
* @param file 上传的文件
......@@ -50,7 +49,7 @@ public class ApiOssServiceImpl implements ApiOssService {
}
// 上传文件
OssUploadFileDto ossUploadFileDto = ossService.uploadFile(file.getInputStream(), file.getOriginalFilename(),
OssUploadFileResDto ossUploadFileDto = ossService.uploadFile(file.getInputStream(), file.getOriginalFilename(),
bucket, uploadUser, FileUtil.getFileType(file.getOriginalFilename()));
// 获取上传结果(包含文件信息和访问URL)
......@@ -67,6 +66,25 @@ public class ApiOssServiceImpl implements ApiOssService {
}
/**
* 上传文件 - body入参方式(新,推荐)
* @param file
* @param request
* @return
*/
@Override
public Result<ApiUploadResponse> uploadFileBody(MultipartFile file, ApiUploadFileRequest request) {
ApiUploadResponse response = null;
OssUploadFileReqDto reqDto = new OssUploadFileReqDto();
BeanUtils.copyProperties(request,reqDto);
OssUploadFileResDto fileResDto = ossService.uploadFileBody(file,reqDto);
if (!Objects.isNull(fileResDto)) {
response = new ApiUploadResponse();
BeanUtils.copyProperties(fileResDto,response);
}
return Result.success(response);
}
/**
* 下载文件
* @param fileKey 文件唯一标识
* @param bucket oss桶(不传值使用默认的oss的桶)
......@@ -218,9 +236,4 @@ public class ApiOssServiceImpl implements ApiOssService {
}
}
@Override
public Result uploadBatchFile() {
fileUploadService.batchProcessUrls();
return Result.success();
}
}
package com.yd.oss.api.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.common.enums.CommonEnum;
import com.yd.common.enums.ResultCode;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.oss.api.service.ApiRelObjectMaterialService;
import com.yd.oss.feign.request.ApiRelObjectMaterialListAddRequest;
import com.yd.oss.feign.request.ApiRelObjectMaterialPageRequest;
import com.yd.oss.feign.response.ApiRelObjectMaterialPageResponse;
import com.yd.oss.service.model.RelObjectMaterial;
import com.yd.oss.service.service.IRelObjectMaterialService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Service
@Slf4j
public class ApiRelObjectMaterialServiceImpl implements ApiRelObjectMaterialService {
@Autowired
private IRelObjectMaterialService iRelObjectMaterialService;
/**
* 分页列表查询-对象材料关系表信息
* @param request
* @return
*/
@Override
public Result<IPage<ApiRelObjectMaterialPageResponse>> page(ApiRelObjectMaterialPageRequest request) {
Page<ApiRelObjectMaterialPageResponse> page = new Page<>(request.getPageNo(), request.getPageSize());
IPage<ApiRelObjectMaterialPageResponse> iPage = iRelObjectMaterialService.page(page, request);
return Result.success(iPage);
}
/**
* 删除-对象材料关系表信息
* @param relObjectMaterialBizId
* @return
*/
@Override
public Result del(String relObjectMaterialBizId) {
//校验对象材料关系表信息是否存在
Result<RelObjectMaterial> result = checkRelObjectMaterialIsExist(relObjectMaterialBizId);
RelObjectMaterial relObjectMaterial = result.getData();
iRelObjectMaterialService.removeById(relObjectMaterial.getId());
return Result.success();
}
/**
* 添加-单个对象和材料列表关系信息
* @param request
* @return
*/
@Override
public Result addRelObjectMaterialList(ApiRelObjectMaterialListAddRequest request) {
//先删后新增
iRelObjectMaterialService.delByObjectBizId(request.getObjectBizId());
if (!CollectionUtils.isEmpty(request.getMaterialBizIdList())) {
List<RelObjectMaterial> saveList = request.getMaterialBizIdList().stream().map(materialBizId -> {
RelObjectMaterial relObjectMaterial = new RelObjectMaterial();
BeanUtils.copyProperties(request,relObjectMaterial);
relObjectMaterial.setMaterialBizId(materialBizId);
relObjectMaterial.setRelObjectMaterialBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_REL_OBJECT_MATERIAL.getCode()));
return relObjectMaterial;
}).collect(Collectors.toList());
iRelObjectMaterialService.saveOrUpdateBatch(saveList);
}
return Result.success();
}
/**
* 校验对象材料关系表信息是否存在
* @param relObjectMaterialBizId
* @return
*/
public Result<RelObjectMaterial> checkRelObjectMaterialIsExist(String relObjectMaterialBizId) {
RelObjectMaterial relObjectMaterial = iRelObjectMaterialService.queryOne(relObjectMaterialBizId);
if (Objects.isNull(relObjectMaterial)) {
//数据不存在
throw new BusinessException(ResultCode.NULL_ERROR.getCode(),ResultCode.NULL_ERROR.getMessage());
}
return Result.success(relObjectMaterial);
}
}
......@@ -126,6 +126,7 @@
<orderEntry type="library" name="Maven: com.ibm.icu:icu4j:73.2" level="project" />
<orderEntry type="library" name="Maven: com.yd:yd-csf-feign:1.0-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: com.yd:yd-question-feign:1.0-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: com.yd:yd-base-feign:1.0-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: com.yd:yd-auth-core:1.0-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: com.github.xiaoymin:knife4j-openapi3-spring-boot-starter:4.3.0" level="project" />
<orderEntry type="library" name="Maven: com.github.xiaoymin:knife4j-core:4.3.0" level="project" />
......
package com.yd.oss.feign.client;
import com.yd.common.result.Result;
import com.yd.oss.feign.fallback.ApiMaterialFeignFallbackFactory;
import com.yd.oss.feign.request.ApiMaterialListRequest;
import com.yd.oss.feign.response.ApiMaterialListResponse;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
/**
* 材料基础信息Feign客户端
*/
@FeignClient(name = "yd-oss-api",path = "/oss/api/material",fallbackFactory = ApiMaterialFeignFallbackFactory.class)
public interface ApiMaterialFeignClient {
/**
* 列表查询-材料基础信息
* @param request
* @return
*/
@PostMapping("/list")
Result<List<ApiMaterialListResponse>> list(@RequestBody ApiMaterialListRequest request);
}
......@@ -2,13 +2,12 @@ package com.yd.oss.feign.client;
import com.yd.common.result.Result;
import com.yd.oss.feign.fallback.ApiOssFeignFallbackFactory;
import com.yd.oss.feign.request.ApiUploadFileRequest;
import com.yd.oss.feign.response.ApiFileMetadataResponse;
import com.yd.oss.feign.response.ApiUploadResponse;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
/**
......@@ -26,6 +25,15 @@ public interface ApiOssFeignClient {
Result<ApiUploadResponse> uploadFile(@RequestParam("file") MultipartFile file);
/**
* 上传文件 - body入参方式(新,推荐)
* @param file
* @param request
* @return
*/
@PostMapping(value = "/upload/body", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
Result<ApiUploadResponse> uploadFileBody(@RequestPart("file") MultipartFile file, ApiUploadFileRequest request);
/**
* 下载文件
* @param fileKey 文件唯一标识
* @return
......@@ -75,10 +83,4 @@ public interface ApiOssFeignClient {
@GetMapping("/metadata")
Result<ApiFileMetadataResponse> getFileMetadata(@RequestParam("fileKey") String fileKey);
/**
* 批量上传文件
* @return
*/
@GetMapping("/upload/batch/file")
Result uploadBatchFile();
}
package com.yd.oss.feign.client;
import com.yd.common.result.Result;
import com.yd.oss.feign.fallback.ApiOssFileFeignFallbackFactory;
import com.yd.oss.feign.request.ApiOssFileListRequest;
import com.yd.oss.feign.response.ApiOssFileListResponse;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import javax.validation.constraints.NotBlank;
import java.util.List;
/**
* 文件元数据信息Feign客户端
*/
@FeignClient(name = "yd-oss-api",path = "/oss/api/ossFile",fallbackFactory = ApiOssFileFeignFallbackFactory.class)
public interface ApiOssFileFeignClient {
/**
* 列表查询-文件元数据信息
* @param request
* @return
*/
@PostMapping("/list")
Result<List<ApiOssFileListResponse>> list(@Validated @RequestBody ApiOssFileListRequest request);
/**
* 删除-文件元数据信息
* @param fileBizId
* @return
*/
@DeleteMapping("/del")
Result del(@NotBlank(message = "文件元数据表唯一业务ID不能为空") @RequestParam(value = "fileBizId") String fileBizId);
}
package com.yd.oss.feign.client;
import com.yd.common.result.Result;
import com.yd.oss.feign.fallback.ApiRelObjectMaterialFeignFallbackFactory;
import com.yd.oss.feign.request.ApiRelObjectMaterialListAddRequest;
import com.yd.oss.feign.request.ApiRelObjectMaterialPageRequest;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import javax.validation.constraints.NotBlank;
/**
* 对象材料关系表信息Feign客户端
*/
@FeignClient(name = "yd-oss-api",path = "/oss/api/relObjectMaterial",fallbackFactory = ApiRelObjectMaterialFeignFallbackFactory.class)
public interface ApiRelObjectMaterialFeignClient {
/**
* 分页列表查询-对象材料关系表信息
* @param request
* @return
*/
@PostMapping("/page")
Result page(@RequestBody ApiRelObjectMaterialPageRequest request);
/**
* 删除-对象材料关系表信息
* @param relObjectMaterialBizId
* @return
*/
@DeleteMapping("/del")
Result del(@NotBlank(message = "对象材料关系表唯一业务ID不能为空") @RequestParam(value = "relObjectMaterialBizId") String relObjectMaterialBizId);
/**
* 添加-单个对象和材料列表关系信息
* @param request
* @return
*/
@PostMapping("/add/relObjectMaterialList")
Result addRelObjectMaterialList(@Validated @RequestBody ApiRelObjectMaterialListAddRequest request);
}
package com.yd.oss.feign.fallback;
import com.yd.common.result.Result;
import com.yd.oss.feign.client.ApiMaterialFeignClient;
import com.yd.oss.feign.request.ApiMaterialListRequest;
import com.yd.oss.feign.response.ApiMaterialListResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 材料基础信息Feign降级处理
*/
@Slf4j
@Component
public class ApiMaterialFeignFallbackFactory implements FallbackFactory<ApiMaterialFeignClient> {
@Override
public ApiMaterialFeignClient create(Throwable cause) {
return new ApiMaterialFeignClient() {
@Override
public Result<List<ApiMaterialListResponse>> list(ApiMaterialListRequest request) {
return null;
}
};
}
}
......@@ -2,6 +2,7 @@ package com.yd.oss.feign.fallback;
import com.yd.common.result.Result;
import com.yd.oss.feign.client.ApiOssFeignClient;
import com.yd.oss.feign.request.ApiUploadFileRequest;
import com.yd.oss.feign.response.ApiFileMetadataResponse;
import com.yd.oss.feign.response.ApiUploadResponse;
import lombok.extern.slf4j.Slf4j;
......@@ -24,6 +25,11 @@ public class ApiOssFeignFallbackFactory implements FallbackFactory<ApiOssFeignCl
}
@Override
public Result<ApiUploadResponse> uploadFileBody(MultipartFile file, ApiUploadFileRequest request) {
return null;
}
@Override
public Result downloadFile(String fileKey) {
return null;
}
......@@ -52,11 +58,6 @@ public class ApiOssFeignFallbackFactory implements FallbackFactory<ApiOssFeignCl
public Result<ApiFileMetadataResponse> getFileMetadata(String fileKey) {
return null;
}
@Override
public Result uploadBatchFile() {
return null;
}
};
}
}
package com.yd.oss.feign.fallback;
import com.yd.common.result.Result;
import com.yd.oss.feign.client.ApiOssFileFeignClient;
import com.yd.oss.feign.request.ApiOssFileListRequest;
import com.yd.oss.feign.response.ApiOssFileListResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 文件元数据信息Feign降级处理
*/
@Slf4j
@Component
public class ApiOssFileFeignFallbackFactory implements FallbackFactory<ApiOssFileFeignClient> {
@Override
public ApiOssFileFeignClient create(Throwable cause) {
return new ApiOssFileFeignClient() {
@Override
public Result<List<ApiOssFileListResponse>> list(ApiOssFileListRequest request) {
return null;
}
@Override
public Result del(String fileBizId) {
return null;
}
};
}
}
package com.yd.oss.feign.fallback;
import com.yd.common.result.Result;
import com.yd.oss.feign.client.ApiRelObjectMaterialFeignClient;
import com.yd.oss.feign.request.ApiRelObjectMaterialListAddRequest;
import com.yd.oss.feign.request.ApiRelObjectMaterialPageRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
/**
* 对象材料关系表信息Feign降级处理
*/
@Slf4j
@Component
public class ApiRelObjectMaterialFeignFallbackFactory implements FallbackFactory<ApiRelObjectMaterialFeignClient> {
@Override
public ApiRelObjectMaterialFeignClient create(Throwable cause) {
return new ApiRelObjectMaterialFeignClient() {
@Override
public Result page(ApiRelObjectMaterialPageRequest request) {
return null;
}
@Override
public Result del(String relObjectMaterialBizId) {
return null;
}
@Override
public Result addRelObjectMaterialList(ApiRelObjectMaterialListAddRequest request) {
return null;
}
};
}
}
package com.yd.oss.feign.request;
import lombok.Data;
@Data
public class ApiMaterialListRequest {
/**
* 对象类型(字典)
*/
private String objectType;
}
package com.yd.oss.feign.request;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class ApiOssFileListRequest {
/**
* 对象业务ID
*/
@NotBlank(message = "对象业务ID不能为空")
private String objectBizId;
}
package com.yd.oss.feign.request;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import java.util.List;
@Data
public class ApiRelObjectMaterialListAddRequest {
/**
* 对象类型
*/
private String objectType;
/**
* 对象所属表名(预约表、新单跟进表等)
*/
private String objectTableName;
/**
* 对象名
*/
private String objectName;
/**
* 对象业务ID
*/
@NotBlank(message = "对象业务ID不能为空")
private String objectBizId;
/**
* 材料信息表唯一业务ID列表
*/
private List<String> materialBizIdList;
}
package com.yd.oss.feign.request;
import com.yd.common.dto.PageDto;
import lombok.Data;
@Data
public class ApiRelObjectMaterialPageRequest extends PageDto {
/**
* 对象类型
*/
private String objectType;
/**
* 对象所属表名(预约表、新单跟进表等)
*/
private String objectTableName;
/**
* 对象名
*/
private String objectName;
/**
* 对象业务ID
*/
private String objectBizId;
}
package com.yd.oss.feign.request;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class ApiUploadFileRequest {
/**
* 对象类型
*/
private String objectType;
/**
* 对象所属表名(预约表、新单跟进表等)
*/
private String objectTableName;
/**
* 对象名
*/
private String objectName;
/**
* 对象业务ID
*/
@NotBlank(message = "对象业务ID不能为空")
private String objectBizId;
}
package com.yd.oss.feign.response;
import lombok.Data;
@Data
public class ApiMaterialListResponse {
/**
* 材料信息表主键ID
*/
private Long id;
/**
* 材料信息表唯一业务ID
*/
private String materialBizId;
/**
* 对象类型(字典)
*/
private String objectType;
/**
* 资料人(字典)
*/
private String dataPerson;
/**
* 资料类型(字典)
*/
private String dataType;
/**
* 注意事项
*/
private String precautions;
/**
* 状态:0-禁用,1-启用
*/
private Integer status;
}
package com.yd.oss.feign.response;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class ApiOssFileListResponse {
/**
* 文件元数据表主键ID
*/
private Long id;
/**
* 对象类型
*/
private String objectType;
/**
* 对象所属表名(预约表、新单跟进表等)
*/
private String objectTableName;
/**
* 对象名
*/
private String objectName;
/**
* 对象业务ID
*/
private String objectBizId;
/**
* 文件元数据表唯一业务ID
*/
private String fileBizId;
/**
* 文件唯一标识
*/
private String fileKey;
/**
* 原始文件名
*/
private String originalName;
/**
* 文件大小(字节)
*/
private Long fileSize;
/**
* 文件类型
*/
private String fileType;
/**
* 创建时间
*/
private LocalDateTime createTime;
}
package com.yd.oss.feign.response;
import lombok.Data;
@Data
public class ApiRelObjectMaterialPageResponse {
/**
* 对象材料关系表主键ID
*/
private Long id;
/**
* 对象材料关系表唯一业务ID
*/
private String relObjectMaterialBizId;
/**
* 材料信息表唯一业务ID
*/
private String materialBizId;
/**
* 状态: YSC-已上传 WSC-未上传 DSC-待上传
*/
private String status;
/**
* 资料人(字典)
*/
private String dataPerson;
/**
* 资料类型(字典)
*/
private String dataType;
/**
* 注意事项
*/
private String precautions;
}
......@@ -109,5 +109,6 @@
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.13.2" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.13.2" level="project" />
<orderEntry type="library" name="Maven: com.yd:yd-user-feign:1.0-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: com.yd:yd-base-feign:1.0-SNAPSHOT" level="project" />
</component>
</module>
\ No newline at end of file
package com.yd.oss.service.dao;
import com.yd.oss.service.model.Material;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yd.oss.service.model.ProductFile;
/**
* <p>
* 产品文件关系表 Mapper 接口
* 材料基础信息 Mapper 接口
* </p>
*
* @author zxm
* @since 2025-10-17
* @since 2025-12-17
*/
public interface ProductFileMapper extends BaseMapper<ProductFile> {
public interface MaterialMapper extends BaseMapper<Material> {
}
package com.yd.oss.service.dao;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.oss.feign.request.ApiRelObjectMaterialPageRequest;
import com.yd.oss.feign.response.ApiRelObjectMaterialPageResponse;
import com.yd.oss.service.model.RelObjectMaterial;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
/**
* <p>
* 对象材料关系表 Mapper 接口
* </p>
*
* @author zxm
* @since 2025-12-17
*/
public interface RelObjectMaterialMapper extends BaseMapper<RelObjectMaterial> {
IPage<ApiRelObjectMaterialPageResponse> page(@Param("page") Page<ApiRelObjectMaterialPageResponse> page,
@Param("request") ApiRelObjectMaterialPageRequest request);
}
package com.yd.oss.service.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MaterialDto {
/**
* 对象类型(字典)
*/
private String objectType;
}
package com.yd.oss.service.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OssFileDto {
/**
* 对象业务ID
*/
private String objectBizId;
}
package com.yd.oss.service.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 提供OSS上传文件请求的DTO
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OssUploadFileReqDto {
/**
* 对象类型
*/
private String objectType;
/**
* 对象所属表名(预约表、新单跟进表等)
*/
private String objectTableName;
/**
* 对象名
*/
private String objectName;
/**
* 对象业务ID
*/
private String objectBizId;
/**
* 上传用户业务id
*/
private String uploadUser;
}
......@@ -2,11 +2,13 @@ package com.yd.oss.service.dto;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 提供OSS上传文件返回的DTO
*/
@Data
public class OssUploadFileDto {
public class OssUploadFileResDto {
/**
* 文件元数据表业务ID唯一标识
......@@ -28,4 +30,23 @@ public class OssUploadFileDto {
*/
private String url;
/**
* 访问URL(带过期时间签名URL)
*/
private String accessUrl;
/**
* 文件大小
*/
private Long fileSize;
/**
* 文件类型
*/
private String fileType;
/**
* 上传时间
*/
private LocalDateTime uploadTime;
}
......@@ -4,62 +4,64 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
/**
* <p>
* 产品文件关系表
* 材料基础信息
* </p>
*
* @author zxm
* @since 2025-10-17
* @since 2025-12-17
*/
@Getter
@Setter
@TableName("product_file")
public class ProductFile implements Serializable {
@TableName("material")
public class Material implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 未知ID
* 材料信息表唯一业务ID
*/
@TableField("material_biz_id")
private String materialBizId;
/**
* 对象类型(字典)
*/
@TableField("biz_id")
private String bizId;
@TableField("object_type")
private String objectType;
/**
* 产品业务ID
* 资料人(字典)
*/
@TableField("product_biz_id")
private String productBizId;
@TableField("data_person")
private String dataPerson;
/**
* 文件名称
* 资料类型(字典)
*/
@TableField("file_name")
private String fileName;
@TableField("data_type")
private String dataType;
/**
* 原文件URL
* 注意事项
*/
@TableField("old_file_url")
private String oldFileUrl;
@TableField("precautions")
private String precautions;
/**
* 新文件URL
* 状态:0-禁用,1-启用
*/
@TableField("new_file_url")
private String newFileUrl;
@TableField("status")
private Integer status;
/**
* 通用备注
......@@ -71,7 +73,7 @@ public class ProductFile implements Serializable {
* 删除标识: 0-正常, 1-删除
*/
@TableField("is_deleted")
private Boolean isDeleted;
private Integer isDeleted;
/**
* 创建人ID
......
......@@ -28,7 +28,31 @@ public class OssFile implements Serializable {
private Long id;
/**
* 业务ID唯一标识
* 对象类型
*/
@TableField("object_type")
private String objectType;
/**
* 对象所属表名(预约表、新单跟进表等)
*/
@TableField("object_table_name")
private String objectTableName;
/**
* 对象名
*/
@TableField("object_name")
private String objectName;
/**
* 对象业务ID
*/
@TableField("object_biz_id")
private String objectBizId;
/**
* 文件元数据表唯一业务ID
*/
@TableField("file_biz_id")
private String fileBizId;
......
package com.yd.oss.service.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
/**
* <p>
* 对象材料关系表
* </p>
*
* @author zxm
* @since 2025-12-17
*/
@Getter
@Setter
@TableName("rel_object_material")
public class RelObjectMaterial implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 对象材料关系表唯一业务ID
*/
@TableField("rel_object_material_biz_id")
private String relObjectMaterialBizId;
/**
* 对象类型
*/
@TableField("object_type")
private String objectType;
/**
* 对象所属表名(预约表、新单跟进表等)
*/
@TableField("object_table_name")
private String objectTableName;
/**
* 对象名
*/
@TableField("object_name")
private String objectName;
/**
* 对象业务ID
*/
@TableField("object_biz_id")
private String objectBizId;
/**
* 材料信息表唯一业务ID
*/
@TableField("material_biz_id")
private String materialBizId;
/**
* 状态: YSC-已上传 WSC-未上传 DSC-待上传
*/
@TableField("status")
private String status;
/**
* 通用备注
*/
@TableField("remark")
private String remark;
/**
* 删除标识: 0-正常, 1-删除
*/
@TableField("is_deleted")
private Integer isDeleted;
/**
* 创建人ID
*/
@TableField("creator_id")
private String creatorId;
/**
* 更新人ID
*/
@TableField("updater_id")
private String updaterId;
/**
* 创建时间
*/
@TableField("create_time")
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField("update_time")
private LocalDateTime updateTime;
}
package com.yd.oss.service.service;
import com.yd.oss.service.dto.MaterialDto;
import com.yd.oss.service.model.Material;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* <p>
* 材料基础信息 服务类
* </p>
*
* @author zxm
* @since 2025-12-17
*/
public interface IMaterialService extends IService<Material> {
List<Material> queryList(MaterialDto dto);
}
package com.yd.oss.service.service;
import com.yd.oss.service.dto.OssFileDto;
import com.yd.oss.service.model.OssFile;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yd.oss.service.model.OssOperationLog;
......@@ -31,4 +32,8 @@ public interface IOssFileService extends IService<OssFile> {
List<OssFile> getProviderFiles(Long providerId);
List<OssOperationLog> getOperationLogsByFileId(Long fileId);
List<OssFile> queryList(OssFileDto dto);
OssFile queryOne(String fileBizId);
}
package com.yd.oss.service.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.oss.feign.request.ApiRelObjectMaterialPageRequest;
import com.yd.oss.feign.response.ApiRelObjectMaterialPageResponse;
import com.yd.oss.service.model.RelObjectMaterial;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* <p>
* 对象材料关系表 服务类
* </p>
*
* @author zxm
* @since 2025-12-17
*/
public interface IRelObjectMaterialService extends IService<RelObjectMaterial> {
IPage<ApiRelObjectMaterialPageResponse> page(Page<ApiRelObjectMaterialPageResponse> page,
ApiRelObjectMaterialPageRequest request);
RelObjectMaterial queryOne(String relObjectMaterialBizId);
Boolean delByObjectBizId(String objectBizId);
}
package com.yd.oss.service.service;
import com.yd.oss.feign.request.ApiUploadFileRequest;
import com.yd.oss.service.dto.FileMetadata;
import com.yd.oss.service.dto.OssUploadFileDto;
import com.yd.oss.service.dto.OssUploadFileReqDto;
import com.yd.oss.service.dto.OssUploadFileResDto;
import com.yd.oss.service.dto.UploadResult;
import com.yd.oss.service.model.OssProvider;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.time.Duration;
......@@ -13,7 +16,9 @@ import java.time.Duration;
public interface OssService {
// 上传文件
OssUploadFileDto uploadFile(InputStream inputStream, String fileName, String bucketName, String uploadUser,String type);
OssUploadFileResDto uploadFile(InputStream inputStream, String fileName, String bucketName, String uploadUser, String type);
OssUploadFileResDto uploadFileBody(MultipartFile file, OssUploadFileReqDto reqDto);
// 上传文件(使用默认存储桶)
String uploadFile(InputStream inputStream, String fileName, String uploadUser);
......
......@@ -7,10 +7,13 @@ import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectRequest;
import com.yd.common.enums.CommonEnum;
import com.yd.common.exception.BusinessException;
import com.yd.common.utils.IpUtil;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.oss.feign.request.ApiUploadFileRequest;
import com.yd.oss.service.dto.FileMetadata;
import com.yd.oss.service.dto.OssUploadFileDto;
import com.yd.oss.service.dto.OssUploadFileReqDto;
import com.yd.oss.service.dto.OssUploadFileResDto;
import com.yd.oss.service.dto.UploadResult;
import com.yd.oss.service.model.OssFile;
import com.yd.oss.service.model.OssOperationLog;
......@@ -24,14 +27,11 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.net.URL;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.UUID;
......@@ -68,9 +68,9 @@ public class AliYunOssServiceImpl implements OssService {
* @return
*/
@Override
public OssUploadFileDto uploadFile(InputStream inputStream, String fileName,
String bucketName, String uploadUser,String type) {
OssUploadFileDto ossUploadFileDto = new OssUploadFileDto();
public OssUploadFileResDto uploadFile(InputStream inputStream, String fileName,
String bucketName, String uploadUser, String type) {
OssUploadFileResDto ossUploadFileDto = new OssUploadFileResDto();
long startTime = System.currentTimeMillis(); // 记录开始时间
String operationResult = "success"; // 操作结果
String errorMessage = null; // 错误信息
......@@ -166,6 +166,138 @@ public class AliYunOssServiceImpl implements OssService {
}
/**
* 上传文件 - body入参方式(新,推荐)
* @param file
* @param reqDto
* @return
*/
@Override
public OssUploadFileResDto uploadFileBody(MultipartFile file, OssUploadFileReqDto reqDto) {
OssUploadFileResDto ossUploadFileDto = new OssUploadFileResDto();
// 记录开始时间
long startTime = System.currentTimeMillis();
// 操作结果
String operationResult = "success";
// 错误信息
String errorMessage = null;
// 文件记录
OssFile ossFile = null;
//文件输入流
InputStream inputStream = null;
//原始文件名
String fileName = file.getOriginalFilename();
//文件扩展名
String type = FileUtil.getFileType(file.getOriginalFilename());
try {
inputStream = file.getInputStream();
} catch (IOException e) {
e.printStackTrace();
throw new BusinessException("文件输入流解析异常:{}");
}
try {
// 读取输入流到字节数组
byte[] fileData = FileUtil.readInputStreamToBytes(inputStream);
long fileSize = fileData.length;
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(fileData);
// 生成文件key
String fileKey = FileUtil.generateFileKey(fileName,type);
//默认阿里云的桶名
String actualBucket = defaultBucket;
//获取文件扩展名
String fileType = FileUtil.getFileType(fileName);
// 创建上传请求
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(fileSize);
metadata.setContentType(FileUtil.getContentType(fileType));
// 设置公共读权限(如果需要)
// metadata.setObjectAcl(CannedAccessControlList.PublicRead);
PutObjectRequest putObjectRequest = new PutObjectRequest(
actualBucket, fileKey, byteArrayInputStream, metadata);
// 上传文件
ossClient.putObject(putObjectRequest);
// 创建文件记录
ossFile = new OssFile();
ossFile.setFileBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_OSS_FILE.getCode()));
ossFile.setFileKey(fileKey);
ossFile.setOriginalName(fileName);
ossFile.setFileSize(fileSize);
ossFile.setFileType(fileType);
ossFile.setProviderBizId(currentProvider.getProviderBizId());
ossFile.setBucketName(actualBucket);
ossFile.setUploadUser(reqDto.getUploadUser());
//存储对象信息
ossFile.setObjectBizId(reqDto.getObjectBizId());
ossFile.setObjectName(reqDto.getObjectName());
ossFile.setObjectTableName(reqDto.getObjectTableName());
ossFile.setObjectType(reqDto.getObjectType());
// 保存文件元数据到数据库
ossFileService.saveFileMetadata(ossFile);
// 创建操作日志
OssOperationLog operationLog = new OssOperationLog();
operationLog.setFileBizId(ossFile.getFileBizId());
operationLog.setOperationType("upload");
operationLog.setOperationUser(reqDto.getUploadUser());
operationLog.setOperationResult(operationResult);
operationLog.setErrorMessage(errorMessage);
operationLog.setClientIp(IpUtil.getClientIp());
operationLog.setCostTime(System.currentTimeMillis() - startTime);
// 保存操作日志到数据库
ossFileService.saveOperationLog(operationLog);
log.info("文件上传成功: {} -> {}/{}", fileName, actualBucket, fileKey);
ossUploadFileDto.setFileBizId(ossFile.getFileBizId());
ossUploadFileDto.setFileKey(fileKey);
ossUploadFileDto.setOriginalName(fileName);
// 如果设置了公共读,可以直接拼接URL
String publicUrl = "https://" + actualBucket + "." + defaultEndpoint + "/" + fileKey;
ossUploadFileDto.setUrl(publicUrl);
ossUploadFileDto.setFileSize(fileSize);
ossUploadFileDto.setFileType(fileType);
return ossUploadFileDto;
} catch (Exception e) {
// 标记操作失败
operationResult = "failure";
// 记录错误信息
errorMessage = e.getMessage();
log.error("阿里云OSS上传文件失败: {}", fileName, e);
throw new RuntimeException("阿里云OSS上传文件失败: " + fileName, e);
} finally {
// 关闭资源
FileUtil.closeQuietly(inputStream);
// 记录失败日志
if ("failure".equals(operationResult)) {
OssOperationLog operationLog = new OssOperationLog();
if (ossFile != null) {
operationLog.setFileBizId(ossFile.getFileBizId());
} else {
// 使用无效文件ID
operationLog.setFileBizId("-1");
}
operationLog.setOperationType("upload");
operationLog.setOperationUser(reqDto.getUploadUser());
operationLog.setOperationResult(operationResult);
operationLog.setErrorMessage(errorMessage);
operationLog.setClientIp(IpUtil.getClientIp());
operationLog.setCostTime(System.currentTimeMillis() - startTime);
// 保存操作日志到数据库
ossFileService.saveOperationLog(operationLog);
}
}
}
/**
* 上传文件(使用默认存储桶)
* @param inputStream
* @param fileName
......
......@@ -6,7 +6,7 @@ import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import com.yd.oss.feign.dto.ExportParam;
import com.yd.oss.feign.dto.ExportResult;
import com.yd.oss.service.dto.OssUploadFileDto;
import com.yd.oss.service.dto.OssUploadFileResDto;
import com.yd.oss.service.service.ExcelExportService;
import com.yd.oss.service.service.OssService;
import lombok.extern.slf4j.Slf4j;
......@@ -110,7 +110,7 @@ public class ExcelExportServiceImpl implements ExcelExportService {
String fileName = generateExcelFileName(exportParam.getFileName());
// 调用OSS服务上传文件到云端存储
OssUploadFileDto uploadResult = ossService.uploadFile(
OssUploadFileResDto uploadResult = ossService.uploadFile(
inputStream, // Excel文件输入流
fileName, // 生成的文件名
"", // 存储桶名称(空字符串表示使用默认存储桶)
......
package com.yd.oss.service.service.impl;
import com.aliyun.oss.OSS;
import com.aliyun.oss.model.PutObjectRequest;
import com.yd.oss.service.dao.ProductFileMapper;
import com.yd.oss.service.model.ProductFile;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.URL;
import java.util.List;
import java.util.UUID;
@Service
@Slf4j
public class FileUploadService {
@Autowired
private OSS ossClient;
@Autowired
private ProductFileMapper productFileMapper;
@Autowired
private String defaultBucket; // 从配置注入默认存储桶
@Autowired
private String defaultEndpoint; // 注入默认服务端点
/**
* 批量处理URL上传
*/
public void batchProcessUrls() {
List<ProductFile> productFileList = productFileMapper.selectList(null);
for (ProductFile productFile : productFileList) {
try {
// 处理单个URL
processSingleUrl(productFile);
} catch (Exception e) {
log.error("处理URL失败: {}, 错误: {}", productFile.getOldFileUrl(), e.getMessage());
}
}
}
/**
* 处理单个URL
*/
private void processSingleUrl(ProductFile productFile) throws Exception {
// 1. 下载文件
byte[] fileContent = downloadFile(productFile.getOldFileUrl());
// 2. 生成OSS文件名(使用原始URL路径)
String ossFileName = generateOssFileName(productFile.getOldFileUrl(), "");
// 3. 上传到阿里云OSS
String ossUrl = uploadToAliOss(fileContent, ossFileName);
// 4. 更新数据库
productFile.setNewFileUrl(ossUrl);
productFileMapper.updateById(productFile);
log.info("文件上传成功: {} -> {}", productFile.getFileName(), ossUrl);
}
/**
* 下载文件
*/
private byte[] downloadFile(String fileUrl) throws Exception {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(fileUrl);
try (CloseableHttpResponse response = httpClient.execute(httpGet);
InputStream inputStream = response.getEntity().getContent()) {
return IOUtils.toByteArray(inputStream);
} finally {
httpClient.close();
}
}
/**
* 生成OSS文件名 - 保留原始URL路径结构
*/
private String generateOssFileName(String originalUrl, String originalFileName) {
try {
// 解析原始URL,提取路径部分
URL url = new URL(originalUrl);
String path = url.getPath(); // 得到类似:/wslucky/product/2024/12/27/9ba093ee-be9a-4291-aa86-d6a1995e16f9.pdf
// 移除开头的斜杠(如果有)
if (path.startsWith("/")) {
path = path.substring(1);
}
// 如果路径为空,使用备选方案
if (path.isEmpty()) {
return generateFallbackFileName(originalFileName);
}
return path;
} catch (Exception e) {
log.warn("解析URL路径失败: {}, 使用备选方案", originalUrl, e);
return generateFallbackFileName(originalFileName);
}
}
/**
* 备选文件名生成方案
*/
private String generateFallbackFileName(String originalFileName) {
String fileExtension = originalFileName.substring(originalFileName.lastIndexOf("."));
String timestamp = String.valueOf(System.currentTimeMillis());
String randomStr = UUID.randomUUID().toString().replace("-", "").substring(0, 8);
return "insurance/" + timestamp + "_" + randomStr + fileExtension;
}
/**
* 上传到阿里云OSS
*/
private String uploadToAliOss(byte[] fileContent, String ossFileName) {
// 创建上传请求
PutObjectRequest putObjectRequest = new PutObjectRequest(defaultBucket, ossFileName,
new ByteArrayInputStream(fileContent));
// 上传文件
ossClient.putObject(putObjectRequest);
// 生成访问URL
return String.format("https://%s.%s/%s", defaultBucket,
defaultEndpoint, ossFileName);
}
}
\ No newline at end of file
package com.yd.oss.service.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yd.oss.service.dto.MaterialDto;
import com.yd.oss.service.model.Material;
import com.yd.oss.service.dao.MaterialMapper;
import com.yd.oss.service.service.IMaterialService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 材料基础信息 服务实现类
* </p>
*
* @author zxm
* @since 2025-12-17
*/
@Service
public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> implements IMaterialService {
@Override
public List<Material> queryList(MaterialDto dto) {
return this.baseMapper.selectList(new LambdaQueryWrapper<Material>()
.eq(Material::getObjectType,dto.getObjectType()));
}
}
package com.yd.oss.service.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yd.common.exception.BusinessException;
import com.yd.oss.service.dao.OssOperationLogMapper;
import com.yd.oss.service.dto.OssFileDto;
import com.yd.oss.service.model.OssFile;
import com.yd.oss.service.dao.OssFileMapper;
import com.yd.oss.service.model.OssOperationLog;
import com.yd.oss.service.service.IOssFileService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
......@@ -30,10 +34,10 @@ import java.util.List;
@Service
public class OssFileServiceImpl extends ServiceImpl<OssFileMapper, OssFile> implements IOssFileService {
@Autowired
@Resource
private OssFileMapper ossFileMapper;
@Autowired
@Resource
private OssOperationLogMapper ossOperationLogMapper;
/**
......@@ -128,5 +132,23 @@ public class OssFileServiceImpl extends ServiceImpl<OssFileMapper, OssFile> impl
return ossOperationLogMapper.selectByFileId(fileId);
}
/**
* 查询列表
* @param dto
* @return
*/
@Override
public List<OssFile> queryList(OssFileDto dto) {
List<OssFile> list = baseMapper.selectList(new LambdaQueryWrapper<OssFile>()
.eq(StringUtils.isNotBlank(dto.getObjectBizId()),OssFile::getObjectBizId,dto.getObjectBizId())
);
return list;
}
@Override
public OssFile queryOne(String fileBizId) {
return this.getOne(new LambdaQueryWrapper<OssFile>().eq(OssFile::getFileBizId,fileBizId));
}
}
package com.yd.oss.service.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.oss.feign.request.ApiRelObjectMaterialPageRequest;
import com.yd.oss.feign.response.ApiRelObjectMaterialPageResponse;
import com.yd.oss.service.model.RelObjectMaterial;
import com.yd.oss.service.dao.RelObjectMaterialMapper;
import com.yd.oss.service.service.IRelObjectMaterialService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* <p>
* 对象材料关系表 服务实现类
* </p>
*
* @author zxm
* @since 2025-12-17
*/
@Service
public class RelObjectMaterialServiceImpl extends ServiceImpl<RelObjectMaterialMapper, RelObjectMaterial> implements IRelObjectMaterialService {
@Override
public IPage<ApiRelObjectMaterialPageResponse> page(Page<ApiRelObjectMaterialPageResponse> page,
ApiRelObjectMaterialPageRequest request) {
return baseMapper.page(page,request);
}
@Override
public RelObjectMaterial queryOne(String relObjectMaterialBizId) {
return this.getOne(new LambdaQueryWrapper<RelObjectMaterial>()
.eq(RelObjectMaterial::getRelObjectMaterialBizId,relObjectMaterialBizId));
}
@Override
public Boolean delByObjectBizId(String objectBizId) {
return this.remove(new LambdaQueryWrapper<RelObjectMaterial>().eq(RelObjectMaterial::getObjectBizId,objectBizId));
}
}
......@@ -5,11 +5,11 @@ import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
public class MyBatisPlusCodeGenerator {
public static void main(String[] args) {
FastAutoGenerator.create("jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8", "root", "123456")
FastAutoGenerator.create("jdbc:mysql://139.224.145.34:3308/yd_oss?serverTimezone=GMT%2B8", "root", "Zxm7320017")
.globalConfig(builder -> {
builder.author("zxm")
.outputDir("src/main/java/com/yd/oss/service");
// .outputDir("D:/soft/ideaproject/v2/yd-oss/yd-oss-service/src/main/java");
// .outputDir("src/main/java/com/yd/oss/service");
.outputDir("D:/soft/ideaproject/v2/yd-oss/yd-oss-service/src/main/java");
})
.packageConfig(builder -> {
builder.parent("com.yd.oss.service")
......@@ -21,7 +21,7 @@ public class MyBatisPlusCodeGenerator {
})
.strategyConfig(builder -> {
builder.addInclude(
"product_file"
"material","rel_object_material"
)
.entityBuilder()
.enableLombok()
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.oss.service.dao.MaterialMapper">
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.oss.service.dao.RelObjectMaterialMapper">
<select id="page" resultType="com.yd.oss.feign.response.ApiRelObjectMaterialPageResponse">
select rom.id,rom.rel_object_material_biz_id,rom.material_biz_id
rom.status,m.data_person,m.data_type,m.precautions
from rel_object_material rom
left join material m on m.material_biz_id = rom.material_biz_id and m.is_deleted = 0
<where>
<if test="request.objectBizId != null and request.objectBizId != ''">
and rom.object_biz_id = #{request.objectBizId}
</if>
and rom.is_deleted = 0
</where>
</select>
</mapper>
......@@ -68,6 +68,7 @@
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.13.2" level="project" />
<orderEntry type="library" name="Maven: com.yd:yd-csf-feign:1.0-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: com.yd:yd-question-feign:1.0-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: com.yd:yd-base-feign:1.0-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: com.yd:yd-auth-core:1.0-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: com.github.xiaoymin:knife4j-openapi3-spring-boot-starter:4.3.0" level="project" />
<orderEntry type="library" name="Maven: com.github.xiaoymin:knife4j-core:4.3.0" level="project" />
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment