修复 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/海报链路无关。
49 lines
1.6 KiB
Python
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
|