From be5d81ec02a829a8447bdf23ac7e9bff84379400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E8=B4=B5=E5=BC=BA?= Date: Tue, 25 Mar 2025 17:07:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B6=E6=AC=BE=E5=A4=84=E7=90=86-SAP?= =?UTF-8?q?=E5=87=AD=E8=AF=81=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../operate/RecPushVoucherOperation.java | 147 +++++++++++++++--- .../fi/fi/plugin/task/RecPushSapTask.java | 69 ++++++++ 2 files changed, 194 insertions(+), 22 deletions(-) create mode 100644 main/java/shjh/jhzj7/fi/fi/plugin/task/RecPushSapTask.java 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 40d6381..c7aa85e 100644 --- a/main/java/shjh/jhzj7/fi/fi/plugin/operate/RecPushVoucherOperation.java +++ b/main/java/shjh/jhzj7/fi/fi/plugin/operate/RecPushVoucherOperation.java @@ -19,6 +19,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.operation.SaveServiceHelper; import kd.sdk.plugin.Plugin; import shjh.jhzj7.fi.fi.plugin.form.info.RecFieldsInfo; import shjh.jhzj7.fi.fi.utils.ApiUtils; @@ -43,9 +44,6 @@ public class RecPushVoucherOperation extends AbstractOperationServicePlugIn impl private final static Log logger = LogFactory.getLog(RecPushVoucherOperation.class); - private static final String INTERFACE_ID ="FinancialTransactionVoucher";//识别被调接口并进行路由-凭证推送 - - private static final String RECEIVER_ID ="SAP";//定义的发送者 /** * 操作标识 @@ -162,7 +160,14 @@ public class RecPushVoucherOperation extends AbstractOperationServicePlugIn impl data.put("IS_CUSTOMERCPD", getIS_CUSTOMERCPD(recBill)); } } - sap_accounVoucher(data,recBill.getString("billno")); + JSONObject response = sap_accounVoucher(data, recBill.getString("billno")); + if (null!=response){ + String code = (String) response.get("code"); + if ("0".equals(code)) { + recBill.set("shjh_ispushsap",true); + SaveServiceHelper.update(recBill); + } + } } } } @@ -318,30 +323,128 @@ public class RecPushVoucherOperation extends AbstractOperationServicePlugIn impl } /** - * 收款清账凭证 - * @param recBill - * @return + * 生成收款清账凭证数据 + * @param recBill 收款单动态对象 + * @return 清账凭证数据JSON数组 */ - private JSONArray getIT_CLEAR(DynamicObject recBill){ + private JSONArray getIT_CLEAR(DynamicObject recBill) { JSONArray IT_CLEAR = new JSONArray(); - JSONObject IT_CLEARS = new JSONObject(); - IT_CLEARS.put("BUKRS",recBill.getString("org.number"));//公司代码 - IT_CLEARS.put("BELNR",recBill.getString("shjh_vouchernum"));//会计凭证编号 - IT_CLEARS.put("GJAHR",recBill.getString("shjh_sapfiscalyear"));//会计年度 - IT_CLEARS.put("BUZEI",recBill.getString("shjh_sapline"));//行编号 - IT_CLEARS.put("KUNNR","");//客户编号 - IT_CLEARS.put("LIFNR","");//供应商编号 - IT_CLEARS.put("HKONT","");//总账科目 - IT_CLEARS.put("UMSKZ","");//特殊总帐标识 - IT_CLEARS.put("DMBTR","");//未清金额 - IT_CLEARS.put("DMBTR1","");//清账金额 - IT_CLEARS.put("DMBTR2","");//剩余金额 - IT_CLEARS.put("ERLKZ","");//已完成的未清项标识符 - IT_CLEAR.add(IT_CLEARS); + DynamicObjectCollection entries = recBill.getDynamicObjectCollection("entry"); + + if (entries == null || entries.isEmpty()) { + return IT_CLEAR; + } + + // 获取收款人类型 + String payerType = recBill.getString(RecFieldsInfo.PAYER_TYPE); + + // 根据不同类型处理逻辑 + switch (payerType) { + case "bd_customer": + handleCustomerEntries(recBill, entries, IT_CLEAR); + break; + case "bd_supplier": + handleSupplierEntries(recBill, entries, IT_CLEAR); + break; + default: + handleDefaultEntries(entries, IT_CLEAR); + break; + } return IT_CLEAR; } + /** + * 处理客户类型的清账条目 + */ + private void handleCustomerEntries(DynamicObject recBill, DynamicObjectCollection entries, JSONArray IT_CLEAR) { + String customerNum = ""; + + // 判断是否客户拆分 + if (recBill.getBoolean(RecFieldsInfo.CUSTOMER_SPLIT)) { + // 处理拆分客户的分录 + for (DynamicObject entry : entries) { + IT_CLEAR.add(createClearItem( + entry, + entry.getString("shjh_entrycustomer.number"), // 使用分录客户编号 + "", // 供应商编号为空 + entry.getBigDecimal("e_actamt") + )); + } + } else { + // 处理非拆分客户的分录 + DynamicObject customer = BusinessDataServiceHelper.loadSingle(recBill.getLong("payer"), "bd_customer"); + customerNum = customer != null ? customer.getString("number") : ""; + + for (DynamicObject entry : entries) { + IT_CLEAR.add(createClearItem( + entry, + customerNum, // 使用付款人客户编号 + "", // 供应商编号为空 + entry.getBigDecimal("e_actamt") + )); + } + } + } + + /** + * 处理供应商类型的清账条目 + */ + private void handleSupplierEntries(DynamicObject recBill, DynamicObjectCollection entries, JSONArray IT_CLEAR) { + DynamicObject supplier = BusinessDataServiceHelper.loadSingle(recBill.getLong("payer"), "bd_supplier"); + String supplierNum = supplier != null ? supplier.getString("number") : ""; + + for (DynamicObject entry : entries) { + IT_CLEAR.add(createClearItem( + entry, + "", // 客户编号为空 + supplierNum, // 使用供应商编号 + entry.getBigDecimal("e_actamt") + )); + } + } + + /** + * 处理默认类型的清账条目 + */ + private void handleDefaultEntries(DynamicObjectCollection entries, JSONArray IT_CLEAR) { + for (DynamicObject entry : entries) { + IT_CLEAR.add(createClearItem( + entry, + "", // 客户编号为空 + "", // 供应商编号为空 + entry.getBigDecimal("e_actamt") + )); + } + } + + /** + * 创建清账条目JSON对象 + */ + private JSONObject createClearItem(DynamicObject entry, String customerNum, String supplierNum, BigDecimal clearAmount) { + JSONObject item = new JSONObject(); + + // 公共字段设置 + item.put("BUKRS", entry.getString("realreccompany.number")); // 公司代码 + item.put("BELNR", entry.getString("shjh_entryvouchernum")); // 会计凭证编号 + item.put("GJAHR", entry.getString("shjh_entryfiscalyear")); // 会计年度 + item.put("BUZEI", entry.getString("shjh_linenumber")); // 行编号 + item.put("HKONT", entry.getString("shjh_accountsap.number")); // 总账科目 + + // 客户/供应商编号 + item.put("KUNNR", customerNum); + item.put("LIFNR", supplierNum); + + // 金额相关字段 + item.put("UMSKZ", ""); // 特殊总帐标识 + item.put("DMBTR", ""); // 未清金额 + item.put("DMBTR1", clearAmount != null ? clearAmount.toString() : "0"); // 清账金额 + item.put("DMBTR2", ""); // 剩余金额 + item.put("ERLKZ", ""); // 已完成的未清项标识符 + + return item; + } + private JSONArray getIS_CUSTOMERCPD(DynamicObject recBill) { JSONArray IS_CUSTOMERCPD = new JSONArray(); diff --git a/main/java/shjh/jhzj7/fi/fi/plugin/task/RecPushSapTask.java b/main/java/shjh/jhzj7/fi/fi/plugin/task/RecPushSapTask.java new file mode 100644 index 0000000..bdb5501 --- /dev/null +++ b/main/java/shjh/jhzj7/fi/fi/plugin/task/RecPushSapTask.java @@ -0,0 +1,69 @@ +package shjh.jhzj7.fi.fi.plugin.task; + +import kd.bos.context.RequestContext; +import kd.bos.dataentity.OperateOption; +import kd.bos.dataentity.entity.DynamicObject; +import kd.bos.entity.operate.OperateOptionConst; +import kd.bos.entity.operate.result.OperationResult; +import kd.bos.exception.KDException; +import kd.bos.logging.Log; +import kd.bos.logging.LogFactory; +import kd.bos.orm.query.QCP; +import kd.bos.orm.query.QFilter; +import kd.bos.schedule.executor.AbstractTask; +import kd.bos.servicehelper.BusinessDataServiceHelper; +import kd.bos.servicehelper.operation.OperationServiceHelper; +import kd.sdk.plugin.Plugin; +import shjh.jhzj7.fi.fi.plugin.form.info.RecFieldsInfo; + +import java.util.ArrayList; +import java.util.Map; + +/** + * 后台任务插件 + * 收款单自动推送SAP + */ +public class RecPushSapTask extends AbstractTask implements Plugin { + + private final static Log logger = LogFactory.getLog(RecPushSapTask.class); + + @Override + public void execute(RequestContext requestContext, Map map) throws KDException { + //收款、已生成金蝶凭证、未推送SAP + QFilter qFilter = new QFilter("billstatus", QCP.equals, "D"); + qFilter.and(new QFilter("isvoucher", QCP.equals, true)); + qFilter.and(new QFilter("shjh_ispushsap", QCP.equals, false)); + + DynamicObject[] recBillList = BusinessDataServiceHelper.load("cas_recbill", "id", qFilter.toArray()); + + if (recBillList.length != 0) { + ArrayList ids = new ArrayList<>(); + for (DynamicObject dynamicObject : recBillList) { + ids.add(dynamicObject.getLong("id")); + } + + Map recBillMap = BusinessDataServiceHelper.loadFromCache(ids.toArray(), "cas_recbill"); + + OperateOption operateOption = OperateOption.create(); + // 不执行警告级别校验器 + operateOption.setVariableValue(OperateOptionConst.IGNOREWARN, String.valueOf(true)); + // 不显示交互提示,自动执行到底 + operateOption.setVariableValue(OperateOptionConst.IGNOREINTERACTION, String.valueOf(true)); + // 全部校验通过才保存 + operateOption.setVariableValue(OperateOptionConst.STRICTVALIDATION, String.valueOf(true)); + //同一个用户在多个界面操作同一张,也不允许操作 + operateOption.setVariableValue(OperateOptionConst.MUTEX_ISSTRICT, String.valueOf(true)); + + // Convert map values to array for batch operation + DynamicObject[] billArray = recBillMap.values().toArray(new DynamicObject[0]); + + OperationResult operationResult = OperationServiceHelper.executeOperate("pushvoucher", "cas_recbill", billArray, operateOption); + + if (operationResult.isSuccess()) { + logger.info("执行 pushvoucher 成功,共处理 " + billArray.length + " 张单据"); + } else { + logger.error("批量推送SAP失败: " + operationResult.getMessage()); + } + } + } +} \ No newline at end of file