KdYdOutboundServiceImpl.java 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460
  1. package com.malk.huagao.service.impl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.malk.huagao.entity.KdYdDelivery;
  6. import com.malk.huagao.entity.KdYdDeliveryDetail;
  7. import com.malk.huagao.entity.KdYdOutbound;
  8. import com.malk.huagao.entity.KdYdOutboundDetail;
  9. import com.malk.huagao.mapper.KdYdDeliveryDetailMapper;
  10. import com.malk.huagao.mapper.KdYdDeliveryMapper;
  11. import com.malk.huagao.mapper.KdYdOutboundDetailMapper;
  12. import com.malk.huagao.mapper.KdYdOutboundMapper;
  13. import com.malk.huagao.service.IKdYdOutboundService;
  14. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  15. import com.malk.server.aliwork.YDConf;
  16. import com.malk.server.aliwork.YDParam;
  17. import com.malk.server.dingtalk.DDR_New;
  18. import com.malk.service.aliwork.YDClient;
  19. import com.malk.utils.UtilMap;
  20. import lombok.extern.slf4j.Slf4j;
  21. import org.slf4j.MDC;
  22. import org.springframework.beans.factory.annotation.Autowired;
  23. import org.springframework.stereotype.Service;
  24. import java.math.BigDecimal;
  25. import java.math.RoundingMode;
  26. import java.time.Instant;
  27. import java.time.LocalDateTime;
  28. import java.time.ZoneId;
  29. import java.util.*;
  30. import java.util.stream.Collectors;
  31. /**
  32. * <p>
  33. * 服务实现类
  34. * </p>
  35. *
  36. * @author LQY
  37. * @since 2025-10-15
  38. */
  39. @Service
  40. @Slf4j
  41. public class KdYdOutboundServiceImpl extends ServiceImpl<KdYdOutboundMapper, KdYdOutbound> implements IKdYdOutboundService {
  42. @Autowired
  43. private YDClient ydClient;
  44. @Autowired
  45. private KdYdOutboundMapper kdYdOutboundMapper;
  46. @Autowired
  47. private KdYdOutboundDetailMapper kdYdOutboundDetailMapper;
  48. @Override
  49. public Map<String, Object> insertkdYdOutbound(Map json) {
  50. HashMap<String, Object> result = new HashMap<>();
  51. try {
  52. MDC.put("MDC_KEY_PID", "1003");
  53. List<Map<String, Object>> kdYdOutbounddels = UtilMap.getList(json, "data");
  54. String action = UtilMap.getString(json, "action");
  55. String table = UtilMap.getString(json, "table");
  56. // 批量删除处理
  57. if (!kdYdOutbounddels.isEmpty() && action.equals("del") && table.equals("KD_YD_OUTBOUND")) {
  58. log.info("开始处理出库单删除操作,共{}条数据", kdYdOutbounddels.size());
  59. ArrayList<String> deleteList = new ArrayList<>();
  60. int deleteSuccessCount = 0;
  61. for (Map item : kdYdOutbounddels) {
  62. try {
  63. String djbh = String.valueOf(item.get("djbh"));
  64. List<Map> list1 = (List<Map>) ydClient.queryData(YDParam.builder()
  65. .formUuid("FORM-AADBCDA8126F41A0ADDEE3353828583192M8")
  66. .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mg34txgm", djbh)))
  67. .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
  68. if (list1 != null && !list1.isEmpty()) {
  69. for (Map map : list1) {
  70. String formInstanceId = UtilMap.getString(map, "formInstanceId");
  71. if (formInstanceId != null) {
  72. deleteList.add(formInstanceId);
  73. }
  74. }
  75. deleteSuccessCount++;
  76. } else {
  77. log.warn("未找到对应的出库单数据: djbh={}", djbh);
  78. }
  79. } catch (Exception e) {
  80. log.error("删除出库单数据查询异常: djbh={}", item.get("djbh"), e);
  81. }
  82. }
  83. // 执行批量删除
  84. if (!deleteList.isEmpty()) {
  85. try {
  86. ydClient.operateData(YDParam.builder()
  87. .formUuid("FORM-AADBCDA8126F41A0ADDEE3353828583192M8")
  88. .formInstanceIdList(deleteList)
  89. .build(), YDConf.FORM_OPERATION.delete_batch);
  90. log.info("出库单批量删除完成,共删除{}条数据", deleteList.size());
  91. } catch (Exception e) {
  92. log.error("出库单批量删除操作异常", e);
  93. }
  94. }
  95. // 返回删除结果
  96. result.put("code", "200");
  97. result.put("msg", "删除成功,共删除" + deleteList.size() + "条数据");
  98. result.put("data", new HashMap<String, Object>() {{
  99. put("deletedCount", deleteList.size());
  100. put("deletedIds", deleteList);
  101. }});
  102. return result;
  103. } else if (action.equals("del")) {
  104. log.info("【出库单删除任务】无需要删除的数据");
  105. result.put("code", "200");
  106. result.put("msg", "无需要删除的数据");
  107. result.put("data", new HashMap<>());
  108. return result;
  109. }
  110. List<Map<String, Object>> kdYdOutbounds = UtilMap.getList(json, "data");
  111. // 同步新增/更新数据
  112. if (kdYdOutbounds.isEmpty()) {
  113. log.info("【出库单同步任务】无需要同步的数据,结束");
  114. result.put("code", "200");
  115. result.put("msg", "无需要同步的数据");
  116. result.put("data", new HashMap<>());
  117. return result;
  118. }
  119. log.info("【出库单同步任务】开始同步,共{}条数据", kdYdOutbounds.size());
  120. List<Map<String, Object>> operationResults = new ArrayList<>();
  121. int successCount = 0;
  122. int failCount = 0;
  123. for (Map tableItem : kdYdOutbounds) {
  124. Map<String, Object> singleResult = new HashMap<>();
  125. try {
  126. String djbh = String.valueOf(tableItem.get("djbh"));
  127. List<Map<String, Object>> tableList1 = UtilMap.getList(tableItem, "tableList");
  128. String deliveryId = UtilMap.getString(tableItem, "deliveryId");
  129. // 检查明细数据是否存在
  130. if (tableList1 == null || tableList1.isEmpty()) {
  131. log.warn("出库单明细数据为空: djbh={}", djbh);
  132. singleResult.put("djbh", djbh);
  133. singleResult.put("errorMsg", "明细数据为空");
  134. singleResult.put("status", "fail");
  135. failCount++;
  136. operationResults.add(singleResult);
  137. continue;
  138. }
  139. ArrayList<Object> tableList = new ArrayList<>();
  140. List<Map<String, Object>> tableListxlh = new ArrayList<>();
  141. // 处理明细数据
  142. for (Map item1 : tableList1) {
  143. HashMap<String, String> tablemap = new HashMap<>();
  144. // tablemap.put("textField_mg34txgm", String.valueOf(tableItem.get("djbh")));
  145. tablemap.put("textField_mejnamff", String.valueOf(item1.get("wlbm")));
  146. tablemap.put("textField_mejnamfg", String.valueOf(item1.get("wlmc")));
  147. tablemap.put("textField_mszue0v2", String.valueOf(item1.get("ddbh")));
  148. tablemap.put("textField_mg34txh1", String.valueOf(item1.get("tpsb")));
  149. tablemap.put("textField_mejnamfh", String.valueOf(item1.get("ggxh")));
  150. tablemap.put("textField_mejnamfk", String.valueOf(item1.get("kcdw")));
  151. // 处理数值字段
  152. tablemap.put("numberField_mejnamfl", safeConvertBigDecimalToString(item1.get("yfsl")));
  153. tablemap.put("numberField_mg34txh2", safeConvertBigDecimalToString(item1.get("sfsl")));
  154. tablemap.put("numberField_mg34txh3", safeConvertBigDecimalToString(item1.get("dj")));
  155. tablemap.put("numberField_mg34txh4", safeConvertBigDecimalToString(item1.get("hsdj")));
  156. tablemap.put("textField_mg34txh5", String.valueOf(item1.get("ph")));
  157. tablemap.put("numberField_mg34txh6", safeConvertBigDecimalToString(item1.get("sl")));
  158. tablemap.put("numberField_mg34txh7", safeConvertBigDecimalToString(item1.get("se")));
  159. tablemap.put("numberField_mg34txh8", safeConvertBigDecimalToString(item1.get("je")));
  160. tablemap.put("numberField_mg34txh9", safeConvertBigDecimalToString(item1.get("jshj")));
  161. tablemap.put("textField_mf6a0h6l", String.valueOf(item1.get("ck")));
  162. tablemap.put("textField_mf6a0h6k", String.valueOf(item1.get("cw")));
  163. tablemap.put("textField_mf6a0h6p", String.valueOf(item1.get("kczt")));
  164. tablemap.put("numberField_mg34txha", safeConvertBigDecimalToString(item1.get("jtc")));
  165. tablemap.put("textField_mejnamf6", String.valueOf(item1.get("sjr")));
  166. tablemap.put("textField_mejnamf7", String.valueOf(item1.get("sjdh")));
  167. tablemap.put("textareaField_mf6a0h5e", String.valueOf(item1.get("sjdz")));
  168. tablemap.put("textField_mejnamfx", String.valueOf(item1.get("ssxl")));
  169. tablemap.put("textField_mf6a0h6u", String.valueOf(item1.get("gg")));
  170. tablemap.put("textField_mhlqeoas", String.valueOf(item1.get("zbq")));
  171. // 处理日期字段
  172. tablemap.put("dateField_mg34txhb", safeConvertDateTimeToString(item1.get("fwdqr")));
  173. tablemap.put("textField_mhlqeoat", String.valueOf(item1.get("zbqsf")));
  174. tablemap.put("textField_mf6a0h6x", String.valueOf(item1.get("kddh")));
  175. tablemap.put("textField_mf6a0h6y", String.valueOf(item1.get("jx")));
  176. tablemap.put("radioField_mf6a0h6h", String.valueOf(item1.get("sfzp")));
  177. tableList.add(tablemap);
  178. // 处理序列号明细
  179. String xlhjh = String.valueOf(item1.get("xlhjh"));
  180. if (xlhjh != null && !xlhjh.trim().isEmpty() && !"null".equals(xlhjh)) {
  181. List<Map<String, Object>> currentXlhList = Arrays.stream(xlhjh.split(","))
  182. .map(String::trim)
  183. .filter(item -> !item.isEmpty())
  184. .map(item -> {
  185. Map<String, Object> xlhMap = new HashMap<>();
  186. xlhMap.put("textField_mf6a0h6w", item);
  187. xlhMap.put("textField_mjqst61l", String.valueOf(item1.get("wlbm")));
  188. xlhMap.put("textField_mjqst61m", String.valueOf(item1.get("ggxh")));
  189. xlhMap.put("textField_mt2qky5r", String.valueOf(item1.get("ddbh")));
  190. xlhMap.put("textField_mtie4w96", String.valueOf(item1.get("ddbh") + item));
  191. return xlhMap;
  192. })
  193. .collect(Collectors.toList());
  194. tableListxlh.addAll(currentXlhList);
  195. }
  196. }
  197. // 查询发货单数据
  198. String fhdformInstanceId = null;
  199. String fhdbh = null;
  200. if (deliveryId != null) {
  201. try {
  202. log.debug("开始查询发货单数据: deliveryId={}", deliveryId);
  203. List<Map> ddlist = (List<Map>) ydClient.queryData(
  204. YDParam.builder()
  205. .formUuid("FORM-FAE2575E112644ED914CAB4FEC9309F32AVR")
  206. .searchCondition(JSON.toJSONString(UtilMap.map("serialNumberField_mheazm7w", deliveryId)))
  207. .build(),
  208. YDConf.FORM_QUERY.retrieve_list_all
  209. ).getData();
  210. if (ddlist != null && !ddlist.isEmpty()) {
  211. for (Map<String, Object> khitem : ddlist) {
  212. Map<String, Object> khformData = (Map<String, Object>) khitem.get("formData");
  213. if (khformData != null && deliveryId.equals(khformData.get("serialNumberField_mheazm7w"))) {
  214. fhdformInstanceId = (String) khitem.get("formInstanceId");
  215. fhdbh = (String) khformData.get("serialNumberField_mheazm7w");
  216. break;
  217. }
  218. }
  219. } else {
  220. log.warn("未查询到发货单数据: deliveryId={}", deliveryId);
  221. }
  222. } catch (Exception e) {
  223. log.error("查询发货单数据异常: deliveryId={}", deliveryId, e);
  224. }
  225. }
  226. // 构建更新数据
  227. HashMap<Object, Object> updateMap = new HashMap<>();
  228. updateMap.put("tableField_mejnamfd", tableList);
  229. updateMap.put("tableField_mips137b", tableListxlh);
  230. // 添加关联表单数据
  231. if (fhdbh != null && !"null".equals(fhdbh) && fhdformInstanceId != null) {
  232. updateMap.put("associationFormField_mejmml36",
  233. Arrays.asList(getfhdAss(fhdbh,fhdformInstanceId)));
  234. }
  235. // 添加主表字段
  236. updateMap.put("dateField_krbgloam", safeConvertDateTimeToString(tableItem.get("dateTime")));
  237. updateMap.put("textField_krnn5bmr", String.valueOf(tableItem.get("xsDept")));
  238. updateMap.put("textField_ml4qflc0", String.valueOf(tableItem.get("kdgs")));
  239. updateMap.put("textField_mhjxw689", String.valueOf(tableItem.get("fhDept")));
  240. updateMap.put("textField_mhjxw686", String.valueOf(tableItem.get("cgy")));
  241. updateMap.put("textField_mf6a0h6f", String.valueOf(tableItem.get("ddbh")));
  242. updateMap.put("selectField_mejowmna", String.valueOf(tableItem.get("djlx")));
  243. updateMap.put("textField_mg34txgm", String.valueOf(tableItem.get("djbh")));
  244. updateMap.put("textField_mhlqeoar", String.valueOf(tableItem.get("jsbb")));
  245. updateMap.put("textField_mejnamf2", String.valueOf(tableItem.get("kh")));
  246. updateMap.put("selectField_mejowmnc", String.valueOf(tableItem.get("xslx")));
  247. updateMap.put("textField_mhjxw688", String.valueOf(tableItem.get("xsy")));
  248. updateMap.put("selectField_mg34txgt", String.valueOf(tableItem.get("xssx")));
  249. updateMap.put("selectField_megi74y8", String.valueOf(tableItem.get("khsx")));
  250. updateMap.put("textField_mg34txgy", String.valueOf(tableItem.get("khtjr")));
  251. updateMap.put("textField_mg34txgz", String.valueOf(tableItem.get("ysdh")));
  252. updateMap.put("textField_migw33w6", String.valueOf(deliveryId));
  253. // 执行同步操作
  254. Object operationResult = ydClient.operateData(YDParam.builder()
  255. .formUuid("FORM-AADBCDA8126F41A0ADDEE3353828583192M8")
  256. .noExecuteExpression( false)
  257. .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mg34txgm", String.valueOf(tableItem.get("djbh")))))
  258. .formDataJson(JSONObject.toJSONString(updateMap))
  259. .build(), YDConf.FORM_OPERATION.upsert);
  260. // 记录成功结果
  261. singleResult.put("djbh", djbh);
  262. singleResult.put("deliveryId", deliveryId);
  263. singleResult.put("operationResult", operationResult);
  264. singleResult.put("status", "success");
  265. successCount++;
  266. log.info("出库单同步成功: djbh={}, deliveryId={}", djbh, deliveryId);
  267. } catch (Exception e) {
  268. String djbh = String.valueOf(tableItem.get("djbh"));
  269. log.error("同步出库单数据异常: djbh={}", djbh, e);
  270. singleResult.put("djbh", djbh);
  271. singleResult.put("errorMsg", e.getMessage());
  272. singleResult.put("status", "fail");
  273. failCount++;
  274. }
  275. operationResults.add(singleResult);
  276. }
  277. // 构建返回结果
  278. Map<String, Object> data = new HashMap<>();
  279. data.put("operationResults", operationResults);
  280. data.put("totalCount", kdYdOutbounds.size());
  281. data.put("successCount", successCount);
  282. data.put("failCount", failCount);
  283. result.put("code", failCount == 0 ? "200" : "300");
  284. result.put("msg", "操作完成,成功" + successCount + "条,失败" + failCount + "条");
  285. result.put("data", data);
  286. log.info("【出库单同步任务】完成,共处理{}条数据,成功{}条,失败{}条",
  287. kdYdOutbounds.size(), successCount, failCount);
  288. } catch (Exception e) {
  289. log.error("出库单同步任务执行异常", e);
  290. result.put("code", "500");
  291. result.put("msg", "系统异常:" + e.getMessage());
  292. result.put("data", new HashMap<>());
  293. }
  294. return result;
  295. }
  296. // 辅助方法:安全转换BigDecimal为字符串(保留2位小数)
  297. private String safeConvertBigDecimalToString(Object value) {
  298. try {
  299. if (value == null) {
  300. return java.math.BigDecimal.ZERO.setScale(2, java.math.RoundingMode.HALF_UP).toString();
  301. }
  302. if (value instanceof BigDecimal) {
  303. return ((BigDecimal) value).setScale(2, java.math.RoundingMode.HALF_UP).toString();
  304. } else if (value instanceof Number) {
  305. return new BigDecimal(value.toString()).setScale(2, java.math.RoundingMode.HALF_UP).toString();
  306. } else if (value instanceof String) {
  307. return new BigDecimal((String) value).setScale(2, java.math.RoundingMode.HALF_UP).toString();
  308. }
  309. return java.math.BigDecimal.ZERO.setScale(2, java.math.RoundingMode.HALF_UP).toString();
  310. } catch (Exception e) {
  311. log.warn("转换BigDecimal异常: value={}", value);
  312. return java.math.BigDecimal.ZERO.setScale(2, java.math.RoundingMode.HALF_UP).toString();
  313. }
  314. }
  315. // 辅助方法:安全转换日期时间为字符串
  316. // private String safeConvertDateTimeToString(Object dateTime) {
  317. // try {
  318. // if (dateTime == null) {
  319. // return "";
  320. // }
  321. //
  322. // if (dateTime instanceof java.time.LocalDateTime) {
  323. // java.time.LocalDateTime dt = (java.time.LocalDateTime) dateTime;
  324. // return String.valueOf(dt.atZone(java.time.ZoneId.systemDefault()).toInstant().toEpochMilli());
  325. // }
  326. //
  327. // return String.valueOf(dateTime);
  328. // } catch (Exception e) {
  329. // log.warn("转换日期时间异常: dateTime={}", dateTime);
  330. // return "";
  331. // }
  332. // }
  333. /**
  334. * 最简化日期转换
  335. */
  336. private String safeConvertDateTimeToString(Object dateTime) {
  337. try {
  338. if (dateTime instanceof LocalDateTime) {
  339. return String.valueOf(((LocalDateTime) dateTime)
  340. .atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
  341. }
  342. if (dateTime instanceof Date) return String.valueOf(((Date) dateTime).getTime());
  343. if (dateTime instanceof Long) return String.valueOf(dateTime);
  344. if (dateTime instanceof Integer) {
  345. long t = ((Integer) dateTime).longValue();
  346. return String.valueOf(t < 10000000000L ? t * 1000L : t);
  347. }
  348. if (dateTime instanceof String) {
  349. String s = ((String) dateTime).trim();
  350. if (s.matches("\\d+")) {
  351. return String.valueOf(s.length() == 10 ? Long.parseLong(s) * 1000L : Long.parseLong(s));
  352. }
  353. }
  354. return "";
  355. } catch (Exception e) { return ""; }
  356. }
  357. private Object getfhdAss(String title, String id) {
  358. return UtilMap.map("appType, formUuid, formType, instanceId, title, subTitle", "APP_VQDMMWS6OR1VHL8VMFD3", "FORM-FAE2575E112644ED914CAB4FEC9309F32AVR", "receipt", id, title, "");
  359. }
  360. private static LocalDateTime parseTimestamp(String timestampStr) {
  361. if (timestampStr == null || timestampStr.trim().isEmpty()) return null;
  362. try {
  363. long timestamp = Long.parseLong(timestampStr.trim());
  364. return LocalDateTime.ofInstant(
  365. Instant.ofEpochMilli(timestamp),
  366. ZoneId.systemDefault()
  367. );
  368. } catch (NumberFormatException e) {
  369. return null;
  370. }
  371. }
  372. private static int parseInt(String str, int defaultValue) {
  373. if (str == null || str.trim().isEmpty()) {
  374. return defaultValue;
  375. }
  376. try {
  377. return Integer.parseInt(str.trim());
  378. } catch (NumberFormatException e) {
  379. return defaultValue;
  380. }
  381. }
  382. private String safeGetString(Map formData, String key) {
  383. Object val = formData.get(key);
  384. return val == null ? "" : String.valueOf(val);
  385. }
  386. public static BigDecimal toBigDecimal(String str) {
  387. if (str == null || str.trim().isEmpty()) {
  388. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
  389. }
  390. try {
  391. return new BigDecimal(str.trim())
  392. .setScale(2, RoundingMode.HALF_UP);
  393. } catch (NumberFormatException e) {
  394. // 返回默认值而不是抛出异常,避免程序中断
  395. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
  396. }
  397. }
  398. /**
  399. * 重载方法,支持Number类型输入
  400. */
  401. public static BigDecimal toBigDecimal(Number number) {
  402. if (number == null) {
  403. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
  404. }
  405. return new BigDecimal(number.toString())
  406. .setScale(2, RoundingMode.HALF_UP);
  407. }
  408. }