fix: 组队复用抢单配对群,不再另建 group_订单
This commit is contained in:
@@ -179,23 +179,6 @@ def _set_dashou_busy(uid: str, busy: bool):
|
|||||||
UserDashou.objects.filter(user=u).update(zhuangtai=0 if busy else 1)
|
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:
|
def _dashou_display_name(uid: str) -> str:
|
||||||
try:
|
try:
|
||||||
from users.business_models import User
|
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):
|
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()
|
oid = (getattr(order, 'OrderID', None) or '').strip()
|
||||||
if not oid:
|
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_self_goeasy_secret,
|
||||||
_get_local_partner_info,
|
_get_local_partner_info,
|
||||||
_full_local_avatar,
|
_full_local_avatar,
|
||||||
|
resolve_order_chat_group_id,
|
||||||
)
|
)
|
||||||
appkey = _get_self_goeasy_appkey()
|
appkey = _get_self_goeasy_appkey()
|
||||||
secret = _get_self_goeasy_secret()
|
secret = _get_self_goeasy_secret()
|
||||||
if not appkey:
|
if not appkey:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
group_id = f'group_{oid}'
|
group_id = resolve_order_chat_group_id(order) or f'group_{oid}'
|
||||||
user_ids = []
|
user_ids = []
|
||||||
for u in dashou_uids or []:
|
for u in dashou_uids or []:
|
||||||
u = (u or '').strip()
|
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)
|
ok = _subscribe_users_to_group(user_ids, [group_id], appkey, secret)
|
||||||
if not ok:
|
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:
|
if announce_uid and announce_text:
|
||||||
sender_id = f'Ds{announce_uid}'
|
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,
|
announce_text, None, group_name=group_name, order_id=oid,
|
||||||
)
|
)
|
||||||
if not sent:
|
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 and sent)
|
||||||
return bool(ok)
|
return bool(ok)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -380,7 +364,7 @@ def open_recruit(
|
|||||||
order,
|
order,
|
||||||
[leader_uid],
|
[leader_uid],
|
||||||
announce_uid=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}')
|
_log(club_id, oid, rec.id, leader_uid, 'open', f'mode={mode} need={need} display={display}')
|
||||||
return rec
|
return rec
|
||||||
|
|||||||
@@ -106,18 +106,10 @@ def resolve_pair_group_id(order):
|
|||||||
|
|
||||||
def resolve_order_chat_group_id(order):
|
def resolve_order_chat_group_id(order):
|
||||||
"""
|
"""
|
||||||
进订单聊天用的群 ID:
|
进订单聊天用的群 ID:始终优先配对群 group_Ds…_Sj/Boss…(抢单时已建)。
|
||||||
- 存在进行中组队 → 统一 group_{订单ID}(组队成员 + 商家/老板同群)
|
组队只往该群加人/发公告,不再切到 group_{订单ID} 另起会话。
|
||||||
- 否则 → 配对群
|
|
||||||
"""
|
"""
|
||||||
oid = (getattr(order, 'OrderID', None) or '').strip()
|
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)
|
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):
|
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}'
|
group_id = resolve_order_chat_group_id(order) or f'group_{order.OrderID}'
|
||||||
order_desc = order.Description or ''
|
order_desc = order.Description or ''
|
||||||
group_name = (
|
group_name = (
|
||||||
@@ -289,17 +281,20 @@ def prepare_order_group_chat(order, viewer_backend_identity, viewer_uid, subscri
|
|||||||
if payload.get('partnerGoEasyId'):
|
if payload.get('partnerGoEasyId'):
|
||||||
user_ids.add(payload['partnerGoEasyId'])
|
user_ids.add(payload['partnerGoEasyId'])
|
||||||
|
|
||||||
# 组队订单群:把在队打手一并订阅,保证历史/实时都能到
|
# 有组队时:把在队打手一并订阅进同一配对群
|
||||||
oid = (getattr(order, 'OrderID', None) or '').strip()
|
oid = (getattr(order, 'OrderID', None) or '').strip()
|
||||||
if oid and group_id == f'group_{oid}':
|
if oid:
|
||||||
try:
|
try:
|
||||||
from orders.models import TeamMember
|
from orders.models import TeamMember
|
||||||
for m in TeamMember.query.filter(
|
from orders.services.team_recruit import get_active_recruit
|
||||||
order_id=oid, join_status=TeamMember.JOIN_ACTIVE,
|
rec = get_active_recruit(oid)
|
||||||
).only('user_uid')[:20]:
|
if rec:
|
||||||
uid = (m.user_uid or '').strip()
|
for m in TeamMember.query.filter(
|
||||||
if uid:
|
recruit_id=rec.id, join_status=TeamMember.JOIN_ACTIVE,
|
||||||
user_ids.add(f'Ds{uid}')
|
).only('user_uid')[:20]:
|
||||||
|
uid = (m.user_uid or '').strip()
|
||||||
|
if uid:
|
||||||
|
user_ids.add(f'Ds{uid}')
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.warning('prepare 订阅组队成员失败 order=%s: %s', oid, 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):
|
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_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_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('')
|
group_avatar = _full_local_avatar(order.ImageURL) if order.ImageURL else _full_local_avatar('')
|
||||||
|
|||||||
Reference in New Issue
Block a user