阿龙电竞后端已经修复了提现问题,聊天问题,管式商家分红最新代码

This commit is contained in:
XingQue
2026-06-15 23:52:35 +08:00
parent 7fa713c335
commit 790f397893
18 changed files with 1256 additions and 1814 deletions

View File

@@ -0,0 +1,23 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('dingdan', '0016_dingdan_guanshi_fencheng'),
]
operations = [
migrations.AddField(
model_name='dingdan',
name='guanshi_shangjia_fencheng',
field=models.DecimalField(
blank=True,
decimal_places=2,
default=0,
max_digits=10,
null=True,
verbose_name='管事商家派单分成',
),
),
]

View File

@@ -11,6 +11,10 @@ class Dingdan(models.Model):
jine = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, verbose_name='订单金额')
dashou_fencheng = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, verbose_name='打手分成')
guanshi_fencheng = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, default=0, verbose_name='管事分成')
guanshi_shangjia_fencheng = models.DecimalField(
max_digits=10, decimal_places=2, null=True, blank=True, default=0,
verbose_name='管事商家派单分成'
)
# 用户与商品关联ID
jiedan_dashou_id = models.CharField(max_length=32, null=True, db_index=True,blank=True, verbose_name='接单打手ID')
dashou_liuyan = models.TextField(null=True, blank=True, verbose_name='打手留言')

View File

@@ -342,7 +342,10 @@ from dingdan.models import Lilubiao
def calc_shangjia_order_fencheng(jine):
"""
商家发单时计算打手/管事分成。
打手优先:打手+管事 > 订单金额时,管事分成为 0。
- 打手分成Lilubiao=3最高不超过订单金额
- 管事打手接单分红Lilubiao=13
- 管事商家派单分红Lilubiao=15
打手优先;三项合计超过订单金额时,优先清零管事商家分红,再清零管事打手分红。
"""
jine = Decimal(str(jine))
try:
@@ -351,92 +354,158 @@ def calc_shangjia_order_fencheng(jine):
except Lilubiao.DoesNotExist:
rate_dashou = Decimal('1')
lilu_guanshi_obj = Lilubiao.objects.filter(fadanpingtai='13').first()
rate_guanshi = (
Decimal(str(lilu_guanshi_obj.lilu))
if lilu_guanshi_obj and lilu_guanshi_obj.lilu is not None
lilu_guanshi_dashou_obj = Lilubiao.objects.filter(fadanpingtai='13').first()
rate_guanshi_dashou = (
Decimal(str(lilu_guanshi_dashou_obj.lilu))
if lilu_guanshi_dashou_obj and lilu_guanshi_dashou_obj.lilu is not None
else Decimal('0')
)
dashou_fencheng = (jine * rate_dashou).quantize(Decimal('0.01'))
guanshi_raw = (jine * rate_guanshi).quantize(Decimal('0.01'))
lilu_guanshi_shangjia_obj = Lilubiao.objects.filter(fadanpingtai='15').first()
rate_guanshi_shangjia = (
Decimal(str(lilu_guanshi_shangjia_obj.lilu))
if lilu_guanshi_shangjia_obj and lilu_guanshi_shangjia_obj.lilu is not None
else Decimal('0')
)
if dashou_fencheng + guanshi_raw > jine:
dashou_fencheng = min(
(jine * rate_dashou).quantize(Decimal('0.01')),
jine,
)
guanshi_fencheng = (jine * rate_guanshi_dashou).quantize(Decimal('0.01'))
guanshi_shangjia_fencheng = (jine * rate_guanshi_shangjia).quantize(Decimal('0.01'))
if dashou_fencheng + guanshi_fencheng > jine:
guanshi_fencheng = Decimal('0.00')
else:
guanshi_fencheng = guanshi_raw
return dashou_fencheng, guanshi_fencheng
if dashou_fencheng + guanshi_fencheng + guanshi_shangjia_fencheng > jine:
guanshi_shangjia_fencheng = Decimal('0.00')
if dashou_fencheng + guanshi_fencheng + guanshi_shangjia_fencheng > jine:
guanshi_fencheng = Decimal('0.00')
return dashou_fencheng, guanshi_fencheng, guanshi_shangjia_fencheng
def settle_shangjia_order_guanshi_fenhong(order, dashou_id):
"""
商家订单结单时结算管事分红(幂等,失败不抛异常阻断主流程)。
"""
def _pay_guanshi_order_fenhong(order, guanshi_id, amount, related_user_id, nicheng, avatar,
fenhong_leixing, shuoming):
"""向管事发放单笔商家订单分红(幂等)"""
from shangpin.models import Gsfenhong
from yonghu.models import UserDashou, UserGuanshi
from yonghu.models import UserGuanshi
if getattr(order, 'fadan_pingtai', None) != 2:
return
amount = amount or Decimal('0')
if amount <= 0 or not guanshi_id:
return False
guanshi_fencheng = order.guanshi_fencheng or Decimal('0')
if guanshi_fencheng <= 0:
return
if Gsfenhong.objects.filter(dingdan_id=order.dingdan_id).exists():
logger.info(f"商家订单管事分红已处理: {order.dingdan_id}")
return
if not dashou_id:
return
try:
dashou = UserDashou.objects.select_related('user').get(user__yonghuid=dashou_id)
except UserDashou.DoesNotExist:
logger.info(f"商家订单管事分红跳过: 打手{dashou_id}不存在")
return
guanshi_id = dashou.yaoqingren
if not guanshi_id:
logger.info(f"商家订单管事分红跳过: 打手{dashou_id}无邀请管事")
return
if Gsfenhong.objects.filter(dingdan_id=order.dingdan_id, fenhong_leixing=fenhong_leixing).exists():
logger.info(f"管事分红已处理: 订单{order.dingdan_id}, 类型{fenhong_leixing}")
return False
try:
with transaction.atomic():
guanshi = UserGuanshi.objects.select_for_update().get(user__yonghuid=guanshi_id)
UserGuanshi.objects.filter(id=guanshi.id).update(
yue=F('yue') + guanshi_fencheng,
chongzhifenrun=F('chongzhifenrun') + guanshi_fencheng,
yue=F('yue') + amount,
chongzhifenrun=F('chongzhifenrun') + amount,
)
user_main = dashou.user
Gsfenhong.objects.create(
dingdan_id=order.dingdan_id,
guanshi=guanshi_id,
dashouid=dashou_id,
shuoming='商家订单分红',
fenhong=guanshi_fencheng,
avatar=user_main.avatar if user_main else None,
nicheng=dashou.nicheng or '未知打手',
fenhong_leixing=3,
dashouid=related_user_id,
shuoming=shuoming,
fenhong=amount,
avatar=avatar,
nicheng=nicheng or '未知用户',
fenhong_leixing=fenhong_leixing,
)
logger.info(
f"商家订单管事分红成功: 订单{order.dingdan_id}, 管事{guanshi_id}, "
f"打手{dashou_id}, 金额{guanshi_fencheng}"
f"管事分红成功: 订单{order.dingdan_id}, 管事{guanshi_id}, "
f"关联用户{related_user_id}, 类型{fenhong_leixing}, 金额{amount}"
)
except UserGuanshi.DoesNotExist:
logger.warning(f"商家订单管事分红跳过: 管事{guanshi_id}不存在")
return
logger.warning(f"管事分红跳过: 管事{guanshi_id}不存在")
return False
except Exception as e:
logger.error(f"商家订单管事分红失败: {e}", exc_info=True)
return
logger.error(f"管事分红失败: {e}", exc_info=True)
return False
try:
from houtai.utils import update_guanshi_daily_by_action
update_guanshi_daily_by_action(
yonghuid=guanshi_id,
action=3,
amount=guanshi_fencheng,
amount=amount,
)
except Exception as e:
logger.error(f"商家订单管事日统计更新失败: {e}")
logger.error(f"管事日统计更新失败: {e}")
return True
def settle_shangjia_order_guanshi_fenhong(order, dashou_id):
"""
商家订单结单时结算管事分红(幂等,失败不抛异常阻断主流程)。
- 管事打手接单分红接单打手的邀请管事guanshi_fencheng
- 管事商家派单分红派单商家打手身份的邀请管事guanshi_shangjia_fencheng
同一管事可同时获得两笔分红。
"""
from dingdan.models import DingdanShangjia
from yonghu.models import UserDashou
if getattr(order, 'fadan_pingtai', None) != 2:
return
# 1. 接单打手邀请管事分红
guanshi_fencheng = order.guanshi_fencheng or Decimal('0')
if guanshi_fencheng > 0 and dashou_id:
try:
dashou = UserDashou.objects.select_related('user').get(user__yonghuid=dashou_id)
except UserDashou.DoesNotExist:
logger.info(f"管事打手分红跳过: 打手{dashou_id}不存在")
dashou = None
if dashou and dashou.yaoqingren:
user_main = dashou.user
_pay_guanshi_order_fenhong(
order=order,
guanshi_id=dashou.yaoqingren,
amount=guanshi_fencheng,
related_user_id=dashou_id,
nicheng=dashou.nicheng,
avatar=user_main.avatar if user_main else None,
fenhong_leixing=3,
shuoming='商家订单打手分红',
)
else:
logger.info(f"管事打手分红跳过: 打手{dashou_id}无邀请管事")
# 2. 派单商家邀请管事分红
guanshi_shangjia_fencheng = order.guanshi_shangjia_fencheng or Decimal('0')
if guanshi_shangjia_fencheng > 0:
try:
shangjia_ext = DingdanShangjia.objects.select_related('dingdan').get(dingdan__dingdan_id=order.dingdan_id)
shangjia_id = shangjia_ext.shangjia_id
except DingdanShangjia.DoesNotExist:
logger.info(f"管事商家分红跳过: 订单{order.dingdan_id}无商家扩展")
shangjia_id = None
if shangjia_id:
try:
merchant_dashou = UserDashou.objects.select_related('user').get(user__yonghuid=shangjia_id)
except UserDashou.DoesNotExist:
logger.info(f"管事商家分红跳过: 商家{shangjia_id}无打手扩展")
merchant_dashou = None
if merchant_dashou and merchant_dashou.yaoqingren:
user_main = merchant_dashou.user
_pay_guanshi_order_fenhong(
order=order,
guanshi_id=merchant_dashou.yaoqingren,
amount=guanshi_shangjia_fencheng,
related_user_id=shangjia_id,
nicheng=shangjia_ext.sjnicheng or merchant_dashou.nicheng,
avatar=user_main.avatar if user_main else None,
fenhong_leixing=4,
shuoming='商家派单管事分红',
)
else:
logger.info(f"管事商家分红跳过: 商家{shangjia_id}打手身份无邀请管事")

View File

@@ -2665,7 +2665,7 @@ class ShangjiaPaifaView(APIView):
# ----- 10. 利率(打手+管事分成,打手优先) -----
from dingdan.utils import calc_shangjia_order_fencheng
dashou_fencheng, guanshi_fencheng = calc_shangjia_order_fencheng(jiage)
dashou_fencheng, guanshi_fencheng, guanshi_shangjia_fencheng = calc_shangjia_order_fencheng(jiage)
# ----- 11. 生成订单ID -----
def generate_dingdan_id():
@@ -2686,6 +2686,7 @@ class ShangjiaPaifaView(APIView):
jine=jiage,
dashou_fencheng=dashou_fencheng,
guanshi_fencheng=guanshi_fencheng,
guanshi_shangjia_fencheng=guanshi_shangjia_fencheng,
zhiding_id=zhiding_uid if zhiding_dashou else '',
shangpin_id=0,
leixing_id=int(shangpin_type_id),
@@ -4153,7 +4154,7 @@ logger = logging.getLogger(__name__)
from peizhi.models import ClubConfig
from utils.chat_utils import establish_order_chat # 【新增】导入聊天工具
from utils.chat_utils import establish_order_chat_with_retry
class QiangdanView(APIView):
authentication_classes = [JWTAuthentication]
permission_classes = [IsAuthenticated]
@@ -4164,6 +4165,7 @@ class QiangdanView(APIView):
if not dingdan_id:
return Response({'code': 400, 'msg': '订单ID不能为空'}, status=400)
chat_success = False
try:
with transaction.atomic():
# 1. 验证打手身份和状态
@@ -4237,8 +4239,8 @@ class QiangdanView(APIView):
return Response({'code': 400, 'msg': validation_result['message']})
self._execute_qiangdan(order, dashou_profile, request.user.yonghuid)
# ========== 【唯一改动】聊天建立方式 ==========
chat_success = establish_order_chat(dingdan_id)
# 事务提交后再建群/建聊,避免长耗时 HTTP 拖住行锁,并支持重试
chat_success = establish_order_chat_with_retry(dingdan_id)
try:
update_dashou_daily_by_action(
@@ -6357,6 +6359,10 @@ class AdQiangZhiJieDan(APIView):
# 商家扩展表不存在,跳过商家更新
logger.warning(f"强制结单:商家{shangjia_id}扩展信息不存在,跳过商家更新")
if fadan_pingtai == 2 and jiedan_dashou_id:
from dingdan.utils import settle_shangjia_order_guanshi_fenhong
settle_shangjia_order_guanshi_fenhong(dingdan_obj, jiedan_dashou_id)
# 11. 返回成功响应
return Response({
'code': 0,