TongbuServiceImpl.java 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963
  1. package com.malk.pro.zyjn.service.impl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.aliyun.dingtalkyida_1_0.models.SearchFormDatasResponse;
  6. import com.aliyun.dingtalkyida_1_0.models.UpdateFormDataResponse;
  7. import com.aliyun.tea.TeaException;
  8. import com.aliyun.teautil.models.RuntimeOptions;
  9. import com.dingtalk.api.DefaultDingTalkClient;
  10. import com.dingtalk.api.DingTalkClient;
  11. import com.dingtalk.api.request.OapiGettokenRequest;
  12. import com.dingtalk.api.request.OapiUserListidRequest;
  13. import com.dingtalk.api.request.OapiV2DepartmentListsubidRequest;
  14. import com.dingtalk.api.request.OapiV2UserGetRequest;
  15. import com.dingtalk.api.response.OapiGettokenResponse;
  16. import com.dingtalk.api.response.OapiUserListidResponse;
  17. import com.dingtalk.api.response.OapiV2DepartmentListsubidResponse;
  18. import com.dingtalk.api.response.OapiV2UserGetResponse;
  19. import com.malk.pro.zyjn.service.TongbuService;
  20. import com.malk.server.aliwork.YDConf;
  21. import com.malk.server.aliwork.YDParam;
  22. import com.malk.server.common.McException;
  23. import com.malk.server.common.McR;
  24. import com.malk.server.dingtalk.DDConf;
  25. import com.malk.server.dingtalk.DDR_New;
  26. import com.malk.service.aliwork.YDClient;
  27. import com.malk.service.dingtalk.DDClient;
  28. import com.malk.service.dingtalk.DDClient_Contacts;
  29. import com.malk.service.dingtalk.DDClient_Schedule;
  30. import com.malk.utils.UtilHttp;
  31. import com.malk.utils.UtilMap;
  32. import com.taobao.api.ApiException;
  33. import lombok.extern.slf4j.Slf4j;
  34. import okhttp3.*;
  35. import org.apache.commons.lang3.StringUtils;
  36. import org.apache.logging.log4j.util.Strings;
  37. import org.springframework.beans.factory.annotation.Autowired;
  38. import org.springframework.stereotype.Service;
  39. import java.io.IOException;
  40. import java.text.SimpleDateFormat;
  41. import java.time.Instant;
  42. import java.time.format.DateTimeFormatter;
  43. import java.util.*;
  44. import java.util.stream.Collectors;
  45. import static com.malk.utils.UtilMc.distinctByKey;
  46. @Service
  47. @Slf4j
  48. public class TongbuServiceImpl implements TongbuService {
  49. @Autowired
  50. private DDClient ddClient;
  51. @Autowired
  52. private YDClient ydClient;
  53. @Autowired
  54. private DDClient_Contacts ddClient_contacts;
  55. public static com.aliyun.dingtalkcalendar_1_0.Client createClient() throws Exception {
  56. com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
  57. config.protocol = "https";
  58. config.regionId = "central";
  59. return new com.aliyun.dingtalkcalendar_1_0.Client(config);
  60. }
  61. //宜搭接口调用
  62. public static com.aliyun.dingtalkyida_1_0.Client createClient2() throws Exception {
  63. com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
  64. config.protocol = "https";
  65. config.regionId = "central";
  66. return new com.aliyun.dingtalkyida_1_0.Client(config);
  67. }
  68. //APPKEY
  69. private static String APPKEY = "dingn2nkwrrosmyjk9o2";
  70. //APPSECRET
  71. private static String APPSECRET = "t26NJ2TIHeQZAG17QPJAPoVgrVwPUZCLH0JLO955_c0BoAhdaAS5eNf9Fc6KAepo";
  72. //AgenthId:3191553633
  73. //获取钉钉access_token的方法
  74. public String getAccessToken() {
  75. String accessToken = null;
  76. DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
  77. OapiGettokenRequest request = new OapiGettokenRequest();
  78. request.setAppkey(APPKEY);
  79. request.setAppsecret(APPSECRET);
  80. request.setHttpMethod("GET");
  81. try {
  82. OapiGettokenResponse response = client.execute(request);
  83. accessToken = response.getAccessToken();
  84. System.out.println("职业技能-AccessToken:" + accessToken);
  85. } catch (ApiException e) {
  86. e.printStackTrace();
  87. }
  88. return accessToken;
  89. }
  90. /**根据userId获取unionId*/
  91. public String getUnionId(String userId){
  92. String unionid = null;
  93. try {
  94. DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
  95. OapiV2UserGetRequest req = new OapiV2UserGetRequest();
  96. req.setUserid(userId);
  97. OapiV2UserGetResponse rsp = client.execute(req, ddClient.getAccessToken());
  98. // System.out.println(rsp.getBody());
  99. String body = rsp.getBody();
  100. //通过fastjson工具转换成json对象,逐层解析
  101. JSONObject jsonObject = JSON.parseObject(body);
  102. if (jsonObject != null){
  103. JSONObject result = jsonObject.getJSONObject("result");
  104. unionid = result.getString("unionid");
  105. System.out.println("根据钉钉userId获取的unionid:" + unionid);
  106. }
  107. } catch (ApiException e) {
  108. e.printStackTrace();
  109. }
  110. return unionid;
  111. }
  112. //获取当前部门下一层级的部门id列表
  113. public JSONArray getBumenIdList(long bumenid){
  114. JSONArray dept_id_Array = null;
  115. try {
  116. DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listsubid");
  117. OapiV2DepartmentListsubidRequest req = new OapiV2DepartmentListsubidRequest();
  118. req.setDeptId(bumenid);
  119. OapiV2DepartmentListsubidResponse rsp = client.execute(req, getAccessToken());
  120. System.out.println("钉钉【获取子部门id列表】接口返回信息:" + rsp.getBody());
  121. JSONObject dingdingBumenIdObj = JSON.parseObject(rsp.getBody());
  122. long errcode = dingdingBumenIdObj.getLong("errcode");
  123. System.out.println("接口返回状态码:" + errcode);
  124. if (errcode == 0){
  125. JSONObject resultObj = dingdingBumenIdObj.getJSONObject("result");
  126. System.out.println("返回信息result:" + resultObj);
  127. dept_id_Array = resultObj.getJSONArray("dept_id_list");
  128. }
  129. } catch (ApiException e) {
  130. e.printStackTrace();
  131. }
  132. System.out.println("封装【当前部门下一层级的部门id列表】jsonArray:" + dept_id_Array);
  133. return dept_id_Array;
  134. }
  135. //根据部门id获取部门下的人员userId列表
  136. public JSONArray getUserIdList(long bumenid){
  137. JSONArray userid_list = null;
  138. try {
  139. DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/listid");
  140. OapiUserListidRequest req = new OapiUserListidRequest();
  141. req.setDeptId(bumenid);
  142. OapiUserListidResponse rsp = client.execute(req, getAccessToken());
  143. System.out.println("钉钉【获取部门用户userId列表】接口返回信息:" + rsp.getBody());
  144. JSONObject dingdingUserIdObj = JSON.parseObject(rsp.getBody());
  145. long errcode = dingdingUserIdObj.getLong("errcode");
  146. System.out.println("接口返回状态码:" + errcode);
  147. if (errcode == 0){
  148. JSONObject resultObj = dingdingUserIdObj.getJSONObject("result");
  149. System.out.println("返回信息result:" + resultObj);
  150. userid_list = resultObj.getJSONArray("userid_list");
  151. }
  152. } catch (ApiException e) {
  153. e.printStackTrace();
  154. }
  155. System.out.println("封装【当前部门用户userId列表】jsonArray:" + userid_list);
  156. return userid_list;
  157. }
  158. //根据勾选部门名称获取宜搭表单数据
  159. public JSONArray getYidaDeptName(String bumenmingcheng){
  160. //宜搭表单判断查询条件
  161. Map map1 = new HashMap();
  162. //字段编号
  163. map1.put("key", "textField_m99cq8lt");
  164. //同步类型
  165. map1.put("value", bumenmingcheng);
  166. //控件类型
  167. map1.put("type", "TEXT");
  168. //逻辑判断符
  169. map1.put("operator", "eq");
  170. //控件名称
  171. map1.put("componentName", "TextField");
  172. List list11 = new ArrayList();
  173. list11.add(map1);
  174. String listJson = JSON.toJSONString(list11);
  175. System.out.println("查询条件listJson:" + listJson);
  176. JSONObject jsonObject = null;
  177. int size = 100;
  178. int page = 1;
  179. //查询表单实例数据
  180. try {
  181. com.aliyun.dingtalkyida_1_0.Client client = createClient2();
  182. com.aliyun.dingtalkyida_1_0.models.SearchFormDatasHeaders searchFormDatasHeaders = new com.aliyun.dingtalkyida_1_0.models.SearchFormDatasHeaders();
  183. searchFormDatasHeaders.xAcsDingtalkAccessToken = getAccessToken();
  184. com.aliyun.dingtalkyida_1_0.models.SearchFormDatasRequest searchFormDatasRequest = new com.aliyun.dingtalkyida_1_0.models.SearchFormDatasRequest()
  185. .setSystemToken("U0E66VB1J86UR5RKDPXQTA7WM66K3896KHW8MS5")
  186. .setSearchFieldJson(listJson)
  187. .setCurrentPage(page)
  188. .setPageSize(size)
  189. .setFormUuid("FORM-458D5FBCB956415081E7725CA5473ABB0ZR2")
  190. .setUserId("yida_pub_account")
  191. .setAppType("APP_E0BKS4I6U44824QM1KE5");
  192. SearchFormDatasResponse searchFormDatasResponse = client.searchFormDatasWithOptions(searchFormDatasRequest, searchFormDatasHeaders, new RuntimeOptions());
  193. // System.out.println(JSON.toJSONString(searchFormDatasResponse.getBody()));
  194. String s = JSON.toJSONString(searchFormDatasResponse.getBody());
  195. jsonObject = JSON.parseObject(s);
  196. System.out.println("查询【部门档案】接口object对象:" + jsonObject);
  197. } catch (TeaException err) {
  198. if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
  199. // err 中含有 code 和 message 属性,可帮助开发定位问题
  200. }
  201. } catch (Exception _err) {
  202. TeaException err = new TeaException(_err.getMessage(), _err);
  203. if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
  204. // err 中含有 code 和 message 属性,可帮助开发定位问题
  205. }
  206. }
  207. List listAll = new ArrayList();
  208. try {
  209. JSONArray data = jsonObject.getJSONArray("data");
  210. System.out.println("返回的宜搭data:" + data);
  211. if (!data.isEmpty()) {
  212. JSONObject formData = data.getJSONObject(0).getJSONObject("formData");
  213. String textField_m99cq8lt = formData.getString("textField_m99cq8lt");
  214. System.out.println("部门名称:" + textField_m99cq8lt);
  215. String kezhangUserId = "";
  216. JSONArray jsonArray = formData.getJSONArray("employeeField_m99cq8lu_id");
  217. if (jsonArray != null && !jsonArray.isEmpty()){
  218. kezhangUserId = jsonArray.getString(0);
  219. System.out.println("科长userId:" + kezhangUserId);
  220. }
  221. String fukezhangUserId = "";
  222. JSONArray jsonArray1 = formData.getJSONArray("employeeField_m9l4bvrr_id");
  223. if (jsonArray1 != null && !jsonArray1.isEmpty()){
  224. fukezhangUserId = jsonArray1.getString(0);
  225. System.out.println("副科长userId:" + fukezhangUserId);
  226. }
  227. Map map = new HashMap<>();
  228. map.put("bumenmingcheng",textField_m99cq8lt);
  229. map.put("kezhangUserId",kezhangUserId);
  230. map.put("fukezhangUserId",fukezhangUserId);
  231. listAll.add(map);
  232. }
  233. }catch (Exception e){
  234. e.printStackTrace();
  235. }
  236. JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(listAll));
  237. System.out.println("封装【部门档案】jsonArray:" + jsonArray);
  238. return jsonArray;
  239. }
  240. //宜搭创建会议申请后同步创建钉钉日程
  241. /**
  242. * @param data 宜搭会议申请表单数据
  243. * @param formInstId 宜搭会议申请表单实例ID
  244. * */
  245. @Override
  246. public McR createRicheng(String data, String formInstId) {
  247. log.info("宜搭传参【会议申请】全部表单数据:" + data);
  248. log.info("数据实例id:" + formInstId);
  249. log.info("传参解析中......");
  250. JSONObject jsonObject = new JSONObject();
  251. if (Strings.isNotBlank(data)){
  252. jsonObject = JSON.parseObject(data);
  253. System.out.println("表单数据解析:" + jsonObject);
  254. }else {
  255. Map formData = ydClient.queryData(YDParam.builder()
  256. .formInstanceId(formInstId)
  257. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  258. jsonObject = JSON.parseObject(JSON.toJSONString(formData));
  259. }
  260. //时间格式一:定义时间格式
  261. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  262. //时间格式二:使用ISO_8601格式化器来格式化Instant对象
  263. DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT;
  264. //宜搭数据详情链接
  265. String yidaURL = "会议申请记录:" + "https://so09k2.aliwork.com/APP_E0BKS4I6U44824QM1KE5/processDetail?formUuid=FORM-8039B0A8CD7C48E8B7B1D5FF56AD3EF0VVHP&procInsId="+ formInstId +"&navConfig.layout=1180";
  266. System.out.println("宜搭数据详情链接:" + yidaURL);
  267. //汇总所有参会人员
  268. List canhuirenyuanList = new ArrayList<>();
  269. /**宜搭表单字段*/
  270. //创建人userId
  271. String userId = jsonObject.getString("textField_m54zg5b0");
  272. System.out.println("创建人userId:" + userId);
  273. /**根据创建人userId获取unionId*/
  274. String chuangjianrenUnionId = getUnionId(userId);
  275. //会议主题
  276. String huiyizhuti = jsonObject.getString("textField_m523ok9w");
  277. System.out.println("会议主题:" + huiyizhuti);
  278. //------------------------------------⬇第二版新增⬇-----------------------------------------------
  279. //发布部门类型
  280. String fabubumenleixing = jsonObject.getString("radioField_m9getzvn");
  281. System.out.println("发布部门类型:" + fabubumenleixing);
  282. /*if (fabubumenleixing.equals("组织内部门")){
  283. //获取发布部门id
  284. long fabubumenId = jsonObject.getJSONArray("departmentSelectField_m99jf2e4").getLong(0);
  285. System.out.println("发布部门ID:" + fabubumenId);
  286. *//**根据发布部门获取当前部门及下级所有部门的人员列表*//*
  287. List bumenIdList = new ArrayList();
  288. bumenIdList.add(fabubumenId);
  289. *//**调用获取当前部门的下一层级部门id列表*//*
  290. log.info("获取当前部门的下一层级部门id列表中......");
  291. JSONArray nextBumenIdList = getBumenIdList(fabubumenId);
  292. if (nextBumenIdList != null && !nextBumenIdList.isEmpty()){
  293. System.out.println("【1】当前部门有下级部门,开始循环获取下一层级部门===");
  294. for (int i = 0; i < nextBumenIdList.size(); i++) {
  295. long deptId = nextBumenIdList.getLong(i);
  296. System.out.println("部门ID:" + deptId);
  297. bumenIdList.add(deptId);
  298. JSONArray nextBumenIdList1 = getBumenIdList(deptId);
  299. if (nextBumenIdList1 != null && !nextBumenIdList1.isEmpty()){
  300. System.out.println("【2】当前部门有下级部门,开始循环获取下一层级部门===");
  301. for (int i1 = 0; i1 < nextBumenIdList1.size(); i1++) {
  302. long deptId1 = nextBumenIdList1.getLong(i1);
  303. System.out.println("部门ID:" + deptId1);
  304. bumenIdList.add(deptId);
  305. }
  306. }
  307. }
  308. }
  309. System.out.println("部门id汇总List:" + bumenIdList);
  310. JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(bumenIdList));
  311. System.out.println("封装【部门id汇总列表】jsonArray:" + jsonArray);
  312. *//**调用获取每个部门id下的人员userId列表*//*
  313. log.info("获取每个部门id下的人员userId列表中......");
  314. for (int i = 0; i < jsonArray.size(); i++) {
  315. long bmid = jsonArray.getLong(i);
  316. System.out.println("循环当前部门id:" + bmid);
  317. JSONArray userIdList = getUserIdList(bmid);
  318. if (userIdList != null && !userIdList.isEmpty()){
  319. System.out.println("当前部门id中存在人员userIdList:" + userIdList);
  320. for (int j = 0; j < userIdList.size(); j++) {
  321. String renyuanId = userIdList.getString(j);
  322. System.out.println("循环当前的人员Id:" + renyuanId);
  323. *//**根据参会人员userId获取unionId*//*
  324. String canhuirenyuanUnionId = getUnionId(renyuanId);
  325. Map canhuirenyuanMap = new HashMap<>();
  326. canhuirenyuanMap.put("id", canhuirenyuanUnionId);
  327. canhuirenyuanMap.put("isOptional", true);
  328. canhuirenyuanList.add(canhuirenyuanMap);
  329. }
  330. }
  331. }
  332. }*/
  333. //参会部门勾选项
  334. JSONArray checkboxField_m99d3k6z = jsonObject.getJSONArray("checkboxField_m99d3k6z");
  335. System.out.println("参会部门多选:" + checkboxField_m99d3k6z);
  336. if (checkboxField_m99d3k6z != null && !checkboxField_m99d3k6z.isEmpty()){
  337. for (int x = 0; x < checkboxField_m99d3k6z.size(); x++) {
  338. String canhuibumen = checkboxField_m99d3k6z.getString(x);
  339. System.out.println("循环当前参会部门勾选项:" + canhuibumen);
  340. /**获取维护表的该部门中的「科长」「副科长」userId*/
  341. JSONArray yidaDeptName = getYidaDeptName(canhuibumen);
  342. if (yidaDeptName != null && !yidaDeptName.isEmpty()){
  343. JSONObject yidaObj = yidaDeptName.getJSONObject(0);
  344. String kezhangUserId = yidaObj.getString("kezhangUserId");
  345. System.out.println("科长userId:" + kezhangUserId);
  346. /**根据参会人员userId获取unionId*/
  347. String canhuirenyuanUnionId1 = getUnionId(kezhangUserId);
  348. if (canhuirenyuanUnionId1 != null){
  349. Map canhuirenyuanMap1 = new HashMap<>();
  350. canhuirenyuanMap1.put("id", canhuirenyuanUnionId1);
  351. canhuirenyuanMap1.put("isOptional", true);
  352. canhuirenyuanList.add(canhuirenyuanMap1);
  353. }
  354. String fukezhangUserId = yidaObj.getString("fukezhangUserId");
  355. System.out.println("副科长userId:" + fukezhangUserId);
  356. /**根据参会人员userId获取unionId*/
  357. String canhuirenyuanUnionId2 = getUnionId(fukezhangUserId);
  358. if (canhuirenyuanUnionId2 != null){
  359. Map canhuirenyuanMap2 = new HashMap<>();
  360. canhuirenyuanMap2.put("id", canhuirenyuanUnionId2);
  361. canhuirenyuanMap2.put("isOptional", true);
  362. canhuirenyuanList.add(canhuirenyuanMap2);
  363. }
  364. }
  365. if (canhuibumen.equals("信息技术科")){
  366. //获取相应人员组件里面的人员id
  367. JSONArray canhuirenyuanArray = jsonObject.getJSONArray("employeeField_m99dcmr0");
  368. System.out.println("信息技术科参会人员(多选):" + canhuirenyuanArray);
  369. if (canhuirenyuanArray != null && !canhuirenyuanArray.isEmpty()) {
  370. for (int y = 0; y < canhuirenyuanArray.size(); y++) {
  371. String canhuirenyuanUserId = canhuirenyuanArray.getString(y);
  372. /**根据参会人员userId获取unionId*/
  373. String canhuirenyuanUnionId = getUnionId(canhuirenyuanUserId);
  374. Map canhuirenyuanMap = new HashMap<>();
  375. canhuirenyuanMap.put("id", canhuirenyuanUnionId);
  376. canhuirenyuanMap.put("isOptional", true);
  377. canhuirenyuanList.add(canhuirenyuanMap);
  378. }
  379. }
  380. }else if (canhuibumen.equals("研发管理科")){
  381. //获取相应人员组件里面的人员id
  382. JSONArray canhuirenyuanArray = jsonObject.getJSONArray("employeeField_m99dcmr1");
  383. System.out.println("研发管理科参会人员(多选):" + canhuirenyuanArray);
  384. if (canhuirenyuanArray != null && !canhuirenyuanArray.isEmpty()) {
  385. for (int y = 0; y < canhuirenyuanArray.size(); y++) {
  386. String canhuirenyuanUserId = canhuirenyuanArray.getString(y);
  387. /**根据参会人员userId获取unionId*/
  388. String canhuirenyuanUnionId = getUnionId(canhuirenyuanUserId);
  389. Map canhuirenyuanMap = new HashMap<>();
  390. canhuirenyuanMap.put("id", canhuirenyuanUnionId);
  391. canhuirenyuanMap.put("isOptional", true);
  392. canhuirenyuanList.add(canhuirenyuanMap);
  393. }
  394. }
  395. }else if (canhuibumen.equals("竞赛管理科")){
  396. //获取相应人员组件里面的人员id
  397. JSONArray canhuirenyuanArray = jsonObject.getJSONArray("employeeField_m99dcmr4");
  398. System.out.println("竞赛管理科参会人员(多选):" + canhuirenyuanArray);
  399. if (canhuirenyuanArray != null && !canhuirenyuanArray.isEmpty()) {
  400. for (int y = 0; y < canhuirenyuanArray.size(); y++) {
  401. String canhuirenyuanUserId = canhuirenyuanArray.getString(y);
  402. /**根据参会人员userId获取unionId*/
  403. String canhuirenyuanUnionId = getUnionId(canhuirenyuanUserId);
  404. Map canhuirenyuanMap = new HashMap<>();
  405. canhuirenyuanMap.put("id", canhuirenyuanUnionId);
  406. canhuirenyuanMap.put("isOptional", true);
  407. canhuirenyuanList.add(canhuirenyuanMap);
  408. }
  409. }
  410. }else if (canhuibumen.equals("综合办公室")){
  411. //获取相应人员组件里面的人员id
  412. JSONArray canhuirenyuanArray = jsonObject.getJSONArray("employeeField_m99dcmr5");
  413. System.out.println("综合办公室参会人员(多选):" + canhuirenyuanArray);
  414. if (canhuirenyuanArray != null && !canhuirenyuanArray.isEmpty()) {
  415. for (int y = 0; y < canhuirenyuanArray.size(); y++) {
  416. String canhuirenyuanUserId = canhuirenyuanArray.getString(y);
  417. /**根据参会人员userId获取unionId*/
  418. String canhuirenyuanUnionId = getUnionId(canhuirenyuanUserId);
  419. Map canhuirenyuanMap = new HashMap<>();
  420. canhuirenyuanMap.put("id", canhuirenyuanUnionId);
  421. canhuirenyuanMap.put("isOptional", true);
  422. canhuirenyuanList.add(canhuirenyuanMap);
  423. }
  424. }
  425. }else if (canhuibumen.equals("考务管理科")){
  426. //获取相应人员组件里面的人员id
  427. JSONArray canhuirenyuanArray = jsonObject.getJSONArray("employeeField_m99dcmr6");
  428. System.out.println("考务管理科参会人员(多选):" + canhuirenyuanArray);
  429. if (canhuirenyuanArray != null && !canhuirenyuanArray.isEmpty()) {
  430. for (int y = 0; y < canhuirenyuanArray.size(); y++) {
  431. String canhuirenyuanUserId = canhuirenyuanArray.getString(y);
  432. /**根据参会人员userId获取unionId*/
  433. String canhuirenyuanUnionId = getUnionId(canhuirenyuanUserId);
  434. Map canhuirenyuanMap = new HashMap<>();
  435. canhuirenyuanMap.put("id", canhuirenyuanUnionId);
  436. canhuirenyuanMap.put("isOptional", true);
  437. canhuirenyuanList.add(canhuirenyuanMap);
  438. }
  439. }
  440. }else if (canhuibumen.equals("财务科")){
  441. //获取相应人员组件里面的人员id
  442. JSONArray canhuirenyuanArray = jsonObject.getJSONArray("employeeField_m99dcmr2");
  443. System.out.println("财务科参会人员(多选):" + canhuirenyuanArray);
  444. if (canhuirenyuanArray != null && !canhuirenyuanArray.isEmpty()) {
  445. for (int y = 0; y < canhuirenyuanArray.size(); y++) {
  446. String canhuirenyuanUserId = canhuirenyuanArray.getString(y);
  447. /**根据参会人员userId获取unionId*/
  448. String canhuirenyuanUnionId = getUnionId(canhuirenyuanUserId);
  449. Map canhuirenyuanMap = new HashMap<>();
  450. canhuirenyuanMap.put("id", canhuirenyuanUnionId);
  451. canhuirenyuanMap.put("isOptional", true);
  452. canhuirenyuanList.add(canhuirenyuanMap);
  453. }
  454. }
  455. }else if (canhuibumen.equals("质量督导科")){
  456. //获取相应人员组件里面的人员id
  457. JSONArray canhuirenyuanArray = jsonObject.getJSONArray("employeeField_m99dcmr7");
  458. System.out.println("质量督导科参会人员(多选):" + canhuirenyuanArray);
  459. if (canhuirenyuanArray != null && !canhuirenyuanArray.isEmpty()) {
  460. for (int y = 0; y < canhuirenyuanArray.size(); y++) {
  461. String canhuirenyuanUserId = canhuirenyuanArray.getString(y);
  462. /**根据参会人员userId获取unionId*/
  463. String canhuirenyuanUnionId = getUnionId(canhuirenyuanUserId);
  464. Map canhuirenyuanMap = new HashMap<>();
  465. canhuirenyuanMap.put("id", canhuirenyuanUnionId);
  466. canhuirenyuanMap.put("isOptional", true);
  467. canhuirenyuanList.add(canhuirenyuanMap);
  468. }
  469. }
  470. }else if (canhuibumen.equals("题库管理科")){
  471. //获取相应人员组件里面的人员id
  472. JSONArray canhuirenyuanArray = jsonObject.getJSONArray("employeeField_m99dcmr8");
  473. System.out.println("题库管理科参会人员(多选):" + canhuirenyuanArray);
  474. if (canhuirenyuanArray != null && !canhuirenyuanArray.isEmpty()) {
  475. for (int y = 0; y < canhuirenyuanArray.size(); y++) {
  476. String canhuirenyuanUserId = canhuirenyuanArray.getString(y);
  477. /**根据参会人员userId获取unionId*/
  478. String canhuirenyuanUnionId = getUnionId(canhuirenyuanUserId);
  479. Map canhuirenyuanMap = new HashMap<>();
  480. canhuirenyuanMap.put("id", canhuirenyuanUnionId);
  481. canhuirenyuanMap.put("isOptional", true);
  482. canhuirenyuanList.add(canhuirenyuanMap);
  483. }
  484. }
  485. } else if (canhuibumen.equals("系统实施")){
  486. //获取相应人员组件里面的人员id
  487. JSONArray canhuirenyuanArray = jsonObject.getJSONArray("employeeField_m9l7c095");
  488. System.out.println("系统实施参会人员(多选):" + canhuirenyuanArray);
  489. if (canhuirenyuanArray != null && !canhuirenyuanArray.isEmpty()) {
  490. for (int y = 0; y < canhuirenyuanArray.size(); y++) {
  491. String canhuirenyuanUserId = canhuirenyuanArray.getString(y);
  492. /**根据参会人员userId获取unionId*/
  493. String canhuirenyuanUnionId = getUnionId(canhuirenyuanUserId);
  494. Map canhuirenyuanMap = new HashMap<>();
  495. canhuirenyuanMap.put("id", canhuirenyuanUnionId);
  496. canhuirenyuanMap.put("isOptional", true);
  497. canhuirenyuanList.add(canhuirenyuanMap);
  498. }
  499. }
  500. }
  501. }
  502. }
  503. //------------------------------------⬆第二版新增⬆-----------------------------------------------
  504. JSONArray timeArray = jsonObject.getJSONArray("cascadeDateField_m523oka0");
  505. //会议开始时间
  506. long huiyikaishishijian = timeArray.getLong(0);
  507. Date startDate = new Date(huiyikaishishijian);
  508. String startTime = sdf.format(startDate);
  509. System.out.println("格式化后的开始时间(正常格式):" + startTime);
  510. Instant instantStart = Instant.ofEpochMilli(huiyikaishishijian);
  511. String isoStartDateTime = formatter.format(instantStart);
  512. System.out.println("会议开始时间(ISO-8601 格式的时间):" + isoStartDateTime);
  513. //会议结束时间
  514. long huiyijieshushijian = timeArray.getLong(1);
  515. Date endDate = new Date(huiyijieshushijian);
  516. String endTime = sdf.format(endDate);
  517. System.out.println("格式化后的开始时间(正常格式):" + endTime);
  518. Instant instantEnd = Instant.ofEpochMilli(huiyijieshushijian);
  519. String isoEndDateTime = formatter.format(instantEnd);
  520. System.out.println("会议结束时间(ISO-8601 格式的时间):" + isoEndDateTime);
  521. //会议地点类型
  522. String huiyididianType = jsonObject.getString("radioField_m98fljlv");
  523. System.out.println("会议地点类型:" + huiyididianType);
  524. //开会地址
  525. String kaihuidizhi = "";
  526. if (huiyididianType.equals("中心会议室")){
  527. kaihuidizhi = jsonObject.getString("selectField_m98fljlp");
  528. }else if (huiyididianType.equals("中心外部")){
  529. kaihuidizhi = jsonObject.getString("textField_m98fljlw");
  530. }
  531. System.out.println("开会地址:" + kaihuidizhi);
  532. //参会人员(多选)
  533. JSONArray canhuirenyuanArray = jsonObject.getJSONArray("employeeField_m9atzdf9");
  534. System.out.println("参会人员(多选):" + canhuirenyuanArray);
  535. if (canhuirenyuanArray != null && !canhuirenyuanArray.isEmpty()){
  536. for (int i = 0; i < canhuirenyuanArray.size(); i++) {
  537. String canhuirenyuanUserId = canhuirenyuanArray.getString(i);
  538. /**根据参会人员userId获取unionId*/
  539. String canhuirenyuanUnionId = getUnionId(canhuirenyuanUserId);
  540. Map canhuirenyuanMap = new HashMap<>();
  541. canhuirenyuanMap.put("id", canhuirenyuanUnionId);
  542. canhuirenyuanMap.put("isOptional", true);
  543. canhuirenyuanList.add(canhuirenyuanMap);
  544. }
  545. }
  546. /**创建钉钉日程*/
  547. Map startMap = new HashMap<>();
  548. startMap.put("dateTime", isoStartDateTime);//格式为ISO-8601的date-time格式
  549. startMap.put("timeZone", "Asia/Shanghai");//所属时区,TZ database name格式
  550. Map endMap = new HashMap<>();
  551. endMap.put("dateTime", isoEndDateTime);//格式为ISO-8601的date-time格式
  552. endMap.put("timeZone", "Asia/Shanghai");//所属时区,TZ database name格式
  553. Map locationMap = new HashMap<>();
  554. locationMap.put("displayName", kaihuidizhi);
  555. Map mapAll = new HashMap<>();
  556. mapAll.put("summary", huiyizhuti);//会议主题
  557. mapAll.put("description", yidaURL);//会议描述,传入宜搭数据详情的URL
  558. mapAll.put("isAllDay", false);//是否为全天日程
  559. mapAll.put("start", startMap);//开始时间
  560. mapAll.put("end", endMap);//结束时间
  561. mapAll.put("attendees", canhuirenyuanList);//参会人员
  562. mapAll.put("location", locationMap);//日程地点
  563. String jsonString = JSON.toJSONString(mapAll);
  564. System.out.println("封装密钥参数:" + jsonString);
  565. String richengID = null;
  566. try {
  567. OkHttpClient client = new OkHttpClient().newBuilder()
  568. .build();
  569. MediaType mediaType = MediaType.parse("application/json");
  570. RequestBody body = RequestBody.create(mediaType, jsonString);
  571. Request request = new Request.Builder()
  572. .url("https://api.dingtalk.com/v1.0/calendar/users/"+ chuangjianrenUnionId +"/calendars/primary/events")
  573. .method("POST", body)
  574. .addHeader("x-acs-dingtalk-access-token", getAccessToken())
  575. .addHeader("Content-Type", "application/json")
  576. .build();
  577. Response response = client.newCall(request).execute();
  578. String bodyString = response.body().string();
  579. JSONObject JsonBody = JSON.parseObject(bodyString);
  580. System.out.println("返回体body:" + JsonBody);
  581. richengID = JsonBody.getString("id");
  582. System.out.println("创建钉钉日程接口返回的日程ID:" + richengID);
  583. } catch (IOException e) {
  584. e.printStackTrace();
  585. }
  586. if (richengID != null){
  587. /**将日程ID回写至宜搭表单*/
  588. //根据实例id修改宜搭表单数据
  589. Map mapData = new HashMap<>();
  590. mapData.put("textField_m54zg5b1", richengID);
  591. // prd 25.06.26 同步预约会议室, 于会议室水牌显示日程
  592. String roomId = jsonObject.getString("textField_mccrafms");
  593. if (StringUtils.isNoneBlank(roomId)) {
  594. try {
  595. //todo 2026/05/29 base包预定会议室接口 把 Stream 对象直接包装进了 new Object[]{},Stream 是惰性求值的中间对象,不会自动执行。会变成类似ReferencePipeline$3@7912的未执行完的 Stream 实例,导致报错The value of parameter meetingRoomsToAdd is not array.
  596. // ddClient_schedule.bookMeetingRoom(getAccessToken(), userId, richengID, Arrays.asList(roomId));
  597. String unionId = String.valueOf(ddClient_contacts.getUserInfoById(getAccessToken(), userId).get("unionid"));
  598. Map body = UtilMap.map("meetingRoomsToAdd",
  599. Arrays.asList(roomId).stream().map(item -> UtilMap.map("roomId", item))
  600. .collect(Collectors.toList())
  601. );
  602. DDR_New.doPost("https://api.dingtalk.com/v1.0/calendar/users/" + unionId + "/calendars/primary/events/" + richengID + "/meetingRooms", DDConf.initTokenHeader(getAccessToken()), (Map)null, body);
  603. } catch (McException e) {
  604. mapData.put("textareaField_mccs33fz", e.getMessage());
  605. e.printStackTrace();
  606. }
  607. } else {
  608. mapData.put("textareaField_mccs33fz", "会议室 roomId 为空, 取消创建");
  609. }
  610. String mapAllString = JSON.toJSONString(mapData);
  611. System.out.println("封装修改字段:" + mapAllString);
  612. //更新子表控件数据【全量更新】
  613. try {
  614. com.aliyun.dingtalkyida_1_0.Client client = createClient2();
  615. com.aliyun.dingtalkyida_1_0.models.UpdateFormDataHeaders updateFormDataHeaders = new com.aliyun.dingtalkyida_1_0.models.UpdateFormDataHeaders();
  616. updateFormDataHeaders.xAcsDingtalkAccessToken = getAccessToken();
  617. com.aliyun.dingtalkyida_1_0.models.UpdateFormDataRequest updateFormDataRequest = new com.aliyun.dingtalkyida_1_0.models.UpdateFormDataRequest()
  618. .setSystemToken("U0E66VB1J86UR5RKDPXQTA7WM66K3896KHW8MS5")
  619. .setFormInstanceId(formInstId)
  620. .setUserId("yida_pub_account")
  621. .setAppType("APP_E0BKS4I6U44824QM1KE5")
  622. .setUpdateFormDataJson(mapAllString)
  623. //使用最新的表单版本进行更新
  624. .setUseLatestVersion(true);
  625. UpdateFormDataResponse updateFormDataResponse = client.updateFormDataWithOptions(updateFormDataRequest, updateFormDataHeaders, new RuntimeOptions());
  626. System.out.println(JSON.toJSONString(updateFormDataResponse));
  627. } catch (TeaException err) {
  628. if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
  629. // err 中含有 code 和 message 属性,可帮助开发定位问题
  630. }
  631. } catch (Exception _err) {
  632. TeaException err = new TeaException(_err.getMessage(), _err);
  633. if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
  634. // err 中含有 code 和 message 属性,可帮助开发定位问题
  635. }
  636. }
  637. return McR.success("创建钉钉日程成功,并将日程ID反写记录至宜搭表单!");
  638. }else {
  639. return McR.errorParam("创建钉钉日程失败!");
  640. }
  641. }
  642. //宜搭删除会议申请后同步删除钉钉日程
  643. /**
  644. * @param formInstId 宜搭会议申请表单实例ID
  645. * @param createUserId 创建人userId
  646. * @param dingdingRichengID 钉钉日程ID
  647. * */
  648. @Override
  649. public McR deleteRicheng(String formInstId, String createUserId, String dingdingRichengID) {
  650. log.info("数据实例id:" + formInstId);
  651. log.info("创建人userId:" + createUserId);
  652. log.info("钉钉日程ID:" + dingdingRichengID);
  653. /**根据创建人userId获取unionId*/
  654. String chuangjianrenUnionId = getUnionId(createUserId);
  655. /**删除钉钉日程*/
  656. try {
  657. OkHttpClient client = new OkHttpClient().newBuilder()
  658. .build();
  659. MediaType mediaType = MediaType.parse("text/plain");
  660. RequestBody body = RequestBody.create(mediaType, "");
  661. Request request = new Request.Builder()
  662. .url("https://api.dingtalk.com/v1.0/calendar/users/"+ chuangjianrenUnionId +"/calendars/primary/events/"+ dingdingRichengID +"?pushNotification=true")
  663. .method("DELETE", body)
  664. .addHeader("x-acs-dingtalk-access-token", getAccessToken())
  665. .build();
  666. Response response = client.newCall(request).execute();
  667. String bodyString = response.body().string();
  668. JSONObject JsonBody = JSON.parseObject(bodyString);
  669. System.out.println("返回体body:" + JsonBody);
  670. } catch (IOException e) {
  671. e.printStackTrace();
  672. }
  673. return McR.success("删除钉钉日程成功!");
  674. }
  675. @Override
  676. public McR getUsersDepts(List<String> userIds,List<String> deptNames) {
  677. List<Map<String,String>> deptList = new ArrayList<>();
  678. //根据部门名称查询部门
  679. for (String deptName : deptNames) {
  680. Map<String,Object> headers = new HashMap();
  681. headers.put("x-acs-dingtalk-access-token",getAccessToken());
  682. Map<String,Object> body = new HashMap<>();
  683. body.put("queryWord",deptName);
  684. body.put("offset",0);
  685. body.put("size",1);
  686. //查询部门id
  687. String jsonString = UtilHttp.doPost("https://api.dingtalk.com/v1.0/contact/departments/search", headers,null , body);
  688. Map result = (Map) JSONObject.parse(jsonString);
  689. List<Integer> list = (List<Integer>) result.get("list");
  690. if (!list.isEmpty()){
  691. Map<String,String> dept = new HashMap<>();
  692. dept.put("text",deptName);
  693. dept.put("value",list.get(0) + "");
  694. deptList.add(dept);
  695. }
  696. }
  697. //根据汇总全部参会成员查询部门
  698. for (String userId : userIds) {
  699. Map<String,Object> param = new HashMap();
  700. param.put("access_token",getAccessToken());
  701. //查询用户详情
  702. DDR_New deptDDR = (DDR_New) UtilHttp.doPost("https://oapi.dingtalk.com/topapi/v2/user/get", null, param, UtilMap.map("userid", userId), DDR_New.class);
  703. if (Objects.isNull(deptDDR.getResult())){
  704. continue;
  705. }
  706. Map result = (Map) deptDDR.getResult();
  707. List<Integer> deptIdList = (List<Integer>) result.get("dept_id_list");
  708. Integer deptId = deptIdList.get(0);
  709. //查询部门详情
  710. DDR_New deptDDR2 = (DDR_New) UtilHttp.doPost("https://oapi.dingtalk.com/topapi/v2/department/get", null, param, UtilMap.map("dept_id", deptId), DDR_New.class);
  711. Map result2 = (Map) deptDDR2.getResult();
  712. if (Objects.nonNull(result2)){
  713. String deptName = result2.get("name").toString();
  714. Map<String,String> dept = new HashMap<>();
  715. dept.put("text",deptName);
  716. dept.put("value",deptId+"");
  717. deptList.add(dept);
  718. }
  719. }
  720. //deptList根据dept的value去重
  721. List<Map<String, String>> uniqueDeptList = deptList.stream()
  722. .filter(distinctByKey(m -> m.get("value")))
  723. .collect(Collectors.toList());
  724. return McR.success(uniqueDeptList);
  725. }
  726. @Override
  727. public McR query(String formUuid, Map conditions, Map argument,int currentPage,int pageSize) {
  728. DDR_New ddrNew = ydClient.queryData(YDParam.builder()
  729. .formUuid(formUuid)
  730. .searchFieldJson(JSONObject.toJSONString(conditions))
  731. .instanceStatus(UtilMap.getString(argument, "instanceStatus"))
  732. .approvedResult(UtilMap.getString(argument, "approvedResult"))
  733. .createFromTimeGMT(UtilMap.getString(argument, "createFrom"))
  734. // .currentPage(currentPage)
  735. .pageNumber(currentPage)
  736. .pageSize(pageSize)
  737. .appType("APP_E0BKS4I6U44824QM1KE5")
  738. .systemToken("U0E66VB1J86UR5RKDPXQTA7WM66K3896KHW8MS5")
  739. .userId("253434204020308091")//任欢欢
  740. .build(), YDConf.FORM_QUERY.retrieve_search_process);
  741. return McR.success(ddrNew);
  742. }
  743. @Override
  744. public McR updateRicheng(Map map) {
  745. String formInstId = UtilMap.getString(map, "formInstId");
  746. String dept = UtilMap.getString(map, "dept");
  747. Map formData = ydClient.queryData(YDParam.builder()
  748. .formInstId(formInstId)
  749. .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  750. //获取各部门参会人
  751. List<String> userIds = new ArrayList<>();
  752. switch (dept){
  753. case "信息技术科": userIds = UtilMap.getList(formData,"employeeField_m99dcmr0_id");break;
  754. case "研发管理科": userIds = UtilMap.getList(formData,"employeeField_m99dcmr1_id");break;
  755. case "竞赛管理科": userIds = UtilMap.getList(formData,"employeeField_m99dcmr4_id");break;
  756. case "综合办公室": userIds = UtilMap.getList(formData,"employeeField_m99dcmr5_id");break;
  757. case "考务管理科": userIds = UtilMap.getList(formData,"employeeField_m99dcmr6_id");break;
  758. case "财务科": userIds = UtilMap.getList(formData,"employeeField_m99dcmr2_id");break;
  759. case "质量督导科": userIds = UtilMap.getList(formData,"employeeField_m99dcmr7_id");break;
  760. case "题库管理科": userIds = UtilMap.getList(formData,"employeeField_m99dcmr8_id");break;
  761. case "系统实施": userIds = UtilMap.getList(formData,"employeeField_mc4mc2vw_id");break;
  762. }
  763. //获取日程参与者
  764. String scheduleId = UtilMap.getString(formData, "textField_m54zg5b1");//日程id
  765. String userId = UtilMap.getString(formData, "textField_m54zg5b0");//发起人
  766. String unionId = getUnionId(userId);//发起人unionId
  767. String jsonString = UtilHttp.doGet("https://api.dingtalk.com/v1.0/calendar/users/" + unionId + "/calendars/primary/events/" + scheduleId + "/attendees", ddClient.initTokenHeader(), new HashMap<>());
  768. Map result = (Map) JSONObject.parse(jsonString);
  769. //原参会人列表
  770. List<Map> attendees = UtilMap.getList(result, "attendees");
  771. List<Map> attendeesToAdd = new ArrayList<>();
  772. //添加当前部门参会人
  773. for (String userId2 : userIds) {
  774. Map attendee = new HashMap();
  775. String unionId2 = getUnionId(userId2);
  776. //参会人是否存在
  777. boolean isExists = attendees.stream().anyMatch(item -> unionId2.equals(UtilMap.getString(item,"id")));
  778. if (!isExists){
  779. attendee.put("id",unionId2);//参会人unionId
  780. attendee.put("isOptional",true);//是否为可选参与人
  781. attendeesToAdd.add(attendee);
  782. }
  783. }
  784. //添加日程参会人
  785. if (!attendeesToAdd.isEmpty()){
  786. Map body = new HashMap();
  787. body.put("attendeesToAdd",attendeesToAdd);//需要添加的参与人列表
  788. body.put("pushNotification",true);//是否弹窗提醒
  789. body.put("chatNotification",true);//是否单聊提醒
  790. String jsonString2 = UtilHttp.doPost("https://api.dingtalk.com/v1.0/calendar/users/" + unionId + "/calendars/primary/events/" + scheduleId + "/attendees", ddClient.initTokenHeader(), null, body);
  791. log.info("添加日程参会人结束:{}",jsonString2);
  792. }else {
  793. log.info("无需添加日程参会人");
  794. }
  795. return McR.success();
  796. }
  797. @Autowired
  798. private DDClient_Schedule ddClient_schedule;
  799. @Autowired
  800. private DDClient dddClient;
  801. @Override
  802. public void test() {
  803. String userId = "253434204020308091";
  804. List<Map> dataList = (List<Map>) ddClient_schedule.getMeetingRoomList(dddClient.getAccessToken(), userId).getResult();
  805. log.info("dataList, {}", dataList);
  806. ddClient_schedule.bookMeetingRoom(dddClient.getAccessToken(), userId, "K1ZoWFNuQXo0RlRubzQ0OVJycXEwQT09", Arrays.asList("ab0d05412c9e11a144d5c49e58adef08bfa2770908bf1ec7"));
  807. }
  808. }