baodan/api/insurance/admin/ppt_admin_routes.py
wsb1224 c8e0c0bb1e feat: add model configuration for PPT and poster generation
- PptSettingsAdmin.vue: full settings page with provider/model/API key
  config for PPT extraction, poster copy, and poster image generation
- Backend: GET /insurance/admin/ppt/available-models to fetch models
  from Dify API (falls back to builtin list when unavailable)
- LLM client: read model config from SystemSetting DB with 60s cache,
  priority: database > environment variables > defaults
- ppt-admin-api.ts: add getAvailableModels() method

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-24 13:46:04 +08:00

247 lines
8.4 KiB
Python

"""PPT/海报管理后台路由"""
from flask import Blueprint, request, jsonify
from insurance.admin.ppt_admin_service import PptAdminService
from insurance.middleware.auth_middleware import permission_required, jwt_required
ppt_admin_bp = Blueprint("ppt_admin", __name__)
ppt_admin_service = PptAdminService()
# ---- 保司管理 ----
@ppt_admin_bp.route("/companies", methods=["GET"])
@jwt_required
def list_companies():
params = {
"page": request.args.get("page", 1, type=int),
"page_size": request.args.get("page_size", 20, type=int),
"status": request.args.get("status", type=int),
"keyword": request.args.get("keyword", ""),
}
return jsonify(ppt_admin_service.list_companies(params))
@ppt_admin_bp.route("/companies", methods=["POST"])
@permission_required("config_manage")
def create_company():
return jsonify(ppt_admin_service.create_company(request.get_json(force=True)))
@ppt_admin_bp.route("/companies/<company_id>", methods=["PUT"])
@permission_required("config_manage")
def update_company(company_id):
return jsonify(ppt_admin_service.update_company(company_id, request.get_json(force=True)))
@ppt_admin_bp.route("/companies/<company_id>/status", methods=["PUT"])
@permission_required("config_manage")
def update_company_status(company_id):
return jsonify(ppt_admin_service.update_company_status(company_id, request.get_json(force=True)))
# ---- 产品管理 ----
@ppt_admin_bp.route("/products", methods=["GET"])
@jwt_required
def list_products():
params = {
"page": request.args.get("page", 1, type=int),
"page_size": request.args.get("page_size", 20, type=int),
"company_id": request.args.get("company_id", ""),
"plan_type": request.args.get("plan_type", ""),
"status": request.args.get("status", type=int),
}
return jsonify(ppt_admin_service.list_products(params))
@ppt_admin_bp.route("/products", methods=["POST"])
@permission_required("config_manage")
def create_product():
return jsonify(ppt_admin_service.create_product(request.get_json(force=True)))
@ppt_admin_bp.route("/products/<product_id>", methods=["PUT"])
@permission_required("config_manage")
def update_product(product_id):
return jsonify(ppt_admin_service.update_product(product_id, request.get_json(force=True)))
@ppt_admin_bp.route("/products/<product_id>/status", methods=["PUT"])
@permission_required("config_manage")
def update_product_status(product_id):
return jsonify(ppt_admin_service.update_product_status(product_id, request.get_json(force=True)))
@ppt_admin_bp.route("/products/<product_id>/manual/upload", methods=["POST"])
@permission_required("config_manage")
def upload_manual(product_id):
file = request.files.get("file")
if not file:
return jsonify({"code": 1001, "message": "请上传文件", "data": None})
return jsonify(ppt_admin_service.upload_manual(product_id, file))
@ppt_admin_bp.route("/products/<product_id>/manual/parse", methods=["POST"])
@permission_required("config_manage")
def parse_manual(product_id):
return jsonify(ppt_admin_service.parse_manual(product_id))
@ppt_admin_bp.route("/products/<product_id>/manual/review", methods=["PUT"])
@permission_required("config_manage")
def review_manual(product_id):
return jsonify(ppt_admin_service.review_manual(product_id, request.get_json(force=True)))
# ---- PPT 模板管理 ----
@ppt_admin_bp.route("/templates", methods=["GET"])
@jwt_required
def list_templates():
params = {
"page": request.args.get("page", 1, type=int),
"page_size": request.args.get("page_size", 20, type=int),
"plan_type": request.args.get("plan_type", ""),
"status": request.args.get("status", type=int),
}
return jsonify(ppt_admin_service.list_templates(params))
@ppt_admin_bp.route("/templates", methods=["POST"])
@permission_required("config_manage")
def create_template():
return jsonify(ppt_admin_service.create_template(request.get_json(force=True)))
@ppt_admin_bp.route("/templates/<template_id>", methods=["PUT"])
@permission_required("config_manage")
def update_template(template_id):
return jsonify(ppt_admin_service.update_template(template_id, request.get_json(force=True)))
@ppt_admin_bp.route("/templates/<template_id>/status", methods=["PUT"])
@permission_required("config_manage")
def update_template_status(template_id):
return jsonify(ppt_admin_service.update_template_status(template_id, request.get_json(force=True)))
# ---- 海报模板管理 ----
@ppt_admin_bp.route("/poster-templates", methods=["GET"])
@jwt_required
def list_poster_templates():
params = {
"page": request.args.get("page", 1, type=int),
"page_size": request.args.get("page_size", 20, type=int),
"status": request.args.get("status", type=int),
}
return jsonify(ppt_admin_service.list_poster_templates(params))
@ppt_admin_bp.route("/poster-templates", methods=["POST"])
@permission_required("config_manage")
def create_poster_template():
return jsonify(ppt_admin_service.create_poster_template(request.get_json(force=True)))
@ppt_admin_bp.route("/poster-templates/<int:template_id>", methods=["PUT"])
@permission_required("config_manage")
def update_poster_template(template_id):
return jsonify(ppt_admin_service.update_poster_template(template_id, request.get_json(force=True)))
@ppt_admin_bp.route("/poster-templates/<int:template_id>/status", methods=["PUT"])
@permission_required("config_manage")
def update_poster_template_status(template_id):
return jsonify(ppt_admin_service.update_poster_template_status(template_id, request.get_json(force=True)))
# ---- 文案模板管理 ----
@ppt_admin_bp.route("/copy-templates", methods=["GET"])
@jwt_required
def list_copy_templates():
params = {
"page": request.args.get("page", 1, type=int),
"page_size": request.args.get("page_size", 20, type=int),
"status": request.args.get("status", type=int),
}
return jsonify(ppt_admin_service.list_copy_templates(params))
@ppt_admin_bp.route("/copy-templates", methods=["POST"])
@permission_required("config_manage")
def create_copy_template():
return jsonify(ppt_admin_service.create_copy_template(request.get_json(force=True)))
@ppt_admin_bp.route("/copy-templates/<int:template_id>", methods=["PUT"])
@permission_required("config_manage")
def update_copy_template(template_id):
return jsonify(ppt_admin_service.update_copy_template(template_id, request.get_json(force=True)))
@ppt_admin_bp.route("/copy-templates/<int:template_id>", methods=["DELETE"])
@permission_required("config_manage")
def delete_copy_template(template_id):
return jsonify(ppt_admin_service.delete_copy_template(template_id))
# ---- 历史记录管理 ----
@ppt_admin_bp.route("/history", methods=["GET"])
@jwt_required
def list_history():
params = {
"page": request.args.get("page", 1, type=int),
"page_size": request.args.get("page_size", 20, type=int),
"user_id": request.args.get("user_id", ""),
"company_id": request.args.get("company_id", ""),
"action_type": request.args.get("action_type", ""),
}
return jsonify(ppt_admin_service.list_history(params))
@ppt_admin_bp.route("/history/<int:history_id>", methods=["DELETE"])
@permission_required("config_manage")
def delete_history(history_id):
return jsonify(ppt_admin_service.delete_history(history_id))
@ppt_admin_bp.route("/history/export", methods=["GET"])
@jwt_required
def export_history():
from flask import Response
params = {
"user_id": request.args.get("user_id", ""),
"company_id": request.args.get("company_id", ""),
"action_type": request.args.get("action_type", ""),
}
csv_content = ppt_admin_service.export_history_csv(params)
return Response(
csv_content,
mimetype="text/csv",
headers={"Content-Disposition": "attachment; filename=ppt_history.csv"},
)
# ---- 系统配置 ----
@ppt_admin_bp.route("/available-models", methods=["GET"])
@jwt_required
def get_available_models():
return jsonify(ppt_admin_service.get_available_models())
@ppt_admin_bp.route("/settings", methods=["GET"])
@jwt_required
def get_settings():
return jsonify(ppt_admin_service.get_settings())
@ppt_admin_bp.route("/settings", methods=["PUT"])
@permission_required("config_manage")
def update_settings():
updated_by = getattr(request, "user_id", "")
return jsonify(ppt_admin_service.update_settings(request.get_json(force=True), updated_by))