余尚辉 4 ماه پیش
والد
کامیت
41be906736

+ 2 - 1
src/core/callcenter/call.py

@@ -5,7 +5,7 @@ import time
 from datetime import datetime
 from src.core.callcenter.cache import Cache
 from src.core.callcenter.constant import saasId, HOLD_MUSIC_PATH
-from src.core.callcenter.enumeration import CallCause, Direction, NextType, DeviceType, CdrType, AgentServiceState
+from src.core.callcenter.enumeration import CallCause, Direction, NextType, DeviceType, CdrType, AgentServiceState, AgentScene,WorkStatus
 from src.core.callcenter.api import AgentCallRequest, CallInfo, HangupCallRequest, CheckInCallRequest, \
     DeviceInfo, NextCommand, MakeCallContext
 from src.core.callcenter.esl.constant.sip_header_constant import sipHeaderServiceId, sipHeaderCtiFlowId
@@ -58,6 +58,7 @@ class CallService:
         })
         # 变更坐席状态为拨号中
         self.dataHandleServer.update_agent_monitor_service_state(request.agent_id, AgentServiceState.DIALING.code)
+        self.push_handler.push_on_agent_work_report(request.saas_id, request.cti_flow_id, request.agent_id, call_id, AgentScene.ROBOT, WorkStatus.AGENT_HANG_IDLE)
         return call_id
 
     def hold(self, call_info: CallInfo, device_id):

+ 3 - 16
src/core/callcenter/esl/client.py

@@ -482,27 +482,15 @@ class OutboundClient:
         server_thread.daemon = True  # 设置守护线程
         server_thread.start()
 
-    # 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.logger.info("Whitelist updated: %s", self.whitelist)
 
     def refresh_whitelist(self):
         while True:
             time.sleep(3600) # 每 1小时 更新一次
-            self.dataHandleServer.update_whitelist()
+            self.whitelist = self.dataHandleServer.update_whitelist()
 
     def load_whitelist(self):
         return self.whitelist
 
-    # def load_agent_monitor(self):
-    #     with self.app.app_context():
-    #         agents = AgentMonitor.query.filter_by(check_state=0,service_state=2).all()
-    #         agent_nums = [agent.agent_num for agent in agents]
-    #         return agent_nums
-
-
     class ESLRequestHandler(socketserver.BaseRequestHandler):
         def setup(self):
             try:
@@ -599,18 +587,17 @@ class OutboundClient:
 
 
     class CustomTCPServer(socketserver.TCPServer):
-        def __init__(self, server_address, RequestHandlerClass, agent, app,whitelist_loader,load_agent_monitor,dataHandleServer):
+        def __init__(self, server_address, RequestHandlerClass, agent, app,whitelist_loader,dataHandleServer):
             self.agent = agent
             self.cache = Cache(app)
             self.logger = app.logger
             self.load_whitelist = whitelist_loader
-            self.load_agent_monitor = load_agent_monitor
             self.dataHandleServer = dataHandleServer
             super().__init__(server_address, RequestHandlerClass)
 
     def start(self, HOST='0.0.0.0', PORT=8084, agent=None):
         # HOST, PORT = "0.0.0.0", 8084
         # 创建一个 TCP 服务器
-        with self.CustomTCPServer((HOST, PORT), self.ESLRequestHandler, agent, self.app, self.load_whitelist, self.load_agent_monitor,self.dataHandleServer) as server:
+        with self.CustomTCPServer((HOST, PORT), self.ESLRequestHandler, agent, self.app, self.load_whitelist, self.dataHandleServer) as server:
             self.logger.info(f"ESL server listening on {HOST}:{PORT}")
             server.serve_forever()

+ 7 - 0
src/core/callcenter/esl/handler/channel_answer_handler.py

@@ -119,6 +119,13 @@ class ChannelAnswerHandler(EslEventHandler):
         # 转接电话 deviceInfo为被转接设备
         from_device_id = next_command.device_id
         device_id = EslEventUtil.getDeviceId(event)
+
+        # 启用录音, 生产时候打开
+        call_id = call.call_id
+        record = get_record_prefix(call) + '/' + call_id + '.wav'
+        self.inbound_client.record(device_id, 'start', record, 0)
+        self.dataHandleServer.update_record(call_id, {"url": record})
+
         call.next_commands.append(NextCommand(device_id, NextType.NEXT_TRANSFER_SUCCESS.code, call.device_list[1]))
         print("转接电话中 callId:%s, from:%s, to:%s "% (call.call_id, from_device_id, device_id), flush=True)
         self.inbound_client.transfer_call(device_id, next_command.next_value)

+ 15 - 6
src/core/callcenter/esl/handler/channel_hangup_handler.py

@@ -8,7 +8,7 @@ import traceback
 from src.core.callcenter.acd import AcdService
 from src.core.callcenter.call import CallService
 from src.core.callcenter.enumeration import CallType, DeviceType, AnswerFlag, NextType, CdrType, HangupDir, \
-    CallCause,AgentServiceState, AgentScene
+    CallCause,AgentServiceState, AgentScene,WorkStatus
 from src.core.callcenter.esl.annotation import EslEventName
 import src.core.callcenter.esl.utils.esl_event_util as EslEventUtil
 from src.core.callcenter.esl.constant.event_names import CHANNEL_HANGUP
@@ -80,9 +80,8 @@ class ChannelHangupHandler(EslEventHandler):
             if device.record_start_time:
                 device.record_time = int(device.end_time) - int(device.record_start_time)
             call.device_info_map[device.device_id] = device
-            # print("ceshiyix shijian",device)
-            # 更新通话记录
-            # self.dataHandleServer.update_record(call_id, {"time_end": datetime.fromtimestamp(int(device.end_time)),"times":device.talk_time})
+
+
 
             print('debugger::ChannelHangupHandler, hangup_reason=%s, device_type=%s' % (hangup_reason, device.device_type), flush=True)
             # 如果是转人工
@@ -111,9 +110,19 @@ class ChannelHangupHandler(EslEventHandler):
             self.hangup_dir(call, device, cause)
             self.cache.add_call_info(call)
 
-            if len(call.device_list)==0 and device.device_type == DeviceType.AGENT.code:
-                self.dataHandleServer.update_agent_monitor_service_state(device_id, AgentServiceState.IDLE.code)
+            # 全部挂机以后推送挂机状态
+            if len(call.device_list)==0:
+                # 计算当前通话时长
+                if call.answer_time:
+                    call.end_time = timestamp
+                    call.talk_time = int(call.end_time) - int(call.answer_time)
                 self.push_handler.push_on_call_end(saas_id=call.saas_id, flow_id=call.cti_flow_id, user_id=call.agent_key)
+                self.dataHandleServer.update_record(call_id, {"time_end": datetime.utcnow(),"times":call.talk_time // 1000})
+
+            # 更新坐席状态
+            if device.device_type == DeviceType.AGENT.code:
+                self.dataHandleServer.update_agent_monitor_service_state(device_id, AgentServiceState.IDLE.code)
+                self.push_handler.push_on_agent_work_report(call.saas_id, call.cti_flow_id, call.agent_key, call.call_id, AgentScene.ROBOT,WorkStatus.AGENT_DIALING)
         except:
             traceback.print_exc()