数据方法扩展

数据集除了提供查询数据、插入/更新数据和删除数据的方法以外,还允许自定义扩展方法。例如系统已经提供的扩展方法有 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);//设置请求结果
    }

results matching ""

    No results matching ""