|
|
@@ -0,0 +1,394 @@
|
|
|
+package com.muzhi.tb.service.impl;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.aliyun.tea.TeaException;
|
|
|
+import com.auth0.jwt.JWT;
|
|
|
+import com.auth0.jwt.algorithms.Algorithm;
|
|
|
+import com.dingtalk.api.DefaultDingTalkClient;
|
|
|
+import com.dingtalk.api.DingTalkClient;
|
|
|
+import com.dingtalk.api.request.OapiGettokenRequest;
|
|
|
+import com.dingtalk.api.request.OapiV2UserGetbymobileRequest;
|
|
|
+import com.dingtalk.api.response.OapiGettokenResponse;
|
|
|
+import com.dingtalk.api.response.OapiV2UserGetbymobileResponse;
|
|
|
+import com.muzhi.tb.service.AccessTokenService;
|
|
|
+import com.muzhi.tb.service.TbService;
|
|
|
+import com.muzhi.tb.service.YiDaService;
|
|
|
+import com.taobao.api.ApiException;
|
|
|
+import okhttp3.*;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.scheduling.annotation.Async;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.util.StringUtils;
|
|
|
+
|
|
|
+import java.io.IOException;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+
|
|
|
+@Service
|
|
|
+public class TbServiceImpl implements TbService{
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private AccessTokenService accessTokenService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private YiDaService yiDaService;
|
|
|
+
|
|
|
+ public static String body = null;
|
|
|
+ public static String result = null;
|
|
|
+
|
|
|
+ //云璞(牧之宜搭测试使用)
|
|
|
+ //AgentId:1894218371
|
|
|
+ //APPKEY
|
|
|
+ private static String APPKEY = "dingcyam301x0oatyfmy";
|
|
|
+ //APPSECRET
|
|
|
+ private static String APPSECRET = "6DUwt_XS46RD7QPnhkALxmUcVyl1sk9AffgUK0SXGBvgFSMDAPFr_RMeEQpZLYfB";
|
|
|
+
|
|
|
+ public static String accessToken = null;
|
|
|
+
|
|
|
+ //TB(TB对接宜搭应用)
|
|
|
+ //TB授权码时效(1小时)
|
|
|
+ public static final Long EXPIRES_IN = 1 * 3600 * 1000L;
|
|
|
+ public static final String TOKEN_APPID = "_appId";
|
|
|
+
|
|
|
+ public static String appId = "63218a98d4b83fe98c507a47";
|
|
|
+ public static String appSecret = "xbp4kN6j4FBKPsJAdEX9Gd2cJMeuyP4Y";
|
|
|
+
|
|
|
+ //获取TB企业成员列表(===TEST===)
|
|
|
+ @Override
|
|
|
+ public String getUserList() {
|
|
|
+
|
|
|
+ OkHttpClient client = new OkHttpClient().newBuilder()
|
|
|
+ .build();
|
|
|
+ Request request = new Request.Builder()
|
|
|
+ .url("https://open.teambition.com/api/org/member/list?orgId=5ca44db8ca4fd40001b10559")
|
|
|
+ .method("GET", null)
|
|
|
+ .addHeader("Content-Type", "application/json")
|
|
|
+ //TB应用授权码
|
|
|
+ .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
|
|
|
+ //企业ID
|
|
|
+ .addHeader("X-Tenant-Id", "5ca44db8ca4fd40001b10559")
|
|
|
+ //租户类型,默认为 organization
|
|
|
+ .addHeader("X-Tenant-Type", "organization")
|
|
|
+ .build();
|
|
|
+ try {
|
|
|
+ Response response = client.newCall(request).execute();
|
|
|
+ body = response.body().string();
|
|
|
+ JSONObject jsonObject = JSON.parseObject(body);
|
|
|
+ System.out.println("返回体body:" + jsonObject);
|
|
|
+ }catch (IOException e){
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ return body;
|
|
|
+ }
|
|
|
+
|
|
|
+ //批量获取TB企业成员(目前仅用作查询TB某个人员的信息)
|
|
|
+ @Override
|
|
|
+ public String userGet(String userId){
|
|
|
+
|
|
|
+ //1、将TB的userid放在数组中
|
|
|
+ List list = new ArrayList();
|
|
|
+ list.add(userId);
|
|
|
+ System.out.println("list:" + list);
|
|
|
+ //2、将TB接口指定传入的body请求体封装成集合
|
|
|
+ Map map = new HashMap();
|
|
|
+ map.put("orgId","5ca44db8ca4fd40001b10559");
|
|
|
+ map.put("userIds",list);
|
|
|
+ String userBody = JSON.toJSONString(map);
|
|
|
+ System.out.println("userBody:" + userBody);
|
|
|
+
|
|
|
+ OkHttpClient client = new OkHttpClient().newBuilder()
|
|
|
+ .build();
|
|
|
+ MediaType mediaType = MediaType.parse("application/json");
|
|
|
+ //传入上面封装好的userBody请求体
|
|
|
+ RequestBody body = RequestBody
|
|
|
+ .create(mediaType, userBody);
|
|
|
+ Request request = new Request.Builder()
|
|
|
+ .url("https://open.teambition.com/api/org/member/batchGet")
|
|
|
+ .method("POST", body)
|
|
|
+ .addHeader("Content-Type", "application/json")
|
|
|
+ //TB应用授权码
|
|
|
+ .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
|
|
|
+ //企业ID
|
|
|
+ .addHeader("X-Tenant-Id", "5ca44db8ca4fd40001b10559")
|
|
|
+ //租户类型,默认为 organization
|
|
|
+ .addHeader("X-Tenant-Type", "organization")
|
|
|
+ .build();
|
|
|
+
|
|
|
+ String name = null;
|
|
|
+ String phone = null;
|
|
|
+ try {
|
|
|
+ Response response = client.newCall(request).execute();
|
|
|
+ result = response.body().string();
|
|
|
+ JSONObject jsonObject = JSON.parseObject(result);
|
|
|
+ System.out.println("返回结果result:" + jsonObject);
|
|
|
+
|
|
|
+ JSONArray result = jsonObject.getJSONArray("result");
|
|
|
+ System.out.println("解析数组result:" + result);
|
|
|
+ name = result.getJSONObject(0).getString("name");
|
|
|
+ System.out.println("提取name:" + name);
|
|
|
+ String phone1 = result.getJSONObject(0).getString("phone");
|
|
|
+ phone = phone1.substring(3);
|
|
|
+ System.out.println("提取phone:" + phone);
|
|
|
+ }catch (IOException e){
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ //【钉钉:根据手机号查询用户】
|
|
|
+ String dingUserId = null;
|
|
|
+ try {
|
|
|
+ DingTalkClient client1 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getbymobile");
|
|
|
+ OapiV2UserGetbymobileRequest req = new OapiV2UserGetbymobileRequest();
|
|
|
+ req.setMobile(phone);
|
|
|
+ OapiV2UserGetbymobileResponse rsp = client1.execute(req, accessTokenService.getAccessToken());
|
|
|
+ System.out.println(rsp.getBody());
|
|
|
+ dingUserId = JSON.parseObject(rsp.getBody()).getJSONObject("result").getString("userid");
|
|
|
+ System.out.println("钉钉userid(和宜搭一致):" + dingUserId);
|
|
|
+ } catch (ApiException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ return dingUserId;
|
|
|
+ }
|
|
|
+
|
|
|
+ //接收TB的WebHookt推送过来的数据
|
|
|
+ @Async
|
|
|
+ @Override
|
|
|
+ public String callBack(Map body) throws Exception{
|
|
|
+
|
|
|
+ String s = JSON.toJSONString(body);
|
|
|
+ System.out.println("TB推送过来的数据:" + s);
|
|
|
+
|
|
|
+ //解析TB推送过来的数据
|
|
|
+ JSONObject jsonObject = JSON.parseObject(s);
|
|
|
+ String event = jsonObject.getString("event");
|
|
|
+ System.out.println("推送类型:" + event);
|
|
|
+ String timestamp = jsonObject.getString("timestamp");
|
|
|
+ System.out.println("事件触发时间:" + timestamp);
|
|
|
+
|
|
|
+ //======项目创建======
|
|
|
+ if (event.equals("project.create")) {
|
|
|
+ JSONObject data = jsonObject.getJSONObject("data");
|
|
|
+ System.out.println("项目信息data:" + data);
|
|
|
+
|
|
|
+ JSONObject project = data.getJSONObject("project");
|
|
|
+ System.out.println("TB新建项目project:" + project);
|
|
|
+
|
|
|
+ //摘取需要的字段信息
|
|
|
+ String projectName = project.getString("name");
|
|
|
+ System.out.println("项目名称:" + projectName);
|
|
|
+ String projectId = project.getString("projectId");
|
|
|
+ System.out.println("项目ID:" + projectId);
|
|
|
+// String created = data.getString("created");
|
|
|
+// System.out.println("创建时间:" + created);
|
|
|
+// String creatorId = data.getString("creatorId");
|
|
|
+// System.out.println("创建人ID:" + creatorId);
|
|
|
+
|
|
|
+ //根据TB推送过来的数据中的userid获取钉钉userid
|
|
|
+// String dingUserid = userGet(creatorId);
|
|
|
+
|
|
|
+ Map map = new HashMap();
|
|
|
+ map.put("textField_l88d4swp", projectId);
|
|
|
+ map.put("textField_l82qfm9t", projectName);
|
|
|
+ map.put("employeeField_l82qfm9u", null);
|
|
|
+ map.put("dateField_l82qfm9y", timestamp);
|
|
|
+ String mapJson = JSON.toJSONString(map);
|
|
|
+
|
|
|
+ String yiDaXM = yiDaService.createYiDaXM(null, mapJson);
|
|
|
+ System.out.println("创建宜搭表单返回信息:" + yiDaXM);
|
|
|
+ }
|
|
|
+ //======项目更新======
|
|
|
+ else if (event.equals("v3.project.name.update")){
|
|
|
+ JSONObject data = jsonObject.getJSONObject("data");
|
|
|
+ System.out.println("项目信息data:" + data);
|
|
|
+
|
|
|
+ //摘取需要的字段信息
|
|
|
+ String projectName = data.getString("name");
|
|
|
+ System.out.println("项目名称:" + projectName);
|
|
|
+ String projectId = data.getString("projectId");
|
|
|
+ System.out.println("项目ID:" + projectId);
|
|
|
+ String created = data.getString("created");
|
|
|
+ System.out.println("创建时间:" + created);
|
|
|
+ String creatorId = data.getString("creatorId");
|
|
|
+ System.out.println("创建人ID:" + creatorId);
|
|
|
+
|
|
|
+ //【时间转换】TB中获取的时间为UTC:世界标准时间,在标准时间上加上8小时,即东八区时间,也就是北京时间。
|
|
|
+ created = created.replace("Z", " UTC");
|
|
|
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z");
|
|
|
+ SimpleDateFormat defaultFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+ String dateTime = "";
|
|
|
+ long time1 = 0;
|
|
|
+ try {
|
|
|
+ Date time = format.parse(created);
|
|
|
+ dateTime = defaultFormat.format(time);
|
|
|
+ System.out.println("dateTime:" + dateTime);
|
|
|
+ time1 = time.getTime();
|
|
|
+ System.out.println("时间戳:" + time1);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ //根据TB推送过来的数据中的userid获取钉钉userid
|
|
|
+ String dingUserid = userGet(creatorId);
|
|
|
+
|
|
|
+ Map map = new HashMap();
|
|
|
+ map.put("textField_l88d4swp", projectId);
|
|
|
+ map.put("textField_l82qfm9t", projectName);
|
|
|
+ map.put("employeeField_l82qfm9u", dingUserid);
|
|
|
+ map.put("dateField_l82qfm9y", time1);
|
|
|
+ String mapJson = JSON.toJSONString(map);
|
|
|
+
|
|
|
+ String yiDaXM = yiDaService.createYiDaXM(dingUserid, mapJson);
|
|
|
+ System.out.println("创建宜搭表单返回信息:" + yiDaXM);
|
|
|
+ }
|
|
|
+ //TODO ======任务创建======
|
|
|
+ else if (event.equals("task.create")){
|
|
|
+ JSONObject data = jsonObject.getJSONObject("data");
|
|
|
+ JSONObject task = data.getJSONObject("task");
|
|
|
+ System.out.println("任务信息data:" + data);
|
|
|
+
|
|
|
+ //摘取需要的字段信息
|
|
|
+ String projectId = task.getString("projectId");
|
|
|
+ System.out.println("项目ID:" + projectId);
|
|
|
+ String taskName = task.getString("content");
|
|
|
+ System.out.println("任务名称:" + taskName);
|
|
|
+ String taskId = task.getString("taskId");
|
|
|
+ System.out.println("任务ID:" + taskId);
|
|
|
+ String created = task.getString("created");
|
|
|
+ System.out.println("创建时间:" + created);
|
|
|
+ String creatorId = task.getString("creatorId");
|
|
|
+ System.out.println("创建人ID:" + creatorId);
|
|
|
+
|
|
|
+ String startDate = task.getString("startDate");
|
|
|
+ System.out.println("任务开始时间:" + startDate);
|
|
|
+ String dueDate = task.getString("dueDate");
|
|
|
+ System.out.println("任务结束时间:" + dueDate);
|
|
|
+
|
|
|
+ JSONArray participants = task.getJSONArray("participants");
|
|
|
+
|
|
|
+// for (int i = 0; participants.size() > i; i++){
|
|
|
+//
|
|
|
+// }
|
|
|
+
|
|
|
+ //根据TB推送过来的数据中的userid获取钉钉userid
|
|
|
+ String creatorId1 = userGet(creatorId);
|
|
|
+
|
|
|
+ //创建时间
|
|
|
+ created = created.replace("Z", " UTC");
|
|
|
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z");
|
|
|
+ SimpleDateFormat defaultFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+ String dateTime = "";
|
|
|
+ long time1 = 0;
|
|
|
+ try {
|
|
|
+ Date time = format.parse(created);
|
|
|
+ dateTime = defaultFormat.format(time);
|
|
|
+ System.out.println("dateTime:" + dateTime);
|
|
|
+ time1 = time.getTime();
|
|
|
+ System.out.println("时间戳:" + time1);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ //任务开始时间
|
|
|
+ startDate = startDate.replace("Z", " UTC");
|
|
|
+ SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z");
|
|
|
+ SimpleDateFormat defaultFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+ String dateTime1 = "";
|
|
|
+ long time11 = 0;
|
|
|
+ try {
|
|
|
+ Date time2 = format1.parse(startDate);
|
|
|
+ dateTime1 = defaultFormat1.format(time2);
|
|
|
+ System.out.println("dateTime1:" + dateTime1);
|
|
|
+ time11 = time2.getTime();
|
|
|
+ System.out.println("时间戳:" + time11);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ //任务结束时间
|
|
|
+ dueDate = dueDate.replace("Z", " UTC");
|
|
|
+ SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z");
|
|
|
+ SimpleDateFormat defaultFormat2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+ String dateTime2 = "";
|
|
|
+ long time111 = 0;
|
|
|
+ try {
|
|
|
+ Date time3 = format2.parse(dueDate);
|
|
|
+ dateTime2 = defaultFormat2.format(time3);
|
|
|
+ System.out.println("dateTime2:" + dateTime2);
|
|
|
+ time111 = time3.getTime();
|
|
|
+ System.out.println("时间戳:" + time111);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ //======任务表单中的项目关联表单控件值======
|
|
|
+ Map xmMap = new HashMap();
|
|
|
+ //表单类型:默认
|
|
|
+ xmMap.put("formType","receipt");
|
|
|
+ //项目表单ID
|
|
|
+ xmMap.put("formUuid","FORM-OS566L91S9Y3NHB9CFHMU6HZEQAJ22C6NP28L4");
|
|
|
+ //项目表单实例ID
|
|
|
+ xmMap.put("instanceId","FINST-J0A66981JGX305I3BFO1N6MSB8552E402848LUL5");
|
|
|
+ //标题
|
|
|
+ xmMap.put("subTitle","张侃");
|
|
|
+ //应用编码appType
|
|
|
+ xmMap.put("appType","APP_NOQGHDKUDXD7VDWZUC6I");
|
|
|
+ //表单实例标题
|
|
|
+ xmMap.put("title","测试项目");
|
|
|
+ System.out.println("项目关联表单控件值map:" + xmMap);
|
|
|
+
|
|
|
+ //转换成数组集合
|
|
|
+ List xmList = new ArrayList();
|
|
|
+ xmList.add(xmMap);
|
|
|
+ String xmListString = JSON.toJSONString(xmList);
|
|
|
+ System.out.println("项目关联表单控件值list文本json:" + xmListString);
|
|
|
+
|
|
|
+ //参与人ID集合
|
|
|
+ List list = new ArrayList();
|
|
|
+ list.add("16583692962961532");
|
|
|
+ list.add("16163038167819429");
|
|
|
+
|
|
|
+ //TODO 执行人ID集合
|
|
|
+// List list1 = new ArrayList();
|
|
|
+// list1.add("16583692962961532");
|
|
|
+
|
|
|
+ //任务时间集合(时间戳区间)
|
|
|
+ List listTime = new ArrayList();
|
|
|
+ listTime.add(time11);
|
|
|
+ listTime.add(time111);
|
|
|
+
|
|
|
+ Map map = new HashMap();
|
|
|
+ //项目编码
|
|
|
+ map.put("textField_l88d67g3", projectId);
|
|
|
+ //项目名称(关联表单组件)
|
|
|
+ map.put("associationFormField_l82r3cm1", xmListString);
|
|
|
+ //任务编码
|
|
|
+ map.put("textField_l88d67g2",taskId);
|
|
|
+ //任务名称
|
|
|
+ map.put("textField_l82r3cm2",taskName);
|
|
|
+ //参与者ID列表
|
|
|
+ map.put("employeeField_l82r3cm5",list);
|
|
|
+ //TODO 执行者ID列表
|
|
|
+// map.put("employeeField_l82r3cm4",list1);
|
|
|
+ //任务时间(时间戳区间)
|
|
|
+ map.put("cascadeDateField_l82r3cm7",listTime);
|
|
|
+ //创建人员ID(钉钉ID)
|
|
|
+ map.put("employeeField_l82r3cm3", creatorId1);
|
|
|
+ //创建时间
|
|
|
+ map.put("dateField_l82r3cm8", time1);
|
|
|
+ String mapJson = JSON.toJSONString(map);
|
|
|
+
|
|
|
+ String yiDaRW = yiDaService.createYiDaRW(creatorId1, mapJson);
|
|
|
+ System.out.println("创建宜搭表单返回信息:" + yiDaRW);
|
|
|
+ }
|
|
|
+ //======任务更新======
|
|
|
+ else if (event.equals("task.update")){
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return "【TB】数据同步推送【宜搭】成功!";
|
|
|
+ }
|
|
|
+}
|