2026-04-26 21:13:00 +08:00
|
|
|
# purchase - 认购群模型
|
2026-05-02 13:50:21 +08:00
|
|
|
# Version: 0.0.3 (2026-05-02)
|
2026-04-26 21:13:00 +08:00
|
|
|
# 认购群、成员、藏品管理
|
|
|
|
|
|
2026-04-29 20:48:41 +08:00
|
|
|
from sqlalchemy import Column, String, Text, Integer, DECIMAL, DateTime, ForeignKey, Boolean
|
2026-04-26 21:13:00 +08:00
|
|
|
from sqlalchemy.sql import func
|
|
|
|
|
from app.core.database import Base
|
|
|
|
|
import uuid
|
|
|
|
|
|
|
|
|
|
def generate_uuid():
|
|
|
|
|
return str(uuid.uuid4())
|
|
|
|
|
|
|
|
|
|
class PurchaseGroup(Base):
|
|
|
|
|
"""认购群表"""
|
|
|
|
|
__tablename__ = "purchase_group"
|
|
|
|
|
|
|
|
|
|
id = Column(String(36), primary_key=True, default=generate_uuid)
|
2026-04-29 20:48:41 +08:00
|
|
|
group_code = Column(String(20), nullable=False, unique=True) # 年+序号,如 26001
|
2026-04-26 21:13:00 +08:00
|
|
|
name = Column(String(100), nullable=False) # 认购群名称
|
|
|
|
|
description = Column(Text, nullable=True) # 描述
|
|
|
|
|
creator_id = Column(String(36), nullable=False) # 创建者ID
|
|
|
|
|
creator_name = Column(String(50), nullable=True) # 创建者名字
|
2026-05-02 13:50:21 +08:00
|
|
|
status = Column(String(20), default="pending") # pending/active/closed
|
|
|
|
|
approved_by = Column(String(36), nullable=True) # 审批管理员ID
|
|
|
|
|
approved_at = Column(DateTime(timezone=True), nullable=True) # 审批时间
|
2026-04-26 21:13:00 +08:00
|
|
|
total_members = Column(Integer, default=0) # 总参与人数
|
2026-04-29 20:48:41 +08:00
|
|
|
total_pending = Column(Integer, default=0) # 待审批人数
|
2026-04-26 21:13:00 +08:00
|
|
|
total_collections = Column(Integer, default=0) # 总藏品数
|
2026-04-29 20:48:41 +08:00
|
|
|
total_confirmed = Column(Integer, default=0) # 已确认数
|
2026-04-26 21:13:00 +08:00
|
|
|
total_amount = Column(DECIMAL(12,2), default=0) # 总金额
|
2026-04-29 20:48:41 +08:00
|
|
|
cycle_months = Column(Integer, nullable=True) # 认购周期(月)
|
|
|
|
|
start_date = Column(DateTime(timezone=True), nullable=True) # 开始日期
|
2026-04-26 21:13:00 +08:00
|
|
|
avg_price = Column(DECIMAL(10,2), default=0) # 均价
|
|
|
|
|
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
|
|
|
|
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
|
|
|
|
|
|
|
|
|
|
class PurchaseMember(Base):
|
|
|
|
|
"""认购成员表"""
|
|
|
|
|
__tablename__ = "purchase_member"
|
|
|
|
|
|
|
|
|
|
id = Column(String(36), primary_key=True, default=generate_uuid)
|
|
|
|
|
group_id = Column(String(36), ForeignKey("purchase_group.id"), nullable=False)
|
|
|
|
|
user_id = Column(String(36), nullable=False)
|
|
|
|
|
user_name = Column(String(50), nullable=True)
|
|
|
|
|
user_avatar = Column(String(255), nullable=True)
|
|
|
|
|
role = Column(String(20), default="member") # creator/admin/member
|
2026-04-29 20:48:41 +08:00
|
|
|
status = Column(String(20), default="pending") # pending/approved/rejected
|
|
|
|
|
# 成员扩展信息
|
|
|
|
|
wechat_name = Column(String(50), nullable=True) # 微信名
|
|
|
|
|
contact = Column(String(50), nullable=True) # 联系方式
|
|
|
|
|
purchase_count = Column(Integer, default=0) # 认购数量
|
|
|
|
|
paid_amount = Column(DECIMAL(12,2), default=0) # 已付认购款
|
|
|
|
|
notes = Column(Text, nullable=True) # 备注
|
2026-04-26 21:13:00 +08:00
|
|
|
joined_at = Column(DateTime(timezone=True), server_default=func.now())
|
|
|
|
|
|
|
|
|
|
class PurchaseCollection(Base):
|
|
|
|
|
"""认购藏品表"""
|
|
|
|
|
__tablename__ = "purchase_collection"
|
|
|
|
|
|
|
|
|
|
id = Column(String(36), primary_key=True, default=generate_uuid)
|
|
|
|
|
group_id = Column(String(36), ForeignKey("purchase_group.id"), nullable=False)
|
|
|
|
|
user_id = Column(String(36), nullable=False)
|
|
|
|
|
user_name = Column(String(50), nullable=True)
|
|
|
|
|
collection_name = Column(String(100), nullable=True) # 藏品名称
|
2026-04-29 20:48:41 +08:00
|
|
|
collection_code = Column(String(50), nullable=True) # 藏品编号 (自动生成001开始)
|
|
|
|
|
number = Column(String(50), nullable=False) # 冠字号 (必填)
|
|
|
|
|
grading = Column(String(50), nullable=False) # 评级 (必填)
|
|
|
|
|
boss_name = Column(String(50), nullable=False) # 认购老板 (必填,从成员中选择)
|
|
|
|
|
price = Column(DECIMAL(10,2), nullable=False) # 认购价格 (必填)
|
|
|
|
|
source = Column(String(20), nullable=False) # 来源: yichen/live/friend/other (必填)
|
|
|
|
|
paid = Column(Boolean, default=False) # 认购款是否结清
|
|
|
|
|
submit_date = Column(DateTime(timezone=True), server_default=func.now()) # 提交日期
|
2026-04-26 21:13:00 +08:00
|
|
|
status = Column(String(20), default="pending") # pending/confirmed
|
|
|
|
|
submitted_at = Column(DateTime(timezone=True), server_default=func.now())
|