package com.linkwechat.wecom.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSONObject; import com.github.pagehelper.PageInfo; import com.linkwechat.common.constant.WeConstans; import com.linkwechat.common.core.domain.ConversationArchiveQuery; import com.linkwechat.common.core.elasticsearch.ElasticSearch; import com.linkwechat.common.core.page.PageDomain; import com.linkwechat.common.core.page.TableSupport; import com.linkwechat.common.utils.DateUtils; import com.linkwechat.common.utils.StringUtils; import com.linkwechat.wecom.service.IWeConversationArchiveService; import lombok.extern.slf4j.Slf4j; import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.builder.SearchSourceBuilder; import org.elasticsearch.search.sort.SortOrder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Date; import java.util.List; /** * @author sxw * @description 会话存档业务实现类 * @date 2020/12/19 14:00 **/ @Slf4j @Service public class WeConversationArchiveServiceImpl implements IWeConversationArchiveService { @Autowired private ElasticSearch elasticSearch; /** * 根据用户ID 获取对应内部联系人列表 * * @param query 入参 * @return */ @Override public PageInfo getChatContactList(ConversationArchiveQuery query) { PageDomain pageDomain = TableSupport.buildPageRequest(); Integer pageNum = pageDomain.getPageNum() == null ? 1 : pageDomain.getPageNum(); Integer pageSize = pageDomain.getPageSize() == null ? 10 : pageDomain.getPageSize(); SearchSourceBuilder builder = new SearchSourceBuilder(); int from = (pageNum - 1) * pageSize; builder.size(pageSize); builder.from(from); builder.sort("msgtime", SortOrder.DESC); BoolQueryBuilder fromBuilder = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("roomid", "")) .must(QueryBuilders.matchQuery("from", query.getFromId())) .must(QueryBuilders.matchQuery("tolist.keyword", query.getReceiveId())); BoolQueryBuilder toLsitBuilder = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("roomid", "")) .must(QueryBuilders.matchQuery("from", query.getReceiveId())) .must(QueryBuilders.matchQuery("tolist.keyword", query.getFromId())); //查询聊天类型 if (StringUtils.isNotEmpty(query.getMsgType())) { fromBuilder.must(QueryBuilders.termQuery("msgtype", query.getMsgType())); toLsitBuilder.must(QueryBuilders.termQuery("msgtype", query.getMsgType())); } BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery() .should(fromBuilder) .should(toLsitBuilder) .minimumShouldMatch(1); //时间范围查询 if (StringUtils.isNotEmpty(query.getBeginTime()) && StringUtils.isNotEmpty(query.getEndTime())) { Date beginTime = DateUtils.dateTime(query.getBeginTime(), DateUtils.YYYY_MM_DD); Date endTime = DateUtils.dateTime(query.getEndTime(), DateUtils.YYYY_MM_DD); boolQueryBuilder.filter(QueryBuilders.rangeQuery("msgtime").gte(beginTime).lte(endTime)); } builder.query(boolQueryBuilder); return elasticSearch.searchPage(WeConstans.WECOM_FINANCE_INDEX, builder, pageNum, pageSize, JSONObject.class); } @Override public PageInfo getChatRoomContactList(ConversationArchiveQuery query) { PageDomain pageDomain = TableSupport.buildPageRequest(); Integer pageNum = pageDomain.getPageNum() == null ? 1 : pageDomain.getPageNum(); Integer pageSize = pageDomain.getPageSize() == null ? 10 : pageDomain.getPageSize(); SearchSourceBuilder builder = new SearchSourceBuilder(); int from = (pageNum - 1) * pageSize; builder.size(pageSize); builder.from(from); builder.sort("msgtime", SortOrder.DESC); BoolQueryBuilder fromBuilder = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("roomid", query.getRoomId())) .must(QueryBuilders.matchQuery("from", query.getFromId())); BoolQueryBuilder roomidBuilder = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("roomid", query.getRoomId())) .must(QueryBuilders.matchQuery("tolist.keyword", query.getFromId())); //查询聊天类型 if (StringUtils.isNotEmpty(query.getMsgType())) { fromBuilder.must(QueryBuilders.termQuery("msgtype", query.getMsgType())); roomidBuilder.must(QueryBuilders.termQuery("msgtype", query.getMsgType())); } BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery() .should(fromBuilder) .should(roomidBuilder); //时间范围查询 if (StringUtils.isNotEmpty(query.getBeginTime()) && StringUtils.isNotEmpty(query.getEndTime())) { Date beginTime = DateUtils.dateTime(query.getBeginTime(), DateUtils.YYYY_MM_DD); Date endTime = DateUtils.dateTime(query.getEndTime(), DateUtils.YYYY_MM_DD); boolQueryBuilder.filter(QueryBuilders.rangeQuery("msgtime").gte(beginTime).lte(endTime)); } builder.query(boolQueryBuilder); return elasticSearch.searchPage(WeConstans.WECOM_FINANCE_INDEX, builder, pageNum, pageSize, JSONObject.class); } @Override public JSONObject getFinalChatContactInfo(String fromId, String receiveId) { SearchSourceBuilder builder = new SearchSourceBuilder(); builder.sort("msgtime", SortOrder.DESC); builder.size(1); BoolQueryBuilder fromBuilder = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("roomid", "")) .must(QueryBuilders.matchQuery("from", fromId)) .must(QueryBuilders.matchQuery("tolist.keyword", receiveId)); BoolQueryBuilder toLsitBuilder = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("roomid", "")) .must(QueryBuilders.matchQuery("from", receiveId)) .must(QueryBuilders.matchQuery("tolist.keyword", fromId)); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery() .should(fromBuilder) .should(toLsitBuilder) .minimumShouldMatch(1); builder.query(boolQueryBuilder); List resultList = elasticSearch.search(WeConstans.WECOM_FINANCE_INDEX, builder, JSONObject.class); if (CollectionUtil.isNotEmpty(resultList)) { return resultList.get(0); } else { return null; } } @Override public JSONObject getFinalChatRoomContactInfo(String fromId, String roomId) { SearchSourceBuilder builder = new SearchSourceBuilder(); builder.sort("msgtime", SortOrder.DESC); builder.size(1); BoolQueryBuilder fromBuilder = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("roomid", roomId)) .must(QueryBuilders.matchQuery("from", fromId)); BoolQueryBuilder roomidBuilder = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("roomid", roomId)) .must(QueryBuilders.matchQuery("tolist.keyword", fromId)); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery() .should(fromBuilder) .should(roomidBuilder); builder.query(boolQueryBuilder); List resultList = elasticSearch.search(WeConstans.WECOM_FINANCE_INDEX, builder, JSONObject.class); if (CollectionUtil.isNotEmpty(resultList)) { return resultList.get(0); } else { return null; } } }