feat: 打手订单列表组队标记,队友也可看单;详情返回队友昵称

列表附 has_team/角色/人数;组队在队成员纳入订单列表查询。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-27 03:33:35 +08:00
parent 454f5abe90
commit f59ae2416f
2 changed files with 87 additions and 4 deletions

View File

@@ -688,14 +688,71 @@ def serialize_recruit_public(rec, order=None, *, include_game_ids=False) -> dict
if include_game_ids:
from orders.models import TeamMember
mems = TeamMember.query.filter(recruit_id=rec.id, join_status=1)
from users.business_models import User
mems = list(TeamMember.query.filter(recruit_id=rec.id, join_status=1))
uids = [m.user_uid for m in mems]
nick_map = {}
if uids:
for u in User.query.filter(UserUID__in=uids).select_related('DashouProfile'):
try:
nick_map[u.UserUID] = (u.DashouProfile.nicheng or '') if getattr(u, 'DashouProfile', None) else ''
except Exception:
nick_map[u.UserUID] = ''
data['members'] = [
{
'user_uid': m.user_uid,
'role': m.role,
'role_text': '队长' if m.role == 'leader' else '队友',
'nicheng': nick_map.get(m.user_uid, ''),
'game_id': m.game_id,
'share_amount': float(_d(m.share_amount)),
}
for m in mems
]
return data
def batch_team_list_flags(order_ids: list, viewer_uid: str = '') -> dict:
"""订单列表用:{order_id: {has_team, team_status, ...}}不含游戏ID。"""
from orders.models import TeamRecruit, TeamMember
if not order_ids:
return {}
recs = list(
TeamRecruit.query.filter(
order_id__in=list(order_ids),
status__in=[
TeamRecruit.STATUS_RECRUITING,
TeamRecruit.STATUS_LOCKED,
TeamRecruit.STATUS_FINISHED,
],
)
)
if not recs:
return {}
# 一单一帖取最新
best = {}
for r in recs:
prev = best.get(r.order_id)
if not prev or r.id > prev.id:
best[r.order_id] = r
rids = [r.id for r in best.values()]
my_roles = {}
if viewer_uid and rids:
for m in TeamMember.query.filter(
recruit_id__in=rids, user_uid=viewer_uid, join_status=TeamMember.JOIN_ACTIVE,
):
my_roles[m.recruit_id] = m.role
out = {}
status_text = {1: '招募中', 2: '已锁定', 3: '已结束'}
for oid, r in best.items():
role = my_roles.get(r.id) or ('leader' if viewer_uid and r.leader_uid == viewer_uid else '')
out[oid] = {
'has_team': True,
'team_status': r.status,
'team_status_text': status_text.get(r.status, ''),
'team_joined': int(r.joined_count or 0),
'team_need': int(r.need_count or 0),
'team_role': role,
'team_role_text': '队长' if role == 'leader' else ('队友' if role == 'member' else ''),
}
return out

View File

@@ -663,8 +663,29 @@ class DashouDingdanHuoquView1(APIView):
# 4. 构建查询条件
try:
# 基础条件:当前打手接单
query = Q(PlayerID=yonghuid)
# 基础条件:本人接单 或 本俱乐部组队在队成员(队友也能在订单列表看到)
from orders.models import TeamMember, TeamRecruit
team_oids = list(
TeamMember.query.filter(
user_uid=yonghuid,
join_status=TeamMember.JOIN_ACTIVE,
).values_list('order_id', flat=True)[:500]
)
if team_oids:
# 仅有效组队帖(招募中/锁定/已分账结束)
valid_oids = list(
TeamRecruit.query.filter(
order_id__in=team_oids,
status__in=[
TeamRecruit.STATUS_RECRUITING,
TeamRecruit.STATUS_LOCKED,
TeamRecruit.STATUS_FINISHED,
],
).values_list('order_id', flat=True)
)
query = Q(PlayerID=yonghuid) | Q(OrderID__in=valid_oids or ['__none__'])
else:
query = Q(PlayerID=yonghuid)
# 状态筛选:如果 zhuangtai_list 不为空列表,则加入筛选;否则查询全部状态
if zhuangtai_list:
@@ -708,8 +729,11 @@ class DashouDingdanHuoquView1(APIView):
current_page_orders = dingdan_query[start_index:end_index]
current_page_count = len(current_page_orders)
# 7. 构建返回数据列表
# 7. 构建返回数据列表附组队标记无游戏ID
from jituan.services.order_deal import order_auto_settle_payload
from orders.services.team_recruit import batch_team_list_flags
page_oids = [o.OrderID for o in current_page_orders]
team_flags = batch_team_list_flags(page_oids, viewer_uid=yonghuid)
order_list = []
for order in current_page_orders:
order_data = {
@@ -722,6 +746,8 @@ class DashouDingdanHuoquView1(APIView):
**datetime_aliases(order.CreateTime),
}
order_data.update(order_auto_settle_payload(order))
tf = team_flags.get(order.OrderID) or {'has_team': False}
order_data.update(tf)
order_list.append(order_data)
# 8. 判断是否还有更多数据