145 lines
5.7 KiB
Python
145 lines
5.7 KiB
Python
"""SQLAlchemy 数据模型。直接复用 Dify 的 db 连接。"""
|
||
from sqlalchemy import Column, DateTime, ForeignKey, Integer, String, Text, TIMESTAMP, func
|
||
from sqlalchemy.dialects.postgresql import JSONB
|
||
|
||
from extensions.ext_database import db
|
||
|
||
|
||
class WecomUserMapping(db.Model):
|
||
"""企微用户与 Dify 用户映射表。"""
|
||
__tablename__ = "wecom_user_mapping"
|
||
|
||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||
wecom_userid = Column(String(64), unique=True, nullable=False)
|
||
dify_user_id = Column(String(64), nullable=False, index=True)
|
||
username = Column(String(128))
|
||
department = Column(String(128))
|
||
role = Column(String(32), default="sales")
|
||
password_hash = Column(String(256))
|
||
status = Column(String(16), default="active")
|
||
created_at = Column(TIMESTAMP, server_default=func.now())
|
||
last_active_at = Column(TIMESTAMP)
|
||
|
||
|
||
class RecommendationRecord(db.Model):
|
||
"""产品推荐方案记录表。"""
|
||
__tablename__ = "recommendation_records"
|
||
|
||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||
user_id = Column(String(64), nullable=False, index=True)
|
||
customer_name = Column(String(64))
|
||
customer_age = Column(Integer)
|
||
customer_gender = Column(String(8))
|
||
health_status = Column(String(32))
|
||
occupation = Column(String(64))
|
||
annual_income = Column(Integer)
|
||
monthly_budget = Column(Integer)
|
||
insurance_types = Column(Text) # JSON 数组
|
||
coverage_amount = Column(Integer)
|
||
coverage_period = Column(String(32))
|
||
existing_policies = Column(Text) # JSON,可为空
|
||
generated_plan = Column(Text) # Markdown 文本
|
||
plan_variants = Column(Text) # JSON:多套方案
|
||
dify_task_id = Column(String(64))
|
||
status = Column(String(16), default="pending", index=True) # pending/processing/done/failed
|
||
error_message = Column(Text)
|
||
share_token = Column(String(64))
|
||
share_expire_at = Column(TIMESTAMP)
|
||
created_at = Column(TIMESTAMP, server_default=func.now(), index=True)
|
||
completed_at = Column(TIMESTAMP)
|
||
|
||
|
||
class SystemOperationLog(db.Model):
|
||
"""系统操作日志表。"""
|
||
__tablename__ = "system_operation_logs"
|
||
|
||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||
user_id = Column(String(64), nullable=False, index=True)
|
||
action = Column(String(32), nullable=False, index=True)
|
||
target_type = Column(String(32))
|
||
target_id = Column(String(64))
|
||
detail = Column(JSONB)
|
||
ip = Column(String(45))
|
||
user_agent = Column(String(256))
|
||
created_at = Column(TIMESTAMP, server_default=func.now(), index=True)
|
||
|
||
|
||
class ChatSession(db.Model):
|
||
"""保险前台会话记录。"""
|
||
__tablename__ = "insurance_chat_sessions"
|
||
|
||
id = Column(String(64), primary_key=True)
|
||
user_id = Column(String(64), nullable=False, index=True)
|
||
name = Column(String(255), default="新会话")
|
||
app_id = Column(String(64), index=True)
|
||
api_token = Column(String(255))
|
||
dify_conversation_id = Column(String(64), index=True)
|
||
status = Column(String(16), default="active", index=True)
|
||
created_at = Column(TIMESTAMP, server_default=func.now(), index=True)
|
||
updated_at = Column(TIMESTAMP, server_default=func.now(), onupdate=func.now(), index=True)
|
||
|
||
|
||
class ChatMessage(db.Model):
|
||
"""保险前台问答消息记录。"""
|
||
__tablename__ = "insurance_chat_messages"
|
||
|
||
id = Column(String(64), primary_key=True)
|
||
session_id = Column(String(64), ForeignKey("insurance_chat_sessions.id"), nullable=False, index=True)
|
||
user_id = Column(String(64), nullable=False, index=True)
|
||
query = Column(Text, nullable=False)
|
||
answer = Column(Text, default="")
|
||
sources = Column(JSONB, default=[])
|
||
filters = Column(JSONB)
|
||
dify_message_id = Column(String(64), index=True)
|
||
feedback = Column(String(32), index=True)
|
||
correction = Column(Text)
|
||
created_at = Column(TIMESTAMP, server_default=func.now(), index=True)
|
||
updated_at = Column(TIMESTAMP, server_default=func.now(), onupdate=func.now())
|
||
|
||
|
||
class DocumentMetadata(db.Model):
|
||
"""文档元数据(编号、标签、险种、保司)。Phase 7 创建。"""
|
||
__tablename__ = "document_metadata"
|
||
|
||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||
dify_document_id = Column(String(64), nullable=False)
|
||
dataset_id = Column(String(64), nullable=False)
|
||
doc_number = Column(String(32))
|
||
insurance_type = Column(String(32))
|
||
company = Column(String(64))
|
||
tags = Column(JSONB, default=[])
|
||
created_at = Column(TIMESTAMP, server_default=func.now())
|
||
updated_at = Column(TIMESTAMP, server_default=func.now(), onupdate=func.now())
|
||
|
||
|
||
class DatasourceConfig(db.Model):
|
||
"""保司 API 数据源配置。Phase 7 创建。"""
|
||
__tablename__ = "datasource_configs"
|
||
|
||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||
name = Column(String(128), nullable=False)
|
||
api_url = Column(String(512), nullable=False)
|
||
api_key_encrypted = Column(Text)
|
||
sync_frequency = Column(String(32))
|
||
insurance_type = Column(String(32))
|
||
last_sync_at = Column(TIMESTAMP)
|
||
last_sync_status = Column(String(16))
|
||
last_sync_count = Column(Integer)
|
||
status = Column(String(16), default="active")
|
||
created_at = Column(TIMESTAMP, server_default=func.now())
|
||
|
||
|
||
class DatasourceSyncLog(db.Model):
|
||
"""数据源同步日志。Phase 7 创建。"""
|
||
__tablename__ = "datasource_sync_logs"
|
||
|
||
id = Column(Integer, primary_key=True, autoincrement=True)
|
||
datasource_id = Column(Integer, nullable=False, index=True)
|
||
status = Column(String(16))
|
||
items_added = Column(Integer, default=0)
|
||
items_updated = Column(Integer, default=0)
|
||
items_deleted = Column(Integer, default=0)
|
||
error_message = Column(Text)
|
||
started_at = Column(TIMESTAMP, server_default=func.now())
|
||
completed_at = Column(TIMESTAMP)
|