fix: 罚单申请时锁定分红利率与应得金额,缴纳按锁定值入账

This commit is contained in:
XingQue
2026-06-27 17:46:39 +08:00
parent e2e568bcda
commit d19b6250ae
7 changed files with 228 additions and 104 deletions

View File

@@ -0,0 +1,31 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('orders', '0008_order_waibu_penalty_staff'),
]
operations = [
migrations.AddField(
model_name='penalty',
name='ApplicantBonusRate',
field=models.DecimalField(
db_column='shenqingren_fenhong_lilv',
decimal_places=4,
default=0.0,
max_digits=5,
verbose_name='申请人分红锁定利率',
),
),
migrations.AddField(
model_name='penalty',
name='BonusCredited',
field=models.BooleanField(
db_column='fenhong_yiruzhang',
default=False,
verbose_name='分红是否已入账',
),
),
]

View File

@@ -510,6 +510,14 @@ class Penalty(QModel):
max_digits=12, decimal_places=2, default=0.00,
db_column='shenqingren_fenhong_jine', verbose_name='申请人分红金额',
)
ApplicantBonusRate = models.DecimalField(
max_digits=5, decimal_places=4, default=0.0000,
db_column='shenqingren_fenhong_lilv', verbose_name='申请人分红锁定利率',
)
BonusCredited = models.BooleanField(
default=False,
db_column='fenhong_yiruzhang', verbose_name='分红是否已入账',
)
ClubID = models.CharField(
max_length=16, default='xq', db_index=True,
db_column='club_id', verbose_name='所属俱乐部',

View File

@@ -64,6 +64,8 @@ from jituan.services.club_config import get_commission_rate, get_commission_rate
from jituan.services.club_context import resolve_club_id_from_request
from jituan.services.club_user import get_payment_openid
from jituan.services.club_penalty import resolve_penalty_club_id
from users.fadan_fenhong_utils import lock_penalty_bonus
from users.fadan_fenhong_utils import lock_penalty_bonus
from products.models import Shangpin, ShangpinLeixing, Huiyuangoumai
from users.models import UserDashou, UserShangjia, UserBoss
from users.business_models import User
@@ -2293,25 +2295,21 @@ class ShangjiaDingdanXiangqingView(APIView):
'shensuliyou': fadan_obj.AppealReason or '',
'tongyi_chufaliyou': fadan_obj.ApproveReason or '',
'bohuiliyou': fadan_obj.RejectReason or '',
'yingde_fenhong': float(fadan_obj.ApplicantBonusAmount or 0),
'fenhong_lilv': float(fadan_obj.ApplicantBonusRate or 0),
'fenhong_yiruzhang': bool(fadan_obj.BonusCredited),
'CreateTime': ct,
'create_time': ct,
'UpdateTime': ut,
'update_time': ut,
}
# 7. 商家分红利率(申请页预览):个人记录优先,否则全局 fadan_fenhong_lilv shenfen=5
# 7. 商家分红利率(申请页预览):与缴纳后分红同一套规则
fenhong_lilv = 0.0
try:
last_fenhong = PenaltyBonus.query.filter(
BeneficiaryID=yonghuid,
Identity=1, # fadan_fenhong1=商家
).order_by('-CreateTime').first()
if last_fenhong and last_fenhong.IndividualRate:
fenhong_lilv = float(last_fenhong.IndividualRate)
else:
global_rate = PenaltyBonusRate.query.filter(Identity=5).first()
if global_rate and global_rate.Rate:
fenhong_lilv = float(global_rate.Rate)
from users.fadan_fenhong_utils import get_merchant_fenhong_lilv
order_club_id = getattr(order, 'ClubID', None) or 'xq'
fenhong_lilv = get_merchant_fenhong_lilv(yonghuid, club_id=order_club_id)
except Exception as e:
logger.warning(f'获取分红利率失败: {e}')
@@ -6531,7 +6529,7 @@ class ShangjiaFakuanApplyView(APIView):
staff_kefu_id = getattr(staff_member, 'staff_user_id', None) or None
with transaction.atomic():
Penalty.query.create(
fadan = Penalty.query.create(
PenalizedUserID=dashou_id,
ApplicantID=shangjia_id, # 申请人为当前商家
Identity=1, # 被打者身份1=打手
@@ -6544,6 +6542,7 @@ class ShangjiaFakuanApplyView(APIView):
ClubID=resolve_penalty_club_id(order=order, penalized_user_id=dashou_id),
ShopStaffUserID=staff_kefu_id,
)
lock_penalty_bonus(fadan)
logger.info(f"商家{shangjia_id}对订单{dingdan_id}打手{dashou_id}罚款成功,金额{fakuanjine}")
return Response({'code': 0, 'msg': '罚款申请已提交'})
@@ -6647,6 +6646,7 @@ class ShangjiaFakuaiXiugaiView(APIView):
fadan.ProcessorID = processor_id
fadan.ProcessorIdentity = 5 # 小程序商家自行处理
fadan.save()
lock_penalty_bonus(fadan)
return Response({'code': 0, 'msg': '罚款修改成功'})
def _cancel_penalty(self, fadan, liyou, processor_id=None):
@@ -6685,6 +6685,7 @@ class ShangjiaFakuaiXiugaiView(APIView):
fadan.ProcessorID = processor_id
fadan.ProcessorIdentity = 5
fadan.save()
lock_penalty_bonus(fadan)
logger.info(f"商家重新申请罚单{fadan.id},金额={jine}")
return Response({'code': 0, 'msg': '已重新申请罚款'})