from enum import Enum from sqlalchemy import Boolean, ForeignKey, Integer, JSON, String, DateTime from sqlalchemy.orm import Mapped, mapped_column, relationship from datetime import datetime from app.models.base import BaseModel class UserRole(str, Enum): """用户角色""" ADMIN = "管理员" FINANCE_MANAGER = "财务主管" ACCOUNTANT = "会计" CASHIER = "出纳" HR = "人事" class UserStatus(str, Enum): """用户状态""" ACTIVE = "正常" DISABLED = "禁用" LOCKED = "锁定" class User(BaseModel): """ 用户模型 Attributes: company_id: 企业ID email: 邮箱(登录账号) hashed_password: 加密后的密码 full_name: 姓名 role: 角色 permissions: 权限列表(JSONB) status: 状态 last_login_at: 最后登录时间 """ __tablename__ = "users" company_id: Mapped[int] = mapped_column(Integer, ForeignKey("companies.id"), nullable=False, index=True) email: Mapped[str] = mapped_column(String(255), nullable=False, unique=True, index=True) hashed_password: Mapped[str] = mapped_column(String(255), nullable=False) full_name: Mapped[str] = mapped_column(String(100), nullable=False) role: Mapped[str] = mapped_column(String(50), nullable=False, default=UserRole.ACCOUNTANT.value) permissions: Mapped[dict | None] = mapped_column(JSON, nullable=True) status: Mapped[str] = mapped_column(String(20), nullable=False, default=UserStatus.ACTIVE.value, index=True) last_login_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) # 关系 company = relationship("Company", back_populates="users") def __repr__(self) -> str: return f"" def has_permission(self, permission: str) -> bool: """检查用户是否有指定权限""" if not self.permissions: return False return permission in self.permissions.get("permissions", [])