|
@@ -0,0 +1,622 @@
|
|
|
|
|
+package com.muzhi.paizhi.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.tea.TeaException;
|
|
|
|
|
+import com.aliyun.teautil.models.RuntimeOptions;
|
|
|
|
|
+import com.muzhi.paizhi.common.R;
|
|
|
|
|
+import com.muzhi.paizhi.service.AccessTokenService;
|
|
|
|
|
+import com.muzhi.paizhi.service.TbService;
|
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
+import okhttp3.*;
|
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
+import org.springframework.scheduling.annotation.Async;
|
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
|
+
|
|
|
|
|
+import java.io.IOException;
|
|
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
|
|
+import java.util.*;
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+@Service
|
|
|
|
|
+@Slf4j
|
|
|
|
|
+public class TbServiceImpl implements TbService {
|
|
|
|
|
+
|
|
|
|
|
+ //宜搭接口调用
|
|
|
|
|
+ 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);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private AccessTokenService accessTokenService;
|
|
|
|
|
+
|
|
|
|
|
+ //派智TB企业ID(tbOrganizationId)
|
|
|
|
|
+ public static String tbOrganizationId = "61a57d86ea9aa2f22415088e";
|
|
|
|
|
+
|
|
|
|
|
+ //通过任务id查询任务详情
|
|
|
|
|
+ public JSONArray getRenwuxiangqing(String rwid){
|
|
|
|
|
+
|
|
|
|
|
+ //获取属于该区域名称的项目集id
|
|
|
|
|
+ OkHttpClient client1 = new OkHttpClient().newBuilder()
|
|
|
|
|
+ .build();
|
|
|
|
|
+ Request request1 = new Request.Builder()
|
|
|
|
|
+ .url("https://open.teambition.com/api/v3/task/query?taskId="+ rwid)
|
|
|
|
|
+ .method("GET", null)
|
|
|
|
|
+ .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
|
|
|
|
|
+ .addHeader("X-Tenant-Id", tbOrganizationId)
|
|
|
|
|
+ .addHeader("X-Tenant-Type", "organization")
|
|
|
|
|
+ .build();
|
|
|
|
|
+
|
|
|
|
|
+ int code1 = 0;
|
|
|
|
|
+ JSONArray result1 = null;
|
|
|
|
|
+ try {
|
|
|
|
|
+ Response response1 = client1.newCall(request1).execute();
|
|
|
|
|
+ String bodyStr1 = response1.body().string();
|
|
|
|
|
+ JSONObject jsonObject1 = JSON.parseObject(bodyStr1);
|
|
|
|
|
+ System.out.println("返回体body:" + jsonObject1);
|
|
|
|
|
+ code1 = jsonObject1.getInteger("code");
|
|
|
|
|
+
|
|
|
|
|
+ result1 = jsonObject1.getJSONArray("result");
|
|
|
|
|
+ System.out.println("result===>" + result1);
|
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
|
+ e.printStackTrace();
|
|
|
|
|
+ }
|
|
|
|
|
+ System.out.println("查询【通过任务id查询所属项目id】接口返回的状态码(200成功,400异常):" + code1);
|
|
|
|
|
+
|
|
|
|
|
+ //任务类型id
|
|
|
|
|
+// String sfcId = null;
|
|
|
|
|
+// if (!result1.isEmpty() || result1 != null) {
|
|
|
|
|
+// JSONObject jsonObject1 = result1.getJSONObject(0);
|
|
|
|
|
+//
|
|
|
|
|
+// //任务类型id
|
|
|
|
|
+// sfcId = jsonObject1.getString("sfcId");
|
|
|
|
|
+// System.out.println("任务类型id:" + sfcId);
|
|
|
|
|
+// }
|
|
|
|
|
+
|
|
|
|
|
+ return result1;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //更新项目自定义字段值
|
|
|
|
|
+ public R updateXmCustomField(String operatorId, String xmid, String customfieldId, String title){
|
|
|
|
|
+
|
|
|
|
|
+ Map mapTitle = new HashMap();
|
|
|
|
|
+ mapTitle.put("title", title);
|
|
|
|
|
+
|
|
|
|
|
+ List listTitle = new ArrayList();
|
|
|
|
|
+ listTitle.add(mapTitle);
|
|
|
|
|
+
|
|
|
|
|
+ Map mapAll = new HashMap();
|
|
|
|
|
+ mapAll.put("customfieldId", customfieldId);
|
|
|
|
|
+ mapAll.put("value", listTitle);
|
|
|
|
|
+
|
|
|
|
|
+ String mapStr = JSON.toJSONString(mapAll);
|
|
|
|
|
+ System.out.println("封装更新的字段参数:" + mapStr);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ OkHttpClient client = new OkHttpClient().newBuilder()
|
|
|
|
|
+ .build();
|
|
|
|
|
+ MediaType mediaType = MediaType.parse("application/json");
|
|
|
|
|
+ RequestBody body = RequestBody.create(mediaType, mapStr);
|
|
|
|
|
+ Request request = new Request.Builder()
|
|
|
|
|
+ .url("https://open.teambition.com/api/v3/project/"+ xmid +"/status/customfield/create")
|
|
|
|
|
+ .method("POST", body)
|
|
|
|
|
+ .addHeader("x-operator-id", operatorId)
|
|
|
|
|
+ .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
|
|
|
|
|
+ .addHeader("X-Tenant-Id", tbOrganizationId)
|
|
|
|
|
+ .addHeader("X-Tenant-Type", "organization")
|
|
|
|
|
+ .addHeader("Content-Type", "application/json")
|
|
|
|
|
+ .build();
|
|
|
|
|
+
|
|
|
|
|
+ int code1 = 0;
|
|
|
|
|
+ try {
|
|
|
|
|
+ Response response1 = client.newCall(request).execute();
|
|
|
|
|
+ String bodyStr1 = response1.body().string();
|
|
|
|
|
+ JSONObject jsonObject1 = JSON.parseObject(bodyStr1);
|
|
|
|
|
+ System.out.println("返回体body:" + jsonObject1);
|
|
|
|
|
+ code1 = jsonObject1.getInteger("code");
|
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
|
+ e.printStackTrace();
|
|
|
|
|
+ }
|
|
|
|
|
+ System.out.println("【更新项目自定义字段值】接口返回的状态码(200成功,400异常):" + code1);
|
|
|
|
|
+
|
|
|
|
|
+ return R.ok();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //通过项目id查询项目「里程碑」任务类型id
|
|
|
|
|
+ public String getXiangmuLichengbeiRenwuleixingid(String xmid){
|
|
|
|
|
+
|
|
|
|
|
+ OkHttpClient client1 = new OkHttpClient().newBuilder()
|
|
|
|
|
+ .build();
|
|
|
|
|
+ Request request1 = new Request.Builder()
|
|
|
|
|
+ .url("https://open.teambition.com/api/v3/project/"+ xmid +"/scenariofieldconfig/search?q=里程碑")
|
|
|
|
|
+ .method("GET", null)
|
|
|
|
|
+ .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
|
|
|
|
|
+ .addHeader("X-Tenant-Id", tbOrganizationId)
|
|
|
|
|
+ .addHeader("X-Tenant-Type", "organization")
|
|
|
|
|
+ .build();
|
|
|
|
|
+
|
|
|
|
|
+ int code1 = 0;
|
|
|
|
|
+ JSONArray result1 = null;
|
|
|
|
|
+ try {
|
|
|
|
|
+ Response response1 = client1.newCall(request1).execute();
|
|
|
|
|
+ String bodyStr1 = response1.body().string();
|
|
|
|
|
+ JSONObject jsonObject1 = JSON.parseObject(bodyStr1);
|
|
|
|
|
+ System.out.println("返回体body:" + jsonObject1);
|
|
|
|
|
+ code1 = jsonObject1.getInteger("code");
|
|
|
|
|
+
|
|
|
|
|
+ result1 = jsonObject1.getJSONArray("result");
|
|
|
|
|
+ System.out.println("result===>" + result1);
|
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
|
+ e.printStackTrace();
|
|
|
|
|
+ }
|
|
|
|
|
+ System.out.println("查询【通过项目id查询项目「里程碑」任务类型id】接口返回的状态码(200成功,400异常):" + code1);
|
|
|
|
|
+
|
|
|
|
|
+ //任务类型id
|
|
|
|
|
+ String rwlxId = null;
|
|
|
|
|
+ if (!result1.isEmpty() || result1 != null) {
|
|
|
|
|
+ JSONObject jsonObject1 = result1.getJSONObject(0);
|
|
|
|
|
+
|
|
|
|
|
+ //任务类型id
|
|
|
|
|
+ rwlxId = jsonObject1.getString("id");
|
|
|
|
|
+ System.out.println("任务类型id:" + rwlxId);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return rwlxId;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //根据项目id和工作流名称,获取「里程碑」工作流id
|
|
|
|
|
+ public String getXiangmuLichengbeiGongzuoliuid(String xmid){
|
|
|
|
|
+
|
|
|
|
|
+ OkHttpClient client1 = new OkHttpClient().newBuilder()
|
|
|
|
|
+ .build();
|
|
|
|
|
+ Request request1 = new Request.Builder()
|
|
|
|
|
+ .url("https://open.teambition.com/api/v3/project/"+ xmid +"/taskflow/search?q=里程碑工作流")
|
|
|
|
|
+ .method("GET", null)
|
|
|
|
|
+ .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
|
|
|
|
|
+ .addHeader("X-Tenant-Id", tbOrganizationId)
|
|
|
|
|
+ .addHeader("X-Tenant-Type", "organization")
|
|
|
|
|
+ .build();
|
|
|
|
|
+
|
|
|
|
|
+ int code1 = 0;
|
|
|
|
|
+ JSONArray result1 = null;
|
|
|
|
|
+ try {
|
|
|
|
|
+ Response response1 = client1.newCall(request1).execute();
|
|
|
|
|
+ String bodyStr1 = response1.body().string();
|
|
|
|
|
+ JSONObject jsonObject1 = JSON.parseObject(bodyStr1);
|
|
|
|
|
+ System.out.println("返回体body:" + jsonObject1);
|
|
|
|
|
+ code1 = jsonObject1.getInteger("code");
|
|
|
|
|
+
|
|
|
|
|
+ result1 = jsonObject1.getJSONArray("result");
|
|
|
|
|
+ System.out.println("result===>" + result1);
|
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
|
+ e.printStackTrace();
|
|
|
|
|
+ }
|
|
|
|
|
+ System.out.println("查询【根据项目id和工作流名称,获取「里程碑」工作流id】接口返回的状态码(200成功,400异常):" + code1);
|
|
|
|
|
+
|
|
|
|
|
+ //工作流id
|
|
|
|
|
+ String gzlId = null;
|
|
|
|
|
+ if (!result1.isEmpty() || result1 != null) {
|
|
|
|
|
+ JSONObject jsonObject1 = result1.getJSONObject(0);
|
|
|
|
|
+
|
|
|
|
|
+ //工作流id
|
|
|
|
|
+ gzlId = jsonObject1.getString("id");
|
|
|
|
|
+ System.out.println("工作流id:" + gzlId);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return gzlId;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //根据项目id、工作流id、已完成状态名称,获取「里程碑」任务完成状态id
|
|
|
|
|
+ public String getXiangmuLichengbeiGongzuoliuYiwanchengzhuangtaiid(String xmid, String gzlId){
|
|
|
|
|
+
|
|
|
|
|
+ OkHttpClient client1 = new OkHttpClient().newBuilder()
|
|
|
|
|
+ .build();
|
|
|
|
|
+ Request request1 = new Request.Builder()
|
|
|
|
|
+ .url("https://open.teambition.com/api/v3/project/"+ xmid +"/taskflowstatus/search?q=已完成&tfIds="+ gzlId)
|
|
|
|
|
+ .method("GET", null)
|
|
|
|
|
+ .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
|
|
|
|
|
+ .addHeader("X-Tenant-Id", tbOrganizationId)
|
|
|
|
|
+ .addHeader("X-Tenant-Type", "organization")
|
|
|
|
|
+ .build();
|
|
|
|
|
+
|
|
|
|
|
+ int code1 = 0;
|
|
|
|
|
+ JSONArray result1 = null;
|
|
|
|
|
+ try {
|
|
|
|
|
+ Response response1 = client1.newCall(request1).execute();
|
|
|
|
|
+ String bodyStr1 = response1.body().string();
|
|
|
|
|
+ JSONObject jsonObject1 = JSON.parseObject(bodyStr1);
|
|
|
|
|
+ System.out.println("返回体body:" + jsonObject1);
|
|
|
|
|
+ code1 = jsonObject1.getInteger("code");
|
|
|
|
|
+
|
|
|
|
|
+ result1 = jsonObject1.getJSONArray("result");
|
|
|
|
|
+ System.out.println("result===>" + result1);
|
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
|
+ e.printStackTrace();
|
|
|
|
|
+ }
|
|
|
|
|
+ System.out.println("查询【根据项目id、工作流id、已完成状态名称,获取「里程碑」任务完成状态id】接口返回的状态码(200成功,400异常):" + code1);
|
|
|
|
|
+
|
|
|
|
|
+ //已完成状态id
|
|
|
|
|
+ String ywcztId = null;
|
|
|
|
|
+ if (!result1.isEmpty() || result1 != null) {
|
|
|
|
|
+ JSONObject jsonObject1 = result1.getJSONObject(0);
|
|
|
|
|
+
|
|
|
|
|
+ //已完成状态id
|
|
|
|
|
+ ywcztId = jsonObject1.getString("id");
|
|
|
|
|
+ System.out.println("已完成状态id:" + ywcztId);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return ywcztId;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //根据项目id,查询项目概览自定义字段列表中「项目状态」id
|
|
|
|
|
+ public String getXiangmuZidingyiziduanid(String xmid, String zidingyiziduanName){
|
|
|
|
|
+
|
|
|
|
|
+ OkHttpClient client1 = new OkHttpClient().newBuilder()
|
|
|
|
|
+ .build();
|
|
|
|
|
+ Request request1 = new Request.Builder()
|
|
|
|
|
+ .url("https://open.teambition.com/api/v3/project/"+ xmid +"/status/customfield/list")
|
|
|
|
|
+ .method("GET", null)
|
|
|
|
|
+ .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
|
|
|
|
|
+ .addHeader("X-Tenant-Id", tbOrganizationId)
|
|
|
|
|
+ .addHeader("X-Tenant-Type", "organization")
|
|
|
|
|
+ .build();
|
|
|
|
|
+
|
|
|
|
|
+ int code1 = 0;
|
|
|
|
|
+ JSONArray result1 = null;
|
|
|
|
|
+ try {
|
|
|
|
|
+ Response response1 = client1.newCall(request1).execute();
|
|
|
|
|
+ String bodyStr1 = response1.body().string();
|
|
|
|
|
+ JSONObject jsonObject1 = JSON.parseObject(bodyStr1);
|
|
|
|
|
+ System.out.println("返回体body:" + jsonObject1);
|
|
|
|
|
+ code1 = jsonObject1.getInteger("code");
|
|
|
|
|
+
|
|
|
|
|
+ result1 = jsonObject1.getJSONArray("result");
|
|
|
|
|
+ System.out.println("result===>" + result1);
|
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
|
+ e.printStackTrace();
|
|
|
|
|
+ }
|
|
|
|
|
+ System.out.println("查询【根据项目id,查询项目概览自定义字段列表中「项目状态」id】接口返回的状态码(200成功,400异常):" + code1);
|
|
|
|
|
+
|
|
|
|
|
+ //自定义「项目状态id」
|
|
|
|
|
+ String xmztId = null;
|
|
|
|
|
+ if (!result1.isEmpty() || result1 != null) {
|
|
|
|
|
+ for (int i = 0; i < result1.size(); i++) {
|
|
|
|
|
+ JSONObject jsonObject1 = result1.getJSONObject(i);
|
|
|
|
|
+ //自定义「项目状态名称」
|
|
|
|
|
+ String xmztName = jsonObject1.getString("name");
|
|
|
|
|
+ System.out.println("自定义「项目状态名称」:" + xmztName);
|
|
|
|
|
+
|
|
|
|
|
+ if (xmztName.equals(zidingyiziduanName)){
|
|
|
|
|
+ //自定义「项目状态id」
|
|
|
|
|
+ xmztId = jsonObject1.getString("cfId");
|
|
|
|
|
+ System.out.println("自定义「项目状态id」:" + xmztId);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return xmztId;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //根据TB项目id查询宜搭IPD项目档案的单据,并获取该档案中关联的LEV的项目档案数据实例id
|
|
|
|
|
+ public String getYidaiIpdProjectAndLEVslId(String tbXmid){
|
|
|
|
|
+ JSONObject jsonObject = null;
|
|
|
|
|
+
|
|
|
|
|
+ int size = 100;
|
|
|
|
|
+ int page = 1;
|
|
|
|
|
+
|
|
|
|
|
+ //TODO 指定筛选信息
|
|
|
|
|
+ Map mapAll = new HashMap();
|
|
|
|
|
+ //TB项目id
|
|
|
|
|
+ mapAll.put("textField_lqxtykce", tbXmid);
|
|
|
|
|
+ String mapAllStr = JSON.toJSONString(mapAll);
|
|
|
|
|
+ System.out.println("封装查询的字段参数:" + mapAllStr);
|
|
|
|
|
+
|
|
|
|
|
+ //LEV项目档案的实例id
|
|
|
|
|
+ String slid_lev = null;
|
|
|
|
|
+ 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("1W9669D1HQZUJCB5D3Q8S5T6XUXZ2EL3V42AMYQ1")
|
|
|
|
|
+
|
|
|
|
|
+ .setSearchFieldJson(mapAllStr)
|
|
|
|
|
+
|
|
|
|
|
+ .setCurrentPage(page)
|
|
|
|
|
+ .setPageSize(size)
|
|
|
|
|
+ .setFormUuid("FORM-2CC97D2F8D7D4F7C925538CC5758755DOA4W")
|
|
|
|
|
+ .setUserId("yida_pub_account")
|
|
|
|
|
+ .setAppType("APP_H2HQQ5I9E0HHGHAY7KSL");
|
|
|
|
|
+
|
|
|
|
|
+ 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("宜搭数据高级条件查询【IPD项目档案】接口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("查询【IPD项目档案】返回数据为空!");
|
|
|
|
|
+ } else {
|
|
|
|
|
+ for (int i = 0; i < data.size(); i++) {
|
|
|
|
|
+ JSONObject formData = data.getJSONObject(i).getJSONObject("formData");
|
|
|
|
|
+ Map map = new HashMap<>();
|
|
|
|
|
+
|
|
|
|
|
+ //实例ID
|
|
|
|
|
+ String shiliID = data.getJSONObject(i).getString("formInstanceId");
|
|
|
|
|
+ System.out.println("实例ID===>" + shiliID);
|
|
|
|
|
+
|
|
|
|
|
+ //LEV项目档案的实例id
|
|
|
|
|
+ slid_lev = null;
|
|
|
|
|
+ try {
|
|
|
|
|
+ slid_lev = formData.getString("textField_lrj7vnxf") != null ? formData.getString("textField_lrj7vnxf") : null;
|
|
|
|
|
+ }catch (Exception e){
|
|
|
|
|
+ e.printStackTrace();
|
|
|
|
|
+ }
|
|
|
|
|
+ System.out.println("LEV项目档案的实例id:" + slid_lev);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (jsonObject.getFloat("totalCount") / 100 > jsonObject.getInteger("currentPage")){
|
|
|
|
|
+ page = page + 1;
|
|
|
|
|
+ System.out.println("下一次待查询分页:" + page);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ }while (jsonObject.getFloat("totalCount") / 100 > jsonObject.getInteger("currentPage"));
|
|
|
|
|
+
|
|
|
|
|
+ System.out.println("根据TB项目id查询【IPD项目档案】匹配到的【LEV项目档案】数据实例id:" + slid_lev);
|
|
|
|
|
+
|
|
|
|
|
+ return slid_lev;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //根据LEV项目档案实例id更新宜搭项目档案的「项目状态」字段
|
|
|
|
|
+ public void updateYidaLEVxmzt(String slid_lev, String xmzt){
|
|
|
|
|
+
|
|
|
|
|
+ Map map = new HashMap();
|
|
|
|
|
+ map.put("selectField_m71o2kk8", xmzt);
|
|
|
|
|
+
|
|
|
|
|
+ String mapJson = JSON.toJSONString(map);
|
|
|
|
|
+ System.out.println("mapJson:" + mapJson);
|
|
|
|
|
+
|
|
|
|
|
+ try {
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 更新表单数据「按照数据版本」
|
|
|
|
|
+ * 注:非表单字段调整不开启
|
|
|
|
|
+ * */
|
|
|
|
|
+
|
|
|
|
|
+ com.aliyun.dingtalkyida_1_0.Client client = createClient();
|
|
|
|
|
+ com.aliyun.dingtalkyida_1_0.models.UpdateFormDataHeaders updateFormDataHeaders = new com.aliyun.dingtalkyida_1_0.models.UpdateFormDataHeaders();
|
|
|
|
|
+ updateFormDataHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken();
|
|
|
|
|
+ com.aliyun.dingtalkyida_1_0.models.UpdateFormDataRequest updateFormDataRequest = new com.aliyun.dingtalkyida_1_0.models.UpdateFormDataRequest()
|
|
|
|
|
+ .setSystemToken("JB966E91RQZUKPPFFNOKBB86G3GH38VSN42AMGV")
|
|
|
|
|
+ .setFormInstanceId(slid_lev)
|
|
|
|
|
+ .setUserId("yida_pub_account")
|
|
|
|
|
+ .setUseLatestVersion(true)
|
|
|
|
|
+ .setAppType("APP_FJSLK9BJ20K1NL3G2PUW")
|
|
|
|
|
+ .setUpdateFormDataJson(mapJson);
|
|
|
|
|
+
|
|
|
|
|
+ client.updateFormDataWithOptions(updateFormDataRequest, updateFormDataHeaders, new com.aliyun.teautil.models.RuntimeOptions());
|
|
|
|
|
+ } 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 属性,可帮助开发定位问题
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //接收TB的WebHook推送过来的数据
|
|
|
|
|
+ @Async
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public String callBack(Map body) throws Exception{
|
|
|
|
|
+
|
|
|
|
|
+ String s = JSON.toJSONString(body);
|
|
|
|
|
+ System.out.println("TB推送过来的数据:" + s);
|
|
|
|
|
+
|
|
|
|
|
+ //解析TB推送过来的数据
|
|
|
|
|
+ JSONObject jsonObject = JSON.parseObject(s);
|
|
|
|
|
+ String event = jsonObject.getString("event");
|
|
|
|
|
+ System.out.println("事件名称「推送类型」:" + event);
|
|
|
|
|
+ String timestamp = jsonObject.getString("timestamp");
|
|
|
|
|
+ System.out.println("事件触发时间「毫秒级时间戳」:" + timestamp);
|
|
|
|
|
+
|
|
|
|
|
+// 休眠10秒
|
|
|
|
|
+// try {
|
|
|
|
|
+// Thread.sleep(10000);
|
|
|
|
|
+// }catch (InterruptedException e){
|
|
|
|
|
+// e.printStackTrace();
|
|
|
|
|
+// }
|
|
|
|
|
+
|
|
|
|
|
+ if (event.equals("v3.task.taskflowstatus.update")) {//======任务状态更新======
|
|
|
|
|
+ log.info("【任务状态更新】,开始执行===》");
|
|
|
|
|
+ JSONObject data = jsonObject.getJSONObject("data");
|
|
|
|
|
+ System.out.println("任务信息data:" + data);
|
|
|
|
|
+
|
|
|
|
|
+ //里程碑任务类型id
|
|
|
|
|
+ String lcbrwlxid = null;
|
|
|
|
|
+ System.out.println("里程碑任务类型id:" + lcbrwlxid);
|
|
|
|
|
+ //里程碑工作流id
|
|
|
|
|
+ String lcbgzlid = null;
|
|
|
|
|
+ System.out.println("里程碑工作流id:" + lcbgzlid);
|
|
|
|
|
+ //任务完成状态id
|
|
|
|
|
+ String rwwcztid = null;
|
|
|
|
|
+ System.out.println("任务完成状态id:" + rwwcztid);
|
|
|
|
|
+ //项目概览自定义字段「项目状态id」
|
|
|
|
|
+ String xmztid = null;
|
|
|
|
|
+ System.out.println("项目概览自定义字段「项目状态id」:" + xmztid);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ //项目id
|
|
|
|
|
+ String xmid = data.getString("projectId");
|
|
|
|
|
+ System.out.println("项目id:" + xmid);
|
|
|
|
|
+ //任务id
|
|
|
|
|
+ String taskId = data.getString("taskId");
|
|
|
|
|
+ System.out.println("任务id:" + taskId);
|
|
|
|
|
+ //操作者id
|
|
|
|
|
+ String operatorId = data.getString("creatorId");
|
|
|
|
|
+ System.out.println("操作者id:" + operatorId);
|
|
|
|
|
+ //当前任务状态id
|
|
|
|
|
+ String tfsId = data.getString("tfsId");
|
|
|
|
|
+ System.out.println("当前任务状态id:" + tfsId);
|
|
|
|
|
+
|
|
|
|
|
+ /**根据TB项目id查询宜搭IPD项目档案的单据,并获取该档案中关联的LEV的项目档案数据实例id*/
|
|
|
|
|
+ String slid_lev = getYidaiIpdProjectAndLEVslId(xmid);
|
|
|
|
|
+
|
|
|
|
|
+ /**根据项目id,查询项目概览自定义字段列表中「项目状态」id*/
|
|
|
|
|
+ xmztid = getXiangmuZidingyiziduanid(xmid, "项目状态");
|
|
|
|
|
+ if (xmztid != null){
|
|
|
|
|
+ log.info("【根据项目id,查询项目概览自定义字段列表中「项目状态」id】不为空,开始执行后续业务===》");
|
|
|
|
|
+
|
|
|
|
|
+ /**通过任务id查询任务详情,获取任务类型id*/
|
|
|
|
|
+ JSONArray renwuxiangqingArray = getRenwuxiangqing(taskId);
|
|
|
|
|
+ //任务类型id
|
|
|
|
|
+ String renwuleixingid = null;
|
|
|
|
|
+ if (!renwuxiangqingArray.isEmpty() || renwuxiangqingArray != null) {
|
|
|
|
|
+ JSONObject jsonObject1 = renwuxiangqingArray.getJSONObject(0);
|
|
|
|
|
+ //当前任务类型id
|
|
|
|
|
+ renwuleixingid = jsonObject1.getString("sfcId");
|
|
|
|
|
+ System.out.println("当前任务类型id:" + renwuleixingid);
|
|
|
|
|
+
|
|
|
|
|
+ /**根据项目id获取项目下的「里程碑」任务类型id*/
|
|
|
|
|
+ lcbrwlxid = getXiangmuLichengbeiRenwuleixingid(xmid);
|
|
|
|
|
+ if (lcbrwlxid != null){
|
|
|
|
|
+ log.info("【通过项目id查询项目「里程碑」任务类型id】不为空,开始判断是否为里程碑任务===》");
|
|
|
|
|
+
|
|
|
|
|
+ if (renwuleixingid.equals(lcbrwlxid)){
|
|
|
|
|
+ log.info("【任务类型为里程碑】,开始判断任务状态是否完成===》");
|
|
|
|
|
+
|
|
|
|
|
+ /**根据项目id和工作流名称,获取「里程碑」工作流id*/
|
|
|
|
|
+ lcbgzlid = getXiangmuLichengbeiGongzuoliuid(xmid);
|
|
|
|
|
+ if (lcbgzlid != null){
|
|
|
|
|
+ log.info("【通过项目id和工作流名称,获取「里程碑」工作流id】不为空,开始获取里程碑的任务完成状态id===》");
|
|
|
|
|
+
|
|
|
|
|
+ /**根据项目id、工作流id、已完成状态名称,获取「里程碑」任务完成状态id*/
|
|
|
|
|
+ rwwcztid = getXiangmuLichengbeiGongzuoliuYiwanchengzhuangtaiid(xmid, lcbgzlid);
|
|
|
|
|
+ if (rwwcztid != null){
|
|
|
|
|
+ log.info("【通过项目id和工作流id,获取「里程碑」任务完成状态id】不为空,开始判断任务状态是否完成===》");
|
|
|
|
|
+
|
|
|
|
|
+ if (tfsId.equals(rwwcztid)){
|
|
|
|
|
+ log.info("【任务状态为完成】,开始执行===》");
|
|
|
|
|
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z");
|
|
|
|
|
+ SimpleDateFormat defaultFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
+
|
|
|
|
|
+ //任务截止时间
|
|
|
|
|
+ String dueDate = jsonObject1.getString("dueDate");
|
|
|
|
|
+ System.out.println("任务截止时间:" + dueDate);
|
|
|
|
|
+ //任务截止时间文本
|
|
|
|
|
+ String renwujiezhiTime = "";
|
|
|
|
|
+ //任务截止时间戳
|
|
|
|
|
+ long time1 = 0;
|
|
|
|
|
+ //【时间转换】TB中获取的时间为UTC:世界标准时间,在标准时间上加上8小时,即东八区时间,也就是北京时间。
|
|
|
|
|
+ String renwujiezhiTimeStr = dueDate.replace("Z", " UTC");
|
|
|
|
|
+ try {
|
|
|
|
|
+ Date renwujiezhiDate = format.parse(renwujiezhiTimeStr);
|
|
|
|
|
+ renwujiezhiTime = defaultFormat.format(renwujiezhiDate);
|
|
|
|
|
+ System.out.println("任务截止时间文本:" + renwujiezhiTime);
|
|
|
|
|
+ time1 = renwujiezhiDate.getTime();
|
|
|
|
|
+ System.out.println("任务截止时间戳:" + time1);
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ e.printStackTrace();
|
|
|
|
|
+ }
|
|
|
|
|
+ System.out.println("任务截止时间(时间格式文本):" + renwujiezhiTime);
|
|
|
|
|
+ System.out.println("任务截止时间(时间戳):" + time1);
|
|
|
|
|
+
|
|
|
|
|
+ //获取任务完成时间
|
|
|
|
|
+ String accomplishTime = jsonObject1.getString("accomplishTime");
|
|
|
|
|
+ System.out.println("任务完成时间:" + accomplishTime);
|
|
|
|
|
+ //任务完成时间文本
|
|
|
|
|
+ String renwuwanchengTime = "";
|
|
|
|
|
+ //任务完成时间戳
|
|
|
|
|
+ long time2 = 0;
|
|
|
|
|
+ //【时间转换】TB中获取的时间为UTC:世界标准时间,在标准时间上加上8小时,即东八区时间,也就是北京时间。
|
|
|
|
|
+ String renwuwanchengTimeStr = accomplishTime.replace("Z", " UTC");
|
|
|
|
|
+ try {
|
|
|
|
|
+ Date renwuwanchengDate = format.parse(renwuwanchengTimeStr);
|
|
|
|
|
+ renwuwanchengTime = defaultFormat.format(renwuwanchengDate);
|
|
|
|
|
+ System.out.println("任务完成时间文本:" + renwuwanchengTime);
|
|
|
|
|
+ time2 = renwuwanchengDate.getTime();
|
|
|
|
|
+ System.out.println("任务完成时间戳:" + time2);
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ e.printStackTrace();
|
|
|
|
|
+ }
|
|
|
|
|
+ System.out.println("任务完成时间(时间格式文本):" + renwuwanchengTime);
|
|
|
|
|
+ System.out.println("任务完成时间(时间戳):" + time2);
|
|
|
|
|
+
|
|
|
|
|
+ //比较时间戳
|
|
|
|
|
+ if (time1 > time2){
|
|
|
|
|
+ log.info("【任务完成时间未超过任务截止时间,正常】,开始更新项目概览自定义字段「项目状态」");
|
|
|
|
|
+ /**更新项目概览自定义字段「项目状态」*/
|
|
|
|
|
+ updateXmCustomField(operatorId, xmid, xmztid,"正常");
|
|
|
|
|
+
|
|
|
|
|
+ /**根据TB项目id查询宜搭IPD应用的项目档案记录的TB项目id,获取宜搭项目档案编号,进行回写更新宜搭LEV应用中项目档案的状态*/
|
|
|
|
|
+ if (slid_lev != null){
|
|
|
|
|
+ log.info("【通过TB项目id查询宜搭IPD应用项目档案记录的LEV项目档案的实例id「不为空」】,开始根据实例id执行更新LEV项目档案的「项目状态」===》");
|
|
|
|
|
+
|
|
|
|
|
+ /**根据LEV项目档案实例id更新宜搭项目档案的「项目状态」字段*/
|
|
|
|
|
+ updateYidaLEVxmzt(slid_lev, "正常");
|
|
|
|
|
+ }else {
|
|
|
|
|
+ log.info("【通过TB项目id查询宜搭IPD应用项目档案记录的LEV项目档案的实例id「为空」】,终止更新LEV项目档案的「项目状态」!");
|
|
|
|
|
+ }
|
|
|
|
|
+ }else {
|
|
|
|
|
+ log.info("【任务完成时间超过任务截止时间,逾期】,开始更新项目概览自定义字段「项目状态」");
|
|
|
|
|
+ /**更新项目概览自定义字段「项目状态」*/
|
|
|
|
|
+ updateXmCustomField(operatorId, xmid, xmztid,"逾期");
|
|
|
|
|
+
|
|
|
|
|
+ /**根据TB项目id查询宜搭IPD应用的项目档案记录的TB项目id,获取宜搭项目档案编号,进行回写更新宜搭LEV应用中项目档案的状态*/
|
|
|
|
|
+ if (slid_lev != null){
|
|
|
|
|
+ log.info("【通过TB项目id查询宜搭IPD应用项目档案记录的LEV项目档案的实例id「不为空」】,开始根据实例id执行更新LEV项目档案的「项目状态」===》");
|
|
|
|
|
+
|
|
|
|
|
+ /**根据LEV项目档案实例id更新宜搭项目档案的「项目状态」字段*/
|
|
|
|
|
+ updateYidaLEVxmzt(slid_lev, "延期");
|
|
|
|
|
+ }else {
|
|
|
|
|
+ log.info("【通过TB项目id查询宜搭IPD应用项目档案记录的LEV项目档案的实例id「为空」】,终止更新LEV项目档案的「项目状态」!");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }else {
|
|
|
|
|
+ log.info("【任务状态非完成】,执行结束!");
|
|
|
|
|
+ }
|
|
|
|
|
+ }else{
|
|
|
|
|
+ log.info("【通过项目id和工作流id,获取「里程碑」任务完成状态id】为空,结束判断任务状态是否完成!");
|
|
|
|
|
+ }
|
|
|
|
|
+ }else {
|
|
|
|
|
+ log.info("【通过项目id和工作流名称,获取「里程碑」工作流id】为空,结束判断任务状态是否完成!");
|
|
|
|
|
+ }
|
|
|
|
|
+ }else {
|
|
|
|
|
+ log.info("【任务类型非里程碑】,执行结束!");
|
|
|
|
|
+ }
|
|
|
|
|
+ }else{
|
|
|
|
|
+ log.info("【通过项目id查询项目「里程碑」任务类型id】为空,结束判断是否为里程碑任务!");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }else{
|
|
|
|
|
+ log.info("【根据项目id,查询项目概览自定义字段列表中「项目状态」id】为空,结束执行后续业务!");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return "【TB】数据WebHook更新完成!";
|
|
|
|
|
+ }
|
|
|
|
|
+}
|