feat: 打手订单列表组队标记,队友也可看单;详情返回队友昵称
列表附 has_team/角色/人数;组队在队成员纳入订单列表查询。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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. 判断是否还有更多数据
|
||||
|
||||
Reference in New Issue
Block a user