推送凭证(付款)__特大优化

--s
This commit is contained in:
weiyunlong 2025-06-26 15:55:12 +08:00
parent 585d18afd8
commit da79adb2d3
2 changed files with 668 additions and 69 deletions

View File

@ -97,23 +97,20 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl
JSONObject data = new JSONObject(); JSONObject data = new JSONObject();
//抬头 //抬头
JSONObject isHeader = getIS_HEADER(bill); JSONObject isHeader = getIS_HEADER(bill);
data.put("IS_HEADER", isHeader);
//金蝶生成的凭证信息 // 前提:若无凭证,校验
data.put("IT_ITEM", getIT_ITEM(bill, isHeader)); // :
Boolean isqingdan = true; // 1.遍历付款单明细分录,若任意一行中存在SAP凭证号:组装明细XX,拿号调方法(W);遍历票据分录,拿票据号,查收款单(将表头凭证信息)_无行编号,SAP会计科目(从收款单对应凭证取借方),清张金额取票据(转让金额)
//来源系统SAP时,清账(SAP凭证数据) // 2.若无SAP凭证号:联查凭证(遍历,借方iteam{SGTXT:凭证行摘要},遍历票_查收款单(将表头凭证信息):行没有)
if ("A".equals(shjhSourcesystem)) { // 非票:
// 票据信息 // 1.来源SAP :(iteam{})
DynamicObjectCollection casDraftinfos = bill.getDynamicObjectCollection("cas_draftinfo"); // 2.else
if (!casDraftinfos.isEmpty()) { QFilter q1 = new QFilter("sourcebill", QCP.equals, bill.getPkValue());
data.put("IT_ITEM", null); QFilter q2 = new QFilter("billstatus",QCP.equals,"C");
isqingdan = false; DynamicObject gl_voucher = BusinessDataServiceHelper.loadSingle("gl_voucher",
} "id,description,shjh_fjz,sourcebill,entries,entries.account,entries.debitlocal,entries.creditlocal,entries.entrydc,entries.edescription,vouchertype,entries.assgrp",
//清账数据参考IT_CLEAR仅清账需要输入 new QFilter[]{q1, q2});
data.put("IT_CLEAR", getIT_CLEAR(bill)); if (null == gl_voucher) {
}
//不清却为空,校验
if (isqingdan && data.getJSONArray("IT_ITEM").isEmpty()) {
OperateErrorInfo operateErrorInfo = new OperateErrorInfo(); OperateErrorInfo operateErrorInfo = new OperateErrorInfo();
operateErrorInfo.setMessage("推送SAP凭证接口失败,原因:金蝶凭证未生成或未审核"); operateErrorInfo.setMessage("推送SAP凭证接口失败,原因:金蝶凭证未生成或未审核");
operateErrorInfo.setErrorLevel(ErrorLevel.Error.name()); operateErrorInfo.setErrorLevel(ErrorLevel.Error.name());
@ -121,6 +118,601 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl
this.operationResult.addErrorInfo(operateErrorInfo); this.operationResult.addErrorInfo(operateErrorInfo);
return; return;
} }
JSONArray IT_CLEAR = new JSONArray();//清账数据参考IT_CLEAR仅清账需要输入
JSONArray IT_ITEM = new JSONArray();
// 票据信息
DynamicObjectCollection casDraftinfos = bill.getDynamicObjectCollection("cas_draftinfo");
if (!casDraftinfos.isEmpty()) {
isHeader.put("BLART", gl_voucher.getString("vouchertype.number"));//凭证类型-从金蝶凭证中获取
boolean isSAP = false;
//明细
DynamicObjectCollection entrys = bill.getDynamicObjectCollection("entry");
for (DynamicObject entry : entrys) {
String shjhVouchernums = entry.getString("shjh_vouchernums");
if (StringUtils.isNotEmpty(shjhVouchernums)) {
isSAP = true;
break;
}
}
//若任意一行中存在SAP凭证号:clear:遍历明细,拿号调方法(W);遍历票据分录,拿票据号,查收款单(将表头凭证信息)_无行编号,
// SAP会计科目(从收款单对应凭证取借方),清张金额取票据(转让金额)
if (isSAP) {
//1.遍历明细
for (DynamicObject entry : entrys) {
String BUKRS = "";
if (null != bill.getDynamicObject("openorg")) {
BUKRS = bill.getDynamicObject("openorg").getString("number");
}
if (StringUtils.isEmpty(BUKRS)) {
BUKRS = bill.getDynamicObject("org").getString("number");
}
//客户(bd_customer)||供应商(bd_supplier) 收款人id:payee
String payeetype = bill.getString("payeetype");//收款人类型
AtomicReference<String> customerOrsupnum = new AtomicReference<>(getCustomerOrSupplierNumber(payeetype, bill, "payee"));
JSONObject jsonObject = new JSONObject();
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", JhzjUtils.getUMSKZ(HKONT));//特殊总账标识
jsonObject.put("DMBTR1", entry.getBigDecimal("e_actamt"));//清账金额_实付金额
IT_CLEAR.add(jsonObject);
}
//2.遍历票
for (DynamicObject casDraftinfo : casDraftinfos) {
DynamicObject draftbillinfo = casDraftinfo.getDynamicObject("draftbillinfo");//结算号
QFilter qFilter = new QFilter("cas_draftinfo.draftbillinfo.id", QCP.equals, draftbillinfo.getLong("id"));
//根据票据号过滤收款单
DynamicObject casRecbill = BusinessDataServiceHelper.loadSingle("cas_recbill", qFilter.toArray());
if (null != casRecbill) {
JSONObject jsonObject = new JSONObject();
String BUKRS = "";
if (null != bill.getDynamicObject("openorg")) {
BUKRS = bill.getDynamicObject("openorg").getString("number");
}
if (StringUtils.isEmpty(BUKRS)) {
BUKRS = bill.getDynamicObject("org").getString("number");
jsonObject.put("BUKRS", BUKRS);//公司代码
jsonObject.put("BELNR", casRecbill.getString("shjh_vouchernum"));//会计凭证编号
jsonObject.put("GJAHR", casRecbill.getString("shjh_sapfiscalyear"));//会计年度
//客户(bd_customer)||供应商(bd_supplier) 收款人id:payee
String payeetype = bill.getString("payeetype");//收款人类型
AtomicReference<String> customerOrsupnum = new AtomicReference<>(getCustomerOrSupplierNumber(payeetype, bill, "payee"));
switch (payeetype) {
case "bd_customer":
jsonObject.put("KUNNR", customerOrsupnum); // 客户编号_收款人id(付款单payee)
break;
// case "bd_supplier":
// jsonObject.put("LIFNR", customerOrsupnum); // 供应商编号_收款人id(付款单payee)
// break;
}
//查收款对应凭证
QFilter q3 = new QFilter("sourcebill", QCP.equals, casRecbill.getPkValue());
QFilter q4 = new QFilter("billstatus",QCP.equals,"C");
DynamicObject gl_vouchers = BusinessDataServiceHelper.loadSingle("gl_voucher",
"id,description,shjh_fjz,sourcebill,entries,entries.account,entries.debitlocal,entries.creditlocal,entries.entrydc,entries.edescription,vouchertype,entries.assgrp",
new QFilter[]{q3, q4});
//SAP会计科目(从收款单对应凭证取借方)
if (null != gl_vouchers) {
DynamicObjectCollection entries = gl_vouchers.getDynamicObjectCollection("entries");
for (int i = 0; i < entries.size(); i++) {
DynamicObject entry = entries.get(i);
String entrydc = (String) entry.get("entrydc");//分录方向(1.借方,-1.贷方)
if ("1".equals(entrydc)) {
//判断完借方,然后判断I下标,i==0,Hang ->001 i==1,Hang ->002
// if (i == 0) {
// jsonObject.put("BUZEI", "001");//todo:行编号_凭证明细序号0001
// } else if (i == 1) {
// jsonObject.put("BUZEI", "002");
// }
jsonObject.put("BUZEI", "001");//todo:行编号_凭证明细序号0001
DynamicObject account = entry.getDynamicObject("account");//科目
//核算维度(弹性域)_客户
if (null != account) {
jsonObject.put("HKONT", account.getString("number")); // 总账科目_科目(凭证分录account)
jsonObject.put("UMSKZ", JhzjUtils.getUMSKZ(account.getString("number")));//特殊总账标识
}
DynamicObject assgrpinfo = entry.getDynamicObject("assgrp");//核算维度(弹性域)
if(assgrpinfo != null){
DynamicObjectCollection gl_assist_bd = QueryServiceHelper.query("gl_assist_bd", "asstype,assval",
new QFilter[]{new QFilter("hg.id", QCP.equals, assgrpinfo.getPkValue())});
String asstype;
DynamicObject glassistbd;
DynamicObject hsxminfo;
for (int j = 0; j < gl_assist_bd.size(); j++) {
glassistbd = gl_assist_bd.get(j);
asstype = glassistbd.getString("asstype");//核算项目类型-对应核算维度的字段名
if("f000057".equals(asstype) || "f0001".equals(asstype)){
//t_bas_flex_property 表中获取对应编号 客户-获利段 f0001 客户编码 f000057
hsxminfo = QueryServiceHelper.queryOne("bd_customer", "id,name,number",
new QFilter[]{new QFilter("id", QCP.equals, glassistbd.getLong("assval"))});//维度值
jsonObject.put("KUNNR", hsxminfo.getString("number"));//客户
}
}
}
}
}
}
//清张金额取票据(转让金额)
jsonObject.put("DMBTR1",casDraftinfo.getBigDecimal("transamount"));//清账金额
}
IT_CLEAR.add(jsonObject);
}
}
}
//若无SAP凭证号:联查凭证(遍历,借方iteam{SGTXT:凭证行摘要},遍历票_查收款单(将表头凭证信息):行没有)
else {
DynamicObjectCollection entries = gl_voucher.getDynamicObjectCollection("entries");
for (DynamicObject entry : entries) {
String entrydc = (String) entry.get("entrydc");//分录方向(1.借方,-1.贷方)
if ("1".equals(entrydc)) {
//iteam
//todo:对header 凭证类型重新赋值
isHeader.put("BLART", gl_voucher.getString("vouchertype.number"));//凭证类型-从金蝶凭证中获取
if(!JhzjUtils.isEmpty(gl_voucher.getString("description"))){
isHeader.put("BKTXT", gl_voucher.getString("description"));//凭证抬头文本-从金蝶凭证中获取
}
DynamicObject assgrpinfo;
String asstype;
DynamicObject glassistbd;
DynamicObject hsxminfo;
JSONObject IT_ITEMS = new JSONObject();
DynamicObject account = entry.getDynamicObject("account");//科目
if (null != account) {
IT_ITEMS.put("HKONT", account.getString("number")); // 总账科目_科目(凭证分录account)
IT_ITEMS.put("UMSKZ", JhzjUtils.getUMSKZ(account.getString("number")));//特殊总账标识
}
IT_ITEMS.put("SGTXT", entry.getString("edescription"));//SAP凭证行摘要
//凭证反记账标识判断,如果凭证上已勾选则传X给sap
if(gl_voucher.getBoolean("shjh_fjz")){
IT_ITEMS.put("XNEGP", "X");
}
assgrpinfo = entry.getDynamicObject("assgrp");//核算维度(弹性域)
if(assgrpinfo != null){
DynamicObjectCollection gl_assist_bd = QueryServiceHelper.query("gl_assist_bd", "asstype,assval",
new QFilter[]{new QFilter("hg.id", QCP.equals, assgrpinfo.getPkValue())});
for (int j = 0; j < gl_assist_bd.size(); j++) {
glassistbd = gl_assist_bd.get(j);
asstype = glassistbd.getString("asstype");//核算项目类型-对应核算维度的字段名
if("f000057".equals(asstype) || "f0001".equals(asstype)){
//t_bas_flex_property 表中获取对应编号 客户-获利段 f0001 客户编码 f000057
hsxminfo = QueryServiceHelper.queryOne("bd_customer", "id,name,number",
new QFilter[]{new QFilter("id", QCP.equals, glassistbd.getLong("assval"))});//维度值
IT_ITEMS.put("KUNNR",hsxminfo.getString("number"));//客户
}else if("f000005".equals(asstype)){
//供应商 f000005
hsxminfo = QueryServiceHelper.queryOne("bd_supplier", "id,name,number",
new QFilter[]{new QFilter("id", QCP.equals, glassistbd.getLong("assval"))});//维度值
IT_ITEMS.put("LIFNR",hsxminfo.getString("number"));//供应商
}else if("f000012".equals(asstype)){
//利润中心 f000012
hsxminfo = QueryServiceHelper.queryOne("shjh_pc", "id,name,number",
new QFilter[]{new QFilter("id", QCP.equals, glassistbd.getLong("assval"))});//维度值
IT_ITEMS.put("PRCTR",hsxminfo.getString("number"));//利润中心_利润中心
}else if("f000011".equals(asstype)){
//成本中心 f000011
hsxminfo = QueryServiceHelper.queryOne("bos_costcenter", "id,name,number",
new QFilter[]{new QFilter("id", QCP.equals, glassistbd.getLong("assval"))});//维度值
IT_ITEMS.put("KOSTL",hsxminfo.getString("number"));//成本中心_成本中心
}else if("f000054".equals(asstype) || "f000014".equals(asstype)){
//原因码 f000014
//付款原因代码 f000054
hsxminfo = QueryServiceHelper.queryOne("gl_cashflowitem", "id,name,number",
new QFilter[]{new QFilter("id", QCP.equals, glassistbd.getLong("assval"))});//维度值
IT_ITEMS.put("RSTGR",hsxminfo.getString("number"));
}
}
gl_assist_bd = QueryServiceHelper.query("gl_assist_txt", "asstype,assval",
new QFilter[]{new QFilter("hg.id", QCP.equals, assgrpinfo.getPkValue())});//核算项目组合纵表-文本
for (int j = 0; j < gl_assist_bd.size(); j++) {
glassistbd = gl_assist_bd.get(j);
asstype = glassistbd.getString("asstype");//核算项目类型-对应核算维度的字段名
if("f000054".equals(asstype)){
//原因码 f000054
IT_ITEMS.put("RSTGR",glassistbd.getString("assval"));
}else if("f000056".equals(asstype)){
//分配编号 f000056
IT_ITEMS.put("ZUONR",glassistbd.getString("assval"));
}else if("f000023".equals(asstype)){
//税码 f000023
IT_ITEMS.put("MWSKZ",glassistbd.getString("assval"));
}else if("f000031".equals(asstype)){
//税基 f000031
IT_ITEMS.put("FWBAS",glassistbd.getString("assval"));
}else if("f000060".equals(asstype)){
//行项目的参考码
IT_ITEMS.put("XREF3",glassistbd.getString("assval"));
}
}
}
// 获取借方金额
BigDecimal debitlocal = (BigDecimal) entry.get("debitlocal");//借方
// 获取贷方金额
BigDecimal creditlocal = (BigDecimal) entry.get("creditlocal");//贷方
entrydc = (String) entry.get("entrydc");//分录方向(1.借方,-1.贷方)
// 进行空值检查
if (debitlocal != null && creditlocal != null && entrydc != null) {
BigDecimal amountToPut = BigDecimal.ZERO;
// 获取分录方向 若A,只拿一方,当前拿的借方
boolean isEntryDC1 = "1".equals(entrydc);
boolean isEntryDCNegative1 = "-1".equals(entrydc);
if (isEntryDC1) {
amountToPut = debitlocal;
} else if (isEntryDCNegative1) {
amountToPut = creditlocal.negate();//相反
}
IT_ITEMS.put("DMBTR", String.valueOf(amountToPut));
}
IT_ITEM.add(IT_ITEMS);
}
}
//2.遍历票
for (DynamicObject casDraftinfo : casDraftinfos) {
DynamicObject draftbillinfo = casDraftinfo.getDynamicObject("draftbillinfo");//结算号
QFilter qFilter = new QFilter("cas_draftinfo.draftbillinfo.id", QCP.equals, draftbillinfo.getLong("id"));
//根据票据号过滤收款单
DynamicObject casRecbill = BusinessDataServiceHelper.loadSingle("cas_recbill", qFilter.toArray());
if (null != casRecbill) {
JSONObject jsonObject = new JSONObject();
String BUKRS = "";
if (null != bill.getDynamicObject("openorg")) {
BUKRS = bill.getDynamicObject("openorg").getString("number");
}
if (StringUtils.isEmpty(BUKRS)) {
BUKRS = bill.getDynamicObject("org").getString("number");
}
jsonObject.put("BUKRS", BUKRS);//公司代码
jsonObject.put("BELNR", casRecbill.getString("shjh_vouchernum"));//会计凭证编号
jsonObject.put("GJAHR", casRecbill.getString("shjh_sapfiscalyear"));//会计年度
//客户(bd_customer)||供应商(bd_supplier) 收款人id:payee
String payeetype = bill.getString("payeetype");//收款人类型
AtomicReference<String> customerOrsupnum = new AtomicReference<>(getCustomerOrSupplierNumber(payeetype, bill, "payee"));
switch (payeetype) {
case "bd_customer":
jsonObject.put("KUNNR", customerOrsupnum); // 客户编号_收款人id(付款单payee)
break;
case "bd_supplier":
jsonObject.put("LIFNR", customerOrsupnum); // 供应商编号_收款人id(付款单payee)
break;
}
//查收款对应凭证
QFilter q3 = new QFilter("sourcebill", QCP.equals, casRecbill.getPkValue());
QFilter q4 = new QFilter("billstatus",QCP.equals,"C");
DynamicObject gl_vouchers = BusinessDataServiceHelper.loadSingle("gl_voucher",
"id,description,shjh_fjz,sourcebill,entries,entries.account," +
"entries.debitlocal,entries.creditlocal,entries.entrydc,entries.edescription," +
"vouchertype,entries.assgrp,entries.seq",
new QFilter[]{q3, q4});
//SAP会计科目(从收款单对应凭证取借方)
if (null != gl_vouchers) {
DynamicObjectCollection entriess = gl_vouchers.getDynamicObjectCollection("entries");
for (DynamicObject entry : entriess) {
String entrydc = (String) entry.get("entrydc");//分录方向(1.借方,-1.贷方)
if ("1".equals(entrydc)) {
DynamicObject account = entry.getDynamicObject("account");//科目
if (null != account) {
// jsonObject.put("BUZEI", entry.get("seq"));//行编号_凭证明细序号
jsonObject.put("BUZEI", "001");//行编号_凭证明细序号
jsonObject.put("HKONT", account.getString("number")); // 总账科目_科目(凭证分录account)
jsonObject.put("UMSKZ", JhzjUtils.getUMSKZ(account.getString("number")));//特殊总账标识
}
}
}
}
//清张金额取票据(转让金额)
jsonObject.put("DMBTR1",casDraftinfo.getBigDecimal("transamount"));//清账金额
IT_CLEAR.add(jsonObject);
}
}
}
}else {
// 非票:
// 1.来源SAP :(付款单查凭证:遍历分录:if贷iteam{钱取贷方} 遍历明细clear{})
// 2.else(item:付款单联查凭证:遍历分录{原逻辑})
isHeader.put("BLART", gl_voucher.getString("vouchertype.number"));//凭证类型-从金蝶凭证中获取
boolean isSAP = false;
//明细
DynamicObjectCollection entrys = bill.getDynamicObjectCollection("entry");
for (DynamicObject entry : entrys) {
String shjhVouchernums = entry.getString("shjh_vouchernums");
if (StringUtils.isNotEmpty(shjhVouchernums)) {
isSAP = true;
break;
}
}
if (isSAP) {
//付款单查凭证:遍历分录:if贷iteam{钱取贷方} 遍历明细clear{}
DynamicObjectCollection entries = gl_voucher.getDynamicObjectCollection("entries");
for (DynamicObject entry : entries) {
String entrydc = (String) entry.get("entrydc");//分录方向(1.借方,-1.贷方)
if ("-1".equals(entrydc)) {
//iteam
//todo:对header 凭证类型重新赋值
isHeader.put("BLART", gl_voucher.getString("vouchertype.number"));//凭证类型-从金蝶凭证中获取
if(!JhzjUtils.isEmpty(gl_voucher.getString("description"))){
isHeader.put("BKTXT", gl_voucher.getString("description"));//凭证抬头文本-从金蝶凭证中获取
}
DynamicObject assgrpinfo;
String asstype;
DynamicObject glassistbd;
DynamicObject hsxminfo;
JSONObject IT_ITEMS = new JSONObject();
DynamicObject account = entry.getDynamicObject("account");//科目
if (null != account) {
IT_ITEMS.put("HKONT", account.getString("number")); // 总账科目_科目(凭证分录account)
IT_ITEMS.put("UMSKZ", JhzjUtils.getUMSKZ(account.getString("number")));//特殊总账标识
}
IT_ITEMS.put("SGTXT", entry.getString("edescription"));//SAP凭证行摘要
//凭证反记账标识判断,如果凭证上已勾选则传X给sap
if(gl_voucher.getBoolean("shjh_fjz")){
IT_ITEMS.put("XNEGP", "X");
}
assgrpinfo = entry.getDynamicObject("assgrp");//核算维度(弹性域)
if(assgrpinfo != null){
DynamicObjectCollection gl_assist_bd = QueryServiceHelper.query("gl_assist_bd", "asstype,assval",
new QFilter[]{new QFilter("hg.id", QCP.equals, assgrpinfo.getPkValue())});
for (int j = 0; j < gl_assist_bd.size(); j++) {
glassistbd = gl_assist_bd.get(j);
asstype = glassistbd.getString("asstype");//核算项目类型-对应核算维度的字段名
if("f000057".equals(asstype) || "f0001".equals(asstype)){
//t_bas_flex_property 表中获取对应编号 客户-获利段 f0001 客户编码 f000057
hsxminfo = QueryServiceHelper.queryOne("bd_customer", "id,name,number",
new QFilter[]{new QFilter("id", QCP.equals, glassistbd.getLong("assval"))});//维度值
IT_ITEMS.put("KUNNR",hsxminfo.getString("number"));//客户
}else if("f000005".equals(asstype)){
//供应商 f000005
hsxminfo = QueryServiceHelper.queryOne("bd_supplier", "id,name,number",
new QFilter[]{new QFilter("id", QCP.equals, glassistbd.getLong("assval"))});//维度值
IT_ITEMS.put("LIFNR",hsxminfo.getString("number"));//供应商
}else if("f000012".equals(asstype)){
//利润中心 f000012
hsxminfo = QueryServiceHelper.queryOne("shjh_pc", "id,name,number",
new QFilter[]{new QFilter("id", QCP.equals, glassistbd.getLong("assval"))});//维度值
IT_ITEMS.put("PRCTR",hsxminfo.getString("number"));//利润中心_利润中心
}else if("f000011".equals(asstype)){
//成本中心 f000011
hsxminfo = QueryServiceHelper.queryOne("bos_costcenter", "id,name,number",
new QFilter[]{new QFilter("id", QCP.equals, glassistbd.getLong("assval"))});//维度值
IT_ITEMS.put("KOSTL",hsxminfo.getString("number"));//成本中心_成本中心
}else if("f000054".equals(asstype) || "f000014".equals(asstype)){
//原因码 f000014
//付款原因代码 f000054
hsxminfo = QueryServiceHelper.queryOne("gl_cashflowitem", "id,name,number",
new QFilter[]{new QFilter("id", QCP.equals, glassistbd.getLong("assval"))});//维度值
IT_ITEMS.put("RSTGR",hsxminfo.getString("number"));
}
}
gl_assist_bd = QueryServiceHelper.query("gl_assist_txt", "asstype,assval",
new QFilter[]{new QFilter("hg.id", QCP.equals, assgrpinfo.getPkValue())});//核算项目组合纵表-文本
for (int j = 0; j < gl_assist_bd.size(); j++) {
glassistbd = gl_assist_bd.get(j);
asstype = glassistbd.getString("asstype");//核算项目类型-对应核算维度的字段名
if("f000054".equals(asstype)){
//原因码 f000054
IT_ITEMS.put("RSTGR",glassistbd.getString("assval"));
}else if("f000056".equals(asstype)){
//分配编号 f000056
IT_ITEMS.put("ZUONR",glassistbd.getString("assval"));
}else if("f000023".equals(asstype)){
//税码 f000023
IT_ITEMS.put("MWSKZ",glassistbd.getString("assval"));
}else if("f000031".equals(asstype)){
//税基 f000031
IT_ITEMS.put("FWBAS",glassistbd.getString("assval"));
}else if("f000060".equals(asstype)){
//行项目的参考码
IT_ITEMS.put("XREF3",glassistbd.getString("assval"));
}
}
}
// 获取借方金额
BigDecimal debitlocal = (BigDecimal) entry.get("debitlocal");//借方
// 获取贷方金额
BigDecimal creditlocal = (BigDecimal) entry.get("creditlocal");//贷方
entrydc = (String) entry.get("entrydc");//分录方向(1.借方,-1.贷方)
// 进行空值检查
if (debitlocal != null && creditlocal != null && entrydc != null) {
BigDecimal amountToPut = BigDecimal.ZERO;
// 获取分录方向 若A,只拿一方,当前拿的借方
boolean isEntryDC1 = "1".equals(entrydc);
boolean isEntryDCNegative1 = "-1".equals(entrydc);
if (isEntryDC1) {
amountToPut = debitlocal;
} else if (isEntryDCNegative1) {
amountToPut = creditlocal.negate();//相反
}
IT_ITEMS.put("DMBTR", String.valueOf(amountToPut));
}
IT_ITEM.add(IT_ITEMS);
}
}
//遍历明细clear{}
for (DynamicObject entry : entrys) {
String BUKRS = "";
if (null != bill.getDynamicObject("openorg")) {
BUKRS = bill.getDynamicObject("openorg").getString("number");
}
if (StringUtils.isEmpty(BUKRS)) {
BUKRS = bill.getDynamicObject("org").getString("number");
}
//客户(bd_customer)||供应商(bd_supplier) 收款人id:payee
String payeetype = bill.getString("payeetype");//收款人类型
AtomicReference<String> customerOrsupnum = new AtomicReference<>(getCustomerOrSupplierNumber(payeetype, bill, "payee"));
JSONObject jsonObject = new JSONObject();
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", JhzjUtils.getUMSKZ(HKONT));//特殊总账标识
jsonObject.put("DMBTR1", entry.getBigDecimal("e_actamt"));//清账金额_实付金额
IT_CLEAR.add(jsonObject);
}
}else {
//else(item:付款单联查凭证:遍历分录{原逻辑})
DynamicObjectCollection entries = gl_voucher.getDynamicObjectCollection("entries");
for (DynamicObject entry : entries) {
String entrydc = (String) entry.get("entrydc");//分录方向(1.借方,-1.贷方)
// if ("-1".equals(entrydc)) {
//iteam
//todo:对header 凭证类型重新赋值
isHeader.put("BLART", gl_voucher.getString("vouchertype.number"));//凭证类型-从金蝶凭证中获取
if(!JhzjUtils.isEmpty(gl_voucher.getString("description"))){
isHeader.put("BKTXT", gl_voucher.getString("description"));//凭证抬头文本-从金蝶凭证中获取
}
DynamicObject assgrpinfo;
String asstype;
DynamicObject glassistbd;
DynamicObject hsxminfo;
JSONObject IT_ITEMS = new JSONObject();
DynamicObject account = entry.getDynamicObject("account");//科目
if (null != account) {
IT_ITEMS.put("HKONT", account.getString("number")); // 总账科目_科目(凭证分录account)
IT_ITEMS.put("UMSKZ", JhzjUtils.getUMSKZ(account.getString("number")));//特殊总账标识
}
IT_ITEMS.put("SGTXT", entry.getString("edescription"));//SAP凭证行摘要
//凭证反记账标识判断,如果凭证上已勾选则传X给sap
if(gl_voucher.getBoolean("shjh_fjz")){
IT_ITEMS.put("XNEGP", "X");
}
assgrpinfo = entry.getDynamicObject("assgrp");//核算维度(弹性域)
if(assgrpinfo != null){
DynamicObjectCollection gl_assist_bd = QueryServiceHelper.query("gl_assist_bd", "asstype,assval",
new QFilter[]{new QFilter("hg.id", QCP.equals, assgrpinfo.getPkValue())});
for (int j = 0; j < gl_assist_bd.size(); j++) {
glassistbd = gl_assist_bd.get(j);
asstype = glassistbd.getString("asstype");//核算项目类型-对应核算维度的字段名
if("f000057".equals(asstype) || "f0001".equals(asstype)){
//t_bas_flex_property 表中获取对应编号 客户-获利段 f0001 客户编码 f000057
hsxminfo = QueryServiceHelper.queryOne("bd_customer", "id,name,number",
new QFilter[]{new QFilter("id", QCP.equals, glassistbd.getLong("assval"))});//维度值
IT_ITEMS.put("KUNNR",hsxminfo.getString("number"));//客户
}else if("f000005".equals(asstype)){
//供应商 f000005
hsxminfo = QueryServiceHelper.queryOne("bd_supplier", "id,name,number",
new QFilter[]{new QFilter("id", QCP.equals, glassistbd.getLong("assval"))});//维度值
IT_ITEMS.put("LIFNR",hsxminfo.getString("number"));//供应商
}else if("f000012".equals(asstype)){
//利润中心 f000012
hsxminfo = QueryServiceHelper.queryOne("shjh_pc", "id,name,number",
new QFilter[]{new QFilter("id", QCP.equals, glassistbd.getLong("assval"))});//维度值
IT_ITEMS.put("PRCTR",hsxminfo.getString("number"));//利润中心_利润中心
}else if("f000011".equals(asstype)){
//成本中心 f000011
hsxminfo = QueryServiceHelper.queryOne("bos_costcenter", "id,name,number",
new QFilter[]{new QFilter("id", QCP.equals, glassistbd.getLong("assval"))});//维度值
IT_ITEMS.put("KOSTL",hsxminfo.getString("number"));//成本中心_成本中心
}else if("f000054".equals(asstype) || "f000014".equals(asstype)){
//原因码 f000014
//付款原因代码 f000054
hsxminfo = QueryServiceHelper.queryOne("gl_cashflowitem", "id,name,number",
new QFilter[]{new QFilter("id", QCP.equals, glassistbd.getLong("assval"))});//维度值
IT_ITEMS.put("RSTGR",hsxminfo.getString("number"));
}
}
gl_assist_bd = QueryServiceHelper.query("gl_assist_txt", "asstype,assval",
new QFilter[]{new QFilter("hg.id", QCP.equals, assgrpinfo.getPkValue())});//核算项目组合纵表-文本
for (int j = 0; j < gl_assist_bd.size(); j++) {
glassistbd = gl_assist_bd.get(j);
asstype = glassistbd.getString("asstype");//核算项目类型-对应核算维度的字段名
if("f000054".equals(asstype)){
//原因码 f000054
IT_ITEMS.put("RSTGR",glassistbd.getString("assval"));
}else if("f000056".equals(asstype)){
//分配编号 f000056
IT_ITEMS.put("ZUONR",glassistbd.getString("assval"));
}else if("f000023".equals(asstype)){
//税码 f000023
IT_ITEMS.put("MWSKZ",glassistbd.getString("assval"));
}else if("f000031".equals(asstype)){
//税基 f000031
IT_ITEMS.put("FWBAS",glassistbd.getString("assval"));
}else if("f000060".equals(asstype)){
//行项目的参考码
IT_ITEMS.put("XREF3",glassistbd.getString("assval"));
}
}
}
// 获取借方金额
BigDecimal debitlocal = (BigDecimal) entry.get("debitlocal");//借方
// 获取贷方金额
BigDecimal creditlocal = (BigDecimal) entry.get("creditlocal");//贷方
entrydc = (String) entry.get("entrydc");//分录方向(1.借方,-1.贷方)
// 进行空值检查
if (debitlocal != null && creditlocal != null && entrydc != null) {
BigDecimal amountToPut = BigDecimal.ZERO;
// 获取分录方向 若A,只拿一方,当前拿的借方
boolean isEntryDC1 = "1".equals(entrydc);
boolean isEntryDCNegative1 = "-1".equals(entrydc);
if (isEntryDC1) {
amountToPut = debitlocal;
} else if (isEntryDCNegative1) {
amountToPut = creditlocal.negate();//相反
}
IT_ITEMS.put("DMBTR", String.valueOf(amountToPut));
}
IT_ITEM.add(IT_ITEMS);
// }
}
}
}
data.put("IS_HEADER", isHeader);
//金蝶生成的凭证信息
data.put("IT_ITEM", IT_ITEM);
//清账(SAP凭证数据)
data.put("IT_CLEAR",IT_CLEAR);
//一次性供应商或客户信息仅需要填写 //一次性供应商或客户信息仅需要填写
String type = bill.getString("payeetype"); String type = bill.getString("payeetype");
long id = Long.parseLong(bill.getString("payee")); long id = Long.parseLong(bill.getString("payee"));
@ -220,6 +812,7 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl
private JSONArray getIT_ITEM(DynamicObject bill , JSONObject IS_HEADER) { private JSONArray getIT_ITEM(DynamicObject bill , JSONObject IS_HEADER) {
String shjhSourcesystem = bill.getString("shjh_sourcesystem");//来源系统 String shjhSourcesystem = bill.getString("shjh_sourcesystem");//来源系统
//跨主体调拨
//客户(bd_customer)||供应商(bd_supplier) 收款人id:payee //客户(bd_customer)||供应商(bd_supplier) 收款人id:payee
// String payeetype = bill.getString("payeetype");//收款人类型 // String payeetype = bill.getString("payeetype");//收款人类型
// String customerOrsupnum = getCustomerOrSupplierNumber(payeetype, bill,"payee"); // String customerOrsupnum = getCustomerOrSupplierNumber(payeetype, bill,"payee");
@ -265,7 +858,7 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl
//todo:对header 凭证类型重新赋值 //todo:对header 凭证类型重新赋值
IS_HEADER.put("BLART", gl_voucher.getString("vouchertype.number"));//凭证类型-从金蝶凭证中获取 IS_HEADER.put("BLART", gl_voucher.getString("vouchertype.number"));//凭证类型-从金蝶凭证中获取
if(!JhzjUtils.isEmpty(gl_voucher.getString("description"))){ if(!JhzjUtils.isEmpty(gl_voucher.getString("description"))){
IS_HEADER.put("BKTXT", gl_voucher.getString("description"));//凭证抬头文本-从金蝶凭证中获取 IS_HEADER.put("BKTXT", gl_voucher.getString("description"));//凭证抬头文本-从金蝶凭证中L获取
} }
DynamicObjectCollection entries = gl_voucher.getDynamicObjectCollection("entries"); DynamicObjectCollection entries = gl_voucher.getDynamicObjectCollection("entries");
if (!entries.isEmpty()) { if (!entries.isEmpty()) {
@ -351,6 +944,9 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl
}else if("f000031".equals(asstype)){ }else if("f000031".equals(asstype)){
//税基 f000031 //税基 f000031
IT_ITEMS.put("FWBAS",glassistbd.getString("assval")); IT_ITEMS.put("FWBAS",glassistbd.getString("assval"));
}else if("f000060".equals(asstype)){
//行项目的参考码
IT_ITEMS.put("XREF3",glassistbd.getString("assval"));
} }
} }
} }
@ -374,6 +970,7 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl
} }
IT_ITEMS.put("DMBTR", String.valueOf(amountToPut)); IT_ITEMS.put("DMBTR", String.valueOf(amountToPut));
} }
IT_ITEM.add(IT_ITEMS); IT_ITEM.add(IT_ITEMS);
} }
} }
@ -419,57 +1016,56 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl
IT_CLEAR.add(jsonObject); IT_CLEAR.add(jsonObject);
} }
// 票据信息 // // 票据信息
DynamicObjectCollection casDraftinfos = bill.getDynamicObjectCollection("cas_draftinfo"); // DynamicObjectCollection casDraftinfos = bill.getDynamicObjectCollection("cas_draftinfo");
if (!casDraftinfos.isEmpty()) { // if (!casDraftinfos.isEmpty()) {
// 缓存所有票据号码:draftbillno // // 缓存所有票据号码:draftbillno
List<String> draftbillnos = new ArrayList<>(); // List<String> draftbillnos = new ArrayList<>();
for (DynamicObject casDraftinfo : casDraftinfos) { // for (DynamicObject casDraftinfo : casDraftinfos) {
draftbillnos.add(casDraftinfo.getString("draftbillno"));//票据号码 // draftbillnos.add(casDraftinfo.getString("draftbillno"));//票据号码
} // }
// 批量查询收款单:casRecbills // // 批量查询收款单:casRecbills
QFilter q2 = new QFilter("openorg.number", QCP.equals, BUKRS); // QFilter q2 = new QFilter("openorg.number", QCP.equals, BUKRS);
List<QFilter> allFilters = new ArrayList<>(); // List<QFilter> allFilters = new ArrayList<>();
for (String d : draftbillnos) { // for (String d : draftbillnos) {
allFilters.add(new QFilter("cas_draftinfo.draftbillno", QCP.equals, d)); // allFilters.add(new QFilter("cas_draftinfo.draftbillno", QCP.equals, d));
} // }
allFilters.add(q2); // allFilters.add(q2);
QFilter[] filtersArray = allFilters.toArray(new QFilter[0]); // QFilter[] filtersArray = allFilters.toArray(new QFilter[0]);
DynamicObject[] casRecbills = BusinessDataServiceHelper.load("cas_recbill", // DynamicObject[] casRecbills = BusinessDataServiceHelper.load("cas_recbill",
"id,cas_draftinfo,cas_draftinfo.draftbillno,openorg,shjh_vouchernum,shjh_sapfiscalyear,shjh_sapline" + // "id,cas_draftinfo,cas_draftinfo.draftbillno,openorg,shjh_vouchernum,shjh_sapfiscalyear,shjh_sapline" +
"payertype,payer,entry,entry.shjh_accountsap,entry.e_actamt", filtersArray); // "payertype,payer,entry,entry.shjh_accountsap,entry.e_actamt", filtersArray);
// 1. 过滤出收款单, 2. 遍历收款单明细, 3. 组装IT_CLEAR数据 // // 1. 过滤出收款单, 2. 遍历收款单明细, 3. 组装IT_CLEAR数据
for (DynamicObject casRecbill : casRecbills) { // for (DynamicObject casRecbill : casRecbills) {
DynamicObjectCollection entryss = casRecbill.getDynamicObjectCollection("entry"); // DynamicObjectCollection entryss = casRecbill.getDynamicObjectCollection("entry");
for (DynamicObject entr : entryss) { // for (DynamicObject entr : entryss) {
JSONObject jsonObject = new JSONObject(); // JSONObject jsonObject = new JSONObject();
String payertype = casRecbill.getString("payertype"); // String payertype = casRecbill.getString("payertype");
customerOrsupnum.set(getCustomerOrSupplierNumber(payertype, casRecbill, "payer")); // customerOrsupnum.set(getCustomerOrSupplierNumber(payertype, casRecbill, "payer"));
jsonObject.put("BUKRS", BUKRS); // jsonObject.put("BUKRS", BUKRS);
jsonObject.put("BELNR", casRecbill.getString("shjh_vouchernum")); // jsonObject.put("BELNR", casRecbill.getString("shjh_vouchernum"));
jsonObject.put("GJAHR", casRecbill.getString("shjh_sapfiscalyear")); // jsonObject.put("GJAHR", casRecbill.getString("shjh_sapfiscalyear"));
jsonObject.put("BUZEI", casRecbill.getString("shjh_sapline")); // jsonObject.put("BUZEI", casRecbill.getString("shjh_sapline"));
switch (payertype) { // switch (payertype) {
case "bd_customer": // case "bd_customer":
jsonObject.put("KUNNR", customerOrsupnum); // jsonObject.put("KUNNR", customerOrsupnum);
break; // break;
case "bd_supplier": // case "bd_supplier":
jsonObject.put("LIFNR", customerOrsupnum); // jsonObject.put("LIFNR", customerOrsupnum);
break; // break;
} // }
String HKONT = ""; // String HKONT = "";
DynamicObject shjhSapkjkm = entr.getDynamicObject("shjh_accountsap"); // DynamicObject shjhSapkjkm = entr.getDynamicObject("shjh_accountsap");
if (shjhSapkjkm != null) { // if (shjhSapkjkm != null) {
HKONT = shjhSapkjkm.getString("number"); // HKONT = shjhSapkjkm.getString("number");
} // }
jsonObject.put("HKONT", HKONT);//科目编号 // jsonObject.put("HKONT", HKONT);//科目编号
jsonObject.put("UMSKZ", JhzjUtils.getUMSKZ(HKONT));//特殊总账标识 // jsonObject.put("UMSKZ", JhzjUtils.getUMSKZ(HKONT));//特殊总账标识
jsonObject.put("DMBTR", entr.getBigDecimal("e_actamt")); // jsonObject.put("DMBTR", entr.getBigDecimal("e_actamt"));
IT_CLEAR.add(jsonObject); // IT_CLEAR.add(jsonObject);
} // }
} // }
// }
}
return IT_CLEAR; return IT_CLEAR;
} }

View File

@ -464,6 +464,9 @@ public class RecPushVoucherOperation extends AbstractOperationServicePlugIn impl
}else if("f000031".equals(asstype)){ }else if("f000031".equals(asstype)){
//税基 f000031 //税基 f000031
IT_ITEMS.put("FWBAS",glassistbd.getString("assval")); IT_ITEMS.put("FWBAS",glassistbd.getString("assval"));
}else if("f000060".equals(asstype)){
//行项目的参考码 f000031
IT_ITEMS.put("XREF3",glassistbd.getString("assval"));
} }
} }
} }