DingOaServiceImpl.java 167 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922
  1. package com.muzhi.huanshi.service.impl;
  2. import cn.hutool.core.thread.ThreadUtil;
  3. import com.alibaba.fastjson.JSON;
  4. import com.alibaba.fastjson.JSONArray;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.aliyun.dingtalkyida_1_0.models.*;
  7. import com.aliyun.tea.TeaException;
  8. import com.aliyun.teautil.models.RuntimeOptions;
  9. import com.dingtalk.api.DefaultDingTalkClient;
  10. import com.dingtalk.api.DingTalkClient;
  11. import com.dingtalk.api.request.OapiAttendanceGetcolumnvalRequest;
  12. import com.dingtalk.api.request.OapiSmartworkHrmEmployeeListRequest;
  13. import com.dingtalk.api.request.OapiSmartworkHrmEmployeeQueryonjobRequest;
  14. import com.dingtalk.api.response.OapiAttendanceGetcolumnvalResponse;
  15. import com.dingtalk.api.response.OapiSmartworkHrmEmployeeListResponse;
  16. import com.dingtalk.api.response.OapiSmartworkHrmEmployeeQueryonjobResponse;
  17. import com.muzhi.huanshi.service.AccessTokenService;
  18. import com.muzhi.huanshi.service.DingOaService;
  19. import com.taobao.api.ApiException;
  20. import com.taobao.api.internal.util.StringUtils;
  21. import lombok.extern.slf4j.Slf4j;
  22. import okhttp3.*;
  23. import org.springframework.beans.factory.annotation.Autowired;
  24. import org.springframework.stereotype.Service;
  25. import java.io.IOException;
  26. import java.math.BigDecimal;
  27. import java.text.DecimalFormat;
  28. import java.text.SimpleDateFormat;
  29. import java.util.*;
  30. @Service
  31. @Slf4j
  32. public class DingOaServiceImpl implements DingOaService {
  33. @Autowired
  34. private AccessTokenService accessTokenService;
  35. public static String huamingce1 = null;
  36. public static String employee1 = null;
  37. //环世TB企业ID(tbOrganizationId)
  38. public static String tbOrganizationId = "61318dae53bac9ea1baf7d9d";
  39. //宜搭接口调用
  40. public static com.aliyun.dingtalkyida_1_0.Client createClient() throws Exception {
  41. com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
  42. config.protocol = "https";
  43. config.regionId = "central";
  44. return new com.aliyun.dingtalkyida_1_0.Client(config);
  45. }
  46. //根据钉钉邮箱匹配TB邮箱对应人员,获取TB人员ID //TODO 不稳定,废弃。替换成IDMap接口来查询匹配人员ID
  47. public String getTBuserId(String youxiang){
  48. // String youxiang = "hongd@olymtech.com";
  49. int code = 0;
  50. JSONArray result = null;
  51. String TBuserId = null;
  52. try {
  53. OkHttpClient client = new OkHttpClient().newBuilder()
  54. .build();
  55. MediaType mediaType = MediaType.parse("text/plain");
  56. RequestBody body = RequestBody.create(mediaType, "");
  57. Request request = new Request.Builder()
  58. .url("https://open.teambition.com/api/org/member/search?orgId=" + tbOrganizationId + "&query=" + youxiang)
  59. .method("GET", null)
  60. .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
  61. .addHeader("X-Tenant-Id", tbOrganizationId)
  62. .addHeader("X-Tenant-Type", "organization")
  63. .build();
  64. Response response = client.newCall(request).execute();
  65. String bodyStr = response.body().string();
  66. JSONObject jsonObject = JSON.parseObject(bodyStr);
  67. // System.out.println("返回体body:" + jsonObject);
  68. code = jsonObject.getInteger("code");
  69. System.out.println("TB获取人员接口返回状态码:" + code);
  70. result = jsonObject.getJSONArray("result");
  71. System.out.println("TB获取人员接口返回result:" + result);
  72. if(result.isEmpty()){
  73. log.info("TB获取人员接口返回result为空,未获取到TB相关人员!");
  74. }else {
  75. TBuserId = result.getJSONObject(0).getString("userId");
  76. System.out.println("根据邮箱匹配的TBuserId:" + TBuserId);
  77. }
  78. }catch (IOException e){
  79. e.printStackTrace();
  80. }
  81. return TBuserId;
  82. }
  83. //通过IDMap查询TBuserId
  84. public String getDingdingToTBuserId(String userid){
  85. // String userid = "2055054927907044";
  86. String dingCorpId = "ding8f59ac9a4a00de1635c2f4657eb6378f";
  87. int code = 0;
  88. JSONArray result = null;
  89. try {
  90. OkHttpClient client = new OkHttpClient().newBuilder()
  91. .build();
  92. MediaType mediaType = MediaType.parse("text/plain");
  93. RequestBody body = RequestBody.create(mediaType, "");
  94. Request request = new Request.Builder()
  95. .url("https://open.teambition.com/api/idmap/query?refId="+ dingCorpId +"&refer=dingTalk-user&extraUserId="+ userid)
  96. .method("GET", null)
  97. .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
  98. .addHeader("X-Tenant-Id", tbOrganizationId)
  99. .addHeader("X-Tenant-Type", "organization")
  100. .build();
  101. Response response = client.newCall(request).execute();
  102. String bodyStr = response.body().string();
  103. JSONObject jsonObject = JSON.parseObject(bodyStr);
  104. // System.out.println("返回体body:" + jsonObject);
  105. code = jsonObject.getInteger("code");
  106. System.out.println("TB获取人员接口返回状态码:" + code);
  107. result = jsonObject.getJSONArray("result");
  108. System.out.println("TB获取人员接口返回result:" + result);
  109. }catch (IOException e){
  110. e.printStackTrace();
  111. }
  112. String tbId = result.getJSONObject(0).getString("tbId");
  113. System.out.println("根据钉钉userid匹配的TBuserId:" + tbId);
  114. return tbId;
  115. }
  116. //获取宜搭表单数据【人员信息底表】
  117. public JSONArray getYidaRenyuanxinxidibiao(){
  118. JSONObject jsonObject = null;
  119. int size = 100;
  120. int page = 1;
  121. List listAll = new ArrayList();
  122. do {
  123. //【斯曼尔架构】
  124. try {
  125. com.aliyun.dingtalkyida_1_0.Client client = createClient();
  126. com.aliyun.dingtalkyida_1_0.models.SearchFormDatasHeaders searchFormDatasHeaders = new com.aliyun.dingtalkyida_1_0.models.SearchFormDatasHeaders();
  127. searchFormDatasHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken();
  128. com.aliyun.dingtalkyida_1_0.models.SearchFormDatasRequest searchFormDatasRequest = new com.aliyun.dingtalkyida_1_0.models.SearchFormDatasRequest()
  129. .setSystemToken("J0A6698165EFMED0AHIG76FW7C6Q3ON1PG5OL482")
  130. // .setSearchFieldJson(mapAllStr)
  131. .setCurrentPage(page)
  132. .setPageSize(size)
  133. .setFormUuid("FORM-5Q966D91G96F0WI8D98Q27NSBGUR3OV02H5OL21")
  134. .setUserId("yida_pub_account")
  135. .setAppType("APP_QHPV3T4ZU2Y88Q4U0UDA");
  136. SearchFormDatasResponse searchFormDatasResponse = client.searchFormDatasWithOptions(searchFormDatasRequest, searchFormDatasHeaders, new RuntimeOptions());
  137. // System.out.println(JSON.toJSONString(searchFormDatasResponse.getBody()));
  138. String s = JSON.toJSONString(searchFormDatasResponse.getBody());
  139. jsonObject = JSON.parseObject(s);
  140. // System.out.println("钉钉差旅补贴数据高级条件查询【人员信息底表】接口object对象:" + jsonObject);
  141. } catch (TeaException err) {
  142. if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
  143. // err 中含有 code 和 message 属性,可帮助开发定位问题
  144. }
  145. } catch (Exception _err) {
  146. TeaException err = new TeaException(_err.getMessage(), _err);
  147. if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
  148. // err 中含有 code 和 message 属性,可帮助开发定位问题
  149. }
  150. }
  151. JSONArray data = jsonObject.getJSONArray("data");
  152. // System.out.println("返回的宜搭data:" + data);
  153. if (data.isEmpty()) {
  154. System.out.println("查询【人员信息底表】返回数据为空!");
  155. } else {
  156. for (int i = 0; i < data.size(); i++) {
  157. JSONObject formData = data.getJSONObject(i).getJSONObject("formData");
  158. // System.out.println("循环返回的宜搭formData:" + formData);
  159. Map map = new HashMap<>();
  160. //实例ID
  161. String shiliID = data.getJSONObject(i).getString("formInstanceId");
  162. System.out.println("实例ID===>" + shiliID);
  163. //钉钉userid
  164. String userid = formData.getString("textField_lo5h5imc");
  165. System.out.println("钉钉userid===>" + userid);
  166. //人员姓名
  167. String username = formData.getString("textField_lo5h5ime");
  168. System.out.println("人员姓名===>" + username);
  169. //主部门
  170. String zhubumen = formData.getString("textField_lo5h5imj");
  171. System.out.println("主部门===>" + zhubumen);
  172. //职位
  173. String zhiwei = formData.getString("textField_los37klu");
  174. System.out.println("职位===>" + username);
  175. //邮箱
  176. String youoxiang = formData.getString("textField_los37klv");
  177. System.out.println("邮箱===>" + zhubumen);
  178. map.put("shiliID",shiliID);
  179. map.put("userid",userid);
  180. map.put("username",username);
  181. map.put("zhubumen",zhubumen);
  182. map.put("zhiwei",zhiwei);
  183. map.put("youxiang",youoxiang);
  184. System.out.println("每次封装人员信息的map:" + map);
  185. listAll.add(map);
  186. }
  187. }
  188. if (jsonObject.getFloat("totalCount") / 100 > jsonObject.getInteger("currentPage")){
  189. page = page + 1;
  190. System.out.println("下一次待查询分页:" + page);
  191. }
  192. }while (jsonObject.getFloat("totalCount") / 100 > jsonObject.getInteger("currentPage"));
  193. JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(listAll));
  194. System.out.println("封装【人员信息底表】明细jsonArray:" + jsonArray);
  195. return jsonArray;
  196. }
  197. //获取钉钉人员-同步至宜搭人员信息表
  198. @Override
  199. public String addDingdingRenyuan(){
  200. //在职员工id列表的循环获取
  201. DingTalkClient client1 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/smartwork/hrm/employee/queryonjob");
  202. OapiSmartworkHrmEmployeeQueryonjobRequest request1 = new OapiSmartworkHrmEmployeeQueryonjobRequest();
  203. //企业在职员工userid列表
  204. int offset = 0;//分页游标,从0开始
  205. int size = 20;//分页大小,最大50
  206. JSONObject result1;
  207. do {
  208. List<String> list = new ArrayList<>();
  209. System.out.println("测试分页值:" + offset);
  210. try {
  211. request1.setStatusList("2,3,5,-1");
  212. request1.setOffset((long) offset);
  213. request1.setSize((long) size);
  214. OapiSmartworkHrmEmployeeQueryonjobResponse response1 = client1.execute(request1, accessTokenService.getAccessToken());
  215. employee1 = response1.getBody();
  216. System.out.println(response1.getBody());
  217. } catch (ApiException e) {
  218. e.printStackTrace();
  219. }
  220. //通过fastjson工具转换成json对象,逐层解析
  221. JSONObject jsonObject1 = JSON.parseObject(employee1);
  222. result1 = jsonObject1.getJSONObject("result");
  223. String dataList = result1.getString("data_list");
  224. //将String数组进行处理,去掉所有的双引号("")和中括号([])
  225. String dataRes = dataList.replace("\"", "").
  226. replaceAll("\\[", "").
  227. replaceAll("\\]", "");
  228. list.add(dataRes);
  229. String userid1 = list.toString().replace("\"", "").
  230. replaceAll("\\[", "").
  231. replaceAll("\\]", "");
  232. /*---获取花名册数据---*/
  233. try {
  234. DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/smartwork/hrm/employee/list");
  235. OapiSmartworkHrmEmployeeListRequest request = new OapiSmartworkHrmEmployeeListRequest();
  236. request.setUseridList(userid1);
  237. //需要获取的花名册字段信息
  238. //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");
  239. OapiSmartworkHrmEmployeeListResponse response = client.execute(request, accessTokenService.getAccessToken());
  240. huamingce1 = response.getBody();
  241. System.out.println(response.getBody());
  242. }catch (ApiException e){
  243. e.printStackTrace();
  244. }
  245. //通过fastjson工具转换成json对象,逐层解析
  246. //将String类型的花名册json数据转换为Object数据对象
  247. JSONObject jsonObject = JSON.parseObject(huamingce1);
  248. //直接将花名册对象通过Object转换成Array数组格式
  249. JSONArray resultArray = jsonObject.getJSONArray("result");
  250. System.out.println("Array===>" + resultArray);
  251. /*---获取花名册数据---*/
  252. for (int i = 0; i<resultArray.size(); i++) {
  253. JSONArray fieldListArray = resultArray
  254. .getJSONObject(i).getJSONArray("field_list");
  255. String userId = resultArray.getJSONObject(i).getString("userid");
  256. System.out.println("员工id:" + userId);
  257. String userName = null;
  258. String zhubumen = null;
  259. String zhiwei = null;
  260. String youxiang = null;
  261. for (int a = 0; a<fieldListArray.size(); a++) {
  262. String fieldCode = fieldListArray
  263. .getJSONObject(a)
  264. .getString("field_code");
  265. switch (fieldCode) {
  266. //姓名
  267. case "sys00-name":
  268. if (fieldListArray.getJSONObject(a).getString("value") != null) {
  269. System.out.println("***《《《姓名》》》***-->" + fieldListArray.getJSONObject(a).getString("value"));
  270. userName = fieldListArray.getJSONObject(a).getString("value");
  271. }
  272. break;
  273. //主部门
  274. case "sys00-mainDept":
  275. if (fieldListArray.getJSONObject(a).getString("value") != null){
  276. System.out.println("***主部门***-->" + fieldListArray.getJSONObject(a).getString("value"));
  277. zhubumen = fieldListArray.getJSONObject(a).getString("value");
  278. }
  279. break;
  280. //职位
  281. case "sys00-position":
  282. if (fieldListArray.getJSONObject(a).getString("value") != null){
  283. System.out.println("***职位***-->" + fieldListArray.getJSONObject(a).getString("value"));
  284. zhiwei = fieldListArray.getJSONObject(a).getString("value");
  285. }
  286. break;
  287. //邮箱
  288. case "sys00-email":
  289. if (fieldListArray.getJSONObject(a).getString("value") != null){
  290. System.out.println("***邮箱***-->" + fieldListArray.getJSONObject(a).getString("value"));
  291. youxiang = fieldListArray.getJSONObject(a).getString("value");
  292. }
  293. break;
  294. }
  295. }
  296. //判断宜搭人员信息表是否有当前人员userid
  297. /*同步至宜搭*/
  298. Map map = new HashMap();
  299. //人员空间
  300. map.put("employeeField_lo5h5iml",userId);
  301. //钉钉userid
  302. map.put("textField_lo5h5imc", userId);
  303. //姓名
  304. map.put("textField_lo5h5ime", userName);
  305. //主部门
  306. map.put("textField_lo5h5imj", zhubumen);
  307. //职位
  308. map.put("textField_los37klu", zhiwei);
  309. //邮箱
  310. map.put("textField_los37klv", youxiang);
  311. String mapJson = JSON.toJSONString(map);
  312. System.out.println("mapJson:" + mapJson);
  313. //宜搭表单判断查询条件
  314. Map map1 = new HashMap();
  315. //字段编号
  316. map1.put("key", "textField_lo5h5imc");
  317. //同步类型
  318. map1.put("value", userId);
  319. //控件类型
  320. map1.put("type", "TEXT");
  321. //逻辑判断符
  322. map1.put("operator", "eq");
  323. //控件名称
  324. map1.put("componentName", "TextField");
  325. List list11 = new ArrayList();
  326. list11.add(map1);
  327. String listJson = JSON.toJSONString(list11);
  328. System.out.println("查询条件listJson:" + listJson);
  329. //新增或更新表单实例【宜搭】
  330. try {
  331. com.aliyun.dingtalkyida_1_0.Client client11 = createClient();
  332. com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders createOrUpdateFormDataHeaders = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders();
  333. createOrUpdateFormDataHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken();
  334. com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest createOrUpdateFormDataRequest = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest()
  335. //应用秘钥
  336. .setSystemToken("J0A6698165EFMED0AHIG76FW7C6Q3ON1PG5OL482")
  337. //表单编码
  338. .setFormUuid("FORM-5Q966D91G96F0WI8D98Q27NSBGUR3OV02H5OL21")
  339. .setUserId("yida_pub_account")
  340. .setSearchCondition(listJson)
  341. //应用编码
  342. .setAppType("APP_QHPV3T4ZU2Y88Q4U0UDA")
  343. .setFormDataJson(mapJson);
  344. CreateOrUpdateFormDataResponse orUpdateFormDataWithOptions = client11.createOrUpdateFormDataWithOptions(createOrUpdateFormDataRequest, createOrUpdateFormDataHeaders, new RuntimeOptions());
  345. String s = JSON.toJSONString(orUpdateFormDataWithOptions.getBody());
  346. jsonObject = JSON.parseObject(s);
  347. System.out.println("【创建或更新】表单object对象:" + jsonObject);
  348. } catch (TeaException err) {
  349. if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
  350. // err 中含有 code 和 message 属性,可帮助开发定位问题
  351. }
  352. } catch (Exception _err) {
  353. TeaException err = new TeaException(_err.getMessage(), _err);
  354. if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
  355. // err 中含有 code 和 message 属性,可帮助开发定位问题
  356. }
  357. }
  358. }
  359. /*同步至宜搭*/
  360. if (result1.getString("next_cursor") != null) {
  361. // || result1.getString("data_list") != ""
  362. // offset = offset + size;
  363. try {
  364. offset = result1.getInteger("next_cursor");
  365. }catch (Exception e){
  366. e.printStackTrace();
  367. }
  368. }
  369. } while (result1.getString("next_cursor") != null);
  370. return "同步环世花名册人员-->宜搭人员信息表单完成";
  371. }
  372. //根据任务ID获取任务详情
  373. public JSONArray getRenwuxiangqing(String renwuId){
  374. // String renwuId = "653a4ae8dba1ed3bcdae96a1";
  375. int code = 0;
  376. JSONArray result = null;
  377. JSONArray resultArray = null;
  378. try {
  379. OkHttpClient client = new OkHttpClient().newBuilder()
  380. .build();
  381. MediaType mediaType = MediaType.parse("text/plain");
  382. RequestBody body = RequestBody.create(mediaType, "");
  383. Request request = new Request.Builder()
  384. .url("https://open.teambition.com/api/v3/task/query?taskId=" + renwuId)
  385. .method("GET", null)
  386. .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
  387. .addHeader("X-Tenant-Id", tbOrganizationId)
  388. .addHeader("X-Tenant-Type", "organization")
  389. .build();
  390. Response response = client.newCall(request).execute();
  391. String bodyStr = response.body().string();
  392. JSONObject jsonObject = JSON.parseObject(bodyStr);
  393. // System.out.println("返回体body:" + jsonObject);
  394. code = jsonObject.getInteger("code");
  395. System.out.println("TB获取任务详情接口返回状态码:" + code);
  396. result = jsonObject.getJSONArray("result");
  397. System.out.println("TB获取任务详情接口返回result:" + result);
  398. resultArray = JSON.parseArray(result.toJSONString());
  399. System.out.println("接口返回任务详情数组:" + resultArray);
  400. }catch (IOException e){
  401. e.printStackTrace();
  402. }
  403. return resultArray;
  404. }
  405. //根据项目ID获取项目名称
  406. public String getTBxaingmu(String xiangmuID){
  407. // String xiangmuID = "6527a5df45765228a54babbf";
  408. int code = 0;
  409. JSONArray result = null;
  410. String xiangmuName = null;
  411. try {
  412. OkHttpClient client = new OkHttpClient().newBuilder()
  413. .build();
  414. Request request = new Request.Builder()
  415. .url("https://open.teambition.com/api/v3/project/query?projectIds=" + xiangmuID)
  416. .method("GET", null)
  417. .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
  418. .addHeader("X-Tenant-Id", tbOrganizationId)
  419. .addHeader("X-Tenant-Type", "organization")
  420. .build();
  421. Response response = client.newCall(request).execute();
  422. String bodyStr = response.body().string();
  423. JSONObject jsonObject = JSON.parseObject(bodyStr);
  424. System.out.println("返回体body:" + jsonObject);
  425. code = jsonObject.getInteger("code");
  426. System.out.println("查询【项目信息】接口返回的状态码(200成功,400异常):" + code);
  427. result = jsonObject.getJSONArray("result");
  428. xiangmuName = result.getJSONObject(0).getString("name");
  429. System.out.println("项目名称:" + xiangmuName);
  430. }catch (IOException e){
  431. e.printStackTrace();
  432. }
  433. return xiangmuName;
  434. }
  435. //根据项目ID获取项目分组ID
  436. public String getXiangmufenzuID(String xiangmuID){
  437. //项目ID
  438. // String xiangmuID = "652e28f8d74c5cc851b1a732";
  439. int code = 0;
  440. JSONArray result = null;
  441. String xiangmufenzuID = "";
  442. try {
  443. OkHttpClient client = new OkHttpClient().newBuilder()
  444. .build();
  445. MediaType mediaType = MediaType.parse("text/plain");
  446. RequestBody body = RequestBody.create(mediaType, "");
  447. Request request = new Request.Builder()
  448. .url("https://open.teambition.com/api/v3/project/"+ xiangmuID +"/project-tag")
  449. .method("GET", null)
  450. .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
  451. .addHeader("X-Tenant-Id", tbOrganizationId)
  452. .addHeader("X-Tenant-Type", "organization")
  453. .build();
  454. Response response = client.newCall(request).execute();
  455. String bodyStr = response.body().string();
  456. JSONObject jsonObject = JSON.parseObject(bodyStr);
  457. System.out.println("返回体body:" + jsonObject);
  458. code = jsonObject.getInteger("code");
  459. System.out.println("查询【项目分组】接口返回的状态码(200成功,400异常):" + code);
  460. result = jsonObject.getJSONArray("result");
  461. if (!result.isEmpty()){
  462. xiangmufenzuID = result.getString(0);
  463. }
  464. }catch (IOException e){
  465. e.printStackTrace();
  466. }
  467. System.out.println("项目分组ID:" + xiangmufenzuID);
  468. return xiangmufenzuID;
  469. }
  470. //根据项目分组ID获取项目分组名称
  471. public String getXiangmufenzuName(String xiangmufenzuID){
  472. //项目分组ID
  473. // String xiangmufenzuID = "645afc0bf1e174064c4e0ea1";
  474. int code = 0;
  475. JSONArray result = null;
  476. String xiangmufenzuName = "";
  477. try {
  478. OkHttpClient client = new OkHttpClient().newBuilder()
  479. .build();
  480. MediaType mediaType = MediaType.parse("text/plain");
  481. RequestBody body = RequestBody.create(mediaType, "");
  482. Request request = new Request.Builder()
  483. .url("https://open.teambition.com/api/v3/project-tag/query?ids="+ xiangmufenzuID)
  484. .method("GET", null)
  485. .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
  486. .addHeader("X-Tenant-Id", tbOrganizationId)
  487. .addHeader("X-Tenant-Type", "organization")
  488. .build();
  489. Response response = client.newCall(request).execute();
  490. String bodyStr = response.body().string();
  491. JSONObject jsonObject = JSON.parseObject(bodyStr);
  492. System.out.println("返回体body:" + jsonObject);
  493. code = jsonObject.getInteger("code");
  494. System.out.println("查询【项目分组名称】接口返回的状态码(200成功,400异常):" + code);
  495. result = jsonObject.getJSONArray("result");
  496. JSONObject jsonObject1 = result.getJSONObject(0);
  497. xiangmufenzuName = jsonObject1.getString("name");
  498. }catch (IOException e){
  499. e.printStackTrace();
  500. }
  501. System.out.println("项目分组名称:" + xiangmufenzuName);
  502. return xiangmufenzuName;
  503. }
  504. //根据自定义字段ID【业务类型】获取自定义字段内容
  505. public JSONArray getTBzidingyi() {
  506. //业务类型
  507. String zidingyiID = "642a8ff24ed7d8c44b469ced";
  508. int code = 0;
  509. JSONArray result = null;
  510. try {
  511. OkHttpClient client = new OkHttpClient().newBuilder()
  512. .build();
  513. MediaType mediaType = MediaType.parse("text/plain");
  514. RequestBody body = RequestBody.create(mediaType, "");
  515. Request request = new Request.Builder()
  516. .url("https://open.teambition.com/api/v3/customfield/search?cfIds=" + zidingyiID)
  517. .method("GET", null)
  518. .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
  519. .addHeader("X-Tenant-Id", tbOrganizationId)
  520. .addHeader("X-Tenant-Type", "organization")
  521. .build();
  522. Response response = client.newCall(request).execute();
  523. String bodyStr = response.body().string();
  524. JSONObject jsonObject = JSON.parseObject(bodyStr);
  525. System.out.println("返回体body:" + jsonObject);
  526. code = jsonObject.getInteger("code");
  527. System.out.println("查询【自定义字段:业务类型】接口返回的状态码(200成功,400异常):" + code);
  528. result = jsonObject.getJSONArray("result");
  529. System.out.println("result:" + result);
  530. }catch (IOException e){
  531. e.printStackTrace();
  532. }
  533. JSONArray yewuleixingArray = result.getJSONObject(0).getJSONArray("choices");
  534. System.out.println("【业务类型】值:" + yewuleixingArray);
  535. return yewuleixingArray;
  536. }
  537. //获取迭代类型
  538. public String getDiedai(String xmid, String ddid){
  539. // String xmid = "6476b93d344ff5c76845eb8d";
  540. // String ddid = "6528b83315680fd221e3c1b6";
  541. int code = 0;
  542. JSONArray result = null;
  543. String diedaiName = "";
  544. try {
  545. OkHttpClient client = new OkHttpClient().newBuilder()
  546. .build();
  547. MediaType mediaType = MediaType.parse("text/plain");
  548. RequestBody body = RequestBody.create(mediaType, "");
  549. Request request = new Request.Builder()
  550. .url("https://open.teambition.com/api/v3/project/" + xmid + "/sprint/search?sprintIds=" + ddid)
  551. .method("GET", null)
  552. .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
  553. .addHeader("X-Tenant-Id", tbOrganizationId)
  554. .addHeader("X-Tenant-Type", "organization")
  555. .build();
  556. Response response = client.newCall(request).execute();
  557. String bodyStr = response.body().string();
  558. JSONObject jsonObject = JSON.parseObject(bodyStr);
  559. System.out.println("返回体body:" + jsonObject);
  560. code = jsonObject.getInteger("code");
  561. System.out.println("查询【迭代名称】接口返回的状态码(200成功,400异常):" + code);
  562. result = jsonObject.getJSONArray("result");
  563. System.out.println("result:" + result);
  564. if (result != null){
  565. diedaiName = result.getJSONObject(0).getString("name");
  566. }
  567. }catch (IOException e){
  568. e.printStackTrace();
  569. }
  570. System.out.println("迭代名称:" + diedaiName);
  571. return diedaiName;
  572. }
  573. //获取IDX分组下的目录名称
  574. public JSONArray getIDXfenzu(){
  575. //获取项目分组【IDX项目】下面的分组
  576. String IDXxiangmufenzuID = "645def56443fd5770693c3f8";
  577. int code = 0;
  578. JSONArray result = null;
  579. try {
  580. OkHttpClient client = new OkHttpClient().newBuilder()
  581. .build();
  582. MediaType mediaType = MediaType.parse("text/plain");
  583. RequestBody body = RequestBody.create(mediaType, "");
  584. Request request = new Request.Builder()
  585. .url("https://open.teambition.com/api/v3/project-tag/query?parentProjectTagId=" + IDXxiangmufenzuID)
  586. .method("GET", null)
  587. .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
  588. .addHeader("X-Tenant-Id", tbOrganizationId)
  589. .addHeader("X-Tenant-Type", "organization")
  590. .build();
  591. Response response = client.newCall(request).execute();
  592. String bodyStr = response.body().string();
  593. JSONObject jsonObject = JSON.parseObject(bodyStr);
  594. System.out.println("返回体body:" + jsonObject);
  595. code = jsonObject.getInteger("code");
  596. result = jsonObject.getJSONArray("result");
  597. }catch (IOException e){
  598. e.printStackTrace();
  599. }
  600. System.out.println("查询【IDX分组】下面的分组,接口返回的状态码(200成功,400异常):" + code);
  601. return result;
  602. }
  603. //查询宜搭中是否有该任务的工时
  604. public String getYida(String sjtjyf,String userid,String tbrwid,String rwgsssrq,String panduan){
  605. // String sjtjyf = "2024-01";
  606. // String userid = "2055054927907044";
  607. // String tbrwid = "65ba0be275b4750e2772c89b";
  608. // String rwgsssrq = "2024-01-25T00:00:00.000Z";
  609. //封装根据当前年份作为查询条件
  610. Map mapAll = new HashMap();
  611. // //查询实际统计月份
  612. // mapAll.put("textField_losayxi8",sjtjyf);
  613. // //人员userid
  614. // mapAll.put("textField_los8y15p",userid);
  615. // //TB任务id
  616. // mapAll.put("textField_lp8ihks3",tbrwid);
  617. // //任务工时所属日期
  618. // mapAll.put("textField_lqn3tjjv",rwgsssrq);
  619. if (panduan.equals("实际工时")){
  620. //查询实际统计月份
  621. mapAll.put("textField_losayxi8",sjtjyf);
  622. //人员userid
  623. mapAll.put("textField_los8y15p",userid);
  624. //TB任务id
  625. mapAll.put("textField_lp8ihks3",tbrwid);
  626. //任务工时所属日期
  627. mapAll.put("textField_lqn3tjjv",rwgsssrq);
  628. }else {
  629. //查询实际统计月份
  630. mapAll.put("textField_losayxi8",sjtjyf);
  631. //人员userid
  632. mapAll.put("textField_los8y15p",userid);
  633. //TB任务id
  634. mapAll.put("textField_lp8ihks3",tbrwid);
  635. //任务工时所属日期
  636. mapAll.put("textField_lqn3tjjv",rwgsssrq);
  637. //工时类型
  638. mapAll.put("textField_lrq4uku2","实际工时");
  639. }
  640. String mapAllStr = JSON.toJSONString(mapAll);
  641. System.out.println("封装查询宜搭中是否有该任务工时的字段参数:" + mapAllStr);
  642. JSONObject jsonObject = null;
  643. JSONArray data = null;
  644. int size = 100;
  645. int page = 1;
  646. //【环世架构】
  647. try {
  648. com.aliyun.dingtalkyida_1_0.Client client = createClient();
  649. com.aliyun.dingtalkyida_1_0.models.SearchFormDatasHeaders searchFormDatasHeaders = new com.aliyun.dingtalkyida_1_0.models.SearchFormDatasHeaders();
  650. searchFormDatasHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken();
  651. com.aliyun.dingtalkyida_1_0.models.SearchFormDatasRequest searchFormDatasRequest = new com.aliyun.dingtalkyida_1_0.models.SearchFormDatasRequest()
  652. .setSystemToken("J0A6698165EFMED0AHIG76FW7C6Q3ON1PG5OL482")
  653. .setSearchFieldJson(mapAllStr)
  654. .setCurrentPage(page)
  655. .setPageSize(size)
  656. .setFormUuid("FORM-BH766Y61W4CFWBS0869YFBF8COTE2QEHIH5OLM")
  657. .setUserId("yida_pub_account")
  658. .setAppType("APP_QHPV3T4ZU2Y88Q4U0UDA");
  659. SearchFormDatasResponse searchFormDatasResponse = client.searchFormDatasWithOptions(searchFormDatasRequest, searchFormDatasHeaders, new RuntimeOptions());
  660. // System.out.println(JSON.toJSONString(searchFormDatasResponse.getBody()));
  661. String s = JSON.toJSONString(searchFormDatasResponse.getBody());
  662. jsonObject = JSON.parseObject(s);
  663. // System.out.println("钉钉宜搭数据高级条件查询【宜搭工时统计表】接口object对象:" + jsonObject);
  664. data = jsonObject.getJSONArray("data");
  665. System.out.println("返回的宜搭data:" + data);
  666. } catch (TeaException err) {
  667. if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
  668. // err 中含有 code 和 message 属性,可帮助开发定位问题
  669. }
  670. } catch (Exception _err) {
  671. TeaException err = new TeaException(_err.getMessage(), _err);
  672. if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
  673. // err 中含有 code 和 message 属性,可帮助开发定位问题
  674. }
  675. }
  676. String flag = null;
  677. if (data == null || data.isEmpty()) {
  678. System.out.println("查询【宜搭工时统计表】返回数据为空!");
  679. flag = "不存在";
  680. } else {
  681. flag = "已存在";
  682. }
  683. System.out.println("查询返回结果标识:" + flag);
  684. return flag;
  685. }
  686. //统计钉钉考勤、请假、TB项目/任务工时
  687. @Override
  688. public String allTongji(int type){
  689. /**
  690. * type = 0 上月数据
  691. * type = 1 本月数据
  692. * */
  693. //TODO
  694. // type = 0;
  695. //获取当前时间
  696. Date Date = new Date(System.currentTimeMillis());
  697. System.out.println("当前时间:" + Date);
  698. String lastMonthNow = null;
  699. // //截取当天上月的年月
  700. // Calendar calendar123 = Calendar.getInstance();
  701. // calendar123.setTime(Date);
  702. // calendar123.add(Calendar.MONTH,-1);
  703. // lastMonthNow = new SimpleDateFormat("yyyy-MM").format(calendar123.getTime());
  704. // System.out.println("当天上月的日期,文本格式(月)" + lastMonthNow);
  705. if (type == 0){//上月
  706. //截取当天上月的年月
  707. Calendar calendar123 = Calendar.getInstance();
  708. calendar123.setTime(Date);
  709. calendar123.add(Calendar.MONTH,-1);
  710. lastMonthNow = new SimpleDateFormat("yyyy-MM").format(calendar123.getTime());
  711. System.out.println("当天上月的日期,文本格式(月)" + lastMonthNow);
  712. }else {//本月
  713. //截取当天本月的年月
  714. Calendar calendar123 = Calendar.getInstance();
  715. calendar123.setTime(Date);
  716. calendar123.add(Calendar.MONTH,0);
  717. lastMonthNow = new SimpleDateFormat("yyyy-MM").format(calendar123.getTime());
  718. System.out.println("当天本月的日期,文本格式(月)" + lastMonthNow);
  719. }
  720. /*计算规则*/
  721. String FORMtime = null;
  722. String TOtime = null;
  723. //查询工时使用的时间段
  724. String startDate = null;
  725. String endDate = null;
  726. // /*
  727. // * 获取前一个月的第一天和最后一天的时间
  728. // * */
  729. // Calendar calendar111 = Calendar.getInstance();
  730. // calendar111.setTime(Date);
  731. // //前一个月第一天
  732. // calendar111.add(Calendar.MONTH,-1);
  733. // calendar111.set(Calendar.DAY_OF_MONTH,1);
  734. // calendar111.set(Calendar.HOUR_OF_DAY,0);
  735. // calendar111.set(Calendar.MINUTE,0);
  736. // calendar111.set(Calendar.SECOND,0);
  737. // calendar111.set(Calendar.MILLISECOND,0);
  738. // FORMtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar111.getTime());
  739. // System.out.println("前一个月第一天零点:" + FORMtime);
  740. //
  741. // Calendar calendar222 = Calendar.getInstance();
  742. //// int month222 = calendar222.get(Calendar.MONTH);
  743. // //前一个月最后一天
  744. // calendar222.add(Calendar.MONTH,-1);
  745. // calendar222.set(Calendar.DAY_OF_MONTH,calendar222.getActualMaximum(Calendar.DAY_OF_MONTH));
  746. // calendar222.set(Calendar.HOUR_OF_DAY,0);
  747. // calendar222.set(Calendar.MINUTE,0);
  748. // calendar222.set(Calendar.SECOND,0);
  749. // calendar222.set(Calendar.MILLISECOND,0);
  750. // TOtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar222.getTime());
  751. // System.out.println("前一个月最后一天零点:" + TOtime);
  752. if (type == 0){
  753. /*
  754. * 获取前一个月的第一天和最后一天的时间
  755. * */
  756. Calendar calendar111 = Calendar.getInstance();
  757. calendar111.setTime(Date);
  758. //前一个月第一天
  759. calendar111.add(Calendar.MONTH,-1);
  760. calendar111.set(Calendar.DAY_OF_MONTH,1);
  761. calendar111.set(Calendar.HOUR_OF_DAY,0);
  762. calendar111.set(Calendar.MINUTE,0);
  763. calendar111.set(Calendar.SECOND,0);
  764. calendar111.set(Calendar.MILLISECOND,0);
  765. FORMtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar111.getTime());
  766. System.out.println("前一个月第一天零点:" + FORMtime);
  767. startDate = new SimpleDateFormat("yyyy-MM-dd").format(calendar111.getTime());
  768. System.out.println("前一个月第一天:" + startDate);
  769. Calendar calendar222 = Calendar.getInstance();
  770. // int month222 = calendar222.get(Calendar.MONTH);
  771. //前一个月最后一天
  772. calendar222.add(Calendar.MONTH,-1);
  773. calendar222.set(Calendar.DAY_OF_MONTH,calendar222.getActualMaximum(Calendar.DAY_OF_MONTH));
  774. calendar222.set(Calendar.HOUR_OF_DAY,0);
  775. calendar222.set(Calendar.MINUTE,0);
  776. calendar222.set(Calendar.SECOND,0);
  777. calendar222.set(Calendar.MILLISECOND,0);
  778. TOtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar222.getTime());
  779. System.out.println("前一个月最后一天零点:" + TOtime);
  780. endDate = new SimpleDateFormat("yyyy-MM-dd").format(calendar222.getTime());
  781. System.out.println("前一个月最后一天:" + endDate);
  782. }else {
  783. /*
  784. * 获取本月的第一天和最后一天的时间
  785. * */
  786. Calendar calendar111 = Calendar.getInstance();
  787. calendar111.setTime(Date);
  788. //本月第一天
  789. calendar111.add(Calendar.MONTH,0);
  790. calendar111.set(Calendar.DAY_OF_MONTH,1);
  791. calendar111.set(Calendar.HOUR_OF_DAY,0);
  792. calendar111.set(Calendar.MINUTE,0);
  793. calendar111.set(Calendar.SECOND,0);
  794. calendar111.set(Calendar.MILLISECOND,0);
  795. FORMtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar111.getTime());
  796. System.out.println("本月第一天零点:" + FORMtime);
  797. startDate = new SimpleDateFormat("yyyy-MM-dd").format(calendar111.getTime());
  798. System.out.println("本月第一天:" + startDate);
  799. Calendar calendar222 = Calendar.getInstance();
  800. // int month222 = calendar222.get(Calendar.MONTH);
  801. //本月最后一天
  802. calendar222.add(Calendar.MONTH,0);
  803. calendar222.set(Calendar.DAY_OF_MONTH,calendar222.getActualMaximum(Calendar.DAY_OF_MONTH));
  804. calendar222.set(Calendar.HOUR_OF_DAY,0);
  805. calendar222.set(Calendar.MINUTE,0);
  806. calendar222.set(Calendar.SECOND,0);
  807. calendar222.set(Calendar.MILLISECOND,0);
  808. TOtime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar222.getTime());
  809. System.out.println("本月最后一天零点:" + TOtime);
  810. endDate = new SimpleDateFormat("yyyy-MM-dd").format(calendar222.getTime());
  811. System.out.println("本月最后一天:" + endDate);
  812. }
  813. //TODO 【手动同步】指定月份的数据,记得注释掉!!!
  814. // lastMonthNow = "2024-02";
  815. //TODO 【手动同步】指定月份的数据,记得注释掉!!!
  816. // FORMtime = "2024-02-01 00:00:00";
  817. // TOtime = "2024-02-29 00:00:00";
  818. // startDate = "2024-02-01";
  819. // endDate = "2024-02-29";
  820. /*根据自定义字段ID获取【业务类型】选项数组*/
  821. log.info("通过封装接口获取【业务类型】选项数组。");
  822. JSONArray tBzidingyi = getTBzidingyi();
  823. //根据人员信息底表获取【钉钉请假】数据
  824. /*通过封装接口获取【人员信息底表】*/
  825. JSONArray yidaRenyuanxinxidibiao = getYidaRenyuanxinxidibiao();
  826. log.info("通过封装接口获取【人员信息底表】:" + yidaRenyuanxinxidibiao);
  827. //TODO 人员信息底表获取的第一个人员信息,可能会存在根据邮箱匹配不到TB人员信息的情况。单独同步使用。
  828. // String aaa = "[{\"zhubumen\":\"QCC组\",\"zhiwei\":\"测试工程师\n\",\"userid\":\"085953146222434489\",\"username\":\"国维杰\",\"youxiang\":\"guowj@olymtech.com\"}]";
  829. // JSONArray yidaRenyuanxinxidibiao = JSON.parseArray(aaa);
  830. // log.info("【TEST】通过封装接口获取【人员信息底表】:" + yidaRenyuanxinxidibiao);
  831. for (int i = 0; i < yidaRenyuanxinxidibiao.size(); i++) {
  832. //员工id
  833. String userId = yidaRenyuanxinxidibiao.getJSONObject(i).getString("userid");
  834. System.out.println("员工id:" + userId);
  835. //员工姓名
  836. String userName = yidaRenyuanxinxidibiao.getJSONObject(i).getString("username");
  837. System.out.println("员工姓名:" + userName);
  838. //主部门
  839. String zhubumen = yidaRenyuanxinxidibiao.getJSONObject(i).getString("zhubumen");
  840. System.out.println("主部门:" + zhubumen);
  841. //职位
  842. String zhiwei = yidaRenyuanxinxidibiao.getJSONObject(i).getString("zhiwei");
  843. System.out.println("职位:" + zhiwei);
  844. //邮箱
  845. String youxiang = yidaRenyuanxinxidibiao.getJSONObject(i).getString("youxiang");
  846. System.out.println("邮箱:" + youxiang);
  847. if (youxiang == null){
  848. log.info("获取人员信息底表【邮箱为空】,该钉钉人员没有维护邮箱或者人员已离职!");
  849. }else {
  850. //获取TB人员userId
  851. log.info("根据钉钉userid匹配TB人员userId===");
  852. // String TBuserId = getTBuserId(youxiang);
  853. // if (TBuserId == null){
  854. // TBuserId = getTBuserId(youxiang);
  855. //
  856. // if (TBuserId == null){
  857. // TBuserId = getTBuserId(youxiang);
  858. // }
  859. // }
  860. // log.info("根据邮箱匹配到的TB人员userId===" + TBuserId);
  861. String TBuserId = getDingdingToTBuserId(userId);
  862. log.info("根据钉钉userid匹配到的TB人员userId===" + TBuserId);
  863. if (TBuserId == null) {
  864. log.info("根据钉钉userid没有匹配到TB人员userId,为空不处理同步TB数据,只同步钉钉数据!");
  865. /*同步钉钉数据*/
  866. //应出勤天数
  867. float yingchuqintianshu = 0;
  868. //请假天数
  869. float qingjiatianshu = 0;
  870. //查询上月考勤数据,统计上月应出勤天数、请假天数
  871. try {
  872. DingTalkClient client11 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/getcolumnval");
  873. OapiAttendanceGetcolumnvalRequest req = new OapiAttendanceGetcolumnvalRequest();
  874. //TODO 待查询人员的userid
  875. req.setUserid(userId);
  876. //考勤报表列定义查出来的工作时长的列id(固定)
  877. req.setColumnIdList("176150482,985267953");
  878. //TODO 查询开始时间
  879. req.setFromDate(StringUtils.parseDateTime(FORMtime));
  880. //TODO 查询结束时间
  881. req.setToDate(StringUtils.parseDateTime(TOtime));
  882. OapiAttendanceGetcolumnvalResponse rsp = client11.execute(req, accessTokenService.getAccessToken());
  883. // System.out.println(rsp.getBody());
  884. String string = rsp.getBody();
  885. JSONObject jsonObjectKaoqin = JSON.parseObject(string);
  886. int errcode = jsonObjectKaoqin.getInteger("errcode");
  887. System.out.println("考勤时间周期查询结果状态码:" + errcode);
  888. String errmsg = jsonObjectKaoqin.getString("errmsg");
  889. System.out.println("考勤时间周期查询结果状态信息:" + errmsg);
  890. if (errcode != 0) {
  891. log.info("考勤时间周期查询结果反馈异常,异常状态码:" + errcode + "【" + errmsg + "】");
  892. } else {
  893. //应出勤天数
  894. JSONArray jsonArray1 = jsonObjectKaoqin.getJSONObject("result").
  895. getJSONArray("column_vals").
  896. getJSONObject(0).
  897. getJSONArray("column_vals");
  898. for (int x = 0; x < jsonArray1.size(); x++) {
  899. //应出勤天数
  900. String value = jsonArray1.getJSONObject(x).getString("value");
  901. System.out.println("应出勤天数:" + value);
  902. float v = Float.parseFloat(value);
  903. if (v == 1) {
  904. System.out.println("应出勤天数,进行循环统计!");
  905. yingchuqintianshu = yingchuqintianshu + 1;
  906. }
  907. }
  908. //请假天数
  909. JSONArray jsonArray = jsonObjectKaoqin.getJSONObject("result").
  910. getJSONArray("column_vals").
  911. getJSONObject(1).
  912. getJSONArray("column_vals");
  913. for (int x = 0; x < jsonArray.size(); x++) {
  914. //请假天数
  915. String value = jsonArray.getJSONObject(x).getString("value");
  916. System.out.println("请假天数:" + value);
  917. float v = Float.parseFloat(value);
  918. if (v > 0) {
  919. System.out.println("请假天数,进行循环统计!");
  920. qingjiatianshu = qingjiatianshu + v;
  921. }
  922. }
  923. }
  924. } catch (ApiException e) {
  925. e.printStackTrace();
  926. }
  927. //应出勤天数
  928. BigDecimal ycqts = new BigDecimal(yingchuqintianshu);
  929. BigDecimal ycqtsAll = ycqts.setScale(2, BigDecimal.ROUND_DOWN);
  930. System.out.println("应出勤天数(浮点数,保留2位小数):" + ycqtsAll);
  931. //请假天数
  932. BigDecimal qjts = new BigDecimal(qingjiatianshu);
  933. BigDecimal qjtsAll = qjts.setScale(2, BigDecimal.ROUND_DOWN);
  934. System.out.println("请假天数(浮点数,保留2位小数):" + qjtsAll);
  935. /*同步至宜搭*/
  936. Map map = new HashMap();
  937. //实际统计月份
  938. map.put("textField_losayxi8", lastMonthNow);
  939. //钉钉userid
  940. map.put("textField_los8y15p", userId);
  941. //姓名
  942. map.put("textField_los8y15q", userName);
  943. //主部门
  944. map.put("textField_los8y15s", zhubumen);
  945. //职位
  946. map.put("textField_los8y15x", zhiwei);
  947. //邮箱
  948. map.put("textField_los8y15y", youxiang);
  949. /*TB项目/任务数据*/
  950. // //项目名称
  951. // map.put("textField_lp0m06bd", "");
  952. // //任务名称
  953. // map.put("textField_lp0m06be", "");
  954. // //业务类型
  955. // map.put("textField_los8y15z", "");
  956. // //统一工时数(天)
  957. // map.put("numberField_los8y164", 0);
  958. /*钉钉考勤数据*/
  959. //每月人天(应出勤天数)
  960. map.put("numberField_los8y16g", ycqtsAll);
  961. //请假天数
  962. map.put("numberField_los8y16f", qjtsAll);
  963. //是否全投入
  964. // map.put("selectField_los8y16e", "否");
  965. /*计算字段*/
  966. // //人月数据:统一工时数(天)/每月人天
  967. // map.put("numberField_los8y16c", 0);
  968. // //SaaS合计:统一工时数(天)+请假成本(天)
  969. // map.put("numberField_los8y16h", 0);
  970. // //占比:SaaS合计/每月人天
  971. // map.put("numberField_los8y16p", 0);
  972. String mapJson = JSON.toJSONString(map);
  973. System.out.println("mapJson:" + mapJson);
  974. //宜搭表单判断查询条件
  975. //判断宜搭人员信息表是否有当前人员userid
  976. Map map1 = new HashMap();
  977. //字段编号
  978. map1.put("key", "textField_los8y15p");
  979. //同步类型
  980. map1.put("value", userId);
  981. // map1.put("value", "userId");
  982. //控件类型
  983. map1.put("type", "TEXT");
  984. //逻辑判断符
  985. map1.put("operator", "eq");
  986. //控件名称
  987. map1.put("componentName", "TextField");
  988. Map map2 = new HashMap();
  989. //字段编号
  990. map2.put("key", "textField_losayxi8");
  991. //同步类型
  992. map2.put("value", lastMonthNow);
  993. //控件类型
  994. map2.put("type", "TEXT");
  995. //逻辑判断符
  996. map2.put("operator", "eq");
  997. //控件名称
  998. map2.put("componentName", "TextField");
  999. List list11 = new ArrayList();
  1000. list11.add(map1);
  1001. list11.add(map2);
  1002. String listJson = JSON.toJSONString(list11);
  1003. System.out.println("查询条件listJson:" + listJson);
  1004. //将汇总数据写入【宜搭汇总表】
  1005. JSONObject jsonObject;
  1006. //新增或更新表单实例【宜搭】
  1007. try {
  1008. com.aliyun.dingtalkyida_1_0.Client client11 = createClient();
  1009. com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders createOrUpdateFormDataHeaders = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders();
  1010. createOrUpdateFormDataHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken();
  1011. com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest createOrUpdateFormDataRequest = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest()
  1012. //应用秘钥
  1013. .setSystemToken("J0A6698165EFMED0AHIG76FW7C6Q3ON1PG5OL482")
  1014. //表单编码
  1015. .setFormUuid("FORM-BH766Y61W4CFWBS0869YFBF8COTE2QEHIH5OLM")
  1016. .setUserId("yida_pub_account")
  1017. .setSearchCondition(listJson)
  1018. //应用编码
  1019. .setAppType("APP_QHPV3T4ZU2Y88Q4U0UDA")
  1020. .setFormDataJson(mapJson);
  1021. CreateOrUpdateFormDataResponse orUpdateFormDataWithOptions = client11.createOrUpdateFormDataWithOptions(createOrUpdateFormDataRequest, createOrUpdateFormDataHeaders, new RuntimeOptions());
  1022. String s = JSON.toJSONString(orUpdateFormDataWithOptions.getBody());
  1023. jsonObject = JSON.parseObject(s);
  1024. // System.out.println("【创建或更新】表单object对象:" + jsonObject);
  1025. } catch (TeaException err) {
  1026. if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
  1027. // err 中含有 code 和 message 属性,可帮助开发定位问题
  1028. }
  1029. } catch (Exception _err) {
  1030. TeaException err = new TeaException(_err.getMessage(), _err);
  1031. if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
  1032. // err 中含有 code 和 message 属性,可帮助开发定位问题
  1033. }
  1034. }
  1035. /*同步至宜搭*/
  1036. } else {
  1037. //获取该人员在TB中的实际工时信息
  1038. int code = 0;
  1039. JSONArray result = null;
  1040. try {
  1041. OkHttpClient client = new OkHttpClient().newBuilder()
  1042. .build();
  1043. MediaType mediaType = MediaType.parse("text/plain");
  1044. RequestBody body = RequestBody.create(mediaType, "");
  1045. Request request = new Request.Builder()
  1046. .url("https://open.teambition.com/api/worktime/query?userId=" + TBuserId + "&pageSize=1000&pageToken=&startDate="+ startDate +"&endDate="+ endDate)
  1047. .method("GET", null)
  1048. .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
  1049. .addHeader("X-Tenant-Id", tbOrganizationId)
  1050. .addHeader("X-Tenant-Type", "organization")
  1051. .build();
  1052. Response response = client.newCall(request).execute();
  1053. String bodyStr = response.body().string();
  1054. JSONObject jsonObject = JSON.parseObject(bodyStr);
  1055. // System.out.println("返回体body:" + jsonObject);
  1056. code = jsonObject.getInteger("code");
  1057. System.out.println("TB获取人员实际工时接口返回状态码:" + code);
  1058. result = jsonObject.getJSONArray("result");
  1059. // System.out.println("TB获取人员实际工时接口返回result:" + result);
  1060. } catch (IOException e) {
  1061. e.printStackTrace();
  1062. }
  1063. if (!result.isEmpty()){
  1064. log.info("该人员实际工时不为空,将直接获取实际工时!");
  1065. for (int i1 = 0; i1 < result.size(); i1++) {
  1066. //工时关联的task ID
  1067. String objectId = result.getJSONObject(i1).getString("objectId");
  1068. System.out.println("工时关联的task ID:" + objectId);
  1069. //任务工时所属日期
  1070. String rwgsssrq = result.getJSONObject(i1).getString("date");
  1071. System.out.println("任务工时所属日期:" + rwgsssrq);
  1072. //拼接任务链接
  1073. // String renwuURL = "https://www.teambition.com/task/" + objectId;
  1074. // System.out.println("拼接的任务url:" + renwuURL);
  1075. //工时(毫秒:转换成天)
  1076. long worktime = result.getJSONObject(i1).getLong("worktime");
  1077. System.out.println("实际工时(毫秒):" + worktime);
  1078. double gongshi = (double) worktime / 3600000 / 8;
  1079. BigDecimal gongshiTwo = new BigDecimal(gongshi);
  1080. double gs = gongshiTwo.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
  1081. System.out.println("实际工时(毫秒转换成天):" + gs);
  1082. //汇总工时
  1083. // BigDecimal gsDouble = new BigDecimal(gs);
  1084. // gsAll = gsAll.add(gsDouble);
  1085. //根据任务ID获取任务详情,解析得到任务标题和项目ID
  1086. JSONArray renwuxiangqing = getRenwuxiangqing(objectId);
  1087. JSONObject jsonObject = renwuxiangqing.getJSONObject(0);
  1088. //是否放入回收站
  1089. String isArchived = jsonObject.getString("isArchived");
  1090. System.out.println("是否放入回收站:" + isArchived);
  1091. String content = "";
  1092. String yewuleixing = "";
  1093. String tBxaingmuName = "";
  1094. String xiangmufenzuName = "";
  1095. String diedaiName = "";
  1096. String XXX = "";
  1097. if (renwuxiangqing == null){
  1098. log.info("该任务不存在!");
  1099. } else if (isArchived.equals("true")) {
  1100. log.info("该任务已放入回收站,不统计!");
  1101. } else {
  1102. log.info("该任务没有放入回收站,正常统计!");
  1103. //任务标题
  1104. content = jsonObject.getString("content");
  1105. System.out.println("任务标题:" + content);
  1106. //获取迭代ID
  1107. String diedaiID = null;
  1108. try {
  1109. diedaiID = jsonObject.getString("sprintId");
  1110. } catch (Exception e) {
  1111. e.printStackTrace();
  1112. }
  1113. System.out.println("迭代ID:" + diedaiID);
  1114. // /*调用封装接口获取自定义字段【业务类型】选项值集合*/
  1115. // log.info("调用封装接口获取自定义字段【业务类型】选项值集合。");
  1116. // JSONArray tBzidingyiArray = getTBzidingyi();
  1117. for (int i11 = 0; i11 < tBzidingyi.size(); i11++) {
  1118. JSONObject jsonObject1 = tBzidingyi.getJSONObject(i11);
  1119. //自定义字段id
  1120. String zidingyiID = jsonObject1.getString("id");
  1121. System.out.println("自定义字段【业务类型】id:" + zidingyiID);
  1122. //自定义字段名称
  1123. String zidingyiName = jsonObject1.getString("value");
  1124. System.out.println("自定义字段【业务类型】名称:" + zidingyiName);
  1125. //业务类型
  1126. JSONArray yewuleixingjsonArray = renwuxiangqing.getJSONObject(0).getJSONArray("customfields");
  1127. for (int j = 0; j < yewuleixingjsonArray.size(); j++) {
  1128. JSONArray yewuleixingjsonArray1 = yewuleixingjsonArray.getJSONObject(j).getJSONArray("value");
  1129. if (yewuleixingjsonArray1.isEmpty()) {
  1130. log.info("任务字段没有内容,跳过~");
  1131. } else {
  1132. String ziduanName = yewuleixingjsonArray1.getJSONObject(0).getString("title");
  1133. System.out.println("任务中包含的字段内容:" + ziduanName);
  1134. //判断当前循环到的字段内容是否属于自定义字段【业务类型】中的某个值,如果符合其中一个则取该值
  1135. if (ziduanName.equals(zidingyiName)) {
  1136. yewuleixing = ziduanName;
  1137. }
  1138. }
  1139. }
  1140. }
  1141. System.out.println("【匹配】业务类型:" + yewuleixing);
  1142. //项目ID
  1143. String projectId = jsonObject.getString("projectId");
  1144. System.out.println("项目ID:" + projectId);
  1145. /*根据项目ID获取项目详情*/
  1146. log.info("根据TB项目ID获取项目名称===");
  1147. tBxaingmuName = getTBxaingmu(projectId);
  1148. /*根据项目ID和任务中的迭代ID获取迭代名称*/
  1149. log.info("根据项目ID和任务中的迭代ID获取迭代名称===");
  1150. diedaiName = getDiedai(projectId, diedaiID);
  1151. System.out.println("获取最终的迭代名称:" + diedaiName);
  1152. if (yewuleixing.equals("")) {
  1153. log.info("业务类型为空,去取该TB项目中属于IDX分组名称。");
  1154. /*根据项目ID获取项目分组ID*/
  1155. log.info("根据项目ID获取项目分组ID===");
  1156. String xiangmufenzuID = getXiangmufenzuID(projectId);
  1157. System.out.println("项目分组ID:" + xiangmufenzuID);
  1158. /*根据项目ID获取项目分组ID*/
  1159. log.info("根据项目分组ID获取项目分组名称===");
  1160. xiangmufenzuName = getXiangmufenzuName(xiangmufenzuID);
  1161. System.out.println("项目分组名称:" + xiangmufenzuName);
  1162. int flag = 0;
  1163. //调用接口获取IDX分组下的目录名称,匹配逻辑下最终的业务类型名称
  1164. log.info("调用接口获取IDX分组下的目录名称===");
  1165. JSONArray IDXfenzu = getIDXfenzu();
  1166. for (int f = 0; f < IDXfenzu.size(); f++) {
  1167. String fenzuId = IDXfenzu.getJSONObject(f).getString("id");
  1168. System.out.println("分组id:" + fenzuId);
  1169. String fenzuName = IDXfenzu.getJSONObject(f).getString("name");
  1170. System.out.println("分组名称:" + fenzuName);
  1171. if (flag == 0) {
  1172. if (xiangmufenzuName.equals(fenzuName)) {
  1173. log.info("匹配到IDX分组名称,去取该IDX分组下的目录名称。");
  1174. XXX = fenzuName;
  1175. //添加标识,说明已经匹配到了
  1176. flag = flag + 1;
  1177. } else {
  1178. log.info("匹配不到IDX分组名称,继续匹配下一个IDX分组。");
  1179. }
  1180. }
  1181. }
  1182. System.out.println("获取的IDX分组下的目录名称用作最终的【业务类型】:" + XXX);
  1183. }
  1184. // }
  1185. /*同步钉钉数据*/
  1186. //应出勤天数
  1187. float yingchuqintianshu = 0;
  1188. //请假天数
  1189. float qingjiatianshu = 0;
  1190. //查询上月考勤数据,统计上月应出勤天数、请假天数
  1191. try {
  1192. DingTalkClient client11 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/getcolumnval");
  1193. OapiAttendanceGetcolumnvalRequest req = new OapiAttendanceGetcolumnvalRequest();
  1194. //TODO 待查询人员的userid
  1195. req.setUserid(userId);
  1196. //考勤报表列定义查出来的工作时长的列id(固定)
  1197. req.setColumnIdList("176150482,985267953");
  1198. //TODO 查询开始时间
  1199. req.setFromDate(StringUtils.parseDateTime(FORMtime));
  1200. //TODO 查询结束时间
  1201. req.setToDate(StringUtils.parseDateTime(TOtime));
  1202. OapiAttendanceGetcolumnvalResponse rsp = client11.execute(req, accessTokenService.getAccessToken());
  1203. // System.out.println(rsp.getBody());
  1204. String string = rsp.getBody();
  1205. JSONObject jsonObjectKaoqin = JSON.parseObject(string);
  1206. int errcode = jsonObjectKaoqin.getInteger("errcode");
  1207. System.out.println("考勤时间周期查询结果状态码:" + errcode);
  1208. String errmsg = jsonObjectKaoqin.getString("errmsg");
  1209. System.out.println("考勤时间周期查询结果状态信息:" + errmsg);
  1210. if (errcode != 0) {
  1211. log.info("考勤时间周期查询结果反馈异常,异常状态码:" + errcode + "【" + errmsg + "】");
  1212. } else {
  1213. //应出勤天数
  1214. JSONArray jsonArray1 = jsonObjectKaoqin.getJSONObject("result").
  1215. getJSONArray("column_vals").
  1216. getJSONObject(0).
  1217. getJSONArray("column_vals");
  1218. for (int x = 0; x < jsonArray1.size(); x++) {
  1219. //应出勤天数
  1220. String value = jsonArray1.getJSONObject(x).getString("value");
  1221. System.out.println("应出勤天数:" + value);
  1222. float v = Float.parseFloat(value);
  1223. if (v == 1) {
  1224. System.out.println("应出勤天数,进行循环统计!");
  1225. yingchuqintianshu = yingchuqintianshu + 1;
  1226. }
  1227. }
  1228. //请假天数
  1229. JSONArray jsonArray = jsonObjectKaoqin.getJSONObject("result").
  1230. getJSONArray("column_vals").
  1231. getJSONObject(1).
  1232. getJSONArray("column_vals");
  1233. for (int x = 0; x < jsonArray.size(); x++) {
  1234. //请假天数
  1235. String value = jsonArray.getJSONObject(x).getString("value");
  1236. System.out.println("请假天数:" + value);
  1237. float v = Float.parseFloat(value);
  1238. if (v > 0) {
  1239. System.out.println("请假天数,进行循环统计!");
  1240. qingjiatianshu = qingjiatianshu + v;
  1241. }
  1242. }
  1243. }
  1244. } catch (ApiException e) {
  1245. e.printStackTrace();
  1246. }
  1247. //应出勤天数
  1248. BigDecimal ycqts = new BigDecimal(yingchuqintianshu);
  1249. BigDecimal ycqtsAll = ycqts.setScale(2, BigDecimal.ROUND_DOWN);
  1250. System.out.println("应出勤天数(浮点数,保留2位小数):" + ycqtsAll);
  1251. //请假天数
  1252. BigDecimal qjts = new BigDecimal(qingjiatianshu);
  1253. BigDecimal qjtsAll = qjts.setScale(2, BigDecimal.ROUND_DOWN);
  1254. System.out.println("请假天数(浮点数,保留2位小数):" + qjtsAll);
  1255. /*同步至宜搭*/
  1256. Map map = new HashMap();
  1257. //实际统计月份
  1258. map.put("textField_losayxi8", lastMonthNow);
  1259. //钉钉userid
  1260. map.put("textField_los8y15p", userId);
  1261. //姓名
  1262. map.put("textField_los8y15q", userName);
  1263. //主部门
  1264. map.put("textField_los8y15s", zhubumen);
  1265. //职位
  1266. map.put("textField_los8y15x", zhiwei);
  1267. //邮箱
  1268. map.put("textField_los8y15y", youxiang);
  1269. /*TB项目/任务数据*/
  1270. //项目名称
  1271. map.put("textField_lp0m06bd", tBxaingmuName);
  1272. //任务名称
  1273. map.put("textField_lp0m06be", content);
  1274. //任务ID
  1275. map.put("textField_lp8ihks3", objectId);
  1276. //迭代
  1277. map.put("textField_lpf88002", diedaiName);
  1278. //任务工时所属日期
  1279. map.put("textField_lqn3tjjv", rwgsssrq);
  1280. //工时类型(计划工时、实际工时)
  1281. map.put("textField_lrq4uku2", "实际工时");
  1282. /**
  1283. * 判断(同步月份、userid、任务id、任务工时所属日期)是否有该任务
  1284. * */
  1285. String panduan = getYida(lastMonthNow, userId, objectId, rwgsssrq, "实际工时");
  1286. if (panduan.equals("不存在")) {
  1287. log.info("该人员在宜搭中该任务的工时【不存在】,写入【业务类型(初版结果)】!");
  1288. if (yewuleixing.equals("")) {
  1289. //业务类型(修正改这列)
  1290. map.put("textField_lp2aqls1", yewuleixing);
  1291. //业务类型(统计用,勿动)
  1292. map.put("textField_los8y15z", XXX);
  1293. //TODO 后面如果需要在宜搭手动修改,要判断是否存在该数据,如果存在的话这个字段不做更新
  1294. //业务类型(初版结果,勿动)
  1295. map.put("textField_lp2aqls2", XXX);
  1296. } else {
  1297. //业务类型(修正改这列)
  1298. map.put("textField_lp2aqls1", yewuleixing);
  1299. //业务类型(统计用,勿动)
  1300. map.put("textField_los8y15z", yewuleixing);
  1301. //TODO 后面如果需要在宜搭手动修改,要判断是否存在该数据,如果存在的话这个字段不做更新
  1302. //业务类型(初版结果,勿动)
  1303. map.put("textField_lp2aqls2", yewuleixing);
  1304. }
  1305. }else {
  1306. log.info("该人员在宜搭中该任务的工时【存在】,不更新写入【业务类型(初版结果)】!");
  1307. if (yewuleixing.equals("")) {
  1308. //业务类型(修正改这列)
  1309. map.put("textField_lp2aqls1", yewuleixing);
  1310. //业务类型(统计用,勿动)
  1311. map.put("textField_los8y15z", XXX);
  1312. } else {
  1313. //业务类型(修正改这列)
  1314. map.put("textField_lp2aqls1", yewuleixing);
  1315. //业务类型(统计用,勿动)
  1316. map.put("textField_los8y15z", yewuleixing);
  1317. }
  1318. }
  1319. //统一工时数(天)
  1320. map.put("numberField_los8y164", gs);
  1321. /*钉钉考勤数据*/
  1322. //每月人天(应出勤天数)
  1323. map.put("numberField_los8y16g", ycqtsAll);
  1324. //请假天数
  1325. map.put("numberField_los8y16f", qjtsAll);
  1326. //是否全投入
  1327. // map.put("selectField_los8y16e", "否");
  1328. /*计算字段*/
  1329. //人月数据:统一工时数(天)/每月人天 //【废弃】
  1330. map.put("numberField_los8y16c", 0);
  1331. //SaaS合计:统一工时数(天)+请假成本(天)
  1332. map.put("numberField_los8y16h", gs);
  1333. //占比:SaaS合计/每月人天 //【废弃】
  1334. map.put("numberField_los8y16p", 0);
  1335. String mapJson = JSON.toJSONString(map);
  1336. System.out.println("mapJson:" + mapJson);
  1337. //宜搭表单判断查询条件
  1338. //判断宜搭人员信息表是否有当前人员userid
  1339. Map map1 = new HashMap();
  1340. //字段编号
  1341. map1.put("key", "textField_los8y15p");
  1342. //同步类型
  1343. map1.put("value", userId);
  1344. // map1.put("value", "userId");
  1345. //控件类型
  1346. map1.put("type", "TEXT");
  1347. //逻辑判断符
  1348. map1.put("operator", "eq");
  1349. //控件名称
  1350. map1.put("componentName", "TextField");
  1351. /**
  1352. * 实际统计月份
  1353. * */
  1354. Map map2 = new HashMap();
  1355. //字段编号
  1356. map2.put("key", "textField_losayxi8");
  1357. //同步类型
  1358. map2.put("value", lastMonthNow);
  1359. //控件类型
  1360. map2.put("type", "TEXT");
  1361. //逻辑判断符
  1362. map2.put("operator", "eq");
  1363. //控件名称
  1364. map2.put("componentName", "TextField");
  1365. /**
  1366. * 任务id
  1367. * */
  1368. Map map3 = new HashMap();
  1369. //字段编号
  1370. map3.put("key", "textField_lp8ihks3");
  1371. //同步类型
  1372. map3.put("value", objectId);
  1373. //控件类型
  1374. map3.put("type", "TEXT");
  1375. //逻辑判断符
  1376. map3.put("operator", "eq");
  1377. //控件名称
  1378. map3.put("componentName", "TextField");
  1379. /**
  1380. * 任务工时所属日期
  1381. * */
  1382. Map map4 = new HashMap();
  1383. //字段编号
  1384. map4.put("key", "textField_lqn3tjjv");
  1385. //同步类型
  1386. map4.put("value", rwgsssrq);
  1387. //控件类型
  1388. map4.put("type", "TEXT");
  1389. //逻辑判断符
  1390. map4.put("operator", "eq");
  1391. //控件名称
  1392. map4.put("componentName", "TextField");
  1393. /**
  1394. * 工时类型(计划工时、实际工时)
  1395. * */
  1396. Map map5 = new HashMap();
  1397. //字段编号
  1398. map5.put("key", "textField_lrq4uku2");
  1399. //同步类型
  1400. map5.put("value", "实际工时");
  1401. //控件类型
  1402. map5.put("type", "TEXT");
  1403. //逻辑判断符
  1404. map5.put("operator", "eq");
  1405. //控件名称
  1406. map5.put("componentName", "TextField");
  1407. List list11 = new ArrayList();
  1408. list11.add(map1);
  1409. list11.add(map2);
  1410. list11.add(map3);
  1411. list11.add(map4);
  1412. list11.add(map5);
  1413. String listJson = JSON.toJSONString(list11);
  1414. System.out.println("查询条件listJson:" + listJson);
  1415. //将汇总数据写入【宜搭汇总表】
  1416. JSONObject jsonObject1;
  1417. //新增或更新表单实例【宜搭】
  1418. try {
  1419. com.aliyun.dingtalkyida_1_0.Client client11 = createClient();
  1420. com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders createOrUpdateFormDataHeaders = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders();
  1421. createOrUpdateFormDataHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken();
  1422. com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest createOrUpdateFormDataRequest = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest()
  1423. //应用秘钥
  1424. .setSystemToken("J0A6698165EFMED0AHIG76FW7C6Q3ON1PG5OL482")
  1425. //表单编码
  1426. .setFormUuid("FORM-BH766Y61W4CFWBS0869YFBF8COTE2QEHIH5OLM")
  1427. .setUserId("yida_pub_account")
  1428. .setSearchCondition(listJson)
  1429. //应用编码
  1430. .setAppType("APP_QHPV3T4ZU2Y88Q4U0UDA")
  1431. .setFormDataJson(mapJson);
  1432. CreateOrUpdateFormDataResponse orUpdateFormDataWithOptions = client11.createOrUpdateFormDataWithOptions(createOrUpdateFormDataRequest, createOrUpdateFormDataHeaders, new RuntimeOptions());
  1433. String s = JSON.toJSONString(orUpdateFormDataWithOptions.getBody());
  1434. jsonObject1 = JSON.parseObject(s);
  1435. // System.out.println("【创建或更新】表单object对象:" + jsonObject1);
  1436. } catch (TeaException err) {
  1437. if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
  1438. // err 中含有 code 和 message 属性,可帮助开发定位问题
  1439. }
  1440. } catch (Exception _err) {
  1441. TeaException err = new TeaException(_err.getMessage(), _err);
  1442. if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
  1443. // err 中含有 code 和 message 属性,可帮助开发定位问题
  1444. }
  1445. }
  1446. /*同步至宜搭*/
  1447. }
  1448. }
  1449. }
  1450. // else if (result.isEmpty()){
  1451. // log.info("该人员实际工时为空,将获取计划工时!");
  1452. log.info("###########################该人员实际工时循环结束,开始调用该人员名下的计划工时,并进行循环判断是否存在该任务的实际工时,如果存在则跳过,不存在则将该任务的计划工时写入###########################");
  1453. //获取该人员在TB中的计划工时信息
  1454. int code1 = 0;
  1455. JSONArray result1 = null;
  1456. try {
  1457. OkHttpClient client = new OkHttpClient().newBuilder()
  1458. .build();
  1459. MediaType mediaType = MediaType.parse("text/plain");
  1460. RequestBody body = RequestBody.create(mediaType, "");
  1461. Request request = new Request.Builder()
  1462. .url("https://open.teambition.com/api/plantime/query?userId=" + TBuserId + "&pageSize=1000&pageToken=&startDate="+ startDate +"&endDate="+ endDate)
  1463. .method("GET", null)
  1464. .addHeader("Authorization", "Bearer " + accessTokenService.getAppToken())
  1465. .addHeader("X-Tenant-Id", tbOrganizationId)
  1466. .addHeader("X-Tenant-Type", "organization")
  1467. .build();
  1468. Response response = client.newCall(request).execute();
  1469. String bodyStr = response.body().string();
  1470. JSONObject jsonObject = JSON.parseObject(bodyStr);
  1471. // System.out.println("返回体body:" + jsonObject);
  1472. code1 = jsonObject.getInteger("code");
  1473. System.out.println("TB获取人员计划工时接口返回状态码:" + code1);
  1474. result1 = jsonObject.getJSONArray("result");
  1475. System.out.println("TB获取人员计划工时接口返回result:" + result1);
  1476. } catch (IOException e) {
  1477. e.printStackTrace();
  1478. }
  1479. if (!result1.isEmpty()) {
  1480. log.info("匹配该人员获取到的计划工时,是否已经同步宜搭,如果同步则更新,如果没有将会新增写入!");
  1481. for (int i1 = 0; i1 < result1.size(); i1++) {
  1482. //工时关联的task ID
  1483. String objectId = result1.getJSONObject(i1).getString("objectId");
  1484. System.out.println("工时关联的task ID:" + objectId);
  1485. //任务工时所属日期
  1486. String rwgsssrq = result1.getJSONObject(i1).getString("date");
  1487. System.out.println("任务工时所属日期:" + rwgsssrq);
  1488. /**
  1489. * 判断(同步月份、userid、任务id、任务工时所属日期、工时类型)实际工时是否有该任务该日期的工时
  1490. * */
  1491. String panduan = getYida(lastMonthNow, userId, objectId, rwgsssrq, "判断实际工时是否存在");
  1492. if (panduan.equals("不存在")) {
  1493. log.info("该人员在宜搭中该任务的实际工时不存在,即:该任务没有实际工时,将新增写入该任务的计划工时!");
  1494. //工时(毫秒:转换成天)
  1495. long plantime = result1.getJSONObject(i1).getLong("plantime");
  1496. System.out.println("计划工时(毫秒):" + plantime);
  1497. double gongshi = (double) plantime / 3600000 / 8;
  1498. BigDecimal gongshiTwo = new BigDecimal(gongshi);
  1499. double gs = gongshiTwo.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
  1500. System.out.println("计划工时(毫秒转换成天):" + gs);
  1501. //汇总工时
  1502. // BigDecimal gsDouble = new BigDecimal(gs);
  1503. // gsAll = gsAll.add(gsDouble);
  1504. //根据任务ID获取任务详情,解析得到任务标题和项目ID
  1505. JSONArray renwuxiangqing = getRenwuxiangqing(objectId);
  1506. JSONObject jsonObject = renwuxiangqing.getJSONObject(0);
  1507. //是否放入回收站
  1508. String isArchived = jsonObject.getString("isArchived");
  1509. System.out.println("是否放入回收站:" + isArchived);
  1510. String content = "";
  1511. String yewuleixing = "";
  1512. String tBxaingmuName = "";
  1513. String xiangmufenzuName = "";
  1514. String diedaiName = "";
  1515. String XXX = "";
  1516. if (renwuxiangqing == null) {
  1517. log.info("该任务不存在!");
  1518. } else if (isArchived.equals("true")) {
  1519. log.info("该任务已放入回收站,不统计!");
  1520. } else {
  1521. log.info("该任务没有放入回收站,正常统计!");
  1522. //任务标题
  1523. content = jsonObject.getString("content");
  1524. System.out.println("任务标题:" + content);
  1525. //获取迭代ID
  1526. String diedaiID = null;
  1527. try {
  1528. diedaiID = jsonObject.getString("sprintId");
  1529. } catch (Exception e) {
  1530. e.printStackTrace();
  1531. }
  1532. System.out.println("迭代ID:" + diedaiID);
  1533. // /*调用封装接口获取自定义字段【业务类型】选项值集合*/
  1534. // log.info("调用封装接口获取自定义字段【业务类型】选项值集合。");
  1535. // JSONArray tBzidingyiArray = getTBzidingyi();
  1536. for (int i11 = 0; i11 < tBzidingyi.size(); i11++) {
  1537. JSONObject jsonObject1 = tBzidingyi.getJSONObject(i11);
  1538. //自定义字段id
  1539. String zidingyiID = jsonObject1.getString("id");
  1540. System.out.println("自定义字段【业务类型】id:" + zidingyiID);
  1541. //自定义字段名称
  1542. String zidingyiName = jsonObject1.getString("value");
  1543. System.out.println("自定义字段【业务类型】名称:" + zidingyiName);
  1544. //业务类型
  1545. JSONArray yewuleixingjsonArray = renwuxiangqing.getJSONObject(0).getJSONArray("customfields");
  1546. for (int j = 0; j < yewuleixingjsonArray.size(); j++) {
  1547. JSONArray yewuleixingjsonArray1 = yewuleixingjsonArray.getJSONObject(j).getJSONArray("value");
  1548. if (yewuleixingjsonArray1.isEmpty()) {
  1549. log.info("任务中的字段没有内容,跳过~");
  1550. } else {
  1551. String ziduanName = yewuleixingjsonArray1.getJSONObject(0).getString("title");
  1552. System.out.println("任务中包含的字段内容:" + ziduanName);
  1553. //判断当前循环到的字段内容是否属于自定义字段【业务类型】中的某个值,如果符合其中一个则取该值
  1554. if (ziduanName.equals(zidingyiName)) {
  1555. yewuleixing = ziduanName;
  1556. }
  1557. }
  1558. }
  1559. }
  1560. System.out.println("【匹配】业务类型:" + yewuleixing);
  1561. //项目ID
  1562. String projectId = jsonObject.getString("projectId");
  1563. System.out.println("项目ID:" + projectId);
  1564. /*根据项目ID获取项目详情*/
  1565. log.info("根据TB项目ID获取项目名称===");
  1566. tBxaingmuName = getTBxaingmu(projectId);
  1567. /*根据项目ID和任务中的迭代ID获取迭代名称*/
  1568. log.info("根据项目ID和任务中的迭代ID获取迭代名称===");
  1569. diedaiName = getDiedai(projectId, diedaiID);
  1570. System.out.println("获取最终的迭代名称:" + diedaiName);
  1571. if (yewuleixing.equals("")) {
  1572. log.info("业务类型为空,去取该TB项目中属于IDX分组名称。");
  1573. /*根据项目ID获取项目分组ID*/
  1574. log.info("根据项目ID获取项目分组ID===");
  1575. String xiangmufenzuID = getXiangmufenzuID(projectId);
  1576. System.out.println("项目分组ID:" + xiangmufenzuID);
  1577. /*根据项目分组ID获取项目分组名称*/
  1578. log.info("根据项目分组ID获取项目分组名称===");
  1579. xiangmufenzuName = getXiangmufenzuName(xiangmufenzuID);
  1580. System.out.println("项目分组名称:" + xiangmufenzuName);
  1581. // //调用接口获取IDX分组下的目录名称,匹配逻辑下最终的业务类型名称
  1582. // log.info("调用接口获取IDX分组下的目录名称===");
  1583. // JSONArray IDXfenzu = getIDXfenzu();
  1584. // for (int f = 0; f < IDXfenzu.size(); f++) {
  1585. // String fenzuId = IDXfenzu.getJSONObject(f).getString("id");
  1586. // System.out.println("分组id:" + fenzuId);
  1587. // String fenzuName = IDXfenzu.getJSONObject(f).getString("name");
  1588. // System.out.println("分组名称:" + fenzuName);
  1589. //
  1590. // if (xiangmufenzuName.equals(fenzuName)){
  1591. // log.info("匹配到IDX分组名称,去取该IDX分组下的目录名称。");
  1592. // }else {
  1593. // xiangmufenzuName = "";
  1594. // }
  1595. // }
  1596. int flag = 0;
  1597. //调用接口获取IDX分组下的目录名称,匹配逻辑下最终的业务类型名称
  1598. log.info("调用接口获取IDX分组下的目录名称===");
  1599. JSONArray IDXfenzu = getIDXfenzu();
  1600. for (int f = 0; f < IDXfenzu.size(); f++) {
  1601. String fenzuId = IDXfenzu.getJSONObject(f).getString("id");
  1602. System.out.println("分组id:" + fenzuId);
  1603. String fenzuName = IDXfenzu.getJSONObject(f).getString("name");
  1604. System.out.println("分组名称:" + fenzuName);
  1605. if (flag == 0) {
  1606. if (xiangmufenzuName.equals(fenzuName)) {
  1607. log.info("匹配到IDX分组名称,去取该IDX分组下的目录名称。");
  1608. XXX = fenzuName;
  1609. //添加标识,说明已经匹配到了
  1610. flag = flag + 1;
  1611. } else {
  1612. log.info("匹配不到IDX分组名称,继续匹配下一个IDX分组。");
  1613. }
  1614. }
  1615. }
  1616. System.out.println("获取的IDX分组下的目录名称用作最终的【业务类型】:" + XXX);
  1617. }
  1618. // }
  1619. /*同步钉钉数据*/
  1620. //应出勤天数
  1621. float yingchuqintianshu = 0;
  1622. //请假天数
  1623. float qingjiatianshu = 0;
  1624. //查询上月考勤数据,统计上月应出勤天数、请假天数
  1625. try {
  1626. DingTalkClient client11 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/getcolumnval");
  1627. OapiAttendanceGetcolumnvalRequest req = new OapiAttendanceGetcolumnvalRequest();
  1628. //TODO 待查询人员的userid
  1629. req.setUserid(userId);
  1630. //考勤报表列定义查出来的工作时长的列id(固定)
  1631. req.setColumnIdList("176150482,985267953");
  1632. //TODO 查询开始时间
  1633. req.setFromDate(StringUtils.parseDateTime(FORMtime));
  1634. //TODO 查询结束时间
  1635. req.setToDate(StringUtils.parseDateTime(TOtime));
  1636. OapiAttendanceGetcolumnvalResponse rsp = client11.execute(req, accessTokenService.getAccessToken());
  1637. // System.out.println(rsp.getBody());
  1638. String string = rsp.getBody();
  1639. JSONObject jsonObjectKaoqin = JSON.parseObject(string);
  1640. int errcode = jsonObjectKaoqin.getInteger("errcode");
  1641. System.out.println("考勤时间周期查询结果状态码:" + errcode);
  1642. String errmsg = jsonObjectKaoqin.getString("errmsg");
  1643. System.out.println("考勤时间周期查询结果状态信息:" + errmsg);
  1644. if (errcode != 0) {
  1645. log.info("考勤时间周期查询结果反馈异常,异常状态码:" + errcode + "【" + errmsg + "】");
  1646. } else {
  1647. //应出勤天数
  1648. JSONArray jsonArray1 = jsonObjectKaoqin.getJSONObject("result").
  1649. getJSONArray("column_vals").
  1650. getJSONObject(0).
  1651. getJSONArray("column_vals");
  1652. for (int x = 0; x < jsonArray1.size(); x++) {
  1653. //应出勤天数
  1654. String value = jsonArray1.getJSONObject(x).getString("value");
  1655. System.out.println("应出勤天数:" + value);
  1656. float v = Float.parseFloat(value);
  1657. if (v == 1) {
  1658. System.out.println("应出勤天数,进行循环统计!");
  1659. yingchuqintianshu = yingchuqintianshu + 1;
  1660. }
  1661. }
  1662. //请假天数
  1663. JSONArray jsonArray = jsonObjectKaoqin.getJSONObject("result").
  1664. getJSONArray("column_vals").
  1665. getJSONObject(1).
  1666. getJSONArray("column_vals");
  1667. for (int x = 0; x < jsonArray.size(); x++) {
  1668. //请假天数
  1669. String value = jsonArray.getJSONObject(x).getString("value");
  1670. System.out.println("请假天数:" + value);
  1671. float v = Float.parseFloat(value);
  1672. if (v > 0) {
  1673. System.out.println("请假天数,进行循环统计!");
  1674. qingjiatianshu = qingjiatianshu + v;
  1675. }
  1676. }
  1677. }
  1678. } catch (ApiException e) {
  1679. e.printStackTrace();
  1680. }
  1681. //应出勤天数
  1682. BigDecimal ycqts = new BigDecimal(yingchuqintianshu);
  1683. BigDecimal ycqtsAll = ycqts.setScale(2, BigDecimal.ROUND_DOWN);
  1684. System.out.println("应出勤天数(浮点数,保留2位小数):" + ycqtsAll);
  1685. //请假天数
  1686. BigDecimal qjts = new BigDecimal(qingjiatianshu);
  1687. BigDecimal qjtsAll = qjts.setScale(2, BigDecimal.ROUND_DOWN);
  1688. System.out.println("请假天数(浮点数,保留2位小数):" + qjtsAll);
  1689. /*同步至宜搭*/
  1690. Map map = new HashMap();
  1691. //实际统计月份
  1692. map.put("textField_losayxi8", lastMonthNow);
  1693. //钉钉userid
  1694. map.put("textField_los8y15p", userId);
  1695. //姓名
  1696. map.put("textField_los8y15q", userName);
  1697. //主部门
  1698. map.put("textField_los8y15s", zhubumen);
  1699. //职位
  1700. map.put("textField_los8y15x", zhiwei);
  1701. //邮箱
  1702. map.put("textField_los8y15y", youxiang);
  1703. /*TB项目/任务数据*/
  1704. //项目名称
  1705. map.put("textField_lp0m06bd", tBxaingmuName);
  1706. //任务名称
  1707. map.put("textField_lp0m06be", content);
  1708. //任务ID
  1709. map.put("textField_lp8ihks3", objectId);
  1710. //迭代
  1711. map.put("textField_lpf88002", diedaiName);
  1712. //任务工时所属日期
  1713. map.put("textField_lqn3tjjv", rwgsssrq);
  1714. //工时类型(计划工时、实际工时)
  1715. map.put("textField_lrq4uku2", "计划工时");
  1716. // if (yewuleixing.equals("")) {
  1717. // //业务类型(修正改这列)
  1718. // map.put("textField_lp2aqls1", yewuleixing);
  1719. // //业务类型(统计用,勿动)
  1720. // map.put("textField_los8y15z", XXX);
  1721. //
  1722. // //TODO 后面如果需要在宜搭手动修改,要判断是否存在该数据,如果存在的话这个字段不做更新
  1723. // //业务类型(原数据,勿动)
  1724. // map.put("textField_lp2aqls2", XXX);
  1725. // } else {
  1726. // //业务类型(修正改这列)
  1727. // map.put("textField_lp2aqls1", yewuleixing);
  1728. // //业务类型(统计用,勿动)
  1729. // map.put("textField_los8y15z", yewuleixing);
  1730. //
  1731. // //TODO 后面如果需要在宜搭手动修改,要判断是否存在该数据,如果存在的话这个字段不做更新
  1732. // //业务类型(原数据,勿动)
  1733. // map.put("textField_lp2aqls2", yewuleixing);
  1734. // }
  1735. /**
  1736. * 判断同步月份、userid、任务id、任务工时所属日期,是否有该任务
  1737. * */
  1738. // String panduan = getYida(lastMonthNow, userId, objectId, rwgsssrq);
  1739. if (panduan.equals("不存在")) {
  1740. log.info("该人员在宜搭中该任务的工时【不存在】,写入【业务类型(初版结果)】!");
  1741. if (yewuleixing.equals("")) {
  1742. //业务类型(修正改这列)
  1743. map.put("textField_lp2aqls1", yewuleixing);
  1744. //业务类型(统计用,勿动)
  1745. map.put("textField_los8y15z", XXX);
  1746. //TODO 后面如果需要在宜搭手动修改,要判断是否存在该数据,如果存在的话这个字段不做更新
  1747. //业务类型(初版结果,勿动)
  1748. map.put("textField_lp2aqls2", XXX);
  1749. } else {
  1750. //业务类型(修正改这列)
  1751. map.put("textField_lp2aqls1", yewuleixing);
  1752. //业务类型(统计用,勿动)
  1753. map.put("textField_los8y15z", yewuleixing);
  1754. //TODO 后面如果需要在宜搭手动修改,要判断是否存在该数据,如果存在的话这个字段不做更新
  1755. //业务类型(初版结果,勿动)
  1756. map.put("textField_lp2aqls2", yewuleixing);
  1757. }
  1758. }else {
  1759. log.info("该人员在宜搭中该任务的工时【存在】,不更新写入【业务类型(初版结果)】!");
  1760. if (yewuleixing.equals("")) {
  1761. //业务类型(修正改这列)
  1762. map.put("textField_lp2aqls1", yewuleixing);
  1763. //业务类型(统计用,勿动)
  1764. map.put("textField_los8y15z", XXX);
  1765. } else {
  1766. //业务类型(修正改这列)
  1767. map.put("textField_lp2aqls1", yewuleixing);
  1768. //业务类型(统计用,勿动)
  1769. map.put("textField_los8y15z", yewuleixing);
  1770. }
  1771. }
  1772. //统一工时数(天)
  1773. map.put("numberField_los8y164", gs);
  1774. /*钉钉考勤数据*/
  1775. //每月人天(应出勤天数)
  1776. map.put("numberField_los8y16g", ycqtsAll);
  1777. //请假天数
  1778. map.put("numberField_los8y16f", qjtsAll);
  1779. //是否全投入
  1780. // map.put("selectField_los8y16e", "否");
  1781. /*计算字段*/
  1782. //人月数据:统一工时数(天)/每月人天 //【废弃】
  1783. map.put("numberField_los8y16c", 0);
  1784. //SaaS合计:统一工时数(天)+请假成本(天)
  1785. map.put("numberField_los8y16h", gs);
  1786. //占比:SaaS合计/每月人天 //【废弃】
  1787. map.put("numberField_los8y16p", 0);
  1788. String mapJson = JSON.toJSONString(map);
  1789. System.out.println("mapJson:" + mapJson);
  1790. //宜搭表单判断查询条件
  1791. //判断宜搭人员信息表是否有当前人员userid
  1792. Map map1 = new HashMap();
  1793. //字段编号
  1794. map1.put("key", "textField_los8y15p");
  1795. //同步类型
  1796. map1.put("value", userId);
  1797. // map1.put("value", "userId");
  1798. //控件类型
  1799. map1.put("type", "TEXT");
  1800. //逻辑判断符
  1801. map1.put("operator", "eq");
  1802. //控件名称
  1803. map1.put("componentName", "TextField");
  1804. //同步数据的所属日期
  1805. Map map2 = new HashMap();
  1806. //字段编号
  1807. map2.put("key", "textField_losayxi8");
  1808. //同步类型
  1809. map2.put("value", lastMonthNow);
  1810. //控件类型
  1811. map2.put("type", "TEXT");
  1812. //逻辑判断符
  1813. map2.put("operator", "eq");
  1814. //控件名称
  1815. map2.put("componentName", "TextField");
  1816. //任务id
  1817. Map map3 = new HashMap();
  1818. //字段编号
  1819. map3.put("key", "textField_lp8ihks3");
  1820. //同步类型
  1821. map3.put("value", objectId);
  1822. //控件类型
  1823. map3.put("type", "TEXT");
  1824. //逻辑判断符
  1825. map3.put("operator", "eq");
  1826. //控件名称
  1827. map3.put("componentName", "TextField");
  1828. //任务工时所属日期
  1829. Map map4 = new HashMap();
  1830. //字段编号
  1831. map4.put("key", "textField_lqn3tjjv");
  1832. //同步类型
  1833. map4.put("value", rwgsssrq);
  1834. //控件类型
  1835. map4.put("type", "TEXT");
  1836. //逻辑判断符
  1837. map4.put("operator", "eq");
  1838. //控件名称
  1839. map4.put("componentName", "TextField");
  1840. /**
  1841. * 工时类型(计划工时、实际工时)
  1842. * */
  1843. Map map5 = new HashMap();
  1844. //字段编号
  1845. map5.put("key", "textField_lrq4uku2");
  1846. //同步类型
  1847. map5.put("value", "计划工时");
  1848. //控件类型
  1849. map5.put("type", "TEXT");
  1850. //逻辑判断符
  1851. map5.put("operator", "eq");
  1852. //控件名称
  1853. map5.put("componentName", "TextField");
  1854. List list11 = new ArrayList();
  1855. list11.add(map1);
  1856. list11.add(map2);
  1857. list11.add(map3);
  1858. list11.add(map4);
  1859. list11.add(map5);
  1860. String listJson = JSON.toJSONString(list11);
  1861. System.out.println("查询条件listJson:" + listJson);
  1862. //将汇总数据写入【宜搭汇总表】
  1863. JSONObject jsonObject1;
  1864. //新增或更新表单实例【宜搭】
  1865. try {
  1866. com.aliyun.dingtalkyida_1_0.Client client11 = createClient();
  1867. com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders createOrUpdateFormDataHeaders = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders();
  1868. createOrUpdateFormDataHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken();
  1869. com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest createOrUpdateFormDataRequest = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest()
  1870. //应用秘钥
  1871. .setSystemToken("J0A6698165EFMED0AHIG76FW7C6Q3ON1PG5OL482")
  1872. //表单编码
  1873. .setFormUuid("FORM-BH766Y61W4CFWBS0869YFBF8COTE2QEHIH5OLM")
  1874. .setUserId("yida_pub_account")
  1875. .setSearchCondition(listJson)
  1876. //应用编码
  1877. .setAppType("APP_QHPV3T4ZU2Y88Q4U0UDA")
  1878. .setFormDataJson(mapJson);
  1879. CreateOrUpdateFormDataResponse orUpdateFormDataWithOptions = client11.createOrUpdateFormDataWithOptions(createOrUpdateFormDataRequest, createOrUpdateFormDataHeaders, new RuntimeOptions());
  1880. String s = JSON.toJSONString(orUpdateFormDataWithOptions.getBody());
  1881. jsonObject1 = JSON.parseObject(s);
  1882. System.out.println("【创建或更新】表单object对象:" + jsonObject1);
  1883. } catch (TeaException err) {
  1884. if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
  1885. // err 中含有 code 和 message 属性,可帮助开发定位问题
  1886. }
  1887. } catch (Exception _err) {
  1888. TeaException err = new TeaException(_err.getMessage(), _err);
  1889. if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
  1890. // err 中含有 code 和 message 属性,可帮助开发定位问题
  1891. }
  1892. }
  1893. /*同步至宜搭*/
  1894. }
  1895. }else {
  1896. System.out.println("该任务该日期的工时已存在!!!");
  1897. log.info("该人员在宜搭中该任务该日期的工时已存在,跳过!");
  1898. // //工时(毫秒:转换成天)
  1899. // long plantime = result1.getJSONObject(i1).getLong("plantime");
  1900. // System.out.println("计划工时(毫秒):" + plantime);
  1901. // double gongshi = (double) plantime / 3600000 / 8;
  1902. // BigDecimal gongshiTwo = new BigDecimal(gongshi);
  1903. // double gs = gongshiTwo.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
  1904. // System.out.println("计划工时(毫秒转换成天):" + gs);
  1905. // //汇总工时
  1906. //// BigDecimal gsDouble = new BigDecimal(gs);
  1907. //// gsAll = gsAll.add(gsDouble);
  1908. //
  1909. // //根据任务ID获取任务详情,解析得到任务标题和项目ID
  1910. // JSONArray renwuxiangqing = getRenwuxiangqing(objectId);
  1911. //
  1912. // JSONObject jsonObject = renwuxiangqing.getJSONObject(0);
  1913. //
  1914. // //是否放入回收站
  1915. // String isArchived = jsonObject.getString("isArchived");
  1916. // System.out.println("是否放入回收站:" + isArchived);
  1917. //
  1918. // String content = "";
  1919. // String yewuleixing = "";
  1920. // String tBxaingmuName = "";
  1921. // String xiangmufenzuName = "";
  1922. // String diedaiName = "";
  1923. //
  1924. // String XXX = "";
  1925. //
  1926. // if (renwuxiangqing == null) {
  1927. // log.info("该任务不存在!");
  1928. // } else if (isArchived.equals("true")) {
  1929. // log.info("该任务已放入回收站,不统计!");
  1930. // } else {
  1931. // log.info("该任务没有放入回收站,正常统计!");
  1932. //
  1933. // //任务标题
  1934. // content = jsonObject.getString("content");
  1935. // System.out.println("任务标题:" + content);
  1936. //
  1937. // //获取迭代ID
  1938. // String diedaiID = null;
  1939. // try {
  1940. // diedaiID = jsonObject.getString("sprintId");
  1941. // } catch (Exception e) {
  1942. // e.printStackTrace();
  1943. // }
  1944. // System.out.println("迭代ID:" + diedaiID);
  1945. //
  1946. //
  1947. //// /*调用封装接口获取自定义字段【业务类型】选项值集合*/
  1948. //// log.info("调用封装接口获取自定义字段【业务类型】选项值集合。");
  1949. //// JSONArray tBzidingyiArray = getTBzidingyi();
  1950. // for (int i11 = 0; i11 < tBzidingyi.size(); i11++) {
  1951. // JSONObject jsonObject1 = tBzidingyi.getJSONObject(i11);
  1952. // //自定义字段id
  1953. // String zidingyiID = jsonObject1.getString("id");
  1954. // System.out.println("自定义字段【业务类型】id:" + zidingyiID);
  1955. // //自定义字段名称
  1956. // String zidingyiName = jsonObject1.getString("value");
  1957. // System.out.println("自定义字段【业务类型】名称:" + zidingyiName);
  1958. //
  1959. // //业务类型
  1960. // JSONArray yewuleixingjsonArray = renwuxiangqing.getJSONObject(0).getJSONArray("customfields");
  1961. // for (int j = 0; j < yewuleixingjsonArray.size(); j++) {
  1962. // JSONArray yewuleixingjsonArray1 = yewuleixingjsonArray.getJSONObject(j).getJSONArray("value");
  1963. // if (yewuleixingjsonArray1.isEmpty()) {
  1964. // log.info("任务中的字段没有内容,跳过~");
  1965. // } else {
  1966. // String ziduanName = yewuleixingjsonArray1.getJSONObject(0).getString("title");
  1967. // System.out.println("任务中包含的字段内容:" + ziduanName);
  1968. // //判断当前循环到的字段内容是否属于自定义字段【业务类型】中的某个值,如果符合其中一个则取该值
  1969. // if (ziduanName.equals(zidingyiName)) {
  1970. // yewuleixing = ziduanName;
  1971. // }
  1972. // }
  1973. // }
  1974. // }
  1975. // System.out.println("【匹配】业务类型:" + yewuleixing);
  1976. //
  1977. // //项目ID
  1978. // String projectId = jsonObject.getString("projectId");
  1979. // System.out.println("项目ID:" + projectId);
  1980. // /*根据项目ID获取项目详情*/
  1981. // log.info("根据TB项目ID获取项目名称===");
  1982. // tBxaingmuName = getTBxaingmu(projectId);
  1983. //
  1984. // /*根据项目ID和任务中的迭代ID获取迭代名称*/
  1985. // log.info("根据项目ID和任务中的迭代ID获取迭代名称===");
  1986. // diedaiName = getDiedai(projectId, diedaiID);
  1987. // System.out.println("获取最终的迭代名称:" + diedaiName);
  1988. //
  1989. //
  1990. // if (yewuleixing.equals("")) {
  1991. // log.info("业务类型为空,去取该TB项目中属于IDX分组名称。");
  1992. //
  1993. // /*根据项目ID获取项目分组ID*/
  1994. // log.info("根据项目ID获取项目分组ID===");
  1995. // String xiangmufenzuID = getXiangmufenzuID(projectId);
  1996. // System.out.println("项目分组ID:" + xiangmufenzuID);
  1997. // /*根据项目分组ID获取项目分组名称*/
  1998. // log.info("根据项目分组ID获取项目分组名称===");
  1999. // xiangmufenzuName = getXiangmufenzuName(xiangmufenzuID);
  2000. // System.out.println("项目分组名称:" + xiangmufenzuName);
  2001. //
  2002. //// //调用接口获取IDX分组下的目录名称,匹配逻辑下最终的业务类型名称
  2003. //// log.info("调用接口获取IDX分组下的目录名称===");
  2004. //// JSONArray IDXfenzu = getIDXfenzu();
  2005. //// for (int f = 0; f < IDXfenzu.size(); f++) {
  2006. //// String fenzuId = IDXfenzu.getJSONObject(f).getString("id");
  2007. //// System.out.println("分组id:" + fenzuId);
  2008. //// String fenzuName = IDXfenzu.getJSONObject(f).getString("name");
  2009. //// System.out.println("分组名称:" + fenzuName);
  2010. ////
  2011. //// if (xiangmufenzuName.equals(fenzuName)){
  2012. //// log.info("匹配到IDX分组名称,去取该IDX分组下的目录名称。");
  2013. //// }else {
  2014. //// xiangmufenzuName = "";
  2015. //// }
  2016. //// }
  2017. //
  2018. // int flag = 0;
  2019. // //调用接口获取IDX分组下的目录名称,匹配逻辑下最终的业务类型名称
  2020. // log.info("调用接口获取IDX分组下的目录名称===");
  2021. // JSONArray IDXfenzu = getIDXfenzu();
  2022. // for (int f = 0; f < IDXfenzu.size(); f++) {
  2023. // String fenzuId = IDXfenzu.getJSONObject(f).getString("id");
  2024. // System.out.println("分组id:" + fenzuId);
  2025. // String fenzuName = IDXfenzu.getJSONObject(f).getString("name");
  2026. // System.out.println("分组名称:" + fenzuName);
  2027. //
  2028. // if (flag == 0) {
  2029. // if (xiangmufenzuName.equals(fenzuName)) {
  2030. // log.info("匹配到IDX分组名称,去取该IDX分组下的目录名称。");
  2031. // XXX = fenzuName;
  2032. // //添加标识,说明已经匹配到了
  2033. // flag = flag + 1;
  2034. // } else {
  2035. // log.info("匹配不到IDX分组名称,继续匹配下一个IDX分组。");
  2036. // }
  2037. // }
  2038. // }
  2039. // System.out.println("获取的IDX分组下的目录名称用作最终的【业务类型】:" + XXX);
  2040. // }
  2041. //// }
  2042. //
  2043. //
  2044. //
  2045. //
  2046. // /*同步钉钉数据*/
  2047. // //应出勤天数
  2048. // float yingchuqintianshu = 0;
  2049. // //请假天数
  2050. // float qingjiatianshu = 0;
  2051. //
  2052. // //查询上月考勤数据,统计上月应出勤天数、请假天数
  2053. // try {
  2054. // DingTalkClient client11 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/getcolumnval");
  2055. // OapiAttendanceGetcolumnvalRequest req = new OapiAttendanceGetcolumnvalRequest();
  2056. // //TODO 待查询人员的userid
  2057. // req.setUserid(userId);
  2058. // //考勤报表列定义查出来的工作时长的列id(固定)
  2059. // req.setColumnIdList("176150482,985267953");
  2060. // //TODO 查询开始时间
  2061. // req.setFromDate(StringUtils.parseDateTime(FORMtime));
  2062. // //TODO 查询结束时间
  2063. // req.setToDate(StringUtils.parseDateTime(TOtime));
  2064. // OapiAttendanceGetcolumnvalResponse rsp = client11.execute(req, accessTokenService.getAccessToken());
  2065. //// System.out.println(rsp.getBody());
  2066. // String string = rsp.getBody();
  2067. // JSONObject jsonObjectKaoqin = JSON.parseObject(string);
  2068. //
  2069. // int errcode = jsonObjectKaoqin.getInteger("errcode");
  2070. // System.out.println("考勤时间周期查询结果状态码:" + errcode);
  2071. // String errmsg = jsonObjectKaoqin.getString("errmsg");
  2072. // System.out.println("考勤时间周期查询结果状态信息:" + errmsg);
  2073. //
  2074. //
  2075. // if (errcode != 0) {
  2076. // log.info("考勤时间周期查询结果反馈异常,异常状态码:" + errcode + "【" + errmsg + "】");
  2077. //
  2078. // } else {
  2079. // //应出勤天数
  2080. // JSONArray jsonArray1 = jsonObjectKaoqin.getJSONObject("result").
  2081. // getJSONArray("column_vals").
  2082. // getJSONObject(0).
  2083. // getJSONArray("column_vals");
  2084. // for (int x = 0; x < jsonArray1.size(); x++) {
  2085. // //应出勤天数
  2086. // String value = jsonArray1.getJSONObject(x).getString("value");
  2087. // System.out.println("应出勤天数:" + value);
  2088. // float v = Float.parseFloat(value);
  2089. // if (v == 1) {
  2090. // System.out.println("应出勤天数,进行循环统计!");
  2091. // yingchuqintianshu = yingchuqintianshu + 1;
  2092. // }
  2093. // }
  2094. //
  2095. // //请假天数
  2096. // JSONArray jsonArray = jsonObjectKaoqin.getJSONObject("result").
  2097. // getJSONArray("column_vals").
  2098. // getJSONObject(1).
  2099. // getJSONArray("column_vals");
  2100. // for (int x = 0; x < jsonArray.size(); x++) {
  2101. // //请假天数
  2102. // String value = jsonArray.getJSONObject(x).getString("value");
  2103. // System.out.println("请假天数:" + value);
  2104. // float v = Float.parseFloat(value);
  2105. // if (v > 0) {
  2106. // System.out.println("请假天数,进行循环统计!");
  2107. // qingjiatianshu = qingjiatianshu + v;
  2108. // }
  2109. // }
  2110. // }
  2111. //
  2112. // } catch (ApiException e) {
  2113. // e.printStackTrace();
  2114. // }
  2115. //
  2116. // //应出勤天数
  2117. // BigDecimal ycqts = new BigDecimal(yingchuqintianshu);
  2118. // BigDecimal ycqtsAll = ycqts.setScale(2, BigDecimal.ROUND_DOWN);
  2119. // System.out.println("应出勤天数(浮点数,保留2位小数):" + ycqtsAll);
  2120. // //请假天数
  2121. // BigDecimal qjts = new BigDecimal(qingjiatianshu);
  2122. // BigDecimal qjtsAll = qjts.setScale(2, BigDecimal.ROUND_DOWN);
  2123. // System.out.println("请假天数(浮点数,保留2位小数):" + qjtsAll);
  2124. //
  2125. //
  2126. // /*同步至宜搭*/
  2127. // Map map = new HashMap();
  2128. // //实际统计月份
  2129. // map.put("textField_losayxi8", lastMonthNow);
  2130. //
  2131. // //钉钉userid
  2132. // map.put("textField_los8y15p", userId);
  2133. // //姓名
  2134. // map.put("textField_los8y15q", userName);
  2135. // //主部门
  2136. // map.put("textField_los8y15s", zhubumen);
  2137. // //职位
  2138. // map.put("textField_los8y15x", zhiwei);
  2139. // //邮箱
  2140. // map.put("textField_los8y15y", youxiang);
  2141. //
  2142. // /*TB项目/任务数据*/
  2143. // //项目名称
  2144. // map.put("textField_lp0m06bd", tBxaingmuName);
  2145. // //任务名称
  2146. // map.put("textField_lp0m06be", content);
  2147. // //任务ID
  2148. // map.put("textField_lp8ihks3", objectId);
  2149. // //迭代
  2150. // map.put("textField_lpf88002", diedaiName);
  2151. //
  2152. // //任务工时所属日期
  2153. // map.put("textField_lqn3tjjv", rwgsssrq);
  2154. //
  2155. // //工时类型(计划工时、实际工时)
  2156. // map.put("textField_lrq4uku2", "计划工时");
  2157. //
  2158. //// if (yewuleixing.equals("")) {
  2159. //// //业务类型(修正改这列)
  2160. //// map.put("textField_lp2aqls1", yewuleixing);
  2161. //// //业务类型(统计用,勿动)
  2162. //// map.put("textField_los8y15z", XXX);
  2163. ////
  2164. //// //TODO 后面如果需要在宜搭手动修改,要判断是否存在该数据,如果存在的话这个字段不做更新
  2165. //// //业务类型(原数据,勿动)
  2166. //// map.put("textField_lp2aqls2", XXX);
  2167. //// } else {
  2168. //// //业务类型(修正改这列)
  2169. //// map.put("textField_lp2aqls1", yewuleixing);
  2170. //// //业务类型(统计用,勿动)
  2171. //// map.put("textField_los8y15z", yewuleixing);
  2172. ////
  2173. //// //TODO 后面如果需要在宜搭手动修改,要判断是否存在该数据,如果存在的话这个字段不做更新
  2174. //// //业务类型(原数据,勿动)
  2175. //// map.put("textField_lp2aqls2", yewuleixing);
  2176. //// }
  2177. //
  2178. // /**
  2179. // * 判断同步月份、userid、任务id、任务工时所属日期,是否有该任务
  2180. // * */
  2181. //// String panduan = getYida(lastMonthNow, userId, objectId, rwgsssrq);
  2182. // if (panduan.equals("不存在")) {
  2183. // log.info("该人员在宜搭中该任务的工时【不存在】,写入【业务类型(初版结果)】!");
  2184. //
  2185. // if (yewuleixing.equals("")) {
  2186. // //业务类型(修正改这列)
  2187. // map.put("textField_lp2aqls1", yewuleixing);
  2188. // //业务类型(统计用,勿动)
  2189. // map.put("textField_los8y15z", XXX);
  2190. //
  2191. // //TODO 后面如果需要在宜搭手动修改,要判断是否存在该数据,如果存在的话这个字段不做更新
  2192. // //业务类型(初版结果,勿动)
  2193. // map.put("textField_lp2aqls2", XXX);
  2194. // } else {
  2195. // //业务类型(修正改这列)
  2196. // map.put("textField_lp2aqls1", yewuleixing);
  2197. // //业务类型(统计用,勿动)
  2198. // map.put("textField_los8y15z", yewuleixing);
  2199. //
  2200. // //TODO 后面如果需要在宜搭手动修改,要判断是否存在该数据,如果存在的话这个字段不做更新
  2201. // //业务类型(初版结果,勿动)
  2202. // map.put("textField_lp2aqls2", yewuleixing);
  2203. // }
  2204. // }else {
  2205. // log.info("该人员在宜搭中该任务的工时【存在】,不更新写入【业务类型(初版结果)】!");
  2206. //
  2207. // if (yewuleixing.equals("")) {
  2208. // //业务类型(修正改这列)
  2209. // map.put("textField_lp2aqls1", yewuleixing);
  2210. // //业务类型(统计用,勿动)
  2211. // map.put("textField_los8y15z", XXX);
  2212. // } else {
  2213. // //业务类型(修正改这列)
  2214. // map.put("textField_lp2aqls1", yewuleixing);
  2215. // //业务类型(统计用,勿动)
  2216. // map.put("textField_los8y15z", yewuleixing);
  2217. // }
  2218. // }
  2219. //
  2220. // //统一工时数(天)
  2221. // map.put("numberField_los8y164", gs);
  2222. //
  2223. // /*钉钉考勤数据*/
  2224. // //每月人天(应出勤天数)
  2225. // map.put("numberField_los8y16g", ycqtsAll);
  2226. // //请假天数
  2227. // map.put("numberField_los8y16f", qjtsAll);
  2228. // //是否全投入
  2229. //// map.put("selectField_los8y16e", "否");
  2230. //
  2231. // /*计算字段*/
  2232. // //人月数据:统一工时数(天)/每月人天 //【废弃】
  2233. // map.put("numberField_los8y16c", 0);
  2234. // //SaaS合计:统一工时数(天)+请假成本(天)
  2235. // map.put("numberField_los8y16h", gs);
  2236. // //占比:SaaS合计/每月人天 //【废弃】
  2237. // map.put("numberField_los8y16p", 0);
  2238. //
  2239. // String mapJson = JSON.toJSONString(map);
  2240. // System.out.println("mapJson:" + mapJson);
  2241. //
  2242. // //宜搭表单判断查询条件
  2243. // //判断宜搭人员信息表是否有当前人员userid
  2244. // Map map1 = new HashMap();
  2245. // //字段编号
  2246. // map1.put("key", "textField_los8y15p");
  2247. // //同步类型
  2248. // map1.put("value", userId);
  2249. //// map1.put("value", "userId");
  2250. // //控件类型
  2251. // map1.put("type", "TEXT");
  2252. // //逻辑判断符
  2253. // map1.put("operator", "eq");
  2254. // //控件名称
  2255. // map1.put("componentName", "TextField");
  2256. //
  2257. // //同步数据的所属日期
  2258. // Map map2 = new HashMap();
  2259. // //字段编号
  2260. // map2.put("key", "textField_losayxi8");
  2261. // //同步类型
  2262. // map2.put("value", lastMonthNow);
  2263. // //控件类型
  2264. // map2.put("type", "TEXT");
  2265. // //逻辑判断符
  2266. // map2.put("operator", "eq");
  2267. // //控件名称
  2268. // map2.put("componentName", "TextField");
  2269. //
  2270. // //任务id
  2271. // Map map3 = new HashMap();
  2272. // //字段编号
  2273. // map3.put("key", "textField_lp8ihks3");
  2274. // //同步类型
  2275. // map3.put("value", objectId);
  2276. // //控件类型
  2277. // map3.put("type", "TEXT");
  2278. // //逻辑判断符
  2279. // map3.put("operator", "eq");
  2280. // //控件名称
  2281. // map3.put("componentName", "TextField");
  2282. //
  2283. // //任务工时所属日期
  2284. // Map map4 = new HashMap();
  2285. // //字段编号
  2286. // map4.put("key", "textField_lqn3tjjv");
  2287. // //同步类型
  2288. // map4.put("value", rwgsssrq);
  2289. // //控件类型
  2290. // map4.put("type", "TEXT");
  2291. // //逻辑判断符
  2292. // map4.put("operator", "eq");
  2293. // //控件名称
  2294. // map4.put("componentName", "TextField");
  2295. //
  2296. // /**
  2297. // * 工时类型(计划工时、实际工时)
  2298. // * */
  2299. // Map map5 = new HashMap();
  2300. // //字段编号
  2301. // map5.put("key", "textField_lrq4uku2");
  2302. // //同步类型
  2303. // map5.put("value", "计划工时");
  2304. // //控件类型
  2305. // map5.put("type", "TEXT");
  2306. // //逻辑判断符
  2307. // map5.put("operator", "eq");
  2308. // //控件名称
  2309. // map5.put("componentName", "TextField");
  2310. //
  2311. // List list11 = new ArrayList();
  2312. // list11.add(map1);
  2313. // list11.add(map2);
  2314. // list11.add(map3);
  2315. // list11.add(map4);
  2316. // list11.add(map5);
  2317. //
  2318. // String listJson = JSON.toJSONString(list11);
  2319. // System.out.println("查询条件listJson:" + listJson);
  2320. //
  2321. // //将汇总数据写入【宜搭汇总表】
  2322. // JSONObject jsonObject1;
  2323. // //新增或更新表单实例【宜搭】
  2324. // try {
  2325. // com.aliyun.dingtalkyida_1_0.Client client11 = createClient();
  2326. // com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders createOrUpdateFormDataHeaders = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders();
  2327. // createOrUpdateFormDataHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken();
  2328. // com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest createOrUpdateFormDataRequest = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest()
  2329. // //应用秘钥
  2330. // .setSystemToken("J0A6698165EFMED0AHIG76FW7C6Q3ON1PG5OL482")
  2331. // //表单编码
  2332. // .setFormUuid("FORM-BH766Y61W4CFWBS0869YFBF8COTE2QEHIH5OLM")
  2333. // .setUserId("yida_pub_account")
  2334. // .setSearchCondition(listJson)
  2335. // //应用编码
  2336. // .setAppType("APP_QHPV3T4ZU2Y88Q4U0UDA")
  2337. // .setFormDataJson(mapJson);
  2338. //
  2339. // CreateOrUpdateFormDataResponse orUpdateFormDataWithOptions = client11.createOrUpdateFormDataWithOptions(createOrUpdateFormDataRequest, createOrUpdateFormDataHeaders, new RuntimeOptions());
  2340. // String s = JSON.toJSONString(orUpdateFormDataWithOptions.getBody());
  2341. // jsonObject1 = JSON.parseObject(s);
  2342. // System.out.println("【创建或更新】表单object对象:" + jsonObject1);
  2343. // } catch (TeaException err) {
  2344. // if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
  2345. // // err 中含有 code 和 message 属性,可帮助开发定位问题
  2346. // }
  2347. // } catch (Exception _err) {
  2348. // TeaException err = new TeaException(_err.getMessage(), _err);
  2349. // if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
  2350. // // err 中含有 code 和 message 属性,可帮助开发定位问题
  2351. // }
  2352. // }
  2353. // /*同步至宜搭*/
  2354. // }
  2355. }
  2356. }
  2357. }
  2358. if (result.isEmpty() && result1.isEmpty()){
  2359. log.info("当计划工时和实际工时都为空的情况,将同步该人员的一条记录,并记录钉钉考勤信息。");
  2360. /*同步钉钉数据*/
  2361. //应出勤天数
  2362. float yingchuqintianshu = 0;
  2363. //请假天数
  2364. float qingjiatianshu = 0;
  2365. //查询上月考勤数据,统计上月应出勤天数、请假天数
  2366. try {
  2367. DingTalkClient client11 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/getcolumnval");
  2368. OapiAttendanceGetcolumnvalRequest req = new OapiAttendanceGetcolumnvalRequest();
  2369. //TODO 待查询人员的userid
  2370. req.setUserid(userId);
  2371. //考勤报表列定义查出来的工作时长的列id(固定)
  2372. req.setColumnIdList("176150482,985267953");
  2373. //TODO 查询开始时间
  2374. req.setFromDate(StringUtils.parseDateTime(FORMtime));
  2375. //TODO 查询结束时间
  2376. req.setToDate(StringUtils.parseDateTime(TOtime));
  2377. OapiAttendanceGetcolumnvalResponse rsp = client11.execute(req, accessTokenService.getAccessToken());
  2378. // System.out.println(rsp.getBody());
  2379. String string = rsp.getBody();
  2380. JSONObject jsonObjectKaoqin = JSON.parseObject(string);
  2381. int errcode = jsonObjectKaoqin.getInteger("errcode");
  2382. System.out.println("考勤时间周期查询结果状态码:" + errcode);
  2383. String errmsg = jsonObjectKaoqin.getString("errmsg");
  2384. System.out.println("考勤时间周期查询结果状态信息:" + errmsg);
  2385. if (errcode != 0) {
  2386. log.info("考勤时间周期查询结果反馈异常,异常状态码:" + errcode + "【" + errmsg + "】");
  2387. } else {
  2388. //应出勤天数
  2389. JSONArray jsonArray1 = jsonObjectKaoqin.getJSONObject("result").
  2390. getJSONArray("column_vals").
  2391. getJSONObject(0).
  2392. getJSONArray("column_vals");
  2393. for (int x = 0; x < jsonArray1.size(); x++) {
  2394. //应出勤天数
  2395. String value = jsonArray1.getJSONObject(x).getString("value");
  2396. System.out.println("应出勤天数:" + value);
  2397. float v = Float.parseFloat(value);
  2398. if (v == 1) {
  2399. System.out.println("应出勤天数,进行循环统计!");
  2400. yingchuqintianshu = yingchuqintianshu + 1;
  2401. }
  2402. }
  2403. //请假天数
  2404. JSONArray jsonArray = jsonObjectKaoqin.getJSONObject("result").
  2405. getJSONArray("column_vals").
  2406. getJSONObject(1).
  2407. getJSONArray("column_vals");
  2408. for (int x = 0; x < jsonArray.size(); x++) {
  2409. //请假天数
  2410. String value = jsonArray.getJSONObject(x).getString("value");
  2411. System.out.println("请假天数:" + value);
  2412. float v = Float.parseFloat(value);
  2413. if (v > 0) {
  2414. System.out.println("请假天数,进行循环统计!");
  2415. qingjiatianshu = qingjiatianshu + v;
  2416. }
  2417. }
  2418. }
  2419. } catch (ApiException e) {
  2420. e.printStackTrace();
  2421. }
  2422. //应出勤天数
  2423. BigDecimal ycqts = new BigDecimal(yingchuqintianshu);
  2424. BigDecimal ycqtsAll = ycqts.setScale(2, BigDecimal.ROUND_DOWN);
  2425. System.out.println("应出勤天数(浮点数,保留2位小数):" + ycqtsAll);
  2426. //请假天数
  2427. BigDecimal qjts = new BigDecimal(qingjiatianshu);
  2428. BigDecimal qjtsAll = qjts.setScale(2, BigDecimal.ROUND_DOWN);
  2429. System.out.println("请假天数(浮点数,保留2位小数):" + qjtsAll);
  2430. /*同步至宜搭*/
  2431. Map map = new HashMap();
  2432. //实际统计月份
  2433. map.put("textField_losayxi8", lastMonthNow);
  2434. //钉钉userid
  2435. map.put("textField_los8y15p", userId);
  2436. //姓名
  2437. map.put("textField_los8y15q", userName);
  2438. //主部门
  2439. map.put("textField_los8y15s", zhubumen);
  2440. //职位
  2441. map.put("textField_los8y15x", zhiwei);
  2442. //邮箱
  2443. map.put("textField_los8y15y", youxiang);
  2444. /*TB项目/任务数据*/
  2445. // //项目名称
  2446. // map.put("textField_lp0m06bd", "");
  2447. // //任务名称
  2448. // map.put("textField_lp0m06be", "");
  2449. // //业务类型
  2450. // map.put("textField_los8y15z", "");
  2451. // //统一工时数(天)
  2452. // map.put("numberField_los8y164", 0);
  2453. /*钉钉考勤数据*/
  2454. //每月人天(应出勤天数)
  2455. map.put("numberField_los8y16g", ycqtsAll);
  2456. //请假天数
  2457. map.put("numberField_los8y16f", qjtsAll);
  2458. //是否全投入
  2459. // map.put("selectField_los8y16e", "否");
  2460. /*计算字段*/
  2461. // //人月数据:统一工时数(天)/每月人天
  2462. // map.put("numberField_los8y16c", 0);
  2463. // //SaaS合计:统一工时数(天)+请假成本(天)
  2464. // map.put("numberField_los8y16h", 0);
  2465. // //占比:SaaS合计/每月人天
  2466. // map.put("numberField_los8y16p", 0);
  2467. String mapJson = JSON.toJSONString(map);
  2468. System.out.println("mapJson:" + mapJson);
  2469. //宜搭表单判断查询条件
  2470. //判断宜搭人员信息表是否有当前人员userid
  2471. Map map1 = new HashMap();
  2472. //字段编号
  2473. map1.put("key", "textField_los8y15p");
  2474. //同步类型
  2475. map1.put("value", userId);
  2476. // map1.put("value", "userId");
  2477. //控件类型
  2478. map1.put("type", "TEXT");
  2479. //逻辑判断符
  2480. map1.put("operator", "eq");
  2481. //控件名称
  2482. map1.put("componentName", "TextField");
  2483. Map map2 = new HashMap();
  2484. //字段编号
  2485. map2.put("key", "textField_losayxi8");
  2486. //同步类型
  2487. map2.put("value", lastMonthNow);
  2488. //控件类型
  2489. map2.put("type", "TEXT");
  2490. //逻辑判断符
  2491. map2.put("operator", "eq");
  2492. //控件名称
  2493. map2.put("componentName", "TextField");
  2494. List list11 = new ArrayList();
  2495. list11.add(map1);
  2496. list11.add(map2);
  2497. String listJson = JSON.toJSONString(list11);
  2498. System.out.println("查询条件listJson:" + listJson);
  2499. //将汇总数据写入【宜搭汇总表】
  2500. JSONObject jsonObject;
  2501. //新增或更新表单实例【宜搭】
  2502. try {
  2503. com.aliyun.dingtalkyida_1_0.Client client11 = createClient();
  2504. com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders createOrUpdateFormDataHeaders = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataHeaders();
  2505. createOrUpdateFormDataHeaders.xAcsDingtalkAccessToken = accessTokenService.getAccessToken();
  2506. com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest createOrUpdateFormDataRequest = new com.aliyun.dingtalkyida_1_0.models.CreateOrUpdateFormDataRequest()
  2507. //应用秘钥
  2508. .setSystemToken("J0A6698165EFMED0AHIG76FW7C6Q3ON1PG5OL482")
  2509. //表单编码
  2510. .setFormUuid("FORM-BH766Y61W4CFWBS0869YFBF8COTE2QEHIH5OLM")
  2511. .setUserId("yida_pub_account")
  2512. .setSearchCondition(listJson)
  2513. //应用编码
  2514. .setAppType("APP_QHPV3T4ZU2Y88Q4U0UDA")
  2515. .setFormDataJson(mapJson);
  2516. CreateOrUpdateFormDataResponse orUpdateFormDataWithOptions = client11.createOrUpdateFormDataWithOptions(createOrUpdateFormDataRequest, createOrUpdateFormDataHeaders, new RuntimeOptions());
  2517. String s = JSON.toJSONString(orUpdateFormDataWithOptions.getBody());
  2518. jsonObject = JSON.parseObject(s);
  2519. // System.out.println("【创建或更新】表单object对象:" + jsonObject);
  2520. } catch (TeaException err) {
  2521. if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
  2522. // err 中含有 code 和 message 属性,可帮助开发定位问题
  2523. }
  2524. } catch (Exception _err) {
  2525. TeaException err = new TeaException(_err.getMessage(), _err);
  2526. if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
  2527. // err 中含有 code 和 message 属性,可帮助开发定位问题
  2528. }
  2529. }
  2530. /*同步至宜搭*/
  2531. }
  2532. // }
  2533. }
  2534. }
  2535. }
  2536. log.info("统计结束!");
  2537. return "统计完成!";
  2538. }
  2539. }