feat: 仅特约商家可更换打手,后台可开关
This commit is contained in:
@@ -966,6 +966,7 @@ class KefuGetShangjiaDetailView(APIView):
|
|||||||
'jinyuedingdan': shangjia.jinyuedingdan,
|
'jinyuedingdan': shangjia.jinyuedingdan,
|
||||||
'jinyueliushui': str(shangjia.jinyueliushui),
|
'jinyueliushui': str(shangjia.jinyueliushui),
|
||||||
'is_youzhi_shangjia': bool(shangjia.is_youzhi_shangjia),
|
'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,
|
'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 '',
|
'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'})
|
return Response({'code': 401, 'msg': '缺少username'})
|
||||||
if not yonghuid:
|
if not yonghuid:
|
||||||
return Response({'code': 400, 'msg': '缺少商家ID'})
|
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参数无效'})
|
return Response({'code': 400, 'msg': 'action参数无效'})
|
||||||
|
|
||||||
# 权限校验
|
# 权限校验
|
||||||
@@ -1008,7 +1009,7 @@ class KefuUpdateShangjiaView(APIView):
|
|||||||
return permissions
|
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)'})
|
return Response({'code': 403, 'msg': '无权限执行此操作(需要1100a)'})
|
||||||
if action == 'sub_balance' and '1100b' not in permissions:
|
if action == 'sub_balance' and '1100b' not in permissions:
|
||||||
return Response({'code': 403, 'msg': '无权限减少商家余额(需要1100b)'})
|
return Response({'code': 403, 'msg': '无权限减少商家余额(需要1100b)'})
|
||||||
@@ -1139,6 +1140,27 @@ class KefuUpdateShangjiaView(APIView):
|
|||||||
'data': {'is_youzhi_shangjia': is_youzhi},
|
'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': '未知操作'})
|
return Response({'code': 400, 'msg': '未知操作'})
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1785,12 +1785,23 @@ class ZxsjghdsView(APIView):
|
|||||||
except AttributeError:
|
except AttributeError:
|
||||||
return Response({'code': 1, 'msg': '用户认证失败'}, status=status.HTTP_401_UNAUTHORIZED)
|
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()
|
dingdan_id = str(request.data.get('OrderID') or request.data.get('dingdan_id') or '').strip()
|
||||||
if not dingdan_id:
|
if not dingdan_id:
|
||||||
return Response({'code': 2, 'msg': '订单ID不能为空'}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({'code': 2, 'msg': '订单ID不能为空'}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
# ========== 3. 查询订单并校验权限 ==========
|
# ========== 4. 查询订单并校验权限 ==========
|
||||||
try:
|
try:
|
||||||
# 关联查询商家扩展表,确保当前商家是该订单的发布者
|
# 关联查询商家扩展表,确保当前商家是该订单的发布者
|
||||||
shangjia_kuozhan = MerchantOrderExt.query.select_related('Order').get(
|
shangjia_kuozhan = MerchantOrderExt.query.select_related('Order').get(
|
||||||
@@ -1802,7 +1813,7 @@ class ZxsjghdsView(APIView):
|
|||||||
|
|
||||||
old_order = shangjia_kuozhan.Order
|
old_order = shangjia_kuozhan.Order
|
||||||
|
|
||||||
# ========== 4. 状态校验(仅允许进行中或结算中) ==========
|
# ========== 5. 状态校验(仅允许进行中或结算中) ==========
|
||||||
if old_order.Status not in [2, 8]:
|
if old_order.Status not in [2, 8]:
|
||||||
return Response({'code': 4, 'msg': '当前订单状态不允许更换打手'}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({'code': 4, 'msg': '当前订单状态不允许更换打手'}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|||||||
16
users/migrations/0009_user_shangjia_teyue.py
Normal file
16
users/migrations/0009_user_shangjia_teyue.py
Normal file
@@ -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='特约商家'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -205,6 +205,7 @@ class UserShangjia(QModel):
|
|||||||
jinyuedingdan = models.IntegerField(default=0, verbose_name='商家今月订单总量')
|
jinyuedingdan = models.IntegerField(default=0, verbose_name='商家今月订单总量')
|
||||||
jinyueliushui = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, 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_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='创建时间')
|
CreateTime = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|||||||
Reference in New Issue
Block a user