# 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': '删除成功'})