From 0cd20850e0d8ddd02711a0606efd6cb7ee7289e1 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Fri, 19 Jun 2026 13:42:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=20=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=91=98=20=E6=97=A0=20=E5=AE=A2=E6=9C=8D=E6=89=A9?= =?UTF-8?q?=E5=B1=95=E8=A1=A8=20=E8=A7=86=E5=9B=BE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- users/views.py | 328 +++++++++++++++++++++++++++++-------------------- 1 file changed, 198 insertions(+), 130 deletions(-) diff --git a/users/views.py b/users/views.py index 82caf51..4c0c7af 100644 --- a/users/views.py +++ b/users/views.py @@ -6901,7 +6901,18 @@ class KefuStatsView(APIView): logger.warning(f"统计接口用户类型非客服: {current_user.UserUID}") return Response({'detail': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - # 5. 尝试获取客服扩展表数据 + # 5. 尝试获取客服扩展表数据(管理员跳过) + is_admin = current_user.UserType == 'admin' or current_user.IsSuperuser + if is_admin: + return Response({ + 'code': 0, + 'data': { + 'jinrichuli': 0, + 'jinyuechuli': 0, + 'zongchuli': 0, + } + }, status=status.HTTP_200_OK) + try: kefu_profile = current_user.KefuProfile # OneToOneField 反向关系 except UserKefu.DoesNotExist: @@ -6952,15 +6963,18 @@ class KefuGetOrderTypesView(APIView): logger.warning(f"用户类型非客服: {current_user.UserUID}") return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - try: - kefu_profile = current_user.KefuProfile - except ObjectDoesNotExist: - logger.warning(f"客服扩展表不存在: {current_user.UserUID}") - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + # 管理员跳过客服扩展表检查 + is_admin = current_user.UserType == 'admin' or current_user.IsSuperuser + if not is_admin: + try: + kefu_profile = current_user.KefuProfile + except ObjectDoesNotExist: + logger.warning(f"客服扩展表不存在: {current_user.UserUID}") + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - if kefu_profile.zhuangtai != 1: - logger.warning(f"客服账号已被禁用: {current_user.UserUID}") - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + if kefu_profile.zhuangtai != 1: + logger.warning(f"客服账号已被禁用: {current_user.UserUID}") + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) # 4. 查询订单类型(商品类型) try: @@ -7360,15 +7374,18 @@ class KefuChangeDashouView(APIView): logger.warning(f"用户类型非客服: {current_user.UserUID}") return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - try: - kefu = current_user.KefuProfile - except ObjectDoesNotExist: - logger.warning(f"客服扩展表不存在: {current_user.UserUID}") - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + is_admin = current_user.UserType == 'admin' or current_user.IsSuperuser + kefu = None + if not is_admin: + try: + kefu = current_user.KefuProfile + except ObjectDoesNotExist: + logger.warning(f"客服扩展表不存在: {current_user.UserUID}") + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - if kefu.zhuangtai != 1: - logger.warning(f"客服账号已禁用: {current_user.UserUID}") - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + if kefu.zhuangtai != 1: + logger.warning(f"客服账号已禁用: {current_user.UserUID}") + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) # 3. 查询订单 try: @@ -7497,13 +7514,16 @@ class KefuRecoverOrderView(APIView): if current_user.UserType not in ('kefu', 'admin'): return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - try: - kefu = current_user.KefuProfile - except ObjectDoesNotExist: - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + is_admin = current_user.UserType == 'admin' or current_user.IsSuperuser + kefu = None + if not is_admin: + try: + kefu = current_user.KefuProfile + except ObjectDoesNotExist: + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - if kefu.zhuangtai != 1: - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + if kefu.zhuangtai != 1: + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) # 3. 查询订单 try: @@ -7570,15 +7590,18 @@ class KefuPlatformRefundView(APIView): logger.warning(f"用户类型非客服: {current_user.UserUID}") return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - try: - kefu = current_user.KefuProfile - except ObjectDoesNotExist: - logger.warning(f"客服扩展表不存在: {current_user.UserUID}") - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + is_admin = current_user.UserType == 'admin' or current_user.IsSuperuser + kefu = None + if not is_admin: + try: + kefu = current_user.KefuProfile + except ObjectDoesNotExist: + logger.warning(f"客服扩展表不存在: {current_user.UserUID}") + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - if kefu.zhuangtai != 1: - logger.warning(f"客服账号已禁用: {current_user.UserUID}") - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + if kefu.zhuangtai != 1: + logger.warning(f"客服账号已禁用: {current_user.UserUID}") + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) # 3. 查询订单并加锁 try: @@ -7849,13 +7872,16 @@ class KefuRejectRefundView(APIView): if current_user.UserType not in ('kefu', 'admin'): return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - try: - kefu = current_user.KefuProfile - except ObjectDoesNotExist: - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + is_admin = current_user.UserType == 'admin' or current_user.IsSuperuser + kefu = None + if not is_admin: + try: + kefu = current_user.KefuProfile + except ObjectDoesNotExist: + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - if kefu.zhuangtai != 1: - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + if kefu.zhuangtai != 1: + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) # 3. 查询订单并加锁 try: @@ -8015,13 +8041,16 @@ class KefuMerchantRefundView(APIView): if current_user.UserType not in ('kefu', 'admin'): return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - try: - kefu = current_user.KefuProfile - except ObjectDoesNotExist: - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + is_admin = current_user.UserType == 'admin' or current_user.IsSuperuser + kefu = None + if not is_admin: + try: + kefu = current_user.KefuProfile + except ObjectDoesNotExist: + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - if kefu.zhuangtai != 1: - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + if kefu.zhuangtai != 1: + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) # 查询订单,预加载商家扩展表 @@ -8111,11 +8140,14 @@ class KefuMerchantRefundView(APIView): - kefu = current_user.KefuProfile - kefu.jinrichuli += 1 - kefu.jinyuechuli += 1 - kefu.zongchuli += 1 - kefu.save() + # 管理员无客服扩展表,跳过计数器更新 + is_admin = current_user.UserType == 'admin' or current_user.IsSuperuser + if not is_admin: + kefu = current_user.KefuProfile + kefu.jinrichuli += 1 + kefu.jinyuechuli += 1 + kefu.zongchuli += 1 + kefu.save() return Response({'code': 0, 'msg': '退款成功'}) @@ -8155,15 +8187,18 @@ class KefuRejectSettlementView(APIView): logger.warning(f"用户类型非客服: {current_user.UserUID}") return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - try: - kefu = current_user.KefuProfile - except ObjectDoesNotExist: - logger.warning(f"客服扩展表不存在: {current_user.UserUID}") - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + is_admin = current_user.UserType == 'admin' or current_user.IsSuperuser + kefu = None + if not is_admin: + try: + kefu = current_user.KefuProfile + except ObjectDoesNotExist: + logger.warning(f"客服扩展表不存在: {current_user.UserUID}") + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - if kefu.zhuangtai != 1: - logger.warning(f"客服账号已禁用: {current_user.UserUID}") - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + if kefu.zhuangtai != 1: + logger.warning(f"客服账号已禁用: {current_user.UserUID}") + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) # 3. 查询订单,预加载平台扩展表 try: @@ -8264,12 +8299,15 @@ class KefuTransferHallView(APIView): return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) if current_user.UserType not in ('kefu', 'admin'): return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - try: - kefu = current_user.KefuProfile - if kefu.zhuangtai != 1: + is_admin = current_user.UserType == 'admin' or current_user.IsSuperuser + kefu = None + if not is_admin: + try: + kefu = current_user.KefuProfile + if kefu.zhuangtai != 1: + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + except ObjectDoesNotExist: return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - except ObjectDoesNotExist: - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) # 3. 查询订单 try: @@ -8332,12 +8370,15 @@ class KefuCancelDesignationView(APIView): return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) if current_user.UserType not in ('kefu', 'admin'): return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - try: - kefu = current_user.KefuProfile - if kefu.zhuangtai != 1: + is_admin = current_user.UserType == 'admin' or current_user.IsSuperuser + kefu = None + if not is_admin: + try: + kefu = current_user.KefuProfile + if kefu.zhuangtai != 1: + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + except ObjectDoesNotExist: return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - except ObjectDoesNotExist: - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) # 3. 查询订单 try: @@ -8413,15 +8454,18 @@ class KefuGetDashouListView(APIView): logger.warning(f"用户类型非客服: {current_user.UserUID}") return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - try: - kefu = current_user.KefuProfile - except ObjectDoesNotExist: - logger.warning(f"客服扩展表不存在: {current_user.UserUID}") - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + is_admin = current_user.UserType == 'admin' or current_user.IsSuperuser + kefu = None + if not is_admin: + try: + kefu = current_user.KefuProfile + except ObjectDoesNotExist: + logger.warning(f"客服扩展表不存在: {current_user.UserUID}") + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - if kefu.zhuangtai != 1: - logger.warning(f"客服账号已禁用: {current_user.UserUID}") - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + if kefu.zhuangtai != 1: + logger.warning(f"客服账号已禁用: {current_user.UserUID}") + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) # 3. 构建查询条件(只查询打手) # 通过 UserDashou 扩展表关联 User @@ -8501,15 +8545,18 @@ class KefuGetDashouDetailView(APIView): logger.warning(f"用户类型非客服: {current_user.UserUID}") return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - try: - kefu = current_user.KefuProfile - except ObjectDoesNotExist: - logger.warning(f"客服扩展表不存在: {current_user.UserUID}") - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + is_admin = current_user.UserType == 'admin' or current_user.IsSuperuser + kefu = None + if not is_admin: + try: + kefu = current_user.KefuProfile + except ObjectDoesNotExist: + logger.warning(f"客服扩展表不存在: {current_user.UserUID}") + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - if kefu.zhuangtai != 1: - logger.warning(f"客服账号已禁用: {current_user.UserUID}") - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + if kefu.zhuangtai != 1: + logger.warning(f"客服账号已禁用: {current_user.UserUID}") + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) # 3. 查询打手主表和扩展表 try: @@ -9042,13 +9089,16 @@ class KefuGetOrderDetailView(APIView): return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) # 客服扩展表 - try: - kefu = current_user.KefuProfile - if kefu.zhuangtai != 1: - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - except Exception as e: - logger.exception(f"[kefuhqddxq] 获取客服扩展表异常 user={getattr(current_user, 'yonghuid', '?')}") - return Response({'code': 500, 'msg': '服务器错误'}, status=500) + is_admin = current_user.UserType == 'admin' or current_user.IsSuperuser + kefu = None + if not is_admin: + try: + kefu = current_user.KefuProfile + if kefu.zhuangtai != 1: + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + except Exception as e: + logger.exception(f"[kefuhqddxq] 获取客服扩展表异常 user={getattr(current_user, 'yonghuid', '?')}") + return Response({'code': 500, 'msg': '服务器错误'}, status=500) # 3. 查询订单 try: @@ -9183,15 +9233,18 @@ class KefuPunishmentDetailView(APIView): logger.warning(f"用户类型非客服: {current_user.UserUID}") return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - try: - kefu = current_user.KefuProfile - except ObjectDoesNotExist: - logger.warning(f"客服扩展表不存在: {current_user.UserUID}") - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + is_admin = current_user.UserType == 'admin' or current_user.IsSuperuser + kefu = None + if not is_admin: + try: + kefu = current_user.KefuProfile + except ObjectDoesNotExist: + logger.warning(f"客服扩展表不存在: {current_user.UserUID}") + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - if kefu.zhuangtai != 1: - logger.warning(f"客服账号已禁用: {current_user.UserUID}") - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + if kefu.zhuangtai != 1: + logger.warning(f"客服账号已禁用: {current_user.UserUID}") + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) # 查询处罚记录(按创建时间倒序取最新一条) try: @@ -9272,12 +9325,15 @@ class KefuPunishmentActionView(APIView): return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) if current_user.UserType not in ('kefu', 'admin'): return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - try: - kefu = current_user.KefuProfile - if kefu.zhuangtai != 1: + is_admin = current_user.UserType == 'admin' or current_user.IsSuperuser + kefu = None + if not is_admin: + try: + kefu = current_user.KefuProfile + if kefu.zhuangtai != 1: + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + except ObjectDoesNotExist: return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - except ObjectDoesNotExist: - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) # 查询待处理的处罚记录(状态0或3) try: @@ -9401,13 +9457,16 @@ class KefuForceCompleteView(APIView): if current_user.UserType not in ('kefu', 'admin'): return Response({'code': 401, 'msg': '认证失败'}) - try: - kefu = current_user.KefuProfile - except ObjectDoesNotExist: - return Response({'code': 401, 'msg': '认证失败'}) + is_admin = current_user.UserType == 'admin' or current_user.IsSuperuser + kefu = None + if not is_admin: + try: + kefu = current_user.KefuProfile + except ObjectDoesNotExist: + return Response({'code': 401, 'msg': '认证失败'}) - if kefu.zhuangtai != 1: - return Response({'code': 401, 'msg': '客服状态异常'}) + if kefu.zhuangtai != 1: + return Response({'code': 401, 'msg': '客服状态异常'}) # 2. 订单处理(事务内) try: @@ -9874,15 +9933,18 @@ class KefuWithdrawDetailView(APIView): logger.warning(f"用户类型非客服: {current_user.UserUID}") return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - try: - kefu = current_user.KefuProfile - except ObjectDoesNotExist: - logger.warning(f"客服扩展表不存在: {current_user.UserUID}") - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + is_admin = current_user.UserType == 'admin' or current_user.IsSuperuser + kefu = None + if not is_admin: + try: + kefu = current_user.KefuProfile + except ObjectDoesNotExist: + logger.warning(f"客服扩展表不存在: {current_user.UserUID}") + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - if kefu.zhuangtai != 1: - logger.warning(f"客服账号已禁用: {current_user.UserUID}") - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + if kefu.zhuangtai != 1: + logger.warning(f"客服账号已禁用: {current_user.UserUID}") + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) # 查询提现记录 try: @@ -9982,12 +10044,15 @@ class KefuWithdrawActionView(APIView): return None, Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) if current_user.UserType not in ('kefu', 'admin'): return None, Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - try: - kefu = current_user.KefuProfile - except ObjectDoesNotExist: - return None, Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - if kefu.zhuangtai != 1: - return None, Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + # 管理员跳过客服扩展表检查 + is_admin = current_user.UserType == 'admin' or current_user.IsSuperuser + if not is_admin: + try: + kefu = current_user.KefuProfile + except ObjectDoesNotExist: + return None, Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + if kefu.zhuangtai != 1: + return None, Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) return current_user, None def _parse_items(self, request): @@ -10242,15 +10307,18 @@ class KefuPunishView(APIView): logger.warning(f"用户类型非客服: {current_user.UserUID}") return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - try: - kefu = current_user.KefuProfile - except ObjectDoesNotExist: - logger.warning(f"客服扩展表不存在: {current_user.UserUID}") - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + is_admin = current_user.UserType == 'admin' or current_user.IsSuperuser + kefu = None + if not is_admin: + try: + kefu = current_user.KefuProfile + except ObjectDoesNotExist: + logger.warning(f"客服扩展表不存在: {current_user.UserUID}") + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - if kefu.zhuangtai != 1: - logger.warning(f"客服账号已禁用: {current_user.UserUID}") - return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) + if kefu.zhuangtai != 1: + logger.warning(f"客服账号已禁用: {current_user.UserUID}") + return Response({'code': 401, 'msg': '认证失败'}, status=status.HTTP_401_UNAUTHORIZED) # 3. 查询订单 try: