From edd1b08bf17844f89a04e0172376a66ec293ffb7 Mon Sep 17 00:00:00 2001 From: "review512jwy@163.com" <“review512jwy@163.com”> Date: Wed, 4 Mar 2026 10:26:32 +0800 Subject: [PATCH] =?UTF-8?q?getTopCompanyId=E6=AD=BB=E5=BE=AA=E7=8E=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/config/DataSourceInterceptor.java | 64 ++++++++++++------- 1 file changed, 41 insertions(+), 23 deletions(-) diff --git a/dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/config/DataSourceInterceptor.java b/dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/config/DataSourceInterceptor.java index 372bc72..d94a2d6 100644 --- a/dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/config/DataSourceInterceptor.java +++ b/dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/config/DataSourceInterceptor.java @@ -13,10 +13,7 @@ import com.dongjian.dashboard.back.common.Constants; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.concurrent.atomic.AtomicLong; @@ -56,25 +53,46 @@ public class DataSourceInterceptor implements HandlerInterceptor { } public long getTopCompanyId(String companyId) { - - String sql="SELECT " - + " bcom.id, bcom.parent_id parentId" - + " FROM data_center_aeon_admin.basic_company bcom " - + " WHERE bcom.flag != 1 and bcom.id = " + companyId; - - AtomicLong parentId = new AtomicLong(0); - AtomicLong id = new AtomicLong(0); - jdbcTemplate.query(sql,rs -> { - parentId.set(rs.getLong("parentId")); - id.set(rs.getLong("id")); - }); - //Recursive logic - if (1 == parentId.get() || -1 == parentId.get()) { - return id.get(); - } else { - return getTopCompanyId(parentId.get()+""); - } - } + + if (StringUtils.isBlank(companyId)) { + throw new IllegalArgumentException("companyId不能为空"); + } + + return getTopCompanyIdInternal(Long.parseLong(companyId), new HashSet<>()); + } + + private long getTopCompanyIdInternal(Long companyId, Set visited) { + + // 防止循环引用 + if (!visited.add(companyId)) { + throw new IllegalStateException("检测到公司父子结构循环,companyId=" + companyId); + } + + String sql = """ + SELECT id, parent_id + FROM data_center_aeon_admin.basic_company + WHERE flag != 1 AND id = ? + """; + + List> result = jdbcTemplate.queryForList(sql, companyId); + + if (result.isEmpty()) { + throw new IllegalStateException("公司不存在,companyId=" + companyId); + } + + Map row = result.get(0); + + Long parentId = row.get("parent_id") == null + ? null + : ((Number) row.get("parent_id")).longValue(); + + // 顶级企业 + if (parentId == null || parentId == 1 || parentId == -1) { + return companyId; + } + + return getTopCompanyIdInternal(parentId, visited); + } /** * 获取所有的一级企业