176 lines
7.4 KiB
Python
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': '删除成功'})
|