feat: 俱乐部订单单向互通抢单(集团配置 + 接单池/抢单校验)
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -54,7 +54,8 @@ KEFU_MENU_ROW_DEFS = [
|
||||
'require_group_manage': True},
|
||||
{'page_id': 'admin.club-config', 'name': '俱乐部密钥配置', 'path': '/admin/club-config', 'parent_id': 'admin', 'sort_order': 73,
|
||||
'require_group_manage': True},
|
||||
# require_super 兜底(旧 DB 无 require_admin_user_manage 列时仍可显示);运行时仍按 page_id=admin.user 走用户管理闸门
|
||||
{'page_id': 'admin.order-grab-share', 'name': '订单互通抢单', 'path': '/admin/order-grab-share', 'parent_id': 'admin', 'sort_order': 76,
|
||||
'require_group_manage': True},
|
||||
{'page_id': 'admin.user', 'name': '后台用户', 'path': '/admin/user', 'parent_id': 'admin', 'sort_order': 74,
|
||||
'require_super': True, 'require_admin_user_manage': True},
|
||||
{'page_id': 'admin.operation-log', 'name': '操作日志', 'path': '/admin/operation-log', 'parent_id': 'admin', 'sort_order': 75,
|
||||
|
||||
90
jituan/services/order_grab_share.py
Normal file
90
jituan/services/order_grab_share.py
Normal file
@@ -0,0 +1,90 @@
|
||||
"""俱乐部订单单向互通抢单:grabber 可看/抢 order 俱乐部的待接单。"""
|
||||
from django.db.models import Q
|
||||
|
||||
from jituan.constants import CLUB_ID_DEFAULT
|
||||
from jituan.models import Club, ClubOrderGrabLink
|
||||
|
||||
|
||||
def normalize_club_id(club_id):
|
||||
return (club_id or '').strip() or CLUB_ID_DEFAULT
|
||||
|
||||
|
||||
def order_club_ids_for_grabber(grabber_club_id):
|
||||
"""
|
||||
打手所属俱乐部可见的订单 ClubID 集合(含本店 + 已配置可抢的对方店)。
|
||||
"""
|
||||
gc = normalize_club_id(grabber_club_id)
|
||||
ids = {gc}
|
||||
for oc in ClubOrderGrabLink.query.filter(
|
||||
grabber_club_id=gc,
|
||||
).values_list('order_club_id', flat=True):
|
||||
oc = (oc or '').strip()
|
||||
if oc:
|
||||
ids.add(oc)
|
||||
return ids
|
||||
|
||||
|
||||
def order_club_q_for_grabber(grabber_club_id):
|
||||
"""用于 Order 查询的 Q:本店 + 互通店;本店含默认俱乐部时兼容空 ClubID 旧单。"""
|
||||
allowed = order_club_ids_for_grabber(grabber_club_id)
|
||||
q = Q(ClubID__in=list(allowed))
|
||||
if CLUB_ID_DEFAULT in allowed:
|
||||
q |= Q(ClubID__isnull=True) | Q(ClubID='')
|
||||
return q
|
||||
|
||||
|
||||
def can_grabber_take_order_club(grabber_club_id, order_club_id):
|
||||
gc = normalize_club_id(grabber_club_id)
|
||||
oc = normalize_club_id(order_club_id)
|
||||
if gc == oc:
|
||||
return True
|
||||
return ClubOrderGrabLink.query.filter(
|
||||
grabber_club_id=gc, order_club_id=oc,
|
||||
).exists()
|
||||
|
||||
|
||||
def list_grab_links():
|
||||
name_map = {c.club_id: c.name for c in Club.query.filter(status=1)}
|
||||
rows = list(ClubOrderGrabLink.query.order_by('grabber_club_id', 'order_club_id'))
|
||||
return [
|
||||
{
|
||||
'id': r.id,
|
||||
'grabber_club_id': r.grabber_club_id,
|
||||
'grabber_club_name': name_map.get(r.grabber_club_id, r.grabber_club_id),
|
||||
'order_club_id': r.order_club_id,
|
||||
'order_club_name': name_map.get(r.order_club_id, r.order_club_id),
|
||||
'create_time': r.CreateTime.strftime('%Y-%m-%d %H:%M:%S') if r.CreateTime else '',
|
||||
}
|
||||
for r in rows
|
||||
]
|
||||
|
||||
|
||||
def add_grab_link(grabber_club_id, order_club_id):
|
||||
gc = (grabber_club_id or '').strip()
|
||||
oc = (order_club_id or '').strip()
|
||||
if not gc or not oc:
|
||||
return None, '请选择抢单方与被抢订单俱乐部'
|
||||
if gc == oc:
|
||||
return None, '不能配置本店抢本店(本店订单默认可见)'
|
||||
if not Club.query.filter(club_id=gc, status=1).exists():
|
||||
return None, f'抢单方俱乐部不存在: {gc}'
|
||||
if not Club.query.filter(club_id=oc, status=1).exists():
|
||||
return None, f'订单方俱乐部不存在: {oc}'
|
||||
if ClubOrderGrabLink.query.filter(grabber_club_id=gc, order_club_id=oc).exists():
|
||||
return None, '该互通规则已存在'
|
||||
row = ClubOrderGrabLink.query.create(
|
||||
grabber_club_id=gc,
|
||||
order_club_id=oc,
|
||||
)
|
||||
return {'id': row.id, 'grabber_club_id': gc, 'order_club_id': oc}, None
|
||||
|
||||
|
||||
def delete_grab_link(link_id):
|
||||
try:
|
||||
link_id = int(link_id)
|
||||
except (TypeError, ValueError):
|
||||
return False, '无效的规则 id'
|
||||
deleted, _ = ClubOrderGrabLink.objects.filter(id=link_id).delete()
|
||||
if not deleted:
|
||||
return False, '规则不存在'
|
||||
return True, None
|
||||
Reference in New Issue
Block a user