# purchase - 认购群模型 # Version: 0.0.3 (2026-05-02) # 认购群、成员、藏品管理 from sqlalchemy import Column, String, Text, Integer, DECIMAL, DateTime, ForeignKey, Boolean 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) group_code = Column(String(20), nullable=False, unique=True) # 年+序号,如 26001 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) # 创建者名字 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) # 审批时间 total_members = Column(Integer, default=0) # 总参与人数 total_pending = Column(Integer, default=0) # 待审批人数 total_collections = Column(Integer, default=0) # 总藏品数 total_confirmed = Column(Integer, default=0) # 已确认数 total_amount = Column(DECIMAL(12,2), default=0) # 总金额 cycle_months = Column(Integer, nullable=True) # 认购周期(月) start_date = Column(DateTime(timezone=True), nullable=True) # 开始日期 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 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) # 备注 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) # 藏品名称 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()) # 提交日期 status = Column(String(20), default="pending") # pending/confirmed submitted_at = Column(DateTime(timezone=True), server_default=func.now())