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);//设置请求结果
    }

results matching ""

    No results matching ""

    results matching ""

      No results matching ""