Commit 15df6f82 by 赵剑炜

增加模糊查询的组织机构数据

parent 304ce506
......@@ -13,6 +13,7 @@ public class QueryOrgReq {
private String orgCode;
@NotNull(message = "组织机构不能为空",groups = {ValidationApi.detail.class})
private Long orgId;
private String orgName;
private Long parentId;
private Integer isDepartment;
private Integer level;
......
......@@ -7,7 +7,12 @@ import com.junmp.jyzb.service.PubOrgService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
......@@ -64,6 +69,7 @@ public class CrudController {
blog1.setStatus(1);
blog1.setSerialNum(id1.toString());
blogRepository.save(blog1);
return blogRepository.save(blog);
}
......@@ -113,6 +119,7 @@ public class CrudController {
@ApiOperation("查找单个文档")
@GetMapping("findById")
public Blog findById(Long id) {
return blogRepository.findById(id).get();
}
......
......@@ -17,6 +17,7 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.List;
import java.util.Map;
......@@ -53,6 +54,11 @@ public class PubOrgController {
public ApiRes<OrgDto> GetCurrentList(@RequestBody @Validated(ValidationApi.detail.class) QueryOrgReq req) {
return ApiRes.success(pubOrgService.getOrgHierarchy(req));
}
@PostMapping("/GetCurrentESList")
@ApiOperation("根据当前组织机构列表ES查询")
public ApiRes<List<OrgDto>> GetCurrentESList(@RequestBody QueryOrgReq req) throws IOException {
return ApiRes.success(pubOrgService.getOrgHierarchyByEs(req));
}
@PostMapping("/ChangeOrgState")
@ApiOperation("改变组织机构状态信息")
public ApiRes<Boolean> changeOrgState(@RequestBody @Validated(ValidationApi.updateStatus.class) UpdateOrgReq req) {
......
......@@ -8,12 +8,14 @@ import com.junmp.jyzb.api.bean.query.QueryOrgReq;
import com.junmp.jyzb.api.bean.req.UpdateOrgReq;
import com.junmp.jyzb.utils.ResponseResult;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import com.junmp.jyzb.entity.PubOrg;
public interface PubOrgService extends IService<PubOrg> {
///添加至ES
Object AddToEs();
......@@ -26,6 +28,8 @@ public interface PubOrgService extends IService<PubOrg> {
List<OrgDto> getOrgList(QueryOrgReq req);
OrgDto getOrgHierarchy(QueryOrgReq req);
List<OrgDto> getOrgHierarchyByEs(QueryOrgReq req) throws IOException;
List<OrgDto> getLowOrg(QueryOrgReq req);
Boolean ChangeState(UpdateOrgReq req);
......
......@@ -18,12 +18,23 @@ import com.junmp.jyzb.api.exception.enums.PubOrgExceptionEnum;
import com.junmp.jyzb.entity.EquipmentType;
import com.junmp.jyzb.entity.PubOrg;
import com.junmp.jyzb.entity.Supplier;
import com.junmp.jyzb.utils.HttpStatus;
import com.junmp.jyzb.utils.RedisUtils;
import com.junmp.jyzb.utils.ResponseResult;
import com.junmp.jyzb.utils.ReturnMsg;
import com.junmp.jyzb.utils.*;
import com.junmp.v2.common.exception.base.ServiceException;
import com.junmp.v2.common.util.BeanPlusUtil;
import lombok.NonNull;
import org.elasticsearch.action.search.ClearScrollRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchScrollRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
......@@ -31,7 +42,9 @@ import com.junmp.jyzb.mapper.PubOrgMapper;
import com.junmp.jyzb.service.PubOrgService;
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
......@@ -40,7 +53,8 @@ public class PubOrgServiceImpl extends ServiceImpl<PubOrgMapper, PubOrg> implem
@Resource
private PubOrgMapper pubOrgMapper;
@Resource
private RestHighLevelClient client;
@Autowired
private RedisUtils redisUtils;
......@@ -287,9 +301,7 @@ public class PubOrgServiceImpl extends ServiceImpl<PubOrgMapper, PubOrg> implem
public OrgDto getOrgHierarchy(QueryOrgReq req) {
req.setDelFlag(1);
// req.setDelFlag(1);
LambdaQueryWrapper<PubOrg> wp = this.createWrapper(req);
// LambdaQueryWrapper<PubOrg> one = this.createWrapper(req);
List<PubOrg> list = this.list(wp);
OrgDto orgSet=new OrgDto();
PubOrg OrgOne= this.getById(req.getOrgId());
......@@ -314,12 +326,173 @@ public class PubOrgServiceImpl extends ServiceImpl<PubOrgMapper, PubOrg> implem
}
orgs.add(org);
});
return getMaximumParent(orgs,orgSet);
}
/**
* 搜索条件
* @return
* @throws IOException
*/
public List<PubOrg> searchAll() throws IOException {
SearchRequest request = new SearchRequest("org_pinyin");
SearchSourceBuilder builder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
.must(QueryBuilders.matchAllQuery()) // 匹配所有文档
.filter(QueryBuilders.termQuery("delFlag", 1)); // 过滤 delFlag 为 1 的文档
builder.query(boolQueryBuilder);
builder.size(5000); // 设置每页大小
request.source(builder);
request.scroll(TimeValue.timeValueMinutes(1L)); // 设置滚动时间
SearchResponse searchResponse = client.search(request, RequestOptions.DEFAULT);
List<PubOrg> pubOrgList = new ArrayList<>();
while (true) {
for (SearchHit documentFields : searchResponse.getHits().getHits()) {
Map<String, Object> sourceAsMap = documentFields.getSourceAsMap();
PubOrg pubOrg = this.fromMap(sourceAsMap);
pubOrgList.add(pubOrg);
}
SearchScrollRequest scrollRequest = new SearchScrollRequest(searchResponse.getScrollId());
scrollRequest.scroll(TimeValue.timeValueMinutes(1L));
searchResponse = client.scroll(scrollRequest, RequestOptions.DEFAULT);
if (searchResponse.getHits().getHits().length == 0) {
break; // 所有结果已经检索完成
}
}
// 清除滚动上下文
ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
clearScrollRequest.addScrollId(searchResponse.getScrollId());
client.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
return pubOrgList;
}
/**
* 搜索条件
* @param pageNum
* @param pageSize
* @param keyword
* @return
* @throws IOException
*/
public List<PubOrg> searchOrg(Integer pageNum, Integer pageSize, String keyword) throws IOException {
if (pageNum < 0) pageNum = 0;
SearchRequest request = new SearchRequest("org_pinyin");
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.from(pageNum);
builder.size(pageSize);
// 添加 MatchQueryBuilder 作为 must 条件
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("orgName", keyword).operator(Operator.AND);
MatchQueryBuilder matchQueryBuilder2 = QueryBuilders.matchQuery("orgName.pinyin", keyword).operator(Operator.AND);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.should(matchQueryBuilder);
boolQueryBuilder.should(matchQueryBuilder2);
// 添加过滤条件,只获取 delFlag 为 1 的数据
builder.postFilter(QueryBuilders.termQuery("delFlag", 1));
builder.query(boolQueryBuilder);
builder.timeout(new TimeValue(60, TimeUnit.SECONDS));
request.source(builder);
SearchResponse searchResponse = client.search(request, RequestOptions.DEFAULT);
List<PubOrg> pubOrgList = new ArrayList<>();
for (SearchHit documentFields : searchResponse.getHits().getHits()) {
Map<String, Object> sourceAsMap = documentFields.getSourceAsMap();
PubOrg pubOrg = this.fromMap(sourceAsMap);
// 添加到结果列表
pubOrgList.add(pubOrg);
}
return pubOrgList;
}
// 从 Map 中构建 PubOrg 对象的方法
public static PubOrg fromMap(Map<String, Object> map) {
PubOrg pubOrg = new PubOrg();
BeanPlusUtil.copyProperties(map, pubOrg);
// pubOrg.setOrgName((String) map.get("orgName"));
// 可以设置其他字段...
return pubOrg;
}
///通过ES获取数据
@Override
public List<OrgDto> getOrgHierarchyByEs(QueryOrgReq req) throws IOException {
req.setDelFlag(1);
LambdaQueryWrapper<PubOrg> wp = this.createWrapper(req);
ElasticsearchUtil esUtil = new ElasticsearchUtil(client);
// 1. 从 Elasticsearch 中搜索组织机构数据
List<PubOrg> searchResults = searchOrg(0, 20, req.getOrgName());
// 2. 从数据库中获取完整的组织机构数据
List<PubOrg> fullOrgData = this.list(wp);
// 3. 构建树状结构
List<OrgDto> tree = new ArrayList<>();
for (PubOrg searchResult : searchResults) {
// 在完整数据中查找匹配的组织机构
PubOrg fullOrg = findOrgById(fullOrgData, searchResult.getOrgId());
// 将完整数据转换为前端需要的 DTO
OrgDto orgDto = convertToDto(fullOrg, fullOrgData);
// TODO: 根据需求决定是否加入树状结构
tree.add(orgDto);
}
return tree;
}
private PubOrg findOrgById(List<PubOrg> fullOrgData, Long orgId) {
for (PubOrg org : fullOrgData) {
if (org.getOrgId().equals(orgId)) {
return org;
}
}
return null; // 如果找不到匹配的组织机构,可以根据实际需求进行处理
}
private OrgDto convertToDto(PubOrg org, List<PubOrg> allOrgs) {
OrgDto orgDto = new OrgDto();
// 这里根据你的实际字段进行映射
orgDto.setOrgId(org.getOrgId());
orgDto.setOrgName(org.getOrgName());
orgDto.setOrgCode(org.getOrgCode());
orgDto.setIsDepartment(org.getIsDepartment());
orgDto.setOrgParentId(org.getOrgParentId());
orgDto.setAreaName(org.getAreaName());
orgDto.setLevelFlag(String.valueOf(org.getLevelFlag()));
orgDto.setStatusFlag(org.getStatusFlag());
orgDto.setOrgParentId(org.getOrgParentId());
orgDto.setDName(org.getDName());
// 其他字段的映射...
// 查找当前节点的子节点
List<PubOrg> children = allOrgs.stream()
.filter(childOrg -> org.getOrgId().equals(childOrg.getOrgParentId()))
.collect(Collectors.toList());
// 如果子节点不为空,递归调用 convertToDto 处理子节点
if (!children.isEmpty()) {
List<OrgDto> childrenDto = new ArrayList<>();
for (PubOrg child : children) {
childrenDto.add(convertToDto(child, allOrgs));
}
orgDto.setChildren(childrenDto);
}
return orgDto;
}
public OrgDto getMaximumParent(List<OrgDto> orgs, OrgDto org) {
OrgDto dept = null;
String parentId = org.getOrgParentId().toString();
......
package com.junmp.jyzb.utils;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.admin.indices.get.GetIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.List;
import java.util.Map;
@Slf4j
@Data
@AllArgsConstructor
@NoArgsConstructor(force = true)
public class ElasticsearchUtil {
@Resource
private RestHighLevelClient client;
/**
* 测试删除索引库
*/
public boolean deleteIndex(String name){
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(name);
boolean exists =false;
try {
AcknowledgedResponse delete = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
if (delete.isAcknowledged()){
return true;
}
} catch (IOException e) {
e.printStackTrace();
}
return exists;
}
/**
* 测试添加日志记录文档
*/
public boolean createDocument(String indexName,JSONObject jsonObject){
//组装数据
//创建请求
IndexRequest request = new IndexRequest(indexName);
//设置规则
request.timeout(TimeValue.timeValueSeconds(1));
//将数据放入请求对象里面
request.source(jsonObject);
try {
//发送请求 获取响应
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
RestStatus status = response.status();
if (status.equals(RestStatus.OK)){
return true;
}
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
/**
* 判断文档是否存在
* @param indexName 索引名称
* @param id 文档id
* @return
*/
public boolean documentIsExists(String indexName,String id){
GetRequest request = new GetRequest(indexName,id);
request.fetchSourceContext(new FetchSourceContext(false));
request.storedFields("_none_");
boolean exists = false;
try {
exists = client.exists(request, RequestOptions.DEFAULT);
} catch (IOException e) {
log.warn("判断文档是否存在异常: {}",e.getMessage());
e.printStackTrace();
}
return exists;
}
/**
* 根据id获取文档
* @param indexName 索引名称
* @param id 文档id
* @return
*/
public Map<String, Object> getDocument(String indexName, String id){
GetRequest request = new GetRequest(indexName,id);
try {
GetResponse documentFields = client.get(request, RequestOptions.DEFAULT);
return documentFields.getSource();
} catch (IOException e) {
log.warn("获取文档失败: {}",e.getMessage());
e.printStackTrace();
}
return null;
}
/**
* 根据文档id修改文档信息
* @param indexName 索引名称
* @param id 文档id
*/
public boolean updateDocument(String indexName,String id,JSONObject jsonObject){
UpdateRequest request = new UpdateRequest(indexName,id);
try {
request.timeout(TimeValue.timeValueSeconds(1));
request.doc(jsonObject,XContentType.JSON);
UpdateResponse update = client.update(request, RequestOptions.DEFAULT);
if (update.status().equals(RestStatus.OK)){
return true;
}
} catch (IOException e) {
log.warn("修改文档失败: {}",e.getMessage());
e.printStackTrace();
}
return false;
}
/**
* 删除文档
* @param indexName 索引名称
* @param id 文档id
*/
public boolean deleteDocument(String indexName,String id){
DeleteRequest request = new DeleteRequest(indexName,id);
try {
DeleteResponse delete = client.delete(request, RequestOptions.DEFAULT);
if (delete.status().equals(RestStatus.OK)){
return true;
}
}catch (IOException e){
log.warn("修改文档失败: {}",e.getMessage());
e.printStackTrace();
}
return false;
}
/**
* 批量插入文档数据
* @param indexName 索引
* @param list 批量文档
* @return
*/
public boolean bulkDocument(String indexName, List<JSONObject> list){
BulkRequest bulkRequest = new BulkRequest(indexName);
bulkRequest.timeout(TimeValue.timeValueSeconds(2));
try {
list.forEach(item->bulkRequest.add(new IndexRequest().source(item, XContentType.JSON)));
BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT);
if (bulk.status().equals(RestStatus.OK)){
return true;
}
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论