Commit c286b52f authored by hcing's avatar hcing

feat:统计服务,大屏综合统计查询接口-人员相关

parent 4dcd9ab2
......@@ -23,7 +23,9 @@ public enum UnitTypeEnum {
azgzwxdw("安装改造维修单位", "1234", "license"),
zzdw("制造单位", "1236", "license"),
sjdw("设计单位", "1235", "license"),
grzt("个人主体", "6599", "use");
grzt("个人主体", "6599", "use"),
jyjg("检验机构", "1233-1", "license"),
jcjg("检测机构", "1233-2", "license");
private String name;
private String code;
......
......@@ -261,9 +261,125 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
JSONObject filterParams = null;
if (!ObjectUtils.isEmpty(filter.get("filterParams"))) {
filterParams = JSONObject.parseObject(JSONObject.toJSONString(filter.get("filterParams")));
String filterType = filter.getString("filterType");
String filterType = "advanced";
// 组装人员过滤条件
this.getPersonBoolQueryBuilder(filterParams, boolMust, filterType);
}
// 组装人员排序条件
this.getPersonBoolQuerySort(filter, builder);
builder.query(boolMust);
builder.from((current - 1) * size);
builder.size(size);
request.source(builder);
List<JSONObject> list = new LinkedList<>();
long totle = 0;
try {
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits().getHits()) {
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(hit);
JSONObject dto = jsonObject.getJSONObject("sourceAsMap");
if (dto.containsKey("identification") && !ObjectUtils.isEmpty(dto.get("identification"))) {
JSONArray jsonArray = JSONObject.parseArray(dto.get("identification").toString());
if (!ObjectUtils.isEmpty(jsonArray)) {
dto.put("identification", JSONObject.parseObject(JSONObject.parseArray(dto.get("identification").toString()).get(0).toString()).get("url"));
}
}
if (dto.containsKey("equipType")) {
String[] equipCodes = dto.get("equipType").toString().split(",");
StringBuilder equipTypes = new StringBuilder();
for (String equipType : equipCodes) {
equipTypes.append(EquipmentClassifityEnum.getNameByCode(equipType) + ",");
}
dto.put("equipType", equipTypes.substring(0, equipTypes.length() - 1));
}
StringBuilder licensesStatus = new StringBuilder();
if (dto.containsKey("licenses")) {
// 以下人员类型有资质要求
// 人员类型(newPost):检验人员:66151、检测人员:66152、作业人员:6552、检查人员:6763
// 人员子类型(subPost): 持证人员:6713、持证人员(P):6764、持证人员(R2):6765
String newPost = ObjectUtils.isEmpty(dto.getString("newPost")) ? "" : dto.getString("newPost");
String subPost = ObjectUtils.isEmpty(dto.getString("subPost")) ? "" : dto.getString("subPost");
if (newPost.contains("66151") || newPost.contains("66152") || newPost.contains("6763") || newPost.contains("6552") || subPost.contains("6713") || subPost.contains("6764") || subPost.contains("6765")) {
JSONArray licenses = dto.getJSONArray("licenses");
if (!ObjectUtils.isEmpty(licenses)) {
List<String> permissionStatusList = new ArrayList<>();
for (Object object : licenses) {
JSONObject json = JSONObject.parseObject(JSONObject.toJSONString(object));
if (!json.containsKey("expiryDate")) {
licensesStatus.append("/无有效期");
continue;
}
String expiryDate = json.getString("expiryDate");
if (!ObjectUtils.isEmpty(expiryDate)) {
long daysBetween = ChronoUnit.DAYS.between(LocalDate.now(), LocalDate.parse(expiryDate, formatter));
if (daysBetween <= 0) {
permissionStatusList.add("超期");
} else if (daysBetween <= 30) {
permissionStatusList.add("临期");
} else {
permissionStatusList.add("正常");
}
}
}
long cq = permissionStatusList.stream().filter(e -> e.equals("超期")).count();
long lq = permissionStatusList.stream().filter(e -> e.equals("临期")).count();
long zc = permissionStatusList.stream().filter(e -> e.equals("正常")).count();
long no = permissionStatusList.stream().filter(e -> e.equals("无有效期")).count();
if (cq > 0) {
licensesStatus.append("/资质超期");
}
if (lq > 0) {
licensesStatus.append("/资质临期");
}
if (zc > 0) {
licensesStatus.append("/资质正常");
}
if (no > 0) {
licensesStatus.append("/无有效期");
}
} else {
licensesStatus.append("无资质");
}
} else {
licensesStatus.append("无资质要求");
}
}
String licensesStatusStr = licensesStatus.toString();
licensesStatusStr = licensesStatusStr.startsWith("/") ? licensesStatusStr.substring(1) : licensesStatusStr;
licensesStatusStr = licensesStatusStr.endsWith("/") ? licensesStatusStr.substring(0, licensesStatusStr.length() - 1) : licensesStatusStr;
dto.put("licensesStatus", licensesStatusStr);
list.add(dto);
}
totle = Objects.requireNonNull(response.getInternalResponse().hits().getTotalHits()).value;
page.setRecords(list);
page.setTotal(totle);
result.put("pageData", page);
} catch (IOException e) {
throw new RuntimeException(e);
}
List<Map<String, Object>> statics = new ArrayList<>();
Map<String, Object> sum = new HashMap<>();
sum.put("name", "人员总数(人)");
sum.put("value", totle);
statics.add(sum);
result.put("statics", statics);
// 获取许可状态统计
List<Map<String, Object>> staticMap = new ArrayList<>();
getCompanyOrPersonPermitStatusStatic(boolMust, staticMap, StatisticalAnalysisEnum.person.getKey());
result.put("keyIndicator", staticMap);
return result;
}
/**
* 组装人员过滤条件
*/
private void getPersonBoolQueryBuilder(JSONObject filterParams, BoolQueryBuilder boolMust, String filterType) {
deleteUnitCategory(filterParams);
//快捷筛选和自定义筛选解析筛选规则不一致
// 快捷筛选和自定义筛选解析筛选规则不一致
if (filterType.equals("advanced")) {
filterParams.forEach((k, v) -> {
if (v instanceof JSONArray) {
......@@ -360,7 +476,7 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
} else if (item.equals("none")) {
NestedQueryBuilder nestedQuery = QueryBuilders.nestedQuery(
path,
QueryBuilders.boolQuery().must(QueryBuilders.existsQuery(nestedField)),
QueryBuilders.boolQuery().must(existsQuery(nestedField)),
ScoreMode.None
);
enhancedDynamicQueryBuilder.add(nestedQuery, or);
......@@ -424,6 +540,11 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
handleAdvancedFilter(boolMust, leftGroup, rightGroup, isOrGroup);
}
}
/**
* 组装人员排序
*/
private void getPersonBoolQuerySort(JSONObject filter, SearchSourceBuilder builder) {
// 排序
if (!ObjectUtils.isEmpty(filter.get("sort"))) {
JSONObject sort = JSONObject.parseObject(JSONObject.toJSONString(filter.get("sort")));
......@@ -437,110 +558,6 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
}
builder.sort(field, sort.getString("order").equals("desc") ? SortOrder.DESC : SortOrder.ASC);
}
builder.query(boolMust);
builder.from((current - 1) * size);
builder.size(size);
request.source(builder);
List<JSONObject> list = new LinkedList<>();
long totle = 0;
try {
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
for (SearchHit hit : response.getHits().getHits()) {
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(hit);
JSONObject dto = jsonObject.getJSONObject("sourceAsMap");
if (dto.containsKey("identification") && !ObjectUtils.isEmpty(dto.get("identification"))) {
JSONArray jsonArray = JSONObject.parseArray(dto.get("identification").toString());
if (!ObjectUtils.isEmpty(jsonArray)) {
dto.put("identification", JSONObject.parseObject(JSONObject.parseArray(dto.get("identification").toString()).get(0).toString()).get("url"));
}
}
if (dto.containsKey("equipType")) {
String[] equipCodes = dto.get("equipType").toString().split(",");
StringBuilder equipTypes = new StringBuilder();
for (String equipType : equipCodes) {
equipTypes.append(EquipmentClassifityEnum.getNameByCode(equipType) + ",");
}
dto.put("equipType", equipTypes.substring(0, equipTypes.length() - 1));
}
StringBuilder licensesStatus = new StringBuilder();
if (dto.containsKey("licenses")) {
// 以下人员类型有资质要求
// 人员类型(newPost):检验人员:66151、检测人员:66152、作业人员:6552、检查人员:6763
// 人员子类型(subPost): 持证人员:6713、持证人员(P):6764、持证人员(R2):6765
String newPost = ObjectUtils.isEmpty(dto.getString("newPost")) ? "" : dto.getString("newPost");
String subPost = ObjectUtils.isEmpty(dto.getString("subPost")) ? "" : dto.getString("subPost");
if (newPost.contains("66151") || newPost.contains("66152") || newPost.contains("6763") || newPost.contains("6552") || subPost.contains("6713") || subPost.contains("6764") || subPost.contains("6765")) {
JSONArray licenses = dto.getJSONArray("licenses");
if (!ObjectUtils.isEmpty(licenses)) {
List<String> permissionStatusList = new ArrayList<>();
for (Object object : licenses) {
JSONObject json = JSONObject.parseObject(JSONObject.toJSONString(object));
if (!json.containsKey("expiryDate")) {
licensesStatus.append("/无有效期");
continue;
}
String expiryDate = json.getString("expiryDate");
if (!ObjectUtils.isEmpty(expiryDate)) {
long daysBetween = ChronoUnit.DAYS.between(LocalDate.now(), LocalDate.parse(expiryDate, formatter));
if (daysBetween <= 0) {
permissionStatusList.add("超期");
} else if (daysBetween <= 30) {
permissionStatusList.add("临期");
} else {
permissionStatusList.add("正常");
}
}
}
long cq = permissionStatusList.stream().filter(e -> e.equals("超期")).count();
long lq = permissionStatusList.stream().filter(e -> e.equals("临期")).count();
long zc = permissionStatusList.stream().filter(e -> e.equals("正常")).count();
long no = permissionStatusList.stream().filter(e -> e.equals("无有效期")).count();
if (cq > 0) {
licensesStatus.append("/资质超期");
}
if (lq > 0) {
licensesStatus.append("/资质临期");
}
if (zc > 0) {
licensesStatus.append("/资质正常");
}
if (no > 0) {
licensesStatus.append("/无有效期");
}
} else {
licensesStatus.append("无资质");
}
} else {
licensesStatus.append("无资质要求");
}
}
String licensesStatusStr = licensesStatus.toString();
licensesStatusStr = licensesStatusStr.startsWith("/") ? licensesStatusStr.substring(1) : licensesStatusStr;
licensesStatusStr = licensesStatusStr.endsWith("/") ? licensesStatusStr.substring(0, licensesStatusStr.length() - 1) : licensesStatusStr;
dto.put("licensesStatus", licensesStatusStr);
list.add(dto);
}
totle = Objects.requireNonNull(response.getInternalResponse().hits().getTotalHits()).value;
page.setRecords(list);
page.setTotal(totle);
result.put("pageData", page);
} catch (IOException e) {
throw new RuntimeException(e);
}
List<Map<String, Object>> statics = new ArrayList<>();
Map<String, Object> sum = new HashMap<>();
sum.put("name", "人员总数(人)");
sum.put("value", totle);
statics.add(sum);
result.put("statics", statics);
// 获取许可状态统计
List<Map<String, Object>> staticMap = new ArrayList<>();
getCompanyOrPersonPermitStatusStatic(boolMust, staticMap, StatisticalAnalysisEnum.person.getKey());
result.put("keyIndicator", staticMap);
return result;
}
private JSONObject queryCompanyPage(JSONObject filter, Page<JSONObject> page, Integer current, Integer size) {
......@@ -2668,8 +2685,75 @@ public class ComprehensiveStatisticalAnalysisServiceImpl {
}
private List<Map<String, Object>> queryDpPersonStatistics(JSONObject filter, SearchRequest request, SearchSourceBuilder builder, BoolQueryBuilder boolMust, Map<String, Object> tabTotalMap) {
return null;
private List<Map<String, Object>> queryDpPersonStatistics(JSONObject filter, SearchRequest request, SearchSourceBuilder builder,
BoolQueryBuilder boolMust, Map<String, Object> tabTotalMap) {
JSONObject filterParams = JSONObject.parseObject(JSONObject.toJSONString(filter.get("filterParams")));
String filterType = "advanced";
// 组装人员过滤条件
this.getPersonBoolQueryBuilder(filterParams, boolMust, filterType);
// 计算总数
long personTotal = this.queryDpPersonStatisticsTotal(boolMust);
// 聚合查询
builder.size(0);// 不返回任何文档,只返回聚合结果
String aggName = "unit_types_split";
QueryBuilderUtils.buildSplitFieldAggCondition(builder, "unitType.keyword", "#", aggName);
builder.query(boolMust);
request.source(builder);
Map<String, Object> result = new HashMap<>();
try {
SearchResponse searchResponse = restHighLevelClient.search(request, RequestOptions.DEFAULT);
// 解析聚合结果
Terms unitTypesTerms = searchResponse.getAggregations().get(aggName);
if (unitTypesTerms != null) {
for (Terms.Bucket bucket : unitTypesTerms.getBuckets()) {
if (bucket.getKeyAsString().equals(UnitTypeEnum.sydw.getName())) {
result.put("sydw", bucket.getDocCount());
}
if (bucket.getKeyAsString().equals(UnitTypeEnum.grzt.getName())) {
result.put("grzt", bucket.getDocCount());
}
if (bucket.getKeyAsString().equals(UnitTypeEnum.sjdw.getName())) {
result.put("sjdw", bucket.getDocCount());
}
if (bucket.getKeyAsString().equals(UnitTypeEnum.zzdw.getName())) {
result.put("zzdw", bucket.getDocCount());
}
if (bucket.getKeyAsString().equals(UnitTypeEnum.azgzwxdw.getName())) {
result.put("azgzwxdw", bucket.getDocCount());
}
if (bucket.getKeyAsString().equals(UnitTypeEnum.czdw.getName())) {
result.put("czdw", bucket.getDocCount());
}
if (bucket.getKeyAsString().equals(UnitTypeEnum.jyjg.getName())) {
result.put("jyjg", bucket.getDocCount());
}
if (bucket.getKeyAsString().equals(UnitTypeEnum.jcjg.getName())) {
result.put("jcjg", bucket.getDocCount());
}
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
// 汇总总数
tabTotalMap.put(StatisticalAnalysisEnum.person.getCode(), personTotal);
return Collections.singletonList(result);
}
private long queryDpPersonStatisticsTotal(BoolQueryBuilder boolMust) {
CountRequest countRequest = new CountRequest();
countRequest.indices(StatisticalAnalysisEnum.person.getKey());
countRequest.query(boolMust);
CountResponse countResponse;
try {
countResponse = restHighLevelClient.count(countRequest, RequestOptions.DEFAULT);
} catch (Exception exception) {
throw new RuntimeException(exception);
}
return ObjectUtils.isEmpty(countResponse) ? 0 : countResponse.getCount();
}
private List<Map<String, Object>> queryDpCompanyStatistics(JSONObject filter, SearchRequest request, SearchSourceBuilder builder, BoolQueryBuilder boolMust, Map<String, Object> tabTotalMap) {
......
......@@ -2,6 +2,12 @@ package com.yeejoin.amos.boot.module.statistcs.biz.utils;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.script.Script;
import org.elasticsearch.script.ScriptType;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import java.util.Collections;
public class QueryBuilderUtils {
// 复制BoolQueryBuilder
......@@ -29,4 +35,25 @@ public class QueryBuilderUtils {
return copy;
}
/**
* 组装分割符字段的聚合查询
*
* @param searchSourceBuilder es查询构造器
* @param field 需要查询的字段,如:unitType.keyword
* @param spiltSymbol 分割符号,如:#
* @param aggName 聚合名称,根据此名称从查询结果获取数据,如:Terms unitTypesTerms = searchResponse.getAggregations().get(aggName)
*/
public static void buildSplitFieldAggCondition(SearchSourceBuilder searchSourceBuilder, String field, String spiltSymbol, String aggName) {
// Painless 脚本内容
String scriptSource = "if (doc['" + field + "'].size() > 0) {" +
" String value = doc['" + field + "'].value;" +
" if (value != null && !value.isEmpty()) {" +
" return value.splitOnToken('" + spiltSymbol + "');" +
" }" +
"}" +
"return [];";
Script script = new Script(ScriptType.INLINE, "painless", scriptSource, Collections.emptyMap());
searchSourceBuilder.aggregation(AggregationBuilders.terms(aggName).script(script));
}
}
\ 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