交易明细分页查询实现及交易明细主键设置

栏目:云星瀚知识作者:金蝶来源:金蝶云社区发布:2024-09-22浏览:1

交易明细分页查询实现及交易明细主键设置

# 一、交易明细分页 AbstractDetailImpl抽象交易明细分页查询流程: ```java @Override public EBBankDetailResponse doBiz(BankDetailRequest request) { EBBankDetailResponse response; if(isSupportPage()){ response = doBizWithPage(request); }else{ response = process(request); } return response; } public EBBankDetailResponse doBizWithPage(BankDetailRequest request) { List<DetailInfo> detailList = new ArrayList<>(16); setCurrentPage("0"); setLastPage(false); try{ do{ EBBankDetailResponse response = process(request); //解析数据 detailList.addAll(response.getDetails()); }while(isLastPage()); return new EBBankDetailResponse(detailList); }catch(Exception e){ throw EBExceiptionUtil.serviceException(e); } } // 是否支持分页查询 public boolean isSupportPage(){ return false; } ``` 在银行插件查询明细实现类中,编写打包和解析报文的方法,同时将isSupportPage()进行重写,返回值改为true就能够支持分页查询,在对响应报文解析时,注意设置下一页或者最后一页。 开发样例(历史明细): ```java private void processPageTag(String responseStr){ int pagetag = Integer.parseInt(getCurrentPage()); String encoding = RequestContextUtils.getCharset(); Element root = JDomUtils.string2Root(responseStr, encoding); Element Body = root.getChild("Body"); if((Body.getChildTextTrim("RecordNumber")).length() <= 0 || Body.getChildTextTrim("RecordNumber") == null){ setLastPage(true); } int turnPageShowNum = 100; int turnPageTotalNum = Integer.parseInt(Body.getChildTextTrim("RecordNumber")); if((pagetag - 1 + turnPageShowNum) >= turnPageTotalNum){ setLastPage(true); }else{ setCurrentPage(pagetag + 100); setLastPage(false); } } // 是否支持分页查询 @Override public boolean isSupportPage(){ return true; } @Override public EBBankDetailResponse hisDetail(BankDetailRequest request) { return doBiz(request); } ``` 分页查询使用到的接口如下: |接口名称|说明| |-|-| |setCurrentPage|设置下次查询明细的起始页码或序号| |getCurrentPage| 获取查询明细的起始页码或序号| |setLastPage| 设置是否为最后一页| |isLastPage| 读取是否为最后一页| |pack| 银行请求报文打包| |parse |银行响应报文解析| |isSupportPage| 声明当前接口能否支持分页查询| # 二、交易明细主键设置 交易明细主键设置,能够提高从银行拉取数据与数据库中记录匹配的效率,也能实现交易明细的防重。 1、 与银行方沟通,哪些字段能唯一标识一笔交易明细,一般为交易账号,交易日期,流水号。 2、 在对应银行的MetaDataImpl类里,重写getDetailUniqueRule()方法,设置组件组成的规则。 ```java public class MocTestMetaDataImpl extends FBEMetaDataTemplate implements BankMetaDataCollector { /** * 设置交易明细唯一主键,需跟银行确认哪些字段能唯一组成一笔交易明细 * 示例中账号+交易日期+流水号字段组成了交易明细主键,具体的根据对应银行交易明细接口响应报文中的字段来组成,一般都是账号+交易日期再跟其他字段组合(流水号或者交易金额等,具体需跟银行确认,不能随意自己拟定,不然容易造成交易明细重复) * @return */ @Override public Map<String, String> getDetailUniqueRule() { //查询的账号+交易日(etydat)+流水号(refnbr)可以唯一确定一笔交易。 Map<String, String> result = new LinkedHashMap<>(16); // 一定要用LinkedHashMap,这样遍历的时候才是插入顺序 // 账号字段是固定的,不从报文里拿,照写即可,其他字段需要注意区分大小写!!!其他字段需要注意区分大小写!!!其他字段需要注意区分大小写!!! result.put("accNo", DetailUniqueTypeEnum.STRING.getType()); result.put("etydat", DetailUniqueTypeEnum.STRING.getType()); result.put("refnbr", DetailUniqueTypeEnum.STRING.getType()); return result; } } ``` 3、 解析交易明细响应报文时,将对应的报文字段和对应的值序列化为json字符串,赋值到jsonMap中(如果不是json,可以调用MatchRule.getInstance().getDetailJsonWithStructuredData(row);方法将xml等格式序列化为json)。 ```java public class DetailImpl extends AbstractDetailImpl implements IHisDetail, IDetail { @Override public EBBankDetailResponse parse(BankDetailRequest req, String rspStr) { List<DetailInfo> detailList = new ArrayList<>(1); // 遍历交易明细详情列表 for (int i = 0; i < ntqacinfz.size(); i++) { JSONObject obiect =ntqacinfz.getJSONObject(i); String etydat = obiect.getString("etydat");//交易日期 String refnbr = obiect.getString("refnbr");//流水号 DetailInfo detail = new DetailInfo(); String jsonStr = obiect.toJSONString(); detail.setJsonMap(jsonStr); detailList.add(detail); } logger.info("解析到的明细数量为:"+detailList.size()); return new EBBankDetailResponse(detailList); } } ``` 4、 框架会自动将对应字段取值拼凑成交易明细主键,赋值到uniqueSeq字段中(银企云框架自动处理,二开不需要处理此步骤)。

交易明细分页查询实现及交易明细主键设置

# 一、交易明细分页AbstractDetailImpl抽象交易明细分页查询流程:```java@Override public EBBankDetailResponse doBiz(BankDet...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息