RtrServerImpl.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. package com.malk.taisen.service.impl;
  2. import cn.hutool.json.JSONArray;
  3. import com.alibaba.fastjson.JSON;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.malk.server.aliwork.YDConf;
  6. import com.malk.server.aliwork.YDParam;
  7. import com.malk.server.aliwork.YDSearch;
  8. import com.malk.server.common.McException;
  9. import com.malk.server.dingtalk.DDR_New;
  10. import com.malk.service.aliwork.YDClient;
  11. import com.malk.service.aliwork.YDService;
  12. import com.malk.taisen.service.RtrServer;
  13. import com.malk.taisen.util.CusutUtil;
  14. import com.malk.taisen.util.HttpUtil;
  15. import com.malk.utils.UtilDateTime;
  16. import com.malk.utils.UtilMap;
  17. import com.malk.utils.UtilNumber;
  18. import lombok.extern.slf4j.Slf4j;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.beans.factory.annotation.Value;
  21. import org.springframework.stereotype.Service;
  22. import java.math.BigDecimal;
  23. import java.math.RoundingMode;
  24. import java.time.LocalDateTime;
  25. import java.time.format.DateTimeFormatter;
  26. import java.util.*;
  27. @Service
  28. @Slf4j
  29. public class RtrServerImpl implements RtrServer {
  30. @Autowired
  31. private YDClient ydClient;
  32. @Autowired
  33. private YDService ydService;
  34. /**
  35. * 测试地址
  36. */
  37. @Value(value = "${sap.QA_sapUrl_Poc}")
  38. private String QA_sapUrl ;
  39. @Value(value = "${sap.JT_sapUrl_Poc}")
  40. private String JT_sapUrl ;
  41. @Override
  42. public void RtrInsetSAP0005(String type,String formUuid, String InstanceId) {
  43. DDR_New ddr = ydClient.queryData(YDParam.builder().formInstId(InstanceId).build(), YDConf.FORM_QUERY.retrieve_id);
  44. Map dataForm = ddr.getFormData();
  45. JSONObject sapJson = new JSONObject();
  46. // 添加顶级键值对
  47. sapJson.put("BLART", "Z5");//凭证类型
  48. sapJson.put("ZOA_TYPE", "GL");//总账类型
  49. sapJson.put("interface_id", "SAP005");
  50. sapJson.put("ZPAY_AMT", "0");
  51. sapJson.put("ZDUEDATE", CusutUtil.getFormatDate((Long) dataForm.get("dateField_miwh5y85"))); //Due date / 到期日
  52. sapJson.put("ZOA_NUMBER", dataForm.get("textField_mi73dy3n")); //钉钉单据号
  53. sapJson.put("BUKRS", dataForm.get("textField_mejfj9iw"));//公司代码
  54. String uid = "CHN-02200287"; // 2200287
  55. // String uname = "";
  56. if (dataForm.containsKey("employeeField_mhxdzya9_id")&&!dataForm.get("employeeField_mhxdzya9_id").equals("")) {
  57. List<Map<String, Object>> conditions = new ArrayList<>(Arrays.asList(buildCondition("textField_l6dddg5k", dataForm.get("employeeField_mhxdzya9_id"), "TEXT", "eq", "TextField")));
  58. String listJson = JSON.toJSONString(conditions);
  59. YDParam YGydParam = _getYDTokenZXXZ(listJson);
  60. List<Map> dataList = (List<Map>) ydClient.queryData(YGydParam, YDConf.FORM_QUERY.retrieve_search_form).getData();
  61. if (dataList != null && dataList.size() > 0) {
  62. Map map = dataList.get(0);
  63. Map formData = (Map) map.get("formData");
  64. uid = formData.get("textField_l6djch1m").toString();
  65. uid = "CHN-0" + uid;
  66. }
  67. }
  68. sapJson.put("USNAM", uid); //过账人
  69. sapJson.put("BLDAT", CusutUtil.getFormatDate((Long) dataForm.get("dateField_l9nsavm3"))); //凭证日期ƒ Date / 申请日期
  70. sapJson.put("BUDAT", CusutUtil.getFormatDate((Long) dataForm.get("dateField_miwh5y85"))); //过账日期
  71. sapJson.put("BKTXT", dataForm.get("textField_miwh5y6z"));//备注 抬头文本
  72. sapJson.put("WAERS", dataForm.get("selectField_mejfoong")); //币种
  73. sapJson.put("BANKA", "");
  74. sapJson.put("BANKN", "");
  75. sapJson.put("KOINH", "");
  76. sapJson.put("LIFNR", "");
  77. sapJson.put("ZINVOICE_AMT","0");
  78. //获取子表
  79. if (type.equals("YWJT")) {
  80. JSONArray itemArray = new JSONArray();
  81. Boolean isOtherTypeFor = (formUuid.equals("FORM-66A4F00A1E0E4E67B607D4119B88CEF6FBP6")||formUuid.equals("FORM-2CB3F7D8B4224AB9972A8C24CDBF3464C1OU"))&&"其他".equals(UtilMap.getString(dataForm,"radioField_mj1hb0kj"));
  82. int x = 1;//OA单据行号累计用
  83. List<Map> tableFils = ydService.queryDetails(YDParam.builder().formInstanceId(InstanceId).formUuid(formUuid).tableFieldId(isOtherTypeFor?"tableField_mk7rt61h":"tableField_mipgl0vx").build());
  84. if (tableFils != null && tableFils.size() > 0) {
  85. for (int n = 0; n < tableFils.size(); n++) {
  86. Map<String, Object> row = new HashMap(tableFils.get(n));
  87. JSONObject itemObj = new JSONObject();
  88. String sjItemNo = "";
  89. if (x < 10) {
  90. sjItemNo += "00" + x;
  91. } else if (x < 100) {
  92. sjItemNo += "0" + x;
  93. } else {
  94. sjItemNo += x;
  95. }
  96. x++;
  97. itemObj.put("ZOA_ITEMNO", sjItemNo);//OA单据行号
  98. itemObj.put("SHKZG", "S");// S借方
  99. itemObj.put("ZTAXOUT_AMT", "0"); // 进项转出金额
  100. itemObj.put("ZTAX_AMT", UtilMap.getString_default(row,isOtherTypeFor?"numberField_mk7rt61g_value":"numberField_miwh5y8a_value","0")); // 税额
  101. // itemObj.put("HKONT", String.valueOf(row.get("textField_mipgl0w1"))); //会计科目:取接口行项目接口字段会计科目 HKONT
  102. itemObj.put("HKONT", String.valueOf(row.get(isOtherTypeFor?"textField_mk7rt617":"textField_miwh5y87"))); //会计科目:取接口行项目接口字段会计科目 HKONT
  103. itemObj.put("DMBTR", String.valueOf(row.get(isOtherTypeFor?"numberField_mk7rt619_value":"numberField_mipgl0w2_value"))); //凭证金额:取接口行项目接口字段 DMBTR
  104. itemObj.put("KOSTL", String.valueOf(row.get(isOtherTypeFor?"textField_mk7rt61a":"textField_mipgl0w3"))); //成本中心:取接口行项目接口字段成本中心KOSTL
  105. itemObj.put("AUFNR", String.valueOf(row.get(isOtherTypeFor?"textField_mk7rt61b":"textField_mipgl0w4"))); //订单:取接口行项目接口字段订单 AUFNR
  106. itemObj.put("PS_POSID", String.valueOf(row.get(isOtherTypeFor?"textField_mk7rt61c":"textField_mipgl0w5"))); //WBS:职接口行项目接口字段 WBS元素 PS_POSID
  107. itemObj.put("MWSKZ", String.valueOf(row.get(isOtherTypeFor?"textField_mk7rt61d":"textField_mipgl0w6")));///税码:取总账通用工单的行项目的税码,接口字段MWSKZ
  108. itemObj.put("ZUONR", String.valueOf(row.get(isOtherTypeFor?"textField_mk7rt61e":"textField_mipgl0w7")));///分配:取接口行项目接口字段分配 ZUONR
  109. itemObj.put("XREF1", String.valueOf(row.get(isOtherTypeFor?"textField_mk7rt61f":"textField_miwh5y88")));///参考码1:取接口行项目接口字段 XREF1
  110. itemObj.put("SGTXT", String.valueOf(row.get(isOtherTypeFor?"textareaField_mk7rt616":"textareaField_miwh5y86")));///行项目文本:取接口行项目接口字段行项目文本 SGTXT
  111. itemObj.put("VBUND", UtilMap.getString_default(row,isOtherTypeFor?"textField_mo8fsj02":"textField_mo8fsj00","")); //贸易伙伴 VBUND
  112. itemArray.put(itemObj);
  113. }
  114. }
  115. List<Map> tableFils2 = ydService.queryDetails(YDParam.builder().formInstanceId(InstanceId).formUuid(formUuid).tableFieldId(isOtherTypeFor?"tableField_mk7rt61v":"tableField_miwh5y8n").build());
  116. // List<Map<String, Object>> tableFils2 = (List<Map<String, Object>>) dataForm.get("tableField_miwh5y8n");
  117. if (tableFils2 != null && tableFils2.size() > 0) {
  118. for (int n = 0; n < tableFils2.size(); n++) {
  119. Map<String, Object> row = new HashMap(tableFils2.get(n));
  120. JSONObject itemObj = new JSONObject();
  121. itemObj.put("SHKZG", "H"); //H贷方
  122. String sjItemNo = "";
  123. if (x < 10) {
  124. sjItemNo += "00" + x;
  125. } else if (x < 100) {
  126. sjItemNo += "0" + x;
  127. } else {
  128. sjItemNo += x;
  129. }
  130. x++;
  131. itemObj.put("ZOA_ITEMNO", sjItemNo);//OA单据行号
  132. itemObj.put("ZTAXOUT_AMT", "0"); // 进项转出金额
  133. itemObj.put("ZTAX_AMT", UtilMap.getString_default(row,isOtherTypeFor?"numberField_mk7rt61u_value":"numberField_miwh5y8m_value","0")); // 税额
  134. // itemObj.put("HKONT", String.valueOf(row.get("textField_miwh5y8d"))); //会计科目:取接口行项目接口字段会计科目 HKONT
  135. itemObj.put("HKONT", String.valueOf(row.get(isOtherTypeFor?"textField_mk7rt61k":"textField_miwh5y8e"))); //会计科目:取接口行项目接口字段会计科目 HKONT
  136. itemObj.put("DMBTR", String.valueOf(row.get(isOtherTypeFor?"numberField_mk7rt61m_value":"numberField_miwh5y8f_value"))); //凭证金额:取接口行项目接口字段 DMBTR
  137. itemObj.put("KOSTL", String.valueOf(row.get(isOtherTypeFor?"textField_mk7rt61n":"textField_miwh5y8g"))); //成本中心:取接口行项目接口字段成本中心KOSTL
  138. itemObj.put("AUFNR", String.valueOf(row.get(isOtherTypeFor?"textField_mk7rt61o":"textField_miwh5y8h"))); //订单:取接口行项目接口字段订单 AUFNR
  139. itemObj.put("PS_POSID", String.valueOf(row.get(isOtherTypeFor?"textField_mk7rt61p":"textField_miwh5y8i"))); //WBS:职接口行项目接口字段 WBS元素 PS_POSID
  140. itemObj.put("MWSKZ", String.valueOf(row.get(isOtherTypeFor?"textField_mk7rt61q":"textField_miwh5y8j")));///税码:取总账通用工单的行项目的税码,接口字段MWSKZ
  141. itemObj.put("ZUONR", String.valueOf(row.get(isOtherTypeFor?"textField_mk7rt61r":"textField_miwh5y8k")));///分配:取接口行项目接口字段分配 ZUONR
  142. itemObj.put("XREF1", String.valueOf(row.get(isOtherTypeFor?"textField_mk7rt61s":"textField_miwh5y8l")));///参考码1:取接口行项目接口字段 XREF1
  143. itemObj.put("SGTXT", String.valueOf(row.get(isOtherTypeFor?"textareaField_mk7rt61j":"textareaField_miwh5y8c")));///行项目文本:取接口行项目接口字段行项目文本 SGTXT
  144. itemObj.put("VBUND", UtilMap.getString_default(row,isOtherTypeFor?"textField_mo8fsj03":"textField_mo8fsj01","")); //贸易伙伴 VBUND
  145. itemArray.put(itemObj);
  146. }
  147. }
  148. sapJson.put("ITEM", itemArray);
  149. }
  150. /***
  151. * 调用接口
  152. */
  153. System.out.println(sapJson);
  154. log.info("发起POST请求:URL={},参数={}", QA_sapUrl + "SAP005", sapJson);
  155. String post = HttpUtil.post(QA_sapUrl + "SAP005", null, sapJson.toString(), null);
  156. log.info(dataForm.get("textField_mi73dy3n")+"POST反馈={}", post);
  157. System.out.println( "POST反馈====="+post);
  158. if (!post.equals("")) {
  159. JSONArray jsonArray = new JSONArray(post);
  160. if (jsonArray.size() > 0) {
  161. String voucherNumber = "";
  162. try {
  163. cn.hutool.json.JSONObject postJsonObject = jsonArray.getJSONObject(0);
  164. String E_SYSMSGTYPE = postJsonObject.getStr("E_SYSMSGTYPE");//状态
  165. String E_MESSAGE = postJsonObject.getStr("E_MESSAGE");//SAP005 接口 反馈值
  166. // prd 重复推送标记成功
  167. if (E_SYSMSGTYPE.equals("S") || "post operation had already been done, repeat is not allowed".equals(E_MESSAGE)) {
  168. String e_belnr = postJsonObject.getStr("E_BELNR");
  169. String E_GJAHR = postJsonObject.getStr("E_GJAHR");//凭证年度
  170. // 执行完加入,把更改表单凭证数据
  171. ydClient.operateData(YDParam.builder().formInstanceId(InstanceId).updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_l9nsavm2, textField_mejezfwk, textareaField_mi5kjmxb, selectField_mi72r4s6", E_GJAHR, e_belnr,E_MESSAGE,"成功"))).build(), YDConf.FORM_OPERATION.update);
  172. }else {
  173. // 报错写入
  174. saveError(InstanceId,E_MESSAGE);
  175. }
  176. } catch (Exception ex) {
  177. log.error("解析异常{}",ex.getMessage());
  178. saveError(InstanceId,post);
  179. }
  180. } else {
  181. log.error("返回值数组为空");
  182. saveError(InstanceId,"返回值数组为空,返回值:"+post);
  183. }
  184. }else {
  185. // 报错写入
  186. saveError(InstanceId,post);
  187. }
  188. }
  189. private void saveError(String InstanceId,String errorMsg){
  190. ydClient.operateData(YDParam.builder().formInstanceId(InstanceId).updateFormDataJson(JSON.toJSONString(UtilMap.map("textareaField_mi5kjmxb, selectField_mi72r4s6", errorMsg,"失败" ))).build(), YDConf.FORM_OPERATION.update);
  191. }
  192. //匹配条件用
  193. private static final String KEY = "key";
  194. private static final String VALUE = "value";
  195. private static final String TYPE = "type";
  196. private static final String OPERATOR = "operator";
  197. private static final String COMPONENT_NAME = "componentName";
  198. private static Map<String, Object> buildCondition(String key, Object value, String type, String operator, String componentName) {
  199. Map<String, Object> condition = new HashMap<>();
  200. condition.put(KEY, key);
  201. condition.put(VALUE, value);
  202. condition.put(TYPE, type);
  203. condition.put(OPERATOR, operator);
  204. condition.put(COMPONENT_NAME, componentName);
  205. return condition;
  206. }
  207. /**
  208. * 泰森付款 人员档案表
  209. */
  210. public static YDParam _getYDTokenZXXZ(String searchFieldJson) {
  211. return YDParam.builder().formUuid("FORM-4J7669A10FO250UJ9C6Q7CM00PC62YPW8DD6LT").searchFieldJson(searchFieldJson).build();
  212. }
  213. // 销售计提
  214. @Override
  215. public void RtrInsetSAP0020(String type, String formUuid, String InstanceId) {
  216. boolean isNew = type.equals("XSJTNEW");
  217. DDR_New ddr = ydClient.queryData(YDParam.builder().formInstId(InstanceId).build(), YDConf.FORM_QUERY.retrieve_id);
  218. Map dataForm = ddr.getFormData();
  219. /// 主表字段: 公司代码, 凭证类型, 货币码, 钉钉单据号, 发起人
  220. Map body = UtilMap.map( "BUKRS, BLART, WAERS, XBLNR, USNAM",
  221. "textField_mejfj9iw, selectField_mejkjsb5, selectField_mejfoong, serialNumberField_mjc4e95b, textField_mjjs85qn",
  222. dataForm);
  223. if (dataForm.containsKey("employeeField_mhxdzya9_id")&&!dataForm.get("employeeField_mhxdzya9_id").equals("")) {
  224. List<Map<String, Object>> conditions = new ArrayList<>(Arrays.asList(buildCondition("textField_l6dddg5k", dataForm.get("employeeField_mhxdzya9_id"), "TEXT", "eq", "TextField")));
  225. String listJson = JSON.toJSONString(conditions);
  226. YDParam YGydParam = _getYDTokenZXXZ(listJson);
  227. List<Map> dataList = (List<Map>) ydClient.queryData(YGydParam, YDConf.FORM_QUERY.retrieve_search_form).getData();
  228. if (dataList != null && dataList.size() > 0) {
  229. Map map = dataList.get(0);
  230. Map formData = (Map) map.get("formData");
  231. String uid = "CHN-0" + formData.get("textField_l6djch1m").toString();
  232. body.put("USNAM",uid);
  233. }
  234. }
  235. /// 主表字段: 凭证日期, 过账日期, 会计期间
  236. body.put("BLDAT", UtilDateTime.format(new Date(UtilMap.getLong(dataForm, "dateField_mipgl0vv")), "yyyyMMdd"));
  237. body.put("BUDAT", UtilDateTime.format(new Date(UtilMap.getLong(dataForm, "dateField_mjc39hdc")), "yyyyMMdd"));
  238. if (UtilMap.getString(dataForm, "textField_mipmks2t").contains("-")) {
  239. body.put("MONAT", UtilMap.getString(dataForm, "textField_mipmks2t").split("-")[1]);
  240. }
  241. List<Map> details = UtilMap.getList(dataForm, "tableField_mipgl0vx");
  242. if (details.size() == 50) {
  243. details = ydService.queryDetails(YDParam.builder().formInstanceId(InstanceId).formUuid(formUuid).tableFieldId("tableField_mipgl0vx").build());
  244. }
  245. log.info("销售计提行项目, {}, {}", InstanceId, details.size());
  246. int total = details.size(), succ = 0, fail = 0;
  247. // 批量推送Sap凭证: 兼容重试场景
  248. for (Map detail : details) {
  249. if ("成功".equals(UtilMap.getString(detail, "selectField_mjihy3si"))) {
  250. succ += 1;
  251. continue;
  252. }
  253. /// 主表字段: 上传编号, 抬头文本
  254. String referCode = UtilMap.getString(dataForm, "serialNumberField_mjc4e95b") + UtilMap.getString(detail, "textField_mjif9kha");
  255. body.put("ZUPDNR", referCode);
  256. body.put("BKTXT", UtilMap.getString(detail, "textField_mipgl0w4"));
  257. /// 明细字段: 凭证货币金额, 项目文本, 利润中心, 分配, 参考码1, 参考码2, 产品号, 销售组织, 分销渠道, 产品组, 客户定义, 物料组包装物料, 销售地区, 客户简称
  258. Map row = UtilMap.map("WRBTR, SGTXT, PRCTR, ZUONR, XREF1, XREF2, ARTNR, VKORG, VTWEG, SPART, KDKG4, MAGRV, BZIRK, WWKCG",
  259. "numberField_mipgl0w2, textField_mipgl0w4, textField_mjihy3sn, textField_mipgl0w5, textField_mipgl0w6, textField_mipgl0w7, textField_mipgl0w9, textField_mipgl0wa, textField_mipgl0wb, textField_mipgl0wc, textField_mipgl0wd, textField_mipgl0we, textField_mipgl0wf, textField_mipgl0wg",
  260. detail);
  261. if (isNew){
  262. body.put("BUKRS",UtilMap.getString(detail, "textField_mejfj9iw"));
  263. }
  264. row.put("ZUPDNR", referCode);
  265. try {
  266. Map result = this._pushSap(detail, body, row);
  267. // prd 重复推送标记成功
  268. if ("S".equals(result.get("E_SYSMSGTYPE")) || "post operation had already been done, repeat is not allowed".equals(result.get("E_MESSAGE"))) {
  269. detail.put("selectField_mjihy3si", "成功");
  270. detail.put("textField_mejezfwk", result.get("E_BELNR"));
  271. detail.put("textField_l9nsavm2", result.get("E_GJAHR"));
  272. succ += 1;
  273. } else {
  274. detail.put("selectField_mjihy3si", "失败");
  275. fail += 1;
  276. }
  277. detail.put("textareaField_mi5kjmxb", result.get("E_MESSAGE"));
  278. } catch (McException mc) {
  279. detail.put("selectField_mjihy3si", "失败");
  280. detail.put("textareaField_mi5kjmxb", mc.getMessage());
  281. fail +=1;
  282. }
  283. /// 子表回写: 行项目-凭证号
  284. detail.put("textField_mjihy3sm", referCode);
  285. }
  286. String state = "已完成";
  287. if (fail > 0) {
  288. state = "部分失败";
  289. }
  290. if (fail == total) {
  291. state = "全部失败";
  292. }
  293. Map formData = UtilMap.map("tableField_mipgl0vx, numberField_mjc39hdi, numberField_mjc39hdj, numberField_mjc39hdk, selectField_mi72r4s6", details, total, succ, fail, state);
  294. log.info("销售计提执行, {}", formData);
  295. ydClient.operateData(YDParam.builder().formInstanceId(InstanceId).updateFormDataJson(JSON.toJSONString(formData)).build(), YDConf.FORM_OPERATION.update);
  296. }
  297. private static List<String> SYNC_FORM_LIST = Arrays.asList("FORM-0401740B8E6F4DF8894498F0D8783B13QIPI","FORM-66A4F00A1E0E4E67B607D4119B88CEF6FBP6", "FORM-0EB8076C7A8E437A8A47862A1C4CFC61B1LB");
  298. @Override
  299. public void syncSAP0005() {
  300. LocalDateTime now = LocalDateTime.now();// 10:05
  301. LocalDateTime end = now.minusMinutes(3);
  302. LocalDateTime start = end.minusMinutes(60);
  303. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  304. String startStr = start.format(formatter);
  305. String endStr = end.format(formatter);
  306. YDSearch orderState=new YDSearch("selectField_miwh5y55","待过账","单据状态", YDSearch.Type.TEXT_FIELD,YDSearch.Operator.EQ);
  307. YDSearch pushState=new YDSearch("selectField_mi72r4s6","待推送","推送状态", YDSearch.Type.TEXT_FIELD,YDSearch.Operator.EQ);
  308. for (String formUuId:SYNC_FORM_LIST){
  309. List<Map> list= (List<Map>) ydClient.queryData(YDParam.builder().formUuid(formUuId)
  310. .searchFieldJson(JSONObject.toJSONString(Arrays.asList(orderState,pushState)))
  311. .approvedResult("agree").modifiedFromTimeGMT(startStr).modifiedToTimeGMT(endStr).build(), YDConf.FORM_QUERY.retrieve_search_process).getData();
  312. for (Map map:list){
  313. String insetid = map.get("processInstanceId").toString();
  314. log.info("自动推送:{}/{}",formUuId,insetid);
  315. this.RtrInsetSAP0005("YWJT",formUuId,insetid);
  316. }
  317. }
  318. }
  319. /// 推送Sap
  320. private Map _pushSap(Map detail, Map body, Map row) {
  321. /// 借贷处理: 行项目号; 记账代码, 借方-40, 贷方-50; 总账科目;
  322. List<Map> items = new ArrayList<>();
  323. /// 成本中心: 传递到sap,科目大于等于5取值到成本中心行项目,否则则不赋值
  324. String cbzx = UtilMap.getString(detail, "textField_mipgl0w3");
  325. String jfkm = UtilMap.getString(detail, "textField_mipgl0vy");
  326. Map jf = UtilMap.map("ITMNR, BSCHL, HKONT", "001", "40", jfkm);
  327. if (Integer.valueOf(jfkm.substring(0, 1)) >= 5) {
  328. jf.put("KOSTL", cbzx);
  329. }
  330. jf.putAll(row);
  331. items.add(jf);
  332. String dfkm = UtilMap.getString(detail, "textField_mipgl0w1");
  333. Map df = UtilMap.map("ITMNR, BSCHL, HKONT", "002", "50", dfkm);
  334. if (Integer.valueOf(dfkm.substring(0, 1)) >= 5) {
  335. df.put("KOSTL", cbzx);
  336. }
  337. df.putAll(row);
  338. items.add(df);
  339. body.put("ITEMS", items);
  340. log.info("销售计提推送 SAP, {}", JSON.toJSONString(body));
  341. String rsp = HttpUtil.post(JT_sapUrl + "&ZUPDNR=" + body.get("ZUPDNR"), null, JSON.toJSONString(body), null);
  342. log.info("销售计提 SAP 响应, {}", rsp);
  343. List<Map> result = JSON.parseArray(rsp, Map.class);
  344. McException.assertAccessException(result.isEmpty(), "Sap接口请求异常, 返回空集合, 需重新推送.");
  345. return result.get(0);
  346. }
  347. }