91 lines
3.4 KiB
Python
91 lines
3.4 KiB
Python
"""订单响应增强:派单客服信息、头像相对路径。"""
|
||
from merchant_ops.constants import ACTOR_MERCHANT, ACTOR_STAFF
|
||
from merchant_ops.models import MerchantOrderDispatch, MerchantStaffMember
|
||
from users.business_models import User
|
||
|
||
|
||
def user_avatar_relative(user):
|
||
"""返回用户表 Avatar 相对路径(前端自行拼接 OSS)。"""
|
||
if not user:
|
||
return ''
|
||
av = (getattr(user, 'Avatar', None) or '').strip()
|
||
if not av:
|
||
return ''
|
||
if av.startswith('http://') or av.startswith('https://'):
|
||
return av
|
||
return av.lstrip('/')
|
||
|
||
|
||
def get_user_avatar_by_uid(uid):
|
||
if not uid:
|
||
return ''
|
||
u = User.query.filter(UserUID=uid).first()
|
||
return user_avatar_relative(u)
|
||
|
||
|
||
def get_dispatch_staff_payload(order_id):
|
||
"""订单派单归属;无记录则 None(商家老板派单可能无 dispatch 记录)。"""
|
||
if not order_id:
|
||
return None
|
||
disp = MerchantOrderDispatch.query.filter(order_id=order_id).first()
|
||
if not disp:
|
||
return None
|
||
if disp.dispatch_actor_type == ACTOR_MERCHANT:
|
||
u = User.query.filter(UserUID=disp.dispatch_actor_id).first() if disp.dispatch_actor_id else None
|
||
return {
|
||
'dispatch_staff_type': ACTOR_MERCHANT,
|
||
'dispatch_staff_uid': disp.dispatch_actor_id or '',
|
||
'dispatch_staff_name': '商家老板',
|
||
'dispatch_staff_avatar': user_avatar_relative(u),
|
||
'dispatch_role_code': '',
|
||
'dispatch_role_name': '商家老板',
|
||
'dispatch_member_id': None,
|
||
}
|
||
if disp.staff_member_id:
|
||
m = MerchantStaffMember.query.filter(id=disp.staff_member_id).select_related('role').first()
|
||
if m:
|
||
u = User.query.filter(UserUID=m.staff_user_id).first()
|
||
return {
|
||
'dispatch_staff_type': ACTOR_STAFF,
|
||
'dispatch_staff_uid': m.staff_user_id,
|
||
'dispatch_staff_name': m.display_name or (m.role.role_name if m.role else m.staff_user_id),
|
||
'dispatch_staff_avatar': user_avatar_relative(u),
|
||
'dispatch_role_code': m.role.role_code if m.role else '',
|
||
'dispatch_role_name': m.role.role_name if m.role else '',
|
||
'dispatch_member_id': m.id,
|
||
}
|
||
return {
|
||
'dispatch_staff_type': disp.dispatch_actor_type,
|
||
'dispatch_staff_uid': disp.dispatch_actor_id or '',
|
||
'dispatch_staff_name': disp.dispatch_actor_id or '',
|
||
'dispatch_role_code': '',
|
||
'dispatch_role_name': '',
|
||
'dispatch_member_id': disp.staff_member_id,
|
||
}
|
||
|
||
|
||
def enrich_order_detail_data(data, order_id):
|
||
"""订单详情追加派单客服;打手头像优先用户表相对路径。"""
|
||
if not data or not isinstance(data, dict):
|
||
return data
|
||
payload = get_dispatch_staff_payload(order_id)
|
||
if payload:
|
||
data['dispatch_staff'] = payload
|
||
else:
|
||
data['dispatch_staff'] = None
|
||
dashou_uid = data.get('dashou_yonghuid') or data.get('fuwudashou_id') or ''
|
||
av = get_user_avatar_by_uid(dashou_uid)
|
||
if av:
|
||
data['dashou_avatar'] = av
|
||
return data
|
||
|
||
|
||
def staff_order_list_item(ext):
|
||
"""子客服订单列表项:不含派单客服字段,打手头像走用户表。"""
|
||
from merchant_ops.services.order_query import staff_order_to_dict
|
||
d = staff_order_to_dict(ext)
|
||
pid = d.get('jiedan_dashou_id')
|
||
if pid:
|
||
d['jiedan_dashou_avatar'] = get_user_avatar_by_uid(pid)
|
||
return d
|