Procházet zdrojové kódy

连续报警功能模块开发

Davidliu před 3 měsíci
rodič
revize
d28ded3b61

+ 17 - 5
src/core/callcenter/agent.py

@@ -269,12 +269,11 @@ class AgentOperService:
         self.agent_actionlog_service = AgentActionLogService(app)
         self.agent_state_service = AgentStateService(app)
 
-        # self.daemon_stopping = False
         self.agent_heartbeat_expire = 30
+        self.agent_serial_live_expire = 60*10
         self.agent_heartbeat_job_scheduler = BackgroundScheduler()
         self.agent_heartbeat_job_scheduler.add_job(self.agent_heartbeat_daemon, 'interval', seconds=1, max_instances=1, name='agent_heartbeat_daemon')
         self.agent_heartbeat_job_scheduler.start()
-        # threading.Thread(target=self.agent_heartbeat_daemon).start()
 
     def agent_heartbeat_daemon(self):
         def check_out_daemon(_name, key, value):
@@ -287,20 +286,33 @@ class AgentOperService:
             except:
                 traceback.print_exc()
 
-        # while not self.daemon_stopping:
+        def check_agent_live_daemon(_members):
+            key = '' % SAAS_ID
+            pre_val = self.redis_handler.redis.get(key)
+            if not pre_val:
+                if not _members or len(_members) == 0:
+                    value = datetime.now().timestamp()
+                    self.redis_handler.redis.set(key, value, ex=60*60, nx=True)
+            else:
+                diff = datetime.now().timestamp() - float(pre_val)
+                if diff > self.agent_serial_live_expire:
+                    self.logger.warn('WARING::live agent count less than 1 serial ten minutes')
+
+                if _members and len(_members) > 0:
+                    self.redis_handler.redis.delete(key)
+
         name = CENTER_AGENT_HEARTBEAT % SAAS_ID
         members = self.redis_handler.redis.hgetall(name)
+        check_agent_live_daemon(members)
         if not members:
             return
 
         registry.MANUAL_AGENT_LIVES.set(len(members))
         for k,v in members.items():
             check_out_daemon(name, k, v)
-        # time.sleep(1)
 
     def __del__(self):
         self.agent_heartbeat_job_scheduler.shutdown()
-        # self.daemon_stopping = True
 
     @with_app_context
     def enable(self, req: AgentActionRequest):

+ 32 - 0
src/core/callcenter/cache.py

@@ -4,6 +4,7 @@
 import json
 import sys
 import time
+import traceback
 import uuid
 from datetime import datetime
 
@@ -238,3 +239,34 @@ class Cache:
         self.logger.info("set_pjsua_thread_lock")
         return self.redis_handler.redis.set(key, "1", ex=expire, nx=True)
 
+    def get_serial_no_answer_cnt(self, call_info:CallInfo):
+        try:
+            if call_info.hangup_count >= call_info.answer_count:
+                key = CALL_SERIAL_NO_ANSWER % SAAS_ID
+                self.logger.info('get_serial_no_answer_cnt:call_id=%s, call_time_length=%s', call_info.call_id, call_info.answer_count)
+                if call_info.answer_count <= 0:
+                    self.redis_handler.redis.sadd(key, call_info.call_id)
+                    return self.redis_handler.redis.scard(key)
+                else:
+                    self.redis_handler.redis.delete(key)
+        except Exception as e:
+            traceback.print_exc()
+            self.logger.info('get_serial_no_answer_cnt:exception, msg:%s',e )
+        return 0
+
+    def get_serial_speed_hangup_cnt(self, call_info:CallInfo):
+        try:
+            if call_info.hangup_count >= call_info.answer_count:
+                now = datetime.now().timestamp()
+                key = CALL_SERIAL_SPEED_HANGUP % SAAS_ID
+                call_len = now - call_info.call_time
+                self.logger.info('get_serial_speed_hangup_cnt:call_id=%s, call_time_length=%s', call_info.call_id, call_len)
+                if call_len <= CALL_SERIAL_SPEED_HANGUP_OFFSET:
+                    self.redis_handler.redis.sadd(key, call_info.call_id)
+                    return self.redis_handler.redis.scard(key)
+                else:
+                    self.redis_handler.redis.delete(key)
+        except Exception as e:
+            traceback.print_exc()
+            self.logger.info('get_serial_speed_hangup_cnt:exception, msg:%s',e)
+        return 0

+ 3 - 0
src/core/callcenter/constant.py

@@ -82,6 +82,7 @@ CALL_INFO = "CALL_INFO:"
 START_AGENT_NUM = "1000"
 
 DELAY_ACTION_BATCH_SIZE = 10
+CALL_SERIAL_SPEED_HANGUP_OFFSET = 5
 CENTER_AGENT_HEARTBEAT = "CENTER:AGENT:HEARTBEAT:%s"
 CTI_ENGINE_DELAY_ACTION = "DELAY:ACTION:%s"
 CTI_ENGINE_DELAY_ACTION_LOCK = "DELAY:ACTION:LOCK:%s"
@@ -91,6 +92,8 @@ CTI_MANAGE_CENTER_CALL_END_KEY = "CTI:MANAGE:CENTER:CALL:END:KEY:%s"
 CTI_AGENT_MANUAL_ANSWER = "AGENT:MANUAL:ANSWER:%s:%s"
 BOT_REGISTER_PER_HOURS = "BOT:REGISTER:PER_HOURS:%s"
 BOT_PJSUA_THREAD_LOCK = "BOT:PJSUA:THREAD:LOCK:%s"
+CALL_SERIAL_NO_ANSWER = "CALL:SERIAL:NO_ANSWER:%s"
+CALL_SERIAL_SPEED_HANGUP = "CALL:SERIAL:SPEED:HANGUP:%s"
 
 def get_json_dict(json_text=None):
     if isinstance(json_text, str):

+ 11 - 0
src/core/callcenter/esl/handler/channel_hangup_handler.py

@@ -133,6 +133,8 @@ class ChannelHangupHandler(EslEventHandler):
             # if len(call_info.device_list) == 0:
                 self.get_call_info_record(call_info)
 
+            # 连续报警判断
+            self.hook_serial_warn(call_info)
             # 判断挂机方向 && 更新缓存
             self.hangup_dir(call_info, device_info, cause)
             self.cache.add_call_info(call_info, persistent=True)
@@ -140,6 +142,15 @@ class ChannelHangupHandler(EslEventHandler):
         except:
             traceback.print_exc()
 
+    def hook_serial_warn(self, call_info:CallInfo):
+        no_answer_cnt = self.cache.get_serial_no_answer_cnt(call_info)
+        if no_answer_cnt >=5:
+            self.logger.warn('WARING::serial_no_answer_cnt greater than 5')
+
+        no_speed_hangup_cnt = self.cache.get_no_speed_hangup_cnt(call_info)
+        if no_speed_hangup_cnt >=3:
+            self.logger.warn('WARING::no_speed_hangup_cnt greater than 3')
+
     def get_call_id(self, event):
         call_id = EslEventUtil.getCallId(event)
         device_id = EslEventUtil.getDeviceId(event)