parent
573f10a1ad
commit
8cf1ef3ec7
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 = "";
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送请求并处理响应
|
||||
|
|
|
|||
Loading…
Reference in New Issue