72 lines
2.9 KiB
Python
72 lines
2.9 KiB
Python
"""客服后台:企业微信客服链接(打手端 / 商家端)。"""
|
|
import logging
|
|
|
|
from django.db import OperationalError, ProgrammingError
|
|
from rest_framework.parsers import JSONParser
|
|
from rest_framework.permissions import IsAuthenticated
|
|
from rest_framework.response import Response
|
|
from rest_framework.views import APIView
|
|
|
|
from backend.utils import verify_kefu_permission, has_club_super_perm, has_perm_code
|
|
from jituan.services.club_context import resolve_club_id_from_request
|
|
from jituan.services import wecom_kefu as svc
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
PERM_CODE = '8080a'
|
|
|
|
|
|
def _auth(request):
|
|
phone = (request.data.get('phone') or request.data.get('username') or '').strip()
|
|
if not phone:
|
|
return None, Response({'code': 401, 'msg': '缺少客服账号'})
|
|
kefu, permissions = verify_kefu_permission(request, phone)
|
|
if kefu is None:
|
|
return None, permissions
|
|
user = getattr(request, 'user', None)
|
|
if getattr(user, 'IsSuperuser', False) or has_club_super_perm(permissions):
|
|
return kefu, None
|
|
if has_perm_code(permissions, PERM_CODE):
|
|
return kefu, None
|
|
return None, Response({'code': 403, 'msg': '无权限配置企业微信客服'})
|
|
|
|
|
|
class WecomKefuConfigView(APIView):
|
|
"""
|
|
POST /jituan/houtai/wecom-kefu-config
|
|
action: get | save
|
|
body.save: dashou: {link, enterpriseId}, merchant: {link, enterpriseId}
|
|
"""
|
|
permission_classes = [IsAuthenticated]
|
|
parser_classes = [JSONParser]
|
|
|
|
def post(self, request):
|
|
try:
|
|
kefu, err = _auth(request)
|
|
if err:
|
|
return err
|
|
club_id = (resolve_club_id_from_request(request) or '').strip()
|
|
if not club_id:
|
|
return Response({'code': 400, 'msg': '请先选择俱乐部'})
|
|
action = (request.data.get('action') or 'get').strip().lower()
|
|
if action == 'get':
|
|
row = svc.get_or_create_wecom_kefu(club_id)
|
|
return Response({'code': 0, 'msg': 'ok', 'data': svc.config_to_dict(row)})
|
|
if action == 'save':
|
|
try:
|
|
operator = getattr(request.user, 'UserUID', '') or ''
|
|
data = svc.save_wecom_kefu(club_id, request.data, updated_by=operator)
|
|
return Response({'code': 0, 'msg': '已保存', 'data': data})
|
|
except ValueError as e:
|
|
return Response({'code': 400, 'msg': str(e)})
|
|
return Response({'code': 400, 'msg': '未知 action'})
|
|
except (OperationalError, ProgrammingError) as e:
|
|
logger.exception('wecom-kefu-config db error: %s', e)
|
|
return Response({
|
|
'code': 500,
|
|
'msg': '企微客服配置表未就绪,请在服务器执行: python manage.py migrate jituan',
|
|
})
|
|
except Exception as e:
|
|
logger.exception('wecom-kefu-config failed: %s', e)
|
|
return Response({'code': 500, 'msg': f'服务器错误: {e}'})
|