商家订单列表支持时间段筛选并修正分页has_more
This commit is contained in:
75
orders/services/merchant_order_list_filters.py
Normal file
75
orders/services/merchant_order_list_filters.py
Normal file
@@ -0,0 +1,75 @@
|
||||
"""商家订单列表通用筛选(商家老板接口 + 子客服列表共用)。"""
|
||||
from datetime import datetime
|
||||
|
||||
from django.db.models import Q
|
||||
from django.utils import timezone
|
||||
from django.utils.dateparse import parse_datetime
|
||||
|
||||
from backend.utils import pick_leixing_id
|
||||
|
||||
|
||||
def _aware_dt(dt):
|
||||
if dt is None:
|
||||
return None
|
||||
if timezone.is_naive(dt):
|
||||
return timezone.make_aware(dt, timezone.get_current_timezone())
|
||||
return dt
|
||||
|
||||
|
||||
def parse_order_list_bound(value, is_end=False):
|
||||
"""解析列表时间边界;仅日期时开始取 00:00:00,结束取 23:59:59。"""
|
||||
if not value:
|
||||
return None
|
||||
raw = str(value).strip()
|
||||
if not raw:
|
||||
return None
|
||||
if len(raw) <= 10:
|
||||
try:
|
||||
base = datetime.strptime(raw[:10], '%Y-%m-%d')
|
||||
except ValueError:
|
||||
return None
|
||||
if is_end:
|
||||
base = base.replace(hour=23, minute=59, second=59)
|
||||
return _aware_dt(base)
|
||||
dt = parse_datetime(raw.replace(' ', 'T', 1) if ' ' in raw and 'T' not in raw else raw)
|
||||
if dt is None:
|
||||
try:
|
||||
base = datetime.strptime(raw[:19], '%Y-%m-%d %H:%M:%S')
|
||||
return _aware_dt(base)
|
||||
except ValueError:
|
||||
return None
|
||||
return _aware_dt(dt)
|
||||
|
||||
|
||||
def apply_merchant_order_list_filters(qs, data):
|
||||
"""在 MerchantOrderExt 查询集上应用类型/关键字/时间段筛选。"""
|
||||
leixing_id = pick_leixing_id(data)
|
||||
keyword = str(data.get('keyword', '')).strip()
|
||||
waibu_dingdan_id = str(data.get('waibuDingdanId') or data.get('waibu_dingdan_id') or '').strip()
|
||||
|
||||
start_raw = data.get('start_time') or data.get('time_start') or data.get('create_time_start')
|
||||
end_raw = data.get('end_time') or data.get('time_end') or data.get('create_time_end')
|
||||
|
||||
if leixing_id is not None:
|
||||
qs = qs.filter(Order__ProductTypeID=leixing_id)
|
||||
|
||||
start_dt = parse_order_list_bound(start_raw, is_end=False)
|
||||
end_dt = parse_order_list_bound(end_raw, is_end=True)
|
||||
if start_dt and end_dt and start_dt > end_dt:
|
||||
start_dt, end_dt = end_dt, start_dt
|
||||
if start_dt:
|
||||
qs = qs.filter(Order__CreateTime__gte=start_dt)
|
||||
if end_dt:
|
||||
qs = qs.filter(Order__CreateTime__lte=end_dt)
|
||||
|
||||
if waibu_dingdan_id:
|
||||
qs = qs.filter(Order__ExternalOrderID__exact=waibu_dingdan_id)
|
||||
elif keyword:
|
||||
qs = qs.filter(
|
||||
Q(Order__OrderID__exact=keyword)
|
||||
| Q(Order__Description__icontains=keyword)
|
||||
| Q(Order__Nickname__icontains=keyword)
|
||||
| Q(Order__PlayerID__exact=keyword)
|
||||
| Q(Order__ExternalOrderID__exact=keyword)
|
||||
)
|
||||
return qs
|
||||
Reference in New Issue
Block a user