DingDingUtil.java 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. package com.fourdage.dingding.util;
  2. import java.util.HashMap;
  3. import java.util.List;
  4. import java.util.Map;
  5. import cn.hutool.core.util.StrUtil;
  6. import cn.hutool.http.HttpRequest;
  7. import cn.hutool.http.HttpResponse;
  8. import cn.hutool.http.HttpUtil;
  9. import org.apache.commons.lang.StringUtils;
  10. import org.apache.shiro.SecurityUtils;
  11. import org.apache.shiro.subject.Subject;
  12. import org.joda.time.DateTime;
  13. import org.joda.time.format.DateTimeFormat;
  14. import org.joda.time.format.DateTimeFormatter;
  15. import org.slf4j.Logger;
  16. import org.slf4j.LoggerFactory;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.cache.ehcache.EhCacheCacheManager;
  19. import org.springframework.stereotype.Repository;
  20. import com.alibaba.fastjson.JSON;
  21. import com.alibaba.fastjson.JSONArray;
  22. import com.alibaba.fastjson.JSONObject;
  23. import com.fourdage.base.common.HttpHelper;
  24. import com.fourdage.dingding.entity.DingDingSearchBean;
  25. import com.fourdage.dingding.entity.ProcessInstance;
  26. import com.fourdage.system.entity.DataDictionary;
  27. import com.fourdage.system.entity.User;
  28. import com.fourdage.system.service.IDataDictionaryService;
  29. import net.sf.ehcache.Cache;
  30. import net.sf.ehcache.Element;
  31. @Repository
  32. public class DingDingUtil {
  33. private Logger logger = LoggerFactory.getLogger(getClass());
  34. @Autowired
  35. private IDataDictionaryService dataDictionaryService;
  36. @Autowired
  37. private EhCacheCacheManager ehCacheCacheManager;
  38. public String getTaskResult(String taskResult) {
  39. switch (taskResult) {
  40. case "AGREE":
  41. taskResult = "同意";
  42. break;
  43. case "REFUSE":
  44. taskResult = "拒绝";
  45. break;
  46. case "REDIRECTED":
  47. taskResult = "转交";
  48. break;
  49. default:
  50. taskResult = "";
  51. break;
  52. }
  53. return taskResult;
  54. }
  55. public JSONObject getDingDingJSONResult(String processInstanceId, String accessToken) {
  56. Map<String, Object> processMap = new HashMap<String, Object>();
  57. processMap.put("method", "dingtalk.smartwork.bpms.processinstance.get");
  58. processMap.put("session", accessToken);
  59. processMap.put("timestamp", Long.valueOf(System.currentTimeMillis()).toString());
  60. processMap.put("format", "json");
  61. processMap.put("v", "2.0");
  62. processMap.put("process_instance_id", processInstanceId);
  63. String resultStr = HttpHelper.sendGetByUrlConnection("https://eco.taobao.com/router/rest", processMap, "UTF-8");
  64. JSONObject resultStrObject = JSON.parseObject(resultStr);
  65. JSONObject jsonResult = resultStrObject.getJSONObject("dingtalk_smartwork_bpms_processinstance_get_response").getJSONObject("result");
  66. return jsonResult;
  67. }
  68. public String getStatus(String status){
  69. switch (status) {
  70. case "NEW":
  71. return "刚创建";
  72. case "RUNNING":
  73. return "运行中";
  74. case "TERMINATED":
  75. return "被终止";
  76. case "COMPLETED":
  77. return "完成";
  78. case "CANCELED":
  79. return "取消";
  80. default:
  81. return "";
  82. }
  83. }
  84. public boolean isJSONValid(String test) {
  85. try {
  86. JSONObject.parseObject(test);
  87. } catch (Exception ex) {
  88. try {
  89. JSONObject.parseArray(test);
  90. } catch (Exception ex1) {
  91. return false;
  92. }
  93. }
  94. return true;
  95. }
  96. public List<ProcessInstance> getProcesses(List<ProcessInstance> processes, DingDingSearchBean searchBean){
  97. logger.info("run getProcesses");
  98. DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
  99. Map<String, Object> processMap = new HashMap<String, Object>();
  100. processMap.put("method", "dingtalk.smartwork.bpms.processinstance.list");
  101. processMap.put("session", getAccessToken());
  102. processMap.put("timestamp", Long.valueOf(System.currentTimeMillis()).toString());
  103. processMap.put("format", "json");
  104. processMap.put("v", "2.0");
  105. processMap.put("process_code", searchBean.getProcessCode());
  106. processMap.put("start_time", searchBean.getStartTime());
  107. processMap.put("cursor", searchBean.getPage() == null ? 0 : searchBean.getPage());
  108. String resultStr = HttpHelper.sendGetByUrlConnection("https://eco.taobao.com/router/rest", processMap, "UTF-8");
  109. JSONObject resultStrObject = JSON.parseObject(resultStr);
  110. JSONObject jsonResult = resultStrObject.getJSONObject("dingtalk_smartwork_bpms_processinstance_list_response").getJSONObject("result");
  111. System.out.println("jsonResult:" + jsonResult);
  112. if (jsonResult.getBoolean("success")){
  113. JSONObject result = jsonResult.getJSONObject("result");
  114. JSONObject list = result.getJSONObject("list");
  115. JSONArray processInstanceTop = list.getJSONArray("process_instance_top_vo");
  116. if (processInstanceTop != null){
  117. for (Object obj : processInstanceTop){
  118. JSONObject jobj = (JSONObject)obj;
  119. String processInstanceResult = jobj.getString("process_instance_result");
  120. String status = jobj.getString("status");
  121. if (StringUtils.isEmpty(processInstanceResult) || StringUtils.isEmpty(status)
  122. || !"COMPLETED".equals(status)
  123. || !"agree".equals(processInstanceResult)
  124. ){
  125. continue;
  126. }
  127. if (jobj.getString("finish_time") == null){
  128. continue;
  129. }
  130. DateTime de = DateTime.parse(jobj.getString("finish_time"), format);
  131. if (de.isAfter(searchBean.getStartTimeSearch()) && de.isBefore(searchBean.getEndTimeSearch())){
  132. if (StringUtils.isNotEmpty(searchBean.getBusinessNum())
  133. && !jobj.getString("business_id").contains(searchBean.getBusinessNum())){
  134. continue;
  135. }
  136. if (StringUtils.isNotEmpty(searchBean.getCompany())){
  137. try {
  138. String company = jobj.getJSONObject("form_component_values").getJSONArray("form_component_value_vo").getJSONObject(0).getString("value");
  139. if (searchBean.getCompany().equals(company)){
  140. processes.add(getProcessInstance(format, jobj, processInstanceResult, status));
  141. }
  142. }catch(Exception e){}
  143. }else{
  144. processes.add(getProcessInstance(format, jobj, processInstanceResult, status));
  145. }
  146. }
  147. }
  148. // 查询下一页
  149. if (result.get("next_cursor") != null){
  150. searchBean.setPage(String.valueOf(result.getInteger("next_cursor")));
  151. getProcesses(processes, searchBean);
  152. }
  153. }
  154. }
  155. return processes;
  156. }
  157. private ProcessInstance getProcessInstance(DateTimeFormatter format, JSONObject jobj, String processInstanceResult,
  158. String status) {
  159. ProcessInstance process = new ProcessInstance();
  160. process.setBusinessId(jobj.getString("business_id"));
  161. if (jobj.getString("create_time") != null){
  162. process.setCreateTime(DateTime.parse(jobj.getString("create_time"), format).toDate());
  163. }
  164. if (jobj.getString("finish_time") != null){
  165. process.setFinishTime(DateTime.parse(jobj.getString("finish_time"), format).toDate());
  166. }
  167. process.setOriginatorDeptId(jobj.getString("originator_dept_id"));
  168. process.setOriginatorUserId(jobj.getString("originator_userid"));
  169. process.setProcessInstanceId(jobj.getString("process_instance_id"));
  170. process.setResult(processInstanceResult);
  171. process.setStatus(status);
  172. process.setTitle(jobj.getString("title"));
  173. return process;
  174. }
  175. public String getRegion(){
  176. Subject subject = SecurityUtils.getSubject();
  177. Object principal = subject.getPrincipal();
  178. String region = "zh";
  179. if (principal != null) {
  180. region = ((User) principal).getAddress();
  181. }
  182. return region;
  183. }
  184. public String getAccessToken() {
  185. String region = getRegion();
  186. DataDictionary searchCondition = new DataDictionary();
  187. searchCondition.setCode("dingding_corp_code");
  188. searchCondition.setParam1(region);
  189. Cache cache = ehCacheCacheManager.getCacheManager().getCache("accessToken");
  190. Element sessionKey = cache.get(searchCondition.getParam1());
  191. if (sessionKey != null){
  192. return (String) sessionKey.getObjectValue();
  193. }
  194. List<DataDictionary> datas = dataDictionaryService.findByCondition(searchCondition);
  195. Map<String, Object> tokenMap = new HashMap<String, Object>();
  196. tokenMap.put("corpid", datas.get(0).getDataKey());
  197. tokenMap.put("corpsecret", datas.get(0).getDataValue());
  198. String accessTokenStr = HttpHelper.sendGetByHttpUrlConnection("https://oapi.dingtalk.com/gettoken", tokenMap, "UTF-8");
  199. JSONObject jsonObject = JSON.parseObject(accessTokenStr);
  200. String accessToken = jsonObject.getString("access_token");
  201. Element elementSession = new Element(searchCondition.getParam1(), accessToken);
  202. cache.put(elementSession);
  203. cache.flush();
  204. return accessToken;
  205. }
  206. public String getFileName(String processCode, String title, String businessId){
  207. StringBuffer sb = new StringBuffer();
  208. sb.append(processCode).append("/").append(title).append(businessId);
  209. return sb.toString();
  210. }
  211. public static void main(String[] args) {
  212. DingDingUtil util = new DingDingUtil();
  213. System.out.println(util.getAccessToken());
  214. }
  215. public void getWorkflowInfo(String accessToken, String processInstanceId){
  216. String api = StrUtil.format("https://api.dingtalk.com/v1.0/workflow/processInstances?processInstanceId={}", processInstanceId);
  217. HttpResponse response = HttpUtil.createGet(api).header("x-acs-dingtalk-access-token", accessToken).execute();
  218. logger.info("钉钉返回值:{}", response.body());
  219. }
  220. }