wl_management/src/main/java/com/lz/common/utils/DingTalkUtil.java
2020-08-18 17:44:48 +08:00

250 lines
10 KiB
Java

package com.lz.common.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.*;
import com.dingtalk.api.response.*;
import com.lz.modules.job.model.responseBo.DepartmentInfosBo;
import com.lz.modules.job.model.responseBo.DepartmentStaffBo;
import com.lz.modules.third.entity.ThirdAppConfig;
import com.lz.modules.third.service.ThirdAppConfigService;
import com.lz.modules.third.service.impl.ThirdAppConfigServiceImpl;
import com.taobao.api.ApiException;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.IOException;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component("dingtalkRobotUtil")
public class DingTalkUtil {
protected static Logger logger = LoggerFactory.getLogger(DingTalkUtil.class);
@Autowired
RedisUtils redisUtils;
@Autowired
ThirdAppConfigService thirdAppConfigService;
CloseableHttpClient getHttpClient(){
return null;
}
/**
* 获取机器人的有效token值
*
* @return
* @throws IOException
*/
public String getAccessToken(String appid) {
try {
ThirdAppConfig thirdAppConfig = thirdAppConfigService.getByAppId(appid);
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
OapiGettokenRequest req = new OapiGettokenRequest();
req.setAppkey(thirdAppConfig.getAppKey());
req.setAppsecret(thirdAppConfig.getAppSecret());
req.setHttpMethod("GET");
OapiGettokenResponse rsp = client.execute(req);
String resultStr = rsp.getBody();
JSONObject dataObj = JSON.parseObject(resultStr);
String tenant_access_token = dataObj.getString("access_token");
return tenant_access_token;
} catch (ApiException e) {
e.printStackTrace();
}
return null;
}
/**
* 批量获取部门详情
*
* @param accessToken
* @return
*/
public List<DepartmentInfosBo> getDepartmentDetails(String accessToken, String departmentIds) {
try {
//下面获取所有部门的i就按单信息
List<DepartmentInfosBo> list = new ArrayList<>();
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/department/list");
OapiDepartmentListRequest req = new OapiDepartmentListRequest();
req.setFetchChild(true);
req.setId("1");
req.setHttpMethod("GET");
OapiDepartmentListResponse rsp = client.execute(req, accessToken);
JSONObject json = JSONObject.parseObject(rsp.getBody());
if(json.getInteger("errcode") == 0){
JSONArray array = json.getJSONArray("department");
for (int i = 0; i < array.size(); i++){
json = array.getJSONObject(i);
DepartmentInfosBo departmentInfosBo = new DepartmentInfosBo();
departmentInfosBo.setName(json.getString("name"));
departmentInfosBo.setId(json.getString("id"));//自身ID
departmentInfosBo.setParentId(json.getString("parentid"));//父级ID
//下面获取详细信息
client = new DefaultDingTalkClient("https://oapi.dingtalk.com/department/get");
OapiDepartmentGetRequest deReq = new OapiDepartmentGetRequest();
deReq.setId(departmentInfosBo.getId());
deReq.setHttpMethod("GET");
OapiDepartmentGetResponse deRsp = client.execute(deReq, accessToken);
json = JSONObject.parseObject(deRsp.getBody());
departmentInfosBo.setChatId(json.getString("deptGroupChatId"));
departmentInfosBo.setLeaderEmployeeId(json.getString("deptManagerUseridList"));//部门主管,多个主管以|隔开
departmentInfosBo.setStatus(1);
departmentInfosBo.setOrder(json.getInteger("order"));
list.add(departmentInfosBo);
}
}else{
logger.info("获取部门详情异常{}", rsp.getBody());
}
return list;
} catch (ApiException e) {
logger.info("获取部门详情异常{}", e);
}
return null;
}
/**
* 获取部门用户详情
*
* @param accessToken
* @return
*/
public List<DepartmentStaffBo> getDepartmentStaffDetails(String accessToken, String departmentId) {
try {
List<DepartmentStaffBo> list =new ArrayList<>();
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/listbypage");
OapiUserListbypageRequest req = new OapiUserListbypageRequest();
req.setDepartmentId(Long.parseLong(departmentId));
req.setSize(100L);
req.setHttpMethod("GET");
boolean isNext = true;
for(long page = 0; isNext; page++){
req.setOffset(page);
OapiUserListbypageResponse rsp = client.execute(req, accessToken);
JSONObject json = JSONObject.parseObject(rsp.getBody());
if(json.getInteger("errcode") == 0){
JSONArray array = json.getJSONArray("userlist");
isNext = json.getBoolean("hasMore");//获取是否由更多数据
for (int i = 0; i < array.size(); i++) {
json = array.getJSONObject(i);
DepartmentStaffBo departmentStaffBo = new DepartmentStaffBo();
departmentStaffBo.setEmployeeId(json.getString("userid"));//用户在企业内部的唯一编号,创建时可指定。可代表一定的含义
departmentStaffBo.setName(json.getString("name"));
departmentStaffBo.setEmployeeNo(json.getString("jobnumber"));//工号
departmentStaffBo.setUnionId(json.getString("unionid"));//企业内部id,唯一
departmentStaffBo.setOpenId(json.getString("openId"));//和上面的值目前是一样的,未找到说明
departmentStaffBo.setMobile(json.getString("mobile"));//手机,需要单独授权手机权限
departmentStaffBo.setEmail(json.getString("email"));//邮箱,钉钉的企业邮箱才可以,需要单独授权手机权限
departmentStaffBo.setAvatar(json.getString("avatar"));//头像
departmentStaffBo.setPosition(json.getString("position"));
if(json.getBoolean("active")){
//在职已激活
departmentStaffBo.setStatus(0);
}else{
//在职未激活
departmentStaffBo.setStatus(4);
}
if(json.getBoolean("isLeader")){
departmentStaffBo.setIsLeader(1);
}else{
departmentStaffBo.setIsLeader(0);
}
list.add(departmentStaffBo);
}
}else{
logger.info("获取部门详情异常{}", rsp.getBody());
}
}
return list;
} catch (ApiException e) {
e.printStackTrace();
}
return null;
}
/**
* 获取图片image_key
*
* @return
* @throws IOException
*/
public String getImageKey(File file, String tenant_access_token) throws IOException {
// File file = new File(imgUrl);
String result = "";//SendImageByApacheHttpClient(file, tenant_access_token);
JSONObject dataObj = JSON.parseObject(result);
String image_key = dataObj.getJSONObject("data").getString("image_key");
return image_key;
}
/**
* 获取飞书用户唯一标识
*
* @param mobile
* @param accessToken
* @return
*/
public static String getUserId(String mobile, String accessToken) {
String urlStr = "https://open.feishu.cn/open-apis/user/v1/batch_get_id?mobiles=" + mobile;
String result = HttpUtil.feishuGet(urlStr, accessToken);
JSONObject dataObj = JSON.parseObject(result);
String userId = dataObj.getJSONObject("data").getJSONObject("mobile_users").getJSONArray(mobile).getJSONObject(0).getString("user_id");
return userId;
}
public static void main(String[] args) {
DingTalkUtil dingTalkUtil = new DingTalkUtil();
String token = dingTalkUtil.getAccessToken("855818566");
}
}