1
0
mirror of https://github.com/chatopera/cosin.git synced 2025-07-20 04:23:01 +08:00

fix #492 ACD logic

This commit is contained in:
Yu 2021-11-01 16:16:48 +08:00
parent 924203737d
commit dc9e06db49
9 changed files with 48 additions and 12 deletions

View File

@ -56,7 +56,7 @@
<p align="center">
<b>:yum: TA 们这样评价春松客服</b><br>
<a href="https://www.chatopera.com/customer.html" target="_blank">
<img src="./public/assets/screenshot-20211026-103937.png" width="900">
<img src="./public/assets/cskefu-2021-08-23-10.12.45-AM.jpg" width="900">
</a>
</p>

View File

@ -22,6 +22,7 @@ import com.chatopera.cc.basic.MainUtils;
import com.chatopera.cc.cache.Cache;
import com.chatopera.cc.model.*;
import com.chatopera.cc.persistence.repository.*;
import com.chatopera.cc.proxy.OrganProxy;
import com.chatopera.cc.util.HashMapUtils;
import com.chatopera.cc.util.WebIMReport;
import org.apache.commons.lang.StringUtils;
@ -57,6 +58,9 @@ public class ACDPolicyService {
@Autowired
private SNSAccountRepository snsAccountRes;
@Autowired
private OrganProxy organProxy;
/**
* 载入坐席 ACD策略配置
*
@ -234,10 +238,15 @@ public class ACDPolicyService {
*/
SNSAccount snsAccount = snsAccountRes.findBySnsidAndOrgi(agentUser.getAppid(), orgi);
Map<String, Organ> allOrgan = organProxy.findAllOrganByParentIdAndOrgi(snsAccount.getOrgan(), orgi);
// allOrgan.keySet().retainAll
// 对于该租户的所有客服
for (final Map.Entry<String, AgentStatus> entry : map.entrySet()) {
if ((!entry.getValue().isBusy()) && (entry.getValue().getUsers() < sessionConfig.getMaxuser()) && entry.getValue().getSkills().containsKey(snsAccount.getOrgan())) {
Set<String> agentSkills = entry.getValue().getSkills().keySet();
agentSkills.retainAll(allOrgan.keySet());
if ((!entry.getValue().isBusy()) && (entry.getValue().getUsers() < sessionConfig.getMaxuser()) && agentSkills.size() > 0) {
agentStatuses.add(entry.getValue());
logger.info(
"[filterOutAvailableAgentStatus] <Redundance> find ready agent {}, agentname {}, status {}, service {}/{}, skills {}",

View File

@ -21,6 +21,7 @@ import com.chatopera.cc.basic.MainUtils;
import com.chatopera.cc.controller.Handler;
import com.chatopera.cc.model.*;
import com.chatopera.cc.persistence.repository.ConsultInviteRepository;
import com.chatopera.cc.persistence.repository.OrganRepository;
import com.chatopera.cc.persistence.repository.SNSAccountRepository;
import com.chatopera.cc.persistence.repository.SecretRepository;
import com.chatopera.cc.proxy.OrganProxy;
@ -61,6 +62,9 @@ public class SNSAccountIMController extends Handler {
@Autowired
private OrganProxy organProxy;
@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, @RequestParam(name = "status", required = false) String status) {
@ -81,6 +85,8 @@ public class SNSAccountIMController extends Handler {
@RequestMapping("/add")
@Menu(type = "admin", subtype = "send", access = false, admin = true)
public ModelAndView add(ModelMap map, HttpServletRequest request) {
Organ currentOrgan = super.getOrgan(request);
map.put("organ", currentOrgan);
return request(super.createView("/admin/channel/im/add"));
}
@ -147,7 +153,10 @@ public class SNSAccountIMController extends Handler {
@RequestMapping("/edit")
@Menu(type = "admin", subtype = "send", access = false, admin = true)
public ModelAndView edit(ModelMap map, HttpServletRequest request, @Valid String id) {
map.addAttribute("snsAccount", snsAccountRes.findByIdAndOrgi(id, super.getOrgi(request)));
SNSAccount snsAccount = snsAccountRes.findByIdAndOrgi(id, super.getOrgi(request));
Organ organ = organRes.findOne(snsAccount.getOrgan());
map.put("organ", organ);
map.addAttribute("snsAccount", snsAccount);
return request(super.createView("/admin/channel/im/edit"));
}

View File

@ -49,12 +49,7 @@ import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
@ -1195,7 +1190,6 @@ public class IMController extends Handler {
return params;
}
@RequestMapping("/leavemsg/save")
@Menu(type = "admin", subtype = "user")
public ModelAndView leavemsgsave(HttpServletRequest request,

View File

@ -98,6 +98,14 @@ public class OrganProxy {
}
}
public Map<String, Organ> findAllOrganByParentIdAndOrgi(String organId, String orgi) {
Map<String, Organ> result = new HashMap<>();
if (StringUtils.isNotBlank(organId)) {
processChild(result, organId, orgi);
}
return result;
}
public Map<String, Organ> findAllOrganByParentAndOrgi(Organ organ, String orgi) {
Map<String, Organ> result = new HashMap<>();
if (organ != null) {

View File

@ -1,5 +1,13 @@
.uk-layui-form
form.layui-form(action="/admin/im/save.html", method="post")
.layui-form-item
.layui-inline
label.layui-form-label(style="width:150px;") 组织机构:
.layui-input-inline
input.layui-input(type="text", name="organ", required="", lay-verify="required", autocomplete="off",value="#{organ.name}",disabled="disabled")
.layui-form-mid.layui-word-aux
font(color="red") *
| 默认为当前组织机构,在右上角切换
.layui-form-item
.layui-inline
label.layui-form-label(style="width:150px;") 网站名称:

View File

@ -1,6 +1,14 @@
.uk-layui-form
form.layui-form(action="/admin/im/update.html", method="post")
input(type="hidden", name="id", value=snsAccount.id)
.layui-form-item
.layui-inline
label.layui-form-label(style="width:150px;") 组织机构:
.layui-input-inline
input.layui-input(type="text", name="organ", required="", lay-verify="required", autocomplete="off",value="#{organ.name}",disabled="disabled")
.layui-form-mid.layui-word-aux
font(color="red") *
| 默认为当前组织机构,在右上角切换
.layui-form-item
.layui-inline
label.layui-form-label(style="width:150px;") 网站名称:

View File

@ -7,7 +7,7 @@ block content
| 网站列表 (#{snsAccountList.totalElements})
span(style="float:right;")
if user.superadmin || user.admin
button.layui-btn.layui-btn-small.green(href="/admin/im/add.html", data-toggle="ajax", data-width="550", data-height="300", data-title="创建新网站") 创建新网站
button.layui-btn.layui-btn-small.green(href="/admin/im/add.html", data-toggle="ajax", data-width="600", data-height="300", data-title="创建新网站") 创建新网站
.ror(style="padding:5px;")
.col-lg-12
table.layui-table(lay-skin="line", style="table-layout: fixed; word-break: break-all")
@ -30,7 +30,7 @@ block content
i.layui-icon 
| 接入
if user.superadmin || user.admin
a(href="/admin/im/edit.html?id=" + snsAccount.id, data-toggle="ajax", data-width="550", data-height="300", data-title="编辑网站")
a(href="/admin/im/edit.html?id=" + snsAccount.id, data-toggle="ajax", data-width="600", data-height="300", data-title="编辑网站")
i.layui-icon 
| 编辑
if (user.superadmin || user.admin) && snsAccount.datastatus != true

Binary file not shown.

Before

Width:  |  Height:  |  Size: 184 KiB