1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294 |
- 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<String, Object> customParams = this.getView().getFormShowParameter().getCustomParams();
- List<Object> 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<QFilter> qFilters = filterParam.getQFilters();
- DynamicObjectCollection orgs = (DynamicObjectCollection) this.getModel().getValue("nckd_org");
- List<Long> 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<String, String> 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<Long> 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<DynamicObject> listObj = new ArrayList<>();
- int count = 0;
- StringBuilder err = new StringBuilder();
- for (DynamicObject acct : accounts) {
- JSONObject lastBal = queryLastBal(acct);
- Map<String, String> header = new HashMap<>();
- header.put("Content-Type", "application/json; charset=UTF-8");
- Map<String, Object> params = new HashMap<>();
- Map<String, Object> 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<String, String> header = new HashMap<>();
- header.put("Content-Type", "application/json; charset=UTF-8");
- Map<String, Object> params = new HashMap<>();
- Map<String, Object> 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<String> 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<String, String> header, Map<String, Object> 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<DynamicObject> 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<String, Object> 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<String, Object> 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<String, String> header = new HashMap<>();
- header.put("Content-Type", "application/json; charset=UTF-8");
- Map<String, Object> params = new HashMap<>();
- Map<String, Object> 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<String> 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<String, String> header, Map<String, Object> 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<DynamicObject> 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<String, Object> 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<String, Object> 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<JSONObject> returnResult(String code, String message) {
- JSONObject reslutData = new JSONObject();
- reslutData.put("code", code);
- reslutData.put("message", message);
- CustomApiResult<JSONObject> 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<Long> 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<String, String> 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<Long> 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<DynamicObject> listObj = new ArrayList<>();
- //获取cbsurl 账户列表查询
- String cbsUrl = getCbsUrl("accountlist");
- if ("请前往《CBS支付参数设置》进行支付参数设置".equals(cbsUrl)) {
- return cbsUrl;
- }
- Map<String, String> header = new HashMap<>();
- header.put("Content-Type", "application/json; charset=UTF-8");
- Map<String, Object> params = new HashMap<>();
- Map<String, Object> 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;
- }
- }
|