|
@@ -0,0 +1,803 @@
|
|
|
+package fi.cas.opplugin;
|
|
|
+import kd.bos.dataentity.entity.DynamicObject;
|
|
|
+import kd.bos.dataentity.entity.DynamicObjectCollection;
|
|
|
+import kd.bos.entity.EntityMetadataCache;
|
|
|
+import kd.bos.logging.Log;
|
|
|
+import kd.bos.logging.LogFactory;
|
|
|
+import kd.bos.orm.query.QFilter;
|
|
|
+import kd.bos.servicehelper.BusinessDataServiceHelper;
|
|
|
+
|
|
|
+import java.io.*;
|
|
|
+import java.math.RoundingMode;
|
|
|
+import java.sql.Timestamp;
|
|
|
+import java.util.Calendar;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+import kd.bos.servicehelper.operation.OperationServiceHelper;
|
|
|
+import kd.bos.servicehelper.operation.SaveServiceHelper;
|
|
|
+import org.json.JSONArray;
|
|
|
+import org.json.JSONObject;
|
|
|
+
|
|
|
+
|
|
|
+public class PayBillToolUtil {
|
|
|
+ public static final String ENTITY_NAME = "cas_paybill";
|
|
|
+ public static final String AGENT_ENTITY_NAME = "cas_agentpaybill";
|
|
|
+ protected static final Log log = LogFactory.getLog(PayBillToolUtil.class);
|
|
|
+ public static final String CHANNELCODE_PILIANG = "JF";
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 代发单付款请求拼接
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String createSingleAgentPaymentRequest_1(DynamicObject info) {
|
|
|
+ try {
|
|
|
+ JSONObject param = new JSONObject();
|
|
|
+ headJson(param);
|
|
|
+
|
|
|
+ JSONObject data = new JSONObject();
|
|
|
+
|
|
|
+ //单据状态
|
|
|
+ if ("C".equals(info.get("billstatus"))) {
|
|
|
+ data.put("FBillStatus", "12");
|
|
|
+ }
|
|
|
+
|
|
|
+ //EAS付款单据号
|
|
|
+ String bbh = info.get("nckd_bbh") + "";//版本号
|
|
|
+ data.put("ERP_INS_ID", info.getPkValue() + "-" + bbh);
|
|
|
+ //EAS付款单据号
|
|
|
+ data.put("ERP_PAYNO", info.get("billno") + "-" + bbh);
|
|
|
+
|
|
|
+ //录入人
|
|
|
+ data.put("CREATOR", info.get("creator.name").toString());
|
|
|
+
|
|
|
+ //录入时间
|
|
|
+ data.put("CREATE_TIME", TypeUtils.date2String(new Date(((Timestamp) info.get("modifytime")).getTime()), TypeUtils.DEFAULT_DATE_FORMAT));
|
|
|
+
|
|
|
+ //摘要
|
|
|
+ data.put("REMARK", info.get("description") + "-" + info.get("billno"));
|
|
|
+
|
|
|
+ data.put("IS_TRANSFER", "0");
|
|
|
+
|
|
|
+ //付款单位--->公司编号
|
|
|
+ if (info.get("org") != null) {//付款单位--->公司编号
|
|
|
+ String companyNumber = TypeUtils.nullToString(info.get("org.number"));
|
|
|
+ data.put("PAY_CLT_NO", companyNumber);
|
|
|
+ }
|
|
|
+
|
|
|
+ DynamicObject payeracctbankEntity = BusinessDataServiceHelper.loadSingleFromCache(info.getDynamicObject("payeracctbank").getPkValue(), "am_accountbank");
|
|
|
+ String payeracc = payeracctbankEntity.getString("bankaccountnumber");
|
|
|
+ String payername = payeracctbankEntity.getString("acctname");
|
|
|
+
|
|
|
+ //付款方账号 ---> 付款账户基础资料银行账号
|
|
|
+ data.put("PAY_ACNT_NO", payeracc);
|
|
|
+
|
|
|
+ //付款银行 ---> 金融机构行号编码
|
|
|
+ data.put("PAY_CNAPS", payeracctbankEntity.get("bank.number") + "");
|
|
|
+
|
|
|
+ data.put("PAY_DATE", TypeUtils.date2String(new Date(), TypeUtils.DEFAULT_DATE_FORMAT));//付款日期
|
|
|
+
|
|
|
+ //付款金额
|
|
|
+
|
|
|
+ data.put("AMOUNT", info.getBigDecimal("payamount").setScale(2, RoundingMode.DOWN).toString());
|
|
|
+ //币别
|
|
|
+ if ("CNY".equals(info.get("currency.number"))) {
|
|
|
+ data.put("CURRENCY", "BB01");
|
|
|
+ }
|
|
|
+
|
|
|
+ //对公
|
|
|
+ if (!info.getBoolean("ispersonpay")) {
|
|
|
+ data.put("IS_PERSON", "0");
|
|
|
+ } else {
|
|
|
+ data.put("IS_PERSON", "1");
|
|
|
+ }
|
|
|
+
|
|
|
+ //加急
|
|
|
+ if (info.getBoolean("urgentflag")) {
|
|
|
+ data.put("URGENT_FLAG", "1");
|
|
|
+ } else {
|
|
|
+ data.put("URGENT_FLAG", "0");
|
|
|
+ }
|
|
|
+
|
|
|
+ //用途
|
|
|
+ data.put("PURPOSE", "用途:" + info.get("nckd_usage"));
|
|
|
+
|
|
|
+ //费用类型
|
|
|
+ data.put("BUSS_TYPE", JSONObject.NULL);
|
|
|
+
|
|
|
+ //付款类型,工资 997
|
|
|
+ if ("997".equals(info.get("paymenttype.number"))) {
|
|
|
+ data.put("PAY_FLAG", 2);
|
|
|
+ } else {
|
|
|
+ data.put("PAY_FLAG", "1");
|
|
|
+ }
|
|
|
+
|
|
|
+ //明细条数
|
|
|
+ data.put("PAY_NUM", info.getString("count"));
|
|
|
+
|
|
|
+
|
|
|
+ //明细数据
|
|
|
+ JSONArray OP_ACNT_LIST = new JSONArray();
|
|
|
+
|
|
|
+ // 获取分录数据
|
|
|
+ DynamicObjectCollection entryList = info.getDynamicObjectCollection("entry");
|
|
|
+
|
|
|
+ for (int i = 0; i < entryList.size(); i++) {
|
|
|
+ DynamicObject entry = entryList.get(i);
|
|
|
+ JSONObject entrydata = new JSONObject();
|
|
|
+ //明细id
|
|
|
+ entrydata.put("ERP_PVT_ID", entry.getPkValue() + "");
|
|
|
+ //收款方账号
|
|
|
+ entrydata.put("RECE_ACC_NO", entry.get("payeeacctbank") + "");
|
|
|
+ //收款方户名
|
|
|
+ entrydata.put("RECE_ACC_NAME", entry.get("payeename") + "");
|
|
|
+ //收款行行号
|
|
|
+ entrydata.put("RECE_CNAPS", entry.get("payeebanknumber") + "");
|
|
|
+ //付款金额,待补充
|
|
|
+ entrydata.put("AMOUNT", entry.getBigDecimal("e_amount").setScale(2, RoundingMode.DOWN).toString());
|
|
|
+ //明细用途
|
|
|
+ entrydata.put("PURPOSE", "用途:" + info.get("nckd_usage"));
|
|
|
+
|
|
|
+ OP_ACNT_LIST.put(entrydata);
|
|
|
+ }
|
|
|
+ data.put("OP_ACNT_LIST", OP_ACNT_LIST);
|
|
|
+
|
|
|
+
|
|
|
+ //无用字段
|
|
|
+ data.put("CLT_NO", JSONObject.NULL);
|
|
|
+ data.put("PAY_ACNT_NAME", JSONObject.NULL);
|
|
|
+ data.put("PAY_BANK", JSONObject.NULL);
|
|
|
+ data.put("CASHAMOUNT", JSONObject.NULL);
|
|
|
+ data.put("BILLAMOUNT", JSONObject.NULL);
|
|
|
+ data.put("RECE_ACC_NO", JSONObject.NULL);
|
|
|
+ data.put("RECE_ACC_NAME", JSONObject.NULL);
|
|
|
+ data.put("RECE_OPBANK_NAME", JSONObject.NULL);
|
|
|
+ data.put("RECE_OPBANK_NAME", JSONObject.NULL);
|
|
|
+ data.put("RECE_BANK_NO", JSONObject.NULL);
|
|
|
+ data.put("RECE_CNAPS", JSONObject.NULL);
|
|
|
+ data.put("REG_NO", JSONObject.NULL);
|
|
|
+ data.put("TERM", JSONObject.NULL);
|
|
|
+
|
|
|
+
|
|
|
+ param.put("data", data);
|
|
|
+ param.put("txDateTime", Utils.getData(new Date(), "yyyyMMddHHmmss"));
|
|
|
+ param.put("batchNo", TypeUtils.nullToString(info.get("billno")) + "-" + TypeUtils.nullToString(info.get("nckd_bbh")) + "-" + Utils.getData(new Date(), "yyyyMMddHHmmss"));
|
|
|
+ param.put("code", "NSTC-T003");
|
|
|
+
|
|
|
+ return param.toString();
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /***
|
|
|
+ * 拼接json对象
|
|
|
+ */
|
|
|
+ public static JSONObject getServiceBean_youhua(DynamicObject info) {
|
|
|
+ JSONObject data = new JSONObject();
|
|
|
+
|
|
|
+ //单据状态
|
|
|
+ if ("C".equals(info.get("billstatus"))) {
|
|
|
+ data.put("FBillStatus", "12");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //录入人
|
|
|
+ data.put("CREATOR", info.get("creator.name").toString());
|
|
|
+
|
|
|
+ //录入时间
|
|
|
+ data.put("CREATE_TIME", TypeUtils.date2String(new Date(((Timestamp) info.get("modifytime")).getTime()), TypeUtils.DEFAULT_DATE_FORMAT));
|
|
|
+ //摘要
|
|
|
+ data.put("REMARK", info.get("description") + "-" + info.get("billno"));
|
|
|
+
|
|
|
+
|
|
|
+ String entrance = info.get("entrance") + "";//是否资金调度,待补充
|
|
|
+ if ("SYN".equals(entrance) || "SPAN".equals(entrance)) {
|
|
|
+ data.put("IS_TRANSFER", "1");
|
|
|
+ } else {
|
|
|
+ data.put("IS_TRANSFER", "0");
|
|
|
+ }
|
|
|
+ data.put("IS_TRANSFER", "0");
|
|
|
+
|
|
|
+
|
|
|
+ String bbh = info.get("nckd_bbh") + "";//版本号
|
|
|
+ data.put("ERP_INS_ID", info.getPkValue() + "-" + bbh);
|
|
|
+ //EAS付款单据号
|
|
|
+ data.put("ERP_PAYNO", info.get("billno") + "-" + bbh);
|
|
|
+
|
|
|
+ //付款日期
|
|
|
+ data.put("PAY_DATE", TypeUtils.date2String(new Date(), TypeUtils.DEFAULT_DATE_FORMAT));
|
|
|
+ //对公
|
|
|
+ if (!info.getBoolean("ispersonpay")) {
|
|
|
+ data.put("IS_PERSON", "0");
|
|
|
+ } else {
|
|
|
+ data.put("IS_PERSON", "1");
|
|
|
+ }
|
|
|
+
|
|
|
+ //加急
|
|
|
+ if (info.get("priority") != null) {
|
|
|
+ if ("prior".equals(info.get("priority"))) {//优先
|
|
|
+ data.put("URGENT_FLAG", "1");
|
|
|
+ } else {
|
|
|
+ data.put("URGENT_FLAG", "0");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ data.put("PURPOSE", "用途:" + info.get("nckd_usage"));
|
|
|
+ //费用类型,取分录第一条费用项目编码
|
|
|
+ DynamicObjectCollection entrycoll = info.getDynamicObjectCollection("entry");
|
|
|
+ if (entrycoll.size() > 0) {
|
|
|
+ if (entrycoll.get(0).get("e_expenseitem.number") == null) {
|
|
|
+ data.put("BUSS_TYPE", "");
|
|
|
+ } else {
|
|
|
+ data.put("BUSS_TYPE", entrycoll.get(0).get("e_expenseitem.number") + "");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ DynamicObject skyhinfo = BusinessDataServiceHelper.loadSingleFromCache(info.getDynamicObject("payeebank").getPkValue(), "bd_bebank");
|
|
|
+
|
|
|
+ //收款方开户行 名称
|
|
|
+ data.put("RECE_OPBANK_NAME", skyhinfo.get("name").toString());//收款方开户行 名称
|
|
|
+
|
|
|
+ //收款方开户行 CNAPS号 ,行号
|
|
|
+ data.put("RECE_CNAPS", skyhinfo.get("number") + "");
|
|
|
+
|
|
|
+ //收款方户名
|
|
|
+ data.put("RECE_ACC_NAME", info.get("recaccbankname") + "");
|
|
|
+ //收款方账号
|
|
|
+ data.put("RECE_ACC_NO", info.get("payeebanknum") + "");
|
|
|
+
|
|
|
+ //付款单位--->公司编号
|
|
|
+ if (info.get("org") != null) {//付款单位--->公司编号
|
|
|
+ String companyNumber = TypeUtils.nullToString(info.get("org.number"));
|
|
|
+ data.put("PAY_CLT_NO", companyNumber);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //付款账号
|
|
|
+ DynamicObject payeracctbankEntity = BusinessDataServiceHelper.loadSingle(info.getDynamicObject("payeracctbank").getPkValue(), "am_accountbank");
|
|
|
+ String payeracc = payeracctbankEntity.getString("bankaccountnumber");
|
|
|
+ String payername = payeracctbankEntity.getString("acctname");
|
|
|
+
|
|
|
+ //付款方账号 ---> 付款账户基础资料银行账号
|
|
|
+ data.put("PAY_ACNT_NO", payeracc);
|
|
|
+
|
|
|
+ //付款银行 ---> 金融机构行号编码,是不是就是金融机构编码
|
|
|
+ data.put("PAY_CNAPS", payeracctbankEntity.get("bank.number") + "");
|
|
|
+
|
|
|
+ data.put("AMOUNT", info.getBigDecimal("actpayamt").setScale(2, RoundingMode.DOWN));
|
|
|
+ //币别
|
|
|
+
|
|
|
+ if ("CNY".equals(info.get("currency.number"))) {
|
|
|
+ data.put("CURRENCY", "BB01");
|
|
|
+ }
|
|
|
+
|
|
|
+ //无用字段
|
|
|
+ data.put("CLT_NO", JSONObject.NULL);
|
|
|
+ data.put("PAY_ACNT_NAME", JSONObject.NULL);
|
|
|
+ data.put("PAY_BANK", JSONObject.NULL);
|
|
|
+ data.put("CASHAMOUNT", JSONObject.NULL);
|
|
|
+ data.put("BILLAMOUNT", JSONObject.NULL);
|
|
|
+ data.put("RECE_BANK_NO", JSONObject.NULL);
|
|
|
+ data.put("REG_NO", JSONObject.NULL);
|
|
|
+ data.put("TERM", JSONObject.NULL);
|
|
|
+ data.put("PAY_FLAG", JSONObject.NULL);
|
|
|
+ data.put("PAY_NUM", "0");
|
|
|
+ data.put("OP_ACNT_LIST", JSONObject.NULL);
|
|
|
+
|
|
|
+
|
|
|
+ //应付票据逻辑,不需要付息方式了
|
|
|
+// if ("012".equals(info.get("settletype.number"))) { // 012 应付票据(银行承兑汇票)
|
|
|
+// DynamicObject payInterest =info.getDynamicObject("payInterest");
|
|
|
+// if (payInterest != null) {
|
|
|
+// paymentBill.setPAY_INTEREST(payInterest.get("number")+"");
|
|
|
+// }
|
|
|
+// }
|
|
|
+ return data;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public static String createSinglePaymentRequest(DynamicObject payBillEntity, String JKNO) {
|
|
|
+ try {
|
|
|
+ JSONObject param = new JSONObject();
|
|
|
+ headJson(param);
|
|
|
+ JSONObject datainfo = getServiceBean_youhua(payBillEntity);
|
|
|
+ param.put("data", datainfo);
|
|
|
+ param.put("txDateTime", Utils.getData(new Date(), "yyyyMMddHHmmss"));
|
|
|
+ param.put("batchNo", TypeUtils.nullToString(payBillEntity.get("billno")) + "-" + TypeUtils.nullToString(payBillEntity.get("nckd_bbh")) + "-" + Utils.getData(new Date(), "yyyyMMddHHmmss"));
|
|
|
+ param.put("code", JKNO);
|
|
|
+ String text = param.toString();
|
|
|
+ return text;
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void headJson(JSONObject param) {
|
|
|
+ param.put("nodeId", "client.001");
|
|
|
+ param.put("channelId", "EAS");
|
|
|
+ param.put("clientId", "001");
|
|
|
+ param.put("clientName", "金蝶");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 代发单支付
|
|
|
+ *
|
|
|
+ * @params billEntities
|
|
|
+ * @returns 返回报错信息
|
|
|
+ */
|
|
|
+ public static String agentpayBillForCBSSync(DynamicObject[] billEntities) {
|
|
|
+ StringBuffer errMsg = new StringBuffer();
|
|
|
+ //获取接口链接等信息
|
|
|
+ DynamicObject jkpzxx = BusinessDataServiceHelper.loadSingle("nckd_jkpzxx", new QFilter[]{new QFilter("number", "=", "paytoJHX")});
|
|
|
+ String url = jkpzxx.getString("nckd_servername");
|
|
|
+
|
|
|
+ for (DynamicObject dataEntity : billEntities) {
|
|
|
+ boolean isSuccess = false;//是否成功标识
|
|
|
+ boolean isZFQZ = true;
|
|
|
+ Map<String, String> qzObject = new HashMap<>();
|
|
|
+ DynamicObject payBillEntity = BusinessDataServiceHelper.loadSingle(dataEntity.getPkValue(), AGENT_ENTITY_NAME);
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断是否可以走前置支付
|
|
|
+ * 1、代发单为审核状态
|
|
|
+ * 2、支付状态为未支付
|
|
|
+ */
|
|
|
+ String billNum = payBillEntity.getString("billno");
|
|
|
+ String billstatusString = payBillEntity.getString("billstatus");
|
|
|
+ String paystatus = payBillEntity.getString("nckd_paystatus");
|
|
|
+ int bbh = payBillEntity.getInt("nckd_bbh");
|
|
|
+ int fkcs = payBillEntity.getInt("nckd_fkcs");
|
|
|
+
|
|
|
+ if (!"C".equals(billstatusString)) {
|
|
|
+ errMsg.append("单据号:").append(billNum).append(",代发单为审核状态,才能提交~\r\n");
|
|
|
+ isZFQZ = false;
|
|
|
+ }
|
|
|
+ if (!"1".equals(paystatus) && !"".equals(paystatus)) {
|
|
|
+ errMsg.append("单据号:").append(billNum).append(",代发单为未支付,才能提交~\r\n");
|
|
|
+ isZFQZ = false;
|
|
|
+ }
|
|
|
+ if (bbh >= 1 && bbh != fkcs) {
|
|
|
+ errMsg.append("单据号:").append(billNum).append(",代发单未调整,请调整数据,或点击重付~\r\n");
|
|
|
+ isZFQZ = false;
|
|
|
+ }
|
|
|
+ if (payBillEntity.getDynamicObject("payeracctbank") == null) {
|
|
|
+ errMsg.append("单据号:").append(billNum).append(",付款账户为空~\r\n");
|
|
|
+ isZFQZ = false;
|
|
|
+ }
|
|
|
+ /***
|
|
|
+ * 审批时校验,如果资金银企行号包含,则提交九恒星,否则不提交。待补充
|
|
|
+ */
|
|
|
+
|
|
|
+
|
|
|
+ //构建支付数据导入请求xml
|
|
|
+ String qjjson = createSingleAgentPaymentRequest_1(payBillEntity);
|
|
|
+ if (qjjson == null) {
|
|
|
+ isZFQZ = false;
|
|
|
+ errMsg.append("单据号:").append(billNum).append("无法拼出正确的json请求~\r\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!isZFQZ) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ log.info("单据号:" + billNum + "传入参数" + qjjson);
|
|
|
+ if ("".equals(url)) {
|
|
|
+ url = "http://172.16.150.71:7081/FDLKF_OUTER/webservice/TxServiceGateway";
|
|
|
+ }
|
|
|
+
|
|
|
+ JSONObject cbsReturnJson = httpjhxService(url, qjjson);
|
|
|
+ log.info("单据号:" + billNum + "返回参数" + cbsReturnJson.toString());
|
|
|
+ //存入日志表
|
|
|
+ saveAgentlog(payBillEntity, qjjson, cbsReturnJson.toString(), "1");
|
|
|
+
|
|
|
+ if (cbsReturnJson == null) {
|
|
|
+ isSuccess = false;
|
|
|
+ errMsg.append("单据号:").append(billNum).append(",推送资金系统失败,");
|
|
|
+ errMsg.append("错误号:").append("XXXXXXX");
|
|
|
+ errMsg.append(",错误原因:").append("接口无法连通,未获取到返回结果");
|
|
|
+ errMsg.append("\r\n");
|
|
|
+ } else if (!"000000".equals(cbsReturnJson.get("resultCode"))) {
|
|
|
+ isSuccess = false;
|
|
|
+ cbsReturnJson.get("resultCode");
|
|
|
+ String resultMsg = cbsReturnJson.get("resultMsg") + "";
|
|
|
+
|
|
|
+ if (resultMsg.indexOf("单据是非驳回状态") >= 0 || resultMsg.indexOf("付款指令重复") >= 0) {//指令重复,说明已经传过去了,改状态为支付中,查询结果
|
|
|
+ isSuccess = true;
|
|
|
+ errMsg.append("单据号:").append(billNum).append("付款指令重复,说明已推送到资金系统!");
|
|
|
+ payBillEntity.set("nckd_fkcs", fkcs + 1);//付款次数+1
|
|
|
+ payBillEntity.set("nckd_sbyy", "指令重复,已推送到资金系统");//返回信息
|
|
|
+ payBillEntity.set("nckd_paystatus", 2);//支付中
|
|
|
+ } else { //如果不是驳回或重发,失败
|
|
|
+ errMsg.append("单据号:").append(billNum).append(",推送资金系统失败,");
|
|
|
+ errMsg.append("错误号:").append(cbsReturnJson.get("resultCode"));
|
|
|
+ errMsg.append(",错误原因:").append(resultMsg);
|
|
|
+ errMsg.append("\r\n");
|
|
|
+ payBillEntity.set("nckd_fkcs", fkcs + 1);//付款次数+1
|
|
|
+ payBillEntity.set("nckd_paystatus", 4);//传输失败
|
|
|
+ payBillEntity.set("nckd_sbyy", cbsReturnJson.get("resultMsg") + "");//错误信息
|
|
|
+ SaveServiceHelper.update(new DynamicObject[]{payBillEntity});
|
|
|
+ }
|
|
|
+ } else if ("000000".equals(cbsReturnJson.get("resultCode"))) {//已受理,改为支付中
|
|
|
+ String resultMsg = cbsReturnJson.get("resultMsg") + "";
|
|
|
+ if ("SUCCESS".equals(resultMsg)) {
|
|
|
+ isSuccess = true;
|
|
|
+ errMsg.append("单据号:").append(billNum).append(",推送资金系统成功!");
|
|
|
+ payBillEntity.set("nckd_fkcs", fkcs + 1);//付款次数+1
|
|
|
+ payBillEntity.set("nckd_sbyy", "传输成功");//返回信息
|
|
|
+ payBillEntity.set("nckd_paystatus", 2);//支付中
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (isSuccess) {
|
|
|
+ SaveServiceHelper.update(new DynamicObject[]{payBillEntity});
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return errMsg.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 支付单同步
|
|
|
+ *
|
|
|
+ * @params billEntities
|
|
|
+ * @returns 返回报错信息
|
|
|
+ */
|
|
|
+ public static String payBillForCBSSync(DynamicObject[] billEntities) {
|
|
|
+ StringBuffer errMsg = new StringBuffer();
|
|
|
+ //获取接口链接等信息
|
|
|
+ DynamicObject jkpzxx = BusinessDataServiceHelper.loadSingle("nckd_jkpzxx", new QFilter[]{new QFilter("number", "=", "paytoJHX")});
|
|
|
+
|
|
|
+ String url = jkpzxx.get("nckd_servername") + "";
|
|
|
+ for (DynamicObject dataEntity : billEntities) {
|
|
|
+ boolean isSuccess = false;
|
|
|
+ boolean isZFQZ = true;
|
|
|
+ DynamicObject payBillEntity = BusinessDataServiceHelper.loadSingle(dataEntity.getPkValue(), ENTITY_NAME);
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断是否可以走前置支付
|
|
|
+ * 1、付款单为审核状态
|
|
|
+ * 2、支付状态为未支付
|
|
|
+ * 3、版本号>=1时,必须等于付款次数
|
|
|
+ */
|
|
|
+ String billNum = payBillEntity.getString("billno");
|
|
|
+ String billstatusString = payBillEntity.getString("billstatus");
|
|
|
+ String paystatus = payBillEntity.getString("nckd_paystatus");
|
|
|
+ int bbh = payBillEntity.getInt("nckd_bbh");
|
|
|
+ int fkcs = payBillEntity.getInt("nckd_fkcs");
|
|
|
+
|
|
|
+
|
|
|
+ //查询流水,如果存在流水,则不能支付
|
|
|
+ String billno = payBillEntity.get("billno") + "";
|
|
|
+// QFilter orgFilter = new QFilter("nckd_reserve80", "like", "%"+billno+"%");
|
|
|
+// DynamicObject fkclinfo = BusinessDataServiceHelper.loadSingle("bei_transdetail","",new QFilter[]{orgFilter});
|
|
|
+
|
|
|
+
|
|
|
+ if (!"C".equals(billstatusString)) {
|
|
|
+ errMsg.append("单据号:").append(billNum).append(",付款单为审核状态,才能提交~\r\n");
|
|
|
+ isZFQZ = false;
|
|
|
+ }
|
|
|
+ if (!"1".equals(paystatus) && !"".equals(paystatus)) {
|
|
|
+ errMsg.append("单据号:").append(billNum).append(",付款单为未支付,才能提交~\r\n");
|
|
|
+ isZFQZ = false;
|
|
|
+ }
|
|
|
+ if (bbh >= 1 && bbh != fkcs) {
|
|
|
+ errMsg.append("单据号:").append(billNum).append(",付款单未调整,请调整数据,或点击重付~\r\n");
|
|
|
+ isZFQZ = false;
|
|
|
+ }
|
|
|
+ if (payBillEntity.getDynamicObject("payeracctbank") == null) {
|
|
|
+ errMsg.append("单据号:").append(billNum).append(",付款账户为空~\r\n");
|
|
|
+ isZFQZ = false;
|
|
|
+ }
|
|
|
+ if (payBillEntity.getDynamicObject("payeebank") == null) {
|
|
|
+ errMsg.append("单据号:").append(billNum).append(",收款账户为空~\r\n");
|
|
|
+ isZFQZ = false;
|
|
|
+ }
|
|
|
+ //流水判断 待补充
|
|
|
+// if(fkclinfo!=null && isZFQZ) {
|
|
|
+// errMsg.append("单据号:").append(billNum).append(",已存在支付流水,为防止重复付款,无法提交。请联系运维核查数据\r\n");
|
|
|
+// isZFQZ = false;
|
|
|
+// }
|
|
|
+
|
|
|
+ //是否资金调度逻辑,用新增入口
|
|
|
+ boolean IS_TRANSFER = false;//判断是否资金调度
|
|
|
+ String entrance = payBillEntity.get("entrance") + "";
|
|
|
+ if ("SYN".equals(entrance) || "SPAN".equals(entrance)) {
|
|
|
+ IS_TRANSFER = true;
|
|
|
+ }
|
|
|
+// if(IS_TRANSFER){
|
|
|
+// isZFQZ = false;
|
|
|
+// errMsg.append("单据号:").append(billNum).append(",跨主体调拨或者同名转账~\r\n");
|
|
|
+// }
|
|
|
+
|
|
|
+ /***
|
|
|
+ * 根据付款单结算方式,结算方式类似承兑的调用资金的票据接口,结算方式为其他的调用资金的对外付款接口
|
|
|
+ */
|
|
|
+ String JKNO = "";
|
|
|
+ String settletype = payBillEntity.get("settletype.number") + "";
|
|
|
+ if (settletype != null && !"".equals(settletype)) {
|
|
|
+ if (settletype.equals("BILL")) {//票据
|
|
|
+ JKNO = "NSTC-T002";
|
|
|
+ } else {
|
|
|
+ JKNO = "NSTC-T001";
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ isZFQZ = false;
|
|
|
+ errMsg.append("单据号:").append(billNum).append(",结算方式为空~\r\n");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //付款单审批时校验未上线银行基础数据资料表,待补充
|
|
|
+ /***
|
|
|
+ * 审批时校验,如果资金银企行号包含,则提交九恒星,否则不提交。
|
|
|
+ */
|
|
|
+
|
|
|
+
|
|
|
+ String qjjson = "";
|
|
|
+ if (isZFQZ) {
|
|
|
+ //构建请求对象
|
|
|
+ qjjson = createSinglePaymentRequest(payBillEntity, JKNO);
|
|
|
+ if (qjjson == null) {
|
|
|
+ isZFQZ = false;
|
|
|
+ errMsg.append("单据号:").append(billNum).append(",无法拼出正确的json请求~\r\n");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!isZFQZ) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ //qjjson = "{\"code\":\"NSTC-T001\",\"batchNo\":\"PV-202504-000041-0-20250427106427\",\"nodeId\":\"client.001\",\"channelId\":\"EAS\",\"clientId\":\"001\",\"clientName\":\"金蝶\",\"txDateTime\":\"20250425175615\",\"data\":{\"ERP_INS_ID\":\""+billNum+"-"+bbh+"\",\"PAY_CLT_NO\":\"A004\",\"CLT_NO\":null,\"PAY_ACNT_NO\":\"824581178610001\",\"PAY_ACNT_NAME\":null,\"PAY_BANK\":null,\"PAY_CNAPS\":\"308421022063\",\"PAY_DATE\":\"2025-04-25\",\"AMOUNT\":3234,\"CASHAMOUNT\":null,\"BILLAMOUNT\":null,\"CURRENCY\":\"BB01\",\"BUSS_TYPE\":null,\"RECE_ACC_NO\":\"1\",\"RECE_ACC_NAME\":\"1\",\"RECE_OPBANK_NAME\":\"非税缴款\",\"RECE_BANK_NO\":null,\"RECE_CNAPS\":\"001100000001\",\"REG_NO\":null,\"IS_PERSON\":\"0\",\"URGENT_FLAG\":\"0\",\"PURPOSE\":\"用途\",\"REMARK\":\"缴款码(XXX)\",\"CREATOR\":\"张清全\",\"CREATE_TIME\":\"2025-04-25\",\"ERP_PAYNO\":\"PV-202504-000041-0\",\"TERM\":null,\"IS_TRANSFER\":\"0\",\"PAY_FLAG\":null,\"FBillStatus\":12,\"PAY_NUM\":0,\"OP_ACNT_LIST\":null}}";
|
|
|
+ log.info("单据号:" + billNum + "传入参数" + qjjson);
|
|
|
+ if ("".equals(url)) {
|
|
|
+ url = "http://172.16.150.71:7081/FDLKF_OUTER/webservice/TxServiceGateway";
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ JSONObject cbsReturnJson = httpjhxService(url, qjjson);
|
|
|
+ log.info("单据号:" + billNum + "返回参数" + cbsReturnJson.toString());
|
|
|
+ //存入日志表
|
|
|
+ savelog(payBillEntity, qjjson, cbsReturnJson.toString());
|
|
|
+
|
|
|
+
|
|
|
+ if (cbsReturnJson == null) {
|
|
|
+ isSuccess = false;
|
|
|
+ errMsg.append("单据号:").append(billNum).append(",推送资金系统失败,");
|
|
|
+ errMsg.append("错误号:").append("XXXXXXX");
|
|
|
+ errMsg.append(",错误原因:").append("接口无法连通,未获取到返回结果");
|
|
|
+ errMsg.append("\r\n");
|
|
|
+ } else if (!"000000".equals(cbsReturnJson.get("resultCode"))) {
|
|
|
+ isSuccess = false;
|
|
|
+ cbsReturnJson.get("resultCode");
|
|
|
+ String resultMsg = cbsReturnJson.get("resultMsg") + "";
|
|
|
+
|
|
|
+ if (resultMsg.indexOf("单据是非驳回状态") >= 0 || resultMsg.indexOf("付款指令重复") >= 0) {//指令重复,说明已经传过去了,改状态为支付中,查询结果
|
|
|
+ isSuccess = true;
|
|
|
+ errMsg.append("单据号:").append(billNum).append("付款指令重复,说明已推送到资金系统!");
|
|
|
+ payBillEntity.set("nckd_fkcs", fkcs + 1);//付款次数+1
|
|
|
+ payBillEntity.set("nckd_sbyy", "指令重复,已推送到资金系统");//返回信息
|
|
|
+ payBillEntity.set("nckd_paystatus", 2);//支付中
|
|
|
+ } else { //如果不是驳回或重发,失败
|
|
|
+ errMsg.append("单据号:").append(billNum).append(",推送资金系统失败,");
|
|
|
+ errMsg.append("错误号:").append(cbsReturnJson.get("resultCode"));
|
|
|
+ errMsg.append(",错误原因:").append(resultMsg);
|
|
|
+ errMsg.append("\r\n");
|
|
|
+ payBillEntity.set("nckd_fkcs", fkcs + 1);//付款次数+1
|
|
|
+ payBillEntity.set("nckd_paystatus", 4);//传输失败
|
|
|
+ payBillEntity.set("nckd_sbyy", cbsReturnJson.get("resultMsg") + "");//错误信息
|
|
|
+ SaveServiceHelper.update(new DynamicObject[]{payBillEntity});
|
|
|
+ }
|
|
|
+ } else if ("000000".equals(cbsReturnJson.get("resultCode"))) {//已受理,改为支付中
|
|
|
+ String resultMsg = cbsReturnJson.get("resultMsg") + "";
|
|
|
+ if ("SUCCESS".equals(resultMsg)) {
|
|
|
+ isSuccess = true;
|
|
|
+ errMsg.append("单据号:").append(billNum).append(",推送资金系统成功!");
|
|
|
+ payBillEntity.set("nckd_fkcs", fkcs + 1);//付款次数+1
|
|
|
+ payBillEntity.set("nckd_sbyy", "传输成功");//返回信息
|
|
|
+ payBillEntity.set("nckd_paystatus", 2);//支付中
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isSuccess) {
|
|
|
+ SaveServiceHelper.update(new DynamicObject[]{payBillEntity});
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return errMsg.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public static void saveAgentlog(DynamicObject payBillEntity, String qqbw, String fhbw, String type) {
|
|
|
+ try {
|
|
|
+ DynamicObject logInfo = new DynamicObject(EntityMetadataCache.getDataEntityType("nckd_dfjkdyrz"));
|
|
|
+ String channelserno = payBillEntity.getString("billno");
|
|
|
+ logInfo.set("number", channelserno);
|
|
|
+ if ("1".equals(type)) {
|
|
|
+ logInfo.set("name", payBillEntity.get("billno") + "支付数据传输日志");
|
|
|
+ } else if ("6".equals(type)) {
|
|
|
+ logInfo.set("name", payBillEntity.get("billno") + "代发单支付信息查询日志");
|
|
|
+ }
|
|
|
+ logInfo.set("nckd_jklx", type);
|
|
|
+ logInfo.set("status", "A");
|
|
|
+ logInfo.set("enable", "1");
|
|
|
+ Calendar currentdate = Calendar.getInstance();
|
|
|
+ logInfo.set("nckd_redate", currentdate.getTime());
|
|
|
+ logInfo.set("nckd_billno", payBillEntity.get("billno"));
|
|
|
+ logInfo.set("nckd_payid", payBillEntity.getPkValue() + "");
|
|
|
+ logInfo.set("nckd_qqbw_tag", qqbw);
|
|
|
+ logInfo.set("nckd_fhbw_tag", fhbw);
|
|
|
+ logInfo.set("nckd_redate", new Date());
|
|
|
+
|
|
|
+ logInfo.set("nckd_djlx", "2");
|
|
|
+ OperationServiceHelper.executeOperate("save", "nckd_zfjkdyrz", new DynamicObject[]{logInfo});
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.info("保存日志报错" + e.getMessage());
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void savePayDayChecklog(String qqbw, String fhbw) {
|
|
|
+ try {
|
|
|
+ DynamicObject logInfo = new DynamicObject(EntityMetadataCache.getDataEntityType("nckd_paydaycheck"));
|
|
|
+ Calendar currentdate = Calendar.getInstance();
|
|
|
+ String enddzrq = TypeUtils.date2String(currentdate.getTime(), "yyyy-MM-dd HH:mm:ss");
|
|
|
+
|
|
|
+ logInfo.set("number", enddzrq);
|
|
|
+ logInfo.set("name", enddzrq + "付款日结查询日志");
|
|
|
+ logInfo.set("status", "A");
|
|
|
+ logInfo.set("enable", "1");
|
|
|
+ logInfo.set("nckd_qqbw_tag", qqbw);
|
|
|
+ logInfo.set("nckd_fhbw_tag", fhbw);
|
|
|
+ OperationServiceHelper.executeOperate("save", "nckd_paydaycheck", new DynamicObject[]{logInfo});
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.info("保存日志报错" + e.getMessage());
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public static void savelog(DynamicObject payBillEntity, String qqbw, String fhbw) {
|
|
|
+ try {
|
|
|
+ DynamicObject logInfo = new DynamicObject(EntityMetadataCache.getDataEntityType("nckd_zfjkdyrz"));
|
|
|
+ String channelserno = payBillEntity.get("billno") + "-" + payBillEntity.getInt("nckd_bbh");
|
|
|
+ logInfo.set("number", channelserno);
|
|
|
+ logInfo.set("name", payBillEntity.get("billno") + "付款日志");
|
|
|
+ logInfo.set("status", "A");
|
|
|
+ logInfo.set("enable", "1");
|
|
|
+ Calendar currentdate = Calendar.getInstance();
|
|
|
+ logInfo.set("nckd_redate", currentdate.getTime());
|
|
|
+ logInfo.set("nckd_billno", payBillEntity.get("billno"));
|
|
|
+ logInfo.set("nckd_payid", payBillEntity.getPkValue() + "");
|
|
|
+ logInfo.set("nckd_qqbw_tag", qqbw);
|
|
|
+ logInfo.set("nckd_fhbw_tag", fhbw);
|
|
|
+ logInfo.set("nckd_redate", new Date());
|
|
|
+
|
|
|
+ logInfo.set("nckd_djlx", "1");
|
|
|
+ OperationServiceHelper.executeOperate("save", "nckd_zfjkdyrz", new DynamicObject[]{logInfo});
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.info("保存日志报错" + e.getMessage());
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public static void saveupdatelog(DynamicObject payBillEntity, String qqbw, String fhbw) {
|
|
|
+ try {
|
|
|
+ DynamicObject logInfo = new DynamicObject(EntityMetadataCache.getDataEntityType("nckd_zfcxjkrz"));
|
|
|
+ String channelserno = payBillEntity.get("billno") + "-" + payBillEntity.getInt("nckd_bbh");
|
|
|
+ logInfo.set("number", channelserno);
|
|
|
+ logInfo.set("name", payBillEntity.get("billno") + "查询状态日志");
|
|
|
+ logInfo.set("status", "A");
|
|
|
+ logInfo.set("enable", "1");
|
|
|
+ Calendar currentdate = Calendar.getInstance();
|
|
|
+ logInfo.set("nckd_redate", currentdate.getTime());
|
|
|
+ logInfo.set("nckd_billno", payBillEntity.get("billno"));
|
|
|
+ logInfo.set("nckd_payid", payBillEntity.getPkValue() + "");
|
|
|
+ logInfo.set("nckd_qqbw_tag", qqbw);
|
|
|
+ logInfo.set("nckd_fhbw_tag", fhbw);
|
|
|
+ logInfo.set("nckd_redate", new Date());
|
|
|
+
|
|
|
+ logInfo.set("nckd_djlx", "1");
|
|
|
+ OperationServiceHelper.executeOperate("save", "nckd_zfcxjkrz", new DynamicObject[]{logInfo});
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.info("保存日志报错" + e.getMessage());
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ public static JSONObject httpjhxService(String url, String qjjson) {
|
|
|
+ String result = "";
|
|
|
+ try {
|
|
|
+ Date d1 = new Date();
|
|
|
+ TxServiceGatewayProxy txServiceGatewayProxy = new TxServiceGatewayProxy("", url);
|
|
|
+ result = txServiceGatewayProxy.send(qjjson);
|
|
|
+
|
|
|
+ Date d2 = new Date();
|
|
|
+
|
|
|
+ long diffs = Math.abs(d2.getTime() - d1.getTime()) / 1000;
|
|
|
+ JSONObject jsonObject = new JSONObject(result);
|
|
|
+ if (jsonObject != null) {
|
|
|
+ if ("{}".equals(jsonObject.toString()) || "".equals(result)) {
|
|
|
+ if (diffs > 60) {//超时
|
|
|
+
|
|
|
+ jsonObject.put("resultCode", "JFXXXXC");
|
|
|
+ jsonObject.put("resultMsg", "超时");
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ jsonObject.put("请求时间", TypeUtils.date2String(d1, TypeUtils.DEFAULT_TIMESTAMP_FORMAT));
|
|
|
+ jsonObject.put("返回时间", TypeUtils.date2String(d2, TypeUtils.DEFAULT_TIMESTAMP_FORMAT));
|
|
|
+ jsonObject.put("响应时长", diffs + "");
|
|
|
+ }
|
|
|
+ return jsonObject;
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ log.info(e.getMessage());
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public static JSONObject JHXServiceQuery(String url, String bodyjson) {
|
|
|
+ try {
|
|
|
+ Date d1 = new Date();
|
|
|
+ TxServiceGatewayProxy txServiceGatewayProxy = new TxServiceGatewayProxy("", url);
|
|
|
+ String result = txServiceGatewayProxy.send(bodyjson);
|
|
|
+
|
|
|
+ Date d2 = new Date();
|
|
|
+
|
|
|
+ long diffs = Math.abs(d2.getTime() - d1.getTime()) / 1000;
|
|
|
+
|
|
|
+ JSONObject jsonObject = new JSONObject(result);
|
|
|
+ if (jsonObject != null || "".equals(result) || result == null) {
|
|
|
+ if ("{}".equals(jsonObject.toString())) {
|
|
|
+ if (diffs > 60) {//超时
|
|
|
+
|
|
|
+ jsonObject.put("resultCode", "JFXXXXC");
|
|
|
+ jsonObject.put("resultMsg", "超时");
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ jsonObject.put("请求时间", TypeUtils.date2String(d1, TypeUtils.DEFAULT_TIMESTAMP_FORMAT));
|
|
|
+ jsonObject.put("返回时间", TypeUtils.date2String(d2, TypeUtils.DEFAULT_TIMESTAMP_FORMAT));
|
|
|
+ jsonObject.put("响应时长", diffs + "");
|
|
|
+ }
|
|
|
+
|
|
|
+ return jsonObject;
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ log.info(e.getMessage());
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|