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

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

@@ -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}打手身份无邀请管事")