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