diff --git a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/mservice/ApiService.java b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/mservice/ApiService.java index 46a592c..45927f1 100644 --- a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/mservice/ApiService.java +++ b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/mservice/ApiService.java @@ -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: diff --git a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/CA/InfoSecService.java b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/CA/InfoSecService.java index e1b187e..2b0abdd 100644 --- a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/CA/InfoSecService.java +++ b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/CA/InfoSecService.java @@ -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,39 +41,50 @@ 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) { - result.setSuccess(false); - result.setMessage("验签失败。"); - return result; - } else { - String puKey = objects[0].getString("publickey"); - if (publicKey.equals(puKey)) { - try { - String response = verifyPkcs7(cleartext, signData, "" + System.currentTimeMillis()); - JSONObject jsonObject = JSON.parseObject(response); - String code = jsonObject.getString("code"); - if ("200".equals(code)) { - result.setSuccess(true); - result.setMessage("验签通过。"); - } else { - result.setSuccess(false); - result.setMessage("验签失败。"); - } - log.info("验签响应: " + response); + DynamicObject[] certificateUserRelationships = BusinessDataServiceHelper.load("bd_userandcertrelation", "userid,certid,id", new QFilter("userid", QCP.equals, userId).toArray()); - } catch (Exception e) { - log.error(e); - result.setSuccess(false); - result.setMessage("验签失败:" + e.getMessage()); - } + 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 { - result.setSuccess(false); - result.setMessage("验签失败,签名人员和验签人员不同"); - log.info("验签失败,签名人员和验签人员不同"); - return result; + String puKey = certificateManagement.getString("publickey"); + log.info("证书验签publicKey:{}\n当前登录人绑定证书的publicKey:{}", publicKey, puKey); + if (publicKey.equals(puKey)) { + try { + String response = verifyPkcs7(cleartext, signData, "" + System.currentTimeMillis()); + JSONObject jsonObject = JSON.parseObject(response); + String code = jsonObject.getString("code"); + if ("200".equals(code)) { + result.setSuccess(true); + result.setMessage("验签通过。"); + } else { + result.setSuccess(false); + result.setMessage("验签失败。"); + } + log.info("验签响应: " + response); + + } catch (Exception e) { + log.error(e); + result.setSuccess(false); + result.setMessage("验签失败:" + e.getMessage()); + } + return result; + } else { + result.setSuccess(false); + result.setMessage("验签失败,签名人员和验签人员不同"); + log.info("验签失败,签名人员和验签人员不同"); + return result; + } } } } diff --git a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/api/PayBillApiSavePlugin.java b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/api/PayBillApiSavePlugin.java index f4c3cd1..22b7704 100644 --- a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/api/PayBillApiSavePlugin.java +++ b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/api/PayBillApiSavePlugin.java @@ -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); } diff --git a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/task/PushTaskPlugin.java b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/task/PushTaskPlugin.java index a76d5a4..3ceb679 100644 --- a/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/task/PushTaskPlugin.java +++ b/sys/shkd-sys-sys/src/main/java/shkd/sys/sys/plugin/task/PushTaskPlugin.java @@ -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 map) throws KDException { Object billMark = map.get("billMark"); + + + List dynamicObjects; + List 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 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 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 dynamicObjects; - List 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; } } \ No newline at end of file