阿龙电竞后端已经修复了提现问题,聊天问题,管式商家分红最新代码
This commit is contained in:
183
dingdan/utils.py
183
dingdan/utils.py
@@ -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}打手身份无邀请管事")
|
||||
Reference in New Issue
Block a user