2026-07-23 15:04:16 +08:00
|
|
|
|
"""海报生成记录模型。"""
|
2026-07-28 17:53:14 +08:00
|
|
|
|
from sqlalchemy import Column, String, Text, BigInteger, Integer, TIMESTAMP, func
|
2026-07-23 15:04:16 +08:00
|
|
|
|
from insurance.db.compat import db
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PosterRecord(db.Model):
|
|
|
|
|
|
"""海报生成记录表。"""
|
|
|
|
|
|
__tablename__ = "poster_records"
|
|
|
|
|
|
|
|
|
|
|
|
id = Column(BigInteger, primary_key=True, autoincrement=True)
|
|
|
|
|
|
user_id = Column(String(50), nullable=False, comment="用户 ID")
|
|
|
|
|
|
product_id = Column(String(50), nullable=True, comment="产品 ID")
|
|
|
|
|
|
case_upload_id = Column(BigInteger, nullable=True, comment="关联计划书上传 ID")
|
|
|
|
|
|
template_id = Column(BigInteger, nullable=True, comment="海报模板 ID")
|
|
|
|
|
|
copy_mode = Column(String(20), nullable=True, comment="文案模式: template/ai")
|
|
|
|
|
|
copy_content = Column(Text, nullable=True, comment="最终文案 JSON")
|
|
|
|
|
|
ai_raw_content = Column(Text, nullable=True, comment="AI 原始文案 JSON(合规留痕)")
|
|
|
|
|
|
export_url = Column(String(500), nullable=True, comment="导出文件地址")
|
|
|
|
|
|
export_format = Column(String(10), nullable=True, comment="导出格式: png/jpg")
|
|
|
|
|
|
export_size = Column(String(20), nullable=True, comment="导出尺寸")
|
|
|
|
|
|
reference_image_used = Column(String(500), nullable=True, comment="使用的参考图(合规留痕)")
|
|
|
|
|
|
prompt_used = Column(Text, nullable=True, comment="完整 prompt(合规留痕)")
|
2026-07-27 13:21:34 +08:00
|
|
|
|
generation_mode = Column(String(20), nullable=True, comment="生成方式: ai/fallback")
|
|
|
|
|
|
image_provider = Column(String(50), nullable=True, comment="图片供应商")
|
|
|
|
|
|
image_model = Column(String(100), nullable=True, comment="图片模型名称")
|
2026-07-27 13:52:09 +08:00
|
|
|
|
task_status = Column(String(20), default="pending", comment="任务状态: pending/queued/generating/done/failed")
|
|
|
|
|
|
task_progress = Column(db.Integer, default=0, comment="任务进度 0-100")
|
|
|
|
|
|
task_error = Column(Text, nullable=True, comment="任务错误信息")
|
2026-07-28 16:45:14 +08:00
|
|
|
|
extra_data = Column(Text, nullable=True, comment="扩展数据 JSON(如 useMaskedData)")
|
2026-07-28 17:53:14 +08:00
|
|
|
|
# 工作区字段(migrate_022)
|
|
|
|
|
|
title = Column(String(200), default="", comment="工作区名称")
|
|
|
|
|
|
workflow_step = Column(String(20), default="product", comment="当前业务步骤")
|
|
|
|
|
|
draft_status = Column(String(20), default="active", comment="active/archived")
|
|
|
|
|
|
draft_revision = Column(Integer, default=1, comment="当前草稿版本")
|
|
|
|
|
|
generated_revision = Column(Integer, default=0, comment="最新成品版本")
|
|
|
|
|
|
latest_task_id = Column(String(36), nullable=True, comment="最近任务 ID")
|
|
|
|
|
|
archived_at = Column(TIMESTAMP, nullable=True, comment="归档时间")
|
2026-07-27 13:52:09 +08:00
|
|
|
|
started_at = Column(TIMESTAMP, nullable=True, comment="任务开始时间")
|
|
|
|
|
|
finished_at = Column(TIMESTAMP, nullable=True, comment="任务完成时间")
|
2026-07-23 15:04:16 +08:00
|
|
|
|
created_at = Column(TIMESTAMP, server_default=func.now())
|
|
|
|
|
|
|
|
|
|
|
|
def to_dict(self):
|
|
|
|
|
|
import json
|
|
|
|
|
|
return {
|
|
|
|
|
|
"id": self.id,
|
|
|
|
|
|
"userId": self.user_id,
|
|
|
|
|
|
"productId": self.product_id,
|
|
|
|
|
|
"caseUploadId": self.case_upload_id,
|
|
|
|
|
|
"templateId": self.template_id,
|
|
|
|
|
|
"copyMode": self.copy_mode,
|
|
|
|
|
|
"copyContent": json.loads(self.copy_content) if self.copy_content else None,
|
|
|
|
|
|
"aiRawContent": json.loads(self.ai_raw_content) if self.ai_raw_content else None,
|
|
|
|
|
|
"exportUrl": self.export_url,
|
|
|
|
|
|
"exportFormat": self.export_format,
|
|
|
|
|
|
"exportSize": self.export_size,
|
|
|
|
|
|
"referenceImageUsed": self.reference_image_used,
|
|
|
|
|
|
"promptUsed": self.prompt_used,
|
2026-07-27 13:21:34 +08:00
|
|
|
|
"generationMode": self.generation_mode,
|
|
|
|
|
|
"imageProvider": self.image_provider,
|
|
|
|
|
|
"imageModel": self.image_model,
|
2026-07-27 13:52:09 +08:00
|
|
|
|
"taskStatus": self.task_status,
|
|
|
|
|
|
"taskProgress": self.task_progress,
|
|
|
|
|
|
"taskError": self.task_error,
|
2026-07-28 16:45:14 +08:00
|
|
|
|
"extraData": json.loads(self.extra_data) if self.extra_data else None,
|
2026-07-28 17:53:14 +08:00
|
|
|
|
"title": self.title or "",
|
|
|
|
|
|
"workflowStep": self.workflow_step or "product",
|
|
|
|
|
|
"draftStatus": self.draft_status or "active",
|
|
|
|
|
|
"draftRevision": self.draft_revision or 1,
|
|
|
|
|
|
"generatedRevision": self.generated_revision or 0,
|
|
|
|
|
|
"latestTaskId": self.latest_task_id,
|
|
|
|
|
|
"archivedAt": self.archived_at.isoformat() if self.archived_at else None,
|
2026-07-27 13:52:09 +08:00
|
|
|
|
"startedAt": self.started_at.isoformat() if self.started_at else None,
|
|
|
|
|
|
"finishedAt": self.finished_at.isoformat() if self.finished_at else None,
|
2026-07-23 15:04:16 +08:00
|
|
|
|
"createdAt": self.created_at.isoformat() if self.created_at else None,
|
|
|
|
|
|
}
|