增加定时同步组织架构

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

@@ -8,7 +8,7 @@ def get_wecom_single() -> Wecom:
wecom = Wecom(Settings().WECOM_CORPID, Settings().WECOM_CORPSECRET)
WECOM_PROXY = Settings().WECOM_PROXY
if WECOM_PROXY and WECOM_PROXY != "":
wecom.BASE_URL = WECOM_PROXY
wecom.BASE_URL = WECOM_PROXY + wecom.BASE_URL
return wecom

0
service/sync/__init__.py Normal file
View File

View File

@@ -0,0 +1,38 @@
from service import get_wecom
from model import get_session, Department
from sqlmodel import delete, select
async def sync_department():
wecom = get_wecom()
department_res = await wecom.get_departments()
with get_session() as session:
# 删除原来的数据
stmt = delete(Department)
session.execute(stmt)
session.commit()
# DepartmentInfoItem(id=302, name='亮剑一部一组-梁鹏涛', name_en=None, department_leader=['LiangPengTao'], parentid=96, order=100000000)
# 插入新的数据
for index, item in enumerate(department_res):
new_dept = Department(
id=index + 1,
wecom_dept_id=str(item.id),
dname=str(item.name),
name_en=str(item.name_en),
department_leader=item.department_leader or [],
parent_id=str(item.parentid),
order=item.order or 0,
)
session.add(new_dept)
session.commit()
def check_department_datebase():
with get_session() as session:
has = session.exec(select(Department)).first()
if not has:
return False
return True

37
service/sync/employee.py Normal file
View File

@@ -0,0 +1,37 @@
from service import get_wecom
from model import get_session, Employee
from sqlmodel import delete, select
async def sync_department_user():
wecom = get_wecom()
dept_res = await wecom.get_departments()
with get_session() as session:
# 删除原来的数据
stmt = delete(Employee)
session.execute(stmt)
session.commit()
index_id = 1
for dept in dept_res:
user_res = await wecom.get_user_in_department(dept.id)
for item in user_res:
new_employee = Employee(
id=index_id,
wecom_user_id=item.userid,
ename=item.name,
dept_ids=[str(i) for i in item.department],
open_userid=item.open_userid,
)
index_id += 1
session.add(new_employee)
session.commit()
def check_employee_datebase():
with get_session() as session:
has = session.exec(select(Employee)).first()
if not has:
return False
return True

View File

@@ -1,8 +1,8 @@
from datetime import datetime, timedelta
from wecom.exceptions.general import SDKException
from wecom.schemas.token import AccessTokenInfo, AccessTokenParams
from wecom.utils.requests import HttpxRequest
from service.wecom.exceptions.general import SDKException
from service.wecom.schemas.token import AccessTokenInfo, AccessTokenParams
from service.wecom.utils.requests import HttpxRequest
BASE_URL: str = "https://qyapi.weixin.qq.com/cgi-bin"

View File

@@ -1,13 +1,14 @@
from wecom.exceptions.general import SDKException
from wecom.modules.base import WecomBaseClient
from wecom.schemas.departments import (
from service.wecom.exceptions.general import SDKException
from service.wecom.modules.base import WecomBaseClient
from service.wecom.schemas.departments import (
CreateDepartmentInfo,
CreateDepartmentParams,
DepartmentInfo,
DepartmentInfoItem,
UpdateDepartmentInfo,
UpdateDepartmentParams,
)
from wecom.utils.requests import HttpxRequest
from service.wecom.utils.requests import HttpxRequest
class WecomDepartmentClient(WecomBaseClient):
@@ -63,7 +64,7 @@ class WecomDepartmentClient(WecomBaseClient):
else:
raise SDKException(resp.errcode, resp.errmsg)
async def get_departments(self, id: int = None) -> list[DepartmentInfo]:
async def get_departments(self, id: int = None) -> list[DepartmentInfoItem]:
"""
获取部门列表
@param id: 部门id。获取指定部门及其下的子部门。

View File

@@ -1,14 +1,14 @@
from typing import Literal
from wecom.exceptions.general import SDKException
from wecom.modules.base import WecomBaseClient
from wecom.schemas.message import (
from service.wecom.exceptions.general import SDKException
from service.wecom.modules.base import WecomBaseClient
from service.wecom.schemas.message import (
MessageParams,
RecallMessageInfo,
RecallMessageParams,
SendMessageInfo,
)
from wecom.utils.requests import HttpxRequest
from service.wecom.utils.requests import HttpxRequest
class WecomMessageClient(WecomBaseClient):

View File

@@ -1,7 +1,7 @@
from wecom.modules.base import WecomBaseClient
from wecom.modules.department import WecomDepartmentClient
from wecom.modules.message import WecomMessageClient
from wecom.modules.users import WecomUsersClient
from service.wecom.modules.base import WecomBaseClient
from service.wecom.modules.department import WecomDepartmentClient
from service.wecom.modules.message import WecomMessageClient
from service.wecom.modules.users import WecomUsersClient
class Wecom(

View File

@@ -1,8 +1,13 @@
from wecom.exceptions.general import SDKException
from wecom.modules.base import WecomBaseClient
from wecom.schemas.departments import DepartmentInfo
from wecom.schemas.users import DepartmentUserDetailInfo, DepartmentUserInfo, UserInfo
from wecom.utils.requests import HttpxRequest
from service.wecom.exceptions.general import SDKException
from service.wecom.modules.base import WecomBaseClient
from service.wecom.schemas.departments import DepartmentInfo
from service.wecom.schemas.users import (
DepartmentUserDetailInfo,
DepartmentUserInfo,
UserInfo,
UserSimpleInfo,
)
from service.wecom.utils.requests import HttpxRequest
class WecomUsersClient(WecomBaseClient):
@@ -45,7 +50,7 @@ class WecomUsersClient(WecomBaseClient):
else:
raise SDKException(resp.errcode, resp.errmsg)
async def get_user_in_department(self, department_id: int) -> dict:
async def get_user_in_department(self, department_id: int) -> list[UserSimpleInfo]:
"""
读取部门成员简要信息
@param department_id: 获取的部门id
@@ -61,7 +66,7 @@ class WecomUsersClient(WecomBaseClient):
resp = DepartmentUserInfo(**await HttpxRequest.get(url=url, params=params))
if resp.errcode == 0:
return resp.model_dump(exclude={"errcode", "errmsg"})
return resp.userlist
else:
raise SDKException(resp.errcode, resp.errmsg)

View File

@@ -1,6 +1,6 @@
from typing import AnyStr, List
from typing import List
from wecom.schemas.base import BaseSchema
from service.wecom.schemas.base import BaseSchema
class CreateDepartmentParams(BaseSchema):
@@ -26,23 +26,23 @@ class UpdateDepartmentParams(CreateDepartmentParams): ...
class UpdateDepartmentInfo(BaseSchema):
errcode: int
errmsg: AnyStr
errmsg: str
class CreateDepartmentInfo(BaseSchema):
errcode: int
errmsg: AnyStr
errmsg: str
id: int
class DepartmentInfo(BaseSchema):
class DepartmentInfoItem(BaseSchema):
"""
部门单体响应数据
"""
id: int
name: AnyStr
name_en: AnyStr | None = None
name: str
name_en: str | None = None
department_leader: List[str] | None = None
parentid: int | None = None
order: int | None = None
@@ -54,5 +54,5 @@ class DepartmentInfo(BaseSchema):
"""
errcode: int
errmsg: AnyStr
department: List[DepartmentInfo]
errmsg: str
department: List[DepartmentInfoItem]

View File

@@ -1,6 +1,6 @@
from typing import AnyStr, Literal
from typing import Literal
from wecom.schemas.base import BaseSchema
from service.wecom.schemas.base import BaseSchema
class MessageParams(BaseSchema):
@@ -24,9 +24,9 @@ class MessageParams(BaseSchema):
touser、toparty、totag不能同时为空后面不再强调
"""
touser: AnyStr | None = None
toparty: AnyStr | None = None
totag: AnyStr | None = None
touser: str | None = None
toparty: str | None = None
totag: str | None = None
msgtype: Literal[
"text", "image", "voice", "video", "textcard", "news", "mpnews", "markdown"
]
@@ -55,13 +55,13 @@ class SendMessageInfo(BaseSchema):
"""
errcode: int
errmsg: AnyStr
invaliduser: AnyStr | None = None
invalidparty: AnyStr | None = None
invalidtag: AnyStr | None = None
unlicenseduser: AnyStr | None = None
msgid: AnyStr | None = None
response_code: AnyStr | None = None
errmsg: str
invaliduser: str | None = None
invalidparty: str | None = None
invalidtag: str | None = None
unlicenseduser: str | None = None
msgid: str | None = None
response_code: str | None = None
class SendMessageInvalid(BaseSchema):
@@ -70,11 +70,11 @@ class SendMessageInvalid(BaseSchema):
"""
errmsg: AnyStr
invaliduser: AnyStr | None = None
invalidparty: AnyStr | None = None
invalidtag: AnyStr | None = None
unlicenseduser: AnyStr | None = None
errmsg: str
invaliduser: str | None = None
invalidparty: str | None = None
invalidtag: str | None = None
unlicenseduser: str | None = None
class RecallMessageParams(BaseSchema):
@@ -82,7 +82,7 @@ class RecallMessageParams(BaseSchema):
撤回消息请求参数
"""
msgid: AnyStr
msgid: str
class RecallMessageInfo(BaseSchema):
@@ -91,4 +91,4 @@ class RecallMessageInfo(BaseSchema):
"""
errcode: int
errmsg: AnyStr
errmsg: str

View File

@@ -1,4 +1,4 @@
from wecom.schemas.base import BaseSchema
from service.wecom.schemas.base import BaseSchema
class AccessTokenParams(BaseSchema):

View File

@@ -1,6 +1,6 @@
from typing import AnyStr, List
from typing import List
from wecom.schemas.base import BaseSchema
from service.wecom.schemas.base import BaseSchema
class UserInfo(BaseSchema):
@@ -9,31 +9,31 @@ class UserInfo(BaseSchema):
"""
errcode: int
errmsg: AnyStr
userid: AnyStr | None = None
name: AnyStr | None = None
errmsg: str
userid: str | None = None
name: str | None = None
department: List[int] | None = None
position: AnyStr | None = None
moblie: AnyStr | None = None
position: str | None = None
moblie: str | None = None
gender: int | None = None
email: AnyStr | None = None
email: str | None = None
status: int | None = None
class UserSimpleInfo(BaseSchema):
userid: AnyStr
name: AnyStr
userid: str
name: str
department: List[int]
open_userid: AnyStr | None = None
open_userid: str | None = None
class DepartmentUserInfo(BaseSchema):
errcode: int
errmsg: AnyStr
errmsg: str
userlist: List[UserSimpleInfo]
class DepartmentUserDetailInfo(BaseSchema):
errcode: int
errmsg: AnyStr
errmsg: str
userlist: List[UserInfo]