24282 2 gadi atpakaļ
vecāks
revīzija
ec167738cf

+ 32 - 0
hx-file/src/main/java/com/fjhx/file/service/FileInfoService.java

@@ -25,5 +25,37 @@ public interface FileInfoService extends BaseService<FileInfo> {
      */
     List<FileInfoVo> getList(FileInfoSelectDto dto);
 
+    /**
+     * 保存文件
+     *
+     * @param obsFileList  文件列表
+     * @param businessId   业务id
+     * @param businessType 业务文件类型
+     */
+    void saveFile(List<ObsFile> obsFileList, Long businessId, Integer businessType);
+
+    /**
+     * 更新文件
+     *
+     * @param obsFileList  文件列表
+     * @param businessId   业务id
+     * @param businessType 业务文件类型
+     */
+    void editFile(List<ObsFile> obsFileList, Long businessId, Integer businessType);
+
+    /**
+     * 删除文件
+     *
+     * @param businessId   业务id
+     * @param businessType 业务文件类型
+     */
+    void removeFile(Long businessId, Integer businessType);
+
+    /**
+     * 删除文件
+     *
+     * @param businessId 业务id
+     */
+    void removeFile(Long businessId);
 
 }

+ 83 - 0
hx-file/src/main/java/com/fjhx/file/service/impl/FileInfoServiceImpl.java

@@ -1,10 +1,13 @@
 package com.fjhx.file.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.dynamic.datasource.annotation.DS;
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.file.entity.*;
 import com.fjhx.file.mapper.FileInfoMapper;
@@ -12,12 +15,17 @@ import com.fjhx.file.service.FileInfoService;
 import com.obs.services.ObsClient;
 import com.obs.services.model.PostSignatureRequest;
 import com.obs.services.model.PostSignatureResponse;
+import com.ruoyi.common.constant.DatasourceConstant;
+import com.ruoyi.common.core.domain.BaseIdPo;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -126,6 +134,81 @@ public class FileInfoServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> i
     }
 
     /**
+     * !!!必须加上Transactional 更改事务传播行为,否则数据源将被缓存,造成数据源切换失败
+     *
+     * @param obsFileList  文件列表
+     * @param businessId   业务id
+     * @param businessType 业务文件类型
+     */
+    @Transactional(propagation = Propagation.REQUIRES_NEW)
+    @DS(DatasourceConstant.SLAVE_NAME)
+    @Override
+    public void saveFile(List<ObsFile> obsFileList, Long businessId, Integer businessType) {
+        // 切换到从库
+        if (obsFileList.size() == 0) {
+            return;
+        }
+
+        List<FileInfo> fileInfoList = BeanUtil.copyToList(obsFileList, FileInfo.class);
+        for (FileInfo fileInfo : fileInfoList) {
+            fileInfo.setBusinessId(businessId);
+            fileInfo.setBusinessType(businessType);
+        }
+        this.updateBatchById(fileInfoList);
+        DynamicDataSourceContextHolder.clear();
+    }
+
+    /**
+     * !!!必须加上Transactional 更改事务传播行为,否则数据源将被缓存,造成数据源切换失败
+     *
+     * @param obsFileList  文件列表
+     * @param businessId   业务id
+     * @param businessType 业务文件类型
+     */
+    @Transactional(propagation = Propagation.REQUIRES_NEW)
+    @DS(DatasourceConstant.SLAVE_NAME)
+    @Override
+    public void editFile(List<ObsFile> obsFileList, Long businessId, Integer businessType) {
+        if (obsFileList.size() == 0) {
+            return;
+        }
+
+        // 删除不包含在此列表的业务id文件
+        List<Long> obsFileId = obsFileList.stream().map(ObsFile::getId).collect(Collectors.toList());
+        this.remove(q -> q.notIn(BaseIdPo::getId, obsFileId).eq(FileInfo::getBusinessId, businessId));
+
+        // 更新在此列表的文件
+        saveFile(obsFileList, businessId, businessType);
+    }
+
+    /**
+     * !!!必须加上Transactional 更改事务传播行为,否则数据源将被缓存,造成数据源切换失败
+     *
+     * @param businessId   业务id
+     * @param businessType 业务文件类型
+     */
+    @Transactional(propagation = Propagation.REQUIRES_NEW)
+    @DS(DatasourceConstant.SLAVE_NAME)
+    @Override
+    public void removeFile(Long businessId, Integer businessType) {
+        this.remove(q -> q
+                .eq(FileInfo::getBusinessId, businessId)
+                .eq(FileInfo::getBusinessType, businessType));
+    }
+
+    /**
+     * !!!必须加上Transactional 更改事务传播行为,否则数据源将被缓存,造成数据源切换失败
+     *
+     * @param businessId 业务id
+     */
+    @Transactional(propagation = Propagation.REQUIRES_NEW)
+    @DS(DatasourceConstant.SLAVE_NAME)
+    @Override
+    public void removeFile(Long businessId) {
+        this.remove(q -> q.eq(FileInfo::getBusinessId, businessId));
+    }
+
+    /**
      * 获取oss链接客户端
      */
     private ObsClient getObsClient() {

+ 6 - 45
hx-file/src/main/java/com/fjhx/file/util/ObsFileUtil.java

@@ -1,16 +1,10 @@
 package com.fjhx.file.util;
 
-import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.extra.spring.SpringUtil;
-import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
-import com.fjhx.file.entity.FileInfo;
 import com.fjhx.file.entity.ObsFile;
 import com.fjhx.file.service.FileInfoService;
-import com.ruoyi.common.constant.DatasourceConstant;
-import com.ruoyi.common.core.domain.BaseIdPo;
 
 import java.util.List;
-import java.util.stream.Collectors;
 
 public class ObsFileUtil {
 
@@ -25,21 +19,7 @@ public class ObsFileUtil {
      * @param businessType 业务文件类型
      */
     public static void saveFile(List<ObsFile> obsFileList, Long businessId, Integer businessType) {
-        // 切换到从库
-        DynamicDataSourceContextHolder.push(DatasourceConstant.SLAVE_NAME);
-
-        if (obsFileList.size() == 0) {
-            return;
-        }
-
-        List<FileInfo> fileInfoList = BeanUtil.copyToList(obsFileList, FileInfo.class);
-        for (FileInfo fileInfo : fileInfoList) {
-            fileInfo.setBusinessId(businessId);
-            fileInfo.setBusinessType(businessType);
-        }
-        fileInfoService.updateBatchById(fileInfoList);
-
-        DynamicDataSourceContextHolder.clear();
+        fileInfoService.saveFile(obsFileList, businessId, businessType);
     }
 
     /**
@@ -49,7 +29,7 @@ public class ObsFileUtil {
      * @param businessId  业务id
      */
     public static void saveFile(List<ObsFile> obsFileList, Long businessId) {
-        saveFile(obsFileList, businessId, defaultFileType);
+        fileInfoService.saveFile(obsFileList, businessId, defaultFileType);
     }
 
     /**
@@ -60,19 +40,7 @@ public class ObsFileUtil {
      * @param businessType 业务文件类型
      */
     public static void editFile(List<ObsFile> obsFileList, Long businessId, Integer businessType) {
-        DynamicDataSourceContextHolder.push(DatasourceConstant.SLAVE_NAME);
-
-        if (obsFileList.size() == 0) {
-            return;
-        }
-
-        // 删除不包含在此列表的业务id文件
-        List<Long> obsFileId = obsFileList.stream().map(ObsFile::getId).collect(Collectors.toList());
-        fileInfoService.remove(q -> q.notIn(BaseIdPo::getId, obsFileId).eq(FileInfo::getBusinessId, businessId));
-
-        // 更新在此列表的文件
-        saveFile(obsFileList, businessId, businessType);
-        DynamicDataSourceContextHolder.clear();
+        fileInfoService.editFile(obsFileList, businessId, businessType);
     }
 
     /**
@@ -82,7 +50,7 @@ public class ObsFileUtil {
      * @param businessId  业务id
      */
     public static void editFile(List<ObsFile> obsFileList, Long businessId) {
-        editFile(obsFileList, businessId, defaultFileType);
+        fileInfoService.editFile(obsFileList, businessId, defaultFileType);
     }
 
     /**
@@ -92,12 +60,7 @@ public class ObsFileUtil {
      * @param businessType 业务文件类型
      */
     public static void removeFile(Long businessId, Integer businessType) {
-        DynamicDataSourceContextHolder.push(DatasourceConstant.SLAVE_NAME);
-        fileInfoService.remove(q -> q
-                .eq(FileInfo::getBusinessId, businessId)
-                .eq(FileInfo::getBusinessType, businessType));
-
-        DynamicDataSourceContextHolder.clear();
+        fileInfoService.removeFile(businessId, businessType);
     }
 
     /**
@@ -106,9 +69,7 @@ public class ObsFileUtil {
      * @param businessId 业务id
      */
     public static void removeFile(Long businessId) {
-        DynamicDataSourceContextHolder.push(DatasourceConstant.SLAVE_NAME);
-        fileInfoService.remove(q -> q.eq(FileInfo::getBusinessId, businessId));
-        DynamicDataSourceContextHolder.clear();
+        fileInfoService.removeFile(businessId);
     }
 
 }

+ 1 - 1
ruoyi-common/src/main/java/com/ruoyi/common/constant/DatasourceConstant.java

@@ -11,7 +11,7 @@ public interface DatasourceConstant {
     String MASTER_NAME = "master";
 
     /**
-     * 流程数据源
+     * 数据源
      */
     String SLAVE_NAME = "slave";
 

+ 2 - 0
ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml

@@ -118,6 +118,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			<if test="status != null and status != ''">status,</if>
  			<if test="remark != null and remark != ''">remark,</if>
  			<if test="createBy != null and createBy != ''">create_by,</if>
+ 			<if test="tenantId != null and tenantId != ''">tenant_id,</if>
  			create_time
  		)values(
  			<if test="roleId != null and roleId != 0">#{roleId},</if>
@@ -130,6 +131,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  			<if test="status != null and status != ''">#{status},</if>
  			<if test="remark != null and remark != ''">#{remark},</if>
  			<if test="createBy != null and createBy != ''">#{createBy},</if>
+ 			<if test="tenantId != null and tenantId != ''">#{tenantId},</if>
  			sysdate()
  		)
 	</insert>