|
@@ -27,7 +27,7 @@ import src.core.callcenter.esl.utils.esl_event_util as EslEventUtil
|
|
|
import src.core.callcenter.esl.handler as event_handler
|
|
|
from src.core.callcenter.esl.constant.sip_header_constant import sipHeaderHoldMusic, profile1, profile2, sipHeaderCallId
|
|
|
from src.core.callcenter.enumeration import CallCause, DeviceType, DelayActionEnum, HangupDir, CallType, NextType, \
|
|
|
- Direction, CdrType, BizErrorCode
|
|
|
+ Direction, CdrType, BizErrorCode, WhiteTypeEnum
|
|
|
from src.core.callcenter.esl.handler.default_esl_event_handler import DefaultEslEventHandler
|
|
|
from src.core.callcenter.snowflake import Snowflake
|
|
|
from src.core.datasource import SERVE_HOST
|
|
@@ -184,7 +184,7 @@ class InboundClient:
|
|
|
|
|
|
self.cache.add_call_info(call_info)
|
|
|
self.hangup_call(call_id, device_id, CallCause.CALL_TIMEOUT)
|
|
|
- self.dataHandleServer.update_record(call_id, status= 0)
|
|
|
+ # self.dataHandleServer.update_record(call_id, status= 0)
|
|
|
|
|
|
def exec_when_play_timeout(self, call_id):
|
|
|
call_info = self.cache.get_call_info(call_id)
|
|
@@ -213,7 +213,7 @@ class InboundClient:
|
|
|
next_command = NextCommand(device_id = device_id, next_type=NextType.NEXT_HANGUP.code)
|
|
|
call_info.next_commands = [next_command]
|
|
|
self.cache.add_call_info(call_info)
|
|
|
- self.dataHandleServer.update_record(call_id, status= 0)
|
|
|
+ # self.dataHandleServer.update_record(call_id, status= 0)
|
|
|
self.logger.info("waitingTimeOut 开始播放结束音乐 callId:%s customerDeviceId:%s playFile:%s", call_id,
|
|
|
device_id, WaitingHangupMusicPath)
|
|
|
|
|
@@ -519,7 +519,7 @@ class OutboundClient:
|
|
|
if con.connected():
|
|
|
info = con.getInfo()
|
|
|
|
|
|
- # self.logger.info(json.loads(info.serialize('json')))
|
|
|
+ self.server.logger.info(json.loads(info.serialize('json')))
|
|
|
event_name = info.getHeader("Event-Name")
|
|
|
self.server.logger.info('Event-Name: %s', event_name)
|
|
|
device_id = info.getHeader("unique-id")
|
|
@@ -532,37 +532,36 @@ class OutboundClient:
|
|
|
kwargs['variable_sip_h_P-LIBRA-CallId'] = call_id
|
|
|
kwargs['variable_sip_h_P-LIBRA-DeviceId'] = device_id
|
|
|
|
|
|
- _bucket_call_type = 2
|
|
|
+ bucket_call_type = 2
|
|
|
destination = None
|
|
|
service_category = 0
|
|
|
bucket = self.server.get_bucket(call_id)
|
|
|
whitelist = self.server.get_whitelist()
|
|
|
- self.server.logger.info('call incoming call_id=%s, device_id=%s, bucket=%s', call_id, device_id, bucket.name)
|
|
|
- self.server.logger.info('call incoming caller_number=%s, whitelist=%s', caller_number, json.dumps(whitelist))
|
|
|
-
|
|
|
- if self.in_whitelist(caller_number, whitelist):
|
|
|
- # 检查白名单
|
|
|
- _bucket_call_type = 0
|
|
|
- self.answer(con, call_id, device_id)
|
|
|
- self.build_call_info(CallType.INCOMING_AGENT_CALL.code, call_id, device_id, new_device_id, destination=None, bucket_type=_bucket_call_type, **kwargs)
|
|
|
- self.server.agent.acd_service.transfer_to_agent(call_id, device_id)
|
|
|
- elif bucket and bucket.name == 'AI':
|
|
|
- #转到ai机器人
|
|
|
- _bucket_call_type = 1
|
|
|
- service_category = 1
|
|
|
- destination = self.server.agent.register(**kwargs)
|
|
|
- self.server.logger.info("device_id=%s, destination=%s, new_device_id=%s" % (device_id, destination, new_device_id))
|
|
|
- self.build_call_info(CallType.INCOMING_BOT_CALL.code, call_id, device_id, new_device_id, str(destination), bucket_type=_bucket_call_type, **kwargs)
|
|
|
- self.server.cache.add_device_user_part(device_id, destination)
|
|
|
- con.execute("bridge", "{sip_h_P-LIBRA-CallId=%s,sip_h_P-LIBRA-DeviceId=%s,origination_uuid=%s}user/%s" % (call_id, new_device_id, new_device_id, destination), device_id)
|
|
|
+ in_whitelist_type = self.in_whitelist(caller_number, whitelist)
|
|
|
+ user_name = None
|
|
|
+ self.server.logger.info('call incoming call_id=%s, caller_number=%s, device_id=%s, new_device_id=%s, in_whitelist=%s, bucket=%s', call_id, caller_number, device_id, new_device_id, in_whitelist_type, bucket.name)
|
|
|
+ # 检查白名单
|
|
|
+ if in_whitelist_type:
|
|
|
+ if WhiteTypeEnum.AI == in_whitelist_type:
|
|
|
+ bucket_call_type = 0
|
|
|
+ service_category = 1
|
|
|
+ destination = self.bridge_ai(con, bucket_call_type, call_id, device_id, new_device_id, **kwargs)
|
|
|
+ user_name = f"机器人{destination}"
|
|
|
+ else:
|
|
|
+ bucket_call_type = 0
|
|
|
+ self.transfer_custom(con, bucket_call_type, call_id, device_id, new_device_id, **kwargs)
|
|
|
else:
|
|
|
- # 传统服务
|
|
|
- self.answer(con, call_id, device_id)
|
|
|
- self.build_call_info(CallType.INCOMING_AGENT_CALL.code, call_id, device_id, new_device_id, destination=None, bucket_type=_bucket_call_type, **kwargs)
|
|
|
- self.server.agent.acd_service.transfer_to_agent(call_id, device_id)
|
|
|
-
|
|
|
- registry.CALL_INCOMING_REQUESTS.labels(f"{_bucket_call_type}").inc()
|
|
|
- self.server.dataHandleServer.create_record(call_id, caller_number, _bucket_call_type, service_category=service_category, user_id=destination if _bucket_call_type == 1 else None , user_name= f"机器人{destination}" if _bucket_call_type ==1 else None)
|
|
|
+ # 自然分流
|
|
|
+ if bucket and bucket.name == 'AI':
|
|
|
+ bucket_call_type = 1
|
|
|
+ service_category = 1
|
|
|
+ destination = self.bridge_ai(con, bucket_call_type, call_id, device_id, new_device_id, **kwargs)
|
|
|
+ user_name = f"机器人{destination}"
|
|
|
+ else:
|
|
|
+ self.transfer_custom(con, bucket_call_type, call_id, device_id, new_device_id, **kwargs)
|
|
|
+
|
|
|
+ registry.CALL_INCOMING_REQUESTS.labels(f"{bucket_call_type}").inc()
|
|
|
+ self.server.dataHandleServer.create_record(call_id, caller_number, bucket_call_type, service_category=service_category, user_id=destination if user_name else None, user_name= user_name)
|
|
|
|
|
|
try:
|
|
|
con.disconnect()
|
|
@@ -581,11 +580,26 @@ class OutboundClient:
|
|
|
# Ignore the error if socket is already closed
|
|
|
pass
|
|
|
|
|
|
+ def transfer_custom(self, con, bucket_call_type, call_id, device_id, new_device_id, **kwargs):
|
|
|
+ self.answer(con, call_id, device_id)
|
|
|
+ self.build_call_info(CallType.INCOMING_AGENT_CALL.code, call_id, device_id, new_device_id, destination=None, bucket_type=bucket_call_type, **kwargs)
|
|
|
+ self.server.agent.acd_service.transfer_to_agent(call_id, device_id)
|
|
|
+
|
|
|
+ def bridge_ai(self, con, bucket_call_type, call_id, device_id, new_device_id, **kwargs):
|
|
|
+ destination = self.server.agent.register(**kwargs)
|
|
|
+ self.server.logger.info("call_id=%s, device_id=%s, destination=%s, new_device_id=%s" % (call_id, device_id, destination, new_device_id))
|
|
|
+ self.build_call_info(CallType.INCOMING_BOT_CALL.code, call_id, device_id, new_device_id, str(destination), bucket_type=bucket_call_type, **kwargs)
|
|
|
+ self.server.cache.add_device_user_part(device_id, destination)
|
|
|
+ con.execute("bridge", "{sip_h_P-LIBRA-CallId=%s,sip_h_P-LIBRA-DeviceId=%s,origination_uuid=%s}user/%s" % (call_id, new_device_id, new_device_id, destination), device_id)
|
|
|
+ return destination
|
|
|
+
|
|
|
def in_whitelist(self, caller_number, whitelist):
|
|
|
for x in whitelist:
|
|
|
- if caller_number in x or caller_number in x:
|
|
|
- return True
|
|
|
- return False
|
|
|
+ phone, _type = x
|
|
|
+ if caller_number in phone or phone in caller_number:
|
|
|
+ return WhiteTypeEnum.get_by_code(_type)
|
|
|
+
|
|
|
+ return None
|
|
|
|
|
|
def answer(self, con, call_id, device_id, timeouts=30):
|
|
|
con.execute("answer", "", device_id)
|
|
@@ -641,7 +655,7 @@ class OutboundClient:
|
|
|
self.cache_job_scheduler.add_job(self.update_cache_job, run_date=datetime.now())
|
|
|
self.cache_job_scheduler.add_job(self.update_cache_job, 'interval', seconds=60, max_instances=1, name='cache_job_daemon')
|
|
|
self.cache_job_scheduler.add_job(self.update_whitelist, run_date=datetime.now())
|
|
|
- self.cache_job_scheduler.add_job(self.update_whitelist, 'interval', seconds=600, max_instances=1,name='cache_job_whiteList')
|
|
|
+ self.cache_job_scheduler.add_job(self.update_whitelist, 'interval', seconds=60, max_instances=1,name='cache_job_whiteList')
|
|
|
self.cache_job_scheduler.start()
|
|
|
|
|
|
def update_cache_job(self):
|
|
@@ -653,7 +667,7 @@ class OutboundClient:
|
|
|
def update_whitelist(self):
|
|
|
with self.app.app_context():
|
|
|
phones = Whitelist.query.filter_by(del_flag=0).all()
|
|
|
- self.whitelist = [phone.phone for phone in phones]
|
|
|
+ self.whitelist = [(phone.phone, phone.type) for phone in phones]
|
|
|
self.logger.info("Whitelist updated: %s", self.whitelist)
|
|
|
|
|
|
def get_whitelist(self):
|