baodan/api/insurance/ppt/scenarios.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

49 lines
1.6 KiB
Python

"""PPT 生成场景解析与模板兼容性判断。"""
from insurance.ppt.comparison import generation_mode_for_scenario
def get_scenario_config(code: str) -> dict | None:
if not code:
return None
try:
from insurance.models.ppt_config import PptScenario
scenario = PptScenario.query.filter_by(
code=code, status=1, deleted_at=None
).first()
return scenario.to_dict() if scenario else None
except Exception:
return None
def template_scenario_compatible(template_scenario: str, detected_scenario: str) -> bool:
"""模板场景只约束分类,底层计算模式始终由材料组合决定。"""
if not template_scenario:
return True
if template_scenario == detected_scenario:
return True
config = get_scenario_config(template_scenario)
if not config:
return False
if config.get("generationMode") != generation_mode_for_scenario(detected_scenario):
return False
base = config.get("baseScenario")
return not base or base == detected_scenario
def scenario_codes_for_auto_match(detected_scenario: str) -> list[str]:
"""返回可自动匹配的场景代码,精确内置场景优先。"""
result = [detected_scenario]
try:
from insurance.models.ppt_config import PptScenario
rows = PptScenario.query.filter_by(
base_scenario=detected_scenario,
status=1,
deleted_at=None,
).order_by(PptScenario.sort_order.asc()).all()
result.extend(row.code for row in rows if row.code not in result)
except Exception:
pass
return result