1092 lines
53 KiB
Python
1092 lines
53 KiB
Python
from tools import *
|
||
from AppBridge import *
|
||
from Utils.Object import *
|
||
|
||
Timezone_UTCA8 = Timezone_CN = datetime.timezone(datetime.timedelta(hours=8))
|
||
|
||
|
||
# ==============================================================================
|
||
# 用户-角色 双键映射表(你要的方式)
|
||
# ==============================================================================
|
||
class UserRole(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "UserRole"
|
||
|
||
UserRoleUUID = db.Column(db.BINARY(16), primary_key=True, nullable=False)
|
||
UserUUID = db.Column(db.BINARY(16), db.ForeignKey("User.UserUUID"), nullable=False)
|
||
RoleUUID = db.Column(db.BINARY(16), db.ForeignKey("Role.RoleUUID"), nullable=False)
|
||
CreateTime = db.Column(db.DateTime, default=lambda: datetime.datetime.utcnow())
|
||
|
||
|
||
# ==============================================================================
|
||
# 1. 用户
|
||
# ==============================================================================
|
||
class GERPUser(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "User"
|
||
|
||
UserUUID = db.Column(db.BINARY(16), primary_key=True, nullable=False)
|
||
UserName = db.Column(db.String(256), nullable=False, unique=True)
|
||
UserPassword = db.Column(db.String(60), nullable=False, default="$2b$12$f4aPWFkTnL60G28TANMEHef7d3Qzp2/AycY0gVK30ufgRrahwygEGS")
|
||
UserPositionStatus = db.Column(db.SmallInteger, nullable=False, default=0)
|
||
UserPersonalSignature = db.Column(db.String(1024), nullable=False, default="尚未及提笔自叙,浅墨先勾鹤影")
|
||
UserEmail = db.Column(db.String(256), nullable=False)
|
||
UserEmailVerify = db.Column(db.SmallInteger, nullable=False, default=0)
|
||
UserAccountLicense = db.Column(db.SmallInteger, nullable=False, default=1)
|
||
UserGender = db.Column(db.SmallInteger, nullable=False, default=-1)
|
||
UserTele = db.Column(db.String(16), nullable=True)
|
||
UserCreateTime = db.Column(db.DateTime, nullable=False, default=lambda: datetime.datetime.utcnow())
|
||
UserLastLoginDate = db.Column(db.DateTime, default=lambda: datetime.datetime.utcnow())
|
||
|
||
Avatar = db.relationship("GERPUserAvatar", backref="User", lazy="select", uselist=False, cascade="all, delete-orphan")
|
||
Tokens = db.relationship("GERPUserELT", backref="User", lazy="dynamic", cascade="all, delete-orphan")
|
||
UserRoles = db.relationship("UserRole", backref="user", lazy="dynamic", cascade="all, delete-orphan")
|
||
LoginLogs = db.relationship("GERPUserLoginLog", backref="User", lazy="dynamic", cascade="all, delete-orphan")
|
||
|
||
def ValidatePhone(self, phone):
|
||
pattern = r"^\+?[0-9\-\(\) ]+$"
|
||
if not phone:
|
||
return False
|
||
if len(phone) > 20:
|
||
return False
|
||
return re.match(pattern, phone) is not None
|
||
|
||
def SetTele(self, phone) -> bool:
|
||
if not self.ValidatePhone(phone):
|
||
return False
|
||
self.UserTele = phone
|
||
return True
|
||
|
||
def GetTele(self):
|
||
return self.UserTele
|
||
|
||
def SetPassword(self, PassWord: str):
|
||
PassWordBytes = PassWord.encode("utf-8")
|
||
salt = bcrypt.gensalt(rounds=12)
|
||
HashedPassWord = bcrypt.hashpw(PassWordBytes, salt)
|
||
self.UserPassword = HashedPassWord.decode("utf-8")
|
||
|
||
def CheckPassword(self, PassWord: str):
|
||
StoredHash = self.UserPassword.encode("utf-8")
|
||
InputPassWord = PassWord.encode("utf-8")
|
||
return bcrypt.checkpw(InputPassWord, StoredHash)
|
||
|
||
def SetEmail(self, Email):
|
||
regex = r"^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$"
|
||
if re.fullmatch(regex, Email) is None:
|
||
return False
|
||
self.UserEmail = Email
|
||
return True
|
||
|
||
def IsEmailVerified(self):
|
||
return self.UserEmailVerify == 1
|
||
|
||
def IsAccountEnabled(self):
|
||
return self.UserAccountLicense == 1
|
||
|
||
def UpdateLastLoginTime(self):
|
||
self.UserLastLoginDate = datetime.datetime.utcnow()
|
||
|
||
def GetCompanies(self) -> list:
|
||
roles = db.session.query(GERPCompany).join(GERPRole).join(UserRole).filter(UserRole.UserUUID == self.UserUUID).all()
|
||
return list({c.CompanyUUID: c for c in roles}.values())
|
||
|
||
def GetTenants(self) -> list:
|
||
tenants = db.session.query(GERPTenant).join(GERPCompany).join(GERPRole).join(UserRole).filter(UserRole.UserUUID == self.UserUUID).distinct().all()
|
||
return tenants
|
||
|
||
def GetRoles(self) -> list:
|
||
return db.session.query(GERPRole).join(UserRole).filter(UserRole.UserUUID == self.UserUUID).all()
|
||
|
||
def GetDepartments(self) -> list:
|
||
return db.session.query(GERPDept).join(RoleDept).join(GERPRole).join(UserRole).filter(UserRole.UserUUID == self.UserUUID).distinct().all()
|
||
|
||
def CreateDefaultRole(self, CompanyUUID: bytes | str, RoleName: str = None) -> "GERPRole":
|
||
if isinstance(CompanyUUID, str):
|
||
CompanyUUID = UUIDObj(CompanyUUID).bytes
|
||
RoleUUID = NewBUUID()
|
||
name = RoleName or f"{self.UserName}的默认角"
|
||
role = GERPRole(RoleUUID=RoleUUID, CompanyUUID=CompanyUUID, RoleName=name, RoleStatus=1)
|
||
db.session.add(role)
|
||
link = UserRole(UserUUID=self.UserUUID, RoleUUID=RoleUUID)
|
||
db.session.add(link)
|
||
db.session.commit()
|
||
return role
|
||
|
||
def AssignRole(self, RoleUUID: bytes | str) -> "UserRole":
|
||
if isinstance(RoleUUID, str):
|
||
RoleUUID = UUIDObj(RoleUUID).bytes
|
||
link = UserRole(UserUUID=self.UserUUID, RoleUUID=RoleUUID)
|
||
db.session.add(link)
|
||
db.session.commit()
|
||
return link
|
||
|
||
def RemoveRole(self, RoleUUID: bytes | str) -> bool:
|
||
if isinstance(RoleUUID, str):
|
||
RoleUUID = UUIDObj(RoleUUID).bytes
|
||
link = UserRole.query.filter(UserRole.UserUUID == self.UserUUID, UserRole.RoleUUID == RoleUUID).first()
|
||
if link:
|
||
db.session.delete(link)
|
||
db.session.commit()
|
||
return True
|
||
return False
|
||
|
||
|
||
# ==============================================================================
|
||
# 2. 用户头像
|
||
# ==============================================================================
|
||
class GERPUserAvatar(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "UserAvatar"
|
||
UserUUID = db.Column(db.BINARY(16), db.ForeignKey("User.UserUUID"), primary_key=True, nullable=False)
|
||
UserAvatar = db.Column(db.LargeBinary(5 * 1024 * 1024), nullable=False, default=b"")
|
||
AvatarUploadTime = db.Column(db.DateTime, nullable=False, default=lambda: datetime.datetime.utcnow())
|
||
AvatarFileType = db.Column(db.String(16), nullable=False, default="png")
|
||
|
||
|
||
# ==============================================================================
|
||
# 2.5 用户2FA认证
|
||
# ==============================================================================
|
||
class GERPUser2FA(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "User2FA"
|
||
|
||
User2FAUUID = db.Column(db.BINARY(16), primary_key=True, nullable=False)
|
||
UserUUID = db.Column(db.BINARY(16), db.ForeignKey("User.UserUUID"), nullable=False, unique=True)
|
||
SecretKey = db.Column(db.String(64), nullable=False)
|
||
IsEnabled = db.Column(db.SmallInteger, nullable=False, default=0)
|
||
Verified = db.Column(db.SmallInteger, nullable=False, default=0)
|
||
LastUsedAt = db.Column(db.DateTime, nullable=True)
|
||
CreateTime = db.Column(db.DateTime, nullable=False, default=lambda: datetime.datetime.utcnow())
|
||
|
||
User = db.relationship("GERPUser", backref=db.backref("TwoFactorAuth", uselist=False, cascade="all, delete-orphan"))
|
||
|
||
|
||
class GERPUserPending2FA(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "UserPending2FA"
|
||
|
||
PendingUUID = db.Column(db.BINARY(16), primary_key=True, nullable=False)
|
||
UserUUID = db.Column(db.BINARY(16), db.ForeignKey("User.UserUUID"), nullable=False, unique=True)
|
||
SecretKey = db.Column(db.String(64), nullable=False)
|
||
ExpireAt = db.Column(db.DateTime, nullable=False)
|
||
|
||
User = db.relationship("GERPUser", backref=db.backref("Pending2FA", uselist=False, cascade="all, delete-orphan"))
|
||
|
||
|
||
# ==============================================================================
|
||
# 3. 临时令牌
|
||
# ==============================================================================
|
||
class GERPUserELT(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "EphemeralTokens"
|
||
ELTUUID = db.Column(db.BINARY(16), primary_key=True, nullable=False)
|
||
ELTUserUUID = db.Column(db.BINARY(16), db.ForeignKey("User.UserUUID"), nullable=False)
|
||
ELTCreatime = db.Column(db.DateTime, nullable=False, default=lambda: datetime.datetime.utcnow())
|
||
ELTEndTime = db.Column(db.DateTime, nullable=False, default=lambda: datetime.datetime.utcnow() + datetime.timedelta(days=30))
|
||
ELTType = db.Column(db.SmallInteger, nullable=False, default=0)
|
||
ELTAllowIP = db.Column(db.JSON, nullable=False, default=[])
|
||
ELTStatus = db.Column(db.SmallInteger, nullable=False, default=1)
|
||
|
||
def IsExpired(self):
|
||
return datetime.datetime.utcnow() > self.ELTEndTime
|
||
|
||
def IsValid(self):
|
||
return self.ELTStatus == 1 and not self.IsExpired()
|
||
|
||
|
||
# ==============================================================================
|
||
# 4. 租户
|
||
# ==============================================================================
|
||
class GERPTenant(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "Tenant"
|
||
TenantUUID = db.Column(db.BINARY(16), primary_key=True, nullable=False)
|
||
TenantName = db.Column(db.String(256), nullable=False)
|
||
TenantCode = db.Column(db.String(64), nullable=False, unique=True)
|
||
TenantStatus = db.Column(db.SmallInteger, nullable=False, default=1)
|
||
TenantExpireTime = db.Column(db.DateTime, nullable=False)
|
||
ReviewStatus = db.Column(db.SmallInteger, nullable=False, default=0)
|
||
ReviewRemark = db.Column(db.String(512), default="")
|
||
ReviewerUUID = db.Column(db.BINARY(16), default=None)
|
||
ReviewTime = db.Column(db.DateTime, default=None)
|
||
CreateTime = db.Column(db.DateTime, nullable=False, default=lambda: datetime.datetime.utcnow())
|
||
Companies = db.relationship("GERPCompany", backref="Tenant", lazy="dynamic")
|
||
CompanyInfos = db.relationship("GERPCompanyInfo", backref="Tenant", lazy="dynamic")
|
||
|
||
|
||
# ==============================================================================
|
||
# 4.5 企业入驻申请(CompanyInfo)
|
||
# ==============================================================================
|
||
class GERPCompanyInfo(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "CompanyInfo"
|
||
CompanyInfoUUID = db.Column(db.BINARY(16), primary_key=True, nullable=False)
|
||
TenantUUID = db.Column(db.BINARY(16), db.ForeignKey("Tenant.TenantUUID"), nullable=True)
|
||
EnterpriseName = db.Column(db.String(256), nullable=False)
|
||
EnterpriseShortName = db.Column(db.String(100), nullable=False)
|
||
CreditCode = db.Column(db.String(64), nullable=False, unique=True)
|
||
EnterpriseType = db.Column(db.String(32), default="")
|
||
OwnershipType = db.Column(db.String(32), default="")
|
||
Industry = db.Column(db.String(32), default="")
|
||
Scale = db.Column(db.String(32), default="")
|
||
RegisteredCapital = db.Column(db.String(64), default="")
|
||
EstablishDate = db.Column(db.String(32), default="")
|
||
BusinessScope = db.Column(db.Text, default="")
|
||
BusinessStatus = db.Column(db.String(32), default="")
|
||
RegProvince = db.Column(db.String(32), default="")
|
||
RegCity = db.Column(db.String(32), default="")
|
||
RegDistrict = db.Column(db.String(32), default="")
|
||
RegAddress = db.Column(db.String(512), default="")
|
||
OfficeProvince = db.Column(db.String(32), default="")
|
||
OfficeCity = db.Column(db.String(32), default="")
|
||
OfficeDistrict = db.Column(db.String(32), default="")
|
||
OfficeAddress = db.Column(db.String(512), default="")
|
||
Phone = db.Column(db.String(32), default="")
|
||
Phone2 = db.Column(db.String(32), default="")
|
||
Fax = db.Column(db.String(32), default="")
|
||
Email = db.Column(db.String(128), default="")
|
||
Hotline = db.Column(db.String(32), default="")
|
||
ServicePhone = db.Column(db.String(32), default="")
|
||
Website = db.Column(db.String(256), default="")
|
||
Wechat = db.Column(db.String(128), default="")
|
||
WechatMini = db.Column(db.String(128), default="")
|
||
Weibo = db.Column(db.String(128), default="")
|
||
LinkedIn = db.Column(db.String(256), default="")
|
||
Bank = db.Column(db.String(32), default="")
|
||
BankAccount = db.Column(db.String(64), default="")
|
||
BankBranch = db.Column(db.String(128), default="")
|
||
BankProvince = db.Column(db.String(32), default="")
|
||
BankCity = db.Column(db.String(32), default="")
|
||
AccountName = db.Column(db.String(128), default="")
|
||
BankCode = db.Column(db.String(32), default="")
|
||
AccountType = db.Column(db.String(32), default="")
|
||
AccountStatus = db.Column(db.String(32), default="")
|
||
TaxBank = db.Column(db.String(128), default="")
|
||
TaxAccount = db.Column(db.String(64), default="")
|
||
TaxBankCode = db.Column(db.String(32), default="")
|
||
SalaryBank = db.Column(db.String(128), default="")
|
||
SalaryAccount = db.Column(db.String(64), default="")
|
||
SocialSecurityBank = db.Column(db.String(128), default="")
|
||
SocialSecurityAccount = db.Column(db.String(64), default="")
|
||
LegalPersonName = db.Column(db.String(64), default="")
|
||
LegalPersonIdCard = db.Column(db.String(32), default="")
|
||
LegalPersonGender = db.Column(db.String(16), default="")
|
||
LegalPersonBirthday = db.Column(db.String(32), default="")
|
||
LegalPersonNationality = db.Column(db.String(32), default="")
|
||
LegalPersonEducation = db.Column(db.String(32), default="")
|
||
LegalPersonPhone = db.Column(db.String(32), default="")
|
||
LegalPersonEmail = db.Column(db.String(128), default="")
|
||
LegalPersonAddress = db.Column(db.String(256), default="")
|
||
LegalPersonPosition = db.Column(db.String(32), default="")
|
||
LegalPersonShareRatio = db.Column(db.String(16), default="")
|
||
LegalPersonAppointment = db.Column(db.String(32), default="")
|
||
OperatorName = db.Column(db.String(64), default="")
|
||
OperatorIdCard = db.Column(db.String(32), default="")
|
||
OperatorPhone = db.Column(db.String(32), default="")
|
||
OperatorEmail = db.Column(db.String(128), default="")
|
||
OperatorDepartment = db.Column(db.String(128), default="")
|
||
OperatorPosition = db.Column(db.String(64), default="")
|
||
FinanceManagerName = db.Column(db.String(64), default="")
|
||
FinanceManagerPhone = db.Column(db.String(32), default="")
|
||
FinanceManagerEmail = db.Column(db.String(128), default="")
|
||
FinanceManagerIdCard = db.Column(db.String(32), default="")
|
||
Remark = db.Column(db.Text, default="")
|
||
ReviewStatus = db.Column(db.SmallInteger, nullable=False, default=0)
|
||
ReviewRemark = db.Column(db.String(512), default="")
|
||
ReviewerUUID = db.Column(db.BINARY(16), default=None)
|
||
ReviewTime = db.Column(db.DateTime, default=None)
|
||
CreatorUUID = db.Column(db.BINARY(16), default=None)
|
||
CreateTime = db.Column(db.DateTime, nullable=False, default=lambda: datetime.datetime.utcnow())
|
||
|
||
|
||
# ==============================================================================
|
||
# 5. 公司
|
||
# ==============================================================================
|
||
class GERPCompany(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "Company"
|
||
CompanyUUID = db.Column(db.BINARY(16), primary_key=True, nullable=False)
|
||
TenantUUID = db.Column(db.BINARY(16), db.ForeignKey("Tenant.TenantUUID"), nullable=False)
|
||
ParentCompanyUUID = db.Column(db.BINARY(16), default=None)
|
||
CompanyName = db.Column(db.String(256), nullable=False)
|
||
CompanyShort = db.Column(db.String(100), nullable=False)
|
||
CompanyStatus = db.Column(db.SmallInteger, nullable=False, default=1)
|
||
CreateTime = db.Column(db.DateTime, nullable=False, default=lambda: datetime.datetime.utcnow())
|
||
Departments = db.relationship("GERPDept", backref="Company", lazy="dynamic")
|
||
Roles = db.relationship("GERPRole", backref="Company", lazy="dynamic")
|
||
|
||
def GetTenant(self) -> "GERPTenant":
|
||
return GERPTenant.query.filter(GERPTenant.TenantUUID == self.TenantUUID).first()
|
||
|
||
def GetMembers(self) -> list:
|
||
return db.session.query(GERPUser).join(GERPRole).join(UserRole).filter(GERPRole.CompanyUUID == self.CompanyUUID).distinct().all()
|
||
|
||
def CreateRole(self, Name: str, RoleType: int = 2) -> "GERPRole":
|
||
role_uuid = NewBUUID()
|
||
role = GERPRole(
|
||
RoleUUID=role_uuid,
|
||
CompanyUUID=self.CompanyUUID,
|
||
RoleName=Name,
|
||
RoleType=RoleType,
|
||
RoleStatus=1,
|
||
)
|
||
db.session.add(role)
|
||
db.session.commit()
|
||
return role
|
||
|
||
def CreateDepartment(self, Name: str, Short: str = None, ParentUUID: bytes | str = None) -> "GERPDept":
|
||
if ParentUUID and isinstance(ParentUUID, str):
|
||
ParentUUID = UUIDObj(ParentUUID).bytes
|
||
dept_uuid = NewBUUID()
|
||
dept = GERPDept(
|
||
DeptUUID=dept_uuid,
|
||
CompanyUUID=self.CompanyUUID,
|
||
ParentDeptUUID=ParentUUID,
|
||
DeptName=Name,
|
||
DeptShort=Short or Name[:8],
|
||
DeptStatus=1,
|
||
)
|
||
db.session.add(dept)
|
||
db.session.commit()
|
||
return dept
|
||
|
||
@staticmethod
|
||
def Create(Name: str, TenantUUID: bytes | str, Short: str = None, ParentUUID: bytes | str = None, CreatorUUID: bytes | str = None) -> tuple["GERPCompany", "GERPRole"]:
|
||
if isinstance(TenantUUID, str):
|
||
TenantUUID = UUIDObj(TenantUUID).bytes
|
||
if ParentUUID and isinstance(ParentUUID, str):
|
||
ParentUUID = UUIDObj(ParentUUID).bytes
|
||
company_uuid = NewBUUID()
|
||
company = GERPCompany(
|
||
CompanyUUID=company_uuid,
|
||
TenantUUID=TenantUUID,
|
||
ParentCompanyUUID=ParentUUID,
|
||
CompanyName=Name,
|
||
CompanyShort=Short or Name[:8],
|
||
CompanyStatus=1,
|
||
)
|
||
db.session.add(company)
|
||
db.session.flush()
|
||
role_uuid = NewBUUID()
|
||
role = GERPRole(
|
||
RoleUUID=role_uuid,
|
||
CompanyUUID=company_uuid,
|
||
RoleName=f"{Name}管理",
|
||
RoleStatus=1,
|
||
)
|
||
db.session.add(role)
|
||
if CreatorUUID:
|
||
if isinstance(CreatorUUID, str):
|
||
CreatorUUID = UUIDObj(CreatorUUID).bytes
|
||
link = UserRole(UserUUID=CreatorUUID, RoleUUID=role_uuid)
|
||
db.session.add(link)
|
||
db.session.commit()
|
||
return company, role
|
||
|
||
|
||
# ==============================================================================
|
||
# 6. 部门
|
||
# ==============================================================================
|
||
class GERPDept(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "Dept"
|
||
DeptUUID = db.Column(db.BINARY(16), primary_key=True, nullable=False)
|
||
CompanyUUID = db.Column(db.BINARY(16), db.ForeignKey("Company.CompanyUUID"), nullable=False)
|
||
ParentDeptUUID = db.Column(db.BINARY(16), default=None)
|
||
DeptName = db.Column(db.String(256), nullable=False)
|
||
DeptSort = db.Column(db.Integer, default=0)
|
||
DeptStatus = db.Column(db.SmallInteger, nullable=False, default=1)
|
||
CreateTime = db.Column(db.DateTime, nullable=False, default=lambda: datetime.datetime.utcnow())
|
||
|
||
def GetUsers(self) -> list:
|
||
return db.session.query(GERPUser).join(UserRole).join(GERPRole).join(RoleDept).filter(RoleDept.DeptUUID == self.DeptUUID).distinct().all()
|
||
|
||
def AssignRole(self, RoleUUID: bytes | str, IsMain: bool = True) -> "RoleDept":
|
||
if isinstance(RoleUUID, str):
|
||
RoleUUID = UUIDObj(RoleUUID).bytes
|
||
link = RoleDept.query.filter(RoleDept.DeptUUID == self.DeptUUID, RoleDept.RoleUUID == RoleUUID).first()
|
||
if link:
|
||
return link
|
||
link = RoleDept(RoleDeptUUID=NewBUUID(), DeptUUID=self.DeptUUID, RoleUUID=RoleUUID, IsMainDept=1 if IsMain else 0)
|
||
db.session.add(link)
|
||
db.session.commit()
|
||
return link
|
||
|
||
def RemoveRole(self, RoleUUID: bytes | str) -> bool:
|
||
if isinstance(RoleUUID, str):
|
||
RoleUUID = UUIDObj(RoleUUID).bytes
|
||
link = RoleDept.query.filter(RoleDept.DeptUUID == self.DeptUUID, RoleDept.RoleUUID == RoleUUID).first()
|
||
if link:
|
||
db.session.delete(link)
|
||
db.session.commit()
|
||
return True
|
||
return False
|
||
|
||
|
||
# ==============================================================================
|
||
# 7. 角色(一个角""一个公"✅)
|
||
# ==============================================================================
|
||
class GERPRole(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "Role"
|
||
RoleUUID = db.Column(db.BINARY(16), primary_key=True, nullable=False)
|
||
CompanyUUID = db.Column(db.BINARY(16), db.ForeignKey("Company.CompanyUUID"), nullable=False)
|
||
DeptUUID = db.Column(db.BINARY(16), db.ForeignKey("Dept.DeptUUID"), nullable=True)
|
||
RoleName = db.Column(db.String(128), nullable=False)
|
||
RoleType = db.Column(db.SmallInteger, nullable=False, default=2)
|
||
RoleStatus = db.Column(db.SmallInteger, nullable=False, default=1)
|
||
CreateTime = db.Column(db.DateTime, nullable=False, default=lambda: datetime.datetime.utcnow())
|
||
|
||
def GetUsers(self) -> list:
|
||
return db.session.query(GERPUser).join(UserRole).filter(UserRole.RoleUUID == self.RoleUUID).all()
|
||
|
||
def HasPermission(self, PermCode: str) -> bool:
|
||
return db.session.query(GERPPermission).join(
|
||
GERPRole, GERPRole.RoleUUID == GERPPermission.RoleUUID
|
||
).filter(
|
||
GERPPermission.RoleUUID == self.RoleUUID,
|
||
GERPPermission.PermCode == PermCode,
|
||
GERPPermission.PermStatus == 1,
|
||
GERPRole.RoleStatus == 1,
|
||
).first() is not None
|
||
|
||
@staticmethod
|
||
def CheckUserPermission(UserUUID: bytes | str, PermCode: str) -> bool:
|
||
if isinstance(UserUUID, str):
|
||
UserUUID = UUIDObj(UserUUID).bytes
|
||
return db.session.query(GERPPermission).join(
|
||
GERPRole, GERPRole.RoleUUID == GERPPermission.RoleUUID
|
||
).join(
|
||
UserRole, UserRole.RoleUUID == GERPRole.RoleUUID
|
||
).filter(
|
||
UserRole.UserUUID == UserUUID,
|
||
GERPPermission.PermCode == PermCode,
|
||
GERPPermission.PermStatus == 1,
|
||
GERPRole.RoleStatus == 1,
|
||
).first() is not None
|
||
|
||
|
||
# ==============================================================================
|
||
# 8. 权限
|
||
# ==============================================================================
|
||
class GERPPermission(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "Permission"
|
||
PermUUID = db.Column(db.BINARY(16), primary_key=True, nullable=False)
|
||
PermName = db.Column(db.String(128), nullable=False)
|
||
PermCode = db.Column(db.String(128), nullable=False)
|
||
RoleUUID = db.Column(db.BINARY(16), db.ForeignKey("Role.RoleUUID"), nullable=False)
|
||
PermStatus = db.Column(db.SmallInteger, nullable=False, default=1)
|
||
PermDesc = db.Column(db.String(512), nullable=False, default="")
|
||
|
||
|
||
# ==============================================================================
|
||
# 9. 角色-部门
|
||
# ==============================================================================
|
||
class RoleDept(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "RoleDept"
|
||
RoleDeptUUID = db.Column(db.BINARY(16), primary_key=True, nullable=False)
|
||
RoleUUID = db.Column(db.BINARY(16), db.ForeignKey("Role.RoleUUID"), nullable=False)
|
||
DeptUUID = db.Column(db.BINARY(16), db.ForeignKey("Dept.DeptUUID"), nullable=False)
|
||
IsMainDept = db.Column(db.SmallInteger, default=1)
|
||
|
||
|
||
# ==============================================================================
|
||
# 10. 登录日志
|
||
# ==============================================================================
|
||
class GERPUserLoginLog(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "UserLoginLog"
|
||
LogUUID = db.Column(db.BINARY(16), primary_key=True, nullable=False)
|
||
UserUUID = db.Column(db.BINARY(16), db.ForeignKey("User.UserUUID"), nullable=False)
|
||
LoginIP = db.Column(db.String(39), nullable=False)
|
||
LoginPlatform = db.Column(db.String(32), nullable=False)
|
||
LoginStatus = db.Column(db.SmallInteger, nullable=False)
|
||
LoginTime = db.Column(db.DateTime, nullable=False, default=lambda: datetime.datetime.utcnow())
|
||
UserAgent = db.Column(db.String(512), default="")
|
||
|
||
|
||
# ==============================================================================
|
||
# 11. 资产管理
|
||
# ==============================================================================
|
||
class GERPFileAsset(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "FileAsset"
|
||
|
||
AssetUUID = db.Column(db.BINARY(16), primary_key=True, nullable=False)
|
||
CompanyUUID = db.Column(db.BINARY(16), db.ForeignKey("Company.CompanyUUID"), nullable=True)
|
||
FileName = db.Column(db.String(256), nullable=False)
|
||
FileSHA1 = db.Column(db.String(40), nullable=False, unique=True)
|
||
FileSize = db.Column(db.Integer, nullable=False)
|
||
MimeType = db.Column(db.String(128), nullable=False)
|
||
StoragePath = db.Column(db.String(512), nullable=False)
|
||
UploaderUUID = db.Column(db.BINARY(16), db.ForeignKey("User.UserUUID"), nullable=False)
|
||
RefCount = db.Column(db.Integer, nullable=False, default=0)
|
||
CreateTime = db.Column(db.DateTime, nullable=False, default=lambda: datetime.datetime.utcnow())
|
||
|
||
Uploader = db.relationship("GERPUser", backref=db.backref("FileAssets", lazy="dynamic"))
|
||
Company = db.relationship("GERPCompany", backref=db.backref("FileAssets", lazy="dynamic"))
|
||
|
||
|
||
# ==============================================================================
|
||
# 12. 工单系统
|
||
# ==============================================================================
|
||
class GERPWorkOrder(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "WorkOrder"
|
||
|
||
OrderUUID = db.Column(db.BINARY(16), primary_key=True, nullable=False)
|
||
Title = db.Column(db.String(256), nullable=False)
|
||
Description = db.Column(db.String(4096), nullable=False, default="")
|
||
Category = db.Column(db.String(64), nullable=False, default="other")
|
||
Priority = db.Column(db.SmallInteger, nullable=False, default=0)
|
||
Status = db.Column(db.SmallInteger, nullable=False, default=0)
|
||
CreatorUUID = db.Column(db.BINARY(16), db.ForeignKey("User.UserUUID"), nullable=False)
|
||
AssigneeUUID = db.Column(db.BINARY(16), nullable=True)
|
||
Resolution = db.Column(db.String(4096), nullable=False, default="")
|
||
CreateTime = db.Column(db.DateTime, nullable=False, default=lambda: datetime.datetime.utcnow())
|
||
UpdateTime = db.Column(db.DateTime, nullable=True)
|
||
CloseTime = db.Column(db.DateTime, nullable=True)
|
||
|
||
Creator = db.relationship("GERPUser", backref=db.backref("WorkOrders", lazy="dynamic"), foreign_keys=[CreatorUUID])
|
||
|
||
|
||
# ==============================================================================
|
||
# 9. 站内信
|
||
# ==============================================================================
|
||
class GERPMessage(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "Message"
|
||
|
||
MessageUUID = db.Column(db.BINARY(16), primary_key=True, nullable=False)
|
||
SenderUUID = db.Column(db.BINARY(16), nullable=True)
|
||
ReceiverUUID = db.Column(db.BINARY(16), db.ForeignKey("User.UserUUID"), nullable=False)
|
||
Title = db.Column(db.String(256), nullable=False)
|
||
Content = db.Column(db.Text, nullable=False, default="")
|
||
MsgType = db.Column(db.SmallInteger, nullable=False, default=0)
|
||
IsRead = db.Column(db.SmallInteger, nullable=False, default=0)
|
||
RelatedUUID = db.Column(db.String(64), default="")
|
||
RelatedType = db.Column(db.String(32), default="")
|
||
CreateTime = db.Column(db.DateTime, nullable=False, default=lambda: datetime.datetime.utcnow())
|
||
|
||
Receiver = db.relationship("GERPUser", backref=db.backref("Messages", lazy="dynamic"), foreign_keys=[ReceiverUUID])
|
||
|
||
|
||
class GERPMenu(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "Menu"
|
||
|
||
MenuUUID = db.Column(db.BINARY(16), primary_key=True, nullable=False)
|
||
CompanyUUID = db.Column(db.BINARY(16), db.ForeignKey("Company.CompanyUUID"), nullable=True)
|
||
ParentMenuUUID = db.Column(db.BINARY(16), nullable=True)
|
||
MenuName = db.Column(db.String(128), nullable=False)
|
||
MenuTitle = db.Column(db.String(128), nullable=False)
|
||
MenuIcon = db.Column(db.String(128), nullable=False, default="")
|
||
MenuLink = db.Column(db.String(256), nullable=False, default="")
|
||
MenuSort = db.Column(db.SmallInteger, nullable=False, default=0)
|
||
PermissionLevel = db.Column(db.Float, nullable=False, default=1.0)
|
||
PermissionAttr = db.Column(db.String(256), nullable=False, default="")
|
||
MenuStatus = db.Column(db.SmallInteger, nullable=False, default=1)
|
||
MenuType = db.Column(db.SmallInteger, nullable=False, default=0)
|
||
|
||
|
||
class AccountActivation(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "AccountActivation"
|
||
AccountActivationCode = db.Column(db.BINARY(6), nullable=True, primary_key = True, unique = True)
|
||
UserUUID = db.Column(db.BINARY(16), nullable = False)
|
||
CreateTime = db.Column(db.DateTime, nullable=False, default=lambda: datetime.datetime.utcnow())
|
||
|
||
|
||
class GERPUserABAC(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "UserABAC"
|
||
UserABACUUID = db.Column(db.BINARY(16), nullable = False, primary_key = True, unique = True, default = NewBUUID)
|
||
UserUUID = db.Column(db.BINARY(16), nullable = False)
|
||
HierarchicalPermissionIdentifiers = db.Column(db.String(256), nullable = False)
|
||
|
||
class GERPDepartment(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "Department"
|
||
DepartmentUUID = db.Column(db.BINARY(16), nullable = False, primary_key = True, unique = True, default = NewBUUID)
|
||
DepartmentName = db.Column(db.String(256), nullable = False, unique = True)
|
||
DepartmentEnglishName = db.Column(db.String(256), nullable = False, unique = True)
|
||
DepartmentIntroduction = db.Column(db.String(1024), nullable = False)
|
||
|
||
class GERPSMTM(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "DepartmentSMTM"
|
||
SMTMUUID = db.Column(db.BINARY(16), nullable = False, primary_key = True, unique = True, default = NewBUUID)
|
||
DepartmentUUID = db.Column(
|
||
db.BINARY(16),
|
||
db.ForeignKey(
|
||
"Department.DepartmentUUID",
|
||
ondelete="CASCADE",
|
||
onupdate="CASCADE"
|
||
),
|
||
nullable=False
|
||
)
|
||
UserUUID = db.Column(
|
||
db.BINARY(16),
|
||
db.ForeignKey(
|
||
"User.UserUUID",
|
||
ondelete="CASCADE",
|
||
onupdate="CASCADE"
|
||
),
|
||
nullable=False,
|
||
)
|
||
PersonInChargeStatus = db.Column(db.SmallInteger, nullable = False, default = 0)
|
||
Department = db.relationship(
|
||
"GERPDepartment",
|
||
backref=db.backref("dept_GERPSMTM", lazy="dynamic"),
|
||
foreign_keys=[DepartmentUUID]
|
||
)
|
||
User = db.relationship(
|
||
"GERPUser",
|
||
backref=db.backref("dept_GERPSMTM", lazy="dynamic"),
|
||
foreign_keys=[UserUUID]
|
||
)
|
||
|
||
class GERPWorkgroup(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "Workgroup"
|
||
WorkgroupUUID = db.Column(db.BINARY(16), nullable = False, primary_key = True, unique = True, default = NewBUUID)
|
||
WorkgroupName = db.Column(db.String(256), nullable = False)
|
||
WorkgroupEnglishName = db.Column(db.String(256), nullable = False)
|
||
WorkgroupIntroduction = db.Column(db.String(1024), nullable = False)
|
||
|
||
class GERPPassword(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "Password"
|
||
UserUUID = db.Column(db.BINARY(16), nullable = False, primary_key = True, unique = True, default = NewBUUID)
|
||
Password = db.Column(db.String(1024), nullable=False)
|
||
|
||
class GERPItemReference(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "ItemReference"
|
||
ItemUUID = db.Column(db.BINARY(16), nullable = False, primary_key = True, unique = True, default = NewBUUID)
|
||
ItemPublisherUserUUID = db.Column(db.BINARY(16), nullable = False, default = NewBUUID)
|
||
ItemName = db.Column(db.String(128), nullable = False)
|
||
ItemIcon = db.Column(db.String(512), nullable = False)
|
||
ItemIconColor = db.Column(db.String(6), nullable = False)
|
||
ItemTags = db.Column(db.JSON, nullable = False)
|
||
ItemDescription = db.Column(db.Text(1024 * 1024), nullable = False)
|
||
ItemMetaData = db.Column(db.JSON, nullable = False)
|
||
|
||
class GERPBackpack(db.Model):
|
||
__bind_key__ = "Users"
|
||
__tablename__ = "Backpack"
|
||
BackpackItemUUID = db.Column(db.BINARY(16), nullable = False, unique = True, primary_key = True)
|
||
UserUUID = db.Column(db.BINARY(16), nullable = False)
|
||
ItemTemplateUUID = db.Column(db.BINARY(16), sqlalchemy.ForeignKey("ItemReference.ItemUUID"), nullable = False)
|
||
_ItemName = db.Column(db.String(128), nullable = True)
|
||
_ItemIcon = db.Column(db.String(512), nullable = True)
|
||
_ItemIconColor = db.Column(db.String(6), nullable = True)
|
||
_ItemTags = db.Column(db.JSON, nullable = True)
|
||
_ItemMetaData = db.Column(db.JSON, nullable = True)
|
||
_ItemDescription = db.Column(db.Text(1024 * 1024), nullable = True)
|
||
ItemLength = db.Column(db.BigInteger, nullable = False)
|
||
|
||
ItemReference = db.relationship(
|
||
"GERPItemReference",
|
||
primaryjoin = sqlalchemy.and_(
|
||
ItemTemplateUUID == GERPItemReference.ItemUUID,
|
||
GERPItemReference.ItemUUID.isnot(None)
|
||
),
|
||
uselist=False,
|
||
lazy="joined",
|
||
innerjoin = False
|
||
)
|
||
|
||
@property
|
||
def ItemName(self):
|
||
return self._ItemName or (self.ItemReference.ItemName if self.ItemReference else None)
|
||
@ItemName.setter
|
||
def ItemName(self, value):
|
||
self._ItemName = value
|
||
@property
|
||
def ItemIcon(self):
|
||
return self._ItemIcon or (self.ItemReference.ItemIcon if self.ItemReference else None)
|
||
@ItemIcon.setter
|
||
def ItemIcon(self, value):
|
||
self._ItemIcon = value
|
||
@property
|
||
def ItemIconColor(self):
|
||
return self._ItemIconColor or (self.ItemReference.ItemIconColor if self.ItemReference else None)
|
||
@ItemIconColor.setter
|
||
def ItemIconColor(self, value):
|
||
self._ItemIconColor = value
|
||
@property
|
||
def ItemTags(self):
|
||
return self._ItemTags or (self.ItemReference.ItemTags if self.ItemReference else None)
|
||
@ItemTags.setter
|
||
def ItemTags(self, value):
|
||
self._ItemTags = value
|
||
@property
|
||
def ItemDescription(self):
|
||
return self._ItemDescription or (self.ItemReference.ItemDescription if self.ItemReference else None)
|
||
@ItemDescription.setter
|
||
def ItemDescription(self, value):
|
||
self._ItemDescription = value
|
||
@property
|
||
def ItemMetaData(self):
|
||
return self._ItemMetaData or (self.ItemReference.ItemMetaData if self.ItemReference else None)
|
||
@ItemMetaData.setter
|
||
def ItemMetaData(self, value):
|
||
self._ItemMetaData = value
|
||
|
||
class GERPSimulatedTrigger(db.Model):
|
||
__bind_key__ = "GerpCore"
|
||
__tablename__ = "SimulatedTrigger"
|
||
SimulatedTriggerUUID = db.Column(db.BINARY(16), nullable = False, primary_key = True, unique = True, default = NewBUUID)
|
||
SimulatedTriggerPublisherUserUUID = db.Column(db.BINARY(16), nullable = False, unique = True, default = NewBUUID)
|
||
SimulatedTriggerName = db.Column(db.String(128), nullable = False)
|
||
SimulatedTriggerFilePath = db.Column(db.String(512), nullable = False)
|
||
SimulatedTriggerCode = db.Column(db.Text(1024 * 1024), nullable=False)
|
||
|
||
|
||
class PlansNotify(db.Model): # plans.notify
|
||
__bind_key__ = "Plans"
|
||
__tablename__ = "notify"
|
||
NotifyUUID = db.Column(db.BINARY(16), primary_key = True, nullable = False)
|
||
NotifyName = db.Column(db.String(256), nullable = False)
|
||
NotifyTime = db.Column(db.DateTime, nullable = False, default = lambda: datetime.datetime.utcnow())
|
||
NotifyActor = db.Column(db.BINARY(16), nullable = False)
|
||
NotifyDocument = db.Column(db.BINARY(16), nullable = False)
|
||
|
||
class PlansTalentPlan(db.Model): # plans.talentplan
|
||
__bind_key__ = "Plans"
|
||
__tablename__ = "talentplan"
|
||
UserUUID = db.Column(db.BINARY(16), primary_key = True, nullable = False)
|
||
UserName = db.Column(db.String(256), nullable = False)
|
||
UserEcho = db.Column(db.String(256), nullable = False)
|
||
UserWork = db.Column(db.JSON, nullable = False)
|
||
UserWillWork = db.Column(db.JSON, nullable = False)
|
||
UserBornTime = db.Column(db.DateTime, nullable = False)
|
||
UserIDCard = db.Column(db.String(256), nullable = False)
|
||
UserBilibili = db.Column(db.String(32), nullable = False)
|
||
UserTiktok = db.Column(db.String(32), nullable = False)
|
||
UserTel = db.Column(db.String(20), nullable = False)
|
||
UserKuaiShou = db.Column(db.String(32), nullable = False)
|
||
UserWX = db.Column(db.String(32), nullable = False)
|
||
Other = db.Column(db.String(256), nullable = False)
|
||
|
||
class Link(db.Model):
|
||
__bind_key__ = "Plans"
|
||
__tablename__ = "links"
|
||
LinkID = db.Column(
|
||
db.Integer,
|
||
autoincrement=True,
|
||
nullable=False,
|
||
primary_key=True,
|
||
)
|
||
Link = db.Column(
|
||
db.String(1024),
|
||
default=None,
|
||
)
|
||
|
||
class CommunityDocument(db.Model): # document.document
|
||
__bind_key__ = "Document"
|
||
__tablename__ = "document"
|
||
DocUUID = db.Column(db.BINARY(16), primary_key = True, nullable = False)
|
||
DocSerieUUID = db.Column(db.BINARY(16), sqlalchemy.ForeignKey("series.DocSerieUUID"), nullable = False)
|
||
DocTitle = db.Column(db.String(256), nullable = False)
|
||
DocContent = db.Column(db.Text, nullable = False)
|
||
DocCreateTime = db.Column(db.DateTime, nullable = False, default = lambda: datetime.datetime.utcnow())
|
||
DocPermission = db.Column(db.Integer, nullable = False, default = 0)
|
||
DocPwd = db.Column(db.BINARY(16), nullable = False)
|
||
DocPwdDesc = db.Column(db.String(256), nullable = False)
|
||
Serie = db.relationship(
|
||
"CommunitySeries",
|
||
lazy="select",
|
||
viewonly=True,
|
||
backref=db.backref(
|
||
"Documents",
|
||
lazy="dynamic",
|
||
viewonly=True
|
||
)
|
||
)
|
||
|
||
class CommunitySeries(db.Model): # document.series
|
||
__bind_key__ = "Document"
|
||
__tablename__ = "series"
|
||
DocSerieUUID = db.Column(db.BINARY(16), primary_key = True, nullable = False)
|
||
DocSerieName = db.Column(db.String(256), nullable = False)
|
||
DocAuthorUserUUID = db.Column(db.BINARY(16), nullable = False)
|
||
DocSerieCreateTime = db.Column(db.DateTime, nullable = False, default = lambda: datetime.datetime.utcnow())
|
||
|
||
|
||
class SVEBase(db.Model):
|
||
__bind_key__ = "Document"
|
||
__tablename__ = "sve"
|
||
SVEID = db.Column(db.BINARY(10), primary_key = True, nullable = False, unique = True)
|
||
SVEName = db.Column(db.Text, nullable=True)
|
||
SVEDescription = db.Column(db.Text, nullable=True)
|
||
SVECreateTime = db.Column(db.DateTime, nullable=True)
|
||
SVELastModified = db.Column(db.DateTime, nullable=True)
|
||
SVEVulnStatus = db.Column(db.Text, nullable=True)
|
||
SVEProducts = db.Column(db.JSON, nullable=True)
|
||
SVECvss = db.Column(db.JSON, nullable=True)
|
||
SVESolutions = db.Column(db.Text, nullable=True)
|
||
SVEReferences = db.Column(db.JSON, nullable=True)
|
||
SVERelatedSves = db.Column(db.JSON, nullable=True)
|
||
|
||
class T4User(db.Model): # t4.computers
|
||
__bind_key__ = "T4PC"
|
||
__tablename__ = "computers"
|
||
PCMachineGUID = db.Column(db.BINARY(16), nullable = False, primary_key = True)
|
||
PCVersion = db.Column(db.String(16))
|
||
PCompilation = db.Column(db.String(16))
|
||
PCName = db.Column(db.String(16))
|
||
PCreateUserName = db.Column(db.String(16))
|
||
PCSystemINFO = db.Column(db.Text)
|
||
PCreateTime = db.Column(db.DateTime)
|
||
PCLastSynchronizationTime = db.Column(db.DateTime)
|
||
PCLastConnectTime = db.Column(db.DateTime)
|
||
PCPreviewImage = db.Column(db.LargeBinary)
|
||
|
||
class T4Hiscr(db.Model): # t4.hiscr
|
||
__bind_key__ = "T4PC"
|
||
__tablename__ = "hiscr"
|
||
CreateTime = db.Column(db.DateTime, nullable = False, default = lambda: datetime.datetime.utcnow(), primary_key = True)
|
||
PCMachineGUID = db.Column(db.BINARY(16), nullable = False)
|
||
ImageBytes = db.Column(db.LargeBinary, nullable = False)
|
||
|
||
class T4KeyMouse(db.Model): # t4.km
|
||
__bind_key__ = "T4PC"
|
||
__tablename__ = "km"
|
||
CreateTime = db.Column(db.DateTime, nullable = False, default = lambda: datetime.datetime.utcnow(), primary_key = True)
|
||
PCMachineGUID = db.Column(db.BINARY(16), nullable = False)
|
||
KeyMouse = db.Column(db.JSON, nullable = False)
|
||
|
||
class T4PLT(db.Model): # t4.plt
|
||
__bind_key__ = "T4PC"
|
||
__tablename__ = "pcplt"
|
||
PCMachineGUID = db.Column(db.BINARY(16), nullable = False, primary_key = True)
|
||
PCSID = db.Column(db.String(256), nullable = False)
|
||
PCLastSynchronizationTime = db.Column(db.DateTime, nullable = False, default = lambda: datetime.datetime.utcnow())
|
||
PConnectime = db.Column(db.DateTime, nullable = False, default = lambda: datetime.datetime.utcnow())
|
||
|
||
class InviteConversation(db.Model):
|
||
__bind_key__ = "Plans"
|
||
__tablename__ = "InviteConversation"
|
||
InviteID = db.Column(db.String(256), primary_key=True, nullable=False)
|
||
Messages = db.Column(db.JSON, nullable=False)
|
||
CreateTime = db.Column(db.Float, nullable=False)
|
||
FinalStatus = db.Column(db.Integer, nullable=True)
|
||
FinalResult = db.Column(db.Text, nullable=True)
|
||
FinalReason = db.Column(db.Text, nullable=True)
|
||
FinalMood = db.Column(db.String(256), nullable=True)
|
||
|
||
def IsConversationValid(InviteID):
|
||
if not InviteID:
|
||
return False
|
||
Conversation: InviteConversation = InviteConversation.query.filter_by(InviteID=InviteID).first()
|
||
if not Conversation:
|
||
return False
|
||
if Conversation.FinalStatus is not None:
|
||
return True
|
||
return True
|
||
|
||
class CmeCurrencies(db.Model):
|
||
__bind_key__ = "Minecraft"
|
||
__tablename__ = "cme_currencies"
|
||
id = db.Column(db.String(20), primary_key=True, nullable=False)
|
||
name = db.Column(db.String(50), nullable=False)
|
||
display_name = db.Column(db.String(100), nullable=False)
|
||
unit = db.Column(db.Float, nullable=False, default=1.0)
|
||
is_default = db.Column(db.SmallInteger, nullable=False, default=0)
|
||
icon = db.Column(db.String(50), nullable=False, default="minecraft:iron")
|
||
created_at = db.Column(db.DateTime, nullable=True, default=datetime.datetime.now)
|
||
updated_at = db.Column(
|
||
db.DateTime,
|
||
nullable=True,
|
||
default=datetime.datetime.now,
|
||
onupdate=datetime.datetime.now
|
||
)
|
||
class CmeWalletBalances(db.Model):
|
||
__bind_key__ = "Minecraft"
|
||
__tablename__ = "cme_wallet_balances"
|
||
player_uuid = db.Column(db.String(36), primary_key=True, nullable=False)
|
||
player_name = db.Column(db.String(16), nullable=True)
|
||
currency_id = db.Column(
|
||
db.String(20),
|
||
db.ForeignKey("cme_currencies.id", ondelete="RESTRICT"),
|
||
primary_key=True,
|
||
nullable=False
|
||
)
|
||
balance = db.Column(db.Float, nullable=False, default=0)
|
||
currency = db.relationship(
|
||
"CmeCurrencies",
|
||
backref=db.backref("wallet_balances", lazy="dynamic"),
|
||
lazy="joined"
|
||
)
|
||
|
||
class CmeStoreValue(db.Model):
|
||
__bind_key__ = "Minecraft"
|
||
__tablename__ = "storevalue"
|
||
StoreValueUUID = db.Column(db.BINARY(16), primary_key=True, nullable=False)
|
||
UserUUID = db.Column(db.BINARY(16), nullable=True)
|
||
PlayerUUID = db.Column(db.BINARY(16), nullable=True)
|
||
PlayerName = db.Column(db.Text, nullable=True)
|
||
StoreValueCreateDateTime = db.Column(db.DateTime, nullable=True)
|
||
StoreValueType = db.Column(db.Integer, nullable=True)
|
||
StoreValueMin = db.Column(db.BigInteger, nullable=True)
|
||
StoreValueDayInterestRate = db.Column(db.SmallInteger, nullable=True)
|
||
StoreValueAmount = db.Column(db.BigInteger, nullable=True)
|
||
StoreValueExpirationGameDate = db.Column(db.Integer, nullable=True)
|
||
|
||
class CmeWalletGVSDSMapping(db.Model):
|
||
__bind_key__ = "Minecraft"
|
||
__tablename__ = "cme_wallet_gvsds"
|
||
UserUUID = db.Column(db.BINARY(16), primary_key = True, nullable = False, unique = True)
|
||
player_uuid = db.Column(db.String(36), primary_key=True, nullable=False)
|
||
|
||
|
||
class EnterpriseUser(db.Model):
|
||
__bind_key__ = "Minecraft"
|
||
__tablename__ = "enterprise_user"
|
||
EnterpriseSMTMUUID = db.Column(db.BINARY(16), primary_key=True, default = NewBUUID)
|
||
EnterpriseUUID = db.Column(
|
||
db.BINARY(16),
|
||
db.ForeignKey("enterprise.EnterpriseUUID")
|
||
)
|
||
UserUUID = db.Column(db.BINARY(16), nullable=True)
|
||
EnterpriseUserType = db.Column(db.Integer, nullable=True)
|
||
|
||
class Enterprise(db.Model):
|
||
__bind_key__ = "Minecraft"
|
||
__tablename__ = "enterprise"
|
||
EnterpriseUUID = db.Column(db.BINARY(16), primary_key=True, nullable=False)
|
||
EnterpriseCreateCertificationCode = db.Column(db.BINARY(16), nullable=True)
|
||
EnterpriseFatherUUID = db.Column(db.BINARY(16), nullable=True)
|
||
EnterpriseName = db.Column(db.Text, nullable=True)
|
||
EnterpriseType = db.Column(db.Integer, nullable=True)
|
||
EnterpriseStatus = db.Column(db.Integer, nullable=True)
|
||
EnterpriseCreateTime = db.Column(db.DateTime, nullable=True)
|
||
EnterpriseRegisteredCapital = db.Column(db.Float, nullable=True)
|
||
EnterpriseCapitalGC = db.Column(db.Text, nullable=True)
|
||
EnterpriseCapital = db.Column(db.Float, nullable=True)
|
||
EnterpriseTelephone = db.Column(db.Text, nullable=True)
|
||
EnterpriseEmail = db.Column(db.Text, nullable=True)
|
||
EnterpriseWebsite = db.Column(db.Text, nullable=True)
|
||
EnterpriseAddres = db.Column(db.Text, nullable=True)
|
||
EnterpriseDesc = db.Column(db.Text, nullable=True)
|
||
EnterpriseAdministrativeDivisions = db.Column(db.Text, nullable=True)
|
||
EnterpriseBusinessPeriod = db.Column(db.BigInteger, nullable=True)
|
||
EnterpriseApprovalDate = db.Column(db.DateTime, nullable=True)
|
||
EnterpriseBusinessScope = db.Column(db.JSON, nullable=True)
|
||
EnterpriseUsers = db.relationship(
|
||
"EnterpriseUser",
|
||
primaryjoin="Enterprise.EnterpriseUUID == EnterpriseUser.EnterpriseUUID",
|
||
lazy="dynamic",
|
||
viewonly=True,
|
||
backref=db.backref("enterprise", lazy="joined")
|
||
)
|
||
|
||
class TestUser(db.Model):
|
||
__bind_key__ = "GerpCore"
|
||
__tablename__ = "test_user"
|
||
|
||
id = db.Column(db.BigInteger, primary_key=True, autoincrement=True, comment="主键ID")
|
||
username = db.Column(db.String(50), nullable=False, comment="用户")
|
||
email = db.Column(db.String(100), unique=True, nullable=False, comment="邮箱")
|
||
phone = db.Column(db.CHAR(11), default="", comment="手机")
|
||
age = db.Column(db.SmallInteger, default=0, comment="年龄")
|
||
height = db.Column(db.Numeric(5, 2), default=0.00, comment="身高")
|
||
weight = db.Column(db.Float, default=0.0, comment="体重")
|
||
is_active = db.Column(db.Boolean, default=True, comment="是否激")
|
||
gender = db.Column(db.Enum("male", "female", "other"), default="other", comment="性别")
|
||
join_time = db.Column(db.DateTime, default=lambda: datetime.datetime.utcnow(), comment="加入时间")
|
||
birthday = db.Column(db.Date, default=lambda: datetime.date(1970, 1, 1), comment="生日")
|
||
last_login_time = db.Column(
|
||
db.TIMESTAMP,
|
||
default=lambda: datetime.datetime.utcnow(),
|
||
# onupdate=lambda: datetime.datetime.utcnow(),
|
||
comment="最后登录时",
|
||
nullable=True
|
||
)
|
||
address = db.Column(db.Text, default="", comment="地址")
|
||
avatar_url = db.Column(db.String(255), default="", comment="头像URL")
|
||
status = db.Column(db.SmallInteger, default=1, comment="状态:1-正常 2-禁用 3-删除")
|
||
ext_info = db.Column(db.JSON, default=dict, comment="扩展信息")
|
||
|
||
|
||
class GERPCashReceiptsPaymentsLedger(db.Model):
|
||
__bind_key__ = "GerpCore"
|
||
__tablename__ = "cash_book"
|
||
CashBookUUID = db.Column(db.BINARY(16), primary_key=True, default = NewBUUID)
|
||
CashBookCreateTime = db.Column(db.DateTime, default=lambda: datetime.datetime.utcnow())
|
||
CashBookTransactionType = db.Column(db.SmallInteger, nullable=False, default=0)
|
||
CashBookAmount = db.Column(db.Numeric(precision=12, scale=2), nullable=False, default=0.00)
|
||
CashBookCurrency = db.Column(db.String(10), nullable=False, default="CNY")
|
||
CashBookDescription = db.Column(db.String(512), nullable=False)
|
||
CashBookTransactionTime = db.Column(db.DateTime, nullable=False, default=lambda: datetime.datetime.utcnow())
|
||
CashBookUserUUID = db.Column(db.BINARY(16), nullable=False)
|
||
CashBookStatus = db.Column(db.SmallInteger, nullable=False, default=0)
|
||
CashBookRemark = db.Column(db.String(1024), nullable=True)
|
||
CashBookMetaData = db.Column(db.JSON, nullable=True, default={})
|
||
CashBookCategory = db.Column(db.String(50), nullable=False, default="其它")
|
||
CashBookPaymentMethod = db.Column(db.String(50), nullable=False, default="")
|
||
CashBookPaymentDetails = db.Column(db.String(512), nullable=True, default="")
|
||
CashBookInvoiceNo = db.Column(db.String(100), nullable=True, default="")
|
||
CashBookTaxRate = db.Column(db.Numeric(precision=4, scale=2), nullable=False, default=0.00)
|
||
CashBookTaxAmount = db.Column(db.Numeric(precision=12, scale=2), nullable=False, default=0.00)
|
||
CashBookNetAmount = db.Column(db.Numeric(precision=12, scale=2), nullable=False, default=0.00)
|
||
CashBookProjectUUID = db.Column(db.BINARY(16), nullable=True)
|
||
CashBookOrderUUID = db.Column(db.BINARY(16), nullable=True)
|
||
CashBookDepartmentUUID = db.Column(db.BINARY(16), nullable=True)
|
||
CashBookAttachmentPath = db.Column(db.String(512), nullable=True, default="")
|
||
CashBookExchangeRate = db.Column(db.Numeric(precision=10, scale=4), nullable=False, default=1.0000)
|
||
|
||
__table_args__ = (
|
||
db.Index("idx_transaction_time", "CashBookTransactionTime"),
|
||
db.Index("idx_transaction_type", "CashBookTransactionType"),
|
||
db.Index("idx_status", "CashBookStatus"),
|
||
db.Index("idx_category", "CashBookCategory"),
|
||
db.Index("idx_department", "CashBookDepartmentUUID"),
|
||
db.Index("idx_project", "CashBookProjectUUID"),
|
||
)
|
||
|
||
class GERPAsset(db.Model):
|
||
__bind_key__ = "GerpCore"
|
||
__tablename__ = "asset"
|
||
AssetUUID = db.Column(db.BINARY(16), primary_key=True, default=NewBUUID)
|
||
AssetType = db.Column(db.String(50), nullable=False)
|
||
AssetAmount = db.Column(db.Numeric(precision=12, scale=2), nullable=False, default=0.00)
|
||
AssetCurrency = db.Column(db.String(10), nullable=False, default="CNY")
|
||
AssetDescription = db.Column(db.String(512), nullable=False)
|
||
AssetCreateTime = db.Column(db.DateTime, nullable=False, default=lambda: datetime.datetime.utcnow())
|
||
AssetUserUUID = db.Column(db.BINARY(16), nullable=False)
|
||
AssetStatus = db.Column(db.SmallInteger, nullable=False, default=0)
|
||
AssetMetaData = db.Column(db.JSON, nullable=True, default={})
|
||
|
||
__table_args__ = (
|
||
db.Index("idx_asset_type", "AssetType"),
|
||
db.Index("idx_asset_status", "AssetStatus"),
|
||
db.Index("idx_asset_create_time", "AssetCreateTime"),
|
||
)
|
||
|
||
class GERPLiability(db.Model):
|
||
__bind_key__ = "GerpCore"
|
||
__tablename__ = "liability"
|
||
LiabilityUUID = db.Column(db.BINARY(16), primary_key=True, default=NewBUUID)
|
||
LiabilityType = db.Column(db.String(50), nullable=False)
|
||
LiabilityAmount = db.Column(db.Numeric(precision=12, scale=2), nullable=False, default=0.00)
|
||
LiabilityCurrency = db.Column(db.String(10), nullable=False, default="CNY")
|
||
LiabilityDescription = db.Column(db.String(512), nullable=False)
|
||
LiabilityCreateTime = db.Column(db.DateTime, nullable=False, default=lambda: datetime.datetime.utcnow())
|
||
LiabilityUserUUID = db.Column(db.BINARY(16), nullable=False)
|
||
LiabilityStatus = db.Column(db.SmallInteger, nullable=False, default=0)
|
||
LiabilityMetaData = db.Column(db.JSON, nullable=True, default={})
|
||
|
||
__table_args__ = (
|
||
db.Index("idx_liability_type", "LiabilityType"),
|
||
db.Index("idx_liability_status", "LiabilityStatus"),
|
||
db.Index("idx_liability_create_time", "LiabilityCreateTime"),
|
||
)
|
||
|
||
with App.app_context():
|
||
db.create_all() |