ODS 完成

This commit is contained in:
Neo
2025-11-30 07:19:05 +08:00
parent b9b050bb5d
commit a6ad343092
81 changed files with 15695 additions and 227180 deletions

View File

@@ -1,49 +1,62 @@
# -*- coding: utf-8 -*-
"""数据库连接管理"""
"""Database connection manager with capped connect_timeout."""
import psycopg2
import psycopg2.extras
class DatabaseConnection:
"""数据库连接管理器"""
"""Wrap psycopg2 connection with session parameters and timeout guard."""
def __init__(self, dsn: str, session: dict = None, connect_timeout: int = None):
self.conn = psycopg2.connect(dsn, connect_timeout=(connect_timeout or 5))
timeout_val = connect_timeout if connect_timeout is not None else 5
# PRD: database connect_timeout must not exceed 20 seconds.
timeout_val = max(1, min(int(timeout_val), 20))
self.conn = psycopg2.connect(dsn, connect_timeout=timeout_val)
self.conn.autocommit = False
# 设置会话参数
# Session parameters (timezone, statement timeout, etc.)
if session:
with self.conn.cursor() as c:
if session.get("timezone"):
c.execute("SET TIME ZONE %s", (session["timezone"],))
if session.get("statement_timeout_ms") is not None:
c.execute("SET statement_timeout = %s", (int(session["statement_timeout_ms"]),))
c.execute(
"SET statement_timeout = %s",
(int(session["statement_timeout_ms"]),),
)
if session.get("lock_timeout_ms") is not None:
c.execute("SET lock_timeout = %s", (int(session["lock_timeout_ms"]),))
c.execute(
"SET lock_timeout = %s", (int(session["lock_timeout_ms"]),)
)
if session.get("idle_in_tx_timeout_ms") is not None:
c.execute("SET idle_in_transaction_session_timeout = %s",
(int(session["idle_in_tx_timeout_ms"]),))
c.execute(
"SET idle_in_transaction_session_timeout = %s",
(int(session["idle_in_tx_timeout_ms"]),),
)
def query(self, sql: str, args=None):
"""执行查询并返回结果"""
"""Execute a query and fetch all rows."""
with self.conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor) as c:
c.execute(sql, args)
return c.fetchall()
def execute(self, sql: str, args=None):
"""执行SQL语句"""
"""Execute a SQL statement without returning rows."""
with self.conn.cursor() as c:
c.execute(sql, args)
def commit(self):
"""提交事务"""
"""Commit current transaction."""
self.conn.commit()
def rollback(self):
"""回滚事务"""
"""Rollback current transaction."""
self.conn.rollback()
def close(self):
"""关闭连接"""
"""Safely close the connection."""
try:
self.conn.close()
except Exception:

View File

@@ -24,8 +24,8 @@ CREATE TABLE IF NOT EXISTS dim_site_Ex (
site_id BIGINT,
avatar TEXT,
address TEXT,
longitude NUMERIC(18,2),
latitude NUMERIC(18,2),
longitude NUMERIC(9,6),
latitude NUMERIC(9,6),
tenant_site_region_id BIGINT,
auto_light INTEGER,
light_status INTEGER,
@@ -85,7 +85,7 @@ COMMENT ON COLUMN dim_table.table_name IS '台桌名称/编号,如 A17、888
COMMENT ON COLUMN dim_table.site_table_area_id IS '门店区 ID用于区分 A区/B区/补时区等。 | 来源: siteTableAreaId | 角色: 外键';
COMMENT ON COLUMN dim_table.site_table_area_name IS '区域名称,如 “A区”“补时长”。 | 来源: siteTableAreaName';
COMMENT ON COLUMN dim_table.tenant_table_area_id IS '租户级区域 ID。 | 来源: tenantTableAreaId | 角色: 外键';
COMMENT ON COLUMN dim_table.table_price IS '???????? table_fee_transactions ??????? id ?? table_fee_transactions.site_table_id';
COMMENT ON COLUMN dim_table.table_price IS '台桌基础单价,从table_fee_transactions取值。方法对应本表idtable_fee_transactions表的site_table_id';
-- dim_table_Ex
CREATE TABLE IF NOT EXISTS dim_table_Ex (
@@ -151,8 +151,8 @@ CREATE TABLE IF NOT EXISTS dim_assistant_Ex (
avatar TEXT,
introduce TEXT,
video_introduction_url TEXT,
height DOUBLE PRECISION,
weight DOUBLE PRECISION,
height NUMERIC(5,2),
weight NUMERIC(5,2),
shop_name TEXT,
group_id BIGINT,
group_name TEXT,
@@ -244,7 +244,7 @@ CREATE TABLE IF NOT EXISTS dim_member (
register_site_id BIGINT,
mobile TEXT,
nickname TEXT,
member_card_grade_code INTEGER,
member_card_grade_code BIGINT,
member_card_grade_name TEXT,
create_time TIMESTAMPTZ,
update_time TIMESTAMPTZ,
@@ -307,7 +307,7 @@ COMMENT ON COLUMN dim_member_card_account.register_site_id IS '开卡门店 ID
COMMENT ON COLUMN dim_member_card_account.tenant_member_id IS '对应会员档案中的 member_id本租户内。0 表示未绑定会员。 | 来源: tenant_member_id | 角色: 外键';
COMMENT ON COLUMN dim_member_card_account.system_member_id IS '全局会员 ID用于跨租户统一会员身份。0 表示未绑定会员。 | 来源: system_member_id | 角色: 外键';
COMMENT ON COLUMN dim_member_card_account.card_type_id IS '卡种 ID指向卡种配置表。与下面的 grade_code 共同定义卡类别。 | 来源: card_type_id | 角色: 外键';
COMMENT ON COLUMN dim_member_card_account.member_card_grade_code IS '?????/?????????????2790683528022853=????2790683528022856=??????2790683528022855=????2790683528022858=????2790683528022857=??';
COMMENT ON COLUMN dim_member_card_account.member_card_grade_code IS '卡等级/卡类代码,区别不同类别卡。2790683528022853=储值卡,2790683528022856=活动抵用券,2790683528022855=台费卡,2790683528022858=酒水卡,2790683528022857=月卡';
COMMENT ON COLUMN dim_member_card_account.member_card_grade_code_name IS '卡等级中文名称,与 member_card_grade_code 一一对应。 | 来源: member_card_grade_code_name';
COMMENT ON COLUMN dim_member_card_account.member_card_type_name IS '卡类型名称,通常与 grade_code_name 相同,纯展示字段。 | 来源: member_card_type_name';
COMMENT ON COLUMN dim_member_card_account.member_name IS '持卡会员姓名快照,部分为空表示未绑定。 | 来源: member_name';
@@ -375,58 +375,58 @@ CREATE TABLE IF NOT EXISTS dim_member_card_account_Ex (
cxAssisnatLevel TEXT,
PRIMARY KEY (member_card_id)
);
COMMENT ON COLUMN dim_member_card_account_Ex.member_card_id IS 'id | 来源: bigint | 角色: 会员卡账户主键,唯一标识一张具体卡。';
COMMENT ON COLUMN dim_member_card_account_Ex.site_name IS '门店名称展示字段(全部相同)。 | 来源: site_name | 角色: 门店名称展示字段(全部相同)。';
COMMENT ON COLUMN dim_member_card_account_Ex.tenant_name IS 'tenant_name | 来源: string | 角色: 租户名称(当前导出为空)。';
COMMENT ON COLUMN dim_member_card_account_Ex.tenantAvatar IS 'tenantAvatar | 来源: string | 角色: 租户头像 URL当前导出为空';
COMMENT ON COLUMN dim_member_card_account_Ex.effect_site_id IS 'effect_site_id | 来源: bigint | 角色: 卡片限定生效门店 ID。0 表示不限门店,配合 able_cross_site=1 表示全店通用。';
COMMENT ON COLUMN dim_member_card_account_Ex.able_cross_site IS 'able_cross_site | 来源: int | 角色: 是否允许跨门店使用该卡1=允许跨店0=仅限开卡门店。';
COMMENT ON COLUMN dim_member_card_account_Ex.card_physics_type IS 'card_physics_type | 来源: int | 角色: 物理卡类型1=实体/标准卡;其他值未出现,含义未知。';
COMMENT ON COLUMN dim_member_card_account_Ex.card_no IS 'card_no | 来源: string | 角色: 物理卡号或条码(当前全部为空)。';
COMMENT ON COLUMN dim_member_card_account_Ex.bind_password IS 'bind_password | 来源: string | 角色: 卡绑定密码(未启用)。';
COMMENT ON COLUMN dim_member_card_account_Ex.use_scene IS 'use_scene | 来源: string | 角色: 使用场景说明(当前为空)。';
COMMENT ON COLUMN dim_member_card_account_Ex.denomination IS 'denomination | 来源: decimal | 角色: 面额或初始储值额度当前均为0.0,未启用)。';
COMMENT ON COLUMN dim_member_card_account_Ex.create_time IS 'create_time | 来源: datetime | 角色: 卡片创建时间。';
COMMENT ON COLUMN dim_member_card_account_Ex.disable_start_time IS 'disable_start_time | 来源: datetime | 角色: 卡片禁用开始时间,当前为默认值表示未禁用。';
COMMENT ON COLUMN dim_member_card_account_Ex.disable_end_time IS 'disable_end_time | 来源: datetime | 角色: 卡片禁用结束时间,当前为默认值表示未禁用。';
COMMENT ON COLUMN dim_member_card_account_Ex.is_allow_give IS 'is_allow_give | 来源: int | 角色: 是否允许转赠给他人0=不允许1=允许。';
COMMENT ON COLUMN dim_member_card_account_Ex.is_allow_order_deduct IS 'is_allow_order_deduct | 来源: int | 角色: 是否允许在订单层面统一扣款0=不允许1=允许。';
COMMENT ON COLUMN dim_member_card_account_Ex.sort IS 'sort | 来源: int | 角色: 前端排序序号。';
COMMENT ON COLUMN dim_member_card_account_Ex.table_discount IS 'table_discount | 来源: float | 角色: 台费折扣率折扣百分比10.0=不打折9.0=九折等)。当前全部 10.0。';
COMMENT ON COLUMN dim_member_card_account_Ex.goods_discount IS 'goods_discount | 来源: float | 角色: 商品折扣率,当前为 10.0 表示无折扣。';
COMMENT ON COLUMN dim_member_card_account_Ex.assistant_discount IS 'assistant_discount | 来源: float | 角色: 助教服务折扣率,当前为 10.0。';
COMMENT ON COLUMN dim_member_card_account_Ex.assistant_reward_discount IS 'assistant_reward_discount | 来源: float | 角色: 助教奖励折扣率,当前为 10.0(未启用)。';
COMMENT ON COLUMN dim_member_card_account_Ex.table_service_discount IS 'table_service_discount | 来源: float | 角色: 台费服务类折扣率,当前为 10.0。';
COMMENT ON COLUMN dim_member_card_account_Ex.goods_service_discount IS 'goods_service_discount | 来源: float | 角色: 商品服务折扣率,当前为 10.0。';
COMMENT ON COLUMN dim_member_card_account_Ex.assistant_service_discount IS 'assistant_service_discount | 来源: float | 角色: 助教服务类折扣率,当前为 10.0。';
COMMENT ON COLUMN dim_member_card_account_Ex.coupon_discount IS 'coupon_discount | 来源: float | 角色: 使用券的折扣比例(全部 10.0,未使用)。';
COMMENT ON COLUMN dim_member_card_account_Ex.table_discount_sub_switch IS 'table_discount_sub_switch | 来源: int | 角色: 台费折扣叠加开关1=叠加其他折扣2=不叠加,仅用卡折扣。';
COMMENT ON COLUMN dim_member_card_account_Ex.goods_discount_sub_switch IS 'goods_discount_sub_switch | 来源: int | 角色: 商品折扣叠加开关,意义同上。';
COMMENT ON COLUMN dim_member_card_account_Ex.assistant_discount_sub_switch IS 'assistant_discount_sub_switch | 来源: int | 角色: 助教折扣叠加开关,意义同上。';
COMMENT ON COLUMN dim_member_card_account_Ex.assistant_reward_discount_sub_switch IS 'assistant_reward_discount_sub_switch | 来源: int | 角色: 助教奖励折扣叠加开关(未启用)。';
COMMENT ON COLUMN dim_member_card_account_Ex.goods_discount_range_type IS 'goods_discount_range_type | 来源: int | 角色: 商品折扣范围类型,未在文档说明具体含义。';
COMMENT ON COLUMN dim_member_card_account_Ex.table_deduct_radio IS 'table_deduct_radio | 来源: float | 角色: 台费抵扣比例百分比。100.0 表示允许全额抵扣0=不允许。';
COMMENT ON COLUMN dim_member_card_account_Ex.goods_deduct_radio IS 'goods_deduct_radio | 来源: float | 角色: 商品抵扣比例,意义同上。';
COMMENT ON COLUMN dim_member_card_account_Ex.assistant_deduct_radio IS 'assistant_deduct_radio | 来源: float | 角色: 助教抵扣比例,意义同上。';
COMMENT ON COLUMN dim_member_card_account_Ex.table_service_deduct_radio IS 'table_service_deduct_radio | 来源: float | 角色: 台费服务金抵扣比例。';
COMMENT ON COLUMN dim_member_card_account_Ex.goods_service_deduct_radio IS 'goods_service_deduct_radio | 来源: float | 角色: 商品服务金抵扣比例。';
COMMENT ON COLUMN dim_member_card_account_Ex.assistant_service_deduct_radio IS 'assistant_service_deduct_radio | 来源: float | 角色: 助教服务金抵扣比例。';
COMMENT ON COLUMN dim_member_card_account_Ex.assistant_reward_deduct_radio IS 'assistant_reward_deduct_radio | 来源: float | 角色: 助教奖励金抵扣比例(未启用)。';
COMMENT ON COLUMN dim_member_card_account_Ex.coupon_deduct_radio IS 'coupon_deduct_radio | 来源: float | 角色: 券抵扣比例(未启用)。';
COMMENT ON COLUMN dim_member_card_account_Ex.cardSettleDeduct IS 'cardSettleDeduct | 来源: float | 角色: 结算时统一扣卡金额配置(当前为 0.0,未使用)。';
COMMENT ON COLUMN dim_member_card_account_Ex.tableCardDeduct IS 'tableCardDeduct | 来源: float | 角色: 台费扣卡金额配置,当前 0.0。';
COMMENT ON COLUMN dim_member_card_account_Ex.tableServiceCardDeduct IS 'tableServiceCardDeduct | 来源: float | 角色: 台费服务金扣卡金额配置。';
COMMENT ON COLUMN dim_member_card_account_Ex.goodsCarDeduct IS 'goodsCarDeduct | 来源: float | 角色: 商品扣卡金额配置。';
COMMENT ON COLUMN dim_member_card_account_Ex.goodsServiceCardDeduct IS 'goodsServiceCardDeduct | 来源: float | 角色: 商品服务金扣卡金额配置。';
COMMENT ON COLUMN dim_member_card_account_Ex.assistantCardDeduct IS 'assistantCardDeduct | 来源: float | 角色: 助教扣卡金额配置。';
COMMENT ON COLUMN dim_member_card_account_Ex.assistantServiceCardDeduct IS 'assistantServiceCardDeduct | 来源: float | 角色: 助教服务金扣卡金额配置。';
COMMENT ON COLUMN dim_member_card_account_Ex.assistantRewardCardDeduct IS 'assistantRewardCardDeduct | 来源: float | 角色: 助教奖励金扣卡金额配置(未启用)。';
COMMENT ON COLUMN dim_member_card_account_Ex.couponCardDeduct IS 'couponCardDeduct | 来源: float | 角色: 使用券扣卡金额配置。';
COMMENT ON COLUMN dim_member_card_account_Ex.deliveryFeeDeduct IS 'deliveryFeeDeduct | 来源: float | 角色: 配送费扣卡金额配置(未启用)。';
COMMENT ON COLUMN dim_member_card_account_Ex.tableAreaId IS 'tableAreaId | 来源: list | 角色: 可用台区 ID 列表,空表示不限台区。';
COMMENT ON COLUMN dim_member_card_account_Ex.goodsCategoryId IS 'goodsCategoryId | 来源: list | 角色: 可用商品分类 ID 列表,空表示不限制商品类别。';
COMMENT ON COLUMN dim_member_card_account_Ex.pdAssisnatLevel IS 'pdAssisnatLevel | 来源: list | 角色: 允许的陪打助教等级列表,空表示不限。';
COMMENT ON COLUMN dim_member_card_account_Ex.cxAssisnatLevel IS 'cxAssisnatLevel | 来源: list | 角色: 允许的促销助教等级列表,空表示不限。';
COMMENT ON COLUMN dim_member_card_account_Ex.member_card_id IS '会员卡账户主键,唯一标识一张具体卡。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dim_member_card_account_Ex.site_name IS '门店名称展示字段(全部相同)。 | 来源: site_name';
COMMENT ON COLUMN dim_member_card_account_Ex.tenant_name IS '租户名称(当前导出为空)。 | 来源: tenantName';
COMMENT ON COLUMN dim_member_card_account_Ex.tenantAvatar IS '租户头像 URL当前导出为空 | 来源: tenantAvatar';
COMMENT ON COLUMN dim_member_card_account_Ex.effect_site_id IS '卡片限定生效门店 ID。0 表示不限门店,配合 able_cross_site=1 表示全店通用。 | 来源: effect_site_id';
COMMENT ON COLUMN dim_member_card_account_Ex.able_cross_site IS '是否允许跨门店使用该卡1=允许跨店0=仅限开卡门店。 | 来源: able_cross_site';
COMMENT ON COLUMN dim_member_card_account_Ex.card_physics_type IS '物理卡类型1=实体/标准卡;其他值未出现,含义未知。 | 来源: card_physics_type';
COMMENT ON COLUMN dim_member_card_account_Ex.card_no IS '物理卡号或条码(当前全部为空)。 | 来源: card_no';
COMMENT ON COLUMN dim_member_card_account_Ex.bind_password IS '卡绑定密码(未启用)。 | 来源: bind_password';
COMMENT ON COLUMN dim_member_card_account_Ex.use_scene IS '使用场景说明(当前为空)。 | 来源: use_scene';
COMMENT ON COLUMN dim_member_card_account_Ex.denomination IS '面额或初始储值额度(当前均为 0.0,未启用)。 | 来源: denomination';
COMMENT ON COLUMN dim_member_card_account_Ex.create_time IS '卡片创建时间。 | 来源: create_time';
COMMENT ON COLUMN dim_member_card_account_Ex.disable_start_time IS '卡片禁用开始时间,当前为默认值表示未禁用。 | 来源: disable_start_time';
COMMENT ON COLUMN dim_member_card_account_Ex.disable_end_time IS '卡片禁用结束时间,当前为默认值表示未禁用。 | 来源: disable_end_time';
COMMENT ON COLUMN dim_member_card_account_Ex.is_allow_give IS '是否允许转赠给他人0=不允许1=允许。 | 来源: is_allow_give';
COMMENT ON COLUMN dim_member_card_account_Ex.is_allow_order_deduct IS '是否允许在订单层面统一扣款0=不允许1=允许。 | 来源: is_allow_order_deduct';
COMMENT ON COLUMN dim_member_card_account_Ex.sort IS '前端排序序号。 | 来源: sort';
COMMENT ON COLUMN dim_member_card_account_Ex.table_discount IS '台费折扣率折扣百分比10.0=不打折9.0=九折等)。当前全部 10.0。 | 来源: table_discount';
COMMENT ON COLUMN dim_member_card_account_Ex.goods_discount IS '商品折扣率,当前为 10.0 表示无折扣。 | 来源: goods_discount';
COMMENT ON COLUMN dim_member_card_account_Ex.assistant_discount IS '助教服务折扣率,当前为 10.0。 | 来源: assistant_discount';
COMMENT ON COLUMN dim_member_card_account_Ex.assistant_reward_discount IS '助教奖励折扣率,当前为 10.0(未启用)。 | 来源: assistant_reward_discount';
COMMENT ON COLUMN dim_member_card_account_Ex.table_service_discount IS '台费服务类折扣率,当前为 10.0。 | 来源: table_service_discount';
COMMENT ON COLUMN dim_member_card_account_Ex.goods_service_discount IS '商品服务折扣率,当前为 10.0。 | 来源: goods_service_discount';
COMMENT ON COLUMN dim_member_card_account_Ex.assistant_service_discount IS '助教服务类折扣率,当前为 10.0。 | 来源: assistant_service_discount';
COMMENT ON COLUMN dim_member_card_account_Ex.coupon_discount IS '使用券的折扣比例(全部 10.0,未使用)。 | 来源: coupon_discount';
COMMENT ON COLUMN dim_member_card_account_Ex.table_discount_sub_switch IS '台费折扣叠加开关1=叠加其他折扣2=不叠加,仅用卡折扣。 | 来源: table_discount_sub_switch';
COMMENT ON COLUMN dim_member_card_account_Ex.goods_discount_sub_switch IS '商品折扣叠加开关,意义同上。 | 来源: goods_discount_sub_switch';
COMMENT ON COLUMN dim_member_card_account_Ex.assistant_discount_sub_switch IS '助教折扣叠加开关,意义同上。 | 来源: assistant_discount_sub_switch';
COMMENT ON COLUMN dim_member_card_account_Ex.assistant_reward_discount_sub_switch IS '助教奖励折扣叠加开关(未启用)。 | 来源: assistant_reward_discount_sub_switch';
COMMENT ON COLUMN dim_member_card_account_Ex.goods_discount_range_type IS '商品折扣范围类型,未在文档说明具体含义。 | 来源: goods_discount_range_type';
COMMENT ON COLUMN dim_member_card_account_Ex.table_deduct_radio IS '台费抵扣比例百分比。100.0 表示允许全额抵扣0=不允许。 | 来源: table_deduct_radio';
COMMENT ON COLUMN dim_member_card_account_Ex.goods_deduct_radio IS '商品抵扣比例,意义同上。 | 来源: goods_deduct_radio';
COMMENT ON COLUMN dim_member_card_account_Ex.assistant_deduct_radio IS '助教抵扣比例,意义同上。 | 来源: assistant_deduct_radio';
COMMENT ON COLUMN dim_member_card_account_Ex.table_service_deduct_radio IS '台费服务金抵扣比例。 | 来源: table_service_deduct_radio';
COMMENT ON COLUMN dim_member_card_account_Ex.goods_service_deduct_radio IS '商品服务金抵扣比例。 | 来源: goods_service_deduct_radio';
COMMENT ON COLUMN dim_member_card_account_Ex.assistant_service_deduct_radio IS '助教服务金抵扣比例。 | 来源: assistant_service_deduct_radio';
COMMENT ON COLUMN dim_member_card_account_Ex.assistant_reward_deduct_radio IS '助教奖励金抵扣比例(未启用)。 | 来源: assistant_reward_deduct_radio';
COMMENT ON COLUMN dim_member_card_account_Ex.coupon_deduct_radio IS '券抵扣比例(未启用)。 | 来源: coupon_deduct_radio';
COMMENT ON COLUMN dim_member_card_account_Ex.cardSettleDeduct IS '结算时统一扣卡金额配置(当前为 0.0,未使用)。 | 来源: cardSettleDeduct';
COMMENT ON COLUMN dim_member_card_account_Ex.tableCardDeduct IS '台费扣卡金额配置,当前 0.0。 | 来源: tableCardDeduct';
COMMENT ON COLUMN dim_member_card_account_Ex.tableServiceCardDeduct IS '台费服务金扣卡金额配置。 | 来源: tableServiceCardDeduct';
COMMENT ON COLUMN dim_member_card_account_Ex.goodsCarDeduct IS '商品扣卡金额配置。 | 来源: goodsCarDeduct';
COMMENT ON COLUMN dim_member_card_account_Ex.goodsServiceCardDeduct IS '商品服务金扣卡金额配置。 | 来源: goodsServiceCardDeduct';
COMMENT ON COLUMN dim_member_card_account_Ex.assistantCardDeduct IS '助教扣卡金额配置。 | 来源: assistantCardDeduct';
COMMENT ON COLUMN dim_member_card_account_Ex.assistantServiceCardDeduct IS '助教服务金扣卡金额配置。 | 来源: assistantServiceCardDeduct';
COMMENT ON COLUMN dim_member_card_account_Ex.assistantRewardCardDeduct IS '助教奖励金扣卡金额配置(未启用)。 | 来源: assistantRewardCardDeduct';
COMMENT ON COLUMN dim_member_card_account_Ex.couponCardDeduct IS '使用券扣卡金额配置。 | 来源: couponCardDeduct';
COMMENT ON COLUMN dim_member_card_account_Ex.deliveryFeeDeduct IS '配送费扣卡金额配置(未启用)。 | 来源: deliveryFeeDeduct';
COMMENT ON COLUMN dim_member_card_account_Ex.tableAreaId IS '可用台区 ID 列表,空表示不限台区。 | 来源: tableAreaId';
COMMENT ON COLUMN dim_member_card_account_Ex.goodsCategoryId IS '可用商品分类 ID 列表,空表示不限制商品类别。 | 来源: goodsCategoryId';
COMMENT ON COLUMN dim_member_card_account_Ex.pdAssisnatLevel IS '允许的陪打助教等级列表,空表示不限。 | 来源: pdAssisnatLevel';
COMMENT ON COLUMN dim_member_card_account_Ex.cxAssisnatLevel IS '允许的促销助教等级列表,空表示不限。 | 来源: cxAssisnatLevel';
-- dim_tenant_goods
CREATE TABLE IF NOT EXISTS dim_tenant_goods (
@@ -523,7 +523,7 @@ CREATE TABLE IF NOT EXISTS dim_store_goods (
goods_state INTEGER,
enable_status INTEGER,
send_state INTEGER,
is_deleted INTEGER,
is_delete INTEGER,
PRIMARY KEY (site_goods_id)
);
COMMENT ON COLUMN dim_store_goods.site_goods_id IS '门店级商品 ID本表主键其它业务表中的 site_goods_id 与此对应,用于库存、销售等关联。 | 来源: id | 角色: 主键';
@@ -545,7 +545,7 @@ COMMENT ON COLUMN dim_store_goods.avg_monthly_sales IS '平均月销量(件/
COMMENT ON COLUMN dim_store_goods.goods_state IS '商品基础状态枚举1=正常状态主流值2=特殊状态(如新建未完全启用或停售但未彻底下架,通常伴随 stock=0、days_on_shelf=0。 | 来源: goods_state';
COMMENT ON COLUMN dim_store_goods.enable_status IS '档案启用状态1=启用2=停用(推测,样本中未出现);控制商品档案是否参与业务处理。 | 来源: enable_status';
COMMENT ON COLUMN dim_store_goods.send_state IS '销售端可售状态1=可销售/可下单;其他值可能代表停售或仅内部使用(当前样本全部为 1。 | 来源: send_state';
COMMENT ON COLUMN dim_store_goods.is_deleted IS '逻辑删除标志0=未删除有效档案1=已删除(逻辑删除,不再参与业务但保留历史引用)。 | 来源: is_delete';
COMMENT ON COLUMN dim_store_goods.is_delete IS '逻辑删除标志0=未删除有效档案1=已删除(逻辑删除,不再参与业务但保留历史引用)。 | 来源: is_delete';
-- dim_store_goods_Ex
CREATE TABLE IF NOT EXISTS dim_store_goods_Ex (
@@ -633,35 +633,6 @@ COMMENT ON COLUMN dim_goods_category.open_salesman IS '营业员开关控制。
COMMENT ON COLUMN dim_goods_category.sort_order IS '分类排序序号。来自 sort 字段,用于前端展示顺序控制,数值越小越靠前。当前大部分分类为 0仅少数为 1说明排序配置较为粗略。对指标统计无实质影响。 | 来源: sort';
COMMENT ON COLUMN dim_goods_category.is_warehousing IS '是否参与库存管理。枚举1 表示参与库存管理0 表示不参与(如服务类商品、手工费用)。当前文件中所有分类取值为 1表示这一份分类树只包含“走库存”的商品分类。可在库存报表中用作过滤条件。 | 来源: is_warehousing';
-- dim_goods_category_Ex
CREATE TABLE IF NOT EXISTS dim_goods_category_Ex (
category_id BIGINT,
tenant_id BIGINT,
category_name VARCHAR(50),
alias_name VARCHAR(50),
parent_category_id BIGINT,
business_name VARCHAR(50),
tenant_goods_business_id BIGINT,
category_level INTEGER,
is_leaf INTEGER,
open_salesman INTEGER,
sort_order INTEGER,
is_warehousing INTEGER,
PRIMARY KEY (category_id)
);
COMMENT ON COLUMN dim_goods_category_Ex.category_id IS '分类节点主键。来自分类树节点的 id在整个商品分类维度内唯一。用于在事实表中作为商品分类外键引用。 | 来源: id | 角色: 主键';
COMMENT ON COLUMN dim_goods_category_Ex.tenant_id IS '租户 ID商户/品牌 ID。当前所有节点取值相同表示同一个租户下的分类树。事实表可通过该字段与租户维度或门店维度间接关联。 | 来源: tenant_id | 角色: 外键';
COMMENT ON COLUMN dim_goods_category_Ex.category_name IS '分类名称。一级大类示例:槟榔、器材、酒水、水果、零食、雪糕、香烟、其他、小吃。二级子类示例:槟榔、皮头、球杆、其他、饮料、酒水、茶水、咖啡、加料、洋酒、果盘、面、小吃等。用于前台展示和报表按细分类统计。 | 来源: category_name';
COMMENT ON COLUMN dim_goods_category_Ex.alias_name IS '分类别名。当前样例数据全部为空字符串,预留给业务方做简称或别名展示。对现阶段经营分析无影响。 | 来源: alias_name';
COMMENT ON COLUMN dim_goods_category_Ex.parent_category_id IS '父级分类 ID。根节点取值为 0表示没有父分类子节点取值为父分类的 id。与 category_id 共同形成树形层级关系。 | 来源: pid | 角色: 外键';
COMMENT ON COLUMN dim_goods_category_Ex.business_name IS '业务大类名称。将多个细分类归入同一业务线。观测值与一级大类相同:槟榔、器材、酒水、水果、零食、雪糕、香烟、其他、小吃。子类的 business_name 继承所属根节点的大类名称。用于按业务线汇总库存和销售。 | 来源: business_name';
COMMENT ON COLUMN dim_goods_category_Ex.tenant_goods_business_id IS '业务大类 ID。每个 business_name 对应唯一一个 tenant_goods_business_id根节点和其下所有子节点共享同一取值。例如“酒水”大类及其子类饮料、茶水、咖啡、加料、洋酒拥有相同的业务 ID。可作为外键连接“业务线维度表”。 | 来源: tenant_goods_business_id | 角色: 外键';
COMMENT ON COLUMN dim_goods_category_Ex.category_level IS '分类层级1 表示一级大类pid = 02 表示二级子类pid ≠ 0。方便在报表中区分大类与子类进行分组和展示层级控制。 | 来源: 由 pid 推导';
COMMENT ON COLUMN dim_goods_category_Ex.is_leaf IS '是否叶子节点1 表示叶子分类categoryBoxes 为空列表0 表示非叶子分类(存在子分类)。当前样例数据中,一级大类是非叶子节点,二级分类是叶子节点。用于树状导航或限制只能在叶子分类建商品。 | 来源: 由 categoryBoxes 推导';
COMMENT ON COLUMN dim_goods_category_Ex.open_salesman IS '营业员开关控制。枚举含义根据业务系统定义一般设计为1 表示启用营业员/导购相关功能2 表示关闭或不启用。当前样例所有分类取值为 2说明这一套分类在库存模块中统一未启用营业员逻辑。对目前的经营分析影响较小。 | 来源: open_salesman';
COMMENT ON COLUMN dim_goods_category_Ex.sort_order IS '分类排序序号。来自 sort 字段,用于前端展示顺序控制,数值越小越靠前。当前大部分分类为 0仅少数为 1说明排序配置较为粗略。对指标统计无实质影响。 | 来源: sort';
COMMENT ON COLUMN dim_goods_category_Ex.is_warehousing IS '是否参与库存管理。枚举1 表示参与库存管理0 表示不参与(如服务类商品、手工费用)。当前文件中所有分类取值为 1表示这一份分类树只包含“走库存”的商品分类。可在库存报表中用作过滤条件。 | 来源: is_warehousing';
-- dim_groupbuy_package
CREATE TABLE IF NOT EXISTS dim_groupbuy_package (
groupbuy_package_id BIGINT,
@@ -676,7 +647,7 @@ CREATE TABLE IF NOT EXISTS dim_groupbuy_package (
end_time TIMESTAMPTZ,
table_area_name VARCHAR(100),
is_enabled INTEGER,
is_deleted INTEGER,
is_delete INTEGER,
create_time TIMESTAMPTZ,
tenant_table_area_id_list VARCHAR(512),
card_type_ids VARCHAR(255),
@@ -694,7 +665,7 @@ COMMENT ON COLUMN dim_groupbuy_package.start_time IS '套餐整体生效开始
COMMENT ON COLUMN dim_groupbuy_package.end_time IS '套餐整体生效结束时间。在该时间点之后不可使用。极大日期(如 9999-12-31 23:59:59可视为长期有效。 | 来源: end_time';
COMMENT ON COLUMN dim_groupbuy_package.table_area_name IS '套餐适用的门店台区名称例如“A区中八”“B区中八”“斯诺克”“包厢”“KTV”等。主要用于展示和过滤配合区域 ID 列实现人类可读的说明。 | 来源: table_area_name';
COMMENT ON COLUMN dim_groupbuy_package.is_enabled IS '启用状态枚举。1 表示启用或上架2 表示停用或下架。侧重表示“配置是否上架”,与 effective_status 区分。 | 来源: is_enabled';
COMMENT ON COLUMN dim_groupbuy_package.is_deleted IS '逻辑删除标志。0 表示正常1 表示逻辑删除(数据仍保留但不再使用)。当前样本全部为 0。 | 来源: is_delete';
COMMENT ON COLUMN dim_groupbuy_package.is_delete IS '逻辑删除标志。0 表示正常1 表示逻辑删除(数据仍保留但不再使用)。当前样本全部为 0。 | 来源: is_delete';
COMMENT ON COLUMN dim_groupbuy_package.create_time IS '套餐配置在系统中的创建时间,用于审计和版本追踪。 | 来源: create_time';
COMMENT ON COLUMN dim_groupbuy_package.tenant_table_area_id_list IS '租户级台区分组 ID 列表。当前每条记录为一个大整数(例如 2791960001957765字符串表示“台区分组”主键。系统通过此分组再关联到具体多个台区。 | 来源: tenant_table_area_id_list | 角色: 外键(指向台区分组维,后续可建)';
COMMENT ON COLUMN dim_groupbuy_package.card_type_ids IS '允许使用本套餐的会员卡类型 ID 列表。当前样本统一为字符串“0”表示未限制卡种任意顾客或任意会员卡都可使用。若未来启用将以分隔的 ID 列表形式记录限定卡种。 | 来源: card_type_ids | 角色: 外键(潜在指向卡种维)';
@@ -1082,7 +1053,7 @@ CREATE TABLE IF NOT EXISTS dwd_store_goods_sale_Ex (
salesman_user_id BIGINT,
salesman_name TEXT,
salesman_role_id BIGINT,
sales_man_org_id BIGINT,
salesman_org_id BIGINT,
discount_money NUMERIC(18,2),
returns_number INTEGER,
coupon_deduct_money NUMERIC(18,2),
@@ -1111,7 +1082,7 @@ COMMENT ON COLUMN dwd_store_goods_sale_Ex.open_salesman_flag IS '是否启用营
COMMENT ON COLUMN dwd_store_goods_sale_Ex.salesman_user_id IS '营业员用户 ID系统账号 ID当前样本全部为 0说明门店未启用营业员业绩统计。 | 来源: salesman_user_id | 角色: 外键';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.salesman_name IS '营业员姓名;当前样本全部为空字符串。 | 来源: salesman_name';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.salesman_role_id IS '营业员角色 ID例如某角色代码对应“销售员”角色当前样本全部为 0。 | 来源: salesman_role_id | 角色: 外键';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.sales_man_org_id IS '营业员所属组织/部门 ID当前样本全部为 0未启用按组织分组统计。 | 来源: sales_man_org_id | 角色: 外键';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.salesman_org_id IS '营业员所属组织/部门 ID当前样本全部为 0未启用按组织分组统计。 | 来源: sales_man_org_id | 角色: 外键';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.discount_money IS '本行商品的直接价格优惠金额打折让利部分在简单场景下满足ledger_amount discount_money ≈ real_goods_money不含积分、券抵扣。 | 来源: discount_money';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.returns_number IS '退货数量;当前样本全部为 0如发生退货则记录退回的件数。 | 来源: returns_number';
COMMENT ON COLUMN dwd_store_goods_sale_Ex.coupon_deduct_money IS '优惠券/团购券直接抵扣到本条商品明细上的金额;当前样本为 0说明券更多在订单级处理。 | 来源: coupon_deduct_money';

View File

@@ -1,7 +1,7 @@
-- Data warehouse schema for the entertainment chain (ODS -> DWD -> DWS)
-- ASCII only to keep cross-platform friendly.
-- ---------- Schemas ----------
DROP SCHEMA IF EXISTS billiards_ods CASCADE;
CREATE SCHEMA IF NOT EXISTS billiards_ods;
CREATE SCHEMA IF NOT EXISTS billiards_dwd;
CREATE SCHEMA IF NOT EXISTS billiards_dws;
@@ -13,6 +13,9 @@ CREATE TABLE IF NOT EXISTS billiards_ods.ods_member_profile (
tenant_id BIGINT,
site_id BIGINT NOT NULL,
member_id BIGINT NOT NULL,
system_member_id BIGINT,
register_site_id BIGINT,
site_name TEXT,
member_name TEXT,
nickname TEXT,
mobile TEXT,
@@ -21,13 +24,17 @@ CREATE TABLE IF NOT EXISTS billiards_ods.ods_member_profile (
register_time TIMESTAMPTZ,
member_type_id BIGINT,
member_type_name TEXT,
member_card_grade_code TEXT,
status TEXT,
user_status TEXT,
balance NUMERIC(18,2),
points NUMERIC(18,2),
growth_value NUMERIC(18,2),
last_visit_time TIMESTAMPTZ,
wechat_id TEXT,
alipay_id TEXT,
member_card_no TEXT,
referrer_member_id BIGINT,
remarks TEXT,
source_file TEXT,
source_endpoint TEXT,
@@ -41,16 +48,28 @@ CREATE TABLE IF NOT EXISTS billiards_ods.ods_member_card (
site_id BIGINT NOT NULL,
card_id BIGINT NOT NULL,
member_id BIGINT,
tenant_member_id BIGINT,
card_type_id BIGINT,
card_type_name TEXT,
card_no TEXT,
card_physics_type TEXT,
card_balance NUMERIC(18,2),
denomination NUMERIC(18,2),
discount_rate NUMERIC(8,4),
table_discount NUMERIC(18,2),
goods_discount NUMERIC(18,2),
assistant_discount NUMERIC(18,2),
assistant_reward_discount NUMERIC(18,2),
valid_start_date DATE,
valid_end_date DATE,
disable_start_date DATE,
disable_end_date DATE,
last_consume_time TIMESTAMPTZ,
status TEXT,
is_delete BOOLEAN,
activate_time TIMESTAMPTZ,
deactivate_time TIMESTAMPTZ,
register_site_id BIGINT,
issuer_id BIGINT,
issuer_name TEXT,
source_file TEXT,
@@ -65,12 +84,20 @@ CREATE TABLE IF NOT EXISTS billiards_ods.ods_balance_change (
site_id BIGINT NOT NULL,
change_id BIGINT NOT NULL,
member_id BIGINT,
tenant_member_id BIGINT,
tenant_member_card_id BIGINT,
member_name TEXT,
member_mobile TEXT,
change_amount NUMERIC(18,2),
balance_before NUMERIC(18,2),
balance_after NUMERIC(18,2),
change_type INT,
payment_method INT,
refund_amount NUMERIC(18,2),
relate_id BIGINT,
pay_method INT,
register_site_id BIGINT,
register_site_name TEXT,
pay_site_name TEXT,
remark TEXT,
operator_id BIGINT,
operator_name TEXT,
@@ -112,8 +139,16 @@ CREATE TABLE IF NOT EXISTS billiards_ods.ods_product (
goods_code TEXT,
category_id BIGINT,
category_name TEXT,
goods_second_category_id BIGINT,
unit TEXT,
price NUMERIC(18,2),
cost_price NUMERIC(18,2),
market_price NUMERIC(18,2),
goods_state TEXT,
goods_cover TEXT,
goods_bar_code TEXT,
able_discount BOOLEAN,
is_delete BOOLEAN,
status TEXT,
source_file TEXT,
source_endpoint TEXT,
@@ -130,8 +165,16 @@ CREATE TABLE IF NOT EXISTS billiards_ods.ods_store_product (
goods_name TEXT,
category_id BIGINT,
category_name TEXT,
unit TEXT,
sale_price NUMERIC(18,2),
cost_price NUMERIC(18,2),
sale_num NUMERIC(18,2),
stock_a NUMERIC(18,2),
stock NUMERIC(18,2),
provisional_total_cost NUMERIC(18,2),
total_purchase_cost NUMERIC(18,2),
batch_stock_quantity NUMERIC(18,2),
goods_state TEXT,
status TEXT,
source_file TEXT,
source_endpoint TEXT,
@@ -144,17 +187,32 @@ CREATE TABLE IF NOT EXISTS billiards_ods.ods_store_sale_item (
tenant_id BIGINT,
site_id BIGINT NOT NULL,
sale_item_id BIGINT NOT NULL,
order_goods_id BIGINT,
order_trade_no TEXT,
order_settle_id BIGINT,
site_goods_id BIGINT,
goods_id BIGINT,
goods_name TEXT,
category_id BIGINT,
quantity NUMERIC(18,4),
unit_price NUMERIC(18,2),
original_amount NUMERIC(18,2),
discount_amount NUMERIC(18,2),
final_amount NUMERIC(18,2),
is_gift BOOLEAN DEFAULT FALSE,
sale_time TIMESTAMPTZ,
member_id BIGINT,
salesman_id BIGINT,
operator_id BIGINT,
is_refunded BOOLEAN DEFAULT FALSE,
discount_price NUMERIC(18,2),
cost_money NUMERIC(18,2),
coupon_deduct_amount NUMERIC(18,2),
member_discount_amount NUMERIC(18,2),
point_discount_money NUMERIC(18,2),
point_discount_cost NUMERIC(18,2),
sales_type TEXT,
goods_remark TEXT,
source_file TEXT,
source_endpoint TEXT,
fetched_at TIMESTAMPTZ DEFAULT now(),
@@ -170,6 +228,18 @@ CREATE TABLE IF NOT EXISTS billiards_ods.ods_table_info (
table_name TEXT,
table_type TEXT,
area_name TEXT,
site_table_area_id BIGINT,
tenant_table_area_id BIGINT,
table_price NUMERIC(18,2),
table_status TEXT,
audit_status INT,
show_status INT,
light_status INT,
virtual_table BOOLEAN,
is_rest_area BOOLEAN,
charge_free BOOLEAN,
table_cloth_use_time INT,
table_cloth_use_cycle INT,
status TEXT,
created_time TIMESTAMPTZ,
updated_time TIMESTAMPTZ,
@@ -185,15 +255,42 @@ CREATE TABLE IF NOT EXISTS billiards_ods.ods_table_use_log (
site_id BIGINT NOT NULL,
ledger_id BIGINT NOT NULL,
table_id BIGINT,
table_name TEXT,
order_trade_no TEXT,
order_settle_id BIGINT,
start_time TIMESTAMPTZ,
end_time TIMESTAMPTZ,
duration_minutes INT,
duration_seconds INT,
billing_unit_price NUMERIC(18,4),
billing_count NUMERIC(18,4),
original_table_fee NUMERIC(18,2),
discount_amount NUMERIC(18,2),
member_discount_amount NUMERIC(18,2),
coupon_discount_amount NUMERIC(18,2),
manual_discount_amount NUMERIC(18,2),
service_fee NUMERIC(18,2),
final_table_fee NUMERIC(18,2),
member_id BIGINT,
operator_id BIGINT,
salesman_id BIGINT,
is_canceled BOOLEAN DEFAULT FALSE,
cancel_time TIMESTAMPTZ,
site_table_area_id BIGINT,
tenant_table_area_id BIGINT,
site_table_area_name TEXT,
is_single_order BOOLEAN,
used_card_amount NUMERIC(18,2),
adjust_amount NUMERIC(18,2),
coupon_promotion_amount NUMERIC(18,2),
service_money NUMERIC(18,2),
mgmt_fee NUMERIC(18,2),
fee_total NUMERIC(18,2),
real_table_use_seconds INT,
last_use_time TIMESTAMPTZ,
ledger_start_time TIMESTAMPTZ,
ledger_end_time TIMESTAMPTZ,
ledger_status INT,
start_use_time TIMESTAMPTZ,
add_clock_seconds INT,
status TEXT,
source_file TEXT,
source_endpoint TEXT,
@@ -226,8 +323,16 @@ CREATE TABLE IF NOT EXISTS billiards_ods.ods_assistant_account (
assistant_id BIGINT NOT NULL,
assistant_name TEXT,
mobile TEXT,
assistant_no INT,
team_id BIGINT,
team_name TEXT,
group_id BIGINT,
group_name TEXT,
job_num TEXT,
entry_type TEXT,
leave_status TEXT,
assistant_status TEXT,
allow_cx BOOLEAN,
status TEXT,
hired_date DATE,
left_date DATE,
@@ -243,16 +348,27 @@ CREATE TABLE IF NOT EXISTS billiards_ods.ods_assistant_service_log (
site_id BIGINT NOT NULL,
ledger_id BIGINT NOT NULL,
assistant_id BIGINT,
assistant_name TEXT,
service_type TEXT,
order_trade_no TEXT,
order_settle_id BIGINT,
start_time TIMESTAMPTZ,
end_time TIMESTAMPTZ,
duration_minutes INT,
duration_seconds INT,
original_fee NUMERIC(18,2),
discount_amount NUMERIC(18,2),
member_discount_amount NUMERIC(18,2),
manual_discount_amount NUMERIC(18,2),
coupon_discount_amount NUMERIC(18,2),
final_fee NUMERIC(18,2),
member_id BIGINT,
operator_id BIGINT,
salesman_id BIGINT,
is_canceled BOOLEAN DEFAULT FALSE,
cancel_time TIMESTAMPTZ,
skill_grade NUMERIC(10,2),
service_grade NUMERIC(10,2),
composite_grade NUMERIC(10,2),
overall_score NUMERIC(10,2),
status TEXT,
source_file TEXT,
source_endpoint TEXT,
@@ -268,6 +384,13 @@ CREATE TABLE IF NOT EXISTS billiards_ods.ods_assistant_cancel_log (
ledger_id BIGINT,
assistant_id BIGINT,
order_trade_no TEXT,
table_id BIGINT,
table_area_id BIGINT,
table_area_name TEXT,
table_name TEXT,
assistant_on INT,
pd_charge_minutes INT,
assistant_abolish_amount NUMERIC(18,2),
reason TEXT,
cancel_time TIMESTAMPTZ,
operator_id BIGINT,
@@ -284,12 +407,24 @@ CREATE TABLE IF NOT EXISTS billiards_ods.ods_group_package (
site_id BIGINT NOT NULL,
package_id BIGINT NOT NULL,
package_name TEXT,
table_area_id BIGINT,
table_area_name TEXT,
platform_code TEXT,
status TEXT,
face_price NUMERIC(18,2),
settle_price NUMERIC(18,2),
selling_price NUMERIC(18,2),
duration INT,
valid_from DATE,
valid_to DATE,
start_time TIMESTAMPTZ,
end_time TIMESTAMPTZ,
is_enabled BOOLEAN,
is_delete BOOLEAN,
package_type TEXT,
usable_count INT,
creator_name TEXT,
tenant_table_area_id BIGINT,
source_file TEXT,
source_endpoint TEXT,
fetched_at TIMESTAMPTZ DEFAULT now(),
@@ -310,6 +445,7 @@ CREATE TABLE IF NOT EXISTS billiards_ods.ods_group_package_log (
used_time TIMESTAMPTZ,
deduct_amount NUMERIC(18,2),
settle_price NUMERIC(18,2),
coupon_code TEXT,
source_file TEXT,
source_endpoint TEXT,
fetched_at TIMESTAMPTZ DEFAULT now(),
@@ -323,6 +459,8 @@ CREATE TABLE IF NOT EXISTS billiards_ods.ods_platform_coupon_log (
coupon_id BIGINT NOT NULL,
platform_code TEXT,
verify_code TEXT,
coupon_code TEXT,
coupon_channel TEXT,
order_trade_no TEXT,
order_settle_id BIGINT,
member_id BIGINT,
@@ -330,6 +468,7 @@ CREATE TABLE IF NOT EXISTS billiards_ods.ods_platform_coupon_log (
used_time TIMESTAMPTZ,
deduct_amount NUMERIC(18,2),
settle_price NUMERIC(18,2),
coupon_money NUMERIC(18,2),
source_file TEXT,
source_endpoint TEXT,
fetched_at TIMESTAMPTZ DEFAULT now(),
@@ -343,11 +482,19 @@ CREATE TABLE IF NOT EXISTS billiards_ods.ods_inventory_change (
change_id BIGINT NOT NULL,
site_goods_id BIGINT,
goods_id BIGINT,
stock_type TEXT,
change_amount NUMERIC(18,2),
before_stock NUMERIC(18,2),
after_stock NUMERIC(18,2),
change_amount_alt NUMERIC(18,2),
before_stock_alt NUMERIC(18,2),
after_stock_alt NUMERIC(18,2),
change_type TEXT,
relate_id BIGINT,
unit TEXT,
price NUMERIC(18,2),
goods_category_id BIGINT,
goods_second_category_id BIGINT,
remark TEXT,
operator_id BIGINT,
operator_name TEXT,
@@ -364,8 +511,20 @@ CREATE TABLE IF NOT EXISTS billiards_ods.ods_inventory_stock (
site_id BIGINT NOT NULL,
site_goods_id BIGINT NOT NULL,
goods_id BIGINT,
goods_name TEXT,
goods_unit TEXT,
goods_category_id BIGINT,
goods_second_category_id BIGINT,
range_start_stock NUMERIC(18,2),
range_end_stock NUMERIC(18,2),
range_in NUMERIC(18,2),
range_out NUMERIC(18,2),
range_inventory NUMERIC(18,2),
range_sale NUMERIC(18,2),
range_sale_money NUMERIC(18,2),
current_stock NUMERIC(18,2),
cost_price NUMERIC(18,2),
category_name TEXT,
snapshot_key TEXT NOT NULL DEFAULT 'default',
source_file TEXT,
source_endpoint TEXT,
@@ -383,6 +542,7 @@ CREATE TABLE IF NOT EXISTS billiards_ods.ods_order_settle (
settle_type INT,
settle_status INT,
member_id BIGINT,
member_name TEXT,
member_phone TEXT,
table_id BIGINT,
consume_money NUMERIC(18,2),
@@ -392,6 +552,9 @@ CREATE TABLE IF NOT EXISTS billiards_ods.ods_order_settle (
assistant_pd_money NUMERIC(18,2),
assistant_cx_money NUMERIC(18,2),
pay_amount NUMERIC(18,2),
cash_amount NUMERIC(18,2),
online_amount NUMERIC(18,2),
point_amount NUMERIC(18,2),
coupon_amount NUMERIC(18,2),
card_amount NUMERIC(18,2),
balance_amount NUMERIC(18,2),
@@ -399,9 +562,33 @@ CREATE TABLE IF NOT EXISTS billiards_ods.ods_order_settle (
prepay_money NUMERIC(18,2),
adjust_amount NUMERIC(18,2),
rounding_amount NUMERIC(18,2),
member_discount_amount NUMERIC(18,2),
coupon_sale_amount NUMERIC(18,2),
goods_promotion_money NUMERIC(18,2),
assistant_promotion_money NUMERIC(18,2),
point_discount_price NUMERIC(18,2),
point_discount_cost NUMERIC(18,2),
real_goods_money NUMERIC(18,2),
assistant_manual_discount NUMERIC(18,2),
all_coupon_discount NUMERIC(18,2),
is_use_coupon BOOLEAN,
is_use_discount BOOLEAN,
is_activity BOOLEAN,
is_bind_member BOOLEAN,
is_first BOOLEAN,
recharge_card_amount NUMERIC(18,2),
gift_card_amount NUMERIC(18,2),
payment_method INT,
create_time TIMESTAMPTZ,
pay_time TIMESTAMPTZ,
revoke_order_id BIGINT,
revoke_order_name TEXT,
revoke_time TIMESTAMPTZ,
can_be_revoked BOOLEAN,
serial_number TEXT,
sales_man_name TEXT,
sales_man_user_id BIGINT,
order_remark TEXT,
operator_id BIGINT,
operator_name TEXT,
source_file TEXT,
@@ -436,8 +623,13 @@ CREATE TABLE IF NOT EXISTS billiards_ods.ods_payment_record (
member_id BIGINT,
pay_method_code TEXT,
pay_method_name TEXT,
pay_status INT,
pay_amount NUMERIC(18,2),
pay_time TIMESTAMPTZ,
online_pay_channel TEXT,
transaction_id TEXT,
operator_id BIGINT,
remark TEXT,
relate_type TEXT,
relate_id BIGINT,
source_file TEXT,
@@ -454,10 +646,34 @@ CREATE TABLE IF NOT EXISTS billiards_ods.ods_refund_record (
order_trade_no TEXT,
order_settle_id BIGINT,
member_id BIGINT,
pay_sn TEXT,
pay_amount NUMERIC(18,2),
pay_status INT,
is_revoke BOOLEAN,
is_delete BOOLEAN,
online_pay_channel TEXT,
pay_method_code TEXT,
refund_amount NUMERIC(18,2),
refund_time TIMESTAMPTZ,
action_type INT,
pay_terminal INT,
pay_config_id BIGINT,
cashier_point_id BIGINT,
operator_id BIGINT,
member_card_id BIGINT,
balance_frozen_amount NUMERIC(18,2),
card_frozen_amount NUMERIC(18,2),
round_amount NUMERIC(18,2),
online_pay_type INT,
channel_payer_id TEXT,
channel_pay_no TEXT,
check_status INT,
channel_fee NUMERIC(18,2),
relate_type TEXT,
relate_id BIGINT,
status TEXT,
reason TEXT,
related_payment_id BIGINT,
source_file TEXT,
source_endpoint TEXT,
fetched_at TIMESTAMPTZ DEFAULT now(),
@@ -470,13 +686,36 @@ CREATE TABLE IF NOT EXISTS billiards_ods.ods_order_receipt_detail (
site_id BIGINT NOT NULL,
order_settle_id BIGINT NOT NULL,
order_trade_no TEXT,
order_settle_number TEXT,
settle_type INT,
receipt_no TEXT,
receipt_time TIMESTAMPTZ,
total_amount NUMERIC(18,2),
discount_amount NUMERIC(18,2),
final_amount NUMERIC(18,2),
actual_payment NUMERIC(18,2),
ledger_amount NUMERIC(18,2),
member_offer_amount NUMERIC(18,2),
delivery_fee NUMERIC(18,2),
adjust_amount NUMERIC(18,2),
payment_method INT,
pay_time TIMESTAMPTZ,
member_id BIGINT,
order_remark TEXT,
cashier_name TEXT,
ticket_remark TEXT,
ticket_custom_content TEXT,
voucher_money NUMERIC(18,2),
reward_name TEXT,
consume_money NUMERIC(18,2),
refund_amount NUMERIC(18,2),
balance_amount NUMERIC(18,2),
coupon_amount NUMERIC(18,2),
member_deduct_amount NUMERIC(18,2),
prepay_money NUMERIC(18,2),
delivery_address TEXT,
snapshot_raw JSONB,
member_snapshot JSONB,
source_file TEXT,
source_endpoint TEXT,
fetched_at TIMESTAMPTZ DEFAULT now(),

View File

@@ -0,0 +1,39 @@
-- 将新的 ODS 任务注册到 etl_admin.etl_task根据需要替换 store_id
-- 使用方式(示例):
-- psql "$PG_DSN" -f etl_billiards/database/seed_ods_tasks.sql
-- 或者在 psql 中执行本文件内容。
WITH target_store AS (
SELECT 2790685415443269::bigint AS store_id -- TODO: 替换为实际 store_id
),
task_codes AS (
SELECT unnest(ARRAY[
'ODS_ASSISTANT_ACCOUNTS',
'ODS_ASSISTANT_LEDGER',
'ODS_ASSISTANT_ABOLISH',
'ODS_INVENTORY_CHANGE',
'ODS_INVENTORY_STOCK',
'ODS_PACKAGE',
'ODS_GROUP_BUY_REDEMPTION',
'ODS_MEMBER',
'ODS_MEMBER_BALANCE',
'ODS_MEMBER_CARD',
'ODS_PAYMENT',
'ODS_REFUND',
'ODS_COUPON_VERIFY',
'ODS_RECHARGE_SETTLE',
'ODS_TABLES',
'ODS_GOODS_CATEGORY',
'ODS_STORE_GOODS',
'ODS_TABLE_DISCOUNT',
'ODS_TENANT_GOODS',
'ODS_SETTLEMENT_TICKET',
'ODS_ORDER_SETTLE'
]) AS task_code
)
INSERT INTO etl_admin.etl_task (task_code, store_id, enabled)
SELECT t.task_code, s.store_id, TRUE
FROM task_codes t CROSS JOIN target_store s
ON CONFLICT (task_code, store_id) DO UPDATE
SET enabled = EXCLUDED.enabled;