优化处理逻辑

This commit is contained in:
2026-03-17 10:49:42 +08:00
parent 682985ffc0
commit a9c7b7ead5
7 changed files with 442 additions and 277 deletions
+36 -82
View File
@@ -22,9 +22,10 @@ def bootstrap_prefect_env() -> None:
bootstrap_prefect_env()
from prefect import flow, task
from prefect.logging import get_run_logger
from project_bitable_common import (
DailySyncConfig,
build_daily_sync_context,
get_base_url,
get_default_end_date,
get_default_start_date,
@@ -36,10 +37,8 @@ from project_bitable_common import (
iter_dates,
load_dotenv,
log_step,
run_gmv_sync,
run_metric_sync,
send_feishu_app_card,
send_feishu_sync_card,
run_daily_sync_for_date,
send_sync_notification,
validate_date,
)
@@ -82,75 +81,22 @@ def load_sync_config(
)
@task(name="sync-sales")
def sync_sales_for_day(stat_date_text: str, config: SyncConfig) -> None:
stat_date = validate_date(stat_date_text)
run_metric_sync(
metric_name="sales",
start_date=stat_date,
end_date=stat_date,
base_url=config.base_url,
mapping_file=Path(config.mapping_file),
store_field_name=config.store_field_name,
table_map_file=config.table_map_file,
dry_run=config.dry_run,
skip_missing_tables=config.skip_missing_tables,
)
@task(name="sync-refund")
def sync_refund_for_day(stat_date_text: str, config: SyncConfig) -> None:
stat_date = validate_date(stat_date_text)
run_metric_sync(
metric_name="refund",
start_date=stat_date,
end_date=stat_date,
base_url=config.base_url,
mapping_file=Path(config.mapping_file),
store_field_name=config.store_field_name,
table_map_file=config.table_map_file,
dry_run=config.dry_run,
skip_missing_tables=config.skip_missing_tables,
)
@task(name="sync-gmv")
def sync_gmv_for_day(stat_date_text: str, config: SyncConfig) -> None:
stat_date = validate_date(stat_date_text)
run_gmv_sync(
start_date=stat_date,
end_date=stat_date,
base_url=config.base_url,
store_field_name=config.store_field_name,
dry_run=config.dry_run,
skip_missing_tables=config.skip_missing_tables,
)
@task(name="notify-feishu")
def notify_feishu(title: str, config: SyncConfig) -> None:
if config.dry_run:
log_step("dry-run 模式下跳过飞书群推送")
return
start_date = validate_date(config.start_date)
end_date = validate_date(config.end_date)
if config.chat_id:
send_feishu_app_card(
chat_id=config.chat_id,
title=title,
base_url=config.base_url,
start_date=start_date,
end_date=end_date,
image_path=config.report_image_path,
def notify_feishu(context: SyncConfig, start_date_text: str, end_date_text: str) -> None:
context_obj = build_daily_sync_context(
DailySyncConfig(
base_url=context.base_url,
mapping_file=Path(context.mapping_file),
store_field_name=context.store_field_name,
table_map_file=context.table_map_file,
dry_run=context.dry_run,
skip_missing_tables=context.skip_missing_tables,
chat_id=context.chat_id,
report_image_path=context.report_image_path,
group_webhook=context.group_webhook,
)
return
send_feishu_sync_card(
webhook_url=config.group_webhook,
title=title,
base_url=config.base_url,
start_date=start_date,
end_date=end_date,
)
send_sync_notification(context_obj, validate_date(start_date_text), validate_date(end_date_text))
@flow(name="gmv-daily-sync")
@@ -161,7 +107,6 @@ def gmv_daily_sync_flow(
skip_missing_tables: bool = False,
table_map_file: str = "",
) -> None:
logger = get_run_logger()
config = load_sync_config(
start_date=start_date,
end_date=end_date,
@@ -174,22 +119,31 @@ def gmv_daily_sync_flow(
end_date_value = validate_date(config.end_date)
if end_date_value < start_date_value:
raise ValueError("end-date 不能早于 start-date")
context = build_daily_sync_context(
DailySyncConfig(
base_url=config.base_url,
mapping_file=Path(config.mapping_file),
store_field_name=config.store_field_name,
table_map_file=config.table_map_file,
dry_run=config.dry_run,
skip_missing_tables=config.skip_missing_tables,
chat_id=config.chat_id,
report_image_path=config.report_image_path,
group_webhook=config.group_webhook,
)
)
logger.info("Prefect 调度开始: %s -> %s", config.start_date, config.end_date)
log_step(f"Prefect 调度开始: {config.start_date} -> {config.end_date}")
try:
for stat_date in iter_dates(start_date_value, end_date_value):
stat_date_text = stat_date.isoformat()
logger.info("开始处理日期: %s", stat_date_text)
sync_sales_for_day(stat_date_text, config)
sync_refund_for_day(stat_date_text, config)
sync_gmv_for_day(stat_date_text, config)
logger.info("日期处理完成: %s", stat_date_text)
log_step(f"Prefect 开始处理日期: {stat_date.isoformat()}")
run_daily_sync_for_date(context, stat_date)
except Exception:
notify_feishu.with_options(name="notify-feishu-failed")("GMV数据同步失败", config)
notify_feishu.with_options(name="notify-feishu-failed")(config, config.start_date, config.end_date)
raise
notify_feishu("GMV数据同步", config)
logger.info("Prefect 调度完成")
notify_feishu(config, config.start_date, config.end_date)
log_step("Prefect 调度完成")
def parse_args() -> argparse.Namespace: