KdYdReceivableServiceImpl.java 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814
  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. // String receivableId = UtilMap.getString(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. ArrayList<Object> tableList = new ArrayList<>();
  233. for (Map<String, Object> detailItem : tableListData) {
  234. HashMap<Object, Object> tablemap = new HashMap<>();
  235. // 使用辅助方法安全获取和格式化数据
  236. tablemap.put("textField_mf6el3zy", String.valueOf(detailItem.get("wlbm")));
  237. tablemap.put("textField_mf6el3zz", String.valueOf(detailItem.get("wlmc")));
  238. tablemap.put("textField_mejmtic5", String.valueOf(detailItem.get("ggxh")));
  239. tablemap.put("textField_mf6el400", String.valueOf(detailItem.get("jjdw")));
  240. tablemap.put("textField_mhllijwo", String.valueOf(detailItem.get("ssxl")));
  241. tablemap.put("numberField_mf6el402", safeFormatBigDecimal(detailItem.get("dj")));
  242. tablemap.put("numberField_mejmticb", safeFormatBigDecimal(detailItem.get("hsdj")));
  243. tablemap.put("numberField_mf6el403", safeFormatBigDecimal(detailItem.get("sl")));
  244. tablemap.put("numberField_mejmtic7", safeFormatBigDecimal(detailItem.get("jshj1")));
  245. tablemap.put("textField_mf6el409", String.valueOf(detailItem.get("kcdw")));
  246. tablemap.put("textField_mf6el408", String.valueOf(detailItem.get("ph")));
  247. tablemap.put("numberField_mf6el406", safeFormatBigDecimal(detailItem.get("se")));
  248. tablemap.put("numberField_mejmtic6", safeFormatBigDecimal(detailItem.get("jjsl")));
  249. tablemap.put("numberField_mf6el404", safeFormatBigDecimal(detailItem.get("zkl")));
  250. tablemap.put("numberField_mejmticc", safeFormatBigDecimal(detailItem.get("bhsje")));
  251. tablemap.put("numberField_mf6el407", safeFormatBigDecimal(detailItem.get("jjjbsl")));
  252. tablemap.put("numberField_mf6el40a", safeFormatBigDecimal(detailItem.get("kcsl")));
  253. tablemap.put("radioField_mejnamfn", String.valueOf(detailItem.get("sfzp")));
  254. tablemap.put("numberField_mf6el40c", safeFormatBigDecimal(detailItem.get("tc")));
  255. tablemap.put("textField_mf6el40d", String.valueOf(detailItem.get("jx")));
  256. tablemap.put("textField_mf6el40b", String.valueOf(detailItem.get("gg")));
  257. tablemap.put("numberField_mf6el405", safeFormatBigDecimal(detailItem.get("zke")));
  258. tableList.add(tablemap);
  259. }
  260. // 处理收款计划
  261. ArrayList<Object> tableListPay = new ArrayList<>();
  262. if (paymentListData != null && !paymentListData.isEmpty()) {
  263. for (Map<String, Object> paymentItem : paymentListData) {
  264. HashMap<Object, Object> tablemap1 = new HashMap<>();
  265. // 处理日期字段
  266. Object endTimeObj = paymentItem.get("endTime");
  267. tablemap1.put("dateField_mhiui6v9", safeConvertDateTimeToString(endTimeObj));
  268. tablemap1.put("textField_mhiui6va", String.valueOf(paymentItem.get("xsddh")));
  269. tablemap1.put("numberField_mhiui6v8", safeFormatBigDecimal(paymentItem.get("ysje")));
  270. tablemap1.put("numberField_mhiui6v6", safeFormatBigDecimal(paymentItem.get("ysbl")));
  271. tablemap1.put("numberField_mhiui6vb", safeFormatBigDecimal(paymentItem.get("ysjebwb")));
  272. tablemap1.put("numberField_mhjy9hzj", safeFormatBigDecimal(paymentItem.get("stkdglje")));
  273. tableListPay.add(tablemap1);
  274. }
  275. }
  276. // 查询关联的出库单数据
  277. String ckddjbh = String.valueOf(receivableItem.get("ckddjbh"));
  278. String ckdformInstanceId = null;
  279. String ckdbh = null;
  280. if (ckddjbh != null && !"null".equals(ckddjbh) && !ckddjbh.trim().isEmpty()) {
  281. try {
  282. List<Map> ddlist = (List<Map>) ydClient.queryData(
  283. YDParam.builder()
  284. .formUuid("FORM-AADBCDA8126F41A0ADDEE3353828583192M8")
  285. .searchCondition(JSON.toJSONString(UtilMap.map("textField_mg34txgm", ckddjbh)))
  286. .build(),
  287. YDConf.FORM_QUERY.retrieve_list_all
  288. ).getData();
  289. if (ddlist != null && !ddlist.isEmpty()) {
  290. for (Map<String, Object> khitem : ddlist) {
  291. Map<String, Object> khformData = (Map<String, Object>) khitem.get("formData");
  292. if (khformData != null) {
  293. Object ckddjbhObj = khformData.get("textField_mg34txgm");
  294. String ckddjbhStr = ckddjbhObj != null ? ckddjbhObj.toString() : null;
  295. if (ckddjbh.equals(ckddjbhStr)) {
  296. ckdformInstanceId = (String) khitem.get("formInstanceId");
  297. ckdbh = ckddjbhStr;
  298. break;
  299. }
  300. }
  301. }
  302. }
  303. } catch (Exception e) {
  304. log.error("查询出库单数据异常: ckddjbh={}", ckddjbh, e);
  305. }
  306. }
  307. // 构建主表数据
  308. HashMap<Object, Object> updateData = new HashMap<>();
  309. updateData.put("tableField_mf6el3zx", tableList);
  310. // 添加关联表单数据
  311. if (ckdbh != null && ckdformInstanceId != null) {
  312. updateData.put("associationFormField_mejmtick",
  313. Arrays.asList(getysdAss(ckdbh, ckdformInstanceId)));
  314. }
  315. updateData.put("tableField_mhiui6v5", tableListPay);
  316. updateData.put("textField_mg3a0tgs", djbh);
  317. updateData.put("textField_mj15q3dk", ckddjbh);
  318. updateData.put("selectField_mg3a0th4", String.valueOf(receivableItem.get("djlx")));
  319. updateData.put("selectField_mev13l3r", String.valueOf(receivableItem.get("sktj")));
  320. // 处理主表日期字段
  321. Object endTimeObj1 = receivableItem.get("endTime");
  322. updateData.put("dateField_mejmtic3", safeConvertDateTimeToString(endTimeObj1));
  323. Object businessTimeObj = receivableItem.get("businessTime");
  324. updateData.put("dateField_mejmtic2", safeConvertDateTimeToString(endTimeObj1));
  325. updateData.put("numberField_mejmtic8", safeFormatBigDecimal(receivableItem.get("jshj")));
  326. updateData.put("textField_mejmml3k", String.valueOf(receivableItem.get("kh")));
  327. updateData.put("textField_mhjy9hzh", String.valueOf(receivableItem.get("xsy")));
  328. updateData.put("selectField_mejowmnc", String.valueOf(receivableItem.get("xslx")));
  329. updateData.put("selectField_megi74y8", String.valueOf(receivableItem.get("khsx")));
  330. updateData.put("textField_krnn5bmr", String.valueOf(receivableItem.get("xsbm")));
  331. updateData.put("textField_mhjy9hzi", String.valueOf(receivableItem.get("lzlx")));
  332. updateData.put("textareaField_mg3a0tgx", String.valueOf(receivableItem.get("bz")));
  333. updateData.put("selectField_mg3fuqvn", String.valueOf(receivableItem.get("bb")));
  334. // 执行同步操作
  335. Object operationResult = ydClient.operateData(YDParam.builder()
  336. .formUuid("FORM-4E1CE4550339494A9BE5498FB119FF2E9ERU")
  337. .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mg3a0tgs", djbh)))
  338. .formDataJson(JSONObject.toJSONString(updateData))
  339. .build(), YDConf.FORM_OPERATION.upsert
  340. );
  341. // 记录成功结果
  342. singleResult.put("operationResult", operationResult);
  343. singleResult.put("status", "success");
  344. singleResult.put("ckdformInstanceId", ckdformInstanceId);
  345. singleResult.put("tableCount", tableList.size());
  346. singleResult.put("paymentCount", tableListPay.size());
  347. successCount++;
  348. // log.info("应收单同步成功: djbh={}, receivableId={}", djbh, receivableId);
  349. } catch (Exception e) {
  350. String djbh = String.valueOf(receivableItem.get("djbh"));
  351. log.error("同步应收单数据异常: djbh={}", djbh, e);
  352. singleResult.put("djbh", djbh);
  353. singleResult.put("errorMsg", e.getMessage());
  354. singleResult.put("status", "fail");
  355. failCount++;
  356. }
  357. operationResults.add(singleResult);
  358. }
  359. // 构建返回结果
  360. Map<String, Object> data = new HashMap<>();
  361. data.put("operationResults", operationResults);
  362. data.put("totalCount", kdYdReceivables.size());
  363. data.put("successCount", successCount);
  364. data.put("failCount", failCount);
  365. result.put("code", failCount == 0 ? "200" : "300");
  366. result.put("msg", "操作完成,成功" + successCount + "条,失败" + failCount + "条");
  367. result.put("data", data);
  368. log.info("【应收单同步任务】完成,共处理{}条数据,成功{}条,失败{}条",
  369. kdYdReceivables.size(), successCount, failCount);
  370. } catch (Exception e) {
  371. log.error("应收单同步任务执行异常", e);
  372. result.put("code", "500");
  373. result.put("msg", "系统异常:" + e.getMessage());
  374. result.put("data", new HashMap<>());
  375. } finally {
  376. MDC.remove("MDC_KEY_PID");
  377. }
  378. return result;
  379. }
  380. @Override
  381. public Map<String, Object> insertkdYdpayment(Map json) {
  382. HashMap<String, Object> result = new HashMap<>();
  383. try {
  384. MDC.put("MDC_KEY_PID", "1003");
  385. List<Map<String, Object>> kdYdPaymentReceiptDels = UtilMap.getList(json, "data");
  386. String action = UtilMap.getString(json, "action");
  387. String table = UtilMap.getString(json, "table");
  388. // 批量删除处理
  389. if (!kdYdPaymentReceiptDels.isEmpty() && "del".equals(action) && "KD_YD_PAYMENT_RECEIPT".equals(table)) {
  390. log.info("开始处理收款单删除操作,共{}条数据", kdYdPaymentReceiptDels.size());
  391. ArrayList<String> deleteList = new ArrayList<>();
  392. int deleteSuccessCount = 0;
  393. for (Map<String, Object> item : kdYdPaymentReceiptDels) {
  394. try {
  395. String djbh = String.valueOf(item.get("djbh"));
  396. List<Map> list1 = (List<Map>) ydClient.queryData(YDParam.builder()
  397. .formUuid("FORM-0569C06E47074C2981ADEEAFCE083EDAK5AM")
  398. .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mh9woamt", djbh)))
  399. .build(), YDConf.FORM_QUERY.retrieve_list_all).getData();
  400. if (list1 != null && !list1.isEmpty()) {
  401. for (Map map : list1) {
  402. String formInstanceId = UtilMap.getString(map, "formInstanceId");
  403. if (formInstanceId != null) {
  404. deleteList.add(formInstanceId);
  405. }
  406. }
  407. deleteSuccessCount++;
  408. } else {
  409. log.warn("未找到对应的收款单数据: djbh={}", djbh);
  410. }
  411. } catch (Exception e) {
  412. log.error("删除收款单数据查询异常: djbh={}", item.get("djbh"), e);
  413. }
  414. }
  415. // 执行批量删除
  416. if (!deleteList.isEmpty()) {
  417. try {
  418. ydClient.operateData(YDParam.builder()
  419. .formUuid("FORM-0569C06E47074C2981ADEEAFCE083EDAK5AM")
  420. .formInstanceIdList(deleteList)
  421. .build(), YDConf.FORM_OPERATION.delete_batch);
  422. log.info("收款单批量删除完成,共删除{}条数据", deleteList.size());
  423. } catch (Exception e) {
  424. log.error("收款单批量删除操作异常", e);
  425. }
  426. }
  427. // 返回删除结果
  428. result.put("code", "200");
  429. result.put("msg", "删除成功,共删除" + deleteList.size() + "条数据");
  430. result.put("data", new HashMap<String, Object>() {{
  431. put("deletedCount", deleteList.size());
  432. put("deletedIds", deleteList);
  433. }});
  434. return result;
  435. } else if ("del".equals(action)) {
  436. log.info("【收款单删除任务】无需要删除的数据");
  437. result.put("code", "200");
  438. result.put("msg", "无需要删除的数据");
  439. result.put("data", new HashMap<>());
  440. return result;
  441. }
  442. // 同步新增/更新数据
  443. List<Map<String, Object>> kdYdPaymentReceipts = UtilMap.getList(json, "data");
  444. if (kdYdPaymentReceipts.isEmpty()) {
  445. log.info("【收款单同步任务】无需要同步的数据,结束");
  446. result.put("code", "200");
  447. result.put("msg", "无需要同步的数据");
  448. result.put("data", new HashMap<>());
  449. return result;
  450. }
  451. log.info("【收款单同步任务】开始同步,共{}条数据", kdYdPaymentReceipts.size());
  452. List<Map<String, Object>> operationResults = new ArrayList<>();
  453. int successCount = 0;
  454. int failCount = 0;
  455. for (Map<String, Object> paymentItem : kdYdPaymentReceipts) {
  456. Map<String, Object> singleResult = new HashMap<>();
  457. try {
  458. String djbh = String.valueOf(paymentItem.get("djbh"));
  459. List<Map<String, Object>> tableListData = UtilMap.getList(paymentItem, "tableList");
  460. // String paymentReceiptId = UtilMap.getString(paymentItem, "paymentReceiptId");
  461. // 检查明细数据是否存在
  462. if (tableListData == null || tableListData.isEmpty()) {
  463. log.warn("收款单明细数据为空: djbh={}", djbh);
  464. singleResult.put("errorMsg", "明细数据为空");
  465. singleResult.put("status", "fail");
  466. failCount++;
  467. operationResults.add(singleResult);
  468. continue;
  469. }
  470. // 处理收款单明细
  471. ArrayList<Object> tableList = new ArrayList<>();
  472. for (Map<String, Object> detailItem : tableListData) {
  473. HashMap<String, String> tablemap = new HashMap<>();
  474. tablemap.put("textField_mh9woanr", String.valueOf(detailItem.get("jsfs")));
  475. tablemap.put("textField_mh9woans", String.valueOf(detailItem.get("skyt")));
  476. tablemap.put("textField_mh9woant", String.valueOf(detailItem.get("ysxmlx")));
  477. tablemap.put("textField_mh9woanu", String.valueOf(detailItem.get("ysxsdd")));
  478. tablemap.put("numberField_mh9woanv", safeFormatBigDecimalToString(detailItem.get("ysje")));
  479. tablemap.put("numberField_mh9woanw", safeFormatBigDecimalToString(detailItem.get("sxf")));
  480. tablemap.put("textField_mhmr1ecr", String.valueOf(detailItem.get("cdk")));
  481. tablemap.put("textField_mh9woany", String.valueOf(detailItem.get("wfyhzh")));
  482. tablemap.put("textField_mh9woao2", String.valueOf(detailItem.get("xsddh")));
  483. tablemap.put("textField_mh9woao1", String.valueOf(detailItem.get("fyxm")));
  484. tablemap.put("numberField_mh9woanz", safeFormatBigDecimalToString(detailItem.get("ssje")));
  485. tablemap.put("numberField_mh9woao0", safeFormatBigDecimalToString(detailItem.get("zhje")));
  486. tableList.add(tablemap);
  487. }
  488. // 查询关联的订单数据
  489. String xsddbh = String.valueOf(paymentItem.get("xsddbh"));
  490. String ddformInstanceId = null;
  491. String ddbh = null;
  492. if (xsddbh != null && !"null".equals(xsddbh) && !xsddbh.trim().isEmpty()) {
  493. try {
  494. log.debug("开始查询订单数据: xsddbh={}", xsddbh);
  495. List<Map> ddlist = (List<Map>) ydClient.queryData(
  496. YDParam.builder()
  497. .formUuid("FORM-B62CAE3075CE4098B17BB86C90FFA21C9B7C")
  498. .searchCondition(JSON.toJSONString(UtilMap.map("textField_mjs6fuwo", xsddbh)))
  499. .build(),
  500. YDConf.FORM_QUERY.retrieve_list_all
  501. ).getData();
  502. if (ddlist != null && !ddlist.isEmpty()) {
  503. for (Map<String, Object> khitem : ddlist) {
  504. Map<String, Object> khformData = (Map<String, Object>) khitem.get("formData");
  505. if (khformData != null) {
  506. Object xsddbhObj = khformData.get("textField_mjs6fuwo");
  507. String xsddbhStr = xsddbhObj != null ? xsddbhObj.toString() : null;
  508. if (xsddbh.equals(xsddbhStr)) {
  509. ddformInstanceId = (String) khitem.get("formInstanceId");
  510. ddbh = xsddbhStr;
  511. break;
  512. }
  513. }
  514. }
  515. }
  516. } catch (Exception e) {
  517. log.error("查询订单数据异常: xsddbh={}", xsddbh, e);
  518. }
  519. }
  520. // 构建更新数据
  521. HashMap<Object, Object> updateMap = new HashMap<>();
  522. updateMap.put("tableField_mh9woanl", tableList);
  523. // 添加关联表单数据
  524. if (ddbh != null && ddformInstanceId != null) {
  525. updateMap.put("associationFormField_mh9woamy",
  526. Arrays.asList(getddAss(ddbh, ddformInstanceId)));
  527. }
  528. // 添加主表字段
  529. updateMap.put("textField_mh9woanm", String.valueOf(paymentItem.get("djlx")));
  530. updateMap.put("textField_mh9woann", String.valueOf(paymentItem.get("fkdwlx")));
  531. updateMap.put("textField_mh9woamt", djbh);
  532. updateMap.put("textField_mh9woamz", String.valueOf(paymentItem.get("skgld")));
  533. updateMap.put("textField_mh9woano", String.valueOf(paymentItem.get("bb")));
  534. // 处理日期字段
  535. Object ywrqObj = paymentItem.get("ywrq");
  536. updateMap.put("dateField_mh9woan5", safeConvertDateTimeToString(ywrqObj));
  537. updateMap.put("textField_mh9woanp", String.valueOf(paymentItem.get("wldwlx")));
  538. updateMap.put("textField_mh9woanq", String.valueOf(paymentItem.get("wldw")));
  539. updateMap.put("numberField_mh9woanc", safeFormatBigDecimalToString(paymentItem.get("ysje")));
  540. updateMap.put("numberField_mh9woand", safeFormatBigDecimalToString(paymentItem.get("ssje")));
  541. updateMap.put("textField_mhjxv2tf", String.valueOf(paymentItem.get("xsy")));
  542. updateMap.put("textField_mhjxv2tg", String.valueOf(paymentItem.get("xsbm")));
  543. updateMap.put("textareaField_mh9woank", String.valueOf(paymentItem.get("bz")));
  544. // 执行同步操作
  545. Object operationResult = ydClient.operateData(YDParam.builder()
  546. .formUuid("FORM-0569C06E47074C2981ADEEAFCE083EDAK5AM")
  547. .appType("APP_VQDMMWS6OR1VHL8VMFD3")
  548. .systemToken("XE766X81JHKXK4Z27SYOI86CPCLQ3J1LV7ODMH2")
  549. .searchCondition(JSONObject.toJSONString(UtilMap.map("textField_mh9woamt", djbh)))
  550. .formDataJson(JSONObject.toJSONString(updateMap))
  551. .build(), YDConf.FORM_OPERATION.upsert);
  552. // 记录成功结果
  553. singleResult.put("operationResult", operationResult);
  554. singleResult.put("status", "success");
  555. singleResult.put("ddformInstanceId", ddformInstanceId);
  556. successCount++;
  557. // log.info("收款单同步成功: djbh={}, paymentReceiptId={}", djbh, paymentReceiptId);
  558. } catch (Exception e) {
  559. String djbh = String.valueOf(paymentItem.get("djbh"));
  560. log.error("同步收款单数据异常: djbh={}", djbh, e);
  561. singleResult.put("djbh", djbh);
  562. singleResult.put("errorMsg", e.getMessage());
  563. singleResult.put("status", "fail");
  564. failCount++;
  565. }
  566. operationResults.add(singleResult);
  567. }
  568. // 构建返回结果
  569. Map<String, Object> data = new HashMap<>();
  570. data.put("operationResults", operationResults);
  571. data.put("totalCount", kdYdPaymentReceipts.size());
  572. data.put("successCount", successCount);
  573. data.put("failCount", failCount);
  574. result.put("code", failCount == 0 ? "200" : "300");
  575. result.put("msg", "操作完成,成功" + successCount + "条,失败" + failCount + "条");
  576. result.put("data", data);
  577. log.info("【收款单同步任务】完成,共处理{}条数据,成功{}条,失败{}条",
  578. kdYdPaymentReceipts.size(), successCount, failCount);
  579. } catch (Exception e) {
  580. log.error("收款单同步任务执行异常", e);
  581. result.put("code", "500");
  582. result.put("msg", "系统异常:" + e.getMessage());
  583. result.put("data", new HashMap<>());
  584. } finally {
  585. MDC.remove("MDC_KEY_PID");
  586. }
  587. return result;
  588. }
  589. private String safeConvertDateTimeToString(Object dateTime) {
  590. try {
  591. if (dateTime instanceof LocalDateTime) {
  592. return String.valueOf(((LocalDateTime) dateTime)
  593. .atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
  594. }
  595. if (dateTime instanceof Date) return String.valueOf(((Date) dateTime).getTime());
  596. if (dateTime instanceof Long) return String.valueOf(dateTime);
  597. if (dateTime instanceof Integer) {
  598. long t = ((Integer) dateTime).longValue();
  599. return String.valueOf(t < 10000000000L ? t * 1000L : t);
  600. }
  601. if (dateTime instanceof String) {
  602. String s = ((String) dateTime).trim();
  603. if (s.matches("\\d+")) {
  604. return String.valueOf(s.length() == 10 ? Long.parseLong(s) * 1000L : Long.parseLong(s));
  605. }
  606. }
  607. return "";
  608. } catch (Exception e) { return ""; }
  609. }
  610. // 辅助方法 - 安全格式化 BigDecimal 为字符串(保留2位小数)
  611. private String safeFormatBigDecimalToString(Object value) {
  612. if (value == null) {
  613. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP).toString();
  614. }
  615. try {
  616. if (value instanceof BigDecimal) {
  617. return ((BigDecimal) value).setScale(2, RoundingMode.HALF_UP).toString();
  618. } else if (value instanceof Number) {
  619. return BigDecimal.valueOf(((Number) value).doubleValue())
  620. .setScale(2, RoundingMode.HALF_UP).toString();
  621. } else if (value instanceof String) {
  622. String strVal = ((String) value).trim();
  623. if (strVal.isEmpty() || "null".equalsIgnoreCase(strVal)) {
  624. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP).toString();
  625. }
  626. return new BigDecimal(strVal).setScale(2, RoundingMode.HALF_UP).toString();
  627. }
  628. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP).toString();
  629. } catch (Exception e) {
  630. log.warn("格式化BigDecimal数据异常: value={}", value, e);
  631. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP).toString();
  632. }
  633. }
  634. // 获取订单关联数据
  635. private Object getddAss(String title, String id) {
  636. return UtilMap.map("appType, formUuid, formType, instanceId, title, subTitle", "APP_VQDMMWS6OR1VHL8VMFD3", "FORM-B62CAE3075CE4098B17BB86C90FFA21C9B7C", "receipt", id, title, "");
  637. }
  638. // 辅助方法 - 安全格式化 BigDecimal 数据(保留2位小数)
  639. private BigDecimal safeFormatBigDecimal(Object value) {
  640. if (value == null) {
  641. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
  642. }
  643. try {
  644. if (value instanceof BigDecimal) {
  645. return ((BigDecimal) value).setScale(2, RoundingMode.HALF_UP);
  646. } else if (value instanceof Number) {
  647. return BigDecimal.valueOf(((Number) value).doubleValue()).setScale(2, RoundingMode.HALF_UP);
  648. } else if (value instanceof String) {
  649. String strVal = ((String) value).trim();
  650. if (strVal.isEmpty() || "null".equalsIgnoreCase(strVal)) {
  651. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
  652. }
  653. return new BigDecimal(strVal).setScale(2, RoundingMode.HALF_UP);
  654. }
  655. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
  656. } catch (Exception e) {
  657. log.warn("格式化BigDecimal数据异常: value={}", value, e);
  658. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
  659. }
  660. }
  661. // 获取应收单关联数据
  662. private Object getysdAss(String title, String id) {
  663. return UtilMap.map("appType, formUuid, formType, instanceId, title, subTitle", "APP_VQDMMWS6OR1VHL8VMFD3", "FORM-AADBCDA8126F41A0ADDEE3353828583192M8", "receipt", id, title, "");
  664. }
  665. private static LocalDateTime parseTimestamp(String timestampStr) {
  666. if (timestampStr == null || timestampStr.trim().isEmpty()) return null;
  667. try {
  668. long timestamp = Long.parseLong(timestampStr.trim());
  669. return LocalDateTime.ofInstant(
  670. Instant.ofEpochMilli(timestamp),
  671. ZoneId.systemDefault()
  672. );
  673. } catch (NumberFormatException e) {
  674. return null;
  675. }
  676. }
  677. private static int parseInt(String str, int defaultValue) {
  678. if (str == null || str.trim().isEmpty()) {
  679. return defaultValue;
  680. }
  681. try {
  682. return Integer.parseInt(str.trim());
  683. } catch (NumberFormatException e) {
  684. return defaultValue;
  685. }
  686. }
  687. private String safeGetString(Map formData, String key) {
  688. Object val = formData.get(key);
  689. return val == null ? "" : String.valueOf(val);
  690. }
  691. public static BigDecimal toBigDecimal(String str) {
  692. if (str == null || str.trim().isEmpty()) {
  693. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
  694. }
  695. try {
  696. return new BigDecimal(str.trim())
  697. .setScale(2, RoundingMode.HALF_UP);
  698. } catch (NumberFormatException e) {
  699. // 返回默认值而不是抛出异常,避免程序中断
  700. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
  701. }
  702. }
  703. /**
  704. * 重载方法,支持Number类型输入
  705. */
  706. public static BigDecimal toBigDecimal(Number number) {
  707. if (number == null) {
  708. return BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP);
  709. }
  710. return new BigDecimal(number.toString())
  711. .setScale(2, RoundingMode.HALF_UP);
  712. }
  713. }