KdYdReceivableServiceImpl.java 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831
  1. package com.malk.huagao.service.impl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.malk.huagao.entity.KdYdOutbound;
  5. import com.malk.huagao.entity.KdYdOutboundDetail;
  6. import com.malk.huagao.entity.KdYdReceivable;
  7. import com.malk.huagao.entity.KdYdReceivableDetail;
  8. import com.malk.huagao.mapper.KdYdOutboundDetailMapper;
  9. import com.malk.huagao.mapper.KdYdOutboundMapper;
  10. import com.malk.huagao.mapper.KdYdReceivableDetailMapper;
  11. import com.malk.huagao.mapper.KdYdReceivableMapper;
  12. import com.malk.huagao.service.IKdYdReceivableService;
  13. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  14. import com.malk.server.aliwork.YDConf;
  15. import com.malk.server.aliwork.YDParam;
  16. import com.malk.server.dingtalk.DDR_New;
  17. import com.malk.service.aliwork.YDClient;
  18. import com.malk.utils.UtilMap;
  19. import lombok.extern.slf4j.Slf4j;
  20. import org.slf4j.MDC;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.stereotype.Service;
  23. import java.math.BigDecimal;
  24. import java.math.RoundingMode;
  25. import java.time.Instant;
  26. import java.time.LocalDateTime;
  27. import java.time.ZoneId;
  28. import java.time.format.DateTimeFormatter;
  29. import java.util.*;
  30. /**
  31. * <p>
  32. * 服务实现类
  33. * </p>
  34. *
  35. * @author LQY
  36. * @since 2025-10-16
  37. */
  38. @Service
  39. @Slf4j
  40. public class KdYdReceivableServiceImpl extends ServiceImpl<KdYdReceivableMapper, KdYdReceivable> implements IKdYdReceivableService {
  41. @Autowired
  42. private YDClient ydClient;
  43. @Autowired
  44. private KdYdReceivableMapper kdYdReceivableMapper;
  45. @Autowired
  46. private KdYdReceivableDetailMapper kdYdReceivableDetailMapper;
  47. @Override
  48. public void insertkdYdReceivable(Map map) {
  49. MDC.put("MDC_KEY_PID", "1003");
  50. String formInstId = UtilMap.getString(map, "formInstId");
  51. DDR_New ddrNew = ydClient.queryData(YDParam.builder()
  52. .formInstId(formInstId)
  53. .build(), YDConf.FORM_QUERY.retrieve_id);
  54. Map formData = ddrNew.getFormData();
  55. String djlx = UtilMap.getString(formData, "selectField_mg3a0th4");
  56. long outboundId = UtilMap.getLong(formData, "textField_mgrsdayq");
  57. // long deliceryId = 6L;
  58. String kh = UtilMap.getString(formData, "textField_mejmml3k");
  59. String bb = UtilMap.getString(formData, "selectField_mg3fuqvn");
  60. String sktj = UtilMap.getString(formData, "selectField_mev13l3r");
  61. String xsy = UtilMap.getString(formData, "employeeField_mejmtic9").replace("[\"", "").replace("\"]", "").trim();
  62. String xsbm = UtilMap.getString(formData, "textField_krnn5bmr");
  63. String xslx = UtilMap.getString(formData, "selectField_mejowmnc");
  64. String khsx = UtilMap.getString(formData, "selectField_megi74y8");
  65. String bz = UtilMap.getString(formData, "textareaField_mg3a0tgx");
  66. String zdzkjestr = UtilMap.getString(formData, "numberField_mejmtica");
  67. BigDecimal zdzkje = toBigDecimal(zdzkjestr);
  68. List<Map> tableField = (List<Map>) formData.get("tableField_mf6el3zx");
  69. KdYdReceivable kdYdReceivable = new KdYdReceivable();
  70. kdYdReceivable.setDjlx(djlx);
  71. // kdYdReceivable.setOutboundId(outboundId);
  72. kdYdReceivable.setBb(bb);
  73. kdYdReceivable.setKh(kh);
  74. kdYdReceivable.setSktj(sktj);
  75. kdYdReceivable.setXsbm(xsbm);
  76. kdYdReceivable.setXslx(xslx);
  77. kdYdReceivable.setKhsx(khsx);
  78. kdYdReceivable.setXsy(xsy);
  79. // kdYdReceivable.setZdzkje(zdzkje);
  80. kdYdReceivable.setBz(bz);
  81. kdYdReceivable.setForminstid(formInstId);
  82. kdYdReceivableMapper.insert(kdYdReceivable);
  83. Long id = kdYdReceivable.getId();
  84. for (Map item : tableField) {
  85. String wlbm = safeGetString(item, "textField_mf6el3zy");
  86. String wlmc = safeGetString(item, "textField_mf6el3zz");
  87. String ggxh = safeGetString(item, "textField_mejmtic5");
  88. String jjdw = safeGetString(item, "textField_mf6el400");
  89. String ssxl = safeGetString(item, "selectField_mejnamfm");
  90. BigDecimal dj = toBigDecimal(safeGetString(item, "numberField_mf6el402"));
  91. BigDecimal hsdj = toBigDecimal(safeGetString(item, "numberField_mejmticb"));
  92. BigDecimal sl = toBigDecimal(safeGetString(item, "numberField_mf6el403"));
  93. BigDecimal se = toBigDecimal(safeGetString(item, "numberField_mf6el406"));
  94. // BigDecimal je = toBigDecimal(safeGetString(item, "numberField_mg34txh8"));
  95. BigDecimal jshj = toBigDecimal(safeGetString(item, "numberField_mejmtic7"));
  96. String kcdw = safeGetString(item, "textField_mf6el409");
  97. String ph = safeGetString(item, "textField_mf6el408");
  98. BigDecimal jjsl = toBigDecimal(safeGetString(item, "numberField_mejmtic6"));
  99. BigDecimal zkl = toBigDecimal(safeGetString(item, "numberField_mf6el404"));
  100. BigDecimal bhsje = toBigDecimal(safeGetString(item, "numberField_mejmticc"));
  101. BigDecimal zke = toBigDecimal(safeGetString(item, "numberField_mf6el405"));
  102. BigDecimal kcsl = toBigDecimal(safeGetString(item, "numberField_mf6el40a"));
  103. String sfzp = safeGetString(item, "radioField_mejnamfn");
  104. String gg = safeGetString(item, "textField_mf6el40b");
  105. BigDecimal tc = toBigDecimal(safeGetString(item, "numberField_mf6el40c"));
  106. BigDecimal jjjbsl = toBigDecimal(safeGetString(item, "numberField_mf6el407"));
  107. String jx = safeGetString(item, "textField_mf6el40d");
  108. KdYdReceivableDetail kdYdReceivableDetail = new KdYdReceivableDetail();
  109. kdYdReceivableDetail.setReceivableId(id);
  110. kdYdReceivableDetail.setWlbm(wlbm);
  111. kdYdReceivableDetail.setWlmc(wlmc);
  112. kdYdReceivableDetail.setGgxh(ggxh);
  113. kdYdReceivableDetail.setJjdw(jjdw);
  114. kdYdReceivableDetail.setSsxl(ssxl);
  115. kdYdReceivableDetail.setDj(dj);
  116. kdYdReceivableDetail.setHsdj(hsdj);
  117. kdYdReceivableDetail.setSl(sl);
  118. kdYdReceivableDetail.setSe(se);
  119. kdYdReceivableDetail.setJe(jshj);
  120. kdYdReceivableDetail.setJjsl(jjsl);
  121. kdYdReceivableDetail.setZkl(zkl);
  122. kdYdReceivableDetail.setBhsje(bhsje);
  123. kdYdReceivableDetail.setZke(zke);
  124. kdYdReceivableDetail.setKcsl(kcsl);
  125. kdYdReceivableDetail.setSfzp(sfzp);
  126. kdYdReceivableDetail.setGg(gg);
  127. kdYdReceivableDetail.setTc(tc);
  128. kdYdReceivableDetail.setJjjbsl(jjjbsl);
  129. kdYdReceivableDetail.setJx(jx);
  130. kdYdReceivableDetail.setKcdw(kcdw);
  131. kdYdReceivableDetail.setPh(ph);
  132. kdYdReceivableDetailMapper.insert(kdYdReceivableDetail);
  133. }
  134. ydClient.operateData(
  135. YDParam.builder()
  136. .formInstanceId(formInstId)
  137. .updateFormDataJson(JSONObject.toJSONString(UtilMap.map("textField_mgt4w4ip", id)))
  138. .useLatestVersion(true).build(), YDConf.FORM_OPERATION.update);
  139. }
  140. @Override
  141. public Map<String, Object> insertkdYdReceivable1(Map json) {
  142. HashMap<String, Object> result = new HashMap<>();
  143. try {
  144. MDC.put("MDC_KEY_PID", "1003");
  145. List<Map<String, Object>> kdYdReceivableDels = UtilMap.getList(json, "data");
  146. String action = UtilMap.getString(json, "action");
  147. String table = UtilMap.getString(json, "table");
  148. // 批量删除处理
  149. if (!kdYdReceivableDels.isEmpty() && "del".equals(action) && "KD_YD_RECEIVABLE".equals(table)) {
  150. log.info("开始处理应收单删除操作,共{}条数据", kdYdReceivableDels.size());
  151. ArrayList<String> deleteList = new ArrayList<>();
  152. int deleteSuccessCount = 0;
  153. for (Map<String, Object> item : kdYdReceivableDels) {
  154. try {
  155. String djbh = String.valueOf(item.get("djbh"));
  156. List<Map> list1 = (List<Map>) ydClient.queryData(YDParam.builder()
  157. .formUuid("FORM-4E1CE4550339494A9BE5498FB119FF2E9ERU")
  158. .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mg3a0tgs", djbh)))
  159. .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
  160. if (list1 != null && !list1.isEmpty()) {
  161. for (Map map : list1) {
  162. String formInstanceId = UtilMap.getString(map, "formInstanceId");
  163. if (formInstanceId != null) {
  164. deleteList.add(formInstanceId);
  165. }
  166. }
  167. deleteSuccessCount++;
  168. } else {
  169. log.warn("未找到对应的应收单数据: djbh={}", djbh);
  170. }
  171. } catch (Exception e) {
  172. log.error("删除应收单数据查询异常: djbh={}", item.get("djbh"), e);
  173. }
  174. }
  175. // 执行批量删除
  176. if (!deleteList.isEmpty()) {
  177. try {
  178. ydClient.operateData(YDParam.builder()
  179. .formUuid("FORM-4E1CE4550339494A9BE5498FB119FF2E9ERU")
  180. .formInstanceIdList(deleteList)
  181. .build(), YDConf.FORM_OPERATION.delete_batch);
  182. log.info("应收单批量删除完成,共删除{}条数据", deleteList.size());
  183. } catch (Exception e) {
  184. log.error("应收单批量删除操作异常", e);
  185. }
  186. }
  187. // 返回删除结果
  188. result.put("code", "200");
  189. result.put("msg", "删除成功,共删除" + deleteList.size() + "条数据");
  190. result.put("data", new HashMap<String, Object>() {{
  191. put("deletedCount", deleteList.size());
  192. put("deletedIds", deleteList);
  193. }});
  194. return result;
  195. } else if ("del".equals(action)) {
  196. log.info("【应收单删除任务】无需要删除的数据");
  197. result.put("code", "200");
  198. result.put("msg", "无需要删除的数据");
  199. result.put("data", new HashMap<>());
  200. return result;
  201. }
  202. // 同步新增/更新数据
  203. List<Map<String, Object>> kdYdReceivables = UtilMap.getList(json, "data");
  204. if (kdYdReceivables.isEmpty()) {
  205. log.info("【应收单同步任务】无需要同步的数据,结束");
  206. result.put("code", "200");
  207. result.put("msg", "无需要同步的数据");
  208. result.put("data", new HashMap<>());
  209. return result;
  210. }
  211. log.info("【应收单同步任务】开始同步,共{}条数据", kdYdReceivables.size());
  212. List<Map<String, Object>> operationResults = new ArrayList<>();
  213. int successCount = 0;
  214. int failCount = 0;
  215. for (Map<String, Object> receivableItem : kdYdReceivables) {
  216. Map<String, Object> singleResult = new HashMap<>();
  217. try {
  218. String djbh = String.valueOf(receivableItem.get("djbh"));
  219. List<Map<String, Object>> tableListData = UtilMap.getList(receivableItem, "tableList");
  220. List<Map<String, Object>> paymentListData = UtilMap.getList(receivableItem, "paymentList");
  221. Long receivableId = UtilMap.getLong(receivableItem, "receivableId");
  222. // 检查应收单明细数据是否存在
  223. if (tableListData == null || tableListData.isEmpty()) {
  224. log.warn("应收单明细数据为空: djbh={}", djbh);
  225. singleResult.put("errorMsg", "明细数据为空");
  226. singleResult.put("status", "fail");
  227. failCount++;
  228. operationResults.add(singleResult);
  229. continue;
  230. }
  231. // 处理应收单明细
  232. int count = 1;
  233. ArrayList<Object> tableList = new ArrayList<>();
  234. for (Map<String, Object> detailItem : tableListData) {
  235. HashMap<Object, Object> tablemap = new HashMap<>();
  236. // 使用辅助方法安全获取和格式化数据
  237. tablemap.put("textField_mgt4w4ip", count);
  238. tablemap.put("textField_mf6el3zy", String.valueOf(detailItem.get("wlbm")));
  239. tablemap.put("textField_mf6el3zz", String.valueOf(detailItem.get("wlmc")));
  240. tablemap.put("textField_mejmtic5", String.valueOf(detailItem.get("ggxh")));
  241. tablemap.put("textField_mf6el400", String.valueOf(detailItem.get("jjdw")));
  242. tablemap.put("textField_mhllijwo", String.valueOf(detailItem.get("ssxl")));
  243. tablemap.put("numberField_mf6el402", safeFormatBigDecimal(detailItem.get("dj")));
  244. tablemap.put("numberField_mejmticb", safeFormatBigDecimal(detailItem.get("hsdj")));
  245. tablemap.put("numberField_mf6el403", safeFormatBigDecimal(detailItem.get("sl")));
  246. tablemap.put("numberField_mejmtic7", safeFormatBigDecimal(detailItem.get("jshj")));
  247. tablemap.put("textField_mf6el409", String.valueOf(detailItem.get("kcdw")));
  248. tablemap.put("textField_mf6el408", String.valueOf(detailItem.get("ph")));
  249. tablemap.put("numberField_mf6el406", safeFormatBigDecimal(detailItem.get("se")));
  250. tablemap.put("numberField_mejmtic6", safeFormatBigDecimal(detailItem.get("jjsl")));
  251. tablemap.put("numberField_mf6el404", safeFormatBigDecimal(detailItem.get("zkl")));
  252. tablemap.put("numberField_mejmticc", safeFormatBigDecimal(detailItem.get("bhsje")));
  253. tablemap.put("numberField_mf6el407", safeFormatBigDecimal(detailItem.get("jjjbsl")));
  254. tablemap.put("numberField_mf6el40a", safeFormatBigDecimal(detailItem.get("kcsl")));
  255. tablemap.put("radioField_mejnamfn", String.valueOf(detailItem.get("sfzp")));
  256. tablemap.put("numberField_mf6el40c", safeFormatBigDecimal(detailItem.get("tc")));
  257. tablemap.put("textField_mf6el40d", String.valueOf(detailItem.get("jx")));
  258. tablemap.put("textField_mf6el40b", String.valueOf(detailItem.get("gg")));
  259. tablemap.put("numberField_mf6el405", safeFormatBigDecimal(detailItem.get("zke")));
  260. count++;
  261. tableList.add(tablemap);
  262. }
  263. // 处理收款计划
  264. ArrayList<Object> tableListPay = new ArrayList<>();
  265. if (paymentListData != null && !paymentListData.isEmpty()) {
  266. for (Map<String, Object> paymentItem : paymentListData) {
  267. HashMap<Object, Object> tablemap1 = new HashMap<>();
  268. // 处理日期字段
  269. Object endTimeObj = paymentItem.get("endTime");
  270. if (endTimeObj instanceof LocalDateTime) {
  271. long timestamp = ((LocalDateTime) endTimeObj).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
  272. tablemap1.put("dateField_mhiui6v9", timestamp);
  273. } else if (endTimeObj instanceof String) {
  274. // 尝试解析字符串日期
  275. try {
  276. LocalDateTime dateTime = LocalDateTime.parse((String) endTimeObj,
  277. DateTimeFormatter.ISO_LOCAL_DATE_TIME);
  278. long timestamp = dateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
  279. tablemap1.put("dateField_mhiui6v9", timestamp);
  280. } catch (Exception e) {
  281. log.warn("无法解析日期字符串: {}", endTimeObj);
  282. }
  283. }
  284. tablemap1.put("textField_mhiui6va", String.valueOf(paymentItem.get("xsddh")));
  285. tablemap1.put("numberField_mhiui6v8", safeFormatBigDecimal(paymentItem.get("ysje")));
  286. tablemap1.put("numberField_mhiui6v6", safeFormatBigDecimal(paymentItem.get("ysbl")));
  287. tablemap1.put("numberField_mhiui6vb", safeFormatBigDecimal(paymentItem.get("ysjebwb")));
  288. tablemap1.put("numberField_mhjy9hzj", safeFormatBigDecimal(paymentItem.get("stkdglje")));
  289. tableListPay.add(tablemap1);
  290. }
  291. }
  292. // 查询关联的出库单数据
  293. String ckddjbh = String.valueOf(receivableItem.get("ckddjbh"));
  294. String ckdformInstanceId = null;
  295. String ckdbh = null;
  296. if (ckddjbh != null && !"null".equals(ckddjbh) && !ckddjbh.trim().isEmpty()) {
  297. try {
  298. List<Map> ddlist = (List<Map>) ydClient.queryData(
  299. YDParam.builder()
  300. .formUuid("FORM-AADBCDA8126F41A0ADDEE3353828583192M8")
  301. .searchCondition(JSON.toJSONString(UtilMap.map("textField_mg34txgm", ckddjbh)))
  302. .build(),
  303. YDConf.FORM_QUERY.retrieve_list_all
  304. ).getData();
  305. if (ddlist != null && !ddlist.isEmpty()) {
  306. for (Map<String, Object> khitem : ddlist) {
  307. Map<String, Object> khformData = (Map<String, Object>) khitem.get("formData");
  308. if (khformData != null) {
  309. Object ckddjbhObj = khformData.get("textField_mg34txgm");
  310. String ckddjbhStr = ckddjbhObj != null ? ckddjbhObj.toString() : null;
  311. if (ckddjbh.equals(ckddjbhStr)) {
  312. ckdformInstanceId = (String) khitem.get("formInstanceId");
  313. ckdbh = ckddjbhStr;
  314. break;
  315. }
  316. }
  317. }
  318. }
  319. } catch (Exception e) {
  320. log.error("查询出库单数据异常: ckddjbh={}", ckddjbh, e);
  321. }
  322. }
  323. // 构建主表数据
  324. HashMap<Object, Object> updateData = new HashMap<>();
  325. updateData.put("tableField_mf6el3zx", tableList);
  326. // 添加关联表单数据
  327. if (ckdbh != null && ckdformInstanceId != null) {
  328. updateData.put("associationFormField_mejmtick",
  329. Arrays.asList(getysdAss(ckdbh, ckdformInstanceId)));
  330. }
  331. updateData.put("tableField_mhiui6v5", tableListPay);
  332. updateData.put("textField_mg3a0tgs", djbh);
  333. updateData.put("textField_mj15q3dk", ckddjbh);
  334. updateData.put("selectField_mg3a0th4", String.valueOf(receivableItem.get("djlx")));
  335. updateData.put("selectField_mev13l3r", String.valueOf(receivableItem.get("sktj")));
  336. // 处理主表日期字段
  337. Object endTimeObj = receivableItem.get("endTime");
  338. if (endTimeObj instanceof LocalDateTime) {
  339. updateData.put("dateField_mejmtic3",
  340. ((LocalDateTime) endTimeObj).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
  341. }
  342. Object businessTimeObj = receivableItem.get("businessTime");
  343. if (businessTimeObj instanceof LocalDateTime) {
  344. updateData.put("dateField_mejmtic2",
  345. ((LocalDateTime) businessTimeObj).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
  346. }
  347. updateData.put("numberField_mejmtic8", safeFormatBigDecimal(receivableItem.get("jshj")));
  348. updateData.put("textField_mejmml3k", String.valueOf(receivableItem.get("kh")));
  349. updateData.put("textField_mhjy9hzh", String.valueOf(receivableItem.get("xsy")));
  350. updateData.put("selectField_mejowmnc", String.valueOf(receivableItem.get("xslx")));
  351. updateData.put("selectField_megi74y8", String.valueOf(receivableItem.get("khsx")));
  352. updateData.put("textField_krnn5bmr", String.valueOf(receivableItem.get("xsbm")));
  353. updateData.put("textField_mhjy9hzi", String.valueOf(receivableItem.get("lzlx")));
  354. updateData.put("textareaField_mg3a0tgx", String.valueOf(receivableItem.get("bz")));
  355. updateData.put("selectField_mg3fuqvn", String.valueOf(receivableItem.get("bb")));
  356. // 执行同步操作
  357. Object operationResult = ydClient.operateData(YDParam.builder()
  358. .formUuid("FORM-4E1CE4550339494A9BE5498FB119FF2E9ERU")
  359. .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mg3a0tgs", djbh)))
  360. .formDataJson(JSONObject.toJSONString(updateData))
  361. .build(), YDConf.FORM_OPERATION.upsert
  362. );
  363. // 记录成功结果
  364. singleResult.put("operationResult", operationResult);
  365. singleResult.put("status", "success");
  366. singleResult.put("ckdformInstanceId", ckdformInstanceId);
  367. singleResult.put("tableCount", tableList.size());
  368. singleResult.put("paymentCount", tableListPay.size());
  369. successCount++;
  370. log.info("应收单同步成功: djbh={}, receivableId={}", djbh, receivableId);
  371. } catch (Exception e) {
  372. String djbh = String.valueOf(receivableItem.get("djbh"));
  373. log.error("同步应收单数据异常: djbh={}", djbh, e);
  374. singleResult.put("djbh", djbh);
  375. singleResult.put("errorMsg", e.getMessage());
  376. singleResult.put("status", "fail");
  377. failCount++;
  378. }
  379. operationResults.add(singleResult);
  380. }
  381. // 构建返回结果
  382. Map<String, Object> data = new HashMap<>();
  383. data.put("operationResults", operationResults);
  384. data.put("totalCount", kdYdReceivables.size());
  385. data.put("successCount", successCount);
  386. data.put("failCount", failCount);
  387. result.put("code", failCount == 0 ? "200" : "300");
  388. result.put("msg", "操作完成,成功" + successCount + "条,失败" + failCount + "条");
  389. result.put("data", data);
  390. log.info("【应收单同步任务】完成,共处理{}条数据,成功{}条,失败{}条",
  391. kdYdReceivables.size(), successCount, failCount);
  392. } catch (Exception e) {
  393. log.error("应收单同步任务执行异常", e);
  394. result.put("code", "500");
  395. result.put("msg", "系统异常:" + e.getMessage());
  396. result.put("data", new HashMap<>());
  397. } finally {
  398. MDC.remove("MDC_KEY_PID");
  399. }
  400. return result;
  401. }
  402. @Override
  403. public Map<String, Object> insertkdYdpayment(Map json) {
  404. HashMap<String, Object> result = new HashMap<>();
  405. try {
  406. MDC.put("MDC_KEY_PID", "1006");
  407. List<Map<String, Object>> kdYdPaymentReceiptDels = UtilMap.getList(json, "data");
  408. String action = UtilMap.getString(json, "action");
  409. String table = UtilMap.getString(json, "table");
  410. // 批量删除处理
  411. if (!kdYdPaymentReceiptDels.isEmpty() && "del".equals(action) && "KD_YD_PAYMENT_RECEIPT".equals(table)) {
  412. log.info("开始处理收款单删除操作,共{}条数据", kdYdPaymentReceiptDels.size());
  413. ArrayList<String> deleteList = new ArrayList<>();
  414. int deleteSuccessCount = 0;
  415. for (Map<String, Object> item : kdYdPaymentReceiptDels) {
  416. try {
  417. String djbh = String.valueOf(item.get("djbh"));
  418. List<Map> list1 = (List<Map>) ydClient.queryData(YDParam.builder()
  419. .formUuid("FORM-0569C06E47074C2981ADEEAFCE083EDAK5AM")
  420. .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mh9woamt", djbh)))
  421. .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
  422. if (list1 != null && !list1.isEmpty()) {
  423. for (Map map : list1) {
  424. String formInstanceId = UtilMap.getString(map, "formInstanceId");
  425. if (formInstanceId != null) {
  426. deleteList.add(formInstanceId);
  427. }
  428. }
  429. deleteSuccessCount++;
  430. } else {
  431. log.warn("未找到对应的收款单数据: djbh={}", djbh);
  432. }
  433. } catch (Exception e) {
  434. log.error("删除收款单数据查询异常: djbh={}", item.get("djbh"), e);
  435. }
  436. }
  437. // 执行批量删除
  438. if (!deleteList.isEmpty()) {
  439. try {
  440. ydClient.operateData(YDParam.builder()
  441. .formUuid("FORM-0569C06E47074C2981ADEEAFCE083EDAK5AM")
  442. .formInstanceIdList(deleteList)
  443. .build(), YDConf.FORM_OPERATION.delete_batch);
  444. log.info("收款单批量删除完成,共删除{}条数据", deleteList.size());
  445. } catch (Exception e) {
  446. log.error("收款单批量删除操作异常", e);
  447. }
  448. }
  449. // 返回删除结果
  450. result.put("code", "200");
  451. result.put("msg", "删除成功,共删除" + deleteList.size() + "条数据");
  452. result.put("data", new HashMap<String, Object>() {{
  453. put("deletedCount", deleteList.size());
  454. put("deletedIds", deleteList);
  455. }});
  456. return result;
  457. } else if ("del".equals(action)) {
  458. log.info("【收款单删除任务】无需要删除的数据");
  459. result.put("code", "200");
  460. result.put("msg", "无需要删除的数据");
  461. result.put("data", new HashMap<>());
  462. return result;
  463. }
  464. // 同步新增/更新数据
  465. List<Map<String, Object>> kdYdPaymentReceipts = UtilMap.getList(json, "data");
  466. if (kdYdPaymentReceipts.isEmpty()) {
  467. log.info("【收款单同步任务】无需要同步的数据,结束");
  468. result.put("code", "200");
  469. result.put("msg", "无需要同步的数据");
  470. result.put("data", new HashMap<>());
  471. return result;
  472. }
  473. log.info("【收款单同步任务】开始同步,共{}条数据", kdYdPaymentReceipts.size());
  474. List<Map<String, Object>> operationResults = new ArrayList<>();
  475. int successCount = 0;
  476. int failCount = 0;
  477. for (Map<String, Object> paymentItem : kdYdPaymentReceipts) {
  478. Map<String, Object> singleResult = new HashMap<>();
  479. try {
  480. String djbh = String.valueOf(paymentItem.get("djbh"));
  481. List<Map<String, Object>> tableListData = UtilMap.getList(paymentItem, "tableList");
  482. Long paymentReceiptId = UtilMap.getLong(paymentItem, "paymentReceiptId");
  483. // 检查明细数据是否存在
  484. if (tableListData == null || tableListData.isEmpty()) {
  485. log.warn("收款单明细数据为空: djbh={}", djbh);
  486. singleResult.put("errorMsg", "明细数据为空");
  487. singleResult.put("status", "fail");
  488. failCount++;
  489. operationResults.add(singleResult);
  490. continue;
  491. }
  492. // 处理收款单明细
  493. ArrayList<Object> tableList = new ArrayList<>();
  494. for (Map<String, Object> detailItem : tableListData) {
  495. HashMap<String, String> tablemap = new HashMap<>();
  496. tablemap.put("textField_mh9woanr", String.valueOf(detailItem.get("jsfs")));
  497. tablemap.put("textField_mh9woans", String.valueOf(detailItem.get("skyt")));
  498. tablemap.put("textField_mh9woant", String.valueOf(detailItem.get("ysxmlx")));
  499. tablemap.put("textField_mh9woanu", String.valueOf(detailItem.get("ysxsdd")));
  500. tablemap.put("numberField_mh9woanv", safeFormatBigDecimalToString(detailItem.get("ysje")));
  501. tablemap.put("numberField_mh9woanw", safeFormatBigDecimalToString(detailItem.get("sxf")));
  502. tablemap.put("textField_mhmr1ecr", String.valueOf(detailItem.get("cdk")));
  503. tablemap.put("textField_mh9woany", String.valueOf(detailItem.get("wfyhzh")));
  504. tablemap.put("textField_mh9woao2", String.valueOf(detailItem.get("xsddh")));
  505. tablemap.put("textField_mh9woao1", String.valueOf(detailItem.get("fyxm")));
  506. tablemap.put("numberField_mh9woanz", safeFormatBigDecimalToString(detailItem.get("ssje")));
  507. tablemap.put("numberField_mh9woao0", safeFormatBigDecimalToString(detailItem.get("zhje")));
  508. tableList.add(tablemap);
  509. }
  510. // 查询关联的订单数据
  511. String xsddbh = String.valueOf(paymentItem.get("xsddbh"));
  512. String ddformInstanceId = null;
  513. String ddbh = null;
  514. if (xsddbh != null && !"null".equals(xsddbh) && !xsddbh.trim().isEmpty()) {
  515. try {
  516. log.debug("开始查询订单数据: xsddbh={}", xsddbh);
  517. List<Map> ddlist = (List<Map>) ydClient.queryData(
  518. YDParam.builder()
  519. .formUuid("FORM-B62CAE3075CE4098B17BB86C90FFA21C9B7C")
  520. .searchCondition(JSON.toJSONString(UtilMap.map("textField_mjs6fuwo", xsddbh)))
  521. .build(),
  522. YDConf.FORM_QUERY.retrieve_list_all
  523. ).getData();
  524. if (ddlist != null && !ddlist.isEmpty()) {
  525. for (Map<String, Object> khitem : ddlist) {
  526. Map<String, Object> khformData = (Map<String, Object>) khitem.get("formData");
  527. if (khformData != null) {
  528. Object xsddbhObj = khformData.get("textField_mjs6fuwo");
  529. String xsddbhStr = xsddbhObj != null ? xsddbhObj.toString() : null;
  530. if (xsddbh.equals(xsddbhStr)) {
  531. ddformInstanceId = (String) khitem.get("formInstanceId");
  532. ddbh = xsddbhStr;
  533. break;
  534. }
  535. }
  536. }
  537. }
  538. } catch (Exception e) {
  539. log.error("查询订单数据异常: xsddbh={}", xsddbh, e);
  540. }
  541. }
  542. // 构建更新数据
  543. HashMap<Object, Object> updateMap = new HashMap<>();
  544. updateMap.put("tableField_mh9woanl", tableList);
  545. // 添加关联表单数据
  546. if (ddbh != null && ddformInstanceId != null) {
  547. updateMap.put("associationFormField_mh9woamy",
  548. Arrays.asList(getddAss(ddbh, ddformInstanceId)));
  549. }
  550. // 添加主表字段
  551. updateMap.put("textField_mh9woanm", String.valueOf(paymentItem.get("djlx")));
  552. updateMap.put("textField_mh9woann", String.valueOf(paymentItem.get("fkdwlx")));
  553. updateMap.put("textField_mh9woamt", djbh);
  554. updateMap.put("textField_mh9woamz", String.valueOf(paymentItem.get("skgld")));
  555. updateMap.put("textField_mh9woano", String.valueOf(paymentItem.get("bb")));
  556. // 处理日期字段
  557. Object ywrqObj = paymentItem.get("ywrq");
  558. if (ywrqObj != null) {
  559. if (ywrqObj instanceof LocalDateTime) {
  560. long timestamp = ((LocalDateTime) ywrqObj).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
  561. updateMap.put("dateField_mh9woan5", timestamp);
  562. } else if (ywrqObj instanceof String) {
  563. // 尝试解析字符串日期
  564. try {
  565. LocalDateTime dateTime = LocalDateTime.parse((String) ywrqObj,
  566. DateTimeFormatter.ISO_LOCAL_DATE_TIME);
  567. long timestamp = dateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
  568. updateMap.put("dateField_mh9woan5", timestamp);
  569. } catch (Exception e) {
  570. log.warn("无法解析日期字符串: {}", ywrqObj);
  571. }
  572. }
  573. }
  574. updateMap.put("textField_mh9woanp", String.valueOf(paymentItem.get("wldwlx")));
  575. updateMap.put("textField_mh9woanq", String.valueOf(paymentItem.get("wldw")));
  576. updateMap.put("numberField_mh9woanc", safeFormatBigDecimalToString(paymentItem.get("ysje")));
  577. updateMap.put("numberField_mh9woand", safeFormatBigDecimalToString(paymentItem.get("ssje")));
  578. updateMap.put("textField_mhjxv2tf", String.valueOf(paymentItem.get("xsy")));
  579. updateMap.put("textField_mhjxv2tg", String.valueOf(paymentItem.get("xsbm")));
  580. updateMap.put("textareaField_mh9woank", String.valueOf(paymentItem.get("bz")));
  581. // 执行同步操作
  582. Object operationResult = ydClient.operateData(YDParam.builder()
  583. .formUuid("FORM-0569C06E47074C2981ADEEAFCE083EDAK5AM")
  584. .appType("APP_VQDMMWS6OR1VHL8VMFD3")
  585. .systemToken("XE766X81JHKXK4Z27SYOI86CPCLQ3J1LV7ODMH2")
  586. .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mh9woamt", djbh)))
  587. .formDataJson(JSONObject.toJSONString(updateMap))
  588. .build(), YDConf.FORM_OPERATION.upsert);
  589. // 记录成功结果
  590. singleResult.put("operationResult", operationResult);
  591. singleResult.put("status", "success");
  592. singleResult.put("ddformInstanceId", ddformInstanceId);
  593. singleResult.put("paymentReceiptId", paymentReceiptId);
  594. successCount++;
  595. log.info("收款单同步成功: djbh={}, paymentReceiptId={}", djbh, paymentReceiptId);
  596. } catch (Exception e) {
  597. String djbh = String.valueOf(paymentItem.get("djbh"));
  598. log.error("同步收款单数据异常: djbh={}", djbh, e);
  599. singleResult.put("djbh", djbh);
  600. singleResult.put("errorMsg", e.getMessage());
  601. singleResult.put("status", "fail");
  602. failCount++;
  603. }
  604. operationResults.add(singleResult);
  605. }
  606. // 构建返回结果
  607. Map<String, Object> data = new HashMap<>();
  608. data.put("operationResults", operationResults);
  609. data.put("totalCount", kdYdPaymentReceipts.size());
  610. data.put("successCount", successCount);
  611. data.put("failCount", failCount);
  612. result.put("code", failCount == 0 ? "200" : "300");
  613. result.put("msg", "操作完成,成功" + successCount + "条,失败" + failCount + "条");
  614. result.put("data", data);
  615. log.info("【收款单同步任务】完成,共处理{}条数据,成功{}条,失败{}条",
  616. kdYdPaymentReceipts.size(), successCount, failCount);
  617. } catch (Exception e) {
  618. log.error("收款单同步任务执行异常", e);
  619. result.put("code", "500");
  620. result.put("msg", "系统异常:" + e.getMessage());
  621. result.put("data", new HashMap<>());
  622. } finally {
  623. MDC.remove("MDC_KEY_PID");
  624. }
  625. return result;
  626. }
  627. // 辅助方法 - 安全格式化 BigDecimal 为字符串(保留2位小数)
  628. private String safeFormatBigDecimalToString(Object value) {
  629. if (value == null) {
  630. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP).toString();
  631. }
  632. try {
  633. if (value instanceof BigDecimal) {
  634. return ((BigDecimal) value).setScale(2, RoundingMode.HALF_UP).toString();
  635. } else if (value instanceof Number) {
  636. return BigDecimal.valueOf(((Number) value).doubleValue())
  637. .setScale(2, RoundingMode.HALF_UP).toString();
  638. } else if (value instanceof String) {
  639. String strVal = ((String) value).trim();
  640. if (strVal.isEmpty() || "null".equalsIgnoreCase(strVal)) {
  641. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP).toString();
  642. }
  643. return new BigDecimal(strVal).setScale(2, RoundingMode.HALF_UP).toString();
  644. }
  645. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP).toString();
  646. } catch (Exception e) {
  647. log.warn("格式化BigDecimal数据异常: value={}", value, e);
  648. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP).toString();
  649. }
  650. }
  651. // 获取订单关联数据
  652. private Object getddAss(String title, String id) {
  653. return UtilMap.map("appType, formUuid, formType, instanceId, title, subTitle", "APP_VQDMMWS6OR1VHL8VMFD3", "FORM-B62CAE3075CE4098B17BB86C90FFA21C9B7C", "receipt", id, title, "");
  654. }
  655. // 辅助方法 - 安全格式化 BigDecimal 数据(保留2位小数)
  656. private BigDecimal safeFormatBigDecimal(Object value) {
  657. if (value == null) {
  658. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
  659. }
  660. try {
  661. if (value instanceof BigDecimal) {
  662. return ((BigDecimal) value).setScale(2, RoundingMode.HALF_UP);
  663. } else if (value instanceof Number) {
  664. return BigDecimal.valueOf(((Number) value).doubleValue()).setScale(2, RoundingMode.HALF_UP);
  665. } else if (value instanceof String) {
  666. String strVal = ((String) value).trim();
  667. if (strVal.isEmpty() || "null".equalsIgnoreCase(strVal)) {
  668. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
  669. }
  670. return new BigDecimal(strVal).setScale(2, RoundingMode.HALF_UP);
  671. }
  672. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
  673. } catch (Exception e) {
  674. log.warn("格式化BigDecimal数据异常: value={}", value, e);
  675. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
  676. }
  677. }
  678. // 获取应收单关联数据
  679. private Object getysdAss(String title, String id) {
  680. return UtilMap.map("appType, formUuid, formType, instanceId, title, subTitle", "APP_VQDMMWS6OR1VHL8VMFD3", "FORM-AADBCDA8126F41A0ADDEE3353828583192M8", "receipt", id, title, "");
  681. }
  682. private static LocalDateTime parseTimestamp(String timestampStr) {
  683. if (timestampStr == null || timestampStr.trim().isEmpty()) return null;
  684. try {
  685. long timestamp = Long.parseLong(timestampStr.trim());
  686. return LocalDateTime.ofInstant(
  687. Instant.ofEpochMilli(timestamp),
  688. ZoneId.systemDefault()
  689. );
  690. } catch (NumberFormatException e) {
  691. return null;
  692. }
  693. }
  694. private static int parseInt(String str, int defaultValue) {
  695. if (str == null || str.trim().isEmpty()) {
  696. return defaultValue;
  697. }
  698. try {
  699. return Integer.parseInt(str.trim());
  700. } catch (NumberFormatException e) {
  701. return defaultValue;
  702. }
  703. }
  704. private String safeGetString(Map formData, String key) {
  705. Object val = formData.get(key);
  706. return val == null ? "" : String.valueOf(val);
  707. }
  708. public static BigDecimal toBigDecimal(String str) {
  709. if (str == null || str.trim().isEmpty()) {
  710. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
  711. }
  712. try {
  713. return new BigDecimal(str.trim())
  714. .setScale(2, RoundingMode.HALF_UP);
  715. } catch (NumberFormatException e) {
  716. // 返回默认值而不是抛出异常,避免程序中断
  717. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
  718. }
  719. }
  720. /**
  721. * 重载方法,支持Number类型输入
  722. */
  723. public static BigDecimal toBigDecimal(Number number) {
  724. if (number == null) {
  725. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
  726. }
  727. return new BigDecimal(number.toString())
  728. .setScale(2, RoundingMode.HALF_UP);
  729. }
  730. }