feat: 组队角标刷新、成员头像预分成、商家详情组队与比例分红展示
This commit is contained in:
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
|
||||
@@ -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 '')),
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
})
|
||||
Reference in new issue
Block a user