交易明细分页查询实现及交易明细主键设置
# 一、交易明细分页
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...
点击下载文档
上一篇:星瀚银企直联非生产环境数据脱敏指引下一篇:小微产品线支持常见问题
本文2024-09-22 23:37:43发表“云星瀚知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-xinghan-134247.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章