tao.mo

manager-server | 修改 |

FCL登录获取ean信息
mt
2025年5月27日17:10:40
......@@ -16,6 +16,12 @@ public class PropertiesConfig {
@Value("${fcl.interface.userinfo}")
private String userInfoUrl;
@Value("${fcl.interface.account}")
private String userAccountUrl;
@Value("${fcl.interface.shippingaccounts}")
private String userShippingaccountsUrl;
@Value("${fcl.login.redjrectLogin}")
private String redjrectLogin;
......
......@@ -140,6 +140,7 @@ public class SysAuthController extends BaseController implements ISysAuthControl
if (loginUser == null){
//如果用户不存在,则创建FCL用户信息
SysUserDto dto = new SysUserDto(fcl_uuid, fcl_contactname);
sysUserService.initUserInfo(fclInfoDto,dto);
loginUser = sysUserService.save(dto);
} else {
//首先对用户中的姓名进行解密
......@@ -158,6 +159,7 @@ public class SysAuthController extends BaseController implements ISysAuthControl
loginUser.setUserName(StringUtils.trimToEmpty(fcl_contactname));
}
loginUser.setModifyTime(new Date());
sysUserService.initUserInfo(fclInfoDto,loginUser);
sysUserService.update(loginUser);
}
}
......
......@@ -18,7 +18,9 @@ public class FclInfoDto {
//用户名称
String fclContactname;
//用户登录账号
private String userId;
String userId;
//用户邮箱
private String emailAddress;
String emailAddress;
//用户计费账号
String shipperAccounts;
}
......
package com.fedex.connect.manager.data.vo;
import lombok.Data;
@Data
public class EanTwoVo {
private String defaultEanInfo;
private String accountNumberInfo;
}
package com.fedex.connect.manager.data.vo;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* @Author mt
* @Description FCL接口获取用户信息-响应数据对象
* @Date 2025/5/27
*/
@Data
public class FCLAccountsResponseVo implements Serializable {
private String transactionId;
private OutPut output;
@Data
public static class OutPut implements Serializable{
List<FCLCustomerAccount> customerAccountList;
}
@Data
public static class FCLCustomerAccount implements Serializable{
private Account account;
private List<ActiveAppRoleInfo> activeAppRoleInfos;
}
/**
* 账号信息
*/
@Data
public static class Account implements Serializable{
private AccountIdentifier accountIdentifier;
}
@Data
public static class ActiveAppRoleInfo implements Serializable{
private String appName;
private String roleCode;
private Integer roleLevelCode;
}
@Data
public static class AccountIdentifier implements Serializable{
/**
* 账号对应EAN信息
*/
private AccountNumber accountNumber;
private String accountNickname;
private String displayName;
private Boolean meterNumberAvailable;
}
@Data
public static class AccountNumber implements Serializable{
private String value;
private String key;
}
}
......@@ -3,8 +3,10 @@ package com.fedex.connect.manager.data.vo;
import lombok.Data;
/**
* FCL接口获取token响应对象
*/
* @Author mt
* @Description FCL接口获取token响应对象
* @Date 2025/5/27
*/
@Data
public class FCLTokenResponseVo {
......
......@@ -13,7 +13,7 @@ import java.util.List;
* @Date 2025/5/26
*/
@Data
public class FCLUserInfoVo implements Serializable {
public class FCLUserInfoResponseVo implements Serializable {
private String transactionId;
private OutPut output;
......
package com.fedex.connect.manager.data.vo;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class FclEanTwoResponseVo implements Serializable{
private String transactionId;
private Output output;
@Data
public static class Output implements Serializable {
private Boolean success;
private List<AccountInfoVO> accountInfoVOs;
}
@Data
public static class AccountInfoVO implements Serializable {
private DefaultAccount defaultAccount;
private List<AssociatedAccount> associatedAccountList;
}
@Data
public static class DefaultAccount implements Serializable {
private String value;
private String key;
}
@Data
public static class AssociatedAccount implements Serializable {
private AccountNumber accountNumber;
private String accountNickname;
private String accountDisplayName;
}
@Data
public static class AccountNumber implements Serializable {
private String value;
private String key;
}
}
......@@ -2,6 +2,7 @@ package com.fedex.connect.manager.service.sys;
import com.fedex.connect.common.model.sys.User;
import com.fedex.connect.manager.data.bo.AddFlagBo;
import com.fedex.connect.manager.data.dto.FclInfoDto;
import com.fedex.connect.manager.data.dto.SysUserDto;
import javax.servlet.http.HttpServletRequest;
......@@ -19,4 +20,24 @@ public interface ISysUserService {
User findById(Long id);
void updateAddFlag(User user, AddFlagBo bo);
/**
* @Author mt
* @Description 构造用户信息
* @Date 2025/5/27
* @param fclInfoDto
* @param loginUser
* @return void
*/
void initUserInfo(FclInfoDto fclInfoDto,SysUserDto loginUser);
/**
* @Author mt
* @Description 构造用户信息
* @Date 2025/5/27
* @param fclInfoDto
* @param loginUser
* @return void
*/
void initUserInfo(FclInfoDto fclInfoDto, User loginUser);
}
......
......@@ -12,6 +12,7 @@ import com.fedex.connect.common.model.sys.User;
import com.fedex.connect.common.model.sys.UserExample;
import com.fedex.connect.manager.config.PropertiesConfig;
import com.fedex.connect.manager.data.bo.AddFlagBo;
import com.fedex.connect.manager.data.dto.FclInfoDto;
import com.fedex.connect.manager.data.dto.SysUserDto;
import com.fedex.connect.manager.data.model.LogShowModel;
import com.fedex.connect.manager.service.base.BaseService;
......@@ -216,5 +217,43 @@ public class SysUserServiceImpl extends BaseService implements ISysUserService {
userRepository.updateByPrimaryKeySelective(user);
}
/**
* @Author mt
* @Description 构造用户信息
* @Date 2025/5/27
* @param fclInfoDto
* @param loginUser
* @return void
*/
public void initUserInfo(FclInfoDto fclInfoDto,SysUserDto loginUser){
if (StringUtils.isNotEmpty(fclInfoDto.getUserId())){
loginUser.setLoginName(fclInfoDto.getUserId());
}
if(StringUtils.isNotEmpty(fclInfoDto.getEmailAddress())){
loginUser.setEmail(fclInfoDto.getEmailAddress());
}
if(StringUtils.isNotEmpty(fclInfoDto.getShipperAccounts())){
loginUser.setAccountNo(fclInfoDto.getShipperAccounts());
}
}
/**
* @Author mt
* @Description 构造用户信息
* @Date 2025/5/27
* @param fclInfoDto
* @param loginUser
* @return void
*/
public void initUserInfo(FclInfoDto fclInfoDto,User loginUser){
if (StringUtils.isNotEmpty(fclInfoDto.getUserId())){
loginUser.setLoginName(fclInfoDto.getUserId());
}
if(StringUtils.isNotEmpty(fclInfoDto.getEmailAddress())){
loginUser.setEmail(fclInfoDto.getEmailAddress());
}
if(StringUtils.isNotEmpty(fclInfoDto.getShipperAccounts())){
loginUser.setAccountNo(fclInfoDto.getShipperAccounts());
}
}
}
......
......@@ -4,9 +4,7 @@ import com.alibaba.fastjson.JSON;
import com.fedex.connect.manager.common.enums.FCLSessionInfoEnum;
import com.fedex.connect.manager.config.PropertiesConfig;
import com.fedex.connect.manager.data.dto.FclInfoDto;
import com.fedex.connect.manager.data.vo.FCLTokenResponseVo;
import com.fedex.connect.manager.data.vo.FCLUserInfoVo;
import com.fedex.connect.manager.data.vo.UserDataApiVo;
import com.fedex.connect.manager.data.vo.*;
import com.google.gson.JsonObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
......@@ -19,6 +17,7 @@ import org.springframework.web.client.RestTemplate;
import java.net.URLDecoder;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Author mt
......@@ -36,34 +35,52 @@ public class LoginControllerUtils {
@Autowired
private PropertiesConfig propertiesConfig;
private HttpEntity<String> initHeader(String secretValue,String fdxLogin){
FCLTokenResponseVo fclInterfaceToken = this.getFclInterfaceToken();
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", fclInterfaceToken.getAuthorization());
List<String> cookieList = new ArrayList<>();
if (StringUtils.isNotBlank(fdxLogin)) {
cookieList.add("fdx_login=" + fdxLogin);
}
if (StringUtils.isNotBlank(secretValue)){
cookieList.add(secretValue);
}
headers.set("Cookie", StringUtils.join(cookieList, ";"));
HttpEntity<String> entity = new HttpEntity("", headers);
log.info("apiExchange | entity: {}", JSON.toJSONString(entity));
return entity;
}
public FclInfoDto getFclInfo(JsonObject tokenInfo){
FclInfoDto fclInfoDto = new FclInfoDto();
String secretValue;
String fdxLogin;
HttpEntity<String> entity = null;
try {
/**
* 获取认证oauth
*/
secretValue = this.getOauthSecret(tokenInfo);
/**
* 获取fdxInfo信息
*/
fdxLogin = this.getFdxLogin(tokenInfo);
FCLTokenResponseVo fclInterfaceToken = this.getFclInterfaceToken();
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", fclInterfaceToken.getAuthorization());
List<String> cookieList = new ArrayList<>();
if (StringUtils.isNotBlank(fdxLogin)) {
cookieList.add("fdx_login=" + fdxLogin);
}
if (StringUtils.isNotBlank(secretValue)){
cookieList.add(secretValue);
}
headers.set("Cookie", StringUtils.join(cookieList, ";"));
HttpEntity<String> entity = new HttpEntity("", headers);
log.info("apiExchange | entity: {}", JSON.toJSONString(entity));
/**
* 构造请求头
*/
entity = this.initHeader(secretValue,fdxLogin);
ResponseEntity<String> resp = restTemplate.exchange(propertiesConfig.getUserInfoUrl(), HttpMethod.GET, entity, String.class);
log.info("apiExchange | resp: {}", JSON.toJSONString(resp));
String body = resp.getBody();
FCLUserInfoVo fclUserInfoResponse = JSON.parseObject(body, FCLUserInfoVo.class);
FCLUserInfoResponseVo fclUserInfoResponse = JSON.parseObject(body, FCLUserInfoResponseVo.class);
//获取email和userId
UserDataApiVo userDataApiVo = this.createUserDataApiVo(fclUserInfoResponse);
fclInfoDto.setFclContactname(userDataApiVo.getUserName());
String fcl_uuid = this.getUuid(tokenInfo,userDataApiVo.getUuid());
/**
* 对用户名进行解码处理
*/
String fcl_contactname = this.decodeMultiLevelUrl(this.getFclContactName(tokenInfo,userDataApiVo.getUserName()));
fclInfoDto.setFclUuid(fcl_uuid);
fclInfoDto.setFclContactname(fcl_contactname);
......@@ -72,45 +89,200 @@ public class LoginControllerUtils {
fclInfoDto.setUserId(userDataApiVo.getUserId());
fclInfoDto.setEmailAddress(userDataApiVo.getEmailAddress());
}catch(Exception ex){
log.error("apiExchange | fdxLogin: {}, secretValue: {} url: {}, userId: {} |具体原因: "
log.error("getFclInfo | fdxLogin: {}, secretValue: {} url: {}, userId: {} |具体原因: "
, fclInfoDto.getFdxLogin(), fclInfoDto.getOAuthSecret(), propertiesConfig.getUserInfoUrl(),fclInfoDto.getUserId());
ex.printStackTrace();
}finally{
/**
* 获取用户计费账号
*/
String shipperAccount = this.getShipperAccount(entity,fclInfoDto);
fclInfoDto.setShipperAccounts(shipperAccount);
}
return fclInfoDto;
}
/**
* @Author mt
* @Description 调用接口获取用户计费账号
* @Date 2025/5/27
* @param entity
* @param fclInfoDto
* @return java.lang.String
*/
private String getShipperAccount(HttpEntity<String> entity,FclInfoDto fclInfoDto){
if(Objects.isNull(entity)){
return "";
}
/**
* 将连个接口的EAN拆分后去重再合并
*/
String shipperAccountApi1 = null;
String shipperAccountApi2 = null;
/**
* 获取shipperAccount接口1: /administration/v1/users/shippingaccounts
*/
try{
ResponseEntity<String> resp = restTemplate.exchange(propertiesConfig.getUserShippingaccountsUrl(), HttpMethod.GET, entity, String.class);
FclEanTwoResponseVo fclAccountsResponse = JSON.parseObject(resp.getBody(), FclEanTwoResponseVo.class);
EanTwoVo eanInfo = this.getEanByEanTwoApi(fclAccountsResponse);
String ext1 = eanInfo.getDefaultEanInfo();
String ext2 = eanInfo.getAccountNumberInfo();
shipperAccountApi1 = (StringUtils.isNotEmpty(ext1) && StringUtils.isNotEmpty(ext2)) ? ext1 + "," + ext2 :
(StringUtils.isNotEmpty(ext1) ? ext1 : (StringUtils.isNotEmpty(ext2) ? ext2 : ""));
}catch(Exception ex){
log.error("getShipperAccount api1 | fdxLogin: {}, secretValue: {} url: {}, userId: {} |具体原因: "
, fclInfoDto.getFdxLogin(), fclInfoDto.getOAuthSecret(), propertiesConfig.getUserInfoUrl(),fclInfoDto.getUserId());
ex.printStackTrace();
}
/**
* 补偿shipperAccount
* 获取shipperAccount接口2:/user/v2/accounts
*/
try{
ResponseEntity<String> resp = restTemplate.exchange(propertiesConfig.getUserAccountUrl(), HttpMethod.GET, entity, String.class);
FCLAccountsResponseVo fclAccountsResponseVo = JSON.parseObject(resp.getBody(), FCLAccountsResponseVo.class);
shipperAccountApi2 = this.getEANInfo(fclAccountsResponseVo);
}catch(Exception ex){
log.error("getShipperAccount api2 | fdxLogin: {}, secretValue: {} url: {}, userId: {} |具体原因: "
, fclInfoDto.getFdxLogin(), fclInfoDto.getOAuthSecret(), propertiesConfig.getUserInfoUrl(),fclInfoDto.getUserId());
ex.printStackTrace();
}
/**
* 将连个接口的EAN拆分后去重再合并
*/
String userEANNumber = this.getUniqueStr(shipperAccountApi1,shipperAccountApi2);
return userEANNumber;
}
/**
* @Author mt
* @Description 将拼接好的两个EAN结果分割后去重再拼接
* @Date 2025/5/27
* @param eanOneExt1
* @param eanTwoExt1
* @return java.lang.String
*/
public String getUniqueStr(String eanOneExt1,String eanTwoExt1){
String userEANNumber = null;
try {
// 创建一个Set用于去重
Set<String> uniqueElements = new HashSet<>();
// 将eanOneExt1按逗号分割并添加到Set中
if (StringUtils.isNotEmpty(eanOneExt1)) {
String[] eanOneElements = eanOneExt1.split(",");
for (String element : eanOneElements) {
uniqueElements.add(element.trim());
}
}
// 将eanTwoExt1按逗号分割并添加到Set中
if (StringUtils.isNotEmpty(eanTwoExt1)) {
String[] eanTwoElements = eanTwoExt1.split(",");
for (String element : eanTwoElements) {
uniqueElements.add(element.trim());
}
}
// 将List中的元素用逗号分隔符拼接成一个字符串
userEANNumber = String.join(",", uniqueElements);
}catch (Exception e){
log.error("getUniqueStr | eanOneExt1 : {} | eanTwoExt1 : {} | 具体原因: ", eanOneExt1, eanTwoExt1,e);
}
return userEANNumber;
}
/**
* @Author mt
* @Description 获取用户EAN信息-合并返回
* @Date 2025/5/27
* @param fclAccountsResponseVo
* @return java.lang.String
*/
private String getEANInfo(FCLAccountsResponseVo fclAccountsResponseVo){
List<String> eanNumberList = new ArrayList();
FCLAccountsResponseVo.OutPut output = fclAccountsResponseVo.getOutput();
List<FCLAccountsResponseVo.FCLCustomerAccount> customerAccountList = output.getCustomerAccountList();
for (int i = 0, maxi = customerAccountList.size(); i < maxi; i++) {
FCLAccountsResponseVo.FCLCustomerAccount fclCustomerAccount = customerAccountList.get(i);
String eanNumber = fclCustomerAccount.getAccount().getAccountIdentifier().getAccountNumber().getValue();
if(StringUtils.isNotEmpty(eanNumber)){
eanNumberList.add(eanNumber);
}
}
return StringUtils.join(eanNumberList, ",");
}
/**
* @Author mt
* @Description 根据EAN2号接口返回值获取EAN number
* @Date 2025/5/27
* @param body
* @return EanTwoVo
*/
public EanTwoVo getEanByEanTwoApi(FclEanTwoResponseVo body) {
EanTwoVo eanTwoVo = new EanTwoVo();
String defaultEanInfo = null;
String accountNumberInfo = null;
FclEanTwoResponseVo.Output output = body != null ? body.getOutput() : null;
if (output != null) {
List<FclEanTwoResponseVo.AccountInfoVO> accountInfoVOs = output.getAccountInfoVOs();
if (accountInfoVOs != null && !accountInfoVOs.isEmpty()) {
FclEanTwoResponseVo.AccountInfoVO accountInfoVO = accountInfoVOs.get(0);
//defaultEanInfo
FclEanTwoResponseVo.DefaultAccount defaultAccount = accountInfoVO.getDefaultAccount();
if (defaultAccount != null) {
defaultEanInfo = defaultAccount.getValue();
}
//accountNumberInfo
List<FclEanTwoResponseVo.AssociatedAccount> associatedAccountList = accountInfoVO.getAssociatedAccountList();
if (associatedAccountList != null && !associatedAccountList.isEmpty()) {
accountNumberInfo = associatedAccountList.stream()
.map(FclEanTwoResponseVo.AssociatedAccount::getAccountNumber)
.filter(Objects::nonNull)
.map(FclEanTwoResponseVo.AccountNumber::getValue)
.filter(value -> StringUtils.isNotEmpty(value))
.collect(Collectors.joining(","));
}
}
}
eanTwoVo.setDefaultEanInfo(defaultEanInfo);
eanTwoVo.setAccountNumberInfo(accountNumberInfo);
return eanTwoVo;
}
/**
* @Author mt
* @Description 构建获取用户信息Vo
* @Date 2025/5/26
* @param fclUserInfoResponse
* @return com.fedex.connect.manager.data.vo.UserDataApiVo
*/
public UserDataApiVo createUserDataApiVo(FCLUserInfoVo fclUserInfoResponse) {
FCLUserInfoVo.UserProfile userProfile = fclUserInfoResponse.getOutput().getUserProfile();
public UserDataApiVo createUserDataApiVo(FCLUserInfoResponseVo fclUserInfoResponse) {
FCLUserInfoResponseVo.UserProfile userProfile = fclUserInfoResponse.getOutput().getUserProfile();
Optional<String> userId = Optional.ofNullable(userProfile)
.map(FCLUserInfoVo.UserProfile::getLoginInformation)
.map(FCLUserInfoVo.LoginInformation::getUserId);
.map(FCLUserInfoResponseVo.UserProfile::getLoginInformation)
.map(FCLUserInfoResponseVo.LoginInformation::getUserId);
Optional<String> emailAddress = Optional.ofNullable(userProfile)
.map(FCLUserInfoVo.UserProfile::getUserProfileAddress)
.map(FCLUserInfoVo.UserProfileAddress::getContact)
.map(FCLUserInfoVo.Contact::getEmailAddress)
.map(FCLUserInfoResponseVo.UserProfile::getUserProfileAddress)
.map(FCLUserInfoResponseVo.UserProfileAddress::getContact)
.map(FCLUserInfoResponseVo.Contact::getEmailAddress)
.filter(email -> !email.isEmpty());
Optional<String> uuid = Optional.ofNullable(userProfile)
.map(FCLUserInfoVo.UserProfile :: getUuid);
.map(FCLUserInfoResponseVo.UserProfile :: getUuid);
Optional<String> firstNameOpt = Optional.ofNullable(userProfile)
.map(FCLUserInfoVo.UserProfile::getUserProfileAddress)
.map(FCLUserInfoVo.UserProfileAddress::getContact)
.map(FCLUserInfoVo.Contact::getPersonName)
.map(FCLUserInfoResponseVo.UserProfile::getUserProfileAddress)
.map(FCLUserInfoResponseVo.UserProfileAddress::getContact)
.map(FCLUserInfoResponseVo.Contact::getPersonName)
.map(personName -> personName.getFirstName());
Optional<String> lastNameOpt = Optional.ofNullable(userProfile)
.map(FCLUserInfoVo.UserProfile::getUserProfileAddress)
.map(FCLUserInfoVo.UserProfileAddress::getContact)
.map(FCLUserInfoVo.Contact::getPersonName)
.map(FCLUserInfoResponseVo.UserProfile::getUserProfileAddress)
.map(FCLUserInfoResponseVo.UserProfileAddress::getContact)
.map(FCLUserInfoResponseVo.Contact::getPersonName)
.map(personName -> personName.getLastName());
String userName = null;
if (firstNameOpt.isPresent() && lastNameOpt.isPresent()){
......
......@@ -47,5 +47,7 @@ fcl:
scope: oob
account:
url: /user/v2/accounts
shippingaccounts:
url: /administration/v1/users/shippingaccounts
userinfo:
url: /user/v2/users/userinfo
\ No newline at end of file
......
......@@ -40,5 +40,7 @@ fcl:
scope: oob
account:
url: /user/v2/accounts
shippingaccounts:
url: /administration/v1/users/shippingaccounts
userinfo:
url: /user/v2/users/userinfo
\ No newline at end of file
......
......@@ -41,5 +41,7 @@ fcl:
scope: oob
account:
url: /user/v2/accounts
shippingaccounts:
url: /administration/v1/users/shippingaccounts
userinfo:
url: /user/v2/users/userinfo
\ No newline at end of file
......
......@@ -40,5 +40,7 @@ fcl:
scope: oob
account:
url: /user/v2/accounts
shippingaccounts:
url: /administration/v1/users/shippingaccounts
userinfo:
url: /user/v2/users/userinfo
\ No newline at end of file
......