cache.py 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #!/usr/bin/env python3
  2. # encoding:utf-8
  3. import json
  4. import sys
  5. import time
  6. import uuid
  7. from datetime import datetime
  8. from src.core.callcenter.constant import *
  9. from src.core.callcenter.api import AgentInfo, CallInfo, RouteGateway
  10. from src.core.callcenter.dao import Agent, Phone
  11. from src.core.callcenter.data_handler import DataHandleServer
  12. from src.core.datasource import RedisHandler
  13. class Cache:
  14. def __init__(self, app):
  15. self.cacheDay = 7
  16. self.deviceCall = {}
  17. self.deviceUserPart = {}
  18. self.logger = app.logger
  19. self.redis_handler = RedisHandler()
  20. self.dataHandleServer = DataHandleServer(app)
  21. def get_agent_info(self, saas_id, agent_number):
  22. text = self.redis_handler.get(AGENT_INFO + saas_id + ":" + agent_number)
  23. self.logger.info('get_agent_info %s %s %s'%(saas_id, agent_number, text))
  24. if text:
  25. return AgentInfo.from_json(text)
  26. phone = self.dataHandleServer.get_agent_phone(saas_id, agent_number)
  27. agent_info = AgentInfo(saas_id=saas_id, sip_server=phone.sip_server, agent_number=agent_number)
  28. self.logger.info('get_agent_info %s %s %s'% (saas_id, agent_number, agent_info))
  29. self.add_agent_info(agent=agent_info)
  30. sys.stdout.flush() # 强制刷新输出缓冲区
  31. return agent_info
  32. def refresh_agent_token(self, agent_number, token):
  33. self.redis_handler.set(AGENT_TOKEN + token, agent_number, self.cacheDay * 24 * 60 * 60)
  34. def delete_key(self, key):
  35. self.redis_handler.redis.delete(key)
  36. def get_agent_number(self, token):
  37. return self.redis_handler.get(AGENT_TOKEN + token)
  38. # 缓存坐席
  39. def add_agent_info(self, call_info: CallInfo = None, agent: AgentInfo = None, call_id=None, device_id=None):
  40. if call_info and not agent:
  41. agent = self.get_agent_info(call_info.saas_id, call_info.agent_key)
  42. if not agent:
  43. return
  44. if call_id:
  45. agent.call_id = call_id
  46. if device_id:
  47. agent.device_id = device_id
  48. self.redis_handler.set(AGENT_INFO + agent.saas_id + ":" + agent.agent_number, agent.to_json_string(), self.cacheDay * 24 * 60 * 60)
  49. # 缓存CALL_INFO
  50. def add_call_info(self, call: CallInfo):
  51. for k, v in call.device_info_map.items():
  52. self.add_device(k, call.call_id)
  53. # print('liuwei::debugger::add_call_info call_id:%s, call=%s'% (call.call_id, call))
  54. self.redis_handler.set(CALL_INFO + call.call_id, call.to_json_string(), self.cacheDay * 24 * 60 * 60)
  55. def get_call_id_by_device_id(self, device_id):
  56. call_id = self.deviceCall.get(device_id)
  57. return call_id
  58. # 获取callInfo
  59. def get_call_info(self, call_id):
  60. text = None
  61. if call_id:
  62. text = self.redis_handler.get(CALL_INFO + call_id)
  63. # print('liuwei::debugger::get_call_info call_id:%s, text:%s'% (call_id, text))
  64. if text:
  65. return CallInfo.from_json(text)
  66. def remove_call_info(self, call_id):
  67. if not call_id:
  68. return None
  69. call_info = self.get_call_info(call_id)
  70. if call_info and call_info.device_info_map:
  71. for k, v in call_info.device_info_map.items():
  72. self.deviceCall.pop(k)
  73. self.delete_key(CALL_INFO + call_id)
  74. def add_device(self, device_id, call_id):
  75. if not device_id or not call_id:
  76. return None
  77. self.deviceCall[device_id] = call_id
  78. def get_user_part(self, device_id):
  79. return self.deviceUserPart.get(device_id)
  80. def add_device_user_part(self, device_id, user_part):
  81. if not device_id or not user_part:
  82. return
  83. self.deviceUserPart[device_id] = user_part
  84. def get_route_gateway(self, saas_id):
  85. return RouteGateway(id=1,
  86. saas_id=saas_id,
  87. name='63366692',
  88. media_host='192.168.20.99',
  89. media_port=5060,
  90. caller_prefix='',
  91. called_prefix='',
  92. status=0)
  93. def add_delay_message(self, action, delay_action, timeouts):
  94. delay_action.uuid = str(uuid.uuid4())
  95. key = CTI_ENGINE_DELAY_ACTION % action
  96. msg = delay_action.to_json_string()
  97. action_time = datetime.utcnow().timestamp()*1000 + timeouts * 1000
  98. self.redis_handler.redis.zadd(key, {msg : action_time})
  99. def get_delay_message(self, action):
  100. key = CTI_ENGINE_DELAY_ACTION % action
  101. current_time = int(datetime.utcnow().timestamp() * 1000) # 毫秒级时间戳
  102. members = self.redis_handler.redis.zrangebyscore(key, 0, current_time, start=0, num=DELAY_ACTION_BATCH_SIZE, withscores=True)
  103. if not members:
  104. return []
  105. self.logger.info('get_delay_message %s %s %s'%(key, action, members))
  106. # scored_entries = [{"member": entry[0].decode('utf-8'), "score": entry[1]} for entry in members]
  107. action_list = [entry[0].decode('utf-8') for entry in members]
  108. self.logger.info('get_delay_message %s %s %s'%(key, action, json.dumps(action_list)))
  109. if action_list:
  110. a = self.redis_handler.redis.zrem(key, *action_list)
  111. self.logger.info('get_delay_message %s %s %s %s'%(key, action, json.dumps(action_list), a))
  112. return action_list
  113. def lock_delay_action(self, val):
  114. key = CTI_ENGINE_DELAY_ACTION_LOCK % val
  115. return self.redis_handler.redis.set(key, "1", ex=60*10, nx=True)
  116. def set_need_play_hold_music(self, call_id):
  117. key = NEED_PLAY_HOLD_MUSIC % call_id
  118. return self.redis_handler.redis.set(key, "1", ex=60 * 1, nx=True)
  119. def get_need_play_hold_music(self, call_id):
  120. key = NEED_PLAY_HOLD_MUSIC % call_id
  121. return self.redis_handler.redis.get(key)
  122. def del_need_play_hold_music(self, call_id):
  123. key = NEED_PLAY_HOLD_MUSIC % call_id
  124. self.delete_key(key)
  125. def set_after_play_hold_music(self, call_id):
  126. key = AFTER_PLAY_HOLD_MUSIC % call_id
  127. return self.redis_handler.redis.set(key, "1", ex=60 * 1, nx=True)
  128. def get_after_play_hold_music(self, call_id):
  129. key = AFTER_PLAY_HOLD_MUSIC % call_id
  130. return self.redis_handler.redis.get(key)
  131. def get_call_is_end(self, call_id):
  132. key = CTI_MANAGE_CENTER_CALL_END_KEY % call_id
  133. return self.redis_handler.get(key)
  134. def set_call_is_end(self, call_id):
  135. key = CTI_MANAGE_CENTER_CALL_END_KEY % call_id
  136. return self.redis_handler.redis.set(key, "1", ex=60 * 10, nx=True)
  137. def get_call_is_answer(self, saas_id, flow_id):
  138. key = CTI_AGENT_MANUAL_ANSWER%(saas_id, flow_id)
  139. return self.redis_handler.get(key)
  140. def set_call_is_answer(self, saas_id, flow_id):
  141. key = CTI_AGENT_MANUAL_ANSWER%(saas_id, flow_id)
  142. return self.redis_handler.redis.set(key, "1", ex=60, nx=True)