baodan/api/insurance/models/poster_copy_template.py
wsb1224 b8c4e8b672 主要完成内容:
修复 PPT 异步任务无法生成的问题,包括任务变量引用错误、失败状态回写、心跳缺失任务恢复。
脱敏改为保司/产品后台统一配置,生成端不再让用户选择;任务创建时保存策略快照。
保司支持独立控制 PPT、海报 Logo 显示。
PPT 核验新增吸烟状态、币种及三个条件字段。
利益演示、退保提取调整为警告,不再阻止生成。
PPT 生成完成后可以直接返回数据核验页修改。
建立不同险种、单图/长图共六套海报字段画像。
PPT“生成场景”支持后台新增、启停和删除。
保司、产品、PPT 模板、文案模板均支持安全删除。
内置模板禁止删除,只允许停用;存在关联数据时拒绝危险删除。
补充策略变更及删除审计日志。
更新 API 文档、部署文档及修复计划实施记录。
关键交付文件:
[数据库迁移 migrate_027.py](D:/work/code/python/coding/baodanagent/api/insurance/db/migrate_027.py)
[海报字段画像 field_profiles.py](D:/work/code/python/coding/baodanagent/api/insurance/poster/field_profiles.py)
[动态场景服务 scenarios.py](D:/work/code/python/coding/baodanagent/api/insurance/ppt/scenarios.py)
[新增回归测试](D:/work/code/python/coding/baodanagent/tests/ppt_poster_optimization_test.py)
[优化修复计划书](D:/work/code/python/coding/baodanagent/docs/保险智能客服系统_PPT与海报优化修复计划书_20260731.md)
验证结果:
核心链路测试:37 passed,1 skipped
扩展回归测试:140 passed
PPT 渲染器测试:6 passed
前端生产构建:通过
Python 编译检查:通过
完整测试集:190 passed,1 failed
唯一失败为 tests/test_chat_save.py::test_chat_logs_query 未建立 Flask application context,与本次 PPT/海报链路无关。
2026-07-31 14:10:24 +08:00

31 lines
1.3 KiB
Python

"""文案模板模型。"""
from sqlalchemy import Column, String, Text, SmallInteger, BigInteger, TIMESTAMP, func
from insurance.db.compat import db
class PosterCopyTemplate(db.Model):
"""文案模板表。"""
__tablename__ = "poster_copy_templates"
id = Column(BigInteger, primary_key=True, autoincrement=True)
name = Column(String(100), nullable=False, comment="模板名称")
scenario_tag = Column(String(50), nullable=True, comment="场景标签")
content = Column(Text, nullable=False, comment="文案模板,含 {{变量}} 占位符")
variables = Column(Text, nullable=True, comment="变量列表及说明 JSON")
status = Column(SmallInteger, default=1, comment="1=启用, 0=停用")
created_at = Column(TIMESTAMP, server_default=func.now())
deleted_at = Column(TIMESTAMP, nullable=True, comment="软删除时间")
def to_dict(self):
import json
return {
"id": self.id,
"name": self.name,
"scenarioTag": self.scenario_tag,
"content": self.content,
"variables": json.loads(self.variables) if self.variables else [],
"status": self.status,
"createdAt": self.created_at.isoformat() if self.created_at else None,
"deletedAt": self.deleted_at.isoformat() if self.deleted_at else None,
}