baodan/api/insurance/admin/routes.py

497 lines
15 KiB
Python
Raw Normal View History

"""管理后台路由A5 + A6
用户管理角色管理LLM 配置Prompt 管理
"""
from flask import Blueprint, request, jsonify
from insurance.admin.service import AdminService
2026-07-12 14:17:18 +08:00
from insurance.middleware.auth_middleware import jwt_required, admin_required, super_admin_required, permission_required
admin_bp = Blueprint("admin", __name__)
admin_service = AdminService()
# ---- 用户管理A5----
@admin_bp.route("/users", methods=["GET"])
2026-07-12 14:17:18 +08:00
@permission_required("user_manage")
def list_users():
"""用户列表。"""
params = {
"page": request.args.get("page", 1, type=int),
"page_size": request.args.get("page_size", 20, type=int),
"role": request.args.get("role", ""),
"department": request.args.get("department", ""),
}
result = admin_service.list_users(params)
return jsonify(result)
@admin_bp.route("/users", methods=["POST"])
2026-07-12 14:17:18 +08:00
@permission_required("user_manage")
def create_user():
"""新增用户。"""
data = request.get_json()
result = admin_service.create_user(data)
return jsonify(result)
@admin_bp.route("/users/<user_id>", methods=["PUT"])
2026-07-12 14:17:18 +08:00
@permission_required("user_manage")
def update_user(user_id):
"""编辑用户。"""
data = request.get_json()
result = admin_service.update_user(user_id, data)
return jsonify(result)
@admin_bp.route("/users/<user_id>", methods=["DELETE"])
2026-07-12 14:17:18 +08:00
@permission_required("user_manage")
def delete_user(user_id):
"""停用用户。"""
result = admin_service.delete_user(user_id)
return jsonify(result)
@admin_bp.route("/users/batch-import", methods=["POST"])
2026-07-12 14:17:18 +08:00
@permission_required("user_manage")
def batch_import_users():
"""批量导入用户。"""
file = request.files.get("file")
if not file:
return jsonify({"code": 1001, "message": "请选择文件", "data": None}), 400
result = admin_service.batch_import_users(file)
return jsonify(result)
@admin_bp.route("/users/sync-to-dify", methods=["POST"])
2026-07-12 14:17:18 +08:00
@permission_required("user_manage")
def sync_users_to_dify():
"""手动同步所有用户到 Dify。"""
result = admin_service.sync_all_users_to_dify()
return jsonify(result)
2026-07-12 14:17:18 +08:00
# ---- 企微群配置 ----
@admin_bp.route("/wecom-groups", methods=["GET"])
@permission_required("config_manage")
def list_wecom_groups():
"""企微群配置列表。"""
params = {
"page": request.args.get("page", 1, type=int),
"page_size": request.args.get("page_size", 20, type=int),
"status": request.args.get("status", ""),
"keyword": request.args.get("keyword", ""),
}
result = admin_service.list_wecom_groups(params)
return jsonify(result)
@admin_bp.route("/wecom-groups/<group_id>", methods=["PUT"])
@permission_required("config_manage")
def update_wecom_group(group_id):
"""更新企微群配置。"""
data = request.get_json() or {}
result = admin_service.update_wecom_group(group_id, data)
return jsonify(result)
# ---- 角色管理A5----
@admin_bp.route("/roles", methods=["GET"])
2026-07-12 14:17:18 +08:00
@permission_required("user_manage")
def list_roles():
"""角色列表。"""
result = admin_service.list_roles()
return jsonify(result)
@admin_bp.route("/roles", methods=["POST"])
2026-07-12 14:17:18 +08:00
@permission_required("user_manage")
def create_role():
"""新建角色。"""
data = request.get_json()
result = admin_service.create_role(data)
return jsonify(result)
@admin_bp.route("/roles/<role_id>", methods=["PUT"])
2026-07-12 14:17:18 +08:00
@permission_required("user_manage")
def update_role(role_id):
"""更新角色权限。"""
data = request.get_json()
result = admin_service.update_role(role_id, data)
return jsonify(result)
@admin_bp.route("/roles/<role_id>", methods=["DELETE"])
2026-07-12 14:17:18 +08:00
@permission_required("user_manage")
def delete_role(role_id):
"""删除自定义角色。"""
result = admin_service.delete_role(role_id)
return jsonify(result)
2026-07-12 14:17:18 +08:00
@admin_bp.route("/permissions/me", methods=["GET"])
@jwt_required
def get_my_permissions():
"""获取当前用户的权限列表。"""
from insurance.middleware.auth_middleware import get_user_permissions
role_name = request.user_role or ""
perms = get_user_permissions(role_name)
return jsonify({"code": 0, "data": {"role": role_name, "permissions": perms}})
# ---- LLM 配置A6----
@admin_bp.route("/llm-configs", methods=["GET"])
2026-07-12 14:17:18 +08:00
@permission_required("config_manage")
def list_llm_configs():
"""LLM 配置列表。"""
result = admin_service.list_llm_configs()
return jsonify(result)
@admin_bp.route("/llm-configs", methods=["POST"])
2026-07-12 14:17:18 +08:00
@permission_required("config_manage")
def create_llm_config():
"""新建 LLM 配置。"""
data = request.get_json()
result = admin_service.create_llm_config(data)
return jsonify(result)
@admin_bp.route("/llm-configs/<config_id>", methods=["PUT"])
2026-07-12 14:17:18 +08:00
@permission_required("config_manage")
def update_llm_config(config_id):
"""更新 LLM 配置。"""
data = request.get_json()
result = admin_service.update_llm_config(config_id, data)
return jsonify(result)
@admin_bp.route("/llm-configs/<config_id>/ping", methods=["POST"])
2026-07-12 14:17:18 +08:00
@permission_required("config_manage")
def ping_llm(config_id):
"""测试模型连通性。"""
result = admin_service.ping_llm(config_id)
return jsonify(result)
# ---- Prompt 管理A6----
@admin_bp.route("/prompts", methods=["GET"])
2026-07-12 14:17:18 +08:00
@permission_required("kb_manage")
def list_prompts():
"""Prompt 列表。"""
result = admin_service.list_prompts()
return jsonify(result)
@admin_bp.route("/prompts/<prompt_id>", methods=["GET"])
2026-07-12 14:17:18 +08:00
@permission_required("kb_manage")
def get_prompt(prompt_id):
"""获取单个 Prompt 详情。"""
result = admin_service.get_prompt(prompt_id)
return jsonify(result)
@admin_bp.route("/prompts", methods=["POST"])
2026-07-12 14:17:18 +08:00
@permission_required("kb_manage")
def save_prompt():
"""新建/更新 Prompt自动创建版本快照"""
data = request.get_json()
result = admin_service.save_prompt(data)
return jsonify(result)
@admin_bp.route("/prompts/<prompt_id>", methods=["DELETE"])
2026-07-12 14:17:18 +08:00
@permission_required("kb_manage")
def delete_prompt(prompt_id):
"""删除 Prompt。"""
result = admin_service.delete_prompt(prompt_id)
return jsonify(result)
@admin_bp.route("/prompts/<prompt_id>/versions", methods=["GET"])
2026-07-12 14:17:18 +08:00
@permission_required("kb_manage")
def get_prompt_versions(prompt_id):
"""获取 Prompt 版本历史。"""
result = admin_service.get_prompt_versions(prompt_id)
return jsonify(result)
@admin_bp.route("/prompts/<prompt_id>/rollback", methods=["POST"])
2026-07-12 14:17:18 +08:00
@permission_required("kb_manage")
def rollback_prompt(prompt_id):
"""回滚到指定版本。"""
data = request.get_json()
version = data.get("version")
if not version:
return jsonify({"code": 1001, "message": "版本号不能为空", "data": None}), 400
result = admin_service.rollback_prompt(prompt_id, version)
return jsonify(result)
@admin_bp.route("/prompts/test", methods=["POST"])
2026-07-12 14:17:18 +08:00
@permission_required("kb_manage")
def test_prompt():
"""即时测试 Prompt 效果。"""
data = request.get_json()
result = admin_service.test_prompt(data)
return jsonify(result)
# ---- 方案模板管理 ----
from insurance.admin.template_service import TemplateService
template_service = TemplateService()
@admin_bp.route("/templates", methods=["GET"])
2026-07-12 14:17:18 +08:00
@permission_required("kb_manage")
def list_templates():
"""模板列表。"""
params = {
"page": request.args.get("page", 1, type=int),
"page_size": request.args.get("page_size", 20, type=int),
"insurance_type": request.args.get("insurance_type", ""),
}
result = template_service.list_templates(params)
return jsonify(result)
@admin_bp.route("/templates/<template_id>", methods=["GET"])
2026-07-12 14:17:18 +08:00
@permission_required("kb_manage")
def get_template(template_id):
"""获取模板详情。"""
result = template_service.get_template(template_id)
return jsonify(result)
@admin_bp.route("/templates", methods=["POST"])
2026-07-12 14:17:18 +08:00
@permission_required("kb_manage")
def create_template():
"""创建模板。"""
data = request.get_json()
result = template_service.create_template(data)
return jsonify(result)
@admin_bp.route("/templates/<template_id>", methods=["PUT"])
2026-07-12 14:17:18 +08:00
@permission_required("kb_manage")
def update_template(template_id):
"""更新模板。"""
data = request.get_json()
result = template_service.update_template(template_id, data)
return jsonify(result)
@admin_bp.route("/templates/<template_id>", methods=["DELETE"])
2026-07-12 14:17:18 +08:00
@permission_required("kb_manage")
def delete_template(template_id):
"""删除模板。"""
result = template_service.delete_template(template_id)
return jsonify(result)
@admin_bp.route("/templates/upload", methods=["POST"])
2026-07-12 14:17:18 +08:00
@permission_required("kb_manage")
def upload_template():
"""上传模板文件。"""
file = request.files.get("file")
data = {
"name": request.form.get("name", ""),
"description": request.form.get("description", ""),
"insurance_type": request.form.get("insurance_type", ""),
}
result = template_service.upload_template(file, data)
return jsonify(result)
# ---- 通知告警配置 ----
from insurance.admin.notification_service import NotificationService
notification_service = NotificationService()
# ---- 部门/分组管理 ----
from insurance.admin.department_service import DepartmentService
department_service = DepartmentService()
@admin_bp.route("/departments", methods=["GET"])
2026-07-12 14:17:18 +08:00
@permission_required("user_manage")
def list_departments():
"""部门列表。"""
result = department_service.list_departments()
return jsonify(result)
@admin_bp.route("/departments/tree", methods=["GET"])
2026-07-12 14:17:18 +08:00
@permission_required("user_manage")
def get_department_tree():
"""部门树形结构。"""
result = department_service.get_department_tree()
return jsonify(result)
@admin_bp.route("/departments", methods=["POST"])
2026-07-12 14:17:18 +08:00
@permission_required("user_manage")
def create_department():
"""创建部门。"""
data = request.get_json()
result = department_service.create_department(data)
return jsonify(result)
@admin_bp.route("/departments/<int:dept_id>", methods=["PUT"])
2026-07-12 14:17:18 +08:00
@permission_required("user_manage")
def update_department(dept_id):
"""更新部门。"""
data = request.get_json()
result = department_service.update_department(dept_id, data)
return jsonify(result)
@admin_bp.route("/departments/<int:dept_id>", methods=["DELETE"])
2026-07-12 14:17:18 +08:00
@permission_required("user_manage")
def delete_department(dept_id):
"""删除部门。"""
result = department_service.delete_department(dept_id)
return jsonify(result)
@admin_bp.route("/notification-channels", methods=["GET"])
2026-07-12 14:17:18 +08:00
@permission_required("config_manage")
def list_notification_channels():
"""通知渠道列表。"""
result = notification_service.list_channels()
return jsonify(result)
@admin_bp.route("/notification-channels", methods=["POST"])
2026-07-12 14:17:18 +08:00
@permission_required("config_manage")
def create_notification_channel():
"""创建通知渠道。"""
data = request.get_json()
result = notification_service.create_channel(data)
return jsonify(result)
@admin_bp.route("/notification-channels/<channel_id>", methods=["PUT"])
2026-07-12 14:17:18 +08:00
@permission_required("config_manage")
def update_notification_channel(channel_id):
"""更新通知渠道。"""
data = request.get_json()
result = notification_service.update_channel(channel_id, data)
return jsonify(result)
@admin_bp.route("/notification-channels/<channel_id>", methods=["DELETE"])
2026-07-12 14:17:18 +08:00
@permission_required("config_manage")
def delete_notification_channel(channel_id):
"""删除通知渠道。"""
result = notification_service.delete_channel(channel_id)
return jsonify(result)
@admin_bp.route("/notification-channels/<channel_id>/test", methods=["POST"])
2026-07-12 14:17:18 +08:00
@permission_required("config_manage")
def test_notification_channel(channel_id):
"""测试通知渠道。"""
result = notification_service.test_channel(channel_id)
return jsonify(result)
@admin_bp.route("/alert-rules", methods=["GET"])
2026-07-12 14:17:18 +08:00
@permission_required("config_manage")
def list_alert_rules():
"""告警规则列表。"""
result = notification_service.list_rules()
return jsonify(result)
@admin_bp.route("/alert-rules", methods=["POST"])
2026-07-12 14:17:18 +08:00
@permission_required("config_manage")
def create_alert_rule():
"""创建告警规则。"""
data = request.get_json()
result = notification_service.create_rule(data)
return jsonify(result)
@admin_bp.route("/alert-rules/<rule_id>", methods=["PUT"])
2026-07-12 14:17:18 +08:00
@permission_required("config_manage")
def update_alert_rule(rule_id):
"""更新告警规则。"""
data = request.get_json()
result = notification_service.update_rule(rule_id, data)
return jsonify(result)
@admin_bp.route("/alert-rules/<rule_id>", methods=["DELETE"])
2026-07-12 14:17:18 +08:00
@permission_required("config_manage")
def delete_alert_rule(rule_id):
"""删除告警规则。"""
result = notification_service.delete_rule(rule_id)
return jsonify(result)
# ---- 日志查询A7—— 路径 /admin/logs/*,挂在 admin_bp 下 ----
from insurance.stats.service import StatsService
stats_service = StatsService()
@admin_bp.route("/logs/chat", methods=["GET"])
2026-07-12 14:17:18 +08:00
@permission_required("log_view")
def chat_logs():
"""问答记录查询。"""
params = {
"page": request.args.get("page", 1, type=int),
"page_size": request.args.get("page_size", 50, type=int),
"user_id": request.args.get("user_id", ""),
"start_date": request.args.get("start_date", ""),
"end_date": request.args.get("end_date", ""),
"keyword": request.args.get("keyword", ""),
"rating": request.args.get("rating", ""),
}
result = stats_service.get_chat_logs(params)
return jsonify(result)
@admin_bp.route("/logs/chat/export", methods=["GET"])
2026-07-12 14:17:18 +08:00
@permission_required("log_view")
def export_chat_logs():
"""导出对话记录为 CSV。"""
from flask import Response
params = {
"user_id": request.args.get("user_id", ""),
"start_date": request.args.get("start_date", ""),
"end_date": request.args.get("end_date", ""),
"keyword": request.args.get("keyword", ""),
"rating": request.args.get("rating", ""),
}
csv_data = stats_service.export_chat_logs(params)
return Response(
csv_data,
content_type="text/csv",
headers={"Content-Disposition": "attachment; filename=chat_logs.csv"},
)
@admin_bp.route("/logs/system", methods=["GET"])
2026-07-12 14:17:18 +08:00
@permission_required("log_view")
def system_logs():
"""系统操作日志查询。"""
params = {
"page": request.args.get("page", 1, type=int),
"page_size": request.args.get("page_size", 50, type=int),
"action": request.args.get("action", ""),
"user_id": request.args.get("user_id", ""),
}
result = stats_service.get_system_logs(params)
return jsonify(result)