KdYdCustomerController.java 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649
  1. package com.malk.huagao.controller;
  2. import cn.hutool.core.date.DateUnit;
  3. import cn.hutool.core.date.DateUtil;
  4. import com.alibaba.fastjson.JSON;
  5. import com.alibaba.fastjson.JSONArray;
  6. import com.alibaba.fastjson.JSONObject;
  7. import com.malk.huagao.service.IKdYdCustomerService;
  8. import com.malk.huagao.service.IKdYdZpService;
  9. import com.malk.huagao.service.YdHuaGaoService;
  10. import com.malk.server.aliwork.YDConf;
  11. import com.malk.server.aliwork.YDParam;
  12. import com.malk.server.aliwork.YDSearch;
  13. import com.malk.server.common.McException;
  14. import com.malk.server.common.McR;
  15. import com.malk.server.dingtalk.DDConf;
  16. import com.malk.server.dingtalk.DDR_New;
  17. import com.malk.service.aliwork.YDClient;
  18. import com.malk.service.aliwork.YDService;
  19. import com.malk.service.dingtalk.DDClient;
  20. import com.malk.service.dingtalk.DDClient_Contacts;
  21. import com.malk.service.dingtalk.DDClient_Extension;
  22. import com.malk.service.dingtalk.DDClient_Workflow;
  23. import com.malk.utils.UtilHttp;
  24. import com.malk.utils.UtilMap;
  25. import lombok.extern.slf4j.Slf4j;
  26. import org.apache.commons.lang3.StringEscapeUtils;
  27. import org.apache.commons.lang3.StringUtils;
  28. import org.slf4j.MDC;
  29. import org.springframework.beans.factory.annotation.Autowired;
  30. import org.springframework.web.bind.annotation.PostMapping;
  31. import org.springframework.web.bind.annotation.RequestBody;
  32. import org.springframework.web.bind.annotation.RequestMapping;
  33. import org.springframework.stereotype.Controller;
  34. import org.springframework.web.bind.annotation.RestController;
  35. import java.time.LocalDate;
  36. import java.time.ZoneId;
  37. import java.util.*;
  38. import java.util.stream.Collectors;
  39. /**
  40. * <p>
  41. * 前端控制器
  42. * </p>
  43. *
  44. * @author LQY
  45. * @since 2025-10-09
  46. */
  47. @RestController
  48. @Slf4j
  49. @RequestMapping("/hg")
  50. public class KdYdCustomerController {
  51. @Autowired
  52. private IKdYdCustomerService kdYdCustomerService;
  53. @Autowired
  54. private YdHuaGaoService ydHuaGaoService;
  55. @Autowired
  56. private IKdYdZpService kdYdZpService;
  57. @Autowired
  58. private DDClient_Contacts ddClient_contacts;
  59. @Autowired
  60. private DDClient ddClient;
  61. @Autowired
  62. private DDClient_Extension ddClientExtension;
  63. @Autowired
  64. private YDClient ydClient;
  65. @Autowired
  66. private DDConf ddConf;
  67. @Autowired
  68. private YDService ydService;
  69. @PostMapping("/test")
  70. public McR sendGroupMsg(@RequestBody JSONObject param) {
  71. log.info("推送消息:{}", param);
  72. McException.assertParamException_Null(param, "msgParam", "msgKey", "openConversationId", "robotCode", "coolAppCode");
  73. Map map = ddClientExtension.sendGroupMessages(ddClient.getAccessToken(), param.getJSONObject("msgParam"), param.getString("msgKey"), param.getString("openConversationId")
  74. , param.getString("robotCode"), param.getString("coolAppCode"));
  75. return McR.success(map);
  76. }
  77. @PostMapping("/test33")
  78. public McR test18(@RequestBody Map data) {
  79. MDC.put("MDC_KEY_PID", "1003");
  80. String formUuid = "FORM-F79B680547674A6BBD11C0D511E3C14B28FY";
  81. long now = System.currentTimeMillis();
  82. long dayMillis = 24L * 60 * 60 * 1000;
  83. ZoneId zoneId = ZoneId.of("Asia/Shanghai");
  84. long startTime = LocalDate.now(zoneId).atStartOfDay(zoneId).toInstant().toEpochMilli();
  85. long endTime = LocalDate.now(zoneId).plusDays(15).atStartOfDay(zoneId).toInstant().toEpochMilli() - 1;
  86. List<Map> list = null;
  87. // 查询重试(您已有的逻辑保留)
  88. for (int attempt = 1; attempt <= 3; attempt++) {
  89. try {
  90. list = ydService.queryFormData_all(
  91. YDParam.builder()
  92. .formUuid(formUuid)
  93. .searchFieldJson(JSONObject.toJSONString(Arrays.asList(
  94. new YDSearch("dateField_mjm9k35l", Arrays.asList(startTime, endTime),
  95. "DateField", YDSearch.Type.DATE_FIELD, YDSearch.Operator.BETWEEN),
  96. // // 如果需要过滤 textField_mjm9k35n = "666",保留;否则删除
  97. // new YDSearch("textField_mjm9k35n", "666",
  98. // "TextField", YDSearch.Type.TEXT_FIELD, YDSearch.Operator.EQ),
  99. new YDSearch("radioField_mru0o7u6", "是",
  100. "RadioField", YDSearch.Type.RADIO_FIELD, YDSearch.Operator.EQ)
  101. )))
  102. .build()
  103. );
  104. break;
  105. } catch (Exception e) {
  106. log.warn("查询宜搭数据第 {} 次失败:{}", attempt, e.getMessage(), e);
  107. if (attempt == 3) return McR.errorParam("查询宜搭数据失败:" + e.getMessage());
  108. try { Thread.sleep(2000L); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); return McR.errorParam("查询被中断"); }
  109. }
  110. }
  111. if (list == null || list.isEmpty()) {
  112. log.info("没有找到需要处理的单据");
  113. return McR.success("无待处理数据");
  114. }
  115. String accessToken;
  116. try {
  117. accessToken = ddClient.getAccessToken();
  118. } catch (Exception e) {
  119. log.warn("获取钉钉 accessToken 失败:{}", e.getMessage(), e);
  120. return McR.errorParam("获取钉钉 accessToken 失败:" + e.getMessage());
  121. }
  122. Number agentId = ddConf.getAgentId();
  123. List<String> releaseIds = new ArrayList<>();
  124. log.info("共查询到 {} 条待处理单据", list.size());
  125. for (Map item : list) {
  126. long releaseTime = UtilMap.getLong(item, "dateField_mjm9k35l");
  127. if (releaseTime <= 0) {
  128. log.warn("释放日期为空,跳过:{}", item);
  129. continue;
  130. }
  131. Object idObj = item.get("textField_ms2nby3g");
  132. if (idObj == null) idObj = item.get("formInstId");
  133. String formInstanceId = idObj == null ? null : String.valueOf(idObj);
  134. if (StringUtils.isBlank(formInstanceId) || "null".equals(formInstanceId)) {
  135. log.warn("formInstanceId 为空,跳过:{}", item);
  136. continue;
  137. }
  138. // 到期释放
  139. if (releaseTime <= now) {
  140. releaseIds.add(formInstanceId);
  141. continue;
  142. }
  143. // 提取申请人
  144. String sqr = null;
  145. Object sqrObj = item.get("employeeField_mjm9k35m_id");
  146. if (sqrObj instanceof List) {
  147. List sqrList = (List) sqrObj;
  148. if (!sqrList.isEmpty()) sqr = String.valueOf(sqrList.get(0));
  149. } else if (sqrObj != null) {
  150. String sqrText = String.valueOf(sqrObj);
  151. try {
  152. JSONArray sqrArray = JSON.parseArray(sqrText);
  153. if (sqrArray != null && !sqrArray.isEmpty()) sqr = sqrArray.getString(0);
  154. } catch (Exception e) {
  155. sqr = sqrText;
  156. }
  157. }
  158. if (StringUtils.isBlank(sqr) || "null".equals(sqr)) {
  159. log.warn("申请人为空,跳过提醒:{}", formInstanceId);
  160. continue;
  161. }
  162. String type = String.valueOf(item.get("selectField_l3nrjuq0"));
  163. String khmc = String.valueOf(item.get("textField_mjm9k35o"));
  164. long days = (releaseTime - now + dayMillis - 1) / dayMillis;
  165. String msg = null;
  166. if ("未成交".equals(type)) {
  167. msg = khmc + " 客户近三个月内未成交,还剩 " + days + " 天即将释放到公海";
  168. } else if ("半年金额不足".equals(type)) {
  169. msg = khmc + " 客户近半年内成交未达到7.5w,还剩 " + days + " 天即将释放到公海";
  170. } else if ("一年金额不足".equals(type)) {
  171. msg = khmc + " 客户近一年内成交未达到15w,还剩 " + days + " 天即将释放到公海";
  172. }
  173. if (msg != null) {
  174. try {
  175. sendDdMsg(accessToken, agentId, sqr, msg);
  176. } catch (Exception e) {
  177. log.warn("发送钉钉提醒失败,formInstanceId={},原因:{}", formInstanceId, e.getMessage());
  178. }
  179. }
  180. }
  181. // ========== 批量释放(微调:增加批次间隔) ==========
  182. int totalSuccess = 0;
  183. if (!releaseIds.isEmpty()) {
  184. Map<String, Object> formData = new HashMap<>();
  185. formData.put("employeeField_lqanqe6n", Arrays.asList());
  186. formData.put("employeeField_lqanqe6o", Arrays.asList());
  187. formData.put("selectField_megi74y7", "公司分配");
  188. formData.put("employeeField_megi74yl", Arrays.asList());
  189. int batchSize = 50;
  190. int maxRetry = 5; // 如果3次不够,改成10或20
  191. int totalBatch = (releaseIds.size() + batchSize - 1) / batchSize;
  192. for (int i = 0; i < releaseIds.size(); i += batchSize) {
  193. int end = Math.min(i + batchSize, releaseIds.size());
  194. List<String> batch = releaseIds.subList(i, end);
  195. int batchNo = (i / batchSize) + 1;
  196. for (int attempt = 1; attempt <= maxRetry; attempt++) {
  197. try {
  198. ydClient.operateData(
  199. YDParam.builder()
  200. .formUuid("FORM-68154CC0A7054BF0B1C933752CD3881FB0SR")
  201. .formInstanceIdList(batch)
  202. .useLatestVersion(true)
  203. .updateFormDataJson(JSON.toJSONString(formData))
  204. .build(),
  205. YDConf.FORM_OPERATION.multi_update
  206. );
  207. totalSuccess += batch.size();
  208. log.info("释放批次 {}/{} 成功,数量 {}", batchNo, totalBatch, batch.size());
  209. break;
  210. } catch (Exception e) {
  211. log.warn("释放批次 {}/{} 第 {} 次失败:{}", batchNo, totalBatch, attempt, e.getMessage(), e);
  212. if (attempt < maxRetry) {
  213. try { Thread.sleep(2000L); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); return McR.errorParam("批量释放被中断"); }
  214. } else {
  215. log.error("释放批次 {}/{} 最终失败", batchNo, totalBatch);
  216. }
  217. }
  218. }
  219. // ========== 新增:批次间隔1秒 ==========
  220. if (i + batchSize < releaseIds.size()) {
  221. try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
  222. }
  223. }
  224. }
  225. log.info("处理完成,查询 {} 条,到期释放 {} 条", list.size(), totalSuccess);
  226. return McR.success("处理完成,查询 " + list.size() + " 条,到期释放 " + totalSuccess + " 条");
  227. }
  228. @PostMapping("/test32")
  229. McR test13(@RequestBody Map data) {
  230. MDC.put("MDC_KEY_PID", "1003");
  231. //当前时间戳
  232. long endTime = System.currentTimeMillis();
  233. long ndTime = endTime + 365L * 24 * 60 * 60 * 1000;
  234. long lcTime = endTime + 90L * 24 * 60 * 60 * 1000;
  235. // long startTime = endTime - 14L * 24 * 60 * 60 * 1000;
  236. List<Map> list = ydService.queryFormData_all(
  237. YDParam.builder()
  238. .formUuid("FORM-F79B680547674A6BBD11C0D511E3C14B28FY")
  239. .searchFieldJson(JSONObject.toJSONString(Arrays.asList(
  240. new YDSearch(
  241. "dateField_mjz31qkm",
  242. endTime,
  243. "DateField",
  244. YDSearch.Type.DATE_FIELD,
  245. YDSearch.Operator.LE
  246. )
  247. // new YDSearch(
  248. // "radioField_mru0o7u6",
  249. // "是",
  250. // "RadioField",
  251. // YDSearch.Type.RADIO_FIELD,
  252. // YDSearch.Operator.EQ
  253. // )
  254. )))
  255. .build()
  256. );
  257. log.info("查询结果:{}", list);
  258. List<String> allIds = list.stream()
  259. .map(item -> String.valueOf(item.get("formInstanceId")))
  260. .filter(StringUtils::isNotBlank)
  261. .collect(Collectors.toList());
  262. Map<String, Object> upData = new HashMap<>();
  263. upData.put("dateField_mjm9k35j", endTime);
  264. upData.put("dateField_mjqkkcsg", endTime);
  265. upData.put("numberField_mjm9k35k", 0);
  266. upData.put("selectField_l3nrjuq0", "未成交");
  267. upData.put("dateField_mjz31qkm", ndTime);
  268. upData.put("dateField_mjm9k35l", lcTime);
  269. int batchSize = 50;
  270. int totalSuccess = 0;
  271. for (int i = 0; i < allIds.size(); i += batchSize) {
  272. int end = Math.min(i + batchSize, allIds.size());
  273. List<String> batch = allIds.subList(i, end);
  274. for (int attempt = 1; attempt <= 30; attempt++) {
  275. try {
  276. ydClient.operateData(YDParam.builder()
  277. .formInstanceIdList(batch)
  278. .formUuid("FORM-F79B680547674A6BBD11C0D511E3C14B28FY")
  279. .useLatestVersion(true)
  280. .updateFormDataJson(JSON.toJSONString(upData))
  281. .build(), YDConf.FORM_OPERATION.multi_update);
  282. totalSuccess += batch.size();
  283. log.info("批次 {}/{} 成功", (i / batchSize) + 1, (allIds.size() + batchSize - 1) / batchSize);
  284. break;
  285. } catch (Exception e) {
  286. log.warn("批次 {}/{} 第 {} 次失败", (i / batchSize) + 1, attempt, e.getMessage());
  287. if (attempt < 2000) {
  288. try {
  289. Thread.sleep(2000);
  290. } catch (InterruptedException ie) {
  291. Thread.currentThread().interrupt();
  292. }
  293. }
  294. }
  295. }
  296. }
  297. return McR.success("处理完成,成功 " + totalSuccess + "/" + allIds.size() + " 条");
  298. }
  299. @PostMapping("/test31")
  300. public McR test15(@RequestBody Map data) {
  301. MDC.put("MDC_KEY_PID", "1003");
  302. List<Map> list = ydService.queryFormData_all(YDParam.builder()
  303. .formUuid("FORM-68154CC0A7054BF0B1C933752CD3881FB0SR").build());
  304. if (list == null || list.isEmpty()) {
  305. return McR.success("无待处理数据");
  306. }
  307. List<String> allIds = list.stream()
  308. .map(item -> String.valueOf(item.get("formInstanceId")))
  309. .filter(StringUtils::isNotBlank)
  310. .collect(Collectors.toList());
  311. Map<String, Object> formData = new HashMap<>();
  312. formData.put("radioField_mru0o7u6", "是");
  313. int batchSize = 50;
  314. int totalSuccess = 0;
  315. for (int i = 0; i < allIds.size(); i += batchSize) {
  316. int end = Math.min(i + batchSize, allIds.size());
  317. List<String> batch = allIds.subList(i, end);
  318. for (int attempt = 1; attempt <= 50; attempt++) {
  319. try {
  320. ydClient.operateData(YDParam.builder()
  321. .formInstanceIdList(batch)
  322. .formUuid("FORM-68154CC0A7054BF0B1C933752CD3881FB0SR")
  323. .useLatestVersion(true)
  324. .updateFormDataJson(JSON.toJSONString(formData))
  325. .build(), YDConf.FORM_OPERATION.multi_update);
  326. totalSuccess += batch.size();
  327. log.info("批次 {}/{} 成功", (i / batchSize) + 1, (allIds.size() + batchSize - 1) / batchSize);
  328. break;
  329. } catch (Exception e) {
  330. log.warn("批次 {}/{} 第 {} 次失败", (i / batchSize) + 1, attempt, e.getMessage());
  331. if (attempt < 2000) {
  332. try {
  333. Thread.sleep(2000);
  334. } catch (InterruptedException ie) {
  335. Thread.currentThread().interrupt();
  336. }
  337. }
  338. }
  339. }
  340. }
  341. return McR.success("处理完成,成功 " + totalSuccess + "/" + allIds.size() + " 条");
  342. }
  343. @PostMapping("/test30")
  344. McR test16(@RequestBody Map data) {
  345. MDC.put("MDC_KEY_PID", "1003");
  346. //当前时间戳
  347. long endTime = System.currentTimeMillis();
  348. long startTime = endTime - 14L * 24 * 60 * 60 * 1000;
  349. // List<Map> list = ydService.queryFormData_all(
  350. // YDParam.builder()
  351. // .formUuid("FORM-F79B680547674A6BBD11C0D511E3C14B28FY")
  352. // .searchFieldJson(JSONObject.toJSONString(Arrays.asList(
  353. // new YDSearch(
  354. // "dateField_mjz31qkm",
  355. // endTime,
  356. // "DateField",
  357. // YDSearch.Type.DATE_FIELD,
  358. // YDSearch.Operator.GE
  359. // ),
  360. // new YDSearch(
  361. // "radioField_mru0o7u6",
  362. // "是",
  363. // "RadioField",
  364. // YDSearch.Type.RADIO_FIELD,
  365. // YDSearch.Operator.EQ
  366. // )
  367. // )))
  368. // .build()
  369. // );
  370. List<Map> list = ydService.queryFormData_all(
  371. YDParam.builder()
  372. .formUuid("FORM-F79B680547674A6BBD11C0D511E3C14B28FY")
  373. .searchFieldJson(JSONObject.toJSONString(Arrays.asList(
  374. // new YDSearch(
  375. // "dateField_mjm9k35l",
  376. // Arrays.asList(startTime, endTime),
  377. // "DateField",
  378. // YDSearch.Type.DATE_FIELD,
  379. // YDSearch.Operator.BETWEEN
  380. // ),
  381. new YDSearch(
  382. "textField_ms2nby3g",
  383. "666",
  384. "TextField",
  385. YDSearch.Type.TEXT_FIELD,
  386. YDSearch.Operator.EQ
  387. ),
  388. new YDSearch(
  389. "radioField_mru0o7u6",
  390. "是",
  391. "RadioField",
  392. YDSearch.Type.RADIO_FIELD,
  393. YDSearch.Operator.EQ
  394. )
  395. )))
  396. .build()
  397. );
  398. if (list == null || list.isEmpty()) {
  399. log.info("没有找到需要处理的单据");
  400. return McR.success("无待处理数据");
  401. }
  402. log.info("共查询到 {} 条待处理单据", list.size());
  403. for (Map item : list) {
  404. // String glbdjson = String.valueOf(item.get("associationFormField_me2kiw8j_id"));
  405. String sqr = String.valueOf(item.get("employeeField_mjm9k35m_id"));
  406. String sqrid = sqr.substring(2, sqr.length() - 2);
  407. String formInstanceId = String.valueOf(item.get("textField_ms2nby3g"));
  408. String sfghcdate = String.valueOf(UtilMap.getLong(item, "dateField_mjm9k35l"));
  409. long days = DateUtil.between(new Date(), DateUtil.parse(sfghcdate), DateUnit.DAY);
  410. String type = String.valueOf(item.get("selectField_l3nrjuq0"));
  411. if ("未成交".equals(type)) {
  412. sendDdMsg(ddClient.getAccessToken(), ddConf.getAgentId(), sqrid, "客户近三个月内未成交,还剩 " + days + " 天即将释放到公海");
  413. } else if ("半年金额不足".equals(type)) {
  414. sendDdMsg(ddClient.getAccessToken(), ddConf.getAgentId(), sqrid, "客户近半年内成交未达到7.5w,还剩 " + days + " 天即将释放到公海");
  415. } else if ("一年金额不足".equals(type)) {
  416. sendDdMsg(ddClient.getAccessToken(), ddConf.getAgentId(), sqrid, "客户近一年内成交未达到15w,还剩 " + days + " 天即将释放到公海");
  417. }
  418. if (days <= 0){
  419. Map formData = new HashMap<>();
  420. formData.put("employeeField_lqanqe6n", Arrays.asList());
  421. formData.put("employeeField_lqanqe6o", Arrays.asList());
  422. formData.put("selectField_megi74y7", "公司分配");
  423. formData.put("employeeField_megi74yl", Arrays.asList());
  424. ydClient.operateData(YDParam.builder()
  425. .formInstId("9f9b8d6e-9d88-4233-81a6-34bd559376b3")
  426. // .useLatestVersion(true)
  427. .updateFormDataJson(JSON.toJSONString(formData))
  428. .build(), YDConf.FORM_OPERATION.update);
  429. // }
  430. }
  431. // String zssj = String.valueOf(item.get("employeeField_mmsna3tm_id"));
  432. //// String zt = String.valueOf(item.get("selectField_mewmhnwj"));
  433. //// String fhtzd = String.valueOf(item.get("serialNumberField_mheazm7w"));
  434. //
  435. // // 解析关联字段 JSON
  436. // List<Map> sealjsonlist = parseJsonList(glbdjson);
  437. // HashMap<String, Object> updateMap = new HashMap<>();
  438. // for (Object obj : item.entrySet()) {
  439. // Map.Entry<String, Object> formEntry = (Map.Entry<String, Object>) obj;
  440. // String key = formEntry.getKey();
  441. // Object value = formEntry.getValue();
  442. //
  443. // // 跳过需要特殊处理的主表关联字段
  444. // if (key.equals("associationFormField_me2kiw8j_id") ||
  445. // key.equals("employeeField_mdya1lol_id") ||
  446. // key.equals("employeeField_mmsna3tn_id") ||
  447. // key.equals("employeeField_mmsna3tm_id")) {
  448. // continue;
  449. // }
  450. //
  451. // // 复制其他字段
  452. // updateMap.put(key, value);
  453. // }
  454. //
  455. // // 2. 添加需要特殊处理的主表字段
  456. // updateMap.put("associationFormField_me2kiw8j", sealjsonlist);
  457. // updateMap.put("employeeField_mdya1lol", sqr);
  458. // updateMap.put("employeeField_mmsna3tn", xszg);
  459. // updateMap.put("employeeField_mmsna3tm", zssj);
  460. // // 3. 添加处理后的子表数据
  461. // String sqrid = sqr.substring(2, sqr.length() - 2);
  462. // String xszgid = xszg.substring(2, xszg.length() - 2);
  463. // String finalId = (sqrid == null || sqrid.trim().isEmpty()) ? xszgid : sqrid;
  464. // ydClient.operateData(
  465. // YDParam.builder()
  466. // .formUuid("FORM-54F26858BF574AF0838AEF4086C35FD5VDXJ")
  467. // .processCode("TPROC--1VF66Z61YYX6RD04NCTOPAF5EFMD2DKJV8UQM2")
  468. // .formDataJson(JSON.toJSONString(updateMap))
  469. // .userId(finalId)
  470. // .build(),
  471. // YDConf.FORM_OPERATION.start
  472. // );
  473. // Map formData = new HashMap<>();
  474. // formData.put("radioField_mru0o7u6", "是");
  475. // ydClient.operateData(YDParam.builder()
  476. // .formInstId(formInstanceId)
  477. // .useLatestVersion(true)
  478. // .updateFormDataJson(JSON.toJSONString(formData))
  479. // .build(), YDConf.FORM_OPERATION.update);
  480. // }
  481. // }
  482. // System.out.println("list=="+list);
  483. // for (Map item : list) {
  484. // String formInstanceId = String.valueOf(item.get("formInstanceId"));
  485. // Map formData =new HashMap<>();
  486. // formData.put("textField_mfxbtce5", "无");
  487. // formData.put("dateField_ml4ikfa1", "4073040000000");
  488. // ydClient.operateData(YDParam.builder()
  489. // .formInstId(formInstanceId)
  490. // .updateFormDataJson(JSON.toJSONString(formData))
  491. // .build(), YDConf.FORM_OPERATION.update);
  492. // }
  493. // Map userInfoByMobile1 = ddClient_contacts.getUserInfoById(ddClient.getAccessToken(), "yzsyzid2");
  494. // if (userInfoByMobile1 != null && userInfoByMobile1.containsKey("mobile")) {
  495. // mobile = String.valueOf(userInfoByMobile1.get("mobile"));
  496. // }
  497. // String ins = String.valueOf(data.get("formInstId"));
  498. //
  499. //
  500. // DDR_New ddrNew = ydClient.queryData(YDParam.builder()
  501. // .formUuid("FORM-E64114E9F2C9426E91F92886EDFFA2C08Q90")
  502. // .build(), YDConf.FORM_QUERY.retrieve_search_form_id);
  503. //
  504. // System.out.println(ddrNew.getTotalCount());
  505. //
  506. // ydClient.operateData(YDParam.builder()
  507. // .formUuid("FORM-E64114E9F2C9426E91F92886EDFFA2C08Q90")
  508. // .asynchronousExecution(true)
  509. // .formInstanceIdList((List<String>) ddrNew.getData())
  510. // .build(), YDConf.FORM_OPERATION.delete_batch);
  511. // DDR_New ddrNew = ydClient.queryData(YDParam.builder()
  512. // .formInstId("FINST-DZ966471VB228QLYJ6WXG6I7YGV631VYLW0KMBQE")
  513. // .build(), YDConf.FORM_QUERY.retrieve_id);
  514. ////
  515. //// if (ddrNew == null || ddrNew.getFormData() == null) {
  516. //// throw new RuntimeException("未找到订单信息");
  517. //// }
  518. ////
  519. // Map formData1 = ddrNew.getFormData();
  520. // System.out.println("======"+formData1);
  521. // String ddje = UtilMap.getString(formData1, "numberField_mjm9k35k");
  522. // String dddate = UtilMap.getString(formData1, "dateField_mjm9k35j");
  523. //
  524. // System.out.println(dddate);
  525. // System.out.println(ddje);
  526. // ydClient.operateData(YDParam.builder()
  527. // .formInstanceId(ins)
  528. // .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("numberField_mhirg0kz","156")))//xz04
  529. //// .updateFormDataJson(JSONObject.toJSONString(UtilMap.map(employ,id)))//xz04
  530. // .useLatestVersion(true)
  531. // .build(), YDConf.FORM_OPERATION.update);
  532. // ydHuaGaoService.synckdYdMaterial();
  533. // ydHuaGaoService.synckdYdPayment();
  534. // ydHuaGaoService.synckdYdTRANSFER();
  535. // ydHuaGaoService.syncKdYdReceivable();
  536. // kdYdZpService.insertkdYdZp(data);
  537. // ydHuaGaoService.synckdYdOutbound();
  538. }
  539. return McR.success();
  540. }
  541. public void sendDdMsg(String access_token, Number agent_id, String userid_list, String content) {
  542. if (Objects.nonNull(userid_list)) {
  543. Map param2 = new HashMap();
  544. param2.put("access_token", access_token);
  545. Map body3 = new HashMap();
  546. body3.put("agent_id", agent_id);
  547. body3.put("userid_list", userid_list);
  548. Map msg = new HashMap();
  549. msg.put("msgtype", "text");
  550. //获取当前时间 精确到秒
  551. String time = DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss");
  552. msg.put("text", UtilMap.map("content, aa", content, ""));
  553. body3.put("msg", msg);
  554. UtilHttp.doPost("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2", null, param2, body3);
  555. }
  556. }
  557. public void searchDdMsg(String access_token, Number agent_id, Number task_id) {
  558. if (Objects.nonNull(task_id)) {
  559. Map param2 = new HashMap();
  560. param2.put("access_token", access_token);
  561. Map body3 = new HashMap();
  562. body3.put("agent_id", agent_id);
  563. body3.put("task_id", task_id);
  564. // Map msg = new HashMap();
  565. // msg.put("msgtype", "text");
  566. //获取当前时间 精确到秒
  567. // String time = DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss");
  568. // msg.put("text", UtilMap.map("content, aa", content, ""));
  569. // body3.put("msg", msg);
  570. UtilHttp.doPost("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2", null, param2, body3);
  571. }
  572. }
  573. private List<Map> parseJsonList(String jsonStr) {
  574. if (jsonStr == null || "null".equals(jsonStr) || jsonStr.isEmpty()) {
  575. return Collections.emptyList();
  576. }
  577. try {
  578. // 宜搭有时返回的是 "\"[{...}]\"",需先 unescape
  579. String clean = StringEscapeUtils.unescapeJava(jsonStr);
  580. // 如果首尾是双引号,去掉
  581. if (clean.startsWith("\"") && clean.endsWith("\"")) {
  582. clean = clean.substring(1, clean.length() - 1);
  583. }
  584. return (List<Map>) JSONArray.parse(clean);
  585. } catch (Exception e) {
  586. return Collections.emptyList();
  587. }
  588. }
  589. @PostMapping("/kdYdCustomer")
  590. Map<String, Object> insertCustomer(@RequestBody Map map) {
  591. Map<String, Object> stringObjectMap = kdYdCustomerService.insertCustomer(map);
  592. return stringObjectMap;
  593. }
  594. }