|
@@ -0,0 +1,336 @@
|
|
|
|
|
+package kd.cosmic.jkjt.fi.cas.task;
|
|
|
|
|
+
|
|
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
|
|
+import kd.bos.context.RequestContext;
|
|
|
|
|
+import kd.bos.dataentity.entity.DynamicObject;
|
|
|
|
|
+import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType;
|
|
|
|
|
+import kd.bos.entity.EntityMetadataCache;
|
|
|
|
|
+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;
|
|
|
|
|
+import kd.bos.servicehelper.BusinessDataServiceHelper;
|
|
|
|
|
+import kd.bos.servicehelper.QueryServiceHelper;
|
|
|
|
|
+import kd.bos.servicehelper.operation.SaveServiceHelper;
|
|
|
|
|
+import kd.bos.util.StringUtils;
|
|
|
|
|
+import kd.cosmic.jkjt.siit.HttpUtilAction;
|
|
|
|
|
+import kd.cosmic.jkjt.tmc.util.ParamsUtil;
|
|
|
|
|
+import kd.fi.arapcommon.util.DateUtils;
|
|
|
|
|
+import java.util.*;
|
|
|
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * 付款状态回写至财辅系统
|
|
|
|
|
+ * 解决同步慢的问题
|
|
|
|
|
+ * @author wanghaiwu_kd
|
|
|
|
|
+ * @date 2025/01/12
|
|
|
|
|
+ */
|
|
|
|
|
+public class PayStatusWriteBack2FicoTask extends AbstractTask {
|
|
|
|
|
+ private static final Log logger = LogFactory.getLog(PayStatusWriteBack2FicoTask.class);
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
|
|
|
|
|
+ String srcSystem = "ER";
|
|
|
|
|
+ String ENTITY_NAME = "cas_paybill";
|
|
|
|
|
+
|
|
|
|
|
+ DynamicObject commonParams = ParamsUtil.getCommonParamsAllField();
|
|
|
|
|
+
|
|
|
|
|
+ String url = "";
|
|
|
|
|
+ int updateDay = -3;
|
|
|
|
|
+ if(commonParams != null ){
|
|
|
|
|
+ url = commonParams.getString("nckd_fiurl");
|
|
|
|
|
+ updateDay = commonParams.getInt("nckd_fidays");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if(StringUtils.isEmpty(url)){
|
|
|
|
|
+ logger.info("PayStatusWriteBack2FicoTask: url is not setting");
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Date modifyDay = DateUtils.getNextDay(new Date(), updateDay);
|
|
|
|
|
+
|
|
|
|
|
+ QFilter filter = new QFilter("nckd_srcsystem", QCP.equals, srcSystem);
|
|
|
|
|
+ filter.and(new QFilter("nckd_apisourcebillno", QCP.not_equals, " "));
|
|
|
|
|
+ filter.and(new QFilter("modifytime", QCP.large_equals, modifyDay));
|
|
|
|
|
+
|
|
|
|
|
+ DynamicObjectType type = EntityMetadataCache.getDataEntityType(ENTITY_NAME);
|
|
|
|
|
+ List<Object> list = QueryServiceHelper.queryPrimaryKeys(ENTITY_NAME, filter.toArray(), null, Integer.MAX_VALUE);
|
|
|
|
|
+ //根据pkid找到完整的对象
|
|
|
|
|
+ DynamicObject[] billEntities = BusinessDataServiceHelper.load(list.toArray(), type);
|
|
|
|
|
+
|
|
|
|
|
+ if(billEntities.length <= 0){
|
|
|
|
|
+ logger.info("PayStatusWriteBack2FicoTask: 未查询到需要同步的付款单");
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ List<String> apiSourcBillNos = (List)Arrays.stream(billEntities).map((o) -> {
|
|
|
|
|
+ return o.getString("nckd_apisourcebillno");
|
|
|
|
|
+ }).collect(Collectors.toList());
|
|
|
|
|
+ filter = new QFilter("nckd_ficono", QCP.in, apiSourcBillNos);
|
|
|
|
|
+
|
|
|
|
|
+ DynamicObject[] logDataInfos = BusinessDataServiceHelper.load("nckd_cbslog", "id, number, nckd_ficono", filter.toArray());
|
|
|
|
|
+ List<String> logNumberExists = (List)Arrays.stream(logDataInfos).map((o) -> {
|
|
|
|
|
+ return o.getString("nckd_ficono");
|
|
|
|
|
+ }).collect(Collectors.toList());
|
|
|
|
|
+
|
|
|
|
|
+ List<DynamicObject> logDataList = new ArrayList<>();
|
|
|
|
|
+
|
|
|
|
|
+ for (DynamicObject payBillEntity : billEntities) {
|
|
|
|
|
+ //结算方式 JSFS00(银企直连)、JSFS01(现金)、JSFS04(CBS)、JSFS13(网银)
|
|
|
|
|
+ String settletypeString = payBillEntity.getDynamicObject("settletype").getString("number");
|
|
|
|
|
+ String billStatus = payBillEntity.getString("billstatus");
|
|
|
|
|
+ String apisourcebillno = payBillEntity.getString("nckd_apisourcebillno");
|
|
|
|
|
+
|
|
|
|
|
+ //日志中已存在则不再同步
|
|
|
|
|
+ if(logNumberExists.contains(apisourcebillno)){
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //CBS状态、返回信息
|
|
|
|
|
+ String cbsstatus = payBillEntity.getString("nckd_cbsstatus");
|
|
|
|
|
+ String cbsreturnmsg = payBillEntity.getString("nckd_cbsreturnmsg");
|
|
|
|
|
+ //银行付款单状态、银行返回信息
|
|
|
|
|
+ String bankpaystatus = payBillEntity.getString("bankpaystatus");
|
|
|
|
|
+ String bankreturnmsg = payBillEntity.getString("bankreturnmsg");
|
|
|
|
|
+
|
|
|
|
|
+ //财辅系统付款状态paymentStatus 1 支付成功、 0 支付失败 3 支付撤销
|
|
|
|
|
+ String erSystemStatus = "";
|
|
|
|
|
+
|
|
|
|
|
+ if("JSFS00".equals(settletypeString)) {
|
|
|
|
|
+ switch (bankpaystatus) {
|
|
|
|
|
+ case "TS":
|
|
|
|
|
+ cbsstatus = "3";
|
|
|
|
|
+ erSystemStatus = "1";
|
|
|
|
|
+ break;
|
|
|
|
|
+ case "TF":
|
|
|
|
|
+ case "NC":
|
|
|
|
|
+ case "OF":
|
|
|
|
|
+ cbsstatus = "4";
|
|
|
|
|
+ erSystemStatus = "0";
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ cbsreturnmsg = bankreturnmsg;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ switch (cbsstatus) {
|
|
|
|
|
+ case "3":
|
|
|
|
|
+ erSystemStatus = "1";
|
|
|
|
|
+ break;
|
|
|
|
|
+ case "4":
|
|
|
|
|
+ case "5":
|
|
|
|
|
+ erSystemStatus = "0";
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //当cbs状态为 1 未支付 2 支付处理中 不做回写
|
|
|
|
|
+ if("H".equals(billStatus) || "I".equals(billStatus)) {
|
|
|
|
|
+ erSystemStatus = "3";
|
|
|
|
|
+ cbsreturnmsg = "支付撤销";
|
|
|
|
|
+ } else {
|
|
|
|
|
+ if(!"D".equals(billStatus) && erSystemStatus.isEmpty()) {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 处理非CBS支付
|
|
|
|
|
+ */
|
|
|
|
|
+ if("D".equals(billStatus) && !erSystemStatus.equals("1")){
|
|
|
|
|
+ erSystemStatus = "1";
|
|
|
|
|
+ switch(settletypeString){
|
|
|
|
|
+ case "JSFS01" :
|
|
|
|
|
+ cbsreturnmsg = "现金支付";
|
|
|
|
|
+ break;
|
|
|
|
|
+ case "JSFS13" :
|
|
|
|
|
+ cbsreturnmsg = "网银支付";
|
|
|
|
|
+ break;
|
|
|
|
|
+ default:
|
|
|
|
|
+ cbsreturnmsg = "其他支付";
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ JSONObject json = new JSONObject();
|
|
|
|
|
+
|
|
|
|
|
+ json.put("businessNumber", apisourcebillno);
|
|
|
|
|
+ json.put("paymentStatus", erSystemStatus);
|
|
|
|
|
+ if(!"1".equals(erSystemStatus)) {
|
|
|
|
|
+ json.put("failCode", cbsstatus);
|
|
|
|
|
+ json.put("failReason", cbsreturnmsg);
|
|
|
|
|
+ }
|
|
|
|
|
+ json.put("payDate", null);
|
|
|
|
|
+
|
|
|
|
|
+ //added by wanghaiwu_kd 2024/05/30
|
|
|
|
|
+ //增加【流水号】参数
|
|
|
|
|
+ // 结算方式 = CBS支付:返回的是cbs付款申请单的流水号
|
|
|
|
|
+ // 结算方式 = 银企直联:返回的是离线明细上的电子回单关联标记
|
|
|
|
|
+ String serialNumber = "";
|
|
|
|
|
+ //交易明细流水号
|
|
|
|
|
+ String detailNumber = "";
|
|
|
|
|
+
|
|
|
|
|
+ //结算方式 = CBS支付
|
|
|
|
|
+ if("JSFS04".equals(settletypeString)) {
|
|
|
|
|
+ serialNumber = payBillEntity.getString("batchseqid");
|
|
|
|
|
+
|
|
|
|
|
+ if("1".equals(erSystemStatus)) {
|
|
|
|
|
+ //增加支付时间参数
|
|
|
|
|
+ if(payBillEntity.get("nckd_paytime") != null && payBillEntity.getLong("nckd_paytime") > 0){
|
|
|
|
|
+ json.put("payDate", payBillEntity.getLong("nckd_paytime"));
|
|
|
|
|
+ } else if(payBillEntity.getDate("paydate") != null){
|
|
|
|
|
+ json.put("payDate", payBillEntity.getDate("paydate").getTime());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //根据业务参考号查找交易明细
|
|
|
|
|
+ QFilter qFilter = new QFilter("bizrefno", QCP.equals, payBillEntity.getString("billno"));
|
|
|
|
|
+ qFilter.and(new QFilter("description", QCP.not_equals, "手续费"));
|
|
|
|
|
+
|
|
|
|
|
+ DynamicObject beiDetail = BusinessDataServiceHelper.loadSingle("bei_betransdetail_imp", qFilter.toArray());
|
|
|
|
|
+
|
|
|
|
|
+ if(beiDetail != null){
|
|
|
|
|
+ detailNumber = beiDetail.getString("detailid");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ //结算方式 = 银企直联
|
|
|
|
|
+ else if("JSFS00".equals(settletypeString)) {
|
|
|
|
|
+ //对账标识码
|
|
|
|
|
+ String bankCheckFlag = payBillEntity.getString("bankcheckflag");
|
|
|
|
|
+ if(StringUtils.isNotEmpty(bankCheckFlag)){
|
|
|
|
|
+ QFilter qFilter = new QFilter("bankcheckflag", QCP.equals, bankCheckFlag);
|
|
|
|
|
+
|
|
|
|
|
+ //根据对账标识码查找交易明细
|
|
|
|
|
+ DynamicObject beiDetail = BusinessDataServiceHelper.loadSingle("bei_betransdetail_imp", qFilter.toArray());
|
|
|
|
|
+ if(beiDetail != null){
|
|
|
|
|
+ serialNumber = beiDetail.getString("receiptno");
|
|
|
|
|
+ detailNumber = beiDetail.getString("detailid");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if("1".equals(erSystemStatus)) {
|
|
|
|
|
+ QFilter qFilter = new QFilter("srcbillno", QCP.equals, payBillEntity.getString("billno"));
|
|
|
|
|
+ qFilter.and(new QFilter("srcbilltype", QCP.equals, "cas_paybill"));
|
|
|
|
|
+
|
|
|
|
|
+ //查询银行付款单,如果是交易成功,获取银行付款单上的付款时间
|
|
|
|
|
+ DynamicObject bankPayBill = BusinessDataServiceHelper.loadSingle("bei_bankpaybill", qFilter.toArray());
|
|
|
|
|
+ if(bankPayBill != null && "TS".equals(bankPayBill.getString("bankpaystate"))){
|
|
|
|
|
+ json.put("payDate", bankPayBill.getDate("paytime").getTime());
|
|
|
|
|
+ } else if(payBillEntity.getDate("paydate") != null){
|
|
|
|
|
+ json.put("payDate", payBillEntity.getDate("paydate").getTime());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ if("1".equals(erSystemStatus)) {
|
|
|
|
|
+ if(payBillEntity.getDate("paydate") != null){
|
|
|
|
|
+ json.put("payDate", payBillEntity.getDate("paydate").getTime());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ Date date = new Date();
|
|
|
|
|
+ json.put("payDate", date.getTime());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ json.put("serialNumber", serialNumber);
|
|
|
|
|
+ json.put("detailNumber", detailNumber);
|
|
|
|
|
+
|
|
|
|
|
+ Map<String, String> headers = new ConcurrentHashMap<>(1);
|
|
|
|
|
+ headers.put("Content-Type", "application/json");
|
|
|
|
|
+
|
|
|
|
|
+ String uri = url + "/api/financial/FinancialPayment/paymentUpdate";
|
|
|
|
|
+
|
|
|
|
|
+ logger.info("PayStatusWriteBack2FicoTask:" + json.toJSONString());
|
|
|
|
|
+
|
|
|
|
|
+ try {
|
|
|
|
|
+ String appReturnStr = HttpUtilAction.doPost(uri, json.toJSONString(), headers);
|
|
|
|
|
+
|
|
|
|
|
+ logger.info("PayStatusWriteBack2FicoTask:" + appReturnStr);
|
|
|
|
|
+
|
|
|
|
|
+ if (StringUtils.isEmpty(appReturnStr)) {
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ JSONObject appReturnJson = JSONObject.parseObject(appReturnStr);
|
|
|
|
|
+
|
|
|
|
|
+ if ("200".equals(appReturnJson.getString("code"))) {
|
|
|
|
|
+ //如果是支付成功,就记录下日志
|
|
|
|
|
+ if ("1".equals(erSystemStatus)) {
|
|
|
|
|
+ DynamicObject logDataInfo = buildLogData(uri, "synstatus2fico", json.toJSONString(), appReturnStr);
|
|
|
|
|
+
|
|
|
|
|
+ logDataList.add(logDataInfo);
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ logger.info("PayStatusWriteBack2FicoTask:回写接口调用成功,但回写失败 {}", appReturnStr);
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ logger.info("PayStatusWriteBack2FicoTask:回写接口调用失败 {}", e.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //保存同步成功的日志
|
|
|
|
|
+ if(logDataList.size() > 0){
|
|
|
|
|
+ Object[] saveResult = SaveServiceHelper.save(logDataList.toArray(new DynamicObject[]{}));
|
|
|
|
|
+ if (saveResult == null || saveResult.length <= 0) {
|
|
|
|
|
+ logger.info("同步日志保存失败");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 构造日志对象
|
|
|
|
|
+ * @param cbsUrl
|
|
|
|
|
+ * @param logType
|
|
|
|
|
+ * @param inData
|
|
|
|
|
+ * @param appReturn
|
|
|
|
|
+ * @return
|
|
|
|
|
+ */
|
|
|
|
|
+ private DynamicObject buildLogData(String cbsUrl, String logType, String inData, String appReturn){
|
|
|
|
|
+ try {
|
|
|
|
|
+ logger.info("记录CBS调用日志");
|
|
|
|
|
+
|
|
|
|
|
+ inData = inData == null ? "" : inData;
|
|
|
|
|
+
|
|
|
|
|
+ String uuid = UUID.randomUUID().toString().replace("-", "");
|
|
|
|
|
+
|
|
|
|
|
+ uuid = uuid == null ? "uuid" + String.valueOf(System.currentTimeMillis()) : uuid;
|
|
|
|
|
+ DynamicObject dynamicObject = BusinessDataServiceHelper.newDynamicObject("nckd_cbslog");
|
|
|
|
|
+
|
|
|
|
|
+ dynamicObject.set("enable", "1");
|
|
|
|
|
+ dynamicObject.set("status", "C");
|
|
|
|
|
+ dynamicObject.set("number", uuid);
|
|
|
|
|
+ dynamicObject.set("nckd_date", new Date());
|
|
|
|
|
+ dynamicObject.set("nckd_logtype", logType);
|
|
|
|
|
+ dynamicObject.set("nckd_cbsurl", cbsUrl);
|
|
|
|
|
+
|
|
|
|
|
+ //接口入参
|
|
|
|
|
+ if (inData.length() < 200) {
|
|
|
|
|
+ dynamicObject.set("nckd_indata", inData);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ dynamicObject.set("nckd_indata", inData.substring(0, 200) + "...");
|
|
|
|
|
+ }
|
|
|
|
|
+ dynamicObject.set("nckd_indata_tag", inData);
|
|
|
|
|
+
|
|
|
|
|
+ //接口出参
|
|
|
|
|
+ if (appReturn.length() < 200) {
|
|
|
|
|
+ dynamicObject.set("nckd_outdata", appReturn);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ dynamicObject.set("nckd_outdata", appReturn.substring(0, 200) + "...");
|
|
|
|
|
+ }
|
|
|
|
|
+ dynamicObject.set("nckd_outdata_tag", appReturn);
|
|
|
|
|
+
|
|
|
|
|
+ //如果是同步财辅支付状态日志,【财辅单据编号】字段需要赋值 added by wanghaiwu_kd 2024/12/13
|
|
|
|
|
+ if("synstatus2fico".equals(logType)){
|
|
|
|
|
+ dynamicObject.set("nckd_ficono", JSONObject.parseObject(inData).getString("businessNumber"));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ logger.info("记录CBS调用日志:{}", uuid);
|
|
|
|
|
+
|
|
|
|
|
+ return dynamicObject;
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ logger.info("记录CBS调用日志:" + e.getMessage());
|
|
|
|
|
+
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|