彻底解决了 create_time 的问题,将所有字段都改为了 CreateTime
This commit is contained in:
@@ -28,7 +28,7 @@ class Migration(migrations.Migration):
|
||||
('request_headers', models.TextField(blank=True, default='', verbose_name='请求头(JSON格式)')),
|
||||
('attempt_type', models.CharField(blank=True, default='', max_length=50, verbose_name='攻击类型')),
|
||||
('detail', models.TextField(blank=True, default='', verbose_name='详细描述')),
|
||||
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('CreateTime', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '异常用户日志',
|
||||
@@ -105,8 +105,8 @@ class Migration(migrations.Migration):
|
||||
('perm_code', models.CharField(db_index=True, max_length=100, unique=True, verbose_name='权限编码')),
|
||||
('perm_name', models.CharField(max_length=100, verbose_name='权限名称')),
|
||||
('description', models.CharField(blank=True, default='', max_length=200, verbose_name='权限描述')),
|
||||
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
|
||||
('CreateTime', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('UpdateTime', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '权限',
|
||||
@@ -140,8 +140,8 @@ class Migration(migrations.Migration):
|
||||
('role_code', models.CharField(db_index=True, max_length=50, unique=True, verbose_name='角色编码')),
|
||||
('role_name', models.CharField(max_length=50, verbose_name='角色名称')),
|
||||
('description', models.CharField(blank=True, default='', max_length=200, verbose_name='角色描述')),
|
||||
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
|
||||
('CreateTime', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('UpdateTime', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '角色',
|
||||
@@ -170,8 +170,8 @@ class Migration(migrations.Migration):
|
||||
fields=[
|
||||
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||
('account_id', models.CharField(db_index=True, max_length=11, verbose_name='账号ID')),
|
||||
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
|
||||
('CreateTime', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('UpdateTime', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
|
||||
('role', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='backend.role', verbose_name='角色')),
|
||||
],
|
||||
options={
|
||||
@@ -185,7 +185,7 @@ class Migration(migrations.Migration):
|
||||
name='RolePermission',
|
||||
fields=[
|
||||
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('CreateTime', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
|
||||
('permission', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='backend.permission', verbose_name='权限')),
|
||||
('role', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='backend.role', verbose_name='角色')),
|
||||
],
|
||||
@@ -290,7 +290,7 @@ class Migration(migrations.Migration):
|
||||
),
|
||||
migrations.AddIndex(
|
||||
model_name='abnormaluserlog',
|
||||
index=models.Index(fields=['create_time'], name='abnormal_us_create__ee16da_idx'),
|
||||
index=models.Index(fields=['CreateTime'], name='abnormal_us_create__ee16da_idx'),
|
||||
),
|
||||
migrations.AlterUniqueTogether(
|
||||
name='userrole',
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 4.2.27 on 2026-06-19 19:15
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('backend', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RenameIndex(
|
||||
model_name='abnormaluserlog',
|
||||
new_name='abnormal_us_CreateT_38f96c_idx',
|
||||
old_name='abnormal_us_create__ee16da_idx',
|
||||
),
|
||||
]
|
||||
@@ -1,324 +1,324 @@
|
||||
from django.db import models
|
||||
from gvsdsdk.model_base import QModel
|
||||
|
||||
|
||||
# ==================== 1. 角色表 ====================
|
||||
class Role(QModel):
|
||||
"""角色表"""
|
||||
role_id = models.AutoField(primary_key=True, verbose_name='角色ID')
|
||||
role_code = models.CharField(max_length=50, unique=True, db_index=True, verbose_name='角色编码')
|
||||
role_name = models.CharField(max_length=50, verbose_name='角色名称')
|
||||
description = models.CharField(max_length=200, blank=True, default='', 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 = 'role'
|
||||
verbose_name = '角色'
|
||||
verbose_name_plural = '角色'
|
||||
managed = True
|
||||
indexes = [
|
||||
models.Index(fields=['role_code']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return self.role_name
|
||||
|
||||
|
||||
# ==================== 2. 权限表 ====================
|
||||
class Permission(QModel):
|
||||
"""权限表"""
|
||||
perm_id = models.AutoField(primary_key=True, verbose_name='权限ID')
|
||||
perm_code = models.CharField(max_length=100, unique=True, db_index=True, verbose_name='权限编码')
|
||||
perm_name = models.CharField(max_length=100, verbose_name='权限名称')
|
||||
description = models.CharField(max_length=200, blank=True, default='', 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 = 'permission'
|
||||
verbose_name = '权限'
|
||||
verbose_name_plural = '权限'
|
||||
managed = True
|
||||
indexes = [
|
||||
models.Index(fields=['perm_code']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.perm_name} ({self.perm_code})"
|
||||
|
||||
|
||||
# ==================== 3. 角色-权限关联表 ====================
|
||||
class RolePermission(QModel):
|
||||
"""角色权限关联表"""
|
||||
id = models.AutoField(primary_key=True)
|
||||
role = models.ForeignKey(Role, on_delete=models.CASCADE, db_index=True, verbose_name='角色')
|
||||
permission = models.ForeignKey(Permission, on_delete=models.CASCADE, db_index=True, verbose_name='权限')
|
||||
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
||||
|
||||
class Meta:
|
||||
db_table = 'role_permission'
|
||||
verbose_name = '角色权限关联'
|
||||
verbose_name_plural = '角色权限关联'
|
||||
managed = True
|
||||
unique_together = [['role', 'permission']]
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.role.role_name} -> {self.permission.perm_name}"
|
||||
|
||||
|
||||
# ==================== 4. 用户-角色关联表 ====================
|
||||
class UserRole(QModel):
|
||||
"""用户角色关联表"""
|
||||
id = models.AutoField(primary_key=True)
|
||||
account_id = models.CharField(max_length=11, db_index=True, verbose_name='账号ID')
|
||||
role = models.ForeignKey(Role, on_delete=models.CASCADE, db_index=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 = 'user_role'
|
||||
verbose_name = '用户角色关联'
|
||||
verbose_name_plural = '用户角色关联'
|
||||
managed = True
|
||||
unique_together = [['account_id', 'role']]
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.account_id} -> {self.role.role_name}"
|
||||
|
||||
|
||||
# ==================== 5. 异常用户日志 ====================
|
||||
class AbnormalUserLog(QModel):
|
||||
"""记录恶意尝试越权操作的用户信息"""
|
||||
account_id = models.CharField(max_length=20, db_index=True, verbose_name='账号ID(phone)')
|
||||
ip_address = models.GenericIPAddressField(null=True, blank=True, verbose_name='IP地址')
|
||||
real_ip = models.GenericIPAddressField(null=True, blank=True, verbose_name='真实IP(穿透代理后)')
|
||||
x_forwarded_for = models.CharField(max_length=255, blank=True, default='', verbose_name='X-Forwarded-For')
|
||||
user_agent = models.CharField(max_length=500, blank=True, default='', verbose_name='User-Agent')
|
||||
request_method = models.CharField(max_length=10, blank=True, default='', verbose_name='请求方法')
|
||||
request_path = models.CharField(max_length=500, blank=True, default='', verbose_name='请求路径')
|
||||
request_params = models.TextField(blank=True, default='', verbose_name='请求参数(GET/POST)')
|
||||
request_body = models.TextField(blank=True, default='', verbose_name='请求体(原始)')
|
||||
request_headers = models.TextField(blank=True, default='', verbose_name='请求头(JSON格式)')
|
||||
attempt_type = models.CharField(max_length=50, blank=True, default='', verbose_name='攻击类型')
|
||||
detail = models.TextField(blank=True, default='', verbose_name='详细描述')
|
||||
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
||||
|
||||
class Meta:
|
||||
db_table = 'abnormal_user_log'
|
||||
verbose_name = '异常用户日志'
|
||||
verbose_name_plural = verbose_name
|
||||
indexes = [
|
||||
models.Index(fields=['account_id']),
|
||||
models.Index(fields=['ip_address']),
|
||||
models.Index(fields=['create_time']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.account_id} @ {self.ip_address} - {self.create_time}"
|
||||
|
||||
|
||||
# ==================== 6. 商家每日统计 ====================
|
||||
class MerchantDailyStats(QModel):
|
||||
"""商家每日统计表(原 ShangjiaRiTongji)"""
|
||||
MerchantID = models.CharField(
|
||||
max_length=7, db_index=True, db_column='yonghuid', verbose_name='商家用户ID')
|
||||
Date = models.DateField(
|
||||
db_index=True, db_column='riqi', verbose_name='日期')
|
||||
|
||||
# 派发统计
|
||||
AssignedOrderCount = models.IntegerField(
|
||||
default=0, db_column='paifa_dingdan_shu', verbose_name='派发订单总数')
|
||||
AssignedAmount = models.DecimalField(
|
||||
max_digits=12, decimal_places=2, default=0.00,
|
||||
db_column='paifa_jine', verbose_name='派发订单总金额')
|
||||
|
||||
# 结算统计
|
||||
SettledOrderCount = models.IntegerField(
|
||||
default=0, db_column='jiesuan_dingdan_shu', verbose_name='结算订单总数')
|
||||
SettledAmount = models.DecimalField(
|
||||
max_digits=12, decimal_places=2, default=0.00,
|
||||
db_column='jiesuan_jine', verbose_name='结算总金额')
|
||||
|
||||
# 退款统计
|
||||
RefundOrderCount = models.IntegerField(
|
||||
default=0, db_column='tuikuan_dingdan_shu', verbose_name='退款订单总数')
|
||||
RefundAmount = models.DecimalField(
|
||||
max_digits=12, decimal_places=2, default=0.00,
|
||||
db_column='tuikuan_jine', verbose_name='退款总金额')
|
||||
|
||||
class Meta:
|
||||
db_table = 'shangjia_ri_tongji'
|
||||
verbose_name = '商家每日统计'
|
||||
unique_together = [['MerchantID', 'Date']]
|
||||
indexes = [
|
||||
models.Index(fields=['Date', '-AssignedAmount']),
|
||||
models.Index(fields=['Date', '-SettledAmount']),
|
||||
models.Index(fields=['Date', '-AssignedOrderCount']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"商家{self.MerchantID} {self.Date}"
|
||||
|
||||
|
||||
# ==================== 7. 打手每日统计 ====================
|
||||
class PlayerDailyStats(QModel):
|
||||
"""打手每日统计表(原 DashouRiTongji)"""
|
||||
PlayerID = models.CharField(
|
||||
max_length=7, db_index=True, db_column='yonghuid', verbose_name='打手用户ID')
|
||||
Date = models.DateField(
|
||||
db_index=True, db_column='riqi', verbose_name='日期')
|
||||
|
||||
# 接单统计
|
||||
AcceptedOrderTotal = models.IntegerField(
|
||||
default=0, db_column='jiedan_zongliang', verbose_name='接单总量')
|
||||
CompletedOrderTotal = models.IntegerField(
|
||||
default=0, db_column='chengjiao_zongliang', verbose_name='成交单总量')
|
||||
|
||||
# 金额统计
|
||||
AcceptedAmount = models.DecimalField(
|
||||
max_digits=12, decimal_places=2, default=0.00,
|
||||
db_column='jiedan_zonge', verbose_name='接单总金额')
|
||||
CompletedAmount = models.DecimalField(
|
||||
max_digits=12, decimal_places=2, default=0.00,
|
||||
db_column='chengjiao_zonge', verbose_name='成交总金额')
|
||||
|
||||
# 退款统计
|
||||
RefundCount = models.IntegerField(
|
||||
default=0, db_column='tuikuan_liang', verbose_name='退款订单量')
|
||||
RefundAmount = models.DecimalField(
|
||||
max_digits=12, decimal_places=2, default=0.00,
|
||||
db_column='tuikuan_jine', verbose_name='退款总金额')
|
||||
|
||||
class Meta:
|
||||
db_table = 'dashou_ri_tongji'
|
||||
verbose_name = '打手每日统计'
|
||||
unique_together = [['PlayerID', 'Date']]
|
||||
indexes = [
|
||||
models.Index(fields=['Date', '-AcceptedOrderTotal']),
|
||||
models.Index(fields=['Date', '-CompletedOrderTotal']),
|
||||
models.Index(fields=['Date', '-AcceptedAmount']),
|
||||
models.Index(fields=['Date', '-CompletedAmount']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"打手{self.PlayerID} {self.Date}"
|
||||
|
||||
|
||||
# ==================== 8. 组长每日统计 ====================
|
||||
class LeaderDailyStats(QModel):
|
||||
"""组长每日统计表(原 ZuzhangRiTongji)"""
|
||||
LeaderID = models.CharField(
|
||||
max_length=7, db_index=True, db_column='yonghuid', verbose_name='组长用户ID')
|
||||
Date = models.DateField(
|
||||
db_index=True, db_column='riqi', verbose_name='日期')
|
||||
|
||||
InvitedManagerCount = models.IntegerField(
|
||||
default=0, db_column='yaoqing_guanshi_shu', verbose_name='邀请管事总数')
|
||||
TotalIncome = models.DecimalField(
|
||||
max_digits=12, decimal_places=2, default=0.00,
|
||||
db_column='shouru_zonge', verbose_name='收入总额(分佣)')
|
||||
CommissionAmount = models.DecimalField(
|
||||
max_digits=12, decimal_places=2, default=0.00,
|
||||
db_column='fenyong_jine', verbose_name='分佣金额')
|
||||
|
||||
class Meta:
|
||||
db_table = 'zuzhang_ri_tongji'
|
||||
verbose_name = '组长每日统计'
|
||||
unique_together = [['LeaderID', 'Date']]
|
||||
indexes = [
|
||||
models.Index(fields=['Date', '-InvitedManagerCount']),
|
||||
models.Index(fields=['Date', '-TotalIncome']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"组长{self.LeaderID} {self.Date}"
|
||||
|
||||
|
||||
# ==================== 9. 管事每日统计 ====================
|
||||
class ManagerDailyStats(QModel):
|
||||
"""管事每日统计表(原 GuanshiRiTongji)"""
|
||||
ManagerID = models.CharField(
|
||||
max_length=7, db_index=True, db_column='yonghuid', verbose_name='管事用户ID')
|
||||
Date = models.DateField(
|
||||
db_index=True, db_column='riqi', verbose_name='日期')
|
||||
|
||||
InvitedPlayerCount = models.IntegerField(
|
||||
default=0, db_column='yaoqing_dashou_shu', verbose_name='邀请打手总数')
|
||||
RechargedPlayerCount = models.IntegerField(
|
||||
default=0, db_column='chongzhi_dashou_shu', verbose_name='充值打手数量')
|
||||
TotalIncome = models.DecimalField(
|
||||
max_digits=12, decimal_places=2, default=0.00,
|
||||
db_column='shouru_zonge', verbose_name='收入总额')
|
||||
|
||||
class Meta:
|
||||
db_table = 'guanshi_ri_tongji'
|
||||
verbose_name = '管事每日统计'
|
||||
unique_together = [['ManagerID', 'Date']]
|
||||
indexes = [
|
||||
models.Index(fields=['Date', '-InvitedPlayerCount']),
|
||||
models.Index(fields=['Date', '-RechargedPlayerCount']),
|
||||
models.Index(fields=['Date', '-TotalIncome']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"管事{self.ManagerID} {self.Date}"
|
||||
|
||||
|
||||
# ==================== 10. 管事续费每日统计 ====================
|
||||
class ManagerRenewalDailyStats(QModel):
|
||||
"""管事续费每日统计表(原 GuanshiXufeiRiTongji)"""
|
||||
ManagerID = models.CharField(
|
||||
max_length=7, db_index=True, db_column='yonghuid', verbose_name='管事用户ID')
|
||||
Date = models.DateField(
|
||||
db_index=True, db_column='riqi', verbose_name='日期')
|
||||
|
||||
RenewalTotal = models.IntegerField(
|
||||
default=0, db_column='xufei_zongshu', verbose_name='今日续费总数')
|
||||
RenewalRevenue = models.DecimalField(
|
||||
max_digits=12, decimal_places=2, default=0.00,
|
||||
db_column='xufei_shouyi', verbose_name='续费收益金额')
|
||||
|
||||
class Meta:
|
||||
db_table = 'guanshi_xufei_ri_tongji'
|
||||
verbose_name = '管事续费每日统计'
|
||||
unique_together = [['ManagerID', 'Date']]
|
||||
indexes = [
|
||||
models.Index(fields=['Date', '-RenewalTotal']),
|
||||
models.Index(fields=['Date', '-RenewalRevenue']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"管事续费{self.ManagerID} {self.Date}"
|
||||
|
||||
|
||||
# ==================== 11. 提现每日统计 ====================
|
||||
class WithdrawalDailyStats(QModel):
|
||||
"""每日提现统计表(原 TixianRiTongji),按身份统计当天提现总额"""
|
||||
Date = models.DateField(
|
||||
db_index=True, db_column='riqi', verbose_name='日期')
|
||||
WithdrawalType = models.IntegerField(
|
||||
choices=[(1, '打手'), (2, '管事'), (3, '组长'),
|
||||
(4, '考核官'), (5, '打手押金'), (6, '商家余额')],
|
||||
db_column='leixing', verbose_name='用户类型')
|
||||
total_amount = models.DecimalField(
|
||||
max_digits=12, decimal_places=2, default=0.00, verbose_name='当天提现总额(元)')
|
||||
|
||||
class Meta:
|
||||
db_table = 'tixian_ri_tongji'
|
||||
verbose_name = '每日提现统计'
|
||||
unique_together = [['Date', 'WithdrawalType']]
|
||||
indexes = [models.Index(fields=['Date', 'WithdrawalType'])]
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.Date} - {self.get_WithdrawalType_display()} 提现总额: {self.total_amount}"
|
||||
|
||||
|
||||
# ==================== 兼容别名(供逐步迁移) ====================
|
||||
ShangjiaRiTongji = MerchantDailyStats
|
||||
DashouRiTongji = PlayerDailyStats
|
||||
ZuzhangRiTongji = LeaderDailyStats
|
||||
GuanshiRiTongji = ManagerDailyStats
|
||||
GuanshiXufeiRiTongji = ManagerRenewalDailyStats
|
||||
TixianRiTongji = WithdrawalDailyStats
|
||||
from django.db import models
|
||||
from gvsdsdk.model_base import QModel
|
||||
|
||||
|
||||
# ==================== 1. 角色表 ====================
|
||||
class Role(QModel):
|
||||
"""角色表"""
|
||||
role_id = models.AutoField(primary_key=True, verbose_name='角色ID')
|
||||
role_code = models.CharField(max_length=50, unique=True, db_index=True, verbose_name='角色编码')
|
||||
role_name = models.CharField(max_length=50, verbose_name='角色名称')
|
||||
description = models.CharField(max_length=200, blank=True, default='', verbose_name='角色描述')
|
||||
|
||||
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
||||
UpdateTime = models.DateTimeField(auto_now=True, verbose_name='更新时间')
|
||||
|
||||
class Meta:
|
||||
db_table = 'role'
|
||||
verbose_name = '角色'
|
||||
verbose_name_plural = '角色'
|
||||
managed = True
|
||||
indexes = [
|
||||
models.Index(fields=['role_code']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return self.role_name
|
||||
|
||||
|
||||
# ==================== 2. 权限表 ====================
|
||||
class Permission(QModel):
|
||||
"""权限表"""
|
||||
perm_id = models.AutoField(primary_key=True, verbose_name='权限ID')
|
||||
perm_code = models.CharField(max_length=100, unique=True, db_index=True, verbose_name='权限编码')
|
||||
perm_name = models.CharField(max_length=100, verbose_name='权限名称')
|
||||
description = models.CharField(max_length=200, blank=True, default='', verbose_name='权限描述')
|
||||
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
||||
UpdateTime = models.DateTimeField(auto_now=True, verbose_name='更新时间')
|
||||
|
||||
class Meta:
|
||||
db_table = 'permission'
|
||||
verbose_name = '权限'
|
||||
verbose_name_plural = '权限'
|
||||
managed = True
|
||||
indexes = [
|
||||
models.Index(fields=['perm_code']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.perm_name} ({self.perm_code})"
|
||||
|
||||
|
||||
# ==================== 3. 角色-权限关联表 ====================
|
||||
class RolePermission(QModel):
|
||||
"""角色权限关联表"""
|
||||
id = models.AutoField(primary_key=True)
|
||||
role = models.ForeignKey(Role, on_delete=models.CASCADE, db_index=True, verbose_name='角色')
|
||||
permission = models.ForeignKey(Permission, on_delete=models.CASCADE, db_index=True, verbose_name='权限')
|
||||
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
||||
|
||||
class Meta:
|
||||
db_table = 'role_permission'
|
||||
verbose_name = '角色权限关联'
|
||||
verbose_name_plural = '角色权限关联'
|
||||
managed = True
|
||||
unique_together = [['role', 'permission']]
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.role.role_name} -> {self.permission.perm_name}"
|
||||
|
||||
|
||||
# ==================== 4. 用户-角色关联表 ====================
|
||||
class UserRole(QModel):
|
||||
"""用户角色关联表"""
|
||||
id = models.AutoField(primary_key=True)
|
||||
account_id = models.CharField(max_length=11, db_index=True, verbose_name='账号ID')
|
||||
role = models.ForeignKey(Role, on_delete=models.CASCADE, db_index=True, verbose_name='角色')
|
||||
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
||||
UpdateTime = models.DateTimeField(auto_now=True, verbose_name='更新时间')
|
||||
|
||||
class Meta:
|
||||
db_table = 'user_role'
|
||||
verbose_name = '用户角色关联'
|
||||
verbose_name_plural = '用户角色关联'
|
||||
managed = True
|
||||
unique_together = [['account_id', 'role']]
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.account_id} -> {self.role.role_name}"
|
||||
|
||||
|
||||
# ==================== 5. 异常用户日志 ====================
|
||||
class AbnormalUserLog(QModel):
|
||||
"""记录恶意尝试越权操作的用户信息"""
|
||||
account_id = models.CharField(max_length=20, db_index=True, verbose_name='账号ID(phone)')
|
||||
ip_address = models.GenericIPAddressField(null=True, blank=True, verbose_name='IP地址')
|
||||
real_ip = models.GenericIPAddressField(null=True, blank=True, verbose_name='真实IP(穿透代理后)')
|
||||
x_forwarded_for = models.CharField(max_length=255, blank=True, default='', verbose_name='X-Forwarded-For')
|
||||
user_agent = models.CharField(max_length=500, blank=True, default='', verbose_name='User-Agent')
|
||||
request_method = models.CharField(max_length=10, blank=True, default='', verbose_name='请求方法')
|
||||
request_path = models.CharField(max_length=500, blank=True, default='', verbose_name='请求路径')
|
||||
request_params = models.TextField(blank=True, default='', verbose_name='请求参数(GET/POST)')
|
||||
request_body = models.TextField(blank=True, default='', verbose_name='请求体(原始)')
|
||||
request_headers = models.TextField(blank=True, default='', verbose_name='请求头(JSON格式)')
|
||||
attempt_type = models.CharField(max_length=50, blank=True, default='', verbose_name='攻击类型')
|
||||
detail = models.TextField(blank=True, default='', verbose_name='详细描述')
|
||||
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
||||
|
||||
class Meta:
|
||||
db_table = 'abnormal_user_log'
|
||||
verbose_name = '异常用户日志'
|
||||
verbose_name_plural = verbose_name
|
||||
indexes = [
|
||||
models.Index(fields=['account_id']),
|
||||
models.Index(fields=['ip_address']),
|
||||
models.Index(fields=['CreateTime']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.account_id} @ {self.ip_address} - {self.CreateTime}"
|
||||
|
||||
|
||||
# ==================== 6. 商家每日统计 ====================
|
||||
class MerchantDailyStats(QModel):
|
||||
"""商家每日统计表(原 ShangjiaRiTongji)"""
|
||||
MerchantID = models.CharField(
|
||||
max_length=7, db_index=True, db_column='yonghuid', verbose_name='商家用户ID')
|
||||
Date = models.DateField(
|
||||
db_index=True, db_column='riqi', verbose_name='日期')
|
||||
|
||||
# 派发统计
|
||||
AssignedOrderCount = models.IntegerField(
|
||||
default=0, db_column='paifa_dingdan_shu', verbose_name='派发订单总数')
|
||||
AssignedAmount = models.DecimalField(
|
||||
max_digits=12, decimal_places=2, default=0.00,
|
||||
db_column='paifa_jine', verbose_name='派发订单总金额')
|
||||
|
||||
# 结算统计
|
||||
SettledOrderCount = models.IntegerField(
|
||||
default=0, db_column='jiesuan_dingdan_shu', verbose_name='结算订单总数')
|
||||
SettledAmount = models.DecimalField(
|
||||
max_digits=12, decimal_places=2, default=0.00,
|
||||
db_column='jiesuan_jine', verbose_name='结算总金额')
|
||||
|
||||
# 退款统计
|
||||
RefundOrderCount = models.IntegerField(
|
||||
default=0, db_column='tuikuan_dingdan_shu', verbose_name='退款订单总数')
|
||||
RefundAmount = models.DecimalField(
|
||||
max_digits=12, decimal_places=2, default=0.00,
|
||||
db_column='tuikuan_jine', verbose_name='退款总金额')
|
||||
|
||||
class Meta:
|
||||
db_table = 'shangjia_ri_tongji'
|
||||
verbose_name = '商家每日统计'
|
||||
unique_together = [['MerchantID', 'Date']]
|
||||
indexes = [
|
||||
models.Index(fields=['Date', '-AssignedAmount']),
|
||||
models.Index(fields=['Date', '-SettledAmount']),
|
||||
models.Index(fields=['Date', '-AssignedOrderCount']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"商家{self.MerchantID} {self.Date}"
|
||||
|
||||
|
||||
# ==================== 7. 打手每日统计 ====================
|
||||
class PlayerDailyStats(QModel):
|
||||
"""打手每日统计表(原 DashouRiTongji)"""
|
||||
PlayerID = models.CharField(
|
||||
max_length=7, db_index=True, db_column='yonghuid', verbose_name='打手用户ID')
|
||||
Date = models.DateField(
|
||||
db_index=True, db_column='riqi', verbose_name='日期')
|
||||
|
||||
# 接单统计
|
||||
AcceptedOrderTotal = models.IntegerField(
|
||||
default=0, db_column='jiedan_zongliang', verbose_name='接单总量')
|
||||
CompletedOrderTotal = models.IntegerField(
|
||||
default=0, db_column='chengjiao_zongliang', verbose_name='成交单总量')
|
||||
|
||||
# 金额统计
|
||||
AcceptedAmount = models.DecimalField(
|
||||
max_digits=12, decimal_places=2, default=0.00,
|
||||
db_column='jiedan_zonge', verbose_name='接单总金额')
|
||||
CompletedAmount = models.DecimalField(
|
||||
max_digits=12, decimal_places=2, default=0.00,
|
||||
db_column='chengjiao_zonge', verbose_name='成交总金额')
|
||||
|
||||
# 退款统计
|
||||
RefundCount = models.IntegerField(
|
||||
default=0, db_column='tuikuan_liang', verbose_name='退款订单量')
|
||||
RefundAmount = models.DecimalField(
|
||||
max_digits=12, decimal_places=2, default=0.00,
|
||||
db_column='tuikuan_jine', verbose_name='退款总金额')
|
||||
|
||||
class Meta:
|
||||
db_table = 'dashou_ri_tongji'
|
||||
verbose_name = '打手每日统计'
|
||||
unique_together = [['PlayerID', 'Date']]
|
||||
indexes = [
|
||||
models.Index(fields=['Date', '-AcceptedOrderTotal']),
|
||||
models.Index(fields=['Date', '-CompletedOrderTotal']),
|
||||
models.Index(fields=['Date', '-AcceptedAmount']),
|
||||
models.Index(fields=['Date', '-CompletedAmount']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"打手{self.PlayerID} {self.Date}"
|
||||
|
||||
|
||||
# ==================== 8. 组长每日统计 ====================
|
||||
class LeaderDailyStats(QModel):
|
||||
"""组长每日统计表(原 ZuzhangRiTongji)"""
|
||||
LeaderID = models.CharField(
|
||||
max_length=7, db_index=True, db_column='yonghuid', verbose_name='组长用户ID')
|
||||
Date = models.DateField(
|
||||
db_index=True, db_column='riqi', verbose_name='日期')
|
||||
|
||||
InvitedManagerCount = models.IntegerField(
|
||||
default=0, db_column='yaoqing_guanshi_shu', verbose_name='邀请管事总数')
|
||||
TotalIncome = models.DecimalField(
|
||||
max_digits=12, decimal_places=2, default=0.00,
|
||||
db_column='shouru_zonge', verbose_name='收入总额(分佣)')
|
||||
CommissionAmount = models.DecimalField(
|
||||
max_digits=12, decimal_places=2, default=0.00,
|
||||
db_column='fenyong_jine', verbose_name='分佣金额')
|
||||
|
||||
class Meta:
|
||||
db_table = 'zuzhang_ri_tongji'
|
||||
verbose_name = '组长每日统计'
|
||||
unique_together = [['LeaderID', 'Date']]
|
||||
indexes = [
|
||||
models.Index(fields=['Date', '-InvitedManagerCount']),
|
||||
models.Index(fields=['Date', '-TotalIncome']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"组长{self.LeaderID} {self.Date}"
|
||||
|
||||
|
||||
# ==================== 9. 管事每日统计 ====================
|
||||
class ManagerDailyStats(QModel):
|
||||
"""管事每日统计表(原 GuanshiRiTongji)"""
|
||||
ManagerID = models.CharField(
|
||||
max_length=7, db_index=True, db_column='yonghuid', verbose_name='管事用户ID')
|
||||
Date = models.DateField(
|
||||
db_index=True, db_column='riqi', verbose_name='日期')
|
||||
|
||||
InvitedPlayerCount = models.IntegerField(
|
||||
default=0, db_column='yaoqing_dashou_shu', verbose_name='邀请打手总数')
|
||||
RechargedPlayerCount = models.IntegerField(
|
||||
default=0, db_column='chongzhi_dashou_shu', verbose_name='充值打手数量')
|
||||
TotalIncome = models.DecimalField(
|
||||
max_digits=12, decimal_places=2, default=0.00,
|
||||
db_column='shouru_zonge', verbose_name='收入总额')
|
||||
|
||||
class Meta:
|
||||
db_table = 'guanshi_ri_tongji'
|
||||
verbose_name = '管事每日统计'
|
||||
unique_together = [['ManagerID', 'Date']]
|
||||
indexes = [
|
||||
models.Index(fields=['Date', '-InvitedPlayerCount']),
|
||||
models.Index(fields=['Date', '-RechargedPlayerCount']),
|
||||
models.Index(fields=['Date', '-TotalIncome']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"管事{self.ManagerID} {self.Date}"
|
||||
|
||||
|
||||
# ==================== 10. 管事续费每日统计 ====================
|
||||
class ManagerRenewalDailyStats(QModel):
|
||||
"""管事续费每日统计表(原 GuanshiXufeiRiTongji)"""
|
||||
ManagerID = models.CharField(
|
||||
max_length=7, db_index=True, db_column='yonghuid', verbose_name='管事用户ID')
|
||||
Date = models.DateField(
|
||||
db_index=True, db_column='riqi', verbose_name='日期')
|
||||
|
||||
RenewalTotal = models.IntegerField(
|
||||
default=0, db_column='xufei_zongshu', verbose_name='今日续费总数')
|
||||
RenewalRevenue = models.DecimalField(
|
||||
max_digits=12, decimal_places=2, default=0.00,
|
||||
db_column='xufei_shouyi', verbose_name='续费收益金额')
|
||||
|
||||
class Meta:
|
||||
db_table = 'guanshi_xufei_ri_tongji'
|
||||
verbose_name = '管事续费每日统计'
|
||||
unique_together = [['ManagerID', 'Date']]
|
||||
indexes = [
|
||||
models.Index(fields=['Date', '-RenewalTotal']),
|
||||
models.Index(fields=['Date', '-RenewalRevenue']),
|
||||
]
|
||||
|
||||
def __str__(self):
|
||||
return f"管事续费{self.ManagerID} {self.Date}"
|
||||
|
||||
|
||||
# ==================== 11. 提现每日统计 ====================
|
||||
class WithdrawalDailyStats(QModel):
|
||||
"""每日提现统计表(原 TixianRiTongji),按身份统计当天提现总额"""
|
||||
Date = models.DateField(
|
||||
db_index=True, db_column='riqi', verbose_name='日期')
|
||||
WithdrawalType = models.IntegerField(
|
||||
choices=[(1, '打手'), (2, '管事'), (3, '组长'),
|
||||
(4, '考核官'), (5, '打手押金'), (6, '商家余额')],
|
||||
db_column='leixing', verbose_name='用户类型')
|
||||
total_amount = models.DecimalField(
|
||||
max_digits=12, decimal_places=2, default=0.00, verbose_name='当天提现总额(元)')
|
||||
|
||||
class Meta:
|
||||
db_table = 'tixian_ri_tongji'
|
||||
verbose_name = '每日提现统计'
|
||||
unique_together = [['Date', 'WithdrawalType']]
|
||||
indexes = [models.Index(fields=['Date', 'WithdrawalType'])]
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.Date} - {self.get_WithdrawalType_display()} 提现总额: {self.total_amount}"
|
||||
|
||||
|
||||
# ==================== 兼容别名(供逐步迁移) ====================
|
||||
ShangjiaRiTongji = MerchantDailyStats
|
||||
DashouRiTongji = PlayerDailyStats
|
||||
ZuzhangRiTongji = LeaderDailyStats
|
||||
GuanshiRiTongji = ManagerDailyStats
|
||||
GuanshiXufeiRiTongji = ManagerRenewalDailyStats
|
||||
TixianRiTongji = WithdrawalDailyStats
|
||||
|
||||
138
backend/view.py
138
backend/view.py
@@ -370,8 +370,8 @@ class GetAdminUserListView(APIView):
|
||||
'nicheng': user.KefuProfile.nicheng,
|
||||
'roles': roles_data,
|
||||
'status': user.KefuProfile.zhuangtai,
|
||||
'create_time': user.UserCreateTime.strftime('%Y-%m-%d %H:%M:%S') if hasattr(user, 'UserCreateTime') else '',
|
||||
'update_time': user.update_time.strftime('%Y-%m-%d %H:%M:%S') if hasattr(user, 'update_time') else '',
|
||||
'CreateTime': user.UserCreateTime.strftime('%Y-%m-%d %H:%M:%S') if hasattr(user, 'UserCreateTime') else '',
|
||||
'UpdateTime': user.UpdateTime.strftime('%Y-%m-%d %H:%M:%S') if hasattr(user, 'UpdateTime') else '',
|
||||
})
|
||||
|
||||
return Response({
|
||||
@@ -452,7 +452,7 @@ class GetAdminRolesView(APIView):
|
||||
users = users.filter(phone__in=user_ids_with_role)
|
||||
|
||||
# 排序
|
||||
users = users.order_by('-create_time')
|
||||
users = users.order_by('-CreateTime')
|
||||
|
||||
# 分页
|
||||
paginator = Paginator(users, page_size)
|
||||
@@ -469,8 +469,8 @@ class GetAdminRolesView(APIView):
|
||||
'nicheng': user.KefuProfile.nicheng,
|
||||
'roles': roles_data,
|
||||
'status': user.KefuProfile.zhuangtai,
|
||||
'create_time': user.UserCreateTime.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'update_time': user.update_time.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'CreateTime': user.UserCreateTime.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
'UpdateTime': user.UpdateTime.strftime('%Y-%m-%d %H:%M:%S'),
|
||||
})
|
||||
|
||||
return Response({
|
||||
@@ -737,7 +737,7 @@ class KefuGetDashouListView(APIView):
|
||||
|
||||
# 7. 分页
|
||||
offset = (page - 1) * page_size
|
||||
dashou_list = dashou_qs.order_by('-create_time')[offset:offset + page_size]
|
||||
dashou_list = dashou_qs.order_by('-CreateTime')[offset:offset + page_size]
|
||||
|
||||
# 8. 构建返回数据
|
||||
result = []
|
||||
@@ -821,7 +821,7 @@ class KefuGetDashouDetailView(APIView):
|
||||
'dianhua': '',
|
||||
'wechat': '',
|
||||
'phone': user_main.Phone or '',
|
||||
'create_time': user_main.UserCreateTime,
|
||||
'CreateTime': user_main.UserCreateTime,
|
||||
'ip': user_main.IP or '',
|
||||
'jiedanzongliang': 0,
|
||||
'chengjiaozongliang': 0,
|
||||
@@ -861,7 +861,7 @@ class KefuGetDashouDetailView(APIView):
|
||||
'dianhua': dashou.dianhua or '',
|
||||
'wechat': dashou.wechat or '',
|
||||
'phone': user_main.Phone or '',
|
||||
'create_time': user_main.UserCreateTime,
|
||||
'CreateTime': user_main.UserCreateTime,
|
||||
'ip': user_main.IP or '',
|
||||
'jiedanzongliang': dashou.jiedanzongliang,
|
||||
'chengjiaozongliang': dashou.chengjiaozongliang,
|
||||
@@ -880,7 +880,7 @@ class KefuGetDashouDetailView(APIView):
|
||||
# 6. 查询打手已拥有的会员(未过期)
|
||||
member_records = Huiyuangoumai.query.filter(
|
||||
yonghu_id=uid
|
||||
).order_by('-create_time')
|
||||
).order_by('-CreateTime')
|
||||
member_list = []
|
||||
for record in member_records:
|
||||
# 检查是否过期
|
||||
@@ -980,7 +980,7 @@ class KefuGetDashouDetailView(APIView):
|
||||
'dianhua': '',
|
||||
'wechat': '',
|
||||
'phone': user_main.Phone or '',
|
||||
'create_time': user_main.UserCreateTime,
|
||||
'CreateTime': user_main.UserCreateTime,
|
||||
'ip': user_main.IP or '',
|
||||
'jiedanzongliang': 0,
|
||||
'chengjiaozongliang': 0,
|
||||
@@ -1016,7 +1016,7 @@ class KefuGetDashouDetailView(APIView):
|
||||
'dianhua': dashou.dianhua or '',
|
||||
'wechat': dashou.wechat or '',
|
||||
'phone': user_main.Phone or '',
|
||||
'create_time': user_main.UserCreateTime,
|
||||
'CreateTime': user_main.UserCreateTime,
|
||||
'ip': user_main.IP or '',
|
||||
'jiedanzongliang': dashou.jiedanzongliang,
|
||||
'chengjiaozongliang': dashou.chengjiaozongliang,
|
||||
@@ -1035,7 +1035,7 @@ class KefuGetDashouDetailView(APIView):
|
||||
# 5. 查询打手会员信息(仅未过期)
|
||||
member_records = Huiyuangoumai.query.filter(
|
||||
yonghu_id=uid
|
||||
).order_by('-create_time')
|
||||
).order_by('-CreateTime')
|
||||
|
||||
member_list = []
|
||||
for record in member_records:
|
||||
@@ -1473,7 +1473,7 @@ class KefuGetShangjiaListView(APIView):
|
||||
|
||||
# 6. 分页
|
||||
offset = (page - 1) * page_size
|
||||
shangjia_list = shangjia_qs.order_by('-create_time')[offset:offset + page_size]
|
||||
shangjia_list = shangjia_qs.order_by('-CreateTime')[offset:offset + page_size]
|
||||
|
||||
# 7. 构建返回数据
|
||||
result = []
|
||||
@@ -1560,7 +1560,7 @@ class KefuGetShangjiaDetailView(APIView):
|
||||
'jinriliushui': str(shangjia.jinriliushui),
|
||||
'jinyuedingdan': shangjia.jinyuedingdan,
|
||||
'jinyueliushui': str(shangjia.jinyueliushui),
|
||||
'create_time': shangjia.create_time.isoformat() if shangjia.create_time else None,
|
||||
'CreateTime': shangjia.CreateTime.isoformat() if shangjia.CreateTime else None,
|
||||
}
|
||||
|
||||
return Response({'code': 0, 'data': data})
|
||||
@@ -1850,7 +1850,7 @@ class GetProductListView(APIView):
|
||||
else:
|
||||
qs = qs.order_by(f'-{sort_field}')
|
||||
else:
|
||||
qs = qs.order_by('-create_time') # 默认按创建时间倒序
|
||||
qs = qs.order_by('-CreateTime') # 默认按创建时间倒序
|
||||
|
||||
# 分页
|
||||
total = qs.count()
|
||||
@@ -2052,7 +2052,7 @@ class GetProductListView(APIView):
|
||||
else:
|
||||
qs = qs.order_by(f'-{sort_field}')
|
||||
else:
|
||||
qs = qs.order_by('-create_time') # 默认按创建时间倒序
|
||||
qs = qs.order_by('-CreateTime') # 默认按创建时间倒序
|
||||
|
||||
# 分页
|
||||
total = qs.count()
|
||||
@@ -2465,7 +2465,7 @@ class GetProductDetailView(APIView):
|
||||
'tupian_url': product.tupian_url,
|
||||
'kaioi_ewai_PlayerCommission': product.kaioi_ewai_dashou_fencheng,
|
||||
'ewai_PlayerCommission': str(product.ewai_dashou_fencheng) if product.ewai_dashou_fencheng is not None else '0',
|
||||
'create_time': product.create_time.isoformat() if product.create_time else None,
|
||||
'CreateTime': product.CreateTime.isoformat() if product.CreateTime else None,
|
||||
'shenhezhuangtai': product.shenhezhuangtai,
|
||||
}
|
||||
|
||||
@@ -2685,7 +2685,7 @@ class GetMemberListView(APIView):
|
||||
if '3300a' not in permissions:
|
||||
return Response({'code': 403, 'msg': '无权限查看会员列表'})
|
||||
|
||||
members = Huiyuan.query.all().order_by('-create_time')
|
||||
members = Huiyuan.query.all().order_by('-CreateTime')
|
||||
member_list = []
|
||||
for m in members:
|
||||
member_list.append({
|
||||
@@ -2696,8 +2696,8 @@ class GetMemberListView(APIView):
|
||||
'guanshifc': str(m.guanshifc),
|
||||
'zuzhangfc': str(m.zuzhangfc),
|
||||
'goumai_cishu': m.goumai_cishu,
|
||||
'create_time': m.create_time.isoformat() if m.create_time else None,
|
||||
'update_time': m.update_time.isoformat() if m.update_time else None,
|
||||
'CreateTime': m.CreateTime.isoformat() if m.CreateTime else None,
|
||||
'UpdateTime': m.UpdateTime.isoformat() if m.UpdateTime else None,
|
||||
})
|
||||
return Response({'code': 0, 'data': {'list': member_list}})
|
||||
|
||||
@@ -3034,7 +3034,7 @@ class GetGuanliDetailView(APIView):
|
||||
'jinrichongzhi': guanshi.jinrichongzhi,
|
||||
'jinyuechongzhi': guanshi.jinyuechongzhi,
|
||||
'chongzhifenrun': str(guanshi.chongzhifenrun),
|
||||
'create_time': guanshi.create_time.isoformat() if guanshi.create_time else None,
|
||||
'CreateTime': guanshi.CreateTime.isoformat() if guanshi.CreateTime else None,
|
||||
}
|
||||
|
||||
# 余额提现相关
|
||||
@@ -3726,7 +3726,7 @@ class GetZuzhangDetailView(APIView):
|
||||
'jinri_fenyong': str(zuzhang.jinri_fenyong),
|
||||
'jinyue_fenyong': str(zuzhang.jinyue_fenyong),
|
||||
'fenyong_zonge': str(zuzhang.fenyong_zonge),
|
||||
'create_time': zuzhang.create_time.isoformat() if zuzhang.create_time else None,
|
||||
'CreateTime': zuzhang.CreateTime.isoformat() if zuzhang.CreateTime else None,
|
||||
}
|
||||
|
||||
# 余额提现相关
|
||||
@@ -5567,8 +5567,8 @@ class ProductListView(APIView):
|
||||
'yongjin': p.yongjin,
|
||||
'kaioi_ewai_PlayerCommission': p.kaioi_ewai_dashou_fencheng,
|
||||
'ewai_PlayerCommission': p.ewai_dashou_fencheng,
|
||||
'create_time': p.create_time.isoformat() if p.create_time else '',
|
||||
'update_time': p.update_time.isoformat() if p.update_time else '',
|
||||
'CreateTime': p.CreateTime.isoformat() if p.CreateTime else '',
|
||||
'UpdateTime': p.UpdateTime.isoformat() if p.UpdateTime else '',
|
||||
'paixu': p.paixu,
|
||||
'dianpu_id': p.dianpu_id,
|
||||
'dianpu_name': p.dianpu.dianpu_mingcheng if p.dianpu else '',
|
||||
@@ -5873,7 +5873,7 @@ class FaKuanLieBiaoView(APIView):
|
||||
'zhengju_tupian': zhengju_map.get(r.id, []),
|
||||
'shensu_tupian': shensu_map.get(r.id, []),
|
||||
'creat_time': r.CreateTime.strftime('%Y-%m-%d %H:%M:%S') if r.CreateTime else '',
|
||||
'update_time': r.UpdateTime.strftime('%Y-%m-%d %H:%M:%S') if r.UpdateTime else '',
|
||||
'UpdateTime': r.UpdateTime.strftime('%Y-%m-%d %H:%M:%S') if r.UpdateTime else '',
|
||||
})
|
||||
|
||||
return Response({
|
||||
@@ -6278,7 +6278,7 @@ class HqbkxxView(APIView):
|
||||
bankuai_list.append({
|
||||
'bankuai_id': bk.bankuai_id,
|
||||
'mingcheng': bk.mingcheng,
|
||||
'create_time': bk.create_time.strftime('%Y-%m-%d %H:%M:%S') if bk.create_time else ''
|
||||
'CreateTime': bk.CreateTime.strftime('%Y-%m-%d %H:%M:%S') if bk.CreateTime else ''
|
||||
})
|
||||
|
||||
# 6. 查询所有商品类型
|
||||
@@ -6514,8 +6514,8 @@ class CaiwuView(APIView):
|
||||
|
||||
# 今日充值(会员充值,leixing=1, zhuangtai=3)
|
||||
today_chongzhi = Czjilu.query.filter(
|
||||
create_time__gte=today_start,
|
||||
create_time__lt=today_end,
|
||||
CreateTime__gte=today_start,
|
||||
CreateTime__lt=today_end,
|
||||
leixing=1,
|
||||
zhuangtai=3
|
||||
)
|
||||
@@ -6524,8 +6524,8 @@ class CaiwuView(APIView):
|
||||
|
||||
# 今日新增会员:从购买记录表统计今天创建的用户(去重)
|
||||
new_huiyuan_user_ids = Huiyuangoumai.query.filter(
|
||||
create_time__gte=today_start,
|
||||
create_time__lt=today_end
|
||||
CreateTime__gte=today_start,
|
||||
CreateTime__lt=today_end
|
||||
).values_list('yonghu_id', flat=True).distinct()
|
||||
today_new_huiyuan = len(new_huiyuan_user_ids)
|
||||
|
||||
@@ -6533,8 +6533,8 @@ class CaiwuView(APIView):
|
||||
today_new_huiyuan_amount = 0.0
|
||||
if new_huiyuan_user_ids:
|
||||
amount_sum = Czjilu.query.filter(
|
||||
create_time__gte=today_start,
|
||||
create_time__lt=today_end,
|
||||
CreateTime__gte=today_start,
|
||||
CreateTime__lt=today_end,
|
||||
UserUID__in=new_huiyuan_user_ids,
|
||||
leixing=1,
|
||||
zhuangtai=3
|
||||
@@ -6685,7 +6685,7 @@ class HybkjtsjView(APIView):
|
||||
end_date = date(year + 1, 1, 1)
|
||||
else:
|
||||
end_date = date(year, month + 1, 1)
|
||||
trunc_func = TruncDate('create_time')
|
||||
trunc_func = TruncDate('CreateTime')
|
||||
if not summary_date:
|
||||
summary_date = now.strftime('%Y-%m-%d')
|
||||
summary_q = datetime.strptime(summary_date, '%Y-%m-%d').date()
|
||||
@@ -6694,7 +6694,7 @@ class HybkjtsjView(APIView):
|
||||
return Response({'code': 1, 'msg': '按月统计需要年份'}, status=400)
|
||||
start_date = date(year, 1, 1)
|
||||
end_date = date(year + 1, 1, 1)
|
||||
trunc_func = TruncMonth('create_time')
|
||||
trunc_func = TruncMonth('CreateTime')
|
||||
if not summary_date:
|
||||
summary_date = now.strftime('%Y-%m')
|
||||
summary_q = datetime.strptime(summary_date + '-01', '%Y-%m-%d').date()
|
||||
@@ -6702,7 +6702,7 @@ class HybkjtsjView(APIView):
|
||||
year = year or now.year
|
||||
start_date = date(year, 1, 1)
|
||||
end_date = date(year + 1, 1, 1)
|
||||
trunc_func = TruncYear('create_time')
|
||||
trunc_func = TruncYear('CreateTime')
|
||||
if not summary_date:
|
||||
summary_date = str(year)
|
||||
summary_q = date(year, 1, 1)
|
||||
@@ -6718,15 +6718,15 @@ class HybkjtsjView(APIView):
|
||||
'huiyuan_id': huiyuan_id, # 会员ID筛选
|
||||
'leixing': 1,
|
||||
'zhuangtai': 3,
|
||||
'create_time__gte': start_dt,
|
||||
'create_time__lt': end_dt
|
||||
'CreateTime__gte': start_dt,
|
||||
'CreateTime__lt': end_dt
|
||||
}
|
||||
|
||||
# ---------- 分红过滤 ----------
|
||||
fenhong_filter = {
|
||||
'huiyuan_id': huiyuan_id, # 分红表会员ID筛选
|
||||
'create_time__gte': start_dt,
|
||||
'create_time__lt': end_dt
|
||||
'CreateTime__gte': start_dt,
|
||||
'CreateTime__lt': end_dt
|
||||
}
|
||||
|
||||
# 充值分组查询
|
||||
@@ -6787,12 +6787,12 @@ class HybkjtsjView(APIView):
|
||||
# ---------- 汇总数据 ----------
|
||||
summary_chongzhi_filter = chongzhi_filter.copy()
|
||||
if granularity == 'day':
|
||||
summary_chongzhi_filter['create_time__date'] = summary_q
|
||||
summary_chongzhi_filter['CreateTime__date'] = summary_q
|
||||
elif granularity == 'month':
|
||||
summary_chongzhi_filter['create_time__year'] = summary_q.year
|
||||
summary_chongzhi_filter['create_time__month'] = summary_q.month
|
||||
summary_chongzhi_filter['CreateTime__year'] = summary_q.year
|
||||
summary_chongzhi_filter['CreateTime__month'] = summary_q.month
|
||||
else:
|
||||
summary_chongzhi_filter['create_time__year'] = summary_q.year
|
||||
summary_chongzhi_filter['CreateTime__year'] = summary_q.year
|
||||
|
||||
summary_chongzhi = Czjilu.query.filter(**summary_chongzhi_filter).aggregate(
|
||||
total_count=Count('id'),
|
||||
@@ -6806,12 +6806,12 @@ class HybkjtsjView(APIView):
|
||||
if include_guanshi or include_zuzhang:
|
||||
summary_fenhong_filter = fenhong_filter.copy()
|
||||
if granularity == 'day':
|
||||
summary_fenhong_filter['create_time__date'] = summary_q
|
||||
summary_fenhong_filter['CreateTime__date'] = summary_q
|
||||
elif granularity == 'month':
|
||||
summary_fenhong_filter['create_time__year'] = summary_q.year
|
||||
summary_fenhong_filter['create_time__month'] = summary_q.month
|
||||
summary_fenhong_filter['CreateTime__year'] = summary_q.year
|
||||
summary_fenhong_filter['CreateTime__month'] = summary_q.month
|
||||
else:
|
||||
summary_fenhong_filter['create_time__year'] = summary_q.year
|
||||
summary_fenhong_filter['CreateTime__year'] = summary_q.year
|
||||
|
||||
fenhong_agg = {}
|
||||
if include_guanshi:
|
||||
@@ -7261,7 +7261,7 @@ class CwqtczhqView(APIView):
|
||||
return Response({'code': 1, 'msg': '按日统计需要年份和月份'}, status=400)
|
||||
start_date = date(year, month, 1)
|
||||
end_date = date(year, month + 1, 1) if month < 12 else date(year + 1, 1, 1)
|
||||
trunc_func = TruncDate('create_time')
|
||||
trunc_func = TruncDate('CreateTime')
|
||||
# 默认汇总日期
|
||||
if not summary_date:
|
||||
summary_date = now.strftime('%Y-%m-%d')
|
||||
@@ -7271,7 +7271,7 @@ class CwqtczhqView(APIView):
|
||||
return Response({'code': 1, 'msg': '按月统计需要年份'}, status=400)
|
||||
start_date = date(year, 1, 1)
|
||||
end_date = date(year + 1, 1, 1)
|
||||
trunc_func = TruncMonth('create_time')
|
||||
trunc_func = TruncMonth('CreateTime')
|
||||
if not summary_date:
|
||||
summary_date = now.strftime('%Y-%m')
|
||||
summary_q = datetime.strptime(summary_date + '-01', '%Y-%m-%d').date()
|
||||
@@ -7279,7 +7279,7 @@ class CwqtczhqView(APIView):
|
||||
year = year or now.year
|
||||
start_date = date(year, 1, 1)
|
||||
end_date = date(year + 1, 1, 1)
|
||||
trunc_func = TruncYear('create_time')
|
||||
trunc_func = TruncYear('CreateTime')
|
||||
if not summary_date:
|
||||
summary_date = str(year)
|
||||
summary_q = date(year, 1, 1)
|
||||
@@ -7301,8 +7301,8 @@ class CwqtczhqView(APIView):
|
||||
cz_types = [t for t in types if t in [2, 3, 4, 5]]
|
||||
if cz_types:
|
||||
cz_qs = Czjilu.query.filter(
|
||||
create_time__gte=start_dt,
|
||||
create_time__lt=end_dt,
|
||||
CreateTime__gte=start_dt,
|
||||
CreateTime__lt=end_dt,
|
||||
leixing__in=cz_types,
|
||||
zhuangtai=3 # 只统计支付成功的
|
||||
).annotate(
|
||||
@@ -7382,12 +7382,12 @@ class CwqtczhqView(APIView):
|
||||
'zhuangtai': 3,
|
||||
}
|
||||
if granularity == 'day':
|
||||
filter_kwargs['create_time__date'] = summary_q
|
||||
filter_kwargs['CreateTime__date'] = summary_q
|
||||
elif granularity == 'month':
|
||||
filter_kwargs['create_time__year'] = summary_q.year
|
||||
filter_kwargs['create_time__month'] = summary_q.month
|
||||
filter_kwargs['CreateTime__year'] = summary_q.year
|
||||
filter_kwargs['CreateTime__month'] = summary_q.month
|
||||
else:
|
||||
filter_kwargs['create_time__year'] = summary_q.year
|
||||
filter_kwargs['CreateTime__year'] = summary_q.year
|
||||
agg = Czjilu.query.filter(**filter_kwargs).aggregate(count=Count('id'), amount=Sum('jine'))
|
||||
count = agg['count'] or 0
|
||||
amount = float(agg['amount'] or 0)
|
||||
@@ -7496,7 +7496,7 @@ class CwqtczhqView(APIView):
|
||||
return Response({'code': 1, 'msg': '按日统计需要年份和月份'}, status=400)
|
||||
start_date = date(year, month, 1)
|
||||
end_date = date(year, month + 1, 1) if month < 12 else date(year + 1, 1, 1)
|
||||
trunc_func = TruncDate('create_time')
|
||||
trunc_func = TruncDate('CreateTime')
|
||||
# 默认汇总日期
|
||||
if not summary_date:
|
||||
summary_date = now.strftime('%Y-%m-%d')
|
||||
@@ -7506,7 +7506,7 @@ class CwqtczhqView(APIView):
|
||||
return Response({'code': 1, 'msg': '按月统计需要年份'}, status=400)
|
||||
start_date = date(year, 1, 1)
|
||||
end_date = date(year + 1, 1, 1)
|
||||
trunc_func = TruncMonth('create_time')
|
||||
trunc_func = TruncMonth('CreateTime')
|
||||
if not summary_date:
|
||||
summary_date = now.strftime('%Y-%m')
|
||||
summary_q = datetime.strptime(summary_date + '-01', '%Y-%m-%d').date()
|
||||
@@ -7514,7 +7514,7 @@ class CwqtczhqView(APIView):
|
||||
year = year or now.year
|
||||
start_date = date(year, 1, 1)
|
||||
end_date = date(year + 1, 1, 1)
|
||||
trunc_func = TruncYear('create_time')
|
||||
trunc_func = TruncYear('CreateTime')
|
||||
if not summary_date:
|
||||
summary_date = str(year)
|
||||
summary_q = date(year, 1, 1)
|
||||
@@ -7536,8 +7536,8 @@ class CwqtczhqView(APIView):
|
||||
cz_types = [t for t in types if t in [2, 3, 4, 5]]
|
||||
if cz_types:
|
||||
cz_qs = Czjilu.query.filter(
|
||||
create_time__gte=start_dt,
|
||||
create_time__lt=end_dt,
|
||||
CreateTime__gte=start_dt,
|
||||
CreateTime__lt=end_dt,
|
||||
leixing__in=cz_types,
|
||||
zhuangtai=3 # 只统计支付成功的
|
||||
).annotate(
|
||||
@@ -7639,12 +7639,12 @@ class CwqtczhqView(APIView):
|
||||
'zhuangtai': 3,
|
||||
}
|
||||
if granularity == 'day':
|
||||
filter_kwargs['create_time__date'] = summary_q
|
||||
filter_kwargs['CreateTime__date'] = summary_q
|
||||
elif granularity == 'month':
|
||||
filter_kwargs['create_time__year'] = summary_q.year
|
||||
filter_kwargs['create_time__month'] = summary_q.month
|
||||
filter_kwargs['CreateTime__year'] = summary_q.year
|
||||
filter_kwargs['CreateTime__month'] = summary_q.month
|
||||
else:
|
||||
filter_kwargs['create_time__year'] = summary_q.year
|
||||
filter_kwargs['CreateTime__year'] = summary_q.year
|
||||
agg = Czjilu.query.filter(**filter_kwargs).aggregate(count=Count('id'), amount=Sum('jine'))
|
||||
count = agg['count'] or 0
|
||||
amount = float(agg['amount'] or 0)
|
||||
@@ -7760,7 +7760,7 @@ class KhpzhqView(APIView):
|
||||
'bankuai_id': ch.bankuai_id,
|
||||
'tubiao_url': ch.tubiao_url or '',
|
||||
'texiao_miaoshu': ch.texiao_miaoshu or '',
|
||||
'create_time': ch.create_time.strftime('%Y-%m-%d %H:%M:%S') if ch.create_time else '',
|
||||
'CreateTime': ch.CreateTime.strftime('%Y-%m-%d %H:%M:%S') if ch.CreateTime else '',
|
||||
'kaohe_guize': ch.kaohe_guize or '',
|
||||
'kaioi_jinpai': ch.kaioi_jinpai,
|
||||
'feiyong': feiyong_dict, # {1:100.0, 2:200.0}
|
||||
@@ -8016,7 +8016,7 @@ class KhgglView(APIView):
|
||||
total = queryset.count()
|
||||
start = (page - 1) * page_size
|
||||
end = start + page_size
|
||||
shenheguan_list = queryset.order_by('-create_time')[start:end]
|
||||
shenheguan_list = queryset.order_by('-CreateTime')[start:end]
|
||||
|
||||
# ---------- 预计算每个板块的打手数量 ----------
|
||||
bankuai_dashou_count_map = {}
|
||||
@@ -8074,8 +8074,8 @@ class KhgglView(APIView):
|
||||
'tongguo_zongshu': sg.tongguo_zongshu,
|
||||
'yue': float(sg.yue),
|
||||
'zonge': float(sg.zonge),
|
||||
'create_time': sg.create_time.strftime('%Y-%m-%d %H:%M:%S') if sg.create_time else '',
|
||||
'update_time': sg.update_time.strftime('%Y-%m-%d %H:%M:%S') if sg.update_time else '',
|
||||
'CreateTime': sg.CreateTime.strftime('%Y-%m-%d %H:%M:%S') if sg.CreateTime else '',
|
||||
'UpdateTime': sg.UpdateTime.strftime('%Y-%m-%d %H:%M:%S') if sg.UpdateTime else '',
|
||||
'bankuai': bankuai_info,
|
||||
'nicheng': dashou_nick,
|
||||
'is_renzheng': sg.is_renzheng,
|
||||
|
||||
Reference in New Issue
Block a user