第一次提交:小程序前端最新版本
This commit is contained in:
0
shangpin/__init__.py
Normal file
0
shangpin/__init__.py
Normal file
BIN
shangpin/__pycache__/__init__.cpython-313.pyc
Normal file
BIN
shangpin/__pycache__/__init__.cpython-313.pyc
Normal file
Binary file not shown.
BIN
shangpin/__pycache__/admin.cpython-313.pyc
Normal file
BIN
shangpin/__pycache__/admin.cpython-313.pyc
Normal file
Binary file not shown.
BIN
shangpin/__pycache__/apps.cpython-313.pyc
Normal file
BIN
shangpin/__pycache__/apps.cpython-313.pyc
Normal file
Binary file not shown.
BIN
shangpin/__pycache__/models.cpython-313.pyc
Normal file
BIN
shangpin/__pycache__/models.cpython-313.pyc
Normal file
Binary file not shown.
BIN
shangpin/__pycache__/urls.cpython-313.pyc
Normal file
BIN
shangpin/__pycache__/urls.cpython-313.pyc
Normal file
Binary file not shown.
BIN
shangpin/__pycache__/utils.cpython-313.pyc
Normal file
BIN
shangpin/__pycache__/utils.cpython-313.pyc
Normal file
Binary file not shown.
BIN
shangpin/__pycache__/views.cpython-313.pyc
Normal file
BIN
shangpin/__pycache__/views.cpython-313.pyc
Normal file
Binary file not shown.
3
shangpin/admin.py
Normal file
3
shangpin/admin.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
5
shangpin/apps.py
Normal file
5
shangpin/apps.py
Normal file
@@ -0,0 +1,5 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class ShangpinConfig(AppConfig):
|
||||
name = "shangpin"
|
||||
86
shangpin/migrations/0001_initial.py
Normal file
86
shangpin/migrations/0001_initial.py
Normal file
@@ -0,0 +1,86 @@
|
||||
# Generated by Django 6.0 on 2025-12-20 23:54
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = []
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name="Shangpin",
|
||||
fields=[
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
primary_key=True, serialize=False, verbose_name="商品ID"
|
||||
),
|
||||
),
|
||||
(
|
||||
"jiage",
|
||||
models.DecimalField(
|
||||
decimal_places=2,
|
||||
default=0.0,
|
||||
max_digits=10,
|
||||
verbose_name="商品价格",
|
||||
),
|
||||
),
|
||||
(
|
||||
"kucun",
|
||||
models.PositiveIntegerField(default=0, verbose_name="商品库存"),
|
||||
),
|
||||
(
|
||||
"leixing",
|
||||
models.PositiveIntegerField(
|
||||
blank=True, null=True, verbose_name="商品类型"
|
||||
),
|
||||
),
|
||||
(
|
||||
"zhuanqu",
|
||||
models.PositiveIntegerField(
|
||||
blank=True, null=True, verbose_name="商品专区"
|
||||
),
|
||||
),
|
||||
(
|
||||
"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="商品介绍"),
|
||||
),
|
||||
(
|
||||
"tupian_url",
|
||||
models.URLField(blank=True, 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",
|
||||
"indexes": [
|
||||
models.Index(
|
||||
fields=["leixing"], name="shangpin_leixing_d19864_idx"
|
||||
),
|
||||
models.Index(
|
||||
fields=["zhuanqu"], name="shangpin_zhuanqu_9fdc1b_idx"
|
||||
),
|
||||
],
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,123 @@
|
||||
# Generated by Django 6.0 on 2025-12-21 18:48
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("shangpin", "0001_initial"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name="ShangpinLeixing",
|
||||
fields=[
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
primary_key=True, serialize=False, verbose_name="类型ID"
|
||||
),
|
||||
),
|
||||
(
|
||||
"jieshao",
|
||||
models.CharField(
|
||||
max_length=45, unique=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(
|
||||
max_length=45, unique=True, verbose_name="专区名称"
|
||||
),
|
||||
),
|
||||
("leixing_id", models.PositiveIntegerField(verbose_name="类型ID")),
|
||||
],
|
||||
options={
|
||||
"verbose_name": "商品专区",
|
||||
"verbose_name_plural": "商品专区",
|
||||
"db_table": "shangpin_zhuanqu",
|
||||
},
|
||||
),
|
||||
migrations.RemoveIndex(
|
||||
model_name="shangpin",
|
||||
name="shangpin_leixing_d19864_idx",
|
||||
),
|
||||
migrations.RemoveIndex(
|
||||
model_name="shangpin",
|
||||
name="shangpin_zhuanqu_9fdc1b_idx",
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="shangpin",
|
||||
name="biaoqian",
|
||||
field=models.CharField(
|
||||
blank=True, max_length=45, null=True, verbose_name="商品标题"
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="shangpin",
|
||||
name="guize_tupian",
|
||||
field=models.CharField(
|
||||
blank=True, max_length=500, null=True, verbose_name="规则图片URL"
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="shangpin",
|
||||
name="leixing_id",
|
||||
field=models.PositiveIntegerField(
|
||||
blank=True, null=True, verbose_name="商品类型ID"
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="shangpin",
|
||||
name="xiadan_xuzhi",
|
||||
field=models.TextField(blank=True, null=True, verbose_name="下单须知"),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="shangpin",
|
||||
name="zhuanqu_id",
|
||||
field=models.PositiveIntegerField(
|
||||
blank=True, null=True, verbose_name="商品专区ID"
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="shangpin",
|
||||
name="tupian_url",
|
||||
field=models.CharField(
|
||||
blank=True, max_length=500, null=True, verbose_name="商品图片URL"
|
||||
),
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name="shangpin",
|
||||
name="leixing",
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name="shangpin",
|
||||
name="zhuanqu",
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,27 @@
|
||||
# Generated by Django 6.0 on 2025-12-21 23:31
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("shangpin", "0002_shangpinleixing_shangpinzhuanqu_and_more"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name="shangpinleixing",
|
||||
name="jieshao",
|
||||
field=models.CharField(
|
||||
blank=True, max_length=45, null=True, verbose_name="类型介绍"
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="shangpinzhuanqu",
|
||||
name="mingzi",
|
||||
field=models.CharField(
|
||||
blank=True, max_length=45, null=True, verbose_name="专区名称"
|
||||
),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,124 @@
|
||||
# Generated by Django 6.0 on 2025-12-23 21:02
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("shangpin", "0003_alter_shangpinleixing_jieshao_and_more"),
|
||||
]
|
||||
|
||||
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="会员介绍")),
|
||||
(
|
||||
"jiage",
|
||||
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="会员状态"),
|
||||
),
|
||||
("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.AddField(
|
||||
model_name="shangpin",
|
||||
name="huiyuan_id",
|
||||
field=models.CharField(
|
||||
blank=True, max_length=6, null=True, verbose_name="会员ID"
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="shangpin",
|
||||
name="yaoqiuleixing",
|
||||
field=models.PositiveIntegerField(
|
||||
blank=True, null=True, verbose_name="抢单要求类型"
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="shangpin",
|
||||
name="yongjin",
|
||||
field=models.DecimalField(
|
||||
blank=True,
|
||||
decimal_places=2,
|
||||
max_digits=10,
|
||||
null=True,
|
||||
verbose_name="佣金要求",
|
||||
),
|
||||
),
|
||||
]
|
||||
18
shangpin/migrations/0005_huiyuangoumai_jieshao.py
Normal file
18
shangpin/migrations/0005_huiyuangoumai_jieshao.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 6.0 on 2025-12-27 22:17
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("shangpin", "0004_huiyuan_huiyuangoumai_shangpin_huiyuan_id_and_more"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name="huiyuangoumai",
|
||||
name="jieshao",
|
||||
field=models.CharField(max_length=30, null=True, verbose_name="会员介绍"),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,38 @@
|
||||
# Generated by Django 6.0 on 2025-12-29 20:01
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("shangpin", "0005_huiyuangoumai_jieshao"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name="shangpinleixing",
|
||||
name="huiyuan_id",
|
||||
field=models.CharField(
|
||||
blank=True, max_length=6, null=True, verbose_name="会员ID"
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="shangpinleixing",
|
||||
name="yaoqiuleixing",
|
||||
field=models.PositiveIntegerField(
|
||||
blank=True, null=True, verbose_name="抢单要求类型"
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="shangpinleixing",
|
||||
name="yongjin",
|
||||
field=models.DecimalField(
|
||||
blank=True,
|
||||
decimal_places=2,
|
||||
max_digits=10,
|
||||
null=True,
|
||||
verbose_name="佣金要求",
|
||||
),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,173 @@
|
||||
# Generated by Django 6.0 on 2026-01-06 23:40
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("shangpin", "0006_shangpinleixing_huiyuan_id_and_more"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name="huiyuan",
|
||||
name="guanshifc",
|
||||
field=models.DecimalField(
|
||||
decimal_places=2, default=0.0, max_digits=10, verbose_name="管事分成"
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="huiyuan",
|
||||
name="jtjieshao",
|
||||
field=models.TextField(blank=True, null=True, verbose_name="会员规则介绍"),
|
||||
),
|
||||
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,36 @@
|
||||
# Generated by Django 4.2.27 on 2026-01-20 15:52
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("shangpin", "0007_huiyuan_guanshifc_huiyuan_jtjieshao_czjilu_gsfenhong"),
|
||||
]
|
||||
|
||||
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,20 @@
|
||||
# Generated by Django 4.2.27 on 2026-01-25 20:26
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("shangpin", "0008_alter_huiyuangoumai_unique_together_and_more"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name="shangpinleixing",
|
||||
name="yaoqiuleixing",
|
||||
field=models.PositiveIntegerField(
|
||||
blank=True, null=True, verbose_name="抢单要求类型1:会员2:佣金"
|
||||
),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,35 @@
|
||||
# Generated by Django 4.2.27 on 2026-02-07 13:12
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("shangpin", "0009_alter_shangpinleixing_yaoqiuleixing"),
|
||||
]
|
||||
|
||||
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,27 @@
|
||||
# Generated by Django 4.2.27 on 2026-02-09 16:15
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("shangpin", "0010_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
shangpin/migrations/0012_alter_gsfenhong_dashouid.py
Normal file
18
shangpin/migrations/0012_alter_gsfenhong_dashouid.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 4.2.27 on 2026-03-01 23:48
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("shangpin", "0011_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,129 @@
|
||||
# Generated by Django 4.2.27 on 2026-03-18 21:00
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("shangpin", "0012_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="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",
|
||||
),
|
||||
),
|
||||
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,74 @@
|
||||
# Generated by Django 4.2.27 on 2026-03-22 22:09
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("shangpin", "0013_gsfenhong_huiyuan_id_gsfenhong_zuzhang_fenhong_and_more"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveIndex(
|
||||
model_name="duocifenhong",
|
||||
name="duoci_fenho_guanshi_b3de53_idx",
|
||||
),
|
||||
migrations.RemoveIndex(
|
||||
model_name="duocifenhong",
|
||||
name="duoci_fenho_zuzhang_69997d_idx",
|
||||
),
|
||||
migrations.AlterUniqueTogether(
|
||||
name="duocifenhong",
|
||||
unique_together=set(),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="duocifenhong",
|
||||
name="yonghuid",
|
||||
field=models.CharField(
|
||||
db_index=True, default=123, max_length=7, verbose_name="用户ID"
|
||||
),
|
||||
preserve_default=False,
|
||||
),
|
||||
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="是否开启打手额外分成"
|
||||
),
|
||||
),
|
||||
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="guanshi",
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name="duocifenhong",
|
||||
name="zuzhang",
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,28 @@
|
||||
# Generated by Django 4.2.27 on 2026-03-30 12:18
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
(
|
||||
"shangpin",
|
||||
"0014_remove_duocifenhong_duoci_fenho_guanshi_b3de53_idx_and_more",
|
||||
),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name="shangpinleixing",
|
||||
name="is_cross_enabled",
|
||||
field=models.BooleanField(default=False, verbose_name="是否开启平台互通"),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="shangpin",
|
||||
name="yaoqiuleixing",
|
||||
field=models.PositiveIntegerField(
|
||||
blank=True, null=True, verbose_name="抢单要求类型1:会员2:佣金"
|
||||
),
|
||||
),
|
||||
]
|
||||
22
shangpin/migrations/0016_gsfenhong_fenhong_leixing.py
Normal file
22
shangpin/migrations/0016_gsfenhong_fenhong_leixing.py
Normal file
@@ -0,0 +1,22 @@
|
||||
# Generated by Django 4.2.27 on 2026-06-07
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("shangpin", "0015_shangpinleixing_is_cross_enabled_and_more"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name="gsfenhong",
|
||||
name="fenhong_leixing",
|
||||
field=models.PositiveSmallIntegerField(
|
||||
choices=[(1, "会员分红"), (2, "押金分红"), (3, "商家订单分红")],
|
||||
default=1,
|
||||
verbose_name="分红类型",
|
||||
),
|
||||
),
|
||||
]
|
||||
0
shangpin/migrations/__init__.py
Normal file
0
shangpin/migrations/__init__.py
Normal file
BIN
shangpin/migrations/__pycache__/0001_initial.cpython-313.pyc
Normal file
BIN
shangpin/migrations/__pycache__/0001_initial.cpython-313.pyc
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
shangpin/migrations/__pycache__/__init__.cpython-313.pyc
Normal file
BIN
shangpin/migrations/__pycache__/__init__.cpython-313.pyc
Normal file
Binary file not shown.
364
shangpin/models.py
Normal file
364
shangpin/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='抢单要求类型1:会员2:佣金')
|
||||
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='佣金要求')
|
||||
|
||||
# 原有图片URL
|
||||
tupian_url = models.CharField(max_length=500, null=True, blank=True, verbose_name='商品图片URL')
|
||||
|
||||
# 🔥 新增:是否开启打手额外分成
|
||||
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='打手额外分成金额')
|
||||
|
||||
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='抢单要求类型1:会员2:佣金')
|
||||
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='是否开启平台互通')
|
||||
# 🔴 新增:是否特殊商品类型
|
||||
is_special_type = models.BooleanField(default=False, verbose_name='是否特殊商品类型')
|
||||
|
||||
paixu = models.IntegerField(default=0, verbose_name='排序权重')
|
||||
shenhezhuangtai = models.IntegerField(default=1, verbose_name='审核状态', help_text='1=正常, 2=审核专用')
|
||||
|
||||
# 在 ShangpinLeixing 类中添加
|
||||
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='管事分成')
|
||||
goumai_cishu = models.PositiveIntegerField(default=0, verbose_name='购买次数')
|
||||
zuzhangfc = 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='更新时间')
|
||||
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='打手昵称')
|
||||
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='组长分红金额')
|
||||
huiyuan_id = models.CharField(max_length=6, null=True, blank=True, verbose_name='会员ID')
|
||||
fenhong_leixing = models.PositiveSmallIntegerField(
|
||||
default=1,
|
||||
choices=[(1, '会员分红'), (2, '押金分红'), (3, '商家订单分红')],
|
||||
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 = '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
shangpin/tests.py
Normal file
3
shangpin/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
70
shangpin/urls.py
Normal file
70
shangpin/urls.py
Normal file
@@ -0,0 +1,70 @@
|
||||
# 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, \
|
||||
AdLeixingPaixuXiuGai, 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', csrf_exempt(YajinHuitiao.as_view()), name='押金支付回调'),
|
||||
#path('yajinhuitiao', 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', ShangjiaHuitiao.as_view(), name='商家支付官方回调'), # 商家支付回调
|
||||
path('sjhuitiao', csrf_exempt(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('adleixingpaixuxg', AdLeixingPaixuXiuGai.as_view(), name='商品类型排序修改'),
|
||||
path('zuzhangfenhong', ZuzhangFenhongView.as_view(), name='组长分红记录获取'),
|
||||
path('czhqdy', CzhqdyView.as_view(), name='充值打手抵押查询'),
|
||||
path('dsqrgmdh', DsqrgmdhView.as_view(), name='充值抵扣'),
|
||||
]
|
||||
113
shangpin/utils.py
Normal file
113
shangpin/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 shangpin.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}"
|
||||
)
|
||||
8724
shangpin/views.py
Normal file
8724
shangpin/views.py
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user