mirror of
https://github.com/chatopera/cosin.git
synced 2025-08-01 16:38:02 +08:00
Update user creation and miscs
This commit is contained in:
parent
f2898ff5b7
commit
a8f27d3b29
@ -36,7 +36,6 @@ import org.jasypt.exceptions.EncryptionOperationNotPossibleException;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.jpa.domain.Specification;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.RequestHeader;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
@ -44,18 +43,12 @@ import org.springframework.web.bind.annotation.RequestMethod;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
|
||||
import javax.persistence.criteria.CriteriaBuilder;
|
||||
import javax.persistence.criteria.CriteriaQuery;
|
||||
import javax.persistence.criteria.Predicate;
|
||||
import javax.persistence.criteria.Root;
|
||||
import javax.servlet.http.Cookie;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.Valid;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.net.URLEncoder;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
@ -289,29 +282,8 @@ public class LoginController extends Handler {
|
||||
// 获取用户部门以及下级部门
|
||||
userProxy.attachOrgansPropertiesForUser(loginUser);
|
||||
|
||||
// 获取用户的角色权限,进行授权
|
||||
List<RoleAuth> roleAuthList = roleAuthRes.findAll(new Specification<RoleAuth>() {
|
||||
@Override
|
||||
public Predicate toPredicate(
|
||||
Root<RoleAuth> root, CriteriaQuery<?> query,
|
||||
CriteriaBuilder cb) {
|
||||
List<Predicate> list = new ArrayList<Predicate>();
|
||||
if (loginUser.getRoleList() != null && loginUser.getRoleList().size() > 0) {
|
||||
for (Role role : loginUser.getRoleList()) {
|
||||
list.add(cb.equal(root.get("roleid").as(String.class), role.getId()));
|
||||
}
|
||||
}
|
||||
Predicate[] p = new Predicate[list.size()];
|
||||
cb.and(cb.equal(root.get("orgi").as(String.class), loginUser.getOrgi()));
|
||||
return cb.or(list.toArray(p));
|
||||
}
|
||||
});
|
||||
|
||||
if (roleAuthList != null) {
|
||||
for (RoleAuth roleAuth : roleAuthList) {
|
||||
loginUser.getRoleAuthMap().put(roleAuth.getDicvalue(), true);
|
||||
}
|
||||
}
|
||||
// 添加角色信息
|
||||
userProxy.attachRolesMap(loginUser);
|
||||
|
||||
loginUser.setLastlogintime(new Date());
|
||||
if (StringUtils.isNotBlank(loginUser.getId())) {
|
||||
|
@ -62,12 +62,6 @@ public class UsersController extends Handler {
|
||||
@Autowired
|
||||
private UserRoleRepository userRoleRes;
|
||||
|
||||
@Autowired
|
||||
private Cache cache;
|
||||
|
||||
@Autowired
|
||||
private UserProxy userProxy;
|
||||
|
||||
@RequestMapping("/index")
|
||||
@Menu(type = "admin", subtype = "user")
|
||||
public ModelAndView index(ModelMap map, HttpServletRequest request) throws IOException {
|
||||
@ -95,14 +89,6 @@ public class UsersController extends Handler {
|
||||
return request(super.createRequestPageTempletResponse("/admin/user/add"));
|
||||
}
|
||||
|
||||
@RequestMapping("/save")
|
||||
@Menu(type = "admin", subtype = "user")
|
||||
public ModelAndView save(HttpServletRequest request, @Valid User user) {
|
||||
String msg = userProxy.createNewUser(
|
||||
user, super.getOrgi(request), super.getUser(request).getOrgid(), super.getOrgiByTenantshare(request));
|
||||
return request(super.createRequestPageTempletResponse("redirect:/admin/user/index.html?msg=" + msg));
|
||||
}
|
||||
|
||||
@RequestMapping("/edit")
|
||||
@Menu(type = "admin", subtype = "user")
|
||||
public ModelAndView edit(ModelMap map, HttpServletRequest request, @Valid String id) {
|
||||
@ -111,93 +97,6 @@ public class UsersController extends Handler {
|
||||
return view;
|
||||
}
|
||||
|
||||
@RequestMapping("/update")
|
||||
@Menu(type = "admin", subtype = "user", admin = true)
|
||||
public ModelAndView update(HttpServletRequest request, @Valid User user) {
|
||||
User tempUser = userRepository.getOne(user.getId());
|
||||
String msg = validUserUpdate(user, tempUser);
|
||||
if (tempUser != null) {
|
||||
if (StringUtils.isNotBlank(msg) && !msg.equals("edit_user_success")) {
|
||||
return request(super.createRequestPageTempletResponse("redirect:/admin/user/index.html?msg=" + msg));
|
||||
}
|
||||
tempUser.setUname(user.getUname());
|
||||
tempUser.setUsername(user.getUsername());
|
||||
tempUser.setEmail(user.getEmail());
|
||||
tempUser.setMobile(user.getMobile());
|
||||
tempUser.setSipaccount(user.getSipaccount());
|
||||
//切换成非坐席 判断是否坐席 以及 是否有对话
|
||||
if (!user.isAgent()) {
|
||||
AgentStatus agentStatus = cache.findOneAgentStatusByAgentnoAndOrig(
|
||||
(super.getUser(request)).getId(), super.getOrgi(request));
|
||||
if (!(agentStatus == null && cache.getInservAgentUsersSizeByAgentnoAndOrgi(
|
||||
super.getUser(request).getId(), super.getOrgi(request)) == 0)) {
|
||||
return request(super.createRequestPageTempletResponse("redirect:/admin/user/index.html?msg=t1"));
|
||||
}
|
||||
}
|
||||
tempUser.setAgent(user.isAgent());
|
||||
|
||||
tempUser.setOrgi(super.getOrgiByTenantshare(request));
|
||||
|
||||
if (StringUtils.isNotBlank(super.getUser(request).getOrgid())) {
|
||||
tempUser.setOrgid(super.getUser(request).getOrgid());
|
||||
} else {
|
||||
tempUser.setOrgid(MainContext.SYSTEM_ORGI);
|
||||
}
|
||||
|
||||
tempUser.setCallcenter(user.isCallcenter());
|
||||
if (StringUtils.isNotBlank(user.getPassword())) {
|
||||
tempUser.setPassword(MainUtils.md5(user.getPassword()));
|
||||
}
|
||||
|
||||
if (tempUser.getCreatetime() == null) {
|
||||
tempUser.setCreatetime(new Date());
|
||||
}
|
||||
tempUser.setUpdatetime(new Date());
|
||||
userRepository.save(tempUser);
|
||||
OnlineUserProxy.clean(super.getOrgi(request));
|
||||
}
|
||||
return request(super.createRequestPageTempletResponse("redirect:/admin/user/index.html?msg=" + msg));
|
||||
}
|
||||
|
||||
private String validUserUpdate(User user, User oldUser) {
|
||||
String msg = "edit_user_success";
|
||||
User tempUser = userRepository.findByUsernameAndDatastatus(user.getUsername(), false);
|
||||
if (tempUser != null && !user.getUsername().equals(oldUser.getUsername())) {
|
||||
msg = "username_exist";
|
||||
return msg;
|
||||
}
|
||||
|
||||
if (StringUtils.isNotBlank(user.getEmail())) {
|
||||
tempUser = userRepository.findByEmailAndDatastatus(user.getEmail(), false);
|
||||
if (tempUser != null && !user.getEmail().equals(oldUser.getEmail())) {
|
||||
msg = "email_exist";
|
||||
return msg;
|
||||
}
|
||||
}
|
||||
|
||||
if (StringUtils.isNotBlank(user.getMobile())) {
|
||||
tempUser = userRepository.findByMobileAndDatastatus(user.getMobile(), false);
|
||||
if (tempUser != null && !user.getMobile().equals(oldUser.getMobile())) {
|
||||
msg = "mobile_exist";
|
||||
return msg;
|
||||
}
|
||||
}
|
||||
|
||||
if (!userProxy.validUserCallcenterParams(user)) {
|
||||
msg = "sip_account_exist";
|
||||
return msg;
|
||||
}
|
||||
|
||||
if (user.getUsername().equals(oldUser.getUsername()) && user.getEmail().equals(
|
||||
oldUser.getEmail()) && user.getMobile().equals(
|
||||
oldUser.getMobile()) && userProxy.validUserCallcenterParams(
|
||||
user)) {
|
||||
return "";
|
||||
}
|
||||
|
||||
return msg;
|
||||
}
|
||||
|
||||
@RequestMapping("/delete")
|
||||
@Menu(type = "admin", subtype = "user")
|
||||
public ModelAndView delete(HttpServletRequest request, @Valid User user) {
|
||||
|
@ -18,13 +18,18 @@ package com.chatopera.cc.handler.api;
|
||||
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.chatopera.cc.basic.MainContext;
|
||||
import com.chatopera.cc.basic.MainUtils;
|
||||
import com.chatopera.cc.cache.Cache;
|
||||
import com.chatopera.cc.handler.Handler;
|
||||
import com.chatopera.cc.handler.api.request.RestUtils;
|
||||
import com.chatopera.cc.model.AgentStatus;
|
||||
import com.chatopera.cc.model.OrganUser;
|
||||
import com.chatopera.cc.model.User;
|
||||
import com.chatopera.cc.persistence.repository.OrganUserRepository;
|
||||
import com.chatopera.cc.persistence.repository.UserRepository;
|
||||
import com.chatopera.cc.proxy.OnlineUserProxy;
|
||||
import com.chatopera.cc.proxy.UserProxy;
|
||||
import com.chatopera.cc.util.Menu;
|
||||
import com.chatopera.cc.util.RestResult;
|
||||
import com.chatopera.cc.util.RestResultType;
|
||||
@ -46,6 +51,7 @@ import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.validation.Valid;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@ -56,11 +62,17 @@ public class ApiUserController extends Handler {
|
||||
private final static Logger logger = LoggerFactory.getLogger(ApiUserController.class);
|
||||
|
||||
@Autowired
|
||||
private UserRepository userRepository;
|
||||
private UserRepository userRes;
|
||||
|
||||
@Autowired
|
||||
private OrganUserRepository organUserRepository;
|
||||
|
||||
@Autowired
|
||||
private UserProxy userProxy;
|
||||
|
||||
@Autowired
|
||||
private Cache cache;
|
||||
|
||||
/**
|
||||
* 返回用户列表,支持分页,分页参数为 p=1&ps=50,默认分页尺寸为 20条每页
|
||||
*
|
||||
@ -73,16 +85,16 @@ public class ApiUserController extends Handler {
|
||||
public ResponseEntity<RestResult> list(HttpServletRequest request, @Valid String id, @Valid String username) {
|
||||
Page<User> userList = null;
|
||||
if (!StringUtils.isBlank(id)) {
|
||||
userList = userRepository.findByIdAndOrgi(
|
||||
userList = userRes.findByIdAndOrgi(
|
||||
id, super.getOrgi(request), new PageRequest(super.getP(request), super.getPs(request)));
|
||||
} else {
|
||||
if (!StringUtils.isBlank(username)) {
|
||||
userList = userRepository.findByDatastatusAndOrgiAndUsernameLike(
|
||||
userList = userRes.findByDatastatusAndOrgiAndUsernameLike(
|
||||
false, super.getOrgi(request), username, new PageRequest(
|
||||
super.getP(request),
|
||||
super.getPs(request)));
|
||||
} else {
|
||||
userList = userRepository.findByDatastatusAndOrgi(
|
||||
userList = userRes.findByDatastatusAndOrgi(
|
||||
false, super.getOrgi(request), new PageRequest(super.getP(request), super.getPs(request)));
|
||||
}
|
||||
}
|
||||
@ -102,11 +114,11 @@ public class ApiUserController extends Handler {
|
||||
if (user != null && !StringUtils.isBlank(user.getUsername())) {
|
||||
if (!StringUtils.isBlank(user.getPassword())) {
|
||||
user.setPassword(MainUtils.md5(user.getPassword()));
|
||||
userRepository.save(user);
|
||||
userRes.save(user);
|
||||
} else if (!StringUtils.isBlank(user.getId())) {
|
||||
User old = userRepository.findByIdAndOrgi(user.getId(), super.getOrgi(request));
|
||||
User old = userRes.findByIdAndOrgi(user.getId(), super.getOrgi(request));
|
||||
user.setPassword(old.getPassword());
|
||||
userRepository.save(user);
|
||||
userRes.save(user);
|
||||
}
|
||||
}
|
||||
return new ResponseEntity<>(new RestResult(RestResultType.OK), HttpStatus.OK);
|
||||
@ -125,9 +137,9 @@ public class ApiUserController extends Handler {
|
||||
RestResult result = new RestResult(RestResultType.OK);
|
||||
User user = null;
|
||||
if (!StringUtils.isBlank(id)) {
|
||||
user = userRepository.findByIdAndOrgi(id, super.getOrgi(request));
|
||||
user = userRes.findByIdAndOrgi(id, super.getOrgi(request));
|
||||
if (!user.isSuperadmin()) { //系统管理员, 不允许 使用 接口删除
|
||||
userRepository.delete(user);
|
||||
userRes.delete(user);
|
||||
} else {
|
||||
result.setStatus(RestResultType.USER_DELETE);
|
||||
}
|
||||
@ -140,7 +152,7 @@ public class ApiUserController extends Handler {
|
||||
public ResponseEntity<RestResult> findByOrgan(HttpServletRequest request, @Valid String organ) {
|
||||
List<OrganUser> organUsers = organUserRepository.findByOrgan(organ);
|
||||
List<String> userids = organUsers.stream().map(p -> p.getUserid()).collect(Collectors.toList());
|
||||
List<User> users = userRepository.findAll(userids);
|
||||
List<User> users = userRes.findAll(userids);
|
||||
JSONArray json = new JSONArray();
|
||||
users.stream().forEach(u -> {
|
||||
JSONObject obj = new JSONObject();
|
||||
@ -177,6 +189,9 @@ public class ApiUserController extends Handler {
|
||||
case "create":
|
||||
json = create(request, j);
|
||||
break;
|
||||
case "update":
|
||||
json = update(request, j);
|
||||
break;
|
||||
default:
|
||||
json.addProperty(RestUtils.RESP_KEY_RC, RestUtils.RESP_RC_FAIL_2);
|
||||
json.addProperty(RestUtils.RESP_KEY_ERROR, "不合法的操作。");
|
||||
@ -187,6 +202,86 @@ public class ApiUserController extends Handler {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新用户信息
|
||||
*
|
||||
* @param request
|
||||
* @param payload
|
||||
* @return
|
||||
*/
|
||||
private JsonObject update(final HttpServletRequest request, final JsonObject payload) {
|
||||
logger.info("[update] payload {}", payload.toString());
|
||||
final User logined = super.getUser(request);
|
||||
JsonObject resp = new JsonObject();
|
||||
final User updated = userProxy.parseUserFromJson(payload);
|
||||
if (StringUtils.isBlank(updated.getId())) {
|
||||
resp.addProperty(RestUtils.RESP_KEY_RC, RestUtils.RESP_RC_FAIL_3);
|
||||
resp.addProperty(RestUtils.RESP_KEY_ERROR, "不合法的参数。");
|
||||
return resp;
|
||||
}
|
||||
|
||||
final User previous = userRes.getOne(updated.getId());
|
||||
if (previous != null) {
|
||||
String msg = userProxy.validUserUpdate(updated, previous);
|
||||
if (StringUtils.equals(msg, "edit_user_success")) {
|
||||
|
||||
// 由坐席切换成非坐席 判断是否坐席 以及 是否有对话
|
||||
if (!updated.isAgent()) {
|
||||
AgentStatus agentStatus = cache.findOneAgentStatusByAgentnoAndOrig(
|
||||
logined.getId(), logined.getOrgi());
|
||||
if (!(agentStatus == null && cache.getInservAgentUsersSizeByAgentnoAndOrgi(
|
||||
logined.getId(), logined.getOrgi()) == 0)) {
|
||||
msg = "t1";
|
||||
resp.addProperty(RestUtils.RESP_KEY_RC, RestUtils.RESP_RC_SUCC);
|
||||
resp.addProperty(RestUtils.RESP_KEY_DATA, msg);
|
||||
return resp;
|
||||
}
|
||||
}
|
||||
|
||||
// 通过验证,可以更新数据库
|
||||
previous.setUname(updated.getUname());
|
||||
previous.setUsername(updated.getUsername());
|
||||
previous.setEmail(updated.getEmail());
|
||||
previous.setMobile(updated.getMobile());
|
||||
previous.setSipaccount(updated.getSipaccount());
|
||||
|
||||
previous.setAgent(updated.isAgent());
|
||||
|
||||
previous.setOrgi(super.getOrgiByTenantshare(request));
|
||||
|
||||
if (StringUtils.isNotBlank(logined.getOrgid())) {
|
||||
previous.setOrgid(logined.getOrgid());
|
||||
} else {
|
||||
previous.setOrgid(MainContext.SYSTEM_ORGI);
|
||||
}
|
||||
|
||||
previous.setCallcenter(updated.isCallcenter());
|
||||
if (StringUtils.isNotBlank(updated.getPassword())) {
|
||||
previous.setPassword(MainUtils.md5(updated.getPassword()));
|
||||
}
|
||||
|
||||
final Date now = new Date();
|
||||
if (previous.getCreatetime() == null) {
|
||||
previous.setCreatetime(now);
|
||||
}
|
||||
previous.setUpdatetime(now);
|
||||
previous.setAdmin(updated.isAdmin());
|
||||
previous.setSuperadmin(false);
|
||||
userRes.save(previous);
|
||||
OnlineUserProxy.clean(logined.getOrgi());
|
||||
}
|
||||
|
||||
resp.addProperty(RestUtils.RESP_KEY_RC, RestUtils.RESP_RC_SUCC);
|
||||
resp.addProperty(RestUtils.RESP_KEY_DATA, msg);
|
||||
|
||||
} else {
|
||||
resp.addProperty(RestUtils.RESP_KEY_RC, RestUtils.RESP_RC_FAIL_4);
|
||||
resp.addProperty(RestUtils.RESP_KEY_ERROR, "Previous user not exist.");
|
||||
}
|
||||
|
||||
return resp;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建新用户
|
||||
*
|
||||
@ -195,14 +290,25 @@ public class ApiUserController extends Handler {
|
||||
* @return
|
||||
*/
|
||||
private JsonObject create(final HttpServletRequest request, final JsonObject payload) {
|
||||
logger.info("[create] payload {}", payload.toString());
|
||||
final User logined = super.getUser(request);
|
||||
JsonObject resp = new JsonObject();
|
||||
|
||||
// 从payload中创建User
|
||||
User newUser = null;
|
||||
// 创建新用户时,阻止传入ID
|
||||
payload.remove("id");
|
||||
newUser = userProxy.parseUserFromJson(payload);
|
||||
final String msg = userProxy.createNewUser(
|
||||
newUser, logined.getOrgi(), logined.getOrgid(), super.getOrgiByTenantshare(request));
|
||||
|
||||
|
||||
// if (payload) {
|
||||
// return resp;
|
||||
// }
|
||||
if (StringUtils.isNotBlank(msg)) {
|
||||
resp.addProperty(RestUtils.RESP_KEY_RC, RestUtils.RESP_RC_SUCC);
|
||||
resp.addProperty(RestUtils.RESP_KEY_DATA, msg);
|
||||
} else {
|
||||
resp.addProperty(RestUtils.RESP_KEY_RC, RestUtils.RESP_RC_FAIL_3);
|
||||
resp.addProperty(RestUtils.RESP_KEY_ERROR, "Unexpected response.");
|
||||
}
|
||||
|
||||
return resp;
|
||||
}
|
||||
|
@ -1126,7 +1126,7 @@
|
||||
|
||||
|
||||
// 选择当前用户的默认技能组
|
||||
Set<String> organs = super.getUser(request).getOrgans().keySet();
|
||||
Set<String> organs = logined.getOrgans().keySet();
|
||||
String currentOrgan = organs.size() > 0 ? (new ArrayList<String>(organs)).get(0) : null;
|
||||
|
||||
if (StringUtils.isBlank(currentOrgan)) {
|
||||
|
@ -45,7 +45,7 @@ import java.util.List;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("/setting")
|
||||
public class IMAgentController extends Handler {
|
||||
public class AgentSettingsController extends Handler {
|
||||
|
||||
@Autowired
|
||||
private SessionConfigRepository sessionConfigRes;
|
||||
@ -110,6 +110,8 @@ public class IMAgentController extends Handler {
|
||||
MainUtils.copyProperties(sessionConfig, tempSessionConfig);
|
||||
}
|
||||
tempSessionConfig.setOrgi(super.getOrgi(request));
|
||||
// 强制开启满意度问卷
|
||||
tempSessionConfig.setSatisfaction(true);
|
||||
sessionConfigRes.save(tempSessionConfig);
|
||||
|
||||
cache.putSessionConfigByOrgi(tempSessionConfig, orgi);
|
@ -24,6 +24,7 @@ import com.chatopera.cc.config.MessagingServerConfigure;
|
||||
import com.chatopera.cc.model.Dict;
|
||||
import com.chatopera.cc.model.SystemConfig;
|
||||
import com.chatopera.cc.model.User;
|
||||
import com.chatopera.cc.proxy.UserProxy;
|
||||
import com.chatopera.cc.util.Menu;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
@ -37,8 +38,8 @@ import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
public class UserInterceptorHandler extends HandlerInterceptorAdapter {
|
||||
|
||||
private final static Logger logger = LoggerFactory.getLogger(UserInterceptorHandler.class);
|
||||
private static UserProxy userProxy;
|
||||
|
||||
private static Integer webimport;
|
||||
|
||||
@ -51,6 +52,15 @@ public class UserInterceptorHandler extends HandlerInterceptorAdapter {
|
||||
HandlerMethod handlerMethod = (HandlerMethod) handler;
|
||||
Menu menu = handlerMethod.getMethod().getAnnotation(Menu.class);
|
||||
if (user != null || (menu != null && menu.access()) || handlerMethod.getBean() instanceof BasicErrorController) {
|
||||
/**
|
||||
* 每次刷新用户的组织机构、角色和权限
|
||||
*/
|
||||
getUserProxy().attachOrgansPropertiesForUser(user);
|
||||
// 添加角色信息
|
||||
getUserProxy().attachRolesMap(user);
|
||||
|
||||
request.getSession(true).removeAttribute(Constants.USER_SESSION_NAME);
|
||||
request.getSession(true).setAttribute(Constants.USER_SESSION_NAME, user);
|
||||
filter = true;
|
||||
}
|
||||
|
||||
@ -159,4 +169,11 @@ public class UserInterceptorHandler extends HandlerInterceptorAdapter {
|
||||
return webimport;
|
||||
}
|
||||
|
||||
|
||||
public static UserProxy getUserProxy() {
|
||||
if (userProxy == null) {
|
||||
userProxy = MainContext.getContext().getBean(UserProxy.class);
|
||||
}
|
||||
return userProxy;
|
||||
}
|
||||
}
|
||||
|
@ -14,11 +14,10 @@ package com.chatopera.cc.proxy;
|
||||
import com.chatopera.cc.basic.Constants;
|
||||
import com.chatopera.cc.basic.MainContext;
|
||||
import com.chatopera.cc.basic.MainUtils;
|
||||
import com.chatopera.cc.model.Organ;
|
||||
import com.chatopera.cc.model.OrganUser;
|
||||
import com.chatopera.cc.model.User;
|
||||
import com.chatopera.cc.model.*;
|
||||
import com.chatopera.cc.persistence.repository.OrganRepository;
|
||||
import com.chatopera.cc.persistence.repository.OrganUserRepository;
|
||||
import com.chatopera.cc.persistence.repository.RoleAuthRepository;
|
||||
import com.chatopera.cc.persistence.repository.UserRepository;
|
||||
import com.google.gson.JsonObject;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
@ -27,8 +26,13 @@ import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.jpa.domain.Specification;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.persistence.criteria.CriteriaBuilder;
|
||||
import javax.persistence.criteria.CriteriaQuery;
|
||||
import javax.persistence.criteria.Predicate;
|
||||
import javax.persistence.criteria.Root;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
@ -47,6 +51,9 @@ public class UserProxy {
|
||||
@Autowired
|
||||
private UserRepository userRes;
|
||||
|
||||
@Autowired
|
||||
private RoleAuthRepository roleAuthRes;
|
||||
|
||||
/**
|
||||
* 创建新用户
|
||||
* 支持多租户
|
||||
@ -214,22 +221,78 @@ public class UserProxy {
|
||||
* @return
|
||||
*/
|
||||
public boolean validUserCallcenterParams(final User user) {
|
||||
if (user.isCallcenter() && MainContext.hasModule(Constants.CSKEFU_MODULE_CALLOUT)) {
|
||||
return (!userRes.findOneBySipaccountAndDatastatus(
|
||||
user.getSipaccount(), false).isPresent()) || user.getSipaccount() == "";
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 检查用户更新是否合理
|
||||
*
|
||||
* @param user
|
||||
* @param oldUser
|
||||
* @return
|
||||
*/
|
||||
public String validUserUpdate(final User user, final User oldUser) {
|
||||
String msg = "edit_user_success";
|
||||
User tempUser = userRes.findByUsernameAndDatastatus(user.getUsername(), false);
|
||||
|
||||
if (!StringUtils.equals(user.getUsername(), oldUser.getUsername()) && tempUser != null && (!StringUtils.equals(
|
||||
oldUser.getId(), tempUser.getId()))) {
|
||||
// 用户名发生变更,并且数据库里有其它用户占用该用户名
|
||||
msg = "username_exist";
|
||||
return msg;
|
||||
}
|
||||
|
||||
if (StringUtils.isNotBlank(user.getEmail())) {
|
||||
tempUser = userRes.findByEmailAndDatastatus(user.getEmail(), false);
|
||||
if (!StringUtils.equals(user.getEmail(), oldUser.getEmail()) && tempUser != null && (!StringUtils.equals(
|
||||
oldUser.getId(), tempUser.getId()))) {
|
||||
msg = "email_exist";
|
||||
return msg;
|
||||
}
|
||||
}
|
||||
|
||||
if (StringUtils.isNotBlank(user.getMobile())) {
|
||||
tempUser = userRes.findByMobileAndDatastatus(user.getMobile(), false);
|
||||
if (!StringUtils.equals(user.getMobile(), oldUser.getMobile()) && tempUser != null && (!StringUtils.equals(
|
||||
oldUser.getId(), tempUser.getId()))) {
|
||||
msg = "mobile_exist";
|
||||
return msg;
|
||||
}
|
||||
}
|
||||
|
||||
if (user.isCallcenter() && MainContext.hasModule(Constants.CSKEFU_MODULE_CALLOUT)) {
|
||||
if (StringUtils.isNotBlank(user.getSipaccount())) {
|
||||
Optional<User> opt = userRes.findOneBySipaccountAndDatastatus(
|
||||
user.getSipaccount(), false);
|
||||
if (opt.isPresent() && (!StringUtils.equals(opt.get().getId(), user.getId()))) {
|
||||
msg = "sip_account_exist";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return msg;
|
||||
}
|
||||
|
||||
/**
|
||||
* 从Json中创建User
|
||||
*
|
||||
* @param json
|
||||
* @return
|
||||
*/
|
||||
private User exetractUserFromJson(final JsonObject json) {
|
||||
public User parseUserFromJson(final JsonObject json) {
|
||||
User tempUser = new User();
|
||||
|
||||
// 手机号
|
||||
if (json.has("id")) {
|
||||
String val = json.get("id").getAsString();
|
||||
if (StringUtils.isNotBlank(val)) {
|
||||
tempUser.setId(val);
|
||||
}
|
||||
}
|
||||
|
||||
// 用户名,用于登录
|
||||
if (json.has("username")) {
|
||||
String val = json.get("username").getAsString();
|
||||
if (StringUtils.isNotBlank(val)) {
|
||||
@ -237,6 +300,7 @@ public class UserProxy {
|
||||
}
|
||||
}
|
||||
|
||||
// 姓名
|
||||
if (json.has("uname")) {
|
||||
String val = json.get("uname").getAsString();
|
||||
if (StringUtils.isNotBlank(val)) {
|
||||
@ -244,6 +308,7 @@ public class UserProxy {
|
||||
}
|
||||
}
|
||||
|
||||
// 邮件
|
||||
if (json.has("email")) {
|
||||
String val = json.get("email").getAsString();
|
||||
if (StringUtils.isNotBlank(val)) {
|
||||
@ -251,6 +316,7 @@ public class UserProxy {
|
||||
}
|
||||
}
|
||||
|
||||
// 手机号
|
||||
if (json.has("mobile")) {
|
||||
String val = json.get("mobile").getAsString();
|
||||
if (StringUtils.isNotBlank(val)) {
|
||||
@ -259,7 +325,61 @@ public class UserProxy {
|
||||
}
|
||||
|
||||
// 密码
|
||||
if (json.has("password")) {
|
||||
String val = json.get("password").getAsString();
|
||||
if (StringUtils.isNotBlank(val)) {
|
||||
tempUser.setPassword(val);
|
||||
}
|
||||
}
|
||||
|
||||
// 是否是坐席
|
||||
if (json.has("agent")) {
|
||||
String val = json.get("agent").getAsString();
|
||||
if (StringUtils.isNotBlank(val) && StringUtils.equals("1", val)) {
|
||||
tempUser.setAgent(true);
|
||||
} else {
|
||||
tempUser.setAgent(false);
|
||||
}
|
||||
} else {
|
||||
tempUser.setAgent(false);
|
||||
}
|
||||
|
||||
// 是否是管理员
|
||||
if (json.has("admin")) {
|
||||
String val = json.get("admin").getAsString();
|
||||
if (StringUtils.isNotBlank(val) && StringUtils.equals("1", val)) {
|
||||
// 管理员默认就是坐席
|
||||
tempUser.setAdmin(true);
|
||||
tempUser.setAgent(true);
|
||||
} else {
|
||||
tempUser.setAdmin(false);
|
||||
}
|
||||
} else {
|
||||
tempUser.setAdmin(false);
|
||||
}
|
||||
|
||||
// 是否是呼叫中心
|
||||
if (json.has("callcenter")) {
|
||||
String val = json.get("callcenter").getAsString();
|
||||
if (StringUtils.isNotBlank(val) && StringUtils.equals("1", val)) {
|
||||
tempUser.setCallcenter(true);
|
||||
} else {
|
||||
tempUser.setCallcenter(false);
|
||||
}
|
||||
} else {
|
||||
tempUser.setCallcenter(false);
|
||||
}
|
||||
|
||||
// 是否有SIP电话
|
||||
if (json.has("sipAccount")) {
|
||||
String val = json.get("sipAccount").getAsString();
|
||||
if (StringUtils.isNotBlank(val)) {
|
||||
tempUser.setSipaccount(val);
|
||||
}
|
||||
}
|
||||
|
||||
// 不允许创建超级管理员
|
||||
tempUser.setSuperadmin(false);
|
||||
|
||||
return tempUser;
|
||||
}
|
||||
@ -271,7 +391,7 @@ public class UserProxy {
|
||||
* @return
|
||||
*/
|
||||
public String validUser(final User user) {
|
||||
String msg = "";
|
||||
String msg = "new_user_success";
|
||||
User tempUser = userRes.findByUsernameAndDatastatus(user.getUsername(), false);
|
||||
if (tempUser != null) {
|
||||
msg = "username_exist";
|
||||
@ -294,14 +414,14 @@ public class UserProxy {
|
||||
}
|
||||
}
|
||||
|
||||
if (!validUserCallcenterParams(user)) {
|
||||
msg = "sip_account_exist";
|
||||
return msg;
|
||||
}
|
||||
|
||||
if (tempUser == null && validUserCallcenterParams(user)) {
|
||||
msg = "new_user_success";
|
||||
return msg;
|
||||
if (user.isCallcenter() && MainContext.hasModule(Constants.CSKEFU_MODULE_CALLOUT)) {
|
||||
if (StringUtils.isNotBlank(user.getSipaccount())) {
|
||||
if (userRes.findOneBySipaccountAndDatastatus(
|
||||
user.getSipaccount(), false).isPresent()) {
|
||||
msg = "sip_account_exist";
|
||||
return msg;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return msg;
|
||||
@ -358,6 +478,36 @@ public class UserProxy {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 增加用户的角色信息
|
||||
* @param user
|
||||
*/
|
||||
public void attachRolesMap(final User user) {
|
||||
// 获取用户的角色权限,进行授权
|
||||
List<RoleAuth> roleAuthList = roleAuthRes.findAll(new Specification<RoleAuth>() {
|
||||
@Override
|
||||
public Predicate toPredicate(
|
||||
Root<RoleAuth> root, CriteriaQuery<?> query,
|
||||
CriteriaBuilder cb) {
|
||||
List<Predicate> list = new ArrayList<Predicate>();
|
||||
if (user.getRoleList() != null && user.getRoleList().size() > 0) {
|
||||
for (Role role : user.getRoleList()) {
|
||||
list.add(cb.equal(root.get("roleid").as(String.class), role.getId()));
|
||||
}
|
||||
}
|
||||
Predicate[] p = new Predicate[list.size()];
|
||||
cb.and(cb.equal(root.get("orgi").as(String.class), user.getOrgi()));
|
||||
return cb.or(list.toArray(p));
|
||||
}
|
||||
});
|
||||
|
||||
if (roleAuthList != null) {
|
||||
for (RoleAuth roleAuth : roleAuthList) {
|
||||
user.getRoleAuthMap().put(roleAuth.getDicvalue(), true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获得一个部门及其子部门并添加到User的myorgans中
|
||||
*
|
||||
|
@ -0,0 +1,40 @@
|
||||
/**
|
||||
* 创建或更新系统用户信息
|
||||
* @param responsecode
|
||||
* @param cb
|
||||
*/
|
||||
function processUserAddOrUpdateResult(responsecode, cb){
|
||||
switch (responsecode) {
|
||||
case 'username_exist':
|
||||
layer.msg('用户名存在,请重新填写',{icon: 2, time: 3000});
|
||||
// 清空用户名
|
||||
$('input[name="username"]').val("");
|
||||
break;
|
||||
case 'email_exist':
|
||||
layer.msg('邮件存在,请重新填写',{icon: 2, time: 3000});
|
||||
// 清空邮件
|
||||
$('input[name="email"]').val("");
|
||||
break;
|
||||
case 'mobile_exist':
|
||||
layer.msg('手机存在,请重新填写',{icon: 2, time: 3000});
|
||||
// 清空手机号
|
||||
$('input[name="mobile"]').val("");
|
||||
break;
|
||||
case 'sip_account_exist':
|
||||
layer.msg('SIP地址已经存在,请重新填写',{icon: 2, time: 3000});
|
||||
// 清空SIP
|
||||
$('input[name="sipaccount"]').val("");
|
||||
break;
|
||||
case 't1':
|
||||
layer.msg('当前用户坐席就绪或对话未结束,不能切换为非坐席',{icon: 2, time: 3000});
|
||||
break;
|
||||
case 'new_user_success':
|
||||
layer.msg('新用户创建成功',{icon: 1, time: 1000});
|
||||
cb();
|
||||
break;
|
||||
case 'edit_user_success':
|
||||
layer.msg('用户编辑成功',{icon: 1, time: 1000});
|
||||
cb();
|
||||
break;
|
||||
}
|
||||
}
|
@ -40,6 +40,10 @@ function restApiRequest(opts) {
|
||||
.done(function (data) {
|
||||
// console.log('Rest api 返回的值:', data);
|
||||
if(!silent) layer.close(popup);
|
||||
if(data.status){
|
||||
// not reject or resolve, expected user login again.
|
||||
return handleRestApiFail(data.status);
|
||||
}
|
||||
resolve(data);
|
||||
})
|
||||
.fail(function (jqXHR, textStatus ) {
|
||||
|
@ -34,12 +34,13 @@
|
||||
<input type="mobile" name="mobile" placeholder="请输入手机号码" autocomplete="off" class="layui-input">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">管理员:</label>
|
||||
<div class="layui-input-inline">
|
||||
<input type="checkbox" name="admin" lay-skin="switch" lay-filter="admincheckbox" value="1" lay-text="是|否">
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">管理员具备访问和修改所有系统资源的权限,同时也设定为多媒体坐席</div>
|
||||
</div>
|
||||
<div class="layui-form-item" id="agentDiv">
|
||||
<label class="layui-form-label">多媒体坐席:</label>
|
||||
@ -61,13 +62,13 @@
|
||||
<div class="layui-form-button">
|
||||
<div class="layui-button-block">
|
||||
<button class="layui-btn" lay-submit lay-filter="sys-user-create">提交</button>
|
||||
<!-- <button class="layui-btn" lay-submit lay-filter="sys-user-create-follow">提交并创建下一个</button>-->
|
||||
<button class="layui-btn" lay-submit lay-filter="sys-user-create-follow">提交并创建下一个</button>
|
||||
<button type="reset" class="layui-btn layui-btn-warm">重置</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
|
||||
<script>
|
||||
|
||||
layui.use('form', function(){
|
||||
@ -96,6 +97,22 @@ layui.use('form', function(){
|
||||
}
|
||||
});
|
||||
|
||||
// 当账号为管理员类型时,强制设定为坐席!
|
||||
form.on('switch(admincheckbox)', function(data){
|
||||
if(data.elem.checked){
|
||||
// 坐席的按钮
|
||||
if($('#agentDiv > div > div > em').text() == "关闭"){
|
||||
// 之前未开启
|
||||
document.querySelector('#agentDiv > div > div > i').click();
|
||||
}
|
||||
// 设置为禁用
|
||||
$("#agentDiv > div > input[name=agent]").attr('disabled', 'disabled');
|
||||
} else {
|
||||
// 取消禁用
|
||||
$("#agentDiv > div > input[name=agent]").removeAttr('disabled');
|
||||
}
|
||||
});
|
||||
|
||||
// 默认隐藏“呼叫中心坐席”
|
||||
$('#callcenterDiv').hide();
|
||||
$('#sipAccountDiv').hide();
|
||||
@ -124,16 +141,48 @@ layui.use('form', function(){
|
||||
});
|
||||
|
||||
form.on('submit(sys-user-create)', function (data) {
|
||||
// TODO use RestAPI
|
||||
// console.log(data.field)
|
||||
return true;
|
||||
})
|
||||
data.field['ops'] = 'create';
|
||||
restApiRequest({
|
||||
silent: true,
|
||||
path: 'user',
|
||||
data: data.field
|
||||
}).then(function(result){
|
||||
if(result.rc == 0){
|
||||
processUserAddOrUpdateResult(result.data, function () {
|
||||
// close win
|
||||
// 关闭form
|
||||
$("#layui-layer2 > span.layui-layer-setwin > a.layui-layer-close1").click();
|
||||
// 刷新页面
|
||||
document.getElementById("admin").contentWindow.location = '/admin/user/index.html';
|
||||
});
|
||||
}
|
||||
}, function(err){
|
||||
handleRestApiFail(err);
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
// // 保存成功后,继续留在当前页面,重制并创建下一个
|
||||
// form.on('submit(sys-user-create-follow)', function (data) {
|
||||
// // TODO use RestAPI
|
||||
// console.log(data.field)
|
||||
// return false;
|
||||
// })
|
||||
// 保存成功后,继续留在当前页面,重制并创建下一个
|
||||
form.on('submit(sys-user-create-follow)', function (data) {
|
||||
data.field['ops'] = 'create';
|
||||
restApiRequest({
|
||||
silent: true,
|
||||
path: 'user',
|
||||
data: data.field
|
||||
}).then(function(result){
|
||||
if(result.rc == 0){
|
||||
processUserAddOrUpdateResult(result.data, function () {
|
||||
// 清空部分参数
|
||||
$('input[name="username"]').val("");
|
||||
$('input[name="uname"]').val("");
|
||||
$('input[name="mobile"]').val("");
|
||||
$('input[name="email"]').val("");
|
||||
});
|
||||
}
|
||||
}, function(err){
|
||||
handleRestApiFail(err);
|
||||
});
|
||||
return false;
|
||||
})
|
||||
});
|
||||
</script>
|
||||
|
@ -41,6 +41,7 @@
|
||||
<div class="layui-input-inline">
|
||||
<input type="checkbox" name="admin" lay-skin="switch" value="1" lay-filter="admincheckbox" lay-text="是|否" <#if userData.admin>checked="checked"</#if>>
|
||||
</div>
|
||||
<div class="layui-form-mid layui-word-aux">管理员具备访问和修改所有系统资源的权限,同时也设定为多媒体坐席</div>
|
||||
</div>
|
||||
<div class="layui-form-item" id="agentDiv">
|
||||
<div class="layui-form-item">
|
||||
@ -63,8 +64,7 @@
|
||||
</#if>
|
||||
<div class="layui-form-button">
|
||||
<div class="layui-button-block">
|
||||
<button class="layui-btn" lay-submit lay-filter="formDemo">立即提交</button>
|
||||
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
|
||||
<button class="layui-btn" lay-submit lay-filter="sys-user-update">立即提交</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
@ -102,6 +102,22 @@ layui.use('form', function(){
|
||||
$('#sipAccountDiv').hide();
|
||||
}
|
||||
|
||||
// 当账号为管理员类型时,强制设定为坐席!
|
||||
form.on('switch(admincheckbox)', function(data){
|
||||
if(data.elem.checked){
|
||||
// 坐席的按钮
|
||||
if($('#agentDiv > div > div > div > em').text() == "关闭"){
|
||||
// 之前未开启
|
||||
document.querySelector('#agentDiv > div > div > div > i').click();
|
||||
}
|
||||
// 设置为禁用
|
||||
$("#agentDiv > div > div > input[name=agent]").attr('disabled', 'disabled');
|
||||
} else {
|
||||
// 取消禁用
|
||||
$("#agentDiv > div > div > input[name=agent]").removeAttr('disabled');
|
||||
}
|
||||
});
|
||||
|
||||
// 根据“多媒体坐席”显示“呼叫中心坐席”状态
|
||||
form.on('switch(agent)', function(data){
|
||||
$("input[name=callcenter]").prop("checked", false);
|
||||
@ -124,5 +140,27 @@ layui.use('form', function(){
|
||||
$('#sipAccountDiv').hide();
|
||||
}
|
||||
});
|
||||
|
||||
// 处理表单提交
|
||||
form.on('submit(sys-user-update)', function (data) {
|
||||
data.field['ops'] = 'update';
|
||||
restApiRequest({
|
||||
silent: true,
|
||||
path: 'user',
|
||||
data: data.field
|
||||
}).then(function(result){
|
||||
if(result.rc == 0){
|
||||
processUserAddOrUpdateResult(result.data, function () {
|
||||
$("span.layui-layer-setwin > a.layui-layer-close1").click();
|
||||
// 关闭并刷新页面
|
||||
document.getElementById("admin").contentWindow.location = '/admin/user/index.html';
|
||||
});
|
||||
}
|
||||
}, function(err){
|
||||
handleRestApiFail(err);
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
});
|
||||
</script>
|
||||
|
@ -32,6 +32,7 @@
|
||||
<script src="/js/CSKeFu_IM.v1.js"></script>
|
||||
<script src="/js/CSKeFu_Rest_Request.v1.js"></script>
|
||||
<script src="/js/CSKeFu_Agent_State.v1.js"></script>
|
||||
<script src="/js/CSKeFu_Admin.v1.js"></script>
|
||||
|
||||
<#if models?seq_contains("callout")>
|
||||
<script src="/js/CSKeFu_Callout.v1.js"></script>
|
||||
|
@ -6,6 +6,7 @@
|
||||
<div class="layui-body">
|
||||
<div class="layui-side-scroll">
|
||||
<form method="post" key="set-mine" enctype="multipart/form-data" action="/setting/agent/sessionconfig/save.html" class="layui-form">
|
||||
<input type="hidden" name="satisfaction" value="1">
|
||||
<#if sessionConfig??><input type="hidden" name="id" value="${sessionConfig.id!''}"></#if>
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
@ -18,7 +19,7 @@
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
<div class="ukefu-webim-prop">
|
||||
<div class="ukefu-webim-tl" style="clear:both;">1、人工坐席接入欢迎消息(非WEBIM渠道适用)</div>
|
||||
<div class="ukefu-webim-tl" style="clear:both;">人工坐席接入欢迎消息(非WEBIM渠道适用)</div>
|
||||
<div class="box-item">
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
@ -28,7 +29,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="ukefu-webim-prop">
|
||||
<div class="ukefu-webim-tl" style="clear:both;">2、无坐席在线提示消息</div>
|
||||
<div class="ukefu-webim-tl" style="clear:both;">无坐席在线提示消息</div>
|
||||
<div class="box-item">
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
@ -38,7 +39,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="ukefu-webim-prop">
|
||||
<div class="ukefu-webim-tl" style="clear:both;">3、坐席忙时提示消息(排队位置请使用{num}替换)</div>
|
||||
<div class="ukefu-webim-tl" style="clear:both;">坐席忙时提示消息(排队位置请使用{num}替换)</div>
|
||||
<div class="box-item">
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
@ -48,7 +49,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="ukefu-webim-prop">
|
||||
<div class="ukefu-webim-tl" style="clear:both;">4、人工坐席分配成功提示消息(坐席使用{agent}替换)</div>
|
||||
<div class="ukefu-webim-tl" style="clear:both;">人工坐席分配成功提示消息(坐席使用{agent}替换)</div>
|
||||
<div class="box-item">
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
@ -58,7 +59,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="ukefu-webim-prop">
|
||||
<div class="ukefu-webim-tl" style="clear:both;">5、坐席服务结束提示消息</div>
|
||||
<div class="ukefu-webim-tl" style="clear:both;">坐席服务结束提示消息</div>
|
||||
<div class="box-item">
|
||||
<div class="row">
|
||||
<div class="col-lg-12">
|
||||
@ -68,7 +69,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="ukefu-webim-prop">
|
||||
<div class="ukefu-webim-tl" style="clear:both;">6、坐席分配策略</div>
|
||||
<div class="ukefu-webim-tl" style="clear:both;">坐席分配策略</div>
|
||||
<div class="box-item">
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
@ -87,7 +88,7 @@
|
||||
</div>
|
||||
|
||||
<div class="ukefu-webim-prop">
|
||||
<div class="ukefu-webim-tl" style="clear:both;">7、坐席分配最大访客数量</div>
|
||||
<div class="ukefu-webim-tl" style="clear:both;">坐席分配最大访客数量</div>
|
||||
<div class="box-item">
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
@ -113,7 +114,7 @@
|
||||
</div>
|
||||
|
||||
<div class="ukefu-webim-prop">
|
||||
<div class="ukefu-webim-tl" style="clear:both;">8、坐席就绪时分配最大访客数量</div>
|
||||
<div class="ukefu-webim-tl" style="clear:both;">坐席就绪时分配最大访客数量</div>
|
||||
<div class="box-item">
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
@ -139,7 +140,7 @@
|
||||
</div>
|
||||
|
||||
<div class="ukefu-webim-prop">
|
||||
<div class="ukefu-webim-tl" style="clear:both;">9、历史服务坐席优先分配</div>
|
||||
<div class="ukefu-webim-tl" style="clear:both;">历史服务坐席优先分配</div>
|
||||
<div class="box-item">
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
@ -154,7 +155,7 @@
|
||||
</div>
|
||||
|
||||
<div class="ukefu-webim-prop">
|
||||
<div class="ukefu-webim-tl" style="clear:both;">10、客户超时提醒</div>
|
||||
<div class="ukefu-webim-tl" style="clear:both;">客户超时提醒</div>
|
||||
<div class="box-item">
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
@ -190,7 +191,7 @@
|
||||
|
||||
|
||||
<div class="ukefu-webim-prop">
|
||||
<div class="ukefu-webim-tl" style="clear:both;">11、客户超时提醒后再次超时</div>
|
||||
<div class="ukefu-webim-tl" style="clear:both;">客户超时提醒后再次超时</div>
|
||||
<div class="box-item">
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
@ -225,7 +226,7 @@
|
||||
</div>
|
||||
|
||||
<div class="ukefu-webim-prop">
|
||||
<div class="ukefu-webim-tl" style="clear:both;">12、坐席回复超时</div>
|
||||
<div class="ukefu-webim-tl" style="clear:both;">坐席回复超时</div>
|
||||
<div class="box-item">
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
@ -260,7 +261,7 @@
|
||||
</div>
|
||||
|
||||
<div class="ukefu-webim-prop">
|
||||
<div class="ukefu-webim-tl" style="clear:both;">13、启用工作时间段设置</div>
|
||||
<div class="ukefu-webim-tl" style="clear:both;">启用工作时间段设置</div>
|
||||
<div class="box-item">
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
@ -369,22 +370,7 @@
|
||||
</div>
|
||||
|
||||
<div class="ukefu-webim-prop">
|
||||
<div class="ukefu-webim-tl" style="clear:both;">14、启用满意度调查</div>
|
||||
<div class="box-item">
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
<p>启用此功能后,客户在结束对话的时候,提示选择满意度</p>
|
||||
<p style="color:#888888;font-size:13px;margin-top:10px;">满意度调查功能,所有实时渠道适用(WebIM,微信)</p>
|
||||
</div>
|
||||
<div class="col-lg-4" style="text-align:right;">
|
||||
<input type="checkbox" title="启用" name="satisfaction" id="satisfaction" <#if sessionConfig?? && sessionConfig.satisfaction == true>checked="checked"</#if>>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="ukefu-webim-prop">
|
||||
<div class="ukefu-webim-tl" style="clear:both;">15、排队超时设置</div>
|
||||
<div class="ukefu-webim-tl" style="clear:both;">排队超时设置</div>
|
||||
<div class="box-item">
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
@ -427,7 +413,7 @@
|
||||
</div>
|
||||
|
||||
<!-- <div class="ukefu-webim-prop">-->
|
||||
<!-- <div class="ukefu-webim-tl" style="clear:both;">17、关闭或刷新浏览器坐席自动离线</div>-->
|
||||
<!-- <div class="ukefu-webim-tl" style="clear:both;">关闭或刷新浏览器坐席自动离线</div>-->
|
||||
<!-- <div class="box-item">-->
|
||||
<!-- <div class="row">-->
|
||||
<!-- <div class="col-lg-8">-->
|
||||
@ -442,7 +428,7 @@
|
||||
<!-- </div>-->
|
||||
|
||||
<div class="ukefu-webim-prop">
|
||||
<div class="ukefu-webim-tl" style="clear:both;">16、启用坐席端使用快捷键输入快捷回复</div>
|
||||
<div class="ukefu-webim-tl" style="clear:both;">启用坐席端使用快捷键输入快捷回复</div>
|
||||
<div class="box-item">
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
@ -457,7 +443,7 @@
|
||||
</div>
|
||||
|
||||
<div class="ukefu-webim-prop">
|
||||
<div class="ukefu-webim-tl" style="clear:both;">17、启用坐席工作台的外部快捷回复</div>
|
||||
<div class="ukefu-webim-tl" style="clear:both;">启用坐席工作台的外部快捷回复</div>
|
||||
<div class="box-item">
|
||||
<div class="row">
|
||||
<div class="col-lg-8">
|
||||
|
Loading…
x
Reference in New Issue
Block a user