diff --git a/orders/services/team_recruit.py b/orders/services/team_recruit.py index e08207c..93ff006 100644 --- a/orders/services/team_recruit.py +++ b/orders/services/team_recruit.py @@ -179,23 +179,6 @@ def _set_dashou_busy(uid: str, busy: bool): UserDashou.objects.filter(user=u).update(zhuangtai=0 if busy else 1) -def _subscribe_uids_to_order_group(order_id: str, uids: list): - """订阅 Ds{uid} 到 group_{order_id}。失败只打日志。""" - try: - from utils.chat_utils import _subscribe_users_to_group, _get_self_goeasy_appkey, _get_self_goeasy_secret - appkey = _get_self_goeasy_appkey() - secret = _get_self_goeasy_secret() - if not appkey: - return False - user_ids = [f'Ds{u}' for u in uids if u] - if not user_ids: - return False - return _subscribe_users_to_group(user_ids, [f'group_{order_id}'], appkey, secret) - except Exception as e: - logger.warning('组队拉群失败 order=%s: %s', order_id, e) - return False - - def _dashou_display_name(uid: str) -> str: try: from users.business_models import User @@ -222,9 +205,9 @@ def _dashou_display_name(uid: str) -> str: def _sync_team_order_group_chat(order, dashou_uids: list, *, announce_uid=None, announce_text=None): """ - 组队群统一 group_{订单ID}: - - 订阅:打手们 + 商家/老板(派单方) - - 可选:发送入队/开组系统消息,触发监听中用户实时收到 + 组队复用抢单配对群(不另建 group_{订单}): + - 订阅:打手们 + 商家/老板到原群 + - 可选:在原群发开组/入队公告 """ oid = (getattr(order, 'OrderID', None) or '').strip() if not oid: @@ -237,13 +220,14 @@ def _sync_team_order_group_chat(order, dashou_uids: list, *, announce_uid=None, _get_self_goeasy_secret, _get_local_partner_info, _full_local_avatar, + resolve_order_chat_group_id, ) appkey = _get_self_goeasy_appkey() secret = _get_self_goeasy_secret() if not appkey: return False - group_id = f'group_{oid}' + group_id = resolve_order_chat_group_id(order) or f'group_{oid}' user_ids = [] for u in dashou_uids or []: u = (u or '').strip() @@ -261,7 +245,7 @@ def _sync_team_order_group_chat(order, dashou_uids: list, *, announce_uid=None, ok = _subscribe_users_to_group(user_ids, [group_id], appkey, secret) if not ok: - logger.warning('组队订阅群失败 order=%s users=%s', oid, user_ids) + logger.warning('组队订阅群失败 order=%s group=%s users=%s', oid, group_id, user_ids) if announce_uid and announce_text: sender_id = f'Ds{announce_uid}' @@ -281,7 +265,7 @@ def _sync_team_order_group_chat(order, dashou_uids: list, *, announce_uid=None, announce_text, None, group_name=group_name, order_id=oid, ) if not sent: - logger.warning('组队群消息发送失败 order=%s text=%s', oid, announce_text) + logger.warning('组队群消息发送失败 order=%s group=%s text=%s', oid, group_id, announce_text) return bool(ok and sent) return bool(ok) except Exception as e: @@ -380,7 +364,7 @@ def open_recruit( order, [leader_uid], announce_uid=leader_uid, - announce_text=f'{name} 已开启组队招募,请在组队群沟通', + announce_text=f'{name} 已开启组队招募,可在本群沟通', ) _log(club_id, oid, rec.id, leader_uid, 'open', f'mode={mode} need={need} display={display}') return rec diff --git a/utils/chat_utils.py b/utils/chat_utils.py index b0c8217..ea01cd2 100644 --- a/utils/chat_utils.py +++ b/utils/chat_utils.py @@ -106,18 +106,10 @@ def resolve_pair_group_id(order): def resolve_order_chat_group_id(order): """ - 进订单聊天用的群 ID: - - 存在进行中组队 → 统一 group_{订单ID}(组队成员 + 商家/老板同群) - - 否则 → 配对群 + 进订单聊天用的群 ID:始终优先配对群 group_Ds…_Sj/Boss…(抢单时已建)。 + 组队只往该群加人/发公告,不再切到 group_{订单ID} 另起会话。 """ oid = (getattr(order, 'OrderID', None) or '').strip() - if oid: - try: - from orders.services.team_recruit import get_active_recruit - if get_active_recruit(oid): - return f'group_{oid}' - except Exception as e: - logger.warning('resolve_order_chat_group_id 查组队失败 order=%s: %s', oid, e) return resolve_pair_group_id(order) or (f'group_{oid}' if oid else None) @@ -219,7 +211,7 @@ def _get_dashou_profile(order): def build_order_group_chat_payload(order, viewer_backend_identity, viewer_uid): - """构建前端 ltdhzb 所需群聊元数据(有组队时用 group_{订单ID})""" + """构建前端 ltdhzb 所需群聊元数据(统一配对群,组队不另建群)""" group_id = resolve_order_chat_group_id(order) or f'group_{order.OrderID}' order_desc = order.Description or '' group_name = ( @@ -289,17 +281,20 @@ def prepare_order_group_chat(order, viewer_backend_identity, viewer_uid, subscri if payload.get('partnerGoEasyId'): user_ids.add(payload['partnerGoEasyId']) - # 组队订单群:把在队打手一并订阅,保证历史/实时都能到 + # 有组队时:把在队打手一并订阅进同一配对群 oid = (getattr(order, 'OrderID', None) or '').strip() - if oid and group_id == f'group_{oid}': + if oid: try: from orders.models import TeamMember - for m in TeamMember.query.filter( - order_id=oid, join_status=TeamMember.JOIN_ACTIVE, - ).only('user_uid')[:20]: - uid = (m.user_uid or '').strip() - if uid: - user_ids.add(f'Ds{uid}') + from orders.services.team_recruit import get_active_recruit + rec = get_active_recruit(oid) + if rec: + for m in TeamMember.query.filter( + recruit_id=rec.id, join_status=TeamMember.JOIN_ACTIVE, + ).only('user_uid')[:20]: + uid = (m.user_uid or '').strip() + if uid: + user_ids.add(f'Ds{uid}') except Exception as e: logger.warning('prepare 订阅组队成员失败 order=%s: %s', oid, e) @@ -413,7 +408,7 @@ def establish_order_chat(dingdan_id): # ========== 普通订单 / 我方派单 ========== def _handle_local_order(order, dashou_goeasy_id, dashou_name, dashou_avatar, appkey, secret): - # 与详情「联系」一致:有组队用 group_订单,否则配对群 + # 与详情「联系」一致:统一配对群(组队不另建) group_id = resolve_order_chat_group_id(order) or f"group_{order.OrderID}" group_name = (order.Description[:20] + '…') if order.Description and len(order.Description) > 20 else (order.Description or f"订单{order.OrderID}") group_avatar = _full_local_avatar(order.ImageURL) if order.ImageURL else _full_local_avatar('')