774056846 4 months ago
parent
commit
ced0f80657

+ 7 - 1
src/core/callcenter/acd.py

@@ -12,6 +12,7 @@ from apscheduler.schedulers.background import BackgroundScheduler
 from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED, FIRST_COMPLETED
 
 from src.core.callcenter.constant import saasId
+from src.core.callcenter.enumeration import AnswerFlag
 
 
 class AcdService:
@@ -26,7 +27,12 @@ class AcdService:
         # checkIdleScheduler.add_job(self.try_transfer_agent, 'interval', seconds=2, max_instances=1)
         # checkIdleScheduler.start()
 
-    def transfer_to_agent(self, call_info: CallInfo, device_id, service_id):
+    def transfer_to_agent(self, call_id, device_id, service_id):
+        call_info = Cache.get_call_info(call_id)
+        if not call_info:
+            return
+        call_info.answer_flag = AnswerFlag.TRANSFER_TO_AGENT.code
+        Cache.add_call_info(call_info)
         print('debugger::transfer_to_agent, come in ', flush=True)
         # 1. hold住并且播放等待音
         self.call_service.hold(call_info, device_id)

+ 1 - 0
src/core/callcenter/esl/client.py

@@ -585,6 +585,7 @@ class OutboundClient:
 
                     kwargs = json.loads(info.serialize('json'))
                     kwargs['variable_sip_h_P-LIBRA-CallId'] = call_id
+                    kwargs['variable_sip_h_P-LIBRA-DeviceId'] = device_id
                     destination = self.server.agent.register(**kwargs)
                     self.server.logger.info("debugger::device_id=%s, destination=%s, new_device_id=%s", device_id, destination, new_device_id)
 

+ 10 - 10
src/core/callcenter/esl/handler/channel_hangup_handler.py

@@ -22,8 +22,8 @@ class ChannelHangupHandler(EslEventHandler):
 
     def __init__(self, inbound_client, bot_agent, logger):
         super().__init__(inbound_client, bot_agent, logger)
-        self.acd_service = AcdService(inbound_client, logger)
-        self.call_service = CallService(inbound_client, logger)
+        # self.acd_service = AcdService(inbound_client, logger)
+        # self.call_service = CallService(inbound_client, logger)
 
     def handle(self, address, event, coreUUID):
         print(json.loads(event.serialize('json')), flush=True)
@@ -80,14 +80,14 @@ class ChannelHangupHandler(EslEventHandler):
             call.device_info_map[device.device_id] = device
             print('debugger::ChannelHangupHandler, hangup_reason=%s, device_type=%s' % (hangup_reason, device.device_type), flush=True)
             # 如果是转人工
-            if 'transferToAgent' == hangup_reason and DeviceType.ROBOT.code == device.device_type:
-                call.answer_flag = AnswerFlag.TRANSFER_TO_AGENT.code
-                service_id = EslEventUtil.getLIBRAServiceId(event)
-                call.transfer_agent = True
-                Cache.add_call_info(call)
-                print('debugger::ChannelHangupHandler, transferToAgent, service_id=%s' % (service_id), flush=True)
-                self.acd_service.transfer_to_agent(call, device_id, service_id)
-                return
+            # if 'transferToAgent' == hangup_reason and DeviceType.ROBOT.code == device.device_type:
+            #     call.answer_flag = AnswerFlag.TRANSFER_TO_AGENT.code
+            #     service_id = EslEventUtil.getLIBRAServiceId(event)
+            #     call.transfer_agent = True
+            #     Cache.add_call_info(call)
+            #     print('debugger::ChannelHangupHandler, transferToAgent, service_id=%s' % (service_id), flush=True)
+            #     self.acd_service.transfer_to_agent(call, device_id, service_id)
+            #     return
 
             # 如果有下一步
             next_command = call.next_commands[0] if len(call.next_commands) > 0 else None

+ 3 - 2
src/core/callcenter/views.py

@@ -12,7 +12,7 @@ from src.core.callcenter.call import CallService
 from src.core.callcenter.api import AgentCallRequest, AgentActionRequest, HangupCallRequest, \
     HumanServiceQueryRequest
 from src.core.voip.bot import BotAgent
-
+from .acd import AcdService
 
 agent = BotAgent(app.logger)
 inbound_client = InboundClient(agent, app.logger)
@@ -20,7 +20,8 @@ outbound_client = OutboundClient(agent, app.logger,app)
 call_service = CallService(inbound_client, app.logger)
 agent_service = AgentService(inbound_client, app.logger)
 agent_oper_service = AgentOperService(inbound_client, app.logger)
-
+acd_service = AcdService(inbound_client, app.logger)
+agent.acd_service = acd_service
 
 
 @app.route('/')

+ 11 - 2
src/core/voip/bot.py

@@ -11,6 +11,8 @@ import sys
 import pjsua2 as pj
 from enum import Enum
 
+from dns.resolver import Cache
+
 from src.core.datasource import SIP_SERVER, SERVE_HOST
 from src.core.voip.constant import *
 
@@ -181,6 +183,7 @@ class MyCall(pj.Call):
         self.player = None
         self.asr = None
         self.session_id = kwargs.get('variable_sip_h_P-LIBRA-CallId')
+        self.device_id = kwargs.get('variable_sip_h_P-LIBRA-DeviceId')
 
         print("self.session_id:", self.session_id)
         # self.scripts = build_demo_script()
@@ -355,8 +358,7 @@ class MyCall(pj.Call):
             self.agent.hangup(self.user_part)
         elif action_code == 'transfer':  # 转人工
             print('todo 转人工')
-            sip_headers = {'P-LIBRA-HangUpReason':'transferToAgent', 'P-LIBRA-ServiceId':'00000000000000000'}
-            self.agent.hangup(self.user_part, **sip_headers)
+            self.agent.transfer(self.user_part, self.session_id, self.device_id)
 
 class ToTextBotAgent:
     def __init__(self, user_asr_text, call_agent):
@@ -483,6 +485,7 @@ class BotAgent:
         self.calls = {}
         self.ep = pj.Endpoint()
         self.is_stopping = False
+        self.acd_service = None
         threading.Thread(target=self.create_pjsua2, daemon=True).start()
 
     def create_pjsua2(self):
@@ -541,6 +544,12 @@ class BotAgent:
         while not self.is_stopping:
             self.ep.libHandleEvents(100)
 
+    def transfer(self, user_part, call_id, device_id, service_id='00000000000000000'):
+        if self.acd_service:
+            self.acd_service.transfer_to_agent(call_id, device_id, service_id)
+        sip_headers = {'P-LIBRA-HangUpReason': 'transferToAgent', 'P-LIBRA-ServiceId': service_id}
+        self.hangup(user_part, **sip_headers)
+
     def hangup(self, user_part, reason="NORMAL_CLEARING", **sip_headers):
         call_op_param = pj.CallOpParam(True)
         call_op_param.statusCode = pj.PJSIP_SC_OK