Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
caosy
/
fun-admin
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
707515cc
authored
Sep 18, 2017
by
unknown
Browse files
Options
Browse Files
Download
Plain Diff
merge f663
parents
f7b6d8e7
67d1acfc
Hide whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
2064 additions
and
9 deletions
pom.xml
src/main/java/com/ctrip/fun/admin/controller/callcenter/SipPhoneControl.java
src/main/java/com/ctrip/fun/admin/controller/tools/CallCenterController.java
src/main/java/com/ctrip/fun/admin/eventhandler/BindEventHandler.java
src/main/java/com/ctrip/fun/admin/eventhandler/BridgeEventHandler.java
src/main/java/com/ctrip/fun/admin/eventhandler/CdrEventHandler.java
src/main/java/com/ctrip/fun/admin/eventhandler/ChannelRouteEventHandler.java
src/main/java/com/ctrip/fun/admin/eventhandler/NewStateEventHandler.java
src/main/java/com/ctrip/fun/admin/eventhandler/NewStateWebSocket.java
src/main/java/com/ctrip/fun/admin/eventhandler/QueueMemberPauseEventHandler.java
src/main/java/com/ctrip/fun/admin/eventhandler/SqeEventHandler.java
src/main/java/com/ctrip/fun/admin/service/callcenter/SipPhoneService.java
src/main/java/com/ctrip/fun/admin/service/system/UserDetailsService.java
src/main/java/com/ctrip/fun/admin/vo/callcenter/AbstractEventHandler.java
src/main/java/com/ctrip/fun/admin/vo/callcenter/BridgeEvent.java
src/main/java/com/ctrip/fun/admin/vo/callcenter/RsmwCdrEvent.java
src/main/java/com/ctrip/fun/admin/vo/callcenter/RsmwChannelRouteEvent.java
src/main/java/com/ctrip/fun/admin/vo/callcenter/RsmwNewStateEvent.java
src/main/resources/config/spring-security.xml
src/main/resources/config/spring-service.xml
src/main/webapp/WEB-INF/templates/basic/telTask/callTelTask.ftl
src/main/webapp/WEB-INF/templates/common/navbar.ftl
src/main/webapp/resource/js/app/op.js
pom.xml
View file @
707515cc
...
...
@@ -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>
...
...
src/main/java/com/ctrip/fun/admin/controller/callcenter/SipPhoneControl.java
0 → 100644
View file @
707515cc
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
();
}
}
src/main/java/com/ctrip/fun/admin/controller/tools/CallCenterController.java
View file @
707515cc
...
...
@@ -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
{
...
...
src/main/java/com/ctrip/fun/admin/eventhandler/BindEventHandler.java
0 → 100644
View file @
707515cc
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
""
;
}
}
src/main/java/com/ctrip/fun/admin/eventhandler/BridgeEventHandler.java
0 → 100644
View file @
707515cc
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
""
;
}
}
src/main/java/com/ctrip/fun/admin/eventhandler/CdrEventHandler.java
0 → 100644
View file @
707515cc
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
""
;
}
}
src/main/java/com/ctrip/fun/admin/eventhandler/ChannelRouteEventHandler.java
0 → 100644
View file @
707515cc
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
""
;
}
}
src/main/java/com/ctrip/fun/admin/eventhandler/NewStateEventHandler.java
0 → 100644
View file @
707515cc
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
""
;
}
}
src/main/java/com/ctrip/fun/admin/eventhandler/NewStateWebSocket.java
0 → 100644
View file @
707515cc
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
();
}
}
}
src/main/java/com/ctrip/fun/admin/eventhandler/QueueMemberPauseEventHandler.java
0 → 100644
View file @
707515cc
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
""
;
}
}
src/main/java/com/ctrip/fun/admin/eventhandler/SqeEventHandler.java
0 → 100644
View file @
707515cc
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
""
;
}
}
src/main/java/com/ctrip/fun/admin/service/callcenter/SipPhoneService.java
0 → 100644
View file @
707515cc
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
());
}
}
src/main/java/com/ctrip/fun/admin/service/system/UserDetailsService.java
View file @
707515cc
...
...
@@ -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
(),
0
l
);
}
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
;
}
}
src/main/java/com/ctrip/fun/admin/vo/callcenter/AbstractEventHandler.java
0 → 100644
View file @
707515cc
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
;
}
}
src/main/java/com/ctrip/fun/admin/vo/callcenter/BridgeEvent.java
0 → 100644
View file @
707515cc
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
;
}
}
src/main/java/com/ctrip/fun/admin/vo/callcenter/RsmwCdrEvent.java
0 → 100644
View file @
707515cc
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
;
}
}
src/main/java/com/ctrip/fun/admin/vo/callcenter/RsmwChannelRouteEvent.java
0 → 100644
View file @
707515cc
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
;
}
}
src/main/java/com/ctrip/fun/admin/vo/callcenter/RsmwNewStateEvent.java
0 → 100644
View file @
707515cc
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;
// }
}
src/main/resources/config/spring-security.xml
View file @
707515cc
...
...
@@ -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"
>
...
...
src/main/resources/config/spring-service.xml
View file @
707515cc
...
...
@@ -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"
...
...
src/main/webapp/WEB-INF/templates/basic/telTask/callTelTask.ftl
View file @
707515cc
...
...
@@ -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">
<span style="font-weight:bold;color:red">(右击号码,点击"拨打")</span>
<!-- <span style="font-weight:bold;color:red">(右击号码,点击"拨打")</span> -->
<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>
...
...
src/main/webapp/WEB-INF/templates/common/navbar.ftl
View file @
707515cc
<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">×</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>
src/main/webapp/resource/js/app/op.js
View file @
707515cc
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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment