fix: 成交指标始终记账并回填;抢单建聊移出事务并重试

抢单池刷新触发历史回填,旧单也能出成交率/罚款率/均时;建聊失败重试并订阅组队成员,避免消息列表空白。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-27 08:46:22 +08:00
parent 5e38a3d49a
commit e3f9654002
4 changed files with 143 additions and 25 deletions

View File

@@ -413,16 +413,40 @@ def establish_order_chat(dingdan_id):
# ========== 普通订单 / 我方派单 ==========
def _handle_local_order(order, dashou_goeasy_id, dashou_name, dashou_avatar, appkey, secret):
group_id = resolve_pair_group_id(order) or f"group_{order.OrderID}"
# 与详情「联系」一致:有组队用 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('')
partner_goeasy_id, partner_name, partner_avatar = _get_local_partner_info(order)
if not partner_goeasy_id:
logger.error('抢单建聊失败:找不到商家/老板 partner order=%s', order.OrderID)
return False
# 订阅双方
if not _subscribe_users_to_group([dashou_goeasy_id, partner_goeasy_id], [group_id], appkey, secret):
subscribe_ids = [dashou_goeasy_id, partner_goeasy_id]
# 组队订单:把在队队员也拉进群,避免队员消息列表空白
try:
from orders.models import TeamMember, TeamRecruit
rec = TeamRecruit.query.filter(
order_id=order.OrderID,
status__in=[TeamRecruit.STATUS_RECRUITING, TeamRecruit.STATUS_LOCKED],
).first()
if rec:
for uid in TeamMember.query.filter(
recruit_id=rec.id, join_status=TeamMember.JOIN_ACTIVE,
).values_list('user_uid', flat=True):
u = (uid or '').strip()
if u:
subscribe_ids.append(f'Ds{u}')
except Exception as e:
logger.warning('抢单建聊订阅组队成员失败: %s', e)
# 订阅双方(失败则重试)
subscribed = _subscribe_users_to_group(subscribe_ids, [group_id], appkey, secret)
if not subscribed:
subscribed = _subscribe_users_to_group(subscribe_ids, [group_id], appkey, secret)
if not subscribed:
logger.error('抢单建聊订阅失败 order=%s group=%s', order.OrderID, group_id)
return False
# 1. 打手发送初始化消息
@@ -431,15 +455,28 @@ def _handle_local_order(order, dashou_goeasy_id, dashou_name, dashou_avatar, app
appkey, secret, group_id, dashou_goeasy_id, dashou_name, group_avatar,
init_msg_text, None, group_name=group_name, order_id=order.OrderID
)
if not success1:
success1 = _send_group_message(
appkey, secret, group_id, dashou_goeasy_id, dashou_name, group_avatar,
init_msg_text, None, group_name=group_name, order_id=order.OrderID
)
# 2. 【新增】派单方也发一条消息,确保他也能看到群聊
partner_msg = f"订单已确认,请开始服务"
# 2. 派单方也发一条,确保商家/老板会话列表能立刻出现该群
partner_msg = f"订单已被接单,请及时沟通"
success2 = _send_group_message(
appkey, secret, group_id, partner_goeasy_id, partner_name, partner_avatar,
partner_msg, None, group_name=group_name, order_id=order.OrderID
)
if not success2:
success2 = _send_group_message(
appkey, secret, group_id, partner_goeasy_id, partner_name, partner_avatar,
partner_msg, None, group_name=group_name, order_id=order.OrderID
)
return success1 and success2
ok = bool(success1 or success2)
if not ok:
logger.error('抢单建聊发消息失败 order=%s group=%s', order.OrderID, group_id)
return ok
def _get_local_partner_info(order):
"""本地订单下单方:老板或商家"""