"""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)