修复了一些
This commit is contained in:
1 parent
e67bc17fa2
commit
53049d1588
20 files changed
+3671
-2541
No files matched your search
+323
-324
File diff suppressed because it is too large.
Load diff
+74
-74
@@ -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
File diff suppressed because it is too large.
Load diff
@@ -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
@@ -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
@@ -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
@@ -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
File diff suppressed because it is too large.
Load diff
+18
-18
@@ -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
@@ -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
@@ -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': '该订单无接单打手,无法罚款'})
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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
@@ -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
File diff suppressed because it is too large.
Load diff
+15
-15
@@ -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
@@ -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}")
|
||||
|
||||
Reference in new issue
Block a user