feat: 组队角标刷新、成员头像预分成、商家详情组队与比例分红展示

This commit is contained in:
XingQue committed 2026-08-10 14:16:46 +08:00
1 parent 5de74f0444
commit c55b54995b
5 files changed
+74 -12

No files matched your search

@@ -159,4 +159,17 @@ def enrich_merchant_order_list_items(ext_list, club_id=None):
pass
result.append(item)
# 组队摘要(商家列表:是否组队中、人数、预分成)
try:
from orders.services.team_recruit import batch_team_list_flags
flags = batch_team_list_flags(order_ids)
for item in result:
tf = flags.get(item['dingdan_id']) or {}
if tf.get('has_team'):
item.update(tf)
else:
item['has_team'] = False
except Exception as e:
logger.warning('商家订单列表-组队摘要失败: %s', e)
return result
+7
View File
@@ -215,6 +215,12 @@ def build_refund_settle_payload(order, *, viewer_uid: str = '') -> dict:
(getattr(order, 'RefundReason', None) or '').strip()
if apply_status in (0, None) and not reject_reason else ''
)
team_shares = []
if ratio_d is not None:
try:
team_shares = preview_partial_amounts(order, ratio_d).get('team_shares') or []
except Exception as e:
logger.warning('比例结算详情组队份额失败 %s: %s', oid, e)
return {
'tuikuan_liyou': show_apply,
'apply_reason': apply_reason,
@@ -235,6 +241,7 @@ def build_refund_settle_payload(order, *, viewer_uid: str = '') -> dict:
'partial_settled_by': getattr(order, 'PartialSettledBy', '') or '',
'can_partial_settle': can_partial,
'my_partial_share': my_partial_share,
'team_shares': team_shares,
'default_partial_settle_ratio': str(club_default_partial_ratio(getattr(order, 'ClubID', '') or '')),
}
+26 -11
View File
@@ -871,8 +871,8 @@ def maybe_split_penalties(*, order_id: str, total_amount, reason: str, applicant
return created
def serialize_recruit_public(rec, order=None, *, include_game_ids=False) -> dict:
"""大厅公开字段;游戏ID默认不返回。"""
def serialize_recruit_public(rec, order=None, *, include_game_ids=False, include_members=None) -> dict:
"""大厅公开字段;游戏ID默认不返回。include_members 可单独打开成员列表(商家详情)。"""
from orders.models import Order, MerchantOrderExt
from jituan.services.order_deal import order_auto_settle_payload
from jituan.models import DashouDealStat
@@ -1003,29 +1003,42 @@ def serialize_recruit_public(rec, order=None, *, include_game_ids=False) -> dict
except Exception:
data['shangjia_deal_stat'] = None
if include_game_ids:
# include_members 默认跟 include_game_ids;商家详情可只要成员/预分成不要游戏ID
show_members = include_game_ids if include_members is None else bool(include_members)
if show_members:
from orders.models import TeamMember
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 = {}
avatar_map = {}
if uids:
for u in User.query.filter(UserUID__in=uids).select_related('DashouProfile'):
avatar_map[u.UserUID] = getattr(u, 'Avatar', None) or ''
try:
nick_map[u.UserUID] = (u.DashouProfile.nicheng or '') if getattr(u, 'DashouProfile', None) else ''
nick_map[u.UserUID] = (
(u.DashouProfile.nicheng or '') if getattr(u, 'DashouProfile', None) else ''
)
except Exception:
nick_map[u.UserUID] = ''
data['members'] = [
{
disp = float(_d(rec.display_share_amount))
data['members'] = []
for m in mems:
amt = float(_d(m.share_amount))
# 招募中平均分成尚未落库时,用招募展示额作预分成
if amt <= 0 and m.role != 'leader':
amt = disp
row = {
'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)),
'nicheng': nick_map.get(m.user_uid, '') or '接单员',
'avatar': avatar_map.get(m.user_uid, ''),
'share_amount': amt,
}
for m in mems
]
if include_game_ids:
row['game_id'] = m.game_id or ''
data['members'].append(row)
return data
@@ -1071,5 +1084,7 @@ def batch_team_list_flags(order_ids: list, viewer_uid: str = '') -> dict:
'team_need': int(r.need_count or 0),
'team_role': role,
'team_role_text': '队长' if role == 'leader' else ('队友' if role == 'member' else ''),
'team_share_mode': r.share_mode,
'team_display_share_amount': float(_d(r.display_share_amount)),
}
return out
+20
View File
@@ -849,6 +849,26 @@ class ShangjiaDingdanXiangqingView(APIView):
except Exception as e:
logger.warning('退款/比例结算展示字段附加失败: %s', e)
# 组队信息(商家可见成员头像/预分成,不含游戏ID)
try:
from orders.services.team_recruit import get_active_recruit, serialize_recruit_public
from orders.models import TeamRecruit
rec = get_active_recruit(order.OrderID)
if not rec:
rec = TeamRecruit.query.filter(order_id=order.OrderID).order_by('-id').first()
if rec:
response_data['team'] = serialize_recruit_public(
rec, order, include_game_ids=False, include_members=True,
)
response_data['has_team'] = True
else:
response_data['team'] = None
response_data['has_team'] = False
except Exception as e:
logger.warning('商家订单详情组队信息附加失败: %s', e)
response_data['team'] = None
response_data['has_team'] = False
try:
from merchant_ops.services.order_enrich import enrich_order_detail_data
enrich_order_detail_data(response_data, dingdan_id)
+8 -1
View File
@@ -228,7 +228,7 @@ class ZuduiDatingView(APIView):
badge = {}
try:
from orders.services.dashou_badges import dashou_badge_fields
badge = dashou_badge_fields(club)
badge = dashou_badge_fields(club, user=request.user)
except Exception:
badge = {}
return Response({
@@ -349,6 +349,12 @@ class ZuduiWodeView(APIView):
as_leader_list = list(as_leader)
oids = [r.order_id for r in as_leader_list + as_member]
orders = {o.OrderID: o for o in Order.query.filter(OrderID__in=oids)} if oids else {}
badge = {}
try:
from orders.services.dashou_badges import dashou_badge_fields
badge = dashou_badge_fields(club, user=request.user)
except Exception:
badge = {}
return Response({
'code': 0,
'msg': 'ok',
@@ -361,5 +367,6 @@ class ZuduiWodeView(APIView):
team_svc.serialize_recruit_public(r, orders.get(r.order_id), include_game_ids=True)
for r in as_member
],
**badge,
},
})