收款处理-SAP凭证定时任务

This commit is contained in:
李贵强 2025-03-25 17:07:11 +08:00
parent b00b5d1d10
commit be5d81ec02
2 changed files with 194 additions and 22 deletions

View File

@ -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();

View File

@ -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<String, Object> 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<Long> ids = new ArrayList<>();
for (DynamicObject dynamicObject : recBillList) {
ids.add(dynamicObject.getLong("id"));
}
Map<Object, DynamicObject> 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());
}
}
}
}