From da79adb2d37c9a17e7aee3f13ff6e04d12ce2a30 Mon Sep 17 00:00:00 2001 From: weiyunlong Date: Thu, 26 Jun 2025 15:55:12 +0800 Subject: [PATCH] =?UTF-8?q?=20=E6=8E=A8=E9=80=81=E5=87=AD=E8=AF=81(?= =?UTF-8?q?=E4=BB=98=E6=AC=BE)=5F=5F=E7=89=B9=E5=A4=A7=E4=BC=98=E5=8C=96?= =?UTF-8?q?=20--s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../operate/PaybillPushSapOperation.java | 734 ++++++++++++++++-- .../operate/RecPushVoucherOperation.java | 3 + 2 files changed, 668 insertions(+), 69 deletions(-) diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaybillPushSapOperation.java b/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaybillPushSapOperation.java index ab04d87..0d0fa2f 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaybillPushSapOperation.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaybillPushSapOperation.java @@ -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 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 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 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 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 draftbillnos = new ArrayList<>(); - for (DynamicObject casDraftinfo : casDraftinfos) { - draftbillnos.add(casDraftinfo.getString("draftbillno"));//票据号码 - } - // 批量查询收款单:casRecbills - QFilter q2 = new QFilter("openorg.number", QCP.equals, BUKRS); - List 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 draftbillnos = new ArrayList<>(); +// for (DynamicObject casDraftinfo : casDraftinfos) { +// draftbillnos.add(casDraftinfo.getString("draftbillno"));//票据号码 +// } +// // 批量查询收款单:casRecbills +// QFilter q2 = new QFilter("openorg.number", QCP.equals, BUKRS); +// List 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; } diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/operate/RecPushVoucherOperation.java b/main/java/shjh/jhzj7/fi/fi/plugin/operate/RecPushVoucherOperation.java index b685619..f314336 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/operate/RecPushVoucherOperation.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/operate/RecPushVoucherOperation.java @@ -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")); } } }