Commit 707515cc by unknown

merge f663

parents f7b6d8e7 67d1acfc
Showing with 1179 additions and 9 deletions
......@@ -23,6 +23,18 @@
<artifactId>qiniu-java-sdk</artifactId>
<version>7.0.0</version>
</dependency> -->
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>cc.rssoft</groupId>
<artifactId>rsmw-java</artifactId>
<version>2.2.5</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp</groupId>
<artifactId>okhttp</artifactId>
......
......@@ -2,8 +2,11 @@ package com.ctrip.fun.admin.controller.tools;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
......@@ -17,17 +20,28 @@ import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ctrip.fun.admin.exception.CommonException;
import com.ctrip.fun.admin.form.tools.UserRegisterForm;
import com.ctrip.fun.admin.eventhandler.BindEventHandler;
import com.ctrip.fun.admin.eventhandler.BridgeEventHandler;
import com.ctrip.fun.admin.eventhandler.CdrEventHandler;
import com.ctrip.fun.admin.eventhandler.ChannelRouteEventHandler;
import com.ctrip.fun.admin.eventhandler.NewStateEventHandler;
import com.ctrip.fun.admin.eventhandler.QueueMemberPauseEventHandler;
import com.ctrip.fun.admin.eventhandler.SqeEventHandler;
import com.ctrip.fun.admin.service.system.UserService;
import com.ctrip.fun.admin.service.tools.CallCenterService;
import com.ctrip.fun.admin.utility.Util;
import com.ctrip.fun.admin.vo.callcenter.AbstractEventHandler;
import com.ctrip.fun.common.vo.PagedResponseBean;
import com.ctrip.fun.common.vo.basic.UserExtQuery;
import com.ctrip.fun.common.vo.user.RegisterBean;
......@@ -44,6 +58,19 @@ public class CallCenterController {
private static final Logger logger = LoggerFactory.getLogger(CallCenterController.class);
public static final Map<String, AbstractEventHandler> eventHandlerMap = new ConcurrentHashMap<String, AbstractEventHandler>() {
private static final long serialVersionUID = 1565306516357059751L;
{
put("cdrEvent", new CdrEventHandler());
put("newStateEvent",new NewStateEventHandler());
put("bridgeEvent",new BridgeEventHandler());
put("channelRouteEvent",new ChannelRouteEventHandler());
put("sqeEvent",new SqeEventHandler());
put("queueMemberPauseEvent",new QueueMemberPauseEventHandler());
put("bindEvent",new BindEventHandler());
}
};
@Autowired
private CallCenterService ccService;
......@@ -77,6 +104,49 @@ public class CallCenterController {
}
}
/**
*
* @return
*/
@RequestMapping(value = "/callback", method = RequestMethod.POST)
@ResponseBody
public String callbackEvent(HttpServletRequest request, HttpServletResponse response, @RequestBody String eventJsonString, ModelMap model) {
String result = "";
try {
logger.debug("从" + request.getRemoteAddr() + "收到event:" + eventJsonString);
JSONObject commandJSONObject = null;
commandJSONObject = JSON.parseObject(eventJsonString);
String event = commandJSONObject.getString("event");
if(StringUtils.isBlank(event)){
result = "收到的消息缺少event字段: "+ eventJsonString;
logger.warn(result);
return result;
}
// 1)找出具体的命令实例。
logger.debug("event [" + event + "] is ready to execute...");
logger.debug(eventJsonString);
AbstractEventHandler eventHandler = eventHandlerMap.get(event);
// 2)执行命令并返回结果
if(eventHandler!=null){
eventHandler.handle(commandJSONObject);
return "Success";
}else{
result = "event=" + event + ", event字段有误,没有找到对应的eventHandler";
logger.warn("event=" + event + ", event字段有误,没有找到对应的eventHandler");
return result;
}
} catch (Exception e) {
logger.error(e.getMessage(), e);
return e.getMessage();
}
}
@RequestMapping(value = "/userRegister", method = RequestMethod.POST)
public String userRegister(HttpServletRequest request, @ModelAttribute("form") UserRegisterForm form, BindingResult binding, ModelMap model) {
String uid = null;
......@@ -169,7 +239,7 @@ public class CallCenterController {
PagedResponseBean<UserExtBean> response = userService.list("", query);
Collection<UserExtBean> users = response.getResult();
if (CollectionUtils.isNotEmpty(users)) {
List<UserExtBean> list = (List) users;
List<UserExtBean> list = (List<UserExtBean>) users;
UserExtBean user = list.get(0);
uid = user.getUid();
} else {
......
package com.ctrip.fun.admin.eventhandler;
import com.alibaba.fastjson.JSONObject;
import com.ctrip.fun.admin.vo.callcenter.AbstractEventHandler;
/**
*
*
* @author jyf
*
*/
public class BindEventHandler extends AbstractEventHandler {
// private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public String handle(JSONObject jsonObject) {
return"";
}
}
package com.ctrip.fun.admin.eventhandler;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ctrip.fun.admin.vo.callcenter.AbstractEventHandler;
import com.ctrip.fun.admin.vo.callcenter.BridgeEvent;
/**
*
* channel bridge
*
* @author jyf
*
*/
public class BridgeEventHandler extends AbstractEventHandler {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public String handle(JSONObject jsonObject) {
logger.debug(jsonObject.toJSONString());
/*BridgeEvent event = JSON.toJavaObject(jsonObject, BridgeEvent.class);
//1)处理群呼清理QqdCache.groupCallChannelMap的逻辑
String phoneNumber = event.getCallerInNumber1();
if(StringUtils.isNotBlank(phoneNumber)){
QqdCache.groupCallItemBeanMap.remove(phoneNumber);
logger.debug("MMMMMM 群呼正在接听清理号码:"+phoneNumber +" 内容为:"+JSON.toJSONString(QqdCache.groupCallItemBeanMap));
}*/
return"";
}
}
package com.ctrip.fun.admin.eventhandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ctrip.fun.admin.vo.callcenter.AbstractEventHandler;
import com.ctrip.fun.admin.vo.callcenter.RsmwCdrEvent;
//import cc.rssoft.framework.springutil.ApplicationHelper;
//import cc.rssoft.qqd.mod_callcenter.service.GroupCallTaskService;
//import cc.rssoft.qqd.mod_callcenter.service.OutboundtaskItemService;
//import cc.rssoft.qqd.mod_customer.service.CustomerContactHistoryCategoryService;
//import cc.rssoft.qqd.rsmwapi.internal.AbstractEventHandler;
//import cc.rssoft.qqd.rsmwapi.internal.RsmwCdrEvent;
/**
*
* CDR
*
* @author jyf
*
*/
public class CdrEventHandler extends AbstractEventHandler {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public String handle(JSONObject jsonObject) {
// 先从json对象转成java对象,方便get
RsmwCdrEvent event = JSON.toJavaObject(jsonObject, RsmwCdrEvent.class);
// System.out.println("AAA cdrhandler:" + event.getCallUuid());
logger.debug("receive CDR from RSMW:" + jsonObject.toJSONString());
// 这里处理【业务逻辑1:更新outboundtaskItem】
/*
OutboundtaskItemService outboundtaskItemService = ApplicationHelper.getApplicationContext()
.getBean("outboundtaskItemService", OutboundtaskItemService.class);
if (outboundtaskItemService != null) {
outboundtaskItemService.updateOutboundtaskItemAfterCall(event);
}
//......
// 这里处理【业务逻辑2:更新客户更进记录】
// 找出src,dst中的外部号码(非exten),作为customerPhoneNumber处理,处理过程如下:
// 先获取:customerService.getCustomerByPhonenNumber(phoneNumber);
// 如果没有customer就新增一条customer记录(类席newtateevent里的逻辑)
// 拿到customerid后,去insert CustomerContactHistory,setcontent=calluuid
CustomerContactHistoryCategoryService customerContactHistoryCategoryService = ApplicationHelper
.getApplicationContext()
.getBean("customerContactHistoryCategoryService", CustomerContactHistoryCategoryService.class);
if (customerContactHistoryCategoryService != null) {
customerContactHistoryCategoryService.saveCustomerContactHistory(event, 1L);
}
// 这里处理【业务逻辑3:更新群呼任务item】
// 群呼模块.
String userfield = event.getUserfield();
JSONObject userData = JSONObject.parseObject(userfield);
if (userData != null) {
logger.debug(userData.toJSONString());
Long gcTaskId = userData.getLong("gcTaskId");
Long gcTaskItemId = userData.getLong("gcTaskItemId");
Long questionnaireId = userData.getLong("questionnaireId");
Long customerId = userData.getLong("customerId");
if (gcTaskItemId != null) {
// 更新群呼item的记录
GroupCallTaskService groupCallTaskService = ApplicationHelper.getApplicationContext()
.getBean("groupCallTaskService", GroupCallTaskService.class);
if (groupCallTaskService != null) {
groupCallTaskService.updateGcTaskItemAfterCall(event, gcTaskId, gcTaskItemId, questionnaireId, customerId);
}
}else{
logger.debug("没有清理callUuid: gcTaskId == null");
}
}else{
logger.debug("没有清理callUuid: userData == null");
}*/
return "";
}
}
package com.ctrip.fun.admin.eventhandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ctrip.fun.admin.vo.callcenter.AbstractEventHandler;
import com.ctrip.fun.admin.vo.callcenter.RsmwChannelRouteEvent;
/**
*
*
* @author jyf
*
*/
public class ChannelRouteEventHandler extends AbstractEventHandler {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public String handle(JSONObject jsonObject) {
logger.debug(jsonObject.toJSONString());
RsmwChannelRouteEvent event = JSON.toJavaObject(jsonObject, RsmwChannelRouteEvent.class);
logger.debug(event.getUserData());
return"";
}
}
package com.ctrip.fun.admin.eventhandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ctrip.fun.admin.vo.callcenter.AbstractEventHandler;
import com.ctrip.fun.admin.vo.callcenter.RsmwNewStateEvent;
/**
*
* ringing时弹屏, down时话后
*
* @author jyf
*
*/
@Controller
public class NewStateEventHandler extends AbstractEventHandler {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public String handle(JSONObject jsonObject) {
// 先从json对象转成java对象,方便get
RsmwNewStateEvent event = JSON.toJavaObject(jsonObject, RsmwNewStateEvent.class);
logger.debug(jsonObject.toJSONString());
// 拿分机号,并换算成agentaid
String sipPeerName = "";
sipPeerName = event.getChannel().replace("SIP/", "");
sipPeerName = sipPeerName.split("-")[0];
sipPeerName = sipPeerName.split("/")[0];
if ("RINGING".equals(event.getChannelState())) {
logger.debug("收到了ringing消息: " + event.getChannel() + event.getConnectedLineNumber());
//来电手机号码
String mobileNo = event.getConnectedLineNumber().replaceFirst("^0*", "");
String callerIdNumber = event.getCallerIdNumber();
NewStateWebSocket.unicast(callerIdNumber,mobileNo);
}
return "";
}
}
package com.ctrip.fun.admin.eventhandler;
import java.util.HashMap;
import java.util.Map;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
/**
* userName : 代表分机号
* @author lyhuang
*
*/
@ServerEndpoint("/websocket/{userName}")
public class NewStateWebSocket {
public NewStateWebSocket(){}
private static NewStateWebSocket single = null;
public static NewStateWebSocket getInstance(){
if(single==null){
single = new NewStateWebSocket();
}
return single;
}
private static Map<String, Session> sessionMap=new HashMap<String, Session>();//在线的客户端session集合,只在第一次new的时候初始化。
/**
* 接收信息事件
* @param message 客户端发来的消息
* @param session 当前会话
*/
@OnMessage
public void onMessage(String message,Session session,@PathParam(value="userName")String userName)throws Exception {
try {
// Iterator<String> it = sessionMap.keySet().iterator();
//循环给每个客户端发送信息
// while(it.hasNext()){
// String key = (String) it.next();
// Session value = sessionMap.get(key);
session.getBasicRemote().sendText(message);
// }
} catch (Exception e) {
System.out.println("接收消息事件异常!");
}
}
/**
* 打开连接事件
* @throws Exception
*/
@OnOpen
public void onOpen(Session session,@PathParam(value="userName")String userName) throws Exception {
System.out.println("打开连接成功!");
sessionMap.put(userName, session);
System.out.println("用户"+userName+"进来了。。。");
System.out.println("当前在线人数:"+sessionMap.size());
}
/**
* 关闭连接事件
*/
@OnClose
public void onClose(Session session,@PathParam(value="userName")String userName) {
System.out.println("关闭连接成功!");
System.out.println("用户"+userName+"离开了。。。");
sessionMap.remove(userName);
System.out.println("当前在线人数:"+sessionMap.size());
}
/**
* 错误信息响应事件
* @param session
* @param throwable
*/
@OnError
public void OnError(Session session,Throwable throwable,@PathParam(value="userName")String userName) {
System.out.println("异常:"+throwable.getMessage());
System.out.println("用户"+userName+"的连接出现了错误。。。");
System.out.println("当前在线人数:"+sessionMap.size());
}
public static void unicast(String username, String mobileNo) {
String message = "/system/user/"+mobileNo+"/detailByUid";
Session session = sessionMap.get(username);
System.out.println("unicast--------------------------------------------------"+message);
// NewStateWebSocket socket = NewStateWebSocket.getInstance();
try {
session.getBasicRemote().sendText(message);
// socket.onMessage(message, session, username);
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.ctrip.fun.admin.eventhandler;
import com.alibaba.fastjson.JSONObject;
import com.ctrip.fun.admin.vo.callcenter.AbstractEventHandler;
/**
*
*
* @author jyf
*
*/
public class QueueMemberPauseEventHandler extends AbstractEventHandler {
// private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public String handle(JSONObject jsonObject) {
return"";
}
}
package com.ctrip.fun.admin.eventhandler;
import com.alibaba.fastjson.JSONObject;
import com.ctrip.fun.admin.vo.callcenter.AbstractEventHandler;
/**
*
*
* @author jyf
*
*/
public class SqeEventHandler extends AbstractEventHandler {
// private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public String handle(JSONObject jsonObject) {
return"";
}
}
......@@ -7,8 +7,13 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
......@@ -18,7 +23,13 @@ import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import cc.rssoft.rsmw.sdk.command.bean.Agent;
import cc.rssoft.rsmw.sdk.command.internal.SimpleResponse;
import cc.rssoft.rsmw.sdk.command.response.AgentListAllResponse;
import cc.rssoft.rsmw.sdk.command.response.AgentSipPhoneBindInfoResponse;
import com.ctrip.fun.admin.service.BaseService;
import com.ctrip.fun.admin.service.callcenter.SipPhoneService;
import com.ctrip.fun.common.vo.Request;
import com.ctrip.fun.common.vo.Response;
import com.ctrip.fun.common.vo.ResponseStatusEnum;
......@@ -28,6 +39,9 @@ public final class UserDetailsService extends BaseService implements org.springf
private static Logger logger = LoggerFactory.getLogger(UserDetailsService.class);
private SipPhoneService sipPhoneService;
/**
* @param username
* @return
......@@ -57,8 +71,21 @@ public final class UserDetailsService extends BaseService implements org.springf
dbAuths = new ArrayList<GrantedAuthority>(dbAuthsSet);
}
//将当前用户添加到callcenter中的 Agent
AgentSipPhoneBindInfoResponse aspbiresp = sipPhoneService.getBindInfo(adminUserBean.getUserName(), null);
if("SUCCESS".equals( aspbiresp.getErrMsg()) &&StringUtils.isNotBlank(aspbiresp.getSipPhoneName())){
// adminUserBean.setSipPhone(aspbiresp.getSipPhoneName());
}else{
// Agent agent = new Agent();
// agent.setAgentName(adminUserBean.getUserName());
// agent.setAid(adminUserBean.getUserName());
// agent.setJobNumber((long)adminUserBean.getId());
// List<Agent> agentList = new ArrayList<Agent>();
// agentList.add(agent);
//同步Agent
sipPhoneService.agentSave(adminUserBean.getUserName(),adminUserBean.getUserName(), 0l);
}
return new User(adminUserBean.getUserName(), adminUserBean.getPassword(), adminUserBean.isEnable(), true, true, true, dbAuths);
} else {
logger.error(String.format("[get] status: %d, msg: %s", response.getStatus(), response.getMessage()));
return null;
......@@ -116,4 +143,12 @@ public final class UserDetailsService extends BaseService implements org.springf
return retBean;
}
public SipPhoneService getSipPhoneService() {
return sipPhoneService;
}
public void setSipPhoneService(SipPhoneService sipPhoneService) {
this.sipPhoneService = sipPhoneService;
}
}
package com.ctrip.fun.admin.vo.callcenter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSONObject;
/**
* @author Jiangyifen
*
*/
public abstract class AbstractEventHandler {
protected Logger logger = LoggerFactory.getLogger(this.getClass());
/**
* 处理具体的event
*
* @return
*/
public abstract String handle(JSONObject t);
private Long timestamp = 0L;
public Long getTimestamp() {
return timestamp;
}
public void setTimestamp(Long timestamp) {
this.timestamp = timestamp;
}
}
package com.ctrip.fun.admin.vo.callcenter;
public class BridgeEvent{
private String event = "";
private Boolean bridge = null;
private String channel1 = "";
private String uniqueId1 = "";
private String callerInNumber1 = "";
private String channel2 = "";
private String uniqueId2 = "";
private String callerInNumber2 = "";
public String getEvent() {
return event;
}
public void setEvent(String event) {
this.event = event;
}
public Boolean getBridge() {
return bridge;
}
public void setBridge(Boolean bridge) {
this.bridge = bridge;
}
public String getChannel1() {
return channel1;
}
public void setChannel1(String channel1) {
this.channel1 = channel1;
}
public String getUniqueId1() {
return uniqueId1;
}
public void setUniqueId1(String uniqueId1) {
this.uniqueId1 = uniqueId1;
}
public String getCallerInNumber1() {
return callerInNumber1;
}
public void setCallerInNumber1(String callerInNumber1) {
this.callerInNumber1 = callerInNumber1;
}
public String getChannel2() {
return channel2;
}
public void setChannel2(String channel2) {
this.channel2 = channel2;
}
public String getUniqueId2() {
return uniqueId2;
}
public void setUniqueId2(String uniqueId2) {
this.uniqueId2 = uniqueId2;
}
public String getCallerInNumber2() {
return callerInNumber2;
}
public void setCallerInNumber2(String callerInNumber2) {
this.callerInNumber2 = callerInNumber2;
}
}
package com.ctrip.fun.admin.vo.callcenter;
/**
*
* @author root
*
*/
public class RsmwCdrEvent {
private Long timestamp = null;
private String event = "";
private String serverId = "";
private String callUuid = "";
private String uniqueId = "";
private String callerId = "";
private String src = "";
private String dstContext = "";
private String dst = "";
private String srcChannel = "";
private String dstChannel = "";
private String startTime = "";
private String answerTime = "";
private String endTime = "";
private Long duration = 0L;
private Long billSeconds = 0L;
private String disposition = "";
private String srcAgentAid = "";
private String srcAgentName = "";
private String dstAgentAid = "";
private String dstAgentName = "";
private String srcAccessNumber = "";
private String srcGateway = "";
private String dstAccessNumber = "";
private String dstGateway = "";
private String callDirection = "";
private Boolean answered = null;
private Boolean bridged = null;
private String recordUrl = "";
private String ivrKeyPressed = "";
private String userfield = "";
public String getEvent() {
return event;
}
public void setEvent(String event) {
this.event = event;
}
public String getServerId() {
return serverId;
}
public void setServerId(String serverId) {
this.serverId = serverId;
}
public String getUniqueId() {
return uniqueId;
}
public void setUniqueId(String uniqueId) {
this.uniqueId = uniqueId;
}
public String getCallerId() {
return callerId;
}
public void setCallerId(String callerId) {
this.callerId = callerId;
}
public String getSrc() {
return src;
}
public void setSrc(String src) {
this.src = src;
}
public String getDstContext() {
return dstContext;
}
public void setDstContext(String dstContext) {
this.dstContext = dstContext;
}
public String getDst() {
return dst;
}
public void setDst(String dst) {
this.dst = dst;
}
public String getSrcChannel() {
return srcChannel;
}
public void setSrcChannel(String srcChannel) {
this.srcChannel = srcChannel;
}
public String getDstChannel() {
return dstChannel;
}
public void setDstChannel(String dstChannel) {
this.dstChannel = dstChannel;
}
public String getStartTime() {
return startTime;
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public String getAnswerTime() {
return answerTime;
}
public void setAnswerTime(String answerTime) {
this.answerTime = answerTime;
}
public String getEndTime() {
return endTime;
}
public void setEndTime(String endTime) {
this.endTime = endTime;
}
public Long getDuration() {
return duration;
}
public void setDuration(Long duration) {
this.duration = duration;
}
public Long getBillSeconds() {
return billSeconds;
}
public void setBillSeconds(Long billSeconds) {
this.billSeconds = billSeconds;
}
public String getSrcAgentAid() {
return srcAgentAid;
}
public void setSrcAgentAid(String srcAgentAid) {
this.srcAgentAid = srcAgentAid;
}
public String getSrcAgentName() {
return srcAgentName;
}
public void setSrcAgentName(String srcAgentName) {
this.srcAgentName = srcAgentName;
}
public String getDstAgentAid() {
return dstAgentAid;
}
public void setDstAgentAid(String dstAgentAid) {
this.dstAgentAid = dstAgentAid;
}
public String getDstAgentName() {
return dstAgentName;
}
public void setDstAgentName(String dstAgentName) {
this.dstAgentName = dstAgentName;
}
public String getSrcAccessNumber() {
return srcAccessNumber;
}
public void setSrcAccessNumber(String srcAccessNumber) {
this.srcAccessNumber = srcAccessNumber;
}
public String getSrcGateway() {
return srcGateway;
}
public void setSrcGateway(String srcGateway) {
this.srcGateway = srcGateway;
}
public String getDstAccessNumber() {
return dstAccessNumber;
}
public void setDstAccessNumber(String dstAccessNumber) {
this.dstAccessNumber = dstAccessNumber;
}
public String getDstGateway() {
return dstGateway;
}
public void setDstGateway(String dstGateway) {
this.dstGateway = dstGateway;
}
public String getCallDirection() {
return callDirection;
}
public void setCallDirection(String callDirection) {
this.callDirection = callDirection;
}
public Boolean getAnswered() {
return answered;
}
public void setAnswered(Boolean answered) {
this.answered = answered;
}
public String getRecordUrl() {
return recordUrl;
}
public void setRecordUrl(String recordUrl) {
this.recordUrl = recordUrl;
}
public String getCallUuid() {
return callUuid;
}
public void setCallUuid(String callUuid) {
this.callUuid = callUuid;
}
public String getDisposition() {
return disposition;
}
public void setDisposition(String disposition) {
this.disposition = disposition;
}
public Long getTimestamp() {
return timestamp;
}
public void setTimestamp(Long timestamp) {
this.timestamp = timestamp;
}
public String getIvrKeyPressed() {
return ivrKeyPressed;
}
public void setIvrKeyPressed(String ivrKeyPressed) {
this.ivrKeyPressed = ivrKeyPressed;
}
public String getUserfield() {
return userfield;
}
public void setUserfield(String userfield) {
this.userfield = userfield;
}
public Boolean getBridged() {
return bridged;
}
public void setBridged(Boolean bridged) {
this.bridged = bridged;
}
}
package com.ctrip.fun.admin.vo.callcenter;
public class RsmwChannelRouteEvent{
private String event = "";
private String accessDate = "";
private String uniqueId = "";
private String channel = "";
private String callerIdNumber = "";
private String srcGateway = "";
private String srcAccessNumber = "";
private String dstGateway = "";
private String dstAccessNumber = "";
private String userData = "";
public String getSrcGateway() {
return srcGateway;
}
public void setSrcGateway(String srcGateway) {
this.srcGateway = srcGateway;
}
public String getSrcAccessNumber() {
return srcAccessNumber;
}
public void setSrcAccessNumber(String srcAccessNumber) {
this.srcAccessNumber = srcAccessNumber;
}
public String getDstGateway() {
return dstGateway;
}
public void setDstGateway(String dstGateway) {
this.dstGateway = dstGateway;
}
public String getDstAccessNumber() {
return dstAccessNumber;
}
public void setDstAccessNumber(String dstAccessNumber) {
this.dstAccessNumber = dstAccessNumber;
}
private String exten = "";
private String extenType = "";
private String extenDescription = "";
public String getEvent() {
return event;
}
public void setEvent(String event) {
this.event = event;
}
public String getExten() {
return exten;
}
public void setExten(String exten) {
this.exten = exten;
}
public String getExtenType() {
return extenType;
}
public void setExtenType(String extenType) {
this.extenType = extenType;
}
public String getExtenDescription() {
return extenDescription;
}
public void setExtenDescription(String extenDescription) {
this.extenDescription = extenDescription;
}
public String getCallerIdNumber() {
return callerIdNumber;
}
public void setCallerIdNumber(String callerIdNumber) {
this.callerIdNumber = callerIdNumber;
}
public String getUniqueId() {
return uniqueId;
}
public void setUniqueId(String uniqueId) {
this.uniqueId = uniqueId;
}
public String getChannel() {
return channel;
}
public void setChannel(String channel) {
this.channel = channel;
}
public String getAccessDate() {
return accessDate;
}
public void setAccessDate(String accessDate) {
this.accessDate = accessDate;
}
public String getUserData() {
return userData;
}
public void setUserData(String userData) {
this.userData = userData;
}
}
package com.ctrip.fun.admin.vo.callcenter;
public class RsmwNewStateEvent{
private String event = "";
private String uniqueId = "";
private String channel = "";
private String channelState = "";
private Integer cause = null;
private String causeDesc = "";
private String callerIdName = "";
private String callerIdNumber = "";
private String connectedLineName = "";
private String connectedLineNumber = "";
// private String callUuid = "";
public String getUniqueId() {
return uniqueId;
}
public void setUniqueId(String uniqueId) {
this.uniqueId = uniqueId;
}
public String getChannel() {
return channel;
}
public void setChannel(String channel) {
this.channel = channel;
}
public String getChannelState() {
return channelState;
}
public void setChannelState(String channelState) {
this.channelState = channelState;
}
public Integer getCause() {
return cause;
}
public void setCause(Integer cause) {
this.cause = cause;
}
public String getCauseDesc() {
return causeDesc;
}
public void setCauseDesc(String causeDesc) {
this.causeDesc = causeDesc;
}
public String getCallerIdName() {
return callerIdName;
}
public void setCallerIdName(String callerIdName) {
this.callerIdName = callerIdName;
}
public String getCallerIdNumber() {
return callerIdNumber;
}
public void setCallerIdNumber(String callerIdNumber) {
this.callerIdNumber = callerIdNumber;
}
public String getConnectedLineName() {
return connectedLineName;
}
public void setConnectedLineName(String connectedLineName) {
this.connectedLineName = connectedLineName;
}
public String getConnectedLineNumber() {
return connectedLineNumber;
}
public void setConnectedLineNumber(String connectedLineNumber) {
this.connectedLineNumber = connectedLineNumber;
}
public String getEvent() {
return event;
}
public void setEvent(String event) {
this.event = event;
}
// public String getCallUuid() {
// return callUuid;
// }
// public void setCallUuid(String callUuid) {
// this.callUuid = callUuid;
// }
}
......@@ -16,6 +16,7 @@
<sec:http pattern="/adminUser/*" security="none" />
<sec:http pattern="/favicon.ico" security="none" />
<sec:http pattern="/cc/*" security="none" />
<sec:http access-decision-manager-ref="" auto-config="true" access-denied-page="/you-will-not-want-to-be-here">
<sec:intercept-url pattern="/order/orderList/list_refund" access="ROLE_CTRIP_PAY,ROLE_OP,ROLE_DEV,ROLE_PROD,ROLE_RISK,ROLE_ASSIST" />
......@@ -35,7 +36,7 @@
<sec:intercept-url pattern="/j/**" access="ROLE_MARKET,ROLE_DEV,ROLE_PROD,ROLE_OP,ROLE_FINANCE,ROLE_PROMOTION,ROLE_ASSIST" />
<sec:intercept-url pattern="/system/**" access="ROLE_FINANCE,ROLE_DEV,ROLE_PROMOTION,ROLE_ASSIST" />
<sec:intercept-url pattern="/error" access="ROLE_MARKET,ROLE_DEV,ROLE_PROD,ROLE_OP,ROLE_FINANCE,ROLE_PROMOTION,ROLE_ASSIST" />
<sec:intercept-url pattern="/cc/**" access="ROLE_MARKET,ROLE_DEV,ROLE_PROD,ROLE_OP,ROLE_FINANCE,ROLE_PROMOTION,ROLE_ASSIST" />
<!-- <sec:intercept-url pattern="/cc/**" access="ROLE_MARKET,ROLE_DEV,ROLE_PROD,ROLE_OP,ROLE_FINANCE,ROLE_PROMOTION,ROLE_ASSIST" /> -->
<sec:intercept-url pattern="/extralresource/**" access="ROLE_AWTCZ,ROLE_DEV" />
<sec:intercept-url pattern="/tourAreaInfo/**" access="ROLE_AWTCZ,ROLE_DEV" />
<sec:intercept-url pattern="/tour/**" access="ROLE_AWTCZ,ROLE_DEV" />
......@@ -74,10 +75,13 @@
<property name="userDetailsService" ref="userDetailsService"></property>
</bean>
<bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" />
<bean id="sipPhoneService" class="com.ctrip.fun.admin.service.callcenter.SipPhoneService" />
<!-- 通过rest访问远程服务得到用户信息 -->
<bean id="userDetailsService" class="com.ctrip.fun.admin.service.system.UserDetailsService" parent="baseService">
<property name="sipPhoneService" ref="sipPhoneService"></property>
</bean>
<bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
......
......@@ -223,6 +223,9 @@
<!-- 站内信 -->
<bean name="insideSmsService" class="com.ctrip.fun.admin.service.tools.InsideSmsService"
parent="baseService" />
<!-- 站内信 -->
<bean name="sipPhoneService" class="com.ctrip.fun.admin.service.callcenter.SipPhoneService"
parent="baseService" />
<!-- 现金券 -->
<bean name="voucherRuleService" class="com.ctrip.fun.admin.service.basic.VoucherRuleService"
......
......@@ -34,6 +34,17 @@ function feedbackStatusCheck(){
}
return true;
}
//拨打电话
function callTitle(phone){
$.post("/callcenter/sipPhone/originateOne",{"dst":phone},function(data){
if(data.errCode==0){
alert("正在为您拨号...");
}
});
}
</script>
</#assign>
......@@ -103,7 +114,8 @@ function feedbackStatusCheck(){
<label class="control-label" for="titel">用户电话</label>
<div class="controls">
<input type="text" id="titel" name="titel" value="${dto.phone!}" placeholder="用户电话" class="input-medium" required="" readonly="true" style="width:200px">
&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight:bold;color:red">(右击号码,点击"拨打")</span>&nbsp;&nbsp;&nbsp;&nbsp;
<!-- &nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight:bold;color:red">(右击号码,点击"拨打")</span>&nbsp;&nbsp;&nbsp;&nbsp; -->
<button class="btn btn-default" onclick="callTitle('${dto.phone!}');" title="我们将会先拨通您的座机号码,再拨通对方的号码">拨打</button>
<span class="help-inline">已拨打<span style="color:red;">${dto.taskMyPhonedAmount!}</span>位</span>
</div>
</div>
......
<div class="navbar">
<input type="hidden" name="loginUsername" id="loginUsername" value='${Session["SPRING_SECURITY_CONTEXT"].authentication.name}' />
<div class="navbar-inner">
<a class="logo" href="/golf/course/list">主题游管理</a>
<ul class="nav">
......@@ -20,8 +23,44 @@
</ul>
<ul class="nav pull-right">
<li class="dropdown">
<!--
<button class="btn btn-default btn-danger" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
已绑座机:888888
<span class="caret"></span>
</button>
<ul class="dropdown-menu" aria-labelledby="dropdownMenu1">
<li><a href="#">重新绑定</a></li>
<li><a href="#">解绑</a></li>
</ul>
<a href="#" data-toggle="modal" data-target="#bindModal">绑定座机</a>
-->
</li>
<li class="board_logo" id="J_board_logo"><a class="clear" href="/notification/inventory" ><span class="left">${Session["SPRING_SECURITY_CONTEXT"].authentication.name}</span></a></li>
<li><a href="/j_spring_security_logout">注销</a></li>
</ul>
</div>
</div>
\ No newline at end of file
</div>
<div class="modal fade" tabindex="-1" id="bindModal" role="dialog" aria-labelledby="bindModalLabel">
<div class="modal-dialog " role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="myModalLabel">绑定座机</h4>
</div>
<div class="modal-body">
<div class="input-group">
<input type="text" class="form-control" placeholder="请输入座机号码" id="sipPhoneName" aria-describedby="basic-addon1">
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" onclick="bindSipPhone();">绑定</button>
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
</div>
</div>
</div>
</div>
var webSocket = null;
function connectSocket(sipPhoneName){
var url = "ws://"+window.location.host+"/websocket/";
url +=sipPhoneName;
if(webSocket==null){
webSocket=new WebSocket(url);
}
webSocket.onerror = function(event) {
};
webSocket.onopen = function(event) {
};
webSocket.onmessage = function(event) {
window.open(event.data, "用户来电通知");
};
webSocket.onclose = function(event){
};
}
//关闭Socket
function closeSocket(){
webSocket.close();
}
function sendMessage(msg) {
// webSocket.send(msg);
}
$(document).ready(function(data){
//查询绑定关系
var loginUsername = $("#loginUsername").val();
var sipPhoneName = "";
$.get("/callcenter/sipPhone/getBindInfo?agentAid="+loginUsername,{},function(data){
var vhtml ="";
sipPhoneName = data.sipPhoneName;
if(data.errCode==0 && data.sipPhoneName!=0){
vhtml = '<button class="btn btn-default btn-danger" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">';
vhtml += '已绑座机: '+sipPhoneName;
vhtml += '<span class="caret"></span></button>';
vhtml += '<ul class="dropdown-menu" aria-labelledby="dropdownMenu1">';
vhtml += '<li><a href="#" data-toggle="modal" data-target="#bindModal">重新绑定</a></li>';
vhtml += '<li><a href="#" onclick="unbindSipPhone();">解绑</a></li>';
vhtml += '</ul>';
vhtml += '';
}else{
vhtml = '<a href="#" data-toggle="modal" data-target="#bindModal">绑定座机</a>';
}
$(".navbar .pull-right .dropdown").html(vhtml);
connectSocket(sipPhoneName);
});
});
$('#bindModal').on('show.bs.modal', function (e) {
$("#sipPhoneName").val("");
})
function refund(){
//如果此订单不是信用卡担保支付方式,并且实付金额为0,点击退单按钮视为直接取消订单!
if($("#payMode").attr("value")!="信用卡担保"&&$("#actualAmount").attr("value")==0
......@@ -428,4 +489,34 @@
});
$(".input-file input[type='file']").change(function(){
$(this).prev(".file-show").html($(this).val());
});
\ No newline at end of file
});
/**
*
*/
function bindSipPhone(){
var sipPhoneName = $("#sipPhoneName").val();
$.post("/callcenter/sipPhone/bind",{"sipPhoneName":sipPhoneName},function(data){
if(data.errCode==0){
window.location.reload(true);
alert("绑定成功");
}
});
}
/**
*
*/
function unbindSipPhone(){
var loginUsername = $("#loginUsername").val();
$.post("/callcenter/sipPhone/unBind",{"agentAid":loginUsername},function(data){
if(data.errCode==0){
window.location.reload(true);
alert("解绑成功");
}
});
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment