add workflow 简道云销售拜访数据同步,dev
This commit is contained in:
parent
77ee32efc1
commit
f90e05a55b
|
@ -0,0 +1,154 @@
|
|||
/*******Main Section**************************************************************************/
|
||||
\set ON_ERROR_STOP on
|
||||
\set AUTOCOMMIT on
|
||||
\timing on
|
||||
delete from p10_sa.S98_S_jdy_account
|
||||
;
|
||||
insert into p10_sa.S98_S_jdy_account
|
||||
( oracle_number
|
||||
, import_id
|
||||
, account_id
|
||||
, account_nick_name
|
||||
, account_name
|
||||
, search_result
|
||||
, city
|
||||
, code
|
||||
, legal_name
|
||||
, depart
|
||||
, channel
|
||||
, status
|
||||
, address
|
||||
, post_address
|
||||
, sale_id
|
||||
, parent_company
|
||||
, industry
|
||||
, sub_industry
|
||||
, custom_class
|
||||
, custom_type
|
||||
, create_by
|
||||
, create_tm
|
||||
, addition_tm
|
||||
, wx_open_id
|
||||
, creator
|
||||
, create_time
|
||||
, updater
|
||||
, update_time
|
||||
, delete_time
|
||||
, deleter
|
||||
, id
|
||||
, app_id
|
||||
, entry_id
|
||||
, etl_tx_dt )
|
||||
select
|
||||
oracle_number
|
||||
, import_id
|
||||
, account_id
|
||||
, account_nick_name
|
||||
, account_name
|
||||
, search_result
|
||||
, city
|
||||
, code
|
||||
, legal_name
|
||||
, depart
|
||||
, channel
|
||||
, status
|
||||
, address
|
||||
, post_address
|
||||
, sale_id
|
||||
, parent_company
|
||||
, industry
|
||||
, sub_industry
|
||||
, custom_class
|
||||
, custom_type
|
||||
, create_by
|
||||
, create_tm
|
||||
, addition_tm
|
||||
, wx_open_id
|
||||
, creator
|
||||
, create_time
|
||||
, updater
|
||||
, update_time
|
||||
, delete_time
|
||||
, deleter
|
||||
, id
|
||||
, app_id
|
||||
, entry_id
|
||||
, etl_tx_dt
|
||||
from p00_tal.S98_S_jdy_account
|
||||
;
|
||||
delete from p12_sfull.S98_S_jdy_account
|
||||
;
|
||||
;
|
||||
insert into p12_sfull.S98_S_jdy_account
|
||||
( oracle_number
|
||||
, import_id
|
||||
, account_id
|
||||
, account_nick_name
|
||||
, account_name
|
||||
, search_result
|
||||
, city
|
||||
, code
|
||||
, legal_name
|
||||
, depart
|
||||
, channel
|
||||
, status
|
||||
, address
|
||||
, post_address
|
||||
, sale_id
|
||||
, parent_company
|
||||
, industry
|
||||
, sub_industry
|
||||
, custom_class
|
||||
, custom_type
|
||||
, create_by
|
||||
, create_tm
|
||||
, addition_tm
|
||||
, wx_open_id
|
||||
, creator
|
||||
, create_time
|
||||
, updater
|
||||
, update_time
|
||||
, delete_time
|
||||
, deleter
|
||||
, id
|
||||
, app_id
|
||||
, entry_id
|
||||
, etl_tx_dt )
|
||||
select
|
||||
oracle_number
|
||||
, import_id
|
||||
, account_id
|
||||
, account_nick_name
|
||||
, account_name
|
||||
, search_result
|
||||
, city
|
||||
, code
|
||||
, legal_name
|
||||
, depart
|
||||
, channel
|
||||
, status
|
||||
, address
|
||||
, post_address
|
||||
, sale_id
|
||||
, parent_company
|
||||
, industry
|
||||
, sub_industry
|
||||
, custom_class
|
||||
, custom_type
|
||||
, create_by
|
||||
, create_tm
|
||||
, addition_tm
|
||||
, wx_open_id
|
||||
, creator
|
||||
, create_time
|
||||
, updater
|
||||
, update_time
|
||||
, delete_time
|
||||
, deleter
|
||||
, id
|
||||
, app_id
|
||||
, entry_id
|
||||
, etl_tx_dt
|
||||
from p10_sa.S98_S_jdy_account
|
||||
;
|
||||
\q
|
|
@ -0,0 +1,45 @@
|
|||
|
||||
CREATE FOREIGN TABLE if not exists p00_tal.S98_S_jdy_account (
|
||||
oracle_number TEXT
|
||||
, import_id TEXT
|
||||
, account_id TEXT
|
||||
, account_nick_name TEXT
|
||||
, account_name TEXT
|
||||
, search_result TEXT
|
||||
, city TEXT
|
||||
, code TEXT
|
||||
, legal_name TEXT
|
||||
, depart TEXT
|
||||
, channel TEXT
|
||||
, status TEXT
|
||||
, address TEXT
|
||||
, post_address TEXT
|
||||
, sale_id TEXT
|
||||
, parent_company TEXT
|
||||
, industry TEXT
|
||||
, sub_industry TEXT
|
||||
, custom_class TEXT
|
||||
, custom_type TEXT
|
||||
, create_by TEXT
|
||||
, create_tm TEXT
|
||||
, addition_tm TEXT
|
||||
, wx_open_id TEXT
|
||||
, creator TEXT
|
||||
, create_time TEXT
|
||||
, updater TEXT
|
||||
, update_time TEXT
|
||||
, delete_time TEXT
|
||||
, deleter TEXT
|
||||
, id TEXT
|
||||
, app_id TEXT
|
||||
, entry_id TEXT
|
||||
, etl_tx_dt TIMESTAMP
|
||||
)
|
||||
|
||||
|
||||
SERVER pgsql_server_S98_S OPTIONS(schema_name 'data_api', table_name 'jdy_account' );
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,151 @@
|
|||
|
||||
create table if not exists p10_sa.S98_S_jdy_account (
|
||||
oracle_number TEXT
|
||||
, import_id TEXT
|
||||
, account_id TEXT
|
||||
, account_nick_name TEXT
|
||||
, account_name TEXT
|
||||
, search_result TEXT
|
||||
, city TEXT
|
||||
, code TEXT
|
||||
, legal_name TEXT
|
||||
, depart TEXT
|
||||
, channel TEXT
|
||||
, status TEXT
|
||||
, address TEXT
|
||||
, post_address TEXT
|
||||
, sale_id TEXT
|
||||
, parent_company TEXT
|
||||
, industry TEXT
|
||||
, sub_industry TEXT
|
||||
, custom_class TEXT
|
||||
, custom_type TEXT
|
||||
, create_by TEXT
|
||||
, create_tm TEXT
|
||||
, addition_tm TEXT
|
||||
, wx_open_id TEXT
|
||||
, creator TEXT
|
||||
, create_time TEXT
|
||||
, updater TEXT
|
||||
, update_time TEXT
|
||||
, delete_time TEXT
|
||||
, deleter TEXT
|
||||
, id TEXT
|
||||
, app_id TEXT
|
||||
, entry_id TEXT
|
||||
, etl_tx_dt TIMESTAMP
|
||||
) ;
|
||||
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.oracle_number IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.import_id IS '导入ID';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.account_id IS '公司ID';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.account_nick_name IS '公司简称';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.account_name IS '公司名称';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.search_result IS '模糊查询结果';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.city IS '城市';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.code IS '邮编';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.legal_name IS '公司英文名称(legal name)';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.depart IS '部门学院';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.channel IS '渠道来源';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.status IS '状态(添加时不显示,仅管理员可编辑';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.address IS '公司地址';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.post_address IS '详细寄件地址';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.sale_id IS '所属销售';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.parent_company IS '上级公司';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.industry IS '行业';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.sub_industry IS '子行业';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.custom_class IS '客户分类';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.custom_type IS '客户类型';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.create_by IS '创建人';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.create_tm IS '创建时间';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.addition_tm IS 'F-辅助时间';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.wx_open_id IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.creator IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.create_time IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.updater IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.update_time IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.delete_time IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.deleter IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.id IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.app_id IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.entry_id IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_account.etl_tx_dt IS '';
|
||||
|
||||
COMMENT ON TABLE p10_sa.S98_S_jdy_account IS '';
|
||||
|
||||
|
||||
|
||||
create table if not exists p12_sfull.S98_S_jdy_account (
|
||||
oracle_number TEXT
|
||||
, import_id TEXT
|
||||
, account_id TEXT
|
||||
, account_nick_name TEXT
|
||||
, account_name TEXT
|
||||
, search_result TEXT
|
||||
, city TEXT
|
||||
, code TEXT
|
||||
, legal_name TEXT
|
||||
, depart TEXT
|
||||
, channel TEXT
|
||||
, status TEXT
|
||||
, address TEXT
|
||||
, post_address TEXT
|
||||
, sale_id TEXT
|
||||
, parent_company TEXT
|
||||
, industry TEXT
|
||||
, sub_industry TEXT
|
||||
, custom_class TEXT
|
||||
, custom_type TEXT
|
||||
, create_by TEXT
|
||||
, create_tm TEXT
|
||||
, addition_tm TEXT
|
||||
, wx_open_id TEXT
|
||||
, creator TEXT
|
||||
, create_time TEXT
|
||||
, updater TEXT
|
||||
, update_time TEXT
|
||||
, delete_time TEXT
|
||||
, deleter TEXT
|
||||
, id TEXT
|
||||
, app_id TEXT
|
||||
, entry_id TEXT
|
||||
, etl_tx_dt TIMESTAMP
|
||||
) ;
|
||||
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.oracle_number IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.import_id IS '导入ID';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.account_id IS '公司ID';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.account_nick_name IS '公司简称';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.account_name IS '公司名称';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.search_result IS '模糊查询结果';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.city IS '城市';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.code IS '邮编';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.legal_name IS '公司英文名称(legal name)';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.depart IS '部门学院';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.channel IS '渠道来源';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.status IS '状态(添加时不显示,仅管理员可编辑';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.address IS '公司地址';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.post_address IS '详细寄件地址';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.sale_id IS '所属销售';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.parent_company IS '上级公司';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.industry IS '行业';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.sub_industry IS '子行业';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.custom_class IS '客户分类';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.custom_type IS '客户类型';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.create_by IS '创建人';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.create_tm IS '创建时间';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.addition_tm IS 'F-辅助时间';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.wx_open_id IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.creator IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.create_time IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.updater IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.update_time IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.delete_time IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.deleter IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.id IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.app_id IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.entry_id IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_account.etl_tx_dt IS '';
|
||||
|
||||
COMMENT ON TABLE p12_sfull.S98_S_jdy_account IS '';
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
/*******Main Section**************************************************************************/
|
||||
\set ON_ERROR_STOP on
|
||||
\set AUTOCOMMIT on
|
||||
\timing on
|
||||
delete from p10_sa.S98_S_jdy_ae_plan
|
||||
;
|
||||
insert into p10_sa.S98_S_jdy_ae_plan
|
||||
( ae
|
||||
, task_flowup_time
|
||||
, status
|
||||
, creator
|
||||
, create_time
|
||||
, updater
|
||||
, update_time
|
||||
, delete_time
|
||||
, deleter
|
||||
, id
|
||||
, app_id
|
||||
, entry_id
|
||||
, etl_tx_dt )
|
||||
select
|
||||
ae
|
||||
, task_flowup_time
|
||||
, status
|
||||
, creator
|
||||
, create_time
|
||||
, updater
|
||||
, update_time
|
||||
, delete_time
|
||||
, deleter
|
||||
, id
|
||||
, app_id
|
||||
, entry_id
|
||||
, etl_tx_dt
|
||||
from p00_tal.S98_S_jdy_ae_plan
|
||||
;
|
||||
delete from p12_sfull.S98_S_jdy_ae_plan
|
||||
;
|
||||
;
|
||||
insert into p12_sfull.S98_S_jdy_ae_plan
|
||||
( ae
|
||||
, task_flowup_time
|
||||
, status
|
||||
, creator
|
||||
, create_time
|
||||
, updater
|
||||
, update_time
|
||||
, delete_time
|
||||
, deleter
|
||||
, id
|
||||
, app_id
|
||||
, entry_id
|
||||
, etl_tx_dt )
|
||||
select
|
||||
ae
|
||||
, task_flowup_time
|
||||
, status
|
||||
, creator
|
||||
, create_time
|
||||
, updater
|
||||
, update_time
|
||||
, delete_time
|
||||
, deleter
|
||||
, id
|
||||
, app_id
|
||||
, entry_id
|
||||
, etl_tx_dt
|
||||
from p10_sa.S98_S_jdy_ae_plan
|
||||
;
|
||||
\q
|
|
@ -0,0 +1,24 @@
|
|||
|
||||
CREATE FOREIGN TABLE if not exists p00_tal.S98_S_jdy_ae_plan (
|
||||
ae TEXT
|
||||
, task_flowup_time TEXT
|
||||
, status TEXT
|
||||
, creator TEXT
|
||||
, create_time TEXT
|
||||
, updater TEXT
|
||||
, update_time TEXT
|
||||
, delete_time TEXT
|
||||
, deleter TEXT
|
||||
, id TEXT
|
||||
, app_id TEXT
|
||||
, entry_id TEXT
|
||||
, etl_tx_dt TIMESTAMP
|
||||
)
|
||||
|
||||
|
||||
SERVER pgsql_server_S98_S OPTIONS(schema_name 'data_api', table_name 'jdy_ae_plan' );
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
|
||||
create table if not exists p10_sa.S98_S_jdy_ae_plan (
|
||||
ae TEXT
|
||||
, task_flowup_time TEXT
|
||||
, status TEXT
|
||||
, creator TEXT
|
||||
, create_time TEXT
|
||||
, updater TEXT
|
||||
, update_time TEXT
|
||||
, delete_time TEXT
|
||||
, deleter TEXT
|
||||
, id TEXT
|
||||
, app_id TEXT
|
||||
, entry_id TEXT
|
||||
, etl_tx_dt TIMESTAMP
|
||||
) ;
|
||||
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_ae_plan.ae IS 'AE';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_ae_plan.task_flowup_time IS 'Task Followup Date/Time';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_ae_plan.status IS '排期状态';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_ae_plan.creator IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_ae_plan.create_time IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_ae_plan.updater IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_ae_plan.update_time IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_ae_plan.delete_time IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_ae_plan.deleter IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_ae_plan.id IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_ae_plan.app_id IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_ae_plan.entry_id IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_ae_plan.etl_tx_dt IS '';
|
||||
|
||||
COMMENT ON TABLE p10_sa.S98_S_jdy_ae_plan IS '';
|
||||
|
||||
|
||||
|
||||
create table if not exists p12_sfull.S98_S_jdy_ae_plan (
|
||||
ae TEXT
|
||||
, task_flowup_time TEXT
|
||||
, status TEXT
|
||||
, creator TEXT
|
||||
, create_time TEXT
|
||||
, updater TEXT
|
||||
, update_time TEXT
|
||||
, delete_time TEXT
|
||||
, deleter TEXT
|
||||
, id TEXT
|
||||
, app_id TEXT
|
||||
, entry_id TEXT
|
||||
, etl_tx_dt TIMESTAMP
|
||||
) ;
|
||||
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_ae_plan.ae IS 'AE';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_ae_plan.task_flowup_time IS 'Task Followup Date/Time';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_ae_plan.status IS '排期状态';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_ae_plan.creator IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_ae_plan.create_time IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_ae_plan.updater IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_ae_plan.update_time IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_ae_plan.delete_time IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_ae_plan.deleter IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_ae_plan.id IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_ae_plan.app_id IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_ae_plan.entry_id IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_ae_plan.etl_tx_dt IS '';
|
||||
|
||||
COMMENT ON TABLE p12_sfull.S98_S_jdy_ae_plan IS '';
|
||||
|
|
@ -0,0 +1,86 @@
|
|||
/*******Main Section**************************************************************************/
|
||||
\set ON_ERROR_STOP on
|
||||
\set AUTOCOMMIT on
|
||||
\timing on
|
||||
delete from p10_sa.S98_S_jdy_calendar
|
||||
;
|
||||
insert into p10_sa.S98_S_jdy_calendar
|
||||
( tektronix_ap
|
||||
, standard_year_calendar
|
||||
, tek_year
|
||||
, tektronix_ap_week
|
||||
, tek_month
|
||||
, tek_q
|
||||
, calendar_week
|
||||
, creator
|
||||
, create_time
|
||||
, updater
|
||||
, update_time
|
||||
, delete_time
|
||||
, deleter
|
||||
, id
|
||||
, app_id
|
||||
, entry_id
|
||||
, etl_tx_dt )
|
||||
select
|
||||
tektronix_ap
|
||||
, standard_year_calendar
|
||||
, tek_year
|
||||
, tektronix_ap_week
|
||||
, tek_month
|
||||
, tek_q
|
||||
, calendar_week
|
||||
, creator
|
||||
, create_time
|
||||
, updater
|
||||
, update_time
|
||||
, delete_time
|
||||
, deleter
|
||||
, id
|
||||
, app_id
|
||||
, entry_id
|
||||
, etl_tx_dt
|
||||
from p00_tal.S98_S_jdy_calendar
|
||||
;
|
||||
delete from p12_sfull.S98_S_jdy_calendar
|
||||
;
|
||||
;
|
||||
insert into p12_sfull.S98_S_jdy_calendar
|
||||
( tektronix_ap
|
||||
, standard_year_calendar
|
||||
, tek_year
|
||||
, tektronix_ap_week
|
||||
, tek_month
|
||||
, tek_q
|
||||
, calendar_week
|
||||
, creator
|
||||
, create_time
|
||||
, updater
|
||||
, update_time
|
||||
, delete_time
|
||||
, deleter
|
||||
, id
|
||||
, app_id
|
||||
, entry_id
|
||||
, etl_tx_dt )
|
||||
select
|
||||
tektronix_ap
|
||||
, standard_year_calendar
|
||||
, tek_year
|
||||
, tektronix_ap_week
|
||||
, tek_month
|
||||
, tek_q
|
||||
, calendar_week
|
||||
, creator
|
||||
, create_time
|
||||
, updater
|
||||
, update_time
|
||||
, delete_time
|
||||
, deleter
|
||||
, id
|
||||
, app_id
|
||||
, entry_id
|
||||
, etl_tx_dt
|
||||
from p10_sa.S98_S_jdy_calendar
|
||||
;
|
||||
\q
|
|
@ -0,0 +1,28 @@
|
|||
|
||||
CREATE FOREIGN TABLE if not exists p00_tal.S98_S_jdy_calendar (
|
||||
tektronix_ap TEXT
|
||||
, standard_year_calendar TEXT
|
||||
, tek_year TEXT
|
||||
, tektronix_ap_week TEXT
|
||||
, tek_month TEXT
|
||||
, tek_q TEXT
|
||||
, calendar_week TEXT
|
||||
, creator TEXT
|
||||
, create_time TEXT
|
||||
, updater TEXT
|
||||
, update_time TEXT
|
||||
, delete_time TEXT
|
||||
, deleter TEXT
|
||||
, id TEXT
|
||||
, app_id TEXT
|
||||
, entry_id TEXT
|
||||
, etl_tx_dt TIMESTAMP
|
||||
)
|
||||
|
||||
|
||||
SERVER pgsql_server_S98_S OPTIONS(schema_name 'data_api', table_name 'jdy_calendar' );
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
|
||||
create table if not exists p10_sa.S98_S_jdy_calendar (
|
||||
tektronix_ap TEXT
|
||||
, standard_year_calendar TEXT
|
||||
, tek_year TEXT
|
||||
, tektronix_ap_week TEXT
|
||||
, tek_month TEXT
|
||||
, tek_q TEXT
|
||||
, calendar_week TEXT
|
||||
, creator TEXT
|
||||
, create_time TEXT
|
||||
, updater TEXT
|
||||
, update_time TEXT
|
||||
, delete_time TEXT
|
||||
, deleter TEXT
|
||||
, id TEXT
|
||||
, app_id TEXT
|
||||
, entry_id TEXT
|
||||
, etl_tx_dt TIMESTAMP
|
||||
) ;
|
||||
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_calendar.tektronix_ap IS 'Tektronix AP';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_calendar.standard_year_calendar IS 'Standard Year Calendar';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_calendar.tek_year IS 'Tek Year';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_calendar.tektronix_ap_week IS 'Tektronix AP-WEEK';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_calendar.tek_month IS 'Tek Month';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_calendar.tek_q IS 'Tek Q';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_calendar.calendar_week IS 'Calendar Week';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_calendar.creator IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_calendar.create_time IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_calendar.updater IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_calendar.update_time IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_calendar.delete_time IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_calendar.deleter IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_calendar.id IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_calendar.app_id IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_calendar.entry_id IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_calendar.etl_tx_dt IS '';
|
||||
|
||||
COMMENT ON TABLE p10_sa.S98_S_jdy_calendar IS '';
|
||||
|
||||
|
||||
|
||||
create table if not exists p12_sfull.S98_S_jdy_calendar (
|
||||
tektronix_ap TEXT
|
||||
, standard_year_calendar TEXT
|
||||
, tek_year TEXT
|
||||
, tektronix_ap_week TEXT
|
||||
, tek_month TEXT
|
||||
, tek_q TEXT
|
||||
, calendar_week TEXT
|
||||
, creator TEXT
|
||||
, create_time TEXT
|
||||
, updater TEXT
|
||||
, update_time TEXT
|
||||
, delete_time TEXT
|
||||
, deleter TEXT
|
||||
, id TEXT
|
||||
, app_id TEXT
|
||||
, entry_id TEXT
|
||||
, etl_tx_dt TIMESTAMP
|
||||
) ;
|
||||
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_calendar.tektronix_ap IS 'Tektronix AP';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_calendar.standard_year_calendar IS 'Standard Year Calendar';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_calendar.tek_year IS 'Tek Year';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_calendar.tektronix_ap_week IS 'Tektronix AP-WEEK';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_calendar.tek_month IS 'Tek Month';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_calendar.tek_q IS 'Tek Q';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_calendar.calendar_week IS 'Calendar Week';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_calendar.creator IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_calendar.create_time IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_calendar.updater IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_calendar.update_time IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_calendar.delete_time IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_calendar.deleter IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_calendar.id IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_calendar.app_id IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_calendar.entry_id IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_calendar.etl_tx_dt IS '';
|
||||
|
||||
COMMENT ON TABLE p12_sfull.S98_S_jdy_calendar IS '';
|
||||
|
|
@ -0,0 +1,110 @@
|
|||
/*******Main Section**************************************************************************/
|
||||
\set ON_ERROR_STOP on
|
||||
\set AUTOCOMMIT on
|
||||
\timing on
|
||||
delete from p10_sa.S98_S_jdy_contact
|
||||
;
|
||||
insert into p10_sa.S98_S_jdy_contact
|
||||
( id
|
||||
, account_id
|
||||
, account_name
|
||||
, legal_name
|
||||
, abbreviation
|
||||
, city_name
|
||||
, contact_id
|
||||
, contact_name
|
||||
, phone
|
||||
, wechat_id
|
||||
, email
|
||||
, salers
|
||||
, title
|
||||
, phone2
|
||||
, app_id
|
||||
, create_time
|
||||
, creator
|
||||
, delete_time
|
||||
, deleter
|
||||
, entry_id
|
||||
, update_time
|
||||
, updater
|
||||
, etl_tx_dt )
|
||||
select
|
||||
id
|
||||
, account_id
|
||||
, account_name
|
||||
, legal_name
|
||||
, abbreviation
|
||||
, city_name
|
||||
, contact_id
|
||||
, contact_name
|
||||
, phone
|
||||
, wechat_id
|
||||
, email
|
||||
, salers
|
||||
, title
|
||||
, phone2
|
||||
, app_id
|
||||
, create_time
|
||||
, creator
|
||||
, delete_time
|
||||
, deleter
|
||||
, entry_id
|
||||
, update_time
|
||||
, updater
|
||||
, etl_tx_dt
|
||||
from p00_tal.S98_S_jdy_contact
|
||||
;
|
||||
delete from p12_sfull.S98_S_jdy_contact
|
||||
;
|
||||
;
|
||||
insert into p12_sfull.S98_S_jdy_contact
|
||||
( id
|
||||
, account_id
|
||||
, account_name
|
||||
, legal_name
|
||||
, abbreviation
|
||||
, city_name
|
||||
, contact_id
|
||||
, contact_name
|
||||
, phone
|
||||
, wechat_id
|
||||
, email
|
||||
, salers
|
||||
, title
|
||||
, phone2
|
||||
, app_id
|
||||
, create_time
|
||||
, creator
|
||||
, delete_time
|
||||
, deleter
|
||||
, entry_id
|
||||
, update_time
|
||||
, updater
|
||||
, etl_tx_dt )
|
||||
select
|
||||
id
|
||||
, account_id
|
||||
, account_name
|
||||
, legal_name
|
||||
, abbreviation
|
||||
, city_name
|
||||
, contact_id
|
||||
, contact_name
|
||||
, phone
|
||||
, wechat_id
|
||||
, email
|
||||
, salers
|
||||
, title
|
||||
, phone2
|
||||
, app_id
|
||||
, create_time
|
||||
, creator
|
||||
, delete_time
|
||||
, deleter
|
||||
, entry_id
|
||||
, update_time
|
||||
, updater
|
||||
, etl_tx_dt
|
||||
from p10_sa.S98_S_jdy_contact
|
||||
;
|
||||
\q
|
|
@ -0,0 +1,34 @@
|
|||
|
||||
CREATE FOREIGN TABLE if not exists p00_tal.S98_S_jdy_contact (
|
||||
id TEXT
|
||||
, account_id TEXT
|
||||
, account_name TEXT
|
||||
, legal_name TEXT
|
||||
, abbreviation TEXT
|
||||
, city_name TEXT
|
||||
, contact_id TEXT
|
||||
, contact_name TEXT
|
||||
, phone TEXT
|
||||
, wechat_id TEXT
|
||||
, email TEXT
|
||||
, salers TEXT
|
||||
, title TEXT
|
||||
, phone2 TEXT
|
||||
, app_id TEXT
|
||||
, create_time TEXT
|
||||
, creator TEXT
|
||||
, delete_time TEXT
|
||||
, deleter TEXT
|
||||
, entry_id TEXT
|
||||
, update_time TEXT
|
||||
, updater TEXT
|
||||
, etl_tx_dt TIMESTAMP
|
||||
)
|
||||
|
||||
|
||||
SERVER pgsql_server_S98_S OPTIONS(schema_name 'data_api', table_name 'jdy_contact' );
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,107 @@
|
|||
|
||||
create table if not exists p10_sa.S98_S_jdy_contact (
|
||||
id TEXT
|
||||
, account_id TEXT
|
||||
, account_name TEXT
|
||||
, legal_name TEXT
|
||||
, abbreviation TEXT
|
||||
, city_name TEXT
|
||||
, contact_id TEXT
|
||||
, contact_name TEXT
|
||||
, phone TEXT
|
||||
, wechat_id TEXT
|
||||
, email TEXT
|
||||
, salers TEXT
|
||||
, title TEXT
|
||||
, phone2 TEXT
|
||||
, app_id TEXT
|
||||
, create_time TEXT
|
||||
, creator TEXT
|
||||
, delete_time TEXT
|
||||
, deleter TEXT
|
||||
, entry_id TEXT
|
||||
, update_time TEXT
|
||||
, updater TEXT
|
||||
, etl_tx_dt TIMESTAMP
|
||||
) ;
|
||||
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_contact.id IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_contact.account_id IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_contact.account_name IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_contact.legal_name IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_contact.abbreviation IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_contact.city_name IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_contact.contact_id IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_contact.contact_name IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_contact.phone IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_contact.wechat_id IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_contact.email IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_contact.salers IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_contact.title IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_contact.phone2 IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_contact.app_id IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_contact.create_time IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_contact.creator IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_contact.delete_time IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_contact.deleter IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_contact.entry_id IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_contact.update_time IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_contact.updater IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_contact.etl_tx_dt IS '';
|
||||
|
||||
COMMENT ON TABLE p10_sa.S98_S_jdy_contact IS '';
|
||||
|
||||
|
||||
|
||||
create table if not exists p12_sfull.S98_S_jdy_contact (
|
||||
id TEXT
|
||||
, account_id TEXT
|
||||
, account_name TEXT
|
||||
, legal_name TEXT
|
||||
, abbreviation TEXT
|
||||
, city_name TEXT
|
||||
, contact_id TEXT
|
||||
, contact_name TEXT
|
||||
, phone TEXT
|
||||
, wechat_id TEXT
|
||||
, email TEXT
|
||||
, salers TEXT
|
||||
, title TEXT
|
||||
, phone2 TEXT
|
||||
, app_id TEXT
|
||||
, create_time TEXT
|
||||
, creator TEXT
|
||||
, delete_time TEXT
|
||||
, deleter TEXT
|
||||
, entry_id TEXT
|
||||
, update_time TEXT
|
||||
, updater TEXT
|
||||
, etl_tx_dt TIMESTAMP
|
||||
) ;
|
||||
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_contact.id IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_contact.account_id IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_contact.account_name IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_contact.legal_name IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_contact.abbreviation IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_contact.city_name IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_contact.contact_id IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_contact.contact_name IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_contact.phone IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_contact.wechat_id IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_contact.email IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_contact.salers IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_contact.title IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_contact.phone2 IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_contact.app_id IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_contact.create_time IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_contact.creator IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_contact.delete_time IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_contact.deleter IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_contact.entry_id IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_contact.update_time IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_contact.updater IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_contact.etl_tx_dt IS '';
|
||||
|
||||
COMMENT ON TABLE p12_sfull.S98_S_jdy_contact IS '';
|
||||
|
|
@ -0,0 +1,234 @@
|
|||
/*******Main Section**************************************************************************/
|
||||
\set ON_ERROR_STOP on
|
||||
\set AUTOCOMMIT on
|
||||
\timing on
|
||||
delete from p10_sa.S98_S_jdy_daily_visit
|
||||
;
|
||||
insert into p10_sa.S98_S_jdy_daily_visit
|
||||
( account
|
||||
, assign_to
|
||||
, task_name
|
||||
, visit_time
|
||||
, task_follow_up_time
|
||||
, irtnc_state
|
||||
, segments
|
||||
, application
|
||||
, intelligence_source
|
||||
, funnels_created
|
||||
, status
|
||||
, order_ae_flag
|
||||
, ae_confict_flag
|
||||
, account2
|
||||
, city
|
||||
, company_name_en
|
||||
, nick_name
|
||||
, company_id
|
||||
, salar
|
||||
, contact
|
||||
, phone
|
||||
, wechat_id
|
||||
, email
|
||||
, new_flag
|
||||
, account_type
|
||||
, products
|
||||
, product_family1
|
||||
, product_family2
|
||||
, product_family3
|
||||
, attachments
|
||||
, remarks
|
||||
, contact_phone_flag
|
||||
, repeat_flag
|
||||
, am
|
||||
, visit_tm
|
||||
, replan_flag
|
||||
, status2
|
||||
, ap_week
|
||||
, year_text
|
||||
, year_no
|
||||
, quater_no
|
||||
, assigned_to_text
|
||||
, time_no
|
||||
, creator
|
||||
, create_time
|
||||
, updater
|
||||
, update_time
|
||||
, flow_state
|
||||
, delete_time
|
||||
, deleter
|
||||
, id
|
||||
, app_id
|
||||
, entry_id
|
||||
, etl_tx_dt )
|
||||
select
|
||||
account
|
||||
, assign_to
|
||||
, task_name
|
||||
, visit_time
|
||||
, task_follow_up_time
|
||||
, irtnc_state
|
||||
, segments
|
||||
, application
|
||||
, intelligence_source
|
||||
, funnels_created
|
||||
, status
|
||||
, order_ae_flag
|
||||
, ae_confict_flag
|
||||
, account2
|
||||
, city
|
||||
, company_name_en
|
||||
, nick_name
|
||||
, company_id
|
||||
, salar
|
||||
, contact
|
||||
, phone
|
||||
, wechat_id
|
||||
, email
|
||||
, new_flag
|
||||
, account_type
|
||||
, products
|
||||
, product_family1
|
||||
, product_family2
|
||||
, product_family3
|
||||
, attachments
|
||||
, remarks
|
||||
, contact_phone_flag
|
||||
, repeat_flag
|
||||
, am
|
||||
, visit_tm
|
||||
, replan_flag
|
||||
, status2
|
||||
, ap_week
|
||||
, year_text
|
||||
, year_no
|
||||
, quater_no
|
||||
, assigned_to_text
|
||||
, time_no
|
||||
, creator
|
||||
, create_time
|
||||
, updater
|
||||
, update_time
|
||||
, flow_state
|
||||
, delete_time
|
||||
, deleter
|
||||
, id
|
||||
, app_id
|
||||
, entry_id
|
||||
, etl_tx_dt
|
||||
from p00_tal.S98_S_jdy_daily_visit
|
||||
;
|
||||
delete from p12_sfull.S98_S_jdy_daily_visit
|
||||
;
|
||||
;
|
||||
insert into p12_sfull.S98_S_jdy_daily_visit
|
||||
( account
|
||||
, assign_to
|
||||
, task_name
|
||||
, visit_time
|
||||
, task_follow_up_time
|
||||
, irtnc_state
|
||||
, segments
|
||||
, application
|
||||
, intelligence_source
|
||||
, funnels_created
|
||||
, status
|
||||
, order_ae_flag
|
||||
, ae_confict_flag
|
||||
, account2
|
||||
, city
|
||||
, company_name_en
|
||||
, nick_name
|
||||
, company_id
|
||||
, salar
|
||||
, contact
|
||||
, phone
|
||||
, wechat_id
|
||||
, email
|
||||
, new_flag
|
||||
, account_type
|
||||
, products
|
||||
, product_family1
|
||||
, product_family2
|
||||
, product_family3
|
||||
, attachments
|
||||
, remarks
|
||||
, contact_phone_flag
|
||||
, repeat_flag
|
||||
, am
|
||||
, visit_tm
|
||||
, replan_flag
|
||||
, status2
|
||||
, ap_week
|
||||
, year_text
|
||||
, year_no
|
||||
, quater_no
|
||||
, assigned_to_text
|
||||
, time_no
|
||||
, creator
|
||||
, create_time
|
||||
, updater
|
||||
, update_time
|
||||
, flow_state
|
||||
, delete_time
|
||||
, deleter
|
||||
, id
|
||||
, app_id
|
||||
, entry_id
|
||||
, etl_tx_dt )
|
||||
select
|
||||
account
|
||||
, assign_to
|
||||
, task_name
|
||||
, visit_time
|
||||
, task_follow_up_time
|
||||
, irtnc_state
|
||||
, segments
|
||||
, application
|
||||
, intelligence_source
|
||||
, funnels_created
|
||||
, status
|
||||
, order_ae_flag
|
||||
, ae_confict_flag
|
||||
, account2
|
||||
, city
|
||||
, company_name_en
|
||||
, nick_name
|
||||
, company_id
|
||||
, salar
|
||||
, contact
|
||||
, phone
|
||||
, wechat_id
|
||||
, email
|
||||
, new_flag
|
||||
, account_type
|
||||
, products
|
||||
, product_family1
|
||||
, product_family2
|
||||
, product_family3
|
||||
, attachments
|
||||
, remarks
|
||||
, contact_phone_flag
|
||||
, repeat_flag
|
||||
, am
|
||||
, visit_tm
|
||||
, replan_flag
|
||||
, status2
|
||||
, ap_week
|
||||
, year_text
|
||||
, year_no
|
||||
, quater_no
|
||||
, assigned_to_text
|
||||
, time_no
|
||||
, creator
|
||||
, create_time
|
||||
, updater
|
||||
, update_time
|
||||
, flow_state
|
||||
, delete_time
|
||||
, deleter
|
||||
, id
|
||||
, app_id
|
||||
, entry_id
|
||||
, etl_tx_dt
|
||||
from p10_sa.S98_S_jdy_daily_visit
|
||||
;
|
||||
\q
|
|
@ -0,0 +1,65 @@
|
|||
|
||||
CREATE FOREIGN TABLE if not exists p00_tal.S98_S_jdy_daily_visit (
|
||||
account TEXT
|
||||
, assign_to TEXT
|
||||
, task_name TEXT
|
||||
, visit_time TEXT
|
||||
, task_follow_up_time TEXT
|
||||
, irtnc_state TEXT
|
||||
, segments TEXT
|
||||
, application TEXT
|
||||
, intelligence_source TEXT
|
||||
, funnels_created TEXT
|
||||
, status TEXT
|
||||
, order_ae_flag TEXT
|
||||
, ae_confict_flag TEXT
|
||||
, account2 TEXT
|
||||
, city TEXT
|
||||
, company_name_en TEXT
|
||||
, nick_name TEXT
|
||||
, company_id TEXT
|
||||
, salar TEXT
|
||||
, contact TEXT
|
||||
, phone TEXT
|
||||
, wechat_id TEXT
|
||||
, email TEXT
|
||||
, new_flag TEXT
|
||||
, account_type TEXT
|
||||
, products TEXT
|
||||
, product_family1 TEXT
|
||||
, product_family2 TEXT
|
||||
, product_family3 TEXT
|
||||
, attachments TEXT
|
||||
, remarks TEXT
|
||||
, contact_phone_flag TEXT
|
||||
, repeat_flag TEXT
|
||||
, am TEXT
|
||||
, visit_tm TEXT
|
||||
, replan_flag TEXT
|
||||
, status2 TEXT
|
||||
, ap_week TEXT
|
||||
, year_text TEXT
|
||||
, year_no TEXT
|
||||
, quater_no TEXT
|
||||
, assigned_to_text TEXT
|
||||
, time_no TEXT
|
||||
, creator TEXT
|
||||
, create_time TEXT
|
||||
, updater TEXT
|
||||
, update_time TEXT
|
||||
, flow_state TEXT
|
||||
, delete_time TEXT
|
||||
, deleter TEXT
|
||||
, id TEXT
|
||||
, app_id TEXT
|
||||
, entry_id TEXT
|
||||
, etl_tx_dt TIMESTAMP
|
||||
)
|
||||
|
||||
|
||||
SERVER pgsql_server_S98_S OPTIONS(schema_name 'data_api', table_name 'jdy_daily_visit' );
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,231 @@
|
|||
|
||||
create table if not exists p10_sa.S98_S_jdy_daily_visit (
|
||||
account TEXT
|
||||
, assign_to TEXT
|
||||
, task_name TEXT
|
||||
, visit_time TEXT
|
||||
, task_follow_up_time TEXT
|
||||
, irtnc_state TEXT
|
||||
, segments TEXT
|
||||
, application TEXT
|
||||
, intelligence_source TEXT
|
||||
, funnels_created TEXT
|
||||
, status TEXT
|
||||
, order_ae_flag TEXT
|
||||
, ae_confict_flag TEXT
|
||||
, account2 TEXT
|
||||
, city TEXT
|
||||
, company_name_en TEXT
|
||||
, nick_name TEXT
|
||||
, company_id TEXT
|
||||
, salar TEXT
|
||||
, contact TEXT
|
||||
, phone TEXT
|
||||
, wechat_id TEXT
|
||||
, email TEXT
|
||||
, new_flag TEXT
|
||||
, account_type TEXT
|
||||
, products TEXT
|
||||
, product_family1 TEXT
|
||||
, product_family2 TEXT
|
||||
, product_family3 TEXT
|
||||
, attachments TEXT
|
||||
, remarks TEXT
|
||||
, contact_phone_flag TEXT
|
||||
, repeat_flag TEXT
|
||||
, am TEXT
|
||||
, visit_tm TEXT
|
||||
, replan_flag TEXT
|
||||
, status2 TEXT
|
||||
, ap_week TEXT
|
||||
, year_text TEXT
|
||||
, year_no TEXT
|
||||
, quater_no TEXT
|
||||
, assigned_to_text TEXT
|
||||
, time_no TEXT
|
||||
, creator TEXT
|
||||
, create_time TEXT
|
||||
, updater TEXT
|
||||
, update_time TEXT
|
||||
, flow_state TEXT
|
||||
, delete_time TEXT
|
||||
, deleter TEXT
|
||||
, id TEXT
|
||||
, app_id TEXT
|
||||
, entry_id TEXT
|
||||
, etl_tx_dt TIMESTAMP
|
||||
) ;
|
||||
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.account IS 'Account';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.assign_to IS 'Assign to';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.task_name IS 'Task Name';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.visit_time IS 'Visit time';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.task_follow_up_time IS 'Task Followup Date/Time';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.irtnc_state IS 'IRTNC State';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.segments IS 'Segments';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.application IS 'Application';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.intelligence_source IS 'Intelligence Source';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.funnels_created IS 'Funnels Created(K/USD)';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.status IS 'Status';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.order_ae_flag IS '是否预约AE';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.ae_confict_flag IS 'AE时间是否冲突';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.account2 IS 'Account';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.city IS 'City';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.company_name_en IS '公司英文名称';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.nick_name IS '公司简称';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.company_id IS '公司ID';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.salar IS '所属销售';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.contact IS '联系人';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.phone IS 'Phone';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.wechat_id IS '微信';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.email IS 'Email';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.new_flag IS 'New/Old';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.account_type IS 'Account Type';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.products IS 'Products';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.product_family1 IS 'Product Family1';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.product_family2 IS 'Product Family2';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.product_family3 IS 'Product Family3';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.attachments IS 'Attachments';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.remarks IS 'Remarks';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.contact_phone_flag IS '判断是否能返回联系人电话号';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.repeat_flag IS '判断是否重复数据';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.am IS 'AM';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.visit_tm IS '选择拜访时间';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.replan_flag IS '辅助-判断是否重复排期2';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.status2 IS 'Status2';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.ap_week IS 'AP-WEEK';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.year_text IS 'Year-文本';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.year_no IS 'Year';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.quater_no IS 'Quater';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.assigned_to_text IS 'Assigned to-文本';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.time_no IS '时间-数字';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.creator IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.create_time IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.updater IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.update_time IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.flow_state IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.delete_time IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.deleter IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.id IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.app_id IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.entry_id IS '';
|
||||
COMMENT ON COLUMN p10_sa.S98_S_jdy_daily_visit.etl_tx_dt IS '';
|
||||
|
||||
COMMENT ON TABLE p10_sa.S98_S_jdy_daily_visit IS '';
|
||||
|
||||
|
||||
|
||||
create table if not exists p12_sfull.S98_S_jdy_daily_visit (
|
||||
account TEXT
|
||||
, assign_to TEXT
|
||||
, task_name TEXT
|
||||
, visit_time TEXT
|
||||
, task_follow_up_time TEXT
|
||||
, irtnc_state TEXT
|
||||
, segments TEXT
|
||||
, application TEXT
|
||||
, intelligence_source TEXT
|
||||
, funnels_created TEXT
|
||||
, status TEXT
|
||||
, order_ae_flag TEXT
|
||||
, ae_confict_flag TEXT
|
||||
, account2 TEXT
|
||||
, city TEXT
|
||||
, company_name_en TEXT
|
||||
, nick_name TEXT
|
||||
, company_id TEXT
|
||||
, salar TEXT
|
||||
, contact TEXT
|
||||
, phone TEXT
|
||||
, wechat_id TEXT
|
||||
, email TEXT
|
||||
, new_flag TEXT
|
||||
, account_type TEXT
|
||||
, products TEXT
|
||||
, product_family1 TEXT
|
||||
, product_family2 TEXT
|
||||
, product_family3 TEXT
|
||||
, attachments TEXT
|
||||
, remarks TEXT
|
||||
, contact_phone_flag TEXT
|
||||
, repeat_flag TEXT
|
||||
, am TEXT
|
||||
, visit_tm TEXT
|
||||
, replan_flag TEXT
|
||||
, status2 TEXT
|
||||
, ap_week TEXT
|
||||
, year_text TEXT
|
||||
, year_no TEXT
|
||||
, quater_no TEXT
|
||||
, assigned_to_text TEXT
|
||||
, time_no TEXT
|
||||
, creator TEXT
|
||||
, create_time TEXT
|
||||
, updater TEXT
|
||||
, update_time TEXT
|
||||
, flow_state TEXT
|
||||
, delete_time TEXT
|
||||
, deleter TEXT
|
||||
, id TEXT
|
||||
, app_id TEXT
|
||||
, entry_id TEXT
|
||||
, etl_tx_dt TIMESTAMP
|
||||
) ;
|
||||
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.account IS 'Account';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.assign_to IS 'Assign to';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.task_name IS 'Task Name';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.visit_time IS 'Visit time';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.task_follow_up_time IS 'Task Followup Date/Time';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.irtnc_state IS 'IRTNC State';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.segments IS 'Segments';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.application IS 'Application';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.intelligence_source IS 'Intelligence Source';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.funnels_created IS 'Funnels Created(K/USD)';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.status IS 'Status';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.order_ae_flag IS '是否预约AE';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.ae_confict_flag IS 'AE时间是否冲突';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.account2 IS 'Account';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.city IS 'City';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.company_name_en IS '公司英文名称';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.nick_name IS '公司简称';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.company_id IS '公司ID';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.salar IS '所属销售';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.contact IS '联系人';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.phone IS 'Phone';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.wechat_id IS '微信';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.email IS 'Email';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.new_flag IS 'New/Old';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.account_type IS 'Account Type';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.products IS 'Products';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.product_family1 IS 'Product Family1';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.product_family2 IS 'Product Family2';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.product_family3 IS 'Product Family3';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.attachments IS 'Attachments';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.remarks IS 'Remarks';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.contact_phone_flag IS '判断是否能返回联系人电话号';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.repeat_flag IS '判断是否重复数据';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.am IS 'AM';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.visit_tm IS '选择拜访时间';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.replan_flag IS '辅助-判断是否重复排期2';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.status2 IS 'Status2';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.ap_week IS 'AP-WEEK';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.year_text IS 'Year-文本';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.year_no IS 'Year';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.quater_no IS 'Quater';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.assigned_to_text IS 'Assigned to-文本';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.time_no IS '时间-数字';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.creator IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.create_time IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.updater IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.update_time IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.flow_state IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.delete_time IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.deleter IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.id IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.app_id IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.entry_id IS '';
|
||||
COMMENT ON COLUMN p12_sfull.S98_S_jdy_daily_visit.etl_tx_dt IS '';
|
||||
|
||||
COMMENT ON TABLE p12_sfull.S98_S_jdy_daily_visit IS '';
|
||||
|
|
@ -0,0 +1,234 @@
|
|||
import requests
|
||||
import json
|
||||
from typing import List, Dict, Any, Optional
|
||||
import datetime as dt
|
||||
import psycopg2
|
||||
import uuid
|
||||
|
||||
class JiandaoyunClient:
|
||||
"""
|
||||
简道云API客户端,支持分页功能
|
||||
"""
|
||||
|
||||
def __init__(self, base_url: str, app_id: str, auth_token: str):
|
||||
"""
|
||||
初始化简道云客户端
|
||||
|
||||
参数:
|
||||
base_url: API基础URL
|
||||
app_id: 应用ID
|
||||
auth_token: 授权令牌
|
||||
"""
|
||||
self.base_url = base_url
|
||||
self.app_id = app_id
|
||||
self.headers = {
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': f'Bearer {auth_token}'
|
||||
}
|
||||
|
||||
def fetch_all_data(self, entry_id: str, limit: int = 100,
|
||||
filter_condition: Optional[Dict] = None) -> List[Dict[str, Any]]:
|
||||
"""
|
||||
获取所有数据,自动处理分页
|
||||
参数:
|
||||
entry_id: 表单ID
|
||||
limit: 每页记录数(最大100)
|
||||
filter_condition: 可选的过滤条件
|
||||
|
||||
返回:
|
||||
所有数据记录的列表
|
||||
"""
|
||||
all_data = []
|
||||
last_data_id = None
|
||||
|
||||
while True:
|
||||
# 获取一页数据
|
||||
page_data = self._fetch_page(entry_id, limit, last_data_id, filter_condition)
|
||||
|
||||
# 添加到结果集合中
|
||||
all_data.extend(page_data)
|
||||
|
||||
# 如果获取的数据少于限制数量,说明已到达末尾
|
||||
if len(page_data) < limit:
|
||||
break
|
||||
|
||||
# 为下一次迭代设置data_id
|
||||
if page_data:
|
||||
last_data_id = page_data[-1].get('_id')
|
||||
else:
|
||||
break
|
||||
|
||||
return all_data
|
||||
|
||||
def _fetch_page(self, entry_id: str, limit: int,
|
||||
last_data_id: Optional[str] = None,
|
||||
filter_condition: Optional[Dict] = None) -> List[Dict[str, Any]]:
|
||||
"""
|
||||
获取单页数据
|
||||
|
||||
参数:
|
||||
entry_id: 表单ID
|
||||
limit: 要获取的记录数
|
||||
last_data_id: 上一页最后一条记录的ID
|
||||
filter_condition: 可选的过滤条件
|
||||
|
||||
返回:
|
||||
本页数据记录的列表
|
||||
"""
|
||||
url = f"{self.base_url}"
|
||||
|
||||
payload = {
|
||||
"app_id": self.app_id,
|
||||
"entry_id": entry_id,
|
||||
"limit": limit
|
||||
}
|
||||
|
||||
# 如果提供了分页参数,则添加data_id
|
||||
if last_data_id:
|
||||
payload["data_id"] = last_data_id
|
||||
|
||||
# 如果提供了过滤条件,则添加filter
|
||||
if filter_condition:
|
||||
payload["filter"] = filter_condition
|
||||
|
||||
response = requests.post(
|
||||
url,
|
||||
headers=self.headers,
|
||||
data=json.dumps(payload)
|
||||
)
|
||||
|
||||
# 对于错误状态码抛出异常
|
||||
response.raise_for_status()
|
||||
|
||||
result = response.json()
|
||||
return result.get("data", [])
|
||||
|
||||
|
||||
|
||||
PG_DSN = dict(database="dataops_db",
|
||||
user ="dbuser_dba",
|
||||
password="EmBRxnmmjnE3",
|
||||
host ="124.221.232.219",
|
||||
port ="5432")
|
||||
|
||||
|
||||
def save_json_to_pg(data: list, api_id: str) -> None:
|
||||
"""把列表落库:先软删历史,再插入新批次"""
|
||||
print('[save_to_pg] 写入 PG...')
|
||||
sql = """
|
||||
UPDATE data_api.api_data
|
||||
SET is_loaded = '1'
|
||||
WHERE api_id = %s;
|
||||
|
||||
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), '');
|
||||
"""
|
||||
|
||||
try:
|
||||
with psycopg2.connect(**PG_DSN) as conn:
|
||||
with conn.cursor() as cur:
|
||||
cur.execute(sql,
|
||||
(api_id,
|
||||
str(uuid.uuid4()),
|
||||
api_id,
|
||||
json.dumps(data, ensure_ascii=False),
|
||||
len(data)))
|
||||
conn.commit()
|
||||
cur.close()
|
||||
print('[save_to_pg] 写入完成')
|
||||
except psycopg2.Error as e:
|
||||
print(f'[save_to_pg] 数据库错误: {e}')
|
||||
raise
|
||||
except Exception as e:
|
||||
print(f'[save_to_pg] 未知错误: {e}')
|
||||
raise
|
||||
finally:
|
||||
if 'conn' in locals():
|
||||
conn.close()
|
||||
|
||||
"""
|
||||
获取指定时间段前的时间
|
||||
:param h: 时间段
|
||||
:return: 时间
|
||||
"""
|
||||
def formatted2_previous_hour(h):
|
||||
if h==0:
|
||||
return dt.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
start_of_current_hour = dt.datetime.now().replace(minute=0, second=0, microsecond=0)
|
||||
# 减去一个小时,得到前一个小时的开始时间
|
||||
start_of_previous_hour = start_of_current_hour - dt.timedelta(hours=h)
|
||||
return start_of_previous_hour.strftime("%Y-%m-%d %H:%M:%S")
|
||||
|
||||
"""
|
||||
获取指定天数前的日期
|
||||
:param days: 天数,0表示今天,1表示昨天,以此类推
|
||||
:return: YYYY-MM-DD格式的日期字符串
|
||||
"""
|
||||
def get_previous_date(days: int = 0) -> str:
|
||||
"""
|
||||
获取指定天数前的日期
|
||||
参数:
|
||||
days: 天数,0表示今天,正数表示之前的日期,负数表示之后的日期
|
||||
返回:
|
||||
YYYY-MM-DD格式的日期字符串
|
||||
"""
|
||||
target_date = dt.datetime.now() - dt.timedelta(days=days)
|
||||
return target_date.strftime("%Y-%m-%d")
|
||||
|
||||
# 使用示例
|
||||
def main():
|
||||
# 配置信息
|
||||
BASE_URL = "https://api.jiandaoyun.com/api/v5/app/entry/data/list"
|
||||
AUTH_TOKEN = "tPh9Fm9qumixcfDDvk42TUsc3Y0OoarD"
|
||||
API_ID = "b27090a7db5d49fea811d68bdef4cbf0"
|
||||
|
||||
params = {'entry_id':'674d123f70d2a0f1b1387f47','app_id':'673dc4d1d771318d06974add',}
|
||||
APP_ID = params['app_id']
|
||||
ENTRY_ID = params['entry_id']
|
||||
|
||||
start_dt = get_previous_date(1)
|
||||
end_dt = get_previous_date(0)
|
||||
|
||||
# 创建客户端
|
||||
client = JiandaoyunClient(BASE_URL, APP_ID, AUTH_TOKEN)
|
||||
|
||||
# 定义过滤条件
|
||||
filter_condition = {
|
||||
"rel": "and",
|
||||
"cond": [
|
||||
{
|
||||
"field": "updateTime",
|
||||
"type": "datetime",
|
||||
"method": "range",
|
||||
"value": [
|
||||
start_dt,
|
||||
end_dt
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
try:
|
||||
# 获取所有数据(自动处理分页)
|
||||
all_data = client.fetch_all_data(
|
||||
entry_id=ENTRY_ID,
|
||||
limit=100, # 可根据需要调整(最大100)
|
||||
filter_condition=filter_condition
|
||||
)
|
||||
|
||||
print(f"获取到的总记录数: {len(all_data)}")
|
||||
|
||||
save_json_to_pg(all_data, API_ID)
|
||||
|
||||
# # 在此处处理您的数据
|
||||
# for record in all_data:
|
||||
# print(f"记录ID: {record.get('_id')}")
|
||||
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"获取数据时出错: {e}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
|
@ -0,0 +1,123 @@
|
|||
/*******Main Section**************************************************************************/
|
||||
\set ON_ERROR_STOP on
|
||||
\set AUTOCOMMIT on
|
||||
\timing on
|
||||
|
||||
DELETE FROM data_api.jdy_account;
|
||||
|
||||
insert into data_api.jdy_account (
|
||||
oracle_number
|
||||
, import_id
|
||||
, account_id
|
||||
, account_nick_name
|
||||
, account_name
|
||||
, search_result
|
||||
, city
|
||||
, code
|
||||
, legal_name
|
||||
, depart
|
||||
, channel
|
||||
, status
|
||||
, address
|
||||
, post_address
|
||||
, sale_id
|
||||
, parent_company
|
||||
, industry
|
||||
, sub_industry
|
||||
, custom_class
|
||||
, custom_type
|
||||
, create_by
|
||||
, create_tm
|
||||
, addition_tm
|
||||
, wx_open_id
|
||||
, creator
|
||||
, create_time
|
||||
, updater
|
||||
, update_time
|
||||
, delete_time
|
||||
, deleter
|
||||
, id
|
||||
, app_id
|
||||
, entry_id
|
||||
,etl_tx_dt
|
||||
)
|
||||
select
|
||||
case when trim(both from oracle_number)='' then null else oracle_number::text end oracle_number
|
||||
, case when trim(both from import_id)='' then null else import_id::text end import_id
|
||||
, case when trim(both from account_id)='' then null else account_id::text end account_id
|
||||
, case when trim(both from account_nick_name)='' then null else account_nick_name::text end account_nick_name
|
||||
, case when trim(both from account_name)='' then null else account_name::text end account_name
|
||||
, case when trim(both from search_result)='' then null else search_result::text end search_result
|
||||
, case when trim(both from city)='' then null else city::text end city
|
||||
, case when trim(both from code)='' then null else code::text end code
|
||||
, case when trim(both from legal_name)='' then null else legal_name::text end legal_name
|
||||
, case when trim(both from depart)='' then null else depart::text end depart
|
||||
, case when trim(both from channel)='' then null else channel::text end channel
|
||||
, case when trim(both from status)='' then null else status::text end status
|
||||
, case when trim(both from address)='' then null else address::text end address
|
||||
, case when trim(both from post_address)='' then null else post_address::text end post_address
|
||||
, case when trim(both from sale_id)='' then null else sale_id::text end sale_id
|
||||
, case when trim(both from parent_company)='' then null else parent_company::text end parent_company
|
||||
, case when trim(both from industry)='' then null else industry::text end industry
|
||||
, case when trim(both from sub_industry)='' then null else sub_industry::text end sub_industry
|
||||
, case when trim(both from custom_class)='' then null else custom_class::text end custom_class
|
||||
, case when trim(both from custom_type)='' then null else custom_type::text end custom_type
|
||||
, case when trim(both from create_by)='' then null else create_by::text end create_by
|
||||
, case when trim(both from create_tm)='' then null else create_tm::text end create_tm
|
||||
, case when trim(both from addition_tm)='' then null else addition_tm::text end addition_tm
|
||||
, case when trim(both from wx_open_id)='' then null else wx_open_id::text end wx_open_id
|
||||
, case when trim(both from creator)='' then null else creator::text end creator
|
||||
, case when trim(both from create_time)='' then null else create_time::text end create_time
|
||||
, case when trim(both from updater)='' then null else updater::text end updater
|
||||
, case when trim(both from update_time)='' then null else update_time::text end update_time
|
||||
, case when trim(both from delete_time)='' then null else delete_time::text end delete_time
|
||||
, case when trim(both from deleter)='' then null else deleter::text end deleter
|
||||
, case when trim(both from id)='' then null else id::text end id
|
||||
, case when trim(both from app_id)='' then null else app_id::text end app_id
|
||||
, case when trim(both from entry_id)='' then null else entry_id::text end entry_id
|
||||
,etl_tx_dt
|
||||
from (
|
||||
select
|
||||
(json_array_elements(data::json)::json->>'_widget_1735105058034') oracle_number
|
||||
, (json_array_elements(data::json)::json->>'_widget_1734159435310') import_id
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733470698210') account_id
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733107466966') account_nick_name
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733106413573') account_name
|
||||
, (json_array_elements(data::json)::json->>'_widget_1735033447237') search_result
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733106413579') city
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733106413582') code
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733106413576') legal_name
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733107466967') depart
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733470698211') channel
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733106413580') status
|
||||
, (json_array_elements(data::json)::json->>'_widget_1735033312674') address
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733106413578') post_address
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733106413586') sale_id
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733474922088') parent_company
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733106413584') industry
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733106413585') sub_industry
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733106413591') custom_class
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733106413583') custom_type
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733106413589') create_by
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733106413590') create_tm
|
||||
, (json_array_elements(data::json)::json->>'_widget_1743145837335') addition_tm
|
||||
, (json_array_elements(data::json)::json->>'wx_open_id') wx_open_id
|
||||
, (json_array_elements(data::json)::json->>'creator') creator
|
||||
, (json_array_elements(data::json)::json->>'createTime') create_time
|
||||
, (json_array_elements(data::json)::json->>'updater') updater
|
||||
, (json_array_elements(data::json)::json->>'updateTime') update_time
|
||||
, (json_array_elements(data::json)::json->>'deleteTime') delete_time
|
||||
, (json_array_elements(data::json)::json->>'deleter') deleter
|
||||
, (json_array_elements(data::json)::json->>'_id') id
|
||||
, (json_array_elements(data::json)::json->>'appId') app_id
|
||||
, (json_array_elements(data::json)::json->>'entryId') entry_id
|
||||
,CURRENT_TIMESTAMP(0) etl_tx_dt
|
||||
from (select * from data_api.api_data
|
||||
WHERE api_id='b27090a7db5d49fea811d68bdef4cbf0' 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='b27090a7db5d49fea811d68bdef4cbf0';
|
||||
\q
|
|
@ -0,0 +1,234 @@
|
|||
import requests
|
||||
import json
|
||||
from typing import List, Dict, Any, Optional
|
||||
import datetime as dt
|
||||
import psycopg2
|
||||
import uuid
|
||||
|
||||
class JiandaoyunClient:
|
||||
"""
|
||||
简道云API客户端,支持分页功能
|
||||
"""
|
||||
|
||||
def __init__(self, base_url: str, app_id: str, auth_token: str):
|
||||
"""
|
||||
初始化简道云客户端
|
||||
|
||||
参数:
|
||||
base_url: API基础URL
|
||||
app_id: 应用ID
|
||||
auth_token: 授权令牌
|
||||
"""
|
||||
self.base_url = base_url
|
||||
self.app_id = app_id
|
||||
self.headers = {
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': f'Bearer {auth_token}'
|
||||
}
|
||||
|
||||
def fetch_all_data(self, entry_id: str, limit: int = 100,
|
||||
filter_condition: Optional[Dict] = None) -> List[Dict[str, Any]]:
|
||||
"""
|
||||
获取所有数据,自动处理分页
|
||||
参数:
|
||||
entry_id: 表单ID
|
||||
limit: 每页记录数(最大100)
|
||||
filter_condition: 可选的过滤条件
|
||||
|
||||
返回:
|
||||
所有数据记录的列表
|
||||
"""
|
||||
all_data = []
|
||||
last_data_id = None
|
||||
|
||||
while True:
|
||||
# 获取一页数据
|
||||
page_data = self._fetch_page(entry_id, limit, last_data_id, filter_condition)
|
||||
|
||||
# 添加到结果集合中
|
||||
all_data.extend(page_data)
|
||||
|
||||
# 如果获取的数据少于限制数量,说明已到达末尾
|
||||
if len(page_data) < limit:
|
||||
break
|
||||
|
||||
# 为下一次迭代设置data_id
|
||||
if page_data:
|
||||
last_data_id = page_data[-1].get('_id')
|
||||
else:
|
||||
break
|
||||
|
||||
return all_data
|
||||
|
||||
def _fetch_page(self, entry_id: str, limit: int,
|
||||
last_data_id: Optional[str] = None,
|
||||
filter_condition: Optional[Dict] = None) -> List[Dict[str, Any]]:
|
||||
"""
|
||||
获取单页数据
|
||||
|
||||
参数:
|
||||
entry_id: 表单ID
|
||||
limit: 要获取的记录数
|
||||
last_data_id: 上一页最后一条记录的ID
|
||||
filter_condition: 可选的过滤条件
|
||||
|
||||
返回:
|
||||
本页数据记录的列表
|
||||
"""
|
||||
url = f"{self.base_url}"
|
||||
|
||||
payload = {
|
||||
"app_id": self.app_id,
|
||||
"entry_id": entry_id,
|
||||
"limit": limit
|
||||
}
|
||||
|
||||
# 如果提供了分页参数,则添加data_id
|
||||
if last_data_id:
|
||||
payload["data_id"] = last_data_id
|
||||
|
||||
# 如果提供了过滤条件,则添加filter
|
||||
if filter_condition:
|
||||
payload["filter"] = filter_condition
|
||||
|
||||
response = requests.post(
|
||||
url,
|
||||
headers=self.headers,
|
||||
data=json.dumps(payload)
|
||||
)
|
||||
|
||||
# 对于错误状态码抛出异常
|
||||
response.raise_for_status()
|
||||
|
||||
result = response.json()
|
||||
return result.get("data", [])
|
||||
|
||||
|
||||
|
||||
PG_DSN = dict(database="dataops_db",
|
||||
user ="dbuser_dba",
|
||||
password="EmBRxnmmjnE3",
|
||||
host ="124.221.232.219",
|
||||
port ="5432")
|
||||
|
||||
|
||||
def save_json_to_pg(data: list, api_id: str) -> None:
|
||||
"""把列表落库:先软删历史,再插入新批次"""
|
||||
print('[save_to_pg] 写入 PG...')
|
||||
sql = """
|
||||
UPDATE data_api.api_data
|
||||
SET is_loaded = '1'
|
||||
WHERE api_id = %s;
|
||||
|
||||
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), '');
|
||||
"""
|
||||
|
||||
try:
|
||||
with psycopg2.connect(**PG_DSN) as conn:
|
||||
with conn.cursor() as cur:
|
||||
cur.execute(sql,
|
||||
(api_id,
|
||||
str(uuid.uuid4()),
|
||||
api_id,
|
||||
json.dumps(data, ensure_ascii=False),
|
||||
len(data)))
|
||||
conn.commit()
|
||||
cur.close()
|
||||
print('[save_to_pg] 写入完成')
|
||||
except psycopg2.Error as e:
|
||||
print(f'[save_to_pg] 数据库错误: {e}')
|
||||
raise
|
||||
except Exception as e:
|
||||
print(f'[save_to_pg] 未知错误: {e}')
|
||||
raise
|
||||
finally:
|
||||
if 'conn' in locals():
|
||||
conn.close()
|
||||
|
||||
"""
|
||||
获取指定时间段前的时间
|
||||
:param h: 时间段
|
||||
:return: 时间
|
||||
"""
|
||||
def formatted2_previous_hour(h):
|
||||
if h==0:
|
||||
return dt.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
start_of_current_hour = dt.datetime.now().replace(minute=0, second=0, microsecond=0)
|
||||
# 减去一个小时,得到前一个小时的开始时间
|
||||
start_of_previous_hour = start_of_current_hour - dt.timedelta(hours=h)
|
||||
return start_of_previous_hour.strftime("%Y-%m-%d %H:%M:%S")
|
||||
|
||||
"""
|
||||
获取指定天数前的日期
|
||||
:param days: 天数,0表示今天,1表示昨天,以此类推
|
||||
:return: YYYY-MM-DD格式的日期字符串
|
||||
"""
|
||||
def get_previous_date(days: int = 0) -> str:
|
||||
"""
|
||||
获取指定天数前的日期
|
||||
参数:
|
||||
days: 天数,0表示今天,正数表示之前的日期,负数表示之后的日期
|
||||
返回:
|
||||
YYYY-MM-DD格式的日期字符串
|
||||
"""
|
||||
target_date = dt.datetime.now() - dt.timedelta(days=days)
|
||||
return target_date.strftime("%Y-%m-%d")
|
||||
|
||||
# 使用示例
|
||||
def main():
|
||||
# 配置信息
|
||||
BASE_URL = "https://api.jiandaoyun.com/api/v5/app/entry/data/list"
|
||||
AUTH_TOKEN = "tPh9Fm9qumixcfDDvk42TUsc3Y0OoarD"
|
||||
API_ID = "c72487e8-b309-47a8-aa6a-1a15e794"
|
||||
|
||||
params = {'app_id':'673dc4d1d771318d06974add','entry_id':'675689842895c3f137c99a21',}
|
||||
APP_ID = params['app_id']
|
||||
ENTRY_ID = params['entry_id']
|
||||
|
||||
start_dt = get_previous_date(1)
|
||||
end_dt = get_previous_date(0)
|
||||
|
||||
# 创建客户端
|
||||
client = JiandaoyunClient(BASE_URL, APP_ID, AUTH_TOKEN)
|
||||
|
||||
# 定义过滤条件
|
||||
filter_condition = {
|
||||
"rel": "and",
|
||||
"cond": [
|
||||
{
|
||||
"field": "updateTime",
|
||||
"type": "datetime",
|
||||
"method": "range",
|
||||
"value": [
|
||||
start_dt,
|
||||
end_dt
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
try:
|
||||
# 获取所有数据(自动处理分页)
|
||||
all_data = client.fetch_all_data(
|
||||
entry_id=ENTRY_ID,
|
||||
limit=100, # 可根据需要调整(最大100)
|
||||
filter_condition=filter_condition
|
||||
)
|
||||
|
||||
print(f"获取到的总记录数: {len(all_data)}")
|
||||
|
||||
save_json_to_pg(all_data, API_ID)
|
||||
|
||||
# # 在此处处理您的数据
|
||||
# for record in all_data:
|
||||
# print(f"记录ID: {record.get('_id')}")
|
||||
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"获取数据时出错: {e}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
|
@ -0,0 +1,90 @@
|
|||
/*******Main Section**************************************************************************/
|
||||
\set ON_ERROR_STOP on
|
||||
\set AUTOCOMMIT on
|
||||
\timing on
|
||||
|
||||
DELETE FROM data_api.jdy_contact;
|
||||
|
||||
insert into data_api.jdy_contact (
|
||||
id
|
||||
, account_id
|
||||
, account_name
|
||||
, legal_name
|
||||
, abbreviation
|
||||
, city_name
|
||||
, contact_id
|
||||
, contact_name
|
||||
, phone
|
||||
, wechat_id
|
||||
, email
|
||||
, salers
|
||||
, title
|
||||
, phone2
|
||||
, app_id
|
||||
, create_time
|
||||
, creator
|
||||
, delete_time
|
||||
, deleter
|
||||
, entry_id
|
||||
, update_time
|
||||
, updater
|
||||
,etl_tx_dt
|
||||
)
|
||||
select
|
||||
case when trim(both from id)='' then null else id::text end id
|
||||
, case when trim(both from account_id)='' then null else account_id::text end account_id
|
||||
, case when trim(both from account_name)='' then null else account_name::text end account_name
|
||||
, case when trim(both from legal_name)='' then null else legal_name::text end legal_name
|
||||
, case when trim(both from abbreviation)='' then null else abbreviation::text end abbreviation
|
||||
, case when trim(both from city_name)='' then null else city_name::text end city_name
|
||||
, case when trim(both from contact_id)='' then null else contact_id::text end contact_id
|
||||
, case when trim(both from contact_name)='' then null else contact_name::text end contact_name
|
||||
, case when trim(both from phone)='' then null else phone::text end phone
|
||||
, case when trim(both from wechat_id)='' then null else wechat_id::text end wechat_id
|
||||
, case when trim(both from email)='' then null else email::text end email
|
||||
, case when trim(both from salers)='' then null else salers::text end salers
|
||||
, case when trim(both from title)='' then null else title::text end title
|
||||
, case when trim(both from phone2)='' then null else phone2::text end phone2
|
||||
, case when trim(both from app_id)='' then null else app_id::text end app_id
|
||||
, case when trim(both from create_time)='' then null else create_time::text end create_time
|
||||
, case when trim(both from creator)='' then null else creator::text end creator
|
||||
, case when trim(both from delete_time)='' then null else delete_time::text end delete_time
|
||||
, case when trim(both from deleter)='' then null else deleter::text end deleter
|
||||
, case when trim(both from entry_id)='' then null else entry_id::text end entry_id
|
||||
, case when trim(both from update_time)='' then null else update_time::text end update_time
|
||||
, case when trim(both from updater)='' then null else updater::text end updater
|
||||
,etl_tx_dt
|
||||
from (
|
||||
select
|
||||
(json_array_elements(data::json)::json->>'_id') id
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733473057517') account_id
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733473057518') account_name
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733473057519') legal_name
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733473057520') abbreviation
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733473057521') city_name
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733724552032') contact_id
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733724552033') contact_name
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733724552034') phone
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733724552035') wechat_id
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733724552036') email
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733902521036') salers
|
||||
, (json_array_elements(data::json)::json->>'_widget_1735969558260') title
|
||||
, (json_array_elements(data::json)::json->>'_widget_1736845577224') phone2
|
||||
, (json_array_elements(data::json)::json->>'appId') app_id
|
||||
, (json_array_elements(data::json)::json->>'createTime') create_time
|
||||
, (json_array_elements(data::json)::json->>'creator') creator
|
||||
, (json_array_elements(data::json)::json->>'deleteTime') delete_time
|
||||
, (json_array_elements(data::json)::json->>'deleter') deleter
|
||||
, (json_array_elements(data::json)::json->>'entryId') entry_id
|
||||
, (json_array_elements(data::json)::json->>'updateTime') update_time
|
||||
, (json_array_elements(data::json)::json->>'updater') updater
|
||||
,CURRENT_TIMESTAMP(0) etl_tx_dt
|
||||
from (select * from data_api.api_data
|
||||
WHERE api_id='c72487e8-b309-47a8-aa6a-1a15e794' 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='c72487e8-b309-47a8-aa6a-1a15e794';
|
||||
\q
|
|
@ -0,0 +1,234 @@
|
|||
import requests
|
||||
import json
|
||||
from typing import List, Dict, Any, Optional
|
||||
import datetime as dt
|
||||
import psycopg2
|
||||
import uuid
|
||||
|
||||
class JiandaoyunClient:
|
||||
"""
|
||||
简道云API客户端,支持分页功能
|
||||
"""
|
||||
|
||||
def __init__(self, base_url: str, app_id: str, auth_token: str):
|
||||
"""
|
||||
初始化简道云客户端
|
||||
|
||||
参数:
|
||||
base_url: API基础URL
|
||||
app_id: 应用ID
|
||||
auth_token: 授权令牌
|
||||
"""
|
||||
self.base_url = base_url
|
||||
self.app_id = app_id
|
||||
self.headers = {
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': f'Bearer {auth_token}'
|
||||
}
|
||||
|
||||
def fetch_all_data(self, entry_id: str, limit: int = 100,
|
||||
filter_condition: Optional[Dict] = None) -> List[Dict[str, Any]]:
|
||||
"""
|
||||
获取所有数据,自动处理分页
|
||||
参数:
|
||||
entry_id: 表单ID
|
||||
limit: 每页记录数(最大100)
|
||||
filter_condition: 可选的过滤条件
|
||||
|
||||
返回:
|
||||
所有数据记录的列表
|
||||
"""
|
||||
all_data = []
|
||||
last_data_id = None
|
||||
|
||||
while True:
|
||||
# 获取一页数据
|
||||
page_data = self._fetch_page(entry_id, limit, last_data_id, filter_condition)
|
||||
|
||||
# 添加到结果集合中
|
||||
all_data.extend(page_data)
|
||||
|
||||
# 如果获取的数据少于限制数量,说明已到达末尾
|
||||
if len(page_data) < limit:
|
||||
break
|
||||
|
||||
# 为下一次迭代设置data_id
|
||||
if page_data:
|
||||
last_data_id = page_data[-1].get('_id')
|
||||
else:
|
||||
break
|
||||
|
||||
return all_data
|
||||
|
||||
def _fetch_page(self, entry_id: str, limit: int,
|
||||
last_data_id: Optional[str] = None,
|
||||
filter_condition: Optional[Dict] = None) -> List[Dict[str, Any]]:
|
||||
"""
|
||||
获取单页数据
|
||||
|
||||
参数:
|
||||
entry_id: 表单ID
|
||||
limit: 要获取的记录数
|
||||
last_data_id: 上一页最后一条记录的ID
|
||||
filter_condition: 可选的过滤条件
|
||||
|
||||
返回:
|
||||
本页数据记录的列表
|
||||
"""
|
||||
url = f"{self.base_url}"
|
||||
|
||||
payload = {
|
||||
"app_id": self.app_id,
|
||||
"entry_id": entry_id,
|
||||
"limit": limit
|
||||
}
|
||||
|
||||
# 如果提供了分页参数,则添加data_id
|
||||
if last_data_id:
|
||||
payload["data_id"] = last_data_id
|
||||
|
||||
# 如果提供了过滤条件,则添加filter
|
||||
if filter_condition:
|
||||
payload["filter"] = filter_condition
|
||||
|
||||
response = requests.post(
|
||||
url,
|
||||
headers=self.headers,
|
||||
data=json.dumps(payload)
|
||||
)
|
||||
|
||||
# 对于错误状态码抛出异常
|
||||
response.raise_for_status()
|
||||
|
||||
result = response.json()
|
||||
return result.get("data", [])
|
||||
|
||||
|
||||
|
||||
PG_DSN = dict(database="dataops_db",
|
||||
user ="dbuser_dba",
|
||||
password="EmBRxnmmjnE3",
|
||||
host ="124.221.232.219",
|
||||
port ="5432")
|
||||
|
||||
|
||||
def save_json_to_pg(data: list, api_id: str) -> None:
|
||||
"""把列表落库:先软删历史,再插入新批次"""
|
||||
print('[save_to_pg] 写入 PG...')
|
||||
sql = """
|
||||
UPDATE data_api.api_data
|
||||
SET is_loaded = '1'
|
||||
WHERE api_id = %s;
|
||||
|
||||
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), '');
|
||||
"""
|
||||
|
||||
try:
|
||||
with psycopg2.connect(**PG_DSN) as conn:
|
||||
with conn.cursor() as cur:
|
||||
cur.execute(sql,
|
||||
(api_id,
|
||||
str(uuid.uuid4()),
|
||||
api_id,
|
||||
json.dumps(data, ensure_ascii=False),
|
||||
len(data)))
|
||||
conn.commit()
|
||||
cur.close()
|
||||
print('[save_to_pg] 写入完成')
|
||||
except psycopg2.Error as e:
|
||||
print(f'[save_to_pg] 数据库错误: {e}')
|
||||
raise
|
||||
except Exception as e:
|
||||
print(f'[save_to_pg] 未知错误: {e}')
|
||||
raise
|
||||
finally:
|
||||
if 'conn' in locals():
|
||||
conn.close()
|
||||
|
||||
"""
|
||||
获取指定时间段前的时间
|
||||
:param h: 时间段
|
||||
:return: 时间
|
||||
"""
|
||||
def formatted2_previous_hour(h):
|
||||
if h==0:
|
||||
return dt.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
start_of_current_hour = dt.datetime.now().replace(minute=0, second=0, microsecond=0)
|
||||
# 减去一个小时,得到前一个小时的开始时间
|
||||
start_of_previous_hour = start_of_current_hour - dt.timedelta(hours=h)
|
||||
return start_of_previous_hour.strftime("%Y-%m-%d %H:%M:%S")
|
||||
|
||||
"""
|
||||
获取指定天数前的日期
|
||||
:param days: 天数,0表示今天,1表示昨天,以此类推
|
||||
:return: YYYY-MM-DD格式的日期字符串
|
||||
"""
|
||||
def get_previous_date(days: int = 0) -> str:
|
||||
"""
|
||||
获取指定天数前的日期
|
||||
参数:
|
||||
days: 天数,0表示今天,正数表示之前的日期,负数表示之后的日期
|
||||
返回:
|
||||
YYYY-MM-DD格式的日期字符串
|
||||
"""
|
||||
target_date = dt.datetime.now() - dt.timedelta(days=days)
|
||||
return target_date.strftime("%Y-%m-%d")
|
||||
|
||||
# 使用示例
|
||||
def main():
|
||||
# 配置信息
|
||||
BASE_URL = "https://api.jiandaoyun.com/api/v5/app/entry/data/list"
|
||||
AUTH_TOKEN = "tPh9Fm9qumixcfDDvk42TUsc3Y0OoarD"
|
||||
API_ID = "1dbb92ea95d541508fb91b806a640fab"
|
||||
|
||||
params = {'entry_id':'6752adf26c804e7925bf53a9','app_id':'671062779c3695dfa9c0f892',}
|
||||
APP_ID = params['app_id']
|
||||
ENTRY_ID = params['entry_id']
|
||||
|
||||
start_dt = get_previous_date(1)
|
||||
end_dt = get_previous_date(0)
|
||||
|
||||
# 创建客户端
|
||||
client = JiandaoyunClient(BASE_URL, APP_ID, AUTH_TOKEN)
|
||||
|
||||
# 定义过滤条件
|
||||
filter_condition = {
|
||||
"rel": "and",
|
||||
"cond": [
|
||||
{
|
||||
"field": "updateTime",
|
||||
"type": "datetime",
|
||||
"method": "range",
|
||||
"value": [
|
||||
start_dt,
|
||||
end_dt
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
try:
|
||||
# 获取所有数据(自动处理分页)
|
||||
all_data = client.fetch_all_data(
|
||||
entry_id=ENTRY_ID,
|
||||
limit=100, # 可根据需要调整(最大100)
|
||||
filter_condition=filter_condition
|
||||
)
|
||||
|
||||
print(f"获取到的总记录数: {len(all_data)}")
|
||||
|
||||
save_json_to_pg(all_data, API_ID)
|
||||
|
||||
# # 在此处处理您的数据
|
||||
# for record in all_data:
|
||||
# print(f"记录ID: {record.get('_id')}")
|
||||
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"获取数据时出错: {e}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
|
@ -0,0 +1,60 @@
|
|||
/*******Main Section**************************************************************************/
|
||||
\set ON_ERROR_STOP on
|
||||
\set AUTOCOMMIT on
|
||||
\timing on
|
||||
|
||||
DELETE FROM data_api.jdy_ae_plan;
|
||||
|
||||
insert into data_api.jdy_ae_plan (
|
||||
ae
|
||||
, task_flowup_time
|
||||
, status
|
||||
, creator
|
||||
, create_time
|
||||
, updater
|
||||
, update_time
|
||||
, delete_time
|
||||
, deleter
|
||||
, id
|
||||
, app_id
|
||||
, entry_id
|
||||
,etl_tx_dt
|
||||
)
|
||||
select
|
||||
case when trim(both from ae)='' then null else ae::text end ae
|
||||
, case when trim(both from task_flowup_time)='' then null else task_flowup_time::text end task_flowup_time
|
||||
, case when trim(both from status)='' then null else status::text end status
|
||||
, case when trim(both from creator)='' then null else creator::text end creator
|
||||
, case when trim(both from create_time)='' then null else create_time::text end create_time
|
||||
, case when trim(both from updater)='' then null else updater::text end updater
|
||||
, case when trim(both from update_time)='' then null else update_time::text end update_time
|
||||
, case when trim(both from delete_time)='' then null else delete_time::text end delete_time
|
||||
, case when trim(both from deleter)='' then null else deleter::text end deleter
|
||||
, case when trim(both from id)='' then null else id::text end id
|
||||
, case when trim(both from app_id)='' then null else app_id::text end app_id
|
||||
, case when trim(both from entry_id)='' then null else entry_id::text end entry_id
|
||||
,etl_tx_dt
|
||||
from (
|
||||
select
|
||||
(json_array_elements(data::json)::json->>'_widget_1733111644417') ae
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733111644418') task_flowup_time
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733111644421') status
|
||||
, (json_array_elements(data::json)::json->>'creator') creator
|
||||
, (json_array_elements(data::json)::json->>'createTime') create_time
|
||||
, (json_array_elements(data::json)::json->>'updater') updater
|
||||
, (json_array_elements(data::json)::json->>'updateTime') update_time
|
||||
, (json_array_elements(data::json)::json->>'deleteTime') delete_time
|
||||
, (json_array_elements(data::json)::json->>'deleter') deleter
|
||||
, (json_array_elements(data::json)::json->>'_id') id
|
||||
, (json_array_elements(data::json)::json->>'appId') app_id
|
||||
, (json_array_elements(data::json)::json->>'entryId') entry_id
|
||||
,CURRENT_TIMESTAMP(0) etl_tx_dt
|
||||
from (select * from data_api.api_data
|
||||
WHERE api_id='1dbb92ea95d541508fb91b806a640fab' 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='1dbb92ea95d541508fb91b806a640fab';
|
||||
\q
|
|
@ -0,0 +1,234 @@
|
|||
import requests
|
||||
import json
|
||||
from typing import List, Dict, Any, Optional
|
||||
import datetime as dt
|
||||
import psycopg2
|
||||
import uuid
|
||||
|
||||
class JiandaoyunClient:
|
||||
"""
|
||||
简道云API客户端,支持分页功能
|
||||
"""
|
||||
|
||||
def __init__(self, base_url: str, app_id: str, auth_token: str):
|
||||
"""
|
||||
初始化简道云客户端
|
||||
|
||||
参数:
|
||||
base_url: API基础URL
|
||||
app_id: 应用ID
|
||||
auth_token: 授权令牌
|
||||
"""
|
||||
self.base_url = base_url
|
||||
self.app_id = app_id
|
||||
self.headers = {
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': f'Bearer {auth_token}'
|
||||
}
|
||||
|
||||
def fetch_all_data(self, entry_id: str, limit: int = 100,
|
||||
filter_condition: Optional[Dict] = None) -> List[Dict[str, Any]]:
|
||||
"""
|
||||
获取所有数据,自动处理分页
|
||||
参数:
|
||||
entry_id: 表单ID
|
||||
limit: 每页记录数(最大100)
|
||||
filter_condition: 可选的过滤条件
|
||||
|
||||
返回:
|
||||
所有数据记录的列表
|
||||
"""
|
||||
all_data = []
|
||||
last_data_id = None
|
||||
|
||||
while True:
|
||||
# 获取一页数据
|
||||
page_data = self._fetch_page(entry_id, limit, last_data_id, filter_condition)
|
||||
|
||||
# 添加到结果集合中
|
||||
all_data.extend(page_data)
|
||||
|
||||
# 如果获取的数据少于限制数量,说明已到达末尾
|
||||
if len(page_data) < limit:
|
||||
break
|
||||
|
||||
# 为下一次迭代设置data_id
|
||||
if page_data:
|
||||
last_data_id = page_data[-1].get('_id')
|
||||
else:
|
||||
break
|
||||
|
||||
return all_data
|
||||
|
||||
def _fetch_page(self, entry_id: str, limit: int,
|
||||
last_data_id: Optional[str] = None,
|
||||
filter_condition: Optional[Dict] = None) -> List[Dict[str, Any]]:
|
||||
"""
|
||||
获取单页数据
|
||||
|
||||
参数:
|
||||
entry_id: 表单ID
|
||||
limit: 要获取的记录数
|
||||
last_data_id: 上一页最后一条记录的ID
|
||||
filter_condition: 可选的过滤条件
|
||||
|
||||
返回:
|
||||
本页数据记录的列表
|
||||
"""
|
||||
url = f"{self.base_url}"
|
||||
|
||||
payload = {
|
||||
"app_id": self.app_id,
|
||||
"entry_id": entry_id,
|
||||
"limit": limit
|
||||
}
|
||||
|
||||
# 如果提供了分页参数,则添加data_id
|
||||
if last_data_id:
|
||||
payload["data_id"] = last_data_id
|
||||
|
||||
# 如果提供了过滤条件,则添加filter
|
||||
if filter_condition:
|
||||
payload["filter"] = filter_condition
|
||||
|
||||
response = requests.post(
|
||||
url,
|
||||
headers=self.headers,
|
||||
data=json.dumps(payload)
|
||||
)
|
||||
|
||||
# 对于错误状态码抛出异常
|
||||
response.raise_for_status()
|
||||
|
||||
result = response.json()
|
||||
return result.get("data", [])
|
||||
|
||||
|
||||
|
||||
PG_DSN = dict(database="dataops_db",
|
||||
user ="dbuser_dba",
|
||||
password="EmBRxnmmjnE3",
|
||||
host ="124.221.232.219",
|
||||
port ="5432")
|
||||
|
||||
|
||||
def save_json_to_pg(data: list, api_id: str) -> None:
|
||||
"""把列表落库:先软删历史,再插入新批次"""
|
||||
print('[save_to_pg] 写入 PG...')
|
||||
sql = """
|
||||
UPDATE data_api.api_data
|
||||
SET is_loaded = '1'
|
||||
WHERE api_id = %s;
|
||||
|
||||
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), '');
|
||||
"""
|
||||
|
||||
try:
|
||||
with psycopg2.connect(**PG_DSN) as conn:
|
||||
with conn.cursor() as cur:
|
||||
cur.execute(sql,
|
||||
(api_id,
|
||||
str(uuid.uuid4()),
|
||||
api_id,
|
||||
json.dumps(data, ensure_ascii=False),
|
||||
len(data)))
|
||||
conn.commit()
|
||||
cur.close()
|
||||
print('[save_to_pg] 写入完成')
|
||||
except psycopg2.Error as e:
|
||||
print(f'[save_to_pg] 数据库错误: {e}')
|
||||
raise
|
||||
except Exception as e:
|
||||
print(f'[save_to_pg] 未知错误: {e}')
|
||||
raise
|
||||
finally:
|
||||
if 'conn' in locals():
|
||||
conn.close()
|
||||
|
||||
"""
|
||||
获取指定时间段前的时间
|
||||
:param h: 时间段
|
||||
:return: 时间
|
||||
"""
|
||||
def formatted2_previous_hour(h):
|
||||
if h==0:
|
||||
return dt.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
start_of_current_hour = dt.datetime.now().replace(minute=0, second=0, microsecond=0)
|
||||
# 减去一个小时,得到前一个小时的开始时间
|
||||
start_of_previous_hour = start_of_current_hour - dt.timedelta(hours=h)
|
||||
return start_of_previous_hour.strftime("%Y-%m-%d %H:%M:%S")
|
||||
|
||||
"""
|
||||
获取指定天数前的日期
|
||||
:param days: 天数,0表示今天,1表示昨天,以此类推
|
||||
:return: YYYY-MM-DD格式的日期字符串
|
||||
"""
|
||||
def get_previous_date(days: int = 0) -> str:
|
||||
"""
|
||||
获取指定天数前的日期
|
||||
参数:
|
||||
days: 天数,0表示今天,正数表示之前的日期,负数表示之后的日期
|
||||
返回:
|
||||
YYYY-MM-DD格式的日期字符串
|
||||
"""
|
||||
target_date = dt.datetime.now() - dt.timedelta(days=days)
|
||||
return target_date.strftime("%Y-%m-%d")
|
||||
|
||||
# 使用示例
|
||||
def main():
|
||||
# 配置信息
|
||||
BASE_URL = "https://api.jiandaoyun.com/api/v5/app/entry/data/list"
|
||||
AUTH_TOKEN = "tPh9Fm9qumixcfDDvk42TUsc3Y0OoarD"
|
||||
API_ID = "251f0714de2d4240a14404bac29f7b31"
|
||||
|
||||
params = {'entry_id':'6752adebf850c56051660641','app_id':'671062779c3695dfa9c0f892',}
|
||||
APP_ID = params['app_id']
|
||||
ENTRY_ID = params['entry_id']
|
||||
|
||||
start_dt = get_previous_date(1)
|
||||
end_dt = get_previous_date(0)
|
||||
|
||||
# 创建客户端
|
||||
client = JiandaoyunClient(BASE_URL, APP_ID, AUTH_TOKEN)
|
||||
|
||||
# 定义过滤条件
|
||||
filter_condition = {
|
||||
"rel": "and",
|
||||
"cond": [
|
||||
{
|
||||
"field": "updateTime",
|
||||
"type": "datetime",
|
||||
"method": "range",
|
||||
"value": [
|
||||
start_dt,
|
||||
end_dt
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
try:
|
||||
# 获取所有数据(自动处理分页)
|
||||
all_data = client.fetch_all_data(
|
||||
entry_id=ENTRY_ID,
|
||||
limit=100, # 可根据需要调整(最大100)
|
||||
filter_condition=filter_condition
|
||||
)
|
||||
|
||||
print(f"获取到的总记录数: {len(all_data)}")
|
||||
|
||||
save_json_to_pg(all_data, API_ID)
|
||||
|
||||
# # 在此处处理您的数据
|
||||
# for record in all_data:
|
||||
# print(f"记录ID: {record.get('_id')}")
|
||||
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"获取数据时出错: {e}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
|
@ -0,0 +1,183 @@
|
|||
/*******Main Section**************************************************************************/
|
||||
\set ON_ERROR_STOP on
|
||||
\set AUTOCOMMIT on
|
||||
\timing on
|
||||
|
||||
DELETE FROM data_api.jdy_daily_visit;
|
||||
|
||||
insert into data_api.jdy_daily_visit (
|
||||
account
|
||||
, assign_to
|
||||
, task_name
|
||||
, visit_time
|
||||
, task_follow_up_time
|
||||
, irtnc_state
|
||||
, segments
|
||||
, application
|
||||
, intelligence_source
|
||||
, funnels_created
|
||||
, status
|
||||
, order_ae_flag
|
||||
, ae_confict_flag
|
||||
, account2
|
||||
, city
|
||||
, company_name_en
|
||||
, nick_name
|
||||
, company_id
|
||||
, salar
|
||||
, contact
|
||||
, phone
|
||||
, wechat_id
|
||||
, email
|
||||
, new_flag
|
||||
, account_type
|
||||
, products
|
||||
, product_family1
|
||||
, product_family2
|
||||
, product_family3
|
||||
, attachments
|
||||
, remarks
|
||||
, contact_phone_flag
|
||||
, repeat_flag
|
||||
, am
|
||||
, visit_tm
|
||||
, replan_flag
|
||||
, status2
|
||||
, ap_week
|
||||
, year_text
|
||||
, year_no
|
||||
, quater_no
|
||||
, assigned_to_text
|
||||
, time_no
|
||||
, creator
|
||||
, create_time
|
||||
, updater
|
||||
, update_time
|
||||
, flow_state
|
||||
, delete_time
|
||||
, deleter
|
||||
, id
|
||||
, app_id
|
||||
, entry_id
|
||||
,etl_tx_dt
|
||||
)
|
||||
select
|
||||
case when trim(both from account)='' then null else account::text end account
|
||||
, case when trim(both from assign_to)='' then null else assign_to::text end assign_to
|
||||
, case when trim(both from task_name)='' then null else task_name::text end task_name
|
||||
, case when trim(both from visit_time)='' then null else visit_time::text end visit_time
|
||||
, case when trim(both from task_follow_up_time)='' then null else task_follow_up_time::text end task_follow_up_time
|
||||
, case when trim(both from irtnc_state)='' then null else irtnc_state::text end irtnc_state
|
||||
, case when trim(both from segments)='' then null else segments::text end segments
|
||||
, case when trim(both from application)='' then null else application::text end application
|
||||
, case when trim(both from intelligence_source)='' then null else intelligence_source::text end intelligence_source
|
||||
, case when trim(both from funnels_created)='' then null else funnels_created::text end funnels_created
|
||||
, case when trim(both from status)='' then null else status::text end status
|
||||
, case when trim(both from order_ae_flag)='' then null else order_ae_flag::text end order_ae_flag
|
||||
, case when trim(both from ae_confict_flag)='' then null else ae_confict_flag::text end ae_confict_flag
|
||||
, case when trim(both from account2)='' then null else account2::text end account2
|
||||
, case when trim(both from city)='' then null else city::text end city
|
||||
, case when trim(both from company_name_en)='' then null else company_name_en::text end company_name_en
|
||||
, case when trim(both from nick_name)='' then null else nick_name::text end nick_name
|
||||
, case when trim(both from company_id)='' then null else company_id::text end company_id
|
||||
, case when trim(both from salar)='' then null else salar::text end salar
|
||||
, case when trim(both from contact)='' then null else contact::text end contact
|
||||
, case when trim(both from phone)='' then null else phone::text end phone
|
||||
, case when trim(both from wechat_id)='' then null else wechat_id::text end wechat_id
|
||||
, case when trim(both from email)='' then null else email::text end email
|
||||
, case when trim(both from new_flag)='' then null else new_flag::text end new_flag
|
||||
, case when trim(both from account_type)='' then null else account_type::text end account_type
|
||||
, case when trim(both from products)='' then null else products::text end products
|
||||
, case when trim(both from product_family1)='' then null else product_family1::text end product_family1
|
||||
, case when trim(both from product_family2)='' then null else product_family2::text end product_family2
|
||||
, case when trim(both from product_family3)='' then null else product_family3::text end product_family3
|
||||
, case when trim(both from attachments)='' then null else attachments::text end attachments
|
||||
, case when trim(both from remarks)='' then null else remarks::text end remarks
|
||||
, case when trim(both from contact_phone_flag)='' then null else contact_phone_flag::text end contact_phone_flag
|
||||
, case when trim(both from repeat_flag)='' then null else repeat_flag::text end repeat_flag
|
||||
, case when trim(both from am)='' then null else am::text end am
|
||||
, case when trim(both from visit_tm)='' then null else visit_tm::text end visit_tm
|
||||
, case when trim(both from replan_flag)='' then null else replan_flag::text end replan_flag
|
||||
, case when trim(both from status2)='' then null else status2::text end status2
|
||||
, case when trim(both from ap_week)='' then null else ap_week::text end ap_week
|
||||
, case when trim(both from year_text)='' then null else year_text::text end year_text
|
||||
, case when trim(both from year_no)='' then null else year_no::text end year_no
|
||||
, case when trim(both from quater_no)='' then null else quater_no::text end quater_no
|
||||
, case when trim(both from assigned_to_text)='' then null else assigned_to_text::text end assigned_to_text
|
||||
, case when trim(both from time_no)='' then null else time_no::text end time_no
|
||||
, case when trim(both from creator)='' then null else creator::text end creator
|
||||
, case when trim(both from create_time)='' then null else create_time::text end create_time
|
||||
, case when trim(both from updater)='' then null else updater::text end updater
|
||||
, case when trim(both from update_time)='' then null else update_time::text end update_time
|
||||
, case when trim(both from flow_state)='' then null else flow_state::text end flow_state
|
||||
, case when trim(both from delete_time)='' then null else delete_time::text end delete_time
|
||||
, case when trim(both from deleter)='' then null else deleter::text end deleter
|
||||
, case when trim(both from id)='' then null else id::text end id
|
||||
, case when trim(both from app_id)='' then null else app_id::text end app_id
|
||||
, case when trim(both from entry_id)='' then null else entry_id::text end entry_id
|
||||
,etl_tx_dt
|
||||
from (
|
||||
select
|
||||
(json_array_elements(data::json)::json->>'_widget_1736992438123') account
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733121178723') assign_to
|
||||
, (json_array_elements(data::json)::json->>'_widget_1729230462865') task_name
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733121178724') visit_time
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733475752906') task_follow_up_time
|
||||
, (json_array_elements(data::json)::json->>'_widget_1729230462878') irtnc_state
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733468584207') segments
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733468584209') application
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733471779238') intelligence_source
|
||||
, (json_array_elements(data::json)::json->>'_widget_1729230462876') funnels_created
|
||||
, (json_array_elements(data::json)::json->>'_widget_1729230462879') status
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733724443628') order_ae_flag
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733121604682') ae_confict_flag
|
||||
, (json_array_elements(data::json)::json->>'_widget_1729230462867') account2
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733471779230') city
|
||||
, (json_array_elements(data::json)::json->>'_widget_1736996031737') company_name_en
|
||||
, (json_array_elements(data::json)::json->>'_widget_1736996031738') nick_name
|
||||
, (json_array_elements(data::json)::json->>'_widget_1736996031739') company_id
|
||||
, (json_array_elements(data::json)::json->>'_widget_1736996031740') salar
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733711581534') contact
|
||||
, (json_array_elements(data::json)::json->>'_widget_1736996217003') phone
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733711581537') wechat_id
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733711581536') email
|
||||
, (json_array_elements(data::json)::json->>'_widget_1729230462887') new_flag
|
||||
, (json_array_elements(data::json)::json->>'_widget_1734934349841') account_type
|
||||
, (json_array_elements(data::json)::json->>'_widget_1729230462873') products
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733467937072') product_family1
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733467937075') product_family2
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733467937077') product_family3
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733475752894') attachments
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733475022193') remarks
|
||||
, (json_array_elements(data::json)::json->>'_widget_1736995320796') contact_phone_flag
|
||||
, (json_array_elements(data::json)::json->>'_widget_1736995320797') repeat_flag
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733111407897') am
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733121604679') visit_tm
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733121604680') replan_flag
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733724920730') status2
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733813397274') ap_week
|
||||
, (json_array_elements(data::json)::json->>'_widget_1740975177108') year_text
|
||||
, (json_array_elements(data::json)::json->>'_widget_1740972648538') year_no
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733813589842') quater_no
|
||||
, (json_array_elements(data::json)::json->>'_widget_1739432471884') assigned_to_text
|
||||
, (json_array_elements(data::json)::json->>'_widget_1739964269165') time_no
|
||||
, (json_array_elements(data::json)::json->>'creator') creator
|
||||
, (json_array_elements(data::json)::json->>'createTime') create_time
|
||||
, (json_array_elements(data::json)::json->>'updater') updater
|
||||
, (json_array_elements(data::json)::json->>'updateTime') update_time
|
||||
, (json_array_elements(data::json)::json->>'flowState') flow_state
|
||||
, (json_array_elements(data::json)::json->>'deleteTime') delete_time
|
||||
, (json_array_elements(data::json)::json->>'deleter') deleter
|
||||
, (json_array_elements(data::json)::json->>'_id') id
|
||||
, (json_array_elements(data::json)::json->>'appId') app_id
|
||||
, (json_array_elements(data::json)::json->>'entryId') entry_id
|
||||
,CURRENT_TIMESTAMP(0) etl_tx_dt
|
||||
from (select * from data_api.api_data
|
||||
WHERE api_id='251f0714de2d4240a14404bac29f7b31' 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='251f0714de2d4240a14404bac29f7b31';
|
||||
\q
|
|
@ -0,0 +1,234 @@
|
|||
import requests
|
||||
import json
|
||||
from typing import List, Dict, Any, Optional
|
||||
import datetime as dt
|
||||
import psycopg2
|
||||
import uuid
|
||||
|
||||
class JiandaoyunClient:
|
||||
"""
|
||||
简道云API客户端,支持分页功能
|
||||
"""
|
||||
|
||||
def __init__(self, base_url: str, app_id: str, auth_token: str):
|
||||
"""
|
||||
初始化简道云客户端
|
||||
|
||||
参数:
|
||||
base_url: API基础URL
|
||||
app_id: 应用ID
|
||||
auth_token: 授权令牌
|
||||
"""
|
||||
self.base_url = base_url
|
||||
self.app_id = app_id
|
||||
self.headers = {
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': f'Bearer {auth_token}'
|
||||
}
|
||||
|
||||
def fetch_all_data(self, entry_id: str, limit: int = 100,
|
||||
filter_condition: Optional[Dict] = None) -> List[Dict[str, Any]]:
|
||||
"""
|
||||
获取所有数据,自动处理分页
|
||||
参数:
|
||||
entry_id: 表单ID
|
||||
limit: 每页记录数(最大100)
|
||||
filter_condition: 可选的过滤条件
|
||||
|
||||
返回:
|
||||
所有数据记录的列表
|
||||
"""
|
||||
all_data = []
|
||||
last_data_id = None
|
||||
|
||||
while True:
|
||||
# 获取一页数据
|
||||
page_data = self._fetch_page(entry_id, limit, last_data_id, filter_condition)
|
||||
|
||||
# 添加到结果集合中
|
||||
all_data.extend(page_data)
|
||||
|
||||
# 如果获取的数据少于限制数量,说明已到达末尾
|
||||
if len(page_data) < limit:
|
||||
break
|
||||
|
||||
# 为下一次迭代设置data_id
|
||||
if page_data:
|
||||
last_data_id = page_data[-1].get('_id')
|
||||
else:
|
||||
break
|
||||
|
||||
return all_data
|
||||
|
||||
def _fetch_page(self, entry_id: str, limit: int,
|
||||
last_data_id: Optional[str] = None,
|
||||
filter_condition: Optional[Dict] = None) -> List[Dict[str, Any]]:
|
||||
"""
|
||||
获取单页数据
|
||||
|
||||
参数:
|
||||
entry_id: 表单ID
|
||||
limit: 要获取的记录数
|
||||
last_data_id: 上一页最后一条记录的ID
|
||||
filter_condition: 可选的过滤条件
|
||||
|
||||
返回:
|
||||
本页数据记录的列表
|
||||
"""
|
||||
url = f"{self.base_url}"
|
||||
|
||||
payload = {
|
||||
"app_id": self.app_id,
|
||||
"entry_id": entry_id,
|
||||
"limit": limit
|
||||
}
|
||||
|
||||
# 如果提供了分页参数,则添加data_id
|
||||
if last_data_id:
|
||||
payload["data_id"] = last_data_id
|
||||
|
||||
# 如果提供了过滤条件,则添加filter
|
||||
if filter_condition:
|
||||
payload["filter"] = filter_condition
|
||||
|
||||
response = requests.post(
|
||||
url,
|
||||
headers=self.headers,
|
||||
data=json.dumps(payload)
|
||||
)
|
||||
|
||||
# 对于错误状态码抛出异常
|
||||
response.raise_for_status()
|
||||
|
||||
result = response.json()
|
||||
return result.get("data", [])
|
||||
|
||||
|
||||
|
||||
PG_DSN = dict(database="dataops_db",
|
||||
user ="dbuser_dba",
|
||||
password="EmBRxnmmjnE3",
|
||||
host ="124.221.232.219",
|
||||
port ="5432")
|
||||
|
||||
|
||||
def save_json_to_pg(data: list, api_id: str) -> None:
|
||||
"""把列表落库:先软删历史,再插入新批次"""
|
||||
print('[save_to_pg] 写入 PG...')
|
||||
sql = """
|
||||
UPDATE data_api.api_data
|
||||
SET is_loaded = '1'
|
||||
WHERE api_id = %s;
|
||||
|
||||
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), '');
|
||||
"""
|
||||
|
||||
try:
|
||||
with psycopg2.connect(**PG_DSN) as conn:
|
||||
with conn.cursor() as cur:
|
||||
cur.execute(sql,
|
||||
(api_id,
|
||||
str(uuid.uuid4()),
|
||||
api_id,
|
||||
json.dumps(data, ensure_ascii=False),
|
||||
len(data)))
|
||||
conn.commit()
|
||||
cur.close()
|
||||
print('[save_to_pg] 写入完成')
|
||||
except psycopg2.Error as e:
|
||||
print(f'[save_to_pg] 数据库错误: {e}')
|
||||
raise
|
||||
except Exception as e:
|
||||
print(f'[save_to_pg] 未知错误: {e}')
|
||||
raise
|
||||
finally:
|
||||
if 'conn' in locals():
|
||||
conn.close()
|
||||
|
||||
"""
|
||||
获取指定时间段前的时间
|
||||
:param h: 时间段
|
||||
:return: 时间
|
||||
"""
|
||||
def formatted2_previous_hour(h):
|
||||
if h==0:
|
||||
return dt.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
start_of_current_hour = dt.datetime.now().replace(minute=0, second=0, microsecond=0)
|
||||
# 减去一个小时,得到前一个小时的开始时间
|
||||
start_of_previous_hour = start_of_current_hour - dt.timedelta(hours=h)
|
||||
return start_of_previous_hour.strftime("%Y-%m-%d %H:%M:%S")
|
||||
|
||||
"""
|
||||
获取指定天数前的日期
|
||||
:param days: 天数,0表示今天,1表示昨天,以此类推
|
||||
:return: YYYY-MM-DD格式的日期字符串
|
||||
"""
|
||||
def get_previous_date(days: int = 0) -> str:
|
||||
"""
|
||||
获取指定天数前的日期
|
||||
参数:
|
||||
days: 天数,0表示今天,正数表示之前的日期,负数表示之后的日期
|
||||
返回:
|
||||
YYYY-MM-DD格式的日期字符串
|
||||
"""
|
||||
target_date = dt.datetime.now() - dt.timedelta(days=days)
|
||||
return target_date.strftime("%Y-%m-%d")
|
||||
|
||||
# 使用示例
|
||||
def main():
|
||||
# 配置信息
|
||||
BASE_URL = "https://api.jiandaoyun.com/api/v5/app/entry/data/list"
|
||||
AUTH_TOKEN = "tPh9Fm9qumixcfDDvk42TUsc3Y0OoarD"
|
||||
API_ID = "5ecaf6b1143e4ac082f7f6793e8aea8d"
|
||||
|
||||
params = {'app_id':'671062779c3695dfa9c0f892','entry_id':'6757e3d41d422256a76cb023',}
|
||||
APP_ID = params['app_id']
|
||||
ENTRY_ID = params['entry_id']
|
||||
|
||||
start_dt = get_previous_date(1)
|
||||
end_dt = get_previous_date(0)
|
||||
|
||||
# 创建客户端
|
||||
client = JiandaoyunClient(BASE_URL, APP_ID, AUTH_TOKEN)
|
||||
|
||||
# 定义过滤条件
|
||||
filter_condition = {
|
||||
"rel": "and",
|
||||
"cond": [
|
||||
{
|
||||
"field": "updateTime",
|
||||
"type": "datetime",
|
||||
"method": "range",
|
||||
"value": [
|
||||
start_dt,
|
||||
end_dt
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
try:
|
||||
# 获取所有数据(自动处理分页)
|
||||
all_data = client.fetch_all_data(
|
||||
entry_id=ENTRY_ID,
|
||||
limit=100, # 可根据需要调整(最大100)
|
||||
filter_condition=filter_condition
|
||||
)
|
||||
|
||||
print(f"获取到的总记录数: {len(all_data)}")
|
||||
|
||||
save_json_to_pg(all_data, API_ID)
|
||||
|
||||
# # 在此处处理您的数据
|
||||
# for record in all_data:
|
||||
# print(f"记录ID: {record.get('_id')}")
|
||||
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"获取数据时出错: {e}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
|
@ -0,0 +1,72 @@
|
|||
/*******Main Section**************************************************************************/
|
||||
\set ON_ERROR_STOP on
|
||||
\set AUTOCOMMIT on
|
||||
\timing on
|
||||
|
||||
DELETE FROM data_api.jdy_calendar;
|
||||
|
||||
insert into data_api.jdy_calendar (
|
||||
tektronix_ap
|
||||
, standard_year_calendar
|
||||
, tek_year
|
||||
, tektronix_ap_week
|
||||
, tek_month
|
||||
, tek_q
|
||||
, calendar_week
|
||||
, creator
|
||||
, create_time
|
||||
, updater
|
||||
, update_time
|
||||
, delete_time
|
||||
, deleter
|
||||
, id
|
||||
, app_id
|
||||
, entry_id
|
||||
,etl_tx_dt
|
||||
)
|
||||
select
|
||||
case when trim(both from tektronix_ap)='' then null else tektronix_ap::text end tektronix_ap
|
||||
, case when trim(both from standard_year_calendar)='' then null else standard_year_calendar::text end standard_year_calendar
|
||||
, case when trim(both from tek_year)='' then null else tek_year::text end tek_year
|
||||
, case when trim(both from tektronix_ap_week)='' then null else tektronix_ap_week::text end tektronix_ap_week
|
||||
, case when trim(both from tek_month)='' then null else tek_month::text end tek_month
|
||||
, case when trim(both from tek_q)='' then null else tek_q::text end tek_q
|
||||
, case when trim(both from calendar_week)='' then null else calendar_week::text end calendar_week
|
||||
, case when trim(both from creator)='' then null else creator::text end creator
|
||||
, case when trim(both from create_time)='' then null else create_time::text end create_time
|
||||
, case when trim(both from updater)='' then null else updater::text end updater
|
||||
, case when trim(both from update_time)='' then null else update_time::text end update_time
|
||||
, case when trim(both from delete_time)='' then null else delete_time::text end delete_time
|
||||
, case when trim(both from deleter)='' then null else deleter::text end deleter
|
||||
, case when trim(both from id)='' then null else id::text end id
|
||||
, case when trim(both from app_id)='' then null else app_id::text end app_id
|
||||
, case when trim(both from entry_id)='' then null else entry_id::text end entry_id
|
||||
,etl_tx_dt
|
||||
from (
|
||||
select
|
||||
(json_array_elements(data::json)::json->>'_widget_1733813203127') tektronix_ap
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733813203128') standard_year_calendar
|
||||
, (json_array_elements(data::json)::json->>'_widget_1740972659618') tek_year
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733813203130') tektronix_ap_week
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733813203131') tek_month
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733813203132') tek_q
|
||||
, (json_array_elements(data::json)::json->>'_widget_1733813203133') calendar_week
|
||||
, (json_array_elements(data::json)::json->>'creator') creator
|
||||
, (json_array_elements(data::json)::json->>'createTime') create_time
|
||||
, (json_array_elements(data::json)::json->>'updater') updater
|
||||
, (json_array_elements(data::json)::json->>'updateTime') update_time
|
||||
, (json_array_elements(data::json)::json->>'deleteTime') delete_time
|
||||
, (json_array_elements(data::json)::json->>'deleter') deleter
|
||||
, (json_array_elements(data::json)::json->>'_id') id
|
||||
, (json_array_elements(data::json)::json->>'appId') app_id
|
||||
, (json_array_elements(data::json)::json->>'entryId') entry_id
|
||||
,CURRENT_TIMESTAMP(0) etl_tx_dt
|
||||
from (select * from data_api.api_data
|
||||
WHERE api_id='5ecaf6b1143e4ac082f7f6793e8aea8d' 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='5ecaf6b1143e4ac082f7f6793e8aea8d';
|
||||
\q
|
|
@ -0,0 +1,186 @@
|
|||
#!/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': 'tek_newsletter@163.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_jdy_account_vist_syncs', default_args=default_args,
|
||||
schedule_interval="0 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=["tek_newsletter@163.com"],
|
||||
cc=[""],
|
||||
subject="jdy_account_vist_syncs_failed",
|
||||
html_content='<h3>您好,jdy_account_vist_syncs作业失败,请及时处理" </h3>')
|
||||
|
||||
Jdy_ae_01_feign = SSHOperator(
|
||||
ssh_hook=sshHook,
|
||||
task_id='Jdy_ae_01_feign',
|
||||
command='python3 /data/airflow/etl/API/Jdy_ae_01_feign.py',
|
||||
depends_on_past=False,
|
||||
retries=3,
|
||||
dag=dag)
|
||||
|
||||
Jdy_ae_01_load = SSHOperator(
|
||||
ssh_hook=sshHook,
|
||||
task_id='Jdy_ae_01_load',
|
||||
command='/data/airflow/etl/API/run_psql.sh {{ ds_nodash }} {{params.my_param }}',
|
||||
params={'my_param':"Jdy_ae_01_load"},
|
||||
depends_on_past=False,
|
||||
retries=3,
|
||||
dag=dag)
|
||||
|
||||
Jdy_ae_01_feign >> Jdy_ae_01_load
|
||||
|
||||
Jdy_contact_01_feign = SSHOperator(
|
||||
ssh_hook=sshHook,
|
||||
task_id='Jdy_contact_01_feign',
|
||||
command='python3 /data/airflow/etl/API/Jdy_contact_01_feign.py',
|
||||
depends_on_past=False,
|
||||
retries=3,
|
||||
dag=dag)
|
||||
|
||||
Jdy_contact_01_load = SSHOperator(
|
||||
ssh_hook=sshHook,
|
||||
task_id='Jdy_contact_01_load',
|
||||
command='/data/airflow/etl/API/run_psql.sh {{ ds_nodash }} {{params.my_param }}',
|
||||
params={'my_param':"Jdy_contact_01_load"},
|
||||
depends_on_past=False,
|
||||
retries=3,
|
||||
dag=dag)
|
||||
|
||||
Jdy_contact_01_feign >> Jdy_contact_01_load
|
||||
|
||||
Jdy_daily_visit_feign = SSHOperator(
|
||||
ssh_hook=sshHook,
|
||||
task_id='Jdy_daily_visit_feign',
|
||||
command='python3 /data/airflow/etl/API/Jdy_daily_visit_feign.py',
|
||||
depends_on_past=False,
|
||||
retries=3,
|
||||
dag=dag)
|
||||
|
||||
Jdy_daily_visit_load = SSHOperator(
|
||||
ssh_hook=sshHook,
|
||||
task_id='Jdy_daily_visit_load',
|
||||
command='/data/airflow/etl/API/run_psql.sh {{ ds_nodash }} {{params.my_param }}',
|
||||
params={'my_param':"Jdy_daily_visit_load"},
|
||||
depends_on_past=False,
|
||||
retries=3,
|
||||
dag=dag)
|
||||
|
||||
Jdy_daily_visit_feign >> Jdy_daily_visit_load
|
||||
|
||||
Jdy_account_01_feign = SSHOperator(
|
||||
ssh_hook=sshHook,
|
||||
task_id='Jdy_account_01_feign',
|
||||
command='python3 /data/airflow/etl/API/Jdy_account_01_feign.py',
|
||||
depends_on_past=False,
|
||||
retries=3,
|
||||
dag=dag)
|
||||
|
||||
Jdy_account_01_load = SSHOperator(
|
||||
ssh_hook=sshHook,
|
||||
task_id='Jdy_account_01_load',
|
||||
command='/data/airflow/etl/API/run_psql.sh {{ ds_nodash }} {{params.my_param }}',
|
||||
params={'my_param':"Jdy_account_01_load"},
|
||||
depends_on_past=False,
|
||||
retries=3,
|
||||
dag=dag)
|
||||
|
||||
Jdy_account_01_feign >> Jdy_account_01_load
|
||||
|
||||
Jdy_calendar_01_feign = SSHOperator(
|
||||
ssh_hook=sshHook,
|
||||
task_id='Jdy_calendar_01_feign',
|
||||
command='python3 /data/airflow/etl/API/Jdy_calendar_01_feign.py',
|
||||
depends_on_past=False,
|
||||
retries=3,
|
||||
dag=dag)
|
||||
|
||||
Jdy_calendar_01_load = SSHOperator(
|
||||
ssh_hook=sshHook,
|
||||
task_id='Jdy_calendar_01_load',
|
||||
command='/data/airflow/etl/API/run_psql.sh {{ ds_nodash }} {{params.my_param }}',
|
||||
params={'my_param':"Jdy_calendar_01_load"},
|
||||
depends_on_past=False,
|
||||
retries=3,
|
||||
dag=dag)
|
||||
|
||||
Jdy_calendar_01_feign >> Jdy_calendar_01_load
|
||||
|
||||
jdy_calendar_8832 = SSHOperator(
|
||||
ssh_hook=sshHook,
|
||||
task_id='jdy_calendar_8832',
|
||||
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_jdy_calendar"},
|
||||
depends_on_past=False,
|
||||
retries=3,
|
||||
dag=dag)
|
||||
|
||||
jdy_account_4319 = SSHOperator(
|
||||
ssh_hook=sshHook,
|
||||
task_id='jdy_account_4319',
|
||||
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_jdy_account"},
|
||||
depends_on_past=False,
|
||||
retries=3,
|
||||
dag=dag)
|
||||
|
||||
jdy_contact_6445 = SSHOperator(
|
||||
ssh_hook=sshHook,
|
||||
task_id='jdy_contact_6445',
|
||||
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_jdy_contact"},
|
||||
depends_on_past=False,
|
||||
retries=3,
|
||||
dag=dag)
|
||||
|
||||
jdy_daily_visit_9783 = SSHOperator(
|
||||
ssh_hook=sshHook,
|
||||
task_id='jdy_daily_visit_9783',
|
||||
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_jdy_daily_visit"},
|
||||
depends_on_past=False,
|
||||
retries=3,
|
||||
dag=dag)
|
||||
|
||||
jdy_ae_plan_2600 = SSHOperator(
|
||||
ssh_hook=sshHook,
|
||||
task_id='jdy_ae_plan_2600',
|
||||
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_jdy_ae_plan"},
|
||||
depends_on_past=False,
|
||||
retries=3,
|
||||
dag=dag)
|
||||
|
||||
Jdy_contact_01_load >> jdy_contact_6445
|
||||
Jdy_ae_01_load >> jdy_ae_plan_2600
|
||||
Jdy_daily_visit_load >> jdy_daily_visit_9783
|
||||
Jdy_account_01_load >> jdy_account_4319
|
||||
Jdy_calendar_01_load >> jdy_calendar_8832
|
||||
jdy_calendar_8832 >> task_failed
|
Loading…
Reference in New Issue