Bladeren bron

1、新增调度任务类,同步付款单支付状态至财辅系统,之前的任务类执行时间较长。

wanghaiwu 3 uur geleden
bovenliggende
commit
b13dd84332
1 gewijzigde bestanden met toevoegingen van 336 en 0 verwijderingen
  1. 336 0
      main/java/kd/cosmic/jkjt/fi/cas/task/PayStatusWriteBack2FicoTask.java

+ 336 - 0
main/java/kd/cosmic/jkjt/fi/cas/task/PayStatusWriteBack2FicoTask.java

@@ -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;
+        }
+    }
+}