增加定时同步组织架构

This commit is contained in:
2026-01-15 19:24:52 +08:00
parent 4a51ec89cc
commit 723c7817b6
17 changed files with 240 additions and 132 deletions

View File

@@ -1,7 +1,7 @@
from sqlmodel import Session, SQLModel, create_engine
from config import Settings
from model.model import Department, Employee, Tenant
from model.model import Department, Employee
PGSQL = Settings().PGSQL
@@ -18,3 +18,9 @@ def get_engine():
def get_session():
return Session(get_engine())
__all__ = [
"Department",
"Employee",
]

View File

@@ -1,85 +1,92 @@
from datetime import datetime
from typing import Optional
from sqlalchemy import JSON, Column, DateTime, func
from sqlmodel import JSON, Field, SQLModel
from sqlalchemy import Column, DateTime, JSON, func
from sqlmodel import Field, SQLModel
class TenantTimeMixin(SQLModel):
tenant_id: int = Field(index=True, description="租户ID")
class Department(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
created_at: datetime = Field(
sa_column=Column(
DateTime(timezone=True),
server_default=func.now(),
nullable=False,
)
wecom_dept_id: str = Field(default=None, index=True)
dname: str = Field(
max_length=100,
description="部门名称",
)
updated_at: datetime = Field(
sa_column=Column(
DateTime(timezone=True),
server_default=func.now(),
onupdate=func.now(),
nullable=False,
)
name_en: str = Field(
max_length=100,
description="部门英文名",
)
department_leader: list[str] = Field(
default_factory=list,
sa_column=Column(JSON),
description="部门负责人 user_id 列表",
)
class Department(TenantTimeMixin, SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
dname: str = Field(max_length=100)
name_en: str = Field(max_length=100)
department_leader: list[int] = Field(default_factory=list, sa_column=Column(JSON))
parent_id: int = Field(default=0, index=True)
parent_id: str = Field(default=0, index=True)
order: int = Field(default=0)
class Employee(TenantTimeMixin, SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
ename: str = Field(max_length=100)
dept_id: int = Field(foreign_key="department.id", index=True)
open_userid: str = Field(max_length=100, index=True)
class Tenant(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
# ========== 基础信息 ==========
name: str = Field(max_length=100, index=True, description="租户名称 / 企业名称")
# ========== 企业微信配置 ==========
wecom_corp_id: str = Field(max_length=64, index=True, description="企业微信 CorpID")
wecom_corp_secret: str = Field(max_length=128, description="企业微信应用 Secret")
wecom_agent_id: int = Field(description="企业微信应用 AgentId")
wecom_token: str = Field(max_length=64, description="企业微信回调 Token")
wecom_encoding_aes_key: str = Field(
max_length=64, description="企业微信回调 EncodingAESKey"
)
# ========== 时间字段 ==========
created_at: datetime = Field(
default_factory=datetime.now,
sa_column=Column(
DateTime(timezone=True),
server_default=func.now(),
nullable=False,
)
),
)
updated_at: datetime = Field(
default_factory=datetime.now,
sa_column=Column(
DateTime(timezone=True),
server_default=func.now(),
onupdate=func.now(),
nullable=False,
)
),
)
class Employee(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
wecom_user_id: str = Field(default=None, index=True)
ename: str = Field(
max_length=100,
description="员工姓名",
)
dept_ids: list[str] = Field(
default_factory=list,
sa_column=Column(JSON),
description="部门ID",
)
open_userid: str | None = Field(
default=None,
max_length=100,
index=True,
description="企业微信 user_id",
)
created_at: datetime = Field(
default_factory=datetime.now,
sa_column=Column(
DateTime(timezone=True),
server_default=func.now(),
nullable=False,
),
)
updated_at: datetime = Field(
default_factory=datetime.now,
sa_column=Column(
DateTime(timezone=True),
server_default=func.now(),
onupdate=func.now(),
nullable=False,
),
)