File size: 4,823 Bytes
1ef9436
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@File    :   streamer_room_model.py
@Time    :   2024/08/31
@Project :   https://github.com/PeterH0323/Streamer-Sales
@Author  :   HinGwenWong
@Version :   1.0
@Desc    :   直播间信息数据结构定义
"""

from datetime import datetime
from typing import Optional

from pydantic import BaseModel
from sqlmodel import Field, Relationship, SQLModel

from ..models.user_model import UserInfo
from ..models.product_model import ProductInfo
from ..models.streamer_info_model import StreamerInfo


class RoomChatItem(BaseModel):
    roomId: int
    message: str = ""
    asrFileUrl: str = ""


# =======================================================
#                      直播间数据库模型
# =======================================================


class SalesDocAndVideoInfo(SQLModel, table=True):
    """直播间 文案 和 数字人介绍视频数据结构"""

    __tablename__ = "sales_doc_and_video_info"

    sales_info_id: int | None = Field(default=None, primary_key=True, unique=True)

    sales_doc: str = ""  # 讲解文案
    start_video: str = ""  # 开播时候第一个讲解视频
    start_time: datetime | None = None  # 当前商品开始时间
    selected: bool = True

    product_id: int | None = Field(default=None, foreign_key="product_info.product_id")
    product_info: ProductInfo | None = Relationship(back_populates="sales_info", sa_relationship_kwargs={"lazy": "selectin"})

    room_id: int | None = Field(default=None, foreign_key="stream_room_info.room_id")
    stream_room: Optional["StreamRoomInfo"] | None = Relationship(back_populates="product_list")


class OnAirRoomStatusItem(SQLModel, table=True):
    """直播间状态信息"""

    __tablename__ = "on_air_room_status_item"

    status_id: int | None = Field(default=None, primary_key=True, unique=True)  # 直播间 ID

    sales_info_id: int | None = Field(default=None, foreign_key="sales_doc_and_video_info.sales_info_id")

    current_product_index: int = 0  # 目前讲解的商品列表索引
    streaming_video_path: str = ""  # 目前介绍使用的视频

    live_status: int = 0  # 直播间状态 0 未开播,1 正在直播,2 下播了
    start_time: datetime | None = None  # 直播开始时间
    end_time: datetime | None = None  # 直播下播时间

    room_info: Optional["StreamRoomInfo"] | None = Relationship(
        back_populates="status", sa_relationship_kwargs={"lazy": "selectin"}
    )

    """直播间信息,数据库保存时的数据结构"""


class StreamRoomInfo(SQLModel, table=True):

    __tablename__ = "stream_room_info"

    room_id: int | None = Field(default=None, primary_key=True, unique=True)  # 直播间 ID

    name: str = ""  # 直播间名字

    product_list: list[SalesDocAndVideoInfo] = Relationship(
        back_populates="stream_room",
        sa_relationship_kwargs={"lazy": "selectin", "order_by": "asc(SalesDocAndVideoInfo.product_id)"},
    )  # 商品列表,查找的时候加上 order_by 自动排序,desc -> 降序; asc -> 升序

    prohibited_words_id: int = 0  # 违禁词表 ID
    room_poster: str = ""  # 海报图
    background_image: str = ""  # 主播背景图

    delete: bool = False  # 是否删除

    status_id: int | None = Field(default=None, foreign_key="on_air_room_status_item.status_id")
    status: OnAirRoomStatusItem | None = Relationship(back_populates="room_info", sa_relationship_kwargs={"lazy": "selectin"})

    streamer_id: int | None = Field(default=None, foreign_key="streamer_info.streamer_id")  # 主播 ID
    streamer_info: StreamerInfo | None = Relationship(back_populates="room_info", sa_relationship_kwargs={"lazy": "selectin"})

    user_id: int | None = Field(default=None, foreign_key="user_info.user_id")


# =======================================================
#                    直播对话数据库模型
# =======================================================


class ChatMessageInfo(SQLModel, table=True):
    """直播页面对话数据结构"""

    __tablename__ = "chat_message_info"

    message_id: int | None = Field(default=None, primary_key=True, unique=True)  # 消息 ID

    sales_info_id: int | None = Field(default=None, foreign_key="sales_doc_and_video_info.sales_info_id")
    sales_info: SalesDocAndVideoInfo | None = Relationship(sa_relationship_kwargs={"lazy": "selectin"})

    user_id: int | None = Field(default=None, foreign_key="user_info.user_id")
    user_info: UserInfo | None = Relationship(sa_relationship_kwargs={"lazy": "selectin"})

    streamer_id: int | None = Field(default=None, foreign_key="streamer_info.streamer_id")
    streamer_info: StreamerInfo | None = Relationship(sa_relationship_kwargs={"lazy": "selectin"})

    role: str
    message: str
    send_time: datetime | None = None