Bladeren bron

feat: init

余尚辉 4 maanden geleden
bovenliggende
commit
aa54adb416
3 gewijzigde bestanden met toevoegingen van 63 en 16 verwijderingen
  1. 43 11
      src/core/callcenter/agent.py
  2. 18 3
      src/core/callcenter/push.py
  3. 2 2
      src/core/callcenter/views.py

+ 43 - 11
src/core/callcenter/agent.py

@@ -117,9 +117,20 @@ class AgentOperService:
     def idle_agent_exist(self, request: AgentActionRequest):
         pass
 
-    def turn_on(self, request: AgentActionRequest):
-        pass
+    def turn_on(self, req: AgentActionRequest):
+        agent = _get_agent(req.saas_id, req.agent_number, req.out_id)
+        agent_monitor = _get_agent_monitor(req.saas_id, req.agent_number)
+        agent_scene = AgentScene.get_by_code(req.scene)
+        if not agent_monitor:
+            raise BizException(BizErrorCode.RECORD_NOT_EXIST_ERROR)
 
+        if agent_monitor.service_state == AgentServiceState.CALLING.code:
+            self.push_handler.push_on_agent_report(agent.saas_id, agent.out_id, agent_scene, AgentServiceState.BUSY)
+            return
+
+        self.agent_monitor_service.update_calling(agent_monitor)
+        self.agent_state_service.busy(agent.saas_id, agent.out_id, agent.phone_num)
+        self.push_handler.push_on_agent_report(agent.saas_id, agent.out_id, agent_scene, AgentServiceState.BUSY)
     def _handle_idle(self, scene, agent):
         agent_monitor = _get_agent_monitor(agent.saas_id, agent.agent_num)
         if agent_monitor.check_state == AgentCheck.OUT.code:
@@ -179,7 +190,6 @@ class AgentOperService:
         agent_scene = AgentScene.get_by_code(scene)
         self.push_handler.push_on_agent_work_report(agent.saas_id, "", agent.out_id, "", agent_scene, WorkStatus.AGENT_READY)
 
-
 class AgentService:
 
     def __init__(self, client, logger):
@@ -464,6 +474,7 @@ class AgentStateService:
         self.inbound_client = client
         self.logger = logger
         self.redis_handler = RedisHandler()
+        self.assigned_recycle_millisecond = 60000
     
     def idle(self, saas_id, agent_id, phone_num):
         # HumanService 这个地方没实现 没看明白
@@ -520,7 +531,15 @@ class AgentStateService:
         self.update_report_state(saas_id, service_id)
 
     def busy_hash(self, saas_id, agent_id, phone_num, service_id):
-        pass
+        cache_agent_map = self.get_cache_agent_map(saas_id, service_id)
+        state_data = cache_agent_map[phone_num]
+        key = self._key(saas_id, service_id)
+        if state_data is None:
+            return
+        state_data.status = HumanState.BUSY.code
+        self.redis_handler.redis.hset(key, phone_num, state_data.to_json_string())
+        self.redis_handler.redis.expire(key, self._get_expire_time())
+        self.update_report_state(saas_id, service_id)
 
     def get_cache_agent_map(self, saas_id, service_id):
         cache_agent_list = self.get_cache_agent_list(saas_id, service_id)
@@ -531,13 +550,7 @@ class AgentStateService:
         # 使用字典推导式将 cache_agent_list 转换为字典
         return {agent.phone_num: agent for agent in cache_agent_list}
 
-    def get_agent_service_idle_size(self, saas_id, service_id):
-        idle_agents_size = 0
-        cache_agent_list = self.get_cache_agent_list(saas_id, service_id)
-        if cache_agent_list:  # 检查列表是否非空
-            idle_agents = self.get_idle_agents(cache_agent_list)
-            idle_agents_size = len(idle_agents)  # 获取空闲代理的数量
-        return idle_agents_size
+
     def get_cache_agent_list(self, saas_id, service_id):
         redis_key = self._key(saas_id, service_id)
         map_cache_by_key = self.redis_handler.redis.get(redis_key, str)
@@ -553,6 +566,25 @@ class AgentStateService:
             free_agents.append(agent_status_data)
         return free_agents
 
+    def get_idle_agents(self,cache_agent_list):
+        current_time =int(datetime.utcnow().timestamp() * 1000)  # 获取当前时间的毫秒级时间戳
+        idle_agents = [
+            agent for agent in cache_agent_list
+            if agent.status == 1 and (
+                    agent.assign_time == 0 or
+                    agent.assign_time + self.assigned_recycle_millisecond < current_time
+            )
+        ]
+        return idle_agents
+
+    def get_agent_service_idle_size(self, saas_id, service_id):
+        idle_agents_size = 0
+        cache_agent_list = self.get_cache_agent_list(saas_id, service_id)
+        if cache_agent_list:  # 检查列表是否非空
+            idle_agents = self.get_idle_agents(cache_agent_list)
+            idle_agents_size = len(idle_agents)  # 获取空闲代理的数量
+        return idle_agents_size
+
     def get_agent_service_busy_size(self, saas_id, service_id):
         busy_agents_size = 0
         cache_agent_list = self.get_cache_agent_list(saas_id, service_id)

+ 18 - 3
src/core/callcenter/push.py

@@ -4,7 +4,7 @@ import json
 from src.core.callcenter.enumeration import AgentScene, AgentServiceState, WorkStatus, DownEvent
 from src.core.callcenter.ws import common_down_data, common_down_cmd
 
-
+from src.core.callcenter.dao import *
 class PushHandler:
     def __init__(self, logger):
         self.logger = logger
@@ -12,11 +12,11 @@ class PushHandler:
     # def push_on_agent_report(self, saas_id, out_id, scene: AgentScene, service_state: AgentServiceState):
     #     pass
 
-    def push_on_agent_work_report(self, saas_id, flow_id, user_id, call_id, scene: AgentScene, work_status: WorkStatus):
+    def push_on_agent_work_report(self, saas_id, flow_id, user_id, call_id, scene: AgentScene, work_status: WorkStatus,description):
         data = {
             'eventName': DownEvent.ON_AGENT_WORK_REPORT.code,
             'ext': {'workStatus': work_status.code,
-                    'description': work_status.description,
+                    'description': description or work_status.description,
                     'callId': call_id,
                     'ctiFlowId': flow_id,
                     'scene': scene.code
@@ -24,3 +24,18 @@ class PushHandler:
         }
         self.logger.info("flowId:[%s] OnAgentWorkReport push:[%s].", flow_id, json.dumps(data))
         common_down_data(user_id, data)
+    def push_on_agent_report(self, saas_id, out_id, scene: AgentScene, service_state: AgentServiceState):
+       pass
+
+    def do_push_on_agent_report(self, saas_id, out_id, scene: AgentScene, service_state: AgentServiceState):
+        data = {
+            'eventName': DownEvent.ON_AGENT_REPORT.code,
+            'ext': {
+                'scene': scene.code,
+                '_shortagentid': out_id,
+                '_astate': service_state.code,
+                '_atime': datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S")
+            }
+        }
+        self.logger.info("OnAgentReport event triger:", json.dumps(data))
+        common_down_data(out_id, data)

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

@@ -91,7 +91,7 @@ def busy():
     """坐席置忙"""
     data = request.get_json()
     param = AgentActionRequest.from_json(data=data)
-    return agent_oper_service.checkin(param)
+    return agent_oper_service.busy(param)
 
 
 @app.route('/open/agent/idle', methods=['POST'])
@@ -99,7 +99,7 @@ def idle():
     """坐席置闲"""
     data = request.get_json()
     param = AgentActionRequest.from_json(data=data)
-    return agent_oper_service.checkin(param)
+    return agent_oper_service.idle(param)
 
 
 @app.route('/open/agent/turn-on', methods=['POST'])