From 2f711ff22d784bd1b9c983fef4ef44a92c43ee63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B2=91=E6=BA=AA?= <1015733727@qq.com> Date: Thu, 25 Jun 2026 16:31:06 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8E=A5=E5=85=A5gbs=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/LocalDevUserContextConfig.java | 21 +- .../adapter/config/PublicApiConfig.java | 44 --- .../adapter/web/OrgInfoController.java | 8 +- .../app/executor/OrgDepartmentExecutor.java | 2 +- .../app/executor/OrgEquipmentExecutor.java | 2 +- .../app/executor/OrgInfoExecutor.java | 6 + .../executor/OrgPersonnelCertExecutor.java | 2 +- .../executor/OrgPersonnelChangeExecutor.java | 2 +- .../app/executor/OrgPersonnelExecutor.java | 11 +- .../app/executor/OrgPositionExecutor.java | 2 +- .../executor/OrgQualificationExecutor.java | 2 +- .../app/executor/OrgResignApplyExecutor.java | 2 +- .../executor/QualFilingChangeExecutor.java | 2 +- .../app/executor/QualFilingExecutor.java | 2 +- .../safetyeval/client/api/OrgInfoApi.java | 2 + .../domain/gateway/OrgInfoGateway.java | 3 + .../domain/service/OrgInfoDomainService.java | 4 + .../adapter/ThreadLocalUserInfoAdapter.java | 34 +- .../gatewayimpl/OrgInfoGatewayImpl.java | 24 ++ .../handler/MyMetaObjectHandler.java | 304 +++++++++--------- .../support/InsertFieldDefaults.java | 7 +- .../support/OrgContextResolver.java | 29 +- .../start/config/JacksonConfig.java | 21 ++ 23 files changed, 260 insertions(+), 276 deletions(-) delete mode 100644 safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/config/PublicApiConfig.java create mode 100644 safety-eval-start/src/main/java/org/qinan/safetyeval/start/config/JacksonConfig.java diff --git a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/config/LocalDevUserContextConfig.java b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/config/LocalDevUserContextConfig.java index 03c4fbe..c230b09 100644 --- a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/config/LocalDevUserContextConfig.java +++ b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/config/LocalDevUserContextConfig.java @@ -1,9 +1,9 @@ package org.qinan.safetyeval.adapter.config; import org.qinan.safetyeval.infrastructure.adapter.ThreadLocalUserInfoAdapter; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; +import org.springframework.util.StringUtils; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @@ -15,20 +15,8 @@ import javax.servlet.http.HttpServletResponse; * 本地联调:为免鉴权的企业信息接口注入默认用户上下文,供 MyMetaObjectHandler 填充 org_id / tenant_id。 */ @Configuration -@Profile("local") public class LocalDevUserContextConfig implements WebMvcConfigurer { - @Value("${safety-eval.public-api.system-user-id:1}") - private Long systemUserId; - - @Value("${safety-eval.public-api.system-user-name:local-dev}") - private String systemUserName; - - @Value("${safety-eval.public-api.tenant-id:1001}") - private Long tenantId; - - @Value("${safety-eval.public-api.org-id:1}") - private Long orgId; private static final String[] LOCAL_DEV_PATHS = { "/org-info/**", @@ -47,7 +35,10 @@ public class LocalDevUserContextConfig implements WebMvcConfigurer { registry.addInterceptor(new HandlerInterceptor() { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { - ThreadLocalUserInfoAdapter.set(systemUserId, systemUserName, tenantId, orgId); + String orgInfoId = request.getHeader("orgInfoId"); + if (StringUtils.hasText(orgInfoId)) { + ThreadLocalUserInfoAdapter.set(Long.valueOf(orgInfoId)); + } return true; } @@ -56,6 +47,6 @@ public class LocalDevUserContextConfig implements WebMvcConfigurer { Object handler, Exception exception) { ThreadLocalUserInfoAdapter.clear(); } - }).addPathPatterns(LOCAL_DEV_PATHS); + }).addPathPatterns(LOCAL_DEV_PATHS).excludePathPatterns("/**/getInfo/**"); } } diff --git a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/config/PublicApiConfig.java b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/config/PublicApiConfig.java deleted file mode 100644 index 3589bd6..0000000 --- a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/config/PublicApiConfig.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.qinan.safetyeval.adapter.config; - -import org.qinan.safetyeval.infrastructure.adapter.ThreadLocalUserInfoAdapter; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.HandlerInterceptor; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -@Configuration -public class PublicApiConfig implements WebMvcConfigurer { - - @Value("${safety-eval.public-api.system-user-id:0}") - private Long systemUserId; - - @Value("${safety-eval.public-api.system-user-name:system}") - private String systemUserName; - - @Value("${safety-eval.public-api.tenant-id:0}") - private Long tenantId; - - @Value("${safety-eval.public-api.org-id:0}") - private Long orgId; - - @Override - public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(new HandlerInterceptor() { - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { - ThreadLocalUserInfoAdapter.set(systemUserId, systemUserName, tenantId, orgId); - return true; - } - - @Override - public void afterCompletion(HttpServletRequest request, HttpServletResponse response, - Object handler, Exception exception) { - ThreadLocalUserInfoAdapter.clear(); - } - }).addPathPatterns("/public/org-personnel/**"); - } -} diff --git a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/OrgInfoController.java b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/OrgInfoController.java index f9dcbac..12ae81e 100644 --- a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/OrgInfoController.java +++ b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/OrgInfoController.java @@ -33,12 +33,18 @@ public class OrgInfoController { return orgInfoApi.add(cmd); } - @ApiOperation("查询机构信息详情") + @ApiOperation("根据查询机构信息详情") @GetMapping("/get") public SingleResponse get(@RequestParam Long id) { return orgInfoApi.get(id); } + @ApiOperation("查询机构信息详情(内部查询)") + @GetMapping("/getInfo") + public SingleResponse getInfo() { + return orgInfoApi.getInfo(); + } + @ApiOperation("修改机构信息") @PostMapping("/modify") public SingleResponse modify(@Validated @RequestBody OrgInfoModifyCmd cmd) { diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgDepartmentExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgDepartmentExecutor.java index 08b8580..0649998 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgDepartmentExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgDepartmentExecutor.java @@ -75,7 +75,7 @@ public class OrgDepartmentExecutor implements OrgDepartmentApi { domainQuery.setPageNum(query.getCurrent()); domainQuery.setPageSize(query.getSize()); domainQuery.setTenantId(AuthUserContextAdapter.getCurrentTenantId()); - domainQuery.setOrgId(AuthUserContextAdapter.getCurrentOrgId()); + domainQuery.setOrgId(query.getOrgId()); domainQuery.setParentId(query.getParentId()); domainQuery.setDeptName(query.getDeptName()); diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgEquipmentExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgEquipmentExecutor.java index 8c8857e..df38fcb 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgEquipmentExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgEquipmentExecutor.java @@ -95,7 +95,7 @@ public class OrgEquipmentExecutor implements OrgEquipmentApi { domainQuery.setPageNum(query.getCurrent()); domainQuery.setPageSize(query.getSize()); domainQuery.setTenantId(AuthUserContextAdapter.getCurrentTenantId()); - domainQuery.setOrgId(AuthUserContextAdapter.getCurrentOrgId()); + domainQuery.setOrgId(query.getOrgId()); domainQuery.setDeviceName(query.getDeviceName()); domainQuery.setInstrumentType(query.getInstrumentType()); domainQuery.setDeviceType(query.getDeviceType()); diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgInfoExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgInfoExecutor.java index 934b35d..a00c755 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgInfoExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgInfoExecutor.java @@ -142,6 +142,12 @@ public class OrgInfoExecutor implements OrgInfoApi { pageResult.getTotal()); } + @Override + public SingleResponse getInfo() { + OrgInfoEntity entity = orgInfoDomainService.getInfo(); + return SingleResponse.success(toCO(entity)); + } + private OrgInfoCO toCO(OrgInfoEntity entity) { if (entity == null) { return null; diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPersonnelCertExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPersonnelCertExecutor.java index 542de18..3ebe1b0 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPersonnelCertExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPersonnelCertExecutor.java @@ -91,7 +91,7 @@ public class OrgPersonnelCertExecutor implements OrgPersonnelCertApi { domainQuery.setPageNum(query.getCurrent()); domainQuery.setPageSize(query.getSize()); domainQuery.setTenantId(AuthUserContextAdapter.getCurrentTenantId()); - domainQuery.setOrgId(AuthUserContextAdapter.getCurrentOrgId()); + domainQuery.setOrgId(query.getOrgId()); domainQuery.setPersonnelId(query.getPersonnelId()); domainQuery.setCertName(query.getCertName()); domainQuery.setCertTypeCode(query.getCertTypeCode()); diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPersonnelChangeExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPersonnelChangeExecutor.java index 8f682b8..17e39ca 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPersonnelChangeExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPersonnelChangeExecutor.java @@ -74,7 +74,7 @@ public class OrgPersonnelChangeExecutor implements OrgPersonnelChangeApi { domainQuery.setPageNum(query.getCurrent()); domainQuery.setPageSize(query.getSize()); domainQuery.setTenantId(AuthUserContextAdapter.getCurrentTenantId()); - domainQuery.setOrgId(AuthUserContextAdapter.getCurrentOrgId()); + domainQuery.setOrgId(query.getOrgId()); domainQuery.setPersonnelId(query.getPersonnelId()); domainQuery.setChangeItem(query.getChangeItem()); diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPersonnelExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPersonnelExecutor.java index c81534a..b12fee8 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPersonnelExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPersonnelExecutor.java @@ -1,5 +1,8 @@ package org.qinan.safetyeval.app.executor; +import com.jjb.saas.system.client.user.facade.UserFacade; +import com.jjb.saas.system.client.user.request.FacadeUserAddCmd; +import org.apache.dubbo.config.annotation.DubboReference; import org.qinan.safetyeval.app.support.OrgPersonnelChangeRecorder; import org.qinan.safetyeval.app.support.OrgPersonnelViewEnricher; import org.qinan.safetyeval.client.api.OrgPersonnelApi; @@ -43,12 +46,16 @@ public class OrgPersonnelExecutor implements OrgPersonnelApi { @Autowired(required = false) private OrgResignApplyGateway orgResignApplyGateway; +// @DubboReference +// private UserFacade userFacade; + @Override public SingleResponse add(OrgPersonnelAddCmd cmd) { OrgPersonnelEntity entity = toEntity(cmd); OrgPersonnelEntity result = orgPersonnelDomainService.add(entity); OrgPersonnelCO co = toCO(result); enrich(co); + // 同步用户信息GBS return SingleResponse.success(co); } @@ -95,7 +102,7 @@ public class OrgPersonnelExecutor implements OrgPersonnelApi { domainQuery.setPageNum(query.getCurrent()); domainQuery.setPageSize(query.getSize()); domainQuery.setTenantId(AuthUserContextAdapter.getCurrentTenantId()); - domainQuery.setOrgId(AuthUserContextAdapter.getCurrentOrgId()); + domainQuery.setOrgId(query.getOrgId()); domainQuery.setDeptId(query.getDeptId()); domainQuery.setPostId(query.getPostId()); domainQuery.setUserName(query.getUserName()); @@ -103,7 +110,7 @@ public class OrgPersonnelExecutor implements OrgPersonnelApi { domainQuery.setEmploymentStatusCode(query.getEmploymentStatusCode()); if (query.getResignAuditStatus() != null && orgResignApplyGateway != null) { domainQuery.setPersonnelIds(orgResignApplyGateway.listPersonnelIdsByAuditStatus( - query.getResignAuditStatus(), AuthUserContextAdapter.getCurrentOrgId())); + query.getResignAuditStatus(), query.getOrgId())); } PageResult pageResult = orgPersonnelDomainService.page(domainQuery); diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPositionExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPositionExecutor.java index 9fe4237..3b67985 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPositionExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgPositionExecutor.java @@ -71,7 +71,7 @@ public class OrgPositionExecutor implements OrgPositionApi { domainQuery.setPageNum(query.getCurrent()); domainQuery.setPageSize(query.getSize()); domainQuery.setTenantId(AuthUserContextAdapter.getCurrentTenantId()); - domainQuery.setOrgId(AuthUserContextAdapter.getCurrentOrgId()); + domainQuery.setOrgId(query.getOrgId()); domainQuery.setDeptId(query.getDeptId()); domainQuery.setPositionName(query.getPositionName()); diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgQualificationExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgQualificationExecutor.java index ba7ec33..a503d31 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgQualificationExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgQualificationExecutor.java @@ -85,7 +85,7 @@ public class OrgQualificationExecutor implements OrgQualificationApi { domainQuery.setPageNum(query.getCurrent()); domainQuery.setPageSize(query.getSize()); domainQuery.setTenantId(AuthUserContextAdapter.getCurrentTenantId()); - domainQuery.setOrgId(AuthUserContextAdapter.getCurrentOrgId()); + domainQuery.setOrgId(query.getOrgId()); domainQuery.setCertName(query.getCertName()); domainQuery.setCertNo(query.getCertNo()); domainQuery.setEnableFlag(query.getEnableFlag()); diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgResignApplyExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgResignApplyExecutor.java index add7421..d75b452 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgResignApplyExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/OrgResignApplyExecutor.java @@ -106,7 +106,7 @@ public class OrgResignApplyExecutor implements OrgResignApplyApi { domainQuery.setPageNum(query.getCurrent()); domainQuery.setPageSize(query.getSize()); domainQuery.setTenantId(AuthUserContextAdapter.getCurrentTenantId()); - domainQuery.setOrgId(AuthUserContextAdapter.getCurrentOrgId()); + domainQuery.setOrgId(query.getOrgId()); domainQuery.setPersonnelId(query.getPersonnelId()); domainQuery.setAuditStatusCode(query.getAuditStatusCode()); domainQuery.setApplicantName(query.getApplicantName()); diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/QualFilingChangeExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/QualFilingChangeExecutor.java index d17bd0d..7641c5a 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/QualFilingChangeExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/QualFilingChangeExecutor.java @@ -111,7 +111,7 @@ public class QualFilingChangeExecutor implements QualFilingChangeApi { domainQuery.setPageNum(query.getCurrent()); domainQuery.setPageSize(query.getSize()); domainQuery.setTenantId(AuthUserContextAdapter.getCurrentTenantId()); - domainQuery.setOrgId(AuthUserContextAdapter.getCurrentOrgId()); + domainQuery.setOrgId(query.getOrgId()); domainQuery.setOriginFilingId(query.getOriginFilingId()); domainQuery.setFilingNo(query.getFilingNo()); domainQuery.setFilingStatusCode(query.getFilingStatusCode()); diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/QualFilingExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/QualFilingExecutor.java index ef905f2..53b1df3 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/QualFilingExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/QualFilingExecutor.java @@ -113,7 +113,7 @@ public class QualFilingExecutor implements QualFilingApi { domainQuery.setPageNum(query.getCurrent()); domainQuery.setPageSize(query.getSize()); domainQuery.setTenantId(AuthUserContextAdapter.getCurrentTenantId()); - domainQuery.setOrgId(AuthUserContextAdapter.getCurrentOrgId()); + domainQuery.setOrgId(query.getOrgId()); domainQuery.setFilingNo(query.getFilingNo()); domainQuery.setFilingUnitName(query.getFilingUnitName()); domainQuery.setFilingStatusCode(query.getFilingStatusCode()); diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/OrgInfoApi.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/OrgInfoApi.java index 519a416..5409d7f 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/OrgInfoApi.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/OrgInfoApi.java @@ -23,4 +23,6 @@ public interface OrgInfoApi { SingleResponse delete(Long id); PageResponse page(OrgInfoPageQuery query); + + SingleResponse getInfo(); } diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/OrgInfoGateway.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/OrgInfoGateway.java index d7a9442..d503b3e 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/OrgInfoGateway.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/gateway/OrgInfoGateway.java @@ -22,4 +22,7 @@ public interface OrgInfoGateway { void delete(Long id); PageResult page(OrgInfoQuery query); + + OrgInfoEntity getInfo(); + } diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/OrgInfoDomainService.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/OrgInfoDomainService.java index 0bcb7d3..b8cb8a1 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/OrgInfoDomainService.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/OrgInfoDomainService.java @@ -48,4 +48,8 @@ public class OrgInfoDomainService { public PageResult page(OrgInfoQuery query) { return orgInfoGateway.page(query); } + + public OrgInfoEntity getInfo() { + return orgInfoGateway.getInfo(); + } } diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/adapter/ThreadLocalUserInfoAdapter.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/adapter/ThreadLocalUserInfoAdapter.java index bfd8344..d9cfd01 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/adapter/ThreadLocalUserInfoAdapter.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/adapter/ThreadLocalUserInfoAdapter.java @@ -1,7 +1,5 @@ package org.qinan.safetyeval.infrastructure.adapter; -import org.qinan.safetyeval.domain.adapter.UserInfoAdapter; -import org.springframework.stereotype.Component; /** * 基于 ThreadLocal 的用户信息适配器默认实现 @@ -12,41 +10,18 @@ import org.springframework.stereotype.Component; * * @author safety-eval */ -@Component -public class ThreadLocalUserInfoAdapter implements UserInfoAdapter { +public class ThreadLocalUserInfoAdapter { - private static final ThreadLocal USER_ID = new ThreadLocal<>(); - private static final ThreadLocal USER_NAME = new ThreadLocal<>(); - private static final ThreadLocal TENANT_ID = new ThreadLocal<>(); private static final ThreadLocal ORG_ID = new ThreadLocal<>(); - @Override - public Long getCurrentUserId() { - return USER_ID.get(); - } - - @Override - public String getCurrentUserName() { - return USER_NAME.get(); - } - - @Override - public Long getCurrentTenantId() { - return TENANT_ID.get(); - } - - @Override - public Long getCurrentOrgId() { + public static Long get() { return ORG_ID.get(); } /** * 设置当前线程的用户上下文信息 */ - public static void set(Long userId, String userName, Long tenantId, Long orgId) { - USER_ID.set(userId); - USER_NAME.set(userName); - TENANT_ID.set(tenantId); + public static void set(Long orgId) { ORG_ID.set(orgId); } @@ -54,9 +29,6 @@ public class ThreadLocalUserInfoAdapter implements UserInfoAdapter { * 清除当前线程的用户上下文信息,避免内存泄漏 */ public static void clear() { - USER_ID.remove(); - USER_NAME.remove(); - TENANT_ID.remove(); ORG_ID.remove(); } } diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgInfoGatewayImpl.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgInfoGatewayImpl.java index fffe0d5..d1ecafe 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgInfoGatewayImpl.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/gatewayimpl/OrgInfoGatewayImpl.java @@ -9,13 +9,17 @@ import org.qinan.safetyeval.domain.query.OrgInfoQuery; import org.qinan.safetyeval.domain.query.PageResult; import org.qinan.safetyeval.infrastructure.adapter.auth.AuthUserContextAdapter; import org.qinan.safetyeval.infrastructure.dataobject.OrgInfoDO; +import org.qinan.safetyeval.infrastructure.dataobject.OrgPersonnelDO; import org.qinan.safetyeval.infrastructure.mapper.OrgInfoMapper; +import org.qinan.safetyeval.infrastructure.mapper.OrgPersonnelMapper; import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; /** @@ -28,6 +32,8 @@ public class OrgInfoGatewayImpl implements OrgInfoGateway { @Resource private OrgInfoMapper orgInfoMapper; + @Resource + private OrgPersonnelMapper orgPersonnelMapper; @Override public OrgInfoEntity save(OrgInfoEntity entity) { @@ -93,6 +99,24 @@ public class OrgInfoGatewayImpl implements OrgInfoGateway { return PageResult.of(entities, result.getTotal(), result.getCurrent(), result.getSize()); } + @Override + public OrgInfoEntity getInfo() { + // 查询人员有无机构信息 + Long currentUserId = AuthUserContextAdapter.getCurrentUserId(); + OrgPersonnelDO orgPersonnelDO = orgPersonnelMapper.selectById(currentUserId); + LambdaQueryWrapper lqw = new LambdaQueryWrapper() + .eq(OrgInfoDO::getCreateId, currentUserId); + if (orgPersonnelDO != null && orgPersonnelDO.getOrgId() != null) { + lqw.or().eq(OrgInfoDO::getId, orgPersonnelDO.getOrgId()); + } + lqw.last("limit 1").orderByDesc(OrgInfoDO::getId); + List dataObject = orgInfoMapper.selectList(lqw); + if (dataObject.isEmpty()) { + return null; + } + return toEntity(dataObject.get(0)); + } + private OrgInfoDO toDO(OrgInfoEntity entity) { OrgInfoDO dataObject = new OrgInfoDO(); dataObject.setUnitName(entity.getUnitName()); diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/handler/MyMetaObjectHandler.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/handler/MyMetaObjectHandler.java index 238c89e..e70dd91 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/handler/MyMetaObjectHandler.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/handler/MyMetaObjectHandler.java @@ -1,152 +1,152 @@ -package org.qinan.safetyeval.infrastructure.handler; - -import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; -import org.apache.ibatis.reflection.MetaObject; -import org.qinan.safetyeval.domain.adapter.UserInfoAdapter; -import org.qinan.safetyeval.infrastructure.adapter.auth.AuthUserContextAdapter; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.time.LocalDateTime; - -/** - * MyBatis Plus 自动填充处理器 - *

- * 在 insert 和 update 操作时自动填充 GBS 标准字段, - * 优先通过 AuthUserContextAdapter 获取 SSO 真实登录用户信息, - * 其次通过 UserInfoAdapter(ThreadLocal 方式)获取,最后回退到配置默认值。 - * 使用 strictFill 策略:仅当字段值为 null 时才填充。 - *

- * - * @author safety-eval - */ -@Component -public class MyMetaObjectHandler implements MetaObjectHandler { - - /** 系统环境标识 */ - private static final String DEFAULT_ENV = "prod"; - - @Resource - private UserInfoAdapter userInfoAdapter; - - /** 无登录上下文时的回退值(local 联调配置 org-id=1;生产默认 0 不生效) */ - @Value("${safety-eval.public-api.org-id:0}") - private Long fallbackOrgId; - - @Value("${safety-eval.public-api.tenant-id:0}") - private Long fallbackTenantId; - - @Value("${safety-eval.public-api.system-user-id:0}") - private Long fallbackUserId; - - @Value("${safety-eval.public-api.system-user-name:system}") - private String fallbackUserName; - - /** - * 解析用户ID:优先 AuthUserContextAdapter(SSO) → UserInfoAdapter(ThreadLocal) → 配置回退 - */ - private Long resolveUserId() { - Long userId = AuthUserContextAdapter.getCurrentUserId(); - if (userId != null) { - return userId; - } - userId = userInfoAdapter.getCurrentUserId(); - if (userId == null && fallbackUserId != null && fallbackUserId > 0) { - userId = fallbackUserId; - } - return userId; - } - - /** - * 解析用户名:优先 AuthUserContextAdapter(SSO) → UserInfoAdapter(ThreadLocal) → 配置回退 - */ - private String resolveUserName() { - String userName = AuthUserContextAdapter.getCurrentUserName(); - if (userName != null) { - return userName; - } - userName = userInfoAdapter.getCurrentUserName(); - if (userName == null && fallbackUserName != null) { - userName = fallbackUserName; - } - return userName; - } - - /** - * 解析租户ID:优先 AuthUserContextAdapter(SSO) → UserInfoAdapter(ThreadLocal) → 配置回退 - */ - private Long resolveTenantId() { - Long tenantId = AuthUserContextAdapter.getCurrentTenantId(); - if (tenantId != null) { - return tenantId; - } - tenantId = userInfoAdapter.getCurrentTenantId(); - if (tenantId == null && fallbackTenantId != null && fallbackTenantId > 0) { - tenantId = fallbackTenantId; - } - return tenantId; - } - - /** - * 解析机构ID:优先 AuthUserContextAdapter(SSO) → UserInfoAdapter(ThreadLocal) → 配置回退 - */ - private Long resolveOrgId() { - Long orgId = AuthUserContextAdapter.getCurrentOrgId(); - if (orgId != null) { - return orgId; - } - orgId = userInfoAdapter.getCurrentOrgId(); - if (orgId == null && fallbackOrgId != null && fallbackOrgId > 0) { - orgId = fallbackOrgId; - } - return orgId; - } - - @Override - public void insertFill(MetaObject metaObject) { - LocalDateTime now = LocalDateTime.now(); - Long userId = resolveUserId(); - String userName = resolveUserName(); - Long tenantId = resolveTenantId(); - Long orgId = resolveOrgId(); - - // 严格填充:仅当字段值为 null 时填充,优先级最低 - this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, now); - this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, now); - this.strictInsertFill(metaObject, "deleteEnum", String.class, "false"); - this.strictInsertFill(metaObject, "env", String.class, DEFAULT_ENV); - this.strictInsertFill(metaObject, "version", Integer.class, 0); - - // 用户相关字段:仅当解析值不为 null 时才填充 - if (userId != null) { - this.strictInsertFill(metaObject, "createId", Long.class, userId); - this.strictInsertFill(metaObject, "updateId", Long.class, userId); - } - if (userName != null) { - this.strictInsertFill(metaObject, "createName", String.class, userName); - this.strictInsertFill(metaObject, "updateName", String.class, userName); - } - if (tenantId != null) { - this.strictInsertFill(metaObject, "tenantId", Long.class, tenantId); - } - if (orgId != null) { - this.strictInsertFill(metaObject, "orgId", Long.class, orgId); - } - } - - @Override - public void updateFill(MetaObject metaObject) { - LocalDateTime now = LocalDateTime.now(); - Long userId = resolveUserId(); - String userName = resolveUserName(); - - this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, now); - if (userId != null) { - this.strictUpdateFill(metaObject, "updateId", Long.class, userId); - } - if (userName != null) { - this.strictUpdateFill(metaObject, "updateName", String.class, userName); - } - } -} +//package org.qinan.safetyeval.infrastructure.handler; +// +//import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +//import org.apache.ibatis.reflection.MetaObject; +//import org.qinan.safetyeval.domain.adapter.UserInfoAdapter; +//import org.qinan.safetyeval.infrastructure.adapter.auth.AuthUserContextAdapter; +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.stereotype.Component; +// +//import javax.annotation.Resource; +//import java.time.LocalDateTime; +// +///** +// * MyBatis Plus 自动填充处理器 +// *

+// * 在 insert 和 update 操作时自动填充 GBS 标准字段, +// * 优先通过 AuthUserContextAdapter 获取 SSO 真实登录用户信息, +// * 其次通过 UserInfoAdapter(ThreadLocal 方式)获取,最后回退到配置默认值。 +// * 使用 strictFill 策略:仅当字段值为 null 时才填充。 +// *

+// * +// * @author safety-eval +// */ +//@Component +//public class MyMetaObjectHandler implements MetaObjectHandler { +// +// /** 系统环境标识 */ +// private static final String DEFAULT_ENV = "prod"; +// +// @Resource +// private UserInfoAdapter userInfoAdapter; +// +// /** 无登录上下文时的回退值(local 联调配置 org-id=1;生产默认 0 不生效) */ +// @Value("${safety-eval.public-api.org-id:0}") +// private Long fallbackOrgId; +// +// @Value("${safety-eval.public-api.tenant-id:0}") +// private Long fallbackTenantId; +// +// @Value("${safety-eval.public-api.system-user-id:0}") +// private Long fallbackUserId; +// +// @Value("${safety-eval.public-api.system-user-name:system}") +// private String fallbackUserName; +// +// /** +// * 解析用户ID:优先 AuthUserContextAdapter(SSO) → UserInfoAdapter(ThreadLocal) → 配置回退 +// */ +// private Long resolveUserId() { +// Long userId = AuthUserContextAdapter.getCurrentUserId(); +// if (userId != null) { +// return userId; +// } +// userId = userInfoAdapter.getCurrentUserId(); +// if (userId == null && fallbackUserId != null && fallbackUserId > 0) { +// userId = fallbackUserId; +// } +// return userId; +// } +// +// /** +// * 解析用户名:优先 AuthUserContextAdapter(SSO) → UserInfoAdapter(ThreadLocal) → 配置回退 +// */ +// private String resolveUserName() { +// String userName = AuthUserContextAdapter.getCurrentUserName(); +// if (userName != null) { +// return userName; +// } +// userName = userInfoAdapter.getCurrentUserName(); +// if (userName == null && fallbackUserName != null) { +// userName = fallbackUserName; +// } +// return userName; +// } +// +// /** +// * 解析租户ID:优先 AuthUserContextAdapter(SSO) → UserInfoAdapter(ThreadLocal) → 配置回退 +// */ +// private Long resolveTenantId() { +// Long tenantId = AuthUserContextAdapter.getCurrentTenantId(); +// if (tenantId != null) { +// return tenantId; +// } +// tenantId = userInfoAdapter.getCurrentTenantId(); +// if (tenantId == null && fallbackTenantId != null && fallbackTenantId > 0) { +// tenantId = fallbackTenantId; +// } +// return tenantId; +// } +// +// /** +// * 解析机构ID:优先 AuthUserContextAdapter(SSO) → UserInfoAdapter(ThreadLocal) → 配置回退 +// */ +// private Long resolveOrgId() { +// Long orgId = AuthUserContextAdapter.getCurrentOrgId(); +// if (orgId != null) { +// return orgId; +// } +// orgId = userInfoAdapter.getCurrentOrgId(); +// if (orgId == null && fallbackOrgId != null && fallbackOrgId > 0) { +// orgId = fallbackOrgId; +// } +// return orgId; +// } +// +// @Override +// public void insertFill(MetaObject metaObject) { +// LocalDateTime now = LocalDateTime.now(); +// Long userId = resolveUserId(); +// String userName = resolveUserName(); +// Long tenantId = resolveTenantId(); +// Long orgId = resolveOrgId(); +// +// // 严格填充:仅当字段值为 null 时填充,优先级最低 +// this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, now); +// this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, now); +// this.strictInsertFill(metaObject, "deleteEnum", String.class, "false"); +// this.strictInsertFill(metaObject, "env", String.class, DEFAULT_ENV); +// this.strictInsertFill(metaObject, "version", Integer.class, 0); +// +// // 用户相关字段:仅当解析值不为 null 时才填充 +// if (userId != null) { +// this.strictInsertFill(metaObject, "createId", Long.class, userId); +// this.strictInsertFill(metaObject, "updateId", Long.class, userId); +// } +// if (userName != null) { +// this.strictInsertFill(metaObject, "createName", String.class, userName); +// this.strictInsertFill(metaObject, "updateName", String.class, userName); +// } +// if (tenantId != null) { +// this.strictInsertFill(metaObject, "tenantId", Long.class, tenantId); +// } +// if (orgId != null) { +// this.strictInsertFill(metaObject, "orgId", Long.class, orgId); +// } +// } +// +// @Override +// public void updateFill(MetaObject metaObject) { +// LocalDateTime now = LocalDateTime.now(); +// Long userId = resolveUserId(); +// String userName = resolveUserName(); +// +// this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, now); +// if (userId != null) { +// this.strictUpdateFill(metaObject, "updateId", Long.class, userId); +// } +// if (userName != null) { +// this.strictUpdateFill(metaObject, "updateName", String.class, userName); +// } +// } +//} diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/support/InsertFieldDefaults.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/support/InsertFieldDefaults.java index 6e3342c..1c5b5b4 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/support/InsertFieldDefaults.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/support/InsertFieldDefaults.java @@ -1,5 +1,6 @@ package org.qinan.safetyeval.infrastructure.support; +import org.qinan.safetyeval.infrastructure.adapter.ThreadLocalUserInfoAdapter; import org.qinan.safetyeval.infrastructure.adapter.auth.AuthUserContextAdapter; import java.lang.reflect.Method; @@ -41,6 +42,9 @@ public final class InsertFieldDefaults { String userName = AuthUserContextAdapter.getCurrentUserName(); Long tenantId = AuthUserContextAdapter.getCurrentTenantId(); Long orgId = AuthUserContextAdapter.getCurrentOrgId(); + // 机构信息id + Long orgInfoId = ThreadLocalUserInfoAdapter.get(); + if (userId != null) { setIfNull(dataObject, "createId", userId); @@ -54,7 +58,8 @@ public final class InsertFieldDefaults { setIfNull(dataObject, "tenantId", tenantId); } if (orgId != null) { - setIfNull(dataObject, "orgId", orgId); + // 机构信息id + setIfNull(dataObject, "orgId", orgInfoId); } } diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/support/OrgContextResolver.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/support/OrgContextResolver.java index 147c116..e3385a9 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/support/OrgContextResolver.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/support/OrgContextResolver.java @@ -1,9 +1,12 @@ package org.qinan.safetyeval.infrastructure.support; -import org.qinan.safetyeval.domain.adapter.UserInfoAdapter; +import org.qinan.safetyeval.domain.exception.BizException; +import org.qinan.safetyeval.domain.exception.ErrorCode; +import org.qinan.safetyeval.infrastructure.adapter.ThreadLocalUserInfoAdapter; import org.qinan.safetyeval.infrastructure.adapter.auth.AuthUserContextAdapter; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import org.springframework.validation.BindException; import javax.annotation.Resource; @@ -13,30 +16,14 @@ import javax.annotation.Resource; @Component public class OrgContextResolver { - @Resource - private UserInfoAdapter userInfoAdapter; - - @Value("${safety-eval.public-api.org-id:0}") - private Long fallbackOrgId; - public Long resolveOrgId(Long entityOrgId) { if (entityOrgId != null) { return entityOrgId; } - // 优先 SSO 真实登录用户的 orgId - Long orgId = AuthUserContextAdapter.getCurrentOrgId(); - if (orgId != null) { - return orgId; + Long orgId = ThreadLocalUserInfoAdapter.get(); + if (orgId == null) { + throw new BizException(ErrorCode.ORG_INFO_NOT_FOUND); } - // 其次 ThreadLocal 方式 - orgId = userInfoAdapter.getCurrentOrgId(); - if (orgId != null) { - return orgId; - } - // 最后配置回退 - if (fallbackOrgId != null && fallbackOrgId > 0) { - return fallbackOrgId; - } - return null; + return orgId; } } diff --git a/safety-eval-start/src/main/java/org/qinan/safetyeval/start/config/JacksonConfig.java b/safety-eval-start/src/main/java/org/qinan/safetyeval/start/config/JacksonConfig.java new file mode 100644 index 0000000..39f58f3 --- /dev/null +++ b/safety-eval-start/src/main/java/org/qinan/safetyeval/start/config/JacksonConfig.java @@ -0,0 +1,21 @@ +package org.qinan.safetyeval.start.config; + +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * 雪花 ID 超出 JS Number 安全整数范围,序列化为字符串避免前端精度丢失。 + */ +@Configuration +public class JacksonConfig { + + @Bean + public Jackson2ObjectMapperBuilderCustomizer longToStringCustomizer() { + return builder -> { + builder.serializerByType(Long.class, ToStringSerializer.instance); + builder.serializerByType(Long.TYPE, ToStringSerializer.instance); + }; + } +}