fix: 排行榜按方案档位展示各名次预计奖金

This commit is contained in:
XingQue
2026-07-01 19:17:43 +08:00
parent 2504997c53
commit 3394fef79b
2 changed files with 134 additions and 52 deletions

View File

@@ -16,6 +16,7 @@ from rank.reward_services import (
list_my_pending_claims,
query_club_rank_rows,
query_group_rank_rows,
resolve_sort_field_for_display,
sort_field_options_for_shenfen,
)
from users.business_models import User
@@ -31,10 +32,10 @@ def _resolve_club_id(request, data_club_id=''):
from jituan.services.club_context import resolve_club_id_from_request
cid = (data_club_id or '').strip()
if not cid:
cid = get_user_club_id(request.user) or getattr(request.user, 'ClubID', None) or ''
cid = resolve_club_id_from_request(request) or ''
if not cid:
cid = resolve_club_id_from_request(request) or 'xq'
return cid
cid = get_user_club_id(request.user) or getattr(request.user, 'ClubID', None) or ''
return cid or 'xq'
def _load_display_maps(yonghuids, shenfen):
@@ -80,14 +81,12 @@ def _format_rank_list(rows, shenfen, sort_field, sort_label):
'touxiang': avatar_map.get(uid, '') or '',
'club_id': cid,
'club_name': club_names.get(cid, cid),
'sort_field': sort_field,
'metric_value': int(metric) if is_int else float(metric),
'metric_label': sort_label,
'metric_is_int': is_int,
}
# 兼容 fighter-rank 现有字段
if is_int:
item['chengjiao_zongliang'] = int(metric)
else:
item['chengjiao_zonge'] = float(metric)
item[sort_field] = item['metric_value']
result.append(item)
return result
@@ -169,30 +168,15 @@ class PhbJlPhbView(APIView):
if riqi not in RIQI_OPTIONS:
return Response({'code': 400, 'msg': '周期参数错误', 'data': {'list': []}})
from rank.reward_models import RankRewardScheme
from rank.reward_services import RIQI_TO_PERIOD, SORT_FIELD_REGISTRY
from rank.reward_services import SORT_FIELD_REGISTRY
scheme_sort, sort_label = resolve_sort_field_for_display(club_id, shenfen, riqi)
if not sort_field:
period_type = RIQI_TO_PERIOD.get(riqi)
if period_type and fanwei == 'club':
scheme = RankRewardScheme.query.filter(
club_id=club_id, shenfen=shenfen, period_type=period_type, enabled=True,
).first()
if scheme:
sort_field = scheme.sort_field
if not sort_field:
defaults = {
'dashou': 'chengjiao_zongliang',
'guanshi': 'chongzhi_dashou_shu',
'zuzhang': 'yaoqing_guanshi_shu',
'shangjia': 'jiesuan_jine',
}
sort_field = defaults.get(shenfen, 'chengjiao_zongliang')
if sort_field not in (SORT_FIELD_REGISTRY.get(shenfen) or {}):
sort_field = scheme_sort
elif sort_field not in (SORT_FIELD_REGISTRY.get(shenfen) or {}):
return Response({'code': 400, 'msg': '排序指标无效', 'data': {'list': []}})
sort_label = SORT_FIELD_LABELS.get(sort_field, sort_field)
else:
sort_label = SORT_FIELD_LABELS.get(sort_field, sort_field)
if fanwei == 'club':
rows = query_club_rank_rows(club_id, shenfen, sort_field, riqi)
@@ -204,9 +188,14 @@ class PhbJlPhbView(APIView):
# 仅俱乐部榜展示各行奖金(集团总榜名次与俱乐部分奖名次不同,不可混用)
rank_rewards = reward.get('rank_rewards') or {}
if fanwei == 'club':
tier_rewards = reward.get('tier_rewards') or {}
if fanwei == 'club' and reward.get('scheme_enabled'):
for item in result_list:
item['reward_amount'] = rank_rewards.get(item['mingci'], 0)
mc = item['mingci']
settled = rank_rewards.get(mc)
preview = tier_rewards.get(mc, 0)
item['reward_amount'] = settled if settled else preview
item['reward_is_preview'] = not settled and preview > 0
return Response({
'code': 200,