被动付款、收款入账反写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.DynamicObjectCollection;
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;
@ -21,86 +23,69 @@ import java.util.*;
*/
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
public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
logger.info("========== 开始处理被动付款单凭证号回写任务 ==========");
// 查询条件借方金额大于0且凭证号为空
QFilter q1 = new QFilter("debitamount", QCP.large_than, BigDecimal.ZERO);
QFilter q2 = new QFilter("shjh_credentialnums", QCP.equals, "");
// 加载需要处理的智能付款单
DynamicObject[] beiIntelpays = BusinessDataServiceHelper.load("bei_intelpay",
"id,billno,shjh_credentialnums,recedbillentry,recedbillentry.e_recedbillnumber",
DynamicObject[] beiIntelPays = BusinessDataServiceHelper.load("bei_intelpay",
"id,billno,shjh_credentialnums,recedbillentry,recedbillentry.e_recedbilltype,recedbillentry.e_recedbillnumber",
new QFilter[]{q1, q2});
// 用于批量保存
List<DynamicObject> toSaveList = new ArrayList<>();
for (DynamicObject beiIntelpay : beiIntelpays) {
// 下查关联单据
Map<String, HashSet<Long>> intelPayMap = BFTrackerServiceHelper.findTargetBills(
"bei_intelpay",
new Long[]{(Long) beiIntelpay.getPkValue()});
// 尝试从不同类型的关联单据中获取凭证号
String credentialNum = findCredentialNum(intelPayMap);
if (StringUtils.isNotEmpty(credentialNum)) {
beiIntelpay.set("shjh_credentialnums", credentialNum);
toSaveList.add(beiIntelpay);
}else {
//从付款单关联交易明细信息匹配
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 (beiIntelPays != null) {
logger.info("共查询到 " + beiIntelPays.length + " 条需要处理的被动付款单");
// 用于批量保存
List<DynamicObject> toSaveList = new ArrayList<>();
for (DynamicObject beiIntelPay : beiIntelPays) {
String number = beiIntelPay.getString("recedbillentry.e_recedbillnumber");
if (number!=null && !"".equals(number)){
String billType = beiIntelPay.getString("recedbillentry.e_recedbilltype");
// 下查关联单据
DynamicObject relevancyBill = BusinessDataServiceHelper.loadSingle(billType, new QFilter[]{new QFilter("billno", QCP.equals, number)});
if (relevancyBill != null) {
// 尝试从不同类型的关联单据中获取凭证号
String credentialNum = findCredentialNum(relevancyBill, billType);
logger.info(beiIntelPay.getString("billno")+"查询到 " + number + "关联到SAP号:"+credentialNum);
if (StringUtils.isNotEmpty(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<>();
keyToFieldMap.put(KEY_PAY, "shjh_credentialnum");
keyToFieldMap.put(KEY_DOWN, "shjh_sappzh");
// 按顺序查找
for (Map.Entry<String, String> entry : keyToFieldMap.entrySet()) {
String key = entry.getKey();
String fieldName = entry.getValue();
if (intelPayMap.containsKey(key)) {
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;
}
}
}
if (billType.equals(key)) {
return relevancyBill.getString(fieldName);
}
}
return null;
}
}

View File

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