diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/form/SappzFormPlugin.java b/main/java/shjh/jhzj7/fi/fi/plugin/form/SappzFormPlugin.java index 990da82..6a0bf73 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/form/SappzFormPlugin.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/form/SappzFormPlugin.java @@ -472,9 +472,9 @@ public class SappzFormPlugin extends AbstractFormPlugin { //是否自行采购 boolean isselfprocurment = (boolean) this.getModel().getValue("shjh_isselfprocurment", selectRow); ap_payapply.set("shjh_zxcg", isselfprocurment); - //费控单据编号 - String sourcebillno = (String) this.getModel().getValue("shjh_sourcebillno", selectRow);//外部系统单据编号 - ap_payapply.set("shjh_fkdjbh", sourcebillno); +// //费控单据编号 +// String sourcebillno = (String) this.getModel().getValue("shjh_sourcebillno", selectRow);//外部系统单据编号 +// ap_payapply.set("shjh_fkdjbh", sourcebillno); //原因码 String reasoncode = (String) this.getModel().getValue("shjh_reasoncode", selectRow);//原因码 if (reasoncode != null && !reasoncode.isEmpty()) { @@ -550,7 +550,6 @@ public class SappzFormPlugin extends AbstractFormPlugin { this.getView().showErrorNotification(errorMessage); return; } - //todo:SAP是否锁定 OperationResult submitResult = OperationServiceHelper.executeOperate("submit", AP_PAYAPPLY, new DynamicObject[]{ap_payapply}, option); if (!submitResult.isSuccess()) { // 提交失败,将保存的数据删除,记录日志 @@ -595,7 +594,7 @@ public class SappzFormPlugin extends AbstractFormPlugin { * * @param result 操作返回结果 */ - private String getFirstErrorMessage(OperationResult result) { + public static String getFirstErrorMessage(OperationResult result) { ValidateResultCollection validateResult = result.getValidateResult(); if (validateResult != null && validateResult.errorSize() > 0) { for (ValidateResult errinfo : validateResult.getValidateErrors()) { @@ -610,7 +609,7 @@ public class SappzFormPlugin extends AbstractFormPlugin { /** * 处理错误日志(解析操作日志) */ - private void handleAndLogError(OperationResult result, String operationType, String fkBillNum, String apimenthod, String jsonBodyString) { + public static void handleAndLogError(OperationResult result, String operationType, String fkBillNum, String apimenthod, String jsonBodyString) { String errorMessage = getFirstErrorMessage(result); handleError(operationType + ",原因:" + errorMessage, apimenthod, fkBillNum, jsonBodyString); } diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/operate/PayBillSubmitOperation.java b/main/java/shjh/jhzj7/fi/fi/plugin/operate/PayBillSubmitOperation.java index 33cbfbc..b7b3467 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/operate/PayBillSubmitOperation.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/operate/PayBillSubmitOperation.java @@ -2,17 +2,31 @@ package shjh.jhzj7.fi.fi.plugin.operate; import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.entity.ExtendedDataEntity; import kd.bos.entity.plugin.AbstractOperationServicePlugIn; +import kd.bos.entity.plugin.AddValidatorsEventArgs; import kd.bos.entity.plugin.args.AfterOperationArgs; +import kd.bos.entity.validate.AbstractValidator; import kd.bos.logging.Log; import kd.bos.logging.LogFactory; import kd.bos.orm.query.QCP; import kd.bos.orm.query.QFilter; import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.botp.BFTrackerServiceHelper; import kd.bos.servicehelper.operation.SaveServiceHelper; +import kd.bos.util.StringUtils; import kd.sdk.plugin.Plugin; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import java.math.BigDecimal; import java.util.Date; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; + +import static shjh.jhzj7.fi.fi.utils.SapUtils.fk_validation; +import static shjh.jhzj7.fi.fi.utils.SapUtils.sap_validation; /** @@ -23,6 +37,152 @@ public class PayBillSubmitOperation extends AbstractOperationServicePlugIn imple private static final Log log = LogFactory.getLog(PayBillSubmitOperation.class); + @Override + public void onAddValidators(AddValidatorsEventArgs e) { + super.onAddValidators(e); + e.addValidator(new AbstractValidator() { + @Override + public void validate() { + String operateKey = this.getOperateKey(); + if ("submit".equals(operateKey)){ + ExtendedDataEntity[] entities = this.getDataEntities(); + for (ExtendedDataEntity entity : entities) { + DynamicObject bill = entity.getDataEntity(); + bill = BusinessDataServiceHelper.loadSingle(bill.getPkValue(),"cas_paybill"); + String sourcesystem = bill.getString("shjh_sourcesystem");//来源系统:SAP_A 费控_B + boolean shjhSapvalidate = bill.getBoolean("shjh_sapvalidate");//SAP校验是否通过 + //付款单提交时,调用SAP应付凭证数据校验接口,校验不通过,弹框提示用户具体原因;如果校验通过,则标记;后续再提交时无需校验。 + if ("A".equals(sourcesystem) && !shjhSapvalidate) { + JSONObject jsonObject = sap_validation(getSapData(bill), bill.getString("billno")); + if (jsonObject.getIntValue("code") != 0) { + String message = jsonObject.getString("message"); + this.addErrorMessage(entity,"SAP校验未通过不能提交:"+message); + }else{ + bill.set("shjh_sapvalidate", true); + SaveServiceHelper.save(new DynamicObject[]{bill}); + } + } + //付款单提交时,调用费控付款申请数据校验接口,校验不通过,弹框提示用户具体原因;如果校验通过,则标记;后续再提交时无需校验; + if ("B".equals(sourcesystem)) { + JSONObject jsonObject = fk_validation(getFkData(bill), bill.getString("billno")); + if (jsonObject.getIntValue("code") != 0) { + String message = jsonObject.getString("message"); + this.addErrorMessage(entity,"费控校验未通过不能提交:"+message); + }else{ + //根据返回信息比对 + JSONObject data = jsonObject.getJSONObject("data"); + if (null != data) { + JSONObject tempData = data.getJSONObject("tempData"); + if (null != tempData) { + String applyamount = tempData.getString("applyamount");//付款金额_actpayamt + BigDecimal actpayamt = bill.getBigDecimal("actpayamt"); + // 将 applyamount 转换为 BigDecimal + BigDecimal applyAmountBigDecimal = new BigDecimal(applyamount); + int comparisonResult = applyAmountBigDecimal.compareTo(actpayamt); + if (comparisonResult != 0) { + this.addErrorMessage(entity,"费控校验未通过不能提交:付款金额与付款单付款金额不一致"); + } + String assacct = tempData.getString("assacct");//收款银行账号_payeebanknum + String payeebanknum = bill.getString("payeebanknum"); + if (!assacct.equals(payeebanknum)) { + this.addErrorMessage(entity,"费控校验未通过不能提交:收款银行账号与付款单银行账号不一致"); + } + String bebank = tempData.getString("bebank");//收款银行名称_payeebankname + String payeebankname = bill.getString("payeebankname"); + if (!bebank.equals(payeebankname)) { + this.addErrorMessage(entity,"费控校验未通过不能提交:收款银行名称与付款单银行名称不一致"); + } + String bebankNum = tempData.getString("bebankNum");//收款联行号_recbanknumber + String recbanknumber = bill.getString("recbanknumber"); + if (!bebankNum.equals(recbanknumber)) { + this.addErrorMessage(entity,"费控校验未通过不能提交:收款联行号与付款单联行号不一致"); + } + } + } + bill.set("shjh_fkvalidate", true); + SaveServiceHelper.save(new DynamicObject[]{bill}); + } + } + } + } + } + }); + } + + /** + * sap校验接口入参组装 + */ + private JSONObject getSapData(DynamicObject bill) { + JSONObject data = new JSONObject(); + JSONArray IT_ITEMS = new JSONArray(); + String BUKRS = ""; + if (null != bill.getDynamicObject("openorg")) { + BUKRS = bill.getDynamicObject("openorg").getString("number"); + } + DynamicObjectCollection entry = bill.getDynamicObjectCollection("entry"); + if (!entry.isEmpty()) { + for (DynamicObject dynamicObject : entry) { + JSONObject IT_ITEM = new JSONObject(); + IT_ITEM.put("BUKRS", BUKRS);//公司代码 + IT_ITEM.put("GJAHR", dynamicObject.getString("shjh_voucheryear"));//会计年度 + IT_ITEM.put("BELNR", dynamicObject.getString("shjh_vouchernums"));//会计凭证编号 + IT_ITEM.put("BUZEI", dynamicObject.getString("shjh_voucherentrynum"));//会计凭证中的行项目数 + setAmount(dynamicObject, IT_ITEM, bill);//设置金额 + IT_ITEM.put("LIFNR", bill.getString("payeebanknum"));//供应商或债权人的帐号 + IT_ITEM.put("ZWLYH", bill.getString("payeebankname"));//往来银行 + IT_ITEM.put("ZJDDJID", ""+bill.getPkValue());//金蝶单据ID + IT_ITEM.put("ZJDDJBH", bill.getString("billno"));//金蝶单据编号 + IT_ITEMS.add(IT_ITEM); + } + } + data.put("IT_ITEMS", IT_ITEMS); + return data; + } + + private JSONObject setAmount(DynamicObject dynamicObject, JSONObject IT_ITEM, DynamicObject bill){ + //总金额 已清 未清 + BigDecimal DMBTR1 = BigDecimal.ZERO;//总金额 + //上查付款申请单 + long eCorebillid = dynamicObject.getLong("e_sourcebillid");//源单ID + DynamicObject apPayapply = BusinessDataServiceHelper.loadSingle(eCorebillid,"ap_payapply"); + if (null != apPayapply) { + DMBTR1 = apPayapply.getBigDecimal("applyamount");//申请金额 + } + BigDecimal DMBTR2 = BigDecimal.ZERO;//已清 + BigDecimal DMBTR = DMBTR1.subtract(DMBTR2);//未清 + QFilter q1 = new QFilter("entry.shjh_voucheryear", QCP.equals, dynamicObject.getString("shjh_voucheryear")); + QFilter q2 = new QFilter("entry.shjh_vouchernums", QCP.equals, dynamicObject.getString("shjh_vouchernums")); + QFilter q3 = new QFilter("entry.shjh_voucherentrynum", QCP.equals, dynamicObject.getString("shjh_voucherentrynum")); +// QFilter q4 = new QFilter("shjh_credentialnum", QCP.is_notnull, null); + DynamicObject[] loads = BusinessDataServiceHelper.load("cas_paybill", "id,entry,entry.e_actamt", + new QFilter[]{q1, q2, q3}); + for (DynamicObject load : loads) { + String credentialnum = load.getString("shjh_credentialnum"); + if (StringUtils.isEmpty(credentialnum)) { + continue; + } + DynamicObjectCollection entrys = load.getDynamicObjectCollection("entry"); + for (DynamicObject entr : entrys) { + DMBTR2 = DMBTR2.add(entr.getBigDecimal("e_actamt")); + } + } + IT_ITEM.put("DMBTR1", DMBTR1);//按本位币计的金额 总金额 + IT_ITEM.put("DMBTR2", DMBTR2);//按本位币计的金额 已清 + IT_ITEM.put("DMBTR", DMBTR);//按本位币计的金额 未清 + + return IT_ITEM; + } + + private JSONObject getFkData(DynamicObject bill) { + JSONObject data = new JSONObject(); + JSONArray input = new JSONArray(); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("DetailID",bill.getString("shjh_fkentryid"));//费控分录明细ID + input.add(jsonObject); + data.put("input", input); + return data; + } + @Override public void afterExecuteOperationTransaction(AfterOperationArgs e) { super.afterExecuteOperationTransaction(e); @@ -118,4 +278,24 @@ public class PayBillSubmitOperation extends AbstractOperationServicePlugIn imple return null; } + + /** + * + * @param entity 当前单据标识 + * @param entity1 上查的单据标识 + * @param billId 当前单据ID + * @return + */ + private static Long up(String entity,String entity1,Long billId) { + Map> sourceBills = BFTrackerServiceHelper.findSourceBills(entity, new Long[]{billId}); + HashSet longs = sourceBills.get(entity1); + if(longs!=null){ + for (int i = 0; i < longs.size(); i++) { + Iterator iterator = longs.iterator(); + Long next = iterator.next(); + return next; + } + } + return null; + } } diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaybillPushSapOperation.java b/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaybillPushSapOperation.java index 6d442fe..c501f01 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaybillPushSapOperation.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaybillPushSapOperation.java @@ -4,19 +4,25 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.entity.ExtendedDataEntity; import kd.bos.entity.plugin.AbstractOperationServicePlugIn; +import kd.bos.entity.plugin.AddValidatorsEventArgs; import kd.bos.entity.plugin.args.AfterOperationArgs; +import kd.bos.entity.validate.AbstractValidator; import kd.bos.orm.query.QCP; import kd.bos.orm.query.QFilter; import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.operation.SaveServiceHelper; import kd.sdk.plugin.Plugin; +import shjh.jhzj7.fi.fi.plugin.form.info.RecFieldsInfo; import shjh.jhzj7.fi.fi.utils.JhzjUtils; +import shjh.jhzj7.fi.fi.utils.SysUtils; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.Date; -import static shjh.jhzj7.fi.fi.utils.SapUtils.sap_accounVoucher; +import static shjh.jhzj7.fi.fi.utils.SapUtils.*; /** * 付款单推送SAP凭证操作插件 @@ -24,6 +30,35 @@ import static shjh.jhzj7.fi.fi.utils.SapUtils.sap_accounVoucher; */ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn implements Plugin { + @Override + public void onAddValidators(AddValidatorsEventArgs e) { + super.onAddValidators(e); + e.addValidator(new AbstractValidator() { + @Override + public void validate() { + String operateKey = this.getOperateKey(); + if ("pushsap".equals(operateKey)) { + ExtendedDataEntity[] entities = this.getDataEntities(); + for (ExtendedDataEntity entity : entities) { + DynamicObject bill = entity.getDataEntity(); + String shjhSourcesystem = bill.getString("shjh_sourcesystem");//来源系统,A_sap,B_fk + DynamicObject paymentidentify = bill.getDynamicObject("paymentidentify");//付款单标识 + + if (null != paymentidentify) { + //FKBS01 主动付款 FKBS02 被动付款 + String number = paymentidentify.getString("number");//付款单标识 + if ("FKBS01".equals(number)) { + if (!"A".equals(shjhSourcesystem)) { + this.addErrorMessage(entity, "付款单为主动付款且来源系统不为SAP,不允许推送SAP凭证"); + } + } + } + } + } + } + }); + } + @Override public void afterExecuteOperationTransaction(AfterOperationArgs e) { super.afterExecuteOperationTransaction(e); @@ -33,56 +68,64 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl DynamicObject[] dataEntities = e.getDataEntities(); for (DynamicObject bill : dataEntities) { bill = BusinessDataServiceHelper.loadSingle(bill.getPkValue(), "cas_paybill"); + String shjhSourcesystem = bill.getString("shjh_sourcesystem");//来源系统 //主动:{1.fk:不清帐,直传付款凭证给sap;2.SAP:要清账,都传} 被动:{不用传清账} FKZJ2025030040 JSONObject data = new JSONObject(); data.put("IS_HEADER", getIS_HEADER(bill));//抬头 data.put("IT_ITEM", getIT_ITEM(bill)); - //只有SAP需要传清账数据 - String shjhSourcesystem = bill.getString("shjh_sourcesystem");//来源系统 if ("A".equals(shjhSourcesystem)) { - JSONArray IT_CLEAR = new JSONArray();//清账数据,参考《IT_CLEAR》,仅清账需要输入 - data.put("IT_CLEAR", IT_CLEAR); + data.put("IT_CLEAR", getIT_CLEAR(bill));//清账数据,参考《IT_CLEAR》,仅清账需要输入 + } + //一次性供应商或客户信息(仅需要填写) + String type = bill.getString("payeetype"); + long id = Long.parseLong(bill.getString("payee")); + if (null != type && id != 0L) { + Boolean disposableCusOrSup = SysUtils.isDisposableCusOrSup(id, type); + if (disposableCusOrSup) { + data.put("IS_CUSTOMERCPD", getIS_CUSTOMERCPD(bill)); + } + } + //是否推送SAP:shjh_ispushsap,推送成功更新状态 + JSONObject jsonObject = sap_accounVoucher(data, bill.getString("billno")); + if (jsonObject.getIntValue("code") == 0) { + bill.set("shjh_ispushsap", true); + SaveServiceHelper.save(new DynamicObject[]{bill}); } - - JSONArray IS_CUSTOMERCPD = new JSONArray();//一次性供应商或客户信息(仅需要填写) - data.put("IS_CUSTOMERCPD", IS_CUSTOMERCPD); - sap_accounVoucher(data,bill.getString("billno")); - } } } - private JSONObject getIS_HEADER(DynamicObject bill){ + private JSONObject getIS_HEADER(DynamicObject bill) { JSONObject IS_HEADER = new JSONObject();//抬头 String BUKRS = ""; if (null != bill.getDynamicObject("openorg")) { BUKRS = bill.getDynamicObject("openorg").getString("number"); } - IS_HEADER.put("BUKRS",BUKRS);//公司代码_核算组织(付款单) - IS_HEADER.put("BLART","KZ");//凭证类型 + IS_HEADER.put("BUKRS", BUKRS);//公司代码_核算组织(付款单) + IS_HEADER.put("BLART", "KZ");//凭证类型 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Date bizdate = bill.getDate("bizdate"); String bizdate1 = ""; if (null != bizdate) { bizdate1 = format.format(bizdate); } - IS_HEADER.put("BLDAT",bizdate1);//凭证日期_业务日期(付款单bizdate) + IS_HEADER.put("BLDAT", bizdate1);//凭证日期_业务日期(付款单bizdate) Date acttradedate = bill.getDate("acttradedate"); String acttradedate1 = ""; if (null != acttradedate) { acttradedate1 = format.format(acttradedate); } - IS_HEADER.put("BUDAT",acttradedate1);//过账日期_实际交易日期(付款单acttradedate) + IS_HEADER.put("BUDAT", acttradedate1);//过账日期_实际交易日期(付款单acttradedate) String isoCode = bill.getDynamicObject("currency").getString("number"); IS_HEADER.put("WAERS", JhzjUtils.getCurrencyCode(isoCode));//币种_付款币种(付款单currency) - IS_HEADER.put("XBLNR",bill.getString("billno"));//参考凭证号_单据编号(付款单billno) - IS_HEADER.put("BKTXT",bill.getString("payeename"));//凭证抬头文本_收款人名称(付款单payeename) - IS_HEADER.put("USNAM","资金系统");//用户名 + IS_HEADER.put("XBLNR", bill.getString("billno"));//参考凭证号_单据编号(付款单billno) + IS_HEADER.put("BKTXT", bill.getString("payeename"));//凭证抬头文本_收款人名称(付款单payeename) + IS_HEADER.put("USNAM", "资金系统");//用户名 return IS_HEADER; } - private JSONArray getIT_ITEM(DynamicObject bill){ + private JSONArray getIT_ITEM(DynamicObject bill) { //客户(bd_customer)||供应商(bd_supplier) 收款人id:payee String payeetype = bill.getString("payeetype");//收款人类型 @@ -136,33 +179,37 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl if (null != account) { IT_ITEMS.put("HKONT", account.getString("number")); // 总账科目_科目(凭证分录account) } + IT_ITEMS.put("RSTGR", "014");//todo:原因代码_原因码(付款明细shjh_yym)_必填 + IT_ITEMS.put("SGTXT", SGTXT);//行项目文本_SAP会计科目行项目号(付款明细shjh_voucherentrynum) + IT_ITEMS.put("KOSTL", KOSTL);//成本中心_成本中心(付款单shjh_costcenter) + IT_ITEMS.put("PRCTR", PRCTR);//利润中心_利润中心(付款单shjh_pc) // 获取借方金额 BigDecimal debitlocal = (BigDecimal) entry.get("debitlocal");//借方 // 获取贷方金额 BigDecimal creditlocal = (BigDecimal) entry.get("creditlocal");//贷方 - // 获取分录方向 + + String shjhSourcesystem = bill.getString("shjh_sourcesystem");//来源系统 + String entrydc = (String) entry.get("entrydc");//分录方向(1.借方,-1.贷方) // 进行空值检查 if (debitlocal != null && creditlocal != null && entrydc != null) { BigDecimal amountToPut = BigDecimal.ZERO; - if ("1".equals(entrydc)) { + // todo:获取分录方向 若A,只拿一方,当前拿的借方 + boolean isSourceSystemA = "A".equals(shjhSourcesystem); + boolean isEntryDC1 = "1".equals(entrydc); + boolean isEntryDCNegative1 = "-1".equals(entrydc); + + if (isSourceSystemA && isEntryDC1) { amountToPut = debitlocal; - } else if ("-1".equals(entrydc)) { - amountToPut = creditlocal.negate(); - } else { - // 处理分录方向不符合预期的情况 - System.err.println("Invalid entry direction: " + entrydc); + } else if (!isSourceSystemA) { + if (isEntryDC1) { + amountToPut = debitlocal; + } else if (isEntryDCNegative1) { + amountToPut = creditlocal.negate();//相反 + } } IT_ITEMS.put("DMBTR", String.valueOf(amountToPut)); - } else { - // 处理存在空值的情况 - System.err.println("One or more values are null."); } - IT_ITEMS.put("RSTGR", "014");//原因代码_原因码(付款明细shjh_yym)_必填 - IT_ITEMS.put("SGTXT", SGTXT);//行项目文本_SAP会计科目行项目号(付款明细shjh_voucherentrynum) - IT_ITEMS.put("KOSTL",KOSTL);//成本中心_成本中心(付款单shjh_costcenter) - IT_ITEMS.put("PRCTR",PRCTR);//利润中心_利润中心(付款单shjh_pc) - IT_ITEM.add(IT_ITEMS); } } @@ -170,11 +217,62 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl return IT_ITEM; } + private JSONArray getIT_CLEAR(DynamicObject bill) { + JSONArray IT_CLEAR = new JSONArray();//清账数据,参考《IT_CLEAR》,仅清账需要输入 + //客户(bd_customer)||供应商(bd_supplier) 收款人id:payee + String payeetype = bill.getString("payeetype");//收款人类型 + String customerOrsupnum = getCustomerOrSupplierNumber(payeetype, bill); + DynamicObjectCollection entrys = bill.getDynamicObjectCollection("entry"); + for (DynamicObject entry : entrys) { + JSONObject jsonObject = new JSONObject(); + String BUKRS = ""; + if (null != bill.getDynamicObject("openorg")) { + BUKRS = bill.getDynamicObject("openorg").getString("number"); + } + jsonObject.put("BUKRS", BUKRS);//公司代码 + jsonObject.put("BELNR", entry.getString("shjh_vouchernums"));//会计凭证编号 + jsonObject.put("GJAHR", entry.getString("shjh_voucheryear"));//会计年度 + jsonObject.put("BUZEI", entry.getString("shjh_voucherentrynum"));//行编号 + switch (payeetype) { + case "bd_customer": + jsonObject.put("KUNNR", customerOrsupnum); // 供应商编号_收款人id(付款单payee) + break; + case "bd_supplier": + jsonObject.put("LIFNR", customerOrsupnum); // 客户编号_收款人id(付款单payee) + break; + } + String HKONT = ""; + DynamicObject shjhSapkjkm = entry.getDynamicObject("shjh_sapkjkm");//sap会计科目 + if (null != shjhSapkjkm) { + HKONT = shjhSapkjkm.getString("number");//SAP会计科目 + } + jsonObject.put("HKONT", HKONT);//总账科目 + jsonObject.put("UMSKZ", "");//todo:特殊总账标识 + jsonObject.put("DMBTR", entry.getBigDecimal("e_actamt"));//todo:未清金额_实付金额 + IT_CLEAR.add(jsonObject); + } + return IT_CLEAR; + } + + private JSONArray getIS_CUSTOMERCPD(DynamicObject recBill) { + JSONArray IS_CUSTOMERCPD = new JSONArray(); + + // 提取公共字段(只需获取一次) +// String city = recBill.getString("shjh_city"); // todo:城市 +// String countryName = recBill.getString("shjh_country"); // todo:国家名称 + + JSONObject customerData = new JSONObject(); + customerData.put("NAME", recBill.getString("payeename")); // 收款人名称 + customerData.put("CITY", ""); + customerData.put("COUNTRY", ""); + customerData.put("BANK_ACCT", recBill.getString("payeebanknum"));// 收款账号 + IS_CUSTOMERCPD.add(customerData); + + return IS_CUSTOMERCPD; + } + /** * 根据收款人类型获取收款人编号 - * @param payeetype - * @param bill - * @return */ private String getCustomerOrSupplierNumber(String payeetype, DynamicObject bill) { String customerOrsupnum = ""; diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/task/PaybillPushSAPTask.java b/main/java/shjh/jhzj7/fi/fi/plugin/task/PaybillPushSAPTask.java new file mode 100644 index 0000000..aab0350 --- /dev/null +++ b/main/java/shjh/jhzj7/fi/fi/plugin/task/PaybillPushSAPTask.java @@ -0,0 +1,66 @@ +package shjh.jhzj7.fi.fi.plugin.task; + +import kd.bos.context.RequestContext; +import kd.bos.dataentity.OperateOption; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.entity.operate.OperateOptionConst; +import kd.bos.entity.operate.result.OperationResult; +import kd.bos.exception.KDException; +import kd.bos.logging.Log; +import kd.bos.logging.LogFactory; +import kd.bos.orm.query.QCP; +import kd.bos.orm.query.QFilter; +import kd.bos.schedule.executor.AbstractTask; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.operation.OperationServiceHelper; +import kd.sdk.plugin.Plugin; + +import java.util.ArrayList; +import java.util.Map; + +/** + * 付款单推送SAP凭证定时任务 + */ +public class PaybillPushSAPTask extends AbstractTask implements Plugin { + + private final static Log logger = LogFactory.getLog(PaybillPushSAPTask.class); + @Override + public void execute(RequestContext requestContext, Map map) throws KDException { + + QFilter q1 = new QFilter("shjh_ispushsap", QCP.equals, false);//付款单是否推送SAP = 否 + QFilter q2 = new QFilter("paymentidentify.number", QCP.equals, "FKBS01");//付款标识为主动付款 + QFilter q3 = new QFilter("shjh_sourcesystem", QCP.equals, "A");//来源系统,A_sap,B_fk + QFilter q4 = new QFilter("paymentidentify.number", QCP.equals, "FKBS02");//付款标识为被动付款 + QFilter filter = q1.and((q2.and(q3)).or(q4));//是否推送SAP为否 + 主动且来源系统为SAP + 被动所有 + DynamicObject[] paybills = BusinessDataServiceHelper.load("cas_paybill", "id", filter.toArray()); + if (paybills.length!=0){ + ArrayList ids = new ArrayList<>(); + for (DynamicObject dynamicObject : paybills) { + ids.add(dynamicObject.getLong("id")); + } + Map recBillMap = BusinessDataServiceHelper.loadFromCache(ids.toArray(), "cas_paybill"); + OperateOption operateOption = OperateOption.create(); + // 不执行警告级别校验器 + operateOption.setVariableValue(OperateOptionConst.IGNOREWARN, String.valueOf(true)); + // 不显示交互提示,自动执行到底 + operateOption.setVariableValue(OperateOptionConst.IGNOREINTERACTION, String.valueOf(true)); + // 全部校验通过才保存 + operateOption.setVariableValue(OperateOptionConst.STRICTVALIDATION, String.valueOf(true)); + //同一个用户在多个界面操作同一张,也不允许操作 + operateOption.setVariableValue(OperateOptionConst.MUTEX_ISSTRICT, String.valueOf(true)); + for (DynamicObject dynamicObject : recBillMap.values()) { + // 注意:executeOperate 需要一个数组形式的 DynamicObject[] + DynamicObject[] billArray = new DynamicObject[]{dynamicObject}; + OperationResult operationResult = OperationServiceHelper.executeOperate("pushsap", "cas_paybill", billArray, operateOption); + // 可以根据需要处理 operationResult,例如检查是否成功、获取返回值等 + if (operationResult.isSuccess()) { + logger.info("执行 pushsap 成功,单据编号:" + dynamicObject.getPkValue()); + } else { + logger.error(operationResult.getMessage()); + } + } + } + + + } +} diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/task/QuerySapCreatePayApplyTask.java b/main/java/shjh/jhzj7/fi/fi/plugin/task/QuerySapCreatePayApplyTask.java new file mode 100644 index 0000000..d69b37c --- /dev/null +++ b/main/java/shjh/jhzj7/fi/fi/plugin/task/QuerySapCreatePayApplyTask.java @@ -0,0 +1,398 @@ +package shjh.jhzj7.fi.fi.plugin.task; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import kd.bos.context.RequestContext; +import kd.bos.dataentity.OperateOption; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; +import kd.bos.dataentity.utils.StringUtils; +import kd.bos.entity.operate.OperateOptionConst; +import kd.bos.entity.operate.result.OperationResult; +import kd.bos.exception.KDException; +import kd.bos.logging.Log; +import kd.bos.logging.LogFactory; +import kd.bos.orm.query.QCP; +import kd.bos.orm.query.QFilter; +import kd.bos.schedule.executor.AbstractTask; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.operation.OperationServiceHelper; +import shjh.jhzj7.fi.fi.utils.JhzjUtils; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import static shjh.jhzj7.fi.fi.plugin.form.SappzFormPlugin.*; +import static shjh.jhzj7.fi.fi.utils.SapUtils.vouchers_payable; +import static shjh.jhzj7.fi.fi.webapi.ApplyBillControler.*; + +/** + * 定时调用SAP应付凭证接口生成付款申请单,过滤参数仅为临期 + */ +public class QuerySapCreatePayApplyTask extends AbstractTask { + public static final String apimenthod = "定时调用SAP应付凭证接口生成付款申请单(临期)";//bd_accountview + + private final static Log logger = LogFactory.getLog(QuerySapCreatePayApplyTask.class); + @Override + public void execute(RequestContext requestContext, Map map) throws KDException { + + String lq = (String)map.get("临期"); +// int daysToAdd = Integer.parseInt(lq); + int daysToAdd = 365;//1600000001 1600000009 + + String dateStr = "2025-01-01"; + DateTimeFormatter format = DateTimeFormatter.ISO_LOCAL_DATE; + LocalDate currentDate = LocalDate.parse(dateStr, format);// 获取当前日期 + +// LocalDate currentDate = LocalDate.now();// 获取当前日期 + LocalDate newDate = currentDate.plusDays(daysToAdd);// 计算新日期 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");// 格式化日期 + + String formattedoldDate = currentDate.format(formatter);//开始日期 + String formattedNewDate = newDate.format(formatter);//结束日期 + + JSONArray IT_LIST = new JSONArray(); + // 添加SAP应付凭到期日过滤条件 + addFilterCondition(IT_LIST, "FAEDT", formattedoldDate, formattedNewDate); + JSONObject result = vouchers_payable(IT_LIST, "临期:"+lq); + if (null != result && result.containsKey("data")) { + // 处理查询结果 + JSONObject data = (JSONObject) result.get("data"); + if (null != data && data.containsKey("IT_ITEM")) { + JSONArray IT_ITEMs = (JSONArray) data.get("IT_ITEM"); + if (!IT_ITEMs.isEmpty()) { + Map payapplys = getPayapply(IT_ITEMs); + + //若多条数据相同,则合并为一条数据处理 + if (payapplys != null) { + for (DynamicObject ap_payapply : payapplys.values()) { + String fkBillNum = ap_payapply.getString("shjh_vouchernum"); + OperateOption option = OperateOption.create(); + option.setVariableValue(OperateOptionConst.IGNOREWARN, String.valueOf(false)); // 不执行警告级别校验器 + // 新增数据 + OperationResult saveResult = OperationServiceHelper.executeOperate("save", AP_PAYAPPLY, new DynamicObject[]{ap_payapply}, option); + if (!saveResult.isSuccess()) { + handleAndLogError(saveResult, "保存失败", apimenthod, fkBillNum, IT_ITEMs.toString()); + return; + } + OperationResult submitResult = OperationServiceHelper.executeOperate("submit", AP_PAYAPPLY, new DynamicObject[]{ap_payapply}, option); + if (!submitResult.isSuccess()) { + // 提交失败,将保存的数据删除,记录日志 + OperationServiceHelper.executeOperate("delete", AP_PAYAPPLY, new DynamicObject[]{ap_payapply}, option); + handleAndLogError(submitResult, "提交失败", apimenthod, fkBillNum, IT_ITEMs.toString()); + return; + } + OperationResult auditResult = OperationServiceHelper.executeOperate("audit", AP_PAYAPPLY, new DynamicObject[]{ap_payapply}, option); + if (!auditResult.isSuccess()) { + handleAndLogError(auditResult, "审核失败", apimenthod, fkBillNum, IT_ITEMs.toString()); + return; + } + logger.error("审核成功,凭证号:" + fkBillNum); + JhzjUtils.saveLog(fkBillNum, apimenthod, IT_ITEMs.toString(), null, true, "API"); + } + } + } + } + } + } + + /** + * 通过SAP接口查询应付凭证数据,并生成应付付款申请单 + */ + private Map getPayapply(JSONArray IT_ITEMs){ + Map bills = new HashMap<>(); + for (Object itItem : IT_ITEMs) { + JSONObject it_list = (JSONObject) itItem; + String bukrs = it_list.getString("BUKRS");//公司编号 + String fkBillNum = it_list.getString("BELNR");//凭证号 + String gjahr = it_list.getString("GJAHR");//会计年度 + String accountingsubject = it_list.getString("SAKNR");//会计科目 + String ebelp = it_list.getString("EBELP");//会计科目行项目号 + BigDecimal wrbtr = new BigDecimal(it_list.getString("WRBTR"));//未清金额 + //汇率 + BigDecimal KURSF = new BigDecimal(it_list.getString("KURSF")); + if (KURSF.compareTo(BigDecimal.ZERO) == 0) { + KURSF = BigDecimal.ONE; + } + BigDecimal dmbtr = new BigDecimal(it_list.getString("DMBTR"));//申请金额折结算币别 + Date FAEDTs = null;//到期日,净价到期日 + String FAEDT = it_list.getString("FAEDT"); + if (StringUtils.isNotEmpty(FAEDT)) { + FAEDTs = StrToDate(FAEDT); + } + Date BUDATs = null;//记账日期,凭证中的过帐日期 + String BUDAT = it_list.getString("BUDAT"); + if (StringUtils.isNotEmpty(BUDAT)) { + BUDATs = StrToDate(BUDAT); + } + Date BLDATs = null;//凭证日期,凭证中的凭证日期 + String BLDAT = it_list.getString("BLDAT"); + if (StringUtils.isNotEmpty(BLDAT)) { + BLDATs = StrToDate(BLDAT); + } + Date ZFBDTs = null;//基准日期,用于到期日计算的基准日期 + String ZFBDT = it_list.getString("ZFBDT"); + if (StringUtils.isNotEmpty(ZFBDT)) { + ZFBDTs = StrToDate(ZFBDT); + } + String shjh_payee = "";//往来类型 + String shjh_payeebanknum = "";//往来户名称 + String kunnr = it_list.getString("KUNNR");//客户(员工) + String lifnr = it_list.getString("LIFNR");//供应商 + if (StringUtils.isNotEmpty(kunnr)) { + shjh_payee = "客户"; + shjh_payeebanknum = kunnr; + } else { + shjh_payee = "供应商"; + shjh_payeebanknum = lifnr; + } + String assacct = it_list.getString("BVTYP");//合作银行类型 + //todo:原因码 + String reasoncode = "014"; + //todo:资金计划分类 + String zreqDept = it_list.getString("ZREQ_DEPT");//二级部门 + String procurementeam = it_list.getString("EKGRP");//采购组 + String isselfprocurment = it_list.getString("ZZXCG_FLAG");//是否自行采购 + String waers = it_list.getString("WAERS");//付款币别编号CNY,货币码 && 结算币别编号,货币码 + + // 公司编号 bukrs + QFilter Q1 = new QFilter("number", QCP.equals, bukrs); + DynamicObject org = BusinessDataServiceHelper.loadSingle(orgEntName, new QFilter[]{Q1}); + + // 申请金额 , 汇率 , 申请金额折结算币别 + BigDecimal amount = BigDecimal.ZERO; + // 未清金额 amount + try { + wrbtr = wrbtr.setScale(2, RoundingMode.HALF_UP); + amount = wrbtr; + } catch (NumberFormatException e) { + logger.error("未清金额格式错误", e.getMessage()); + return null; + } + // 往来类型 shjh_payee + // 往来户 party + QFilter Q3 = new QFilter("number", QCP.equals, shjh_payeebanknum); + DynamicObject party = "供应商".equals(shjh_payee) + ? BusinessDataServiceHelper.loadSingle(BD_SUPPLIER, new QFilter[]{Q3}) + : BusinessDataServiceHelper.loadSingle(BD_CUSTOMER, new QFilter[]{Q3}); + + // 新增应付付款申请单 + DynamicObject ap_payapply = BusinessDataServiceHelper.newDynamicObject(AP_PAYAPPLY); + + //防重校验条件1:根据入参中的应付凭证ID作为唯一值,去金蝶的付款申请单中查找有无此记录,如果有且单据中SAP锁定 + // 状态为已锁定,则校验失败,记录日志。数据库层面,将应付凭证ID建立唯一约束。 + QFilter Q4 = new QFilter("shjh_vouchernum", QCP.equals, fkBillNum);//凭证号 + QFilter Q5 = new QFilter("applyorg.number", QCP.equals, bukrs); + QFilter Q6 = new QFilter("shjh_voucheryear", QCP.equals, gjahr);//会计年度 + QFilter Q7 = new QFilter("shjh_voucherentrynum", QCP.equals, ebelp);//会计科目行项目号 + DynamicObject ap_payapplys = BusinessDataServiceHelper.loadSingle(AP_PAYAPPLY, new QFilter[]{Q4, Q5, Q6, Q7}); + if (null != ap_payapplys) { + boolean shjhSapwhetherlocking = ap_payapplys.getBoolean("shjh_sapwhetherlocking");//SAP是否锁定 + if (shjhSapwhetherlocking) { + logger.error("同步失败,凭证号:" + fkBillNum + "的费控单据已锁定"); + return null; + } else { + //todo:存在且单据中SAP锁定状态为未锁定,更新数据 + ap_payapply = ap_payapplys; + } + } + + ap_payapply.set("settleorg", org); // 结算组织 + ap_payapply.set("applyorg", org); // 申请组织 + ap_payapply.set("payorg", org); // 付款组织 + ap_payapply.set("purorg", org); // 采购组织 + + // 申请日期 + ap_payapply.set("applydate", BUDATs); + + //SAP会计科目 + if (accountingsubject != null && !accountingsubject.isEmpty()) { + QFilter Q8 = new QFilter("number", QCP.equals, accountingsubject); + DynamicObject accountview = BusinessDataServiceHelper.loadSingle(BD_ACCOUNTVIEW, new QFilter[]{Q8}); + ap_payapply.set("shjh_sapkjkm", accountview); + } + + //请款事由 + ap_payapply.set("applycause", ""); + + //币别 + String[][] currencyInfo = { + {"paycurrency", "付款币别"}, + {"settlecurrency", "结算币别"} + }; + for (String[] info : currencyInfo) { + String currencyType = info[0]; + String currencyTypeName = info[1]; + // 根据币别类型从 applybill 获取对应的币别编号 + String currencyNumber = waers; + if ("RMB".equals(currencyNumber)) { + currencyNumber = "CNY"; + } + QFilter filter = new QFilter("number", QCP.equals, currencyNumber); + DynamicObject currency = BusinessDataServiceHelper.loadSingle(BD_CURRENCY, new QFilter[]{filter}); + ap_payapply.set(currencyType, currency); + } + //汇率 + try { + KURSF = KURSF.setScale(5, RoundingMode.HALF_UP); + ap_payapply.set("exchangerate", KURSF); + } catch (NumberFormatException e) { + return null; + } + + //申请金额折结算币别 + try { + dmbtr = dmbtr.setScale(2, RoundingMode.HALF_UP); + ap_payapply.set("appseleamount", dmbtr); + } catch (NumberFormatException e) { + return null; + } + + DynamicObjectCollection entry = ap_payapply.getDynamicObjectCollection("entry");//明细 + entry.clear(); + DynamicObject ap_payapply_entry = entry.addNew(); + // 定义往来类型和对应值的映射 + Map asstactTypeMap = new HashMap<>(); + asstactTypeMap.put("供应商", "bd_supplier"); + asstactTypeMap.put("客户", "bd_customer"); + // 根据往来类型设置值 + ap_payapply_entry.set("e_asstacttype", asstactTypeMap.get(shjh_payee)); + // 往来户 + ap_payapply_entry.set("e_asstact", party); + + //如果往来户为供应商,才会有往来账户和银行,根据供应商银行分录里面的合作银行类型来确定往来账户和银行 + //往来账户 && 往来银行 + if ("供应商".equals(shjh_payee)) { + DynamicObjectCollection bankentrys = party.getDynamicObjectCollection("entry_bank");//银行信息分录 + if (!bankentrys.isEmpty()) { + for (DynamicObject bankentry : bankentrys) { + if (assacct.equals(bankentry.getString("shjh_banktype"))) { + ap_payapply_entry.set("e_assacct", bankentry.getString("bankaccount"));//银行账号 + ap_payapply_entry.set("e_bebank", bankentry.getDynamicObject("bank"));//开户银行 + } + } + } + } + //到期日 + ap_payapply_entry.set("e_duedate", FAEDTs); + //分录申请金额 + ap_payapply_entry.set("e_applyamount", amount); + //表头申请金额 + ap_payapply.set("applyamount", amount); + + //todo:结算方式 + + //付款类型:取值范围:对公付款、对私付款;SAP:科目编号1221020200 对私付款。费控:劳务人员报销单 对私付款。其他均赋值为对公付款。 + if ("1221020200".equals(accountingsubject)) { + QFilter Q9 = new QFilter("name", QCP.equals, "对私付款"); + DynamicObject paytype = BusinessDataServiceHelper.loadSingle(CAS_PAYMENTBILLTYPE, new QFilter[]{Q9}); + if (null != paytype) { + ap_payapply_entry.set("e_paymenttype", paytype); + } + } else { + QFilter Q9 = new QFilter("name", QCP.equals, "对公付款"); + DynamicObject paytype = BusinessDataServiceHelper.loadSingle(CAS_PAYMENTBILLTYPE, new QFilter[]{Q9}); + if (null != paytype) { + ap_payapply_entry.set("e_paymenttype", paytype); + } + } + + /* + ---------------------------------------------------默认字段---------------------------------------------------- + */ + //单据类型 + QFilter Q8 = new QFilter("name", QCP.equals, "其他付款申请"); + DynamicObject billtype = BusinessDataServiceHelper.loadSingle(BOS_BILLTYPE, new QFilter[]{Q8}); + if (null != billtype) { + ap_payapply.set("billtype", billtype); + } + + //汇率表 + QFilter Q10 = new QFilter("number", QCP.equals, "ERT-01"); + DynamicObject exrate = BusinessDataServiceHelper.loadSingle(BD_EXRATETABLE, new QFilter[]{Q10}); + if (null != exrate) { + ap_payapply.set("exratetable", exrate); + } + ap_payapply.set("billstatus", "A");//状态:暂存 + + //select * from t_ap_applypaybill where fid = 2148014743875508224 or fid = 2148018902158815232 + //单头:申请人,approvalamount(核准金额),aprseleamount(核准金额折结算币),paystatus(付款状态),freezestate(冻结状态), + // quotation(换算方式),billsrctype(单据来源类型) + //申请人 + long currUserId = RequestContext.get().getCurrUserId();//当前用户 creator + ap_payapply.set("creator", currUserId); + // 核准金额 + ap_payapply.set("approvalamount", amount); + // 核准金额折结算币 + ap_payapply.set("aprseleamount", dmbtr);//Unpaid + // 付款状态 + ap_payapply.set("paystatus", "Unpaid");//未付款 + // 冻结状态 + ap_payapply.set("freezestate", "unfreeze");//未冻结 + // 换算方式 + ap_payapply.set("quotation", "0");//直接汇率 + // 单据来源类型 + ap_payapply.set("billsrctype", "2");//后台生成 + //select * from t_ap_applypaybillentry where fid = 2148014743875508224 or fid = 2148018902158815232 + //明细:seq,e_approvedamt(核准金额),e_approvedseleamt(核准金额折结算币),e_corebilltype(核心单据类型),e_freezestate(冻结状态), + // e_creator(创建人),e_closestatus(行关闭状态) + // 序号 + ap_payapply_entry.set("seq", 1); + // 核准金额 + ap_payapply_entry.set("e_approvedamt", amount); + // 核准金额折结算币 + ap_payapply_entry.set("e_approvedseleamt", dmbtr); + // 核心单据类型 + ap_payapply_entry.set("e_corebilltype", "pm_purorderbill");//采购订单 + // 冻结状态 + ap_payapply_entry.set("e_freezestate", "unfreeze");//未冻结 + // 创建人 + ap_payapply_entry.set("e_creator", currUserId); + // 行关闭状态 + ap_payapply_entry.set("e_closestatus", "A");//正常 + //SAP应付凭证号 + ap_payapply.set("shjh_vouchernum", fkBillNum); + //SAP应付凭证行号 + ap_payapply.set("shjh_voucherentrynum", ebelp); + //SAP应付凭证会计年度 + ap_payapply.set("shjh_voucheryear", gjahr); + //采购组 + ap_payapply.set("shjh_procurementteam", procurementeam); + //是否自行采购 + ap_payapply.set("shjh_zxcg", isselfprocurment); + //原因码 + if (reasoncode != null && !reasoncode.isEmpty()) { + QFilter Q11 = new QFilter("number", QCP.equals, reasoncode); + DynamicObject cause = BusinessDataServiceHelper.loadSingle(GL_CASHFLOWITEM, new QFilter[]{Q11}); + ap_payapply.set("shjh_yym", cause); + } + //todo:汇率日期,支付渠道 文档20-36(7.1.3) + //过账日期(记账) + ap_payapply.set("shjh_bookkeepingdate", BUDATs); + //凭证日期 + ap_payapply.set("shjh_documentdate", BLDATs); + //凭证类型 + //基准日期 + ap_payapply.set("shjh_basedate", ZFBDTs); + //付款条件 + ap_payapply.set("shjh_fktj", ""); + //参照发票号 + ap_payapply.set("shjh_czfph", ""); + //来源系统 + ap_payapply.set("shjh_sourcesystem", "A");//SAP + //到期日 + ap_payapply.set("shjh_duedate", FAEDTs); + + //SAP应付凭证ID:金蝶组装:公司编号+SAP应付凭证会计年度+SAP应付凭证号+SAP应付凭证行号 + ap_payapply.set("shjh_sapuniquevalue", bukrs + gjahr + fkBillNum + ebelp); + bills.put(ap_payapply.getString("shjh_sapuniquevalue"), ap_payapply); + + } + return bills; + } +} diff --git a/main/java/shjh/jhzj7/fi/fi/utils/SapUtils.java b/main/java/shjh/jhzj7/fi/fi/utils/SapUtils.java index d3c6c55..db3de54 100644 --- a/main/java/shjh/jhzj7/fi/fi/utils/SapUtils.java +++ b/main/java/shjh/jhzj7/fi/fi/utils/SapUtils.java @@ -71,6 +71,11 @@ public class SapUtils { public static final String QUERY_STATE_URL = "https://hipint-stg.jahwa.com.cn:6443/gateway/HIP_ReceiveFromFM/1.0/fm/send"; // public static final String withholdingUrl = "https://hipint.jahwa.com.cn:6443/gateway//HIP_ReceiveFromFM/1.0/fm/send"; public static final String RECEIVER_ID4 = "SAP"; + private static final String Apimenthod10 = "SAP应付凭证数据校验"; + private static final String interfaceID10 = "ValidatePayableVoucher";//识别被调接口并进行路由 + + private static final String Apimenthod9 = "费控数据校验"; + private static final String interfaceID9 = "GetPaymentInfo";//识别被调接口并进行路由 /** @@ -401,6 +406,90 @@ public class SapUtils { return pendingsBody; } + /** + * SAP应付凭证数据校验 + */ + public static JSONObject sap_validation(JSONObject data, String billno) { + Map thirdPartyMap = new HashMap<>(); + thirdPartyMap.put("interfaceID", interfaceID10); + thirdPartyMap.put("receiverID", receiverID1); + thirdPartyMap.put("URL", sapArUrl); + thirdPartyMap.put("billno", billno); + + // 获取当前日期和时间 + LocalDateTime date = LocalDateTime.now(); + // 定义日期时间格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); + // 格式化当前日期和时间 + String dates = date.format(formatter); + thirdPartyMap.put("createdatetime", dates); + // 组装请求体 + JSONObject sapValidationBody = sapValidationBody(data); + // 发送请求并处理响应 + return processRequest(sapValidationBody, thirdPartyMap, Apimenthod10); + } + + /** + * SAP应付凭证数据校验组装请求体: + * @return 请求体的 JSON 对象 + */ + private static JSONObject sapValidationBody(JSONObject data) { + // 获取当前日期和时间 + LocalDateTime date = LocalDateTime.now(); + // 定义日期时间格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); + // 格式化当前日期和时间 + String dates = date.format(formatter); + //组装请求体 + JSONObject pendingsBody = new JSONObject(); + pendingsBody.put("rootContextID", "" + System.currentTimeMillis());//唯一事务ID,采用UUID或其他强唯一性ID + pendingsBody.put("requestTime", dates);//请求时间,格式为yyyy-MM-dd HH:mm:ss.SSS + pendingsBody.put("data", data); + return pendingsBody; + } + + /** + * FK数据校验 + * 先付后记(其他付款、劳务报销单、SAP会员退卡单)获取付款信息 + */ + public static JSONObject fk_validation(JSONObject data, String billno) { + Map thirdPartyMap = new HashMap<>(); + thirdPartyMap.put("interfaceID", interfaceID9); + thirdPartyMap.put("receiverID", receiverID2); + thirdPartyMap.put("URL", unlockedUrl); + thirdPartyMap.put("billno", billno); + + // 获取当前日期和时间 + LocalDateTime date = LocalDateTime.now(); + // 定义日期时间格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); + // 格式化当前日期和时间 + String dates = date.format(formatter); + thirdPartyMap.put("createdatetime", dates); + // 组装请求体 + JSONObject fkValidationBody = fkValidationBody(data); + // 发送请求并处理响应 + return processRequest(fkValidationBody, thirdPartyMap, Apimenthod9); + } + + /** + * FK数据校验组装请求体: + * @return 请求体的 JSON 对象 + */ + private static JSONObject fkValidationBody(JSONObject data) { + // 获取当前日期和时间 + LocalDateTime date = LocalDateTime.now(); + // 定义日期时间格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); + // 格式化当前日期和时间 + String dates = date.format(formatter); + //组装请求体 + JSONObject pendingsBody = new JSONObject(); + pendingsBody.put("rootContextID", "" + System.currentTimeMillis());//唯一事务ID,采用UUID或其他强唯一性ID + pendingsBody.put("requestTime", dates);//请求时间,格式为yyyy-MM-dd HH:mm:ss.SSS + pendingsBody.put("data", data); + return pendingsBody; + } /** * 发送请求并处理响应