diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/operate/PayBillSubmitOperation.java b/main/java/shjh/jhzj7/fi/fi/plugin/operate/PayBillSubmitOperation.java index a6db4b5..cfc70db 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/operate/PayBillSubmitOperation.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/operate/PayBillSubmitOperation.java @@ -208,7 +208,6 @@ public class PayBillSubmitOperation extends AbstractOperationServicePlugIn imple DMBTR1 = apPayapply.getBigDecimal("applyamount");//申请金额 } BigDecimal DMBTR2 = BigDecimal.ZERO;//已清 - BigDecimal DMBTR = DMBTR1.subtract(DMBTR2);//未清 QFilter q1 = new QFilter("entry.shjh_voucheryear", QCP.equals, dynamicObject.getString("shjh_voucheryear")); QFilter q2 = new QFilter("entry.shjh_vouchernums", QCP.equals, dynamicObject.getString("shjh_vouchernums")); QFilter q3 = new QFilter("entry.shjh_voucherentrynum", QCP.equals, dynamicObject.getString("shjh_voucherentrynum")); @@ -226,6 +225,7 @@ public class PayBillSubmitOperation extends AbstractOperationServicePlugIn imple DMBTR2 = DMBTR2.add(entr.getBigDecimal("e_actamt")); } } + BigDecimal DMBTR = DMBTR1.subtract(DMBTR2);//未清 IT_ITEM.put("DMBTR1", DMBTR1);//按本位币计的金额 总金额 IT_ITEM.put("DMBTR2", DMBTR2);//按本位币计的金额 已清 IT_ITEM.put("DMBTR", DMBTR);//按本位币计的金额 未清 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 dfccbd9..e6eec14 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaybillPushSapOperation.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/operate/PaybillPushSapOperation.java @@ -55,10 +55,12 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl String billstatus = bill.getString("billstatus");//付款单状态 if (!"D".equals(billstatus)) { this.addErrorMessage(entity, "付款单状态不为已付款,不允许推送SAP凭证"); + return; } //已推送,校验 if (bill.getBoolean("shjh_ispushsap")) { this.addErrorMessage(entity, "已推送SAP凭证,不允许重复推送"); + return; } String shjhSourcesystem = bill.getString("shjh_sourcesystem");//来源系统,A_sap,B_fk DynamicObject paymentidentify = bill.getDynamicObject("paymentidentify");//付款单标识 @@ -70,6 +72,7 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl if ("FKBS01".equals(number) && !("214".equals(paymenttypeNumber) || "217".equals(paymenttypeNumber))) { if (!"A".equals(shjhSourcesystem)) { this.addErrorMessage(entity, "付款单为主动付款且来源系统不为SAP,不允许推送SAP凭证"); + return; } } } @@ -118,8 +121,8 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl } JSONArray IT_CLEAR = new JSONArray();//清账数据,参考《IT_CLEAR》,仅清账需要输入 JSONArray IT_ITEM = new JSONArray(); - //解析付款凭证分录行组装成map,票据在贷方(客户编号+金额,行摘要),sap应付在借方(科目编号,行摘要) - voucherMap; + //解析付款凭证分录行组装成map,票据在贷方(客户编号+金额,行摘要),sap应付在借方(科目编号+金额,行摘要) + Map voucherMap = getVoucherTypeMap(gl_voucher); // 票据信息 DynamicObjectCollection casDraftinfos = bill.getDynamicObjectCollection("cas_draftinfo"); if (!casDraftinfos.isEmpty()) { @@ -171,8 +174,8 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl jsonObject.put("HKONT", HKONT);//总账科目 jsonObject.put("UMSKZ", JhzjUtils.getUMSKZ(HKONT));//特殊总账标识 jsonObject.put("DMBTR1", entry.getBigDecimal("e_actamt"));//清账金额_实付金额 - //以HKONT作为key,将voucherMap的value放入行项目文本(sap应付行) - jsonObject.put("SGTXT", voucherMap.get(HKONT)); + //以HKONT+金额作为key,将voucherMap的value放入行项目文本(sap应付行) + jsonObject.put("SGTXT", voucherMap.get(HKONT+jsonObject.getString("DMBTR1"))); IT_CLEAR.add(jsonObject); } //2.遍历票 @@ -257,6 +260,13 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl jsonObject.put("SGTXT", voucherMap.get(jsonObject.getString("KUNNR")+jsonObject.getString("DMBTR1"))); } IT_CLEAR.add(jsonObject); + }else { + OperateErrorInfo operateErrorInfo = new OperateErrorInfo(); + operateErrorInfo.setMessage("未查询"+draftbillinfo.getString("billno") +"的收票凭证,请检查。"); + operateErrorInfo.setErrorLevel(ErrorLevel.Error.name()); + operateErrorInfo.setPkValue(bill.getPkValue()); + this.operationResult.addErrorInfo(operateErrorInfo); + return; } } } @@ -382,6 +392,7 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl 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 = ""; @@ -432,13 +443,40 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl } 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"));//清账金额 + //以收款单凭证行的客户编号+清账金额作为key,将voucherMap的value放入行项目文本(票据行) + jsonObject.put("SGTXT", voucherMap.get(jsonObject.getString("KUNNR")+jsonObject.getString("DMBTR1"))); IT_CLEAR.add(jsonObject); + }else { + OperateErrorInfo operateErrorInfo = new OperateErrorInfo(); + operateErrorInfo.setMessage("未查询"+draftbillinfo.getString("billno") +"的收票凭证,请检查。"); + operateErrorInfo.setErrorLevel(ErrorLevel.Error.name()); + operateErrorInfo.setPkValue(bill.getPkValue()); + this.operationResult.addErrorInfo(operateErrorInfo); + return; } } } @@ -605,6 +643,8 @@ public class PaybillPushSapOperation extends AbstractOperationServicePlugIn impl jsonObject.put("HKONT", HKONT);//总账科目 jsonObject.put("UMSKZ", JhzjUtils.getUMSKZ(HKONT));//特殊总账标识 jsonObject.put("DMBTR1", entry.getBigDecimal("e_actamt"));//清账金额_实付金额 + //以HKONT+金额作为key,将voucherMap的value放入行项目文本(sap应付行) + jsonObject.put("SGTXT", voucherMap.get(HKONT+jsonObject.getString("DMBTR1"))); IT_CLEAR.add(jsonObject); } }else { diff --git a/main/java/shjh/jhzj7/fi/fi/utils/SapUtils.java b/main/java/shjh/jhzj7/fi/fi/utils/SapUtils.java index 9ac834b..30e93de 100644 --- a/main/java/shjh/jhzj7/fi/fi/utils/SapUtils.java +++ b/main/java/shjh/jhzj7/fi/fi/utils/SapUtils.java @@ -3,6 +3,7 @@ package shjh.jhzj7.fi.fi.utils; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.dataentity.entity.DynamicObjectCollection; import kd.bos.db.DB; import kd.bos.db.DBRoute; import kd.bos.logging.Log; @@ -10,6 +11,7 @@ import kd.bos.logging.LogFactory; import kd.bos.orm.query.QCP; import kd.bos.orm.query.QFilter; import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.QueryServiceHelper; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; @@ -20,6 +22,7 @@ import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import java.io.IOException; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; @@ -704,4 +707,55 @@ public class SapUtils { }); return fseq; } + + /** + * 解析付款凭证分录行组装成map,票据在贷方(客户编号+金额,行摘要),sap应付在借方(科目编号+金额,行摘要) + * @param voucher 凭证 + */ + public static Map getVoucherTypeMap(DynamicObject voucher){ + //组装map + Map sapMap = new HashMap<>(); + DynamicObjectCollection entries = voucher.getDynamicObjectCollection("entries"); + for (int i = 0; i < entries.size(); i++) { + DynamicObject entry = entries.get(i); + DynamicObject account = entry.getDynamicObject("account");//科目 + String accountNumber = ""; + if (null != account) { + accountNumber = account.getString("number");//科目编号 + } + // 获取借方金额 + BigDecimal debitlocal = (BigDecimal) entry.get("debitlocal");//借方 + // 获取贷方金额 + BigDecimal creditlocal = (BigDecimal) entry.get("creditlocal");//贷方 + String entrydc = (String) entry.get("entrydc");//分录方向(1.借方,-1.贷方) + //贷方(客户编号+金额,行摘要) + if ("-1".equals(entrydc)) { + //核算维度(弹性域)_客户 + 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"))});//维度值 + sapMap.put(hsxminfo.getString("number")+ creditlocal, entry.getString("edescription")); + } + } + } + } + //借方(科目编号+金额,行摘要) + if ("1".equals(entrydc)) { + sapMap.put(accountNumber+ debitlocal, entry.getString("edescription")); + } + } + + return sapMap; + } }