彻底解决了 create_time 的问题,将所有字段都改为了 CreateTime

This commit is contained in:
2026-06-19 19:19:22 +08:00
parent 90e0bde7f1
commit e64697b64a
35 changed files with 4803 additions and 4872 deletions

View File

@@ -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')),
],

View File

@@ -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)

View File

@@ -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}")

View File

@@ -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 '',