Răsfoiți Sursa

aop自动切换数据源

24282 2 ani în urmă
părinte
comite
5c03de8ffe

+ 59 - 0
hx-common/src/main/java/com/fjhx/common/aop/DataSourceAspect.java

@@ -0,0 +1,59 @@
+package com.fjhx.common.aop;
+
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.fjhx.common.constant.SourceConstant;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Field;
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
+
+@Aspect
+@Component
+public class DataSourceAspect {
+
+    private static final Set<String> dataSourceSet = new HashSet<>();
+
+    static {
+        Class<SourceConstant> sourceConstantClass = SourceConstant.class;
+        Field[] declaredFields = sourceConstantClass.getDeclaredFields();
+        for (Field declaredField : declaredFields) {
+            dataSourceSet.add(declaredField.getName().toLowerCase());
+        }
+    }
+
+    @Pointcut("execution (* com.fjhx.*.service.*.*.*(..))")
+    public void pointcut() {
+
+    }
+
+    @Around(value = "pointcut()")
+    public Object before(ProceedingJoinPoint point) throws Throwable {
+        Object target = point.getTarget();
+        String name = target.getClass().getName();
+        String moduleName = name.split("\\.")[2];
+
+        String peek = DynamicDataSourceContextHolder.peek();
+        if (Objects.equals(peek, moduleName)) {
+            return point.proceed();
+        }
+
+        if (dataSourceSet.contains(moduleName)) {
+            DynamicDataSourceContextHolder.push(moduleName);
+            try {
+                return point.proceed();
+            } finally {
+                DynamicDataSourceContextHolder.poll();
+            }
+        }
+
+        return point.proceed();
+    }
+
+
+}

+ 1 - 0
hx-common/src/main/java/com/fjhx/common/constant/SourceConstant.java

@@ -25,6 +25,7 @@ public interface SourceConstant {
     String MAIL = "mail";
 
     String COMMON = "common";
+
     String VICTORIATOURIST = "victoriatourist";
 
 }

+ 0 - 3
hx-mes/src/main/java/com/fjhx/mes/controller/bom/BomInfoController.java

@@ -1,8 +1,6 @@
 package com.fjhx.mes.controller.bom;
 
-import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fjhx.common.constant.SourceConstant;
 import com.fjhx.mes.entity.bom.dto.BomInfoDto;
 import com.fjhx.mes.entity.bom.dto.BomInfoSelectDto;
 import com.fjhx.mes.entity.bom.po.BomInfo;
@@ -27,7 +25,6 @@ import java.util.List;
  * @author
  * @since 2023-03-29
  */
-@DS(SourceConstant.MES)
 @RestController
 @RequestMapping("/bomInfo")
 public class BomInfoController {

+ 0 - 10
hx-mes/src/main/java/com/fjhx/mes/service/bom/impl/BomInfoServiceImpl.java

@@ -3,10 +3,8 @@ package com.fjhx.mes.service.bom.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.ObjectUtil;
-import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.fjhx.common.constant.SourceConstant;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.mes.entity.bom.dto.BomInfoDto;
@@ -62,19 +60,15 @@ public class BomInfoServiceImpl extends ServiceImpl<BomInfoMapper, BomInfo> impl
 
         Map<Long, ProductInfo> productInfoMap = new HashMap<>();
         if (!ObjectUtil.isAllEmpty(productType, keyword)) {
-            DynamicDataSourceContextHolder.push(SourceConstant.ITEM);
             List<ProductInfo> list = productInfoService.list(IWrapper.<ProductInfo>getWrapper()
                     .eq(ProductInfo::getType, productType)
                     .keyword(keyword, new SqlField(ProductInfo::getName), new SqlField(ProductInfo::getCode)));
 
             if (list.size() == 0) {
-                DynamicDataSourceContextHolder.clear();
                 return new Page<>();
             }
 
             productInfoMap = list.stream().collect(Collectors.toMap(BaseIdPo::getId, Function.identity()));
-            DynamicDataSourceContextHolder.clear();
-            DynamicDataSourceContextHolder.push(SourceConstant.MES);
         }
 
         IWrapper<BomInfo> wrapper = getWrapper()
@@ -100,13 +94,11 @@ public class BomInfoServiceImpl extends ServiceImpl<BomInfoMapper, BomInfo> impl
                 item.setProductName(productInfo.getName());
             }
         } else {
-            DynamicDataSourceContextHolder.push(SourceConstant.ITEM);
             productInfoService.attributeAssign(records, BomInfo::getProductId, (item, productInfo) -> {
                 item.setProductType(productInfo.getType());
                 item.setProductCode(productInfo.getCode());
                 item.setProductName(productInfo.getName());
             });
-            DynamicDataSourceContextHolder.clear();
         }
 
         return page;
@@ -120,13 +112,11 @@ public class BomInfoServiceImpl extends ServiceImpl<BomInfoMapper, BomInfo> impl
         List<BomDetail> bomDetailList = bomDetailService.list(q -> q.eq(BomDetail::getBomInfoId, id));
         List<BomDetailVo> bomDetailVoList = BeanUtil.copyToList(bomDetailList, BomDetailVo.class);
 
-        DynamicDataSourceContextHolder.push(SourceConstant.ITEM);
         productInfoService.attributeAssign(bomDetailVoList, BomDetailVo::getProductId, (item, productInfo) -> {
             item.setProductCode(productInfo.getCode());
             item.setProductName(productInfo.getName());
             item.setProductUnit(productInfo.getUnit());
         });
-        DynamicDataSourceContextHolder.clear();
 
         result.setBomDetailVoList(bomDetailVoList);
         return result;