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

refactor user type and entim

This commit is contained in:
Hai Liang Wang 2019-11-06 21:34:11 +08:00
parent e1356fb091
commit 3267f2dba2
58 changed files with 1152 additions and 678 deletions

View File

@ -1,3 +1,6 @@
# dev profile
src/main/resources/application-dev.properties
# ignore plugins source code # ignore plugins source code
src/main/java/com/chatopera/cc/plugins/ src/main/java/com/chatopera/cc/plugins/

View File

@ -40,38 +40,38 @@ public class DelegateRequestMatchingFilter implements Filter {
} }
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req; HttpServletRequest request = (HttpServletRequest) req;
boolean matchAnyRoles = false ; boolean matchAnyRoles = false;
for(RequestMatcher anyRequest : ignoredRequests ){ for (RequestMatcher anyRequest : ignoredRequests) {
if(anyRequest.matches(request)){ if (anyRequest.matches(request)) {
matchAnyRoles = true ; matchAnyRoles = true;
} }
} }
User user = (User) request.getSession().getAttribute(Constants.USER_SESSION_NAME) ; User user = (User) request.getSession().getAttribute(Constants.USER_SESSION_NAME);
if(matchAnyRoles){ if (matchAnyRoles) {
if(user !=null && "0".equals(user.getUsertype())){ if (user != null && (user.isAdmin())) {
chain.doFilter(req,resp); chain.doFilter(req, resp);
}else{ } else {
//重定向到 无权限执行操作的页面 // 重定向到 无权限执行操作的页面
HttpServletResponse response = (HttpServletResponse) resp ; HttpServletResponse response = (HttpServletResponse) resp;
response.sendRedirect("/?msg=security"); response.sendRedirect("/?msg=security");
} }
}else{ } else {
try{ try {
chain.doFilter(req,resp); chain.doFilter(req, resp);
}catch(ClientAbortException ex){ } catch (ClientAbortException ex) {
//Tomcat异常不做处理 //Tomcat异常不做处理
} }
} }
} }
@Override @Override
public void destroy() { public void destroy() {
}
@Override }
public void init(FilterConfig arg0) throws ServletException {
@Override
} public void init(FilterConfig arg0) throws ServletException {
}
} }

View File

@ -51,8 +51,10 @@ public class ApplicationController extends Handler {
view.addObject("timeDifference", timezone.getRawOffset()); view.addObject("timeDifference", timezone.getRawOffset());
if (super.isEnabletneant()) { if (super.isEnabletneant()) {
//多租户启用 非超级管理员 一定要选择租户才能进入界面 // 多租户启用 非管理员 一定要选择租户才能进入界面
if (!logined.isSuperuser() && StringUtils.isNotBlank(logined.getOrgid()) && super.isTenantconsole() && MainContext.SYSTEM_ORGI.equals(logined.getOrgi())) { if (!logined.isAdmin() && StringUtils.isNotBlank(
logined.getOrgid()) && super.isTenantconsole() && MainContext.SYSTEM_ORGI.equals(
logined.getOrgi())) {
view = request(super.createRequestPageTempletResponse("redirect:/apps/tenant/index")); view = request(super.createRequestPageTempletResponse("redirect:/apps/tenant/index"));
} }
if (StringUtils.isBlank(logined.getOrgid())) { if (StringUtils.isBlank(logined.getOrgid())) {

View File

@ -120,8 +120,8 @@ public class Handler {
User u = getUser(request); User u = getUser(request);
if (u == null) { if (u == null) {
throw new CSKefuException("[esOrganFilter] 未能获取到登录用户。"); throw new CSKefuException("[esOrganFilter] 未能获取到登录用户。");
} else if (u.isSuperuser()) { } else if (u.isAdmin()) {
// 超级管理员, 查看任何数据 // 管理员, 查看任何数据
return true; return true;
} else { } else {
// 用户在部门中通过部门过滤数据 // 用户在部门中通过部门过滤数据
@ -145,7 +145,8 @@ public class Handler {
String q = request.getParameter("q"); String q = request.getParameter("q");
q = q.replaceAll("(OR|AND|NOT|:|\\(|\\))", ""); q = q.replaceAll("(OR|AND|NOT|:|\\(|\\))", "");
if (StringUtils.isNotBlank(q)) { if (StringUtils.isNotBlank(q)) {
queryBuilder.must(QueryBuilders.boolQuery().must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND))); queryBuilder.must(
QueryBuilders.boolQuery().must(new QueryStringQueryBuilder(q).defaultOperator(Operator.AND)));
map.put("q", q); map.put("q", q);
} }
} }
@ -188,12 +189,14 @@ public class Handler {
RangeQueryBuilder rangeQuery = null; RangeQueryBuilder rangeQuery = null;
// 拨打时间区间查询 // 拨打时间区间查询
if (StringUtils.isNotBlank(request.getParameter("callbegin")) || StringUtils.isNotBlank(request.getParameter("callend"))) { if (StringUtils.isNotBlank(request.getParameter("callbegin")) || StringUtils.isNotBlank(
request.getParameter("callend"))) {
if (StringUtils.isNotBlank(request.getParameter("callbegin"))) { if (StringUtils.isNotBlank(request.getParameter("callbegin"))) {
try { try {
rangeQuery = QueryBuilders.rangeQuery("calltime").from(MainUtils.dateFormate.parse(request.getParameter("callbegin")).getTime()); rangeQuery = QueryBuilders.rangeQuery("calltime").from(
MainUtils.dateFormate.parse(request.getParameter("callbegin")).getTime());
} catch (ParseException e) { } catch (ParseException e) {
e.printStackTrace(); e.printStackTrace();
@ -204,7 +207,8 @@ public class Handler {
try { try {
if (rangeQuery == null) { if (rangeQuery == null) {
rangeQuery = QueryBuilders.rangeQuery("calltime").to(MainUtils.dateFormate.parse(request.getParameter("callend")).getTime()); rangeQuery = QueryBuilders.rangeQuery("calltime").to(
MainUtils.dateFormate.parse(request.getParameter("callend")).getTime());
} else { } else {
rangeQuery.to(MainUtils.dateFormate.parse(request.getParameter("callend")).getTime()); rangeQuery.to(MainUtils.dateFormate.parse(request.getParameter("callend")).getTime());
} }
@ -218,12 +222,14 @@ public class Handler {
map.put("callend", request.getParameter("callend")); map.put("callend", request.getParameter("callend"));
} }
// 预约时间区间查询 // 预约时间区间查询
if (StringUtils.isNotBlank(request.getParameter("apbegin")) || StringUtils.isNotBlank(request.getParameter("apend"))) { if (StringUtils.isNotBlank(request.getParameter("apbegin")) || StringUtils.isNotBlank(
request.getParameter("apend"))) {
if (StringUtils.isNotBlank(request.getParameter("apbegin"))) { if (StringUtils.isNotBlank(request.getParameter("apbegin"))) {
try { try {
rangeQuery = QueryBuilders.rangeQuery("aptime").from(MainUtils.dateFormate.parse(request.getParameter("apbegin")).getTime()); rangeQuery = QueryBuilders.rangeQuery("aptime").from(
MainUtils.dateFormate.parse(request.getParameter("apbegin")).getTime());
} catch (ParseException e) { } catch (ParseException e) {
e.printStackTrace(); e.printStackTrace();
@ -234,7 +240,8 @@ public class Handler {
try { try {
if (rangeQuery == null) { if (rangeQuery == null) {
rangeQuery = QueryBuilders.rangeQuery("aptime").to(MainUtils.dateFormate.parse(request.getParameter("apend")).getTime()); rangeQuery = QueryBuilders.rangeQuery("aptime").to(
MainUtils.dateFormate.parse(request.getParameter("apend")).getTime());
} else { } else {
rangeQuery.to(MainUtils.dateFormate.parse(request.getParameter("apend")).getTime()); rangeQuery.to(MainUtils.dateFormate.parse(request.getParameter("apend")).getTime());
} }
@ -281,6 +288,7 @@ public class Handler {
* 创建或从HTTP会话中查找到访客的User对象该对象不在数据库中属于临时会话 * 创建或从HTTP会话中查找到访客的User对象该对象不在数据库中属于临时会话
* 这个User很可能是打开一个WebIM访客聊天控件随机生成用户名之后和Contact关联 * 这个User很可能是打开一个WebIM访客聊天控件随机生成用户名之后和Contact关联
* 这个用户可能关联一个OnlineUser如果开始给TA分配坐席 * 这个用户可能关联一个OnlineUser如果开始给TA分配坐席
*
* @param request * @param request
* @param userid * @param userid
* @param nickname * @param nickname
@ -298,7 +306,8 @@ public class Handler {
if (StringUtils.isNotBlank(nickname)) { if (StringUtils.isNotBlank(nickname)) {
user.setUsername(nickname); user.setUsername(nickname);
} else { } else {
Map<String, String> sessionMessage = cache.findOneSystemMapByIdAndOrgi(request.getSession().getId(), MainContext.SYSTEM_ORGI); Map<String, String> sessionMessage = cache.findOneSystemMapByIdAndOrgi(
request.getSession().getId(), MainContext.SYSTEM_ORGI);
if (sessionMessage != null) { if (sessionMessage != null) {
String struname = sessionMessage.get("username"); String struname = sessionMessage.get("username");
String strcname = sessionMessage.get("company_name"); String strcname = sessionMessage.get("company_name");
@ -327,7 +336,8 @@ public class Handler {
if (StringUtils.isNotBlank(nickname)) { if (StringUtils.isNotBlank(nickname)) {
user.setUsername(nickname); user.setUsername(nickname);
} else { } else {
Map<String, String> sessionMessage = cache.findOneSystemMapByIdAndOrgi(sessionid, MainContext.SYSTEM_ORGI); Map<String, String> sessionMessage = cache.findOneSystemMapByIdAndOrgi(
sessionid, MainContext.SYSTEM_ORGI);
if (sessionMessage != null) { if (sessionMessage != null) {
String struname = sessionMessage.get("username"); String struname = sessionMessage.get("username");
String strcname = sessionMessage.get("company_name"); String strcname = sessionMessage.get("company_name");

View File

@ -88,6 +88,9 @@ public class LoginController extends Handler {
@Autowired @Autowired
private AgentSessionProxy agentSessionProxy; private AgentSessionProxy agentSessionProxy;
@Autowired
private UserProxy userProxy;
/** /**
* 登录页面 * 登录页面
* *
@ -196,7 +199,7 @@ public class LoginController extends Handler {
if ((loginUser.isAgent() && if ((loginUser.isAgent() &&
loginUser.getRoleAuthMap().containsKey("A01") && loginUser.getRoleAuthMap().containsKey("A01") &&
((boolean) loginUser.getRoleAuthMap().get("A01") == true)) ((boolean) loginUser.getRoleAuthMap().get("A01") == true))
|| loginUser.isSuperuser()) { || loginUser.isAdmin()) {
try { try {
/**************************************** /****************************************
* 登录成功设置该坐席为就绪状态默认 * 登录成功设置该坐席为就绪状态默认
@ -215,7 +218,7 @@ public class LoginController extends Handler {
AutomaticServiceDist.recordAgentStatus(agentStatus.getAgentno(), AutomaticServiceDist.recordAgentStatus(agentStatus.getAgentno(),
agentStatus.getUsername(), agentStatus.getUsername(),
agentStatus.getAgentno(), agentStatus.getAgentno(),
user.isSuperuser(), // 0代表admin user.isAdmin(), // 0代表admin
agentStatus.getAgentno(), agentStatus.getAgentno(),
MainContext.AgentStatusEnum.OFFLINE.toString(), MainContext.AgentStatusEnum.OFFLINE.toString(),
MainContext.AgentStatusEnum.READY.toString(), MainContext.AgentStatusEnum.READY.toString(),
@ -273,7 +276,7 @@ public class LoginController extends Handler {
// 登录成功 判断是否进入多租户页面 // 登录成功 判断是否进入多租户页面
SystemConfig systemConfig = MainUtils.getSystemConfig(); SystemConfig systemConfig = MainUtils.getSystemConfig();
if (systemConfig != null && systemConfig.isEnabletneant() && systemConfig.isTenantconsole() && !loginUser.isSuperuser()) { if (systemConfig != null && systemConfig.isEnabletneant() && systemConfig.isTenantconsole() && !loginUser.isAdmin()) {
view = new ModelAndView("redirect:/apps/tenant/index"); view = new ModelAndView("redirect:/apps/tenant/index");
} }
List<UserRole> userRoleList = userRoleRes.findByOrgiAndUser(loginUser.getOrgi(), loginUser); List<UserRole> userRoleList = userRoleRes.findByOrgiAndUser(loginUser.getOrgi(), loginUser);
@ -284,7 +287,7 @@ public class LoginController extends Handler {
} }
// 获取用户部门以及下级部门 // 获取用户部门以及下级部门
UserProxy.attachOrgansPropertiesForUser(loginUser); userProxy.attachOrgansPropertiesForUser(loginUser);
// 获取用户的角色权限进行授权 // 获取用户的角色权限进行授权
List<RoleAuth> roleAuthList = roleAuthRes.findAll(new Specification<RoleAuth>() { List<RoleAuth> roleAuthList = roleAuthRes.findAll(new Specification<RoleAuth>() {
@ -381,7 +384,7 @@ public class LoginController extends Handler {
return request(super.createRequestPageTempletResponse("redirect:/register.html?msg=" + msg)); return request(super.createRequestPageTempletResponse("redirect:/register.html?msg=" + msg));
} else { } else {
user.setUname(user.getUsername()); user.setUname(user.getUsername());
user.setUsertype("0"); user.setAdmin(true);
if (StringUtils.isNotBlank(user.getPassword())) { if (StringUtils.isNotBlank(user.getPassword())) {
user.setPassword(MainUtils.md5(user.getPassword())); user.setPassword(MainUtils.md5(user.getPassword()));
} }

View File

@ -80,10 +80,14 @@ public class OrganController extends Handler {
@Autowired @Autowired
private Cache cache; private Cache cache;
@Autowired
private UserProxy userProxy;
@RequestMapping("/index") @RequestMapping("/index")
@Menu(type = "admin", subtype = "organ") @Menu(type = "admin", subtype = "organ")
public ModelAndView index(ModelMap map, HttpServletRequest request, @Valid String organ, @Valid String msg) { public ModelAndView index(ModelMap map, HttpServletRequest request, @Valid String organ, @Valid String msg) {
List<Organ> organList = organRepository.findByOrgiAndOrgid(super.getOrgiByTenantshare(request), super.getOrgid(request)); List<Organ> organList = organRepository.findByOrgiAndOrgid(
super.getOrgiByTenantshare(request), super.getOrgid(request));
map.addAttribute("organList", organList); map.addAttribute("organList", organList);
if (organList.size() > 0) { if (organList.size() > 0) {
Organ organData = null; Organ organData = null;
@ -98,11 +102,16 @@ public class OrganController extends Handler {
map.addAttribute("organData", organData = organList.get(0)); map.addAttribute("organData", organData = organList.get(0));
} }
if (organData != null) { if (organData != null) {
map.addAttribute("userList", UserProxy.findByOrganAndOrgiAndDatastatus(organData.getId(), super.getOrgiByTenantshare(request), false)); map.addAttribute(
"userList", userProxy.findByOrganAndOrgiAndDatastatus(organData.getId(),
super.getOrgiByTenantshare(request),
false));
} }
} }
map.addAttribute("areaList", areaRepository.findByOrgi(super.getOrgiByTenantshare(request))); map.addAttribute("areaList", areaRepository.findByOrgi(super.getOrgiByTenantshare(request)));
map.addAttribute("roleList", roleRepository.findByOrgiAndOrgid(super.getOrgiByTenantshare(request), super.getOrgid(request))); map.addAttribute(
"roleList", roleRepository.findByOrgiAndOrgid(super.getOrgiByTenantshare(request),
super.getOrgid(request)));
map.put("msg", msg); map.put("msg", msg);
return request(super.createAdminTempletResponse("/admin/organ/index")); return request(super.createAdminTempletResponse("/admin/organ/index"));
} }
@ -118,7 +127,9 @@ public class OrganController extends Handler {
map.addAttribute("area", areaRepository.findByIdAndOrgi(area, super.getOrgiByTenantshare(request))); map.addAttribute("area", areaRepository.findByIdAndOrgi(area, super.getOrgiByTenantshare(request)));
} }
map.addAttribute("organList", organRepository.findByOrgiAndOrgid(super.getOrgiByTenantshare(request), super.getOrgid(request))); map.addAttribute(
"organList", organRepository.findByOrgiAndOrgid(super.getOrgiByTenantshare(request),
super.getOrgid(request)));
return request(super.createRequestPageTempletResponse("/admin/organ/add")); return request(super.createRequestPageTempletResponse("/admin/organ/add"));
} }
@ -126,7 +137,8 @@ public class OrganController extends Handler {
@RequestMapping("/save") @RequestMapping("/save")
@Menu(type = "admin", subtype = "organ") @Menu(type = "admin", subtype = "organ")
public ModelAndView save(HttpServletRequest request, @Valid Organ organ) { public ModelAndView save(HttpServletRequest request, @Valid Organ organ) {
Organ tempOrgan = organRepository.findByNameAndOrgiAndOrgid(organ.getName(), super.getOrgiByTenantshare(request), super.getOrgid(request)); Organ tempOrgan = organRepository.findByNameAndOrgiAndOrgid(
organ.getName(), super.getOrgiByTenantshare(request), super.getOrgid(request));
String msg = "admin_organ_new_success"; String msg = "admin_organ_new_success";
String firstId = null; String firstId = null;
if (tempOrgan != null) { if (tempOrgan != null) {
@ -145,7 +157,8 @@ public class OrganController extends Handler {
OnlineUserProxy.clean(super.getOrgi(request)); OnlineUserProxy.clean(super.getOrgi(request));
} }
return request(super.createRequestPageTempletResponse("redirect:/admin/organ/index.html?msg=" + msg + "&organ=" + firstId)); return request(super.createRequestPageTempletResponse(
"redirect:/admin/organ/index.html?msg=" + msg + "&organ=" + firstId));
} }
/** /**
@ -159,9 +172,12 @@ public class OrganController extends Handler {
@RequestMapping("/seluser") @RequestMapping("/seluser")
@Menu(type = "admin", subtype = "seluser", admin = true) @Menu(type = "admin", subtype = "seluser", admin = true)
public ModelAndView seluser(ModelMap map, HttpServletRequest request, @Valid String organ) { public ModelAndView seluser(ModelMap map, HttpServletRequest request, @Valid String organ) {
map.addAttribute("userList", userRepository.findByOrgiAndDatastatusAndOrgid(super.getOrgiByTenantshare(request), false, super.getOrgid(request))); map.addAttribute(
"userList", userRepository.findByOrgiAndDatastatusAndOrgid(super.getOrgiByTenantshare(request), false,
super.getOrgid(request)));
Organ organData = organRepository.findByIdAndOrgi(organ, super.getOrgiByTenantshare(request)); Organ organData = organRepository.findByIdAndOrgi(organ, super.getOrgiByTenantshare(request));
map.addAttribute("userOrganList", UserProxy.findByOrganAndOrgiAndDatastatus(organ, super.getOrgiByTenantshare(request), false)); map.addAttribute("userOrganList", userProxy
.findByOrganAndOrgiAndDatastatus(organ, super.getOrgiByTenantshare(request), false));
map.addAttribute("organ", organData); map.addAttribute("organ", organData);
return request(super.createRequestPageTempletResponse("/admin/organ/seluser")); return request(super.createRequestPageTempletResponse("/admin/organ/seluser"));
} }
@ -181,7 +197,7 @@ public class OrganController extends Handler {
HttpServletRequest request, HttpServletRequest request,
final @Valid String[] users, final @Valid String[] users,
final @Valid String organ final @Valid String organ
) { ) {
logger.info("[saveuser] save users {} into organ {}", StringUtils.join(users, ","), organ); logger.info("[saveuser] save users {} into organ {}", StringUtils.join(users, ","), organ);
final User loginUser = super.getUser(request); final User loginUser = super.getUser(request);
@ -205,12 +221,13 @@ public class OrganController extends Handler {
/** /**
* 以下更新技能组状态 * 以下更新技能组状态
*/ */
AgentStatus agentStatus = cache.findOneAgentStatusByAgentnoAndOrig(user.getId(), super.getOrgiByTenantshare(request)); AgentStatus agentStatus = cache.findOneAgentStatusByAgentnoAndOrig(
user.getId(), super.getOrgiByTenantshare(request));
// TODO 因为一个用户可以包含在多个技能组中所以skill应该对应 // TODO 因为一个用户可以包含在多个技能组中所以skill应该对应
// 一个List列表此处需要重构Skill为列表 // 一个List列表此处需要重构Skill为列表
if (agentStatus != null) { if (agentStatus != null) {
UserProxy.attachOrgansPropertiesForUser(user); userProxy.attachOrgansPropertiesForUser(user);
agentStatus.setSkills(user.getSkills()); agentStatus.setSkills(user.getSkills());
cache.putAgentStatusByOrgi(agentStatus, super.getOrgiByTenantshare(request)); cache.putAgentStatusByOrgi(agentStatus, super.getOrgiByTenantshare(request));
} }
@ -228,7 +245,7 @@ public class OrganController extends Handler {
final HttpServletRequest request, final HttpServletRequest request,
final @Valid String id, final @Valid String id,
final @Valid String organ final @Valid String organ
) { ) {
logger.info("[userroledelete] user id {}, organ {}", id, organ); logger.info("[userroledelete] user id {}, organ {}", id, organ);
if (id != null) { if (id != null) {
organUserRes.deleteOrganUserByUseridAndOrgan(id, organ); organUserRes.deleteOrganUserByUseridAndOrgan(id, organ);
@ -244,7 +261,9 @@ public class OrganController extends Handler {
map.addAttribute("areaList", areaRepository.findByOrgi(super.getOrgiByTenantshare(request))); map.addAttribute("areaList", areaRepository.findByOrgi(super.getOrgiByTenantshare(request)));
view.addObject("organData", organRepository.findByIdAndOrgi(id, super.getOrgiByTenantshare(request))); view.addObject("organData", organRepository.findByIdAndOrgi(id, super.getOrgiByTenantshare(request)));
map.addAttribute("organList", organRepository.findByOrgiAndOrgid(super.getOrgiByTenantshare(request), super.getOrgid(request))); map.addAttribute(
"organList", organRepository.findByOrgiAndOrgid(super.getOrgiByTenantshare(request),
super.getOrgid(request)));
return view; return view;
} }
@ -252,7 +271,8 @@ public class OrganController extends Handler {
@Menu(type = "admin", subtype = "organ") @Menu(type = "admin", subtype = "organ")
public ModelAndView update(HttpServletRequest request, @Valid Organ organ) { public ModelAndView update(HttpServletRequest request, @Valid Organ organ) {
String msg = organProxy.updateOrgan(organ, super.getOrgi(request), super.getUser(request)); String msg = organProxy.updateOrgan(organ, super.getOrgi(request), super.getUser(request));
return request(super.createRequestPageTempletResponse("redirect:/admin/organ/index.html?msg=" + msg + "&organ=" + organ.getId())); return request(super.createRequestPageTempletResponse(
"redirect:/admin/organ/index.html?msg=" + msg + "&organ=" + organ.getId()));
} }
@RequestMapping("/area") @RequestMapping("/area")
@ -283,7 +303,8 @@ public class OrganController extends Handler {
} else { } else {
msg = "admin_organ_update_not_exist"; msg = "admin_organ_update_not_exist";
} }
return request(super.createRequestPageTempletResponse("redirect:/admin/organ/index.html?msg=" + msg + "&organ=" + organ.getId())); return request(super.createRequestPageTempletResponse(
"redirect:/admin/organ/index.html?msg=" + msg + "&organ=" + organ.getId()));
} }
@RequestMapping("/delete") @RequestMapping("/delete")
@ -328,6 +349,7 @@ public class OrganController extends Handler {
} }
} }
return request(super.createRequestPageTempletResponse("redirect:/admin/organ/index.html?organ=" + organData.getId())); return request(
super.createRequestPageTempletResponse("redirect:/admin/organ/index.html?organ=" + organData.getId()));
} }
} }

View File

@ -27,6 +27,7 @@ import com.chatopera.cc.model.UserRole;
import com.chatopera.cc.persistence.repository.UserRepository; import com.chatopera.cc.persistence.repository.UserRepository;
import com.chatopera.cc.persistence.repository.UserRoleRepository; import com.chatopera.cc.persistence.repository.UserRoleRepository;
import com.chatopera.cc.proxy.OnlineUserProxy; import com.chatopera.cc.proxy.OnlineUserProxy;
import com.chatopera.cc.proxy.UserProxy;
import com.chatopera.cc.util.Menu; import com.chatopera.cc.util.Menu;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -64,22 +65,26 @@ public class UsersController extends Handler {
@Autowired @Autowired
private Cache cache; private Cache cache;
@Autowired
private UserProxy userProxy;
@RequestMapping("/index") @RequestMapping("/index")
@Menu(type = "admin", subtype = "user") @Menu(type = "admin", subtype = "user")
public ModelAndView index(ModelMap map, HttpServletRequest request) throws IOException { public ModelAndView index(ModelMap map, HttpServletRequest request) throws IOException {
map.addAttribute( map.addAttribute(
"userList", "userList",
userRepository.findByDatastatusAndOrgiAndOrgid( userRepository.findByDatastatusAndOrgiAndOrgidAndSuperadminNot(
false, false,
super.getOrgiByTenantshare(request), super.getOrgiByTenantshare(request),
super.getOrgid(request), super.getOrgid(request),
true,
new PageRequest( new PageRequest(
super.getP(request), super.getP(request),
super.getPs(request), super.getPs(request),
Sort.Direction.ASC, Sort.Direction.ASC,
"createtime" "createtime"
) )
) )
); );
return request(super.createAdminTempletResponse("/admin/user/index")); return request(super.createAdminTempletResponse("/admin/user/index"));
} }
@ -93,76 +98,11 @@ public class UsersController extends Handler {
@RequestMapping("/save") @RequestMapping("/save")
@Menu(type = "admin", subtype = "user") @Menu(type = "admin", subtype = "user")
public ModelAndView save(HttpServletRequest request, @Valid User user) { public ModelAndView save(HttpServletRequest request, @Valid User user) {
String msg = ""; String msg = userProxy.createNewUser(
msg = validUser(user); user, super.getOrgi(request), super.getUser(request).getOrgid(), super.getOrgiByTenantshare(request));
if (!StringUtils.isBlank(msg) && !msg.equals("new_user_success")) {
return request(super.createRequestPageTempletResponse("redirect:/admin/user/index.html?msg=" + msg));
} else {
// if (request.getParameter("admin") != null) {
// user.setUsertype("0");
// } else {
// user.setUsertype(null);
// }
if (user.isSuperuser()) {
user.setSuperuser(true);
user.setUsertype("0");
} else {
user.setSuperuser(false);
user.setUsertype("");
}
if (!StringUtils.isBlank(user.getPassword())) {
user.setPassword(MainUtils.md5(user.getPassword()));
}
user.setOrgi(super.getOrgiByTenantshare(request));
if (!StringUtils.isBlank(super.getUser(request).getOrgid())) {
user.setOrgid(super.getUser(request).getOrgid());
} else {
user.setOrgid(MainContext.SYSTEM_ORGI);
}
userRepository.save(user);
OnlineUserProxy.clean(super.getOrgi(request));
}
return request(super.createRequestPageTempletResponse("redirect:/admin/user/index.html?msg=" + msg)); return request(super.createRequestPageTempletResponse("redirect:/admin/user/index.html?msg=" + msg));
} }
private String validUser(User user) {
String msg = "";
User tempUser = userRepository.findByUsernameAndDatastatus(user.getUsername(), false);
if (tempUser != null) {
msg = "username_exist";
return msg;
}
if (StringUtils.isNotBlank(user.getEmail())) {
tempUser = userRepository.findByEmailAndDatastatus(user.getEmail(), false);
if (tempUser != null) {
msg = "email_exist";
return msg;
}
}
if (StringUtils.isNotBlank(user.getMobile())) {
tempUser = userRepository.findByMobileAndDatastatus(user.getMobile(), false);
if (tempUser != null) {
msg = "mobile_exist";
return msg;
}
}
if (!validUserCallcenterParams(user)) {
msg = "sip_account_exist";
return msg;
}
if (tempUser == null && validUserCallcenterParams(user)) {
msg = "new_user_success";
return msg;
}
return msg;
}
@RequestMapping("/edit") @RequestMapping("/edit")
@Menu(type = "admin", subtype = "user") @Menu(type = "admin", subtype = "user")
public ModelAndView edit(ModelMap map, HttpServletRequest request, @Valid String id) { public ModelAndView edit(ModelMap map, HttpServletRequest request, @Valid String id) {
@ -177,16 +117,9 @@ public class UsersController extends Handler {
User tempUser = userRepository.getOne(user.getId()); User tempUser = userRepository.getOne(user.getId());
String msg = validUserUpdate(user, tempUser); String msg = validUserUpdate(user, tempUser);
if (tempUser != null) { if (tempUser != null) {
if (!StringUtils.isBlank(msg) && !msg.equals("edit_user_success")) { if (StringUtils.isNotBlank(msg) && !msg.equals("edit_user_success")) {
return request(super.createRequestPageTempletResponse("redirect:/admin/user/index.html?msg=" + msg)); return request(super.createRequestPageTempletResponse("redirect:/admin/user/index.html?msg=" + msg));
} }
if (user.isSuperuser()) {
tempUser.setSuperuser(true);
tempUser.setUsertype("0");
} else {
tempUser.setSuperuser(false);
tempUser.setUsertype("");
}
tempUser.setUname(user.getUname()); tempUser.setUname(user.getUname());
tempUser.setUsername(user.getUsername()); tempUser.setUsername(user.getUsername());
tempUser.setEmail(user.getEmail()); tempUser.setEmail(user.getEmail());
@ -205,23 +138,17 @@ public class UsersController extends Handler {
tempUser.setOrgi(super.getOrgiByTenantshare(request)); tempUser.setOrgi(super.getOrgiByTenantshare(request));
if (!StringUtils.isBlank(super.getUser(request).getOrgid())) { if (StringUtils.isNotBlank(super.getUser(request).getOrgid())) {
tempUser.setOrgid(super.getUser(request).getOrgid()); tempUser.setOrgid(super.getUser(request).getOrgid());
} else { } else {
tempUser.setOrgid(MainContext.SYSTEM_ORGI); tempUser.setOrgid(MainContext.SYSTEM_ORGI);
} }
tempUser.setCallcenter(user.isCallcenter()); tempUser.setCallcenter(user.isCallcenter());
if (!StringUtils.isBlank(user.getPassword())) { if (StringUtils.isNotBlank(user.getPassword())) {
tempUser.setPassword(MainUtils.md5(user.getPassword())); tempUser.setPassword(MainUtils.md5(user.getPassword()));
} }
// if (request.getParameter("admin") != null) {
// tempUser.setUsertype("0");
// } else {
// tempUser.setUsertype(null);
// }
if (tempUser.getCreatetime() == null) { if (tempUser.getCreatetime() == null) {
tempUser.setCreatetime(new Date()); tempUser.setCreatetime(new Date());
} }
@ -256,20 +183,18 @@ public class UsersController extends Handler {
} }
} }
if (!validUserCallcenterParams(user)) { if (!userProxy.validUserCallcenterParams(user)) {
msg = "sip_account_exist"; msg = "sip_account_exist";
return msg; return msg;
} }
if (user.getUsername().equals(oldUser.getUsername()) && user.getEmail().equals( if (user.getUsername().equals(oldUser.getUsername()) && user.getEmail().equals(
oldUser.getEmail()) && user.getMobile().equals(oldUser.getMobile()) && validUserCallcenterParams( oldUser.getEmail()) && user.getMobile().equals(
oldUser.getMobile()) && userProxy.validUserCallcenterParams(
user)) { user)) {
return ""; return "";
} }
// if ()
return msg; return msg;
} }
@ -290,18 +215,4 @@ public class UsersController extends Handler {
return request(super.createRequestPageTempletResponse("redirect:/admin/user/index.html?msg=" + msg)); return request(super.createRequestPageTempletResponse("redirect:/admin/user/index.html?msg=" + msg));
} }
/**
* 根据是否开启呼叫中心模块检测账号
*
* @param user
* @return
*/
private boolean validUserCallcenterParams(final User user) {
if (user.isCallcenter() && MainContext.hasModule(Constants.CSKEFU_MODULE_CALLOUT)) {
List<User> tempUserList = userRepository.findBySipaccountAndDatastatus(user.getSipaccount(), false);
return tempUserList.size() == 0 || user.getSipaccount() == "";
}
return true;
}
} }

View File

@ -73,6 +73,9 @@ public class WebIMController extends Handler {
@Autowired @Autowired
private Cache cache; private Cache cache;
@Autowired
private UserProxy userProxy;
@RequestMapping("/index") @RequestMapping("/index")
@Menu(type = "app", subtype = "app", admin = true) @Menu(type = "app", subtype = "app", admin = true)
public ModelAndView index(ModelMap map, HttpServletRequest request, @Valid String snsid) { public ModelAndView index(ModelMap map, HttpServletRequest request, @Valid String snsid) {
@ -323,7 +326,7 @@ public class WebIMController extends Handler {
organIdList.add(rel.getSkillid()); organIdList.add(rel.getSkillid());
} }
} }
userList = UserProxy.findByOrganInAndAgentAndDatastatus(organIdList, true, false); userList = userProxy.findByOrganInAndAgentAndDatastatus(organIdList, true, false);
} else { } else {
userList = userRes.findByOrgiAndAgentAndDatastatus(super.getOrgi(request), true, false); userList = userRes.findByOrgiAndAgentAndDatastatus(super.getOrgi(request), true, false);
} }

View File

@ -150,7 +150,7 @@ public class SystemConfigController extends Handler {
@RequestMapping("/startentim") @RequestMapping("/startentim")
@Menu(type = "admin", subtype = "startentim", access = false, admin = true) @Menu(type = "admin", subtype = "startentim", access = false, admin = true)
public ModelAndView startentim(ModelMap map, HttpServletRequest request) throws SQLException { public ModelAndView startentim(ModelMap map, HttpServletRequest request) throws SQLException {
MainContext.hasModule(Constants.CSKEFU_MODULE_ENTIM); MainContext.enableModule(Constants.CSKEFU_MODULE_ENTIM);
return request(super.createRequestPageTempletResponse("redirect:/admin/config/index.html")); return request(super.createRequestPageTempletResponse("redirect:/admin/config/index.html"));
} }

View File

@ -168,7 +168,7 @@ public class ApiAgentUserController extends Handler {
final String userId = agentUser.getUserid(); final String userId = agentUser.getUserid();
// 检查权限 // 检查权限
if ((!logined.isSuperuser()) && (!StringUtils.equals( if ((!logined.isAdmin()) && (!StringUtils.equals(
agentUser.getAgentno(), agentUser.getAgentno(),
logined.getId())) && (!isTransPermissionAllowed( logined.getId())) && (!isTransPermissionAllowed(
agentAudits, logined))) { agentAudits, logined))) {
@ -286,7 +286,7 @@ public class ApiAgentUserController extends Handler {
final AgentUser agentUser = agentUserRes.findByIdAndOrgi(payload.get("id").getAsString(), orgi); final AgentUser agentUser = agentUserRes.findByIdAndOrgi(payload.get("id").getAsString(), orgi);
if (agentUser != null) { if (agentUser != null) {
if ((StringUtils.equals( if ((StringUtils.equals(
logined.getId(), agentUser.getAgentno()) || logined.isSuperuser())) { logined.getId(), agentUser.getAgentno()) || logined.isAdmin())) {
// 删除访客-坐席关联关系包括缓存 // 删除访客-坐席关联关系包括缓存
try { try {
AutomaticServiceDist.deleteAgentUser(agentUser, orgi); AutomaticServiceDist.deleteAgentUser(agentUser, orgi);
@ -368,4 +368,4 @@ public class ApiAgentUserController extends Handler {
} }
return false; return false;
} }
} }

View File

@ -74,7 +74,9 @@ public class ApiServiceQueneController extends Handler {
@RequestMapping(method = RequestMethod.GET) @RequestMapping(method = RequestMethod.GET)
@Menu(type = "apps", subtype = "user", access = true) @Menu(type = "apps", subtype = "user", access = true)
public ResponseEntity<RestResult> list(HttpServletRequest request) { public ResponseEntity<RestResult> list(HttpServletRequest request) {
return new ResponseEntity<>(new RestResult(RestResultType.OK, AutomaticServiceDist.getAgentReport(super.getOrgi(request))), HttpStatus.OK); return new ResponseEntity<>(
new RestResult(RestResultType.OK, AutomaticServiceDist.getAgentReport(super.getOrgi(request))),
HttpStatus.OK);
} }
/** /**
@ -85,12 +87,14 @@ public class ApiServiceQueneController extends Handler {
*/ */
@RequestMapping(method = RequestMethod.PUT) @RequestMapping(method = RequestMethod.PUT)
@Menu(type = "apps", subtype = "user", access = true) @Menu(type = "apps", subtype = "user", access = true)
public ResponseEntity<RestResult> agentStatus(HttpServletRequest request, public ResponseEntity<RestResult> agentStatus(
@Valid String status) throws CharacterCodingException { HttpServletRequest request,
@Valid String status) throws CharacterCodingException {
User logined = super.getUser(request); User logined = super.getUser(request);
AgentStatus agentStatus = null; AgentStatus agentStatus = null;
if (StringUtils.isNotBlank(status) && status.equals(MainContext.AgentStatusEnum.READY.toString())) { if (StringUtils.isNotBlank(status) && status.equals(MainContext.AgentStatusEnum.READY.toString())) {
List<AgentStatus> agentStatusList = agentStatusRepository.findByAgentnoAndOrgi(logined.getId(), super.getOrgi(request)); List<AgentStatus> agentStatusList = agentStatusRepository.findByAgentnoAndOrgi(
logined.getId(), super.getOrgi(request));
if (agentStatusList.size() > 0) { if (agentStatusList.size() > 0) {
agentStatus = agentStatusList.get(0); agentStatus = agentStatusList.get(0);
agentStatus.setSkills(logined.getSkills()); agentStatus.setSkills(logined.getSkills());
@ -104,7 +108,10 @@ public class ApiServiceQueneController extends Handler {
SessionConfig sessionConfig = AutomaticServiceDist.initSessionConfig(super.getOrgi(request)); SessionConfig sessionConfig = AutomaticServiceDist.initSessionConfig(super.getOrgi(request));
agentStatus.setUsers(agentUserRepository.countByAgentnoAndStatusAndOrgi(logined.getId(), MainContext.AgentUserStatusEnum.INSERVICE.toString(), super.getOrgi(request))); agentStatus.setUsers(agentUserRepository.countByAgentnoAndStatusAndOrgi(
logined.getId(),
MainContext.AgentUserStatusEnum.INSERVICE.toString(),
super.getOrgi(request)));
agentStatus.setUpdatetime(new Date()); agentStatus.setUpdatetime(new Date());
@ -117,38 +124,64 @@ public class ApiServiceQueneController extends Handler {
/** /**
* 更新当前用户状态 * 更新当前用户状态
*/ */
agentStatus.setUsers(cache.getInservAgentUsersSizeByAgentnoAndOrgi(agentStatus.getAgentno(), super.getOrgi(request))); agentStatus.setUsers(cache.getInservAgentUsersSizeByAgentnoAndOrgi(
agentStatus.getAgentno(),
super.getOrgi(request)));
agentStatus.setStatus(MainContext.AgentStatusEnum.READY.toString()); agentStatus.setStatus(MainContext.AgentStatusEnum.READY.toString());
cache.putAgentStatusByOrgi(agentStatus, super.getOrgi(request)); cache.putAgentStatusByOrgi(agentStatus, super.getOrgi(request));
AutomaticServiceDist.recordAgentStatus(agentStatus.getAgentno(), agentStatus.getUsername(), agentStatus.getAgentno(), logined.isSuperuser(), agentStatus.getAgentno(), MainContext.AgentStatusEnum.OFFLINE.toString(), MainContext.AgentStatusEnum.READY.toString(), MainContext.AgentWorkType.MEIDIACHAT.toString(), agentStatus.getOrgi(), null); AutomaticServiceDist.recordAgentStatus(
agentStatus.getAgentno(), agentStatus.getUsername(), agentStatus.getAgentno(),
logined.isAdmin(), agentStatus.getAgentno(),
MainContext.AgentStatusEnum.OFFLINE.toString(), MainContext.AgentStatusEnum.READY.toString(),
MainContext.AgentWorkType.MEIDIACHAT.toString(), agentStatus.getOrgi(), null);
AutomaticServiceDist.allotAgent(agentStatus.getAgentno(), super.getOrgi(request)); AutomaticServiceDist.allotAgent(agentStatus.getAgentno(), super.getOrgi(request));
} }
} else if (StringUtils.isNotBlank(status)) { } else if (StringUtils.isNotBlank(status)) {
if (status.equals(MainContext.AgentStatusEnum.NOTREADY.toString())) { if (status.equals(MainContext.AgentStatusEnum.NOTREADY.toString())) {
List<AgentStatus> agentStatusList = agentStatusRepository.findByAgentnoAndOrgi(logined.getId(), super.getOrgi(request)); List<AgentStatus> agentStatusList = agentStatusRepository.findByAgentnoAndOrgi(
logined.getId(), super.getOrgi(request));
for (AgentStatus temp : agentStatusList) { for (AgentStatus temp : agentStatusList) {
AutomaticServiceDist.recordAgentStatus(temp.getAgentno(), temp.getUsername(), temp.getAgentno(), logined.isSuperuser(), temp.getAgentno(), temp.isBusy() ? MainContext.AgentStatusEnum.BUSY.toString() : MainContext.AgentStatusEnum.READY.toString(), MainContext.AgentStatusEnum.NOTREADY.toString(), MainContext.AgentWorkType.MEIDIACHAT.toString(), temp.getOrgi(), temp.getUpdatetime()); AutomaticServiceDist.recordAgentStatus(
temp.getAgentno(), temp.getUsername(), temp.getAgentno(),
logined.isAdmin(),
temp.getAgentno(),
temp.isBusy() ? MainContext.AgentStatusEnum.BUSY.toString() : MainContext.AgentStatusEnum.READY.toString(),
MainContext.AgentStatusEnum.NOTREADY.toString(),
MainContext.AgentWorkType.MEIDIACHAT.toString(), temp.getOrgi(), temp.getUpdatetime());
agentStatusRepository.delete(temp); agentStatusRepository.delete(temp);
} }
cache.deleteAgentStatusByAgentnoAndOrgi(super.getUser(request).getId(), super.getOrgi(request)); cache.deleteAgentStatusByAgentnoAndOrgi(super.getUser(request).getId(), super.getOrgi(request));
} else if (StringUtils.isNotBlank(status) && status.equals(MainContext.AgentStatusEnum.BUSY.toString())) { } else if (StringUtils.isNotBlank(status) && status.equals(MainContext.AgentStatusEnum.BUSY.toString())) {
List<AgentStatus> agentStatusList = agentStatusRepository.findByAgentnoAndOrgi(logined.getId(), super.getOrgi(request)); List<AgentStatus> agentStatusList = agentStatusRepository.findByAgentnoAndOrgi(
logined.getId(), super.getOrgi(request));
if (agentStatusList.size() > 0) { if (agentStatusList.size() > 0) {
agentStatus = agentStatusList.get(0); agentStatus = agentStatusList.get(0);
agentStatus.setBusy(true); agentStatus.setBusy(true);
AutomaticServiceDist.recordAgentStatus(agentStatus.getAgentno(), agentStatus.getUsername(), agentStatus.getAgentno(), logined.isSuperuser(), agentStatus.getAgentno(), MainContext.AgentStatusEnum.READY.toString(), MainContext.AgentStatusEnum.BUSY.toString(), MainContext.AgentWorkType.MEIDIACHAT.toString(), agentStatus.getOrgi(), agentStatus.getUpdatetime()); AutomaticServiceDist.recordAgentStatus(
agentStatus.getAgentno(), agentStatus.getUsername(), agentStatus.getAgentno(),
logined.isAdmin(), agentStatus.getAgentno(),
MainContext.AgentStatusEnum.READY.toString(), MainContext.AgentStatusEnum.BUSY.toString(),
MainContext.AgentWorkType.MEIDIACHAT.toString(), agentStatus.getOrgi(),
agentStatus.getUpdatetime());
agentStatus.setUpdatetime(new Date()); agentStatus.setUpdatetime(new Date());
agentStatusRepository.save(agentStatus); agentStatusRepository.save(agentStatus);
cache.putAgentStatusByOrgi(agentStatus, super.getOrgi(request)); cache.putAgentStatusByOrgi(agentStatus, super.getOrgi(request));
} }
} else if (StringUtils.isNotBlank(status) && status.equals(MainContext.AgentStatusEnum.NOTBUSY.toString())) { } else if (StringUtils.isNotBlank(status) && status.equals(
List<AgentStatus> agentStatusList = agentStatusRepository.findByAgentnoAndOrgi(logined.getId(), super.getOrgi(request)); MainContext.AgentStatusEnum.NOTBUSY.toString())) {
List<AgentStatus> agentStatusList = agentStatusRepository.findByAgentnoAndOrgi(
logined.getId(), super.getOrgi(request));
if (agentStatusList.size() > 0) { if (agentStatusList.size() > 0) {
agentStatus = agentStatusList.get(0); agentStatus = agentStatusList.get(0);
agentStatus.setBusy(false); agentStatus.setBusy(false);
AutomaticServiceDist.recordAgentStatus(agentStatus.getAgentno(), agentStatus.getUsername(), agentStatus.getAgentno(), logined.isSuperuser(), agentStatus.getAgentno(), MainContext.AgentStatusEnum.BUSY.toString(), MainContext.AgentStatusEnum.READY.toString(), MainContext.AgentWorkType.MEIDIACHAT.toString(), agentStatus.getOrgi(), agentStatus.getUpdatetime()); AutomaticServiceDist.recordAgentStatus(
agentStatus.getAgentno(), agentStatus.getUsername(), agentStatus.getAgentno(),
logined.isAdmin(), agentStatus.getAgentno(),
MainContext.AgentStatusEnum.BUSY.toString(), MainContext.AgentStatusEnum.READY.toString(),
MainContext.AgentWorkType.MEIDIACHAT.toString(), agentStatus.getOrgi(),
agentStatus.getUpdatetime());
agentStatus.setUpdatetime(new Date()); agentStatus.setUpdatetime(new Date());
agentStatusRepository.save(agentStatus); agentStatusRepository.save(agentStatus);
@ -156,7 +189,8 @@ public class ApiServiceQueneController extends Handler {
} }
AutomaticServiceDist.allotAgent(agentStatus.getAgentno(), super.getOrgi(request)); AutomaticServiceDist.allotAgent(agentStatus.getAgentno(), super.getOrgi(request));
} }
AutomaticServiceDist.broadcastAgentsStatus(super.getOrgi(request), "agent", "api", super.getUser(request).getId()); AutomaticServiceDist.broadcastAgentsStatus(
super.getOrgi(request), "agent", "api", super.getUser(request).getId());
} }
return new ResponseEntity<>(new RestResult(RestResultType.OK, agentStatus), HttpStatus.OK); return new ResponseEntity<>(new RestResult(RestResultType.OK, agentStatus), HttpStatus.OK);
} }

View File

@ -16,98 +16,195 @@
*/ */
package com.chatopera.cc.handler.api; package com.chatopera.cc.handler.api;
import javax.servlet.http.HttpServletRequest; import com.alibaba.fastjson.JSONArray;
import javax.validation.Valid; import com.alibaba.fastjson.JSONObject;
import com.chatopera.cc.basic.MainUtils;
import com.chatopera.cc.handler.Handler;
import com.chatopera.cc.handler.api.request.RestUtils;
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.util.Menu; import com.chatopera.cc.util.Menu;
import com.chatopera.cc.util.RestResult; import com.chatopera.cc.util.RestResult;
import com.chatopera.cc.handler.Handler; import com.chatopera.cc.util.RestResultType;
import com.chatopera.cc.model.User; import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.PageRequest;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.chatopera.cc.basic.MainUtils; import javax.servlet.http.HttpServletRequest;
import com.chatopera.cc.persistence.repository.UserRepository; import javax.validation.Valid;
import com.chatopera.cc.util.RestResultType; import java.util.List;
import java.util.stream.Collectors;
@RestController @RestController
@RequestMapping("/api/user") @RequestMapping("/api/user")
public class ApiUserController extends Handler { public class ApiUserController extends Handler {
private final static Logger logger = LoggerFactory.getLogger(ApiUserController.class);
@Autowired @Autowired
private UserRepository userRepository; private UserRepository userRepository;
/** @Autowired
* 返回用户列表支持分页分页参数为 p=1&ps=50默认分页尺寸为 20条每页 private OrganUserRepository organUserRepository;
* @param request
* @param username 搜索用户名精确搜索 /**
* @return * 返回用户列表支持分页分页参数为 p=1&ps=50默认分页尺寸为 20条每页
*/ *
@RequestMapping( method = RequestMethod.GET) * @param request
@Menu(type = "apps" , subtype = "user" , access = true) * @param username 搜索用户名精确搜索
public ResponseEntity<RestResult> list(HttpServletRequest request , @Valid String id , @Valid String username) { * @return
Page<User> userList = null ; */
if(!StringUtils.isBlank(id)){ @RequestMapping(method = RequestMethod.GET)
userList = userRepository.findByIdAndOrgi(id, super.getOrgi(request), new PageRequest(super.getP(request), super.getPs(request))) ; @Menu(type = "apps", subtype = "user", access = true)
}else{ public ResponseEntity<RestResult> list(HttpServletRequest request, @Valid String id, @Valid String username) {
if(!StringUtils.isBlank(username)){ Page<User> userList = null;
userList = userRepository.findByDatastatusAndOrgiAndUsernameLike(false, super.getOrgi(request), username , new PageRequest(super.getP(request), super.getPs(request))) ; if (!StringUtils.isBlank(id)) {
}else{ userList = userRepository.findByIdAndOrgi(
userList = userRepository.findByDatastatusAndOrgi(false, super.getOrgi(request), new PageRequest(super.getP(request), super.getPs(request))) ; id, super.getOrgi(request), new PageRequest(super.getP(request), super.getPs(request)));
} } else {
} if (!StringUtils.isBlank(username)) {
userList = userRepository.findByDatastatusAndOrgiAndUsernameLike(
false, super.getOrgi(request), username, new PageRequest(
super.getP(request),
super.getPs(request)));
} else {
userList = userRepository.findByDatastatusAndOrgi(
false, super.getOrgi(request), new PageRequest(super.getP(request), super.getPs(request)));
}
}
return new ResponseEntity<>(new RestResult(RestResultType.OK, userList), HttpStatus.OK); return new ResponseEntity<>(new RestResult(RestResultType.OK, userList), HttpStatus.OK);
} }
/** /**
* 新增或修改用户用户 在修改用户信息的时候如果用户 密码未改变请设置为 NULL * 新增或修改用户用户 在修改用户信息的时候如果用户 密码未改变请设置为 NULL
* @param request *
* @param user * @param request
* @return * @param user
*/ * @return
@RequestMapping(method = RequestMethod.PUT) */
@Menu(type = "apps" , subtype = "user" , access = true) @RequestMapping(method = RequestMethod.PUT)
public ResponseEntity<RestResult> put(HttpServletRequest request , @Valid User user) { @Menu(type = "apps", subtype = "user", access = true)
if(user != null && !StringUtils.isBlank(user.getUsername())){ public ResponseEntity<RestResult> put(HttpServletRequest request, @Valid User user) {
if(!StringUtils.isBlank(user.getPassword())){ if (user != null && !StringUtils.isBlank(user.getUsername())) {
user.setPassword(MainUtils.md5(user.getPassword())); if (!StringUtils.isBlank(user.getPassword())) {
userRepository.save(user) ; user.setPassword(MainUtils.md5(user.getPassword()));
}else if(!StringUtils.isBlank(user.getId())){ userRepository.save(user);
User old = userRepository.findByIdAndOrgi(user.getId(), super.getOrgi(request)) ; } else if (!StringUtils.isBlank(user.getId())) {
user.setPassword(old.getPassword()); User old = userRepository.findByIdAndOrgi(user.getId(), super.getOrgi(request));
userRepository.save(user) ; user.setPassword(old.getPassword());
} userRepository.save(user);
} }
}
return new ResponseEntity<>(new RestResult(RestResultType.OK), HttpStatus.OK); return new ResponseEntity<>(new RestResult(RestResultType.OK), HttpStatus.OK);
} }
/** /**
* 删除用户只提供 按照用户ID删除 并且不能删除系统管理员 * 删除用户只提供 按照用户ID删除 并且不能删除系统管理员
* @param request *
* @param id * @param request
* @return * @param id
*/ * @return
@RequestMapping(method = RequestMethod.DELETE) */
@Menu(type = "apps" , subtype = "user" , access = true) @RequestMapping(method = RequestMethod.DELETE)
public ResponseEntity<RestResult> delete(HttpServletRequest request , @Valid String id) { @Menu(type = "apps", subtype = "user", access = true)
RestResult result = new RestResult(RestResultType.OK) ; public ResponseEntity<RestResult> delete(HttpServletRequest request, @Valid String id) {
User user = null ; RestResult result = new RestResult(RestResultType.OK);
if(!StringUtils.isBlank(id)){ User user = null;
user = userRepository.findByIdAndOrgi(id, super.getOrgi(request)) ; if (!StringUtils.isBlank(id)) {
if(!user.getUsertype().equals("0")){ //系统管理员 不允许 使用 接口删除 user = userRepository.findByIdAndOrgi(id, super.getOrgi(request));
userRepository.delete(user); if (!user.isSuperadmin()) { //系统管理员 不允许 使用 接口删除
}else{ userRepository.delete(user);
result.setStatus(RestResultType.USER_DELETE); } else {
} result.setStatus(RestResultType.USER_DELETE);
} }
}
return new ResponseEntity<>(result, HttpStatus.OK); return new ResponseEntity<>(result, HttpStatus.OK);
} }
}
@RequestMapping(path = "/findByOrgan", method = RequestMethod.POST)
@Menu(type = "apps", subtype = "user", access = true)
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);
JSONArray json = new JSONArray();
users.stream().forEach(u -> {
JSONObject obj = new JSONObject();
obj.put("id", u.getId());
obj.put("uname", u.getUname());
json.add(obj);
});
return new ResponseEntity<>(new RestResult(RestResultType.OK, json), HttpStatus.OK);
}
/**
* 用户管理
*
* @param request
* @param body
* @param q
* @return
*/
@RequestMapping(method = RequestMethod.POST)
@Menu(type = "apps", subtype = "user", access = true)
public ResponseEntity<String> operations(HttpServletRequest request, @RequestBody final String body, @Valid String q) {
logger.info("[operations] body {}, q {}", body, q);
final JsonObject j = StringUtils.isBlank(body) ? (new JsonObject()) : (new JsonParser()).parse(
body).getAsJsonObject();
JsonObject json = new JsonObject();
HttpHeaders headers = RestUtils.header();
if (!j.has("ops")) {
json.addProperty(RestUtils.RESP_KEY_RC, RestUtils.RESP_RC_FAIL_1);
json.addProperty(RestUtils.RESP_KEY_ERROR, "不合法的请求参数。");
} else {
switch (StringUtils.lowerCase(j.get("ops").getAsString())) {
case "create":
json = create(request, j);
break;
default:
json.addProperty(RestUtils.RESP_KEY_RC, RestUtils.RESP_RC_FAIL_2);
json.addProperty(RestUtils.RESP_KEY_ERROR, "不合法的操作。");
}
}
return new ResponseEntity<String>(json.toString(), headers, HttpStatus.OK);
}
/**
* 创建新用户
*
* @param request
* @param payload
* @return
*/
private JsonObject create(final HttpServletRequest request, final JsonObject payload) {
JsonObject resp = new JsonObject();
// 从payload中创建User
// if (payload) {
// return resp;
// }
return resp;
}
}

View File

@ -85,7 +85,7 @@ public class AgentAuditController extends Handler {
private ServiceSummaryRepository serviceSummaryRes; private ServiceSummaryRepository serviceSummaryRes;
@Autowired @Autowired
private StatusEventRepository statusEventRes; private UserProxy userProxy;
@Autowired @Autowired
private OnlineUserRepository onlineUserRes; private OnlineUserRepository onlineUserRes;
@ -121,7 +121,8 @@ public class AgentAuditController extends Handler {
HttpServletRequest request, HttpServletRequest request,
@Valid final String skill, @Valid final String skill,
@Valid final String agentno, @Valid final String agentno,
@Valid String sort) { @Valid String sort
) {
final String orgi = super.getOrgi(request); final String orgi = super.getOrgi(request);
final User logined = super.getUser(request); final User logined = super.getUser(request);
logger.info("[index] skill {}, agentno {}, logined {}", skill, agentno, logined.getId()); logger.info("[index] skill {}, agentno {}, logined {}", skill, agentno, logined.getId());
@ -192,6 +193,38 @@ public class AgentAuditController extends Handler {
return view; return view;
} }
@RequestMapping("/query")
@Menu(type = "apps", subtype = "cca")
public ModelAndView query(HttpServletRequest request, String skill, String agentno) {
ModelAndView view = request(super.createRequestPageTempletResponse("/apps/cca/chatusers"));
final String orgi = super.getOrgi(request);
final User logined = super.getUser(request);
Sort defaultSort = new Sort(Sort.Direction.DESC, "status");
// 坐席对话列表
List<AgentUser> agentUsers;
if (StringUtils.isBlank(skill) && StringUtils.isBlank(agentno)) {
agentUsers = agentUserRes.findByOrgiAndStatusAndAgentnoIsNot(
orgi, MainContext.AgentUserStatusEnum.INSERVICE.toString(), logined.getId(), defaultSort);
} else if (StringUtils.isNotBlank(skill) && StringUtils.isNotBlank(agentno)) {
agentUsers = agentUserRes.findByOrgiAndStatusAndSkillAndAgentno(
orgi, MainContext.AgentUserStatusEnum.INSERVICE.toString(), skill, agentno, defaultSort);
} else if (StringUtils.isNotBlank(skill)) {
agentUsers = agentUserRes.findByOrgiAndStatusAndSkillAndAgentnoIsNot(
orgi, MainContext.AgentUserStatusEnum.INSERVICE.toString(), skill, agentno, defaultSort);
} else {
// agent is not Blank
agentUsers = agentUserRes.findByOrgiAndStatusAndAgentno(
orgi, MainContext.AgentUserStatusEnum.INSERVICE.toString(), agentno, defaultSort);
}
view.addObject("agentUserList", agentUsers);
return view;
}
@RequestMapping("/agentusers") @RequestMapping("/agentusers")
@Menu(type = "apps", subtype = "cca") @Menu(type = "apps", subtype = "cca")
@ -216,7 +249,8 @@ public class AgentAuditController extends Handler {
ModelMap map, ModelMap map,
HttpServletRequest request, HttpServletRequest request,
String id, String id,
String channel) throws IOException, TemplateException { String channel
) throws IOException, TemplateException {
String mainagentuser = "/apps/cca/mainagentuser"; String mainagentuser = "/apps/cca/mainagentuser";
if (channel.equals("phone")) { if (channel.equals("phone")) {
mainagentuser = "/apps/cca/mainagentuser_callout"; mainagentuser = "/apps/cca/mainagentuser_callout";
@ -247,8 +281,11 @@ public class AgentAuditController extends Handler {
view.addObject( view.addObject(
"agentUserMessageList", "agentUserMessageList",
this.chatMessageRepository.findByUsessionAndOrgi(agentUser.getUserid(), orgi, this.chatMessageRepository.findByUsessionAndOrgi(agentUser.getUserid(), orgi,
new PageRequest(0, 20, Sort.Direction.DESC, new PageRequest(0, 20, Sort.Direction.DESC,
"updatetime"))); "updatetime"
)
)
);
AgentService agentService = null; AgentService agentService = null;
if (StringUtils.isNotBlank(agentUser.getAgentserviceid())) { if (StringUtils.isNotBlank(agentUser.getAgentserviceid())) {
agentService = this.agentServiceRes.findOne(agentUser.getAgentserviceid()); agentService = this.agentServiceRes.findOne(agentUser.getAgentserviceid());
@ -277,10 +314,11 @@ public class AgentAuditController extends Handler {
view.addObject("serviceCount", Integer view.addObject("serviceCount", Integer
.valueOf(this.agentServiceRes .valueOf(this.agentServiceRes
.countByUseridAndOrgiAndStatus(agentUser .countByUseridAndOrgiAndStatus(agentUser
.getUserid(), orgi, .getUserid(), orgi,
MainContext.AgentUserStatusEnum.END MainContext.AgentUserStatusEnum.END
.toString()))); .toString()
)));
} }
SessionConfig sessionConfig = AutomaticServiceDist.initSessionConfig(super.getOrgi(request)); SessionConfig sessionConfig = AutomaticServiceDist.initSessionConfig(super.getOrgi(request));
@ -314,7 +352,8 @@ public class AgentAuditController extends Handler {
final @Valid String userid, final @Valid String userid,
final @Valid String agentserviceid, final @Valid String agentserviceid,
final @Valid String agentnoid, final @Valid String agentnoid,
final @Valid String agentuserid) { final @Valid String agentuserid
) {
logger.info("[transfer] userId {}, agentUser {}", userid, agentuserid); logger.info("[transfer] userId {}, agentUser {}", userid, agentuserid);
final String orgi = super.getOrgi(request); final String orgi = super.getOrgi(request);
final User logined = super.getUser(request); final User logined = super.getUser(request);
@ -347,7 +386,7 @@ public class AgentAuditController extends Handler {
for (final User o : userList) { for (final User o : userList) {
o.setAgentStatus(agentStatusMap.get(o.getId())); o.setAgentStatus(agentStatusMap.get(o.getId()));
// find user's skills // find user's skills
UserProxy.attachOrgansPropertiesForUser(o); userProxy.attachOrgansPropertiesForUser(o);
} }
map.addAttribute("userList", userList); map.addAttribute("userList", userList);
@ -378,7 +417,8 @@ public class AgentAuditController extends Handler {
ModelMap map, ModelMap map,
HttpServletRequest request, HttpServletRequest request,
@Valid String agentnoid, @Valid String agentnoid,
@Valid String organ) { @Valid String organ
) {
final String orgi = super.getOrgi(request); final String orgi = super.getOrgi(request);
if (StringUtils.isNotBlank(organ)) { if (StringUtils.isNotBlank(organ)) {
List<String> usersids = new ArrayList<String>(); List<String> usersids = new ArrayList<String>();
@ -392,7 +432,7 @@ public class AgentAuditController extends Handler {
} }
List<User> userList = userRes.findAll(usersids); List<User> userList = userRes.findAll(usersids);
for (User user : userList) { for (User user : userList) {
UserProxy.attachOrgansPropertiesForUser(user); userProxy.attachOrgansPropertiesForUser(user);
for (final AgentStatus as : agentStatusList) { for (final AgentStatus as : agentStatusList) {
if (StringUtils.equals(as.getAgentno(), user.getId())) { if (StringUtils.equals(as.getAgentno(), user.getId())) {
user.setAgentStatus(as); user.setAgentStatus(as);
@ -428,7 +468,8 @@ public class AgentAuditController extends Handler {
@Valid final String agentuserid, // 坐席访客ID @Valid final String agentuserid, // 坐席访客ID
@Valid final String currentAgentnoid, @Valid final String currentAgentnoid,
@Valid final String agentno, // 会话转接给下一个坐席 @Valid final String agentno, // 会话转接给下一个坐席
@Valid final String memo) throws CSKefuException { @Valid final String memo
) throws CSKefuException {
final String currentAgentno = currentAgentnoid; // 当前会话坐席的agentno final String currentAgentno = currentAgentnoid; // 当前会话坐席的agentno
final String orgi = super.getOrgi(request); final String orgi = super.getOrgi(request);
@ -488,7 +529,8 @@ public class AgentAuditController extends Handler {
MainContext.MessageType.STATUS, MainContext.MessageType.STATUS,
agentUser.getUserid(), agentUser.getUserid(),
outMessage, outMessage,
true); true
);
} }
// 通知转接消息给新坐席 // 通知转接消息给新坐席
@ -497,7 +539,8 @@ public class AgentAuditController extends Handler {
peerSyncIM.send( peerSyncIM.send(
MainContext.ReceiverType.AGENT, MainContext.ChannelType.WEBIM, MainContext.ReceiverType.AGENT, MainContext.ChannelType.WEBIM,
agentUser.getAppid(), MainContext.MessageType.NEW, agentService.getAgentno(), agentUser.getAppid(), MainContext.MessageType.NEW, agentService.getAgentno(),
outMessage, true); outMessage, true
);
} catch (Exception ex) { } catch (Exception ex) {
logger.error("[transfersave]", ex); logger.error("[transfersave]", ex);

View File

@ -160,6 +160,9 @@
private BrokerPublisher brokerPublisher; private BrokerPublisher brokerPublisher;
@Autowired
private UserProxy userProxy;
/** /**
* 坐席从联系人列表进入坐席工作台和该联系人聊天 * 坐席从联系人列表进入坐席工作台和该联系人聊天
* *
@ -521,7 +524,8 @@
public ModelAndView ready(HttpServletRequest request) { public ModelAndView ready(HttpServletRequest request) {
final User logined = super.getUser(request); final User logined = super.getUser(request);
final String orgi = super.getOrgi(request); final String orgi = super.getOrgi(request);
final AgentStatus agentStatus = agentProxy.resolveAgentStatusByAgentnoAndOrgi(logined.getId(), orgi, logined.getSkills()); final AgentStatus agentStatus = agentProxy.resolveAgentStatusByAgentnoAndOrgi(
logined.getId(), orgi, logined.getSkills());
// 缓存就绪状态 // 缓存就绪状态
agentProxy.ready(logined, agentStatus); agentProxy.ready(logined, agentStatus);
@ -538,7 +542,7 @@
AutomaticServiceDist.recordAgentStatus(agentStatus.getAgentno(), AutomaticServiceDist.recordAgentStatus(agentStatus.getAgentno(),
agentStatus.getUsername(), agentStatus.getUsername(),
agentStatus.getAgentno(), agentStatus.getAgentno(),
StringUtils.equals(logined.getUsertype(), "0"), // 0代表admin logined.isAdmin(), // 0代表admin
agentStatus.getAgentno(), agentStatus.getAgentno(),
MainContext.AgentStatusEnum.NOTREADY.toString(), MainContext.AgentStatusEnum.NOTREADY.toString(),
MainContext.AgentStatusEnum.READY.toString(), MainContext.AgentStatusEnum.READY.toString(),
@ -574,7 +578,7 @@
AutomaticServiceDist.recordAgentStatus(agentStatus.getAgentno(), AutomaticServiceDist.recordAgentStatus(agentStatus.getAgentno(),
agentStatus.getUsername(), agentStatus.getUsername(),
agentStatus.getAgentno(), agentStatus.getAgentno(),
logined.isSuperuser(), // 0代表admin logined.isAdmin(), // 0代表admin
agentStatus.getAgentno(), agentStatus.getAgentno(),
MainContext.AgentStatusEnum.READY.toString(), MainContext.AgentStatusEnum.READY.toString(),
MainContext.AgentStatusEnum.NOTREADY.toString(), MainContext.AgentStatusEnum.NOTREADY.toString(),
@ -603,7 +607,7 @@
agentStatus.getAgentno(), agentStatus.getAgentno(),
agentStatus.getUsername(), agentStatus.getUsername(),
agentStatus.getAgentno(), agentStatus.getAgentno(),
"0".equals(super.getUser(request).getUsertype()), super.getUser(request).isAdmin(),
agentStatus.getAgentno(), agentStatus.getAgentno(),
MainContext.AgentStatusEnum.NOTBUSY.toString(), MainContext.AgentStatusEnum.NOTBUSY.toString(),
MainContext.AgentStatusEnum.BUSY.toString(), MainContext.AgentStatusEnum.BUSY.toString(),
@ -644,7 +648,7 @@
agentStatus.getAgentno(), agentStatus.getAgentno(),
agentStatus.getUsername(), agentStatus.getUsername(),
agentStatus.getAgentno(), agentStatus.getAgentno(),
"0".equals(super.getUser(request).getUsertype()), super.getUser(request).isAdmin(),
agentStatus.getAgentno(), agentStatus.getAgentno(),
MainContext.AgentStatusEnum.BUSY.toString(), MainContext.AgentStatusEnum.BUSY.toString(),
MainContext.AgentStatusEnum.NOTBUSY.toString(), MainContext.AgentStatusEnum.NOTBUSY.toString(),
@ -705,7 +709,7 @@
if (agentUser != null) { if (agentUser != null) {
if ((StringUtils.equals( if ((StringUtils.equals(
logined.getId(), agentUser.getAgentno()) || logined.isSuperuser())) { logined.getId(), agentUser.getAgentno()) || logined.isAdmin())) {
// 删除访客-坐席关联关系包括缓存 // 删除访客-坐席关联关系包括缓存
try { try {
AutomaticServiceDist.deleteAgentUser(agentUser, orgi); AutomaticServiceDist.deleteAgentUser(agentUser, orgi);
@ -1151,7 +1155,7 @@
for (final User o : userList) { for (final User o : userList) {
o.setAgentStatus(agentStatusMap.get(o.getId())); o.setAgentStatus(agentStatusMap.get(o.getId()));
// find user's skills // find user's skills
UserProxy.attachOrgansPropertiesForUser(o); userProxy.attachOrgansPropertiesForUser(o);
} }
map.addAttribute("userList", userList); map.addAttribute("userList", userList);
@ -1194,7 +1198,7 @@
} }
List<User> userList = userRes.findAll(usersids); List<User> userList = userRes.findAll(usersids);
for (User user : userList) { for (User user : userList) {
UserProxy.attachOrgansPropertiesForUser(user); userProxy.attachOrgansPropertiesForUser(user);
for (final AgentStatus as : agentStatusList) { for (final AgentStatus as : agentStatusList) {
if (StringUtils.equals(as.getAgentno(), user.getId())) { if (StringUtils.equals(as.getAgentno(), user.getId())) {
user.setAgentStatus(as); user.setAgentStatus(as);

View File

@ -70,6 +70,9 @@ public class AppsController extends Handler {
@Autowired @Autowired
private Cache cache; private Cache cache;
@Autowired
private UserProxy userProxy;
@RequestMapping({"/apps/content"}) @RequestMapping({"/apps/content"})
@Menu(type = "apps", subtype = "content") @Menu(type = "apps", subtype = "content")
public ModelAndView content(ModelMap map, HttpServletRequest request, @Valid String msg) { public ModelAndView content(ModelMap map, HttpServletRequest request, @Valid String msg) {
@ -90,7 +93,7 @@ public class AppsController extends Handler {
Sort.Direction.DESC, Sort.Direction.DESC,
"createtime" "createtime"
) )
); );
final long msec = System.currentTimeMillis(); final long msec = System.currentTimeMillis();
final List<String> contactIds = new ArrayList<String>(); final List<String> contactIds = new ArrayList<String>();
@ -136,27 +139,59 @@ public class AppsController extends Handler {
private void aggValues(ModelMap map, HttpServletRequest request) { private void aggValues(ModelMap map, HttpServletRequest request) {
map.put("agentReport", AutomaticServiceDist.getAgentReport(super.getOrgi(request))); map.put("agentReport", AutomaticServiceDist.getAgentReport(super.getOrgi(request)));
map.put("webIMReport", MainUtils.getWebIMReport(userEventRes.findByOrgiAndCreatetimeRange(super.getOrgi(request), MainUtils.getStartTime(), MainUtils.getEndTime()))); map.put(
"webIMReport", MainUtils.getWebIMReport(
userEventRes.findByOrgiAndCreatetimeRange(super.getOrgi(request), MainUtils.getStartTime(),
MainUtils.getEndTime())));
// TODO 此处为什么不用agentReport中的agents // TODO 此处为什么不用agentReport中的agents
map.put("agents", getUsers(request).size()); map.put("agents", getUsers(request).size());
map.put("webIMInvite", MainUtils.getWebIMInviteStatus(onlineUserRes.findByOrgiAndStatus(super.getOrgi(request), MainContext.OnlineUserStatusEnum.ONLINE.toString()))); map.put(
"webIMInvite", MainUtils.getWebIMInviteStatus(onlineUserRes.findByOrgiAndStatus(
super.getOrgi(request),
MainContext.OnlineUserStatusEnum.ONLINE.toString())));
map.put("inviteResult", MainUtils.getWebIMInviteResult(onlineUserRes.findByOrgiAndAgentnoAndCreatetimeRange(super.getOrgi(request), super.getUser(request).getId(), MainUtils.getStartTime(), MainUtils.getEndTime()))); map.put(
"inviteResult", MainUtils.getWebIMInviteResult(
onlineUserRes.findByOrgiAndAgentnoAndCreatetimeRange(
super.getOrgi(request),
super.getUser(request).getId(),
MainUtils.getStartTime(),
MainUtils.getEndTime())));
map.put("agentUserCount", onlineUserRes.countByAgentForAgentUser(super.getOrgi(request), MainContext.AgentUserStatusEnum.INSERVICE.toString(), super.getUser(request).getId(), MainUtils.getStartTime(), MainUtils.getEndTime())); map.put(
"agentUserCount", onlineUserRes.countByAgentForAgentUser(
super.getOrgi(request),
MainContext.AgentUserStatusEnum.INSERVICE.toString(),
super.getUser(request).getId(),
MainUtils.getStartTime(),
MainUtils.getEndTime()));
map.put("agentServicesCount", onlineUserRes.countByAgentForAgentUser(super.getOrgi(request), MainContext.AgentUserStatusEnum.END.toString(), super.getUser(request).getId(), MainUtils.getStartTime(), MainUtils.getEndTime())); map.put(
"agentServicesCount", onlineUserRes.countByAgentForAgentUser(
super.getOrgi(request),
MainContext.AgentUserStatusEnum.END.toString(),
super.getUser(request).getId(),
MainUtils.getStartTime(),
MainUtils.getEndTime()));
map.put("agentServicesAvg", onlineUserRes.countByAgentForAvagTime(super.getOrgi(request), MainContext.AgentUserStatusEnum.END.toString(), super.getUser(request).getId(), MainUtils.getStartTime(), MainUtils.getEndTime())); map.put(
"agentServicesAvg", onlineUserRes.countByAgentForAvagTime(
super.getOrgi(request),
MainContext.AgentUserStatusEnum.END.toString(),
super.getUser(request).getId(),
MainUtils.getStartTime(),
MainUtils.getEndTime()));
} }
@RequestMapping({"/apps/onlineuser"}) @RequestMapping({"/apps/onlineuser"})
@Menu(type = "apps", subtype = "onlineuser") @Menu(type = "apps", subtype = "onlineuser")
public ModelAndView onlineuser(ModelMap map, HttpServletRequest request) { public ModelAndView onlineuser(ModelMap map, HttpServletRequest request) {
Page<OnlineUser> onlineUserList = this.onlineUserRes.findByOrgiAndStatus(super.getOrgi(request), MainContext.OnlineUserStatusEnum.ONLINE.toString(), new PageRequest(super.getP(request), super.getPs(request), Sort.Direction.DESC, "createtime")); Page<OnlineUser> onlineUserList = this.onlineUserRes.findByOrgiAndStatus(
super.getOrgi(request), MainContext.OnlineUserStatusEnum.ONLINE.toString(),
new PageRequest(super.getP(request), super.getPs(request), Sort.Direction.DESC, "createtime"));
List<String> ids = new ArrayList<String>(); List<String> ids = new ArrayList<String>();
for (OnlineUser onlineUser : onlineUserList.getContent()) { for (OnlineUser onlineUser : onlineUserList.getContent()) {
onlineUser.setBetweentime((int) (System.currentTimeMillis() - onlineUser.getLogintime().getTime())); onlineUser.setBetweentime((int) (System.currentTimeMillis() - onlineUser.getLogintime().getTime()));
@ -194,6 +229,8 @@ public class AppsController extends Handler {
@Menu(type = "apps", subtype = "content") @Menu(type = "apps", subtype = "content")
public ModelAndView profile(ModelMap map, HttpServletRequest request, @Valid User user, @Valid String index) { public ModelAndView profile(ModelMap map, HttpServletRequest request, @Valid User user, @Valid String index) {
User tempUser = userRes.getOne(user.getId()); User tempUser = userRes.getOne(user.getId());
final User logined = super.getUser(request);
if (tempUser != null) { if (tempUser != null) {
String msg = validUserUpdate(user, tempUser); String msg = validUserUpdate(user, tempUser);
if (StringUtils.isNotBlank(msg)) { if (StringUtils.isNotBlank(msg)) {
@ -206,8 +243,8 @@ public class AppsController extends Handler {
tempUser.setEmail(user.getEmail()); tempUser.setEmail(user.getEmail());
tempUser.setMobile(user.getMobile()); tempUser.setMobile(user.getMobile());
if (super.getUser(request).isSuperuser()) { if (logined.isAdmin()) {
// 作为超级管理员强制设置为坐席 // 作为管理员强制设置为坐席
tempUser.setAgent(true); tempUser.setAgent(true);
} else { } else {
tempUser.setAgent(user.isAgent()); tempUser.setAgent(user.isAgent());
@ -231,9 +268,11 @@ public class AppsController extends Handler {
super.setUser(request, u); super.setUser(request, u);
//切换成非坐席 判断是否坐席 以及 是否有对话 //切换成非坐席 判断是否坐席 以及 是否有对话
if (!user.isAgent()) { if (!user.isAgent()) {
AgentStatus agentStatus = cache.findOneAgentStatusByAgentnoAndOrig((super.getUser(request)).getId(), super.getOrgi(request)); AgentStatus agentStatus = cache.findOneAgentStatusByAgentnoAndOrig(
(super.getUser(request)).getId(), super.getOrgi(request));
if (!(agentStatus == null && cache.getInservAgentUsersSizeByAgentnoAndOrgi(super.getUser(request).getId(), super.getOrgi(request)) == 0)) { if (!(agentStatus == null && cache.getInservAgentUsersSizeByAgentnoAndOrgi(
super.getUser(request).getId(), super.getOrgi(request)) == 0)) {
if (StringUtils.isBlank(index)) { if (StringUtils.isBlank(index)) {
return request(super.createRequestPageTempletResponse("redirect:/apps/content.html?msg=t1")); return request(super.createRequestPageTempletResponse("redirect:/apps/content.html?msg=t1"));
} }
@ -291,7 +330,7 @@ public class AppsController extends Handler {
organIdList.add(rel.getSkillid()); organIdList.add(rel.getSkillid());
} }
} }
userList = UserProxy.findByOrganInAndAgentAndDatastatus(organIdList, true, false); userList = userProxy.findByOrganInAndAgentAndDatastatus(organIdList, true, false);
} else { } else {
userList = userRes.findByOrgiAndAgentAndDatastatus(super.getOrgi(request), true, false); userList = userRes.findByOrgiAndAgentAndDatastatus(super.getOrgi(request), true, false);
} }

View File

@ -19,10 +19,7 @@ package com.chatopera.cc.handler.apps;
import com.chatopera.cc.basic.MainUtils; import com.chatopera.cc.basic.MainUtils;
import com.chatopera.cc.handler.Handler; import com.chatopera.cc.handler.Handler;
import com.chatopera.cc.model.IMGroup; import com.chatopera.cc.model.*;
import com.chatopera.cc.model.IMGroupUser;
import com.chatopera.cc.model.RecentUser;
import com.chatopera.cc.model.User;
import com.chatopera.cc.persistence.repository.*; import com.chatopera.cc.persistence.repository.*;
import com.chatopera.cc.proxy.UserProxy; import com.chatopera.cc.proxy.UserProxy;
import com.chatopera.cc.socketio.client.NettyClients; import com.chatopera.cc.socketio.client.NettyClients;
@ -65,6 +62,9 @@ public class EntIMController extends Handler {
@Autowired @Autowired
private RecentUserRepository recentUserRes; private RecentUserRepository recentUserRes;
@Autowired
private UserProxy userProxy;
@RequestMapping("/index") @RequestMapping("/index")
@Menu(type = "im", subtype = "entim", access = false) @Menu(type = "im", subtype = "entim", access = false)
public ModelAndView index(HttpServletRequest request, HttpServletResponse response) { public ModelAndView index(HttpServletRequest request, HttpServletResponse response) {
@ -74,7 +74,7 @@ public class EntIMController extends Handler {
// TODO: 优化性能 // TODO: 优化性能
for (User u : users) { for (User u : users) {
UserProxy.attachOrgansPropertiesForUser(u); userProxy.attachOrgansPropertiesForUser(u);
} }
view.addObject("userList", users); view.addObject("userList", users);
@ -108,7 +108,14 @@ public class EntIMController extends Handler {
@Menu(type = "im", subtype = "entim", access = false) @Menu(type = "im", subtype = "entim", access = false)
public ModelAndView chat(HttpServletRequest request, HttpServletResponse response, @Valid String userid) { public ModelAndView chat(HttpServletRequest request, HttpServletResponse response, @Valid String userid) {
ModelAndView view = request(super.createEntIMTempletResponse("/apps/entim/chat")); ModelAndView view = request(super.createEntIMTempletResponse("/apps/entim/chat"));
view.addObject("entimuser", userRes.findByIdAndOrgi(userid, super.getOrgi(request))); User entImUser = userRes.findByIdAndOrgi(userid, super.getOrgi(request));
if (entImUser != null) {
userProxy.attachOrgansPropertiesForUser(entImUser);
view.addObject("organs", entImUser.getOrgans().values());
}
view.addObject("entimuser", entImUser);
view.addObject("contextid", MainUtils.genNewID(super.getUser(request).getId(), userid)); view.addObject("contextid", MainUtils.genNewID(super.getUser(request).getId(), userid));
view.addObject("online", NettyClients.getInstance().getEntIMClientsNum(userid) > 0); view.addObject("online", NettyClients.getInstance().getEntIMClientsNum(userid) > 0);
@ -179,13 +186,13 @@ public class EntIMController extends Handler {
public ModelAndView user(HttpServletRequest request, HttpServletResponse response, @Valid String id) { public ModelAndView user(HttpServletRequest request, HttpServletResponse response, @Valid String id) {
ModelAndView view = request(super.createEntIMTempletResponse("/apps/entim/group/user")); ModelAndView view = request(super.createEntIMTempletResponse("/apps/entim/group/user"));
User logined = super.getUser(request); User logined = super.getUser(request);
UserProxy.attachOrgansPropertiesForUser(logined); userProxy.attachOrgansPropertiesForUser(logined);
// TODO: 优化性能 // TODO: 优化性能
List<String> organIds = UserProxy.findOrgansByUserid(logined.getId()); List<String> organIds = userProxy.findOrgansByUserid(logined.getId());
List<User> users = UserProxy.findByOrganInAndDatastatus(organIds, false); List<User> users = userProxy.findByOrganInAndDatastatus(organIds, false);
for (User u : users) { for (User u : users) {
UserProxy.attachOrgansPropertiesForUser(u); userProxy.attachOrgansPropertiesForUser(u);
} }
IMGroup imGroup = imGroupRes.findById(id); IMGroup imGroup = imGroupRes.findById(id);

View File

@ -73,16 +73,18 @@ public class TenantController extends Handler {
@RequestMapping("/index") @RequestMapping("/index")
@Menu(type = "apps", subtype = "tenant") @Menu(type = "apps", subtype = "tenant")
public ModelAndView index(ModelMap map, final HttpServletRequest request, public ModelAndView index(
final @Valid String msg, ModelMap map, final HttpServletRequest request,
final @Valid String currentorgi, final @Valid String msg,
final @Valid String currentname) throws IOException { final @Valid String currentorgi,
final @Valid String currentname) throws IOException {
if (super.isEnabletneant()) { if (super.isEnabletneant()) {
// "0"代表超级用户 // 超级管理员开启多租户访问
if ("0".equals(super.getUser(request).getUsertype())) { if (super.getUser(request).isAdmin()) {
map.addAttribute("tenantList", tenantRes.findByOrgid(super.getOrgid(request))); map.addAttribute("tenantList", tenantRes.findByOrgid(super.getOrgid(request)));
} else { } else {
List<OrgiSkillRel> orgiSkillRelList = orgiSkillRelRes.findBySkillidIn(new ArrayList<>((super.getUser(request)).getAffiliates())); List<OrgiSkillRel> orgiSkillRelList = orgiSkillRelRes.findBySkillidIn(
new ArrayList<>((super.getUser(request)).getAffiliates()));
List<Tenant> tenantList = null; List<Tenant> tenantList = null;
if (!orgiSkillRelList.isEmpty()) { if (!orgiSkillRelList.isEmpty()) {
tenantList = new ArrayList<Tenant>(); tenantList = new ArrayList<Tenant>();
@ -112,7 +114,8 @@ public class TenantController extends Handler {
public ModelAndView add(ModelMap map, HttpServletRequest request) { public ModelAndView add(ModelMap map, HttpServletRequest request) {
if (super.isTenantshare()) { if (super.isTenantshare()) {
map.addAttribute("isShowSkillGroups", true); map.addAttribute("isShowSkillGroups", true);
List<Organ> organList = organRes.findByOrgiAndOrgid(super.getOrgiByTenantshare(request), super.getOrgid(request)); List<Organ> organList = organRes.findByOrgiAndOrgid(
super.getOrgiByTenantshare(request), super.getOrgid(request));
map.addAttribute("skillGroups", organList); map.addAttribute("skillGroups", organList);
} }
return request(super.createRequestPageTempletResponse("/apps/tenant/add")); return request(super.createRequestPageTempletResponse("/apps/tenant/add"));
@ -131,7 +134,8 @@ public class TenantController extends Handler {
if (!logoDir.exists()) { if (!logoDir.exists()) {
logoDir.mkdirs(); logoDir.mkdirs();
} }
String fileName = "tenantpic/" + tenant.getId() + tenantpic.getOriginalFilename().substring(tenantpic.getOriginalFilename().lastIndexOf(".")); String fileName = "tenantpic/" + tenant.getId() + tenantpic.getOriginalFilename().substring(
tenantpic.getOriginalFilename().lastIndexOf("."));
FileCopyUtils.copy(tenantpic.getBytes(), new File(path, fileName)); FileCopyUtils.copy(tenantpic.getBytes(), new File(path, fileName));
tenant.setTenantlogo(fileName); tenant.setTenantlogo(fileName);
} }
@ -164,7 +168,8 @@ public class TenantController extends Handler {
public ModelAndView edit(ModelMap map, HttpServletRequest request, @Valid String id) { public ModelAndView edit(ModelMap map, HttpServletRequest request, @Valid String id) {
if (super.isTenantshare()) { if (super.isTenantshare()) {
map.addAttribute("isShowSkillGroups", true); map.addAttribute("isShowSkillGroups", true);
List<Organ> organList = organRes.findByOrgiAndOrgid(super.getOrgiByTenantshare(request), super.getOrgid(request)); List<Organ> organList = organRes.findByOrgiAndOrgid(
super.getOrgiByTenantshare(request), super.getOrgid(request));
map.addAttribute("skillGroups", organList); map.addAttribute("skillGroups", organList);
List<OrgiSkillRel> orgiSkillRelList = orgiSkillRelRes.findByOrgi(id); List<OrgiSkillRel> orgiSkillRelList = orgiSkillRelRes.findByOrgi(id);
map.addAttribute("orgiSkillRelList", orgiSkillRelList); map.addAttribute("orgiSkillRelList", orgiSkillRelList);
@ -188,7 +193,8 @@ public class TenantController extends Handler {
if (!logoDir.exists()) { if (!logoDir.exists()) {
logoDir.mkdirs(); logoDir.mkdirs();
} }
String fileName = "tenantpic/" + tenant.getId() + tenantpic.getOriginalFilename().substring(tenantpic.getOriginalFilename().lastIndexOf(".")); String fileName = "tenantpic/" + tenant.getId() + tenantpic.getOriginalFilename().substring(
tenantpic.getOriginalFilename().lastIndexOf("."));
FileCopyUtils.copy(tenantpic.getBytes(), new File(path, fileName)); FileCopyUtils.copy(tenantpic.getBytes(), new File(path, fileName));
tenant.setTenantlogo(fileName); tenant.setTenantlogo(fileName);
} else { } else {
@ -232,8 +238,10 @@ public class TenantController extends Handler {
@Menu(type = "apps", subtype = "tenant") @Menu(type = "apps", subtype = "tenant")
public ModelAndView canswitch(HttpServletRequest request, @Valid Tenant tenant) throws UnsupportedEncodingException { public ModelAndView canswitch(HttpServletRequest request, @Valid Tenant tenant) throws UnsupportedEncodingException {
ModelAndView view = request(super.createRequestPageTempletResponse("redirect:/")); ModelAndView view = request(super.createRequestPageTempletResponse("redirect:/"));
AgentStatus agentStatus = cache.findOneAgentStatusByAgentnoAndOrig((super.getUser(request)).getId(), super.getOrgi(request)); AgentStatus agentStatus = cache.findOneAgentStatusByAgentnoAndOrig(
if (agentStatus == null && cache.getInservAgentUsersSizeByAgentnoAndOrgi(super.getUser(request).getId(), super.getOrgi(request)) == 0) { (super.getUser(request)).getId(), super.getOrgi(request));
if (agentStatus == null && cache.getInservAgentUsersSizeByAgentnoAndOrgi(
super.getUser(request).getId(), super.getOrgi(request)) == 0) {
Tenant temp = tenantRes.findById(tenant.getId()); Tenant temp = tenantRes.findById(tenant.getId());
if (temp != null) { if (temp != null) {
super.getUser(request).setOrgi(temp.getId()); super.getUser(request).setOrgi(temp.getId());
@ -249,10 +257,14 @@ public class TenantController extends Handler {
return view; return view;
} else { } else {
Tenant temp = tenantRes.findById(agentStatus.getOrgi()); Tenant temp = tenantRes.findById(agentStatus.getOrgi());
return request(super.createRequestPageTempletResponse("redirect:/apps/tenant/index.html?msg=t0" + "&currentorgi=" + agentStatus.getOrgi() + "&currentname=" + URLEncoder.encode(temp != null ? temp.getTenantname() : "", "UTF-8"))); return request(super.createRequestPageTempletResponse(
"redirect:/apps/tenant/index.html?msg=t0" + "&currentorgi=" + agentStatus.getOrgi() + "&currentname=" + URLEncoder.encode(
temp != null ? temp.getTenantname() : "", "UTF-8")));
} }
} }
AgentUser agentUser = agentUserRepository.findOneByAgentnoAndStatusAndOrgi(super.getUser(request).getId(), MainContext.AgentUserStatusEnum.INSERVICE.toString(), super.getOrgi(request)); AgentUser agentUser = agentUserRepository.findOneByAgentnoAndStatusAndOrgi(
super.getUser(request).getId(), MainContext.AgentUserStatusEnum.INSERVICE.toString(),
super.getOrgi(request));
if (agentUser != null) { if (agentUser != null) {
if (tenant.getId().equals(agentUser.getOrgi())) { if (tenant.getId().equals(agentUser.getOrgi())) {
Tenant temp = tenantRes.findById(tenant.getId()); Tenant temp = tenantRes.findById(tenant.getId());
@ -262,7 +274,9 @@ public class TenantController extends Handler {
return view; return view;
} else { } else {
Tenant temp = tenantRes.findById(agentUser.getOrgi()); Tenant temp = tenantRes.findById(agentUser.getOrgi());
return request(super.createRequestPageTempletResponse("redirect:/apps/tenant/index.html?msg=t0" + "&currentorgi=" + agentUser.getOrgi() + "&currentname=" + URLEncoder.encode(temp != null ? temp.getTenantname() : "", "UTF-8"))); return request(super.createRequestPageTempletResponse(
"redirect:/apps/tenant/index.html?msg=t0" + "&currentorgi=" + agentUser.getOrgi() + "&currentname=" + URLEncoder.encode(
temp != null ? temp.getTenantname() : "", "UTF-8")));
} }
} }

View File

@ -91,7 +91,7 @@ public class ChatServiceController extends Handler {
private OrgiSkillRelRepository orgiSkillRelService; private OrgiSkillRelRepository orgiSkillRelService;
@Autowired @Autowired
private AgentAuditProxy agentAuditProxy; private UserProxy userProxy;
@Autowired @Autowired
private Cache cache; private Cache cache;
@ -191,7 +191,7 @@ public class ChatServiceController extends Handler {
List<User> userList = userRes.findAll(usersids); List<User> userList = userRes.findAll(usersids);
for (User user : userList) { for (User user : userList) {
user.setAgentStatus(cache.findOneAgentStatusByAgentnoAndOrig(user.getId(), super.getOrgi(request))); user.setAgentStatus(cache.findOneAgentStatusByAgentnoAndOrig(user.getId(), super.getOrgi(request)));
UserProxy.attachOrgansPropertiesForUser(user); userProxy.attachOrgansPropertiesForUser(user);
} }
map.addAttribute("userList", userList); map.addAttribute("userList", userList);
map.addAttribute("userid", agentService.getUserid()); map.addAttribute("userid", agentService.getUserid());
@ -463,7 +463,7 @@ public class ChatServiceController extends Handler {
organIdList.add(rel.getSkillid()); organIdList.add(rel.getSkillid());
} }
} }
userList = UserProxy.findByOrganInAndAgentAndDatastatus( userList = userProxy.findByOrganInAndAgentAndDatastatus(
organIdList, true, false, new PageRequest(super.getP(request), super.getPs(request), Direction.DESC, organIdList, true, false, new PageRequest(super.getP(request), super.getPs(request), Direction.DESC,
"createtime")); "createtime"));
} else { } else {

View File

@ -50,6 +50,9 @@ public class UsersResourceController extends Handler {
@Autowired @Autowired
private OrganRepository organRes; private OrganRepository organRes;
@Autowired
private UserProxy userProxy;
@RequestMapping("/users") @RequestMapping("/users")
@Menu(type = "res", subtype = "users") @Menu(type = "res", subtype = "users")
public ModelAndView add(ModelMap map, HttpServletRequest request, @Valid String q, @Valid String id) { public ModelAndView add(ModelMap map, HttpServletRequest request, @Valid String q, @Valid String id) {
@ -89,7 +92,7 @@ public class UsersResourceController extends Handler {
organIdList.add(rel.getSkillid()); organIdList.add(rel.getSkillid());
} }
} }
list = UserProxy.findByOrganInAndDatastatus(organIdList, false); list = userProxy.findByOrganInAndDatastatus(organIdList, false);
} else { } else {
list = userRes.findByOrgiAndDatastatus(super.getOrgi(request), false); list = userRes.findByOrgiAndDatastatus(super.getOrgi(request), false);
} }
@ -116,7 +119,7 @@ public class UsersResourceController extends Handler {
organIdList.add(rel.getSkillid()); organIdList.add(rel.getSkillid());
} }
} }
list = UserProxy.findByOrganInAndDatastatusAndUsernameLike(organIdList, false, "%" + q + "%", new PageRequest(0, 10)); list = userProxy.findByOrganInAndDatastatusAndUsernameLike(organIdList, false, "%" + q + "%", new PageRequest(0, 10));
} else { } else {
list = userRes.findByDatastatusAndOrgiAndOrgidAndUsernameLike(false, super.getOrgi(request), super.getOrgid(request), "%" + q + "%", new PageRequest(0, 10)); list = userRes.findByDatastatusAndOrgiAndOrgidAndUsernameLike(false, super.getOrgi(request), super.getOrgid(request), "%" + q + "%", new PageRequest(0, 10));
} }

View File

@ -51,9 +51,8 @@ public class User implements java.io.Serializable {
private String birthday; private String birthday;
private String nickname; private String nickname;
private String secureconf = "5"; private String secureconf = "5";
private String usertype; // 0 Admin User : !0 Other User private boolean admin; // 是否是管理员
private boolean superadmin = false; // 是否是超级管理员
private boolean superuser = false; //是否是超级管理员
private String orgi; private String orgi;
private String orgid; private String orgid;
@ -265,16 +264,6 @@ public class User implements java.io.Serializable {
} }
public String getUsertype() {
return usertype;
}
public void setUsertype(String usertype) {
this.usertype = usertype;
}
public String getOrgi() { public String getOrgi() {
return orgi; return orgi;
} }
@ -470,8 +459,20 @@ public class User implements java.io.Serializable {
this.callcenter = callcenter; this.callcenter = callcenter;
} }
public boolean isSuperuser() { public boolean isAdmin() {
return superuser; return admin;
}
public void setAdmin(boolean admin) {
this.admin = admin;
}
public boolean isSuperadmin() {
return superadmin;
}
public void setSuperadmin(boolean superadmin) {
this.superadmin = superadmin;
} }
@Transient @Transient
@ -483,10 +484,6 @@ public class User implements java.io.Serializable {
this.roleAuthMap = roleAuthMap; this.roleAuthMap = roleAuthMap;
} }
public void setSuperuser(boolean superuser) {
this.superuser = superuser;
}
public String getOrgid() { public String getOrgid() {
return orgid; return orgid;
} }

View File

@ -17,6 +17,7 @@
package com.chatopera.cc.persistence.repository; package com.chatopera.cc.persistence.repository;
import java.util.List; import java.util.List;
import java.util.Optional;
import com.chatopera.cc.model.User; import com.chatopera.cc.model.User;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
@ -28,14 +29,12 @@ import org.springframework.data.repository.query.Param;
public interface UserRepository extends JpaRepository<User, String> { public interface UserRepository extends JpaRepository<User, String> {
User findByIdAndOrgi(String paramString, String orgi); User findByIdAndOrgi(String paramString, String orgi);
User findById(String id); User findById(String id);
User findByEmailAndDatastatus(String email, boolean datastatus); User findByEmailAndDatastatus(String email, boolean datastatus);
User findByMobileAndDatastatus(String mobile, boolean datastatus); User findByMobileAndDatastatus(String mobile, boolean datastatus);
List<User> findBySipaccountAndDatastatus(String sipaccount, boolean datastatus); @Query(value = "SELECT * FROM cs_user WHERE sipaccount = ?1 AND DATASTATUS = ?2 LIMIT 1", nativeQuery = true)
Optional<User> findOneBySipaccountAndDatastatus(String sipaccount, boolean datastatus);
@Query(value = "SELECT u FROM User u WHERE sipaccount <> '' AND datastatus = 0") @Query(value = "SELECT u FROM User u WHERE sipaccount <> '' AND datastatus = 0")
List<User> findBySipaccountIsNotNullAndDatastatusIsFalse(); List<User> findBySipaccountIsNotNullAndDatastatusIsFalse();
@ -46,31 +45,25 @@ public interface UserRepository extends JpaRepository<User, String> {
List<User> findAllByCallcenterIsTrueAndDatastatusIsFalseAndIdIn(@Param("users") List<String> users); List<User> findAllByCallcenterIsTrueAndDatastatusIsFalseAndIdIn(@Param("users") List<String> users);
User findByUsernameAndDatastatus(String username, boolean datastatus); User findByUsernameAndDatastatus(String username, boolean datastatus);
User findByUsernameAndPasswordAndDatastatus(String username, String password, boolean datastatus); User findByUsernameAndPasswordAndDatastatus(String username, String password, boolean datastatus);
User findByMobileAndPasswordAndDatastatus(String mobile, String password, boolean datastatus); User findByMobileAndPasswordAndDatastatus(String mobile, String password, boolean datastatus);
User findByUsernameAndOrgi(String paramString, String orgi); User findByUsernameAndOrgi(String paramString, String orgi);
User findByUsernameAndPassword(String username, String password); User findByUsernameAndPassword(String username, String password);
Page<User> findByOrgi(String orgi, Pageable paramPageable); Page<User> findByOrgi(String orgi, Pageable paramPageable);
// // 查询超级管理员
// List<User> findBySuperadminAndOrgi(boolean isSuperadmin, final String orgi);
// 查询所有管理员 // 查询所有管理员
List<User> findBySuperuserAndOrgi(boolean isSuperuser, final String orgi); List<User> findByAdminAndOrgi(boolean admin, final String orgi);
List<User> findByOrgi(String orgi); List<User> findByOrgi(String orgi);
Page<User> findByDatastatusAndOrgi(boolean datastatus, String orgi, Pageable paramPageable); Page<User> findByDatastatusAndOrgi(boolean datastatus, String orgi, Pageable paramPageable);
Page<User> findByDatastatusAndOrgiAndUsernameLike(boolean datastatus, String orgi, String username, Pageable paramPageable); Page<User> findByDatastatusAndOrgiAndUsernameLike(boolean datastatus, String orgi, String username, Pageable paramPageable);
Page<User> findByIdAndOrgi(String id, String orgi, Pageable paramPageable); Page<User> findByIdAndOrgi(String id, String orgi, Pageable paramPageable);
List<User> findByOrgiAndDatastatusAndIdIn(
List<User> findByOrgiAndDatastatusAndIdIn(String orgi, String orgi,
boolean datastatus, boolean datastatus,
List<String> users); List<String> users);
@Query(value = "SELECT s.sipaccount from User s " + @Query(value = "SELECT s.sipaccount from User s " +
"WHERE " + "WHERE " +
@ -78,9 +71,10 @@ public interface UserRepository extends JpaRepository<User, String> {
"s.datastatus = :datastatus AND " + "s.datastatus = :datastatus AND " +
"s.id IN :users AND " + "s.id IN :users AND " +
"s.orgi = :orgi") "s.orgi = :orgi")
List<String> findSipsByDatastatusAndOrgiAndIdIn(@Param("datastatus") boolean datastatus, List<String> findSipsByDatastatusAndOrgiAndIdIn(
@Param("orgi") String orgi, @Param("datastatus") boolean datastatus,
@Param("users") List<String> users); @Param("orgi") String orgi,
@Param("users") List<String> users);
List<User> findByOrgiAndDatastatus(final String orgi, final boolean datastatus); List<User> findByOrgiAndDatastatus(final String orgi, final boolean datastatus);
@ -88,31 +82,40 @@ public interface UserRepository extends JpaRepository<User, String> {
List<User> findByOrgiAndAgentAndDatastatus(final String orgi, final boolean agent, final boolean status); List<User> findByOrgiAndAgentAndDatastatus(final String orgi, final boolean agent, final boolean status);
long countByAgentAndDatastatusAndIdIn(final boolean agent, long countByAgentAndDatastatusAndIdIn(
final boolean datastatus, final boolean agent,
final List<String> users); final boolean datastatus,
final List<String> users);
List<User> findAll(Specification<User> spec); List<User> findAll(Specification<User> spec);
Page<User> findByDatastatusAndOrgiAndOrgid(boolean b, String orgi, String orgid, Page<User> findByDatastatusAndOrgiAndOrgid(
Pageable pageRequest); boolean b, String orgi, String orgid,
Pageable pageRequest);
Page<User> findByDatastatusAndOrgiAndOrgidAndSuperadminNot(
boolean datastatus, String orgi, String orgid, boolean superadmin,
Pageable pageRequest);
List<User> findByOrgiAndDatastatusAndOrgid(String orgi, boolean b, String orgid); List<User> findByOrgiAndDatastatusAndOrgid(String orgi, boolean b, String orgid);
Page<User> findByDatastatusAndOrgiAndOrgidAndUsernameLike(boolean Datastatus, Page<User> findByDatastatusAndOrgiAndOrgidAndUsernameLike(
final String orgi, boolean Datastatus,
final String orgid, final String orgi,
final String username, final String orgid,
Pageable pageRequest); final String username,
Pageable pageRequest);
Page<User> findByAgentAndDatastatusAndIdIn(boolean agent, Page<User> findByAgentAndDatastatusAndIdIn(
boolean datastatus, boolean agent,
final List<String> users, boolean datastatus,
Pageable pageRequest); final List<String> users,
Pageable pageRequest);
List<User> findByAgentAndDatastatusAndIdIn(boolean agent, boolean datastatus, final List<String> users); List<User> findByAgentAndDatastatusAndIdIn(boolean agent, boolean datastatus, final List<String> users);
@ -120,9 +123,10 @@ public interface UserRepository extends JpaRepository<User, String> {
List<User> findByDatastatusAndIdIn(boolean datastatus, List<String> users); List<User> findByDatastatusAndIdIn(boolean datastatus, List<String> users);
Page<User> findByDatastatusAndUsernameLikeAndIdIn(boolean datastatus, Page<User> findByDatastatusAndUsernameLikeAndIdIn(
final String username, boolean datastatus,
final List<String> users, Pageable pageRequest); final String username,
final List<String> users, Pageable pageRequest);
List<User> findByOrgidAndAgentAndDatastatus(String orgid, boolean agent, boolean datastatus); List<User> findByOrgidAndAgentAndDatastatus(String orgid, boolean agent, boolean datastatus);

View File

@ -276,8 +276,8 @@ public class AgentUserProxy {
bypass.add(agentUser.getAgentno()); bypass.add(agentUser.getAgentno());
} }
// 首先查看超级用户 // 首先查看管理员
List<User> admins = userRes.findBySuperuserAndOrgi(true, orgi); List<User> admins = userRes.findByAdminAndOrgi(true, orgi);
for (final User user : admins) { for (final User user : admins) {
if (bypass.contains(user.getId())) continue; if (bypass.contains(user.getId())) continue;

View File

@ -69,6 +69,7 @@ public class OnlineUserProxy {
private static AgentUserProxy agentUserProxy; private static AgentUserProxy agentUserProxy;
private static AgentUserContactsRepository agentUserContactsRes; private static AgentUserContactsRepository agentUserContactsRes;
private static ContactsRepository contactsRes; private static ContactsRepository contactsRes;
private static UserProxy userProxy;
// Compare two onlineUser by createtime // Compare two onlineUser by createtime
public final static Comparator<OnlineUser> compareByCreateTime = (OnlineUser o1, OnlineUser o2) -> o1.getCreatetime().compareTo( public final static Comparator<OnlineUser> compareByCreateTime = (OnlineUser o1, OnlineUser o2) -> o1.getCreatetime().compareTo(
@ -362,7 +363,7 @@ public class OnlineUserProxy {
for (User user : agentList) { for (User user : agentList) {
// TODO 此处的查询处理比较多应使用缓存 // TODO 此处的查询处理比较多应使用缓存
// 一个用户可隶属于多个组织 // 一个用户可隶属于多个组织
UserProxy.attachOrgansPropertiesForUser(user); getUserProxy().attachOrgansPropertiesForUser(user);
for (OrgiSkillRel rel : orgiSkillRelList) { for (OrgiSkillRel rel : orgiSkillRelList) {
if (user.getOrgans().size() > 0 && user.inAffiliates(rel.getSkillid())) { if (user.getOrgans().size() > 0 && user.inAffiliates(rel.getSkillid())) {
agentTempList.add(user); agentTempList.add(user);
@ -1557,4 +1558,11 @@ public class OnlineUserProxy {
} }
return orgiSkillRelRes; return orgiSkillRelRes;
} }
public static UserProxy getUserProxy() {
if (userProxy == null) {
userProxy = MainContext.getContext().getBean(UserProxy.class);
}
return userProxy;
}
} }

View File

@ -11,38 +11,84 @@
package com.chatopera.cc.proxy; package com.chatopera.cc.proxy;
import com.chatopera.cc.basic.Constants;
import com.chatopera.cc.basic.MainContext; import com.chatopera.cc.basic.MainContext;
import com.chatopera.cc.basic.MainUtils;
import com.chatopera.cc.model.Organ; import com.chatopera.cc.model.Organ;
import com.chatopera.cc.model.OrganUser; import com.chatopera.cc.model.OrganUser;
import com.chatopera.cc.model.User; import com.chatopera.cc.model.User;
import com.chatopera.cc.persistence.repository.OrganRepository; import com.chatopera.cc.persistence.repository.OrganRepository;
import com.chatopera.cc.persistence.repository.OrganUserRepository; import com.chatopera.cc.persistence.repository.OrganUserRepository;
import com.chatopera.cc.persistence.repository.UserRepository; import com.chatopera.cc.persistence.repository.UserRepository;
import com.google.gson.JsonObject;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Component;
import java.util.*; import java.util.*;
/** /**
* 用户/坐席 常用方法 * 用户/坐席 常用方法
*/ */
@Component
public class UserProxy { public class UserProxy {
private final static Logger logger = LoggerFactory.getLogger(UserProxy.class); private final static Logger logger = LoggerFactory.getLogger(UserProxy.class);
private static OrganUserRepository organUserRes; @Autowired
private static OrganRepository organRes; private OrganUserRepository organUserRes;
private static UserRepository userRes;
@Autowired
private OrganRepository organRes;
public static User findOne(final String id) { @Autowired
return getUserRes().findOne(id); private UserRepository userRes;
/**
* 创建新用户
* 支持多租户
*
* @param user
* @param orgi
* @param orgid
* @param orgiByTenantshare
* @return
*/
public String createNewUser(final User user, final String orgi, final String orgid, final String orgiByTenantshare) {
String msg = "";
msg = validUser(user);
if (StringUtils.isNotBlank(msg) && !msg.equals("new_user_success")) {
return msg;
} else {
// 此时 msg new_user_success
user.setSuperadmin(false); // 不支持创建第二个超级管理员
if (StringUtils.isNotBlank(user.getPassword())) {
user.setPassword(MainUtils.md5(user.getPassword()));
}
user.setOrgi(orgiByTenantshare);
if (StringUtils.isNotBlank(orgid)) {
user.setOrgid(orgid);
} else {
user.setOrgid(MainContext.SYSTEM_ORGI);
}
userRes.save(user);
OnlineUserProxy.clean(orgi);
}
return msg;
} }
public static List<String> findUserIdsInOrgan(final String organ) { public User findOne(final String id) {
List<OrganUser> x = getOrganUserRes().findByOrgan(organ); return userRes.findOne(id);
}
public List<String> findUserIdsInOrgan(final String organ) {
List<OrganUser> x = organUserRes.findByOrgan(organ);
if (x.size() == 0) { if (x.size() == 0) {
return null; return null;
@ -55,9 +101,9 @@ public class UserProxy {
return z; return z;
} }
public static List<String> findUserIdsInOrgans(final List<String> organs) { public List<String> findUserIdsInOrgans(final List<String> organs) {
List<OrganUser> x = getOrganUserRes().findByOrganIn(organs); List<OrganUser> x = organUserRes.findByOrganIn(organs);
if (x.size() == 0) return null; if (x.size() == 0) return null;
@ -78,9 +124,9 @@ public class UserProxy {
* @param agentno * @param agentno
* @return * @return
*/ */
public static HashMap<String, String> getSkillsMapByAgentno(final String agentno) { public HashMap<String, String> getSkillsMapByAgentno(final String agentno) {
final User user = getUserRes().findOne(agentno); final User user = userRes.findOne(agentno);
if (user == null) return new HashMap<>(); if (user == null) return new HashMap<>();
attachOrgansPropertiesForUser(user); attachOrgansPropertiesForUser(user);
@ -93,8 +139,8 @@ public class UserProxy {
* @param userid * @param userid
* @return * @return
*/ */
public static List<String> findOrgansByUserid(final String userid) { public List<String> findOrgansByUserid(final String userid) {
List<OrganUser> x = getOrganUserRes().findByUserid(userid); List<OrganUser> x = organUserRes.findByUserid(userid);
if (x.size() == 0) return null; if (x.size() == 0) return null;
@ -108,7 +154,7 @@ public class UserProxy {
} }
public static Page<User> findByOrganInAndAgentAndDatastatus( public Page<User> findByOrganInAndAgentAndDatastatus(
final List<String> organs, final List<String> organs,
boolean agent, boolean agent,
boolean datastatus, boolean datastatus,
@ -117,11 +163,11 @@ public class UserProxy {
if (users == null) return null; if (users == null) return null;
return getUserRes().findByAgentAndDatastatusAndIdIn(agent, datastatus, users, pageRequest); return userRes.findByAgentAndDatastatusAndIdIn(agent, datastatus, users, pageRequest);
} }
public static List<User> findByOrganInAndAgentAndDatastatus( public List<User> findByOrganInAndAgentAndDatastatus(
final List<String> organs, final List<String> organs,
boolean agent, boolean agent,
boolean datastatus) { boolean datastatus) {
@ -129,51 +175,146 @@ public class UserProxy {
if (users == null) return null; if (users == null) return null;
return getUserRes().findByAgentAndDatastatusAndIdIn(agent, datastatus, users); return userRes.findByAgentAndDatastatusAndIdIn(agent, datastatus, users);
} }
public List<User> findByOrganInAndDatastatus(
public static List<User> findByOrganInAndDatastatus(
final List<String> organs, final List<String> organs,
boolean datastatus) { boolean datastatus) {
List<String> users = findUserIdsInOrgans(organs); List<String> users = findUserIdsInOrgans(organs);
if (users == null) return null; if (users == null) return null;
return getUserRes().findByDatastatusAndIdIn(datastatus, users); return userRes.findByDatastatusAndIdIn(datastatus, users);
} }
public Page<User> findByOrganInAndDatastatusAndUsernameLike(
public static Page<User> findByOrganInAndDatastatusAndUsernameLike(
final List<String> organs, final List<String> organs,
final boolean datastatus, final boolean datastatus,
final String username, final String username,
Pageable pageRequest) { Pageable pageRequest) {
List<String> users = findUserIdsInOrgans(organs); List<String> users = findUserIdsInOrgans(organs);
if (users == null) return null; if (users == null) return null;
return userRes.findByDatastatusAndUsernameLikeAndIdIn(datastatus, username, users, pageRequest);
return getUserRes().findByDatastatusAndUsernameLikeAndIdIn(datastatus, username, users, pageRequest);
} }
public static List<User> findByOrganAndOrgiAndDatastatus(final String organ, final String orgi, final boolean datastatus) { public List<User> findByOrganAndOrgiAndDatastatus(final String organ, final String orgi, final boolean datastatus) {
List<String> users = findUserIdsInOrgan(organ); List<String> users = findUserIdsInOrgan(organ);
if (users == null) return null; if (users == null) return null;
return getUserRes().findByOrgiAndDatastatusAndIdIn(orgi, datastatus, users); return userRes.findByOrgiAndDatastatusAndIdIn(orgi, datastatus, users);
} }
/**
* 根据是否开启呼叫中心模块检测账号
*
* @param user
* @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;
}
public static List<User> findAllByCallcenterIsTrueAndDatastatusIsFalseAndOrgan(final String organ) { /**
* 从Json中创建User
*
* @param json
* @return
*/
private User exetractUserFromJson(final JsonObject json) {
User tempUser = new User();
if (json.has("username")) {
String val = json.get("username").getAsString();
if (StringUtils.isNotBlank(val)) {
tempUser.setUsername(val);
}
}
if (json.has("uname")) {
String val = json.get("uname").getAsString();
if (StringUtils.isNotBlank(val)) {
tempUser.setUname(val);
}
}
if (json.has("email")) {
String val = json.get("email").getAsString();
if (StringUtils.isNotBlank(val)) {
tempUser.setEmail(val);
}
}
if (json.has("mobile")) {
String val = json.get("mobile").getAsString();
if (StringUtils.isNotBlank(val)) {
tempUser.setMobile(val);
}
}
// 密码
return tempUser;
}
/**
* 验证用户数据合法性
*
* @param user
* @return
*/
public String validUser(final User user) {
String msg = "";
User tempUser = userRes.findByUsernameAndDatastatus(user.getUsername(), false);
if (tempUser != null) {
msg = "username_exist";
return msg;
}
if (StringUtils.isNotBlank(user.getEmail())) {
tempUser = userRes.findByEmailAndDatastatus(user.getEmail(), false);
if (tempUser != null) {
msg = "email_exist";
return msg;
}
}
if (StringUtils.isNotBlank(user.getMobile())) {
tempUser = userRes.findByMobileAndDatastatus(user.getMobile(), false);
if (tempUser != null) {
msg = "mobile_exist";
return msg;
}
}
if (!validUserCallcenterParams(user)) {
msg = "sip_account_exist";
return msg;
}
if (tempUser == null && validUserCallcenterParams(user)) {
msg = "new_user_success";
return msg;
}
return msg;
}
public List<User> findAllByCallcenterIsTrueAndDatastatusIsFalseAndOrgan(final String organ) {
final List<String> users = findUserIdsInOrgan(organ); final List<String> users = findUserIdsInOrgan(organ);
if (users == null) return null; if (users == null) return null;
return getUserRes().findAllByCallcenterIsTrueAndDatastatusIsFalseAndIdIn(users); return userRes.findAllByCallcenterIsTrueAndDatastatusIsFalseAndIdIn(users);
} }
@ -185,12 +326,12 @@ public class UserProxy {
* @param orgi * @param orgi
* @return * @return
*/ */
public static List<String> findSipsByOrganAndDatastatusAndOrgi(final String organ, final boolean datastatus, final String orgi) { public List<String> findSipsByOrganAndDatastatusAndOrgi(final String organ, final boolean datastatus, final String orgi) {
List<String> users = findUserIdsInOrgan(organ); List<String> users = findUserIdsInOrgan(organ);
if (users == null) return null; if (users == null) return null;
return getUserRes().findSipsByDatastatusAndOrgiAndIdIn(datastatus, orgi, users); return userRes.findSipsByDatastatusAndOrgiAndIdIn(datastatus, orgi, users);
} }
@ -203,7 +344,7 @@ public class UserProxy {
* @param organ * @param organ
* @return * @return
*/ */
public static long countByOrgiAndAgentAndDatastatusAndOrgan( public long countByOrgiAndAgentAndDatastatusAndOrgan(
final String orgi, final String orgi,
final boolean agent, final boolean agent,
final boolean datastatus, final boolean datastatus,
@ -213,7 +354,7 @@ public class UserProxy {
if (users == null) return 0; if (users == null) return 0;
return getUserRes().countByAgentAndDatastatusAndIdIn(agent, datastatus, users); return userRes.countByAgentAndDatastatusAndIdIn(agent, datastatus, users);
} }
@ -222,7 +363,7 @@ public class UserProxy {
* *
* @param user * @param user
*/ */
public static void processAffiliates(final User user, final Map<String, String> skills, final Organ organ) { public void processAffiliates(final User user, final Map<String, String> skills, final Organ organ) {
if (organ == null) { if (organ == null) {
return; return;
} }
@ -236,7 +377,7 @@ public class UserProxy {
if (organ.isSkill()) skills.put(organ.getId(), organ.getName()); if (organ.isSkill()) skills.put(organ.getId(), organ.getName());
// 获得子部门 // 获得子部门
List<Organ> y = getOrganRes().findByOrgiAndParent(user.getOrgi(), organ.getId()); List<Organ> y = organRes.findByOrgiAndParent(user.getOrgi(), organ.getId());
for (Organ x : y) { for (Organ x : y) {
try { try {
@ -253,14 +394,14 @@ public class UserProxy {
* *
* @param user * @param user
*/ */
public static void attachOrgansPropertiesForUser(final User user) { public void attachOrgansPropertiesForUser(final User user) {
List<OrganUser> organs = getOrganUserRes().findByUserid(user.getId()); List<OrganUser> organs = organUserRes.findByUserid(user.getId());
user.setOrgans(new HashMap<>()); user.setOrgans(new HashMap<>());
final HashMap<String, String> skills = new HashMap<>(); final HashMap<String, String> skills = new HashMap<>();
for (final OrganUser organ : organs) { for (final OrganUser organ : organs) {
// 添加直属部门到organs // 添加直属部门到organs
final Organ o = getOrganRes().findOne(organ.getOrgan()); final Organ o = organRes.findOne(organ.getOrgan());
user.getOrgans().put(organ.getOrgan(), o); user.getOrgans().put(organ.getOrgan(), o);
// 添加部门及附属部门 // 添加部门及附属部门
@ -269,26 +410,4 @@ public class UserProxy {
user.setSkills(skills); user.setSkills(skills);
} }
private static OrganRepository getOrganRes() {
if (organRes == null) {
organRes = MainContext.getContext().getBean(OrganRepository.class);
}
return organRes;
}
private static OrganUserRepository getOrganUserRes() {
if (organUserRes == null) {
organUserRes = MainContext.getContext().getBean(OrganUserRepository.class);
}
return organUserRes;
}
private static UserRepository getUserRes() {
if (userRes == null) {
userRes = MainContext.getContext().getBean(UserRepository.class);
}
return userRes;
}
} }

View File

@ -65,6 +65,7 @@ public class AgentEventHandler {
private static AgentUserProxy agentUserProxy; private static AgentUserProxy agentUserProxy;
private static AgentProxy agentProxy; private static AgentProxy agentProxy;
private static AgentSessionProxy agentSessionProxy; private static AgentSessionProxy agentSessionProxy;
private static UserProxy userProxy;
@OnConnect @OnConnect
public void onConnect(SocketIOClient client) { public void onConnect(SocketIOClient client) {
@ -93,7 +94,7 @@ public class AgentEventHandler {
agentStatus.setConnected(true); agentStatus.setConnected(true);
// 设置agentSkills // 设置agentSkills
agentStatus.setSkills(UserProxy.getSkillsMapByAgentno(userid)); agentStatus.setSkills(getUserProxy().getSkillsMapByAgentno(userid));
getAgentStatusRes().save(agentStatus); getAgentStatusRes().save(agentStatus);
MainContext.getCache().putAgentStatusByOrgi(agentStatus, orgi); MainContext.getCache().putAgentStatusByOrgi(agentStatus, orgi);
@ -199,7 +200,7 @@ public class AgentEventHandler {
return; return;
} }
final User supervisor = UserProxy.findOne(received.getSupervisorid()); final User supervisor = getUserProxy().findOne(received.getSupervisorid());
final Date now = new Date(); final Date now = new Date();
// 创建消息 // 创建消息
@ -355,4 +356,10 @@ public class AgentEventHandler {
return agentSessionProxy; return agentSessionProxy;
} }
public static UserProxy getUserProxy() {
if (userProxy == null) {
userProxy = MainContext.getContext().getBean(UserProxy.class);
}
return userProxy;
}
} }

View File

@ -43,6 +43,9 @@ import static org.elasticsearch.index.query.QueryBuilders.termQuery;
public class CallCenterUtils { public class CallCenterUtils {
private static UserProxy userProxy;
/** /**
* @param extno * @param extno
* @param sipTrunkRes * @param sipTrunkRes
@ -108,7 +111,8 @@ public class CallCenterUtils {
ArrayList<String> organList = new ArrayList<String>(); ArrayList<String> organList = new ArrayList<String>();
if (userRole.size() > 0) { if (userRole.size() > 0) {
for (UserRole userTemp : userRole) { for (UserRole userTemp : userRole) {
UKefuCallOutRole roleOrgan = callOutRoleRes.findByOrgiAndRoleid(user.getOrgi(), UKefuCallOutRole roleOrgan = callOutRoleRes.findByOrgiAndRoleid(
user.getOrgi(),
userTemp.getRole().getId()); userTemp.getRole().getId());
if (roleOrgan != null) { if (roleOrgan != null) {
if (StringUtils.isNotBlank(roleOrgan.getOrganid())) { if (StringUtils.isNotBlank(roleOrgan.getOrganid())) {
@ -122,7 +126,7 @@ public class CallCenterUtils {
} }
} }
UserProxy.attachOrgansPropertiesForUser(user); getUserProxy().attachOrgansPropertiesForUser(user);
if (user.getAffiliates().size() > 0) { if (user.getAffiliates().size() > 0) {
for (final String organ : user.getAffiliates()) { for (final String organ : user.getAffiliates()) {
organList.add(organ); organList.add(organ);
@ -149,8 +153,9 @@ public class CallCenterUtils {
List<JobDetail> batchList = batchRes.findAll(new Specification<JobDetail>() { List<JobDetail> batchList = batchRes.findAll(new Specification<JobDetail>() {
@Override @Override
public Predicate toPredicate(Root<JobDetail> root, CriteriaQuery<?> query, public Predicate toPredicate(
CriteriaBuilder cb) { Root<JobDetail> root, CriteriaQuery<?> query,
CriteriaBuilder cb) {
List<Predicate> list = new ArrayList<Predicate>(); List<Predicate> list = new ArrayList<Predicate>();
In<Object> in = cb.in(root.get("organ")); In<Object> in = cb.in(root.get("organ"));
@ -192,8 +197,9 @@ public class CallCenterUtils {
List<FormFilter> formFilterList = filterRes.findAll(new Specification<FormFilter>() { List<FormFilter> formFilterList = filterRes.findAll(new Specification<FormFilter>() {
@Override @Override
public Predicate toPredicate(Root<FormFilter> root, CriteriaQuery<?> query, public Predicate toPredicate(
CriteriaBuilder cb) { Root<FormFilter> root, CriteriaQuery<?> query,
CriteriaBuilder cb) {
List<Predicate> list = new ArrayList<Predicate>(); List<Predicate> list = new ArrayList<Predicate>();
In<Object> in = cb.in(root.get("organ")); In<Object> in = cb.in(root.get("organ"));
@ -234,8 +240,9 @@ public class CallCenterUtils {
List<JobDetail> activityList = batchRes.findAll(new Specification<JobDetail>() { List<JobDetail> activityList = batchRes.findAll(new Specification<JobDetail>() {
@Override @Override
public Predicate toPredicate(Root<JobDetail> root, CriteriaQuery<?> query, public Predicate toPredicate(
CriteriaBuilder cb) { Root<JobDetail> root, CriteriaQuery<?> query,
CriteriaBuilder cb) {
List<Predicate> list = new ArrayList<Predicate>(); List<Predicate> list = new ArrayList<Predicate>();
In<Object> in = cb.in(root.get("organ")); In<Object> in = cb.in(root.get("organ"));
@ -278,7 +285,8 @@ public class CallCenterUtils {
List<JobDetail> activityList = CallCenterUtils.getActivityList(batchRes, userRoleRes, callOutRoleRes, user); List<JobDetail> activityList = CallCenterUtils.getActivityList(batchRes, userRoleRes, callOutRoleRes, user);
List<SaleStatus> salestatusList = new ArrayList<>(); List<SaleStatus> salestatusList = new ArrayList<>();
for (JobDetail act : activityList) { for (JobDetail act : activityList) {
List<SaleStatus> salestastus = MainContext.getContext().getBean(SaleStatusRepository.class).findByOrgiAndActivityid(user.getOrgi(), act.getDicid()); List<SaleStatus> salestastus = MainContext.getContext().getBean(
SaleStatusRepository.class).findByOrgiAndActivityid(user.getOrgi(), act.getDicid());
salestatusList.addAll(salestastus); salestatusList.addAll(salestastus);
} }
@ -292,14 +300,24 @@ public class CallCenterUtils {
map.put("formFilterList", CallCenterUtils.getFormFilterList(filterRes, userRoleRes, callOutRoleRes, user)); map.put("formFilterList", CallCenterUtils.getFormFilterList(filterRes, userRoleRes, callOutRoleRes, user));
if (StringUtils.isBlank(ownerdept)) { if (StringUtils.isBlank(ownerdept)) {
map.addAttribute("owneruserList", UserProxy.findByOrganAndOrgiAndDatastatus(Constants.CSKEFU_SYSTEM_NO_DAT, user.getOrgi(), false)); map.addAttribute(
"owneruserList",
getUserProxy().findByOrganAndOrgiAndDatastatus(
Constants.CSKEFU_SYSTEM_NO_DAT, user.getOrgi(), false));
} else { } else {
map.addAttribute("owneruserList", UserProxy.findByOrganAndOrgiAndDatastatus(ownerdept, user.getOrgi(), false)); map.addAttribute(
"owneruserList", getUserProxy().findByOrganAndOrgiAndDatastatus(ownerdept, user.getOrgi(), false));
} }
map.addAttribute("skillGroups", organRes.findAll(CallCenterUtils.getAuthOrgan(userRoleRes, callOutRoleRes, user))); map.addAttribute(
map.put("taskList", MainContext.getContext().getBean(UKefuCallOutTaskRepository.class).findByActidAndOrgi(actid, user.getOrgi())); "skillGroups", organRes.findAll(CallCenterUtils.getAuthOrgan(userRoleRes, callOutRoleRes, user)));
map.put("allUserList", MainContext.getContext().getBean(UserRepository.class).findByOrgiAndDatastatus(user.getOrgi(), false)); map.put(
"taskList", MainContext.getContext().getBean(UKefuCallOutTaskRepository.class).findByActidAndOrgi(
actid,
user.getOrgi()));
map.put(
"allUserList",
MainContext.getContext().getBean(UserRepository.class).findByOrgiAndDatastatus(user.getOrgi(), false));
//JobDetail act = batchRes.findByIdAndOrgi(actid, user.getOrgi()); //JobDetail act = batchRes.findByIdAndOrgi(actid, user.getOrgi());
//if(act != null){ //if(act != null){
// map.put("salestatusList",MainContext.getContext().getBean(SaleStatusRepository.class).findByOrgiAndActivityid(user.getOrgi(), act.getDicid())); // map.put("salestatusList",MainContext.getContext().getBean(SaleStatusRepository.class).findByOrgiAndActivityid(user.getOrgi(), act.getDicid()));
@ -370,7 +388,8 @@ public class CallCenterUtils {
UKefuCallOutTaskRepository callOutTaskRes = MainContext.getContext().getBean(UKefuCallOutTaskRepository.class); UKefuCallOutTaskRepository callOutTaskRes = MainContext.getContext().getBean(UKefuCallOutTaskRepository.class);
JobDetailRepository batchRes = MainContext.getContext().getBean(JobDetailRepository.class); JobDetailRepository batchRes = MainContext.getContext().getBean(JobDetailRepository.class);
UKefuCallOutFilterRepository callOutFilterRes = MainContext.getContext().getBean(UKefuCallOutFilterRepository.class); UKefuCallOutFilterRepository callOutFilterRes = MainContext.getContext().getBean(
UKefuCallOutFilterRepository.class);
//修改拨打任务 //修改拨打任务
if (task != null) { if (task != null) {
@ -405,7 +424,8 @@ public class CallCenterUtils {
public static void getAgentReorgannum(UKefuCallOutTask task, UKefuCallOutFilter ukefuCallOutFilter) { public static void getAgentReorgannum(UKefuCallOutTask task, UKefuCallOutFilter ukefuCallOutFilter) {
UKefuCallOutTaskRepository callOutTaskRes = MainContext.getContext().getBean(UKefuCallOutTaskRepository.class); UKefuCallOutTaskRepository callOutTaskRes = MainContext.getContext().getBean(UKefuCallOutTaskRepository.class);
UKefuCallOutFilterRepository callOutFilterRes = MainContext.getContext().getBean(UKefuCallOutFilterRepository.class); UKefuCallOutFilterRepository callOutFilterRes = MainContext.getContext().getBean(
UKefuCallOutFilterRepository.class);
//修改拨打任务 //修改拨打任务
if (task != null) { if (task != null) {
@ -435,7 +455,8 @@ public class CallCenterUtils {
UKefuCallOutTaskRepository callOutTaskRes = MainContext.getContext().getBean(UKefuCallOutTaskRepository.class); UKefuCallOutTaskRepository callOutTaskRes = MainContext.getContext().getBean(UKefuCallOutTaskRepository.class);
JobDetailRepository batchRes = MainContext.getContext().getBean(JobDetailRepository.class); JobDetailRepository batchRes = MainContext.getContext().getBean(JobDetailRepository.class);
UKefuCallOutFilterRepository callOutFilterRes = MainContext.getContext().getBean(UKefuCallOutFilterRepository.class); UKefuCallOutFilterRepository callOutFilterRes = MainContext.getContext().getBean(
UKefuCallOutFilterRepository.class);
//修改拨打任务 //修改拨打任务
if (task != null) { if (task != null) {
@ -476,5 +497,10 @@ public class CallCenterUtils {
return dataList.getContent().size(); return dataList.getContent().size();
} }
public static UserProxy getUserProxy() {
if (userProxy == null) {
userProxy = MainContext.getContext().getBean(UserProxy.class);
}
return userProxy;
}
} }

View File

@ -18,9 +18,6 @@
# 在集群状态下每个Node都有自己唯一的ID # 在集群状态下每个Node都有自己唯一的ID
application.node.id=localhost application.node.id=localhost
# 运行环境production|development
application.env=production
############################################## ##############################################
# 安全设置 # 安全设置
############################################## ##############################################

View File

@ -39,7 +39,7 @@
<i class="layui-icon">&#xe642;</i> <i class="layui-icon">&#xe642;</i>
编辑 编辑
</a> </a>
<#if !(snsAccount.usertype?? && snsAccount.usertype == "0") && snsAccount.datastatus != true > <#if !(snsAccount.admin) && snsAccount.datastatus != true >
<a href="/admin/im/delete.html?id=${snsAccount.id!''}" style="margin-left:10px;" data-toggle="tip" <#if secret?? && secret.enable == true>data-confirm="请输入二次安全验证密码"</#if> title="删除网站需要进行二次密码验证,请确认是否删除?" > <a href="/admin/im/delete.html?id=${snsAccount.id!''}" style="margin-left:10px;" data-toggle="tip" <#if secret?? && secret.enable == true>data-confirm="请输入二次安全验证密码"</#if> title="删除网站需要进行二次密码验证,请确认是否删除?" >
<i class="layui-icon" style="color:red;">&#x1006;</i> <i class="layui-icon" style="color:red;">&#x1006;</i>
删除 删除
@ -75,9 +75,9 @@
var layer = layui.layer; var layer = layui.layer;
console.log(window.location.href) console.log(window.location.href)
<#if status?? && status == 'new_webim_success'> <#if status?? && status == 'new_webim_success'>
layer.msg('网站添加成功',{icon: 1, offset: 'rb', time: 1000}) layer.msg('网站添加成功',{icon: 1, time: 1000})
<#elseif status?? && status == 'new_webim_fail'> <#elseif status?? && status == 'new_webim_fail'>
layer.msg('网站添加失败',{icon: 2, offset: 'rb', time: 3000}) layer.msg('网站添加失败',{icon: 2, time: 3000})
</#if> </#if>
}); });
@ -96,4 +96,4 @@
} }
}); });
}); });
</script> </script>

View File

@ -107,17 +107,17 @@ word-break: break-all;"><#if roleData??>${roleData.name!''}<#else>坐席组</#if
layui.use('layer', function(){ layui.use('layer', function(){
var layer = layui.layer var layer = layui.layer
<#if msg?? && msg == 'admin_role_save_success'> <#if msg?? && msg == 'admin_role_save_success'>
layer.msg('添加成功',{icon: 1, offset: 'rb', time: 1000}) layer.msg('添加成功',{icon: 1, time: 1000})
</#if> </#if>
<#if msg?? && msg == 'admin_role_save_exist'> <#if msg?? && msg == 'admin_role_save_exist'>
layer.msg('角色添加失败,角色已存在',{icon: 2, offset: 'rb', time: 3000}) layer.msg('角色添加失败,角色已存在',{icon: 2, time: 3000})
</#if> </#if>
<#if msg?? && msg == 'admin_role_update_success'> <#if msg?? && msg == 'admin_role_update_success'>
layer.msg('角色修改成功',{icon: 1, offset: 'rb', time: 1000}) layer.msg('角色修改成功',{icon: 1, time: 1000})
</#if> </#if>
<#if msg?? && msg == 'admin_role_update_not_exist'> <#if msg?? && msg == 'admin_role_update_not_exist'>
layer.msg('角色修改失败',{icon: 2, offset: 'rb', time: 3000}) layer.msg('角色修改失败',{icon: 2, time: 3000})
</#if> </#if>
}); });
</script> </script>

View File

@ -38,7 +38,7 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">管理员:</label> <label class="layui-form-label">管理员:</label>
<div class="layui-input-inline"> <div class="layui-input-inline">
<input type="checkbox" name="superuser" lay-skin="switch" lay-filter="admincheckbox" value="1" lay-text="是|否"> <input type="checkbox" name="admin" lay-skin="switch" lay-filter="admincheckbox" value="1" lay-text="是|否">
</div> </div>
</div> </div>
<div class="layui-form-item" id="agentDiv"> <div class="layui-form-item" id="agentDiv">
@ -60,15 +60,16 @@
</#if> </#if>
<div class="layui-form-button"> <div class="layui-form-button">
<div class="layui-button-block"> <div class="layui-button-block">
<button class="layui-btn" lay-submit lay-filter="formDemo">立即提交</button> <button class="layui-btn" lay-submit lay-filter="sys-user-create">提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</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>
</div> </div>
</form> </form>
</div> </div>
<script> <script>
//Demo
layui.use('form', function(){ layui.use('form', function(){
var form = layui.form(); var form = layui.form();
form.render(); //更新全部 form.render(); //更新全部
@ -121,5 +122,18 @@ layui.use('form', function(){
$('#sipAccountDiv').hide(); $('#sipAccountDiv').hide();
} }
}); });
form.on('submit(sys-user-create)', function (data) {
// TODO use RestAPI
// console.log(data.field)
return true;
})
// // 保存成功后,继续留在当前页面,重制并创建下一个
// form.on('submit(sys-user-create-follow)', function (data) {
// // TODO use RestAPI
// console.log(data.field)
// return false;
// })
}); });
</script> </script>

View File

@ -39,7 +39,7 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">管理员:</label> <label class="layui-form-label">管理员:</label>
<div class="layui-input-inline"> <div class="layui-input-inline">
<input type="checkbox" name="superuser" lay-skin="switch" value="1" lay-filter="admincheckbox" lay-text="是|否" <#if userData.usertype == "0">checked="checked"</#if>> <input type="checkbox" name="admin" lay-skin="switch" value="1" lay-filter="admincheckbox" lay-text="是|否" <#if userData.admin>checked="checked"</#if>>
</div> </div>
</div> </div>
<div class="layui-form-item" id="agentDiv"> <div class="layui-form-item" id="agentDiv">

View File

@ -70,7 +70,7 @@
</td> </td>
</#if> </#if>
<td> <td>
<#if user.usertype?? && user.usertype =="0"> <#if user.admin>
<i class="layui-icon" style="color:#19a55d;">&#xe618;</i> <i class="layui-icon" style="color:#19a55d;">&#xe618;</i>
</#if> </#if>
</td> </td>
@ -79,7 +79,7 @@
<i class="layui-icon">&#xe642;</i> <i class="layui-icon">&#xe642;</i>
编辑 编辑
</a> </a>
<#if !(user.usertype?? && user.usertype == "0") && user.datastatus != true > <#if !(user.admin) && user.datastatus != true >
<a href="/admin/user/delete.html?id=${user.id!''}" style="margin-left:10px;" data-toggle="tip" data-title="请确认是否删除记录?"> <a href="/admin/user/delete.html?id=${user.id!''}" style="margin-left:10px;" data-toggle="tip" data-title="请确认是否删除记录?">
<i class="layui-icon" style="color:red;">&#x1006;</i> <i class="layui-icon" style="color:red;">&#x1006;</i>
删除 删除
@ -102,19 +102,19 @@
layui.use('layer', function(){ layui.use('layer', function(){
var layer = layui.layer; var layer = layui.layer;
<#if msg?? && msg == 'username_exist'> <#if msg?? && msg == 'username_exist'>
layer.msg('用户名存在,请重新填写',{icon: 2, offset: 'rb', time: 3000}) layer.msg('用户名存在,请重新填写',{icon: 2, time: 3000})
<#elseif msg?? && msg == 'email_exist'> <#elseif msg?? && msg == 'email_exist'>
layer.msg('邮件存在,请重新填写',{icon: 2, offset: 'rb', time: 3000}) layer.msg('邮件存在,请重新填写',{icon: 2, time: 3000})
<#elseif msg?? && msg == 'mobile_exist'> <#elseif msg?? && msg == 'mobile_exist'>
layer.msg('手机存在,请重新填写',{icon: 2, offset: 'rb', time: 3000}) layer.msg('手机存在,请重新填写',{icon: 2, time: 3000})
<#elseif msg?? && msg == 'sip_account_exist'> <#elseif msg?? && msg == 'sip_account_exist'>
layer.msg('SIP地址已经存在请重新填写',{icon: 2, offset: 'rb', time: 3000}) layer.msg('SIP地址已经存在请重新填写',{icon: 2, time: 3000})
<#elseif msg?? && msg == 't1'> <#elseif msg?? && msg == 't1'>
layer.msg('当前用户坐席就绪或对话未结束,不能切换为非坐席',{icon: 2, offset: 'rb', time: 3000}) layer.msg('当前用户坐席就绪或对话未结束,不能切换为非坐席',{icon: 2, time: 3000})
<#elseif msg?? && msg == 'new_user_success'> <#elseif msg?? && msg == 'new_user_success'>
layer.msg('新用户创建成功',{icon: 1, offset: 'rb', time: 1000}) layer.msg('新用户创建成功',{icon: 1, time: 1000})
<#elseif msg?? && msg == 'edit_user_success'> <#elseif msg?? && msg == 'edit_user_success'>
layer.msg('用户编辑成功',{icon: 1, offset: 'rb', time: 1000}) layer.msg('用户编辑成功',{icon: 1, time: 1000})
</#if> </#if>
}); });
layui.use(['laypage', 'layer'], function(){ layui.use(['laypage', 'layer'], function(){

View File

@ -187,18 +187,18 @@
parent.$('#agentdesktop').click(); parent.$('#agentdesktop').click();
} }
} else if(result.rc === 1){ } else if(result.rc === 1){
top.layer.msg('不合法的请求参数!',{icon: 2, offset: 'b', time: 3000}) top.layer.msg('不合法的请求参数!',{icon: 2, time: 3000})
} else if(result.rc === 2){ } else if(result.rc === 2){
top.layer.msg('不合法的操作!',{icon: 2, offset: 'b', time: 3000}) top.layer.msg('不合法的操作!',{icon: 2, time: 3000})
} else if(result.rc ===3){ } else if(result.rc ===3){
top.layer.msg('没有权限执行该操作',{icon: 2, offset: 'b', time: 3000}) top.layer.msg('没有权限执行该操作',{icon: 2, time: 3000})
} else if(result.rc ===4){ } else if(result.rc ===4){
top.layer.msg('未找到该访客会话',{icon: 2, offset: 'b', time: 3000}) top.layer.msg('未找到该访客会话',{icon: 2, time: 3000})
} }
}, function(error){ }, function(error){
console.log("error", error); console.log("error", error);
// 服务器异常 // 服务器异常
top.layer.msg('服务器抽风,请稍后再试!',{icon: 2, offset: 'b', time: 3000}) top.layer.msg('服务器抽风,请稍后再试!',{icon: 2, time: 3000})
}) })
}, },
function(index, layro){ function(index, layro){

View File

@ -28,9 +28,9 @@ word-break: break-all;"><#if curagentuser??>${curagentuser.username!''}<#if cura
</span> </span>
<span class="user"> <span class="user">
<#if chatmessage?? && chatmessage.calltype?? && chatmessage.calltype == '呼出'> <#if chatmessage?? && chatmessage.calltype?? && chatmessage.calltype == '呼出'>
${chatmessage.intervented?string(chatmessage.supervisorname,curagentuser.agentname)} ${chatmessage.intervented?string(chatmessage.supervisorname,chatmessage.username)}
<#else> <#else>
${curagentuser.username!''} ${chatmessage.username!''}
</#if> </#if>
</span> </span>
<span class="time">${chatmessage.createtime?string('yyyy-MM-dd HH:mm:ss')}</span> <span class="time">${chatmessage.createtime?string('yyyy-MM-dd HH:mm:ss')}</span>

View File

@ -99,7 +99,6 @@
* @param memo * @param memo
*/ */
function submitTransAgentUserOut(agentUserId, targetAgentno, agentUserServiceId, memo) { function submitTransAgentUserOut(agentUserId, targetAgentno, agentUserServiceId, memo) {
console.log("[submitTransAgentUser] ", agentUserId, targetAgentno, agentUserServiceId, memo);
restApiRequest({ restApiRequest({
silent: true, silent: true,
path: 'agentuser', path: 'agentuser',
@ -125,20 +124,20 @@
$('#agentdesktop').click(); $('#agentdesktop').click();
} }
} else if(result.rc === 1){ } else if(result.rc === 1){
top.layer.msg('不合法的请求参数',{icon: 2, offset: 'b', time: 3000}) top.layer.msg('不合法的请求参数',{icon: 2, time: 3000})
} else if(result.rc === 2){ } else if(result.rc === 2){
top.layer.msg('不合法的操作',{icon: 2, offset: 'b', time: 3000}) top.layer.msg('不合法的操作',{icon: 2, time: 3000})
} else if(result.rc === 3){ } else if(result.rc === 3){
top.layer.msg('您没有权限执行该操作',{icon: 2, offset: 'b', time: 3000}) top.layer.msg('您没有权限执行该操作',{icon: 2, time: 3000})
} else if(result.rc === 4){ } else if(result.rc === 4){
top.layer.msg('该访客会话不存在',{icon: 2, offset: 'b', time: 3000}) top.layer.msg('该访客会话不存在',{icon: 2, time: 3000})
} else if(result.rc === 5){ } else if(result.rc === 5){
top.layer.msg('参数不合法',{icon: 2, offset: 'b', time: 3000}) top.layer.msg('参数不合法',{icon: 2, time: 3000})
} }
}, function(error){ }, function(error){
console.log("error", error); console.log("error", error);
// 服务器异常 // 服务器异常
top.layer.msg('服务器抽风,请稍后再试!', {icon: 2, offset: 'b', time: 3000}) top.layer.msg('服务器抽风,请稍后再试!', {icon: 2, time: 3000})
}) })
} }
@ -154,7 +153,7 @@
if(params["userid"] && params["agentuserid"] && params["agentserviceid"] && params["agentno"]){ if(params["userid"] && params["agentuserid"] && params["agentserviceid"] && params["agentno"]){
submitTransAgentUserOut(params["agentuserid"], params["agentno"], params["agentserviceid"], params["memo"]); submitTransAgentUserOut(params["agentuserid"], params["agentno"], params["agentserviceid"], params["memo"]);
} else { } else {
top.layer.msg('未选择合理的转接信息!',{icon: 2, offset: 'b', time: 3000}); top.layer.msg('未选择合理的转接信息!',{icon: 2, time: 3000});
} }
}); });
}); });

View File

@ -1,15 +1,15 @@
<ul class="layui-nav layui-nav-tree" lay-filter="setting"> <ul class="layui-nav layui-nav-tree" lay-filter="setting">
<li class="layui-nav-item layui-nav-itemed"> <li class="layui-nav-item layui-nav-itemed">
<#if user?? && (user.roleAuthMap["A02_A01"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A02_A01"]?? || user.admin) >
<a class="layui-nav-title" href="javascript:;">联系人</a> <a class="layui-nav-title" href="javascript:;">联系人</a>
</#if> </#if>
<dl class="layui-nav-child"> <dl class="layui-nav-child">
<#if user?? && (user.roleAuthMap["A02_A01_A01"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A02_A01_A01"]?? || user.admin) >
<dd <#if !(ckind??)>class="layui-this"</#if>> <dd <#if !(ckind??)>class="layui-this"</#if>>
<a href="/apps/contacts/index.html">全部联系人</a> <a href="/apps/contacts/index.html">全部联系人</a>
</dd> </dd>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A02_A01_A02"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A02_A01_A02"]?? || user.admin) >
<#if uKeFuDic['com.dic.contacts.ckind']??> <#if uKeFuDic['com.dic.contacts.ckind']??>
<#list uKeFuDic['com.dic.contacts.ckind'] as dic> <#list uKeFuDic['com.dic.contacts.ckind'] as dic>
<dd <#if ckind?? && ckind == dic.id>class="layui-this"</#if>> <dd <#if ckind?? && ckind == dic.id>class="layui-this"</#if>>
@ -21,4 +21,4 @@
</dl> </dl>
</li> </li>
</ul> </ul>

View File

@ -31,26 +31,26 @@
</div> </div>
</div> </div>
</form> </form>
<#if user?? && (user.roleAuthMap[ "A02_A01_A02_B05"]?? || user.usertype=="0" )> <#if user?? && (user.roleAuthMap[ "A02_A01_A02_B05"]?? || user.admin)>
<div class="layui-btn-group"> <div class="layui-btn-group">
<a href="/apps/contacts/add.html<#if ckind??>?ckind=${ckind}</#if>" title="新建联系人" data-toggle="ajax" data-width="950" data-height="600" class="layui-btn layui-btn-small"><i class="layui-icon">&#xe608;</i>新建联系人</a> <a href="/apps/contacts/add.html<#if ckind??>?ckind=${ckind}</#if>" title="新建联系人" data-toggle="ajax" data-width="950" data-height="600" class="layui-btn layui-btn-small"><i class="layui-icon">&#xe608;</i>新建联系人</a>
</div> </div>
</#if> </#if>
<#if user?? && (user.roleAuthMap[ "A02_A01_A02_B08"]?? || user.usertype=="0" )> <#if user?? && (user.roleAuthMap[ "A02_A01_A02_B08"]?? || user.admin)>
<div class="layui-btn-group ukefu-btn-group"> <div class="layui-btn-group ukefu-btn-group">
<button class="layui-btn layui-btn-small" id="mass" title="群发" data-toggle="ajax" data-width="700" data-height="495"> <button class="layui-btn layui-btn-small" id="mass" title="群发" data-toggle="ajax" data-width="700" data-height="495">
<i class="kfont">&#xe654;</i> 群发 <i class="kfont">&#xe654;</i> 群发
</button> </button>
</div> </div>
</#if> </#if>
<#if user?? && (user.roleAuthMap[ "A02_A01_A02_B08"]?? || user.usertype=="0" )> <#if user?? && (user.roleAuthMap[ "A02_A01_A02_B08"]?? || user.admin)>
<div class="layui-btn-group ukefu-btn-group"> <div class="layui-btn-group ukefu-btn-group">
<button class="layui-btn layui-btn-small" href="/apps/contacts/imp.html<#if ckind??>?ckind=${ckind}</#if>" title="导入联系人" data-toggle="ajax" data-width="950" data-height="600"> <button class="layui-btn layui-btn-small" href="/apps/contacts/imp.html<#if ckind??>?ckind=${ckind}</#if>" title="导入联系人" data-toggle="ajax" data-width="950" data-height="600">
<i class="kfont">&#xe641;</i> 导入 <i class="kfont">&#xe641;</i> 导入
</button> </button>
</div> </div>
</#if> </#if>
<#if user?? && (user.roleAuthMap[ "A02_A01_A02_B09"]?? || user.usertype=="0" )> <#if user?? && (user.roleAuthMap[ "A02_A01_A02_B09"]?? || user.admin)>
<div class="layui-btn-group ukefu-btn-group"> <div class="layui-btn-group ukefu-btn-group">
<button class="layui-btn layui-btn-small dropdown-menu"> <button class="layui-btn layui-btn-small dropdown-menu">
<i class="kfont">&#xe672;</i> 导出 <i class="kfont">&#xe672;</i> 导出
@ -151,12 +151,12 @@
<a href="/apps/contacts/detail.html?id=${contacts.id!''}" style="margin-left:10px;"> <a href="/apps/contacts/detail.html?id=${contacts.id!''}" style="margin-left:10px;">
<i class="layui-icon">&#xe60a;</i> 详情 <i class="layui-icon">&#xe60a;</i> 详情
</a> </a>
<#if user?? && (user.roleAuthMap[ "A02_A01_A02_B06"]?? || user.usertype=="0" )> <#if user?? && (user.roleAuthMap[ "A02_A01_A02_B06"]?? || user.admin)>
<a href="/apps/contacts/edit.html?id=${contacts.id!''}" data-toggle="ajax" data-width="950" data-height="600" data-title="编辑联系人信息"> <a href="/apps/contacts/edit.html?id=${contacts.id!''}" data-toggle="ajax" data-width="950" data-height="600" data-title="编辑联系人信息">
<i class="layui-icon">&#xe642;</i> 编辑 <i class="layui-icon">&#xe642;</i> 编辑
</a> </a>
</#if> </#if>
<#if user?? && (user.roleAuthMap[ "A02_A01_A02_B07"]?? || user.usertype=="0" )> <#if user?? && (user.roleAuthMap[ "A02_A01_A02_B07"]?? || user.admin)>
<a href="/apps/contacts/delete.html?id=${contacts.id!''}" style="margin-left:10px;" data-toggle="tip" data-title="请确认是否删除联系人?"> <a href="/apps/contacts/delete.html?id=${contacts.id!''}" style="margin-left:10px;" data-toggle="tip" data-title="请确认是否删除联系人?">
<i class="layui-icon" style="color:red;">&#x1006;</i> 删除 <i class="layui-icon" style="color:red;">&#x1006;</i> 删除
</a> </a>
@ -283,7 +283,7 @@
}); });
function unreachableDialogWinByContactid(id){ function unreachableDialogWinByContactid(id){
layer.msg('该联系人正在被其它客服服务或没有可触达的联系方式!',{icon: 2, offset: 'b', time: 3000}) layer.msg('该联系人正在被其它客服服务或没有可触达的联系方式!',{icon: 2, time: 3000})
} }
function openDialogWinByContactid(id){ function openDialogWinByContactid(id){
@ -337,4 +337,4 @@
-webkit-line-clamp: 2; -webkit-line-clamp: 2;
overflow: hidden; overflow: hidden;
} }
</style> </style>

View File

@ -1,14 +1,14 @@
<ul class="tab-title"> <ul class="tab-title">
<#if user?? && (user.roleAuthMap["A02_A01_A02_B01"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A02_A01_A02_B01"]?? || user.admin) >
<li <#if subtype == 'index'>class="layui-this"</#if>><a href="/apps/contacts/index.html<#if ckind??>?ckind=${ckind}</#if>">全部联系人<#if subtype == 'index'><#if contactsList??>${contactsList.totalElements}<#else>0</#if></#if></a></li> <li <#if subtype == 'index'>class="layui-this"</#if>><a href="/apps/contacts/index.html<#if ckind??>?ckind=${ckind}</#if>">全部联系人<#if subtype == 'index'><#if contactsList??>${contactsList.totalElements}<#else>0</#if></#if></a></li>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A02_A01_A02_B02"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A02_A01_A02_B02"]?? || user.admin) >
<li <#if subtype == 'today'>class="layui-this"</#if>><a href="/apps/contacts/today.html<#if ckind??>?ckind=${ckind}</#if>">今日新增<#if subtype == 'today'><#if contactsList??>${contactsList.totalElements}<#else>0</#if></#if></a></li> <li <#if subtype == 'today'>class="layui-this"</#if>><a href="/apps/contacts/today.html<#if ckind??>?ckind=${ckind}</#if>">今日新增<#if subtype == 'today'><#if contactsList??>${contactsList.totalElements}<#else>0</#if></#if></a></li>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A02_A01_A02_B03"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A02_A01_A02_B03"]?? || user.admin) >
<li <#if subtype == 'week'>class="layui-this"</#if>><a href="/apps/contacts/week.html<#if ckind??>?ckind=${ckind}</#if>">本周新增<#if subtype == 'week'><#if contactsList??>${contactsList.totalElements}<#else>0</#if></#if></a></li> <li <#if subtype == 'week'>class="layui-this"</#if>><a href="/apps/contacts/week.html<#if ckind??>?ckind=${ckind}</#if>">本周新增<#if subtype == 'week'><#if contactsList??>${contactsList.totalElements}<#else>0</#if></#if></a></li>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A02_A01_A02_B04"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A02_A01_A02_B04"]?? || user.admin) >
<li <#if subtype == 'creater'>class="layui-this"</#if>><a href="/apps/contacts/creater.html<#if ckind??>?ckind=${ckind}</#if>">我的联系人<#if subtype == 'creater'><#if contactsList??>${contactsList.totalElements}<#else>0</#if></#if></a></li> <li <#if subtype == 'creater'>class="layui-this"</#if>><a href="/apps/contacts/creater.html<#if ckind??>?ckind=${ckind}</#if>">我的联系人<#if subtype == 'creater'><#if contactsList??>${contactsList.totalElements}<#else>0</#if></#if></a></li>
</#if> </#if>
</ul> </ul>

View File

@ -1,15 +1,15 @@
<ul class="layui-nav layui-nav-tree" lay-filter="setting"> <ul class="layui-nav layui-nav-tree" lay-filter="setting">
<li class="layui-nav-item layui-nav-itemed"> <li class="layui-nav-item layui-nav-itemed">
<#if user?? && (user.roleAuthMap["A03_A01"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A03_A01"]?? || user.admin) >
<a class="layui-nav-title" href="javascript:;">全部客户</a> <a class="layui-nav-title" href="javascript:;">全部客户</a>
</#if> </#if>
<dl class="layui-nav-child"> <dl class="layui-nav-child">
<#if user?? && (user.roleAuthMap["A03_A01_A01"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A03_A01_A01"]?? || user.admin) >
<dd <#if !(ekind??)>class="layui-this"</#if>> <dd <#if !(ekind??)>class="layui-this"</#if>>
<a href="/apps/customer/index.html">全部客户</a> <a href="/apps/customer/index.html">全部客户</a>
</dd> </dd>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A03_A01_A02"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A03_A01_A02"]?? || user.admin) >
<#if uKeFuDic['com.dic.contacts.entype']??> <#if uKeFuDic['com.dic.contacts.entype']??>
<#list uKeFuDic['com.dic.contacts.entype'] as dic> <#list uKeFuDic['com.dic.contacts.entype'] as dic>
<dd <#if ekind?? && ekind == dic.id>class="layui-this"</#if>> <dd <#if ekind?? && ekind == dic.id>class="layui-this"</#if>>
@ -20,4 +20,4 @@
</#if> </#if>
</dl> </dl>
</li> </li>
</ul> </ul>

View File

@ -36,7 +36,7 @@
</div> </div>
</div> </div>
</form> </form>
<#if user?? && (user.roleAuthMap["A03_A01_A02_B06"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A03_A01_A02_B06"]?? || user.admin) >
<div class="layui-btn-group ukefu-btn-group"> <div class="layui-btn-group ukefu-btn-group">
<a href="/apps/customer/add.html<#if ekind??>?ekind=${ekind}</#if>" title="新建客户" <a href="/apps/customer/add.html<#if ekind??>?ekind=${ekind}</#if>" title="新建客户"
data-toggle="ajax" data-width="950" data-height="600" class="layui-btn layui-btn-small"> data-toggle="ajax" data-width="950" data-height="600" class="layui-btn layui-btn-small">
@ -45,7 +45,7 @@
</a> </a>
</div> </div>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A03_A01_A02_B09"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A03_A01_A02_B09"]?? || user.admin) >
<div class="layui-btn-group ukefu-btn-group"> <div class="layui-btn-group ukefu-btn-group">
<button class="layui-btn layui-btn-small" <button class="layui-btn layui-btn-small"
href="/apps/customer/imp.html<#if ekind??>?ekind=${ekind}</#if>" title="导入客户" href="/apps/customer/imp.html<#if ekind??>?ekind=${ekind}</#if>" title="导入客户"
@ -56,7 +56,7 @@
</#if> </#if>
<#if user?? && (user.roleAuthMap["A03_A01_A02_B010"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A03_A01_A02_B010"]?? || user.admin) >
<div class="layui-btn-group ukefu-btn-group"> <div class="layui-btn-group ukefu-btn-group">
<button class="layui-btn layui-btn-small dropdown-menu"> <button class="layui-btn layui-btn-small dropdown-menu">
<i class="kfont">&#xe672;</i> 导出 <i class="kfont">&#xe672;</i> 导出
@ -144,14 +144,14 @@
</#if> </#if>
</td> </td>
<td style="white-space:nowrap;width:1%;" nowrap="nowrap"> <td style="white-space:nowrap;width:1%;" nowrap="nowrap">
<#if user?? && (user.roleAuthMap["A03_A01_A02_B07"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A03_A01_A02_B07"]?? || user.admin) >
<a href="/apps/customer/edit.html?id=${entCustomer.id!''}" data-toggle="ajax" data-width="950" <a href="/apps/customer/edit.html?id=${entCustomer.id!''}" data-toggle="ajax" data-width="950"
data-height="600" data-title="编辑用户信息"> data-height="600" data-title="编辑用户信息">
<i class="layui-icon">&#xe642;</i> <i class="layui-icon">&#xe642;</i>
编辑 编辑
</a> </a>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A03_A01_A02_B08"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A03_A01_A02_B08"]?? || user.admin) >
<a href="/apps/customer/delete.html?id=${entCustomer.id!''}" style="margin-left:10px;" data-toggle="tip" <a href="/apps/customer/delete.html?id=${entCustomer.id!''}" style="margin-left:10px;" data-toggle="tip"
data-title="请确认是否删除记录?"> data-title="请确认是否删除记录?">
<i class="layui-icon" style="color:red;">&#x1006;</i> <i class="layui-icon" style="color:red;">&#x1006;</i>
@ -187,13 +187,13 @@
var layer = layui.layer; var layer = layui.layer;
<#if msg?? && msg == 'new_entcustomer_success'> <#if msg?? && msg == 'new_entcustomer_success'>
layer.msg('客户新建成功',{icon: 1, offset: 'rb', time: 1000}) layer.msg('客户新建成功',{icon: 1, time: 1000})
<#elseif msg?? && msg == 'edit_entcustomer_success'> <#elseif msg?? && msg == 'edit_entcustomer_success'>
layer.msg('客户编辑成功',{icon: 1, offset: 'rb', time: 1000}) layer.msg('客户编辑成功',{icon: 1, time: 1000})
<#elseif msg?? && msg == 'mobile_exist'> <#elseif msg?? && msg == 'mobile_exist'>
layer.msg('手机存在,请重新填写',{icon: 2, offset: 'rb', time: 3000}) layer.msg('手机存在,请重新填写',{icon: 2, time: 3000})
<#elseif msg?? && msg == 'sip_account_exist'> <#elseif msg?? && msg == 'sip_account_exist'>
layer.msg('SIP账号已经存在请重新填写',{icon: 2, offset: 'rb', time: 3000}) layer.msg('SIP账号已经存在请重新填写',{icon: 2, time: 3000})
</#if> </#if>
}); });

View File

@ -1,18 +1,18 @@
<ul class="tab-title"> <ul class="tab-title">
<#if user?? && (user.roleAuthMap["A03_A01_A02_B01"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A03_A01_A02_B01"]?? || user.admin) >
<li <#if subtype == 'index'>class="layui-this"</#if>><a href="/apps/customer/index.html<#if ekind??>?ekind=${ekind}</#if>">全部客户<#if subtype == 'index'><#if entCustomerList??>${entCustomerList.totalElements}<#else>0</#if></#if></a></li> <li <#if subtype == 'index'>class="layui-this"</#if>><a href="/apps/customer/index.html<#if ekind??>?ekind=${ekind}</#if>">全部客户<#if subtype == 'index'><#if entCustomerList??>${entCustomerList.totalElements}<#else>0</#if></#if></a></li>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A03_A01_A02_B02"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A03_A01_A02_B02"]?? || user.admin) >
<li <#if subtype == 'today'>class="layui-this"</#if>><a href="/apps/customer/today.html<#if ekind??>?ekind=${ekind}</#if>">今日新增<#if subtype == 'today'><#if entCustomerList??>${entCustomerList.totalElements}<#else>0</#if></#if></a></li> <li <#if subtype == 'today'>class="layui-this"</#if>><a href="/apps/customer/today.html<#if ekind??>?ekind=${ekind}</#if>">今日新增<#if subtype == 'today'><#if entCustomerList??>${entCustomerList.totalElements}<#else>0</#if></#if></a></li>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A03_A01_A02_B03"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A03_A01_A02_B03"]?? || user.admin) >
<li <#if subtype == 'week'>class="layui-this"</#if>><a href="/apps/customer/week.html<#if ekind??>?ekind=${ekind}</#if>">本周新增<#if subtype == 'week'><#if entCustomerList??>${entCustomerList.totalElements}<#else>0</#if></#if></a></li> <li <#if subtype == 'week'>class="layui-this"</#if>><a href="/apps/customer/week.html<#if ekind??>?ekind=${ekind}</#if>">本周新增<#if subtype == 'week'><#if entCustomerList??>${entCustomerList.totalElements}<#else>0</#if></#if></a></li>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A03_A01_A02_B04"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A03_A01_A02_B04"]?? || user.admin) >
<li <#if subtype == 'enterprise'>class="layui-this"</#if>><a href="/apps/customer/enterprise.html<#if ekind??>?ekind=${ekind}</#if>">企业客户<#if subtype == 'enterprise'><#if entCustomerList??>${entCustomerList.totalElements}<#else>0</#if></#if></a></li> <li <#if subtype == 'enterprise'>class="layui-this"</#if>><a href="/apps/customer/enterprise.html<#if ekind??>?ekind=${ekind}</#if>">企业客户<#if subtype == 'enterprise'><#if entCustomerList??>${entCustomerList.totalElements}<#else>0</#if></#if></a></li>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A03_A01_A02_B05"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A03_A01_A02_B05"]?? || user.admin) >
<li <#if subtype == 'personal'>class="layui-this"</#if>><a href="/apps/customer/personal.html<#if ekind??>?ekind=${ekind}</#if>">个人客户<#if subtype == 'personal'><#if entCustomerList??>${entCustomerList.totalElements}<#else>0</#if></#if></a></li> <li <#if subtype == 'personal'>class="layui-this"</#if>><a href="/apps/customer/personal.html<#if ekind??>?ekind=${ekind}</#if>">个人客户<#if subtype == 'personal'><#if entCustomerList??>${entCustomerList.totalElements}<#else>0</#if></#if></a></li>
</#if> </#if>
<li <#if subtype == 'creater'>class="layui-this"</#if>><a href="/apps/customer/creater.html<#if ekind??>?ekind=${ekind}</#if>">我的客户<#if subtype == 'creater'><#if entCustomerList??>${entCustomerList.totalElements}<#else>0</#if></#if></a></li> <li <#if subtype == 'creater'>class="layui-this"</#if>><a href="/apps/customer/creater.html<#if ekind??>?ekind=${ekind}</#if>">我的客户<#if subtype == 'creater'><#if entCustomerList??>${entCustomerList.totalElements}<#else>0</#if></#if></a></li>
</ul> </ul>

View File

@ -2,26 +2,34 @@
<div class="col-lg-12"> <div class="col-lg-12">
<h1 class="site-h1"> <h1 class="site-h1">
对话列表 对话列表
<div style="clefloat:right;"> <form class="layui-form" name="search" method="post" id="searchConversation">
<div class="layui-btn-group"> <div class="layui-form-item">
<a href="/apps/cca/index.html?sort=lastmessage<#if skill??>&&skill=${skill}</#if><#if agentno??>&&agentno=${agentno}</#if>" style="<#if sort?? && sort == "lastmessage">color:#ffffff !important;</#if>"> <div class="layui-inline" style="margin-right:0px;width: 100%">
<button class="layui-btn layui-btn-primary layui-btn-small" style="<#if sort?? && sort == "lastmessage">color:#ffffff !important;<#else>background-color:#ffffff !important;color:#32c24d !important;</#if>"> <select name="skill" class="ukefu-input" lay-ignore style="width: 90px" onchange="findAgentByOrgan(this.value)" >
消息 <option value="">所有技能组</option>
</button> <#if skillGroups??>
</a> <#list skillGroups as tpskill>
<a href="/apps/cca/index.html?sort=logintime<#if skill??>&&skill=${skill}</#if><#if agentno??>&&agentno=${agentno}</#if>" style="<#if sort?? && sort == "logintime">color:#ffffff !important;</#if>"> <option value="${tpskill.id}" <#if skill?? && skill == tpskill.id>selected="selected"</#if>>${tpskill.name!''}</option>
<button class="layui-btn layui-btn-primary layui-btn-small" style="<#if sort?? && sort == "logintime">color:#ffffff !important;<#else>background-color:#ffffff !important;color:#32c24d !important;</#if>"> </#list>
接入 </#if>
</button> </select>
</a> <label>~</label>
<a href="/apps/cca/index.html?sort=default<#if skill??>&&skill=${skill}</#if><#if agentno??>&&agentno=${agentno}</#if>" style="<#if !sort?? || sort == "default">color:#ffffff !important;</#if>"> <select id="agent" name="agentno" class="ukefu-input" lay-ignore style="width: 90px">
<button class="layui-btn layui-btn-primary layui-btn-small" style="<#if !sort?? || sort == "default">color:#ffffff !important;<#else>background-color:#ffffff !important;color:#32c24d !important;</#if>"> <option value="">所有坐席</option>
默认 <#if agentList??>
</button> <#list agentList as useragent>
</a> <option value="${useragent.id}" <#if agentno?? && agentno == useragent.id>selected="selected"</#if>>${useragent.uname!''}</option>
</#list>
</#if>
</select>
<div class="layui-input-inline" style="float: right;width: auto">
<button class="layui-btn layui-btn-small layui-btn-primary" style="color:#ffffff;">
<i class="layui-icon"></i>
</button>
</div>
</div>
</div> </div>
</form>
</div>
</h1> </h1>
<ul class="dialog-list" id="chat_users"> <ul class="dialog-list" id="chat_users">
<#if agentUserList??> <#if agentUserList??>
@ -29,7 +37,8 @@
<li class="clearfix chat-list-item <#if curagentuser?? && curagentuser.id?? && agentuser.id?? && curagentuser.id == agentuser.id>active</#if>" <li class="clearfix chat-list-item <#if curagentuser?? && curagentuser.id?? && agentuser.id?? && curagentuser.id == agentuser.id>active</#if>"
id="agentuser_${agentuser.userid!''}" remove-id="${agentuser.id!''}" data-id="${agentuser.userid!''}"> id="agentuser_${agentuser.userid!''}" remove-id="${agentuser.id!''}" data-id="${agentuser.userid!''}">
<a href="/apps/cca/agentuser.html?id=${agentuser.id!''}&channel=${agentuser.channel!''}" data-toggle="load" data-target="#ukefu-chat-agent" onclick="$('.chat-list-item.active').removeClass('active');$(this).closest('li.chat-list-item').addClass('active');Proxy.cleanTopMsgTip(1) ;$('#last_msg_${agentuser.userid!''}').text(0).hide();"> <a href="/apps/cca/agentuser.html?id=${agentuser.id!''}&channel=${agentuser.channel!''}" data-toggle="load" data-target="#ukefu-chat-agent" onclick="$('.chat-list-item.active').removeClass('active');$(this).closest('li.chat-list-item').addClass('active');Proxy.cleanTopMsgTip(1) ;$('#last_msg_${agentuser.userid!''}').text(0).hide();">
<img src="<#if agentuser.headimgurl?? && agentuser.headimgurl != ''>${agentuser.headimgurl}<#else>/images/im/user.png</#if>" style="width:45px;height:45px;"> <#if agentuser.status?? && agentuser.status == 'end'> <img src="<#if agentuser.headimgurl?? && agentuser.headimgurl != ''>${agentuser.headimgurl}<#else>/images/im/user.png</#if>" style="width:45px;height:45px;">
<#if agentuser.status?? && agentuser.status == 'end'>
<#if agentuser.channel?? && agentuser.channel == "weixin"> <#if agentuser.channel?? && agentuser.channel == "weixin">
<i class="kfont ukefu-channel-icon-end" id="tip_icon_wenxin_${agentuser.userid!''}">&#xe64d;</i> <i class="kfont ukefu-channel-icon-end" id="tip_icon_wenxin_${agentuser.userid!''}">&#xe64d;</i>
<#elseif agentuser.channel?? && agentuser.channel == "webim"> <#elseif agentuser.channel?? && agentuser.channel == "webim">
@ -39,7 +48,7 @@
<#elseif agentuser.channel?? && agentuser.channel == "phone"> <#elseif agentuser.channel?? && agentuser.channel == "phone">
<img class="ukefu-channel-image" src="/images/cde-ico-gray.png" id="tip_icon_phone_${agentuser.userid!''}"> <img class="ukefu-channel-image" src="/images/cde-ico-gray.png" id="tip_icon_phone_${agentuser.userid!''}">
</#if> </#if>
<#else> <#else>
<#if agentuser.channel?? && agentuser.channel == "weixin"> <#if agentuser.channel?? && agentuser.channel == "weixin">
<i class="kfont ukefu-channel-icon" id="tip_icon_wenxin_${agentuser.userid!''}">&#xe64d;</i> <i class="kfont ukefu-channel-icon" id="tip_icon_wenxin_${agentuser.userid!''}">&#xe64d;</i>
<#elseif agentuser.channel?? && agentuser.channel == "webim"> <#elseif agentuser.channel?? && agentuser.channel == "webim">
@ -74,4 +83,59 @@ word-break: break-all;">${agentuser.username!''}</span>
</#if> </#if>
</ul> </ul>
</div> </div>
</div> </div>
<script src="/js/CSKeFu_Rest_Request.v1.js"></script>
<script>
function findAgentByOrgan(data){
restApiRequest({
silent: true,
path: 'user/findByOrgan?organ='+data,
}).then(function(result){
if(result.status !== 'OK'){
// Token过期
handleRestApiFail(result.status);
} else{
$("#agent").html('<option value="">所有坐席</option>');
for (var i=0 ; i<result.data.length ; i++) {
$("#agent").prepend('<option value="' + result.data[i].id + '" <#if agentno?? && agentno == result.data[i].id>selected="selected"</#if>>' + result.data[i].uname + '</option>')
};
}
}, function(error){
// 服务器异常
top.layer.msg('服务器抽风,请稍后再试!', {icon: 2, offset: 'b', time: 3000})
})
}
$(function(){
$('#searchConversation').on('submit', function(e){
e.preventDefault(); //prevent form from submitting
var data = $("#searchConversation :input").serializeArray();
console.log(data)
var params = {};
for(var index = 0; index < data.length; index++){
params[data[index]['name']] = data[index]["value"];
}
$.ajax({
url:'/apps/cca/query',
data:{skill:params["skill"],agentno:params["agentno"]},
type:"post",
success:function(data){
$("#chat_users").html(data);
if($("#chat_users li").length > 0){
if($("#chat_users li:first-child").attr('id').substring(10) !== cursession){
$("#chat_users li:first-child a").click();
}else{
$("#chat_users li:first-child").addClass("active")
}
}else {
cursession = "";
$("#ukefu-chat-agent").html(" <div style=\"height: 100%;background: #fff;padding-top: 100px\" class=\"box-body ukefu-im-theme\"><div class=\"ukefu-empty\"><i class=\"layui-icon\">&#xe63a;</i><div style=\"\">没有搜索结果</div>\</div>\</div>");
}
}
});
});
});
</script>

View File

@ -0,0 +1,48 @@
<#if agentUserList??>
<#list agentUserList as agentuser>
<li class="clearfix chat-list-item <#if curagentuser?? && curagentuser.id?? && agentuser.id?? && curagentuser.id == agentuser.id>active</#if>"
id="agentuser_${agentuser.userid!''}" remove-id="${agentuser.id!''}" data-id="${agentuser.userid!''}">
<a href="/apps/cca/agentuser.html?id=${agentuser.id!''}&channel=${agentuser.channel!''}" data-toggle="load" data-target="#ukefu-chat-agent" onclick="$('.chat-list-item.active').removeClass('active');$(this).closest('li.chat-list-item').addClass('active');Proxy.cleanTopMsgTip(1) ;$('#last_msg_${agentuser.userid!''}').text(0).hide();">
<img src="<#if agentuser.headimgurl?? && agentuser.headimgurl != ''>${agentuser.headimgurl}<#else>/images/im/user.png</#if>" style="width:45px;height:45px;"> <#if agentuser.status?? && agentuser.status == 'end'>
<#if agentuser.channel?? && agentuser.channel == "weixin">
<i class="kfont ukefu-channel-icon-end" id="tip_icon_wenxin_${agentuser.userid!''}">&#xe64d;</i>
<#elseif agentuser.channel?? && agentuser.channel == "webim">
<i class="kfont ukefu-channel-icon-end" id="tip_icon_webim_${agentuser.userid!''}">&#xe60d;</i>
<#elseif agentuser.channel?? && agentuser.channel == "skype">
<i class="csfont ukefu-channel-icon-end" id="tip_icon_skype_${agentuser.userid!''}">&#59404;</i>
<#elseif agentuser.channel?? && agentuser.channel == "phone">
<img class="ukefu-channel-image" src="/images/cde-ico-gray.png" id="tip_icon_phone_${agentuser.userid!''}">
</#if>
<#else>
<#if agentuser.channel?? && agentuser.channel == "weixin">
<i class="kfont ukefu-channel-icon" id="tip_icon_wenxin_${agentuser.userid!''}">&#xe64d;</i>
<#elseif agentuser.channel?? && agentuser.channel == "webim">
<i class="kfont ukefu-channel-icon" id="tip_icon_webim_${agentuser.userid!''}">&#xe60d;</i>
<#elseif agentuser.channel?? && agentuser.channel == "skype">
<i class="csfont ukefu-channel-icon" id="tip_icon_skype_${agentuser.userid!''}">&#59404;</i>
<#elseif agentuser.channel?? && agentuser.channel == "phone">
<img class="ukefu-channel-image" src="/images/phone-ico.png" id="tip_icon_phone_${agentuser.userid!''}">
</#if>
</#if>
<div class="dialog-info">
<div class="address">
<span style="width:90px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;word-wrap: break-word;
word-break: break-all;">${agentuser.username!''}</span>
</div>
<div class="news">
<#if agentUser.servicetime??>${agentuser.servicetime?string('yyyy-MM-dd HH:mm:ss')}<#else>${agentuser.servicetime?string('yyyy-MM-dd HH:mm:ss')}</#if>
<#if agentuser.status?? && agentuser.status == 'end'>
<small class="label bg-gray pull-right" id="tip_message_${agentuser.userid!''}">离开</small>
<#else>
<small class="label bg-green pull-right" id="tip_message_${agentuser.userid!''}">在线</small>
</#if>
</div>
</div>
<div class="last-msg">
<small class="ukefu-badge bg-red" id="last_msg_${agentuser.userid!''}" style="<#if agentuser.tokenum == 0 || (curagentuser?? && curagentuser.id == agentuser.id)>display:none;</#if>">${agentuser.tokenum!0}</small>
</div>
</a>
</li>
</#list>
</#if>

View File

@ -90,28 +90,22 @@
</script> </script>
<#if agentUserList?? && agentUserList?size gt 0> <#if agentUserList?? && agentUserList?size gt 0>
<div class="layui-side layui-bg-black layui-left-black cskefu-cca-leftside" style="height:100%">
<#include "/apps/cca/searchbox.html">
<div class="layui-side layui-bg-black layui-left-black cskefu-cca-leftside" style="height:calc(100% - 60px)">
<div class="layui-side-scroll" id="agentuserscca"> <div class="layui-side-scroll" id="agentuserscca">
<#include "/apps/cca/agentusers.html"/> <#include "/apps/cca/agentusers.html"/>
</div> </div>
</div> </div>
<#if curagentuser?? && curagentuser.channel == "phone"> <#if curagentuser?? && curagentuser.channel == "phone">
<div class="layui-body ukefu-chat-agent cskefu-cca-content" id="ukefu-chat-agent" style="height:calc(100% - 60px)"> <div class="layui-body ukefu-chat-agent cskefu-cca-content" id="ukefu-chat-agent" style="height:100%">
<#include "/apps/cca/mainagentuser_callout.html"> <#include "/apps/cca/mainagentuser_callout.html">
</div> </div>
<#else> <#else>
<div class="layui-body ukefu-chat-agent cskefu-cca-content" id="ukefu-chat-agent" style="height:calc(100% - 60px)"> <div class="layui-body ukefu-chat-agent cskefu-cca-content" id="ukefu-chat-agent" style="height:100%">
<#include "/apps/cca/mainagentuser.html"> <#include "/apps/cca/mainagentuser.html">
</div> </div>
</#if> </#if>
<#else> <#else>
<div class="layui-layout layui-layout-content" style="height: 100%;"> <div class="layui-layout layui-layout-content" style="height: 100%;">
<#include "/apps/cca/searchbox.html">
<div class="box default-box" style="height: 100%;"> <div class="box default-box" style="height: 100%;">
<div class="box-body ukefu-im-theme"> <div class="box-body ukefu-im-theme">
<div class="ukefu-empty" style="background: none"> <div class="ukefu-empty" style="background: none">

View File

@ -26,9 +26,9 @@ word-break: break-all;"><#if curagentuser??>${curagentuser.username!''}<#if cura
</span> </span>
<span class="user"> <span class="user">
<#if chatmessage?? && chatmessage.calltype?? && chatmessage.calltype == '呼出'> <#if chatmessage?? && chatmessage.calltype?? && chatmessage.calltype == '呼出'>
${chatmessage.intervented?string(chatmessage.supervisorname,curagentuser.agentname)} ${chatmessage.intervented?string(chatmessage.supervisorname,chatmessage.username)}
<#else> <#else>
${curagentuser.username!''} ${chatmessage.username!''}
</#if></span> </#if></span>
<span class="time">${chatmessage.createtime?string('yyyy-MM-dd HH:mm:ss')}</span> <span class="time">${chatmessage.createtime?string('yyyy-MM-dd HH:mm:ss')}</span>
<span class="<#if (chatmessage.calltype?? && chatmessage.calltype == '呼出')>rateleft<#else>rateright</#if>" style="cursor: pointer; font-size: 30px"> <span class="<#if (chatmessage.calltype?? && chatmessage.calltype == '呼出')>rateleft<#else>rateright</#if>" style="cursor: pointer; font-size: 30px">

View File

@ -113,20 +113,20 @@
customerChatAudit.$("li[remove-id="+agentUserId+"] a").click(); customerChatAudit.$("li[remove-id="+agentUserId+"] a").click();
top.layer.msg('转接已完成',{icon: 1, time: 1000}) top.layer.msg('转接已完成',{icon: 1, time: 1000})
} else if(result.rc === 1){ } else if(result.rc === 1){
top.layer.msg('不合法的请求参数',{icon: 2, offset: 'b', time: 3000}) top.layer.msg('不合法的请求参数',{icon: 2, time: 3000})
} else if(result.rc === 2){ } else if(result.rc === 2){
top.layer.msg('不合法的操作',{icon: 2, offset: 'b', time: 3000}) top.layer.msg('不合法的操作',{icon: 2, time: 3000})
} else if(result.rc === 3){ } else if(result.rc === 3){
top.layer.msg('您没有权限执行该操作',{icon: 2, offset: 'b', time: 3000}) top.layer.msg('您没有权限执行该操作',{icon: 2, time: 3000})
} else if(result.rc === 4){ } else if(result.rc === 4){
top.layer.msg('该访客会话不存在',{icon: 2, offset: 'b', time: 3000}) top.layer.msg('该访客会话不存在',{icon: 2, time: 3000})
} else if(result.rc === 5){ } else if(result.rc === 5){
top.layer.msg('参数不合法',{icon: 2, offset: 'b', time: 3000}) top.layer.msg('参数不合法',{icon: 2, time: 3000})
} }
}, function(error){ }, function(error){
console.log("error", error); console.log("error", error);
// 服务器异常 // 服务器异常
top.layer.msg('服务器抽风,请稍后再试!', {icon: 2, offset: 'b', time: 3000}) top.layer.msg('服务器抽风,请稍后再试!', {icon: 2, time: 3000})
}) })
} }
@ -142,7 +142,7 @@
if(params["userid"] && params["agentuserid"] && params["agentserviceid"] && params["agentno"]){ if(params["userid"] && params["agentuserid"] && params["agentserviceid"] && params["agentno"]){
submitTransAgentUserOut(params["agentuserid"], params["agentno"], params["agentserviceid"], params["memo"]); submitTransAgentUserOut(params["agentuserid"], params["agentno"], params["agentserviceid"], params["memo"]);
} else { } else {
top.layer.msg('未选择合理的转接信息!',{icon: 2, offset: 'b', time: 3000}); top.layer.msg('未选择合理的转接信息!',{icon: 2, time: 3000});
} }
}); });
}); });

View File

@ -166,11 +166,11 @@
} }
}); });
<#if msg?? && msg == 'username_exist'> <#if msg?? && msg == 'username_exist'>
layer.msg('用户名存在,请重新填写',{icon: 2, offset: 'rb', time: 3000}) layer.msg('用户名存在,请重新填写',{icon: 2, time: 3000})
<#elseif msg?? && msg == 'email_exist'> <#elseif msg?? && msg == 'email_exist'>
layer.msg('邮件存在,请重新填写',{icon: 2, offset: 'rb', time: 3000}) layer.msg('邮件存在,请重新填写',{icon: 2, time: 3000})
<#elseif msg?? && msg == 'mobile_exist'> <#elseif msg?? && msg == 'mobile_exist'>
layer.msg('手机存在,请重新填写',{icon: 2, offset: 'rb', time: 3000}) layer.msg('手机存在,请重新填写',{icon: 2, time: 3000})
</#if> </#if>
}); });
</script> </script>

View File

@ -36,14 +36,15 @@
<input type="mobile" name="mobile" value="${userData.mobile!''}" placeholder="请输入手机号码" autocomplete="off" class="layui-input"> <input type="mobile" name="mobile" value="${userData.mobile!''}" placeholder="请输入手机号码" autocomplete="off" class="layui-input">
</div> </div>
</div> </div>
<#if userData?? && userData.usertype != '0'> <!-- admin用户强制作为坐席使用 -->
<div class="layui-form-item"> <!-- <#if userData?? && userData.admin>-->
<label class="layui-form-label">启用坐席功能:</label> <!-- <div class="layui-form-item">-->
<div class="layui-input-block"> <!-- <label class="layui-form-label">启用坐席功能:</label>-->
<input type="checkbox" name="agent" lay-skin="switch" value="1" <#if userData?? && userData.agent == true>checked</#if>> <!-- <div class="layui-input-block">-->
</div> <!-- <input type="checkbox" name="agent" lay-skin="switch" value="1" <#if userData?? && userData.agent == true>checked</#if>>-->
</div> <!-- </div>-->
</#if> <!-- </div>-->
<!-- </#if>-->
<div class="layui-form-button"> <div class="layui-form-button">
<div class="layui-button-block"> <div class="layui-button-block">
<button class="layui-btn" lay-submit lay-filter="profile">立即提交</button> <button class="layui-btn" lay-submit lay-filter="profile">立即提交</button>
@ -70,4 +71,4 @@ layui.use('form', function(){
} }
}); });
}); });
</script> </script>

View File

@ -74,6 +74,15 @@
<li> <li>
<p>电话:${entimuser.mobile!''}</p> <p>电话:${entimuser.mobile!''}</p>
</li> </li>
<li>
<p>部门:
<#if organs?? >
<#list organs as organ>
${organ.name!''}&nbsp
</#list>
</#if>
</p>
</li>
</ul> </ul>
</div> </div>
<div class="content-bottom"> <div class="content-bottom">

View File

@ -156,7 +156,7 @@
</#if> </#if>
<span class="layui-anim layer-anim-05 animated" id="msgbox" data-newmsg="${newmsg}" style="<#if newmsg == 0>display:none;</#if>">${newmsg}</span> <span class="layui-anim layer-anim-05 animated" id="msgbox" data-newmsg="${newmsg}" style="<#if newmsg == 0>display:none;</#if>">${newmsg}</span>
</li> </li>
<#if user?? && (user.roleAuthMap[ "A14_A01"]?? || user.usertype=="0" )> <#if user?? && (user.roleAuthMap[ "A14_A01"]?? || user.admin )>
<li class="layui-icon " title="新建" onclick="layer.prompt({title: '新建一个群', offset: 'b', formType: 0}, function(text, index){layer.close(index);loadURL('/ent/im/group/save.html?name='+encodeURIComponent(text),'#imgroup')});"></li> <li class="layui-icon " title="新建" onclick="layer.prompt({title: '新建一个群', offset: 'b', formType: 0}, function(text, index){layer.close(index);loadURL('/ent/im/group/save.html?name='+encodeURIComponent(text),'#imgroup')});"></li>
</#if> </#if>
<li class="layui-icon" title="更换背景" onclick="skin()"></li> <li class="layui-icon" title="更换背景" onclick="skin()"></li>

View File

@ -62,17 +62,17 @@
<script type="text/javascript" src="/js/jquery.darktooltip.js"></script> <script type="text/javascript" src="/js/jquery.darktooltip.js"></script>
<script language="javascript"> <script language="javascript">
var hostname = "${hostname!''}" , adminuser = "<#if user.usertype?? && user.usertype == '0'>true<#else>false</#if>" , schema = "${schema!'http'}", port = "${webimport!''}" , userid = "${user.id!''}" , session = "${sessionid!''}" , orgi = "${orgi!''}"; var hostname = "${hostname!''}" , adminuser = "<#if user.admin?? && user.admin>true<#else>false</#if>" , schema = "${schema!'http'}", port = "${webimport!''}" , userid = "${user.id!''}" , session = "${sessionid!''}" , orgi = "${orgi!''}";
var layinx , layerhelper ; var layinx , layerhelper ;
$(document).ready(function(){ $(document).ready(function(){
layui.use('layer', function(){ layui.use('layer', function(){
layerhelper = layer ; layerhelper = layer ;
<#if Request["msg"]?? && Request["msg"] == "security"> <#if Request["msg"]?? && Request["msg"] == "security">
layer.msg('您访问的资源需要安全验证,请确认您有系统管理员权限!',{icon: 2, offset: 'rb', time: 3000}) layer.msg('您访问的资源需要安全验证,请确认您有系统管理员权限!',{icon: 2, time: 3000})
<#elseif msg?? && msg == 't0'> <#elseif msg?? && msg == 't0'>
layer.msg('当前坐席就绪或对话未结束,不能切换${systemConfig.namealias!''}',{icon: 2, offset: 'rb', time: 3000}) layer.msg('当前坐席就绪或对话未结束,不能切换${systemConfig.namealias!''}',{icon: 2, time: 3000})
<#elseif msg?? && msg == 't1'> <#elseif msg?? && msg == 't1'>
layer.msg('当前用户坐席就绪或对话未结束,不能切换为非坐席',{icon: 2, offset: 'rb', time: 3000}) layer.msg('当前用户坐席就绪或对话未结束,不能切换为非坐席',{icon: 2, time: 3000})
</#if> </#if>
<#if models?seq_contains("entim")> <#if models?seq_contains("entim")>
var imDialogHelper = { var imDialogHelper = {
@ -147,8 +147,8 @@
</a> </a>
</li> </li>
</#if> </#if>
<#if user?? && user.agent == true> <#if (user?? && user.agent == true) || user.admin>
<#if (user?? && user.roleAuthMap["A01"]?? || user.usertype == "0")> <#if (user?? && user.roleAuthMap["A01"]??) || user.admin>
<li class="layui-nav-item " style="position: relative;"> <li class="layui-nav-item " style="position: relative;">
<div class="ukefu-last-msg" data-num="0" id="ukefu-last-msg"> <div class="ukefu-last-msg" data-num="0" id="ukefu-last-msg">
<small class="ukefu-msg-tip bg-red" id="msgnum">0</small> <small class="ukefu-msg-tip bg-red" id="msgnum">0</small>
@ -160,7 +160,7 @@
</li> </li>
</#if> </#if>
</#if> </#if>
<#if (user?? && user.roleAuthMap["B02"]?? || user.usertype == "0")> <#if (user?? && user.roleAuthMap["B02"]??) || user.admin>
<li class="layui-nav-item "> <li class="layui-nav-item ">
<a href="javascript:void(0)" onclick="return false;" data-title="系统管理" data-href="/admin/content.html" class="iframe_btn" data-id="admin" data-type="tabAdd"> <a href="javascript:void(0)" onclick="return false;" data-title="系统管理" data-href="/admin/content.html" class="iframe_btn" data-id="admin" data-type="tabAdd">
<i class="layui-icon" style="position: relative;">&#xe631;</i> <i class="layui-icon" style="position: relative;">&#xe631;</i>
@ -194,7 +194,7 @@
</a> </a>
</dd> </dd>
<#if user?? && user.agent == true> <#if user?? && user.agent == true>
<#if user?? && (user.roleAuthMap["A01"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A01"]?? || user.admin) >
<dd class="ukefu-left-menu" data-tooltip="坐席工作台" > <dd class="ukefu-left-menu" data-tooltip="坐席工作台" >
<a href="javascript:void(0)" href="javascript:void(0)" id="agentdeskleft" onclick="return false;" data-title="坐席对话" data-href="/agent/index.html" class="iframe_btn" data-id="multiMediaDialogWin" data-type="tabAdd"> <i class="layui-icon" <a href="javascript:void(0)" href="javascript:void(0)" id="agentdeskleft" onclick="return false;" data-title="坐席对话" data-href="/agent/index.html" class="iframe_btn" data-id="multiMediaDialogWin" data-type="tabAdd"> <i class="layui-icon"
style="top: 3px;">&#xe63a;</i> style="top: 3px;">&#xe63a;</i>
@ -204,14 +204,14 @@
</#if> </#if>
<#if models?seq_contains("contacts")> <#if models?seq_contains("contacts")>
<#if user?? && (user.roleAuthMap["A02"]?? || user.usertype == "0")> <#if user?? && (user.roleAuthMap["A02"]?? || user.admin)>
<dd class="ukefu-left-menu" data-tooltip="全部联系人"> <dd class="ukefu-left-menu" data-tooltip="全部联系人">
<a href="javascript:void(0)" data-title="全部联系人" onclick="return false;" data-href="/apps/contacts/index.html" class="iframe_btn" data-id="contactsMainContentWin" data-type="tabAdd"> <a href="javascript:void(0)" data-title="全部联系人" onclick="return false;" data-href="/apps/contacts/index.html" class="iframe_btn" data-id="contactsMainContentWin" data-type="tabAdd">
<i class="layui-icon" style="position: relative;">&#xe612;</i> <i class="layui-icon" style="position: relative;">&#xe612;</i>
</a> </a>
</dd> </dd>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A03"]?? || user.usertype == "0")> <#if user?? && (user.roleAuthMap["A03"]?? || user.admin)>
<dd class="ukefu-left-menu" data-tooltip="全部客户"> <dd class="ukefu-left-menu" data-tooltip="全部客户">
<a href="javascript:void(0)" data-title="全部客户" onclick="return false;" data-href="/apps/customer/index.html" class="iframe_btn" data-id="customersMainContentWin" data-type="tabAdd"> <a href="javascript:void(0)" data-title="全部客户" onclick="return false;" data-href="/apps/customer/index.html" class="iframe_btn" data-id="customersMainContentWin" data-type="tabAdd">
<i class="kfont" style="position: relative;">&#xe650;</i> <i class="kfont" style="position: relative;">&#xe650;</i>
@ -221,14 +221,14 @@
</#if> </#if>
<#if models?seq_contains("workorders")> <#if models?seq_contains("workorders")>
<#if user?? && (user.roleAuthMap["A04"]?? || user.usertype == "0")> <#if user?? && (user.roleAuthMap["A04"]?? || user.admin)>
<dd class="ukefu-left-menu" data-tooltip="工单管理"> <dd class="ukefu-left-menu" data-tooltip="工单管理">
<a href="javascript:void(0)" data-title="工单管理" data-href="<#if systemConfig?? && systemConfig.workorders>/apps/workordersthree/index.html<#else>/apps/workorders/index.html</#if>" class="iframe_btn" data-id="maincontent" data-type="tabChange"> <a href="javascript:void(0)" data-title="工单管理" data-href="<#if systemConfig?? && systemConfig.workorders>/apps/workordersthree/index.html<#else>/apps/workorders/index.html</#if>" class="iframe_btn" data-id="maincontent" data-type="tabChange">
<i class="kfont" style="position: relative;">&#xe607;</i> <i class="kfont" style="position: relative;">&#xe607;</i>
</a> </a>
</dd> </dd>
</#if> </#if>
<!-- <#if user?? && (user.roleAuthMap["A05"]?? || user.usertype == "0") > <!-- <#if user?? && (user.roleAuthMap["A05"]?? || user.admin) >
<dd class="ukefu-left-menu" data-tooltip="业务流程"> <dd class="ukefu-left-menu" data-tooltip="业务流程">
<a href="javascript:void(0)" data-title="业务流程" data-href="/apps/bpm/index.html" class="iframe_btn" data-id="maincontent" data-type="tabChange"> <a href="javascript:void(0)" data-title="业务流程" data-href="/apps/bpm/index.html" class="iframe_btn" data-id="maincontent" data-type="tabChange">
<i class="kfont" style="position: relative;">&#xe636;</i> <i class="kfont" style="position: relative;">&#xe636;</i>
@ -239,7 +239,7 @@
<!-- 会话监控 Customer Chats Audit --> <!-- 会话监控 Customer Chats Audit -->
<#if models?seq_contains("cca")> <#if models?seq_contains("cca")>
<#if user?? && (user.roleAuthMap["A13_A01"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A13_A01"]?? || user.admin) >
<dd class="ukefu-left-menu" data-tooltip="会话监控"> <dd class="ukefu-left-menu" data-tooltip="会话监控">
<a href="javascript:void(0)" href="javascript:void(0)" id="customerchatsaudit" onclick="return false;" data-title="会话监控" data-href="/apps/cca/index.html" class="iframe_btn" data-id="customerChatAudit" data-type="tabAdd"> <a href="javascript:void(0)" href="javascript:void(0)" id="customerchatsaudit" onclick="return false;" data-title="会话监控" data-href="/apps/cca/index.html" class="iframe_btn" data-id="customerChatAudit" data-type="tabAdd">
<i class="csfont" style="position: relative;">&#58906;</i> <i class="csfont" style="position: relative;">&#58906;</i>
@ -249,7 +249,7 @@
</#if> </#if>
<!-- <!--
<#if user?? && (user.roleAuthMap["A09_A02_A01"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A09_A02_A01"]?? || user.admin) >
<dd class="ukefu-left-menu" data-tooltip="知识库"> <dd class="ukefu-left-menu" data-tooltip="知识库">
<a href="javascript:void(0)" data-title="知识库" data-href="/apps/kbs/index.html" class="iframe_btn" data-id="maincontent" data-type="tabChange"> <a href="javascript:void(0)" data-title="知识库" data-href="/apps/kbs/index.html" class="iframe_btn" data-id="maincontent" data-type="tabChange">
@ -259,20 +259,20 @@
</#if> </#if>
--> -->
<#if models?seq_contains("xiaoe")> <#if models?seq_contains("xiaoe")>
<#if user?? && (user.roleAuthMap["A09_A02_A01"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A09_A02_A01"]?? || user.admin) >
<a href="javascript:void(0)" data-title="知识库" data-href="/apps/topic.html" class="iframe_btn" data-id="maincontent" data-type="tabChange"> <a href="javascript:void(0)" data-title="知识库" data-href="/apps/topic.html" class="iframe_btn" data-id="maincontent" data-type="tabChange">
<i class="kfont" style="position: relative;">&#xe62a;</i> <i class="kfont" style="position: relative;">&#xe62a;</i>
</a> </a>
</#if> </#if>
</#if> </#if>
<#if user?? &&( user.roleAuthMap["A06"]?? || user.usertype == "0")> <#if user?? &&( user.roleAuthMap["A06"]?? || user.admin)>
<dd class="ukefu-left-menu" data-tooltip="客服设置"> <dd class="ukefu-left-menu" data-tooltip="客服设置">
<a href="javascript:void(0)" data-title="客服设置" data-href="/setting/agent/index.html" class="iframe_btn" data-id="maincontent" data-type="tabChange"> <i class="layui-icon" <a href="javascript:void(0)" data-title="客服设置" data-href="/setting/agent/index.html" class="iframe_btn" data-id="maincontent" data-type="tabChange"> <i class="layui-icon"
style="position: relative;">&#xe614;</i> style="position: relative;">&#xe614;</i>
</a> </a>
</dd> </dd>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A07"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A07"]?? || user.admin) >
<dd class="ukefu-left-menu" data-tooltip="快捷回复"> <dd class="ukefu-left-menu" data-tooltip="快捷回复">
<a href="javascript:void(0)" data-title="快捷回复" data-href="/setting/quickreply/index.html" class="iframe_btn" data-id="maincontent" data-type="tabChange"> <a href="javascript:void(0)" data-title="快捷回复" data-href="/setting/quickreply/index.html" class="iframe_btn" data-id="maincontent" data-type="tabChange">
<i class="layui-icon" <i class="layui-icon"
@ -280,7 +280,7 @@
</a> </a>
</dd> </dd>
</#if> </#if>
<#if user?? &&( user.roleAuthMap["A08"]?? || user.usertype == "0") > <#if user?? &&( user.roleAuthMap["A08"]?? || user.admin) >
<dd class="ukefu-left-menu" data-tooltip="会话历史"> <dd class="ukefu-left-menu" data-tooltip="会话历史">
<a href="javascript:void(0)" data-title="会话历史" data-href="/service/history/index.html" class="iframe_btn" data-id="maincontent" data-type="tabChange"> <i class="kfont" <a href="javascript:void(0)" data-title="会话历史" data-href="/service/history/index.html" class="iframe_btn" data-id="maincontent" data-type="tabChange"> <i class="kfont"
style="position: relative;">&#xe7eb;</i> style="position: relative;">&#xe7eb;</i>
@ -297,7 +297,7 @@
--> -->
<!--<#if models?seq_contains("xiaoe")>--> <!--<#if models?seq_contains("xiaoe")>-->
<!--<#if user?? &&( user.roleAuthMap["A09"]?? || user.usertype == "0") >--> <!--<#if user?? &&( user.roleAuthMap["A09"]?? || user.admin) >-->
<!--<dd class="ukefu-left-menu" data-tooltip="智能机器人">--> <!--<dd class="ukefu-left-menu" data-tooltip="智能机器人">-->
<!--<a href="javascript:void(0)" data-title="智能机器人" data-href="/apps/xiaoe/index.html" class="iframe_btn" data-id="maincontent" data-type="tabChange">--> <!--<a href="javascript:void(0)" data-title="智能机器人" data-href="/apps/xiaoe/index.html" class="iframe_btn" data-id="maincontent" data-type="tabChange">-->
<!--<i class="kfont" style="position: relative;">&#xe63a;</i>--> <!--<i class="kfont" style="position: relative;">&#xe63a;</i>-->
@ -306,7 +306,7 @@
<!--</#if>--> <!--</#if>-->
<!--</#if>--> <!--</#if>-->
<#if models?seq_contains("callout")> <#if models?seq_contains("callout")>
<#if user?? &&( user.roleAuthMap["A11"]?? || user.usertype == "0") > <#if user?? &&( user.roleAuthMap["A11"]?? || user.admin) >
<dd class="ukefu-left-menu" data-tooltip="外呼系统"> <dd class="ukefu-left-menu" data-tooltip="外呼系统">
<a href="javascript:void(0)" data-title="外呼系统" data-href="/apps/callout/index.html" class="iframe_btn" data-id="maincontent" data-type="tabChange"> <a href="javascript:void(0)" data-title="外呼系统" data-href="/apps/callout/index.html" class="iframe_btn" data-id="maincontent" data-type="tabChange">
<i class="kfont" style="position: relative;">&#xe629;</i> <i class="kfont" style="position: relative;">&#xe629;</i>
@ -315,7 +315,7 @@
</#if> </#if>
</#if> </#if>
<#if models?seq_contains("chatbot")> <#if models?seq_contains("chatbot")>
<#if user?? &&( user.roleAuthMap["A09"]?? || user.usertype == "0") > <#if user?? &&( user.roleAuthMap["A09"]?? || user.admin) >
<dd class="ukefu-left-menu" data-tooltip="智能机器人"> <dd class="ukefu-left-menu" data-tooltip="智能机器人">
<a href="javascript:void(0)" data-title="智能机器人" onclick="return false;" data-href="/apps/chatbot/index.html" class="iframe_btn" data-id="chatbotIntegrationWin" data-type="tabAdd"> <a href="javascript:void(0)" data-title="智能机器人" onclick="return false;" data-href="/apps/chatbot/index.html" class="iframe_btn" data-id="chatbotIntegrationWin" data-type="tabAdd">
<i class="csfont" style="position: relative;">&#58939;</i> <i class="csfont" style="position: relative;">&#58939;</i>
@ -324,14 +324,14 @@
</#if> </#if>
</#if> </#if>
<#if models?seq_contains("callcenter")> <#if models?seq_contains("callcenter")>
<#if user?? && (user.roleAuthMap["A10"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A10"]?? || user.admin) >
<dd class="ukefu-left-menu" data-tooltip="语音渠道"> <dd class="ukefu-left-menu" data-tooltip="语音渠道">
<a href="javascript:void(0)" data-title="语音渠道" data-href="/apps/callcenter/service/index.html" class="iframe_btn" data-id="maincontent" data-type="tabChange"> <a href="javascript:void(0)" data-title="语音渠道" data-href="/apps/callcenter/service/index.html" class="iframe_btn" data-id="maincontent" data-type="tabChange">
<i class="kfont" style="position: relative;">&#xe625;</i> <i class="kfont" style="position: relative;">&#xe625;</i>
</a> </a>
</dd> </dd>
<!-- <!--
<#if user?? &&( user.roleAuthMap["A12"]?? || user.usertype == "0") > <#if user?? &&( user.roleAuthMap["A12"]?? || user.admin) >
<dd class="ukefu-left-menu" data-tooltip="坐席监控"> <dd class="ukefu-left-menu" data-tooltip="坐席监控">
<a href="javascript:void(0)" data-title="坐席监控" data-href="/apps/callcenter/service/monitor/allcall.html" class="iframe_btn" data-id="maincontent" data-type="tabChange"> <a href="javascript:void(0)" data-title="坐席监控" data-href="/apps/callcenter/service/monitor/allcall.html" class="iframe_btn" data-id="maincontent" data-type="tabChange">
<i class="layui-icon" style="position: relative;">&#xe629;</i> <i class="layui-icon" style="position: relative;">&#xe629;</i>
@ -342,7 +342,7 @@
</#if> </#if>
</#if> </#if>
<!--暂时隐藏https://github.com/chatopera/cosin/issues/52--> <!--暂时隐藏https://github.com/chatopera/cosin/issues/52-->
<!--<#if user?? && (user.roleAuthMap["A13"]?? || user.usertype == "0") >--> <!--<#if user?? && (user.roleAuthMap["A13"]?? || user.admin) >-->
<!--<dd class="ukefu-left-menu" data-tooltip="数据报表">--> <!--<dd class="ukefu-left-menu" data-tooltip="数据报表">-->
<!--<a href="javascript:void(0)" data-title="数据报表" data-href="/apps/view/index.html" class="iframe_btn" data-id="maincontent" data-type="tabChange">--> <!--<a href="javascript:void(0)" data-title="数据报表" data-href="/apps/view/index.html" class="iframe_btn" data-id="maincontent" data-type="tabChange">-->
<!--<i class="kfont" style="position: relative;">&#xe6d6;</i>--> <!--<i class="kfont" style="position: relative;">&#xe6d6;</i>-->

View File

@ -40,7 +40,7 @@
<td><#if agentStatus.logindate??>${agentStatus.logindate?string('yyyy-MM-dd HH:mm:ss')}</#if></td> <td><#if agentStatus.logindate??>${agentStatus.logindate?string('yyyy-MM-dd HH:mm:ss')}</#if></td>
<td> <td>
<#if agentStatus.agentno != user.id && user.usertype == '0'> <#if agentStatus.agentno != user.id && user.admin>
<a href="/service/agent/offline.html?id=${agentStatus.id!''}" data-toggle="tip" title="强制使登陆坐席离线,离线后,坐席不再分配访客,请确认是否操作?"> <a href="/service/agent/offline.html?id=${agentStatus.id!''}" data-toggle="tip" title="强制使登陆坐席离线,离线后,坐席不再分配访客,请确认是否操作?">
<i class="layui-icon">&#x1006;</i>强制离线 <i class="layui-icon">&#x1006;</i>强制离线
</a> </a>

View File

@ -1,24 +1,24 @@
<ul class="layui-nav layui-nav-tree" lay-filter="setting"> <ul class="layui-nav layui-nav-tree" lay-filter="setting">
<#if user?? && (user.roleAuthMap["A08_A01"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A08_A01"]?? || user.admin) >
<li class="layui-nav-item layui-nav-itemed"> <li class="layui-nav-item layui-nav-itemed">
<a class="layui-nav-title" href="javascript:;">会话信息</a> <a class="layui-nav-title" href="javascript:;">会话信息</a>
<dl class="layui-nav-child"> <dl class="layui-nav-child">
<#if user?? && (user.roleAuthMap["A08_A01_A01"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A08_A01_A01"]?? || user.admin) >
<dd <#if subtype?? && subtype == 'history'>class="layui-this"</#if>> <dd <#if subtype?? && subtype == 'history'>class="layui-this"</#if>>
<a href="/service/history/index.html">历史会话</a> <a href="/service/history/index.html">历史会话</a>
</dd> </dd>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A08_A01_A02"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A08_A01_A02"]?? || user.admin) >
<dd <#if subtype?? && subtype == 'current'>class="layui-this"</#if>> <dd <#if subtype?? && subtype == 'current'>class="layui-this"</#if>>
<a href="/service/current/index.html">当前会话</a> <a href="/service/current/index.html">当前会话</a>
</dd> </dd>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A08_A01_A03"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A08_A01_A03"]?? || user.admin) >
<dd <#if subtype?? && subtype == 'filter'>class="layui-this"</#if>> <dd <#if subtype?? && subtype == 'filter'>class="layui-this"</#if>>
<a href="/service/quene/index.html">排队队列</a> <a href="/service/quene/index.html">排队队列</a>
</dd> </dd>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A08_A01_A04"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A08_A01_A04"]?? || user.admin) >
<dd <#if subtype?? && subtype == 'leavemsg'>class="layui-this"</#if>> <dd <#if subtype?? && subtype == 'leavemsg'>class="layui-this"</#if>>
<a href="/service/leavemsg/index.html">访客留言</a> <a href="/service/leavemsg/index.html">访客留言</a>
</dd> </dd>
@ -27,16 +27,16 @@
</li> </li>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A08_A02"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A08_A02"]?? || user.admin) >
<li class="layui-nav-item layui-nav-itemed"> <li class="layui-nav-item layui-nav-itemed">
<a class="layui-nav-title" href="javascript:;">统计功能</a> <a class="layui-nav-title" href="javascript:;">统计功能</a>
<dl class="layui-nav-child"> <dl class="layui-nav-child">
<#if user?? && (user.roleAuthMap["A08_A02_A01"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A08_A02_A01"]?? || user.admin) >
<dd <#if subtype?? && subtype == 'statcoment'>class="layui-this"</#if>> <dd <#if subtype?? && subtype == 'statcoment'>class="layui-this"</#if>>
<a href="/service/stats/coment.html">满意度统计</a> <a href="/service/stats/coment.html">满意度统计</a>
</dd> </dd>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A08_A02_A02"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A08_A02_A02"]?? || user.admin) >
<dd <#if subtype?? && subtype == 'statagent'>class="layui-this"</#if>> <dd <#if subtype?? && subtype == 'statagent'>class="layui-this"</#if>>
<a href="/service/stats/agent.html">客服坐席</a> <a href="/service/stats/agent.html">客服坐席</a>
</dd> </dd>
@ -44,21 +44,21 @@
</dl> </dl>
</li> </li>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A08_A03"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A08_A03"]?? || user.admin) >
<li class="layui-nav-item layui-nav-itemed"> <li class="layui-nav-item layui-nav-itemed">
<a class="layui-nav-title" href="javascript:;">服务小结</a> <a class="layui-nav-title" href="javascript:;">服务小结</a>
<dl class="layui-nav-child"> <dl class="layui-nav-child">
<#if user?? && (user.roleAuthMap["A08_A03_A01"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A08_A03_A01"]?? || user.admin) >
<dd <#if subtype?? && subtype == 'agentsummary'>class="layui-this"</#if>> <dd <#if subtype?? && subtype == 'agentsummary'>class="layui-this"</#if>>
<a href="/apps/agent/summary/index.html">多媒体客服</a> <a href="/apps/agent/summary/index.html">多媒体客服</a>
</dd> </dd>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A08_A03_A02"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A08_A03_A02"]?? || user.admin) >
<dd <#if subtype?? && subtype == 'processed'>class="layui-this"</#if>> <dd <#if subtype?? && subtype == 'processed'>class="layui-this"</#if>>
<a href="/apps/agent/processed/index.html">已处理多媒体客服</a> <a href="/apps/agent/processed/index.html">已处理多媒体客服</a>
</dd> </dd>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A08_A03_A03"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A08_A03_A03"]?? || user.admin) >
<#if models?seq_contains("callcenter")> <#if models?seq_contains("callcenter")>
<dd <#if subtype?? && subtype == 'summary'>class="layui-this"</#if>> <dd <#if subtype?? && subtype == 'summary'>class="layui-this"</#if>>
<a href="/apps/callcenter/summary/index.html">呼叫中心</a> <a href="/apps/callcenter/summary/index.html">呼叫中心</a>
@ -67,7 +67,7 @@
</#if> </#if>
<#if models?seq_contains("callcenter")> <#if models?seq_contains("callcenter")>
<#if user?? && (user.roleAuthMap["A08_A03_A04"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A08_A03_A04"]?? || user.admin) >
<dd <#if subtype?? && subtype == 'callcenterprocessed'>class="layui-this"</#if>> <dd <#if subtype?? && subtype == 'callcenterprocessed'>class="layui-this"</#if>>
<a href="/apps/callcenter/processed/index.html">已处理呼叫中心</a> <a href="/apps/callcenter/processed/index.html">已处理呼叫中心</a>
</dd> </dd>
@ -77,7 +77,7 @@
</dl> </dl>
</li> </li>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A08_A01_A05"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A08_A01_A05"]?? || user.admin) >
<li class="layui-nav-item layui-nav-itemed"> <li class="layui-nav-item layui-nav-itemed">
<a class="layui-nav-title" href="javascript:;">满意度评价</a> <a class="layui-nav-title" href="javascript:;">满意度评价</a>
<dl class="layui-nav-child"> <dl class="layui-nav-child">
@ -92,17 +92,17 @@
</dl> </dl>
</li> </li>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A08_A04"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A08_A04"]?? || user.admin) >
<li class="layui-nav-item layui-nav-itemed"> <li class="layui-nav-item layui-nav-itemed">
<a class="layui-nav-title" href="javascript:;">坐席信息</a> <a class="layui-nav-title" href="javascript:;">坐席信息</a>
<dl class="layui-nav-child"> <dl class="layui-nav-child">
<#if user?? && (user.roleAuthMap["A08_A04_A01"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A08_A04_A01"]?? || user.admin) >
<dd <#if subtype?? && subtype == 'onlineagent'>class="layui-this"</#if>> <dd <#if subtype?? && subtype == 'onlineagent'>class="layui-this"</#if>>
<a href="/service/agent/index.html">在线坐席</a> <a href="/service/agent/index.html">在线坐席</a>
</dd> </dd>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A08_A04_A02"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A08_A04_A02"]?? || user.admin) >
<dd <#if subtype?? && subtype == 'userlist'>class="layui-this"</#if>> <dd <#if subtype?? && subtype == 'userlist'>class="layui-this"</#if>>
<a href="/service/user/index.html">全部坐席</a> <a href="/service/user/index.html">全部坐席</a>
</dd> </dd>
@ -110,4 +110,4 @@
</dl> </dl>
</li> </li>
</#if> </#if>
</ul> </ul>

View File

@ -1,15 +1,15 @@
<ul class="layui-nav layui-nav-tree" lay-filter="setting"> <ul class="layui-nav layui-nav-tree" lay-filter="setting">
<#if user?? && (user.roleAuthMap["A06_A01"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A06_A01"]?? || user.admin) >
<li class="layui-nav-item layui-nav-itemed"> <li class="layui-nav-item layui-nav-itemed">
<a class="layui-nav-title" href="javascript:;">客服设置</a> <a class="layui-nav-title" href="javascript:;">客服设置</a>
<dl class="layui-nav-child"> <dl class="layui-nav-child">
<#if user?? && (user.roleAuthMap["A06_A01_A01"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A06_A01_A01"]?? || user.admin) >
<dd <#if subtype?? && subtype == 'sessionconfig'>class="layui-this"</#if>> <dd <#if subtype?? && subtype == 'sessionconfig'>class="layui-this"</#if>>
<a href="/setting/agent/index.html">对话设置</a> <a href="/setting/agent/index.html">对话设置</a>
</dd> </dd>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A06_A01_A02"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A06_A01_A02"]?? || user.admin) >
<dd <#if subtype?? && subtype == 'blacklist'>class="layui-this"</#if>> <dd <#if subtype?? && subtype == 'blacklist'>class="layui-this"</#if>>
<a href="/setting/blacklist.html">黑名单</a> <a href="/setting/blacklist.html">黑名单</a>
</dd> </dd>
@ -22,7 +22,7 @@
</dl> </dl>
</li> </li>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A06_A02"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A06_A02"]?? || user.admin) >
<li class="layui-nav-item layui-nav-itemed"> <li class="layui-nav-item layui-nav-itemed">
<a class="layui-nav-title" href="javascript:;">广告位管理</a> <a class="layui-nav-title" href="javascript:;">广告位管理</a>
<dl class="layui-nav-child"> <dl class="layui-nav-child">
@ -36,7 +36,7 @@
</dl> </dl>
</li> </li>
</#if> </#if>
<#if user?? && (user.roleAuthMap["A06_A03"]?? || user.usertype == "0") > <#if user?? && (user.roleAuthMap["A06_A03"]?? || user.admin) >
<li class="layui-nav-item layui-nav-itemed"> <li class="layui-nav-item layui-nav-itemed">
<a class="layui-nav-title" href="javascript:;">标签管理</a> <a class="layui-nav-title" href="javascript:;">标签管理</a>
<dl class="layui-nav-child"> <dl class="layui-nav-child">
@ -50,4 +50,4 @@
</dl> </dl>
</li> </li>
</#if> </#if>
</ul> </ul>

View File

@ -57,7 +57,7 @@
首页 首页
</a> </a>
</li> </li>
<#if (user?? && user.roleAuthMap["B02"]?? || user.usertype == "0")> <#if (user?? && user.roleAuthMap["B02"]?? || user.admin)>
<li class="layui-nav-item "> <li class="layui-nav-item ">
<a href="javascript:void(0)" onclick="return false;" data-title="系统管理" data-href="/admin/content.html" class="iframe_btn" data-id="admin" data-type="tabAdd"> <a href="javascript:void(0)" onclick="return false;" data-title="系统管理" data-href="/admin/content.html" class="iframe_btn" data-id="admin" data-type="tabAdd">
<i class="layui-icon" style="position: relative;">&#xe631;</i> <i class="layui-icon" style="position: relative;">&#xe631;</i>
@ -81,7 +81,7 @@
<div class="content"> <div class="content">
<div class="organization-div"> <div class="organization-div">
<#if organization??> <#if organization??>
<#if user?? && user.usertype == "0"> <#if user?? && user.admin>
<span id="company-name">${organization.name!''}</span> <span id="company-name">${organization.name!''}</span>
<a href="/apps/organization/edit.html?id=${organization.id!''}" data-toggle="ajax" data-width="450" data-height="350" data-title="编辑" ><i class="layui-icon" <a href="/apps/organization/edit.html?id=${organization.id!''}" data-toggle="ajax" data-width="450" data-height="350" data-title="编辑" ><i class="layui-icon"
style="font-size: 24px;float:left;margin-left:5px;color:#2bd99e">&#xe642;</i> style="font-size: 24px;float:left;margin-left:5px;color:#2bd99e">&#xe642;</i>
@ -97,7 +97,7 @@
<img class="product-img" src="<#if tenant?? && tenant.tenantlogo??>/res/image.html?id=${tenant.tenantlogo?url}</#if>" onerror="javascript:this.src='/images/error.jpg';"> <img class="product-img" src="<#if tenant?? && tenant.tenantlogo??>/res/image.html?id=${tenant.tenantlogo?url}</#if>" onerror="javascript:this.src='/images/error.jpg';">
<div class="ukefu-tenant-item-div2" <div class="ukefu-tenant-item-div2"
style="font-weight: 400; position: absolute;">${tenant.tenantname!''} style="font-weight: 400; position: absolute;">${tenant.tenantname!''}
<#if user?? && user.usertype == "0"> <#if user?? && user.admin>
<i class="layui-icon ukefu-bt-text-title" href="/apps/tenant/delete.html?id=${tenant.id!''}" data-toggle="tip" data-title="删除" <i class="layui-icon ukefu-bt-text-title" href="/apps/tenant/delete.html?id=${tenant.id!''}" data-toggle="tip" data-title="删除"
style="font-size: 24px;float:right;">&#xe640;</i> style="font-size: 24px;float:right;">&#xe640;</i>
<i class="layui-icon ukefu-bt-text-title" href="/apps/tenant/edit.html?id=<#if tenant?? && tenant.id??>${tenant.id!''}</#if>" data-toggle="ajax" data-width="550" data-height="400" data-title="${systemConfig.namealias!''}编辑" <i class="layui-icon ukefu-bt-text-title" href="/apps/tenant/edit.html?id=<#if tenant?? && tenant.id??>${tenant.id!''}</#if>" data-toggle="ajax" data-width="550" data-height="400" data-title="${systemConfig.namealias!''}编辑"
@ -107,7 +107,7 @@
</a> </a>
</div> </div>
</#list> </#if> </#list> </#if>
<#if user?? && user.usertype == "0"> <#if user?? && user.admin>
<a href="/apps/tenant/add.html" data-toggle="ajax" <a href="/apps/tenant/add.html" data-toggle="ajax"
data-width="550" data-height="300" data-width="550" data-height="300"
data-title="${systemConfig.namealias!''}创建" class="ukefu-bt"> data-title="${systemConfig.namealias!''}创建" class="ukefu-bt">

View File

@ -21,9 +21,9 @@
layui.use('layer', function(){ layui.use('layer', function(){
var layer = layui.layer; var layer = layui.layer;
<#if msg?? && msg == '0'> <#if msg?? && msg == '0'>
layer.msg('用户名或密码错误,请重新填写',{icon: 2, offset: 'b', time: 3000}) layer.msg('用户名或密码错误,请重新填写',{icon: 2, time: 3000})
<#elseif msg?? && msg == '1'> <#elseif msg?? && msg == '1'>
layer.msg('用户注册成功,请通过用户名和密码登陆',{icon: 2, offset: 'b', time: 3000}) layer.msg('用户注册成功,请通过用户名和密码登陆',{icon: 2, time: 3000})
<#elseif msg?? && msg == '2'> <#elseif msg?? && msg == '2'>
layer.msg('您的账号已经在其它浏览器登录,请确认是您本人的操作,保证安全。',{icon: 2, offset: 't', time: 0}) layer.msg('您的账号已经在其它浏览器登录,请确认是您本人的操作,保证安全。',{icon: 2, offset: 't', time: 0})
</#if> </#if>

View File

@ -2907,7 +2907,7 @@ select{
left: 150px; left: 150px;
background-color: rgba(0,0,0,.15); background-color: rgba(0,0,0,.15);
border-radius: 50px; border-radius: 50px;
<#if user?? && user.usertype?? && user.usertype == "0"> <#if user?? && user.admin>
width: 740px; width: 740px;
<#else> <#else>
width: 690px; width: 690px;
@ -3980,11 +3980,3 @@ background:#FFFFFF;
.cskefu-cca-header { .cskefu-cca-header {
padding-top: 0px; padding-top: 0px;
} }
.cskefu-cca-leftside {
top: 40px !important;
}
.cskefu-cca-content {
top: 40px !important;
}

View File

@ -8145,31 +8145,30 @@ CREATE TABLE `cs_user` (
`USERNAME` varchar(50) DEFAULT NULL COMMENT '用户名', `USERNAME` varchar(50) DEFAULT NULL COMMENT '用户名',
`PASSWORD` varchar(255) DEFAULT NULL COMMENT '密码', `PASSWORD` varchar(255) DEFAULT NULL COMMENT '密码',
`SECURECONF` varchar(255) DEFAULT NULL COMMENT '安全级别', `SECURECONF` varchar(255) DEFAULT NULL COMMENT '安全级别',
`EMAIL` varchar(255) DEFAULT NULL COMMENT '邮件', `email` varchar(255) DEFAULT NULL COMMENT '邮件',
`FIRSTNAME` varchar(255) DEFAULT NULL COMMENT '', `FIRSTNAME` varchar(255) DEFAULT NULL COMMENT '',
`MIDNAME` varchar(255) DEFAULT NULL COMMENT '', `MIDNAME` varchar(255) DEFAULT NULL COMMENT '',
`LASTNAME` varchar(255) DEFAULT NULL COMMENT '', `LASTNAME` varchar(255) DEFAULT NULL COMMENT '',
`JOBTITLE` varchar(255) DEFAULT NULL COMMENT '职位', `JOBTITLE` varchar(255) DEFAULT NULL COMMENT '职位',
`GENDER` varchar(255) DEFAULT NULL COMMENT '性别', `GENDER` varchar(255) DEFAULT NULL COMMENT '性别',
`BIRTHDAY` varchar(255) DEFAULT NULL COMMENT '生日', `BIRTHDAY` varchar(255) DEFAULT NULL COMMENT '生日',
`NICKNAME` varchar(255) DEFAULT NULL COMMENT '昵称', `nickname` varchar(255) DEFAULT NULL COMMENT '昵称',
`USERTYPE` varchar(255) DEFAULT NULL COMMENT '用户类型', `rulename` varchar(255) DEFAULT NULL COMMENT '角色',
`RULENAME` varchar(255) DEFAULT NULL COMMENT '角色',
`SEARCHPROJECTID` varchar(255) DEFAULT NULL COMMENT '备用', `SEARCHPROJECTID` varchar(255) DEFAULT NULL COMMENT '备用',
`ORGI` varchar(32) DEFAULT NULL COMMENT '租户ID', `orgi` varchar(32) DEFAULT NULL COMMENT '租户ID',
`ORGID` varchar(32) DEFAULT NULL COMMENT '企业ID', `orgid` varchar(32) DEFAULT NULL COMMENT '企业ID',
`CREATER` varchar(32) DEFAULT NULL COMMENT '创建人', `creater` varchar(32) DEFAULT NULL COMMENT '创建人',
`CREATETIME` datetime DEFAULT NULL COMMENT '创建时间', `createtime` datetime DEFAULT NULL COMMENT '创建时间',
`MEMO` varchar(255) DEFAULT NULL COMMENT '备注', `memo` varchar(255) DEFAULT NULL COMMENT '备注',
`UPDATETIME` datetime DEFAULT NULL COMMENT '更新时间', `updatetime` datetime DEFAULT NULL COMMENT '更新时间',
`ORGAN` varchar(32) DEFAULT NULL COMMENT '部门', `organ` varchar(32) DEFAULT NULL COMMENT '部门',
`MOBILE` varchar(32) DEFAULT NULL COMMENT '手机号', `mobile` varchar(32) DEFAULT NULL COMMENT '手机号',
`passupdatetime` datetime DEFAULT NULL COMMENT '最后 一次密码修改时间', `passupdatetime` datetime DEFAULT NULL COMMENT '最后 一次密码修改时间',
`sign` text COMMENT '签名', `sign` text COMMENT '签名',
`del` tinyint(4) DEFAULT '0' COMMENT '是否已删除', `del` tinyint(4) DEFAULT '0' COMMENT '是否已删除',
`uname` varchar(100) DEFAULT NULL COMMENT '姓名', `uname` varchar(100) DEFAULT NULL COMMENT '姓名',
`musteditpassword` tinyint(4) DEFAULT NULL COMMENT '登录修改密码', `musteditpassword` tinyint(4) DEFAULT NULL COMMENT '登录修改密码',
`AGENT` tinyint(4) DEFAULT NULL COMMENT '工号', `agent` tinyint(4) DEFAULT NULL COMMENT '工号',
`province` varchar(50) DEFAULT NULL COMMENT '省份', `province` varchar(50) DEFAULT NULL COMMENT '省份',
`city` varchar(50) DEFAULT NULL COMMENT '城市', `city` varchar(50) DEFAULT NULL COMMENT '城市',
`fans` int(11) DEFAULT NULL COMMENT '关注人数', `fans` int(11) DEFAULT NULL COMMENT '关注人数',
@ -8179,10 +8178,11 @@ CREATE TABLE `cs_user` (
`status` varchar(10) DEFAULT NULL COMMENT '状态', `status` varchar(10) DEFAULT NULL COMMENT '状态',
`deactivetime` datetime DEFAULT NULL COMMENT '离线时间', `deactivetime` datetime DEFAULT NULL COMMENT '离线时间',
`title` varchar(50) DEFAULT NULL COMMENT '标题', `title` varchar(50) DEFAULT NULL COMMENT '标题',
`DATASTATUS` tinyint(4) DEFAULT NULL COMMENT '数据状态', `datastatus` tinyint(4) DEFAULT NULL COMMENT '数据状态',
`callcenter` tinyint(4) DEFAULT NULL COMMENT '启用呼叫中心坐席', `callcenter` tinyint(4) DEFAULT NULL COMMENT '启用呼叫中心坐席',
`sipaccount` varchar(50) DEFAULT NULL COMMENT 'sip地址', `sipaccount` varchar(50) DEFAULT NULL COMMENT 'sip地址',
`SUPERUSER` tinyint(4) DEFAULT NULL COMMENT '是否超级管理员', `superadmin` tinyint(4) DEFAULT NULL COMMENT '超级管理员',
`admin` tinyint(4) DEFAULT NULL COMMENT '管理员',
`maxuser` int(11) DEFAULT '0' COMMENT '最大接入访客数量', `maxuser` int(11) DEFAULT '0' COMMENT '最大接入访客数量',
`ordertype` varchar(20) DEFAULT NULL COMMENT '默认排序方式', `ordertype` varchar(20) DEFAULT NULL COMMENT '默认排序方式',
PRIMARY KEY (`ID`) USING BTREE PRIMARY KEY (`ID`) USING BTREE
@ -8192,7 +8192,7 @@ CREATE TABLE `cs_user` (
-- Records of cs_user -- Records of cs_user
-- ---------------------------- -- ----------------------------
BEGIN; BEGIN;
INSERT INTO `cs_user` VALUES ('4028cac3614cd2f901614cf8be1f0324', NULL, 'admin', '5d80253b1cd5e5d4ca5ed539f4d72052', '5', 'admin@cc.com', NULL, NULL, NULL, NULL, '0', NULL, NULL, '0', NULL, NULL, 'cskefu', 'cskefu', NULL, '2017-03-16 13:56:34', '北京', '2018-07-31 08:24:13', '4028811b63b028dc0163b032c3ed0590', '18888888888', NULL, NULL, 0, '系统管理员', 0, 1, '北京', '北京', 2, 1, 0, '2018-08-10 04:38:17', NULL, NULL, NULL, 0, 0, NULL, 1, 0, NULL); INSERT INTO `cs_user` VALUES ('4028cac3614cd2f901614cf8be1f0324', NULL, 'admin', '5d80253b1cd5e5d4ca5ed539f4d72052', '5', 'admin@cc.com', NULL, NULL, NULL, NULL, NULL, NULL, '0', NULL, NULL, 'cskefu', 'cskefu', NULL, '2017-03-16 13:56:34', '北京', '2018-07-31 08:24:13', '4028811b63b028dc0163b032c3ed0590', '18888888888', NULL, NULL, 0, '超级管理员', 0, 1, '北京', '北京', 2, 1, 0, '2018-08-10 04:38:17', NULL, NULL, NULL, 0, 0, NULL, 1, 1, 0, NULL);
COMMIT; COMMIT;
-- ---------------------------- -- ----------------------------