71 lines
2.6 KiB
Python
71 lines
2.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""点单端搜索可指定打手(仅返回未封禁、当前未在服务中的打手)。"""
|
|
from django.db.models import Q
|
|
from rest_framework.permissions import IsAuthenticated
|
|
from rest_framework.response import Response
|
|
from rest_framework.views import APIView
|
|
|
|
from jituan.constants import CLUB_ID_DEFAULT
|
|
from jituan.services.club_context import resolve_effective_club_id
|
|
from orders.models import Order
|
|
from users.models import UserDashou
|
|
|
|
|
|
# 视为「接单中」:服务中 / 待结单 / 指定待接
|
|
_BUSY_ORDER_STATUS = (2, 7, 8)
|
|
|
|
|
|
class BossSearchDashouView(APIView):
|
|
"""
|
|
POST /yonghu/sousuodashou
|
|
body: { "keyword": "昵称或UID" } — 必须有关键词才返回列表(点搜索才展示)
|
|
"""
|
|
permission_classes = [IsAuthenticated]
|
|
|
|
def post(self, request):
|
|
keyword = (request.data.get('keyword') or '').strip()
|
|
if not keyword:
|
|
return Response({'code': 0, 'data': {'list': []}, 'msg': '请输入昵称或UID后搜索'})
|
|
|
|
club_id = resolve_effective_club_id(request, request.user) or CLUB_ID_DEFAULT
|
|
|
|
# 当前俱乐部忙碌打手 UID
|
|
busy_qs = Order.query.filter(
|
|
club_id=club_id,
|
|
zhuangtai__in=_BUSY_ORDER_STATUS,
|
|
)
|
|
busy_uids = set()
|
|
for row in busy_qs.only('PlayerID', 'AssignedID')[:2000]:
|
|
if row.PlayerID:
|
|
busy_uids.add(str(row.PlayerID))
|
|
if row.AssignedID:
|
|
busy_uids.add(str(row.AssignedID))
|
|
|
|
qs = (
|
|
UserDashou.query.select_related('user')
|
|
.filter(zhuangtai=1, zhanghaozhuangtai=1)
|
|
.filter(
|
|
Q(nicheng__icontains=keyword) | Q(user__UserUID__icontains=keyword)
|
|
)
|
|
.order_by('-jinrijiedan', '-CreateTime')[:50]
|
|
)
|
|
|
|
result = []
|
|
for ds in qs:
|
|
user = ds.user
|
|
uid = str(user.UserUID or '')
|
|
if not uid or uid in busy_uids:
|
|
continue
|
|
user_club = (getattr(user, 'ClubID', None) or getattr(user, 'club_id', None) or '').strip()
|
|
# 有俱乐部归属时只返回本俱乐部打手;历史无 club 的也允许被指定
|
|
if user_club and user_club != club_id:
|
|
continue
|
|
result.append({
|
|
'uid': uid,
|
|
'nicheng': ds.nicheng or getattr(user, 'UserName', '') or uid,
|
|
'touxiang': getattr(user, 'Avatar', '') or '',
|
|
'zaixian': int(ds.zaixianzhuangtai or 0),
|
|
})
|
|
|
|
return Response({'code': 0, 'data': {'list': result}})
|