package com.malk.pro.zyjn.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.aliyun.dingtalkyida_1_0.models.SearchFormDatasResponse; import com.aliyun.dingtalkyida_1_0.models.UpdateFormDataResponse; import com.aliyun.tea.TeaException; import com.aliyun.teautil.models.RuntimeOptions; import com.dingtalk.api.DefaultDingTalkClient; import com.dingtalk.api.DingTalkClient; import com.dingtalk.api.request.OapiGettokenRequest; import com.dingtalk.api.request.OapiUserListidRequest; import com.dingtalk.api.request.OapiV2DepartmentListsubidRequest; import com.dingtalk.api.request.OapiV2UserGetRequest; import com.dingtalk.api.response.OapiGettokenResponse; import com.dingtalk.api.response.OapiUserListidResponse; import com.dingtalk.api.response.OapiV2DepartmentListsubidResponse; import com.dingtalk.api.response.OapiV2UserGetResponse; import com.malk.pro.zyjn.service.TongbuService; import com.malk.server.aliwork.YDConf; import com.malk.server.aliwork.YDParam; import com.malk.server.common.McException; import com.malk.server.common.McR; import com.malk.server.dingtalk.DDConf; import com.malk.server.dingtalk.DDR_New; import com.malk.service.aliwork.YDClient; import com.malk.service.dingtalk.DDClient; import com.malk.service.dingtalk.DDClient_Contacts; import com.malk.service.dingtalk.DDClient_Schedule; import com.malk.utils.UtilHttp; import com.malk.utils.UtilMap; import com.taobao.api.ApiException; import lombok.extern.slf4j.Slf4j; import okhttp3.*; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.util.Strings; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.IOException; import java.text.SimpleDateFormat; import java.time.Instant; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; import static com.malk.utils.UtilMc.distinctByKey; @Service @Slf4j public class TongbuServiceImpl implements TongbuService { @Autowired private DDClient ddClient; @Autowired private YDClient ydClient; @Autowired private DDClient_Contacts ddClient_contacts; public static com.aliyun.dingtalkcalendar_1_0.Client createClient() throws Exception { com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config(); config.protocol = "https"; config.regionId = "central"; return new com.aliyun.dingtalkcalendar_1_0.Client(config); } //宜搭接口调用 public static com.aliyun.dingtalkyida_1_0.Client createClient2() throws Exception { com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config(); config.protocol = "https"; config.regionId = "central"; return new com.aliyun.dingtalkyida_1_0.Client(config); } //APPKEY private static String APPKEY = "dingn2nkwrrosmyjk9o2"; //APPSECRET private static String APPSECRET = "t26NJ2TIHeQZAG17QPJAPoVgrVwPUZCLH0JLO955_c0BoAhdaAS5eNf9Fc6KAepo"; //AgenthId:3191553633 //获取钉钉access_token的方法 public String getAccessToken() { String accessToken = null; DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken"); OapiGettokenRequest request = new OapiGettokenRequest(); request.setAppkey(APPKEY); request.setAppsecret(APPSECRET); request.setHttpMethod("GET"); try { OapiGettokenResponse response = client.execute(request); accessToken = response.getAccessToken(); System.out.println("职业技能-AccessToken:" + accessToken); } catch (ApiException e) { e.printStackTrace(); } return accessToken; } /**根据userId获取unionId*/ public String getUnionId(String userId){ String unionid = null; try { DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get"); OapiV2UserGetRequest req = new OapiV2UserGetRequest(); req.setUserid(userId); OapiV2UserGetResponse rsp = client.execute(req, ddClient.getAccessToken()); // System.out.println(rsp.getBody()); String body = rsp.getBody(); //通过fastjson工具转换成json对象,逐层解析 JSONObject jsonObject = JSON.parseObject(body); if (jsonObject != null){ JSONObject result = jsonObject.getJSONObject("result"); unionid = result.getString("unionid"); System.out.println("根据钉钉userId获取的unionid:" + unionid); } } catch (ApiException e) { e.printStackTrace(); } return unionid; } //获取当前部门下一层级的部门id列表 public JSONArray getBumenIdList(long bumenid){ JSONArray dept_id_Array = null; try { DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listsubid"); OapiV2DepartmentListsubidRequest req = new OapiV2DepartmentListsubidRequest(); req.setDeptId(bumenid); OapiV2DepartmentListsubidResponse rsp = client.execute(req, getAccessToken()); System.out.println("钉钉【获取子部门id列表】接口返回信息:" + rsp.getBody()); JSONObject dingdingBumenIdObj = JSON.parseObject(rsp.getBody()); long errcode = dingdingBumenIdObj.getLong("errcode"); System.out.println("接口返回状态码:" + errcode); if (errcode == 0){ JSONObject resultObj = dingdingBumenIdObj.getJSONObject("result"); System.out.println("返回信息result:" + resultObj); dept_id_Array = resultObj.getJSONArray("dept_id_list"); } } catch (ApiException e) { e.printStackTrace(); } System.out.println("封装【当前部门下一层级的部门id列表】jsonArray:" + dept_id_Array); return dept_id_Array; } //根据部门id获取部门下的人员userId列表 public JSONArray getUserIdList(long bumenid){ JSONArray userid_list = null; try { DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/listid"); OapiUserListidRequest req = new OapiUserListidRequest(); req.setDeptId(bumenid); OapiUserListidResponse rsp = client.execute(req, getAccessToken()); System.out.println("钉钉【获取部门用户userId列表】接口返回信息:" + rsp.getBody()); JSONObject dingdingUserIdObj = JSON.parseObject(rsp.getBody()); long errcode = dingdingUserIdObj.getLong("errcode"); System.out.println("接口返回状态码:" + errcode); if (errcode == 0){ JSONObject resultObj = dingdingUserIdObj.getJSONObject("result"); System.out.println("返回信息result:" + resultObj); userid_list = resultObj.getJSONArray("userid_list"); } } catch (ApiException e) { e.printStackTrace(); } System.out.println("封装【当前部门用户userId列表】jsonArray:" + userid_list); return userid_list; } //根据勾选部门名称获取宜搭表单数据 public JSONArray getYidaDeptName(String bumenmingcheng){ //宜搭表单判断查询条件 Map map1 = new HashMap(); //字段编号 map1.put("key", "textField_m99cq8lt"); //同步类型 map1.put("value", bumenmingcheng); //控件类型 map1.put("type", "TEXT"); //逻辑判断符 map1.put("operator", "eq"); //控件名称 map1.put("componentName", "TextField"); List list11 = new ArrayList(); list11.add(map1); String listJson = JSON.toJSONString(list11); System.out.println("查询条件listJson:" + listJson); JSONObject jsonObject = null; int size = 100; int page = 1; //查询表单实例数据 try { com.aliyun.dingtalkyida_1_0.Client client = createClient2(); com.aliyun.dingtalkyida_1_0.models.SearchFormDatasHeaders searchFormDatasHeaders = new com.aliyun.dingtalkyida_1_0.models.SearchFormDatasHeaders(); searchFormDatasHeaders.xAcsDingtalkAccessToken = getAccessToken(); com.aliyun.dingtalkyida_1_0.models.SearchFormDatasRequest searchFormDatasRequest = new com.aliyun.dingtalkyida_1_0.models.SearchFormDatasRequest() .setSystemToken("U0E66VB1J86UR5RKDPXQTA7WM66K3896KHW8MS5") .setSearchFieldJson(listJson) .setCurrentPage(page) .setPageSize(size) .setFormUuid("FORM-458D5FBCB956415081E7725CA5473ABB0ZR2") .setUserId("yida_pub_account") .setAppType("APP_E0BKS4I6U44824QM1KE5"); SearchFormDatasResponse searchFormDatasResponse = client.searchFormDatasWithOptions(searchFormDatasRequest, searchFormDatasHeaders, new RuntimeOptions()); // System.out.println(JSON.toJSONString(searchFormDatasResponse.getBody())); String s = JSON.toJSONString(searchFormDatasResponse.getBody()); jsonObject = JSON.parseObject(s); System.out.println("查询【部门档案】接口object对象:" + jsonObject); } catch (TeaException err) { if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) { // err 中含有 code 和 message 属性,可帮助开发定位问题 } } catch (Exception _err) { TeaException err = new TeaException(_err.getMessage(), _err); if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) { // err 中含有 code 和 message 属性,可帮助开发定位问题 } } List listAll = new ArrayList(); try { JSONArray data = jsonObject.getJSONArray("data"); System.out.println("返回的宜搭data:" + data); if (!data.isEmpty()) { JSONObject formData = data.getJSONObject(0).getJSONObject("formData"); String textField_m99cq8lt = formData.getString("textField_m99cq8lt"); System.out.println("部门名称:" + textField_m99cq8lt); String kezhangUserId = ""; JSONArray jsonArray = formData.getJSONArray("employeeField_m99cq8lu_id"); if (jsonArray != null && !jsonArray.isEmpty()){ kezhangUserId = jsonArray.getString(0); System.out.println("科长userId:" + kezhangUserId); } String fukezhangUserId = ""; JSONArray jsonArray1 = formData.getJSONArray("employeeField_m9l4bvrr_id"); if (jsonArray1 != null && !jsonArray1.isEmpty()){ fukezhangUserId = jsonArray1.getString(0); System.out.println("副科长userId:" + fukezhangUserId); } Map map = new HashMap<>(); map.put("bumenmingcheng",textField_m99cq8lt); map.put("kezhangUserId",kezhangUserId); map.put("fukezhangUserId",fukezhangUserId); listAll.add(map); } }catch (Exception e){ e.printStackTrace(); } JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(listAll)); System.out.println("封装【部门档案】jsonArray:" + jsonArray); return jsonArray; } //宜搭创建会议申请后同步创建钉钉日程 /** * @param data 宜搭会议申请表单数据 * @param formInstId 宜搭会议申请表单实例ID * */ @Override public McR createRicheng(String data, String formInstId) { log.info("宜搭传参【会议申请】全部表单数据:" + data); log.info("数据实例id:" + formInstId); log.info("传参解析中......"); JSONObject jsonObject = new JSONObject(); if (Strings.isNotBlank(data)){ jsonObject = JSON.parseObject(data); System.out.println("表单数据解析:" + jsonObject); }else { Map formData = ydClient.queryData(YDParam.builder() .formInstanceId(formInstId) .build(), YDConf.FORM_QUERY.retrieve_id).getFormData(); jsonObject = JSON.parseObject(JSON.toJSONString(formData)); } //时间格式一:定义时间格式 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //时间格式二:使用ISO_8601格式化器来格式化Instant对象 DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT; //宜搭数据详情链接 String yidaURL = "会议申请记录:" + "https://so09k2.aliwork.com/APP_E0BKS4I6U44824QM1KE5/processDetail?formUuid=FORM-8039B0A8CD7C48E8B7B1D5FF56AD3EF0VVHP&procInsId="+ formInstId +"&navConfig.layout=1180"; System.out.println("宜搭数据详情链接:" + yidaURL); //汇总所有参会人员 List canhuirenyuanList = new ArrayList<>(); /**宜搭表单字段*/ //创建人userId String userId = jsonObject.getString("textField_m54zg5b0"); System.out.println("创建人userId:" + userId); /**根据创建人userId获取unionId*/ String chuangjianrenUnionId = getUnionId(userId); //会议主题 String huiyizhuti = jsonObject.getString("textField_m523ok9w"); System.out.println("会议主题:" + huiyizhuti); //------------------------------------⬇第二版新增⬇----------------------------------------------- //发布部门类型 String fabubumenleixing = jsonObject.getString("radioField_m9getzvn"); System.out.println("发布部门类型:" + fabubumenleixing); /*if (fabubumenleixing.equals("组织内部门")){ //获取发布部门id long fabubumenId = jsonObject.getJSONArray("departmentSelectField_m99jf2e4").getLong(0); System.out.println("发布部门ID:" + fabubumenId); *//**根据发布部门获取当前部门及下级所有部门的人员列表*//* List bumenIdList = new ArrayList(); bumenIdList.add(fabubumenId); *//**调用获取当前部门的下一层级部门id列表*//* log.info("获取当前部门的下一层级部门id列表中......"); JSONArray nextBumenIdList = getBumenIdList(fabubumenId); if (nextBumenIdList != null && !nextBumenIdList.isEmpty()){ System.out.println("【1】当前部门有下级部门,开始循环获取下一层级部门==="); for (int i = 0; i < nextBumenIdList.size(); i++) { long deptId = nextBumenIdList.getLong(i); System.out.println("部门ID:" + deptId); bumenIdList.add(deptId); JSONArray nextBumenIdList1 = getBumenIdList(deptId); if (nextBumenIdList1 != null && !nextBumenIdList1.isEmpty()){ System.out.println("【2】当前部门有下级部门,开始循环获取下一层级部门==="); for (int i1 = 0; i1 < nextBumenIdList1.size(); i1++) { long deptId1 = nextBumenIdList1.getLong(i1); System.out.println("部门ID:" + deptId1); bumenIdList.add(deptId); } } } } System.out.println("部门id汇总List:" + bumenIdList); JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(bumenIdList)); System.out.println("封装【部门id汇总列表】jsonArray:" + jsonArray); *//**调用获取每个部门id下的人员userId列表*//* log.info("获取每个部门id下的人员userId列表中......"); for (int i = 0; i < jsonArray.size(); i++) { long bmid = jsonArray.getLong(i); System.out.println("循环当前部门id:" + bmid); JSONArray userIdList = getUserIdList(bmid); if (userIdList != null && !userIdList.isEmpty()){ System.out.println("当前部门id中存在人员userIdList:" + userIdList); for (int j = 0; j < userIdList.size(); j++) { String renyuanId = userIdList.getString(j); System.out.println("循环当前的人员Id:" + renyuanId); *//**根据参会人员userId获取unionId*//* String canhuirenyuanUnionId = getUnionId(renyuanId); Map canhuirenyuanMap = new HashMap<>(); canhuirenyuanMap.put("id", canhuirenyuanUnionId); canhuirenyuanMap.put("isOptional", true); canhuirenyuanList.add(canhuirenyuanMap); } } } }*/ //参会部门勾选项 JSONArray checkboxField_m99d3k6z = jsonObject.getJSONArray("checkboxField_m99d3k6z"); System.out.println("参会部门多选:" + checkboxField_m99d3k6z); if (checkboxField_m99d3k6z != null && !checkboxField_m99d3k6z.isEmpty()){ for (int x = 0; x < checkboxField_m99d3k6z.size(); x++) { String canhuibumen = checkboxField_m99d3k6z.getString(x); System.out.println("循环当前参会部门勾选项:" + canhuibumen); /**获取维护表的该部门中的「科长」「副科长」userId*/ JSONArray yidaDeptName = getYidaDeptName(canhuibumen); if (yidaDeptName != null && !yidaDeptName.isEmpty()){ JSONObject yidaObj = yidaDeptName.getJSONObject(0); String kezhangUserId = yidaObj.getString("kezhangUserId"); System.out.println("科长userId:" + kezhangUserId); /**根据参会人员userId获取unionId*/ String canhuirenyuanUnionId1 = getUnionId(kezhangUserId); if (canhuirenyuanUnionId1 != null){ Map canhuirenyuanMap1 = new HashMap<>(); canhuirenyuanMap1.put("id", canhuirenyuanUnionId1); canhuirenyuanMap1.put("isOptional", true); canhuirenyuanList.add(canhuirenyuanMap1); } String fukezhangUserId = yidaObj.getString("fukezhangUserId"); System.out.println("副科长userId:" + fukezhangUserId); /**根据参会人员userId获取unionId*/ String canhuirenyuanUnionId2 = getUnionId(fukezhangUserId); if (canhuirenyuanUnionId2 != null){ Map canhuirenyuanMap2 = new HashMap<>(); canhuirenyuanMap2.put("id", canhuirenyuanUnionId2); canhuirenyuanMap2.put("isOptional", true); canhuirenyuanList.add(canhuirenyuanMap2); } } if (canhuibumen.equals("信息技术科")){ //获取相应人员组件里面的人员id JSONArray canhuirenyuanArray = jsonObject.getJSONArray("employeeField_m99dcmr0"); System.out.println("信息技术科参会人员(多选):" + canhuirenyuanArray); if (canhuirenyuanArray != null && !canhuirenyuanArray.isEmpty()) { for (int y = 0; y < canhuirenyuanArray.size(); y++) { String canhuirenyuanUserId = canhuirenyuanArray.getString(y); /**根据参会人员userId获取unionId*/ String canhuirenyuanUnionId = getUnionId(canhuirenyuanUserId); Map canhuirenyuanMap = new HashMap<>(); canhuirenyuanMap.put("id", canhuirenyuanUnionId); canhuirenyuanMap.put("isOptional", true); canhuirenyuanList.add(canhuirenyuanMap); } } }else if (canhuibumen.equals("研发管理科")){ //获取相应人员组件里面的人员id JSONArray canhuirenyuanArray = jsonObject.getJSONArray("employeeField_m99dcmr1"); System.out.println("研发管理科参会人员(多选):" + canhuirenyuanArray); if (canhuirenyuanArray != null && !canhuirenyuanArray.isEmpty()) { for (int y = 0; y < canhuirenyuanArray.size(); y++) { String canhuirenyuanUserId = canhuirenyuanArray.getString(y); /**根据参会人员userId获取unionId*/ String canhuirenyuanUnionId = getUnionId(canhuirenyuanUserId); Map canhuirenyuanMap = new HashMap<>(); canhuirenyuanMap.put("id", canhuirenyuanUnionId); canhuirenyuanMap.put("isOptional", true); canhuirenyuanList.add(canhuirenyuanMap); } } }else if (canhuibumen.equals("竞赛管理科")){ //获取相应人员组件里面的人员id JSONArray canhuirenyuanArray = jsonObject.getJSONArray("employeeField_m99dcmr4"); System.out.println("竞赛管理科参会人员(多选):" + canhuirenyuanArray); if (canhuirenyuanArray != null && !canhuirenyuanArray.isEmpty()) { for (int y = 0; y < canhuirenyuanArray.size(); y++) { String canhuirenyuanUserId = canhuirenyuanArray.getString(y); /**根据参会人员userId获取unionId*/ String canhuirenyuanUnionId = getUnionId(canhuirenyuanUserId); Map canhuirenyuanMap = new HashMap<>(); canhuirenyuanMap.put("id", canhuirenyuanUnionId); canhuirenyuanMap.put("isOptional", true); canhuirenyuanList.add(canhuirenyuanMap); } } }else if (canhuibumen.equals("综合办公室")){ //获取相应人员组件里面的人员id JSONArray canhuirenyuanArray = jsonObject.getJSONArray("employeeField_m99dcmr5"); System.out.println("综合办公室参会人员(多选):" + canhuirenyuanArray); if (canhuirenyuanArray != null && !canhuirenyuanArray.isEmpty()) { for (int y = 0; y < canhuirenyuanArray.size(); y++) { String canhuirenyuanUserId = canhuirenyuanArray.getString(y); /**根据参会人员userId获取unionId*/ String canhuirenyuanUnionId = getUnionId(canhuirenyuanUserId); Map canhuirenyuanMap = new HashMap<>(); canhuirenyuanMap.put("id", canhuirenyuanUnionId); canhuirenyuanMap.put("isOptional", true); canhuirenyuanList.add(canhuirenyuanMap); } } }else if (canhuibumen.equals("考务管理科")){ //获取相应人员组件里面的人员id JSONArray canhuirenyuanArray = jsonObject.getJSONArray("employeeField_m99dcmr6"); System.out.println("考务管理科参会人员(多选):" + canhuirenyuanArray); if (canhuirenyuanArray != null && !canhuirenyuanArray.isEmpty()) { for (int y = 0; y < canhuirenyuanArray.size(); y++) { String canhuirenyuanUserId = canhuirenyuanArray.getString(y); /**根据参会人员userId获取unionId*/ String canhuirenyuanUnionId = getUnionId(canhuirenyuanUserId); Map canhuirenyuanMap = new HashMap<>(); canhuirenyuanMap.put("id", canhuirenyuanUnionId); canhuirenyuanMap.put("isOptional", true); canhuirenyuanList.add(canhuirenyuanMap); } } }else if (canhuibumen.equals("财务科")){ //获取相应人员组件里面的人员id JSONArray canhuirenyuanArray = jsonObject.getJSONArray("employeeField_m99dcmr2"); System.out.println("财务科参会人员(多选):" + canhuirenyuanArray); if (canhuirenyuanArray != null && !canhuirenyuanArray.isEmpty()) { for (int y = 0; y < canhuirenyuanArray.size(); y++) { String canhuirenyuanUserId = canhuirenyuanArray.getString(y); /**根据参会人员userId获取unionId*/ String canhuirenyuanUnionId = getUnionId(canhuirenyuanUserId); Map canhuirenyuanMap = new HashMap<>(); canhuirenyuanMap.put("id", canhuirenyuanUnionId); canhuirenyuanMap.put("isOptional", true); canhuirenyuanList.add(canhuirenyuanMap); } } }else if (canhuibumen.equals("质量督导科")){ //获取相应人员组件里面的人员id JSONArray canhuirenyuanArray = jsonObject.getJSONArray("employeeField_m99dcmr7"); System.out.println("质量督导科参会人员(多选):" + canhuirenyuanArray); if (canhuirenyuanArray != null && !canhuirenyuanArray.isEmpty()) { for (int y = 0; y < canhuirenyuanArray.size(); y++) { String canhuirenyuanUserId = canhuirenyuanArray.getString(y); /**根据参会人员userId获取unionId*/ String canhuirenyuanUnionId = getUnionId(canhuirenyuanUserId); Map canhuirenyuanMap = new HashMap<>(); canhuirenyuanMap.put("id", canhuirenyuanUnionId); canhuirenyuanMap.put("isOptional", true); canhuirenyuanList.add(canhuirenyuanMap); } } }else if (canhuibumen.equals("题库管理科")){ //获取相应人员组件里面的人员id JSONArray canhuirenyuanArray = jsonObject.getJSONArray("employeeField_m99dcmr8"); System.out.println("题库管理科参会人员(多选):" + canhuirenyuanArray); if (canhuirenyuanArray != null && !canhuirenyuanArray.isEmpty()) { for (int y = 0; y < canhuirenyuanArray.size(); y++) { String canhuirenyuanUserId = canhuirenyuanArray.getString(y); /**根据参会人员userId获取unionId*/ String canhuirenyuanUnionId = getUnionId(canhuirenyuanUserId); Map canhuirenyuanMap = new HashMap<>(); canhuirenyuanMap.put("id", canhuirenyuanUnionId); canhuirenyuanMap.put("isOptional", true); canhuirenyuanList.add(canhuirenyuanMap); } } } else if (canhuibumen.equals("系统实施")){ //获取相应人员组件里面的人员id JSONArray canhuirenyuanArray = jsonObject.getJSONArray("employeeField_m9l7c095"); System.out.println("系统实施参会人员(多选):" + canhuirenyuanArray); if (canhuirenyuanArray != null && !canhuirenyuanArray.isEmpty()) { for (int y = 0; y < canhuirenyuanArray.size(); y++) { String canhuirenyuanUserId = canhuirenyuanArray.getString(y); /**根据参会人员userId获取unionId*/ String canhuirenyuanUnionId = getUnionId(canhuirenyuanUserId); Map canhuirenyuanMap = new HashMap<>(); canhuirenyuanMap.put("id", canhuirenyuanUnionId); canhuirenyuanMap.put("isOptional", true); canhuirenyuanList.add(canhuirenyuanMap); } } } } } //------------------------------------⬆第二版新增⬆----------------------------------------------- JSONArray timeArray = jsonObject.getJSONArray("cascadeDateField_m523oka0"); //会议开始时间 long huiyikaishishijian = timeArray.getLong(0); Date startDate = new Date(huiyikaishishijian); String startTime = sdf.format(startDate); System.out.println("格式化后的开始时间(正常格式):" + startTime); Instant instantStart = Instant.ofEpochMilli(huiyikaishishijian); String isoStartDateTime = formatter.format(instantStart); System.out.println("会议开始时间(ISO-8601 格式的时间):" + isoStartDateTime); //会议结束时间 long huiyijieshushijian = timeArray.getLong(1); Date endDate = new Date(huiyijieshushijian); String endTime = sdf.format(endDate); System.out.println("格式化后的开始时间(正常格式):" + endTime); Instant instantEnd = Instant.ofEpochMilli(huiyijieshushijian); String isoEndDateTime = formatter.format(instantEnd); System.out.println("会议结束时间(ISO-8601 格式的时间):" + isoEndDateTime); //会议地点类型 String huiyididianType = jsonObject.getString("radioField_m98fljlv"); System.out.println("会议地点类型:" + huiyididianType); //开会地址 String kaihuidizhi = ""; if (huiyididianType.equals("中心会议室")){ kaihuidizhi = jsonObject.getString("selectField_m98fljlp"); }else if (huiyididianType.equals("中心外部")){ kaihuidizhi = jsonObject.getString("textField_m98fljlw"); } System.out.println("开会地址:" + kaihuidizhi); //参会人员(多选) JSONArray canhuirenyuanArray = jsonObject.getJSONArray("employeeField_m9atzdf9"); System.out.println("参会人员(多选):" + canhuirenyuanArray); if (canhuirenyuanArray != null && !canhuirenyuanArray.isEmpty()){ for (int i = 0; i < canhuirenyuanArray.size(); i++) { String canhuirenyuanUserId = canhuirenyuanArray.getString(i); /**根据参会人员userId获取unionId*/ String canhuirenyuanUnionId = getUnionId(canhuirenyuanUserId); Map canhuirenyuanMap = new HashMap<>(); canhuirenyuanMap.put("id", canhuirenyuanUnionId); canhuirenyuanMap.put("isOptional", true); canhuirenyuanList.add(canhuirenyuanMap); } } /**创建钉钉日程*/ Map startMap = new HashMap<>(); startMap.put("dateTime", isoStartDateTime);//格式为ISO-8601的date-time格式 startMap.put("timeZone", "Asia/Shanghai");//所属时区,TZ database name格式 Map endMap = new HashMap<>(); endMap.put("dateTime", isoEndDateTime);//格式为ISO-8601的date-time格式 endMap.put("timeZone", "Asia/Shanghai");//所属时区,TZ database name格式 Map locationMap = new HashMap<>(); locationMap.put("displayName", kaihuidizhi); Map mapAll = new HashMap<>(); mapAll.put("summary", huiyizhuti);//会议主题 mapAll.put("description", yidaURL);//会议描述,传入宜搭数据详情的URL mapAll.put("isAllDay", false);//是否为全天日程 mapAll.put("start", startMap);//开始时间 mapAll.put("end", endMap);//结束时间 mapAll.put("attendees", canhuirenyuanList);//参会人员 mapAll.put("location", locationMap);//日程地点 String jsonString = JSON.toJSONString(mapAll); System.out.println("封装密钥参数:" + jsonString); String richengID = null; try { OkHttpClient client = new OkHttpClient().newBuilder() .build(); MediaType mediaType = MediaType.parse("application/json"); RequestBody body = RequestBody.create(mediaType, jsonString); Request request = new Request.Builder() .url("https://api.dingtalk.com/v1.0/calendar/users/"+ chuangjianrenUnionId +"/calendars/primary/events") .method("POST", body) .addHeader("x-acs-dingtalk-access-token", getAccessToken()) .addHeader("Content-Type", "application/json") .build(); Response response = client.newCall(request).execute(); String bodyString = response.body().string(); JSONObject JsonBody = JSON.parseObject(bodyString); System.out.println("返回体body:" + JsonBody); richengID = JsonBody.getString("id"); System.out.println("创建钉钉日程接口返回的日程ID:" + richengID); } catch (IOException e) { e.printStackTrace(); } if (richengID != null){ /**将日程ID回写至宜搭表单*/ //根据实例id修改宜搭表单数据 Map mapData = new HashMap<>(); mapData.put("textField_m54zg5b1", richengID); // prd 25.06.26 同步预约会议室, 于会议室水牌显示日程 String roomId = jsonObject.getString("textField_mccrafms"); if (StringUtils.isNoneBlank(roomId)) { try { //todo 2026/05/29 base包预定会议室接口 把 Stream 对象直接包装进了 new Object[]{},Stream 是惰性求值的中间对象,不会自动执行。会变成类似ReferencePipeline$3@7912的未执行完的 Stream 实例,导致报错The value of parameter meetingRoomsToAdd is not array. // ddClient_schedule.bookMeetingRoom(getAccessToken(), userId, richengID, Arrays.asList(roomId)); String unionId = String.valueOf(ddClient_contacts.getUserInfoById(getAccessToken(), userId).get("unionid")); Map body = UtilMap.map("meetingRoomsToAdd", Arrays.asList(roomId).stream().map(item -> UtilMap.map("roomId", item)) .collect(Collectors.toList()) ); DDR_New.doPost("https://api.dingtalk.com/v1.0/calendar/users/" + unionId + "/calendars/primary/events/" + richengID + "/meetingRooms", DDConf.initTokenHeader(getAccessToken()), (Map)null, body); } catch (McException e) { mapData.put("textareaField_mccs33fz", e.getMessage()); e.printStackTrace(); } } else { mapData.put("textareaField_mccs33fz", "会议室 roomId 为空, 取消创建"); } String mapAllString = JSON.toJSONString(mapData); System.out.println("封装修改字段:" + mapAllString); //更新子表控件数据【全量更新】 try { com.aliyun.dingtalkyida_1_0.Client client = createClient2(); com.aliyun.dingtalkyida_1_0.models.UpdateFormDataHeaders updateFormDataHeaders = new com.aliyun.dingtalkyida_1_0.models.UpdateFormDataHeaders(); updateFormDataHeaders.xAcsDingtalkAccessToken = getAccessToken(); com.aliyun.dingtalkyida_1_0.models.UpdateFormDataRequest updateFormDataRequest = new com.aliyun.dingtalkyida_1_0.models.UpdateFormDataRequest() .setSystemToken("U0E66VB1J86UR5RKDPXQTA7WM66K3896KHW8MS5") .setFormInstanceId(formInstId) .setUserId("yida_pub_account") .setAppType("APP_E0BKS4I6U44824QM1KE5") .setUpdateFormDataJson(mapAllString) //使用最新的表单版本进行更新 .setUseLatestVersion(true); UpdateFormDataResponse updateFormDataResponse = client.updateFormDataWithOptions(updateFormDataRequest, updateFormDataHeaders, new RuntimeOptions()); System.out.println(JSON.toJSONString(updateFormDataResponse)); } catch (TeaException err) { if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) { // err 中含有 code 和 message 属性,可帮助开发定位问题 } } catch (Exception _err) { TeaException err = new TeaException(_err.getMessage(), _err); if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) { // err 中含有 code 和 message 属性,可帮助开发定位问题 } } return McR.success("创建钉钉日程成功,并将日程ID反写记录至宜搭表单!"); }else { return McR.errorParam("创建钉钉日程失败!"); } } //宜搭删除会议申请后同步删除钉钉日程 /** * @param formInstId 宜搭会议申请表单实例ID * @param createUserId 创建人userId * @param dingdingRichengID 钉钉日程ID * */ @Override public McR deleteRicheng(String formInstId, String createUserId, String dingdingRichengID) { log.info("数据实例id:" + formInstId); log.info("创建人userId:" + createUserId); log.info("钉钉日程ID:" + dingdingRichengID); /**根据创建人userId获取unionId*/ String chuangjianrenUnionId = getUnionId(createUserId); /**删除钉钉日程*/ try { OkHttpClient client = new OkHttpClient().newBuilder() .build(); MediaType mediaType = MediaType.parse("text/plain"); RequestBody body = RequestBody.create(mediaType, ""); Request request = new Request.Builder() .url("https://api.dingtalk.com/v1.0/calendar/users/"+ chuangjianrenUnionId +"/calendars/primary/events/"+ dingdingRichengID +"?pushNotification=true") .method("DELETE", body) .addHeader("x-acs-dingtalk-access-token", getAccessToken()) .build(); Response response = client.newCall(request).execute(); String bodyString = response.body().string(); JSONObject JsonBody = JSON.parseObject(bodyString); System.out.println("返回体body:" + JsonBody); } catch (IOException e) { e.printStackTrace(); } return McR.success("删除钉钉日程成功!"); } @Override public McR getUsersDepts(List userIds,List deptNames) { List> deptList = new ArrayList<>(); //根据部门名称查询部门 for (String deptName : deptNames) { Map headers = new HashMap(); headers.put("x-acs-dingtalk-access-token",getAccessToken()); Map body = new HashMap<>(); body.put("queryWord",deptName); body.put("offset",0); body.put("size",1); //查询部门id String jsonString = UtilHttp.doPost("https://api.dingtalk.com/v1.0/contact/departments/search", headers,null , body); Map result = (Map) JSONObject.parse(jsonString); List list = (List) result.get("list"); if (!list.isEmpty()){ Map dept = new HashMap<>(); dept.put("text",deptName); dept.put("value",list.get(0) + ""); deptList.add(dept); } } //根据汇总全部参会成员查询部门 for (String userId : userIds) { Map param = new HashMap(); param.put("access_token",getAccessToken()); //查询用户详情 DDR_New deptDDR = (DDR_New) UtilHttp.doPost("https://oapi.dingtalk.com/topapi/v2/user/get", null, param, UtilMap.map("userid", userId), DDR_New.class); if (Objects.isNull(deptDDR.getResult())){ continue; } Map result = (Map) deptDDR.getResult(); List deptIdList = (List) result.get("dept_id_list"); Integer deptId = deptIdList.get(0); //查询部门详情 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); Map result2 = (Map) deptDDR2.getResult(); if (Objects.nonNull(result2)){ String deptName = result2.get("name").toString(); Map dept = new HashMap<>(); dept.put("text",deptName); dept.put("value",deptId+""); deptList.add(dept); } } //deptList根据dept的value去重 List> uniqueDeptList = deptList.stream() .filter(distinctByKey(m -> m.get("value"))) .collect(Collectors.toList()); return McR.success(uniqueDeptList); } @Override public McR query(String formUuid, Map conditions, Map argument,int currentPage,int pageSize) { DDR_New ddrNew = ydClient.queryData(YDParam.builder() .formUuid(formUuid) .searchFieldJson(JSONObject.toJSONString(conditions)) .instanceStatus(UtilMap.getString(argument, "instanceStatus")) .approvedResult(UtilMap.getString(argument, "approvedResult")) .createFromTimeGMT(UtilMap.getString(argument, "createFrom")) // .currentPage(currentPage) .pageNumber(currentPage) .pageSize(pageSize) .appType("APP_E0BKS4I6U44824QM1KE5") .systemToken("U0E66VB1J86UR5RKDPXQTA7WM66K3896KHW8MS5") .userId("253434204020308091")//任欢欢 .build(), YDConf.FORM_QUERY.retrieve_search_process); return McR.success(ddrNew); } @Override public McR updateRicheng(Map map) { String formInstId = UtilMap.getString(map, "formInstId"); String dept = UtilMap.getString(map, "dept"); Map formData = ydClient.queryData(YDParam.builder() .formInstId(formInstId) .build(), YDConf.FORM_QUERY.retrieve_id).getFormData(); //获取各部门参会人 List userIds = new ArrayList<>(); switch (dept){ case "信息技术科": userIds = UtilMap.getList(formData,"employeeField_m99dcmr0_id");break; case "研发管理科": userIds = UtilMap.getList(formData,"employeeField_m99dcmr1_id");break; case "竞赛管理科": userIds = UtilMap.getList(formData,"employeeField_m99dcmr4_id");break; case "综合办公室": userIds = UtilMap.getList(formData,"employeeField_m99dcmr5_id");break; case "考务管理科": userIds = UtilMap.getList(formData,"employeeField_m99dcmr6_id");break; case "财务科": userIds = UtilMap.getList(formData,"employeeField_m99dcmr2_id");break; case "质量督导科": userIds = UtilMap.getList(formData,"employeeField_m99dcmr7_id");break; case "题库管理科": userIds = UtilMap.getList(formData,"employeeField_m99dcmr8_id");break; case "系统实施": userIds = UtilMap.getList(formData,"employeeField_mc4mc2vw_id");break; } //获取日程参与者 String scheduleId = UtilMap.getString(formData, "textField_m54zg5b1");//日程id String userId = UtilMap.getString(formData, "textField_m54zg5b0");//发起人 String unionId = getUnionId(userId);//发起人unionId String jsonString = UtilHttp.doGet("https://api.dingtalk.com/v1.0/calendar/users/" + unionId + "/calendars/primary/events/" + scheduleId + "/attendees", ddClient.initTokenHeader(), new HashMap<>()); Map result = (Map) JSONObject.parse(jsonString); //原参会人列表 List attendees = UtilMap.getList(result, "attendees"); List attendeesToAdd = new ArrayList<>(); //添加当前部门参会人 for (String userId2 : userIds) { Map attendee = new HashMap(); String unionId2 = getUnionId(userId2); //参会人是否存在 boolean isExists = attendees.stream().anyMatch(item -> unionId2.equals(UtilMap.getString(item,"id"))); if (!isExists){ attendee.put("id",unionId2);//参会人unionId attendee.put("isOptional",true);//是否为可选参与人 attendeesToAdd.add(attendee); } } //添加日程参会人 if (!attendeesToAdd.isEmpty()){ Map body = new HashMap(); body.put("attendeesToAdd",attendeesToAdd);//需要添加的参与人列表 body.put("pushNotification",true);//是否弹窗提醒 body.put("chatNotification",true);//是否单聊提醒 String jsonString2 = UtilHttp.doPost("https://api.dingtalk.com/v1.0/calendar/users/" + unionId + "/calendars/primary/events/" + scheduleId + "/attendees", ddClient.initTokenHeader(), null, body); log.info("添加日程参会人结束:{}",jsonString2); }else { log.info("无需添加日程参会人"); } return McR.success(); } @Autowired private DDClient_Schedule ddClient_schedule; @Autowired private DDClient dddClient; @Override public void test() { String userId = "253434204020308091"; List dataList = (List) ddClient_schedule.getMeetingRoomList(dddClient.getAccessToken(), userId).getResult(); log.info("dataList, {}", dataList); ddClient_schedule.bookMeetingRoom(dddClient.getAccessToken(), userId, "K1ZoWFNuQXo0RlRubzQ0OVJycXEwQT09", Arrays.asList("ab0d05412c9e11a144d5c49e58adef08bfa2770908bf1ec7")); } }