Files

1092 lines
53 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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()