From c55b54995be36148bc04315934f5d0e34432246c Mon Sep 17 00:00:00 2001 From: XingQue Date: Mon, 10 Aug 2026 14:16:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=BB=84=E9=98=9F=E8=A7=92=E6=A0=87?= =?UTF-8?q?=E5=88=B7=E6=96=B0=E3=80=81=E6=88=90=E5=91=98=E5=A4=B4=E5=83=8F?= =?UTF-8?q?=E9=A2=84=E5=88=86=E6=88=90=E3=80=81=E5=95=86=E5=AE=B6=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E7=BB=84=E9=98=9F=E4=B8=8E=E6=AF=94=E4=BE=8B=E5=88=86?= =?UTF-8?q?=E7=BA=A2=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- orders/services/merchant_order_list_enrich.py | 13 +++++++ orders/services/partial_settle.py | 7 ++++ orders/services/team_recruit.py | 37 +++++++++++++------ orders/views/merchant.py | 20 ++++++++++ orders/views/zudui.py | 9 ++++- 5 files changed, 74 insertions(+), 12 deletions(-) diff --git a/orders/services/merchant_order_list_enrich.py b/orders/services/merchant_order_list_enrich.py index d08174c..fa37921 100644 --- a/orders/services/merchant_order_list_enrich.py +++ b/orders/services/merchant_order_list_enrich.py @@ -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 diff --git a/orders/services/partial_settle.py b/orders/services/partial_settle.py index cb26a29..ef4d19a 100644 --- a/orders/services/partial_settle.py +++ b/orders/services/partial_settle.py @@ -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 '')), } diff --git a/orders/services/team_recruit.py b/orders/services/team_recruit.py index 426f6b4..03b9947 100644 --- a/orders/services/team_recruit.py +++ b/orders/services/team_recruit.py @@ -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 diff --git a/orders/views/merchant.py b/orders/views/merchant.py index d37bd3d..9f857c0 100644 --- a/orders/views/merchant.py +++ b/orders/views/merchant.py @@ -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) diff --git a/orders/views/zudui.py b/orders/views/zudui.py index 4ab101d..7ab6622 100644 --- a/orders/views/zudui.py +++ b/orders/views/zudui.py @@ -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, }, })