diff --git a/contact-center/app/src/main/java/com/chatopera/cc/webim/service/repository/SNSAccountRepository.java b/contact-center/app/src/main/java/com/chatopera/cc/webim/service/repository/SNSAccountRepository.java index 1481f5f7..a25dd399 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/webim/service/repository/SNSAccountRepository.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/webim/service/repository/SNSAccountRepository.java @@ -22,6 +22,8 @@ import com.chatopera.cc.webim.web.model.SNSAccount; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; public abstract interface SNSAccountRepository extends JpaRepository @@ -43,4 +45,10 @@ public abstract interface SNSAccountRepository public abstract List findBySnstype(String snsType); public abstract Page findBySnstypeAndOrgi(String paramString ,String orgi, Pageable page); + + @Query(value = "select s from SNSAccount s where " + + "(:orgi is null or s.orgi = :orgi) and " + + "(:snsType is null or s.snstype = :snsType) and " + + "(:myorgans is null or s.organ IN :myorgans)") + public List findBySnstypeAndOrgiAndOrgans(@Param("snsType") String snsType, @Param("orgi") String orgi, @Param("myorgans") List organs); } diff --git a/contact-center/app/src/main/java/com/chatopera/cc/webim/web/handler/admin/channel/SNSAccountIMController.java b/contact-center/app/src/main/java/com/chatopera/cc/webim/web/handler/admin/channel/SNSAccountIMController.java index 61ab1da0..3910b0f8 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/webim/web/handler/admin/channel/SNSAccountIMController.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/webim/web/handler/admin/channel/SNSAccountIMController.java @@ -16,17 +16,19 @@ */ package com.chatopera.cc.webim.web.handler.admin.channel; -import java.security.NoSuchAlgorithmException; -import java.util.Date; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; -import javax.validation.Valid; - +import com.chatopera.cc.core.UKDataContext; +import com.chatopera.cc.util.Base62; import com.chatopera.cc.util.Menu; +import com.chatopera.cc.util.UKTools; +import com.chatopera.cc.webim.service.repository.ConsultInviteRepository; +import com.chatopera.cc.webim.service.repository.OrganRepository; +import com.chatopera.cc.webim.service.repository.SNSAccountRepository; import com.chatopera.cc.webim.service.repository.SecretRepository; +import com.chatopera.cc.webim.web.handler.Handler; import com.chatopera.cc.webim.web.model.CousultInvite; import com.chatopera.cc.webim.web.model.SNSAccount; +import com.chatopera.cc.webim.web.model.Secret; +import com.chatopera.cc.webim.web.model.User; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; @@ -35,13 +37,11 @@ import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; -import com.chatopera.cc.core.UKDataContext; -import com.chatopera.cc.util.Base62; -import com.chatopera.cc.util.UKTools; -import com.chatopera.cc.webim.service.repository.ConsultInviteRepository; -import com.chatopera.cc.webim.service.repository.SNSAccountRepository; -import com.chatopera.cc.webim.web.handler.Handler; -import com.chatopera.cc.webim.web.model.Secret; +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.security.NoSuchAlgorithmException; +import java.util.Date; +import java.util.List; /** * @@ -49,120 +49,130 @@ import com.chatopera.cc.webim.web.model.Secret; */ @Controller @RequestMapping("/admin/im") -public class SNSAccountIMController extends Handler{ +public class SNSAccountIMController extends Handler { - @Autowired - private SNSAccountRepository snsAccountRes; - - @Autowired - private ConsultInviteRepository invite; - - @Autowired - private SecretRepository secRes ; + @Autowired + private SNSAccountRepository snsAccountRes; + + @Autowired + private ConsultInviteRepository invite; + + @Autowired + private SecretRepository secRes; + + @Autowired + private OrganRepository organRes; @RequestMapping("/index") - @Menu(type = "admin" , subtype = "im" , access = false ,admin = true) - public ModelAndView index(ModelMap map , HttpServletRequest request , @Valid String execute) { - map.addAttribute("snsAccountList", snsAccountRes.findBySnstypeAndOrgi( UKDataContext.ChannelTypeEnum.WEBIM.toString() , super.getOrgi(request), new PageRequest(super.getP(request), super.getPs(request)))) ; - List secretConfig = secRes.findByOrgi(super.getOrgi(request)) ; - if(secretConfig!=null && secretConfig.size() > 0){ - map.addAttribute("secret", secretConfig.get(0)) ; - } - if(!StringUtils.isBlank(execute) && execute.equals("false")){ - map.addAttribute("execute", execute) ; - } - return request(super.createAdminTempletResponse("/admin/channel/im/index")); + @Menu(type = "admin", subtype = "im", access = false, admin = true) + public ModelAndView index(ModelMap map, HttpServletRequest request, @Valid String execute) { + map.addAttribute("snsAccountList", snsAccountRes.findBySnstypeAndOrgi(UKDataContext.ChannelTypeEnum.WEBIM.toString(), super.getOrgi(request), new PageRequest(super.getP(request), super.getPs(request)))); + List secretConfig = secRes.findByOrgi(super.getOrgi(request)); + if (secretConfig != null && secretConfig.size() > 0) { + map.addAttribute("secret", secretConfig.get(0)); + } + if (!StringUtils.isBlank(execute) && execute.equals("false")) { + map.addAttribute("execute", execute); + } + return request(super.createAdminTempletResponse("/admin/channel/im/index")); } - + @RequestMapping("/add") - @Menu(type = "admin" , subtype = "im" , access = false ,admin = true) - public ModelAndView add(ModelMap map , HttpServletRequest request) { + @Menu(type = "admin", subtype = "im", access = false, admin = true) + public ModelAndView add(ModelMap map, HttpServletRequest request) { return request(super.createRequestPageTempletResponse("/admin/channel/im/add")); } - + @RequestMapping("/save") - @Menu(type = "admin" , subtype = "weixin") - public ModelAndView save(HttpServletRequest request ,@Valid SNSAccount snsAccount) throws NoSuchAlgorithmException { - if(!StringUtils.isBlank(snsAccount.getBaseURL())){ - snsAccount.setSnsid(Base62.encode(snsAccount.getBaseURL()).toLowerCase()); - int count = snsAccountRes.countBySnsidAndOrgi(snsAccount.getSnsid() , super.getOrgi(request)) ; - if(count == 0){ - snsAccount.setOrgi(super.getOrgi(request)); - snsAccount.setSnstype(UKDataContext.ChannelTypeEnum.WEBIM.toString()); - snsAccount.setCreatetime(new Date()); - snsAccountRes.save(snsAccount) ; - - /** - * 同时创建CousultInvite 记录 - */ - CousultInvite coultInvite = invite.findBySnsaccountidAndOrgi(snsAccount.getSnsid(), super.getOrgi(request)) ; - if(coultInvite ==null){ - coultInvite = new CousultInvite() ; - coultInvite.setSnsaccountid(snsAccount.getSnsid()); - coultInvite.setCreate_time(new Date()); - coultInvite.setOrgi(super.getOrgi(request)); - coultInvite.setName(snsAccount.getName()); - invite.save(coultInvite) ; - } - } - } - return request(super.createRequestPageTempletResponse("redirect:/admin/im/index.html")); + @Menu(type = "admin", subtype = "weixin") + public ModelAndView save(HttpServletRequest request, @Valid SNSAccount snsAccount) throws NoSuchAlgorithmException { + if (!StringUtils.isBlank(snsAccount.getBaseURL())) { + snsAccount.setSnsid(Base62.encode(snsAccount.getBaseURL()).toLowerCase()); + int count = snsAccountRes.countBySnsidAndOrgi(snsAccount.getSnsid(), super.getOrgi(request)); + if (count == 0) { + snsAccount.setOrgi(super.getOrgi(request)); + snsAccount.setSnstype(UKDataContext.ChannelTypeEnum.WEBIM.toString()); + snsAccount.setCreatetime(new Date()); + User curr = super.getUser(request); + snsAccount.setCreater(curr.getId()); + if (curr.getOrgan() != null) { + snsAccount.setOrgan(curr.getOrgan()); + } + + snsAccountRes.save(snsAccount); + + /** + * 同时创建CousultInvite 记录 + */ + CousultInvite coultInvite = invite.findBySnsaccountidAndOrgi(snsAccount.getSnsid(), super.getOrgi(request)); + if (coultInvite == null) { + coultInvite = new CousultInvite(); + coultInvite.setSnsaccountid(snsAccount.getSnsid()); + coultInvite.setCreate_time(new Date()); + coultInvite.setOrgi(super.getOrgi(request)); + coultInvite.setName(snsAccount.getName()); + coultInvite.setOwner(snsAccount.getCreater()); + invite.save(coultInvite); + } + } + } + return request(super.createRequestPageTempletResponse("redirect:/admin/im/index.html")); } - + @RequestMapping("/delete") - @Menu(type = "weixin" , subtype = "delete") - public ModelAndView delete(ModelMap map , HttpServletRequest request , @Valid String id , @Valid String confirm) { - boolean execute = false ; - if(execute = UKTools.secConfirm(secRes, super.getOrgi(request), confirm)){ - SNSAccount snsAccount = snsAccountRes.findByIdAndOrgi(id , super.getOrgi(request)) ; - if(snsAccountRes!=null){ - snsAccountRes.delete(snsAccount); - CousultInvite coultInvite = invite.findBySnsaccountidAndOrgi(snsAccount.getSnsid(), super.getOrgi(request)) ; - if(coultInvite != null){ - invite.delete(coultInvite); - } - } - } - - return request(super.createRequestPageTempletResponse("redirect:/admin/im/index.html?execute="+execute)); + @Menu(type = "weixin", subtype = "delete") + public ModelAndView delete(ModelMap map, HttpServletRequest request, @Valid String id, @Valid String confirm) { + boolean execute = false; + if (execute = UKTools.secConfirm(secRes, super.getOrgi(request), confirm)) { + SNSAccount snsAccount = snsAccountRes.findByIdAndOrgi(id, super.getOrgi(request)); + if (snsAccountRes != null) { + snsAccountRes.delete(snsAccount); + CousultInvite coultInvite = invite.findBySnsaccountidAndOrgi(snsAccount.getSnsid(), super.getOrgi(request)); + if (coultInvite != null) { + invite.delete(coultInvite); + } + } + } + + return request(super.createRequestPageTempletResponse("redirect:/admin/im/index.html?execute=" + execute)); } - + @RequestMapping("/edit") - @Menu(type = "admin" , subtype = "im" , access = false ,admin = true) - public ModelAndView edit(ModelMap map , HttpServletRequest request , @Valid String id) { - map.addAttribute("snsAccount", snsAccountRes.findByIdAndOrgi(id , super.getOrgi(request))) ; + @Menu(type = "admin", subtype = "im", access = false, admin = true) + public ModelAndView edit(ModelMap map, HttpServletRequest request, @Valid String id) { + map.addAttribute("snsAccount", snsAccountRes.findByIdAndOrgi(id, super.getOrgi(request))); return request(super.createRequestPageTempletResponse("/admin/channel/im/edit")); } - + @RequestMapping("/update") - @Menu(type = "admin" , subtype = "im" , access = false ,admin = true) - public ModelAndView update(HttpServletRequest request ,@Valid SNSAccount snsAccount) throws NoSuchAlgorithmException { - SNSAccount oldSnsAccount = snsAccountRes.findByIdAndOrgi(snsAccount.getId() , super.getOrgi(request)); - if(oldSnsAccount!=null){ - oldSnsAccount.setName(snsAccount.getName()); - oldSnsAccount.setBaseURL(snsAccount.getBaseURL()); - oldSnsAccount.setUpdatetime(new Date()); - /** - * SNSID如果有变更,需要同时变更 CoultInvite 表的 记录 - */ - if(!StringUtils.isBlank(oldSnsAccount.getSnsid())){ - CousultInvite coultInvite = invite.findBySnsaccountidAndOrgi(oldSnsAccount.getSnsid(), super.getOrgi(request)) ; - if(coultInvite ==null){ - /** - * 同时创建CousultInvite 记录 - */ - coultInvite = new CousultInvite() ; - coultInvite.setSnsaccountid(oldSnsAccount.getSnsid()); - coultInvite.setCreate_time(new Date()); - coultInvite.setOrgi(super.getOrgi(request)); - coultInvite.setName(snsAccount.getName()); - invite.save(coultInvite) ; - } - } - - oldSnsAccount.setSnstype(UKDataContext.ChannelTypeEnum.WEBIM.toString()); - snsAccountRes.save(oldSnsAccount) ; - } - return request(super.createRequestPageTempletResponse("redirect:/admin/im/index.html")); + @Menu(type = "admin", subtype = "im", access = false, admin = true) + public ModelAndView update(HttpServletRequest request, @Valid SNSAccount snsAccount) throws NoSuchAlgorithmException { + SNSAccount oldSnsAccount = snsAccountRes.findByIdAndOrgi(snsAccount.getId(), super.getOrgi(request)); + if (oldSnsAccount != null) { + oldSnsAccount.setName(snsAccount.getName()); + oldSnsAccount.setBaseURL(snsAccount.getBaseURL()); + oldSnsAccount.setUpdatetime(new Date()); + /** + * SNSID如果有变更,需要同时变更 CoultInvite 表的 记录 + */ + if (!StringUtils.isBlank(oldSnsAccount.getSnsid())) { + CousultInvite coultInvite = invite.findBySnsaccountidAndOrgi(oldSnsAccount.getSnsid(), super.getOrgi(request)); + if (coultInvite == null) { + /** + * 同时创建CousultInvite 记录 + */ + coultInvite = new CousultInvite(); + coultInvite.setSnsaccountid(oldSnsAccount.getSnsid()); + coultInvite.setCreate_time(new Date()); + coultInvite.setOrgi(super.getOrgi(request)); + coultInvite.setName(snsAccount.getName()); + invite.save(coultInvite); + } + } + + oldSnsAccount.setSnstype(UKDataContext.ChannelTypeEnum.WEBIM.toString()); + snsAccountRes.save(oldSnsAccount); + } + return request(super.createRequestPageTempletResponse("redirect:/admin/im/index.html")); } } \ No newline at end of file diff --git a/contact-center/app/src/main/java/com/chatopera/cc/webim/web/handler/api/rest/ApiChatbotController.java b/contact-center/app/src/main/java/com/chatopera/cc/webim/web/handler/api/rest/ApiChatbotController.java index 41b9c986..464c090f 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/webim/web/handler/api/rest/ApiChatbotController.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/webim/web/handler/api/rest/ApiChatbotController.java @@ -23,10 +23,7 @@ import com.chatopera.cc.webim.util.OnlineUserUtils; import com.chatopera.cc.webim.util.chatbot.ChatbotUtils; import com.chatopera.cc.webim.web.handler.Handler; import com.chatopera.cc.webim.web.handler.api.request.RestUtils; -import com.chatopera.cc.webim.web.model.Chatbot; -import com.chatopera.cc.webim.web.model.CousultInvite; -import com.chatopera.cc.webim.web.model.Organ; -import com.chatopera.cc.webim.web.model.User; +import com.chatopera.cc.webim.web.model.*; import com.chatopera.chatbot.ChatbotAPI; import com.chatopera.chatbot.ChatbotAPIRuntimeException; import com.google.gson.JsonArray; @@ -56,6 +53,7 @@ import java.net.MalformedURLException; import java.util.ArrayList; import java.util.Date; import java.util.HashSet; +import java.util.List; @RestController @RequestMapping("/api/chatbot") @@ -114,6 +112,9 @@ public class ApiChatbotController extends Handler { case "disable": json = enable(j, false); break; + case "vacant": + json = vacant(j, curruser.getOrgi(), curruser.isSuperuser(), curruser.getMyorgans()); + break; default: json.addProperty(RestUtils.RESP_KEY_RC, RestUtils.RESP_RC_FAIL_2); json.addProperty(RestUtils.RESP_KEY_ERROR, "不合法的操作。"); @@ -122,6 +123,40 @@ public class ApiChatbotController extends Handler { return new ResponseEntity(json.toString(), headers, HttpStatus.OK); } + /** + * 获取空缺聊天机器人的网站渠道列表 + * + * @param j + * @param orgi + * @param myorgans + * @return + */ + private JsonObject vacant(final JsonObject j, String orgi, boolean isSuperuser, final HashSet myorgans) { + JsonObject resp = new JsonObject(); + if ((!isSuperuser) && (myorgans == null || myorgans.size() == 0)) { + resp.addProperty(RestUtils.RESP_KEY_RC, RestUtils.RESP_RC_SUCC); + resp.addProperty(RestUtils.RESP_KEY_ERROR, "您还未属于任何【部门】,不具有访问该资源的权限。"); + return resp; + } + + List records = snsAccountRes.findBySnstypeAndOrgiAndOrgans(ChatbotUtils.SNS_TYPE_WEBIM, orgi, myorgans != null ? new ArrayList(myorgans) : null); + JsonArray ja = new JsonArray(); + + for (SNSAccount r : records) { + if (!chatbotRes.existsBySnsAccountIdentifierAndOrgi(r.getSnsid(), orgi)) { + JsonObject o = new JsonObject(); + o.addProperty("id", r.getId()); + o.addProperty("snsid", r.getSnsid()); + o.addProperty("snsType", r.getSnstype()); + ja.add(o); + } + } + + resp.add("data", ja); + resp.addProperty(RestUtils.RESP_KEY_RC, RestUtils.RESP_RC_SUCC); + return resp; + } + /** * Enable Chatbot * diff --git a/contact-center/app/src/main/java/com/chatopera/cc/webim/web/model/SNSAccount.java b/contact-center/app/src/main/java/com/chatopera/cc/webim/web/model/SNSAccount.java index 4a2ef9ba..3dfa5ba5 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/webim/web/model/SNSAccount.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/webim/web/model/SNSAccount.java @@ -76,6 +76,8 @@ public class SNSAccount{ private boolean defaultaccount ; private String moreparam ; //改变用处,用于记录 爬虫的 爬取位置(微博)/如果是微信记录Secret private String orgi ; + private String organ; + private String creater; private String lastatupdate ; private String lastprimsgupdate ; @@ -331,4 +333,20 @@ public class SNSAccount{ public void setBaseURL(String baseURL) { this.baseURL = baseURL; } + + public String getOrgan() { + return organ; + } + + public void setOrgan(String organ) { + this.organ = organ; + } + + public String getCreater() { + return creater; + } + + public void setCreater(String creater) { + this.creater = creater; + } } diff --git a/contact-center/config/sql/cskefu-MySQL-slim.sql b/contact-center/config/sql/cskefu-MySQL-slim.sql index 3c7ec841..7425c7f7 100644 --- a/contact-center/config/sql/cskefu-MySQL-slim.sql +++ b/contact-center/config/sql/cskefu-MySQL-slim.sql @@ -3411,6 +3411,8 @@ CREATE TABLE `uk_snsaccount` ( `SESSIONKEY` varchar(255) DEFAULT NULL COMMENT '会话Key', `MOREPARAM` varchar(255) DEFAULT NULL COMMENT '更多参数', `ORGI` varchar(255) DEFAULT NULL COMMENT '租户ID', + `ORGAN` varchar(32) DEFAULT NULL COMMENT '组织机构ID', + `CREATER` varchar(32) DEFAULT NULL COMMENT '创建人ID', `DEFAULTACCOUNT` smallint(6) DEFAULT NULL COMMENT '默认账号', `lastatupdate` varchar(96) DEFAULT NULL COMMENT '最后更新时间', `lastprimsgupdate` varchar(96) DEFAULT NULL,