Pārlūkot izejas kodu

fix: 解决大sql 分片区域

shc 11 mēneši atpakaļ
vecāks
revīzija
d2de4047d5

+ 31 - 12
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmDaAgentController.java

@@ -42,6 +42,7 @@ import com.qunzhixinxi.hnqz.admin.service.WmAgentEvaluationService;
 import com.qunzhixinxi.hnqz.admin.service.WmDaAgentService;
 import com.qunzhixinxi.hnqz.admin.service.WmDaDrugEntService;
 import com.qunzhixinxi.hnqz.admin.service.WmRelationService;
+import com.qunzhixinxi.hnqz.admin.util.AreaUtils;
 import com.qunzhixinxi.hnqz.common.core.constant.CommonConstants;
 import com.qunzhixinxi.hnqz.common.core.entity.BaseEntity;
 import com.qunzhixinxi.hnqz.common.core.util.R;
@@ -67,11 +68,13 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * 档案-代理商
@@ -137,25 +140,41 @@ public class WmDaAgentController {
 
 
         // 区域限制
-        List<Long> areaId;
+        List<Long> entIds = new LinkedList<>();
         if (CollUtil.isNotEmpty(wmDaAgent.getAreaCodes())) {
-
-            areaId = wmDaAgent.getAreaCodes();
-
+            entIds = enterpriseAreaService.listAreaEnts(wmDaAgent.getAreaCodes());
         } else {
-            areaId = userAreaService.listUserAreas(Long.valueOf(SecurityUtils.getUser().getId()));
+            List<Long> areaId = userAreaService.listUserAreas(Long.valueOf(SecurityUtils.getUser().getId()));
             if (CollUtil.isNotEmpty(areaId)) {
-                areaId = areaEntityService.list(Wrappers.<SysAreaEntity>lambdaQuery()
-                                .in(SysAreaEntity::getAreaId, areaId)
-                                .eq(SysAreaEntity::getAreaStatus, Boolean.TRUE)
-                                .eq(SysAreaEntity::getAreaType, UpmsType.AreaType.DISTRICT))
-                        .stream()
-                        .mapToLong(SysAreaEntity::getAreaId).boxed().distinct().collect(Collectors.toList());
+
+                // 集合分片
+
+                List<List<Long>> partition = AreaUtils.partition(areaId);
+
+
+
+                for (List<Long> p : partition) {
+                    List<Long> collect = areaEntityService.list(Wrappers.<SysAreaEntity>lambdaQuery()
+                                    .in(SysAreaEntity::getAreaId, p)
+                                    .eq(SysAreaEntity::getAreaStatus, Boolean.TRUE)
+                                    .eq(SysAreaEntity::getAreaType, UpmsType.AreaType.DISTRICT))
+                            .stream()
+                            .mapToLong(SysAreaEntity::getAreaId).boxed().distinct().collect(Collectors.toList());
+
+                    if (CollUtil.isEmpty(collect)) {
+                        continue;
+                    }
+
+                    List<Long> eIds = enterpriseAreaService.listAreaEnts(collect);
+
+                    entIds.addAll(eIds);
+                }
+
             }
 
         }
 
-        List<Long> entIds = enterpriseAreaService.listAreaEnts(areaId);
+        // List<Long> entIds = enterpriseAreaService.listAreaEnts(areaId);
 
         // 交集
         Set<Integer> resSet = new HashSet<>(ids);

+ 62 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/util/AreaUtils.java

@@ -0,0 +1,62 @@
+package com.qunzhixinxi.hnqz.admin.util;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.ListUtil;
+import lombok.experimental.UtilityClass;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * 区域工具类
+ *
+ * @author jimmy
+ * @date 29/07/2024 15:04
+ */
+@Slf4j
+@UtilityClass
+public final class AreaUtils {
+
+    // 110101006008 区域编码长度
+    private static final int CODD_LENGTH = 12;
+
+    private static final int PARTITION_LENGTH = 60_000;
+
+
+    /**
+     * 区域分片
+     *
+     * @param source 数据源
+     * @return 分片结果
+     */
+    public static List<List<Long>> partition(List<Long> source) {
+
+        if (CollUtil.isEmpty(source)) {
+            log.info("数据源为空");
+            return Collections.emptyList();
+        }
+
+        int size = calcSize(source.size());
+        log.info("数据源长度:{}, 分片个数:{}", source.size(), size);
+        final List<List<Long>> result;
+        if (size == 1) {
+            result = Collections.singletonList(source);
+        } else {
+            result = ListUtil.split(source, size);
+        }
+
+        return result;
+    }
+
+
+    private static int calcSize(int sourceSize) {
+
+        int eleListSize = sourceSize * CODD_LENGTH + (sourceSize - 1);
+
+        return (eleListSize / PARTITION_LENGTH) + 1;
+
+    }
+
+
+}