package com.malk.taisen.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.malk.server.common.McException; import com.malk.taisen.util.CusutUtil; import com.malk.taisen.util.HttpUtil; import cn.hutool.json.JSONArray; import com.malk.server.aliwork.YDConf; import com.malk.server.aliwork.YDParam; import com.malk.server.dingtalk.DDR_New; import com.malk.service.aliwork.YDClient; import com.malk.service.aliwork.YDService; import com.malk.service.dingtalk.DDClient; import com.malk.taisen.service.NonPoServer; import com.malk.utils.UtilMap; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; @Slf4j @Service public class NonPoServerImpl implements NonPoServer { @Autowired private YDClient ydClient; @Autowired private YDService ydService; @Autowired private DDClient ddClient; /** * 测试地址 */ // 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="; //private String formUuid = "FORM-E9A6EBE00F3E4DA68681107F85600D80ZJUT"; /** * 正式地址 * @param type * @param InstanceId * @param formUuid */ // private String QA_sapUrl = "https://etl-prod-tasks.tysondt.com:443/api/1/rest/feed/run/task/TysonProd/Ultraprojects/team-fssc/tk_oa_to_sap_p2p?bearer_token=bBiGTA7PS0JJ6wKhQU8Vm0vLsIDNjLaN&interface_id="; @Value(value = "${sap.QA_sapUrl_Poc}") private String QA_sapUrl; // @Override public void NonPoinsetSAP0005(String type, String InstanceId, String formUuid) { YDParam ydParam = _getYDTokenKPD(); ydParam.setFormInstanceId(InstanceId); DDR_New ddr = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_id); Map dataForm = ddr.getFormData(); // dataForm.put("InstanceId", InstanceId); JSONObject sapJson = new JSONObject(); JSONObject upJson = new JSONObject(); String PD = (String) dataForm.get("selectField_mj1cq2oz");//是否生成SAP凭证 String SAPID = (String) dataForm.get("textField_mejezfwk");//SAP凭证号码 String SFXCFK = (String) dataForm.get("radioField_mj1gc7qe");//仅携程付款是否 /** * 是否需要生成SAP凭证 */ if (("否".equals(PD) && !SAPID.equals("")) || "是".equals(SFXCFK)) { FPGX(InstanceId, SAPID, (String) dataForm.get("textField_mi73dy3n")); } else if (!"否".equals(PD)) { // 添加顶级键值对 sapJson.put("ZDUEDATE", CusutUtil.getFormatDate((Long) dataForm.get("dateField_mejfoonv"))); //Due date / 到期日 sapJson.put("BKTXT", dataForm.get("textareaField_mejfoonw"));//备注 抬头文本 sapJson.put("ZOA_NUMBER", dataForm.get("textField_mi73dy3n")); //钉钉单据号dataForm.get("textField_mi73dy3n") if (dataForm.get("selectField_mejfoona").equals("收据支付")) {//☑ 票据支付时 代码ZINVOICE_AMT 默认ZPAY_AMT的值 sapJson.put("ZINVOICE_AMT", dataForm.get("numberField_mejfoool_value").equals("") ? "0" : dataForm.get("numberField_mejfoool_value"));//支付金额 } else { sapJson.put("ZINVOICE_AMT", dataForm.get("numberField_mejfoook_value").equals("") ? "0" : dataForm.get("numberField_mejfoook_value"));//发票总额 } sapJson.put("BANKA", dataForm.get("textField_mejfoon9")); //开户行 sapJson.put("BLDAT", CusutUtil.getFormatDate((Long) dataForm.get("dateField_l9nsavm3"))); //凭证日期ƒ Date / 申请日期 String uid = "TEST-CN001"; String uname = ""; if (!dataForm.get("employeeField_mhxdzya9_id").equals("")) { List> conditions = new ArrayList<>(Arrays.asList(buildCondition("textField_l6dddg5k", dataForm.get("employeeField_mhxdzya9_id"), "TEXT", "eq", "TextField"))); String listJson = JSON.toJSONString(conditions); YDParam YGydParam = _getYDTokenZXXZ(listJson); List dataList = (List) ydClient.queryData(YGydParam, YDConf.FORM_QUERY.retrieve_search_form).getData(); if (dataList != null && dataList.size() > 0) { Map map = dataList.get(0); Map formData = (Map) map.get("formData"); uid = formData.get("textField_l6djch1m").toString(); uid = "CHN-0" + uid; } } // uid = "CHN-01000332";//测试过账人 sapJson.put("USNAM", uid); //过账人 sapJson.put("BUDAT", CusutUtil.getFormatDate((Long) dataForm.get("dateField_mhxdzyaa"))); //过账日期 sapJson.put("ZOA_TYPE", dataForm.get("selectField_mejfoona").equals("无票预付") || dataForm.get("selectField_mejfoona").equals("100%清预付款") || dataForm.get("selectField_mejfoona").equals("100%清收据") ? "AD" : "NP");//OA单据类型 sapJson.put("ZPAY_AMT", dataForm.get("numberField_mejfoool_value").equals("") ? "0" : dataForm.get("numberField_mejfoool_value")); //支付金额 sapJson.put("BUKRS", dataForm.get("textField_mejfj9iw"));//公司代码 sapJson.put("BANKN", dataForm.get("textField_mejfoon8")); //银行账号 sapJson.put("WAERS", dataForm.get("selectField_mejfoong")); //币种 sapJson.put("KOINH", dataForm.get("textField_mejezfwl")); //收款方名称 sapJson.put("LIFNR", dataForm.get("textField_mejezfwv"));//供应商代码 sapJson.put("interface_id", "SAP005"); //获取子表 if (dataForm.get("selectField_mejfoona").equals("发票支付")) { sapJson.put("BLART", "Z2");//凭证类型 JSONArray itemArray = new JSONArray(); int x = 1;//OA单据行号累计用 List tableFils = ydService.queryDetails(YDParam.builder().formInstanceId(InstanceId).formUuid(formUuid).tableFieldId("tableField_l6ujr47b").build()); // List> tableFils = (List>) dataForm.get("tableField_l6ujr47b"); if (tableFils != null && tableFils.size() > 0) { for (int n = 0; n < tableFils.size(); n++) { Map row = new HashMap(tableFils.get(n)); JSONObject itemObj = new JSONObject(); itemObj.put("KOSTL", String.valueOf(row.get("textField_mi5kjmwk"))); //成本中心 itemObj.put("DMBTR", String.valueOf(row.get("numberField_l6ujr47g_value"))); //不含税金额 itemObj.put("XREF1", "");//参考码 9000242 String sjItemNo = ""; if (x < 10) { sjItemNo += "00" + x; } else if (x < 100) { sjItemNo += "0" + x; } else { sjItemNo += x; } x++; itemObj.put("ZOA_ITEMNO", sjItemNo);//OA单据行号 itemObj.put("HKONT", String.valueOf(row.get("textField_l6lvt6lj"))); //会计科目 itemObj.put("ZTAXOUT_AMT", "0");//进项税转出金额 、、、 String.valueOf(row.get("numberField_l6bx7hqk_value")) itemObj.put("MWSKZ", String.valueOf(row.get("textField_l7a6bzpv")));///税码 itemObj.put("ZTAX_AMT", String.valueOf(row.get("numberField_memejxqp")).equals("") ? "0" : String.valueOf(row.get("numberField_memejxqp"))); //税额 itemObj.put("SGTXT", String.valueOf(row.get("textField_mejfoonz"))); //行项目文本 itemArray.put(itemObj); } } sapJson.put("ITEM", itemArray); } else if (dataForm.get("selectField_mejfoona").equals("无票预付")) { sapJson.put("BLART", "Z4");//凭证类型 sapJson.put("UMSKZ", "A");//特别总账标识 JSONArray SapItem = new JSONArray(); //子表 JSONObject itemObject = new JSONObject(); itemObject.put("ZOA_ITEMNO", "001"); //OA单据行号 itemObject.put("HKONT", ""); //会计科目 itemObject.put("KOSTL", ""); //成本中心 BigDecimal bigBhsje = new BigDecimal(dataForm.get("numberField_mejfoool_value").toString());//改大数 bigBhsje = bigBhsje.setScale(2, RoundingMode.HALF_UP); itemObject.put("DMBTR", bigBhsje); //不含税金额 // itemObject.put("DMBTR", object.get("numberField_l6bwb4hg").toString()); //不含税金额--支付金额 itemObject.put("MWSKZ", ""); //税码 itemObject.put("ZTAX_AMT", "0"); //税额 itemObject.put("ZTAXOUT_AMT", "0"); //进项税转出金额 itemObject.put("SGTXT", ""); //行项目文本 itemObject.put("XREF1", dataForm.get("textareaField_mejfoonw")); //cir项目号 SapItem.put(itemObject); sapJson.put("ITEM", SapItem); } else if (dataForm.get("selectField_mejfoona").equals("收据支付")) { sapJson.put("BLART", "Z2");//凭证类型 JSONArray itemArray = new JSONArray(); int x = 1;//OA单据行号累计用 List tableFils = ydService.queryDetails(YDParam.builder().formInstanceId(InstanceId).formUuid(formUuid).tableFieldId("tableField_mi7c3wl9").build()); //List> tableFils = (List>) dataForm.get("tableField_mi7c3wl9"); if (tableFils != null && tableFils.size() > 0) { for (int n = 0; n < tableFils.size(); n++) { Map row = new HashMap(tableFils.get(n)); JSONObject itemObj = new JSONObject(); itemObj.put("KOSTL", String.valueOf(row.get("textField_mi7c3wku"))); //成本中心 itemObj.put("DMBTR", String.valueOf(row.get("numberField_mi7c3wky_value"))); //不含税金额 itemObj.put("XREF1", "");//参考码 9000242 String sjItemNo = ""; if (x < 10) { sjItemNo += "00" + x; } else if (x < 100) { sjItemNo += "0" + x; } else { sjItemNo += x; } x++; itemObj.put("ZOA_ITEMNO", sjItemNo);//OA单据行号 itemObj.put("HKONT", String.valueOf(row.get("textField_mi7c3wl5"))); //会计科目 itemObj.put("ZTAXOUT_AMT", "0");//进项税转出金额 、、、 String.valueOf(row.get("numberField_l6bx7hqk_value")) itemObj.put("MWSKZ", "");///税码 itemObj.put("ZTAX_AMT", "0"); //税额 itemObj.put("SGTXT", String.valueOf(row.get("textField_mi7c3wkn"))); //行项目文本 itemArray.put(itemObj); } } sapJson.put("ITEM", itemArray); } else if (dataForm.get("selectField_mejfoona").equals("100%清预付款")) { String XREF1 = ""; String XREF2 = ""; /*** * 获取参考代码1 2 */ List XREFlist = ydService.queryDetails(YDParam.builder().formInstanceId(InstanceId).formUuid(formUuid).tableFieldId("tableField_mi8q495e").build()); // List> XREFlist = (List>) dataForm.get("tableField_mi8q495e"); if (XREFlist != null && !XREFlist.isEmpty()) { if (XREFlist.size() == 1) { Map row = XREFlist.get(0); XREF1 = row.get("textField_mi8q495f") != null ? row.get("textField_mi8q495f").toString() : ""; } else { // 多于一条,按时间戳降序排序 XREFlist.sort((a, b) -> { Long timeA = a.get("dateField_mj13wpls") instanceof Number ? ((Number) a.get("dateField_mj13wpls")).longValue() : 0L; Long timeB = b.get("dateField_mj13wpls") instanceof Number ? ((Number) b.get("dateField_mj13wpls")).longValue() : 0L; return Long.compare(timeB, timeA); // 降序:最新在前 }); // 取前两条 XREF1 = XREFlist.get(0).get("textField_mi8q495f") != null ? XREFlist.get(0).get("textField_mi8q495f").toString() : ""; XREF2 = XREFlist.get(1).get("textField_mi8q495f") != null ? XREFlist.get(1).get("textField_mi8q495f").toString() : ""; } } sapJson.put("BLART", "Z2");//凭证类型 JSONArray itemArray = new JSONArray(); int x = 1;//OA单据行号累计用 List tableFils = ydService.queryDetails(YDParam.builder().formInstanceId(InstanceId).formUuid(formUuid).tableFieldId("tableField_l6ujr47b").build()); // List> tableFils = (List>) dataForm.get("tableField_l6ujr47b"); if (tableFils != null && tableFils.size() > 0) { for (int n = 0; n < tableFils.size(); n++) { Map row = new HashMap(tableFils.get(n)); JSONObject itemObj = new JSONObject(); itemObj.put("KOSTL", String.valueOf(row.get("textField_mi5kjmwk"))); //成本中心 itemObj.put("DMBTR", String.valueOf(row.get("numberField_l6ujr47g_value"))); //不含税金额 itemObj.put("XREF1", XREF1);//参考码1 itemObj.put("XREF2", XREF2);//参考码2 String sjItemNo = ""; if (x < 10) { sjItemNo += "00" + x; } else if (x < 100) { sjItemNo += "0" + x; } else { sjItemNo += x; } x++; itemObj.put("ZOA_ITEMNO", sjItemNo);//OA单据行号 itemObj.put("HKONT", String.valueOf(row.get("textField_l6lvt6lj"))); //会计科目 itemObj.put("ZTAXOUT_AMT", "0");//进项税转出金额 、、、 String.valueOf(row.get("numberField_l6bx7hqk_value")) itemObj.put("MWSKZ", String.valueOf(row.get("textField_l7a6bzpv")));///税码 itemObj.put("ZTAX_AMT", String.valueOf(row.get("numberField_memejxqp")).equals("") ? "0" : String.valueOf(row.get("numberField_memejxqp"))); //税额 itemObj.put("SGTXT", String.valueOf(row.get("textField_mejfoonz"))); //行项目文本 itemArray.put(itemObj); } } sapJson.put("ITEM", itemArray); } else if (dataForm.get("selectField_mejfoona").equals("100%清收据")) { String XREF1 = ""; String XREF2 = ""; /*** * 获取参考代码1 2 */ List XREFlist = ydService.queryDetails(YDParam.builder().formInstanceId(InstanceId).formUuid(formUuid).tableFieldId("tableField_mi8q495e").build()); // List> XREFlist = (List>) dataForm.get("tableField_mi8q495e"); if (XREFlist != null && !XREFlist.isEmpty()) { if (XREFlist.size() == 1) { Map row = XREFlist.get(0); XREF1 = row.get("textField_mi8q495f") != null ? row.get("textField_mi8q495f").toString() : ""; } else { // 多于一条,按时间戳降序排序 XREFlist.sort((a, b) -> { Long timeA = a.get("dateField_mj13wpls") instanceof Number ? ((Number) a.get("dateField_mj13wpls")).longValue() : 0L; Long timeB = b.get("dateField_mj13wpls") instanceof Number ? ((Number) b.get("dateField_mj13wpls")).longValue() : 0L; return Long.compare(timeB, timeA); // 降序:最新在前 }); // 取前两条 XREF1 = XREFlist.get(0).get("textField_mi8q495f") != null ? XREFlist.get(0).get("textField_mi8q495f").toString() : ""; XREF2 = XREFlist.get(1).get("textField_mi8q495f") != null ? XREFlist.get(1).get("textField_mi8q495f").toString() : ""; } } sapJson.put("BLART", "Z2");//凭证类型 JSONArray itemArray = new JSONArray(); int x = 1;//OA单据行号累计用 List tableFils = ydService.queryDetails(YDParam.builder().formInstanceId(InstanceId).formUuid(formUuid).tableFieldId("tableField_mi7c3wl9").build()); // List> tableFils = (List>) dataForm.get("tableField_mi7c3wl9"); if (tableFils != null && tableFils.size() > 0) { for (int n = 0; n < tableFils.size(); n++) { Map row = new HashMap(tableFils.get(n)); JSONObject itemObj = new JSONObject(); itemObj.put("KOSTL", String.valueOf(row.get("textField_mi7c3wku"))); //成本中心 itemObj.put("DMBTR", String.valueOf(row.get("numberField_mi7c3wky_value"))); //不含税金额 itemObj.put("XREF1", XREF1);//参考码1 itemObj.put("XREF2", XREF2);//参考码2 String sjItemNo = ""; if (x < 10) { sjItemNo += "00" + x; } else if (x < 100) { sjItemNo += "0" + x; } else { sjItemNo += x; } x++; itemObj.put("ZOA_ITEMNO", sjItemNo);//OA单据行号 itemObj.put("HKONT", String.valueOf(row.get("textField_mi7c3wl5"))); //会计科目 itemObj.put("ZTAXOUT_AMT", "0");//进项税转出金额 、、、 String.valueOf(row.get("numberField_l6bx7hqk_value")) itemObj.put("MWSKZ", "");///税码 itemObj.put("ZTAX_AMT", "0"); //税额 itemObj.put("SGTXT", String.valueOf(row.get("textField_mi7c3wkn"))); //行项目文本 itemArray.put(itemObj); } } sapJson.put("ITEM", itemArray); } /*** * 调用接口 */ System.out.println(sapJson); log.info("发起POST请求:URL={},参数={}", QA_sapUrl + "SAP005", sapJson); String post = HttpUtil.post(QA_sapUrl + "SAP005", null, sapJson.toString(), null); log.info(dataForm.get("textField_mi73dy3n") + "POST反馈={}", post); System.out.println("POST反馈=====" + post); if (!post.equals("")) { JSONArray jsonArray = new JSONArray(post); if (jsonArray.size() > 0) { String voucherNumber = ""; try { cn.hutool.json.JSONObject postJsonObject = jsonArray.getJSONObject(0); String E_SYSMSGTYPE = postJsonObject.getStr("E_SYSMSGTYPE");//状态 String E_MESSAGE = postJsonObject.getStr("E_MESSAGE");//SAP005 接口 反馈值 // prd 重复推送标记成功 if (E_SYSMSGTYPE.equals("S") || "post operation had already been done, repeat is not allowed".equals(E_MESSAGE)) { String e_belnr = postJsonObject.getStr("E_BELNR"); if (e_belnr.contains(";")) { String[] split = e_belnr.split(";"); try { e_belnr = split[0];//+ ";"; } catch (Exception ex) { e_belnr = ";"; } } voucherNumber = e_belnr; String E_GJAHR = postJsonObject.getStr("E_GJAHR");//凭证年度 // 执行完加入,把更改表单凭证数据 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); /** * 执行勾选发票 */ if (dataForm.get("selectField_mejfoona").equals("发票支付") || dataForm.get("selectField_mejfoona").equals("100%清预付款")) { FPGX(InstanceId, voucherNumber, (String) dataForm.get("textField_mi73dy3n")); } } else { // 报错写入 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); } } catch (Exception ex) { } } else { } } else { // 报错写入 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); } } /** * 冲销 */ String SFCX = (String) dataForm.get("selectField_mkxd6l4o");//是否冲销 String CXTSZT = (String) dataForm.get("selectField_mkxmqncp");//冲销推送状态 if (SFCX.equals("是") && !CXTSZT.equals("已完成")) { log.info("泰森宜搭:Non-Po冲销, {}", InstanceId); System.out.println("泰森宜搭: Non-Po冲销::" + InstanceId); this.NPOCX(InstanceId, formUuid); System.out.println("泰森宜搭:Non-Po冲销 结束"); log.info("泰森宜搭:Non-Po冲销 结束"); } } @Override public void NonPoDZR(String id, String name) { long timestamp = System.currentTimeMillis(); 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); } @Override public void NonPoinsetSAP0005list() { List> conditions = new ArrayList<>(Arrays.asList(buildCondition("selectField_mi72r4s6", "待推送", "TEXT", "eq", "SelectField"))); String listJson = JSON.toJSONString(conditions); YDParam YGydParam = _getNPonlist(listJson); List dataList = (List) ydClient.queryData(YGydParam, YDConf.FORM_QUERY.retrieve_search_process).getData(); if (dataList != null && dataList.size() > 0) { for (Map map : dataList) { String insetid = map.get("formInstanceId").toString(); // this.NonPoinsetSAP0005("", insetid); } } } /*** * 发票勾选处理 * @param InstanceId * @param voucherNumber */ @Override public void FPGX(String InstanceId, String voucherNumber, String OAnumber) { try { YDParam ydParam = _getYDTokenKPD(); ydParam.setFormInstanceId(InstanceId); DDR_New ddr = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_id); Map dataForm = ddr.getFormData(); @SuppressWarnings("unchecked") List> tableFils = (List>) dataForm.get("tableField_l6ujr47b"); if (tableFils == null || tableFils.isEmpty()) { return; } String nowDate = CusutUtil.getNowDate(); Map request = new LinkedHashMap<>(); request.put("voucherNumber", voucherNumber); request.put("voucherstatus", "0"); request.put("voucherdate", nowDate); request.put("applytime", nowDate); request.put("bookeepflag", "1"); request.put("syssource", "第三方系统规定"); JSONArray invoices = new JSONArray(); for (Map row : tableFils) { if (!row.get("selectField_mepxp7tc").toString().contains("发票") && !row.get("selectField_mepxp7tc").toString().contains("全电")) { row.put("selectField_mgz2tut4", "不相关"); continue; } if ("".equals(row.get("textField_l6ujr47c")) || "泰森(江苏)畜禽业发展有限公司".equals(row.get("textField_l6vk7131"))) { row.put("selectField_mgz2tut4", "不相关"); continue; } Object instanceIdObj = row.get("textField_mi1l1tcc"); if (instanceIdObj == null) continue; String instanceId = instanceIdObj.toString(); // 查询发票详情 DDR_New invoiceDdr = ydClient.queryData( YDParam.builder() .appType("APP_N9NPHVTQLPBPO8MR6WFG") .systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW") .formUuid("FORM-4J7669A1Z1X22RIL61LB7AOXGRX82OHP45U6L51") .formInstanceId(instanceId) .build(), YDConf.FORM_QUERY.retrieve_id ); Map formdata = invoiceDdr.getFormData(); if (formdata == null) continue; Map invoice = new LinkedHashMap<>(); invoice.put("taxno", safeGetString(formdata, "textField_l6u55vdn")); String fpType = safeGetString(formdata, "textField_l6u55vd8"); invoice.put("invoicecode", fpType.contains("全电") ? "全电发票" : safeGetString(formdata, "textField_l6u55vd9")); invoice.put("invoicenumber", safeGetString(formdata, "textField_l6u55vd3")); invoice.put("usetax", safeGetString(formdata, "textField_l6vu65fs")); // 税率处理 String taxRateStr = safeGetString(formdata, "textField_l6vvuq3f"); double taxRate = 0.0; if (!taxRateStr.isEmpty()) { try { if (taxRateStr.endsWith("%")) { taxRate = Double.parseDouble(taxRateStr.substring(0, taxRateStr.lastIndexOf('%'))) / 100.0; } else { taxRate = Double.parseDouble(taxRateStr) / 100.0; } } catch (NumberFormatException ignored) { taxRate = 0.0; } } invoice.put("taxrate", taxRate); invoice.put("autodeduct", "1"); invoice.put("oper", "1"); invoices.add(invoice); } if (invoices.isEmpty()) { return; } request.put("invoices", invoices); List> requestList = Collections.singletonList(request); String jsonBody = new ObjectMapper().writeValueAsString(requestList); RestTemplate restTemplate = new RestTemplate(); String PROXY_URL = "https://poc.cloudpure.cn/api/ts/bookkeeping"; HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity entity = new HttpEntity<>(jsonBody, headers); ResponseEntity response = restTemplate.postForEntity(PROXY_URL, entity, String.class); String responseBody = response.getBody(); if (responseBody == null) { updateMainFormError(InstanceId, "Empty response from bookkeeping API"); return; } ObjectMapper objectMapper = new ObjectMapper(); JsonNode rootNode = objectMapper.readTree(responseBody); JsonNode dataArray = rootNode.path("data"); String code = rootNode.path("code").asText(); if ("0000".equals(code) && dataArray.isArray() && dataArray.size() > 0) { List updatedRows = new ArrayList<>(); for (int i = 0; i < tableFils.size(); i++) { Map originalRow = tableFils.get(i); String fpInstanceId = safeGetString(originalRow, "textField_mi1l1tcc"); String invoiceNoInTable = safeGetString(originalRow, "textField_l6ujr47c"); String status = originalRow.containsKey("selectField_mgz2tut4") && !"".equals(originalRow.get("selectField_mgz2tut4")) ? (String) originalRow.get("selectField_mgz2tut4") : "未勾选"; String returnMsg = ""; // 匹配返回的发票结果 for (JsonNode item : dataArray) { String respInvoiceNo = item.path("invoicenumber").asText(); returnMsg = item.path("returnmsg").asText(); if (respInvoiceNo.equals(invoiceNoInTable) && returnMsg.contains("申请成功")) { status = "已勾选"; break; } } if ("不相关".equals(status)) { returnMsg = ""; } // 构建更新后的行数据 Map updatedRow = new HashMap<>(originalRow); updatedRow.put("selectField_mgz2tut4", status); updatedRow.put("textareaField_mi5kjmxc", returnMsg); // 保留级联字段原始ID(防止丢失) Object cascadeId = originalRow.get("cascadeSelectField_mejfoony_id"); if (cascadeId != null) { updatedRow.put("cascadeSelectField_mejfoony", cascadeId); } updatedRows.add(updatedRow); // 更新发票子表单状态 Map fpUpdateMap = new HashMap<>(); fpUpdateMap.put("textField_l7efm5az", status); fpUpdateMap.put("textField_l7efm5ay", "是"); fpUpdateMap.put("textField_lz0v4x8o", voucherNumber); fpUpdateMap.put("textField_lz0v4x8p", OAnumber); ydClient.operateData( YDParam.builder() .appType("APP_N9NPHVTQLPBPO8MR6WFG") .systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW") .formInstanceId(fpInstanceId) .updateFormDataJson(JSON.toJSONString(fpUpdateMap)) .build(), YDConf.FORM_OPERATION.update ); } // 更新主表单 Map mainUpdate = new HashMap<>(); mainUpdate.put("tableField_l6ujr47b", updatedRows); mainUpdate.put("textareaField_mi7et0wm", rootNode.toString()); ydClient.operateData( YDParam.builder() .appType("APP_N9NPHVTQLPBPO8MR6WFG") .systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW") .formInstanceId(InstanceId) .updateFormDataJson(JSON.toJSONString(mainUpdate)) .build(), YDConf.FORM_OPERATION.update ); } else { // 接口调用失败或无有效数据 updateMainFormError(InstanceId, rootNode.toString()); } } catch (Exception ex) { ex.printStackTrace(); updateMainFormError(InstanceId, "Exception: " + ex.getMessage()); } } @Override public void NPOCX(String InstanceId, String formUuid) { YDParam ydParam = _getYDTokenKPD(); ydParam.setFormInstanceId(InstanceId); DDR_New ddr = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_id); Map dataForm = ddr.getFormData(); String SFCX = (String) dataForm.get("selectField_mkxd6l4o");//是否冲销 String CXTSZT = (String) dataForm.get("selectField_mkxmqncp");//冲销推送状态 String ZOA_NUMBER = (String) dataForm.get("textField_mi73dy3n");//钉钉单据号 String BUKRS = (String) dataForm.get("textField_mejfj9iw");//公司代码 if (SFCX.equals("是") && !CXTSZT.equals("已完成")) { String uid = "TEST-CN001"; if (!dataForm.get("employeeField_mhxdzya9_id").equals("")) { List> conditions = new ArrayList<>(Arrays.asList(buildCondition("textField_l6dddg5k", dataForm.get("employeeField_mhxdzya9_id"), "TEXT", "eq", "TextField"))); String listJson = JSON.toJSONString(conditions); YDParam YGydParam = _getYDTokenZXXZ(listJson); List dataList = (List) ydClient.queryData(YGydParam, YDConf.FORM_QUERY.retrieve_search_form).getData(); if (dataList != null && dataList.size() > 0) { Map map = dataList.get(0); Map formData = (Map) map.get("formData"); uid = formData.get("textField_l6djch1m").toString(); uid = "CHN-0" + uid; } } List tableFils = ydService.queryDetails(YDParam.builder().formInstanceId(InstanceId).formUuid(formUuid).tableFieldId("tableField_mkxd96yv").build()); log.info("NPO冲销行项目, {}, {}", InstanceId, tableFils.size()); int total = tableFils.size(), succ = 0, fail = 0; // 批量推送Sap凭证: 兼容重试场景 for (Map detail : tableFils) { if ("成功".equals(UtilMap.getString(detail, "selectField_mkxoe0yk"))) { succ += 1; continue; } try { Map body = new HashMap<>(); body.put("ZOA_TYPE", "NP"); body.put("ZOA_NUMBER", ZOA_NUMBER); body.put("BUKRS", BUKRS); body.put("BELNR", UtilMap.getString(detail, "textField_mkxd96yx")); body.put("GJAHR", UtilMap.getString(detail, "textField_mkxd96yy")); body.put("STGRD", UtilMap.getString(detail, "selectField_mkxd96z6")); body.put("USNAM", uid); if (!"".equals(detail.get("dateField_mkxd96z1"))) { body.put("BUDAT", CusutUtil.getFormatDate((long) detail.get("dateField_mkxd96z1"))); } Map result = this._pushSPCX(body); // prd 重复推送标记成功 if ("S".equals(result.get("E_SYSMSGTYPE")) || "post operation had already been done, repeat is not allowed".equals(result.get("E_MESSAGE"))) { detail.put("selectField_mkxoe0yk", "成功"); detail.put("textField_mkxd96z2", result.get("E_BELNR")); detail.put("textField_mkxd96z3", result.get("E_GJAHR")); succ += 1; } else { detail.put("selectField_mkxoe0yk", "失败"); fail += 1; } detail.put("textField_mkxd96z5", result.get("E_MESSAGE")); } catch (McException mc) { detail.put("selectField_mkxoe0yk", "失败"); detail.put("textField_mkxd96z5", mc.getMessage()); fail += 1; } } String state = "已完成"; if (fail > 0) { state = "部分失败"; } if (fail == total) { state = "全部失败"; } Map formData = UtilMap.map("tableField_mkxd96yv, selectField_mkxmqncp", tableFils, state); log.info("NPO冲销执行, {}", formData); ydClient.operateData(YDParam.builder().formInstanceId(InstanceId).updateFormDataJson(JSON.toJSONString(formData)).build(), YDConf.FORM_OPERATION.update); } } /** * NPO推送冲销 * @param */ private Map _pushSPCX(Map body) { log.info("NPO冲销推送 SAP, {}", JSON.toJSONString(body)); String rsp = HttpUtil.post(QA_sapUrl + "SAP005", null, JSON.toJSONString(body), null); log.info("NPO冲销 SAP 响应, {}", rsp); List result = JSON.parseArray(rsp, Map.class); McException.assertAccessException(result.isEmpty(), "Sap接口请求异常, 返回空集合, 需重新推送."); return result.get(0); } // === 内联辅助逻辑(以局部方法形式模拟,实际用 private 方法,但按要求不扩展 => 改为内联表达式)=== // 因不能新增方法,以下逻辑直接内联,但为清晰起见,此处用注释说明“安全获取”逻辑: // 实际替换为:(map.get(key) instanceof String ? (String) map.get(key) : "") private String safeGetString(Map map, String key) { Object val = map.get(key); return val instanceof String ? (String) val : ""; } private void updateMainFormError(String instanceId, String errorMsg) { ydClient.operateData( YDParam.builder() .appType("APP_N9NPHVTQLPBPO8MR6WFG") .systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW") .formInstanceId(instanceId) .updateFormDataJson(JSON.toJSONString(UtilMap.map("textareaField_mi7et0wm", errorMsg))) .build(), YDConf.FORM_OPERATION.update ); } // @Override // public void FPGX(String InstanceId, String voucherNumber, String OAnumber) { // YDParam ydParam = _getYDTokenKPD(); // ydParam.setFormInstanceId(InstanceId); // DDR_New ddr = ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_id); // Map dataForm = ddr.getFormData(); // try { // String nowDate = CusutUtil.getNowDate(); // List> requestList = new ArrayList<>(); // Map request = new LinkedHashMap<>(); // JSONArray invoices = new JSONArray(); // ArrayList ids = new ArrayList<>(); // request.put("voucherNumber", voucherNumber); // request.put("voucherstatus", "0"); // request.put("voucherdate", nowDate); // request.put("applytime", nowDate); // request.put("bookeepflag", "1"); // request.put("syssource", "第三方系统规定"); // List list = new ArrayList<>(); // List> tableFils = (List>) dataForm.get("tableField_l6ujr47b"); // if (tableFils != null && tableFils.size() > 0) { // list = (List) dataForm.get("tableField_l6ujr47b"); // for (int n = 0; n < tableFils.size(); n++) { // // Map row = new HashMap(tableFils.get(n)); // Map invoice = new LinkedHashMap<>(); //// String substring = row.getString("associationFormField_l6yglav7_id").replaceAll("\\\\", "").substring(1); // String instanceId = row.get("textField_mi1l1tcc").toString(); // // Map formdata = ydClient.queryData(YDParam.builder().appType("APP_N9NPHVTQLPBPO8MR6WFG").systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW").formUuid("FORM-4J7669A1Z1X22RIL61LB7AOXGRX82OHP45U6L51").formInstanceId(instanceId).build(), YDConf.FORM_QUERY.retrieve_id).getFormData(); // if (formdata != null) { // ids.add(instanceId); // JSONObject jsonObject = new JSONObject(); // invoice.put("taxno", formdata.get("textField_l6u55vdn")); // if (formdata.get("textField_l6u55vd8").toString().contains("全电")) { // invoice.put("invoicecode", "全电发票"); // } else { // invoice.put("invoicecode", formdata.get("textField_l6u55vd9")); // } // invoice.put("invoicenumber", formdata.get("textField_l6u55vd3")); // invoice.put("usetax", formdata.get("textField_l6vu65fs").toString()); // try { // if (!formdata.containsKey("textField_l6vvuq3f") || formdata.get("textField_l6vvuq3f").equals("")) { // formdata.remove("textField_l6vvuq3f"); // formdata.put("textField_l6vvuq3f", "0"); // } // invoice.put("taxrate", Double.parseDouble(formdata.get("textField_l6vvuq3f").toString().substring(0, formdata.get("textField_l6vvuq3f").toString().lastIndexOf("%"))) / 100); // } catch (Exception ex) { // try { // invoice.put("taxrate", Double.parseDouble(formdata.get("textField_l6vvuq3f").toString()) / 100); // } catch (Exception ex2) { // invoice.put("taxrate", 0); // } // } // invoice.put("autodeduct", "1"); // invoice.put("oper", "1"); // jsonObject.toString(); // invoices.put(invoice); // request.put("invoices", invoices); // } // // } // requestList.add(request); // String jsonBody = new ObjectMapper().writeValueAsString(requestList); // System.out.println(jsonBody.toString()); // RestTemplate restTemplate = new RestTemplate(); // String PROXY_URL = "https://poc.cloudpure.cn/api/ts/bookkeeping"; // HttpHeaders headers = new HttpHeaders(); // headers.setContentType(MediaType.APPLICATION_JSON); // ResponseEntity response = restTemplate.postForEntity(PROXY_URL, new HttpEntity<>(jsonBody, headers), String.class); // // String responseBody = response.getBody(); // try { // ObjectMapper objectMapper = new ObjectMapper(); // JsonNode rootNode = objectMapper.readTree(responseBody); // ArrayList maps_YD = new ArrayList<>(); // HashMap map = new HashMap(); // // 获取 data 数组 // JsonNode dataArray = rootNode.get("data"); // String code = String.valueOf(rootNode.get("code")); // // 循环遍历 data 数组 // if (dataArray.size() > 0 && code.equals("\"0000\"")) { // // for (int i = 0; i < list.size(); i++) { // Map sss2 = (Map) list.get(i); // String pd = (String) sss2.get("selectField_mgz2tut4");//发票是否勾选? // String fpidInstanceId = (String) sss2.get("textField_mi1l1tcc");//发票实例ID // // String returnMsg = ""; // for (JsonNode dataItem : dataArray) { // returnMsg = dataItem.get("returnmsg").asText(); // String invoicenumber = dataItem.get("invoicenumber").asText(); // if (invoicenumber.equals(sss2.get("textField_l6ujr47c")) && !returnMsg.equals("未同步到该发票信息,请先进行同步发票操作!")) { // pd = "已勾选"; // } else { // pd = "不相关"; // } // } // sss2.put("cascadeSelectField_mejfoony", list.get(i).get("cascadeSelectField_mejfoony_id")); // sss2.put("selectField_mgz2tut4", pd); // sss2.put("textareaField_mi5kjmxc", returnMsg); // maps_YD.add(sss2); // //更改发票信息 // HashMap FPMAP = new HashMap(); // FPMAP.put("textField_l7efm5az", pd); // FPMAP.put("textField_l7efm5ay", "是"); // FPMAP.put("textField_lz0v4x8o", voucherNumber); // FPMAP.put("textField_lz0v4x8p", OAnumber); // ydClient.operateData(YDParam.builder().appType("APP_N9NPHVTQLPBPO8MR6WFG").systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW").formInstanceId(String.valueOf(fpidInstanceId)).updateFormDataJson(JSON.toJSONString(FPMAP)).build(), YDConf.FORM_OPERATION.update); // } // map.put("tableField_l6ujr47b", maps_YD); // map.put("textareaField_mi7et0wm", rootNode); // ydClient.operateData(YDParam.builder().appType("APP_N9NPHVTQLPBPO8MR6WFG").systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW").formInstanceId(String.valueOf(InstanceId)).updateFormDataJson(JSON.toJSONString(map)).build(), YDConf.FORM_OPERATION.update); // // } else { // // // 报错写入 // 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); // // // } // // } catch (Exception e) { // e.printStackTrace(); // } // // // } // // } catch (Exception ex) { // ex.printStackTrace(); // System.out.println(ex); // } // // } public YDParam _getYDTokenKPD() { /** * 泰森付款 */ return YDParam.builder().appType("APP_N9NPHVTQLPBPO8MR6WFG").systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW").build(); } /** * 泰森付款 人员档案表 */ public static YDParam _getYDTokenZXXZ(String searchFieldJson) { return YDParam.builder().appType("APP_N9NPHVTQLPBPO8MR6WFG").systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW").formUuid("FORM-4J7669A10FO250UJ9C6Q7CM00PC62YPW8DD6LT").searchFieldJson(searchFieldJson).build(); } public static YDParam _getNPonlist(String searchFieldJson) { return YDParam.builder().appType("APP_N9NPHVTQLPBPO8MR6WFG").systemToken("UM6660D1PGF2O34KAVVKG8XZ756E3O06MZX5LW").formUuid("FORM-E9A6EBE00F3E4DA68681107F85600D80ZJUT").searchFieldJson(searchFieldJson).approvedResult("agree").build(); } //匹配条件用 private static final String KEY = "key"; private static final String VALUE = "value"; private static final String TYPE = "type"; private static final String OPERATOR = "operator"; private static final String COMPONENT_NAME = "componentName"; private static Map buildCondition(String key, Object value, String type, String operator, String componentName) { Map condition = new HashMap<>(); condition.put(KEY, key); condition.put(VALUE, value); condition.put(TYPE, type); condition.put(OPERATOR, operator); condition.put(COMPONENT_NAME, componentName); return condition; } }