加入了 GVSDSDK 模块,进行了 QModel 兼容层的尝试,生产环境可用
This commit is contained in:
@@ -1,7 +1,8 @@
|
||||
from django.db import models
|
||||
from gvsdsdk.model_base import QModel
|
||||
|
||||
|
||||
class YonghuPingzheng(models.Model):
|
||||
class YonghuPingzheng(QModel):
|
||||
id = models.AutoField(primary_key=True, verbose_name='自增主键ID')
|
||||
yonghu = models.CharField(
|
||||
max_length=7,
|
||||
@@ -21,7 +22,7 @@ class YonghuPingzheng(models.Model):
|
||||
verbose_name_plural = verbose_name
|
||||
|
||||
|
||||
class Dianpu(models.Model):
|
||||
class Dianpu(QModel):
|
||||
id = models.AutoField(primary_key=True, verbose_name='店铺自增ID')
|
||||
pingzheng = models.OneToOneField(
|
||||
'shop.YonghuPingzheng', # 同应用内可简写,但完整路径更清晰
|
||||
@@ -68,7 +69,7 @@ class Dianpu(models.Model):
|
||||
|
||||
|
||||
|
||||
class DianpuMorenPeizhi(models.Model):
|
||||
class DianpuMorenPeizhi(QModel):
|
||||
id = models.PositiveSmallIntegerField(primary_key=True, default=1, editable=False)
|
||||
moren_choucheng_feilv = models.DecimalField(max_digits=5, decimal_places=4, default=0.1000, verbose_name='默认订单抽成费率(小数,0.1000=10%)')
|
||||
moren_tixian_xiane = models.DecimalField(max_digits=10, decimal_places=2, default=1000.00, verbose_name='默认可提现限额')
|
||||
@@ -91,7 +92,7 @@ class DianpuMorenPeizhi(models.Model):
|
||||
|
||||
|
||||
|
||||
class DianpuShouzhiMeiriTongji(models.Model):
|
||||
class DianpuShouzhiMeiriTongji(QModel):
|
||||
dianpu_id = models.PositiveIntegerField(db_index=True, verbose_name='店铺ID')
|
||||
riqi = models.DateField(db_index=True, verbose_name='统计日期')
|
||||
nian = models.PositiveSmallIntegerField(verbose_name='年份')
|
||||
@@ -144,7 +145,7 @@ class DianpuShouzhiMeiriTongji(models.Model):
|
||||
|
||||
|
||||
|
||||
class YonghuDianpuBangding(models.Model):
|
||||
class YonghuDianpuBangding(QModel):
|
||||
id = models.AutoField(primary_key=True, verbose_name='绑定自增ID')
|
||||
yonghu = models.ForeignKey(
|
||||
'users.UserMain', # 🔥 完整路径
|
||||
@@ -164,7 +165,7 @@ class YonghuDianpuBangding(models.Model):
|
||||
unique_together = [['yonghu', 'dianpu']]
|
||||
|
||||
|
||||
class ShangpinLeixingDianpu(models.Model):
|
||||
class ShangpinLeixingDianpu(QModel):
|
||||
"""
|
||||
店铺级商品类型映射表
|
||||
与公共商品类型表 ShangpinLeixing 强制关联,用于店铺自定义类型
|
||||
@@ -207,7 +208,7 @@ class ShangpinLeixingDianpu(models.Model):
|
||||
|
||||
|
||||
# shangdian/models.py 或独立应用 models.py
|
||||
class DianpuShangpinShenheShezhi(models.Model):
|
||||
class DianpuShangpinShenheShezhi(QModel):
|
||||
"""店铺商品审核模式全局配置(仅一条记录)"""
|
||||
kaiqi_shenhe = models.BooleanField(default=False, verbose_name='是否开启商品审核模式')
|
||||
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
||||
|
||||
149
shop/views.py
149
shop/views.py
@@ -19,6 +19,7 @@ from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||
from django.conf import settings
|
||||
from django.db import models, transaction, IntegrityError
|
||||
from django.db.models import F, Sum, Count, Q, Prefetch
|
||||
from gvsdsdk.fluent import db, func, FQ
|
||||
from django.core.cache import cache
|
||||
from django.core.paginator import Paginator, EmptyPage
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
@@ -73,13 +74,13 @@ class BindDianpuView(APIView):
|
||||
|
||||
# 先获取 UserMain 对象(不加锁,仅用于校验存在性)
|
||||
try:
|
||||
user_main = UserMain.objects.get(yonghuid=user.yonghuid)
|
||||
user_main = UserMain.query.get(yonghuid=user.yonghuid)
|
||||
except UserMain.DoesNotExist:
|
||||
return Response({'code': 404, 'msg': '用户不存在'})
|
||||
|
||||
# 校验店铺是否存在且状态正常(不加锁)
|
||||
try:
|
||||
dianpu = Dianpu.objects.get(id=dianpu_id)
|
||||
dianpu = Dianpu.query.get(id=dianpu_id)
|
||||
except Dianpu.DoesNotExist:
|
||||
return Response({'code': 404, 'msg': '店铺不存在'})
|
||||
|
||||
@@ -113,7 +114,7 @@ class BindDianpuView(APIView):
|
||||
existing_binding.save()
|
||||
|
||||
except YonghuDianpuBangding.DoesNotExist:
|
||||
YonghuDianpuBangding.objects.create(yonghu=user_main_locked, dianpu=dianpu_locked)
|
||||
YonghuDianpuBangding.query.create(yonghu=user_main_locked, dianpu=dianpu_locked)
|
||||
|
||||
# 新店铺绑定人数加1
|
||||
dianpu_locked.bangding_yonghushu = F('bangding_yonghushu') + 1
|
||||
@@ -142,12 +143,12 @@ class ShopGoodsView(APIView):
|
||||
def post(self, request):
|
||||
user = request.user
|
||||
try:
|
||||
user_main = UserMain.objects.get(yonghuid=user.yonghuid)
|
||||
user_main = UserMain.query.get(yonghuid=user.yonghuid)
|
||||
except UserMain.DoesNotExist:
|
||||
return Response({'code': 404, 'msg': '用户不存在'})
|
||||
|
||||
# 1. 查询用户店铺绑定关系
|
||||
binding = YonghuDianpuBangding.objects.filter(
|
||||
binding = YonghuDianpuBangding.query.filter(
|
||||
yonghu=user_main
|
||||
).select_related('dianpu').first()
|
||||
|
||||
@@ -171,10 +172,10 @@ class ShopGoodsView(APIView):
|
||||
|
||||
def _has_special_identity(self, user_main):
|
||||
"""判断用户是否拥有打手/商家/管事/组长任一身份"""
|
||||
return (UserDashou.objects.filter(user=user_main).exists() or
|
||||
UserShangjia.objects.filter(user=user_main).exists() or
|
||||
UserGuanshi.objects.filter(user=user_main).exists() or
|
||||
UserZuzhang.objects.filter(user=user_main).exists())
|
||||
return (UserDashou.query.filter(user=user_main).exists() or
|
||||
UserShangjia.query.filter(user=user_main).exists() or
|
||||
UserGuanshi.query.filter(user=user_main).exists() or
|
||||
UserZuzhang.query.filter(user=user_main).exists())
|
||||
|
||||
def _get_shop_goods(self, dianpu):
|
||||
"""
|
||||
@@ -182,7 +183,7 @@ class ShopGoodsView(APIView):
|
||||
类型、专区、商品均从店铺相关表中获取,且需通过平台审核(shenhe_zhuangtai=True)
|
||||
"""
|
||||
# 1. 店铺商品类型:未封禁、已上架、平台审核通过
|
||||
leixing_queryset = ShangpinLeixingDianpu.objects.filter(
|
||||
leixing_queryset = ShangpinLeixingDianpu.query.filter(
|
||||
dianpu=dianpu,
|
||||
fengjin_zhuangtai=False,
|
||||
shangjia_zhuangtai=True,
|
||||
@@ -202,14 +203,14 @@ class ShopGoodsView(APIView):
|
||||
|
||||
# 2. 专区:根据店铺和店铺类型ID,未封禁、已上架
|
||||
if leixing_ids:
|
||||
zhuanqu_queryset = ShangpinZhuanqu.objects.filter(
|
||||
zhuanqu_queryset = ShangpinZhuanqu.query.filter(
|
||||
dianpu=dianpu,
|
||||
dianpu_leixing_id__in=leixing_ids,
|
||||
fengjin_zhuangtai=False,
|
||||
shangjia_zhuangtai=True
|
||||
).order_by('-paixu', 'id')
|
||||
else:
|
||||
zhuanqu_queryset = ShangpinZhuanqu.objects.none()
|
||||
zhuanqu_queryset = ShangpinZhuanqu.query.none()
|
||||
|
||||
zhuanqu_data = []
|
||||
for zq in zhuanqu_queryset:
|
||||
@@ -223,7 +224,7 @@ class ShopGoodsView(APIView):
|
||||
# 3. 商品:根据店铺、店铺类型、专区,未封禁、已上架、平台审核通过、原有审核状态为正常
|
||||
zhuanqu_ids = [zq['id'] for zq in zhuanqu_data]
|
||||
if zhuanqu_ids:
|
||||
shangpin_queryset = Shangpin.objects.filter(
|
||||
shangpin_queryset = Shangpin.query.filter(
|
||||
dianpu=dianpu,
|
||||
dianpu_leixing_id__in=leixing_ids,
|
||||
zhuanqu_id__in=zhuanqu_ids,
|
||||
@@ -260,7 +261,7 @@ class ShopGoodsView(APIView):
|
||||
target_shenhe = 1 if use_audit_status_one else 2
|
||||
|
||||
# 1. 公共商品类型:原有审核状态为 target_shenhe
|
||||
leixing_queryset = ShangpinLeixing.objects.filter(
|
||||
leixing_queryset = ShangpinLeixing.query.filter(
|
||||
shenhezhuangtai=target_shenhe
|
||||
).order_by('-paixu', 'id')
|
||||
|
||||
@@ -277,14 +278,14 @@ class ShopGoodsView(APIView):
|
||||
|
||||
# 2. 专区:dianpu 为空,且 dianpu_leixing 为空,leixing_id 在可见范围内,原有审核状态为 target_shenhe
|
||||
if visible_leixing_ids:
|
||||
zhuanqu_queryset = ShangpinZhuanqu.objects.filter(
|
||||
zhuanqu_queryset = ShangpinZhuanqu.query.filter(
|
||||
dianpu__isnull=True,
|
||||
dianpu_leixing__isnull=True, # 🔥 必须为空
|
||||
leixing_id__in=visible_leixing_ids,
|
||||
shenhezhuangtai=target_shenhe
|
||||
).order_by('-paixu', 'id')
|
||||
else:
|
||||
zhuanqu_queryset = ShangpinZhuanqu.objects.none()
|
||||
zhuanqu_queryset = ShangpinZhuanqu.query.none()
|
||||
|
||||
zhuanqu_data = []
|
||||
for zq in zhuanqu_queryset:
|
||||
@@ -298,7 +299,7 @@ class ShopGoodsView(APIView):
|
||||
# 3. 商品:dianpu 为空,dianpu_leixing 为空,专区在可见范围内,原有审核状态为 target_shenhe
|
||||
zhuanqu_ids = [zq['id'] for zq in zhuanqu_data]
|
||||
if zhuanqu_ids:
|
||||
shangpin_queryset = Shangpin.objects.filter(
|
||||
shangpin_queryset = Shangpin.query.filter(
|
||||
dianpu__isnull=True,
|
||||
dianpu_leixing__isnull=True, # 🔥 必须为空
|
||||
leixing_id__in=visible_leixing_ids,
|
||||
@@ -350,14 +351,14 @@ class ShangdianLoginView(APIView):
|
||||
|
||||
# 3. 验证用户主表是否存在
|
||||
try:
|
||||
user_main = UserMain.objects.get(yonghuid=yonghuid)
|
||||
user_main = UserMain.query.get(yonghuid=yonghuid)
|
||||
except UserMain.DoesNotExist:
|
||||
logger.warning(f"登录失败:用户ID不存在 - {yonghuid}")
|
||||
return Response({'code': 404, 'msg': '账号或密码错误'})
|
||||
|
||||
# 4. 通过用户ID + 账号查询凭证表
|
||||
try:
|
||||
pingzheng = YonghuPingzheng.objects.get(
|
||||
pingzheng = YonghuPingzheng.query.get(
|
||||
yonghu=yonghuid,
|
||||
zhanghao=zhanghao,
|
||||
is_active=True
|
||||
@@ -530,7 +531,7 @@ class DianpuShouzhiTongjiView(APIView):
|
||||
month = request.data.get('month')
|
||||
|
||||
# 查询当前店铺的统计记录
|
||||
qs = DianpuShouzhiMeiriTongji.objects.filter(dianpu_id=dianpu.id)
|
||||
qs = DianpuShouzhiMeiriTongji.query.filter(dianpu_id=dianpu.id)
|
||||
|
||||
if granularity == 'day':
|
||||
if not year or not month:
|
||||
@@ -790,7 +791,7 @@ class ShopProductConfigView(APIView):
|
||||
|
||||
# ---------- 2. 公共商品类型(需审核正常) ----------
|
||||
try:
|
||||
public_types_qs = ShangpinLeixing.objects.filter(shenhezhuangtai=1).values(
|
||||
public_types_qs = ShangpinLeixing.query.filter(shenhezhuangtai=1).values(
|
||||
'id', 'jieshao', 'tupian_url'
|
||||
)
|
||||
public_types = [{
|
||||
@@ -804,7 +805,7 @@ class ShopProductConfigView(APIView):
|
||||
|
||||
# ---------- 3. 店铺商品类型 ----------
|
||||
try:
|
||||
shop_types = ShangpinLeixingDianpu.objects.filter(
|
||||
shop_types = ShangpinLeixingDianpu.query.filter(
|
||||
dianpu_id=dianpu.id
|
||||
).select_related('gonggong_leixing').order_by('-paixu')
|
||||
except Exception as e:
|
||||
@@ -829,7 +830,7 @@ class ShopProductConfigView(APIView):
|
||||
# ---------- 4. 各类型商品数量统计 ----------
|
||||
type_product_counts = {}
|
||||
if type_ids:
|
||||
counts = Shangpin.objects.filter(
|
||||
counts = Shangpin.query.filter(
|
||||
dianpu_id=dianpu.id,
|
||||
dianpu_leixing_id__in=type_ids
|
||||
).values('dianpu_leixing_id').annotate(cnt=Count('id'))
|
||||
@@ -837,7 +838,7 @@ class ShopProductConfigView(APIView):
|
||||
|
||||
# ---------- 5. 专区列表 ----------
|
||||
try:
|
||||
zhuanqu_qs = ShangpinZhuanqu.objects.filter(
|
||||
zhuanqu_qs = ShangpinZhuanqu.query.filter(
|
||||
dianpu_id=dianpu.id
|
||||
).order_by('-paixu').values(
|
||||
'id', 'mingzi', 'paixu', 'shangjia_zhuangtai',
|
||||
@@ -862,7 +863,7 @@ class ShopProductConfigView(APIView):
|
||||
# ---------- 6. 各专区商品数量统计 ----------
|
||||
zhuanqu_product_counts = {}
|
||||
if zhuanqu_ids:
|
||||
counts = Shangpin.objects.filter(
|
||||
counts = Shangpin.query.filter(
|
||||
dianpu_id=dianpu.id,
|
||||
zhuanqu_id__in=zhuanqu_ids
|
||||
).values('zhuanqu_id').annotate(cnt=Count('id'))
|
||||
@@ -932,7 +933,7 @@ class ShopProductModifyView(APIView):
|
||||
return Response({'code': 400, 'msg': '缺少介绍或公共类型ID'})
|
||||
|
||||
# 验证公共类型存在且正常
|
||||
if not ShangpinLeixing.objects.filter(id=gonggong_leixing_id, shenhezhuangtai=1).exists():
|
||||
if not ShangpinLeixing.query.filter(id=gonggong_leixing_id, shenhezhuangtai=1).exists():
|
||||
return Response({'code': 400, 'msg': '所选公共商品类型无效'})
|
||||
|
||||
image_file = request.FILES.get('image')
|
||||
@@ -949,10 +950,10 @@ class ShopProductModifyView(APIView):
|
||||
tupian_url = full_url.replace(settings.COS_DOMAIN.rstrip('/') + '/', '', 1)
|
||||
|
||||
# 审核状态
|
||||
audit_config = DianpuShangpinShenheShezhi.objects.filter(id=1).first()
|
||||
audit_config = DianpuShangpinShenheShezhi.query.filter(id=1).first()
|
||||
shenhe_status = not (audit_config and audit_config.kaiqi_shenhe)
|
||||
|
||||
ShangpinLeixingDianpu.objects.create(
|
||||
ShangpinLeixingDianpu.query.create(
|
||||
dianpu_id=dianpu.id,
|
||||
gonggong_leixing_id=gonggong_leixing_id,
|
||||
jieshao=jieshao,
|
||||
@@ -997,7 +998,7 @@ class ShopProductModifyView(APIView):
|
||||
# 映射公共类型
|
||||
if 'gonggong_leixing_id' in request.data or 'gonggong_leixing_id' in request.POST:
|
||||
new_id = request.data.get('gonggong_leixing_id') or request.POST.get('gonggong_leixing_id')
|
||||
if not ShangpinLeixing.objects.filter(id=new_id, shenhezhuangtai=1).exists():
|
||||
if not ShangpinLeixing.query.filter(id=new_id, shenhezhuangtai=1).exists():
|
||||
return Response({'code': 400, 'msg': '公共商品类型无效'})
|
||||
obj.gonggong_leixing_id = new_id
|
||||
update_fields.append('gonggong_leixing_id')
|
||||
@@ -1031,7 +1032,7 @@ class ShopProductModifyView(APIView):
|
||||
|
||||
# 审核重置
|
||||
if content_changed:
|
||||
audit_config = DianpuShangpinShenheShezhi.objects.filter(id=1).first()
|
||||
audit_config = DianpuShangpinShenheShezhi.query.filter(id=1).first()
|
||||
if audit_config and audit_config.kaiqi_shenhe:
|
||||
obj.shenhe_zhuangtai = False
|
||||
update_fields.append('shenhe_zhuangtai')
|
||||
@@ -1066,7 +1067,7 @@ class ShopProductModifyView(APIView):
|
||||
|
||||
if delete_products:
|
||||
# 删除该类型下所有关联商品(同时清理图片)
|
||||
products = Shangpin.objects.filter(
|
||||
products = Shangpin.query.filter(
|
||||
dianpu_leixing_id=obj.id, dianpu_id=dianpu.id
|
||||
)
|
||||
for p in products:
|
||||
@@ -1077,7 +1078,7 @@ class ShopProductModifyView(APIView):
|
||||
p.delete()
|
||||
else:
|
||||
# 仅解除关联,不删商品
|
||||
Shangpin.objects.filter(
|
||||
Shangpin.query.filter(
|
||||
dianpu_leixing_id=obj.id, dianpu_id=dianpu.id
|
||||
).update(dianpu_leixing=None)
|
||||
|
||||
@@ -1104,7 +1105,7 @@ class ShopProductModifyView(APIView):
|
||||
|
||||
# 获取店铺商品类型,并拿到映射的公共类型ID
|
||||
try:
|
||||
shop_type = ShangpinLeixingDianpu.objects.get(
|
||||
shop_type = ShangpinLeixingDianpu.query.get(
|
||||
id=dianpu_leixing_id, dianpu_id=dianpu.id
|
||||
)
|
||||
leixing_id = shop_type.gonggong_leixing_id # 这就是专区需要的 leixing_id
|
||||
@@ -1112,10 +1113,10 @@ class ShopProductModifyView(APIView):
|
||||
return Response({'code': 400, 'msg': '所选商品类型无效'})
|
||||
|
||||
# 验证公共类型有效
|
||||
if not ShangpinLeixing.objects.filter(id=leixing_id, shenhezhuangtai=1).exists():
|
||||
if not ShangpinLeixing.query.filter(id=leixing_id, shenhezhuangtai=1).exists():
|
||||
return Response({'code': 400, 'msg': '关联的公共商品类型无效'})
|
||||
|
||||
ShangpinZhuanqu.objects.create(
|
||||
ShangpinZhuanqu.query.create(
|
||||
dianpu_id=dianpu.id,
|
||||
mingzi=mingzi,
|
||||
dianpu_leixing_id=dianpu_leixing_id,
|
||||
@@ -1156,7 +1157,7 @@ class ShopProductModifyView(APIView):
|
||||
if 'dianpu_leixing_id' in request.data:
|
||||
new_id = request.data.get('dianpu_leixing_id')
|
||||
try:
|
||||
shop_type = ShangpinLeixingDianpu.objects.get(
|
||||
shop_type = ShangpinLeixingDianpu.query.get(
|
||||
id=new_id, dianpu_id=dianpu.id
|
||||
)
|
||||
obj.dianpu_leixing_id = new_id
|
||||
@@ -1205,7 +1206,7 @@ class ShopProductModifyView(APIView):
|
||||
delete_products = str(delete_products).lower() in ('true', '1', 'yes')
|
||||
|
||||
if delete_products:
|
||||
products = Shangpin.objects.filter(
|
||||
products = Shangpin.query.filter(
|
||||
zhuanqu_id=obj.id, dianpu_id=dianpu.id
|
||||
)
|
||||
for p in products:
|
||||
@@ -1215,7 +1216,7 @@ class ShopProductModifyView(APIView):
|
||||
delete_from_oss(p.guize_tupian)
|
||||
p.delete()
|
||||
else:
|
||||
Shangpin.objects.filter(
|
||||
Shangpin.query.filter(
|
||||
zhuanqu_id=obj.id, dianpu_id=dianpu.id
|
||||
).update(zhuanqu_id=None)
|
||||
|
||||
@@ -1271,7 +1272,7 @@ class ShopProductListView(APIView):
|
||||
fengjin = parse_bool(request.data.get('fengjin_zhuangtai'))
|
||||
|
||||
# 3. 构建查询(只查当前店铺的商品)
|
||||
products = Shangpin.objects.filter(dianpu_id=dianpu.id).select_related(
|
||||
products = Shangpin.query.filter(dianpu_id=dianpu.id).select_related(
|
||||
'dianpu_leixing'
|
||||
).only(
|
||||
'id', 'biaoqian', 'jiage', 'kucun', 'leixing_id', 'zhuanqu_id',
|
||||
@@ -1432,7 +1433,7 @@ class ShopProductModifyView1(APIView):
|
||||
# 店铺商品类型
|
||||
if 'dianpu_leixing_id' in data:
|
||||
new_type_id = to_int(data['dianpu_leixing_id'])
|
||||
if not ShangpinLeixingDianpu.objects.filter(id=new_type_id, dianpu_id=dianpu.id).exists():
|
||||
if not ShangpinLeixingDianpu.query.filter(id=new_type_id, dianpu_id=dianpu.id).exists():
|
||||
return Response({'code': 400, 'msg': '无效的店铺商品类型'})
|
||||
product.dianpu_leixing_id = new_type_id
|
||||
update_fields.append('dianpu_leixing_id')
|
||||
@@ -1443,7 +1444,7 @@ class ShopProductModifyView1(APIView):
|
||||
new_zq_id = data['zhuanqu_id']
|
||||
if new_zq_id is not None and new_zq_id != '':
|
||||
new_zq_id = to_int(new_zq_id)
|
||||
if not ShangpinZhuanqu.objects.filter(id=new_zq_id, dianpu_id=dianpu.id).exists():
|
||||
if not ShangpinZhuanqu.query.filter(id=new_zq_id, dianpu_id=dianpu.id).exists():
|
||||
return Response({'code': 400, 'msg': '无效的专区'})
|
||||
product.zhuanqu_id = new_zq_id
|
||||
else:
|
||||
@@ -1482,10 +1483,10 @@ class ShopProductModifyView1(APIView):
|
||||
else:
|
||||
# 自动从公共类型获取会员ID,或转为佣金
|
||||
try:
|
||||
shop_type = ShangpinLeixingDianpu.objects.get(
|
||||
shop_type = ShangpinLeixingDianpu.query.get(
|
||||
id=product.dianpu_leixing_id, dianpu_id=dianpu.id
|
||||
)
|
||||
public_type = ShangpinLeixing.objects.get(id=shop_type.gonggong_leixing_id)
|
||||
public_type = ShangpinLeixing.query.get(id=shop_type.gonggong_leixing_id)
|
||||
auto_huiyuan_id = public_type.huiyuan_id
|
||||
if auto_huiyuan_id:
|
||||
product.huiyuan_id = auto_huiyuan_id
|
||||
@@ -1581,7 +1582,7 @@ class ShopProductModifyView1(APIView):
|
||||
content_changed = True
|
||||
|
||||
if content_changed:
|
||||
audit_config = DianpuShangpinShenheShezhi.objects.filter(id=1).first()
|
||||
audit_config = DianpuShangpinShenheShezhi.query.filter(id=1).first()
|
||||
if audit_config and audit_config.kaiqi_shenhe:
|
||||
product.shenhe_zhuangtai = False
|
||||
update_fields.append('shenhe_zhuangtai')
|
||||
@@ -1604,12 +1605,12 @@ class ShopProductModifyView1(APIView):
|
||||
return Response({'code': 400, 'msg': '必填项缺失'})
|
||||
|
||||
try:
|
||||
shop_type = ShangpinLeixingDianpu.objects.get(id=dianpu_leixing_id, dianpu_id=dianpu.id)
|
||||
shop_type = ShangpinLeixingDianpu.query.get(id=dianpu_leixing_id, dianpu_id=dianpu.id)
|
||||
except ShangpinLeixingDianpu.DoesNotExist:
|
||||
return Response({'code': 400, 'msg': '无效的店铺商品类型'})
|
||||
|
||||
try:
|
||||
public_type = ShangpinLeixing.objects.get(id=shop_type.gonggong_leixing_id, shenhezhuangtai=1)
|
||||
public_type = ShangpinLeixing.query.get(id=shop_type.gonggong_leixing_id, shenhezhuangtai=1)
|
||||
except ShangpinLeixing.DoesNotExist:
|
||||
return Response({'code': 400, 'msg': '关联的公共商品类型无效'})
|
||||
|
||||
@@ -1672,11 +1673,11 @@ class ShopProductModifyView1(APIView):
|
||||
return Response({'code': 400, 'msg': '分成金额不能超过商品价格'})'''
|
||||
|
||||
shenhe_status = True
|
||||
audit_config = DianpuShangpinShenheShezhi.objects.filter(id=1).first()
|
||||
audit_config = DianpuShangpinShenheShezhi.query.filter(id=1).first()
|
||||
if audit_config and audit_config.kaiqi_shenhe:
|
||||
shenhe_status = False
|
||||
|
||||
product = Shangpin.objects.create(
|
||||
product = Shangpin.query.create(
|
||||
biaoqian=biaoqian,
|
||||
jiage=jiage,
|
||||
kucun=kucun,
|
||||
@@ -1745,7 +1746,7 @@ class MemberListView(APIView):
|
||||
|
||||
# ---------- 3. 查询所有会员(只返回前端需要的字段) ----------
|
||||
try:
|
||||
members = Huiyuan.objects.all().values('huiyuan_id', 'jieshao')
|
||||
members = Huiyuan.query.all().values('huiyuan_id', 'jieshao')
|
||||
member_list = [
|
||||
{
|
||||
'huiyuan_id': m['huiyuan_id'],
|
||||
@@ -1796,7 +1797,7 @@ class SubShopListView(APIView):
|
||||
page_size = request.data.get('page_size', 10)
|
||||
|
||||
# 3. 查询下级店铺:yaoqing_dianpu_id 等于当前上级店铺ID
|
||||
queryset = Dianpu.objects.filter(yaoqing_dianpu_id=parent_dianpu.id)
|
||||
queryset = Dianpu.query.filter(yaoqing_dianpu_id=parent_dianpu.id)
|
||||
|
||||
# 4. 筛选条件
|
||||
if dianpu_mingcheng:
|
||||
@@ -1910,13 +1911,13 @@ class SubShopModifyView(APIView):
|
||||
return Response({'code': 400, 'msg': '必填字段缺失(user_uid, zhanghao, mima, dianpu_mingcheng)'})
|
||||
|
||||
# 检查用户是否存在
|
||||
if not UserMain.objects.filter(yonghuid=user_uid).exists():
|
||||
if not UserMain.query.filter(yonghuid=user_uid).exists():
|
||||
return Response({'code': 404, 'msg': '对应的小程序用户不存在'})
|
||||
|
||||
# 检查账号是否已占用
|
||||
if YonghuPingzheng.objects.filter(zhanghao=zhanghao).exists():
|
||||
if YonghuPingzheng.query.filter(zhanghao=zhanghao).exists():
|
||||
return Response({'code': 400, 'msg': '登录账号已存在'})
|
||||
if YonghuPingzheng.objects.filter(yonghu=user_uid).exists():
|
||||
if YonghuPingzheng.query.filter(yonghu=user_uid).exists():
|
||||
return Response({'code': 400, 'msg': '该用户 ID 已有店铺凭证'})
|
||||
|
||||
# 费率处理:前端可选,后端默认 0.0500
|
||||
@@ -1933,14 +1934,14 @@ class SubShopModifyView(APIView):
|
||||
try:
|
||||
with transaction.atomic():
|
||||
# 创建凭证
|
||||
pingzheng = YonghuPingzheng.objects.create(
|
||||
pingzheng = YonghuPingzheng.query.create(
|
||||
yonghu=user_uid,
|
||||
zhanghao=zhanghao,
|
||||
mima=mima,
|
||||
is_active=True
|
||||
)
|
||||
# 创建店铺,关联上级
|
||||
dianpu = Dianpu.objects.create(
|
||||
dianpu = Dianpu.query.create(
|
||||
pingzheng=pingzheng,
|
||||
dianpu_mingcheng=dianpu_mingcheng,
|
||||
lianxi_dianhua=lianxi_dianhua or '',
|
||||
@@ -2100,7 +2101,7 @@ class ShopOrderStatisticsView(APIView):
|
||||
|
||||
try:
|
||||
# 2. 获取所有正常状态(审核通过)的商品类型
|
||||
types_qs = ShangpinLeixing.objects.filter(
|
||||
types_qs = ShangpinLeixing.query.filter(
|
||||
shenhezhuangtai=1
|
||||
).order_by('-paixu', 'id')
|
||||
|
||||
@@ -2122,7 +2123,7 @@ class ShopOrderStatisticsView(APIView):
|
||||
|
||||
# 3. 获取本店铺所有订单的主键ID列表(通过平台扩展表)
|
||||
order_pks = list(
|
||||
DingdanPingtai.objects.filter(dianpu_id=shop_id)
|
||||
DingdanPingtai.query.filter(dianpu_id=shop_id)
|
||||
.values_list('dingdan_id', flat=True) # 这里取的是订单主表的主键id
|
||||
)
|
||||
|
||||
@@ -2217,7 +2218,7 @@ def _fetch_images(order, oss_domain):
|
||||
# 仅当订单有接单打手ID时才查询打手图片
|
||||
if order.jiedan_dashou_id:
|
||||
# 从打手图片表中查询该订单、该打手的所有图片记录
|
||||
image_urls = Dashoutupian.objects.filter(
|
||||
image_urls = Dashoutupian.query.filter(
|
||||
dingdan_id=order.dingdan_id, # 订单ID匹配
|
||||
dashou=order.jiedan_dashou_id # 接单打手ID匹配
|
||||
).values_list('tupian', flat=True) # 只取图片URL字段
|
||||
@@ -2323,7 +2324,7 @@ class ShopOrderManageView(APIView):
|
||||
# ------------------------------------------------------------
|
||||
# 步骤1:获取所有正常的商品类型(审核状态为1)
|
||||
# ------------------------------------------------------------
|
||||
types_query = ShangpinLeixing.objects.filter(
|
||||
types_query = ShangpinLeixing.query.filter(
|
||||
shenhezhuangtai=1 # 审核状态为1(正常)
|
||||
).order_by('-paixu', 'id') # 按排序权重和ID排序
|
||||
|
||||
@@ -2351,7 +2352,7 @@ class ShopOrderManageView(APIView):
|
||||
# ------------------------------------------------------------
|
||||
# 从 DingdanPingtai 中过滤出属于当前店铺的订单扩展记录,并提取订单主表ID
|
||||
order_ids = list(
|
||||
DingdanPingtai.objects.filter(
|
||||
DingdanPingtai.query.filter(
|
||||
dianpu_id=shop_id # 店铺ID匹配
|
||||
).values_list('dingdan_id', flat=True) # 只取订单ID字段
|
||||
)
|
||||
@@ -2365,7 +2366,7 @@ class ShopOrderManageView(APIView):
|
||||
# ------------------------------------------------------------
|
||||
if order_ids:
|
||||
# 使用 Django 聚合查询:按 leixing_id(商品类型)和 zhuangtai(订单状态)分组计数
|
||||
aggregation = Dingdan.objects.filter(
|
||||
aggregation = Dingdan.query.filter(
|
||||
dingdan_id__in=order_ids # 从该店铺的订单中查询
|
||||
).values(
|
||||
'leixing_id', # 按类型ID分组
|
||||
@@ -2432,7 +2433,7 @@ class ShopOrderManageView(APIView):
|
||||
page_size = request.data.get('page_size', 20)
|
||||
|
||||
# 基础查询:从平台扩展表关联订单主表,并按创建时间倒序
|
||||
qs = DingdanPingtai.objects.filter(
|
||||
qs = DingdanPingtai.query.filter(
|
||||
dianpu_id=shop_id
|
||||
).select_related('dingdan').order_by('-dingdan__create_time')
|
||||
|
||||
@@ -2552,7 +2553,7 @@ class ShopRefundView(APIView):
|
||||
# 3. 查询订单,必须属于本店铺(通过扩展表关联)
|
||||
try:
|
||||
# 通过扩展表确认归属,并 select_related 获取订单主表
|
||||
pingtai_ext = DingdanPingtai.objects.select_related('dingdan').get(
|
||||
pingtai_ext = DingdanPingtai.query.select_related('dingdan').get(
|
||||
dianpu_id=shop_id,
|
||||
dingdan__dingdan_id=dingdan_id
|
||||
)
|
||||
@@ -2586,7 +2587,7 @@ class ShopRefundView(APIView):
|
||||
# 更新打手统计(退款量+1,状态置为空闲)
|
||||
if dashou_id:
|
||||
try:
|
||||
dashou_user = UserMain.objects.get(yonghuid=dashou_id)
|
||||
dashou_user = UserMain.query.get(yonghuid=dashou_id)
|
||||
dashou_profile = dashou_user.dashou_profile
|
||||
dashou_profile.tuikuanliang += 1
|
||||
dashou_profile.zhuangtai = 1
|
||||
@@ -2716,7 +2717,7 @@ class ShopRefundView(APIView):
|
||||
def _update_refund_record(self, order, dashou_id, chuli_id, reason):
|
||||
"""更新退款记录表"""
|
||||
try:
|
||||
refund_record, created = Tuikuanjilu.objects.get_or_create(
|
||||
refund_record, created = Tuikuanjilu.query.get_or_create(
|
||||
dingdan_id=order.dingdan_id,
|
||||
defaults={
|
||||
'dashouid': dashou_id or '',
|
||||
@@ -2799,7 +2800,7 @@ class ShopForceCompleteView(APIView):
|
||||
# ========== 3. 查询订单并验证归属 ==========
|
||||
try:
|
||||
# 通过平台扩展表确认订单属于本店铺
|
||||
pingtai_ext = DingdanPingtai.objects.select_related('dingdan').get(
|
||||
pingtai_ext = DingdanPingtai.query.select_related('dingdan').get(
|
||||
dianpu_id=shop_id,
|
||||
dingdan__dingdan_id=dingdan_id
|
||||
)
|
||||
@@ -2829,7 +2830,7 @@ class ShopForceCompleteView(APIView):
|
||||
|
||||
# ---------- 更新打手余额和统计 ----------
|
||||
try:
|
||||
dashou_user = UserMain.objects.get(yonghuid=dashou_id)
|
||||
dashou_user = UserMain.query.get(yonghuid=dashou_id)
|
||||
dashou_profile = dashou_user.dashou_profile
|
||||
dashou_profile.chengjiaozongliang += 1
|
||||
dashou_profile.yue += dashou_fencheng
|
||||
@@ -2948,7 +2949,7 @@ class ShopTransferHallView(APIView):
|
||||
|
||||
# ---------- 3. 验证订单归属 ----------
|
||||
try:
|
||||
pingtai_ext = DingdanPingtai.objects.select_related('dingdan').get(
|
||||
pingtai_ext = DingdanPingtai.query.select_related('dingdan').get(
|
||||
dianpu_id=shop_id,
|
||||
dingdan__dingdan_id=dingdan_id
|
||||
)
|
||||
@@ -2973,11 +2974,11 @@ class ShopTransferHallView(APIView):
|
||||
|
||||
# ---------- 6. 记录打手历史(原接口保留逻辑) ----------
|
||||
if current_dashou_id:
|
||||
last_history = OrderDashouHistory.objects.filter(
|
||||
last_history = OrderDashouHistory.query.filter(
|
||||
dingdan_id=dingdan_id
|
||||
).order_by('-times').first()
|
||||
next_times = (last_history.times + 1) if last_history else 1
|
||||
OrderDashouHistory.objects.create(
|
||||
OrderDashouHistory.query.create(
|
||||
dingdan_id=dingdan_id,
|
||||
dashou_id=current_dashou_id,
|
||||
times=next_times,
|
||||
@@ -2987,7 +2988,7 @@ class ShopTransferHallView(APIView):
|
||||
# ---------- 7. 释放本地打手 + 退款统计 ----------
|
||||
if current_dashou_id:
|
||||
try:
|
||||
dashou_profile = UserDashou.objects.get(user__yonghuid=current_dashou_id)
|
||||
dashou_profile = UserDashou.query.get(user__yonghuid=current_dashou_id)
|
||||
dashou_profile.zhuangtai = 1 # 设为空闲
|
||||
dashou_profile.save()
|
||||
except ObjectDoesNotExist:
|
||||
@@ -3073,7 +3074,7 @@ class ShopFineApplyView(APIView):
|
||||
|
||||
# ---------- 3. 验证订单归属 ----------
|
||||
try:
|
||||
pingtai_ext = DingdanPingtai.objects.select_related('dingdan').get(
|
||||
pingtai_ext = DingdanPingtai.query.select_related('dingdan').get(
|
||||
dianpu_id=shop_id,
|
||||
dingdan__dingdan_id=dingdan_id
|
||||
)
|
||||
@@ -3088,12 +3089,12 @@ class ShopFineApplyView(APIView):
|
||||
return Response({'code': 400, 'msg': '该订单无接单打手,无法罚款'})
|
||||
|
||||
# ---------- 5. 重复罚款检查 ----------
|
||||
if Fadan.objects.filter(beichufa_id=dashou_id, guanliandingdan_id=dingdan_id).exists():
|
||||
if Fadan.query.filter(beichufa_id=dashou_id, guanliandingdan_id=dingdan_id).exists():
|
||||
return Response({'code': 400, 'msg': '该打手已被罚款过'})
|
||||
|
||||
# ---------- 6. 创建罚单 ----------
|
||||
with transaction.atomic():
|
||||
Fadan.objects.create(
|
||||
Fadan.query.create(
|
||||
beichufa_id=dashou_id,
|
||||
shenqing_chufa=str(shop_id), # 申请人记为店铺ID
|
||||
shenfen=1, # 被处罚人身份:1 打手
|
||||
|
||||
Reference in New Issue
Block a user