--s
This commit is contained in:
weiyunlong 2025-03-27 18:00:07 +08:00
parent 573f10a1ad
commit 8cf1ef3ec7
6 changed files with 873 additions and 43 deletions

View File

@ -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);
}

View File

@ -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<String, HashSet<Long>> sourceBills = BFTrackerServiceHelper.findSourceBills(entity, new Long[]{billId});
HashSet<Long> longs = sourceBills.get(entity1);
if(longs!=null){
for (int i = 0; i < longs.size(); i++) {
Iterator<Long> iterator = longs.iterator();
Long next = iterator.next();
return next;
}
}
return null;
}
}

View File

@ -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 = "";

View File

@ -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<String, Object> 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<Long> ids = new ArrayList<>();
for (DynamicObject dynamicObject : paybills) {
ids.add(dynamicObject.getLong("id"));
}
Map<Object, DynamicObject> 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());
}
}
}
}
}

View File

@ -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<String, Object> 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<String, DynamicObject> 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<String, DynamicObject> getPayapply(JSONArray IT_ITEMs){
Map<String, DynamicObject> 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<String, String> 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;
}
}

View File

@ -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<String, Object> 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<String, Object> 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;
}
/**
* 发送请求并处理响应