diff --git a/src/main/java/com/rebuild/core/service/query/AdvFilterParser.java b/src/main/java/com/rebuild/core/service/query/AdvFilterParser.java index b0dc25345..175948265 100644 --- a/src/main/java/com/rebuild/core/service/query/AdvFilterParser.java +++ b/src/main/java/com/rebuild/core/service/query/AdvFilterParser.java @@ -263,7 +263,7 @@ public class AdvFilterParser extends SetUser { String field = item.getString("field"); if (field.startsWith("&")) field = field.replace("&", NAME_FIELD_PREFIX); // fix: _$unthy - final boolean hasNameFlag = field.startsWith(NAME_FIELD_PREFIX); + boolean hasNameFlag = field.startsWith(NAME_FIELD_PREFIX); if (hasNameFlag) field = field.substring(1); Field lastFieldMeta = VF_ACU.equals(field) @@ -274,6 +274,12 @@ public class AdvFilterParser extends SetUser { return null; } + String op = item.getString("op"); + // 引用字段`重复`特殊处理 + if (hasNameFlag && ParseHelper.REP.equalsIgnoreCase(op)) { + hasNameFlag = false; + } + DisplayType dt = EasyMetaFactory.getDisplayType(lastFieldMeta); if (dt == DisplayType.CLASSIFICATION || (dt == DisplayType.PICKLIST && hasNameFlag) /* 快速查询 */) { field = NAME_FIELD_PREFIX + field; @@ -295,7 +301,7 @@ public class AdvFilterParser extends SetUser { final boolean isN2NUsers = dt == DisplayType.N2NREFERENCE && lastFieldMeta.getReferenceEntity().getEntityCode() == EntityHelper.User; - String op = item.getString("op"); + // v3.9 区间兼容 if (ParseHelper.BW.equals(op)) { String valueBegin = item.getString("value"); @@ -645,9 +651,10 @@ public class AdvFilterParser extends SetUser { StringUtils.join(value.split("\\|"), "', '")); } else if (ParseHelper.REP.equalsIgnoreCase(op)) { // `in` + int count = NumberUtils.toInt(value, 1); value = MessageFormat.format( - "( select {0} from {1} group by {0} having (count({0}) > {2}) )", - field, rootEntity.getName(), String.valueOf(NumberUtils.toInt(value, 1))); + "( select {0} from {1} group by {0} having (count({0}) {2} {3}) )", + field, rootEntity.getName(), count < 1 ? "=" : ">", Math.max(count, 1)); } if (StringUtils.isBlank(value)) { diff --git a/src/main/resources/web/assets/js/general/rb-advfilter.js b/src/main/resources/web/assets/js/general/rb-advfilter.js index 496326e1b..261613dfb 100644 --- a/src/main/resources/web/assets/js/general/rb-advfilter.js +++ b/src/main/resources/web/assets/js/general/rb-advfilter.js @@ -442,8 +442,8 @@ class FilterItem extends React.Component { op = ['IN', 'NIN'] } - // v3.6-b4,v3.7 - if (['TEXT', 'PHONE', 'EMAIL', 'URL', 'DATE', 'DATETIME', 'TIME'].includes(fieldType)) op.push('REP') + // v3.6-b4, v3.7, v4.2 + if (['TEXT', 'PHONE', 'EMAIL', 'URL', 'DATE', 'DATETIME', 'TIME', 'REFERENCE', 'ANYREFERENCE'].includes(fieldType)) op.push('REP') if (this.isApprovalState()) op = ['IN', 'NIN'] else if (this.state.field === VF_ACU) op = ['IN', 'SFU', 'SFB', 'SFT'] // v3.7 准备废弃