第一次提交:小程序前端最新版本
This commit is contained in:
140
utils/fadan_utils.py
Normal file
140
utils/fadan_utils.py
Normal file
@@ -0,0 +1,140 @@
|
||||
# utils/fadan_utils.py
|
||||
from dingdan.models import Fadan
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger('xiaochengxu')
|
||||
|
||||
|
||||
def check_fadan_qiangdan_eligible(yonghuid: str, action_type: int) -> tuple:
|
||||
"""
|
||||
通用罚单资格检查。
|
||||
|
||||
参数:
|
||||
yonghuid : 被检查的用户 yonghuid
|
||||
action_type : 1 = 抢单, 2 = 提现
|
||||
|
||||
返回:
|
||||
(is_eligible: bool, message: str)
|
||||
True 允许操作,False 返回拦截原因。
|
||||
"""
|
||||
try:
|
||||
if action_type == 1:
|
||||
# 抢单:仅当存在“影响抢单”且“未解决”的罚单时拦截(待缴纳或申诉中)
|
||||
blocked = Fadan.objects.filter(
|
||||
beichufa_id=yonghuid,
|
||||
yingxiang_qiangdan=1,
|
||||
zhuangtai__in=[1, 3] # 1=待缴纳, 3=申诉中
|
||||
).exists()
|
||||
if blocked:
|
||||
logger.info(f"用户 {yonghuid} 抢单被拦截:存在未解决的影响抢单罚单")
|
||||
return (False, "您有未缴纳或申诉中的罚单,请先处理后再抢单")
|
||||
return (True, "无罚单限制")
|
||||
|
||||
elif action_type == 2:
|
||||
# 提现:只要存在任意未解决的罚单(待缴纳/申诉中),不论是否影响抢单,一律禁止提现
|
||||
blocked = Fadan.objects.filter(
|
||||
beichufa_id=yonghuid,
|
||||
zhuangtai__in=[1, 3] # 1=待缴纳, 3=申诉中
|
||||
).exists()
|
||||
if blocked:
|
||||
logger.info(f"用户 {yonghuid} 提现被拦截:存在未解决的罚单")
|
||||
return (False, "您有未处理完的罚单,需全部完成或驳回后方可提现")
|
||||
return (True, "罚单状态正常,可提现")
|
||||
|
||||
else:
|
||||
logger.warning(f"未知的检查类型: {action_type}")
|
||||
return (False, "罚单查询系统异常(无效的检查类型)")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"检查用户 {yonghuid} 罚单状态异常: {e}", exc_info=True)
|
||||
# 安全起见,异常时禁止操作
|
||||
return (False, "罚单查询系统繁忙,请稍后重试")
|
||||
|
||||
|
||||
|
||||
import logging
|
||||
from django.db import transaction
|
||||
from decimal import Decimal
|
||||
from dingdan.models import Fadan, FadanFenhong, FadanFenhongLilv
|
||||
|
||||
logger = logging.getLogger('xiaochengxu')
|
||||
|
||||
def fadan_fenhong(fadan_id):
|
||||
"""
|
||||
罚款缴纳后,给申请处罚人累加分红。
|
||||
自动映射身份,异常不抛出,不影响主流程。
|
||||
"""
|
||||
try:
|
||||
# 1. 查询罚单
|
||||
try:
|
||||
fadan = Fadan.objects.get(id=fadan_id)
|
||||
except Fadan.DoesNotExist:
|
||||
logger.warning(f"罚单 {fadan_id} 不存在,分红跳过")
|
||||
return
|
||||
|
||||
if fadan.zhuangtai != 2:
|
||||
logger.info(f"罚单 {fadan_id} 状态非已缴纳,不分红")
|
||||
return
|
||||
|
||||
fenhongzhe_id = fadan.shenqing_chufa or ''
|
||||
shenfen_in_fadan = fadan.shenqingren_shenfen # 罚单中的申请人身份
|
||||
jine = fadan.fakuanjine
|
||||
|
||||
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:
|
||||
logger.info(f"身份 {shenfen_in_fadan} 无有效分红费率,不分红")
|
||||
return
|
||||
|
||||
rate = rate_record.lilv
|
||||
|
||||
# 3. 计算分红金额
|
||||
amount = (jine * rate).quantize(Decimal('0.01'))
|
||||
if amount <= 0:
|
||||
logger.info(f"罚单 {fadan_id} 分红金额为0,不分红")
|
||||
return
|
||||
|
||||
# 4. 硬编码映射:罚单身份 → 分红记录表身份
|
||||
SHENFEN_MAP = {
|
||||
1: 2, # 客服 → 客服
|
||||
2: 5, # 售后 → 售后
|
||||
3: 3, # 管理员 → 平台管理者
|
||||
4: 4, # 店铺 → 店铺
|
||||
5: 1, # 商家 → 商家
|
||||
}
|
||||
shenfen_in_fenhong = SHENFEN_MAP.get(shenfen_in_fadan)
|
||||
if shenfen_in_fenhong is None:
|
||||
logger.info(f"罚单 {fadan_id} 身份 {shenfen_in_fadan} 无对应的分红记录映射,不分红")
|
||||
return
|
||||
|
||||
# 5. 事务累加分红记录(同一用户+身份只保留一条记录)
|
||||
with transaction.atomic():
|
||||
record = FadanFenhong.objects.select_for_update().filter(
|
||||
fenhongzhe_id=fenhongzhe_id,
|
||||
shenfen=shenfen_in_fenhong # 使用映射后的身份值
|
||||
).first()
|
||||
|
||||
if record:
|
||||
record.zonge += amount
|
||||
record.ketixian_fenhong += amount
|
||||
record.fenhong_cishu += 1
|
||||
record.yingde_lilv = 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,
|
||||
)
|
||||
|
||||
logger.info(f"罚单 {fadan_id} 分红完成:用户 {fenhongzhe_id} 身份 {shenfen_in_fenhong} 金额 {amount}")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"罚单 {fadan_id} 分红异常:{e}", exc_info=True)
|
||||
Reference in New Issue
Block a user