1
0
mirror of https://github.com/chatopera/cosin.git synced 2025-08-01 16:38:02 +08:00

#76 enable fetch vacant chatbots

This commit is contained in:
Hai Liang Wang 2018-09-12 09:56:56 +08:00
parent 7bc572ae2e
commit b4dbc68109
5 changed files with 191 additions and 118 deletions

View File

@ -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<SNSAccount, String>
@ -43,4 +45,10 @@ public abstract interface SNSAccountRepository
public abstract List<SNSAccount> findBySnstype(String snsType);
public abstract Page<SNSAccount> 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<SNSAccount> findBySnstypeAndOrgiAndOrgans(@Param("snsType") String snsType, @Param("orgi") String orgi, @Param("myorgans") List<String> organs);
}

View File

@ -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<Secret> 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<Secret> 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"));
}
}

View File

@ -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<String>(json.toString(), headers, HttpStatus.OK);
}
/**
* 获取空缺聊天机器人的网站渠道列表
*
* @param j
* @param orgi
* @param myorgans
* @return
*/
private JsonObject vacant(final JsonObject j, String orgi, boolean isSuperuser, final HashSet<String> 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<SNSAccount> records = snsAccountRes.findBySnstypeAndOrgiAndOrgans(ChatbotUtils.SNS_TYPE_WEBIM, orgi, myorgans != null ? new ArrayList<String>(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
*

View File

@ -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;
}
}

View File

@ -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,