From 433ec1f8b064b4ce863ce8dfda484cecf454341b Mon Sep 17 00:00:00 2001 From: sh Date: Sun, 16 Nov 2025 23:35:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=92=E8=81=94=E7=BD=91?= =?UTF-8?q?=E5=8D=95=E7=82=B9=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cms/service/CompanyContactService.java | 2 + .../impl/CompanyContactServiceImpl.java | 5 ++ .../com/ruoyi/cms/util/oauth/HttpUtils.java | 48 ++++++++++++++ .../com/ruoyi/cms/util/oauth/OauthClient.java | 66 ++++++++++++++++--- .../entity/tymh/wwToken/WwTokenResult.java | 3 + .../web/service/OauthLoginHlwService.java | 35 ++++++++-- 6 files changed, 142 insertions(+), 17 deletions(-) diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/CompanyContactService.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/CompanyContactService.java index bedfd33..bcb86d5 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/CompanyContactService.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/CompanyContactService.java @@ -16,5 +16,7 @@ public interface CompanyContactService { List getSelectList(CompanyContact companyContact); int insertUpadteCompanyContact(List list); + + int insertContact(CompanyContact contact); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/CompanyContactServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/CompanyContactServiceImpl.java index c8e592e..fc40dbe 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/CompanyContactServiceImpl.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/CompanyContactServiceImpl.java @@ -39,4 +39,9 @@ public class CompanyContactServiceImpl extends ServiceImpl> headers; // 响应头(key: 头名称,value: 多个值) + } + + // HttpUtils 中新增方法:发送 POST JSON 请求,返回响应体 + 响应头 + public static ResponseWrapper doPostJsonWithHeaders(String url, Map params, + int connectTimeout, int readTimeout, int writeTimeout) throws IOException { + String jsonParams = CollectionUtils.isEmpty(params) ? "{}" : JSON.toJSONString(params); + MediaType mediaType = MediaType.parse("application/json"); + RequestBody requestBody = RequestBody.create(mediaType, jsonParams); + + // 构建 OkHttpClient + OkHttpClient client = new OkHttpClient.Builder() + .connectTimeout(connectTimeout, TimeUnit.SECONDS) + .readTimeout(readTimeout, TimeUnit.SECONDS) + .writeTimeout(writeTimeout, TimeUnit.SECONDS) + .build(); + + // 构建请求 + Request request = new Request.Builder() + .url(url) + .post(requestBody) + .build(); + + // 执行请求,获取响应体和响应头 + try (Response response = client.newCall(request).execute()) { + String responseBody = response.body() != null ? response.body().string() : ""; + Map> headers = new HashMap<>(); + for (String headerName : response.headers().names()) { + headers.put(headerName, response.headers(headerName)); + } + + // 封装并返回 + ResponseWrapper wrapper = new ResponseWrapper(); + wrapper.setResponseBody(responseBody); + wrapper.setHeaders(headers); + return wrapper; + } + } + + /**************************增加获取cookie结束******************************/ } \ No newline at end of file diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/oauth/OauthClient.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/oauth/OauthClient.java index b6fac01..81afc98 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/oauth/OauthClient.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/oauth/OauthClient.java @@ -307,6 +307,37 @@ public class OauthClient { return (value instanceof JSONArray) ? (JSONArray) value : null; } + /** + * 从响应头中提取Cookie(工具方法) + */ + private String extractCookieFromHeaders(Map> headers) { + if (headers == null || headers.isEmpty()) { + log.warn("响应头为空,无法提取Cookie"); + return ""; + } + + List cookies = headers.get("Set-Cookie"); + if (cookies == null || cookies.isEmpty()) { + log.warn("响应头中未包含Set-Cookie信息"); + return ""; + } + + // 拼接Cookie(只保留name=value部分,忽略路径、过期时间等附加信息) + StringBuilder cookieSb = new StringBuilder(); + for (String cookie : cookies) { + if (cookieSb.length() > 0) { + cookieSb.append("; "); + } + int semicolonIndex = cookie.indexOf(';'); + if (semicolonIndex > 0) { + cookieSb.append(cookie.substring(0, semicolonIndex)); + } else { + cookieSb.append(cookie); + } + } + return cookieSb.toString(); + } + /** * 互联网-获取token * @param wwUserLogin @@ -337,36 +368,51 @@ public class OauthClient { params.put("logonchannel", wwUserLogin.getLogonchannel()); } - WwTokenResult tokenResult = executePostRequest( + // 发送请求并获取响应体+响应头(包含Cookie) + HttpUtils.ResponseWrapper responseWrapper = HttpUtils.doPostJsonWithHeaders( wwTokenPostUrl, params, - new TypeReference>() {}, - "获取互联网Token" + connectTimeout, + readTimeout, + writeTimeout + ); + + String responseJson = responseWrapper.getResponseBody(); + WwTokenResult tokenResult = validateResponse( + responseJson, + "获取互联网Token", + new TypeReference>() {} ); if (tokenResult == null) { log.error("获取互联网Token失败:接口返回业务数据为空"); throw new Exception("获取互联网Token失败:返回数据异常"); } - log.info("获取互联网Token成功 | username:{} | accessToken:{}", wwUserLogin.getUsername(), tokenResult); + + // 提取Cookie并设置到tokenResult中 + String cookie = extractCookieFromHeaders(responseWrapper.getHeaders()); + tokenResult.setSessionCookie(cookie); + + log.info("获取互联网Token及Cookie成功 | username:{} | accessToken:{} | cookie:{}", + wwUserLogin.getUsername(), tokenResult.getAccessToken(), cookie); + return tokenResult; } /** * 互联网-端根据token获取用户信息 - * @param token * @return * @throws IOException * @throws TimeoutException */ - public WwTyInfo wwGetUserInfo(String token) throws IOException, TimeoutException{ - if(StringUtils.isBlank(token)){ - throw new IllegalArgumentException("token不能为空"); + public WwTyInfo wwGetUserInfo(WwTokenResult wwTokenResult) throws IOException, TimeoutException{ + if(wwTokenResult==null){ + throw new IllegalArgumentException("wwTokenResult不能为空"); } //headers Map headers = new HashMap<>(); - headers.put("Access-Token", token); - headers.put("Content-Type", "application/json"); + headers.put("Access-Token", wwTokenResult.getAccessToken()); + headers.put("Cookie", wwTokenResult.getSessionCookie()); //parm Map params = new HashMap<>(0); diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/wwToken/WwTokenResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/wwToken/WwTokenResult.java index 43423e7..8dac7fa 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/wwToken/WwTokenResult.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/wwToken/WwTokenResult.java @@ -1,10 +1,13 @@ package com.ruoyi.common.core.domain.entity.tymh.wwToken; import com.alibaba.fastjson2.annotation.JSONField; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class WwTokenResult { @JSONField(name = "Access-Token") private String accessToken; + @ApiModelProperty("cookie") + private String sessionCookie; } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/OauthLoginHlwService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/OauthLoginHlwService.java index 109b890..d393c44 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/OauthLoginHlwService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/OauthLoginHlwService.java @@ -1,8 +1,11 @@ package com.ruoyi.framework.web.service; +import com.ruoyi.cms.service.CompanyContactService; +import com.ruoyi.cms.service.ICompanyService; import com.ruoyi.cms.util.StringUtil; import com.ruoyi.cms.util.oauth.OauthClient; import com.ruoyi.common.constant.Constants; +import com.ruoyi.common.core.domain.entity.Company; import com.ruoyi.common.core.domain.entity.CompanyContact; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.tymh.nwToken.PortalTokenCacheDTO; @@ -45,6 +48,11 @@ public class OauthLoginHlwService { private ISysUserService sysUserService; @Autowired private UserDetailsService userDetailsService; + @Autowired + private ICompanyService companyService; + @Autowired + private CompanyContactService companyContactService; + // Redis缓存:门户UserID → 若依本地用户名(避免重复匹配数据库) private static final String REDIS_KEY_PORTAL_USER_MAPPING = "hlw:user:mapping:"; // 门户 Token 存储前缀(Redis 键:门户 userId → 门户 Token 信息) @@ -69,7 +77,7 @@ public class OauthLoginHlwService { throw new ServiceException("获取门户 Token 失败:" + wwToken); } //获取门户userInfo - WwTyInfo portalUser = oauthClient.wwGetUserInfo(wwToken); + WwTyInfo portalUser = oauthClient.wwGetUserInfo(wwTokenResult); //匹配/创建本地用户 String localUsername = getOrCreateLocalUser(portalUser); //执行原来的登录流程 @@ -89,14 +97,22 @@ public class OauthLoginHlwService { * 匹配/创建本地用户,返回若依本地用户名 */ private String getOrCreateLocalUser(WwTyInfo wwTyInfo) { - SysUser localUser=sysUserService.selectUserByIdCard(wwTyInfo.getIdno()); + String idCard=""; + switch (wwTyInfo.getUsertype()){ + case "1"://个人 + idCard=wwTyInfo.getIdno(); + break; + default: + idCard=wwTyInfo.getEnterprisecode(); + } // 先从Redis查询缓存的本地用户名 - String cacheKey = REDIS_KEY_PORTAL_USER_MAPPING + localUser.getUserId(); + String cacheKey = REDIS_KEY_PORTAL_USER_MAPPING + idCard; String localUsername = redisCache.getCacheObject(cacheKey); if (StringUtils.isNotBlank(localUsername)) { return localUsername; } + SysUser localUser=sysUserService.selectUserByIdCard(wwTyInfo.getIdno()); if (localUser == null) { // 本地无用户,自动创建 localUser = createLocalUser(wwTyInfo); @@ -138,10 +154,15 @@ public class OauthLoginHlwService { newUser.setIdCard(wwTyInfo.getEnterprisecode()); newUser.setRoleIds(new Long[]{parseStringToLoing(StringUtil.SYS_QY)}); newUser.setUserName(wwTyInfo.getEnterprisename()); - //企业联系人 - CompanyContact companyContact=new CompanyContact(); - companyContact.setContactPerson(wwTyInfo.getContactperson()); - companyContact.setContactPersonPhone(wwTyInfo.getContactphone()); + //企业联系人->现根据社会信用代码查询企业信息 + Company company=companyService.queryCodeCompany(wwTyInfo.getEnterprisecode()); + if(company!=null){ + CompanyContact companyContact=new CompanyContact(); + companyContact.setContactPerson(wwTyInfo.getContactperson()); + companyContact.setContactPersonPhone(wwTyInfo.getContactphone()); + companyContact.setCompanyId(company.getCompanyId()); + companyContactService.insertContact(companyContact); + } } newUser.setPassword(SecurityUtils.encryptPassword("123456")); newUser.setDelFlag("0");