被动付款、收款入账反写SAP定时任务优化

This commit is contained in:
李贵强 2025-08-20 10:27:35 +08:00
parent 1f3617008e
commit 8d29359138
2 changed files with 72 additions and 87 deletions

View File

@ -4,6 +4,8 @@ import kd.bos.context.RequestContext;
import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.dataentity.entity.DynamicObjectCollection; import kd.bos.dataentity.entity.DynamicObjectCollection;
import kd.bos.exception.KDException; 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.QCP;
import kd.bos.orm.query.QFilter; import kd.bos.orm.query.QFilter;
import kd.bos.schedule.executor.AbstractTask; import kd.bos.schedule.executor.AbstractTask;
@ -21,86 +23,69 @@ import java.util.*;
*/ */
public class BeiIntelpayBillTask extends AbstractTask implements Plugin { public class BeiIntelpayBillTask extends AbstractTask implements Plugin {
private final static Log logger = LogFactory.getLog(BeiIntelpayBillTask.class);
//付款处理 //付款处理
private static final String KEY_PAY="cas_paybill"; private static final String KEY_PAY = "cas_paybill";
//下拨处理 //下拨处理
private static final String KEY_DOWN="fca_transdownbill"; private static final String KEY_DOWN = "fca_transdownbill";
@Override @Override
public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException { public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
logger.info("========== 开始处理被动付款单凭证号回写任务 ==========");
// 查询条件借方金额大于0且凭证号为空 // 查询条件借方金额大于0且凭证号为空
QFilter q1 = new QFilter("debitamount", QCP.large_than, BigDecimal.ZERO); QFilter q1 = new QFilter("debitamount", QCP.large_than, BigDecimal.ZERO);
QFilter q2 = new QFilter("shjh_credentialnums", QCP.equals, ""); QFilter q2 = new QFilter("shjh_credentialnums", QCP.equals, "");
// 加载需要处理的智能付款单 // 加载需要处理的智能付款单
DynamicObject[] beiIntelpays = BusinessDataServiceHelper.load("bei_intelpay", DynamicObject[] beiIntelPays = BusinessDataServiceHelper.load("bei_intelpay",
"id,billno,shjh_credentialnums,recedbillentry,recedbillentry.e_recedbillnumber", "id,billno,shjh_credentialnums,recedbillentry,recedbillentry.e_recedbilltype,recedbillentry.e_recedbillnumber",
new QFilter[]{q1, q2}); new QFilter[]{q1, q2});
if (beiIntelPays != null) {
// 用于批量保存 logger.info("共查询到 " + beiIntelPays.length + " 条需要处理的被动付款单");
List<DynamicObject> toSaveList = new ArrayList<>(); // 用于批量保存
List<DynamicObject> toSaveList = new ArrayList<>();
for (DynamicObject beiIntelpay : beiIntelpays) { for (DynamicObject beiIntelPay : beiIntelPays) {
// 下查关联单据 String number = beiIntelPay.getString("recedbillentry.e_recedbillnumber");
Map<String, HashSet<Long>> intelPayMap = BFTrackerServiceHelper.findTargetBills( if (number!=null && !"".equals(number)){
"bei_intelpay", String billType = beiIntelPay.getString("recedbillentry.e_recedbilltype");
new Long[]{(Long) beiIntelpay.getPkValue()}); // 下查关联单据
DynamicObject relevancyBill = BusinessDataServiceHelper.loadSingle(billType, new QFilter[]{new QFilter("billno", QCP.equals, number)});
// 尝试从不同类型的关联单据中获取凭证号 if (relevancyBill != null) {
String credentialNum = findCredentialNum(intelPayMap); // 尝试从不同类型的关联单据中获取凭证号
String credentialNum = findCredentialNum(relevancyBill, billType);
if (StringUtils.isNotEmpty(credentialNum)) { logger.info(beiIntelPay.getString("billno")+"查询到 " + number + "关联到SAP号:"+credentialNum);
beiIntelpay.set("shjh_credentialnums", credentialNum); if (StringUtils.isNotEmpty(credentialNum)) {
toSaveList.add(beiIntelpay); beiIntelPay.set("shjh_credentialnums", credentialNum);
}else { toSaveList.add(beiIntelPay);
//从付款单关联交易明细信息匹配 }
String billno = beiIntelpay.getString("billno");
DynamicObject paybill = BusinessDataServiceHelper.loadSingle("cas_paybill", new QFilter[]{new QFilter("bankcheckentity.edetailbillno", QCP.equals, billno)});
if (null !=paybill){
String credentialnum = paybill.getString("shjh_credentialnum");
if (null!=credentialnum){
beiIntelpay.set("shjh_credentialnums", credentialnum);
toSaveList.add(beiIntelpay);
} }
} }
} }
} // 批量保存
if (!toSaveList.isEmpty()) {
// 批量保存 SaveServiceHelper.save(toSaveList.toArray(new DynamicObject[0]));
if (!toSaveList.isEmpty()) { }
SaveServiceHelper.save(toSaveList.toArray(new DynamicObject[0])); logger.info("========== 被动付款单凭证号回写任务处理完成 ==========");
} }
} }
/** /**
* 从关联单据中查找凭证号 * 从关联单据中查找凭证号
*/ */
private String findCredentialNum(Map<String, HashSet<Long>> intelPayMap) { private String findCredentialNum(DynamicObject relevancyBill, String billType) {
// 定义查找顺序和对应的字段名 // 定义查找顺序和对应的字段名
Map<String, String> keyToFieldMap = new LinkedHashMap<>(); Map<String, String> keyToFieldMap = new LinkedHashMap<>();
keyToFieldMap.put(KEY_PAY, "shjh_credentialnum"); keyToFieldMap.put(KEY_PAY, "shjh_credentialnum");
keyToFieldMap.put(KEY_DOWN, "shjh_sappzh"); keyToFieldMap.put(KEY_DOWN, "shjh_sappzh");
// 按顺序查找 // 按顺序查找
for (Map.Entry<String, String> entry : keyToFieldMap.entrySet()) { for (Map.Entry<String, String> entry : keyToFieldMap.entrySet()) {
String key = entry.getKey(); String key = entry.getKey();
String fieldName = entry.getValue(); String fieldName = entry.getValue();
if (billType.equals(key)) {
if (intelPayMap.containsKey(key)) { return relevancyBill.getString(fieldName);
for (Long billId : intelPayMap.get(key)) {
DynamicObject bill = BusinessDataServiceHelper.loadSingle(billId, key);
if (bill != null) {
String credentialNum = bill.getString(fieldName);
if (StringUtils.isNotEmpty(credentialNum)) {
return credentialNum;
}
}
}
} }
} }
return null; return null;
} }
} }

View File

@ -3,6 +3,8 @@ package shjh.jhzj7.fi.fi.plugin.task;
import kd.bos.context.RequestContext; import kd.bos.context.RequestContext;
import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.exception.KDException; 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.QCP;
import kd.bos.orm.query.QFilter; import kd.bos.orm.query.QFilter;
import kd.bos.schedule.executor.AbstractTask; import kd.bos.schedule.executor.AbstractTask;
@ -11,6 +13,7 @@ import kd.bos.servicehelper.botp.BFTrackerServiceHelper;
import kd.bos.servicehelper.operation.SaveServiceHelper; import kd.bos.servicehelper.operation.SaveServiceHelper;
import kd.bos.util.StringUtils; import kd.bos.util.StringUtils;
import kd.sdk.plugin.Plugin; import kd.sdk.plugin.Plugin;
import shjh.jhzj7.fi.fi.plugin.convert.ClaimConvertPlugin;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.*; import java.util.*;
@ -19,72 +22,69 @@ import java.util.*;
* 定时从付款单携带SAP付凭证单号至收款入账中心 * 定时从付款单携带SAP付凭证单号至收款入账中心
*/ */
public class BeiIntelrecBillTask extends AbstractTask implements Plugin { public class BeiIntelrecBillTask extends AbstractTask implements Plugin {
private final static Log logger = LogFactory.getLog(BeiIntelrecBillTask.class);
//收款处理 //收款处理
private static final String KEY_REC="cas_recbill"; private static final String KEY_REC="cas_recbill";
//上划处理 //上划处理
private static final String KEY_UP="fca_transupbill"; private static final String KEY_UP="fca_transupbill";
@Override @Override
public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException { public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
logger.info("========== 开始处理收款入账单凭证号回写任务 ==========");
// 查询条件收款金额大于0且凭证号为空 // 查询条件收款金额大于0且凭证号为空
QFilter q1 = new QFilter("creditamount", QCP.large_than, BigDecimal.ZERO); QFilter q1 = new QFilter("creditamount", QCP.large_than, BigDecimal.ZERO);
QFilter q2 = new QFilter("shjh_credentialnums", QCP.equals, ""); QFilter q2 = new QFilter("shjh_credentialnums", QCP.equals, "");
// 加载需要处理的智能付款单 // 加载需要处理的智能付款单
DynamicObject[] beiIntelrecs = BusinessDataServiceHelper.load("bei_intelrec", DynamicObject[] beiIntelRecs = BusinessDataServiceHelper.load("bei_intelrec",
"id,billno,shjh_credentialnums", "id,billno,shjh_credentialnums,recedbillentry,recedbillentry.e_recedbilltype,recedbillentry.e_recedbillnumber",
new QFilter[]{q1, q2}); new QFilter[]{q1, q2});
if (beiIntelRecs != null) {
// 用于批量保存 logger.info("共查询到 " + beiIntelRecs.length + " 条需要处理的收款入账单");
List<DynamicObject> toSaveList = new ArrayList<>(); // 用于批量保存
List<DynamicObject> toSaveList = new ArrayList<>();
for (DynamicObject beiIntelrec : beiIntelrecs) { for (DynamicObject beiIntelRec : beiIntelRecs) {
// 下查关联单据 String number = beiIntelRec.getString("recedbillentry.e_recedbillnumber");
Map<String, HashSet<Long>> intelPayMap = BFTrackerServiceHelper.findTargetBills( if (number!=null && !"".equals(number)){
"bei_intelrec", String billType = beiIntelRec.getString("recedbillentry.e_recedbilltype");
new Long[]{(Long) beiIntelrec.getPkValue()}); // 下查关联单据
DynamicObject relevancyBill = BusinessDataServiceHelper.loadSingle(billType, new QFilter[]{new QFilter("billno", QCP.equals, number)});
// 尝试从不同类型的关联单据中获取凭证号 if (relevancyBill != null) {
String credentialNum = findCredentialNum(intelPayMap); // 尝试从不同类型的关联单据中获取凭证号
String credentialNum = findCredentialNum(relevancyBill, billType);
if (StringUtils.isNotEmpty(credentialNum)) { logger.info(beiIntelRec.getString("billno")+"查询到 " + number + "关联到SAP号:"+credentialNum);
beiIntelrec.set("shjh_credentialnums", credentialNum); if (StringUtils.isNotEmpty(credentialNum)) {
toSaveList.add(beiIntelrec); beiIntelRec.set("shjh_credentialnums", credentialNum);
toSaveList.add(beiIntelRec);
}
}
}
} }
} // 批量保存
if (!toSaveList.isEmpty()) {
// 批量保存 SaveServiceHelper.save(toSaveList.toArray(new DynamicObject[0]));
if (!toSaveList.isEmpty()) { }
SaveServiceHelper.save(toSaveList.toArray(new DynamicObject[0])); logger.info("========== 收款入账单凭证号回写任务处理完成 ==========");
} }
} }
/** /**
* 从关联单据中查找凭证号 * 从关联单据中查找凭证号
*/ */
private String findCredentialNum(Map<String, HashSet<Long>> intelPayMap) { private String findCredentialNum(DynamicObject relevancyBill, String billType) {
// 定义查找顺序和对应的字段名 // 定义查找顺序和对应的字段名
Map<String, String> keyToFieldMap = new LinkedHashMap<>(); Map<String, String> keyToFieldMap = new LinkedHashMap<>();
keyToFieldMap.put(KEY_REC, "shjh_vouchernum"); keyToFieldMap.put(KEY_REC, "shjh_vouchernum");
keyToFieldMap.put(KEY_UP, "shjh_sappzh"); keyToFieldMap.put(KEY_UP, "shjh_sappzh");
// 按顺序查找 // 按顺序查找
for (Map.Entry<String, String> entry : keyToFieldMap.entrySet()) { for (Map.Entry<String, String> entry : keyToFieldMap.entrySet()) {
String key = entry.getKey(); String key = entry.getKey();
String fieldName = entry.getValue(); String fieldName = entry.getValue();
if (billType.equals(key)) {
if (intelPayMap.containsKey(key)) { return relevancyBill.getString(fieldName);
for (Long billId : intelPayMap.get(key)) {
DynamicObject bill = BusinessDataServiceHelper.loadSingle(billId, key);
if (bill != null) {
String credentialNum = bill.getString(fieldName);
if (StringUtils.isNotEmpty(credentialNum)) {
return credentialNum;
}
}
}
} }
} }
return null; return null;
} }
} }