优化服务号订单广播(Celery并发)与群聊状态实时推送

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-06-24 00:43:30 +08:00
parent 56c66846cc
commit 49ba67ecaf
9 changed files with 458 additions and 331 deletions

View File

@@ -166,7 +166,7 @@ def _ensure_avatar_url(avatar_url):
def _build_pair_group_to_data(dashou_goeasy_id, dashou_name, dashou_avatar,
partner_goeasy_id, partner_name, partner_avatar,
order_id=None, order_desc=None, is_cross=0,
viewer_goeasy_id=None):
viewer_goeasy_id=None, order_zuangtai=None):
"""群会话 to.data同时写入打手/对方双方 ID、昵称、头像前端按当前身份取对方展示"""
dashou_avatar = _ensure_avatar_url(dashou_avatar)
partner_avatar = _ensure_avatar_url(partner_avatar)
@@ -190,6 +190,8 @@ def _build_pair_group_to_data(dashou_goeasy_id, dashou_name, dashou_avatar,
to_data['orderId'] = order_id
if order_desc:
to_data['orderDesc'] = order_desc[:300]
if order_zuangtai is not None:
to_data['orderZhuangtai'] = order_zuangtai
if viewer_goeasy_id == dashou_goeasy_id:
to_data['name'] = partner_name
@@ -220,6 +222,7 @@ def build_pair_to_data_for_order(order, viewer_goeasy_id=None):
partner_goeasy_id, partner_name, partner_avatar,
order_id=order.dingdan_id, order_desc=order_desc,
is_cross=order.is_cross or 0, viewer_goeasy_id=viewer_goeasy_id,
order_zuangtai=order.zhuangtai,
)
@@ -832,4 +835,107 @@ def _create_local_group_only(order, dashou_goeasy_id, dashou_name, dashou_avatar
"订单已接单。", None, order_id=order.dingdan_id,
is_cross=order.is_cross, to_data_extra=to_data,
)
return subscribe_ok or msg_ok
return subscribe_ok or msg_ok
STATUS_NOTIFY_TEXT = {
2: '订单已开始服务',
3: '订单已完成',
4: '订单退款申请中',
5: '订单已退款',
6: '退款未通过',
8: '打手已提交交付,订单进入结算中',
}
def schedule_order_status_chat_push(dingdan_id):
"""订单状态变更后,事务提交后异步推送群聊状态更新"""
if not dingdan_id:
return
def _run():
try:
from dingdan.tasks import push_order_status_chat_task
push_order_status_chat_task.apply_async(args=[dingdan_id], countdown=1)
except Exception as e:
logger.error(f"调度订单状态聊天推送失败 {dingdan_id}: {e}", exc_info=True)
try:
from django.db import transaction
transaction.on_commit(_run)
except Exception:
_run()
def push_order_status_chat_update(dingdan_id):
"""向订单群推送状态提示 + 最新订单卡片(含实时 zhuangtai"""
try:
order = Dingdan.objects.select_related('pingtai_kuozhan', 'shangjia_kuozhan').get(dingdan_id=dingdan_id)
except Dingdan.DoesNotExist:
logger.warning(f"push_order_status_chat_update: 订单 {dingdan_id} 不存在")
return False
dashou_uid = order.jiedan_dashou_id
if not dashou_uid:
return False
appkey = _get_self_goeasy_appkey()
secret = _get_self_goeasy_secret()
if not appkey:
return False
dashou_goeasy_id = f'Ds{dashou_uid}'
dashou_name, dashou_avatar = _resolve_goeasy_user_display(dashou_goeasy_id)
partner_goeasy_id, partner_name, partner_avatar = _get_local_partner_info(order)
if not partner_goeasy_id:
return False
group_id = resolve_group_id_for_order(order, dashou_uid)
order_desc = (order.jieshao or '').strip()
if order.beizhu:
order_desc = f"{order_desc} | 备注:{order.beizhu}" if order_desc else f"备注:{order.beizhu}"
pair_to_data = _build_pair_group_to_data(
dashou_goeasy_id, dashou_name, dashou_avatar,
partner_goeasy_id, partner_name, partner_avatar,
order_id=order.dingdan_id, order_desc=order_desc,
is_cross=order.is_cross or 0, order_zuangtai=order.zhuangtai,
)
user_ids = list({dashou_goeasy_id, partner_goeasy_id})
_retry_call(_subscribe_users_to_group, 3, 0.4, user_ids, [group_id], appkey, secret)
status_text = STATUS_NOTIFY_TEXT.get(order.zhuangtai, '订单状态已更新')
notify_text = f"【订单状态】{status_text}"
_retry_call(
_send_group_message, 3, 0.4,
appkey, secret, group_id, dashou_goeasy_id, dashou_name, dashou_avatar,
notify_text, None, order_id=order.dingdan_id,
is_cross=order.is_cross or 0, to_data_extra=pair_to_data,
)
card_ok = _retry_call(
_push_order_card_message, 3, 0.4,
appkey, secret, order, group_id, dashou_goeasy_id, dashou_name, dashou_avatar,
pair_to_data,
)
partner_order_id = order.partner_order_id
partner_club_id = order.partner_club_id
if order.is_cross == 1 and partner_order_id and partner_club_id:
try:
partner_cfg = ClubConfig.objects.get(club_id=partner_club_id, is_self=0)
if partner_cfg and partner_cfg.chat_api_key:
partner_appkey = partner_cfg.chat_api_key
partner_secret = partner_cfg.chat_api_id or ''
partner_group_id = f"group_{partner_order_id}"
agent_id = f"{order.dingdan_id}_{dashou_goeasy_id}"
agent_name = f"[状态]{dashou_name}"
_retry_call(
_send_group_message, 2, 0.4,
partner_appkey, partner_secret, partner_group_id, agent_id, agent_name, '',
notify_text, None, order_id=partner_order_id, is_cross=1,
)
except Exception as e:
logger.warning(f"跨平台状态推送失败: {e}")
return card_ok