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

--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 isHeader = getIS_HEADER(bill);
data.put("IS_HEADER", isHeader);
//金蝶生成的凭证信息
data.put("IT_ITEM", getIT_ITEM(bill, isHeader));
Boolean isqingdan = true;
//来源系统SAP时,清账(SAP凭证数据)
if ("A".equals(shjhSourcesystem)) {
// 票据信息
DynamicObjectCollection casDraftinfos = bill.getDynamicObjectCollection("cas_draftinfo");
if (!casDraftinfos.isEmpty()) {
data.put("IT_ITEM", null);
isqingdan = false;
}
//清账数据参考IT_CLEAR仅清账需要输入
data.put("IT_CLEAR", getIT_CLEAR(bill));
}
//不清却为空,校验
if (isqingdan && data.getJSONArray("IT_ITEM").isEmpty()) {
// 前提:若无凭证,校验
// :
// 1.遍历付款单明细分录,若任意一行中存在SAP凭证号:组装明细XX,拿号调方法(W);遍历票据分录,拿票据号,查收款单(将表头凭证信息)_无行编号,SAP会计科目(从收款单对应凭证取借方),清张金额取票据(转让金额)
// 2.若无SAP凭证号:联查凭证(遍历,借方iteam{SGTXT:凭证行摘要},遍历票_查收款单(将表头凭证信息):行没有)
// 非票:
// 1.来源SAP :(iteam{})
// 2.else
QFilter q1 = new QFilter("sourcebill", QCP.equals, bill.getPkValue());
QFilter q2 = new QFilter("billstatus",QCP.equals,"C");
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",
new QFilter[]{q1, q2});
if (null == gl_voucher) {
OperateErrorInfo operateErrorInfo = new OperateErrorInfo();
operateErrorInfo.setMessage("推送SAP凭证接口失败,原因:金蝶凭证未生成或未审核");
operateErrorInfo.setErrorLevel(ErrorLevel.Error.name());
@ -121,6 +118,601 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl
this.operationResult.addErrorInfo(operateErrorInfo);
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");
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) {
String shjhSourcesystem = bill.getString("shjh_sourcesystem");//来源系统
//跨主体调拨
//客户(bd_customer)||供应商(bd_supplier) 收款人id:payee
// String payeetype = bill.getString("payeetype");//收款人类型
// String customerOrsupnum = getCustomerOrSupplierNumber(payeetype, bill,"payee");
@ -265,7 +858,7 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl
//todo:对header 凭证类型重新赋值
IS_HEADER.put("BLART", gl_voucher.getString("vouchertype.number"));//凭证类型-从金蝶凭证中获取
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");
if (!entries.isEmpty()) {
@ -351,6 +944,9 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl
}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"));
}
}
}
@ -374,6 +970,7 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl
}
IT_ITEMS.put("DMBTR", String.valueOf(amountToPut));
}
IT_ITEM.add(IT_ITEMS);
}
}
@ -419,57 +1016,56 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl
IT_CLEAR.add(jsonObject);
}
// 票据信息
DynamicObjectCollection casDraftinfos = bill.getDynamicObjectCollection("cas_draftinfo");
if (!casDraftinfos.isEmpty()) {
// 缓存所有票据号码:draftbillno
List<String> draftbillnos = new ArrayList<>();
for (DynamicObject casDraftinfo : casDraftinfos) {
draftbillnos.add(casDraftinfo.getString("draftbillno"));//票据号码
}
// 批量查询收款单:casRecbills
QFilter q2 = new QFilter("openorg.number", QCP.equals, BUKRS);
List<QFilter> allFilters = new ArrayList<>();
for (String d : draftbillnos) {
allFilters.add(new QFilter("cas_draftinfo.draftbillno", QCP.equals, d));
}
allFilters.add(q2);
QFilter[] filtersArray = allFilters.toArray(new QFilter[0]);
DynamicObject[] casRecbills = BusinessDataServiceHelper.load("cas_recbill",
"id,cas_draftinfo,cas_draftinfo.draftbillno,openorg,shjh_vouchernum,shjh_sapfiscalyear,shjh_sapline" +
"payertype,payer,entry,entry.shjh_accountsap,entry.e_actamt", filtersArray);
// 1. 过滤出收款单, 2. 遍历收款单明细, 3. 组装IT_CLEAR数据
for (DynamicObject casRecbill : casRecbills) {
DynamicObjectCollection entryss = casRecbill.getDynamicObjectCollection("entry");
for (DynamicObject entr : entryss) {
JSONObject jsonObject = new JSONObject();
String payertype = casRecbill.getString("payertype");
customerOrsupnum.set(getCustomerOrSupplierNumber(payertype, casRecbill, "payer"));
jsonObject.put("BUKRS", BUKRS);
jsonObject.put("BELNR", casRecbill.getString("shjh_vouchernum"));
jsonObject.put("GJAHR", casRecbill.getString("shjh_sapfiscalyear"));
jsonObject.put("BUZEI", casRecbill.getString("shjh_sapline"));
switch (payertype) {
case "bd_customer":
jsonObject.put("KUNNR", customerOrsupnum);
break;
case "bd_supplier":
jsonObject.put("LIFNR", customerOrsupnum);
break;
}
String HKONT = "";
DynamicObject shjhSapkjkm = entr.getDynamicObject("shjh_accountsap");
if (shjhSapkjkm != null) {
HKONT = shjhSapkjkm.getString("number");
}
jsonObject.put("HKONT", HKONT);//科目编号
jsonObject.put("UMSKZ", JhzjUtils.getUMSKZ(HKONT));//特殊总账标识
jsonObject.put("DMBTR", entr.getBigDecimal("e_actamt"));
IT_CLEAR.add(jsonObject);
}
}
}
// // 票据信息
// DynamicObjectCollection casDraftinfos = bill.getDynamicObjectCollection("cas_draftinfo");
// if (!casDraftinfos.isEmpty()) {
// // 缓存所有票据号码:draftbillno
// List<String> draftbillnos = new ArrayList<>();
// for (DynamicObject casDraftinfo : casDraftinfos) {
// draftbillnos.add(casDraftinfo.getString("draftbillno"));//票据号码
// }
// // 批量查询收款单:casRecbills
// QFilter q2 = new QFilter("openorg.number", QCP.equals, BUKRS);
// List<QFilter> allFilters = new ArrayList<>();
// for (String d : draftbillnos) {
// allFilters.add(new QFilter("cas_draftinfo.draftbillno", QCP.equals, d));
// }
// allFilters.add(q2);
// QFilter[] filtersArray = allFilters.toArray(new QFilter[0]);
// DynamicObject[] casRecbills = BusinessDataServiceHelper.load("cas_recbill",
// "id,cas_draftinfo,cas_draftinfo.draftbillno,openorg,shjh_vouchernum,shjh_sapfiscalyear,shjh_sapline" +
// "payertype,payer,entry,entry.shjh_accountsap,entry.e_actamt", filtersArray);
// // 1. 过滤出收款单, 2. 遍历收款单明细, 3. 组装IT_CLEAR数据
// for (DynamicObject casRecbill : casRecbills) {
// DynamicObjectCollection entryss = casRecbill.getDynamicObjectCollection("entry");
// for (DynamicObject entr : entryss) {
// JSONObject jsonObject = new JSONObject();
// String payertype = casRecbill.getString("payertype");
// customerOrsupnum.set(getCustomerOrSupplierNumber(payertype, casRecbill, "payer"));
// jsonObject.put("BUKRS", BUKRS);
// jsonObject.put("BELNR", casRecbill.getString("shjh_vouchernum"));
// jsonObject.put("GJAHR", casRecbill.getString("shjh_sapfiscalyear"));
// jsonObject.put("BUZEI", casRecbill.getString("shjh_sapline"));
// switch (payertype) {
// case "bd_customer":
// jsonObject.put("KUNNR", customerOrsupnum);
// break;
// case "bd_supplier":
// jsonObject.put("LIFNR", customerOrsupnum);
// break;
// }
// String HKONT = "";
// DynamicObject shjhSapkjkm = entr.getDynamicObject("shjh_accountsap");
// if (shjhSapkjkm != null) {
// HKONT = shjhSapkjkm.getString("number");
// }
// jsonObject.put("HKONT", HKONT);//科目编号
// jsonObject.put("UMSKZ", JhzjUtils.getUMSKZ(HKONT));//特殊总账标识
// jsonObject.put("DMBTR", entr.getBigDecimal("e_actamt"));
// IT_CLEAR.add(jsonObject);
// }
// }
// }
return IT_CLEAR;
}

View File

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