FileInfoServiceImpl.java 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. package com.fjhx.file.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.date.DateUtil;
  4. import cn.hutool.core.io.FileUtil;
  5. import cn.hutool.core.io.IoUtil;
  6. import cn.hutool.core.util.IdUtil;
  7. import cn.hutool.core.util.ObjectUtil;
  8. import com.baomidou.dynamic.datasource.annotation.DS;
  9. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  10. import com.fjhx.file.entity.*;
  11. import com.fjhx.file.mapper.FileInfoMapper;
  12. import com.fjhx.file.service.FileInfoService;
  13. import com.obs.services.ObsClient;
  14. import com.obs.services.model.PostSignatureRequest;
  15. import com.obs.services.model.PostSignatureResponse;
  16. import com.ruoyi.common.constant.BaseSourceConstant;
  17. import com.ruoyi.common.core.domain.BaseIdPo;
  18. import com.ruoyi.common.exception.ServiceException;
  19. import com.ruoyi.common.utils.wrapper.IWrapper;
  20. import org.springframework.beans.factory.annotation.Value;
  21. import org.springframework.stereotype.Service;
  22. import java.util.*;
  23. import java.util.stream.Collectors;
  24. /**
  25. * <p>
  26. * 文件表 服务实现类
  27. * </p>
  28. *
  29. * @author zlj
  30. * @since 2023-03-14
  31. */
  32. @Service
  33. public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> implements FileInfoService {
  34. @Value("${obs.ak}")
  35. private String ak;
  36. @Value("${obs.sk}")
  37. private String sk;
  38. @Value("${obs.endPoint}")
  39. private String endPoint;
  40. @Value("${obs.url}")
  41. private String url;
  42. @Value("${obs.bucketName}")
  43. private String bucketName;
  44. @Value("${spring.profiles.active}")
  45. private String active;
  46. @Override
  47. public SingVo getSing(SingDto dto) {
  48. String fileName = dto.getFileName();
  49. if (fileName.length()>100){
  50. throw new ServiceException("文件名过长,请缩短后重试!!!");
  51. }
  52. SingVo singVo = new SingVo();
  53. // 文件后缀名
  54. String suffix = FileUtil.getSuffix(dto.getFileName());
  55. // 文件路径
  56. String objectKey = new StringJoiner("/")
  57. .add("byteSailing")
  58. .add(active)
  59. .add(DateUtil.format(new Date(), "yyyy/MM/dd"))
  60. .add(IdUtil.fastSimpleUUID() + (ObjectUtil.isEmpty(suffix) ? "" : "." + suffix))
  61. .toString();
  62. ObsClient obsClient = null;
  63. try {
  64. // 获取oss链接客户端
  65. obsClient = getObsClient();
  66. // 指定签名有效期为10秒
  67. long currentTimeMillis = System.currentTimeMillis() + 1000 * 10;
  68. // 获取签名
  69. PostSignatureRequest request = new PostSignatureRequest(currentTimeMillis, bucketName, objectKey);
  70. PostSignatureResponse temporarySignature = obsClient.createPostSignature(request);
  71. // 封装签名
  72. Map<String, String> body = new LinkedHashMap<>();
  73. body.put("policy", temporarySignature.getPolicy());
  74. body.put("AccessKeyId", ak);
  75. body.put("signature", temporarySignature.getSignature());
  76. body.put("key", objectKey);
  77. singVo.setUploadBody(body);
  78. } catch (Exception e) {
  79. throw new ServiceException("获取签名失败");
  80. } finally {
  81. IoUtil.close(obsClient);
  82. }
  83. // 保存文件
  84. FileInfo fileInfo = new FileInfo();
  85. fileInfo.setFileUrl(objectKey);
  86. fileInfo.setFileName(dto.getFileName());
  87. save(fileInfo);
  88. // 封装文件信息
  89. singVo.setUploadUrl("https://" + bucketName + "." + endPoint);
  90. singVo.setId(fileInfo.getId());
  91. singVo.setFileName(dto.getFileName());
  92. singVo.setFileUrl(url + objectKey);
  93. return singVo;
  94. }
  95. @DS(BaseSourceConstant.BASE)
  96. @Override
  97. public Map<Long, List<FileInfoVo>> getList(FileInfoSelectDto dto) {
  98. if (ObjectUtil.isEmpty(dto.getBusinessIdList())) {
  99. return new HashMap<>();
  100. }
  101. IWrapper<Object> wrapper = IWrapper.getWrapper();
  102. wrapper.in("fi", FileInfo::getBusinessId, dto.getBusinessIdList());
  103. wrapper.eq("fi", FileInfo::getBusinessType, dto.getFileType());
  104. List<FileInfoVo> list = this.baseMapper.getList(wrapper);
  105. if (list.size() == 0) {
  106. return new HashMap<>();
  107. }
  108. return list.stream()
  109. .peek(fileInfoVo -> fileInfoVo.setFileUrl(url + fileInfoVo.getFileUrl()))
  110. .collect(Collectors.groupingBy(FileInfoVo::getBusinessId));
  111. }
  112. /**
  113. * !!!必须加上Transactional 更改事务传播行为,否则数据源将被缓存,造成数据源切换失败
  114. *
  115. * @param obsFileList 文件列表
  116. * @param businessId 业务id
  117. * @param businessType 业务文件类型
  118. */
  119. @DS(BaseSourceConstant.BASE)
  120. @Override
  121. public void saveFile(List<ObsFile> obsFileList, Long businessId, Integer businessType) {
  122. // 切换到从库
  123. if (obsFileList == null || obsFileList.size() == 0) {
  124. return;
  125. }
  126. List<FileInfo> fileInfoList = BeanUtil.copyToList(obsFileList, FileInfo.class);
  127. for (FileInfo fileInfo : fileInfoList) {
  128. fileInfo.setBusinessId(businessId);
  129. fileInfo.setBusinessType(businessType);
  130. }
  131. this.updateBatchById(fileInfoList);
  132. }
  133. /**
  134. * !!!必须加上Transactional 更改事务传播行为,否则数据源将被缓存,造成数据源切换失败
  135. *
  136. * @param obsFileList 文件列表
  137. * @param businessId 业务id
  138. * @param businessType 业务文件类型
  139. */
  140. @DS(BaseSourceConstant.BASE)
  141. @Override
  142. public void editFile(List<ObsFile> obsFileList, Long businessId, Integer businessType) {
  143. if (obsFileList == null || obsFileList.size() == 0) {
  144. this.remove(q -> q.eq(FileInfo::getBusinessId, businessId).eq(FileInfo::getBusinessType, businessType));
  145. return;
  146. }
  147. // 删除不包含在此列表的业务id文件
  148. List<Long> obsFileId = obsFileList.stream().map(ObsFile::getId).collect(Collectors.toList());
  149. this.remove(q -> q.notIn(ObjectUtil.isNotEmpty(obsFileId), BaseIdPo::getId, obsFileId)
  150. .eq(FileInfo::getBusinessId, businessId).eq(FileInfo::getBusinessType, businessType));
  151. // 更新在此列表的文件
  152. saveFile(obsFileList, businessId, businessType);
  153. }
  154. /**
  155. * !!!必须加上Transactional 更改事务传播行为,否则数据源将被缓存,造成数据源切换失败
  156. *
  157. * @param businessId 业务id
  158. * @param businessType 业务文件类型
  159. */
  160. @DS(BaseSourceConstant.BASE)
  161. @Override
  162. public void removeFile(Long businessId, Integer businessType) {
  163. this.remove(q -> q
  164. .eq(FileInfo::getBusinessId, businessId)
  165. .eq(FileInfo::getBusinessType, businessType));
  166. }
  167. /**
  168. * !!!必须加上Transactional 更改事务传播行为,否则数据源将被缓存,造成数据源切换失败
  169. *
  170. * @param businessId 业务id
  171. */
  172. @DS(BaseSourceConstant.BASE)
  173. @Override
  174. public void removeFile(Long businessId) {
  175. this.remove(q -> q.eq(FileInfo::getBusinessId, businessId));
  176. }
  177. /**
  178. * 获取oss链接客户端
  179. */
  180. private ObsClient getObsClient() {
  181. return new ObsClient(ak, sk, endPoint);
  182. }
  183. }