Просмотр исходного кода

Merge branch 'master' of http://1.14.104.71:10880/wushubo/callcenter-private-master

yzx 3 дней назад
Родитель
Сommit
6c44f4df38

+ 16 - 1
src/main/java/com/telerobot/fs/config/OriginateSessionErrorCode.java

@@ -7,6 +7,9 @@ package com.telerobot.fs.config;
 public class OriginateSessionErrorCode {
 public class OriginateSessionErrorCode {
 
 
     public static final String NONE = "NONE";
     public static final String NONE = "NONE";
+    /**
+    * 语音提示号码不存在 404 和空号不一样
+    */
     public static final String UNALLOCATED_NUMBER = "UNALLOCATED_NUMBER";
     public static final String UNALLOCATED_NUMBER = "UNALLOCATED_NUMBER";
     public static final String NO_ROUTE_TRANSIT_NET = "NO_ROUTE_TRANSIT_NET";
     public static final String NO_ROUTE_TRANSIT_NET = "NO_ROUTE_TRANSIT_NET";
     public static final String NO_ROUTE_DESTINATION = "NO_ROUTE_DESTINATION";
     public static final String NO_ROUTE_DESTINATION = "NO_ROUTE_DESTINATION";
@@ -14,6 +17,9 @@ public class OriginateSessionErrorCode {
     public static final String CALL_AWARDED_DELIVERED = "CALL_AWARDED_DELIVERED";
     public static final String CALL_AWARDED_DELIVERED = "CALL_AWARDED_DELIVERED";
     public static final String NORMAL_CLEARING = "NORMAL_CLEARING";
     public static final String NORMAL_CLEARING = "NORMAL_CLEARING";
     public static final String USER_BUSY = "USER_BUSY";
     public static final String USER_BUSY = "USER_BUSY";
+    /**
+    * 被叫方已经收到呼叫请求并正常振铃,但长时间无人接听,最终超时挂断 NO_USER_RESPONSE:sip:480
+    */
     public static final String NO_USER_RESPONSE = "NO_USER_RESPONSE";
     public static final String NO_USER_RESPONSE = "NO_USER_RESPONSE";
     public static final String NO_ANSWER = "NO_ANSWER";
     public static final String NO_ANSWER = "NO_ANSWER";
     public static final String SUBSCRIBER_ABSENT = "SUBSCRIBER_ABSENT";
     public static final String SUBSCRIBER_ABSENT = "SUBSCRIBER_ABSENT";
@@ -52,11 +58,17 @@ public class OriginateSessionErrorCode {
     public static final String IE_NONEXIST = "IE_NONEXIST";
     public static final String IE_NONEXIST = "IE_NONEXIST";
     public static final String INVALID_IE_CONTENTS = "INVALID_IE_CONTENTS";
     public static final String INVALID_IE_CONTENTS = "INVALID_IE_CONTENTS";
     public static final String WRONG_CALL_STATE = "WRONG_CALL_STATE";
     public static final String WRONG_CALL_STATE = "WRONG_CALL_STATE";
+    /**
+    * RECOVERY_ON_TIMER_EXPIRE:sip:408 经过测试 收到电话不接/或一会儿 拒接 状态码是这个
+    */
     public static final String RECOVERY_ON_TIMER_EXPIRE = "RECOVERY_ON_TIMER_EXPIRE";
     public static final String RECOVERY_ON_TIMER_EXPIRE = "RECOVERY_ON_TIMER_EXPIRE";
     public static final String MANDATORY_IE_LENGTH_ERROR = "MANDATORY_IE_LENGTH_ERROR";
     public static final String MANDATORY_IE_LENGTH_ERROR = "MANDATORY_IE_LENGTH_ERROR";
     public static final String PROTOCOL_ERROR = "PROTOCOL_ERROR";
     public static final String PROTOCOL_ERROR = "PROTOCOL_ERROR";
     public static final String INTERWORKING = "INTERWORKING";
     public static final String INTERWORKING = "INTERWORKING";
     public static final String SUCCESS = "SUCCESS";
     public static final String SUCCESS = "SUCCESS";
+    /**
+    *  ORIGINATOR_CANCEL:sip:487 电话关机的时候的状态码
+    */
     public static final String ORIGINATOR_CANCEL = "ORIGINATOR_CANCEL";
     public static final String ORIGINATOR_CANCEL = "ORIGINATOR_CANCEL";
     public static final String CRASH = "CRASH";
     public static final String CRASH = "CRASH";
     public static final String SYSTEM_SHUTDOWN = "SYSTEM_SHUTDOWN";
     public static final String SYSTEM_SHUTDOWN = "SYSTEM_SHUTDOWN";
@@ -66,6 +78,9 @@ public class OriginateSessionErrorCode {
     public static final String ATTENDED_TRANSFER = "ATTENDED_TRANSFER";
     public static final String ATTENDED_TRANSFER = "ATTENDED_TRANSFER";
     public static final String ALLOTTED_TIMEOUT = "ALLOTTED_TIMEOUT";
     public static final String ALLOTTED_TIMEOUT = "ALLOTTED_TIMEOUT";
     public static final String USER_CHALLENGE = "USER_CHALLENGE";
     public static final String USER_CHALLENGE = "USER_CHALLENGE";
+    /**
+    * MEDIA_TIMEOUT:null  拨打超时 无人接听 无状态码
+    */
     public static final String MEDIA_TIMEOUT = "MEDIA_TIMEOUT";
     public static final String MEDIA_TIMEOUT = "MEDIA_TIMEOUT";
     public static final String PICKED_OFF = "PICKED_OFF";
     public static final String PICKED_OFF = "PICKED_OFF";
     public static final String USER_NOT_REGISTERED = "USER_NOT_REGISTERED";
     public static final String USER_NOT_REGISTERED = "USER_NOT_REGISTERED";
@@ -88,4 +103,4 @@ public class OriginateSessionErrorCode {
     public static final String INVALID_IDENTITY = "INVALID_IDENTITY";
     public static final String INVALID_IDENTITY = "INVALID_IDENTITY";
     public static final String STALE_DATE = "STALE_DATE";
     public static final String STALE_DATE = "STALE_DATE";
     public static final String REJECT_ALL = "REJECT_ALL";
     public static final String REJECT_ALL = "REJECT_ALL";
-}
+}

+ 1 - 1
src/main/java/com/telerobot/fs/config/SipSessionStatusCode.java

@@ -42,4 +42,4 @@ public class SipSessionStatusCode {
     public static final int BUSY_EVERYWHERE = 600;
     public static final int BUSY_EVERYWHERE = 600;
     public static final int DECLINE = 603;
     public static final int DECLINE = 603;
     public static final int DOES_NOT_EXIST_ANYWHERE = 604;
     public static final int DOES_NOT_EXIST_ANYWHERE = 604;
-}
+}

+ 25 - 22
src/main/java/com/telerobot/fs/outbound/batchcall/CallTask.java

@@ -330,6 +330,8 @@ public class CallTask implements Runnable {
 			this.backgroundJobUuid = backgroundJobUuid;
 			this.backgroundJobUuid = backgroundJobUuid;
 		}
 		}
 		public void processFsMsg(Map<String, String> headers) {
 		public void processFsMsg(Map<String, String> headers) {
+
+
 			String uniqueID = headers.get("Unique-ID");
 			String uniqueID = headers.get("Unique-ID");
 			String caller = headers.get("Caller-Caller-ID-Number");
 			String caller = headers.get("Caller-Caller-ID-Number");
 			String dest = headers.get("Caller-Destination-Number");
 			String dest = headers.get("Caller-Destination-Number");
@@ -393,30 +395,30 @@ public class CallTask implements Runnable {
 					//   unknown        - 未知原因
 					//   unknown        - 未知原因
 					try {
 					try {
 						String reason = "";
 						String reason = "";
-
+						log.info("====emptyNumberDetectionCode:{},hangupCause:{}",emptyNumberDetectionCode,hangupCause);
 						// 第一优先级:ASR空号识别结果(通过识别运营商提示音判断)
 						// 第一优先级:ASR空号识别结果(通过识别运营商提示音判断)
 						// emptyNumberDetectionCode 对应 cc_call_phone.callstatus 的状态码定义
 						// emptyNumberDetectionCode 对应 cc_call_phone.callstatus 的状态码定义
-						if (emptyNumberDetectionCode == 33) reason = "empty_number";       // 空号
-						else if (emptyNumberDetectionCode == 31) reason = "busy";          // 忙线
-						else if (emptyNumberDetectionCode == 34) reason = "no_answer";     // 未接听
-						else if (emptyNumberDetectionCode == 35) reason = "suspended";     // 停机
-						else if (emptyNumberDetectionCode == 32) reason = "off";           // 关机
-						else if (emptyNumberDetectionCode == 37) reason = "assistant";     // 语音助手
-						else if (emptyNumberDetectionCode == 38) reason = "unavailable";   // 无法接通
-						else if (emptyNumberDetectionCode == 39) reason = "call_restriction"; // 呼入限制
-						else if (emptyNumberDetectionCode == 36) reason = "network_busy";  // 网络忙
-
-						// 第二优先级:ASR未命中时,根据FreeSWITCH返回的SIP状态码推断
-						// hangupCause 格式示例:"USER_BUSY:sip:486"、"DESTINATION_OUT_OF_ORDER:null"
-						if (reason.isEmpty()) {
-							if (hangupCause.contains("USER_BUSY") || hangupCause.contains("486")) reason = "busy";                    // SIP 486 用户忙
-							else if (hangupCause.contains("NO_ANSWER") || hangupCause.contains("NO_USER_RESPONSE")) reason = "no_answer";  // 无应答
-							else if (hangupCause.contains("UNALLOCATED_NUMBER") || hangupCause.contains("DOES_NOT_EXIST_ANYWHERE") || hangupCause.contains("604")) reason = "empty_number"; // SIP 604 号码不存在
-							else if (hangupCause.contains("SUBSCRIBER_ABSENT")) reason = "suspended";                                // 用户不在服务区/停机
-							else if (hangupCause.contains("CALL_REJECTED") || hangupCause.contains("603")) reason = "no_answer";       // SIP 603 拒接
-							else if (hitLineError) reason = "line_error";                                                            // 线路故障(404/503/480/408)
-							else reason = "unknown";                                                                                  // 未知原因
-						}
+
+							if (hangupCause.contains("USER_BUSY") || hangupCause.contains("486")) reason = "2";                    // SIP 486 用户忙
+							else if (hangupCause.contains("NO_ANSWER")
+									|| hangupCause.contains("NO_USER_RESPONSE")
+									|| hangupCause.contains("MEDIA_TIMEOUT")) reason = "3";  // 无应答
+							else if (hangupCause.contains("UNALLOCATED_NUMBER")
+									|| hangupCause.contains("DOES_NOT_EXIST_ANYWHERE")
+									|| hangupCause.contains("604")) reason = "5"; // SIP 604 号码不存在
+							else if (hangupCause.contains("SUBSCRIBER_ABSENT")) reason = "6";   // 用户不在服务区/停机
+							else if (hangupCause.contains("NUMBER_CHANGED")) reason = "7";   // 号码失效
+							else if (hangupCause.contains("CALL_REJECTED")
+									|| hangupCause.contains("603")
+									|| hangupCause.contains("RECOVERY_ON_TIMER_EXPIRE")
+									|| hangupCause.contains("ORIGINATOR_CANCEL")
+									|| hangupCause.contains("487")
+									|| hangupCause.contains("403")) reason = "4";       // SIP 603 拒接
+							else if (hitLineError) reason = "line_error";
+							else if (hangupCause.contains("MANAGER_REQUEST")
+									|| hangupCause.contains("NORMAL_CLEARING") ) reason = "98";  // 正常接通
+							else reason = "99";
+
 						phoneInfo.setUnconnectedReason(reason);
 						phoneInfo.setUnconnectedReason(reason);
 						log.info("{} unconnected reason: {}", getTraceId(), reason);
 						log.info("{} unconnected reason: {}", getTraceId(), reason);
 					} catch (Throwable e) {
 					} catch (Throwable e) {
@@ -597,6 +599,7 @@ public class CallTask implements Runnable {
 				@Override
 				@Override
 				public void run() {
 				public void run() {
 					try {
 					try {
+						log.info("eventReceived.getEventHeaders()All:{}",event);
 						processFsMsg(event.getEventHeaders());
 						processFsMsg(event.getEventHeaders());
 					}catch (Exception e){
 					}catch (Exception e){
 						log.error("{} process freeSWITCH esl msg error : {}  {}, msg: {}",
 						log.error("{} process freeSWITCH esl msg error : {}  {}, msg: {}",

+ 4 - 1
src/main/java/com/telerobot/fs/service/AsrResultListener.java

@@ -105,6 +105,7 @@ public class AsrResultListener implements ApplicationListener<ApplicationReadyEv
             @Override
             @Override
             public void run() {
             public void run() {
                 try {
                 try {
+                    logger.info("asrResultListener eventReceived : {}", event);
                     processFsMsg(event.getEventHeaders());
                     processFsMsg(event.getEventHeaders());
                 } catch (Exception e) {
                 } catch (Exception e) {
                     logger.error("{} processFsMsg error : {}", e.toString(),
                     logger.error("{} processFsMsg error : {}", e.toString(),
@@ -208,8 +209,10 @@ public class AsrResultListener implements ApplicationListener<ApplicationReadyEv
     public void processFsMsg(Map<String, String> headers) {
     public void processFsMsg(Map<String, String> headers) {
         String eventName = headers.get("Event-Name");
         String eventName = headers.get("Event-Name");
         String uniqueId = headers.get("Unique-ID");
         String uniqueId = headers.get("Unique-ID");
+
+
 		if(StringUtils.isNullOrEmpty(uniqueId)){
 		if(StringUtils.isNullOrEmpty(uniqueId)){
-			return;			
+			return;
 		}
 		}
         AsrEntity asrEntity = asrInfoContainer.get(uniqueId);
         AsrEntity asrEntity = asrInfoContainer.get(uniqueId);
         if (null == asrEntity) {
         if (null == asrEntity) {

+ 1 - 0
src/main/java/com/telerobot/fs/wshandle/FsEslStarter.java

@@ -31,6 +31,7 @@ public class FsEslStarter implements ApplicationListener<ApplicationReadyEvent>
 
 
         eventSubscriptions.add(EventNames.CHANNEL_HANGUP);
         eventSubscriptions.add(EventNames.CHANNEL_HANGUP);
         eventSubscriptions.add(EventNames.CHANNEL_ANSWER);
         eventSubscriptions.add(EventNames.CHANNEL_ANSWER);
+        eventSubscriptions.add(EventNames.CHANNEL_HANGUP_COMPLETE);
         eventSubscriptions.add(EventNames.CHANNEL_PROGRESS_MEDIA);
         eventSubscriptions.add(EventNames.CHANNEL_PROGRESS_MEDIA);
         eventSubscriptions.add(EventNames.HEARTBEAT);
         eventSubscriptions.add(EventNames.HEARTBEAT);
         eventSubscriptions.add(EventNames.BACKGROUND_JOB);
         eventSubscriptions.add(EventNames.BACKGROUND_JOB);

+ 2 - 1
src/main/java/com/telerobot/fs/wshandle/impl/CallListener.java

@@ -127,6 +127,7 @@ public class CallListener implements IEslEventListener {
 		String uniqueId = headers.get("Unique-ID");
 		String uniqueId = headers.get("Unique-ID");
 		String eventName = headers.get("Event-Name");
 		String eventName = headers.get("Event-Name");
 
 
+		logger.info("eslCallBack-CallListener:{}",event);
         if (EventNames.CHANNEL_ANSWER.equalsIgnoreCase(eventName)) {
         if (EventNames.CHANNEL_ANSWER.equalsIgnoreCase(eventName)) {
 			logger.info("{} recv CHANNEL_ANSWER event.  uniqueId={}", getTraceId(), uniqueId);
 			logger.info("{} recv CHANNEL_ANSWER event.  uniqueId={}", getTraceId(), uniqueId);
 			if (uniqueId.equalsIgnoreCase(customerChannel.getUuid())) {
 			if (uniqueId.equalsIgnoreCase(customerChannel.getUuid())) {
@@ -678,4 +679,4 @@ public class CallListener implements IEslEventListener {
 
 
 	public void onDispose() {
 	public void onDispose() {
 	}
 	}
-}
+}