修复了一些

This commit is contained in:
TermiNexus committed 2026-06-18 18:02:45 +08:00
1 parent e67bc17fa2
commit 53049d1588
20 files changed
+3671 -2541

No files matched your search

+323 -324
View File
File diff suppressed because it is too large. Load diff
+74 -74
View File
@@ -42,7 +42,7 @@ from users.models import (
)
from gvsdsdk.models import User
from orders.models import Lilubiao, Dingdan, DingdanShangjia
from orders.models import CommissionRate, Order, MerchantOrderExt
from orders.notice_tasks import dingdan_guangbo
from rank.models import Chenghao, DingdanBiaoqian
@@ -226,12 +226,12 @@ class AdminConfigQueryView(APIView):
})
# 查询利率配置
platform_rate_obj = Lilubiao.query.filter(fadanpingtai='1').first()
shop_rate_obj = Lilubiao.query.filter(fadanpingtai='3').first()
platform_rate_obj = CommissionRate.query.filter(Platform='1').first()
shop_rate_obj = CommissionRate.query.filter(Platform='3').first()
# 🔴【新增】打手提现抽成利率(字符5)
dashou_withdraw_obj = Lilubiao.query.filter(fadanpingtai='5').first()
dashou_withdraw_obj = CommissionRate.query.filter(Platform='5').first()
# 🔴【新增】管事提现抽成利率(字符6)
guanshi_withdraw_obj = Lilubiao.query.filter(fadanpingtai='6').first()
guanshi_withdraw_obj = CommissionRate.query.filter(Platform='6').first()
# 构建返回数据
data = {
@@ -241,14 +241,14 @@ class AdminConfigQueryView(APIView):
},
'qq_groups': qq_groups,
'rates': {
'platform_rate': float(platform_rate_obj.lilu) if platform_rate_obj and platform_rate_obj.lilu else 0.0,
'shop_rate': float(shop_rate_obj.lilu) if shop_rate_obj and shop_rate_obj.lilu else 0.0,
'platform_rate': float(platform_rate_obj.Rate) if platform_rate_obj and platform_rate_obj.Rate else 0.0,
'shop_rate': float(shop_rate_obj.Rate) if shop_rate_obj and shop_rate_obj.Rate else 0.0,
# 🔴【新增】打手提现抽成利率
'dashou_withdraw_rate': float(
dashou_withdraw_obj.lilu) if dashou_withdraw_obj and dashou_withdraw_obj.lilu else 0.0,
dashou_withdraw_obj.Rate) if dashou_withdraw_obj and dashou_withdraw_obj.Rate else 0.0,
# 🔴【新增】管事提现抽成利率
'guanshi_withdraw_rate': float(
guanshi_withdraw_obj.lilu) if guanshi_withdraw_obj and guanshi_withdraw_obj.lilu else 0.0
guanshi_withdraw_obj.Rate) if guanshi_withdraw_obj and guanshi_withdraw_obj.Rate else 0.0
}
}
@@ -504,17 +504,17 @@ class AdminUpdateConfigView(APIView):
platform_rate_float = float(platform_rate)
if 0 <= platform_rate_float <= 1:
# 🔴 修复:查询现有记录,如果不存在则创建
platform_rate_obj = Lilubiao.query.filter(fadanpingtai='1').first()
platform_rate_obj = CommissionRate.query.filter(Platform='1').first()
if platform_rate_obj:
# 更新现有记录
platform_rate_obj.lilu = platform_rate_float
platform_rate_obj.Rate = platform_rate_float
platform_rate_obj.save()
else:
# 创建新记录
platform_rate_obj = Lilubiao.query.create(
lilu=platform_rate_float,
fadanpingtai='1'
platform_rate_obj = CommissionRate.query.create(
Rate=platform_rate_float,
Platform='1'
)
updated_rates['platform_rate'] = platform_rate_float
@@ -538,17 +538,17 @@ class AdminUpdateConfigView(APIView):
shop_rate_float = float(shop_rate)
if 0 <= shop_rate_float <= 1:
# 🔴 修复:查询现有记录,如果不存在则创建
shop_rate_obj = Lilubiao.query.filter(fadanpingtai='3').first()
shop_rate_obj = CommissionRate.query.filter(Platform='3').first()
if shop_rate_obj:
# 更新现有记录
shop_rate_obj.lilu = shop_rate_float
shop_rate_obj.Rate = shop_rate_float
shop_rate_obj.save()
else:
# 创建新记录
shop_rate_obj = Lilubiao.query.create(
lilu=shop_rate_float,
fadanpingtai='3'
shop_rate_obj = CommissionRate.query.create(
Rate=shop_rate_float,
Platform='3'
)
updated_rates['shop_rate'] = shop_rate_float
@@ -575,17 +575,17 @@ class AdminUpdateConfigView(APIView):
dashou_withdraw_rate_float = float(dashou_withdraw_rate)
if 0 <= dashou_withdraw_rate_float <= 1:
# 查询现有记录,如果不存在则创建
dashou_withdraw_obj = Lilubiao.query.filter(fadanpingtai='5').first()
dashou_withdraw_obj = CommissionRate.query.filter(Platform='5').first()
if dashou_withdraw_obj:
# 更新现有记录
dashou_withdraw_obj.lilu = dashou_withdraw_rate_float
dashou_withdraw_obj.Rate = dashou_withdraw_rate_float
dashou_withdraw_obj.save()
else:
# 创建新记录
dashou_withdraw_obj = Lilubiao.query.create(
lilu=dashou_withdraw_rate_float,
fadanpingtai='5'
dashou_withdraw_obj = CommissionRate.query.create(
Rate=dashou_withdraw_rate_float,
Platform='5'
)
updated_rates['dashou_withdraw_rate'] = dashou_withdraw_rate_float
@@ -609,17 +609,17 @@ class AdminUpdateConfigView(APIView):
guanshi_withdraw_rate_float = float(guanshi_withdraw_rate)
if 0 <= guanshi_withdraw_rate_float <= 1:
# 查询现有记录,如果不存在则创建
guanshi_withdraw_obj = Lilubiao.query.filter(fadanpingtai='6').first()
guanshi_withdraw_obj = CommissionRate.query.filter(Platform='6').first()
if guanshi_withdraw_obj:
# 更新现有记录
guanshi_withdraw_obj.lilu = guanshi_withdraw_rate_float
guanshi_withdraw_obj.Rate = guanshi_withdraw_rate_float
guanshi_withdraw_obj.save()
else:
# 创建新记录
guanshi_withdraw_obj = Lilubiao.query.create(
lilu=guanshi_withdraw_rate_float,
fadanpingtai='6'
guanshi_withdraw_obj = CommissionRate.query.create(
Rate=guanshi_withdraw_rate_float,
Platform='6'
)
updated_rates['guanshi_withdraw_rate'] = guanshi_withdraw_rate_float
@@ -1788,8 +1788,8 @@ class ShangjiaGenerateLinkView(APIView):
# 利率
try:
lilu = float(Lilubiao.query.get(fadanpingtai='3').lilu) or 1.0
except Lilubiao.DoesNotExist:
lilu = float(CommissionRate.query.get(Platform='3').Rate) or 1.0
except CommissionRate.DoesNotExist:
lilu = 1.0
dashou_fencheng = Decimal(str(round(float(jiage) * lilu, 2)))
@@ -1838,26 +1838,26 @@ class ShangjiaGenerateLinkView(APIView):
secure_token = generate_secure_token(dingdan_id, user.yonghuid)
# 创建订单主表
dingdan = Dingdan.query.create(
dingdan_id=dingdan_id,
zhuangtai=13,
fadan_pingtai=2,
jine=jiage,
dashou_fencheng=dashou_fencheng,
leixing_id=shangpin_type_id,
dingdan = Order.query.create(
OrderID=dingdan_id,
Status=13,
Platform=2,
Amount=jiage,
PlayerCommission=dashou_fencheng,
ProductTypeID=shangpin_type_id,
yaoqiuleixing=final_yaoqiuleixing,
huiyuan_id=final_huiyuan_id,
yongjin=final_yongjin,
jieshao=moban.moban_jieshao[:2000],
Description=moban.moban_jieshao[:2000],
user1_id=f"Sj{user.yonghuid}",
tupian=user.avatar or '',
ImageURL=user.avatar or '',
)
# 商家扩展表
DingdanShangjia.query.create(
dingdan=dingdan,
shangjia_id=user.yonghuid,
sjnicheng=shangjia.nicheng or f"商家{user.yonghuid}",
MerchantOrderExt.query.create(
Order=dingdan,
MerchantID=user.yonghuid,
MerchantNickname=shangjia.nicheng or f"商家{user.yonghuid}",
)
# 关联标签
@@ -2186,7 +2186,7 @@ class KehuGetDingdanLianjieView(APIView):
if lianjie_obj.dingdan_id:
try:
# 查询订单主表
dingdan_obj = Dingdan.query.get(dingdan_id=lianjie_obj.dingdan_id)
dingdan_obj = Order.query.get(OrderID=lianjie_obj.dingdan_id)
# 获取商家昵称
shangjia_nicheng = ''
@@ -2207,10 +2207,10 @@ class KehuGetDingdanLianjieView(APIView):
# ========== 构建订单信息 ==========
dingdan_info = {
'jieshao': dingdan_obj.jieshao or '',
'jiage': str(dingdan_obj.jine) if dingdan_obj.jine is not None else '0.00', # 金额字段名是 jine
'jieshao': dingdan_obj.Description or '',
'jiage': str(dingdan_obj.Amount) if dingdan_obj.Amount is not None else '0.00', # 金额字段名是 Amount
'shangjia_mingcheng': shangjia_nicheng,
'zhuangtai': dingdan_obj.zhuangtai,
'zhuangtai': dingdan_obj.Status,
# 新增配置字段
'kefu_link': kefu_link,
'oss_url': oss_url,
@@ -2223,25 +2223,25 @@ class KehuGetDingdanLianjieView(APIView):
# 如果已使用,返回已填写的信息
if lianjie_obj.is_used:
dingdan_info.update({
'youxi_nicheng': dingdan_obj.nicheng or '',
'youxi_nicheng': dingdan_obj.Nickname or '',
'zhiding_dashou': dingdan_obj.zhiding_id or '',
'beizhu': dingdan_obj.beizhu or '',
'beizhu': dingdan_obj.Remark or '',
})
# 获取聊天相关标识
# 9.1 获取接单打手ID
jiedan_dashou_id = dingdan_obj.jiedan_dashou_id
jiedan_dashou_id = dingdan_obj.PlayerID
dashou_biaoshi = f'Ds{jiedan_dashou_id}' if jiedan_dashou_id else ''
# 9.2 获取商家标识
shangjia_biaoshi = ''
try:
shangjia_kuozhan = DingdanShangjia.query.select_related('dingdan').filter(
dingdan__dingdan_id=lianjie_obj.dingdan_id
shangjia_kuozhan = MerchantOrderExt.query.select_related('Order').filter(
Order__OrderID=lianjie_obj.dingdan_id
).first()
if shangjia_kuozhan and shangjia_kuozhan.shangjia_id:
shangjia_biaoshi = f'Sj{shangjia_kuozhan.shangjia_id}'
if shangjia_kuozhan and shangjia_kuozhan.MerchantID:
shangjia_biaoshi = f'Sj{shangjia_kuozhan.MerchantID}'
logger.info(f"生成商家标识: {shangjia_biaoshi}")
else:
logger.info(f"订单 {lianjie_obj.dingdan_id} 没有商家订单扩展信息")
@@ -2257,7 +2257,7 @@ class KehuGetDingdanLianjieView(APIView):
response_data.update(dingdan_info)
except Dingdan.DoesNotExist:
except Order.DoesNotExist:
logger.error(f"订单不存在 - 订单ID: {lianjie_obj.dingdan_id}")
response_data.update({
'jieshao': '',
@@ -2533,12 +2533,12 @@ class KehuTianxieDingdanView(APIView):
logger.error(f"链接记录中订单ID为空 - 链接ID: {lianjie_obj.id}")
raise ValueError("订单ID为空")
dingdan_obj = Dingdan.query.get(dingdan_id=lianjie_obj.dingdan_id)
dingdan_obj = Order.query.get(OrderID=lianjie_obj.dingdan_id)
# 检查订单状态是否为13(灰色状态)
if dingdan_obj.zhuangtai != 13:
if dingdan_obj.Status != 13:
logger.warning(
f"订单状态不允许修改 - 订单ID: {dingdan_obj.dingdan_id}, 当前状态: {dingdan_obj.zhuangtai}")
f"订单状态不允许修改 - 订单ID: {dingdan_obj.OrderID}, 当前状态: {dingdan_obj.Status}")
# 回滚事务
transaction.set_rollback(True)
return Response({
@@ -2548,9 +2548,9 @@ class KehuTianxieDingdanView(APIView):
}, status=status.HTTP_400_BAD_REQUEST)
# 更新订单信息
dingdan_obj.nicheng = youxi_nicheng # 游戏昵称
dingdan_obj.beizhu = beizhu if beizhu else '' # 备注
dingdan_obj.zhuangtai = zhuangtai_xin # 新状态:1或7
dingdan_obj.Nickname = youxi_nicheng # 游戏昵称
dingdan_obj.Remark = beizhu if beizhu else '' # 备注
dingdan_obj.Status = zhuangtai_xin # 新状态:1或7
# 如果是指定打手,设置zhiding_id
if zhiding_dashou and zhuangtai_xin == 7:
@@ -2558,14 +2558,14 @@ class KehuTianxieDingdanView(APIView):
dingdan_obj.save()
logger.info(
f"更新订单成功 - 订单ID: {dingdan_obj.dingdan_id}, 新状态: {zhuangtai_xin}, 指定打手: {zhiding_dashou or '无'}")
f"更新订单成功 - 订单ID: {dingdan_obj.OrderID}, 新状态: {zhuangtai_xin}, 指定打手: {zhiding_dashou or '无'}")
# 构建通知数据(你的 _get_game_type_name 方法保留在视图里直接用)
order_info = {
'dingdan_id': dingdan_obj.dingdan_id,
'game_type': self._get_game_type_name(dingdan_obj.leixing_id),
'amount': str(dingdan_obj.jine),
'order_desc': (dingdan_obj.jieshao or '')[:50],
'dingdan_id': dingdan_obj.OrderID,
'game_type': self._get_game_type_name(dingdan_obj.ProductTypeID),
'amount': str(dingdan_obj.Amount),
'order_desc': (dingdan_obj.Description or '')[:50],
}
dingdan_guangbo.delay(order_info) # 瞬间返回,不阻塞请求
@@ -2590,12 +2590,12 @@ class KehuTianxieDingdanView(APIView):
'zhuangtai_text': '普通订单' if zhuangtai_xin == 1 else '指定打手订单'
}
logger.info(f"订单提交成功 - 订单ID: {dingdan_obj.dingdan_id}, IP: {client_ip}")
logger.info(f"订单提交成功 - 订单ID: {dingdan_obj.OrderID}, IP: {client_ip}")
# 新方法(行为驱动,更安全)
update_shangjia_daily(
yonghuid=lianjie_obj.yonghu_id,
amount=Decimal(str(dingdan_obj.jine)),
amount=Decimal(str(dingdan_obj.Amount)),
action=1 # 1 = 派发
)
@@ -2605,7 +2605,7 @@ class KehuTianxieDingdanView(APIView):
'data': response_data
}, status=status.HTTP_200_OK)
except Dingdan.DoesNotExist:
except Order.DoesNotExist:
logger.error(f"订单不存在 - 订单ID: {lianjie_obj.dingdan_id}")
return Response({
'code': 500,
@@ -2637,17 +2637,17 @@ class KehuTianxieDingdanView(APIView):
try:
# 获取游戏类型名称
try:
leixing_obj = ShangpinLeixing.query.get(id=dingdan.leixing_id)
leixing_obj = ShangpinLeixing.query.get(id=dingdan.ProductTypeID)
game_type = leixing_obj.jieshao
except:
game_type = '未知游戏'
# 构建订单信息
order_info = {
'dingdan_id': dingdan.dingdan_id,
'dingdan_id': dingdan.OrderID,
'game_type': game_type,
'amount': str(dingdan.jine),
'order_desc': dingdan.jieshao[:50] if dingdan.jieshao else '新订单',
'amount': str(dingdan.Amount),
'order_desc': dingdan.Description[:50] if dingdan.Description else '新订单',
'youxi_nicheng': youxi_nicheng,
'order_type': '指定订单' if zhuangtai == 7 else '普通订单',
'zhiding_dashou': zhiding_dashou or ''
@@ -0,0 +1,392 @@
# Generated by Django 4.2.27 on 2026-06-18 17:46
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('orders', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='ChatSession',
fields=[
('id', models.BigAutoField(primary_key=True, serialize=False, verbose_name='主键ID')),
('User1ID', models.CharField(db_column='user1_id', db_index=True, max_length=30, verbose_name='用户1标识')),
('User2ID', models.CharField(db_column='user2_id', db_index=True, max_length=30, verbose_name='用户2标识')),
('OrderID', models.CharField(db_column='dingdan_id', max_length=32, unique=True, verbose_name='订单ID')),
('Status', models.IntegerField(choices=[(1, '开启中'), (0, '已关闭')], db_column='zhuangtai', db_index=True, default=1, verbose_name='聊天状态')),
('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')),
('UpdateTime', models.DateTimeField(auto_now=True, db_column='update_time', verbose_name='更新时间')),
],
options={
'db_table': 'liaotian',
},
),
migrations.CreateModel(
name='CommissionRate',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('Rate', models.DecimalField(db_column='lilu', decimal_places=4, max_digits=5, null=True, verbose_name='平台分成利率')),
('Platform', models.CharField(db_column='fadanpingtai', max_length=10, null=True, verbose_name='订单所属平台')),
('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')),
('UpdateTime', models.DateTimeField(auto_now=True, db_column='update_time', verbose_name='更新时间')),
],
options={
'db_table': 'lilubiao',
},
),
migrations.CreateModel(
name='EscortOrder',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('OrderID', models.CharField(db_column='dingdan_id', db_index=True, max_length=32, unique=True, verbose_name='订单ID')),
('MainPlayerID', models.CharField(db_column='zhudashou_id', db_index=True, max_length=32, verbose_name='主打手ID')),
('Escort1ID', models.CharField(blank=True, db_column='peihu1_id', db_index=True, max_length=32, null=True, verbose_name='陪护1打手ID')),
('Escort2ID', models.CharField(blank=True, db_column='peihu2_id', db_index=True, max_length=32, null=True, verbose_name='陪护2打手ID')),
('Status', models.IntegerField(db_column='zhuangtai', default=1, verbose_name='陪护订单状态')),
('EscortCount', models.IntegerField(db_column='peihu_xuqiu_shuliang', default=1, verbose_name='陪护需求数量')),
('CommissionReq', models.DecimalField(blank=True, db_column='yongjin_yaoqiu', decimal_places=2, max_digits=10, null=True, verbose_name='抢单佣金要求')),
('Escort1LevelReq', models.PositiveIntegerField(blank=True, db_column='peihu1_dengji_xuqiu', null=True, verbose_name='陪护1等级需求(称号ID)')),
('Escort2LevelReq', models.PositiveIntegerField(blank=True, db_column='peihu2_dengji_xuqiu', null=True, verbose_name='陪护2等级需求(称号ID)')),
('Escort1BombLiability', models.CharField(blank=True, db_column='peihu1_zhadan_danze', max_length=10, null=True, verbose_name='陪护1炸单担责比例')),
('Escort2BombLiability', models.CharField(blank=True, db_column='peihu2_zhadan_danze', max_length=10, null=True, verbose_name='陪护2炸单担责比例')),
('Escort1BonusRate', models.CharField(blank=True, db_column='peihu1_fenhong', max_length=10, null=True, verbose_name='陪护1分红比例')),
('Escort2BonusRate', models.CharField(blank=True, db_column='peihu2_fenhong', max_length=10, null=True, verbose_name='陪护2分红比例')),
('AssignedEscort1', models.CharField(blank=True, db_column='zhiding_peihu1', max_length=32, null=True, verbose_name='指定陪护1 ID')),
('AssignedEscort2', models.CharField(blank=True, db_column='zhiding_peihu2', max_length=32, null=True, verbose_name='指定陪护2 ID')),
('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')),
('UpdateTime', models.DateTimeField(auto_now=True, db_column='update_time', verbose_name='更新时间')),
],
options={
'verbose_name': '陪护订单',
'verbose_name_plural': '陪护订单',
'db_table': 'dingdan_peihu',
},
),
migrations.CreateModel(
name='MerchantOrderExt',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('MerchantID', models.CharField(blank=True, db_column='shangjia_id', db_index=True, max_length=32, null=True, verbose_name='商家ID')),
('MerchantReview', models.TextField(blank=True, db_column='shangjia_pingjia', null=True, verbose_name='商家评价')),
('PenaltyReason', models.TextField(blank=True, db_column='cfliyou', null=True, verbose_name='商家处罚理由')),
('PenaltyApplyStatus', models.IntegerField(blank=True, db_column='sqzhuangtai', default=0, null=True, verbose_name='处罚申请状态:0待处理,1成功,2驳回')),
('RejectReason', models.TextField(blank=True, db_column='bhliyou', null=True, verbose_name='驳回商家处罚理由')),
('MerchantNickname', models.CharField(db_column='sjnicheng', max_length=50, null=True, verbose_name='商家昵称')),
('PrevOrderID', models.CharField(blank=True, db_column='shangyige_dingdan_id', max_length=32, null=True, verbose_name='上一个订单ID')),
],
options={
'verbose_name': '商家订单扩展',
'verbose_name_plural': '商家订单扩展',
'db_table': 'dingdan_shangjia',
},
),
migrations.CreateModel(
name='Order',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('OrderID', models.CharField(db_column='dingdan_id', db_index=True, max_length=32, unique=True, verbose_name='订单ID')),
('Status', models.IntegerField(blank=True, db_column='zhuangtai', db_index=True, default=1, null=True, verbose_name='订单状态')),
('Platform', models.IntegerField(blank=True, db_column='fadan_pingtai', null=True, verbose_name='发单平台')),
('Amount', models.DecimalField(blank=True, db_column='jine', decimal_places=2, max_digits=10, null=True, verbose_name='订单金额')),
('PlayerCommission', models.DecimalField(blank=True, db_column='dashou_fencheng', decimal_places=2, max_digits=10, null=True, verbose_name='打手分成')),
('ManagerCommission', models.DecimalField(blank=True, db_column='guanshi_fencheng', decimal_places=2, default=0, max_digits=10, null=True, verbose_name='管事分成')),
('PlayerID', models.CharField(blank=True, db_column='jiedan_dashou_id', db_index=True, max_length=32, null=True, verbose_name='接单打手ID')),
('PlayerRemark', models.TextField(blank=True, db_column='dashou_liuyan', null=True, verbose_name='打手留言')),
('AssignedID', models.CharField(blank=True, db_column='zhiding_id', max_length=32, null=True, verbose_name='指定ID')),
('ProductID', models.IntegerField(blank=True, db_column='shangpin_id', null=True, verbose_name='商品ID')),
('ProductTypeID', models.PositiveIntegerField(blank=True, db_column='leixing_id', null=True, verbose_name='商品类型ID')),
('ImageURL', models.CharField(blank=True, db_column='tupian', max_length=500, null=True, verbose_name='商品图片URL')),
('GrabRequirement', models.PositiveIntegerField(blank=True, db_column='yaoqiuleixing', null=True, verbose_name='抢单要求类型')),
('MembershipID', models.CharField(blank=True, db_column='huiyuan_id', max_length=6, null=True, verbose_name='会员ID')),
('CommissionReq', models.DecimalField(blank=True, db_column='yongjin', decimal_places=2, max_digits=10, null=True, verbose_name='佣金要求')),
('Description', models.TextField(blank=True, db_column='jieshao', null=True, verbose_name='订单介绍')),
('Remark', models.TextField(blank=True, db_column='beizhu', null=True, verbose_name='订单备注')),
('Nickname', models.CharField(blank=True, db_column='nicheng', max_length=50, null=True, verbose_name='游戏昵称')),
('User1ID', models.CharField(db_column='user1_id', db_index=True, max_length=30, null=True, verbose_name='用户1标识')),
('User2ID', models.CharField(db_column='user2_id', db_index=True, max_length=30, null=True, verbose_name='用户2打手标识')),
('AutoTaskID', models.CharField(blank=True, db_column='auto_task_id', default='', max_length=255, verbose_name='延时任务ID')),
('AutoExpireAt', models.DateTimeField(blank=True, db_column='auto_expire_at', null=True, verbose_name='计划过期时间')),
('PendingDispatch', models.BooleanField(db_column='pending_dispatch', db_index=True, default=False, verbose_name='待调度标记')),
('SettlementTime', models.DateTimeField(blank=True, db_column='status_8_time', null=True, verbose_name='状态变为8的时间')),
('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')),
('UpdateTime', models.DateTimeField(auto_now=True, db_column='update_time', verbose_name='更新时间')),
('AssignedCS', models.CharField(db_column='clkf', db_index=True, max_length=20, null=True, verbose_name='处理客服')),
('RefundReason', models.CharField(blank=True, db_column='tkly', max_length=500, null=True, verbose_name='退款/拒绝理由')),
('WechatTransactionID', models.CharField(blank=True, db_column='wechat_transaction_id', db_index=True, max_length=64, null=True, verbose_name='微信支付订单号')),
],
options={
'verbose_name': '订单',
'verbose_name_plural': '订单',
'db_table': 'dingdan',
},
),
migrations.CreateModel(
name='OrderPlayerHistory',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('OrderID', models.CharField(db_column='dingdan_id', db_index=True, max_length=32, verbose_name='订单ID')),
('PlayerID', models.CharField(db_column='dashou_id', db_index=True, max_length=7, verbose_name='打手ID')),
('Times', models.PositiveSmallIntegerField(verbose_name='第几次接单(从1开始)')),
('Operator', models.CharField(db_column='operator', max_length=11, verbose_name='操作客服ID')),
('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')),
],
options={
'verbose_name': '订单打手变更历史',
'verbose_name_plural': '订单打手变更历史',
'db_table': 'order_dashou_history',
},
),
migrations.CreateModel(
name='Penalty',
fields=[
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='自增主键')),
('PenalizedUserID', models.CharField(db_column='beichufa_id', db_index=True, max_length=20, verbose_name='被处罚用户ID')),
('ApplicantID', models.CharField(blank=True, db_column='shenqing_chufa', max_length=20, null=True, verbose_name='申请处罚者ID')),
('Identity', models.IntegerField(choices=[(1, '打手'), (2, '管事'), (3, '商家'), (4, '组长')], db_column='shenfen', default=1, verbose_name='被处罚者身份')),
('Reason', models.TextField(blank=True, db_column='chufaliyou', null=True, verbose_name='处罚理由')),
('FineAmount', models.DecimalField(db_column='fakuanjine', decimal_places=2, default=0.0, max_digits=10, verbose_name='罚款金额')),
('RelatedOrderID', models.CharField(blank=True, db_column='guanliandingdan_id', db_index=True, max_length=32, null=True, verbose_name='关联订单ID')),
('Status', models.IntegerField(choices=[(1, '待缴纳'), (2, '已缴纳'), (3, '申诉中'), (4, '已驳回')], db_column='zhuangtai', db_index=True, default=1, verbose_name='罚单状态')),
('AffectsGrabbing', models.IntegerField(choices=[(1, '影响抢单'), (0, '不影响抢单')], db_column='yingxiang_qiangdan', db_index=True, default=1, verbose_name='是否影响抢单')),
('AppealReason', models.TextField(blank=True, db_column='shensuliyou', null=True, verbose_name='申诉理由')),
('ApproveReason', models.TextField(blank=True, db_column='tongyi_chufaliyou', null=True, verbose_name='同意处罚理由')),
('RejectReason', models.TextField(blank=True, db_column='bohuiliyou', null=True, verbose_name='驳回理由')),
('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')),
('UpdateTime', models.DateTimeField(auto_now=True, db_column='update_time', verbose_name='更新时间')),
('ApplicantIdentity', models.IntegerField(choices=[(1, '客服'), (2, '售后'), (3, '管理员'), (4, '店铺'), (5, '商家')], db_column='shenqingren_shenfen', default=1, verbose_name='申请处罚人身份')),
('ProcessorIdentity', models.IntegerField(choices=[(1, '客服'), (2, '售后'), (3, '管理员')], db_column='chulizhe_shenfen', default=2, verbose_name='处理者身份')),
('ProcessorID', models.CharField(blank=True, db_column='chulizhe', max_length=20, null=True, verbose_name='处理者')),
('ApplicantBonusAmount', models.DecimalField(db_column='shenqingren_fenhong_jine', decimal_places=2, default=0.0, max_digits=12, verbose_name='申请人分红金额')),
],
options={
'verbose_name': '罚单',
'verbose_name_plural': '罚单',
'db_table': 'fadan',
},
),
migrations.CreateModel(
name='PenaltyAppealImage',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('PenalizedUserID', models.CharField(db_column='beichufa_id', db_index=True, max_length=7, verbose_name='被处罚用户ID')),
('ImageURL', models.CharField(db_column='tupian_url', max_length=500, verbose_name='图片相对URL')),
('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')),
('Purpose', models.IntegerField(choices=[(1, '处罚证据图片'), (2, '申诉图片')], db_column='yongtu', default=2, verbose_name='图片用途')),
],
options={
'verbose_name': '罚款申诉图片',
'verbose_name_plural': '罚款申诉图片',
'db_table': 'fadan_shensu_tupian',
},
),
migrations.CreateModel(
name='PenaltyBonus',
fields=[
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='自增主键')),
('BeneficiaryID', models.CharField(db_column='fenhongzhe_id', db_index=True, max_length=20, verbose_name='分红者ID')),
('TotalAmount', models.DecimalField(db_column='zonge', decimal_places=2, default=0.0, max_digits=12, verbose_name='分红总额')),
('WithdrawableAmount', models.DecimalField(db_column='ketixian_fenhong', decimal_places=2, default=0.0, max_digits=12, verbose_name='可提现分红')),
('Identity', models.IntegerField(choices=[(1, '商家'), (2, '客服'), (3, '平台管理者'), (4, '店铺'), (5, '售后')], db_column='shenfen', default=1, verbose_name='分红者身份')),
('BonusCount', models.IntegerField(db_column='fenhong_cishu', default=0, verbose_name='分红次数')),
('IsIndividualRate', models.BooleanField(db_column='is_individual_rate', default=False, verbose_name='是否单独开启分红利率')),
('IndividualRate', models.DecimalField(db_column='yingde_lilv', decimal_places=4, default=0.0, max_digits=5, verbose_name='分红应得利率')),
('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')),
('UpdateTime', models.DateTimeField(auto_now=True, db_column='update_time', verbose_name='更新时间')),
],
options={
'verbose_name': '罚款分红',
'verbose_name_plural': '罚款分红',
'db_table': 'fadan_fenhong',
},
),
migrations.CreateModel(
name='PenaltyBonusRate',
fields=[
('Identity', models.IntegerField(choices=[(1, '客服'), (2, '售后'), (3, '管理员'), (4, '店铺'), (5, '商家')], db_column='shenfen', primary_key=True, serialize=False, verbose_name='申请处罚人身份')),
('Rate', models.DecimalField(db_column='lilv', decimal_places=4, default=0.0, max_digits=5, verbose_name='分红费率')),
('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')),
('UpdateTime', models.DateTimeField(auto_now=True, db_column='update_time', verbose_name='更新时间')),
],
options={
'verbose_name': '罚款分红费率配置',
'verbose_name_plural': '罚款分红费率配置',
'db_table': 'fadan_fenhong_lilv',
},
),
migrations.CreateModel(
name='PenaltyEvidenceImage',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('OrderID', models.CharField(db_column='dingdan_id', db_index=True, max_length=32, null=True, verbose_name='订单ID')),
('UserID', models.CharField(blank=True, db_column='yonghuid', db_index=True, max_length=32, null=True, verbose_name='用户ID')),
('ImageURL', models.CharField(blank=True, db_column='tupian', max_length=500, null=True, verbose_name='证据图片URL')),
('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')),
('UpdateTime', models.DateTimeField(auto_now=True, db_column='update_time', verbose_name='更新时间')),
],
options={
'db_table': 'chufatupian',
},
),
migrations.CreateModel(
name='PenaltyRecord',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('PlayerID', models.CharField(db_column='dashouid', db_index=True, max_length=7, null=True, verbose_name='被罚打手ID')),
('ApplicantID', models.CharField(db_column='qingqiuid', db_index=True, max_length=11, null=True, verbose_name='请求处罚ID')),
('ProcessorID', models.CharField(db_column='chuliid', db_index=True, max_length=11, null=True, verbose_name='处理处罚ID')),
('PenaltyReason', models.TextField(blank=True, db_column='cfliyou', null=True, verbose_name='处罚理由')),
('AppealReason', models.TextField(blank=True, db_column='ssliyou', null=True, verbose_name='打手申诉理由')),
('ApplyStatus', models.IntegerField(blank=True, db_column='sqzhuangtai', default=0, null=True, verbose_name='处罚申请状态:0待处理,1成功,2驳回')),
('RejectReason', models.TextField(blank=True, db_column='bhliyou', null=True, verbose_name='驳回处罚理由')),
('DeductedPoints', models.IntegerField(db_column='jifen', default=0, verbose_name='扣除打手积分')),
('OrderID', models.CharField(db_column='dingdan_id', db_index=True, max_length=32, null=True, verbose_name='订单ID')),
('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')),
('UpdateTime', models.DateTimeField(auto_now=True, db_column='update_time', verbose_name='更新时间')),
],
options={
'db_table': 'chufajilu',
},
),
migrations.CreateModel(
name='PlatformCashFlow',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('TotalIncome', models.DecimalField(blank=True, db_column='zonge', decimal_places=2, max_digits=10, null=True, verbose_name='收取总金额')),
('TotalPayout', models.DecimalField(blank=True, db_column='zhichuzonge', decimal_places=2, max_digits=10, null=True, verbose_name='支出总金额')),
('TotalProfit', models.DecimalField(blank=True, db_column='zongshouyi', decimal_places=2, max_digits=10, null=True, verbose_name='总收益')),
('DailyIncome', models.DecimalField(blank=True, db_column='rizonge', decimal_places=2, max_digits=10, null=True, verbose_name='日收取')),
('DailyPayout', models.DecimalField(blank=True, db_column='rizhichu', decimal_places=2, max_digits=10, null=True, verbose_name='日支出')),
('DailyProfit', models.DecimalField(blank=True, db_column='rishouyi', decimal_places=2, max_digits=10, null=True, verbose_name='日收益')),
('TotalIncomeCount', models.IntegerField(db_column='zongshoucishu', default=0, verbose_name='总收取次数')),
('DailyIncomeCount', models.IntegerField(db_column='rishoucishu', default=0, verbose_name='日收取次数')),
('TotalPayoutCount', models.IntegerField(db_column='zongzhichucishu', default=0, verbose_name='总支出次数')),
('DailyPayoutCount', models.IntegerField(db_column='rizhichucishu', default=0, verbose_name='日支出次数')),
],
options={
'db_table': 'ptliushui',
},
),
migrations.CreateModel(
name='PlatformOrderExt',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('BossID', models.CharField(blank=True, db_column='laoban_id', db_index=True, max_length=32, null=True, verbose_name='老板ID')),
('BossReview', models.TextField(blank=True, db_column='laoban_pingjia', null=True, verbose_name='老板评价')),
('RejectSettlementFlag', models.IntegerField(db_column='jjjs_biaoshi', default=0, verbose_name='拒绝结算标记(1表示拒绝结算)')),
('PlatformIncome', models.DecimalField(blank=True, db_column='pingtai_shouyi', decimal_places=2, default=0.0, max_digits=10, null=True, verbose_name='平台收益')),
('ShopIncome', models.DecimalField(blank=True, db_column='dianpu_shouyi', decimal_places=2, default=0.0, max_digits=10, null=True, verbose_name='店铺收益')),
('ShopID', models.PositiveIntegerField(blank=True, db_column='dianpu_id', db_index=True, null=True, verbose_name='所属店铺ID')),
('ParentShopID', models.PositiveIntegerField(blank=True, db_column='shangji_dianpu_id', db_index=True, null=True, verbose_name='该订单的上级店铺ID')),
('ParentBonus', models.DecimalField(blank=True, db_column='shangji_fenhong', decimal_places=2, default=0.0, max_digits=10, null=True, verbose_name='上级分红金额')),
],
options={
'verbose_name': '平台订单扩展',
'verbose_name_plural': '平台订单扩展',
'db_table': 'dingdan_pingtai',
},
),
migrations.CreateModel(
name='PlayerDeliveryImage',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('OrderID', models.CharField(db_column='dingdan_id', db_index=True, max_length=32, null=True, verbose_name='订单ID')),
('PlayerID', models.CharField(blank=True, db_column='dashou', db_index=True, max_length=32, null=True, verbose_name='接单打手ID')),
('ImageURL', models.CharField(blank=True, db_column='tupian', max_length=500, null=True, verbose_name='打手提交图片URL')),
('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')),
('UpdateTime', models.DateTimeField(auto_now=True, db_column='update_time', verbose_name='更新时间')),
],
options={
'db_table': 'dashoutupian',
},
),
migrations.CreateModel(
name='PlayerRating',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('PlayerID', models.CharField(blank=True, db_column='dashou', db_index=True, max_length=32, null=True, verbose_name='接单打手ID')),
('TotalScore', models.PositiveIntegerField(db_column='zongfen', default=0, verbose_name='总分')),
('RatingCount', models.PositiveIntegerField(db_column='cishu', default=0, verbose_name='评分次数')),
('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')),
('UpdateTime', models.DateTimeField(auto_now=True, db_column='update_time', verbose_name='更新时间')),
],
options={
'verbose_name': '评分表',
'db_table': 'pingfenbiao',
},
),
migrations.CreateModel(
name='RefundRecord',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('OrderID', models.CharField(db_column='dingdan_id', max_length=32, unique=True, verbose_name='订单ID')),
('PlayerID', models.CharField(db_column='dashouid', max_length=7, null=True, verbose_name='接单打手ID')),
('ApplicantID', models.CharField(db_column='qingqiuid', max_length=7, null=True, verbose_name='请求用户ID')),
('ProcessorID', models.CharField(db_column='chuliid', db_index=True, max_length=11, null=True, verbose_name='处理人ID')),
('Reason', models.TextField(blank=True, db_column='liyou', null=True, verbose_name='理由')),
('ApplyStatus', models.IntegerField(blank=True, db_column='sqzhuangtai', db_index=True, default=0, null=True, verbose_name='申请状态:0待处理,1成功,2驳回')),
('RejectReason', models.TextField(blank=True, db_column='bhliyou', null=True, verbose_name='驳回理由')),
('Amount', models.DecimalField(blank=True, db_column='jine', decimal_places=2, max_digits=10, null=True, verbose_name='订单金额')),
('PlayerCommission', models.DecimalField(blank=True, db_column='dashou_fencheng', decimal_places=2, max_digits=10, null=True, verbose_name='打手分成')),
('Description', models.TextField(blank=True, db_column='jieshao', null=True, verbose_name='订单介绍')),
('Remark', models.TextField(blank=True, db_column='beizhu', null=True, verbose_name='订单备注')),
('Nickname', models.CharField(blank=True, db_column='nicheng', max_length=50, null=True, verbose_name='游戏昵称')),
('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')),
('UpdateTime', models.DateTimeField(auto_now=True, db_column='update_time', verbose_name='更新时间')),
],
options={
'db_table': 'tuikuanjilu',
},
),
migrations.DeleteModel(
name='Chufajilu',
),
migrations.DeleteModel(
name='Chufatupian',
),
migrations.DeleteModel(
name='Dashoutupian',
),
migrations.DeleteModel(
name='DingdanPeihu',
),
migrations.RemoveField(
model_name='dingdanpingtai',
name='dingdan',
),
migrations.RemoveField(
model_name='dingdanshangjia',
name='dingdan',
),
migrations.DeleteModel(
name='FadanFenhong',
),
migrations.DeleteModel(
name='FadanFenhongLilv',
),
migrations.RemoveField(
model_name='fadanshensutupian',
name='fadan',
),
migrations.DeleteModel(
name='Liaotian',
),
migrations.DeleteModel(
name='Lilubiao',
),
migrations.DeleteModel(
name='OrderDashouHistory',
),
migrations.DeleteModel(
name='Pingfen',
),
migrations.DeleteModel(
name='Ptliushui',
),
migrations.DeleteModel(
name='Tuikuanjilu',
),
]
@@ -0,0 +1,177 @@
# Generated by Django 4.2.27 on 2026-06-18 17:46
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('orders', '0002_chatsession_commissionrate_escortorder_and_more'),
('rank', '0002_alter_dashoubiaoxian_dingdan_and_more'),
]
operations = [
migrations.DeleteModel(
name='Dingdan',
),
migrations.DeleteModel(
name='DingdanPingtai',
),
migrations.DeleteModel(
name='DingdanShangjia',
),
migrations.DeleteModel(
name='Fadan',
),
migrations.DeleteModel(
name='FadanShensuTupian',
),
migrations.AddIndex(
model_name='refundrecord',
index=models.Index(fields=['ProcessorID'], name='tuikuanjilu_chuliid_0b0f16_idx'),
),
migrations.AddIndex(
model_name='refundrecord',
index=models.Index(fields=['ApplyStatus'], name='tuikuanjilu_sqzhuan_d89dc9_idx'),
),
migrations.AddIndex(
model_name='playerrating',
index=models.Index(fields=['PlayerID'], name='pingfenbiao_dashou_f62f10_idx'),
),
migrations.AddIndex(
model_name='playerdeliveryimage',
index=models.Index(fields=['PlayerID'], name='dashoutupia_dashou_7de8bd_idx'),
),
migrations.AddIndex(
model_name='playerdeliveryimage',
index=models.Index(fields=['OrderID'], name='dashoutupia_dingdan_97c685_idx'),
),
migrations.AddField(
model_name='platformorderext',
name='Order',
field=models.OneToOneField(db_column='dingdan_id', on_delete=django.db.models.deletion.CASCADE, related_name='pingtai_kuozhan', to='orders.order', verbose_name='订单'),
),
migrations.AddIndex(
model_name='penaltyrecord',
index=models.Index(fields=['PlayerID'], name='chufajilu_dashoui_07aac0_idx'),
),
migrations.AddIndex(
model_name='penaltyrecord',
index=models.Index(fields=['ApplicantID'], name='chufajilu_qingqiu_ac160e_idx'),
),
migrations.AddIndex(
model_name='penaltyrecord',
index=models.Index(fields=['ProcessorID'], name='chufajilu_chuliid_cd63ac_idx'),
),
migrations.AddIndex(
model_name='penaltyrecord',
index=models.Index(fields=['OrderID'], name='chufajilu_dingdan_b8f0c2_idx'),
),
migrations.AddIndex(
model_name='penaltyevidenceimage',
index=models.Index(fields=['UserID'], name='chufatupian_yonghui_71e585_idx'),
),
migrations.AddIndex(
model_name='penaltyevidenceimage',
index=models.Index(fields=['OrderID'], name='chufatupian_dingdan_ce0dd4_idx'),
),
migrations.AddIndex(
model_name='penaltybonus',
index=models.Index(fields=['BeneficiaryID'], name='fadan_fenhong_zhe_idx'),
),
migrations.AddIndex(
model_name='penaltybonus',
index=models.Index(fields=['Identity'], name='fadan_fenhong_sf_idx'),
),
migrations.AddField(
model_name='penaltyappealimage',
name='Penalty',
field=models.ForeignKey(db_column='fadan_id', on_delete=django.db.models.deletion.CASCADE, related_name='shensu_tupians', to='orders.penalty', verbose_name='关联罚单'),
),
migrations.AddIndex(
model_name='penalty',
index=models.Index(fields=['PenalizedUserID', 'AffectsGrabbing', 'Status'], name='fadan_qiangdan_check'),
),
migrations.AddIndex(
model_name='penalty',
index=models.Index(fields=['RelatedOrderID'], name='fadan_dingdan_idx'),
),
migrations.AddIndex(
model_name='orderplayerhistory',
index=models.Index(fields=['OrderID'], name='order_dasho_dingdan_1e79ab_idx'),
),
migrations.AddIndex(
model_name='orderplayerhistory',
index=models.Index(fields=['PlayerID'], name='order_dasho_dashou__0a637c_idx'),
),
migrations.AddIndex(
model_name='order',
index=models.Index(fields=['Status'], name='dingdan_zhuangt_2febe8_idx'),
),
migrations.AddIndex(
model_name='order',
index=models.Index(fields=['OrderID'], name='dingdan_dingdan_83dcb6_idx'),
),
migrations.AddIndex(
model_name='order',
index=models.Index(fields=['PlayerID'], name='dingdan_jiedan__921bfa_idx'),
),
migrations.AddIndex(
model_name='order',
index=models.Index(fields=['WechatTransactionID'], name='dingdan_wechat__278b79_idx'),
),
migrations.AddField(
model_name='merchantorderext',
name='Order',
field=models.OneToOneField(db_column='dingdan_id', on_delete=django.db.models.deletion.CASCADE, related_name='shangjia_kuozhan', to='orders.order', verbose_name='订单'),
),
migrations.AddIndex(
model_name='escortorder',
index=models.Index(fields=['MainPlayerID'], name='dingdan_pei_zhudash_583f4e_idx'),
),
migrations.AddIndex(
model_name='escortorder',
index=models.Index(fields=['Escort1ID'], name='dingdan_pei_peihu1__728279_idx'),
),
migrations.AddIndex(
model_name='escortorder',
index=models.Index(fields=['Escort2ID'], name='dingdan_pei_peihu2__77e45e_idx'),
),
migrations.AddIndex(
model_name='escortorder',
index=models.Index(fields=['Status'], name='dingdan_pei_zhuangt_22eaf6_idx'),
),
migrations.AddIndex(
model_name='chatsession',
index=models.Index(fields=['User1ID'], name='liaotian_user1_i_6be6cd_idx'),
),
migrations.AddIndex(
model_name='chatsession',
index=models.Index(fields=['User2ID'], name='liaotian_user2_i_9f61a4_idx'),
),
migrations.AddIndex(
model_name='chatsession',
index=models.Index(fields=['Status'], name='liaotian_zhuangt_5e8be5_idx'),
),
migrations.AddIndex(
model_name='platformorderext',
index=models.Index(fields=['BossID'], name='dingdan_pin_laoban__d55e6f_idx'),
),
migrations.AddIndex(
model_name='platformorderext',
index=models.Index(fields=['ShopID'], name='dingdan_pin_dianpu__9fbe27_idx'),
),
migrations.AddIndex(
model_name='penaltyappealimage',
index=models.Index(fields=['Penalty'], name='fadan_shens_fadan_i_78fab9_idx'),
),
migrations.AddIndex(
model_name='penaltyappealimage',
index=models.Index(fields=['PenalizedUserID'], name='fadan_shens_beichuf_59748e_idx'),
),
migrations.AddIndex(
model_name='merchantorderext',
index=models.Index(fields=['MerchantID'], name='dingdan_sha_shangji_64d28b_idx'),
),
]
+873 -336
View File
File diff suppressed because it is too large. Load diff
+2 -2
View File
@@ -14,7 +14,7 @@ def dingdan_guangbo(self, order_info):
异步并发广播订单模板消息给所有关注服务号的用户
order_info 字典字段示例:
{
'dingdan_id': 'PT123456',
'OrderID': 'PT123456',
'game_type': '王者荣耀',
'amount': '88.00',
'order_desc': '星耀上王者'
@@ -22,7 +22,7 @@ def dingdan_guangbo(self, order_info):
"""
sender = WeixinBroadcastSender()
template_data = sender.build_order_message_data(order_info)
order_id = order_info.get('dingdan_id')
order_id = order_info.get('OrderID')
# 查询所有已关注用户
try:
+7 -7
View File
@@ -39,7 +39,7 @@ def ensure_redis_loaded():
# 预加载redis模块
ensure_redis_loaded()
@receiver(pre_save, sender='orders.Dingdan')
@receiver(pre_save, sender='orders.Order')
def handle_order_status_8(sender, instance, **kwargs):
"""
订单状态变为8时的信号处理。
@@ -49,15 +49,15 @@ def handle_order_status_8(sender, instance, **kwargs):
if instance.pk is None:
return
try:
from orders.models import Dingdan
old = Dingdan.query.filter(pk=instance.pk).values_list('zhuangtai', flat=True).first()
if old != 8 and instance.zhuangtai == 8:
instance.status_8_time = timezone.now()
from orders.models import Order
old = Order.query.filter(pk=instance.pk).values_list('Status', flat=True).first()
if old != 8 and instance.Status == 8:
instance.SettlementTime = timezone.now()
instance.pending_dispatch = False
instance.auto_task_id = ''
instance.auto_expire_at = None
elif old == 8 and instance.zhuangtai != 8:
instance.status_8_time = None
elif old == 8 and instance.Status != 8:
instance.SettlementTime = None
instance.pending_dispatch = False
instance.auto_task_id = ''
except Exception as e:
+15 -15
View File
@@ -14,7 +14,7 @@ from decimal import Decimal
import logging
# 导入模型 - 确保路径正确
from orders.models import Dingdan
from orders.models import Order
from users.models import UserDashou, UserShangjia
from gvsdsdk.models import User
from utils.celery_utils import safe_decimal_operation, log_task_execution, rollback_on_failure
@@ -40,25 +40,25 @@ def process_expired_order(self, dingdan_id):
with transaction.atomic():
# 获取订单,同时锁定记录
order = Dingdan.objects.select_for_update().get(
dingdan_id=dingdan_id
order = Order.objects.select_for_update().get(
OrderID=dingdan_id
)
# 再次检查订单状态是否为8
if order.zhuangtai != 8:
logger.info(f"订单{dingdan_id}状态已不是8(当前:{order.zhuangtai}),跳过处理")
if order.Status != 8:
logger.info(f"订单{dingdan_id}状态已不是8(当前:{order.Status}),跳过处理")
return f"订单{dingdan_id}状态已变更,跳过处理"
# 获取发单平台类型
fadan_pingtai = order.fadan_pingtai
fadan_pingtai = order.Platform
# 获取打手ID和分成金额
dashou_id = order.jiedan_dashou_id
dashou_fencheng = safe_decimal_operation(order.dashou_fencheng)
dashou_id = order.PlayerID
dashou_fencheng = safe_decimal_operation(order.PlayerCommission)
# 1. 更新订单状态为3(已完成)
order.zhuangtai = 3
order.save(update_fields=['zhuangtai'])
order.Status = 3
order.save(update_fields=['Status'])
# 2. 更新打手信息(如果存在)
updated_dashou = False
@@ -121,7 +121,7 @@ def process_expired_order(self, dingdan_id):
log_task_execution(f"自动结算订单 {dingdan_id}", True, result_msg)
return result_msg
except Dingdan.DoesNotExist:
except Order.DoesNotExist:
error_msg = f"订单{dingdan_id}不存在"
logger.warning(error_msg)
return error_msg
@@ -155,10 +155,10 @@ def check_order_expire_task():
check_time = timezone.now() - timedelta(seconds=settings.ORDER_EXPIRE_SECONDS + 86400) # 48+24=72小时
# 查询状态为8且创建时间早于检查时间的订单
expired_orders = Dingdan.query.filter(
zhuangtai=8,
create_time__lt=check_time
).values_list('dingdan_id', flat=True)
expired_orders = Order.query.filter(
Status=8,
CreateTime__lt=check_time
).values_list('OrderID', flat=True)
expired_count = expired_orders.count()
+21 -21
View File
@@ -6,7 +6,7 @@ from django.db import transaction
from django.db.models import F
from config.models import DailyIncomeStat, DailyPayoutStat
from orders.models import Dingdan, DingdanPingtai, DingdanShangjia, Lilubiao
from orders.models import Order, PlatformOrderExt, MerchantOrderExt, CommissionRate
from products.models import Gsfenhong
from users.models import UserDashou, UserGuanshi
@@ -16,17 +16,17 @@ logger = logging.getLogger(__name__)
def get_order_user_id(order):
if order.fadan_pingtai == 1:
if order.Platform == 1:
try:
ext = DingdanPingtai.objects.get(dingdan=order)
return ext.laoban_id
except DingdanPingtai.DoesNotExist:
ext = PlatformOrderExt.objects.get(Order=order)
return ext.BossID
except PlatformOrderExt.DoesNotExist:
return None
elif order.fadan_pingtai == 2:
elif order.Platform == 2:
try:
ext = DingdanShangjia.objects.get(dingdan=order)
return ext.shangjia_id
except DingdanShangjia.DoesNotExist:
ext = MerchantOrderExt.objects.get(Order=order)
return ext.MerchantID
except MerchantOrderExt.DoesNotExist:
return None
return None
@@ -111,15 +111,15 @@ def calc_shangjia_order_fencheng(jine):
"""
jine = Decimal(str(jine))
try:
lilu_obj = Lilubiao.objects.get(fadanpingtai='3')
rate_dashou = Decimal(str(lilu_obj.lilu)) if lilu_obj.lilu and lilu_obj.lilu > 0 else Decimal('1')
except Lilubiao.DoesNotExist:
lilu_obj = CommissionRate.objects.get(Platform='3')
rate_dashou = Decimal(str(lilu_obj.Rate)) if lilu_obj.Rate and lilu_obj.Rate > 0 else Decimal('1')
except CommissionRate.DoesNotExist:
rate_dashou = Decimal('1')
lilu_guanshi_obj = Lilubiao.objects.filter(fadanpingtai='13').first()
lilu_guanshi_obj = CommissionRate.objects.filter(Platform='13').first()
rate_guanshi = (
Decimal(str(lilu_guanshi_obj.lilu))
if lilu_guanshi_obj and lilu_guanshi_obj.lilu is not None
Decimal(str(lilu_guanshi_obj.Rate))
if lilu_guanshi_obj and lilu_guanshi_obj.Rate is not None
else Decimal('0')
)
@@ -139,15 +139,15 @@ def settle_shangjia_order_guanshi_fenhong(order, dashou_id):
商家订单结单时结算管事分红(幂等,失败不抛异常阻断主流程)。
"""
if getattr(order, 'fadan_pingtai', None) != 2:
if getattr(order, 'Platform', None) != 2:
return
guanshi_fencheng = order.guanshi_fencheng or Decimal('0')
guanshi_fencheng = order.ManagerCommission or Decimal('0')
if guanshi_fencheng <= 0:
return
if Gsfenhong.objects.filter(dingdan_id=order.dingdan_id).exists():
logger.info(f"商家订单管事分红已处理: {order.dingdan_id}")
if Gsfenhong.objects.filter(dingdan_id=order.OrderID).exists():
logger.info(f"商家订单管事分红已处理: {order.OrderID}")
return
if not dashou_id:
@@ -174,7 +174,7 @@ def settle_shangjia_order_guanshi_fenhong(order, dashou_id):
user_main = dashou.user
Gsfenhong.objects.create(
dingdan_id=order.dingdan_id,
dingdan_id=order.OrderID,
guanshi=guanshi_id,
dashouid=dashou_id,
shuoming='商家订单分红',
@@ -184,7 +184,7 @@ def settle_shangjia_order_guanshi_fenhong(order, dashou_id):
fenhong_leixing=3,
)
logger.info(
f"商家订单管事分红成功: 订单{order.dingdan_id}, 管事{guanshi_id}, "
f"商家订单管事分红成功: 订单{order.OrderID}, 管事{guanshi_id}, "
f"打手{dashou_id}, 金额{guanshi_fencheng}元"
)
except UserGuanshi.DoesNotExist:
+874 -874
View File
File diff suppressed because it is too large. Load diff
+18 -18
View File
@@ -50,10 +50,10 @@ from users.models import (
)
from gvsdsdk.models import User
from orders.models import Lilubiao
from orders.models import CommissionRate
from config.models import Szjilu, Gonggao, Lunbo
from orders.models import Fadan # 用于罚款类型
from orders.models import Penalty # 用于罚款类型
import traceback
@@ -615,7 +615,7 @@ class YajinHuitiao(View):
logger.info(f"打手押金更新成功: 用户{order.yonghuid}, 增加{order_amount_yuan}元, 新押金{dashou.yajin}")
# 8b. 押金分红(仅微信确认到账后;费率 Lilubiao fadanpingtai=12)
# 8b. 押金分红(仅微信确认到账后;费率 CommissionRate Platform=12)
try:
guanshi_id = dashou.yaoqingren
@@ -624,8 +624,8 @@ class YajinHuitiao(View):
elif Gsfenhong.query.filter(dingdan_id=order.dingdan_id).exists():
logger.info(f"押金分红已处理: 订单{order.dingdan_id}")
else:
lilu_obj = Lilubiao.query.filter(fadanpingtai='12').first()
rate = lilu_obj.lilu if lilu_obj and lilu_obj.lilu is not None else Decimal('0')
lilu_obj = CommissionRate.query.filter(Platform='12').first()
rate = lilu_obj.Rate if lilu_obj and lilu_obj.Rate is not None else Decimal('0')
if rate <= 0:
logger.info(f"押金分红跳过: 费率未配置或为0")
else:
@@ -6036,7 +6036,7 @@ class CzhqdyView(APIView):
'name': '打手押金抵扣',
'profile_attr': 'dashou_profile', # 与打手佣金共用扩展表
'balance_field': 'yajin', # 押金字段
'rate_key': '11', # 押金提现费率对应的 fadanpingtai
'rate_key': '11', # 押金提现费率对应的 Platform
'model': UserDashou,
},
]
@@ -6089,18 +6089,18 @@ class CzhqdyView(APIView):
elif leixing == 4:
# 罚款缴纳
try:
fadan = Fadan.query.get(id=fadan_id, beichufa_id=user.yonghuid)
target_price = fadan.fakuanjine
except Fadan.DoesNotExist:
fadan = Penalty.query.get(id=fadan_id, PenalizedUserID=user.yonghuid)
target_price = fadan.FineAmount
except Penalty.DoesNotExist:
return Response({'code': 404, 'msg': '罚单不存在或不属于当前用户'}, status=status.HTTP_404_NOT_FOUND)
# 获取所有费率(打手佣金、管事分红、组长分红、打手押金)
rates = {}
for key in ['5', '6', '8', '11']:
try:
rate_obj = Lilubiao.query.get(fadanpingtai=key)
rates[key] = rate_obj.lilu
except Lilubiao.DoesNotExist:
rate_obj = CommissionRate.query.get(Platform=key)
rates[key] = rate_obj.Rate
except CommissionRate.DoesNotExist:
rates[key] = None # 未配置则跳过
# 构建可用身份列表
@@ -6228,18 +6228,18 @@ class DsqrgmdhView(APIView):
if not fadan_id:
return Response({'code': 400, 'msg': '缺少罚单ID'}, status=status.HTTP_400_BAD_REQUEST)
try:
fadan_obj = Fadan.query.get(id=fadan_id, beichufa_id=request.user.yonghuid)
target_price = fadan_obj.fakuanjine
except Fadan.DoesNotExist:
fadan_obj = Penalty.query.get(id=fadan_id, PenalizedUserID=request.user.yonghuid)
target_price = fadan_obj.FineAmount
except Penalty.DoesNotExist:
return Response({'code': 404, 'msg': '罚单不存在或不属于当前用户'}, status=status.HTTP_404_NOT_FOUND)
identity = IDENTITY_CONFIG.get(shenfen_id)
try:
rate_obj = Lilubiao.query.get(fadanpingtai=identity['rate_key'])
rate = rate_obj.lilu
rate_obj = CommissionRate.query.get(Platform=identity['rate_key'])
rate = rate_obj.Rate
if rate >= 1:
return Response({'code': 400, 'msg': f"{identity['name']}费率异常"}, status=status.HTTP_400_BAD_REQUEST)
except Lilubiao.DoesNotExist:
except CommissionRate.DoesNotExist:
return Response({'code': 400, 'msg': f"{identity['name']}费率未配置"}, status=status.HTTP_400_BAD_REQUEST)
logger.info(f"目标价格={target_price}, 费率={rate}")
@@ -0,0 +1,25 @@
# Generated by Django 4.2.27 on 2026-06-18 17:46
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('orders', '0002_chatsession_commissionrate_escortorder_and_more'),
('rank', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='dashoubiaoxian',
name='dingdan',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='biaoxian', to='orders.order', to_field='OrderID', verbose_name='关联订单'),
),
migrations.AlterField(
model_name='dingdanbiaoqian',
name='dingdan',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='orders.order', to_field='OrderID', verbose_name='订单'),
),
]
+4 -4
View File
@@ -1,7 +1,7 @@
from django.db import models
from gvsdsdk.model_base import QModel
from django.conf import settings
from orders.models import Dingdan
from orders.models import Order
# ==================== 板块表 ====================
class Bankuai(QModel):
@@ -20,7 +20,7 @@ class Bankuai(QModel):
# ==================== 打手订单表现记录 ====================
class DashouBiaoxian(QModel):
dingdan = models.ForeignKey('orders.Dingdan', to_field='dingdan_id', on_delete=models.CASCADE, related_name='biaoxian', verbose_name='关联订单', db_index=True)
dingdan = models.ForeignKey('orders.Order', to_field='OrderID', on_delete=models.CASCADE, related_name='biaoxian', verbose_name='关联订单', db_index=True)
dashou_id = models.CharField(max_length=32, db_index=True, verbose_name='打手ID')
bankuai = models.ForeignKey(Bankuai, on_delete=models.PROTECT, to_field='bankuai_id', verbose_name='所属板块', db_index=True,null=True)
@@ -98,8 +98,8 @@ class YonghuChenghao(QModel):
class DingdanBiaoqian(QModel):
"""订单需求标签关联表"""
dingdan = models.ForeignKey(
Dingdan,
to_field='dingdan_id', # 关联到字符串字段 dingdan_id
Order,
to_field='OrderID', # 关联到字符串字段 OrderID
on_delete=models.CASCADE,
verbose_name='订单',
db_index=True
+122 -122
View File
@@ -50,8 +50,8 @@ from shop.models import YonghuDianpuBangding, ShangpinLeixingDianpu, DianpuShang
from products.models import ShangpinLeixing, ShangpinZhuanqu, Shangpin, Huiyuan
from orders.models import (
Dingdan, DingdanPingtai, Dashoutupian, Tuikuanjilu,
OrderDashouHistory, Fadan
Order, PlatformOrderExt, PlayerDeliveryImage, RefundRecord,
OrderPlayerHistory, Penalty
)
logger = logging.getLogger(__name__)
@@ -2124,8 +2124,8 @@ class ShopOrderStatisticsView(APIView):
# 3. 获取本店铺所有订单的主键ID列表(通过平台扩展表)
order_pks = list(
DingdanPingtai.query.filter(dianpu_id=shop_id)
.values_list('dingdan_id', flat=True) # 这里取的是订单主表的主键id
PlatformOrderExt.query.filter(dianpu_id=shop_id)
.values_list('Order_id', flat=True) # 这里取的是订单主表的主键id
)
total_orders = 0
@@ -2134,15 +2134,15 @@ class ShopOrderStatisticsView(APIView):
if order_pks:
# 4. 用主键列表进行聚合统计,按商品类型和订单状态分组
aggregation = (
Dingdan.objects
Order.objects
.filter(id__in=order_pks) # 修正点:使用id__in,而不是dingdan_id__in
.values('leixing_id', 'zhuangtai')
.values('ProductTypeID', 'Status')
.annotate(cnt=Count('id'))
)
for row in aggregation:
lid = row['leixing_id'] # 商品类型ID
st = row['zhuangtai'] # 订单状态码
lid = row['ProductTypeID'] # 商品类型ID
st = row['Status'] # 订单状态码
cnt = row['cnt']
# 转为字符串键,方便前端展示
@@ -2217,12 +2217,12 @@ def _fetch_images(order, oss_domain):
punishment_info = {}
# 仅当订单有接单打手ID时才查询打手图片
if order.jiedan_dashou_id:
if order.PlayerID:
# 从打手图片表中查询该订单、该打手的所有图片记录
image_urls = Dashoutupian.query.filter(
dingdan_id=order.dingdan_id, # 订单ID匹配
dashou=order.jiedan_dashou_id # 接单打手ID匹配
).values_list('tupian', flat=True) # 只取图片URL字段
image_urls = PlayerDeliveryImage.query.filter(
OrderID=order.OrderID, # 订单ID匹配
PlayerID=order.PlayerID # 接单打手ID匹配
).values_list('ImageURL', flat=True) # 只取图片URL字段
# 遍历所有图片路径
for img_path in image_urls:
@@ -2258,7 +2258,7 @@ def _batch_images(orders, oss_domain):
with ThreadPoolExecutor(max_workers=10) as executor:
# 建立 future 到订单ID的映射
future_to_oid = {
executor.submit(_fetch_images, order, oss_domain): order.dingdan_id
executor.submit(_fetch_images, order, oss_domain): order.OrderID
for order in orders
}
# 等待所有任务完成
@@ -2353,9 +2353,9 @@ class ShopOrderManageView(APIView):
# ------------------------------------------------------------
# 从 DingdanPingtai 中过滤出属于当前店铺的订单扩展记录,并提取订单主表ID
order_ids = list(
DingdanPingtai.query.filter(
PlatformOrderExt.query.filter(
dianpu_id=shop_id # 店铺ID匹配
).values_list('dingdan_id', flat=True) # 只取订单ID字段
).values_list('Order_id', flat=True) # 只取订单ID字段
)
# 统计变量
@@ -2367,11 +2367,11 @@ class ShopOrderManageView(APIView):
# ------------------------------------------------------------
if order_ids:
# 使用 Django 聚合查询:按 leixing_id(商品类型)和 zhuangtai(订单状态)分组计数
aggregation = Dingdan.query.filter(
dingdan_id__in=order_ids # 从该店铺的订单中查询
aggregation = Order.query.filter(
OrderID__in=order_ids # 从该店铺的订单中查询
).values(
'leixing_id', # 按类型ID分组
'zhuangtai' # 按状态分组
'ProductTypeID', # 按类型ID分组
'Status' # 按状态分组
).annotate(
cnt=Count('id') # 统计每个分组的记录数
)
@@ -2379,8 +2379,8 @@ class ShopOrderManageView(APIView):
# 遍历每个聚合结果,累加到对应的类型和全局计数中
for row in aggregation:
# 提取分组字段
lid = row['leixing_id'] # 商品类型ID
st = row['zhuangtai'] # 订单状态码
lid = row['ProductTypeID'] # 商品类型ID
st = row['Status'] # 订单状态码
cnt = row['cnt'] # 该分组下的订单数量
# 累加到全局总数
@@ -2434,25 +2434,25 @@ class ShopOrderManageView(APIView):
page_size = request.data.get('page_size', 20)
# 基础查询:从平台扩展表关联订单主表,并按创建时间倒序
qs = DingdanPingtai.query.filter(
qs = PlatformOrderExt.query.filter(
dianpu_id=shop_id
).select_related('dingdan').order_by('-dingdan__create_time')
).select_related('Order').order_by('-Order__CreateTime')
# 应用筛选条件
if leixing_id is not None:
qs = qs.filter(dingdan__leixing_id=leixing_id)
qs = qs.filter(Order__ProductTypeID=leixing_id)
if zhuangtai is not None:
qs = qs.filter(dingdan__zhuangtai=zhuangtai)
qs = qs.filter(Order__Status=zhuangtai)
if dingdan_id_key:
qs = qs.filter(dingdan__dingdan_id__icontains=dingdan_id_key)
qs = qs.filter(Order__OrderID__icontains=dingdan_id_key)
if jiedan_dashou_id_key:
qs = qs.filter(dingdan__jiedan_dashou_id=jiedan_dashou_id_key)
qs = qs.filter(Order__PlayerID=jiedan_dashou_id_key)
if nicheng_key:
qs = qs.filter(dingdan__nicheng__icontains=nicheng_key)
qs = qs.filter(Order__Nickname__icontains=nicheng_key)
if laoban_id_key:
qs = qs.filter(laoban_id=laoban_id_key)
qs = qs.filter(BossID=laoban_id_key)
if jieshao_key:
qs = qs.filter(dingdan__jieshao__icontains=jieshao_key)
qs = qs.filter(Order__Description__icontains=jieshao_key)
# 分页
paginator = Paginator(qs, page_size)
@@ -2462,7 +2462,7 @@ class ShopOrderManageView(APIView):
page_obj = paginator.page(1)
# 获取当前页的所有订单和扩展对象
orders_with_ext = [(item.dingdan, item) for item in page_obj]
orders_with_ext = [(item.Order, item) for item in page_obj]
# 提取订单对象列表,用于并发获取图片
order_objs = [order for order, _ in orders_with_ext]
oss_domain = get_oss_domain()
@@ -2471,27 +2471,27 @@ class ShopOrderManageView(APIView):
# 构建返回数据
list_data = []
for order, ext in orders_with_ext:
imgs, is_pun, _ = img_map.get(order.dingdan_id, ([], False, {}))
imgs, is_pun, _ = img_map.get(order.OrderID, ([], False, {}))
list_data.append({
'dingdan_id': order.dingdan_id,
'zhuangtai': order.zhuangtai,
'jine': float(order.jine) if order.jine else 0.00,
'dashou_fencheng': float(order.dashou_fencheng) if order.dashou_fencheng else 0.00,
'jiedan_dashou_id': order.jiedan_dashou_id or '',
'dingdan_id': order.OrderID,
'zhuangtai': order.Status,
'jine': float(order.Amount) if order.Amount else 0.00,
'dashou_fencheng': float(order.PlayerCommission) if order.PlayerCommission else 0.00,
'jiedan_dashou_id': order.PlayerID or '',
'dashou_liuyan': order.dashou_liuyan or '',
'zhiding_id': order.zhiding_id or '',
'shangpin_id': order.shangpin_id or '',
'tupian': order.tupian or '',
'jieshao': order.jieshao or '',
'beizhu': order.beizhu or '',
'nicheng': order.nicheng or '',
'leixing_id': order.leixing_id,
'create_time': order.create_time.strftime('%Y-%m-%d %H:%M:%S') if order.create_time else '',
'update_time': order.update_time.strftime('%Y-%m-%d %H:%M:%S') if order.update_time else '',
'shangpin_id': order.ProductID or '',
'tupian': order.ImageURL or '',
'jieshao': order.Description or '',
'beizhu': order.Remark or '',
'nicheng': order.Nickname or '',
'leixing_id': order.ProductTypeID,
'create_time': order.CreateTime.strftime('%Y-%m-%d %H:%M:%S') if order.CreateTime else '',
'update_time': order.UpdateTime.strftime('%Y-%m-%d %H:%M:%S') if order.UpdateTime else '',
'pingtai_kuozhan': {
'laoban_id': ext.laoban_id or '',
'laoban_pingjia': ext.laoban_pingjia or '',
'dianpu_shouyi': float(ext.dianpu_shouyi) if ext.dianpu_shouyi else 0.00,
'laoban_id': ext.BossID or '',
'laoban_pingjia': ext.BossReview or '',
'dianpu_shouyi': float(ext.ShopIncome) if ext.ShopIncome else 0.00,
},
'dashou_images': imgs,
'is_punished': is_pun,
@@ -2554,19 +2554,19 @@ class ShopRefundView(APIView):
# 3. 查询订单,必须属于本店铺(通过扩展表关联)
try:
# 通过扩展表确认归属,并 select_related 获取订单主表
pingtai_ext = DingdanPingtai.query.select_related('dingdan').get(
pingtai_ext = PlatformOrderExt.query.select_related('Order').get(
dianpu_id=shop_id,
dingdan__dingdan_id=dingdan_id
Order__OrderID=dingdan_id
)
order = pingtai_ext.dingdan
except DingdanPingtai.DoesNotExist:
order = pingtai_ext.Order
except PlatformOrderExt.DoesNotExist:
logger.warning(f"订单 {dingdan_id} 不属于店铺 {shop_id} 或不存在")
return Response({'code': 404, 'msg': '订单不存在或不属于本店铺'})
# 4. 订单状态校验(只有这些状态可退款)
allowed_statuses = [1, 7, 2, 8, 4]
if order.zhuangtai not in allowed_statuses:
logger.warning(f"订单状态不允许退款: {order.zhuangtai}")
if order.Status not in allowed_statuses:
logger.warning(f"订单状态不允许退款: {order.Status}")
return Response({'code': 400, 'msg': '订单状态不允许退款'})
# 5. 全部视为平台订单(我方派单),调用微信退款
@@ -2575,14 +2575,14 @@ class ShopRefundView(APIView):
return Response({'code': 400, 'msg': refund_result['msg']})
# 6. 事务内更新订单、打手、记录、统计
dashou_id = order.jiedan_dashou_id
dashou_id = order.PlayerID
try:
with transaction.atomic():
# 更新订单状态为已退款
order.zhuangtai = 5
order.clkf = str(shop_id) # 处理人记录为店铺ID
order.Status = 5
order.AssignedCS = str(shop_id) # 处理人记录为店铺ID
if reason:
order.tkly = reason
order.RefundReason = reason
order.save()
# 更新打手统计(退款量+1,状态置为空闲)
@@ -2603,7 +2603,7 @@ class ShopRefundView(APIView):
try:
update_dashou_daily_by_action(
yonghuid=dashou_id,
amount=order.dashou_fencheng or Decimal('0.00'),
amount=order.PlayerCommission or Decimal('0.00'),
action=3 # 3 表示退款
)
except Exception as e:
@@ -2611,25 +2611,25 @@ class ShopRefundView(APIView):
# 更新平台支出记录
try:
update_daily_payout(order.jine)
update_daily_payout(order.Amount)
except Exception as e:
logger.error(f"更新每日支出失败: {e}")
# ========== 新增:商品和店铺每日统计 ==========
try:
# 商品每日统计(只要有商品ID就执行)
if order.shangpin_id:
if order.ProductID:
# 从扩展表获取已计算好的收益值(下单时已存储)
pingtai_shouyi = Decimal('0.00')
dianpu_shouyi = Decimal('0.00')
if hasattr(order, 'pingtai_kuozhan'):
pingtai_shouyi = order.pingtai_kuozhan.pingtai_shouyi or Decimal('0.00')
dianpu_shouyi = order.pingtai_kuozhan.dianpu_shouyi or Decimal('0.00')
pingtai_shouyi = order.pingtai_kuozhan.PlatformIncome or Decimal('0.00')
dianpu_shouyi = order.pingtai_kuozhan.ShopIncome or Decimal('0.00')
update_shangpin_daily_stat(
shangpin_id=order.shangpin_id,
shangpin_id=order.ProductID,
caozuo_leixing=3, # 3 = 退款
dingdan_jiage=order.jine,
dingdan_jiage=order.Amount,
pingtai_shouyi=pingtai_shouyi,
dianpu_zongshouyi=dianpu_shouyi
)
@@ -2640,11 +2640,11 @@ class ShopRefundView(APIView):
if hasattr(order, 'pingtai_kuozhan'):
dianpu_id = order.pingtai_kuozhan.dianpu_id
if dianpu_id:
dianpu_shouyi = order.pingtai_kuozhan.dianpu_shouyi or Decimal('0.00')
dianpu_shouyi = order.pingtai_kuozhan.ShopIncome or Decimal('0.00')
update_dianpu_daily_stat(
dianpu_id=dianpu_id,
caozuo_leixing=3, # 3 = 退款
dingdan_jiage=order.jine,
dingdan_jiage=order.Amount,
dianpu_shouyi=dianpu_shouyi
)
logger.info(f"店铺统计更新完成,店铺ID: {dianpu_id}")
@@ -2672,8 +2672,8 @@ class ShopRefundView(APIView):
if not all([appid, mch_id, key, cert_path, key_path]):
return {'code': 500, 'msg': '微信支付配置不完整'}
out_refund_no = self._generate_refund_no(order.dingdan_id)
total_fee = int(float(order.jine or 0) * 100)
out_refund_no = self._generate_refund_no(order.OrderID)
total_fee = int(float(order.Amount or 0) * 100)
refund_fee = total_fee
params = {
@@ -2685,10 +2685,10 @@ class ShopRefundView(APIView):
'refund_fee': refund_fee,
'refund_desc': '店铺退款',
}
if order.wechat_transaction_id:
params['transaction_id'] = order.wechat_transaction_id
if order.WechatTransactionID:
params['transaction_id'] = order.WechatTransactionID
else:
params['out_trade_no'] = order.dingdan_id
params['out_trade_no'] = order.OrderID
# 签名
sorted_keys = sorted(params.keys())
@@ -2718,26 +2718,26 @@ class ShopRefundView(APIView):
def _update_refund_record(self, order, dashou_id, chuli_id, reason):
"""更新退款记录表"""
try:
refund_record, created = Tuikuanjilu.query.get_or_create(
dingdan_id=order.dingdan_id,
refund_record, created = RefundRecord.query.get_or_create(
OrderID=order.OrderID,
defaults={
'dashouid': dashou_id or '',
'qingqiuid': '',
'chuliid': chuli_id,
'liyou': reason or '店铺退款',
'sqzhuangtai': 1,
'jine': order.jine or 0,
'dashou_fencheng': order.dashou_fencheng or 0,
'jieshao': order.jieshao or '',
'beizhu': '店铺退款',
'nicheng': order.nicheng or '',
'PlayerID': dashou_id or '',
'ApplicantID': '',
'ProcessorID': chuli_id,
'Reason': reason or '店铺退款',
'ApplyStatus': 1,
'Amount': order.Amount or 0,
'PlayerCommission': order.PlayerCommission or 0,
'Description': order.Description or '',
'Remark': '店铺退款',
'Nickname': order.Nickname or '',
}
)
if not created:
refund_record.sqzhuangtai = 1
refund_record.chuliid = chuli_id
refund_record.ApplyStatus = 1
refund_record.ProcessorID = chuli_id
if reason:
refund_record.liyou = reason
refund_record.Reason = reason
refund_record.save()
except Exception as e:
logger.error(f"更新退款记录异常: {e}")
@@ -2801,28 +2801,28 @@ class ShopForceCompleteView(APIView):
# ========== 3. 查询订单并验证归属 ==========
try:
# 通过平台扩展表确认订单属于本店铺
pingtai_ext = DingdanPingtai.query.select_related('dingdan').get(
pingtai_ext = PlatformOrderExt.query.select_related('Order').get(
dianpu_id=shop_id,
dingdan__dingdan_id=dingdan_id
Order__OrderID=dingdan_id
)
order = pingtai_ext.dingdan
except DingdanPingtai.DoesNotExist:
order = pingtai_ext.Order
except PlatformOrderExt.DoesNotExist:
logger.warning(f"订单 {dingdan_id} 不属于店铺 {shop_id} 或不存在")
return Response({'code': 404, 'msg': '订单不存在或不属于本店铺'})
# ========== 4. 校验订单状态必须为 8(结算中) ==========
if order.zhuangtai != 8:
logger.warning(f"订单 {dingdan_id} 当前状态为 {order.zhuangtai},不是结算中")
return Response({'code': 400, 'msg': f'订单状态不是结算中,当前状态: {order.zhuangtai}'})
if order.Status != 8:
logger.warning(f"订单 {dingdan_id} 当前状态为 {order.Status},不是结算中")
return Response({'code': 400, 'msg': f'订单状态不是结算中,当前状态: {order.Status}'})
dashou_id = order.jiedan_dashou_id
dashou_fencheng = order.dashou_fencheng or Decimal('0.00')
jine = order.jine or Decimal('0.00')
dashou_id = order.PlayerID
dashou_fencheng = order.PlayerCommission or Decimal('0.00')
jine = order.Amount or Decimal('0.00')
try:
with transaction.atomic():
# 锁定订单行,防止并发
order = Dingdan.objects.select_for_update().get(dingdan_id=dingdan_id)
order = Order.objects.select_for_update().get(OrderID=dingdan_id)
if not dashou_id:
return Response({'code': 400, 'msg': '订单无接单打手,无法结算'})
@@ -2844,8 +2844,8 @@ class ShopForceCompleteView(APIView):
logger.warning(f"本地订单结算:打手 {dashou_id} 不存在,跳过打手更新")
# ---------- 更新订单状态 ----------
order.zhuangtai = 3
order.clkf = str(shop_id)
order.Status = 3
order.AssignedCS = str(shop_id)
order.save()
# ---------- 打手每日统计(成交) ----------
@@ -2859,21 +2859,21 @@ class ShopForceCompleteView(APIView):
logger.error(f"打手每日统计更新失败: {e}")
# ---------- 店铺收益统计(结算) ----------
if pingtai_ext.dianpu_shouyi:
if pingtai_ext.ShopIncome:
try:
# 商品每日统计(只要有商品ID就执行)
if order.shangpin_id:
if order.ProductID:
# 从扩展表获取已计算好的收益值(下单时已存储)
pingtai_shouyi = Decimal('0.00')
dianpu_shouyi = Decimal('0.00')
if hasattr(order, 'pingtai_kuozhan'):
pingtai_shouyi = order.pingtai_kuozhan.pingtai_shouyi or Decimal('0.00')
dianpu_shouyi = order.pingtai_kuozhan.dianpu_shouyi or Decimal('0.00')
pingtai_shouyi = order.pingtai_kuozhan.PlatformIncome or Decimal('0.00')
dianpu_shouyi = order.pingtai_kuozhan.ShopIncome or Decimal('0.00')
update_shangpin_daily_stat(
shangpin_id=order.shangpin_id,
shangpin_id=order.ProductID,
caozuo_leixing=2, # 3 = 退款
dingdan_jiage=order.jine,
dingdan_jiage=order.Amount,
pingtai_shouyi=pingtai_shouyi,
dianpu_zongshouyi=dianpu_shouyi
)
@@ -2884,7 +2884,7 @@ class ShopForceCompleteView(APIView):
dianpu_id=shop_id,
caozuo_leixing=2, # 结算操作
dingdan_jiage=jine,
dianpu_shouyi=pingtai_ext.dianpu_shouyi,
dianpu_shouyi=pingtai_ext.ShopIncome,
)
except Exception as e:
logger.error(f"店铺每日统计更新失败: {e}")
@@ -2894,7 +2894,7 @@ class ShopForceCompleteView(APIView):
return Response({'code': 200, 'msg': '强制结单成功'})
except Dingdan.DoesNotExist:
except Order.DoesNotExist:
logger.warning(f"订单不存在: {dingdan_id}")
return Response({'code': 404, 'msg': '订单不存在'})
except Exception as e:
@@ -2950,36 +2950,36 @@ class ShopTransferHallView(APIView):
# ---------- 3. 验证订单归属 ----------
try:
pingtai_ext = DingdanPingtai.query.select_related('dingdan').get(
pingtai_ext = PlatformOrderExt.query.select_related('Order').get(
dianpu_id=shop_id,
dingdan__dingdan_id=dingdan_id
Order__OrderID=dingdan_id
)
order = pingtai_ext.dingdan
except DingdanPingtai.DoesNotExist:
order = pingtai_ext.Order
except PlatformOrderExt.DoesNotExist:
logger.warning(f"订单 {dingdan_id} 不属于店铺 {shop_id} 或不存在")
return Response({'code': 404, 'msg': '订单不存在或不属于本店铺'})
# ---------- 4. 状态校验 ----------
if order.zhuangtai not in [2, 8, 4]:
return Response({'code': 400, 'msg': f'订单状态不允许转移大厅,当前状态: {order.zhuangtai}'})
if order.Status not in [2, 8, 4]:
return Response({'code': 400, 'msg': f'订单状态不允许转移大厅,当前状态: {order.Status}'})
# ---------- 5. 提取关键字段 ----------
current_dashou_id = order.jiedan_dashou_id
current_dashou_id = order.PlayerID
zhiding_id = order.zhiding_id
dashou_fencheng = order.dashou_fencheng or 0 # 用于退款统计
dashou_fencheng = order.PlayerCommission or 0 # 用于退款统计
try:
with transaction.atomic():
# 锁定订单行
order = Dingdan.objects.select_for_update().get(dingdan_id=dingdan_id)
order = Order.objects.select_for_update().get(OrderID=dingdan_id)
# ---------- 6. 记录打手历史(原接口保留逻辑) ----------
if current_dashou_id:
last_history = OrderDashouHistory.query.filter(
last_history = OrderPlayerHistory.query.filter(
dingdan_id=dingdan_id
).order_by('-times').first()
next_times = (last_history.times + 1) if last_history else 1
OrderDashouHistory.query.create(
OrderPlayerHistory.query.create(
dingdan_id=dingdan_id,
dashou_id=current_dashou_id,
times=next_times,
@@ -3017,7 +3017,7 @@ class ShopTransferHallView(APIView):
logger.info(f"转移大厅成功,订单 {dingdan_id}")
return Response({'code': 200, 'msg': '转移大厅成功'})
except Dingdan.DoesNotExist:
except Order.DoesNotExist:
return Response({'code': 404, 'msg': '订单不存在'})
except Exception as e:
logger.error(f"转移大厅接口异常: {str(e)}", exc_info=True)
@@ -3085,7 +3085,7 @@ class ShopFineApplyView(APIView):
return Response({'code': 404, 'msg': '订单不存在或不属于本店铺'})
# ---------- 4. 获取打手ID ----------
dashou_id = order.jiedan_dashou_id
dashou_id = order.PlayerID
if not dashou_id:
return Response({'code': 400, 'msg': '该订单无接单打手,无法罚款'})
+43 -43
View File
@@ -5,7 +5,7 @@ import logging
from decimal import Decimal
from django.db import transaction
from orders.models import Fadan, FadanFenhong, FadanFenhongLilv
from orders.models import Penalty, PenaltyBonus, PenaltyBonusRate
from users.models import UserShangjia
logger = logging.getLogger(__name__)
@@ -32,14 +32,14 @@ def process_fadan_fenhong(fadan_id):
try:
# 1. 获取罚单对象(必须是已缴纳状态)
try:
fadan = Fadan.objects.get(id=fadan_id, zhuangtai=2)
except Fadan.DoesNotExist:
fadan = Penalty.objects.get(id=fadan_id, Status=2)
except Penalty.DoesNotExist:
logger.error(f"罚单 {fadan_id} 不存在或状态不是已缴纳")
return False, "罚单不存在或状态异常"
# 2. 获取申请处罚者ID和身份(源身份数字)
shenqing_chufa = fadan.shenqing_chufa
src_shenfen = fadan.shenqingren_shenfen
shenqing_chufa = fadan.ApplicantID
src_shenfen = fadan.ApplicantIdentity
if not shenqing_chufa:
logger.info(f"罚单 {fadan_id} 无申请处罚者,不进行分红")
@@ -56,27 +56,27 @@ def process_fadan_fenhong(fadan_id):
lilv_shenfen = mapped['lilv'] # 用于 FadanFenhongLilv.shenfen
# 4. 获取罚款金额
fakuan_jine = fadan.fakuanjine
fakuan_jine = fadan.FineAmount
if fakuan_jine <= 0:
logger.info(f"罚单 {fadan_id} 罚款金额为0,不产生分红")
fadan.shenqingren_fenhong_jine = Decimal('0.00')
fadan.save(update_fields=['shenqingren_fenhong_jine'])
fadan.ApplicantBonusAmount = Decimal('0.00')
fadan.save(update_fields=['ApplicantBonusAmount'])
return True, "罚款金额为0,无分红"
# 5. 确定分红利率
rate = _get_fenhong_rate(shenqing_chufa, fenhong_shenfen, lilv_shenfen)
if rate is None:
logger.warning(f"未找到身份 {src_shenfen} (映射后 fenhong_shenfen={fenhong_shenfen}, lilv_shenfen={lilv_shenfen}) 的分红利率,罚单 {fadan_id} 不进行分红")
fadan.shenqingren_fenhong_jine = Decimal('0.00')
fadan.save(update_fields=['shenqingren_fenhong_jine'])
fadan.ApplicantBonusAmount = Decimal('0.00')
fadan.save(update_fields=['ApplicantBonusAmount'])
return True, "未配置分红利率,无分红"
# 6. 计算分红金额
fenhong_jine = (Decimal(str(fakuan_jine)) * Decimal(str(rate))).quantize(Decimal('0.01'))
if fenhong_jine <= 0:
logger.info(f"罚单 {fadan_id} 计算分红金额为0,无需处理")
fadan.shenqingren_fenhong_jine = Decimal('0.00')
fadan.save(update_fields=['shenqingren_fenhong_jine'])
fadan.ApplicantBonusAmount = Decimal('0.00')
fadan.save(update_fields=['ApplicantBonusAmount'])
return True, "分红金额为0"
# 7. 根据申请处罚者身份执行不同的分红逻辑
@@ -84,20 +84,20 @@ def process_fadan_fenhong(fadan_id):
if src_shenfen == 5:
# 商家特殊处理:只记录总额,可提现分红永远为0,直接加到商家余额
with transaction.atomic():
fenhong_record, created = FadanFenhong.objects.get_or_create(
fenhongzhe_id=shenqing_chufa,
shenfen=fenhong_shenfen,
fenhong_record, created = PenaltyBonus.objects.get_or_create(
BeneficiaryID=shenqing_chufa,
Identity=fenhong_shenfen,
defaults={
'zonge': Decimal('0.00'),
'ketixian_fenhong': Decimal('0.00'),
'fenhong_cishu': 0,
'yingde_lilv': rate,
'TotalAmount': Decimal('0.00'),
'WithdrawableAmount': Decimal('0.00'),
'BonusCount': 0,
'IndividualRate': rate,
'is_individual_rate': False
}
)
fenhong_record.zonge += fenhong_jine
fenhong_record.TotalAmount += fenhong_jine
# 可提现分红不累加,保持0
fenhong_record.fenhong_cishu += 1
fenhong_record.BonusCount += 1
fenhong_record.save()
# 直接增加商家余额(UserShangjia.yue)
@@ -111,31 +111,31 @@ def process_fadan_fenhong(fadan_id):
raise Exception(f"商家 {shenqing_chufa} 扩展表不存在,无法增加余额")
# 更新罚单中的申请人分红金额
fadan.shenqingren_fenhong_jine = fenhong_jine
fadan.save(update_fields=['shenqingren_fenhong_jine'])
fadan.ApplicantBonusAmount = fenhong_jine
fadan.save(update_fields=['ApplicantBonusAmount'])
else:
# 其他身份(客服、售后、管理员、店铺):同时增加总额和可提现分红
with transaction.atomic():
fenhong_record, created = FadanFenhong.objects.get_or_create(
fenhongzhe_id=shenqing_chufa,
shenfen=fenhong_shenfen,
fenhong_record, created = PenaltyBonus.objects.get_or_create(
BeneficiaryID=shenqing_chufa,
Identity=fenhong_shenfen,
defaults={
'zonge': Decimal('0.00'),
'ketixian_fenhong': Decimal('0.00'),
'fenhong_cishu': 0,
'yingde_lilv': rate,
'TotalAmount': Decimal('0.00'),
'WithdrawableAmount': Decimal('0.00'),
'BonusCount': 0,
'IndividualRate': rate,
'is_individual_rate': False
}
)
fenhong_record.zonge += fenhong_jine
fenhong_record.ketixian_fenhong += fenhong_jine
fenhong_record.fenhong_cishu += 1
fenhong_record.TotalAmount += fenhong_jine
fenhong_record.WithdrawableAmount += fenhong_jine
fenhong_record.BonusCount += 1
fenhong_record.save()
# 更新罚单中的申请人分红金额
fadan.shenqingren_fenhong_jine = fenhong_jine
fadan.save(update_fields=['shenqingren_fenhong_jine'])
fadan.ApplicantBonusAmount = fenhong_jine
fadan.save(update_fields=['ApplicantBonusAmount'])
logger.info(f"罚单 {fadan_id} 分红处理成功: 申请者 {shenqing_chufa}, 分红金额 {fenhong_jine} 元, 源身份 {src_shenfen}, 映射后分红身份 {fenhong_shenfen}")
return True, "分红处理成功"
@@ -150,17 +150,17 @@ def _get_fenhong_rate(fenhongzhe_id, fenhong_shenfen, lilv_shenfen):
获取分红利率(优先使用个人单独配置,否则使用全局身份配置)
"""
try:
individual = FadanFenhong.objects.get(
fenhongzhe_id=fenhongzhe_id,
shenfen=fenhong_shenfen,
individual = PenaltyBonus.objects.get(
BeneficiaryID=fenhongzhe_id,
Identity=fenhong_shenfen,
is_individual_rate=True
)
return individual.yingde_lilv
except FadanFenhong.DoesNotExist:
return individual.IndividualRate
except PenaltyBonus.DoesNotExist:
pass
try:
global_rate = FadanFenhongLilv.objects.get(shenfen=lilv_shenfen)
return global_rate.lilv
except FadanFenhongLilv.DoesNotExist:
global_rate = PenaltyBonusRate.objects.get(Identity=lilv_shenfen)
return global_rate.Rate
except PenaltyBonusRate.DoesNotExist:
return None
+21 -21
View File
@@ -25,7 +25,7 @@ from django.conf import settings
from django.db import transaction
from django.utils import timezone
from orders.models import Dingdan, DingdanShangjia, Fadan, Lilubiao
from orders.models import Order, MerchantOrderExt, Penalty, CommissionRate
from config.models import Szjilu, TixianQuotaDefault
from utils.fadan_utils import check_fadan_qiangdan_eligible
@@ -153,10 +153,10 @@ def get_tixian_feilv(leixing):
rate_key = LEIXING_RATE_KEY.get(leixing)
if not rate_key:
raise ValueError('无效的提现类型')
rate_obj = Lilubiao.query.filter(fadanpingtai=rate_key).first()
rate_obj = CommissionRate.query.filter(Platform=rate_key).first()
if not rate_obj:
raise ValueError(f'提现费率未配置(类型{leixing})')
return decimal.Decimal(str(rate_obj.lilu))
return decimal.Decimal(str(rate_obj.Rate))
def calc_fee_amounts(jine, feilv):
@@ -261,12 +261,12 @@ def validate_withdraw_eligibility(user_main, leixing, jine):
return False, huiyuan_msg, {}
if dashou.yajin < jine:
return False, f'押金余额不足,当前押金: {dashou.yajin}', {}
unfinished = Dingdan.query.filter(
jiedan_dashou_id=yonghuid,
).exclude(zhuangtai__in=[ORDER_STATUS_COMPLETED, ORDER_STATUS_REFUNDED]).exists()
unfinished = Order.query.filter(
PlayerID=yonghuid,
).exclude(Status__in=[ORDER_STATUS_COMPLETED, ORDER_STATUS_REFUNDED]).exists()
if unfinished:
return False, '您还有未完成或未退款的订单,请先处理完毕再提取押金', {}
self_fadan = Fadan.query.filter(beichufa_id=yonghuid).exclude(zhuangtai__in=[2, 4]).exists()
self_fadan = Penalty.query.filter(PenalizedUserID=yonghuid).exclude(Status__in=[2, 4]).exists()
if self_fadan:
return False, '您有未处理完毕的自身罚单(待缴纳/申诉中),请先处理', {}
return True, '', {'nicheng': dashou.nicheng or ''}
@@ -280,15 +280,15 @@ def validate_withdraw_eligibility(user_main, leixing, jine):
return False, '商家账号已被禁用,无法提现', {}
if shangjia.yue < jine:
return False, f'商家余额不足,当前余额: {shangjia.yue}', {}
unfinished_orders = DingdanShangjia.query.filter(
shangjia_id=yonghuid,
).exclude(dingdan__zhuangtai__in=[ORDER_STATUS_COMPLETED, ORDER_STATUS_REFUNDED]).exists()
unfinished_orders = MerchantOrderExt.query.filter(
MerchantID=yonghuid,
).exclude(Order__Status__in=[ORDER_STATUS_COMPLETED, ORDER_STATUS_REFUNDED]).exists()
if unfinished_orders:
return False, '您还有未完成或未退款的订单,请先处理完毕再提现余额', {}
self_fadan = Fadan.query.filter(beichufa_id=yonghuid).exclude(zhuangtai__in=[2, 4]).exists()
self_fadan = Penalty.query.filter(PenalizedUserID=yonghuid).exclude(Status__in=[2, 4]).exists()
if self_fadan:
return False, '您有未处理完毕的自身罚单(待缴纳/申诉中),请先处理', {}
applied_fadan = Fadan.query.filter(shenqing_chufa=yonghuid).exclude(zhuangtai__in=[2, 4]).exists()
applied_fadan = Penalty.query.filter(ApplicantID=yonghuid).exclude(Status__in=[2, 4]).exists()
if applied_fadan:
return False, '您发起的对其他用户的处罚尚未处理完毕,请等待完结', {}
return True, '', {'nicheng': shangjia.nicheng or ''}
@@ -350,12 +350,12 @@ def validate_collect_eligibility(user_main, leixing):
huiyuan_ok, huiyuan_msg = check_dashou_has_valid_huiyuan(yonghuid)
if not huiyuan_ok:
return False, huiyuan_msg
unfinished = Dingdan.query.filter(
jiedan_dashou_id=yonghuid,
).exclude(zhuangtai__in=[ORDER_STATUS_COMPLETED, ORDER_STATUS_REFUNDED]).exists()
unfinished = Order.query.filter(
PlayerID=yonghuid,
).exclude(Status__in=[ORDER_STATUS_COMPLETED, ORDER_STATUS_REFUNDED]).exists()
if unfinished:
return False, '您还有未完成或未退款的订单,无法收款'
self_fadan = Fadan.query.filter(beichufa_id=yonghuid).exclude(zhuangtai__in=[2, 4]).exists()
self_fadan = Penalty.query.filter(PenalizedUserID=yonghuid).exclude(Status__in=[2, 4]).exists()
if self_fadan:
return False, '您有未处理完毕的自身罚单,无法收款'
return True, ''
@@ -376,15 +376,15 @@ def validate_collect_eligibility(user_main, leixing):
return False, '您不是商家身份,无法收款'
if shangjia.zhuangtai != 1:
return False, '商家账号已被禁用,无法收款'
unfinished_orders = DingdanShangjia.query.filter(
shangjia_id=yonghuid,
).exclude(dingdan__zhuangtai__in=[ORDER_STATUS_COMPLETED, ORDER_STATUS_REFUNDED]).exists()
unfinished_orders = MerchantOrderExt.query.filter(
MerchantID=yonghuid,
).exclude(Order__Status__in=[ORDER_STATUS_COMPLETED, ORDER_STATUS_REFUNDED]).exists()
if unfinished_orders:
return False, '您还有未完成或未退款的订单,无法收款'
self_fadan = Fadan.query.filter(beichufa_id=yonghuid).exclude(zhuangtai__in=[2, 4]).exists()
self_fadan = Penalty.query.filter(PenalizedUserID=yonghuid).exclude(Status__in=[2, 4]).exists()
if self_fadan:
return False, '您有未处理完毕的自身罚单,无法收款'
applied_fadan = Fadan.query.filter(shenqing_chufa=yonghuid).exclude(zhuangtai__in=[2, 4]).exists()
applied_fadan = Penalty.query.filter(ApplicantID=yonghuid).exclude(Status__in=[2, 4]).exists()
if applied_fadan:
return False, '您发起的处罚尚未处理完毕,无法收款'
return True, ''
+2 -2
View File
@@ -3,7 +3,7 @@ from django.views.decorators.csrf import csrf_exempt
from .views import WechatMiniProgramLoginView, UserInfoUpdateView, DashouXinxiAPIView, \
ZaixianZhuangtaiAPIView, GuanshiXinxiView, ShangJiaXinXiView, BossBiaoshiView, YaoqingmaView, \
DashouZhuceView, GuanshiYaoqingDashouListView, TixianXinxiHuoquView, ShoukuanXinxiShangchuanView, \
TixianShenqingView, TixianJiluHuoquViewV2, AdminLoginView, AdminFinancialDataView, AdGetDingdanList, \
TixianShenqingView, TixianJiluHuoquViewV2, AdminLoginView, AdminFinancialDataView, AdGetOrderList, \
AdGetOrderTypes, AdGuanLiYongHu, AdYaoQingDaShou, CfGuanLi, AdTongYiChuFa, AdckyhxqView, AdcjxgView, AddtxshView, \
AdtixianqkView, DashouZiliaoHuoquView, DashouGengxinView,ShangjiaZhuceView,\
PaihangbangGuanliQueryView,PaihangbangRiqiliebiaoView, WechatLoginAndDashouRegisterView, \
@@ -43,7 +43,7 @@ urlpatterns = [
path('adgetordertypes', AdGetOrderTypes.as_view(), name='管理员获取订单类型'),
# 订单列表获取接口
path('adddhq', AdGetDingdanList.as_view(), name='管理员获取订单列表'),
path('adddhq', AdGetOrderList.as_view(), name='管理员获取订单列表'),
path('adyqds', AdYaoQingDaShou.as_view(), name='管理员获取邀请码'),
# 用户管理列表接口
+631 -631
View File
File diff suppressed because it is too large. Load diff
+15 -15
View File
@@ -3,7 +3,7 @@ import json
import logging
import requests
from django.conf import settings
from orders.models import Dingdan, DingdanPingtai, DingdanShangjia
from orders.models import Order, PlatformOrderExt, MerchantOrderExt
from users.models import UserDashou, UserBoss, UserShangjia
from gvsdsdk.models import User
@@ -99,12 +99,12 @@ def _send_group_message(appkey, secret, group_id, sender_id, sender_name, sender
# ========== 核心入口 ==========
def establish_order_chat(dingdan_id):
try:
order = Dingdan.objects.select_related('pingtai_kuozhan', 'shangjia_kuozhan').get(dingdan_id=dingdan_id)
except Dingdan.DoesNotExist:
order = Order.objects.select_related('pingtai_kuozhan', 'shangjia_kuozhan').get(OrderID=dingdan_id)
except Order.DoesNotExist:
logger.error(f"订单 {dingdan_id} 不存在")
return False
dashou_uid = order.jiedan_dashou_id
dashou_uid = order.PlayerID
dashou_goeasy_id = f"Ds{dashou_uid}"
dashou_nickname = f'打手{dashou_uid[:6]}'
dashou_avatar_relative = ''
@@ -129,9 +129,9 @@ def establish_order_chat(dingdan_id):
# ========== 普通订单 / 我方派单 ==========
def _handle_local_order(order, dashou_goeasy_id, dashou_name, dashou_avatar, appkey, secret):
group_id = f"group_{order.dingdan_id}"
group_name = (order.jieshao[:20] + '…') if order.jieshao and len(order.jieshao) > 20 else (order.jieshao or f"订单{order.dingdan_id}")
group_avatar = _full_local_avatar(order.tupian) if order.tupian else _full_local_avatar('')
group_id = f"group_{order.OrderID}"
group_name = (order.Description[:20] + '…') if order.Description and len(order.Description) > 20 else (order.Description or f"订单{order.OrderID}")
group_avatar = _full_local_avatar(order.ImageURL) if order.ImageURL else _full_local_avatar('')
partner_goeasy_id, partner_name, partner_avatar = _get_local_partner_info(order)
if not partner_goeasy_id:
@@ -142,27 +142,27 @@ def _handle_local_order(order, dashou_goeasy_id, dashou_name, dashou_avatar, app
return False
# 1. 打手发送初始化消息
init_msg_text = f"订单已接单,内容:{order.jieshao},备注:{order.beizhu},游戏ID:{order.nicheng}"
init_msg_text = f"订单已接单,内容:{order.Description},备注:{order.Remark},游戏ID:{order.Nickname}"
success1 = _send_group_message(
appkey, secret, group_id, dashou_goeasy_id, dashou_name, group_avatar,
init_msg_text, None, group_name=group_name, order_id=order.dingdan_id
init_msg_text, None, group_name=group_name, order_id=order.OrderID
)
# 2. 【新增】派单方也发一条消息,确保他也能看到群聊
partner_msg = f"订单已确认,请开始服务。"
success2 = _send_group_message(
appkey, secret, group_id, partner_goeasy_id, partner_name, partner_avatar,
partner_msg, None, group_name=group_name, order_id=order.dingdan_id
partner_msg, None, group_name=group_name, order_id=order.OrderID
)
return success1 and success2
def _get_local_partner_info(order):
"""本地订单下单方:老板或商家"""
if order.fadan_pingtai == 1: # 老板
if order.Platform == 1: # 老板
try:
ext = order.pingtai_kuozhan
laoban_id = ext.laoban_id
laoban_id = ext.BossID
avatar_full = _full_local_avatar('')
nickname = f'老板{laoban_id[:6]}'
try:
@@ -177,11 +177,11 @@ def _get_local_partner_info(order):
except Exception as e:
logger.error(f"获取老板信息失败: {e}")
return None, None, None
elif order.fadan_pingtai == 2: # 商家
elif order.Platform == 2: # 商家
try:
ext = order.shangjia_kuozhan
shangjia_id = ext.shangjia_id
nickname = ext.sjnicheng or f'商家{shangjia_id[:6]}'
shangjia_id = ext.MerchantID
nickname = ext.MerchantNickname or f'商家{shangjia_id[:6]}'
avatar_full = _full_local_avatar('')
try:
sj_user = User.objects.get(UserUID=shangjia_id)
+32 -32
View File
@@ -1,5 +1,5 @@
# utils/fadan_utils.py
from orders.models import Fadan
from orders.models import Penalty
import logging
logger = logging.getLogger('xiaochengxu')
@@ -20,10 +20,10 @@ def check_fadan_qiangdan_eligible(yonghuid: str, action_type: int) -> tuple:
try:
if action_type == 1:
# 抢单:仅当存在“影响抢单”且“未解决”的罚单时拦截(待缴纳或申诉中)
blocked = Fadan.objects.filter(
beichufa_id=yonghuid,
yingxiang_qiangdan=1,
zhuangtai__in=[1, 3] # 1=待缴纳, 3=申诉中
blocked = Penalty.objects.filter(
PenalizedUserID=yonghuid,
AffectsGrabbing=1,
Status__in=[1, 3] # 1=待缴纳, 3=申诉中
).exists()
if blocked:
logger.info(f"用户 {yonghuid} 抢单被拦截:存在未解决的影响抢单罚单")
@@ -32,9 +32,9 @@ def check_fadan_qiangdan_eligible(yonghuid: str, action_type: int) -> tuple:
elif action_type == 2:
# 提现:只要存在任意未解决的罚单(待缴纳/申诉中),不论是否影响抢单,一律禁止提现
blocked = Fadan.objects.filter(
beichufa_id=yonghuid,
zhuangtai__in=[1, 3] # 1=待缴纳, 3=申诉中
blocked = Penalty.objects.filter(
PenalizedUserID=yonghuid,
Status__in=[1, 3] # 1=待缴纳, 3=申诉中
).exists()
if blocked:
logger.info(f"用户 {yonghuid} 提现被拦截:存在未解决的罚单")
@@ -57,7 +57,7 @@ def check_fadan_qiangdan_eligible(yonghuid: str, action_type: int) -> tuple:
import logging
from django.db import transaction
from decimal import Decimal
from orders.models import Fadan, FadanFenhong, FadanFenhongLilv
from orders.models import Penalty, PenaltyBonus, PenaltyBonusRate
logger = logging.getLogger('xiaochengxu')
@@ -69,30 +69,30 @@ def fadan_fenhong(fadan_id):
try:
# 1. 查询罚单
try:
fadan = Fadan.objects.get(id=fadan_id)
except Fadan.DoesNotExist:
fadan = Penalty.objects.get(id=fadan_id)
except Penalty.DoesNotExist:
logger.warning(f"罚单 {fadan_id} 不存在,分红跳过")
return
if fadan.zhuangtai != 2:
if fadan.Status != 2:
logger.info(f"罚单 {fadan_id} 状态非已缴纳,不分红")
return
fenhongzhe_id = fadan.shenqing_chufa or ''
shenfen_in_fadan = fadan.shenqingren_shenfen # 罚单中的申请人身份
jine = fadan.fakuanjine
fenhongzhe_id = fadan.ApplicantID or ''
shenfen_in_fadan = fadan.ApplicantIdentity # 罚单中的申请人身份
jine = fadan.FineAmount
if not fenhongzhe_id or jine <= 0:
logger.info(f"罚单 {fadan_id} 缺少申请处罚人或金额为0,不分红")
return
# 2. 直接用罚单身份的原始值查询费率(费率表 shenfen 与之含义一致)
rate_record = FadanFenhongLilv.objects.filter(shenfen=shenfen_in_fadan).first()
if not rate_record or rate_record.lilv <= 0:
rate_record = PenaltyBonusRate.objects.filter(Identity=shenfen_in_fadan).first()
if not rate_record or rate_record.Rate <= 0:
logger.info(f"身份 {shenfen_in_fadan} 无有效分红费率,不分红")
return
rate = rate_record.lilv
rate = rate_record.Rate
# 3. 计算分红金额
amount = (jine * rate).quantize(Decimal('0.01'))
@@ -115,25 +115,25 @@ def fadan_fenhong(fadan_id):
# 5. 事务累加分红记录(同一用户+身份只保留一条记录)
with transaction.atomic():
record = FadanFenhong.objects.select_for_update().filter(
fenhongzhe_id=fenhongzhe_id,
shenfen=shenfen_in_fenhong # 使用映射后的身份值
record = PenaltyBonus.objects.select_for_update().filter(
BeneficiaryID=fenhongzhe_id,
Identity=shenfen_in_fenhong # 使用映射后的身份值
).first()
if record:
record.zonge += amount
record.ketixian_fenhong += amount
record.fenhong_cishu += 1
record.yingde_lilv = rate
record.TotalAmount += amount
record.WithdrawableAmount += amount
record.BonusCount += 1
record.IndividualRate = rate
record.save()
else:
FadanFenhong.objects.create(
fenhongzhe_id=fenhongzhe_id,
shenfen=shenfen_in_fenhong,
zonge=amount,
ketixian_fenhong=amount,
fenhong_cishu=1,
yingde_lilv=rate,
PenaltyBonus.objects.create(
BeneficiaryID=fenhongzhe_id,
Identity=shenfen_in_fenhong,
TotalAmount=amount,
WithdrawableAmount=amount,
BonusCount=1,
IndividualRate=rate,
)
logger.info(f"罚单 {fadan_id} 分红完成:用户 {fenhongzhe_id} 身份 {shenfen_in_fenhong} 金额 {amount}")