package com.muzhi.huanshi.service.impl; import cn.hutool.core.thread.ThreadUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.aliyun.dingtalkyida_1_0.models.*; 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.OapiAttendanceGetcolumnvalRequest; import com.dingtalk.api.request.OapiSmartworkHrmEmployeeListRequest; import com.dingtalk.api.request.OapiSmartworkHrmEmployeeQueryonjobRequest; import com.dingtalk.api.response.OapiAttendanceGetcolumnvalResponse; import com.dingtalk.api.response.OapiSmartworkHrmEmployeeListResponse; import com.dingtalk.api.response.OapiSmartworkHrmEmployeeQueryonjobResponse; import com.muzhi.huanshi.service.AccessTokenService; import com.muzhi.huanshi.service.DingOaService; import com.taobao.api.ApiException; import com.taobao.api.internal.util.StringUtils; import lombok.extern.slf4j.Slf4j; import okhttp3.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.IOException; import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.*; @Service @Slf4j public class DingOaServiceImpl implements DingOaService { @Autowired private AccessTokenService accessTokenService; public static String huamingce1 = null; public static String employee1 = null; //环世TB企业ID(tbOrganizationId) public static String tbOrganizationId = "61318dae53bac9ea1baf7d9d"; //宜搭接口调用 public static com.aliyun.dingtalkyida_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.dingtalkyida_1_0.Client(config); } //根据钉钉邮箱匹配TB邮箱对应人员,获取TB人员ID //TODO 不稳定,废弃。替换成IDMap接口来查询匹配人员ID public String getTBuserId(String youxiang){ // String youxiang = "hongd@olymtech.com"; int code = 0; JSONArray result = null; String TBuserId = null; 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://open.teambition.com/api/org/member/search?orgId=" + tbOrganizationId + "&query=" + youxiang) .method("GET", null) .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken()) .addHeader("X-Tenant-Id", tbOrganizationId) .addHeader("X-Tenant-Type", "organization") .build(); Response response = client.newCall(request).execute(); String bodyStr = response.body().string(); JSONObject jsonObject = JSON.parseObject(bodyStr); // System.out.println("返回体body:" + jsonObject); code = jsonObject.getInteger("code"); System.out.println("TB获取人员接口返回状态码:" + code); result = jsonObject.getJSONArray("result"); System.out.println("TB获取人员接口返回result:" + result); if(result.isEmpty()){ log.info("TB获取人员接口返回result为空,未获取到TB相关人员!"); }else { TBuserId = result.getJSONObject(0).getString("userId"); System.out.println("根据邮箱匹配的TBuserId:" + TBuserId); } }catch (IOException e){ e.printStackTrace(); } return TBuserId; } //通过IDMap查询TBuserId public String getDingdingToTBuserId(String userid){ // String userid = "2055054927907044"; String dingCorpId = "ding8f59ac9a4a00de1635c2f4657eb6378f"; int code = 0; JSONArray result = null; 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://open.teambition.com/api/idmap/query?refId="+ dingCorpId +"&refer=dingTalk-user&extraUserId="+ userid) .method("GET", null) .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken()) .addHeader("X-Tenant-Id", tbOrganizationId) .addHeader("X-Tenant-Type", "organization") .build(); Response response = client.newCall(request).execute(); String bodyStr = response.body().string(); JSONObject jsonObject = JSON.parseObject(bodyStr); // System.out.println("返回体body:" + jsonObject); code = jsonObject.getInteger("code"); System.out.println("TB获取人员接口返回状态码:" + code); result = jsonObject.getJSONArray("result"); System.out.println("TB获取人员接口返回result:" + result); }catch (IOException e){ e.printStackTrace(); } String tbId = result.getJSONObject(0).getString("tbId"); System.out.println("根据钉钉userid匹配的TBuserId:" + tbId); return tbId; } //获取宜搭表单数据【人员信息底表】 public JSONArray getYidaRenyuanxinxidibiao(){ JSONObject jsonObject = null; int size = 100; int page = 1; List listAll = new ArrayList(); do { //【斯曼尔架构】 try { com.aliyun.dingtalkyida_1_0.Client client = createClient(); com.aliyun.dingtalkyida_1_0.models.SearchFormDatasHeaders searchFormDatasHeaders = new com.aliyun.dingtalkyida_1_0.models.SearchFormDatasHeaders(); searchFormDatasHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken(); com.aliyun.dingtalkyida_1_0.models.SearchFormDatasRequest searchFormDatasRequest = new com.aliyun.dingtalkyida_1_0.models.SearchFormDatasRequest() .setSystemToken("J0A6698165EFMED0AHIG76FW7C6Q3ON1PG5OL482") // .setSearchFieldJson(mapAllStr) .setCurrentPage(page) .setPageSize(size) .setFormUuid("FORM-5Q966D91G96F0WI8D98Q27NSBGUR3OV02H5OL21") .setUserId("yida_pub_account") .setAppType("APP_QHPV3T4ZU2Y88Q4U0UDA"); 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 属性,可帮助开发定位问题 } } JSONArray data = jsonObject.getJSONArray("data"); // System.out.println("返回的宜搭data:" + data); if (data.isEmpty()) { System.out.println("查询【人员信息底表】返回数据为空!"); } else { for (int i = 0; i < data.size(); i++) { JSONObject formData = data.getJSONObject(i).getJSONObject("formData"); // System.out.println("循环返回的宜搭formData:" + formData); Map map = new HashMap<>(); //实例ID String shiliID = data.getJSONObject(i).getString("formInstanceId"); System.out.println("实例ID===>" + shiliID); //钉钉userid String userid = formData.getString("textField_lo5h5imc"); System.out.println("钉钉userid===>" + userid); //人员姓名 String username = formData.getString("textField_lo5h5ime"); System.out.println("人员姓名===>" + username); //主部门 String zhubumen = formData.getString("textField_lo5h5imj"); System.out.println("主部门===>" + zhubumen); //职位 String zhiwei = formData.getString("textField_los37klu"); System.out.println("职位===>" + username); //邮箱 String youoxiang = formData.getString("textField_los37klv"); System.out.println("邮箱===>" + zhubumen); map.put("shiliID",shiliID); map.put("userid",userid); map.put("username",username); map.put("zhubumen",zhubumen); map.put("zhiwei",zhiwei); map.put("youxiang",youoxiang); System.out.println("每次封装人员信息的map:" + map); listAll.add(map); } } if (jsonObject.getFloat("totalCount") / 100 > jsonObject.getInteger("currentPage")){ page = page + 1; System.out.println("下一次待查询分页:" + page); } }while (jsonObject.getFloat("totalCount") / 100 > jsonObject.getInteger("currentPage")); JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(listAll)); System.out.println("封装【人员信息底表】明细jsonArray:" + jsonArray); return jsonArray; } //获取钉钉人员-同步至宜搭人员信息表 @Override public String addDingdingRenyuan(){ //在职员工id列表的循环获取 DingTalkClient client1 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/smartwork/hrm/employee/queryonjob"); OapiSmartworkHrmEmployeeQueryonjobRequest request1 = new OapiSmartworkHrmEmployeeQueryonjobRequest(); //企业在职员工userid列表 int offset = 0;//分页游标,从0开始 int size = 20;//分页大小,最大50 JSONObject result1; do { List list = new ArrayList<>(); System.out.println("测试分页值:" + offset); try { request1.setStatusList("2,3,5,-1"); request1.setOffset((long) offset); request1.setSize((long) size); OapiSmartworkHrmEmployeeQueryonjobResponse response1 = client1.execute(request1, accessTokenService.getAccessToken()); employee1 = response1.getBody(); System.out.println(response1.getBody()); } catch (ApiException e) { e.printStackTrace(); } //通过fastjson工具转换成json对象,逐层解析 JSONObject jsonObject1 = JSON.parseObject(employee1); result1 = jsonObject1.getJSONObject("result"); String dataList = result1.getString("data_list"); //将String数组进行处理,去掉所有的双引号("")和中括号([]) String dataRes = dataList.replace("\"", ""). replaceAll("\\[", ""). replaceAll("\\]", ""); list.add(dataRes); String userid1 = list.toString().replace("\"", ""). replaceAll("\\[", ""). replaceAll("\\]", ""); /*---获取花名册数据---*/ try { DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/smartwork/hrm/employee/list"); OapiSmartworkHrmEmployeeListRequest request = new OapiSmartworkHrmEmployeeListRequest(); request.setUseridList(userid1); //需要获取的花名册字段信息 //request.setFieldFilterList("sys00-name,sys02-sexType,sys01-employeeStatus,sys00-email,sys03-graduateSchool,sys03-highestEdu,sys00-dept,e3d6dbbd-9265-4f1e-8c58-ac3602e83960,sys03-graduationTime,sys00-mobile,sys02-address,sys02-marriage,sys00-confirmJoinTime,sys00-workPlace,sys00-position,sys01-positionLevel,sys02-politicalStatus,sys03-major,sys02-certNo,sys02-birthTime,sys02-certAddress,sys02-certEndTime,sys02-residenceType,sys01-employeeType,sys04-bankAccountNo,sys04-accountBank,sys09-personalHf,sys05-contractType,sys05-contractCompanyName,ff63191a-45cf-4106-ade0-54f1def7cc55"); OapiSmartworkHrmEmployeeListResponse response = client.execute(request, accessTokenService.getAccessToken()); huamingce1 = response.getBody(); System.out.println(response.getBody()); }catch (ApiException e){ e.printStackTrace(); } //通过fastjson工具转换成json对象,逐层解析 //将String类型的花名册json数据转换为Object数据对象 JSONObject jsonObject = JSON.parseObject(huamingce1); //直接将花名册对象通过Object转换成Array数组格式 JSONArray resultArray = jsonObject.getJSONArray("result"); System.out.println("Array===>" + resultArray); /*---获取花名册数据---*/ for (int i = 0; i" + fieldListArray.getJSONObject(a).getString("value")); userName = fieldListArray.getJSONObject(a).getString("value"); } break; //主部门 case "sys00-mainDept": if (fieldListArray.getJSONObject(a).getString("value") != null){ System.out.println("***主部门***-->" + fieldListArray.getJSONObject(a).getString("value")); zhubumen = fieldListArray.getJSONObject(a).getString("value"); } break; //职位 case "sys00-position": if (fieldListArray.getJSONObject(a).getString("value") != null){ System.out.println("***职位***-->" + fieldListArray.getJSONObject(a).getString("value")); zhiwei = fieldListArray.getJSONObject(a).getString("value"); } break; //邮箱 case "sys00-email": if (fieldListArray.getJSONObject(a).getString("value") != null){ System.out.println("***邮箱***-->" + fieldListArray.getJSONObject(a).getString("value")); youxiang = fieldListArray.getJSONObject(a).getString("value"); } break; } } //判断宜搭人员信息表是否有当前人员userid /*同步至宜搭*/ Map map = new HashMap(); //人员空间 map.put("employeeField_lo5h5iml",userId); //钉钉userid map.put("textField_lo5h5imc", userId); //姓名 map.put("textField_lo5h5ime", userName); //主部门 map.put("textField_lo5h5imj", zhubumen); //职位 map.put("textField_los37klu", zhiwei); //邮箱 map.put("textField_los37klv", youxiang); String mapJson = JSON.toJSONString(map); System.out.println("mapJson:" + mapJson); //宜搭表单判断查询条件 Map map1 = new HashMap(); //字段编号 map1.put("key", "textField_lo5h5imc"); //同步类型 map1.put("value", userId); //控件类型 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); //新增或更新表单实例【宜搭】 try { com.aliyun.dingtalkyida_1_0.Client client11 = createClient(); com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders createOrUpdateFormDataHeaders = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders(); createOrUpdateFormDataHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken(); com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest createOrUpdateFormDataRequest = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest() //应用秘钥 .setSystemToken("J0A6698165EFMED0AHIG76FW7C6Q3ON1PG5OL482") //表单编码 .setFormUuid("FORM-5Q966D91G96F0WI8D98Q27NSBGUR3OV02H5OL21") .setUserId("yida_pub_account") .setSearchCondition(listJson) //应用编码 .setAppType("APP_QHPV3T4ZU2Y88Q4U0UDA") .setFormDataJson(mapJson); CreateOrUpdateFormDataResponse orUpdateFormDataWithOptions = client11.createOrUpdateFormDataWithOptions(createOrUpdateFormDataRequest, createOrUpdateFormDataHeaders, new RuntimeOptions()); String s = JSON.toJSONString(orUpdateFormDataWithOptions.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 属性,可帮助开发定位问题 } } } /*同步至宜搭*/ if (result1.getString("next_cursor") != null) { // || result1.getString("data_list") != "" // offset = offset + size; try { offset = result1.getInteger("next_cursor"); }catch (Exception e){ e.printStackTrace(); } } } while (result1.getString("next_cursor") != null); return "同步环世花名册人员-->宜搭人员信息表单完成"; } //根据任务ID获取任务详情 public JSONArray getRenwuxiangqing(String renwuId){ // String renwuId = "653a4ae8dba1ed3bcdae96a1"; int code = 0; JSONArray result = null; JSONArray resultArray = null; 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://open.teambition.com/api/v3/task/query?taskId=" + renwuId) .method("GET", null) .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken()) .addHeader("X-Tenant-Id", tbOrganizationId) .addHeader("X-Tenant-Type", "organization") .build(); Response response = client.newCall(request).execute(); String bodyStr = response.body().string(); JSONObject jsonObject = JSON.parseObject(bodyStr); // System.out.println("返回体body:" + jsonObject); code = jsonObject.getInteger("code"); System.out.println("TB获取任务详情接口返回状态码:" + code); result = jsonObject.getJSONArray("result"); System.out.println("TB获取任务详情接口返回result:" + result); resultArray = JSON.parseArray(result.toJSONString()); System.out.println("接口返回任务详情数组:" + resultArray); }catch (IOException e){ e.printStackTrace(); } return resultArray; } //根据项目ID获取项目名称 public String getTBxaingmu(String xiangmuID){ // String xiangmuID = "6527a5df45765228a54babbf"; int code = 0; JSONArray result = null; String xiangmuName = null; try { OkHttpClient client = new OkHttpClient().newBuilder() .build(); Request request = new Request.Builder() .url("https://open.teambition.com/api/v3/project/query?projectIds=" + xiangmuID) .method("GET", null) .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken()) .addHeader("X-Tenant-Id", tbOrganizationId) .addHeader("X-Tenant-Type", "organization") .build(); Response response = client.newCall(request).execute(); String bodyStr = response.body().string(); JSONObject jsonObject = JSON.parseObject(bodyStr); System.out.println("返回体body:" + jsonObject); code = jsonObject.getInteger("code"); System.out.println("查询【项目信息】接口返回的状态码(200成功,400异常):" + code); result = jsonObject.getJSONArray("result"); xiangmuName = result.getJSONObject(0).getString("name"); System.out.println("项目名称:" + xiangmuName); }catch (IOException e){ e.printStackTrace(); } return xiangmuName; } //根据项目ID获取项目分组ID public String getXiangmufenzuID(String xiangmuID){ //项目ID // String xiangmuID = "652e28f8d74c5cc851b1a732"; int code = 0; JSONArray result = null; String xiangmufenzuID = ""; 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://open.teambition.com/api/v3/project/"+ xiangmuID +"/project-tag") .method("GET", null) .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken()) .addHeader("X-Tenant-Id", tbOrganizationId) .addHeader("X-Tenant-Type", "organization") .build(); Response response = client.newCall(request).execute(); String bodyStr = response.body().string(); JSONObject jsonObject = JSON.parseObject(bodyStr); System.out.println("返回体body:" + jsonObject); code = jsonObject.getInteger("code"); System.out.println("查询【项目分组】接口返回的状态码(200成功,400异常):" + code); result = jsonObject.getJSONArray("result"); if (!result.isEmpty()){ xiangmufenzuID = result.getString(0); } }catch (IOException e){ e.printStackTrace(); } System.out.println("项目分组ID:" + xiangmufenzuID); return xiangmufenzuID; } //根据项目分组ID获取项目分组名称 public String getXiangmufenzuName(String xiangmufenzuID){ //项目分组ID // String xiangmufenzuID = "645afc0bf1e174064c4e0ea1"; int code = 0; JSONArray result = null; String xiangmufenzuName = ""; 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://open.teambition.com/api/v3/project-tag/query?ids="+ xiangmufenzuID) .method("GET", null) .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken()) .addHeader("X-Tenant-Id", tbOrganizationId) .addHeader("X-Tenant-Type", "organization") .build(); Response response = client.newCall(request).execute(); String bodyStr = response.body().string(); JSONObject jsonObject = JSON.parseObject(bodyStr); System.out.println("返回体body:" + jsonObject); code = jsonObject.getInteger("code"); System.out.println("查询【项目分组名称】接口返回的状态码(200成功,400异常):" + code); result = jsonObject.getJSONArray("result"); JSONObject jsonObject1 = result.getJSONObject(0); xiangmufenzuName = jsonObject1.getString("name"); }catch (IOException e){ e.printStackTrace(); } System.out.println("项目分组名称:" + xiangmufenzuName); return xiangmufenzuName; } //根据自定义字段ID【业务类型】获取自定义字段内容 public JSONArray getTBzidingyi() { //业务类型 String zidingyiID = "642a8ff24ed7d8c44b469ced"; int code = 0; JSONArray result = null; 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://open.teambition.com/api/v3/customfield/search?cfIds=" + zidingyiID) .method("GET", null) .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken()) .addHeader("X-Tenant-Id", tbOrganizationId) .addHeader("X-Tenant-Type", "organization") .build(); Response response = client.newCall(request).execute(); String bodyStr = response.body().string(); JSONObject jsonObject = JSON.parseObject(bodyStr); System.out.println("返回体body:" + jsonObject); code = jsonObject.getInteger("code"); System.out.println("查询【自定义字段:业务类型】接口返回的状态码(200成功,400异常):" + code); result = jsonObject.getJSONArray("result"); System.out.println("result:" + result); }catch (IOException e){ e.printStackTrace(); } JSONArray yewuleixingArray = result.getJSONObject(0).getJSONArray("choices"); System.out.println("【业务类型】值:" + yewuleixingArray); return yewuleixingArray; } //获取迭代类型 public String getDiedai(String xmid, String ddid){ // String xmid = "6476b93d344ff5c76845eb8d"; // String ddid = "6528b83315680fd221e3c1b6"; int code = 0; JSONArray result = null; String diedaiName = ""; 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://open.teambition.com/api/v3/project/" + xmid + "/sprint/search?sprintIds=" + ddid) .method("GET", null) .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken()) .addHeader("X-Tenant-Id", tbOrganizationId) .addHeader("X-Tenant-Type", "organization") .build(); Response response = client.newCall(request).execute(); String bodyStr = response.body().string(); JSONObject jsonObject = JSON.parseObject(bodyStr); System.out.println("返回体body:" + jsonObject); code = jsonObject.getInteger("code"); System.out.println("查询【迭代名称】接口返回的状态码(200成功,400异常):" + code); result = jsonObject.getJSONArray("result"); System.out.println("result:" + result); if (result != null){ diedaiName = result.getJSONObject(0).getString("name"); } }catch (IOException e){ e.printStackTrace(); } System.out.println("迭代名称:" + diedaiName); return diedaiName; } //获取IDX分组下的目录名称 public JSONArray getIDXfenzu(){ //获取项目分组【IDX项目】下面的分组 String IDXxiangmufenzuID = "645def56443fd5770693c3f8"; int code = 0; JSONArray result = null; 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://open.teambition.com/api/v3/project-tag/query?parentProjectTagId=" + IDXxiangmufenzuID) .method("GET", null) .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken()) .addHeader("X-Tenant-Id", tbOrganizationId) .addHeader("X-Tenant-Type", "organization") .build(); Response response = client.newCall(request).execute(); String bodyStr = response.body().string(); JSONObject jsonObject = JSON.parseObject(bodyStr); System.out.println("返回体body:" + jsonObject); code = jsonObject.getInteger("code"); result = jsonObject.getJSONArray("result"); }catch (IOException e){ e.printStackTrace(); } System.out.println("查询【IDX分组】下面的分组,接口返回的状态码(200成功,400异常):" + code); return result; } //查询宜搭中是否有该任务的工时 public String getYida(String sjtjyf,String userid,String tbrwid,String rwgsssrq,String panduan){ // String sjtjyf = "2024-01"; // String userid = "2055054927907044"; // String tbrwid = "65ba0be275b4750e2772c89b"; // String rwgsssrq = "2024-01-25T00:00:00.000Z"; //封装根据当前年份作为查询条件 Map mapAll = new HashMap(); // //查询实际统计月份 // mapAll.put("textField_losayxi8",sjtjyf); // //人员userid // mapAll.put("textField_los8y15p",userid); // //TB任务id // mapAll.put("textField_lp8ihks3",tbrwid); // //任务工时所属日期 // mapAll.put("textField_lqn3tjjv",rwgsssrq); if (panduan.equals("实际工时")){ //查询实际统计月份 mapAll.put("textField_losayxi8",sjtjyf); //人员userid mapAll.put("textField_los8y15p",userid); //TB任务id mapAll.put("textField_lp8ihks3",tbrwid); //任务工时所属日期 mapAll.put("textField_lqn3tjjv",rwgsssrq); }else { //查询实际统计月份 mapAll.put("textField_losayxi8",sjtjyf); //人员userid mapAll.put("textField_los8y15p",userid); //TB任务id mapAll.put("textField_lp8ihks3",tbrwid); //任务工时所属日期 mapAll.put("textField_lqn3tjjv",rwgsssrq); //工时类型 mapAll.put("textField_lrq4uku2","实际工时"); } String mapAllStr = JSON.toJSONString(mapAll); System.out.println("封装查询宜搭中是否有该任务工时的字段参数:" + mapAllStr); JSONObject jsonObject = null; JSONArray data = null; int size = 100; int page = 1; //【环世架构】 try { com.aliyun.dingtalkyida_1_0.Client client = createClient(); com.aliyun.dingtalkyida_1_0.models.SearchFormDatasHeaders searchFormDatasHeaders = new com.aliyun.dingtalkyida_1_0.models.SearchFormDatasHeaders(); searchFormDatasHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken(); com.aliyun.dingtalkyida_1_0.models.SearchFormDatasRequest searchFormDatasRequest = new com.aliyun.dingtalkyida_1_0.models.SearchFormDatasRequest() .setSystemToken("J0A6698165EFMED0AHIG76FW7C6Q3ON1PG5OL482") .setSearchFieldJson(mapAllStr) .setCurrentPage(page) .setPageSize(size) .setFormUuid("FORM-BH766Y61W4CFWBS0869YFBF8COTE2QEHIH5OLM") .setUserId("yida_pub_account") .setAppType("APP_QHPV3T4ZU2Y88Q4U0UDA"); 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); data = jsonObject.getJSONArray("data"); System.out.println("返回的宜搭data:" + data); } 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 属性,可帮助开发定位问题 } } String flag = null; if (data == null || data.isEmpty()) { System.out.println("查询【宜搭工时统计表】返回数据为空!"); flag = "不存在"; } else { flag = "已存在"; } System.out.println("查询返回结果标识:" + flag); return flag; } //统计钉钉考勤、请假、TB项目/任务工时 @Override public String allTongji(int type){ /** * type = 0 上月数据 * type = 1 本月数据 * */ //TODO // type = 0; //获取当前时间 Date Date = new Date(System.currentTimeMillis()); System.out.println("当前时间:" + Date); String lastMonthNow = null; // //截取当天上月的年月 // Calendar calendar123 = Calendar.getInstance(); // calendar123.setTime(Date); // calendar123.add(Calendar.MONTH,-1); // lastMonthNow = new SimpleDateFormat("yyyy-MM").format(calendar123.getTime()); // System.out.println("当天上月的日期,文本格式(月)" + lastMonthNow); if (type == 0){//上月 //截取当天上月的年月 Calendar calendar123 = Calendar.getInstance(); calendar123.setTime(Date); calendar123.add(Calendar.MONTH,-1); lastMonthNow = new SimpleDateFormat("yyyy-MM").format(calendar123.getTime()); System.out.println("当天上月的日期,文本格式(月)" + lastMonthNow); }else {//本月 //截取当天本月的年月 Calendar calendar123 = Calendar.getInstance(); calendar123.setTime(Date); calendar123.add(Calendar.MONTH,0); lastMonthNow = new SimpleDateFormat("yyyy-MM").format(calendar123.getTime()); System.out.println("当天本月的日期,文本格式(月)" + lastMonthNow); } /*计算规则*/ String FORMtime = null; String TOtime = null; //查询工时使用的时间段 String startDate = null; String endDate = null; // /* // * 获取前一个月的第一天和最后一天的时间 // * */ // Calendar calendar111 = Calendar.getInstance(); // calendar111.setTime(Date); // //前一个月第一天 // calendar111.add(Calendar.MONTH,-1); // calendar111.set(Calendar.DAY_OF_MONTH,1); // calendar111.set(Calendar.HOUR_OF_DAY,0); // calendar111.set(Calendar.MINUTE,0); // calendar111.set(Calendar.SECOND,0); // calendar111.set(Calendar.MILLISECOND,0); // FORMtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar111.getTime()); // System.out.println("前一个月第一天零点:" + FORMtime); // // Calendar calendar222 = Calendar.getInstance(); //// int month222 = calendar222.get(Calendar.MONTH); // //前一个月最后一天 // calendar222.add(Calendar.MONTH,-1); // calendar222.set(Calendar.DAY_OF_MONTH,calendar222.getActualMaximum(Calendar.DAY_OF_MONTH)); // calendar222.set(Calendar.HOUR_OF_DAY,0); // calendar222.set(Calendar.MINUTE,0); // calendar222.set(Calendar.SECOND,0); // calendar222.set(Calendar.MILLISECOND,0); // TOtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar222.getTime()); // System.out.println("前一个月最后一天零点:" + TOtime); if (type == 0){ /* * 获取前一个月的第一天和最后一天的时间 * */ Calendar calendar111 = Calendar.getInstance(); calendar111.setTime(Date); //前一个月第一天 calendar111.add(Calendar.MONTH,-1); calendar111.set(Calendar.DAY_OF_MONTH,1); calendar111.set(Calendar.HOUR_OF_DAY,0); calendar111.set(Calendar.MINUTE,0); calendar111.set(Calendar.SECOND,0); calendar111.set(Calendar.MILLISECOND,0); FORMtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar111.getTime()); System.out.println("前一个月第一天零点:" + FORMtime); startDate = new SimpleDateFormat("yyyy-MM-dd").format(calendar111.getTime()); System.out.println("前一个月第一天:" + startDate); Calendar calendar222 = Calendar.getInstance(); // int month222 = calendar222.get(Calendar.MONTH); //前一个月最后一天 calendar222.add(Calendar.MONTH,-1); calendar222.set(Calendar.DAY_OF_MONTH,calendar222.getActualMaximum(Calendar.DAY_OF_MONTH)); calendar222.set(Calendar.HOUR_OF_DAY,0); calendar222.set(Calendar.MINUTE,0); calendar222.set(Calendar.SECOND,0); calendar222.set(Calendar.MILLISECOND,0); TOtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar222.getTime()); System.out.println("前一个月最后一天零点:" + TOtime); endDate = new SimpleDateFormat("yyyy-MM-dd").format(calendar222.getTime()); System.out.println("前一个月最后一天:" + endDate); }else { /* * 获取本月的第一天和最后一天的时间 * */ Calendar calendar111 = Calendar.getInstance(); calendar111.setTime(Date); //本月第一天 calendar111.add(Calendar.MONTH,0); calendar111.set(Calendar.DAY_OF_MONTH,1); calendar111.set(Calendar.HOUR_OF_DAY,0); calendar111.set(Calendar.MINUTE,0); calendar111.set(Calendar.SECOND,0); calendar111.set(Calendar.MILLISECOND,0); FORMtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar111.getTime()); System.out.println("本月第一天零点:" + FORMtime); startDate = new SimpleDateFormat("yyyy-MM-dd").format(calendar111.getTime()); System.out.println("本月第一天:" + startDate); Calendar calendar222 = Calendar.getInstance(); // int month222 = calendar222.get(Calendar.MONTH); //本月最后一天 calendar222.add(Calendar.MONTH,0); calendar222.set(Calendar.DAY_OF_MONTH,calendar222.getActualMaximum(Calendar.DAY_OF_MONTH)); calendar222.set(Calendar.HOUR_OF_DAY,0); calendar222.set(Calendar.MINUTE,0); calendar222.set(Calendar.SECOND,0); calendar222.set(Calendar.MILLISECOND,0); TOtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar222.getTime()); System.out.println("本月最后一天零点:" + TOtime); endDate = new SimpleDateFormat("yyyy-MM-dd").format(calendar222.getTime()); System.out.println("本月最后一天:" + endDate); } //TODO 【手动同步】指定月份的数据,记得注释掉!!! // lastMonthNow = "2024-02"; //TODO 【手动同步】指定月份的数据,记得注释掉!!! // FORMtime = "2024-02-01 00:00:00"; // TOtime = "2024-02-29 00:00:00"; // startDate = "2024-02-01"; // endDate = "2024-02-29"; /*根据自定义字段ID获取【业务类型】选项数组*/ log.info("通过封装接口获取【业务类型】选项数组。"); JSONArray tBzidingyi = getTBzidingyi(); //根据人员信息底表获取【钉钉请假】数据 /*通过封装接口获取【人员信息底表】*/ JSONArray yidaRenyuanxinxidibiao = getYidaRenyuanxinxidibiao(); log.info("通过封装接口获取【人员信息底表】:" + yidaRenyuanxinxidibiao); //TODO 人员信息底表获取的第一个人员信息,可能会存在根据邮箱匹配不到TB人员信息的情况。单独同步使用。 // String aaa = "[{\"zhubumen\":\"QCC组\",\"zhiwei\":\"测试工程师\n\",\"userid\":\"085953146222434489\",\"username\":\"国维杰\",\"youxiang\":\"guowj@olymtech.com\"}]"; // JSONArray yidaRenyuanxinxidibiao = JSON.parseArray(aaa); // log.info("【TEST】通过封装接口获取【人员信息底表】:" + yidaRenyuanxinxidibiao); for (int i = 0; i < yidaRenyuanxinxidibiao.size(); i++) { //员工id String userId = yidaRenyuanxinxidibiao.getJSONObject(i).getString("userid"); System.out.println("员工id:" + userId); //员工姓名 String userName = yidaRenyuanxinxidibiao.getJSONObject(i).getString("username"); System.out.println("员工姓名:" + userName); //主部门 String zhubumen = yidaRenyuanxinxidibiao.getJSONObject(i).getString("zhubumen"); System.out.println("主部门:" + zhubumen); //职位 String zhiwei = yidaRenyuanxinxidibiao.getJSONObject(i).getString("zhiwei"); System.out.println("职位:" + zhiwei); //邮箱 String youxiang = yidaRenyuanxinxidibiao.getJSONObject(i).getString("youxiang"); System.out.println("邮箱:" + youxiang); if (youxiang == null){ log.info("获取人员信息底表【邮箱为空】,该钉钉人员没有维护邮箱或者人员已离职!"); }else { //获取TB人员userId log.info("根据钉钉userid匹配TB人员userId==="); // String TBuserId = getTBuserId(youxiang); // if (TBuserId == null){ // TBuserId = getTBuserId(youxiang); // // if (TBuserId == null){ // TBuserId = getTBuserId(youxiang); // } // } // log.info("根据邮箱匹配到的TB人员userId===" + TBuserId); String TBuserId = getDingdingToTBuserId(userId); log.info("根据钉钉userid匹配到的TB人员userId===" + TBuserId); if (TBuserId == null) { log.info("根据钉钉userid没有匹配到TB人员userId,为空不处理同步TB数据,只同步钉钉数据!"); /*同步钉钉数据*/ //应出勤天数 float yingchuqintianshu = 0; //请假天数 float qingjiatianshu = 0; //查询上月考勤数据,统计上月应出勤天数、请假天数 try { DingTalkClient client11 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/getcolumnval"); OapiAttendanceGetcolumnvalRequest req = new OapiAttendanceGetcolumnvalRequest(); //TODO 待查询人员的userid req.setUserid(userId); //考勤报表列定义查出来的工作时长的列id(固定) req.setColumnIdList("176150482,985267953"); //TODO 查询开始时间 req.setFromDate(StringUtils.parseDateTime(FORMtime)); //TODO 查询结束时间 req.setToDate(StringUtils.parseDateTime(TOtime)); OapiAttendanceGetcolumnvalResponse rsp = client11.execute(req, accessTokenService.getAccessToken()); // System.out.println(rsp.getBody()); String string = rsp.getBody(); JSONObject jsonObjectKaoqin = JSON.parseObject(string); int errcode = jsonObjectKaoqin.getInteger("errcode"); System.out.println("考勤时间周期查询结果状态码:" + errcode); String errmsg = jsonObjectKaoqin.getString("errmsg"); System.out.println("考勤时间周期查询结果状态信息:" + errmsg); if (errcode != 0) { log.info("考勤时间周期查询结果反馈异常,异常状态码:" + errcode + "【" + errmsg + "】"); } else { //应出勤天数 JSONArray jsonArray1 = jsonObjectKaoqin.getJSONObject("result"). getJSONArray("column_vals"). getJSONObject(0). getJSONArray("column_vals"); for (int x = 0; x < jsonArray1.size(); x++) { //应出勤天数 String value = jsonArray1.getJSONObject(x).getString("value"); System.out.println("应出勤天数:" + value); float v = Float.parseFloat(value); if (v == 1) { System.out.println("应出勤天数,进行循环统计!"); yingchuqintianshu = yingchuqintianshu + 1; } } //请假天数 JSONArray jsonArray = jsonObjectKaoqin.getJSONObject("result"). getJSONArray("column_vals"). getJSONObject(1). getJSONArray("column_vals"); for (int x = 0; x < jsonArray.size(); x++) { //请假天数 String value = jsonArray.getJSONObject(x).getString("value"); System.out.println("请假天数:" + value); float v = Float.parseFloat(value); if (v > 0) { System.out.println("请假天数,进行循环统计!"); qingjiatianshu = qingjiatianshu + v; } } } } catch (ApiException e) { e.printStackTrace(); } //应出勤天数 BigDecimal ycqts = new BigDecimal(yingchuqintianshu); BigDecimal ycqtsAll = ycqts.setScale(2, BigDecimal.ROUND_DOWN); System.out.println("应出勤天数(浮点数,保留2位小数):" + ycqtsAll); //请假天数 BigDecimal qjts = new BigDecimal(qingjiatianshu); BigDecimal qjtsAll = qjts.setScale(2, BigDecimal.ROUND_DOWN); System.out.println("请假天数(浮点数,保留2位小数):" + qjtsAll); /*同步至宜搭*/ Map map = new HashMap(); //实际统计月份 map.put("textField_losayxi8", lastMonthNow); //钉钉userid map.put("textField_los8y15p", userId); //姓名 map.put("textField_los8y15q", userName); //主部门 map.put("textField_los8y15s", zhubumen); //职位 map.put("textField_los8y15x", zhiwei); //邮箱 map.put("textField_los8y15y", youxiang); /*TB项目/任务数据*/ // //项目名称 // map.put("textField_lp0m06bd", ""); // //任务名称 // map.put("textField_lp0m06be", ""); // //业务类型 // map.put("textField_los8y15z", ""); // //统一工时数(天) // map.put("numberField_los8y164", 0); /*钉钉考勤数据*/ //每月人天(应出勤天数) map.put("numberField_los8y16g", ycqtsAll); //请假天数 map.put("numberField_los8y16f", qjtsAll); //是否全投入 // map.put("selectField_los8y16e", "否"); /*计算字段*/ // //人月数据:统一工时数(天)/每月人天 // map.put("numberField_los8y16c", 0); // //SaaS合计:统一工时数(天)+请假成本(天) // map.put("numberField_los8y16h", 0); // //占比:SaaS合计/每月人天 // map.put("numberField_los8y16p", 0); String mapJson = JSON.toJSONString(map); System.out.println("mapJson:" + mapJson); //宜搭表单判断查询条件 //判断宜搭人员信息表是否有当前人员userid Map map1 = new HashMap(); //字段编号 map1.put("key", "textField_los8y15p"); //同步类型 map1.put("value", userId); // map1.put("value", "userId"); //控件类型 map1.put("type", "TEXT"); //逻辑判断符 map1.put("operator", "eq"); //控件名称 map1.put("componentName", "TextField"); Map map2 = new HashMap(); //字段编号 map2.put("key", "textField_losayxi8"); //同步类型 map2.put("value", lastMonthNow); //控件类型 map2.put("type", "TEXT"); //逻辑判断符 map2.put("operator", "eq"); //控件名称 map2.put("componentName", "TextField"); List list11 = new ArrayList(); list11.add(map1); list11.add(map2); String listJson = JSON.toJSONString(list11); System.out.println("查询条件listJson:" + listJson); //将汇总数据写入【宜搭汇总表】 JSONObject jsonObject; //新增或更新表单实例【宜搭】 try { com.aliyun.dingtalkyida_1_0.Client client11 = createClient(); com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders createOrUpdateFormDataHeaders = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders(); createOrUpdateFormDataHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken(); com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest createOrUpdateFormDataRequest = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest() //应用秘钥 .setSystemToken("J0A6698165EFMED0AHIG76FW7C6Q3ON1PG5OL482") //表单编码 .setFormUuid("FORM-BH766Y61W4CFWBS0869YFBF8COTE2QEHIH5OLM") .setUserId("yida_pub_account") .setSearchCondition(listJson) //应用编码 .setAppType("APP_QHPV3T4ZU2Y88Q4U0UDA") .setFormDataJson(mapJson); CreateOrUpdateFormDataResponse orUpdateFormDataWithOptions = client11.createOrUpdateFormDataWithOptions(createOrUpdateFormDataRequest, createOrUpdateFormDataHeaders, new RuntimeOptions()); String s = JSON.toJSONString(orUpdateFormDataWithOptions.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 属性,可帮助开发定位问题 } } /*同步至宜搭*/ } else { //获取该人员在TB中的实际工时信息 int code = 0; JSONArray result = null; 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://open.teambition.com/api/worktime/query?userId=" + TBuserId + "&pageSize=1000&pageToken=&startDate="+ startDate +"&endDate="+ endDate) .method("GET", null) .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken()) .addHeader("X-Tenant-Id", tbOrganizationId) .addHeader("X-Tenant-Type", "organization") .build(); Response response = client.newCall(request).execute(); String bodyStr = response.body().string(); JSONObject jsonObject = JSON.parseObject(bodyStr); // System.out.println("返回体body:" + jsonObject); code = jsonObject.getInteger("code"); System.out.println("TB获取人员实际工时接口返回状态码:" + code); result = jsonObject.getJSONArray("result"); // System.out.println("TB获取人员实际工时接口返回result:" + result); } catch (IOException e) { e.printStackTrace(); } if (!result.isEmpty()){ log.info("该人员实际工时不为空,将直接获取实际工时!"); for (int i1 = 0; i1 < result.size(); i1++) { //工时关联的task ID String objectId = result.getJSONObject(i1).getString("objectId"); System.out.println("工时关联的task ID:" + objectId); //任务工时所属日期 String rwgsssrq = result.getJSONObject(i1).getString("date"); System.out.println("任务工时所属日期:" + rwgsssrq); //拼接任务链接 // String renwuURL = "https://www.teambition.com/task/" + objectId; // System.out.println("拼接的任务url:" + renwuURL); //工时(毫秒:转换成天) long worktime = result.getJSONObject(i1).getLong("worktime"); System.out.println("实际工时(毫秒):" + worktime); double gongshi = (double) worktime / 3600000 / 8; BigDecimal gongshiTwo = new BigDecimal(gongshi); double gs = gongshiTwo.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); System.out.println("实际工时(毫秒转换成天):" + gs); //汇总工时 // BigDecimal gsDouble = new BigDecimal(gs); // gsAll = gsAll.add(gsDouble); //根据任务ID获取任务详情,解析得到任务标题和项目ID JSONArray renwuxiangqing = getRenwuxiangqing(objectId); JSONObject jsonObject = renwuxiangqing.getJSONObject(0); //是否放入回收站 String isArchived = jsonObject.getString("isArchived"); System.out.println("是否放入回收站:" + isArchived); String content = ""; String yewuleixing = ""; String tBxaingmuName = ""; String xiangmufenzuName = ""; String diedaiName = ""; String XXX = ""; if (renwuxiangqing == null){ log.info("该任务不存在!"); } else if (isArchived.equals("true")) { log.info("该任务已放入回收站,不统计!"); } else { log.info("该任务没有放入回收站,正常统计!"); //任务标题 content = jsonObject.getString("content"); System.out.println("任务标题:" + content); //获取迭代ID String diedaiID = null; try { diedaiID = jsonObject.getString("sprintId"); } catch (Exception e) { e.printStackTrace(); } System.out.println("迭代ID:" + diedaiID); // /*调用封装接口获取自定义字段【业务类型】选项值集合*/ // log.info("调用封装接口获取自定义字段【业务类型】选项值集合。"); // JSONArray tBzidingyiArray = getTBzidingyi(); for (int i11 = 0; i11 < tBzidingyi.size(); i11++) { JSONObject jsonObject1 = tBzidingyi.getJSONObject(i11); //自定义字段id String zidingyiID = jsonObject1.getString("id"); System.out.println("自定义字段【业务类型】id:" + zidingyiID); //自定义字段名称 String zidingyiName = jsonObject1.getString("value"); System.out.println("自定义字段【业务类型】名称:" + zidingyiName); //业务类型 JSONArray yewuleixingjsonArray = renwuxiangqing.getJSONObject(0).getJSONArray("customfields"); for (int j = 0; j < yewuleixingjsonArray.size(); j++) { JSONArray yewuleixingjsonArray1 = yewuleixingjsonArray.getJSONObject(j).getJSONArray("value"); if (yewuleixingjsonArray1.isEmpty()) { log.info("任务字段没有内容,跳过~"); } else { String ziduanName = yewuleixingjsonArray1.getJSONObject(0).getString("title"); System.out.println("任务中包含的字段内容:" + ziduanName); //判断当前循环到的字段内容是否属于自定义字段【业务类型】中的某个值,如果符合其中一个则取该值 if (ziduanName.equals(zidingyiName)) { yewuleixing = ziduanName; } } } } System.out.println("【匹配】业务类型:" + yewuleixing); //项目ID String projectId = jsonObject.getString("projectId"); System.out.println("项目ID:" + projectId); /*根据项目ID获取项目详情*/ log.info("根据TB项目ID获取项目名称==="); tBxaingmuName = getTBxaingmu(projectId); /*根据项目ID和任务中的迭代ID获取迭代名称*/ log.info("根据项目ID和任务中的迭代ID获取迭代名称==="); diedaiName = getDiedai(projectId, diedaiID); System.out.println("获取最终的迭代名称:" + diedaiName); if (yewuleixing.equals("")) { log.info("业务类型为空,去取该TB项目中属于IDX分组名称。"); /*根据项目ID获取项目分组ID*/ log.info("根据项目ID获取项目分组ID==="); String xiangmufenzuID = getXiangmufenzuID(projectId); System.out.println("项目分组ID:" + xiangmufenzuID); /*根据项目ID获取项目分组ID*/ log.info("根据项目分组ID获取项目分组名称==="); xiangmufenzuName = getXiangmufenzuName(xiangmufenzuID); System.out.println("项目分组名称:" + xiangmufenzuName); int flag = 0; //调用接口获取IDX分组下的目录名称,匹配逻辑下最终的业务类型名称 log.info("调用接口获取IDX分组下的目录名称==="); JSONArray IDXfenzu = getIDXfenzu(); for (int f = 0; f < IDXfenzu.size(); f++) { String fenzuId = IDXfenzu.getJSONObject(f).getString("id"); System.out.println("分组id:" + fenzuId); String fenzuName = IDXfenzu.getJSONObject(f).getString("name"); System.out.println("分组名称:" + fenzuName); if (flag == 0) { if (xiangmufenzuName.equals(fenzuName)) { log.info("匹配到IDX分组名称,去取该IDX分组下的目录名称。"); XXX = fenzuName; //添加标识,说明已经匹配到了 flag = flag + 1; } else { log.info("匹配不到IDX分组名称,继续匹配下一个IDX分组。"); } } } System.out.println("获取的IDX分组下的目录名称用作最终的【业务类型】:" + XXX); } // } /*同步钉钉数据*/ //应出勤天数 float yingchuqintianshu = 0; //请假天数 float qingjiatianshu = 0; //查询上月考勤数据,统计上月应出勤天数、请假天数 try { DingTalkClient client11 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/getcolumnval"); OapiAttendanceGetcolumnvalRequest req = new OapiAttendanceGetcolumnvalRequest(); //TODO 待查询人员的userid req.setUserid(userId); //考勤报表列定义查出来的工作时长的列id(固定) req.setColumnIdList("176150482,985267953"); //TODO 查询开始时间 req.setFromDate(StringUtils.parseDateTime(FORMtime)); //TODO 查询结束时间 req.setToDate(StringUtils.parseDateTime(TOtime)); OapiAttendanceGetcolumnvalResponse rsp = client11.execute(req, accessTokenService.getAccessToken()); // System.out.println(rsp.getBody()); String string = rsp.getBody(); JSONObject jsonObjectKaoqin = JSON.parseObject(string); int errcode = jsonObjectKaoqin.getInteger("errcode"); System.out.println("考勤时间周期查询结果状态码:" + errcode); String errmsg = jsonObjectKaoqin.getString("errmsg"); System.out.println("考勤时间周期查询结果状态信息:" + errmsg); if (errcode != 0) { log.info("考勤时间周期查询结果反馈异常,异常状态码:" + errcode + "【" + errmsg + "】"); } else { //应出勤天数 JSONArray jsonArray1 = jsonObjectKaoqin.getJSONObject("result"). getJSONArray("column_vals"). getJSONObject(0). getJSONArray("column_vals"); for (int x = 0; x < jsonArray1.size(); x++) { //应出勤天数 String value = jsonArray1.getJSONObject(x).getString("value"); System.out.println("应出勤天数:" + value); float v = Float.parseFloat(value); if (v == 1) { System.out.println("应出勤天数,进行循环统计!"); yingchuqintianshu = yingchuqintianshu + 1; } } //请假天数 JSONArray jsonArray = jsonObjectKaoqin.getJSONObject("result"). getJSONArray("column_vals"). getJSONObject(1). getJSONArray("column_vals"); for (int x = 0; x < jsonArray.size(); x++) { //请假天数 String value = jsonArray.getJSONObject(x).getString("value"); System.out.println("请假天数:" + value); float v = Float.parseFloat(value); if (v > 0) { System.out.println("请假天数,进行循环统计!"); qingjiatianshu = qingjiatianshu + v; } } } } catch (ApiException e) { e.printStackTrace(); } //应出勤天数 BigDecimal ycqts = new BigDecimal(yingchuqintianshu); BigDecimal ycqtsAll = ycqts.setScale(2, BigDecimal.ROUND_DOWN); System.out.println("应出勤天数(浮点数,保留2位小数):" + ycqtsAll); //请假天数 BigDecimal qjts = new BigDecimal(qingjiatianshu); BigDecimal qjtsAll = qjts.setScale(2, BigDecimal.ROUND_DOWN); System.out.println("请假天数(浮点数,保留2位小数):" + qjtsAll); /*同步至宜搭*/ Map map = new HashMap(); //实际统计月份 map.put("textField_losayxi8", lastMonthNow); //钉钉userid map.put("textField_los8y15p", userId); //姓名 map.put("textField_los8y15q", userName); //主部门 map.put("textField_los8y15s", zhubumen); //职位 map.put("textField_los8y15x", zhiwei); //邮箱 map.put("textField_los8y15y", youxiang); /*TB项目/任务数据*/ //项目名称 map.put("textField_lp0m06bd", tBxaingmuName); //任务名称 map.put("textField_lp0m06be", content); //任务ID map.put("textField_lp8ihks3", objectId); //迭代 map.put("textField_lpf88002", diedaiName); //任务工时所属日期 map.put("textField_lqn3tjjv", rwgsssrq); //工时类型(计划工时、实际工时) map.put("textField_lrq4uku2", "实际工时"); /** * 判断(同步月份、userid、任务id、任务工时所属日期)是否有该任务 * */ String panduan = getYida(lastMonthNow, userId, objectId, rwgsssrq, "实际工时"); if (panduan.equals("不存在")) { log.info("该人员在宜搭中该任务的工时【不存在】,写入【业务类型(初版结果)】!"); if (yewuleixing.equals("")) { //业务类型(修正改这列) map.put("textField_lp2aqls1", yewuleixing); //业务类型(统计用,勿动) map.put("textField_los8y15z", XXX); //TODO 后面如果需要在宜搭手动修改,要判断是否存在该数据,如果存在的话这个字段不做更新 //业务类型(初版结果,勿动) map.put("textField_lp2aqls2", XXX); } else { //业务类型(修正改这列) map.put("textField_lp2aqls1", yewuleixing); //业务类型(统计用,勿动) map.put("textField_los8y15z", yewuleixing); //TODO 后面如果需要在宜搭手动修改,要判断是否存在该数据,如果存在的话这个字段不做更新 //业务类型(初版结果,勿动) map.put("textField_lp2aqls2", yewuleixing); } }else { log.info("该人员在宜搭中该任务的工时【存在】,不更新写入【业务类型(初版结果)】!"); if (yewuleixing.equals("")) { //业务类型(修正改这列) map.put("textField_lp2aqls1", yewuleixing); //业务类型(统计用,勿动) map.put("textField_los8y15z", XXX); } else { //业务类型(修正改这列) map.put("textField_lp2aqls1", yewuleixing); //业务类型(统计用,勿动) map.put("textField_los8y15z", yewuleixing); } } //统一工时数(天) map.put("numberField_los8y164", gs); /*钉钉考勤数据*/ //每月人天(应出勤天数) map.put("numberField_los8y16g", ycqtsAll); //请假天数 map.put("numberField_los8y16f", qjtsAll); //是否全投入 // map.put("selectField_los8y16e", "否"); /*计算字段*/ //人月数据:统一工时数(天)/每月人天 //【废弃】 map.put("numberField_los8y16c", 0); //SaaS合计:统一工时数(天)+请假成本(天) map.put("numberField_los8y16h", gs); //占比:SaaS合计/每月人天 //【废弃】 map.put("numberField_los8y16p", 0); String mapJson = JSON.toJSONString(map); System.out.println("mapJson:" + mapJson); //宜搭表单判断查询条件 //判断宜搭人员信息表是否有当前人员userid Map map1 = new HashMap(); //字段编号 map1.put("key", "textField_los8y15p"); //同步类型 map1.put("value", userId); // map1.put("value", "userId"); //控件类型 map1.put("type", "TEXT"); //逻辑判断符 map1.put("operator", "eq"); //控件名称 map1.put("componentName", "TextField"); /** * 实际统计月份 * */ Map map2 = new HashMap(); //字段编号 map2.put("key", "textField_losayxi8"); //同步类型 map2.put("value", lastMonthNow); //控件类型 map2.put("type", "TEXT"); //逻辑判断符 map2.put("operator", "eq"); //控件名称 map2.put("componentName", "TextField"); /** * 任务id * */ Map map3 = new HashMap(); //字段编号 map3.put("key", "textField_lp8ihks3"); //同步类型 map3.put("value", objectId); //控件类型 map3.put("type", "TEXT"); //逻辑判断符 map3.put("operator", "eq"); //控件名称 map3.put("componentName", "TextField"); /** * 任务工时所属日期 * */ Map map4 = new HashMap(); //字段编号 map4.put("key", "textField_lqn3tjjv"); //同步类型 map4.put("value", rwgsssrq); //控件类型 map4.put("type", "TEXT"); //逻辑判断符 map4.put("operator", "eq"); //控件名称 map4.put("componentName", "TextField"); /** * 工时类型(计划工时、实际工时) * */ Map map5 = new HashMap(); //字段编号 map5.put("key", "textField_lrq4uku2"); //同步类型 map5.put("value", "实际工时"); //控件类型 map5.put("type", "TEXT"); //逻辑判断符 map5.put("operator", "eq"); //控件名称 map5.put("componentName", "TextField"); List list11 = new ArrayList(); list11.add(map1); list11.add(map2); list11.add(map3); list11.add(map4); list11.add(map5); String listJson = JSON.toJSONString(list11); System.out.println("查询条件listJson:" + listJson); //将汇总数据写入【宜搭汇总表】 JSONObject jsonObject1; //新增或更新表单实例【宜搭】 try { com.aliyun.dingtalkyida_1_0.Client client11 = createClient(); com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders createOrUpdateFormDataHeaders = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders(); createOrUpdateFormDataHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken(); com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest createOrUpdateFormDataRequest = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest() //应用秘钥 .setSystemToken("J0A6698165EFMED0AHIG76FW7C6Q3ON1PG5OL482") //表单编码 .setFormUuid("FORM-BH766Y61W4CFWBS0869YFBF8COTE2QEHIH5OLM") .setUserId("yida_pub_account") .setSearchCondition(listJson) //应用编码 .setAppType("APP_QHPV3T4ZU2Y88Q4U0UDA") .setFormDataJson(mapJson); CreateOrUpdateFormDataResponse orUpdateFormDataWithOptions = client11.createOrUpdateFormDataWithOptions(createOrUpdateFormDataRequest, createOrUpdateFormDataHeaders, new RuntimeOptions()); String s = JSON.toJSONString(orUpdateFormDataWithOptions.getBody()); jsonObject1 = JSON.parseObject(s); // System.out.println("【创建或更新】表单object对象:" + jsonObject1); } 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 属性,可帮助开发定位问题 } } /*同步至宜搭*/ } } } // else if (result.isEmpty()){ // log.info("该人员实际工时为空,将获取计划工时!"); log.info("###########################该人员实际工时循环结束,开始调用该人员名下的计划工时,并进行循环判断是否存在该任务的实际工时,如果存在则跳过,不存在则将该任务的计划工时写入###########################"); //获取该人员在TB中的计划工时信息 int code1 = 0; JSONArray result1 = null; 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://open.teambition.com/api/plantime/query?userId=" + TBuserId + "&pageSize=1000&pageToken=&startDate="+ startDate +"&endDate="+ endDate) .method("GET", null) .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken()) .addHeader("X-Tenant-Id", tbOrganizationId) .addHeader("X-Tenant-Type", "organization") .build(); Response response = client.newCall(request).execute(); String bodyStr = response.body().string(); JSONObject jsonObject = JSON.parseObject(bodyStr); // System.out.println("返回体body:" + jsonObject); code1 = jsonObject.getInteger("code"); System.out.println("TB获取人员计划工时接口返回状态码:" + code1); result1 = jsonObject.getJSONArray("result"); System.out.println("TB获取人员计划工时接口返回result:" + result1); } catch (IOException e) { e.printStackTrace(); } if (!result1.isEmpty()) { log.info("匹配该人员获取到的计划工时,是否已经同步宜搭,如果同步则更新,如果没有将会新增写入!"); for (int i1 = 0; i1 < result1.size(); i1++) { //工时关联的task ID String objectId = result1.getJSONObject(i1).getString("objectId"); System.out.println("工时关联的task ID:" + objectId); //任务工时所属日期 String rwgsssrq = result1.getJSONObject(i1).getString("date"); System.out.println("任务工时所属日期:" + rwgsssrq); /** * 判断(同步月份、userid、任务id、任务工时所属日期、工时类型)实际工时是否有该任务该日期的工时 * */ String panduan = getYida(lastMonthNow, userId, objectId, rwgsssrq, "判断实际工时是否存在"); if (panduan.equals("不存在")) { log.info("该人员在宜搭中该任务的实际工时不存在,即:该任务没有实际工时,将新增写入该任务的计划工时!"); //工时(毫秒:转换成天) long plantime = result1.getJSONObject(i1).getLong("plantime"); System.out.println("计划工时(毫秒):" + plantime); double gongshi = (double) plantime / 3600000 / 8; BigDecimal gongshiTwo = new BigDecimal(gongshi); double gs = gongshiTwo.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); System.out.println("计划工时(毫秒转换成天):" + gs); //汇总工时 // BigDecimal gsDouble = new BigDecimal(gs); // gsAll = gsAll.add(gsDouble); //根据任务ID获取任务详情,解析得到任务标题和项目ID JSONArray renwuxiangqing = getRenwuxiangqing(objectId); JSONObject jsonObject = renwuxiangqing.getJSONObject(0); //是否放入回收站 String isArchived = jsonObject.getString("isArchived"); System.out.println("是否放入回收站:" + isArchived); String content = ""; String yewuleixing = ""; String tBxaingmuName = ""; String xiangmufenzuName = ""; String diedaiName = ""; String XXX = ""; if (renwuxiangqing == null) { log.info("该任务不存在!"); } else if (isArchived.equals("true")) { log.info("该任务已放入回收站,不统计!"); } else { log.info("该任务没有放入回收站,正常统计!"); //任务标题 content = jsonObject.getString("content"); System.out.println("任务标题:" + content); //获取迭代ID String diedaiID = null; try { diedaiID = jsonObject.getString("sprintId"); } catch (Exception e) { e.printStackTrace(); } System.out.println("迭代ID:" + diedaiID); // /*调用封装接口获取自定义字段【业务类型】选项值集合*/ // log.info("调用封装接口获取自定义字段【业务类型】选项值集合。"); // JSONArray tBzidingyiArray = getTBzidingyi(); for (int i11 = 0; i11 < tBzidingyi.size(); i11++) { JSONObject jsonObject1 = tBzidingyi.getJSONObject(i11); //自定义字段id String zidingyiID = jsonObject1.getString("id"); System.out.println("自定义字段【业务类型】id:" + zidingyiID); //自定义字段名称 String zidingyiName = jsonObject1.getString("value"); System.out.println("自定义字段【业务类型】名称:" + zidingyiName); //业务类型 JSONArray yewuleixingjsonArray = renwuxiangqing.getJSONObject(0).getJSONArray("customfields"); for (int j = 0; j < yewuleixingjsonArray.size(); j++) { JSONArray yewuleixingjsonArray1 = yewuleixingjsonArray.getJSONObject(j).getJSONArray("value"); if (yewuleixingjsonArray1.isEmpty()) { log.info("任务中的字段没有内容,跳过~"); } else { String ziduanName = yewuleixingjsonArray1.getJSONObject(0).getString("title"); System.out.println("任务中包含的字段内容:" + ziduanName); //判断当前循环到的字段内容是否属于自定义字段【业务类型】中的某个值,如果符合其中一个则取该值 if (ziduanName.equals(zidingyiName)) { yewuleixing = ziduanName; } } } } System.out.println("【匹配】业务类型:" + yewuleixing); //项目ID String projectId = jsonObject.getString("projectId"); System.out.println("项目ID:" + projectId); /*根据项目ID获取项目详情*/ log.info("根据TB项目ID获取项目名称==="); tBxaingmuName = getTBxaingmu(projectId); /*根据项目ID和任务中的迭代ID获取迭代名称*/ log.info("根据项目ID和任务中的迭代ID获取迭代名称==="); diedaiName = getDiedai(projectId, diedaiID); System.out.println("获取最终的迭代名称:" + diedaiName); if (yewuleixing.equals("")) { log.info("业务类型为空,去取该TB项目中属于IDX分组名称。"); /*根据项目ID获取项目分组ID*/ log.info("根据项目ID获取项目分组ID==="); String xiangmufenzuID = getXiangmufenzuID(projectId); System.out.println("项目分组ID:" + xiangmufenzuID); /*根据项目分组ID获取项目分组名称*/ log.info("根据项目分组ID获取项目分组名称==="); xiangmufenzuName = getXiangmufenzuName(xiangmufenzuID); System.out.println("项目分组名称:" + xiangmufenzuName); // //调用接口获取IDX分组下的目录名称,匹配逻辑下最终的业务类型名称 // log.info("调用接口获取IDX分组下的目录名称==="); // JSONArray IDXfenzu = getIDXfenzu(); // for (int f = 0; f < IDXfenzu.size(); f++) { // String fenzuId = IDXfenzu.getJSONObject(f).getString("id"); // System.out.println("分组id:" + fenzuId); // String fenzuName = IDXfenzu.getJSONObject(f).getString("name"); // System.out.println("分组名称:" + fenzuName); // // if (xiangmufenzuName.equals(fenzuName)){ // log.info("匹配到IDX分组名称,去取该IDX分组下的目录名称。"); // }else { // xiangmufenzuName = ""; // } // } int flag = 0; //调用接口获取IDX分组下的目录名称,匹配逻辑下最终的业务类型名称 log.info("调用接口获取IDX分组下的目录名称==="); JSONArray IDXfenzu = getIDXfenzu(); for (int f = 0; f < IDXfenzu.size(); f++) { String fenzuId = IDXfenzu.getJSONObject(f).getString("id"); System.out.println("分组id:" + fenzuId); String fenzuName = IDXfenzu.getJSONObject(f).getString("name"); System.out.println("分组名称:" + fenzuName); if (flag == 0) { if (xiangmufenzuName.equals(fenzuName)) { log.info("匹配到IDX分组名称,去取该IDX分组下的目录名称。"); XXX = fenzuName; //添加标识,说明已经匹配到了 flag = flag + 1; } else { log.info("匹配不到IDX分组名称,继续匹配下一个IDX分组。"); } } } System.out.println("获取的IDX分组下的目录名称用作最终的【业务类型】:" + XXX); } // } /*同步钉钉数据*/ //应出勤天数 float yingchuqintianshu = 0; //请假天数 float qingjiatianshu = 0; //查询上月考勤数据,统计上月应出勤天数、请假天数 try { DingTalkClient client11 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/getcolumnval"); OapiAttendanceGetcolumnvalRequest req = new OapiAttendanceGetcolumnvalRequest(); //TODO 待查询人员的userid req.setUserid(userId); //考勤报表列定义查出来的工作时长的列id(固定) req.setColumnIdList("176150482,985267953"); //TODO 查询开始时间 req.setFromDate(StringUtils.parseDateTime(FORMtime)); //TODO 查询结束时间 req.setToDate(StringUtils.parseDateTime(TOtime)); OapiAttendanceGetcolumnvalResponse rsp = client11.execute(req, accessTokenService.getAccessToken()); // System.out.println(rsp.getBody()); String string = rsp.getBody(); JSONObject jsonObjectKaoqin = JSON.parseObject(string); int errcode = jsonObjectKaoqin.getInteger("errcode"); System.out.println("考勤时间周期查询结果状态码:" + errcode); String errmsg = jsonObjectKaoqin.getString("errmsg"); System.out.println("考勤时间周期查询结果状态信息:" + errmsg); if (errcode != 0) { log.info("考勤时间周期查询结果反馈异常,异常状态码:" + errcode + "【" + errmsg + "】"); } else { //应出勤天数 JSONArray jsonArray1 = jsonObjectKaoqin.getJSONObject("result"). getJSONArray("column_vals"). getJSONObject(0). getJSONArray("column_vals"); for (int x = 0; x < jsonArray1.size(); x++) { //应出勤天数 String value = jsonArray1.getJSONObject(x).getString("value"); System.out.println("应出勤天数:" + value); float v = Float.parseFloat(value); if (v == 1) { System.out.println("应出勤天数,进行循环统计!"); yingchuqintianshu = yingchuqintianshu + 1; } } //请假天数 JSONArray jsonArray = jsonObjectKaoqin.getJSONObject("result"). getJSONArray("column_vals"). getJSONObject(1). getJSONArray("column_vals"); for (int x = 0; x < jsonArray.size(); x++) { //请假天数 String value = jsonArray.getJSONObject(x).getString("value"); System.out.println("请假天数:" + value); float v = Float.parseFloat(value); if (v > 0) { System.out.println("请假天数,进行循环统计!"); qingjiatianshu = qingjiatianshu + v; } } } } catch (ApiException e) { e.printStackTrace(); } //应出勤天数 BigDecimal ycqts = new BigDecimal(yingchuqintianshu); BigDecimal ycqtsAll = ycqts.setScale(2, BigDecimal.ROUND_DOWN); System.out.println("应出勤天数(浮点数,保留2位小数):" + ycqtsAll); //请假天数 BigDecimal qjts = new BigDecimal(qingjiatianshu); BigDecimal qjtsAll = qjts.setScale(2, BigDecimal.ROUND_DOWN); System.out.println("请假天数(浮点数,保留2位小数):" + qjtsAll); /*同步至宜搭*/ Map map = new HashMap(); //实际统计月份 map.put("textField_losayxi8", lastMonthNow); //钉钉userid map.put("textField_los8y15p", userId); //姓名 map.put("textField_los8y15q", userName); //主部门 map.put("textField_los8y15s", zhubumen); //职位 map.put("textField_los8y15x", zhiwei); //邮箱 map.put("textField_los8y15y", youxiang); /*TB项目/任务数据*/ //项目名称 map.put("textField_lp0m06bd", tBxaingmuName); //任务名称 map.put("textField_lp0m06be", content); //任务ID map.put("textField_lp8ihks3", objectId); //迭代 map.put("textField_lpf88002", diedaiName); //任务工时所属日期 map.put("textField_lqn3tjjv", rwgsssrq); //工时类型(计划工时、实际工时) map.put("textField_lrq4uku2", "计划工时"); // if (yewuleixing.equals("")) { // //业务类型(修正改这列) // map.put("textField_lp2aqls1", yewuleixing); // //业务类型(统计用,勿动) // map.put("textField_los8y15z", XXX); // // //TODO 后面如果需要在宜搭手动修改,要判断是否存在该数据,如果存在的话这个字段不做更新 // //业务类型(原数据,勿动) // map.put("textField_lp2aqls2", XXX); // } else { // //业务类型(修正改这列) // map.put("textField_lp2aqls1", yewuleixing); // //业务类型(统计用,勿动) // map.put("textField_los8y15z", yewuleixing); // // //TODO 后面如果需要在宜搭手动修改,要判断是否存在该数据,如果存在的话这个字段不做更新 // //业务类型(原数据,勿动) // map.put("textField_lp2aqls2", yewuleixing); // } /** * 判断同步月份、userid、任务id、任务工时所属日期,是否有该任务 * */ // String panduan = getYida(lastMonthNow, userId, objectId, rwgsssrq); if (panduan.equals("不存在")) { log.info("该人员在宜搭中该任务的工时【不存在】,写入【业务类型(初版结果)】!"); if (yewuleixing.equals("")) { //业务类型(修正改这列) map.put("textField_lp2aqls1", yewuleixing); //业务类型(统计用,勿动) map.put("textField_los8y15z", XXX); //TODO 后面如果需要在宜搭手动修改,要判断是否存在该数据,如果存在的话这个字段不做更新 //业务类型(初版结果,勿动) map.put("textField_lp2aqls2", XXX); } else { //业务类型(修正改这列) map.put("textField_lp2aqls1", yewuleixing); //业务类型(统计用,勿动) map.put("textField_los8y15z", yewuleixing); //TODO 后面如果需要在宜搭手动修改,要判断是否存在该数据,如果存在的话这个字段不做更新 //业务类型(初版结果,勿动) map.put("textField_lp2aqls2", yewuleixing); } }else { log.info("该人员在宜搭中该任务的工时【存在】,不更新写入【业务类型(初版结果)】!"); if (yewuleixing.equals("")) { //业务类型(修正改这列) map.put("textField_lp2aqls1", yewuleixing); //业务类型(统计用,勿动) map.put("textField_los8y15z", XXX); } else { //业务类型(修正改这列) map.put("textField_lp2aqls1", yewuleixing); //业务类型(统计用,勿动) map.put("textField_los8y15z", yewuleixing); } } //统一工时数(天) map.put("numberField_los8y164", gs); /*钉钉考勤数据*/ //每月人天(应出勤天数) map.put("numberField_los8y16g", ycqtsAll); //请假天数 map.put("numberField_los8y16f", qjtsAll); //是否全投入 // map.put("selectField_los8y16e", "否"); /*计算字段*/ //人月数据:统一工时数(天)/每月人天 //【废弃】 map.put("numberField_los8y16c", 0); //SaaS合计:统一工时数(天)+请假成本(天) map.put("numberField_los8y16h", gs); //占比:SaaS合计/每月人天 //【废弃】 map.put("numberField_los8y16p", 0); String mapJson = JSON.toJSONString(map); System.out.println("mapJson:" + mapJson); //宜搭表单判断查询条件 //判断宜搭人员信息表是否有当前人员userid Map map1 = new HashMap(); //字段编号 map1.put("key", "textField_los8y15p"); //同步类型 map1.put("value", userId); // map1.put("value", "userId"); //控件类型 map1.put("type", "TEXT"); //逻辑判断符 map1.put("operator", "eq"); //控件名称 map1.put("componentName", "TextField"); //同步数据的所属日期 Map map2 = new HashMap(); //字段编号 map2.put("key", "textField_losayxi8"); //同步类型 map2.put("value", lastMonthNow); //控件类型 map2.put("type", "TEXT"); //逻辑判断符 map2.put("operator", "eq"); //控件名称 map2.put("componentName", "TextField"); //任务id Map map3 = new HashMap(); //字段编号 map3.put("key", "textField_lp8ihks3"); //同步类型 map3.put("value", objectId); //控件类型 map3.put("type", "TEXT"); //逻辑判断符 map3.put("operator", "eq"); //控件名称 map3.put("componentName", "TextField"); //任务工时所属日期 Map map4 = new HashMap(); //字段编号 map4.put("key", "textField_lqn3tjjv"); //同步类型 map4.put("value", rwgsssrq); //控件类型 map4.put("type", "TEXT"); //逻辑判断符 map4.put("operator", "eq"); //控件名称 map4.put("componentName", "TextField"); /** * 工时类型(计划工时、实际工时) * */ Map map5 = new HashMap(); //字段编号 map5.put("key", "textField_lrq4uku2"); //同步类型 map5.put("value", "计划工时"); //控件类型 map5.put("type", "TEXT"); //逻辑判断符 map5.put("operator", "eq"); //控件名称 map5.put("componentName", "TextField"); List list11 = new ArrayList(); list11.add(map1); list11.add(map2); list11.add(map3); list11.add(map4); list11.add(map5); String listJson = JSON.toJSONString(list11); System.out.println("查询条件listJson:" + listJson); //将汇总数据写入【宜搭汇总表】 JSONObject jsonObject1; //新增或更新表单实例【宜搭】 try { com.aliyun.dingtalkyida_1_0.Client client11 = createClient(); com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders createOrUpdateFormDataHeaders = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders(); createOrUpdateFormDataHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken(); com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest createOrUpdateFormDataRequest = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest() //应用秘钥 .setSystemToken("J0A6698165EFMED0AHIG76FW7C6Q3ON1PG5OL482") //表单编码 .setFormUuid("FORM-BH766Y61W4CFWBS0869YFBF8COTE2QEHIH5OLM") .setUserId("yida_pub_account") .setSearchCondition(listJson) //应用编码 .setAppType("APP_QHPV3T4ZU2Y88Q4U0UDA") .setFormDataJson(mapJson); CreateOrUpdateFormDataResponse orUpdateFormDataWithOptions = client11.createOrUpdateFormDataWithOptions(createOrUpdateFormDataRequest, createOrUpdateFormDataHeaders, new RuntimeOptions()); String s = JSON.toJSONString(orUpdateFormDataWithOptions.getBody()); jsonObject1 = JSON.parseObject(s); System.out.println("【创建或更新】表单object对象:" + jsonObject1); } 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 属性,可帮助开发定位问题 } } /*同步至宜搭*/ } }else { System.out.println("该任务该日期的工时已存在!!!"); log.info("该人员在宜搭中该任务该日期的工时已存在,跳过!"); // //工时(毫秒:转换成天) // long plantime = result1.getJSONObject(i1).getLong("plantime"); // System.out.println("计划工时(毫秒):" + plantime); // double gongshi = (double) plantime / 3600000 / 8; // BigDecimal gongshiTwo = new BigDecimal(gongshi); // double gs = gongshiTwo.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); // System.out.println("计划工时(毫秒转换成天):" + gs); // //汇总工时 //// BigDecimal gsDouble = new BigDecimal(gs); //// gsAll = gsAll.add(gsDouble); // // //根据任务ID获取任务详情,解析得到任务标题和项目ID // JSONArray renwuxiangqing = getRenwuxiangqing(objectId); // // JSONObject jsonObject = renwuxiangqing.getJSONObject(0); // // //是否放入回收站 // String isArchived = jsonObject.getString("isArchived"); // System.out.println("是否放入回收站:" + isArchived); // // String content = ""; // String yewuleixing = ""; // String tBxaingmuName = ""; // String xiangmufenzuName = ""; // String diedaiName = ""; // // String XXX = ""; // // if (renwuxiangqing == null) { // log.info("该任务不存在!"); // } else if (isArchived.equals("true")) { // log.info("该任务已放入回收站,不统计!"); // } else { // log.info("该任务没有放入回收站,正常统计!"); // // //任务标题 // content = jsonObject.getString("content"); // System.out.println("任务标题:" + content); // // //获取迭代ID // String diedaiID = null; // try { // diedaiID = jsonObject.getString("sprintId"); // } catch (Exception e) { // e.printStackTrace(); // } // System.out.println("迭代ID:" + diedaiID); // // //// /*调用封装接口获取自定义字段【业务类型】选项值集合*/ //// log.info("调用封装接口获取自定义字段【业务类型】选项值集合。"); //// JSONArray tBzidingyiArray = getTBzidingyi(); // for (int i11 = 0; i11 < tBzidingyi.size(); i11++) { // JSONObject jsonObject1 = tBzidingyi.getJSONObject(i11); // //自定义字段id // String zidingyiID = jsonObject1.getString("id"); // System.out.println("自定义字段【业务类型】id:" + zidingyiID); // //自定义字段名称 // String zidingyiName = jsonObject1.getString("value"); // System.out.println("自定义字段【业务类型】名称:" + zidingyiName); // // //业务类型 // JSONArray yewuleixingjsonArray = renwuxiangqing.getJSONObject(0).getJSONArray("customfields"); // for (int j = 0; j < yewuleixingjsonArray.size(); j++) { // JSONArray yewuleixingjsonArray1 = yewuleixingjsonArray.getJSONObject(j).getJSONArray("value"); // if (yewuleixingjsonArray1.isEmpty()) { // log.info("任务中的字段没有内容,跳过~"); // } else { // String ziduanName = yewuleixingjsonArray1.getJSONObject(0).getString("title"); // System.out.println("任务中包含的字段内容:" + ziduanName); // //判断当前循环到的字段内容是否属于自定义字段【业务类型】中的某个值,如果符合其中一个则取该值 // if (ziduanName.equals(zidingyiName)) { // yewuleixing = ziduanName; // } // } // } // } // System.out.println("【匹配】业务类型:" + yewuleixing); // // //项目ID // String projectId = jsonObject.getString("projectId"); // System.out.println("项目ID:" + projectId); // /*根据项目ID获取项目详情*/ // log.info("根据TB项目ID获取项目名称==="); // tBxaingmuName = getTBxaingmu(projectId); // // /*根据项目ID和任务中的迭代ID获取迭代名称*/ // log.info("根据项目ID和任务中的迭代ID获取迭代名称==="); // diedaiName = getDiedai(projectId, diedaiID); // System.out.println("获取最终的迭代名称:" + diedaiName); // // // if (yewuleixing.equals("")) { // log.info("业务类型为空,去取该TB项目中属于IDX分组名称。"); // // /*根据项目ID获取项目分组ID*/ // log.info("根据项目ID获取项目分组ID==="); // String xiangmufenzuID = getXiangmufenzuID(projectId); // System.out.println("项目分组ID:" + xiangmufenzuID); // /*根据项目分组ID获取项目分组名称*/ // log.info("根据项目分组ID获取项目分组名称==="); // xiangmufenzuName = getXiangmufenzuName(xiangmufenzuID); // System.out.println("项目分组名称:" + xiangmufenzuName); // //// //调用接口获取IDX分组下的目录名称,匹配逻辑下最终的业务类型名称 //// log.info("调用接口获取IDX分组下的目录名称==="); //// JSONArray IDXfenzu = getIDXfenzu(); //// for (int f = 0; f < IDXfenzu.size(); f++) { //// String fenzuId = IDXfenzu.getJSONObject(f).getString("id"); //// System.out.println("分组id:" + fenzuId); //// String fenzuName = IDXfenzu.getJSONObject(f).getString("name"); //// System.out.println("分组名称:" + fenzuName); //// //// if (xiangmufenzuName.equals(fenzuName)){ //// log.info("匹配到IDX分组名称,去取该IDX分组下的目录名称。"); //// }else { //// xiangmufenzuName = ""; //// } //// } // // int flag = 0; // //调用接口获取IDX分组下的目录名称,匹配逻辑下最终的业务类型名称 // log.info("调用接口获取IDX分组下的目录名称==="); // JSONArray IDXfenzu = getIDXfenzu(); // for (int f = 0; f < IDXfenzu.size(); f++) { // String fenzuId = IDXfenzu.getJSONObject(f).getString("id"); // System.out.println("分组id:" + fenzuId); // String fenzuName = IDXfenzu.getJSONObject(f).getString("name"); // System.out.println("分组名称:" + fenzuName); // // if (flag == 0) { // if (xiangmufenzuName.equals(fenzuName)) { // log.info("匹配到IDX分组名称,去取该IDX分组下的目录名称。"); // XXX = fenzuName; // //添加标识,说明已经匹配到了 // flag = flag + 1; // } else { // log.info("匹配不到IDX分组名称,继续匹配下一个IDX分组。"); // } // } // } // System.out.println("获取的IDX分组下的目录名称用作最终的【业务类型】:" + XXX); // } //// } // // // // // /*同步钉钉数据*/ // //应出勤天数 // float yingchuqintianshu = 0; // //请假天数 // float qingjiatianshu = 0; // // //查询上月考勤数据,统计上月应出勤天数、请假天数 // try { // DingTalkClient client11 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/getcolumnval"); // OapiAttendanceGetcolumnvalRequest req = new OapiAttendanceGetcolumnvalRequest(); // //TODO 待查询人员的userid // req.setUserid(userId); // //考勤报表列定义查出来的工作时长的列id(固定) // req.setColumnIdList("176150482,985267953"); // //TODO 查询开始时间 // req.setFromDate(StringUtils.parseDateTime(FORMtime)); // //TODO 查询结束时间 // req.setToDate(StringUtils.parseDateTime(TOtime)); // OapiAttendanceGetcolumnvalResponse rsp = client11.execute(req, accessTokenService.getAccessToken()); //// System.out.println(rsp.getBody()); // String string = rsp.getBody(); // JSONObject jsonObjectKaoqin = JSON.parseObject(string); // // int errcode = jsonObjectKaoqin.getInteger("errcode"); // System.out.println("考勤时间周期查询结果状态码:" + errcode); // String errmsg = jsonObjectKaoqin.getString("errmsg"); // System.out.println("考勤时间周期查询结果状态信息:" + errmsg); // // // if (errcode != 0) { // log.info("考勤时间周期查询结果反馈异常,异常状态码:" + errcode + "【" + errmsg + "】"); // // } else { // //应出勤天数 // JSONArray jsonArray1 = jsonObjectKaoqin.getJSONObject("result"). // getJSONArray("column_vals"). // getJSONObject(0). // getJSONArray("column_vals"); // for (int x = 0; x < jsonArray1.size(); x++) { // //应出勤天数 // String value = jsonArray1.getJSONObject(x).getString("value"); // System.out.println("应出勤天数:" + value); // float v = Float.parseFloat(value); // if (v == 1) { // System.out.println("应出勤天数,进行循环统计!"); // yingchuqintianshu = yingchuqintianshu + 1; // } // } // // //请假天数 // JSONArray jsonArray = jsonObjectKaoqin.getJSONObject("result"). // getJSONArray("column_vals"). // getJSONObject(1). // getJSONArray("column_vals"); // for (int x = 0; x < jsonArray.size(); x++) { // //请假天数 // String value = jsonArray.getJSONObject(x).getString("value"); // System.out.println("请假天数:" + value); // float v = Float.parseFloat(value); // if (v > 0) { // System.out.println("请假天数,进行循环统计!"); // qingjiatianshu = qingjiatianshu + v; // } // } // } // // } catch (ApiException e) { // e.printStackTrace(); // } // // //应出勤天数 // BigDecimal ycqts = new BigDecimal(yingchuqintianshu); // BigDecimal ycqtsAll = ycqts.setScale(2, BigDecimal.ROUND_DOWN); // System.out.println("应出勤天数(浮点数,保留2位小数):" + ycqtsAll); // //请假天数 // BigDecimal qjts = new BigDecimal(qingjiatianshu); // BigDecimal qjtsAll = qjts.setScale(2, BigDecimal.ROUND_DOWN); // System.out.println("请假天数(浮点数,保留2位小数):" + qjtsAll); // // // /*同步至宜搭*/ // Map map = new HashMap(); // //实际统计月份 // map.put("textField_losayxi8", lastMonthNow); // // //钉钉userid // map.put("textField_los8y15p", userId); // //姓名 // map.put("textField_los8y15q", userName); // //主部门 // map.put("textField_los8y15s", zhubumen); // //职位 // map.put("textField_los8y15x", zhiwei); // //邮箱 // map.put("textField_los8y15y", youxiang); // // /*TB项目/任务数据*/ // //项目名称 // map.put("textField_lp0m06bd", tBxaingmuName); // //任务名称 // map.put("textField_lp0m06be", content); // //任务ID // map.put("textField_lp8ihks3", objectId); // //迭代 // map.put("textField_lpf88002", diedaiName); // // //任务工时所属日期 // map.put("textField_lqn3tjjv", rwgsssrq); // // //工时类型(计划工时、实际工时) // map.put("textField_lrq4uku2", "计划工时"); // //// if (yewuleixing.equals("")) { //// //业务类型(修正改这列) //// map.put("textField_lp2aqls1", yewuleixing); //// //业务类型(统计用,勿动) //// map.put("textField_los8y15z", XXX); //// //// //TODO 后面如果需要在宜搭手动修改,要判断是否存在该数据,如果存在的话这个字段不做更新 //// //业务类型(原数据,勿动) //// map.put("textField_lp2aqls2", XXX); //// } else { //// //业务类型(修正改这列) //// map.put("textField_lp2aqls1", yewuleixing); //// //业务类型(统计用,勿动) //// map.put("textField_los8y15z", yewuleixing); //// //// //TODO 后面如果需要在宜搭手动修改,要判断是否存在该数据,如果存在的话这个字段不做更新 //// //业务类型(原数据,勿动) //// map.put("textField_lp2aqls2", yewuleixing); //// } // // /** // * 判断同步月份、userid、任务id、任务工时所属日期,是否有该任务 // * */ //// String panduan = getYida(lastMonthNow, userId, objectId, rwgsssrq); // if (panduan.equals("不存在")) { // log.info("该人员在宜搭中该任务的工时【不存在】,写入【业务类型(初版结果)】!"); // // if (yewuleixing.equals("")) { // //业务类型(修正改这列) // map.put("textField_lp2aqls1", yewuleixing); // //业务类型(统计用,勿动) // map.put("textField_los8y15z", XXX); // // //TODO 后面如果需要在宜搭手动修改,要判断是否存在该数据,如果存在的话这个字段不做更新 // //业务类型(初版结果,勿动) // map.put("textField_lp2aqls2", XXX); // } else { // //业务类型(修正改这列) // map.put("textField_lp2aqls1", yewuleixing); // //业务类型(统计用,勿动) // map.put("textField_los8y15z", yewuleixing); // // //TODO 后面如果需要在宜搭手动修改,要判断是否存在该数据,如果存在的话这个字段不做更新 // //业务类型(初版结果,勿动) // map.put("textField_lp2aqls2", yewuleixing); // } // }else { // log.info("该人员在宜搭中该任务的工时【存在】,不更新写入【业务类型(初版结果)】!"); // // if (yewuleixing.equals("")) { // //业务类型(修正改这列) // map.put("textField_lp2aqls1", yewuleixing); // //业务类型(统计用,勿动) // map.put("textField_los8y15z", XXX); // } else { // //业务类型(修正改这列) // map.put("textField_lp2aqls1", yewuleixing); // //业务类型(统计用,勿动) // map.put("textField_los8y15z", yewuleixing); // } // } // // //统一工时数(天) // map.put("numberField_los8y164", gs); // // /*钉钉考勤数据*/ // //每月人天(应出勤天数) // map.put("numberField_los8y16g", ycqtsAll); // //请假天数 // map.put("numberField_los8y16f", qjtsAll); // //是否全投入 //// map.put("selectField_los8y16e", "否"); // // /*计算字段*/ // //人月数据:统一工时数(天)/每月人天 //【废弃】 // map.put("numberField_los8y16c", 0); // //SaaS合计:统一工时数(天)+请假成本(天) // map.put("numberField_los8y16h", gs); // //占比:SaaS合计/每月人天 //【废弃】 // map.put("numberField_los8y16p", 0); // // String mapJson = JSON.toJSONString(map); // System.out.println("mapJson:" + mapJson); // // //宜搭表单判断查询条件 // //判断宜搭人员信息表是否有当前人员userid // Map map1 = new HashMap(); // //字段编号 // map1.put("key", "textField_los8y15p"); // //同步类型 // map1.put("value", userId); //// map1.put("value", "userId"); // //控件类型 // map1.put("type", "TEXT"); // //逻辑判断符 // map1.put("operator", "eq"); // //控件名称 // map1.put("componentName", "TextField"); // // //同步数据的所属日期 // Map map2 = new HashMap(); // //字段编号 // map2.put("key", "textField_losayxi8"); // //同步类型 // map2.put("value", lastMonthNow); // //控件类型 // map2.put("type", "TEXT"); // //逻辑判断符 // map2.put("operator", "eq"); // //控件名称 // map2.put("componentName", "TextField"); // // //任务id // Map map3 = new HashMap(); // //字段编号 // map3.put("key", "textField_lp8ihks3"); // //同步类型 // map3.put("value", objectId); // //控件类型 // map3.put("type", "TEXT"); // //逻辑判断符 // map3.put("operator", "eq"); // //控件名称 // map3.put("componentName", "TextField"); // // //任务工时所属日期 // Map map4 = new HashMap(); // //字段编号 // map4.put("key", "textField_lqn3tjjv"); // //同步类型 // map4.put("value", rwgsssrq); // //控件类型 // map4.put("type", "TEXT"); // //逻辑判断符 // map4.put("operator", "eq"); // //控件名称 // map4.put("componentName", "TextField"); // // /** // * 工时类型(计划工时、实际工时) // * */ // Map map5 = new HashMap(); // //字段编号 // map5.put("key", "textField_lrq4uku2"); // //同步类型 // map5.put("value", "计划工时"); // //控件类型 // map5.put("type", "TEXT"); // //逻辑判断符 // map5.put("operator", "eq"); // //控件名称 // map5.put("componentName", "TextField"); // // List list11 = new ArrayList(); // list11.add(map1); // list11.add(map2); // list11.add(map3); // list11.add(map4); // list11.add(map5); // // String listJson = JSON.toJSONString(list11); // System.out.println("查询条件listJson:" + listJson); // // //将汇总数据写入【宜搭汇总表】 // JSONObject jsonObject1; // //新增或更新表单实例【宜搭】 // try { // com.aliyun.dingtalkyida_1_0.Client client11 = createClient(); // com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders createOrUpdateFormDataHeaders = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders(); // createOrUpdateFormDataHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken(); // com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest createOrUpdateFormDataRequest = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest() // //应用秘钥 // .setSystemToken("J0A6698165EFMED0AHIG76FW7C6Q3ON1PG5OL482") // //表单编码 // .setFormUuid("FORM-BH766Y61W4CFWBS0869YFBF8COTE2QEHIH5OLM") // .setUserId("yida_pub_account") // .setSearchCondition(listJson) // //应用编码 // .setAppType("APP_QHPV3T4ZU2Y88Q4U0UDA") // .setFormDataJson(mapJson); // // CreateOrUpdateFormDataResponse orUpdateFormDataWithOptions = client11.createOrUpdateFormDataWithOptions(createOrUpdateFormDataRequest, createOrUpdateFormDataHeaders, new RuntimeOptions()); // String s = JSON.toJSONString(orUpdateFormDataWithOptions.getBody()); // jsonObject1 = JSON.parseObject(s); // System.out.println("【创建或更新】表单object对象:" + jsonObject1); // } 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 属性,可帮助开发定位问题 // } // } // /*同步至宜搭*/ // } } } } if (result.isEmpty() && result1.isEmpty()){ log.info("当计划工时和实际工时都为空的情况,将同步该人员的一条记录,并记录钉钉考勤信息。"); /*同步钉钉数据*/ //应出勤天数 float yingchuqintianshu = 0; //请假天数 float qingjiatianshu = 0; //查询上月考勤数据,统计上月应出勤天数、请假天数 try { DingTalkClient client11 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/getcolumnval"); OapiAttendanceGetcolumnvalRequest req = new OapiAttendanceGetcolumnvalRequest(); //TODO 待查询人员的userid req.setUserid(userId); //考勤报表列定义查出来的工作时长的列id(固定) req.setColumnIdList("176150482,985267953"); //TODO 查询开始时间 req.setFromDate(StringUtils.parseDateTime(FORMtime)); //TODO 查询结束时间 req.setToDate(StringUtils.parseDateTime(TOtime)); OapiAttendanceGetcolumnvalResponse rsp = client11.execute(req, accessTokenService.getAccessToken()); // System.out.println(rsp.getBody()); String string = rsp.getBody(); JSONObject jsonObjectKaoqin = JSON.parseObject(string); int errcode = jsonObjectKaoqin.getInteger("errcode"); System.out.println("考勤时间周期查询结果状态码:" + errcode); String errmsg = jsonObjectKaoqin.getString("errmsg"); System.out.println("考勤时间周期查询结果状态信息:" + errmsg); if (errcode != 0) { log.info("考勤时间周期查询结果反馈异常,异常状态码:" + errcode + "【" + errmsg + "】"); } else { //应出勤天数 JSONArray jsonArray1 = jsonObjectKaoqin.getJSONObject("result"). getJSONArray("column_vals"). getJSONObject(0). getJSONArray("column_vals"); for (int x = 0; x < jsonArray1.size(); x++) { //应出勤天数 String value = jsonArray1.getJSONObject(x).getString("value"); System.out.println("应出勤天数:" + value); float v = Float.parseFloat(value); if (v == 1) { System.out.println("应出勤天数,进行循环统计!"); yingchuqintianshu = yingchuqintianshu + 1; } } //请假天数 JSONArray jsonArray = jsonObjectKaoqin.getJSONObject("result"). getJSONArray("column_vals"). getJSONObject(1). getJSONArray("column_vals"); for (int x = 0; x < jsonArray.size(); x++) { //请假天数 String value = jsonArray.getJSONObject(x).getString("value"); System.out.println("请假天数:" + value); float v = Float.parseFloat(value); if (v > 0) { System.out.println("请假天数,进行循环统计!"); qingjiatianshu = qingjiatianshu + v; } } } } catch (ApiException e) { e.printStackTrace(); } //应出勤天数 BigDecimal ycqts = new BigDecimal(yingchuqintianshu); BigDecimal ycqtsAll = ycqts.setScale(2, BigDecimal.ROUND_DOWN); System.out.println("应出勤天数(浮点数,保留2位小数):" + ycqtsAll); //请假天数 BigDecimal qjts = new BigDecimal(qingjiatianshu); BigDecimal qjtsAll = qjts.setScale(2, BigDecimal.ROUND_DOWN); System.out.println("请假天数(浮点数,保留2位小数):" + qjtsAll); /*同步至宜搭*/ Map map = new HashMap(); //实际统计月份 map.put("textField_losayxi8", lastMonthNow); //钉钉userid map.put("textField_los8y15p", userId); //姓名 map.put("textField_los8y15q", userName); //主部门 map.put("textField_los8y15s", zhubumen); //职位 map.put("textField_los8y15x", zhiwei); //邮箱 map.put("textField_los8y15y", youxiang); /*TB项目/任务数据*/ // //项目名称 // map.put("textField_lp0m06bd", ""); // //任务名称 // map.put("textField_lp0m06be", ""); // //业务类型 // map.put("textField_los8y15z", ""); // //统一工时数(天) // map.put("numberField_los8y164", 0); /*钉钉考勤数据*/ //每月人天(应出勤天数) map.put("numberField_los8y16g", ycqtsAll); //请假天数 map.put("numberField_los8y16f", qjtsAll); //是否全投入 // map.put("selectField_los8y16e", "否"); /*计算字段*/ // //人月数据:统一工时数(天)/每月人天 // map.put("numberField_los8y16c", 0); // //SaaS合计:统一工时数(天)+请假成本(天) // map.put("numberField_los8y16h", 0); // //占比:SaaS合计/每月人天 // map.put("numberField_los8y16p", 0); String mapJson = JSON.toJSONString(map); System.out.println("mapJson:" + mapJson); //宜搭表单判断查询条件 //判断宜搭人员信息表是否有当前人员userid Map map1 = new HashMap(); //字段编号 map1.put("key", "textField_los8y15p"); //同步类型 map1.put("value", userId); // map1.put("value", "userId"); //控件类型 map1.put("type", "TEXT"); //逻辑判断符 map1.put("operator", "eq"); //控件名称 map1.put("componentName", "TextField"); Map map2 = new HashMap(); //字段编号 map2.put("key", "textField_losayxi8"); //同步类型 map2.put("value", lastMonthNow); //控件类型 map2.put("type", "TEXT"); //逻辑判断符 map2.put("operator", "eq"); //控件名称 map2.put("componentName", "TextField"); List list11 = new ArrayList(); list11.add(map1); list11.add(map2); String listJson = JSON.toJSONString(list11); System.out.println("查询条件listJson:" + listJson); //将汇总数据写入【宜搭汇总表】 JSONObject jsonObject; //新增或更新表单实例【宜搭】 try { com.aliyun.dingtalkyida_1_0.Client client11 = createClient(); com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders createOrUpdateFormDataHeaders = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders(); createOrUpdateFormDataHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken(); com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest createOrUpdateFormDataRequest = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest() //应用秘钥 .setSystemToken("J0A6698165EFMED0AHIG76FW7C6Q3ON1PG5OL482") //表单编码 .setFormUuid("FORM-BH766Y61W4CFWBS0869YFBF8COTE2QEHIH5OLM") .setUserId("yida_pub_account") .setSearchCondition(listJson) //应用编码 .setAppType("APP_QHPV3T4ZU2Y88Q4U0UDA") .setFormDataJson(mapJson); CreateOrUpdateFormDataResponse orUpdateFormDataWithOptions = client11.createOrUpdateFormDataWithOptions(createOrUpdateFormDataRequest, createOrUpdateFormDataHeaders, new RuntimeOptions()); String s = JSON.toJSONString(orUpdateFormDataWithOptions.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 属性,可帮助开发定位问题 } } /*同步至宜搭*/ } // } } } } log.info("统计结束!"); return "统计完成!"; } }