Files
ai-agent-admin/backend-fastapi/core/message/model.py
T
2026-06-08 18:14:59 +08:00

101 lines
3.8 KiB
Python

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
消息模型
"""
from sqlalchemy import Column, String, Text, Integer, Boolean, DateTime, Index, JSON
from app.base_model import BaseModel
class Message(BaseModel):
"""站内消息"""
__tablename__ = "core_message"
# 接收人(逻辑外键)
recipient_id = Column(String(50), nullable=False, index=True, comment="接收人ID")
# 消息内容
title = Column(String(200), nullable=False, comment="消息标题")
content = Column(Text, nullable=False, comment="消息内容")
msg_type = Column(String(20), default="system", index=True, comment="消息类型: system/workflow/todo/announcement")
status = Column(String(20), default="unread", index=True, comment="消息状态: unread/read")
# 关联信息(可选,用于点击跳转)
link_type = Column(String(50), default="", comment="关联类型")
link_id = Column(String(50), default="", comment="关联对象ID")
# 阅读时间
read_at = Column(DateTime, nullable=True, comment="阅读时间")
# 发送人(逻辑外键,可选)
sender_id = Column(String(50), nullable=True, comment="发送人ID")
__table_args__ = (
Index("ix_message_recipient_status", "recipient_id", "status"),
Index("ix_message_recipient_type", "recipient_id", "msg_type"),
)
class Announcement(BaseModel):
"""公告"""
__tablename__ = "core_announcement"
# 公告内容
title = Column(String(200), nullable=False, comment="公告标题")
content = Column(Text, nullable=False, comment="公告内容")
summary = Column(String(500), default="", comment="摘要")
# 状态与优先级
status = Column(String(20), default="draft", index=True, comment="状态: draft/published/expired")
priority = Column(Integer, default=0, index=True, comment="优先级: 0普通/1重要/2紧急")
is_top = Column(Boolean, default=False, comment="是否置顶")
# 接收范围
target_type = Column(String(20), default="all", comment="接收范围类型: all/dept/role/user")
target_ids = Column(JSON, default=list, comment="接收目标ID列表")
# 发布时间
publish_time = Column(DateTime, nullable=True, comment="发布时间")
expire_time = Column(DateTime, nullable=True, comment="过期时间")
# 发布人(逻辑外键)
publisher_id = Column(String(50), nullable=True, comment="发布人ID")
# 统计
read_count = Column(Integer, default=0, comment="阅读次数")
class DingtalkTodoRecord(BaseModel):
"""钉钉待办记录(业务ID与钉钉待办ID映射)"""
__tablename__ = "core_dingtalk_todo_record"
source_type = Column(String(50), nullable=False, index=True, comment="来源类型: workflow_task/workflow_instance/message")
source_id = Column(String(50), nullable=False, index=True, comment="业务ID")
user_id = Column(String(50), nullable=False, index=True, comment="系统用户ID")
dingtalk_union_id = Column(String(100), nullable=False, comment="钉钉unionId")
dingtalk_task_id = Column(String(100), nullable=False, comment="钉钉待办taskId")
status = Column(String(20), default="pending", index=True, comment="状态: pending/done/deleted")
__table_args__ = (
Index("ix_dingtalk_todo_source", "source_type", "source_id"),
)
class AnnouncementRead(BaseModel):
"""公告阅读记录"""
__tablename__ = "core_announcement_read"
# 公告(逻辑外键)
announcement_id = Column(String(50), nullable=False, index=True, comment="公告ID")
# 用户(逻辑外键)
user_id = Column(String(50), nullable=False, index=True, comment="用户ID")
# 阅读时间
read_at = Column(DateTime, nullable=True, comment="阅读时间")
__table_args__ = (
Index("ix_announcement_read_unique", "announcement_id", "user_id", unique=True),
)