diff --git a/backend/views/kefu.py b/backend/views/kefu.py index a4e1383..9c87d06 100644 --- a/backend/views/kefu.py +++ b/backend/views/kefu.py @@ -966,6 +966,7 @@ class KefuGetShangjiaDetailView(APIView): 'jinyuedingdan': shangjia.jinyuedingdan, 'jinyueliushui': str(shangjia.jinyueliushui), 'is_youzhi_shangjia': bool(shangjia.is_youzhi_shangjia), + 'is_teyue_shangjia': bool(getattr(shangjia, 'is_teyue_shangjia', False)), 'CreateTime': shangjia.CreateTime.isoformat() if shangjia.CreateTime else None, 'create_time': user.UserCreateTime.strftime('%Y-%m-%d %H:%M:%S') if getattr(user, 'UserCreateTime', None) else '', } @@ -999,7 +1000,7 @@ class KefuUpdateShangjiaView(APIView): return Response({'code': 401, 'msg': '缺少username'}) if not yonghuid: return Response({'code': 400, 'msg': '缺少商家ID'}) - if action not in ('add_balance', 'sub_balance', 'ban', 'unban', 'set_youzhi'): + if action not in ('add_balance', 'sub_balance', 'ban', 'unban', 'set_youzhi', 'set_teyue'): return Response({'code': 400, 'msg': 'action参数无效'}) # 权限校验 @@ -1008,7 +1009,7 @@ class KefuUpdateShangjiaView(APIView): return permissions # 操作权限校验 - if action in ('add_balance', 'ban', 'unban', 'set_youzhi') and '1100a' not in permissions: + if action in ('add_balance', 'ban', 'unban', 'set_youzhi', 'set_teyue') and '1100a' not in permissions: return Response({'code': 403, 'msg': '无权限执行此操作(需要1100a)'}) if action == 'sub_balance' and '1100b' not in permissions: return Response({'code': 403, 'msg': '无权限减少商家余额(需要1100b)'}) @@ -1139,6 +1140,27 @@ class KefuUpdateShangjiaView(APIView): 'data': {'is_youzhi_shangjia': is_youzhi}, }) + if action == 'set_teyue': + if '1100a' not in permissions: + return Response({'code': 403, 'msg': '无权限设置特约商家(需要1100a)'}) + is_teyue = bool(request.data.get('is_teyue_shangjia', False)) + shangjia.is_teyue_shangjia = is_teyue + shangjia.save(update_fields=['is_teyue_shangjia']) + write_xiugai_log( + yonghuid=yonghuid, + xiugaiid=kefu.user.Phone, + leixing=XIUGAI_LEIXING_SHANGJIA, + qitashuoming=( + f'【后台】设置特约商家(可更换打手):{is_teyue},' + f'商家ID={yonghuid},昵称={shangjia.nicheng},操作人={kefu.user.Phone}' + ), + ) + return Response({ + 'code': 0, + 'msg': '特约商家设置成功', + 'data': {'is_teyue_shangjia': is_teyue}, + }) + return Response({'code': 400, 'msg': '未知操作'}) diff --git a/orders/views/admin.py b/orders/views/admin.py index 83f9b59..349e68b 100644 --- a/orders/views/admin.py +++ b/orders/views/admin.py @@ -1785,12 +1785,23 @@ class ZxsjghdsView(APIView): except AttributeError: return Response({'code': 1, 'msg': '用户认证失败'}, status=status.HTTP_401_UNAUTHORIZED) - # ========== 2. 提取订单ID ========== + # ========== 2. 仅特约商家可更换打手 ========== + try: + shop_profile = UserShangjia.query.get(user__UserUID=yonghuid) + except UserShangjia.DoesNotExist: + return Response({'code': 3, 'msg': '商家信息不存在'}, status=status.HTTP_403_FORBIDDEN) + if not bool(getattr(shop_profile, 'is_teyue_shangjia', False)): + return Response( + {'code': 403, 'msg': '仅特约商家可更换打手,请申请退款或结算'}, + status=status.HTTP_403_FORBIDDEN, + ) + + # ========== 3. 提取订单ID ========== dingdan_id = str(request.data.get('OrderID') or request.data.get('dingdan_id') or '').strip() if not dingdan_id: return Response({'code': 2, 'msg': '订单ID不能为空'}, status=status.HTTP_400_BAD_REQUEST) - # ========== 3. 查询订单并校验权限 ========== + # ========== 4. 查询订单并校验权限 ========== try: # 关联查询商家扩展表,确保当前商家是该订单的发布者 shangjia_kuozhan = MerchantOrderExt.query.select_related('Order').get( @@ -1802,7 +1813,7 @@ class ZxsjghdsView(APIView): old_order = shangjia_kuozhan.Order - # ========== 4. 状态校验(仅允许进行中或结算中) ========== + # ========== 5. 状态校验(仅允许进行中或结算中) ========== if old_order.Status not in [2, 8]: return Response({'code': 4, 'msg': '当前订单状态不允许更换打手'}, status=status.HTTP_400_BAD_REQUEST) diff --git a/users/migrations/0009_user_shangjia_teyue.py b/users/migrations/0009_user_shangjia_teyue.py new file mode 100644 index 0000000..70d7558 --- /dev/null +++ b/users/migrations/0009_user_shangjia_teyue.py @@ -0,0 +1,16 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0008_fengjin_yuanyin'), + ] + + operations = [ + migrations.AddField( + model_name='usershangjia', + name='is_teyue_shangjia', + field=models.BooleanField(default=False, verbose_name='特约商家'), + ), + ] diff --git a/users/models.py b/users/models.py index 0f1345d..52a0ad9 100644 --- a/users/models.py +++ b/users/models.py @@ -205,6 +205,7 @@ class UserShangjia(QModel): jinyuedingdan = models.IntegerField(default=0, verbose_name='商家今月订单总量') jinyueliushui = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='商家今月流水') is_youzhi_shangjia = models.BooleanField(default=False, verbose_name='优质商家') + is_teyue_shangjia = models.BooleanField(default=False, verbose_name='特约商家') CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') class Meta: