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

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

View File

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

View File

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

View File

@@ -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='账号IDphone')
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='账号IDphone')
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

View File

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