wl_management/src/main/java/com/lz/common/utils/DingTalkUtil.java
2020-08-25 14:23:57 +08:00

408 lines
17 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.app.entity.StaffEntity;
import com.lz.modules.app.service.StaffService;
import com.lz.modules.job.model.responseBo.DepartmentInfosBo;
import com.lz.modules.job.model.responseBo.DepartmentStaffBo;
import com.lz.modules.luck.entity.LuckRecord;
import com.lz.modules.luck.service.LuckRecordService;
import com.lz.modules.sys.entity.SysUserEntity;
import com.lz.modules.sys.service.SysUserTokenService;
import com.lz.modules.third.entity.ThirdAppConfig;
import com.lz.modules.third.entity.ThirdMsgSendRecord;
import com.lz.modules.third.service.ThirdAppConfigService;
import com.lz.modules.third.service.ThirdMsgSendRecordService;
import com.lz.modules.third.service.impl.ThirdAppConfigServiceImpl;
import com.taobao.api.ApiException;
import net.bytebuddy.implementation.bytecode.Throw;
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;
@Autowired
ThirdMsgSendRecordService thirdMsgSendRecordService;
@Autowired
StaffService staffService;
@Autowired
LuckRecordService luckRecordService;
@Autowired
private SysUserTokenService sysUserTokenService;
CloseableHttpClient getHttpClient(){
return null;
}
/**
* 获取机器人的有效token值
*
* @return
* @throws IOException
*/
public String getAccessToken(String appid) {
ThirdAppConfig thirdAppConfig = thirdAppConfigService.getByAppId(appid);
return getAccessTokenWitchEntity(thirdAppConfig);
}
public String getAccessTokenWitchEntity(ThirdAppConfig thirdAppConfig) {
try {
if(thirdAppConfig != null){
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();
logger.info("钉钉请求返回", rsp.getBody());
JSONObject dataObj = JSON.parseObject(resultStr);
String tenant_access_token = dataObj.getString("access_token");
return tenant_access_token;
}else{
logger.info("appid不存在数据库未配置appid");
}
} catch (Exception e) {
e.printStackTrace();
logger.info("获取token异常{}", e);
}
return null;
}
/**
* 批量获取部门详情
*
* @param accessToken
* @return
*/
public Map<String, DepartmentInfosBo> getDepartmentDetails(String accessToken, String departmentIds) {
try {
//下面获取所有部门的i就按单信息
Map<String, DepartmentInfosBo> list = new HashMap<>();
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.put(departmentInfosBo.getId(), departmentInfosBo);
}
}else{
logger.info("获取部门详情异常{}", rsp.getBody());
}
return list;
} catch (Exception 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"));
departmentStaffBo.setStatus(0);
/*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 (Exception e) {
e.printStackTrace();
logger.info("获取部门用户详情异常{}", e);
}
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("856016278");
}
public String sendSingleActionCardMSG(String appid, StaffEntity staff, String title, String marDown, String singleTitle, String singleUrl, String token) {
String msg = "OK";
ThirdMsgSendRecord thirdMsgSendRecord = new ThirdMsgSendRecord();
thirdMsgSendRecord.setMsgType("action_card");
thirdMsgSendRecord.setStaffId(staff.getId());
thirdMsgSendRecord.setMsgTitle(singleTitle);
thirdMsgSendRecord.setAppId(Long.parseLong(appid));
thirdMsgSendRecord.setHeadText(title);
thirdMsgSendRecord.setMsgContent(marDown);
thirdMsgSendRecord.setMsgUrl(singleUrl);
thirdMsgSendRecord.setStatus(0);
try{
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
OapiMessageCorpconversationAsyncsendV2Request req = new OapiMessageCorpconversationAsyncsendV2Request();
req.setAgentId(thirdMsgSendRecord.getAppId());
req.setUseridList(staff.getEmployeeId());
OapiMessageCorpconversationAsyncsendV2Request.Msg obj1 = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
obj1.setMsgtype(thirdMsgSendRecord.getMsgType());
OapiMessageCorpconversationAsyncsendV2Request.ActionCard obj2 = new OapiMessageCorpconversationAsyncsendV2Request.ActionCard();
obj2.setSingleUrl(thirdMsgSendRecord.getMsgUrl());
obj2.setSingleTitle(thirdMsgSendRecord.getMsgTitle());
obj2.setMarkdown(thirdMsgSendRecord.getMsgContent());
obj2.setTitle(thirdMsgSendRecord.getHeadText());
obj1.setActionCard(obj2);
req.setMsg(obj1);
OapiMessageCorpconversationAsyncsendV2Response rsp = client.execute(req, token);
//插入数据库
JSONObject json = JSONObject.parseObject(rsp.getBody());
if(json.getIntValue("errcode") == 0){
thirdMsgSendRecord.setTaskId(json.getLong("task_id"));
thirdMsgSendRecord.setStatus(1);
}else{
thirdMsgSendRecord.setTaskId(0L);
thirdMsgSendRecord.setStatus(6);
thirdMsgSendRecord.setRemark(json.getString("errmsg"));
msg = thirdMsgSendRecord.getRemark();
}
}catch (ApiException e) {
e.printStackTrace();
thirdMsgSendRecord.setStatus(6);
thirdMsgSendRecord.setRemark(e.getErrMsg());
msg = thirdMsgSendRecord.getRemark();
}
thirdMsgSendRecordService.insert(thirdMsgSendRecord);
return msg;
}
public R getUserIdByCode(String code, String token) {
try {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/getuserinfo");
OapiUserGetuserinfoRequest req = new OapiUserGetuserinfoRequest();
req.setCode(code);
req.setHttpMethod("GET");
OapiUserGetuserinfoResponse rsp = client.execute(req, token);
JSONObject json = JSONObject.parseObject(rsp.getBody());
if(json.getIntValue("errcode") == 0){
String employeeId = json.getString("userid");
StaffEntity staffEntity = staffService.selectStaffByEmployeeId(employeeId);
if(staffEntity != null){
//登录操作
SysUserEntity user = new SysUserEntity();
user.setPassword(staffEntity.getPassword());
user.setMobile(staffEntity.getMobile());
user.setUserId(staffEntity.getId());
user.setEmail(staffEntity.getEmail());
user.setSalt(staffEntity.getSalt());
user.setStatus(1);
user.setType(1);
user.setRealName(staffEntity.getName());
user.setUserNo(staffEntity.getMobile());
return sysUserTokenService.createTokenSetTokenCode(user, code);
}
return R.error("用户不存在");
}
return R.error("请求钉钉异常:" + json.getString("errmsg"));
} catch (ApiException e) {
e.printStackTrace();
return R.error(e.getErrMsg());
}
}
public R luck(String code, String token, Long luckId) {
try {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/getuserinfo");
OapiUserGetuserinfoRequest req = new OapiUserGetuserinfoRequest();
req.setCode(code);
req.setHttpMethod("GET");
OapiUserGetuserinfoResponse rsp = client.execute(req, token);
JSONObject json = JSONObject.parseObject(rsp.getBody());
if(json.getIntValue("errcode") == 0){
String employeeId = json.getString("userid");
StaffEntity staffEntity = staffService.selectStaffByEmployeeId(employeeId);
if(staffEntity != null){
LuckRecord luckRecord = luckRecordService.selectLuckRecordByLuckIdAndStaffId(luckId, staffEntity.getId());
if(luckRecord == null){//插入抽奖记录
luckRecord = new LuckRecord();
luckRecord.setStaffId(staffEntity.getId());
luckRecord.setLuckId(luckId);
luckRecord.setName(staffEntity.getName());
luckRecord.setMobile(staffEntity.getMobile());
luckRecordService.insertLuckRecord(luckRecord);
}
//登录操作
return R.ok();
}
return R.error("用户不存在");
}
return R.error("请求钉钉异常:" + json.getString("errmsg"));
} catch (ApiException e) {
e.printStackTrace();
return R.error(e.getErrMsg());
}
}
}