Browse Source

Merge branch 'develop' into jms_20250106_prod

Davidliu 3 tháng trước cách đây
mục cha
commit
dbaefa2846

+ 8 - 4
src/core/callcenter/api.py

@@ -284,12 +284,14 @@ class MakeCallContext(BaseApi):
 
         if self.device_type == DeviceType.CUSTOMER.code:
             headers += [
-                "RECORD_STEREO_SWAP=true"
+                "RECORD_STEREO_SWAP=true",
+                "rx_gain=30"
             ]
         else:
             headers += [
                 "RECORD_STEREO_SWAP=false",
-                "continue_on_fail=true"
+                "continue_on_fail=true",
+                "rx_gain=30"
             ]
 
         if self.sip_header_map:
@@ -455,7 +457,7 @@ class CallInfo(BaseApi):
                  hangup_dir=None, sdk_hangup=0, hangup_code=None, answer_time=None, end_time=None, talk_time=None,
                  first_queue_time=None, queue_start_time=None, queue_end_time=None, overflow_count=0,
                  uuid1=None, uuid2=None, cdr_notify_url=None, queue_level=None, transfer_agent=None, bucket_type=None,
-                 user_no_answer_end_call=False, device_list=[], device_info_map: Dict[str, Any] = {}, follow_data: Dict[str, Any] = {},
+                 user_no_answer_end_call=False, hangup_count=0, device_list=[], device_info_map: Dict[str, Any] = {}, follow_data: Dict[str, Any] = {},
                  process_data: Dict[str, Any] = {}, next_commands=[], call_details=[]):
         self.core_uuid = core_uuid  # 通话唯一标识
         self.cti_flow_id = cti_flow_id
@@ -503,6 +505,7 @@ class CallInfo(BaseApi):
         self.transfer_agent = transfer_agent #是否转人工
         self.bucket_type = bucket_type #呼入流量类型
         self.user_no_answer_end_call = user_no_answer_end_call #用户未接听挂机
+        self.hangup_count = hangup_count
         self.device_list = device_list  # 当前通话的设备
         self.device_info_map = device_info_map
         self.follow_data = follow_data  # 呼叫随路数据(作为落单数据)
@@ -537,7 +540,7 @@ class CallInfo(BaseApi):
                    uuid1=data.get('uuid1'), uuid2=data.get('uuid2'), cdr_notify_url=data.get('cdr_notify_url'),
                    queue_level=data.get('queue_level'), transfer_agent=data.get('transfer_agent'),
                    bucket_type=data.get('bucket_type'), user_no_answer_end_call=data.get('user_no_answer_end_call'),
-                   device_list=data.get('device_list', []),device_info_map=device_info_map,
+                   hangup_count=data.get('hangup_count'), device_list=data.get('device_list', []),device_info_map=device_info_map,
                    follow_data=follow_data, process_data=process_data,
                    next_commands=next_commands, call_details=call_details)
 
@@ -592,6 +595,7 @@ class CallInfo(BaseApi):
             "transfer_agent": self.transfer_agent,
             "bucket_type": self.bucket_type,
             "user_no_answer_end_call": self.user_no_answer_end_call,
+            "hangup_count": self.hangup_count,
             "device_list": [x for x in self.device_list],
             "device_info_map": {key: vars(value) for key, value in self.device_info_map.items()},
             "follow_data": {key: vars(value) for key, value in self.follow_data.items()},

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

@@ -69,7 +69,7 @@ class CallService:
         self.agent_monitor_service.update_dialing(agent_monitor)
         self.push_handler.push_on_call_ring(call_info.saas_id, flow_id=call_info.cti_flow_id, user_id=agent_id, scene=AgentScene.MANUAL, call_id=call_info.call_id, service_direct=ServiceDirect.MANUAL_CALL.service_direct)
         self.agent_actionlog_service.insert_service_state(agent_monitor, AgentServiceState.DIALING, AgentLogState.DIALING)
-        self.data_handle_server.create_record(call_info.call_id, call_info.called, call_info.call_type, service_category=0, category=1 , user_id=agent.user_id, user_name=agent.agent_name)
+        self.data_handle_server.create_record(call_info.call_id, call_info.called, 2, service_category=0, category=1 , user_id=agent.user_id, user_name=agent.agent_name)
 
     def hold(self, call_id, device_id):
         self.logger.info('hold, custom_device_id=%s'%device_id)

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

@@ -90,12 +90,13 @@ class ChannelHangupHandler(EslEventHandler):
             # 计算录音时长
             if device_info.record_start_time:
                 device_info.record_time = int(device_info.end_time) - int(device_info.record_start_time)
+            call_info.hangup_count = call_info.hangup_count + 1
             call_info.device_info_map[device_info.device_id] = device_info
             skip_hangup_all = device_info.device_type == DeviceType.ROBOT.code
             bucket_type = call_info.bucket_type if call_info.bucket_type else "EMPTY"
             registry.CALL_HANGUP_REQUESTS.labels(f"{bucket_type}", f"{device_info.sip_status}").inc()
 
-            self.logger.info('ChannelHangupHandler, hangup_reason=%s, device_type=%s, cdr_type=%s, end_time=%s, skip_hangup_all=%s' % (hangup_reason, device_info.device_type, device_info.cdr_type, call_info.end_time, skip_hangup_all))
+            self.logger.info('ChannelHangupHandler, device_id=%s, hangup_reason=%s, device_type=%s, cdr_type=%s, end_time=%s, skip_hangup_all=%s, answer_count=%s, hangup_count=%s' % (device_id, hangup_reason, device_info.device_type, device_info.cdr_type, call_info.end_time, skip_hangup_all, call_info.answer_count, call_info.hangup_count))
             # 如果是转人工
             # if 'transferToAgent' == hangup_reason and DeviceType.ROBOT.code == device_info.device_type:
             #     call_info.answer_flag = AnswerFlag.TRANSFER_TO_AGENT.code
@@ -128,7 +129,8 @@ class ChannelHangupHandler(EslEventHandler):
 
             # 全部挂机以后推送挂机状态
             # self.logger.info('yushanghui::call_info.device_list %s', call_info.device_list)
-            if len(call_info.device_list) == 0:
+            if call_info.hangup_count == call_info.answer_count:
+            # if len(call_info.device_list) == 0:
                 self.get_call_info_record(call_info)
 
             # 判断挂机方向 && 更新缓存
@@ -155,12 +157,12 @@ class ChannelHangupHandler(EslEventHandler):
         agent_name = ''
         for value in call_info.device_info_map.values():
             records.append(value.record) if value.record else None
-            sip_status.append(value.sip_status)
-            hangup_cause.append(value.hangup_cause)
+            sip_status.append(value.sip_status if value.sip_status else 'EMPTY')
+            hangup_cause.append(value.hangup_cause if value.hangup_cause else 'EMPTY')
             if value.device_type == DeviceType.AGENT.code :
                 agent_name = value.agent_key
-        self.logger.info("get_call_info_record: %s,agent_name:%s", records, agent_name)
-        threading.Thread(target=self._update_record_in_thread, args=(call_info.call_id, list(set(records)), ",".join(sip_status), ",".join(hangup_cause), agent_name)).start()
+        self.logger.info("get_call_info_record: %s,agent_name:%s, sip_status:%s, hangup_cause:%s", records, agent_name, sip_status, hangup_cause)
+        threading.Thread(target=self._update_record_in_thread, args=(call_info.call_id, list(dict.fromkeys(records)), ",".join(sip_status), ",".join(hangup_cause), agent_name)).start()
 
     def update_name(self,call_id, agent_name):
         try:

+ 21 - 0
src/core/callcenter/test.py

@@ -4,3 +4,24 @@
 # TestStr = "能帮我查一下,我家水费欠多少"
 # seg_list = jieba.cut(TestStr, cut_all=False, HMM=True)
 # print ("Default Mode:", "/ ".join(seg_list))
+
+import uuid
+import mmh3
+
+from src.core.callcenter.dao import Bucket
+
+def get_bucket(custom_uuid=None, buckets=[]):
+    random_id = abs(mmh3.hash(custom_uuid))
+    for bucket in buckets:
+        num = (random_id % 100 + 100) % 100
+        if bucket.lower <= num < bucket.upper:
+            return num, bucket
+    return -1, buckets[0]
+
+if __name__ == '__main__':
+    arr = ['C1879412349555838976','C1879412206890782720','C1879411969535119360','C1879411406290423808','C1879408024871899136','C1879407680997691392','C1879406254007390208','C1879404740748644352','C1879403850650226688','C1879402961977872384','C1879402509785763840','C1879402237567045632','C1879402005592674304','C1879400827102302208','C1879400778024751104','C1879400705488457728','C1879400533513605120','C1879400336188379136','C1879400327959154688','C1879399300082044928','C1879399233669435392','C1879396009050771456','C1879394097295396864','C1879393224498483200','C1879381728368398336','C1879381287505104896','C1879379466774515712','C1879376723787780096','C1879374004641468416','C1879373548330553344','C1879372415646175232','C1879367459866284032','C1879365634769424384','C1879364921326702592','C1879364787436130304','C1879363948554358784','C1879362454358724608','C1879360081448013824','C1879358294565457920','C1879358151116066816','C1879357497190518784','C1879357257641234432','C1879357023229972480','C1879355792935751680','C1879355755749052416','C1879354039309832192']
+    buckets=[Bucket(id=1, name="传统", lower=0, upper=90), Bucket(id=2, name="AI",lower=90, upper=100)]
+    for custom_uuid in arr:
+        num, bucket = get_bucket(custom_uuid=custom_uuid, buckets=buckets)
+        print(custom_uuid, num, bucket.name)
+

+ 8 - 3
src/core/voip/asr.py

@@ -4,6 +4,8 @@
 import os
 import json
 import threading
+import traceback
+
 import nls  # 引入阿里云语音识别库
 from aliyunsdkcore.client import AcsClient
 from aliyunsdkcore.request import CommonRequest
@@ -126,7 +128,6 @@ class TestSt:
             count = count + 1
 
     def test_on_sentence_begin(self, message, *args):
-        # pass
         self.logger.debug("[%s]test_on_sentence_begin:%s", self.__id, message)
         if self.message_receiver:
             self.message_receiver(message, *args)
@@ -142,12 +143,16 @@ class TestSt:
         pass
 
     def test_on_error(self, message, *args):
-        # self.logger.debug("on_error args=>{}".format(args))
+        self.logger.debug("on_error args=>%s", args)
+        if not self.__event.is_set():
+            self.__event.set()
         if self.message_receiver:
             self.message_receiver(message, *args)
 
     def test_on_close(self, *args):
-        # self.logger.debug("on_close: args=>{}".format(args))
+        self.logger.debug("on_close: args=>%s", args)
+        if not self.__event.is_set():
+            self.__event.set()
         pass
 
     def test_on_result_chg(self, message, *args):