2.5.8 自定义方法
数据集除了提供查询数据、插入/更新数据和删除数据的方法以外,还允许自定义扩展方法。例如系统已经提供的扩展方法有 fixtree 和 backup。扩展方法均为post请求。
- 系统提供的 fixtree 用于修复树形数据中的全路径列、层级列、是否叶子节点列。例如系统组织表orgs是一个树形数据,执行 /uaa/orgs/fixtree 可将里面的数据进行修复。
- 系统提供的 backup 用于将数据备份到历史表(需要先创建历史表)。例如执行 /uaa/orgs/backup 可备份至历史表。
2.5.8.1 添加自定义方法
自定义方法和数据集事件一样,使用 Spring Event 事件发布/监听机制实现。这一部分内容参考《2.5.7 数据集事件》一节。
自定义事件的参数为 DbCustomEvent 类,构造方法如下
public DbCustomEvent(String method, JSONObject request, String data, Connection conn, String service, String tableName, String dataModelName) {
super(method, request, conn, service, tableName, dataModelName, null, null, null);
if (data != null && data.startsWith("[")) {
this.data = JSONArray.parseArray(data);
}
}
2.5.8.2 自定义方法案例
案例一 添加某个数据集的扩展方法
数据集buy提供copy方法,用于复制数据。传入主键的json数组,请求如下
- 请求URL:域名/微服务名/模块名/dbrest/buy/copy
- 请求方法:POST
- 请求体 -- JSON数组,要复制的数据主键
[{id:"C9D81EAE6FB00001842716B011F01123"}]
扩展方法的代码如下
@EventListener(condition="#event.dataModelName=='buy' && #event.method=='copy'")
public void copyBuyData(DbCustomEvent event) throws Exception {
if(event.getStatus() != Status.START
|| event.getData() == null) {
return;
}
//获取服务名
String serviceName = ContextUtil.getServiceName();
//获取传入的数据
JSONArray data = event.getData();
List<Buy> newList = new ArrayList<Buy>();
for(int i=0;i<data.size();i++) {
JSONObject row = data.getJSONObject(i);
String fid = row.getString("id");
//查询数据
DbrestWrapper<?> wrapperBuy = (DbrestWrapper<?>)new DbrestWrapper<String>(serviceName, "main", "buy");
wrapperBuy.eq("fid",fid);
List<Buy> listBuy = DbrestUtil.selectList(wrapperBuy, Buy.class);
//修改主键
if(listBuy.size()>0) {
listBuy.get(0).setFid(RandomUtil.uuid());
newList.add(listBuy.get(0));
}
}
//插入数据
DbrestResult ret = DbrestUtil.upsert(serviceName, "main", "buy", newList);
//返回请求结果
JSONObject json = new JSONObject();
json.put("status", 200);
json.put("message", "OK");
event.setHandled(true);//设置已处理
event.setResult(json);//设置请求结果
}
案例二 添加通用扩展方法
数据集提供copy方法,用于复制数据。传入主键的json数组,请求如下
- 请求URL:域名/微服务名/模块名/dbrest/数据集/copy
- 请求方法:POST
- 请求体 -- JSON数组,要复制的数据主键
[{id:"C9D81EAE6FB00001842716B011F01123"}]
扩展方法的代码如下,此为通用方法,因为不使用Class使用JSON,主键必须为fid
@EventListener(condition="#event.method=='copy'")
public void copyData(DbCustomEvent event) throws Exception {
if(event.getStatus() != Status.START
|| event.getData() == null
// 排除buy数据集,上边已经有buy的copy方法,否则会调用两次copy方法
|| event.getDataModelName().equals("buy")) {
return;
}
//获取服务名
String serviceName = ContextUtil.getServiceName();
//获取传入的数据
JSONArray data = event.getData();
JSONArray retArr = new JSONArray();
for(int i=0;i<data.size();i++) {
JSONObject row = data.getJSONObject(i);
String fid = row.getString("id");
//查询数据
DbrestWrapper<?> wrapper = (DbrestWrapper<?>)new DbrestWrapper<String>(serviceName, event.getModuleName(), event.getDataModelName());
wrapper.eq("fid",fid);
DbrestResult ret = DbrestUtil.get(wrapper, null);
JSONArray jsonArr = ret.toJson().getJSONArray("result");
//修改主键
if(jsonArr.size()>0) {
JSONObject json = jsonArr.getJSONObject(0);
json.put("fid", RandomUtil.uuid());
retArr.add(json);
}
}
//插入数据
DbrestUtil.upsert(serviceName, event.getModuleName(), event.getDataModelName(), retArr);
//返回请求结果
JSONObject json = new JSONObject();
json.put("status", 200);
json.put("message", "OK");
event.setHandled(true);//设置已处理
event.setResult(json);//设置请求结果
}