范围规则

     用于在新建/编辑查找关联字段时,设置该字段可选择的范围

     配置方式:在新建、编辑查找关联字段时,将可选择的数据范围设置为「符合以下条件」- 设置条件 - 基于自定义函数 - 添加自定义函数

image-20191113143326846

1、返回类型为QueryTemplate

QueryTemplate作为关联查询的条件的返回结果,更加高效。

除非QueryTemplate的查询方式不能满足需求,否则优先推荐用使用QueryTemplate返回类型函数,用此方法返回的范围数据没有上限,并且执行效率高。

函数编写模板

Groovy:

QueryTemplate template1 = QueryTemplate.AND(
    ["name":Operator.LIKE("测试")],
    ["field_g7Zeh__c":Operator.LTE("测试单行文本")]
  )

QueryTemplate template2 = QueryTemplate.AND(
  ["owner":Operator.LIKE("1000")],
  ["record_type":Operator.EQ("default__c")]
)

//QueryTemplate使用OR条件需要单独开通,请联系销售人员下订单开通产品:【对象列表筛选支持或者】
QueryTemplate template3 = QueryTemplate.OR(template1,template2)

return template3

//查询条件支持 
// product_id 为查找关联字段,查询模版支持筛选查找关联对象下的name字段符合某种条件的结果
QueryTemplate template = QueryTemplate.AND(
  ["product_id.name":Operator.EQ("测试")]
)

return template

Java:

import java.util.List;
import java.util.Map;

public class RangeTemplate implements IQueryTemplateAction {

  /**
   * 范围规则函数(QueryTemplate)的运行方法
   */
  @Override
  public QueryTemplate execute(FunctionContext context, Map<String, Object> args) {
    //构造查询条件
    QueryTemplate template1 = QueryTemplate.AND(
      Maps.of("name", QueryOperator.EQ("测试")),
      Maps.of("field_g7Zeh__c", QueryOperator.EQ("测试单行文本"))
    );

    QueryTemplate template2 = QueryTemplate.AND(
      Maps.of("owner", QueryOperator.LIKE("1000")),
      Maps.of("record_type", QueryOperator.EQ("default__c"))
    );

    //QueryTemplate使用OR条件需要单独开通,请联系销售人员下订单开通产品:【对象列表筛选支持或者】
    QueryTemplate template3 = QueryTemplate.OR(template1,template2);

    return template3;
  }
}

2、返回类型为集合(List)

不推荐使用List返回类型函数,用此方法返回的数据有上限500条,并且查询和使用id作为返回值的执行效率较低。

函数编写模板

//定义id List
List objectIds = []
...
//写函数逻辑,并将可选择数据Id添加到objectIds里
objectIds.add()

//最后返回的数据结果为 List<String>  里面包含满足条件的数据id
return objectIds

实际场景:报价单明细按产品分类限制可选择产品范围,不同业务类型的报价单明细选择不同分类的产品数据。

根据以上实际场景的模板案例

Groovy:

//获取当前操作对象实例的字段值
String product = context.data.field_wPnHu__c
//根据条件查找数据,根据需要的业务逻辑查询出需要的数据
def ret = Fx.object.find("查找关联字段所对应的对象ApiName",[["field_1tG48__c":product]],100,0)
//如果查询错误直接return返回
if( ret[0] ){
  Fx.log.info("查询异常")
  return []
}
//定义id List
List objectIds = []
QueryResult result = ret[1] as QueryResult
//遍历查询结果,将所有Id添加到objectIds中
result.dataList.each{ item ->
  Map map = item as Map
  objectIds.add(map._id)
}
//最后返回objectIds
return objectIds

Java:

import java.util.List;
import java.util.Map;

public class RangeList implements IQueryListAction {

  /**
   * 范围规则函数(List)的运行方法
   */
  @Override
  public List execute(FunctionContext context, Map<String, Object> args) {
    //获取当前操作对象实例的字段值
    String name = context.getData().get("name").toString();
    Fx.log.info(name);

    List<Object> list = Lists.newArrayList();
    list.add(Maps.of("name", QueryOperator.EQ(name)));

    //根据条件查找数据,根据需要的业务逻辑查询出需要的数据
    APIResult ret = Fx.object.find("AccountObj",list,100,0);
        QueryResult result = (QueryResult)ret.getData();
    List dataList = (List) result.getDataList();
    if(dataList==null) {
      Fx.log.info("查询异常");
    }

    List idList = Lists.newArrayList();
   //遍历查询结果,将所有Id添加到objectIds中
    for (int i=0;i<dataList.size();i++) {
       Map map =(Map<String, Object>)(dataList.get(i));
       Fx.log.info(map.get("name").toString());
       idList.add(map.get("_id").toString());
    }
    Fx.log.info(idList);


    //返回id
    return idList;
  }

  /**
   * 函数的调试方法
   * @param context 函数上下文
   * @param args 函数参数
   */
  public void debug(FunctionContext context, Map<String, Object> args) {
    execute(context, args);
  }
}

返回类型为RangeRule

选择和新建查找关联字段时指定默认业务类型。

函数编写模板

Groovy:

QueryTemplate template = QueryTemplate.AND(
    ["name":Operator.LIKE("测试")]
) 
RangeRule rangeRule = RangeRule.builder()
                          .queryTemplate(template)
                          .recordType("record_cbxZ8__c") // 查找关联新建时默认用该业务类型
                          .build()
return rangeRule

Java:

import java.util.List;
import java.util.Map;

public class RangeRuleCode implements IRangeRuleAction {

  /**
   * 范围规则函数(rangeRule)函数的运行方法
   */
  @Override
  public RangeRule execute(FunctionContext context, Map<String, Object> args) {
    //构造QueryTemplate
    QueryTemplate template1 = QueryTemplate.AND(
      Maps.of("name", QueryOperator.EQ("测试")),
      Maps.of("field_g7Zeh__c", QueryOperator.EQ("测试单行文本"))
    );
    //构造RangeRule
    RangeRule rangeRule = RangeRule.builder()
      .queryTemplate(template1)
      .recordType("record_cbxZ8__c") // 查找关联新建时默认用该业务类型
      .build();
    return rangeRule;
  }
}

results matching ""

    No results matching ""