修复 JWT 验证 401 问题

This commit is contained in:
2026-06-18 20:29:37 +08:00
parent 5c8b82df15
commit 05498904cf
2 changed files with 74 additions and 74 deletions

View File

@@ -403,7 +403,7 @@ class WechatPayNotifyView(APIView):
def _get_game_type_name(self, leixing_id): def _get_game_type_name(self, leixing_id):
try: try:
gt = ShangpinLeixing.query.filter(id=leixing_id).first() gt = ShangpinLeixing.query.filter(id=leixing_id).first()
return gt.Description if gt else '游戏订单' return gt.jieshao if gt else '游戏订单'
except Exception as e: except Exception as e:
logger.error(f"获取游戏类型名称异常: {e}") logger.error(f"获取游戏类型名称异常: {e}")
return '游戏订单' return '游戏订单'
@@ -805,18 +805,18 @@ class CreateOrderView(APIView):
) )
pingtaikuozhan_data = { pingtaikuozhan_data = {
'dingdan': dingdan, 'Order': dingdan,
'laoban_id': laoban_yonghuid, 'BossID': laoban_yonghuid,
'pingtai_shouyi': pingtai_shouyi, 'pingtai_shouyi': pingtai_shouyi,
# ---------- 新增上级分红快照 ---------- # ---------- 新增上级分红快照 ----------
'shangji_dianpu_id': shangji_dianpu_id, 'ParentShopID': shangji_dianpu_id,
'shangji_fenhong': shangji_fenhong if shangji_fenhong else Decimal('0.00'), 'ParentBonus': shangji_fenhong if shangji_fenhong else Decimal('0.00'),
} }
if dianpu_id: if dianpu_id:
pingtaikuozhan_data['dianpu_id'] = dianpu_id pingtaikuozhan_data['ShopID'] = dianpu_id
pingtaikuozhan_data['dianpu_shouyi'] = dianpu_shouyi pingtaikuozhan_data['ShopIncome'] = dianpu_shouyi
else: else:
pingtaikuozhan_data['dianpu_shouyi'] = Decimal('0.00') pingtaikuozhan_data['ShopIncome'] = Decimal('0.00')
PlatformOrderExt.query.create(**pingtaikuozhan_data) PlatformOrderExt.query.create(**pingtaikuozhan_data)
@@ -1758,7 +1758,7 @@ class ShangpinLeixingView(APIView):
try: try:
# 1. 查询审核通过且抢单要求类型为1的商品类型按排序权重升序 # 1. 查询审核通过且抢单要求类型为1的商品类型按排序权重升序
shangpin_queryset = ShangpinLeixing.query.filter( shangpin_queryset = ShangpinLeixing.query.filter(
GrabRequirement=1, yaoqiuleixing=1,
shenhezhuangtai=1 shenhezhuangtai=1
).select_related('bankuai').order_by('paixu') ).select_related('bankuai').order_by('paixu')
@@ -2014,7 +2014,7 @@ class ShangjiaPaifaView(APIView):
def _get_game_type_name(self, leixing_id): def _get_game_type_name(self, leixing_id):
try: try:
gt = ShangpinLeixing.query.filter(id=leixing_id).first() gt = ShangpinLeixing.query.filter(id=leixing_id).first()
return gt.Description if gt else '游戏订单' return gt.jieshao if gt else '游戏订单'
except Exception: except Exception:
return '游戏订单' return '游戏订单'
@@ -2117,7 +2117,7 @@ class ShangjiaDingdanHuoquView(APIView):
# 10. 构建返回数据 # 10. 构建返回数据
order_list = [] order_list = []
for shangjia_order in current_page_orders: for shangjia_order in current_page_orders:
order = shangjia_order.dingdan order = shangjia_order.Order
order_data = { order_data = {
'OrderID': order.OrderID, 'OrderID': order.OrderID,
'Status': order.Status, 'Status': order.Status,
@@ -2272,7 +2272,7 @@ class ShangjiaDingdanXiangqingView(APIView):
MerchantID=yonghuid MerchantID=yonghuid
).select_related('Order').first() ).select_related('Order').first()
if new_shangjia_order: if new_shangjia_order:
xin_dingdan_id = new_shangjia_order.dingdan.OrderID xin_dingdan_id = new_shangjia_order.Order.OrderID
except Exception as e: except Exception as e:
logger.warning(f'查找新订单ID失败: {e}') logger.warning(f'查找新订单ID失败: {e}')
@@ -2457,7 +2457,7 @@ class ShangjiaJiesuanView(APIView):
if pingfen > 0: if pingfen > 0:
pingfen_obj, created = PlayerRating.query.get_or_create( pingfen_obj, created = PlayerRating.query.get_or_create(
PlayerID=jiedan_dashou_id, PlayerID=jiedan_dashou_id,
defaults={'zongfen': pingfen, 'cishu': 1} defaults={'TotalScore': pingfen, 'RatingCount': 1}
) )
if not created: if not created:
PlayerRating.query.filter(id=pingfen_obj.id).update( PlayerRating.query.filter(id=pingfen_obj.id).update(
@@ -2743,21 +2743,21 @@ class ShangjiaTuikuanShenqingView(APIView):
refund_record, created = RefundRecord.query.get_or_create( refund_record, created = RefundRecord.query.get_or_create(
OrderID=dingdan_id, OrderID=dingdan_id,
defaults={ defaults={
'dashouid': dingdan.PlayerID, 'PlayerID': dingdan.PlayerID,
'qingqiuid': current_user.yonghuid, 'ApplicantID': current_user.yonghuid,
'liyou': tuikuan_liyou, 'Reason': tuikuan_liyou,
'sqzhuangtai': 0, # 待处理 'ApplyStatus': 0, # 待处理
'jine': dingdan.Amount, 'Amount': dingdan.Amount,
'PlayerCommission': dingdan.PlayerCommission, 'PlayerCommission': dingdan.PlayerCommission,
'Description': dingdan.Description, 'Description': dingdan.Description,
'Remark': dingdan.Remark, 'Remark': dingdan.Remark,
'nicheng': dingdan.Nickname, 'Nickname': dingdan.Nickname,
} }
) )
if not created: if not created:
# 记录已存在,更新退款理由和申请时间 # 记录已存在,更新退款理由和申请时间
refund_record.Reason = tuikuan_liyou refund_record.Reason = tuikuan_liyou
refund_record.save(update_fields=['liyou', 'UpdateTime']) refund_record.save(update_fields=['Reason', 'UpdateTime'])
logger.info(f"订单 {dingdan_id} 已有退款记录,已更新退款理由") logger.info(f"订单 {dingdan_id} 已有退款记录,已更新退款理由")
# 9. 更新订单状态为4退款中 # 9. 更新订单状态为4退款中
@@ -2991,7 +2991,7 @@ class DashouDingdanHuoquView(APIView):
if biaoqian_id and int(biaoqian_id) > 0: if biaoqian_id and int(biaoqian_id) > 0:
biaoqian_order_ids = DingdanBiaoqian.query.filter( biaoqian_order_ids = DingdanBiaoqian.query.filter(
chenghao_id=int(biaoqian_id) chenghao_id=int(biaoqian_id)
).values_list('OrderID', flat=True) ).values_list('dingdan_id', flat=True)
base_query &= Q(OrderID__in=list(biaoqian_order_ids)) base_query &= Q(OrderID__in=list(biaoqian_order_ids))
# 4. 构建基础查询集 # 4. 构建基础查询集
@@ -3033,11 +3033,11 @@ class DashouDingdanHuoquView(APIView):
UserUID__in=zhiding_ids UserUID__in=zhiding_ids
).select_related('dashou_profile').annotate( ).select_related('dashou_profile').annotate(
Nickname=F('dashou_profile__nicheng') Nickname=F('dashou_profile__nicheng')
).values('UserUID', 'Avatar', 'nicheng') ).values('UserUID', 'Avatar', 'Nickname')
zhiding_info = { zhiding_info = {
item['UserUID']: { item['UserUID']: {
'avatar': item['Avatar'] or '', 'avatar': item['Avatar'] or '',
'nicheng': item['nicheng'] or '' 'nicheng': item['Nickname'] or ''
} }
for item in dashou_query for item in dashou_query
} }
@@ -3050,10 +3050,10 @@ class DashouDingdanHuoquView(APIView):
if order_ids: if order_ids:
try: try:
dbq_qs = DingdanBiaoqian.query.filter( dbq_qs = DingdanBiaoqian.query.filter(
OrderID__in=order_ids dingdan_id__in=order_ids
).select_related('chenghao') ).select_related('chenghao')
for dbq in dbq_qs: for dbq in dbq_qs:
oid = dbq.OrderID oid = dbq.dingdan_id
if oid not in xuqiu_tags_map: if oid not in xuqiu_tags_map:
xuqiu_tags_map[oid] = [] xuqiu_tags_map[oid] = []
ch = dbq.chenghao ch = dbq.chenghao
@@ -3073,9 +3073,9 @@ class DashouDingdanHuoquView(APIView):
# 使用跨表查询 Order__OrderID__in 匹配字符串订单ID # 使用跨表查询 Order__OrderID__in 匹配字符串订单ID
sj_exts = MerchantOrderExt.query.filter( sj_exts = MerchantOrderExt.query.filter(
Order__OrderID__in=shangjia_order_ids Order__OrderID__in=shangjia_order_ids
).values('OrderID', 'MerchantID') ).values('Order__OrderID', 'MerchantID')
for sj in sj_exts: for sj in sj_exts:
shangjia_id_map[sj['OrderID']] = sj['MerchantID'] shangjia_id_map[sj['Order__OrderID']] = sj['MerchantID']
if sj['MerchantID']: if sj['MerchantID']:
yonghuid_set.add(sj['MerchantID']) yonghuid_set.add(sj['MerchantID'])
@@ -3210,7 +3210,7 @@ class ShangpinLeixingHuoquView(APIView):
# 假设你的商品类型模型字段为id, jieshao, tupian_url # 假设你的商品类型模型字段为id, jieshao, tupian_url
leixing_list = ShangpinLeixing.query.all().values( leixing_list = ShangpinLeixing.query.all().values(
'id', # 商品类型ID 'id', # 商品类型ID
'Description', # 类型介绍 'jieshao', # 类型介绍
'tupian_url' # 类型图片URL相对URL 'tupian_url' # 类型图片URL相对URL
).order_by('id') # 按ID排序可根据需要调整 ).order_by('id') # 按ID排序可根据需要调整
@@ -3219,7 +3219,7 @@ class ShangpinLeixingHuoquView(APIView):
for leixing in leixing_list: for leixing in leixing_list:
formatted_leixing = { formatted_leixing = {
'id': leixing['id'], 'id': leixing['id'],
'Description': leixing['Description'] or '', # 处理空值 'jieshao': leixing['jieshao'] or '', # 处理空值
'tupian_url': leixing['tupian_url'] or '' # 处理空值 'tupian_url': leixing['tupian_url'] or '' # 处理空值
} }
formatted_list.append(formatted_leixing) formatted_list.append(formatted_leixing)
@@ -3652,7 +3652,7 @@ class QiangdanView(APIView):
def _validate_huiyuan_requirement(self, order, dashou_yonghuid): def _validate_huiyuan_requirement(self, order, dashou_yonghuid):
try: try:
huiyuan_record = Huiyuangoumai.query.get( huiyuan_record = Huiyuangoumai.query.get(
MembershipID=order.MembershipID, huiyuan_id=order.MembershipID,
yonghu_id=dashou_yonghuid yonghu_id=dashou_yonghuid
) )
if huiyuan_record.jiance_shifou_daoqi() or huiyuan_record.huiyuan_zhuangtai != 1: if huiyuan_record.jiance_shifou_daoqi() or huiyuan_record.huiyuan_zhuangtai != 1:
@@ -3755,7 +3755,7 @@ class DashouDingdanHuoquView1(APIView):
'PlayerCommission', # 打手分成金额 'PlayerCommission', # 打手分成金额
'Description', 'Description',
'ImageURL', 'ImageURL',
'nicheng', 'Nickname',
'CreateTime' 'CreateTime'
) )
@@ -4554,9 +4554,9 @@ class AdGetDingdanXiangQing(APIView):
OrderID=dingdan_id OrderID=dingdan_id
).order_by('-CreateTime').first() # 按创建时间倒序,取最新的 ).order_by('-CreateTime').first() # 按创建时间倒序,取最新的
if tuikuan_record and tuikuan_record.liyou: if tuikuan_record and tuikuan_record.Reason:
# 如果有退款记录且理由不为空,添加到返回数据 # 如果有退款记录且理由不为空,添加到返回数据
response_data['tuikuan_liyou'] = tuikuan_record.liyou response_data['tuikuan_liyou'] = tuikuan_record.Reason
else: else:
# 没有找到退款记录或理由为空 # 没有找到退款记录或理由为空
response_data['tuikuan_liyou'] = '' response_data['tuikuan_liyou'] = ''
@@ -4714,7 +4714,7 @@ class AdGengHuanDaShou(APIView):
# 查询会员购买记录 # 查询会员购买记录
try: try:
huiyuan_goumai = Huiyuangoumai.query.get( huiyuan_goumai = Huiyuangoumai.query.get(
MembershipID=huiyuan_id, huiyuan_id=huiyuan_id,
yonghu_id=new_dashou_id # 注意yonghu_id存储的是用户IDyonghuid yonghu_id=new_dashou_id # 注意yonghu_id存储的是用户IDyonghuid
) )
except Huiyuangoumai.DoesNotExist: except Huiyuangoumai.DoesNotExist:
@@ -5161,7 +5161,7 @@ class AdJuJueTuiKuan(APIView):
tuikuan_jilu = RefundRecord.query.get(OrderID=dingdan_id) tuikuan_jilu = RefundRecord.query.get(OrderID=dingdan_id)
# ✅ 确认字段sqzhuangtai 申请状态改为2驳回 # ✅ 确认字段sqzhuangtai 申请状态改为2驳回
tuikuan_jilu.PenaltyApplyStatus = 2 tuikuan_jilu.ApplyStatus = 2
# ✅ 确认字段bhliyou 驳回理由 # ✅ 确认字段bhliyou 驳回理由
tuikuan_jilu.RejectReason = jujue_liyou tuikuan_jilu.RejectReason = jujue_liyou
@@ -5571,20 +5571,20 @@ class AdTongYiTuiKuanPingTai(APIView):
tuikuan_jilu, created = RefundRecord.query.get_or_create( tuikuan_jilu, created = RefundRecord.query.get_or_create(
OrderID=dingdan_id, OrderID=dingdan_id,
defaults={ defaults={
'dashouid': jiedan_dashou_id if jiedan_dashou_id else '', 'PlayerID': jiedan_dashou_id if jiedan_dashou_id else '',
'qingqiuid': laoban_id if laoban_id else '', 'ApplicantID': laoban_id if laoban_id else '',
'chuliid': qianzhanghao, 'ProcessorID': qianzhanghao,
'liyou': tuikuan_liyou if tuikuan_liyou else '给老板退款', 'Reason': tuikuan_liyou if tuikuan_liyou else '给老板退款',
'sqzhuangtai': 1, 'ApplyStatus': 1,
'jine': jine, 'Amount': jine,
'PlayerCommission': dingdan_obj.PlayerCommission or 0, 'PlayerCommission': dingdan_obj.PlayerCommission or 0,
'Description': dingdan_obj.Description or '', 'Description': dingdan_obj.Description or '',
'Remark': '给老板退款', 'Remark': '给老板退款',
'nicheng': dingdan_obj.Nickname or '', 'Nickname': dingdan_obj.Nickname or '',
} }
) )
if not created: if not created:
tuikuan_jilu.PenaltyApplyStatus = 1 tuikuan_jilu.ApplyStatus = 1
if tuikuan_liyou: if tuikuan_liyou:
tuikuan_jilu.Reason = tuikuan_liyou tuikuan_jilu.Reason = tuikuan_liyou
tuikuan_jilu.ProcessorID = qianzhanghao tuikuan_jilu.ProcessorID = qianzhanghao
@@ -6108,7 +6108,7 @@ class DashouXiugaiView(APIView):
delete_count, _ = PlayerDeliveryImage.query.filter( delete_count, _ = PlayerDeliveryImage.query.filter(
OrderID=dingdan_id, OrderID=dingdan_id,
PlayerID=yonghuid, PlayerID=yonghuid,
tupian__in=deleted_images ImageURL__in=deleted_images
).delete() ).delete()
# 可选:记录删除数量 # 可选:记录删除数量
logger.info(f"订单 {dingdan_id} 删除图片 {delete_count}") logger.info(f"订单 {dingdan_id} 删除图片 {delete_count}")
@@ -6118,13 +6118,13 @@ class DashouXiugaiView(APIView):
# 批量创建 # 批量创建
new_records = [] new_records = []
for url in new_images: for url in new_images:
new_records.append(Dashoutupian( new_records.append(PlayerDeliveryImage(
OrderID=dingdan_id, OrderID=dingdan_id,
PlayerID=yonghuid, PlayerID=yonghuid,
ImageURL=url, ImageURL=url,
CreateTime=timezone.now() CreateTime=timezone.now()
)) ))
Dashoutupian.objects.bulk_create(new_records) PlayerDeliveryImage.objects.bulk_create(new_records)
logger.info(f"订单 {dingdan_id} 新增图片 {len(new_records)}") logger.info(f"订单 {dingdan_id} 新增图片 {len(new_records)}")
# 3. 更新订单留言(如果发生变化) # 3. 更新订单留言(如果发生变化)
@@ -6229,7 +6229,7 @@ class ZxsjghdsView(APIView):
dashou_profile = dashou_user.dashou_profile dashou_profile = dashou_user.dashou_profile
dashou_profile.tuikuanliang = (dashou_profile.tuikuanliang or 0) + 1 dashou_profile.tuikuanliang = (dashou_profile.tuikuanliang or 0) + 1
dashou_profile.zhuangtai = 1 # 空闲 dashou_profile.zhuangtai = 1 # 空闲
dashou_profile.save(update_fields=['tuikuanliang', 'Status']) dashou_profile.save(update_fields=['tuikuanliang', 'zhuangtai'])
except (User.DoesNotExist, ObjectDoesNotExist): except (User.DoesNotExist, ObjectDoesNotExist):
logger.warning(f"打手 {dashou_id} 不存在或扩展表缺失,跳过更新") logger.warning(f"打手 {dashou_id} 不存在或扩展表缺失,跳过更新")
@@ -6237,16 +6237,16 @@ class ZxsjghdsView(APIView):
RefundRecord.query.update_or_create( RefundRecord.query.update_or_create(
OrderID=dingdan_id, OrderID=dingdan_id,
defaults={ defaults={
'dashouid': dashou_id or '', 'PlayerID': dashou_id or '',
'qingqiuid': yonghuid, # 申请人为当前商家 'ApplicantID': yonghuid, # 申请人为当前商家
'chuliid': yonghuid, # 处理人也是商家自己 'ProcessorID': yonghuid, # 处理人也是商家自己
'liyou': '商家更换打手', 'Reason': '商家更换打手',
'sqzhuangtai': 1, # 状态 1=成功 'ApplyStatus': 1, # 状态 1=成功
'jine': jine or 0, 'Amount': jine or 0,
'PlayerCommission': dashou_fencheng or 0, 'PlayerCommission': dashou_fencheng or 0,
'Description': jieshao or '', 'Description': jieshao or '',
'Remark': '更换打手系统自动退款', 'Remark': '更换打手系统自动退款',
'nicheng': nicheng or '', 'Nickname': nicheng or '',
} }
) )
@@ -6339,7 +6339,7 @@ class ZxsjghdsView(APIView):
"""根据类型ID获取游戏类型名称""" """根据类型ID获取游戏类型名称"""
try: try:
gt = ShangpinLeixing.query.filter(id=leixing_id).first() gt = ShangpinLeixing.query.filter(id=leixing_id).first()
return gt.Description if gt else '游戏订单' return gt.jieshao if gt else '游戏订单'
except Exception: except Exception:
return '游戏订单' return '游戏订单'
@@ -6416,9 +6416,9 @@ class ShangjiaFakuanApplyView(APIView):
Penalty.query.create( Penalty.query.create(
PenalizedUserID=dashou_id, PenalizedUserID=dashou_id,
ApplicantID=shangjia_id, # 申请人为当前商家 ApplicantID=shangjia_id, # 申请人为当前商家
shenfen=1, # 被打者身份1=打手 Identity=1, # 被打者身份1=打手
Reason=chufa_liyou, Reason=chufa_liyou,
fakuanAmount=fakuanjine, FineAmount=fakuanjine,
RelatedOrderID=dingdan_id, RelatedOrderID=dingdan_id,
Status=1, # 待缴纳 Status=1, # 待缴纳
AffectsGrabbing=yingxiang_qiangdan, AffectsGrabbing=yingxiang_qiangdan,
@@ -6470,7 +6470,7 @@ class ShangjiaFakuaiXiugaiView(APIView):
return Response({'code': 400, 'msg': '缺少罚单ID'}, status=status.HTTP_400_BAD_REQUEST) return Response({'code': 400, 'msg': '缺少罚单ID'}, status=status.HTTP_400_BAD_REQUEST)
try: try:
fadan = Penalty.query.get(id=fadan_id) fadan = Penalty.query.get(id=fadan_id)
except Fadan.DoesNotExist: except Penalty.DoesNotExist:
return Response({'code': 404, 'msg': '罚单不存在'}, status=status.HTTP_404_NOT_FOUND) return Response({'code': 404, 'msg': '罚单不存在'}, status=status.HTTP_404_NOT_FOUND)
if fadan.RelatedOrderID != dingdan_id: if fadan.RelatedOrderID != dingdan_id:
return Response({'code': 403, 'msg': '罚单与订单不匹配'}, status=status.HTTP_403_FORBIDDEN) return Response({'code': 403, 'msg': '罚单与订单不匹配'}, status=status.HTTP_403_FORBIDDEN)

View File

@@ -3075,12 +3075,12 @@ class ShopFineApplyView(APIView):
# ---------- 3. 验证订单归属 ---------- # ---------- 3. 验证订单归属 ----------
try: try:
pingtai_ext = DingdanPingtai.query.select_related('dingdan').get( pingtai_ext = PlatformOrderExt.query.select_related('Order').get(
dianpu_id=shop_id, ShopID=shop_id,
dingdan__dingdan_id=dingdan_id Order__OrderID=dingdan_id
) )
order = pingtai_ext.dingdan order = pingtai_ext.Order
except DingdanPingtai.DoesNotExist: except PlatformOrderExt.DoesNotExist:
logger.warning(f"罚款申请:订单 {dingdan_id} 不属于店铺 {shop_id}") logger.warning(f"罚款申请:订单 {dingdan_id} 不属于店铺 {shop_id}")
return Response({'code': 404, 'msg': '订单不存在或不属于本店铺'}) return Response({'code': 404, 'msg': '订单不存在或不属于本店铺'})
@@ -3090,21 +3090,21 @@ class ShopFineApplyView(APIView):
return Response({'code': 400, 'msg': '该订单无接单打手,无法罚款'}) return Response({'code': 400, 'msg': '该订单无接单打手,无法罚款'})
# ---------- 5. 重复罚款检查 ---------- # ---------- 5. 重复罚款检查 ----------
if Fadan.query.filter(beichufa_id=dashou_id, guanliandingdan_id=dingdan_id).exists(): if Penalty.query.filter(PenalizedUserID=dashou_id, RelatedOrderID=dingdan_id).exists():
return Response({'code': 400, 'msg': '该打手已被罚款过'}) return Response({'code': 400, 'msg': '该打手已被罚款过'})
# ---------- 6. 创建罚单 ---------- # ---------- 6. 创建罚单 ----------
with transaction.atomic(): with transaction.atomic():
Fadan.query.create( Penalty.query.create(
beichufa_id=dashou_id, PenalizedUserID=dashou_id,
shenqing_chufa=str(shop_id), # 申请人记为店铺ID ApplicantID=str(shop_id), # 申请人记为店铺ID
shenfen=1, # 被处罚人身份1 打手 Identity=1, # 被处罚人身份1 打手
chufaliyou=chufaliyou, Reason=chufaliyou,
fakuanjine=fakuanjine, FineAmount=fakuanjine,
guanliandingdan_id=dingdan_id, RelatedOrderID=dingdan_id,
zhuangtai=1, # 待缴纳 Status=1, # 待缴纳
yingxiang_qiangdan=yingxiang_qiangdan, AffectsGrabbing=yingxiang_qiangdan,
shenqingren_shenfen=4, # 申请人身份4 店铺管理员 ApplicantIdentity=4, # 申请人身份4 店铺管理员
) )
logger.info(f"本地罚款成功: 订单 {dingdan_id}, 打手 {dashou_id}, 金额 {fakuanjine}") logger.info(f"本地罚款成功: 订单 {dingdan_id}, 打手 {dashou_id}, 金额 {fakuanjine}")
return Response({'code': 200, 'msg': '罚款已生成'}) return Response({'code': 200, 'msg': '罚款已生成'})