Commit 707515cc by unknown

merge f663

parents f7b6d8e7 67d1acfc
Showing with 2064 additions and 9 deletions
...@@ -23,6 +23,18 @@ ...@@ -23,6 +23,18 @@
<artifactId>qiniu-java-sdk</artifactId> <artifactId>qiniu-java-sdk</artifactId>
<version>7.0.0</version> <version>7.0.0</version>
</dependency> --> </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> <dependency>
<groupId>com.squareup.okhttp</groupId> <groupId>com.squareup.okhttp</groupId>
<artifactId>okhttp</artifactId> <artifactId>okhttp</artifactId>
......
package com.ctrip.fun.admin.controller.callcenter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
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 cc.rssoft.rsmw.sdk.command.bean.Agent;
import cc.rssoft.rsmw.sdk.command.bean.Gateway;
import cc.rssoft.rsmw.sdk.command.bean.GatewayStatus;
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 cc.rssoft.rsmw.sdk.command.response.GetCdrByCallUuidResponse;
import cc.rssoft.rsmw.sdk.command.response.GetChannelCountResponse;
import cc.rssoft.rsmw.sdk.command.response.GetChannelResponse;
import cc.rssoft.rsmw.sdk.command.response.GetGatewayStatusResponse;
import cc.rssoft.rsmw.sdk.command.response.GetMobileInfoResponse;
import cc.rssoft.rsmw.sdk.command.response.GetQueueStatusResponse;
import cc.rssoft.rsmw.sdk.command.response.GetSipPhoneStatusResponse;
import cc.rssoft.rsmw.sdk.command.response.IsExtenResponse;
import cc.rssoft.rsmw.sdk.command.response.OriginateResponse;
import cc.rssoft.rsmw.sdk.command.response.QueueMemberPauseResponse;
import com.ctrip.fun.admin.service.callcenter.SipPhoneService;
import com.ctrip.fun.common.vo.Response;
@Controller
@RequestMapping(value = "/callcenter/sipPhone")
public class SipPhoneControl {
@Autowired
private SipPhoneService sipPhoneService;
/*@RequestMapping(value = "/redirect", method = RequestMethod.POST)
@ResponseBody
public SimpleResponse redirect(HttpServletRequest request){
String channel = request.getParameter("channel");
String context = request.getParameter("context");
String exten = request.getParameter("exten");
return sipPhoneService.redirect(channel,context, exten);
}
*/
@RequestMapping(value = "/agentSave", method = RequestMethod.POST)
@ResponseBody
public SimpleResponse agentSave(HttpServletRequest request){
String agentAid = request.getParameter("agentAid");
String agentName = request.getParameter("agentName");
Long agentJobNumber = Long.parseLong (request.getParameter("agentJobNumber"));
return sipPhoneService.agentSave(agentAid,agentName, agentJobNumber);
}
@RequestMapping(value = "/agentDelete", method = RequestMethod.POST)
@ResponseBody
public SimpleResponse agentDelete(HttpServletRequest request){
String[] agentAidArray = request.getParameter("agentAidList").split(",");
List<String> agentAidList = new ArrayList<String>();
for(String aid : agentAidArray){
agentAidList.add(aid);
}
return sipPhoneService.agentDelete(agentAidList);
}
/**
* 同步Agent
* @param agentList
* @return
*/
@RequestMapping(value = "/agentSync", method = RequestMethod.POST)
@ResponseBody
public AgentListAllResponse agentSync(List<Agent> agentList){
return sipPhoneService.agentListAll();
}
/**
* @param request
* @param form
* @param model
* @return
*/
@RequestMapping(value = "/agentListAll", method = RequestMethod.GET)
@ResponseBody
public AgentListAllResponse agentListAll() {
return sipPhoneService.agentListAll();
}
/**
* @param request
* @param form
* @param model
* @return
*/
@RequestMapping(value = "/bind", method = RequestMethod.POST)
@ResponseBody
public SimpleResponse bind(HttpServletRequest request) {
String agentAid = request.getAttribute("userName").toString();
String sipPhoneName = request.getParameter("sipPhoneName");
return sipPhoneService.bind(agentAid, sipPhoneName);
}
/**
* if agentAid = null then unbind by sipPhoneName,
* else sipPhoneName = null then unbind by agentAid
* @param request
* @param form
* @param model
* @return
*/
@RequestMapping(value = "/unBind", method = RequestMethod.POST)
@ResponseBody
public SimpleResponse unBind(HttpServletRequest request) {
String agentAid = request.getParameter("agentAid");
String sipPhoneName = request.getParameter("sipPhoneName");
return sipPhoneService.unBind(agentAid, sipPhoneName);
}
/**
* if sipPhoneName = null 【绑定关系查询】 查询座席绑定的分机
* if agentAid = null 【绑定关系查询】查询分机绑定的座席
* @param agentAid
* @param sipPhoneName
* @return
*/
@RequestMapping(value = "/getBindInfo", method = RequestMethod.GET)
@ResponseBody
public AgentSipPhoneBindInfoResponse getBindInfo(HttpServletRequest request){
String agentAid = request.getParameter("agentAid");
String sipPhoneName = request.getParameter("sipPhoneName");
return sipPhoneService.getBindInfo(agentAid, sipPhoneName);
}
/**
* 【置忙】
* @param sipPhoneName
* @param reason
* @return
*/
@RequestMapping(value = "/queueMemberPause", method = RequestMethod.POST)
@ResponseBody
public QueueMemberPauseResponse queueMemberPause(HttpServletRequest request){
String queueMemberInterface = request.getParameter("queueMemberInterface");
String reason = request.getParameter("reason");
return sipPhoneService.queueMemberPause(queueMemberInterface, reason);
}
/**
* 置闲
* @param sipPhoneName
* @return
*/
@RequestMapping(value = "/queueMemberUnPause", method = RequestMethod.POST)
@ResponseBody
public QueueMemberPauseResponse queueMemberUnPause(String queueMemberInterface){
return sipPhoneService.queueMemberUnPause(queueMemberInterface);
}
/**
* 【实时并发数查询】
* @return
*/
@RequestMapping(value = "/getChannelCount", method = RequestMethod.POST)
@ResponseBody
public GetChannelCountResponse getChannelCount(){
return sipPhoneService.getChannelCount();
}
/**
* 【发起呼叫】
* @param absoluteTimeout
* @param src
* @param srcGateway
* @param srcAccessNumber
* @param srcCallerIdName
* @param srcCallerIdNumber
* @param srcAnnounceMediaUrl
* @param dst
* @param dstGateway
* @param dstAccessNumber
* @param dstAnnounceMediaUrl
* @param userData
* @return
*/
@RequestMapping(value = "/originateFull", method = RequestMethod.POST)
@ResponseBody
public OriginateResponse originateFull(Integer absoluteTimeout, String src, String srcGateway, String srcAccessNumber,
String srcCallerIdName, String srcCallerIdNumber, String srcAnnounceMediaUrl, String dst, String dstGateway,
String dstAccessNumber, String dstAnnounceMediaUrl, String userData){
return sipPhoneService.originate(absoluteTimeout, src, srcGateway, srcAccessNumber, srcCallerIdName, srcCallerIdNumber, srcAnnounceMediaUrl,
dst, dstGateway, dstAccessNumber, dstAnnounceMediaUrl, userData);
}
/**
* 从内部分机发起呼叫 , 可用呼叫内部分机或者手机号码
* @param dst
* @return
*/
@RequestMapping(value = "/originateOne", method = RequestMethod.POST)
@ResponseBody
public OriginateResponse originateOne(@RequestParam("dst") String dst){
UserDetails user = (UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
String userName = user.getUsername();
String dstGateway = null;
String dstAccessNumber = null;
String srcGateway = null;
String srcAccessNumber = null;
//获得绑定的分机号码 分机A
AgentSipPhoneBindInfoResponse bindInfo = sipPhoneService.getBindInfo(userName, null);
String src = bindInfo.getSipPhoneName();
//判断dst是否是内部exten
IsExtenResponse isres = sipPhoneService.isExten(dst);
if(!isres.getIsExten()){ //不是内部分机号码
//获得全部网关信息
GetGatewayStatusResponse gateways = sipPhoneService.getGatewayStatus();
if("0".equals( gateways.getErrCode())){
Map<String, GatewayStatus> map = gateways.getResult();
for(String key : map.keySet()){
GatewayStatus gateWayStatus = map.get(key);
if("Registered".equals( gateWayStatus.getRegistyStatus().getStatus())){
//如果有多个可用网关,可用优先使用匹配网关,最后使用默认网关(该功能暂定)
dstGateway = gateWayStatus.getGatewayName();
Gateway gateway = gateWayStatus.getGateway();
if(gateway!=null){
dstAccessNumber = gateway.getRegUsername();
}
}
}
}
}
OriginateResponse originateResponse = sipPhoneService.originate(null, src, dstGateway, dstAccessNumber, null, null, null,dst, dstGateway, dstAccessNumber, null, null);
return originateResponse;
}
/**
* 【获取指定SipPhone的当前Channel】
* @param sipPhoneName
* @return
*/
@RequestMapping(value = "/getChannel", method = RequestMethod.GET)
@ResponseBody
public GetChannelResponse getChannel(String sipPhoneName){
return sipPhoneService.getChannel(sipPhoneName);
}
/**
* 呼叫保持
* @param sipPhoneName
* @return
*/
@RequestMapping(value = "/hold", method = RequestMethod.POST)
@ResponseBody
public SimpleResponse hold(String sipPhoneName){
return sipPhoneService.hold(sipPhoneName);
}
/**
* 呼叫恢复
* @param sipPhoneName
* @return
*/
@RequestMapping(value = "/unhold", method = RequestMethod.POST)
@ResponseBody
public SimpleResponse unhold(String sipPhoneName){
return sipPhoneService.unhold(sipPhoneName);
}
/**
* 【桥接channel】
* @param channel1
* @param channel2
* @return
*/
@RequestMapping(value = "/bridge", method = RequestMethod.POST)
@ResponseBody
public SimpleResponse bridge(String channel1, String channel2){
return sipPhoneService.bridge(channel1,channel2);
}
/**
* 【转接Channel】
* @param channel
* @param context
* @param exten
* @param extraContext
* @param extraChannel
* @param extraExten
* @return
*/
@RequestMapping(value = "/redirect", method = RequestMethod.POST)
@ResponseBody
public SimpleResponse redirect(String channel, String context, String exten, String extraContext, String extraChannel, String extraExten){
return sipPhoneService.redirect(channel, context, exten, extraContext, extraChannel, extraExten);
}
/**
* 【挂断Channel】
* @param channel
* @return
*/
@RequestMapping(value = "/hangup", method = RequestMethod.POST)
@ResponseBody
public SimpleResponse hangup(String channel){
return sipPhoneService.hangup(channel);
}
/**
* 【获取所有SipPhone状态】
* @return
*/
@RequestMapping(value = "/getSipPhoneStatus", method = RequestMethod.GET)
@ResponseBody
public GetSipPhoneStatusResponse getSipPhoneStatus(){
return sipPhoneService.getSipPhoneStatus();
}
/**
* 【获取所有Gateway状态】
* @return
*/
@RequestMapping(value = "/getGatewayStatus", method = RequestMethod.GET)
@ResponseBody
public GetGatewayStatusResponse getGatewayStatus(){
return sipPhoneService.getGatewayStatus();
}
/**
* 【查询归属地】
* @return
*/
@RequestMapping(value = "/getMobileInfo", method = RequestMethod.GET)
@ResponseBody
public GetMobileInfoResponse getMobileInfo(String mobilePhoneNumber){
return sipPhoneService.getMobileInfo(mobilePhoneNumber);
}
/**
* 【查询cdr】
* @param uuid
* @return
*/
@RequestMapping(value = "/getCdrByCallUuid", method = RequestMethod.GET)
@ResponseBody
public GetCdrByCallUuidResponse getCdrByCallUuid(String uuid){
return sipPhoneService.getCdrByCallUuid(uuid);
}
/**
* 服务质量评价 service quality assessment
* @param sqeSipPhoneName
* @param sqeQuestion
* @param sqeThankyou
* @return
*/
@RequestMapping(value = "/servicAssessment", method = RequestMethod.POST)
@ResponseBody
public SimpleResponse sqe(String sqeSipPhoneName, String sqeQuestion, String sqeThankyou){
return sipPhoneService.sqe(sqeSipPhoneName, sqeQuestion, sqeThankyou);
}
/**
* 【判断某个号码是否内部exte】
* @param exten
* @return
*/
@RequestMapping(value = "/isExten", method = RequestMethod.POST)
@ResponseBody
public IsExtenResponse isExten(String exten){
return sipPhoneService.isExten(exten);
}
@RequestMapping(value = "/getQueueStatus", method = RequestMethod.POST)
@ResponseBody
public GetQueueStatusResponse getQueueStatus(){
return sipPhoneService.getQueueStatus();
}
}
...@@ -2,8 +2,11 @@ package com.ctrip.fun.admin.controller.tools; ...@@ -2,8 +2,11 @@ package com.ctrip.fun.admin.controller.tools;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
...@@ -17,17 +20,28 @@ import org.springframework.ui.ModelMap; ...@@ -17,17 +20,28 @@ import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult; import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError; import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ModelAttribute; 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.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus; 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.exception.CommonException;
import com.ctrip.fun.admin.form.tools.UserRegisterForm; 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.system.UserService;
import com.ctrip.fun.admin.service.tools.CallCenterService; import com.ctrip.fun.admin.service.tools.CallCenterService;
import com.ctrip.fun.admin.utility.Util; 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.PagedResponseBean;
import com.ctrip.fun.common.vo.basic.UserExtQuery; import com.ctrip.fun.common.vo.basic.UserExtQuery;
import com.ctrip.fun.common.vo.user.RegisterBean; import com.ctrip.fun.common.vo.user.RegisterBean;
...@@ -44,6 +58,19 @@ public class CallCenterController { ...@@ -44,6 +58,19 @@ public class CallCenterController {
private static final Logger logger = LoggerFactory.getLogger(CallCenterController.class); 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 @Autowired
private CallCenterService ccService; private CallCenterService ccService;
...@@ -77,6 +104,49 @@ public class CallCenterController { ...@@ -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) @RequestMapping(value = "/userRegister", method = RequestMethod.POST)
public String userRegister(HttpServletRequest request, @ModelAttribute("form") UserRegisterForm form, BindingResult binding, ModelMap model) { public String userRegister(HttpServletRequest request, @ModelAttribute("form") UserRegisterForm form, BindingResult binding, ModelMap model) {
String uid = null; String uid = null;
...@@ -169,7 +239,7 @@ public class CallCenterController { ...@@ -169,7 +239,7 @@ public class CallCenterController {
PagedResponseBean<UserExtBean> response = userService.list("", query); PagedResponseBean<UserExtBean> response = userService.list("", query);
Collection<UserExtBean> users = response.getResult(); Collection<UserExtBean> users = response.getResult();
if (CollectionUtils.isNotEmpty(users)) { if (CollectionUtils.isNotEmpty(users)) {
List<UserExtBean> list = (List) users; List<UserExtBean> list = (List<UserExtBean>) users;
UserExtBean user = list.get(0); UserExtBean user = list.get(0);
uid = user.getUid(); uid = user.getUid();
} else { } 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"";
}
}
package com.ctrip.fun.admin.service.callcenter;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.ctrip.fun.admin.service.BaseService;
import cc.rssoft.rsmw.sdk.RsmwServer;
import cc.rssoft.rsmw.sdk.command.bean.Agent;
import cc.rssoft.rsmw.sdk.command.bean.GatewayStatus;
import cc.rssoft.rsmw.sdk.command.bean.SipPhoneStatus;
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 cc.rssoft.rsmw.sdk.command.response.GetCdrByCallUuidResponse;
import cc.rssoft.rsmw.sdk.command.response.GetChannelCountResponse;
import cc.rssoft.rsmw.sdk.command.response.GetChannelResponse;
import cc.rssoft.rsmw.sdk.command.response.GetGatewayStatusResponse;
import cc.rssoft.rsmw.sdk.command.response.GetMobileInfoResponse;
import cc.rssoft.rsmw.sdk.command.response.GetQueueStatusResponse;
import cc.rssoft.rsmw.sdk.command.response.GetSipPhoneStatusResponse;
import cc.rssoft.rsmw.sdk.command.response.IsExtenResponse;
import cc.rssoft.rsmw.sdk.command.response.OriginateResponse;
import cc.rssoft.rsmw.sdk.command.response.QueueMemberPauseResponse;
public class SipPhoneService extends BaseService {
/**
* 注意!!!!!!!!
*
* rsmwUrl 格式请参考 RSMW 2 API 文档
*/
// private static String rsmwUrl = "http://112.65.124.86:18080/rsmw/api/2.0/";
private static String rsmwUrl = "http://192.168.10.7:18080/rsmw/api/2.0/";
/**
* 注意!!!!!!!!
*
* apiSecret在rsmw系统的API界面中配置。
* 即:启用apiSecret后的apiSecret
*/
private static String apiSecret = "pA55w0rd";
private static int connectTimeout = 2000;
private static int readTimeout = 2000;
private static RsmwServer rsmwServer = new RsmwServer(rsmwUrl,apiSecret,connectTimeout,readTimeout);
public SimpleResponse redirect(String channel, String context, String exten){
return rsmwServer.redirect(channel,context, exten);
}
/**
* 新增Agent
* @param agentAid
* @param agentName
* @param agentJobNumber
* @return
*/
public SimpleResponse agentSave(String agentAid, String agentName, Long agentJobNumber){
return rsmwServer.agentSave(agentAid, agentName, agentJobNumber);
}
/**
* 删除Agent
* @param agentAidList 代理Aid列表
* @return
*/
public SimpleResponse agentDelete(List<String> agentAidList){
return rsmwServer.agentDelete(agentAidList);
}
/**
* 同步Agent
* @param agentList
* @return
*/
public SimpleResponse agentSync(List<Agent> agentList){
return rsmwServer.agentSync(agentList);
}
/**
* 获取所有Agent
* @return
*/
public AgentListAllResponse agentListAll(){
return rsmwServer.agentListAll();
}
/**
* 绑定
* @param agentAid
* @param sipPhoneName
* @return
*/
public SimpleResponse bind(String agentAid, String sipPhoneName){
return rsmwServer.bind(agentAid, sipPhoneName);
}
/**
* if agentAid = null then unbind by sipPhoneName,
* else sipPhoneName = null then unbind by agentAid
* @param agentAid
* @param sipPhoneName
* @return
*/
public SimpleResponse unBind(String agentAid, String sipPhoneName){
return rsmwServer.unBind(agentAid, sipPhoneName);
}
/**
* if sipPhoneName = null 【绑定关系查询】 查询座席绑定的分机
* if agentAid = null 【绑定关系查询】查询分机绑定的座席
* @param agentAid
* @param sipPhoneName
* @return
*/
public AgentSipPhoneBindInfoResponse getBindInfo(String agentAid, String sipPhoneName){
return rsmwServer.getBindInfo(agentAid, sipPhoneName);
}
/**
* 【置忙】
* @param sipPhoneName
* @param reason
* @return
*/
public QueueMemberPauseResponse queueMemberPause(String queueMemberInterface, String reason){
return rsmwServer.queueMemberPause(queueMemberInterface, reason);
}
/**
* 置闲
* @param sipPhoneName
* @return
*/
public QueueMemberPauseResponse queueMemberUnPause(String queueMemberInterface){
return rsmwServer.queueMemberUnPause(queueMemberInterface);
}
/**
* 【实时并发数查询】
* @return
*/
public GetChannelCountResponse getChannelCount(){
return rsmwServer.getChannelCount();
}
/**
* 【发起呼叫】
* @param absoluteTimeout
* @param src
* @param srcGateway
* @param srcAccessNumber
* @param srcCallerIdName
* @param srcCallerIdNumber
* @param srcAnnounceMediaUrl
* @param dst
* @param dstGateway
* @param dstAccessNumber
* @param dstAnnounceMediaUrl
* @param userData
* @return
*/
public OriginateResponse originate(Integer absoluteTimeout, String src, String srcGateway, String srcAccessNumber,
String srcCallerIdName, String srcCallerIdNumber, String srcAnnounceMediaUrl, String dst, String dstGateway,
String dstAccessNumber, String dstAnnounceMediaUrl, String userData){
return rsmwServer.originate(absoluteTimeout, src, srcGateway, srcAccessNumber, srcCallerIdName, srcCallerIdNumber, srcAnnounceMediaUrl,
dst, dstGateway, dstAccessNumber, dstAnnounceMediaUrl, userData);
}
/**
* 【获取指定SipPhone的当前Channel】
* @param sipPhoneName
* @return
*/
public GetChannelResponse getChannel(String sipPhoneName){
return rsmwServer.getChannel(sipPhoneName);
}
/**
* 呼叫保持
* @param sipPhoneName
* @return
*/
public SimpleResponse hold(String sipPhoneName){
return rsmwServer.hold(sipPhoneName);
}
/**
* 呼叫恢复
* @param sipPhoneName
* @return
*/
public SimpleResponse unhold(String sipPhoneName){
return rsmwServer.unhold(sipPhoneName);
}
/**
* 【桥接channel】
* @param channel1
* @param channel2
* @return
*/
public SimpleResponse bridge(String channel1, String channel2){
return rsmwServer.bridge(channel1,channel2);
}
/**
* 【转接Channel】
* @param channel
* @param context
* @param exten
* @param extraContext
* @param extraChannel
* @param extraExten
* @return
*/
public SimpleResponse redirect(String channel, String context, String exten, String extraContext, String extraChannel, String extraExten){
return rsmwServer.redirect(channel, context, exten, extraContext, extraChannel, extraExten);
}
/**
* 【挂断Channel】
* @param channel
* @return
*/
public SimpleResponse hangup(String channel){
return rsmwServer.hangup(channel);
}
/**
* 【获取所有SipPhone状态】
* @return
*/
public GetSipPhoneStatusResponse getSipPhoneStatus(){
return rsmwServer.getSipPhoneStatus();
}
/**
* 获取某个SipPhone状态
* @return
*/
public SipPhoneStatus getSipPhoneStatusBySipPhone(String sipPhone){
GetSipPhoneStatusResponse sipPhones = rsmwServer.getSipPhoneStatus();
if("0".equals(sipPhones.getErrCode())){
Map<String, SipPhoneStatus> map = sipPhones.getResult();
for(String key : map.keySet()){
if(sipPhone.equals(key)){
return map.get(key);
}
}
}
return null;
}
/**
* 【获取所有Gateway状态】
* @return
*/
public GetGatewayStatusResponse getGatewayStatus(){
return rsmwServer.getGatewayStatus();
}
/**
* 【获取Gateway状态】 根据gatewayName 查找gateway 状态
* @return
*/
public GatewayStatus getGatewayStatusByGatewayName(String gatewayName){
GetGatewayStatusResponse gateways = rsmwServer.getGatewayStatus();
if("0".equals( gateways.getErrCode())){
Map<String, GatewayStatus> map = gateways.getResult();
for(String key : map.keySet()){
if(key.equals(gatewayName)){
return map.get(key);
}
}
}
return null;
}
/**
* 【查询归属地】
* @return
*/
public GetMobileInfoResponse getMobileInfo(String mobilePhoneNumber){
return rsmwServer.getMobileInfo(mobilePhoneNumber);
}
/**
* 【查询cdr】
* @param uuid
* @return
*/
public GetCdrByCallUuidResponse getCdrByCallUuid(String uuid){
return rsmwServer.getCdrByCallUuid(uuid);
}
/**
* 服务质量评价
* @param sqeSipPhoneName
* @param sqeQuestion
* @param sqeThankyou
* @return
*/
public SimpleResponse sqe(String sqeSipPhoneName, String sqeQuestion, String sqeThankyou){
return rsmwServer.sqe(sqeSipPhoneName, sqeQuestion, sqeThankyou);
}
/**
* 【判断某个号码是否内部exte】
* @param exten
* @return
*/
public IsExtenResponse isExten(String exten){
return rsmwServer.isExten(exten);
}
public GetQueueStatusResponse getQueueStatus(){
return rsmwServer.getQueueStatus();
}
public static void main(String[] args) {
// SimpleResponse redirectResponse = rsmwServer.redirect("SIP/8001-XXXXXXXX","_moh", "13391026171");
GetQueueStatusResponse redirectResponse1 = rsmwServer.getQueueStatus();
System.out.println(redirectResponse1.toJsonString());
}
/*public static void main(String[] args){
SipPhoneControl control = new SipPhoneControl();
System.out.println( control.getGatewayStatus().toJsonString());
}*/
public static void main1(String[] args) {
//这里调用了所有的接口方法,您在测试某个接口时,请先注释掉其他的调用,以免影响您查看测试结果
// 5.1 【新增Agent】
SimpleResponse agentSaveResponse = rsmwServer.agentSave("9999", "测试座席9", 9999L);
System.out.println(agentSaveResponse.toJsonString());
// 5.1 【删除Agent】
List<String> agentAidList = new ArrayList<>();
agentAidList.add("1055");
agentAidList.add("1054");
agentAidList.add("1053");
agentAidList.add("1052");
agentAidList.add("1051");
agentAidList.add("1050");
SimpleResponse agentDeleteResponse = rsmwServer.agentDelete(agentAidList);
System.out.println(agentDeleteResponse.toJsonString());
// 5.1 【同步Agent】
List<Agent> agentList = new ArrayList<>();
Agent a1 = new Agent();
a1.setAgentName("张三");
a1.setAid("1001");
a1.setJobNumber(1001L);
Agent a2 = new Agent();
a2.setAgentName("李四");
a2.setAid("1002");
a2.setJobNumber(1002L);
agentList.add(a1);
agentList.add(a2);
SimpleResponse agentSyncResponse = rsmwServer.agentSync(agentList);
System.out.println(agentSyncResponse.toJsonString());
// 5.1 【获取所有Agent】
AgentListAllResponse agentListAllResponse = rsmwServer.agentListAll();
System.out.println(agentListAllResponse.toJsonString());
// 5.2 【绑定】
SimpleResponse agentSipPhoneBindResponse = rsmwServer.bind("9999", "8001");
System.out.println(agentSipPhoneBindResponse.toJsonString());
// 5.2 【解绑】 根据座席解绑分机
SimpleResponse agentSipPhoneUnBindResponse1 = rsmwServer.unBind("9999", null);
System.out.println(agentSipPhoneUnBindResponse1.toJsonString());
// 5.2 【解绑】 根据分机解绑座席
SimpleResponse agentSipPhoneUnBindResponse2 = rsmwServer.unBind(null, "8001");
System.out.println(agentSipPhoneUnBindResponse2.toJsonString());
// 5.3 【绑定关系查询】 查询座席绑定的分机
AgentSipPhoneBindInfoResponse agentSipPhoneBindInfoResponse1 = rsmwServer.getBindInfo("9999", null);
System.out.println(agentSipPhoneBindInfoResponse1.toJsonString());
// 5.3 【绑定关系查询】查询分机绑定的座席
AgentSipPhoneBindInfoResponse agentSipPhoneBindInfoResponse2 = rsmwServer.getBindInfo(null, "8001");
System.out.println(agentSipPhoneBindInfoResponse2.toJsonString());
// 5.4 【置忙】
QueueMemberPauseResponse qMemberPauseResponse = rsmwServer.queueMemberPause("SIP/8001", "置忙原因:你猜");
System.out.println(qMemberPauseResponse.toJsonString());
// 5.4 【置闲】
QueueMemberPauseResponse qMemberUnPauseResponse = rsmwServer.queueMemberUnPause("SIP/8001");
System.out.println(qMemberUnPauseResponse.toJsonString());
// 5.5 【实时并发数查询】
GetChannelCountResponse getChannelCountResponse = rsmwServer.getChannelCount();
System.out.println(getChannelCountResponse.toJsonString());
// 5.6 【发起呼叫】
OriginateResponse originateResponse = rsmwServer.originate(0,"8001","","","","","","8002","","","","userDataXXXXX");
System.out.println(originateResponse.toJsonString());
// 5.7 【获取指定SipPhone的当前Channel】
GetChannelResponse getChannelResponse = rsmwServer.getChannel("8001");
System.out.println(getChannelResponse.toJsonString());
// 5.8 【呼叫保持、恢复】
SimpleResponse holdResponse = rsmwServer.hold("8001");
System.out.println(holdResponse.toJsonString());
SimpleResponse unholdResponse = rsmwServer.unhold("8001");
System.out.println(unholdResponse.toJsonString());
// 5.9 【桥接channel】
SimpleResponse bridgeResponse = rsmwServer.bridge("SIP/8001-XXXXXXXX","SIP/8002-XXXXXXXX");
System.out.println(bridgeResponse.toJsonString());
// 5.10 【转接Channel】
SimpleResponse redirectResponse = rsmwServer.redirect("SIP/8001-XXXXXXXX","_moh", "13391026171","SIP/8002-XXXXXXXX","core_route", "13391026172");
System.out.println(redirectResponse.toJsonString());
// 5.11 【挂断Channel】
SimpleResponse hangupResponse = rsmwServer.hangup("SIP/8001-XXXXXXXX");
System.out.println(hangupResponse.toJsonString());
// 5.12 【获取所有SipPhone状态】
GetSipPhoneStatusResponse getSipPhoneStatusResponse = rsmwServer.getSipPhoneStatus();
System.out.println(getSipPhoneStatusResponse.toJsonString());
// 5.12 【获取所有SipPhone状态】
GetGatewayStatusResponse getGatewayStatusResponse = rsmwServer.getGatewayStatus();
System.out.println(getGatewayStatusResponse.toJsonString());
// 5.13 【查询归属地】
GetMobileInfoResponse getMobileInfoResponse = rsmwServer.getMobileInfo("13391026171");
System.out.println(getMobileInfoResponse.toJsonString());
// 5.14 【查询cdr】
GetCdrByCallUuidResponse response1 = rsmwServer.getCdrByCallUuid("f97ea90287244c87b2d6d4b60da61d16");
System.out.println(response1.toJsonString());
GetCdrByCallUuidResponse response2 = rsmwServer.getCdrByCallUuid("1493866989.59");
System.out.println(response2.toJsonString());
// 5.15【服务质量评价】
SimpleResponse sqeResponse = rsmwServer.sqe("8001", "http://ip:port/question.wav", "http://ip:port/thankyou.wav");
System.out.println(sqeResponse.toJsonString());
// 5.16 【判断某个号码是否内部exte】
IsExtenResponse isExtenResponse = rsmwServer.isExten("8001");
System.out.println(isExtenResponse.toJsonString());
GetQueueStatusResponse getQueueStatusResponse = rsmwServer.getQueueStatus();
System.out.println(getQueueStatusResponse.toJsonString());
}
}
...@@ -7,8 +7,13 @@ import java.util.List; ...@@ -7,8 +7,13 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; 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.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference; import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpEntity; import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
...@@ -18,7 +23,13 @@ import org.springframework.security.core.userdetails.User; ...@@ -18,7 +23,13 @@ import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException; 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.BaseService;
import com.ctrip.fun.admin.service.callcenter.SipPhoneService;
import com.ctrip.fun.common.vo.Request; import com.ctrip.fun.common.vo.Request;
import com.ctrip.fun.common.vo.Response; import com.ctrip.fun.common.vo.Response;
import com.ctrip.fun.common.vo.ResponseStatusEnum; import com.ctrip.fun.common.vo.ResponseStatusEnum;
...@@ -28,6 +39,9 @@ public final class UserDetailsService extends BaseService implements org.springf ...@@ -28,6 +39,9 @@ public final class UserDetailsService extends BaseService implements org.springf
private static Logger logger = LoggerFactory.getLogger(UserDetailsService.class); private static Logger logger = LoggerFactory.getLogger(UserDetailsService.class);
private SipPhoneService sipPhoneService;
/** /**
* @param username * @param username
* @return * @return
...@@ -57,8 +71,21 @@ public final class UserDetailsService extends BaseService implements org.springf ...@@ -57,8 +71,21 @@ public final class UserDetailsService extends BaseService implements org.springf
dbAuths = new ArrayList<GrantedAuthority>(dbAuthsSet); 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); return new User(adminUserBean.getUserName(), adminUserBean.getPassword(), adminUserBean.isEnable(), true, true, true, dbAuths);
} else { } else {
logger.error(String.format("[get] status: %d, msg: %s", response.getStatus(), response.getMessage())); logger.error(String.format("[get] status: %d, msg: %s", response.getStatus(), response.getMessage()));
return null; return null;
...@@ -116,4 +143,12 @@ public final class UserDetailsService extends BaseService implements org.springf ...@@ -116,4 +143,12 @@ public final class UserDetailsService extends BaseService implements org.springf
return retBean; 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 @@ ...@@ -16,6 +16,7 @@
<sec:http pattern="/adminUser/*" security="none" /> <sec:http pattern="/adminUser/*" security="none" />
<sec:http pattern="/favicon.ico" 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: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" /> <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 @@ ...@@ -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="/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="/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="/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="/extralresource/**" access="ROLE_AWTCZ,ROLE_DEV" />
<sec:intercept-url pattern="/tourAreaInfo/**" 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" /> <sec:intercept-url pattern="/tour/**" access="ROLE_AWTCZ,ROLE_DEV" />
...@@ -74,10 +75,13 @@ ...@@ -74,10 +75,13 @@
<property name="userDetailsService" ref="userDetailsService"></property> <property name="userDetailsService" ref="userDetailsService"></property>
</bean> </bean>
<bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" /> <bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" />
<bean id="sipPhoneService" class="com.ctrip.fun.admin.service.callcenter.SipPhoneService" />
<!-- 通过rest访问远程服务得到用户信息 --> <!-- 通过rest访问远程服务得到用户信息 -->
<bean id="userDetailsService" class="com.ctrip.fun.admin.service.system.UserDetailsService" parent="baseService"> <bean id="userDetailsService" class="com.ctrip.fun.admin.service.system.UserDetailsService" parent="baseService">
<property name="sipPhoneService" ref="sipPhoneService"></property>
</bean> </bean>
<bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased"> <bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
......
...@@ -223,6 +223,9 @@ ...@@ -223,6 +223,9 @@
<!-- 站内信 --> <!-- 站内信 -->
<bean name="insideSmsService" class="com.ctrip.fun.admin.service.tools.InsideSmsService" <bean name="insideSmsService" class="com.ctrip.fun.admin.service.tools.InsideSmsService"
parent="baseService" /> 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" <bean name="voucherRuleService" class="com.ctrip.fun.admin.service.basic.VoucherRuleService"
......
...@@ -34,6 +34,17 @@ function feedbackStatusCheck(){ ...@@ -34,6 +34,17 @@ function feedbackStatusCheck(){
} }
return true; return true;
} }
//拨打电话
function callTitle(phone){
$.post("/callcenter/sipPhone/originateOne",{"dst":phone},function(data){
if(data.errCode==0){
alert("正在为您拨号...");
}
});
}
</script> </script>
</#assign> </#assign>
...@@ -103,7 +114,8 @@ function feedbackStatusCheck(){ ...@@ -103,7 +114,8 @@ function feedbackStatusCheck(){
<label class="control-label" for="titel">用户电话</label> <label class="control-label" for="titel">用户电话</label>
<div class="controls"> <div class="controls">
<input type="text" id="titel" name="titel" value="${dto.phone!}" placeholder="用户电话" class="input-medium" required="" readonly="true" style="width:200px"> <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> <span class="help-inline">已拨打<span style="color:red;">${dto.taskMyPhonedAmount!}</span>位</span>
</div> </div>
</div> </div>
......
<div class="navbar"> <div class="navbar">
<input type="hidden" name="loginUsername" id="loginUsername" value='${Session["SPRING_SECURITY_CONTEXT"].authentication.name}' />
<div class="navbar-inner"> <div class="navbar-inner">
<a class="logo" href="/golf/course/list">主题游管理</a> <a class="logo" href="/golf/course/list">主题游管理</a>
<ul class="nav"> <ul class="nav">
...@@ -20,8 +23,44 @@ ...@@ -20,8 +23,44 @@
</ul> </ul>
<ul class="nav pull-right"> <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 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> <li><a href="/j_spring_security_logout">注销</a></li>
</ul> </ul>
</div> </div>
</div> </div>
\ No newline at end of file
<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(){ function refund(){
//如果此订单不是信用卡担保支付方式,并且实付金额为0,点击退单按钮视为直接取消订单! //如果此订单不是信用卡担保支付方式,并且实付金额为0,点击退单按钮视为直接取消订单!
if($("#payMode").attr("value")!="信用卡担保"&&$("#actualAmount").attr("value")==0 if($("#payMode").attr("value")!="信用卡担保"&&$("#actualAmount").attr("value")==0
...@@ -428,4 +489,34 @@ ...@@ -428,4 +489,34 @@
}); });
$(".input-file input[type='file']").change(function(){ $(".input-file input[type='file']").change(function(){
$(this).prev(".file-show").html($(this).val()); $(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