From d0d85ead5209b101a6456f8a0f84f099055c357c Mon Sep 17 00:00:00 2001 From: "dengchao@xgtl" <2325690622@qq.com> Date: Wed, 15 Apr 2020 17:28:24 +0800 Subject: [PATCH] Replace Operator's package path --- .../com/chatopera/cc/controller/Handler.java | 1094 ++++++++--------- .../es/ContactsRepositoryImpl.java | 390 +++--- .../es/EntCustomerRepositoryImpl.java | 344 +++--- .../es/KbsTopicCommentRepositoryImpl.java | 214 ++-- .../es/KbsTopicRepositoryImpl.java | 300 +++-- .../es/QuickReplyRepositoryImpl.java | 434 ++++--- .../persistence/es/TopicRepositoryImpl.java | 314 +++-- .../com/chatopera/cc/util/es/SearchTools.java | 704 +++++------ 8 files changed, 1885 insertions(+), 1909 deletions(-) diff --git a/contact-center/app/src/main/java/com/chatopera/cc/controller/Handler.java b/contact-center/app/src/main/java/com/chatopera/cc/controller/Handler.java index 9a8fcbcf..b4e9857a 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/controller/Handler.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/controller/Handler.java @@ -1,549 +1,545 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018-2019 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.controller; - -import com.chatopera.cc.basic.Constants; -import com.chatopera.cc.basic.MainContext; -import com.chatopera.cc.basic.MainUtils; -import com.chatopera.cc.basic.Viewport; -import com.chatopera.cc.basic.auth.AuthToken; -import com.chatopera.cc.cache.Cache; -import com.chatopera.cc.controller.api.QueryParams; -import com.chatopera.cc.exception.CSKefuException; -import com.chatopera.cc.model.StreamingFile; -import com.chatopera.cc.model.SystemConfig; -import com.chatopera.cc.model.Tenant; -import com.chatopera.cc.model.User; -import com.chatopera.cc.persistence.blob.JpaBlobHelper; -import com.chatopera.cc.persistence.repository.StreamingFileRepository; -import com.chatopera.cc.persistence.repository.TenantRepository; -import org.apache.commons.lang.StringUtils; -import org.elasticsearch.index.query.BoolQueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.index.query.QueryStringQueryBuilder; -import org.elasticsearch.index.query.QueryStringQueryBuilder.Operator; -import org.elasticsearch.index.query.RangeQueryBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.ui.ModelMap; -import org.springframework.web.bind.annotation.SessionAttributes; -import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.servlet.ModelAndView; - -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import java.io.IOException; -import java.text.ParseException; -import java.util.Map; - -import static org.elasticsearch.index.query.QueryBuilders.termQuery; - - -@Controller -@SessionAttributes -public class Handler { - private static final Logger logger = LoggerFactory.getLogger(Handler.class); - - @Autowired - private TenantRepository tenantRes; - - @Autowired - private JpaBlobHelper jpaBlobHelper; - - @Autowired - private StreamingFileRepository streamingFileRes; - - @Autowired - private Cache cache; - - @Autowired - private AuthToken authToken; - - public final static int PAGE_SIZE_BG = 1; - public final static int PAGE_SIZE_TW = 20; - public final static int PAGE_SIZE_FV = 50; - public final static int PAGE_SIZE_HA = 100; - - private long starttime = System.currentTimeMillis(); - - public User getUser(HttpServletRequest request) { - User user = (User) request.getSession(true).getAttribute(Constants.USER_SESSION_NAME); - if (user == null) { - String authorization = request.getHeader("authorization"); - if (StringUtils.isBlank(authorization) && request.getCookies() != null) { - for (Cookie cookie : request.getCookies()) { - if (cookie.getName().equals("authorization")) { - authorization = cookie.getValue(); - break; - } - } - } - if (StringUtils.isNotBlank(authorization)) { - user = authToken.findUserByAuth(authorization); - } - if (user == null) { - user = new User(); - user.setId(MainUtils.getContextID(request.getSession().getId())); - user.setUsername(Constants.GUEST_USER + "_" + MainUtils.genIDByKey(user.getId())); - user.setOrgi(MainContext.SYSTEM_ORGI); - user.setSessionid(user.getId()); - } - } else { - user.setSessionid(MainUtils.getContextID(request.getSession().getId())); - } - return user; - } - - /** - * 构建ElasticSearch基于部门查询的Filter - * - * @param request - * @param boolQueryBuilder - * @return - * @throws CSKefuException - */ - public boolean esOrganFilter(final HttpServletRequest request, final BoolQueryBuilder boolQueryBuilder) throws CSKefuException { - // 组合部门条件 - User u = getUser(request); - if (u == null) { - throw new CSKefuException("[esOrganFilter] 未能获取到登录用户。"); - } else if (u.isAdmin()) { - // 管理员, 查看任何数据 - return true; - } else { - // 用户在部门中,通过部门过滤数据 -// String[] values = u.getAffiliates().toArray(new String[u.getAffiliates().size()]); -// boolQueryBuilder.filter(termsQuery("organ", values)); - // 不对contacts进行过滤,普通用户也可以查看该租户的任何数据 -// return true; - } - return true; - } - - /** - * @param queryBuilder - * @param request - */ - public BoolQueryBuilder search(BoolQueryBuilder queryBuilder, ModelMap map, HttpServletRequest request) { - queryBuilder.must(termQuery("orgi", this.getOrgi(request))); - - // 搜索框 - if (StringUtils.isNotBlank(request.getParameter("q"))) { - String q = request.getParameter("q"); - q = q.replaceAll("(OR|AND|NOT|:|\\(|\\))", ""); - if (StringUtils.isNotBlank(q)) { - queryBuilder.must( - QueryBuilders.boolQuery().must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND))); - map.put("q", q); - } - } - - // 筛选表单 - if (StringUtils.isNotBlank(request.getParameter("filterid"))) { - queryBuilder.must(termQuery("filterid", request.getParameter("filterid"))); - map.put("filterid", request.getParameter("filterid")); - } - - // 批次 - if (StringUtils.isNotBlank(request.getParameter("batid"))) { - queryBuilder.must(termQuery("batid", request.getParameter("batid"))); - map.put("batid", request.getParameter("batid")); - } - - // 活动 - if (StringUtils.isNotBlank(request.getParameter("actid"))) { - queryBuilder.must(termQuery("actid", request.getParameter("actid"))); - map.put("actid", request.getParameter("actid")); - } - - // 业务状态 - if (StringUtils.isNotBlank(request.getParameter("workstatus"))) { - queryBuilder.must(termQuery("workstatus", request.getParameter("workstatus"))); - map.put("workstatus", request.getParameter("workstatus")); - } - - // 拨打状态 - if (StringUtils.isNotBlank(request.getParameter("callstatus"))) { - queryBuilder.must(termQuery("callstatus", request.getParameter("callstatus"))); - map.put("callstatus", request.getParameter("callstatus")); - } - - // 预约状态 - if (StringUtils.isNotBlank(request.getParameter("apstatus"))) { - queryBuilder.must(termQuery("apstatus", request.getParameter("apstatus"))); - map.put("apstatus", request.getParameter("apstatus")); - } - - RangeQueryBuilder rangeQuery = null; - // 拨打时间区间查询 - if (StringUtils.isNotBlank(request.getParameter("callbegin")) || StringUtils.isNotBlank( - request.getParameter("callend"))) { - - if (StringUtils.isNotBlank(request.getParameter("callbegin"))) { - try { - - rangeQuery = QueryBuilders.rangeQuery("calltime").from( - MainUtils.dateFormate.parse(request.getParameter("callbegin")).getTime()); - } catch (ParseException e) { - - e.printStackTrace(); - } - } - if (StringUtils.isNotBlank(request.getParameter("callend"))) { - - try { - - if (rangeQuery == null) { - rangeQuery = QueryBuilders.rangeQuery("calltime").to( - MainUtils.dateFormate.parse(request.getParameter("callend")).getTime()); - } else { - rangeQuery.to(MainUtils.dateFormate.parse(request.getParameter("callend")).getTime()); - } - } catch (ParseException e) { - - e.printStackTrace(); - } - - } - map.put("callbegin", request.getParameter("callbegin")); - map.put("callend", request.getParameter("callend")); - } - // 预约时间区间查询 - if (StringUtils.isNotBlank(request.getParameter("apbegin")) || StringUtils.isNotBlank( - request.getParameter("apend"))) { - - if (StringUtils.isNotBlank(request.getParameter("apbegin"))) { - try { - - rangeQuery = QueryBuilders.rangeQuery("aptime").from( - MainUtils.dateFormate.parse(request.getParameter("apbegin")).getTime()); - } catch (ParseException e) { - - e.printStackTrace(); - } - } - if (StringUtils.isNotBlank(request.getParameter("apend"))) { - - try { - - if (rangeQuery == null) { - rangeQuery = QueryBuilders.rangeQuery("aptime").to( - MainUtils.dateFormate.parse(request.getParameter("apend")).getTime()); - } else { - rangeQuery.to(MainUtils.dateFormate.parse(request.getParameter("apend")).getTime()); - } - } catch (ParseException e) { - - e.printStackTrace(); - } - - - } - map.put("apbegin", request.getParameter("apbegin")); - map.put("apend", request.getParameter("apend")); - } - - if (rangeQuery != null) { - queryBuilder.must(rangeQuery); - } - - // 外呼任务id - if (StringUtils.isNotBlank(request.getParameter("taskid"))) { - queryBuilder.must(termQuery("taskid", request.getParameter("taskid"))); - map.put("taskid", request.getParameter("taskid")); - } - // 坐席 - if (StringUtils.isNotBlank(request.getParameter("owneruser"))) { - queryBuilder.must(termQuery("owneruser", request.getParameter("owneruser"))); - map.put("owneruser", request.getParameter("owneruser")); - } - // 部门 - if (StringUtils.isNotBlank(request.getParameter("ownerdept"))) { - queryBuilder.must(termQuery("ownerdept", request.getParameter("ownerdept"))); - map.put("ownerdept", request.getParameter("ownerdept")); - } - // 分配状态 - if (StringUtils.isNotBlank(request.getParameter("status"))) { - queryBuilder.must(termQuery("status", request.getParameter("status"))); - map.put("status", request.getParameter("status")); - } - - return queryBuilder; - } - - /** - * 创建或从HTTP会话中查找到访客的User对象,该对象不在数据库中,属于临时会话。 - * 这个User很可能是打开一个WebIM访客聊天控件,随机生成用户名,之后和Contact关联 - * 这个用户可能关联一个OnlineUser,如果开始给TA分配坐席 - * - * @param request - * @param userid - * @param nickname - * @return - */ - public User getIMUser(HttpServletRequest request, String userid, String nickname) { - User user = (User) request.getSession(true).getAttribute(Constants.IM_USER_SESSION_NAME); - if (user == null) { - user = new User(); - if (StringUtils.isNotBlank(userid)) { - user.setId(userid); - } else { - user.setId(MainUtils.getContextID(request.getSession().getId())); - } - if (StringUtils.isNotBlank(nickname)) { - user.setUsername(nickname); - } else { - Map sessionMessage = cache.findOneSystemMapByIdAndOrgi( - request.getSession().getId(), MainContext.SYSTEM_ORGI); - if (sessionMessage != null) { - String struname = sessionMessage.get("username"); - String strcname = sessionMessage.get("company_name"); - - user.setUsername(struname + "@" + strcname); - } else { - user.setUsername(Constants.GUEST_USER + "_" + MainUtils.genIDByKey(user.getId())); - } - } - user.setSessionid(user.getId()); - } else { - user.setSessionid(MainUtils.getContextID(request.getSession().getId())); - } - return user; - } - - public User getIMUser(HttpServletRequest request, String userid, String nickname, String sessionid) { - User user = (User) request.getSession(true).getAttribute(Constants.IM_USER_SESSION_NAME); - if (user == null) { - user = new User(); - if (StringUtils.isNotBlank(userid)) { - user.setId(userid); - } else { - user.setId(MainUtils.getContextID(request.getSession().getId())); - } - if (StringUtils.isNotBlank(nickname)) { - user.setUsername(nickname); - } else { - Map sessionMessage = cache.findOneSystemMapByIdAndOrgi( - sessionid, MainContext.SYSTEM_ORGI); - if (sessionMessage != null) { - String struname = sessionMessage.get("username"); - String strcname = sessionMessage.get("company_name"); - - user.setUsername(struname + "@" + strcname); - } else { - user.setUsername(Constants.GUEST_USER + "_" + MainUtils.genIDByKey(user.getId())); - } - } - user.setSessionid(user.getId()); - } else { - user.setSessionid(MainUtils.getContextID(request.getSession().getId())); - } - return user; - } - - public void setUser(HttpServletRequest request, User user) { - request.getSession(true).removeAttribute(Constants.USER_SESSION_NAME); - request.getSession(true).setAttribute(Constants.USER_SESSION_NAME, user); - } - - - /** - * 创建系统监控的 模板页面 - * - * @param page - * @return - */ - public Viewport createAdminTempletResponse(String page) { - return new Viewport("/admin/include/tpl", page); - } - - /** - * 创建系统监控的 模板页面 - * - * @param page - * @return - */ - public Viewport createAppsTempletResponse(String page) { - return new Viewport("/apps/include/tpl", page); - } - - /** - * 创建系统监控的 模板页面 - * - * @param page - * @return - */ - public Viewport createEntIMTempletResponse(final String page) { - return new Viewport("/apps/entim/include/tpl", page); - } - - public Viewport createRequestPageTempletResponse(final String page) { - return new Viewport(page); - } - - /** - * @param data - * @return - */ - public ModelAndView request(Viewport data) { - return new ModelAndView(data.getTemplet() != null ? data.getTemplet() : data.getPage(), "data", data); - } - - public int getP(HttpServletRequest request) { - int page = 0; - String p = request.getParameter("p"); - if (StringUtils.isNotBlank(p) && p.matches("[\\d]*")) { - page = Integer.parseInt(p); - if (page > 0) { - page = page - 1; - } - } - return page; - } - - public int getPs(HttpServletRequest request) { - int pagesize = PAGE_SIZE_TW; - String ps = request.getParameter("ps"); - if (StringUtils.isNotBlank(ps) && ps.matches("[\\d]*")) { - pagesize = Integer.parseInt(ps); - } - return pagesize; - } - - public int getP(QueryParams params) { - int page = 0; - if (params != null && StringUtils.isNotBlank(params.getP()) && params.getP().matches("[\\d]*")) { - page = Integer.parseInt(params.getP()); - if (page > 0) { - page = page - 1; - } - } - return page; - } - - public int getPs(QueryParams params) { - int pagesize = PAGE_SIZE_TW; - if (params != null && StringUtils.isNotBlank(params.getPs()) && params.getPs().matches("[\\d]*")) { - pagesize = Integer.parseInt(params.getPs()); - } - return pagesize; - } - - - public int get50Ps(HttpServletRequest request) { - int pagesize = PAGE_SIZE_FV; - String ps = request.getParameter("ps"); - if (StringUtils.isNotBlank(ps) && ps.matches("[\\d]*")) { - pagesize = Integer.parseInt(ps); - } - return pagesize; - } - - public String getOrgi(HttpServletRequest request) { - return getUser(request).getOrgi(); - } - - /** - * 机构id - * - * @param request - * @return - */ - public String getOrgid(HttpServletRequest request) { - User u = getUser(request); - return u.getOrgid(); - } - - public Tenant getTenant(HttpServletRequest request) { - return tenantRes.findById(getOrgi(request)); - } - - /** - * 根据是否租户共享获取orgi - * - * @param request - * @return - */ - public String getOrgiByTenantshare(HttpServletRequest request) { - SystemConfig systemConfig = MainUtils.getSystemConfig(); - if (systemConfig != null && systemConfig.isEnabletneant() && systemConfig.isTenantshare()) { - User user = this.getUser(request); - return user.getOrgid(); - } - return getOrgi(request); - } - - /** - * 判断是否租户共享 - * - * @return - */ - public boolean isTenantshare() { - SystemConfig systemConfig = MainUtils.getSystemConfig(); - return systemConfig != null && systemConfig.isEnabletneant() && systemConfig.isTenantshare(); - } - - /** - * 判断是否多租户 - * - * @return - */ - public boolean isEnabletneant() { - SystemConfig systemConfig = MainUtils.getSystemConfig(); - return systemConfig != null && systemConfig.isEnabletneant(); - } - - /** - * 判断是否多租户 - * - * @return - */ - public boolean isTenantconsole() { - SystemConfig systemConfig = MainUtils.getSystemConfig(); - return systemConfig != null && systemConfig.isEnabletneant() && systemConfig.isTenantconsole(); - } - - public long getStarttime() { - return starttime; - } - - public void setStarttime(long starttime) { - this.starttime = starttime; - } - - /** - * 使用Blob保存文件 - * - * @param multipart - * @return id - * @throws IOException - */ - public String saveImageFileWithMultipart(MultipartFile multipart) throws IOException { - StreamingFile sf = new StreamingFile(); - final String fileid = MainUtils.getUUID(); - sf.setId(fileid); - sf.setMime(multipart.getContentType()); - sf.setData(jpaBlobHelper.createBlob(multipart.getInputStream(), multipart.getSize())); - sf.setName(multipart.getOriginalFilename()); - streamingFileRes.save(sf); - return fileid; - } - - -} +/* + * Copyright (C) 2017 优客服-多渠道客服系统 + * Modifications copyright (C) 2018-2019 Chatopera Inc, + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chatopera.cc.controller; + +import com.chatopera.cc.basic.Constants; +import com.chatopera.cc.basic.MainContext; +import com.chatopera.cc.basic.MainUtils; +import com.chatopera.cc.basic.Viewport; +import com.chatopera.cc.basic.auth.AuthToken; +import com.chatopera.cc.cache.Cache; +import com.chatopera.cc.controller.api.QueryParams; +import com.chatopera.cc.exception.CSKefuException; +import com.chatopera.cc.model.StreamingFile; +import com.chatopera.cc.model.SystemConfig; +import com.chatopera.cc.model.Tenant; +import com.chatopera.cc.model.User; +import com.chatopera.cc.persistence.blob.JpaBlobHelper; +import com.chatopera.cc.persistence.repository.StreamingFileRepository; +import com.chatopera.cc.persistence.repository.TenantRepository; +import org.apache.commons.lang.StringUtils; +import org.elasticsearch.index.query.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.SessionAttributes; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.text.ParseException; +import java.util.Map; + +import static org.elasticsearch.index.query.QueryBuilders.termQuery; + + +@Controller +@SessionAttributes +public class Handler { + private static final Logger logger = LoggerFactory.getLogger(Handler.class); + + @Autowired + private TenantRepository tenantRes; + + @Autowired + private JpaBlobHelper jpaBlobHelper; + + @Autowired + private StreamingFileRepository streamingFileRes; + + @Autowired + private Cache cache; + + @Autowired + private AuthToken authToken; + + public final static int PAGE_SIZE_BG = 1; + public final static int PAGE_SIZE_TW = 20; + public final static int PAGE_SIZE_FV = 50; + public final static int PAGE_SIZE_HA = 100; + + private long starttime = System.currentTimeMillis(); + + public User getUser(HttpServletRequest request) { + User user = (User) request.getSession(true).getAttribute(Constants.USER_SESSION_NAME); + if (user == null) { + String authorization = request.getHeader("authorization"); + if (StringUtils.isBlank(authorization) && request.getCookies() != null) { + for (Cookie cookie : request.getCookies()) { + if (cookie.getName().equals("authorization")) { + authorization = cookie.getValue(); + break; + } + } + } + if (StringUtils.isNotBlank(authorization)) { + user = authToken.findUserByAuth(authorization); + } + if (user == null) { + user = new User(); + user.setId(MainUtils.getContextID(request.getSession().getId())); + user.setUsername(Constants.GUEST_USER + "_" + MainUtils.genIDByKey(user.getId())); + user.setOrgi(MainContext.SYSTEM_ORGI); + user.setSessionid(user.getId()); + } + } else { + user.setSessionid(MainUtils.getContextID(request.getSession().getId())); + } + return user; + } + + /** + * 构建ElasticSearch基于部门查询的Filter + * + * @param request + * @param boolQueryBuilder + * @return + * @throws CSKefuException + */ + public boolean esOrganFilter(final HttpServletRequest request, final BoolQueryBuilder boolQueryBuilder) throws CSKefuException { + // 组合部门条件 + User u = getUser(request); + if (u == null) { + throw new CSKefuException("[esOrganFilter] 未能获取到登录用户。"); + } else if (u.isAdmin()) { + // 管理员, 查看任何数据 + return true; + } else { + // 用户在部门中,通过部门过滤数据 +// String[] values = u.getAffiliates().toArray(new String[u.getAffiliates().size()]); +// boolQueryBuilder.filter(termsQuery("organ", values)); + // 不对contacts进行过滤,普通用户也可以查看该租户的任何数据 +// return true; + } + return true; + } + + /** + * @param queryBuilder + * @param request + */ + public BoolQueryBuilder search(BoolQueryBuilder queryBuilder, ModelMap map, HttpServletRequest request) { + queryBuilder.must(termQuery("orgi", this.getOrgi(request))); + + // 搜索框 + if (StringUtils.isNotBlank(request.getParameter("q"))) { + String q = request.getParameter("q"); + q = q.replaceAll("(OR|AND|NOT|:|\\(|\\))", ""); + if (StringUtils.isNotBlank(q)) { + queryBuilder.must( + QueryBuilders.boolQuery().must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND))); + map.put("q", q); + } + } + + // 筛选表单 + if (StringUtils.isNotBlank(request.getParameter("filterid"))) { + queryBuilder.must(termQuery("filterid", request.getParameter("filterid"))); + map.put("filterid", request.getParameter("filterid")); + } + + // 批次 + if (StringUtils.isNotBlank(request.getParameter("batid"))) { + queryBuilder.must(termQuery("batid", request.getParameter("batid"))); + map.put("batid", request.getParameter("batid")); + } + + // 活动 + if (StringUtils.isNotBlank(request.getParameter("actid"))) { + queryBuilder.must(termQuery("actid", request.getParameter("actid"))); + map.put("actid", request.getParameter("actid")); + } + + // 业务状态 + if (StringUtils.isNotBlank(request.getParameter("workstatus"))) { + queryBuilder.must(termQuery("workstatus", request.getParameter("workstatus"))); + map.put("workstatus", request.getParameter("workstatus")); + } + + // 拨打状态 + if (StringUtils.isNotBlank(request.getParameter("callstatus"))) { + queryBuilder.must(termQuery("callstatus", request.getParameter("callstatus"))); + map.put("callstatus", request.getParameter("callstatus")); + } + + // 预约状态 + if (StringUtils.isNotBlank(request.getParameter("apstatus"))) { + queryBuilder.must(termQuery("apstatus", request.getParameter("apstatus"))); + map.put("apstatus", request.getParameter("apstatus")); + } + + RangeQueryBuilder rangeQuery = null; + // 拨打时间区间查询 + if (StringUtils.isNotBlank(request.getParameter("callbegin")) || StringUtils.isNotBlank( + request.getParameter("callend"))) { + + if (StringUtils.isNotBlank(request.getParameter("callbegin"))) { + try { + + rangeQuery = QueryBuilders.rangeQuery("calltime").from( + MainUtils.dateFormate.parse(request.getParameter("callbegin")).getTime()); + } catch (ParseException e) { + + e.printStackTrace(); + } + } + if (StringUtils.isNotBlank(request.getParameter("callend"))) { + + try { + + if (rangeQuery == null) { + rangeQuery = QueryBuilders.rangeQuery("calltime").to( + MainUtils.dateFormate.parse(request.getParameter("callend")).getTime()); + } else { + rangeQuery.to(MainUtils.dateFormate.parse(request.getParameter("callend")).getTime()); + } + } catch (ParseException e) { + + e.printStackTrace(); + } + + } + map.put("callbegin", request.getParameter("callbegin")); + map.put("callend", request.getParameter("callend")); + } + // 预约时间区间查询 + if (StringUtils.isNotBlank(request.getParameter("apbegin")) || StringUtils.isNotBlank( + request.getParameter("apend"))) { + + if (StringUtils.isNotBlank(request.getParameter("apbegin"))) { + try { + + rangeQuery = QueryBuilders.rangeQuery("aptime").from( + MainUtils.dateFormate.parse(request.getParameter("apbegin")).getTime()); + } catch (ParseException e) { + + e.printStackTrace(); + } + } + if (StringUtils.isNotBlank(request.getParameter("apend"))) { + + try { + + if (rangeQuery == null) { + rangeQuery = QueryBuilders.rangeQuery("aptime").to( + MainUtils.dateFormate.parse(request.getParameter("apend")).getTime()); + } else { + rangeQuery.to(MainUtils.dateFormate.parse(request.getParameter("apend")).getTime()); + } + } catch (ParseException e) { + + e.printStackTrace(); + } + + + } + map.put("apbegin", request.getParameter("apbegin")); + map.put("apend", request.getParameter("apend")); + } + + if (rangeQuery != null) { + queryBuilder.must(rangeQuery); + } + + // 外呼任务id + if (StringUtils.isNotBlank(request.getParameter("taskid"))) { + queryBuilder.must(termQuery("taskid", request.getParameter("taskid"))); + map.put("taskid", request.getParameter("taskid")); + } + // 坐席 + if (StringUtils.isNotBlank(request.getParameter("owneruser"))) { + queryBuilder.must(termQuery("owneruser", request.getParameter("owneruser"))); + map.put("owneruser", request.getParameter("owneruser")); + } + // 部门 + if (StringUtils.isNotBlank(request.getParameter("ownerdept"))) { + queryBuilder.must(termQuery("ownerdept", request.getParameter("ownerdept"))); + map.put("ownerdept", request.getParameter("ownerdept")); + } + // 分配状态 + if (StringUtils.isNotBlank(request.getParameter("status"))) { + queryBuilder.must(termQuery("status", request.getParameter("status"))); + map.put("status", request.getParameter("status")); + } + + return queryBuilder; + } + + /** + * 创建或从HTTP会话中查找到访客的User对象,该对象不在数据库中,属于临时会话。 + * 这个User很可能是打开一个WebIM访客聊天控件,随机生成用户名,之后和Contact关联 + * 这个用户可能关联一个OnlineUser,如果开始给TA分配坐席 + * + * @param request + * @param userid + * @param nickname + * @return + */ + public User getIMUser(HttpServletRequest request, String userid, String nickname) { + User user = (User) request.getSession(true).getAttribute(Constants.IM_USER_SESSION_NAME); + if (user == null) { + user = new User(); + if (StringUtils.isNotBlank(userid)) { + user.setId(userid); + } else { + user.setId(MainUtils.getContextID(request.getSession().getId())); + } + if (StringUtils.isNotBlank(nickname)) { + user.setUsername(nickname); + } else { + Map sessionMessage = cache.findOneSystemMapByIdAndOrgi( + request.getSession().getId(), MainContext.SYSTEM_ORGI); + if (sessionMessage != null) { + String struname = sessionMessage.get("username"); + String strcname = sessionMessage.get("company_name"); + + user.setUsername(struname + "@" + strcname); + } else { + user.setUsername(Constants.GUEST_USER + "_" + MainUtils.genIDByKey(user.getId())); + } + } + user.setSessionid(user.getId()); + } else { + user.setSessionid(MainUtils.getContextID(request.getSession().getId())); + } + return user; + } + + public User getIMUser(HttpServletRequest request, String userid, String nickname, String sessionid) { + User user = (User) request.getSession(true).getAttribute(Constants.IM_USER_SESSION_NAME); + if (user == null) { + user = new User(); + if (StringUtils.isNotBlank(userid)) { + user.setId(userid); + } else { + user.setId(MainUtils.getContextID(request.getSession().getId())); + } + if (StringUtils.isNotBlank(nickname)) { + user.setUsername(nickname); + } else { + Map sessionMessage = cache.findOneSystemMapByIdAndOrgi( + sessionid, MainContext.SYSTEM_ORGI); + if (sessionMessage != null) { + String struname = sessionMessage.get("username"); + String strcname = sessionMessage.get("company_name"); + + user.setUsername(struname + "@" + strcname); + } else { + user.setUsername(Constants.GUEST_USER + "_" + MainUtils.genIDByKey(user.getId())); + } + } + user.setSessionid(user.getId()); + } else { + user.setSessionid(MainUtils.getContextID(request.getSession().getId())); + } + return user; + } + + public void setUser(HttpServletRequest request, User user) { + request.getSession(true).removeAttribute(Constants.USER_SESSION_NAME); + request.getSession(true).setAttribute(Constants.USER_SESSION_NAME, user); + } + + + /** + * 创建系统监控的 模板页面 + * + * @param page + * @return + */ + public Viewport createAdminTempletResponse(String page) { + return new Viewport("/admin/include/tpl", page); + } + + /** + * 创建系统监控的 模板页面 + * + * @param page + * @return + */ + public Viewport createAppsTempletResponse(String page) { + return new Viewport("/apps/include/tpl", page); + } + + /** + * 创建系统监控的 模板页面 + * + * @param page + * @return + */ + public Viewport createEntIMTempletResponse(final String page) { + return new Viewport("/apps/entim/include/tpl", page); + } + + public Viewport createRequestPageTempletResponse(final String page) { + return new Viewport(page); + } + + /** + * @param data + * @return + */ + public ModelAndView request(Viewport data) { + return new ModelAndView(data.getTemplet() != null ? data.getTemplet() : data.getPage(), "data", data); + } + + public int getP(HttpServletRequest request) { + int page = 0; + String p = request.getParameter("p"); + if (StringUtils.isNotBlank(p) && p.matches("[\\d]*")) { + page = Integer.parseInt(p); + if (page > 0) { + page = page - 1; + } + } + return page; + } + + public int getPs(HttpServletRequest request) { + int pagesize = PAGE_SIZE_TW; + String ps = request.getParameter("ps"); + if (StringUtils.isNotBlank(ps) && ps.matches("[\\d]*")) { + pagesize = Integer.parseInt(ps); + } + return pagesize; + } + + public int getP(QueryParams params) { + int page = 0; + if (params != null && StringUtils.isNotBlank(params.getP()) && params.getP().matches("[\\d]*")) { + page = Integer.parseInt(params.getP()); + if (page > 0) { + page = page - 1; + } + } + return page; + } + + public int getPs(QueryParams params) { + int pagesize = PAGE_SIZE_TW; + if (params != null && StringUtils.isNotBlank(params.getPs()) && params.getPs().matches("[\\d]*")) { + pagesize = Integer.parseInt(params.getPs()); + } + return pagesize; + } + + + public int get50Ps(HttpServletRequest request) { + int pagesize = PAGE_SIZE_FV; + String ps = request.getParameter("ps"); + if (StringUtils.isNotBlank(ps) && ps.matches("[\\d]*")) { + pagesize = Integer.parseInt(ps); + } + return pagesize; + } + + public String getOrgi(HttpServletRequest request) { + return getUser(request).getOrgi(); + } + + /** + * 机构id + * + * @param request + * @return + */ + public String getOrgid(HttpServletRequest request) { + User u = getUser(request); + return u.getOrgid(); + } + + public Tenant getTenant(HttpServletRequest request) { + return tenantRes.findById(getOrgi(request)); + } + + /** + * 根据是否租户共享获取orgi + * + * @param request + * @return + */ + public String getOrgiByTenantshare(HttpServletRequest request) { + SystemConfig systemConfig = MainUtils.getSystemConfig(); + if (systemConfig != null && systemConfig.isEnabletneant() && systemConfig.isTenantshare()) { + User user = this.getUser(request); + return user.getOrgid(); + } + return getOrgi(request); + } + + /** + * 判断是否租户共享 + * + * @return + */ + public boolean isTenantshare() { + SystemConfig systemConfig = MainUtils.getSystemConfig(); + return systemConfig != null && systemConfig.isEnabletneant() && systemConfig.isTenantshare(); + } + + /** + * 判断是否多租户 + * + * @return + */ + public boolean isEnabletneant() { + SystemConfig systemConfig = MainUtils.getSystemConfig(); + return systemConfig != null && systemConfig.isEnabletneant(); + } + + /** + * 判断是否多租户 + * + * @return + */ + public boolean isTenantconsole() { + SystemConfig systemConfig = MainUtils.getSystemConfig(); + return systemConfig != null && systemConfig.isEnabletneant() && systemConfig.isTenantconsole(); + } + + public long getStarttime() { + return starttime; + } + + public void setStarttime(long starttime) { + this.starttime = starttime; + } + + /** + * 使用Blob保存文件 + * + * @param multipart + * @return id + * @throws IOException + */ + public String saveImageFileWithMultipart(MultipartFile multipart) throws IOException { + StreamingFile sf = new StreamingFile(); + final String fileid = MainUtils.getUUID(); + sf.setId(fileid); + sf.setMime(multipart.getContentType()); + sf.setData(jpaBlobHelper.createBlob(multipart.getInputStream(), multipart.getSize())); + sf.setName(multipart.getOriginalFilename()); + streamingFileRes.save(sf); + return fileid; + } + + +} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/ContactsRepositoryImpl.java b/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/ContactsRepositoryImpl.java index e474ca05..86c77377 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/ContactsRepositoryImpl.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/ContactsRepositoryImpl.java @@ -1,197 +1,193 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018-2019 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.persistence.es; - -import com.chatopera.cc.model.Contacts; -import com.chatopera.cc.model.User; -import com.chatopera.cc.persistence.repository.UserRepository; -import org.apache.commons.lang.StringUtils; -import org.elasticsearch.index.query.BoolQueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.index.query.QueryStringQueryBuilder; -import org.elasticsearch.index.query.QueryStringQueryBuilder.Operator; -import org.elasticsearch.index.query.RangeQueryBuilder; -import org.elasticsearch.search.sort.FieldSortBuilder; -import org.elasticsearch.search.sort.SortOrder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; -import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import static org.elasticsearch.index.query.QueryBuilders.termQuery; - -@Component -public class ContactsRepositoryImpl implements ContactsEsCommonRepository { - @Autowired - private UserRepository userRes; - - private ElasticsearchTemplate elasticsearchTemplate; - - @Autowired - public void setElasticsearchTemplate(ElasticsearchTemplate elasticsearchTemplate) { - this.elasticsearchTemplate = elasticsearchTemplate; - } - - @Override - public Page findByCreaterAndSharesAndOrgi(String creater, String shares, String orgi, boolean includeDeleteData, String q, Pageable page) { - - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - BoolQueryBuilder boolQueryBuilder1 = new BoolQueryBuilder(); - boolQueryBuilder1.should(termQuery("creater", creater)); - boolQueryBuilder1.should(termQuery("shares", creater)); - boolQueryBuilder1.should(termQuery("shares", "all")); - boolQueryBuilder.must(boolQueryBuilder1); - boolQueryBuilder.must(termQuery("orgi", orgi)); - if (includeDeleteData) { - boolQueryBuilder.must(termQuery("datastatus", true)); - } else { - boolQueryBuilder.must(termQuery("datastatus", false)); - } - if (StringUtils.isNotBlank(q)) { - boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)); - } - return processQuery(boolQueryBuilder, page); - } - - @Override - public Page findByCreaterAndSharesAndOrgi(String creater, - String shares, String orgi, Date begin, Date end, boolean includeDeleteData, - BoolQueryBuilder boolQueryBuilder, String q, Pageable page) { - BoolQueryBuilder boolQueryBuilder1 = new BoolQueryBuilder(); - boolQueryBuilder1.should(termQuery("creater", creater)); - boolQueryBuilder1.should(termQuery("shares", creater)); - boolQueryBuilder1.should(termQuery("shares", "all")); - boolQueryBuilder.must(boolQueryBuilder1); - boolQueryBuilder.must(termQuery("orgi", orgi)); - if (includeDeleteData) { - boolQueryBuilder.must(termQuery("datastatus", true)); - } else { - boolQueryBuilder.must(termQuery("datastatus", false)); - } - RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("createtime"); - if (begin != null) { - rangeQuery.from(begin.getTime()); - } - if (end != null) { - rangeQuery.to(end.getTime()); - } else { - rangeQuery.to(new Date().getTime()); - } - if (begin != null || end != null) { - boolQueryBuilder.must(rangeQuery); - } - if (StringUtils.isNotBlank(q)) { - boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)); - } - return processQuery(boolQueryBuilder, page); - } - - @Override - public Page findByOrgi(String orgi, boolean includeDeleteData, - String q, Pageable page) { - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - boolQueryBuilder.must(termQuery("orgi", orgi)); - if (includeDeleteData) { - boolQueryBuilder.must(termQuery("datastatus", true)); - } else { - boolQueryBuilder.must(termQuery("datastatus", false)); - } - if (StringUtils.isNotBlank(q)) { - boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)); - } - return processQuery(boolQueryBuilder, page); - } - - @Override - public Page findByCreaterAndSharesAndOrgi(String creater, String shares, String orgi, Date begin, Date end, boolean includeDeleteData, String q, Pageable page) { - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - BoolQueryBuilder boolQueryBuilder1 = new BoolQueryBuilder(); - boolQueryBuilder1.should(termQuery("creater", creater)); - boolQueryBuilder1.should(termQuery("shares", creater)); - boolQueryBuilder1.should(termQuery("shares", "all")); - boolQueryBuilder.must(boolQueryBuilder1); - boolQueryBuilder.must(termQuery("orgi", orgi)); - if (includeDeleteData) { - boolQueryBuilder.must(termQuery("datastatus", true)); - } else { - boolQueryBuilder.must(termQuery("datastatus", false)); - } - RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("createtime"); - if (begin != null) { - rangeQuery.from(begin.getTime()); - } - if (end != null) { - rangeQuery.to(end.getTime()); - } else { - rangeQuery.to(new Date().getTime()); - } - if (begin != null || end != null) { - boolQueryBuilder.must(rangeQuery); - } - if (StringUtils.isNotBlank(q)) { - boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)); - } - return processQuery(boolQueryBuilder, page); - } - - - private Page processQuery(BoolQueryBuilder boolQueryBuilder, Pageable page) { - NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withSort(new FieldSortBuilder("creater").unmappedType("boolean").order(SortOrder.DESC)).withSort(new FieldSortBuilder("name").unmappedType("string").order(SortOrder.DESC)); - - searchQueryBuilder.withPageable(page); - - Page entCustomerList = null; - if (elasticsearchTemplate.indexExists(Contacts.class)) { - entCustomerList = elasticsearchTemplate.queryForPage(searchQueryBuilder.build(), Contacts.class); - } - if (entCustomerList.getContent().size() > 0) { - List ids = new ArrayList(); - for (Contacts contacts : entCustomerList.getContent()) { - if (contacts.getCreater() != null && ids.size() < 1024) { - ids.add(contacts.getCreater()); - } - } - List users = userRes.findAll(ids); - for (Contacts contacts : entCustomerList.getContent()) { - for (User user : users) { - if (user.getId().equals(contacts.getCreater())) { - contacts.setUser(user); - break; - } - } - } - } - return entCustomerList; - } - - @Override - public Page findByDataAndOrgi(String orgi, String q, Pageable page) { - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - boolQueryBuilder.must(termQuery("datastatus", false)); - boolQueryBuilder.must(termQuery("orgi", orgi)); - if (StringUtils.isNotBlank(q)) { - boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)); - } - return processQuery(boolQueryBuilder, page); - } -} +/* + * Copyright (C) 2017 优客服-多渠道客服系统 + * Modifications copyright (C) 2018-2019 Chatopera Inc, + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chatopera.cc.persistence.es; + +import com.chatopera.cc.model.Contacts; +import com.chatopera.cc.model.User; +import com.chatopera.cc.persistence.repository.UserRepository; +import org.apache.commons.lang.StringUtils; +import org.elasticsearch.index.query.*; +import org.elasticsearch.search.sort.FieldSortBuilder; +import org.elasticsearch.search.sort.SortOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import static org.elasticsearch.index.query.QueryBuilders.termQuery; + +@Component +public class ContactsRepositoryImpl implements ContactsEsCommonRepository { + @Autowired + private UserRepository userRes; + + private ElasticsearchTemplate elasticsearchTemplate; + + @Autowired + public void setElasticsearchTemplate(ElasticsearchTemplate elasticsearchTemplate) { + this.elasticsearchTemplate = elasticsearchTemplate; + } + + @Override + public Page findByCreaterAndSharesAndOrgi(String creater, String shares, String orgi, boolean includeDeleteData, String q, Pageable page) { + + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + BoolQueryBuilder boolQueryBuilder1 = new BoolQueryBuilder(); + boolQueryBuilder1.should(termQuery("creater", creater)); + boolQueryBuilder1.should(termQuery("shares", creater)); + boolQueryBuilder1.should(termQuery("shares", "all")); + boolQueryBuilder.must(boolQueryBuilder1); + boolQueryBuilder.must(termQuery("orgi", orgi)); + if (includeDeleteData) { + boolQueryBuilder.must(termQuery("datastatus", true)); + } else { + boolQueryBuilder.must(termQuery("datastatus", false)); + } + if (StringUtils.isNotBlank(q)) { + boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)); + } + return processQuery(boolQueryBuilder, page); + } + + @Override + public Page findByCreaterAndSharesAndOrgi(String creater, + String shares, String orgi, Date begin, Date end, boolean includeDeleteData, + BoolQueryBuilder boolQueryBuilder, String q, Pageable page) { + BoolQueryBuilder boolQueryBuilder1 = new BoolQueryBuilder(); + boolQueryBuilder1.should(termQuery("creater", creater)); + boolQueryBuilder1.should(termQuery("shares", creater)); + boolQueryBuilder1.should(termQuery("shares", "all")); + boolQueryBuilder.must(boolQueryBuilder1); + boolQueryBuilder.must(termQuery("orgi", orgi)); + if (includeDeleteData) { + boolQueryBuilder.must(termQuery("datastatus", true)); + } else { + boolQueryBuilder.must(termQuery("datastatus", false)); + } + RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("createtime"); + if (begin != null) { + rangeQuery.from(begin.getTime()); + } + if (end != null) { + rangeQuery.to(end.getTime()); + } else { + rangeQuery.to(new Date().getTime()); + } + if (begin != null || end != null) { + boolQueryBuilder.must(rangeQuery); + } + if (StringUtils.isNotBlank(q)) { + boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)); + } + return processQuery(boolQueryBuilder, page); + } + + @Override + public Page findByOrgi(String orgi, boolean includeDeleteData, + String q, Pageable page) { + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + boolQueryBuilder.must(termQuery("orgi", orgi)); + if (includeDeleteData) { + boolQueryBuilder.must(termQuery("datastatus", true)); + } else { + boolQueryBuilder.must(termQuery("datastatus", false)); + } + if (StringUtils.isNotBlank(q)) { + boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)); + } + return processQuery(boolQueryBuilder, page); + } + + @Override + public Page findByCreaterAndSharesAndOrgi(String creater, String shares, String orgi, Date begin, Date end, boolean includeDeleteData, String q, Pageable page) { + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + BoolQueryBuilder boolQueryBuilder1 = new BoolQueryBuilder(); + boolQueryBuilder1.should(termQuery("creater", creater)); + boolQueryBuilder1.should(termQuery("shares", creater)); + boolQueryBuilder1.should(termQuery("shares", "all")); + boolQueryBuilder.must(boolQueryBuilder1); + boolQueryBuilder.must(termQuery("orgi", orgi)); + if (includeDeleteData) { + boolQueryBuilder.must(termQuery("datastatus", true)); + } else { + boolQueryBuilder.must(termQuery("datastatus", false)); + } + RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("createtime"); + if (begin != null) { + rangeQuery.from(begin.getTime()); + } + if (end != null) { + rangeQuery.to(end.getTime()); + } else { + rangeQuery.to(new Date().getTime()); + } + if (begin != null || end != null) { + boolQueryBuilder.must(rangeQuery); + } + if (StringUtils.isNotBlank(q)) { + boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)); + } + return processQuery(boolQueryBuilder, page); + } + + + private Page processQuery(BoolQueryBuilder boolQueryBuilder, Pageable page) { + NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withSort(new FieldSortBuilder("creater").unmappedType("boolean").order(SortOrder.DESC)).withSort(new FieldSortBuilder("name").unmappedType("string").order(SortOrder.DESC)); + + searchQueryBuilder.withPageable(page); + + Page entCustomerList = null; + if (elasticsearchTemplate.indexExists(Contacts.class)) { + entCustomerList = elasticsearchTemplate.queryForPage(searchQueryBuilder.build(), Contacts.class); + } + if (entCustomerList.getContent().size() > 0) { + List ids = new ArrayList(); + for (Contacts contacts : entCustomerList.getContent()) { + if (contacts.getCreater() != null && ids.size() < 1024) { + ids.add(contacts.getCreater()); + } + } + List users = userRes.findAll(ids); + for (Contacts contacts : entCustomerList.getContent()) { + for (User user : users) { + if (user.getId().equals(contacts.getCreater())) { + contacts.setUser(user); + break; + } + } + } + } + return entCustomerList; + } + + @Override + public Page findByDataAndOrgi(String orgi, String q, Pageable page) { + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + boolQueryBuilder.must(termQuery("datastatus", false)); + boolQueryBuilder.must(termQuery("orgi", orgi)); + if (StringUtils.isNotBlank(q)) { + boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)); + } + return processQuery(boolQueryBuilder, page); + } +} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/EntCustomerRepositoryImpl.java b/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/EntCustomerRepositoryImpl.java index 75efb437..03ceb00e 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/EntCustomerRepositoryImpl.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/EntCustomerRepositoryImpl.java @@ -1,174 +1,170 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018-2019 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.persistence.es; - -import com.chatopera.cc.model.EntCustomer; -import com.chatopera.cc.model.User; -import com.chatopera.cc.persistence.repository.UserRepository; -import org.apache.commons.lang.StringUtils; -import org.elasticsearch.index.query.BoolQueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.index.query.QueryStringQueryBuilder; -import org.elasticsearch.index.query.QueryStringQueryBuilder.Operator; -import org.elasticsearch.index.query.RangeQueryBuilder; -import org.elasticsearch.search.sort.FieldSortBuilder; -import org.elasticsearch.search.sort.SortOrder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; -import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; -import org.springframework.stereotype.Repository; - -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import static org.elasticsearch.index.query.QueryBuilders.termQuery; - -@Repository -public class EntCustomerRepositoryImpl implements EntCustomerEsCommonRepository{ - - private SimpleDateFormat dateFromate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ; - - @Autowired - private UserRepository userRes ; - - private ElasticsearchTemplate elasticsearchTemplate; - - @Autowired - public void setElasticsearchTemplate(ElasticsearchTemplate elasticsearchTemplate) { - this.elasticsearchTemplate = elasticsearchTemplate; - } - - @Override - public Page findByCreaterAndSharesAndOrgi(String creater, String shares ,String orgi, boolean includeDeleteData ,String q , Pageable page) { - - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - BoolQueryBuilder boolQueryBuilder1 = new BoolQueryBuilder(); - boolQueryBuilder1.should(termQuery("creater" , creater)) ; - boolQueryBuilder1.should(termQuery("shares" , creater)) ; - boolQueryBuilder1.should(termQuery("shares" , "all")) ; - boolQueryBuilder.must(boolQueryBuilder1) ; - boolQueryBuilder.must(termQuery("orgi" , orgi)) ; - if(includeDeleteData){ - boolQueryBuilder.must(termQuery("datastatus" , true)) ; - }else{ - boolQueryBuilder.must(termQuery("datastatus" , false)) ; - } - if(!StringUtils.isBlank(q)){ - boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; - } - return processQuery(boolQueryBuilder , page); - } - - @Override - public Page findByCreaterAndSharesAndOrgi(String creater, - String shares,String orgi, Date begin, Date end, boolean includeDeleteData, - BoolQueryBuilder boolQueryBuilder , String q, Pageable page) { - BoolQueryBuilder boolQueryBuilder1 = new BoolQueryBuilder(); - boolQueryBuilder1.should(termQuery("creater" , creater)) ; - boolQueryBuilder1.should(termQuery("shares" , creater)) ; - boolQueryBuilder1.should(termQuery("shares" , "all")) ; - boolQueryBuilder.must(boolQueryBuilder1) ; - boolQueryBuilder.must(termQuery("orgi" , orgi)) ; - if(includeDeleteData){ - boolQueryBuilder.must(termQuery("datastatus" , true)) ; - }else{ - boolQueryBuilder.must(termQuery("datastatus" , false)) ; - } - RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("createtime") ; - if(begin!=null){ - rangeQuery.from(begin.getTime()) ; - } - if(end!=null){ - rangeQuery.to(end.getTime()) ; - }else{ - rangeQuery.to(new Date().getTime()) ; - } - if(begin!=null || end!=null){ - boolQueryBuilder.must(rangeQuery) ; - } - if(!StringUtils.isBlank(q)){ - boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; - } - return processQuery(boolQueryBuilder , page); - } - - @Override - public Page findByCreaterAndSharesAndOrgi(String creater,String shares,String orgi, Date begin, Date end, boolean includeDeleteData,String q, Pageable page) { - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - BoolQueryBuilder boolQueryBuilder1 = new BoolQueryBuilder(); - boolQueryBuilder1.should(termQuery("creater" , creater)) ; - boolQueryBuilder1.should(termQuery("shares" , creater)) ; - boolQueryBuilder1.should(termQuery("shares" , "all")) ; - boolQueryBuilder.must(boolQueryBuilder1) ; - boolQueryBuilder.must(termQuery("orgi" , orgi)) ; - if(includeDeleteData){ - boolQueryBuilder.must(termQuery("datastatus" , true)) ; - }else{ - boolQueryBuilder.must(termQuery("datastatus" , false)) ; - } - RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("createtime") ; - if(begin!=null){ - rangeQuery.from(dateFromate.format(begin)) ; - } - if(end!=null){ - rangeQuery.to(dateFromate.format(end)) ; - }else{ - rangeQuery.to(dateFromate.format(new Date())) ; - } - if(begin!=null || end!=null){ - boolQueryBuilder.must(rangeQuery) ; - } - if(!StringUtils.isBlank(q)){ - boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; - } - return processQuery(boolQueryBuilder , page); - } - - - private Page processQuery(BoolQueryBuilder boolQueryBuilder , Pageable page){ - NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withSort(new FieldSortBuilder("creater").unmappedType("boolean").order(SortOrder.DESC)).withSort(new FieldSortBuilder("name").unmappedType("string").order(SortOrder.DESC)); - - searchQueryBuilder.withPageable(page); - - Page entCustomerList = null ; - if(elasticsearchTemplate.indexExists(EntCustomer.class)){ - entCustomerList = elasticsearchTemplate.queryForPage(searchQueryBuilder.build() , EntCustomer.class ) ; - } - if(entCustomerList.getContent().size() > 0){ - List ids = new ArrayList() ; - for(EntCustomer entCustomer : entCustomerList.getContent()){ - if(entCustomer.getCreater()!=null && ids.size()<1024){ - ids.add(entCustomer.getCreater()) ; - } - } - List users = userRes.findAll(ids) ; - for(EntCustomer entCustomer : entCustomerList.getContent()){ - for(User user : users){ - if(user.getId().equals(entCustomer.getCreater())){ - entCustomer.setUser(user); - break ; - } - } - } - } - return entCustomerList; - } -} +/* + * Copyright (C) 2017 优客服-多渠道客服系统 + * Modifications copyright (C) 2018-2019 Chatopera Inc, + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chatopera.cc.persistence.es; + +import com.chatopera.cc.model.EntCustomer; +import com.chatopera.cc.model.User; +import com.chatopera.cc.persistence.repository.UserRepository; +import org.apache.commons.lang.StringUtils; +import org.elasticsearch.index.query.*; +import org.elasticsearch.search.sort.FieldSortBuilder; +import org.elasticsearch.search.sort.SortOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; +import org.springframework.stereotype.Repository; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import static org.elasticsearch.index.query.QueryBuilders.termQuery; + +@Repository +public class EntCustomerRepositoryImpl implements EntCustomerEsCommonRepository { + + private final SimpleDateFormat dateFromate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + @Autowired + private UserRepository userRes; + + private ElasticsearchTemplate elasticsearchTemplate; + + @Autowired + public void setElasticsearchTemplate(ElasticsearchTemplate elasticsearchTemplate) { + this.elasticsearchTemplate = elasticsearchTemplate; + } + + @Override + public Page findByCreaterAndSharesAndOrgi(String creater, String shares ,String orgi, boolean includeDeleteData ,String q , Pageable page) { + + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + BoolQueryBuilder boolQueryBuilder1 = new BoolQueryBuilder(); + boolQueryBuilder1.should(termQuery("creater" , creater)) ; + boolQueryBuilder1.should(termQuery("shares" , creater)) ; + boolQueryBuilder1.should(termQuery("shares" , "all")) ; + boolQueryBuilder.must(boolQueryBuilder1) ; + boolQueryBuilder.must(termQuery("orgi" , orgi)) ; + if(includeDeleteData){ + boolQueryBuilder.must(termQuery("datastatus" , true)) ; + }else{ + boolQueryBuilder.must(termQuery("datastatus" , false)) ; + } + if(!StringUtils.isBlank(q)){ + boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; + } + return processQuery(boolQueryBuilder , page); + } + + @Override + public Page findByCreaterAndSharesAndOrgi(String creater, + String shares,String orgi, Date begin, Date end, boolean includeDeleteData, + BoolQueryBuilder boolQueryBuilder , String q, Pageable page) { + BoolQueryBuilder boolQueryBuilder1 = new BoolQueryBuilder(); + boolQueryBuilder1.should(termQuery("creater" , creater)) ; + boolQueryBuilder1.should(termQuery("shares" , creater)) ; + boolQueryBuilder1.should(termQuery("shares" , "all")) ; + boolQueryBuilder.must(boolQueryBuilder1) ; + boolQueryBuilder.must(termQuery("orgi" , orgi)) ; + if(includeDeleteData){ + boolQueryBuilder.must(termQuery("datastatus" , true)) ; + }else{ + boolQueryBuilder.must(termQuery("datastatus" , false)) ; + } + RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("createtime") ; + if(begin!=null){ + rangeQuery.from(begin.getTime()) ; + } + if(end!=null){ + rangeQuery.to(end.getTime()) ; + }else{ + rangeQuery.to(new Date().getTime()) ; + } + if(begin!=null || end!=null){ + boolQueryBuilder.must(rangeQuery) ; + } + if(!StringUtils.isBlank(q)){ + boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; + } + return processQuery(boolQueryBuilder , page); + } + + @Override + public Page findByCreaterAndSharesAndOrgi(String creater,String shares,String orgi, Date begin, Date end, boolean includeDeleteData,String q, Pageable page) { + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + BoolQueryBuilder boolQueryBuilder1 = new BoolQueryBuilder(); + boolQueryBuilder1.should(termQuery("creater" , creater)) ; + boolQueryBuilder1.should(termQuery("shares" , creater)) ; + boolQueryBuilder1.should(termQuery("shares" , "all")) ; + boolQueryBuilder.must(boolQueryBuilder1) ; + boolQueryBuilder.must(termQuery("orgi" , orgi)) ; + if(includeDeleteData){ + boolQueryBuilder.must(termQuery("datastatus" , true)) ; + }else{ + boolQueryBuilder.must(termQuery("datastatus" , false)) ; + } + RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("createtime") ; + if(begin!=null){ + rangeQuery.from(dateFromate.format(begin)) ; + } + if(end!=null){ + rangeQuery.to(dateFromate.format(end)) ; + }else{ + rangeQuery.to(dateFromate.format(new Date())) ; + } + if(begin!=null || end!=null){ + boolQueryBuilder.must(rangeQuery) ; + } + if(!StringUtils.isBlank(q)){ + boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; + } + return processQuery(boolQueryBuilder , page); + } + + + private Page processQuery(BoolQueryBuilder boolQueryBuilder , Pageable page){ + NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withSort(new FieldSortBuilder("creater").unmappedType("boolean").order(SortOrder.DESC)).withSort(new FieldSortBuilder("name").unmappedType("string").order(SortOrder.DESC)); + + searchQueryBuilder.withPageable(page); + + Page entCustomerList = null ; + if(elasticsearchTemplate.indexExists(EntCustomer.class)){ + entCustomerList = elasticsearchTemplate.queryForPage(searchQueryBuilder.build() , EntCustomer.class ) ; + } + if(entCustomerList.getContent().size() > 0){ + List ids = new ArrayList() ; + for(EntCustomer entCustomer : entCustomerList.getContent()){ + if(entCustomer.getCreater()!=null && ids.size()<1024){ + ids.add(entCustomer.getCreater()) ; + } + } + List users = userRes.findAll(ids) ; + for(EntCustomer entCustomer : entCustomerList.getContent()){ + for(User user : users){ + if(user.getId().equals(entCustomer.getCreater())) { + entCustomer.setUser(user); + break; + } + } + } + } + return entCustomerList; + } +} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/KbsTopicCommentRepositoryImpl.java b/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/KbsTopicCommentRepositoryImpl.java index 09a4ce2b..b66f803f 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/KbsTopicCommentRepositoryImpl.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/KbsTopicCommentRepositoryImpl.java @@ -1,107 +1,107 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018-2019 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.persistence.es; - -import com.chatopera.cc.model.KbsTopicComment; -import com.chatopera.cc.model.Topic; -import org.apache.commons.lang.StringUtils; -import org.elasticsearch.index.query.QueryStringQueryBuilder; -import org.elasticsearch.index.query.QueryStringQueryBuilder.Operator; -import org.elasticsearch.search.highlight.HighlightBuilder; -import org.elasticsearch.search.sort.FieldSortBuilder; -import org.elasticsearch.search.sort.SortOrder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; -import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; -import org.springframework.data.elasticsearch.core.query.SearchQuery; -import org.springframework.stereotype.Component; - -import java.util.List; - -import static org.elasticsearch.index.query.QueryBuilders.termQuery; - -@Component -public class KbsTopicCommentRepositoryImpl implements KbsTopicCommentEsCommonRepository{ - private ElasticsearchTemplate elasticsearchTemplate; - - @Autowired - public void setElasticsearchTemplate(ElasticsearchTemplate elasticsearchTemplate) { - this.elasticsearchTemplate = elasticsearchTemplate; - } - @Override - public Page findByDataid(String id , int p , int ps) { - Page pages = null ; - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("dataid" , id)).withSort(new FieldSortBuilder("optimal").unmappedType("boolean").order(SortOrder.DESC)).withSort(new FieldSortBuilder("updatetime").unmappedType("date").order(SortOrder.DESC)).build().setPageable(new PageRequest(p, ps)) ; - if(elasticsearchTemplate.indexExists(KbsTopicComment.class)){ - pages = elasticsearchTemplate.queryForPage(searchQuery, KbsTopicComment.class); - } - return pages ; - } - - @Override - public List findByOptimal(String dataid) { - List commentList = null ; - SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("dataid" , dataid)).withQuery(termQuery("optimal" , true)).build(); - if(elasticsearchTemplate.indexExists(KbsTopicComment.class)){ - commentList = elasticsearchTemplate.queryForList(searchQuery, KbsTopicComment.class); - } - return commentList ; - } - - @Override - public Page findByCon(NativeSearchQueryBuilder searchQueryBuilder , String field , String aggname, String q , final int p , final int ps) { - Page pages = null ; - if(!StringUtils.isBlank(q)){ - searchQueryBuilder.withQuery(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; - } - SearchQuery searchQuery = searchQueryBuilder.build(); - if(elasticsearchTemplate.indexExists(KbsTopicComment.class)){ - if(!StringUtils.isBlank(q)){ - pages = elasticsearchTemplate.queryForPage(searchQuery, KbsTopicComment.class , new UKResultMapper()); - }else{ - pages = elasticsearchTemplate.queryForPage(searchQuery, KbsTopicComment.class , new UKAggTopResultExtractor(field , aggname)); - } - } - return pages ; - } - @Override - public Page findByCon( - NativeSearchQueryBuilder searchQueryBuilder, String q, int p, int ps) { - searchQueryBuilder.withPageable(new PageRequest(p, ps)).withSort(new FieldSortBuilder("updatetime").unmappedType("date").order(SortOrder.DESC)) ; - searchQueryBuilder.withHighlightFields(new HighlightBuilder.Field("content").fragmentSize(200)) ; - if(!StringUtils.isBlank(q)){ - searchQueryBuilder.withQuery(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; - } - return elasticsearchTemplate.queryForPage(searchQueryBuilder.build(), KbsTopicComment.class , new UKResultMapper()) ; - } - - @Override - public Page countByCon( - NativeSearchQueryBuilder searchQueryBuilder, String q, int p, int ps) { - Page pages = null ; - if(!StringUtils.isBlank(q)){ - searchQueryBuilder.withQuery(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; - } - SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(p, ps)); - if(elasticsearchTemplate.indexExists(Topic.class)){ - pages = elasticsearchTemplate.queryForPage(searchQuery, KbsTopicComment.class , new UKAggResultExtractor("creater") ); - } - return pages ; - } -} +/* + * Copyright (C) 2017 优客服-多渠道客服系统 + * Modifications copyright (C) 2018-2019 Chatopera Inc, + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chatopera.cc.persistence.es; + +import com.chatopera.cc.model.KbsTopicComment; +import com.chatopera.cc.model.Topic; +import org.apache.commons.lang.StringUtils; +import org.elasticsearch.index.query.Operator; +import org.elasticsearch.index.query.QueryStringQueryBuilder; +import org.elasticsearch.search.highlight.HighlightBuilder; +import org.elasticsearch.search.sort.FieldSortBuilder; +import org.elasticsearch.search.sort.SortOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; +import org.springframework.data.elasticsearch.core.query.SearchQuery; +import org.springframework.stereotype.Component; + +import java.util.List; + +import static org.elasticsearch.index.query.QueryBuilders.termQuery; + +@Component +public class KbsTopicCommentRepositoryImpl implements KbsTopicCommentEsCommonRepository{ + private ElasticsearchTemplate elasticsearchTemplate; + + @Autowired + public void setElasticsearchTemplate(ElasticsearchTemplate elasticsearchTemplate) { + this.elasticsearchTemplate = elasticsearchTemplate; + } + @Override + public Page findByDataid(String id , int p , int ps) { + Page pages = null; + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("dataid", id)).withSort(new FieldSortBuilder("optimal").unmappedType("boolean").order(SortOrder.DESC)).withSort(new FieldSortBuilder("updatetime").unmappedType("date").order(SortOrder.DESC)).build().setPageable(new PageRequest(p, ps)); + if (elasticsearchTemplate.indexExists(KbsTopicComment.class)) { + pages = elasticsearchTemplate.queryForPage(searchQuery, KbsTopicComment.class); + } + return pages; + } + + @Override + public List findByOptimal(String dataid) { + List commentList = null ; + SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("dataid" , dataid)).withQuery(termQuery("optimal" , true)).build(); + if(elasticsearchTemplate.indexExists(KbsTopicComment.class)){ + commentList = elasticsearchTemplate.queryForList(searchQuery, KbsTopicComment.class); + } + return commentList ; + } + + @Override + public Page findByCon(NativeSearchQueryBuilder searchQueryBuilder , String field , String aggname, String q , final int p , final int ps) { + Page pages = null ; + if(!StringUtils.isBlank(q)){ + searchQueryBuilder.withQuery(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)); + } + SearchQuery searchQuery = searchQueryBuilder.build(); + if (elasticsearchTemplate.indexExists(KbsTopicComment.class)) { + if (!StringUtils.isBlank(q)) { + pages = elasticsearchTemplate.queryForPage(searchQuery, KbsTopicComment.class, new UKResultMapper()); + } else { + pages = elasticsearchTemplate.queryForPage(searchQuery, KbsTopicComment.class, new UKAggTopResultExtractor(field, aggname)); + } + } + return pages; + } + @Override + public Page findByCon( + NativeSearchQueryBuilder searchQueryBuilder, String q, int p, int ps) { + searchQueryBuilder.withPageable(new PageRequest(p, ps)).withSort(new FieldSortBuilder("updatetime").unmappedType("date").order(SortOrder.DESC)) ; + searchQueryBuilder.withHighlightFields(new HighlightBuilder.Field("content").fragmentSize(200)) ; + if(!StringUtils.isBlank(q)){ + searchQueryBuilder.withQuery(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; + } + return elasticsearchTemplate.queryForPage(searchQueryBuilder.build(), KbsTopicComment.class , new UKResultMapper()) ; + } + + @Override + public Page countByCon( + NativeSearchQueryBuilder searchQueryBuilder, String q, int p, int ps) { + Page pages = null; + if (!StringUtils.isBlank(q)) { + searchQueryBuilder.withQuery(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)); + } + SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(p, ps)); + if (elasticsearchTemplate.indexExists(Topic.class)) { + pages = elasticsearchTemplate.queryForPage(searchQuery, KbsTopicComment.class, new UKAggResultExtractor("creater")); + } + return pages; + } +} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/KbsTopicRepositoryImpl.java b/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/KbsTopicRepositoryImpl.java index 792c30ac..9c332937 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/KbsTopicRepositoryImpl.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/KbsTopicRepositoryImpl.java @@ -1,152 +1,148 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018-2019 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.persistence.es; - -import com.chatopera.cc.model.KbsTopic; -import org.apache.commons.lang.StringUtils; -import org.elasticsearch.index.query.BoolQueryBuilder; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.index.query.QueryStringQueryBuilder; -import org.elasticsearch.index.query.QueryStringQueryBuilder.Operator; -import org.elasticsearch.search.highlight.HighlightBuilder; -import org.elasticsearch.search.sort.FieldSortBuilder; -import org.elasticsearch.search.sort.SortOrder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; -import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; -import org.springframework.data.elasticsearch.core.query.SearchQuery; -import org.springframework.stereotype.Component; - -import java.util.Date; -import java.util.List; - -import static org.elasticsearch.index.query.QueryBuilders.termQuery; - -@Component -public class KbsTopicRepositoryImpl implements KbsTopicEsCommonRepository{ - private ElasticsearchTemplate elasticsearchTemplate; - - @Autowired - public void setElasticsearchTemplate(ElasticsearchTemplate elasticsearchTemplate) { - this.elasticsearchTemplate = elasticsearchTemplate; - } - @Override - public Page getTopicByCate(String cate , String q, final int p , final int ps) { - - Page pages = null ; - - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - boolQueryBuilder.must(termQuery("cate" , cate)) ; - - if(!StringUtils.isBlank(q)){ - boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; - } - NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withSort(new FieldSortBuilder("createtime").unmappedType("date").order(SortOrder.DESC)); - searchQueryBuilder.withHighlightFields(new HighlightBuilder.Field("title").fragmentSize(200)) ; - SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(p, ps)) ; - if(elasticsearchTemplate.indexExists(KbsTopic.class)){ - pages = elasticsearchTemplate.queryForPage(searchQuery, KbsTopic.class , new UKResultMapper()); - } - return pages ; - } - - @SuppressWarnings("deprecation") - @Override - public Page getTopicByTop(boolean top , final int p , final int ps) { - - Page pages = null ; - - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - boolQueryBuilder.must(termQuery("top" , top)) ; - - QueryBuilder beginFilter = QueryBuilders.boolQuery().should(QueryBuilders.missingQuery("begintime")).should(QueryBuilders.rangeQuery("begintime").from(new Date().getTime())) ; - QueryBuilder endFilter = QueryBuilders.boolQuery().should(QueryBuilders.missingQuery("endtime")).should(QueryBuilders.rangeQuery("endtime").to(new Date().getTime())) ; - - NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withFilter(QueryBuilders.boolQuery().must(beginFilter).must(endFilter)).withSort(new FieldSortBuilder("createtime").unmappedType("date").order(SortOrder.DESC)); - - searchQueryBuilder.withHighlightFields(new HighlightBuilder.Field("title").fragmentSize(200)) ; - SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(p, ps)) ; - if(elasticsearchTemplate.indexExists(KbsTopic.class)){ - pages = elasticsearchTemplate.queryForPage(searchQuery, KbsTopic.class , new UKResultMapper()); - } - return pages ; - } - - @Override - public Page getTopicByCateAndUser(String cate , String q , String user ,final int p , final int ps) { - - Page pages = null ; - - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - boolQueryBuilder.must(termQuery("cate" , cate)) ; - - if(!StringUtils.isBlank(q)){ - boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; - } - - NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withQuery(termQuery("creater" , user)).withSort(new FieldSortBuilder("top").unmappedType("boolean").order(SortOrder.DESC)).withSort(new FieldSortBuilder("updatetime").unmappedType("date").order(SortOrder.DESC)); - SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(p, ps)); - if(elasticsearchTemplate.indexExists(KbsTopic.class)){ - pages = elasticsearchTemplate.queryForPage(searchQuery, KbsTopic.class, new UKResultMapper()); - } - return pages ; - } - - @SuppressWarnings("deprecation") - @Override - public Page getTopicByCon(BoolQueryBuilder boolQueryBuilder, final int p , final int ps) { - - Page pages = null ; - - QueryBuilder beginFilter = QueryBuilders.boolQuery().should(QueryBuilders.missingQuery("begintime")).should(QueryBuilders.rangeQuery("begintime").from(new Date().getTime())) ; - QueryBuilder endFilter = QueryBuilders.boolQuery().should(QueryBuilders.missingQuery("endtime")).should(QueryBuilders.rangeQuery("endtime").to(new Date().getTime())) ; - - NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withFilter(QueryBuilders.boolQuery().must(beginFilter).must(endFilter)).withSort(new FieldSortBuilder("createtime").unmappedType("date").order(SortOrder.DESC)); - - SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(p, ps)) ; - if(elasticsearchTemplate.indexExists(KbsTopic.class)){ - pages = elasticsearchTemplate.queryForPage(searchQuery, KbsTopic.class); - } - return pages ; - } - @Override - public List getTopicByOrgi(String orgi , String type, String q) { - - List list = null ; - - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - boolQueryBuilder.must(termQuery("orgi" , orgi)) ; - - if(!StringUtils.isBlank(type)){ - boolQueryBuilder.must(termQuery("cate" , type)) ; - } - - if(!StringUtils.isBlank(q)){ - boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; - } - - NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withSort(new FieldSortBuilder("top").unmappedType("boolean").order(SortOrder.DESC)).withSort(new FieldSortBuilder("updatetime").unmappedType("date").order(SortOrder.DESC)); - SearchQuery searchQuery = searchQueryBuilder.build(); - if(elasticsearchTemplate.indexExists(KbsTopic.class)){ - list = elasticsearchTemplate.queryForList(searchQuery, KbsTopic.class); - } - return list ; - } -} +/* + * Copyright (C) 2017 优客服-多渠道客服系统 + * Modifications copyright (C) 2018-2019 Chatopera Inc, + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chatopera.cc.persistence.es; + +import com.chatopera.cc.model.KbsTopic; +import org.apache.commons.lang.StringUtils; +import org.elasticsearch.index.query.*; +import org.elasticsearch.search.highlight.HighlightBuilder; +import org.elasticsearch.search.sort.FieldSortBuilder; +import org.elasticsearch.search.sort.SortOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; +import org.springframework.data.elasticsearch.core.query.SearchQuery; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; + +import static org.elasticsearch.index.query.QueryBuilders.termQuery; + +@Component +public class KbsTopicRepositoryImpl implements KbsTopicEsCommonRepository{ + private ElasticsearchTemplate elasticsearchTemplate; + + @Autowired + public void setElasticsearchTemplate(ElasticsearchTemplate elasticsearchTemplate) { + this.elasticsearchTemplate = elasticsearchTemplate; + } + @Override + public Page getTopicByCate(String cate , String q, final int p , final int ps) { + + Page pages = null ; + + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + boolQueryBuilder.must(termQuery("cate" , cate)) ; + + if (!StringUtils.isBlank(q)) { + boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)); + } + NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withSort(new FieldSortBuilder("createtime").unmappedType("date").order(SortOrder.DESC)); + searchQueryBuilder.withHighlightFields(new HighlightBuilder.Field("title").fragmentSize(200)); + SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(p, ps)); + if (elasticsearchTemplate.indexExists(KbsTopic.class)) { + pages = elasticsearchTemplate.queryForPage(searchQuery, KbsTopic.class, new UKResultMapper()); + } + return pages; + } + + @SuppressWarnings("deprecation") + @Override + public Page getTopicByTop(boolean top , final int p , final int ps) { + + Page pages = null ; + + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + boolQueryBuilder.must(termQuery("top" , top)) ; + + QueryBuilder beginFilter = QueryBuilders.boolQuery().should(QueryBuilders.missingQuery("begintime")).should(QueryBuilders.rangeQuery("begintime").from(new Date().getTime())); + QueryBuilder endFilter = QueryBuilders.boolQuery().should(QueryBuilders.missingQuery("endtime")).should(QueryBuilders.rangeQuery("endtime").to(new Date().getTime())); + + NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withFilter(QueryBuilders.boolQuery().must(beginFilter).must(endFilter)).withSort(new FieldSortBuilder("createtime").unmappedType("date").order(SortOrder.DESC)); + + searchQueryBuilder.withHighlightFields(new HighlightBuilder.Field("title").fragmentSize(200)); + SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(p, ps)); + if (elasticsearchTemplate.indexExists(KbsTopic.class)) { + pages = elasticsearchTemplate.queryForPage(searchQuery, KbsTopic.class, new UKResultMapper()); + } + return pages; + } + + @Override + public Page getTopicByCateAndUser(String cate , String q , String user ,final int p , final int ps) { + + Page pages = null ; + + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + boolQueryBuilder.must(termQuery("cate" , cate)) ; + + if (!StringUtils.isBlank(q)) { + boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)); + } + + NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withQuery(termQuery("creater", user)).withSort(new FieldSortBuilder("top").unmappedType("boolean").order(SortOrder.DESC)).withSort(new FieldSortBuilder("updatetime").unmappedType("date").order(SortOrder.DESC)); + SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(p, ps)); + if (elasticsearchTemplate.indexExists(KbsTopic.class)) { + pages = elasticsearchTemplate.queryForPage(searchQuery, KbsTopic.class, new UKResultMapper()); + } + return pages; + } + + @SuppressWarnings("deprecation") + @Override + public Page getTopicByCon(BoolQueryBuilder boolQueryBuilder, final int p , final int ps) { + + Page pages = null ; + + QueryBuilder beginFilter = QueryBuilders.boolQuery().should(QueryBuilders.missingQuery("begintime")).should(QueryBuilders.rangeQuery("begintime").from(new Date().getTime())); + QueryBuilder endFilter = QueryBuilders.boolQuery().should(QueryBuilders.missingQuery("endtime")).should(QueryBuilders.rangeQuery("endtime").to(new Date().getTime())); + + NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withFilter(QueryBuilders.boolQuery().must(beginFilter).must(endFilter)).withSort(new FieldSortBuilder("createtime").unmappedType("date").order(SortOrder.DESC)); + + SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(p, ps)); + if (elasticsearchTemplate.indexExists(KbsTopic.class)) { + pages = elasticsearchTemplate.queryForPage(searchQuery, KbsTopic.class); + } + return pages; + } + @Override + public List getTopicByOrgi(String orgi , String type, String q) { + + List list = null ; + + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + boolQueryBuilder.must(termQuery("orgi" , orgi)) ; + + if(!StringUtils.isBlank(type)){ + boolQueryBuilder.must(termQuery("cate" , type)) ; + } + + if (!StringUtils.isBlank(q)) { + boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)); + } + + NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withSort(new FieldSortBuilder("top").unmappedType("boolean").order(SortOrder.DESC)).withSort(new FieldSortBuilder("updatetime").unmappedType("date").order(SortOrder.DESC)); + SearchQuery searchQuery = searchQueryBuilder.build(); + if (elasticsearchTemplate.indexExists(KbsTopic.class)) { + list = elasticsearchTemplate.queryForList(searchQuery, KbsTopic.class); + } + return list; + } +} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/QuickReplyRepositoryImpl.java b/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/QuickReplyRepositoryImpl.java index 78cc6f77..39ac848b 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/QuickReplyRepositoryImpl.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/QuickReplyRepositoryImpl.java @@ -1,219 +1,215 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018-2019 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.persistence.es; - -import com.chatopera.cc.basic.MainContext; -import com.chatopera.cc.model.QuickReply; -import org.apache.commons.lang.StringUtils; -import org.elasticsearch.index.query.BoolQueryBuilder; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.index.query.QueryStringQueryBuilder; -import org.elasticsearch.index.query.QueryStringQueryBuilder.Operator; -import org.elasticsearch.search.highlight.HighlightBuilder; -import org.elasticsearch.search.sort.FieldSortBuilder; -import org.elasticsearch.search.sort.SortOrder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; -import org.springframework.data.elasticsearch.core.query.DeleteQuery; -import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; -import org.springframework.data.elasticsearch.core.query.SearchQuery; -import org.springframework.stereotype.Component; - -import java.util.Date; -import java.util.List; - -import static org.elasticsearch.index.query.QueryBuilders.termQuery; - -@Component -public class QuickReplyRepositoryImpl implements QuickReplyEsCommonRepository{ - private ElasticsearchTemplate elasticsearchTemplate; - - @Autowired - public void setElasticsearchTemplate(ElasticsearchTemplate elasticsearchTemplate) { - this.elasticsearchTemplate = elasticsearchTemplate ; - } - @Override - public Page getByOrgiAndCate(String orgi , String cate , String q, Pageable page) { - - Page pages = null ; - - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - boolQueryBuilder.must(termQuery("cate" , cate)) ; - - if(!StringUtils.isBlank(q)){ - boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; - } - NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withSort(new FieldSortBuilder("createtime").unmappedType("date").order(SortOrder.DESC)); - searchQueryBuilder.withHighlightFields(new HighlightBuilder.Field("title").fragmentSize(200)) ; - SearchQuery searchQuery = searchQueryBuilder.build().setPageable(page) ; - if(elasticsearchTemplate.indexExists(QuickReply.class)){ - pages = elasticsearchTemplate.queryForPage(searchQuery, QuickReply.class , new UKResultMapper()); - } - return pages ; - } - - @Override - public List findByOrgiAndCreater(String orgi ,String creater , String q) { - - List pages = null ; - - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - boolQueryBuilder.must(termQuery("orgi" , orgi)) ; - - BoolQueryBuilder quickQueryBuilder = QueryBuilders.boolQuery(); - - quickQueryBuilder.should(termQuery("type" , MainContext.QuickType.PUB.toString())) ; - - BoolQueryBuilder priQueryBuilder = QueryBuilders.boolQuery(); - - priQueryBuilder.must(termQuery("type" , MainContext.QuickType.PRI.toString())) ; - priQueryBuilder.must(termQuery("creater" , creater)) ; - - quickQueryBuilder.should(priQueryBuilder) ; - - boolQueryBuilder.must(quickQueryBuilder) ; - - if(!StringUtils.isBlank(q)){ - boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; - } - NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withSort(new FieldSortBuilder("createtime").unmappedType("date").order(SortOrder.DESC)); - searchQueryBuilder.withHighlightFields(new HighlightBuilder.Field("title").fragmentSize(200)) ; - SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(0, 10000)) ; - if(elasticsearchTemplate.indexExists(QuickReply.class)){ - pages = elasticsearchTemplate.queryForList(searchQuery, QuickReply.class); - } - return pages ; - } - - - @Override - public Page getByQuicktype(String quicktype , final int p , final int ps) { - - Page pages = null ; - - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - boolQueryBuilder.must(termQuery("type" , quicktype)) ; - - NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withSort(new FieldSortBuilder("createtime").unmappedType("date").order(SortOrder.DESC)); - - searchQueryBuilder.withHighlightFields(new HighlightBuilder.Field("title").fragmentSize(200)) ; - SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(p, ps)) ; - if(elasticsearchTemplate.indexExists(QuickReply.class)){ - pages = elasticsearchTemplate.queryForPage(searchQuery, QuickReply.class , new UKResultMapper()); - } - return pages ; - } - - @Override - public Page getByCateAndUser(String cate , String q , String user ,final int p , final int ps) { - - Page pages = null ; - - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - boolQueryBuilder.must(termQuery("cate" , cate)) ; - - if(!StringUtils.isBlank(q)){ - boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; - } - - NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withQuery(termQuery("creater" , user)).withSort(new FieldSortBuilder("top").unmappedType("boolean").order(SortOrder.DESC)).withSort(new FieldSortBuilder("updatetime").unmappedType("date").order(SortOrder.DESC)); - SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(p, ps)); - if(elasticsearchTemplate.indexExists(QuickReply.class)){ - pages = elasticsearchTemplate.queryForPage(searchQuery, QuickReply.class, new UKResultMapper()); - } - return pages ; - } - - @SuppressWarnings("deprecation") - @Override - public Page getByCon(BoolQueryBuilder boolQueryBuilder, final int p , final int ps) { - - Page pages = null ; - - QueryBuilder beginFilter = QueryBuilders.boolQuery().should(QueryBuilders.missingQuery("begintime")).should(QueryBuilders.rangeQuery("begintime").from(new Date().getTime())) ; - QueryBuilder endFilter = QueryBuilders.boolQuery().should(QueryBuilders.missingQuery("endtime")).should(QueryBuilders.rangeQuery("endtime").to(new Date().getTime())) ; - - NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withFilter(QueryBuilders.boolQuery().must(beginFilter).must(endFilter)).withSort(new FieldSortBuilder("createtime").unmappedType("date").order(SortOrder.DESC)); - - SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(p, ps)) ; - if(elasticsearchTemplate.indexExists(QuickReply.class)){ - pages = elasticsearchTemplate.queryForPage(searchQuery, QuickReply.class); - } - return pages ; - } - @Override - public Page getByOrgiAndType(String orgi ,String type, String q , Pageable page) { - - Page list = null ; - - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - boolQueryBuilder.must(termQuery("orgi" , orgi)) ; - if(!StringUtils.isBlank(type)) { - boolQueryBuilder.must(termQuery("type" , type)) ; - } - - if(!StringUtils.isBlank(q)){ - boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; - } - - NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withSort(new FieldSortBuilder("createtime").unmappedType("date").order(SortOrder.DESC)); - SearchQuery searchQuery = searchQueryBuilder.build().setPageable(page); - if(elasticsearchTemplate.indexExists(QuickReply.class)){ - list = elasticsearchTemplate.queryForPage(searchQuery, QuickReply.class); - } - return list ; - } - @Override - public void deleteByCate(String cate ,String orgi) { - DeleteQuery deleteQuery = new DeleteQuery(); - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - boolQueryBuilder.must(termQuery("orgi" , orgi)) ; - boolQueryBuilder.must(termQuery("cate" , cate)) ; - deleteQuery.setQuery(boolQueryBuilder); - elasticsearchTemplate.delete(deleteQuery); - } - - @Override - public List getQuickReplyByOrgi(String orgi , String cate,String type, String q) { - - List list = null ; - - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - boolQueryBuilder.must(termQuery("orgi" , orgi)) ; - - if(!StringUtils.isBlank(cate)){ - boolQueryBuilder.must(termQuery("cate" , cate)) ; - } - if(!StringUtils.isBlank(type)){ - boolQueryBuilder.must(termQuery("type" , type)) ; - } - if(!StringUtils.isBlank(q)){ - boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; - } - - NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withSort(new FieldSortBuilder("top").unmappedType("boolean").order(SortOrder.DESC)).withSort(new FieldSortBuilder("updatetime").unmappedType("date").order(SortOrder.DESC)); - SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(0, 10000)); - if(elasticsearchTemplate.indexExists(QuickReply.class)){ - list = elasticsearchTemplate.queryForList(searchQuery, QuickReply.class); - } - return list ; - } -} +/* + * Copyright (C) 2017 优客服-多渠道客服系统 + * Modifications copyright (C) 2018-2019 Chatopera Inc, + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chatopera.cc.persistence.es; + +import com.chatopera.cc.basic.MainContext; +import com.chatopera.cc.model.QuickReply; +import org.apache.commons.lang.StringUtils; +import org.elasticsearch.index.query.*; +import org.elasticsearch.search.highlight.HighlightBuilder; +import org.elasticsearch.search.sort.FieldSortBuilder; +import org.elasticsearch.search.sort.SortOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.core.query.DeleteQuery; +import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; +import org.springframework.data.elasticsearch.core.query.SearchQuery; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; + +import static org.elasticsearch.index.query.QueryBuilders.termQuery; + +@Component +public class QuickReplyRepositoryImpl implements QuickReplyEsCommonRepository{ + private ElasticsearchTemplate elasticsearchTemplate; + + @Autowired + public void setElasticsearchTemplate(ElasticsearchTemplate elasticsearchTemplate) { + this.elasticsearchTemplate = elasticsearchTemplate ; + } + @Override + public Page getByOrgiAndCate(String orgi , String cate , String q, Pageable page) { + + Page pages = null ; + + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + boolQueryBuilder.must(termQuery("cate" , cate)) ; + + if (!StringUtils.isBlank(q)) { + boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)); + } + NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withSort(new FieldSortBuilder("createtime").unmappedType("date").order(SortOrder.DESC)); + searchQueryBuilder.withHighlightFields(new HighlightBuilder.Field("title").fragmentSize(200)); + SearchQuery searchQuery = searchQueryBuilder.build().setPageable(page); + if (elasticsearchTemplate.indexExists(QuickReply.class)) { + pages = elasticsearchTemplate.queryForPage(searchQuery, QuickReply.class, new UKResultMapper()); + } + return pages; + } + + @Override + public List findByOrgiAndCreater(String orgi ,String creater , String q) { + + List pages = null ; + + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + boolQueryBuilder.must(termQuery("orgi" , orgi)) ; + + BoolQueryBuilder quickQueryBuilder = QueryBuilders.boolQuery(); + + quickQueryBuilder.should(termQuery("type" , MainContext.QuickType.PUB.toString())) ; + + BoolQueryBuilder priQueryBuilder = QueryBuilders.boolQuery(); + + priQueryBuilder.must(termQuery("type" , MainContext.QuickType.PRI.toString())) ; + priQueryBuilder.must(termQuery("creater" , creater)) ; + + quickQueryBuilder.should(priQueryBuilder) ; + + boolQueryBuilder.must(quickQueryBuilder) ; + + if (!StringUtils.isBlank(q)) { + boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)); + } + NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withSort(new FieldSortBuilder("createtime").unmappedType("date").order(SortOrder.DESC)); + searchQueryBuilder.withHighlightFields(new HighlightBuilder.Field("title").fragmentSize(200)); + SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(0, 10000)); + if (elasticsearchTemplate.indexExists(QuickReply.class)) { + pages = elasticsearchTemplate.queryForList(searchQuery, QuickReply.class); + } + return pages; + } + + + @Override + public Page getByQuicktype(String quicktype , final int p , final int ps) { + + Page pages = null ; + + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + boolQueryBuilder.must(termQuery("type", quicktype)); + + NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withSort(new FieldSortBuilder("createtime").unmappedType("date").order(SortOrder.DESC)); + + searchQueryBuilder.withHighlightFields(new HighlightBuilder.Field("title").fragmentSize(200)); + SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(p, ps)); + if (elasticsearchTemplate.indexExists(QuickReply.class)) { + pages = elasticsearchTemplate.queryForPage(searchQuery, QuickReply.class, new UKResultMapper()); + } + return pages; + } + + @Override + public Page getByCateAndUser(String cate , String q , String user ,final int p , final int ps) { + + Page pages = null ; + + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + boolQueryBuilder.must(termQuery("cate" , cate)) ; + + if (!StringUtils.isBlank(q)) { + boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)); + } + + NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withQuery(termQuery("creater", user)).withSort(new FieldSortBuilder("top").unmappedType("boolean").order(SortOrder.DESC)).withSort(new FieldSortBuilder("updatetime").unmappedType("date").order(SortOrder.DESC)); + SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(p, ps)); + if (elasticsearchTemplate.indexExists(QuickReply.class)) { + pages = elasticsearchTemplate.queryForPage(searchQuery, QuickReply.class, new UKResultMapper()); + } + return pages; + } + + @SuppressWarnings("deprecation") + @Override + public Page getByCon(BoolQueryBuilder boolQueryBuilder, final int p , final int ps) { + + Page pages = null ; + + QueryBuilder beginFilter = QueryBuilders.boolQuery().should(QueryBuilders.missingQuery("begintime")).should(QueryBuilders.rangeQuery("begintime").from(new Date().getTime())); + QueryBuilder endFilter = QueryBuilders.boolQuery().should(QueryBuilders.missingQuery("endtime")).should(QueryBuilders.rangeQuery("endtime").to(new Date().getTime())); + + NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withFilter(QueryBuilders.boolQuery().must(beginFilter).must(endFilter)).withSort(new FieldSortBuilder("createtime").unmappedType("date").order(SortOrder.DESC)); + + SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(p, ps)); + if (elasticsearchTemplate.indexExists(QuickReply.class)) { + pages = elasticsearchTemplate.queryForPage(searchQuery, QuickReply.class); + } + return pages; + } + @Override + public Page getByOrgiAndType(String orgi ,String type, String q , Pageable page) { + + Page list = null ; + + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + boolQueryBuilder.must(termQuery("orgi" , orgi)) ; + if(!StringUtils.isBlank(type)) { + boolQueryBuilder.must(termQuery("type" , type)) ; + } + + if (!StringUtils.isBlank(q)) { + boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)); + } + + NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withSort(new FieldSortBuilder("createtime").unmappedType("date").order(SortOrder.DESC)); + SearchQuery searchQuery = searchQueryBuilder.build().setPageable(page); + if (elasticsearchTemplate.indexExists(QuickReply.class)) { + list = elasticsearchTemplate.queryForPage(searchQuery, QuickReply.class); + } + return list; + } + @Override + public void deleteByCate(String cate ,String orgi) { + DeleteQuery deleteQuery = new DeleteQuery(); + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + boolQueryBuilder.must(termQuery("orgi" , orgi)) ; + boolQueryBuilder.must(termQuery("cate" , cate)) ; + deleteQuery.setQuery(boolQueryBuilder); + elasticsearchTemplate.delete(deleteQuery); + } + + @Override + public List getQuickReplyByOrgi(String orgi , String cate,String type, String q) { + + List list = null ; + + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + boolQueryBuilder.must(termQuery("orgi" , orgi)) ; + + if(!StringUtils.isBlank(cate)){ + boolQueryBuilder.must(termQuery("cate" , cate)) ; + } + if(!StringUtils.isBlank(type)){ + boolQueryBuilder.must(termQuery("type" , type)) ; + } + if (!StringUtils.isBlank(q)) { + boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)); + } + + NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withSort(new FieldSortBuilder("top").unmappedType("boolean").order(SortOrder.DESC)).withSort(new FieldSortBuilder("updatetime").unmappedType("date").order(SortOrder.DESC)); + SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(0, 10000)); + if (elasticsearchTemplate.indexExists(QuickReply.class)) { + list = elasticsearchTemplate.queryForList(searchQuery, QuickReply.class); + } + return list; + } +} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/TopicRepositoryImpl.java b/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/TopicRepositoryImpl.java index b34177c7..00e32d83 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/TopicRepositoryImpl.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/persistence/es/TopicRepositoryImpl.java @@ -1,159 +1,155 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018-2019 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.persistence.es; - -import com.chatopera.cc.model.Topic; -import com.chatopera.cc.persistence.repository.XiaoEUKResultMapper; -import org.apache.commons.lang.StringUtils; -import org.elasticsearch.index.query.BoolQueryBuilder; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.index.query.QueryStringQueryBuilder; -import org.elasticsearch.index.query.QueryStringQueryBuilder.Operator; -import org.elasticsearch.search.highlight.HighlightBuilder; -import org.elasticsearch.search.sort.FieldSortBuilder; -import org.elasticsearch.search.sort.SortOrder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; -import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; -import org.springframework.data.elasticsearch.core.query.SearchQuery; -import org.springframework.stereotype.Component; - -import java.util.Date; -import java.util.List; - -import static org.elasticsearch.index.query.QueryBuilders.termQuery; - -@Component -public class TopicRepositoryImpl implements TopicEsCommonRepository{ - private ElasticsearchTemplate elasticsearchTemplate; - - @Autowired - public void setElasticsearchTemplate(ElasticsearchTemplate elasticsearchTemplate) { - this.elasticsearchTemplate = elasticsearchTemplate; - } - @Override - public Page getTopicByCateAndOrgi(String cate ,String orgi, String q, final int p , final int ps) { - - Page pages = null ; - - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - if(!StringUtils.isBlank(cate)) { - boolQueryBuilder.must(termQuery("cate" , cate)) ; - } - boolQueryBuilder.must(termQuery("orgi" , orgi)) ; - if(!StringUtils.isBlank(q)){ - boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; - } - NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withSort(new FieldSortBuilder("top").unmappedType("boolean").order(SortOrder.DESC)).withSort(new FieldSortBuilder("createtime").unmappedType("date").order(SortOrder.DESC)); - searchQueryBuilder.withHighlightFields(new HighlightBuilder.Field("title").fragmentSize(200)) ; - SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(p, ps)) ; - if(elasticsearchTemplate.indexExists(Topic.class)){ - pages = elasticsearchTemplate.queryForPage(searchQuery, Topic.class , new XiaoEUKResultMapper()); - } - return pages ; - } - - @SuppressWarnings("deprecation") - @Override - public Page getTopicByTopAndOrgi(boolean top ,String orgi, String aiid ,final int p , final int ps) { - - Page pages = null ; - - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - boolQueryBuilder.must(termQuery("top" , top)) ; - boolQueryBuilder.must(termQuery("orgi" , orgi)) ; - if(!StringUtils.isBlank(aiid)) { - boolQueryBuilder.must(termQuery("aiid" , aiid)) ; - } - - QueryBuilder beginFilter = QueryBuilders.boolQuery().should(QueryBuilders.missingQuery("begintime")).should(QueryBuilders.rangeQuery("begintime").to(new Date().getTime())) ; - QueryBuilder endFilter = QueryBuilders.boolQuery().should(QueryBuilders.missingQuery("endtime")).should(QueryBuilders.rangeQuery("endtime").from(new Date().getTime())) ; - - NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withFilter(QueryBuilders.boolQuery().must(beginFilter).must(endFilter)).withSort(new FieldSortBuilder("createtime").unmappedType("date").order(SortOrder.DESC)); - - - searchQueryBuilder.withHighlightFields(new HighlightBuilder.Field("title").fragmentSize(200)) ; - SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(p, ps)) ; - if(elasticsearchTemplate.indexExists(Topic.class)){ - pages = elasticsearchTemplate.queryForPage(searchQuery, Topic.class , new XiaoEUKResultMapper()); - } - return pages ; - } - - @Override - public Page getTopicByCateAndUser(String cate , String q , String user ,final int p , final int ps) { - - Page pages = null ; - - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - boolQueryBuilder.must(termQuery("cate" , cate)) ; - - if(!StringUtils.isBlank(q)){ - boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; - } - - NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withQuery(termQuery("creater" , user)).withSort(new FieldSortBuilder("top").unmappedType("boolean").order(SortOrder.DESC)).withSort(new FieldSortBuilder("updatetime").unmappedType("date").order(SortOrder.DESC)); - SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(p, ps)); - if(elasticsearchTemplate.indexExists(Topic.class)){ - pages = elasticsearchTemplate.queryForPage(searchQuery, Topic.class, new XiaoEUKResultMapper()); - } - return pages ; - } - - @SuppressWarnings("deprecation") - @Override - public Page getTopicByCon(BoolQueryBuilder boolQueryBuilder, final int p , final int ps) { - - Page pages = null ; - - QueryBuilder beginFilter = QueryBuilders.boolQuery().should(QueryBuilders.missingQuery("begintime")).should(QueryBuilders.rangeQuery("begintime").to(new Date().getTime())) ; - QueryBuilder endFilter = QueryBuilders.boolQuery().should(QueryBuilders.missingQuery("endtime")).should(QueryBuilders.rangeQuery("endtime").from(new Date().getTime())) ; - - NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withFilter(QueryBuilders.boolQuery().must(beginFilter).must(endFilter)).withSort(new FieldSortBuilder("createtime").unmappedType("date").order(SortOrder.DESC)); - SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(p, ps)) ; - if(elasticsearchTemplate.indexExists(Topic.class)){ - pages = elasticsearchTemplate.queryForPage(searchQuery, Topic.class); - } - return pages ; - } - @Override - public List getTopicByOrgi(String orgi , String type, String q) { - - List list = null ; - - BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); - boolQueryBuilder.must(termQuery("orgi" , orgi)) ; - - if(!StringUtils.isBlank(type)){ - boolQueryBuilder.must(termQuery("cate" , type)) ; - } - - if(!StringUtils.isBlank(q)){ - boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)) ; - } - - NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withSort(new FieldSortBuilder("top").unmappedType("boolean").order(SortOrder.DESC)).withSort(new FieldSortBuilder("updatetime").unmappedType("date").order(SortOrder.DESC)); - SearchQuery searchQuery = searchQueryBuilder.build(); - if(elasticsearchTemplate.indexExists(Topic.class)){ - list = elasticsearchTemplate.queryForList(searchQuery, Topic.class); - } - return list ; - } -} +/* + * Copyright (C) 2017 优客服-多渠道客服系统 + * Modifications copyright (C) 2018-2019 Chatopera Inc, + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chatopera.cc.persistence.es; + +import com.chatopera.cc.model.Topic; +import com.chatopera.cc.persistence.repository.XiaoEUKResultMapper; +import org.apache.commons.lang.StringUtils; +import org.elasticsearch.index.query.*; +import org.elasticsearch.search.highlight.HighlightBuilder; +import org.elasticsearch.search.sort.FieldSortBuilder; +import org.elasticsearch.search.sort.SortOrder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; +import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; +import org.springframework.data.elasticsearch.core.query.SearchQuery; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; + +import static org.elasticsearch.index.query.QueryBuilders.termQuery; + +@Component +public class TopicRepositoryImpl implements TopicEsCommonRepository{ + private ElasticsearchTemplate elasticsearchTemplate; + + @Autowired + public void setElasticsearchTemplate(ElasticsearchTemplate elasticsearchTemplate) { + this.elasticsearchTemplate = elasticsearchTemplate; + } + @Override + public Page getTopicByCateAndOrgi(String cate ,String orgi, String q, final int p , final int ps) { + + Page pages = null ; + + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + if(!StringUtils.isBlank(cate)) { + boolQueryBuilder.must(termQuery("cate" , cate)) ; + } + boolQueryBuilder.must(termQuery("orgi", orgi)); + if (!StringUtils.isBlank(q)) { + boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)); + } + NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withSort(new FieldSortBuilder("top").unmappedType("boolean").order(SortOrder.DESC)).withSort(new FieldSortBuilder("createtime").unmappedType("date").order(SortOrder.DESC)); + searchQueryBuilder.withHighlightFields(new HighlightBuilder.Field("title").fragmentSize(200)); + SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(p, ps)); + if (elasticsearchTemplate.indexExists(Topic.class)) { + pages = elasticsearchTemplate.queryForPage(searchQuery, Topic.class, new XiaoEUKResultMapper()); + } + return pages; + } + + @SuppressWarnings("deprecation") + @Override + public Page getTopicByTopAndOrgi(boolean top ,String orgi, String aiid ,final int p , final int ps) { + + Page pages = null ; + + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + boolQueryBuilder.must(termQuery("top" , top)) ; + boolQueryBuilder.must(termQuery("orgi" , orgi)) ; + if(!StringUtils.isBlank(aiid)) { + boolQueryBuilder.must(termQuery("aiid" , aiid)) ; + } + + QueryBuilder beginFilter = QueryBuilders.boolQuery().should(QueryBuilders.missingQuery("begintime")).should(QueryBuilders.rangeQuery("begintime").to(new Date().getTime())) ; + QueryBuilder endFilter = QueryBuilders.boolQuery().should(QueryBuilders.missingQuery("endtime")).should(QueryBuilders.rangeQuery("endtime").from(new Date().getTime())); + + NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withFilter(QueryBuilders.boolQuery().must(beginFilter).must(endFilter)).withSort(new FieldSortBuilder("createtime").unmappedType("date").order(SortOrder.DESC)); + + + searchQueryBuilder.withHighlightFields(new HighlightBuilder.Field("title").fragmentSize(200)); + SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(p, ps)); + if (elasticsearchTemplate.indexExists(Topic.class)) { + pages = elasticsearchTemplate.queryForPage(searchQuery, Topic.class, new XiaoEUKResultMapper()); + } + return pages; + } + + @Override + public Page getTopicByCateAndUser(String cate , String q , String user ,final int p , final int ps) { + + Page pages = null ; + + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + boolQueryBuilder.must(termQuery("cate" , cate)) ; + + if (!StringUtils.isBlank(q)) { + boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)); + } + + NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withQuery(termQuery("creater", user)).withSort(new FieldSortBuilder("top").unmappedType("boolean").order(SortOrder.DESC)).withSort(new FieldSortBuilder("updatetime").unmappedType("date").order(SortOrder.DESC)); + SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(p, ps)); + if (elasticsearchTemplate.indexExists(Topic.class)) { + pages = elasticsearchTemplate.queryForPage(searchQuery, Topic.class, new XiaoEUKResultMapper()); + } + return pages; + } + + @SuppressWarnings("deprecation") + @Override + public Page getTopicByCon(BoolQueryBuilder boolQueryBuilder, final int p , final int ps) { + + Page pages = null; + + QueryBuilder beginFilter = QueryBuilders.boolQuery().should(QueryBuilders.missingQuery("begintime")).should(QueryBuilders.rangeQuery("begintime").to(new Date().getTime())); + QueryBuilder endFilter = QueryBuilders.boolQuery().should(QueryBuilders.missingQuery("endtime")).should(QueryBuilders.rangeQuery("endtime").from(new Date().getTime())); + + NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withFilter(QueryBuilders.boolQuery().must(beginFilter).must(endFilter)).withSort(new FieldSortBuilder("createtime").unmappedType("date").order(SortOrder.DESC)); + SearchQuery searchQuery = searchQueryBuilder.build().setPageable(new PageRequest(p, ps)); + if (elasticsearchTemplate.indexExists(Topic.class)) { + pages = elasticsearchTemplate.queryForPage(searchQuery, Topic.class); + } + return pages; + } + @Override + public List getTopicByOrgi(String orgi , String type, String q) { + + List list = null ; + + BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); + boolQueryBuilder.must(termQuery("orgi" , orgi)) ; + + if(!StringUtils.isBlank(type)){ + boolQueryBuilder.must(termQuery("cate" , type)) ; + } + + if (!StringUtils.isBlank(q)) { + boolQueryBuilder.must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)); + } + + NativeSearchQueryBuilder searchQueryBuilder = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withSort(new FieldSortBuilder("top").unmappedType("boolean").order(SortOrder.DESC)).withSort(new FieldSortBuilder("updatetime").unmappedType("date").order(SortOrder.DESC)); + SearchQuery searchQuery = searchQueryBuilder.build(); + if (elasticsearchTemplate.indexExists(Topic.class)) { + list = elasticsearchTemplate.queryForList(searchQuery, Topic.class); + } + return list; + } +} diff --git a/contact-center/app/src/main/java/com/chatopera/cc/util/es/SearchTools.java b/contact-center/app/src/main/java/com/chatopera/cc/util/es/SearchTools.java index cc47837b..5101e02f 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/util/es/SearchTools.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/util/es/SearchTools.java @@ -1,352 +1,352 @@ -/* - * Copyright (C) 2017 优客服-多渠道客服系统 - * Modifications copyright (C) 2018-2019 Chatopera Inc, - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.chatopera.cc.util.es; - -import com.chatopera.cc.basic.Constants; -import com.chatopera.cc.basic.MainContext; -import com.chatopera.cc.model.FormFilter; -import com.chatopera.cc.model.FormFilterItem; -import com.chatopera.cc.model.MetadataTable; -import com.chatopera.cc.persistence.impl.ESDataExchangeImpl; -import org.apache.commons.lang3.StringUtils; -import org.elasticsearch.index.query.BoolQueryBuilder; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.index.query.QueryStringQueryBuilder; -import org.elasticsearch.index.query.QueryStringQueryBuilder.Operator; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Sort; - -import java.util.List; - -import static org.elasticsearch.index.query.QueryBuilders.rangeQuery; -import static org.elasticsearch.index.query.QueryBuilders.termQuery; - -public class SearchTools { - - public static PageImpl search(String orgi , FormFilter formFilter , List itemList , MetadataTable metadataTable , boolean loadRef , int p, int ps){ - BoolQueryBuilder queryBuilder = new BoolQueryBuilder(); - queryBuilder.must(termQuery("orgi", orgi)) ; - - BoolQueryBuilder orBuilder = new BoolQueryBuilder(); - int orNums = 0 ; - for(FormFilterItem formFilterItem : itemList) { - QueryBuilder tempQueryBuilder = null ; - if(formFilterItem.getField().equals("q")) { - tempQueryBuilder = new QueryStringQueryBuilder(formFilterItem.getValue()).defaultOperator(Operator.AND) ; - }else { - switch(formFilterItem.getCond()) { - case "01" : - tempQueryBuilder = rangeQuery(formFilterItem.getField()).from(formFilterItem.getValue()).includeLower(false) ; - break ; - case "02" : - tempQueryBuilder = rangeQuery(formFilterItem.getField()).from(formFilterItem.getValue()).includeLower(true) ; - break ; - case "03" : - tempQueryBuilder = rangeQuery(formFilterItem.getField()).to(formFilterItem.getValue()).includeUpper(false) ; - break ; - case "04" : - tempQueryBuilder = rangeQuery(formFilterItem.getField()).to(formFilterItem.getValue()).includeUpper(true) ; - break ; - case "05" : - tempQueryBuilder = termQuery(formFilterItem.getField() , formFilterItem.getValue()) ; - break ; - case "06" : - tempQueryBuilder = termQuery(formFilterItem.getField() , formFilterItem.getValue()) ; - break ; - case "07" : - tempQueryBuilder = new QueryStringQueryBuilder(formFilterItem.getValue()).field(formFilterItem.getField()).defaultOperator(Operator.AND) ; - break ; - default : - break ; - } - } - if("AND".equalsIgnoreCase(formFilterItem.getComp())) { - if("06".equals(formFilterItem.getCond())) { - queryBuilder.mustNot(tempQueryBuilder) ; - }else { - queryBuilder.must(tempQueryBuilder) ; - } - }else { - orNums ++ ; - if("06".equals(formFilterItem.getCond())) { - orBuilder.mustNot(tempQueryBuilder) ; - }else { - orBuilder.should(tempQueryBuilder) ; - } - } - } - if(orNums > 0) { - queryBuilder.must(orBuilder) ; - } - - return search(queryBuilder, metadataTable, loadRef, p, ps); - } - - public static PageImpl dissearch(String orgi , FormFilter formFilter , List itemList , MetadataTable metadataTable , int p, int ps){ - BoolQueryBuilder queryBuilder = new BoolQueryBuilder(); - queryBuilder.must(termQuery("orgi", orgi)) ; - queryBuilder.must(termQuery("status", MainContext.NamesDisStatusType.NOT.toString())) ; - queryBuilder.must(termQuery("validresult", "valid")) ; - - BoolQueryBuilder orBuilder = new BoolQueryBuilder(); - int orNums = 0 ; - for(FormFilterItem formFilterItem : itemList) { - QueryBuilder tempQueryBuilder = null ; - if(formFilterItem.getField().equals("q")) { - tempQueryBuilder = new QueryStringQueryBuilder(formFilterItem.getValue()).defaultOperator(Operator.AND) ; - }else { - switch(formFilterItem.getCond()) { - case "01" : - tempQueryBuilder = rangeQuery(formFilterItem.getField()).from(formFilterItem.getValue()).includeLower(false) ; - break ; - case "02" : - tempQueryBuilder = rangeQuery(formFilterItem.getField()).from(formFilterItem.getValue()).includeLower(true) ; - break ; - case "03" : - tempQueryBuilder = rangeQuery(formFilterItem.getField()).to(formFilterItem.getValue()).includeUpper(false) ; - break ; - case "04" : - tempQueryBuilder = rangeQuery(formFilterItem.getField()).to(formFilterItem.getValue()).includeUpper(true) ; - break ; - case "05" : - tempQueryBuilder = termQuery(formFilterItem.getField() , formFilterItem.getValue()) ; - break ; - case "06" : - tempQueryBuilder = termQuery(formFilterItem.getField() , formFilterItem.getValue()) ; - break ; - case "07" : - tempQueryBuilder = new QueryStringQueryBuilder(formFilterItem.getValue()).field(formFilterItem.getField()).defaultOperator(Operator.AND) ; - break ; - default : - break ; - } - } - if("AND".equalsIgnoreCase(formFilterItem.getComp())) { - if("06".equals(formFilterItem.getCond())) { - queryBuilder.mustNot(tempQueryBuilder) ; - }else { - queryBuilder.must(tempQueryBuilder) ; - } - }else { - orNums ++ ; - if("06".equals(formFilterItem.getCond())) { - orBuilder.mustNot(tempQueryBuilder) ; - }else { - orBuilder.should(tempQueryBuilder) ; - } - } - } - if(orNums > 0) { - queryBuilder.must(orBuilder) ; - } - return search(queryBuilder, metadataTable, false, p, ps); - } - - public static PageImpl recoversearch(String orgi , String cmd ,String id, MetadataTable metadataTable , int p, int ps){ - BoolQueryBuilder queryBuilder = new BoolQueryBuilder(); - queryBuilder.must(termQuery("orgi", orgi)) ; - queryBuilder.mustNot(termQuery("status", MainContext.NamesDisStatusType.NOT.toString())) ; - queryBuilder.must(termQuery("validresult", "valid")) ; - - switch(cmd) { - case "actid" : queryBuilder.must(termQuery("actid", id)) ; break ; - case "batid" : queryBuilder.must(termQuery("batid", id)) ; break ; - case "taskid" : queryBuilder.must(termQuery("taskid", id)) ; break ; - case "filterid" : queryBuilder.must(termQuery("filterid", id)) ; break ; - case "agent" : queryBuilder.must(termQuery(Constants.CSKEFU_SYSTEM_DIS_AGENT, id)) ; break ; - case "skill" : queryBuilder.must(termQuery(Constants.CSKEFU_SYSTEM_DIS_ORGAN, id)) ; break ; - case "taskskill" : queryBuilder.must(termQuery("taskid", id)).must(termQuery("status", MainContext.NamesDisStatusType.DISAGENT.toString())) ; break ; - case "filterskill" : queryBuilder.must(termQuery("filterid", id)).must(termQuery("status", MainContext.NamesDisStatusType.DISAGENT.toString())) ; break ; - default : queryBuilder.must(termQuery("actid", "NOT_EXIST_KEY")) ; //必须传入一个进来; - } - - return search(queryBuilder, metadataTable, false, p, ps); - } - /** - * - * @param orgi - * @param agent - * @param p - * @param ps - * @return - */ - public static PageImpl agentsearch(String orgi ,boolean excludeCalled , String agent , int p, int ps){ - BoolQueryBuilder queryBuilder = new BoolQueryBuilder(); - queryBuilder.must(termQuery("orgi", orgi)) ; - if(excludeCalled){ - queryBuilder.must(termQuery("callstatus", MainContext.NameStatusType.NOTCALL.toString())) ; - } - queryBuilder.must(termQuery("validresult", "valid")) ; - queryBuilder.must(termQuery(Constants.CSKEFU_SYSTEM_DIS_AGENT, agent)) ; - queryBuilder.must(termQuery("status", MainContext.NamesDisStatusType.DISAGENT.toString())) ; - - return search(queryBuilder, p, ps); - } - - /** - * - * @param orgi - * @param agent - * @param p - * @param ps - * @return - */ - public static PageImpl agentapsearch(String orgi , String agent , int p, int ps){ - BoolQueryBuilder queryBuilder = new BoolQueryBuilder(); - queryBuilder.must(termQuery("orgi", orgi)) ; - queryBuilder.must(termQuery("validresult", "valid")) ; - queryBuilder.must(termQuery(Constants.CSKEFU_SYSTEM_DIS_AGENT, agent)) ; - queryBuilder.must(termQuery("apstatus", true)) ; //预约状态 - - queryBuilder.must(rangeQuery("aptime").to(System.currentTimeMillis())) ; //预约状态 - - return search(queryBuilder, p, ps); - } - - /** - * - * @param orgi - * @param agent - * @param p - * @param ps - * @return - */ - public static PageImpl aisearch(String orgi , int p, int ps){ - BoolQueryBuilder queryBuilder = new BoolQueryBuilder(); - queryBuilder.must(termQuery("orgi", orgi)) ; - queryBuilder.must(termQuery("callstatus", MainContext.NameStatusType.NOTCALL.toString())) ; - - queryBuilder.must(termQuery("validresult", "valid")) ; - queryBuilder.must(termQuery("status", MainContext.NamesDisStatusType.DISAI.toString())) ; - - return search(queryBuilder, p, ps); - } - - - - /** - * - * @param orgi - * @param agent - * @param p - * @param ps - * @return - */ - public static PageImpl namesearch(String orgi , String phonenum){ - BoolQueryBuilder queryBuilder = new BoolQueryBuilder(); - queryBuilder.must(termQuery("orgi", orgi)) ; - queryBuilder.must(termQuery("validresult", "valid")) ; - queryBuilder.must(termQuery("status", MainContext.NamesDisStatusType.DISAGENT.toString())) ; - StringBuffer strb = new StringBuffer(); - if(!StringUtils.isBlank(phonenum)) { - strb.append(phonenum) ; - if(phonenum.startsWith("0")) { - strb.append(" ").append(phonenum.substring(1)) ; - } - }else { - strb.append(Constants.CSKEFU_SYSTEM_NO_DAT) ; - } - queryBuilder.must(new QueryStringQueryBuilder(strb.toString()).defaultOperator(Operator.OR) ); - return search(queryBuilder,0, 1); - } - - /** - * - * @param orgi - * @param agent - * @param p - * @param ps - * @return - */ - public static PageImpl search(BoolQueryBuilder queryBuilder, int p, int ps){ - return search(queryBuilder, null, true, p, ps); - } - /** - * - * @param queryBuilder - * @param metadataTable - * @param loadRef - * @param p - * @param ps - * @return - */ - private static PageImpl search(BoolQueryBuilder queryBuilder , MetadataTable metadataTable , boolean loadRef , int p, int ps){ - ESDataExchangeImpl esDataExchange = MainContext.getContext().getBean(ESDataExchangeImpl.class); - return esDataExchange.findPageResult(queryBuilder, Constants.SYSTEM_INDEX, metadataTable, new PageRequest(p, ps , Sort.Direction.ASC, "createtime") , loadRef) ; - } - - /** - * - * @param queryBuilder - * @param metadataTable - * @param loadRef - * @param p - * @param ps - * @return - */ - public static PageImpl aggregation(BoolQueryBuilder queryBuilder , String aggField, boolean loadRef , int p, int ps){ - ESDataExchangeImpl esDataExchange = MainContext.getContext().getBean(ESDataExchangeImpl.class); - return esDataExchange.findAllPageAggResult(queryBuilder , aggField , new PageRequest(p, ps , Sort.Direction.ASC, "createtime") , loadRef , null) ; - } - - /** - * - * @param queryBuilder - * @param metadataTable - * @param loadRef - * @param p - * @param ps - * @return - */ - public static UKDataBean get(UKDataBean dataBean){ - ESDataExchangeImpl esDataExchange = MainContext.getContext().getBean(ESDataExchangeImpl.class); - return esDataExchange.getIObjectByPK(dataBean, dataBean.getId()); - } - - /** - * - * @param queryBuilder - * @param metadataTable - * @param loadRef - * @param p - * @param ps - * @return - */ - public static UKDataBean get(String type, String id){ - ESDataExchangeImpl esDataExchange = MainContext.getContext().getBean(ESDataExchangeImpl.class); - return esDataExchange.getIObjectByPK(type, id); - } - - /** - * - * @param queryBuilder - * @param metadataTable - * @param loadRef - * @param p - * @param ps - * @return - */ - public static void save(UKDataBean dataBean){ - ESDataExchangeImpl esDataExchange = MainContext.getContext().getBean(ESDataExchangeImpl.class); - try { - esDataExchange.saveIObject(dataBean); - } catch (Exception e) { - e.printStackTrace(); - } - } -} +/* + * Copyright (C) 2017 优客服-多渠道客服系统 + * Modifications copyright (C) 2018-2019 Chatopera Inc, + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.chatopera.cc.util.es; + +import com.chatopera.cc.basic.Constants; +import com.chatopera.cc.basic.MainContext; +import com.chatopera.cc.model.FormFilter; +import com.chatopera.cc.model.FormFilterItem; +import com.chatopera.cc.model.MetadataTable; +import com.chatopera.cc.persistence.impl.ESDataExchangeImpl; +import org.apache.commons.lang3.StringUtils; +import org.elasticsearch.index.query.BoolQueryBuilder; +import org.elasticsearch.index.query.Operator; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryStringQueryBuilder; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; + +import java.util.List; + +import static org.elasticsearch.index.query.QueryBuilders.rangeQuery; +import static org.elasticsearch.index.query.QueryBuilders.termQuery; + +public class SearchTools { + + public static PageImpl search(String orgi , FormFilter formFilter , List itemList , MetadataTable metadataTable , boolean loadRef , int p, int ps){ + BoolQueryBuilder queryBuilder = new BoolQueryBuilder(); + queryBuilder.must(termQuery("orgi", orgi)) ; + + BoolQueryBuilder orBuilder = new BoolQueryBuilder(); + int orNums = 0 ; + for(FormFilterItem formFilterItem : itemList) { + QueryBuilder tempQueryBuilder = null ; + if(formFilterItem.getField().equals("q")) { + tempQueryBuilder = new QueryStringQueryBuilder(formFilterItem.getValue()).defaultOperator(Operator.AND) ; + }else { + switch(formFilterItem.getCond()) { + case "01": + tempQueryBuilder = rangeQuery(formFilterItem.getField()).from(formFilterItem.getValue()).includeLower(false); + break; + case "02": + tempQueryBuilder = rangeQuery(formFilterItem.getField()).from(formFilterItem.getValue()).includeLower(true); + break; + case "03": + tempQueryBuilder = rangeQuery(formFilterItem.getField()).to(formFilterItem.getValue()).includeUpper(false); + break; + case "04": + tempQueryBuilder = rangeQuery(formFilterItem.getField()).to(formFilterItem.getValue()).includeUpper(true); + break; + case "05": + tempQueryBuilder = termQuery(formFilterItem.getField(), formFilterItem.getValue()); + break; + case "06": + tempQueryBuilder = termQuery(formFilterItem.getField(), formFilterItem.getValue()); + break; + case "07": + tempQueryBuilder = new QueryStringQueryBuilder(formFilterItem.getValue()).field(formFilterItem.getField()).defaultOperator(Operator.AND); + break; + default: + break; + } + } + if("AND".equalsIgnoreCase(formFilterItem.getComp())) { + if("06".equals(formFilterItem.getCond())) { + queryBuilder.mustNot(tempQueryBuilder) ; + }else { + queryBuilder.must(tempQueryBuilder) ; + } + }else { + orNums ++ ; + if("06".equals(formFilterItem.getCond())) { + orBuilder.mustNot(tempQueryBuilder) ; + }else { + orBuilder.should(tempQueryBuilder) ; + } + } + } + if(orNums > 0) { + queryBuilder.must(orBuilder) ; + } + + return search(queryBuilder, metadataTable, loadRef, p, ps); + } + + public static PageImpl dissearch(String orgi , FormFilter formFilter , List itemList , MetadataTable metadataTable , int p, int ps){ + BoolQueryBuilder queryBuilder = new BoolQueryBuilder(); + queryBuilder.must(termQuery("orgi", orgi)) ; + queryBuilder.must(termQuery("status", MainContext.NamesDisStatusType.NOT.toString())) ; + queryBuilder.must(termQuery("validresult", "valid")) ; + + BoolQueryBuilder orBuilder = new BoolQueryBuilder(); + int orNums = 0 ; + for(FormFilterItem formFilterItem : itemList) { + QueryBuilder tempQueryBuilder = null ; + if(formFilterItem.getField().equals("q")) { + tempQueryBuilder = new QueryStringQueryBuilder(formFilterItem.getValue()).defaultOperator(Operator.AND) ; + }else { + switch(formFilterItem.getCond()) { + case "01": + tempQueryBuilder = rangeQuery(formFilterItem.getField()).from(formFilterItem.getValue()).includeLower(false); + break; + case "02": + tempQueryBuilder = rangeQuery(formFilterItem.getField()).from(formFilterItem.getValue()).includeLower(true); + break; + case "03": + tempQueryBuilder = rangeQuery(formFilterItem.getField()).to(formFilterItem.getValue()).includeUpper(false); + break; + case "04": + tempQueryBuilder = rangeQuery(formFilterItem.getField()).to(formFilterItem.getValue()).includeUpper(true); + break; + case "05": + tempQueryBuilder = termQuery(formFilterItem.getField(), formFilterItem.getValue()); + break; + case "06": + tempQueryBuilder = termQuery(formFilterItem.getField(), formFilterItem.getValue()); + break; + case "07": + tempQueryBuilder = new QueryStringQueryBuilder(formFilterItem.getValue()).field(formFilterItem.getField()).defaultOperator(Operator.AND); + break; + default: + break; + } + } + if("AND".equalsIgnoreCase(formFilterItem.getComp())) { + if("06".equals(formFilterItem.getCond())) { + queryBuilder.mustNot(tempQueryBuilder) ; + }else { + queryBuilder.must(tempQueryBuilder) ; + } + }else { + orNums ++ ; + if("06".equals(formFilterItem.getCond())) { + orBuilder.mustNot(tempQueryBuilder) ; + }else { + orBuilder.should(tempQueryBuilder) ; + } + } + } + if(orNums > 0) { + queryBuilder.must(orBuilder) ; + } + return search(queryBuilder, metadataTable, false, p, ps); + } + + public static PageImpl recoversearch(String orgi , String cmd ,String id, MetadataTable metadataTable , int p, int ps){ + BoolQueryBuilder queryBuilder = new BoolQueryBuilder(); + queryBuilder.must(termQuery("orgi", orgi)) ; + queryBuilder.mustNot(termQuery("status", MainContext.NamesDisStatusType.NOT.toString())) ; + queryBuilder.must(termQuery("validresult", "valid")) ; + + switch(cmd) { + case "actid" : queryBuilder.must(termQuery("actid", id)) ; break ; + case "batid" : queryBuilder.must(termQuery("batid", id)) ; break ; + case "taskid" : queryBuilder.must(termQuery("taskid", id)) ; break ; + case "filterid" : queryBuilder.must(termQuery("filterid", id)) ; break ; + case "agent" : queryBuilder.must(termQuery(Constants.CSKEFU_SYSTEM_DIS_AGENT, id)) ; break ; + case "skill" : queryBuilder.must(termQuery(Constants.CSKEFU_SYSTEM_DIS_ORGAN, id)) ; break ; + case "taskskill" : queryBuilder.must(termQuery("taskid", id)).must(termQuery("status", MainContext.NamesDisStatusType.DISAGENT.toString())) ; break ; + case "filterskill" : queryBuilder.must(termQuery("filterid", id)).must(termQuery("status", MainContext.NamesDisStatusType.DISAGENT.toString())) ; break ; + default : queryBuilder.must(termQuery("actid", "NOT_EXIST_KEY")) ; //必须传入一个进来; + } + + return search(queryBuilder, metadataTable, false, p, ps); + } + + /** + * @param orgi + * @param agent + * @param p + * @param ps + * @return + */ + public static PageImpl agentsearch(String orgi ,boolean excludeCalled , String agent , int p, int ps){ + BoolQueryBuilder queryBuilder = new BoolQueryBuilder(); + queryBuilder.must(termQuery("orgi", orgi)) ; + if(excludeCalled){ + queryBuilder.must(termQuery("callstatus", MainContext.NameStatusType.NOTCALL.toString())) ; + } + queryBuilder.must(termQuery("validresult", "valid")) ; + queryBuilder.must(termQuery(Constants.CSKEFU_SYSTEM_DIS_AGENT, agent)) ; + queryBuilder.must(termQuery("status", MainContext.NamesDisStatusType.DISAGENT.toString())) ; + + return search(queryBuilder, p, ps); + } + + /** + * + * @param orgi + * @param agent + * @param p + * @param ps + * @return + */ + public static PageImpl agentapsearch(String orgi , String agent , int p, int ps){ + BoolQueryBuilder queryBuilder = new BoolQueryBuilder(); + queryBuilder.must(termQuery("orgi", orgi)) ; + queryBuilder.must(termQuery("validresult", "valid")) ; + queryBuilder.must(termQuery(Constants.CSKEFU_SYSTEM_DIS_AGENT, agent)) ; + queryBuilder.must(termQuery("apstatus", true)) ; //预约状态 + + queryBuilder.must(rangeQuery("aptime").to(System.currentTimeMillis())) ; //预约状态 + + return search(queryBuilder, p, ps); + } + + /** + * + * @param orgi + * @param agent + * @param p + * @param ps + * @return + */ + public static PageImpl aisearch(String orgi , int p, int ps){ + BoolQueryBuilder queryBuilder = new BoolQueryBuilder(); + queryBuilder.must(termQuery("orgi", orgi)) ; + queryBuilder.must(termQuery("callstatus", MainContext.NameStatusType.NOTCALL.toString())) ; + + queryBuilder.must(termQuery("validresult", "valid")) ; + queryBuilder.must(termQuery("status", MainContext.NamesDisStatusType.DISAI.toString())) ; + + return search(queryBuilder, p, ps); + } + + + /** + * + * @param orgi + * @param agent + * @param p + * @param ps + * @return + */ + public static PageImpl namesearch(String orgi , String phonenum){ + BoolQueryBuilder queryBuilder = new BoolQueryBuilder(); + queryBuilder.must(termQuery("orgi", orgi)) ; + queryBuilder.must(termQuery("validresult", "valid")) ; + queryBuilder.must(termQuery("status", MainContext.NamesDisStatusType.DISAGENT.toString())) ; + StringBuffer strb = new StringBuffer(); + if(!StringUtils.isBlank(phonenum)) { + strb.append(phonenum) ; + if(phonenum.startsWith("0")) { + strb.append(" ").append(phonenum.substring(1)) ; + } + }else { + strb.append(Constants.CSKEFU_SYSTEM_NO_DAT) ; + } + queryBuilder.must(new QueryStringQueryBuilder(strb.toString()).defaultOperator(Operator.OR) ); + return search(queryBuilder, 0, 1); + } + + /** + * + * @param orgi + * @param agent + * @param p + * @param ps + * @return + */ + public static PageImpl search(BoolQueryBuilder queryBuilder, int p, int ps){ + return search(queryBuilder, null, true, p, ps); + } + + /** + * + * @param queryBuilder + * @param metadataTable + * @param loadRef + * @param p + * @param ps + * @return + */ + private static PageImpl search(BoolQueryBuilder queryBuilder , MetadataTable metadataTable , boolean loadRef , int p, int ps){ + ESDataExchangeImpl esDataExchange = MainContext.getContext().getBean(ESDataExchangeImpl.class); + return esDataExchange.findPageResult(queryBuilder, Constants.SYSTEM_INDEX, metadataTable, new PageRequest(p, ps , Sort.Direction.ASC, "createtime") , loadRef); + } + + /** + * + * @param queryBuilder + * @param metadataTable + * @param loadRef + * @param p + * @param ps + * @return + */ + public static PageImpl aggregation(BoolQueryBuilder queryBuilder , String aggField, boolean loadRef , int p, int ps){ + ESDataExchangeImpl esDataExchange = MainContext.getContext().getBean(ESDataExchangeImpl.class); + return esDataExchange.findAllPageAggResult(queryBuilder , aggField , new PageRequest(p, ps , Sort.Direction.ASC, "createtime") , loadRef , null); + } + + /** + * + * @param queryBuilder + * @param metadataTable + * @param loadRef + * @param p + * @param ps + * @return + */ + public static UKDataBean get(UKDataBean dataBean){ + ESDataExchangeImpl esDataExchange = MainContext.getContext().getBean(ESDataExchangeImpl.class); + return esDataExchange.getIObjectByPK(dataBean, dataBean.getId()); + } + + /** + * + * @param queryBuilder + * @param metadataTable + * @param loadRef + * @param p + * @param ps + * @return + */ + public static UKDataBean get(String type, String id){ + ESDataExchangeImpl esDataExchange = MainContext.getContext().getBean(ESDataExchangeImpl.class); + return esDataExchange.getIObjectByPK(type, id); + } + + /** + * + * @param queryBuilder + * @param metadataTable + * @param loadRef + * @param p + * @param ps + * @return + */ + public static void save(UKDataBean dataBean){ + ESDataExchangeImpl esDataExchange = MainContext.getContext().getBean(ESDataExchangeImpl.class); + try { + esDataExchange.saveIObject(dataBean); + } catch (Exception e) { + e.printStackTrace(); + } + } +}