diff --git a/project_bitable_common.py b/project_bitable_common.py index 00fcb90..d957c55 100644 --- a/project_bitable_common.py +++ b/project_bitable_common.py @@ -46,6 +46,7 @@ WITH base_data AS ( f.店铺主键, s.店铺名称 AS 原始店铺名称, p.品牌名称, + p.商品名称, f.业务模式, f.实付分摊金额 FROM analytics_layer.fact_sales f @@ -64,23 +65,30 @@ brand_split AS ( 原始店铺名称, 业务模式, CASE + WHEN COALESCE(原始店铺名称, '') LIKE '%%羽心堂分销%%' + THEN '羽心堂分销' - WHEN 店铺主键 IN (1,28,29) AND 品牌名称 LIKE '羽心堂' + WHEN 店铺主键 IN (1,28,29) AND COALESCE(品牌名称, '') LIKE '羽心堂' THEN 原始店铺名称 || '_羽心堂' - WHEN 店铺主键 IN (1,28,29) AND 品牌名称 LIKE '春回盏' + WHEN 店铺主键 IN (1,28,29) AND COALESCE(品牌名称, '') LIKE '春回盏' THEN 原始店铺名称 || '_春回盏' - WHEN 店铺主键 IN (1,28,29) AND 品牌名称 LIKE 'Mama Mujer' + WHEN 店铺主键 IN (1,28,29) AND COALESCE(品牌名称, '') LIKE 'Mama Mujer' THEN 原始店铺名称 || '_Mama Mujer' - WHEN 店铺主键 IN (1,28,29) AND 品牌名称 LIKE 'ERBA MIGINA' + WHEN 店铺主键 IN (1,28,29) + AND ( + COALESCE(品牌名称, '') LIKE 'ERBA MIGINA' + OR COALESCE(商品名称, '') ILIKE '%%ERBA MIGINA%%' + OR COALESCE(商品名称, '') ~* '(^|[^A-Za-z])EM([^A-Za-z]|$)' + ) THEN 原始店铺名称 || '_ERBA MIGINA' - WHEN 店铺主键 IN (1,28,29) AND 品牌名称 LIKE 'BROKEN ZOO' + WHEN 店铺主键 IN (1,28,29) AND COALESCE(品牌名称, '') LIKE 'BROKEN ZOO' THEN 原始店铺名称 || '_BROKEN ZOO' WHEN 店铺主键 IN (1,28,29) THEN 原始店铺名称 || '_其他' - WHEN 店铺主键 IN (3,9) AND 品牌名称 LIKE '羽心堂' + WHEN 店铺主键 IN (3,9) AND COALESCE(品牌名称, '') LIKE '羽心堂' THEN 原始店铺名称 || '_羽心堂' - WHEN 店铺主键 IN (3,9) AND 品牌名称 LIKE 'Mama Mujer' + WHEN 店铺主键 IN (3,9) AND COALESCE(品牌名称, '') LIKE 'Mama Mujer' THEN 原始店铺名称 || '_Mama Mujer' WHEN 店铺主键 IN (3,9) THEN 原始店铺名称 || '_其他' @@ -103,39 +111,45 @@ shop_brand_detail AS ( SUM(实付分摊金额) AS 总销售额 FROM brand_split GROUP BY 1,2,3 +), +union_data AS ( + SELECT + 统计日期, + 店铺名称, + 总销售额 + FROM shop_brand_detail + WHERE NOT ( + 店铺主键 IN (1,9,28,29) + AND 店铺名称 LIKE '%%_其他' + ) + + UNION ALL + + SELECT + 统计日期, + 原始店铺名称 AS 店铺名称, + SUM(实付分摊金额) AS 总销售额 + FROM base_data + WHERE 店铺主键 IN (1,28,29,3) + GROUP BY 1,2 + + UNION ALL + + SELECT + 统计日期, + 原始店铺名称 || '_权益金' AS 店铺名称, + SUM(实付分摊金额) AS 总销售额 + FROM base_data + WHERE 店铺主键 IN (5,11,14,22,26) + AND 业务模式 = '充值购物金' + GROUP BY 1,2 ) SELECT 统计日期, 店铺名称, - 总销售额 -FROM shop_brand_detail -WHERE NOT ( - 店铺主键 IN (1,9,28,29) - AND 店铺名称 LIKE '%%_其他' -) - -UNION ALL - --- 店铺合计(使用 dim_shop 店铺名) -SELECT - 统计日期, - 原始店铺名称 AS 店铺名称, - SUM(实付分摊金额) -FROM base_data -WHERE 店铺主键 IN (1,28,29,3) -GROUP BY 1,2 - -UNION ALL - --- 权益金(充值购物金单独统计) -SELECT - 统计日期, - 原始店铺名称 || '_权益金' AS 店铺名称, - SUM(实付分摊金额) AS 总销售额 -FROM base_data -WHERE 店铺主键 IN (5,11,14,22,26) - AND 业务模式 = '充值购物金' + SUM(总销售额) AS 总销售额 +FROM union_data GROUP BY 1,2 ORDER BY 统计日期 DESC, 总销售额 DESC; @@ -192,6 +206,7 @@ base_data AS ( f.平台订单号, s.店铺名称 AS 原始店铺名称, p.品牌名称, + p.商品名称, f.退款金额 FROM analytics_layer.fact_returns f LEFT JOIN analytics_layer.dim_shop s @@ -216,22 +231,27 @@ brand_split AS ( 原始店铺名称, CASE - WHEN 店铺主键 IN (1,28,29) AND 品牌名称 LIKE '羽心堂' + WHEN 店铺主键 IN (1,28,29) AND COALESCE(品牌名称, '') LIKE '羽心堂' THEN 原始店铺名称 || '_羽心堂' - WHEN 店铺主键 IN (1,28,29) AND 品牌名称 LIKE '春回盏' + WHEN 店铺主键 IN (1,28,29) AND COALESCE(品牌名称, '') LIKE '春回盏' THEN 原始店铺名称 || '_春回盏' - WHEN 店铺主键 IN (1,28,29) AND 品牌名称 LIKE 'Mama Mujer' + WHEN 店铺主键 IN (1,28,29) AND COALESCE(品牌名称, '') LIKE 'Mama Mujer' THEN 原始店铺名称 || '_Mama Mujer' - WHEN 店铺主键 IN (1,28,29) AND 品牌名称 LIKE 'ERBA MIGINA' + WHEN 店铺主键 IN (1,28,29) + AND ( + COALESCE(品牌名称, '') LIKE 'ERBA MIGINA' + OR COALESCE(商品名称, '') ILIKE '%%ERBA MIGINA%%' + OR COALESCE(商品名称, '') ~* '(^|[^A-Za-z])EM([^A-Za-z]|$)' + ) THEN 原始店铺名称 || '_ERBA MIGINA' - WHEN 店铺主键 IN (1,28,29) AND 品牌名称 LIKE 'BROKEN ZOO' + WHEN 店铺主键 IN (1,28,29) AND COALESCE(品牌名称, '') LIKE 'BROKEN ZOO' THEN 原始店铺名称 || '_BROKEN ZOO' WHEN 店铺主键 IN (1,28,29) THEN 原始店铺名称 || '_其他' - WHEN 店铺主键 IN (3,9) AND 品牌名称 LIKE '羽心堂' + WHEN 店铺主键 IN (3,9) AND COALESCE(品牌名称, '') LIKE '羽心堂' THEN 原始店铺名称 || '_羽心堂' - WHEN 店铺主键 IN (3,9) AND 品牌名称 LIKE 'Mama Mujer' + WHEN 店铺主键 IN (3,9) AND COALESCE(品牌名称, '') LIKE 'Mama Mujer' THEN 原始店铺名称 || '_Mama Mujer' WHEN 店铺主键 IN (3,9) THEN 原始店铺名称 || '_其他' @@ -255,59 +275,57 @@ shop_brand_detail AS ( GROUP BY 1,2,3 ), -all_amount AS ( -SELECT - 统计日期, - 店铺名称, - 总退款金额 AS 金额 -FROM shop_brand_detail -WHERE NOT ( - 店铺主键 IN (1,9,28,29) - AND 店铺名称 LIKE '%%_其他' -) +union_data AS ( + SELECT + 统计日期, + 店铺名称, + 总退款金额 + FROM shop_brand_detail + WHERE NOT ( + 店铺主键 IN (1,9,28,29) + AND 店铺名称 LIKE '%%_其他' + ) -UNION ALL + UNION ALL --- 店铺合计 -SELECT - 统计日期, - 原始店铺名称 AS 店铺名称, - SUM(退款金额) AS 金额 -FROM base_data -WHERE 店铺主键 IN (1,28,29,3) -GROUP BY 1,2 + SELECT + 统计日期, + 原始店铺名称 AS 店铺名称, + SUM(退款金额) AS 总退款金额 + FROM base_data + WHERE 店铺主键 IN (1,28,29,3) + GROUP BY 1,2 -UNION ALL + UNION ALL --- 权益金退款 -SELECT - r.统计日期, - r.原始店铺名称 || '_权益金' AS 店铺名称, - SUM(r.退款金额) AS 金额 -FROM base_data r -JOIN recharge_orders ro - ON r.平台订单号 = ro.平台订单号 - AND r.店铺主键 = ro.店铺主键 -WHERE r.店铺主键 IN (5,11,14,22,26) -GROUP BY 1,2 + SELECT + r.统计日期, + r.原始店铺名称 || '_权益金' AS 店铺名称, + SUM(r.退款金额) AS 总退款金额 + FROM base_data r + JOIN recharge_orders ro + ON r.平台订单号 = ro.平台订单号 + AND r.店铺主键 = ro.店铺主键 + WHERE r.店铺主键 IN (5,11,14,22,26) + GROUP BY 1,2 -UNION ALL + UNION ALL -SELECT - mrs.统计日期, - COALESCE(s.店铺名称, '未知店铺') AS 店铺名称, - SUM(mrs.补充退款金额) AS 金额 -FROM missing_return_sales mrs -LEFT JOIN analytics_layer.dim_shop s - ON mrs.店铺主键 = s.店铺主键 -GROUP BY 1,2 + SELECT + mrs.统计日期, + COALESCE(s.店铺名称, '未知店铺') AS 店铺名称, + SUM(mrs.补充退款金额) AS 总退款金额 + FROM missing_return_sales mrs + LEFT JOIN analytics_layer.dim_shop s + ON mrs.店铺主键 = s.店铺主键 + GROUP BY 1,2 ) SELECT 统计日期, 店铺名称, - SUM(金额) AS 总退款金额 -FROM all_amount + SUM(总退款金额) AS 总退款金额 +FROM union_data GROUP BY 统计日期, 店铺名称 diff --git a/run_project_bitable_pipeline.py b/run_project_bitable_pipeline.py index 6c8bb55..2d785ec 100644 --- a/run_project_bitable_pipeline.py +++ b/run_project_bitable_pipeline.py @@ -34,6 +34,7 @@ def parse_args() -> argparse.Namespace: parser.add_argument("--table-map-file", default="", help="可选,项目到表名的映射 JSON 文件路径") parser.add_argument("--dry-run", action="store_true", help="只输出将要更新的内容,不调用飞书写接口") parser.add_argument("--skip-missing-tables", action="store_true", help="找不到对应月份的飞书表时跳过") + parser.add_argument("--no-notify", action="store_true", help="只写入多维表格,不推送飞书群通知") return parser.parse_args() @@ -61,7 +62,10 @@ def main() -> None: ) for stat_date in iter_dates(start_date, end_date): run_daily_sync_for_date(context, stat_date) - send_sync_notification(context, start_date, end_date) + if args.no_notify: + log_step("已跳过飞书群通知") + else: + send_sync_notification(context, start_date, end_date) log_step("流水线完成") diff --git a/店铺映射表.xlsx b/店铺映射表.xlsx index 46b3dcf..a7e1dda 100644 Binary files a/店铺映射表.xlsx and b/店铺映射表.xlsx differ