# -*- coding: utf-8 -*-
from sqlalchemy import String, Column, Integer,DateTime,Text,BigInteger,Boolean,PrimaryKeyConstraint,Index,UniqueConstraint,CHAR,LargeBinary,TIMESTAMP
from sqlalchemy.dialects.mysql import TINYINT
from sqlalchemy.sql import func
from database import Base
from datetime import datetime


'''社会化关系表'''
class SysSocial(Base):
    __tablename__ = 'sys_social'

    id = Column(BigInteger, primary_key=True,autoincrement=True, comment='主键')
    user_id = Column(BigInteger, nullable=False, comment='用户ID')
    tenant_id = Column(String(20), default=None, comment='租户id')
    auth_id = Column(String(255), nullable=False, comment='平台+平台唯一id')
    source = Column(String(255), nullable=False, comment='用户来源')
    open_id = Column(String(255), default=None, comment='平台编号唯一id')
    user_name = Column(String(30), nullable=False, comment='登录账号')
    nick_name = Column(String(30), default='', comment='用户昵称')
    email = Column(String(255), default='', comment='用户邮箱')
    avatar = Column(String(500), default='', comment='头像地址')
    access_token = Column(String(255), nullable=False, comment='用户的授权令牌')
    expire_in = Column(Integer, default=None, comment='用户的授权令牌的有效期')
    refresh_token = Column(String(255), default=None, comment='刷新令牌')
    access_code = Column(String(255), default=None, comment='平台的授权信息')
    union_id = Column(String(255), default=None, comment='用户的 unionid')
    scope = Column(String(255), default=None, comment='授予的权限')
    token_type = Column(String(255), default=None, comment='个别平台的授权信息')
    id_token = Column(String(2000), default=None, comment='id token')
    mac_algorithm = Column(String(255), default=None, comment='小米平台用户的附带属性')
    mac_key = Column(String(255), default=None, comment='小米平台用户的附带属性')
    code = Column(String(255), default=None, comment='用户的授权code')
    oauth_token = Column(String(255), default=None, comment='Twitter平台用户的附带属性')
    oauth_token_secret = Column(String(255), default=None, comment='Twitter平台用户的附带属性')
    create_dept = Column(BigInteger, comment='创建部门')
    create_by = Column(BigInteger, comment='创建者')
    create_time = Column(DateTime, comment='创建时间')
    update_by = Column(BigInteger, comment='更新者')
    update_time = Column(DateTime, comment='更新时间')
    del_flag = Column(String(1), default='0', comment='删除标志（0代表存在 2代表删除）')

    class Config:
        orm_mode = True


'''租户表'''
class SysTenant(Base):
    __tablename__ = 'sys_tenant'

    id = Column(BigInteger, primary_key=True,autoincrement=True, comment='id')
    tenant_id = Column(String(20), nullable=False, comment='租户编号')
    contact_user_name = Column(String(20), comment='联系人')
    contact_phone = Column(String(20), comment='联系电话')
    company_name = Column(String(50), comment='企业名称')
    license_number = Column(String(30), comment='统一社会信用代码')
    address = Column(String(200), comment='地址')
    intro = Column(String(200), comment='企业简介')
    domain = Column(String(200), comment='域名')
    remark = Column(String(200), comment='备注')
    package_id = Column(BigInteger, comment='租户套餐编号')
    expire_time = Column(DateTime, comment='过期时间')
    account_count = Column(Integer, default=-1, comment='用户数量（-1不限制）')
    status = Column(String(1), default='0', comment='租户状态（0正常 1停用）')
    del_flag = Column(String(1), default='0', comment='删除标志（0代表存在 2代表删除）')
    create_dept = Column(BigInteger, comment='创建部门')
    create_by = Column(BigInteger, comment='创建者')
    create_time = Column(DateTime, comment='创建时间')
    update_by = Column(BigInteger, comment='更新者')
    update_time = Column(DateTime, comment='更新时间')

    class Config:
        orm_mode = True


'''租户套餐表'''
class SysTenantPackage(Base):
    __tablename__ = 'sys_tenant_package'

    package_id = Column(BigInteger, primary_key=True,autoincrement=True, comment='租户套餐id')
    package_name = Column(String(20), comment='套餐名称')
    menu_ids = Column(String(3000), comment='关联菜单id')
    remark = Column(String(200), comment='备注')
    menu_check_strictly = Column(Integer, default=1, comment='菜单树选择项是否关联显示')
    status = Column(String(1), default='0', comment='状态（0正常 1停用）')
    del_flag = Column(String(1), default='0', comment='删除标志（0代表存在 2代表删除）')
    create_dept = Column(BigInteger, comment='创建部门')
    create_by = Column(BigInteger, comment='创建者')
    create_time = Column(DateTime, comment='创建时间')
    update_by = Column(BigInteger, comment='更新者')
    update_time = Column(DateTime, comment='更新时间')

    class Config:
        orm_mode = True

'''部门表'''
class SysDept(Base):
    __tablename__ = 'sys_dept'

    dept_id = Column(BigInteger, primary_key=True,autoincrement=True, comment='部门id')
    tenant_id = Column(String(20), default='000000', comment='租户编号')
    parent_id = Column(BigInteger, default=0, comment='父部门id')
    ancestors = Column(String(500), default='', comment='祖级列表')
    dept_name = Column(String(30), default='', comment='部门名称')
    dept_category = Column(String(100), default=None, comment='部门类别编码')
    order_num = Column(Integer, default=0, comment='显示顺序')
    leader = Column(BigInteger, default=None, comment='负责人')
    phone = Column(String(11), default=None, comment='联系电话')
    email = Column(String(50), default=None, comment='邮箱')
    status = Column(String(1), default='0', comment='部门状态（0正常 1停用）')
    del_flag = Column(String(1), default='0', comment='删除标志（0代表存在 2代表删除）')
    create_dept = Column(BigInteger, default=None, comment='创建部门')
    create_by = Column(BigInteger, default=None, comment='创建者')
    create_time = Column(DateTime, comment='创建时间')
    update_by = Column(BigInteger, default=None, comment='更新者')
    update_time = Column(DateTime, comment='更新时间')

    class Config:
        orm_mode = True


'''用户信息表'''


class SysUser(Base):
    __tablename__ = 'sys_user'

    user_id = Column(BigInteger, primary_key=True,autoincrement=True, comment='用户ID')
    tenant_id = Column(String(20), default='000000', comment='租户编号')
    dept_id = Column(BigInteger, default=None, comment='部门ID')
    user_name = Column(String(30), nullable=False, comment='用户账号')
    nick_name = Column(String(30), nullable=False, comment='用户昵称')
    user_type = Column(String(10), default='sys_user', comment='用户类型（sys_user系统用户）')
    email = Column(String(50), default='', comment='用户邮箱')
    phonenumber = Column(String(11), default='', comment='手机号码')
    sex = Column(String(1), default='0', comment='用户性别（0男 1女 2未知）')
    avatar = Column(BigInteger, comment='头像地址')
    password = Column(String(100), default='', comment='密码')
    status = Column(String(1), default='0', comment='帐号状态（0正常 1停用）')
    del_flag = Column(String(1), default='0', comment='删除标志（0代表存在 2代表删除）')
    login_ip = Column(String(128), default='', comment='最后登录IP')
    login_date = Column(DateTime, comment='最后登录时间')
    create_dept = Column(BigInteger, default=None, comment='创建部门')
    create_by = Column(BigInteger, default=None, comment='创建者')
    create_time = Column(DateTime, comment='创建时间')
    update_by = Column(BigInteger, default=None, comment='更新者')
    update_time = Column(DateTime, comment='更新时间')
    remark = Column(String(500), default=None, comment='备注')

    class Config:
        orm_mode = True

'''岗位信息表'''


class SysPost(Base):
    __tablename__ = 'sys_post'

    post_id = Column(BigInteger, primary_key=True,autoincrement=True, comment='岗位ID')
    tenant_id = Column(String(20), default='000000', comment='租户编号')
    dept_id = Column(BigInteger, nullable=False, comment='部门id')
    post_code = Column(String(64), nullable=False, comment='岗位编码')
    post_category = Column(String(100), default=None, comment='岗位类别编码')
    post_name = Column(String(50), nullable=False, comment='岗位名称')
    post_sort = Column(Integer, nullable=False, comment='显示顺序')
    status = Column(String(1), nullable=False, comment='状态（0正常 1停用）')
    create_dept = Column(BigInteger, default=None, comment='创建部门')
    create_by = Column(BigInteger, default=None, comment='创建者')
    create_time = Column(DateTime, comment='创建时间')
    update_by = Column(BigInteger, default=None, comment='更新者')
    update_time = Column(DateTime, comment='更新时间')
    remark = Column(String(500), default=None, comment='备注')

    class Config:
        orm_mode = True

'''角色信息表'''


class SysRole(Base):
    __tablename__ = 'sys_role'

    role_id = Column(BigInteger, primary_key=True,autoincrement=True, comment='角色ID')
    tenant_id = Column(String(20), default='000000', comment='租户编号')
    role_name = Column(String(30), nullable=False, comment='角色名称')
    role_key = Column(String(100), nullable=False, comment='角色权限字符串')
    role_sort = Column(Integer, nullable=False, comment='显示顺序')
    data_scope = Column(String(1), default='1', comment='数据范围')
    menu_check_strictly = Column(Boolean, default=True, comment='菜单树选择项是否关联显示')
    dept_check_strictly = Column(Boolean, default=True, comment='部门树选择项是否关联显示')
    status = Column(String(1), nullable=False, comment='角色状态（0正常 1停用）')
    del_flag = Column(String(1), default='0', comment='删除标志（0代表存在 2代表删除）')
    create_dept = Column(BigInteger, default=None, comment='创建部门')
    create_by = Column(BigInteger, default=None, comment='创建者')
    create_time = Column(DateTime, comment='创建时间')
    update_by = Column(BigInteger, default=None, comment='更新者')
    update_time = Column(DateTime, comment='更新时间')
    remark = Column(String(500), default=None, comment='备注')

    class Config:
        orm_mode = True

'''菜单权限表'''
class SysMenu(Base):
    __tablename__ = 'sys_menu'

    menu_id = Column(BigInteger, primary_key=True,autoincrement=True, comment='菜单ID')
    menu_name = Column(String(50), nullable=False, comment='菜单名称')
    parent_id = Column(BigInteger, default=0, comment='父菜单ID')
    order_num = Column(Integer, default=0, comment='显示顺序')
    path = Column(String(200), default='', comment='路由地址')
    component = Column(String(255), default=None, comment='组件路径')
    query_param = Column(String(255), default=None, comment='路由参数')
    is_frame = Column(Integer, default=1, comment='是否为外链（0是 1否）')
    is_cache = Column(Integer, default=0, comment='是否缓存（0缓存 1不缓存）')
    menu_type = Column(String(1), default='', comment='菜单类型（M目录 C菜单 F按钮）')
    visible = Column(String(1), default='0', comment='显示状态（0显示 1隐藏）')
    status = Column(String(1), default='0', comment='菜单状态（0正常 1停用）')
    perms = Column(String(100), default=None, comment='权限标识')
    icon = Column(String(100), default='#', comment='菜单图标')
    create_dept = Column(BigInteger, default=None, comment='创建部门')
    create_by = Column(BigInteger, default=None, comment='创建者')
    create_time = Column(DateTime, default=datetime.now, comment='创建时间')
    update_by = Column(BigInteger, default=None, comment='更新者')
    update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')
    remark = Column(String(500), default='', comment='备注')
    del_flag = Column(String(1), default='0', comment='删除标志（0代表存在 2代表删除）')

    class Config:
        orm_mode = True

'''用户和角色关联表'''
class SysUserRole(Base):
    __tablename__ = 'sys_user_role'
    __table_args__ = (PrimaryKeyConstraint('role_id', 'user_id'),)
    user_id = Column(BigInteger,  nullable=True, comment='用户ID')
    role_id = Column(BigInteger, nullable=True, comment='角色ID')

    class Config:
        orm_mode = True

'''角色和菜单关联表'''
class SysRoleMenu(Base):
    __tablename__ = 'sys_role_menu'
    __table_args__ = (PrimaryKeyConstraint('role_id', 'menu_id'),)
    role_id = Column(BigInteger, nullable=False, comment='角色ID')
    menu_id = Column(BigInteger, nullable=False, comment='菜单ID')

    class Config:
        orm_mode = True

'''角色和部门关联表'''
class SysRoleDept(Base):
    __tablename__ = 'sys_role_dept'
    __table_args__ = (PrimaryKeyConstraint('role_id', 'dept_id'),)
    role_id = Column(BigInteger,  nullable=False, comment='角色ID')
    dept_id = Column(BigInteger,  nullable=False, comment='部门ID')

    class Config:
        orm_mode = True

'''用户与岗位关联表'''
class SysUserPost(Base):
    __tablename__ = 'sys_user_post'
    __table_args__ = (PrimaryKeyConstraint('user_id', 'post_id'),)
    user_id = Column(BigInteger,  nullable=False, comment='用户ID')
    post_id = Column(BigInteger,  nullable=False, comment='岗位ID')

    class Config:
        orm_mode = True

'''操作日志记录'''


class SysOperLog(Base):
    __tablename__ = 'sys_oper_log'
    __table_args__ = (
        Index('idx_sys_oper_log_bt', 'business_type'),
        Index('idx_sys_oper_log_s', 'status'),
        Index('idx_sys_oper_log_ot', 'oper_time'),
    )
    oper_id = Column(BigInteger, primary_key=True,autoincrement=True, comment='日志主键')
    tenant_id = Column(String(20), default='000000', comment='租户编号')
    title = Column(String(50), default='', comment='模块标题')
    business_type = Column(Integer, default=0, comment='业务类型（0其它 1新增 2修改 3删除）')
    method = Column(String(100), default='', comment='方法名称')
    request_method = Column(String(10), default='', comment='请求方式')
    operator_type = Column(Integer, default=0, comment='操作类别（0其它 1后台用户 2手机端用户）')
    oper_name = Column(String(50), default='', comment='操作人员')
    dept_name = Column(String(50), default='', comment='部门名称')
    oper_url = Column(String(255), default='', comment='请求URL')
    oper_ip = Column(String(128), default='', comment='主机地址')
    oper_location = Column(String(255), default='', comment='操作地点')
    oper_param = Column(Text, default='', comment='请求参数')
    json_result = Column(Text, default='', comment='返回参数')
    status = Column(Integer, default=0, comment='操作状态（0正常 1异常）')
    error_msg = Column(String(2000), default='', comment='错误消息')
    oper_time = Column(DateTime, comment='操作时间')
    cost_time = Column(BigInteger, default=0, comment='消耗时间')

    class Config:
        orm_mode = True

'''字典类型表'''
class SysDictType(Base):
    __tablename__ = 'sys_dict_type'

    dict_id = Column(BigInteger, primary_key=True,autoincrement=True, comment='字典主键')
    tenant_id = Column(String(20), default='000000', comment='租户编号')
    dict_name = Column(String(100), default='', comment='字典名称')
    dict_type = Column(String(100), default='', comment='字典类型')
    create_dept = Column(BigInteger, default=None, comment='创建部门')
    create_by = Column(BigInteger, default=None, comment='创建者')
    create_time = Column(DateTime, comment='创建时间')
    update_by = Column(BigInteger, default=None, comment='更新者')
    update_time = Column(DateTime, comment='更新时间')
    remark = Column(String(500), default=None, comment='备注')
    del_flag = Column(String(1), default='0', comment='删除标志（0代表存在 2代表删除）')

    # 定义唯一性约束条件
    __table_args__ = (UniqueConstraint('tenant_id', 'dict_type', name='uq_sys_dict_type_tenant_type'),)

    class Config:
        orm_mode = True

'''字典数据表'''
class SysDictData(Base):
    __tablename__ = 'sys_dict_data'

    dict_code = Column(BigInteger, primary_key=True,autoincrement=True, comment='字典编码')
    tenant_id = Column(String(20), default='000000', comment='租户编号')
    dict_sort = Column(Integer, default=0, comment='字典排序')
    dict_label = Column(String(100), default='', comment='字典标签')
    dict_value = Column(String(100), default='', comment='字典键值')
    dict_type = Column(String(100), default='', comment='字典类型')
    css_class = Column(String(100), default=None, comment='样式属性（其他样式扩展）')
    list_class = Column(String(100), default=None, comment='表格回显样式')
    is_default = Column(CHAR(1), default='N', comment='是否默认（Y是 N否）')
    create_dept = Column(BigInteger, default=None, comment='创建部门')
    create_by = Column(BigInteger, default=None, comment='创建者')
    create_time = Column(DateTime, default=datetime.now, comment='创建时间')
    update_by = Column(BigInteger, default=None, comment='更新者')
    update_time = Column(DateTime, default=datetime.now, onupdate=datetime.now, comment='更新时间')
    remark = Column(String(500), default=None, comment='备注')
    del_flag = Column(String(1), default='0', comment='删除标志（0代表存在 2代表删除）')

    class Config:
        orm_mode = True

'''参数配置表'''
class SysConfig(Base):
    __tablename__ = 'sys_config'

    config_id = Column(BigInteger, primary_key=True,autoincrement=True, comment='参数主键')
    tenant_id = Column(String(20), default='000000', comment='租户编号')
    config_name = Column(String(100), default='', comment='参数名称')
    config_key = Column(String(100), default='', comment='参数键名')
    config_value = Column(String(500), default='', comment='参数键值')
    config_type = Column(CHAR(1), default='N', comment='系统内置（Y是 N否）')
    create_dept = Column(BigInteger, default=None, comment='创建部门')
    create_by = Column(BigInteger, default=None, comment='创建者')
    create_time = Column(DateTime, comment='创建时间')
    update_by = Column(BigInteger, default=None, comment='更新者')
    update_time = Column(DateTime, comment='更新时间')
    remark = Column(String(500), default=None, comment='备注')

    class Config:
        orm_mode = True

'''系统访问记录'''
class SysLoginInfor(Base):
    __tablename__ = 'sys_logininfor'

    info_id = Column(BigInteger, primary_key=True,autoincrement=True, comment='访问ID')
    tenant_id = Column(String(20), default='000000', comment='租户编号')
    user_name = Column(String(50), default='', comment='用户账号')
    client_key = Column(String(32), default='', comment='客户端')
    device_type = Column(String(32), default='', comment='设备类型')
    ipaddr = Column(String(128), default='', comment='登录IP地址')
    login_location = Column(String(255), default='', comment='登录地点')
    browser = Column(String(50), default='', comment='浏览器类型')
    os = Column(String(50), default='', comment='操作系统')
    status = Column(CHAR(1), default='0', comment='登录状态（0成功 1失败）')
    msg = Column(String(255), default='', comment='提示消息')
    login_time = Column(DateTime, comment='访问时间')

    # 定义表的索引（可选，根据需要添加到Base中）
    __table_args__ = (
        # 假设Base已经包含了索引的创建方式
        Index('idx_sys_logininfor_s', 'status'),
        Index('idx_sys_logininfor_lt', 'login_time'),
    )

    class Config:
        orm_mode = True

'''通知公告表'''
class SysNotice(Base):
    __tablename__ = 'sys_notice'

    notice_id = Column(BigInteger, primary_key=True,autoincrement=True, comment='公告ID')
    tenant_id = Column(String(20), default='000000', comment='租户编号')
    notice_title = Column(String(50), nullable=False, comment='公告标题')
    notice_type = Column(CHAR(1), nullable=False, comment='公告类型（1通知 2公告）')
    notice_content = Column(LargeBinary, default=None, comment='公告内容')
    status = Column(CHAR(1), default='0', comment='公告状态（0正常 1关闭）')
    create_dept = Column(BigInteger, default=None, comment='创建部门')
    create_by = Column(BigInteger, default=None, comment='创建者')
    create_time = Column(DateTime, comment='创建时间')
    update_by = Column(BigInteger, default=None, comment='更新者')
    update_time = Column(DateTime, comment='更新时间')
    remark = Column(String(255), default=None, comment='备注')

    class Config:
        orm_mode = True

'''代码生成业务表'''
class GenTable(Base):
    __tablename__ = 'gen_table'

    table_id = Column(BigInteger, primary_key=True,autoincrement=True, comment='编号')
    data_name = Column(String(200), default='', comment='数据源名称')
    table_name = Column(String(200), default='', comment='表名称')
    table_comment = Column(String(500), default='', comment='表描述')
    sub_table_name = Column(String(64), default=None, comment='关联子表的表名')
    sub_table_fk_name = Column(String(64), default=None, comment='子表关联的外键名')
    class_name = Column(String(100), default='', comment='实体类名称')
    tpl_category = Column(String(200), default='crud', comment='使用的模板（crud单表操作 tree树表操作）')
    package_name = Column(String(100), comment='生成包路径')
    module_name = Column(String(30), comment='生成模块名')
    business_name = Column(String(30), comment='生成业务名')
    function_name = Column(String(50), comment='生成功能名')
    function_author = Column(String(50), comment='生成功能作者')
    gen_type = Column(CHAR(1), default='0', comment='生成代码方式（0zip压缩包 1自定义路径）')
    gen_path = Column(String(200), default='/', comment='生成路径（不填默认项目路径）')
    options = Column(String(1000), comment='其它生成选项')
    create_dept = Column(BigInteger, default=None, comment='创建部门')
    create_by = Column(BigInteger, default=None, comment='创建者')
    create_time = Column(DateTime, comment='创建时间')
    update_by = Column(BigInteger, default=None, comment='更新者')
    update_time = Column(DateTime, comment='更新时间')
    remark = Column(String(500), default=None, comment='备注')

    class Config:
        orm_mode = True

'''代码生成业务表字段'''
class GenTableColumn(Base):
    __tablename__ = 'gen_table_column'

    column_id = Column(BigInteger, primary_key=True,autoincrement=True, comment='编号')
    table_id = Column(BigInteger, comment='归属表编号')
    column_name = Column(String(200), comment='列名称')
    column_comment = Column(String(500), comment='列描述')
    column_type = Column(String(100), comment='列类型')
    java_type = Column(String(500), comment='JAVA类型')
    java_field = Column(String(200), comment='JAVA字段名')
    is_pk = Column(CHAR(1), comment='是否主键（1是）')
    is_increment = Column(CHAR(1), comment='是否自增（1是）')
    is_required = Column(CHAR(1), comment='是否必填（1是）')
    is_insert = Column(CHAR(1), comment='是否为插入字段（1是）')
    is_edit = Column(CHAR(1), comment='是否编辑字段（1是）')
    is_list = Column(CHAR(1), comment='是否列表字段（1是）')
    is_query = Column(CHAR(1), comment='是否查询字段（1是）')
    query_type = Column(String(200), default='EQ', comment='查询方式（等于、不等于、大于、小于、范围）')
    html_type = Column(String(200), comment='显示类型（文本框、文本域、下拉框、复选框、单选框、日期控件）')
    dict_type = Column(String(200), default='', comment='字典类型')
    sort = Column(Integer, comment='排序')
    create_dept = Column(BigInteger, default=None, comment='创建部门')
    create_by = Column(BigInteger, default=None, comment='创建者')
    create_time = Column(DateTime, comment='创建时间')
    update_by = Column(BigInteger, default=None, comment='更新者')
    update_time = Column(DateTime, comment='更新时间')

    class Config:
        orm_mode = True

'''OSS对象存储表'''
class SysOss(Base):
    __tablename__ = 'sys_oss'

    oss_id = Column(BigInteger, primary_key=True,autoincrement=True, comment='对象存储主键')
    tenant_id = Column(String(20), default='000000', comment='租户编号')
    file_name = Column(String(255), default='', nullable=False, comment='文件名')
    original_name = Column(String(255), default='', nullable=False, comment='原名')
    file_suffix = Column(String(10), default='', nullable=False, comment='文件后缀名')
    url = Column(String(500), nullable=False, comment='URL地址')
    create_dept = Column(BigInteger, default=None, comment='创建部门')
    create_time = Column(DateTime, default=None, comment='创建时间')
    create_by = Column(BigInteger, default=None, comment='上传人')
    update_time = Column(DateTime, default=None, comment='更新时间')
    update_by = Column(BigInteger, default=None, comment='更新人')
    service = Column(String(20), default='minio', nullable=False, comment='服务商')

    class Config:
        orm_mode = True

'''对象存储配置表'''
class SysOssConfig(Base):
    __tablename__ = 'sys_oss_config'

    oss_config_id = Column(BigInteger, primary_key=True,autoincrement=True, comment='主键')
    tenant_id = Column(String(20), default='000000', comment='租户编号')
    config_key = Column(String(20), default='', nullable=False, comment='配置key')
    access_key = Column(String(255), default='', comment='accessKey')
    secret_key = Column(String(255), default='', comment='秘钥')
    bucket_name = Column(String(255), default='', comment='桶名称')
    prefix = Column(String(255), default='', comment='前缀')
    endpoint = Column(String(255), default='', comment='访问站点')
    domain = Column(String(255), default='', comment='自定义域名')
    is_https = Column(CHAR(1), default='N', comment='是否https（Y=是,N=否）')
    region = Column(String(255), default='', comment='域')
    access_policy = Column(CHAR(1), nullable=False, default='1', comment='桶权限类型(0=private 1=public 2=custom)')
    status = Column(CHAR(1), default='1', comment='是否默认（0=是,1=否）')
    ext1 = Column(String(255), default='', comment='扩展字段')
    create_dept = Column(BigInteger, default=None, comment='创建部门')
    create_by = Column(BigInteger, default=None, comment='创建者')
    create_time = Column(DateTime, default=None, comment='创建时间')
    update_by = Column(BigInteger, default=None, comment='更新者')
    update_time = Column(DateTime, default=None, comment='更新时间')
    remark = Column(String(500), default=None, comment='备注')

    class Config:
        orm_mode = True

'''系统授权表'''
class SysClient(Base):
    __tablename__ = 'sys_client'

    id = Column(BigInteger, primary_key=True,autoincrement=True, comment='id')
    client_id = Column(String(64), default=None, comment='客户端id')
    client_key = Column(String(32), default=None, comment='客户端key')
    client_secret = Column(String(255), default=None, comment='客户端秘钥')
    grant_type = Column(String(255), default=None, comment='授权类型')
    device_type = Column(String(32), default=None, comment='设备类型')
    active_timeout = Column(Integer, default=1800, comment='token活跃超时时间')
    timeout = Column(Integer, default=604800, comment='token固定超时')
    status = Column(CHAR(1), default='0', comment='状态（0正常 1停用）')
    del_flag = Column(CHAR(1), default='0', comment='删除标志（0代表存在 2代表删除）')
    create_dept = Column(BigInteger, default=None, comment='创建部门')
    create_by = Column(BigInteger, default=None, comment='创建者')
    create_time = Column(DateTime, default=None, comment='创建时间')
    update_by = Column(BigInteger, default=None, comment='更新者')
    update_time = Column(DateTime, default=None, comment='更新时间')

    class Config:
        orm_mode = True

'''测试单表'''
class TestDemo(Base):
    __tablename__ = 'test_demo'

    id = Column(BigInteger, primary_key=True,autoincrement=True, comment='主键')
    tenant_id = Column(String(20), default='000000', comment='租户编号')
    dept_id = Column(BigInteger, default=None, comment='部门id')
    user_id = Column(BigInteger, default=None, comment='用户id')
    order_num = Column(Integer, default=0, comment='排序号')
    test_key = Column(String(255), default=None, comment='key键')
    value = Column(String(255), default=None, comment='值')
    version = Column(Integer, default=0, comment='版本')
    create_dept = Column(BigInteger, default=None, comment='创建部门')
    create_time = Column(DateTime, default=None, comment='创建时间')
    create_by = Column(BigInteger, default=None, comment='创建人')
    update_time = Column(DateTime, default=None, comment='更新时间')
    update_by = Column(BigInteger, default=None, comment='更新人')
    del_flag = Column(Integer, default=0, comment='删除标志')

    class Config:
        orm_mode = True

'''测试树表'''
class TestTree(Base):
    __tablename__ = 'test_tree'

    id = Column(BigInteger, primary_key=True,autoincrement=True, comment='主键')
    tenant_id = Column(String(20), default='000000', comment='租户编号')
    parent_id = Column(BigInteger, default=0, comment='父id')
    dept_id = Column(BigInteger, default=None, comment='部门id')
    user_id = Column(BigInteger, default=None, comment='用户id')
    tree_name = Column(String(255), default=None, comment='树节点名称')
    version = Column(Integer, default=0, comment='版本')
    create_dept = Column(BigInteger, default=None, comment='创建部门')
    create_time = Column(DateTime, default=None, comment='创建时间')
    create_by = Column(BigInteger, default=None, comment='创建人')
    update_time = Column(DateTime, default=None, comment='更新时间')
    update_by = Column(BigInteger, default=None, comment='更新人')
    del_flag = Column(Integer, default=0, comment='删除标志')

    class Config:
        orm_mode = True

'''flowable'''
'''请假申请表'''
class TestLeave(Base):
    __tablename__ = 'test_leave'

    id = Column(BigInteger, primary_key=True, comment='主键')
    leave_type = Column(String(255), nullable=False, comment='请假类型')
    start_date = Column(DateTime, nullable=False, comment='开始时间')
    end_date = Column(DateTime, nullable=False, comment='结束时间')
    leave_days = Column(Integer, nullable=False, comment='请假天数')
    remark = Column(String(255), comment='请假原因')
    status = Column(String(255), comment='状态')
    create_dept = Column(BigInteger, comment='创建部门')
    create_by = Column(BigInteger, comment='创建者')
    create_time = Column(DateTime, comment='创建时间')
    update_by = Column(BigInteger, comment='更新者')
    update_time = Column(DateTime, comment='更新时间')
    tenant_id = Column(String(20), comment='租户编号')

    class Config:
        orm_mode = True

'''流程分类'''
class WfCategory(Base):
    __tablename__ = 'wf_category'

    id = Column(BigInteger, primary_key=True, comment='主键')
    category_name = Column(String(255), comment='分类名称')
    category_code = Column(String(255), comment='分类编码')
    parent_id = Column(BigInteger, comment='父级id')
    sort_num = Column(Integer, comment='排序')
    tenant_id = Column(String(20), comment='租户编号')
    create_dept = Column(BigInteger, comment='创建部门')
    create_by = Column(BigInteger, comment='创建者')
    create_time = Column(DateTime, comment='创建时间')
    update_by = Column(BigInteger, comment='更新者')
    update_time = Column(DateTime, comment='更新时间')

    # 定义唯一性约束条件
    __table_args__ = (UniqueConstraint('category_code', name='uni_category_code'),)

    class Config:
        orm_mode = True

'''节点审批记录'''
class WfTaskBackNode(Base):
    __tablename__ = 'wf_task_back_node'

    id = Column(BigInteger, primary_key=True, comment='主键')
    node_id = Column(String(255), nullable=False, comment='节点id')
    node_name = Column(String(255), nullable=False, comment='节点名称')
    order_no = Column(Integer, nullable=False, comment='排序')
    instance_id = Column(String(255), comment='流程实例id')
    task_type = Column(String(255), nullable=False, comment='节点类型')
    assignee = Column(String(2000), nullable=False, comment='审批人')
    tenant_id = Column(String(20), comment='租户编号')
    create_dept = Column(BigInteger, comment='创建部门')
    create_by = Column(BigInteger, comment='创建者')
    create_time = Column(DateTime, comment='创建时间')
    update_by = Column(BigInteger, comment='更新者')
    update_time = Column(DateTime, comment='更新时间')

    class Config:
        orm_mode = True

'''流程定义配置'''
class WfDefinitionConfig(Base):
    __tablename__ = 'wf_definition_config'

    id = Column(BigInteger, primary_key=True, comment='主键')
    table_name = Column(String(255), nullable=False, comment='表名')
    definition_id = Column(String(255), nullable=False, comment='流程定义ID')
    process_key = Column(String(255), nullable=False, comment='流程KEY')
    version = Column(Integer, nullable=False, comment='流程版本')
    create_dept = Column(BigInteger, comment='创建部门')
    create_by = Column(BigInteger, comment='创建者')
    create_time = Column(DateTime, comment='创建时间')
    update_by = Column(BigInteger, comment='更新者')
    update_time = Column(DateTime, comment='更新时间')
    remark = Column(String(500), default='', comment='备注')
    tenant_id = Column(String(20), comment='租户编号')

    # 定义唯一性约束条件
    __table_args__ = (UniqueConstraint('definition_id', name='uni_definition_id'),)

    class Config:
        orm_mode = True

'''表单管理'''
class WfFormManage(Base):
    __tablename__ = 'wf_form_manage'

    id = Column(BigInteger, primary_key=True, comment='主键')
    form_name = Column(String(255), nullable=False, comment='表单名称')
    form_type = Column(String(255), nullable=False, comment='表单类型')
    router = Column(String(255), nullable=False, comment='路由地址/表单ID')
    remark = Column(String(500), comment='备注')
    tenant_id = Column(String(20), comment='租户编号')
    create_dept = Column(BigInteger, comment='创建部门')
    create_by = Column(BigInteger, comment='创建者')
    create_time = Column(DateTime, comment='创建时间')
    update_by = Column(BigInteger, comment='更新者')
    update_time = Column(DateTime, comment='更新时间')

    class Config:
        orm_mode = True

'''节点配置'''
class WfNodeConfig(Base):
    __tablename__ = 'wf_node_config'

    id = Column(BigInteger, primary_key=True, comment='主键')
    form_id = Column(BigInteger, comment='表单id')
    form_type = Column(String(255), comment='表单类型')
    node_name = Column(String(255), nullable=False, comment='节点名称')
    node_id = Column(String(255), nullable=False, comment='节点id')
    definition_id = Column(String(255), nullable=False, comment='流程定义id')
    apply_user_task = Column(CHAR(1), default='0', comment='是否为申请人节点（0是 1否）')
    create_dept = Column(BigInteger, comment='创建部门')
    create_by = Column(BigInteger, comment='创建者')
    create_time = Column(DateTime, comment='创建时间')
    update_by = Column(BigInteger, comment='更新者')
    update_time = Column(DateTime, comment='更新时间')
    tenant_id = Column(String(20), comment='租户编号')

    class Config:
        orm_mode = True

'''snail_job'''
'''命名空间'''
class SjNamespace(Base):
    __tablename__ = 'sj_namespace'

    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='主键')
    name = Column(String(64), nullable=False, comment='名称')
    unique_id = Column(String(64), nullable=False, comment='唯一id')
    description = Column(String(256), nullable=False, default='', comment='描述')
    deleted = Column(TINYINT(4), nullable=False, default=0, comment='逻辑删除 1、删除')
    create_dt = Column(DateTime, nullable=False, default=datetime.now, comment='创建时间')
    update_dt = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment='修改时间')

    # 定义索引
    __table_args__ = (
        Index('idx_name', 'name'),
        UniqueConstraint('unique_id', name='uk_unique_id'),
    )

    class Config:
        orm_mode = True

'''组配置'''
class SjGroupConfig(Base):
    __tablename__ = 'sj_group_config'

    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='主键')
    namespace_id = Column(String(64), nullable=False, default='764d604ec6fc45f68cd92514c40e9e1a', comment='命名空间id')
    group_name = Column(String(64), nullable=False, default='', comment='组名称')
    description = Column(String(256), nullable=False, default='', comment='组描述')
    token = Column(String(64), nullable=False, default='SJ_cKqBTPzCsWA3VyuCfFoccmuIEGXjr5KT', comment='token')
    group_status = Column(TINYINT(4), nullable=False, default=0, comment='组状态 0、未启用 1、启用')
    version = Column(Integer, nullable=False, comment='版本号')
    group_partition = Column(Integer, nullable=False, comment='分区')
    id_generator_mode = Column(TINYINT(4), nullable=False, default=1, comment='唯一id生成模式 默认号段模式')
    init_scene = Column(TINYINT(4), nullable=False, default=0, comment='是否初始化场景 0:否 1:是')
    bucket_index = Column(Integer, nullable=False, default=0, comment='bucket')
    create_dt = Column(DateTime, nullable=False, default=datetime.now, comment='创建时间')
    update_dt = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment='修改时间')

    # 定义唯一性约束条件
    __table_args__ = (UniqueConstraint('namespace_id', 'group_name', name='uk_namespace_id_group_name'),)

    class Config:
        orm_mode = True

'''通知配置'''
class SjNotifyConfig(Base):
    __tablename__ = 'sj_notify_config'

    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='主键')
    namespace_id = Column(String(64), nullable=False, default='764d604ec6fc45f68cd92514c40e9e1a', comment='命名空间id')
    group_name = Column(String(64), nullable=False, comment='组名称')
    business_id = Column(String(64), nullable=False, comment='业务id (job_id或workflow_id或scene_name)')
    system_task_type = Column(TINYINT(4), nullable=False, default=3, comment='任务类型')
    notify_status = Column(TINYINT(4), nullable=False, default=0, comment='通知状态')
    recipient_ids = Column(String(128), nullable=False, comment='接收人id列表')
    notify_threshold = Column(Integer, nullable=False, default=0, comment='通知阈值')
    notify_scene = Column(TINYINT(4), nullable=False, default=0, comment='通知场景')
    rate_limiter_status = Column(TINYINT(4), nullable=False, default=0, comment='限流状态')
    rate_limiter_threshold = Column(Integer, nullable=False, default=0, comment='每秒限流阈值')
    description = Column(String(256), nullable=False, default='', comment='描述')
    create_dt = Column(DateTime, nullable=False, default=datetime.now, comment='创建时间')
    update_dt = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment='修改时间')

    # 定义索引
    __table_args__ = (
        Index('idx_namespace_id_group_name_scene_name', 'namespace_id', 'group_name', 'business_id'),)

    class Config:
        orm_mode = True

'''告警通知接收人'''
class SjNotifyRecipient(Base):
    __tablename__ = 'sj_notify_recipient'

    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='主键')
    namespace_id = Column(String(64), nullable=False, default='764d604ec6fc45f68cd92514c40e9e1a', comment='命名空间id')
    recipient_name = Column(String(64), nullable=False, comment='接收人名称')
    notify_type = Column(TINYINT(4), nullable=False, default=0, comment='通知类型')
    notify_attribute = Column(String(512), nullable=False, comment='配置属性')
    description = Column(String(256), nullable=False, default='', comment='描述')
    create_dt = Column(DateTime, nullable=False, default=datetime.now, comment='创建时间')
    update_dt = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment='修改时间')

    # 定义索引
    __table_args__ = (
        Index('idx_namespace_id', 'namespace_id'),
    )

    class Config:
        orm_mode = True

'''死信队列表'''
class SjRetryDeadLetter(Base):
    __tablename__ = 'sj_retry_dead_letter_0'

    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='主键')
    namespace_id = Column(String(64), nullable=False, default='764d604ec6fc45f68cd92514c40e9e1a', comment='命名空间id')
    unique_id = Column(String(64), nullable=False, comment='同组下id唯一')
    group_name = Column(String(64), nullable=False, comment='组名称')
    scene_name = Column(String(64), nullable=False, comment='场景名称')
    idempotent_id = Column(String(64), nullable=False, comment='幂等id')
    biz_no = Column(String(64), nullable=False, default='', comment='业务编号')
    executor_name = Column(String(512), nullable=False, default='', comment='执行器名称')
    args_str = Column(Text, nullable=False, comment='执行方法参数')
    ext_attrs = Column(Text, nullable=False, comment='扩展字段')
    task_type = Column(TINYINT(4), nullable=False, default=1, comment='任务类型')
    create_dt = Column(DateTime, nullable=False, default=datetime.now, comment='创建时间')

    # 定义索引和唯一性约束条件
    __table_args__ = (
        Index('idx_namespace_id_group_name_scene_name', 'namespace_id', 'group_name', 'scene_name'),
        Index('idx_idempotent_id', 'idempotent_id'),
        Index('idx_biz_no', 'biz_no'),
        Index('idx_create_dt', 'create_dt'),
        UniqueConstraint('namespace_id', 'group_name', 'unique_id', name='uk_namespace_id_group_name_unique_id'),
    )

    class Config:
        orm_mode = True

'''任务表'''
class SjRetryTask(Base):
    __tablename__ = 'sj_retry_task_0'

    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='主键')
    namespace_id = Column(String(64), nullable=False, default='764d604ec6fc45f68cd92514c40e9e1a', comment='命名空间id')
    unique_id = Column(String(64), nullable=False, comment='同组下id唯一')
    group_name = Column(String(64), nullable=False, comment='组名称')
    scene_name = Column(String(64), nullable=False, comment='场景名称')
    idempotent_id = Column(String(64), nullable=False, comment='幂等id')
    biz_no = Column(String(64), nullable=False, default='', comment='业务编号')
    executor_name = Column(String(512), nullable=False, default='', comment='执行器名称')
    args_str = Column(Text, nullable=False, comment='执行方法参数')
    ext_attrs = Column(Text, nullable=False, comment='扩展字段')
    next_trigger_at = Column(DateTime, nullable=False, comment='下次触发时间')
    retry_count = Column(Integer, nullable=False, default=0, comment='重试次数')
    retry_status = Column(TINYINT(4), nullable=False, default=0, comment='重试状态')
    task_type = Column(TINYINT(4), nullable=False, default=1, comment='任务类型')
    create_dt = Column(DateTime, nullable=False, default=datetime.now, comment='创建时间')
    update_dt = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment='修改时间')

    # 定义索引和唯一性约束条件
    __table_args__ = (
        Index('idx_namespace_id_group_name_scene_name', 'namespace_id', 'group_name', 'scene_name'),
        Index('idx_namespace_id_group_name_task_type', 'namespace_id', 'group_name', 'task_type'),
        Index('idx_namespace_id_group_name_retry_status', 'namespace_id', 'group_name', 'retry_status'),
        Index('idx_idempotent_id', 'idempotent_id'),
        Index('idx_biz_no', 'biz_no'),
        Index('idx_create_dt', 'create_dt'),
        UniqueConstraint('namespace_id', 'group_name', 'unique_id', name='uk_name_unique_id'),
    )

    class Config:
        orm_mode = True

'''任务日志基础信息表'''
class SjRetryTaskLog(Base):
    __tablename__ = 'sj_retry_task_log'

    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='主键')
    namespace_id = Column(String(64), nullable=False, default='764d604ec6fc45f68cd92514c40e9e1a', comment='命名空间id')
    unique_id = Column(String(64), nullable=False, comment='同组下id唯一')
    group_name = Column(String(64), nullable=False, comment='组名称')
    scene_name = Column(String(64), nullable=False, comment='场景名称')
    idempotent_id = Column(String(64), nullable=False, comment='幂等id')
    biz_no = Column(String(64), nullable=False, default='', comment='业务编号')
    executor_name = Column(String(512), nullable=False, default='', comment='执行器名称')
    args_str = Column(Text, nullable=False, comment='执行方法参数')
    ext_attrs = Column(Text, nullable=False, comment='扩展字段')
    retry_status = Column(TINYINT(4), nullable=False, default=0, comment='重试状态')
    task_type = Column(TINYINT(4), nullable=False, default=1, comment='任务类型')
    create_dt = Column(DateTime, nullable=False, default=datetime.now, comment='创建时间')
    update_dt = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment='修改时间')

    # 定义索引
    __table_args__ = (
        Index('idx_group_name_scene_name', 'namespace_id', 'group_name', 'scene_name'),
        Index('idx_retry_status', 'retry_status'),
        Index('idx_idempotent_id', 'idempotent_id'),
        Index('idx_unique_id', 'unique_id'),
        Index('idx_biz_no', 'biz_no'),
        Index('idx_create_dt', 'create_dt'),
    )

    class Config:
        orm_mode = True

'''任务调度日志信息记录表'''
class SjRetryTaskLogMessage(Base):
    __tablename__ = 'sj_retry_task_log_message'

    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='主键')
    namespace_id = Column(String(64), nullable=False, default='764d604ec6fc45f68cd92514c40e9e1a', comment='命名空间id')
    group_name = Column(String(64), nullable=False, comment='组名称')
    unique_id = Column(String(64), nullable=False, comment='同组下id唯一')
    message = Column(Text, nullable=False, comment='异常信息')
    log_num = Column(Integer, nullable=False, default=1, comment='日志数量')
    real_time = Column(BigInteger, nullable=False, default=0, comment='上报时间')
    create_dt = Column(DateTime, nullable=False, default=datetime.now, comment='创建时间')

    # 定义索引
    __table_args__ = (
        Index('idx_namespace_id_group_name_unique_id', 'namespace_id', 'group_name', 'unique_id'),
        Index('idx_create_dt', 'create_dt'),
    )

    class Config:
        orm_mode = True

'''场景配置'''
class SjRetrySceneConfig(Base):
    __tablename__ = 'sj_retry_scene_config'

    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='主键')
    namespace_id = Column(String(64), nullable=False, default='764d604ec6fc45f68cd92514c40e9e1a', comment='命名空间id')
    scene_name = Column(String(64), nullable=False, comment='场景名称')
    group_name = Column(String(64), nullable=False, comment='组名称')
    scene_status = Column(TINYINT(4), nullable=False, default=0, comment='组状态')
    max_retry_count = Column(Integer, nullable=False, default=5, comment='最大重试次数')
    back_off = Column(TINYINT(4), nullable=False, default=1, comment='重试间隔类型')
    trigger_interval = Column(String(16), nullable=False, default='', comment='间隔时长')
    deadline_request = Column(BigInteger, nullable=False, default=60000, comment='Deadline Request 调用链超时 单位毫秒')
    executor_timeout = Column(Integer, nullable=False, default=5, comment='任务执行超时时间，单位秒')
    route_key = Column(TINYINT(4), nullable=False, default=4, comment='路由策略')
    description = Column(String(256), nullable=False, default='', comment='描述')
    create_dt = Column(DateTime, nullable=False, default=datetime.now, comment='创建时间')
    update_dt = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment='修改时间')

    # 定义唯一性约束条件
    __table_args__ = (
        UniqueConstraint('namespace_id', 'group_name', 'scene_name', name='uk_namespace_id_group_name_scene_name'),
    )

    class Config:
        orm_mode = True

'''服务器节点'''
class SjServerNode(Base):
    __tablename__ = 'sj_server_node'

    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='主键')
    namespace_id = Column(String(64), nullable=False, default='764d604ec6fc45f68cd92514c40e9e1a', comment='命名空间id')
    group_name = Column(String(64), nullable=False, comment='组名称')
    host_id = Column(String(64), nullable=False, comment='主机id')
    host_ip = Column(String(64), nullable=False, comment='机器ip')
    host_port = Column(Integer, nullable=False, comment='机器端口')
    expire_at = Column(DateTime, nullable=False, comment='过期时间')
    node_type = Column(TINYINT(4), nullable=False, comment='节点类型')
    ext_attrs = Column(String(256), nullable=True, default='', comment='扩展字段')
    create_dt = Column(DateTime, nullable=False, default=datetime.now, comment='创建时间')
    update_dt = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment='修改时间')

    # 定义索引和唯一性约束条件
    __table_args__ = (
        Index('idx_namespace_id_group_name', 'namespace_id', 'group_name'),
        Index('idx_expire_at_node_type', 'expire_at', 'node_type'),
        UniqueConstraint('host_id', 'host_ip', name='uk_host_id_host_ip'),
    )


    class Config:
        orm_mode = True

'''锁定表'''
class SjDistributedLock(Base):
    __tablename__ = 'sj_distributed_lock'

    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='主键')
    name = Column(String(64), nullable=False, comment='锁名称')
    lock_until = Column(TIMESTAMP(3), nullable=False, default=datetime.now, onupdate=datetime.now, comment='锁定时长')
    locked_at = Column(TIMESTAMP(3), nullable=False, default=datetime.now, comment='锁定时间')
    locked_by = Column(String(255), nullable=False, comment='锁定者')
    create_dt = Column(DateTime, nullable=False, default=datetime.now, comment='创建时间')
    update_dt = Column(DateTime, nullable=False, default=datetime.now, comment='修改时间')

    # 定义唯一性约束条件
    __table_args__ = (
        UniqueConstraint('name', name='uk_name'),
    )

    class Config:
        orm_mode = True

'''系统用户表'''
class SjSystemUser(Base):
    __tablename__ = 'sj_system_user'

    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='主键')
    username = Column(String(64), nullable=False, unique=True, comment='账号')  # 唯一约束在 SQLAlchemy 中用 unique=True 表示
    password = Column(String(128), nullable=False, comment='密码')
    role = Column(TINYINT(4), nullable=False, default=0, comment='角色')
    create_dt = Column(DateTime, nullable=False, default=datetime.now, comment='创建时间')
    update_dt = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment='修改时间')

    class Config:
        orm_mode = True

'''系统用户权限表'''
class SjSystemUserPermission(Base):
    __tablename__ = 'sj_system_user_permission'

    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='主键')
    group_name = Column(String(64), nullable=False, comment='组名称')
    namespace_id = Column(String(64), nullable=False, default='764d604ec6fc45f68cd92514c40e9e1a', comment='命名空间id')
    system_user_id = Column(BigInteger, nullable=False, comment='系统用户id')
    create_dt = Column(DateTime, nullable=False, default=datetime.now, comment='创建时间')
    update_dt = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment='修改时间')

    # 定义唯一性约束条件
    __table_args__ = (
        UniqueConstraint('namespace_id', 'group_name', 'system_user_id', name='uk_namespace_id_group_name_system_user_id'),
    )

    class Config:
        orm_mode = True

'''号段模式序号ID分配表'''
class SjSequenceAlloc(Base):
    __tablename__ = 'sj_sequence_alloc'

    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='主键')
    namespace_id = Column(String(64), nullable=False, default='764d604ec6fc45f68cd92514c40e9e1a', comment='命名空间id')
    group_name = Column(String(64), nullable=False, default='', comment='组名称')
    max_id = Column(BigInteger, nullable=False, default=1, comment='最大id')
    step = Column(Integer, nullable=False, default=100, comment='步长')
    update_dt = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment='更新时间')

    # 定义唯一性约束条件
    __table_args__ = (
        UniqueConstraint('namespace_id', 'group_name', name='uk_namespace_id_group_name'),
    )


    class Config:
        orm_mode = True

'''任务信息'''
class SjJob(Base):
    __tablename__ = 'sj_job'

    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='主键')
    namespace_id = Column(String(64), nullable=False, default='764d604ec6fc45f68cd92514c40e9e1a', comment='命名空间id')
    group_name = Column(String(64), nullable=False, comment='组名称')
    job_name = Column(String(64), nullable=False, comment='名称')
    args_str = Column(Text, default=None, comment='执行方法参数')
    args_type = Column(TINYINT(4), nullable=False, default=1, comment='参数类型')
    next_trigger_at = Column(BigInteger, nullable=False, comment='下次触发时间')
    job_status = Column(TINYINT(4), nullable=False, default=1, comment='任务状态')
    task_type = Column(TINYINT(4), nullable=False, default=1, comment='任务类型')
    route_key = Column(TINYINT(4), nullable=False, default=4, comment='路由策略')
    executor_type = Column(TINYINT(4), nullable=False, default=1, comment='执行器类型')
    executor_info = Column(String(255), default=None, comment='执行器名称')
    trigger_type = Column(TINYINT(4), nullable=False, comment='触发类型')
    trigger_interval = Column(String(255), nullable=False, comment='间隔时长')
    block_strategy = Column(TINYINT(4), nullable=False, default=1, comment='阻塞策略')
    executor_timeout = Column(Integer, nullable=False, default=0, comment='任务执行超时时间')
    max_retry_times = Column(Integer, nullable=False, default=0, comment='最大重试次数')
    parallel_num = Column(Integer, nullable=False, default=1, comment='并行数')
    retry_interval = Column(Integer, nullable=False, default=0, comment='重试间隔(s)')
    bucket_index = Column(Integer, nullable=False, default=0, comment='bucket')
    resident = Column(TINYINT(4), nullable=False, default=0, comment='是否是常驻任务')
    description = Column(String(256), nullable=False, default='', comment='描述')
    ext_attrs = Column(String(256), nullable=True, default='', comment='扩展字段')
    deleted = Column(TINYINT(4), nullable=False, default=0, comment='逻辑删除')
    create_dt = Column(DateTime, nullable=False, default=datetime.now, comment='创建时间')
    update_dt = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment='修改时间')

    # 定义索引
    __table_args__ = (
        Index('idx_namespace_id_group_name', 'namespace_id', 'group_name'),
        Index('idx_job_status_bucket_index', 'job_status', 'bucket_index'),
        Index('idx_create_dt', 'create_dt'),
    )


    class Config:
        orm_mode = True

'''调度日志'''
class SjJobLogMessage(Base):
    __tablename__ = 'sj_job_log_message'

    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='主键')
    namespace_id = Column(String(64), nullable=False, default='764d604ec6fc45f68cd92514c40e9e1a', comment='命名空间id')
    group_name = Column(String(64), nullable=False, comment='组名称')
    job_id = Column(BigInteger, nullable=False, comment='任务信息id')
    task_batch_id = Column(BigInteger, nullable=False, comment='任务批次id')
    task_id = Column(BigInteger, nullable=False, comment='调度任务id')
    message = Column(Text, nullable=False, comment='调度信息')
    log_num = Column(Integer, nullable=False, default=1, comment='日志数量')
    real_time = Column(BigInteger, nullable=False, default=0, comment='上报时间')
    ext_attrs = Column(String(256), nullable=True, default='', comment='扩展字段')
    create_dt = Column(DateTime, nullable=False, default=datetime.now, comment='创建时间')

    # 定义索引
    __table_args__ = (
        Index('idx_task_batch_id_task_id', 'task_batch_id', 'task_id'),
        Index('idx_create_dt', 'create_dt'),
        Index('idx_namespace_id_group_name', 'namespace_id', 'group_name'),
    )

    class Config:
        orm_mode = True

'''任务实例'''
class SjJobTask(Base):
    __tablename__ = 'sj_job_task'

    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='主键')
    namespace_id = Column(String(64), nullable=False, default='764d604ec6fc45f68cd92514c40e9e1a', comment='命名空间id')
    group_name = Column(String(64), nullable=False, comment='组名称')
    job_id = Column(BigInteger, nullable=False, comment='任务信息id')
    task_batch_id = Column(BigInteger, nullable=False, comment='调度任务id')
    parent_id = Column(BigInteger, nullable=False, default=0, comment='父执行器id')
    task_status = Column(TINYINT(4), nullable=False, default=0, comment='执行的状态')
    retry_count = Column(Integer, nullable=False, default=0, comment='重试次数')
    client_info = Column(String(128), default=None, comment='客户端地址')
    result_message = Column(Text, nullable=False, comment='执行结果')
    args_str = Column(Text, default=None, comment='执行方法参数')
    args_type = Column(TINYINT(4), nullable=False, default=1, comment='参数类型')
    ext_attrs = Column(String(256), nullable=True, default='', comment='扩展字段')
    create_dt = Column(DateTime, nullable=False, default=datetime.now, comment='创建时间')
    update_dt = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment='修改时间')

    # 定义索引
    __table_args__ = (
        Index('idx_task_batch_id_task_status', 'task_batch_id', 'task_status'),
        Index('idx_create_dt', 'create_dt'),
        Index('idx_namespace_id_group_name', 'namespace_id', 'group_name'),
    )

    class Config:
        orm_mode = True

'''任务批次'''
class SjJobTaskBatch(Base):
    __tablename__ = 'sj_job_task_batch'

    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='主键')
    namespace_id = Column(String(64), nullable=False, default='764d604ec6fc45f68cd92514c40e9e1a', comment='命名空间id')
    group_name = Column(String(64), nullable=False, comment='组名称')
    job_id = Column(BigInteger, nullable=False, comment='任务id')
    workflow_node_id = Column(BigInteger, nullable=False, default=0, comment='工作流节点id')
    parent_workflow_node_id = Column(BigInteger, nullable=False, default=0, comment='工作流任务父批次id')
    workflow_task_batch_id = Column(BigInteger, nullable=False, default=0, comment='工作流任务批次id')
    task_batch_status = Column(TINYINT(4), nullable=False, default=0, comment='任务批次状态')
    operation_reason = Column(TINYINT(4), nullable=False, default=0, comment='操作原因')
    execution_at = Column(BigInteger, nullable=False, default=0, comment='任务执行时间')
    system_task_type = Column(TINYINT(4), nullable=False, default=3, comment='任务类型')
    parent_id = Column(String(64), nullable=False, default='', comment='父节点')
    ext_attrs = Column(String(256), nullable=True, default='', comment='扩展字段')
    deleted = Column(TINYINT(4), nullable=False, default=0, comment='逻辑删除')
    create_dt = Column(DateTime, nullable=False, default=datetime.now, comment='创建时间')
    update_dt = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment='修改时间')

    # 定义索引
    __table_args__ = (
        Index('idx_job_id_task_batch_status', 'job_id', 'task_batch_status'),
        Index('idx_create_dt', 'create_dt'),
        Index('idx_namespace_id_group_name', 'namespace_id', 'group_name'),
        Index('idx_workflow_task_batch_id_workflow_node_id', 'workflow_task_batch_id', 'workflow_node_id'),
    )

    class Config:
        orm_mode = True

'''DashBoard_Job'''
class SjJobSummary(Base):
    __tablename__ = 'sj_job_summary'

    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='主键')
    namespace_id = Column(String(64), nullable=False, default='764d604ec6fc45f68cd92514c40e9e1a', comment='命名空间id')
    group_name = Column(String(64), nullable=False, default='', comment='组名称')
    business_id = Column(BigInteger, nullable=False, comment='业务id')
    system_task_type = Column(TINYINT(4), nullable=False, default=3, comment='任务类型')
    trigger_at = Column(DateTime, nullable=False, default=datetime.now, comment='统计时间')
    success_num = Column(Integer, nullable=False, default=0, comment='执行成功-日志数量')
    fail_num = Column(Integer, nullable=False, default=0, comment='执行失败-日志数量')
    fail_reason = Column(String(512), nullable=False, default='', comment='失败原因')
    stop_num = Column(Integer, nullable=False, default=0, comment='执行停止-日志数量')
    stop_reason = Column(String(512), nullable=False, default='', comment='停止原因')
    cancel_num = Column(Integer, nullable=False, default=0, comment='执行取消-日志数量')
    cancel_reason = Column(String(512), nullable=False, default='', comment='取消原因')
    create_dt = Column(DateTime, nullable=False, default=datetime.now, comment='创建时间')
    update_dt = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment='修改时间')

    # 定义索引和唯一性约束条件
    __table_args__ = (
        Index('idx_namespace_id_group_name_business_id', 'namespace_id', 'group_name', 'business_id'),
        UniqueConstraint('trigger_at', 'system_task_type', 'business_id', name='uk_trigger_at_system_task_type_business_id'),
    )

    class Config:
        orm_mode = True

'''DashBoard_Retry'''
class SjRetrySummary(Base):
    __tablename__ = 'sj_retry_summary'

    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='主键')
    namespace_id = Column(String(64), nullable=False, default='764d604ec6fc45f68cd92514c40e9e1a', comment='命名空间id')
    group_name = Column(String(64), nullable=False, default='', comment='组名称')
    scene_name = Column(String(50), nullable=False, default='', comment='场景名称')
    trigger_at = Column(DateTime, nullable=False, default=datetime.now, comment='统计时间')
    running_num = Column(Integer, nullable=False, default=0, comment='重试中-日志数量')
    finish_num = Column(Integer, nullable=False, default=0, comment='重试完成-日志数量')
    max_count_num = Column(Integer, nullable=False, default=0, comment='重试到达最大次数-日志数量')
    suspend_num = Column(Integer, nullable=False, default=0, comment='暂停重试-日志数量')
    create_dt = Column(DateTime, nullable=False, default=datetime.now, comment='创建时间')
    update_dt = Column(DateTime, nullable=False, onupdate=datetime.now, comment='修改时间')

    # 定义索引和唯一性约束条件
    __table_args__ = (
        Index('idx_trigger_at', 'trigger_at'),
        UniqueConstraint('namespace_id', 'group_name', 'scene_name', 'trigger_at', name='uk_scene_name_trigger_at'),
    )

    class Config:
        orm_mode = True

'''工作流'''
class SjWorkflow(Base):
    __tablename__ = 'sj_workflow'

    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='主键')
    workflow_name = Column(String(64), nullable=False, comment='工作流名称')
    namespace_id = Column(String(64), nullable=False, default='764d604ec6fc45f68cd92514c40e9e1a', comment='命名空间id')
    group_name = Column(String(64), nullable=False, comment='组名称')
    workflow_status = Column(TINYINT(4), nullable=False, default=1, comment='工作流状态')
    trigger_type = Column(TINYINT(4), nullable=False, comment='触发类型')
    trigger_interval = Column(String(255), nullable=False, comment='间隔时长')
    next_trigger_at = Column(BigInteger, nullable=False, comment='下次触发时间')
    block_strategy = Column(TINYINT(4), nullable=False, default=1, comment='阻塞策略')
    executor_timeout = Column(Integer, nullable=False, default=0, comment='任务执行超时时间')
    description = Column(String(256), nullable=False, default='', comment='描述')
    flow_info = Column(Text, default=None, comment='流程信息')
    bucket_index = Column(Integer, nullable=False, default=0, comment='bucket')
    version = Column(Integer, nullable=False, comment='版本号')
    ext_attrs = Column(String(256), nullable=True, default='', comment='扩展字段')
    deleted = Column(TINYINT(4), nullable=False, default=0, comment='逻辑删除')
    create_dt = Column(DateTime, nullable=False, default=datetime.now, comment='创建时间')
    update_dt = Column(DateTime, nullable=False, default=datetime.now, onupdate=datetime.now, comment='修改时间')

    # 定义索引
    __table_args__ = (
        Index('idx_create_dt', 'create_dt'),
        Index('idx_namespace_id_group_name', 'namespace_id', 'group_name'),
    )

    class Config:
        orm_mode = True

'''工作流节点'''
class SjWorkflowNode(Base):
    __tablename__ = 'sj_workflow_node'

    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='主键')
    namespace_id = Column(String(64), nullable=False, default='764d604ec6fc45f68cd92514c40e9e1a', comment='命名空间id')
    node_name = Column(String(64), nullable=False, comment='节点名称')
    group_name = Column(String(64), nullable=False, comment='组名称')
    job_id = Column(BigInteger, nullable=False, comment='任务信息id')
    workflow_id = Column(BigInteger, nullable=False, comment='工作流ID')
    node_type = Column(TINYINT(4), nullable=False, default=1, comment='节点类型')
    expression_type = Column(TINYINT(4), nullable=False, default=0, comment='表达式类型')
    fail_strategy = Column(TINYINT(4), nullable=False, default=1, comment='失败策略')
    workflow_node_status = Column(TINYINT(4), nullable=False, default=1, comment='工作流节点状态')
    priority_level = Column(Integer, nullable=False, default=1, comment='优先级')
    node_info = Column(Text, default=None, comment='节点信息')
    version = Column(Integer, nullable=False, comment='版本号')
    ext_attrs = Column(String(256), nullable=True, default='', comment='扩展字段')
    deleted = Column(TINYINT(4), nullable=False, default=0, comment='逻辑删除')
    create_dt = Column(DateTime, nullable=False, default=datetime.now, comment='创建时间')
    update_dt = Column(DateTime, nullable=False, onupdate=datetime.now, comment='修改时间')

    # 定义索引
    __table_args__ = (
        Index('idx_create_dt', 'create_dt'),
        Index('idx_namespace_id_group_name', 'namespace_id', 'group_name'),
    )

    class Config:
        orm_mode = True

'''工作流批次'''
class SjWorkflowTaskBatch(Base):
    __tablename__ = 'sj_workflow_task_batch'

    id = Column(BigInteger, primary_key=True, autoincrement=True, comment='主键')
    namespace_id = Column(String(64), nullable=False, default='764d604ec6fc45f68cd92514c40e9e1a', comment='命名空间id')
    group_name = Column(String(64), nullable=False, comment='组名称')
    workflow_id = Column(BigInteger, nullable=False, comment='工作流任务id')
    task_batch_status = Column(TINYINT(4), nullable=False, default=0, comment='任务批次状态')
    operation_reason = Column(TINYINT(4), nullable=False, default=0, comment='操作原因')
    flow_info = Column(Text, default=None, comment='流程信息')
    execution_at = Column(BigInteger, nullable=False, default=0, comment='任务执行时间')
    ext_attrs = Column(String(256), nullable=True, default='', comment='扩展字段')
    deleted = Column(TINYINT(4), nullable=False, default=0, comment='逻辑删除')
    create_dt = Column(DateTime, nullable=False, default=datetime.now, comment='创建时间')
    update_dt = Column(DateTime, nullable=False, onupdate=datetime.now, comment='修改时间')

    # 定义索引
    __table_args__ = (
        Index('idx_workflow_id_task_batch_status', 'workflow_id', 'task_batch_status'),
        Index('idx_create_dt', 'create_dt'),
        Index('idx_namespace_id_group_name', 'namespace_id', 'group_name'),
    )

    class Config:
        orm_mode = True

