NonPoServerImpl.java 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813
  1. package com.malk.taisen.service.impl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.fasterxml.jackson.databind.JsonNode;
  5. import com.fasterxml.jackson.databind.ObjectMapper;
  6. import com.malk.taisen.util.CusutUtil;
  7. import com.malk.taisen.util.HttpUtil;
  8. import cn.hutool.json.JSONArray;
  9. import com.malk.server.aliwork.YDConf;
  10. import com.malk.server.aliwork.YDParam;
  11. import com.malk.server.dingtalk.DDR_New;
  12. import com.malk.service.aliwork.YDClient;
  13. import com.malk.service.aliwork.YDService;
  14. import com.malk.service.dingtalk.DDClient;
  15. import com.malk.taisen.service.NonPoServer;
  16. import com.malk.utils.UtilMap;
  17. import lombok.extern.slf4j.Slf4j;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.beans.factory.annotation.Value;
  20. import org.springframework.http.HttpEntity;
  21. import org.springframework.http.HttpHeaders;
  22. import org.springframework.http.MediaType;
  23. import org.springframework.http.ResponseEntity;
  24. import org.springframework.stereotype.Service;
  25. import org.springframework.web.client.RestTemplate;
  26. import java.math.BigDecimal;
  27. import java.math.RoundingMode;
  28. import java.text.ParseException;
  29. import java.text.SimpleDateFormat;
  30. import java.util.*;
  31. @Slf4j
  32. @Service
  33. public class NonPoServerImpl implements NonPoServer {
  34. @Autowired
  35. private YDClient ydClient;
  36. @Autowired
  37. private YDService ydService;
  38. @Autowired
  39. private DDClient ddClient;
  40. /**
  41. * 测试地址
  42. */
  43. private String QA_sapUrl = "https://etl-nonprod-tasks.tysondt.com:443/api/1/rest/feed/run/task/TysonNonProd/Ultra_PoC/10-QA-team-fssc/tk_oa_to_sap_p2p?bearer_token=bBiGTA7PS0JJ6wKhQU8Vm0vLsIDNjLaN&interface_id=";
  44. //private String formUuid = "FORM-E9A6EBE00F3E4DA68681107F85600D80ZJUT";
  45. // @Override
  46. public void NonPoinsetSAP0005(String type, String InstanceId,String formUuid) {
  47. YDParam ydParam = _getYDTokenKPD();
  48. ydParam.setFormInstanceId(InstanceId);
  49. DDR_New ddr = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_id);
  50. Map dataForm = ddr.getFormData();
  51. // dataForm.put("InstanceId", InstanceId);
  52. JSONObject sapJson = new JSONObject();
  53. JSONObject upJson = new JSONObject();
  54. String PD = (String) dataForm.get("selectField_mj1cq2oz");//是否生成SAP凭证
  55. String SAPID = (String) dataForm.get("textField_mejezfwk");//SAP凭证号码
  56. String SFXCFK = (String) dataForm.get("radioField_mj1gc7qe");//仅携程付款是否
  57. /**
  58. * 是否需要生成SAP凭证
  59. */
  60. if (("否".equals(PD) && !SAPID.equals("")) || "是".equals(SFXCFK)) {
  61. FPGX(InstanceId, SAPID, (String) dataForm.get("textField_mi73dy3n"));
  62. } else if (!"否".equals(PD)) {
  63. // 添加顶级键值对
  64. sapJson.put("ZDUEDATE", CusutUtil.getFormatDate((Long) dataForm.get("dateField_mejfoonv"))); //Due date / 到期日
  65. sapJson.put("BKTXT", dataForm.get("textareaField_mejfoonw"));//备注 抬头文本
  66. sapJson.put("ZOA_NUMBER", dataForm.get("textField_mi73dy3n")); //钉钉单据号dataForm.get("textField_mi73dy3n")
  67. if (dataForm.get("selectField_mejfoona").equals("收据支付")) {//☑ 票据支付时 代码ZINVOICE_AMT 默认ZPAY_AMT的值
  68. sapJson.put("ZINVOICE_AMT", dataForm.get("numberField_mejfoool_value").equals("") ? "0" : dataForm.get("numberField_mejfoool_value"));//支付金额
  69. } else {
  70. sapJson.put("ZINVOICE_AMT", dataForm.get("numberField_mejfoook_value").equals("") ? "0" : dataForm.get("numberField_mejfoook_value"));//发票总额
  71. }
  72. sapJson.put("BANKA", dataForm.get("textField_mejfoon9")); //开户行
  73. sapJson.put("BLDAT", CusutUtil.getFormatDate((Long) dataForm.get("dateField_l9nsavm3"))); //凭证日期ƒ Date / 申请日期
  74. String uid = "TEST-CN001";
  75. String uname = "";
  76. if (!dataForm.get("employeeField_mhxdzya9_id").equals("")) {
  77. List<Map<String, Object>> conditions = new ArrayList<>(Arrays.asList(buildCondition("textField_l6dddg5k", dataForm.get("employeeField_mhxdzya9_id"), "TEXT", "eq", "TextField")));
  78. String listJson = JSON.toJSONString(conditions);
  79. YDParam YGydParam = _getYDTokenZXXZ(listJson);
  80. List<Map> dataList = (List<Map>) ydClient.queryData(YGydParam, YDConf.FORM_QUERY.retrieve_search_form).getData();
  81. if (dataList != null && dataList.size() > 0) {
  82. Map map = dataList.get(0);
  83. Map formData = (Map) map.get("formData");
  84. uid = formData.get("textField_l6djch1m").toString();
  85. uid = "CHN-0" + uid;
  86. }
  87. }
  88. // uid = "CHN-01000332";//测试过账人
  89. sapJson.put("USNAM", uid); //过账人
  90. sapJson.put("BUDAT", CusutUtil.getFormatDate((Long) dataForm.get("dateField_mhxdzyaa"))); //过账日期
  91. sapJson.put("ZOA_TYPE", dataForm.get("selectField_mejfoona").equals("无票预付") || dataForm.get("selectField_mejfoona").equals("100%清预付款") || dataForm.get("selectField_mejfoona").equals("100%清收据") ? "AD" : "NP");//OA单据类型
  92. sapJson.put("ZPAY_AMT", dataForm.get("numberField_mejfoool_value").equals("") ? "0" : dataForm.get("numberField_mejfoool_value")); //支付金额
  93. sapJson.put("BUKRS", dataForm.get("textField_mejfj9iw"));//公司代码
  94. sapJson.put("BANKN", dataForm.get("textField_mejfoon8")); //银行账号
  95. sapJson.put("WAERS", dataForm.get("selectField_mejfoong")); //币种
  96. sapJson.put("KOINH", dataForm.get("textField_mejezfwl")); //收款方名称
  97. sapJson.put("LIFNR", dataForm.get("textField_mejezfwv"));//供应商代码
  98. sapJson.put("interface_id", "SAP005");
  99. //获取子表
  100. if (dataForm.get("selectField_mejfoona").equals("发票支付")) {
  101. sapJson.put("BLART", "Z2");//凭证类型
  102. JSONArray itemArray = new JSONArray();
  103. int x = 1;//OA单据行号累计用
  104. List<Map> tableFils = ydService.queryDetails(YDParam.builder().formInstanceId(InstanceId).formUuid(formUuid).tableFieldId("tableField_l6ujr47b").build());
  105. // List<Map<String, Object>> tableFils = (List<Map<String, Object>>) dataForm.get("tableField_l6ujr47b");
  106. if (tableFils != null && tableFils.size() > 0) {
  107. for (int n = 0; n < tableFils.size(); n++) {
  108. Map<String, Object> row = new HashMap(tableFils.get(n));
  109. JSONObject itemObj = new JSONObject();
  110. itemObj.put("KOSTL", String.valueOf(row.get("textField_mi5kjmwk"))); //成本中心
  111. itemObj.put("DMBTR", String.valueOf(row.get("numberField_l6ujr47g_value"))); //不含税金额
  112. itemObj.put("XREF1", "");//参考码 9000242
  113. String sjItemNo = "";
  114. if (x < 10) {
  115. sjItemNo += "00" + x;
  116. } else if (x < 100) {
  117. sjItemNo += "0" + x;
  118. } else {
  119. sjItemNo += x;
  120. }
  121. x++;
  122. itemObj.put("ZOA_ITEMNO", sjItemNo);//OA单据行号
  123. itemObj.put("HKONT", String.valueOf(row.get("textField_l6lvt6lj"))); //会计科目
  124. itemObj.put("ZTAXOUT_AMT", "0");//进项税转出金额 、、、 String.valueOf(row.get("numberField_l6bx7hqk_value"))
  125. itemObj.put("MWSKZ", String.valueOf(row.get("textField_l7a6bzpv")));///税码
  126. itemObj.put("ZTAX_AMT", String.valueOf(row.get("numberField_memejxqp")).equals("") ? "0" : String.valueOf(row.get("numberField_memejxqp"))); //税额
  127. itemObj.put("SGTXT", String.valueOf(row.get("textField_mejfoonz"))); //行项目文本
  128. itemArray.put(itemObj);
  129. }
  130. }
  131. sapJson.put("ITEM", itemArray);
  132. } else if (dataForm.get("selectField_mejfoona").equals("无票预付")) {
  133. sapJson.put("BLART", "Z4");//凭证类型
  134. sapJson.put("UMSKZ", "A");//特别总账标识
  135. JSONArray SapItem = new JSONArray(); //子表
  136. JSONObject itemObject = new JSONObject();
  137. itemObject.put("ZOA_ITEMNO", "001"); //OA单据行号
  138. itemObject.put("HKONT", ""); //会计科目
  139. itemObject.put("KOSTL", ""); //成本中心
  140. BigDecimal bigBhsje = new BigDecimal(dataForm.get("numberField_mejfoool_value").toString());//改大数
  141. bigBhsje = bigBhsje.setScale(2, RoundingMode.HALF_UP);
  142. itemObject.put("DMBTR", bigBhsje); //不含税金额
  143. // itemObject.put("DMBTR", object.get("numberField_l6bwb4hg").toString()); //不含税金额--支付金额
  144. itemObject.put("MWSKZ", ""); //税码
  145. itemObject.put("ZTAX_AMT", "0"); //税额
  146. itemObject.put("ZTAXOUT_AMT", "0"); //进项税转出金额
  147. itemObject.put("SGTXT", ""); //行项目文本
  148. itemObject.put("XREF1", dataForm.get("textareaField_mejfoonw")); //cir项目号
  149. SapItem.put(itemObject);
  150. sapJson.put("ITEM", SapItem);
  151. } else if (dataForm.get("selectField_mejfoona").equals("收据支付")) {
  152. sapJson.put("BLART", "Z2");//凭证类型
  153. JSONArray itemArray = new JSONArray();
  154. int x = 1;//OA单据行号累计用
  155. List<Map> tableFils = ydService.queryDetails(YDParam.builder().formInstanceId(InstanceId).formUuid(formUuid).tableFieldId("tableField_mi7c3wl9").build());
  156. //List<Map<String, Object>> tableFils = (List<Map<String, Object>>) dataForm.get("tableField_mi7c3wl9");
  157. if (tableFils != null && tableFils.size() > 0) {
  158. for (int n = 0; n < tableFils.size(); n++) {
  159. Map<String, Object> row = new HashMap(tableFils.get(n));
  160. JSONObject itemObj = new JSONObject();
  161. itemObj.put("KOSTL", String.valueOf(row.get("textField_mi7c3wku"))); //成本中心
  162. itemObj.put("DMBTR", String.valueOf(row.get("numberField_mi7c3wky_value"))); //不含税金额
  163. itemObj.put("XREF1", "");//参考码 9000242
  164. String sjItemNo = "";
  165. if (x < 10) {
  166. sjItemNo += "00" + x;
  167. } else if (x < 100) {
  168. sjItemNo += "0" + x;
  169. } else {
  170. sjItemNo += x;
  171. }
  172. x++;
  173. itemObj.put("ZOA_ITEMNO", sjItemNo);//OA单据行号
  174. itemObj.put("HKONT", String.valueOf(row.get("textField_mi7c3wl5"))); //会计科目
  175. itemObj.put("ZTAXOUT_AMT", "0");//进项税转出金额 、、、 String.valueOf(row.get("numberField_l6bx7hqk_value"))
  176. itemObj.put("MWSKZ", "");///税码
  177. itemObj.put("ZTAX_AMT", "0"); //税额
  178. itemObj.put("SGTXT", String.valueOf(row.get("textField_mi7c3wkn"))); //行项目文本
  179. itemArray.put(itemObj);
  180. }
  181. }
  182. sapJson.put("ITEM", itemArray);
  183. } else if (dataForm.get("selectField_mejfoona").equals("100%清预付款")) {
  184. String XREF1 = "";
  185. String XREF2 = "";
  186. /***
  187. * 获取参考代码1 2
  188. */
  189. List<Map> XREFlist = ydService.queryDetails(YDParam.builder().formInstanceId(InstanceId).formUuid(formUuid).tableFieldId("tableField_mi8q495e").build());
  190. // List<Map<String, Object>> XREFlist = (List<Map<String, Object>>) dataForm.get("tableField_mi8q495e");
  191. if (XREFlist != null && !XREFlist.isEmpty()) {
  192. if (XREFlist.size() == 1) {
  193. Map<String, Object> row = XREFlist.get(0);
  194. XREF1 = row.get("textField_mi8q495f") != null ? row.get("textField_mi8q495f").toString() : "";
  195. } else {
  196. // 多于一条,按时间戳降序排序
  197. XREFlist.sort((a, b) -> {
  198. Long timeA = a.get("dateField_mj13wpls") instanceof Number
  199. ? ((Number) a.get("dateField_mj13wpls")).longValue()
  200. : 0L;
  201. Long timeB = b.get("dateField_mj13wpls") instanceof Number
  202. ? ((Number) b.get("dateField_mj13wpls")).longValue()
  203. : 0L;
  204. return Long.compare(timeB, timeA); // 降序:最新在前
  205. });
  206. // 取前两条
  207. XREF1 = XREFlist.get(0).get("textField_mi8q495f") != null
  208. ? XREFlist.get(0).get("textField_mi8q495f").toString() : "";
  209. XREF2 = XREFlist.get(1).get("textField_mi8q495f") != null
  210. ? XREFlist.get(1).get("textField_mi8q495f").toString() : "";
  211. }
  212. }
  213. sapJson.put("BLART", "Z2");//凭证类型
  214. JSONArray itemArray = new JSONArray();
  215. int x = 1;//OA单据行号累计用
  216. List<Map> tableFils = ydService.queryDetails(YDParam.builder().formInstanceId(InstanceId).formUuid(formUuid).tableFieldId("tableField_l6ujr47b").build());
  217. // List<Map<String, Object>> tableFils = (List<Map<String, Object>>) dataForm.get("tableField_l6ujr47b");
  218. if (tableFils != null && tableFils.size() > 0) {
  219. for (int n = 0; n < tableFils.size(); n++) {
  220. Map<String, Object> row = new HashMap(tableFils.get(n));
  221. JSONObject itemObj = new JSONObject();
  222. itemObj.put("KOSTL", String.valueOf(row.get("textField_mi5kjmwk"))); //成本中心
  223. itemObj.put("DMBTR", String.valueOf(row.get("numberField_l6ujr47g_value"))); //不含税金额
  224. itemObj.put("XREF1", XREF1);//参考码1
  225. itemObj.put("XREF2", XREF2);//参考码2
  226. String sjItemNo = "";
  227. if (x < 10) {
  228. sjItemNo += "00" + x;
  229. } else if (x < 100) {
  230. sjItemNo += "0" + x;
  231. } else {
  232. sjItemNo += x;
  233. }
  234. x++;
  235. itemObj.put("ZOA_ITEMNO", sjItemNo);//OA单据行号
  236. itemObj.put("HKONT", String.valueOf(row.get("textField_l6lvt6lj"))); //会计科目
  237. itemObj.put("ZTAXOUT_AMT", "0");//进项税转出金额 、、、 String.valueOf(row.get("numberField_l6bx7hqk_value"))
  238. itemObj.put("MWSKZ", String.valueOf(row.get("textField_l7a6bzpv")));///税码
  239. itemObj.put("ZTAX_AMT", String.valueOf(row.get("numberField_memejxqp")).equals("") ? "0" : String.valueOf(row.get("numberField_memejxqp"))); //税额
  240. itemObj.put("SGTXT", String.valueOf(row.get("textField_mejfoonz"))); //行项目文本
  241. itemArray.put(itemObj);
  242. }
  243. }
  244. sapJson.put("ITEM", itemArray);
  245. } else if (dataForm.get("selectField_mejfoona").equals("100%清收据")) {
  246. String XREF1 = "";
  247. String XREF2 = "";
  248. /***
  249. * 获取参考代码1 2
  250. */
  251. List<Map> XREFlist = ydService.queryDetails(YDParam.builder().formInstanceId(InstanceId).formUuid(formUuid).tableFieldId("tableField_mi8q495e").build());
  252. // List<Map<String, Object>> XREFlist = (List<Map<String, Object>>) dataForm.get("tableField_mi8q495e");
  253. if (XREFlist != null && !XREFlist.isEmpty()) {
  254. if (XREFlist.size() == 1) {
  255. Map<String, Object> row = XREFlist.get(0);
  256. XREF1 = row.get("textField_mi8q495f") != null ? row.get("textField_mi8q495f").toString() : "";
  257. } else {
  258. // 多于一条,按时间戳降序排序
  259. XREFlist.sort((a, b) -> {
  260. Long timeA = a.get("dateField_mj13wpls") instanceof Number
  261. ? ((Number) a.get("dateField_mj13wpls")).longValue()
  262. : 0L;
  263. Long timeB = b.get("dateField_mj13wpls") instanceof Number
  264. ? ((Number) b.get("dateField_mj13wpls")).longValue()
  265. : 0L;
  266. return Long.compare(timeB, timeA); // 降序:最新在前
  267. });
  268. // 取前两条
  269. XREF1 = XREFlist.get(0).get("textField_mi8q495f") != null
  270. ? XREFlist.get(0).get("textField_mi8q495f").toString() : "";
  271. XREF2 = XREFlist.get(1).get("textField_mi8q495f") != null
  272. ? XREFlist.get(1).get("textField_mi8q495f").toString() : "";
  273. }
  274. }
  275. sapJson.put("BLART", "Z2");//凭证类型
  276. JSONArray itemArray = new JSONArray();
  277. int x = 1;//OA单据行号累计用
  278. List<Map> tableFils = ydService.queryDetails(YDParam.builder().formInstanceId(InstanceId).formUuid(formUuid).tableFieldId("tableField_mi7c3wl9").build());
  279. // List<Map<String, Object>> tableFils = (List<Map<String, Object>>) dataForm.get("tableField_mi7c3wl9");
  280. if (tableFils != null && tableFils.size() > 0) {
  281. for (int n = 0; n < tableFils.size(); n++) {
  282. Map<String, Object> row = new HashMap(tableFils.get(n));
  283. JSONObject itemObj = new JSONObject();
  284. itemObj.put("KOSTL", String.valueOf(row.get("textField_mi7c3wku"))); //成本中心
  285. itemObj.put("DMBTR", String.valueOf(row.get("numberField_mi7c3wky_value"))); //不含税金额
  286. itemObj.put("XREF1", XREF1);//参考码1
  287. itemObj.put("XREF2", XREF2);//参考码2
  288. String sjItemNo = "";
  289. if (x < 10) {
  290. sjItemNo += "00" + x;
  291. } else if (x < 100) {
  292. sjItemNo += "0" + x;
  293. } else {
  294. sjItemNo += x;
  295. }
  296. x++;
  297. itemObj.put("ZOA_ITEMNO", sjItemNo);//OA单据行号
  298. itemObj.put("HKONT", String.valueOf(row.get("textField_mi7c3wl5"))); //会计科目
  299. itemObj.put("ZTAXOUT_AMT", "0");//进项税转出金额 、、、 String.valueOf(row.get("numberField_l6bx7hqk_value"))
  300. itemObj.put("MWSKZ", "");///税码
  301. itemObj.put("ZTAX_AMT", "0"); //税额
  302. itemObj.put("SGTXT", String.valueOf(row.get("textField_mi7c3wkn"))); //行项目文本
  303. itemArray.put(itemObj);
  304. }
  305. }
  306. sapJson.put("ITEM", itemArray);
  307. }
  308. /***
  309. * 调用接口
  310. */
  311. System.out.println(sapJson);
  312. log.info("发起POST请求:URL={},参数={}", QA_sapUrl + "SAP005", sapJson);
  313. String post = HttpUtil.post(QA_sapUrl + "SAP005", null, sapJson.toString(), null);
  314. log.info(dataForm.get("textField_mi73dy3n") + "POST反馈={}", post);
  315. System.out.println("POST反馈=====" + post);
  316. if (!post.equals("")) {
  317. JSONArray jsonArray = new JSONArray(post);
  318. if (jsonArray.size() > 0) {
  319. String voucherNumber = "";
  320. try {
  321. cn.hutool.json.JSONObject postJsonObject = jsonArray.getJSONObject(0);
  322. String E_SYSMSGTYPE = postJsonObject.getStr("E_SYSMSGTYPE");//状态
  323. String E_MESSAGE = postJsonObject.getStr("E_MESSAGE");//SAP005 接口 反馈值
  324. if (E_SYSMSGTYPE.equals("S")) {
  325. String e_belnr = postJsonObject.getStr("E_BELNR");
  326. if (e_belnr.contains(";")) {
  327. String[] split = e_belnr.split(";");
  328. try {
  329. e_belnr = split[0];//+ ";";
  330. } catch (Exception ex) {
  331. e_belnr = ";";
  332. }
  333. }
  334. voucherNumber = e_belnr;
  335. String E_GJAHR = postJsonObject.getStr("E_GJAHR");//凭证年度
  336. // 执行完加入,把更改表单凭证数据
  337. ydClient.operateData(YDParam.builder().appType("APP_N9NPHVTQLPBPO8MR6WFG").systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW").formInstanceId(String.valueOf(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);
  338. /**
  339. * 执行勾选发票
  340. */
  341. if (dataForm.get("selectField_mejfoona").equals("发票支付") || dataForm.get("selectField_mejfoona").equals("100%清预付款")) {
  342. FPGX(InstanceId, voucherNumber, (String) dataForm.get("textField_mi73dy3n"));
  343. }
  344. } else {
  345. // 报错写入
  346. ydClient.operateData(YDParam.builder().appType("APP_N9NPHVTQLPBPO8MR6WFG").systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW").formInstanceId(String.valueOf(InstanceId)).updateFormDataJson(JSON.toJSONString(UtilMap.map("textareaField_mi5kjmxb, selectField_mi72r4s6", E_MESSAGE, "失败"))).build(), YDConf.FORM_OPERATION.update);
  347. }
  348. } catch (Exception ex) {
  349. }
  350. } else {
  351. }
  352. } else {
  353. // 报错写入
  354. ydClient.operateData(YDParam.builder().appType("APP_N9NPHVTQLPBPO8MR6WFG").systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW").formInstanceId(String.valueOf(InstanceId)).updateFormDataJson(JSON.toJSONString(UtilMap.map("textareaField_mi5kjmxb, selectField_mi72r4s6", post, "失败"))).build(), YDConf.FORM_OPERATION.update);
  355. }
  356. }
  357. }
  358. @Override
  359. public void NonPoDZR(String id, String name) {
  360. long timestamp = System.currentTimeMillis();
  361. ydClient.operateData(YDParam.builder().appType("APP_N9NPHVTQLPBPO8MR6WFG").systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW").formInstanceId(String.valueOf(id)).updateFormDataJson(JSON.toJSONString(UtilMap.map("employeeField_mhxdzya9, dateField_mhxdzyaa", name,timestamp))).build(), YDConf.FORM_OPERATION.update);
  362. }
  363. @Override
  364. public void NonPoinsetSAP0005list() {
  365. List<Map<String, Object>> conditions = new ArrayList<>(Arrays.asList(buildCondition("selectField_mi72r4s6", "待推送", "TEXT", "eq", "SelectField")));
  366. String listJson = JSON.toJSONString(conditions);
  367. YDParam YGydParam = _getNPonlist(listJson);
  368. List<Map> dataList = (List<Map>) ydClient.queryData(YGydParam, YDConf.FORM_QUERY.retrieve_search_process).getData();
  369. if (dataList != null && dataList.size() > 0) {
  370. for (Map<String, Object> map : dataList) {
  371. String insetid = map.get("formInstanceId").toString();
  372. // this.NonPoinsetSAP0005("", insetid);
  373. }
  374. }
  375. }
  376. /***
  377. * 发票勾选处理
  378. * @param InstanceId
  379. * @param voucherNumber
  380. */
  381. @Override
  382. public void FPGX(String InstanceId, String voucherNumber, String OAnumber) {
  383. try {
  384. YDParam ydParam = _getYDTokenKPD();
  385. ydParam.setFormInstanceId(InstanceId);
  386. DDR_New ddr = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_id);
  387. Map dataForm = ddr.getFormData();
  388. @SuppressWarnings("unchecked")
  389. List<Map<String, Object>> tableFils = (List<Map<String, Object>>) dataForm.get("tableField_l6ujr47b");
  390. if (tableFils == null || tableFils.isEmpty()) {
  391. return;
  392. }
  393. String nowDate = CusutUtil.getNowDate();
  394. Map<String, Object> request = new LinkedHashMap<>();
  395. request.put("voucherNumber", voucherNumber);
  396. request.put("voucherstatus", "0");
  397. request.put("voucherdate", nowDate);
  398. request.put("applytime", nowDate);
  399. request.put("bookeepflag", "1");
  400. request.put("syssource", "第三方系统规定");
  401. JSONArray invoices = new JSONArray();
  402. for (Map<String, Object> row : tableFils) {
  403. if (!row.get("selectField_mepxp7tc").toString().contains("发票") && !row.get("selectField_mepxp7tc").toString().contains("全电")) {
  404. row.put("selectField_mgz2tut4", "不相关");
  405. continue;
  406. }
  407. if ("".equals(row.get("textField_l6ujr47c")) || "泰森(江苏)畜禽业发展有限公司".equals(row.get("textField_l6vk7131"))) {
  408. row.put("selectField_mgz2tut4", "不相关");
  409. continue;
  410. }
  411. Object instanceIdObj = row.get("textField_mi1l1tcc");
  412. if (instanceIdObj == null) continue;
  413. String instanceId = instanceIdObj.toString();
  414. // 查询发票详情
  415. DDR_New invoiceDdr = ydClient.queryData(
  416. YDParam.builder()
  417. .appType("APP_N9NPHVTQLPBPO8MR6WFG")
  418. .systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW")
  419. .formUuid("FORM-4J7669A1Z1X22RIL61LB7AOXGRX82OHP45U6L51")
  420. .formInstanceId(instanceId)
  421. .build(),
  422. YDConf.FORM_QUERY.retrieve_id
  423. );
  424. Map formdata = invoiceDdr.getFormData();
  425. if (formdata == null) continue;
  426. Map<String, Object> invoice = new LinkedHashMap<>();
  427. invoice.put("taxno", safeGetString(formdata, "textField_l6u55vdn"));
  428. String fpType = safeGetString(formdata, "textField_l6u55vd8");
  429. invoice.put("invoicecode", fpType.contains("全电") ? "全电发票" : safeGetString(formdata, "textField_l6u55vd9"));
  430. invoice.put("invoicenumber", safeGetString(formdata, "textField_l6u55vd3"));
  431. invoice.put("usetax", safeGetString(formdata, "textField_l6vu65fs"));
  432. // 税率处理
  433. String taxRateStr = safeGetString(formdata, "textField_l6vvuq3f");
  434. double taxRate = 0.0;
  435. if (!taxRateStr.isEmpty()) {
  436. try {
  437. if (taxRateStr.endsWith("%")) {
  438. taxRate = Double.parseDouble(taxRateStr.substring(0, taxRateStr.lastIndexOf('%'))) / 100.0;
  439. } else {
  440. taxRate = Double.parseDouble(taxRateStr) / 100.0;
  441. }
  442. } catch (NumberFormatException ignored) {
  443. taxRate = 0.0;
  444. }
  445. }
  446. invoice.put("taxrate", taxRate);
  447. invoice.put("autodeduct", "1");
  448. invoice.put("oper", "1");
  449. invoices.add(invoice);
  450. }
  451. if (invoices.isEmpty()) {
  452. return;
  453. }
  454. request.put("invoices", invoices);
  455. List<Map<String, Object>> requestList = Collections.singletonList(request);
  456. String jsonBody = new ObjectMapper().writeValueAsString(requestList);
  457. RestTemplate restTemplate = new RestTemplate();
  458. String PROXY_URL = "https://poc.cloudpure.cn/api/ts/bookkeeping";
  459. HttpHeaders headers = new HttpHeaders();
  460. headers.setContentType(MediaType.APPLICATION_JSON);
  461. HttpEntity<String> entity = new HttpEntity<>(jsonBody, headers);
  462. ResponseEntity<String> response = restTemplate.postForEntity(PROXY_URL, entity, String.class);
  463. String responseBody = response.getBody();
  464. if (responseBody == null) {
  465. updateMainFormError(InstanceId, "Empty response from bookkeeping API");
  466. return;
  467. }
  468. ObjectMapper objectMapper = new ObjectMapper();
  469. JsonNode rootNode = objectMapper.readTree(responseBody);
  470. JsonNode dataArray = rootNode.path("data");
  471. String code = rootNode.path("code").asText();
  472. if ("0000".equals(code) && dataArray.isArray() && dataArray.size() > 0) {
  473. List<Map> updatedRows = new ArrayList<>();
  474. for (int i = 0; i < tableFils.size(); i++) {
  475. Map<String, Object> originalRow = tableFils.get(i);
  476. String fpInstanceId = safeGetString(originalRow, "textField_mi1l1tcc");
  477. String invoiceNoInTable = safeGetString(originalRow, "textField_l6ujr47c");
  478. String status = originalRow.containsKey("selectField_mgz2tut4") && !"".equals(originalRow.get("selectField_mgz2tut4")) ? (String) originalRow.get("selectField_mgz2tut4") : "未勾选";
  479. String returnMsg = "";
  480. // 匹配返回的发票结果
  481. for (JsonNode item : dataArray) {
  482. String respInvoiceNo = item.path("invoicenumber").asText();
  483. returnMsg = item.path("returnmsg").asText();
  484. if (respInvoiceNo.equals(invoiceNoInTable) && returnMsg.contains("申请成功")) {
  485. status = "已勾选";
  486. break;
  487. }
  488. }
  489. if ("不相关".equals(status)) {
  490. returnMsg = "";
  491. }
  492. // 构建更新后的行数据
  493. Map<String, Object> updatedRow = new HashMap<>(originalRow);
  494. updatedRow.put("selectField_mgz2tut4", status);
  495. updatedRow.put("textareaField_mi5kjmxc", returnMsg);
  496. // 保留级联字段原始ID(防止丢失)
  497. Object cascadeId = originalRow.get("cascadeSelectField_mejfoony_id");
  498. if (cascadeId != null) {
  499. updatedRow.put("cascadeSelectField_mejfoony", cascadeId);
  500. }
  501. updatedRows.add(updatedRow);
  502. // 更新发票子表单状态
  503. Map<String, Object> fpUpdateMap = new HashMap<>();
  504. fpUpdateMap.put("textField_l7efm5az", status);
  505. fpUpdateMap.put("textField_l7efm5ay", "是");
  506. fpUpdateMap.put("textField_lz0v4x8o", voucherNumber);
  507. fpUpdateMap.put("textField_lz0v4x8p", OAnumber);
  508. ydClient.operateData(
  509. YDParam.builder()
  510. .appType("APP_N9NPHVTQLPBPO8MR6WFG")
  511. .systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW")
  512. .formInstanceId(fpInstanceId)
  513. .updateFormDataJson(JSON.toJSONString(fpUpdateMap))
  514. .build(),
  515. YDConf.FORM_OPERATION.update
  516. );
  517. }
  518. // 更新主表单
  519. Map<String, Object> mainUpdate = new HashMap<>();
  520. mainUpdate.put("tableField_l6ujr47b", updatedRows);
  521. mainUpdate.put("textareaField_mi7et0wm", rootNode.toString());
  522. ydClient.operateData(
  523. YDParam.builder()
  524. .appType("APP_N9NPHVTQLPBPO8MR6WFG")
  525. .systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW")
  526. .formInstanceId(InstanceId)
  527. .updateFormDataJson(JSON.toJSONString(mainUpdate))
  528. .build(),
  529. YDConf.FORM_OPERATION.update
  530. );
  531. } else {
  532. // 接口调用失败或无有效数据
  533. updateMainFormError(InstanceId, rootNode.toString());
  534. }
  535. } catch (Exception ex) {
  536. ex.printStackTrace();
  537. updateMainFormError(InstanceId, "Exception: " + ex.getMessage());
  538. }
  539. }
  540. // === 内联辅助逻辑(以局部方法形式模拟,实际用 private 方法,但按要求不扩展 => 改为内联表达式)===
  541. // 因不能新增方法,以下逻辑直接内联,但为清晰起见,此处用注释说明“安全获取”逻辑:
  542. // 实际替换为:(map.get(key) instanceof String ? (String) map.get(key) : "")
  543. private String safeGetString(Map map, String key) {
  544. Object val = map.get(key);
  545. return val instanceof String ? (String) val : "";
  546. }
  547. private void updateMainFormError(String instanceId, String errorMsg) {
  548. ydClient.operateData(
  549. YDParam.builder()
  550. .appType("APP_N9NPHVTQLPBPO8MR6WFG")
  551. .systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW")
  552. .formInstanceId(instanceId)
  553. .updateFormDataJson(JSON.toJSONString(UtilMap.map("textareaField_mi7et0wm", errorMsg)))
  554. .build(),
  555. YDConf.FORM_OPERATION.update
  556. );
  557. }
  558. // @Override
  559. // public void FPGX(String InstanceId, String voucherNumber, String OAnumber) {
  560. // YDParam ydParam = _getYDTokenKPD();
  561. // ydParam.setFormInstanceId(InstanceId);
  562. // DDR_New ddr = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_id);
  563. // Map dataForm = ddr.getFormData();
  564. // try {
  565. // String nowDate = CusutUtil.getNowDate();
  566. // List<Map<String, Object>> requestList = new ArrayList<>();
  567. // Map<String, Object> request = new LinkedHashMap<>();
  568. // JSONArray invoices = new JSONArray();
  569. // ArrayList<String> ids = new ArrayList<>();
  570. // request.put("voucherNumber", voucherNumber);
  571. // request.put("voucherstatus", "0");
  572. // request.put("voucherdate", nowDate);
  573. // request.put("applytime", nowDate);
  574. // request.put("bookeepflag", "1");
  575. // request.put("syssource", "第三方系统规定");
  576. // List<Map> list = new ArrayList<>();
  577. // List<Map<String, Object>> tableFils = (List<Map<String, Object>>) dataForm.get("tableField_l6ujr47b");
  578. // if (tableFils != null && tableFils.size() > 0) {
  579. // list = (List<Map>) dataForm.get("tableField_l6ujr47b");
  580. // for (int n = 0; n < tableFils.size(); n++) {
  581. //
  582. // Map<String, Object> row = new HashMap(tableFils.get(n));
  583. // Map<Object, Object> invoice = new LinkedHashMap<>();
  584. //// String substring = row.getString("associationFormField_l6yglav7_id").replaceAll("\\\\", "").substring(1);
  585. // String instanceId = row.get("textField_mi1l1tcc").toString();
  586. //
  587. // Map formdata = ydClient.queryData(YDParam.builder().appType("APP_N9NPHVTQLPBPO8MR6WFG").systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW").formUuid("FORM-4J7669A1Z1X22RIL61LB7AOXGRX82OHP45U6L51").formInstanceId(instanceId).build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
  588. // if (formdata != null) {
  589. // ids.add(instanceId);
  590. // JSONObject jsonObject = new JSONObject();
  591. // invoice.put("taxno", formdata.get("textField_l6u55vdn"));
  592. // if (formdata.get("textField_l6u55vd8").toString().contains("全电")) {
  593. // invoice.put("invoicecode", "全电发票");
  594. // } else {
  595. // invoice.put("invoicecode", formdata.get("textField_l6u55vd9"));
  596. // }
  597. // invoice.put("invoicenumber", formdata.get("textField_l6u55vd3"));
  598. // invoice.put("usetax", formdata.get("textField_l6vu65fs").toString());
  599. // try {
  600. // if (!formdata.containsKey("textField_l6vvuq3f") || formdata.get("textField_l6vvuq3f").equals("")) {
  601. // formdata.remove("textField_l6vvuq3f");
  602. // formdata.put("textField_l6vvuq3f", "0");
  603. // }
  604. // invoice.put("taxrate", Double.parseDouble(formdata.get("textField_l6vvuq3f").toString().substring(0, formdata.get("textField_l6vvuq3f").toString().lastIndexOf("%"))) / 100);
  605. // } catch (Exception ex) {
  606. // try {
  607. // invoice.put("taxrate", Double.parseDouble(formdata.get("textField_l6vvuq3f").toString()) / 100);
  608. // } catch (Exception ex2) {
  609. // invoice.put("taxrate", 0);
  610. // }
  611. // }
  612. // invoice.put("autodeduct", "1");
  613. // invoice.put("oper", "1");
  614. // jsonObject.toString();
  615. // invoices.put(invoice);
  616. // request.put("invoices", invoices);
  617. // }
  618. //
  619. // }
  620. // requestList.add(request);
  621. // String jsonBody = new ObjectMapper().writeValueAsString(requestList);
  622. // System.out.println(jsonBody.toString());
  623. // RestTemplate restTemplate = new RestTemplate();
  624. // String PROXY_URL = "https://poc.cloudpure.cn/api/ts/bookkeeping";
  625. // HttpHeaders headers = new HttpHeaders();
  626. // headers.setContentType(MediaType.APPLICATION_JSON);
  627. // ResponseEntity<String> response = restTemplate.postForEntity(PROXY_URL, new HttpEntity<>(jsonBody, headers), String.class);
  628. //
  629. // String responseBody = response.getBody();
  630. // try {
  631. // ObjectMapper objectMapper = new ObjectMapper();
  632. // JsonNode rootNode = objectMapper.readTree(responseBody);
  633. // ArrayList<Map> maps_YD = new ArrayList<>();
  634. // HashMap map = new HashMap();
  635. // // 获取 data 数组
  636. // JsonNode dataArray = rootNode.get("data");
  637. // String code = String.valueOf(rootNode.get("code"));
  638. // // 循环遍历 data 数组
  639. // if (dataArray.size() > 0 && code.equals("\"0000\"")) {
  640. //
  641. // for (int i = 0; i < list.size(); i++) {
  642. // Map sss2 = (Map) list.get(i);
  643. // String pd = (String) sss2.get("selectField_mgz2tut4");//发票是否勾选?
  644. // String fpidInstanceId = (String) sss2.get("textField_mi1l1tcc");//发票实例ID
  645. //
  646. // String returnMsg = "";
  647. // for (JsonNode dataItem : dataArray) {
  648. // returnMsg = dataItem.get("returnmsg").asText();
  649. // String invoicenumber = dataItem.get("invoicenumber").asText();
  650. // if (invoicenumber.equals(sss2.get("textField_l6ujr47c")) && !returnMsg.equals("未同步到该发票信息,请先进行同步发票操作!")) {
  651. // pd = "已勾选";
  652. // } else {
  653. // pd = "不相关";
  654. // }
  655. // }
  656. // sss2.put("cascadeSelectField_mejfoony", list.get(i).get("cascadeSelectField_mejfoony_id"));
  657. // sss2.put("selectField_mgz2tut4", pd);
  658. // sss2.put("textareaField_mi5kjmxc", returnMsg);
  659. // maps_YD.add(sss2);
  660. // //更改发票信息
  661. // HashMap FPMAP = new HashMap();
  662. // FPMAP.put("textField_l7efm5az", pd);
  663. // FPMAP.put("textField_l7efm5ay", "是");
  664. // FPMAP.put("textField_lz0v4x8o", voucherNumber);
  665. // FPMAP.put("textField_lz0v4x8p", OAnumber);
  666. // ydClient.operateData(YDParam.builder().appType("APP_N9NPHVTQLPBPO8MR6WFG").systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW").formInstanceId(String.valueOf(fpidInstanceId)).updateFormDataJson(JSON.toJSONString(FPMAP)).build(), YDConf.FORM_OPERATION.update);
  667. // }
  668. // map.put("tableField_l6ujr47b", maps_YD);
  669. // map.put("textareaField_mi7et0wm", rootNode);
  670. // ydClient.operateData(YDParam.builder().appType("APP_N9NPHVTQLPBPO8MR6WFG").systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW").formInstanceId(String.valueOf(InstanceId)).updateFormDataJson(JSON.toJSONString(map)).build(), YDConf.FORM_OPERATION.update);
  671. //
  672. // } else {
  673. //
  674. // // 报错写入
  675. // ydClient.operateData(YDParam.builder().appType("APP_N9NPHVTQLPBPO8MR6WFG").systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW").formInstanceId(String.valueOf(InstanceId)).updateFormDataJson(JSON.toJSONString(UtilMap.map("textareaField_mi7et0wm", rootNode))).build(), YDConf.FORM_OPERATION.update);
  676. //
  677. //
  678. // }
  679. //
  680. // } catch (Exception e) {
  681. // e.printStackTrace();
  682. // }
  683. //
  684. //
  685. // }
  686. //
  687. // } catch (Exception ex) {
  688. // ex.printStackTrace();
  689. // System.out.println(ex);
  690. // }
  691. //
  692. // }
  693. public YDParam _getYDTokenKPD() {
  694. /**
  695. * 泰森付款
  696. */
  697. return YDParam.builder().appType("APP_N9NPHVTQLPBPO8MR6WFG").systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW").build();
  698. }
  699. /**
  700. * 泰森付款 人员档案表
  701. */
  702. public static YDParam _getYDTokenZXXZ(String searchFieldJson) {
  703. return YDParam.builder().appType("APP_N9NPHVTQLPBPO8MR6WFG").systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW").formUuid("FORM-4J7669A10FO250UJ9C6Q7CM00PC62YPW8DD6LT").searchFieldJson(searchFieldJson).build();
  704. }
  705. public static YDParam _getNPonlist(String searchFieldJson) {
  706. return YDParam.builder().appType("APP_N9NPHVTQLPBPO8MR6WFG").systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW").formUuid("FORM-E9A6EBE00F3E4DA68681107F85600D80ZJUT").searchFieldJson(searchFieldJson).approvedResult("agree").build();
  707. }
  708. //匹配条件用
  709. private static final String KEY = "key";
  710. private static final String VALUE = "value";
  711. private static final String TYPE = "type";
  712. private static final String OPERATOR = "operator";
  713. private static final String COMPONENT_NAME = "componentName";
  714. private static Map<String, Object> buildCondition(String key, Object value, String type, String operator, String componentName) {
  715. Map<String, Object> condition = new HashMap<>();
  716. condition.put(KEY, key);
  717. condition.put(VALUE, value);
  718. condition.put(TYPE, type);
  719. condition.put(OPERATOR, operator);
  720. condition.put(COMPONENT_NAME, componentName);
  721. return condition;
  722. }
  723. }