diff --git a/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ib_agent_list/S98_S_tr_cc_cdr_ib_agent_list.sql b/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ib_agent_list/S98_S_tr_cc_cdr_ib_agent_list.sql new file mode 100644 index 0000000..84e85b2 --- /dev/null +++ b/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ib_agent_list/S98_S_tr_cc_cdr_ib_agent_list.sql @@ -0,0 +1,146 @@ +/*******Main Section**************************************************************************/ +\set ON_ERROR_STOP on +\set AUTOCOMMIT on +\timing on +delete from p10_sa.S98_S_tr_cc_cdr_ib_agent_list +; +insert into p10_sa.S98_S_tr_cc_cdr_ib_agent_list +( unique_id + , main_unique_id + , qno + , qname + , cno + , client_name + , client_number + , bridge_status + , bridge_status_detail + , sip_cause_desc + , on_hook_source + , agent_answer_in_time + , detail_call_type + , call_id + , webrtc_call_id + , record_file + , start_time + , ring_time + , ib_ringing_duration + , answer_time + , offhook_time + , say_voice_duration + , end_time + , bridge_duration + , customer_number + , customer_number_encrypt + , customer_province + , customer_city + , hotline + , hotline_name + , remember + , etl_tx_dt ) + select + unique_id + , main_unique_id + , qno + , qname + , cno + , client_name + , client_number + , bridge_status + , bridge_status_detail + , sip_cause_desc + , on_hook_source + , agent_answer_in_time + , detail_call_type + , call_id + , webrtc_call_id + , record_file + , start_time + , ring_time + , ib_ringing_duration + , answer_time + , offhook_time + , say_voice_duration + , end_time + , bridge_duration + , customer_number + , customer_number_encrypt + , customer_province + , customer_city + , hotline + , hotline_name + , remember + , etl_tx_dt + from p00_tal.S98_S_tr_cc_cdr_ib_agent_list + ; + delete from p12_sfull.S98_S_tr_cc_cdr_ib_agent_list where unique_id in (select unique_id from p10_sa.S98_S_tr_cc_cdr_ib_agent_list) +; +; +insert into p12_sfull.S98_S_tr_cc_cdr_ib_agent_list +( unique_id + , main_unique_id + , qno + , qname + , cno + , client_name + , client_number + , bridge_status + , bridge_status_detail + , sip_cause_desc + , on_hook_source + , agent_answer_in_time + , detail_call_type + , call_id + , webrtc_call_id + , record_file + , start_time + , ring_time + , ib_ringing_duration + , answer_time + , offhook_time + , say_voice_duration + , end_time + , bridge_duration + , customer_number + , customer_number_encrypt + , customer_province + , customer_city + , hotline + , hotline_name + , remember + , etl_tx_dt ) + select + unique_id + , main_unique_id + , qno + , qname + , cno + , client_name + , client_number + , bridge_status + , bridge_status_detail + , sip_cause_desc + , on_hook_source + , agent_answer_in_time + , detail_call_type + , call_id + , webrtc_call_id + , record_file + , start_time + , ring_time + , ib_ringing_duration + , answer_time + , offhook_time + , say_voice_duration + , end_time + , bridge_duration + , customer_number + , customer_number_encrypt + , customer_province + , customer_city + , hotline + , hotline_name + , remember + , etl_tx_dt + from p10_sa.S98_S_tr_cc_cdr_ib_agent_list +; +\q \ No newline at end of file diff --git a/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ib_agent_list/sa_foreign_tables.sql b/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ib_agent_list/sa_foreign_tables.sql new file mode 100644 index 0000000..392d05e --- /dev/null +++ b/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ib_agent_list/sa_foreign_tables.sql @@ -0,0 +1,43 @@ + +CREATE FOREIGN TABLE if not exists p00_tal.S98_S_tr_cc_cdr_ib_agent_list ( + unique_id TEXT + , main_unique_id TEXT + , qno TEXT + , qname TEXT + , cno TEXT + , client_name TEXT + , client_number TEXT + , bridge_status TEXT + , bridge_status_detail TEXT + , sip_cause_desc TEXT + , on_hook_source TEXT + , agent_answer_in_time TEXT + , detail_call_type TEXT + , call_id TEXT + , webrtc_call_id TEXT + , record_file TEXT + , start_time TEXT + , ring_time TEXT + , ib_ringing_duration TEXT + , answer_time TEXT + , offhook_time TEXT + , say_voice_duration TEXT + , end_time TEXT + , bridge_duration TEXT + , customer_number TEXT + , customer_number_encrypt TEXT + , customer_province TEXT + , customer_city TEXT + , hotline TEXT + , hotline_name TEXT + , remember TEXT + , etl_tx_dt TIMESTAMP +) + + +SERVER pgsql_server_S98_S OPTIONS(schema_name 'data_api', table_name 'tr_cc_cdr_ib_agent_list' ); + + + + + diff --git a/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ib_agent_list/sa_tables.sql b/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ib_agent_list/sa_tables.sql new file mode 100644 index 0000000..f81a4ed --- /dev/null +++ b/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ib_agent_list/sa_tables.sql @@ -0,0 +1,143 @@ + +create table if not exists p10_sa.S98_S_tr_cc_cdr_ib_agent_list ( + unique_id TEXT + , main_unique_id TEXT + , qno TEXT + , qname TEXT + , cno TEXT + , client_name TEXT + , client_number TEXT + , bridge_status TEXT + , bridge_status_detail TEXT + , sip_cause_desc TEXT + , on_hook_source TEXT + , agent_answer_in_time TEXT + , detail_call_type TEXT + , call_id TEXT + , webrtc_call_id TEXT + , record_file TEXT + , start_time TEXT + , ring_time TEXT + , ib_ringing_duration TEXT + , answer_time TEXT + , offhook_time TEXT + , say_voice_duration TEXT + , end_time TEXT + , bridge_duration TEXT + , customer_number TEXT + , customer_number_encrypt TEXT + , customer_province TEXT + , customer_city TEXT + , hotline TEXT + , hotline_name TEXT + , remember TEXT + , etl_tx_dt TIMESTAMP +) ; + + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.unique_id IS '唯一标识'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.main_unique_id IS '通话ID'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.qno IS '来电队列号'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.qname IS '来电队列名称'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.cno IS '座席号'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.client_name IS '座席名称'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.client_number IS '座席电话'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.bridge_status IS '接听状态'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.bridge_status_detail IS '呼叫结果'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.sip_cause_desc IS '呼叫情况'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.on_hook_source IS '挂断方'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.agent_answer_in_time IS '及时应答'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.detail_call_type IS '呼叫类型'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.call_id IS 'CallID'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.webrtc_call_id IS 'WebRTCCallID'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.record_file IS '录音文件名'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.start_time IS '开始时间'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.ring_time IS '振铃时间'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.ib_ringing_duration IS '振铃时长'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.answer_time IS '接听时间'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.offhook_time IS '座席接起时间'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.say_voice_duration IS '语音播报时长'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.end_time IS '结束时间'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.bridge_duration IS '通话时长'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.customer_number IS '客户号码,带区号'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.customer_number_encrypt IS '客户号码加密串'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.customer_province IS '客户号码省份'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.customer_city IS '客户号码城市'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.hotline IS '热线号码'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.hotline_name IS '热线别名'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.remember IS '主叫记忆'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_agent_list.etl_tx_dt IS ''; + +COMMENT ON TABLE p10_sa.S98_S_tr_cc_cdr_ib_agent_list IS '座席接听记录列表'; + + + +create table if not exists p12_sfull.S98_S_tr_cc_cdr_ib_agent_list ( + unique_id TEXT + , main_unique_id TEXT + , qno TEXT + , qname TEXT + , cno TEXT + , client_name TEXT + , client_number TEXT + , bridge_status TEXT + , bridge_status_detail TEXT + , sip_cause_desc TEXT + , on_hook_source TEXT + , agent_answer_in_time TEXT + , detail_call_type TEXT + , call_id TEXT + , webrtc_call_id TEXT + , record_file TEXT + , start_time TEXT + , ring_time TEXT + , ib_ringing_duration TEXT + , answer_time TEXT + , offhook_time TEXT + , say_voice_duration TEXT + , end_time TEXT + , bridge_duration TEXT + , customer_number TEXT + , customer_number_encrypt TEXT + , customer_province TEXT + , customer_city TEXT + , hotline TEXT + , hotline_name TEXT + , remember TEXT + , etl_tx_dt TIMESTAMP +) ; + + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.unique_id IS '唯一标识'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.main_unique_id IS '通话ID'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.qno IS '来电队列号'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.qname IS '来电队列名称'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.cno IS '座席号'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.client_name IS '座席名称'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.client_number IS '座席电话'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.bridge_status IS '接听状态'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.bridge_status_detail IS '呼叫结果'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.sip_cause_desc IS '呼叫情况'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.on_hook_source IS '挂断方'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.agent_answer_in_time IS '及时应答'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.detail_call_type IS '呼叫类型'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.call_id IS 'CallID'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.webrtc_call_id IS 'WebRTCCallID'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.record_file IS '录音文件名'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.start_time IS '开始时间'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.ring_time IS '振铃时间'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.ib_ringing_duration IS '振铃时长'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.answer_time IS '接听时间'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.offhook_time IS '座席接起时间'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.say_voice_duration IS '语音播报时长'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.end_time IS '结束时间'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.bridge_duration IS '通话时长'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.customer_number IS '客户号码,带区号'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.customer_number_encrypt IS '客户号码加密串'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.customer_province IS '客户号码省份'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.customer_city IS '客户号码城市'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.hotline IS '热线号码'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.hotline_name IS '热线别名'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.remember IS '主叫记忆'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_agent_list.etl_tx_dt IS ''; + +COMMENT ON TABLE p12_sfull.S98_S_tr_cc_cdr_ib_agent_list IS '座席接听记录列表'; + diff --git a/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ib_list/S98_S_tr_cc_cdr_ib_list.sql b/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ib_list/S98_S_tr_cc_cdr_ib_list.sql new file mode 100644 index 0000000..dad0ebf --- /dev/null +++ b/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ib_list/S98_S_tr_cc_cdr_ib_list.sql @@ -0,0 +1,158 @@ +/*******Main Section**************************************************************************/ +\set ON_ERROR_STOP on +\set AUTOCOMMIT on +\timing on +delete from p10_sa.S98_S_tr_cc_cdr_ib_list +; +insert into p10_sa.S98_S_tr_cc_cdr_ib_list +( customer_number + , customer_number_encrypt + , customer_province + , customer_city + , first_call_number + , first_call_cno + , first_call_cname + , first_call_qno + , first_call_qname + , ivr_name + , hotline + , hotline_name + , xnumber + , status + , status_result + , status_robot + , main_unique_id + , tag_names + , call_id + , webrtc_call_id + , record_file + , on_hook_source + , investigation_keys + , agent_answer_in_time + , evaluation + , user_field + , start_time + , end_time + , bridge_time + , bridge_duration + , total_duration + , first_join_queue_time + , say_voice_duration + , mark_data + , etl_tx_dt ) + select + customer_number + , customer_number_encrypt + , customer_province + , customer_city + , first_call_number + , first_call_cno + , first_call_cname + , first_call_qno + , first_call_qname + , ivr_name + , hotline + , hotline_name + , xnumber + , status + , status_result + , status_robot + , main_unique_id + , tag_names + , call_id + , webrtc_call_id + , record_file + , on_hook_source + , investigation_keys + , agent_answer_in_time + , evaluation + , user_field + , start_time + , end_time + , bridge_time + , bridge_duration + , total_duration + , first_join_queue_time + , say_voice_duration + , mark_data + , etl_tx_dt + from p00_tal.S98_S_tr_cc_cdr_ib_list + ; + delete from p12_sfull.S98_S_tr_cc_cdr_ib_list +; +; +insert into p12_sfull.S98_S_tr_cc_cdr_ib_list +( customer_number + , customer_number_encrypt + , customer_province + , customer_city + , first_call_number + , first_call_cno + , first_call_cname + , first_call_qno + , first_call_qname + , ivr_name + , hotline + , hotline_name + , xnumber + , status + , status_result + , status_robot + , main_unique_id + , tag_names + , call_id + , webrtc_call_id + , record_file + , on_hook_source + , investigation_keys + , agent_answer_in_time + , evaluation + , user_field + , start_time + , end_time + , bridge_time + , bridge_duration + , total_duration + , first_join_queue_time + , say_voice_duration + , mark_data + , etl_tx_dt ) + select + customer_number + , customer_number_encrypt + , customer_province + , customer_city + , first_call_number + , first_call_cno + , first_call_cname + , first_call_qno + , first_call_qname + , ivr_name + , hotline + , hotline_name + , xnumber + , status + , status_result + , status_robot + , main_unique_id + , tag_names + , call_id + , webrtc_call_id + , record_file + , on_hook_source + , investigation_keys + , agent_answer_in_time + , evaluation + , user_field + , start_time + , end_time + , bridge_time + , bridge_duration + , total_duration + , first_join_queue_time + , say_voice_duration + , mark_data + , etl_tx_dt + from p10_sa.S98_S_tr_cc_cdr_ib_list +; +\q \ No newline at end of file diff --git a/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ib_list/sa_foreign_tables.sql b/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ib_list/sa_foreign_tables.sql new file mode 100644 index 0000000..74a8fe3 --- /dev/null +++ b/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ib_list/sa_foreign_tables.sql @@ -0,0 +1,46 @@ + +CREATE FOREIGN TABLE if not exists p00_tal.S98_S_tr_cc_cdr_ib_list ( + customer_number TEXT + , customer_number_encrypt TEXT + , customer_province TEXT + , customer_city TEXT + , first_call_number TEXT + , first_call_cno TEXT + , first_call_cname TEXT + , first_call_qno TEXT + , first_call_qname TEXT + , ivr_name TEXT + , hotline TEXT + , hotline_name TEXT + , xnumber TEXT + , status TEXT + , status_result TEXT + , status_robot TEXT + , main_unique_id TEXT + , tag_names TEXT + , call_id TEXT + , webrtc_call_id TEXT + , record_file TEXT + , on_hook_source TEXT + , investigation_keys TEXT + , agent_answer_in_time TEXT + , evaluation TEXT + , user_field TEXT + , start_time TEXT + , end_time TEXT + , bridge_time TEXT + , bridge_duration TEXT + , total_duration TEXT + , first_join_queue_time TEXT + , say_voice_duration TEXT + , mark_data TEXT + , etl_tx_dt TIMESTAMP +) + + +SERVER pgsql_server_S98_S OPTIONS(schema_name 'data_api', table_name 'tr_cc_cdr_ib_list' ); + + + + + diff --git a/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ib_list/sa_tables.sql b/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ib_list/sa_tables.sql new file mode 100644 index 0000000..333106b --- /dev/null +++ b/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ib_list/sa_tables.sql @@ -0,0 +1,155 @@ + +create table if not exists p10_sa.S98_S_tr_cc_cdr_ib_list ( + customer_number TEXT + , customer_number_encrypt TEXT + , customer_province TEXT + , customer_city TEXT + , first_call_number TEXT + , first_call_cno TEXT + , first_call_cname TEXT + , first_call_qno TEXT + , first_call_qname TEXT + , ivr_name TEXT + , hotline TEXT + , hotline_name TEXT + , xnumber TEXT + , status TEXT + , status_result TEXT + , status_robot TEXT + , main_unique_id TEXT + , tag_names TEXT + , call_id TEXT + , webrtc_call_id TEXT + , record_file TEXT + , on_hook_source TEXT + , investigation_keys TEXT + , agent_answer_in_time TEXT + , evaluation TEXT + , user_field TEXT + , start_time TEXT + , end_time TEXT + , bridge_time TEXT + , bridge_duration TEXT + , total_duration TEXT + , first_join_queue_time TEXT + , say_voice_duration TEXT + , mark_data TEXT + , etl_tx_dt TIMESTAMP +) ; + + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.customer_number IS '客户号码'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.customer_number_encrypt IS '客户号码加密串'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.customer_province IS '客户号码省份'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.customer_city IS '客户号码城市'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.first_call_number IS '首呼座席电话'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.first_call_cno IS '首呼座席工号'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.first_call_cname IS '首呼座席姓名'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.first_call_qno IS '首呼队列号'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.first_call_qname IS '首呼队列名称'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.ivr_name IS 'IVR名称'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.hotline IS '热线号码'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.hotline_name IS '热线别名'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.xnumber IS '虚拟号码'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.status IS '接听状态'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.status_result IS '呼叫结果'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.status_robot IS '机器人接听状态'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.main_unique_id IS '通话ID'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.tag_names IS '通话标签'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.call_id IS 'CallID'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.webrtc_call_id IS 'WebRTCCallID'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.record_file IS '录音文件'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.on_hook_source IS '挂断方'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.investigation_keys IS '满意度评价'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.agent_answer_in_time IS '首次及时应答'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.evaluation IS '是否邀评'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.user_field IS '自定义字段'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.start_time IS '开始时间'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.end_time IS '结束时间'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.bridge_time IS '首次接听时间'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.bridge_duration IS '通话时长'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.total_duration IS '总时长'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.first_join_queue_time IS '首次进入队列时间'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.say_voice_duration IS '语音播报时长'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.mark_data IS '备注'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ib_list.etl_tx_dt IS ''; + +COMMENT ON TABLE p10_sa.S98_S_tr_cc_cdr_ib_list IS '客户来电记录列表'; + + + +create table if not exists p12_sfull.S98_S_tr_cc_cdr_ib_list ( + customer_number TEXT + , customer_number_encrypt TEXT + , customer_province TEXT + , customer_city TEXT + , first_call_number TEXT + , first_call_cno TEXT + , first_call_cname TEXT + , first_call_qno TEXT + , first_call_qname TEXT + , ivr_name TEXT + , hotline TEXT + , hotline_name TEXT + , xnumber TEXT + , status TEXT + , status_result TEXT + , status_robot TEXT + , main_unique_id TEXT + , tag_names TEXT + , call_id TEXT + , webrtc_call_id TEXT + , record_file TEXT + , on_hook_source TEXT + , investigation_keys TEXT + , agent_answer_in_time TEXT + , evaluation TEXT + , user_field TEXT + , start_time TEXT + , end_time TEXT + , bridge_time TEXT + , bridge_duration TEXT + , total_duration TEXT + , first_join_queue_time TEXT + , say_voice_duration TEXT + , mark_data TEXT + , etl_tx_dt TIMESTAMP +) ; + + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.customer_number IS '客户号码'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.customer_number_encrypt IS '客户号码加密串'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.customer_province IS '客户号码省份'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.customer_city IS '客户号码城市'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.first_call_number IS '首呼座席电话'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.first_call_cno IS '首呼座席工号'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.first_call_cname IS '首呼座席姓名'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.first_call_qno IS '首呼队列号'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.first_call_qname IS '首呼队列名称'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.ivr_name IS 'IVR名称'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.hotline IS '热线号码'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.hotline_name IS '热线别名'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.xnumber IS '虚拟号码'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.status IS '接听状态'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.status_result IS '呼叫结果'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.status_robot IS '机器人接听状态'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.main_unique_id IS '通话ID'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.tag_names IS '通话标签'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.call_id IS 'CallID'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.webrtc_call_id IS 'WebRTCCallID'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.record_file IS '录音文件'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.on_hook_source IS '挂断方'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.investigation_keys IS '满意度评价'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.agent_answer_in_time IS '首次及时应答'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.evaluation IS '是否邀评'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.user_field IS '自定义字段'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.start_time IS '开始时间'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.end_time IS '结束时间'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.bridge_time IS '首次接听时间'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.bridge_duration IS '通话时长'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.total_duration IS '总时长'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.first_join_queue_time IS '首次进入队列时间'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.say_voice_duration IS '语音播报时长'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.mark_data IS '备注'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ib_list.etl_tx_dt IS ''; + +COMMENT ON TABLE p12_sfull.S98_S_tr_cc_cdr_ib_list IS '客户来电记录列表'; + diff --git a/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ob_detail/S98_S_tr_cc_cdr_ob_detail.sql b/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ob_detail/S98_S_tr_cc_cdr_ob_detail.sql new file mode 100644 index 0000000..664eef8 --- /dev/null +++ b/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ob_detail/S98_S_tr_cc_cdr_ob_detail.sql @@ -0,0 +1,106 @@ +/*******Main Section**************************************************************************/ +\set ON_ERROR_STOP on +\set AUTOCOMMIT on +\timing on +delete from p10_sa.S98_S_tr_cc_cdr_ob_detail +; +insert into p10_sa.S98_S_tr_cc_cdr_ob_detail +( cno + , client_name + , client_number + , start_time + , callee_ringing_time + , answer_time + , end_time + , bridge_duration + , call_type + , call_type_desc + , detail_call_type + , detail_call_type_desc + , ob_sip_cause + , sip_cause + , sip_cause_desc + , record_file + , tsi_file + , call_id + , webrtc_call_id + , main_unique_id + , unique_id + , etl_tx_dt ) + select + cno + , client_name + , client_number + , start_time + , callee_ringing_time + , answer_time + , end_time + , bridge_duration + , call_type + , call_type_desc + , detail_call_type + , detail_call_type_desc + , ob_sip_cause + , sip_cause + , sip_cause_desc + , record_file + , tsi_file + , call_id + , webrtc_call_id + , main_unique_id + , unique_id + , etl_tx_dt + from p00_tal.S98_S_tr_cc_cdr_ob_detail + ; + delete from p12_sfull.S98_S_tr_cc_cdr_ob_detail +; +; +insert into p12_sfull.S98_S_tr_cc_cdr_ob_detail +( cno + , client_name + , client_number + , start_time + , callee_ringing_time + , answer_time + , end_time + , bridge_duration + , call_type + , call_type_desc + , detail_call_type + , detail_call_type_desc + , ob_sip_cause + , sip_cause + , sip_cause_desc + , record_file + , tsi_file + , call_id + , webrtc_call_id + , main_unique_id + , unique_id + , etl_tx_dt ) + select + cno + , client_name + , client_number + , start_time + , callee_ringing_time + , answer_time + , end_time + , bridge_duration + , call_type + , call_type_desc + , detail_call_type + , detail_call_type_desc + , ob_sip_cause + , sip_cause + , sip_cause_desc + , record_file + , tsi_file + , call_id + , webrtc_call_id + , main_unique_id + , unique_id + , etl_tx_dt + from p10_sa.S98_S_tr_cc_cdr_ob_detail +; +\q \ No newline at end of file diff --git a/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ob_detail/sa_foreign_tables.sql b/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ob_detail/sa_foreign_tables.sql new file mode 100644 index 0000000..764958d --- /dev/null +++ b/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ob_detail/sa_foreign_tables.sql @@ -0,0 +1,33 @@ + +CREATE FOREIGN TABLE if not exists p00_tal.S98_S_tr_cc_cdr_ob_detail ( + cno TEXT + , client_name TEXT + , client_number TEXT + , start_time TEXT + , callee_ringing_time TEXT + , answer_time TEXT + , end_time TEXT + , bridge_duration TEXT + , call_type TEXT + , call_type_desc TEXT + , detail_call_type TEXT + , detail_call_type_desc TEXT + , ob_sip_cause TEXT + , sip_cause TEXT + , sip_cause_desc TEXT + , record_file TEXT + , tsi_file TEXT + , call_id TEXT + , webrtc_call_id TEXT + , main_unique_id TEXT + , unique_id TEXT + , etl_tx_dt TIMESTAMP +) + + +SERVER pgsql_server_S98_S OPTIONS(schema_name 'data_api', table_name 'tr_cc_cdr_ob_detail' ); + + + + + diff --git a/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ob_detail/sa_tables.sql b/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ob_detail/sa_tables.sql new file mode 100644 index 0000000..d44d2b8 --- /dev/null +++ b/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ob_detail/sa_tables.sql @@ -0,0 +1,103 @@ + +create table if not exists p10_sa.S98_S_tr_cc_cdr_ob_detail ( + cno TEXT + , client_name TEXT + , client_number TEXT + , start_time TEXT + , callee_ringing_time TEXT + , answer_time TEXT + , end_time TEXT + , bridge_duration TEXT + , call_type TEXT + , call_type_desc TEXT + , detail_call_type TEXT + , detail_call_type_desc TEXT + , ob_sip_cause TEXT + , sip_cause TEXT + , sip_cause_desc TEXT + , record_file TEXT + , tsi_file TEXT + , call_id TEXT + , webrtc_call_id TEXT + , main_unique_id TEXT + , unique_id TEXT + , etl_tx_dt TIMESTAMP +) ; + + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_detail.cno IS '座席工号'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_detail.client_name IS '座席名称'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_detail.client_number IS '座席电话'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_detail.start_time IS '开始时间'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_detail.callee_ringing_time IS '客户响铃时间'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_detail.answer_time IS '客户接听时间'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_detail.end_time IS '结束时间'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_detail.bridge_duration IS '通话时长'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_detail.call_type IS '通话类型'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_detail.call_type_desc IS '通话类型描述'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_detail.detail_call_type IS '呼叫类型'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_detail.detail_call_type_desc IS '呼叫类型描述'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_detail.ob_sip_cause IS '呼叫结果'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_detail.sip_cause IS '呼叫情况'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_detail.sip_cause_desc IS '呼叫情况描述'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_detail.record_file IS '录音'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_detail.tsi_file IS '客户彩铃录音'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_detail.call_id IS 'CallID'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_detail.webrtc_call_id IS 'WebRTCCallID'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_detail.main_unique_id IS '通话ID'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_detail.unique_id IS '通话唯一ID'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_detail.etl_tx_dt IS ''; + +COMMENT ON TABLE p10_sa.S98_S_tr_cc_cdr_ob_detail IS '外呼记录详情'; + + + +create table if not exists p12_sfull.S98_S_tr_cc_cdr_ob_detail ( + cno TEXT + , client_name TEXT + , client_number TEXT + , start_time TEXT + , callee_ringing_time TEXT + , answer_time TEXT + , end_time TEXT + , bridge_duration TEXT + , call_type TEXT + , call_type_desc TEXT + , detail_call_type TEXT + , detail_call_type_desc TEXT + , ob_sip_cause TEXT + , sip_cause TEXT + , sip_cause_desc TEXT + , record_file TEXT + , tsi_file TEXT + , call_id TEXT + , webrtc_call_id TEXT + , main_unique_id TEXT + , unique_id TEXT + , etl_tx_dt TIMESTAMP +) ; + + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_detail.cno IS '座席工号'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_detail.client_name IS '座席名称'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_detail.client_number IS '座席电话'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_detail.start_time IS '开始时间'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_detail.callee_ringing_time IS '客户响铃时间'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_detail.answer_time IS '客户接听时间'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_detail.end_time IS '结束时间'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_detail.bridge_duration IS '通话时长'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_detail.call_type IS '通话类型'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_detail.call_type_desc IS '通话类型描述'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_detail.detail_call_type IS '呼叫类型'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_detail.detail_call_type_desc IS '呼叫类型描述'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_detail.ob_sip_cause IS '呼叫结果'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_detail.sip_cause IS '呼叫情况'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_detail.sip_cause_desc IS '呼叫情况描述'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_detail.record_file IS '录音'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_detail.tsi_file IS '客户彩铃录音'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_detail.call_id IS 'CallID'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_detail.webrtc_call_id IS 'WebRTCCallID'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_detail.main_unique_id IS '通话ID'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_detail.unique_id IS '通话唯一ID'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_detail.etl_tx_dt IS ''; + +COMMENT ON TABLE p12_sfull.S98_S_tr_cc_cdr_ob_detail IS '外呼记录详情'; + diff --git a/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ob_list/S98_S_tr_cc_cdr_ob_list.sql b/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ob_list/S98_S_tr_cc_cdr_ob_list.sql new file mode 100644 index 0000000..65ddcc0 --- /dev/null +++ b/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ob_list/S98_S_tr_cc_cdr_ob_list.sql @@ -0,0 +1,254 @@ +/*******Main Section**************************************************************************/ +\set ON_ERROR_STOP on +\set AUTOCOMMIT on +\timing on +delete from p10_sa.S98_S_tr_cc_cdr_ob_list +; +insert into p10_sa.S98_S_tr_cc_cdr_ob_list +( customer_number + , customer_number_encrypt + , customer_area + , customer_province + , customer_city + , call_type + , call_type_key + , left_clid + , left_clid_area + , left_clid_province + , left_clid_city + , trunk_group_key + , xnumber + , xnumber_area + , xnumber_province + , xnumber_city + , status + , status_desc + , tag_names + , main_unique_id + , request_unique_id + , ob_sip_cause + , on_hook_source + , record_file + , asr_record + , evaluation + , investigation_keys + , call_id + , webrtc_call_id + , rtc_uid + , cno + , client_name + , client_number + , start_time + , up_time + , callee_ringing_time + , bridge_time + , end_time + , bridge_duration + , total_duration + , pre_ring_wait_duration + , callee_ringing_duration + , ob_wait_duration + , task_id + , task_name + , task_inventory_id + , exist_ticket + , ticket_ids + , exist_business + , business_ids + , user_field + , exist_customer + , customer_area_code + , customer_post_code + , customer_vip + , enterprise_id + , mark_data + , type + , etl_tx_dt ) + select + customer_number + , customer_number_encrypt + , customer_area + , customer_province + , customer_city + , call_type + , call_type_key + , left_clid + , left_clid_area + , left_clid_province + , left_clid_city + , trunk_group_key + , xnumber + , xnumber_area + , xnumber_province + , xnumber_city + , status + , status_desc + , tag_names + , main_unique_id + , request_unique_id + , ob_sip_cause + , on_hook_source + , record_file + , asr_record + , evaluation + , investigation_keys + , call_id + , webrtc_call_id + , rtc_uid + , cno + , client_name + , client_number + , start_time + , up_time + , callee_ringing_time + , bridge_time + , end_time + , bridge_duration + , total_duration + , pre_ring_wait_duration + , callee_ringing_duration + , ob_wait_duration + , task_id + , task_name + , task_inventory_id + , exist_ticket + , ticket_ids + , exist_business + , business_ids + , user_field + , exist_customer + , customer_area_code + , customer_post_code + , customer_vip + , enterprise_id + , mark_data + , type + , etl_tx_dt + from p00_tal.S98_S_tr_cc_cdr_ob_list + ; + delete from p12_sfull.S98_S_tr_cc_cdr_ob_list +; +; +insert into p12_sfull.S98_S_tr_cc_cdr_ob_list +( customer_number + , customer_number_encrypt + , customer_area + , customer_province + , customer_city + , call_type + , call_type_key + , left_clid + , left_clid_area + , left_clid_province + , left_clid_city + , trunk_group_key + , xnumber + , xnumber_area + , xnumber_province + , xnumber_city + , status + , status_desc + , tag_names + , main_unique_id + , request_unique_id + , ob_sip_cause + , on_hook_source + , record_file + , asr_record + , evaluation + , investigation_keys + , call_id + , webrtc_call_id + , rtc_uid + , cno + , client_name + , client_number + , start_time + , up_time + , callee_ringing_time + , bridge_time + , end_time + , bridge_duration + , total_duration + , pre_ring_wait_duration + , callee_ringing_duration + , ob_wait_duration + , task_id + , task_name + , task_inventory_id + , exist_ticket + , ticket_ids + , exist_business + , business_ids + , user_field + , exist_customer + , customer_area_code + , customer_post_code + , customer_vip + , enterprise_id + , mark_data + , type + , etl_tx_dt ) + select + customer_number + , customer_number_encrypt + , customer_area + , customer_province + , customer_city + , call_type + , call_type_key + , left_clid + , left_clid_area + , left_clid_province + , left_clid_city + , trunk_group_key + , xnumber + , xnumber_area + , xnumber_province + , xnumber_city + , status + , status_desc + , tag_names + , main_unique_id + , request_unique_id + , ob_sip_cause + , on_hook_source + , record_file + , asr_record + , evaluation + , investigation_keys + , call_id + , webrtc_call_id + , rtc_uid + , cno + , client_name + , client_number + , start_time + , up_time + , callee_ringing_time + , bridge_time + , end_time + , bridge_duration + , total_duration + , pre_ring_wait_duration + , callee_ringing_duration + , ob_wait_duration + , task_id + , task_name + , task_inventory_id + , exist_ticket + , ticket_ids + , exist_business + , business_ids + , user_field + , exist_customer + , customer_area_code + , customer_post_code + , customer_vip + , enterprise_id + , mark_data + , type + , etl_tx_dt + from p10_sa.S98_S_tr_cc_cdr_ob_list +; +\q \ No newline at end of file diff --git a/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ob_list/sa_foreign_tables.sql b/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ob_list/sa_foreign_tables.sql new file mode 100644 index 0000000..308b634 --- /dev/null +++ b/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ob_list/sa_foreign_tables.sql @@ -0,0 +1,70 @@ + +CREATE FOREIGN TABLE if not exists p00_tal.S98_S_tr_cc_cdr_ob_list ( + customer_number TEXT + , customer_number_encrypt TEXT + , customer_area TEXT + , customer_province TEXT + , customer_city TEXT + , call_type TEXT + , call_type_key TEXT + , left_clid TEXT + , left_clid_area TEXT + , left_clid_province TEXT + , left_clid_city TEXT + , trunk_group_key TEXT + , xnumber TEXT + , xnumber_area TEXT + , xnumber_province TEXT + , xnumber_city TEXT + , status TEXT + , status_desc TEXT + , tag_names TEXT + , main_unique_id TEXT + , request_unique_id TEXT + , ob_sip_cause TEXT + , on_hook_source TEXT + , record_file TEXT + , asr_record TEXT + , evaluation TEXT + , investigation_keys TEXT + , call_id TEXT + , webrtc_call_id TEXT + , rtc_uid TEXT + , cno TEXT + , client_name TEXT + , client_number TEXT + , start_time TEXT + , up_time TEXT + , callee_ringing_time TEXT + , bridge_time TEXT + , end_time TEXT + , bridge_duration TEXT + , total_duration TEXT + , pre_ring_wait_duration TEXT + , callee_ringing_duration TEXT + , ob_wait_duration TEXT + , task_id TEXT + , task_name TEXT + , task_inventory_id TEXT + , exist_ticket TEXT + , ticket_ids TEXT + , exist_business TEXT + , business_ids TEXT + , user_field TEXT + , exist_customer TEXT + , customer_area_code TEXT + , customer_post_code TEXT + , customer_vip TEXT + , enterprise_id TEXT + , mark_data TEXT + , type TEXT + , etl_tx_dt TIMESTAMP +) + + +SERVER pgsql_server_S98_S OPTIONS(schema_name 'data_api', table_name 'tr_cc_cdr_ob_list' ); + + + + + diff --git a/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ob_list/sa_tables.sql b/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ob_list/sa_tables.sql new file mode 100644 index 0000000..ff91f89 --- /dev/null +++ b/dev/workflow/TK_Cust/smart_ccc_cdr/tr_cc_cdr_ob_list/sa_tables.sql @@ -0,0 +1,251 @@ + +create table if not exists p10_sa.S98_S_tr_cc_cdr_ob_list ( + customer_number TEXT + , customer_number_encrypt TEXT + , customer_area TEXT + , customer_province TEXT + , customer_city TEXT + , call_type TEXT + , call_type_key TEXT + , left_clid TEXT + , left_clid_area TEXT + , left_clid_province TEXT + , left_clid_city TEXT + , trunk_group_key TEXT + , xnumber TEXT + , xnumber_area TEXT + , xnumber_province TEXT + , xnumber_city TEXT + , status TEXT + , status_desc TEXT + , tag_names TEXT + , main_unique_id TEXT + , request_unique_id TEXT + , ob_sip_cause TEXT + , on_hook_source TEXT + , record_file TEXT + , asr_record TEXT + , evaluation TEXT + , investigation_keys TEXT + , call_id TEXT + , webrtc_call_id TEXT + , rtc_uid TEXT + , cno TEXT + , client_name TEXT + , client_number TEXT + , start_time TEXT + , up_time TEXT + , callee_ringing_time TEXT + , bridge_time TEXT + , end_time TEXT + , bridge_duration TEXT + , total_duration TEXT + , pre_ring_wait_duration TEXT + , callee_ringing_duration TEXT + , ob_wait_duration TEXT + , task_id TEXT + , task_name TEXT + , task_inventory_id TEXT + , exist_ticket TEXT + , ticket_ids TEXT + , exist_business TEXT + , business_ids TEXT + , user_field TEXT + , exist_customer TEXT + , customer_area_code TEXT + , customer_post_code TEXT + , customer_vip TEXT + , enterprise_id TEXT + , mark_data TEXT + , type TEXT + , etl_tx_dt TIMESTAMP +) ; + + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.customer_number IS '客户号码'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.customer_number_encrypt IS '客户号码加密串'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.customer_area IS '客户地区,省份/城市'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.customer_province IS '客户号码省份'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.customer_city IS '客户号码城市'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.call_type IS '通话类型'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.call_type_key IS '通话类型Key值'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.left_clid IS '外显号码'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.left_clid_area IS '外显号码归属地区'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.left_clid_province IS '外显号码归属省份'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.left_clid_city IS '外显号码归属城市'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.trunk_group_key IS '中继组号'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.xnumber IS '虚拟号码'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.xnumber_area IS '虚拟号码归属地区'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.xnumber_province IS '虚拟号码归属省份'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.xnumber_city IS '虚拟号码归属城市'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.status IS '接听状态值'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.status_desc IS '接听状态描述'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.tag_names IS '通话标签'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.main_unique_id IS '通话ID'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.request_unique_id IS '通话唯一ID'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.ob_sip_cause IS '呼叫结果'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.on_hook_source IS '挂断方'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.record_file IS '录音文件'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.asr_record IS '转写记录标识 '; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.evaluation IS '是否邀评'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.investigation_keys IS '满意度评价'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.call_id IS 'CallID'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.webrtc_call_id IS 'WebRTCCallID'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.rtc_uid IS 'RtcUid'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.cno IS '座席工号'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.client_name IS '座席名称'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.client_number IS '座席电话'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.start_time IS '开始时间'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.up_time IS '座席接起时间'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.callee_ringing_time IS '客户响铃时间'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.bridge_time IS '客户接听时间'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.end_time IS '结束时间'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.bridge_duration IS '通话时长'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.total_duration IS '总时长'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.pre_ring_wait_duration IS '响铃前等待时长'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.callee_ringing_duration IS '客户响铃时长'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.ob_wait_duration IS '外呼等待时长'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.task_id IS '外呼任务id'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.task_name IS '外呼任务名称'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.task_inventory_id IS '外呼任务详情id'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.exist_ticket IS '是否存在工单'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.ticket_ids IS '工单id'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.exist_business IS '是否存在业务记录'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.business_ids IS '业务记录ID'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.user_field IS '自定义字段'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.exist_customer IS '是否存在客户资料'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.customer_area_code IS '客户号码区号'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.customer_post_code IS '追加客户邮编'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.customer_vip IS '客户VIP标识'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.enterprise_id IS '企业号'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.mark_data IS '备注'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.type IS 'cdrObAgent'; + COMMENT ON COLUMN p10_sa.S98_S_tr_cc_cdr_ob_list.etl_tx_dt IS ''; + +COMMENT ON TABLE p10_sa.S98_S_tr_cc_cdr_ob_list IS '外呼记录列表'; + + + +create table if not exists p12_sfull.S98_S_tr_cc_cdr_ob_list ( + customer_number TEXT + , customer_number_encrypt TEXT + , customer_area TEXT + , customer_province TEXT + , customer_city TEXT + , call_type TEXT + , call_type_key TEXT + , left_clid TEXT + , left_clid_area TEXT + , left_clid_province TEXT + , left_clid_city TEXT + , trunk_group_key TEXT + , xnumber TEXT + , xnumber_area TEXT + , xnumber_province TEXT + , xnumber_city TEXT + , status TEXT + , status_desc TEXT + , tag_names TEXT + , main_unique_id TEXT + , request_unique_id TEXT + , ob_sip_cause TEXT + , on_hook_source TEXT + , record_file TEXT + , asr_record TEXT + , evaluation TEXT + , investigation_keys TEXT + , call_id TEXT + , webrtc_call_id TEXT + , rtc_uid TEXT + , cno TEXT + , client_name TEXT + , client_number TEXT + , start_time TEXT + , up_time TEXT + , callee_ringing_time TEXT + , bridge_time TEXT + , end_time TEXT + , bridge_duration TEXT + , total_duration TEXT + , pre_ring_wait_duration TEXT + , callee_ringing_duration TEXT + , ob_wait_duration TEXT + , task_id TEXT + , task_name TEXT + , task_inventory_id TEXT + , exist_ticket TEXT + , ticket_ids TEXT + , exist_business TEXT + , business_ids TEXT + , user_field TEXT + , exist_customer TEXT + , customer_area_code TEXT + , customer_post_code TEXT + , customer_vip TEXT + , enterprise_id TEXT + , mark_data TEXT + , type TEXT + , etl_tx_dt TIMESTAMP +) ; + + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.customer_number IS '客户号码'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.customer_number_encrypt IS '客户号码加密串'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.customer_area IS '客户地区,省份/城市'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.customer_province IS '客户号码省份'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.customer_city IS '客户号码城市'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.call_type IS '通话类型'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.call_type_key IS '通话类型Key值'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.left_clid IS '外显号码'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.left_clid_area IS '外显号码归属地区'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.left_clid_province IS '外显号码归属省份'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.left_clid_city IS '外显号码归属城市'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.trunk_group_key IS '中继组号'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.xnumber IS '虚拟号码'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.xnumber_area IS '虚拟号码归属地区'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.xnumber_province IS '虚拟号码归属省份'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.xnumber_city IS '虚拟号码归属城市'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.status IS '接听状态值'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.status_desc IS '接听状态描述'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.tag_names IS '通话标签'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.main_unique_id IS '通话ID'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.request_unique_id IS '通话唯一ID'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.ob_sip_cause IS '呼叫结果'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.on_hook_source IS '挂断方'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.record_file IS '录音文件'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.asr_record IS '转写记录标识 '; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.evaluation IS '是否邀评'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.investigation_keys IS '满意度评价'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.call_id IS 'CallID'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.webrtc_call_id IS 'WebRTCCallID'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.rtc_uid IS 'RtcUid'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.cno IS '座席工号'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.client_name IS '座席名称'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.client_number IS '座席电话'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.start_time IS '开始时间'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.up_time IS '座席接起时间'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.callee_ringing_time IS '客户响铃时间'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.bridge_time IS '客户接听时间'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.end_time IS '结束时间'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.bridge_duration IS '通话时长'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.total_duration IS '总时长'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.pre_ring_wait_duration IS '响铃前等待时长'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.callee_ringing_duration IS '客户响铃时长'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.ob_wait_duration IS '外呼等待时长'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.task_id IS '外呼任务id'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.task_name IS '外呼任务名称'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.task_inventory_id IS '外呼任务详情id'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.exist_ticket IS '是否存在工单'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.ticket_ids IS '工单id'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.exist_business IS '是否存在业务记录'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.business_ids IS '业务记录ID'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.user_field IS '自定义字段'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.exist_customer IS '是否存在客户资料'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.customer_area_code IS '客户号码区号'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.customer_post_code IS '追加客户邮编'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.customer_vip IS '客户VIP标识'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.enterprise_id IS '企业号'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.mark_data IS '备注'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.type IS 'cdrObAgent'; + COMMENT ON COLUMN p12_sfull.S98_S_tr_cc_cdr_ob_list.etl_tx_dt IS ''; + +COMMENT ON TABLE p12_sfull.S98_S_tr_cc_cdr_ob_list IS '外呼记录列表'; + diff --git a/dev/workflow/TK_Cust/smart_ccc_cdr/天润Smart-ccc通话记录/wf_dag_smart_ccc_cdr.py b/dev/workflow/TK_Cust/smart_ccc_cdr/天润Smart-ccc通话记录/wf_dag_smart_ccc_cdr.py new file mode 100644 index 0000000..f7d0202 --- /dev/null +++ b/dev/workflow/TK_Cust/smart_ccc_cdr/天润Smart-ccc通话记录/wf_dag_smart_ccc_cdr.py @@ -0,0 +1,142 @@ +#!/usr/bin/python +# -*- encoding=utf-8 -*- +from airflow import DAG +from datetime import datetime, timedelta +from airflow.contrib.hooks.ssh_hook import SSHHook +from airflow.contrib.operators.ssh_operator import SSHOperator +from airflow.sensors.external_task_sensor import ExternalTaskSensor +import json + +from airflow.operators.trigger_dagrun import TriggerDagRunOperator +from airflow.operators.email_operator import EmailOperator +from airflow.utils.trigger_rule import TriggerRule + + +sshHook = SSHHook(ssh_conn_id ='ssh_air') +default_args = { +'owner': 'info@idgvalue.com', +'email_on_failure': True, +'email_on_retry':True, +'start_date': datetime(2024, 1, 1), +'depends_on_past': False, +'retries': 6, +'retry_delay': timedelta(minutes=10), +} + +dag = DAG('wf_dag_smart_ccc_cdr', default_args=default_args, +schedule_interval="0 0-23/1 * * *", +catchup=False, +dagrun_timeout=timedelta(minutes=160), +max_active_runs=3) + +task_failed = EmailOperator ( + dag=dag, + trigger_rule=TriggerRule.ONE_FAILED, + task_id="task_failed", + to=["info@idgvalue.com"], + cc=[""], + subject="smart_ccc_cdr_failed", + html_content='

您好,smart_ccc_cdr作业失败,请及时处理"

') + +cc_cdr_ib_list_feign = SSHOperator( +ssh_hook=sshHook, +task_id='cc_cdr_ib_list_feign', +command='python3 /data/airflow/etl/API/cc_cdr_ib_list_feign.py', +depends_on_past=False, +retries=3, +dag=dag) + +cc_cdr_ib_list_load = SSHOperator( +ssh_hook=sshHook, +task_id='cc_cdr_ib_list_load', +command='/data/airflow/etl/API/run_psql.sh {{ ds_nodash }} {{params.my_param }}', +params={'my_param':"cc_cdr_ib_list_load"}, +depends_on_past=False, +retries=3, +dag=dag) + +cc_cdr_ib_list_feign >> cc_cdr_ib_list_load + +cc_cdr_ob_list_feign = SSHOperator( +ssh_hook=sshHook, +task_id='cc_cdr_ob_list_feign', +command='python3 /data/airflow/etl/API/cc_cdr_ob_list_feign.py', +depends_on_past=False, +retries=3, +dag=dag) + +cc_cdr_ob_list_load = SSHOperator( +ssh_hook=sshHook, +task_id='cc_cdr_ob_list_load', +command='/data/airflow/etl/API/run_psql.sh {{ ds_nodash }} {{params.my_param }}', +params={'my_param':"cc_cdr_ob_list_load"}, +depends_on_past=False, +retries=3, +dag=dag) + +cc_cdr_ob_list_feign >> cc_cdr_ob_list_load + +cc_cdr_ib_agent_list_feign = SSHOperator( +ssh_hook=sshHook, +task_id='cc_cdr_ib_agent_list_feign', +command='python3 /data/airflow/etl/API/cc_cdr_ib_agent_list_feign.py', +depends_on_past=False, +retries=3, +dag=dag) + +cc_cdr_ib_agent_list_load = SSHOperator( +ssh_hook=sshHook, +task_id='cc_cdr_ib_agent_list_load', +command='/data/airflow/etl/API/run_psql.sh {{ ds_nodash }} {{params.my_param }}', +params={'my_param':"cc_cdr_ib_agent_list_load"}, +depends_on_past=False, +retries=3, +dag=dag) + +cc_cdr_ib_agent_list_feign >> cc_cdr_ib_agent_list_load + +tr_cc_cdr_ib_agent_list_9092 = SSHOperator( +ssh_hook=sshHook, +task_id='tr_cc_cdr_ib_agent_list_9092', +command='/data/airflow/etl/SA/run_sa.sh {{ ds_nodash }} {{ params.my_param }} >>/data/airflow/logs/run_psql_{{ds_nodash}}.log 2>&1 ', +params={'my_param':"S98_S_tr_cc_cdr_ib_agent_list"}, +depends_on_past=False, +retries=3, +dag=dag) + +tr_cc_cdr_ib_list_9521 = SSHOperator( +ssh_hook=sshHook, +task_id='tr_cc_cdr_ib_list_9521', +command='/data/airflow/etl/SA/run_sa.sh {{ ds_nodash }} {{ params.my_param }} >>/data/airflow/logs/run_psql_{{ds_nodash}}.log 2>&1 ', +params={'my_param':"S98_S_tr_cc_cdr_ib_list"}, +depends_on_past=False, +retries=3, +dag=dag) + +tr_cc_cdr_ob_detail_5097 = SSHOperator( +ssh_hook=sshHook, +task_id='tr_cc_cdr_ob_detail_5097', +command='/data/airflow/etl/SA/run_sa.sh {{ ds_nodash }} {{ params.my_param }} >>/data/airflow/logs/run_psql_{{ds_nodash}}.log 2>&1 ', +params={'my_param':"S98_S_tr_cc_cdr_ob_detail"}, +depends_on_past=False, +retries=3, +dag=dag) + +tr_cc_cdr_ob_list_4070 = SSHOperator( +ssh_hook=sshHook, +task_id='tr_cc_cdr_ob_list_4070', +command='/data/airflow/etl/SA/run_sa.sh {{ ds_nodash }} {{ params.my_param }} >>/data/airflow/logs/run_psql_{{ds_nodash}}.log 2>&1 ', +params={'my_param':"S98_S_tr_cc_cdr_ob_list"}, +depends_on_past=False, +retries=3, +dag=dag) + +cc_cdr_ib_agent_list_load >> tr_cc_cdr_ib_agent_list_9092 +cc_cdr_ib_list_load >> tr_cc_cdr_ib_list_9521 +cc_cdr_ob_list_load >> tr_cc_cdr_ob_list_4070 +cc_cdr_ob_list_load >> tr_cc_cdr_ob_detail_5097 + +tr_cc_cdr_ob_detail_5097 >> task_failed +tr_cc_cdr_ob_list_4070 >> task_failed +tr_cc_cdr_ib_list_9521 >> task_failed +tr_cc_cdr_ib_agent_list_9092 >> task_failed diff --git a/dev/workflow/TK_Cust/smart_ccc_cdr/查询外呼记录列表/cc_cdr_ob_list_feign.py b/dev/workflow/TK_Cust/smart_ccc_cdr/查询外呼记录列表/cc_cdr_ob_list_feign.py new file mode 100644 index 0000000..ee6dc2f --- /dev/null +++ b/dev/workflow/TK_Cust/smart_ccc_cdr/查询外呼记录列表/cc_cdr_ob_list_feign.py @@ -0,0 +1,208 @@ +# coding: utf-8 +import requests +import json +import psycopg2 +import uuid +import datetime +import time +import hashlib +import time +import hmac +import base64 +import urllib.parse +import hashlib +from collections import OrderedDict +from urllib.parse import quote_plus + +#全局变量,便于参数使用的预设值 +current_date = datetime.date.today() # 获取当前日期 +previous_date = current_date - datetime.timedelta(days=1) # 获取前一天日期 +formatted_current_date = current_date.strftime("%Y-%m-%dT%H:%M:%SZ") # 获取当前日期 - 标准化 +formatted_previous_date = previous_date.strftime("%Y-%m-%dT%H:%M:%SZ") # 获取前一天日期 - 标准化 +timestamp = time.time() # 为Unix time,即从"1970-01-01 00:00:00"至今的秒数; +sign_version = 'v2' # 签名版本号,固定值v2 +nonce = str(uuid.uuid4()) +current_time_utc =( datetime.datetime.now() - datetime.timedelta(hours=8)).strftime("%Y-%m-%dT%H:%M:%SZ") + +formatted2_current_date = current_date.strftime("%Y-%m-%d %H:%M:%S") # 获取当前日期 - 标准化 +formatted2_previous_date = previous_date.strftime("%Y-%m-%d %H:%M:%S") # 获取前一天日期 - 标准化 + +def formatted2_previous_hour(h): + if h==0: + return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + start_of_current_hour = datetime.datetime.now().replace(minute=0, second=0, microsecond=0) + # 减去一个小时,得到前一个小时的开始时间 + start_of_previous_hour = start_of_current_hour - datetime.timedelta(hours=h) + return start_of_previous_hour.strftime("%Y-%m-%d %H:%M:%S") + +def previous_hour_timestamp(h): + if h==0: + return int(time.time()) + start_of_current_hour = datetime.datetime.now().replace(minute=0, second=0, microsecond=0) + # 减去一个小时,得到前一个小时的开始时间 + start_of_previous_hour = start_of_current_hour - datetime.timedelta(hours=h) + return int(start_of_previous_hour.timestamp()) + +#计算签名 +def generate_signature(str, private_key): + signature = hmac.new(private_key.encode(), (str).encode(), hashlib.sha1) + signature_b64 = base64.b64encode(signature.digest()).decode() + return signature_b64 + +#构建查询链接 +def build_query_string(params): + # 使用OrderedDict来保持排序 + sorted_params = OrderedDict(sorted(params.items())) + + # 拼接属性名和属性值,并使用&连接 + query_string = '&'.join('{}={}'.format( + urllib.parse.quote_plus(k), + urllib.parse.quote_plus(str(v)) + ) for k, v in sorted_params.items()) + return query_string + +#计算签名,get请求 +def request_data_signature_get(): + print(f'开始请求客服来电记录数据') + url='https://api-bj.clink.cn/cc/list_cdr_ob' + param={'Timestamp':current_time_utc,'Expires':86400,'startTime':previous_hour_timestamp(1),'startTimeEnd':previous_hour_timestamp(0),'AccessKeyId':'b17759d3a36fba9a2cf522fbf4cbf177'} + print(f'param: {param}') + url_path = build_query_string(param) + url_param = url_path + print(f'url_param: {url_param}') + url_param = f'GETapi-bj.clink.cn/cc/list_cdr_ob?{url_param}' + print(f'待计算字符串: {url_param}') + signature= generate_signature(url_param,'5g027B6w06630Y5240c1') + print(f'计算签名: {signature}') + print(f'编码后签名: {urllib.parse.quote_plus(signature)}') + url = f'{url}?{url_path}&Signature={urllib.parse.quote_plus(signature)}' + print(f'url: {url}') + + dataReqL=requests.get(url,headers={},params={}) + resText = dataReqL.text + i = 0 + while 'error' in resText and i < 5: + print(f'请求客服来电记录失败,再次请求第{i+1}次') + time.sleep(1) + dataReqL=requests.get(url,headers={},params={}) + resText = dataReqL.text + i = i + 1 + resD=json.loads(resText) + print(f'请求客服来电记录结束') + return resD + +def load_data_to_db(dataList): + conn = psycopg2.connect(database="dataops_db", user="dbuser_dops", password="MIgTi3jA",host="172.17.0.8", port="5432") + print('数据库连接成功') + dataId=str(uuid.uuid4()) + total=len(dataList) + print('临时id:'+dataId) + json_object = json.dumps(dataList) + cur=conn.cursor() + sql="update data_api.api_data set is_loaded = '1' where api_id = '3f5c5267f3ec40899b8b11cd592dda25';INSERT INTO data_api.api_data (id,api_id,data,total_num,is_loaded,status,request_tm,execute_tm,remark) values (%s,%s,%s,%s,'0','0',current_timestamp(0),current_timestamp(0),'')" + cur.execute(sql,[dataId,'3f5c5267f3ec40899b8b11cd592dda25', json_object, total]) + conn.commit() + cur.close() + conn.close() + print('加载数据结束:cc_cdr_ob_list:查询外呼记录列表') + + +#计算签名,get请求 +def request_detail_signature_get(id): + print(f'开始请求外呼详情:{id}') + url='https://api-bj.clink.cn/cc/cdr_ob_details' + param={'mainUniqueId':id,'Timestamp':current_time_utc,'Expires':86400,'AccessKeyId':'b17759d3a36fba9a2cf522fbf4cbf177'} + print(f'param: {param}') + url_path = build_query_string(param) + url_param = url_path + print(f'url_param: {url_param}') + url_param = f'GETapi-bj.clink.cn/cc/cdr_ob_details?{url_param}' + print(f'待计算字符串: {url_param}') + signature= generate_signature(url_param,'5g027B6w06630Y5240c1') + print(f'计算签名: {signature}') + print(f'编码后签名: {urllib.parse.quote_plus(signature)}') + url = f'{url}?{url_path}&Signature={urllib.parse.quote_plus(signature)}' + print(f'url: {url}') + + dataReqL=requests.get(url,headers={},params={}) + resText = dataReqL.text + i = 0 + while 'error' in resText and i < 5: + print(f'请求客服来电记录失败,再次请求第{i+1}次') + time.sleep(1) + dataReqL=requests.get(url,headers={},params={}) + resText = dataReqL.text + i = i + 1 + resD=json.loads(resText) + print(f'请求外呼详情:{id}结束') + return resD + + +def load_detail_data_to_db(ids, dataList): + conn = psycopg2.connect(database="dataops_db", user="dbuser_dops", password="MIgTi3jA",host="172.17.0.8", port="5432") + print('数据库连接成功') + dataId=str(uuid.uuid4()) + total=len(dataList) + print('临时id:'+dataId) + json_object = json.dumps(dataList) + idstr = ','.join(ids) + cur=conn.cursor() + sql="update data_api.cc_details_ids_exp set is_loaded = '1' where api_id = '7a38de24858a40ed9837f61ca7f80b08' and id in (%s); INSERT INTO data_api.cc_cdr_ob_details (id,api_id,data,total_num,is_loaded,status,request_tm,execute_tm,remark) values (%s,%s,%s,%s,'0','0',current_timestamp(0),current_timestamp(0),'')" + cur.execute(sql,[idstr,dataId,'7a38de24858a40ed9837f61ca7f80b08', json_object, total]) + conn.commit() + cur.close() + conn.close() + print('加载数据结束:cdr_ob_detail:获取外呼详情') + +def load_detail_exp_to_db(id): + try: + print(f'添加查询外呼详情异常记录:{id}') + conn = psycopg2.connect(database="dataops_db", user="dbuser_dops", password="MIgTi3jA",host="172.17.0.8", port="5432") + print('数据库连接成功') + dataId=str(uuid.uuid4()) + print('临时id:'+dataId) + cur=conn.cursor() + sql=" INSERT INTO data_api.cc_details_ids_exp (id,api_id,is_loaded,status,request_tm,execute_tm,remark) values (%s,%s,'0','0',current_timestamp(0),current_timestamp(0),'')" + cur.execute(sql,[id, '7a38de24858a40ed9837f61ca7f80b08']) + conn.commit() + cur.close() + conn.close() + print(f'添加查询工单异常记录:{id} 结束') + except Exception as e: + print(f'添加查询工单异常记录:{id}失败, 错误信息:{e}') + + +if __name__ == "__main__": + print(f'{formatted2_previous_hour(0)}开始请求外呼记录列表') + resL = request_data_signature_post() + print(resL) + if 'error' in resL: + error = resL['error'] + print(f'请求外呼记录列表失败,失败原因:{error}') + else: + dataList = resL['cdrOb'] + load_data_to_db(dataList) + detailDataList = [] + ids = [] + for data in dataList: + try: + id = data['id'] + resD = request_detail_signature_get(id) + #print(f"请求工单详情结束") + if 'cdrObDetails' in resD: + ids.append(id) + dataList = resD['cdrObDetails'] + # detailDataList.append(dataList) + detailDataList = detailDataList + dataList + else: + error = resD['error'] + print(f"请求外呼详情(id:{id})失败,错误信息:{error}") + load_detail_exp_to_db(id) + except Exception as e: + print(f'请求外呼详情(id:{id})异常, )异常信息:{e}') + load_detail_exp_to_db(data['id']) + if len(ids) > 0: + ids_str = [str(item) for item in ids] + load_detail_data_to_db(ids_str,detailDataList) + print(f'{formatted2_previous_hour(0)}请求外呼记录结束') + \ No newline at end of file diff --git a/dev/workflow/TK_Cust/smart_ccc_cdr/查询外呼记录列表/cc_cdr_ob_list_load.sql b/dev/workflow/TK_Cust/smart_ccc_cdr/查询外呼记录列表/cc_cdr_ob_list_load.sql new file mode 100644 index 0000000..86b7b9f --- /dev/null +++ b/dev/workflow/TK_Cust/smart_ccc_cdr/查询外呼记录列表/cc_cdr_ob_list_load.sql @@ -0,0 +1,198 @@ +/*******Main Section**************************************************************************/ +\set ON_ERROR_STOP on +\set AUTOCOMMIT on +\timing on + +DELETE FROM data_api.tr_cc_cdr_ob_list; + +insert into data_api.tr_cc_cdr_ob_list ( + customer_number + , customer_number_encrypt + , customer_area + , customer_province + , customer_city + , call_type + , call_type_key + , left_clid + , left_clid_area + , left_clid_province + , left_clid_city + , trunk_group_key + , xnumber + , xnumber_area + , xnumber_province + , xnumber_city + , status + , status_desc + , tag_names + , main_unique_id + , request_unique_id + , ob_sip_cause + , on_hook_source + , record_file + , asr_record + , evaluation + , investigation_keys + , call_id + , webrtc_call_id + , rtc_uid + , cno + , client_name + , client_number + , start_time + , up_time + , callee_ringing_time + , bridge_time + , end_time + , bridge_duration + , total_duration + , pre_ring_wait_duration + , callee_ringing_duration + , ob_wait_duration + , task_id + , task_name + , task_inventory_id + , exist_ticket + , ticket_ids + , exist_business + , business_ids + , user_field + , exist_customer + , customer_area_code + , customer_post_code + , customer_vip + , enterprise_id + , mark_data + , type + ,etl_tx_dt +) +select + case when trim(both from customer_number)='' then null else customer_number::text end customer_number + , case when trim(both from customer_number_encrypt)='' then null else customer_number_encrypt::text end customer_number_encrypt + , case when trim(both from customer_area)='' then null else customer_area::text end customer_area + , case when trim(both from customer_province)='' then null else customer_province::text end customer_province + , case when trim(both from customer_city)='' then null else customer_city::text end customer_city + , case when trim(both from call_type)='' then null else call_type::text end call_type + , case when trim(both from call_type_key)='' then null else call_type_key::text end call_type_key + , case when trim(both from left_clid)='' then null else left_clid::text end left_clid + , case when trim(both from left_clid_area)='' then null else left_clid_area::text end left_clid_area + , case when trim(both from left_clid_province)='' then null else left_clid_province::text end left_clid_province + , case when trim(both from left_clid_city)='' then null else left_clid_city::text end left_clid_city + , case when trim(both from trunk_group_key)='' then null else trunk_group_key::text end trunk_group_key + , case when trim(both from xnumber)='' then null else xnumber::text end xnumber + , case when trim(both from xnumber_area)='' then null else xnumber_area::text end xnumber_area + , case when trim(both from xnumber_province)='' then null else xnumber_province::text end xnumber_province + , case when trim(both from xnumber_city)='' then null else xnumber_city::text end xnumber_city + , case when trim(both from status)='' then null else status::text end status + , case when trim(both from status_desc)='' then null else status_desc::text end status_desc + , case when trim(both from tag_names)='' then null else tag_names::text end tag_names + , case when trim(both from main_unique_id)='' then null else main_unique_id::text end main_unique_id + , case when trim(both from request_unique_id)='' then null else request_unique_id::text end request_unique_id + , case when trim(both from ob_sip_cause)='' then null else ob_sip_cause::text end ob_sip_cause + , case when trim(both from on_hook_source)='' then null else on_hook_source::text end on_hook_source + , case when trim(both from record_file)='' then null else record_file::text end record_file + , case when trim(both from asr_record)='' then null else asr_record::text end asr_record + , case when trim(both from evaluation)='' then null else evaluation::text end evaluation + , case when trim(both from investigation_keys)='' then null else investigation_keys::text end investigation_keys + , case when trim(both from call_id)='' then null else call_id::text end call_id + , case when trim(both from webrtc_call_id)='' then null else webrtc_call_id::text end webrtc_call_id + , case when trim(both from rtc_uid)='' then null else rtc_uid::text end rtc_uid + , case when trim(both from cno)='' then null else cno::text end cno + , case when trim(both from client_name)='' then null else client_name::text end client_name + , case when trim(both from client_number)='' then null else client_number::text end client_number + , case when trim(both from start_time)='' then null else start_time::text end start_time + , case when trim(both from up_time)='' then null else up_time::text end up_time + , case when trim(both from callee_ringing_time)='' then null else callee_ringing_time::text end callee_ringing_time + , case when trim(both from bridge_time)='' then null else bridge_time::text end bridge_time + , case when trim(both from end_time)='' then null else end_time::text end end_time + , case when trim(both from bridge_duration)='' then null else bridge_duration::text end bridge_duration + , case when trim(both from total_duration)='' then null else total_duration::text end total_duration + , case when trim(both from pre_ring_wait_duration)='' then null else pre_ring_wait_duration::text end pre_ring_wait_duration + , case when trim(both from callee_ringing_duration)='' then null else callee_ringing_duration::text end callee_ringing_duration + , case when trim(both from ob_wait_duration)='' then null else ob_wait_duration::text end ob_wait_duration + , case when trim(both from task_id)='' then null else task_id::text end task_id + , case when trim(both from task_name)='' then null else task_name::text end task_name + , case when trim(both from task_inventory_id)='' then null else task_inventory_id::text end task_inventory_id + , case when trim(both from exist_ticket)='' then null else exist_ticket::text end exist_ticket + , case when trim(both from ticket_ids)='' then null else ticket_ids::text end ticket_ids + , case when trim(both from exist_business)='' then null else exist_business::text end exist_business + , case when trim(both from business_ids)='' then null else business_ids::text end business_ids + , case when trim(both from user_field)='' then null else user_field::text end user_field + , case when trim(both from exist_customer)='' then null else exist_customer::text end exist_customer + , case when trim(both from customer_area_code)='' then null else customer_area_code::text end customer_area_code + , case when trim(both from customer_post_code)='' then null else customer_post_code::text end customer_post_code + , case when trim(both from customer_vip)='' then null else customer_vip::text end customer_vip + , case when trim(both from enterprise_id)='' then null else enterprise_id::text end enterprise_id + , case when trim(both from mark_data)='' then null else mark_data::text end mark_data + , case when trim(both from type)='' then null else type::text end type +,etl_tx_dt +from ( +select + (json_array_elements(data::json)::json->>'customerNumber') customer_number + , (json_array_elements(data::json)::json->>'customerNumberEncrypt') customer_number_encrypt + , (json_array_elements(data::json)::json->>'customerArea') customer_area + , (json_array_elements(data::json)::json->>'customerProvince') customer_province + , (json_array_elements(data::json)::json->>'customerCity') customer_city + , (json_array_elements(data::json)::json->>'callType') call_type + , (json_array_elements(data::json)::json->>'callTypeKey') call_type_key + , (json_array_elements(data::json)::json->>'leftClid') left_clid + , (json_array_elements(data::json)::json->>'leftClidArea') left_clid_area + , (json_array_elements(data::json)::json->>'leftClidProvince') left_clid_province + , (json_array_elements(data::json)::json->>'leftClidCity') left_clid_city + , (json_array_elements(data::json)::json->>'trunkGroupKey') trunk_group_key + , (json_array_elements(data::json)::json->>'xnumber') xnumber + , (json_array_elements(data::json)::json->>'xnumberArea') xnumber_area + , (json_array_elements(data::json)::json->>'xnumberProvince') xnumber_province + , (json_array_elements(data::json)::json->>'xnumberCity') xnumber_city + , (json_array_elements(data::json)::json->>'status') status + , (json_array_elements(data::json)::json->>'statusDesc') status_desc + , (json_array_elements(data::json)::json->>'tagNames') tag_names + , (json_array_elements(data::json)::json->>'mainUniqueId') main_unique_id + , (json_array_elements(data::json)::json->>'requestUniqueId') request_unique_id + , (json_array_elements(data::json)::json->>'obSipCause') ob_sip_cause + , (json_array_elements(data::json)::json->>'onHookSource') on_hook_source + , (json_array_elements(data::json)::json->>'recordFile') record_file + , (json_array_elements(data::json)::json->>'asrRecord') asr_record + , (json_array_elements(data::json)::json->>'evaluation') evaluation + , (json_array_elements(data::json)::json->>'investigationKeys') investigation_keys + , (json_array_elements(data::json)::json->>'callId') call_id + , (json_array_elements(data::json)::json->>'webrtcCallId') webrtc_call_id + , (json_array_elements(data::json)::json->>'rtcUid') rtc_uid + , (json_array_elements(data::json)::json->>'cno') cno + , (json_array_elements(data::json)::json->>'clientName') client_name + , (json_array_elements(data::json)::json->>'clientNumber') client_number + , (json_array_elements(data::json)::json->>'startTime') start_time + , (json_array_elements(data::json)::json->>'upTime') up_time + , (json_array_elements(data::json)::json->>'calleeRingingTime') callee_ringing_time + , (json_array_elements(data::json)::json->>'bridgeTime') bridge_time + , (json_array_elements(data::json)::json->>'endTime') end_time + , (json_array_elements(data::json)::json->>'bridgeDuration') bridge_duration + , (json_array_elements(data::json)::json->>'totalDuration') total_duration + , (json_array_elements(data::json)::json->>'preRingWaitDuration') pre_ring_wait_duration + , (json_array_elements(data::json)::json->>'calleeRingingDuration') callee_ringing_duration + , (json_array_elements(data::json)::json->>'obWaitDuration') ob_wait_duration + , (json_array_elements(data::json)::json->>'taskId') task_id + , (json_array_elements(data::json)::json->>'taskName') task_name + , (json_array_elements(data::json)::json->>'taskInventoryId') task_inventory_id + , (json_array_elements(data::json)::json->>'existTicket') exist_ticket + , (json_array_elements(data::json)::json->>'ticketIds') ticket_ids + , (json_array_elements(data::json)::json->>'existBusiness') exist_business + , (json_array_elements(data::json)::json->>'businessIds') business_ids + , (json_array_elements(data::json)::json->>'userField') user_field + , (json_array_elements(data::json)::json->>'existCustomer') exist_customer + , (json_array_elements(data::json)::json->>'customerAreaCode') customer_area_code + , (json_array_elements(data::json)::json->>'customerPostCode') customer_post_code + , (json_array_elements(data::json)::json->>'customerVip') customer_vip + , (json_array_elements(data::json)::json->>'enterpriseId') enterprise_id + , (json_array_elements(data::json)::json->>'markData') mark_data + , (json_array_elements(data::json)::json->>'type') type + ,CURRENT_TIMESTAMP(0) etl_tx_dt +from (select * from data_api.api_data +WHERE api_id='3f5c5267f3ec40899b8b11cd592dda25' and is_loaded = '0' order by request_tm desc limit 1) p )p; + +update data_api.api_data +set is_loaded = '1' , + status = '1', + request_tm = current_timestamp(0) +where api_id='3f5c5267f3ec40899b8b11cd592dda25'; +\q \ No newline at end of file diff --git a/dev/workflow/TK_Cust/smart_ccc_cdr/查询外呼记录详情/cc_cdr_ob_detail_feign.py b/dev/workflow/TK_Cust/smart_ccc_cdr/查询外呼记录详情/cc_cdr_ob_detail_feign.py new file mode 100644 index 0000000..79e282b --- /dev/null +++ b/dev/workflow/TK_Cust/smart_ccc_cdr/查询外呼记录详情/cc_cdr_ob_detail_feign.py @@ -0,0 +1,121 @@ +# coding: utf-8 +import requests +import json +import psycopg2 +import uuid +import datetime +import time +import hashlib +import time +import hmac +import base64 +import urllib.parse +import hashlib +from collections import OrderedDict +from urllib.parse import quote_plus + +#全局变量,便于参数使用的预设值 +current_date = datetime.date.today() # 获取当前日期 +previous_date = current_date - datetime.timedelta(days=1) # 获取前一天日期 +formatted_current_date = current_date.strftime("%Y-%m-%dT%H:%M:%SZ") # 获取当前日期 - 标准化 +formatted_previous_date = previous_date.strftime("%Y-%m-%dT%H:%M:%SZ") # 获取前一天日期 - 标准化 +timestamp = time.time() # 为Unix time,即从"1970-01-01 00:00:00"至今的秒数; +sign_version = 'v2' # 签名版本号,固定值v2 +nonce = str(uuid.uuid4()) +current_time_utc =( datetime.datetime.now() - datetime.timedelta(hours=8)).strftime("%Y-%m-%dT%H:%M:%SZ") + +formatted2_current_date = current_date.strftime("%Y-%m-%d %H:%M:%S") # 获取当前日期 - 标准化 +formatted2_previous_date = previous_date.strftime("%Y-%m-%d %H:%M:%S") # 获取前一天日期 - 标准化 + +def formatted2_previous_hour(h): + if h==0: + return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + start_of_current_hour = datetime.datetime.now().replace(minute=0, second=0, microsecond=0) + # 减去一个小时,得到前一个小时的开始时间 + start_of_previous_hour = start_of_current_hour - datetime.timedelta(hours=h) + return start_of_previous_hour.strftime("%Y-%m-%d %H:%M:%S") + +def previous_hour_timestamp(h): + if h==0: + return int(time.time()) + start_of_current_hour = datetime.datetime.now().replace(minute=0, second=0, microsecond=0) + # 减去一个小时,得到前一个小时的开始时间 + start_of_previous_hour = start_of_current_hour - datetime.timedelta(hours=h) + return int(start_of_previous_hour.timestamp()) + +#计算签名 +def generate_signature(str, private_key): + signature = hmac.new(private_key.encode(), (str).encode(), hashlib.sha1) + signature_b64 = base64.b64encode(signature.digest()).decode() + return signature_b64 + +#构建查询链接 +def build_query_string(params): + # 使用OrderedDict来保持排序 + sorted_params = OrderedDict(sorted(params.items())) + + # 拼接属性名和属性值,并使用&连接 + query_string = '&'.join('{}={}'.format( + urllib.parse.quote_plus(k), + urllib.parse.quote_plus(str(v)) + ) for k, v in sorted_params.items()) + return query_string + + +#计算签名,get请求 +def request_data_signature_get(): + print('开始请求数据...') + url='https://api-bj.clink.cn/cc/cdr_ob_details' + param={'mainUniqueId':'','AccessKeyId':'b17759d3a36fba9a2cf522fbf4cbf177','Timestamp':current_time_utc,'Expires':Expires,} + print(f'param: {param}') + paramJson = {"mainUniqueId":"","Timestamp":""} + print(f'paramJson: {paramJson}') + url_path = build_query_string(param) + url_param = build_query_string(param) + print(f'url_param: {url_param}') + url_param = f'GETapi-bj.clink.cn/cc/cdr_ob_details?{url_param}' + print(f'待计算字符串: {url_param}') + signature= generate_signature(url_param,'5g027B6w06630Y5240c1') + print(f'计算签名: {signature}') + print(f'编码后签名: {urllib.parse.quote_plus(signature)}') + url = f'{url}?{url_path}&Signature={urllib.parse.quote_plus(signature)}' + print(f'url: {url}') + + dataReqL=requests.get(url,headers={},params={}) + i = 0 + while 'error' in dataReqL and i < 5: + time.sleep(1) + dataReqL=requests.get(url,headers={},params={}) + i = i + 1 + resL=json.loads(dataReqL.text) + return resL + + + +def load_data_to_db(dataList): + conn = psycopg2.connect(database="dataops_db", user="dbuser_dops", password="MIgTi3jA",host="172.17.0.8", port="5432") + print('数据库连接成功') + dataId=str(uuid.uuid4()) + total=len(dataList) + print('临时id:'+dataId) + json_object = json.dumps(dataList) + cur=conn.cursor() + sql="update data_api.api_data set is_loaded = '1' where api_id = '7a38de24858a40ed9837f61ca7f80b08';INSERT INTO data_api.api_data (id,api_id,data,total_num,is_loaded,status,request_tm,execute_tm,remark) values (%s,%s,%s,%s,'0','0',current_timestamp(0),current_timestamp(0),'')" + cur.execute(sql,[dataId,'7a38de24858a40ed9837f61ca7f80b08', json_object, total]) + conn.commit() + cur.close() + conn.close() + print('加载数据结束:cc_cdr_ob_detail:查询外呼记录详情') + + + +if __name__ == "__main__": + + + + resL = request_data_signature_get() + print(resL) + + if 'error' in resL: + load_error_to_db(resl) + load_data_to_db(resL[''cdrObDetails']) \ No newline at end of file diff --git a/dev/workflow/TK_Cust/smart_ccc_cdr/查询外呼记录详情/cc_cdr_ob_detail_load.sql b/dev/workflow/TK_Cust/smart_ccc_cdr/查询外呼记录详情/cc_cdr_ob_detail_load.sql new file mode 100644 index 0000000..9819a31 --- /dev/null +++ b/dev/workflow/TK_Cust/smart_ccc_cdr/查询外呼记录详情/cc_cdr_ob_detail_load.sql @@ -0,0 +1,87 @@ +/*******Main Section**************************************************************************/ +\set ON_ERROR_STOP on +\set AUTOCOMMIT on +\timing on + +DELETE FROM data_api.tr_cc_cdr_ob_detail; + +insert into data_api.tr_cc_cdr_ob_detail ( + cno + , client_name + , client_number + , start_time + , callee_ringing_time + , answer_time + , end_time + , bridge_duration + , call_type + , call_type_desc + , detail_call_type + , detail_call_type_desc + , ob_sip_cause + , sip_cause + , sip_cause_desc + , record_file + , tsi_file + , call_id + , webrtc_call_id + , main_unique_id + , unique_id + ,etl_tx_dt +) +select + case when trim(both from cno)='' then null else cno::text end cno + , case when trim(both from client_name)='' then null else client_name::text end client_name + , case when trim(both from client_number)='' then null else client_number::text end client_number + , case when trim(both from start_time)='' then null else start_time::text end start_time + , case when trim(both from callee_ringing_time)='' then null else callee_ringing_time::text end callee_ringing_time + , case when trim(both from answer_time)='' then null else answer_time::text end answer_time + , case when trim(both from end_time)='' then null else end_time::text end end_time + , case when trim(both from bridge_duration)='' then null else bridge_duration::text end bridge_duration + , case when trim(both from call_type)='' then null else call_type::text end call_type + , case when trim(both from call_type_desc)='' then null else call_type_desc::text end call_type_desc + , case when trim(both from detail_call_type)='' then null else detail_call_type::text end detail_call_type + , case when trim(both from detail_call_type_desc)='' then null else detail_call_type_desc::text end detail_call_type_desc + , case when trim(both from ob_sip_cause)='' then null else ob_sip_cause::text end ob_sip_cause + , case when trim(both from sip_cause)='' then null else sip_cause::text end sip_cause + , case when trim(both from sip_cause_desc)='' then null else sip_cause_desc::text end sip_cause_desc + , case when trim(both from record_file)='' then null else record_file::text end record_file + , case when trim(both from tsi_file)='' then null else tsi_file::text end tsi_file + , case when trim(both from call_id)='' then null else call_id::text end call_id + , case when trim(both from webrtc_call_id)='' then null else webrtc_call_id::text end webrtc_call_id + , case when trim(both from main_unique_id)='' then null else main_unique_id::text end main_unique_id + , case when trim(both from unique_id)='' then null else unique_id::text end unique_id +,etl_tx_dt +from ( +select + (json_array_elements(data::json)::json->>'cno') cno + , (json_array_elements(data::json)::json->>'clientName') client_name + , (json_array_elements(data::json)::json->>'clientNumber') client_number + , (json_array_elements(data::json)::json->>'startTime') start_time + , (json_array_elements(data::json)::json->>'calleeRingingTime') callee_ringing_time + , (json_array_elements(data::json)::json->>'answerTime') answer_time + , (json_array_elements(data::json)::json->>'endTime') end_time + , (json_array_elements(data::json)::json->>'bridgeDuration') bridge_duration + , (json_array_elements(data::json)::json->>'callType') call_type + , (json_array_elements(data::json)::json->>'callTypeDesc') call_type_desc + , (json_array_elements(data::json)::json->>'detailCallType') detail_call_type + , (json_array_elements(data::json)::json->>'detailCallTypeDesc') detail_call_type_desc + , (json_array_elements(data::json)::json->>'obSipCause') ob_sip_cause + , (json_array_elements(data::json)::json->>'sipCause') sip_cause + , (json_array_elements(data::json)::json->>'sipCauseDesc') sip_cause_desc + , (json_array_elements(data::json)::json->>'recordFile') record_file + , (json_array_elements(data::json)::json->>'tsiFile') tsi_file + , (json_array_elements(data::json)::json->>'callId') call_id + , (json_array_elements(data::json)::json->>'webrtcCallId') webrtc_call_id + , (json_array_elements(data::json)::json->>'mainUniqueId') main_unique_id + , (json_array_elements(data::json)::json->>'uniqueId') unique_id + ,CURRENT_TIMESTAMP(0) etl_tx_dt +from (select * from data_api.api_data +WHERE api_id='7a38de24858a40ed9837f61ca7f80b08' and is_loaded = '0' order by request_tm desc limit 1) p )p; + +update data_api.api_data +set is_loaded = '1' , + status = '1', + request_tm = current_timestamp(0) +where api_id='7a38de24858a40ed9837f61ca7f80b08'; +\q \ No newline at end of file diff --git a/dev/workflow/TK_Cust/smart_ccc_cdr/查询客户来电记录列表/cc_cdr_ib_list_feign.py b/dev/workflow/TK_Cust/smart_ccc_cdr/查询客户来电记录列表/cc_cdr_ib_list_feign.py new file mode 100644 index 0000000..fb07e5f --- /dev/null +++ b/dev/workflow/TK_Cust/smart_ccc_cdr/查询客户来电记录列表/cc_cdr_ib_list_feign.py @@ -0,0 +1,121 @@ +# coding: utf-8 +import requests +import json +import psycopg2 +import uuid +import datetime +import time +import hashlib +import time +import hmac +import base64 +import urllib.parse +import hashlib +from collections import OrderedDict +from urllib.parse import quote_plus + +#全局变量,便于参数使用的预设值 +current_date = datetime.date.today() # 获取当前日期 +previous_date = current_date - datetime.timedelta(days=1) # 获取前一天日期 +formatted_current_date = current_date.strftime("%Y-%m-%dT%H:%M:%SZ") # 获取当前日期 - 标准化 +formatted_previous_date = previous_date.strftime("%Y-%m-%dT%H:%M:%SZ") # 获取前一天日期 - 标准化 +timestamp = time.time() # 为Unix time,即从"1970-01-01 00:00:00"至今的秒数; +sign_version = 'v2' # 签名版本号,固定值v2 +nonce = str(uuid.uuid4()) +current_time_utc =( datetime.datetime.now() - datetime.timedelta(hours=8)).strftime("%Y-%m-%dT%H:%M:%SZ") + +formatted2_current_date = current_date.strftime("%Y-%m-%d %H:%M:%S") # 获取当前日期 - 标准化 +formatted2_previous_date = previous_date.strftime("%Y-%m-%d %H:%M:%S") # 获取前一天日期 - 标准化 + +def formatted2_previous_hour(h): + if h==0: + return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + start_of_current_hour = datetime.datetime.now().replace(minute=0, second=0, microsecond=0) + # 减去一个小时,得到前一个小时的开始时间 + start_of_previous_hour = start_of_current_hour - datetime.timedelta(hours=h) + return start_of_previous_hour.strftime("%Y-%m-%d %H:%M:%S") + +def previous_hour_timestamp(h): + if h==0: + return int(time.time()) + start_of_current_hour = datetime.datetime.now().replace(minute=0, second=0, microsecond=0) + # 减去一个小时,得到前一个小时的开始时间 + start_of_previous_hour = start_of_current_hour - datetime.timedelta(hours=h) + return int(start_of_previous_hour.timestamp()) + +#计算签名 +def generate_signature(str, private_key): + signature = hmac.new(private_key.encode(), (str).encode(), hashlib.sha1) + signature_b64 = base64.b64encode(signature.digest()).decode() + return signature_b64 + +#构建查询链接 +def build_query_string(params): + # 使用OrderedDict来保持排序 + sorted_params = OrderedDict(sorted(params.items())) + + # 拼接属性名和属性值,并使用&连接 + query_string = '&'.join('{}={}'.format( + urllib.parse.quote_plus(k), + urllib.parse.quote_plus(str(v)) + ) for k, v in sorted_params.items()) + return query_string + +#计算签名,get请求 +def request_data_signature_get(): + print(f'开始请求客服来电记录数据') + url='https://api-bj.clink.cn/cc/list_cdr_ib' + param={'Timestamp':current_time_utc,'Expires':86400,'startTime':previous_hour_timestamp(1),'startTimeEnd':previous_hour_timestamp(0),'AccessKeyId':'b17759d3a36fba9a2cf522fbf4cbf177'} + print(f'param: {param}') + url_path = build_query_string(param) + url_param = url_path + print(f'url_param: {url_param}') + url_param = f'GETapi-bj.clink.cn/cc/list_cdr_ib?{url_param}' + print(f'待计算字符串: {url_param}') + signature= generate_signature(url_param,'5g027B6w06630Y5240c1') + print(f'计算签名: {signature}') + print(f'编码后签名: {urllib.parse.quote_plus(signature)}') + url = f'{url}?{url_path}&Signature={urllib.parse.quote_plus(signature)}' + print(f'url: {url}') + + dataReqL=requests.get(url,headers={},params={}) + resText = dataReqL.text + i = 0 + while 'error' in resText and i < 5: + print(f'请求客服来电记录失败,再次请求第{i+1}次') + time.sleep(1) + dataReqL=requests.get(url,headers={},params={}) + resText = dataReqL.text + i = i + 1 + resD=json.loads(resText) + print(f'请求客服来电记录结束') + return resD + + +def load_data_to_db(dataList): + conn = psycopg2.connect(database="dataops_db", user="dbuser_dops", password="MIgTi3jA",host="172.17.0.8", port="5432") + print('数据库连接成功') + dataId=str(uuid.uuid4()) + total=len(dataList) + print('临时id:'+dataId) + json_object = json.dumps(dataList) + cur=conn.cursor() + sql="update data_api.api_data set is_loaded = '1' where api_id = '0be1a203e6e24db88008c5445283cda0';INSERT INTO data_api.api_data (id,api_id,data,total_num,is_loaded,status,request_tm,execute_tm,remark) values (%s,%s,%s,%s,'0','0',current_timestamp(0),current_timestamp(0),'')" + cur.execute(sql,[dataId,'0be1a203e6e24db88008c5445283cda0', json_object, total]) + conn.commit() + cur.close() + conn.close() + print('加载数据结束:cc_cdr_ib_list:查询客户来电记录列表') + +if __name__ == "__main__": + print(f'{formatted2_previous_hour(0)}开始请求客户来电记录信息') + resL = request_data_signature_get() + print(resL) + if 'error' in resL: + error = resL['error'] + print(f'请求客户来电记录失败,失败原因:{error}') + else: + dataList = resL['cdrIb'] + load_data_to_db(dataList) + print(f'{formatted2_previous_hour(0)}请求客户来电记录结束') + \ No newline at end of file diff --git a/dev/workflow/TK_Cust/smart_ccc_cdr/查询客户来电记录列表/cc_cdr_ib_list_load.sql b/dev/workflow/TK_Cust/smart_ccc_cdr/查询客户来电记录列表/cc_cdr_ib_list_load.sql new file mode 100644 index 0000000..16705c9 --- /dev/null +++ b/dev/workflow/TK_Cust/smart_ccc_cdr/查询客户来电记录列表/cc_cdr_ib_list_load.sql @@ -0,0 +1,123 @@ +/*******Main Section**************************************************************************/ +\set ON_ERROR_STOP on +\set AUTOCOMMIT on +\timing on + +DELETE FROM data_api.tr_cc_cdr_ib_list; + +insert into data_api.tr_cc_cdr_ib_list ( + agent_answer_in_time + , bridge_duration + , bridge_time + , call_id + , customer_city + , customer_number + , customer_number_encrypt + , customer_province + , end_time + , evaluation + , first_call_cname + , first_call_cno + , first_call_number + , first_call_qname + , first_call_qno + , first_join_queue_time + , hotline + , hotline_name + , investigation_keys + , ivr_name + , main_unique_id + , on_hook_source + , record_file + , say_voice_duration + , start_time + , status + , status_result + , status_robot + , tag_names + , total_duration + , user_field + , webrtc_call_id + , xnumber + ,etl_tx_dt +) +select + case when trim(both from agent_answer_in_time)='' then null else agent_answer_in_time::text end agent_answer_in_time + , case when trim(both from bridge_duration)='' then null else bridge_duration::text end bridge_duration + , case when trim(both from bridge_time)='' then null else bridge_time::text end bridge_time + , case when trim(both from call_id)='' then null else call_id::text end call_id + , case when trim(both from customer_city)='' then null else customer_city::text end customer_city + , case when trim(both from customer_number)='' then null else customer_number::text end customer_number + , case when trim(both from customer_number_encrypt)='' then null else customer_number_encrypt::text end customer_number_encrypt + , case when trim(both from customer_province)='' then null else customer_province::text end customer_province + , case when trim(both from end_time)='' then null else end_time::text end end_time + , case when trim(both from evaluation)='' then null else evaluation::text end evaluation + , case when trim(both from first_call_cname)='' then null else first_call_cname::text end first_call_cname + , case when trim(both from first_call_cno)='' then null else first_call_cno::text end first_call_cno + , case when trim(both from first_call_number)='' then null else first_call_number::text end first_call_number + , case when trim(both from first_call_qname)='' then null else first_call_qname::text end first_call_qname + , case when trim(both from first_call_qno)='' then null else first_call_qno::text end first_call_qno + , case when trim(both from first_join_queue_time)='' then null else first_join_queue_time::text end first_join_queue_time + , case when trim(both from hotline)='' then null else hotline::text end hotline + , case when trim(both from hotline_name)='' then null else hotline_name::text end hotline_name + , case when trim(both from investigation_keys)='' then null else investigation_keys::text end investigation_keys + , case when trim(both from ivr_name)='' then null else ivr_name::text end ivr_name + , case when trim(both from main_unique_id)='' then null else main_unique_id::text end main_unique_id + , case when trim(both from on_hook_source)='' then null else on_hook_source::text end on_hook_source + , case when trim(both from record_file)='' then null else record_file::text end record_file + , case when trim(both from say_voice_duration)='' then null else say_voice_duration::text end say_voice_duration + , case when trim(both from start_time)='' then null else start_time::text end start_time + , case when trim(both from status)='' then null else status::text end status + , case when trim(both from status_result)='' then null else status_result::text end status_result + , case when trim(both from status_robot)='' then null else status_robot::text end status_robot + , case when trim(both from tag_names)='' then null else tag_names::text end tag_names + , case when trim(both from total_duration)='' then null else total_duration::text end total_duration + , case when trim(both from user_field)='' then null else user_field::text end user_field + , case when trim(both from webrtc_call_id)='' then null else webrtc_call_id::text end webrtc_call_id + , case when trim(both from xnumber)='' then null else xnumber::text end xnumber +,etl_tx_dt +from ( +select + (json_array_elements(data::json)::json->>'agentAnswerInTime') agent_answer_in_time + , (json_array_elements(data::json)::json->>'bridgeDuration') bridge_duration + , (json_array_elements(data::json)::json->>'bridgeTime') bridge_time + , (json_array_elements(data::json)::json->>'callId') call_id + , (json_array_elements(data::json)::json->>'customerCity') customer_city + , (json_array_elements(data::json)::json->>'customerNumber') customer_number + , (json_array_elements(data::json)::json->>'customerNumberEncrypt') customer_number_encrypt + , (json_array_elements(data::json)::json->>'customerProvince') customer_province + , (json_array_elements(data::json)::json->>'endTime') end_time + , (json_array_elements(data::json)::json->>'evaluation') evaluation + , (json_array_elements(data::json)::json->>'firstCallCname') first_call_cname + , (json_array_elements(data::json)::json->>'firstCallCno') first_call_cno + , (json_array_elements(data::json)::json->>'firstCallNumber') first_call_number + , (json_array_elements(data::json)::json->>'firstCallQname') first_call_qname + , (json_array_elements(data::json)::json->>'firstCallQno') first_call_qno + , (json_array_elements(data::json)::json->>'firstJoinQueueTime') first_join_queue_time + , (json_array_elements(data::json)::json->>'hotline') hotline + , (json_array_elements(data::json)::json->>'hotlineName') hotline_name + , (json_array_elements(data::json)::json->>'investigationKeys') investigation_keys + , (json_array_elements(data::json)::json->>'ivrName') ivr_name + , (json_array_elements(data::json)::json->>'mainUniqueId') main_unique_id + , (json_array_elements(data::json)::json->>'onHookSource') on_hook_source + , (json_array_elements(data::json)::json->>'recordFile') record_file + , (json_array_elements(data::json)::json->>'sayVoiceDuration') say_voice_duration + , (json_array_elements(data::json)::json->>'startTime') start_time + , (json_array_elements(data::json)::json->>'status') status + , (json_array_elements(data::json)::json->>'statusResult') status_result + , (json_array_elements(data::json)::json->>'statusRobot') status_robot + , (json_array_elements(data::json)::json->>'tagNames') tag_names + , (json_array_elements(data::json)::json->>'totalDuration') total_duration + , (json_array_elements(data::json)::json->>'userField') user_field + , (json_array_elements(data::json)::json->>'webrtcCallId') webrtc_call_id + , (json_array_elements(data::json)::json->>'xnumber') xnumber + ,CURRENT_TIMESTAMP(0) etl_tx_dt +from (select * from data_api.api_data +WHERE api_id='0be1a203e6e24db88008c5445283cda0' and is_loaded = '0' order by request_tm desc limit 1) p )p; + +update data_api.api_data +set is_loaded = '1' , + status = '1', + request_tm = current_timestamp(0) +where api_id='0be1a203e6e24db88008c5445283cda0'; +\q \ No newline at end of file diff --git a/dev/workflow/TK_Cust/smart_ccc_cdr/查询座席接听记录列表/cc_cdr_ib_agent_list_feign.py b/dev/workflow/TK_Cust/smart_ccc_cdr/查询座席接听记录列表/cc_cdr_ib_agent_list_feign.py new file mode 100644 index 0000000..1dff7ad --- /dev/null +++ b/dev/workflow/TK_Cust/smart_ccc_cdr/查询座席接听记录列表/cc_cdr_ib_agent_list_feign.py @@ -0,0 +1,123 @@ +# coding: utf-8 +import requests +import json +import psycopg2 +import uuid +import datetime +import time +import hashlib +import time +import hmac +import base64 +import urllib.parse +import hashlib +from collections import OrderedDict +from urllib.parse import quote_plus + +#全局变量,便于参数使用的预设值 +current_date = datetime.date.today() # 获取当前日期 +previous_date = current_date - datetime.timedelta(days=1) # 获取前一天日期 +formatted_current_date = current_date.strftime("%Y-%m-%dT%H:%M:%SZ") # 获取当前日期 - 标准化 +formatted_previous_date = previous_date.strftime("%Y-%m-%dT%H:%M:%SZ") # 获取前一天日期 - 标准化 +timestamp = time.time() # 为Unix time,即从"1970-01-01 00:00:00"至今的秒数; +sign_version = 'v2' # 签名版本号,固定值v2 +nonce = str(uuid.uuid4()) +current_time_utc =( datetime.datetime.now() - datetime.timedelta(hours=8)).strftime("%Y-%m-%dT%H:%M:%SZ") + +formatted2_current_date = current_date.strftime("%Y-%m-%d %H:%M:%S") # 获取当前日期 - 标准化 +formatted2_previous_date = previous_date.strftime("%Y-%m-%d %H:%M:%S") # 获取前一天日期 - 标准化 + +def formatted2_previous_hour(h): + if h==0: + return datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + start_of_current_hour = datetime.datetime.now().replace(minute=0, second=0, microsecond=0) + # 减去一个小时,得到前一个小时的开始时间 + start_of_previous_hour = start_of_current_hour - datetime.timedelta(hours=h) + return start_of_previous_hour.strftime("%Y-%m-%d %H:%M:%S") + +def previous_hour_timestamp(h): + if h==0: + return int(time.time()) + start_of_current_hour = datetime.datetime.now().replace(minute=0, second=0, microsecond=0) + # 减去一个小时,得到前一个小时的开始时间 + start_of_previous_hour = start_of_current_hour - datetime.timedelta(hours=h) + return int(start_of_previous_hour.timestamp()) + +#计算签名 +def generate_signature(str, private_key): + signature = hmac.new(private_key.encode(), (str).encode(), hashlib.sha1) + signature_b64 = base64.b64encode(signature.digest()).decode() + return signature_b64 + +#构建查询链接 +def build_query_string(params): + # 使用OrderedDict来保持排序 + sorted_params = OrderedDict(sorted(params.items())) + + # 拼接属性名和属性值,并使用&连接 + query_string = '&'.join('{}={}'.format( + urllib.parse.quote_plus(k), + urllib.parse.quote_plus(str(v)) + ) for k, v in sorted_params.items()) + return query_string + +#计算签名,get请求 +def request_data_signature_get(): + print(f'开始请求座席接听记录数据') + url='https://api-bj.clink.cn/cc/list_cdr_ib_agent' + param={'Timestamp':current_time_utc,'Expires':86400,'startTime':previous_hour_timestamp(1),'startTimeEnd':previous_hour_timestamp(0),'AccessKeyId':'b17759d3a36fba9a2cf522fbf4cbf177'} + print(f'param: {param}') + url_path = build_query_string(param) + url_param = url_path + print(f'url_param: {url_param}') + url_param = f'GETapi-bj.clink.cn/cc/list_cdr_ib_agent?{url_param}' + print(f'待计算字符串: {url_param}') + signature= generate_signature(url_param,'5g027B6w06630Y5240c1') + print(f'计算签名: {signature}') + print(f'编码后签名: {urllib.parse.quote_plus(signature)}') + url = f'{url}?{url_path}&Signature={urllib.parse.quote_plus(signature)}' + print(f'url: {url}') + + dataReqL=requests.get(url,headers={},params={}) + resText = dataReqL.text + i = 0 + while 'error' in resText and i < 5: + print(f'请求座席接听记录失败,再次请求第{i+1}次') + time.sleep(1) + dataReqL=requests.get(url,headers={},params={}) + resText = dataReqL.text + i = i + 1 + resD=json.loads(resText) + print(f'请求座席接听记录结束') + return resD + + + +def load_data_to_db(dataList): + conn = psycopg2.connect(database="dataops_db", user="dbuser_dops", password="MIgTi3jA",host="172.17.0.8", port="5432") + print('数据库连接成功') + dataId=str(uuid.uuid4()) + total=len(dataList) + print('临时id:'+dataId) + json_object = json.dumps(dataList) + cur=conn.cursor() + sql="update data_api.api_data set is_loaded = '1' where api_id = 'dd40ad726391416284f2b05254fed7fa';INSERT INTO data_api.api_data (id,api_id,data,total_num,is_loaded,status,request_tm,execute_tm,remark) values (%s,%s,%s,%s,'0','0',current_timestamp(0),current_timestamp(0),'')" + cur.execute(sql,[dataId,'dd40ad726391416284f2b05254fed7fa', json_object, total]) + conn.commit() + cur.close() + conn.close() + print('加载数据结束:cc_cdr_ib_agent_list:查询座席接听记录列表') + + + +if __name__ == "__main__": + print(f'{formatted2_previous_hour(0)}开始请求座席接听记录信息') + resL = request_data_signature_get() + print(resL) + if 'error' in resL: + error = resL['error'] + print(f'请求座席接听记录列表失败,失败原因:{error}') + else: + dataList = resL['cdrIbAgent'] + load_data_to_db(dataList) + print(f'{formatted2_previous_hour(0)}请求座席接听记录结束') \ No newline at end of file diff --git a/dev/workflow/TK_Cust/smart_ccc_cdr/查询座席接听记录列表/cc_cdr_ib_agent_list_load.sql b/dev/workflow/TK_Cust/smart_ccc_cdr/查询座席接听记录列表/cc_cdr_ib_agent_list_load.sql new file mode 100644 index 0000000..225dfa4 --- /dev/null +++ b/dev/workflow/TK_Cust/smart_ccc_cdr/查询座席接听记录列表/cc_cdr_ib_agent_list_load.sql @@ -0,0 +1,117 @@ +/*******Main Section**************************************************************************/ +\set ON_ERROR_STOP on +\set AUTOCOMMIT on +\timing on + +DELETE FROM data_api.tr_cc_cdr_ib_agent_list; + +insert into data_api.tr_cc_cdr_ib_agent_list ( + unique_id + , main_unique_id + , qno + , qname + , cno + , client_name + , client_number + , bridge_status + , bridge_status_detail + , sip_cause_desc + , on_hook_source + , agent_answer_in_time + , detail_call_type + , call_id + , webrtc_call_id + , record_file + , start_time + , ring_time + , ib_ringing_duration + , answer_time + , offhook_time + , say_voice_duration + , end_time + , bridge_duration + , customer_number + , customer_number_encrypt + , customer_province + , customer_city + , hotline + , hotline_name + , remember + ,etl_tx_dt +) +select + case when trim(both from unique_id)='' then null else unique_id::text end unique_id + , case when trim(both from main_unique_id)='' then null else main_unique_id::text end main_unique_id + , case when trim(both from qno)='' then null else qno::text end qno + , case when trim(both from qname)='' then null else qname::text end qname + , case when trim(both from cno)='' then null else cno::text end cno + , case when trim(both from client_name)='' then null else client_name::text end client_name + , case when trim(both from client_number)='' then null else client_number::text end client_number + , case when trim(both from bridge_status)='' then null else bridge_status::text end bridge_status + , case when trim(both from bridge_status_detail)='' then null else bridge_status_detail::text end bridge_status_detail + , case when trim(both from sip_cause_desc)='' then null else sip_cause_desc::text end sip_cause_desc + , case when trim(both from on_hook_source)='' then null else on_hook_source::text end on_hook_source + , case when trim(both from agent_answer_in_time)='' then null else agent_answer_in_time::text end agent_answer_in_time + , case when trim(both from detail_call_type)='' then null else detail_call_type::text end detail_call_type + , case when trim(both from call_id)='' then null else call_id::text end call_id + , case when trim(both from webrtc_call_id)='' then null else webrtc_call_id::text end webrtc_call_id + , case when trim(both from record_file)='' then null else record_file::text end record_file + , case when trim(both from start_time)='' then null else start_time::text end start_time + , case when trim(both from ring_time)='' then null else ring_time::text end ring_time + , case when trim(both from ib_ringing_duration)='' then null else ib_ringing_duration::text end ib_ringing_duration + , case when trim(both from answer_time)='' then null else answer_time::text end answer_time + , case when trim(both from offhook_time)='' then null else offhook_time::text end offhook_time + , case when trim(both from say_voice_duration)='' then null else say_voice_duration::text end say_voice_duration + , case when trim(both from end_time)='' then null else end_time::text end end_time + , case when trim(both from bridge_duration)='' then null else bridge_duration::text end bridge_duration + , case when trim(both from customer_number)='' then null else customer_number::text end customer_number + , case when trim(both from customer_number_encrypt)='' then null else customer_number_encrypt::text end customer_number_encrypt + , case when trim(both from customer_province)='' then null else customer_province::text end customer_province + , case when trim(both from customer_city)='' then null else customer_city::text end customer_city + , case when trim(both from hotline)='' then null else hotline::text end hotline + , case when trim(both from hotline_name)='' then null else hotline_name::text end hotline_name + , case when trim(both from remember)='' then null else remember::text end remember +,etl_tx_dt +from ( +select + (json_array_elements(data::json)::json->>'uniqueId') unique_id + , (json_array_elements(data::json)::json->>'mainUniqueId') main_unique_id + , (json_array_elements(data::json)::json->>'qno') qno + , (json_array_elements(data::json)::json->>'qname') qname + , (json_array_elements(data::json)::json->>'cno') cno + , (json_array_elements(data::json)::json->>'clientName') client_name + , (json_array_elements(data::json)::json->>'clientNumber') client_number + , (json_array_elements(data::json)::json->>'bridgeStatus') bridge_status + , (json_array_elements(data::json)::json->>'bridgeStatusDetail') bridge_status_detail + , (json_array_elements(data::json)::json->>'sipCauseDesc') sip_cause_desc + , (json_array_elements(data::json)::json->>'onHookSource') on_hook_source + , (json_array_elements(data::json)::json->>'agentAnswerInTime') agent_answer_in_time + , (json_array_elements(data::json)::json->>'detailCallType') detail_call_type + , (json_array_elements(data::json)::json->>'callId') call_id + , (json_array_elements(data::json)::json->>'webrtcCallId') webrtc_call_id + , (json_array_elements(data::json)::json->>'recordFile') record_file + , (json_array_elements(data::json)::json->>'startTime') start_time + , (json_array_elements(data::json)::json->>'ringTime') ring_time + , (json_array_elements(data::json)::json->>'ibRingingDuration') ib_ringing_duration + , (json_array_elements(data::json)::json->>'answerTime') answer_time + , (json_array_elements(data::json)::json->>'offhookTime') offhook_time + , (json_array_elements(data::json)::json->>'sayVoiceDuration') say_voice_duration + , (json_array_elements(data::json)::json->>'endTime') end_time + , (json_array_elements(data::json)::json->>'bridgeDuration') bridge_duration + , (json_array_elements(data::json)::json->>'customerNumber') customer_number + , (json_array_elements(data::json)::json->>'customerNumberEncrypt') customer_number_encrypt + , (json_array_elements(data::json)::json->>'customerProvince') customer_province + , (json_array_elements(data::json)::json->>'customerCity') customer_city + , (json_array_elements(data::json)::json->>'hotline') hotline + , (json_array_elements(data::json)::json->>'hotlineName') hotline_name + , (json_array_elements(data::json)::json->>'remember') remember + ,CURRENT_TIMESTAMP(0) etl_tx_dt +from (select * from data_api.api_data +WHERE api_id='dd40ad726391416284f2b05254fed7fa' and is_loaded = '0' order by request_tm desc limit 1) p )p; + +update data_api.api_data +set is_loaded = '1' , + status = '1', + request_tm = current_timestamp(0) +where api_id='dd40ad726391416284f2b05254fed7fa'; +\q \ No newline at end of file