SikuTaskServiceImpl.java 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. package com.malk.siku.service.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.malk.server.aliwork.YDConf;
  4. import com.malk.server.aliwork.YDParam;
  5. import com.malk.server.common.McException;
  6. import com.malk.server.dingtalk.DDR_New;
  7. import com.malk.service.aliwork.YDClient;
  8. import com.malk.service.dingtalk.DDClient;
  9. import com.malk.siku.service.SikuTaskService;
  10. import com.malk.siku.utils.MkBxUtil;
  11. import com.malk.utils.UtilHttp;
  12. import com.malk.utils.UtilMap;
  13. import lombok.extern.slf4j.Slf4j;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.stereotype.Service;
  16. import java.util.*;
  17. @Slf4j
  18. @Service
  19. public class SikuTaskServiceImpl implements SikuTaskService {
  20. @Autowired
  21. private YDClient ydClient;
  22. @Autowired
  23. private DDClient ddClient;
  24. @Override
  25. public void syncLoanManage() {
  26. try {
  27. log.info("开始同步借还款台账");
  28. //删除宜搭借款台账
  29. List<List<String>> formInstanceIdListList = new ArrayList<>();//实例id集合,每100条
  30. DDR_New ddrNew = new DDR_New();
  31. int pageSize = 50;
  32. int pageNumber = 0;
  33. do {
  34. pageNumber++;
  35. ddrNew = retryQueryData(YDParam.builder()
  36. .formUuid("FORM-14F79868B683481295062CD1D643E06EVB7B")
  37. .searchFieldJson("")
  38. .pageNumber(pageNumber)
  39. .pageSize(pageSize)
  40. .build(), YDConf.FORM_QUERY.retrieve_search_form_id);
  41. formInstanceIdListList.addAll(Collections.singleton((List<String>) ddrNew.getData()));
  42. // Thread.sleep(1000);
  43. }while (ddrNew.getPageNumber() * pageSize < ddrNew.getTotalCount());
  44. for (List<String> formInstanceIdList : formInstanceIdListList) {
  45. if (!formInstanceIdList.isEmpty()){
  46. retryOperateData(YDParam.builder()
  47. .formUuid("FORM-14F79868B683481295062CD1D643E06EVB7B")
  48. .formInstanceIdList(formInstanceIdList)
  49. .build(), YDConf.FORM_OPERATION.delete_batch);
  50. }
  51. }
  52. }catch (Exception e){
  53. e.printStackTrace();
  54. }
  55. //查询每刻最新借款台账
  56. List<Map> loanManageList = MkBxUtil.loanManageList();
  57. for (Map loanManage : loanManageList) {
  58. String code = UtilMap.getString(loanManage, "code");//台账编号\
  59. String formCode = UtilMap.getString(loanManage, "formCode");//借款单单据号
  60. String legalEntityName = UtilMap.getString(loanManage, "legalEntityName");//所属公司
  61. String departmentName = UtilMap.getString(loanManage, "departmentName");//借款部门
  62. String employeeName = UtilMap.getString(loanManage, "employeeName");//借款人
  63. List<String> employeeDdUser = getDdUserId(employeeName);
  64. String responseUserName = UtilMap.getString(loanManage, "responseUserName");//负责人
  65. List<String> responseDdUser = getDdUserId(responseUserName);
  66. String formName = UtilMap.getString(loanManage, "formName");//事由
  67. String formSubTypeName = UtilMap.getString(loanManage, "formSubTypeName");//单据类型
  68. long submittedAt = UtilMap.getLong(loanManage, "submittedAt");//提单时间
  69. long expectRepaymentTime = UtilMap.getLong(loanManage, "expectRepaymentTime");//预计归还时间
  70. int loanAge = UtilMap.getInt(loanManage, "loanAge");//账龄
  71. Double amount = UtilMap.getDouble(UtilMap.getMap(loanManage, "approvedAmount"), "amount");//借款金额
  72. Double owedAmount = UtilMap.getDouble(UtilMap.getMap(loanManage, "owedAmount"), "amount");//未归还(未核销)
  73. Double pendingAmount = UtilMap.getDouble(UtilMap.getMap(loanManage, "pendingAmount"), "amount");//核销中金额
  74. //借款单详情
  75. Map loanDetailInfo = MkBxUtil.loanDetailInfo(formCode);
  76. Map customObject = UtilMap.getMap(loanDetailInfo, "customObject");
  77. Map cf0 = UtilMap.getMap(customObject, "CF0");
  78. String projectCode = UtilMap.getString(cf0, "detailBusinessCode");//项目流水号
  79. String projectName = UtilMap.getString(cf0, "text");//项目名称
  80. long settledAt = UtilMap.getLong(loanDetailInfo, "settledAt");//支付时间
  81. Map formData = new HashMap();
  82. formData.put("textField_mnsly3li",code);
  83. formData.put("textField_mnsly3lb",legalEntityName);
  84. formData.put("textField_mnsly3lc",departmentName);
  85. formData.put("employeeField_mnsly3mc",employeeDdUser);
  86. formData.put("employeeField_mnsly3md",responseDdUser);
  87. formData.put("textField_mnsm8q6f",projectName);
  88. formData.put("textField_mnwtwu9z",projectCode);
  89. formData.put("textareaField_mnsly3ll",formName);
  90. formData.put("textField_mnsly3lg",formSubTypeName);
  91. formData.put("dateField_mnsly3lx",submittedAt);
  92. formData.put("dateField_mnsly3ly",expectRepaymentTime);
  93. formData.put("dateField_mnsly3m3",settledAt);
  94. formData.put("numberField_mnsly3m4",loanAge);
  95. formData.put("numberField_mnsly3m5",amount);
  96. formData.put("numberField_mnsly3ma",owedAmount);
  97. formData.put("numberField_mnsly3mb",pendingAmount);
  98. //同步宜搭借款台账
  99. ydClient.operateData(YDParam.builder()
  100. .formUuid("FORM-14F79868B683481295062CD1D643E06EVB7B")
  101. .formDataJson(JSONObject.toJSONString(formData))
  102. .build(), YDConf.FORM_OPERATION.create);
  103. }
  104. System.out.println("111");
  105. }
  106. //自带重试的operateData方法
  107. private Object retryOperateData(YDParam param, YDConf.FORM_OPERATION formOperation) {
  108. int maxAttempts = 3; // 尝试的最大次数
  109. int attempt = 0;
  110. Object result = null;
  111. while (attempt < maxAttempts) {
  112. try {
  113. result = ydClient.operateData(param, formOperation);
  114. return result;
  115. } catch (McException e) {
  116. log.info("错误信息:{}",e.getMessage());
  117. if (e.getMessage().equals("The request has failed due to a temporary failure of the server.")) {
  118. attempt++;
  119. // 线程睡眠3秒
  120. try {
  121. Thread.sleep(5000);
  122. log.info("尝试第{}次,param:{},FORM_OPERATION:{},异常信息:{}", attempt, JSONObject.toJSONString(param), formOperation,e.getMessage());
  123. } catch (InterruptedException ie) {
  124. Thread.currentThread().interrupt(); // 重新设置中断状态
  125. System.err.println("Sleep interrupted: " + ie.getMessage());
  126. }
  127. }
  128. } catch (Exception e) {
  129. log.error("操作失败,param:{},FORM_OPERATION:{},异常信息:{}", JSONObject.toJSONString(param), formOperation,e.getMessage());
  130. throw new RuntimeException(e);
  131. }
  132. }
  133. throw new RuntimeException("超出最大重试次数,param:"+JSONObject.toJSONString(param)+",FORM_OPERATION:{}"+formOperation);
  134. }
  135. //自带重试的queryData方法
  136. private DDR_New retryQueryData(YDParam param, YDConf.FORM_QUERY formQuery) {
  137. int maxAttempts = 3; // 尝试的最大次数
  138. int attempt = 0;
  139. DDR_New result = null;
  140. while (attempt < maxAttempts) {
  141. try {
  142. result = ydClient.queryData(param, formQuery);
  143. return result;
  144. } catch (McException e) {
  145. log.info("错误信息:{}",e.getMessage());
  146. if (e.getMessage().equals("The request has failed due to a temporary failure of the server.")) {
  147. attempt++;
  148. // 线程睡眠3秒
  149. try {
  150. Thread.sleep(5000);
  151. log.info("尝试第{}次,param:{},FORM_QUERY:{},异常信息:{}", attempt, JSONObject.toJSONString(param), formQuery,e.getMessage());
  152. } catch (InterruptedException ie) {
  153. Thread.currentThread().interrupt(); // 重新设置中断状态
  154. System.err.println("Sleep interrupted: " + ie.getMessage());
  155. }
  156. }
  157. } catch (Exception e) {
  158. log.error("操作失败,param:{},FORM_QUERY:{},异常信息:{}", JSONObject.toJSONString(param), formQuery,e.getMessage());
  159. throw new RuntimeException(e);
  160. }
  161. }
  162. throw new RuntimeException("超出最大重试次数,param:"+JSONObject.toJSONString(param)+",FORM_QUERY:{}"+formQuery);
  163. }
  164. //根据员工名字匹配员工id
  165. private List<String> getDdUserId(String Name){
  166. HashMap body = new HashMap();
  167. body.put("queryWord", Name);
  168. body.put("offset",0);
  169. body.put("size",1);
  170. String s1 = UtilHttp.doPost("https://api.dingtalk.com/v1.0/contact/users/search", ddClient.initTokenHeader(), null, body);
  171. List<String> list = JSONObject.parseObject(s1).getJSONArray("list").toJavaList(String.class);
  172. return list;
  173. }
  174. }