QFilter链式封装原创
金蝶云社区-吴琦_fred
吴琦_fred
8人赞赏了该文章 62次浏览 未经作者许可,禁止转载编辑于2024年07月12日 16:30:12
封面

背景:java 8 以后,我们经常会见到写出链式的代码。前面N多行是构建用的参数,简单明了,最后的执行。那么我们的QFilter是否能封装成这个样子呢?在未封装之前代码调用是这样子。

未封装前实例:

List<QFilter> qFilters = new ArrayList<>();

......

设置值

DynamicObject dy = BusinessDataServiceHelper.loadSingle(entityId, qFilters.toArray(new QFilter[0]));

是平铺的。

封装后的实例:

DynamicObject dy = QFilterBuilder.andEqualKey(key,val).andThen(andEqualKey(key,val))

.....

.andThen(queryOne(fields)).applay(new Pair<>(entityId,null));

代码如下:

public class QFilterBuilder {

   private static boolean existsProperty(String entityId, String key) {
       if (StringUtils.isBlank(entityId) || StringUtils.isBlank(key)) {
           return false ;
       }
       DynamicObject entity = BusinessDataServiceHelper.newDynamicObject(entityId);
       return entity.getDynamicObjectType().getProperties().containsKey(key);
   }

   private static Function<Pair<String, QFilter>, Pair<String, QFilter>> andEqual(String key, Object val) {
       return (pair) -> {
           boolean isExists = existsProperty(pair.getKey(), key);
           if (isExists) {
               if (Objects.isNull(pair.getValue())) {
                   pair = new Pair<>(pair.getKey(), new QFilter(key, QCP.equals, val));
               } else {
                   pair.getValue().and(new QFilter(key, QCP.equals, val));
               }
           }
           return pair;
       };
   }

   private static Function<Pair<String, QFilter>, Pair<String, QFilter>> orEqual(String key, Object val) {
       return (pair) -> {
           boolean isExists = existsProperty(pair.getKey(), key);
           if (isExists) {
               if (Objects.isNull(pair.getValue())) {
                   pair = new Pair<>(pair.getKey(), new QFilter(key, QCP.equals, val));
               } else {
                   pair.getValue().or(new QFilter(key, QCP.equals, val));
               }
           }
           return pair;
       };
   }

   private static Function<Pair<String, QFilter>, Pair<String, QFilter>> andIn(String key, Object val) {
       return (pair) -> {
           boolean isExists = existsProperty(pair.getKey(), key);
           if (isExists) {
               if (Objects.isNull(pair.getValue())) {
                   pair = new Pair<>(pair.getKey(), new QFilter(key, QCP.in, val));
               } else {
                   pair.getValue().and(new QFilter(key, QCP.in, val));
               }
           }
           return pair;
       };
   }

   private static Function<Pair<String, QFilter>, Pair<String, QFilter>> orIn(String key, Object val) {
       return (pair) -> {
           boolean isExists = existsProperty(pair.getKey(), key);
           if (isExists) {
               if (Objects.isNull(pair.getValue())) {
                   pair = new Pair<>(pair.getKey(), new QFilter(key, QCP.in, val));
               } else {
                   pair.getValue().or(new QFilter(key, QCP.in, val));
               }
           }
           return pair;
       };
   }

   /**
    * 放在链条的最后
    * @param fields
    * @return
    */
   public static Function<Pair<String, List<QFilter>>, DynamicObject> queryOne(String fields) {
       return (pair) -> {
           if (CollectionUtils.isEmpty(pair.getValue()) || StringUtils.isBlank(pair.getKey())) {
               return null;
           }
           if (StringUtils.isBlank(fields)) {
               return BusinessDataServiceHelper.loadSingleFromCache(pair.getKey(), pair.getValue().toArray(new QFilter[0]));
           }
           return BusinessDataServiceHelper.loadSingleFromCache(pair.getKey(), fields,  pair.getValue().toArray(new QFilter[0]));
       };
   }

   /**
    * 放在链条的最后
    * @return
    */
   public static Function<Pair<String, List<QFilter>>, Long> queryOnePk() {
       return (pair) -> {
           if (CollectionUtils.isEmpty(pair.getValue()) || StringUtils.isBlank(pair.getKey())) {
               return null;
           }
           DynamicObject dy = BusinessDataServiceHelper.loadSingleFromCache(pair.getKey(), "id",  pair.getValue().toArray(new QFilter[0]));
           return isEmpty(dy) ? null : dy.getLong("id");
       };
   }

   public static Function<Pair<String, List<QFilter>>, Pair<String, List<QFilter>>> andEqualKey(String key, Object val) {
       return (pair) -> {
           if (CollectionUtils.isEmpty(pair.getValue())) {
               pair = new Pair<>(pair.getKey(), new ArrayList<>());
           }
           pair.getValue().add(andEqual(key, val).apply(new Pair<>(pair.getKey(), null)).getValue());
           return pair ;
       };
   }

   public static Function<Pair<String, List<QFilter>>, Pair<String, List<QFilter>>> andEqualNumber(Object val) {
       return (pair) -> {
           if (CollectionUtils.isEmpty(pair.getValue())) {
               pair = new Pair<>(pair.getKey(), new ArrayList<>());
           }
           Optional<QFilter> optional = Optional.ofNullable(andEqual("number", val).apply(new Pair<>(pair.getKey(), null)).getValue());
           if (optional.isPresent()) {
               pair.getValue().add(optional.get());
           }
           return pair ;
       };
   }

   public static Function<Pair<String, List<QFilter>>, Pair<String, List<QFilter>>> andEqualIsCurrentVersion(Object val) {
       return (pair) -> {
           if (CollectionUtils.isEmpty(pair.getValue())) {
               pair = new Pair<>(pair.getKey(), new ArrayList<>());
           }
           Optional<QFilter> optional = Optional.ofNullable(andEqual("iscurrentversion", val).apply(new Pair<>(pair.getKey(), null)).getValue());
           if (optional.isPresent()) {
               pair.getValue().add(optional.get());
           }
           return pair ;
       };
   }

   public static Function<Pair<String, List<QFilter>>, Pair<String, List<QFilter>>> andEqualDataStatus(Object val) {
       return (pair) -> {
           if (CollectionUtils.isEmpty(pair.getValue())) {
               pair = new Pair<>(pair.getKey(), new ArrayList<>());
           }
           Optional<QFilter> optional = Optional.ofNullable(andEqual("datastatus", val).apply(new Pair<>(pair.getKey(), null)).getValue());
           if (optional.isPresent()) {
               pair.getValue().add(optional.get());
           }
           return pair ;
       };
   }

   public static Function<Pair<String, List<QFilter>>, Pair<String, List<QFilter>>> andEqualBusinessStatus(Object val) {
       return (pair) -> {
           if (CollectionUtils.isEmpty(pair.getValue())) {
               pair = new Pair<>(pair.getKey(), new ArrayList<>());
           }
           Optional<QFilter> optional = Optional.ofNullable(andEqual("businessstatus", val).apply(new Pair<>(pair.getKey(), null)).getValue());
           if (optional.isPresent()) {
               pair.getValue().add(optional.get());
           }
           return pair ;
       };
   }

   public static Function<Pair<String, List<QFilter>>, Pair<String, List<QFilter>>> andEqualIsPrimary(Object val) {
       return (pair) -> {
           if (CollectionUtils.isEmpty(pair.getValue())) {
               pair = new Pair<>(pair.getKey(), new ArrayList<>());
           }
           Optional<QFilter> optional = Optional.ofNullable(andEqual("isprimary", val).apply(new Pair<>(pair.getKey(), null)).getValue());
           if (optional.isPresent()) {
               pair.getValue().add(optional.get());
           }
           return pair ;
       };
   }

   public static Function<Pair<String, List<QFilter>>, Pair<String, List<QFilter>>> andEqualBillNo(Object val) {
       return (pair) -> {
           if (CollectionUtils.isEmpty(pair.getValue())) {
               pair = new Pair<>(pair.getKey(), new ArrayList<>());
           }
           Optional<QFilter> optional = Optional.ofNullable(andEqual("billno", val).apply(new Pair<>(pair.getKey(), null)).getValue());
           if (optional.isPresent()) {
               pair.getValue().add(optional.get());
           }
           return pair ;
       };
   }

   public static Function<Pair<String, List<QFilter>>, Pair<String, List<QFilter>>> andEqualBillStatus(Object val) {
       return (pair) -> {
           if (CollectionUtils.isEmpty(pair.getValue())) {
               pair = new Pair<>(pair.getKey(), new ArrayList<>());
           }
           Optional<QFilter> optional = Optional.ofNullable(andEqual("billstatus", val).apply(new Pair<>(pair.getKey(), null)).getValue());
           if (optional.isPresent()) {
               pair.getValue().add(optional.get());
           }
           return pair ;
       };
   }

   // 人员编码通用过滤器
   public static Function<Pair<String,List<QFilter>>,Pair<String,List<QFilter>>> andEqualEmployeeNumber(String employeeNumber) {
       return (pair) -> {
           return andEqualNumber(employeeNumber)
                   .andThen(andEqualIsCurrentVersion("1"))
                   .andThen(andEqualDataStatus("1"))
                   .andThen(andEqualBusinessStatus("1"))
                   .apply(pair);
       };
   }

=====end====

结束语:有喜欢链式的小伙伴,可以尝试把andThen去掉。如果有其他思路记得留言。


赞 8