优化服务号订单广播(Celery并发)与群聊状态实时推送
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user