diff --git a/orders/views/dashou.py b/orders/views/dashou.py index 4b70b38..8a369f3 100644 --- a/orders/views/dashou.py +++ b/orders/views/dashou.py @@ -542,7 +542,7 @@ class QiangdanView(APIView): if order.GrabRequirement == 1: return self._validate_huiyuan_requirement(order, dashou_yonghuid) elif order.GrabRequirement == 2: - return self._validate_yajin_requirement(order, dashou_profile) + return self._validate_yajin_requirement(order, dashou_profile, dashou_yonghuid) return {'success': True, 'message': '验证通过'} def _validate_huiyuan_requirement(self, order, dashou_yonghuid): @@ -567,11 +567,26 @@ class QiangdanView(APIView): return {'success': True, 'message': '会员验证通过'} return {'success': False, 'message': '未开通对应会员或会员已过期,无法抢此订单'} - def _validate_yajin_requirement(self, order, dashou_profile): + def _validate_yajin_requirement(self, order, dashou_profile, dashou_yonghuid=None): + """ + 押金抢单:余额 + 提现冻结中押金均可用于抢单门槛。 + 提现/后台换人等其它场景仍只认实际 yajin 余额。 + """ + from users.tixian_shenhe_services import pending_yajin_withdraw_frozen_amount + yajin_required = order.CommissionReq or 0 - dashou_yajin = dashou_profile.yajin or 0 - if dashou_yajin < yajin_required: - return {'success': False, 'message': f'押金不足,需要{yajin_required}元,当前有{dashou_yajin}元'} + balance = dashou_profile.yajin or 0 + yonghuid = dashou_yonghuid or getattr( + getattr(dashou_profile, 'user', None), 'UserUID', None + ) + frozen = pending_yajin_withdraw_frozen_amount(yonghuid) if yonghuid else Decimal('0') + effective = Decimal(str(balance)) + Decimal(str(frozen)) + required = Decimal(str(yajin_required)) + if effective < required: + return { + 'success': False, + 'message': f'押金不足,需要{required}元,当前可用{effective}元', + } return {'success': True, 'message': '押金验证通过'} def _execute_qiangdan(self, order, dashou_profile, dashou_yonghuid): diff --git a/users/tixian_shenhe_services.py b/users/tixian_shenhe_services.py index f0433f7..56fc807 100644 --- a/users/tixian_shenhe_services.py +++ b/users/tixian_shenhe_services.py @@ -91,6 +91,42 @@ def get_tixian_feilv(leixing, yonghuid=None, club_id=None): return _get_tixian_feilv_for_club(club_id, leixing) +# 押金提现已扣款、尚未完结(仍视为「冻结中」)的审核状态 +_YAJIN_FROZEN_AUDIT_STATUSES = (1, 6) # 审核中、待收款 + + +def pending_yajin_withdraw_frozen_amount(yonghuid): + """ + 押金提现申请时已从 UserDashou.yajin 扣走、尚未完结的金额。 + + 仅供抢单资格把「冻结中」押金计入可用;提现/换人等其它场景不要调用。 + """ + if not yonghuid: + return decimal.Decimal('0') + + audit_sum = ( + TixianShenheJilu.query.filter( + yonghuid=yonghuid, + leixing=5, + zhuangtai__in=_YAJIN_FROZEN_AUDIT_STATUSES, + ).aggregate(total=Sum('shenqing_jine'))['total'] + or decimal.Decimal('0') + ) + + # 旧手动提现:只写 Tixianjilu、无审核单;避免与自动流程双重累计 + manual_sum = ( + Tixianjilu.query.filter( + yonghuid=yonghuid, + leixing=5, + zhuangtai=1, + shenhe_jilu_id__isnull=True, + ).aggregate(total=Sum('jine'))['total'] + or decimal.Decimal('0') + ) + + return audit_sum + manual_sum + + DAKUAN_MODE_MANUAL = 1 DAKUAN_MODE_AUTO = 2