|
@@ -117,9 +117,20 @@ class AgentOperService:
|
|
def idle_agent_exist(self, request: AgentActionRequest):
|
|
def idle_agent_exist(self, request: AgentActionRequest):
|
|
pass
|
|
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):
|
|
def _handle_idle(self, scene, agent):
|
|
agent_monitor = _get_agent_monitor(agent.saas_id, agent.agent_num)
|
|
agent_monitor = _get_agent_monitor(agent.saas_id, agent.agent_num)
|
|
if agent_monitor.check_state == AgentCheck.OUT.code:
|
|
if agent_monitor.check_state == AgentCheck.OUT.code:
|
|
@@ -179,7 +190,6 @@ class AgentOperService:
|
|
agent_scene = AgentScene.get_by_code(scene)
|
|
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)
|
|
self.push_handler.push_on_agent_work_report(agent.saas_id, "", agent.out_id, "", agent_scene, WorkStatus.AGENT_READY)
|
|
|
|
|
|
-
|
|
|
|
class AgentService:
|
|
class AgentService:
|
|
|
|
|
|
def __init__(self, client, logger):
|
|
def __init__(self, client, logger):
|
|
@@ -464,6 +474,7 @@ class AgentStateService:
|
|
self.inbound_client = client
|
|
self.inbound_client = client
|
|
self.logger = logger
|
|
self.logger = logger
|
|
self.redis_handler = RedisHandler()
|
|
self.redis_handler = RedisHandler()
|
|
|
|
+ self.assigned_recycle_millisecond = 60000
|
|
|
|
|
|
def idle(self, saas_id, agent_id, phone_num):
|
|
def idle(self, saas_id, agent_id, phone_num):
|
|
# HumanService 这个地方没实现 没看明白
|
|
# HumanService 这个地方没实现 没看明白
|
|
@@ -520,7 +531,15 @@ class AgentStateService:
|
|
self.update_report_state(saas_id, service_id)
|
|
self.update_report_state(saas_id, service_id)
|
|
|
|
|
|
def busy_hash(self, saas_id, agent_id, phone_num, 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):
|
|
def get_cache_agent_map(self, saas_id, service_id):
|
|
cache_agent_list = self.get_cache_agent_list(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 转换为字典
|
|
# 使用字典推导式将 cache_agent_list 转换为字典
|
|
return {agent.phone_num: agent for agent in 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):
|
|
def get_cache_agent_list(self, saas_id, service_id):
|
|
redis_key = self._key(saas_id, service_id)
|
|
redis_key = self._key(saas_id, service_id)
|
|
map_cache_by_key = self.redis_handler.redis.get(redis_key, str)
|
|
map_cache_by_key = self.redis_handler.redis.get(redis_key, str)
|
|
@@ -553,6 +566,25 @@ class AgentStateService:
|
|
free_agents.append(agent_status_data)
|
|
free_agents.append(agent_status_data)
|
|
return free_agents
|
|
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):
|
|
def get_agent_service_busy_size(self, saas_id, service_id):
|
|
busy_agents_size = 0
|
|
busy_agents_size = 0
|
|
cache_agent_list = self.get_cache_agent_list(saas_id, service_id)
|
|
cache_agent_list = self.get_cache_agent_list(saas_id, service_id)
|