feat: 假单与真单混排,会员或押金达标后过滤假单
This commit is contained in:
@@ -98,8 +98,11 @@ class DashouDingdanHuoquView(APIView):
|
||||
def post(self, request):
|
||||
try:
|
||||
from orders.services.fake_order_pool import (
|
||||
dashou_should_use_fake_pool,
|
||||
MODE_FAKE_ONLY,
|
||||
MODE_MIX,
|
||||
build_fake_order_pool_response,
|
||||
list_formatted_fake_orders,
|
||||
resolve_fake_pool_mode,
|
||||
)
|
||||
|
||||
# 1. 获取请求参数
|
||||
@@ -116,8 +119,11 @@ class DashouDingdanHuoquView(APIView):
|
||||
)
|
||||
club_id = resolve_effective_club_id(request, getattr(request, 'user', None))
|
||||
|
||||
# 假单:按俱乐部开关 + 当前商品类型是否具备对应会员(含总会员覆盖)
|
||||
if dashou_should_use_fake_pool(request.user, club_id=club_id, leixing_id=leixing_id):
|
||||
# 假单模式:封禁只假单;未充会员且押金未达门槛 → 真假混排;有会员/高押金 → 只真单
|
||||
fake_mode = resolve_fake_pool_mode(
|
||||
request.user, club_id=club_id, leixing_id=leixing_id,
|
||||
)
|
||||
if fake_mode == MODE_FAKE_ONLY:
|
||||
return build_fake_order_pool_response(request)
|
||||
|
||||
yonghuid = request.user.UserUID
|
||||
@@ -125,6 +131,11 @@ class DashouDingdanHuoquView(APIView):
|
||||
yonghuid, club_id=club_id,
|
||||
)
|
||||
|
||||
fake_prefix = []
|
||||
if fake_mode == MODE_MIX:
|
||||
fake_prefix = list_formatted_fake_orders(club_id, leixing_id)
|
||||
fake_n = len(fake_prefix)
|
||||
|
||||
# 2. 构建基础查询条件:本店待抢单 + 集团配置的单向互通店
|
||||
from jituan.services.order_grab_share import order_club_q_for_grabber
|
||||
base_query = Q(Status__in=[1, 7]) & order_club_q_for_grabber(club_id)
|
||||
@@ -141,15 +152,30 @@ class DashouDingdanHuoquView(APIView):
|
||||
# 4. 构建基础查询集
|
||||
base_qs = Order.query.filter(base_query).order_by('-CreateTime').distinct()
|
||||
|
||||
# 5. 获取总记录数
|
||||
total = base_qs.count()
|
||||
# 5. 真单总数;混排时列表前半段是假单
|
||||
real_total = base_qs.count()
|
||||
total = fake_n + real_total
|
||||
|
||||
# 6. 计算分页偏移量
|
||||
# 6. 混排分页:前 fake_n 条为假单,之后为真单
|
||||
offset = (page - 1) * page_size
|
||||
limit = page_size
|
||||
page_fake = []
|
||||
real_offset = 0
|
||||
real_limit = page_size
|
||||
if fake_n > 0:
|
||||
if offset < fake_n:
|
||||
page_fake = fake_prefix[offset:offset + page_size]
|
||||
real_limit = page_size - len(page_fake)
|
||||
real_offset = 0
|
||||
else:
|
||||
page_fake = []
|
||||
real_offset = offset - fake_n
|
||||
real_limit = page_size
|
||||
|
||||
# 7. 获取当前页数据
|
||||
page_qs = base_qs[offset:offset + limit]
|
||||
# 7. 获取当前页真单
|
||||
if real_limit > 0:
|
||||
page_qs = base_qs[real_offset:real_offset + real_limit]
|
||||
else:
|
||||
page_qs = base_qs[0:0]
|
||||
|
||||
# 8. 使用子查询获取商家昵称(Subquery 须用 Django 原生 QuerySet,不能用 .query.values())
|
||||
shangjia_sub = MerchantOrderExt.objects.filter(
|
||||
@@ -381,6 +407,10 @@ class DashouDingdanHuoquView(APIView):
|
||||
row['shangjia_deal_stat'] = merchant_stat_map[sj_uid]
|
||||
formatted_list.append(row)
|
||||
|
||||
# 混排:假单在前(展示价格),真单在后(未开通会员时前端显示「未开通会员」)
|
||||
if page_fake:
|
||||
formatted_list = list(page_fake) + formatted_list
|
||||
|
||||
has_more = (page * page_size) < total
|
||||
|
||||
badge = {}
|
||||
@@ -399,9 +429,10 @@ class DashouDingdanHuoquView(APIView):
|
||||
'total': total,
|
||||
'current_page': page,
|
||||
'page_size': page_size,
|
||||
'total_pages': (total + page_size - 1) // page_size,
|
||||
'total_pages': (total + page_size - 1) // page_size if page_size else 0,
|
||||
'clumber': user_clumber,
|
||||
'is_fake_pool': False,
|
||||
'fake_pool_mode': fake_mode,
|
||||
**badge,
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user