feat: 假单按俱乐部开关,并按商品类型会员资格展示

This commit is contained in:
XingQue
2026-07-30 19:55:19 +08:00
parent 6f4e458871
commit bb74140150
6 changed files with 128 additions and 15 deletions

View File

@@ -1,7 +1,6 @@
"""抢单大厅假单:无资格/封禁打手仅展示假数据。"""
"""抢单大厅假单:按俱乐部开关 + 按商品类型会员资格展示假数据。"""
import random
from datetime import datetime, timedelta
from decimal import Decimal
from django.core.exceptions import ObjectDoesNotExist
from django.db import transaction
@@ -11,19 +10,41 @@ from rest_framework.response import Response
from backend.utils import fmt_datetime, pick_leixing_id
from jituan.services.club_context import resolve_effective_club_id
from jituan.services.dashou_exam import user_has_active_member
from jituan.services.fake_grab_switch import is_club_fake_grab_enabled
from jituan.services.huiyuan_bundle import normalize_huiyuan_id, user_has_huiyuan_access
from orders.models import FakeGrabOrder, FakeGrabOrderShuffleState
DEFAULT_DISPATCHER_AVATAR = 'beijing/morentouxiang.jpg'
SHUFFLE_STATE_PK = 1
def dashou_should_use_fake_pool(user):
def _leixing_required_huiyuan_id(leixing_id):
"""商品类型绑定的会员 ID无绑定则视为不要求会员。"""
if leixing_id is None:
return ''
try:
from products.models import ShangpinLeixing
row = ShangpinLeixing.query.filter(id=int(leixing_id)).values('huiyuan_id').first()
if not row:
return ''
return normalize_huiyuan_id(row.get('huiyuan_id'))
except Exception:
return ''
def dashou_should_use_fake_pool(user, club_id=None, leixing_id=None):
"""
打手是否只能看假单:
- 账号封禁zhanghaozhuangtai != 1
- 或未开通有效会员 且 押金不大于 5
当前 Tab商品类型是否只展示假单:
- 俱乐部未开启假单功能 → 否(看真实单
- 账号封禁 → 是
- 该类型要求的会员:已充(含总会员覆盖子类型)→ 否
- 未充对应会员 → 是
不同类型互不影响;假单在独立表,抢不了。
"""
cid = (club_id or '').strip()
if not cid or not is_club_fake_grab_enabled(cid):
return False
try:
dashou = user.DashouProfile
except ObjectDoesNotExist:
@@ -32,11 +53,16 @@ def dashou_should_use_fake_pool(user):
if dashou.zhanghaozhuangtai != 1:
return True
yajin = Decimal(str(dashou.yajin or 0))
if yajin > Decimal('5'):
if leixing_id is None:
# 未指定类型时不整池切假单,走真实单列表
return False
if user_has_active_member(user.UserUID):
required = _leixing_required_huiyuan_id(leixing_id)
if not required:
# 类型未绑会员 → 不推假单
return False
if user_has_huiyuan_access(user.UserUID, required, club_id=cid):
return False
return True

View File

@@ -97,14 +97,10 @@ class DashouDingdanHuoquView(APIView):
def post(self, request):
try:
from django.conf import settings
from orders.services.fake_order_pool import (
dashou_should_use_fake_pool,
build_fake_order_pool_response,
)
if getattr(settings, 'FAKE_GRAB_ORDER_POOL_ENABLED', False):
if dashou_should_use_fake_pool(request.user):
return build_fake_order_pool_response(request)
# 1. 获取请求参数
data = request.data
@@ -119,6 +115,11 @@ class DashouDingdanHuoquView(APIView):
resolve_grab_pool_member_display,
)
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):
return build_fake_order_pool_response(request)
yonghuid = request.user.UserUID
_has_member, user_clumber = refresh_grab_pool_membership_state(
yonghuid, club_id=club_id,