fix: 商品基础数据容错避免500;类型专区按俱乐部上架并管专区

具体俱乐部只返回已上架类型;上架/下架允许 7007a 或 8080a。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-21 03:33:49 +08:00
parent f1db185d03
commit 98b58f8058
3 changed files with 178 additions and 135 deletions

View File

@@ -237,69 +237,84 @@ class GetProductTypeZoneView(APIView):
if '7007a' not in permissions:
return Response({'code': 403, 'msg': '您无权访问此页面'})
# 查询专区数量(按俱乐部隔离;集团汇总看全部)
zone_qs_for_count = filter_club_char_field(
ShangpinZhuanqu.query.all(), request, field='club_id'
)
zone_count_rows = zone_qs_for_count.values('leixing_id').annotate(cnt=Count('id'))
zone_count_map = {row['leixing_id']: row['cnt'] for row in zone_count_rows}
types = ShangpinLeixing.query.all().order_by('-paixu') # paixu 越大越靠前
type_list = []
for t in types:
# 从预聚合的 map 中取专区数量
zone_count = zone_count_map.get(t.id, 0)
type_list.append({
'id': t.id,
'jieshao': t.jieshao or '',
'tupian_url': t.tupian_url or '',
'yaoqiuleixing': t.yaoqiuleixing,
'huiyuan_id': t.huiyuan_id or '',
'yongjin': float(t.yongjin) if t.yongjin is not None else None,
'shenhezhuangtai': t.shenhezhuangtai,
'paixu': t.paixu,
'product_count': zone_count,
})
# 查询专区(按俱乐部隔离)
zones = filter_club_char_field(
ShangpinZhuanqu.query.all().order_by('-paixu'), request, field='club_id'
)
zone_list = [
{
'id': z.id,
'mingzi': z.mingzi or '',
'leixing_id': z.leixing_id,
'shenhezhuangtai': z.shenhezhuangtai,
'paixu': z.paixu,
'club_id': getattr(z, 'club_id', '') or '',
}
for z in zones
]
# 查询所有会员(只返回 id、介绍、价格
members = Huiyuan.query.all().values('huiyuan_id', 'jieshao', 'jiage')
member_list = [
{
'huiyuan_id': m['huiyuan_id'],
'jieshao': m['jieshao'],
'jiage': float(m['jiage']),
}
for m in members
]
from jituan.constants import DATA_SCOPE_ALL
from jituan.services.club_context import resolve_club_scope
from jituan.services.club_context import resolve_club_scope, resolve_club_id_from_request
from jituan.services.club_shangpin_leixing import build_club_leixing_admin_list
return Response({
'code': 0,
'data': {
'type_list': type_list,
'zone_list': zone_list,
'member_list': member_list,
'club_scoped': resolve_club_scope(request) != DATA_SCOPE_ALL,
club_scoped = resolve_club_scope(request) != DATA_SCOPE_ALL
club_id = resolve_club_id_from_request(request)
try:
zone_qs_for_count = filter_club_char_field(
ShangpinZhuanqu.query.all(), request, field='club_id'
)
zone_count_map = {
row['leixing_id']: row['cnt']
for row in zone_qs_for_count.values('leixing_id').annotate(cnt=Count('id'))
}
})
if club_scoped:
# 具体俱乐部:仅本俱乐部已上架类型(与抢单端一致)
admin_payload = build_club_leixing_admin_list(request)
type_list = []
for item in (admin_payload.get('list') or []):
type_list.append({
**item,
'product_count': zone_count_map.get(item['id'], 0),
'club_enabled': True,
})
else:
type_list = []
for t in ShangpinLeixing.query.all().order_by('-paixu'):
type_list.append({
'id': t.id,
'jieshao': t.jieshao or '',
'tupian_url': t.tupian_url or '',
'yaoqiuleixing': t.yaoqiuleixing,
'huiyuan_id': t.huiyuan_id or '',
'yongjin': float(t.yongjin) if t.yongjin is not None else None,
'shenhezhuangtai': t.shenhezhuangtai,
'paixu': t.paixu,
'product_count': zone_count_map.get(t.id, 0),
})
zones = filter_club_char_field(
ShangpinZhuanqu.query.all().order_by('-paixu'), request, field='club_id'
)
zone_list = [
{
'id': z.id,
'mingzi': z.mingzi or '',
'leixing_id': z.leixing_id,
'shenhezhuangtai': z.shenhezhuangtai,
'paixu': z.paixu,
'club_id': getattr(z, 'club_id', '') or '',
}
for z in zones
]
member_list = [
{
'huiyuan_id': m['huiyuan_id'],
'jieshao': m['jieshao'] or '',
'jiage': float(m['jiage'] or 0),
}
for m in Huiyuan.query.all().values('huiyuan_id', 'jieshao', 'jiage')
]
return Response({
'code': 0,
'data': {
'type_list': type_list,
'zone_list': zone_list,
'member_list': member_list,
'club_scoped': club_scoped,
'club_id': club_id if club_scoped else '',
}
})
except Exception:
logging.getLogger(__name__).exception('GetProductTypeZoneView 失败')
return Response({'code': 500, 'msg': '获取类型专区失败,请稍后重试'})