diff --git a/backend/view.py b/backend/view.py index 2f8b6fa..3586cc5 100644 --- a/backend/view.py +++ b/backend/view.py @@ -6404,12 +6404,18 @@ class FaKuanTongJiView(APIView): if not has_fadan_view_permission(permissions, username): return Response({'code': 403, 'msg': '无权限查看罚款统计'}) + from utils.penalty_status import penalty_platform_audit_pending_q, APPLICANT_MERCHANT + pending_q = penalty_platform_audit_pending_q() + legacy_pending_q = Q( + Status=1, ApplicantIdentity=APPLICANT_MERCHANT, + ) & (Q(ProcessorID__isnull=True) | Q(ProcessorID='')) stats = filter_penalty_qs(Penalty.query.all(), request).aggregate( total=Count('id'), - daijiaona=Count('id', filter=Q(Status=1)), + daijiaona=Count('id', filter=Q(Status=1) & ~legacy_pending_q), shensuzhong=Count('id', filter=Q(Status=3)), yijiaona=Count('id', filter=Q(Status=2)), yibohui=Count('id', filter=Q(Status=4)), + pingtai_shenhe=Count('id', filter=pending_q), ) data = {k: v or 0 for k, v in stats.items()} from jituan.services.club_user_access import list_response_meta @@ -6446,10 +6452,25 @@ class FaKuanLieBiaoView(APIView): qs = filter_penalty_qs(Penalty.query.all(), request) - # 状态筛选 - zhuangtai = request.data.get('zhuangtai') - if zhuangtai is not None and int(zhuangtai) in [1, 2, 3, 4]: - qs = qs.filter(Status=int(zhuangtai)) + # 状态筛选(5=平台审核队列,含旧版商家直写待缴纳未审) + from utils.penalty_status import ( + penalty_platform_audit_pending_q, APPLICANT_MERCHANT, + ) + zhuangtai_raw = request.data.get('zhuangtai') + if zhuangtai_raw is not None and str(zhuangtai_raw).strip() != '': + try: + zt = int(zhuangtai_raw) + if zt == 5: + qs = qs.filter(penalty_platform_audit_pending_q()) + elif zt == 1: + legacy_pending_q = Q( + Status=1, ApplicantIdentity=APPLICANT_MERCHANT, + ) & (Q(ProcessorID__isnull=True) | Q(ProcessorID='')) + qs = qs.filter(Status=1).exclude(legacy_pending_q) + elif zt in (2, 3, 4): + qs = qs.filter(Status=zt) + except (ValueError, TypeError): + pass # 被处罚人ID PenalizedUserID = request.data.get('PenalizedUserID', '').strip() @@ -6498,6 +6519,8 @@ class FaKuanLieBiaoView(APIView): else: shensu_map.setdefault(fid, []).append(url) + from utils.penalty_status import penalty_display_status, is_penalty_platform_audit_pending + # 组装列表数据 results = [] for r in records: @@ -6512,6 +6535,8 @@ class FaKuanLieBiaoView(APIView): 'fakuanjine': str(r.FineAmount), 'guanliandingdan_id': r.RelatedOrderID or '', 'zhuangtai': r.Status, + 'zhuangtai_text': penalty_display_status(r), + 'platform_audit_pending': is_penalty_platform_audit_pending(r), 'yingxiang_qiangdan': r.AffectsGrabbing, 'shensuliyou': r.AppealReason or '', 'bohuiliyou': r.RejectReason or '', @@ -6641,7 +6666,8 @@ class FaKuanPingTaiShenHeView(APIView): def post(self, request): try: from utils.penalty_status import ( - PENALTY_PLATFORM_AUDIT, PENALTY_PENDING_PAY, PENALTY_APPEALING, PENALTY_REJECTED, + PENALTY_PENDING_PAY, PENALTY_APPEALING, PENALTY_REJECTED, + is_penalty_platform_audit_pending, ) username = request.data.get('username', '').strip() penalty_id = request.data.get('penalty_id') or request.data.get('fadan_id') @@ -6665,7 +6691,7 @@ class FaKuanPingTaiShenHeView(APIView): if deny: return deny - if penalty.Status != PENALTY_PLATFORM_AUDIT: + if not is_penalty_platform_audit_pending(penalty): return Response({'code': 400, 'msg': '当前状态不可平台审核'}) if not check_fadan_permission(permissions, penalty.Identity): diff --git a/utils/penalty_status.py b/utils/penalty_status.py index be39299..0c9c2a6 100644 --- a/utils/penalty_status.py +++ b/utils/penalty_status.py @@ -19,3 +19,38 @@ PENALTY_STATUS_LABELS = { 4: '已驳回', 5: '平台审核中', } + +# 商家身份(ApplicantIdentity) +APPLICANT_MERCHANT = 5 + + +def penalty_platform_audit_pending_q(): + """ + 待平台审核队列: + - 新流程:zhuangtai=5 + - 旧数据:商家提交直写 zhuangtai=1 且尚未有平台处理人 + """ + from django.db.models import Q + + legacy_merchant_pending = Q( + Status=PENALTY_PENDING_PAY, + ApplicantIdentity=APPLICANT_MERCHANT, + ) & (Q(ProcessorID__isnull=True) | Q(ProcessorID='')) + return Q(Status=PENALTY_PLATFORM_AUDIT) | legacy_merchant_pending + + +def is_penalty_platform_audit_pending(penalty): + """单条罚单是否处于平台审核队列(含旧数据)。""" + status = getattr(penalty, 'Status', None) + if status == PENALTY_PLATFORM_AUDIT: + return True + if status == PENALTY_PENDING_PAY and getattr(penalty, 'ApplicantIdentity', None) == APPLICANT_MERCHANT: + return not (getattr(penalty, 'ProcessorID', None) or '').strip() + return False + + +def penalty_display_status(penalty): + """列表/详情展示用状态文案。""" + if is_penalty_platform_audit_pending(penalty): + return PENALTY_STATUS_LABELS[PENALTY_PLATFORM_AUDIT] + return PENALTY_STATUS_LABELS.get(getattr(penalty, 'Status', None), '未知')