fix: 俱乐部类型排序隔离;商家派单仅本店已上架类型

单店排序写入 ClubShangpinLeixingConfig;sjspleixing/派单/链接/模板校验本店上架。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQueandCursor committed 2026-08-10 10:48:10 +08:00
1 parent be2892f419
commit c10727c356
7 files changed
+113 -31

No files matched your search

+27 -23
View File
@@ -116,21 +116,23 @@ class ShangpinLeixingView(APIView):
return Response({'code': 403, 'msg': '非商家或有效客服,无权获取订单类型', 'data': []})
try:
# 1. 查询审核通过且抢单要求类型为1的商品类型,按排序权重升序
shangpin_queryset = ShangpinLeixing.query.filter(
yaoqiuleixing=1,
shenhezhuangtai=1
).select_related('bankuai').order_by('paixu')
from jituan.services.club_shangpin_leixing import build_club_leixing_list_for_api
# 2. 收集所有涉及到的板块ID
bankuai_ids = shangpin_queryset.values_list('bankuai_id', flat=True).distinct()
# 仅本俱乐部已上架类型(生成链接 / 自定义发单 / 常规单统一入口)
club_id = resolve_club_id_from_request(request)
club_rows = [
r for r in build_club_leixing_list_for_api(club_id)
if int(r.get('yaoqiuleixing') or 0) == 1
and int(r.get('shenhezhuangtai') or 0) == 1
]
# 3. 查询这些板块下的所有称号(每个称号绑定到一个板块)
bankuai_ids = {
r.get('bankuai_id') for r in club_rows if r.get('bankuai_id')
}
chenghao_list = Chenghao.query.filter(
bankuai_id__in=bankuai_ids
).values('id', 'mingcheng', 'texiao_miaoshu', 'bankuai_id')
).values('id', 'mingcheng', 'texiao_miaoshu', 'bankuai_id') if bankuai_ids else []
# 4. 构建 板块ID -> 称号列表 的映射(确保准确关联)
bankuai_chenghao_map = {}
for ch in chenghao_list:
bid = ch['bankuai_id']
@@ -139,21 +141,18 @@ class ShangpinLeixingView(APIView):
bankuai_chenghao_map[bid].append({
'id': ch['id'],
'mingcheng': ch['mingcheng'],
'texiao_json': ch['texiao_miaoshu'] # 前端 chenghao-tag 组件需要
'texiao_json': ch['texiao_miaoshu'],
})
# 5. 组装最终数据
data_list = []
for sp in shangpin_queryset:
item = {
'id': sp.id,
'yaoqiuleixing': sp.yaoqiuleixing,
'huiyuan_id': sp.huiyuan_id,
'jieshao': sp.jieshao,
# 当前类型所属板块的称号列表(无板块则为空数组)
'chenghaoList': bankuai_chenghao_map.get(sp.bankuai_id, [])
}
data_list.append(item)
for sp in club_rows:
data_list.append({
'id': sp['id'],
'yaoqiuleixing': sp.get('yaoqiuleixing'),
'huiyuan_id': sp.get('huiyuan_id'),
'jieshao': sp.get('jieshao') or '',
'chenghaoList': bankuai_chenghao_map.get(sp.get('bankuai_id'), []),
})
return Response({
'code': 200,
@@ -214,13 +213,18 @@ class ShangjiaPaifaView(APIView):
except ValueError:
return Response({'code': 400, 'msg': '价格格式错误'})
# ----- 5. 商品类型 -----
# ----- 5. 商品类型(必须本俱乐部已上架)-----
try:
shangpin_type = ShangpinLeixing.query.get(id=shangpin_type_id)
except ShangpinLeixing.DoesNotExist:
logger.error(f"商品类型不存在: {shangpin_type_id}")
return Response({'code': 400, 'msg': '商品类型不存在'})
from jituan.services.club_shangpin_leixing import is_leixing_enabled_for_club
_dispatch_club = resolve_club_id_from_request(request)
if not is_leixing_enabled_for_club(_dispatch_club, shangpin_type.id):
return Response({'code': 400, 'msg': '该商品类型未在本俱乐部上架'})
# ----- 6. 押金 / 会员模式决定 -----
final_yongjin = None
if commission_enabled and commission_value_str: