fix: 商品基础数据容错避免500;类型专区按俱乐部上架并管专区
具体俱乐部只返回已上架类型;上架/下架允许 7007a 或 8080a。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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': '获取类型专区失败,请稍后重试'})
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user