1
0
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:
Hai Liang Wang 2019-11-07 18:37:20 +08:00
parent f2898ff5b7
commit a8f27d3b29
13 changed files with 476 additions and 212 deletions

View File

@ -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())) {

View File

@ -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) {

View File

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

View File

@ -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)) {

View File

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

View File

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

View File

@ -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中
*

View File

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

View File

@ -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 ) {

View File

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

View File

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

View File

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

View File

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