diff --git a/contact-center/app/src/main/java/com/chatopera/cc/handler/LoginController.java b/contact-center/app/src/main/java/com/chatopera/cc/handler/LoginController.java index 3da04dec..81b0de76 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/handler/LoginController.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/handler/LoginController.java @@ -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 roleAuthList = roleAuthRes.findAll(new Specification() { - @Override - public Predicate toPredicate( - Root root, CriteriaQuery query, - CriteriaBuilder cb) { - List list = new ArrayList(); - 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())) { diff --git a/contact-center/app/src/main/java/com/chatopera/cc/handler/admin/UsersController.java b/contact-center/app/src/main/java/com/chatopera/cc/handler/admin/UsersController.java index a9047524..2c88627c 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/handler/admin/UsersController.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/handler/admin/UsersController.java @@ -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) { diff --git a/contact-center/app/src/main/java/com/chatopera/cc/handler/api/ApiUserController.java b/contact-center/app/src/main/java/com/chatopera/cc/handler/api/ApiUserController.java index 1a12aae5..c4cd78b2 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/handler/api/ApiUserController.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/handler/api/ApiUserController.java @@ -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 list(HttpServletRequest request, @Valid String id, @Valid String username) { Page 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 findByOrgan(HttpServletRequest request, @Valid String organ) { List organUsers = organUserRepository.findByOrgan(organ); List userids = organUsers.stream().map(p -> p.getUserid()).collect(Collectors.toList()); - List users = userRepository.findAll(userids); + List 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; } diff --git a/contact-center/app/src/main/java/com/chatopera/cc/handler/apps/AgentController.java b/contact-center/app/src/main/java/com/chatopera/cc/handler/apps/AgentController.java index 8bfb75a8..ba611c2b 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/handler/apps/AgentController.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/handler/apps/AgentController.java @@ -1126,7 +1126,7 @@ // 选择当前用户的默认技能组 - Set organs = super.getUser(request).getOrgans().keySet(); + Set organs = logined.getOrgans().keySet(); String currentOrgan = organs.size() > 0 ? (new ArrayList(organs)).get(0) : null; if (StringUtils.isBlank(currentOrgan)) { diff --git a/contact-center/app/src/main/java/com/chatopera/cc/handler/apps/IMAgentController.java b/contact-center/app/src/main/java/com/chatopera/cc/handler/apps/AgentSettingsController.java similarity index 96% rename from contact-center/app/src/main/java/com/chatopera/cc/handler/apps/IMAgentController.java rename to contact-center/app/src/main/java/com/chatopera/cc/handler/apps/AgentSettingsController.java index 1f69f460..5ad17aea 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/handler/apps/IMAgentController.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/handler/apps/AgentSettingsController.java @@ -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); diff --git a/contact-center/app/src/main/java/com/chatopera/cc/interceptor/UserInterceptorHandler.java b/contact-center/app/src/main/java/com/chatopera/cc/interceptor/UserInterceptorHandler.java index d2e1a413..66d2ffc3 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/interceptor/UserInterceptorHandler.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/interceptor/UserInterceptorHandler.java @@ -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; + } } diff --git a/contact-center/app/src/main/java/com/chatopera/cc/proxy/UserProxy.java b/contact-center/app/src/main/java/com/chatopera/cc/proxy/UserProxy.java index 49e02ac4..858d2b06 100644 --- a/contact-center/app/src/main/java/com/chatopera/cc/proxy/UserProxy.java +++ b/contact-center/app/src/main/java/com/chatopera/cc/proxy/UserProxy.java @@ -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 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 roleAuthList = roleAuthRes.findAll(new Specification() { + @Override + public Predicate toPredicate( + Root root, CriteriaQuery query, + CriteriaBuilder cb) { + List list = new ArrayList(); + 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中 * diff --git a/contact-center/app/src/main/resources/static/js/CSKeFu_Admin.v1.js b/contact-center/app/src/main/resources/static/js/CSKeFu_Admin.v1.js new file mode 100644 index 00000000..d50cb58d --- /dev/null +++ b/contact-center/app/src/main/resources/static/js/CSKeFu_Admin.v1.js @@ -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; + } +} \ No newline at end of file diff --git a/contact-center/app/src/main/resources/static/js/CSKeFu_Rest_Request.v1.js b/contact-center/app/src/main/resources/static/js/CSKeFu_Rest_Request.v1.js index 589b9eb7..f04745c6 100644 --- a/contact-center/app/src/main/resources/static/js/CSKeFu_Rest_Request.v1.js +++ b/contact-center/app/src/main/resources/static/js/CSKeFu_Rest_Request.v1.js @@ -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 ) { diff --git a/contact-center/app/src/main/resources/templates/admin/user/add.html b/contact-center/app/src/main/resources/templates/admin/user/add.html index cbc365a1..daebc82e 100644 --- a/contact-center/app/src/main/resources/templates/admin/user/add.html +++ b/contact-center/app/src/main/resources/templates/admin/user/add.html @@ -34,12 +34,13 @@ - +
+
管理员具备访问和修改所有系统资源的权限,同时也设定为多媒体坐席
@@ -61,13 +62,13 @@
- +
- + diff --git a/contact-center/app/src/main/resources/templates/admin/user/edit.html b/contact-center/app/src/main/resources/templates/admin/user/edit.html index cbb5b814..5dbffdb3 100644 --- a/contact-center/app/src/main/resources/templates/admin/user/edit.html +++ b/contact-center/app/src/main/resources/templates/admin/user/edit.html @@ -41,6 +41,7 @@
checked="checked">
+
管理员具备访问和修改所有系统资源的权限,同时也设定为多媒体坐席
@@ -63,8 +64,7 @@
- - +
@@ -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; + }); + }); diff --git a/contact-center/app/src/main/resources/templates/apps/index.html b/contact-center/app/src/main/resources/templates/apps/index.html index 498c1d36..bfc3b052 100644 --- a/contact-center/app/src/main/resources/templates/apps/index.html +++ b/contact-center/app/src/main/resources/templates/apps/index.html @@ -32,6 +32,7 @@ + <#if models?seq_contains("callout")> diff --git a/contact-center/app/src/main/resources/templates/apps/setting/agent/index.html b/contact-center/app/src/main/resources/templates/apps/setting/agent/index.html index 8da79cab..5afd09c9 100644 --- a/contact-center/app/src/main/resources/templates/apps/setting/agent/index.html +++ b/contact-center/app/src/main/resources/templates/apps/setting/agent/index.html @@ -6,6 +6,7 @@
+ <#if sessionConfig??>
@@ -18,7 +19,7 @@
-
1、人工坐席接入欢迎消息(非WEBIM渠道适用)
+
人工坐席接入欢迎消息(非WEBIM渠道适用)
@@ -28,7 +29,7 @@
-
2、无坐席在线提示消息
+
无坐席在线提示消息
@@ -38,7 +39,7 @@
-
3、坐席忙时提示消息(排队位置请使用{num}替换)
+
坐席忙时提示消息(排队位置请使用{num}替换)
@@ -48,7 +49,7 @@
-
4、人工坐席分配成功提示消息(坐席使用{agent}替换)
+
人工坐席分配成功提示消息(坐席使用{agent}替换)
@@ -58,7 +59,7 @@
-
5、坐席服务结束提示消息
+
坐席服务结束提示消息
@@ -68,7 +69,7 @@
-
6、坐席分配策略
+
坐席分配策略
@@ -87,7 +88,7 @@
-
7、坐席分配最大访客数量
+
坐席分配最大访客数量
@@ -113,7 +114,7 @@
-
8、坐席就绪时分配最大访客数量
+
坐席就绪时分配最大访客数量
@@ -139,7 +140,7 @@
-
9、历史服务坐席优先分配
+
历史服务坐席优先分配
@@ -154,7 +155,7 @@
-
10、客户超时提醒
+
客户超时提醒
@@ -190,7 +191,7 @@
-
11、客户超时提醒后再次超时
+
客户超时提醒后再次超时
@@ -225,7 +226,7 @@
-
12、坐席回复超时
+
坐席回复超时
@@ -260,7 +261,7 @@
-
13、启用工作时间段设置
+
启用工作时间段设置
@@ -369,22 +370,7 @@
-
14、启用满意度调查
-
-
-
-

启用此功能后,客户在结束对话的时候,提示选择满意度

-

满意度调查功能,所有实时渠道适用(WebIM,微信)

-
-
- checked="checked"> -
-
-
-
- -
-
15、排队超时设置
+
排队超时设置
@@ -427,7 +413,7 @@
- + @@ -442,7 +428,7 @@
-
16、启用坐席端使用快捷键输入快捷回复
+
启用坐席端使用快捷键输入快捷回复
@@ -457,7 +443,7 @@
-
17、启用坐席工作台的外部快捷回复
+
启用坐席工作台的外部快捷回复