package kd.cosmic.jkjt.tmc.cbs8; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import kd.bos.bill.AbstractBillPlugIn; import kd.bos.coderule.api.CodeRuleInfo; import kd.bos.dataentity.OperateOption; import kd.bos.dataentity.entity.DynamicObject; import kd.bos.dataentity.entity.DynamicObjectCollection; import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType; import kd.bos.entity.EntityMetadataCache; import kd.bos.entity.datamodel.IDataModel; import kd.bos.entity.datamodel.events.PropertyChangedArgs; import kd.bos.entity.operate.result.OperationResult; import kd.bos.exception.KDBizException; import kd.bos.form.MessageBoxOptions; import kd.bos.form.events.AfterDoOperationEventArgs; import kd.bos.form.field.BasedataEdit; import kd.bos.form.field.DateRangeEdit; import kd.bos.form.field.events.BeforeF7SelectEvent; import kd.bos.form.field.events.BeforeF7SelectListener; import kd.bos.list.ListFilterParameter; import kd.bos.list.ListShowParameter; import kd.bos.logging.Log; import kd.bos.logging.LogFactory; import kd.bos.openapi.common.result.CustomApiResult; import kd.bos.orm.query.QCP; import kd.bos.orm.query.QFilter; import kd.bos.sdk.util.KHttpClientUtils; import kd.bos.servicehelper.BusinessDataServiceHelper; import kd.bos.servicehelper.QueryServiceHelper; import kd.bos.servicehelper.coderule.CodeRuleServiceHelper; import kd.bos.servicehelper.operation.OperationServiceHelper; import kd.bos.servicehelper.operation.SaveServiceHelper; import kd.bos.util.StringUtils; import kd.cosmic.jkjt.tmc.util.ParamsUtil; import kd.tmc.bei.common.helper.SyncAutoBalanceHelper; import kd.tmc.fbp.common.enums.FinOrgTypeEnum; import kd.tmc.fbp.common.helper.TmcDataServiceHelper; import kd.tmc.fbp.common.helper.TmcViewInputHelper; import kd.tmc.fbp.common.util.EmptyUtil; import org.apache.commons.lang.time.DateFormatUtils; import org.apache.commons.lang3.ObjectUtils; import java.io.IOException; import java.math.BigDecimal; import java.math.BigInteger; import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** * Module :资金云-银企互联-离线明细引入 * Description :将CBS的交易明细通过json格式进行数据同步 * * @author : zhujintao * @date : 2024/10/14 */ public class SynCbsDetailNewPlugin extends AbstractBillPlugIn implements BeforeF7SelectListener { private static Log logger = LogFactory.getLog(SynCbsDetailNewPlugin.class); private static final String KEY_OP_SAVE = "save"; //离线明细引入实体编码 private static final String KEY_ENTITY_BETRANSDETAIL = "bei_betransdetail_imp"; //出纳初始化 private static final String KEY_ENTITY_CASHINIT = "cas_cashmgtinit"; public SynCbsDetailNewPlugin() { } /** * 监听银行账户变化 * * @param e */ @Override public void registerListener(EventObject e) { super.registerListener(e); BasedataEdit accountBank = (BasedataEdit) this.getControl("nckd_accountbank"); accountBank.addBeforeF7SelectListener(this); } /** * 初始化,讲资金组织自动填充,交易日期自动填写 * * @param e */ @Override public void afterCreateNewData(EventObject e) { super.afterCreateNewData(e); Map customParams = this.getView().getFormShowParameter().getCustomParams(); List companyIdList = (List) customParams.get("companyIdList"); if (EmptyUtil.isNoEmpty(companyIdList)) { String first = String.valueOf(companyIdList.get(0)); if (!"".equals(first)) { DynamicObject[] load = TmcDataServiceHelper.load(companyIdList.stream().map((s) -> { return Long.parseLong(s.toString()); }).toArray(), EntityMetadataCache.getDataEntityType("bos_org")); DynamicObjectCollection orgColls = TmcDataServiceHelper.generateMultiPropValue(this.getModel().getDataEntity(), "nckd_org", load); TmcViewInputHelper.setValWithoutDataChanged(this.getModel(), "nckd_org", orgColls); } } Date currentDate = ParamsUtil.getCurrentDate(); TmcViewInputHelper.setValWithoutDataChanged(this.getModel(), "startdate", currentDate); TmcViewInputHelper.setValWithoutDataChanged(this.getModel(), "enddate", currentDate); } @Override public void propertyChanged(PropertyChangedArgs e) { super.propertyChanged(e); switch (e.getProperty().getName()) { case "nckd_detailtype": TmcViewInputHelper.setValWithoutDataChanged(this.getModel(), "nckd_accountbank", (Object) null); break; case "nckd_org": TmcViewInputHelper.setValWithoutDataChanged(this.getModel(), "nckd_accountbank", (Object) null); break; } } @Override public void beforeF7Select(BeforeF7SelectEvent evt) { String property = evt.getProperty().getName(); boolean mustInput; if ("nckd_accountbank".equals(property)) { mustInput = TmcViewInputHelper.checkMustInput(this.getView(), this.getModel(), false, "nckd_org"); if (!mustInput) { evt.setCancel(true); } else { ListShowParameter showParameter = (ListShowParameter) evt.getFormShowParameter(); ListFilterParameter filterParam = showParameter.getListFilterParameter(); List qFilters = filterParam.getQFilters(); DynamicObjectCollection orgs = (DynamicObjectCollection) this.getModel().getValue("nckd_org"); List orgIds = (List) orgs.stream().map((s) -> { return s.getDynamicObject("fbasedataid").getLong("id"); }).collect(Collectors.toList()); QFilter qFilter = SyncAutoBalanceHelper.getAccountBankQfilter(orgIds); if (this.getModel().getValue("nckd_detailtype") == null) { this.getView().showConfirm("请先选择明细类型!", MessageBoxOptions.OK); evt.setCancel(true); return; } String detailType = this.getModel().getValue("nckd_detailtype").toString(); //余额明细就是是否 开通CBS银企接口 为依据 if ("balance".equals(detailType)) { qFilter.and(new QFilter("nckd_issetcbs", QCP.equals, false)); } else if ("current".equals(detailType) || "history".equals(detailType)) { qFilter.and(new QFilter("nckd_issetcbs", QCP.equals, true)); } qFilters.add(qFilter); } } } @Override public void afterDoOperation(AfterDoOperationEventArgs args) { super.afterDoOperation(args); String operateKey = args.getOperateKey(); if (args.getOperationResult() != null && args.getOperationResult().isSuccess() && "syn".equals(operateKey)) { //同步CBS交易明细 -------------------------- //message 返回的提示信息 String message = synDetail(); if (StringUtils.isNotEmpty(message)) { this.getView().showConfirm(message, MessageBoxOptions.OK); return; } Map returnData = new HashMap(4); returnData.put("message", "success"); this.getView().returnDataToParent(returnData); this.getView().close(); } } /** * 同步交易明细 * * @return */ public String synDetail() { if (this.getModel().getValue("nckd_detailtype") == null) { return "请先选择明细类型!"; } String detailType = this.getModel().getValue("nckd_detailtype").toString(); //同步当日交易明细 if ("current".equals(detailType)) { //如果传入账号则按照传入账号查询,否则按照组织下的全部符合条件的账号查询 DynamicObject[] accounts = getSelectAccounts(""); if (accounts.length == 0) { return "请选择银行账号!"; } return synCurDetail(accounts); } //同步余额交易明细 else if ("balance".equals(detailType)) { DynamicObjectCollection accountCols = (DynamicObjectCollection) this.getModel().getValue("nckd_accountbank"); List accountIds = (List) accountCols.stream().map((s) -> { return s.getDynamicObject("fbasedataid").getLong("id"); }).collect(Collectors.toList()); //先更新cbs开通状态 String updatenckd_issetcbs = synAccountOpenStatus(accountIds); if (StringUtils.isNotEmpty(updatenckd_issetcbs)) { return updatenckd_issetcbs; } //如果传入账号则按照传入账号查询,否则按照组织下的全部符合条件的账号查询 DynamicObject[] accounts = getSelectAccounts("balance"); if (accounts.length == 0) { return "请选择银行账号!"; } return synBalanceDetail(accounts); } //同步历史交易明细 else if ("history".equals(detailType)) { DateRangeEdit headFieldEdit = this.getView().getControl("nckd_daterange"); String startField = headFieldEdit.getStartDateFieldKey(); String endField = headFieldEdit.getEndDateFieldKey(); if (this.getModel().getValue(endField) == null || this.getModel().getValue(endField) == null) { return "开始日期或结束日期不能为空。"; } Date startDate = (Date) this.getModel().getValue(startField); Date endDate = (Date) this.getModel().getValue(endField); int diffDays = ParamsUtil.getDiffDays(startDate, endDate); if (diffDays > 3) { return "开始日期与结束日期范围不允许超过3天。"; } DynamicObject[] accounts = getSelectAccounts(""); if (accounts.length == 0) { return "请选择银行账号!"; } return synHisDetail(accounts, startDate, endDate); } else { return null; } } /** * 同步余额交易明细 * * @param accounts */ public String synBalanceDetail(DynamicObject[] accounts) { //获取cbsurl //实时余额查询 String cbsUrl = getCbsUrl("balancedetail"); if ("请前往《CBS支付参数设置》进行支付参数设置".equals(cbsUrl)) { return cbsUrl; } List listObj = new ArrayList<>(); int count = 0; StringBuilder err = new StringBuilder(); for (DynamicObject acct : accounts) { JSONObject lastBal = queryLastBal(acct); Map header = new HashMap<>(); header.put("Content-Type", "application/json; charset=UTF-8"); Map params = new HashMap<>(); Map body = new HashMap<>(); body.put("accountNo", acct.getString("bankaccountnumber")); //直联未开通 //body.put("directConnectFlag", "0"); //分页查询参数 body.put("currentPage", 1); body.put("pageSize", 100); params.put("params", body); //保存CBS调用日志 String uuid = ParamsUtil.saveCBSLogData(cbsUrl, "detail", JSON.toJSONString(params)); String sTime = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"); logger.info("调用CBS接口实时余额查询开始时间:" + sTime); String sr; try { sr = KHttpClientUtils.postjson(cbsUrl, header, JSON.toJSONString(params)); } catch (IOException e) { throw new KDBizException("调用CBS实时余额查询接口错误" + e); } String eTime = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"); logger.info("调用CBS接口实时余额查询结束时间:" + eTime); //更新CBS调用日志 ParamsUtil.updateCBSLogData(uuid, sr); DynamicObject result = getBalanceDetailInfo(sr, acct, lastBal.getBigDecimal("bal")); if (result != null) { listObj.add(result); } count++; //批量保存 if (listObj.size() > 0 && count == 1000) { count = 0; OperationResult resultSave = OperationServiceHelper.executeOperate(KEY_OP_SAVE, KEY_ENTITY_BETRANSDETAIL, listObj.toArray(new DynamicObject[]{}), OperateOption.create()); if (resultSave.getAllErrorOrValidateInfo().size() > 0) { for (int index = 0; index < resultSave.getAllErrorOrValidateInfo().size(); index++) { String message = resultSave.getAllErrorOrValidateInfo().get(index).getMessage(); err.append("/r/n").append(message); } } listObj.clear(); } } //批量保存 if (listObj.size() > 0) { OperationResult resultSave = OperationServiceHelper.executeOperate(KEY_OP_SAVE, KEY_ENTITY_BETRANSDETAIL, listObj.toArray(new DynamicObject[]{}), OperateOption.create()); if (resultSave.getAllErrorOrValidateInfo().size() > 0) { for (int index = 0; index < resultSave.getAllErrorOrValidateInfo().size(); index++) { String message = resultSave.getAllErrorOrValidateInfo().get(index).getMessage(); err.append("/r/n").append(message); } } } if (err.length() > 0) { return err.toString(); } return "同步成功"; } /** * 保存余额交易明细 * * @param cbssr * @param kingdeeAccount * @param lastBal * @return */ private DynamicObject getBalanceDetailInfo(String cbssr, DynamicObject kingdeeAccount, BigDecimal lastBal) { JSONObject cbsObj = JSON.parseObject(cbssr); JSONObject data = (JSONObject) cbsObj.get("data"); JSONObject dataList = (JSONObject) data.get("data"); JSONArray array = (JSONArray) dataList.get("list"); if (array.size() > 0) { JSONObject cbsAccount = array.getJSONObject(0); DynamicObject detailInfo = null; try { detailInfo = parseBalanceBetransDetail(cbsAccount, kingdeeAccount, lastBal); } catch (ParseException e) { throw new KDBizException("CBS返回数据转换未交易明细单据对象错误" + e); } return detailInfo; } return null; } /** * 组装余额交易明细info * * @param cbsAccount * @param kingdeeAcct * @param lastBal * @return * @throws ParseException */ private DynamicObject parseBalanceBetransDetail(JSONObject cbsAccount, DynamicObject kingdeeAcct, BigDecimal lastBal) throws ParseException { //账户余额 BigDecimal actBal = cbsAccount.getBigDecimal("accountBalance"); if (actBal == null) { actBal = BigDecimal.ZERO; } //处理日期类字段 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); //交易时间 Date time = new Date(); //交易日期 Date date = sdf1.parse(sdf1.format(time)); //如果当天存在cbs交易明细,则不增加交易明细 Boolean isExistDetail = ParamsUtil.isExistsDetail(kingdeeAcct, date, new String[]{"curday", "history"}); if (isExistDetail) { return null; } DynamicObject objectInfo = ParamsUtil.getDetailInfo(kingdeeAcct, date, "balancecompare"); if (objectInfo == null) { objectInfo = BusinessDataServiceHelper.newDynamicObject(KEY_ENTITY_BETRANSDETAIL); } objectInfo.set("nckd_generatemethod", "balancecompare"); //借贷方向:1:借方,2:贷方 String direct = ""; BigDecimal dayActAmt = actBal.subtract(lastBal).abs(); if (lastBal.compareTo(actBal) > 0) { direct = "1"; } else if (lastBal.compareTo(actBal) < 0) { direct = "2"; } else { return null; } String detailid = UUID.randomUUID().toString().replace("-", ""); detailid = (detailid == null) ? ("uuid" + String.valueOf(System.currentTimeMillis())) : detailid; objectInfo.set("oppunit", null);//对方用户名 objectInfo.set("oppbanknumber", null);//对方账号 objectInfo.set("oppbank", null);//对方开户行 objectInfo.set("detailid", detailid);//明细流水号 objectInfo.set("bizrefno", detailid);//业务参考号 objectInfo.set("uniqueseq", detailid + "01");//银行主键 objectInfo.set("description", null);//摘要 //判断此明细流水号是否已存在,已存在的记录不接收 QFilter filterBizRefNo = new QFilter("detailid", QCP.equals, objectInfo.getString("detailid")); QFilter filterDataSource = new QFilter("datasource", QCP.equals, "import"); QFilter[] filters = new QFilter[]{filterBizRefNo, filterDataSource}; DynamicObject betransDetailInfo = BusinessDataServiceHelper.loadSingle(KEY_ENTITY_BETRANSDETAIL, "id, billno", filters); if (betransDetailInfo != null) { return null; } //交易时间 objectInfo.set("bizTime", new Timestamp(time.getTime())); //交易日期 objectInfo.set("bizdate", new Timestamp(date.getTime())); //入账状态 objectInfo.set("receredtype", "0"); //发生额 objectInfo.set("debitamount", BigDecimal.ZERO); objectInfo.set("creditamount", BigDecimal.ZERO); String amountField = ParamsUtil.getAmountFieldName(direct); objectInfo.set(amountField, dayActAmt); //手续费 // objectInfo.set("transfercharge", BigDecimal.ZERO); //余额 objectInfo.set("transbalance", actBal); //单据状态 objectInfo.set("billstatus", "A"); //数据来源 objectInfo.set("datasource", "import"); //业务类型 objectInfo.set("biztype", "1"); //币别 DynamicObjectCollection collection = kingdeeAcct.getDynamicObjectCollection("currency"); Long currencyId = 0L; for (DynamicObject item : collection) { //引用该基础资料的单据id long pkid = item.getLong("pkid"); // 获取该基础资料的动态对象 DynamicObject fbasedataid = item.getDynamicObject("fbasedataid"); //获取该基础资料的id currencyId = item.getLong("fbasedataid_id"); } DynamicObject currency = BusinessDataServiceHelper.loadSingleFromCache(currencyId, "bd_currency"); objectInfo.set("currency", currency); //银行账号 objectInfo.set("accountbank", kingdeeAcct); objectInfo.set("bank", kingdeeAcct.get("bank")); objectInfo.set("company", kingdeeAcct.get("company")); CodeRuleInfo codeRule = CodeRuleServiceHelper.getCodeRule(objectInfo.getDataEntityType().getName(), objectInfo, null); String billno = CodeRuleServiceHelper.getNumber(codeRule, objectInfo); objectInfo.set("billno", billno); return objectInfo; } /** * 银行账户上一日余额 * * @param acct * @return */ private JSONObject queryLastBal(DynamicObject acct) { String code = "200"; BigDecimal bal = BigDecimal.ZERO; SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); //交易时间 Date time = new Date(); //交易日期 Date date = null; try { date = sdf1.parse(sdf1.format(time)); } catch (ParseException e) { throw new RuntimeException(e); } QFilter qFilter = new QFilter("accountbank.id", QCP.equals, acct.getLong("id")); qFilter.and(new QFilter("bizdate", QCP.less_than, date)); String selectProperties = "transbalance"; String orderBy = "biztime desc"; DynamicObject[] detailList = BusinessDataServiceHelper.load(KEY_ENTITY_BETRANSDETAIL, selectProperties, qFilter.toArray(), orderBy); //如果没有交易明细,则查找是否有做出纳初始化初始余额 if (detailList.length == 0) { qFilter = new QFilter("entrybank.bank_accountbank", QCP.equals, acct.getLong("id")); selectProperties = "entrybank.bank_journalbalance"; orderBy = "startperiod.number desc"; DynamicObjectCollection objCols = QueryServiceHelper.query(KEY_ENTITY_CASHINIT, selectProperties, qFilter.toArray(), orderBy); if (objCols.size() > 0) { code = "200"; bal = objCols.get(0).getBigDecimal("entrybank.bank_journalbalance"); } } else { code = "200"; bal = detailList[0].getBigDecimal("transbalance"); } JSONObject reslutData = new JSONObject(); reslutData.put("code", code); reslutData.put("bal", bal); return reslutData; } /** * 同步当日交易明细 * * @param accounts */ private String synCurDetail(DynamicObject[] accounts) { //获取cbsurl //交易明细查询 String cbsUrl = getCbsUrl("trandetail"); if ("请前往《CBS支付参数设置》进行支付参数设置".equals(cbsUrl)) { return cbsUrl; } //构造post请求参数 Map header = new HashMap<>(); header.put("Content-Type", "application/json; charset=UTF-8"); Map params = new HashMap<>(); Map body = new HashMap<>(); Date startDate = (Date) this.getModel().getValue("startDate"); Date endDate = (Date) this.getModel().getValue("endDate"); body.put("startDate", DateFormatUtils.format(startDate, "yyyy-MM-dd")); body.put("endDate", DateFormatUtils.format(endDate, "yyyy-MM-dd")); body.put("dateType", "0"); List bankaccountnumberList = Arrays.stream(accounts).map(e -> e.getString("bankaccountnumber")).collect(Collectors.toList()); body.put("accountNoList", bankaccountnumberList); //body.put("currentFlag", "1"); //分页查询参数 body.put("currentPage", 1); body.put("pageSize", 100); params.put("params", body); //保存CBS调用日志 String uuid = ParamsUtil.saveCBSLogData(cbsUrl, "detail", JSON.toJSONString(params)); String sTime = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"); logger.info("调用CBS接口交易明细查询开始时间:" + sTime); String resultStr; try { resultStr = KHttpClientUtils.postjson(cbsUrl, header, JSON.toJSONString(params)); } catch (IOException e) { throw new KDBizException("调用CBS交易明细接口错误" + e); } String eTime = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"); logger.info("调用CBS接口交易明细查询结束时间:" + eTime); //更新CBS调用日志 ParamsUtil.updateCBSLogData(uuid, resultStr); //转换cbs的返回数据 if (StringUtils.isNotEmpty(resultStr)) { StringBuilder errMsg = new StringBuilder(); return saveCurDetailData(resultStr, cbsUrl, header, params, errMsg); } else { return "分页查询第" + 1 + "次查询CBS接口交易明细查询未获取到记录"; } } /** * 保存交易明细 * * @param resultstr * @param cbsUrl * @param header * @param params * @param errMsg * @return */ private String saveCurDetailData(String resultstr, String cbsUrl, Map header, Map params, StringBuilder errMsg) { JSONObject cbsObj = JSON.parseObject(resultstr); if (200 != cbsObj.getInteger("code")) { return cbsObj.get("msg").toString(); } JSONObject data = (JSONObject) cbsObj.get("data"); JSONObject dataList = (JSONObject) data.get("data"); JSONArray array = (JSONArray) dataList.get("list"); if (array.size() > 0) { List listObj = new ArrayList<>(); int count = 0; for (int i = 0; i < array.size(); i++) { DynamicObject detailInfo = null; try { detailInfo = parseCurBetransDetail(array.getJSONObject(i)); } catch (ParseException e) { throw new KDBizException("CBS返回数据转换未交易明细单据对象错误" + e); } if (detailInfo != null) { listObj.add(detailInfo); } count++; //满足100条就先批量保存一批 if (listObj.size() > 0 && count == 100) { count = 0; OperationResult resultSave = OperationServiceHelper.executeOperate(KEY_OP_SAVE, KEY_ENTITY_BETRANSDETAIL, listObj.toArray(new DynamicObject[]{}), OperateOption.create()); if (resultSave.getAllErrorOrValidateInfo().size() > 0) { for (int index = 0; index < resultSave.getAllErrorOrValidateInfo().size(); index++) { String message = resultSave.getAllErrorOrValidateInfo().get(index).getMessage(); errMsg.append("/r/n").append(message); } } listObj.clear(); } } //批量保存 if (listObj.size() > 0) { OperationResult resultSave = OperationServiceHelper.executeOperate(KEY_OP_SAVE, KEY_ENTITY_BETRANSDETAIL, listObj.toArray(new DynamicObject[]{}), OperateOption.create()); if (resultSave.getAllErrorOrValidateInfo().size() > 0) { for (int index = 0; index < resultSave.getAllErrorOrValidateInfo().size(); index++) { String message = resultSave.getAllErrorOrValidateInfo().get(index).getMessage(); errMsg.append("/r/n").append(message); } } } } //判断是不是最后一页,否继续查询 if (dataList.get("isLastPage") != null && !dataList.getBoolean("isLastPage")) { Map body = (Map) params.get("params"); int currentPage = (int) body.get("currentPage") + 1; body.put("currentPage", currentPage); //保存CBS调用日志 String uuid = ParamsUtil.saveCBSLogData(cbsUrl, "detail", JSON.toJSONString(params)); String sTime = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"); logger.info("调用CBS接口交易明细查询开始时间:" + sTime); String sr = ""; try { Map params1 = new HashMap<>(); params1.put("params", body); sr = KHttpClientUtils.postjson(cbsUrl, header, JSON.toJSONString(params1)); } catch (IOException e) { throw new KDBizException("调用CBS交易明细接口错误" + e); } String eTime = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"); logger.info("调用CBS接口交易明细查询结束时间:" + eTime); //更新CBS调用日志 ParamsUtil.updateCBSLogData(uuid, sr); if (StringUtils.isNotEmpty(sr)) { saveCurDetailData(sr, cbsUrl, header, params, errMsg); } else { errMsg.append("/r/n").append("分页查询第" + currentPage + "次查询CBS接口交易明细查询未获取到记录").toString(); } } if (errMsg.length() > 0) { return errMsg.toString(); } return "同步成功"; } /** * 组装当日交易明细info * * @param cbsObj * @return * @throws ParseException */ private DynamicObject parseCurBetransDetail(JSONObject cbsObj) throws ParseException { //不接收情况:交易额为空、余额为空、当日明细流水号为空 if (StringUtils.isEmpty(cbsObj.getString("incurredAmount")) || StringUtils.isEmpty(cbsObj.getString("accountBalance")) || StringUtils.isEmpty(cbsObj.getString("transactionSerialNumber"))) { return null; } String accountNumber = cbsObj.getString("accountNo"); QFilter filterNumber = new QFilter("bankaccountnumber", QCP.equals, accountNumber); QFilter[] filters = new QFilter[]{filterNumber}; DynamicObject account = BusinessDataServiceHelper.loadSingleFromCache("bd_accountbanks", filters); if (account == null) { return null; } //处理日期类字段 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.sss"); //交易时间 Date bankTransactionDate = new Date(cbsObj.getLong("bankTransactionDate")); String formatDate = sdf.format(bankTransactionDate); Date time = sdf.parse(formatDate); //交易日期 Date date = sdf1.parse(formatDate); //更新时间 //Date updateTime = sdf2.parse(cbsObj.getString("UPDTIM")); //---------------------------- //如果交易日期与当前日期不一致则不接收 Date curDate = new Date(); if (!sdf1.format(time).equals(sdf1.format(curDate))) { return null; } //如果当天存在根据余额生成的交易明细,则不增加交易明细 Boolean isExistDetail = ParamsUtil.isExistsDetail(account, date, new String[]{"balancecompare"}); if (isExistDetail) { return null; } DynamicObject objectInfo = BusinessDataServiceHelper.newDynamicObject(KEY_ENTITY_BETRANSDETAIL); objectInfo.set("accountbank", account);//银行账户 objectInfo.set("bank", account.get("bank"));//开户行 objectInfo.set("company", account.get("company"));//资金组织 objectInfo.set("nckd_generatemethod", "curday"); //处理文本类字段 //ParamsUtil.BetransDetailFieldStringMap.forEach((key, value) -> { // objectInfo.set(value, cbsObj.getString(key)); //}); objectInfo.set("oppunit", cbsObj.getString("oppositeName"));//对方用户名 objectInfo.set("oppbanknumber", cbsObj.getString("oppositeAccount"));//对方账号 objectInfo.set("oppbank", cbsObj.getString("oppositeOpeningBank"));//对方开户行 //objectInfo.set(, "detailid",cbsObj.getString("BNKFLW"));//明细流水号 objectInfo.set("bizrefno", cbsObj.getString("erpSerialNumber"));//业务参考号 //objectInfo.set("description", cbsObj.getString("digest"));//摘要 objectInfo.set("nckd_dtlseq", cbsObj.getString("transactionSerialNumber"));//交易流水号 objectInfo.set("nckd_cbsbnkflw", cbsObj.getString("bankSerialNumber"));//银行流水号 //objectInfo.set("nckd_cbsoriseq", cbsObj.getString("ORISEQ"));//原始流水号---------------------- //objectInfo.set("nckd_cbspaynbr", cbsObj.getString("PAYNBR"));//结算业务流水号-------------------- //objectInfo.set("nckd_cbserpnbr", cbsObj.getString("ERPNBR"));//结算业务参考号---------------------- //objectInfo.set("nckd_cbsrefcod", cbsObj.getString("REFCOD"));//业务参考号---------------------- //当日交易明细使用DTLSEQ做为唯一值 String detailId = cbsObj.getString("transactionSerialNumber"); String uniqueseq = detailId + "-01"; //判断此银行主键是否已存在,已存在的记录不接收 QFilter filter = new QFilter("uniqueseq", QCP.equals, uniqueseq); filter.or(new QFilter("detailid", QCP.equals, detailId)); DynamicObject betransDetailInfo = BusinessDataServiceHelper.loadSingle(KEY_ENTITY_BETRANSDETAIL, "id, billno", filter.toArray()); if (betransDetailInfo != null) { return null; } //明细流水号 objectInfo.set("detailid", detailId); //银行主键 objectInfo.set("uniqueseq", uniqueseq); Long dtlseq = Long.valueOf(cbsObj.getString("transactionSerialNumber")); objectInfo.set("sortno", dtlseq); String usage = cbsObj.getString("digest") == null ? "" : cbsObj.getString("digest"); String description = objectInfo.getString("description") == null ? "" : objectInfo.getString("description"); description = description.concat(usage); objectInfo.set("description", description); //cbs更新时间 //objectInfo.set("nckd_cbsbiztime", new Timestamp(updateTime.getTime()));--------------------------------- //交易时间 objectInfo.set("bizTime", new Timestamp(time.getTime())); //交易日期 objectInfo.set("bizdate", new Timestamp(date.getTime())); //处理数字类字段 //借贷方向:1:借方,2:贷方 String direct = cbsObj.getString("loanType"); //入账状态 objectInfo.set("receredtype", "0"); //发生额 String amountField = ParamsUtil.getAmountFieldName(direct); objectInfo.set(amountField, getBigDecimal(cbsObj.get("incurredAmount"))); //手续费 //objectInfo.set("transfercharge", getBigDecimal(cbsObj.get("SERFEE")));--------------------------------------- //余额 objectInfo.set("transbalance", getBigDecimal(cbsObj.get("accountBalance"))); //单据状态 objectInfo.set("billstatus", "A"); //数据来源 objectInfo.set("datasource", "import"); //业务类型 //String bizType = ParamsUtil.getBizType(cbsObj.getString("PTCTYP")); ---------------------------------------- /*objectInfo.set("biztype", bizType); //上划 if ("2".equals(bizType)) { objectInfo.set("istransup", "1"); } //下拨 if ("3".equals(bizType)) { objectInfo.set("istransdown", "1"); }*/ //币别 filterNumber = new QFilter("number", QCP.equals, ParamsUtil.CurrencyMap.get(cbsObj.getString("currency"))); filters = new QFilter[]{filterNumber}; DynamicObject currency = BusinessDataServiceHelper.loadSingleFromCache("bd_currency", filters); objectInfo.set("currency", currency); CodeRuleInfo codeRule = CodeRuleServiceHelper.getCodeRule(objectInfo.getDataEntityType().getName(), objectInfo, null); String billno = CodeRuleServiceHelper.getNumber(codeRule, objectInfo); objectInfo.set("billno", billno); return objectInfo; } /** * 同步历史交易明细 * * @param accounts * @param startDate * @param endDate */ private String synHisDetail(DynamicObject[] accounts, Date startDate, Date endDate) { //获取cbsurl //交易明细查询 String cbsUrl = getCbsUrl("trandetail"); if ("请前往《CBS支付参数设置》进行支付参数设置".equals(cbsUrl)) { return cbsUrl; } Map header = new HashMap<>(); header.put("Content-Type", "application/json; charset=UTF-8"); Map params = new HashMap<>(); Map body = new HashMap<>(); body.put("startDate", DateFormatUtils.format(startDate, "yyyy-MM-dd")); body.put("endDate", DateFormatUtils.format(endDate, "yyyy-MM-dd")); body.put("dateType", "0"); List bankaccountnumberList = Arrays.stream(accounts).map(e -> e.getString("bankaccountnumber")).collect(Collectors.toList()); body.put("accountNoList", bankaccountnumberList); //body.put("currentFlag", "2"); //分页查询参数 body.put("currentPage", 1); body.put("pageSize", 100); params.put("params", body); //保存CBS调用日志 String uuid = ParamsUtil.saveCBSLogData(cbsUrl, "detail", JSON.toJSONString(params)); String sTime = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"); logger.info("调用CBS接口交易明细查询开始时间:" + sTime); String resultstr; try { resultstr = KHttpClientUtils.postjson(cbsUrl, header, JSON.toJSONString(params)); } catch (IOException e) { throw new KDBizException("调用CBS交易明细接口错误" + e); } String eTime = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"); logger.info("调用CBS接口交易明细查询结束时间:" + eTime); //更新CBS调用日志 ParamsUtil.updateCBSLogData(uuid, resultstr); if (StringUtils.isNotEmpty(resultstr)) { StringBuilder errMsg = new StringBuilder(); return saveHisDetailData(resultstr, cbsUrl, header, params, errMsg); } else { return "分页查询第" + 1 + "次查询CBS接口交易明细查询未获取到记录"; } } /** * 保存历史交易明细 * * @param resultstr * @param cbsUrl * @param header * @param params * @param errMsg * @return */ private String saveHisDetailData(String resultstr, String cbsUrl, Map header, Map params, StringBuilder errMsg) { JSONObject cbsObj = JSON.parseObject(resultstr); if (200 != cbsObj.getInteger("code")) { return cbsObj.get("msg").toString(); } JSONObject data = (JSONObject) cbsObj.get("data"); JSONObject dataList = (JSONObject) data.get("data"); JSONArray array = (JSONArray) dataList.get("list"); if (array.size() > 0) { List listObj = new ArrayList<>(); int count = 0; for (int i = 0; i < array.size(); i++) { DynamicObject detailInfo = null; try { detailInfo = parseHistoryBetransDetail(array.getJSONObject(i)); } catch (ParseException e) { throw new KDBizException("CBS返回数据转换未交易明细单据对象错误" + e); } if (detailInfo != null) { listObj.add(detailInfo); } count++; //批量保存 if (listObj.size() > 0 && count == 100) { count = 0; OperationResult resultSave = OperationServiceHelper.executeOperate(KEY_OP_SAVE, KEY_ENTITY_BETRANSDETAIL, listObj.toArray(new DynamicObject[]{}), OperateOption.create()); if (resultSave.getAllErrorOrValidateInfo().size() > 0) { for (int index = 0; index < resultSave.getAllErrorOrValidateInfo().size(); index++) { String message = resultSave.getAllErrorOrValidateInfo().get(index).getMessage(); errMsg.append("/r/n").append(message); } } listObj.clear(); } } //批量保存 if (listObj.size() > 0) { OperationResult resultSave = OperationServiceHelper.executeOperate(KEY_OP_SAVE, KEY_ENTITY_BETRANSDETAIL, listObj.toArray(new DynamicObject[]{}), OperateOption.create()); if (resultSave.getAllErrorOrValidateInfo().size() > 0) { for (int index = 0; index < resultSave.getAllErrorOrValidateInfo().size(); index++) { String message = resultSave.getAllErrorOrValidateInfo().get(index).getMessage(); errMsg.append("/r/n").append(message); } } } } //判断是不是最后一页,否继续查询 if (dataList.get("isLastPage") != null && !dataList.getBoolean("isLastPage")) { Map body = (Map) params.get("params"); int currentPage = (int) body.get("currentPage") + 1; body.put("currentPage", currentPage); //保存CBS调用日志 String uuid = ParamsUtil.saveCBSLogData(cbsUrl, "detail", JSON.toJSONString(params)); String sTime = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"); logger.info("调用CBS接口交易明细查询开始时间:" + sTime); String sr; try { Map params1 = new HashMap<>(); params1.put("params", body); sr = KHttpClientUtils.postjson(cbsUrl, header, JSON.toJSONString(params1)); } catch (IOException e) { throw new KDBizException("调用CBS交易明细接口错误" + e); } String eTime = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"); logger.info("调用CBS接口交易明细查询结束时间:" + eTime); //更新CBS调用日志 ParamsUtil.updateCBSLogData(uuid, sr); if (StringUtils.isNotEmpty(sr)) { saveHisDetailData(sr, cbsUrl, header, params, errMsg); } else { errMsg.append("/r/n").append("分页查询第" + currentPage + "次查询CBS接口交易明细查询未获取到记录").toString(); } } if (errMsg.length() > 0) { return errMsg.toString(); } return "同步成功"; } /** * 组装历史交易明细info * * @param cbsObj * @return * @throws ParseException */ private DynamicObject parseHistoryBetransDetail(JSONObject cbsObj) throws ParseException { //不接收情况:交易额为空、余额为空、当日明细流水号为空 if (StringUtils.isEmpty(cbsObj.getString("incurredAmount")) || StringUtils.isEmpty(cbsObj.getString("accountBalance")) || StringUtils.isEmpty(cbsObj.getString("transactionSerialNumber"))) { return null; } String accountNumber = cbsObj.getString("accountNo"); QFilter filterNumber = new QFilter("bankaccountnumber", QCP.equals, accountNumber); QFilter[] filters = new QFilter[]{filterNumber}; DynamicObject account = BusinessDataServiceHelper.loadSingleFromCache("bd_accountbanks", filters); if (account == null) { return null; } //处理日期类字段 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.sss"); //交易时间 Date bankTransactionDate = new Date(cbsObj.getLong("bankTransactionDate")); String formatDate = sdf.format(bankTransactionDate); Date time = sdf.parse(formatDate); //交易日期 Date date = sdf1.parse(formatDate); //更新时间 //Date updateTime = sdf2.parse(cbsObj.getString("UPDTIM")); //---------------------------- //如果当天存在根据余额生成的交易明细,则不增加交易明细 Boolean isExistDetail = ParamsUtil.isExistsDetail(account, date, new String[]{"balancecompare"}); if (isExistDetail) { return null; } DynamicObject objectInfo = BusinessDataServiceHelper.newDynamicObject(KEY_ENTITY_BETRANSDETAIL); objectInfo.set("accountbank", account);//银行账户 objectInfo.set("bank", account.get("bank"));//开户行 objectInfo.set("company", account.get("company"));//资金组织 objectInfo.set("nckd_generatemethod", "history"); //处理文本类字段 //ParamsUtil.BetransDetailFieldStringMap.forEach((key, value) -> { // objectInfo.set(value, cbsObj.getString(key)); //}); objectInfo.set("oppunit", cbsObj.getString("oppositeName"));//对方用户名 objectInfo.set("oppbanknumber", cbsObj.getString("oppositeAccount"));//对方账号 objectInfo.set("oppbank", cbsObj.getString("oppositeOpeningBank"));//对方开户行 //objectInfo.set(, "detailid",cbsObj.getString("BNKFLW"));//明细流水号 objectInfo.set("bizrefno", cbsObj.getString("erpSerialNumber"));//业务参考号 //objectInfo.set("description", cbsObj.getString("digest"));//摘要 objectInfo.set("nckd_dtlseq", cbsObj.getString("transactionSerialNumber"));//交易流水号 objectInfo.set("nckd_cbsbnkflw", cbsObj.getString("bankSerialNumber"));//银行流水号 //objectInfo.set("nckd_cbsoriseq", cbsObj.getString("ORISEQ"));//原始流水号---------------------- //objectInfo.set("nckd_cbspaynbr", cbsObj.getString("PAYNBR"));//结算业务流水号-------------------- //objectInfo.set("nckd_cbserpnbr", cbsObj.getString("ERPNBR"));//结算业务参考号---------------------- //objectInfo.set("nckd_cbsrefcod", cbsObj.getString("REFCOD"));//业务参考号---------------------- //历史交易明细使用CURSEQ做为唯一值,对应当日交易明细的DTLSEQ String detailId = cbsObj.getString("transactionSerialNumber"); String uniqueseq = detailId + "-01"; //判断此银行主键是否已存在,已存在的记录不接收 QFilter filter = new QFilter("uniqueseq", QCP.equals, uniqueseq); filter.or(new QFilter("detailid", QCP.equals, detailId)); DynamicObject betransDetailInfo = BusinessDataServiceHelper.loadSingle(KEY_ENTITY_BETRANSDETAIL, "id, billno", filter.toArray()); if (betransDetailInfo != null) { return null; } //明细流水号 objectInfo.set("detailid", detailId); //银行主键 objectInfo.set("uniqueseq", uniqueseq); Long dtlseq = Long.valueOf(cbsObj.getString("transactionSerialNumber")); objectInfo.set("sortno", dtlseq); String usage = cbsObj.getString("digest") == null ? "" : cbsObj.getString("digest"); String description = objectInfo.getString("description") == null ? "" : objectInfo.getString("description"); description = description.concat(usage); objectInfo.set("description", description); //cbs更新时间 //objectInfo.set("nckd_cbsbiztime", new Timestamp(updateTime.getTime()));--------------------------------- //交易时间 objectInfo.set("bizTime", new Timestamp(time.getTime())); //交易日期 objectInfo.set("bizdate", new Timestamp(date.getTime())); //处理数字类字段 //借贷方向:1:借方,2:贷方 String direct = cbsObj.getString("loanType"); //入账状态 objectInfo.set("receredtype", "0"); //发生额 String amountField = ParamsUtil.getAmountFieldName(direct); objectInfo.set(amountField, getBigDecimal(cbsObj.get("incurredAmount"))); //手续费 //objectInfo.set("transfercharge", getBigDecimal(cbsObj.get("SERFEE")));--------------------------------------- //余额 objectInfo.set("transbalance", getBigDecimal(cbsObj.get("accountBalance"))); //单据状态 objectInfo.set("billstatus", "A"); //数据来源 objectInfo.set("datasource", "import"); //业务类型 //String bizType = ParamsUtil.getBizType(cbsObj.getString("PTCTYP")); ---------------------------------------- /*objectInfo.set("biztype", bizType); //上划 if ("2".equals(bizType)) { objectInfo.set("istransup", "1"); } //下拨 if ("3".equals(bizType)) { objectInfo.set("istransdown", "1"); }*/ //币别 filterNumber = new QFilter("number", QCP.equals, ParamsUtil.CurrencyMap.get(cbsObj.getString("currency"))); filters = new QFilter[]{filterNumber}; DynamicObject currency = BusinessDataServiceHelper.loadSingleFromCache("bd_currency", filters); objectInfo.set("currency", currency); CodeRuleInfo codeRule = CodeRuleServiceHelper.getCodeRule(objectInfo.getDataEntityType().getName(), objectInfo, null); String billno = CodeRuleServiceHelper.getNumber(codeRule, objectInfo); objectInfo.set("billno", billno); return objectInfo; } public CustomApiResult returnResult(String code, String message) { JSONObject reslutData = new JSONObject(); reslutData.put("code", code); reslutData.put("message", message); CustomApiResult result = CustomApiResult.success(reslutData); return result; } /** * 获取组织下的所有银行账号 * * @return */ public DynamicObject[] getSelectAccounts(String method) { logger.info("获取组织下的所有银行账号开始" + method); IDataModel model = this.getModel(); DynamicObjectCollection orgs = model.getDataEntity().getDynamicObjectCollection("nckd_org"); List orgIds = (List) orgs.stream().map((s) -> { return s.getDynamicObject("fbasedataid").getLong("id"); }).collect(Collectors.toList()); DynamicObjectCollection accountBanks = model.getDataEntity().getDynamicObjectCollection("nckd_accountbank"); List accountBankIds; QFilter qFilter; if (EmptyUtil.isEmpty(accountBanks)) { qFilter = SyncAutoBalanceHelper.getAccountBankQfilter(orgIds); if ("balance".equals(method)) { qFilter.and(new QFilter("nckd_issetcbs", QCP.equals, false)); } accountBanks = QueryServiceHelper.query("bd_accountbanks", "id", qFilter.toArray()); accountBankIds = (List) accountBanks.stream().map((s) -> { return s.getLong("id"); }).collect(Collectors.toList()); } else { accountBankIds = (List) accountBanks.stream().map((s) -> { return s.getDynamicObject("fbasedataid").getLong("id"); }).collect(Collectors.toList()); } logger.info("获取组织下的所有银行账号accountBankIds" + accountBankIds.toString()); DynamicObjectType type = EntityMetadataCache.getDataEntityType("am_accountbank"); DynamicObject[] accountBankList = BusinessDataServiceHelper.load(accountBankIds.toArray(new Object[accountBankIds.size()]), type); // logger.info("获取组织下的所有银行账号accountBankList" + JSON.toJSONString(accountBankList)); return accountBankList; } /** * 获取cbs接口在中台的配置的接口地址 * * @return */ private String getCbsUrl(String key) { //获取CBS支付参数设置 的 接口地址 域名 appkey QFilter qFilter = new QFilter("number", QCP.equals, "cbs-20241015001"); DynamicObject cbspaysetting = BusinessDataServiceHelper.loadSingle("nckd_cbspaysetting", "id,name,nckd_yuming,nckd_appkey,nckd_entryentity.nckd_interfacenbr,nckd_entryentity.nckd_interfacename,nckd_entryentity.nckd_interfaceurl", qFilter.toArray()); if (ObjectUtils.isEmpty(cbspaysetting)) { return "请前往《CBS支付参数设置》进行支付参数设置"; } //域名 String yuming = cbspaysetting.getString("nckd_yuming"); //appkey String appkey = cbspaysetting.getString("nckd_appkey"); DynamicObjectCollection entryentity = cbspaysetting.getDynamicObjectCollection("nckd_entryentity"); //获取的接口地址转换为map //转成 key nckd_interfacenbr value nckd_interfaceurl Map mapentity = entryentity.stream().collect(Collectors.toMap(k -> k.getString("nckd_interfacenbr"), v -> v.getString("nckd_interfaceurl"))); //交易明细接口地址 String interfaceurl = mapentity.get(key); String cbsUrl = yuming + interfaceurl + "?appKey=" + appkey; return cbsUrl; } /** * @param objValue * @return */ private BigDecimal getBigDecimal(Object objValue) { BigDecimal ret = null; if (objValue == null || objValue.equals("")) { return BigDecimal.ZERO; } if (objValue instanceof BigDecimal) { ret = (BigDecimal) objValue; } else if (objValue instanceof String) { ret = new BigDecimal((String) objValue); } else if (objValue instanceof BigInteger) { ret = new BigDecimal((BigInteger) objValue); } else if (objValue instanceof Number) { ret = new BigDecimal(((Number) objValue).doubleValue()); } else { throw new ClassCastException("Not possible to coerce [" + objValue + "] from class " + objValue.getClass() + " into a BigDecimal."); } return ret; } /** * 同步CBS是否开通银企直连平台状态到银行账户 * * @return */ private String synAccountOpenStatus(List accountIds) { String selectFields = "id, number, nckd_issetcbs, openorg"; QFilter qFilter = new QFilter("issetbankinterface", "=", "0"); qFilter.and("isvirtual", "=", "0"); qFilter.and("finorgtype", "!=", FinOrgTypeEnum.CLEARINGHOUSE.getValue()); qFilter.and("nckd_issetcbs", "=", "0"); if (accountIds != null && accountIds.size() > 0) { qFilter.and("id", "in", accountIds); } DynamicObject[] accounts = BusinessDataServiceHelper.load("am_accountbank", selectFields, new QFilter[]{qFilter}); if (accounts.length > 0) { List listObj = new ArrayList<>(); //获取cbsurl 账户列表查询 String cbsUrl = getCbsUrl("accountlist"); if ("请前往《CBS支付参数设置》进行支付参数设置".equals(cbsUrl)) { return cbsUrl; } Map header = new HashMap<>(); header.put("Content-Type", "application/json; charset=UTF-8"); Map params = new HashMap<>(); Map body = new HashMap<>(); //分页查询参数 body.put("currentPage", 1); body.put("pageSize", 100); params.put("params", body); for (DynamicObject account : accounts) { body.put("accountNo", account.getString("bankaccountnumber")); //保存CBS调用日志 String uuid = ParamsUtil.saveCBSLogData(cbsUrl, "synstatus", JSON.toJSONString(params)); String sTime = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"); logger.info("调用CBS接口账户列表查询开始时间:" + sTime); String resultstr; try { resultstr = KHttpClientUtils.postjson(cbsUrl, header, JSON.toJSONString(params)); } catch (IOException e) { throw new KDBizException("调用CBS账户列表查询接口错误" + e); } String eTime = DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"); logger.info("调用CBS接口账户列表查询结束时间:" + eTime); //更新CBS调用日志 ParamsUtil.updateCBSLogData(uuid, resultstr); //校验CBS系统中账户是否开通银企直连平台 Boolean isOpenCBS = checkAccountOpenStatus(resultstr); if (isOpenCBS) { account.set("nckd_issetcbs", true); listObj.add(account); } } if (listObj.size() > 0) { Object[] saveResult = SaveServiceHelper.save(listObj.toArray(new DynamicObject[]{})); if (saveResult == null || saveResult.length <= 0) { logger.info("更新银行账户中的开通CBS银企接口字段失败"); return "更新银行账户中的开通CBS银企接口字段失败"; } } } return null; } /** * 校验CBS系统中账户是否开通银企直连平台 * * @param cbssr * @return */ private Boolean checkAccountOpenStatus(String cbssr) { JSONObject cbsObj = JSON.parseObject(cbssr); if (200 != cbsObj.getInteger("code")) { return false; } JSONObject data = (JSONObject) cbsObj.get("data"); JSONObject dataList = (JSONObject) data.get("data"); JSONArray array = (JSONArray) dataList.get("list"); if (array.size() > 0) { JSONObject cbsAcct = array.getJSONObject(0); if ("9".equals(cbsAcct.getString("directConnectFlag"))) { return true; } } return false; } }