累死了,删除了所有跨平台逻辑,进行了表迁移
This commit is contained in:
@@ -4,65 +4,24 @@ import logging
|
||||
import requests
|
||||
from django.conf import settings
|
||||
from orders.models import Dingdan, DingdanPingtai, DingdanShangjia
|
||||
from config.models import ClubConfig
|
||||
from users.models import UserMain, UserDashou, UserBoss, UserShangjia
|
||||
|
||||
logger = logging.getLogger('chat_utils')
|
||||
|
||||
# ========== 辅助配置获取(从 ClubConfig) ==========
|
||||
def _get_self_club_config():
|
||||
if not hasattr(_get_self_club_config, '_config'):
|
||||
try:
|
||||
_get_self_club_config._config = ClubConfig.objects.filter(is_self=1).first()
|
||||
except Exception as e:
|
||||
logger.warning(f"获取我方俱乐部配置失败: {e}")
|
||||
_get_self_club_config._config = None
|
||||
return _get_self_club_config._config
|
||||
|
||||
# ========== 辅助配置获取 ==========
|
||||
def _get_self_goeasy_appkey():
|
||||
cfg = _get_self_club_config()
|
||||
if cfg and cfg.chat_api_key:
|
||||
return cfg.chat_api_key
|
||||
return getattr(settings, 'GOEASY_APPKEY', '')
|
||||
|
||||
def _get_self_goeasy_secret():
|
||||
cfg = _get_self_club_config()
|
||||
if cfg and cfg.chat_api_id:
|
||||
return cfg.chat_api_id
|
||||
return getattr(settings, 'GOEASY_SECRET', '')
|
||||
|
||||
def _get_self_storage_domain():
|
||||
cfg = _get_self_club_config()
|
||||
if cfg and cfg.storage_bucket_domain:
|
||||
return cfg.storage_bucket_domain
|
||||
return ''
|
||||
|
||||
def _get_self_default_avatar():
|
||||
cfg = _get_self_club_config()
|
||||
if cfg and cfg.club_avatar:
|
||||
return cfg.club_avatar
|
||||
return ''
|
||||
|
||||
# ========== 头像拼接 ==========
|
||||
def _full_local_avatar(relative_url):
|
||||
storage_domain = _get_self_storage_domain()
|
||||
default_avatar = _get_self_default_avatar()
|
||||
if not relative_url:
|
||||
return default_avatar or ''
|
||||
if relative_url.startswith('http'):
|
||||
return relative_url
|
||||
if storage_domain.endswith('/'):
|
||||
return storage_domain + relative_url.lstrip('/')
|
||||
return storage_domain + '/' + relative_url if storage_domain else relative_url
|
||||
|
||||
def _full_remote_avatar(storage_bucket_domain, relative_url):
|
||||
if not relative_url:
|
||||
return ''
|
||||
if relative_url.startswith('http'):
|
||||
return relative_url
|
||||
if storage_bucket_domain.endswith('/'):
|
||||
return storage_bucket_domain + relative_url.lstrip('/')
|
||||
return storage_bucket_domain + '/' + relative_url if storage_bucket_domain else relative_url
|
||||
return relative_url
|
||||
|
||||
# ========== GoEasy 订阅 ==========
|
||||
def _subscribe_users_to_group(user_ids, group_ids, appkey=None, secret=None):
|
||||
@@ -90,7 +49,7 @@ def _subscribe_users_to_group(user_ids, group_ids, appkey=None, secret=None):
|
||||
|
||||
# ========== 发送群消息(完整参数) ==========
|
||||
def _send_group_message(appkey, secret, group_id, sender_id, sender_name, sender_avatar,
|
||||
message_text, custom_payload=None, group_name=None, order_id=None, is_cross=0):
|
||||
message_text, custom_payload=None, group_name=None, order_id=None):
|
||||
if not appkey:
|
||||
appkey = _get_self_goeasy_appkey()
|
||||
if not secret:
|
||||
@@ -108,7 +67,6 @@ def _send_group_message(appkey, secret, group_id, sender_id, sender_name, sender
|
||||
}
|
||||
if order_id:
|
||||
to_data["orderId"] = order_id
|
||||
to_data["isCross"] = is_cross
|
||||
|
||||
payload_str = custom_payload.get("text", message_text) if custom_payload else message_text
|
||||
|
||||
@@ -165,17 +123,8 @@ def establish_order_chat(dingdan_id):
|
||||
logger.error("GoEasy AppKey 未配置")
|
||||
return False
|
||||
|
||||
# 判断是否跨平台
|
||||
if order.is_cross != 1:
|
||||
return _handle_local_order(order, dashou_goeasy_id, dashou_nickname, dashou_avatar, appkey, secret)
|
||||
else:
|
||||
if order.dispatch_type == 1:
|
||||
# 我方派单,与普通订单处理一致
|
||||
return _handle_local_order(order, dashou_goeasy_id, dashou_nickname, dashou_avatar, appkey, secret)
|
||||
elif order.dispatch_type == 2:
|
||||
return _handle_cross_partner_order(order, dashou_goeasy_id, dashou_nickname, dashou_avatar, appkey, secret)
|
||||
else:
|
||||
return False
|
||||
# 本地订单处理
|
||||
return _handle_local_order(order, dashou_goeasy_id, dashou_nickname, dashou_avatar, appkey, secret)
|
||||
|
||||
# ========== 普通订单 / 我方派单 ==========
|
||||
def _handle_local_order(order, dashou_goeasy_id, dashou_name, dashou_avatar, appkey, secret):
|
||||
@@ -195,16 +144,14 @@ def _handle_local_order(order, dashou_goeasy_id, dashou_name, dashou_avatar, app
|
||||
init_msg_text = f"订单已接单,内容:{order.jieshao},备注:{order.beizhu},游戏ID:{order.nicheng}"
|
||||
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.dingdan_id,
|
||||
is_cross=order.is_cross
|
||||
init_msg_text, None, group_name=group_name, order_id=order.dingdan_id
|
||||
)
|
||||
|
||||
# 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.dingdan_id,
|
||||
is_cross=order.is_cross
|
||||
partner_msg, None, group_name=group_name, order_id=order.dingdan_id
|
||||
)
|
||||
|
||||
return success1 and success2
|
||||
@@ -247,128 +194,4 @@ def _get_local_partner_info(order):
|
||||
else:
|
||||
if order.user1_id:
|
||||
return order.user1_id, "用户", _full_local_avatar('')
|
||||
return None, None, None
|
||||
|
||||
# ========== 跨平台 + 对方派单 ==========
|
||||
def _handle_cross_partner_order(order, dashou_goeasy_id, dashou_name, dashou_avatar, appkey, secret):
|
||||
partner_club_id = order.partner_club_id
|
||||
if not partner_club_id:
|
||||
logger.warning("缺少 partner_club_id")
|
||||
return _create_local_group_only(order, dashou_goeasy_id, dashou_name, dashou_avatar, appkey, secret)
|
||||
|
||||
try:
|
||||
partner_config = ClubConfig.objects.get(club_id=partner_club_id, is_self=0)
|
||||
except ClubConfig.DoesNotExist:
|
||||
logger.error(f"未找到对方俱乐部配置: {partner_club_id}")
|
||||
return _create_local_group_only(order, dashou_goeasy_id, dashou_name, dashou_avatar, appkey, secret)
|
||||
|
||||
partner_order_id = order.partner_order_id
|
||||
if not partner_order_id:
|
||||
logger.error("partner_order_id 为空")
|
||||
return _create_local_group_only(order, dashou_goeasy_id, dashou_name, dashou_avatar, appkey, secret)
|
||||
|
||||
# 推断对方下单方标识
|
||||
target_partner_goeasy_id = _get_cross_partner_identity(order, partner_order_id)
|
||||
if not target_partner_goeasy_id:
|
||||
logger.error("无法推断对方下单方标识")
|
||||
return _create_local_group_only(order, dashou_goeasy_id, dashou_name, dashou_avatar, appkey, secret)
|
||||
|
||||
# 对方默认头像
|
||||
partner_default_avatar = _full_remote_avatar(partner_config.storage_bucket_domain or '', partner_config.club_avatar or '') or _full_local_avatar('')
|
||||
|
||||
# ---- 1. 在我方建群 ----
|
||||
local_group_id = f"group_{order.dingdan_id}"
|
||||
local_group_name = (order.jieshao[:20] + '…') if order.jieshao and len(order.jieshao) > 20 else f"跨平台订单{order.dingdan_id}"
|
||||
local_group_avatar = _full_local_avatar(order.tupian) if order.tupian else _full_local_avatar('')
|
||||
proxy_partner_id = f"{partner_order_id}_{target_partner_goeasy_id}"
|
||||
proxy_partner_name = f"对方用户({partner_club_id})"
|
||||
# 对方代理头像使用对方默认头像
|
||||
proxy_partner_avatar = partner_default_avatar
|
||||
|
||||
if not _subscribe_users_to_group([dashou_goeasy_id, proxy_partner_id], [local_group_id], appkey, secret):
|
||||
return False
|
||||
|
||||
# 1. 打手发送初始化消息
|
||||
init_msg_text = f"跨平台订单已接单,内容:{order.jieshao},备注:{order.beizhu}"
|
||||
_send_group_message(
|
||||
appkey, secret, local_group_id, dashou_goeasy_id, dashou_name, local_group_avatar,
|
||||
init_msg_text, None, group_name=local_group_name, order_id=order.dingdan_id,
|
||||
is_cross=1
|
||||
)
|
||||
|
||||
# 2. 【新增】对方代理也发一条消息,确保对方能看到群聊
|
||||
partner_msg = f"订单已确认,请等待服务。"
|
||||
_send_group_message(
|
||||
appkey, secret, local_group_id, proxy_partner_id, proxy_partner_name, proxy_partner_avatar,
|
||||
partner_msg, None, group_name=local_group_name, order_id=order.dingdan_id,
|
||||
is_cross=1
|
||||
)
|
||||
|
||||
# ---- 2. 在对方建群 ----
|
||||
partner_appkey = partner_config.chat_api_key
|
||||
partner_secret = partner_config.chat_api_id or ''
|
||||
if not partner_appkey:
|
||||
return True # 无对方 key,仅完成我方建群
|
||||
|
||||
partner_group_id = f"group_{partner_order_id}"
|
||||
partner_group_name = f"跨平台订单-我方打手已接单"
|
||||
# 代理我方打手 ID
|
||||
our_agent_id = f"{order.dingdan_id}_{dashou_goeasy_id}"
|
||||
our_agent_name = f"[我方]{dashou_name}"
|
||||
# 对方频道头像用对方俱乐部默认头像
|
||||
partner_group_avatar = partner_default_avatar
|
||||
|
||||
if not _subscribe_users_to_group([our_agent_id, target_partner_goeasy_id], [partner_group_id], partner_appkey, partner_secret):
|
||||
logger.error("向对方频道订阅失败")
|
||||
return True
|
||||
|
||||
# 我方打手在对方频道发消息
|
||||
cross_msg_text = f"我方打手已接单,订单:{order.jieshao},请确认"
|
||||
_send_group_message(
|
||||
partner_appkey, partner_secret, partner_group_id, our_agent_id, our_agent_name, partner_group_avatar,
|
||||
cross_msg_text, None, group_name=partner_group_name, order_id=partner_order_id,
|
||||
is_cross=1
|
||||
)
|
||||
|
||||
# 【新增】对方用户在对方频道也发一条消息(以对方原始身份)
|
||||
target_partner_name = f"用户{target_partner_goeasy_id}" # 简单命名,可按需优化
|
||||
_send_group_message(
|
||||
partner_appkey, partner_secret, partner_group_id, target_partner_goeasy_id, target_partner_name, partner_default_avatar,
|
||||
"订单信息已收到。", None, group_name=partner_group_name, order_id=partner_order_id,
|
||||
is_cross=1
|
||||
)
|
||||
|
||||
return True
|
||||
|
||||
def _get_cross_partner_identity(order, partner_order_id):
|
||||
"""
|
||||
获取对方下单方的 GoEasy 标识。
|
||||
优先从商家扩展表取 partner_yonghu_id,否则按 partner_order_id 前缀推断。
|
||||
"""
|
||||
# 尝试从商家扩展表取(仅当发单平台为商家且存在 partner_yonghu_id)
|
||||
if order.fadan_pingtai == 2 and hasattr(order, 'shangjia_kuozhan'):
|
||||
ext = order.shangjia_kuozhan
|
||||
if ext and ext.partner_yonghu_id:
|
||||
# 直接根据订单前缀构造标识
|
||||
prefix = partner_order_id[:2].upper()
|
||||
if prefix == 'SJ':
|
||||
return f"Sj{ext.partner_yonghu_id}"
|
||||
elif prefix == 'PT':
|
||||
return f"Boss{ext.partner_yonghu_id}"
|
||||
else:
|
||||
return f"User{ext.partner_yonghu_id}"
|
||||
|
||||
# 后备:根据 partner_order_id 前缀推断
|
||||
prefix = partner_order_id[:2].upper()
|
||||
uid = partner_order_id[2:] if len(partner_order_id) > 2 else ''
|
||||
if prefix == 'SJ':
|
||||
return f"Sj{uid}"
|
||||
elif prefix == 'PT':
|
||||
return f"Boss{uid}"
|
||||
else:
|
||||
return f"User{uid}"
|
||||
|
||||
def _create_local_group_only(order, dashou_goeasy_id, dashou_name, dashou_avatar, appkey, secret):
|
||||
group_id = f"group_{order.dingdan_id}"
|
||||
_subscribe_users_to_group([dashou_goeasy_id], [group_id], appkey, secret)
|
||||
return False
|
||||
return None, None, None
|
||||
Reference in New Issue
Block a user