聊天:配对群ID、历史订单与状态接口、抢单建群对齐
This commit is contained in:
@@ -9,7 +9,8 @@ from .views import CreateOrderView, WechatPayNotifyView, \
|
||||
AdTongYiTuiKuanPingTai, AdTongYiTuiKuanShangJia, AdQiangZhiJieDan, AdJuJueTuiKuan,\
|
||||
AdGengHuanDaShou,ShangjiaCOSZhengshuView, DashouHuoquLeixingView,AdJuJueJieSuan, AdZhuanYiDaTing, AdQuXiaoZhiDing,DashouXiugaiView,DaiLiQunLiaoXiaoXiView,\
|
||||
ShangjiaLianjieLiuYanZhuanFaView, DingdanXiangqingView2, JiedanView2, ZxsjghdsView, \
|
||||
ShangjiaFakuanApplyView, ShangjiaFakuaiXiugaiView, ShangjiaShujuTongjiView
|
||||
ShangjiaFakuanApplyView, ShangjiaFakuaiXiugaiView, ShangjiaShujuTongjiView, LianTongDuiHuaZhunBeiView, \
|
||||
LianTongPeiDuiDingDanLieBiaoView, LianTongDingDanZhuangTaiView, LianTongDingDanZhuangTaiPiLiangView
|
||||
|
||||
|
||||
urlpatterns = [
|
||||
@@ -69,6 +70,10 @@ urlpatterns = [
|
||||
path('dsxiugaidd', DashouXiugaiView.as_view(), name='打手修改订单详情'),
|
||||
|
||||
path('kptxxfs', DaiLiQunLiaoXiaoXiView.as_view(), name='前端聊天转发'), # 群聊消息代理发送
|
||||
path('ltdhzb', LianTongDuiHuaZhunBeiView.as_view(), name='订单群聊准备'),
|
||||
path('ltpddd', LianTongPeiDuiDingDanLieBiaoView.as_view(), name='配对订单列表'),
|
||||
path('ltddzt', LianTongDingDanZhuangTaiView.as_view(), name='聊天订单状态'),
|
||||
path('ltddztpl', LianTongDingDanZhuangTaiPiLiangView.as_view(), name='聊天订单状态批量'),
|
||||
path('sjljlbxxzf', ShangjiaLianjieLiuYanZhuanFaView.as_view(), name='商家链接老板聊天转发'),
|
||||
|
||||
path('dingdanxiangqing2', DingdanXiangqingView2.as_view(), name='老板获取订单详情新街口'),
|
||||
|
||||
161
orders/views.py
161
orders/views.py
@@ -39,7 +39,12 @@ from tencentcloud.sts.v20180813 import sts_client, models
|
||||
|
||||
from utils.weixin_broadcast import WeixinBroadcastSender
|
||||
from utils.money import yuan_to_fen
|
||||
from utils.chat_utils import _send_group_message, _subscribe_users_to_group, establish_order_chat
|
||||
from utils.chat_utils import (
|
||||
_send_group_message, _subscribe_users_to_group, establish_order_chat,
|
||||
prepare_order_group_chat, resolve_pair_group_id,
|
||||
parse_pair_from_group_id, resolve_pair_from_order, check_pair_chat_permission,
|
||||
query_pair_orders, order_to_chat_dict,
|
||||
)
|
||||
from utils.fadan_utils import check_fadan_qiangdan_eligible
|
||||
|
||||
from orders.utils import (
|
||||
@@ -3562,8 +3567,8 @@ class DaiLiQunLiaoXiaoXiView(APIView):
|
||||
logger.error("[群聊代理] 我方 GoEasy AppKey 未配置")
|
||||
return Response({'code': 500, 'msg': '系统配置错误(APPKEY)'})
|
||||
|
||||
# ===== 6. 公共群信息 =====
|
||||
real_group_id = f"group_{order.OrderID}"
|
||||
# ===== 6. 公共群信息(新单走配对群,与文赫一致) =====
|
||||
real_group_id = resolve_pair_group_id(order) or f"group_{order.OrderID}"
|
||||
group_name = (order.Description[:20] + '…') if order.Description and len(order.Description) > 20 else f"订单{order.OrderID}"
|
||||
sender_avatar = full_avatar(sender_avatar_raw) if sender_avatar_raw else full_avatar('')
|
||||
|
||||
@@ -3633,7 +3638,7 @@ class ShangjiaLianjieLiuYanZhuanFaView(APIView):
|
||||
if not appkey:
|
||||
return Response({'code': 500, 'msg': '系统配置错误(APPKEY)'})
|
||||
|
||||
group_id = f"group_{order.OrderID}"
|
||||
group_id = resolve_pair_group_id(order) or f"group_{order.OrderID}"
|
||||
group_name = (order.Description[:20] + '…') if order.Description and len(order.Description) > 20 else f"订单{order.OrderID}"
|
||||
|
||||
if not _subscribe_users_to_group([sender_id], [group_id], appkey, secret):
|
||||
@@ -3657,6 +3662,154 @@ class ShangjiaLianjieLiuYanZhuanFaView(APIView):
|
||||
return Response({'code': 200, 'msg': '发送成功'})
|
||||
|
||||
|
||||
class LianTongDuiHuaZhunBeiView(APIView):
|
||||
"""进入订单群聊前准备:返回配对 groupId 及双方资料,并订阅 GoEasy 群(不影响抢单校验)"""
|
||||
authentication_classes = [JWTAuthentication]
|
||||
permission_classes = [IsAuthenticated]
|
||||
|
||||
IDENTITY_MAP = {
|
||||
'dashou': 'PlayerID',
|
||||
'shangjia': 'shangjia',
|
||||
'normal': 'boss',
|
||||
'boss': 'boss',
|
||||
}
|
||||
|
||||
def post(self, request):
|
||||
dingdan_id = request.data.get('dingdan_id') or request.data.get('orderId')
|
||||
identity_type = request.data.get('identityType') or ''
|
||||
if not dingdan_id:
|
||||
return Response({'code': 400, 'msg': '缺少 dingdan_id'})
|
||||
|
||||
backend_identity = self.IDENTITY_MAP.get(identity_type, identity_type)
|
||||
if backend_identity not in ('PlayerID', 'shangjia', 'boss'):
|
||||
return Response({'code': 400, 'msg': 'identityType 无效'})
|
||||
|
||||
uid = request.user.UserUID
|
||||
try:
|
||||
order = Order.query.select_related('pingtai_kuozhan', 'shangjia_kuozhan').get(OrderID=dingdan_id)
|
||||
except Order.DoesNotExist:
|
||||
return Response({'code': 404, 'msg': '订单不存在'})
|
||||
|
||||
valid, err_msg = check_user_permission(backend_identity, uid, order)
|
||||
if not valid:
|
||||
return Response({'code': 403, 'msg': err_msg})
|
||||
|
||||
if backend_identity == 'PlayerID' and not order.PlayerID:
|
||||
return Response({'code': 400, 'msg': '订单尚未接单,暂无法进入群聊'})
|
||||
|
||||
data, subscribed = prepare_order_group_chat(order, backend_identity, uid, subscribe=True)
|
||||
if not subscribed:
|
||||
logger.warning(f'ltdhzb 订阅群失败 order={dingdan_id} uid={uid}')
|
||||
|
||||
return Response({'code': 0, 'msg': 'ok', 'data': data})
|
||||
|
||||
|
||||
class LianTongPeiDuiDingDanLieBiaoView(APIView):
|
||||
"""聊天页:获取打手与商家/老板之间的历史订单列表(可搜索)"""
|
||||
authentication_classes = [JWTAuthentication]
|
||||
permission_classes = [IsAuthenticated]
|
||||
|
||||
IDENTITY_MAP = {
|
||||
'dashou': 'PlayerID',
|
||||
'shangjia': 'shangjia',
|
||||
'normal': 'boss',
|
||||
'boss': 'boss',
|
||||
}
|
||||
|
||||
def post(self, request):
|
||||
group_id = request.data.get('groupId') or request.data.get('group_id')
|
||||
dingdan_id = request.data.get('dingdan_id') or request.data.get('orderId')
|
||||
keyword = (request.data.get('keyword') or '').strip()
|
||||
identity_type = request.data.get('identityType') or ''
|
||||
backend_identity = self.IDENTITY_MAP.get(identity_type, identity_type)
|
||||
if backend_identity not in ('PlayerID', 'shangjia', 'boss'):
|
||||
return Response({'code': 400, 'msg': 'identityType 无效'})
|
||||
|
||||
dashou_uid, partner_uid, partner_role = parse_pair_from_group_id(group_id)
|
||||
if not dashou_uid and dingdan_id:
|
||||
try:
|
||||
order = Order.query.select_related('pingtai_kuozhan', 'shangjia_kuozhan').get(OrderID=dingdan_id)
|
||||
except Order.DoesNotExist:
|
||||
return Response({'code': 404, 'msg': '订单不存在'})
|
||||
dashou_uid, partner_uid, partner_role = resolve_pair_from_order(order)
|
||||
|
||||
if not dashou_uid or not partner_uid:
|
||||
return Response({'code': 400, 'msg': '无法解析配对信息,请确认订单已接单'})
|
||||
|
||||
uid = request.user.UserUID
|
||||
valid, err_msg = check_pair_chat_permission(backend_identity, uid, dashou_uid, partner_uid, partner_role)
|
||||
if not valid:
|
||||
return Response({'code': 403, 'msg': err_msg})
|
||||
|
||||
orders = query_pair_orders(dashou_uid, partner_uid, partner_role, keyword=keyword, limit=40)
|
||||
latest = orders[0] if orders else None
|
||||
return Response({'code': 0, 'msg': 'ok', 'data': {'list': orders, 'latest': latest}})
|
||||
|
||||
|
||||
class LianTongDingDanZhuangTaiView(APIView):
|
||||
"""聊天页:刷新单个订单状态"""
|
||||
authentication_classes = [JWTAuthentication]
|
||||
permission_classes = [IsAuthenticated]
|
||||
|
||||
IDENTITY_MAP = LianTongPeiDuiDingDanLieBiaoView.IDENTITY_MAP
|
||||
|
||||
def post(self, request):
|
||||
dingdan_id = request.data.get('dingdan_id') or request.data.get('orderId')
|
||||
identity_type = request.data.get('identityType') or ''
|
||||
if not dingdan_id:
|
||||
return Response({'code': 400, 'msg': '缺少 dingdan_id'})
|
||||
|
||||
backend_identity = self.IDENTITY_MAP.get(identity_type, identity_type)
|
||||
if backend_identity not in ('PlayerID', 'shangjia', 'boss'):
|
||||
return Response({'code': 400, 'msg': 'identityType 无效'})
|
||||
|
||||
try:
|
||||
order = Order.query.select_related('pingtai_kuozhan', 'shangjia_kuozhan').get(OrderID=dingdan_id)
|
||||
except Order.DoesNotExist:
|
||||
return Response({'code': 404, 'msg': '订单不存在'})
|
||||
|
||||
valid, err_msg = check_user_permission(backend_identity, request.user.UserUID, order)
|
||||
if not valid:
|
||||
return Response({'code': 403, 'msg': err_msg})
|
||||
|
||||
data = order_to_chat_dict(order)
|
||||
return Response({'code': 0, 'msg': 'ok', 'data': data})
|
||||
|
||||
|
||||
class LianTongDingDanZhuangTaiPiLiangView(APIView):
|
||||
"""消息列表:批量刷新订单状态"""
|
||||
authentication_classes = [JWTAuthentication]
|
||||
permission_classes = [IsAuthenticated]
|
||||
|
||||
def post(self, request):
|
||||
order_ids = request.data.get('order_ids') or []
|
||||
if not isinstance(order_ids, list):
|
||||
return Response({'code': 400, 'msg': 'order_ids 格式错误'})
|
||||
|
||||
uid = request.user.UserUID
|
||||
result = {}
|
||||
for oid in order_ids[:20]:
|
||||
oid = str(oid).strip()
|
||||
if not oid:
|
||||
continue
|
||||
try:
|
||||
order = Order.query.select_related('pingtai_kuozhan', 'shangjia_kuozhan').get(OrderID=oid)
|
||||
except Order.DoesNotExist:
|
||||
continue
|
||||
for identity in ('PlayerID', 'shangjia', 'boss'):
|
||||
valid, _ = check_user_permission(identity, uid, order)
|
||||
if valid:
|
||||
d = order_to_chat_dict(order)
|
||||
result[oid] = {
|
||||
'jieshao': d['jieshao'],
|
||||
'jine': d['jine'],
|
||||
'zhuangtai': d['zhuangtai'],
|
||||
'zhuangtaiText': d['zhuangtaiText'],
|
||||
}
|
||||
break
|
||||
return Response({'code': 0, 'msg': 'ok', 'data': result})
|
||||
|
||||
|
||||
class QiangdanView(APIView):
|
||||
authentication_classes = [JWTAuthentication]
|
||||
permission_classes = [IsAuthenticated]
|
||||
|
||||
Reference in New Issue
Block a user