加入了 GVSDSDK 模块,进行了 QModel 兼容层的尝试,生产环境可用

This commit is contained in:
2026-06-16 00:13:10 +08:00
parent 9d9cfa53a4
commit 63e0f4edfc
68 changed files with 10256 additions and 1143 deletions

View File

@@ -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='创建时间')

View File

@@ -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 打手