123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287 |
- package com.fourdage.dingding.util;
- import java.time.Instant;
- import java.time.LocalDateTime;
- import java.time.ZoneId;
- import java.time.ZonedDateTime;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import cn.hutool.core.util.StrUtil;
- import cn.hutool.http.HttpRequest;
- import cn.hutool.http.HttpResponse;
- import cn.hutool.http.HttpUtil;
- import org.apache.commons.lang.StringUtils;
- import org.apache.shiro.SecurityUtils;
- import org.apache.shiro.subject.Subject;
- import org.joda.time.DateTime;
- import org.joda.time.format.DateTimeFormat;
- import org.joda.time.format.DateTimeFormatter;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.cache.ehcache.EhCacheCacheManager;
- import org.springframework.stereotype.Repository;
- import com.alibaba.fastjson.JSON;
- import com.alibaba.fastjson.JSONArray;
- import com.alibaba.fastjson.JSONObject;
- import com.fourdage.base.common.HttpHelper;
- import com.fourdage.dingding.entity.DingDingSearchBean;
- import com.fourdage.dingding.entity.ProcessInstance;
- import com.fourdage.system.entity.DataDictionary;
- import com.fourdage.system.entity.User;
- import com.fourdage.system.service.IDataDictionaryService;
- import net.sf.ehcache.Cache;
- import net.sf.ehcache.Element;
- @Repository
- public class DingDingUtil {
- private Logger logger = LoggerFactory.getLogger(getClass());
-
- @Autowired
- private IDataDictionaryService dataDictionaryService;
-
- @Autowired
- private EhCacheCacheManager ehCacheCacheManager;
-
- public String getTaskResult(String taskResult) {
- switch (taskResult) {
- case "AGREE":
- taskResult = "同意";
- break;
- case "REFUSE":
- taskResult = "拒绝";
- break;
- case "REDIRECTED":
- taskResult = "转交";
- break;
- default:
- taskResult = "";
- break;
- }
- return taskResult;
- }
-
- public JSONObject getDingDingJSONResult(String processInstanceId, String accessToken) {
- Map<String, Object> processMap = new HashMap<String, Object>();
- processMap.put("method", "dingtalk.smartwork.bpms.processinstance.get");
- processMap.put("session", accessToken);
- processMap.put("timestamp", Long.valueOf(System.currentTimeMillis()).toString());
- processMap.put("format", "json");
- processMap.put("v", "2.0");
- processMap.put("process_instance_id", processInstanceId);
-
- String resultStr = HttpHelper.sendGetByUrlConnection("https://eco.taobao.com/router/rest", processMap, "UTF-8");
- JSONObject resultStrObject = JSON.parseObject(resultStr);
- JSONObject jsonResult = resultStrObject.getJSONObject("dingtalk_smartwork_bpms_processinstance_get_response").getJSONObject("result");
- return jsonResult;
- }
- public String getStatus(String status){
- switch (status) {
- case "NEW":
- return "刚创建";
- case "RUNNING":
- return "运行中";
- case "TERMINATED":
- return "被终止";
- case "COMPLETED":
- return "完成";
- case "CANCELED":
- return "取消";
- default:
- return "";
- }
- }
-
- public boolean isJSONValid(String test) {
- try {
- JSONObject.parseObject(test);
- } catch (Exception ex) {
- try {
- JSONObject.parseArray(test);
- } catch (Exception ex1) {
- return false;
- }
- }
- return true;
- }
-
- public List<ProcessInstance> getProcesses(List<ProcessInstance> processes, DingDingSearchBean searchBean){
- logger.info("run getProcesses");
-
- DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
-
- Map<String, Object> processMap = new HashMap<String, Object>();
- processMap.put("method", "dingtalk.smartwork.bpms.processinstance.list");
- processMap.put("session", getAccessToken());
- String timestamp = Long.valueOf(System.currentTimeMillis()).toString();
- processMap.put("timestamp", timestamp);
- processMap.put("format", "json");
- processMap.put("v", "2.0");
- processMap.put("process_code", searchBean.getProcessCode());
- long startTime = searchBean.getStartTime();
- Instant instant = Instant.ofEpochMilli(startTime);
- LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
- logger.info("start_time: {}, 时间:{}", startTime, localDateTime);
- processMap.put("start_time", startTime);
- processMap.put("cursor", searchBean.getPage() == null ? 0 : searchBean.getPage());
-
- String resultStr = HttpHelper.sendGetByUrlConnection("https://eco.taobao.com/router/rest", processMap, "UTF-8");
- JSONObject resultStrObject = JSON.parseObject(resultStr);
- JSONObject jsonResult = resultStrObject.getJSONObject("dingtalk_smartwork_bpms_processinstance_list_response").getJSONObject("result");
- System.out.println("jsonResult:" + jsonResult);
-
- if (jsonResult.getBoolean("success")){
- JSONObject result = jsonResult.getJSONObject("result");
- JSONObject list = result.getJSONObject("list");
- JSONArray processInstanceTop = list.getJSONArray("process_instance_top_vo");
- if (processInstanceTop != null){
- long startTimeSearch = searchBean.getStartTimeSearch();
- long endTimeSearch = searchBean.getEndTimeSearch();
- logger.info("查询开始时间:{}, 查询结束时间:{}", DateUtils.getStrTime(startTimeSearch), DateUtils.getStrTime(endTimeSearch));
- for (Object obj : processInstanceTop){
- JSONObject jobj = (JSONObject)obj;
-
- String processInstanceResult = jobj.getString("process_instance_result");
- String status = jobj.getString("status");
- if (StringUtils.isEmpty(processInstanceResult) || StringUtils.isEmpty(status)
- || !"COMPLETED".equals(status)
- || !"agree".equals(processInstanceResult)
- ){
- continue;
- }
- if (jobj.getString("finish_time") == null){
- continue;
- }
-
- String finishTime = jobj.getString("finish_time");
- String businessId = jobj.getString("business_id");
- String title = jobj.getString("title");
- logger.info("订单号:{}, 订单名称:{}, 完成时间:{}, 当前状态:{}", businessId, title, finishTime, status);
- DateTime de = DateTime.parse(finishTime, format);
- if (de.isAfter(startTimeSearch) && de.isBefore(endTimeSearch)){
- if (StringUtils.isNotEmpty(searchBean.getBusinessNum()) && !businessId.contains(searchBean.getBusinessNum())){
- continue;
- }
-
- if (StringUtils.isNotEmpty(searchBean.getCompany())){
- try {
- String company = jobj.getJSONObject("form_component_values").getJSONArray("form_component_value_vo").getJSONObject(0).getString("value");
- if (searchBean.getCompany().equals(company)){
- processes.add(getProcessInstance(format, jobj, processInstanceResult, status));
- }
- }catch(Exception e){}
- }else{
- processes.add(getProcessInstance(format, jobj, processInstanceResult, status));
- }
- }
- }
- // 查询下一页
- if (result.get("next_cursor") != null){
- logger.info("查询下一页");
- searchBean.setPage(String.valueOf(result.getInteger("next_cursor")));
- getProcesses(processes, searchBean);
- }
- }
- }
- return processes;
- }
- private ProcessInstance getProcessInstance(DateTimeFormatter format, JSONObject jobj, String processInstanceResult,
- String status) {
- ProcessInstance process = new ProcessInstance();
- process.setBusinessId(jobj.getString("business_id"));
-
- if (jobj.getString("create_time") != null){
- process.setCreateTime(DateTime.parse(jobj.getString("create_time"), format).toDate());
- }
- if (jobj.getString("finish_time") != null){
- process.setFinishTime(DateTime.parse(jobj.getString("finish_time"), format).toDate());
- }
- process.setOriginatorDeptId(jobj.getString("originator_dept_id"));
- process.setOriginatorUserId(jobj.getString("originator_userid"));
- process.setProcessInstanceId(jobj.getString("process_instance_id"));
- process.setResult(processInstanceResult);
- process.setStatus(status);
- process.setTitle(jobj.getString("title"));
- return process;
- }
-
- public String getRegion(){
- Subject subject = SecurityUtils.getSubject();
- Object principal = subject.getPrincipal();
- String region = "zh";
- if (principal != null) {
- region = ((User) principal).getAddress();
- }
- return region;
- }
-
- public String getAccessToken() {
- String region = getRegion();
-
- DataDictionary searchCondition = new DataDictionary();
- searchCondition.setCode("dingding_corp_code");
- searchCondition.setParam1(region);
-
- Cache cache = ehCacheCacheManager.getCacheManager().getCache("accessToken");
- Element sessionKey = cache.get(searchCondition.getParam1());
- if (sessionKey != null){
- return (String) sessionKey.getObjectValue();
- }
-
- List<DataDictionary> datas = dataDictionaryService.findByCondition(searchCondition);
-
- Map<String, Object> tokenMap = new HashMap<String, Object>();
- tokenMap.put("corpid", datas.get(0).getDataKey());
- tokenMap.put("corpsecret", datas.get(0).getDataValue());
-
- String accessTokenStr = HttpHelper.sendGetByHttpUrlConnection("https://oapi.dingtalk.com/gettoken", tokenMap, "UTF-8");
- JSONObject jsonObject = JSON.parseObject(accessTokenStr);
- String accessToken = jsonObject.getString("access_token");
-
- Element elementSession = new Element(searchCondition.getParam1(), accessToken);
- cache.put(elementSession);
- cache.flush();
-
- return accessToken;
- }
-
- public String getFileName(String processCode, String title, String businessId){
- StringBuffer sb = new StringBuffer();
- sb.append(processCode).append("/").append(title).append(businessId);
- return sb.toString();
-
- }
- public static void main(String[] args) {
- DingDingUtil util = new DingDingUtil();
- System.out.println(util.getAccessToken());
- }
- public void getWorkflowInfo(String accessToken, String processInstanceId){
- String api = StrUtil.format("https://api.dingtalk.com/v1.0/workflow/processInstances?processInstanceId={}", processInstanceId);
- HttpResponse response = HttpUtil.createGet(api).header("x-acs-dingtalk-access-token", accessToken).execute();
- logger.info("钉钉返回值:{}", response.body());
- }
- }
|