将文件夹命名从拼音改为英文,整理了一些代码,将导入语句迁移到了头部
This commit is contained in:
0
products/__init__.py
Normal file
0
products/__init__.py
Normal file
3
products/admin.py
Normal file
3
products/admin.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
5
products/apps.py
Normal file
5
products/apps.py
Normal file
@@ -0,0 +1,5 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class ShangpinConfig(AppConfig):
|
||||
name = "shangpin"
|
||||
149
products/migrations/0001_initial.py
Normal file
149
products/migrations/0001_initial.py
Normal file
@@ -0,0 +1,149 @@
|
||||
# Generated by Django 5.2.10 on 2026-01-14 19:59
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Huiyuan',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('huiyuan_id', models.CharField(max_length=6, unique=True, verbose_name='会员ID')),
|
||||
('jieshao', models.CharField(max_length=30, verbose_name='会员介绍')),
|
||||
('jtjieshao', models.TextField(blank=True, null=True, verbose_name='会员规则介绍')),
|
||||
('jiage', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='会员价格')),
|
||||
('guanshifc', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='管事分成')),
|
||||
('goumai_cishu', models.PositiveIntegerField(default=0, verbose_name='购买次数')),
|
||||
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '会员',
|
||||
'verbose_name_plural': '会员',
|
||||
'db_table': 'huiyuan',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Huiyuangoumai',
|
||||
fields=[
|
||||
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='购买记录ID')),
|
||||
('huiyuan_id', models.CharField(db_index=True, max_length=6, verbose_name='会员ID')),
|
||||
('yonghu_id', models.CharField(db_index=True, max_length=32, verbose_name='用户ID')),
|
||||
('huiyuan_zhuangtai', models.PositiveIntegerField(default=1, verbose_name='会员状态')),
|
||||
('jieshao', models.CharField(max_length=30, null=True, verbose_name='会员介绍')),
|
||||
('daoqi_time', models.DateTimeField(verbose_name='会员到期时间')),
|
||||
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '用户购买会员',
|
||||
'verbose_name_plural': '用户购买会员',
|
||||
'db_table': 'huiyuangoumai',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Shangpin',
|
||||
fields=[
|
||||
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='商品ID')),
|
||||
('biaoqian', models.CharField(blank=True, max_length=45, null=True, verbose_name='商品标题')),
|
||||
('jiage', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='商品价格')),
|
||||
('kucun', models.PositiveIntegerField(default=0, verbose_name='商品库存')),
|
||||
('leixing_id', models.PositiveIntegerField(blank=True, null=True, verbose_name='商品类型ID')),
|
||||
('zhuanqu_id', models.PositiveIntegerField(blank=True, null=True, verbose_name='商品专区ID')),
|
||||
('zhenshi_xiaoliang', models.PositiveIntegerField(default=0, verbose_name='商品真实销量')),
|
||||
('duiwai_xiaoliang', models.PositiveIntegerField(default=0, verbose_name='商品对外销量')),
|
||||
('jieshao', models.TextField(blank=True, null=True, verbose_name='商品介绍')),
|
||||
('xiadan_xuzhi', models.TextField(blank=True, null=True, verbose_name='下单须知')),
|
||||
('guize_tupian', models.CharField(blank=True, max_length=500, null=True, verbose_name='规则图片URL')),
|
||||
('yaoqiuleixing', models.PositiveIntegerField(blank=True, null=True, verbose_name='抢单要求类型')),
|
||||
('huiyuan_id', models.CharField(blank=True, max_length=6, null=True, verbose_name='会员ID')),
|
||||
('yongjin', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='佣金要求')),
|
||||
('tupian_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='更改时间')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '商品',
|
||||
'verbose_name_plural': '商品',
|
||||
'db_table': 'shangpin',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='ShangpinLeixing',
|
||||
fields=[
|
||||
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='类型ID')),
|
||||
('yaoqiuleixing', models.PositiveIntegerField(blank=True, null=True, verbose_name='抢单要求类型')),
|
||||
('huiyuan_id', models.CharField(blank=True, max_length=6, null=True, verbose_name='会员ID')),
|
||||
('yongjin', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='佣金要求')),
|
||||
('jieshao', models.CharField(blank=True, max_length=45, null=True, verbose_name='类型介绍')),
|
||||
('tupian_url', models.CharField(blank=True, max_length=500, null=True, verbose_name='类型图片URL')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '商品类型',
|
||||
'verbose_name_plural': '商品类型',
|
||||
'db_table': 'shangpin_leixing',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='ShangpinZhuanqu',
|
||||
fields=[
|
||||
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='专区ID')),
|
||||
('mingzi', models.CharField(blank=True, max_length=45, null=True, verbose_name='专区名称')),
|
||||
('leixing_id', models.PositiveIntegerField(verbose_name='类型ID')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '商品专区',
|
||||
'verbose_name_plural': '商品专区',
|
||||
'db_table': 'shangpin_zhuanqu',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Czjilu',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('dingdan_id', models.CharField(db_index=True, max_length=32, unique=True, verbose_name='订单ID')),
|
||||
('huiyuan_id', models.CharField(blank=True, max_length=6, null=True, verbose_name='会员ID')),
|
||||
('zhuangtai', models.IntegerField(blank=True, null=True, verbose_name='订单状态')),
|
||||
('yonghuid', models.CharField(db_index=True, max_length=7, verbose_name='用户ID')),
|
||||
('jine', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='订单金额')),
|
||||
('leixing', models.IntegerField(blank=True, null=True, verbose_name='充值类型,1:会员,2:押金,3:积分,4:商家')),
|
||||
('shuoming', models.CharField(blank=True, max_length=100, null=True, verbose_name='订单说明')),
|
||||
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '充值记录订单',
|
||||
'verbose_name_plural': '充值记录订单',
|
||||
'db_table': 'czjilu',
|
||||
'indexes': [models.Index(fields=['dingdan_id'], name='czjilu_dingdan_39bbd0_idx'), models.Index(fields=['yonghuid'], name='czjilu_yonghui_a0555f_idx')],
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Gsfenhong',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('dingdan_id', models.CharField(max_length=32, unique=True, verbose_name='订单ID')),
|
||||
('guanshi', models.CharField(db_index=True, max_length=7, verbose_name='管事ID')),
|
||||
('dashouid', models.CharField(db_index=True, max_length=7, unique=True, verbose_name='打手ID')),
|
||||
('shuoming', models.CharField(blank=True, max_length=100, null=True, verbose_name='订单说明')),
|
||||
('fenhong', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='订单分红金额')),
|
||||
('avatar', models.CharField(blank=True, max_length=500, null=True, verbose_name='打手头像')),
|
||||
('nicheng', models.CharField(max_length=50, null=True, verbose_name='打手昵称')),
|
||||
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '管事分红记录',
|
||||
'verbose_name_plural': '管事分红记录',
|
||||
'db_table': 'gsfenhong',
|
||||
'indexes': [models.Index(fields=['guanshi'], name='gsfenhong_guanshi_dc440f_idx'), models.Index(fields=['dashouid'], name='gsfenhong_dashoui_5473ca_idx')],
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,29 @@
|
||||
# Generated by Django 4.2.27 on 2026-01-18 14:24
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('shangpin', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterUniqueTogether(
|
||||
name='huiyuangoumai',
|
||||
unique_together={('yonghu_id', 'huiyuan_id')},
|
||||
),
|
||||
migrations.AddIndex(
|
||||
model_name='huiyuangoumai',
|
||||
index=models.Index(fields=['yonghu_id'], name='huiyuangoum_yonghu__ba2138_idx'),
|
||||
),
|
||||
migrations.AddIndex(
|
||||
model_name='huiyuangoumai',
|
||||
index=models.Index(fields=['huiyuan_id'], name='huiyuangoum_huiyuan_35fe1d_idx'),
|
||||
),
|
||||
migrations.AddIndex(
|
||||
model_name='huiyuangoumai',
|
||||
index=models.Index(fields=['yonghu_id', 'huiyuan_id'], name='huiyuangoum_yonghu__21e6e1_idx'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,33 @@
|
||||
# Generated by Django 4.2.27 on 2026-02-07 19:42
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('shangpin', '0002_alter_huiyuangoumai_unique_together_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='shangpin',
|
||||
name='paixu',
|
||||
field=models.IntegerField(default=0, verbose_name='排序权重'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='shangpinleixing',
|
||||
name='paixu',
|
||||
field=models.IntegerField(default=0, verbose_name='排序权重'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='shangpinleixing',
|
||||
name='shenhezhuangtai',
|
||||
field=models.IntegerField(default=1, help_text='1=正常, 2=审核专用', verbose_name='审核状态'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='shangpinzhuanqu',
|
||||
name='paixu',
|
||||
field=models.IntegerField(default=0, verbose_name='排序权重'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,23 @@
|
||||
# Generated by Django 4.2.27 on 2026-02-09 15:38
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('shangpin', '0003_shangpin_paixu_shangpinleixing_paixu_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='shangpin',
|
||||
name='shenhezhuangtai',
|
||||
field=models.IntegerField(default=1, help_text='1=正常, 2=审核专用', verbose_name='审核状态'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='shangpinzhuanqu',
|
||||
name='shenhezhuangtai',
|
||||
field=models.IntegerField(default=1, help_text='1=正常, 2=审核专用', verbose_name='审核状态'),
|
||||
),
|
||||
]
|
||||
18
products/migrations/0005_alter_gsfenhong_dashouid.py
Normal file
18
products/migrations/0005_alter_gsfenhong_dashouid.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 4.2.27 on 2026-02-27 15:22
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('shangpin', '0004_shangpin_shenhezhuangtai_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='gsfenhong',
|
||||
name='dashouid',
|
||||
field=models.CharField(db_index=True, max_length=7, verbose_name='打手ID'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,45 @@
|
||||
# Generated by Django 4.2.27 on 2026-03-18 12:09
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('shangpin', '0005_alter_gsfenhong_dashouid'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='gsfenhong',
|
||||
name='huiyuan_id',
|
||||
field=models.CharField(blank=True, max_length=6, null=True, verbose_name='会员ID'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='huiyuan',
|
||||
name='zuzhangfc',
|
||||
field=models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='组长分成'),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='DuociFenhong',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('guanshi', models.CharField(db_index=True, max_length=7, verbose_name='管事ID')),
|
||||
('zuzhang', models.CharField(blank=True, db_index=True, max_length=7, null=True, verbose_name='组长ID')),
|
||||
('cishu', models.PositiveIntegerField(verbose_name='分红次数')),
|
||||
('guanshi_fenhong', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='管事分红金额')),
|
||||
('zuzhang_fenhong', models.DecimalField(decimal_places=2, default=0.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='更新时间')),
|
||||
('huiyuan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='shangpin.huiyuan', verbose_name='会员')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '多次分红配置',
|
||||
'verbose_name_plural': '多次分红配置',
|
||||
'db_table': 'duoci_fenhong',
|
||||
'indexes': [models.Index(fields=['guanshi'], name='duoci_fenho_guanshi_b3de53_idx'), models.Index(fields=['zuzhang'], name='duoci_fenho_zuzhang_69997d_idx')],
|
||||
'unique_together': {('huiyuan', 'guanshi', 'cishu')},
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,47 @@
|
||||
# Generated by Django 4.2.27 on 2026-03-19 13:40
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('shangpin', '0006_gsfenhong_huiyuan_id_huiyuan_zuzhangfc_duocifenhong'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveIndex(
|
||||
model_name='duocifenhong',
|
||||
name='duoci_fenho_guanshi_b3de53_idx',
|
||||
),
|
||||
migrations.RemoveIndex(
|
||||
model_name='duocifenhong',
|
||||
name='duoci_fenho_zuzhang_69997d_idx',
|
||||
),
|
||||
migrations.RenameField(
|
||||
model_name='duocifenhong',
|
||||
old_name='guanshi',
|
||||
new_name='yonghuid',
|
||||
),
|
||||
migrations.AlterUniqueTogether(
|
||||
name='duocifenhong',
|
||||
unique_together=set(),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='duocifenhong',
|
||||
name='huiyuan',
|
||||
field=models.CharField(max_length=10, verbose_name='会员ID'),
|
||||
),
|
||||
migrations.AlterUniqueTogether(
|
||||
name='duocifenhong',
|
||||
unique_together={('huiyuan', 'yonghuid', 'cishu')},
|
||||
),
|
||||
migrations.AddIndex(
|
||||
model_name='duocifenhong',
|
||||
index=models.Index(fields=['yonghuid'], name='duoci_fenho_yonghui_db6a2f_idx'),
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='duocifenhong',
|
||||
name='zuzhang',
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,23 @@
|
||||
# Generated by Django 4.2.27 on 2026-03-19 13:53
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('shangpin', '0007_remove_duocifenhong_duoci_fenho_guanshi_b3de53_idx_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='gsfenhong',
|
||||
name='zuzhang_fenhong',
|
||||
field=models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='组长分红金额'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='gsfenhong',
|
||||
name='zuzhang_id',
|
||||
field=models.CharField(blank=True, db_index=True, max_length=7, null=True, verbose_name='组长ID'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,23 @@
|
||||
# Generated by Django 4.2.27 on 2026-03-22 15:35
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('shangpin', '0008_gsfenhong_zuzhang_fenhong_gsfenhong_zuzhang_id'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='shangpin',
|
||||
name='ewai_dashou_fencheng',
|
||||
field=models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='打手额外分成金额'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='shangpin',
|
||||
name='kaioi_ewai_dashou_fencheng',
|
||||
field=models.BooleanField(default=False, verbose_name='是否开启打手额外分成'),
|
||||
),
|
||||
]
|
||||
18
products/migrations/0010_shangpinleixing_is_cross_enabled.py
Normal file
18
products/migrations/0010_shangpinleixing_is_cross_enabled.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 4.2.27 on 2026-03-24 17:34
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('shangpin', '0009_shangpin_ewai_dashou_fencheng_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='shangpinleixing',
|
||||
name='is_cross_enabled',
|
||||
field=models.BooleanField(default=False, verbose_name='是否开启平台互通'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,60 @@
|
||||
# Generated by Django 4.2.27 on 2026-04-21 12:36
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('shangdian', '0001_initial'),
|
||||
('shangpin', '0010_shangpinleixing_is_cross_enabled'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='shangpin',
|
||||
name='dianpu',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='shangdian.dianpu', verbose_name='所属店铺'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='shangpin',
|
||||
name='dianpu_leixing',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='shangdian.shangpinleixingdianpu', verbose_name='店铺商品类型'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='shangpin',
|
||||
name='fengjin_zhuangtai',
|
||||
field=models.BooleanField(default=True, verbose_name='是否封禁'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='shangpin',
|
||||
name='shangjia_zhuangtai',
|
||||
field=models.BooleanField(default=True, verbose_name='是否上架'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='shangpin',
|
||||
name='shenhe_zhuangtai',
|
||||
field=models.BooleanField(default=False, help_text='True=审核通过,False=未审核', verbose_name='平台审核状态'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='shangpinzhuanqu',
|
||||
name='dianpu',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='shangdian.dianpu', verbose_name='所属店铺'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='shangpinzhuanqu',
|
||||
name='dianpu_leixing',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='shangdian.shangpinleixingdianpu', verbose_name='店铺商品类型'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='shangpinzhuanqu',
|
||||
name='fengjin_zhuangtai',
|
||||
field=models.BooleanField(default=True, verbose_name='是否封禁'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='shangpinzhuanqu',
|
||||
name='shangjia_zhuangtai',
|
||||
field=models.BooleanField(default=True, verbose_name='是否上架'),
|
||||
),
|
||||
]
|
||||
42
products/migrations/0012_shangpinmeiritongji.py
Normal file
42
products/migrations/0012_shangpinmeiritongji.py
Normal file
@@ -0,0 +1,42 @@
|
||||
# Generated by Django 4.2.27 on 2026-04-23 14:56
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('shangpin', '0011_shangpin_dianpu_shangpin_dianpu_leixing_and_more'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='ShangpinMeiriTongji',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, 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='日')),
|
||||
('diandan_zongliang', models.PositiveIntegerField(default=0, verbose_name='点单总量')),
|
||||
('diandan_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='点单总额')),
|
||||
('chengjiao_zongliang', models.PositiveIntegerField(default=0, verbose_name='成交总量')),
|
||||
('chengjiao_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='成交总额')),
|
||||
('tuikuan_zongliang', models.PositiveIntegerField(default=0, verbose_name='退款总量')),
|
||||
('tuikuan_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='退款总额')),
|
||||
('pingtai_shouyi', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='平台收益')),
|
||||
('dianpu_zongshouyi', 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='更新时间')),
|
||||
('shangpin', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='shangpin.shangpin', verbose_name='商品ID')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '商品每日统计',
|
||||
'verbose_name_plural': '商品每日统计',
|
||||
'db_table': 'shangpin_meiri_tongji',
|
||||
'indexes': [models.Index(fields=['shangpin', 'riqi'], name='shangpin_me_shangpi_d27e5c_idx'), models.Index(fields=['nian', 'yue', 'ri'], name='shangpin_me_nian_e3b409_idx')],
|
||||
'unique_together': {('shangpin', 'riqi')},
|
||||
},
|
||||
),
|
||||
]
|
||||
20
products/migrations/0013_shangpinleixing_bankuai.py
Normal file
20
products/migrations/0013_shangpinleixing_bankuai.py
Normal file
@@ -0,0 +1,20 @@
|
||||
# Generated by Django 4.2.27 on 2026-05-14 04:25
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('dengji', '0003_alter_dashoubiaoxian_bankuai'),
|
||||
('shangpin', '0012_shangpinmeiritongji'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='shangpinleixing',
|
||||
name='bankuai',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='dengji.bankuai', verbose_name='所属板块'),
|
||||
),
|
||||
]
|
||||
20
products/migrations/0014_huiyuan_bankuai.py
Normal file
20
products/migrations/0014_huiyuan_bankuai.py
Normal file
@@ -0,0 +1,20 @@
|
||||
# Generated by Django 4.2.27 on 2026-05-16 16:51
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('dengji', '0010_kaohejilufeiyong'),
|
||||
('shangpin', '0013_shangpinleixing_bankuai'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='huiyuan',
|
||||
name='bankuai',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='dengji.bankuai', verbose_name='所属板块'),
|
||||
),
|
||||
]
|
||||
18
products/migrations/0015_gsfenhong_fenhong_leixing.py
Normal file
18
products/migrations/0015_gsfenhong_fenhong_leixing.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 4.2.27 on 2026-06-12 01:29
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('shangpin', '0014_huiyuan_bankuai'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='gsfenhong',
|
||||
name='fenhong_leixing',
|
||||
field=models.PositiveSmallIntegerField(choices=[(1, '会员分红'), (2, '押金分红'), (3, '商家订单分红')], default=1, verbose_name='分红类型'),
|
||||
),
|
||||
]
|
||||
0
products/migrations/__init__.py
Normal file
0
products/migrations/__init__.py
Normal file
364
products/models.py
Normal file
364
products/models.py
Normal file
@@ -0,0 +1,364 @@
|
||||
from django.db import models
|
||||
from django.utils import timezone
|
||||
|
||||
|
||||
class Shangpin(models.Model):
|
||||
"""商品表 - 100-1000条数据"""
|
||||
id = models.AutoField(primary_key=True, verbose_name='商品ID')
|
||||
biaoqian = models.CharField(max_length=45,null=True, blank=True, verbose_name='商品标题') # 15汉字
|
||||
jiage = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='商品价格')
|
||||
kucun = models.PositiveIntegerField(default=0, verbose_name='商品库存')
|
||||
leixing_id = models.PositiveIntegerField(null=True, blank=True,verbose_name='商品类型ID') # 直接存数字
|
||||
zhuanqu_id = models.PositiveIntegerField(null=True, blank=True,verbose_name='商品专区ID') # 直接存数字
|
||||
zhenshi_xiaoliang = models.PositiveIntegerField(default=0, verbose_name='商品真实销量')
|
||||
duiwai_xiaoliang = models.PositiveIntegerField(default=0, verbose_name='商品对外销量')
|
||||
jieshao = models.TextField(null=True, blank=True, verbose_name='商品介绍')
|
||||
|
||||
# 新增字段
|
||||
xiadan_xuzhi = models.TextField(null=True, blank=True, verbose_name='下单须知') # 支持500字,可换行
|
||||
guize_tupian = models.CharField(max_length=500, null=True, blank=True, verbose_name='规则图片URL')
|
||||
|
||||
yaoqiuleixing = models.PositiveIntegerField(null=True, blank=True, verbose_name='抢单要求类型')
|
||||
huiyuan_id = models.CharField(max_length=6, null=True, blank=True, verbose_name='会员ID')
|
||||
yongjin = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True,verbose_name='佣金要求')
|
||||
|
||||
# 🔥 新增:是否开启打手额外分成
|
||||
kaioi_ewai_dashou_fencheng = models.BooleanField(default=False, verbose_name='是否开启打手额外分成')
|
||||
# 🔥 新增:打手额外分成金额(开启时使用此值,否则按利率计算)
|
||||
ewai_dashou_fencheng = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True,verbose_name='打手额外分成金额')
|
||||
|
||||
# 原有图片URL
|
||||
tupian_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='更改时间')
|
||||
paixu = models.IntegerField(default=0, verbose_name='排序权重')
|
||||
shenhezhuangtai = models.IntegerField(default=1, verbose_name='审核状态', help_text='1=正常, 2=审核专用')
|
||||
|
||||
dianpu = models.ForeignKey(
|
||||
'shangdian.Dianpu', # 🔥 跨应用完整路径
|
||||
on_delete=models.CASCADE,
|
||||
null=True,
|
||||
blank=True,
|
||||
db_index=True,
|
||||
verbose_name='所属店铺'
|
||||
)
|
||||
dianpu_leixing = models.ForeignKey(
|
||||
'shangdian.ShangpinLeixingDianpu',
|
||||
on_delete=models.SET_NULL,
|
||||
null=True,
|
||||
blank=True,
|
||||
db_index=True,
|
||||
verbose_name='店铺商品类型'
|
||||
)
|
||||
shangjia_zhuangtai = models.BooleanField(default=True, verbose_name='是否上架')
|
||||
fengjin_zhuangtai = models.BooleanField(default=True, verbose_name='是否封禁')
|
||||
shenhe_zhuangtai = models.BooleanField(default=False, verbose_name='平台审核状态',help_text='True=审核通过,False=未审核')
|
||||
|
||||
class Meta:
|
||||
db_table = 'shangpin'
|
||||
verbose_name = '商品'
|
||||
verbose_name_plural = '商品'
|
||||
# 不要索引!数据量太小
|
||||
|
||||
def __str__(self):
|
||||
return f"商品{self.id}:{self.biaoqian}"
|
||||
|
||||
|
||||
|
||||
|
||||
class ShangpinLeixing(models.Model):
|
||||
"""商品类型表 - <10条数据"""
|
||||
id = models.AutoField(primary_key=True, verbose_name='类型ID')
|
||||
yaoqiuleixing = models.PositiveIntegerField(null=True, blank=True, verbose_name='抢单要求类型')
|
||||
huiyuan_id = models.CharField(max_length=6, null=True, blank=True, verbose_name='会员ID')
|
||||
yongjin = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, verbose_name='佣金要求')
|
||||
jieshao = models.CharField(max_length=45, null=True, blank=True, verbose_name='类型介绍') # 15汉字
|
||||
tupian_url = models.CharField(max_length=500, null=True, blank=True, verbose_name='类型图片URL') # 用CharField
|
||||
is_cross_enabled = models.BooleanField(default=False, verbose_name='是否开启平台互通')
|
||||
paixu = models.IntegerField(default=0, verbose_name='排序权重')
|
||||
shenhezhuangtai = models.IntegerField(default=1, verbose_name='审核状态', help_text='1=正常, 2=审核专用')
|
||||
bankuai = models.ForeignKey(
|
||||
'dengji.Bankuai',
|
||||
on_delete=models.SET_NULL,
|
||||
null=True,
|
||||
blank=True,
|
||||
verbose_name='所属板块'
|
||||
)
|
||||
|
||||
class Meta:
|
||||
db_table = 'shangpin_leixing'
|
||||
verbose_name = '商品类型'
|
||||
verbose_name_plural = '商品类型'
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.jieshao}"
|
||||
|
||||
|
||||
class ShangpinZhuanqu(models.Model):
|
||||
"""商品专区表 - <50条数据"""
|
||||
id = models.AutoField(primary_key=True, verbose_name='专区ID')
|
||||
mingzi = models.CharField(max_length=45, null=True, blank=True, verbose_name='专区名称') # 15汉字
|
||||
leixing_id = models.PositiveIntegerField(verbose_name='类型ID') # 直接存数字,不关联
|
||||
paixu = models.IntegerField(default=0, verbose_name='排序权重')
|
||||
shenhezhuangtai = models.IntegerField(default=1, verbose_name='审核状态', help_text='1=正常, 2=审核专用')
|
||||
|
||||
dianpu = models.ForeignKey(
|
||||
'shangdian.Dianpu', # 🔥 跨应用完整路径
|
||||
on_delete=models.CASCADE,
|
||||
null=True,
|
||||
blank=True,
|
||||
db_index=True,
|
||||
verbose_name='所属店铺'
|
||||
)
|
||||
dianpu_leixing = models.ForeignKey(
|
||||
'shangdian.ShangpinLeixingDianpu',
|
||||
on_delete=models.SET_NULL,
|
||||
null=True,
|
||||
blank=True,
|
||||
db_index=True,
|
||||
verbose_name='店铺商品类型'
|
||||
)
|
||||
shangjia_zhuangtai = models.BooleanField(default=True, verbose_name='是否上架')
|
||||
fengjin_zhuangtai = models.BooleanField(default=True, verbose_name='是否封禁')
|
||||
|
||||
|
||||
class Meta:
|
||||
db_table = 'shangpin_zhuanqu'
|
||||
verbose_name = '商品专区'
|
||||
verbose_name_plural = '商品专区'
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.mingzi}"
|
||||
|
||||
|
||||
class Huiyuan(models.Model):
|
||||
huiyuan_id = models.CharField(max_length=6, unique=True, verbose_name='会员ID')
|
||||
jieshao = models.CharField(max_length=30, verbose_name='会员介绍')
|
||||
jtjieshao = models.TextField(null=True, blank=True, verbose_name='会员规则介绍')
|
||||
jiage = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='会员价格')
|
||||
guanshifc = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='管事分成')
|
||||
|
||||
zuzhangfc = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='组长分成')
|
||||
goumai_cishu = models.PositiveIntegerField(default=0, verbose_name='购买次数')
|
||||
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
||||
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
|
||||
bankuai = models.ForeignKey(
|
||||
'dengji.Bankuai',
|
||||
on_delete=models.SET_NULL,
|
||||
null=True,
|
||||
blank=True,
|
||||
verbose_name='所属板块'
|
||||
)
|
||||
|
||||
class Meta:
|
||||
db_table = 'huiyuan'
|
||||
verbose_name = '会员'
|
||||
verbose_name_plural = '会员'
|
||||
|
||||
def __str__(self):
|
||||
return f"会员{self.huiyuan_id}:{self.jieshao}"
|
||||
|
||||
|
||||
class Huiyuangoumai(models.Model):
|
||||
id = models.AutoField(primary_key=True, verbose_name='购买记录ID')
|
||||
huiyuan_id = models.CharField(max_length=6, db_index=True, verbose_name='会员ID')
|
||||
yonghu_id = models.CharField(max_length=32, db_index=True, verbose_name='用户ID')
|
||||
huiyuan_zhuangtai = models.PositiveIntegerField(default=1, verbose_name='会员状态')
|
||||
jieshao = models.CharField(max_length=30,null=True,verbose_name='会员介绍')
|
||||
daoqi_time = models.DateTimeField(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 = 'huiyuangoumai'
|
||||
verbose_name = '用户购买会员'
|
||||
verbose_name_plural = '用户购买会员'
|
||||
# 添加这个联合唯一约束
|
||||
unique_together = [['yonghu_id', 'huiyuan_id']]
|
||||
|
||||
# 顺便优化索引(可选的,建议加)
|
||||
indexes = [
|
||||
models.Index(fields=['yonghu_id']),
|
||||
models.Index(fields=['huiyuan_id']),
|
||||
models.Index(fields=['yonghu_id', 'huiyuan_id']), # 复合索引加速查询
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"用户{self.yonghu_id}-会员{self.huiyuan_id}"
|
||||
|
||||
def jiance_shifou_daoqi(self):
|
||||
# 使用Django的timezone,它会自动处理时区
|
||||
now = timezone.now()
|
||||
if now > self.daoqi_time:
|
||||
# 过期了
|
||||
if self.huiyuan_zhuangtai != 0:
|
||||
self.huiyuan_zhuangtai = 0
|
||||
self.save()
|
||||
return True
|
||||
else:
|
||||
# 没过期
|
||||
if self.huiyuan_zhuangtai != 1:
|
||||
self.huiyuan_zhuangtai = 1
|
||||
self.save()
|
||||
return False
|
||||
|
||||
|
||||
class Czjilu(models.Model):
|
||||
dingdan_id = models.CharField(max_length=32, unique=True, db_index=True, verbose_name='订单ID')
|
||||
huiyuan_id = models.CharField(max_length=6, null=True, blank=True, verbose_name='会员ID')
|
||||
zhuangtai = models.IntegerField(null=True, blank=True, verbose_name='订单状态')
|
||||
yonghuid = models.CharField(max_length=7, db_index=True, verbose_name='用户ID')
|
||||
jine = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='订单金额')
|
||||
leixing = models.IntegerField(null=True, blank=True, verbose_name='充值类型,1:会员,2:押金,3:积分,4:商家')
|
||||
shuoming = models.CharField(max_length=100, null=True, blank=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 = 'czjilu'
|
||||
verbose_name = '充值记录订单'
|
||||
verbose_name_plural = '充值记录订单'
|
||||
# 为高频查询字段添加索引
|
||||
indexes = [
|
||||
models.Index(fields=['dingdan_id']),
|
||||
models.Index(fields=['yonghuid']),
|
||||
|
||||
|
||||
]
|
||||
|
||||
|
||||
|
||||
|
||||
class Gsfenhong(models.Model):
|
||||
dingdan_id = models.CharField(max_length=32, unique=True, verbose_name='订单ID')
|
||||
guanshi = models.CharField(max_length=7, db_index=True, verbose_name='管事ID')
|
||||
dashouid = models.CharField(max_length=7, db_index=True,verbose_name='打手ID')
|
||||
shuoming = models.CharField(max_length=100, null=True, blank=True, verbose_name='订单说明')
|
||||
fenhong = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='订单分红金额')
|
||||
avatar = models.CharField(max_length=500, null=True, blank=True, verbose_name='打手头像')
|
||||
nicheng = models.CharField(max_length=50, null=True, verbose_name='打手昵称')
|
||||
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
||||
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
|
||||
|
||||
zuzhang_id = models.CharField(max_length=7, null=True, blank=True, db_index=True, verbose_name='组长ID')
|
||||
zuzhang_fenhong = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True,verbose_name='组长分红金额')
|
||||
fenhong_leixing = models.PositiveSmallIntegerField(
|
||||
default=1,
|
||||
choices=[(1, '会员分红'), (2, '押金分红'), (3, '商家订单分红')],
|
||||
verbose_name='分红类型'
|
||||
)
|
||||
|
||||
huiyuan_id = models.CharField(max_length=6, null=True, blank=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 = 'gsfenhong'
|
||||
verbose_name = '管事分红记录'
|
||||
verbose_name_plural = '管事分红记录'
|
||||
# 为高频查询字段添加索引
|
||||
indexes = [
|
||||
models.Index(fields=['guanshi']),
|
||||
models.Index(fields=['dashouid']),
|
||||
|
||||
]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class DuociFenhong(models.Model):
|
||||
"""
|
||||
多次分红配置表
|
||||
用于配置不同次数下管事和组长的分红金额
|
||||
"""
|
||||
huiyuan = models.CharField(max_length=10, verbose_name='会员ID')
|
||||
yonghuid = models.CharField(max_length=7, db_index=True, verbose_name='管事ID')
|
||||
|
||||
cishu = models.PositiveIntegerField(verbose_name='分红次数')
|
||||
guanshi_fenhong = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='管事分红金额')
|
||||
zuzhang_fenhong = models.DecimalField(max_digits=10, 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='更新时间')
|
||||
|
||||
class Meta:
|
||||
db_table = 'duoci_fenhong'
|
||||
verbose_name = '多次分红配置'
|
||||
verbose_name_plural = '多次分红配置'
|
||||
unique_together = ('huiyuan', 'yonghuid', 'cishu') # 同一管事、同一会员、同一次数唯一
|
||||
indexes = [
|
||||
models.Index(fields=['yonghuid']),
|
||||
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"会员{self.huiyuan_id} 用户{self.yonghuid} 次数{self.cishu}"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class ShangpinMeiriTongji(models.Model):
|
||||
"""
|
||||
商品每日统计表
|
||||
按商品 + 日期维度记录点单、成交、退款及收益数据
|
||||
日期精确到天,冗余年月日字段便于分组查询
|
||||
"""
|
||||
shangpin = models.ForeignKey(
|
||||
'shangpin.Shangpin',
|
||||
on_delete=models.CASCADE,
|
||||
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='日')
|
||||
|
||||
# 点单统计(下单即累加)
|
||||
diandan_zongliang = models.PositiveIntegerField(default=0, verbose_name='点单总量')
|
||||
diandan_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='退款总额')
|
||||
|
||||
# 收益统计(新增)
|
||||
pingtai_shouyi = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='平台收益')
|
||||
dianpu_zongshouyi = 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='更新时间')
|
||||
|
||||
class Meta:
|
||||
db_table = 'shangpin_meiri_tongji'
|
||||
verbose_name = '商品每日统计'
|
||||
verbose_name_plural = verbose_name
|
||||
# 每天每个商品唯一记录
|
||||
unique_together = [['shangpin', 'riqi']]
|
||||
indexes = [
|
||||
models.Index(fields=['shangpin', 'riqi']),
|
||||
models.Index(fields=['nian', 'yue', 'ri']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.shangpin.biaoqian} - {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)
|
||||
3
products/tests.py
Normal file
3
products/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
73
products/urls.py
Normal file
73
products/urls.py
Normal file
@@ -0,0 +1,73 @@
|
||||
# shangpin/urls.py
|
||||
from django.urls import path
|
||||
from django.views.decorators.csrf import csrf_exempt
|
||||
from .views import ShangpinHuoquView, ShangpinXiangqingHuoquView, DashouHuiyuanList, \
|
||||
YajinGoumai, YajinHuitiao, YajinShibai, YajinLunxun, JifenBuchong, JifenHuitiao, JifenShibai, \
|
||||
JifenLunxun, HuiyuanGoumai, HuiyuanHuitiao, HuiyuanShibai, HuiyuanLunxun, ShangjiaChenggong, \
|
||||
ShangjiaChongzhi, ShangjiaHuitiao, ShangjiaShibai, GuanshiFenhongListAPI, AdGetAllDataView, ShangpinLeixingFabuView, \
|
||||
ShangpinZhuanquFabuView, ShangpinFabuView, GuizeTupianShangchuanView, AdHuiyuanHqView, HuiyuanXiugaiView, \
|
||||
AdHuiyuanFbView, AdShangpinHuQu, AdLeixingXiuGai, AdLunboXiuGai, AdZhuanquXiuGai, AdGonggaoXiuGai, \
|
||||
AdShangpinGuizeXiuGai, AdShangpinXiuGai, AdShangpinNeiRongHuoQu,\
|
||||
HuiyuanTypeListView, HuiyuanRecordListView, ZuzhangFenhongView, CzhqdyView, DsqrgmdhView
|
||||
|
||||
urlpatterns = [
|
||||
#path('shangpinhuoqu/', ShangpinHuoquView.as_view(), name='获取商品数据商品类型和专区'),
|
||||
path('xiangqinghuoqu/', ShangpinXiangqingHuoquView.as_view(), name='获取商品详情数据'),
|
||||
path('dshyhq', DashouHuiyuanList.as_view(), name='打手充值获取会员信息'),
|
||||
path('yajingoumai', YajinGoumai.as_view(), name='打手购买押金'),
|
||||
#path('yajinhuitiao', YajinHuitiao.as_view(), name='押金支付回调'),
|
||||
path('yajinhuitiao', csrf_exempt(YajinHuitiao.as_view()), name='押金支付回调'),
|
||||
path('yajinshibai', YajinShibai.as_view(), name='押金支付失败'),
|
||||
path('yajinlunxun', YajinLunxun.as_view(), name='押金支付轮询'),
|
||||
# 积分相关接口
|
||||
path('jifenbc', JifenBuchong.as_view(), name='积分补充参数生成'),
|
||||
#path('jifenhuitiao', JifenHuitiao.as_view(), name='积分充值回调'),
|
||||
path('jifenhuitiao', csrf_exempt(JifenHuitiao.as_view()), name='积分充值回调'),
|
||||
path('jifenshibai', JifenShibai.as_view(), name='积分支付失败'),
|
||||
path('jifenlunxun', JifenLunxun.as_view(), name='积分支付轮询'),
|
||||
|
||||
# 会员相关接口
|
||||
path('huiyuangm', HuiyuanGoumai.as_view(), name='会员购买参数生成'),
|
||||
#path('huiyuanhuitiao', HuiyuanHuitiao.as_view(), name='会员支付回调'),
|
||||
path('huiyuanhuitiao', csrf_exempt(HuiyuanHuitiao.as_view()), name='会员支付回调'),
|
||||
path('huiyuanshibai', HuiyuanShibai.as_view(), name='会员支付失败'),
|
||||
path('huiyuanlx', HuiyuanLunxun.as_view(), name='会员支付轮询'),
|
||||
path('sjcz', ShangjiaChongzhi.as_view(), name='商家充值支付参数获取'), # 商家充值支付参数
|
||||
path('sjhuitiao', csrf_exempt(ShangjiaHuitiao.as_view()), name='商家支付官方回调'),
|
||||
#path('sjhuitiao', ShangjiaHuitiao.as_view(), name='商家支付官方回调'), # 商家支付回调
|
||||
path('sjshibai', ShangjiaShibai.as_view(), name='商家支付失败'), # 商家支付失败处理
|
||||
path('sjcg', ShangjiaChenggong.as_view(), name='商家支付成功'), # 商家支付成功轮询
|
||||
path('fenhonghq', GuanshiFenhongListAPI.as_view(), name='管事获取打手充值记录'),
|
||||
path('adhqlx', AdGetAllDataView.as_view(), name='管理员获取商品类型会员类型专区类型'),
|
||||
path('leixingfabu', ShangpinLeixingFabuView.as_view(), name='添加商品类型'),
|
||||
# 商品专区相关接口
|
||||
path('zhuanqufabu', ShangpinZhuanquFabuView.as_view(), name='添加商品专区'),
|
||||
# 商品发布相关接口
|
||||
path('shangpinsc', ShangpinFabuView.as_view(), name='商品发布'),
|
||||
# 规则图片上传接口
|
||||
path('guizesc', GuizeTupianShangchuanView.as_view(), name='发布商品规则'),
|
||||
path('adhuiyuanhq', AdHuiyuanHqView.as_view(), name='管理员获取会员信息'),
|
||||
path('huiyuanxiugai', HuiyuanXiugaiView.as_view(), name='修改会员信息'), # 修改会员
|
||||
path('adhuiyuanfb', AdHuiyuanFbView.as_view(), name='发布会员'), # 发布会员
|
||||
path('adsphq', AdShangpinHuQu.as_view(), name='管理员商品管理页面数据获取'),
|
||||
path('adggxg', AdGonggaoXiuGai.as_view(), name='管理员公告修改'),
|
||||
path('adzqxg', AdZhuanquXiuGai.as_view(), name='管理员专区修改'),
|
||||
path('adlunboxg', AdLunboXiuGai.as_view(), name='管理员轮播图修改'),
|
||||
path('adleixingxg', AdLeixingXiuGai.as_view(), name='管理员商品类型修改'),
|
||||
path('adspnrhq', AdShangpinNeiRongHuoQu.as_view(), name='管理员商品详情获取'),
|
||||
|
||||
# 2. 更改商品数据接口(修改/删除)
|
||||
path('adspxqxg',AdShangpinXiuGai.as_view(), name='管理员商品详情修改'),
|
||||
|
||||
# 3. 规则图片更换接口
|
||||
path('adspgzxg',AdShangpinGuizeXiuGai.as_view(), name='管理员商品规则修改'),
|
||||
path('adhyjllxcx',HuiyuanTypeListView.as_view(), name='管理员查询会员记录获取会员类型'),
|
||||
path('adhyjlcxhq',HuiyuanRecordListView.as_view(), name='管理员查询会员记录'),
|
||||
|
||||
|
||||
|
||||
path('zuzhangfenhong', ZuzhangFenhongView.as_view(), name='组长分红记录获取'),
|
||||
path('czhqdy', CzhqdyView.as_view(), name='充值打手抵押查询'),
|
||||
path('dsqrgmdh', DsqrgmdhView.as_view(), name='充值抵扣'),
|
||||
|
||||
]
|
||||
113
products/utils.py
Normal file
113
products/utils.py
Normal file
@@ -0,0 +1,113 @@
|
||||
# tongji/utils.py 或 shangpin/utils.py
|
||||
|
||||
import logging
|
||||
from datetime import date
|
||||
from decimal import Decimal
|
||||
from django.db import transaction
|
||||
from django.db.models import F
|
||||
from .models import ShangpinMeiriTongji
|
||||
from products.models import Shangpin
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def update_shangpin_daily_stat(
|
||||
shangpin_id,
|
||||
caozuo_leixing,
|
||||
dingdan_jiage=Decimal('0.00'),
|
||||
pingtai_shouyi=Decimal('0.00'),
|
||||
dianpu_zongshouyi=Decimal('0.00')
|
||||
):
|
||||
"""
|
||||
原子更新商品每日统计数据(高并发安全,无店铺关联)
|
||||
|
||||
参数:
|
||||
shangpin_id: 商品ID (int)
|
||||
caozuo_leixing: 操作类型
|
||||
1 = 下单(点单)
|
||||
2 = 结算(成交)
|
||||
3 = 退款
|
||||
dingdan_jiage: 订单金额(商品价格),默认0.00
|
||||
pingtai_shouyi: 平台收益金额,默认0.00
|
||||
dianpu_zongshouyi: 店铺总收益金额,默认0.00
|
||||
|
||||
注意:
|
||||
- 金额若小于0则自动设为0
|
||||
- 日期自动取当天
|
||||
- 使用 select_for_update 配合事务,保证并发时数据绝对准确
|
||||
- 若商品不存在,仅记录日志不中断主流程
|
||||
"""
|
||||
# 参数归一化与合法性处理
|
||||
dingdan_jiage = Decimal(str(dingdan_jiage)) if dingdan_jiage else Decimal('0.00')
|
||||
pingtai_shouyi = Decimal(str(pingtai_shouyi)) if pingtai_shouyi else Decimal('0.00')
|
||||
dianpu_zongshouyi = Decimal(str(dianpu_zongshouyi)) if dianpu_zongshouyi else Decimal('0.00')
|
||||
|
||||
if dingdan_jiage < 0:
|
||||
dingdan_jiage = Decimal('0.00')
|
||||
if pingtai_shouyi < 0:
|
||||
pingtai_shouyi = Decimal('0.00')
|
||||
if dianpu_zongshouyi < 0:
|
||||
dianpu_zongshouyi = Decimal('0.00')
|
||||
|
||||
today = date.today()
|
||||
|
||||
# 校验商品是否存在(不加锁,仅校验)
|
||||
if not Shangpin.objects.filter(id=shangpin_id).exists():
|
||||
logger.error(f"商品ID {shangpin_id} 不存在,统计更新失败")
|
||||
return
|
||||
|
||||
# 开启事务,使用行锁确保并发安全
|
||||
with transaction.atomic():
|
||||
# 获取或创建统计记录,并锁定该行
|
||||
tongji, created = ShangpinMeiriTongji.objects.select_for_update().get_or_create(
|
||||
shangpin_id=shangpin_id,
|
||||
riqi=today,
|
||||
defaults={
|
||||
'nian': today.year,
|
||||
'yue': today.month,
|
||||
'ri': today.day,
|
||||
'diandan_zongliang': 0,
|
||||
'diandan_zonge': Decimal('0.00'),
|
||||
'chengjiao_zongliang': 0,
|
||||
'chengjiao_zonge': Decimal('0.00'),
|
||||
'tuikuan_zongliang': 0,
|
||||
'tuikuan_zonge': Decimal('0.00'),
|
||||
'pingtai_shouyi': Decimal('0.00'),
|
||||
'dianpu_zongshouyi': Decimal('0.00'),
|
||||
}
|
||||
)
|
||||
|
||||
# 根据操作类型构建更新字段(使用 F 表达式累加)
|
||||
update_fields = {}
|
||||
|
||||
if caozuo_leixing == 1: # 下单
|
||||
update_fields['diandan_zongliang'] = F('diandan_zongliang') + 1
|
||||
update_fields['diandan_zonge'] = F('diandan_zonge') + dingdan_jiage
|
||||
|
||||
elif caozuo_leixing == 2: # 结算(成交)
|
||||
update_fields['chengjiao_zongliang'] = F('chengjiao_zongliang') + 1
|
||||
update_fields['chengjiao_zonge'] = F('chengjiao_zonge') + dingdan_jiage
|
||||
# 收益直接累加传入值
|
||||
update_fields['pingtai_shouyi'] = F('pingtai_shouyi') + pingtai_shouyi
|
||||
update_fields['dianpu_zongshouyi'] = F('dianpu_zongshouyi') + dianpu_zongshouyi
|
||||
|
||||
elif caozuo_leixing == 3: # 退款
|
||||
update_fields['tuikuan_zongliang'] = F('tuikuan_zongliang') + 1
|
||||
update_fields['tuikuan_zonge'] = F('tuikuan_zonge') + dingdan_jiage
|
||||
# 退款是否应扣减收益?根据业务需求决定,此处暂不处理收益字段
|
||||
|
||||
else:
|
||||
logger.warning(f"未知的操作类型: {caozuo_leixing}")
|
||||
return
|
||||
|
||||
# 原子更新字段
|
||||
if update_fields:
|
||||
for field, value in update_fields.items():
|
||||
setattr(tongji, field, value)
|
||||
tongji.save(update_fields=list(update_fields.keys()))
|
||||
|
||||
logger.info(
|
||||
f"商品统计更新: 商品ID={shangpin_id}, 操作类型={caozuo_leixing}, "
|
||||
f"订单金额={dingdan_jiage}, 平台收益={pingtai_shouyi}, "
|
||||
f"店铺收益={dianpu_zongshouyi}, 日期={today}"
|
||||
)
|
||||
6403
products/views.py
Normal file
6403
products/views.py
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user