彻底解决了 create_time 的问题,将所有字段都改为了 CreateTime
This commit is contained in:
@@ -21,8 +21,8 @@ class Migration(migrations.Migration):
|
||||
('id', models.PositiveSmallIntegerField(default=1, editable=False, primary_key=True, serialize=False)),
|
||||
('moren_choucheng_feilv', models.DecimalField(decimal_places=4, default=0.1, max_digits=5, verbose_name='默认订单抽成费率(小数,0.1000=10%)')),
|
||||
('moren_tixian_xiane', models.DecimalField(decimal_places=2, default=1000.0, max_digits=10, verbose_name='默认可提现限额')),
|
||||
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
|
||||
('CreateTime', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('UpdateTime', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '店铺默认配置',
|
||||
@@ -35,8 +35,8 @@ class Migration(migrations.Migration):
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('kaiqi_shenhe', models.BooleanField(default=False, verbose_name='是否开启商品审核模式')),
|
||||
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
|
||||
('CreateTime', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('UpdateTime', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '商品审核模式配置',
|
||||
@@ -52,8 +52,8 @@ class Migration(migrations.Migration):
|
||||
('zhanghao', models.CharField(db_index=True, max_length=50, unique=True, verbose_name='登录账号')),
|
||||
('mima', models.CharField(max_length=255, verbose_name='密码')),
|
||||
('is_active', models.BooleanField(default=True, verbose_name='是否启用')),
|
||||
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
|
||||
('CreateTime', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('UpdateTime', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '用户认证凭证',
|
||||
@@ -77,8 +77,8 @@ class Migration(migrations.Migration):
|
||||
('tuikuan_zongliang', models.PositiveIntegerField(default=0, verbose_name='退款总量')),
|
||||
('tuikuan_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='退款总额')),
|
||||
('shouyi_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='收益总额')),
|
||||
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
|
||||
('CreateTime', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('UpdateTime', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
|
||||
('shangji_fenhong_cishu', models.PositiveIntegerField(default=0, verbose_name='作为上级获得分红次数')),
|
||||
('shangji_fenhong_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='作为上级获得分红总额')),
|
||||
('shangji_id', models.PositiveIntegerField(blank=True, null=True, verbose_name='当天对应的上级店铺ID(若无则为空)')),
|
||||
@@ -104,8 +104,8 @@ class Migration(migrations.Migration):
|
||||
('zhuangtai', models.IntegerField(choices=[(0, '封禁'), (1, '正常')], default=1, verbose_name='店铺状态')),
|
||||
('bangding_yonghushu', models.PositiveIntegerField(default=0, verbose_name='绑定用户总数')),
|
||||
('erweima_url', models.CharField(blank=True, max_length=500, null=True, verbose_name='店铺二维码相对URL')),
|
||||
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
|
||||
('CreateTime', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('UpdateTime', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
|
||||
('kaiqi_shouyi_choucheng', models.BooleanField(default=False, verbose_name='是否开启店铺订单收益抽成')),
|
||||
('shouyi_choucheng_feilv', models.DecimalField(blank=True, decimal_places=4, default=0.0, max_digits=5, null=True, verbose_name='店铺订单收益抽成费率(小数,如0.1000=10%)')),
|
||||
('ketixian_yue', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='店铺可提现余额')),
|
||||
@@ -128,8 +128,8 @@ class Migration(migrations.Migration):
|
||||
name='YonghuDianpuBangding',
|
||||
fields=[
|
||||
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='绑定自增ID')),
|
||||
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
|
||||
('CreateTime', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('UpdateTime', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
|
||||
('dianpu', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='shop.dianpu', verbose_name='关联店铺ID')),
|
||||
('yonghu', models.ForeignKey(db_column='UserUUID', on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='用户ID')),
|
||||
],
|
||||
|
||||
448
shop/models.py
448
shop/models.py
@@ -1,224 +1,224 @@
|
||||
from django.db import models
|
||||
from gvsdsdk.model_base import QModel
|
||||
|
||||
|
||||
class YonghuPingzheng(QModel):
|
||||
id = models.AutoField(primary_key=True, verbose_name='自增主键ID')
|
||||
yonghu = models.CharField(
|
||||
max_length=7,
|
||||
unique=True, # 确保一个用户只有一条凭证记录
|
||||
db_index=True,
|
||||
verbose_name='关联用户ID'
|
||||
)
|
||||
zhanghao = models.CharField(max_length=50, unique=True, db_index=True, verbose_name='登录账号')
|
||||
mima = models.CharField(max_length=255, verbose_name='密码')
|
||||
is_active = models.BooleanField(default=True, verbose_name='是否启用')
|
||||
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
||||
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
|
||||
|
||||
class Meta:
|
||||
db_table = 'yonghu_pingzheng'
|
||||
verbose_name = '用户认证凭证'
|
||||
verbose_name_plural = verbose_name
|
||||
|
||||
|
||||
class Dianpu(QModel):
|
||||
id = models.AutoField(primary_key=True, verbose_name='店铺自增ID')
|
||||
pingzheng = models.OneToOneField(
|
||||
'shop.YonghuPingzheng', # 同应用内可简写,但完整路径更清晰
|
||||
on_delete=models.CASCADE,
|
||||
db_index=True,
|
||||
verbose_name='关联用户凭证'
|
||||
)
|
||||
dianpu_mingcheng = models.CharField(max_length=50, verbose_name='店铺名称')
|
||||
dianpu_touxiang = models.CharField(max_length=500, null=True, blank=True, verbose_name='店铺头像URL')
|
||||
|
||||
lianxi_dianhua = models.CharField(max_length=20, null=True, blank=True, verbose_name='联系电话')
|
||||
weixinhao = models.CharField(max_length=50, null=True, blank=True, verbose_name='微信号')
|
||||
zhuangtai = models.IntegerField(choices=[(0, '封禁'), (1, '正常')], default=1, verbose_name='店铺状态')
|
||||
bangding_yonghushu = models.PositiveIntegerField(default=0, verbose_name='绑定用户总数')
|
||||
erweima_url = models.CharField(max_length=500, null=True, blank=True, verbose_name='店铺二维码相对URL')
|
||||
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
||||
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
|
||||
|
||||
kaiqi_shouyi_choucheng = models.BooleanField(default=False, verbose_name='是否开启店铺订单收益抽成')
|
||||
shouyi_choucheng_feilv = models.DecimalField(max_digits=5, decimal_places=4, null=True, blank=True, default=0.0000,
|
||||
verbose_name='店铺订单收益抽成费率(小数,如0.1000=10%)')
|
||||
ketixian_yue = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='店铺可提现余额')
|
||||
zhengqu_zonge = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='店铺赚取总额')
|
||||
meiri_tixian_xiane = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, default=0.00,
|
||||
verbose_name='店铺每日提现限额')
|
||||
kaiqi_meiri_xiane = models.BooleanField(default=False, verbose_name='是否开启每日提现限额')
|
||||
|
||||
|
||||
yaoqing_dianpu_id = models.PositiveIntegerField(null=True, blank=True, db_index=True,
|
||||
verbose_name='邀请人店铺ID(上级)')
|
||||
fenhong_choucheng_feilv = models.DecimalField(max_digits=5, decimal_places=4, null=True, blank=True, default=0.0500,
|
||||
verbose_name='上级分红抽成费率(默认5%)')
|
||||
shangji_fenhong_leiji = models.DecimalField(max_digits=12, decimal_places=2, default=0.00,
|
||||
verbose_name='作为上级累计获得分红')
|
||||
shangji_ketixian_fenhong = models.DecimalField(max_digits=12, decimal_places=2, default=0.00,
|
||||
verbose_name='作为上级可提现分红余额')
|
||||
|
||||
class Meta:
|
||||
db_table = 'dianpu'
|
||||
verbose_name = '平台商家店铺'
|
||||
verbose_name_plural = verbose_name
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
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='默认可提现限额')
|
||||
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
||||
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
|
||||
|
||||
class Meta:
|
||||
db_table = 'dianpu_moren_peizhi'
|
||||
verbose_name = '店铺默认配置'
|
||||
verbose_name_plural = verbose_name
|
||||
|
||||
def __str__(self):
|
||||
return f"默认配置 - 费率:{self.moren_choucheng_feilv} 限额:{self.moren_tixian_xiane}"
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
self.id = 1
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
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='年份')
|
||||
yue = models.PositiveSmallIntegerField(verbose_name='月份')
|
||||
ri = models.PositiveSmallIntegerField(verbose_name='日')
|
||||
xiadan_zongliang = models.PositiveIntegerField(default=0, verbose_name='下单总量')
|
||||
xiadan_zonge = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='下单总额')
|
||||
chengjiao_zongliang = models.PositiveIntegerField(default=0, verbose_name='成交总量')
|
||||
chengjiao_zonge = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='成交总额')
|
||||
tuikuan_zongliang = models.PositiveIntegerField(default=0, verbose_name='退款总量')
|
||||
tuikuan_zonge = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='退款总额')
|
||||
shouyi_zonge = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='收益总额')
|
||||
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
||||
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
|
||||
|
||||
shangji_fenhong_cishu = models.PositiveIntegerField(default=0, verbose_name='作为上级获得分红次数')
|
||||
shangji_fenhong_zonge = models.DecimalField(max_digits=12, decimal_places=2, default=0.00,
|
||||
verbose_name='作为上级获得分红总额')
|
||||
|
||||
# ---------- 作为下级,给上级的分红记录 ----------
|
||||
shangji_id = models.PositiveIntegerField(null=True, blank=True, verbose_name='当天对应的上级店铺ID(若无则为空)')
|
||||
gei_shangji_cishu = models.PositiveIntegerField(default=0, verbose_name='给上级分红次数')
|
||||
gei_shangji_zonge = models.DecimalField(max_digits=12, decimal_places=2, default=0.00,
|
||||
verbose_name='给上级分红总额')
|
||||
|
||||
|
||||
class Meta:
|
||||
db_table = 'dianpu_shouzhi_meiri_tongji'
|
||||
verbose_name = '店铺每日收支统计'
|
||||
verbose_name_plural = verbose_name
|
||||
unique_together = [['dianpu_id', 'riqi']]
|
||||
indexes = [
|
||||
models.Index(fields=['dianpu_id', 'riqi']),
|
||||
models.Index(fields=['nian', 'yue', 'ri']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"店铺ID:{self.dianpu_id} - {self.riqi}"
|
||||
|
||||
def clean(self):
|
||||
if self.riqi:
|
||||
self.nian = self.riqi.year
|
||||
self.yue = self.riqi.month
|
||||
self.ri = self.riqi.day
|
||||
super().clean()
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
self.clean()
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
|
||||
|
||||
class YonghuDianpuBangding(QModel):
|
||||
id = models.AutoField(primary_key=True, verbose_name='绑定自增ID')
|
||||
yonghu = models.ForeignKey(
|
||||
'users.User',
|
||||
on_delete=models.CASCADE,
|
||||
db_column='UserUUID',
|
||||
db_index=True,
|
||||
verbose_name='用户ID'
|
||||
)
|
||||
dianpu = models.ForeignKey('Dianpu', on_delete=models.CASCADE, db_index=True, verbose_name='关联店铺ID')
|
||||
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
||||
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
|
||||
|
||||
class Meta:
|
||||
db_table = 'yonghu_dianpu_bangding'
|
||||
verbose_name = '用户店铺绑定关系'
|
||||
verbose_name_plural = verbose_name
|
||||
unique_together = [['yonghu', 'dianpu']]
|
||||
|
||||
|
||||
class ShangpinLeixingDianpu(QModel):
|
||||
"""
|
||||
店铺级商品类型映射表
|
||||
与公共商品类型表 ShangpinLeixing 强制关联,用于店铺自定义类型
|
||||
"""
|
||||
id = models.AutoField(primary_key=True, verbose_name='类型自增ID')
|
||||
dianpu = models.ForeignKey(
|
||||
'shop.Dianpu',
|
||||
on_delete=models.CASCADE,
|
||||
db_index=True,
|
||||
verbose_name='所属店铺'
|
||||
)
|
||||
# 🔥 强制映射到公共商品类型,不可为空
|
||||
gonggong_leixing = models.ForeignKey(
|
||||
'products.ShangpinLeixing',
|
||||
on_delete=models.CASCADE,
|
||||
db_index=True,
|
||||
verbose_name='映射的公共商品类型'
|
||||
)
|
||||
jieshao = models.CharField(max_length=45, verbose_name='类型介绍')
|
||||
tupian_url = models.CharField(max_length=500, null=True, blank=True, verbose_name='类型图片URL')
|
||||
paixu = models.IntegerField(default=0, verbose_name='排序权重')
|
||||
shangjia_zhuangtai = models.BooleanField(default=True, verbose_name='是否上架')
|
||||
fengjin_zhuangtai = models.BooleanField(default=False, verbose_name='是否封禁')
|
||||
shenhe_zhuangtai = models.BooleanField(default=False, verbose_name='平台审核状态',help_text='True=审核通过,False=未审核')
|
||||
|
||||
class Meta:
|
||||
db_table = 'shangdian_shangpin_leixing'
|
||||
verbose_name = '店铺商品类型映射'
|
||||
verbose_name_plural = verbose_name
|
||||
indexes = [
|
||||
models.Index(fields=['dianpu']),
|
||||
models.Index(fields=['gonggong_leixing']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.dianpu.dianpu_mingcheng} - {self.jieshao}"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# shangdian/models.py 或独立应用 models.py
|
||||
class DianpuShangpinShenheShezhi(QModel):
|
||||
"""店铺商品审核模式全局配置(仅一条记录)"""
|
||||
kaiqi_shenhe = models.BooleanField(default=False, verbose_name='是否开启商品审核模式')
|
||||
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
||||
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
|
||||
|
||||
class Meta:
|
||||
db_table = 'dianpu_shangpin_shenhe_shezhi'
|
||||
verbose_name = '商品审核模式配置'
|
||||
verbose_name_plural = verbose_name
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
self.pk = 1 # 强制使用 ID=1 保证唯一
|
||||
super().save(*args, **kwargs)
|
||||
from django.db import models
|
||||
from gvsdsdk.model_base import QModel
|
||||
|
||||
|
||||
class YonghuPingzheng(QModel):
|
||||
id = models.AutoField(primary_key=True, verbose_name='自增主键ID')
|
||||
yonghu = models.CharField(
|
||||
max_length=7,
|
||||
unique=True, # 确保一个用户只有一条凭证记录
|
||||
db_index=True,
|
||||
verbose_name='关联用户ID'
|
||||
)
|
||||
zhanghao = models.CharField(max_length=50, unique=True, db_index=True, verbose_name='登录账号')
|
||||
mima = models.CharField(max_length=255, verbose_name='密码')
|
||||
is_active = models.BooleanField(default=True, verbose_name='是否启用')
|
||||
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
||||
UpdateTime = models.DateTimeField(auto_now=True, verbose_name='更新时间')
|
||||
|
||||
class Meta:
|
||||
db_table = 'yonghu_pingzheng'
|
||||
verbose_name = '用户认证凭证'
|
||||
verbose_name_plural = verbose_name
|
||||
|
||||
|
||||
class Dianpu(QModel):
|
||||
id = models.AutoField(primary_key=True, verbose_name='店铺自增ID')
|
||||
pingzheng = models.OneToOneField(
|
||||
'shop.YonghuPingzheng', # 同应用内可简写,但完整路径更清晰
|
||||
on_delete=models.CASCADE,
|
||||
db_index=True,
|
||||
verbose_name='关联用户凭证'
|
||||
)
|
||||
dianpu_mingcheng = models.CharField(max_length=50, verbose_name='店铺名称')
|
||||
dianpu_touxiang = models.CharField(max_length=500, null=True, blank=True, verbose_name='店铺头像URL')
|
||||
|
||||
lianxi_dianhua = models.CharField(max_length=20, null=True, blank=True, verbose_name='联系电话')
|
||||
weixinhao = models.CharField(max_length=50, null=True, blank=True, verbose_name='微信号')
|
||||
zhuangtai = models.IntegerField(choices=[(0, '封禁'), (1, '正常')], default=1, verbose_name='店铺状态')
|
||||
bangding_yonghushu = models.PositiveIntegerField(default=0, verbose_name='绑定用户总数')
|
||||
erweima_url = models.CharField(max_length=500, null=True, blank=True, verbose_name='店铺二维码相对URL')
|
||||
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
||||
UpdateTime = models.DateTimeField(auto_now=True, verbose_name='更新时间')
|
||||
|
||||
kaiqi_shouyi_choucheng = models.BooleanField(default=False, verbose_name='是否开启店铺订单收益抽成')
|
||||
shouyi_choucheng_feilv = models.DecimalField(max_digits=5, decimal_places=4, null=True, blank=True, default=0.0000,
|
||||
verbose_name='店铺订单收益抽成费率(小数,如0.1000=10%)')
|
||||
ketixian_yue = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='店铺可提现余额')
|
||||
zhengqu_zonge = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='店铺赚取总额')
|
||||
meiri_tixian_xiane = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, default=0.00,
|
||||
verbose_name='店铺每日提现限额')
|
||||
kaiqi_meiri_xiane = models.BooleanField(default=False, verbose_name='是否开启每日提现限额')
|
||||
|
||||
|
||||
yaoqing_dianpu_id = models.PositiveIntegerField(null=True, blank=True, db_index=True,
|
||||
verbose_name='邀请人店铺ID(上级)')
|
||||
fenhong_choucheng_feilv = models.DecimalField(max_digits=5, decimal_places=4, null=True, blank=True, default=0.0500,
|
||||
verbose_name='上级分红抽成费率(默认5%)')
|
||||
shangji_fenhong_leiji = models.DecimalField(max_digits=12, decimal_places=2, default=0.00,
|
||||
verbose_name='作为上级累计获得分红')
|
||||
shangji_ketixian_fenhong = models.DecimalField(max_digits=12, decimal_places=2, default=0.00,
|
||||
verbose_name='作为上级可提现分红余额')
|
||||
|
||||
class Meta:
|
||||
db_table = 'dianpu'
|
||||
verbose_name = '平台商家店铺'
|
||||
verbose_name_plural = verbose_name
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
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='默认可提现限额')
|
||||
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
||||
UpdateTime = models.DateTimeField(auto_now=True, verbose_name='更新时间')
|
||||
|
||||
class Meta:
|
||||
db_table = 'dianpu_moren_peizhi'
|
||||
verbose_name = '店铺默认配置'
|
||||
verbose_name_plural = verbose_name
|
||||
|
||||
def __str__(self):
|
||||
return f"默认配置 - 费率:{self.moren_choucheng_feilv} 限额:{self.moren_tixian_xiane}"
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
self.id = 1
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
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='年份')
|
||||
yue = models.PositiveSmallIntegerField(verbose_name='月份')
|
||||
ri = models.PositiveSmallIntegerField(verbose_name='日')
|
||||
xiadan_zongliang = models.PositiveIntegerField(default=0, verbose_name='下单总量')
|
||||
xiadan_zonge = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='下单总额')
|
||||
chengjiao_zongliang = models.PositiveIntegerField(default=0, verbose_name='成交总量')
|
||||
chengjiao_zonge = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='成交总额')
|
||||
tuikuan_zongliang = models.PositiveIntegerField(default=0, verbose_name='退款总量')
|
||||
tuikuan_zonge = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='退款总额')
|
||||
shouyi_zonge = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='收益总额')
|
||||
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
||||
UpdateTime = models.DateTimeField(auto_now=True, verbose_name='更新时间')
|
||||
|
||||
shangji_fenhong_cishu = models.PositiveIntegerField(default=0, verbose_name='作为上级获得分红次数')
|
||||
shangji_fenhong_zonge = models.DecimalField(max_digits=12, decimal_places=2, default=0.00,
|
||||
verbose_name='作为上级获得分红总额')
|
||||
|
||||
# ---------- 作为下级,给上级的分红记录 ----------
|
||||
shangji_id = models.PositiveIntegerField(null=True, blank=True, verbose_name='当天对应的上级店铺ID(若无则为空)')
|
||||
gei_shangji_cishu = models.PositiveIntegerField(default=0, verbose_name='给上级分红次数')
|
||||
gei_shangji_zonge = models.DecimalField(max_digits=12, decimal_places=2, default=0.00,
|
||||
verbose_name='给上级分红总额')
|
||||
|
||||
|
||||
class Meta:
|
||||
db_table = 'dianpu_shouzhi_meiri_tongji'
|
||||
verbose_name = '店铺每日收支统计'
|
||||
verbose_name_plural = verbose_name
|
||||
unique_together = [['dianpu_id', 'riqi']]
|
||||
indexes = [
|
||||
models.Index(fields=['dianpu_id', 'riqi']),
|
||||
models.Index(fields=['nian', 'yue', 'ri']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"店铺ID:{self.dianpu_id} - {self.riqi}"
|
||||
|
||||
def clean(self):
|
||||
if self.riqi:
|
||||
self.nian = self.riqi.year
|
||||
self.yue = self.riqi.month
|
||||
self.ri = self.riqi.day
|
||||
super().clean()
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
self.clean()
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
|
||||
|
||||
class YonghuDianpuBangding(QModel):
|
||||
id = models.AutoField(primary_key=True, verbose_name='绑定自增ID')
|
||||
yonghu = models.ForeignKey(
|
||||
'users.User',
|
||||
on_delete=models.CASCADE,
|
||||
db_column='UserUUID',
|
||||
db_index=True,
|
||||
verbose_name='用户ID'
|
||||
)
|
||||
dianpu = models.ForeignKey('Dianpu', on_delete=models.CASCADE, db_index=True, verbose_name='关联店铺ID')
|
||||
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
||||
UpdateTime = models.DateTimeField(auto_now=True, verbose_name='更新时间')
|
||||
|
||||
class Meta:
|
||||
db_table = 'yonghu_dianpu_bangding'
|
||||
verbose_name = '用户店铺绑定关系'
|
||||
verbose_name_plural = verbose_name
|
||||
unique_together = [['yonghu', 'dianpu']]
|
||||
|
||||
|
||||
class ShangpinLeixingDianpu(QModel):
|
||||
"""
|
||||
店铺级商品类型映射表
|
||||
与公共商品类型表 ShangpinLeixing 强制关联,用于店铺自定义类型
|
||||
"""
|
||||
id = models.AutoField(primary_key=True, verbose_name='类型自增ID')
|
||||
dianpu = models.ForeignKey(
|
||||
'shop.Dianpu',
|
||||
on_delete=models.CASCADE,
|
||||
db_index=True,
|
||||
verbose_name='所属店铺'
|
||||
)
|
||||
# 🔥 强制映射到公共商品类型,不可为空
|
||||
gonggong_leixing = models.ForeignKey(
|
||||
'products.ShangpinLeixing',
|
||||
on_delete=models.CASCADE,
|
||||
db_index=True,
|
||||
verbose_name='映射的公共商品类型'
|
||||
)
|
||||
jieshao = models.CharField(max_length=45, verbose_name='类型介绍')
|
||||
tupian_url = models.CharField(max_length=500, null=True, blank=True, verbose_name='类型图片URL')
|
||||
paixu = models.IntegerField(default=0, verbose_name='排序权重')
|
||||
shangjia_zhuangtai = models.BooleanField(default=True, verbose_name='是否上架')
|
||||
fengjin_zhuangtai = models.BooleanField(default=False, verbose_name='是否封禁')
|
||||
shenhe_zhuangtai = models.BooleanField(default=False, verbose_name='平台审核状态',help_text='True=审核通过,False=未审核')
|
||||
|
||||
class Meta:
|
||||
db_table = 'shangdian_shangpin_leixing'
|
||||
verbose_name = '店铺商品类型映射'
|
||||
verbose_name_plural = verbose_name
|
||||
indexes = [
|
||||
models.Index(fields=['dianpu']),
|
||||
models.Index(fields=['gonggong_leixing']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.dianpu.dianpu_mingcheng} - {self.jieshao}"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# shangdian/models.py 或独立应用 models.py
|
||||
class DianpuShangpinShenheShezhi(QModel):
|
||||
"""店铺商品审核模式全局配置(仅一条记录)"""
|
||||
kaiqi_shenhe = models.BooleanField(default=False, verbose_name='是否开启商品审核模式')
|
||||
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
||||
UpdateTime = models.DateTimeField(auto_now=True, verbose_name='更新时间')
|
||||
|
||||
class Meta:
|
||||
db_table = 'dianpu_shangpin_shenhe_shezhi'
|
||||
verbose_name = '商品审核模式配置'
|
||||
verbose_name_plural = verbose_name
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
self.pk = 1 # 强制使用 ID=1 保证唯一
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
@@ -170,7 +170,7 @@ def verify_shop_permission(request, frontend_user_id=None):
|
||||
dianpu = Dianpu.objects.select_for_update().get(id=dianpu_id)
|
||||
dianpu.ketixian_yue = F('ketixian_yue') + dianpu_shouyi
|
||||
dianpu.zhengqu_zonge = F('zhengqu_zonge') + dianpu_shouyi
|
||||
dianpu.save(update_fields=['ketixian_yue', 'zhengqu_zonge', 'update_time'])
|
||||
dianpu.save(update_fields=['ketixian_yue', 'zhengqu_zonge', 'UpdateTime'])
|
||||
except Dianpu.DoesNotExist:
|
||||
logger.error(f"结算时店铺ID {dianpu_id} 不存在,但已校验过,此处不应发生")
|
||||
raise
|
||||
@@ -383,7 +383,7 @@ def update_dianpu_daily_stat(
|
||||
dianpu_locked = Dianpu.objects.select_for_update().get(id=dianpu_id)
|
||||
dianpu_locked.ketixian_yue = F('ketixian_yue') + dianpu_shouyi
|
||||
dianpu_locked.zhengqu_zonge = F('zhengqu_zonge') + dianpu_shouyi
|
||||
dianpu_locked.save(update_fields=['ketixian_yue', 'zhengqu_zonge', 'update_time'])
|
||||
dianpu_locked.save(update_fields=['ketixian_yue', 'zhengqu_zonge', 'UpdateTime'])
|
||||
except Dianpu.DoesNotExist:
|
||||
logger.error(f"结算时店铺 {dianpu_id} 不存在")
|
||||
raise
|
||||
@@ -466,13 +466,13 @@ def _update_shangji_gain_stat_within_tx(shangji_dianpu_id, fenhong_jine):
|
||||
# 更新上级店铺的“作为上级获得”字段
|
||||
tongji_shangji.shangji_fenhong_cishu = F('shangji_fenhong_cishu') + 1
|
||||
tongji_shangji.shangji_fenhong_zonge = F('shangji_fenhong_zonge') + fenhong_jine
|
||||
tongji_shangji.save(update_fields=['shangji_fenhong_cishu', 'shangji_fenhong_zonge', 'update_time'])
|
||||
tongji_shangji.save(update_fields=['shangji_fenhong_cishu', 'shangji_fenhong_zonge', 'UpdateTime'])
|
||||
|
||||
# 更新上级店铺主表的分红余额和累计分红
|
||||
shangji = Dianpu.objects.select_for_update().get(id=shangji_dianpu_id)
|
||||
shangji.shangji_fenhong_leiji = F('shangji_fenhong_leiji') + fenhong_jine
|
||||
shangji.shangji_ketixian_fenhong = F('shangji_ketixian_fenhong') + fenhong_jine
|
||||
shangji.save(update_fields=['shangji_fenhong_leiji', 'shangji_ketixian_fenhong', 'update_time'])
|
||||
shangji.save(update_fields=['shangji_fenhong_leiji', 'shangji_ketixian_fenhong', 'UpdateTime'])
|
||||
|
||||
logger.info(f"上级店铺 {shangji_dianpu_id} 获得分红 +{fenhong_jine}")
|
||||
|
||||
|
||||
@@ -440,8 +440,8 @@ class ShopOverviewView(APIView):
|
||||
'zhuangtai': dianpu.zhuangtai,
|
||||
'bangding_yonghushu': dianpu.bangding_yonghushu,
|
||||
'erweima_url': dianpu.erweima_url or '',
|
||||
'create_time': dianpu.create_time.isoformat() if dianpu.create_time else '',
|
||||
'update_time': dianpu.update_time.isoformat() if dianpu.update_time else '',
|
||||
'CreateTime': dianpu.CreateTime.isoformat() if dianpu.CreateTime else '',
|
||||
'UpdateTime': dianpu.UpdateTime.isoformat() if dianpu.UpdateTime else '',
|
||||
# 新增字段
|
||||
'kaiqi_shouyi_choucheng': dianpu.kaiqi_shouyi_choucheng,
|
||||
'shouyi_choucheng_feilv': float(dianpu.shouyi_choucheng_feilv) if dianpu.shouyi_choucheng_feilv else 0.0,
|
||||
@@ -729,7 +729,7 @@ class ShopQrcodeView(APIView):
|
||||
# 更新数据库
|
||||
with transaction.atomic():
|
||||
dianpu.erweima_url = relative_path
|
||||
dianpu.save(update_fields=['erweima_url', 'update_time'])
|
||||
dianpu.save(update_fields=['erweima_url', 'UpdateTime'])
|
||||
|
||||
return Response({
|
||||
'code': 0,
|
||||
@@ -1281,7 +1281,7 @@ class ShopProductListView(APIView):
|
||||
'guize_tupian', 'yaoqiuleixing', 'huiyuan_id', 'yongjin',
|
||||
'tupian_url', 'ewai_dashou_fencheng', 'paixu',
|
||||
'dianpu_leixing_id', 'shangjia_zhuangtai', 'fengjin_zhuangtai',
|
||||
'shenhe_zhuangtai', 'create_time', 'update_time'
|
||||
'shenhe_zhuangtai', 'CreateTime', 'UpdateTime'
|
||||
)
|
||||
|
||||
# 筛选
|
||||
@@ -1342,8 +1342,8 @@ class ShopProductListView(APIView):
|
||||
'shangjia_zhuangtai': p.shangjia_zhuangtai,
|
||||
'fengjin_zhuangtai': p.fengjin_zhuangtai,
|
||||
'shenhe_zhuangtai': p.shenhe_zhuangtai,
|
||||
'create_time': p.create_time.isoformat() if p.create_time else '',
|
||||
'update_time': p.update_time.isoformat() if p.update_time else '',
|
||||
'CreateTime': p.CreateTime.isoformat() if p.CreateTime else '',
|
||||
'UpdateTime': p.UpdateTime.isoformat() if p.UpdateTime else '',
|
||||
})
|
||||
|
||||
return Response({
|
||||
@@ -1589,7 +1589,7 @@ class ShopProductModifyView1(APIView):
|
||||
update_fields.append('shenhe_zhuangtai')
|
||||
|
||||
if update_fields:
|
||||
product.save(update_fields=update_fields + ['update_time'])
|
||||
product.save(update_fields=update_fields + ['UpdateTime'])
|
||||
return Response({'code': 0, 'msg': '商品修改成功'})
|
||||
|
||||
# ---------- 添加商品(增强会员/佣金默认逻辑) ----------
|
||||
@@ -1823,7 +1823,7 @@ class SubShopListView(APIView):
|
||||
pass
|
||||
|
||||
# 5. 排序:按创建时间倒序
|
||||
queryset = queryset.order_by('-create_time')
|
||||
queryset = queryset.order_by('-CreateTime')
|
||||
|
||||
# 6. 分页
|
||||
try:
|
||||
@@ -1844,8 +1844,8 @@ class SubShopListView(APIView):
|
||||
'bangding_yonghushu': shop.bangding_yonghushu,
|
||||
'zhengqu_zonge': str(shop.zhengqu_zonge),
|
||||
'ketixian_yue': str(shop.ketixian_yue),
|
||||
'create_time': shop.create_time.strftime('%Y-%m-%d %H:%M:%S') if shop.create_time else '',
|
||||
'update_time': shop.update_time.strftime('%Y-%m-%d %H:%M:%S') if shop.update_time else '',
|
||||
'CreateTime': shop.CreateTime.strftime('%Y-%m-%d %H:%M:%S') if shop.CreateTime else '',
|
||||
'UpdateTime': shop.UpdateTime.strftime('%Y-%m-%d %H:%M:%S') if shop.UpdateTime else '',
|
||||
'erweima_url': shop.erweima_url or '',
|
||||
'fenhong_choucheng_feilv': str(shop.fenhong_choucheng_feilv) if shop.fenhong_choucheng_feilv else '0.0000',
|
||||
})
|
||||
@@ -1998,7 +1998,7 @@ class SubShopModifyView(APIView):
|
||||
except (ValueError, TypeError):
|
||||
return Response({'code': 400, 'msg': '分红费率格式错误'})
|
||||
|
||||
sub_dianpu.save(update_fields=['zhuangtai', 'fenhong_choucheng_feilv', 'update_time'])
|
||||
sub_dianpu.save(update_fields=['zhuangtai', 'fenhong_choucheng_feilv', 'UpdateTime'])
|
||||
return Response({'code': 200, 'msg': '修改成功'})
|
||||
|
||||
except Dianpu.DoesNotExist:
|
||||
@@ -2486,8 +2486,8 @@ class ShopOrderManageView(APIView):
|
||||
'beizhu': order.Remark or '',
|
||||
'nicheng': order.Nickname or '',
|
||||
'leixing_id': order.ProductTypeID,
|
||||
'create_time': order.CreateTime.strftime('%Y-%m-%d %H:%M:%S') if order.CreateTime else '',
|
||||
'update_time': order.UpdateTime.strftime('%Y-%m-%d %H:%M:%S') if order.UpdateTime else '',
|
||||
'CreateTime': order.CreateTime.strftime('%Y-%m-%d %H:%M:%S') if order.CreateTime else '',
|
||||
'UpdateTime': order.UpdateTime.strftime('%Y-%m-%d %H:%M:%S') if order.UpdateTime else '',
|
||||
'pingtai_kuozhan': {
|
||||
'laoban_id': ext.BossID or '',
|
||||
'laoban_pingjia': ext.BossReview or '',
|
||||
|
||||
Reference in New Issue
Block a user