diff --git a/README.md b/README.md index 63c006a84f942a5393b7d1cc14ee1979241ba752..63d9478586ceec37418112d01d83e718a5eae5e2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 开放平台客开场景接口调用示例 +# 开放平台客开场景-单点登录调用示例 ## 一、框架介绍 @@ -11,7 +11,8 @@ com/yonyou/openapi │ ├── exception # 异常处理 │ ├── properties # 配置文件 │ ├── response # 接口响应实体 -├── configure # base实现类注入 +├── configure # base实现类注入 +├── event # 事件订阅,业务实现 ├── service # 业务实现可在此包中编写 ``` @@ -24,11 +25,16 @@ com/yonyou/openapi #获取租户所在数据中心域名 ucf.mdd.open-api.gateway-address-url=https://apigateway.yonyoucloud.com/open-auth/dataCenter/getGatewayAddress?tenantId=%s +# 友互通地址 +ucf.mdd.open-api.sso-yht-url = https://euc.yonyoucloud.com + +# TODO:集成认证中心编码 +ucf.mdd.open-api.third-uc-id = qv4***vc # TODO:租户id -ucf.mdd.open-api.tenantId = rybentc5 -# TODO:应用信息 -ucf.mdd.open-api.app-key=b7966b8ee1e04c62bf7b21c261d6a64 -ucf.mdd.open-api.app-secret=8190bccf4261e029784d1482dac4ab915ec4696 +ucf.mdd.open-api.tenantId = lme***5m +# TODO:应用信息------------begin +ucf.mdd.open-api.app-key=d8e643e740***************d95d4fedf +ucf.mdd.open-api.app-secret=4a7b9760d4ac8***************c7988e703 ``` @@ -39,6 +45,14 @@ com.yonyou.openapi.service.TokenProviderImpl 建议对多数据中心响应的域名地址信息和token做缓存处理, 目前默认使用的是caffeine,您也可以根据需求重新实现该类 +### 2.3、测试用例 + +| **类及方法** | **描述** | +|----------|----------------------------------------------| +| com.yonyou.openapi.sso.SSO_Index_Test.list | 单点登录至工作台首页 | +| com.yonyou.openapi.sso.SSO_URL_Test.ssoUrl | 单点指定页面,常用于待办被集成,三方打开YonBIP/YonSuite审批页面做审批操作 | +| com.yonyou.openapi.sso.SSO_ServiceCode_Test.ssoNode | 单点指定页面,根据serviceCode单点指定页面,适用于平台统一框架的页面 | + diff --git a/src/main/java/com/yonyou/openapi/base/auth/network/cryptor/ISVRequestCrypto.java b/src/main/java/com/yonyou/openapi/base/auth/network/cryptor/ISVRequestCrypto.java index 247636d7ec991c374fc7f27f0ec1bc236dd7503f..b9e2dc609ad027affcc39a1dbdc1977d6d0d2d9e 100644 --- a/src/main/java/com/yonyou/openapi/base/auth/network/cryptor/ISVRequestCrypto.java +++ b/src/main/java/com/yonyou/openapi/base/auth/network/cryptor/ISVRequestCrypto.java @@ -1,7 +1,7 @@ package com.yonyou.openapi.base.auth.network.cryptor; -import com.fasterxml.jackson.databind.ObjectMapper; import com.yonyou.openapi.base.exception.BusinessException; +import com.yonyou.openapi.base.utils.JacksonUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomStringUtils; @@ -16,7 +16,6 @@ import java.util.Base64; @Slf4j public class ISVRequestCrypto { - private ObjectMapper objectMapper = new ObjectMapper(); private static final Charset CHARSET = StandardCharsets.UTF_8; private final byte[] aesKey; @@ -267,7 +266,7 @@ public class ISVRequestCrypto { } public EncryptionHolder jsonToHolder(String jsonStr) { - return objectMapper.convertValue(jsonStr, EncryptionHolder.class); + return JacksonUtils.toJavaObject(jsonStr, EncryptionHolder.class); } /** diff --git a/src/main/java/com/yonyou/openapi/base/auth/network/cryptor/ISVRequestCryptoSHA256.java b/src/main/java/com/yonyou/openapi/base/auth/network/cryptor/ISVRequestCryptoSHA256.java index ff9a29db99959cd65b6e087e6cba4945875a8528..2fd48d6e626fa76c5af0b8746656aa8b888dfd59 100644 --- a/src/main/java/com/yonyou/openapi/base/auth/network/cryptor/ISVRequestCryptoSHA256.java +++ b/src/main/java/com/yonyou/openapi/base/auth/network/cryptor/ISVRequestCryptoSHA256.java @@ -1,8 +1,7 @@ package com.yonyou.openapi.base.auth.network.cryptor; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import com.yonyou.openapi.base.exception.BusinessException; +import com.yonyou.openapi.base.utils.JacksonUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,8 +29,6 @@ public class ISVRequestCryptoSHA256 { private static Charset CHARSET = Charset.forName("utf-8"); - private static ObjectMapper mapper = new ObjectMapper(); - private byte[] aesKey; private String token; @@ -293,20 +290,11 @@ public class ISVRequestCryptoSHA256 { } public String holderToJsonStr(EncryptionHolder holder) throws BusinessException { - try { - return mapper.writeValueAsString(holder); - } catch (JsonProcessingException e) { - LOGGER.error("加密消息序列化失败"); - throw new BusinessException(ErrorCode.ENCRYPT_MESSAGE_SERIALIZE_FAILED.getCode(), e); - } + return JacksonUtils.toJSONString(holder); } public EncryptionHolder jsonToHolder(String jsonStr) throws BusinessException { - try { - return mapper.readValue(jsonStr, EncryptionHolder.class); - } catch (IOException e) { - throw new BusinessException(ErrorCode.ENCRYPT_MESSAGE_DESERIALIZE_FAILED.getCode(), e); - } + return JacksonUtils.toJavaObject(jsonStr, EncryptionHolder.class); } } diff --git a/src/main/java/com/yonyou/openapi/base/event/impl/ReceivedEventDispatcherImpl.java b/src/main/java/com/yonyou/openapi/base/event/impl/ReceivedEventDispatcherImpl.java index 7feba3c0c4f9e655adcab2b3b363bf65c983c265..fb4222389dfae311c48e5b794bf704aa2ce55f48 100644 --- a/src/main/java/com/yonyou/openapi/base/event/impl/ReceivedEventDispatcherImpl.java +++ b/src/main/java/com/yonyou/openapi/base/event/impl/ReceivedEventDispatcherImpl.java @@ -1,10 +1,10 @@ package com.yonyou.openapi.base.event.impl; -import com.fasterxml.jackson.databind.ObjectMapper; import com.yonyou.openapi.base.auth.network.cryptor.EncryptionHolder; import com.yonyou.openapi.base.event.EventListener; import com.yonyou.openapi.base.event.ReceivedEventDispatcher; import com.yonyou.openapi.base.event.pojo.Event; +import com.yonyou.openapi.base.utils.JacksonUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; @@ -22,7 +22,6 @@ public class ReceivedEventDispatcherImpl implements ReceivedEventDispatcher { private final ApplicationContext applicationContext; private List listeners; - private ObjectMapper objectMapper = new ObjectMapper(); @Override public List findEventListens() { @@ -45,7 +44,7 @@ public class ReceivedEventDispatcherImpl implements ReceivedEventDispatcher { continue; } Class eventClass = listener.getEventClass(); - boolean isContinue = listener.onEvent(event.getType(), objectMapper.readValue(source, eventClass), holder); + boolean isContinue = listener.onEvent(event.getType(), JacksonUtils.toJavaObject(source, eventClass), holder); if (!isContinue) { log.warn("listener {} want to stop event processing", listener.getClass()); return; diff --git a/src/main/java/com/yonyou/openapi/service/BaseOpenApi.java b/src/main/java/com/yonyou/openapi/base/sso/BaseOpenApi.java similarity index 93% rename from src/main/java/com/yonyou/openapi/service/BaseOpenApi.java rename to src/main/java/com/yonyou/openapi/base/sso/BaseOpenApi.java index 429dab7a6305d781f26e6dfc9a70031d0ca48dd5..0d8d17ff94105e746f0d9223439b7f76b3f1071a 100644 --- a/src/main/java/com/yonyou/openapi/service/BaseOpenApi.java +++ b/src/main/java/com/yonyou/openapi/base/sso/BaseOpenApi.java @@ -1,12 +1,12 @@ -package com.yonyou.openapi.service; +package com.yonyou.openapi.base.sso; -import com.fasterxml.jackson.databind.ObjectMapper; import com.yonyou.openapi.base.auth.TenantAuthProvider; import com.yonyou.openapi.base.datacenter.DataCenterUrlProvider; import com.yonyou.openapi.base.exception.BusinessException; import com.yonyou.openapi.base.properties.OpenApiProperties; import com.yonyou.openapi.base.response.OpenApiAccessToken; import com.yonyou.openapi.base.response.OpenApiResponse; +import com.yonyou.openapi.base.utils.JacksonUtils; import com.yonyou.openapi.base.utils.ReSubmitUtil; import com.yonyou.openapi.base.utils.RequestUtil; import lombok.Getter; @@ -25,7 +25,6 @@ import java.util.Map; @Component public class BaseOpenApi { - private ObjectMapper objectMapper = new ObjectMapper(); @Resource TenantAuthProvider tenantAuthProvider; @Resource @@ -64,7 +63,7 @@ public class BaseOpenApi { throw new BusinessException("unexpected response null when request open api isv access token"); } body.check(); - log.info(objectMapper.writeValueAsString(body)); + log.info(JacksonUtils.toJSONString(body)); return body.getData(); } diff --git a/src/main/java/com/yonyou/openapi/base/sso/pojo/ApiDataResponse.java b/src/main/java/com/yonyou/openapi/base/sso/pojo/ApiDataResponse.java new file mode 100644 index 0000000000000000000000000000000000000000..eb0a356ac7bdda74abac858a27c2e5aac3305f5d --- /dev/null +++ b/src/main/java/com/yonyou/openapi/base/sso/pojo/ApiDataResponse.java @@ -0,0 +1,14 @@ +package com.yonyou.openapi.base.sso.pojo; + + +import com.yonyou.openapi.base.response.OpenApiResponse; + +import java.util.Map; + +/** + * @description: 接口响应数据解析 + * @author: nishch + * @create: 2021-02-26 + **/ +public class ApiDataResponse extends OpenApiResponse> { +} diff --git a/src/main/java/com/yonyou/openapi/base/sso/pojo/ThirdUserBo.java b/src/main/java/com/yonyou/openapi/base/sso/pojo/ThirdUserBo.java new file mode 100644 index 0000000000000000000000000000000000000000..0655071d808eae94b2f2b3b52140a14b150247e3 --- /dev/null +++ b/src/main/java/com/yonyou/openapi/base/sso/pojo/ThirdUserBo.java @@ -0,0 +1,61 @@ +package com.yonyou.openapi.base.sso.pojo; + +import lombok.Data; + +/** + * @description: 第三方用户同用友用户关联实体 + * @author: nishch + * @create: 2021-07-07 + **/ +@Data +public class ThirdUserBo { + + private String thirdUcId; //集成认证应用编码 + private String userId; //第三方用户id + private String mobile; //第三方手机号 + private String email; //第三方邮箱 + private String userName; //第三方用户名 + private String userCode; //第三方用户编码 + //单点到指定节点需要用到------------------------ + private String tenantId; //要登录的租户id + private String serviceCode; //单点节点的serviceCode + private String targetUrl; //目标地址,mUrl或者webUrl + + + public ThirdUserBo() { + + } + + public ThirdUserBo(String thirdUcId, String userId) { + this.thirdUcId = thirdUcId; + this.userId = userId; + } + + public ThirdUserBo(String thirdUcId, String userId, String userName, String userCode) { + this.thirdUcId = thirdUcId; + this.userId = userId; + this.userName = userName; + this.userCode = userCode; + } + + public ThirdUserBo(String thirdUcId, String userId, String userName, String userCode, String mobile, String email) { + this.thirdUcId = thirdUcId; + this.userId = userId; + this.mobile = mobile; + this.email = email; + this.userName = userName; + this.userCode = userCode; + } + + + public ThirdUserBo(String thirdUcId, String userId, String userName, String userCode, String serviceCode, String mobile, String email) { + this.thirdUcId = thirdUcId; + this.userId = userId; + this.mobile = mobile; + this.email = email; + this.userName = userName; + this.userCode = userCode; + this.serviceCode = serviceCode; + } + +} diff --git a/src/main/java/com/yonyou/openapi/base/sso/sso/SingleSignOn.java b/src/main/java/com/yonyou/openapi/base/sso/sso/SingleSignOn.java new file mode 100644 index 0000000000000000000000000000000000000000..48adb4556989e0cccdba33b2ead3061078118da7 --- /dev/null +++ b/src/main/java/com/yonyou/openapi/base/sso/sso/SingleSignOn.java @@ -0,0 +1,157 @@ +package com.yonyou.openapi.base.sso.sso; + + +import com.yonyou.openapi.base.sso.BaseOpenApi; +import com.yonyou.openapi.base.sso.pojo.ApiDataResponse; +import com.yonyou.openapi.base.sso.pojo.ThirdUserBo; +import com.yonyou.openapi.base.exception.BusinessException; +import com.yonyou.openapi.base.properties.OpenApiProperties; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + + +/** + * @description: 单点登录 + * @author: nishch + * @create: 2021-07-07 + **/ +@Component +public class SingleSignOn extends BaseOpenApi { + + //获取临时code + private final static String sso_code = "/yonbip/yht/getThirdLoginCode"; + //单点登录拼接地址 + private final static String open_ys_url = "%s/cas/thirdOauth2CodeLogin?thirdUCId=%s&code=%s&service=%s"; + @Resource + public OpenApiProperties properties; + private ThirdUserBo thirdUserBo = new ThirdUserBo(); + + public ThirdUserBo init(String userId){ + thirdUserBo.setUserId(userId); + thirdUserBo.setThirdUcId(properties.getThirdUcId()); + return thirdUserBo; + } + + /** + * 获取登录到控制台的地址 + * @param entity 第三方用户信息 + * @return 最终实现单点的地址 + */ + public String getSSOUrlToIndex(ThirdUserBo entity){ + String code = getCode(entity); + String thirdUCId = entity.getThirdUcId(); + return String.format(open_ys_url,properties.getSsoYhtUrl(),thirdUCId,code,encode(getAccess_tet(),true)); + } + + /** + * 获取登录到指定页面 --- 根据serviceCode跳转 + * @param entity 第三方用户信息 + * @return 最终实现单点的地址 + */ + public String getSSOUrlToNode(ThirdUserBo entity) throws Exception { + return getString(entity, String.format(getAccess_tet_node(), entity.getServiceCode()), false); + } + + + /** + * 获取登录到指定页面 --- url只填写路径,域名信息取对应数据中心 + * @param entity 第三方用户信息 + * @param url 要跳转的真实地址 + * @return 最终实现单点的地址 + */ + public String getSSOUrlToUrl(ThirdUserBo entity,String url){ + return getString(entity, getBaseUrl()+url, false); + } + + + /** + * 获取登录到指定页面 ----完整地址 + * @param entity 第三方用户信息 + * @param url 要跳转的真实地址 + * @return 最终实现单点的地址 + */ + public String getSSOUrlToUrl2(ThirdUserBo entity,String url){ + return getString(entity, url, false); + } + + + /** + * 待办被集成 ---- 用于待办被集成,拼接租户ID,避免跳转找不到数据. + * @param entity 第三方用户信息 + * @param url 要跳转的真实地址 + * @return 最终实现单点的地址 + */ + public String getSSOUrlToDO(ThirdUserBo entity,String url){ + return getString(entity, url, true); + } + + private String getString(ThirdUserBo entity, String url, boolean b) { + entity.setThirdUcId(properties.getThirdUcId()); + String code = getCode(entity); + String thirdUCId = properties.getThirdUcId(); + String node = encode(url, b); + String nodeUrl = getAccess_tet()+"?tenantId="+properties.getTenantId()+"&service="+node; + return String.format(open_ys_url,properties.getSsoYhtUrl(),thirdUCId,code,encode(nodeUrl,true)); + } + + /** + * 单点至控制台 + * @return String 目标路径 + */ + private String getAccess_tet() { + return getBaseUrl()+ "/login"; + } + + /** + * 单点至指定节点 + * @return String 目标路径 + */ + private String getAccess_tet_node() { + return getBaseUrl()+ "/?effect=headless#/service/%s"; + } + + + /** + * 获取免登code + * @param entity 第三方用户信息 + * @return code + * @throws BusinessException 接口返回异常 + */ + private String getCode(ThirdUserBo entity){ + if(null==entity|| StringUtils.isBlank(entity.getThirdUcId()) || StringUtils.isBlank(entity.getUserId())){ + throw new BusinessException("用户参数不全"); + } + ApiDataResponse apiDataResponse = postForEntity(sso_code,entity, ApiDataResponse.class); + return getData(apiDataResponse).get("code").toString(); + } + + private String encode(String url,boolean isNeedTenantId){ + try { + if(isNeedTenantId){ + if(StringUtils.contains(url,"?")){ + return URLEncoder.encode(url + "&tenantId=" + properties.getTenantId(), StandardCharsets.UTF_8.toString()); + }else { + return URLEncoder.encode(url + "?tenantId=" + properties.getTenantId(), StandardCharsets.UTF_8.toString()); + } + }else { + return URLEncoder.encode(url,StandardCharsets.UTF_8.toString()); + } + }catch (Exception e){ + throw new BusinessException("url转义异常:"+url); + } + } + + /** + * 获取基础域名 + * @return 基础域名 + */ + private String getBaseUrl(){ + String businessUrl = dataCenterUrlProvider.buildBusinessUrl(); + return businessUrl.split("/iuap-api-gateway")[0]; + } + +} diff --git a/src/main/java/com/yonyou/openapi/base/utils/JSONConvertUtil.java b/src/main/java/com/yonyou/openapi/base/utils/JSONConvertUtil.java deleted file mode 100644 index 07daad46fa784ae5e2f8bfc9ff9b849eff6bdaba..0000000000000000000000000000000000000000 --- a/src/main/java/com/yonyou/openapi/base/utils/JSONConvertUtil.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.yonyou.openapi.base.utils; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.yonyou.openapi.base.exception.BusinessException; - -/** - * @author nishch - * @description: - * @date 2023/8/24 - */ -public class JSONConvertUtil { - - public static String convertString(Object object){ - try { - if(object!=null){ - ObjectMapper objectMapper = new ObjectMapper(); - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - return objectMapper.writeValueAsString(object); - } - }catch (Exception exception){ - throw new BusinessException("JSON转换异常"); - } - return null; - } -} diff --git a/src/main/java/com/yonyou/openapi/base/utils/JacksonUtils.java b/src/main/java/com/yonyou/openapi/base/utils/JacksonUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..e1efdcf0a63fc31aff9c04f5885483b706bab8bb --- /dev/null +++ b/src/main/java/com/yonyou/openapi/base/utils/JacksonUtils.java @@ -0,0 +1,197 @@ +package com.yonyou.openapi.base.utils; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; + +@Slf4j +public class JacksonUtils { + private static ObjectMapper mapper; + + /** + * 设置一些通用的属性 + */ + static { + mapper = new ObjectMapper(); + // 如果存在未知属性,则忽略不报错 + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + // 允许key没有双引号 + mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); + // 允许key有单引号 + mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); + // 移除空字符 + mapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); + } + + public static String toJSONString(Object obj) { + return obj != null ? toJSONString(obj, () -> "", false) : ""; + } + + public static String toFormatJSONString(Object obj) { + return obj != null ? toJSONString(obj, () -> "", true) : ""; + } + + + public static String toJSONString(Object obj, Supplier defaultSupplier, boolean format) { + try { + if (obj == null) { + return defaultSupplier.get(); + } + if (obj instanceof String) { + return obj.toString(); + } + if (obj instanceof Number) { + return obj.toString(); + } + if (format) { + return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj); + } + return mapper.writeValueAsString(obj); + } catch (Throwable e) { + log.error(String.format("toJSONString %s", obj != null ? obj.toString() : "null"), e); + } + return defaultSupplier.get(); + } + + public static T toJavaObject(String value, Class tClass) { + return StringUtils.isNotBlank(value) ? toJavaObject(value, tClass, () -> null) : null; + } + + public static T toJavaObject(Object obj, Class tClass) { + return obj != null ? toJavaObject(toJSONString(obj), tClass, () -> null) : null; + } + + public static T toJavaObject(String value, Class tClass, Supplier defaultSupplier) { + try { + if (StringUtils.isBlank(value)) { + return defaultSupplier.get(); + } + return mapper.readValue(value, tClass); + } catch (Throwable e) { + log.error(String.format("toJavaObject exception: \n %s\n %s", value, tClass), e); + } + return defaultSupplier.get(); + } + + public static List toJavaObjectList(String value, Class tClass) { + return StringUtils.isNotBlank(value) ? toJavaObjectList(value, tClass, () -> null) : null; + } + + public static List toJavaObjectList(Object obj, Class tClass) { + return obj != null ? toJavaObjectList(toJSONString(obj), tClass, () -> null) : null; + } + + public static List toJavaObjectList(String value, Class tClass, Supplier> defaultSupplier) { + try { + if (StringUtils.isBlank(value)) { + return defaultSupplier.get(); + } + JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, tClass); + return mapper.readValue(value, javaType); + } catch (Throwable e) { + log.error(String.format("toJavaObjectList exception \n%s\n%s", value, tClass), e); + } + return defaultSupplier.get(); + } + + // 简单地直接用json复制或者转换(Cloneable) + public static T jsonCopy(Object obj, Class tClass) { + return obj != null ? toJavaObject(toJSONString(obj), tClass) : null; + } + + public static Map toMap(String value) { + return StringUtils.isNotBlank(value) ? toMap(value, () -> null) : null; + } + + public static Map toMap(Object value) { + return value != null ? toMap(value, () -> null) : null; + } + + public static Map toMap(Object value, Supplier> defaultSupplier) { + if (value == null) { + return defaultSupplier.get(); + } + try { + if (value instanceof Map) { + return (Map) value; + } + } catch (Exception e) { + log.info("fail to convert" + toJSONString(value), e); + } + return toMap(toJSONString(value), defaultSupplier); + } + + public static Map toMap(String value, Supplier> defaultSupplier) { + if (StringUtils.isBlank(value)) { + return defaultSupplier.get(); + } + try { + return toJavaObject(value, LinkedHashMap.class); + } catch (Exception e) { + log.error(String.format("toMap exception\n%s", value), e); + } + return defaultSupplier.get(); + } + + + public static List toList(String value) { + return StringUtils.isNotBlank(value) ? toList(value, () -> null) : null; + } + + public static List toList(Object value) { + return value != null ? toList(value, () -> null) : null; + } + + public static List toList(String value, Supplier> defaultSuppler) { + if (StringUtils.isBlank(value)) { + return defaultSuppler.get(); + } + try { + return toJavaObject(value, List.class); + } catch (Exception e) { + log.error("toList exception\n" + value, e); + } + return defaultSuppler.get(); + } + + public static List toList(Object value, Supplier> defaultSuppler) { + if (value == null) { + return defaultSuppler.get(); + } + if (value instanceof List) { + return (List) value; + } + return toList(toJSONString(value), defaultSuppler); + } + + public static long getLong(Map map, String key) { + if (map == null || map.size() ==0) { + return 0L; + } + String valueStr = String.valueOf(map.get(key)); + if (StringUtils.isBlank(valueStr) || !StringUtils.isNumeric(valueStr)) { + return 0L; + } + return Long.valueOf(valueStr); + } + + public static int getInt(Map map, String key) { + if (map == null || map.size() ==0) { + return 0; + } + String valueStr = String.valueOf(map.get(key)); + if (StringUtils.isBlank(valueStr) || !StringUtils.isNumeric(valueStr)) { + return 0; + } + return Integer.valueOf(valueStr); + } + +} diff --git a/src/main/java/com/yonyou/openapi/base/utils/RequestUtil.java b/src/main/java/com/yonyou/openapi/base/utils/RequestUtil.java index 2545364b6e23dfa3b1dd4f6c1f1b32feb8c8215b..2828b6aabe3e4bf901299eefd2e7211f12d13271 100644 --- a/src/main/java/com/yonyou/openapi/base/utils/RequestUtil.java +++ b/src/main/java/com/yonyou/openapi/base/utils/RequestUtil.java @@ -1,7 +1,5 @@ package com.yonyou.openapi.base.utils; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.http.client.config.CookieSpecs; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.HttpGet; @@ -25,8 +23,6 @@ public class RequestUtil { private static PoolingHttpClientConnectionManager cm = null; - private static ObjectMapper mapper = new ObjectMapper(); - private static CloseableHttpClient httpClient; /** @@ -83,26 +79,26 @@ public class RequestUtil { } public static T doGet(String requestUrl, Map paramMap, Class type) throws IOException { - return mapper.readValue(doGet(requestUrl, paramMap), type); + return JacksonUtils.toJavaObject(doGet(requestUrl, paramMap), type); } public static T doGetType(String requestUrl, Class type) throws IOException { - return mapper.readValue(doGet(requestUrl, null), type); + return JacksonUtils.toJavaObject(doGet(requestUrl, null), type); } public static T doPost(String requestUrl, Object params, Class type) throws IOException { - return mapper.readValue(doPost(requestUrl, params), type); - } - - public static T doGet(String requestUrl, Map paramMap, TypeReference typeReference) throws IOException { - return mapper.readValue(doGet(requestUrl, paramMap), typeReference); + return JacksonUtils.toJavaObject(doPost(requestUrl, params), type); } public static String doGet(String requestUrl, Map paramMap) throws IOException { CloseableHttpClient httpClient = getHttpClient(); StringBuilder param = new StringBuilder(); if (paramMap != null) { - param.append("?"); + if(!requestUrl.contains("?")){ + param.append("?"); + }else{ + param.append("&"); + } for(Map.Entry entry: paramMap.entrySet()) { param.append(entry.getKey()); param.append("="); @@ -122,7 +118,7 @@ public class RequestUtil { public static String doPost(String requestUrl, Object params) throws IOException { CloseableHttpClient httpClient = getHttpClient(); HttpPost post = new HttpPost(requestUrl); - String paramsStr = JSONConvertUtil.convertString(params); + String paramsStr = JacksonUtils.toJSONString(params); assert paramsStr != null; StringEntity stringEntity = new StringEntity(paramsStr, ContentType.APPLICATION_JSON); post.setEntity(stringEntity); diff --git a/src/main/java/com/yonyou/openapi/configure/ApiBaseContext.java b/src/main/java/com/yonyou/openapi/configure/ApiBaseContext.java deleted file mode 100644 index 49edcd7bd488352e1bc0502403f561999b0c554c..0000000000000000000000000000000000000000 --- a/src/main/java/com/yonyou/openapi/configure/ApiBaseContext.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.yonyou.openapi.configure; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; - -@Slf4j -public class ApiBaseContext implements ApplicationContextAware { - - private static ApplicationContext applicationContext; - - @Override - public void setApplicationContext(ApplicationContext context) throws BeansException { - applicationContext = context; - } - - public static T getBeanInstance(Class clazz){ - try{ - return applicationContext.getBean(clazz); - }catch (Exception e){ - log.warn("Bean is not exist for class:{}", clazz); - return null; - } - } - - public static T getBeanInstance(String beanName,Class clazz){ - try{ - return applicationContext.getBean(beanName,clazz); - }catch (Exception e){ - log.warn("Bean is not exist for class:{}", clazz); - return null; - } - } - -} diff --git a/src/main/java/com/yonyou/openapi/controller/SSOController.java b/src/main/java/com/yonyou/openapi/controller/SSOController.java new file mode 100644 index 0000000000000000000000000000000000000000..8fc78f83c9f7656e6714e560554652725a3f0c4b --- /dev/null +++ b/src/main/java/com/yonyou/openapi/controller/SSOController.java @@ -0,0 +1,41 @@ +package com.yonyou.openapi.controller; + +import com.yonyou.openapi.base.exception.BusinessException; +import com.yonyou.openapi.base.properties.OpenApiProperties; +import com.yonyou.openapi.base.sso.pojo.ThirdUserBo; +import com.yonyou.openapi.service.SSOToYSIndexService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; + +@Slf4j +@Controller +@RequestMapping("/yonsuite/sso") +public class SSOController { + + @Resource + SSOToYSIndexService ssoToYSIndexService; + @Resource + public OpenApiProperties properties; + + /** + * 获取单点登录地址 + * 地址示例 http://localhost:8080/yonsuite/sso?userId=200043&targetUrl=https%3A%2F%2Fdbox.yonyoucloud.com%2Flogin + */ + @GetMapping + public void getSSOUrl(ThirdUserBo thirdUserBo, HttpServletResponse response){ + try{ + String ssoUrl = ssoToYSIndexService.getSSOUrlToDO(thirdUserBo,thirdUserBo.getTargetUrl()); + response.sendRedirect(ssoUrl); + }catch (Exception e){ + throw new BusinessException("单点登录异常"); + } + } + + + +} diff --git a/src/main/java/com/yonyou/openapi/base/event/EventListenerController.java b/src/main/java/com/yonyou/openapi/event/EventListenerController.java similarity index 85% rename from src/main/java/com/yonyou/openapi/base/event/EventListenerController.java rename to src/main/java/com/yonyou/openapi/event/EventListenerController.java index 45376f76be48b10fec8418e47068e4fa357fb8cd..0453ec9d51682e46240416583d34dcf6c8ed0900 100644 --- a/src/main/java/com/yonyou/openapi/base/event/EventListenerController.java +++ b/src/main/java/com/yonyou/openapi/event/EventListenerController.java @@ -1,11 +1,13 @@ -package com.yonyou.openapi.base.event; +package com.yonyou.openapi.event; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.yonyou.openapi.base.auth.network.cryptor.EncryptionHolder; import com.yonyou.openapi.base.auth.network.cryptor.PrivateAppCryptoSHA256; +import com.yonyou.openapi.base.event.ReceivedEventDispatcher; import com.yonyou.openapi.base.event.pojo.Event; import com.yonyou.openapi.base.properties.OpenApiProperties; +import com.yonyou.openapi.base.utils.JacksonUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; @@ -24,20 +26,19 @@ public class EventListenerController { ReceivedEventDispatcher receivedEventDispatcher; @Resource OpenApiProperties openApiProperties; - private ObjectMapper objectMapper = new ObjectMapper(); /** * 2022-07-29 后创建的应用使用该事件订阅回调 * @param holder 开放平台请求消息体 * @return 返回success表示成功接收,抛出异常等其他代表接收失败 */ - @PostMapping("/new1") + @PostMapping("/new") public String onEventNew(@RequestBody EncryptionHolder holder) throws JsonProcessingException { PrivateAppCryptoSHA256 crypto = PrivateAppCryptoSHA256.newCrypto(openApiProperties.getAppKey(), openApiProperties.getAppSecret()); // 验签解密后的消息体 String decrypt = crypto.decryptMsg(holder); log.info("接收事件信息"+decrypt); - Event event = objectMapper.readValue(decrypt, Event.class); + Event event = JacksonUtils.toJavaObject(decrypt, Event.class); receivedEventDispatcher.dispatch(event, decrypt, holder); return "success"; } diff --git a/src/main/java/com/yonyou/openapi/event/ISVEventExtendDto.java b/src/main/java/com/yonyou/openapi/event/ISVEventExtendDto.java index b9f919b5f7aaaee2e66b202e6faa4ce4d74c94aa..69d7e24d447561466e8152f91619d4b501dbf2d2 100644 --- a/src/main/java/com/yonyou/openapi/event/ISVEventExtendDto.java +++ b/src/main/java/com/yonyou/openapi/event/ISVEventExtendDto.java @@ -13,7 +13,7 @@ import lombok.EqualsAndHashCode; @Data @JsonInclude(JsonInclude.Include.NON_NULL) @JsonIgnoreProperties(ignoreUnknown = true) -public class ISVEventExtendDto extends Event{ +public class ISVEventExtendDto extends Event { private String definitionVariable; diff --git a/src/main/java/com/yonyou/openapi/event/IsvEventExtendType.java b/src/main/java/com/yonyou/openapi/event/IsvEventExtendType.java index f00917c121d2fee337dd4a385f278d49b1151bef..41907e57fde447108e3e66befc1bb6ec5059e4c0 100644 --- a/src/main/java/com/yonyou/openapi/event/IsvEventExtendType.java +++ b/src/main/java/com/yonyou/openapi/event/IsvEventExtendType.java @@ -9,72 +9,12 @@ import com.yonyou.openapi.base.event.pojo.EventType; public class IsvEventExtendType extends EventType { /** - * 用户增加 + * 待办增加 */ - public static final String USER_ADD = "USER_ADD"; + public static final String TODO_CENTER_ADD_TODO = "TODO_CENTER_ADD_TODO"; /** - * 用户删除(移除) + * 待办更新 */ - public static final String USER_DELETE = "USER_DELETE"; - /** - * 组织新增 - */ - public static final String BASE_ORG_EVENT_ADD_AFTER = "BASE_ORG_EVENT_ADD_AFTER"; - /** - * 组织更新 - */ - public static final String BASE_ORG_EVENT_UPDATE_AFTE = "BASE_ORG_EVENT_UPDATE_AFTE"; - /** - * 组织启用 - */ - public static final String BASE_ORG_EVENT_ENABLE_AFTE = "BASE_ORG_EVENT_ENABLE_AFTE"; - /** - * 组织停用 - */ - public static final String BASE_ORG_EVENT_DISABLE_AFTE = "BASE_ORG_EVENT_DISABLE_AFTE"; - /** - * 组织删除 - */ - public static final String BASE_ORG_EVENT_DELETE_AFTER = "BASE_ORG_EVENT_DELETE_AFTER"; - /** - * 部门启用 - */ - public static final String DEPT_ENABLE = "DEPT_ENABLE"; - /** - * 部门新增 - */ - public static final String DEPT_ADD = "DEPT_ADD"; - /** - * 部门删除 - */ - public static final String DEPT_DELETE = "DEPT_DELETE"; - /** - * 部门修改 - */ - public static final String DEPT_UPDATE = "DEPT_UPDATE"; - /** - * 部门停用 - */ - public static final String DEPT_DISABLE = "DEPT_DISABLE"; - /** - * 员工启用 - */ - public static final String STAFF_ENABLE = "STAFF_ENABLE"; - /** - * 员工新增 - */ - public static final String STAFF_ADD = "STAFF_ADD"; - /** - * 员工删除 - */ - public static final String STAFF_DELETE = "STAFF_DELETE"; - /** - * 员工修改 - */ - public static final String STAFF_UPDATE = "STAFF_UPDATE"; - /** - * 员工停用 - */ - public static final String STAFF_DISABLE = "STAFF_DISABLE"; + public static final String TODO_CENTER_UPDATE_TODO = "TODO_CENTER_UPDATE_TODO"; } diff --git a/src/main/java/com/yonyou/openapi/event/dept/DeptAddEvent.java b/src/main/java/com/yonyou/openapi/event/dept/DeptAddEvent.java deleted file mode 100644 index 86a7eb4921104eb299675579c8b2c3a25c711675..0000000000000000000000000000000000000000 --- a/src/main/java/com/yonyou/openapi/event/dept/DeptAddEvent.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.yonyou.openapi.event.dept; - -import com.google.common.collect.Sets; -import com.yonyou.openapi.base.auth.network.cryptor.EncryptionHolder; -import com.yonyou.openapi.base.event.EventListener; -import com.yonyou.openapi.event.ISVEventExtendDto; -import com.yonyou.openapi.event.IsvEventExtendType; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.Set; - -/** - * @description: 部门新增事件监听 - **/ -@Slf4j -@Component -@RequiredArgsConstructor -public class DeptAddEvent implements EventListener { - - - /** - * 在这里写待办的处理逻辑,如果返回true则继续执行下一个相同编码的事件,返回false不继续执行。 - * @param type 事项类型 - * @param event 解析后对象 - * @param holder 响应消息体 - * @return boolean - */ - @Override - public boolean onEvent(String type, ISVEventExtendDto event, EncryptionHolder holder) { - String[] deptId = event.getDeptId(); - Long timestamp = event.getTimestamp(); - return true; - } - - /** - * 如果存在相同事件编码的处理逻辑,此处用于执行排序 - */ - @Override - public int priority() { - return EventListener.super.priority()-100; - } - - /** - * 返回事件编码 - * @return Set - */ - @Override - public Set supportTypes() { - return Sets.newHashSet(IsvEventExtendType.DEPT_ADD); - } - - /** - * 返回接收实体对象 - * @return Class - */ - @Override - public Class getEventClass() { - return ISVEventExtendDto.class; - } - -} diff --git a/src/main/java/com/yonyou/openapi/event/dept/DeptDeleteEvent.java b/src/main/java/com/yonyou/openapi/event/dept/DeptDeleteEvent.java deleted file mode 100644 index 5e3330f0077c32a77df422a07d6910a791de65cd..0000000000000000000000000000000000000000 --- a/src/main/java/com/yonyou/openapi/event/dept/DeptDeleteEvent.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.yonyou.openapi.event.dept; - -import com.google.common.collect.Sets; -import com.yonyou.openapi.base.auth.network.cryptor.EncryptionHolder; -import com.yonyou.openapi.base.event.EventListener; -import com.yonyou.openapi.event.ISVEventExtendDto; -import com.yonyou.openapi.event.IsvEventExtendType; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.Set; - -/** - * @description: 部门删除事件监听 - **/ -@Slf4j -@Component -@RequiredArgsConstructor -public class DeptDeleteEvent implements EventListener { - - - /** - * 可以在这个里面写具体的业务逻辑 - * @param type 事项类型 - * @param event 解析后对象 - * @param holder 响应消息体 - * @return boolean - */ - @Override - public boolean onEvent(String type, ISVEventExtendDto event, EncryptionHolder holder) { - String[] deptId = event.getDeptId(); - Long timestamp = event.getTimestamp(); - return true; - } - - @Override - public int priority() { - return EventListener.super.priority()-100; - } - - @Override - public Set supportTypes() { - return Sets.newHashSet(IsvEventExtendType.DEPT_DELETE); - } - - @Override - public Class getEventClass() { - return ISVEventExtendDto.class; - } - -} diff --git a/src/main/java/com/yonyou/openapi/event/dept/DeptDisableEvent.java b/src/main/java/com/yonyou/openapi/event/dept/DeptDisableEvent.java deleted file mode 100644 index 8fbaacb851ff77d2fc4bdd6e7eb129921a9df568..0000000000000000000000000000000000000000 --- a/src/main/java/com/yonyou/openapi/event/dept/DeptDisableEvent.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.yonyou.openapi.event.dept; - -import com.google.common.collect.Sets; -import com.yonyou.openapi.base.auth.network.cryptor.EncryptionHolder; -import com.yonyou.openapi.base.event.EventListener; -import com.yonyou.openapi.event.ISVEventExtendDto; -import com.yonyou.openapi.event.IsvEventExtendType; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.Set; - -/** - * @description: 部门停用事件监听 - **/ -@Slf4j -@Component -@RequiredArgsConstructor -public class DeptDisableEvent implements EventListener { - - - /** - * 可以在这个里面写具体的业务逻辑 - * @param type 事项类型 - * @param event 解析后对象 - * @param holder 响应消息体 - * @return boolean - */ - @Override - public boolean onEvent(String type, ISVEventExtendDto event, EncryptionHolder holder) { - String[] deptId = event.getDeptId(); - Long timestamp = event.getTimestamp(); - return true; - } - - @Override - public int priority() { - return EventListener.super.priority()-100; - } - - @Override - public Set supportTypes() { - return Sets.newHashSet(IsvEventExtendType.DEPT_DISABLE); - } - - @Override - public Class getEventClass() { - return ISVEventExtendDto.class; - } - -} diff --git a/src/main/java/com/yonyou/openapi/event/dept/DeptEnableEvent.java b/src/main/java/com/yonyou/openapi/event/dept/DeptEnableEvent.java deleted file mode 100644 index 15c115d2b298c55ff54a41ad665e516a66a81e08..0000000000000000000000000000000000000000 --- a/src/main/java/com/yonyou/openapi/event/dept/DeptEnableEvent.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.yonyou.openapi.event.dept; - -import com.google.common.collect.Sets; -import com.yonyou.openapi.base.auth.network.cryptor.EncryptionHolder; -import com.yonyou.openapi.base.event.EventListener; -import com.yonyou.openapi.event.ISVEventExtendDto; -import com.yonyou.openapi.event.IsvEventExtendType; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.Set; - -/** - * @description: 部门启用事件监听 - **/ -@Slf4j -@Component -@RequiredArgsConstructor -public class DeptEnableEvent implements EventListener { - - - /** - * 可以在这个里面写具体的业务逻辑 - * @param type 事项类型 - * @param event 解析后对象 - * @param holder 响应消息体 - * @return boolean - */ - @Override - public boolean onEvent(String type, ISVEventExtendDto event, EncryptionHolder holder) { - String[] deptId = event.getDeptId(); - Long timestamp = event.getTimestamp(); - return true; - } - - @Override - public int priority() { - return EventListener.super.priority()-100; - } - - @Override - public Set supportTypes() { - return Sets.newHashSet(IsvEventExtendType.DEPT_ENABLE); - } - - @Override - public Class getEventClass() { - return ISVEventExtendDto.class; - } - -} diff --git a/src/main/java/com/yonyou/openapi/event/org/OrgAddEvent.java b/src/main/java/com/yonyou/openapi/event/org/OrgAddEvent.java deleted file mode 100644 index 5634675c82582d7b95f57ad7c06d05fc2647ee4f..0000000000000000000000000000000000000000 --- a/src/main/java/com/yonyou/openapi/event/org/OrgAddEvent.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.yonyou.openapi.event.org; - -import com.google.common.collect.Sets; -import com.yonyou.openapi.base.auth.network.cryptor.EncryptionHolder; -import com.yonyou.openapi.base.event.EventListener; -import com.yonyou.openapi.event.ISVEventExtendDto; -import com.yonyou.openapi.event.IsvEventExtendType; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.Set; - -/** - * @description: 组织新增事件监听 - **/ -@Slf4j -@Component -@RequiredArgsConstructor -public class OrgAddEvent implements EventListener { - - - /** - * 可以在这个里面写具体的业务逻辑 - * @param type 事项类型 - * @param event 解析后对象 - * @param holder 响应消息体 - * @return boolean - */ - @Override - public boolean onEvent(String type, ISVEventExtendDto event, EncryptionHolder holder) { - String content = event.getContent(); - return true; - } - - @Override - public int priority() { - return EventListener.super.priority()-100; - } - - @Override - public Set supportTypes() { - return Sets.newHashSet(IsvEventExtendType.BASE_ORG_EVENT_ADD_AFTER); - } - - @Override - public Class getEventClass() { - return ISVEventExtendDto.class; - } - -} diff --git a/src/main/java/com/yonyou/openapi/event/org/OrgDeleteEvent.java b/src/main/java/com/yonyou/openapi/event/org/OrgDeleteEvent.java deleted file mode 100644 index 2e9f4410cd5bfedc63998ac4cf209220798e1f83..0000000000000000000000000000000000000000 --- a/src/main/java/com/yonyou/openapi/event/org/OrgDeleteEvent.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.yonyou.openapi.event.org; - -import com.google.common.collect.Sets; -import com.yonyou.openapi.base.auth.network.cryptor.EncryptionHolder; -import com.yonyou.openapi.base.event.EventListener; -import com.yonyou.openapi.event.ISVEventExtendDto; -import com.yonyou.openapi.event.IsvEventExtendType; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.Set; - -/** - * @description: 组织删除事件监听 - **/ -@Slf4j -@Component -@RequiredArgsConstructor -public class OrgDeleteEvent implements EventListener { - - - /** - * 可以在这个里面写具体的业务逻辑 - * @param type 事项类型 - * @param event 解析后对象 - * @param holder 响应消息体 - * @return boolean - */ - @Override - public boolean onEvent(String type, ISVEventExtendDto event, EncryptionHolder holder) { - String content = event.getContent(); - return true; - } - - @Override - public int priority() { - return EventListener.super.priority()-100; - } - - @Override - public Set supportTypes() { - return Sets.newHashSet(IsvEventExtendType.BASE_ORG_EVENT_DELETE_AFTER); - } - - @Override - public Class getEventClass() { - return ISVEventExtendDto.class; - } - -} diff --git a/src/main/java/com/yonyou/openapi/event/org/OrgDisableEvent.java b/src/main/java/com/yonyou/openapi/event/org/OrgDisableEvent.java deleted file mode 100644 index 1e6dcd4a6544d544143f2fced7401ee6e0e36424..0000000000000000000000000000000000000000 --- a/src/main/java/com/yonyou/openapi/event/org/OrgDisableEvent.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.yonyou.openapi.event.org; - -import com.google.common.collect.Sets; -import com.yonyou.openapi.base.auth.network.cryptor.EncryptionHolder; -import com.yonyou.openapi.base.event.EventListener; -import com.yonyou.openapi.event.ISVEventExtendDto; -import com.yonyou.openapi.event.IsvEventExtendType; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.Set; - -/** - * @description: 组织停用事件监听 - **/ -@Slf4j -@Component -@RequiredArgsConstructor -public class OrgDisableEvent implements EventListener { - - - /** - * 可以在这个里面写具体的业务逻辑 - * @param type 事项类型 - * @param event 解析后对象 - * @param holder 响应消息体 - * @return boolean - */ - @Override - public boolean onEvent(String type, ISVEventExtendDto event, EncryptionHolder holder) { - String content = event.getContent(); - return true; - } - - @Override - public int priority() { - return EventListener.super.priority()-100; - } - - @Override - public Set supportTypes() { - return Sets.newHashSet(IsvEventExtendType.BASE_ORG_EVENT_DISABLE_AFTE); - } - - @Override - public Class getEventClass() { - return ISVEventExtendDto.class; - } - -} diff --git a/src/main/java/com/yonyou/openapi/event/org/OrgEnableEvent.java b/src/main/java/com/yonyou/openapi/event/org/OrgEnableEvent.java deleted file mode 100644 index 1af780578312b306bdde4d34ba45242f4552545c..0000000000000000000000000000000000000000 --- a/src/main/java/com/yonyou/openapi/event/org/OrgEnableEvent.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.yonyou.openapi.event.org; - -import com.google.common.collect.Sets; -import com.yonyou.openapi.base.auth.network.cryptor.EncryptionHolder; -import com.yonyou.openapi.base.event.EventListener; -import com.yonyou.openapi.event.ISVEventExtendDto; -import com.yonyou.openapi.event.IsvEventExtendType; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.Set; - -/** - * @description: 组织启用事件监听 - **/ -@Slf4j -@Component -@RequiredArgsConstructor -public class OrgEnableEvent implements EventListener { - - - /** - * 可以在这个里面写具体的业务逻辑 - * @param type 事项类型 - * @param event 解析后对象 - * @param holder 响应消息体 - * @return boolean - */ - @Override - public boolean onEvent(String type, ISVEventExtendDto event, EncryptionHolder holder) { - String content = event.getContent(); - return true; - } - - @Override - public int priority() { - return EventListener.super.priority()-100; - } - - @Override - public Set supportTypes() { - return Sets.newHashSet(IsvEventExtendType.BASE_ORG_EVENT_ENABLE_AFTE); - } - - @Override - public Class getEventClass() { - return ISVEventExtendDto.class; - } - -} diff --git a/src/main/java/com/yonyou/openapi/event/org/OrgUpdateEvent.java b/src/main/java/com/yonyou/openapi/event/org/OrgUpdateEvent.java deleted file mode 100644 index 535d11022039beeefc6f876bcd1267b03a9406e5..0000000000000000000000000000000000000000 --- a/src/main/java/com/yonyou/openapi/event/org/OrgUpdateEvent.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.yonyou.openapi.event.org; - -import com.google.common.collect.Sets; -import com.yonyou.openapi.base.auth.network.cryptor.EncryptionHolder; -import com.yonyou.openapi.base.event.EventListener; -import com.yonyou.openapi.event.ISVEventExtendDto; -import com.yonyou.openapi.event.IsvEventExtendType; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.Set; - -/** - * @description: 组织更新事件监听 - **/ -@Slf4j -@Component -@RequiredArgsConstructor -public class OrgUpdateEvent implements EventListener { - - - /** - * 可以在这个里面写具体的业务逻辑 - * @param type 事项类型 - * @param event 解析后对象 - * @param holder 响应消息体 - * @return boolean - */ - @Override - public boolean onEvent(String type, ISVEventExtendDto event, EncryptionHolder holder) { - String content = event.getContent(); - return true; - } - - @Override - public int priority() { - return EventListener.super.priority()-100; - } - - @Override - public Set supportTypes() { - return Sets.newHashSet(IsvEventExtendType.BASE_ORG_EVENT_UPDATE_AFTE); - } - - @Override - public Class getEventClass() { - return ISVEventExtendDto.class; - } - -} diff --git a/src/main/java/com/yonyou/openapi/event/staff/StaffAddEvent.java b/src/main/java/com/yonyou/openapi/event/staff/StaffAddEvent.java deleted file mode 100644 index 503798e88283e05e127dc06d07888d9f48a8dcec..0000000000000000000000000000000000000000 --- a/src/main/java/com/yonyou/openapi/event/staff/StaffAddEvent.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.yonyou.openapi.event.staff; - -import com.google.common.collect.Sets; -import com.yonyou.openapi.base.auth.network.cryptor.EncryptionHolder; -import com.yonyou.openapi.base.event.EventListener; -import com.yonyou.openapi.event.ISVEventExtendDto; -import com.yonyou.openapi.event.IsvEventExtendType; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.Set; - -/** - * @description: 员工新增事件监听 - **/ -@Slf4j -@Component -@RequiredArgsConstructor -public class StaffAddEvent implements EventListener { - - - /** - * 可以在这个里面写具体的业务逻辑 - * @param type 事项类型 - * @param event 解析后对象 - * @param holder 响应消息体 - * @return boolean - */ - @Override - public boolean onEvent(String type, ISVEventExtendDto event, EncryptionHolder holder) { - String[] staffId = event.getStaffId(); - Long timestamp = event.getTimestamp(); - return true; - } - - @Override - public int priority() { - return EventListener.super.priority()-100; - } - - @Override - public Set supportTypes() { - return Sets.newHashSet(IsvEventExtendType.STAFF_ADD); - } - - @Override - public Class getEventClass() { - return ISVEventExtendDto.class; - } - -} diff --git a/src/main/java/com/yonyou/openapi/event/staff/StaffDeleteEvent.java b/src/main/java/com/yonyou/openapi/event/staff/StaffDeleteEvent.java deleted file mode 100644 index d4ddcb5387dd72827331ae0f68b3d903b42bcaaf..0000000000000000000000000000000000000000 --- a/src/main/java/com/yonyou/openapi/event/staff/StaffDeleteEvent.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.yonyou.openapi.event.staff; - -import com.google.common.collect.Sets; -import com.yonyou.openapi.base.auth.network.cryptor.EncryptionHolder; -import com.yonyou.openapi.base.event.EventListener; -import com.yonyou.openapi.event.ISVEventExtendDto; -import com.yonyou.openapi.event.IsvEventExtendType; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.Set; - -/** - * @description: 员工删除事件监听 - **/ -@Slf4j -@Component -@RequiredArgsConstructor -public class StaffDeleteEvent implements EventListener { - - - /** - * 可以在这个里面写具体的业务逻辑 - * @param type 事项类型 - * @param event 解析后对象 - * @param holder 响应消息体 - * @return boolean - */ - @Override - public boolean onEvent(String type, ISVEventExtendDto event, EncryptionHolder holder) { - String[] staffId = event.getStaffId(); - Long timestamp = event.getTimestamp(); - return true; - } - - @Override - public int priority() { - return EventListener.super.priority()-100; - } - - @Override - public Set supportTypes() { - return Sets.newHashSet(IsvEventExtendType.STAFF_DELETE); - } - - @Override - public Class getEventClass() { - return ISVEventExtendDto.class; - } - -} diff --git a/src/main/java/com/yonyou/openapi/event/staff/StaffDisableEvent.java b/src/main/java/com/yonyou/openapi/event/staff/StaffDisableEvent.java deleted file mode 100644 index 136442d4baa3550457f080370e377b805cee7593..0000000000000000000000000000000000000000 --- a/src/main/java/com/yonyou/openapi/event/staff/StaffDisableEvent.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.yonyou.openapi.event.staff; - -import com.google.common.collect.Sets; -import com.yonyou.openapi.base.auth.network.cryptor.EncryptionHolder; -import com.yonyou.openapi.base.event.EventListener; -import com.yonyou.openapi.event.ISVEventExtendDto; -import com.yonyou.openapi.event.IsvEventExtendType; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.Set; - -/** - * @description: 员工停用事件监听 - **/ -@Slf4j -@Component -@RequiredArgsConstructor -public class StaffDisableEvent implements EventListener { - - - /** - * 可以在这个里面写具体的业务逻辑 - * @param type 事项类型 - * @param event 解析后对象 - * @param holder 响应消息体 - * @return boolean - */ - @Override - public boolean onEvent(String type, ISVEventExtendDto event, EncryptionHolder holder) { - String[] staffId = event.getStaffId(); - Long timestamp = event.getTimestamp(); - return true; - } - - @Override - public int priority() { - return EventListener.super.priority()-100; - } - - @Override - public Set supportTypes() { - return Sets.newHashSet(IsvEventExtendType.STAFF_DISABLE); - } - - @Override - public Class getEventClass() { - return ISVEventExtendDto.class; - } - -} diff --git a/src/main/java/com/yonyou/openapi/event/staff/StaffEnableEvent.java b/src/main/java/com/yonyou/openapi/event/staff/StaffEnableEvent.java deleted file mode 100644 index 4d82e84f674a3942970d4b3960fb9f08beacd007..0000000000000000000000000000000000000000 --- a/src/main/java/com/yonyou/openapi/event/staff/StaffEnableEvent.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.yonyou.openapi.event.staff; - -import com.google.common.collect.Sets; -import com.yonyou.openapi.base.auth.network.cryptor.EncryptionHolder; -import com.yonyou.openapi.base.event.EventListener; -import com.yonyou.openapi.event.ISVEventExtendDto; -import com.yonyou.openapi.event.IsvEventExtendType; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.Set; - -/** - * @description: 员工启用事件监听 - **/ -@Slf4j -@Component -@RequiredArgsConstructor -public class StaffEnableEvent implements EventListener { - - - /** - * 可以在这个里面写具体的业务逻辑 - * @param type 事项类型 - * @param event 解析后对象 - * @param holder 响应消息体 - * @return boolean - */ - @Override - public boolean onEvent(String type, ISVEventExtendDto event, EncryptionHolder holder) { - String[] staffId = event.getStaffId(); - Long timestamp = event.getTimestamp(); - return true; - } - - @Override - public int priority() { - return EventListener.super.priority()-100; - } - - @Override - public Set supportTypes() { - return Sets.newHashSet(IsvEventExtendType.STAFF_ENABLE); - } - - @Override - public Class getEventClass() { - return ISVEventExtendDto.class; - } - -} diff --git a/src/main/java/com/yonyou/openapi/event/staff/StaffUpdateEvent.java b/src/main/java/com/yonyou/openapi/event/staff/StaffUpdateEvent.java deleted file mode 100644 index fa9a7aa9911de1cd2c7a765b9d90a6586d9a2460..0000000000000000000000000000000000000000 --- a/src/main/java/com/yonyou/openapi/event/staff/StaffUpdateEvent.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.yonyou.openapi.event.staff; - -import com.google.common.collect.Sets; -import com.yonyou.openapi.base.auth.network.cryptor.EncryptionHolder; -import com.yonyou.openapi.base.event.EventListener; -import com.yonyou.openapi.event.ISVEventExtendDto; -import com.yonyou.openapi.event.IsvEventExtendType; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.Set; - -/** - * @description: 部门更新事件监听 - **/ -@Slf4j -@Component -@RequiredArgsConstructor -public class StaffUpdateEvent implements EventListener { - - - /** - * 可以在这个里面写具体的业务逻辑 - * @param type 事项类型 - * @param event 解析后对象 - * @param holder 响应消息体 - * @return boolean - */ - @Override - public boolean onEvent(String type, ISVEventExtendDto event, EncryptionHolder holder) { - String[] staffId = event.getStaffId(); - Long timestamp = event.getTimestamp(); - return true; - } - - @Override - public int priority() { - return EventListener.super.priority()-100; - } - - @Override - public Set supportTypes() { - return Sets.newHashSet(IsvEventExtendType.DEPT_UPDATE); - } - - @Override - public Class getEventClass() { - return ISVEventExtendDto.class; - } - -} diff --git a/src/main/java/com/yonyou/openapi/event/user/UserAddEvent.java b/src/main/java/com/yonyou/openapi/event/todo/TodoAddEvent.java similarity index 49% rename from src/main/java/com/yonyou/openapi/event/user/UserAddEvent.java rename to src/main/java/com/yonyou/openapi/event/todo/TodoAddEvent.java index 31229a1738dc6dd055c752fe96f5b5bf1c431b65..bd5ca8a660a4c33a40d87930d758b5bb36bdd881 100644 --- a/src/main/java/com/yonyou/openapi/event/user/UserAddEvent.java +++ b/src/main/java/com/yonyou/openapi/event/todo/TodoAddEvent.java @@ -1,35 +1,50 @@ -package com.yonyou.openapi.event.user; +package com.yonyou.openapi.event.todo; import com.google.common.collect.Sets; import com.yonyou.openapi.base.auth.network.cryptor.EncryptionHolder; import com.yonyou.openapi.base.event.EventListener; +import com.yonyou.openapi.base.utils.JacksonUtils; import com.yonyou.openapi.event.ISVEventExtendDto; import com.yonyou.openapi.event.IsvEventExtendType; +import com.yonyou.openapi.service.SSOToYSIndexService; import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import javax.annotation.Resource; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.Map; import java.util.Set; /** - * @description: 用户新增事件监听 + * @description: 待办新增 + * @author: nishch + * @create: 2021-07-05 **/ @Slf4j @Component @RequiredArgsConstructor -public class UserAddEvent implements EventListener { +public class TodoAddEvent implements EventListener { + @Resource + SSOToYSIndexService ssoToYSIndexService; /** - * 可以在这个里面写具体的业务逻辑 + * TODO:在这里写待办的处理逻辑 * @param type 事项类型 * @param event 解析后对象 * @param holder 响应消息体 * @return boolean */ @Override - public boolean onEvent(String type, ISVEventExtendDto event, EncryptionHolder holder) { - String[] userId = event.getUserId(); + @SneakyThrows + public boolean onEvent(String type, ISVEventExtendDto event, EncryptionHolder holder){ + Map info = JacksonUtils.toJavaObject(event.getContent(), Map.class); + Map result = JacksonUtils.toJavaObject(info.get("value"), Map.class); + log.info("todo id: {}", result.toString()); + log.info("todo webUrl: {}", URLEncoder.encode(result.get("webUrl").toString(), StandardCharsets.UTF_8.toString())); return true; } @@ -40,7 +55,7 @@ public class UserAddEvent implements EventListener { @Override public Set supportTypes() { - return Sets.newHashSet(IsvEventExtendType.USER_ADD); + return Sets.newHashSet(IsvEventExtendType.TODO_CENTER_ADD_TODO); } @Override diff --git a/src/main/java/com/yonyou/openapi/event/dept/DeptUpdateEvent.java b/src/main/java/com/yonyou/openapi/event/todo/TodoUpdateEvent.java similarity index 53% rename from src/main/java/com/yonyou/openapi/event/dept/DeptUpdateEvent.java rename to src/main/java/com/yonyou/openapi/event/todo/TodoUpdateEvent.java index 994d2877b1cac0a25f4b8b97948dcd12c91ec78f..d7a55bc154b8d63f20809e024d696ceffd419984 100644 --- a/src/main/java/com/yonyou/openapi/event/dept/DeptUpdateEvent.java +++ b/src/main/java/com/yonyou/openapi/event/todo/TodoUpdateEvent.java @@ -1,36 +1,48 @@ -package com.yonyou.openapi.event.dept; +package com.yonyou.openapi.event.todo; import com.google.common.collect.Sets; import com.yonyou.openapi.base.auth.network.cryptor.EncryptionHolder; import com.yonyou.openapi.base.event.EventListener; +import com.yonyou.openapi.base.utils.JacksonUtils; import com.yonyou.openapi.event.ISVEventExtendDto; import com.yonyou.openapi.event.IsvEventExtendType; +import com.yonyou.openapi.service.SSOToYSIndexService; import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import javax.annotation.Resource; +import java.util.Map; import java.util.Set; /** - * @description: 员工更新事件监听 + * @description: 待办更新 + * @author: nishch + * @create: 2021-07-05 **/ @Slf4j @Component @RequiredArgsConstructor -public class DeptUpdateEvent implements EventListener { +public class TodoUpdateEvent implements EventListener { + @Resource + SSOToYSIndexService ssoToYSIndexService; /** - * 可以在这个里面写具体的业务逻辑 + * TODO:在这里写待办的处理逻辑 * @param type 事项类型 * @param event 解析后对象 * @param holder 响应消息体 * @return boolean */ @Override - public boolean onEvent(String type, ISVEventExtendDto event, EncryptionHolder holder) { - String[] deptId = event.getDeptId(); - Long timestamp = event.getTimestamp(); + @SneakyThrows + public boolean onEvent(String type, ISVEventExtendDto event, EncryptionHolder holder){ + Map info = JacksonUtils.toJavaObject(event.getContent(), Map.class); + Map result = JacksonUtils.toJavaObject(info.get("value"), Map.class); + log.info("todo id: {}", result.toString()); + log.info("todo webUrl: {}", result.get("webUrl")); return true; } @@ -41,7 +53,7 @@ public class DeptUpdateEvent implements EventListener { @Override public Set supportTypes() { - return Sets.newHashSet(IsvEventExtendType.STAFF_UPDATE); + return Sets.newHashSet(IsvEventExtendType.TODO_CENTER_UPDATE_TODO); } @Override diff --git a/src/main/java/com/yonyou/openapi/event/user/UserDeleteEvent.java b/src/main/java/com/yonyou/openapi/event/user/UserDeleteEvent.java deleted file mode 100644 index b672612b0fc867676417b8961e76474c3bb5356a..0000000000000000000000000000000000000000 --- a/src/main/java/com/yonyou/openapi/event/user/UserDeleteEvent.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.yonyou.openapi.event.user; - -import com.google.common.collect.Sets; -import com.yonyou.openapi.base.auth.network.cryptor.EncryptionHolder; -import com.yonyou.openapi.base.event.EventListener; -import com.yonyou.openapi.event.ISVEventExtendDto; -import com.yonyou.openapi.event.IsvEventExtendType; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.Set; - -/** - * @description: 用户删除事件监听 - **/ -@Slf4j -@Component -@RequiredArgsConstructor -public class UserDeleteEvent implements EventListener { - - - /** - * 可以在这个里面写具体的业务逻辑 - * @param type 事项类型 - * @param event 解析后对象 - * @param holder 响应消息体 - * @return boolean - */ - @Override - public boolean onEvent(String type, ISVEventExtendDto event, EncryptionHolder holder) { - String[] userId = event.getUserId(); - return true; - } - - @Override - public int priority() { - return EventListener.super.priority()-100; - } - - @Override - public Set supportTypes() { - return Sets.newHashSet(IsvEventExtendType.USER_DELETE); - } - - @Override - public Class getEventClass() { - return ISVEventExtendDto.class; - } - -} diff --git a/src/main/java/com/yonyou/openapi/service/OpenApiURL.java b/src/main/java/com/yonyou/openapi/service/OpenApiURL.java deleted file mode 100644 index 55f86a16f481a8115403457fd17067b72effc095..0000000000000000000000000000000000000000 --- a/src/main/java/com/yonyou/openapi/service/OpenApiURL.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.yonyou.openapi.service; - -/** - * @description: URL地址 - **/ -public class OpenApiURL { - - - /** - * 员工列表查询 - */ - public final static String STAFF_LIST = "/yonbip/digitalModel/staff/list"; - -} diff --git a/src/main/java/com/yonyou/openapi/service/SSOToYSIndexService.java b/src/main/java/com/yonyou/openapi/service/SSOToYSIndexService.java new file mode 100644 index 0000000000000000000000000000000000000000..86e3ba56e0a0f8f5f84454351cdf8c0fdd645a01 --- /dev/null +++ b/src/main/java/com/yonyou/openapi/service/SSOToYSIndexService.java @@ -0,0 +1,23 @@ +package com.yonyou.openapi.service; + +import com.yonyou.openapi.base.sso.sso.SingleSignOn; +import org.springframework.stereotype.Component; + +/** + * @author nishch + * @description: 单点登录至YS首页 + * @date 2023/7/26 + */ +@Component +public class SSOToYSIndexService extends SingleSignOn { + + + /** + * 单点登录凭证列表页面 + * @param userId 三方用户唯一标识 + * @return 最终单点登录地址 + */ + public String index(String userId){ + return getSSOUrlToIndex(init(userId)); + } +} diff --git a/src/main/java/com/yonyou/openapi/service/SSOToYSService.java b/src/main/java/com/yonyou/openapi/service/SSOToYSService.java new file mode 100644 index 0000000000000000000000000000000000000000..56e74bb0709794b60827d696ef3eee50928abedb --- /dev/null +++ b/src/main/java/com/yonyou/openapi/service/SSOToYSService.java @@ -0,0 +1,145 @@ +package com.yonyou.openapi.service; + +import com.yonyou.openapi.base.sso.sso.SingleSignOn; +import org.springframework.stereotype.Component; + +/** + * @author nishch + * @description: 单点登录至YS指定页面 + * @date 2023/7/26 + */ +@Component +public class SSOToYSService extends SingleSignOn { + + + public String ssoUrl(String userId,String url){ + return getSSOUrlToUrl2(init(userId),url); + } + + + + /** + * 单点登录凭证列表页面 + * @param userId 三方用户唯一标识 + * @return 最终单点登录地址 + */ + public String voucher_list(String userId){ + return getSSOUrlToUrl(init(userId),SSOUrl.VOUCHER_LIST); + } + + /** + * 单点登录凭证详情页面 + * @param userId 三方用户唯一标识 + * @param billId 凭证id + * @return 最终单点登录地址 + */ + public String voucher(String userId,String billId){ + return getSSOUrlToUrl(init(userId),String.format(SSOUrl.NEW_VOUCHER,billId)); + } + + /** + * 单点登录应收发票列表页面 + * @param userId 三方用户唯一标识 + * @return 最终单点登录地址 + */ + public String receivableList(String userId){ + return getSSOUrlToUrl(init(userId),SSOUrl.RECEIVE_ABLE_LIST); + } + + /** + * 单点登录收款单列表页面 + * @param userId 三方用户唯一标识 + * @return 最终单点登录地址 + */ + public String collectionList(String userId){ + return getSSOUrlToUrl(init(userId),SSOUrl.COLLECTION_LIST); + } + + /** + * 单点登录收款退款单列表页面 + * @param userId 三方用户唯一标识 + * @return 最终单点登录地址 + */ + public String arRefundList(String userId){ + return getSSOUrlToUrl(init(userId),SSOUrl.AR_REFUND_LIST); + } + + + /** + * 单点登录应收事务列表页面 + * @param userId 三方用户唯一标识 + * @return 最终单点登录地址 + */ + public String fiear_event_receivable_list(String userId){ + return getSSOUrlToUrl(init(userId),SSOUrl.FIEAR_EVENT_RECEIVE_ABLE_LIST); + } + + /** + * 单点登录收款事务列表页面 + * @param userId 三方用户唯一标识 + * @return 最终单点登录地址 + */ + public String ear_event_collection_list(String userId){ + return getSSOUrlToUrl(init(userId),SSOUrl.EAR_EVENT_COLLECTION_LIST); + } + + + /** + * 单点登录应付发票列表页面 + * @param userId 三方用户唯一标识 + * @return 最终单点登录地址 + */ + public String payableList(String userId){ + return getSSOUrlToUrl(init(userId),SSOUrl.PAY_ABLE_LIST); + } + + + /** + * 单点登录付款申请单列表页面 + * @param userId 三方用户唯一标识 + * @return 最终单点登录地址 + */ + public String paymentApplyList(String userId){ + return getSSOUrlToUrl(init(userId),SSOUrl.PAYMENT_APPLY_LIST); + } + + + /** + * 单点登录付款单列表页面 + * @param userId 三方用户唯一标识 + * @return 最终单点登录地址 + */ + public String paymentList(String userId){ + return getSSOUrlToUrl(init(userId),SSOUrl.PAYMENT_LIST); + } + + + /** + * 单点登录付款退款单列表页面 + * @param userId 三方用户唯一标识 + * @return 最终单点登录地址 + */ + public String apRefundList(String userId){ + return getSSOUrlToUrl(init(userId),SSOUrl.AP_REFUND_LIST); + } + + + /** + * 单点登录应付事务列表页面 + * @param userId 三方用户唯一标识 + * @return 最终单点登录地址 + */ + public String apPublicEvent_list(String userId){ + return getSSOUrlToUrl(init(userId),SSOUrl.AP_PUBLIC_EVENT_LIST); + } + + + /** + * 单点登录应付事务列表页面 + * @param userId 三方用户唯一标识 + * @return 最终单点登录地址 + */ + public String paymentEventList(String userId){ + return getSSOUrlToUrl(init(userId),SSOUrl.PAYMENT_EVENT_LIST); + } +} diff --git a/src/main/java/com/yonyou/openapi/service/SSOUrl.java b/src/main/java/com/yonyou/openapi/service/SSOUrl.java new file mode 100644 index 0000000000000000000000000000000000000000..e220228595d32352a0f7dee6c0250e40950c2347 --- /dev/null +++ b/src/main/java/com/yonyou/openapi/service/SSOUrl.java @@ -0,0 +1,66 @@ +package com.yonyou.openapi.service; + +/** + * @author nishch + * @description: 常见单点登记单据的URL + * @date 2023/7/26 + */ +public class SSOUrl { + + + /** + * 凭证列表页面 + */ + public final static String VOUCHER_LIST = "/mdf-node/meta/ArchiveList/bd_voucherlist?locale=zh_CN&busiObj=glVoucher&domainKey=yonbip-fi-egl"; + /** + * 凭证详情页面 + */ + public final static String NEW_VOUCHER = "/yonbip-fi-fcweb/ucf-wh/home_index.html?serviceCode=newvoucher&billid=%s#/voucher/new"; + /** + * 应收发票列表页面 + */ + public final static String RECEIVE_ABLE_LIST = "/mdf-node/meta/VoucherList/receivableList?busiObj=receivable&locale=zh_CN&domainKey=yonbip-fi-earapbill"; + /** + * 收款单列表页面 + */ + public final static String COLLECTION_LIST = "/mdf-node/meta/VoucherList/collectionList?busiObj=collection&locale=zh_CN&domainKey=yonbip-fi-earapbill"; + /** + * 收款退款单列表页面 + */ + public final static String AR_REFUND_LIST = "/mdf-node/meta/VoucherList/arRefundList?busiObj=arRefund&locale=zh_CN&domainKey=yonbip-fi-earapbill"; + /** + * 应收事务列表页面 + */ + public final static String FIEAR_EVENT_RECEIVE_ABLE_LIST = "/mdf-node/meta/VoucherList/fiear_event_receivable_list?&busiObj=arPublicEvent&locale=zh_CN&domainKey=yonbip-fi-earap"; + /** + * 收款事务列表页面 + */ + public final static String EAR_EVENT_COLLECTION_LIST = "/mdf-node/meta/VoucherList/ear_event_collection_list?busiObj=collectionEvent&locale=zh_CN&domainKey=yonbip-fi-earap"; + /** + * 应付发票列表页面 + */ + public final static String PAY_ABLE_LIST = "/mdf-node/meta/VoucherList/payableList?busiObj=payable&locale=zh_CN&domainKey=yonbip-fi-earapbill"; + /** + * 付款申请单列表页面 + */ + public final static String PAYMENT_APPLY_LIST = "/mdf-node/meta/VoucherList/paymentApplyList?busiObj=paymentApply&locale=zh_CN&domainKey=yonbip-fi-earapbill"; + /** + * 付款单列表页面 + */ + public final static String PAYMENT_LIST = "/mdf-node/meta/VoucherList/paymentList?busiObj=payment&locale=zh_CN&domainKey=yonbip-fi-earapbill"; + /** + * 付款退款单列表页面 + */ + public final static String AP_REFUND_LIST = "/mdf-node/meta/VoucherList/apRefundList?busiObj=apRefund&locale=zh_CN&domainKey=yonbip-fi-earapbill"; + /** + * 应付事务列表页面 + */ + public final static String AP_PUBLIC_EVENT_LIST = "/mdf-node/meta/VoucherList/apPublicEvent_list?busiObj=apPublicEvent&locale=zh_CN&domainKey=yonbip-fi-earap"; + /** + * 付款事务列表页面 + */ + public final static String PAYMENT_EVENT_LIST = "/mdf-node/meta/VoucherList/paymentEventList?busiObj=paymentEvent&locale=zh_CN&domainKey=yonbip-fi-earap"; + + + +} diff --git a/src/main/java/com/yonyou/openapi/service/TokenProviderImpl.java b/src/main/java/com/yonyou/openapi/service/TokenProviderImpl.java index 245caf1341cc46cba8c8d419ae6dab16d5d173e0..f3c9372e45ea4d7c91fd929f9da6ae1fd5c467ba 100644 --- a/src/main/java/com/yonyou/openapi/service/TokenProviderImpl.java +++ b/src/main/java/com/yonyou/openapi/service/TokenProviderImpl.java @@ -1,56 +1,35 @@ package com.yonyou.openapi.service; -import com.github.benmanes.caffeine.cache.Cache; import com.yonyou.openapi.base.auth.token.OpenApiTokenCacheProvider; import com.yonyou.openapi.base.datacenter.impl.DataCenterUrlProviderImpl; import com.yonyou.openapi.base.datacenter.pojo.GatewayAddressResponse; import com.yonyou.openapi.base.response.OpenApiAccessToken; -import com.yonyou.openapi.configure.ApiBaseContext; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; - -import javax.annotation.Resource; -import java.util.Objects; +/** + * @author nishch + * @description: TODO + * @date 2022/3/8 + */ @Slf4j public class TokenProviderImpl extends DataCenterUrlProviderImpl implements OpenApiTokenCacheProvider { - @Resource - Cache moreDataUrlCache; - @Resource - Cache tokenCache; - - /** - * TODO:不建议每次都调用接口,建议将租户地址对应关系持久化到数据库或者缓存中 + * TODO:不建议每次都调用接口,建议将租户地址对应关系持久化到数据库和缓存中 * @return GatewayAddressResponse.GatewayAddressDTO */ @Override public GatewayAddressResponse.GatewayAddressDTO queryGatewayAddress() { - GatewayAddressResponse.GatewayAddressDTO gatewayAddressDTO = Objects.requireNonNull(moreDataUrlCache).asMap().get("moreDataUrl"); - if(gatewayAddressDTO==null){ - GatewayAddressResponse.GatewayAddressDTO queryGatewayAddress = super.queryGatewayAddress(); - gatewayAddressDTO = queryGatewayAddress; - moreDataUrlCache.put("moreDataUrl",queryGatewayAddress); - } - return gatewayAddressDTO; + return super.queryGatewayAddress(); } /** * TODO: 从缓存中获取token - * @return token对象 返回null说明过期,会重新走获取token的逻辑 + * @return token对象 */ @Override public OpenApiAccessToken loadTokenFromCache() { - OpenApiAccessToken openApiAccessToken = Objects.requireNonNull(tokenCache).asMap().get("tokenCache"); - if(openApiAccessToken!=null){ - //判断有效期,如果大于30分钟则返回token - long currentTime = System.currentTimeMillis(); - if(openApiAccessToken.getExpiredAt()-currentTime>30*60*1000){ - return openApiAccessToken; - } - } return null; } @@ -60,7 +39,7 @@ public class TokenProviderImpl extends DataCenterUrlProviderImpl implements Open */ @Override public void saveTokenToCache(OpenApiAccessToken token) { - tokenCache.put("tokenCache",token); + } } diff --git a/src/main/java/com/yonyou/openapi/service/staff/StaffApi.java b/src/main/java/com/yonyou/openapi/service/staff/StaffApi.java deleted file mode 100644 index 3962210b21f3ccf3a9cc13b46cab09feca20e003..0000000000000000000000000000000000000000 --- a/src/main/java/com/yonyou/openapi/service/staff/StaffApi.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.yonyou.openapi.service.staff; - -import com.yonyou.openapi.base.response.ApiDataResponse; -import com.yonyou.openapi.service.BaseOpenApi; -import com.yonyou.openapi.service.OpenApiURL; -import org.springframework.stereotype.Component; - -import java.util.Map; - -/** - * @description: 用友开放平台员工接口 - **/ -@Component -public class StaffApi extends BaseOpenApi { - - public Map list(Map params) { - ApiDataResponse apiDataResponse = postForEntity(OpenApiURL.STAFF_LIST,params, ApiDataResponse.class); - return getData(apiDataResponse); - } - -} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 47a3771ab6ca3beeaf1c85dde40c766ff1e47571..3c740e53142dc626748d25195b5398d51143de14 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,10 +1,15 @@ -#ȡ⻧ +#获取租户所在数据中心域名 ucf.mdd.open-api.gateway-address-url=https://apigateway.yonyoucloud.com/open-auth/dataCenter/getGatewayAddress?tenantId=%s -# TODO:⻧id -ucf.mdd.open-api.tenantId = jkekg6ry -# TODO:ӦϢ -ucf.mdd.open-api.app-key=b892c56cf5064be78723e262bdf42a5 -ucf.mdd.open-api.app-secret=106fcf1b0f6c7fc9dc5178126fb36798d05c8 +# 友互通地址 +ucf.mdd.open-api.sso-yht-url = https://euc.yonyoucloud.com + +# TODO:集成认证中心编码 +ucf.mdd.open-api.third-uc-id = bp***e5e +# TODO:租户id +ucf.mdd.open-api.tenantId = ry***tc5 +# TODO:应用信息------------begin +ucf.mdd.open-api.app-key=d8e643e740***************d95d4fedf +ucf.mdd.open-api.app-secret=a7b9760d4ac8***************c7988e703 diff --git a/src/test/java/com/yonyou/openapi/sso/SSO_Index_Test.java b/src/test/java/com/yonyou/openapi/sso/SSO_Index_Test.java new file mode 100644 index 0000000000000000000000000000000000000000..393cb07dec367fe885d25349cb35966b230ca2b1 --- /dev/null +++ b/src/test/java/com/yonyou/openapi/sso/SSO_Index_Test.java @@ -0,0 +1,51 @@ +package com.yonyou.openapi.sso; + +import com.yonyou.openapi.service.SSOToYSIndexService; +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; +import java.io.IOException; + +/** + * @description: 单点登录控制台 + * @author: nishch + * @create: 2021-07-06 + **/ +@RunWith(SpringRunner.class) +@SpringBootTest +@Slf4j +public class SSO_Index_Test{ + + + @Resource + SSOToYSIndexService ssoToYSIndexService; + + /** + * 单点至控制台首页 + */ + @Test + public void list(){ + String ssoUrl = ssoToYSIndexService.index("200043"); + log.info("最终单点登录地址:"+ssoUrl); + openExplorer(ssoUrl); + } + + + /** + * 打开浏览器,方便调试使用 + * @param url 最终的单点登录地址 + */ + public static void openExplorer(String url){ + try { + Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + url); + } catch (IOException e) { + e.printStackTrace(); + } + } + + +} diff --git a/src/test/java/com/yonyou/openapi/sso/SSO_ServiceCode_Test.java b/src/test/java/com/yonyou/openapi/sso/SSO_ServiceCode_Test.java new file mode 100644 index 0000000000000000000000000000000000000000..bd1cccaea39c8e242c7e78c72f8d667180a73374 --- /dev/null +++ b/src/test/java/com/yonyou/openapi/sso/SSO_ServiceCode_Test.java @@ -0,0 +1,49 @@ +package com.yonyou.openapi.sso; + +import com.yonyou.openapi.base.sso.pojo.ThirdUserBo; +import com.yonyou.openapi.service.SSOToYSService; +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; +import java.io.IOException; + +/** + * @description: 单点登录指定单据 ---根据service_code单点登录至指定页面 + * @author: nishch + * @create: 2021-07-06 + **/ +@RunWith(SpringRunner.class) +@SpringBootTest +@Slf4j +public class SSO_ServiceCode_Test { + + @Resource + SSOToYSService ssoToYSService; + + + @Test + public void ssoNode() throws Exception { + ThirdUserBo thirdUserBo = new ThirdUserBo("i49syz6m","200043","nscer1","nsc1","pc_product",null,null); + String ssoUrl = ssoToYSService.getSSOUrlToNode(thirdUserBo); + log.info("最终单点登录地址:"+ssoUrl); + openExplorer(ssoUrl); + } + + + /** + * 打开浏览器,方便调试使用 + * @param url 最终的单点登录地址 + */ + public static void openExplorer(String url){ + try { + Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + url); + } catch (IOException e) { + e.printStackTrace(); + } + } + +} diff --git a/src/test/java/com/yonyou/openapi/sso/SSO_URL_Test.java b/src/test/java/com/yonyou/openapi/sso/SSO_URL_Test.java new file mode 100644 index 0000000000000000000000000000000000000000..2726c7312a504789ef58efd7d2e8d6ba93b7301c --- /dev/null +++ b/src/test/java/com/yonyou/openapi/sso/SSO_URL_Test.java @@ -0,0 +1,81 @@ +package com.yonyou.openapi.sso; + +import com.yonyou.openapi.service.SSOToYSService; +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; +import java.io.IOException; + +/** + * @description: 单点登录指定单据 ---根据url单点指定页面 + * @author: nishch + * @create: 2021-07-06 + **/ +@RunWith(SpringRunner.class) +@SpringBootTest +@Slf4j +public class SSO_URL_Test{ + + @Resource + SSOToYSService ssoToYSService; + + + @Test + public void ssoUrl(){ + String ssoUrl = ssoToYSService.ssoUrl("wupb","https://c3.yonyoucloud.com/mdf-node/meta/voucher/sact_salescontract/1853650986270195713?domainKey=sact&businessStepCode=&tenantId=osy0gmcg&apptype=mdf&serviceCode=salescontractlist&taskId=5851899f-7a13-11ee-9312-26ce4027b229&from_mc_workflow=1&from_service=iuap-apcom-messagecenter&url_actual_build_source=iuap-apcom-messageplatform"); + log.info("最终单点登录地址:"+ssoUrl); + } + + /** + * 单点至凭证列表页面 + * 注意:凭证的列表和卡片是分别两个页面,新增、联查、打印等等对应打开新页面的按钮点击均无效 + */ + @Test + public void voucher_list(){ + String ssoUrl = ssoToYSService.voucher_list("qwertyvbnm"); + log.info("最终单点登录地址:"+ssoUrl); + openExplorer(ssoUrl); + } + + + /** + * 单点至凭证卡片页面 + * 注意:凭证的列表和卡片是分别两个页面,新增、联查、打印等等对应打开新页面的按钮点击均无效 + */ + @Test + public void voucher(){ + String ssoUrl = ssoToYSService.voucher("qwertyvbnm","1748235291219984390"); + log.info("最终单点登录地址:"+ssoUrl); + openExplorer(ssoUrl); + } + + + /** + * 单点登录收款单列表页面 + */ + @Test + public void collectionList(){ + String ssoUrl = ssoToYSService.collectionList("qwertyvbnm"); + log.info("最终单点登录地址:"+ssoUrl); + openExplorer(ssoUrl); + } + + + + /** + * 打开浏览器,方便调试使用 + * @param url 最终的单点登录地址 + */ + public static void openExplorer(String url){ + try { + Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + url); + } catch (IOException e) { + e.printStackTrace(); + } + } + +} diff --git a/src/test/java/com/yonyou/openapi/staff/StaffApiTest.java b/src/test/java/com/yonyou/openapi/staff/StaffApiTest.java deleted file mode 100644 index d26f522ed629e204945975e081990edf4765ee65..0000000000000000000000000000000000000000 --- a/src/test/java/com/yonyou/openapi/staff/StaffApiTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.yonyou.openapi.staff; - - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.yonyou.openapi.service.staff.StaffApi; -import lombok.extern.slf4j.Slf4j; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import javax.annotation.Resource; -import java.util.HashMap; -import java.util.Map; - -/** - * @description: 员工档案列表查询测试用例 - **/ -@RunWith(SpringRunner.class) -@SpringBootTest -@Slf4j -public class StaffApiTest{ - - @Resource - StaffApi staffApi; - private ObjectMapper objectMapper = new ObjectMapper(); - - @Test - public void list() throws JsonProcessingException { - Map map = new HashMap<>(); - map.put("pageIndex",1); - map.put("pageSize",10); - Map result = staffApi.list(map); - log.info(objectMapper.writeValueAsString(result)); - } -}