Enhance REP operator handling in advanced filter

This commit is contained in:
RB 2025-09-02 14:35:08 +08:00
parent 0b7bca398f
commit 032442e736
2 changed files with 13 additions and 6 deletions

View file

@ -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)) {

View file

@ -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 准备废弃