Files
along_django/houtai/huashu_views.py

176 lines
7.4 KiB
Python

# houtai/huashu_views.py — 后台话术配置管理
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from peizhi.models import HuashuConfig
from .utils import verify_kefu_permission
HUASHU_REQUIRED_PERMISSION = '8080a'
def _serialize_item(item):
return {
'id': item.id,
'scene_key': item.scene_key,
'scene_label': item.get_scene_key_display(),
'item_type': item.item_type,
'item_type_label': item.get_item_type_display(),
'title': item.title,
'content': item.content,
'confirm_text': item.confirm_text,
'cancel_text': item.cancel_text,
'keywords': item.keywords or [],
'match_mode': item.match_mode,
'priority': item.priority,
'is_active': item.is_active,
'sort_order': item.sort_order,
'created_at': item.created_at.strftime('%Y-%m-%d %H:%M:%S') if item.created_at else '',
'updated_at': item.updated_at.strftime('%Y-%m-%d %H:%M:%S') if item.updated_at else '',
}
class HuashuListAPIView(APIView):
"""POST /houtai/hthqhs — 获取话术配置列表"""
permission_classes = [IsAuthenticated]
def post(self, request):
username_frontend = request.data.get('username')
kefu, permissions = verify_kefu_permission(request, username_frontend)
if kefu is None:
return Response({'code': 403, 'msg': '身份验证失败,请检查登录状态'})
if HUASHU_REQUIRED_PERMISSION not in permissions:
return Response({'code': 403, 'msg': '您没有权限访问话术配置功能'})
scene_key = request.data.get('scene_key')
qs = HuashuConfig.objects.all().order_by('scene_key', '-priority', 'sort_order', 'id')
if scene_key:
qs = qs.filter(scene_key=scene_key)
items = [_serialize_item(i) for i in qs]
scenes = [{'key': c[0], 'label': c[1]} for c in HuashuConfig.SCENE_CHOICES]
return Response({'code': 0, 'data': {'items': items, 'scenes': scenes}})
class HuashuModifyAPIView(APIView):
"""POST /houtai/htxghs — 话术配置增删改"""
permission_classes = [IsAuthenticated]
def post(self, request):
username_frontend = request.data.get('username')
kefu, permissions = verify_kefu_permission(request, username_frontend)
if kefu is None:
return Response({'code': 403, 'msg': '身份验证失败,请检查登录状态'})
if HUASHU_REQUIRED_PERMISSION not in permissions:
return Response({'code': 403, 'msg': '您没有权限操作话术配置'})
action = request.data.get('action')
if not action:
return Response({'code': 400, 'msg': '缺少 action 参数'})
try:
if action == 'create':
return self._create(request)
if action == 'update':
return self._update(request)
if action == 'delete':
return self._delete(request)
return Response({'code': 400, 'msg': f'未知的 action: {action}'})
except Exception as e:
return Response({'code': 500, 'msg': f'操作失败: {str(e)}'})
def _create(self, request):
scene_key = request.data.get('scene_key')
item_type = request.data.get('item_type')
content = (request.data.get('content') or '').strip()
if not scene_key or not item_type or not content:
return Response({'code': 400, 'msg': 'scene_key、item_type、content 为必填'})
valid_scenes = {c[0] for c in HuashuConfig.SCENE_CHOICES}
valid_types = {c[0] for c in HuashuConfig.ITEM_TYPE_CHOICES}
if scene_key not in valid_scenes:
return Response({'code': 400, 'msg': '无效的场景标识'})
if item_type not in valid_types:
return Response({'code': 400, 'msg': '无效的条目类型'})
keywords = request.data.get('keywords') or []
if not isinstance(keywords, list):
keywords = []
item = HuashuConfig.objects.create(
scene_key=scene_key,
item_type=item_type,
title=request.data.get('title', ''),
content=content,
confirm_text=request.data.get('confirm_text', '我知道了'),
cancel_text=request.data.get('cancel_text', '取消'),
keywords=keywords,
match_mode=request.data.get('match_mode', HuashuConfig.MATCH_CONTAINS),
priority=int(request.data.get('priority', 0)),
is_active=bool(request.data.get('is_active', True)),
sort_order=int(request.data.get('sort_order', 0)),
)
return Response({'code': 0, 'msg': '创建成功', 'data': _serialize_item(item)})
def _update(self, request):
item_id = request.data.get('id')
if not item_id:
return Response({'code': 400, 'msg': '缺少 id'})
try:
item = HuashuConfig.objects.get(id=item_id)
except HuashuConfig.DoesNotExist:
return Response({'code': 404, 'msg': '记录不存在'})
if 'scene_key' in request.data:
scene_key = request.data.get('scene_key')
valid_scenes = {c[0] for c in HuashuConfig.SCENE_CHOICES}
if scene_key not in valid_scenes:
return Response({'code': 400, 'msg': '无效的场景标识'})
item.scene_key = scene_key
if 'item_type' in request.data:
item_type = request.data.get('item_type')
valid_types = {c[0] for c in HuashuConfig.ITEM_TYPE_CHOICES}
if item_type not in valid_types:
return Response({'code': 400, 'msg': '无效的条目类型'})
item.item_type = item_type
if 'title' in request.data:
item.title = request.data.get('title', '')
if 'content' in request.data:
content = (request.data.get('content') or '').strip()
if not content:
return Response({'code': 400, 'msg': 'content 不能为空'})
item.content = content
if 'confirm_text' in request.data:
item.confirm_text = request.data.get('confirm_text', '我知道了')
if 'cancel_text' in request.data:
item.cancel_text = request.data.get('cancel_text', '取消')
if 'keywords' in request.data:
keywords = request.data.get('keywords') or []
item.keywords = keywords if isinstance(keywords, list) else []
if 'match_mode' in request.data:
item.match_mode = request.data.get('match_mode', HuashuConfig.MATCH_CONTAINS)
if 'priority' in request.data:
item.priority = int(request.data.get('priority', 0))
if 'is_active' in request.data:
item.is_active = bool(request.data.get('is_active'))
if 'sort_order' in request.data:
item.sort_order = int(request.data.get('sort_order', 0))
item.save()
return Response({'code': 0, 'msg': '更新成功', 'data': _serialize_item(item)})
def _delete(self, request):
item_id = request.data.get('id')
if not item_id:
return Response({'code': 400, 'msg': '缺少 id'})
deleted, _ = HuashuConfig.objects.filter(id=item_id).delete()
if not deleted:
return Response({'code': 404, 'msg': '记录不存在'})
return Response({'code': 0, 'msg': '删除成功'})