数据方法扩展
数据集除了提供查询数据、插入/更新数据和删除数据的方法以外,还允许自定义扩展方法。例如系统已经提供的扩展方法有 fixtree 和 backup。扩展方法均为 post 请求。
- 系统提供的 fixtree 用于修复树形数据中的全路径列、层级列、是否叶子节点列。例如系统组织表 orgs 是一个树形数据,执行 /uaa/dbrest/orgs/fixtree 可将里面的数据进行修复。
- 系统提供的 backup 用于将数据备份到历史表(需要先创建历史表)。例如执行 /uaa/dbrest/orgs/backup 可备份至历史表。
添加自定义方法
自定义方法和数据集事件一样,使用 Spring Event 事件发布/监听机制实现。这一部分内容参考《数据集事件》一节。
自定义事件的参数为 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);
}
}
自定义方法案例
案例一 添加某个数据集的扩展方法
数据集 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 {
// 排除 buy 数据集,上边已经有 buy 的 copy 方法,否则会调用两次 copy 方法
if(event.getStatus() != Status.START || event.getData() == null || 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);//设置请求结果
}