提交内容:整体代码更新

备注:整体代码更新(新增银行收付处理/电子回单调度计划二开代码)
提交人:邹江涛
This commit is contained in:
zoujiangtao 2025-02-10 16:39:15 +08:00
parent 9ed5afc85b
commit 7ff901528e
4 changed files with 203 additions and 111 deletions

View File

@ -253,7 +253,7 @@ public class ApiService {
data = jsonObject.getJSONObject("data");
dynamic.set("shkd_businessnumber", data.getString("code"));
dynamic.set("shkd_businessid", data.getString("id"));
dynamic.set("shkd_businessname", "BIP");
dynamic.set("shkd_businessname", "共享系统");
dynamic.set("shkd_pushstatus", "已结算");
dynamicObjects.add(dynamic);
@ -307,8 +307,9 @@ public class ApiService {
dynamic.set("shkd_businessname", "共享系统");
dynamicObjects.add(dynamic);
logger.info("银行收付处理 → BIP推送接口 → 成功\n成功单据编号{}\n成功请求体{}\n推送成功接口返回数据{}", dynamic.getString("billno"), saveRequestBody, saveResponseBody);
result = "推送 → 银行收付处理 → 成功";
// 电子回单关联标记
/*// 电子回单关联标记
String receiptno = dynamic.getString("receiptno");
DynamicObject[] loaded = BusinessDataServiceHelper.load("bei_elecreceipt",
"id,billno,shkd_pushstatus,fileserverurl,bizdate,oppbankname,description,company," +
@ -320,7 +321,7 @@ public class ApiService {
result = "(推送 → 银行收付处理 → 成功\n推送 → 电子回单 → 成功\n推送 → 电子回单附件 → 成功)";
} else {
result = "(推送 → 银行收付处理 → 成功\n推送 → 电子回单 → 失败\n推送 → 电子回单附件 → 失败)";
}
}*/
} else {
logger.info("银行收付处理 → BIP推送接口 → 失败\n失败单据编号{}\n失败请求体{}\n推送失败接口返回数据{}", dynamic.getString("billno"), saveRequestBody, saveResponseBody);
@ -361,6 +362,10 @@ public class ApiService {
jsonObject = JSON.parseObject(saveResponseBody);
code = jsonObject.getString("code");
if ("200".equals(code)) {
dynamic.set("shkd_pushstatus", "已推送");
dynamic.set("shkd_businessname", "共享系统");
dynamicObjects.add(dynamic);
logger.info("电子回单查询 → BIP推送接口 → 成功\n成功单据编号{}\n成功请求体{}\n推送成功接口返回数据{}",
dynamic.getString("billno"), saveRequestBody, saveResponseBody);
@ -384,11 +389,11 @@ public class ApiService {
String attachmentRequestBody = getAttachmentRequestBody(hashMap);
String pushResult = pushBill(token, "https://biptestctny.invest.com.cn:8002/iuap-api-auth//yonbip/ctm/bank/tran/update", attachmentRequestBody);
logger.info("电子回单查询 → BIP推送附件接口 → 请求返回结果:\n{}", pushResult);
result = "推送 → 电子回单查询 → 成功";
result = "推送 → 电子回单和附件 → 成功";
} else {
logger.info("电子回单查询 → BIP推送接口 → 失败\n失败单据编号{}\n失败请求体{}\n推送失败接口返回数据{}",
dynamic.getString("billno"), saveRequestBody, saveResponseBody);
result = "推送 → 电子回单查询 → 失败";
result = "推送 → 电子回单和附件 → 失败";
}
break;
default:

View File

@ -15,6 +15,7 @@ import kd.bos.servicehelper.user.UserServiceHelper;
import okhttp3.*;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
/**
@ -40,14 +41,24 @@ public class InfoSecService extends AbstractCAService {
VerifySignResult result = new VerifySignResult();
long userId = UserServiceHelper.getCurrentUserId();//获取当前登录对象的Id
DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(userId, "bos_user");
DynamicObject[] objects = BusinessDataServiceHelper.load("bd_usercredentials", "id,number,publickey,uname", new QFilter("uname", QCP.equals, dynamicObject.getString("name")).toArray());
if (objects.length == 0) {
DynamicObject[] certificateUserRelationships = BusinessDataServiceHelper.load("bd_userandcertrelation", "userid,certid,id", new QFilter("userid", QCP.equals, userId).toArray());
if (certificateUserRelationships.length == 0) {
result.setSuccess(false);
result.setMessage("验签失败,当前用户未绑定证书!");
log.info("验签失败,当前用户未绑定证书!");
return result;
}else {
String certid = certificateUserRelationships[0].getString("certid");
DynamicObject certificateManagement = BusinessDataServiceHelper.loadSingle(certid, "bd_usercredentials");
if (certificateManagement == null) {
result.setSuccess(false);
result.setMessage("验签失败。");
log.info("验签失败,未找到当前用户绑定证书");
return result;
} else {
String puKey = objects[0].getString("publickey");
String puKey = certificateManagement.getString("publickey");
log.info("证书验签publicKey{}\n当前登录人绑定证书的publicKey{}", publicKey, puKey);
if (publicKey.equals(puKey)) {
try {
String response = verifyPkcs7(cleartext, signData, "" + System.currentTimeMillis());
@ -76,6 +87,7 @@ public class InfoSecService extends AbstractCAService {
}
}
}
}
private String verifyPkcs7(String toSign, String signedData, String reqId) throws IOException {
RequestBody formBody = new FormBody.Builder()

View File

@ -53,6 +53,16 @@ public class PayBillApiSavePlugin implements ApiSavePlugin {
Object payeetype = map.get("payeetype");//如果是收款人类型 则为付款处理保存接口
Object payertype = map.get("payertype");//如果是付款人类型 则为收款处理保存接口
if (payeetype != null) {
String billstatus = map.get("billstatus").toString();
if ("B".equals(billstatus)) {
map.put("shkd_pushstatus", "未结算");
}
if ("D".equals(billstatus)) {
map.put("shkd_pushstatus", "已结算");
}
if ("BD_Supplier".equals(payeetype)) {
payeetype = "bd_supplier";
map.put("payeetype", "bd_supplier");
@ -201,15 +211,6 @@ public class PayBillApiSavePlugin implements ApiSavePlugin {
}
}
String billstatus = map.get("billstatus").toString();
if ("C".equals(billstatus)) {
map.put("shkd_pushstatus", "未结算");
}
if ("D".equals(billstatus)) {
map.put("shkd_pushstatus", "已结算");
}
logger.info("最终处理 → 调用接口参数:{}", reqData);
}

View File

@ -3,6 +3,7 @@ package shkd.sys.sys.plugin.task;
import com.kingdee.bos.qing.util.DateUtils;
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;
@ -28,11 +29,149 @@ public class PushTaskPlugin extends AbstractTask implements Plugin {
@Override
public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
Object billMark = map.get("billMark");
List<DynamicObject> dynamicObjects;
List<DynamicObject> dynamicObjectList = new ArrayList<>();
if (billMark != null) {
switch (billMark.toString()) {
// 已结算未结算结算失败未推送
// 付款处理
case "cas_paybill":
DynamicObject[] objects1 = BusinessDataServiceHelper.load("cas_paybill",
"id,billno,actpayamt,entry,entry.e_expenseitem,entry.e_remark,settletype,payeebanknum," +
"payeetype,payeenumber,payeracctbank,payeebank,payeebankname,paymenttype,org,org.number,bizdate,description," +
"shkd_pushstatus,shkd_businessnumber,shkd_businessid,shkd_businessname,billstatus,bankpaystatus"
, new QFilter("bizdate", QCP.large_equals, calculateTheDate(2))
.and("org.number", QCP.in, new String[]{"SIG1040100", "SIG000101135", "SIG1041000", "SIG1040400"})//目前四家公司
.and("shkd_pushstatus", QCP.not_equals, "已结算")
.and("shkd_pushstatus", QCP.not_equals, "结算失败")
.and("billstatus", QCP.equals, "D").toArray());
dynamicObjects = Arrays.asList(objects1);
dynamicObjects.forEach(dynamicObject -> ApiService.paymentSlipsJson(dynamicObject, "BIP", dynamicObjectList, null));
SaveServiceHelper.save(dynamicObjectList.toArray(new DynamicObject[0]));
break;
/**
* 支付结果推送付款处理支付结果定时推送
* 我们的付款处理推送推送结算结果直接默认为7
* BIP推送至星瀚单据只有需审核的数据才需推送结果至BIP,成功则推送成功失败则推送失败
*/
case "cas_paybill_result":
//TS 交易成功
//TF 交易失败
//NC 交易未确认
//OF 银企异常
DynamicObject[] objects4 = BusinessDataServiceHelper.load("cas_paybill",
"id,billno,actpayamt,entry,entry.e_expenseitem,entry.e_remark,settletype,payeebanknum," +
"payeetype,payeenumber,payeracctbank,payeebank,payeebankname,paymenttype,org,bizdate,description," +
"shkd_pushstatus,shkd_businessnumber,shkd_businessid,shkd_businessname,billstatus,bankpaystatus"
, new QFilter("bizdate", QCP.large_equals, calculateTheDate(2))
.and("bankpaystatus", QCP.in, new String[]{"TS", "TF", "NC", "OF"})
.and("shkd_pushstatus", QCP.equals, "未结算").toArray());
DynamicObject[] objects5 = BusinessDataServiceHelper.load("cas_paybill",
"id,billno,actpayamt,entry,entry.e_expenseitem,entry.e_remark,settletype,payeebanknum," +
"payeetype,payeenumber,payeracctbank,payeebank,payeebankname,paymenttype,org,bizdate,description," +
"shkd_pushstatus,shkd_businessnumber,shkd_businessid,shkd_businessname,billstatus,bankpaystatus"
, new QFilter("bankpaystatus", QCP.equals, "TS")
.and("shkd_pushstatus", QCP.equals, "结算失败").toArray());
dynamicObjects = Arrays.asList(objects4);
dynamicObjects.addAll(Arrays.asList(objects5));
dynamicObjects.forEach(dynamicObject -> ApiService.paymentSlipsJson(dynamicObject, "BIPNO", dynamicObjectList, null));
SaveServiceHelper.save(dynamicObjectList.toArray(new DynamicObject[0]));
break;
// 收款处理
case "cas_recbill":
DynamicObject[] objects2 = BusinessDataServiceHelper.load("cas_recbill",
"id,billno,entry,entry.e_expenseitem,settletype,entry.e_remark,receivingtype," +
"payertype,org,bizdate,accountbank,payernumber,actrecamt,txt_description,shkd_pushstatus," +
"shkd_businessnumber,shkd_businessid,shkd_businessname,billstatus"
, new QFilter("bizdate", QCP.large_equals, calculateTheDate(2))
.and("shkd_pushstatus", QCP.not_equals, "已结算")
.and("billstatus", QCP.equals, "D").toArray());
dynamicObjects = Arrays.asList(objects2);
dynamicObjects.forEach(dynamicObject -> ApiService.paymentSlipsJson(dynamicObject, "BIP", dynamicObjectList, null));
SaveServiceHelper.save(dynamicObjectList.toArray(new DynamicObject[0]));
break;
/**
* 银行收付处理
* 通过固定几家公司的银行账号通过银行账号查询出对应的银行流水在查对应的回单以及回单附件一起推送到BIP
* 当前发现入账状态为已入账银行流水会有
*
* 1筛选出需要推送至BIP的流水
* 2通过上游单据推送吗
*
* 付款 先有单据 后有流水
* 收款 先有流水 后有单据
*/
case "bei_transdetail_cas":
DynamicObject[] objects3 = BusinessDataServiceHelper.load("bei_transdetail_cas",
"id,bizdate,oppbank,oppunit,accountbank,description,company,oppbanknumber," +
"bankdetailno,transbalance,description,debitamount,creditamount,shkd_pushstatus," +
"shkd_businessnumber,shkd_businessid,shkd_businessname,recedbillentry,receiptno," +
"recedbillentry.e_recedbilltype,recedbillentry.e_recedbillnumber,recedbillentry.e_recedbillid"
, new QFilter("bizdate", QCP.large_equals, calculateTheDate(7))
.and("shkd_pushstatus", QCP.not_equals, "已推送").toArray());
ArrayList<DynamicObject> transdetailCollection = new ArrayList<>();
Arrays.stream(objects3).forEach(dynamicObject -> {
DynamicObjectCollection dynamicObjectCollection = dynamicObject.getDynamicObjectCollection("recedbillentry");
if (!dynamicObjectCollection.isEmpty()) {
DynamicObject object = dynamicObjectCollection.get(0);
String billType = object.getString("e_recedbilltype");// 接收单据类型
String billNumber = object.getString("e_recedbillnumber");// 接受单据编号
String billId = object.getString("e_recedbillid");// 接受单据ID
if (billType.equals("cas_paybill")) {
DynamicObject dynamicObject1 = BusinessDataServiceHelper.loadSingle(billId, billType);
String businessName = dynamicObject1.getString("shkd_businessname");// 推送系统
String pushStatus = dynamicObject1.getString("shkd_pushstatus");// 推送状态
if ("共享系统".equals(businessName) && "已结算".equals(pushStatus)) {
transdetailCollection.add(dynamicObject);
}
}
}
});
transdetailCollection.forEach(dynamicObject -> ApiService.paymentSlipsJson(dynamicObject, "BIP", dynamicObjectList, null));
SaveServiceHelper.save(dynamicObjectList.toArray(new DynamicObject[0]));
break;
/**
* 电子回单查询
* 星空推送不会有影响吧
*/
case "bei_elecreceipt":
DynamicObject[] elecreceiptArays = BusinessDataServiceHelper.load("bei_elecreceipt",
"id,billno,shkd_pushstatus,fileserverurl,bizdate,oppbankname,description,company," +
"oppbanknumber,detaildatetime,accountbank,amount,use,debitamount,creditamount,detailid," +
"uploadfilename,shkd_businessnumber,shkd_businessid,shkd_businessname,filepath,receiptno"
, new QFilter("bizdate", QCP.large_equals, calculateTheDate(7))
.and("shkd_pushstatus", QCP.not_equals, "已推送").toArray());
ArrayList<DynamicObject> elecreceiptCollection = new ArrayList<>();
Arrays.stream(elecreceiptArays).forEach(dynamicObject -> {
DynamicObject[] objects = BusinessDataServiceHelper.load("bei_transdetail_cas",
"id,billno,shkd_pushstatus,fileserverurl,bizdate,oppbankname,description,company," +
"oppbanknumber,detaildatetime,accountbank,amount,use,debitamount,creditamount,detailid," +
"uploadfilename,shkd_businessnumber,shkd_businessid,shkd_businessname,filepath,receiptno",
new QFilter("receiptno", QCP.equals, dynamicObject.getString("receiptno")).
and(new QFilter("shkd_pushstatus", QCP.equals, "已推送")).
and(new QFilter("shkd_businessname", QCP.equals, "共享系统")).toArray());
if (objects.length > 0) {
elecreceiptCollection.add(dynamicObject);
}
});
elecreceiptCollection.forEach(dynamicObject -> ApiService.paymentSlipsJson(dynamicObject, "BIP", dynamicObjectList, null));
SaveServiceHelper.save(dynamicObjectList.toArray(new DynamicObject[0]));
break;
default:
}
}
}
private static Date calculateTheDate(int days) {
// 获取当前日期
LocalDate currentDate = LocalDate.now();
// 获取当前日期的前两天
LocalDate twoDaysAgo = currentDate.minusDays(2);
LocalDate twoDaysAgo = currentDate.minusDays(days);
// 格式化日期为 "yyyy-MM-dd"
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@ -44,71 +183,6 @@ public class PushTaskPlugin extends AbstractTask implements Plugin {
} catch (ParseException e) {
throw new RuntimeException(e);
}
List<DynamicObject> dynamicObjects;
List<DynamicObject> dynamicObjectList = new ArrayList<>();
if (billMark != null) {
switch (billMark.toString()) {
//已结算未结算结算失败未推送
// 付款处理
case "cas_paybill":
DynamicObject[] objects1 = BusinessDataServiceHelper.load("cas_paybill",
"id,billno,actpayamt,entry,entry.e_expenseitem,entry.e_remark,settletype,payeebanknum," +
"payeetype,payeenumber,payeracctbank,payeebank,payeebankname,paymenttype,org,bizdate,description," +
"shkd_pushstatus,shkd_businessnumber,shkd_businessid,shkd_businessname,billstatus,bankpaystatus"
, new QFilter("bizdate", QCP.large_equals, date)
.and("shkd_pushstatus", QCP.not_equals, "已结算")
.and("shkd_pushstatus", QCP.not_equals, "结算失败")
.and("billstatus", QCP.equals, "D").toArray());
dynamicObjects = Arrays.asList(objects1);
dynamicObjects.forEach(dynamicObject -> ApiService.paymentSlipsJson(dynamicObject, "BIP", dynamicObjectList, null));
SaveServiceHelper.save(dynamicObjectList.toArray(new DynamicObject[0]));
break;
// 收款处理
case "cas_recbill":
DynamicObject[] objects2 = BusinessDataServiceHelper.load("cas_recbill",
"id,billno,entry,entry.e_expenseitem,settletype,entry.e_remark,receivingtype," +
"payertype,org,bizdate,accountbank,payernumber,actrecamt,txt_description,shkd_pushstatus," +
"shkd_businessnumber,shkd_businessid,shkd_businessname,billstatus"
, new QFilter("bizdate", QCP.large_equals, date)
.and("shkd_pushstatus", QCP.not_equals, "已结算")
.and("billstatus", QCP.equals, "D").toArray());
dynamicObjects = Arrays.asList(objects2);
dynamicObjects.forEach(dynamicObject -> ApiService.paymentSlipsJson(dynamicObject, "BIP", dynamicObjectList, null));
SaveServiceHelper.save(dynamicObjectList.toArray(new DynamicObject[0]));
break;
// 银行收付处理
case "bei_transdetail_cas":
DynamicObject[] objects3 = BusinessDataServiceHelper.load("bei_transdetail_cas",
"id,bizdate,oppbank,oppunit,accountbank,description,company,oppbanknumber," +
"bankdetailno,transbalance,description,debitamount,creditamount,shkd_pushstatus," +
"shkd_businessnumber,shkd_businessid,shkd_businessname"
, new QFilter("bizdate", QCP.large_equals, date).and("shkd_pushstatus", QCP.not_equals, "已推送").toArray());
dynamicObjects = Arrays.asList(objects3);
break;
// 支付结果推送付款处理支付结果定时推送
case "cas_paybill_result":
DynamicObject[] objects4 = BusinessDataServiceHelper.load("cas_paybill",
"id,billno,actpayamt,entry,entry.e_expenseitem,entry.e_remark,settletype,payeebanknum," +
"payeetype,payeenumber,payeracctbank,payeebank,payeebankname,paymenttype,org,bizdate,description," +
"shkd_pushstatus,shkd_businessnumber,shkd_businessid,shkd_businessname,billstatus,bankpaystatus"
, new QFilter("bizdate", QCP.large_equals, date)
.and("bankpaystatus", QCP.in, new String[]{"TS", "TF", "NC", "OF"})
.and("shkd_pushstatus", QCP.equals, "未结算").toArray());
DynamicObject[] objects5 = BusinessDataServiceHelper.load("cas_paybill",
"id,billno,actpayamt,entry,entry.e_expenseitem,entry.e_remark,settletype,payeebanknum," +
"payeetype,payeenumber,payeracctbank,payeebank,payeebankname,paymenttype,org,bizdate,description," +
"shkd_pushstatus,shkd_businessnumber,shkd_businessid,shkd_businessname,billstatus,bankpaystatus"
, new QFilter("bankpaystatus", QCP.equals, "TS")//付款成功
.and("shkd_pushstatus", QCP.equals, "结算失败").toArray());
dynamicObjects = Arrays.asList(objects4);
dynamicObjects.addAll(Arrays.asList(objects5));
dynamicObjects.forEach(dynamicObject -> ApiService.paymentSlipsJson(dynamicObject, "BIPNO", dynamicObjectList, null));
SaveServiceHelper.save(dynamicObjectList.toArray(new DynamicObject[0]));
default:
}
}
return date;
}
}