From f59ae2416fd3afc812c0056012da030463f12441 Mon Sep 17 00:00:00 2001 From: XingQue Date: Mon, 27 Jul 2026 03:33:35 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=89=93=E6=89=8B=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E7=BB=84=E9=98=9F=E6=A0=87=E8=AE=B0=EF=BC=8C?= =?UTF-8?q?=E9=98=9F=E5=8F=8B=E4=B9=9F=E5=8F=AF=E7=9C=8B=E5=8D=95=EF=BC=9B?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E8=BF=94=E5=9B=9E=E9=98=9F=E5=8F=8B=E6=98=B5?= =?UTF-8?q?=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 列表附 has_team/角色/人数;组队在队成员纳入订单列表查询。 Co-authored-by: Cursor --- orders/services/team_recruit.py | 59 ++++++++++++++++++++++++++++++++- orders/views/dashou.py | 32 ++++++++++++++++-- 2 files changed, 87 insertions(+), 4 deletions(-) diff --git a/orders/services/team_recruit.py b/orders/services/team_recruit.py index a01e78b..7ab5c95 100644 --- a/orders/services/team_recruit.py +++ b/orders/services/team_recruit.py @@ -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 diff --git a/orders/views/dashou.py b/orders/views/dashou.py index 4eea90d..d9d807e 100644 --- a/orders/views/dashou.py +++ b/orders/views/dashou.py @@ -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. 判断是否还有更多数据