Commit 85329143 authored by tianyiming's avatar tianyiming

完善高级筛选

parent ffa23b7e
...@@ -15,6 +15,8 @@ import com.yeejoin.amos.boot.module.common.biz.utils.TechParamUtil; ...@@ -15,6 +15,8 @@ import com.yeejoin.amos.boot.module.common.biz.utils.TechParamUtil;
import com.yeejoin.amos.boot.module.jg.api.enums.DPMapStatisticsItemEnum; import com.yeejoin.amos.boot.module.jg.api.enums.DPMapStatisticsItemEnum;
import com.yeejoin.amos.boot.module.statistcs.biz.utils.JsonUtils; import com.yeejoin.amos.boot.module.statistcs.biz.utils.JsonUtils;
import com.yeejoin.amos.boot.module.statistcs.biz.utils.MinioUtils; import com.yeejoin.amos.boot.module.statistcs.biz.utils.MinioUtils;
import com.yeejoin.amos.boot.module.statistcs.factory.DynamicQueryBuilder;
import com.yeejoin.amos.boot.module.statistcs.factory.EnhancedDynamicQueryBuilder;
import com.yeejoin.amos.boot.module.statistics.api.enums.*; import com.yeejoin.amos.boot.module.statistics.api.enums.*;
import com.yeejoin.amos.boot.module.statistics.api.mapper.TzsCustomFilterMapper; import com.yeejoin.amos.boot.module.statistics.api.mapper.TzsCustomFilterMapper;
import com.yeejoin.amos.boot.module.statistics.api.vo.EquipInfoVo; import com.yeejoin.amos.boot.module.statistics.api.vo.EquipInfoVo;
...@@ -83,6 +85,14 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -83,6 +85,14 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
private final String BUCKET_NAME = "upload"; private final String BUCKET_NAME = "upload";
private final String UPLOAD_PATH = "/tzs/excelTempFile"; private final String UPLOAD_PATH = "/tzs/excelTempFile";
private final List<String> equipHandleOtherFields = Arrays.asList("techParam", "paramRange", "NEXT_INSPECT_DATE", "IS_SUPERVISORY_CODE", "USC_DATE", "createDate");
private final List<String> companyHandleOtherFields = Arrays.asList("itemCode", "subItemCode", "permitStatus", "equipCategory", "regulatoryLabels", "unitType");
private final List<String> personHandleOtherFields = Arrays.asList("newPost", "subPost", "certNo", "expiryDate", "certType", "permissionLevel", "jobItem", "permissionItem", "issueDate", "equipType", "unitType");
private final String or = "or";
private final String and = "and";
@Autowired @Autowired
EquipmentCategoryMapper equipmentCategoryMapper; EquipmentCategoryMapper equipmentCategoryMapper;
...@@ -148,9 +158,9 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -148,9 +158,9 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
public JSONArray queryAdvancedSearch(String type) { public JSONArray queryAdvancedSearch(String type) {
JSONArray all = new JSONArray(); JSONArray all = new JSONArray();
if("equip".equals(type)) { if ("equip".equals(type)) {
all = EquipAdvanceSearchEnum.getAll(); all = EquipAdvanceSearchEnum.getAll();
}else if("company".equals(type)){ } else if ("company".equals(type)) {
all = CompanyAdvanceSearchEnum.getAll(); all = CompanyAdvanceSearchEnum.getAll();
} else if ("person".equals(type)) { } else if ("person".equals(type)) {
all = PersonAdvanceSearchEnum.getAll(); all = PersonAdvanceSearchEnum.getAll();
...@@ -215,7 +225,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -215,7 +225,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
boolMust.must(QueryBuilders.existsQuery(field)); boolMust.must(QueryBuilders.existsQuery(field));
TermsQueryBuilder termsQuery = QueryBuilders.termsQuery(field, (JSONArray) v); TermsQueryBuilder termsQuery = QueryBuilders.termsQuery(field, (JSONArray) v);
boolMust.must(termsQuery); boolMust.must(termsQuery);
} else if (k.equals("certNo") || k.equals("expiryDate") || k.equals("permissionLevel") || k.equals("certType") || k.equals("jobItem") || k.equals("issueDate")) { } else if (k.equals("certNo") || k.equals("expiryDate") || k.equals("permissionLevel") || k.equals("certType") || k.equals("jobItem") || k.equals("permissionItem")) {
String path = "licenses"; String path = "licenses";
((JSONArray) v).forEach(item -> { ((JSONArray) v).forEach(item -> {
String nestedField = path + "." + k; String nestedField = path + "." + k;
...@@ -244,7 +254,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -244,7 +254,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
// 临期:小于等于当前日期加上30天 // 临期:小于等于当前日期加上30天
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery( NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path, path,
QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery(nestedField).lte(LocalDate.now().plusDays(30).format(formatter))), QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery(nestedField).lte(LocalDate.now().plusDays(30).format(formatter)).gte(LocalDate.now().format(formatter))),
ScoreMode.Avg ScoreMode.Avg
); );
boolMust.must(nestedQuery); boolMust.must(nestedQuery);
...@@ -265,13 +275,20 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -265,13 +275,20 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
); );
boolMust.mustNot(nestedQuery); boolMust.mustNot(nestedQuery);
} }
} else if (k.equals("certType") || k.equals("permissionLevel") || k.equals("jobItem")) { } else if (k.equals("certType") || k.equals("permissionLevel")) {
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery( NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path, path,
QueryBuilders.boolQuery().must(QueryBuilders.termsQuery(nestedField, (JSONArray) v)), QueryBuilders.boolQuery().must(QueryBuilders.termsQuery(nestedField, (JSONArray) v)),
ScoreMode.Avg ScoreMode.Avg
); );
boolMust.must(nestedQuery); boolMust.must(nestedQuery);
} else {
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().must(QueryBuilders.wildcardQuery(nestedField, "*" + item + "*")),
ScoreMode.Avg
);
boolMust.should(nestedQuery);
} }
}); });
} else if (k.equals("issueDate")) { } else if (k.equals("issueDate")) {
...@@ -280,23 +297,25 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -280,23 +297,25 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
String endDate = DateUtils.convertDateToString(issueDates.getDate(1), DateUtils.DATE_PATTERN); String endDate = DateUtils.convertDateToString(issueDates.getDate(1), DateUtils.DATE_PATTERN);
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery( NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
"licenses", "licenses",
QueryBuilders.rangeQuery("issueDate").gte(startDate).lte(endDate), QueryBuilders.rangeQuery(k).gte(startDate).lte(endDate),
ScoreMode.Avg ScoreMode.Avg
); );
boolMust.filter(nestedQuery); boolMust.filter(nestedQuery);
} }
} else {
//todo 高级筛选
} }
} }
}); });
} else {
JSONArray leftGroup = filterParams.getJSONArray("group1");
JSONArray rightGroup = filterParams.getJSONArray("group2");
Boolean isOrGroup = or.equals(filterParams.getString("groupAndOr")) ? Boolean.TRUE : Boolean.FALSE;
handleAdvancedFilter(boolMust, leftGroup, rightGroup, isOrGroup);
} }
} }
// 排序 // 排序
if (!ObjectUtils.isEmpty(filter.get("sort"))) { if (!ObjectUtils.isEmpty(filter.get("sort"))) {
JSONObject sort = JSONObject.parseObject(JSONObject.toJSONString(filter.get("sort"))); JSONObject sort = JSONObject.parseObject(JSONObject.toJSONString(filter.get("sort")));
String field = sort.getString("filed"); String field = sort.getString("field");
SortOrder sortOrder = sort.getString("order").equals("desc") ? SortOrder.DESC : SortOrder.ASC; SortOrder sortOrder = sort.getString("order").equals("desc") ? SortOrder.DESC : SortOrder.ASC;
FieldSortBuilder sortBuilder = SortBuilders.fieldSort(field + ".keyword").order(sortOrder); FieldSortBuilder sortBuilder = SortBuilders.fieldSort(field + ".keyword").order(sortOrder);
builder.sort(sortBuilder); builder.sort(sortBuilder);
...@@ -410,6 +429,11 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -410,6 +429,11 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
} }
} }
}); });
} else {
JSONArray leftGroup = filterParams.getJSONArray("group1");
JSONArray rightGroup = filterParams.getJSONArray("group2");
Boolean isOrGroup = or.equals(filterParams.getString("groupAndOr")) ? Boolean.TRUE : Boolean.FALSE;
handleAdvancedFilter(boolMust, leftGroup, rightGroup, isOrGroup);
} }
} }
...@@ -417,7 +441,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -417,7 +441,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
// 排序 // 排序
if (!ObjectUtils.isEmpty(filter.get("sort"))) { if (!ObjectUtils.isEmpty(filter.get("sort"))) {
JSONObject sort = JSONObject.parseObject(JSONObject.toJSONString(filter.get("sort"))); JSONObject sort = JSONObject.parseObject(JSONObject.toJSONString(filter.get("sort")));
String field = sort.getString("filed"); String field = sort.getString("field");
SortOrder sortOrder = sort.getString("order").equals("desc") ? SortOrder.DESC : SortOrder.ASC; SortOrder sortOrder = sort.getString("order").equals("desc") ? SortOrder.DESC : SortOrder.ASC;
FieldSortBuilder sortBuilder = SortBuilders.fieldSort(field + ".keyword").order(sortOrder); FieldSortBuilder sortBuilder = SortBuilders.fieldSort(field + ".keyword").order(sortOrder);
builder.sort(sortBuilder); builder.sort(sortBuilder);
...@@ -484,7 +508,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -484,7 +508,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
String paramKey = techParams.getString(0); String paramKey = techParams.getString(0);
String condition = paramRangeJson.getString("condition"); String condition = paramRangeJson.getString("condition");
Object value = paramRangeJson.getString("value"); Object value = paramRangeJson.getString("value");
getParamQuery(paramKey, condition, value, boolMust); getParamQuery(paramKey, condition, value, false, boolMust, null, null);
} }
} else if (!k.equals("paramRange")) { } else if (!k.equals("paramRange")) {
if (v instanceof JSONArray) { if (v instanceof JSONArray) {
...@@ -500,7 +524,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -500,7 +524,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
boolMust.filter(QueryBuilders.rangeQuery(finalField).lt(LocalDate.now().format(formatter))); boolMust.filter(QueryBuilders.rangeQuery(finalField).lt(LocalDate.now().format(formatter)));
} else if (item.equals("near")) { } else if (item.equals("near")) {
// 临期:小于等于当前日期加上30天 // 临期:小于等于当前日期加上30天
boolMust.filter(QueryBuilders.rangeQuery(finalField).lte(LocalDate.now().plusDays(30).format(formatter))); boolMust.filter(QueryBuilders.rangeQuery(finalField).gte(LocalDate.now().format(formatter)).lte(LocalDate.now().plusDays(30).format(formatter)));
} else { } else {
// 正常:大于当前日期加上30天 // 正常:大于当前日期加上30天
boolMust.filter(QueryBuilders.rangeQuery(finalField).gt(LocalDate.now().plusDays(30).format(formatter))); boolMust.filter(QueryBuilders.rangeQuery(finalField).gt(LocalDate.now().plusDays(30).format(formatter)));
...@@ -515,19 +539,17 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -515,19 +539,17 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
boolMust.filter(QueryBuilders.rangeQuery(finalField).gt(LocalDate.now().minusYears(15).format(formatter))); boolMust.filter(QueryBuilders.rangeQuery(finalField).gt(LocalDate.now().minusYears(15).format(formatter)));
} else if (item.equals("10-15")) { } else if (item.equals("10-15")) {
// 10-15年:小于当前日期减去15年,大于等于当前日期减去10年 // 10-15年:小于当前日期减去15年,大于等于当前日期减去10年
boolMust.filter(QueryBuilders.rangeQuery(finalField).lt(LocalDate.now().minusYears(15).format(formatter))); boolMust.filter(QueryBuilders.rangeQuery(finalField).lt(LocalDate.now().minusYears(15).format(formatter)).gte(LocalDate.now().minusYears(10).format(formatter)));
boolMust.filter(QueryBuilders.rangeQuery(finalField).gte(LocalDate.now().minusYears(10).format(formatter)));
} else if (item.equals("5-10")) { } else if (item.equals("5-10")) {
// 5-10年:小于当前日期减去10年,大于等于当前日期减去5年 // 5-10年:小于当前日期减去10年,大于等于当前日期减去5年
boolMust.filter(QueryBuilders.rangeQuery(finalField).lt(LocalDate.now().minusYears(10).format(formatter))); boolMust.filter(QueryBuilders.rangeQuery(finalField).lt(LocalDate.now().minusYears(10).format(formatter)).gte(LocalDate.now().minusYears(5).format(formatter)));
boolMust.filter(QueryBuilders.rangeQuery(finalField).gte(LocalDate.now().minusYears(5).format(formatter)));
} else if (item.equals("0-5")) { } else if (item.equals("0-5")) {
// 0-5年:小于当前日期减去5年 // 0-5年:小于当前日期减去5年
boolMust.filter(QueryBuilders.rangeQuery(finalField).lt(LocalDate.now().minusYears(5).format(formatter))); boolMust.filter(QueryBuilders.rangeQuery(finalField).lt(LocalDate.now().minusYears(5).format(formatter)));
} }
}); });
} else if (k.equals("IS_SUPERVISORY_CODE")) { } else if (k.equals("IS_SUPERVISORY_CODE")) {
String finalField = "IS_SUPERVISORY_CODE"; String finalField = k;
((JSONArray) v).forEach(item -> { ((JSONArray) v).forEach(item -> {
if (item.equals("1")) { if (item.equals("1")) {
boolMust.must(QueryBuilders.existsQuery(finalField)); boolMust.must(QueryBuilders.existsQuery(finalField));
...@@ -553,14 +575,15 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -553,14 +575,15 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
TermsQueryBuilder termsQuery = QueryBuilders.termsQuery(field, (JSONArray) v); TermsQueryBuilder termsQuery = QueryBuilders.termsQuery(field, (JSONArray) v);
boolMust.must(termsQuery); boolMust.must(termsQuery);
} }
} }
} }
} }
}); });
} else { } else {
// todo 自定义筛选 JSONArray leftGroup = filterParams.getJSONArray("group1");
JSONArray rightGroup = filterParams.getJSONArray("group2");
Boolean isOrGroup = or.equals(filterParams.getString("groupAndOr")) ? Boolean.TRUE : Boolean.FALSE;
handleAdvancedFilter(boolMust, leftGroup, rightGroup, isOrGroup);
} }
} else { } else {
filterParams = null; filterParams = null;
...@@ -569,7 +592,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -569,7 +592,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
// 排序 // 排序
if (!ObjectUtils.isEmpty(filter.get("sort"))) { if (!ObjectUtils.isEmpty(filter.get("sort"))) {
JSONObject sort = JSONObject.parseObject(JSONObject.toJSONString(filter.get("sort"))); JSONObject sort = JSONObject.parseObject(JSONObject.toJSONString(filter.get("sort")));
String field = sort.getString("filed"); String field = sort.getString("field");
if (field.equals("EQU_LIST")) { if (field.equals("EQU_LIST")) {
field = "EQU_LIST_CODE"; field = "EQU_LIST_CODE";
} else if (field.equals("EQU_CATEGORY")) { } else if (field.equals("EQU_CATEGORY")) {
...@@ -648,116 +671,664 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -648,116 +671,664 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
} }
} }
result.put("statics", statics); result.put("statics", statics);
return result; return result;
} }
private void getParamQuery(String paramKey, String condition, Object value, BoolQueryBuilder boolMust) { private void getParamQuery(String paramKey, String condition, Object value, Boolean isCustom, BoolQueryBuilder boolMust, EnhancedDynamicQueryBuilder builder, String andOr) {
String path = "techParams"; String path = "techParams";
String nestedFieldKey = path + ".paramKey"; String nestedFieldKey = path + ".paramKey";
String nestedFieldValue = path + ".strValue"; String longEnd = ".longValue";
String stringEnd = ".strValue";
NestedQueryBuilder keyNestedQuery = QueryBuilders.nestedQuery( NestedQueryBuilder keyNestedQuery = QueryBuilders.nestedQuery(
path, path,
QueryBuilders.boolQuery().must(QueryBuilders.termsQuery(nestedFieldKey, paramKey)), QueryBuilders.boolQuery().must(QueryBuilders.termsQuery(nestedFieldKey, paramKey)),
ScoreMode.Avg ScoreMode.Avg
); );
boolMust.must(keyNestedQuery); if (isCustom) {
builder.add(keyNestedQuery, andOr);
} else {
boolMust.must(keyNestedQuery);
}
switch (condition) { switch (condition) {
case "eq": case "eq":
NestedQueryBuilder eqQuery = QueryBuilders.nestedQuery( NestedQueryBuilder eqQuery = QueryBuilders.nestedQuery(
path, path,
QueryBuilders.boolQuery().must(QueryBuilders.termsQuery(nestedFieldValue, value)), QueryBuilders.boolQuery().must(QueryBuilders.termsQuery(path + stringEnd, value)),
ScoreMode.Avg ScoreMode.Avg
); );
boolMust.must(eqQuery); if (isCustom) {
builder.add(eqQuery, andOr);
} else {
boolMust.must(eqQuery);
}
break; break;
case "neq": case "neq":
boolMust.must(keyNestedQuery); boolMust.must(keyNestedQuery);
NestedQueryBuilder neqQuery = QueryBuilders.nestedQuery( NestedQueryBuilder neqQuery = QueryBuilders.nestedQuery(
path, path,
QueryBuilders.boolQuery().mustNot(QueryBuilders.termsQuery(nestedFieldValue, value)), QueryBuilders.boolQuery().mustNot(QueryBuilders.termsQuery(path + stringEnd, value)),
ScoreMode.Avg ScoreMode.Avg
); );
boolMust.mustNot(neqQuery); if (isCustom) {
builder.add(neqQuery, andOr);
} else {
boolMust.mustNot(neqQuery);
}
break; break;
case "like": case "like":
NestedQueryBuilder likeQuery = QueryBuilders.nestedQuery( NestedQueryBuilder likeQuery = QueryBuilders.nestedQuery(
path, path,
QueryBuilders.boolQuery().should(QueryBuilders.wildcardQuery(nestedFieldValue, "*" + value + "*")), QueryBuilders.boolQuery().must(QueryBuilders.wildcardQuery(path + stringEnd, "*" + value + "*")),
ScoreMode.Avg ScoreMode.Avg
); );
boolMust.must(likeQuery); if (isCustom) {
builder.add(likeQuery, andOr);
} else {
boolMust.must(likeQuery);
}
break; break;
case "notLike": case "notLike":
NestedQueryBuilder notLikeQuery = QueryBuilders.nestedQuery( NestedQueryBuilder notLikeQuery = QueryBuilders.nestedQuery(
path, path,
QueryBuilders.boolQuery().should(QueryBuilders.wildcardQuery(nestedFieldValue, "*" + value + "*")), QueryBuilders.boolQuery().must(QueryBuilders.wildcardQuery(path+stringEnd, "*" + value + "*")),
ScoreMode.Avg ScoreMode.Avg
); );
boolMust.mustNot(notLikeQuery); if (isCustom) {
builder.add(QueryBuilders.boolQuery().mustNot(notLikeQuery), andOr);
} else {
boolMust.mustNot(notLikeQuery);
}
break; break;
case "gt": case "gt":
NestedQueryBuilder gtQuery = QueryBuilders.nestedQuery( NestedQueryBuilder gtQuery = QueryBuilders.nestedQuery(
path, path,
QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery(nestedFieldValue).gt(Double.parseDouble(value.toString()))), QueryBuilders.rangeQuery(path + longEnd).gt(value.toString()),
ScoreMode.Avg ScoreMode.Avg
); );
boolMust.must(gtQuery); if (isCustom) {
builder.add(gtQuery, andOr);
} else {
boolMust.must(gtQuery);
}
break; break;
case "gte": case "gte":
NestedQueryBuilder gteQuery = QueryBuilders.nestedQuery( NestedQueryBuilder gteQuery = QueryBuilders.nestedQuery(
path, path,
QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery(nestedFieldValue).gte(Double.parseDouble(value.toString()))), QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery(path + longEnd).gte(value.toString())),
ScoreMode.Avg ScoreMode.Avg
); );
boolMust.must(gteQuery); if (isCustom) {
builder.add(gteQuery, andOr);
} else {
boolMust.must(gteQuery);
}
break; break;
case "lt": case "lt":
NestedQueryBuilder ltQuery = QueryBuilders.nestedQuery( NestedQueryBuilder ltQuery = QueryBuilders.nestedQuery(
path, path,
QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery(nestedFieldValue).lt(Double.parseDouble(value.toString()))), QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery(path + longEnd).lt(value.toString())),
ScoreMode.Avg ScoreMode.Avg
); );
boolMust.must(ltQuery); if (isCustom) {
builder.add(ltQuery, andOr);
} else {
boolMust.must(ltQuery);
}
break; break;
case "lte": case "lte":
NestedQueryBuilder lteQuery = QueryBuilders.nestedQuery( NestedQueryBuilder lteQuery = QueryBuilders.nestedQuery(
path, path,
QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery(nestedFieldValue).lte(Double.parseDouble(value.toString()))), QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery(path + longEnd).lte(value.toString())),
ScoreMode.Avg ScoreMode.Avg
); );
boolMust.must(lteQuery); if (isCustom) {
builder.add(lteQuery, andOr);
} else {
boolMust.must(lteQuery);
}
break; break;
case "between": case "between":
JSONArray btValues = (JSONArray) value; JSONArray btValues = (JSONArray) value;
NestedQueryBuilder betweenQuery = QueryBuilders.nestedQuery( NestedQueryBuilder betweenQuery = QueryBuilders.nestedQuery(
path, path,
QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery(nestedFieldValue).gte(Double.parseDouble(btValues.get(0).toString())).lte(Double.parseDouble(btValues.get(1).toString()))), QueryBuilders.boolQuery().must(QueryBuilders.rangeQuery(path + longEnd).gte(Double.parseDouble(btValues.get(0).toString())).lte(Double.parseDouble(btValues.get(1).toString()))),
ScoreMode.Avg ScoreMode.Avg
); );
boolMust.must(betweenQuery); if (isCustom) {
builder.add(betweenQuery, andOr);
} else {
boolMust.must(betweenQuery);
}
break; break;
case "in": case "in":
JSONArray inValues = (JSONArray) value; JSONArray inValues = (JSONArray) value;
NestedQueryBuilder inQuery = QueryBuilders.nestedQuery( NestedQueryBuilder inQuery = QueryBuilders.nestedQuery(
path, path,
QueryBuilders.boolQuery().must(QueryBuilders.termsQuery(nestedFieldValue, inValues)), QueryBuilders.boolQuery().must(QueryBuilders.termsQuery(path + stringEnd, inValues)),
ScoreMode.Avg ScoreMode.Avg
); );
boolMust.must(inQuery); if (isCustom) {
builder.add(inQuery, andOr);
} else {
boolMust.must(inQuery);
}
break; break;
case "notIn": case "notIn":
JSONArray notInValues = (JSONArray) value; JSONArray notInValues = (JSONArray) value;
NestedQueryBuilder notInQuery = QueryBuilders.nestedQuery( NestedQueryBuilder notInQuery = QueryBuilders.nestedQuery(
path, path,
QueryBuilders.boolQuery().must(QueryBuilders.termsQuery(nestedFieldValue, notInValues)), QueryBuilders.boolQuery().must(QueryBuilders.termsQuery(path + stringEnd, notInValues)),
ScoreMode.Avg ScoreMode.Avg
); );
boolMust.mustNot(notInQuery); if (isCustom) {
builder.add(QueryBuilders.boolQuery().mustNot(notInQuery), andOr);
} else {
boolMust.mustNot(notInQuery);
}
break;
}
}
// 处理高级筛选条件
private void handleAdvancedFilter(BoolQueryBuilder boolMust, JSONArray leftGroup, JSONArray rightGroup, Boolean isOrGroup) {
DynamicQueryBuilder mainBuilder = new DynamicQueryBuilder();
EnhancedDynamicQueryBuilder leftBuilder = new EnhancedDynamicQueryBuilder();
if (!ObjectUtils.isEmpty(leftGroup)) {
// 处理左侧分组
JSONObject leftTechParam = new JSONObject();
JSONObject leftParamRange = new JSONObject();
JSONArray leftGroupList = new JSONArray();
// 剥离计数参数
getTechParam(leftGroup, leftGroupList, leftTechParam, leftParamRange);
// 如果技术参数分组不为空,添加技术参数筛选条件到左侧筛选条件中
if (!ObjectUtils.isEmpty(leftTechParam) && !ObjectUtils.isEmpty(leftParamRange)) {
addTechParam(leftTechParam, leftParamRange, leftBuilder);
}
// 非计数参数处理
groupHandler(leftGroupList, leftBuilder);
// 添加左侧筛选条件到最终筛选条件中
mainBuilder.and(leftBuilder.build());
}
if (!ObjectUtils.isEmpty(rightGroup)) {
// 处理右侧分组
EnhancedDynamicQueryBuilder rightBuilder = new EnhancedDynamicQueryBuilder();
JSONObject rightTechParam = new JSONObject();
JSONObject rightParamRange = new JSONObject();
JSONArray rightGroupList = new JSONArray();
// 剥离计数参数
getTechParam(rightGroup, rightGroupList, rightTechParam, rightParamRange);
// 如果技术参数分组不为空,添加技术参数筛选条件到左侧筛选条件中
if (!ObjectUtils.isEmpty(rightTechParam) && !ObjectUtils.isEmpty(rightParamRange)) {
addTechParam(rightTechParam, rightParamRange, rightBuilder);
}
// 非计数参数处理
groupHandler(rightGroupList, rightBuilder);
// 添加右侧筛选条件到最终筛选条件中
if (isOrGroup) {
mainBuilder.or(rightBuilder.build());
} else {
mainBuilder.and(rightBuilder.build());
}
}
// 组装最终筛选条件
boolMust.must(mainBuilder.build());
}
private void addTechParam(JSONObject techParam, JSONObject paramRange, EnhancedDynamicQueryBuilder builder) {
String field = techParam.getString("value");
String itemCondition = paramRange.getString("itemCondition");
Object value = paramRange.get("value");
String andOr = paramRange.getString("andOr");
getParamQuery(field, itemCondition, value, true, null, builder, andOr);
}
private void groupHandler(JSONArray group, EnhancedDynamicQueryBuilder builder) {
for (Object object : group) {
JSONObject itemObj = JSONObject.parseObject(JSONObject.toJSONString(object));
String field = itemObj.getString("field");
String itemCondition = itemObj.getString("itemCondition");
Object value = itemObj.get("value");
String andOr = itemObj.getString("andOr");
// 组装查询条件
getItemQueryNew(field, itemCondition, value, andOr, builder);
}
}
private void getTechParam(JSONArray group, JSONArray resultGroup, JSONObject techParam, JSONObject paramRange) {
// 如果只有技术参数或者只有参数范围,则舍弃对应的分组
group.forEach(item -> {
JSONObject itemObj = JSONObject.parseObject(JSONObject.toJSONString(item));
if (itemObj.getString("field").equals("techParam")) {
techParam.putAll(itemObj);
} else if (itemObj.getString("field").equals("paramRange")) {
paramRange.putAll(itemObj);
} else {
resultGroup.add(itemObj);
}
});
// if (group.contains("techParam") && !group.contains("paramRange") || !group.contains("techParam") && group.contains("paramRange")) {
// for (Object object : group) {
// JSONObject itemObj = JSONObject.parseObject(JSONObject.toJSONString(object));
// if (!itemObj.getString("field").equals("techParam")) {
// resultGroup.add(itemObj);
// }
// }
// } else if (group.contains("techParam") && group.contains("paramRange")) {
// // 如果同时包含技术参数和参数范围,则将技术参数和参数范围剥离到技术参数数组中,其他的放在分组数组中
// for (Object object : group) {
// JSONObject itemObj = JSONObject.parseObject(JSONObject.toJSONString(object));
// if (itemObj.getString("field").equals("techParam")) {
// techParam = itemObj;
// } else if (itemObj.getString("field").equals("paramRange")) {
// paramRange = itemObj;
// } else {
// resultGroup.add(itemObj);
// }
// }
// } else {
// // 既不包含技术参数也不包含参数范围,则直接返回分组数组
// resultGroup.addAll(group);
// }
}
private void getItemQuery(String field, String itemCondition, Object value, String isOr, DynamicQueryBuilder groupBuilder, DynamicQueryBuilder groupMainBuilder) {
switch (itemCondition) {
case "eq":
groupBuilder.and(QueryBuilders.termQuery(field, value));
break;
case "neq":
groupBuilder.not(QueryBuilders.termQuery(field, value));
break;
case "like":
groupBuilder.and(QueryBuilders.wildcardQuery(field, "*" + value + "*"));
break;
case "notLike":
groupBuilder.not(QueryBuilders.wildcardQuery(field, "*" + value + "*"));
break;
case "gt":
groupBuilder.and(QueryBuilders.rangeQuery(field).gt(value.toString()));
break;
case "gte":
groupBuilder.and(QueryBuilders.rangeQuery(field).gte(value.toString()));
break;
case "lt":
groupBuilder.and(QueryBuilders.rangeQuery(field).lt(value.toString()));
break;
case "lte":
groupBuilder.and(QueryBuilders.rangeQuery(field).lte(value.toString()));
break;
case "between":
JSONArray btValues = (JSONArray) value;
groupBuilder.and(QueryBuilders.rangeQuery(field).gte(Double.parseDouble(btValues.get(0).toString())).lte(Double.parseDouble(btValues.get(1).toString())));
break;
case "in":
JSONArray inValues = (JSONArray) value;
groupBuilder.and(QueryBuilders.termsQuery(field, inValues));
break; break;
case "notIn":
JSONArray notInValues = (JSONArray) value;
groupBuilder.not(QueryBuilders.termsQuery(field, notInValues));
break;
}
if (isOr.equals(or)) {
groupMainBuilder.or(groupBuilder.build());
} else {
groupMainBuilder.and(groupBuilder.build());
}
}
private void getItemQueryNew(String field, String itemCondition, Object value, String isOr, EnhancedDynamicQueryBuilder builder) {
// 如果包含需要特殊处理的字段,则调用对应的处理方法,否则调用通用处理方法
if (equipHandleOtherFields.contains(field) || companyHandleOtherFields.contains(field) || personHandleOtherFields.contains(field)) {
handleOtherField(field, itemCondition, value, isOr, builder);
} else {
switch (itemCondition) {
case "eq":
builder.add(QueryBuilders.termQuery(field, value), isOr);
break;
case "neq":
builder.add(QueryBuilders.boolQuery().mustNot(QueryBuilders.termQuery(field, value)), isOr);
break;
case "like":
builder.add(QueryBuilders.boolQuery().must(QueryBuilders.wildcardQuery(field, "*" + value + "*")), isOr);
break;
case "notLike":
builder.add(QueryBuilders.boolQuery().mustNot(QueryBuilders.wildcardQuery(field, "*" + value + "*")), isOr);
break;
case "gt":
builder.add(QueryBuilders.rangeQuery(field).gt(value.toString()), isOr);
break;
case "gte":
builder.add(QueryBuilders.rangeQuery(field).gte(value.toString()), isOr);
break;
case "lt":
builder.add(QueryBuilders.rangeQuery(field).lt(value.toString()), isOr);
break;
case "lte":
builder.add(QueryBuilders.rangeQuery(field).lte(value.toString()), isOr);
break;
case "between":
JSONArray btValues = (JSONArray) value;
builder.add(QueryBuilders.rangeQuery(field).gte(Double.parseDouble(btValues.get(0).toString())).lte(Double.parseDouble(btValues.get(1).toString())), isOr);
break;
case "in":
JSONArray inValues = (JSONArray) value;
builder.add(QueryBuilders.termsQuery(field, inValues), isOr);
break;
case "notIn":
JSONArray notInValues = (JSONArray) value;
builder.add(QueryBuilders.boolQuery().mustNot(QueryBuilders.termsQuery(field, notInValues)), isOr);
break;
}
}
}
// 特殊处理字段
private void handleOtherField(String field, String itemCondition, Object value, String isOr, EnhancedDynamicQueryBuilder builder) {
if (equipHandleOtherFields.contains(field)) {
equipFieldHandle(field, itemCondition, value, isOr, builder);
} else if (companyHandleOtherFields.contains(field)) {
companyFieldHandle(field, itemCondition, value, isOr, builder);
} else if (personHandleOtherFields.contains(field)) {
personFieldHandle(field, itemCondition, value, isOr, builder);
}
}
private void personFieldHandle(String field, String itemCondition, Object value, String isOr, EnhancedDynamicQueryBuilder builder) {
if (field.equals("newPost") || field.equals("subPost") || field.equals("equipType") || field.equals("unitType")) {
if (itemCondition.equals("eq")) {
builder.add(QueryBuilders.termQuery(field + ".keyword", value), isOr);
} else if (itemCondition.equals("in")) {
builder.add(QueryBuilders.wildcardQuery(field + ".keyword", "*" + value + "*"), isOr);
} else {
builder.add(QueryBuilders.boolQuery().mustNot(QueryBuilders.wildcardQuery(field + ".keyword", "*" + value + "*")), isOr);
}
} else {
String path = "licenses";
String nestedField = path + "." + field;
// 根据证书编号判断有无资质
if (field.equals("certNo")) {
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.existsQuery(nestedField),
ScoreMode.Avg
);
if (itemCondition.equals("eq") || itemCondition.equals("in")) {
builder.add(value.equals("1") ? nestedQuery : QueryBuilders.boolQuery().mustNot(nestedQuery), isOr);
} else {
builder.add(value.equals("1") ? QueryBuilders.boolQuery().mustNot(nestedQuery) : nestedQuery, isOr);
}
} else if (field.equals("expiryDate")) {
if (value.equals("overdue")) {
if (itemCondition.equals("eq") || itemCondition.equals("in")) {
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery(nestedField).lt(LocalDate.now().format(formatter))),
ScoreMode.Avg
);
builder.add(nestedQuery, isOr);
} else {
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery(nestedField).gte(LocalDate.now().format(formatter))),
ScoreMode.Avg
);
builder.add(nestedQuery, isOr);
}
} else if (value.equals("near")) {
if (itemCondition.equals("eq") || itemCondition.equals("in")) {
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery(nestedField).lte(LocalDate.now().plusDays(30).format(formatter)).gte(LocalDate.now().format(formatter))),
ScoreMode.Avg
);
builder.add(nestedQuery, isOr);
} else {
NestedQueryBuilder overdueNestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery(nestedField).lt(LocalDate.now().format(formatter))),
ScoreMode.Avg
);
NestedQueryBuilder normalNestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery(nestedField).gt(LocalDate.now().plusDays(30).format(formatter))),
ScoreMode.Avg
);
NestedQueryBuilder noLicensesNestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.existsQuery(nestedField),
ScoreMode.Avg
);
builder.add(overdueNestedQuery, or);
builder.add(normalNestedQuery, or);
builder.add(noLicensesNestedQuery, or);
}
} else if (value.equals("normal")) {
if (itemCondition.equals("eq") || itemCondition.equals("in")) {
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery(nestedField).gt(LocalDate.now().plusDays(30).format(formatter))),
ScoreMode.Avg
);
builder.add(nestedQuery, isOr);
} else {
NestedQueryBuilder elseNestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery(nestedField).lte(LocalDate.now().plusDays(30).format(formatter))),
ScoreMode.Avg
);
NestedQueryBuilder noLicensesNestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.existsQuery(nestedField),
ScoreMode.Avg
);
builder.add(elseNestedQuery, or);
builder.add(noLicensesNestedQuery, or);
}
} else {
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.existsQuery(nestedField),
ScoreMode.Avg
);
if (itemCondition.equals("eq") || itemCondition.equals("in")) {
builder.add(nestedQuery, isOr);
} else {
builder.add(QueryBuilders.boolQuery().mustNot(nestedQuery), isOr);
}
}
} else {
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.wildcardQuery(nestedField, "*" + value + "*"),
ScoreMode.Avg
);
if (itemCondition.equals("eq")) {
NestedQueryBuilder eqNestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.termQuery(nestedField, value),
ScoreMode.Avg
);
builder.add(eqNestedQuery, isOr);
} else if (itemCondition.equals("in")) {
builder.add(nestedQuery, isOr);
} else {
builder.add(QueryBuilders.boolQuery().mustNot(nestedQuery), isOr);
}
}
} }
} }
private void companyFieldHandle(String field, String itemCondition, Object value, String isOr, EnhancedDynamicQueryBuilder builder) {
if (field.equals("itemCode") || field.equals("subItemCode") || field.equals("permitStatus")) {
String path = "licenses";
String nestedField = path + "." + (field.equals("permitStatus") ? "expiryDate" : field + ".keyword");
if (field.equals("permitStatus")) {
if (value.equals("overdue")) {
if (itemCondition.equals("eq") || itemCondition.equals("in")) {
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery(nestedField).lt(LocalDate.now().format(formatter))),
ScoreMode.Avg
);
builder.add(QueryBuilders.boolQuery().must(nestedQuery), isOr);
} else {
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery(nestedField).gte(LocalDate.now().format(formatter))),
ScoreMode.Avg
);
builder.add(QueryBuilders.boolQuery().must(nestedQuery), isOr);
}
} else if (value.equals("near")) {
if (itemCondition.equals("eq") || itemCondition.equals("in")) {
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery(nestedField).lte(LocalDate.now().plusDays(30).format(formatter)).gte(LocalDate.now().format(formatter))),
ScoreMode.Avg
);
builder.add(QueryBuilders.boolQuery().must(nestedQuery), isOr);
} else {
NestedQueryBuilder overdueNestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery(nestedField).lt(LocalDate.now().format(formatter))),
ScoreMode.Avg
);
builder.add(QueryBuilders.boolQuery().must(overdueNestedQuery), or);
NestedQueryBuilder normalNestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery(nestedField).gt(LocalDate.now().plusDays(30).format(formatter))),
ScoreMode.Avg
);
builder.add(QueryBuilders.boolQuery().must(normalNestedQuery), or);
}
} else if (value.equals("normal")) {
if (itemCondition.equals("eq") || itemCondition.equals("in")) {
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery(nestedField).gt(LocalDate.now().plusDays(30).format(formatter))),
ScoreMode.Avg
);
builder.add(QueryBuilders.boolQuery().must(nestedQuery), isOr);
} else {
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery(nestedField).lte(LocalDate.now().plusDays(30).format(formatter))),
ScoreMode.Avg
);
builder.add(QueryBuilders.boolQuery().must(nestedQuery), isOr);
}
}
} else {
if (itemCondition.equals("eq") || itemCondition.equals("in")) {
// 创建嵌套查询
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.termsQuery(nestedField, value),
ScoreMode.Avg
);
builder.add(QueryBuilders.boolQuery().must(nestedQuery), isOr);
} else {
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.termsQuery(nestedField, value),
ScoreMode.Avg
);
builder.add(QueryBuilders.boolQuery().mustNot(nestedQuery), isOr);
}
}
} else {
if (itemCondition.equals("eq")) {
builder.add(QueryBuilders.termQuery(field + ".keyword", value), isOr);
} else if (itemCondition.equals("in")) {
builder.add(QueryBuilders.wildcardQuery(field + ".keyword", "*" + value + "*"), isOr);
} else {
builder.add(QueryBuilders.boolQuery().mustNot(QueryBuilders.wildcardQuery(field + ".keyword", "*" + value + "*")), isOr);
}
}
}
private void equipFieldHandle(String field, String itemCondition, Object value, String isOr, EnhancedDynamicQueryBuilder builder) {
if (field.equals("NEXT_INSPECT_DATE")) {
if (value.equals("overdue")) {
// 超期:小于当前日期
if (itemCondition.equals("eq") || itemCondition.equals("in")) {
builder.add(QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery(field).lt(LocalDate.now().format(formatter))), isOr);
} else {
builder.add(QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery(field).gt(LocalDate.now().format(formatter))), isOr);
}
} else if (value.equals("near")) {
// 临期:小于等于当前日期加上30天
if (itemCondition.equals("eq") || itemCondition.equals("in")) {
builder.add(QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery(field).gte(LocalDate.now().format(formatter)).lte(LocalDate.now().plusDays(30).format(formatter))), isOr);
} else {
builder.add(QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery(field).lt(LocalDate.now().format(formatter))), or);
builder.add(QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery(field).gt(LocalDate.now().plusDays(30).format(formatter))), or);
}
} else {
// 正常:大于当前日期加上30天
if (itemCondition.equals("eq") || itemCondition.equals("in")) {
builder.add(QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery(field).gt(LocalDate.now().plusDays(30).format(formatter))), isOr);
} else {
builder.add(QueryBuilders.boolQuery().filter(QueryBuilders.rangeQuery(field).lt(LocalDate.now().plusDays(30).format(formatter))), isOr);
}
}
} else if (field.equals("IS_SUPERVISORY_CODE")) {
if (value.equals("1")) {
builder.add(QueryBuilders.boolQuery().must(QueryBuilders.existsQuery(field)).mustNot(QueryBuilders.termsQuery(field, "null")), isOr);
} else {
builder.add(QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery(field)), isOr);
}
} else if (field.equals("USC_DATE")) {
if (value.equals("15")) {
// 15年以上:大于当前日期减去15年
if (itemCondition.equals("eq") || itemCondition.equals("in")) {
builder.add(QueryBuilders.rangeQuery(field).gt(LocalDate.now().minusYears(15).format(formatter)), isOr);
} else {
builder.add(QueryBuilders.rangeQuery(field).lte(LocalDate.now().minusYears(15).format(formatter)), isOr);
}
} else if (value.equals("10-15")) {
// 10-15年:小于当前日期减去15年,大于等于当前日期减去10年
if (itemCondition.equals("eq") || itemCondition.equals("in")) {
builder.add(QueryBuilders.rangeQuery(field).lt(LocalDate.now().minusYears(15).format(formatter)).gte(LocalDate.now().minusYears(10).format(formatter)), isOr);
} else {
builder.add(QueryBuilders.rangeQuery(field).gte(LocalDate.now().minusYears(15).format(formatter)), or);
builder.add(QueryBuilders.rangeQuery(field).lte(LocalDate.now().minusYears(10).format(formatter)), or);
}
} else if (value.equals("5-10")) {
// 5-10年:小于当前日期减去10年,大于等于当前日期减去5年
if (itemCondition.equals("eq") || itemCondition.equals("in")) {
builder.add(QueryBuilders.rangeQuery(field).lt(LocalDate.now().minusYears(10).format(formatter)).gte(LocalDate.now().minusYears(5).format(formatter)), isOr);
} else {
builder.add(QueryBuilders.rangeQuery(field).gte(LocalDate.now().minusYears(10).format(formatter)), or);
builder.add(QueryBuilders.rangeQuery(field).lte(LocalDate.now().minusYears(5).format(formatter)), or);
}
} else if (value.equals("0-5")) {
// 0-5年:小于当前日期减去5年
if (itemCondition.equals("eq") || itemCondition.equals("in")) {
builder.add(QueryBuilders.rangeQuery(field).lt(LocalDate.now().minusYears(5).format(formatter)), isOr);
} else {
builder.add(QueryBuilders.rangeQuery(field).gte(LocalDate.now().minusYears(5).format(formatter)), isOr);
}
}
} else if (field.equals("createDate")) {
JSONArray createDates = (JSONArray) value;
String startDate = DateUtils.convertDateToString(createDates.getDate(0), DateUtils.DATE_TIME_PATTERN);
String endDate = DateUtils.convertDateToString(createDates.getDate(1), DateUtils.DATE_TIME_PATTERN);
builder.add(QueryBuilders.rangeQuery("createDate").gte(startDate.replace(" ", "T")).lte(endDate.replace(" ", "T")), isOr);
}
}
public JSONArray queryUnitType() { public JSONArray queryUnitType() {
return UnitTypeEnum.getAll(); return UnitTypeEnum.getAll();
} }
...@@ -779,15 +1350,15 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -779,15 +1350,15 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
JSONArray permitStatusData = new JSONArray(); JSONArray permitStatusData = new JSONArray();
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
JSONObject object = new JSONObject(); JSONObject object = new JSONObject();
if(0==i){ if (0 == i) {
object.put("key", "overdue"); object.put("key", "overdue");
object.put("value", "overdue"); object.put("value", "overdue");
object.put("label", "超期"); object.put("label", "超期");
}else if(1==i){ } else if (1 == i) {
object.put("key", "near"); object.put("key", "near");
object.put("value", "near"); object.put("value", "near");
object.put("label", "临期"); object.put("label", "临期");
}else{ } else {
object.put("key", "normal"); object.put("key", "normal");
object.put("value", "normal"); object.put("value", "normal");
object.put("label", "正常"); object.put("label", "正常");
...@@ -815,21 +1386,21 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -815,21 +1386,21 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
JSONObject result = new JSONObject(); JSONObject result = new JSONObject();
//资质状态 //资质状态
JSONArray permissionStatus = new JSONArray(); JSONArray permissionStatus = new JSONArray();
for(int i=0;i<3;i++){ for (int i = 0; i < 3; i++) {
JSONObject object = new JSONObject(); JSONObject object = new JSONObject();
if(0==i){ if (0 == i) {
object.put("key", "noLicenses"); object.put("key", "noLicenses");
object.put("value", "noLicenses"); object.put("value", "noLicenses");
object.put("label", "无资质要求"); object.put("label", "无资质要求");
}else if(1==i){ } else if (1 == i) {
object.put("key", "overdue"); object.put("key", "overdue");
object.put("value", "overdue"); object.put("value", "overdue");
object.put("label", "资质超期"); object.put("label", "资质超期");
}else if(2==i){ } else if (2 == i) {
object.put("key", "near"); object.put("key", "near");
object.put("value", "near"); object.put("value", "near");
object.put("label", "资质临期"); object.put("label", "资质临期");
}else { } else {
object.put("key", "normal"); object.put("key", "normal");
object.put("value", "normal"); object.put("value", "normal");
object.put("label", "正常"); object.put("label", "正常");
...@@ -840,7 +1411,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -840,7 +1411,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
//证书类型 //证书类型
List<DictionarieValueModel> certType = Systemctl.dictionarieClient.dictValues("CERT_TYPE").getResult(); List<DictionarieValueModel> certType = Systemctl.dictionarieClient.dictValues("CERT_TYPE").getResult();
JSONArray certTypeArray = new JSONArray(); JSONArray certTypeArray = new JSONArray();
for(int i=0;i<certType.size();i++){ for (int i = 0; i < certType.size(); i++) {
JSONObject object = new JSONObject(); JSONObject object = new JSONObject();
object.put("key", certType.get(i).getDictDataKey()); object.put("key", certType.get(i).getDictDataKey());
object.put("value", certType.get(i).getDictDataKey()); object.put("value", certType.get(i).getDictDataKey());
...@@ -852,14 +1423,14 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -852,14 +1423,14 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
List<DictionarieValueModel> RYJB_JC = Systemctl.dictionarieClient.dictValues("RYJB_JC").getResult(); List<DictionarieValueModel> RYJB_JC = Systemctl.dictionarieClient.dictValues("RYJB_JC").getResult();
List<DictionarieValueModel> RYJB_JY = Systemctl.dictionarieClient.dictValues("RYJB_JY").getResult(); List<DictionarieValueModel> RYJB_JY = Systemctl.dictionarieClient.dictValues("RYJB_JY").getResult();
JSONArray permissionLevelArray = new JSONArray(); JSONArray permissionLevelArray = new JSONArray();
for(int i=0;i<RYJB_JC.size();i++){ for (int i = 0; i < RYJB_JC.size(); i++) {
JSONObject object = new JSONObject(); JSONObject object = new JSONObject();
object.put("key", RYJB_JC.get(i).getDictDataKey()); object.put("key", RYJB_JC.get(i).getDictDataKey());
object.put("value", RYJB_JC.get(i).getDictDataKey()); object.put("value", RYJB_JC.get(i).getDictDataKey());
object.put("label", RYJB_JC.get(i).getDictDataValue()); object.put("label", RYJB_JC.get(i).getDictDataValue());
permissionLevelArray.add(object); permissionLevelArray.add(object);
} }
for(int i=0;i<RYJB_JY.size();i++){ for (int i = 0; i < RYJB_JY.size(); i++) {
JSONObject object = new JSONObject(); JSONObject object = new JSONObject();
object.put("key", RYJB_JY.get(i).getDictDataKey()); object.put("key", RYJB_JY.get(i).getDictDataKey());
object.put("value", RYJB_JY.get(i).getDictDataKey()); object.put("value", RYJB_JY.get(i).getDictDataKey());
...@@ -872,7 +1443,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -872,7 +1443,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
//监管设备类型 //监管设备类型
List<EquipmentCategoryDto> equipmentCategoryDtos = equipmentCategoryMapper.selectClassify(); List<EquipmentCategoryDto> equipmentCategoryDtos = equipmentCategoryMapper.selectClassify();
JSONArray equipCategoryData = new JSONArray(); JSONArray equipCategoryData = new JSONArray();
for(int i=0;i<equipmentCategoryDtos.size();i++){ for (int i = 0; i < equipmentCategoryDtos.size(); i++) {
JSONObject object = new JSONObject(); JSONObject object = new JSONObject();
object.put("key", equipmentCategoryDtos.get(i).getCode()); object.put("key", equipmentCategoryDtos.get(i).getCode());
object.put("value", equipmentCategoryDtos.get(i).getCode()); object.put("value", equipmentCategoryDtos.get(i).getCode());
...@@ -993,7 +1564,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -993,7 +1564,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
public JSONArray queryZYXM(String type) { public JSONArray queryZYXM(String type) {
JSONArray result = new JSONArray(); JSONArray result = new JSONArray();
if("特种设备安全管理和作业人员证".equals(type)){ if ("特种设备安全管理和作业人员证".equals(type)) {
List<DictionarieValueModel> certType = Systemctl.dictionarieClient.dictValues("JOB_ITEM").getResult(); List<DictionarieValueModel> certType = Systemctl.dictionarieClient.dictValues("JOB_ITEM").getResult();
for (DictionarieValueModel certTypeModel : certType) { for (DictionarieValueModel certTypeModel : certType) {
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
...@@ -1002,8 +1573,8 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -1002,8 +1573,8 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
jsonObject.put("label", certTypeModel.getDictDataValue()); jsonObject.put("label", certTypeModel.getDictDataValue());
result.add(jsonObject); result.add(jsonObject);
} }
}else { } else {
List<DictionarieValueModel> certType = Systemctl.dictionarieClient.dictValues("ZZXM_"+type).getResult(); List<DictionarieValueModel> certType = Systemctl.dictionarieClient.dictValues("ZZXM_" + type).getResult();
for (DictionarieValueModel certTypeModel : certType) { for (DictionarieValueModel certTypeModel : certType) {
JSONObject jsonObject = new JSONObject(); JSONObject jsonObject = new JSONObject();
jsonObject.put("key", certTypeModel.getDictDataKey()); jsonObject.put("key", certTypeModel.getDictDataKey());
...@@ -1019,19 +1590,19 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -1019,19 +1590,19 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
SearchRequest searchRequest = new SearchRequest("idx_biz_enterprise_info"); SearchRequest searchRequest = new SearchRequest("idx_biz_enterprise_info");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.wildcardQuery("superviseOrgCode.keyword", QueryParser.escape(orgCode) + "*")); boolQueryBuilder.must(QueryBuilders.wildcardQuery("superviseOrgCode.keyword", QueryParser.escape(orgCode) + "*"));
searchSourceBuilder.query(boolQueryBuilder); searchSourceBuilder.query(boolQueryBuilder);
searchRequest.source(searchSourceBuilder); searchRequest.source(searchSourceBuilder);
JSONArray result = new JSONArray(); JSONArray result = new JSONArray();
try { try {
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT); SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
for (org.elasticsearch.search.SearchHit hit : searchResponse.getHits().getHits()) { for (SearchHit hit : searchResponse.getHits().getHits()) {
JSONObject jsonObject = ((JSONObject) JSONObject.toJSON(hit)).getJSONObject("sourceAsMap"); JSONObject jsonObject = ((JSONObject) JSONObject.toJSON(hit)).getJSONObject("sourceAsMap");
JSONObject dto = new JSONObject(); JSONObject dto = new JSONObject();
dto.put("key",jsonObject.getString("useCode")); dto.put("key", jsonObject.getString("useCode"));
dto.put("value",jsonObject.getString("useCode")); dto.put("value", jsonObject.getString("useCode"));
dto.put("label",jsonObject.getString("useUnit")); dto.put("label", jsonObject.getString("useUnit"));
result.add(dto); result.add(dto);
} }
} catch (IOException e) { } catch (IOException e) {
...@@ -1044,7 +1615,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -1044,7 +1615,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
public JSONArray queryEquipList() { public JSONArray queryEquipList() {
List<EquipmentCategoryDto> equipmentCategoryDtos = equipmentCategoryMapper.selectClassify(); List<EquipmentCategoryDto> equipmentCategoryDtos = equipmentCategoryMapper.selectClassify();
JSONArray equipCategoryData = new JSONArray(); JSONArray equipCategoryData = new JSONArray();
for(int i=0;i<equipmentCategoryDtos.size();i++){ for (int i = 0; i < equipmentCategoryDtos.size(); i++) {
JSONObject object = new JSONObject(); JSONObject object = new JSONObject();
object.put("key", equipmentCategoryDtos.get(i).getCode()); object.put("key", equipmentCategoryDtos.get(i).getCode());
object.put("value", equipmentCategoryDtos.get(i).getCode()); object.put("value", equipmentCategoryDtos.get(i).getCode());
...@@ -1055,12 +1626,12 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -1055,12 +1626,12 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
} }
public JSONArray queryEquCategory(String type) { public JSONArray queryEquCategory(String type) {
JSONArray result = tzsCustomFilterMapper.queryEquCategory(type,"EQU_CATEGORY"); JSONArray result = tzsCustomFilterMapper.queryEquCategory(type, "EQU_CATEGORY");
return result; return result;
} }
public JSONArray queryEquDefine(String type) { public JSONArray queryEquDefine(String type) {
JSONArray result = tzsCustomFilterMapper.queryEquCategory(type,"EQU_DEFINE"); JSONArray result = tzsCustomFilterMapper.queryEquCategory(type, "EQU_DEFINE");
return result; return result;
} }
...@@ -1097,7 +1668,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -1097,7 +1668,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
//证书类型 //证书类型
List<DictionarieValueModel> certType = Systemctl.dictionarieClient.dictValues("CERT_TYPE").getResult(); List<DictionarieValueModel> certType = Systemctl.dictionarieClient.dictValues("CERT_TYPE").getResult();
JSONArray certTypeArray = new JSONArray(); JSONArray certTypeArray = new JSONArray();
for(int i=0;i<certType.size();i++){ for (int i = 0; i < certType.size(); i++) {
JSONObject object = new JSONObject(); JSONObject object = new JSONObject();
object.put("key", certType.get(i).getDictDataKey()); object.put("key", certType.get(i).getDictDataKey());
object.put("value", certType.get(i).getDictDataKey()); object.put("value", certType.get(i).getDictDataKey());
...@@ -1112,14 +1683,14 @@ public class ComprehensiveStatisticalAnalysisServiceImpl { ...@@ -1112,14 +1683,14 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
List<DictionarieValueModel> RYJB_JC = Systemctl.dictionarieClient.dictValues("RYJB_JC").getResult(); List<DictionarieValueModel> RYJB_JC = Systemctl.dictionarieClient.dictValues("RYJB_JC").getResult();
List<DictionarieValueModel> RYJB_JY = Systemctl.dictionarieClient.dictValues("RYJB_JY").getResult(); List<DictionarieValueModel> RYJB_JY = Systemctl.dictionarieClient.dictValues("RYJB_JY").getResult();
JSONArray permissionLevelArray = new JSONArray(); JSONArray permissionLevelArray = new JSONArray();
for(int i=0;i<RYJB_JC.size();i++){ for (int i = 0; i < RYJB_JC.size(); i++) {
JSONObject object = new JSONObject(); JSONObject object = new JSONObject();
object.put("key", RYJB_JC.get(i).getDictDataKey()); object.put("key", RYJB_JC.get(i).getDictDataKey());
object.put("value", RYJB_JC.get(i).getDictDataKey()); object.put("value", RYJB_JC.get(i).getDictDataKey());
object.put("label", RYJB_JC.get(i).getDictDataValue()); object.put("label", RYJB_JC.get(i).getDictDataValue());
permissionLevelArray.add(object); permissionLevelArray.add(object);
} }
for(int i=0;i<RYJB_JY.size();i++){ for (int i = 0; i < RYJB_JY.size(); i++) {
JSONObject object = new JSONObject(); JSONObject object = new JSONObject();
object.put("key", RYJB_JY.get(i).getDictDataKey()); object.put("key", RYJB_JY.get(i).getDictDataKey());
object.put("value", RYJB_JY.get(i).getDictDataKey()); object.put("value", RYJB_JY.get(i).getDictDataKey());
......
package com.yeejoin.amos.boot.module.statistcs.factory;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import java.util.ArrayList;
import java.util.List;
public class DynamicQueryBuilder {
private final List<QueryBuilder> shouldClauses = new ArrayList<>();
private final List<QueryBuilder> mustClauses = new ArrayList<>();
private final List<QueryBuilder> mustNotClauses = new ArrayList<>();
// 添加OR条件
public DynamicQueryBuilder or(QueryBuilder query) {
shouldClauses.add(query);
return this;
}
// 添加AND条件
public DynamicQueryBuilder and(QueryBuilder query) {
mustClauses.add(query);
return this;
}
// 添加NOT条件
public DynamicQueryBuilder not(QueryBuilder query) {
mustNotClauses.add(query);
return this;
}
// 构建最终查询
public BoolQueryBuilder build() {
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
if (!shouldClauses.isEmpty()) {
shouldClauses.forEach(boolQuery::should);
boolQuery.minimumShouldMatch(1);
}
mustClauses.forEach(boolQuery::must);
mustNotClauses.forEach(boolQuery::mustNot);
return boolQuery;
}
}
\ No newline at end of file
package com.yeejoin.amos.boot.module.statistcs.factory;
import org.elasticsearch.index.query.*;
import java.util.*;
public class EnhancedDynamicQueryBuilder {
private final List<QueryBuilder> initialClauses = new ArrayList<>();
private String groupLogic; // "AND" 或 "OR"
private final List<QueryBuilder> mustClauses = new ArrayList<>();
private final List<QueryBuilder> shouldClauses = new ArrayList<>();
private final List<QueryBuilder> mustNotClauses = new ArrayList<>();
public EnhancedDynamicQueryBuilder() {
this("AND"); // 默认组间关系为AND
}
public EnhancedDynamicQueryBuilder(String groupLogic) {
this.groupLogic = groupLogic != null ? groupLogic : "AND";
}
/**
* 添加条件,自动处理第一个条件为null的情况
* @param query 查询条件
* @param logic 逻辑关系 (AND/OR/NOT),第一个条件可为null
*/
public EnhancedDynamicQueryBuilder add(QueryBuilder query, String logic) {
if (logic == null) {
if (isEmpty()) {
// 第一个条件,默认作为must条件
mustClauses.add(query);
} else {
// 后续条件未指定逻辑,使用组间默认逻辑
if ("OR".equalsIgnoreCase(groupLogic)) {
shouldClauses.add(query);
} else {
mustClauses.add(query);
}
}
} else {
switch (logic.toUpperCase()) {
case "AND":
mustClauses.add(query);
break;
case "OR":
shouldClauses.add(query);
break;
case "NOT":
mustNotClauses.add(query);
break;
default:
throw new IllegalArgumentException("Unsupported logic: " + logic);
}
}
return this;
}
public BoolQueryBuilder build() {
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
// 处理must条件
mustClauses.forEach(boolQuery::must);
// 处理should条件
if (!shouldClauses.isEmpty()) {
shouldClauses.forEach(boolQuery::should);
// 如果没有must条件,至少满足一个should
if (mustClauses.isEmpty()) {
boolQuery.minimumShouldMatch(1);
}
}
// 处理mustNot条件
mustNotClauses.forEach(boolQuery::mustNot);
return boolQuery;
}
private boolean isEmpty() {
return mustClauses.isEmpty() && shouldClauses.isEmpty() && mustNotClauses.isEmpty();
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment