From dc13f2c48d676b6764a6ea281000521f343e6bd6 Mon Sep 17 00:00:00 2001 From: zhanglei Date: Mon, 6 Jul 2026 10:43:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=94=A8=E6=88=B7=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/config/GbsUserSyncConfig.java | 65 +++++++++++++++++++ .../adapter/web/AccountController.java | 6 ++ .../app/executor/AccountExecutor.java | 30 +++++---- .../safetyeval/client/api/AccountApi.java | 2 + .../safetyeval/client/dto/AccountAddCmd.java | 2 +- .../domain/exception/ErrorCode.java | 3 + .../domain/service/AccountDomainService.java | 9 +++ .../adapter/auth/AuthUserInfo.java | 4 ++ 8 files changed, 106 insertions(+), 15 deletions(-) create mode 100644 safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/config/GbsUserSyncConfig.java diff --git a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/config/GbsUserSyncConfig.java b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/config/GbsUserSyncConfig.java new file mode 100644 index 0000000..c55033e --- /dev/null +++ b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/config/GbsUserSyncConfig.java @@ -0,0 +1,65 @@ +package org.qinan.safetyeval.adapter.config; + +import lombok.extern.slf4j.Slf4j; +import org.qinan.safetyeval.domain.exception.BizException; +import org.qinan.safetyeval.domain.exception.ErrorCode; +import org.qinan.safetyeval.infrastructure.adapter.auth.AuthUserContextAdapter; +import org.qinan.safetyeval.infrastructure.adapter.auth.AuthUserInfo; +import org.qinan.safetyeval.infrastructure.dataobject.AccountDO; +import org.qinan.safetyeval.infrastructure.mapper.AccountMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.method.HandlerMethod; +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; + +/** + * 本地联调:为免鉴权的企业信息接口注入默认用户上下文,供 MyMetaObjectHandler 填充 org_id / tenant_id。 + */ +@Configuration +@Slf4j +public class GbsUserSyncConfig implements WebMvcConfigurer { + + @Autowired + private AccountMapper accountMapper; + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new HandlerInterceptor() { + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + if (!(handler instanceof HandlerMethod)) { + return true; + } + AuthUserInfo currentUser = AuthUserContextAdapter.getCurrentUser(); + if (currentUser == null) { + throw new BizException(ErrorCode.GBS_USER_ERROR); + } + AccountDO accountDO = accountMapper.selectById(currentUser.getUserId()); + if (accountDO == null) { + // 用户没有gbs信息,自动填充一条数据类型默认监管端 + AccountDO accountSave = new AccountDO(); + accountSave.setId(currentUser.getUserId()); + accountSave.setUserName(currentUser.getUserName()); + accountSave.setAccount(currentUser.getAccount()); + accountSave.setPhone(currentUser.getMobile()); + accountSave.setTenantId(currentUser.getTenantId()); + accountSave.setType(2); + accountMapper.insert(accountSave); + log.info("用户{}同步gbs信息成功", currentUser.getUserName()); + } + return true; + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, + Object handler, Exception exception) { + + } + }).addPathPatterns("/**"); + } +} diff --git a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/AccountController.java b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/AccountController.java index bf709ef..eee6070 100644 --- a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/AccountController.java +++ b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/web/AccountController.java @@ -102,4 +102,10 @@ public class AccountController { return result; } + @ApiOperation("用户同步gbs") + @PostMapping("/syncUserToGBS") + public SingleResponse syncUserToGBS(@ApiParam("账号") @RequestParam String account) { + return accountApi.syncUserToGBS(account); + } + } diff --git a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/AccountExecutor.java b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/AccountExecutor.java index db11d48..efbbab3 100644 --- a/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/AccountExecutor.java +++ b/safety-eval-app/src/main/java/org/qinan/safetyeval/app/executor/AccountExecutor.java @@ -5,11 +5,7 @@ import com.zcloud.gbscommon.utils.MD5; import com.zcloud.gbscommon.utils.Sm2Util; import org.qinan.safetyeval.client.api.AccountApi; import org.qinan.safetyeval.client.co.AccountCO; -import org.qinan.safetyeval.client.dto.AccountAddCmd; -import org.qinan.safetyeval.client.dto.AccountModifyCmd; -import org.qinan.safetyeval.client.dto.AccountPageQuery; -import org.qinan.safetyeval.client.dto.PageResponse; -import org.qinan.safetyeval.client.dto.SingleResponse; +import org.qinan.safetyeval.client.dto.*; import org.qinan.safetyeval.domain.entity.AccountEntity; import org.qinan.safetyeval.domain.query.AccountQuery; import org.qinan.safetyeval.domain.query.PageResult; @@ -51,15 +47,6 @@ public class AccountExecutor implements AccountApi { entity.setProfileUrl(cmd.getProfileUrl()); entity.setType(cmd.getType()); AccountEntity result = accountDomainService.add(entity); - // 同步gbs用户 - UserAddCmd userAddCmd = new UserAddCmd(); - userAddCmd.setId(result.getId()); - userAddCmd.setAccount(result.getAccount()); - userAddCmd.setTenantId(result.getTenantId()); - userAddCmd.setName(result.getUserName()); - String encrypt = Sm2Util.encryptHex(MD5.md5(defPassword), publicKey); - userAddCmd.setPassword(encrypt); - gbsUserFacadeClient.add(userAddCmd); return SingleResponse.success(toCO(result)); } @@ -110,6 +97,21 @@ public class AccountExecutor implements AccountApi { pageResult.getTotal()); } + @Override + public SingleResponse syncUserToGBS(String account) { + AccountEntity result = accountDomainService.syncUserToGBS(account); + // 同步gbs用户 + UserAddCmd userAddCmd = new UserAddCmd(); + userAddCmd.setId(result.getId()); + userAddCmd.setAccount(result.getAccount()); + userAddCmd.setTenantId(result.getTenantId()); + userAddCmd.setName(result.getUserName()); + String encrypt = Sm2Util.encryptHex(MD5.md5(defPassword), publicKey); + userAddCmd.setPassword(encrypt); + gbsUserFacadeClient.add(userAddCmd); + return SingleResponse.success(toCO(result)); + } + private AccountCO toCO(AccountEntity entity) { if (entity == null) { return null; diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/AccountApi.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/AccountApi.java index 702015f..8473d7d 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/AccountApi.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/api/AccountApi.java @@ -23,4 +23,6 @@ public interface AccountApi { SingleResponse delete(Long id); PageResponse page(AccountPageQuery query); + + SingleResponse syncUserToGBS(String account); } diff --git a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/AccountAddCmd.java b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/AccountAddCmd.java index 4001348..a7e774a 100644 --- a/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/AccountAddCmd.java +++ b/safety-eval-client/src/main/java/org/qinan/safetyeval/client/dto/AccountAddCmd.java @@ -27,5 +27,5 @@ public class AccountAddCmd { private String profileUrl; @ApiModelProperty(value = "类型(1机构端2监管端)") - private Integer type; + private Integer type = 1; } diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/exception/ErrorCode.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/exception/ErrorCode.java index 77a9dc7..4170674 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/exception/ErrorCode.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/exception/ErrorCode.java @@ -95,6 +95,9 @@ public enum ErrorCode { */ SMS_SOURCE_CODE_NOT_EXIST("04-01-001", "短信码不存在"), + // gbs + GBS_USER_ERROR("04-01-001", "gbs用户未登录"), + /** * 未知错误 */ diff --git a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/AccountDomainService.java b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/AccountDomainService.java index 619bc1a..7dbc2a0 100644 --- a/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/AccountDomainService.java +++ b/safety-eval-domain/src/main/java/org/qinan/safetyeval/domain/service/AccountDomainService.java @@ -10,6 +10,7 @@ import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import javax.annotation.Resource; +import java.util.Objects; /** * 用户领域服务 @@ -61,4 +62,12 @@ public class AccountDomainService { throw new BizException(ErrorCode.ACCOUNT_EXISTS); } } + + public AccountEntity syncUserToGBS(String account) { + AccountEntity found = accountGateway.getByAccount(account); + if (Objects.isNull(found)) { + throw new BizException(ErrorCode.ACCOUNT_NOT_FOUND); + } + return found; + } } diff --git a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/adapter/auth/AuthUserInfo.java b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/adapter/auth/AuthUserInfo.java index 520d18e..6b6cb0d 100644 --- a/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/adapter/auth/AuthUserInfo.java +++ b/safety-eval-infrastructure/src/main/java/org/qinan/safetyeval/infrastructure/adapter/auth/AuthUserInfo.java @@ -15,6 +15,8 @@ public class AuthUserInfo { String userName; Long tenantId; Long orgId; + String mobile; + String account; public static AuthUserInfo from(SSOUser user) { if (user == null) { @@ -25,6 +27,8 @@ public class AuthUserInfo { .userName(user.getName()) .tenantId(user.getTenantId()) .orgId(user.getOrgId()) + .mobile(user.getMobile()) + .account(user.getAccount()) .build(); } }