Files
inventory_analytics/inventory_sync/sql.py
T
2026-05-09 14:11:02 +08:00

130 lines
3.6 KiB
Python

from __future__ import annotations
from collections.abc import Sequence
from .specs import BRAND_SYNC_TARGETS
DEFAULT_SYNC_TARGET = BRAND_SYNC_TARGETS[0]
def _quote_sql_literal(value: str) -> str:
return "'" + value.replace("'", "''") + "'"
def _format_warehouse_keys(warehouse_keys: Sequence[int | str]) -> str:
cleaned_keys = tuple(int(key) for key in warehouse_keys)
if not cleaned_keys:
raise ValueError("warehouse_keys 不能为空")
return ", ".join(str(key) for key in cleaned_keys)
def build_postgres_query(
brand_name: str = DEFAULT_SYNC_TARGET.brand_name,
warehouse_keys: Sequence[int | str] = DEFAULT_SYNC_TARGET.warehouse_keys,
) -> str:
brand_filter = _quote_sql_literal(brand_name)
warehouse_key_filter = _format_warehouse_keys(warehouse_keys)
return f"""
WITH inventory_latest AS (
SELECT
t."统一规格编码",
t."仓库主键",
t."物理总库存"
FROM (
SELECT
f."统一规格编码",
f."仓库主键",
f."快照时间",
f."物理总库存",
ROW_NUMBER() OVER (
PARTITION BY f."统一规格编码", f."仓库主键"
ORDER BY f."快照时间" DESC
) AS rn
FROM analytics_layer.fact_inventory_snapshot f
WHERE f."数据来源系统" = '旺店通'
AND NULLIF(TRIM(f."统一规格编码"), '') IS NOT NULL
) t
WHERE t.rn = 1
),
inventory_summary AS (
SELECT
"统一规格编码",
SUM("物理总库存") AS "总库存"
FROM inventory_latest
WHERE "仓库主键" IN ({warehouse_key_filter})
GROUP BY "统一规格编码"
),
shop_stock_latest AS (
SELECT
t."统一规格编码",
t."店铺主键",
SUM(t."可发库存") AS "可发库存"
FROM (
SELECT
f."统一规格编码",
f."店铺主键",
f."仓库主键",
f."快照时间",
f."可发库存",
f."状态",
ROW_NUMBER() OVER (
PARTITION BY
f."统一规格编码",
f."店铺主键",
f."仓库主键"
ORDER BY f."快照时间" DESC
) AS rn
FROM analytics_layer.fact_shop_stock_snapshot f
WHERE f."数据来源系统" = '旺店通店铺'
AND NULLIF(TRIM(f."统一规格编码"), '') IS NOT NULL
) t
WHERE t.rn = 1
AND t."状态" <> '已失效'
AND t."可发库存" <> 0
GROUP BY
t."统一规格编码",
t."店铺主键"
),
product_dim AS (
SELECT DISTINCT ON ("统一规格编码")
"统一规格编码",
"品牌名称",
"货品简称",
"一级分类",
"商品名称",
"条形码",
"零售价"
FROM analytics_layer.dim_product
WHERE NULLIF(TRIM("统一规格编码"), '') IS NOT NULL
ORDER BY "统一规格编码"
)
SELECT
sl."统一规格编码",
pd."品牌名称",
pd."货品简称",
pd."一级分类",
pd."商品名称",
pd."条形码",
pd."零售价",
ds."店铺名称",
COALESCE(sl."可发库存", 0) AS "店铺挂单量",
COALESCE(inv."总库存", 0) AS "总库存"
FROM shop_stock_latest sl
LEFT JOIN inventory_summary inv
ON sl."统一规格编码" = inv."统一规格编码"
LEFT JOIN analytics_layer.dim_shop ds
ON sl."店铺主键" = ds."店铺主键"
LEFT JOIN product_dim pd
ON sl."统一规格编码" = pd."统一规格编码"
WHERE pd."品牌名称" = {brand_filter}
ORDER BY sl."统一规格编码", sl."店铺主键"
"""
POSTGRES_QUERY = build_postgres_query()