# utils/fadan_utils.py from orders.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 orders.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)