|
@@ -2,9 +2,12 @@
|
|
|
# encoding:utf-8
|
|
|
|
|
|
import json
|
|
|
+import sys
|
|
|
from typing import Dict, Any, Optional, List
|
|
|
|
|
|
from src.core.callcenter.constant import get_json_dict
|
|
|
+from src.core.callcenter.esl.constant.sip_header_constant import sipHeaderCallId, sipHeaderCaller, sipHeaderCalled, \
|
|
|
+ sipHeaderDeviceId, sipHeaderDeviceType
|
|
|
from src.core.callcenter.exception import SipUriSyntaxException
|
|
|
from src.core.datasource import SIP_SERVER
|
|
|
from src.core.callcenter.esl.constant.esl_constant import SPLIT, SIP_HEADER
|
|
@@ -196,7 +199,7 @@ class MakeCallContext(BaseApi):
|
|
|
|
|
|
def __init__(self,
|
|
|
sip_server=SIP_SERVER,
|
|
|
- route_gateway_name="gateway-fxo",
|
|
|
+ route_gateway_name="fxo-gateway",
|
|
|
display: Optional[str] = None,
|
|
|
caller: Optional[str] = None,
|
|
|
called: Optional[str] = None,
|
|
@@ -204,8 +207,8 @@ class MakeCallContext(BaseApi):
|
|
|
device_id: Optional[str] = None,
|
|
|
eavesdrop: Optional[str] = None,
|
|
|
device_type: Optional[int] = None,
|
|
|
- timeout: Optional[int] = 30,
|
|
|
- originate_timeout: Optional[int] = 30,
|
|
|
+ timeout: Optional[int] = 60,
|
|
|
+ originate_timeout: Optional[int] = 60,
|
|
|
sip_header_map: Optional[Dict[str, str]] = {},
|
|
|
called_prefix: Optional[str] = "",
|
|
|
service_id: Optional[str] = None,
|
|
@@ -248,7 +251,7 @@ class MakeCallContext(BaseApi):
|
|
|
f"origination_caller_id_number={self.display}",
|
|
|
f"origination_caller_id_name={self.display}",
|
|
|
f"origination_uuid={self.device_id}",
|
|
|
- "absolute_codec_string=^^:PCMU:PCMA,",
|
|
|
+ "absolute_codec_string=^^:PCMU:PCMA",
|
|
|
]
|
|
|
|
|
|
if self.originate_timeout is not None:
|
|
@@ -257,11 +260,11 @@ class MakeCallContext(BaseApi):
|
|
|
headers += [
|
|
|
"RECORD_STEREO=true",
|
|
|
"RECORD_APPEND=true",
|
|
|
- f"{SIP_HEADER}call_id={self.call_id}",
|
|
|
- f"{SIP_HEADER}caller={self.caller}",
|
|
|
- f"{SIP_HEADER}called={self.called}",
|
|
|
- f"{SIP_HEADER}device_id={self.device_id}",
|
|
|
- f"{SIP_HEADER}device_type={self.device_type}",
|
|
|
+ f"{SIP_HEADER}{sipHeaderCallId}={self.call_id}",
|
|
|
+ f"{SIP_HEADER}{sipHeaderCaller}={self.caller}",
|
|
|
+ f"{SIP_HEADER}{sipHeaderCalled}={self.called}",
|
|
|
+ f"{SIP_HEADER}{sipHeaderDeviceId}={self.device_id}",
|
|
|
+ f"{SIP_HEADER}{sipHeaderDeviceType}={self.device_type}",
|
|
|
]
|
|
|
|
|
|
if self.eavesdrop:
|
|
@@ -307,6 +310,8 @@ class SipURI:
|
|
|
self.uri_parameters = {}
|
|
|
|
|
|
scheme = f"{self.SIP_SCHEME}{self.SCHEME_SEPARATOR}"
|
|
|
+ print('------->', sip_uri, sip_uri.startswith(scheme))
|
|
|
+ sys.stdout.flush() # 强制刷新输出缓冲区
|
|
|
if not sip_uri.startswith(scheme):
|
|
|
raise SipUriSyntaxException(f"SIP URI must start with {scheme}")
|
|
|
|
|
@@ -439,7 +444,7 @@ class CallInfo(BaseApi):
|
|
|
media_host=None, sip_server=None, client_host=None, record=None, record2=None, record_time=None,
|
|
|
call_time=None, call_type=None, direction=None, answer_flag=None, wait_time=None, answer_count=0,
|
|
|
hangup_dir=None, sdk_hangup=0, hangup_code=None, answer_time=None, end_time=None, talk_time=None,
|
|
|
- frist_queue_time=None, queue_start_time=None, queue_end_time=None, overflow_count=0,
|
|
|
+ first_queue_time=None, queue_start_time=None, queue_end_time=None, overflow_count=0,
|
|
|
uuid1=None, uuid2=None, cdr_notify_url=None, queue_level=None, device_list=[],
|
|
|
device_info_map: Dict[str, Any] = {}, follow_data: Dict[str, Any] = {},
|
|
|
process_data: Dict[str, Any] = {}, next_commands=[], call_details=[]):
|
|
@@ -478,7 +483,7 @@ class CallInfo(BaseApi):
|
|
|
self.answer_time = answer_time # 接听时间
|
|
|
self.end_time = end_time # 最后一侧电话挂机时间
|
|
|
self.talk_time = talk_time # 通话时长(秒)
|
|
|
- self.frist_queue_time = frist_queue_time # 第一次进队列时间
|
|
|
+ self.first_queue_time = first_queue_time # 第一次进队列时间
|
|
|
self.queue_start_time = queue_start_time # 进入技能组时间
|
|
|
self.queue_end_time = queue_end_time # 出技能组时间
|
|
|
self.overflow_count = overflow_count # 溢出次数
|
|
@@ -487,7 +492,7 @@ class CallInfo(BaseApi):
|
|
|
self.cdr_notify_url = cdr_notify_url # 话单通知地址
|
|
|
self.queue_level = queue_level # 排队等级,默认是进队列时间
|
|
|
self.device_list = device_list # 当前通话的设备
|
|
|
- self.device_info_map = device_info_map, # K-V
|
|
|
+ self.device_info_map = device_info_map
|
|
|
self.follow_data = follow_data # 呼叫随路数据(作为落单数据)
|
|
|
self.process_data = process_data # 模块流程间数据
|
|
|
self.next_commands = next_commands # 执行下一步命令
|
|
@@ -496,7 +501,6 @@ class CallInfo(BaseApi):
|
|
|
@classmethod
|
|
|
def from_json(cls, json_string):
|
|
|
data = get_json_dict(json_string)
|
|
|
- device_list = [DeviceInfo(**x) for x in data.get('device_list', [])]
|
|
|
device_info_map: Dict[str, Any] = {key: DeviceInfo(**value) for key, value in data.get('device_info_map', {}).items()}
|
|
|
follow_data: Dict[str, Any] = {key: value for key, value in data.get('follow_data', {}).items()}
|
|
|
process_data: Dict[str, Any] = {key: value for key, value in data.get('process_data', {}).items()}
|
|
@@ -517,10 +521,10 @@ class CallInfo(BaseApi):
|
|
|
answer_count=data.get('answer_count'), hangup_dir=data.get('hangup_dir'),
|
|
|
sdk_hangup=data.get('sdk_hangup'), hangup_code=data.get('hangup_code'),
|
|
|
answer_time=data.get('answer_time'), end_time=data.get('end_time'), talk_time=data.get('talk_time'),
|
|
|
- frist_queue_time=data.get('frist_queue_time'), queue_start_time=data.get('queue_start_time'),
|
|
|
+ first_queue_time=data.get('first_queue_time'), queue_start_time=data.get('queue_start_time'),
|
|
|
queue_end_time=data.get('queue_end_time'), overflow_count=data.get('overflow_count'),
|
|
|
uuid1=data.get('uuid1'), uuid2=data.get('uuid2'), cdr_notify_url=data.get('cdr_notify_url'),
|
|
|
- queue_level=data.get('queue_level'), device_list=device_list,
|
|
|
+ queue_level=data.get('queue_level'), device_list=data.get('device_list', []),
|
|
|
device_info_map=device_info_map, follow_data=follow_data, process_data=process_data,
|
|
|
next_commands=next_commands, call_details=call_details)
|
|
|
|
|
@@ -564,7 +568,7 @@ class CallInfo(BaseApi):
|
|
|
"answer_time": self.answer_time,
|
|
|
"end_time": self.end_time,
|
|
|
"talk_time": self.talk_time,
|
|
|
- "frist_queue_time": self.frist_queue_time,
|
|
|
+ "first_queue_time": self.first_queue_time,
|
|
|
"queue_start_time": self.queue_start_time,
|
|
|
"queue_end_time": self.queue_end_time,
|
|
|
"overflow_count": self.overflow_count,
|
|
@@ -572,20 +576,19 @@ class CallInfo(BaseApi):
|
|
|
"uuid2": self.uuid2,
|
|
|
"cdr_notify_url": self.cdr_notify_url,
|
|
|
"queue_level": self.queue_level,
|
|
|
- "device_list": [vars(x) for x in self.device_list],
|
|
|
+ "device_list": [x for x in self.device_list],
|
|
|
"device_info_map": {key: vars(value) for key, value in self.device_info_map.items()},
|
|
|
"follow_data": {key: vars(value) for key, value in self.follow_data.items()},
|
|
|
"process_data": {key: vars(value) for key, value in self.process_data.items()},
|
|
|
"next_commands": [vars(x) for x in self.next_commands],
|
|
|
"call_details": [vars(x) for x in self.call_details],
|
|
|
}
|
|
|
- print(new_dict)
|
|
|
return json.dumps(new_dict, default=lambda x: x.__dict__, ensure_ascii=False)
|
|
|
|
|
|
|
|
|
class DeviceInfo(BaseApi):
|
|
|
def __init__(self, cti_flow_id=None, call_id=None, conference=None, device_id=None, agent_key=None, agent_name=None, device_type=None,
|
|
|
- cdr_type=None, from_agent=None, caller=None, called=None, display=None, called_location=None,
|
|
|
+ cdr_type=0, from_agent=None, caller=None, called=None, display=None, called_location=None,
|
|
|
caller_location=None, call_time=None, ring_start_time=None, ring_end_time=None, answer_time=None,
|
|
|
bridge_time=None, end_time=None, talk_time=None, sip_protocol=None, channel_name=None,
|
|
|
hangup_cause=None, ring_cause=None, sip_status=None, record=None, record_time=None,
|