package com.qianwen.smartman.modules.sync.api;
|
|
import cn.hutool.core.collection.ListUtil;
|
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.http.HttpUtil;
|
import cn.hutool.json.JSONArray;
|
import cn.hutool.json.JSONObject;
|
import cn.hutool.json.JSONUtil;
|
import com.beust.jcommander.ParameterException;
|
import com.jeecg.qywx.api.base.JwAccessTokenAPI;
|
import com.jeecg.qywx.api.core.common.AccessToken;
|
import com.jeecg.qywx.api.department.vo.Department;
|
import java.util.ArrayDeque;
|
import java.util.ArrayList;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.Objects;
|
import java.util.StringJoiner;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import com.qianwen.smartman.common.utils.MessageUtils;
|
import com.qianwen.core.log.exception.ServiceException;
|
import com.qianwen.core.redis.cache.BladeRedis;
|
import com.qianwen.core.tool.api.IResultCode;
|
import com.qianwen.core.tool.utils.SpringUtil;
|
import com.qianwen.smartman.modules.sync.constant.OuterAppConfigConstant;
|
import com.qianwen.smartman.modules.sync.constant.QyWechatApiConstant;
|
import com.qianwen.smartman.modules.sync.constant.QyWechatConstant;
|
import com.qianwen.smartman.modules.sync.entity.OuterAppConfig;
|
import com.qianwen.smartman.modules.sync.entity.QyTag;
|
import com.qianwen.smartman.modules.sync.entity.QyUser;
|
import com.qianwen.smartman.modules.sync.entity.QyUserTicket;
|
import com.qianwen.smartman.modules.sync.service.impl.OuterAppConfigServiceImpl;
|
|
|
/* loaded from: blade-api.jar:BOOT-INF/classes/org/springblade/modules/sync/api/QyWechatApi.class */
|
public class QyWechatApi {
|
private static final Logger log = LoggerFactory.getLogger(QyWechatApi.class);
|
|
public static List<Department> getDepartmentAll() {
|
log.info("[企业微信获取所有的部门].[getDepartmentAll start]");
|
return listApi(null, QyWechatApiConstant.DEPARTMENT_LIST_URL, "department", Department.class, new String[0]);
|
}
|
|
public static List<Department> getDepartmentAll(String token) {
|
log.info("[企业微信获取所有的部门].[getDepartmentAll start]");
|
return listApi(token, QyWechatApiConstant.DEPARTMENT_LIST_URL, "department", Department.class, new String[0]);
|
}
|
|
public static List<QyUser> getUsersByDepartId(String deptId) {
|
log.info("[企业微信获取部门下的用户].[getUsersByDepartId start,departmentId={}]", deptId);
|
return listApi(null, QyWechatApiConstant.USER_LIST_BY_DEPARTMENT_URL, QyWechatConstant.USER_LIST_KEY, QyUser.class, deptId);
|
}
|
|
public static List<QyUser> getUsersByDepartId(String token, String deptId) {
|
log.info("[企业微信获取部门下的用户].[getUsersByDepartId start,departmentId={}]", deptId);
|
return listApi(token, QyWechatApiConstant.USER_LIST_BY_DEPARTMENT_URL, QyWechatConstant.USER_LIST_KEY, QyUser.class, deptId);
|
}
|
|
public static List<QyTag> getTags() {
|
log.info("[企业微信获取岗位列表].[getTags start]");
|
return listApi(null, QyWechatApiConstant.TAG_LIST_URL, QyWechatConstant.TAG_LIST_KEY, QyTag.class, new String[0]);
|
}
|
|
public static List<QyTag> getTags(String token) {
|
log.info("[企业微信获取岗位列表].[getTags start]");
|
return listApi(token, QyWechatApiConstant.TAG_LIST_URL, QyWechatConstant.TAG_LIST_KEY, QyTag.class, new String[0]);
|
}
|
|
public static Map<String, StringJoiner> getUserTagMap() {
|
Map<String, StringJoiner> resTagMap = new HashMap<>();
|
List<QyTag> tags = getTags();
|
for (QyTag tag : tags) {
|
List<QyUser> userListByTag = getUserListByTag(tag.getTagid());
|
for (QyUser qyUser : userListByTag) {
|
StringJoiner tagIdJoiner = resTagMap.get(qyUser.getUserid());
|
if (Objects.isNull(tagIdJoiner)) {
|
StringJoiner postIdJoiner = new StringJoiner(",");
|
postIdJoiner.add(tag.getTagid());
|
resTagMap.put(qyUser.getUserid(), postIdJoiner);
|
} else {
|
tagIdJoiner.add(tag.getTagid());
|
}
|
}
|
}
|
return resTagMap;
|
}
|
|
public static Department getDeptById(String token, String deptId) {
|
return (Department) getObjApi(token, QyWechatApiConstant.DEPT_GET_BY_ID_URL, Department.class, deptId);
|
}
|
|
public static Department getDeptById(String deptId) {
|
return (Department) getObjApi(null, QyWechatApiConstant.DEPT_GET_BY_ID_URL, Department.class, deptId);
|
}
|
|
public static List<QyUser> getUserListByTag(String tagId) {
|
log.info("[企业微信获取该岗位的员工].[getUserListByTag start,tagId={}]", tagId);
|
return listApi(null, QyWechatApiConstant.TAG_USER_URL, QyWechatConstant.USER_LIST_KEY, QyUser.class, tagId);
|
}
|
|
public static List<QyUser> getUserListByTag(String token, String tagId) {
|
log.info("[企业微信获取该岗位的员工].[getUserListByTag start,tagId={}]", tagId);
|
return listApi(token, QyWechatApiConstant.TAG_USER_URL, QyWechatConstant.USER_LIST_KEY, QyUser.class, tagId);
|
}
|
|
public static QyUser getUserById(String userId) {
|
log.info("[企业微信根据用户id获取用户].[getUserById start,userId={}]", userId);
|
return (QyUser) getObjApi(null, QyWechatApiConstant.USERINFO_BY_ID_URL, QyUser.class, userId);
|
}
|
|
public static QyUser getUserById(String token, String userId) {
|
log.info("[企业微信根据用户id获取用户].[getUserById start,userId={}]", userId);
|
return (QyUser) getObjApi(token, QyWechatApiConstant.USERINFO_BY_ID_URL, QyUser.class, userId);
|
}
|
|
private static String getAccessToken(Integer type) {
|
OuterAppConfigServiceImpl configService = (OuterAppConfigServiceImpl) SpringUtil.getBean(OuterAppConfigServiceImpl.class);
|
OuterAppConfig appConfig = configService.getAppConfig(OuterAppConfigConstant.QY_WECHAT);
|
if (Objects.isNull(appConfig)) {
|
throw new ServiceException(MessageUtils.message("sync.qy.config.not.exist", new Object[0]));
|
}
|
String cacheKey = QyWechatConstant.TOKEN_KEY + (type.equals(QyWechatConstant.BOOK_TYPE) ? QyWechatConstant.BOOK_TYPE : QyWechatConstant.QY_APP_TYPE);
|
BladeRedis bladeRedis = (BladeRedis) SpringUtil.getBean(BladeRedis.class);
|
Object tokenObj = bladeRedis.get(cacheKey);
|
if (!Objects.isNull(tokenObj)) {
|
return String.valueOf(tokenObj);
|
}
|
String syncSecret = type.equals(QyWechatConstant.BOOK_TYPE) ? appConfig.getWxBookSecret() : appConfig.getWxAppSecret();
|
AccessToken accessToken = JwAccessTokenAPI.getAccessToken(appConfig.getWxCorpId(), syncSecret);
|
if (Objects.isNull(accessToken)) {
|
throw new ServiceException(MessageUtils.message("sync.qy.generate.token.fail", new Object[0]));
|
}
|
bladeRedis.setEx(cacheKey, accessToken.getAccesstoken(), Long.valueOf(accessToken.getExpiresIn()));
|
return accessToken.getAccesstoken();
|
}
|
|
public static String getBookAccessToken() {
|
return getAccessToken(QyWechatConstant.BOOK_TYPE);
|
}
|
|
public static String getAppAccessToken() {
|
return getAccessToken(QyWechatConstant.QY_APP_TYPE);
|
}
|
|
public static QyUserTicket getUserTicketByCode(String code) {
|
log.info("[企业微信根据授权Code获取用户身份].[getUserTicketByCode code={}]", code);
|
return (QyUserTicket) getObjApi(null, QyWechatApiConstant.USER_TICKET_URL, QyUserTicket.class, code);
|
}
|
|
public static QyUserTicket getUserTicketByCode(String token, String code) {
|
log.info("[企业微信根据授权Code获取用户身份].[getUserTicketByCode code={}]", code);
|
return (QyUserTicket) getObjApi(token, QyWechatApiConstant.USER_TICKET_URL, QyUserTicket.class, code);
|
}
|
|
public static QyUser getUserDetailByTicket(String userTicket) {
|
log.info("[企业微信根据用户授权身份获取详情].[getUserDetailByTicket userTicket={}]", userTicket);
|
if (StrUtil.isEmpty(userTicket)) {
|
throw new ParameterException("用户身份参数异常");
|
}
|
JSONObject params = JSONUtil.createObj().put("user_ticket", userTicket);
|
return (QyUser) postObjApi(null, QyWechatApiConstant.AUTH_USER_DETAIL_URL, QyUser.class, JSONUtil.toJsonStr(params), new String[0]);
|
}
|
|
public static QyUser getUserDetailByTicket(String token, String userTicket) {
|
log.info("[企业微信根据用户授权身份获取详情].[getUserDetailByTicket userTicket={}]", userTicket);
|
if (StrUtil.isEmpty(userTicket)) {
|
throw new ParameterException("用户身份参数异常");
|
}
|
JSONObject params = JSONUtil.createObj().put("user_ticket", userTicket);
|
return (QyUser) postObjApi(token, QyWechatApiConstant.AUTH_USER_DETAIL_URL, QyUser.class, JSONUtil.toJsonStr(params), new String[0]);
|
}
|
|
private static <T> List<T> listApi(String token, String apiUrl, String responseKey, Class<T> responseClass, String... params) {
|
String accessToken = StrUtil.isEmpty(token) ? getAppAccessToken() : token;
|
String requestUrl = parseRequestUrl(apiUrl, handlerParam(accessToken, params));
|
log.info("[企业微信API].[list->api调用 request apiUrl={}]", requestUrl);
|
String responseData = HttpUtil.get(requestUrl);
|
log.info("[企业微信API].[list->api调用 response class={},responseData={}]", responseClass, responseData);
|
if (StrUtil.isEmpty(responseData)) {
|
return new ArrayList();
|
}
|
return parseResponseDataList(responseData, responseClass, responseKey);
|
}
|
|
private static String[] handlerParam(String accessToken, String... params) {
|
ArrayDeque<String> arrayDeque = new ArrayDeque<>(ListUtil.toList(params));
|
arrayDeque.addFirst(accessToken);
|
String[] temp = new String[arrayDeque.size()];
|
return (String[]) arrayDeque.toArray(temp);
|
}
|
|
private static <T> T getObjApi(String token, String apiUrl, Class<T> responseClass, String... params) {
|
String accessToken = StrUtil.isEmpty(token) ? getAppAccessToken() : token;
|
String requestUrl = parseRequestUrl(apiUrl, handlerParam(accessToken, params));
|
log.info("[企业微信API].[obj->api调用 【GET】 request apiUrl={}]", requestUrl);
|
String responseData = HttpUtil.get(requestUrl);
|
log.info("[企业微信API].[obj->api调用 response class={},responseData={}]", responseClass, responseData);
|
if (StrUtil.isEmpty(responseData)) {
|
return null;
|
}
|
return (T) parseResponseDataObj(responseData, responseClass);
|
}
|
|
private static <T> T postObjApi(String token, String apiUrl, Class<T> responseClass, String body, String... params) {
|
String accessToken = StrUtil.isEmpty(token) ? getAppAccessToken() : token;
|
String requestUrl = parseRequestUrl(apiUrl, handlerParam(accessToken, params));
|
log.info("[企业微信API].[obj->api调用 【POST】 request apiUrl={}]", requestUrl);
|
String responseData = HttpUtil.post(requestUrl, body);
|
log.info("[企业微信API].[obj->api调用 response class={},responseData={}]", responseClass, responseData);
|
if (StrUtil.isEmpty(responseData)) {
|
return null;
|
}
|
return (T) parseResponseDataObj(responseData, responseClass);
|
}
|
|
private static <T> List<T> parseResponseDataList(String responseData, Class<T> clazz, String dataKey) {
|
JSONObject jsonObject = JSONUtil.parseObj(responseData);
|
Integer errCode = jsonObject.getInt(QyWechatConstant.ERROR_CODE_KEY);
|
String errMsg = jsonObject.getStr(QyWechatConstant.ERROR_MSG_KEY);
|
if (errCode.equals(QyWechatConstant.SUCCESS)) {
|
JSONArray jsonArray = jsonObject.getJSONArray(dataKey);
|
return JSONUtil.toList(jsonArray, clazz);
|
}
|
log.error("[parseResponseData].[请求方法= {} error errCode={},errMsg={}]", new Object[]{Thread.currentThread().getStackTrace()[2].getMethodName(), errCode, errMsg});
|
errCheck(errMsg, errCode);
|
return null;
|
}
|
|
private static <T> T parseResponseDataObj(String responseData, Class<T> clazz) {
|
JSONObject jsonObject = JSONUtil.parseObj(responseData);
|
Integer errCode = jsonObject.getInt(QyWechatConstant.ERROR_CODE_KEY);
|
String errMsg = jsonObject.getStr(QyWechatConstant.ERROR_MSG_KEY);
|
if (errCode.equals(QyWechatConstant.SUCCESS)) {
|
return (T) jsonObject.toBean(clazz);
|
}
|
log.error("[parseResponseData].[请求方法= {} error errCode={},errMsg={}]", new Object[]{Thread.currentThread().getStackTrace()[2].getMethodName(), errCode, errMsg});
|
errCheck(errMsg, errCode);
|
return null;
|
}
|
|
private static void errCheck(String errMsg, Integer errCode) {
|
if (errCode.intValue() == 40029) {
|
throw new ServiceException(setResultCode(MessageUtils.message("sync.qy.login.invalid.code", new Object[0]), 400));
|
}
|
if (errCode.intValue() == 60020) {
|
throw new ServiceException(setResultCode(MessageUtils.message("sync.qy.ip.trust", new Object[0]) + SystemPropertyUtils.VALUE_SEPARATOR + errMsg, 400));
|
}
|
throw new ServiceException(setResultCode(MessageUtils.message("sync.qy.api.error", new Object[0]) + SystemPropertyUtils.VALUE_SEPARATOR + errMsg, 400));
|
}
|
|
private static IResultCode setResultCode(final String errMsg, final Integer code) {
|
return new IResultCode() { // from class: org.springblade.modules.sync.api.QyWechatApi.1
|
public String getMessage() {
|
return errMsg;
|
}
|
|
public int getCode() {
|
return code.intValue();
|
}
|
};
|
}
|
|
public static String parseRequestUrl(String url, String... params) {
|
String requestUrl = url;
|
for (int i = 0; i < params.length; i++) {
|
String placeholder = StrUtil.format("{{}}", new Object[]{Integer.valueOf(i)});
|
requestUrl = requestUrl.replace(placeholder, params[i]);
|
}
|
return requestUrl;
|
}
|
}
|