From 53049d158809c2017e853a30b228863afa3c3530 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 18 Jun 2026 18:02:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E4=B8=80=E4=BA=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/view.py | 647 +++--- config/views.py | 148 +- ...ion_commissionrate_escortorder_and_more.py | 392 ++++ ..._dingdan_delete_dingdanpingtai_and_more.py | 177 ++ orders/models.py | 1209 ++++++++---- orders/notice_tasks.py | 4 +- orders/signals.py | 14 +- orders/tasks.py | 30 +- orders/utils.py | 42 +- orders/views.py | 1748 ++++++++--------- products/views.py | 36 +- ...2_alter_dashoubiaoxian_dingdan_and_more.py | 25 + rank/models.py | 8 +- shop/views.py | 244 +-- users/fadan_fenhong_utils.py | 86 +- users/tixian_shenhe_services.py | 42 +- users/urls.py | 4 +- users/views.py | 1262 ++++++------ utils/chat_utils.py | 30 +- utils/fadan_utils.py | 64 +- 20 files changed, 3671 insertions(+), 2541 deletions(-) create mode 100644 orders/migrations/0002_chatsession_commissionrate_escortorder_and_more.py create mode 100644 orders/migrations/0003_delete_dingdan_delete_dingdanpingtai_and_more.py create mode 100644 rank/migrations/0002_alter_dashoubiaoxian_dingdan_and_more.py diff --git a/backend/view.py b/backend/view.py index bd7edf2..f72a58a 100644 --- a/backend/view.py +++ b/backend/view.py @@ -63,9 +63,9 @@ from gvsdsdk.models import User ## orders from orders.models import ( - Lilubiao, Dashoutupian, Chufajilu, - OrderDashouHistory, Dingdan, Tuikuanjilu, - DingdanShangjia, Fadan, FadanShensuTupian, FadanFenhong + CommissionRate, PlayerDeliveryImage, PenaltyRecord, + OrderPlayerHistory, Order, RefundRecord, + MerchantOrderExt, Penalty, PenaltyAppealImage, PenaltyBonus ) ## shop @@ -2148,7 +2148,7 @@ class AddProductView(APIView): huiyuan_id = request.data.get('huiyuan_id', '').strip() yongjin_str = request.data.get('yongjin', '0') fencheng_type = request.data.get('fencheng_type', 'default') - ewai_dashou_fencheng_str = request.data.get('ewai_dashou_fencheng', '0') + ewai_PlayerCommission_str = request.data.get('ewai_PlayerCommission', '0') jieshao = request.data.get('jieshao', '').strip() xiadan_xuzhi = request.data.get('xiadan_xuzhi', '').strip() # 图片文件 @@ -2233,7 +2233,7 @@ class AddProductView(APIView): ewai_fencheng = Decimal('0') if fencheng_type == 'custom': try: - ewai_fencheng = Decimal(ewai_dashou_fencheng_str) + ewai_fencheng = Decimal(ewai_PlayerCommission_str) if ewai_fencheng < 0: return Response({'code': 400, 'msg': '自定义分成金额不能为负数'}) kaioi_ewai = True @@ -2279,8 +2279,8 @@ class AddProductView(APIView): yaoqiuleixing=yaoqiuleixing, huiyuan_id=huiyuan_id_val, yongjin=yongjin_val, - kaioi_ewai_dashou_fencheng=kaioi_ewai, - ewai_dashou_fencheng=ewai_fencheng, + kaioi_ewai_PlayerCommission=kaioi_ewai, + ewai_PlayerCommission=ewai_fencheng, paixu=0, # 新商品默认排序最后 shenhezhuangtai=1, # 正常状态 ) @@ -2430,8 +2430,8 @@ class GetProductDetailView(APIView): 'huiyuan_id': product.huiyuan_id, 'yongjin': str(product.yongjin) if product.yongjin is not None else None, 'tupian_url': product.tupian_url, - 'kaioi_ewai_dashou_fencheng': product.kaioi_ewai_dashou_fencheng, - 'ewai_dashou_fencheng': str(product.ewai_dashou_fencheng) if product.ewai_dashou_fencheng is not None else '0', + 'kaioi_ewai_PlayerCommission': product.kaioi_ewai_PlayerCommission, + 'ewai_PlayerCommission': str(product.ewai_PlayerCommission) if product.ewai_PlayerCommission is not None else '0', 'create_time': product.create_time.isoformat() if product.create_time else None, 'shenhezhuangtai': product.shenhezhuangtai, } @@ -2552,11 +2552,11 @@ class UpdateProductView(APIView): yongjin = Decimal('0') # ---------- 3. 打手分成 ---------- - kaioi_ewai = request.data.get('kaioi_ewai_dashou_fencheng') == 'true' + kaioi_ewai = request.data.get('kaioi_ewai_PlayerCommission') == 'true' ewai_fencheng = Decimal('0') if kaioi_ewai: try: - ewai_fencheng = Decimal(str(request.data.get('ewai_dashou_fencheng', 0))) + ewai_fencheng = Decimal(str(request.data.get('ewai_PlayerCommission', 0))) if ewai_fencheng < 0: return Response({'code': 400, 'msg': '分成金额不能为负数'}) except: @@ -2615,8 +2615,8 @@ class UpdateProductView(APIView): product.yaoqiuleixing = yaoqiuleixing product.huiyuan_id = huiyuan_id product.yongjin = yongjin - product.kaioi_ewai_dashou_fencheng = kaioi_ewai - product.ewai_dashou_fencheng = ewai_fencheng + product.kaioi_ewai_PlayerCommission = kaioi_ewai + product.ewai_PlayerCommission = ewai_fencheng product.jieshao = jieshao product.xiadan_xuzhi = xiadan_xuzhi product.tupian_url = tupian_url @@ -3302,17 +3302,17 @@ class GetWithdrawSettingsView(APIView): if not any(p in permissions for p in ('5500a', '5500b', '5500c')): return Response({'code': 403, 'msg': '无权限查看提现设置'}) - # 1. 手续费利率(Lilubiao:5打手/6管事/8组长/9审核官/10商家/11打手押金) + # 1. 手续费利率(CommissionRate:5打手/6管事/8组长/9审核官/10商家/11打手押金) rate_map = {} for leixing, code in [(1, '5'), (2, '6'), (3, '8'), (4, '9'), (5, '11'), (6, '10')]: - obj = Lilubiao.query.filter(fadanpingtai=code).first() - rate_map[leixing] = float(obj.lilu) if obj and obj.lilu is not None else 0.0 + obj = CommissionRate.query.filter(Platform=code).first() + rate_map[leixing] = float(obj.Rate) if obj and obj.Rate is not None else 0.0 - # 1b. 订单/押金分红费率(Lilubiao:1平台订单/3商家订单/12押金管事/13商家订单管事分红) + # 1b. 订单/押金分红费率(CommissionRate:1平台订单/3商家订单/12押金管事/13商家订单管事分红) order_rate_map = {} for leixing, code in [(1, '1'), (3, '3'), (12, '12'), (13, '13')]: - obj = Lilubiao.query.filter(fadanpingtai=code).first() - order_rate_map[leixing] = float(obj.lilu) if obj and obj.lilu is not None else 0.0 + obj = CommissionRate.query.filter(Platform=code).first() + order_rate_map[leixing] = float(obj.Rate) if obj and obj.Rate is not None else 0.0 # 2. 个人每日限额 (leixing=1,2,3) quota_map = {} @@ -3430,12 +3430,12 @@ class UpdateWithdrawSettingsView(APIView): if val is not None: rate = Decimal(str(val)) code = rate_code_map[role] - obj, created = Lilubiao.objects.select_for_update().get_or_create( - fadanpingtai=code, - defaults={'lilu': rate} + obj, created = CommissionRate.objects.select_for_update().get_or_create( + Platform=code, + defaults={'Rate': rate} ) if not created: - obj.lilu = rate + obj.Rate = rate obj.save() # 1b. 修改订单/押金分红费率 @@ -3444,12 +3444,12 @@ class UpdateWithdrawSettingsView(APIView): if val is not None: rate = Decimal(str(val)) code = order_rate_code_map[role] - obj, created = Lilubiao.objects.select_for_update().get_or_create( - fadanpingtai=code, - defaults={'lilu': rate} + obj, created = CommissionRate.objects.select_for_update().get_or_create( + Platform=code, + defaults={'Rate': rate} ) if not created: - obj.lilu = rate + obj.Rate = rate obj.save() # 2. 修改个人每日限额 @@ -4433,17 +4433,17 @@ class GetRateView(APIView): return Response({'code': 403, 'msg': '您无权查看费率'}) try: - platform_rate_obj = Lilubiao.query.get(fadanpingtai='1') - merchant_rate_obj = Lilubiao.query.get(fadanpingtai='3') - except Lilubiao.DoesNotExist as e: + platform_rate_obj = CommissionRate.query.get(Platform='1') + merchant_rate_obj = CommissionRate.query.get(Platform='3') + except CommissionRate.DoesNotExist as e: logger.error(f"费率记录缺失: {e}") return Response({'code': 500, 'msg': '费率配置缺失'}) return Response({ 'code': 0, 'data': { - 'platform_rate': float(platform_rate_obj.lilu) if platform_rate_obj.lilu else 0, - 'merchant_rate': float(merchant_rate_obj.lilu) if merchant_rate_obj.lilu else 0, + 'platform_rate': float(platform_rate_obj.Rate) if platform_rate_obj.Rate else 0, + 'merchant_rate': float(merchant_rate_obj.Rate) if merchant_rate_obj.Rate else 0, } }) @@ -4480,18 +4480,18 @@ class ModifyRateView(APIView): if rate_type == 'platform': - fadanpingtai = '1' + Platform = '1' elif rate_type == 'merchant': - fadanpingtai = '3' + Platform = '3' else: return Response({'code': 400, 'msg': '无效的type参数'}) try: with transaction.atomic(): - rate_obj = Lilubiao.objects.select_for_update().get(fadanpingtai=fadanpingtai) - rate_obj.lilu = rate_value + rate_obj = CommissionRate.objects.select_for_update().get(Platform=Platform) + rate_obj.Rate = rate_value rate_obj.save() - except Lilubiao.DoesNotExist: + except CommissionRate.DoesNotExist: return Response({'code': 404, 'msg': '费率记录不存在'}) except Exception as e: logger.error(f"修改费率失败: {e}", exc_info=True) @@ -5532,8 +5532,8 @@ class ProductListView(APIView): 'yaoqiuleixing': p.yaoqiuleixing, 'huiyuan_id': p.huiyuan_id or '', 'yongjin': p.yongjin, - 'kaioi_ewai_dashou_fencheng': p.kaioi_ewai_dashou_fencheng, - 'ewai_dashou_fencheng': p.ewai_dashou_fencheng, + 'kaioi_ewai_PlayerCommission': p.kaioi_ewai_PlayerCommission, + 'ewai_PlayerCommission': p.ewai_PlayerCommission, 'create_time': p.create_time.isoformat() if p.create_time else '', 'update_time': p.update_time.isoformat() if p.update_time else '', 'paixu': p.paixu, @@ -5629,7 +5629,7 @@ class ProductModifyView(APIView): allowed_fields = [ 'biaoqian', 'jiage', 'kucun', 'leixing_id', 'duiwai_xiaoliang', 'jieshao', 'xiadan_xuzhi', 'yaoqiuleixing', 'yongjin', - 'kaioi_ewai_dashou_fencheng', 'ewai_dashou_fencheng', + 'kaioi_ewai_PlayerCommission', 'ewai_PlayerCommission', 'shangjia_zhuangtai', 'fengjin_zhuangtai', 'shenhe_zhuangtai' ] @@ -5637,7 +5637,7 @@ class ProductModifyView(APIView): value = request.data.get(field) if value is not None: # 简单类型校验(根据字段类型) - if field in ['jiage', 'kucun', 'duiwai_xiaoliang', 'yongjin', 'ewai_dashou_fencheng', 'paixu']: + if field in ['jiage', 'kucun', 'duiwai_xiaoliang', 'yongjin', 'ewai_PlayerCommission', 'paixu']: try: value = float(value) if 'jiage' in field or 'yongjin' in field or 'ewai' in field else int(value) except (ValueError, TypeError): @@ -5717,12 +5717,12 @@ class FaKuanTongJiView(APIView): if not has_fadan_view_permission(permissions, username): return Response({'code': 403, 'msg': '无权限查看罚款统计'}) - stats = Fadan.query.aggregate( + stats = Penalty.query.aggregate( total=Count('id'), - daijiaona=Count('id', filter=Q(zhuangtai=1)), - shensuzhong=Count('id', filter=Q(zhuangtai=3)), - yijiaona=Count('id', filter=Q(zhuangtai=2)), - yibohui=Count('id', filter=Q(zhuangtai=4)), + daijiaona=Count('id', filter=Q(Status=1)), + shensuzhong=Count('id', filter=Q(Status=3)), + yijiaona=Count('id', filter=Q(Status=2)), + yibohui=Count('id', filter=Q(Status=4)), ) data = {k: v or 0 for k, v in stats.items()} return Response({'code': 0, 'msg': '成功', 'data': data}) @@ -5756,34 +5756,33 @@ class FaKuanLieBiaoView(APIView): if page_size > 100: page_size = 100 - qs = Fadan.query.all() + qs = Penalty.query.all() # 状态筛选 zhuangtai = request.data.get('zhuangtai') if zhuangtai is not None and int(zhuangtai) in [1, 2, 3, 4]: - qs = qs.filter(zhuangtai=int(zhuangtai)) + qs = qs.filter(Status=int(zhuangtai)) # 被处罚人ID - beichufa_id = request.data.get('beichufa_id', '').strip() - if beichufa_id: - qs = qs.filter(beichufa_id=beichufa_id) + PenalizedUserID = request.data.get('PenalizedUserID', '').strip() + if PenalizedUserID: + qs = qs.filter(PenalizedUserID=PenalizedUserID) # 被处罚人身份 beichufa_shenfen = request.data.get('beichufa_shenfen') if beichufa_shenfen is not None and int(beichufa_shenfen) in [1, 2, 3, 4]: - qs = qs.filter(shenfen=int(beichufa_shenfen)) + qs = qs.filter(Identity=int(beichufa_shenfen)) # 模糊搜索(订单ID、被罚人ID、申请人ID) sousuo = request.data.get('sousuo', '').strip() if sousuo: qs = qs.filter( - Q(guanliandingdan_id__icontains=sousuo) | - Q(beichufa_id__icontains=sousuo) | - Q(shenqing_chufa__icontains=sousuo) + Q(RelatedOrderID__icontains=sousuo) | + Q(PenalizedUserID__icontains=sousuo) | + Q(ApplicantID__icontains=sousuo) ) - qs = qs.order_by('-create_time') - paginator = Paginator(qs, page_size) + qs = qs.order_by('-CreateTime') try: page_obj = paginator.page(page) except Exception: @@ -5793,19 +5792,19 @@ class FaKuanLieBiaoView(APIView): }) records = list(page_obj) - fadan_ids = [r.id for r in records] + penalty_ids = [r.id for r in records] # 批量获取图片并分组 zhengju_map = {} shensu_map = {} - if fadan_ids: - tupians = FadanShensuTupian.query.filter( - fadan_id__in=fadan_ids - ).values('fadan_id', 'tupian_url', 'yongtu') + if penalty_ids: + tupians = PenaltyAppealImage.query.filter( + Penalty_id__in=penalty_ids + ).values('Penalty_id', 'ImageURL', 'Purpose') for t in tupians: - fid = t['fadan_id'] - url = t['tupian_url'] - if t['yongtu'] == 1: + fid = t['Penalty_id'] + url = t['ImageURL'] + if t['Purpose'] == 1: zhengju_map.setdefault(fid, []).append(url) else: shensu_map.setdefault(fid, []).append(url) @@ -5815,24 +5814,24 @@ class FaKuanLieBiaoView(APIView): for r in records: results.append({ 'id': r.id, - 'beichufa_id': r.beichufa_id, - 'shenfen': r.shenfen, - 'shenfen_text': dict(Fadan._meta.get_field('shenfen').choices).get(r.shenfen, ''), - 'shenqing_chufa': r.shenqing_chufa or '', - 'shenqingren_shenfen': r.shenqingren_shenfen, - 'chufaliyou': r.chufaliyou or '', - 'fakuanjine': str(r.fakuanjine), - 'guanliandingdan_id': r.guanliandingdan_id or '', - 'zhuangtai': r.zhuangtai, - 'yingxiang_qiangdan': r.yingxiang_qiangdan, - 'shensuliyou': r.shensuliyou or '', - 'bohuiliyou': r.bohuiliyou or '', - 'chulizhe': r.chulizhe or '', - 'chulizhe_shenfen': r.chulizhe_shenfen, + 'PenalizedUserID': r.PenalizedUserID, + 'Identity': r.Identity, + 'Identity_text': dict(Penalty._meta.get_field('Identity').choices).get(r.Identity, ''), + 'ApplicantID': r.ApplicantID or '', + 'ApplicantIdentity': r.ApplicantIdentity, + 'Reason': r.Reason or '', + 'FineAmount': str(r.FineAmount), + 'RelatedOrderID': r.RelatedOrderID or '', + 'Status': r.Status, + 'AffectsGrabbing': r.AffectsGrabbing, + 'AppealReason': r.AppealReason or '', + 'RejectReason': r.RejectReason or '', + 'ProcessorID': r.ProcessorID or '', + 'ProcessorIdentity': r.ProcessorIdentity, 'zhengju_tupian': zhengju_map.get(r.id, []), 'shensu_tupian': shensu_map.get(r.id, []), - 'create_time': r.create_time.strftime('%Y-%m-%d %H:%M:%S') if r.create_time else '', - 'update_time': r.update_time.strftime('%Y-%m-%d %H:%M:%S') if r.update_time else '', + 'CreateTime': r.CreateTime.strftime('%Y-%m-%d %H:%M:%S') if r.CreateTime else '', + 'UpdateTime': r.UpdateTime.strftime('%Y-%m-%d %H:%M:%S') if r.UpdateTime else '', }) return Response({ @@ -5860,11 +5859,11 @@ class FaKuanChuLiView(APIView): def post(self, request): try: username = request.data.get('username', '').strip() - fadan_id = request.data.get('fadan_id') + penalty_id = request.data.get('penalty_id') action = request.data.get('action', '').strip() chuli_liyou = request.data.get('chuli_liyou', '').strip() - if not all([username, fadan_id, action]): + if not all([username, penalty_id, action]): return Response({'code': 400, 'msg': '参数不完整'}) kefu, permissions = verify_kefu_permission(request, username) @@ -5873,14 +5872,14 @@ class FaKuanChuLiView(APIView): with transaction.atomic(): try: - fadan = Fadan.objects.select_for_update().get(id=fadan_id) - except Fadan.DoesNotExist: + penalty = Penalty.objects.select_for_update().get(id=penalty_id) + except Penalty.DoesNotExist: return Response({'code': 404, 'msg': '罚单不存在'}) - if fadan.zhuangtai != 3: + if penalty.Status != 3: return Response({'code': 400, 'msg': '当前状态不可处理'}) - if not check_fadan_permission(permissions, fadan.shenfen): + if not check_fadan_permission(permissions, penalty.Identity): return Response({'code': 403, 'msg': '无权限处理该类罚单'}) # 处理上传的图片 @@ -5895,7 +5894,7 @@ class FaKuanChuLiView(APIView): if not valid: return Response({'code': 400, 'msg': msg}) ext = file.name.split('.')[-1] if '.' in file.name else 'jpg' - file_name = f"chufa_{fadan_id}_{int(time.time() * 1000)}.{ext}" + file_name = f"chufa_{penalty_id}_{int(time.time() * 1000)}.{ext}" file_path = f"chufatupian/kechufatupian/{file_name}" url = upload_to_oss(file, file_path) if not url: @@ -5904,29 +5903,29 @@ class FaKuanChuLiView(APIView): # 更新状态 if action == 'agree': # 同意申诉 → 驳回处罚 - fadan.zhuangtai = 4 - fadan.bohuiliyou = chuli_liyou + penalty.Status = 4 + penalty.RejectReason = chuli_liyou elif action == 'reject': # 拒绝申诉 → 回到待缴纳 - fadan.zhuangtai = 1 - fadan.bohuiliyou = chuli_liyou + penalty.Status = 1 + penalty.RejectReason = chuli_liyou else: return Response({'code': 400, 'msg': '无效的操作类型'}) # 记录处理者(使用 request.user 的 phone) - fadan.chulizhe = request.user.phone - fadan.chulizhe_shenfen = 2 # 这里假设处理者是售后身份,可根据实际业务获取 - fadan.save() + penalty.ProcessorID = request.user.phone + penalty.ProcessorIdentity = 2 # 这里假设处理者是售后身份,可根据实际业务获取 + penalty.save() # 保存图片(证据图片,用途1) for relative_url in uploaded_urls: - FadanShensuTupian.query.create( - fadan_id=fadan_id, - beichufa_id=fadan.beichufa_id, - tupian_url=relative_url, - yongtu=1 + PenaltyAppealImage.query.create( + Penalty_id=penalty_id, + PenalizedUserID=penalty.PenalizedUserID, + ImageURL=relative_url, + Purpose=1 ) - logger.info(f"罚款处理成功: {fadan_id}, 操作: {action}") + logger.info(f"罚款处理成功: {penalty_id}, 操作: {action}") return Response({'code': 0, 'msg': '处理成功'}) except Exception as e: @@ -5945,18 +5944,18 @@ class FaKuanChuangJianView(APIView): def post(self, request): try: username = request.data.get('username', '').strip() - beichufa_id = request.data.get('beichufa_id', '').strip() + PenalizedUserID = request.data.get('PenalizedUserID', '').strip() shenfen = request.data.get('shenfen') - chufaliyou = request.data.get('chufaliyou', '').strip() - fakuanjine = request.data.get('fakuanjine') - yingxiang_qiangdan = request.data.get('yingxiang_qiangdan', 1) + Reason = request.data.get('Reason', '').strip() + FineAmount = request.data.get('FineAmount') + AffectsGrabbing = request.data.get('AffectsGrabbing', 1) - if not all([username, beichufa_id, shenfen, chufaliyou, fakuanjine]): + if not all([username, PenalizedUserID, shenfen, Reason, FineAmount]): return Response({'code': 400, 'msg': '参数不完整'}) try: shenfen = int(shenfen) - fakuanjine = float(fakuanjine) + FineAmount = float(FineAmount) except (ValueError, TypeError): return Response({'code': 400, 'msg': '参数格式错误'}) @@ -5972,7 +5971,7 @@ class FaKuanChuangJianView(APIView): # 验证用户是否存在对应的扩展表 try: - user = User.query.get(UserUID=beichufa_id) + user = User.query.get(UserUID=PenalizedUserID) profile_attr = SHENFEN_PROFILE_MAP.get(shenfen) if not profile_attr or not hasattr(user, profile_attr): return Response({'code': 400, 'msg': '该用户不是所选身份'}) @@ -5999,26 +5998,26 @@ class FaKuanChuangJianView(APIView): uploaded_urls.append(file_path) with transaction.atomic(): - fadan = Fadan.query.create( - beichufa_id=beichufa_id, - shenfen=shenfen, - shenqing_chufa=request.user.phone, # 申请人(客服)手机号 - shenqingren_shenfen=2, # 售后身份 - chufaliyou=chufaliyou, - fakuanjine=fakuanjine, - yingxiang_qiangdan=yingxiang_qiangdan, - zhuangtai=1, # 待缴纳 + penalty = Penalty.query.create( + PenalizedUserID=PenalizedUserID, + Identity=shenfen, + ApplicantID=request.user.phone, # 申请人(客服)手机号 + ApplicantIdentity=2, # 售后身份 + Reason=Reason, + FineAmount=FineAmount, + AffectsGrabbing=AffectsGrabbing, + Status=1, # 待缴纳 ) for relative_url in uploaded_urls: - FadanShensuTupian.query.create( - fadan=fadan, - beichufa_id=beichufa_id, - tupian_url=relative_url, - yongtu=1 + PenaltyAppealImage.query.create( + Penalty=penalty, + PenalizedUserID=PenalizedUserID, + ImageURL=relative_url, + Purpose=1 ) - logger.info(f"罚款创建成功: {fadan.id}") - return Response({'code': 0, 'msg': '罚款已创建', 'data': {'id': fadan.id}}) + logger.info(f"罚款创建成功: {penalty.id}") + return Response({'code': 0, 'msg': '罚款已创建', 'data': {'id': penalty.id}}) except Exception as e: logger.error(f"创建罚款异常: {traceback.format_exc()}") @@ -6033,10 +6032,10 @@ class FineApplyView(APIView): 请求参数: username (必填) : 客服用户名(手机号) - dingdan_id (必填) : 订单ID - chufaliyou (必填) : 罚款原因 - fakuanjine (必填) : 罚款金额(元) - yingxiang_qiangdan (可选) : 是否影响抢单,1=是,0=否,默认1 + OrderID (必填) : 订单ID + Reason (必填) : 罚款原因 + FineAmount (必填) : 罚款金额(元) + AffectsGrabbing (可选) : 是否影响抢单,1=是,0=否,默认1 """ permission_classes = [IsAuthenticated] parser_classes = [MultiPartParser, FormParser, JSONParser] @@ -6044,16 +6043,16 @@ class FineApplyView(APIView): def post(self, request): try: username = request.data.get('username', '').strip() - dingdan_id = request.data.get('dingdan_id', '').strip() - chufaliyou = request.data.get('chufaliyou', '').strip() - fakuanjine = request.data.get('fakuanjine') - yingxiang_qiangdan = request.data.get('yingxiang_qiangdan', 1) + OrderID = request.data.get('OrderID', '').strip() + Reason = request.data.get('Reason', '').strip() + FineAmount = request.data.get('FineAmount') + AffectsGrabbing = request.data.get('AffectsGrabbing', 1) - if not all([username, dingdan_id, chufaliyou, fakuanjine]): + if not all([username, OrderID, Reason, FineAmount]): return Response({'code': 400, 'msg': '参数不完整'}) try: - fakuanjine = float(fakuanjine) + FineAmount = float(FineAmount) except (ValueError, TypeError): return Response({'code': 400, 'msg': '罚款金额格式错误'}) @@ -6063,17 +6062,17 @@ class FineApplyView(APIView): # 验证订单存在 try: - order = Dingdan.query.get(dingdan_id=dingdan_id) - except Dingdan.DoesNotExist: + order = Order.query.get(OrderID=OrderID) + except Order.DoesNotExist: return Response({'code': 404, 'msg': '订单不存在'}) # 获取打手ID - dashou_id = order.jiedan_dashou_id + dashou_id = order.PlayerID if not dashou_id: return Response({'code': 400, 'msg': '该订单无接单打手,无法罚款'}) # 重复罚款检查 - if Fadan.query.filter(beichufa_id=dashou_id, guanliandingdan_id=dingdan_id).exists(): + if Penalty.query.filter(PenalizedUserID=dashou_id, RelatedOrderID=OrderID).exists(): return Response({'code': 400, 'msg': '该打手已被罚款过'}) # 检查权限(打手身份 shenfen=1) @@ -6101,27 +6100,27 @@ class FineApplyView(APIView): # 创建罚单 with transaction.atomic(): - fadan = Fadan.query.create( - beichufa_id=dashou_id, - shenqing_chufa=request.user.phone, - shenfen=1, # 被处罚人身份:1 打手 - chufaliyou=chufaliyou, - fakuanjine=fakuanjine, - guanliandingdan_id=dingdan_id, - zhuangtai=1, # 待缴纳 - yingxiang_qiangdan=yingxiang_qiangdan, - shenqingren_shenfen=1, # 申请人身份:1 客服 + penalty = Penalty.query.create( + PenalizedUserID=dashou_id, + ApplicantID=request.user.phone, + Identity=1, # 被处罚人身份:1 打手 + Reason=Reason, + FineAmount=FineAmount, + RelatedOrderID=OrderID, + Status=1, # 待缴纳 + AffectsGrabbing=AffectsGrabbing, + ApplicantIdentity=1, # 申请人身份:1 客服 ) for relative_url in uploaded_urls: - FadanShensuTupian.query.create( - fadan=fadan, - beichufa_id=dashou_id, - tupian_url=relative_url, - yongtu=1 + PenaltyAppealImage.query.create( + Penalty=penalty, + PenalizedUserID=dashou_id, + ImageURL=relative_url, + Purpose=1 ) - logger.info(f"客服罚款申请成功: 订单 {dingdan_id}, 打手 {dashou_id}, 金额 {fakuanjine}") - return Response({'code': 0, 'msg': '罚款已生成', 'data': {'id': fadan.id}}) + logger.info(f"客服罚款申请成功: 订单 {OrderID}, 打手 {dashou_id}, 金额 {FineAmount}") + return Response({'code': 0, 'msg': '罚款已生成', 'data': {'id': penalty.id}}) except Exception as e: logger.error(f"客服罚款申请异常: {traceback.format_exc()}") @@ -6136,7 +6135,7 @@ class PunishDashouView(APIView): 请求参数: username (必填) : 客服用户名(手机号) - dingdan_id (必填) : 订单ID + OrderID (必填) : 订单ID reason (可选) : 处罚原因 """ permission_classes = [IsAuthenticated] @@ -6145,10 +6144,10 @@ class PunishDashouView(APIView): def post(self, request): try: username = request.data.get('username', '').strip() - dingdan_id = request.data.get('dingdan_id', '').strip() + OrderID = request.data.get('OrderID', '').strip() reason = request.data.get('reason', '').strip() - if not all([username, dingdan_id]): + if not all([username, OrderID]): return Response({'code': 400, 'msg': '参数不完整'}) kefu, permissions = verify_kefu_permission(request, username) @@ -6161,12 +6160,12 @@ class PunishDashouView(APIView): # 查询订单 try: - order = Dingdan.query.get(dingdan_id=dingdan_id) - except Dingdan.DoesNotExist: + order = Order.query.get(OrderID=OrderID) + except Order.DoesNotExist: return Response({'code': 404, 'msg': '订单不存在'}) # 获取打手ID - dashou_id = order.jiedan_dashou_id + dashou_id = order.PlayerID if not dashou_id: return Response({'code': 400, 'msg': '订单未接单,无法处罚打手'}) @@ -6182,20 +6181,20 @@ class PunishDashouView(APIView): # 创建处罚记录(扣除积分5分) jifen = 5 with transaction.atomic(): - chufa = Chufajilu.query.create( - dashouid=dashou_id, - qingqiuid=username, - cfliyou=reason or '', - sqzhuangtai=0, - jifen=jifen, - dingdan_id=dingdan_id, + penalty_record = PenaltyRecord.query.create( + PlayerID=dashou_id, + ApplicantID=username, + PenaltyReason=reason or '', + ApplyStatus=0, + DeductedPoints=jifen, + OrderID=OrderID, ) # 扣除打手积分 dashou.jifen = F('jifen') - jifen dashou.save(update_fields=['jifen']) - logger.info(f"客服处罚打手成功: 打手 {dashou_id}, 订单 {dingdan_id}, 扣除积分 {jifen}") - return Response({'code': 0, 'msg': '处罚成功', 'data': {'chufa_id': chufa.id}}) + logger.info(f"客服处罚打手成功: 打手 {dashou_id}, 订单 {OrderID}, 扣除积分 {jifen}") + return Response({'code': 0, 'msg': '处罚成功', 'data': {'penalty_record_id': penalty_record.id}}) except Exception as e: logger.error(f"客服处罚打手异常: {traceback.format_exc()}") @@ -6445,31 +6444,31 @@ class CaiwuView(APIView): today_payout_count = today_payout.total_count if today_payout else 0 # 今日订单(已付款及之后的状态) - today_orders = Dingdan.query.filter( - create_time__gte=today_start, - create_time__lt=today_end, - zhuangtai__in=[1,2,3,4,5,6,7,8] + today_orders = Order.query.filter( + CreateTime__gte=today_start, + CreateTime__lt=today_end, + Status__in=[1,2,3,4,5,6,7,8] ) today_order_count = today_orders.count() - today_order_amount = float(today_orders.aggregate(total=Sum('jine'))['total'] or 0.00) + today_order_amount = float(today_orders.aggregate(total=Sum('Amount'))['total'] or 0.00) - # 今日成交(zhuangtai=3) - today_completed = Dingdan.query.filter( - create_time__gte=today_start, - create_time__lt=today_end, - zhuangtai=3 + # 今日成交(Status=3) + today_completed = Order.query.filter( + CreateTime__gte=today_start, + CreateTime__lt=today_end, + Status=3 ) today_completed_count = today_completed.count() - today_completed_amount = float(today_completed.aggregate(total=Sum('jine'))['total'] or 0.00) + today_completed_amount = float(today_completed.aggregate(total=Sum('Amount'))['total'] or 0.00) - # 今日退款(zhuangtai=5) - today_tuikuan = Dingdan.query.filter( - create_time__gte=today_start, - create_time__lt=today_end, - zhuangtai=5 + # 今日退款(Status=5) + today_tuikuan = Order.query.filter( + CreateTime__gte=today_start, + CreateTime__lt=today_end, + Status=5 ) today_tuikuan_count = today_tuikuan.count() - today_tuikuan_amount = float(today_tuikuan.aggregate(total=Sum('jine'))['total'] or 0.00) + today_tuikuan_amount = float(today_tuikuan.aggregate(total=Sum('Amount'))['total'] or 0.00) # 今日充值(会员充值,leixing=1, zhuangtai=3) today_chongzhi = Czjilu.query.filter( @@ -7034,7 +7033,7 @@ class CwhqjtddsjView(APIView): return Response({'code': 1, 'msg': '按日统计需要年份和月份'}, status=400) start_date = date(year, month, 1) end_date = date(year, month + 1, 1) if month < 12 else date(year + 1, 1, 1) - trunc_func = TruncDate('create_time') + trunc_func = TruncDate('CreateTime') if not summary_date: summary_date = now.strftime('%Y-%m-%d') summary_q = datetime.strptime(summary_date, '%Y-%m-%d').date() @@ -7043,7 +7042,7 @@ class CwhqjtddsjView(APIView): return Response({'code': 1, 'msg': '按月统计需要年份'}, status=400) start_date = date(year, 1, 1) end_date = date(year + 1, 1, 1) - trunc_func = TruncMonth('create_time') + trunc_func = TruncMonth('CreateTime') if not summary_date: summary_date = now.strftime('%Y-%m') summary_q = datetime.strptime(summary_date + '-01', '%Y-%m-%d').date() @@ -7051,7 +7050,7 @@ class CwhqjtddsjView(APIView): year = year or now.year start_date = date(year, 1, 1) end_date = date(year + 1, 1, 1) - trunc_func = TruncYear('create_time') + trunc_func = TruncYear('CreateTime') if not summary_date: summary_date = str(year) summary_q = date(year, 1, 1) @@ -7063,40 +7062,40 @@ class CwhqjtddsjView(APIView): # ---------- 基础过滤 ---------- filters = { - 'create_time__gte': start_dt, - 'create_time__lt': end_dt, - 'zhuangtai__in': [1, 2, 3, 4, 5, 6, 7, 8] # 只统计有效订单状态 + 'CreateTime__gte': start_dt, + 'CreateTime__lt': end_dt, + 'Status__in': [1, 2, 3, 4, 5, 6, 7, 8] # 只统计有效订单状态 } if int(type_id) != 0: - filters['leixing_id'] = type_id + filters['ProductTypeID'] = type_id if int(order_source) in [1, 2]: - filters['fadan_pingtai'] = order_source + filters['Platform'] = order_source # ---------- 时间序列分组查询 ---------- - qs = Dingdan.query.filter(**filters) \ + qs = Order.query.filter(**filters) \ .annotate(period=trunc_func) \ .values('period') \ .annotate( # 订单总量(所有符合条件的状态) order_count=Count('id'), # 订单总额 - order_amount=Sum('jine'), - # 成交单量 (zhuangtai=3) - success_count=Count('id', filter=Q(zhuangtai=3)), + order_amount=Sum('Amount'), + # 成交单量 (Status=3) + success_count=Count('id', filter=Q(Status=3)), # 成交订单总额 - success_amount=Sum('jine', filter=Q(zhuangtai=3)), - # 退款单量 (zhuangtai=5) - refund_count=Count('id', filter=Q(zhuangtai=5)), + success_amount=Sum('Amount', filter=Q(Status=3)), + # 退款单量 (Status=5) + refund_count=Count('id', filter=Q(Status=5)), # 打手分成总额(仅成交订单) - dashou_fencheng_sum=Sum('dashou_fencheng', filter=Q(zhuangtai=3)), + PlayerCommission_sum=Sum('PlayerCommission', filter=Q(Status=3)), # 平台成交订单的店铺分红 dianpu_fenhong_sum=Sum('pingtai_kuozhan__dianpu_shouyi', - filter=Q(zhuangtai=3, fadan_pingtai=1)), + filter=Q(Status=3, Platform=1)), # 成交订单中:平台单金额、商家单金额、各自打手分成 - platform_success_amount=Sum('jine', filter=Q(zhuangtai=3, fadan_pingtai=1)), - merchant_success_amount=Sum('jine', filter=Q(zhuangtai=3, fadan_pingtai=2)), - platform_dashou=Sum('dashou_fencheng', filter=Q(zhuangtai=3, fadan_pingtai=1)), - merchant_dashou=Sum('dashou_fencheng', filter=Q(zhuangtai=3, fadan_pingtai=2)), + platform_success_amount=Sum('Amount', filter=Q(Status=3, Platform=1)), + merchant_success_amount=Sum('Amount', filter=Q(Status=3, Platform=2)), + platform_dashou=Sum('PlayerCommission', filter=Q(Status=3, Platform=1)), + merchant_dashou=Sum('PlayerCommission', filter=Q(Status=3, Platform=2)), ).order_by('period') time_series = [] @@ -7120,28 +7119,28 @@ class CwhqjtddsjView(APIView): 'success_count': item['success_count'], 'success_amount': float(item['success_amount'] or 0), 'refund_count': item['refund_count'], - 'dashou_fencheng': float(item['dashou_fencheng_sum'] or 0), + 'PlayerCommission': float(item['PlayerCommission_sum'] or 0), 'dianpu_fenhong': float(item['dianpu_fenhong_sum'] or 0), 'profit': round(total_profit, 2) }) # ---------- 汇总数据 ---------- - summary_qs = Dingdan.query.filter(**filters) + summary_qs = Order.query.filter(**filters) total_order_count = summary_qs.count() - total_order_amount = summary_qs.aggregate(s=Sum('jine'))['s'] or 0 - total_success_count = summary_qs.filter(zhuangtai=3).count() - total_success_amount = summary_qs.filter(zhuangtai=3).aggregate(s=Sum('jine'))['s'] or 0 - total_refund_count = summary_qs.filter(zhuangtai=5).count() - total_dashou = summary_qs.filter(zhuangtai=3).aggregate(s=Sum('dashou_fencheng'))['s'] or 0 - total_dianpu_fenhong = summary_qs.filter(zhuangtai=3, fadan_pingtai=1).aggregate( + total_order_amount = summary_qs.aggregate(s=Sum('Amount'))['s'] or 0 + total_success_count = summary_qs.filter(Status=3).count() + total_success_amount = summary_qs.filter(Status=3).aggregate(s=Sum('Amount'))['s'] or 0 + total_refund_count = summary_qs.filter(Status=5).count() + total_dashou = summary_qs.filter(Status=3).aggregate(s=Sum('PlayerCommission'))['s'] or 0 + total_dianpu_fenhong = summary_qs.filter(Status=3, Platform=1).aggregate( s=Sum('pingtai_kuozhan__dianpu_shouyi'))['s'] or 0 - platform_amount = summary_qs.filter(zhuangtai=3, fadan_pingtai=1).aggregate(s=Sum('jine'))['s'] or 0 - merchant_amount = summary_qs.filter(zhuangtai=3, fadan_pingtai=2).aggregate(s=Sum('jine'))['s'] or 0 + platform_amount = summary_qs.filter(Status=3, Platform=1).aggregate(s=Sum('Amount'))['s'] or 0 + merchant_amount = summary_qs.filter(Status=3, Platform=2).aggregate(s=Sum('Amount'))['s'] or 0 platform_dashou_sum = \ - summary_qs.filter(zhuangtai=3, fadan_pingtai=1).aggregate(s=Sum('dashou_fencheng'))['s'] or 0 + summary_qs.filter(Status=3, Platform=1).aggregate(s=Sum('PlayerCommission'))['s'] or 0 merchant_dashou_sum = \ - summary_qs.filter(zhuangtai=3, fadan_pingtai=2).aggregate(s=Sum('dashou_fencheng'))['s'] or 0 + summary_qs.filter(Status=3, Platform=2).aggregate(s=Sum('PlayerCommission'))['s'] or 0 profit_platform = platform_amount - platform_dashou_sum - total_dianpu_fenhong profit_merchant = merchant_amount - merchant_dashou_sum @@ -7153,7 +7152,7 @@ class CwhqjtddsjView(APIView): 'total_success_count': total_success_count, 'total_success_amount': round(float(total_success_amount), 2), 'total_refund_count': total_refund_count, - 'total_dashou_fencheng': round(float(total_dashou), 2), + 'total_PlayerCommission': round(float(total_dashou), 2), 'total_dianpu_fenhong': round(float(total_dianpu_fenhong), 2), 'total_profit': round(total_profit, 2) } @@ -7290,21 +7289,21 @@ class CwqtczhqView(APIView): 'fenhong_amount': 0.0 } - # 2. 处理罚款(Fadan)—— 修改:直接从 Fadan 表获取分红总额和分红笔数 + # 2. 处理罚款(Penalty)—— 修改:直接从 Penalty 表获取分红总额和分红笔数 if 6 in types: # 使用一次聚合查询,同时获取罚款笔数、罚款金额、分红总额、分红笔数 - penalty_qs = Fadan.query.filter( - create_time__gte=start_dt, - create_time__lt=end_dt, - zhuangtai=2 # 已缴纳 + penalty_qs = Penalty.query.filter( + CreateTime__gte=start_dt, + CreateTime__lt=end_dt, + Status=2 # 已缴纳 ).annotate( period=trunc_func ).values('period').annotate( penalty_count=Count('id'), - penalty_amount=Sum('fakuanjine'), + penalty_amount=Sum('FineAmount'), # 直接使用罚单表中的申请人分红金额字段 - fenhong_amount=Sum('shenqingren_fenhong_jine'), - fenhong_count=Count('id', filter=Q(shenqingren_fenhong_jine__gt=0)) + fenhong_amount=Sum('ApplicantBonusAmount'), + fenhong_count=Count('id', filter=Q(ApplicantBonusAmount__gt=0)) ).order_by('period') for item in penalty_qs: @@ -7331,7 +7330,7 @@ class CwqtczhqView(APIView): entry['types'][type_code] = time_series_map[period_str][type_code] time_series.append(entry) - # ---------- 汇总指定日期(summary)—— 完全保留原逻辑,仅将罚款部分改为从 Fadan 表直接取分红 ---------- + # ---------- 汇总指定日期(summary)—— 完全保留原逻辑,仅将罚款部分改为从 Penalty 表直接取分红 ---------- summary_result = {'by_type': {}, 'total_count': 0, 'total_amount': 0.0, 'total_profit': 0.0} # 汇总充值类型(完全不变) @@ -7362,25 +7361,25 @@ class CwqtczhqView(APIView): summary_result['total_amount'] += amount summary_result['total_profit'] += profit - # 汇总罚款(修改:从 Fadan 表直接取分红,不再查询 FadanFenhong) + # 汇总罚款(修改:从 Penalty 表直接取分红,不再查询 PenaltyBonus) if 6 in types: penalty_filter = { - 'zhuangtai': 2, + 'Status': 2, } if granularity == 'day': - penalty_filter['create_time__date'] = summary_q + penalty_filter['CreateTime__date'] = summary_q elif granularity == 'month': - penalty_filter['create_time__year'] = summary_q.year - penalty_filter['create_time__month'] = summary_q.month + penalty_filter['CreateTime__year'] = summary_q.year + penalty_filter['CreateTime__month'] = summary_q.month else: - penalty_filter['create_time__year'] = summary_q.year + penalty_filter['CreateTime__year'] = summary_q.year # 一次聚合:罚款笔数、金额、分红总额、分红笔数 - agg = Fadan.query.filter(**penalty_filter).aggregate( + agg = Penalty.query.filter(**penalty_filter).aggregate( count=Count('id'), - amount=Sum('fakuanjine'), - fenhong_amount=Sum('shenqingren_fenhong_jine'), - fenhong_count=Count('id', filter=Q(shenqingren_fenhong_jine__gt=0)) + amount=Sum('FineAmount'), + fenhong_amount=Sum('ApplicantBonusAmount'), + fenhong_count=Count('id', filter=Q(ApplicantBonusAmount__gt=0)) ) penalty_count = agg['count'] or 0 penalty_amount = float(agg['amount'] or 0) @@ -7525,29 +7524,29 @@ class CwqtczhqView(APIView): 'fenhong_amount': 0.0 } - # 2. 处理罚款(Fadan)—— 包含分红 + # 2. 处理罚款(Penalty)—— 包含分红 if 6 in types: # 罚款记录 - penalty_qs = Fadan.query.filter( - create_time__gte=start_dt, - create_time__lt=end_dt, - zhuangtai=2 # 已缴纳 + penalty_qs = Penalty.query.filter( + CreateTime__gte=start_dt, + CreateTime__lt=end_dt, + Status=2 # 已缴纳 ).annotate( period=trunc_func ).values('period').annotate( penalty_count=Count('id'), - penalty_amount=Sum('fakuanjine') + penalty_amount=Sum('FineAmount') ).order_by('period') # 分红记录 - fenhong_qs = FadanFenhong.query.filter( - create_time__gte=start_dt, - create_time__lt=end_dt + fenhong_qs = PenaltyBonus.query.filter( + CreateTime__gte=start_dt, + CreateTime__lt=end_dt ).annotate( period=trunc_func ).values('period').annotate( fh_count=Count('id'), - fh_amount=Sum('ketixian_fenhong') + fh_amount=Sum('WithdrawableAmount') ).order_by('period') # 合并 @@ -7622,28 +7621,28 @@ class CwqtczhqView(APIView): # 汇总罚款 if 6 in types: penalty_filter = { - 'zhuangtai': 2, + 'Status': 2, } fenhong_filter = {} if granularity == 'day': - penalty_filter['create_time__date'] = summary_q - fenhong_filter['create_time__date'] = summary_q + penalty_filter['CreateTime__date'] = summary_q + fenhong_filter['CreateTime__date'] = summary_q elif granularity == 'month': - penalty_filter['create_time__year'] = summary_q.year - penalty_filter['create_time__month'] = summary_q.month - fenhong_filter['create_time__year'] = summary_q.year - fenhong_filter['create_time__month'] = summary_q.month + penalty_filter['CreateTime__year'] = summary_q.year + penalty_filter['CreateTime__month'] = summary_q.month + fenhong_filter['CreateTime__year'] = summary_q.year + fenhong_filter['CreateTime__month'] = summary_q.month else: - penalty_filter['create_time__year'] = summary_q.year - fenhong_filter['create_time__year'] = summary_q.year + penalty_filter['CreateTime__year'] = summary_q.year + fenhong_filter['CreateTime__year'] = summary_q.year - penalty_agg = Fadan.query.filter(**penalty_filter).aggregate( - count=Count('id'), amount=Sum('fakuanjine')) + penalty_agg = Penalty.query.filter(**penalty_filter).aggregate( + count=Count('id'), amount=Sum('FineAmount')) penalty_count = penalty_agg['count'] or 0 penalty_amount = float(penalty_agg['amount'] or 0) - fenhong_agg = FadanFenhong.query.filter(**fenhong_filter).aggregate( - fh_count=Count('id'), fh_amount=Sum('ketixian_fenhong')) + fenhong_agg = PenaltyBonus.query.filter(**fenhong_filter).aggregate( + fh_count=Count('id'), fh_amount=Sum('WithdrawableAmount')) fh_count = fenhong_agg['fh_count'] or 0 fh_amount = float(fenhong_agg['fh_amount'] or 0) @@ -8158,8 +8157,8 @@ class ZxkfghdsView(APIView): def post(self, request): # ========== 1. 参数提取 ========== username = request.data.get('username', '').strip() - dingdan_id = request.data.get('dingdan_id', '').strip() - if not username or not dingdan_id: + OrderID = request.data.get('OrderID', '').strip() + if not username or not OrderID: logger.warning("更换打手参数不完整") return Response({'code': 400, 'msg': '参数不完整'}) @@ -8174,46 +8173,46 @@ class ZxkfghdsView(APIView): # ========== 3. 查询原订单及关联信息 ========== try: - old_order = Dingdan.query.select_related('shangjia_kuozhan').get(dingdan_id=dingdan_id) - except Dingdan.DoesNotExist: - logger.warning(f"订单不存在: {dingdan_id}") + old_order = Order.query.select_related('shangjia_kuozhan').get(OrderID=OrderID) + except Order.DoesNotExist: + logger.warning(f"订单不存在: {OrderID}") return Response({'code': 404, 'msg': '订单不存在'}) # 仅允许状态为 2(进行中)或 8(结算中)更换打手 - if old_order.zhuangtai not in [1,7,2, 8]: + if old_order.Status not in [1,7,2, 8]: return Response({'code': 400, 'msg': '当前订单状态不允许更换打手'}) - # 本接口仅处理商家发单(fadan_pingtai=2) - if old_order.fadan_pingtai != 2: + # 本接口仅处理商家发单(Platform=2) + if old_order.Platform != 2: return Response({'code': 400, 'msg': '仅支持商家发单的更换操作'}) # 获取原链接(用于模板ID等) try: - old_lianjie = ShangjiaLianjie.query.get(dingdan_id=dingdan_id) + old_lianjie = ShangjiaLianjie.query.get(dingdan_id=OrderID) except ShangjiaLianjie.DoesNotExist: - logger.error(f"原链接记录不存在,订单: {dingdan_id}") + logger.error(f"原链接记录不存在,订单: {OrderID}") return Response({'code': 500, 'msg': '链接数据异常'}) # 商家信息(仅用于记录关联,不操作余额) try: shangjia_ext = old_order.shangjia_kuozhan - shangjia_id = shangjia_ext.shangjia_id + shangjia_id = shangjia_ext.MerchantID # 获取商家昵称用于新订单扩展表 shangjia_user = User.query.get(UserUID=shangjia_id) shangjia_nicheng = shangjia_user.shop_profile.nicheng or f"商家{shangjia_id}" except (ObjectDoesNotExist, UserShangjia.DoesNotExist): - logger.error(f"商家信息缺失,订单: {dingdan_id}") + logger.error(f"商家信息缺失,订单: {OrderID}") return Response({'code': 500, 'msg': '商家数据异常'}) # ========== 4. 退款处理(仅打手侧,不碰商家) ========== with transaction.atomic(): # 5.1 订单状态改为已退款 - old_order.zhuangtai = 5 - old_order.clkf = current_user.phone + old_order.Status = 5 + old_order.AssignedCS = current_user.phone old_order.save() # 5.2 处理接单打手(若有) - dashou_id = old_order.jiedan_dashou_id + dashou_id = old_order.PlayerID if dashou_id: try: dashou_user = User.query.get(UserUID=dashou_id) @@ -8225,19 +8224,19 @@ class ZxkfghdsView(APIView): logger.warning(f"打手 {dashou_id} 不存在,跳过更新") # 5.3 更新退款记录表 - Tuikuanjilu.query.update_or_create( - dingdan_id=dingdan_id, + RefundRecord.query.update_or_create( + OrderID=OrderID, defaults={ - 'dashouid': dashou_id or '', - 'qingqiuid': '', - 'chuliid': current_user.phone, - 'liyou': '客服更换打手退款', - 'sqzhuangtai': 1, - 'jine': old_order.jine or 0, - 'dashou_fencheng': old_order.dashou_fencheng or 0, - 'jieshao': old_order.jieshao or '', - 'beizhu': '更换打手自动退款', - 'nicheng': old_order.nicheng or '', + 'PlayerID': dashou_id or '', + 'ApplicantID': '', + 'ProcessorID': current_user.phone, + 'Reason': '客服更换打手退款', + 'ApplyStatus': 1, + 'Amount': old_order.Amount or 0, + 'PlayerCommission': old_order.PlayerCommission or 0, + 'Description': old_order.Description or '', + 'Remark': '更换打手自动退款', + 'Nickname': old_order.Nickname or '', } ) @@ -8246,7 +8245,7 @@ class ZxkfghdsView(APIView): try: update_dashou_daily_by_action( yonghuid=dashou_id, - amount=old_order.dashou_fencheng, + amount=old_order.PlayerCommission, action=3 # 3=退款 ) except Exception as e: @@ -8264,7 +8263,7 @@ class ZxkfghdsView(APIView): try: with transaction.atomic(): # ---- 6.1 生成新的订单ID和Token ---- - def generate_dingdan_id(): + def generate_OrderID(): timestamp = int(time.time() * 1000) process_id = os.getpid() % 1000 random_num = random.randint(1000, 9999) @@ -8283,33 +8282,33 @@ class ZxkfghdsView(APIView): base = getattr(settings, 'H5_DOMAIN', 'https://h5.yourdomain.com').rstrip('/') return f"{base}/order/{token}" - new_dingdan_id = generate_dingdan_id() - secure_token = generate_secure_token(new_dingdan_id, shangjia_id) + new_OrderID = generate_OrderID() + secure_token = generate_secure_token(new_OrderID, shangjia_id) # ---- 6.2 创建新订单(复制核心数据,状态直接为1) ---- - new_order = Dingdan.query.create( - dingdan_id=new_dingdan_id, - zhuangtai=1, # 下单中 - fadan_pingtai=2, - jine=old_order.jine, - dashou_fencheng=old_order.dashou_fencheng, - leixing_id=old_order.leixing_id, - yaoqiuleixing=old_order.yaoqiuleixing, - huiyuan_id=old_order.huiyuan_id, - yongjin=old_order.yongjin, - jieshao=old_order.jieshao, - nicheng=old_order.nicheng, # 继承游戏昵称 - beizhu=old_order.beizhu, - user1_id=old_order.user1_id, # 商家标识 - tupian=old_order.tupian, - # 注意:不继承 zhiding_id、jiedan_dashou_id + new_order = Order.query.create( + OrderID=new_OrderID, + Status=1, # 下单中 + Platform=2, + Amount=old_order.Amount, + PlayerCommission=old_order.PlayerCommission, + ProductTypeID=old_order.ProductTypeID, + GrabRequirement=old_order.GrabRequirement, + MembershipID=old_order.MembershipID, + CommissionReq=old_order.CommissionReq, + Description=old_order.Description, + Nickname=old_order.Nickname, # 继承游戏昵称 + Remark=old_order.Remark, + User1ID=old_order.User1ID, # 商家标识 + ImageURL=old_order.ImageURL, + # 注意:不继承 AssignedID、PlayerID ) # ---- 6.3 创建商家扩展表 ---- - DingdanShangjia.query.create( - dingdan=new_order, - shangjia_id=shangjia_id, - sjnicheng=shangjia_nicheng, + MerchantOrderExt.query.create( + Order=new_order, + MerchantID=shangjia_id, + MerchantNickname=shangjia_nicheng, ) # ---- 6.4 生成新链接并关联旧链接信息 ---- @@ -8320,20 +8319,20 @@ class ZxkfghdsView(APIView): moban_id=old_lianjie.moban_id, lianjie=link_url, lianjie_token=secure_token, - dingdan_id=new_dingdan_id, + dingdan_id=new_OrderID, is_used=True, # 直接标记已使用 youxiao_shijian=timezone.now() + timezone.timedelta(days=1), previous_lianjie_id=old_lianjie.id, # 记录旧链接ID - previous_dingdan_id=old_order.dingdan_id, # 记录旧订单ID + previous_dingdan_id=old_order.OrderID, # 记录旧订单ID ) # ---- 6.5 异步通知(广播新订单、跨平台同步) ---- try: order_info = { - 'dingdan_id': new_dingdan_id, - 'game_type': self._get_game_type_name(new_order.leixing_id), - 'amount': str(new_order.jine), - 'order_desc': (new_order.jieshao or '')[:50], + 'OrderID': new_OrderID, + 'game_type': self._get_game_type_name(new_order.ProductTypeID), + 'amount': str(new_order.Amount), + 'order_desc': (new_order.Description or '')[:50], } dingdan_guangbo.delay(order_info) except Exception as e: @@ -8341,13 +8340,13 @@ class ZxkfghdsView(APIView): # 注意:此处不更新商家余额、发布量、每日统计,因为这是替换订单 - logger.info(f"更换打手成功:旧订单{dingdan_id}→退款,新订单{new_dingdan_id}已生成") + logger.info(f"更换打手成功:旧订单{OrderID}→退款,新订单{new_OrderID}已生成") return Response({ 'code': 0, 'msg': '更换成功', 'data': { - 'new_dingdan_id': new_dingdan_id, + 'new_OrderID': new_OrderID, 'new_lianjie': link_url, } }) @@ -8356,10 +8355,10 @@ class ZxkfghdsView(APIView): logger.error(f"生成新订单事务失败: {str(e)}", exc_info=True) return Response({'code': 500, 'msg': '生成新订单失败'}) - def _get_game_type_name(self, leixing_id): + def _get_game_type_name(self, ProductTypeID): """根据类型ID获取游戏类型名称""" try: - gt = ShangpinLeixing.query.filter(id=leixing_id).first() + gt = ShangpinLeixing.query.filter(id=ProductTypeID).first() return gt.jieshao if gt else '游戏订单' except Exception: return '游戏订单' diff --git a/config/views.py b/config/views.py index 810fdd8..95e12af 100644 --- a/config/views.py +++ b/config/views.py @@ -42,7 +42,7 @@ from users.models import ( ) from gvsdsdk.models import User -from orders.models import Lilubiao, Dingdan, DingdanShangjia +from orders.models import CommissionRate, Order, MerchantOrderExt from orders.notice_tasks import dingdan_guangbo from rank.models import Chenghao, DingdanBiaoqian @@ -226,12 +226,12 @@ class AdminConfigQueryView(APIView): }) # 查询利率配置 - platform_rate_obj = Lilubiao.query.filter(fadanpingtai='1').first() - shop_rate_obj = Lilubiao.query.filter(fadanpingtai='3').first() + platform_rate_obj = CommissionRate.query.filter(Platform='1').first() + shop_rate_obj = CommissionRate.query.filter(Platform='3').first() # 🔴【新增】打手提现抽成利率(字符5) - dashou_withdraw_obj = Lilubiao.query.filter(fadanpingtai='5').first() + dashou_withdraw_obj = CommissionRate.query.filter(Platform='5').first() # 🔴【新增】管事提现抽成利率(字符6) - guanshi_withdraw_obj = Lilubiao.query.filter(fadanpingtai='6').first() + guanshi_withdraw_obj = CommissionRate.query.filter(Platform='6').first() # 构建返回数据 data = { @@ -241,14 +241,14 @@ class AdminConfigQueryView(APIView): }, 'qq_groups': qq_groups, 'rates': { - 'platform_rate': float(platform_rate_obj.lilu) if platform_rate_obj and platform_rate_obj.lilu else 0.0, - 'shop_rate': float(shop_rate_obj.lilu) if shop_rate_obj and shop_rate_obj.lilu else 0.0, + 'platform_rate': float(platform_rate_obj.Rate) if platform_rate_obj and platform_rate_obj.Rate else 0.0, + 'shop_rate': float(shop_rate_obj.Rate) if shop_rate_obj and shop_rate_obj.Rate else 0.0, # 🔴【新增】打手提现抽成利率 'dashou_withdraw_rate': float( - dashou_withdraw_obj.lilu) if dashou_withdraw_obj and dashou_withdraw_obj.lilu else 0.0, + dashou_withdraw_obj.Rate) if dashou_withdraw_obj and dashou_withdraw_obj.Rate else 0.0, # 🔴【新增】管事提现抽成利率 'guanshi_withdraw_rate': float( - guanshi_withdraw_obj.lilu) if guanshi_withdraw_obj and guanshi_withdraw_obj.lilu else 0.0 + guanshi_withdraw_obj.Rate) if guanshi_withdraw_obj and guanshi_withdraw_obj.Rate else 0.0 } } @@ -504,17 +504,17 @@ class AdminUpdateConfigView(APIView): platform_rate_float = float(platform_rate) if 0 <= platform_rate_float <= 1: # 🔴 修复:查询现有记录,如果不存在则创建 - platform_rate_obj = Lilubiao.query.filter(fadanpingtai='1').first() + platform_rate_obj = CommissionRate.query.filter(Platform='1').first() if platform_rate_obj: # 更新现有记录 - platform_rate_obj.lilu = platform_rate_float + platform_rate_obj.Rate = platform_rate_float platform_rate_obj.save() else: # 创建新记录 - platform_rate_obj = Lilubiao.query.create( - lilu=platform_rate_float, - fadanpingtai='1' + platform_rate_obj = CommissionRate.query.create( + Rate=platform_rate_float, + Platform='1' ) updated_rates['platform_rate'] = platform_rate_float @@ -538,17 +538,17 @@ class AdminUpdateConfigView(APIView): shop_rate_float = float(shop_rate) if 0 <= shop_rate_float <= 1: # 🔴 修复:查询现有记录,如果不存在则创建 - shop_rate_obj = Lilubiao.query.filter(fadanpingtai='3').first() + shop_rate_obj = CommissionRate.query.filter(Platform='3').first() if shop_rate_obj: # 更新现有记录 - shop_rate_obj.lilu = shop_rate_float + shop_rate_obj.Rate = shop_rate_float shop_rate_obj.save() else: # 创建新记录 - shop_rate_obj = Lilubiao.query.create( - lilu=shop_rate_float, - fadanpingtai='3' + shop_rate_obj = CommissionRate.query.create( + Rate=shop_rate_float, + Platform='3' ) updated_rates['shop_rate'] = shop_rate_float @@ -575,17 +575,17 @@ class AdminUpdateConfigView(APIView): dashou_withdraw_rate_float = float(dashou_withdraw_rate) if 0 <= dashou_withdraw_rate_float <= 1: # 查询现有记录,如果不存在则创建 - dashou_withdraw_obj = Lilubiao.query.filter(fadanpingtai='5').first() + dashou_withdraw_obj = CommissionRate.query.filter(Platform='5').first() if dashou_withdraw_obj: # 更新现有记录 - dashou_withdraw_obj.lilu = dashou_withdraw_rate_float + dashou_withdraw_obj.Rate = dashou_withdraw_rate_float dashou_withdraw_obj.save() else: # 创建新记录 - dashou_withdraw_obj = Lilubiao.query.create( - lilu=dashou_withdraw_rate_float, - fadanpingtai='5' + dashou_withdraw_obj = CommissionRate.query.create( + Rate=dashou_withdraw_rate_float, + Platform='5' ) updated_rates['dashou_withdraw_rate'] = dashou_withdraw_rate_float @@ -609,17 +609,17 @@ class AdminUpdateConfigView(APIView): guanshi_withdraw_rate_float = float(guanshi_withdraw_rate) if 0 <= guanshi_withdraw_rate_float <= 1: # 查询现有记录,如果不存在则创建 - guanshi_withdraw_obj = Lilubiao.query.filter(fadanpingtai='6').first() + guanshi_withdraw_obj = CommissionRate.query.filter(Platform='6').first() if guanshi_withdraw_obj: # 更新现有记录 - guanshi_withdraw_obj.lilu = guanshi_withdraw_rate_float + guanshi_withdraw_obj.Rate = guanshi_withdraw_rate_float guanshi_withdraw_obj.save() else: # 创建新记录 - guanshi_withdraw_obj = Lilubiao.query.create( - lilu=guanshi_withdraw_rate_float, - fadanpingtai='6' + guanshi_withdraw_obj = CommissionRate.query.create( + Rate=guanshi_withdraw_rate_float, + Platform='6' ) updated_rates['guanshi_withdraw_rate'] = guanshi_withdraw_rate_float @@ -1788,8 +1788,8 @@ class ShangjiaGenerateLinkView(APIView): # 利率 try: - lilu = float(Lilubiao.query.get(fadanpingtai='3').lilu) or 1.0 - except Lilubiao.DoesNotExist: + lilu = float(CommissionRate.query.get(Platform='3').Rate) or 1.0 + except CommissionRate.DoesNotExist: lilu = 1.0 dashou_fencheng = Decimal(str(round(float(jiage) * lilu, 2))) @@ -1838,26 +1838,26 @@ class ShangjiaGenerateLinkView(APIView): secure_token = generate_secure_token(dingdan_id, user.yonghuid) # 创建订单主表 - dingdan = Dingdan.query.create( - dingdan_id=dingdan_id, - zhuangtai=13, - fadan_pingtai=2, - jine=jiage, - dashou_fencheng=dashou_fencheng, - leixing_id=shangpin_type_id, + dingdan = Order.query.create( + OrderID=dingdan_id, + Status=13, + Platform=2, + Amount=jiage, + PlayerCommission=dashou_fencheng, + ProductTypeID=shangpin_type_id, yaoqiuleixing=final_yaoqiuleixing, huiyuan_id=final_huiyuan_id, yongjin=final_yongjin, - jieshao=moban.moban_jieshao[:2000], + Description=moban.moban_jieshao[:2000], user1_id=f"Sj{user.yonghuid}", - tupian=user.avatar or '', + ImageURL=user.avatar or '', ) # 商家扩展表 - DingdanShangjia.query.create( - dingdan=dingdan, - shangjia_id=user.yonghuid, - sjnicheng=shangjia.nicheng or f"商家{user.yonghuid}", + MerchantOrderExt.query.create( + Order=dingdan, + MerchantID=user.yonghuid, + MerchantNickname=shangjia.nicheng or f"商家{user.yonghuid}", ) # 关联标签 @@ -2186,7 +2186,7 @@ class KehuGetDingdanLianjieView(APIView): if lianjie_obj.dingdan_id: try: # 查询订单主表 - dingdan_obj = Dingdan.query.get(dingdan_id=lianjie_obj.dingdan_id) + dingdan_obj = Order.query.get(OrderID=lianjie_obj.dingdan_id) # 获取商家昵称 shangjia_nicheng = '' @@ -2207,10 +2207,10 @@ class KehuGetDingdanLianjieView(APIView): # ========== 构建订单信息 ========== dingdan_info = { - 'jieshao': dingdan_obj.jieshao or '', - 'jiage': str(dingdan_obj.jine) if dingdan_obj.jine is not None else '0.00', # 金额字段名是 jine + 'jieshao': dingdan_obj.Description or '', + 'jiage': str(dingdan_obj.Amount) if dingdan_obj.Amount is not None else '0.00', # 金额字段名是 Amount 'shangjia_mingcheng': shangjia_nicheng, - 'zhuangtai': dingdan_obj.zhuangtai, + 'zhuangtai': dingdan_obj.Status, # 新增配置字段 'kefu_link': kefu_link, 'oss_url': oss_url, @@ -2223,25 +2223,25 @@ class KehuGetDingdanLianjieView(APIView): # 如果已使用,返回已填写的信息 if lianjie_obj.is_used: dingdan_info.update({ - 'youxi_nicheng': dingdan_obj.nicheng or '', + 'youxi_nicheng': dingdan_obj.Nickname or '', 'zhiding_dashou': dingdan_obj.zhiding_id or '', - 'beizhu': dingdan_obj.beizhu or '', + 'beizhu': dingdan_obj.Remark or '', }) # 获取聊天相关标识 # 9.1 获取接单打手ID - jiedan_dashou_id = dingdan_obj.jiedan_dashou_id + jiedan_dashou_id = dingdan_obj.PlayerID dashou_biaoshi = f'Ds{jiedan_dashou_id}' if jiedan_dashou_id else '' # 9.2 获取商家标识 shangjia_biaoshi = '' try: - shangjia_kuozhan = DingdanShangjia.query.select_related('dingdan').filter( - dingdan__dingdan_id=lianjie_obj.dingdan_id + shangjia_kuozhan = MerchantOrderExt.query.select_related('Order').filter( + Order__OrderID=lianjie_obj.dingdan_id ).first() - if shangjia_kuozhan and shangjia_kuozhan.shangjia_id: - shangjia_biaoshi = f'Sj{shangjia_kuozhan.shangjia_id}' + if shangjia_kuozhan and shangjia_kuozhan.MerchantID: + shangjia_biaoshi = f'Sj{shangjia_kuozhan.MerchantID}' logger.info(f"生成商家标识: {shangjia_biaoshi}") else: logger.info(f"订单 {lianjie_obj.dingdan_id} 没有商家订单扩展信息") @@ -2257,7 +2257,7 @@ class KehuGetDingdanLianjieView(APIView): response_data.update(dingdan_info) - except Dingdan.DoesNotExist: + except Order.DoesNotExist: logger.error(f"订单不存在 - 订单ID: {lianjie_obj.dingdan_id}") response_data.update({ 'jieshao': '', @@ -2533,12 +2533,12 @@ class KehuTianxieDingdanView(APIView): logger.error(f"链接记录中订单ID为空 - 链接ID: {lianjie_obj.id}") raise ValueError("订单ID为空") - dingdan_obj = Dingdan.query.get(dingdan_id=lianjie_obj.dingdan_id) + dingdan_obj = Order.query.get(OrderID=lianjie_obj.dingdan_id) # 检查订单状态是否为13(灰色状态) - if dingdan_obj.zhuangtai != 13: + if dingdan_obj.Status != 13: logger.warning( - f"订单状态不允许修改 - 订单ID: {dingdan_obj.dingdan_id}, 当前状态: {dingdan_obj.zhuangtai}") + f"订单状态不允许修改 - 订单ID: {dingdan_obj.OrderID}, 当前状态: {dingdan_obj.Status}") # 回滚事务 transaction.set_rollback(True) return Response({ @@ -2548,9 +2548,9 @@ class KehuTianxieDingdanView(APIView): }, status=status.HTTP_400_BAD_REQUEST) # 更新订单信息 - dingdan_obj.nicheng = youxi_nicheng # 游戏昵称 - dingdan_obj.beizhu = beizhu if beizhu else '' # 备注 - dingdan_obj.zhuangtai = zhuangtai_xin # 新状态:1或7 + dingdan_obj.Nickname = youxi_nicheng # 游戏昵称 + dingdan_obj.Remark = beizhu if beizhu else '' # 备注 + dingdan_obj.Status = zhuangtai_xin # 新状态:1或7 # 如果是指定打手,设置zhiding_id if zhiding_dashou and zhuangtai_xin == 7: @@ -2558,14 +2558,14 @@ class KehuTianxieDingdanView(APIView): dingdan_obj.save() logger.info( - f"更新订单成功 - 订单ID: {dingdan_obj.dingdan_id}, 新状态: {zhuangtai_xin}, 指定打手: {zhiding_dashou or '无'}") + f"更新订单成功 - 订单ID: {dingdan_obj.OrderID}, 新状态: {zhuangtai_xin}, 指定打手: {zhiding_dashou or '无'}") # 构建通知数据(你的 _get_game_type_name 方法保留在视图里直接用) order_info = { - 'dingdan_id': dingdan_obj.dingdan_id, - 'game_type': self._get_game_type_name(dingdan_obj.leixing_id), - 'amount': str(dingdan_obj.jine), - 'order_desc': (dingdan_obj.jieshao or '')[:50], + 'dingdan_id': dingdan_obj.OrderID, + 'game_type': self._get_game_type_name(dingdan_obj.ProductTypeID), + 'amount': str(dingdan_obj.Amount), + 'order_desc': (dingdan_obj.Description or '')[:50], } dingdan_guangbo.delay(order_info) # 瞬间返回,不阻塞请求 @@ -2590,12 +2590,12 @@ class KehuTianxieDingdanView(APIView): 'zhuangtai_text': '普通订单' if zhuangtai_xin == 1 else '指定打手订单' } - logger.info(f"订单提交成功 - 订单ID: {dingdan_obj.dingdan_id}, IP: {client_ip}") + logger.info(f"订单提交成功 - 订单ID: {dingdan_obj.OrderID}, IP: {client_ip}") # 新方法(行为驱动,更安全) update_shangjia_daily( yonghuid=lianjie_obj.yonghu_id, - amount=Decimal(str(dingdan_obj.jine)), + amount=Decimal(str(dingdan_obj.Amount)), action=1 # 1 = 派发 ) @@ -2605,7 +2605,7 @@ class KehuTianxieDingdanView(APIView): 'data': response_data }, status=status.HTTP_200_OK) - except Dingdan.DoesNotExist: + except Order.DoesNotExist: logger.error(f"订单不存在 - 订单ID: {lianjie_obj.dingdan_id}") return Response({ 'code': 500, @@ -2637,17 +2637,17 @@ class KehuTianxieDingdanView(APIView): try: # 获取游戏类型名称 try: - leixing_obj = ShangpinLeixing.query.get(id=dingdan.leixing_id) + leixing_obj = ShangpinLeixing.query.get(id=dingdan.ProductTypeID) game_type = leixing_obj.jieshao except: game_type = '未知游戏' # 构建订单信息 order_info = { - 'dingdan_id': dingdan.dingdan_id, + 'dingdan_id': dingdan.OrderID, 'game_type': game_type, - 'amount': str(dingdan.jine), - 'order_desc': dingdan.jieshao[:50] if dingdan.jieshao else '新订单', + 'amount': str(dingdan.Amount), + 'order_desc': dingdan.Description[:50] if dingdan.Description else '新订单', 'youxi_nicheng': youxi_nicheng, 'order_type': '指定订单' if zhuangtai == 7 else '普通订单', 'zhiding_dashou': zhiding_dashou or '' diff --git a/orders/migrations/0002_chatsession_commissionrate_escortorder_and_more.py b/orders/migrations/0002_chatsession_commissionrate_escortorder_and_more.py new file mode 100644 index 0000000..900961f --- /dev/null +++ b/orders/migrations/0002_chatsession_commissionrate_escortorder_and_more.py @@ -0,0 +1,392 @@ +# Generated by Django 4.2.27 on 2026-06-18 17:46 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('orders', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='ChatSession', + fields=[ + ('id', models.BigAutoField(primary_key=True, serialize=False, verbose_name='主键ID')), + ('User1ID', models.CharField(db_column='user1_id', db_index=True, max_length=30, verbose_name='用户1标识')), + ('User2ID', models.CharField(db_column='user2_id', db_index=True, max_length=30, verbose_name='用户2标识')), + ('OrderID', models.CharField(db_column='dingdan_id', max_length=32, unique=True, verbose_name='订单ID')), + ('Status', models.IntegerField(choices=[(1, '开启中'), (0, '已关闭')], db_column='zhuangtai', db_index=True, default=1, verbose_name='聊天状态')), + ('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')), + ('UpdateTime', models.DateTimeField(auto_now=True, db_column='update_time', verbose_name='更新时间')), + ], + options={ + 'db_table': 'liaotian', + }, + ), + migrations.CreateModel( + name='CommissionRate', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('Rate', models.DecimalField(db_column='lilu', decimal_places=4, max_digits=5, null=True, verbose_name='平台分成利率')), + ('Platform', models.CharField(db_column='fadanpingtai', max_length=10, null=True, verbose_name='订单所属平台')), + ('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')), + ('UpdateTime', models.DateTimeField(auto_now=True, db_column='update_time', verbose_name='更新时间')), + ], + options={ + 'db_table': 'lilubiao', + }, + ), + migrations.CreateModel( + name='EscortOrder', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('OrderID', models.CharField(db_column='dingdan_id', db_index=True, max_length=32, unique=True, verbose_name='订单ID')), + ('MainPlayerID', models.CharField(db_column='zhudashou_id', db_index=True, max_length=32, verbose_name='主打手ID')), + ('Escort1ID', models.CharField(blank=True, db_column='peihu1_id', db_index=True, max_length=32, null=True, verbose_name='陪护1打手ID')), + ('Escort2ID', models.CharField(blank=True, db_column='peihu2_id', db_index=True, max_length=32, null=True, verbose_name='陪护2打手ID')), + ('Status', models.IntegerField(db_column='zhuangtai', default=1, verbose_name='陪护订单状态')), + ('EscortCount', models.IntegerField(db_column='peihu_xuqiu_shuliang', default=1, verbose_name='陪护需求数量')), + ('CommissionReq', models.DecimalField(blank=True, db_column='yongjin_yaoqiu', decimal_places=2, max_digits=10, null=True, verbose_name='抢单佣金要求')), + ('Escort1LevelReq', models.PositiveIntegerField(blank=True, db_column='peihu1_dengji_xuqiu', null=True, verbose_name='陪护1等级需求(称号ID)')), + ('Escort2LevelReq', models.PositiveIntegerField(blank=True, db_column='peihu2_dengji_xuqiu', null=True, verbose_name='陪护2等级需求(称号ID)')), + ('Escort1BombLiability', models.CharField(blank=True, db_column='peihu1_zhadan_danze', max_length=10, null=True, verbose_name='陪护1炸单担责比例')), + ('Escort2BombLiability', models.CharField(blank=True, db_column='peihu2_zhadan_danze', max_length=10, null=True, verbose_name='陪护2炸单担责比例')), + ('Escort1BonusRate', models.CharField(blank=True, db_column='peihu1_fenhong', max_length=10, null=True, verbose_name='陪护1分红比例')), + ('Escort2BonusRate', models.CharField(blank=True, db_column='peihu2_fenhong', max_length=10, null=True, verbose_name='陪护2分红比例')), + ('AssignedEscort1', models.CharField(blank=True, db_column='zhiding_peihu1', max_length=32, null=True, verbose_name='指定陪护1 ID')), + ('AssignedEscort2', models.CharField(blank=True, db_column='zhiding_peihu2', max_length=32, null=True, verbose_name='指定陪护2 ID')), + ('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')), + ('UpdateTime', models.DateTimeField(auto_now=True, db_column='update_time', verbose_name='更新时间')), + ], + options={ + 'verbose_name': '陪护订单', + 'verbose_name_plural': '陪护订单', + 'db_table': 'dingdan_peihu', + }, + ), + migrations.CreateModel( + name='MerchantOrderExt', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('MerchantID', models.CharField(blank=True, db_column='shangjia_id', db_index=True, max_length=32, null=True, verbose_name='商家ID')), + ('MerchantReview', models.TextField(blank=True, db_column='shangjia_pingjia', null=True, verbose_name='商家评价')), + ('PenaltyReason', models.TextField(blank=True, db_column='cfliyou', null=True, verbose_name='商家处罚理由')), + ('PenaltyApplyStatus', models.IntegerField(blank=True, db_column='sqzhuangtai', default=0, null=True, verbose_name='处罚申请状态:0待处理,1成功,2驳回')), + ('RejectReason', models.TextField(blank=True, db_column='bhliyou', null=True, verbose_name='驳回商家处罚理由')), + ('MerchantNickname', models.CharField(db_column='sjnicheng', max_length=50, null=True, verbose_name='商家昵称')), + ('PrevOrderID', models.CharField(blank=True, db_column='shangyige_dingdan_id', max_length=32, null=True, verbose_name='上一个订单ID')), + ], + options={ + 'verbose_name': '商家订单扩展', + 'verbose_name_plural': '商家订单扩展', + 'db_table': 'dingdan_shangjia', + }, + ), + migrations.CreateModel( + name='Order', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('OrderID', models.CharField(db_column='dingdan_id', db_index=True, max_length=32, unique=True, verbose_name='订单ID')), + ('Status', models.IntegerField(blank=True, db_column='zhuangtai', db_index=True, default=1, null=True, verbose_name='订单状态')), + ('Platform', models.IntegerField(blank=True, db_column='fadan_pingtai', null=True, verbose_name='发单平台')), + ('Amount', models.DecimalField(blank=True, db_column='jine', decimal_places=2, max_digits=10, null=True, verbose_name='订单金额')), + ('PlayerCommission', models.DecimalField(blank=True, db_column='dashou_fencheng', decimal_places=2, max_digits=10, null=True, verbose_name='打手分成')), + ('ManagerCommission', models.DecimalField(blank=True, db_column='guanshi_fencheng', decimal_places=2, default=0, max_digits=10, null=True, verbose_name='管事分成')), + ('PlayerID', models.CharField(blank=True, db_column='jiedan_dashou_id', db_index=True, max_length=32, null=True, verbose_name='接单打手ID')), + ('PlayerRemark', models.TextField(blank=True, db_column='dashou_liuyan', null=True, verbose_name='打手留言')), + ('AssignedID', models.CharField(blank=True, db_column='zhiding_id', max_length=32, null=True, verbose_name='指定ID')), + ('ProductID', models.IntegerField(blank=True, db_column='shangpin_id', null=True, verbose_name='商品ID')), + ('ProductTypeID', models.PositiveIntegerField(blank=True, db_column='leixing_id', null=True, verbose_name='商品类型ID')), + ('ImageURL', models.CharField(blank=True, db_column='tupian', max_length=500, null=True, verbose_name='商品图片URL')), + ('GrabRequirement', models.PositiveIntegerField(blank=True, db_column='yaoqiuleixing', null=True, verbose_name='抢单要求类型')), + ('MembershipID', models.CharField(blank=True, db_column='huiyuan_id', max_length=6, null=True, verbose_name='会员ID')), + ('CommissionReq', models.DecimalField(blank=True, db_column='yongjin', decimal_places=2, max_digits=10, null=True, verbose_name='佣金要求')), + ('Description', models.TextField(blank=True, db_column='jieshao', null=True, verbose_name='订单介绍')), + ('Remark', models.TextField(blank=True, db_column='beizhu', null=True, verbose_name='订单备注')), + ('Nickname', models.CharField(blank=True, db_column='nicheng', max_length=50, null=True, verbose_name='游戏昵称')), + ('User1ID', models.CharField(db_column='user1_id', db_index=True, max_length=30, null=True, verbose_name='用户1标识')), + ('User2ID', models.CharField(db_column='user2_id', db_index=True, max_length=30, null=True, verbose_name='用户2打手标识')), + ('AutoTaskID', models.CharField(blank=True, db_column='auto_task_id', default='', max_length=255, verbose_name='延时任务ID')), + ('AutoExpireAt', models.DateTimeField(blank=True, db_column='auto_expire_at', null=True, verbose_name='计划过期时间')), + ('PendingDispatch', models.BooleanField(db_column='pending_dispatch', db_index=True, default=False, verbose_name='待调度标记')), + ('SettlementTime', models.DateTimeField(blank=True, db_column='status_8_time', null=True, verbose_name='状态变为8的时间')), + ('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')), + ('UpdateTime', models.DateTimeField(auto_now=True, db_column='update_time', verbose_name='更新时间')), + ('AssignedCS', models.CharField(db_column='clkf', db_index=True, max_length=20, null=True, verbose_name='处理客服')), + ('RefundReason', models.CharField(blank=True, db_column='tkly', max_length=500, null=True, verbose_name='退款/拒绝理由')), + ('WechatTransactionID', models.CharField(blank=True, db_column='wechat_transaction_id', db_index=True, max_length=64, null=True, verbose_name='微信支付订单号')), + ], + options={ + 'verbose_name': '订单', + 'verbose_name_plural': '订单', + 'db_table': 'dingdan', + }, + ), + migrations.CreateModel( + name='OrderPlayerHistory', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('OrderID', models.CharField(db_column='dingdan_id', db_index=True, max_length=32, verbose_name='订单ID')), + ('PlayerID', models.CharField(db_column='dashou_id', db_index=True, max_length=7, verbose_name='打手ID')), + ('Times', models.PositiveSmallIntegerField(verbose_name='第几次接单(从1开始)')), + ('Operator', models.CharField(db_column='operator', max_length=11, verbose_name='操作客服ID')), + ('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')), + ], + options={ + 'verbose_name': '订单打手变更历史', + 'verbose_name_plural': '订单打手变更历史', + 'db_table': 'order_dashou_history', + }, + ), + migrations.CreateModel( + name='Penalty', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='自增主键')), + ('PenalizedUserID', models.CharField(db_column='beichufa_id', db_index=True, max_length=20, verbose_name='被处罚用户ID')), + ('ApplicantID', models.CharField(blank=True, db_column='shenqing_chufa', max_length=20, null=True, verbose_name='申请处罚者ID')), + ('Identity', models.IntegerField(choices=[(1, '打手'), (2, '管事'), (3, '商家'), (4, '组长')], db_column='shenfen', default=1, verbose_name='被处罚者身份')), + ('Reason', models.TextField(blank=True, db_column='chufaliyou', null=True, verbose_name='处罚理由')), + ('FineAmount', models.DecimalField(db_column='fakuanjine', decimal_places=2, default=0.0, max_digits=10, verbose_name='罚款金额')), + ('RelatedOrderID', models.CharField(blank=True, db_column='guanliandingdan_id', db_index=True, max_length=32, null=True, verbose_name='关联订单ID')), + ('Status', models.IntegerField(choices=[(1, '待缴纳'), (2, '已缴纳'), (3, '申诉中'), (4, '已驳回')], db_column='zhuangtai', db_index=True, default=1, verbose_name='罚单状态')), + ('AffectsGrabbing', models.IntegerField(choices=[(1, '影响抢单'), (0, '不影响抢单')], db_column='yingxiang_qiangdan', db_index=True, default=1, verbose_name='是否影响抢单')), + ('AppealReason', models.TextField(blank=True, db_column='shensuliyou', null=True, verbose_name='申诉理由')), + ('ApproveReason', models.TextField(blank=True, db_column='tongyi_chufaliyou', null=True, verbose_name='同意处罚理由')), + ('RejectReason', models.TextField(blank=True, db_column='bohuiliyou', null=True, verbose_name='驳回理由')), + ('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')), + ('UpdateTime', models.DateTimeField(auto_now=True, db_column='update_time', verbose_name='更新时间')), + ('ApplicantIdentity', models.IntegerField(choices=[(1, '客服'), (2, '售后'), (3, '管理员'), (4, '店铺'), (5, '商家')], db_column='shenqingren_shenfen', default=1, verbose_name='申请处罚人身份')), + ('ProcessorIdentity', models.IntegerField(choices=[(1, '客服'), (2, '售后'), (3, '管理员')], db_column='chulizhe_shenfen', default=2, verbose_name='处理者身份')), + ('ProcessorID', models.CharField(blank=True, db_column='chulizhe', max_length=20, null=True, verbose_name='处理者')), + ('ApplicantBonusAmount', models.DecimalField(db_column='shenqingren_fenhong_jine', decimal_places=2, default=0.0, max_digits=12, verbose_name='申请人分红金额')), + ], + options={ + 'verbose_name': '罚单', + 'verbose_name_plural': '罚单', + 'db_table': 'fadan', + }, + ), + migrations.CreateModel( + name='PenaltyAppealImage', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('PenalizedUserID', models.CharField(db_column='beichufa_id', db_index=True, max_length=7, verbose_name='被处罚用户ID')), + ('ImageURL', models.CharField(db_column='tupian_url', max_length=500, verbose_name='图片相对URL')), + ('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')), + ('Purpose', models.IntegerField(choices=[(1, '处罚证据图片'), (2, '申诉图片')], db_column='yongtu', default=2, verbose_name='图片用途')), + ], + options={ + 'verbose_name': '罚款申诉图片', + 'verbose_name_plural': '罚款申诉图片', + 'db_table': 'fadan_shensu_tupian', + }, + ), + migrations.CreateModel( + name='PenaltyBonus', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='自增主键')), + ('BeneficiaryID', models.CharField(db_column='fenhongzhe_id', db_index=True, max_length=20, verbose_name='分红者ID')), + ('TotalAmount', models.DecimalField(db_column='zonge', decimal_places=2, default=0.0, max_digits=12, verbose_name='分红总额')), + ('WithdrawableAmount', models.DecimalField(db_column='ketixian_fenhong', decimal_places=2, default=0.0, max_digits=12, verbose_name='可提现分红')), + ('Identity', models.IntegerField(choices=[(1, '商家'), (2, '客服'), (3, '平台管理者'), (4, '店铺'), (5, '售后')], db_column='shenfen', default=1, verbose_name='分红者身份')), + ('BonusCount', models.IntegerField(db_column='fenhong_cishu', default=0, verbose_name='分红次数')), + ('IsIndividualRate', models.BooleanField(db_column='is_individual_rate', default=False, verbose_name='是否单独开启分红利率')), + ('IndividualRate', models.DecimalField(db_column='yingde_lilv', decimal_places=4, default=0.0, max_digits=5, verbose_name='分红应得利率')), + ('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')), + ('UpdateTime', models.DateTimeField(auto_now=True, db_column='update_time', verbose_name='更新时间')), + ], + options={ + 'verbose_name': '罚款分红', + 'verbose_name_plural': '罚款分红', + 'db_table': 'fadan_fenhong', + }, + ), + migrations.CreateModel( + name='PenaltyBonusRate', + fields=[ + ('Identity', models.IntegerField(choices=[(1, '客服'), (2, '售后'), (3, '管理员'), (4, '店铺'), (5, '商家')], db_column='shenfen', primary_key=True, serialize=False, verbose_name='申请处罚人身份')), + ('Rate', models.DecimalField(db_column='lilv', decimal_places=4, default=0.0, max_digits=5, verbose_name='分红费率')), + ('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')), + ('UpdateTime', models.DateTimeField(auto_now=True, db_column='update_time', verbose_name='更新时间')), + ], + options={ + 'verbose_name': '罚款分红费率配置', + 'verbose_name_plural': '罚款分红费率配置', + 'db_table': 'fadan_fenhong_lilv', + }, + ), + migrations.CreateModel( + name='PenaltyEvidenceImage', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('OrderID', models.CharField(db_column='dingdan_id', db_index=True, max_length=32, null=True, verbose_name='订单ID')), + ('UserID', models.CharField(blank=True, db_column='yonghuid', db_index=True, max_length=32, null=True, verbose_name='用户ID')), + ('ImageURL', models.CharField(blank=True, db_column='tupian', max_length=500, null=True, verbose_name='证据图片URL')), + ('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')), + ('UpdateTime', models.DateTimeField(auto_now=True, db_column='update_time', verbose_name='更新时间')), + ], + options={ + 'db_table': 'chufatupian', + }, + ), + migrations.CreateModel( + name='PenaltyRecord', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('PlayerID', models.CharField(db_column='dashouid', db_index=True, max_length=7, null=True, verbose_name='被罚打手ID')), + ('ApplicantID', models.CharField(db_column='qingqiuid', db_index=True, max_length=11, null=True, verbose_name='请求处罚ID')), + ('ProcessorID', models.CharField(db_column='chuliid', db_index=True, max_length=11, null=True, verbose_name='处理处罚ID')), + ('PenaltyReason', models.TextField(blank=True, db_column='cfliyou', null=True, verbose_name='处罚理由')), + ('AppealReason', models.TextField(blank=True, db_column='ssliyou', null=True, verbose_name='打手申诉理由')), + ('ApplyStatus', models.IntegerField(blank=True, db_column='sqzhuangtai', default=0, null=True, verbose_name='处罚申请状态:0待处理,1成功,2驳回')), + ('RejectReason', models.TextField(blank=True, db_column='bhliyou', null=True, verbose_name='驳回处罚理由')), + ('DeductedPoints', models.IntegerField(db_column='jifen', default=0, verbose_name='扣除打手积分')), + ('OrderID', models.CharField(db_column='dingdan_id', db_index=True, max_length=32, null=True, verbose_name='订单ID')), + ('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')), + ('UpdateTime', models.DateTimeField(auto_now=True, db_column='update_time', verbose_name='更新时间')), + ], + options={ + 'db_table': 'chufajilu', + }, + ), + migrations.CreateModel( + name='PlatformCashFlow', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('TotalIncome', models.DecimalField(blank=True, db_column='zonge', decimal_places=2, max_digits=10, null=True, verbose_name='收取总金额')), + ('TotalPayout', models.DecimalField(blank=True, db_column='zhichuzonge', decimal_places=2, max_digits=10, null=True, verbose_name='支出总金额')), + ('TotalProfit', models.DecimalField(blank=True, db_column='zongshouyi', decimal_places=2, max_digits=10, null=True, verbose_name='总收益')), + ('DailyIncome', models.DecimalField(blank=True, db_column='rizonge', decimal_places=2, max_digits=10, null=True, verbose_name='日收取')), + ('DailyPayout', models.DecimalField(blank=True, db_column='rizhichu', decimal_places=2, max_digits=10, null=True, verbose_name='日支出')), + ('DailyProfit', models.DecimalField(blank=True, db_column='rishouyi', decimal_places=2, max_digits=10, null=True, verbose_name='日收益')), + ('TotalIncomeCount', models.IntegerField(db_column='zongshoucishu', default=0, verbose_name='总收取次数')), + ('DailyIncomeCount', models.IntegerField(db_column='rishoucishu', default=0, verbose_name='日收取次数')), + ('TotalPayoutCount', models.IntegerField(db_column='zongzhichucishu', default=0, verbose_name='总支出次数')), + ('DailyPayoutCount', models.IntegerField(db_column='rizhichucishu', default=0, verbose_name='日支出次数')), + ], + options={ + 'db_table': 'ptliushui', + }, + ), + migrations.CreateModel( + name='PlatformOrderExt', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('BossID', models.CharField(blank=True, db_column='laoban_id', db_index=True, max_length=32, null=True, verbose_name='老板ID')), + ('BossReview', models.TextField(blank=True, db_column='laoban_pingjia', null=True, verbose_name='老板评价')), + ('RejectSettlementFlag', models.IntegerField(db_column='jjjs_biaoshi', default=0, verbose_name='拒绝结算标记(1表示拒绝结算)')), + ('PlatformIncome', models.DecimalField(blank=True, db_column='pingtai_shouyi', decimal_places=2, default=0.0, max_digits=10, null=True, verbose_name='平台收益')), + ('ShopIncome', models.DecimalField(blank=True, db_column='dianpu_shouyi', decimal_places=2, default=0.0, max_digits=10, null=True, verbose_name='店铺收益')), + ('ShopID', models.PositiveIntegerField(blank=True, db_column='dianpu_id', db_index=True, null=True, verbose_name='所属店铺ID')), + ('ParentShopID', models.PositiveIntegerField(blank=True, db_column='shangji_dianpu_id', db_index=True, null=True, verbose_name='该订单的上级店铺ID')), + ('ParentBonus', models.DecimalField(blank=True, db_column='shangji_fenhong', decimal_places=2, default=0.0, max_digits=10, null=True, verbose_name='上级分红金额')), + ], + options={ + 'verbose_name': '平台订单扩展', + 'verbose_name_plural': '平台订单扩展', + 'db_table': 'dingdan_pingtai', + }, + ), + migrations.CreateModel( + name='PlayerDeliveryImage', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('OrderID', models.CharField(db_column='dingdan_id', db_index=True, max_length=32, null=True, verbose_name='订单ID')), + ('PlayerID', models.CharField(blank=True, db_column='dashou', db_index=True, max_length=32, null=True, verbose_name='接单打手ID')), + ('ImageURL', models.CharField(blank=True, db_column='tupian', max_length=500, null=True, verbose_name='打手提交图片URL')), + ('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')), + ('UpdateTime', models.DateTimeField(auto_now=True, db_column='update_time', verbose_name='更新时间')), + ], + options={ + 'db_table': 'dashoutupian', + }, + ), + migrations.CreateModel( + name='PlayerRating', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('PlayerID', models.CharField(blank=True, db_column='dashou', db_index=True, max_length=32, null=True, verbose_name='接单打手ID')), + ('TotalScore', models.PositiveIntegerField(db_column='zongfen', default=0, verbose_name='总分')), + ('RatingCount', models.PositiveIntegerField(db_column='cishu', default=0, verbose_name='评分次数')), + ('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')), + ('UpdateTime', models.DateTimeField(auto_now=True, db_column='update_time', verbose_name='更新时间')), + ], + options={ + 'verbose_name': '评分表', + 'db_table': 'pingfenbiao', + }, + ), + migrations.CreateModel( + name='RefundRecord', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('OrderID', models.CharField(db_column='dingdan_id', max_length=32, unique=True, verbose_name='订单ID')), + ('PlayerID', models.CharField(db_column='dashouid', max_length=7, null=True, verbose_name='接单打手ID')), + ('ApplicantID', models.CharField(db_column='qingqiuid', max_length=7, null=True, verbose_name='请求用户ID')), + ('ProcessorID', models.CharField(db_column='chuliid', db_index=True, max_length=11, null=True, verbose_name='处理人ID')), + ('Reason', models.TextField(blank=True, db_column='liyou', null=True, verbose_name='理由')), + ('ApplyStatus', models.IntegerField(blank=True, db_column='sqzhuangtai', db_index=True, default=0, null=True, verbose_name='申请状态:0待处理,1成功,2驳回')), + ('RejectReason', models.TextField(blank=True, db_column='bhliyou', null=True, verbose_name='驳回理由')), + ('Amount', models.DecimalField(blank=True, db_column='jine', decimal_places=2, max_digits=10, null=True, verbose_name='订单金额')), + ('PlayerCommission', models.DecimalField(blank=True, db_column='dashou_fencheng', decimal_places=2, max_digits=10, null=True, verbose_name='打手分成')), + ('Description', models.TextField(blank=True, db_column='jieshao', null=True, verbose_name='订单介绍')), + ('Remark', models.TextField(blank=True, db_column='beizhu', null=True, verbose_name='订单备注')), + ('Nickname', models.CharField(blank=True, db_column='nicheng', max_length=50, null=True, verbose_name='游戏昵称')), + ('CreateTime', models.DateTimeField(auto_now_add=True, db_column='create_time', verbose_name='创建时间')), + ('UpdateTime', models.DateTimeField(auto_now=True, db_column='update_time', verbose_name='更新时间')), + ], + options={ + 'db_table': 'tuikuanjilu', + }, + ), + migrations.DeleteModel( + name='Chufajilu', + ), + migrations.DeleteModel( + name='Chufatupian', + ), + migrations.DeleteModel( + name='Dashoutupian', + ), + migrations.DeleteModel( + name='DingdanPeihu', + ), + migrations.RemoveField( + model_name='dingdanpingtai', + name='dingdan', + ), + migrations.RemoveField( + model_name='dingdanshangjia', + name='dingdan', + ), + migrations.DeleteModel( + name='FadanFenhong', + ), + migrations.DeleteModel( + name='FadanFenhongLilv', + ), + migrations.RemoveField( + model_name='fadanshensutupian', + name='fadan', + ), + migrations.DeleteModel( + name='Liaotian', + ), + migrations.DeleteModel( + name='Lilubiao', + ), + migrations.DeleteModel( + name='OrderDashouHistory', + ), + migrations.DeleteModel( + name='Pingfen', + ), + migrations.DeleteModel( + name='Ptliushui', + ), + migrations.DeleteModel( + name='Tuikuanjilu', + ), + ] diff --git a/orders/migrations/0003_delete_dingdan_delete_dingdanpingtai_and_more.py b/orders/migrations/0003_delete_dingdan_delete_dingdanpingtai_and_more.py new file mode 100644 index 0000000..19cf9ce --- /dev/null +++ b/orders/migrations/0003_delete_dingdan_delete_dingdanpingtai_and_more.py @@ -0,0 +1,177 @@ +# Generated by Django 4.2.27 on 2026-06-18 17:46 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('orders', '0002_chatsession_commissionrate_escortorder_and_more'), + ('rank', '0002_alter_dashoubiaoxian_dingdan_and_more'), + ] + + operations = [ + migrations.DeleteModel( + name='Dingdan', + ), + migrations.DeleteModel( + name='DingdanPingtai', + ), + migrations.DeleteModel( + name='DingdanShangjia', + ), + migrations.DeleteModel( + name='Fadan', + ), + migrations.DeleteModel( + name='FadanShensuTupian', + ), + migrations.AddIndex( + model_name='refundrecord', + index=models.Index(fields=['ProcessorID'], name='tuikuanjilu_chuliid_0b0f16_idx'), + ), + migrations.AddIndex( + model_name='refundrecord', + index=models.Index(fields=['ApplyStatus'], name='tuikuanjilu_sqzhuan_d89dc9_idx'), + ), + migrations.AddIndex( + model_name='playerrating', + index=models.Index(fields=['PlayerID'], name='pingfenbiao_dashou_f62f10_idx'), + ), + migrations.AddIndex( + model_name='playerdeliveryimage', + index=models.Index(fields=['PlayerID'], name='dashoutupia_dashou_7de8bd_idx'), + ), + migrations.AddIndex( + model_name='playerdeliveryimage', + index=models.Index(fields=['OrderID'], name='dashoutupia_dingdan_97c685_idx'), + ), + migrations.AddField( + model_name='platformorderext', + name='Order', + field=models.OneToOneField(db_column='dingdan_id', on_delete=django.db.models.deletion.CASCADE, related_name='pingtai_kuozhan', to='orders.order', verbose_name='订单'), + ), + migrations.AddIndex( + model_name='penaltyrecord', + index=models.Index(fields=['PlayerID'], name='chufajilu_dashoui_07aac0_idx'), + ), + migrations.AddIndex( + model_name='penaltyrecord', + index=models.Index(fields=['ApplicantID'], name='chufajilu_qingqiu_ac160e_idx'), + ), + migrations.AddIndex( + model_name='penaltyrecord', + index=models.Index(fields=['ProcessorID'], name='chufajilu_chuliid_cd63ac_idx'), + ), + migrations.AddIndex( + model_name='penaltyrecord', + index=models.Index(fields=['OrderID'], name='chufajilu_dingdan_b8f0c2_idx'), + ), + migrations.AddIndex( + model_name='penaltyevidenceimage', + index=models.Index(fields=['UserID'], name='chufatupian_yonghui_71e585_idx'), + ), + migrations.AddIndex( + model_name='penaltyevidenceimage', + index=models.Index(fields=['OrderID'], name='chufatupian_dingdan_ce0dd4_idx'), + ), + migrations.AddIndex( + model_name='penaltybonus', + index=models.Index(fields=['BeneficiaryID'], name='fadan_fenhong_zhe_idx'), + ), + migrations.AddIndex( + model_name='penaltybonus', + index=models.Index(fields=['Identity'], name='fadan_fenhong_sf_idx'), + ), + migrations.AddField( + model_name='penaltyappealimage', + name='Penalty', + field=models.ForeignKey(db_column='fadan_id', on_delete=django.db.models.deletion.CASCADE, related_name='shensu_tupians', to='orders.penalty', verbose_name='关联罚单'), + ), + migrations.AddIndex( + model_name='penalty', + index=models.Index(fields=['PenalizedUserID', 'AffectsGrabbing', 'Status'], name='fadan_qiangdan_check'), + ), + migrations.AddIndex( + model_name='penalty', + index=models.Index(fields=['RelatedOrderID'], name='fadan_dingdan_idx'), + ), + migrations.AddIndex( + model_name='orderplayerhistory', + index=models.Index(fields=['OrderID'], name='order_dasho_dingdan_1e79ab_idx'), + ), + migrations.AddIndex( + model_name='orderplayerhistory', + index=models.Index(fields=['PlayerID'], name='order_dasho_dashou__0a637c_idx'), + ), + migrations.AddIndex( + model_name='order', + index=models.Index(fields=['Status'], name='dingdan_zhuangt_2febe8_idx'), + ), + migrations.AddIndex( + model_name='order', + index=models.Index(fields=['OrderID'], name='dingdan_dingdan_83dcb6_idx'), + ), + migrations.AddIndex( + model_name='order', + index=models.Index(fields=['PlayerID'], name='dingdan_jiedan__921bfa_idx'), + ), + migrations.AddIndex( + model_name='order', + index=models.Index(fields=['WechatTransactionID'], name='dingdan_wechat__278b79_idx'), + ), + migrations.AddField( + model_name='merchantorderext', + name='Order', + field=models.OneToOneField(db_column='dingdan_id', on_delete=django.db.models.deletion.CASCADE, related_name='shangjia_kuozhan', to='orders.order', verbose_name='订单'), + ), + migrations.AddIndex( + model_name='escortorder', + index=models.Index(fields=['MainPlayerID'], name='dingdan_pei_zhudash_583f4e_idx'), + ), + migrations.AddIndex( + model_name='escortorder', + index=models.Index(fields=['Escort1ID'], name='dingdan_pei_peihu1__728279_idx'), + ), + migrations.AddIndex( + model_name='escortorder', + index=models.Index(fields=['Escort2ID'], name='dingdan_pei_peihu2__77e45e_idx'), + ), + migrations.AddIndex( + model_name='escortorder', + index=models.Index(fields=['Status'], name='dingdan_pei_zhuangt_22eaf6_idx'), + ), + migrations.AddIndex( + model_name='chatsession', + index=models.Index(fields=['User1ID'], name='liaotian_user1_i_6be6cd_idx'), + ), + migrations.AddIndex( + model_name='chatsession', + index=models.Index(fields=['User2ID'], name='liaotian_user2_i_9f61a4_idx'), + ), + migrations.AddIndex( + model_name='chatsession', + index=models.Index(fields=['Status'], name='liaotian_zhuangt_5e8be5_idx'), + ), + migrations.AddIndex( + model_name='platformorderext', + index=models.Index(fields=['BossID'], name='dingdan_pin_laoban__d55e6f_idx'), + ), + migrations.AddIndex( + model_name='platformorderext', + index=models.Index(fields=['ShopID'], name='dingdan_pin_dianpu__9fbe27_idx'), + ), + migrations.AddIndex( + model_name='penaltyappealimage', + index=models.Index(fields=['Penalty'], name='fadan_shens_fadan_i_78fab9_idx'), + ), + migrations.AddIndex( + model_name='penaltyappealimage', + index=models.Index(fields=['PenalizedUserID'], name='fadan_shens_beichuf_59748e_idx'), + ), + migrations.AddIndex( + model_name='merchantorderext', + index=models.Index(fields=['MerchantID'], name='dingdan_sha_shangji_64d28b_idx'), + ), + ] diff --git a/orders/models.py b/orders/models.py index 77321ff..921bf66 100644 --- a/orders/models.py +++ b/orders/models.py @@ -1,119 +1,282 @@ +"""订单模块数据模型 + +包含订单全生命周期相关模型: + +- **Order** — 订单主表 +- **PlatformOrderExt** — 平台订单扩展表(发单平台=1 时使用) +- **MerchantOrderExt** — 商家订单扩展表(发单平台=2 时使用) +- **EscortOrder** — 陪护订单表 +- **OrderPlayerHistory** — 订单打手变更历史 +- **Penalty** — 罚单表 +- **PenaltyAppealImage** — 罚单申诉图片 +- **PenaltyBonus** — 罚单分红 +- **PenaltyBonusRate** — 罚单分红费率配置 +- **PlayerDeliveryImage** — 打手交付图片 +- **PlayerRating** — 打手评分 +- **CommissionRate** — 分成利率配置 +- **PenaltyRecord** — 处罚记录 +- **PenaltyEvidenceImage** — 处罚证据图片 +- **RefundRecord** — 退款记录 +- **PlatformCashFlow** — 平台流水统计 +- **ChatSession** — 聊天会话 +""" from django.db import models from gvsdsdk.model_base import QModel -class Dingdan(QModel): - """订单主表""" - # 核心编号:唯一且不可为空[citation:3][citation:9] - dingdan_id = models.CharField(max_length=32, unique=True,db_index=True, verbose_name='订单ID') - # 状态与平台:用整数表示,具体含义由业务逻辑定义 - zhuangtai = models.IntegerField(default=1, null=True, blank=True,db_index=True, verbose_name='订单状态') - fadan_pingtai = models.IntegerField(null=True, blank=True, verbose_name='发单平台') - # 金额相关 - jine = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, verbose_name='订单金额') - dashou_fencheng = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, verbose_name='打手分成') - guanshi_fencheng = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, default=0, verbose_name='管事分成') - # 用户与商品关联ID - jiedan_dashou_id = models.CharField(max_length=32, null=True, db_index=True,blank=True, verbose_name='接单打手ID') - dashou_liuyan = models.TextField(null=True, blank=True, verbose_name='打手留言') - zhiding_id = models.CharField(max_length=32, null=True, blank=True, verbose_name='指定ID') - shangpin_id = models.IntegerField(null=True, blank=True, verbose_name='商品ID') - leixing_id = models.PositiveIntegerField(null=True, blank=True, verbose_name='商品类型ID') # 直接存数字 - tupian = models.CharField(max_length=500, null=True, blank=True, verbose_name='商品图片URL') +# =========================================================================== +# 订单核心模型 +# =========================================================================== - yaoqiuleixing = models.PositiveIntegerField(null=True, blank=True, verbose_name='抢单要求类型') - huiyuan_id = models.CharField(max_length=6, null=True, blank=True, verbose_name='会员ID') - yongjin = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, verbose_name='佣金要求') - # 订单描述信息 - jieshao = models.TextField(null=True, blank=True, verbose_name='订单介绍') - beizhu = models.TextField(null=True, blank=True, verbose_name='订单备注') +class Order(QModel): + """订单主表 - # 新增字段:游戏昵称(前端提交的游戏昵称) - nicheng = models.CharField(max_length=50, null=True, blank=True, verbose_name='游戏昵称') - user1_id = models.CharField(max_length=30,null=True, db_index=True, verbose_name='用户1标识') - user2_id = models.CharField(max_length=30, null=True,db_index=True, verbose_name='用户2打手标识') - #liaotian_pindao = models.CharField(max_length=255, blank=True, null=True, verbose_name='聊天频道名') - auto_task_id = models.CharField('延时任务ID', max_length=255, blank=True, default='') - auto_expire_at = models.DateTimeField('计划过期时间', null=True, blank=True) - pending_dispatch = models.BooleanField('待调度标记', default=False, db_index=True) - status_8_time = models.DateTimeField('状态变为8的时间', null=True, blank=True) - # 时间戳 - create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') - update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间') - clkf = models.CharField(max_length=20, null=True, db_index=True, verbose_name='处理客服') - tkly = models.CharField(max_length=500, blank=True, null=True, verbose_name='退款/拒绝理由') - wechat_transaction_id = models.CharField( - max_length=64, - blank=True, - null=True, - db_index=True, - verbose_name='微信支付订单号' + 状态码含义: + 1=待抢单, 2=进行中, 3=已完成, 4=退款审核中, 5=已退款, + 7=指定中, 8=结算中, 9=未支付, 14=支付失败, 25=已废弃 + + 发单平台(fadan_pingtai): + 1=平台发单(老板微信支付), 2=商家发单(商家余额扣款) + """ + + OrderID = models.CharField( + max_length=32, unique=True, db_index=True, + db_column='dingdan_id', verbose_name='订单ID', + ) + Status = models.IntegerField( + default=1, null=True, blank=True, db_index=True, + db_column='zhuangtai', verbose_name='订单状态', + ) + Platform = models.IntegerField( + null=True, blank=True, + db_column='fadan_pingtai', verbose_name='发单平台', + ) + # ---- 金额 ---- + Amount = models.DecimalField( + max_digits=10, decimal_places=2, null=True, blank=True, + db_column='jine', verbose_name='订单金额', + ) + PlayerCommission = models.DecimalField( + max_digits=10, decimal_places=2, null=True, blank=True, + db_column='dashou_fencheng', verbose_name='打手分成', + ) + ManagerCommission = models.DecimalField( + max_digits=10, decimal_places=2, null=True, blank=True, default=0, + db_column='guanshi_fencheng', verbose_name='管事分成', + ) + # ---- 用户与商品关联 ---- + PlayerID = models.CharField( + max_length=32, null=True, db_index=True, blank=True, + db_column='jiedan_dashou_id', verbose_name='接单打手ID', + ) + PlayerRemark = models.TextField( + null=True, blank=True, + db_column='dashou_liuyan', verbose_name='打手留言', + ) + AssignedID = models.CharField( + max_length=32, null=True, blank=True, + db_column='zhiding_id', verbose_name='指定ID', + ) + ProductID = models.IntegerField( + null=True, blank=True, + db_column='shangpin_id', verbose_name='商品ID', + ) + ProductTypeID = models.PositiveIntegerField( + null=True, blank=True, + db_column='leixing_id', verbose_name='商品类型ID', + ) + ImageURL = models.CharField( + max_length=500, null=True, blank=True, + db_column='tupian', verbose_name='商品图片URL', + ) + # ---- 抢单要求 ---- + GrabRequirement = models.PositiveIntegerField( + null=True, blank=True, + db_column='yaoqiuleixing', verbose_name='抢单要求类型', + ) + MembershipID = models.CharField( + max_length=6, null=True, blank=True, + db_column='huiyuan_id', verbose_name='会员ID', + ) + CommissionReq = models.DecimalField( + max_digits=10, decimal_places=2, null=True, blank=True, + db_column='yongjin', verbose_name='佣金要求', + ) + # ---- 描述 ---- + Description = models.TextField( + null=True, blank=True, + db_column='jieshao', verbose_name='订单介绍', + ) + Remark = models.TextField( + null=True, blank=True, + db_column='beizhu', verbose_name='订单备注', + ) + Nickname = models.CharField( + max_length=50, null=True, blank=True, + db_column='nicheng', verbose_name='游戏昵称', + ) + User1ID = models.CharField( + max_length=30, null=True, db_index=True, + db_column='user1_id', verbose_name='用户1标识', + ) + User2ID = models.CharField( + max_length=30, null=True, db_index=True, + db_column='user2_id', verbose_name='用户2打手标识', + ) + # ---- 延时任务与调度 ---- + AutoTaskID = models.CharField( + max_length=255, blank=True, default='', + db_column='auto_task_id', verbose_name='延时任务ID', + ) + AutoExpireAt = models.DateTimeField( + null=True, blank=True, + db_column='auto_expire_at', verbose_name='计划过期时间', + ) + PendingDispatch = models.BooleanField( + default=False, db_index=True, + db_column='pending_dispatch', verbose_name='待调度标记', + ) + SettlementTime = models.DateTimeField( + null=True, blank=True, + db_column='status_8_time', verbose_name='状态变为8的时间', + ) + # ---- 时间戳 ---- + CreateTime = models.DateTimeField( + auto_now_add=True, + db_column='create_time', verbose_name='创建时间', + ) + UpdateTime = models.DateTimeField( + auto_now=True, + db_column='update_time', verbose_name='更新时间', + ) + # ---- 客服与退款 ---- + AssignedCS = models.CharField( + max_length=20, null=True, db_index=True, + db_column='clkf', verbose_name='处理客服', + ) + RefundReason = models.CharField( + max_length=500, blank=True, null=True, + db_column='tkly', verbose_name='退款/拒绝理由', + ) + WechatTransactionID = models.CharField( + max_length=64, blank=True, null=True, db_index=True, + db_column='wechat_transaction_id', verbose_name='微信支付订单号', ) class Meta: db_table = 'dingdan' verbose_name = '订单' verbose_name_plural = '订单' - # 为高频查询字段添加索引 indexes = [ - models.Index(fields=['zhuangtai']), - models.Index(fields=['dingdan_id']), - models.Index(fields=['jiedan_dashou_id']), - models.Index(fields=['wechat_transaction_id']), - + models.Index(fields=['Status']), + models.Index(fields=['OrderID']), + models.Index(fields=['PlayerID']), + models.Index(fields=['WechatTransactionID']), ] def __str__(self): - return self.dingdan_id + return self.OrderID -class DingdanPingtai(QModel): - """平台订单扩展表 (当 fadan_pingtai=1 时使用)""" - dingdan = models.OneToOneField(Dingdan, on_delete=models.CASCADE, related_name='pingtai_kuozhan', verbose_name='订单') - laoban_id = models.CharField(max_length=32, null=True, blank=True, db_index=True,verbose_name='老板ID') - laoban_pingjia = models.TextField(null=True, blank=True, verbose_name='老板评价') - jjjs_biaoshi = models.IntegerField(default=0, verbose_name='拒绝结算标记(1表示拒绝结算)') - # ========== 新增字段 ========== - pingtai_shouyi = models.DecimalField(max_digits=10,decimal_places=2,null=True,blank=True,default=0.00,verbose_name='平台收益') - dianpu_shouyi = models.DecimalField(max_digits=10,decimal_places=2, null=True,blank=True,default=0.00,verbose_name='店铺收益') - dianpu_id = models.PositiveIntegerField(null=True,blank=True,db_index=True,verbose_name='所属店铺ID') +class PlatformOrderExt(QModel): + """平台订单扩展表(当 Order.Platform=1 时使用) - # ---------- 上级分红快照 ---------- - shangji_dianpu_id = models.PositiveIntegerField(null=True, blank=True, db_index=True, - verbose_name='该订单的上级店铺ID') - shangji_fenhong = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, default=0.00, - verbose_name='上级分红金额') + OneToOne 关联 Order,记录平台发单的额外信息: + 老板ID、平台收益、店铺收益、上级分红快照等。 + """ - # ============================= + Order = models.OneToOneField( + Order, on_delete=models.CASCADE, + related_name='pingtai_kuozhan', + db_column='dingdan_id', verbose_name='订单', + ) + BossID = models.CharField( + max_length=32, null=True, blank=True, db_index=True, + db_column='laoban_id', verbose_name='老板ID', + ) + BossReview = models.TextField( + null=True, blank=True, + db_column='laoban_pingjia', verbose_name='老板评价', + ) + RejectSettlementFlag = models.IntegerField( + default=0, + db_column='jjjs_biaoshi', verbose_name='拒绝结算标记(1表示拒绝结算)', + ) + # ---- 收益 ---- + PlatformIncome = models.DecimalField( + max_digits=10, decimal_places=2, null=True, blank=True, default=0.00, + db_column='pingtai_shouyi', verbose_name='平台收益', + ) + ShopIncome = models.DecimalField( + max_digits=10, decimal_places=2, null=True, blank=True, default=0.00, + db_column='dianpu_shouyi', verbose_name='店铺收益', + ) + ShopID = models.PositiveIntegerField( + null=True, blank=True, db_index=True, + db_column='dianpu_id', verbose_name='所属店铺ID', + ) + # ---- 上级分红快照 ---- + ParentShopID = models.PositiveIntegerField( + null=True, blank=True, db_index=True, + db_column='shangji_dianpu_id', verbose_name='该订单的上级店铺ID', + ) + ParentBonus = models.DecimalField( + max_digits=10, decimal_places=2, null=True, blank=True, default=0.00, + db_column='shangji_fenhong', verbose_name='上级分红金额', + ) class Meta: db_table = 'dingdan_pingtai' verbose_name = '平台订单扩展' verbose_name_plural = '平台订单扩展' indexes = [ - models.Index(fields=['laoban_id']), - models.Index(fields=['dianpu_id']), # 为新字段加索引 + models.Index(fields=['BossID']), + models.Index(fields=['ShopID']), ] def __str__(self): - return f"平台扩展-{self.dingdan.dingdan_id}" + return f"平台扩展-{self.Order.OrderID}" -class DingdanShangjia(QModel): - """商家发单扩展表 (当 fadan_pingtai=2 时使用)""" - dingdan = models.OneToOneField(Dingdan, on_delete=models.CASCADE, related_name='shangjia_kuozhan', verbose_name='订单') - shangjia_id = models.CharField(max_length=32, null=True, blank=True,db_index=True, verbose_name='商家ID') - shangjia_pingjia = models.TextField(null=True, blank=True, verbose_name='商家评价') - cfliyou = models.TextField(null=True, blank=True, verbose_name='商家处罚理由') - sqzhuangtai =models.IntegerField(default=0, null=True, blank=True, verbose_name='处罚申请状态:0待处理,1成功,2驳回') - bhliyou = models.TextField(null=True, blank=True, verbose_name='驳回商家处罚理由') - sjnicheng =models.CharField(max_length=50,null=True, verbose_name='商家昵称') - # 在 dingdan/models.py 的 DingdanShangjia 类中添加 - shangyige_dingdan_id = models.CharField( - max_length=32, - null=True, - blank=True, - verbose_name='上一个订单ID' +class MerchantOrderExt(QModel): + """商家发单扩展表(当 Order.Platform=2 时使用) + + OneToOne 关联 Order,记录商家发单的额外信息: + 商家ID、处罚相关、上一个订单ID等。 + """ + + Order = models.OneToOneField( + Order, on_delete=models.CASCADE, + related_name='shangjia_kuozhan', + db_column='dingdan_id', verbose_name='订单', + ) + MerchantID = models.CharField( + max_length=32, null=True, blank=True, db_index=True, + db_column='shangjia_id', verbose_name='商家ID', + ) + MerchantReview = models.TextField( + null=True, blank=True, + db_column='shangjia_pingjia', verbose_name='商家评价', + ) + PenaltyReason = models.TextField( + null=True, blank=True, + db_column='cfliyou', verbose_name='商家处罚理由', + ) + PenaltyApplyStatus = models.IntegerField( + default=0, null=True, blank=True, + db_column='sqzhuangtai', verbose_name='处罚申请状态:0待处理,1成功,2驳回', + ) + RejectReason = models.TextField( + null=True, blank=True, + db_column='bhliyou', verbose_name='驳回商家处罚理由', + ) + MerchantNickname = models.CharField( + max_length=50, null=True, + db_column='sjnicheng', verbose_name='商家昵称', + ) + PrevOrderID = models.CharField( + max_length=32, null=True, blank=True, + db_column='shangyige_dingdan_id', verbose_name='上一个订单ID', ) class Meta: @@ -121,98 +284,223 @@ class DingdanShangjia(QModel): verbose_name = '商家订单扩展' verbose_name_plural = '商家订单扩展' indexes = [ - models.Index(fields=['shangjia_id']), - + models.Index(fields=['MerchantID']), ] def __str__(self): - return f"商家扩展-{self.dingdan.dingdan_id}" + return f"商家扩展-{self.Order.OrderID}" +class EscortOrder(QModel): + """陪护订单表(一个订单最多2个陪护打手) + 陪护订单依附于主订单,状态码: + 1=待抢单, 2=已抢待确认, 3=进行中, 4=已完成, 5=已取消, 7=指定状态 + """ - - - - - -class DingdanPeihu(QModel): - """陪护订单表(一个订单最多2个陪护)""" - # 关联订单(一对一,陪护订单依附于原订单) - dingdan_id = models.CharField(max_length=32, unique=True, db_index=True, verbose_name='订单ID') - # 主打手ID(冗余,方便查询,必须与订单的 jiedan_dashou_id 一致) - zhudashou_id = models.CharField(max_length=32, db_index=True, verbose_name='主打手ID') - # 实际接单陪护 - peihu1_id = models.CharField(max_length=32, null=True, blank=True, db_index=True, verbose_name='陪护1打手ID') - peihu2_id = models.CharField(max_length=32, null=True, blank=True, db_index=True, verbose_name='陪护2打手ID') - # 订单状态(1=待抢单,2=已抢待确认,3=进行中,4=已完成,5=已取消,7=指定状态...) - zhuangtai = models.IntegerField(default=1, verbose_name='陪护订单状态') - # 需求配置 - peihu_xuqiu_shuliang = models.IntegerField(default=1, verbose_name='陪护需求数量') - yongjin_yaoqiu = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, verbose_name='抢单佣金要求') - # 等级需求(关联称号ID,可空表示无限制) - peihu1_dengji_xuqiu = models.PositiveIntegerField(null=True, blank=True, verbose_name='陪护1等级需求(称号ID)') - peihu2_dengji_xuqiu = models.PositiveIntegerField(null=True, blank=True, verbose_name='陪护2等级需求(称号ID)') - # 处罚与分红比例(格式:"1/5" 或 "2/5") - peihu1_zhadan_danze = models.CharField(max_length=10, null=True, blank=True, verbose_name='陪护1炸单担责比例') - peihu2_zhadan_danze = models.CharField(max_length=10, null=True, blank=True, verbose_name='陪护2炸单担责比例') - peihu1_fenhong = models.CharField(max_length=10, null=True, blank=True, verbose_name='陪护1分红比例') - peihu2_fenhong = models.CharField(max_length=10, null=True, blank=True, verbose_name='陪护2分红比例') - # 指定陪护(可预设打手ID,可为空) - zhiding_peihu1 = models.CharField(max_length=32, null=True, blank=True, verbose_name='指定陪护1 ID') - zhiding_peihu2 = models.CharField(max_length=32, null=True, blank=True, verbose_name='指定陪护2 ID') - # 时间戳 - create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') - update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间') + OrderID = models.CharField( + max_length=32, unique=True, db_index=True, + db_column='dingdan_id', verbose_name='订单ID', + ) + MainPlayerID = models.CharField( + max_length=32, db_index=True, + db_column='zhudashou_id', verbose_name='主打手ID', + ) + Escort1ID = models.CharField( + max_length=32, null=True, blank=True, db_index=True, + db_column='peihu1_id', verbose_name='陪护1打手ID', + ) + Escort2ID = models.CharField( + max_length=32, null=True, blank=True, db_index=True, + db_column='peihu2_id', verbose_name='陪护2打手ID', + ) + Status = models.IntegerField( + default=1, + db_column='zhuangtai', verbose_name='陪护订单状态', + ) + # ---- 需求配置 ---- + EscortCount = models.IntegerField( + default=1, + db_column='peihu_xuqiu_shuliang', verbose_name='陪护需求数量', + ) + CommissionReq = models.DecimalField( + max_digits=10, decimal_places=2, null=True, blank=True, + db_column='yongjin_yaoqiu', verbose_name='抢单佣金要求', + ) + Escort1LevelReq = models.PositiveIntegerField( + null=True, blank=True, + db_column='peihu1_dengji_xuqiu', verbose_name='陪护1等级需求(称号ID)', + ) + Escort2LevelReq = models.PositiveIntegerField( + null=True, blank=True, + db_column='peihu2_dengji_xuqiu', verbose_name='陪护2等级需求(称号ID)', + ) + # ---- 处罚与分红比例 ---- + Escort1BombLiability = models.CharField( + max_length=10, null=True, blank=True, + db_column='peihu1_zhadan_danze', verbose_name='陪护1炸单担责比例', + ) + Escort2BombLiability = models.CharField( + max_length=10, null=True, blank=True, + db_column='peihu2_zhadan_danze', verbose_name='陪护2炸单担责比例', + ) + Escort1BonusRate = models.CharField( + max_length=10, null=True, blank=True, + db_column='peihu1_fenhong', verbose_name='陪护1分红比例', + ) + Escort2BonusRate = models.CharField( + max_length=10, null=True, blank=True, + db_column='peihu2_fenhong', verbose_name='陪护2分红比例', + ) + # ---- 指定陪护 ---- + AssignedEscort1 = models.CharField( + max_length=32, null=True, blank=True, + db_column='zhiding_peihu1', verbose_name='指定陪护1 ID', + ) + AssignedEscort2 = models.CharField( + max_length=32, null=True, blank=True, + db_column='zhiding_peihu2', verbose_name='指定陪护2 ID', + ) + # ---- 时间戳 ---- + CreateTime = models.DateTimeField( + auto_now_add=True, + db_column='create_time', verbose_name='创建时间', + ) + UpdateTime = models.DateTimeField( + auto_now=True, + db_column='update_time', verbose_name='更新时间', + ) class Meta: db_table = 'dingdan_peihu' verbose_name = '陪护订单' verbose_name_plural = verbose_name indexes = [ - models.Index(fields=['zhudashou_id']), - models.Index(fields=['peihu1_id']), - models.Index(fields=['peihu2_id']), - models.Index(fields=['zhuangtai']), + models.Index(fields=['MainPlayerID']), + models.Index(fields=['Escort1ID']), + models.Index(fields=['Escort2ID']), + models.Index(fields=['Status']), ] +class OrderPlayerHistory(QModel): + """订单打手变更历史表,记录订单每次更换打手的操作。""" + + OrderID = models.CharField( + max_length=32, db_index=True, + db_column='dingdan_id', verbose_name='订单ID', + ) + PlayerID = models.CharField( + max_length=7, db_index=True, + db_column='dashou_id', verbose_name='打手ID', + ) + Times = models.PositiveSmallIntegerField(verbose_name='第几次接单(从1开始)') + Operator = models.CharField( + max_length=11, + db_column='operator', verbose_name='操作客服ID', + ) + CreateTime = models.DateTimeField( + auto_now_add=True, + db_column='create_time', verbose_name='创建时间', + ) + + class Meta: + db_table = 'order_dashou_history' + verbose_name = '订单打手变更历史' + verbose_name_plural = '订单打手变更历史' + indexes = [ + models.Index(fields=['OrderID']), + models.Index(fields=['PlayerID']), + ] + + def __str__(self): + return f"{self.OrderID} -> {self.PlayerID} 第{self.Times}次" +# =========================================================================== +# 罚单相关模型 +# =========================================================================== +class Penalty(QModel): + """罚单表——平台各类处罚信息 + + 状态码:1=待缴纳, 2=已缴纳, 3=申诉中, 4=已驳回 + 被处罚者身份(shenfen):1=打手, 2=管事, 3=商家, 4=组长 + """ -class Fadan(QModel): - """罚单表——平台各类处罚信息""" id = models.AutoField(primary_key=True, verbose_name='自增主键') - beichufa_id = models.CharField(max_length=20, db_index=True, verbose_name='被处罚用户ID') # 直接用yonghuid,后续可改为外键 - shenqing_chufa = models.CharField(max_length=20, blank=True, null=True, verbose_name='申请处罚者ID') - shenfen = models.IntegerField(choices=[(1, '打手'), (2, '管事'), (3, '商家'), (4, '组长')], default=1, verbose_name='被处罚者身份') - chufaliyou = models.TextField(blank=True, null=True, verbose_name='处罚理由') - fakuanjine = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='罚款金额') - guanliandingdan_id = models.CharField(max_length=32, blank=True, null=True, db_index=True, verbose_name='关联订单ID') - zhuangtai = models.IntegerField(choices=[(1, '待缴纳'), (2, '已缴纳'), (3, '申诉中'), (4, '已驳回')], default=1, db_index=True, verbose_name='罚单状态') - yingxiang_qiangdan = models.IntegerField(choices=[(1, '影响抢单'), (0, '不影响抢单')], default=1, db_index=True, verbose_name='是否影响抢单') - shensuliyou = models.TextField(blank=True, null=True, verbose_name='申诉理由') - tongyi_chufaliyou = models.TextField(blank=True, null=True, verbose_name='同意处罚理由') - bohuiliyou = models.TextField(blank=True, null=True, verbose_name='驳回理由') - create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') - update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间') - # 在 Fadan 模型中添加 - shenqingren_shenfen = models.IntegerField( - choices=[(1, '客服'), (2, '售后'), (3, '管理员'),(4,'店铺'),(5,'商家')], # 按实际扩展 + PenalizedUserID = models.CharField( + max_length=20, db_index=True, + db_column='beichufa_id', verbose_name='被处罚用户ID', + ) + ApplicantID = models.CharField( + max_length=20, blank=True, null=True, + db_column='shenqing_chufa', verbose_name='申请处罚者ID', + ) + Identity = models.IntegerField( + choices=[(1, '打手'), (2, '管事'), (3, '商家'), (4, '组长')], default=1, - verbose_name='申请处罚人身份' + db_column='shenfen', verbose_name='被处罚者身份', ) - chulizhe_shenfen = models.IntegerField( - choices=[(1, '客服'), (2, '售后'), (3, '管理员')], - default=2, - verbose_name='处理者身份' + Reason = models.TextField( + blank=True, null=True, + db_column='chufaliyou', verbose_name='处罚理由', ) - chulizhe = models.CharField(max_length=20, blank=True, null=True, verbose_name='处理者') - # ========== 新增字段 ========== - shenqingren_fenhong_jine = models.DecimalField( + FineAmount = models.DecimalField( + max_digits=10, decimal_places=2, default=0.00, + db_column='fakuanjine', verbose_name='罚款金额', + ) + RelatedOrderID = models.CharField( + max_length=32, blank=True, null=True, db_index=True, + db_column='guanliandingdan_id', verbose_name='关联订单ID', + ) + Status = models.IntegerField( + choices=[(1, '待缴纳'), (2, '已缴纳'), (3, '申诉中'), (4, '已驳回')], + default=1, db_index=True, + db_column='zhuangtai', verbose_name='罚单状态', + ) + AffectsGrabbing = models.IntegerField( + choices=[(1, '影响抢单'), (0, '不影响抢单')], + default=1, db_index=True, + db_column='yingxiang_qiangdan', verbose_name='是否影响抢单', + ) + AppealReason = models.TextField( + blank=True, null=True, + db_column='shensuliyou', verbose_name='申诉理由', + ) + ApproveReason = models.TextField( + blank=True, null=True, + db_column='tongyi_chufaliyou', verbose_name='同意处罚理由', + ) + RejectReason = models.TextField( + blank=True, null=True, + db_column='bohuiliyou', verbose_name='驳回理由', + ) + CreateTime = models.DateTimeField( + auto_now_add=True, + db_column='create_time', verbose_name='创建时间', + ) + UpdateTime = models.DateTimeField( + auto_now=True, + db_column='update_time', verbose_name='更新时间', + ) + ApplicantIdentity = models.IntegerField( + choices=[(1, '客服'), (2, '售后'), (3, '管理员'), (4, '店铺'), (5, '商家')], + default=1, + db_column='shenqingren_shenfen', verbose_name='申请处罚人身份', + ) + ProcessorIdentity = models.IntegerField( + choices=[(1, '客服'), (2, '售后'), (3, '管理员')], + default=2, + db_column='chulizhe_shenfen', verbose_name='处理者身份', + ) + ProcessorID = models.CharField( + max_length=20, blank=True, null=True, + db_column='chulizhe', verbose_name='处理者', + ) + ApplicantBonusAmount = models.DecimalField( max_digits=12, decimal_places=2, default=0.00, - verbose_name='申请人分红金额' + db_column='shenqingren_fenhong_jine', verbose_name='申请人分红金额', ) class Meta: @@ -220,26 +508,41 @@ class Fadan(QModel): verbose_name = '罚单' verbose_name_plural = '罚单' indexes = [ - models.Index(fields=['beichufa_id', 'yingxiang_qiangdan', 'zhuangtai'], name='fadan_qiangdan_check'), - models.Index(fields=['guanliandingdan_id'], name='fadan_dingdan_idx'), + models.Index(fields=['PenalizedUserID', 'AffectsGrabbing', 'Status'], name='fadan_qiangdan_check'), + models.Index(fields=['RelatedOrderID'], name='fadan_dingdan_idx'), ] def __str__(self): - return f"{self.beichufa_id} - 罚款{self.fakuanjine}元 - 状态{self.zhuangtai}" + return f"{self.PenalizedUserID} - 罚款{self.FineAmount}元 - 状态{self.Status}" -# ==================== 罚款申诉图片表 ==================== -class FadanShensuTupian(QModel): - """罚款申诉图片,关联罚单""" - fadan = models.ForeignKey(Fadan, on_delete=models.CASCADE, related_name='shensu_tupians', verbose_name='关联罚单') - beichufa_id = models.CharField(max_length=7, db_index=True, verbose_name='被处罚用户ID') # 冗余,便于直接按用户查 - tupian_url = models.CharField(max_length=500, verbose_name='图片相对URL') - create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') - # 在 FadanShensuTupian 模型中添加 - yongtu = models.IntegerField( +class PenaltyAppealImage(QModel): + """罚款申诉图片,关联罚单。 + + 用途(yongtu):1=处罚证据图片, 2=申诉图片 + """ + + Penalty = models.ForeignKey( + Penalty, on_delete=models.CASCADE, + related_name='shensu_tupians', + db_column='fadan_id', verbose_name='关联罚单', + ) + PenalizedUserID = models.CharField( + max_length=7, db_index=True, + db_column='beichufa_id', verbose_name='被处罚用户ID', + ) + ImageURL = models.CharField( + max_length=500, + db_column='tupian_url', verbose_name='图片相对URL', + ) + CreateTime = models.DateTimeField( + auto_now_add=True, + db_column='create_time', verbose_name='创建时间', + ) + Purpose = models.IntegerField( choices=[(1, '处罚证据图片'), (2, '申诉图片')], default=2, - verbose_name='图片用途' + db_column='yongtu', verbose_name='图片用途', ) class Meta: @@ -247,47 +550,92 @@ class FadanShensuTupian(QModel): verbose_name = '罚款申诉图片' verbose_name_plural = '罚款申诉图片' indexes = [ - models.Index(fields=['fadan_id']), - models.Index(fields=['beichufa_id']), + models.Index(fields=['Penalty']), + models.Index(fields=['PenalizedUserID']), ] +class PenaltyBonus(QModel): + """罚款分红表——记录罚款产生的分红信息 + + 分红者身份(shenfen):1=商家, 2=客服, 3=平台管理者, 4=店铺, 5=售后 + """ -# 与 Fadan 放在同一个文件或独立的 fadan/models.py -class FadanFenhong(QModel): - """罚款分红表——记录罚款产生的分红信息""" id = models.AutoField(primary_key=True, verbose_name='自增主键') - fenhongzhe_id = models.CharField(max_length=20, db_index=True, verbose_name='分红者ID') - zonge = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='分红总额') - ketixian_fenhong = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='可提现分红') - shenfen = models.IntegerField(choices=[(1, '商家'), (2, '客服'), (3, '平台管理者'),(4,'店铺'),(5, '售后')], default=1, verbose_name='分红者身份') - fenhong_cishu = models.IntegerField(default=0, verbose_name='分红次数') - # ✅ 新增字段:是否单独开启分红利率(若开启,则使用本记录的 yingde_lilv;否则使用全局配置) - is_individual_rate = models.BooleanField(default=False, verbose_name='是否单独开启分红利率') - yingde_lilv = models.DecimalField(max_digits=5, decimal_places=4, default=0.0000, verbose_name='分红应得利率') - create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') - update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间') + BeneficiaryID = models.CharField( + max_length=20, db_index=True, + db_column='fenhongzhe_id', verbose_name='分红者ID', + ) + TotalAmount = models.DecimalField( + max_digits=12, decimal_places=2, default=0.00, + db_column='zonge', verbose_name='分红总额', + ) + WithdrawableAmount = models.DecimalField( + max_digits=12, decimal_places=2, default=0.00, + db_column='ketixian_fenhong', verbose_name='可提现分红', + ) + Identity = models.IntegerField( + choices=[(1, '商家'), (2, '客服'), (3, '平台管理者'), (4, '店铺'), (5, '售后')], + default=1, + db_column='shenfen', verbose_name='分红者身份', + ) + BonusCount = models.IntegerField( + default=0, + db_column='fenhong_cishu', verbose_name='分红次数', + ) + IsIndividualRate = models.BooleanField( + default=False, + db_column='is_individual_rate', verbose_name='是否单独开启分红利率', + ) + IndividualRate = models.DecimalField( + max_digits=5, decimal_places=4, default=0.0000, + db_column='yingde_lilv', verbose_name='分红应得利率', + ) + CreateTime = models.DateTimeField( + auto_now_add=True, + db_column='create_time', verbose_name='创建时间', + ) + UpdateTime = models.DateTimeField( + auto_now=True, + db_column='update_time', verbose_name='更新时间', + ) class Meta: db_table = 'fadan_fenhong' verbose_name = '罚款分红' verbose_name_plural = '罚款分红' indexes = [ - models.Index(fields=['fenhongzhe_id'], name='fadan_fenhong_zhe_idx'), - models.Index(fields=['shenfen'], name='fadan_fenhong_sf_idx'), + models.Index(fields=['BeneficiaryID'], name='fadan_fenhong_zhe_idx'), + models.Index(fields=['Identity'], name='fadan_fenhong_sf_idx'), ] def __str__(self): - return f"{self.fenhongzhe_id} - 分红{self.ketixian_fenhong}元" + return f"{self.BeneficiaryID} - 分红{self.WithdrawableAmount}元" +class PenaltyBonusRate(QModel): + """罚款分红费率配置表,按身份设置分红费率。 + 身份(shenfen):1=客服, 2=售后, 3=管理员, 4=店铺, 5=商家 + """ -class FadanFenhongLilv(QModel): - shenfen = models.IntegerField(primary_key=True, choices=[(1, '客服'), (2, '售后'), (3, '管理员'), (4, '店铺'), (5, '商家')], verbose_name='申请处罚人身份') - lilv = models.DecimalField(max_digits=5, decimal_places=4, default=0.0000, verbose_name='分红费率') - create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') - update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间') + Identity = models.IntegerField( + primary_key=True, + choices=[(1, '客服'), (2, '售后'), (3, '管理员'), (4, '店铺'), (5, '商家')], + db_column='shenfen', verbose_name='申请处罚人身份', + ) + Rate = models.DecimalField( + max_digits=5, decimal_places=4, default=0.0000, + db_column='lilv', verbose_name='分红费率', + ) + CreateTime = models.DateTimeField( + auto_now_add=True, + db_column='create_time', verbose_name='创建时间', + ) + UpdateTime = models.DateTimeField( + auto_now=True, + db_column='update_time', verbose_name='更新时间', + ) class Meta: db_table = 'fadan_fenhong_lilv' @@ -295,196 +643,385 @@ class FadanFenhongLilv(QModel): verbose_name_plural = verbose_name def __str__(self): - return f"身份{self.shenfen} - 费率{self.lilv}" + return f"身份{self.Identity} - 费率{self.Rate}" +# =========================================================================== +# 证据/图片/记录模型 +# =========================================================================== +class PlayerDeliveryImage(QModel): + """打手交付图片表""" -class OrderDashouHistory(QModel): - """ - 订单打手变更历史表 - 记录订单每次更换打手的操作 - """ - dingdan_id = models.CharField(max_length=32, db_index=True, verbose_name='订单ID') - dashou_id = models.CharField(max_length=7, db_index=True, verbose_name='打手ID') - times = models.PositiveSmallIntegerField(verbose_name='第几次接单(从1开始)') - operator = models.CharField(max_length=11, verbose_name='操作客服ID') - create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') + OrderID = models.CharField( + max_length=32, db_index=True, null=True, + db_column='dingdan_id', verbose_name='订单ID', + ) + PlayerID = models.CharField( + max_length=32, null=True, blank=True, db_index=True, + db_column='dashou', verbose_name='接单打手ID', + ) + ImageURL = models.CharField( + max_length=500, null=True, blank=True, + db_column='tupian', verbose_name='打手提交图片URL', + ) + CreateTime = models.DateTimeField( + auto_now_add=True, + db_column='create_time', verbose_name='创建时间', + ) + UpdateTime = models.DateTimeField( + auto_now=True, + db_column='update_time', verbose_name='更新时间', + ) - class Meta: - db_table = 'order_dashou_history' - verbose_name = '订单打手变更历史' - verbose_name_plural = '订单打手变更历史' - indexes = [ - models.Index(fields=['dingdan_id']), - models.Index(fields=['dashou_id']), - ] - - def __str__(self): - return f"{self.dingdan_id} -> {self.dashou_id} 第{self.times}次" - - - - - - -class Dashoutupian(QModel): - dingdan_id = models.CharField(max_length=32,db_index=True, null=True, verbose_name='订单ID') - dashou = models.CharField(max_length=32, null=True, blank=True,db_index=True, verbose_name='接单打手ID') - tupian = models.CharField(max_length=500, null=True, blank=True, verbose_name='打手提交图片URL') - create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') - update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间') class Meta: db_table = 'dashoutupian' - indexes = [ - models.Index(fields=['dashou']), - models.Index(fields=['dingdan_id']), - + models.Index(fields=['PlayerID']), + models.Index(fields=['OrderID']), ] +class PlayerRating(QModel): + """打手评分表""" -class Pingfen(QModel): - dashou = models.CharField(max_length=32, null=True, blank=True, db_index=True,verbose_name='接单打手ID') - zongfen = models.PositiveIntegerField(default=0, verbose_name='总分') - cishu = models.PositiveIntegerField(default=0, verbose_name='评分次数') - create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') - update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间') + PlayerID = models.CharField( + max_length=32, null=True, blank=True, db_index=True, + db_column='dashou', verbose_name='接单打手ID', + ) + TotalScore = models.PositiveIntegerField( + default=0, + db_column='zongfen', verbose_name='总分', + ) + RatingCount = models.PositiveIntegerField( + default=0, + db_column='cishu', verbose_name='评分次数', + ) + CreateTime = models.DateTimeField( + auto_now_add=True, + db_column='create_time', verbose_name='创建时间', + ) + UpdateTime = models.DateTimeField( + auto_now=True, + db_column='update_time', verbose_name='更新时间', + ) class Meta: db_table = 'pingfenbiao' verbose_name = '评分表' indexes = [ - models.Index(fields=['dashou']), + models.Index(fields=['PlayerID']), ] - def __str__(self): - return f"{self.dashou} - 平均分: {self.pingjun_fen():.2f}" - def pingjun_fen(self): + def __str__(self): + return f"{self.PlayerID} - 平均分: {self.average_score():.2f}" + + def average_score(self) -> float: """计算平均分""" - if self.cishu > 0: - return float(self.zongfen) / self.cishu + if self.RatingCount > 0: + return float(self.TotalScore) / self.RatingCount return 0.0 +class PenaltyRecord(QModel): + """处罚记录表""" + + PlayerID = models.CharField( + max_length=7, null=True, db_index=True, + db_column='dashouid', verbose_name='被罚打手ID', + ) + ApplicantID = models.CharField( + max_length=11, null=True, db_index=True, + db_column='qingqiuid', verbose_name='请求处罚ID', + ) + ProcessorID = models.CharField( + max_length=11, null=True, db_index=True, + db_column='chuliid', verbose_name='处理处罚ID', + ) + PenaltyReason = models.TextField( + null=True, blank=True, + db_column='cfliyou', verbose_name='处罚理由', + ) + AppealReason = models.TextField( + null=True, blank=True, + db_column='ssliyou', verbose_name='打手申诉理由', + ) + ApplyStatus = models.IntegerField( + default=0, null=True, blank=True, + db_column='sqzhuangtai', verbose_name='处罚申请状态:0待处理,1成功,2驳回', + ) + RejectReason = models.TextField( + null=True, blank=True, + db_column='bhliyou', verbose_name='驳回处罚理由', + ) + DeductedPoints = models.IntegerField( + default=0, + db_column='jifen', verbose_name='扣除打手积分', + ) + OrderID = models.CharField( + max_length=32, null=True, db_index=True, + db_column='dingdan_id', verbose_name='订单ID', + ) + CreateTime = models.DateTimeField( + auto_now_add=True, + db_column='create_time', verbose_name='创建时间', + ) + UpdateTime = models.DateTimeField( + auto_now=True, + db_column='update_time', verbose_name='更新时间', + ) + + class Meta: + db_table = 'chufajilu' + indexes = [ + models.Index(fields=['PlayerID']), + models.Index(fields=['ApplicantID']), + models.Index(fields=['ProcessorID']), + models.Index(fields=['OrderID']), + ] + + +class PenaltyEvidenceImage(QModel): + """处罚证据图片表""" + + OrderID = models.CharField( + max_length=32, db_index=True, null=True, + db_column='dingdan_id', verbose_name='订单ID', + ) + UserID = models.CharField( + max_length=32, null=True, blank=True, db_index=True, + db_column='yonghuid', verbose_name='用户ID', + ) + ImageURL = models.CharField( + max_length=500, null=True, blank=True, + db_column='tupian', verbose_name='证据图片URL', + ) + CreateTime = models.DateTimeField( + auto_now_add=True, + db_column='create_time', verbose_name='创建时间', + ) + UpdateTime = models.DateTimeField( + auto_now=True, + db_column='update_time', verbose_name='更新时间', + ) + + class Meta: + db_table = 'chufatupian' + indexes = [ + models.Index(fields=['UserID']), + models.Index(fields=['OrderID']), + ] + + +class RefundRecord(QModel): + """退款记录表""" + + OrderID = models.CharField( + max_length=32, unique=True, + db_column='dingdan_id', verbose_name='订单ID', + ) + PlayerID = models.CharField( + max_length=7, null=True, + db_column='dashouid', verbose_name='接单打手ID', + ) + ApplicantID = models.CharField( + max_length=7, null=True, + db_column='qingqiuid', verbose_name='请求用户ID', + ) + ProcessorID = models.CharField( + max_length=11, null=True, db_index=True, + db_column='chuliid', verbose_name='处理人ID', + ) + Reason = models.TextField( + null=True, blank=True, + db_column='liyou', verbose_name='理由', + ) + ApplyStatus = models.IntegerField( + default=0, null=True, blank=True, db_index=True, + db_column='sqzhuangtai', verbose_name='申请状态:0待处理,1成功,2驳回', + ) + RejectReason = models.TextField( + null=True, blank=True, + db_column='bhliyou', verbose_name='驳回理由', + ) + Amount = models.DecimalField( + max_digits=10, decimal_places=2, null=True, blank=True, + db_column='jine', verbose_name='订单金额', + ) + PlayerCommission = models.DecimalField( + max_digits=10, decimal_places=2, null=True, blank=True, + db_column='dashou_fencheng', verbose_name='打手分成', + ) + Description = models.TextField( + null=True, blank=True, + db_column='jieshao', verbose_name='订单介绍', + ) + Remark = models.TextField( + null=True, blank=True, + db_column='beizhu', verbose_name='订单备注', + ) + Nickname = models.CharField( + max_length=50, null=True, blank=True, + db_column='nicheng', verbose_name='游戏昵称', + ) + CreateTime = models.DateTimeField( + auto_now_add=True, + db_column='create_time', verbose_name='创建时间', + ) + UpdateTime = models.DateTimeField( + auto_now=True, + db_column='update_time', verbose_name='更新时间', + ) + + class Meta: + db_table = 'tuikuanjilu' + indexes = [ + models.Index(fields=['ProcessorID']), + models.Index(fields=['ApplyStatus']), + ] + + +# =========================================================================== +# 配置/统计模型 +# =========================================================================== + +class CommissionRate(QModel): + """分成利率配置表 + + Platform 字段标识发单平台:1=平台, 2=商家 + """ + + Rate = models.DecimalField( + max_digits=5, decimal_places=4, null=True, + db_column='lilu', verbose_name='平台分成利率', + ) + Platform = models.CharField( + max_length=10, null=True, + db_column='fadanpingtai', verbose_name='订单所属平台', + ) + CreateTime = models.DateTimeField( + auto_now_add=True, + db_column='create_time', verbose_name='创建时间', + ) + UpdateTime = models.DateTimeField( + auto_now=True, + db_column='update_time', verbose_name='更新时间', + ) -class Lilubiao(QModel): - lilu = models.DecimalField(max_digits=5, decimal_places=4,null=True, verbose_name='平台分成利率,1是平台,2是商家') - #sahngjialilu = models.DecimalField(max_digits=5, decimal_places=4,null=True, verbose_name='商家利率') - fadanpingtai = models.CharField(max_length=10,null=True,verbose_name='订单所属平台,(商家或平台)') - create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') - update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间') class Meta: db_table = 'lilubiao' +class PlatformCashFlow(QModel): + """平台流水统计表""" + TotalIncome = models.DecimalField( + max_digits=10, decimal_places=2, null=True, blank=True, + db_column='zonge', verbose_name='收取总金额', + ) + TotalPayout = models.DecimalField( + max_digits=10, decimal_places=2, null=True, blank=True, + db_column='zhichuzonge', verbose_name='支出总金额', + ) + TotalProfit = models.DecimalField( + max_digits=10, decimal_places=2, null=True, blank=True, + db_column='zongshouyi', verbose_name='总收益', + ) + DailyIncome = models.DecimalField( + max_digits=10, decimal_places=2, null=True, blank=True, + db_column='rizonge', verbose_name='日收取', + ) + DailyPayout = models.DecimalField( + max_digits=10, decimal_places=2, null=True, blank=True, + db_column='rizhichu', verbose_name='日支出', + ) + DailyProfit = models.DecimalField( + max_digits=10, decimal_places=2, null=True, blank=True, + db_column='rishouyi', verbose_name='日收益', + ) + TotalIncomeCount = models.IntegerField( + default=0, + db_column='zongshoucishu', verbose_name='总收取次数', + ) + DailyIncomeCount = models.IntegerField( + default=0, + db_column='rishoucishu', verbose_name='日收取次数', + ) + TotalPayoutCount = models.IntegerField( + default=0, + db_column='zongzhichucishu', verbose_name='总支出次数', + ) + DailyPayoutCount = models.IntegerField( + default=0, + db_column='rizhichucishu', verbose_name='日支出次数', + ) -class Chufajilu(QModel): - dashouid = models.CharField(max_length=7, null=True, db_index=True, verbose_name='被罚打手ID') - qingqiuid = models.CharField(max_length=11, null=True, db_index=True, verbose_name='请求处罚ID') - chuliid = models.CharField(max_length=11, null=True, db_index=True, verbose_name='处理处罚ID') - cfliyou = models.TextField(null=True, blank=True, verbose_name='处罚理由') - ssliyou = models.TextField(null=True, blank=True, verbose_name='打手申诉理由') - sqzhuangtai = models.IntegerField(default=0, null=True, blank=True, verbose_name='处罚申请状态:0待处理,1成功,2驳回') - bhliyou = models.TextField(null=True, blank=True, verbose_name='驳回处罚理由') - jifen = models.IntegerField(default=0, verbose_name='扣除打手积分') - dingdan_id = models.CharField(max_length=32, null=True, db_index=True, verbose_name='订单ID') - create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') - update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间') - class Meta: - db_table = 'chufajilu' - indexes = [ - models.Index(fields=['dashouid']), - models.Index(fields=['qingqiuid']), - models.Index(fields=['chuliid']), - models.Index(fields=['dingdan_id']), - ] - - -class Chufatupian(QModel): - dingdan_id = models.CharField(max_length=32,db_index=True, null=True, verbose_name='订单ID') - yonghuid = models.CharField(max_length=32, null=True, blank=True,db_index=True, verbose_name='用户ID') - tupian = models.CharField(max_length=500, null=True, blank=True, verbose_name='证据图片URL') - create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') - update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间') - class Meta: - db_table = 'chufatupian' - - indexes = [ - models.Index(fields=['yonghuid']), - models.Index(fields=['dingdan_id']), - - ] - - -class Tuikuanjilu(QModel): - dingdan_id = models.CharField(max_length=32, unique=True, verbose_name='订单ID') - dashouid = models.CharField(max_length=7, null=True, verbose_name='接单打手ID') - qingqiuid = models.CharField(max_length=7, null=True, verbose_name='请求用户ID') - chuliid = models.CharField(max_length=11, null=True, db_index=True, verbose_name='处理人ID') - liyou = models.TextField(null=True, blank=True, verbose_name='理由') - sqzhuangtai = models.IntegerField(default=0, null=True, blank=True,db_index=True, verbose_name='申请状态:0待处理,1成功,2驳回') - bhliyou = models.TextField(null=True, blank=True, verbose_name='驳回理由') - jine = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, verbose_name='订单金额') - dashou_fencheng = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, verbose_name='打手分成') - jieshao = models.TextField(null=True, blank=True, verbose_name='订单介绍') - beizhu = models.TextField(null=True, blank=True, verbose_name='订单备注') - # 新增字段:游戏昵称(前端提交的游戏昵称) - nicheng = models.CharField(max_length=50, null=True, blank=True, verbose_name='游戏昵称') - create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') - update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间') - class Meta: - db_table = 'tuikuanjilu' - indexes = [ - models.Index(fields=['chuliid']), - models.Index(fields=['sqzhuangtai']), - ] - - -class Ptliushui(QModel): - zonge = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, verbose_name='收取总金额') - zhichuzonge = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, verbose_name='支出总金额') - zongshouyi = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, verbose_name='总收益') - rizonge = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, verbose_name='日收取') - rizhichu = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, verbose_name='日支出') - rishouyi = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, verbose_name='日收益') - zongshoucishu = models.IntegerField(default=0, verbose_name='总收取次数') - rishoucishu = models.IntegerField(default=0, verbose_name='日收取次数') - zongzhichucishu = models.IntegerField(default=0, verbose_name='总支出次数') - rizhichucishu = models.IntegerField(default=0, verbose_name='日支出次数') class Meta: db_table = 'ptliushui' -class Liaotian(QModel): - """聊天关系表 - 极简设计,不设置唯一约束""" - # 主键 +class ChatSession(QModel): + """聊天会话表 + + 状态码:1=开启中, 0=已关闭 + """ + id = models.BigAutoField(primary_key=True, verbose_name='主键ID') - - # 聊天双方的用户标识(GoEasy的user_id) - user1_id = models.CharField(max_length=30, db_index=True, verbose_name='用户1标识') - user2_id = models.CharField(max_length=30, db_index=True, verbose_name='用户2标识') - - # 关联的订单(可以为空,但实际业务中应该关联) - dingdan_id = models.CharField(max_length=32, unique=True, verbose_name='订单ID') - # 状态与平台:用整数表示,具体含义由业务逻辑定义 - zhuangtai = models.IntegerField(default=1,db_index=True,choices=[(1, '开启中'), (0, '已关闭')],verbose_name='聊天状态') - # 时间戳 - create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') - update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间') + User1ID = models.CharField( + max_length=30, db_index=True, + db_column='user1_id', verbose_name='用户1标识', + ) + User2ID = models.CharField( + max_length=30, db_index=True, + db_column='user2_id', verbose_name='用户2标识', + ) + OrderID = models.CharField( + max_length=32, unique=True, + db_column='dingdan_id', verbose_name='订单ID', + ) + Status = models.IntegerField( + default=1, db_index=True, + choices=[(1, '开启中'), (0, '已关闭')], + db_column='zhuangtai', verbose_name='聊天状态', + ) + CreateTime = models.DateTimeField( + auto_now_add=True, + db_column='create_time', verbose_name='创建时间', + ) + UpdateTime = models.DateTimeField( + auto_now=True, + db_column='update_time', verbose_name='更新时间', + ) class Meta: db_table = 'liaotian' indexes = [ - models.Index(fields=['user1_id']), - models.Index(fields=['user2_id']), - models.Index(fields=['zhuangtai']), + models.Index(fields=['User1ID']), + models.Index(fields=['User2ID']), + models.Index(fields=['Status']), ] def __str__(self): - return f'{self.user1_id} ↔ {self.user2_id} ({self.zhuangtai})' + return f'{self.User1ID} <-> {self.User2ID} ({self.Status})' +# =========================================================================== +# 兼容别名(渐进迁移,全部迁移完成后可删除) +# =========================================================================== +Dingdan = Order +DingdanPingtai = PlatformOrderExt +DingdanShangjia = MerchantOrderExt +DingdanPeihu = EscortOrder +Fadan = Penalty +FadanShensuTupian = PenaltyAppealImage +FadanFenhong = PenaltyBonus +FadanFenhongLilv = PenaltyBonusRate +Dashoutupian = PlayerDeliveryImage +Pingfen = PlayerRating +Lilubiao = CommissionRate +Chufajilu = PenaltyRecord +Chufatupian = PenaltyEvidenceImage +Tuikuanjilu = RefundRecord +Ptliushui = PlatformCashFlow +Liaotian = ChatSession diff --git a/orders/notice_tasks.py b/orders/notice_tasks.py index 1f53379..bf57a2c 100644 --- a/orders/notice_tasks.py +++ b/orders/notice_tasks.py @@ -14,7 +14,7 @@ def dingdan_guangbo(self, order_info): 异步并发广播订单模板消息给所有关注服务号的用户 order_info 字典字段示例: { - 'dingdan_id': 'PT123456', + 'OrderID': 'PT123456', 'game_type': '王者荣耀', 'amount': '88.00', 'order_desc': '星耀上王者' @@ -22,7 +22,7 @@ def dingdan_guangbo(self, order_info): """ sender = WeixinBroadcastSender() template_data = sender.build_order_message_data(order_info) - order_id = order_info.get('dingdan_id') + order_id = order_info.get('OrderID') # 查询所有已关注用户 try: diff --git a/orders/signals.py b/orders/signals.py index 2534423..4c0134b 100644 --- a/orders/signals.py +++ b/orders/signals.py @@ -39,7 +39,7 @@ def ensure_redis_loaded(): # 预加载redis模块 ensure_redis_loaded() -@receiver(pre_save, sender='orders.Dingdan') +@receiver(pre_save, sender='orders.Order') def handle_order_status_8(sender, instance, **kwargs): """ 订单状态变为8时的信号处理。 @@ -49,15 +49,15 @@ def handle_order_status_8(sender, instance, **kwargs): if instance.pk is None: return try: - from orders.models import Dingdan - old = Dingdan.query.filter(pk=instance.pk).values_list('zhuangtai', flat=True).first() - if old != 8 and instance.zhuangtai == 8: - instance.status_8_time = timezone.now() + from orders.models import Order + old = Order.query.filter(pk=instance.pk).values_list('Status', flat=True).first() + if old != 8 and instance.Status == 8: + instance.SettlementTime = timezone.now() instance.pending_dispatch = False instance.auto_task_id = '' instance.auto_expire_at = None - elif old == 8 and instance.zhuangtai != 8: - instance.status_8_time = None + elif old == 8 and instance.Status != 8: + instance.SettlementTime = None instance.pending_dispatch = False instance.auto_task_id = '' except Exception as e: diff --git a/orders/tasks.py b/orders/tasks.py index 0327518..9f3f985 100644 --- a/orders/tasks.py +++ b/orders/tasks.py @@ -14,7 +14,7 @@ from decimal import Decimal import logging # 导入模型 - 确保路径正确 -from orders.models import Dingdan +from orders.models import Order from users.models import UserDashou, UserShangjia from gvsdsdk.models import User from utils.celery_utils import safe_decimal_operation, log_task_execution, rollback_on_failure @@ -40,25 +40,25 @@ def process_expired_order(self, dingdan_id): with transaction.atomic(): # 获取订单,同时锁定记录 - order = Dingdan.objects.select_for_update().get( - dingdan_id=dingdan_id + order = Order.objects.select_for_update().get( + OrderID=dingdan_id ) # 再次检查订单状态是否为8 - if order.zhuangtai != 8: - logger.info(f"订单{dingdan_id}状态已不是8(当前:{order.zhuangtai}),跳过处理") + if order.Status != 8: + logger.info(f"订单{dingdan_id}状态已不是8(当前:{order.Status}),跳过处理") return f"订单{dingdan_id}状态已变更,跳过处理" # 获取发单平台类型 - fadan_pingtai = order.fadan_pingtai + fadan_pingtai = order.Platform # 获取打手ID和分成金额 - dashou_id = order.jiedan_dashou_id - dashou_fencheng = safe_decimal_operation(order.dashou_fencheng) + dashou_id = order.PlayerID + dashou_fencheng = safe_decimal_operation(order.PlayerCommission) # 1. 更新订单状态为3(已完成) - order.zhuangtai = 3 - order.save(update_fields=['zhuangtai']) + order.Status = 3 + order.save(update_fields=['Status']) # 2. 更新打手信息(如果存在) updated_dashou = False @@ -121,7 +121,7 @@ def process_expired_order(self, dingdan_id): log_task_execution(f"自动结算订单 {dingdan_id}", True, result_msg) return result_msg - except Dingdan.DoesNotExist: + except Order.DoesNotExist: error_msg = f"订单{dingdan_id}不存在" logger.warning(error_msg) return error_msg @@ -155,10 +155,10 @@ def check_order_expire_task(): check_time = timezone.now() - timedelta(seconds=settings.ORDER_EXPIRE_SECONDS + 86400) # 48+24=72小时 # 查询状态为8且创建时间早于检查时间的订单 - expired_orders = Dingdan.query.filter( - zhuangtai=8, - create_time__lt=check_time - ).values_list('dingdan_id', flat=True) + expired_orders = Order.query.filter( + Status=8, + CreateTime__lt=check_time + ).values_list('OrderID', flat=True) expired_count = expired_orders.count() diff --git a/orders/utils.py b/orders/utils.py index bbf3f2f..bbb9bab 100644 --- a/orders/utils.py +++ b/orders/utils.py @@ -6,7 +6,7 @@ from django.db import transaction from django.db.models import F from config.models import DailyIncomeStat, DailyPayoutStat -from orders.models import Dingdan, DingdanPingtai, DingdanShangjia, Lilubiao +from orders.models import Order, PlatformOrderExt, MerchantOrderExt, CommissionRate from products.models import Gsfenhong from users.models import UserDashou, UserGuanshi @@ -16,17 +16,17 @@ logger = logging.getLogger(__name__) def get_order_user_id(order): - if order.fadan_pingtai == 1: + if order.Platform == 1: try: - ext = DingdanPingtai.objects.get(dingdan=order) - return ext.laoban_id - except DingdanPingtai.DoesNotExist: + ext = PlatformOrderExt.objects.get(Order=order) + return ext.BossID + except PlatformOrderExt.DoesNotExist: return None - elif order.fadan_pingtai == 2: + elif order.Platform == 2: try: - ext = DingdanShangjia.objects.get(dingdan=order) - return ext.shangjia_id - except DingdanShangjia.DoesNotExist: + ext = MerchantOrderExt.objects.get(Order=order) + return ext.MerchantID + except MerchantOrderExt.DoesNotExist: return None return None @@ -111,15 +111,15 @@ def calc_shangjia_order_fencheng(jine): """ jine = Decimal(str(jine)) try: - lilu_obj = Lilubiao.objects.get(fadanpingtai='3') - rate_dashou = Decimal(str(lilu_obj.lilu)) if lilu_obj.lilu and lilu_obj.lilu > 0 else Decimal('1') - except Lilubiao.DoesNotExist: + lilu_obj = CommissionRate.objects.get(Platform='3') + rate_dashou = Decimal(str(lilu_obj.Rate)) if lilu_obj.Rate and lilu_obj.Rate > 0 else Decimal('1') + except CommissionRate.DoesNotExist: rate_dashou = Decimal('1') - lilu_guanshi_obj = Lilubiao.objects.filter(fadanpingtai='13').first() + lilu_guanshi_obj = CommissionRate.objects.filter(Platform='13').first() rate_guanshi = ( - Decimal(str(lilu_guanshi_obj.lilu)) - if lilu_guanshi_obj and lilu_guanshi_obj.lilu is not None + Decimal(str(lilu_guanshi_obj.Rate)) + if lilu_guanshi_obj and lilu_guanshi_obj.Rate is not None else Decimal('0') ) @@ -139,15 +139,15 @@ def settle_shangjia_order_guanshi_fenhong(order, dashou_id): 商家订单结单时结算管事分红(幂等,失败不抛异常阻断主流程)。 """ - if getattr(order, 'fadan_pingtai', None) != 2: + if getattr(order, 'Platform', None) != 2: return - guanshi_fencheng = order.guanshi_fencheng or Decimal('0') + guanshi_fencheng = order.ManagerCommission or Decimal('0') if guanshi_fencheng <= 0: return - if Gsfenhong.objects.filter(dingdan_id=order.dingdan_id).exists(): - logger.info(f"商家订单管事分红已处理: {order.dingdan_id}") + if Gsfenhong.objects.filter(dingdan_id=order.OrderID).exists(): + logger.info(f"商家订单管事分红已处理: {order.OrderID}") return if not dashou_id: @@ -174,7 +174,7 @@ def settle_shangjia_order_guanshi_fenhong(order, dashou_id): user_main = dashou.user Gsfenhong.objects.create( - dingdan_id=order.dingdan_id, + dingdan_id=order.OrderID, guanshi=guanshi_id, dashouid=dashou_id, shuoming='商家订单分红', @@ -184,7 +184,7 @@ def settle_shangjia_order_guanshi_fenhong(order, dashou_id): fenhong_leixing=3, ) logger.info( - f"商家订单管事分红成功: 订单{order.dingdan_id}, 管事{guanshi_id}, " + f"商家订单管事分红成功: 订单{order.OrderID}, 管事{guanshi_id}, " f"打手{dashou_id}, 金额{guanshi_fencheng}元" ) except UserGuanshi.DoesNotExist: diff --git a/orders/views.py b/orders/views.py index 616e91c..e54de5e 100644 --- a/orders/views.py +++ b/orders/views.py @@ -55,11 +55,11 @@ from rank.utils import check_dashou_biaoqian_required from orders.notice_tasks import dingdan_guangbo from .models import ( - Dingdan, DingdanShangjia, DingdanPingtai, Dashoutupian, - Chufajilu, Chufatupian, Fadan, FadanFenhong + Order, MerchantOrderExt, PlatformOrderExt, PlayerDeliveryImage, + PenaltyRecord, PenaltyEvidenceImage, Penalty, PenaltyBonus ) from orders.models import ( - Lilubiao, Pingfen, Tuikuanjilu + CommissionRate, PlayerRating, RefundRecord ) from products.models import Shangpin, ShangpinLeixing, Huiyuangoumai from users.models import UserDashou, UserShangjia, UserBoss @@ -87,19 +87,19 @@ class PaymentFailView(APIView): with transaction.atomic(): # 锁定订单防止并发 - dingdan = Dingdan.objects.select_for_update().filter(dingdan_id=dingdanid).first() + dingdan = Dingdan.objects.select_for_update().filter(OrderID=dingdanid).first() if not dingdan: return Response({'code': 2, 'msg': '订单不存在', 'data': None}) - if dingdan.user1_id != f"Boss{request.user.yonghuid}": + if dingdan.User1ID != f"Boss{request.user.yonghuid}": return Response({'code': 3, 'msg': '无权操作此订单', 'data': None}) # 只允许删除未支付订单(状态9) - if dingdan.zhuangtai != 9: + if dingdan.Status != 9: return Response({'code': 3, 'msg': '只能删除未支付的订单', 'data': None}) # 删除扩展表和主表 - DingdanPingtai.query.filter(dingdan=dingdan).delete() + PlatformOrderExt.query.filter(Order=dingdan).delete() dingdan.delete() return Response({'code': 0, 'msg': '订单已删除', 'data': None}) @@ -189,7 +189,7 @@ class WechatPayNotifyView(APIView): # 锁定订单防止并发 try: - dingdan = Dingdan.objects.select_for_update().filter(dingdan_id=out_trade_no).first() + dingdan = Dingdan.objects.select_for_update().filter(OrderID=out_trade_no).first() except Exception as e: logger.error(f"查询订单异常: {e}") raise @@ -198,39 +198,39 @@ class WechatPayNotifyView(APIView): logger.error(f"订单不存在: {out_trade_no}") return - logger.info(f"订单当前状态: {dingdan.zhuangtai}") + logger.info(f"订单当前状态: {dingdan.Status}") # 幂等处理:只有状态为9(未支付)才处理,已处理则跳过 - if dingdan.zhuangtai != 9: - logger.info(f"订单 {out_trade_no} 已处理过,状态={dingdan.zhuangtai},跳过") + if dingdan.Status != 9: + logger.info(f"订单 {out_trade_no} 已处理过,状态={dingdan.Status},跳过") return # 保存微信交易号 if transaction_id: - dingdan.wechat_transaction_id = transaction_id + dingdan.WechatTransactionID = transaction_id logger.info(f"保存微信交易号: {transaction_id}") else: logger.warning("微信未返回transaction_id") # 更新订单状态 - if dingdan.zhiding_id and dingdan.zhiding_id.strip(): - dingdan.zhuangtai = 7 + if dingdan.AssignedID and dingdan.AssignedID.strip(): + dingdan.Status = 7 logger.info("指定单,状态设为7") else: - dingdan.zhuangtai = 1 + dingdan.Status = 1 logger.info("普通单,状态设为1") dingdan.save() - logger.info(f"订单状态已更新为 {dingdan.zhuangtai}") + logger.info(f"订单状态已更新为 {dingdan.Status}") # 删除同一用户同一商品的其他未支付订单(改为逻辑删除,状态25) try: - abandoned_count = Dingdan.query.filter( - user1_id=dingdan.user1_id, - shangpin_id=dingdan.shangpin_id, - zhuangtai=9 - ).exclude(dingdan_id=out_trade_no).update(zhuangtai=25) + abandoned_count = Order.query.filter( + User1ID=dingdan.User1ID, + ProductID=dingdan.ProductID, + Status=9 + ).exclude(OrderID=out_trade_no).update(Status=25) logger.info(f"将 {abandoned_count} 个未支付订单标记为已废弃(25)") except Exception as e: logger.error(f"标记其他未支付订单异常: {e}") @@ -239,12 +239,12 @@ class WechatPayNotifyView(APIView): try: laoban_id = None if hasattr(dingdan, 'pingtai_kuozhan'): - laoban_id = dingdan.pingtai_kuozhan.laoban_id + laoban_id = dingdan.pingtai_kuozhan.BossID if laoban_id: user_main = User.query.filter(UserUID=laoban_id).first() if user_main and hasattr(user_main, 'boss_profile'): boss = user_main.boss_profile - boss.zonge = (boss.zonge or 0) + (dingdan.jine or 0) + boss.zonge = (boss.zonge or 0) + (dingdan.Amount or 0) boss.alldingdan = (boss.alldingdan or 0) + 1 boss.save() logger.info(f"更新老板 {laoban_id} 数据成功") @@ -253,11 +253,11 @@ class WechatPayNotifyView(APIView): # 更新商品库存 try: - if dingdan.shangpin_id: - Shangpin.query.filter(id=dingdan.shangpin_id).update( + if dingdan.ProductID: + Shangpin.query.filter(id=dingdan.ProductID).update( kucun=F('kucun') - 1 ) - logger.info(f"商品 {dingdan.shangpin_id} 库存减1") + logger.info(f"商品 {dingdan.ProductID} 库存减1") except Exception as e: logger.error(f"更新商品库存异常: {e}") @@ -265,34 +265,34 @@ class WechatPayNotifyView(APIView): # ========== 新增:商品和店铺每日统计 ========== try: # 商品每日统计(只要有商品ID就执行) - if dingdan.shangpin_id: + if dingdan.ProductID: # 从扩展表获取已计算好的收益值(下单时已存储) pingtai_shouyi = Decimal('0.00') dianpu_shouyi = Decimal('0.00') if hasattr(dingdan, 'pingtai_kuozhan'): - pingtai_shouyi = dingdan.pingtai_kuozhan.pingtai_shouyi or Decimal('0.00') - dianpu_shouyi = dingdan.pingtai_kuozhan.dianpu_shouyi or Decimal('0.00') + pingtai_shouyi = dingdan.pingtai_kuozhan.PlatformIncome or Decimal('0.00') + dianpu_shouyi = dingdan.pingtai_kuozhan.ShopIncome or Decimal('0.00') update_shangpin_daily_stat( - shangpin_id=dingdan.shangpin_id, + ProductID=dingdan.ProductID, caozuo_leixing=1, # 1 = 下单 - dingdan_jiage=dingdan.jine, - pingtai_shouyi=pingtai_shouyi, + dingdan_jiage=dingdan.Amount, + PlatformIncome=pingtai_shouyi, dianpu_zongshouyi=dianpu_shouyi ) - logger.info(f"商品统计更新完成,商品ID: {dingdan.shangpin_id}") + logger.info(f"商品统计更新完成,商品ID: {dingdan.ProductID}") # 店铺每日统计(仅当存在店铺ID时执行) dianpu_id = None if hasattr(dingdan, 'pingtai_kuozhan'): - dianpu_id = dingdan.pingtai_kuozhan.dianpu_id + dianpu_id = dingdan.pingtai_kuozhan.ShopID if dianpu_id: - dianpu_shouyi = dingdan.pingtai_kuozhan.dianpu_shouyi or Decimal('0.00') + dianpu_shouyi = dingdan.pingtai_kuozhan.ShopIncome or Decimal('0.00') update_dianpu_daily_stat( - dianpu_id=dianpu_id, + ShopID=dianpu_id, caozuo_leixing=1, # 1 = 下单 - dingdan_jiage=dingdan.jine, - dianpu_shouyi=dianpu_shouyi + dingdan_jiage=dingdan.Amount, + ShopIncome=dianpu_shouyi ) logger.info(f"店铺统计更新完成,店铺ID: {dianpu_id}") except Exception as e: @@ -303,17 +303,17 @@ class WechatPayNotifyView(APIView): # 更新收支记录(总累计) - self._update_szjilu(dingdan.jine) + self._update_szjilu(dingdan.Amount) # 更新每日收入统计 - update_daily_income(dingdan.jine) + update_daily_income(dingdan.Amount) # 构建通知数据(你的 _get_game_type_name 方法保留在视图里直接用) order_info = { - 'dingdan_id': dingdan.dingdan_id, - 'game_type': self._get_game_type_name(dingdan.leixing_id), - 'amount': str(dingdan.jine), - 'order_desc': (dingdan.jieshao or '')[:50], + 'OrderID': dingdan.OrderID, + 'game_type': self._get_game_type_name(dingdan.ProductTypeID), + 'amount': str(dingdan.Amount), + 'order_desc': (dingdan.Description or '')[:50], } dingdan_guangbo.delay(order_info) # 瞬间返回,不阻塞请求 @@ -328,16 +328,16 @@ class WechatPayNotifyView(APIView): logger.info(f"进入 _handle_failure, out_trade_no={out_trade_no}") try: - dingdan = Dingdan.objects.select_for_update().filter(dingdan_id=out_trade_no).first() + dingdan = Dingdan.objects.select_for_update().filter(OrderID=out_trade_no).first() if not dingdan: logger.warning(f"订单不存在: {out_trade_no}") return - logger.info(f"订单当前状态: {dingdan.zhuangtai}") + logger.info(f"订单当前状态: {dingdan.Status}") # 仅当订单状态为9(未支付)时才标记失败,不直接删除 - if dingdan.zhuangtai == 9: - dingdan.zhuangtai = 14 # 自定义支付失败状态 + if dingdan.Status == 9: + dingdan.Status = 14 # 自定义支付失败状态 dingdan.save() logger.info(f"订单 {out_trade_no} 支付失败,标记为14") else: @@ -377,10 +377,10 @@ class WechatPayNotifyView(APIView): def task(): try: order_info = { - 'dingdan_id': dingdan.dingdan_id, - 'game_type': self._get_game_type_name(dingdan.leixing_id), - 'amount': str(dingdan.jine), - 'order_desc': (dingdan.jieshao or '')[:50], + 'OrderID': dingdan.OrderID, + 'game_type': self._get_game_type_name(dingdan.ProductTypeID), + 'amount': str(dingdan.Amount), + 'order_desc': (dingdan.Description or '')[:50], } logger.info(f"准备广播订单: {order_info}") sender = WeixinBroadcastSender() @@ -403,7 +403,7 @@ class WechatPayNotifyView(APIView): def _get_game_type_name(self, leixing_id): try: gt = ShangpinLeixing.query.filter(id=leixing_id).first() - return gt.jieshao if gt else '游戏订单' + return gt.Description if gt else '游戏订单' except Exception as e: logger.error(f"获取游戏类型名称异常: {e}") return '游戏订单' @@ -427,27 +427,27 @@ class PaymentVerifyView(APIView): return Response({'code': 1, 'msg': '订单ID不能为空'}) # ---------- 2. 查询订单 ---------- - dingdan = Dingdan.query.filter(dingdan_id=dingdanid).first() + dingdan = Order.query.filter(OrderID=dingdanid).first() if not dingdan: return Response({'code': 2, 'msg': '订单不存在'}) # ---------- 3. 验证订单归属(安全) ---------- current_user = request.user user_identifier = f"Boss{current_user.yonghuid}" - if dingdan.user1_id != user_identifier: + if dingdan.User1ID != user_identifier: logger.warning(f"用户 {current_user.yonghuid} 尝试复查他人订单 {dingdanid}") return Response({'code': 403, 'msg': '无权访问'}) # ---------- 4. 如果订单状态已是1/7,直接返回成功 ---------- - if dingdan.zhuangtai in [1, 7]: + if dingdan.Status in [1, 7]: return Response({ 'code': 0, 'msg': '订单状态正常', - 'data': {'dingdanid': dingdanid, 'zhuangtai': dingdan.zhuangtai} + 'data': {'dingdanid': dingdanid, 'Status': dingdan.Status} }) # ---------- 5. 如果状态为9,则主动查询微信支付状态 ---------- - if dingdan.zhuangtai == 9: + if dingdan.Status == 9: # 使用分布式锁防止并发处理同一订单 lock_key = f"payment_verify_lock_{dingdanid}" if not cache.add(lock_key, "locked", timeout=10): @@ -466,11 +466,11 @@ class PaymentVerifyView(APIView): return Response({ 'code': 0, 'msg': '支付成功', - 'data': {'dingdanid': dingdanid, 'zhuangtai': dingdan.zhuangtai} + 'data': {'dingdanid': dingdanid, 'Status': dingdan.Status} }) elif trade_state in ['NOTPAY', 'USERPAYING']: # 用户尚未支付或支付中 - return Response({'code': 1, 'msg': '支付中', 'data': {'zhuangtai': 9}}) + return Response({'code': 1, 'msg': '支付中', 'data': {'Status': 9}}) else: # 其他状态:CLOSED, REVOKED, PAYERROR 等,视为支付失败 return Response({'code': 2, 'msg': '支付失败'}) @@ -490,8 +490,8 @@ class PaymentVerifyView(APIView): 6: '退款失败', 8: '结算中', 0: '订单已作废', - }.get(dingdan.zhuangtai, '订单状态异常') - return Response({'code': 3, 'msg': status_msg, 'data': {'zhuangtai': dingdan.zhuangtai}}) + }.get(dingdan.Status, '订单状态异常') + return Response({'code': 3, 'msg': status_msg, 'data': {'Status': dingdan.Status}}) except Exception as e: logger.error(f"订单复查接口异常: {e}", exc_info=True) @@ -505,36 +505,36 @@ class PaymentVerifyView(APIView): with transaction.atomic(): # 重新锁定订单,防止并发更新 dingdan = Dingdan.objects.select_for_update().get(pk=dingdan.pk) - if dingdan.zhuangtai != 9: + if dingdan.Status != 9: # 订单状态已被其他进程更新,直接返回(幂等) return # 更新订单状态 - dingdan.zhuangtai = 7 if dingdan.zhiding_id and dingdan.zhiding_id.strip() else 1 - dingdan.wechat_transaction_id = transaction_id - dingdan.clkf = operator_id # 可选:记录操作人ID + dingdan.Status = 7 if dingdan.AssignedID and dingdan.AssignedID.strip() else 1 + dingdan.WechatTransactionID = transaction_id + dingdan.AssignedCS = operator_id # 可选:记录操作人ID dingdan.save() # 删除同一用户同一商品的其他未支付订单(逻辑删除,状态25) - Dingdan.query.filter( - user1_id=dingdan.user1_id, - shangpin_id=dingdan.shangpin_id, - zhuangtai=9 - ).exclude(dingdan_id=dingdan.dingdan_id).update(zhuangtai=25) + Order.query.filter( + User1ID=dingdan.User1ID, + ProductID=dingdan.ProductID, + Status=9 + ).exclude(OrderID=dingdan.OrderID).update(Status=25) # 更新老板扩展表 - laoban_id = dingdan.pingtai_kuozhan.laoban_id if hasattr(dingdan, 'pingtai_kuozhan') else None + laoban_id = dingdan.pingtai_kuozhan.BossID if hasattr(dingdan, 'pingtai_kuozhan') else None if laoban_id: user_main = User.query.filter(UserUID=laoban_id).first() if user_main and hasattr(user_main, 'boss_profile'): boss = user_main.boss_profile - boss.zonge = (boss.zonge or 0) + (dingdan.jine or 0) + boss.zonge = (boss.zonge or 0) + (dingdan.Amount or 0) boss.alldingdan = (boss.alldingdan or 0) + 1 boss.save() # 更新商品库存 - if dingdan.shangpin_id: - Shangpin.query.filter(id=dingdan.shangpin_id).update( + if dingdan.ProductID: + Shangpin.query.filter(id=dingdan.ProductID).update( kucun=F('kucun') - 1 ) @@ -542,34 +542,34 @@ class PaymentVerifyView(APIView): # ========== 新增:商品和店铺每日统计 ========== try: # 商品每日统计(只要有商品ID就执行) - if dingdan.shangpin_id: + if dingdan.ProductID: # 从扩展表获取已计算好的收益值(下单时已存储) pingtai_shouyi = Decimal('0.00') dianpu_shouyi = Decimal('0.00') if hasattr(dingdan, 'pingtai_kuozhan'): - pingtai_shouyi = dingdan.pingtai_kuozhan.pingtai_shouyi or Decimal('0.00') - dianpu_shouyi = dingdan.pingtai_kuozhan.dianpu_shouyi or Decimal('0.00') + pingtai_shouyi = dingdan.pingtai_kuozhan.PlatformIncome or Decimal('0.00') + dianpu_shouyi = dingdan.pingtai_kuozhan.ShopIncome or Decimal('0.00') update_shangpin_daily_stat( - shangpin_id=dingdan.shangpin_id, + ProductID=dingdan.ProductID, caozuo_leixing=1, # 1 = 下单 - dingdan_jiage=dingdan.jine, - pingtai_shouyi=pingtai_shouyi, + dingdan_jiage=dingdan.Amount, + PlatformIncome=pingtai_shouyi, dianpu_zongshouyi=dianpu_shouyi ) - logger.info(f"商品统计更新完成,商品ID: {dingdan.shangpin_id}") + logger.info(f"商品统计更新完成,商品ID: {dingdan.ProductID}") # 店铺每日统计(仅当存在店铺ID时执行) dianpu_id = None if hasattr(dingdan, 'pingtai_kuozhan'): - dianpu_id = dingdan.pingtai_kuozhan.dianpu_id + dianpu_id = dingdan.pingtai_kuozhan.ShopID if dianpu_id: - dianpu_shouyi = dingdan.pingtai_kuozhan.dianpu_shouyi or Decimal('0.00') + dianpu_shouyi = dingdan.pingtai_kuozhan.ShopIncome or Decimal('0.00') update_dianpu_daily_stat( - dianpu_id=dianpu_id, + ShopID=dianpu_id, caozuo_leixing=1, # 1 = 下单 - dingdan_jiage=dingdan.jine, - dianpu_shouyi=dianpu_shouyi + dingdan_jiage=dingdan.Amount, + ShopIncome=dianpu_shouyi ) logger.info(f"店铺统计更新完成,店铺ID: {dianpu_id}") except Exception as e: @@ -580,10 +580,10 @@ class PaymentVerifyView(APIView): # 更新收支记录 - self._update_szjilu(dingdan.jine) + self._update_szjilu(dingdan.Amount) # 更新每日收入统计 - update_daily_income(dingdan.jine) + update_daily_income(dingdan.Amount) def _query_wechat_payment(self, out_trade_no): """ @@ -672,7 +672,7 @@ class CreateOrderView(APIView): # 1. 获取前端传递的字段 shangpin_id = request.data.get('shangpin_id') nicheng = request.data.get('nicheng', '').strip() - beizhu = request.data.get('beizhu', '').strip() + beizhu = request.data.get('Remark', '').strip() zhiding = request.data.get('zhiding', '').strip() jine = request.data.get('jine', 0) @@ -713,7 +713,7 @@ class CreateOrderView(APIView): # 查询主表中是否存在该打手 zhiding_user = User.query.filter( UserUID=zhiding, - #user_type='dashou' + #user_type='PlayerID' ).first() if not zhiding_user: @@ -739,7 +739,7 @@ class CreateOrderView(APIView): # 6. 查询利率并计算分成 # 查询打手利率(字符'1') - dashou_lilu = Lilubiao.query.filter(fadanpingtai='1').first() + dashou_lilu = CommissionRate.query.filter(Platform='1').first() # 🔥 新增:判断是否使用商品配置的额外分成 @@ -748,17 +748,17 @@ class CreateOrderView(APIView): dashou_fencheng = shangpin.ewai_dashou_fencheng else: # 按原有逻辑计算打手分成 - dashou_fencheng = Decimal(str(shangpin_jiage)) * Decimal(str(dashou_lilu.lilu)) + dashou_fencheng = Decimal(str(shangpin_jiage)) * Decimal(str(dashou_lilu.Rate)) # 查询管事利率(字符'2') - #guanshi_lilu = Lilubiao.query.filter(fadanpingtai='2').first() + #guanshi_lilu = CommissionRate.query.filter(Platform='2').first() if not dashou_lilu: #or not guanshi_lilu: return Response({'code': 9, 'msg': '系统利率配置不完整', 'data': None}) # 计算打手分成 - #dashou_fencheng = Decimal(str(shangpin_jiage)) * Decimal(str(dashou_lilu.lilu)) + #dashou_fencheng = Decimal(str(shangpin_jiage)) * Decimal(str(dashou_lilu.Rate)) # 开始数据库事务 @@ -773,35 +773,35 @@ class CreateOrderView(APIView): # 创建订单主表数据 order_data = { - 'dingdan_id': dingdanid, - 'zhuangtai': 9, # 未付款状态 + 'OrderID': dingdanid, + 'Status': 9, # 未付款状态 'jine': shangpin_jiage, - 'fadan_pingtai':1, - 'dashou_fencheng': dashou_fencheng, - 'zhiding_id': zhiding_id_value, + 'Platform':1, + 'PlayerCommission': dashou_fencheng, + 'AssignedID': zhiding_id_value, 'shangpin_id': shangpin_id, - 'yaoqiuleixing': getattr(shangpin, 'yaoqiuleixing', None), - 'huiyuan_id': getattr(shangpin, 'huiyuan_id', ''), - 'yongjin': getattr(shangpin, 'yongjin', 0), - 'jieshao': getattr(shangpin, 'jieshao', ''), - 'beizhu': beizhu, + 'GrabRequirement': getattr(shangpin, 'GrabRequirement', None), + 'MembershipID': getattr(shangpin, 'MembershipID', ''), + 'CommissionReq': getattr(shangpin, 'CommissionReq', 0), + 'Description': getattr(shangpin, 'Description', ''), + 'Remark': beizhu, 'nicheng': nicheng, - 'tupian':shangpin_tupian, + 'ImageURL':shangpin_tupian, 'user1_id':f"Boss{request.user.yonghuid}", - 'leixing_id':shangpin.leixing_id + 'ProductTypeID':shangpin.ProductTypeID } # 创建订单记录 - dingdan = Dingdan.query.create(**order_data) + dingdan = Order.query.create(**order_data) # CreateOrderView.post 事务内部,替换原有的扩展表创建代码 dianpu_id, pingtai_shouyi, dianpu_shouyi, shangji_dianpu_id, shangji_fenhong = calculate_pingtai_and_dianpu_shouyi( - shangpin_id=shangpin_id, + ProductID=shangpin_id, dingdan_jiage=shangpin_jiage, - dashou_fencheng=dashou_fencheng + PlayerCommission=dashou_fencheng ) pingtaikuozhan_data = { @@ -818,14 +818,14 @@ class CreateOrderView(APIView): else: pingtaikuozhan_data['dianpu_shouyi'] = Decimal('0.00') - DingdanPingtai.query.create(**pingtaikuozhan_data) + PlatformOrderExt.query.create(**pingtaikuozhan_data) # 计算收益 '''dianpu_id, pingtai_shouyi, dianpu_shouyi = calculate_pingtai_and_dianpu_shouyi( - shangpin_id=shangpin_id, + ProductID=shangpin_id, dingdan_jiage=shangpin_jiage, - dashou_fencheng=dashou_fencheng + PlayerCommission=dashou_fencheng ) # 构建扩展表数据,平台收益必定保存,店铺收益和店铺ID仅当dianpu_id存在时才赋值 @@ -841,14 +841,14 @@ class CreateOrderView(APIView): # 无店铺时,店铺收益字段保持默认(0.00),也可显式设为0 pingtaikuozhan_data['dianpu_shouyi'] = Decimal('0.00') - DingdanPingtai.query.create(**pingtaikuozhan_data)''' + PlatformOrderExt.query.create(**pingtaikuozhan_data)''' # 7. 生成微信支付参数(向微信官方发送请求) pay_params = self.generate_wechat_pay_params( dingdanid=dingdanid, - jine=shangpin_jiage, - beizhu=getattr(settings, 'WEIXIN_PAY_DESCRIPTION'), + Amount=shangpin_jiage, + Remark=getattr(settings, 'WEIXIN_PAY_DESCRIPTION'), user_ip=self.get_client_ip(request), openid=user_openid ) @@ -1056,8 +1056,8 @@ class DingdanHuoquView(APIView): try: # 查询扩展表,获取用户的所有订单ID - pingtai_orders = DingdanPingtai.query.filter(laoban_id=yonghuid) - pingtai_order_ids = list(pingtai_orders.values_list('dingdan__dingdan_id', flat=True)) + pingtai_orders = PlatformOrderExt.query.filter(BossID=yonghuid) + pingtai_order_ids = list(pingtai_orders.values_list('Order__OrderID', flat=True)) if not pingtai_order_ids: return Response({ @@ -1073,10 +1073,10 @@ class DingdanHuoquView(APIView): # 查询主表 status_query = Q() if zhuangtai_list != [1, 2, 3, 4, 5, 6, 7, 8]: - status_query = Q(zhuangtai__in=zhuangtai_list) + status_query = Q(Status__in=zhuangtai_list) - query = Q(dingdan_id__in=pingtai_order_ids) & status_query - orders = Dingdan.query.filter(query).order_by('-create_time') + query = Q(OrderID__in=pingtai_order_ids) & status_query + orders = Order.query.filter(query).order_by('-create_time') #total_orders = orders.count() # 手动分页逻辑 @@ -1090,14 +1090,14 @@ class DingdanHuoquView(APIView): order_list = [] for order in current_page_orders: order_data = { - 'dingdanId': order.dingdan_id, - 'zhuangtai': order.zhuangtai, - 'jine': float(order.jine) if order.jine else 0.0, - 'tupian': order.tupian or '', - 'jieshao': order.jieshao or '', - 'beizhu': order.beizhu or '', - 'nicheng': order.nicheng or '', - 'chuangjianshijian': order.create_time.strftime('%Y-%m-%d %H:%M:%S') + 'dingdanId': order.OrderID, + 'Status': order.Status, + 'jine': float(order.Amount) if order.Amount else 0.0, + 'ImageURL': order.ImageURL or '', + 'Description': order.Description or '', + 'Remark': order.Remark or '', + 'nicheng': order.Nickname or '', + 'chuangjianshijian': order.CreateTime.strftime('%Y-%m-%d %H:%M:%S') } order_list.append(order_data) @@ -1165,16 +1165,16 @@ class DingdanXiangqingView(APIView): try: # 1. 验证订单是否属于当前用户 # 查询平台订单扩展表,检查laoban_id是否等于当前用户 - pingtai_kuozhan = DingdanPingtai.query.filter( - laoban_id=yonghuid, - dingdan__dingdan_id=dingdan_id + pingtai_kuozhan = PlatformOrderExt.query.filter( + BossID=yonghuid, + Order__OrderID=dingdan_id ).first() if not pingtai_kuozhan: # 如果不是平台订单,检查商家订单 - shangjia_kuozhan = DingdanShangjia.query.filter( - shangjia_id=yonghuid, - dingdan__dingdan_id=dingdan_id + shangjia_kuozhan = MerchantOrderExt.query.filter( + MerchantID=yonghuid, + Order__OrderID=dingdan_id ).first() if not shangjia_kuozhan: @@ -1185,7 +1185,7 @@ class DingdanXiangqingView(APIView): }) # 2. 查询订单主表 - dingdan = Dingdan.query.filter(dingdan_id=dingdan_id).first() + dingdan = Order.query.filter(OrderID=dingdan_id).first() if not dingdan: return Response({ @@ -1195,26 +1195,26 @@ class DingdanXiangqingView(APIView): }) # 3. 获取订单信息 - zhuangtai = dingdan.zhuangtai or 0 - zhiding_id = dingdan.zhiding_id or '' - jiedan_dashou_id = dingdan.jiedan_dashou_id or '' - dashou_liuyan = dingdan.dashou_liuyan or '' + zhuangtai = dingdan.Status or 0 + zhiding_id = dingdan.AssignedID or '' + jiedan_dashou_id = dingdan.PlayerID or '' + dashou_liuyan = dingdan.PlayerRemark or '' # 4. 查询打手交付图片 - dashoutupian_records = Dashoutupian.query.filter( - dingdan_id=dingdan_id - ).order_by('create_time')[:9] # 最多取9条 + dashoutupian_records = PlayerDeliveryImage.query.filter( + OrderID=dingdan_id + ).order_by('CreateTime')[:9] # 最多取9条 dashoujiaofu_list = [] for record in dashoutupian_records: - if record.tupian: - dashoujiaofu_list.append(record.tupian) + if record.ImageURL: + dashoujiaofu_list.append(record.ImageURL) # 5. 构建返回数据(字段名与前端对应) response_data = { - 'zhuangtai': zhuangtai, # 订单状态 + 'Status': zhuangtai, # 订单状态 'zhiding': zhiding_id, # 指定打手ID - 'dashou': jiedan_dashou_id, # 服务打手ID + 'PlayerID': jiedan_dashou_id, # 服务打手ID 'dashouliuyan': dashou_liuyan, # 打手留言 'dashoujiaofu': dashoujiaofu_list # 打手交付图片列表 } @@ -1284,10 +1284,10 @@ class JiedanView(APIView): try: with transaction.atomic(): # 1. 验证订单是否存在且属于当前用户 - pingtai_kuozhan = DingdanPingtai.query.filter( - laoban_id=yonghuid, - dingdan__dingdan_id=dingdan_id - ).select_related('dingdan').first() + pingtai_kuozhan = PlatformOrderExt.query.filter( + BossID=yonghuid, + Order__OrderID=dingdan_id + ).select_related('Order').first() if not pingtai_kuozhan: return Response({ @@ -1296,10 +1296,10 @@ class JiedanView(APIView): 'data': None }) - dingdan = pingtai_kuozhan.dingdan + dingdan = pingtai_kuozhan.Order # 2. 验证订单状态(必须是结算中 - 状态8) - if dingdan.zhuangtai != 8: + if dingdan.Status != 8: return Response({ 'code': 6, 'msg': '订单不在结算状态,无法结单', @@ -1307,32 +1307,32 @@ class JiedanView(APIView): }) # 3. 获取订单相关数据 - dashou_fencheng = dingdan.dashou_fencheng or Decimal('0.00') # 打手分成 - jiedan_dashou_id = dingdan.jiedan_dashou_id or '' # 接单打手ID - shangpin_id = dingdan.shangpin_id # 商品ID + dashou_fencheng = dingdan.PlayerCommission or Decimal('0.00') # 打手分成 + jiedan_dashou_id = dingdan.PlayerID or '' # 接单打手ID + shangpin_id = dingdan.ProductID # 商品ID # 4. 更新平台扩展表的老板评价(如果有留言) if liuyan: - pingtai_kuozhan.laoban_pingjia = liuyan + pingtai_kuozhan.BossReview = liuyan pingtai_kuozhan.save() # 5. 如果有评分,更新评分表 if pingfen > 0 and jiedan_dashou_id: # 使用filter查询,更健壮 - pingfen_records = Pingfen.query.filter(dashou=jiedan_dashou_id) + pingfen_records = PlayerRating.query.filter(PlayerID=jiedan_dashou_id) if pingfen_records.exists(): # 已有记录,更新 pingfen_record = pingfen_records.first() - pingfen_record.zongfen += Decimal(str(pingfen)) - pingfen_record.cishu += 1 + pingfen_record.TotalScore += Decimal(str(pingfen)) + pingfen_record.RatingCount += 1 pingfen_record.save() else: # 新记录,创建 - Pingfen.query.create( - dashou=jiedan_dashou_id, - zongfen=Decimal(str(pingfen)), - cishu=1 + PlayerRating.query.create( + PlayerID=jiedan_dashou_id, + TotalScore=Decimal(str(pingfen)), + RatingCount=1 ) # 6. 更新商品真实销量(如果有商品ID) @@ -1373,13 +1373,13 @@ class JiedanView(APIView): dashou_kuozhan.save() # 8. 更新订单状态为已完成(状态3) - dingdan.zhuangtai = 3 + dingdan.Status = 3 dingdan.save() # 🔥 新增:调用打手每日统计(成交) try: update_dashou_daily_by_action( - yonghuid=jiedan_dashou_id, + UserID=jiedan_dashou_id, amount=dashou_fencheng, action=2 # 2 表示成交(结算) ) @@ -1392,22 +1392,22 @@ class JiedanView(APIView): # ========== 新增:商品和店铺每日统计 ========== try: # 商品每日统计(只要有商品ID就执行) - if dingdan.shangpin_id: + if dingdan.ProductID: # 从扩展表获取已计算好的收益值(下单时已存储) pingtai_shouyi = Decimal('0.00') dianpu_shouyi = Decimal('0.00') if hasattr(dingdan, 'pingtai_kuozhan'): - pingtai_shouyi = dingdan.pingtai_kuozhan.pingtai_shouyi or Decimal('0.00') - dianpu_shouyi = dingdan.pingtai_kuozhan.dianpu_shouyi or Decimal('0.00') + pingtai_shouyi = dingdan.pingtai_kuozhan.PlatformIncome or Decimal('0.00') + dianpu_shouyi = dingdan.pingtai_kuozhan.ShopIncome or Decimal('0.00') update_shangpin_daily_stat( - shangpin_id=dingdan.shangpin_id, + ProductID=dingdan.ProductID, caozuo_leixing=2, # 2 = 结单 - dingdan_jiage=dingdan.jine, - pingtai_shouyi=pingtai_shouyi, + dingdan_jiage=dingdan.Amount, + PlatformIncome=pingtai_shouyi, dianpu_zongshouyi=dianpu_shouyi ) - logger.info(f"商品统计更新完成,商品ID: {dingdan.shangpin_id}") + logger.info(f"商品统计更新完成,商品ID: {dingdan.ProductID}") # 店铺每日统计(仅当存在店铺ID时执行) @@ -1418,32 +1418,32 @@ class JiedanView(APIView): shangji_id = None shangji_fen = Decimal('0.00') if hasattr(dingdan, 'pingtai_kuozhan'): - dianpu_id = dingdan.pingtai_kuozhan.dianpu_id - shangji_id = dingdan.pingtai_kuozhan.shangji_dianpu_id - shangji_fen = dingdan.pingtai_kuozhan.shangji_fenhong or Decimal('0.00') + dianpu_id = dingdan.pingtai_kuozhan.ShopID + shangji_id = dingdan.pingtai_kuozhan.ParentShopID + shangji_fen = dingdan.pingtai_kuozhan.ParentBonus or Decimal('0.00') if dianpu_id: - dianpu_shouyi = dingdan.pingtai_kuozhan.dianpu_shouyi or Decimal('0.00') + dianpu_shouyi = dingdan.pingtai_kuozhan.ShopIncome or Decimal('0.00') update_dianpu_daily_stat( - dianpu_id=dianpu_id, + ShopID=dianpu_id, caozuo_leixing=2, # 结算 - dingdan_jiage=dingdan.jine, - dianpu_shouyi=dianpu_shouyi, - shangji_dianpu_id=shangji_id, # 新增:上级店铺ID - shangji_fenhong=shangji_fen # 新增:该单给上级的分红 + dingdan_jiage=dingdan.Amount, + ShopIncome=dianpu_shouyi, + shangji_ShopID=shangji_id, # 新增:上级店铺ID + ParentBonus=shangji_fen # 新增:该单给上级的分红 ) logger.info(f"店铺统计更新完成,店铺ID: {dianpu_id}, 上级ID: {shangji_id}, 上级分红: {shangji_fen}") '''dianpu_id = None if hasattr(dingdan, 'pingtai_kuozhan'): - dianpu_id = dingdan.pingtai_kuozhan.dianpu_id + dianpu_id = dingdan.pingtai_kuozhan.ShopID if dianpu_id: - dianpu_shouyi = dingdan.pingtai_kuozhan.dianpu_shouyi or Decimal('0.00') + dianpu_shouyi = dingdan.pingtai_kuozhan.ShopIncome or Decimal('0.00') update_dianpu_daily_stat( - dianpu_id=dianpu_id, + ShopID=dianpu_id, caozuo_leixing=2, # 2 = 结单 - dingdan_jiage=dingdan.jine, - dianpu_shouyi=dianpu_shouyi + dingdan_jiage=dingdan.Amount, + ShopIncome=dianpu_shouyi ) logger.info(f"店铺统计更新完成,店铺ID: {dianpu_id}")''' except Exception as e: @@ -1485,25 +1485,25 @@ class DingdanXiangqingView2(APIView): try: # 权限验证 - pingtai_ext = DingdanPingtai.query.filter( - laoban_id=yonghuid, - dingdan__dingdan_id=dingdan_id - ).select_related('dingdan').first() + pingtai_ext = PlatformOrderExt.query.filter( + BossID=yonghuid, + Order__OrderID=dingdan_id + ).select_related('Order').first() if not pingtai_ext: return Response({'code': 3, 'msg': '订单不存在或无权限查看', 'data': None}) - order = pingtai_ext.dingdan - zhuangtai = order.zhuangtai or 0 - jiedan_dashou_id = order.jiedan_dashou_id or '' - dashou_liuyan = order.dashou_liuyan or '' - update_time = order.update_time.strftime('%Y-%m-%d %H:%M:%S') if order.update_time else '' + order = pingtai_ext.Order + zhuangtai = order.Status or 0 + jiedan_dashou_id = order.PlayerID or '' + dashou_liuyan = order.PlayerRemark or '' + update_time = order.UpdateTime.strftime('%Y-%m-%d %H:%M:%S') if order.UpdateTime else '' # 交付图片 dashoujiaofu_list = list( - Dashoutupian.query.filter(dingdan_id=dingdan_id) - .order_by('create_time')[:9] - .values_list('tupian', flat=True) + PlayerDeliveryImage.query.filter(OrderID=dingdan_id) + .order_by('CreateTime')[:9] + .values_list('ImageURL', flat=True) ) # 打手信息 @@ -1520,7 +1520,7 @@ class DingdanXiangqingView2(APIView): except UserDashou.DoesNotExist: pass biaoxian = DashouBiaoxian.query.filter( - dingdan_id=dingdan_id, + OrderID=dingdan_id, dashou_id=jiedan_dashou_id ).first() if biaoxian: @@ -1530,13 +1530,13 @@ class DingdanXiangqingView2(APIView): tijiao_time = biaoxian.tijiao_time.strftime('%Y-%m-%d %H:%M:%S') # 老板自己的评价(如果已经结算过,可能已有评价) - laoban_pingjia = pingtai_ext.laoban_pingjia or '' + laoban_pingjia = pingtai_ext.BossReview or '' shangxian_sudu = None fuwu_taidu = None fanche_cishu = None if jiedan_dashou_id and zhuangtai in [3, 4, 5, 6]: # 已完成或退款相关状态才可能有评价 biaoxian = DashouBiaoxian.query.filter( - dingdan_id=dingdan_id, + OrderID=dingdan_id, dashou_id=jiedan_dashou_id ).first() if biaoxian: @@ -1545,13 +1545,13 @@ class DingdanXiangqingView2(APIView): fanche_cishu = biaoxian.fanche_cishu data = { - 'zhuangtai': zhuangtai, - 'dashou': jiedan_dashou_id, + 'Status': zhuangtai, + 'PlayerID': jiedan_dashou_id, 'dashou_nicheng': dashou_nicheng, 'dashou_touxiang': dashou_touxiang, 'dashouliuyan': dashou_liuyan, 'dashoujiaofu': dashoujiaofu_list, - 'update_time': update_time, + 'UpdateTime': update_time, 'jiedan_time': jiedan_time, 'tijiao_time': tijiao_time, 'laoban_pingjia': laoban_pingjia, @@ -1611,43 +1611,43 @@ class JiedanView2(APIView): try: with transaction.atomic(): # 3. 权限验证:订单属于当前老板 - pingtai_ext = DingdanPingtai.query.filter( - laoban_id=yonghuid, - dingdan__dingdan_id=dingdan_id - ).select_related('dingdan').first() + pingtai_ext = PlatformOrderExt.query.filter( + BossID=yonghuid, + Order__OrderID=dingdan_id + ).select_related('Order').first() if not pingtai_ext: return Response({'code': 7, 'msg': '订单不存在或无权限操作', 'data': None}) - order = pingtai_ext.dingdan + order = pingtai_ext.Order # 4. 状态校验:必须是结算中(状态8) - if order.zhuangtai != 8: + if order.Status != 8: return Response({'code': 8, 'msg': '订单不在结算状态', 'data': None}) # 5. 提取订单关键数据 - dashou_fencheng = order.dashou_fencheng or Decimal('0.00') - jiedan_dashou_id = order.jiedan_dashou_id or '' - shangpin_id = order.shangpin_id + dashou_fencheng = order.PlayerCommission or Decimal('0.00') + jiedan_dashou_id = order.PlayerID or '' + shangpin_id = order.ProductID # 6. 保存老板评价(兼容旧逻辑) if liuyan: - pingtai_ext.laoban_pingjia = liuyan + pingtai_ext.BossReview = liuyan pingtai_ext.save() # 7. 更新评分表(用服务态度分作为综合评分,保留原有统计) if jiedan_dashou_id and fuwu_taidu: - pingfen_records = Pingfen.query.filter(dashou=jiedan_dashou_id) + pingfen_records = PlayerRating.query.filter(PlayerID=jiedan_dashou_id) if pingfen_records.exists(): pf = pingfen_records.first() - pf.zongfen += Decimal(str(fuwu_taidu)) - pf.cishu += 1 + pf.TotalScore += Decimal(str(fuwu_taidu)) + pf.RatingCount += 1 pf.save() else: - Pingfen.query.create( - dashou=jiedan_dashou_id, - zongfen=Decimal(str(fuwu_taidu)), - cishu=1 + PlayerRating.query.create( + PlayerID=jiedan_dashou_id, + TotalScore=Decimal(str(fuwu_taidu)), + RatingCount=1 ) # 8. 更新商品真实销量 @@ -1676,13 +1676,13 @@ class JiedanView2(APIView): pass # 10. 更新订单状态为已完成 - order.zhuangtai = 3 + order.Status = 3 order.save() # 11. 打手每日统计(成交) try: update_dashou_daily_by_action( - yonghuid=jiedan_dashou_id, + UserID=jiedan_dashou_id, amount=dashou_fencheng, action=2 # 2=结算/成交 ) @@ -1696,30 +1696,30 @@ class JiedanView2(APIView): pingtai_shouyi = Decimal('0.00') dianpu_shouyi = Decimal('0.00') if hasattr(order, 'pingtai_kuozhan'): - pingtai_shouyi = order.pingtai_kuozhan.pingtai_shouyi or Decimal('0.00') - dianpu_shouyi = order.pingtai_kuozhan.dianpu_shouyi or Decimal('0.00') + pingtai_shouyi = order.pingtai_kuozhan.PlatformIncome or Decimal('0.00') + dianpu_shouyi = order.pingtai_kuozhan.ShopIncome or Decimal('0.00') update_shangpin_daily_stat( - shangpin_id=shangpin_id, + ProductID=shangpin_id, caozuo_leixing=2, - dingdan_jiage=order.jine, - pingtai_shouyi=pingtai_shouyi, + dingdan_jiage=order.Amount, + PlatformIncome=pingtai_shouyi, dianpu_zongshouyi=dianpu_shouyi ) # 店铺统计(含上级分红) if hasattr(order, 'pingtai_kuozhan'): - dianpu_id = order.pingtai_kuozhan.dianpu_id - shangji_id = order.pingtai_kuozhan.shangji_dianpu_id - shangji_fen = order.pingtai_kuozhan.shangji_fenhong or Decimal('0.00') + dianpu_id = order.pingtai_kuozhan.ShopID + shangji_id = order.pingtai_kuozhan.ParentShopID + shangji_fen = order.pingtai_kuozhan.ParentBonus or Decimal('0.00') if dianpu_id: update_dianpu_daily_stat( - dianpu_id=dianpu_id, + ShopID=dianpu_id, caozuo_leixing=2, - dingdan_jiage=order.jine, - dianpu_shouyi=dianpu_shouyi, - shangji_dianpu_id=shangji_id, - shangji_fenhong=shangji_fen + dingdan_jiage=order.Amount, + ShopIncome=dianpu_shouyi, + shangji_ShopID=shangji_id, + ParentBonus=shangji_fen ) except Exception as e: logger.error(f"商品/店铺统计失败: {e}") @@ -1727,10 +1727,10 @@ class JiedanView2(APIView): # 14. 🆕 写入打手表现表(结算评价) if jiedan_dashou_id: record_dashou_biaoxian( - dingdan_id=dingdan_id, + OrderID=dingdan_id, dashou_id=jiedan_dashou_id, xingwei=3, # 3=结算 - fanche_cishu=fanche_cishu, + fanche_RatingCount=fanche_cishu, shangxian_sudu=shangxian_sudu, fuwu_taidu=fuwu_taidu # bankuai 暂不传入,后续可从订单商品关联 @@ -1758,8 +1758,8 @@ class ShangpinLeixingView(APIView): try: # 1. 查询审核通过且抢单要求类型为1的商品类型,按排序权重升序 shangpin_queryset = ShangpinLeixing.query.filter( - yaoqiuleixing=1, - shenhezhuangtai=1 + GrabRequirement=1, + shenheStatus=1 ).select_related('bankuai').order_by('paixu') # 2. 收集所有涉及到的板块ID @@ -1787,9 +1787,9 @@ class ShangpinLeixingView(APIView): for sp in shangpin_queryset: item = { 'id': sp.id, - 'yaoqiuleixing': sp.yaoqiuleixing, - 'huiyuan_id': sp.huiyuan_id, - 'jieshao': sp.jieshao, + 'GrabRequirement': sp.GrabRequirement, + 'MembershipID': sp.MembershipID, + 'Description': sp.Description, # 当前类型所属板块的称号列表(无板块则为空数组) 'chenghaoList': bankuai_chenghao_map.get(sp.bankuai_id, []) } @@ -1819,7 +1819,7 @@ class ShangjiaPaifaView(APIView): # ----- 1. 获取原始参数(保持原类型)----- shangpin_type_id = data.get('shangpinTypeId') huiyuan_id = data.get('huiyuanId') - yaoqiuleixing = data.get('yaoqiuleixing') + yaoqiuleixing = data.get('GrabRequirement') dingdan_jieshao_raw = data.get('dingdanJieshao', '') dingdan_beizhu_raw = data.get('dingdanBeizhu', '') laoban_name_raw = data.get('laobanName', '') @@ -1870,15 +1870,15 @@ class ShangjiaPaifaView(APIView): final_huiyuan_id = '' logger.info(f"押金模式: 佣金={cv}") else: - final_yaoqiu_type = shangpin_type.yaoqiuleixing or 1 + final_yaoqiu_type = shangpin_type.GrabRequirement or 1 final_huiyuan_id = str(huiyuan_id) if huiyuan_id else '' logger.warning("佣金为0,降级为会员模式") except ValueError: - final_yaoqiu_type = shangpin_type.yaoqiuleixing or 1 + final_yaoqiu_type = shangpin_type.GrabRequirement or 1 final_huiyuan_id = str(huiyuan_id) if huiyuan_id else '' logger.warning("佣金格式错误,降级为会员模式") else: - final_yaoqiu_type = shangpin_type.yaoqiuleixing or 1 + final_yaoqiu_type = shangpin_type.GrabRequirement or 1 final_huiyuan_id = str(huiyuan_id) if huiyuan_id else '' logger.info(f"会员模式: 类型={final_yaoqiu_type}") @@ -1939,31 +1939,31 @@ class ShangjiaPaifaView(APIView): dingdan = None try: with transaction.atomic(): - dingdan = Dingdan.query.create( - dingdan_id=generate_dingdan_id(), - zhuangtai=7 if zhiding_dashou else 1, - fadan_pingtai=2, - jine=jiage, - dashou_fencheng=dashou_fencheng, - guanshi_fencheng=guanshi_fencheng, - zhiding_id=zhiding_uid if zhiding_dashou else '', - shangpin_id=0, - leixing_id=int(shangpin_type_id), - yaoqiuleixing=final_yaoqiu_type, - yongjin=final_yongjin, - huiyuan_id=final_huiyuan_id, - jieshao=dingdan_jieshao[:2000], - beizhu=dingdan_beizhu[:1000], - nicheng=laoban_name[:50], - tupian=request.user.avatar, - user1_id=f"Sj{request.user.yonghuid}" + dingdan = Order.query.create( + OrderID=generate_dingdan_id(), + Status=7 if zhiding_dashou else 1, + Platform=2, + Amount=jiage, + PlayerCommission=dashou_fencheng, + ManagerCommission=guanshi_fencheng, + AssignedID=zhiding_uid if zhiding_dashou else '', + ProductID=0, + ProductTypeID=int(shangpin_type_id), + GrabRequirement=final_yaoqiu_type, + CommissionReq=final_yongjin, + MembershipID=final_huiyuan_id, + Description=dingdan_jieshao[:2000], + Remark=dingdan_beizhu[:1000], + Nickname=laoban_name[:50], + ImageURL=request.user.avatar, + User1ID=f"Sj{request.user.yonghuid}" ) - logger.info(f"订单主表创建: {dingdan.dingdan_id}") + logger.info(f"订单主表创建: {dingdan.OrderID}") - DingdanShangjia.query.create( - dingdan=dingdan, - shangjia_id=request.user.yonghuid, - sjnicheng=shangjia.nicheng, + MerchantOrderExt.query.create( + Order=dingdan, + MerchantID=request.user.yonghuid, + MerchantNickname=shangjia.nicheng, ) if chenghao_obj: @@ -1981,7 +1981,7 @@ class ShangjiaPaifaView(APIView): ) update_shangjia_daily( - yonghuid=request.user.yonghuid, + UserID=request.user.yonghuid, amount=Decimal(str(jiage)), action=1 ) @@ -1994,18 +1994,18 @@ class ShangjiaPaifaView(APIView): # Celery 广播任务(异步) try: order_info = { - 'dingdan_id': dingdan.dingdan_id, - 'game_type': self._get_game_type_name(dingdan.leixing_id), - 'amount': str(dingdan.jine), - 'order_desc': (dingdan.jieshao or '')[:50], + 'OrderID': dingdan.OrderID, + 'game_type': self._get_game_type_name(dingdan.ProductTypeID), + 'amount': str(dingdan.Amount), + 'order_desc': (dingdan.Description or '')[:50], } dingdan_guangbo.delay(order_info) - logger.info(f"已提交广播任务: {dingdan.dingdan_id}") + logger.info(f"已提交广播任务: {dingdan.OrderID}") except Exception as e: logger.error(f"广播任务提交失败: {e}", exc_info=True) - logger.info(f"商家派单成功: {dingdan.dingdan_id}, 金额={jiage}") - return Response({'code': 200, 'msg': '派单成功', 'data': {'jine': str(dingdan.jine)}}) + logger.info(f"商家派单成功: {dingdan.OrderID}, 金额={jiage}") + return Response({'code': 200, 'msg': '派单成功', 'data': {'jine': str(dingdan.Amount)}}) except Exception as e: logger.error(f"商家派单接口未捕获异常: {str(e)}", exc_info=True) @@ -2014,7 +2014,7 @@ class ShangjiaPaifaView(APIView): def _get_game_type_name(self, leixing_id): try: gt = ShangpinLeixing.query.filter(id=leixing_id).first() - return gt.jieshao if gt else '游戏订单' + return gt.Description if gt else '游戏订单' except Exception: return '游戏订单' @@ -2050,7 +2050,7 @@ class ShangjiaDingdanHuoquView(APIView): page_size = min(100, max(1, int(data.get('page_size', 10)))) # 🆕 商品类型筛选 - leixing_id = data.get('leixing_id', None) + leixing_id = data.get('ProductTypeID', None) # 🆕 模糊搜索关键字(支持订单ID、订单介绍、游戏昵称、打手ID) keyword = data.get('keyword', '').strip() @@ -2071,18 +2071,18 @@ class ShangjiaDingdanHuoquView(APIView): try: # 4. 构建基础查询(该商家的所有订单) - base_qs = DingdanShangjia.query.filter( - shangjia_id=yonghuid - ).select_related('dingdan') + base_qs = MerchantOrderExt.query.filter( + MerchantID=yonghuid + ).select_related('Order') # 5. 状态过滤 - base_qs = base_qs.filter(dingdan__zhuangtai__in=zhuangtai_list) + base_qs = base_qs.filter(Order__Status__in=zhuangtai_list) # 6. 商品类型筛选 if leixing_id is not None: try: leixing_id_int = int(leixing_id) - base_qs = base_qs.filter(dingdan__leixing_id=leixing_id_int) + base_qs = base_qs.filter(Order__ProductTypeID=leixing_id_int) except (ValueError, TypeError): # 如果leixing_id不是有效整数,忽略该筛选 pass @@ -2090,45 +2090,45 @@ class ShangjiaDingdanHuoquView(APIView): # 7. 模糊搜索(支持订单ID、订单介绍、游戏昵称、打手ID) if keyword: # 订单ID精确匹配(dingdan_id有唯一索引,先用精确匹配) - dingdan_id_match = Q(dingdan__dingdan_id__exact=keyword) + dingdan_id_match = Q(Order__OrderID__exact=keyword) # 订单介绍模糊匹配 - jieshao_match = Q(dingdan__jieshao__icontains=keyword) + jieshao_match = Q(Order__Description__icontains=keyword) # 游戏昵称模糊匹配 - nicheng_match = Q(dingdan__nicheng__icontains=keyword) + nicheng_match = Q(Order__Nickname__icontains=keyword) # 打手ID精确匹配 - dashou_match = Q(dingdan__jiedan_dashou_id__exact=keyword) + dashou_match = Q(Order__PlayerID__exact=keyword) base_qs = base_qs.filter( dingdan_id_match | jieshao_match | nicheng_match | dashou_match ) # 8. 计算待结算订单数量(状态为8) - pending_count = DingdanShangjia.query.filter( - shangjia_id=yonghuid, - dingdan__zhuangtai=8 + pending_count = MerchantOrderExt.query.filter( + MerchantID=yonghuid, + Order__Status=8 ).count() # 9. 排序、分页 total_count = base_qs.count() start_index = (page - 1) * page_size end_index = start_index + page_size - current_page_orders = base_qs.order_by('-dingdan__create_time')[start_index:end_index] + current_page_orders = base_qs.order_by('-Order__CreateTime')[start_index:end_index] # 10. 构建返回数据 order_list = [] for shangjia_order in current_page_orders: order = shangjia_order.dingdan order_data = { - 'dingdan_id': order.dingdan_id, - 'zhuangtai': order.zhuangtai, - 'jine': float(order.jine) if order.jine else 0.0, - 'jieshao': order.jieshao or '', - 'beizhu': order.beizhu or '', - 'nicheng': order.nicheng or '', - 'leixing_id': order.leixing_id, # 🆕 返回商品类型ID - 'tupian': order.tupian or '', # 🆕 返回商品图片 - 'jiedan_dashou_id': order.jiedan_dashou_id or '', # 🆕 返回打手ID - 'create_time': order.create_time.strftime('%Y-%m-%d %H:%M:%S') if order.create_time else '' + 'OrderID': order.OrderID, + 'Status': order.Status, + 'jine': float(order.Amount) if order.Amount else 0.0, + 'Description': order.Description or '', + 'Remark': order.Remark or '', + 'nicheng': order.Nickname or '', + 'ProductTypeID': order.ProductTypeID, # 🆕 返回商品类型ID + 'ImageURL': order.ImageURL or '', # 🆕 返回商品图片 + 'jiedan_dashou_id': order.PlayerID or '', # 🆕 返回打手ID + 'CreateTime': order.CreateTime.strftime('%Y-%m-%d %H:%M:%S') if order.CreateTime else '' } order_list.append(order_data) @@ -2180,7 +2180,7 @@ class ShangjiaDingdanXiangqingView(APIView): # 2. 获取前端参数 try: data = request.data - dingdan_id = data.get('dingdan_id', '').strip() + dingdan_id = data.get('OrderID', '').strip() except Exception: return Response({ 'code': 2, @@ -2197,10 +2197,10 @@ class ShangjiaDingdanXiangqingView(APIView): try: # 3. 查询商家订单扩展表,验证权限并获取基础订单数据 - shangjia_kuozhan = DingdanShangjia.query.filter( - shangjia_id=yonghuid, - dingdan__dingdan_id=dingdan_id - ).select_related('dingdan').first() + shangjia_kuozhan = MerchantOrderExt.query.filter( + MerchantID=yonghuid, + Order__OrderID=dingdan_id + ).select_related('Order').first() if not shangjia_kuozhan: return Response({ @@ -2209,16 +2209,16 @@ class ShangjiaDingdanXiangqingView(APIView): 'data': None }, status=status.HTTP_403_FORBIDDEN) - order = shangjia_kuozhan.dingdan + order = shangjia_kuozhan.Order # 4. 交付图片列表 - dashou_tupian_list = Dashoutupian.query.filter( - dingdan_id=dingdan_id - ).order_by('create_time').values_list('tupian', flat=True) + dashou_tupian_list = PlayerDeliveryImage.query.filter( + OrderID=dingdan_id + ).order_by('CreateTime').values_list('ImageURL', flat=True) dashou_jiaofu = list(dashou_tupian_list) # 5. 打手详细信息(头像、昵称、用户ID) - dashou_yonghuid = order.jiedan_dashou_id or '' + dashou_yonghuid = order.PlayerID or '' dashou_nicheng = '' dashou_avatar = '' if dashou_yonghuid: @@ -2231,35 +2231,35 @@ class ShangjiaDingdanXiangqingView(APIView): dashou_nicheng = dashou_user.dashou_profile.nicheng or '' # 6. 罚款数据(如果存在) - fadan_obj = Fadan.query.filter( - guanliandingdan_id=dingdan_id, - beichufa_id=dashou_yonghuid + fadan_obj = Penalty.query.filter( + RelatedOrderID=dingdan_id, + PenalizedUserID=dashou_yonghuid ).first() fadan_dict = None if fadan_obj: fadan_dict = { 'id': fadan_obj.id, - 'chufaliyou': fadan_obj.chufaliyou or '', - 'fakuanjine': float(fadan_obj.fakuanjine) if fadan_obj.fakuanjine else 0.0, - 'yingxiang_qiangdan': fadan_obj.yingxiang_qiangdan, - 'zhuangtai': fadan_obj.zhuangtai, - 'shensuliyou': fadan_obj.shensuliyou or '', - 'tongyi_chufaliyou': fadan_obj.tongyi_chufaliyou or '', - 'bohuiliyou': fadan_obj.bohuiliyou or '', - 'create_time': fadan_obj.create_time.strftime('%Y-%m-%d %H:%M:%S') if fadan_obj.create_time else '', - 'update_time': fadan_obj.update_time.strftime('%Y-%m-%d %H:%M:%S') if fadan_obj.update_time else '', + 'chufaliyou': fadan_obj.Reason or '', + 'fakuanjine': float(fadan_obj.FineAmount) if fadan_obj.FineAmount else 0.0, + 'yingxiang_qiangdan': fadan_obj.AffectsGrabbing, + 'Status': fadan_obj.Status, + 'shensuliyou': fadan_obj.AppealReason or '', + 'tongyi_chufaliyou': fadan_obj.ApproveReason or '', + 'bohuiliyou': fadan_obj.RejectReason or '', + 'CreateTime': fadan_obj.create_time.strftime('%Y-%m-%d %H:%M:%S') if fadan_obj.create_time else '', + 'UpdateTime': fadan_obj.update_time.strftime('%Y-%m-%d %H:%M:%S') if fadan_obj.update_time else '', } # 7. 商家自己的分红利率(用于罚款分红计算) fenhong_lilv = 0.0 try: # 查找商家作为分红者的最新记录,取应得利率 - last_fenhong = FadanFenhong.query.filter( + last_fenhong = PenaltyBonus.query.filter( fenhongzhe_id=yonghuid, shenfen=1 # 1=商家 ).order_by('-create_time').first() if last_fenhong: - fenhong_lilv = float(last_fenhong.yingde_lilv or 0) + fenhong_lilv = float(last_fenhong.IndividualRate or 0) except Exception as e: logger.warning(f'获取分红利率失败: {e}') @@ -2267,25 +2267,25 @@ class ShangjiaDingdanXiangqingView(APIView): xin_dingdan_id = '' try: # 查找以当前订单作为“上一个订单ID”的新订单扩展记录 - new_shangjia_order = DingdanShangjia.query.filter( - shangyige_dingdan_id=dingdan_id, - shangjia_id=yonghuid - ).select_related('dingdan').first() + new_shangjia_order = MerchantOrderExt.query.filter( + PrevOrderID=dingdan_id, + MerchantID=yonghuid + ).select_related('Order').first() if new_shangjia_order: - xin_dingdan_id = new_shangjia_order.dingdan.dingdan_id + xin_dingdan_id = new_shangjia_order.dingdan.OrderID except Exception as e: logger.warning(f'查找新订单ID失败: {e}') # 9. 构建返回数据 response_data = { # 基础订单字段 - 'dingdan_id': order.dingdan_id, - 'zhuangtai': order.zhuangtai or 0, - 'jine': float(order.jine) if order.jine else 0.0, - 'jieshao': order.jieshao or '', - 'beizhu': order.beizhu or '', - 'nicheng': order.nicheng or '', - 'create_time': order.create_time.strftime('%Y-%m-%d %H:%M:%S') if order.create_time else '', + 'OrderID': order.OrderID, + 'Status': order.Status or 0, + 'jine': float(order.Amount) if order.Amount else 0.0, + 'Description': order.Description or '', + 'Remark': order.Remark or '', + 'nicheng': order.Nickname or '', + 'CreateTime': order.CreateTime.strftime('%Y-%m-%d %H:%M:%S') if order.CreateTime else '', # 打手信息 'dashou_yonghuid': dashou_yonghuid, @@ -2294,15 +2294,15 @@ class ShangjiaDingdanXiangqingView(APIView): # 服务详情 'fuwudashou_id': dashou_yonghuid, # 保留旧字段兼容 - 'dashou_liuyan': order.dashou_liuyan or '', + 'PlayerRemark': order.PlayerRemark or '', 'dashou_jiaofu': dashou_jiaofu, # 商家扩展字段(旧) - 'shangjia_liuyan': shangjia_kuozhan.shangjia_pingjia or '', - 'tkliyou': order.tkly or '', - 'cfliyou': shangjia_kuozhan.cfliyou or '', # 保留,但不影响新罚款 - 'sqzhuangtai': shangjia_kuozhan.sqzhuangtai or 0, - 'bhliyou': shangjia_kuozhan.bhliyou or '', + 'shangjia_liuyan': shangjia_kuozhan.MerchantReview or '', + 'tkliyou': order.RefundReason or '', + 'cfliyou': shangjia_kuozhan.PenaltyReason or '', # 保留,但不影响新罚款 + 'sqzhuangtai': shangjia_kuozhan.PenaltyApplyStatus or 0, + 'bhliyou': shangjia_kuozhan.RejectReason or '', 'chufa_jieguo': '', # 已弃用 # 新增:罚款数据 @@ -2360,7 +2360,7 @@ class ShangjiaJiesuanView(APIView): # 2. 获取前端参数 try: data = request.data - dingdan_id = data.get('dingdan_id', '').strip() + dingdan_id = data.get('OrderID', '').strip() pingfen = int(data.get('pingfen', 0)) liuyan = data.get('liuyan', '').strip() except (ValueError, TypeError): @@ -2388,12 +2388,12 @@ class ShangjiaJiesuanView(APIView): try: with transaction.atomic(): # 4. 查询订单并加锁(修复并发问题) - order = Dingdan.objects.select_for_update().get(dingdan_id=dingdan_id) + order = Dingdan.objects.select_for_update().get(OrderID=dingdan_id) # 验证订单是否属于当前商家 - shangjia_kuozhan = DingdanShangjia.query.filter( - dingdan=order, - shangjia_id=yonghuid + shangjia_kuozhan = MerchantOrderExt.query.filter( + Order=order, + MerchantID=yonghuid ).first() if not shangjia_kuozhan: @@ -2404,7 +2404,7 @@ class ShangjiaJiesuanView(APIView): }, status=status.HTTP_403_FORBIDDEN) # 5. 验证订单状态 - if order.zhuangtai != 8: + if order.Status != 8: return Response({ 'code': 6, 'msg': '订单不在结算状态,无法结单', @@ -2412,9 +2412,9 @@ class ShangjiaJiesuanView(APIView): }, status=status.HTTP_400_BAD_REQUEST) # 获取订单字段 - jine = order.jine or Decimal('0') - dashou_fencheng = order.dashou_fencheng or Decimal('0') - jiedan_dashou_id = order.jiedan_dashou_id + jine = order.Amount or Decimal('0') + dashou_fencheng = order.PlayerCommission or Decimal('0') + jiedan_dashou_id = order.PlayerID if not jiedan_dashou_id: return Response({ @@ -2450,30 +2450,30 @@ class ShangjiaJiesuanView(APIView): ) # 更新订单状态 - order.zhuangtai = 3 + order.Status = 3 order.save() # 处理评分(所有情况都处理) if pingfen > 0: - pingfen_obj, created = Pingfen.query.get_or_create( - dashou=jiedan_dashou_id, + pingfen_obj, created = PlayerRating.query.get_or_create( + PlayerID=jiedan_dashou_id, defaults={'zongfen': pingfen, 'cishu': 1} ) if not created: - Pingfen.query.filter(id=pingfen_obj.id).update( - zongfen=F('zongfen') + pingfen, - cishu=F('cishu') + 1, + PlayerRating.query.filter(id=pingfen_obj.id).update( + TotalScore=F('TotalScore') + pingfen, + RatingCount=F('RatingCount') + 1, ) # 更新商家订单扩展表的评价 - DingdanShangjia.query.filter(id=shangjia_kuozhan.id).update( - shangjia_pingjia=liuyan, + MerchantOrderExt.query.filter(id=shangjia_kuozhan.id).update( + MerchantReview=liuyan, ) # 新增:调用打手每日统计(成交) try: update_dashou_daily_by_action( - yonghuid=jiedan_dashou_id, + UserID=jiedan_dashou_id, amount=dashou_fencheng, action=2 # 2 表示成交(结算) ) @@ -2484,13 +2484,13 @@ class ShangjiaJiesuanView(APIView): # ✅ 新方法(行为驱动,更安全) update_shangjia_daily( - yonghuid=request.user.yonghuid, + UserID=request.user.yonghuid, amount=Decimal(str(jine)), action=2 # 2 = 结算 ) - # 商家订单管事分红(仅 fadan_pingtai=2) - if order.fadan_pingtai == 2: + # 商家订单管事分红(仅 Platform=2) + if order.Platform == 2: settle_shangjia_order_guanshi_fenhong(order, jiedan_dashou_id) # 返回成功 @@ -2498,17 +2498,17 @@ class ShangjiaJiesuanView(APIView): 'code': 0, 'msg': '结单成功', 'data': { - 'dingdan_id': dingdan_id, + 'OrderID': dingdan_id, 'new_zhuangtai': 3, 'jine': float(jine), - 'dashou_fencheng': float(dashou_fencheng), + 'PlayerCommission': float(dashou_fencheng), 'jiedan_dashou_id': jiedan_dashou_id, 'pingfen': pingfen, 'liuyan': liuyan } }, status=status.HTTP_200_OK) - except Dingdan.DoesNotExist: + except Order.DoesNotExist: return Response({ 'code': 5, 'msg': '订单不存在', @@ -2553,7 +2553,7 @@ class ShangjiaChexiaoView(APIView): # 3. 获取前端参数 try: data = request.data - dingdan_id = data.get('dingdan_id', '').strip() + dingdan_id = data.get('OrderID', '').strip() chexiao_liyou = data.get('chexiao_liyou', '').strip() except Exception: return Response({ @@ -2574,7 +2574,7 @@ class ShangjiaChexiaoView(APIView): # 5. 使用事务确保数据一致性 with transaction.atomic(): # 查询订单主表 - dingdan = Dingdan.query.filter(dingdan_id=dingdan_id).first() + dingdan = Order.query.filter(OrderID=dingdan_id).first() if not dingdan: return Response({ 'code': 5, @@ -2583,7 +2583,7 @@ class ShangjiaChexiaoView(APIView): }, status=status.HTTP_404_NOT_FOUND) # 6. 验证订单状态 - if dingdan.zhuangtai not in [1, 7]: + if dingdan.Status not in [1, 7]: return Response({ 'code': 6, 'msg': '当前订单状态不可撤销', @@ -2591,9 +2591,9 @@ class ShangjiaChexiaoView(APIView): }, status=status.HTTP_400_BAD_REQUEST) # 7. 验证订单所属商家(使用反向查询) - shangjia_kuozhan = DingdanShangjia.query.filter( - dingdan__dingdan_id=dingdan_id, - shangjia_id=current_user.yonghuid + shangjia_kuozhan = MerchantOrderExt.query.filter( + Order__OrderID=dingdan_id, + MerchantID=current_user.yonghuid ).first() if not shangjia_kuozhan: @@ -2604,39 +2604,39 @@ class ShangjiaChexiaoView(APIView): }, status=status.HTTP_403_FORBIDDEN) # 8. 创建退款记录(注意:申请状态直接设为1-成功) - Tuikuanjilu.query.create( - dingdan_id=dingdan_id, - qingqiuid=current_user.yonghuid, - liyou=chexiao_liyou, - sqzhuangtai=1, # 直接成功 - jine=dingdan.jine, - dashou_fencheng=dingdan.dashou_fencheng, - jieshao=dingdan.jieshao, - beizhu=dingdan.beizhu, - nicheng=dingdan.nicheng, + RefundRecord.query.create( + OrderID=dingdan_id, + ApplicantID=current_user.yonghuid, + Reason=chexiao_liyou, + ApplyStatus=1, # 直接成功 + Amount=dingdan.Amount, + PlayerCommission=dingdan.PlayerCommission, + Description=dingdan.Description, + Remark=dingdan.Remark, + Nickname=dingdan.Nickname, ) # 9. 更新商家扩展表数据(使用F表达式原子操作) UserShangjia.query.filter(id=shangjia.id).update( - yue=F('yue') + dingdan.jine, + yue=F('yue') + dingdan.Amount, tuikuan=F('tuikuan') + 1, jinridingdan=F('jinridingdan') - 1, jinyuedingdan=F('jinyuedingdan') - 1, - jinriliushui=F('jinriliushui') - dingdan.jine, - jinyueliushui=F('jinyueliushui') - dingdan.jine, + jinriliushui=F('jinriliushui') - dingdan.Amount, + jinyueliushui=F('jinyueliushui') - dingdan.Amount, ) # 10. 更新订单状态为5(已退款) - dingdan.zhuangtai = 5 + dingdan.Status = 5 dingdan.save() # 行为驱动 update_shangjia_daily( - yonghuid=request.user.yonghuid, - amount=Decimal(str(dingdan.jine)), + UserID=request.user.yonghuid, + amount=Decimal(str(dingdan.Amount)), action=3 # 3 = 退款 ) @@ -2644,10 +2644,10 @@ class ShangjiaChexiaoView(APIView): 'code': 0, 'msg': '撤销成功', 'data': { - 'dingdan_id': dingdan_id, + 'OrderID': dingdan_id, 'new_zhuangtai': 5, 'tuikuan_liyou': chexiao_liyou, - 'jine': float(dingdan.jine) if dingdan.jine else 0.0 + 'jine': float(dingdan.Amount) if dingdan.Amount else 0.0 } }, status=status.HTTP_200_OK) @@ -2689,7 +2689,7 @@ class ShangjiaTuikuanShenqingView(APIView): # 3. 获取前端参数 try: data = request.data - dingdan_id = data.get('dingdan_id', '').strip() + dingdan_id = data.get('OrderID', '').strip() tuikuan_liyou = data.get('tuikuan_liyou', '').strip() except Exception: return Response({ @@ -2710,7 +2710,7 @@ class ShangjiaTuikuanShenqingView(APIView): # 5. 使用事务确保数据一致性 with transaction.atomic(): # 查询订单主表 - dingdan = Dingdan.query.filter(dingdan_id=dingdan_id).first() + dingdan = Order.query.filter(OrderID=dingdan_id).first() if not dingdan: return Response({ 'code': 5, @@ -2719,7 +2719,7 @@ class ShangjiaTuikuanShenqingView(APIView): }, status=status.HTTP_404_NOT_FOUND) # 6. 验证订单状态 - if dingdan.zhuangtai not in [2, 8]: + if dingdan.Status not in [2, 8]: return Response({ 'code': 6, 'msg': '当前订单状态不可申请退款', @@ -2727,9 +2727,9 @@ class ShangjiaTuikuanShenqingView(APIView): }, status=status.HTTP_400_BAD_REQUEST) # 7. 验证订单所属商家 - shangjia_kuozhan = DingdanShangjia.query.filter( - dingdan__dingdan_id=dingdan_id, - shangjia_id=current_user.yonghuid + shangjia_kuozhan = MerchantOrderExt.query.filter( + Order__OrderID=dingdan_id, + MerchantID=current_user.yonghuid ).first() if not shangjia_kuozhan: @@ -2740,54 +2740,54 @@ class ShangjiaTuikuanShenqingView(APIView): }, status=status.HTTP_403_FORBIDDEN) # ========== 8. 处理退款记录(修改点:先查询是否存在) ========== - refund_record, created = Tuikuanjilu.query.get_or_create( - dingdan_id=dingdan_id, + refund_record, created = RefundRecord.query.get_or_create( + OrderID=dingdan_id, defaults={ - 'dashouid': dingdan.jiedan_dashou_id, + 'dashouid': dingdan.PlayerID, 'qingqiuid': current_user.yonghuid, 'liyou': tuikuan_liyou, 'sqzhuangtai': 0, # 待处理 - 'jine': dingdan.jine, - 'dashou_fencheng': dingdan.dashou_fencheng, - 'jieshao': dingdan.jieshao, - 'beizhu': dingdan.beizhu, - 'nicheng': dingdan.nicheng, + 'jine': dingdan.Amount, + 'PlayerCommission': dingdan.PlayerCommission, + 'Description': dingdan.Description, + 'Remark': dingdan.Remark, + 'nicheng': dingdan.Nickname, } ) if not created: # 记录已存在,更新退款理由和申请时间 - refund_record.liyou = tuikuan_liyou - refund_record.save(update_fields=['liyou', 'update_time']) + refund_record.Reason = tuikuan_liyou + refund_record.save(update_fields=['liyou', 'UpdateTime']) logger.info(f"订单 {dingdan_id} 已有退款记录,已更新退款理由") # 9. 更新订单状态为4(退款中) - dingdan.zhuangtai = 4 - dingdan.tkly = tuikuan_liyou + dingdan.Status = 4 + dingdan.RefundReason = tuikuan_liyou dingdan.save() # ====== 原有功能:更新打手状态 ====== - if dingdan.jiedan_dashou_id: + if dingdan.PlayerID: try: dashou_main = User.query.filter( - UserUID=dingdan.jiedan_dashou_id + UserUID=dingdan.PlayerID ).first() if dashou_main and hasattr(dashou_main, 'dashou_profile'): dashou_profile = dashou_main.dashou_profile dashou_profile.zhuangtai = 1 dashou_profile.save() - logger.info(f"退款申请成功,打手状态已更新:订单{dingdan_id},打手{dingdan.jiedan_dashou_id}状态变更为1") + logger.info(f"退款申请成功,打手状态已更新:订单{dingdan_id},打手{dingdan.PlayerID}状态变更为1") except Exception as e: - logger.error(f"更新打手状态失败:{str(e)},订单{dingdan_id},打手ID{dingdan.jiedan_dashou_id}") + logger.error(f"更新打手状态失败:{str(e)},订单{dingdan_id},打手ID{dingdan.PlayerID}") return Response({ 'code': 0, 'msg': '退款申请提交成功', 'data': { - 'dingdan_id': dingdan_id, + 'OrderID': dingdan_id, 'new_zhuangtai': 4, 'tuikuan_liyou': tuikuan_liyou, - 'jine': float(dingdan.jine) if dingdan.jine else 0.0, - 'dashou_id': dingdan.jiedan_dashou_id + 'jine': float(dingdan.Amount) if dingdan.Amount else 0.0, + 'dashou_id': dingdan.PlayerID } }, status=status.HTTP_200_OK) @@ -2827,7 +2827,7 @@ class ShangjiaChufaShenqingView(APIView): # 3. 获取前端参数 try: data = request.data - dingdan_id = data.get('dingdan_id', '').strip() + dingdan_id = data.get('OrderID', '').strip() dashou_id = data.get('dashou_id', '').strip() chufa_liyou = data.get('chufa_liyou', '').strip() chufa_tupian_urls = data.get('chufa_tupian_urls', []) # 🔴 新增:图片URL数组 @@ -2867,7 +2867,7 @@ class ShangjiaChufaShenqingView(APIView): }, status=status.HTTP_400_BAD_REQUEST) # 查询订单主表 - dingdan = Dingdan.query.filter(dingdan_id=dingdan_id).first() + dingdan = Order.query.filter(OrderID=dingdan_id).first() if not dingdan: return Response({ 'code': 6, @@ -2876,7 +2876,7 @@ class ShangjiaChufaShenqingView(APIView): }, status=status.HTTP_404_NOT_FOUND) # 验证订单状态 - if dingdan.zhuangtai not in [2, 8, 4, 5, 6, 3]: + if dingdan.Status not in [2, 8, 4, 5, 6, 3]: return Response({ 'code': 7, 'msg': '当前订单状态不可申请处罚', @@ -2884,9 +2884,9 @@ class ShangjiaChufaShenqingView(APIView): }, status=status.HTTP_400_BAD_REQUEST) # 验证订单所属商家 - shangjia_kuozhan = DingdanShangjia.query.filter( - dingdan__dingdan_id=dingdan_id, - shangjia_id=current_user.yonghuid + shangjia_kuozhan = MerchantOrderExt.query.filter( + Order__OrderID=dingdan_id, + MerchantID=current_user.yonghuid ).first() if not shangjia_kuozhan: @@ -2897,7 +2897,7 @@ class ShangjiaChufaShenqingView(APIView): }, status=status.HTTP_403_FORBIDDEN) # 验证订单的打手是否与提供的打手ID一致 - if dingdan.jiedan_dashou_id != dashou_id: + if dingdan.PlayerID != dashou_id: return Response({ 'code': 9, 'msg': '该打手并非此订单的服务打手', @@ -2905,45 +2905,45 @@ class ShangjiaChufaShenqingView(APIView): }, status=status.HTTP_400_BAD_REQUEST) # 创建处罚记录 - chufajilu = Chufajilu.query.create( - dashouid=dashou_id, - qingqiuid=current_user.yonghuid, - cfliyou=chufa_liyou, - sqzhuangtai=0, # 待处理 - jifen=5, # 扣除5积分 - dingdan_id=dingdan_id, + chufajilu = PenaltyRecord.query.create( + PlayerID=dashou_id, + ApplicantID=current_user.yonghuid, + PenaltyReason=chufa_liyou, + ApplyStatus=0, # 待处理 + DeductedPoints=5, # 扣除5积分 + OrderID=dingdan_id, ) # 🔴【新增】在创建处罚记录后立即扣除打手积分 # 注意:这里使用前面已经获取的dashou对象(打手扩展表) - jifen_kouchu = chufajilu.jifen # 扣除的积分,这里是5 + jifen_kouchu = chufajilu.DeductedPoints # 扣除的积分,这里是5 if jifen_kouchu > 0: # 检查打手积分是否足够 - if dashou.jifen < jifen_kouchu: - dashou.jifen = 0 + if dashou.DeductedPoints < jifen_kouchu: + dashou.DeductedPoints = 0 else: - dashou.jifen -= jifen_kouchu + dashou.DeductedPoints -= jifen_kouchu dashou.save() # 🔴【新增】保存处罚图片到数据库 if chufa_tupian_urls and isinstance(chufa_tupian_urls, list): for tupian_url in chufa_tupian_urls: if tupian_url and tupian_url.strip(): - Chufatupian.query.create( - dingdan_id=dingdan_id, - yonghuid=current_user.yonghuid, - tupian=tupian_url + PenaltyEvidenceImage.query.create( + OrderID=dingdan_id, + UserID=current_user.yonghuid, + ImageURL=tupian_url ) # 更新商家订单扩展表的处罚相关字段 - shangjia_kuozhan.cfliyou = chufa_liyou - shangjia_kuozhan.sqzhuangtai = 0 + shangjia_kuozhan.PenaltyReason = chufa_liyou + shangjia_kuozhan.PenaltyApplyStatus = 0 shangjia_kuozhan.save() return Response({ 'code': 0, 'msg': '处罚申请提交成功', 'data': { - 'dingdan_id': dingdan_id, + 'OrderID': dingdan_id, 'dashou_id': dashou_id, 'chufa_liyou': chufa_liyou, 'sqzhuangtai': 0, @@ -2977,25 +2977,25 @@ class DashouDingdanHuoquView(APIView): try: # 1. 获取请求参数 data = request.data - leixing_id = data.get('leixing_id') + leixing_id = data.get('ProductTypeID') page = int(data.get('page', 1)) page_size = int(data.get('page_size', 10)) biaoqian_id = data.get('biaoqian_id') # 2. 构建基础查询条件 - base_query = Q(zhuangtai__in=[1, 7]) + base_query = Q(Status__in=[1, 7]) if leixing_id: - base_query &= Q(leixing_id=leixing_id) + base_query &= Q(ProductTypeID=leixing_id) # 3. 标签筛选:先查出符合条件的订单ID,避免跨表 JOIN 排序冲突 if biaoqian_id and int(biaoqian_id) > 0: biaoqian_order_ids = DingdanBiaoqian.query.filter( chenghao_id=int(biaoqian_id) - ).values_list('dingdan_id', flat=True) - base_query &= Q(dingdan_id__in=list(biaoqian_order_ids)) + ).values_list('OrderID', flat=True) + base_query &= Q(OrderID__in=list(biaoqian_order_ids)) # 4. 构建基础查询集 - base_qs = Dingdan.query.filter(base_query).order_by('-create_time').distinct() + base_qs = Order.query.filter(base_query).order_by('-create_time').distinct() # 5. 获取总记录数 total = base_qs.count() @@ -3009,30 +3009,30 @@ class DashouDingdanHuoquView(APIView): # 8. 使用子查询获取商家昵称(Subquery 须用 Django 原生 QuerySet,不能用 .query.values()) shangjia_sub = DingdanShangjia.objects.filter( - dingdan__dingdan_id=OuterRef('dingdan_id') - ).values('sjnicheng')[:1] + Order__OrderID=OuterRef('OrderID') + ).values('MerchantNickname')[:1] # 9. 获取当前页所有需要的字段 dingdan_values = page_qs.annotate( - sjnicheng=Subquery(shangjia_sub) + MerchantNickname=Subquery(shangjia_sub) ).values( - 'dingdan_id', 'zhuangtai', 'fadan_pingtai', 'dashou_fencheng', - 'zhiding_id', 'leixing_id', 'tupian', 'yaoqiuleixing', - 'huiyuan_id', 'yongjin', 'jieshao', 'beizhu', 'create_time', - 'sjnicheng' + 'OrderID', 'Status', 'Platform', 'PlayerCommission', + 'AssignedID', 'ProductTypeID', 'ImageURL', 'GrabRequirement', + 'MembershipID', 'CommissionReq', 'Description', 'Remark', 'CreateTime', + 'MerchantNickname' ) # 10. 转换为列表 dingdan_list = list(dingdan_values) # 11. 批量获取指定打手的头像和昵称 - zhiding_ids = {item['zhiding_id'] for item in dingdan_list if item.get('zhiding_id')} + zhiding_ids = {item['AssignedID'] for item in dingdan_list if item.get('AssignedID')} zhiding_info = {} if zhiding_ids: dashou_query = User.query.filter( UserUID__in=zhiding_ids ).select_related('dashou_profile').annotate( - nicheng=F('dashou_profile__nicheng') + Nickname=F('dashou_profile__nicheng') ).values('UserUID', 'Avatar', 'nicheng') zhiding_info = { item['UserUID']: { @@ -3043,17 +3043,17 @@ class DashouDingdanHuoquView(APIView): } # ============ 批量获取三层标签 ============ - order_ids = [item['dingdan_id'] for item in dingdan_list] + order_ids = [item['OrderID'] for item in dingdan_list] # --- 订单需求标签 --- xuqiu_tags_map = {} if order_ids: try: dbq_qs = DingdanBiaoqian.query.filter( - dingdan_id__in=order_ids + OrderID__in=order_ids ).select_related('chenghao') for dbq in dbq_qs: - oid = dbq.dingdan_id + oid = dbq.OrderID if oid not in xuqiu_tags_map: xuqiu_tags_map[oid] = [] ch = dbq.chenghao @@ -3067,17 +3067,17 @@ class DashouDingdanHuoquView(APIView): # --- 所有需要查询标签的用户ID集合(指定打手 + 商家) --- yonghuid_set = set(zhiding_ids) - shangjia_order_ids = [item['dingdan_id'] for item in dingdan_list if item['fadan_pingtai'] == 2] + shangjia_order_ids = [item['OrderID'] for item in dingdan_list if item['Platform'] == 2] shangjia_id_map = {} if shangjia_order_ids: - # 使用跨表查询 dingdan__dingdan_id__in 匹配字符串订单ID - sj_exts = DingdanShangjia.query.filter( - dingdan__dingdan_id__in=shangjia_order_ids - ).values('dingdan_id', 'shangjia_id') + # 使用跨表查询 Order__OrderID__in 匹配字符串订单ID + sj_exts = MerchantOrderExt.query.filter( + Order__OrderID__in=shangjia_order_ids + ).values('OrderID', 'MerchantID') for sj in sj_exts: - shangjia_id_map[sj['dingdan_id']] = sj['shangjia_id'] - if sj['shangjia_id']: - yonghuid_set.add(sj['shangjia_id']) + shangjia_id_map[sj['OrderID']] = sj['MerchantID'] + if sj['MerchantID']: + yonghuid_set.add(sj['MerchantID']) # 将 yonghuid 字符串转换为 User 的主键 UserUUID user_id_map = {} @@ -3101,15 +3101,15 @@ class DashouDingdanHuoquView(APIView): dashou_tags_map = {} shangjia_tags_map = {} for item in dingdan_list: - oid = item['dingdan_id'] + oid = item['OrderID'] # 指定打手标签 - zhid = item['zhiding_id'] + zhid = item['AssignedID'] dashou_tags = [] if zhid and zhid in user_id_map: uid = user_id_map[zhid] if uid in user_tags_map: for ch in user_tags_map[uid]: - if ch.leixing == 'dashou': + if ch.leixing == 'PlayerID': dashou_tags.append({ 'id': ch.id, 'mingcheng': ch.mingcheng, @@ -3119,7 +3119,7 @@ class DashouDingdanHuoquView(APIView): # 商家标签 sj_tags = [] - if item['fadan_pingtai'] == 2 and oid in shangjia_id_map: + if item['Platform'] == 2 and oid in shangjia_id_map: sj_yonghuid = shangjia_id_map[oid] if sj_yonghuid and sj_yonghuid in user_id_map: uid = user_id_map[sj_yonghuid] @@ -3136,27 +3136,27 @@ class DashouDingdanHuoquView(APIView): # 12. 格式化返回数据 formatted_list = [] for order in dingdan_list: - oid = order['dingdan_id'] - zid = order.get('zhiding_id') + oid = order['OrderID'] + zid = order.get('AssignedID') info = zhiding_info.get(zid, {}) formatted_list.append({ - 'dingdan_id': order['dingdan_id'], - 'zhuangtai': order['zhuangtai'], - 'pingtai': order['fadan_pingtai'], - 'fadan_pingtai': order['fadan_pingtai'], - 'dashou_fencheng': float(order['dashou_fencheng']) if order['dashou_fencheng'] else 0.0, - 'zhiding_id': order['zhiding_id'] or '', - 'leixing_id': order['leixing_id'] or 0, - 'tupian': order['tupian'] or '', - 'yaoqiuleixing': order['yaoqiuleixing'] or 0, - 'huiyuan_id': order['huiyuan_id'] or '', - 'yajin': float(order['yongjin']) if order['yongjin'] else 0.0, - 'yongjin': float(order['yongjin']) if order['yongjin'] else 0.0, - 'jieshao': order['jieshao'] or '', - 'beizhu': order['beizhu'] or '', - 'creat_time': order['create_time'].strftime('%Y-%m-%d %H:%M:%S') if order['create_time'] else '', - 'sjnicheng': order['sjnicheng'] or '', - 'zhiding_uid': order['zhiding_id'] or '', + 'OrderID': order['OrderID'], + 'Status': order['Status'], + 'pingtai': order['Platform'], + 'Platform': order['Platform'], + 'PlayerCommission': float(order['PlayerCommission']) if order['PlayerCommission'] else 0.0, + 'AssignedID': order['AssignedID'] or '', + 'ProductTypeID': order['ProductTypeID'] or 0, + 'ImageURL': order['ImageURL'] or '', + 'GrabRequirement': order['GrabRequirement'] or 0, + 'MembershipID': order['MembershipID'] or '', + 'yajin': float(order['CommissionReq']) if order['CommissionReq'] else 0.0, + 'CommissionReq': float(order['CommissionReq']) if order['CommissionReq'] else 0.0, + 'Description': order['Description'] or '', + 'Remark': order['Remark'] or '', + 'creat_time': order['CreateTime'].strftime('%Y-%m-%d %H:%M:%S') if order['CreateTime'] else '', + 'MerchantNickname': order['MerchantNickname'] or '', + 'zhiding_uid': order['AssignedID'] or '', 'zhiding_avatar': info.get('avatar', ''), 'zhiding_nicheng': info.get('nicheng', ''), # 三层标签 @@ -3210,7 +3210,7 @@ class ShangpinLeixingHuoquView(APIView): # 假设你的商品类型模型字段为:id, jieshao, tupian_url leixing_list = ShangpinLeixing.query.all().values( 'id', # 商品类型ID - 'jieshao', # 类型介绍 + 'Description', # 类型介绍 'tupian_url' # 类型图片URL(相对URL) ).order_by('id') # 按ID排序,可根据需要调整 @@ -3219,7 +3219,7 @@ class ShangpinLeixingHuoquView(APIView): for leixing in leixing_list: formatted_leixing = { 'id': leixing['id'], - 'jieshao': leixing['jieshao'] or '', # 处理空值 + 'Description': leixing['Description'] or '', # 处理空值 'tupian_url': leixing['tupian_url'] or '' # 处理空值 } formatted_list.append(formatted_leixing) @@ -3351,14 +3351,14 @@ def check_user_permission(identity_type, uid, order): except User.DoesNotExist: return False, '用户不存在' - if identity_type == 'dashou': + if identity_type == 'PlayerID': try: dashou = UserDashou.query.get(user=user) if dashou.zhanghaozhuangtai != 1 : return False, '打手账号已被封禁或状态异常' except UserDashou.DoesNotExist: return False, '该用户不是打手' - if order.jiedan_dashou_id != uid: + if order.PlayerID != uid: return False, '你不是该订单的接单打手' elif identity_type == 'shangjia': @@ -3369,9 +3369,9 @@ def check_user_permission(identity_type, uid, order): except UserShangjia.DoesNotExist: return False, '该用户不是商家' try: - if order.shangjia_kuozhan.shangjia_id != uid: + if order.shangjia_kuozhan.MerchantID != uid: return False, '你不是该订单的发布商家' - except DingdanShangjia.DoesNotExist: + except MerchantOrderExt.DoesNotExist: return False, '订单缺少商家信息' elif identity_type == 'boss': @@ -3380,9 +3380,9 @@ def check_user_permission(identity_type, uid, order): except UserBoss.DoesNotExist: return False, '该用户不是老板' try: - if order.pingtai_kuozhan.laoban_id != uid: + if order.pingtai_kuozhan.BossID != uid: return False, '你不是该订单的老板' - except DingdanPingtai.DoesNotExist: + except PlatformOrderExt.DoesNotExist: return False, '订单缺少平台信息' else: @@ -3414,19 +3414,19 @@ class DaiLiQunLiaoXiaoXiView(APIView): if not order_id or not identity_type: return Response({'code': 400, 'msg': '缺少 orderId 或 identityType'}) - if identity_type not in ('dashou', 'shangjia', 'boss'): + if identity_type not in ('PlayerID', 'shangjia', 'boss'): return Response({'code': 400, 'msg': 'identityType 无效'}) # ===== 2. 构造 senderId ===== uid = request.user.yonghuid - prefix_map = {'dashou': 'Ds', 'shangjia': 'Sj', 'boss': 'Boss'} + prefix_map = {'PlayerID': 'Ds', 'shangjia': 'Sj', 'boss': 'Boss'} sender_id = prefix_map[identity_type] + uid - logger.info(f"[群聊代理] 登录用户 yonghuid={uid}, 构造 senderId={sender_id}") + logger.info(f"[群聊代理] 登录用户 UserID={uid}, 构造 senderId={sender_id}") # ===== 3. 查询订单 ===== try: - order = Dingdan.query.select_related('pingtai_kuozhan', 'shangjia_kuozhan').get(dingdan_id=order_id) - except Dingdan.DoesNotExist: + order = Order.query.select_related('pingtai_kuozhan', 'shangjia_kuozhan').get(OrderID=order_id) + except Order.DoesNotExist: logger.warning(f"[群聊代理] 订单 {order_id} 不存在") return Response({'code': 404, 'msg': '订单不存在'}) @@ -3444,8 +3444,8 @@ class DaiLiQunLiaoXiaoXiView(APIView): return Response({'code': 500, 'msg': '系统配置错误(APPKEY)'}) # ===== 6. 公共群信息 ===== - real_group_id = f"group_{order.dingdan_id}" - group_name = (order.jieshao[:20] + '…') if order.jieshao and len(order.jieshao) > 20 else f"订单{order.dingdan_id}" + real_group_id = f"group_{order.OrderID}" + group_name = (order.Description[:20] + '…') if order.Description and len(order.Description) > 20 else f"订单{order.OrderID}" sender_avatar = full_avatar(sender_avatar_raw) if sender_avatar_raw else full_avatar('') # ===== 7. 订阅发送者到群 ===== @@ -3467,7 +3467,7 @@ class DaiLiQunLiaoXiaoXiView(APIView): message_text=text_content, custom_payload=custom_payload, group_name=group_name, - order_id=order.dingdan_id, + order_id=order.OrderID, ) if not local_ok: return Response({'code': 500, 'msg': '消息发送失败'}) @@ -3496,12 +3496,12 @@ class ShangjiaLianjieLiuYanZhuanFaView(APIView): except ShangjiaLianjie.DoesNotExist: return Response({'code': 404, 'msg': '链接不存在或已失效'}) - if not lianjie.dingdan_id: + if not lianjie.OrderID: return Response({'code': 400, 'msg': '链接缺少订单ID'}) try: - order = Dingdan.query.select_related('pingtai_kuozhan', 'shangjia_kuozhan').get(dingdan_id=lianjie.dingdan_id) - except Dingdan.DoesNotExist: + order = Order.query.select_related('pingtai_kuozhan', 'shangjia_kuozhan').get(OrderID=lianjie.OrderID) + except Order.DoesNotExist: return Response({'code': 500, 'msg': '订单数据异常'}) shangjia_uid = lianjie.yonghu_id @@ -3514,8 +3514,8 @@ class ShangjiaLianjieLiuYanZhuanFaView(APIView): if not appkey: return Response({'code': 500, 'msg': '系统配置错误(APPKEY)'}) - group_id = f"group_{order.dingdan_id}" - group_name = (order.jieshao[:20] + '…') if order.jieshao and len(order.jieshao) > 20 else f"订单{order.dingdan_id}" + group_id = f"group_{order.OrderID}" + group_name = (order.Description[:20] + '…') if order.Description and len(order.Description) > 20 else f"订单{order.OrderID}" if not _subscribe_users_to_group([sender_id], [group_id], appkey, secret): return Response({'code': 500, 'msg': '订阅群组失败'}) @@ -3530,7 +3530,7 @@ class ShangjiaLianjieLiuYanZhuanFaView(APIView): message_text=text, custom_payload=None, group_name=group_name, - order_id=order.dingdan_id, + order_id=order.OrderID, ) if not local_ok: return Response({'code': 500, 'msg': '消息发送失败'}) @@ -3544,7 +3544,7 @@ class QiangdanView(APIView): def post(self, request): data = request.data - dingdan_id = data.get('dingdan_id') + dingdan_id = data.get('OrderID') if not dingdan_id: return Response({'code': 400, 'msg': '订单ID不能为空'}, status=400) @@ -3583,11 +3583,11 @@ class QiangdanView(APIView): try: update_dashou_daily_by_action( - yonghuid=order.jiedan_dashou_id, - amount=order.dashou_fencheng, + UserID=order.PlayerID, + amount=order.PlayerCommission, action=1 ) - logger.info(f"打手 {order.jiedan_dashou_id} 每日统计更新成功") + logger.info(f"打手 {order.PlayerID} 每日统计更新成功") except Exception as e: logger.error(f"打手每日统计更新失败: {e}") @@ -3596,8 +3596,8 @@ class QiangdanView(APIView): # 记录抢单表现(不影响主流程) # 如果订单表里有 bankuai 信息,可以用 order.bankuai 代替 None record_dashou_biaoxian( - dingdan_id=dingdan_id, - dashou_id=order.jiedan_dashou_id, + OrderID=dingdan_id, + dashou_id=order.PlayerID, xingwei=1, jiedan_time=timezone.now(), # 直接取当前时间 bankuai=None # 暂不填,后续提交时补上 @@ -3607,7 +3607,7 @@ class QiangdanView(APIView): 'code': 200, 'msg': '抢单成功', 'data': { - 'dingdan_id': dingdan_id, + 'OrderID': dingdan_id, 'chat_established': chat_success } }) @@ -3622,7 +3622,7 @@ class QiangdanView(APIView): dashou_profile = user.dashou_profile if (dashou_profile.zhuangtai != 1 or dashou_profile.zhanghaozhuangtai != 1 or - dashou_profile.jifen < 5): + dashou_profile.DeductedPoints < 5): return None return dashou_profile except UserDashou.DoesNotExist: @@ -3630,29 +3630,29 @@ class QiangdanView(APIView): def _validate_and_lock_order(self, dingdan_id, dashou_yonghuid): try: - order = Dingdan.objects.select_for_update().get(dingdan_id=dingdan_id) - if order.zhuangtai not in [1, 7]: + order = Dingdan.objects.select_for_update().get(OrderID=dingdan_id) + if order.Status not in [1, 7]: return "订单状态不可抢" - if order.zhuangtai == 7: - if not order.zhiding_id or order.zhiding_id != dashou_yonghuid: + if order.Status == 7: + if not order.AssignedID or order.AssignedID != dashou_yonghuid: return "此订单为指定单,您不是指定打手" - if order.jiedan_dashou_id: + if order.PlayerID: return "订单已被其他打手抢走" return order - except Dingdan.DoesNotExist: + except Order.DoesNotExist: return "订单不存在" def _validate_order_requirements(self, order, dashou_profile, dashou_yonghuid): - if order.yaoqiuleixing == 1: + if order.GrabRequirement == 1: return self._validate_huiyuan_requirement(order, dashou_yonghuid) - elif order.yaoqiuleixing == 2: + elif order.GrabRequirement == 2: return self._validate_yajin_requirement(order, dashou_profile) return {'success': True, 'message': '验证通过'} def _validate_huiyuan_requirement(self, order, dashou_yonghuid): try: huiyuan_record = Huiyuangoumai.query.get( - huiyuan_id=order.huiyuan_id, + MembershipID=order.MembershipID, yonghu_id=dashou_yonghuid ) if huiyuan_record.jiance_shifou_daoqi() or huiyuan_record.huiyuan_zhuangtai != 1: @@ -3662,16 +3662,16 @@ class QiangdanView(APIView): return {'success': False, 'message': '未开通对应会员,无法抢此订单'} def _validate_yajin_requirement(self, order, dashou_profile): - yajin_required = order.yongjin or 0 + yajin_required = order.CommissionReq or 0 dashou_yajin = dashou_profile.yajin or 0 if dashou_yajin < yajin_required: return {'success': False, 'message': f'押金不足,需要{yajin_required}元,当前有{dashou_yajin}元'} return {'success': True, 'message': '押金验证通过'} def _execute_qiangdan(self, order, dashou_profile, dashou_yonghuid): - order.zhuangtai = 2 - order.jiedan_dashou_id = dashou_yonghuid - order.user2_id = f"Ds{dashou_yonghuid}" + order.Status = 2 + order.PlayerID = dashou_yonghuid + order.User2ID = f"Ds{dashou_yonghuid}" order.save() dashou_profile.zhuangtai = 0 @@ -3709,7 +3709,7 @@ class DashouDingdanHuoquView1(APIView): zhuangtai_list = data.get('zhuangtai_list', []) # 可选,默认空列表(全部) page = max(1, int(data.get('page', 1))) page_size = min(100, max(1, int(data.get('page_size', 10)))) - leixing_id = data.get('leixing_id', None) # 可选,商品类型ID + leixing_id = data.get('ProductTypeID', None) # 可选,商品类型ID keyword = data.get('keyword', '').strip() # 可选,搜索关键词 except (ValueError, TypeError): return Response({ @@ -3730,33 +3730,33 @@ class DashouDingdanHuoquView1(APIView): # 4. 构建查询条件 try: # 基础条件:当前打手接单 - query = Q(jiedan_dashou_id=yonghuid) + query = Q(PlayerID=yonghuid) # 状态筛选:如果 zhuangtai_list 不为空列表,则加入筛选;否则查询全部状态 if zhuangtai_list: - query &= Q(zhuangtai__in=zhuangtai_list) + query &= Q(Status__in=zhuangtai_list) # 商品类型筛选 if leixing_id is not None: - query &= Q(leixing_id=leixing_id) + query &= Q(ProductTypeID=leixing_id) # 关键词搜索:模糊匹配订单ID和订单介绍 if keyword: - keyword_query = Q(dingdan_id__icontains=keyword) | Q(jieshao__icontains=keyword) + keyword_query = Q(OrderID__icontains=keyword) | Q(Description__icontains=keyword) query &= keyword_query # 5. 执行查询,按创建时间倒序 - dingdan_query = Dingdan.query.filter(query).order_by('-create_time') + dingdan_query = Order.query.filter(query).order_by('-create_time') # 只选择需要的字段,提高性能 dingdan_query = dingdan_query.only( - 'dingdan_id', - 'zhuangtai', - 'dashou_fencheng', # 打手分成金额 - 'jieshao', - 'tupian', + 'OrderID', + 'Status', + 'PlayerCommission', # 打手分成金额 + 'Description', + 'ImageURL', 'nicheng', - 'create_time' + 'CreateTime' ) total_count = dingdan_query.count() @@ -3771,13 +3771,13 @@ class DashouDingdanHuoquView1(APIView): order_list = [] for order in current_page_orders: order_data = { - 'dingdan_id': order.dingdan_id, - 'zhuangtai': order.zhuangtai, - 'jine': float(order.dashou_fencheng) if order.dashou_fencheng else 0.0, - 'jieshao': order.jieshao or '', - 'tupian': order.tupian or '', - 'nicheng': order.nicheng or '', - 'create_time': order.create_time.strftime('%Y-%m-%d %H:%M:%S') if order.create_time else '' + 'OrderID': order.OrderID, + 'Status': order.Status, + 'jine': float(order.PlayerCommission) if order.PlayerCommission else 0.0, + 'Description': order.Description or '', + 'ImageURL': order.ImageURL or '', + 'nicheng': order.Nickname or '', + 'CreateTime': order.CreateTime.strftime('%Y-%m-%d %H:%M:%S') if order.CreateTime else '' } order_list.append(order_data) @@ -3814,7 +3814,7 @@ class DashouCOSZhengshuView(APIView): def post(self, request): try: # 1. 接收参数(修复 int 无 strip 问题) - dingdan_id = str(request.data.get('dingdan_id', '')).strip() + dingdan_id = str(request.data.get('OrderID', '')).strip() yongtu = request.data.get('yongtu', 'dingdan') # 2. 条件判断修正:除了 fakuan 之外,其他用途均需提供 dingdan_id @@ -3827,10 +3827,10 @@ class DashouCOSZhengshuView(APIView): # 3. 业务验证逻辑(根据用途分别验证) if yongtu == 'chufa': try: - chufa_record = Chufajilu.query.filter( - dingdan_id=dingdan_id, - dashouid=request.user.yonghuid, - sqzhuangtai__in=[0, 3] + chufa_record = PenaltyRecord.query.filter( + OrderID=dingdan_id, + PlayerID=request.user.yonghuid, + ApplyStatus__in=[0, 3] ).first() if not chufa_record: return Response( @@ -3850,12 +3850,12 @@ class DashouCOSZhengshuView(APIView): else: # 默认为订单相关,需要验证订单且打手必须接单 try: - dingdan = Dingdan.query.get( - dingdan_id=dingdan_id, - jiedan_dashou_id=request.user.yonghuid, - zhuangtai__in=[2, 8] + dingdan = Order.query.get( + OrderID=dingdan_id, + PlayerID=request.user.yonghuid, + Status__in=[2, 8] ) - except Dingdan.DoesNotExist: + except Order.DoesNotExist: return Response( {'code': 403, 'msg': '此功能暂未开放', 'error': f'Order {dingdan_id} not found or not assigned to user {request.user.yonghuid}'}, status=status.HTTP_403_FORBIDDEN @@ -3958,7 +3958,7 @@ class ShangjiaCOSZhengshuView(APIView): def post(self, request): try: # 1. 接收参数 - dingdan_id = request.data.get('dingdan_id', '').strip() + dingdan_id = request.data.get('OrderID', '').strip() yongtu = request.data.get('yongtu', 'chufa') # 用途:chufa=处罚申诉 if not dingdan_id: @@ -3986,30 +3986,30 @@ class ShangjiaCOSZhengshuView(APIView): # 3. 🔴【修改】验证订单权限 - 通过商家订单扩展表验证 try: # 获取订单 - dingdan = Dingdan.query.get(dingdan_id=dingdan_id) + dingdan = Order.query.get(OrderID=dingdan_id) # 🔴【重要】通过反向查询商家扩展表验证订单是否属于当前商家 try: shangjia_kuozhan = dingdan.shangjia_kuozhan # 使用反向关系名 # 验证商家ID是否匹配 - if str(shangjia_kuozhan.shangjia_id) != str(shangjia_id): + if str(shangjia_kuozhan.MerchantID) != str(shangjia_id): return Response({'code': 2, 'msg': '订单不属于当前商家', 'data': None}, status=status.HTTP_403_FORBIDDEN) # 验证订单状态是否允许申请处罚(根据前端逻辑) allowed_zhuangtai = [2, 4, 5, 6, 8] - if dingdan.zhuangtai not in allowed_zhuangtai: + if dingdan.Status not in allowed_zhuangtai: return Response({'code': 4, 'msg': '当前订单状态不允许申请处罚', 'data': None}, status=status.HTTP_400_BAD_REQUEST) # 🔴【新增】检查是否已存在处罚申请(通过Chufajilu模型) # 注意:这里假设Chufajilu模型存在,并且有shangjia_id字段 try: - existing_chufa = Chufajilu.query.filter( - dingdan_id=dingdan_id, - qingqiuid=shangjia_id, - sqzhuangtai__in=[0, 1] # 审核中或已处罚状态 + existing_chufa = PenaltyRecord.query.filter( + OrderID=dingdan_id, + ApplicantID=shangjia_id, + ApplyStatus__in=[0, 1] # 审核中或已处罚状态 ).exists() if existing_chufa: @@ -4019,12 +4019,12 @@ class ShangjiaCOSZhengshuView(APIView): # 如果没有Chufajilu模型,跳过这个检查 pass - except DingdanShangjia.DoesNotExist: + except MerchantOrderExt.DoesNotExist: # 没有商家扩展记录,说明这不是商家订单 return Response({'code': 2, 'msg': '非商家订单无法操作', 'data': None}, status=status.HTTP_403_FORBIDDEN) - except Dingdan.DoesNotExist: + except Order.DoesNotExist: return Response({'code': 2, 'msg': '订单不存在', 'data': None}, status=status.HTTP_404_NOT_FOUND) except Exception as e: @@ -4105,8 +4105,8 @@ class ShangjiaCOSZhengshuView(APIView): # 🔴【修改】商家专用上传目录 'upload_dir': 'a_long/chfajltp/sjzjtp/', # 🔴【新增】返回商家ID和订单ID,便于前端生成文件名 - 'dingdan_id': dingdan_id, - 'shangjia_id': shangjia_id, + 'OrderID': dingdan_id, + 'MerchantID': shangjia_id, # 🔴【新增】可选:返回商家昵称,便于前端显示 'shangjia_nicheng': shangjia_profile.nicheng if hasattr(shangjia_profile, 'nicheng') else '' } @@ -4135,7 +4135,7 @@ class DashouTijiaoView(APIView): try: # 1. 获取参数 data = request.data - dingdan_id = data.get('dingdan_id', '') + dingdan_id = data.get('OrderID', '') liuyan = data.get('liuyan', '') jiaofu_tupian_urls = data.get('jiaofu_tupian_urls', []) @@ -4192,12 +4192,12 @@ class DashouTijiaoView(APIView): # 4. 验证订单状态和权限 try: - dingdan = Dingdan.query.get( - dingdan_id=dingdan_id, - jiedan_dashou_id=yonghuid, - zhuangtai=2 # 必须是进行中的订单 + dingdan = Order.query.get( + OrderID=dingdan_id, + PlayerID=yonghuid, + Status=2 # 必须是进行中的订单 ) - except Dingdan.DoesNotExist: + except Order.DoesNotExist: return Response({ 'code': 7, 'msg': '订单不存在或没有提交权限', @@ -4207,17 +4207,17 @@ class DashouTijiaoView(APIView): # 5. 存储图片到Dashoutupian表 for tupian_url in jiaofu_tupian_urls: # 创建打手提交图片记录 - Dashoutupian.query.create( - dingdan_id=dingdan_id, - dashou=yonghuid, - tupian=tupian_url, + PlayerDeliveryImage.query.create( + OrderID=dingdan_id, + PlayerID=yonghuid, + ImageURL=tupian_url, create_time=timezone.now() ) # 6. 更新订单主表 - dingdan.dashou_liuyan = liuyan - dingdan.zhuangtai = 8 # 状态改为结算中 - dingdan.update_time = timezone.now() + dingdan.PlayerRemark = liuyan + dingdan.Status = 8 # 状态改为结算中 + dingdan.UpdateTime = timezone.now() dingdan.save() # 7. 更新打手扩展表状态 @@ -4226,7 +4226,7 @@ class DashouTijiaoView(APIView): # ========== 新增:记录打手提交时间 ========== record_dashou_biaoxian( - dingdan_id=dingdan_id, + OrderID=dingdan_id, dashou_id=yonghuid, xingwei=2, # 提交 tijiao_time=timezone.now() @@ -4238,7 +4238,7 @@ class DashouTijiaoView(APIView): 'code': 0, 'msg': '订单提交成功', 'data': { - 'dingdan_id': dingdan_id, + 'OrderID': dingdan_id, 'new_zhuangtai': 8, # 新的订单状态 'dashou_zhuangtai': 1 # 打手新的状态 } @@ -4261,7 +4261,7 @@ class DashouDingdanXiangqingView(APIView): def post(self, request): try: # 1. 获取订单ID - dingdan_id = request.data.get('dingdan_id', '') + dingdan_id = request.data.get('OrderID', '') if not dingdan_id: return Response({ 'code': 1, @@ -4284,8 +4284,8 @@ class DashouDingdanXiangqingView(APIView): # 3. 查询订单主表 try: - dingdan = Dingdan.query.get(dingdan_id=dingdan_id) - except Dingdan.DoesNotExist: + dingdan = Order.query.get(OrderID=dingdan_id) + except Order.DoesNotExist: return Response({ 'code': 3, 'msg': '订单不存在', @@ -4293,7 +4293,7 @@ class DashouDingdanXiangqingView(APIView): }, status=status.HTTP_404_NOT_FOUND) # 4. 验证订单是否属于当前打手 - if dingdan.jiedan_dashou_id != yonghuid: + if dingdan.PlayerID != yonghuid: return Response({ 'code': 4, 'msg': '没有权限查看此订单', @@ -4302,30 +4302,30 @@ class DashouDingdanXiangqingView(APIView): # 5. 构建基础订单数据 dingdan_data = { - 'dingdan_id': dingdan.dingdan_id, - 'zhuangtai': dingdan.zhuangtai, - 'jine': float(dingdan.dashou_fencheng) if dingdan.dashou_fencheng else 0.0, - 'jieshao': dingdan.jieshao or '', - 'tupian': dingdan.tupian or '', - 'nicheng': dingdan.nicheng or '', - 'beizhu': dingdan.beizhu or '', - 'create_time': dingdan.create_time.strftime('%Y-%m-%d %H:%M:%S') if dingdan.create_time else '', - 'tuikuan_liyou':dingdan.tkly or '', - 'dashou_liuyan': dingdan.dashou_liuyan or '', - 'fuwudashou_id': dingdan.jiedan_dashou_id or '', - 'fadanpingtai': dingdan.fadan_pingtai or '' + 'OrderID': dingdan.OrderID, + 'Status': dingdan.Status, + 'jine': float(dingdan.PlayerCommission) if dingdan.PlayerCommission else 0.0, + 'Description': dingdan.Description or '', + 'ImageURL': dingdan.ImageURL or '', + 'nicheng': dingdan.Nickname or '', + 'Remark': dingdan.Remark or '', + 'CreateTime': dingdan.CreateTime.strftime('%Y-%m-%d %H:%M:%S') if dingdan.CreateTime else '', + 'tuikuan_liyou':dingdan.RefundReason or '', + 'PlayerRemark': dingdan.PlayerRemark or '', + 'fuwudashou_id': dingdan.PlayerID or '', + 'fadanpingtai': dingdan.Platform or '' } # 6. 查询打手提交的图片 - dashou_tupian_list = Dashoutupian.query.filter( - dingdan_id=dingdan_id, - dashou=yonghuid - ).order_by('create_time') + dashou_tupian_list = PlayerDeliveryImage.query.filter( + OrderID=dingdan_id, + PlayerID=yonghuid + ).order_by('CreateTime') jiaofu_tupian_urls = [] for tupian_record in dashou_tupian_list: - if tupian_record.tupian: - jiaofu_tupian_urls.append(tupian_record.tupian) + if tupian_record.ImageURL: + jiaofu_tupian_urls.append(tupian_record.ImageURL) dingdan_data['dashou_jiaofu'] = jiaofu_tupian_urls @@ -4334,19 +4334,19 @@ class DashouDingdanXiangqingView(APIView): try: shangjia_kuozhan = dingdan.shangjia_kuozhan shangjia_info = { - 'shangjia_id': shangjia_kuozhan.shangjia_id or '', - 'shangjia_nicheng': shangjia_kuozhan.sjnicheng or '', - 'shangjia_liuyan': shangjia_kuozhan.shangjia_pingjia or '', + 'MerchantID': shangjia_kuozhan.MerchantID or '', + 'shangjia_nicheng': shangjia_kuozhan.MerchantNickname or '', + 'shangjia_liuyan': shangjia_kuozhan.MerchantReview or '', #'tuikuan_liyou': '', - 'chufa_liyou': shangjia_kuozhan.cfliyou or '', - 'chufa_zhuangtai': shangjia_kuozhan.sqzhuangtai or 0, + 'chufa_liyou': shangjia_kuozhan.PenaltyReason or '', + 'chufa_zhuangtai': shangjia_kuozhan.PenaltyApplyStatus or 0, #'chufa_jieguo': shangjia_kuozhan.chufa_jieguo or '', - 'bohui_liyou': shangjia_kuozhan.bhliyou or '' + 'bohui_liyou': shangjia_kuozhan.RejectReason or '' } - except DingdanShangjia.DoesNotExist: + except MerchantOrderExt.DoesNotExist: # 没有商家扩展信息,返回空值 shangjia_info = { - 'shangjia_id': '', + 'MerchantID': '', 'shangjia_nicheng': '', 'shangjia_liuyan': '', 'tuikuan_liyou': '', @@ -4361,10 +4361,10 @@ class DashouDingdanXiangqingView(APIView): try: pingtai_kuozhan = dingdan.pingtai_kuozhan pingtai_info = { - 'laoban_id': pingtai_kuozhan.laoban_id or '', - 'laoban_pingjia': pingtai_kuozhan.laoban_pingjia or '' + 'laoban_id': pingtai_kuozhan.BossID or '', + 'laoban_pingjia': pingtai_kuozhan.BossReview or '' } - except DingdanPingtai.DoesNotExist: + except PlatformOrderExt.DoesNotExist: pingtai_info = { 'laoban_id': '', 'laoban_pingjia': '' @@ -4414,7 +4414,7 @@ class AdGetDingdanXiangQing(APIView): try: # 1. 获取前端参数 qianzhanghao = request.data.get('zhanghao', '').strip() - dingdan_id = request.data.get('dingdan_id', '').strip() + dingdan_id = request.data.get('OrderID', '').strip() if not qianzhanghao or not dingdan_id: return Response( @@ -4452,11 +4452,11 @@ class AdGetDingdanXiangQing(APIView): try: # 查询订单主表 - 使用select_related预加载关联表 - dingdan_obj = Dingdan.query.select_related( + dingdan_obj = Order.query.select_related( 'pingtai_kuozhan', 'shangjia_kuozhan' - ).get(dingdan_id=dingdan_id) + ).get(OrderID=dingdan_id) - except Dingdan.DoesNotExist: + except Order.DoesNotExist: return Response( {'code': 404, 'message': '订单不存在', 'data': None}, status=status.HTTP_404_NOT_FOUND @@ -4465,30 +4465,30 @@ class AdGetDingdanXiangQing(APIView): # 7. 构建返回数据 - 主表字段 response_data = { # 基础信息字段 - 'dingdan_id': dingdan_obj.dingdan_id or '', - 'jieshao': dingdan_obj.jieshao or '', - 'zhuangtai': dingdan_obj.zhuangtai or 0, - 'leixing': dingdan_obj.leixing_id or 0, # 前端需要 leixing,对应 leixing_id - 'fadanpingtai': dingdan_obj.fadan_pingtai or 0, # 前端需要 fadanpingtai,对应 fadan_pingtai - 'jiage': float(dingdan_obj.jine) if dingdan_obj.jine else 0.00, # 前端需要 jiage,对应 jine - 'tupian_url': dingdan_obj.tupian or '', # 前端需要 tupian_url,对应 tupian - 'beizhu': dingdan_obj.beizhu or '', + 'OrderID': dingdan_obj.OrderID or '', + 'Description': dingdan_obj.Description or '', + 'Status': dingdan_obj.Status or 0, + 'leixing': dingdan_obj.ProductTypeID or 0, # 前端需要 leixing,对应 leixing_id + 'fadanpingtai': dingdan_obj.Platform or 0, # 前端需要 fadanpingtai,对应 fadan_pingtai + 'jiage': float(dingdan_obj.Amount) if dingdan_obj.Amount else 0.00, # 前端需要 jiage,对应 jine + 'tupian_url': dingdan_obj.ImageURL or '', # 前端需要 tupian_url,对应 tupian + 'Remark': dingdan_obj.Remark or '', # 服务信息字段 - 'jiedan_dashou_id': dingdan_obj.jiedan_dashou_id or '', - 'dashou_fencheng': float(dingdan_obj.dashou_fencheng) if dingdan_obj.dashou_fencheng else 0.00, - 'zhiding_id': dingdan_obj.zhiding_id or '', - 'dashou_liuyan': dingdan_obj.dashou_liuyan or '', + 'jiedan_dashou_id': dingdan_obj.PlayerID or '', + 'PlayerCommission': float(dingdan_obj.PlayerCommission) if dingdan_obj.PlayerCommission else 0.00, + 'AssignedID': dingdan_obj.AssignedID or '', + 'PlayerRemark': dingdan_obj.PlayerRemark or '', # 时间字段 - 'chuangjianshijian': dingdan_obj.create_time.strftime( - '%Y-%m-%d %H:%M:%S') if dingdan_obj.create_time else '', - 'genggaishijian': dingdan_obj.update_time.strftime( - '%Y-%m-%d %H:%M:%S') if dingdan_obj.update_time else '', + 'chuangjianshijian': dingdan_obj.CreateTime.strftime( + '%Y-%m-%d %H:%M:%S') if dingdan_obj.CreateTime else '', + 'genggaishijian': dingdan_obj.UpdateTime.strftime( + '%Y-%m-%d %H:%M:%S') if dingdan_obj.UpdateTime else '', } # 8. 根据发单平台查询扩展表数据 - fadan_pingtai = dingdan_obj.fadan_pingtai + fadan_pingtai = dingdan_obj.Platform if fadan_pingtai == 1: # 平台发单 - 查询平台订单扩展表 @@ -4497,15 +4497,15 @@ class AdGetDingdanXiangQing(APIView): pingtai_kuozhan = dingdan_obj.pingtai_kuozhan response_data.update({ - 'laoban_id': pingtai_kuozhan.laoban_id or '', - 'nicheng': dingdan_obj.nicheng or '', # 这个字段在订单主表 - 'laoban_pingjia': pingtai_kuozhan.laoban_pingjia or '', + 'laoban_id': pingtai_kuozhan.BossID or '', + 'nicheng': dingdan_obj.Nickname or '', # 这个字段在订单主表 + 'laoban_pingjia': pingtai_kuozhan.BossReview or '', }) - except DingdanPingtai.DoesNotExist: + except PlatformOrderExt.DoesNotExist: # 扩展表不存在,返回空值 response_data.update({ 'laoban_id': '', - 'nicheng': dingdan_obj.nicheng or '', + 'nicheng': dingdan_obj.Nickname or '', 'laoban_pingjia': '', }) @@ -4516,17 +4516,17 @@ class AdGetDingdanXiangQing(APIView): shangjia_kuozhan = dingdan_obj.shangjia_kuozhan response_data.update({ - 'shangjia_id': shangjia_kuozhan.shangjia_id or '', - 'sjnicheng': shangjia_kuozhan.sjnicheng or '', - 'shangjia_pingjia': shangjia_kuozhan.shangjia_pingjia or '', - 'cfliyou': shangjia_kuozhan.cfliyou or '', # 商家处罚理由 - 'bhliyou': shangjia_kuozhan.bhliyou or '', # 驳回理由 + 'MerchantID': shangjia_kuozhan.MerchantID or '', + 'MerchantNickname': shangjia_kuozhan.MerchantNickname or '', + 'shangjia_pingjia': shangjia_kuozhan.MerchantReview or '', + 'cfliyou': shangjia_kuozhan.PenaltyReason or '', # 商家处罚理由 + 'bhliyou': shangjia_kuozhan.RejectReason or '', # 驳回理由 }) - except DingdanShangjia.DoesNotExist: + except MerchantOrderExt.DoesNotExist: # 扩展表不存在,返回空值 response_data.update({ - 'shangjia_id': '', - 'sjnicheng': '', + 'MerchantID': '', + 'MerchantNickname': '', 'shangjia_pingjia': '', 'cfliyou': '', 'bhliyou': '', @@ -4535,9 +4535,9 @@ class AdGetDingdanXiangQing(APIView): # 9. 查询打手提交的图片 try: # 查询该订单的所有打手提交图片 - dashou_tupian_list = Dashoutupian.query.filter( - dingdan_id=dingdan_id - ).values_list('tupian', flat=True) + dashou_tupian_list = PlayerDeliveryImage.query.filter( + OrderID=dingdan_id + ).values_list('ImageURL', flat=True) # 转换为列表,过滤空值 dashou_images = [img for img in dashou_tupian_list if img] @@ -4550,8 +4550,8 @@ class AdGetDingdanXiangQing(APIView): try: # 导入退款记录模型 # 查询该订单的退款记录(一个订单可能有多次退款申请,我们取最新的) - tuikuan_record = Tuikuanjilu.query.filter( - dingdan_id=dingdan_id + tuikuan_record = RefundRecord.query.filter( + OrderID=dingdan_id ).order_by('-create_time').first() # 按创建时间倒序,取最新的 if tuikuan_record and tuikuan_record.liyou: @@ -4560,7 +4560,7 @@ class AdGetDingdanXiangQing(APIView): else: # 没有找到退款记录或理由为空 response_data['tuikuan_liyou'] = '' - except Tuikuanjilu.DoesNotExist: + except RefundRecord.DoesNotExist: # 退款记录表不存在该订单的记录 response_data['tuikuan_liyou'] = '' except Exception as e: @@ -4609,7 +4609,7 @@ class AdGengHuanDaShou(APIView): 1. 验证管理员身份 2. 验证订单存在且状态为进行中(2)或结算中(8) 3. 验证新打手ID存在且是打手身份 - 4. 验证新打手状态正常(zhuangtai=1且zhanghaozhuangtai=1) + 4. 验证新打手状态正常(Status=1且zhanghaoStatus=1) 5. 根据订单的抢单要求类型进行验证: - 会员抢单(1):验证打手有对应会员且未过期 - 押金抢单(2):验证打手押金≥订单押金 @@ -4620,7 +4620,7 @@ class AdGengHuanDaShou(APIView): try: # 1. 获取前端参数 qianzhanghao = request.data.get('zhanghao', '').strip() - dingdan_id = request.data.get('dingdan_id', '').strip() + dingdan_id = request.data.get('OrderID', '').strip() new_dashou_id = request.data.get('new_dashou_id', '').strip() if not qianzhanghao or not dingdan_id or not new_dashou_id: @@ -4657,15 +4657,15 @@ class AdGengHuanDaShou(APIView): # 6. 查询订单主表 try: - dingdan_obj = Dingdan.query.get(dingdan_id=dingdan_id) - except Dingdan.DoesNotExist: + dingdan_obj = Order.query.get(OrderID=dingdan_id) + except Order.DoesNotExist: return Response( {'code': 404, 'message': '订单不存在', 'data': None}, status=status.HTTP_404_NOT_FOUND ) # 7. 验证订单状态是否为进行中(2)或结算中(8) - if dingdan_obj.zhuangtai not in [2, 8]: + if dingdan_obj.Status not in [2, 8]: return Response( {'code': 400, 'message': '订单状态不允许更换打手', 'data': None}, status=status.HTTP_400_BAD_REQUEST @@ -4675,7 +4675,7 @@ class AdGengHuanDaShou(APIView): try: new_dashou_user = User.query.get( UserUID=new_dashou_id, - #user_type='dashou' + #user_type='PlayerID' ) except User.DoesNotExist: return Response( @@ -4692,7 +4692,7 @@ class AdGengHuanDaShou(APIView): status=status.HTTP_404_NOT_FOUND ) - # 10. 验证新打手状态:zhuangtai=1且zhanghaozhuangtai=1 + # 10. 验证新打手状态:Status=1且zhanghaoStatus=1 if new_dashou_profile.zhuangtai != 1 or new_dashou_profile.zhanghaozhuangtai != 1: return Response( {'code': 400, 'message': '打手状态不允许接单', 'data': None}, @@ -4700,11 +4700,11 @@ class AdGengHuanDaShou(APIView): ) # 11. 根据订单的抢单要求类型进行验证 - yaoqiuleixing = dingdan_obj.yaoqiuleixing + yaoqiuleixing = dingdan_obj.GrabRequirement if yaoqiuleixing == 1: # 会员抢单 # 获取订单的会员ID - huiyuan_id = dingdan_obj.huiyuan_id + huiyuan_id = dingdan_obj.MembershipID if not huiyuan_id: return Response( {'code': 400, 'message': '订单会员ID为空', 'data': None}, @@ -4714,7 +4714,7 @@ class AdGengHuanDaShou(APIView): # 查询会员购买记录 try: huiyuan_goumai = Huiyuangoumai.query.get( - huiyuan_id=huiyuan_id, + MembershipID=huiyuan_id, yonghu_id=new_dashou_id # 注意:yonghu_id存储的是用户ID(yonghuid) ) except Huiyuangoumai.DoesNotExist: @@ -4734,7 +4734,7 @@ class AdGengHuanDaShou(APIView): elif yaoqiuleixing == 2: # 押金抢单 # 获取订单的押金(yongjin字段) - order_yajin = dingdan_obj.yongjin + order_yajin = dingdan_obj.CommissionReq if order_yajin is None: return Response( {'code': 400, 'message': '订单押金为空', 'data': None}, @@ -4764,13 +4764,13 @@ class AdGengHuanDaShou(APIView): new_dashou_profile.save() # 12.2 如果原订单有接单打手,则更新原打手状态 - old_dashou_id = dingdan_obj.jiedan_dashou_id + old_dashou_id = dingdan_obj.PlayerID if old_dashou_id: try: # 查询原打手主表 old_dashou_user = User.query.get( UserUID=old_dashou_id, - #user_type='dashou' + #user_type='PlayerID' ) # 获取原打手扩展表 @@ -4793,8 +4793,8 @@ class AdGengHuanDaShou(APIView): logger.error(f"更新原打手状态异常: {str(e)}", exc_info=True) # 12.3 更新订单表 - dingdan_obj.jiedan_dashou_id = new_dashou_id - dingdan_obj.zhuangtai = 2 # 进行中状态 + dingdan_obj.PlayerID = new_dashou_id + dingdan_obj.Status = 2 # 进行中状态 dingdan_obj.save() # 13. 返回成功响应 @@ -4840,7 +4840,7 @@ class AdQiangZhiJieDan(APIView): try: # 1. 获取前端参数 qianzhanghao = request.data.get('zhanghao', '').strip() - dingdan_id = request.data.get('dingdan_id', '').strip() + dingdan_id = request.data.get('OrderID', '').strip() if not qianzhanghao or not dingdan_id: return Response( @@ -4876,24 +4876,24 @@ class AdQiangZhiJieDan(APIView): # 6. 查询订单主表 try: - dingdan_obj = Dingdan.query.get(dingdan_id=dingdan_id) - except Dingdan.DoesNotExist: + dingdan_obj = Order.query.get(OrderID=dingdan_id) + except Order.DoesNotExist: return Response( {'code': 404, 'message': '订单不存在', 'data': None}, status=status.HTTP_404_NOT_FOUND ) # 7. 验证订单状态是否为2、8或4 - if dingdan_obj.zhuangtai not in [2, 8, 4]: + if dingdan_obj.Status not in [2, 8, 4]: return Response( {'code': 400, 'message': '订单状态不允许强制结单', 'data': None}, status=status.HTTP_400_BAD_REQUEST ) # 8. 获取订单的重要字段 - jiedan_dashou_id = dingdan_obj.jiedan_dashou_id # 接单打手ID - dashou_fencheng = dingdan_obj.dashou_fencheng # 打手分成金额 - fadan_pingtai = dingdan_obj.fadan_pingtai # 发单平台 + jiedan_dashou_id = dingdan_obj.PlayerID # 接单打手ID + dashou_fencheng = dingdan_obj.PlayerCommission # 打手分成金额 + fadan_pingtai = dingdan_obj.Platform # 发单平台 # 9. 验证打手分成金额是否存在 if dashou_fencheng is None: @@ -4905,7 +4905,7 @@ class AdQiangZhiJieDan(APIView): # 10. 使用事务保证数据一致性 with transaction.atomic(): # 10.1 更新订单状态为3(已完成) - dingdan_obj.zhuangtai = 3 + dingdan_obj.Status = 3 dingdan_obj.save() # 10.2 处理打手结算 @@ -4914,7 +4914,7 @@ class AdQiangZhiJieDan(APIView): # 查询打手用户主表 dashou_user = User.query.get( UserUID=jiedan_dashou_id, - #user_type='dashou' + #user_type='PlayerID' ) # 获取打手扩展表 @@ -4951,7 +4951,7 @@ class AdQiangZhiJieDan(APIView): try: # 获取商家订单扩展表 shangjia_kuozhan = dingdan_obj.shangjia_kuozhan - shangjia_id = shangjia_kuozhan.shangjia_id + shangjia_id = shangjia_kuozhan.MerchantID if shangjia_id: # 查询商家用户主表 @@ -4969,7 +4969,7 @@ class AdQiangZhiJieDan(APIView): logger.info(f"强制结单成功,商家{shangjia_id}成交订单+1") - except DingdanShangjia.DoesNotExist: + except MerchantOrderExt.DoesNotExist: # 商家订单扩展表不存在,跳过商家更新 logger.warning(f"强制结单:订单{dingdan_id}商家扩展表不存在,跳过商家更新") except User.DoesNotExist: @@ -5022,7 +5022,7 @@ class AdJuJueTuiKuan(APIView): try: # 1. 获取前端参数 qianzhanghao = request.data.get('zhanghao', '').strip() - dingdan_id = request.data.get('dingdan_id', '').strip() + dingdan_id = request.data.get('OrderID', '').strip() jujue_liyou = request.data.get('jujue_liyou', '').strip() if not qianzhanghao or not dingdan_id: @@ -5059,17 +5059,17 @@ class AdJuJueTuiKuan(APIView): # 6. 查询订单主表 try: - dingdan_obj = Dingdan.query.get(dingdan_id=dingdan_id) - except Dingdan.DoesNotExist: + dingdan_obj = Order.query.get(OrderID=dingdan_id) + except Order.DoesNotExist: return Response( {'code': 404, 'message': '订单不存在', 'data': None}, status=status.HTTP_404_NOT_FOUND ) # 7. 获取订单的重要字段 - jiedan_dashou_id = dingdan_obj.jiedan_dashou_id # 接单打手ID - dashou_fencheng = dingdan_obj.dashou_fencheng # 打手分成金额 - fadan_pingtai = dingdan_obj.fadan_pingtai # 发单平台 + jiedan_dashou_id = dingdan_obj.PlayerID # 接单打手ID + dashou_fencheng = dingdan_obj.PlayerCommission # 打手分成金额 + fadan_pingtai = dingdan_obj.Platform # 发单平台 # 8. 验证打手分成金额是否存在 if dashou_fencheng is None: @@ -5081,7 +5081,7 @@ class AdJuJueTuiKuan(APIView): # 9. 使用事务保证数据一致性 with transaction.atomic(): # 9.1 更新订单状态为6(退款失败) - dingdan_obj.zhuangtai = 6 + dingdan_obj.Status = 6 dingdan_obj.save() # 9.2 处理打手结算 @@ -5090,7 +5090,7 @@ class AdJuJueTuiKuan(APIView): # 查询打手用户主表 dashou_user = User.query.get( UserUID=jiedan_dashou_id, - #user_type='dashou' + #user_type='PlayerID' ) # 获取打手扩展表 @@ -5127,7 +5127,7 @@ class AdJuJueTuiKuan(APIView): try: # 获取商家订单扩展表 shangjia_kuozhan = dingdan_obj.shangjia_kuozhan - shangjia_id = shangjia_kuozhan.shangjia_id + shangjia_id = shangjia_kuozhan.MerchantID if shangjia_id: # 查询商家用户主表 @@ -5145,7 +5145,7 @@ class AdJuJueTuiKuan(APIView): logger.info(f"拒绝退款成功,商家{shangjia_id}成交订单+1") - except DingdanShangjia.DoesNotExist: + except MerchantOrderExt.DoesNotExist: # 商家订单扩展表不存在,跳过商家更新 logger.warning(f"拒绝退款:订单{dingdan_id}商家扩展表不存在,跳过商家更新") except User.DoesNotExist: @@ -5158,21 +5158,21 @@ class AdJuJueTuiKuan(APIView): # 9.4 更新退款记录表 try: # 查询退款记录表 - tuikuan_jilu = Tuikuanjilu.query.get(dingdan_id=dingdan_id) + tuikuan_jilu = RefundRecord.query.get(OrderID=dingdan_id) # ✅ 确认字段:sqzhuangtai 申请状态,改为2(驳回) - tuikuan_jilu.sqzhuangtai = 2 + tuikuan_jilu.PenaltyApplyStatus = 2 # ✅ 确认字段:bhliyou 驳回理由 - tuikuan_jilu.bhliyou = jujue_liyou + tuikuan_jilu.RejectReason = jujue_liyou # ✅ 确认字段:chuliid 处理人ID(使用管理员账号,即手机号) - tuikuan_jilu.chuliid = qianzhanghao + tuikuan_jilu.ProcessorID = qianzhanghao tuikuan_jilu.save() logger.info(f"拒绝退款成功,更新退款记录表,订单:{dingdan_id}") - except Tuikuanjilu.DoesNotExist: + except RefundRecord.DoesNotExist: # 退款记录表不存在,记录日志但不影响主流程 logger.warning(f"拒绝退款:订单{dingdan_id}退款记录不存在,跳过更新") @@ -5222,7 +5222,7 @@ class AdTongYiTuiKuanShangJia(APIView): try: # 1. 获取前端参数 qianzhanghao = request.data.get('zhanghao', '').strip() - dingdan_id = request.data.get('dingdan_id', '').strip() + dingdan_id = request.data.get('OrderID', '').strip() tuikuan_liyou = request.data.get('tuikuan_liyou', '').strip() pay_password = request.data.get('pay_password', '').strip() @@ -5267,30 +5267,30 @@ class AdTongYiTuiKuanShangJia(APIView): # 7. 查询订单主表 try: - dingdan_obj = Dingdan.query.get(dingdan_id=dingdan_id) - except Dingdan.DoesNotExist: + dingdan_obj = Order.query.get(OrderID=dingdan_id) + except Order.DoesNotExist: return Response( {'code': 404, 'message': '订单不存在', 'data': None}, status=status.HTTP_404_NOT_FOUND ) # 8. 验证订单状态为4(退款审核中) - if dingdan_obj.zhuangtai != 4: + if dingdan_obj.Status != 4: return Response( {'code': 400, 'message': '订单状态不是退款审核中', 'data': None}, status=status.HTTP_400_BAD_REQUEST ) # 9. 验证订单为商家发单 - if dingdan_obj.fadan_pingtai != 2: + if dingdan_obj.Platform != 2: return Response( {'code': 400, 'message': '此接口只处理商家发单的退款', 'data': None}, status=status.HTTP_400_BAD_REQUEST ) # 10. 获取订单的重要字段 - jiedan_dashou_id = dingdan_obj.jiedan_dashou_id # 接单打手ID - jine = dingdan_obj.jine # 订单金额(不是打手分成) + jiedan_dashou_id = dingdan_obj.PlayerID # 接单打手ID + jine = dingdan_obj.Amount # 订单金额(不是打手分成) # 11. 验证订单金额是否存在 if jine is None: @@ -5302,8 +5302,8 @@ class AdTongYiTuiKuanShangJia(APIView): # 12. 获取商家ID try: shangjia_kuozhan = dingdan_obj.shangjia_kuozhan - shangjia_id = shangjia_kuozhan.shangjia_id - except DingdanShangjia.DoesNotExist: + shangjia_id = shangjia_kuozhan.MerchantID + except MerchantOrderExt.DoesNotExist: return Response( {'code': 400, 'message': '订单商家信息不存在', 'data': None}, status=status.HTTP_400_BAD_REQUEST @@ -5312,7 +5312,7 @@ class AdTongYiTuiKuanShangJia(APIView): # 13. 使用事务保证数据一致性 with transaction.atomic(): # 13.1 更新订单状态为5(已退款) - dingdan_obj.zhuangtai = 5 + dingdan_obj.Status = 5 dingdan_obj.save() # 13.2 更新打手扩展表(退款订单总量+1) @@ -5321,7 +5321,7 @@ class AdTongYiTuiKuanShangJia(APIView): # 查询打手用户主表 dashou_user = User.query.get( UserUID=jiedan_dashou_id, - #user_type='dashou' + #user_type='PlayerID' ) # 获取打手扩展表 @@ -5371,21 +5371,21 @@ class AdTongYiTuiKuanShangJia(APIView): # 13.4 更新退款记录表 try: # 查询退款记录表 - tuikuan_jilu = Tuikuanjilu.query.get(dingdan_id=dingdan_id) + tuikuan_jilu = RefundRecord.query.get(OrderID=dingdan_id) # ✅ 确认字段:sqzhuangtai 申请状态,改为1(成功) - tuikuan_jilu.sqzhuangtai = 1 + tuikuan_jilu.PenaltyApplyStatus = 1 # 可以添加同意理由字段,如:tongyi_liyou # tuikuan_jilu.tongyi_liyou = tuikuan_liyou # ✅ 确认字段:chuliid 处理人ID(使用管理员账号,即手机号) - tuikuan_jilu.chuliid = qianzhanghao + tuikuan_jilu.ProcessorID = qianzhanghao tuikuan_jilu.save() logger.info(f"同意退款成功,更新退款记录表,订单:{dingdan_id}") - except Tuikuanjilu.DoesNotExist: + except RefundRecord.DoesNotExist: # 退款记录表不存在,记录日志但不影响主流程 logger.warning(f"同意退款:订单{dingdan_id}退款记录不存在,跳过更新") @@ -5423,7 +5423,7 @@ class AdTongYiTuiKuanPingTai(APIView): try: # 1. 获取前端参数 qianzhanghao = request.data.get('zhanghao', '').strip() - dingdan_id = request.data.get('dingdan_id', '').strip() + dingdan_id = request.data.get('OrderID', '').strip() tuikuan_liyou = request.data.get('tuikuan_liyou', '').strip() pay_password = request.data.get('pay_password', '').strip() @@ -5469,30 +5469,30 @@ class AdTongYiTuiKuanPingTai(APIView): # 7. 查询订单主表(加锁) with transaction.atomic(): try: - dingdan_obj = Dingdan.objects.select_related('pingtai_kuozhan').select_for_update().get(dingdan_id=dingdan_id) - except Dingdan.DoesNotExist: + dingdan_obj = Dingdan.objects.select_related('pingtai_kuozhan').select_for_update().get(OrderID=dingdan_id) + except Order.DoesNotExist: return Response( {'code': 404, 'message': '订单不存在', 'data': None}, status=status.HTTP_404_NOT_FOUND ) # 8. 验证订单状态为1、7、2、8、4(允许退款的状态) - if dingdan_obj.zhuangtai not in [1, 7, 2, 8, 4]: + if dingdan_obj.Status not in [1, 7, 2, 8, 4]: return Response( {'code': 400, 'message': '订单状态不允许退款', 'data': None}, status=status.HTTP_400_BAD_REQUEST ) # 9. 验证订单为平台发单 - if dingdan_obj.fadan_pingtai != 1: + if dingdan_obj.Platform != 1: return Response( {'code': 400, 'message': '此接口只处理平台发单的退款', 'data': None}, status=status.HTTP_400_BAD_REQUEST ) # 10. 获取订单的重要字段 - jiedan_dashou_id = dingdan_obj.jiedan_dashou_id - jine = dingdan_obj.jine + jiedan_dashou_id = dingdan_obj.PlayerID + jine = dingdan_obj.Amount if jine is None: return Response( {'code': 400, 'message': '订单缺少订单金额', 'data': None}, @@ -5505,13 +5505,13 @@ class AdTongYiTuiKuanPingTai(APIView): {'code': 400, 'message': '订单老板信息不存在', 'data': None}, status=status.HTTP_400_BAD_REQUEST ) - laoban_id = dingdan_obj.pingtai_kuozhan.laoban_id + laoban_id = dingdan_obj.pingtai_kuozhan.BossID # 12. 调用微信退款接口(优先使用 wechat_transaction_id) transaction_id = getattr(dingdan_obj, 'wechat_transaction_id', None) weixin_refund_result = self.call_weixin_refund( out_trade_no=dingdan_id, - jine=jine, + Amount=jine, transaction_id=transaction_id ) @@ -5523,7 +5523,7 @@ class AdTongYiTuiKuanPingTai(APIView): ) # 13. 更新订单状态为5(已退款) - dingdan_obj.zhuangtai = 5 + dingdan_obj.Status = 5 dingdan_obj.save() # 14. 更新打手扩展表 @@ -5568,8 +5568,8 @@ class AdTongYiTuiKuanPingTai(APIView): # 17. 更新退款记录表 try: - tuikuan_jilu, created = Tuikuanjilu.query.get_or_create( - dingdan_id=dingdan_id, + tuikuan_jilu, created = RefundRecord.query.get_or_create( + OrderID=dingdan_id, defaults={ 'dashouid': jiedan_dashou_id if jiedan_dashou_id else '', 'qingqiuid': laoban_id if laoban_id else '', @@ -5577,17 +5577,17 @@ class AdTongYiTuiKuanPingTai(APIView): 'liyou': tuikuan_liyou if tuikuan_liyou else '给老板退款', 'sqzhuangtai': 1, 'jine': jine, - 'dashou_fencheng': dingdan_obj.dashou_fencheng or 0, - 'jieshao': dingdan_obj.jieshao or '', - 'beizhu': '给老板退款', - 'nicheng': dingdan_obj.nicheng or '', + 'PlayerCommission': dingdan_obj.PlayerCommission or 0, + 'Description': dingdan_obj.Description or '', + 'Remark': '给老板退款', + 'nicheng': dingdan_obj.Nickname or '', } ) if not created: - tuikuan_jilu.sqzhuangtai = 1 + tuikuan_jilu.PenaltyApplyStatus = 1 if tuikuan_liyou: - tuikuan_jilu.liyou = tuikuan_liyou - tuikuan_jilu.chuliid = qianzhanghao + tuikuan_jilu.Reason = tuikuan_liyou + tuikuan_jilu.ProcessorID = qianzhanghao tuikuan_jilu.save() except Exception as e: logger.error(f"更新退款记录表异常: {str(e)}") @@ -5734,17 +5734,17 @@ class DashouHuoquLeixingView(APIView): 安全验证: 1. JWT Token验证用户身份 - 2. 只返回 shenhezhuangtai=1(正常状态)的类型 + 2. 只返回 shenheStatus=1(正常状态)的类型 3. 数据已排序:paixu降序 → id升序 """ try: logger.info(f"打手获取商品类型请求 - 用户ID: {request.user.yonghuid}") # 🔴 查询所有正常状态的商品类型 - # 条件:shenhezhuangtai=1(正常状态) + # 条件:shenheStatus=1(正常状态) # 排序:先按 paixu 降序(数值大的在前),再按 id 升序 leixing_queryset = ShangpinLeixing.query.filter( - shenhezhuangtai=1 # 🔴 只取正常状态,排除审核专用 + shenheStatus=1 # 🔴 只取正常状态,排除审核专用 ).order_by('-paixu', 'id') # 🔴 构建返回数据列表 @@ -5752,11 +5752,11 @@ class DashouHuoquLeixingView(APIView): for leixing in leixing_queryset: leixing_list.append({ "id": leixing.id, - "jieshao": leixing.jieshao or "", - "tupian_url": leixing.tupian_url or "", - "yaoqiuleixing": leixing.yaoqiuleixing, - "huiyuan_id": leixing.huiyuan_id, - "yongjin": float(leixing.yongjin) if leixing.yongjin else None, + "jieshao": leixing.Description or "", + "tupian_url": leixing.ImageURL_url or "", + "yaoqiuleixing": leixing.GrabRequirement, + "huiyuan_id": leixing.MembershipID, + "yongjin": float(leixing.CommissionReq) if leixing.CommissionReq else None, "paixu": leixing.paixu or 0, "shenhezhuangtai": leixing.shenhezhuangtai or 1 }) @@ -5808,7 +5808,7 @@ class AdJuJueJieSuan(APIView): try: # 1. 获取参数 qianzhanghao = request.data.get('zhanghao', '').strip() - dingdan_id = request.data.get('dingdan_id', '').strip() + dingdan_id = request.data.get('OrderID', '').strip() tkly = request.data.get('tkly', '').strip() if not all([qianzhanghao, dingdan_id, tkly]): @@ -5836,21 +5836,21 @@ class AdJuJueJieSuan(APIView): # 5. 查询订单 try: - dingdan = Dingdan.query.get(dingdan_id=dingdan_id) - except Dingdan.DoesNotExist: + dingdan = Order.query.get(OrderID=dingdan_id) + except Order.DoesNotExist: return Response( {'code': 404, 'message': '订单不存在', 'data': None}, status=status.HTTP_404_NOT_FOUND ) # 6. 校验订单条件:平台发单(1)且状态为2或8 - if dingdan.fadan_pingtai != 1 or dingdan.zhuangtai not in [2, 8]: + if dingdan.Platform != 1 or dingdan.Status not in [2, 8]: return Response( {'code': 400, 'message': '仅平台发单且状态为进行中(2)或结算中(8)的订单可拒绝结算', 'data': None}, status=status.HTTP_400_BAD_REQUEST ) - jiedan_dashou_id = dingdan.jiedan_dashou_id + jiedan_dashou_id = dingdan.PlayerID if not jiedan_dashou_id: return Response( {'code': 400, 'message': '订单暂无接单打手', 'data': None}, @@ -5859,8 +5859,8 @@ class AdJuJueJieSuan(APIView): with transaction.atomic(): # 7. 更新订单状态为5(已退款),并保存拒绝理由 - dingdan.zhuangtai = 5 - dingdan.tkly = tkly + dingdan.Status = 5 + dingdan.RefundReason = tkly dingdan.save() # 8. 更新打手扩展表 @@ -5899,7 +5899,7 @@ class AdZhuanYiDaTing(APIView): def post(self, request): try: qianzhanghao = request.data.get('zhanghao', '').strip() - dingdan_id = request.data.get('dingdan_id', '').strip() + dingdan_id = request.data.get('OrderID', '').strip() if not all([qianzhanghao, dingdan_id]): return Response( @@ -5922,26 +5922,26 @@ class AdZhuanYiDaTing(APIView): ) try: - dingdan = Dingdan.query.get(dingdan_id=dingdan_id) - except Dingdan.DoesNotExist: + dingdan = Order.query.get(OrderID=dingdan_id) + except Order.DoesNotExist: return Response( {'code': 404, 'message': '订单不存在', 'data': None}, status=status.HTTP_404_NOT_FOUND ) # 校验订单状态:允许2、8、4 - if dingdan.zhuangtai not in [2, 8, 4]: + if dingdan.Status not in [2, 8, 4]: return Response( {'code': 400, 'message': '仅状态为进行中(2)、结算中(8)或退款审核(4)的订单可转移大厅', 'data': None}, status=status.HTTP_400_BAD_REQUEST ) - jiedan_dashou_id = dingdan.jiedan_dashou_id + jiedan_dashou_id = dingdan.PlayerID with transaction.atomic(): # 更新订单:状态改为1(下单中),清空接单打手ID - dingdan.zhuangtai = 1 - dingdan.jiedan_dashou_id = None + dingdan.Status = 1 + dingdan.PlayerID = None dingdan.save() # 如果有接单打手,更新其扩展表 @@ -5981,7 +5981,7 @@ class AdQuXiaoZhiDing(APIView): def post(self, request): try: qianzhanghao = request.data.get('zhanghao', '').strip() - dingdan_id = request.data.get('dingdan_id', '').strip() + dingdan_id = request.data.get('OrderID', '').strip() if not all([qianzhanghao, dingdan_id]): return Response( @@ -6004,15 +6004,15 @@ class AdQuXiaoZhiDing(APIView): ) try: - dingdan = Dingdan.query.get(dingdan_id=dingdan_id) - except Dingdan.DoesNotExist: + dingdan = Order.query.get(OrderID=dingdan_id) + except Order.DoesNotExist: return Response( {'code': 404, 'message': '订单不存在', 'data': None}, status=status.HTTP_404_NOT_FOUND ) # 校验订单状态:必须为7(指定中) - if dingdan.zhuangtai != 7: + if dingdan.Status != 7: return Response( {'code': 400, 'message': '仅状态为指定中(7)的订单可取消指定', 'data': None}, status=status.HTTP_400_BAD_REQUEST @@ -6020,8 +6020,8 @@ class AdQuXiaoZhiDing(APIView): with transaction.atomic(): # 更新订单:状态改为1(下单中),清空指定ID - dingdan.zhuangtai = 1 - dingdan.zhiding_id = None + dingdan.Status = 1 + dingdan.AssignedID = None dingdan.save() return Response({'code': 0, 'message': '取消指定成功', 'data': None}) @@ -6054,7 +6054,7 @@ class DashouXiugaiView(APIView): def post(self, request): # 获取请求数据 data = request.data - dingdan_id = data.get('dingdan_id', '') + dingdan_id = data.get('OrderID', '') liuyan = data.get('liuyan', '') deleted_images = data.get('deleted_images', []) new_images = data.get('new_images', []) @@ -6090,12 +6090,12 @@ class DashouXiugaiView(APIView): # ---------- 订单查询及权限验证 ---------- try: # 订单必须属于该打手,且状态为4(退款中)或8(结算中) - dingdan = Dingdan.query.get( - dingdan_id=dingdan_id, - jiedan_dashou_id=yonghuid, - zhuangtai__in=[4, 8] # 只允许修改退款中或结算中的订单 + dingdan = Order.query.get( + OrderID=dingdan_id, + PlayerID=yonghuid, + Status__in=[4, 8] # 只允许修改退款中或结算中的订单 ) - except Dingdan.DoesNotExist: + except Order.DoesNotExist: return Response({'code': 6, 'msg': '订单不存在或没有修改权限', 'data': None}, status=status.HTTP_403_FORBIDDEN) @@ -6105,9 +6105,9 @@ class DashouXiugaiView(APIView): # 1. 处理删除的图片:从 Dashoutupian 表中删除记录 if deleted_images: # 根据订单ID、打手ID和图片URL删除记录 - delete_count, _ = Dashoutupian.query.filter( - dingdan_id=dingdan_id, - dashou=yonghuid, + delete_count, _ = PlayerDeliveryImage.query.filter( + OrderID=dingdan_id, + PlayerID=yonghuid, tupian__in=deleted_images ).delete() # 可选:记录删除数量 @@ -6119,9 +6119,9 @@ class DashouXiugaiView(APIView): new_records = [] for url in new_images: new_records.append(Dashoutupian( - dingdan_id=dingdan_id, - dashou=yonghuid, - tupian=url, + OrderID=dingdan_id, + PlayerID=yonghuid, + ImageURL=url, create_time=timezone.now() )) Dashoutupian.objects.bulk_create(new_records) @@ -6130,9 +6130,9 @@ class DashouXiugaiView(APIView): # 3. 更新订单留言(如果发生变化) # 注意:即使留言为空字符串,也允许更新,表示清空留言 if 'liuyan' in data: # 判断是否传了liuyan字段(可能为空字符串) - dingdan.dashou_liuyan = liuyan - dingdan.update_time = timezone.now() - dingdan.save(update_fields=['dashou_liuyan', 'update_time']) + dingdan.PlayerRemark = liuyan + dingdan.UpdateTime = timezone.now() + dingdan.save(update_fields=['PlayerRemark', 'UpdateTime']) # 全部成功,返回成功响应 return Response({ @@ -6178,49 +6178,49 @@ class ZxsjghdsView(APIView): return Response({'code': 1, 'msg': '用户认证失败'}, status=status.HTTP_401_UNAUTHORIZED) # ========== 2. 提取订单ID ========== - dingdan_id = request.data.get('dingdan_id', '').strip() + dingdan_id = request.data.get('OrderID', '').strip() if not dingdan_id: return Response({'code': 2, 'msg': '订单ID不能为空'}, status=status.HTTP_400_BAD_REQUEST) # ========== 3. 查询订单并校验权限 ========== try: # 关联查询商家扩展表,确保当前商家是该订单的发布者 - shangjia_kuozhan = DingdanShangjia.query.select_related('dingdan').get( - dingdan__dingdan_id=dingdan_id, - shangjia_id=yonghuid + shangjia_kuozhan = MerchantOrderExt.query.select_related('Order').get( + Order__OrderID=dingdan_id, + MerchantID=yonghuid ) - except DingdanShangjia.DoesNotExist: + except MerchantOrderExt.DoesNotExist: return Response({'code': 3, 'msg': '订单不存在或您无权操作'}, status=status.HTTP_403_FORBIDDEN) - old_order = shangjia_kuozhan.dingdan + old_order = shangjia_kuozhan.Order # ========== 4. 状态校验(仅允许进行中或结算中) ========== - if old_order.zhuangtai not in [2, 8]: + if old_order.Status not in [2, 8]: return Response({'code': 4, 'msg': '当前订单状态不允许更换打手'}, status=status.HTTP_400_BAD_REQUEST) # ========== 5. 收集订单关键数据(用于新订单复制) ========== # 这些字段将在退款处理后用于创建新订单 - jine = old_order.jine - dashou_fencheng = old_order.dashou_fencheng - leixing_id = old_order.leixing_id - yaoqiuleixing = old_order.yaoqiuleixing - huiyuan_id = old_order.huiyuan_id - yongjin = old_order.yongjin - jieshao = old_order.jieshao - nicheng = old_order.nicheng - beizhu = old_order.beizhu - user1_id = old_order.user1_id - tupian = old_order.tupian - fadan_pingtai = old_order.fadan_pingtai + jine = old_order.Amount + dashou_fencheng = old_order.PlayerCommission + leixing_id = old_order.ProductTypeID + yaoqiuleixing = old_order.GrabRequirement + huiyuan_id = old_order.MembershipID + yongjin = old_order.CommissionReq + jieshao = old_order.Description + nicheng = old_order.Nickname + beizhu = old_order.Remark + user1_id = old_order.User1ID + tupian = old_order.ImageURL + fadan_pingtai = old_order.Platform - dashou_id = old_order.jiedan_dashou_id # 可能为空 + dashou_id = old_order.PlayerID # 可能为空 # ========== 6. 退款处理(事务块1:退款原订单 + 打手统计 + 跨平台通知) ========== try: with transaction.atomic(): # 6.1 订单状态更新为已退款 - old_order.zhuangtai = 5 - old_order.save(update_fields=['zhuangtai']) + old_order.Status = 5 + old_order.save(update_fields=['Status']) # 6.2 释放打手 if dashou_id: @@ -6229,13 +6229,13 @@ class ZxsjghdsView(APIView): dashou_profile = dashou_user.dashou_profile dashou_profile.tuikuanliang = (dashou_profile.tuikuanliang or 0) + 1 dashou_profile.zhuangtai = 1 # 空闲 - dashou_profile.save(update_fields=['tuikuanliang', 'zhuangtai']) + dashou_profile.save(update_fields=['tuikuanliang', 'Status']) except (User.DoesNotExist, ObjectDoesNotExist): logger.warning(f"打手 {dashou_id} 不存在或扩展表缺失,跳过更新") # 6.3 更新退款记录 - Tuikuanjilu.query.update_or_create( - dingdan_id=dingdan_id, + RefundRecord.query.update_or_create( + OrderID=dingdan_id, defaults={ 'dashouid': dashou_id or '', 'qingqiuid': yonghuid, # 申请人为当前商家 @@ -6243,9 +6243,9 @@ class ZxsjghdsView(APIView): 'liyou': '商家更换打手', 'sqzhuangtai': 1, # 状态 1=成功 'jine': jine or 0, - 'dashou_fencheng': dashou_fencheng or 0, - 'jieshao': jieshao or '', - 'beizhu': '更换打手系统自动退款', + 'PlayerCommission': dashou_fencheng or 0, + 'Description': jieshao or '', + 'Remark': '更换打手系统自动退款', 'nicheng': nicheng or '', } ) @@ -6254,7 +6254,7 @@ class ZxsjghdsView(APIView): if dashou_id: try: update_dashou_daily_by_action( - yonghuid=dashou_id, + UserID=dashou_id, amount=dashou_fencheng, action=3 # 3=退款 ) @@ -6278,39 +6278,39 @@ class ZxsjghdsView(APIView): new_dingdan_id = generate_dingdan_id() # 确保唯一 - while Dingdan.query.filter(dingdan_id=new_dingdan_id).exists(): + while Order.query.filter(OrderID=new_dingdan_id).exists(): new_dingdan_id = generate_dingdan_id() # 7.2 创建新订单(复制数据,状态为 1) - new_order = Dingdan.query.create( - dingdan_id=new_dingdan_id, - zhuangtai=1, # 已下单 - fadan_pingtai=fadan_pingtai, - jine=jine, - dashou_fencheng=dashou_fencheng, - leixing_id=leixing_id, - yaoqiuleixing=yaoqiuleixing, - huiyuan_id=huiyuan_id, - yongjin=yongjin, - jieshao=jieshao, - nicheng=nicheng, - beizhu=beizhu, - user1_id=user1_id, # 商家标识 - tupian=tupian, + new_order = Order.query.create( + OrderID=new_dingdan_id, + Status=1, # 已下单 + Platform=fadan_pingtai, + Amount=jine, + PlayerCommission=dashou_fencheng, + ProductTypeID=leixing_id, + GrabRequirement=yaoqiuleixing, + MembershipID=huiyuan_id, + CommissionReq=yongjin, + Description=jieshao, + Nickname=nicheng, + Remark=beizhu, + User1ID=user1_id, # 商家标识 + ImageURL=tupian, # 不继承:zhiding_id, jiedan_dashou_id, dashou_liuyan 等 ) # 7.3 创建商家扩展表(关联新订单) - DingdanShangjia.query.create( - dingdan=new_order, - shangjia_id=yonghuid, - sjnicheng=shangjia_kuozhan.sjnicheng or '', + MerchantOrderExt.query.create( + Order=new_order, + MerchantID=yonghuid, + MerchantNickname=shangjia_kuozhan.MerchantNickname or '', ) # 7.4 异步通知打手(广播新订单) try: order_info = { - 'dingdan_id': new_dingdan_id, + 'OrderID': new_dingdan_id, 'game_type': self._get_game_type_name(leixing_id), 'amount': str(jine), 'order_desc': (jieshao or '')[:50], @@ -6339,7 +6339,7 @@ class ZxsjghdsView(APIView): """根据类型ID获取游戏类型名称""" try: gt = ShangpinLeixing.query.filter(id=leixing_id).first() - return gt.jieshao if gt else '游戏订单' + return gt.Description if gt else '游戏订单' except Exception: return '游戏订单' @@ -6376,7 +6376,7 @@ class ShangjiaFakuanApplyView(APIView): return Response({'code': 1, 'msg': '用户认证失败'}, status=status.HTTP_401_UNAUTHORIZED) # ========== 2. 参数提取与校验 ========== - dingdan_id = request.data.get('dingdan_id', '').strip() + dingdan_id = request.data.get('OrderID', '').strip() chufa_liyou = request.data.get('chufa_liyou', '').strip() fakuanjine = request.data.get('fakuanjine', 0) yingxiang_qiangdan = int(request.data.get('yingxiang_qiangdan', 1)) @@ -6394,35 +6394,35 @@ class ShangjiaFakuanApplyView(APIView): # ========== 3. 获取订单,校验归属商家 ========== try: # 关联查询商家扩展表,确保订单属于当前商家 - shangjia_kuozhan = DingdanShangjia.query.select_related('dingdan').get( - dingdan__dingdan_id=dingdan_id, - shangjia_id=shangjia_id + shangjia_kuozhan = MerchantOrderExt.query.select_related('Order').get( + Order__OrderID=dingdan_id, + MerchantID=shangjia_id ) - order = shangjia_kuozhan.dingdan - except DingdanShangjia.DoesNotExist: + order = shangjia_kuozhan.Order + except MerchantOrderExt.DoesNotExist: return Response({'code': 3, 'msg': '订单不存在或您无权操作'}, status=status.HTTP_403_FORBIDDEN) # ========== 4. 获取被打手ID ========== - dashou_id = order.jiedan_dashou_id + dashou_id = order.PlayerID if not dashou_id: return Response({'code': 4, 'msg': '该订单暂无接单打手,无法罚款'}, status=status.HTTP_400_BAD_REQUEST) # ========== 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': 5, 'msg': '该打手在此订单已被罚款,不能重复申请'}, status=status.HTTP_400_BAD_REQUEST) # ========== 6. 本地创建罚单 ========== with transaction.atomic(): - Fadan.query.create( - beichufa_id=dashou_id, - shenqing_chufa=shangjia_id, # 申请人为当前商家 + Penalty.query.create( + PenalizedUserID=dashou_id, + ApplicantID=shangjia_id, # 申请人为当前商家 shenfen=1, # 被打者身份:1=打手 - chufaliyou=chufa_liyou, - fakuanjine=fakuanjine, - guanliandingdan_id=dingdan_id, - zhuangtai=1, # 待缴纳 - yingxiang_qiangdan=yingxiang_qiangdan, - shenqingren_shenfen=5, # 申请人是商家 + Reason=chufa_liyou, + fakuanAmount=fakuanjine, + RelatedOrderID=dingdan_id, + Status=1, # 待缴纳 + AffectsGrabbing=yingxiang_qiangdan, + ApplicantIdentity=5, # 申请人是商家 ) logger.info(f"商家{shangjia_id}对订单{dingdan_id}打手{dashou_id}罚款成功,金额{fakuanjine}") return Response({'code': 0, 'msg': '罚款申请已提交'}) @@ -6446,16 +6446,16 @@ class ShangjiaFakuaiXiugaiView(APIView): return Response({'code': 403, 'msg': '商家状态异常'}, status=status.HTTP_403_FORBIDDEN) operation = request.data.get('operation') - dingdan_id = request.data.get('dingdan_id') + dingdan_id = request.data.get('OrderID') if not dingdan_id: return Response({'code': 400, 'msg': '缺少订单ID'}, status=status.HTTP_400_BAD_REQUEST) # 验证订单属于该商家 try: - dingdan = Dingdan.query.select_related('shangjia_kuozhan').get(dingdan_id=dingdan_id) - except Dingdan.DoesNotExist: + dingdan = Order.query.select_related('shangjia_kuozhan').get(OrderID=dingdan_id) + except Order.DoesNotExist: return Response({'code': 404, 'msg': '订单不存在'}, status=status.HTTP_404_NOT_FOUND) - if not hasattr(dingdan, 'shangjia_kuozhan') or dingdan.shangjia_kuozhan.shangjia_id != user.yonghuid: + if not hasattr(dingdan, 'shangjia_kuozhan') or dingdan.shangjia_kuozhan.MerchantID != user.yonghuid: return Response({'code': 403, 'msg': '无权操作此订单'}, status=status.HTTP_403_FORBIDDEN) # 处理订单相关操作 @@ -6469,10 +6469,10 @@ class ShangjiaFakuaiXiugaiView(APIView): if not fadan_id: return Response({'code': 400, 'msg': '缺少罚单ID'}, status=status.HTTP_400_BAD_REQUEST) try: - fadan = Fadan.query.get(id=fadan_id) + fadan = Penalty.query.get(id=fadan_id) except Fadan.DoesNotExist: return Response({'code': 404, 'msg': '罚单不存在'}, status=status.HTTP_404_NOT_FOUND) - if fadan.guanliandingdan_id != dingdan_id: + if fadan.RelatedOrderID != dingdan_id: return Response({'code': 403, 'msg': '罚单与订单不匹配'}, status=status.HTTP_403_FORBIDDEN) if operation == 'modify_penalty': @@ -6486,29 +6486,29 @@ class ShangjiaFakuaiXiugaiView(APIView): def _cancel_refund(self, dingdan, liyou): """撤销退款申请(状态4 → 状态8,清空退款理由)""" - if dingdan.zhuangtai != 4: + if dingdan.Status != 4: return Response({'code': 400, 'msg': '只有退款中的订单可以撤销退款申请'}) with transaction.atomic(): - dingdan.zhuangtai = 8 - dingdan.tkly = '' # 清空退款理由 + dingdan.Status = 8 + dingdan.RefundReason = '' # 清空退款理由 dingdan.save() # 记录撤销理由可存入日志(如需要可另建日志表,此处简单处理) - logger.info(f"商家撤销退款订单 {dingdan.dingdan_id},理由: {liyou}") + logger.info(f"商家撤销退款订单 {dingdan.OrderID},理由: {liyou}") return Response({'code': 0, 'msg': '已撤销退款申请'}) def _modify_refund_reason(self, dingdan, liyou): """修改退款理由(仅状态4时)""" - if dingdan.zhuangtai != 4: + if dingdan.Status != 4: return Response({'code': 400, 'msg': '只有退款中的订单可以修改退款理由'}) if not liyou.strip(): return Response({'code': 400, 'msg': '退款理由不能为空'}) - dingdan.tkly = liyou[:500] + dingdan.RefundReason = liyou[:500] dingdan.save() return Response({'code': 0, 'msg': '退款理由修改成功'}) def _modify_penalty(self, fadan, liyou, jine_str): """修改罚款(仅状态1待缴纳 或 3申诉中)""" - if fadan.zhuangtai not in (1, 3): + if fadan.Status not in (1, 3): return Response({'code': 400, 'msg': '当前罚单状态不可修改'}) if not liyou.strip(): return Response({'code': 400, 'msg': '罚款理由不能为空'}) @@ -6519,27 +6519,27 @@ class ShangjiaFakuaiXiugaiView(APIView): except: return Response({'code': 400, 'msg': '罚款金额必须为正数'}) with transaction.atomic(): - fadan.chufaliyou = liyou[:500] - fadan.fakuanjine = jine + fadan.Reason = liyou[:500] + fadan.FineAmount = jine # 如果之前是驳回状态修改,需要重置状态为待缴纳?不,修改不应改变状态 fadan.save() return Response({'code': 0, 'msg': '罚款修改成功'}) def _cancel_penalty(self, fadan, liyou): """撤销罚款(状态1或3 → 状态4 已驳回)""" - if fadan.zhuangtai not in (1, 3): + if fadan.Status not in (1, 3): return Response({'code': 400, 'msg': '当前罚单状态不可撤销'}) if not liyou.strip(): return Response({'code': 400, 'msg': '驳回理由不能为空'}) with transaction.atomic(): - fadan.zhuangtai = 4 # 已驳回 - fadan.bohuiliyou = liyou[:500] + fadan.Status = 4 # 已驳回 + fadan.RejectReason = liyou[:500] fadan.save() return Response({'code': 0, 'msg': '罚款已撤销(驳回)'}) def _resubmit_penalty(self, fadan, liyou, jine_str): """再次申请罚款(状态4 → 状态1,修改理由和金额)""" - if fadan.zhuangtai != 4: + if fadan.Status != 4: return Response({'code': 400, 'msg': '只有已驳回的罚单可再次申请'}) if not liyou.strip(): return Response({'code': 400, 'msg': '罚款理由不能为空'}) @@ -6550,9 +6550,9 @@ class ShangjiaFakuaiXiugaiView(APIView): except: return Response({'code': 400, 'msg': '罚款金额必须为正数'}) with transaction.atomic(): - fadan.zhuangtai = 1 # 待缴纳 - fadan.chufaliyou = liyou[:500] - fadan.fakuanjine = jine - fadan.bohuiliyou = '' # 清空驳回理由 + fadan.Status = 1 # 待缴纳 + fadan.Reason = liyou[:500] + fadan.FineAmount = jine + fadan.RejectReason = '' # 清空驳回理由 fadan.save() return Response({'code': 0, 'msg': '已重新申请罚款'}) \ No newline at end of file diff --git a/products/views.py b/products/views.py index 575fab0..a820e71 100644 --- a/products/views.py +++ b/products/views.py @@ -50,10 +50,10 @@ from users.models import ( ) from gvsdsdk.models import User -from orders.models import Lilubiao +from orders.models import CommissionRate from config.models import Szjilu, Gonggao, Lunbo -from orders.models import Fadan # 用于罚款类型 +from orders.models import Penalty # 用于罚款类型 import traceback @@ -615,7 +615,7 @@ class YajinHuitiao(View): logger.info(f"打手押金更新成功: 用户{order.yonghuid}, 增加{order_amount_yuan}元, 新押金{dashou.yajin}") - # 8b. 押金分红(仅微信确认到账后;费率 Lilubiao fadanpingtai=12) + # 8b. 押金分红(仅微信确认到账后;费率 CommissionRate Platform=12) try: guanshi_id = dashou.yaoqingren @@ -624,8 +624,8 @@ class YajinHuitiao(View): elif Gsfenhong.query.filter(dingdan_id=order.dingdan_id).exists(): logger.info(f"押金分红已处理: 订单{order.dingdan_id}") else: - lilu_obj = Lilubiao.query.filter(fadanpingtai='12').first() - rate = lilu_obj.lilu if lilu_obj and lilu_obj.lilu is not None else Decimal('0') + lilu_obj = CommissionRate.query.filter(Platform='12').first() + rate = lilu_obj.Rate if lilu_obj and lilu_obj.Rate is not None else Decimal('0') if rate <= 0: logger.info(f"押金分红跳过: 费率未配置或为0") else: @@ -6036,7 +6036,7 @@ class CzhqdyView(APIView): 'name': '打手押金抵扣', 'profile_attr': 'dashou_profile', # 与打手佣金共用扩展表 'balance_field': 'yajin', # 押金字段 - 'rate_key': '11', # 押金提现费率对应的 fadanpingtai + 'rate_key': '11', # 押金提现费率对应的 Platform 'model': UserDashou, }, ] @@ -6089,18 +6089,18 @@ class CzhqdyView(APIView): elif leixing == 4: # 罚款缴纳 try: - fadan = Fadan.query.get(id=fadan_id, beichufa_id=user.yonghuid) - target_price = fadan.fakuanjine - except Fadan.DoesNotExist: + fadan = Penalty.query.get(id=fadan_id, PenalizedUserID=user.yonghuid) + target_price = fadan.FineAmount + except Penalty.DoesNotExist: return Response({'code': 404, 'msg': '罚单不存在或不属于当前用户'}, status=status.HTTP_404_NOT_FOUND) # 获取所有费率(打手佣金、管事分红、组长分红、打手押金) rates = {} for key in ['5', '6', '8', '11']: try: - rate_obj = Lilubiao.query.get(fadanpingtai=key) - rates[key] = rate_obj.lilu - except Lilubiao.DoesNotExist: + rate_obj = CommissionRate.query.get(Platform=key) + rates[key] = rate_obj.Rate + except CommissionRate.DoesNotExist: rates[key] = None # 未配置则跳过 # 构建可用身份列表 @@ -6228,18 +6228,18 @@ class DsqrgmdhView(APIView): if not fadan_id: return Response({'code': 400, 'msg': '缺少罚单ID'}, status=status.HTTP_400_BAD_REQUEST) try: - fadan_obj = Fadan.query.get(id=fadan_id, beichufa_id=request.user.yonghuid) - target_price = fadan_obj.fakuanjine - except Fadan.DoesNotExist: + fadan_obj = Penalty.query.get(id=fadan_id, PenalizedUserID=request.user.yonghuid) + target_price = fadan_obj.FineAmount + except Penalty.DoesNotExist: return Response({'code': 404, 'msg': '罚单不存在或不属于当前用户'}, status=status.HTTP_404_NOT_FOUND) identity = IDENTITY_CONFIG.get(shenfen_id) try: - rate_obj = Lilubiao.query.get(fadanpingtai=identity['rate_key']) - rate = rate_obj.lilu + rate_obj = CommissionRate.query.get(Platform=identity['rate_key']) + rate = rate_obj.Rate if rate >= 1: return Response({'code': 400, 'msg': f"{identity['name']}费率异常"}, status=status.HTTP_400_BAD_REQUEST) - except Lilubiao.DoesNotExist: + except CommissionRate.DoesNotExist: return Response({'code': 400, 'msg': f"{identity['name']}费率未配置"}, status=status.HTTP_400_BAD_REQUEST) logger.info(f"目标价格={target_price}, 费率={rate}") diff --git a/rank/migrations/0002_alter_dashoubiaoxian_dingdan_and_more.py b/rank/migrations/0002_alter_dashoubiaoxian_dingdan_and_more.py new file mode 100644 index 0000000..19e9a1e --- /dev/null +++ b/rank/migrations/0002_alter_dashoubiaoxian_dingdan_and_more.py @@ -0,0 +1,25 @@ +# Generated by Django 4.2.27 on 2026-06-18 17:46 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('orders', '0002_chatsession_commissionrate_escortorder_and_more'), + ('rank', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='dashoubiaoxian', + name='dingdan', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='biaoxian', to='orders.order', to_field='OrderID', verbose_name='关联订单'), + ), + migrations.AlterField( + model_name='dingdanbiaoqian', + name='dingdan', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='orders.order', to_field='OrderID', verbose_name='订单'), + ), + ] diff --git a/rank/models.py b/rank/models.py index a2aac2b..1da761e 100644 --- a/rank/models.py +++ b/rank/models.py @@ -1,7 +1,7 @@ from django.db import models from gvsdsdk.model_base import QModel from django.conf import settings -from orders.models import Dingdan +from orders.models import Order # ==================== 板块表 ==================== class Bankuai(QModel): @@ -20,7 +20,7 @@ class Bankuai(QModel): # ==================== 打手订单表现记录 ==================== class DashouBiaoxian(QModel): - dingdan = models.ForeignKey('orders.Dingdan', to_field='dingdan_id', on_delete=models.CASCADE, related_name='biaoxian', verbose_name='关联订单', db_index=True) + dingdan = models.ForeignKey('orders.Order', to_field='OrderID', on_delete=models.CASCADE, related_name='biaoxian', verbose_name='关联订单', db_index=True) dashou_id = models.CharField(max_length=32, db_index=True, verbose_name='打手ID') bankuai = models.ForeignKey(Bankuai, on_delete=models.PROTECT, to_field='bankuai_id', verbose_name='所属板块', db_index=True,null=True) @@ -98,8 +98,8 @@ class YonghuChenghao(QModel): class DingdanBiaoqian(QModel): """订单需求标签关联表""" dingdan = models.ForeignKey( - Dingdan, - to_field='dingdan_id', # 关联到字符串字段 dingdan_id + Order, + to_field='OrderID', # 关联到字符串字段 OrderID on_delete=models.CASCADE, verbose_name='订单', db_index=True diff --git a/shop/views.py b/shop/views.py index ffd5b11..37a2a2c 100644 --- a/shop/views.py +++ b/shop/views.py @@ -50,8 +50,8 @@ from shop.models import YonghuDianpuBangding, ShangpinLeixingDianpu, DianpuShang from products.models import ShangpinLeixing, ShangpinZhuanqu, Shangpin, Huiyuan from orders.models import ( - Dingdan, DingdanPingtai, Dashoutupian, Tuikuanjilu, - OrderDashouHistory, Fadan + Order, PlatformOrderExt, PlayerDeliveryImage, RefundRecord, + OrderPlayerHistory, Penalty ) logger = logging.getLogger(__name__) @@ -2124,8 +2124,8 @@ class ShopOrderStatisticsView(APIView): # 3. 获取本店铺所有订单的主键ID列表(通过平台扩展表) order_pks = list( - DingdanPingtai.query.filter(dianpu_id=shop_id) - .values_list('dingdan_id', flat=True) # 这里取的是订单主表的主键id + PlatformOrderExt.query.filter(dianpu_id=shop_id) + .values_list('Order_id', flat=True) # 这里取的是订单主表的主键id ) total_orders = 0 @@ -2134,15 +2134,15 @@ class ShopOrderStatisticsView(APIView): if order_pks: # 4. 用主键列表进行聚合统计,按商品类型和订单状态分组 aggregation = ( - Dingdan.objects + Order.objects .filter(id__in=order_pks) # 修正点:使用id__in,而不是dingdan_id__in - .values('leixing_id', 'zhuangtai') + .values('ProductTypeID', 'Status') .annotate(cnt=Count('id')) ) for row in aggregation: - lid = row['leixing_id'] # 商品类型ID - st = row['zhuangtai'] # 订单状态码 + lid = row['ProductTypeID'] # 商品类型ID + st = row['Status'] # 订单状态码 cnt = row['cnt'] # 转为字符串键,方便前端展示 @@ -2217,12 +2217,12 @@ def _fetch_images(order, oss_domain): punishment_info = {} # 仅当订单有接单打手ID时才查询打手图片 - if order.jiedan_dashou_id: + if order.PlayerID: # 从打手图片表中查询该订单、该打手的所有图片记录 - image_urls = Dashoutupian.query.filter( - dingdan_id=order.dingdan_id, # 订单ID匹配 - dashou=order.jiedan_dashou_id # 接单打手ID匹配 - ).values_list('tupian', flat=True) # 只取图片URL字段 + image_urls = PlayerDeliveryImage.query.filter( + OrderID=order.OrderID, # 订单ID匹配 + PlayerID=order.PlayerID # 接单打手ID匹配 + ).values_list('ImageURL', flat=True) # 只取图片URL字段 # 遍历所有图片路径 for img_path in image_urls: @@ -2258,7 +2258,7 @@ def _batch_images(orders, oss_domain): with ThreadPoolExecutor(max_workers=10) as executor: # 建立 future 到订单ID的映射 future_to_oid = { - executor.submit(_fetch_images, order, oss_domain): order.dingdan_id + executor.submit(_fetch_images, order, oss_domain): order.OrderID for order in orders } # 等待所有任务完成 @@ -2353,9 +2353,9 @@ class ShopOrderManageView(APIView): # ------------------------------------------------------------ # 从 DingdanPingtai 中过滤出属于当前店铺的订单扩展记录,并提取订单主表ID order_ids = list( - DingdanPingtai.query.filter( + PlatformOrderExt.query.filter( dianpu_id=shop_id # 店铺ID匹配 - ).values_list('dingdan_id', flat=True) # 只取订单ID字段 + ).values_list('Order_id', flat=True) # 只取订单ID字段 ) # 统计变量 @@ -2367,11 +2367,11 @@ class ShopOrderManageView(APIView): # ------------------------------------------------------------ if order_ids: # 使用 Django 聚合查询:按 leixing_id(商品类型)和 zhuangtai(订单状态)分组计数 - aggregation = Dingdan.query.filter( - dingdan_id__in=order_ids # 从该店铺的订单中查询 + aggregation = Order.query.filter( + OrderID__in=order_ids # 从该店铺的订单中查询 ).values( - 'leixing_id', # 按类型ID分组 - 'zhuangtai' # 按状态分组 + 'ProductTypeID', # 按类型ID分组 + 'Status' # 按状态分组 ).annotate( cnt=Count('id') # 统计每个分组的记录数 ) @@ -2379,8 +2379,8 @@ class ShopOrderManageView(APIView): # 遍历每个聚合结果,累加到对应的类型和全局计数中 for row in aggregation: # 提取分组字段 - lid = row['leixing_id'] # 商品类型ID - st = row['zhuangtai'] # 订单状态码 + lid = row['ProductTypeID'] # 商品类型ID + st = row['Status'] # 订单状态码 cnt = row['cnt'] # 该分组下的订单数量 # 累加到全局总数 @@ -2434,25 +2434,25 @@ class ShopOrderManageView(APIView): page_size = request.data.get('page_size', 20) # 基础查询:从平台扩展表关联订单主表,并按创建时间倒序 - qs = DingdanPingtai.query.filter( + qs = PlatformOrderExt.query.filter( dianpu_id=shop_id - ).select_related('dingdan').order_by('-dingdan__create_time') + ).select_related('Order').order_by('-Order__CreateTime') # 应用筛选条件 if leixing_id is not None: - qs = qs.filter(dingdan__leixing_id=leixing_id) + qs = qs.filter(Order__ProductTypeID=leixing_id) if zhuangtai is not None: - qs = qs.filter(dingdan__zhuangtai=zhuangtai) + qs = qs.filter(Order__Status=zhuangtai) if dingdan_id_key: - qs = qs.filter(dingdan__dingdan_id__icontains=dingdan_id_key) + qs = qs.filter(Order__OrderID__icontains=dingdan_id_key) if jiedan_dashou_id_key: - qs = qs.filter(dingdan__jiedan_dashou_id=jiedan_dashou_id_key) + qs = qs.filter(Order__PlayerID=jiedan_dashou_id_key) if nicheng_key: - qs = qs.filter(dingdan__nicheng__icontains=nicheng_key) + qs = qs.filter(Order__Nickname__icontains=nicheng_key) if laoban_id_key: - qs = qs.filter(laoban_id=laoban_id_key) + qs = qs.filter(BossID=laoban_id_key) if jieshao_key: - qs = qs.filter(dingdan__jieshao__icontains=jieshao_key) + qs = qs.filter(Order__Description__icontains=jieshao_key) # 分页 paginator = Paginator(qs, page_size) @@ -2462,7 +2462,7 @@ class ShopOrderManageView(APIView): page_obj = paginator.page(1) # 获取当前页的所有订单和扩展对象 - orders_with_ext = [(item.dingdan, item) for item in page_obj] + orders_with_ext = [(item.Order, item) for item in page_obj] # 提取订单对象列表,用于并发获取图片 order_objs = [order for order, _ in orders_with_ext] oss_domain = get_oss_domain() @@ -2471,27 +2471,27 @@ class ShopOrderManageView(APIView): # 构建返回数据 list_data = [] for order, ext in orders_with_ext: - imgs, is_pun, _ = img_map.get(order.dingdan_id, ([], False, {})) + imgs, is_pun, _ = img_map.get(order.OrderID, ([], False, {})) list_data.append({ - 'dingdan_id': order.dingdan_id, - 'zhuangtai': order.zhuangtai, - 'jine': float(order.jine) if order.jine else 0.00, - 'dashou_fencheng': float(order.dashou_fencheng) if order.dashou_fencheng else 0.00, - 'jiedan_dashou_id': order.jiedan_dashou_id or '', + 'dingdan_id': order.OrderID, + 'zhuangtai': order.Status, + 'jine': float(order.Amount) if order.Amount else 0.00, + 'dashou_fencheng': float(order.PlayerCommission) if order.PlayerCommission else 0.00, + 'jiedan_dashou_id': order.PlayerID or '', 'dashou_liuyan': order.dashou_liuyan or '', 'zhiding_id': order.zhiding_id or '', - 'shangpin_id': order.shangpin_id or '', - 'tupian': order.tupian or '', - 'jieshao': order.jieshao or '', - 'beizhu': order.beizhu or '', - 'nicheng': order.nicheng or '', - 'leixing_id': order.leixing_id, - 'create_time': order.create_time.strftime('%Y-%m-%d %H:%M:%S') if order.create_time else '', - 'update_time': order.update_time.strftime('%Y-%m-%d %H:%M:%S') if order.update_time else '', + 'shangpin_id': order.ProductID or '', + 'tupian': order.ImageURL or '', + 'jieshao': order.Description or '', + 'beizhu': order.Remark or '', + 'nicheng': order.Nickname or '', + 'leixing_id': order.ProductTypeID, + 'create_time': order.CreateTime.strftime('%Y-%m-%d %H:%M:%S') if order.CreateTime else '', + 'update_time': order.UpdateTime.strftime('%Y-%m-%d %H:%M:%S') if order.UpdateTime else '', 'pingtai_kuozhan': { - 'laoban_id': ext.laoban_id or '', - 'laoban_pingjia': ext.laoban_pingjia or '', - 'dianpu_shouyi': float(ext.dianpu_shouyi) if ext.dianpu_shouyi else 0.00, + 'laoban_id': ext.BossID or '', + 'laoban_pingjia': ext.BossReview or '', + 'dianpu_shouyi': float(ext.ShopIncome) if ext.ShopIncome else 0.00, }, 'dashou_images': imgs, 'is_punished': is_pun, @@ -2554,19 +2554,19 @@ class ShopRefundView(APIView): # 3. 查询订单,必须属于本店铺(通过扩展表关联) try: # 通过扩展表确认归属,并 select_related 获取订单主表 - pingtai_ext = DingdanPingtai.query.select_related('dingdan').get( + pingtai_ext = PlatformOrderExt.query.select_related('Order').get( dianpu_id=shop_id, - dingdan__dingdan_id=dingdan_id + Order__OrderID=dingdan_id ) - order = pingtai_ext.dingdan - except DingdanPingtai.DoesNotExist: + order = pingtai_ext.Order + except PlatformOrderExt.DoesNotExist: logger.warning(f"订单 {dingdan_id} 不属于店铺 {shop_id} 或不存在") return Response({'code': 404, 'msg': '订单不存在或不属于本店铺'}) # 4. 订单状态校验(只有这些状态可退款) allowed_statuses = [1, 7, 2, 8, 4] - if order.zhuangtai not in allowed_statuses: - logger.warning(f"订单状态不允许退款: {order.zhuangtai}") + if order.Status not in allowed_statuses: + logger.warning(f"订单状态不允许退款: {order.Status}") return Response({'code': 400, 'msg': '订单状态不允许退款'}) # 5. 全部视为平台订单(我方派单),调用微信退款 @@ -2575,14 +2575,14 @@ class ShopRefundView(APIView): return Response({'code': 400, 'msg': refund_result['msg']}) # 6. 事务内更新订单、打手、记录、统计 - dashou_id = order.jiedan_dashou_id + dashou_id = order.PlayerID try: with transaction.atomic(): # 更新订单状态为已退款 - order.zhuangtai = 5 - order.clkf = str(shop_id) # 处理人记录为店铺ID + order.Status = 5 + order.AssignedCS = str(shop_id) # 处理人记录为店铺ID if reason: - order.tkly = reason + order.RefundReason = reason order.save() # 更新打手统计(退款量+1,状态置为空闲) @@ -2603,7 +2603,7 @@ class ShopRefundView(APIView): try: update_dashou_daily_by_action( yonghuid=dashou_id, - amount=order.dashou_fencheng or Decimal('0.00'), + amount=order.PlayerCommission or Decimal('0.00'), action=3 # 3 表示退款 ) except Exception as e: @@ -2611,25 +2611,25 @@ class ShopRefundView(APIView): # 更新平台支出记录 try: - update_daily_payout(order.jine) + update_daily_payout(order.Amount) except Exception as e: logger.error(f"更新每日支出失败: {e}") # ========== 新增:商品和店铺每日统计 ========== try: # 商品每日统计(只要有商品ID就执行) - if order.shangpin_id: + if order.ProductID: # 从扩展表获取已计算好的收益值(下单时已存储) pingtai_shouyi = Decimal('0.00') dianpu_shouyi = Decimal('0.00') if hasattr(order, 'pingtai_kuozhan'): - pingtai_shouyi = order.pingtai_kuozhan.pingtai_shouyi or Decimal('0.00') - dianpu_shouyi = order.pingtai_kuozhan.dianpu_shouyi or Decimal('0.00') + pingtai_shouyi = order.pingtai_kuozhan.PlatformIncome or Decimal('0.00') + dianpu_shouyi = order.pingtai_kuozhan.ShopIncome or Decimal('0.00') update_shangpin_daily_stat( - shangpin_id=order.shangpin_id, + shangpin_id=order.ProductID, caozuo_leixing=3, # 3 = 退款 - dingdan_jiage=order.jine, + dingdan_jiage=order.Amount, pingtai_shouyi=pingtai_shouyi, dianpu_zongshouyi=dianpu_shouyi ) @@ -2640,11 +2640,11 @@ class ShopRefundView(APIView): if hasattr(order, 'pingtai_kuozhan'): dianpu_id = order.pingtai_kuozhan.dianpu_id if dianpu_id: - dianpu_shouyi = order.pingtai_kuozhan.dianpu_shouyi or Decimal('0.00') + dianpu_shouyi = order.pingtai_kuozhan.ShopIncome or Decimal('0.00') update_dianpu_daily_stat( dianpu_id=dianpu_id, caozuo_leixing=3, # 3 = 退款 - dingdan_jiage=order.jine, + dingdan_jiage=order.Amount, dianpu_shouyi=dianpu_shouyi ) logger.info(f"店铺统计更新完成,店铺ID: {dianpu_id}") @@ -2672,8 +2672,8 @@ class ShopRefundView(APIView): if not all([appid, mch_id, key, cert_path, key_path]): return {'code': 500, 'msg': '微信支付配置不完整'} - out_refund_no = self._generate_refund_no(order.dingdan_id) - total_fee = int(float(order.jine or 0) * 100) + out_refund_no = self._generate_refund_no(order.OrderID) + total_fee = int(float(order.Amount or 0) * 100) refund_fee = total_fee params = { @@ -2685,10 +2685,10 @@ class ShopRefundView(APIView): 'refund_fee': refund_fee, 'refund_desc': '店铺退款', } - if order.wechat_transaction_id: - params['transaction_id'] = order.wechat_transaction_id + if order.WechatTransactionID: + params['transaction_id'] = order.WechatTransactionID else: - params['out_trade_no'] = order.dingdan_id + params['out_trade_no'] = order.OrderID # 签名 sorted_keys = sorted(params.keys()) @@ -2718,26 +2718,26 @@ class ShopRefundView(APIView): def _update_refund_record(self, order, dashou_id, chuli_id, reason): """更新退款记录表""" try: - refund_record, created = Tuikuanjilu.query.get_or_create( - dingdan_id=order.dingdan_id, + refund_record, created = RefundRecord.query.get_or_create( + OrderID=order.OrderID, defaults={ - 'dashouid': dashou_id or '', - 'qingqiuid': '', - 'chuliid': chuli_id, - 'liyou': reason or '店铺退款', - 'sqzhuangtai': 1, - 'jine': order.jine or 0, - 'dashou_fencheng': order.dashou_fencheng or 0, - 'jieshao': order.jieshao or '', - 'beizhu': '店铺退款', - 'nicheng': order.nicheng or '', + 'PlayerID': dashou_id or '', + 'ApplicantID': '', + 'ProcessorID': chuli_id, + 'Reason': reason or '店铺退款', + 'ApplyStatus': 1, + 'Amount': order.Amount or 0, + 'PlayerCommission': order.PlayerCommission or 0, + 'Description': order.Description or '', + 'Remark': '店铺退款', + 'Nickname': order.Nickname or '', } ) if not created: - refund_record.sqzhuangtai = 1 - refund_record.chuliid = chuli_id + refund_record.ApplyStatus = 1 + refund_record.ProcessorID = chuli_id if reason: - refund_record.liyou = reason + refund_record.Reason = reason refund_record.save() except Exception as e: logger.error(f"更新退款记录异常: {e}") @@ -2801,28 +2801,28 @@ class ShopForceCompleteView(APIView): # ========== 3. 查询订单并验证归属 ========== try: # 通过平台扩展表确认订单属于本店铺 - pingtai_ext = DingdanPingtai.query.select_related('dingdan').get( + pingtai_ext = PlatformOrderExt.query.select_related('Order').get( dianpu_id=shop_id, - dingdan__dingdan_id=dingdan_id + Order__OrderID=dingdan_id ) - order = pingtai_ext.dingdan - except DingdanPingtai.DoesNotExist: + order = pingtai_ext.Order + except PlatformOrderExt.DoesNotExist: logger.warning(f"订单 {dingdan_id} 不属于店铺 {shop_id} 或不存在") return Response({'code': 404, 'msg': '订单不存在或不属于本店铺'}) # ========== 4. 校验订单状态必须为 8(结算中) ========== - if order.zhuangtai != 8: - logger.warning(f"订单 {dingdan_id} 当前状态为 {order.zhuangtai},不是结算中") - return Response({'code': 400, 'msg': f'订单状态不是结算中,当前状态: {order.zhuangtai}'}) + if order.Status != 8: + logger.warning(f"订单 {dingdan_id} 当前状态为 {order.Status},不是结算中") + return Response({'code': 400, 'msg': f'订单状态不是结算中,当前状态: {order.Status}'}) - dashou_id = order.jiedan_dashou_id - dashou_fencheng = order.dashou_fencheng or Decimal('0.00') - jine = order.jine or Decimal('0.00') + dashou_id = order.PlayerID + dashou_fencheng = order.PlayerCommission or Decimal('0.00') + jine = order.Amount or Decimal('0.00') try: with transaction.atomic(): # 锁定订单行,防止并发 - order = Dingdan.objects.select_for_update().get(dingdan_id=dingdan_id) + order = Order.objects.select_for_update().get(OrderID=dingdan_id) if not dashou_id: return Response({'code': 400, 'msg': '订单无接单打手,无法结算'}) @@ -2844,8 +2844,8 @@ class ShopForceCompleteView(APIView): logger.warning(f"本地订单结算:打手 {dashou_id} 不存在,跳过打手更新") # ---------- 更新订单状态 ---------- - order.zhuangtai = 3 - order.clkf = str(shop_id) + order.Status = 3 + order.AssignedCS = str(shop_id) order.save() # ---------- 打手每日统计(成交) ---------- @@ -2859,21 +2859,21 @@ class ShopForceCompleteView(APIView): logger.error(f"打手每日统计更新失败: {e}") # ---------- 店铺收益统计(结算) ---------- - if pingtai_ext.dianpu_shouyi: + if pingtai_ext.ShopIncome: try: # 商品每日统计(只要有商品ID就执行) - if order.shangpin_id: + if order.ProductID: # 从扩展表获取已计算好的收益值(下单时已存储) pingtai_shouyi = Decimal('0.00') dianpu_shouyi = Decimal('0.00') if hasattr(order, 'pingtai_kuozhan'): - pingtai_shouyi = order.pingtai_kuozhan.pingtai_shouyi or Decimal('0.00') - dianpu_shouyi = order.pingtai_kuozhan.dianpu_shouyi or Decimal('0.00') + pingtai_shouyi = order.pingtai_kuozhan.PlatformIncome or Decimal('0.00') + dianpu_shouyi = order.pingtai_kuozhan.ShopIncome or Decimal('0.00') update_shangpin_daily_stat( - shangpin_id=order.shangpin_id, + shangpin_id=order.ProductID, caozuo_leixing=2, # 3 = 退款 - dingdan_jiage=order.jine, + dingdan_jiage=order.Amount, pingtai_shouyi=pingtai_shouyi, dianpu_zongshouyi=dianpu_shouyi ) @@ -2884,7 +2884,7 @@ class ShopForceCompleteView(APIView): dianpu_id=shop_id, caozuo_leixing=2, # 结算操作 dingdan_jiage=jine, - dianpu_shouyi=pingtai_ext.dianpu_shouyi, + dianpu_shouyi=pingtai_ext.ShopIncome, ) except Exception as e: logger.error(f"店铺每日统计更新失败: {e}") @@ -2894,7 +2894,7 @@ class ShopForceCompleteView(APIView): return Response({'code': 200, 'msg': '强制结单成功'}) - except Dingdan.DoesNotExist: + except Order.DoesNotExist: logger.warning(f"订单不存在: {dingdan_id}") return Response({'code': 404, 'msg': '订单不存在'}) except Exception as e: @@ -2950,36 +2950,36 @@ class ShopTransferHallView(APIView): # ---------- 3. 验证订单归属 ---------- try: - pingtai_ext = DingdanPingtai.query.select_related('dingdan').get( + pingtai_ext = PlatformOrderExt.query.select_related('Order').get( dianpu_id=shop_id, - dingdan__dingdan_id=dingdan_id + Order__OrderID=dingdan_id ) - order = pingtai_ext.dingdan - except DingdanPingtai.DoesNotExist: + order = pingtai_ext.Order + except PlatformOrderExt.DoesNotExist: logger.warning(f"订单 {dingdan_id} 不属于店铺 {shop_id} 或不存在") return Response({'code': 404, 'msg': '订单不存在或不属于本店铺'}) # ---------- 4. 状态校验 ---------- - if order.zhuangtai not in [2, 8, 4]: - return Response({'code': 400, 'msg': f'订单状态不允许转移大厅,当前状态: {order.zhuangtai}'}) + if order.Status not in [2, 8, 4]: + return Response({'code': 400, 'msg': f'订单状态不允许转移大厅,当前状态: {order.Status}'}) # ---------- 5. 提取关键字段 ---------- - current_dashou_id = order.jiedan_dashou_id + current_dashou_id = order.PlayerID zhiding_id = order.zhiding_id - dashou_fencheng = order.dashou_fencheng or 0 # 用于退款统计 + dashou_fencheng = order.PlayerCommission or 0 # 用于退款统计 try: with transaction.atomic(): # 锁定订单行 - order = Dingdan.objects.select_for_update().get(dingdan_id=dingdan_id) + order = Order.objects.select_for_update().get(OrderID=dingdan_id) # ---------- 6. 记录打手历史(原接口保留逻辑) ---------- if current_dashou_id: - last_history = OrderDashouHistory.query.filter( + last_history = OrderPlayerHistory.query.filter( dingdan_id=dingdan_id ).order_by('-times').first() next_times = (last_history.times + 1) if last_history else 1 - OrderDashouHistory.query.create( + OrderPlayerHistory.query.create( dingdan_id=dingdan_id, dashou_id=current_dashou_id, times=next_times, @@ -3017,7 +3017,7 @@ class ShopTransferHallView(APIView): logger.info(f"转移大厅成功,订单 {dingdan_id}") return Response({'code': 200, 'msg': '转移大厅成功'}) - except Dingdan.DoesNotExist: + except Order.DoesNotExist: return Response({'code': 404, 'msg': '订单不存在'}) except Exception as e: logger.error(f"转移大厅接口异常: {str(e)}", exc_info=True) @@ -3085,7 +3085,7 @@ class ShopFineApplyView(APIView): return Response({'code': 404, 'msg': '订单不存在或不属于本店铺'}) # ---------- 4. 获取打手ID ---------- - dashou_id = order.jiedan_dashou_id + dashou_id = order.PlayerID if not dashou_id: return Response({'code': 400, 'msg': '该订单无接单打手,无法罚款'}) diff --git a/users/fadan_fenhong_utils.py b/users/fadan_fenhong_utils.py index a854780..994efdf 100644 --- a/users/fadan_fenhong_utils.py +++ b/users/fadan_fenhong_utils.py @@ -5,7 +5,7 @@ import logging from decimal import Decimal from django.db import transaction -from orders.models import Fadan, FadanFenhong, FadanFenhongLilv +from orders.models import Penalty, PenaltyBonus, PenaltyBonusRate from users.models import UserShangjia logger = logging.getLogger(__name__) @@ -32,14 +32,14 @@ def process_fadan_fenhong(fadan_id): try: # 1. 获取罚单对象(必须是已缴纳状态) try: - fadan = Fadan.objects.get(id=fadan_id, zhuangtai=2) - except Fadan.DoesNotExist: + fadan = Penalty.objects.get(id=fadan_id, Status=2) + except Penalty.DoesNotExist: logger.error(f"罚单 {fadan_id} 不存在或状态不是已缴纳") return False, "罚单不存在或状态异常" # 2. 获取申请处罚者ID和身份(源身份数字) - shenqing_chufa = fadan.shenqing_chufa - src_shenfen = fadan.shenqingren_shenfen + shenqing_chufa = fadan.ApplicantID + src_shenfen = fadan.ApplicantIdentity if not shenqing_chufa: logger.info(f"罚单 {fadan_id} 无申请处罚者,不进行分红") @@ -56,27 +56,27 @@ def process_fadan_fenhong(fadan_id): lilv_shenfen = mapped['lilv'] # 用于 FadanFenhongLilv.shenfen # 4. 获取罚款金额 - fakuan_jine = fadan.fakuanjine + fakuan_jine = fadan.FineAmount if fakuan_jine <= 0: logger.info(f"罚单 {fadan_id} 罚款金额为0,不产生分红") - fadan.shenqingren_fenhong_jine = Decimal('0.00') - fadan.save(update_fields=['shenqingren_fenhong_jine']) + fadan.ApplicantBonusAmount = Decimal('0.00') + fadan.save(update_fields=['ApplicantBonusAmount']) return True, "罚款金额为0,无分红" # 5. 确定分红利率 rate = _get_fenhong_rate(shenqing_chufa, fenhong_shenfen, lilv_shenfen) if rate is None: logger.warning(f"未找到身份 {src_shenfen} (映射后 fenhong_shenfen={fenhong_shenfen}, lilv_shenfen={lilv_shenfen}) 的分红利率,罚单 {fadan_id} 不进行分红") - fadan.shenqingren_fenhong_jine = Decimal('0.00') - fadan.save(update_fields=['shenqingren_fenhong_jine']) + fadan.ApplicantBonusAmount = Decimal('0.00') + fadan.save(update_fields=['ApplicantBonusAmount']) return True, "未配置分红利率,无分红" # 6. 计算分红金额 fenhong_jine = (Decimal(str(fakuan_jine)) * Decimal(str(rate))).quantize(Decimal('0.01')) if fenhong_jine <= 0: logger.info(f"罚单 {fadan_id} 计算分红金额为0,无需处理") - fadan.shenqingren_fenhong_jine = Decimal('0.00') - fadan.save(update_fields=['shenqingren_fenhong_jine']) + fadan.ApplicantBonusAmount = Decimal('0.00') + fadan.save(update_fields=['ApplicantBonusAmount']) return True, "分红金额为0" # 7. 根据申请处罚者身份执行不同的分红逻辑 @@ -84,20 +84,20 @@ def process_fadan_fenhong(fadan_id): if src_shenfen == 5: # 商家特殊处理:只记录总额,可提现分红永远为0,直接加到商家余额 with transaction.atomic(): - fenhong_record, created = FadanFenhong.objects.get_or_create( - fenhongzhe_id=shenqing_chufa, - shenfen=fenhong_shenfen, + fenhong_record, created = PenaltyBonus.objects.get_or_create( + BeneficiaryID=shenqing_chufa, + Identity=fenhong_shenfen, defaults={ - 'zonge': Decimal('0.00'), - 'ketixian_fenhong': Decimal('0.00'), - 'fenhong_cishu': 0, - 'yingde_lilv': rate, + 'TotalAmount': Decimal('0.00'), + 'WithdrawableAmount': Decimal('0.00'), + 'BonusCount': 0, + 'IndividualRate': rate, 'is_individual_rate': False } ) - fenhong_record.zonge += fenhong_jine + fenhong_record.TotalAmount += fenhong_jine # 可提现分红不累加,保持0 - fenhong_record.fenhong_cishu += 1 + fenhong_record.BonusCount += 1 fenhong_record.save() # 直接增加商家余额(UserShangjia.yue) @@ -111,31 +111,31 @@ def process_fadan_fenhong(fadan_id): raise Exception(f"商家 {shenqing_chufa} 扩展表不存在,无法增加余额") # 更新罚单中的申请人分红金额 - fadan.shenqingren_fenhong_jine = fenhong_jine - fadan.save(update_fields=['shenqingren_fenhong_jine']) + fadan.ApplicantBonusAmount = fenhong_jine + fadan.save(update_fields=['ApplicantBonusAmount']) else: # 其他身份(客服、售后、管理员、店铺):同时增加总额和可提现分红 with transaction.atomic(): - fenhong_record, created = FadanFenhong.objects.get_or_create( - fenhongzhe_id=shenqing_chufa, - shenfen=fenhong_shenfen, + fenhong_record, created = PenaltyBonus.objects.get_or_create( + BeneficiaryID=shenqing_chufa, + Identity=fenhong_shenfen, defaults={ - 'zonge': Decimal('0.00'), - 'ketixian_fenhong': Decimal('0.00'), - 'fenhong_cishu': 0, - 'yingde_lilv': rate, + 'TotalAmount': Decimal('0.00'), + 'WithdrawableAmount': Decimal('0.00'), + 'BonusCount': 0, + 'IndividualRate': rate, 'is_individual_rate': False } ) - fenhong_record.zonge += fenhong_jine - fenhong_record.ketixian_fenhong += fenhong_jine - fenhong_record.fenhong_cishu += 1 + fenhong_record.TotalAmount += fenhong_jine + fenhong_record.WithdrawableAmount += fenhong_jine + fenhong_record.BonusCount += 1 fenhong_record.save() # 更新罚单中的申请人分红金额 - fadan.shenqingren_fenhong_jine = fenhong_jine - fadan.save(update_fields=['shenqingren_fenhong_jine']) + fadan.ApplicantBonusAmount = fenhong_jine + fadan.save(update_fields=['ApplicantBonusAmount']) logger.info(f"罚单 {fadan_id} 分红处理成功: 申请者 {shenqing_chufa}, 分红金额 {fenhong_jine} 元, 源身份 {src_shenfen}, 映射后分红身份 {fenhong_shenfen}") return True, "分红处理成功" @@ -150,17 +150,17 @@ def _get_fenhong_rate(fenhongzhe_id, fenhong_shenfen, lilv_shenfen): 获取分红利率(优先使用个人单独配置,否则使用全局身份配置) """ try: - individual = FadanFenhong.objects.get( - fenhongzhe_id=fenhongzhe_id, - shenfen=fenhong_shenfen, + individual = PenaltyBonus.objects.get( + BeneficiaryID=fenhongzhe_id, + Identity=fenhong_shenfen, is_individual_rate=True ) - return individual.yingde_lilv - except FadanFenhong.DoesNotExist: + return individual.IndividualRate + except PenaltyBonus.DoesNotExist: pass try: - global_rate = FadanFenhongLilv.objects.get(shenfen=lilv_shenfen) - return global_rate.lilv - except FadanFenhongLilv.DoesNotExist: + global_rate = PenaltyBonusRate.objects.get(Identity=lilv_shenfen) + return global_rate.Rate + except PenaltyBonusRate.DoesNotExist: return None \ No newline at end of file diff --git a/users/tixian_shenhe_services.py b/users/tixian_shenhe_services.py index 168806e..96279b2 100644 --- a/users/tixian_shenhe_services.py +++ b/users/tixian_shenhe_services.py @@ -25,7 +25,7 @@ from django.conf import settings from django.db import transaction from django.utils import timezone -from orders.models import Dingdan, DingdanShangjia, Fadan, Lilubiao +from orders.models import Order, MerchantOrderExt, Penalty, CommissionRate from config.models import Szjilu, TixianQuotaDefault from utils.fadan_utils import check_fadan_qiangdan_eligible @@ -153,10 +153,10 @@ def get_tixian_feilv(leixing): rate_key = LEIXING_RATE_KEY.get(leixing) if not rate_key: raise ValueError('无效的提现类型') - rate_obj = Lilubiao.query.filter(fadanpingtai=rate_key).first() + rate_obj = CommissionRate.query.filter(Platform=rate_key).first() if not rate_obj: raise ValueError(f'提现费率未配置(类型{leixing})') - return decimal.Decimal(str(rate_obj.lilu)) + return decimal.Decimal(str(rate_obj.Rate)) def calc_fee_amounts(jine, feilv): @@ -261,12 +261,12 @@ def validate_withdraw_eligibility(user_main, leixing, jine): return False, huiyuan_msg, {} if dashou.yajin < jine: return False, f'押金余额不足,当前押金: {dashou.yajin}', {} - unfinished = Dingdan.query.filter( - jiedan_dashou_id=yonghuid, - ).exclude(zhuangtai__in=[ORDER_STATUS_COMPLETED, ORDER_STATUS_REFUNDED]).exists() + unfinished = Order.query.filter( + PlayerID=yonghuid, + ).exclude(Status__in=[ORDER_STATUS_COMPLETED, ORDER_STATUS_REFUNDED]).exists() if unfinished: return False, '您还有未完成或未退款的订单,请先处理完毕再提取押金', {} - self_fadan = Fadan.query.filter(beichufa_id=yonghuid).exclude(zhuangtai__in=[2, 4]).exists() + self_fadan = Penalty.query.filter(PenalizedUserID=yonghuid).exclude(Status__in=[2, 4]).exists() if self_fadan: return False, '您有未处理完毕的自身罚单(待缴纳/申诉中),请先处理', {} return True, '', {'nicheng': dashou.nicheng or ''} @@ -280,15 +280,15 @@ def validate_withdraw_eligibility(user_main, leixing, jine): return False, '商家账号已被禁用,无法提现', {} if shangjia.yue < jine: return False, f'商家余额不足,当前余额: {shangjia.yue}', {} - unfinished_orders = DingdanShangjia.query.filter( - shangjia_id=yonghuid, - ).exclude(dingdan__zhuangtai__in=[ORDER_STATUS_COMPLETED, ORDER_STATUS_REFUNDED]).exists() + unfinished_orders = MerchantOrderExt.query.filter( + MerchantID=yonghuid, + ).exclude(Order__Status__in=[ORDER_STATUS_COMPLETED, ORDER_STATUS_REFUNDED]).exists() if unfinished_orders: return False, '您还有未完成或未退款的订单,请先处理完毕再提现余额', {} - self_fadan = Fadan.query.filter(beichufa_id=yonghuid).exclude(zhuangtai__in=[2, 4]).exists() + self_fadan = Penalty.query.filter(PenalizedUserID=yonghuid).exclude(Status__in=[2, 4]).exists() if self_fadan: return False, '您有未处理完毕的自身罚单(待缴纳/申诉中),请先处理', {} - applied_fadan = Fadan.query.filter(shenqing_chufa=yonghuid).exclude(zhuangtai__in=[2, 4]).exists() + applied_fadan = Penalty.query.filter(ApplicantID=yonghuid).exclude(Status__in=[2, 4]).exists() if applied_fadan: return False, '您发起的对其他用户的处罚尚未处理完毕,请等待完结', {} return True, '', {'nicheng': shangjia.nicheng or ''} @@ -350,12 +350,12 @@ def validate_collect_eligibility(user_main, leixing): huiyuan_ok, huiyuan_msg = check_dashou_has_valid_huiyuan(yonghuid) if not huiyuan_ok: return False, huiyuan_msg - unfinished = Dingdan.query.filter( - jiedan_dashou_id=yonghuid, - ).exclude(zhuangtai__in=[ORDER_STATUS_COMPLETED, ORDER_STATUS_REFUNDED]).exists() + unfinished = Order.query.filter( + PlayerID=yonghuid, + ).exclude(Status__in=[ORDER_STATUS_COMPLETED, ORDER_STATUS_REFUNDED]).exists() if unfinished: return False, '您还有未完成或未退款的订单,无法收款' - self_fadan = Fadan.query.filter(beichufa_id=yonghuid).exclude(zhuangtai__in=[2, 4]).exists() + self_fadan = Penalty.query.filter(PenalizedUserID=yonghuid).exclude(Status__in=[2, 4]).exists() if self_fadan: return False, '您有未处理完毕的自身罚单,无法收款' return True, '' @@ -376,15 +376,15 @@ def validate_collect_eligibility(user_main, leixing): return False, '您不是商家身份,无法收款' if shangjia.zhuangtai != 1: return False, '商家账号已被禁用,无法收款' - unfinished_orders = DingdanShangjia.query.filter( - shangjia_id=yonghuid, - ).exclude(dingdan__zhuangtai__in=[ORDER_STATUS_COMPLETED, ORDER_STATUS_REFUNDED]).exists() + unfinished_orders = MerchantOrderExt.query.filter( + MerchantID=yonghuid, + ).exclude(Order__Status__in=[ORDER_STATUS_COMPLETED, ORDER_STATUS_REFUNDED]).exists() if unfinished_orders: return False, '您还有未完成或未退款的订单,无法收款' - self_fadan = Fadan.query.filter(beichufa_id=yonghuid).exclude(zhuangtai__in=[2, 4]).exists() + self_fadan = Penalty.query.filter(PenalizedUserID=yonghuid).exclude(Status__in=[2, 4]).exists() if self_fadan: return False, '您有未处理完毕的自身罚单,无法收款' - applied_fadan = Fadan.query.filter(shenqing_chufa=yonghuid).exclude(zhuangtai__in=[2, 4]).exists() + applied_fadan = Penalty.query.filter(ApplicantID=yonghuid).exclude(Status__in=[2, 4]).exists() if applied_fadan: return False, '您发起的处罚尚未处理完毕,无法收款' return True, '' diff --git a/users/urls.py b/users/urls.py index da3f849..cdfc591 100644 --- a/users/urls.py +++ b/users/urls.py @@ -3,7 +3,7 @@ from django.views.decorators.csrf import csrf_exempt from .views import WechatMiniProgramLoginView, UserInfoUpdateView, DashouXinxiAPIView, \ ZaixianZhuangtaiAPIView, GuanshiXinxiView, ShangJiaXinXiView, BossBiaoshiView, YaoqingmaView, \ DashouZhuceView, GuanshiYaoqingDashouListView, TixianXinxiHuoquView, ShoukuanXinxiShangchuanView, \ - TixianShenqingView, TixianJiluHuoquViewV2, AdminLoginView, AdminFinancialDataView, AdGetDingdanList, \ + TixianShenqingView, TixianJiluHuoquViewV2, AdminLoginView, AdminFinancialDataView, AdGetOrderList, \ AdGetOrderTypes, AdGuanLiYongHu, AdYaoQingDaShou, CfGuanLi, AdTongYiChuFa, AdckyhxqView, AdcjxgView, AddtxshView, \ AdtixianqkView, DashouZiliaoHuoquView, DashouGengxinView,ShangjiaZhuceView,\ PaihangbangGuanliQueryView,PaihangbangRiqiliebiaoView, WechatLoginAndDashouRegisterView, \ @@ -43,7 +43,7 @@ urlpatterns = [ path('adgetordertypes', AdGetOrderTypes.as_view(), name='管理员获取订单类型'), # 订单列表获取接口 - path('adddhq', AdGetDingdanList.as_view(), name='管理员获取订单列表'), + path('adddhq', AdGetOrderList.as_view(), name='管理员获取订单列表'), path('adyqds', AdYaoQingDaShou.as_view(), name='管理员获取邀请码'), # 用户管理列表接口 diff --git a/users/views.py b/users/views.py index 93d44ed..a1e7471 100644 --- a/users/views.py +++ b/users/views.py @@ -76,9 +76,9 @@ from .tixian_shenhe_services import ( from .tixian_shenhe_views import process_audit_collect from orders.models import ( - Dingdan, DingdanPingtai, DingdanShangjia, Lilubiao, - Chufajilu, Chufatupian, Tuikuanjilu, Dashoutupian, - Fadan, FadanShensuTupian + Order, PlatformOrderExt, MerchantOrderExt, CommissionRate, + PenaltyRecord, PenaltyEvidenceImage, RefundRecord, PlayerDeliveryImage, + Penalty, PenaltyAppealImage ) from products.models import ( ShangpinLeixing, Huiyuan, Huiyuangoumai, Gsfenhong, Czjilu @@ -279,7 +279,7 @@ class WechatMiniProgramLoginView(APIView): token = str(refresh.access_token) # 计算订单数量 - order_counts = self.jisuanDingdanShuliang(user_main.UserUID) + order_counts = self.jisuanOrderShuliang(user_main.UserUID) # 获取群配置 group_info = self.huoquQunPeizhi() @@ -370,21 +370,21 @@ class WechatMiniProgramLoginView(APIView): ip = request.META.get('REMOTE_ADDR', '') return ip if ip else '0.0.0.0' - def jisuanDingdanShuliang(self, yonghuid): + def jisuanOrderShuliang(self, yonghuid): """ 统计订单数量 """ try: - if not DingdanPingtai.query.filter(laoban_id=yonghuid).exists(): + if not PlatformOrderExt.query.filter(BossID=yonghuid).exists(): return {'daifuwu': 0, 'fuwuzhong': 0, 'yiwancheng': 0, 'yituikuan': 0} - dingdan_ids = DingdanPingtai.query.filter(laoban_id=yonghuid).values_list('dingdan__id', flat=True) + dingdan_ids = PlatformOrderExt.query.filter(BossID=yonghuid).values_list('Order__id', flat=True) - results = Dingdan.query.filter(id__in=dingdan_ids).aggregate( - daifuwu=Count(Case(When(Q(zhuangtai=1) | Q(zhuangtai=7), then=1), output_field=IntegerField())), - fuwuzhong=Count(Case(When(zhuangtai=2, then=1), output_field=IntegerField())), - yiwancheng=Count(Case(When(zhuangtai=3, then=1), output_field=IntegerField())), - yituikuan=Count(Case(When(zhuangtai=5, then=1), output_field=IntegerField())) + results = Order.query.filter(id__in=dingdan_ids).aggregate( + daifuwu=Count(Case(When(Q(Status=1) | Q(Status=7), then=1), output_field=IntegerField())), + fuwuzhong=Count(Case(When(Status=2, then=1), output_field=IntegerField())), + yiwancheng=Count(Case(When(Status=3, then=1), output_field=IntegerField())), + yituikuan=Count(Case(When(Status=5, then=1), output_field=IntegerField())) ) return { @@ -1586,14 +1586,14 @@ class TixianXinxiHuoquView(APIView): # 从request.user获取当前用户 user_main = request.user - # 🔥【修改开始 - 使用Decimal,字段名是lilu】 - # 查询打手提现费率 (fadanpingtai='5') - dashou_rate_obj = Lilubiao.query.filter(fadanpingtai='5').first() - dashou_rate = decimal.Decimal(str(dashou_rate_obj.lilu)) if dashou_rate_obj else decimal.Decimal('0.00') + # 🔥【修改开始 - 使用Decimal,字段名是Rate】 + # 查询打手提现费率 (Platform='5') + dashou_rate_obj = CommissionRate.query.filter(Platform='5').first() + dashou_rate = decimal.Decimal(str(dashou_rate_obj.Rate)) if dashou_rate_obj else decimal.Decimal('0.00') - # 查询管事提现费率 (fadanpingtai='6') - guanshi_rate_obj = Lilubiao.query.filter(fadanpingtai='6').first() - guanshi_rate = decimal.Decimal(str(guanshi_rate_obj.lilu)) if guanshi_rate_obj else decimal.Decimal('0.00') + # 查询管事提现费率 (Platform='6') + guanshi_rate_obj = CommissionRate.query.filter(Platform='6').first() + guanshi_rate = decimal.Decimal(str(guanshi_rate_obj.Rate)) if guanshi_rate_obj else decimal.Decimal('0.00') # 🔥【修改结束】 # 构建返回数据 @@ -1858,9 +1858,9 @@ class TixianShenqingView(APIView): }.get(leixing) if rate_key: - rate_obj = Lilubiao.query.filter(fadanpingtai=rate_key).first() + rate_obj = CommissionRate.query.filter(Platform=rate_key).first() if rate_obj: - current_rate = decimal.Decimal(str(rate_obj.lilu)) + current_rate = decimal.Decimal(str(rate_obj.Rate)) else: return Response({'code': 41, 'msg': f'提现费率未配置(类型{leixing})'}, status=status.HTTP_400_BAD_REQUEST) @@ -2066,28 +2066,28 @@ class TixianShenqingView(APIView): return {'code': 62, 'msg': f'商家余额不足,当前余额: {shangjia.yue}'} # 订单检查(使用 Q 取反) - unfinished_orders = DingdanShangjia.query.filter( - shangjia_id=user_main.yonghuid, + unfinished_orders = MerchantOrderExt.query.filter( + MerchantID=user_main.yonghuid, ).exclude( - dingdan__zhuangtai__in=[ORDER_STATUS_COMPLETED, ORDER_STATUS_REFUNDED,ORDER_STATUS_FAIL] + Order__Status__in=[ORDER_STATUS_COMPLETED, ORDER_STATUS_REFUNDED,ORDER_STATUS_FAIL] ).exists() if unfinished_orders: return {'code': 63, 'msg': '您还有未完成或未退款的订单,请先处理完毕再提现余额'} # 自身被处罚的罚单检查(状态不是已缴纳(2)和已驳回(4)) - self_fadan = Fadan.query.filter( - beichufa_id=user_main.yonghuid, + self_fadan = Penalty.query.filter( + PenalizedUserID=user_main.yonghuid, ).exclude( - zhuangtai__in=[2, 4] + Status__in=[2, 4] ).exists() if self_fadan: return {'code': 64, 'msg': '您有未处理完毕的自身罚单(待缴纳/申诉中),请先处理'} # 申请的对他人处罚罚单检查(状态不是已缴纳(2)和已驳回(4)) - applied_fadan = Fadan.query.filter( - shenqing_chufa=user_main.yonghuid, + applied_fadan = Penalty.query.filter( + ApplicantID=user_main.yonghuid, ).exclude( - zhuangtai__in=[2, 4] + Status__in=[2, 4] ).exists() if applied_fadan: return {'code': 65, 'msg': '您发起的对其他用户的处罚尚未处理完毕(待缴纳/申诉中),请等待完结'} @@ -2112,19 +2112,19 @@ class TixianShenqingView(APIView): return {'code': 53, 'msg': f'押金余额不足,当前押金: {dashou.yajin}'} # 订单检查(使用 exclude + __in) - unfinished_orders = Dingdan.query.filter( - jiedan_dashou_id=user_main.yonghuid, + unfinished_orders = Order.query.filter( + PlayerID=user_main.yonghuid, ).exclude( - zhuangtai__in=[ORDER_STATUS_COMPLETED, ORDER_STATUS_REFUNDED] + Status__in=[ORDER_STATUS_COMPLETED, ORDER_STATUS_REFUNDED] ).exists() if unfinished_orders: return {'code': 54, 'msg': '您还有未完成或未退款的订单,请先处理完毕再提取押金'} # 自身罚单检查 - self_fadan = Fadan.query.filter( - beichufa_id=user_main.yonghuid, + self_fadan = Penalty.query.filter( + PenalizedUserID=user_main.yonghuid, ).exclude( - zhuangtai__in=[2, 4] + Status__in=[2, 4] ).exists() if self_fadan: return {'code': 55, 'msg': '您有未处理完毕的自身罚单(待缴纳/申诉中),请先处理'} @@ -2314,9 +2314,9 @@ class AdminLoginView(APIView): # 【优化点1】使用select_related一次性获取管理员扩展表 # 只查询管理员类型的用户 user = User.query.filter( - phone=zhanghao, # 手机号作为账号 - password=mima, # 密码 - user_type='admin' # 必须是管理员类型 + Phone=zhanghao, # 手机号作为账号 + UserPassword=mima, # 密码 + admin_profile__isnull=False # 必须是管理员类型 ).select_related('admin_profile').first() # 如果用户不存在或不是管理员,返回401 @@ -2629,7 +2629,7 @@ class AdGetOrderTypes(APIView): # yonghu/views.py 或 dingdan/views.py -class AdGetDingdanList(APIView): +class AdGetOrderList(APIView): """ 后台订单列表获取接口 前端调用地址: /yonghu/adddhq @@ -2695,47 +2695,47 @@ class AdGetDingdanList(APIView): if is_search_mode: # 搜索模式:只按订单ID查询 - query_conditions &= Q(dingdan_id=dingdan_id) + query_conditions &= Q(OrderID=dingdan_id) else: # 筛选模式 - # 发单平台筛选(前端: fadanpingtai -> 数据库: fadan_pingtai) + # 发单平台筛选(前端: fadanpingtai -> 数据库: Platform) if fadanpingtai is not None: try: fadanpingtai_int = int(fadanpingtai) if fadanpingtai_int in [1, 2]: - query_conditions &= Q(fadan_pingtai=fadanpingtai_int) + query_conditions &= Q(Platform=fadanpingtai_int) except (ValueError, TypeError): pass - # 订单类型筛选(前端: leixing -> 数据库: leixing_id) + # 订单类型筛选(前端: leixing -> 数据库: ProductTypeID) if leixing is not None: try: leixing_int = int(leixing) - query_conditions &= Q(leixing_id=leixing_int) + query_conditions &= Q(ProductTypeID=leixing_int) except (ValueError, TypeError): pass - # 订单状态筛选(前端: zhuangtai -> 数据库: zhuangtai) + # 订单状态筛选(前端: zhuangtai -> 数据库: Status) if zhuangtai and zhuangtai != 'all': try: # 处理多个状态,如 "1,7" status_list = [int(s.strip()) for s in zhuangtai.split(',') if s.strip()] if status_list: - query_conditions &= Q(zhuangtai__in=status_list) + query_conditions &= Q(Status__in=status_list) except (ValueError, TypeError): pass # 6. 获取统计数据(平台订单和商家订单) # 注意:这里统计所有订单,不考虑筛选条件 try: - # 平台订单统计 (fadan_pingtai=1) - platform_total = Dingdan.query.filter(fadan_pingtai=1).count() - platform_completed = Dingdan.query.filter(fadan_pingtai=1, zhuangtai=3).count() + # 平台订单统计 (Platform=1) + platform_total = Order.query.filter(Platform=1).count() + platform_completed = Order.query.filter(Platform=1, Status=3).count() - # 商家订单统计 (fadan_pingtai=2) - merchant_total = Dingdan.query.filter(fadan_pingtai=2).count() - merchant_completed = Dingdan.query.filter(fadan_pingtai=2, zhuangtai=3).count() + # 商家订单统计 (Platform=2) + merchant_total = Order.query.filter(Platform=2).count() + merchant_completed = Order.query.filter(Platform=2, Status=3).count() platform_stats = { 'total': platform_total, @@ -2757,13 +2757,13 @@ class AdGetDingdanList(APIView): offset = (page - 1) * page_size # 查询符合条件的订单总数 - total_count = Dingdan.query.filter(query_conditions).count() + total_count = Order.query.filter(query_conditions).count() # 查询当前页的数据(只查询主表,只查询前端需要的字段) - dingdan_list = Dingdan.query.filter(query_conditions).only( - 'dingdan_id', 'jieshao', 'zhuangtai', 'leixing_id', - 'fadan_pingtai', 'jine', 'tupian', 'create_time' - ).order_by('-create_time')[offset:offset + page_size] + dingdan_list = Order.query.filter(query_conditions).only( + 'OrderID', 'Description', 'Status', 'ProductTypeID', + 'Platform', 'Amount', 'ImageURL', 'CreateTime' + ).order_by('-CreateTime')[offset:offset + page_size] query_time = time.time() - start_time logger.info(f"订单查询完成,耗时: {query_time:.3f}s,查询条数: {len(dingdan_list)}") @@ -2774,14 +2774,14 @@ class AdGetDingdanList(APIView): for dingdan in dingdan_list: # 注意:这里字段名必须与前端完全一致 order_data = { - 'dingdan_id': dingdan.dingdan_id or '', - 'jieshao': dingdan.jieshao or '', - 'zhuangtai': dingdan.zhuangtai or 1, - 'leixing': dingdan.leixing_id or 0, # 前端需要 leixing - 'fadanpingtai': dingdan.fadan_pingtai or 1, # 前端需要 fadanpingtai - 'jiage': float(dingdan.jine) if dingdan.jine else 0.00, # 价格对应 jine 字段 - 'tupian_url': dingdan.tupian or '', # 图片对应 tupian 字段 - 'fadanshijian': dingdan.create_time.strftime('%Y-%m-%d %H:%M:%S') if dingdan.create_time else '' + 'dingdan_id': dingdan.OrderID or '', + 'jieshao': dingdan.Description or '', + 'zhuangtai': dingdan.Status or 1, + 'leixing': dingdan.ProductTypeID or 0, # 前端需要 leixing + 'fadanpingtai': dingdan.Platform or 1, # 前端需要 fadanpingtai + 'jiage': float(dingdan.Amount) if dingdan.Amount else 0.00, # 价格对应 Amount 字段 + 'tupian_url': dingdan.ImageURL or '', # 图片对应 ImageURL 字段 + 'fadanshijian': dingdan.CreateTime.strftime('%Y-%m-%d %H:%M:%S') if dingdan.CreateTime else '' } result_list.append(order_data) @@ -3377,9 +3377,9 @@ class CfGuanLi(APIView): ) # 7. 获取统计信息(总是需要统计) - zongshu = Chufajilu.query.count() - daichuli = Chufajilu.query.filter(sqzhuangtai__in=[0, 3]).count() - yichuli = Chufajilu.query.filter(sqzhuangtai__in=[1, 2]).count() + zongshu = PenaltyRecord.query.count() + daichuli = PenaltyRecord.query.filter(ApplyStatus__in=[0, 3]).count() + yichuli = PenaltyRecord.query.filter(ApplyStatus__in=[1, 2]).count() # 8. 如果只请求统计信息,直接返回 if qingqiu_tongji: @@ -3394,16 +3394,16 @@ class CfGuanLi(APIView): }) # 9. 构建查询集 - queryset = Chufajilu.query.all() + queryset = PenaltyRecord.query.all() # 10. 根据状态筛选 if sqzhuangtai is not None: if isinstance(sqzhuangtai, list): # 如果是数组,表示多个状态 - queryset = queryset.filter(sqzhuangtai__in=sqzhuangtai) + queryset = queryset.filter(ApplyStatus__in=sqzhuangtai) else: # 单个状态 - queryset = queryset.filter(sqzhuangtai=sqzhuangtai) + queryset = queryset.filter(ApplyStatus=sqzhuangtai) # 11. 获取总数(用于分页计算) total_count = queryset.count() @@ -3421,14 +3421,14 @@ class CfGuanLi(APIView): yonghu_combinations = [] # 保存 (dingdan_id, yonghuid) 组合 for chufa in chufa_list: - if chufa.dingdan_id: - dingdan_ids.append(chufa.dingdan_id) + if chufa.OrderID: + dingdan_ids.append(chufa.OrderID) # 商家图片组合 - if chufa.qingqiuid: - yonghu_combinations.append((chufa.dingdan_id, chufa.qingqiuid)) + if chufa.ApplicantID: + yonghu_combinations.append((chufa.OrderID, chufa.ApplicantID)) # 打手图片组合 - if chufa.dashouid: - yonghu_combinations.append((chufa.dingdan_id, chufa.dashouid)) + if chufa.PlayerID: + yonghu_combinations.append((chufa.OrderID, chufa.PlayerID)) # 去重 dingdan_ids = list(set(dingdan_ids)) @@ -3440,20 +3440,20 @@ class CfGuanLi(APIView): # 构建查询条件 query_conditions = Q() for dingdan_id, yonghuid in yonghu_combinations: - query_conditions |= Q(dingdan_id=dingdan_id, yonghuid=yonghuid) + query_conditions |= Q(OrderID=dingdan_id, UserID=yonghuid) # 批量查询 - tupian_queryset = Chufatupian.query.filter(query_conditions).values( - 'dingdan_id', 'yonghuid', 'tupian' + tupian_queryset = PenaltyEvidenceImage.query.filter(query_conditions).values( + 'OrderID', 'UserID', 'ImageURL' ) - # 构建映射:key为"dingdan_id_yonghuid",value为图片URL列表 + # 构建映射:key为"OrderID_UserID",value为图片URL列表 for item in tupian_queryset: - key = f"{item['dingdan_id']}_{item['yonghuid']}" + key = f"{item['OrderID']}_{item['UserID']}" if key not in tupian_mapping: tupian_mapping[key] = [] - if item['tupian']: - tupian_mapping[key].append(item['tupian']) + if item['ImageURL']: + tupian_mapping[key].append(item['ImageURL']) else: tupian_mapping = {} @@ -3462,29 +3462,29 @@ class CfGuanLi(APIView): for chufa in chufa_list: # 🔴【新增】获取商家证据图片 zhengju_tupian = [] - if chufa.dingdan_id and chufa.qingqiuid: - key = f"{chufa.dingdan_id}_{chufa.qingqiuid}" + if chufa.OrderID and chufa.ApplicantID: + key = f"{chufa.OrderID}_{chufa.ApplicantID}" zhengju_tupian = tupian_mapping.get(key, []) # 🔴【新增】获取打手申诉图片 shensu_tupian = [] - if chufa.dingdan_id and chufa.dashouid: - key = f"{chufa.dingdan_id}_{chufa.dashouid}" + if chufa.OrderID and chufa.PlayerID: + key = f"{chufa.OrderID}_{chufa.PlayerID}" shensu_tupian = tupian_mapping.get(key, []) chufa_data.append({ - 'dashouid': chufa.dashouid, - 'qingqiuid': chufa.qingqiuid, - 'chuliid': chufa.chuliid, - 'cfliyou': chufa.cfliyou, - 'sqzhuangtai': chufa.sqzhuangtai, - 'bhliyou': chufa.bhliyou, - 'jifen': chufa.jifen, - 'dingdan_id': chufa.dingdan_id, + 'dashouid': chufa.PlayerID, + 'qingqiuid': chufa.ApplicantID, + 'chuliid': chufa.ProcessorID, + 'cfliyou': chufa.PenaltyReason, + 'sqzhuangtai': chufa.ApplyStatus, + 'bhliyou': chufa.RejectReason, + 'jifen': chufa.DeductedPoints, + 'dingdan_id': chufa.OrderID, 'create_time': chufa.create_time, 'update_time': chufa.update_time, # 🔴【新增】申诉理由字段 - 'ssliyou': chufa.ssliyou or '', + 'ssliyou': chufa.AppealReason or '', # 🔴【新增】商家证据图片 'zhengju_tupian': zhengju_tupian, # 🔴【新增】打手申诉图片 @@ -3616,14 +3616,14 @@ class AdTongYiChuFa(APIView): with transaction.atomic(): # 8. 🔴 修复:查询处罚记录(处理重复记录问题) # 使用 filter().first() 而不是 get(),以防出现多条记录 - chufajilu = Chufajilu.query.filter( - dingdan_id=dingdan_id, - sqzhuangtai__in=[0, 3] # 🔴【修改】包括待处理和申诉中状态 + chufajilu = PenaltyRecord.query.filter( + OrderID=dingdan_id, + ApplyStatus__in=[0, 3] # 🔴【修改】包括待处理和申诉中状态 ).order_by('-create_time').first() # 取最新的一条 if not chufajilu: # 如果没有待处理的处罚记录,检查是否有已处理的 - exists_processed = Chufajilu.query.filter(dingdan_id=dingdan_id).exists() + exists_processed = PenaltyRecord.query.filter(OrderID=dingdan_id).exists() if exists_processed: return Response( {'code': 400, 'message': '该处罚记录已处理', 'data': None}, @@ -3636,16 +3636,16 @@ class AdTongYiChuFa(APIView): ) # 9. 验证处罚记录状态(必须是待处理或申诉中状态才能处理) - if chufajilu.sqzhuangtai not in [0, 3]: # 🔴【修改】包括待处理(0)和申诉中(3) + if chufajilu.ApplyStatus not in [0, 3]: # 🔴【修改】包括待处理(0)和申诉中(3) return Response( {'code': 400, 'message': '该处罚记录已处理', 'data': None}, status=status.HTTP_400_BAD_REQUEST ) # 10. 🔴 修复:检查是否有重复的待处理/申诉中记录,并记录警告 - duplicate_count = Chufajilu.query.filter( - dingdan_id=dingdan_id, - sqzhuangtai__in=[0, 3] # 🔴【修改】包括待处理和申诉中 + duplicate_count = PenaltyRecord.query.filter( + OrderID=dingdan_id, + ApplyStatus__in=[0, 3] # 🔴【修改】包括待处理和申诉中 ).count() if duplicate_count > 1: @@ -3654,22 +3654,22 @@ class AdTongYiChuFa(APIView): # 🔴 可选:将其他重复的待处理/申诉中记录标记为已拒绝 # 防止用户重复提交相同订单的处罚申请 - duplicate_records = Chufajilu.query.filter( - dingdan_id=dingdan_id, - sqzhuangtai__in=[0, 3] # 🔴【修改】包括待处理和申诉中 + duplicate_records = PenaltyRecord.query.filter( + OrderID=dingdan_id, + ApplyStatus__in=[0, 3] # 🔴【修改】包括待处理和申诉中 ).exclude(id=chufajilu.id) for dup in duplicate_records: - dup.sqzhuangtai = 2 # 已拒绝 - dup.chuliid = qianzhanghao - dup.bhliyou = "系统自动拒绝:存在重复处罚记录" + dup.ApplyStatus = 2 # 已拒绝 + dup.ProcessorID = qianzhanghao + dup.RejectReason = "系统自动拒绝:存在重复处罚记录" dup.save() # 11. 根据操作类型处理 if caozuo == 1: # 同意处罚 - 不扣分,只改状态 # 11.1 检查打手是否存在 - if not chufajilu.dashouid: + if not chufajilu.PlayerID: return Response( {'code': 400, 'message': '被处罚打手ID不存在', 'data': None}, status=status.HTTP_400_BAD_REQUEST @@ -3677,7 +3677,7 @@ class AdTongYiChuFa(APIView): # 11.2 查询打手扩展表(只是验证存在性) try: - dashou = UserDashou.query.get(user__UserUID=chufajilu.dashouid) + dashou = UserDashou.query.get(user__UserUID=chufajilu.PlayerID) except UserDashou.DoesNotExist: return Response( {'code': 404, 'message': '被处罚打手不存在', 'data': None}, @@ -3685,59 +3685,59 @@ class AdTongYiChuFa(APIView): ) # 🔴【修改】11.3 同意处罚时不扣分(因为申请时已经扣了),只更新状态 - chufajilu.sqzhuangtai = 1 # 已处罚 - chufajilu.chuliid = qianzhanghao # 处理人ID为管理员账号 + chufajilu.ApplyStatus = 1 # 已处罚 + chufajilu.ProcessorID = qianzhanghao # 处理人ID为管理员账号 chufajilu.save() # 11.4 更新商家订单扩展表 try: - dingdan = Dingdan.query.get(dingdan_id=dingdan_id) + dingdan = Order.query.get(OrderID=dingdan_id) if hasattr(dingdan, 'shangjia_kuozhan'): shangjia_kuozhan = dingdan.shangjia_kuozhan - shangjia_kuozhan.sqzhuangtai = 1 # 已处罚 + shangjia_kuozhan.PenaltyApplyStatus = 1 # 已处罚 shangjia_kuozhan.save() - except (Dingdan.DoesNotExist, AttributeError): + except (Order.DoesNotExist, AttributeError): # 如果订单或扩展表不存在,继续执行,不中断 pass - logger.info(f"同意处罚成功:订单ID={dingdan_id},打手ID={chufajilu.dashouid}") + logger.info(f"同意处罚成功:订单ID={dingdan_id},打手ID={chufajilu.PlayerID}") elif caozuo == 2: # 拒绝处罚 - 需要返还积分(加分) # 🔴【新增】11.5 返还打手积分(加5分) - if chufajilu.jifen > 0: + if chufajilu.DeductedPoints > 0: try: - dashou = UserDashou.query.get(user__UserUID=chufajilu.dashouid) + dashou = UserDashou.query.get(user__UserUID=chufajilu.PlayerID) # 🔴【新增】安全验证:必须积分小于等于5分才允许加分 if dashou.jifen <= 5: # 判断积分是否小于等于5分 - dashou.jifen += chufajilu.jifen # 加5分 + dashou.jifen += chufajilu.DeductedPoints # 加5分 dashou.save() logger.info( - f"拒绝处罚,给打手{dashou.user.yonghuid}返还积分{chufajilu.jifen}分,当前积分{dashou.jifen}") + f"拒绝处罚,给打手{dashou.user.yonghuid}返还积分{chufajilu.DeductedPoints}分,当前积分{dashou.jifen}") else: # 积分已超过5分,可能是异常情况,记录警告但不中断处理 logger.warning( - f"拒绝处罚时打手积分异常:打手ID={chufajilu.dashouid},当前积分{dashou.jifen}已超过5分,不再加分") + f"拒绝处罚时打手积分异常:打手ID={chufajilu.PlayerID},当前积分{dashou.jifen}已超过5分,不再加分") except UserDashou.DoesNotExist: # 打手不存在,记录错误,但继续处理状态 - logger.error(f"拒绝处罚时打手不存在:打手ID={chufajilu.dashouid}") + logger.error(f"拒绝处罚时打手不存在:打手ID={chufajilu.PlayerID}") # 11.6 更新处罚记录 - chufajilu.sqzhuangtai = 2 # 已拒绝 - chufajilu.chuliid = qianzhanghao # 处理人ID为管理员账号 - chufajilu.bhliyou = bohui_liyou # 拒绝理由 + chufajilu.ApplyStatus = 2 # 已拒绝 + chufajilu.ProcessorID = qianzhanghao # 处理人ID为管理员账号 + chufajilu.RejectReason = bohui_liyou # 拒绝理由 chufajilu.save() # 11.7 更新商家订单扩展表 try: - dingdan = Dingdan.query.get(dingdan_id=dingdan_id) + dingdan = Order.query.get(OrderID=dingdan_id) if hasattr(dingdan, 'shangjia_kuozhan'): shangjia_kuozhan = dingdan.shangjia_kuozhan - shangjia_kuozhan.sqzhuangtai = 2 # 已拒绝 - shangjia_kuozhan.bhliyou = bohui_liyou # 拒绝理由 + shangjia_kuozhan.PenaltyApplyStatus = 2 # 已拒绝 + shangjia_kuozhan.RejectReason = bohui_liyou # 拒绝理由 shangjia_kuozhan.save() - except (Dingdan.DoesNotExist, AttributeError): + except (Order.DoesNotExist, AttributeError): # 如果订单或扩展表不存在,继续执行,不中断 pass @@ -6035,14 +6035,14 @@ class ChufaJiluHuoquView(APIView): """ try: # 使用单个查询获取所有统计信息 - stats = Chufajilu.query.filter(dashouid=yonghuid).aggregate( + stats = PenaltyRecord.query.filter(PlayerID=yonghuid).aggregate( # 总记录数 zongshu=Count('id'), # 待处理数:状态为0(待处罚)和3(申诉中) daichuli=Count( Case( - When(Q(sqzhuangtai=0) | Q(sqzhuangtai=3), then=1), + When(Q(ApplyStatus=0) | Q(ApplyStatus=3), then=1), output_field=IntegerField() ) ), @@ -6050,7 +6050,7 @@ class ChufaJiluHuoquView(APIView): # 已处理数:状态为1(已处罚)和2(已驳回) yichuli=Count( Case( - When(Q(sqzhuangtai=1) | Q(sqzhuangtai=2), then=1), + When(Q(ApplyStatus=1) | Q(ApplyStatus=2), then=1), output_field=IntegerField() ) ) @@ -6096,15 +6096,15 @@ class ChufaJiluHuoquView(APIView): # 获取状态筛选参数 zhuangtai = request_data.get('zhuangtai', 0) - # 🔴 构建查询条件 - 打手端根据dashouid查询 - queryset = Chufajilu.query.filter(dashouid=yonghuid) + # 🔴 构建查询条件 - 打手端根据PlayerID查询 + queryset = PenaltyRecord.query.filter(PlayerID=yonghuid) if zhuangtai == 0: # 待处理:状态为0(待处罚)和3(申诉中) - queryset = queryset.filter(Q(sqzhuangtai=0) | Q(sqzhuangtai=3)) + queryset = queryset.filter(Q(ApplyStatus=0) | Q(ApplyStatus=3)) elif zhuangtai == 1: # 已处理:状态为1(已处罚)和2(已驳回) - queryset = queryset.filter(Q(sqzhuangtai=1) | Q(sqzhuangtai=2)) + queryset = queryset.filter(Q(ApplyStatus=1) | Q(ApplyStatus=2)) else: # 默认返回所有状态 pass @@ -6153,10 +6153,10 @@ class ChufaJiluHuoquView(APIView): shangjia_ids = [] for record in chufa_records: - if record.dingdan_id: - dingdan_ids.append(record.dingdan_id) - if record.qingqiuid: # 商家ID - shangjia_ids.append(record.qingqiuid) + if record.OrderID: + dingdan_ids.append(record.OrderID) + if record.ApplicantID: # 商家ID + shangjia_ids.append(record.ApplicantID) # 去重 dingdan_ids = list(set(dingdan_ids)) @@ -6166,36 +6166,36 @@ class ChufaJiluHuoquView(APIView): # 1. 查询证据图片(商家上传的) zhengju_mapping = {} if dingdan_ids and shangjia_ids: - # 构建Q对象:dingdan_id在列表中 AND yonghuid在商家ID列表中 - zhengju_q = Q(dingdan_id__in=dingdan_ids, yonghuid__in=shangjia_ids) - zhengju_queryset = Chufatupian.query.filter(zhengju_q).values('dingdan_id', 'yonghuid', 'tupian') + # 构建Q对象:OrderID在列表中 AND UserID在商家ID列表中 + zhengju_q = Q(OrderID__in=dingdan_ids, UserID__in=shangjia_ids) + zhengju_queryset = PenaltyEvidenceImage.query.filter(zhengju_q).values('OrderID', 'UserID', 'ImageURL') for item in zhengju_queryset: - key = f"{item['dingdan_id']}_{item['yonghuid']}" + key = f"{item['OrderID']}_{item['UserID']}" if key not in zhengju_mapping: zhengju_mapping[key] = [] - if item['tupian']: - zhengju_mapping[key].append(item['tupian']) + if item['ImageURL']: + zhengju_mapping[key].append(item['ImageURL']) # 2. 查询申诉图片(打手上传的) shensu_mapping = {} if dingdan_ids: - # 构建Q对象:dingdan_id在列表中 AND yonghuid=当前打手ID - shensu_q = Q(dingdan_id__in=dingdan_ids, yonghuid=yonghuid) - shensu_queryset = Chufatupian.query.filter(shensu_q).values('dingdan_id', 'yonghuid', 'tupian') + # 构建Q对象:OrderID在列表中 AND UserID=当前打手ID + shensu_q = Q(OrderID__in=dingdan_ids, UserID=yonghuid) + shensu_queryset = PenaltyEvidenceImage.query.filter(shensu_q).values('OrderID', 'UserID', 'ImageURL') for item in shensu_queryset: - key = f"{item['dingdan_id']}_{item['yonghuid']}" + key = f"{item['OrderID']}_{item['UserID']}" if key not in shensu_mapping: shensu_mapping[key] = [] - if item['tupian']: - shensu_mapping[key].append(item['tupian']) + if item['ImageURL']: + shensu_mapping[key].append(item['ImageURL']) # 🔴【核心修复】组装返回数据 - 字段保持原样! chufa_list = [] for record in chufa_records: - dingdan_id = record.dingdan_id - shangjia_id = record.qingqiuid + dingdan_id = record.OrderID + shangjia_id = record.ApplicantID # 获取证据图片(商家上传的) zhengju_tupian = [] @@ -6212,12 +6212,12 @@ class ChufaJiluHuoquView(APIView): # 🔴【字段保持原样!】与前端完全对应! chufa_data = { 'id': record.id, - 'dingdan_id': record.dingdan_id or '', - 'qingqiuid': record.qingqiuid or '', # 商家ID - 'cfliyou': record.cfliyou or '', - 'sqzhuangtai': record.sqzhuangtai or 0, - 'ssliyou': record.ssliyou or '', - 'jifen': record.jifen or 0, + 'dingdan_id': record.OrderID or '', + 'qingqiuid': record.ApplicantID or '', # 商家ID + 'cfliyou': record.PenaltyReason or '', + 'sqzhuangtai': record.ApplyStatus or 0, + 'ssliyou': record.AppealReason or '', + 'jifen': record.DeductedPoints or 0, 'create_time': record.create_time.strftime('%Y-%m-%d %H:%M:%S') if record.create_time else '', 'update_time': record.update_time.strftime('%Y-%m-%d %H:%M:%S') if record.update_time else '', 'zhengju_tupian': zhengju_tupian, # 商家上传的证据图片 @@ -6333,11 +6333,11 @@ class DashouShensuView(APIView): with transaction.atomic(): # 1. 查询处罚记录 try: - chufa_record = Chufajilu.objects.select_for_update().get( + chufa_record = PenaltyRecord.objects.select_for_update().get( id=chufa_id, - dashouid=yonghuid # 确保只能申诉自己的处罚记录 + PlayerID=yonghuid # 确保只能申诉自己的处罚记录 ) - except Chufajilu.DoesNotExist: + except PenaltyRecord.DoesNotExist: return Response({ 'code': 10, 'msg': '处罚记录不存在或无权申诉', @@ -6345,7 +6345,7 @@ class DashouShensuView(APIView): }, status=status.HTTP_404_NOT_FOUND) # 2. 验证处罚记录状态(必须是待处理状态0) - if chufa_record.sqzhuangtai != 0: + if chufa_record.ApplyStatus != 0: return Response({ 'code': 11, 'msg': '该处罚记录已处理,无法申诉', @@ -6353,16 +6353,16 @@ class DashouShensuView(APIView): }, status=status.HTTP_400_BAD_REQUEST) # 3. 验证订单是否存在(可选,根据需求决定) - # 这里可以根据dingdan_id去查询订单表,但根据需求描述,我们已经有了处罚记录 - # 处罚记录中包含了dingdan_id,如果dingdan_id不存在,说明订单可能被删除 + # 这里可以根据OrderID去查询订单表,但根据需求描述,我们已经有了处罚记录 + # 处罚记录中包含了OrderID,如果OrderID不存在,说明订单可能被删除 # 但根据业务逻辑,有处罚记录就应该有订单,所以这里可以跳过这个检查 # 4. 检查是否已有申诉记录(防止重复申诉) - if chufa_record.ssliyou or chufa_record.sqzhuangtai == 3: + if chufa_record.AppealReason or chufa_record.ApplyStatus == 3: # 检查是否已经有申诉图片 - existing_shensu_tupian = Chufatupian.query.filter( - dingdan_id=chufa_record.dingdan_id, - yonghuid=yonghuid + existing_shensu_tupian = PenaltyEvidenceImage.query.filter( + OrderID=chufa_record.OrderID, + UserID=yonghuid ).exists() if existing_shensu_tupian: @@ -6373,8 +6373,8 @@ class DashouShensuView(APIView): }, status=status.HTTP_400_BAD_REQUEST) # 5. 更新处罚记录 - chufa_record.ssliyou = shensu_liyou - chufa_record.sqzhuangtai = 3 # 状态改为申诉中 + chufa_record.AppealReason = shensu_liyou + chufa_record.ApplyStatus = 3 # 状态改为申诉中 chufa_record.save() # 6. 保存申诉图片(如果有) @@ -6382,26 +6382,26 @@ class DashouShensuView(APIView): if shensu_tupian_urls: for tupian_url in shensu_tupian_urls: if tupian_url: # 确保URL不为空 - chufa_tupian = Chufatupian.query.create( - dingdan_id=chufa_record.dingdan_id, - yonghuid=yonghuid, - tupian=tupian_url + chufa_tupian = PenaltyEvidenceImage.query.create( + OrderID=chufa_record.OrderID, + UserID=yonghuid, + ImageURL=tupian_url ) saved_tupian_urls.append(tupian_url) # 7. 构建返回数据 response_data = { 'chufa_id': chufa_record.id, - 'dingdan_id': chufa_record.dingdan_id or '', + 'dingdan_id': chufa_record.OrderID or '', 'shensu_liyou': shensu_liyou, 'shensu_tupian_urls': saved_tupian_urls, - 'sqzhuangtai': chufa_record.sqzhuangtai, + 'sqzhuangtai': chufa_record.ApplyStatus, 'update_time': chufa_record.update_time.strftime( '%Y-%m-%d %H:%M:%S') if chufa_record.update_time else '' } # 记录操作日志 - logger.info(f"打手申诉成功 - 用户ID: {yonghuid}, 处罚ID: {chufa_id}, 订单ID: {chufa_record.dingdan_id}") + logger.info(f"打手申诉成功 - 用户ID: {yonghuid}, 处罚ID: {chufa_id}, 订单ID: {chufa_record.OrderID}") return Response({ 'code': 0, @@ -6475,18 +6475,18 @@ class ShangjiaChufaJiluHuoquView(APIView): 获取统计信息 """ try: - # 🔴 查询条件:qingqiuid = 当前商家ID - stats = Chufajilu.query.filter(qingqiuid=yonghuid).aggregate( + # 🔴 查询条件:ApplicantID = 当前商家ID + stats = PenaltyRecord.query.filter(ApplicantID=yonghuid).aggregate( zongshu=Count('id'), daichuli=Count( Case( - When(Q(sqzhuangtai=0) | Q(sqzhuangtai=3), then=1), + When(Q(ApplyStatus=0) | Q(ApplyStatus=3), then=1), output_field=IntegerField() ) ), yichuli=Count( Case( - When(Q(sqzhuangtai=1) | Q(sqzhuangtai=2), then=1), + When(Q(ApplyStatus=1) | Q(ApplyStatus=2), then=1), output_field=IntegerField() ) ) @@ -6530,13 +6530,13 @@ class ShangjiaChufaJiluHuoquView(APIView): # 获取状态筛选参数 zhuangtai = request_data.get('zhuangtai', 0) - # 🔴 查询条件:qingqiuid = 当前商家ID - queryset = Chufajilu.query.filter(qingqiuid=yonghuid) + # 🔴 查询条件:ApplicantID = 当前商家ID + queryset = PenaltyRecord.query.filter(ApplicantID=yonghuid) if zhuangtai == 0: - queryset = queryset.filter(Q(sqzhuangtai=0) | Q(sqzhuangtai=3)) + queryset = queryset.filter(Q(ApplyStatus=0) | Q(ApplyStatus=3)) elif zhuangtai == 1: - queryset = queryset.filter(Q(sqzhuangtai=1) | Q(sqzhuangtai=2)) + queryset = queryset.filter(Q(ApplyStatus=1) | Q(ApplyStatus=2)) else: pass @@ -6581,10 +6581,10 @@ class ShangjiaChufaJiluHuoquView(APIView): dashou_ids = [] for record in chufa_records: - if record.dingdan_id: - dingdan_ids.append(record.dingdan_id) - if record.dashouid: # 打手ID - dashou_ids.append(record.dashouid) + if record.OrderID: + dingdan_ids.append(record.OrderID) + if record.PlayerID: # 打手ID + dashou_ids.append(record.PlayerID) # 去重 dingdan_ids = list(set(dingdan_ids)) @@ -6594,36 +6594,36 @@ class ShangjiaChufaJiluHuoquView(APIView): # 1. 查询证据图片(商家自己上传的) zhengju_mapping = {} if dingdan_ids: - # 构建Q对象:dingdan_id在列表中 AND yonghuid=当前商家ID - zhengju_q = Q(dingdan_id__in=dingdan_ids, yonghuid=yonghuid) - zhengju_queryset = Chufatupian.query.filter(zhengju_q).values('dingdan_id', 'yonghuid', 'tupian') + # 构建Q对象:OrderID在列表中 AND UserID=当前商家ID + zhengju_q = Q(OrderID__in=dingdan_ids, UserID=yonghuid) + zhengju_queryset = PenaltyEvidenceImage.query.filter(zhengju_q).values('OrderID', 'UserID', 'ImageURL') for item in zhengju_queryset: - key = f"{item['dingdan_id']}_{item['yonghuid']}" + key = f"{item['OrderID']}_{item['UserID']}" if key not in zhengju_mapping: zhengju_mapping[key] = [] - if item['tupian']: - zhengju_mapping[key].append(item['tupian']) + if item['ImageURL']: + zhengju_mapping[key].append(item['ImageURL']) # 2. 查询申诉图片(打手上传的) shensu_mapping = {} if dingdan_ids and dashou_ids: - # 构建Q对象:dingdan_id在列表中 AND yonghuid在打手ID列表中 - shensu_q = Q(dingdan_id__in=dingdan_ids, yonghuid__in=dashou_ids) - shensu_queryset = Chufatupian.query.filter(shensu_q).values('dingdan_id', 'yonghuid', 'tupian') + # 构建Q对象:OrderID在列表中 AND UserID在打手ID列表中 + shensu_q = Q(OrderID__in=dingdan_ids, UserID__in=dashou_ids) + shensu_queryset = PenaltyEvidenceImage.query.filter(shensu_q).values('OrderID', 'UserID', 'ImageURL') for item in shensu_queryset: - key = f"{item['dingdan_id']}_{item['yonghuid']}" + key = f"{item['OrderID']}_{item['UserID']}" if key not in shensu_mapping: shensu_mapping[key] = [] - if item['tupian']: - shensu_mapping[key].append(item['tupian']) + if item['ImageURL']: + shensu_mapping[key].append(item['ImageURL']) # 🔴【核心修复】组装返回数据 - 字段保持原样! chufa_list = [] for record in chufa_records: - dingdan_id = record.dingdan_id - dashou_id = record.dashouid + dingdan_id = record.OrderID + dashou_id = record.PlayerID # 获取证据图片(商家自己上传的) zhengju_tupian = [] @@ -6640,12 +6640,12 @@ class ShangjiaChufaJiluHuoquView(APIView): # 🔴【字段保持原样!】与前端完全对应! chufa_data = { 'id': record.id, - 'dingdan_id': record.dingdan_id or '', - 'qingqiuid': record.dashouid or '', # 打手ID - 'cfliyou': record.cfliyou or '', - 'sqzhuangtai': record.sqzhuangtai or 0, - 'ssliyou': record.ssliyou or '', - 'jifen': record.jifen or 0, + 'dingdan_id': record.OrderID or '', + 'qingqiuid': record.PlayerID or '', # 打手ID + 'cfliyou': record.PenaltyReason or '', + 'sqzhuangtai': record.ApplyStatus or 0, + 'ssliyou': record.AppealReason or '', + 'jifen': record.DeductedPoints or 0, 'create_time': record.create_time.strftime('%Y-%m-%d %H:%M:%S') if record.create_time else '', 'update_time': record.update_time.strftime('%Y-%m-%d %H:%M:%S') if record.update_time else '', 'zhengju_tupian': zhengju_tupian, # 商家自己上传的证据图片 @@ -6999,72 +6999,72 @@ class KefuGetOrderListView(APIView): # ---------- 查询条件 ---------- # 基础条件:平台发单 + 非跨平台 - base_q = Q(fadan_pingtai=1) + base_q = Q(Platform=1) if dingdan_id: - q_conditions = base_q & Q(dingdan_id=dingdan_id) + q_conditions = base_q & Q(OrderID=dingdan_id) else: q_conditions = base_q if leixing is not None: try: leixing_int = int(leixing) - q_conditions &= Q(leixing_id=leixing_int) + q_conditions &= Q(ProductTypeID=leixing_int) except (ValueError, TypeError): pass if zhuangtai and zhuangtai != 'all': try: status_list = [int(s.strip()) for s in zhuangtai.split(',') if s.strip()] if status_list: - q_conditions &= Q(zhuangtai__in=status_list) + q_conditions &= Q(Status__in=status_list) except (ValueError, TypeError): pass if dashou_id: - q_conditions &= Q(jiedan_dashou_id=dashou_id) + q_conditions &= Q(PlayerID=dashou_id) if laoban_id: - q_conditions &= Q(pingtai_kuozhan__laoban_id=laoban_id) + q_conditions &= Q(pingtai_kuozhan__BossID=laoban_id) if date: - q_conditions &= Q(create_time__date=date) + q_conditions &= Q(CreateTime__date=date) # 新增筛选条件 if nicheng: - q_conditions &= Q(nicheng__icontains=nicheng) + q_conditions &= Q(Nickname__icontains=nicheng) if jieshao: - q_conditions &= Q(jieshao__icontains=jieshao) + q_conditions &= Q(Description__icontains=jieshao) if clkf: - q_conditions &= Q(clkf__icontains=clkf) + q_conditions &= Q(AssignedCS__icontains=clkf) # ---------- 统计(仅按发单平台,非跨平台) ---------- - stats = Dingdan.query.filter(fadan_pingtai=1).aggregate( + stats = Order.query.filter(Platform=1).aggregate( total_orders=Count('id'), - completed_orders=Count('id', filter=Q(zhuangtai=3)), - refund_orders=Count('id', filter=Q(zhuangtai=5)), - pending_orders=Count('id', filter=Q(zhuangtai__in=[4,8])) + completed_orders=Count('id', filter=Q(Status=3)), + refund_orders=Count('id', filter=Q(Status=5)), + pending_orders=Count('id', filter=Q(Status__in=[4,8])) ) # ---------- 状态计数(所有状态都返回,非跨平台) ---------- status_counts = { - 'all': Dingdan.query.filter(fadan_pingtai=1).count(), - '1,7': Dingdan.query.filter(fadan_pingtai=1, zhuangtai__in=[1,7]).count(), - '2': Dingdan.query.filter(fadan_pingtai=1, zhuangtai=2).count(), - '8': Dingdan.query.filter(fadan_pingtai=1, zhuangtai=8).count(), - '3': Dingdan.query.filter(fadan_pingtai=1, zhuangtai=3).count(), - '4': Dingdan.query.filter(fadan_pingtai=1, zhuangtai=4).count(), - '5': Dingdan.query.filter(fadan_pingtai=1, zhuangtai=5).count(), - '6': Dingdan.query.filter(fadan_pingtai=1, zhuangtai=6).count(), + 'all': Order.query.filter(Platform=1).count(), + '1,7': Order.query.filter(Platform=1, Status__in=[1,7]).count(), + '2': Order.query.filter(Platform=1, Status=2).count(), + '8': Order.query.filter(Platform=1, Status=8).count(), + '3': Order.query.filter(Platform=1, Status=3).count(), + '4': Order.query.filter(Platform=1, Status=4).count(), + '5': Order.query.filter(Platform=1, Status=5).count(), + '6': Order.query.filter(Platform=1, Status=6).count(), } # ---------- 分页查询 ---------- - total_count = Dingdan.query.filter(q_conditions).count() + total_count = Order.query.filter(q_conditions).count() - orders_qs = Dingdan.query.filter(q_conditions).select_related( + orders_qs = Order.query.filter(q_conditions).select_related( 'pingtai_kuozhan' ).only( - 'dingdan_id', 'jieshao', 'zhuangtai', 'leixing_id', 'fadan_pingtai', - 'jine', 'tupian', 'create_time', 'nicheng', 'jiedan_dashou_id', - 'pingtai_kuozhan__laoban_id' - ).order_by('-create_time')[(page-1)*page_size : page*page_size] + 'OrderID', 'Description', 'Status', 'ProductTypeID', 'Platform', + 'Amount', 'ImageURL', 'CreateTime', 'Nickname', 'PlayerID', + 'pingtai_kuozhan__BossID' + ).order_by('-CreateTime')[(page-1)*page_size : page*page_size] # ---------- 获取老板昵称 ---------- - laoban_ids = [o.pingtai_kuozhan.laoban_id for o in orders_qs if hasattr(o, 'pingtai_kuozhan') and o.pingtai_kuozhan.laoban_id] + laoban_ids = [o.pingtai_kuozhan.BossID for o in orders_qs if hasattr(o, 'pingtai_kuozhan') and o.pingtai_kuozhan.BossID] nickname_map = {} if laoban_ids: users = User.query.filter(UserUID__in=laoban_ids).select_related('boss_profile').only( @@ -7076,17 +7076,17 @@ class KefuGetOrderListView(APIView): result_list = [] for order in orders_qs: ext = getattr(order, 'pingtai_kuozhan', None) - laoban_id = ext.laoban_id if ext else '' - youxi_nicheng = nickname_map.get(laoban_id, order.nicheng or '') + laoban_id = ext.BossID if ext else '' + youxi_nicheng = nickname_map.get(laoban_id, order.Nickname or '') result_list.append({ - 'dingdan_id': order.dingdan_id or '', - 'jieshao': order.jieshao or '', - 'zhuangtai': order.zhuangtai, - 'leixing': order.leixing_id, - 'fadanpingtai': order.fadan_pingtai, - 'jiage': float(order.jine) if order.jine else 0.00, - 'tupian_url': order.tupian or '', - 'fadanshijian': order.create_time.strftime('%Y-%m-%d %H:%M:%S') if order.create_time else '', + 'dingdan_id': order.OrderID or '', + 'jieshao': order.Description or '', + 'zhuangtai': order.Status, + 'leixing': order.ProductTypeID, + 'fadanpingtai': order.Platform, + 'jiage': float(order.Amount) if order.Amount else 0.00, + 'tupian_url': order.ImageURL or '', + 'fadanshijian': order.CreateTime.strftime('%Y-%m-%d %H:%M:%S') if order.CreateTime else '', 'youxi_nicheng': youxi_nicheng }) @@ -7184,56 +7184,56 @@ class KefuGetShangjiaOrderListView(APIView): except (ValueError, TypeError): pass if dashou_id: - q_conditions &= Q(jiedan_dashou_id=dashou_id) + q_conditions &= Q(PlayerID=dashou_id) if shangjia_id: - q_conditions &= Q(shangjia_kuozhan__shangjia_id=shangjia_id) + q_conditions &= Q(shangjia_kuozhan__MerchantID=shangjia_id) if date: - q_conditions &= Q(create_time__date=date) + q_conditions &= Q(CreateTime__date=date) if nicheng: - q_conditions &= Q(nicheng__icontains=nicheng) + q_conditions &= Q(Nickname__icontains=nicheng) if jieshao: - q_conditions &= Q(jieshao__icontains=jieshao) + q_conditions &= Q(Description__icontains=jieshao) if clkf: - q_conditions &= Q(clkf__icontains=clkf) + q_conditions &= Q(AssignedCS__icontains=clkf) if shangjia_nicheng: # 通过商家扩展表关联 UserShangjia 的昵称 - q_conditions &= Q(shangjia_kuozhan__shangjia_id__in=User.query.filter( + q_conditions &= Q(shangjia_kuozhan__MerchantID__in=User.query.filter( shop_profile__nicheng__icontains=shangjia_nicheng ).values_list('UserUID', flat=True)) # ---------- 统计(仅按发单平台,非跨平台) ---------- - stats = Dingdan.query.filter(fadan_pingtai=2).aggregate( + stats = Order.query.filter(Platform=2).aggregate( total_orders=Count('id'), - completed_orders=Count('id', filter=Q(zhuangtai=3)), - refund_orders=Count('id', filter=Q(zhuangtai=5)), - pending_orders=Count('id', filter=Q(zhuangtai__in=[4,8])) + completed_orders=Count('id', filter=Q(Status=3)), + refund_orders=Count('id', filter=Q(Status=5)), + pending_orders=Count('id', filter=Q(Status__in=[4,8])) ) # ---------- 状态计数(所有状态都返回,非跨平台) ---------- status_counts = { - 'all': Dingdan.query.filter(fadan_pingtai=2).count(), - '1,7': Dingdan.query.filter(fadan_pingtai=2, zhuangtai__in=[1,7]).count(), - '2': Dingdan.query.filter(fadan_pingtai=2, zhuangtai=2).count(), - '8': Dingdan.query.filter(fadan_pingtai=2, zhuangtai=8).count(), - '3': Dingdan.query.filter(fadan_pingtai=2, zhuangtai=3).count(), - '4': Dingdan.query.filter(fadan_pingtai=2, zhuangtai=4).count(), - '5': Dingdan.query.filter(fadan_pingtai=2, zhuangtai=5).count(), - '6': Dingdan.query.filter(fadan_pingtai=2, zhuangtai=6).count(), + 'all': Order.query.filter(Platform=2).count(), + '1,7': Order.query.filter(Platform=2, Status__in=[1,7]).count(), + '2': Order.query.filter(Platform=2, Status=2).count(), + '8': Order.query.filter(Platform=2, Status=8).count(), + '3': Order.query.filter(Platform=2, Status=3).count(), + '4': Order.query.filter(Platform=2, Status=4).count(), + '5': Order.query.filter(Platform=2, Status=5).count(), + '6': Order.query.filter(Platform=2, Status=6).count(), } # ---------- 分页查询 ---------- - total_count = Dingdan.query.filter(q_conditions).count() + total_count = Order.query.filter(q_conditions).count() - orders_qs = Dingdan.query.filter(q_conditions).select_related( + orders_qs = Order.query.filter(q_conditions).select_related( 'shangjia_kuozhan' ).only( - 'dingdan_id', 'jieshao', 'zhuangtai', 'leixing_id', 'fadan_pingtai', - 'jine', 'tupian', 'create_time', 'nicheng', 'jiedan_dashou_id', - 'shangjia_kuozhan__shangjia_id' - ).order_by('-create_time')[(page-1)*page_size : page*page_size] + 'OrderID', 'Description', 'Status', 'ProductTypeID', 'Platform', + 'Amount', 'ImageURL', 'CreateTime', 'Nickname', 'PlayerID', + 'shangjia_kuozhan__MerchantID' + ).order_by('-CreateTime')[(page-1)*page_size : page*page_size] # ---------- 获取商家昵称 ---------- - shangjia_ids = [o.shangjia_kuozhan.shangjia_id for o in orders_qs if hasattr(o, 'shangjia_kuozhan') and o.shangjia_kuozhan.shangjia_id] + shangjia_ids = [o.shangjia_kuozhan.MerchantID for o in orders_qs if hasattr(o, 'shangjia_kuozhan') and o.shangjia_kuozhan.MerchantID] nickname_map = {} if shangjia_ids: users = User.query.filter(UserUID__in=shangjia_ids).select_related('shop_profile').only( @@ -7245,17 +7245,17 @@ class KefuGetShangjiaOrderListView(APIView): result_list = [] for order in orders_qs: ext = getattr(order, 'shangjia_kuozhan', None) - shangjia_id = ext.shangjia_id if ext else '' - youxi_nicheng = order.nicheng or '' # 商家订单的玩家昵称 + shangjia_id = ext.MerchantID if ext else '' + youxi_nicheng = order.Nickname or '' # 商家订单的玩家昵称 result_list.append({ - 'dingdan_id': order.dingdan_id or '', - 'jieshao': order.jieshao or '', - 'zhuangtai': order.zhuangtai, - 'leixing': order.leixing_id, - 'fadanpingtai': order.fadan_pingtai, - 'jiage': float(order.jine) if order.jine else 0.00, - 'tupian_url': order.tupian or '', - 'fadanshijian': order.create_time.strftime('%Y-%m-%d %H:%M:%S') if order.create_time else '', + 'dingdan_id': order.OrderID or '', + 'jieshao': order.Description or '', + 'zhuangtai': order.Status, + 'leixing': order.ProductTypeID, + 'fadanpingtai': order.Platform, + 'jiage': float(order.Amount) if order.Amount else 0.00, + 'tupian_url': order.ImageURL or '', + 'fadanshijian': order.CreateTime.strftime('%Y-%m-%d %H:%M:%S') if order.CreateTime else '', 'youxi_nicheng': youxi_nicheng }) @@ -7332,12 +7332,12 @@ class KefuChangeDashouView(APIView): # 3. 查询订单 try: - order = Dingdan.query.get(dingdan_id=dingdan_id) - except Dingdan.DoesNotExist: + order = Order.query.get(OrderID=dingdan_id) + except Order.DoesNotExist: return Response({'code': 404, 'msg': '订单不存在'}, status=status.HTTP_404_NOT_FOUND) # 4. 验证订单状态是否允许更换打手(进行中2 或 结算中8) - if order.zhuangtai not in [2, 8]: + if order.Status not in [2, 8]: return Response({'code': 400, 'msg': '订单状态不允许更换打手'}, status=status.HTTP_400_BAD_REQUEST) # 5. 查询新打手 @@ -7360,10 +7360,10 @@ class KefuChangeDashouView(APIView): return Response({'code': 400, 'msg': '打手积分不足,无法接单'}, status=status.HTTP_400_BAD_REQUEST) # 8. 根据订单的抢单要求类型进行额外验证 - yaoqiuleixing = order.yaoqiuleixing + yaoqiuleixing = order.GrabRequirement if yaoqiuleixing == 1: # 会员抢单 - huiyuan_id = order.huiyuan_id + huiyuan_id = order.MembershipID if not huiyuan_id: return Response({'code': 400, 'msg': '订单会员ID为空'}, status=status.HTTP_400_BAD_REQUEST) @@ -7382,7 +7382,7 @@ class KefuChangeDashouView(APIView): return Response({'code': 400, 'msg': '打手的会员已过期'}, status=status.HTTP_400_BAD_REQUEST) elif yaoqiuleixing == 2: # 押金抢单 - order_yajin = order.yongjin # 假设订单的 yongjin 字段存储押金要求 + order_yajin = order.CommissionReq # 假设订单的 yongjin 字段存储押金要求 if order_yajin is None: return Response({'code': 400, 'msg': '订单押金为空'}, status=status.HTTP_400_BAD_REQUEST) @@ -7401,7 +7401,7 @@ class KefuChangeDashouView(APIView): new_dashou_profile.save() # 9.2 处理原打手(如果存在) - old_dashou_id = order.jiedan_dashou_id + old_dashou_id = order.PlayerID if old_dashou_id: try: old_dashou_user = User.query.get(UserUID=old_dashou_id) @@ -7416,9 +7416,9 @@ class KefuChangeDashouView(APIView): logger.error(f"更新原打手时异常: {str(e)}", exc_info=True) # 9.3 更新订单 - order.jiedan_dashou_id = new_dashou_id - order.zhuangtai = 2 # 进行中 - order.clkf = current_user.yonghuid # 记录处理客服ID + order.PlayerID = new_dashou_id + order.Status = 2 # 进行中 + order.AssignedCS = current_user.yonghuid # 记录处理客服ID order.save() return Response({'code': 0, 'msg': '更换打手成功'}) @@ -7467,23 +7467,23 @@ class KefuRecoverOrderView(APIView): # 3. 查询订单 try: - order = Dingdan.query.get(dingdan_id=dingdan_id) - except Dingdan.DoesNotExist: + order = Order.query.get(OrderID=dingdan_id) + except Order.DoesNotExist: return Response({'code': 404, 'msg': '订单不存在'}, status=status.HTTP_404_NOT_FOUND) # 4. 验证订单状态是否为9(未付款) - if order.zhuangtai != 9: + if order.Status != 9: return Response({'code': 400, 'msg': '订单状态不允许恢复'}, status=status.HTTP_400_BAD_REQUEST) # 5. 根据是否有指定ID决定新状态 - if order.zhiding_id: + if order.AssignedID: new_status = 7 # 指定中 else: new_status = 1 # 下单中 # 6. 更新订单 - order.zhuangtai = new_status - order.clkf = current_user.yonghuid + order.Status = new_status + order.AssignedCS = current_user.yonghuid order.save() return Response({'code': 0, 'msg': '恢复成功', 'data': {'new_status': new_status}}) @@ -7543,24 +7543,24 @@ class KefuPlatformRefundView(APIView): # 3. 查询订单并加锁 try: with transaction.atomic(): - order = Dingdan.query.select_related('pingtai_kuozhan').select_for_update().get(dingdan_id=dingdan_id) + order = Order.query.select_related('pingtai_kuozhan').select_for_update().get(OrderID=dingdan_id) # 4. 验证平台订单 - if order.fadan_pingtai != 1: + if order.Platform != 1: return Response({'code': 400, 'msg': '该订单不是平台订单'}, status=status.HTTP_400_BAD_REQUEST) # 5. 验证状态允许退款(根据模型,状态值:1下单中,2进行中,3已完成,4退款审核,5已退款,6退款失败,7指定中,8结算中) allowed_statuses = [1, 2, 4, 7, 8] # 允许退款的已支付或处理中状态 - if order.zhuangtai not in allowed_statuses: + if order.Status not in allowed_statuses: return Response({'code': 400, 'msg': '订单状态不允许退款'}, status=status.HTTP_400_BAD_REQUEST) # 6. 获取微信交易号(如果存在) - wechat_transaction_id = getattr(order, 'wechat_transaction_id', None) + wechat_transaction_id = getattr(order, 'WechatTransactionID', None) # 7. 调用微信退款接口 refund_result = self.call_wechat_refund( - dingdan_id=order.dingdan_id, - jine=order.jine, + dingdan_id=order.OrderID, + jine=order.Amount, transaction_id=wechat_transaction_id ) @@ -7570,14 +7570,14 @@ class KefuPlatformRefundView(APIView): return Response({'code': 400, 'msg': refund_result['msg']}, status=status.HTTP_400_BAD_REQUEST) # 8. 更新订单状态为5(已退款) - order.zhuangtai = 5 - order.clkf = current_user.phone # 记录处理客服手机号 + order.Status = 5 + order.AssignedCS = current_user.phone # 记录处理客服手机号 if tuikuan_liyou: - order.tkly = tuikuan_liyou + order.RefundReason = tuikuan_liyou order.save() # 9. 更新打手数据 - jiedan_dashou_id = order.jiedan_dashou_id + jiedan_dashou_id = order.PlayerID if jiedan_dashou_id: try: dashou_user = User.query.get(UserUID=jiedan_dashou_id) @@ -7592,33 +7592,33 @@ class KefuPlatformRefundView(APIView): # ========== 新增:商品和店铺每日统计 ========== try: # 商品每日统计(只要有商品ID就执行) - if order.shangpin_id: + if order.ProductID: # 从扩展表获取已计算好的收益值(下单时已存储) pingtai_shouyi = Decimal('0.00') dianpu_shouyi = Decimal('0.00') if hasattr(order, 'pingtai_kuozhan'): - pingtai_shouyi = order.pingtai_kuozhan.pingtai_shouyi or Decimal('0.00') - dianpu_shouyi = order.pingtai_kuozhan.dianpu_shouyi or Decimal('0.00') + pingtai_shouyi = order.pingtai_kuozhan.PlatformIncome or Decimal('0.00') + dianpu_shouyi = order.pingtai_kuozhan.ShopIncome or Decimal('0.00') update_shangpin_daily_stat( - shangpin_id=order.shangpin_id, + shangpin_id=order.ProductID, caozuo_leixing=3, # 3 = 退款 - dingdan_jiage=order.jine, + dingdan_jiage=order.Amount, pingtai_shouyi=pingtai_shouyi, dianpu_zongshouyi=dianpu_shouyi ) - logger.info(f"商品统计更新完成,商品ID: {order.shangpin_id}") + logger.info(f"商品统计更新完成,商品ID: {order.ProductID}") # 店铺每日统计(仅当存在店铺ID时执行) dianpu_id = None if hasattr(order, 'pingtai_kuozhan'): - dianpu_id = order.pingtai_kuozhan.dianpu_id + dianpu_id = order.pingtai_kuozhan.ShopID if dianpu_id: - dianpu_shouyi = order.pingtai_kuozhan.dianpu_shouyi or Decimal('0.00') + dianpu_shouyi = order.pingtai_kuozhan.ShopIncome or Decimal('0.00') update_dianpu_daily_stat( dianpu_id=dianpu_id, caozuo_leixing=3, # 3 = 退款 - dingdan_jiage=order.jine, + dingdan_jiage=order.Amount, dianpu_shouyi=dianpu_shouyi ) logger.info(f"店铺统计更新完成,店铺ID: {dianpu_id}") @@ -7628,33 +7628,33 @@ class KefuPlatformRefundView(APIView): # 统计失败不影响主流程 # ============================================= - # 10. 更新退款记录表(假设存在 Tuikuanjilu 模型,字段需根据实际调整) + # 10. 更新退款记录表(假设存在 RefundRecord 模型,字段需根据实际调整) #更新支出记录 - update_daily_payout(order.jine) + update_daily_payout(order.Amount) try: - refund_record, created = Tuikuanjilu.query.get_or_create( - dingdan_id=dingdan_id, + refund_record, created = RefundRecord.query.get_or_create( + OrderID=dingdan_id, defaults={ - 'dashouid': jiedan_dashou_id or '', - 'qingqiuid': '', - 'chuliid': phone, - 'liyou': tuikuan_liyou or '客服退款', - 'sqzhuangtai': 1, # 成功 - 'jine': order.jine, - 'dashou_fencheng': order.dashou_fencheng or 0, - 'jieshao': order.jieshao or '', - 'beizhu': '客服平台退款', - 'nicheng': order.nicheng or '', + 'PlayerID': jiedan_dashou_id or '', + 'ApplicantID': '', + 'ProcessorID': phone, + 'Reason': tuikuan_liyou or '客服退款', + 'ApplyStatus': 1, # 成功 + 'Amount': order.Amount, + 'PlayerCommission': order.PlayerCommission or 0, + 'Description': order.Description or '', + 'Remark': '客服平台退款', + 'Nickname': order.Nickname or '', } ) if not created: - refund_record.sqzhuangtai = 1 - refund_record.chuliid = phone + refund_record.ApplyStatus = 1 + refund_record.ProcessorID = phone if tuikuan_liyou: - refund_record.liyou = tuikuan_liyou + refund_record.Reason = tuikuan_liyou refund_record.save() except Exception as e: logger.error(f"平台退款更新退款记录异常: {str(e)}", exc_info=True) @@ -7668,11 +7668,11 @@ class KefuPlatformRefundView(APIView): # 🔥 新增:调用打手每日统计(成交) try: update_dashou_daily_by_action( - yonghuid=order.jiedan_dashou_id, - amount=order.dashou_fencheng, + yonghuid=order.PlayerID, + amount=order.PlayerCommission, action=3 # 3 表示退款(退款) ) - logger.info(f"打手 {order.jiedan_dashou_id} 每日统计更新成功") + logger.info(f"打手 {order.PlayerID} 每日统计更新成功") except Exception as e: logger.error(f"打手每日统计更新失败: {e}") # 不影响主流程 @@ -7680,7 +7680,7 @@ class KefuPlatformRefundView(APIView): logger.info(f"平台退款成功,订单 {dingdan_id},退款单号 {refund_result.get('refund_id')}") return Response({'code': 0, 'msg': '退款成功'}) - except Dingdan.DoesNotExist: + except Order.DoesNotExist: return Response({'code': 404, 'msg': '订单不存在'}, status=status.HTTP_404_NOT_FOUND) except Exception as e: logger.error(f"平台退款接口异常: {str(e)}", exc_info=True) @@ -7820,26 +7820,26 @@ class KefuRejectRefundView(APIView): # 3. 查询订单并加锁 try: with transaction.atomic(): - order = Dingdan.objects.select_for_update().get(dingdan_id=dingdan_id) + order = Order.objects.select_for_update().get(OrderID=dingdan_id) # 4. 验证订单状态为退款审核中(4) - if order.zhuangtai != 4: + if order.Status != 4: return Response({'code': 400, 'msg': '订单状态不是退款审核中'}, status=status.HTTP_400_BAD_REQUEST) # 获取必要字段 - jiedan_dashou_id = order.jiedan_dashou_id - dashou_fencheng = order.dashou_fencheng - fadan_pingtai = order.fadan_pingtai + jiedan_dashou_id = order.PlayerID + dashou_fencheng = order.PlayerCommission + fadan_pingtai = order.Platform # 5. 验证打手分成金额是否存在 if dashou_fencheng is None: return Response({'code': 400, 'msg': '订单缺少打手分成金额'}, status=status.HTTP_400_BAD_REQUEST) # 6. 更新订单状态为退款失败(6) - order.zhuangtai = 6 - order.clkf = current_user.phone # 记录处理客服手机号 + order.Status = 6 + order.AssignedCS = current_user.phone # 记录处理客服手机号 if jujue_liyou: - order.tkly = jujue_liyou + order.RefundReason = jujue_liyou order.save() # 7. 给打手结算(返还分成) @@ -7863,7 +7863,7 @@ class KefuRejectRefundView(APIView): try: # 获取商家订单扩展表 shangjia_kuozhan = order.shangjia_kuozhan - shangjia_id = shangjia_kuozhan.shangjia_id + shangjia_id = shangjia_kuozhan.MerchantID if shangjia_id: shangjia_user = User.query.get(UserUID=shangjia_id) shangjia_profile = shangjia_user.shop_profile @@ -7874,7 +7874,7 @@ class KefuRejectRefundView(APIView): # ✅ 新方法(行为驱动,更安全) update_shangjia_daily( yonghuid=shangjia_id, - amount=Decimal(str(order.jine)), + amount=Decimal(str(order.Amount)), action=2 # 2 = 结算 ) except (ObjectDoesNotExist, User.DoesNotExist, AttributeError): @@ -7882,27 +7882,27 @@ class KefuRejectRefundView(APIView): # 9. 更新退款记录表 try: - refund_record = Tuikuanjilu.query.get(dingdan_id=dingdan_id) - refund_record.sqzhuangtai = 2 # 2表示拒绝 - refund_record.chuliid = phone - refund_record.bhliyou = jujue_liyou # 记录驳回理由(假设模型有此字段) + refund_record = RefundRecord.query.get(OrderID=dingdan_id) + refund_record.ApplyStatus = 2 # 2表示拒绝 + refund_record.ProcessorID = phone + refund_record.RejectReason = jujue_liyou # 记录驳回理由(假设模型有此字段) refund_record.save() logger.info(f"拒绝退款:更新退款记录表,订单 {dingdan_id}") - except Tuikuanjilu.DoesNotExist: + except RefundRecord.DoesNotExist: # 如果退款记录不存在,可以创建一条记录(可选) - Tuikuanjilu.query.create( - dingdan_id=dingdan_id, - dashouid=jiedan_dashou_id or '', - qingqiuid='', - chuliid=phone, - liyou=jujue_liyou or '客服拒绝退款', - sqzhuangtai=2, - jine=order.jine, - dashou_fencheng=dashou_fencheng or 0, - jieshao=order.jieshao or '', - beizhu='客服拒绝退款', - nicheng=order.nicheng or '', - bhliyou=jujue_liyou or '', # 假设模型有 bhliyou 字段 + RefundRecord.query.create( + OrderID=dingdan_id, + PlayerID=jiedan_dashou_id or '', + ApplicantID='', + ProcessorID=phone, + Reason=jujue_liyou or '客服拒绝退款', + ApplyStatus=2, + Amount=order.Amount, + PlayerCommission=dashou_fencheng or 0, + Description=order.Description or '', + Remark='客服拒绝退款', + Nickname=order.Nickname or '', + RejectReason=jujue_liyou or '', ) except Exception as e: logger.error(f"拒绝退款更新退款记录异常: {str(e)}", exc_info=True) @@ -7910,11 +7910,11 @@ class KefuRejectRefundView(APIView): # 🔥 新增:调用打手每日统计(成交) try: update_dashou_daily_by_action( - yonghuid=order.jiedan_dashou_id, + yonghuid=order.PlayerID, amount=dashou_fencheng, action=2 # 2 表示成交(结算) ) - logger.info(f"打手 {order.jiedan_dashou_id} 每日统计更新成功") + logger.info(f"打手 {order.PlayerID} 每日统计更新成功") except Exception as e: logger.error(f"打手每日统计更新失败: {e}") # 不影响主流程 @@ -7927,7 +7927,7 @@ class KefuRejectRefundView(APIView): return Response({'code': 0, 'msg': '拒绝退款成功'}) - except Dingdan.DoesNotExist: + except Order.DoesNotExist: return Response({'code': 404, 'msg': '订单不存在'}, status=status.HTTP_404_NOT_FOUND) except Exception as e: logger.error(f"拒绝退款接口异常: {str(e)}", exc_info=True) @@ -7986,37 +7986,37 @@ class KefuMerchantRefundView(APIView): # 查询订单,预加载商家扩展表 try: - order = Dingdan.query.select_related('shangjia_kuozhan').get(dingdan_id=dingdan_id) - except Dingdan.DoesNotExist: + order = Order.query.select_related('shangjia_kuozhan').get(OrderID=dingdan_id) + except Order.DoesNotExist: return Response({'code': 404, 'msg': '订单不存在'}, status=status.HTTP_404_NOT_FOUND) # 验证商家订单 - if order.fadan_pingtai != 2: + if order.Platform != 2: return Response({'code': 400, 'msg': '该订单不是商家订单'}, status=status.HTTP_400_BAD_REQUEST) # 验证状态允许退款 allowed_statuses = [1, 7, 2, 8, 4] - if order.zhuangtai not in allowed_statuses: + if order.Status not in allowed_statuses: return Response({'code': 400, 'msg': '订单状态不允许退款'}, status=status.HTTP_400_BAD_REQUEST) # 获取必要数据 - jiedan_dashou_id = order.jiedan_dashou_id - jine = order.jine + jiedan_dashou_id = order.PlayerID + jine = order.Amount if jine is None: return Response({'code': 400, 'msg': '订单金额缺失'}, status=status.HTTP_400_BAD_REQUEST) try: shangjia_kuozhan = order.shangjia_kuozhan - shangjia_id = shangjia_kuozhan.shangjia_id + shangjia_id = shangjia_kuozhan.MerchantID except ObjectDoesNotExist: return Response({'code': 400, 'msg': '订单商家信息不存在'}, status=status.HTTP_400_BAD_REQUEST) with transaction.atomic(): # 更新订单 - order.zhuangtai = 5 - order.clkf = current_user.phone + order.Status = 5 + order.AssignedCS = current_user.phone if tuikuan_liyou: - order.tkly = tuikuan_liyou + order.RefundReason = tuikuan_liyou order.save() # 更新打手 @@ -8042,17 +8042,17 @@ class KefuMerchantRefundView(APIView): # 更新退款记录表 try: - refund_record = Tuikuanjilu.query.get(dingdan_id=dingdan_id) - refund_record.sqzhuangtai = 1 - refund_record.chuliid = phone + refund_record = RefundRecord.query.get(OrderID=dingdan_id) + refund_record.ApplyStatus = 1 + refund_record.ProcessorID = phone refund_record.save() - except Tuikuanjilu.DoesNotExist: + except RefundRecord.DoesNotExist: pass # 更新客服统计 update_shangjia_daily( yonghuid=shangjia_id, - amount=Decimal(str(order.jine)), + amount=Decimal(str(order.Amount)), action=3 # 3 = 退款 ) @@ -8060,11 +8060,11 @@ class KefuMerchantRefundView(APIView): # 调用打手每日统计(成交) try: update_dashou_daily_by_action( - yonghuid=order.jiedan_dashou_id, - amount=order.dashou_fencheng, + yonghuid=order.PlayerID, + amount=order.PlayerCommission, action=3 # 3 表示退款(退款) ) - logger.info(f"打手 {order.jiedan_dashou_id} 每日统计更新成功") + logger.info(f"打手 {order.PlayerID} 每日统计更新成功") except Exception as e: logger.error(f"打手每日统计更新失败: {e}") # 不影响主流程 @@ -8127,31 +8127,31 @@ class KefuRejectSettlementView(APIView): # 3. 查询订单,预加载平台扩展表 try: - order = Dingdan.query.select_related('pingtai_kuozhan').get(dingdan_id=dingdan_id) - except Dingdan.DoesNotExist: + order = Order.query.select_related('pingtai_kuozhan').get(OrderID=dingdan_id) + except Order.DoesNotExist: return Response({'code': 404, 'msg': '订单不存在'}, status=status.HTTP_404_NOT_FOUND) # 4. 校验订单条件:平台发单(1)且状态为2或8 - if order.fadan_pingtai != 1 or order.zhuangtai not in [2, 8]: + if order.Platform != 1 or order.Status not in [2, 8]: return Response({'code': 400, 'msg': '仅平台发单且状态为进行中(2)或结算中(8)的订单可拒绝结算'}, status=status.HTTP_400_BAD_REQUEST) - jiedan_dashou_id = order.jiedan_dashou_id + jiedan_dashou_id = order.PlayerID if not jiedan_dashou_id: return Response({'code': 400, 'msg': '订单暂无接单打手'}, status=status.HTTP_400_BAD_REQUEST) # 5. 使用事务更新 with transaction.atomic(): # 5.1 更新订单主表 - order.zhuangtai = 5 # 已退款 - order.tkly = tkly # 拒绝理由 - order.clkf = phone # 记录客服手机号 + order.Status = 5 # 已退款 + order.RefundReason = tkly # 拒绝理由 + order.AssignedCS = phone # 记录客服手机号 order.save() # 5.2 更新平台订单扩展表:标记为拒绝结算(假设字段 jjjs_biaoshi) - # 注意:需要确保 DingdanPingtai 模型中已添加 jjjs_biaoshi 字段,IntegerField,默认0 + # 注意:需要确保 PlatformOrderExt 模型中已添加 jjjs_biaoshi 字段,IntegerField,默认0 if hasattr(order, 'pingtai_kuozhan') and order.pingtai_kuozhan: pingtai_ext = order.pingtai_kuozhan - pingtai_ext.jjjs_biaoshi = 1 # 1表示拒绝结算 + pingtai_ext.RejectSettlementFlag = 1 # 1表示拒绝结算 pingtai_ext.save() else: # 理论上应该存在,但若不存在则记录日志 @@ -8176,11 +8176,11 @@ class KefuRejectSettlementView(APIView): # 🔥 新增:调用打手每日统计(成交) try: update_dashou_daily_by_action( - yonghuid=order.jiedan_dashou_id, - amount=order.dashou_fencheng, + yonghuid=order.PlayerID, + amount=order.PlayerCommission, action=3 # 3 表示退款(退款) ) - logger.info(f"打手 {order.jiedan_dashou_id} 每日统计更新成功") + logger.info(f"打手 {order.PlayerID} 每日统计更新成功") except Exception as e: logger.error(f"打手每日统计更新失败: {e}") # 不影响主流程 @@ -8233,22 +8233,22 @@ class KefuTransferHallView(APIView): # 3. 查询订单 try: - order = Dingdan.query.get(dingdan_id=dingdan_id) - except Dingdan.DoesNotExist: + order = Order.query.get(OrderID=dingdan_id) + except Order.DoesNotExist: return Response({'code': 404, 'msg': '订单不存在'}, status=status.HTTP_404_NOT_FOUND) # 4. 校验订单状态(允许状态:2,8,4) - if order.zhuangtai not in [2, 8, 4]: + if order.Status not in [2, 8, 4]: return Response({'code': 400, 'msg': '订单状态不允许转移大厅'}, status=status.HTTP_400_BAD_REQUEST) - if order.jiedan_dashou_id: - UserDashou.query.filter(user__UserUID=order.jiedan_dashou_id).update(zhuangtai=1) + if order.PlayerID: + UserDashou.query.filter(user__UserUID=order.PlayerID).update(zhuangtai=1) else: pass # 5. 根据是否有指定ID决定新状态 - if order.zhiding_id: + if order.AssignedID: new_status = 7 # 指定中 else: new_status = 1 # 下单中 @@ -8256,9 +8256,9 @@ class KefuTransferHallView(APIView): # 6. 使用事务更新 with transaction.atomic(): # 清空接单打手ID,更新状态,记录客服 - order.jiedan_dashou_id = None - order.zhuangtai = new_status - order.clkf = phone + order.PlayerID = None + order.Status = new_status + order.AssignedCS = phone order.save() return Response({'code': 0, 'msg': '转移大厅成功'}) @@ -8301,22 +8301,22 @@ class KefuCancelDesignationView(APIView): # 3. 查询订单 try: - order = Dingdan.query.get(dingdan_id=dingdan_id) - except Dingdan.DoesNotExist: + order = Order.query.get(OrderID=dingdan_id) + except Order.DoesNotExist: return Response({'code': 404, 'msg': '订单不存在'}, status=status.HTTP_404_NOT_FOUND) # 4. 校验订单状态为7(指定中) - if order.zhuangtai != 7: + if order.Status != 7: print(999) return Response({'code': 400, 'msg': '仅状态为指定中(7)的订单可取消指定'}, status=status.HTTP_400_BAD_REQUEST) # 5. 使用事务更新 with transaction.atomic(): # 状态改为1(下单中),清空指定ID,记录客服 - order.zhuangtai = 1 - order.zhiding_id = None - order.clkf = phone + order.Status = 1 + order.AssignedID = None + order.AssignedCS = phone order.save() return Response({'code': 0, 'msg': '取消指定成功'}) @@ -8929,13 +8929,13 @@ class KefuPunishmentListView(APIView): # 3. 获取统计信息(不分页) stats = { - 'zongshu': Chufajilu.query.count(), - 'daichuli': Chufajilu.query.filter(sqzhuangtai__in=[0, 3]).count(), - 'yichuli': Chufajilu.query.filter(sqzhuangtai__in=[1, 2]).count(), + 'zongshu': PenaltyRecord.query.count(), + 'daichuli': PenaltyRecord.query.filter(sqzhuangtai__in=[0, 3]).count(), + 'yichuli': PenaltyRecord.query.filter(sqzhuangtai__in=[1, 2]).count(), } # 4. 构建查询条件 - queryset = Chufajilu.query.all() + queryset = PenaltyRecord.query.all() if status_list and isinstance(status_list, list): queryset = queryset.filter(sqzhuangtai__in=status_list) @@ -9030,11 +9030,11 @@ class KefuGetOrderDetailView(APIView): # 3. 查询订单 try: #p(f"开始查询订单: {dingdan_id}") - dingdan_obj = Dingdan.query.select_related( + dingdan_obj = Order.query.select_related( 'pingtai_kuozhan', 'shangjia_kuozhan' ).get(dingdan_id=dingdan_id) #p("订单查询成功") - except Dingdan.DoesNotExist: + except Order.DoesNotExist: #p("订单不存在") return Response({'code': 404, 'msg': '订单不存在'}, status=404) except Exception as e: @@ -9044,24 +9044,24 @@ class KefuGetOrderDetailView(APIView): # 4. 构建基础数据 try: response_data = { - 'dingdan_id': dingdan_obj.dingdan_id or '', - 'zhuangtai': dingdan_obj.zhuangtai or 0, - 'fadanpingtai': dingdan_obj.fadan_pingtai or 0, - 'jiage': float(dingdan_obj.jine) if dingdan_obj.jine else 0.00, - 'dashou_fencheng': float(dingdan_obj.dashou_fencheng) if dingdan_obj.dashou_fencheng else 0.00, - 'jiedan_dashou_id': dingdan_obj.jiedan_dashou_id or '', - 'dashou_liuyan': dingdan_obj.dashou_liuyan or '', - 'zhiding_id': dingdan_obj.zhiding_id or '', - 'shangpin_id': dingdan_obj.shangpin_id or '', - 'leixing': dingdan_obj.leixing_id or 0, - 'tupian_url': dingdan_obj.tupian or '', - 'jieshao': dingdan_obj.jieshao or '', - 'beizhu': dingdan_obj.beizhu or '', - 'tkly': dingdan_obj.tkly or '', - 'nicheng': dingdan_obj.nicheng or '', - 'clkf': dingdan_obj.clkf or '', - 'chuangjianshijian': dingdan_obj.create_time.strftime('%Y-%m-%d %H:%M:%S') if dingdan_obj.create_time else '', - 'genggaishijian': dingdan_obj.update_time.strftime('%Y-%m-%d %H:%M:%S') if dingdan_obj.update_time else '', + 'dingdan_id': dingdan_obj.OrderID or '', + 'zhuangtai': dingdan_obj.Status or 0, + 'fadanpingtai': dingdan_obj.Platform or 0, + 'jiage': float(dingdan_obj.Amount) if dingdan_obj.Amount else 0.00, + 'dashou_fencheng': float(dingdan_obj.PlayerCommission) if dingdan_obj.PlayerCommission else 0.00, + 'jiedan_dashou_id': dingdan_obj.PlayerID or '', + 'dashou_liuyan': dingdan_obj.PlayerRemark or '', + 'zhiding_id': dingdan_obj.AssignedID or '', + 'shangpin_id': dingdan_obj.ProductID or '', + 'leixing': dingdan_obj.ProductTypeID or 0, + 'tupian_url': dingdan_obj.ImageURL or '', + 'jieshao': dingdan_obj.Description or '', + 'beizhu': dingdan_obj.Remark or '', + 'tkly': dingdan_obj.RefundReason or '', + 'nicheng': dingdan_obj.Nickname or '', + 'clkf': dingdan_obj.AssignedCS or '', + 'chuangjianshijian': dingdan_obj.CreateTime.strftime('%Y-%m-%d %H:%M:%S') if dingdan_obj.CreateTime else '', + 'genggaishijian': dingdan_obj.UpdateTime.strftime('%Y-%m-%d %H:%M:%S') if dingdan_obj.UpdateTime else '', } #p("基础数据构建完成") except Exception as e: @@ -9070,13 +9070,13 @@ class KefuGetOrderDetailView(APIView): # 5. 扩展表数据 try: - fadan_pingtai = dingdan_obj.fadan_pingtai + fadan_pingtai = dingdan_obj.Platform if fadan_pingtai == 1: if hasattr(dingdan_obj, 'pingtai_kuozhan') and dingdan_obj.pingtai_kuozhan: pingtai = dingdan_obj.pingtai_kuozhan response_data['pingtai_kuozhan'] = { - 'laoban_id': pingtai.laoban_id or '', - 'laoban_pingjia': pingtai.laoban_pingjia or '', + 'laoban_id': pingtai.BossID or '', + 'laoban_pingjia': pingtai.BossReview or '', } else: response_data['pingtai_kuozhan'] = {'laoban_id': '', 'laoban_pingjia': ''} @@ -9084,12 +9084,12 @@ class KefuGetOrderDetailView(APIView): if hasattr(dingdan_obj, 'shangjia_kuozhan') and dingdan_obj.shangjia_kuozhan: shangjia = dingdan_obj.shangjia_kuozhan response_data['shangjia_kuozhan'] = { - 'shangjia_id': shangjia.shangjia_id or '', - 'sjnicheng': shangjia.sjnicheng or '', - 'shangjia_pingjia': shangjia.shangjia_pingjia or '', - 'cfliyou': shangjia.cfliyou or '', - 'sqzhuangtai': shangjia.sqzhuangtai if shangjia.sqzhuangtai is not None else 0, - 'bhliyou': shangjia.bhliyou or '', + 'shangjia_id': shangjia.MerchantID or '', + 'sjnicheng': shangjia.MerchantNickname or '', + 'shangjia_pingjia': shangjia.MerchantReview or '', + 'cfliyou': shangjia.PenaltyReason or '', + 'sqzhuangtai': shangjia.PenaltyApplyStatus if shangjia.PenaltyApplyStatus is not None else 0, + 'bhliyou': shangjia.RejectReason or '', } else: response_data['shangjia_kuozhan'] = { @@ -9103,7 +9103,7 @@ class KefuGetOrderDetailView(APIView): # 6. 打手图片 try: - dashou_images = Dashoutupian.query.filter(dingdan_id=dingdan_id).values_list('tupian', flat=True) + dashou_images = PlayerDeliveryImage.query.filter(OrderID=dingdan_id).values_list('ImageURL', flat=True) response_data['dashou_images'] = [img for img in dashou_images if img] #p(f"打手图片数量: {len(response_data['dashou_images'])}") except Exception as e: @@ -9112,8 +9112,8 @@ class KefuGetOrderDetailView(APIView): # 7. 退款理由 try: - tuikuan_record = Tuikuanjilu.query.filter(dingdan_id=dingdan_id).order_by('-create_time').first() - response_data['tuikuan_liyou'] = tuikuan_record.liyou if tuikuan_record and tuikuan_record.liyou else '' + tuikuan_record = RefundRecord.query.filter(OrderID=dingdan_id).order_by('-create_time').first() + response_data['tuikuan_liyou'] = tuikuan_record.Reason if tuikuan_record and tuikuan_record.Reason else '' #p("退款理由查询完成") except Exception as e: #p(f"退款理由异常: {traceback.format_exc()}") @@ -9180,7 +9180,7 @@ class KefuPunishmentDetailView(APIView): # 查询处罚记录(按创建时间倒序取最新一条) try: - record = Chufajilu.query.filter(dingdan_id=dingdan_id).order_by('-create_time').first() + record = PenaltyRecord.query.filter(OrderID=dingdan_id).order_by('-create_time').first() if not record: return Response({'code': 404, 'msg': '处罚记录不存在'}, status=status.HTTP_404_NOT_FOUND) except Exception as e: @@ -9191,27 +9191,27 @@ class KefuPunishmentDetailView(APIView): zhengju_images = [] shensu_images = [] try: - # 商家证据图片:上传者为请求人 (qingqiuid) - zhengju_qs = Chufatupian.query.filter(dingdan_id=dingdan_id, yonghuid=record.qingqiuid) - zhengju_images = [item.tupian for item in zhengju_qs if item.tupian] + # 商家证据图片:上传者为请求人 (ApplicantID) + zhengju_qs = PenaltyEvidenceImage.query.filter(OrderID=dingdan_id, UserID=record.ApplicantID) + zhengju_images = [item.ImageURL for item in zhengju_qs if item.ImageURL] - # 打手申诉图片:上传者为打手 (dashouid) - shensu_qs = Chufatupian.query.filter(dingdan_id=dingdan_id, yonghuid=record.dashouid) - shensu_images = [item.tupian for item in shensu_qs if item.tupian] + # 打手申诉图片:上传者为打手 (PlayerID) + shensu_qs = PenaltyEvidenceImage.query.filter(OrderID=dingdan_id, UserID=record.PlayerID) + shensu_images = [item.ImageURL for item in shensu_qs if item.ImageURL] except Exception as e: logger.error(f"查询图片失败: {e}") # 构建返回数据 data = { - 'dingdan_id': record.dingdan_id, - 'dashouid': record.dashouid, - 'qingqiuid': record.qingqiuid, - 'chuliid': record.chuliid, - 'cfliyou': record.cfliyou, - 'sqzhuangtai': record.sqzhuangtai, - 'bhliyou': record.bhliyou, - 'jifen': record.jifen, - 'ssliyou': record.ssliyou or '', + 'dingdan_id': record.OrderID, + 'dashouid': record.PlayerID, + 'qingqiuid': record.ApplicantID, + 'chuliid': record.ProcessorID, + 'cfliyou': record.PenaltyReason, + 'sqzhuangtai': record.ApplyStatus, + 'bhliyou': record.RejectReason, + 'jifen': record.DeductedPoints, + 'ssliyou': record.AppealReason or '', 'zhengju_tupian': zhengju_images, 'shensu_tupian': shensu_images, 'create_time': record.create_time, @@ -9266,12 +9266,12 @@ class KefuPunishmentActionView(APIView): # 查询待处理的处罚记录(状态0或3) try: - record = Chufajilu.query.filter( - dingdan_id=dingdan_id, - sqzhuangtai__in=[0, 3] + record = PenaltyRecord.query.filter( + OrderID=dingdan_id, + ApplyStatus__in=[0, 3] ).order_by('-create_time').first() if not record: - exists = Chufajilu.query.filter(dingdan_id=dingdan_id).exists() + exists = PenaltyRecord.query.filter(OrderID=dingdan_id).exists() if exists: return Response({'code': 400, 'msg': '该处罚记录已处理'}, status=status.HTTP_400_BAD_REQUEST) else: @@ -9282,62 +9282,62 @@ class KefuPunishmentActionView(APIView): with transaction.atomic(): # 处理重复记录:同一订单的其他待处理/申诉中记录标记为驳回 - duplicate_records = Chufajilu.query.filter( - dingdan_id=dingdan_id, - sqzhuangtai__in=[0, 3] + duplicate_records = PenaltyRecord.query.filter( + OrderID=dingdan_id, + ApplyStatus__in=[0, 3] ).exclude(id=record.id) for dup in duplicate_records: - dup.sqzhuangtai = 2 - dup.chuliid = phone - dup.bhliyou = "系统自动驳回:存在重复处罚记录" + dup.ApplyStatus = 2 + dup.ProcessorID = phone + dup.RejectReason = "系统自动驳回:存在重复处罚记录" dup.save() logger.info(f"自动驳回重复处罚记录 ID={dup.id}") if action == 1: # 同意 # 可选验证打手存在 - if record.dashouid: + if record.PlayerID: try: - dashou = UserDashou.query.get(user__UserUID=record.dashouid) + dashou = UserDashou.query.get(user__UserUID=record.PlayerID) except UserDashou.DoesNotExist: return Response({'code': 400, 'msg': '被处罚打手不存在'}, status=status.HTTP_400_BAD_REQUEST) - record.sqzhuangtai = 1 - record.chuliid = phone + record.ApplyStatus = 1 + record.ProcessorID = phone record.save() # 更新商家订单扩展表 try: - dingdan = Dingdan.query.get(dingdan_id=dingdan_id) + dingdan = Order.query.get(OrderID=dingdan_id) if hasattr(dingdan, 'shangjia_kuozhan'): - dingdan.shangjia_kuozhan.sqzhuangtai = 1 + dingdan.shangjia_kuozhan.PenaltyApplyStatus = 1 dingdan.shangjia_kuozhan.save() except Exception as e: logger.warning(f"更新商家扩展表失败: {e}") elif action == 2: # 驳回 # 返还积分 - if record.jifen > 0 and record.dashouid: + if record.DeductedPoints > 0 and record.PlayerID: try: - dashou = UserDashou.query.get(user__UserUID=record.dashouid) + dashou = UserDashou.query.get(user__UserUID=record.PlayerID) if dashou.jifen <= 1000: # 安全限制 - dashou.jifen += record.jifen + dashou.jifen += record.DeductedPoints dashou.save() - logger.info(f"驳回处罚,打手{record.dashouid}返还积分{record.jifen}") + logger.info(f"驳回处罚,打手{record.PlayerID}返还积分{record.DeductedPoints}") else: logger.warning(f"打手积分异常({dashou.jifen}),不再返还") except UserDashou.DoesNotExist: - logger.warning(f"打手{record.dashouid}不存在,无法返还积分") + logger.warning(f"打手{record.PlayerID}不存在,无法返还积分") - record.sqzhuangtai = 2 - record.chuliid = phone - record.bhliyou = reject_reason + record.ApplyStatus = 2 + record.ProcessorID = phone + record.RejectReason = reject_reason record.save() try: - dingdan = Dingdan.query.get(dingdan_id=dingdan_id) + dingdan = Order.query.get(OrderID=dingdan_id) if hasattr(dingdan, 'shangjia_kuozhan'): - dingdan.shangjia_kuozhan.sqzhuangtai = 2 - dingdan.shangjia_kuozhan.bhliyou = reject_reason + dingdan.shangjia_kuozhan.PenaltyApplyStatus = 2 + dingdan.shangjia_kuozhan.RejectReason = reject_reason dingdan.shangjia_kuozhan.save() except Exception as e: logger.warning(f"更新商家扩展表失败: {e}") @@ -9397,15 +9397,15 @@ class KefuForceCompleteView(APIView): # 2. 订单处理(事务内) try: with transaction.atomic(): - order = Dingdan.objects.select_for_update().get(dingdan_id=dingdan_id) + order = Order.objects.select_for_update().get(OrderID=dingdan_id) # 3. 校验订单状态 - if order.zhuangtai != 8: - return Response({'code': 400, 'msg': f'订单状态不是结算中,当前状态: {order.zhuangtai}'}) + if order.Status != 8: + return Response({'code': 400, 'msg': f'订单状态不是结算中,当前状态: {order.Status}'}) # 4. 校验必要字段 - dashou_id = order.jiedan_dashou_id - dashou_fencheng = order.dashou_fencheng + dashou_id = order.PlayerID + dashou_fencheng = order.PlayerCommission if not dashou_id: return Response({'code': 400, 'msg': '订单无接单打手'}) if not dashou_fencheng or dashou_fencheng <= 0: @@ -9429,9 +9429,9 @@ class KefuForceCompleteView(APIView): return Response({'code': 400, 'msg': '打手不存在或扩展表缺失'}) # 6. 如果是商家发单,更新商家成交订单数量 - if order.fadan_pingtai == 2: + if order.Platform == 2: try: - # 通过 DingdanShangjia 获取商家ID + # 通过 MerchantOrderExt 获取商家ID shangjia_ext = order.shangjia_kuozhan # 假设 related_name='shangjia_kuozhan' if shangjia_ext and shangjia_ext.shangjia_id: shangjia_user = User.query.get(UserUID=shangjia_ext.shangjia_id) @@ -9442,7 +9442,7 @@ class KefuForceCompleteView(APIView): # (行为驱动,更安全) update_shangjia_daily( yonghuid=shangjia_ext.shangjia_id, - amount=Decimal(str(order.jine)), + amount=Decimal(str(order.Amount)), action=2 # 2 = 结算 ) @@ -9451,43 +9451,43 @@ class KefuForceCompleteView(APIView): pass # 7. 更新订单状态 - order.zhuangtai = 3 - order.clkf = phone + order.Status = 3 + order.AssignedCS = phone order.save(update_fields=['zhuangtai', 'clkf']) - if order.fadan_pingtai == 1: + if order.Platform == 1: # ========== 新增:商品和店铺每日统计 ========== try: # 商品每日统计(只要有商品ID就执行) - if order.shangpin_id: + if order.ProductID: # 从扩展表获取已计算好的收益值(下单时已存储) pingtai_shouyi = Decimal('0.00') dianpu_shouyi = Decimal('0.00') if hasattr(order, 'pingtai_kuozhan'): - pingtai_shouyi = order.pingtai_kuozhan.pingtai_shouyi or Decimal('0.00') - dianpu_shouyi = order.pingtai_kuozhan.dianpu_shouyi or Decimal('0.00') + pingtai_shouyi = order.pingtai_kuozhan.PlatformIncome or Decimal('0.00') + dianpu_shouyi = order.pingtai_kuozhan.ShopIncome or Decimal('0.00') update_shangpin_daily_stat( - shangpin_id=order.shangpin_id, + shangpin_id=order.ProductID, caozuo_leixing=2, # 2 = 结单 - dingdan_jiage=order.jine, + dingdan_jiage=order.Amount, pingtai_shouyi=pingtai_shouyi, dianpu_zongshouyi=dianpu_shouyi ) - logger.info(f"商品统计更新完成,商品ID: {order.shangpin_id}") + logger.info(f"商品统计更新完成,商品ID: {order.ProductID}") # 店铺每日统计(仅当存在店铺ID时执行) dianpu_id = None if hasattr(order, 'pingtai_kuozhan'): - dianpu_id = order.pingtai_kuozhan.dianpu_id + dianpu_id = order.pingtai_kuozhan.ShopID if dianpu_id: - dianpu_shouyi = order.pingtai_kuozhan.dianpu_shouyi or Decimal('0.00') + dianpu_shouyi = order.pingtai_kuozhan.ShopIncome or Decimal('0.00') update_dianpu_daily_stat( dianpu_id=dianpu_id, caozuo_leixing=2, # 2 = 结单 - dingdan_jiage=order.jine, + dingdan_jiage=order.Amount, dianpu_shouyi=dianpu_shouyi ) logger.info(f"店铺统计更新完成,店铺ID: {dianpu_id}") @@ -9500,17 +9500,17 @@ class KefuForceCompleteView(APIView): # 🔥 新增:调用打手每日统计(成交) try: update_dashou_daily_by_action( - yonghuid=order.jiedan_dashou_id, + yonghuid=order.PlayerID, amount=dashou_fencheng, action=2 # 2 表示成交(结算) ) - logger.info(f"打手 {order.jiedan_dashou_id} 每日统计更新成功") + logger.info(f"打手 {order.PlayerID} 每日统计更新成功") except Exception as e: logger.error(f"打手每日统计更新失败: {e}") # 不影响主流程 # 商家订单管事分红 - if order.fadan_pingtai == 2: + if order.Platform == 2: settle_shangjia_order_guanshi_fenhong(order, dashou_id) # 8. 更新客服统计 @@ -9521,7 +9521,7 @@ class KefuForceCompleteView(APIView): return Response({'code': 0, 'msg': '强制结单成功'}) - except Dingdan.DoesNotExist: + except Order.DoesNotExist: return Response({'code': 404, 'msg': '订单不存在'}) except Exception as e: logger.error(f"强制结单异常: {str(e)}", exc_info=True) @@ -10239,12 +10239,12 @@ class KefuPunishView(APIView): # 3. 查询订单 try: - order = Dingdan.query.get(dingdan_id=dingdan_id) - except Dingdan.DoesNotExist: + order = Order.query.get(OrderID=dingdan_id) + except Order.DoesNotExist: return Response({'code': 404, 'msg': '订单不存在'}, status=status.HTTP_404_NOT_FOUND) # 4. 获取打手ID - dashou_id = order.jiedan_dashou_id + dashou_id = order.PlayerID if not dashou_id: return Response({'code': 400, 'msg': '订单未接单,无法处罚打手'}, status=status.HTTP_400_BAD_REQUEST) @@ -10261,13 +10261,13 @@ class KefuPunishView(APIView): with transaction.atomic(): # 创建处罚记录(积分扣除5分) jifen = 5 - chufa = Chufajilu.query.create( - dashouid=dashou_id, - qingqiuid=phone, # 客服手机号作为请求人 - cfliyou=reason or '', - sqzhuangtai=0, # 待处理 - jifen=jifen, - dingdan_id=dingdan_id, + chufa = PenaltyRecord.query.create( + PlayerID=dashou_id, + ApplicantID=phone, # 客服手机号作为请求人 + PenaltyReason=reason or '', + ApplyStatus=0, # 待处理 + DeductedPoints=jifen, + OrderID=dingdan_id, ) # 扣除打手积分 @@ -10278,7 +10278,7 @@ class KefuPunishView(APIView): dashou.save() # 可选:更新订单的 clkf 字段记录处理客服 - order.clkf = phone + order.AssignedCS = phone order.save() return Response({'code': 0, 'msg': '处罚成功'}) @@ -10480,11 +10480,11 @@ class AdKfxgView(APIView): # 更新主表字段 if 'phone' in request.data: new_phone = request.data.get('phone').strip() - if new_phone and User.query.filter(Phone=new_phone).exclude(phone=uid).exists(): + if new_phone and User.query.filter(Phone=new_phone).exclude(UserUID=uid).exists(): return Response({'code': 400, 'message': '手机号已被使用'}) - user.phone = new_phone + user.Phone = new_phone if 'password' in request.data: - user.password = request.data['password'] + user.UserPassword = request.data['password'] user.save() # 更新扩展表 @@ -11248,7 +11248,7 @@ class DashouJianquanView(APIView): # ========== 5. 条件三:存在订单状态为 2 或 8 的订单 ========== # 利用 jiedan_dashou_id + zhuangtai 复合索引,只查 1 条 - has_valid_order = Dingdan.query.filter( + has_valid_order = Order.query.filter( jiedan_dashou_id=user.yonghuid, zhuangtai__in=[2, 8] ).only('id').exists() # exists() 高性能判断,只发 SELECT 1 LIMIT 1 @@ -11277,8 +11277,8 @@ URL: /yonghu/lbhqltqx 认证: JWT Token (request.user) 鉴权逻辑: - 查询平台订单扩展表(DingdanPingtai), - 通过关联的订单主表(Dingdan)查找该老板的订单, + 查询平台订单扩展表(PlatformOrderExt), + 通过关联的订单主表(Order)查找该老板的订单, 只要存在任意一条订单状态在 1~8 范围内 → 通过 """ @@ -11293,9 +11293,9 @@ class LaobanJianquanView(APIView): user = request.user # User 实例 # ========== 2. 高效查询平台订单扩展表 ========== - # 利用 DingdanPingtai.laoban_id 索引 + Dingdan.zhuangtai 索引 + # 利用 PlatformOrderExt.laoban_id 索引 + Order.zhuangtai 索引 # 只查 1 条,用 exists() 实现最高性能 - has_valid_order = DingdanPingtai.query.filter( + has_valid_order = PlatformOrderExt.query.filter( laoban_id=user.yonghuid ).filter( dingdan__zhuangtai__in=[1, 2, 3, 4, 5, 6, 7, 8] @@ -11334,24 +11334,24 @@ class FaKuanJiFenTongJiView(APIView): yonghuid = user_main.yonghuid # ================= 罚款统计 ================= - fadan_stats = Fadan.query.filter(beichufa_id=yonghuid).aggregate( + fadan_stats = Penalty.query.filter(PenalizedUserID=yonghuid).aggregate( total=Count('id'), - daijiaona=Count('id', filter=Q(zhuangtai=1)), - shensuzhong=Count('id', filter=Q(zhuangtai=3)), - yijiaona=Count('id', filter=Q(zhuangtai=2)), - yibohui=Count('id', filter=Q(zhuangtai=4)), + daijiaona=Count('id', filter=Q(Status=1)), + shensuzhong=Count('id', filter=Q(Status=3)), + yijiaona=Count('id', filter=Q(Status=2)), + yibohui=Count('id', filter=Q(Status=4)), ) # ================= 积分处罚统计 ================= - jifen_stats = Chufajilu.query.filter(dashouid=yonghuid).aggregate( + jifen_stats = PenaltyRecord.query.filter(PlayerID=yonghuid).aggregate( total=Count('id'), - daichuli=Count('id', filter=Q(sqzhuangtai=0) | Q(sqzhuangtai=3)), - yichuli=Count('id', filter=Q(sqzhuangtai=1) | Q(sqzhuangtai=2)), + daichuli=Count('id', filter=Q(ApplyStatus=0) | Q(ApplyStatus=3)), + yichuli=Count('id', filter=Q(ApplyStatus=1) | Q(ApplyStatus=2)), # 细分 - daichuli_0=Count('id', filter=Q(sqzhuangtai=0)), - shensuzhong_3=Count('id', filter=Q(sqzhuangtai=3)), - yichufa_1=Count('id', filter=Q(sqzhuangtai=1)), - yibohui_2=Count('id', filter=Q(sqzhuangtai=2)), + daichuli_0=Count('id', filter=Q(ApplyStatus=0)), + shensuzhong_3=Count('id', filter=Q(ApplyStatus=3)), + yichufa_1=Count('id', filter=Q(ApplyStatus=1)), + yibohui_2=Count('id', filter=Q(ApplyStatus=2)), ) data = { @@ -11420,15 +11420,15 @@ class DaShouFaKuanLieBiaoView(APIView): sousuo_dingdan_id = request.data.get('sousuo_dingdan_id', '').strip() # 基础查询:当前用户的罚单 - qs = Fadan.query.filter(beichufa_id=yonghuid) + qs = Penalty.query.filter(PenalizedUserID=yonghuid) # 状态筛选 if zhuangtai is not None and int(zhuangtai) in [1, 2, 3, 4]: - qs = qs.filter(zhuangtai=int(zhuangtai)) + qs = qs.filter(Status=int(zhuangtai)) # 订单号模糊搜索 if sousuo_dingdan_id: - qs = qs.filter(guanliandingdan_id__icontains=sousuo_dingdan_id) + qs = qs.filter(RelatedOrderID__icontains=sousuo_dingdan_id) # 按创建时间倒序 qs = qs.order_by('-create_time') @@ -11450,13 +11450,13 @@ class DaShouFaKuanLieBiaoView(APIView): zhengju_map = {} # key: fadan_id, value: [url, ...] shensu_map = {} if fadan_ids: - tupians = FadanShensuTupian.query.filter( - fadan_id__in=fadan_ids - ).values('fadan_id', 'tupian_url', 'yongtu') + tupians = PenaltyAppealImage.query.filter( + Penalty_id__in=fadan_ids + ).values('Penalty_id', 'ImageURL', 'Purpose') for t in tupians: - fid = t['fadan_id'] - url = t['tupian_url'] - if t['yongtu'] == 1: + fid = t['Penalty_id'] + url = t['ImageURL'] + if t['Purpose'] == 1: zhengju_map.setdefault(fid, []).append(url) else: shensu_map.setdefault(fid, []).append(url) @@ -11467,14 +11467,14 @@ class DaShouFaKuanLieBiaoView(APIView): rid = r.id item = { 'id': rid, - 'beichufa_id': r.beichufa_id, - 'guanliandingdan_id': r.guanliandingdan_id or '', - 'chufaliyou': r.chufaliyou or '', - 'fakuanjine': str(r.fakuanjine), - 'zhuangtai': r.zhuangtai, - 'yingxiang_qiangdan': r.yingxiang_qiangdan, - 'shensuliyou': r.shensuliyou or '', - 'bohuiliyou': r.bohuiliyou or '', + 'beichufa_id': r.PenalizedUserID, + 'guanliandingdan_id': r.RelatedOrderID or '', + 'chufaliyou': r.Reason or '', + 'fakuanjine': str(r.FineAmount), + 'zhuangtai': r.Status, + 'yingxiang_qiangdan': r.AffectsGrabbing, + 'shensuliyou': r.AppealReason or '', + 'bohuiliyou': r.RejectReason or '', 'zhengju_tupian': zhengju_map.get(rid, []), # 证据图片 'shensu_tupian': shensu_map.get(rid, []), # 申诉图片 'create_time': r.create_time.strftime('%Y-%m-%d %H:%M:%S') if r.create_time else '', @@ -11528,31 +11528,31 @@ class FaKuanShenSuView(APIView): # 查询罚单,确保属于当前打手 try: - fadan = Fadan.query.get(id=fadan_id, beichufa_id=yonghuid) - except Fadan.DoesNotExist: + fadan = Penalty.query.get(id=fadan_id, PenalizedUserID=yonghuid) + except Penalty.DoesNotExist: return Response({'code': 404, 'msg': '罚单不存在或无权操作'}, status=404) # 只允许待缴纳状态(状态1)且没有驳回理由的罚单申诉 - if fadan.zhuangtai != 1: - return Response({'code': 400, 'msg': '当前状态不可申诉'}, status=400) - if fadan.bohuiliyou: + if fadan.Status != 1: + return Response({'code': 400, 'msg': '罚单状态不允许申诉'}, status=400) + if fadan.RejectReason: return Response({'code': 400, 'msg': '该罚单申诉已被驳回,不可再次申诉'}, status=400) # 更新罚单状态为申诉中,并记录理由 - fadan.zhuangtai = 3 - fadan.shensuliyou = shensu_liyou + fadan.Status = 3 + fadan.AppealReason = shensu_liyou fadan.save() # 删除旧的申诉图片(yongtu=2),仅删除打手自己上传的申诉图 - FadanShensuTupian.query.filter(fadan=fadan, yongtu=2).delete() + PenaltyAppealImage.query.filter(Penalty=fadan, Purpose=2).delete() # 插入新上传的申诉图片 for url in tupian_urls: - FadanShensuTupian.query.create( - fadan=fadan, - beichufa_id=yonghuid, - tupian_url=url, - yongtu=2 + PenaltyAppealImage.query.create( + Penalty=fadan, + PenalizedUserID=yonghuid, + ImageURL=url, + Purpose=2 ) return Response({'code': 0, 'msg': '申诉提交成功'}) @@ -11586,14 +11586,14 @@ class FaKuanPayView(APIView): return Response({'code': 400, 'message': '参数不完整'}, status=status.HTTP_400_BAD_REQUEST) try: - fadan = Fadan.query.get(id=fadan_id, beichufa_id=request.user.yonghuid) - except Fadan.DoesNotExist: + fadan = Penalty.query.get(id=fadan_id, PenalizedUserID=request.user.yonghuid) + except Penalty.DoesNotExist: return Response({'code': 404, 'message': '罚单不存在或不属于您'}, status=status.HTTP_404_NOT_FOUND) - if fadan.zhuangtai not in [1, 3]: + if fadan.Status not in [1, 3]: return Response({'code': 400, 'message': '罚单当前状态不可支付'}, status=status.HTTP_400_BAD_REQUEST) - jine = float(fadan.fakuanjine) + jine = float(fadan.FineAmount) timestamp_ms = int(time.time() * 1000) timestamp_ns = int(time.time_ns() // 1000) % 1000000 @@ -11784,20 +11784,20 @@ class FaKuanHuitiaoView(View): # 4. 查询订单 try: order = Czjilu.query.get(dingdan_id=out_trade_no) - logger.info(f"找到订单: {order.dingdan_id}, 状态: {order.zhuangtai}, 金额: {order.jine}") + logger.info(f"找到订单: {order.OrderID}, 状态: {order.Status}, 金额: {order.Amount}") except Czjilu.DoesNotExist: logger.error(f"订单不存在: {out_trade_no}") return self.wechat_response('FAIL', '订单不存在') # 5. 检查订单状态是否为未支付(9) - if order.zhuangtai != 9: - logger.warning(f"订单状态不是未支付: {order.dingdan_id}, 当前状态: {order.zhuangtai}") + if order.Status != 9: + logger.warning(f"订单状态不是未支付: {order.OrderID}, 当前状态: {order.Status}") # 已处理过的订单直接返回成功,避免微信重复回调 return self.wechat_response('SUCCESS', 'OK') # 6. 验证金额(微信返回的是分,需要转换) wechat_amount_yuan = total_fee / 100 # 转换为元 - order_amount_yuan = float(order.jine) # 订单金额(元) + order_amount_yuan = float(order.Amount) # 订单金额(元) # 允许1分钱的误差(浮点数比较) if abs(wechat_amount_yuan - order_amount_yuan) > 0.01: @@ -11805,21 +11805,21 @@ class FaKuanHuitiaoView(View): return self.wechat_response('FAIL', '金额不一致') # 7. 更新订单状态为已支付(3) - order.zhuangtai = 3 + order.Status = 3 order.save(update_fields=['zhuangtai']) - logger.info(f"订单状态更新成功: {order.dingdan_id} -> 3") + logger.info(f"订单状态更新成功: {order.OrderID} -> 3") # 8. 更新罚单状态为已缴纳(2) try: # 根据订单中的用户ID和金额匹配待缴纳的罚单 - fadan = Fadan.query.filter( - beichufa_id=order.yonghuid, - fakuanjine=order.jine, - zhuangtai__in=[1, 3] + fadan = Penalty.query.filter( + PenalizedUserID=order.yonghuid, + FineAmount=order.Amount, + Status__in=[1, 3] ).first() if fadan: - fadan.zhuangtai = 2 # 已缴纳 - fadan.save(update_fields=['zhuangtai']) + fadan.Status = 2 # 已缴纳 + fadan.save(update_fields=['Status']) logger.info(f"罚单 {fadan.id} 已自动标记为已缴纳") success, msg = process_fadan_fenhong(fadan.id) @@ -11835,7 +11835,7 @@ class FaKuanHuitiaoView(View): try: # 获取订单金额(确保是Decimal类型) - jine_decimal = Decimal(str(order.jine)) if not isinstance(order.jine, Decimal) else order.jine + jine_decimal = Decimal(str(order.Amount)) if not isinstance(order.Amount, Decimal) else order.Amount update_daily_income(jine_decimal) @@ -11858,7 +11858,7 @@ class FaKuanHuitiaoView(View): szjilu.save() - logger.info(f"收支记录更新成功: 订单{order.dingdan_id}, 金额{jine_decimal}元") + logger.info(f"收支记录更新成功: 订单{order.OrderID}, 金额{jine_decimal}元") except Exception as e: # 收支记录更新失败不影响主流程,只记录日志 @@ -11935,7 +11935,7 @@ class FaKuanPayPollView(APIView): return Response({'code': 400, 'message': '订单ID不能为空'}) order = Czjilu.query.get(dingdan_id=dingdanid, yonghuid=request.user.yonghuid) - if order.zhuangtai == 3: + if order.Status == 3: return Response({'code': 200, 'message': '支付成功'}) else: return Response({'code': 400, 'message': '订单尚未支付'}) @@ -11958,7 +11958,7 @@ class FaKuanPayFailView(APIView): return Response({'code': 400, 'message': '订单ID不能为空'}) order = Czjilu.query.get(dingdan_id=dingdanid, yonghuid=request.user.yonghuid) - if order.zhuangtai == 9: # 未支付 + if order.Status == 9: # 未支付 order.delete() logger.info(f"用户{request.user.yonghuid}删除未支付订单: {dingdanid}") return Response({'code': 200, 'message': '订单已删除'}) @@ -12342,28 +12342,28 @@ class KaohePayCallbackView(View): # 查找订单 try: order = Czjilu.query.get(dingdan_id=out_trade_no, leixing=5) - logger.info(f"找到订单: {out_trade_no}, 当前状态: {order.zhuangtai}") + logger.info(f"找到订单: {out_trade_no}, 当前状态: {order.Status}") except Czjilu.DoesNotExist: logger.error(f"考核订单不存在: {out_trade_no}") return self.wechat_response('FAIL', '订单不存在') - if order.zhuangtai != 9: - logger.warning(f"订单状态非未支付: {order.zhuangtai}, 订单号: {out_trade_no}") + if order.Status != 9: + logger.warning(f"订单状态非未支付: {order.Status}, 订单号: {out_trade_no}") # 已支付的订单直接返回成功,避免微信重复回调 - if order.zhuangtai == 3: + if order.Status == 3: logger.info(f"订单已支付,直接返回成功: {out_trade_no}") return self.wechat_response('SUCCESS', 'OK') return self.wechat_response('FAIL', '订单状态异常') # 验证金额 wechat_yuan = total_fee / 100 - if abs(wechat_yuan - float(order.jine)) > 0.01: - logger.error(f"金额不一致: 订单金额={order.jine}, 回调金额={wechat_yuan}, 订单号: {out_trade_no}") + if abs(wechat_yuan - float(order.Amount)) > 0.01: + logger.error(f"金额不一致: 订单金额={order.Amount}, 回调金额={wechat_yuan}, 订单号: {out_trade_no}") return self.wechat_response('FAIL', '金额不一致') logger.info(f"金额验证通过: {wechat_yuan}元") # 更新订单状态为已支付 - order.zhuangtai = 3 + order.Status = 3 order.save() logger.info(f"订单状态更新为已支付: {out_trade_no}") @@ -12381,7 +12381,7 @@ class KaohePayCallbackView(View): else: logger.error(f"创建审核记录失败: {msg}, 订单号: {out_trade_no}") # 订单已支付但记录创建失败,需要标记订单异常,人工介入 - order.zhuangtai = 10 # 10表示支付成功但业务处理失败 + order.Status = 10 # 10表示支付成功但业务处理失败 order.save() logger.error(f"订单状态标记为异常(10): {out_trade_no}") @@ -12399,13 +12399,13 @@ class KaohePayCallbackView(View): except Exception as e: logger.error(f"处理临时表或创建审核记录异常: {str(e)}", exc_info=True) # 标记订单异常 - order.zhuangtai = 10 + order.Status = 10 order.save() logger.error(f"订单状态标记为异常(10): {out_trade_no}") # 更新收支记录 try: - jine_decimal = Decimal(str(order.jine)) + jine_decimal = Decimal(str(order.Amount)) update_daily_income(jine_decimal) logger.info(f"更新每日收入成功: {jine_decimal}元") @@ -12490,7 +12490,7 @@ class KaohePayPollView(APIView): return Response({'code': 400, 'message': '订单ID不能为空'}) try: order = Czjilu.query.get(dingdan_id=dingdanid, yonghuid=request.user.yonghuid, leixing=5) - if order.zhuangtai == 3: + if order.Status == 3: return Response({'code': 200, 'message': '支付成功'}) return Response({'code': 400, 'message': '订单尚未支付'}) except Czjilu.DoesNotExist: @@ -12507,7 +12507,7 @@ class KaohePayFailView(APIView): return Response({'code': 400, 'message': '订单ID不能为空'}) try: order = Czjilu.query.get(dingdan_id=dingdanid, yonghuid=request.user.yonghuid, leixing=5) - if order.zhuangtai == 9: + if order.Status == 9: order.delete() return Response({'code': 200, 'message': '订单已删除'}) return Response({'code': 400, 'message': '订单状态无法删除'}) @@ -12602,30 +12602,30 @@ class TixianAssetView(APIView): except ObjectDoesNotExist: pass - # ------------------- 费率查询(从 Lilubiao 获取) ------------------- + # ------------------- 费率查询(从 CommissionRate 获取) ------------------- # 打手提现费率 (类型 '5') - lilu_obj = Lilubiao.query.filter(fadanpingtai='5').first() - data['dashou_rate'] = float(lilu_obj.lilu) if lilu_obj and lilu_obj.lilu is not None else 0.00 + lilu_obj = CommissionRate.query.filter(Platform='5').first() + data['dashou_rate'] = float(lilu_obj.Rate) if lilu_obj and lilu_obj.Rate is not None else 0.00 # 打手保证金提现费率 (类型 '11') - lilu_obj = Lilubiao.query.filter(fadanpingtai='11').first() - data['dashou_yajin_rate'] = float(lilu_obj.lilu) if lilu_obj and lilu_obj.lilu is not None else 0.00 + lilu_obj = CommissionRate.query.filter(Platform='11').first() + data['dashou_yajin_rate'] = float(lilu_obj.Rate) if lilu_obj and lilu_obj.Rate is not None else 0.00 # 商家提现费率 (类型 '10') - lilu_obj = Lilubiao.query.filter(fadanpingtai='10').first() - data['shangjia_rate'] = float(lilu_obj.lilu) if lilu_obj and lilu_obj.lilu is not None else 0.00 + lilu_obj = CommissionRate.query.filter(Platform='10').first() + data['shangjia_rate'] = float(lilu_obj.Rate) if lilu_obj and lilu_obj.Rate is not None else 0.00 # 管事提现费率 (类型 '6') - lilu_obj = Lilubiao.query.filter(fadanpingtai='6').first() - data['guanshi_rate'] = float(lilu_obj.lilu) if lilu_obj and lilu_obj.lilu is not None else 0.00 + lilu_obj = CommissionRate.query.filter(Platform='6').first() + data['guanshi_rate'] = float(lilu_obj.Rate) if lilu_obj and lilu_obj.Rate is not None else 0.00 # 组长提现费率 (类型 '8') - lilu_obj = Lilubiao.query.filter(fadanpingtai='8').first() - data['zuzhang_rate'] = float(lilu_obj.lilu) if lilu_obj and lilu_obj.lilu is not None else 0.00 + lilu_obj = CommissionRate.query.filter(Platform='8').first() + data['zuzhang_rate'] = float(lilu_obj.Rate) if lilu_obj and lilu_obj.Rate is not None else 0.00 # 审核官(考核官)提现费率 (类型 '9') - lilu_obj = Lilubiao.query.filter(fadanpingtai='9').first() - data['kaoheguan_rate'] = float(lilu_obj.lilu) if lilu_obj and lilu_obj.lilu is not None else 0.00 + lilu_obj = CommissionRate.query.filter(Platform='9').first() + data['kaoheguan_rate'] = float(lilu_obj.Rate) if lilu_obj and lilu_obj.Rate is not None else 0.00 return Response({ 'code': 200, diff --git a/utils/chat_utils.py b/utils/chat_utils.py index 129eaaa..9cd4b55 100644 --- a/utils/chat_utils.py +++ b/utils/chat_utils.py @@ -3,7 +3,7 @@ import json import logging import requests from django.conf import settings -from orders.models import Dingdan, DingdanPingtai, DingdanShangjia +from orders.models import Order, PlatformOrderExt, MerchantOrderExt from users.models import UserDashou, UserBoss, UserShangjia from gvsdsdk.models import User @@ -99,12 +99,12 @@ def _send_group_message(appkey, secret, group_id, sender_id, sender_name, sender # ========== 核心入口 ========== def establish_order_chat(dingdan_id): try: - order = Dingdan.objects.select_related('pingtai_kuozhan', 'shangjia_kuozhan').get(dingdan_id=dingdan_id) - except Dingdan.DoesNotExist: + order = Order.objects.select_related('pingtai_kuozhan', 'shangjia_kuozhan').get(OrderID=dingdan_id) + except Order.DoesNotExist: logger.error(f"订单 {dingdan_id} 不存在") return False - dashou_uid = order.jiedan_dashou_id + dashou_uid = order.PlayerID dashou_goeasy_id = f"Ds{dashou_uid}" dashou_nickname = f'打手{dashou_uid[:6]}' dashou_avatar_relative = '' @@ -129,9 +129,9 @@ def establish_order_chat(dingdan_id): # ========== 普通订单 / 我方派单 ========== def _handle_local_order(order, dashou_goeasy_id, dashou_name, dashou_avatar, appkey, secret): - group_id = f"group_{order.dingdan_id}" - group_name = (order.jieshao[:20] + '…') if order.jieshao and len(order.jieshao) > 20 else (order.jieshao or f"订单{order.dingdan_id}") - group_avatar = _full_local_avatar(order.tupian) if order.tupian else _full_local_avatar('') + group_id = f"group_{order.OrderID}" + group_name = (order.Description[:20] + '…') if order.Description and len(order.Description) > 20 else (order.Description or f"订单{order.OrderID}") + group_avatar = _full_local_avatar(order.ImageURL) if order.ImageURL else _full_local_avatar('') partner_goeasy_id, partner_name, partner_avatar = _get_local_partner_info(order) if not partner_goeasy_id: @@ -142,27 +142,27 @@ def _handle_local_order(order, dashou_goeasy_id, dashou_name, dashou_avatar, app return False # 1. 打手发送初始化消息 - init_msg_text = f"订单已接单,内容:{order.jieshao},备注:{order.beizhu},游戏ID:{order.nicheng}" + init_msg_text = f"订单已接单,内容:{order.Description},备注:{order.Remark},游戏ID:{order.Nickname}" success1 = _send_group_message( appkey, secret, group_id, dashou_goeasy_id, dashou_name, group_avatar, - init_msg_text, None, group_name=group_name, order_id=order.dingdan_id + init_msg_text, None, group_name=group_name, order_id=order.OrderID ) # 2. 【新增】派单方也发一条消息,确保他也能看到群聊 partner_msg = f"订单已确认,请开始服务。" success2 = _send_group_message( appkey, secret, group_id, partner_goeasy_id, partner_name, partner_avatar, - partner_msg, None, group_name=group_name, order_id=order.dingdan_id + partner_msg, None, group_name=group_name, order_id=order.OrderID ) return success1 and success2 def _get_local_partner_info(order): """本地订单下单方:老板或商家""" - if order.fadan_pingtai == 1: # 老板 + if order.Platform == 1: # 老板 try: ext = order.pingtai_kuozhan - laoban_id = ext.laoban_id + laoban_id = ext.BossID avatar_full = _full_local_avatar('') nickname = f'老板{laoban_id[:6]}' try: @@ -177,11 +177,11 @@ def _get_local_partner_info(order): except Exception as e: logger.error(f"获取老板信息失败: {e}") return None, None, None - elif order.fadan_pingtai == 2: # 商家 + elif order.Platform == 2: # 商家 try: ext = order.shangjia_kuozhan - shangjia_id = ext.shangjia_id - nickname = ext.sjnicheng or f'商家{shangjia_id[:6]}' + shangjia_id = ext.MerchantID + nickname = ext.MerchantNickname or f'商家{shangjia_id[:6]}' avatar_full = _full_local_avatar('') try: sj_user = User.objects.get(UserUID=shangjia_id) diff --git a/utils/fadan_utils.py b/utils/fadan_utils.py index 2e4a9b5..7f3faf7 100644 --- a/utils/fadan_utils.py +++ b/utils/fadan_utils.py @@ -1,5 +1,5 @@ # utils/fadan_utils.py -from orders.models import Fadan +from orders.models import Penalty import logging logger = logging.getLogger('xiaochengxu') @@ -20,10 +20,10 @@ def check_fadan_qiangdan_eligible(yonghuid: str, action_type: int) -> tuple: try: if action_type == 1: # 抢单:仅当存在“影响抢单”且“未解决”的罚单时拦截(待缴纳或申诉中) - blocked = Fadan.objects.filter( - beichufa_id=yonghuid, - yingxiang_qiangdan=1, - zhuangtai__in=[1, 3] # 1=待缴纳, 3=申诉中 + blocked = Penalty.objects.filter( + PenalizedUserID=yonghuid, + AffectsGrabbing=1, + Status__in=[1, 3] # 1=待缴纳, 3=申诉中 ).exists() if blocked: logger.info(f"用户 {yonghuid} 抢单被拦截:存在未解决的影响抢单罚单") @@ -32,9 +32,9 @@ def check_fadan_qiangdan_eligible(yonghuid: str, action_type: int) -> tuple: elif action_type == 2: # 提现:只要存在任意未解决的罚单(待缴纳/申诉中),不论是否影响抢单,一律禁止提现 - blocked = Fadan.objects.filter( - beichufa_id=yonghuid, - zhuangtai__in=[1, 3] # 1=待缴纳, 3=申诉中 + blocked = Penalty.objects.filter( + PenalizedUserID=yonghuid, + Status__in=[1, 3] # 1=待缴纳, 3=申诉中 ).exists() if blocked: logger.info(f"用户 {yonghuid} 提现被拦截:存在未解决的罚单") @@ -57,7 +57,7 @@ def check_fadan_qiangdan_eligible(yonghuid: str, action_type: int) -> tuple: import logging from django.db import transaction from decimal import Decimal -from orders.models import Fadan, FadanFenhong, FadanFenhongLilv +from orders.models import Penalty, PenaltyBonus, PenaltyBonusRate logger = logging.getLogger('xiaochengxu') @@ -69,30 +69,30 @@ def fadan_fenhong(fadan_id): try: # 1. 查询罚单 try: - fadan = Fadan.objects.get(id=fadan_id) - except Fadan.DoesNotExist: + fadan = Penalty.objects.get(id=fadan_id) + except Penalty.DoesNotExist: logger.warning(f"罚单 {fadan_id} 不存在,分红跳过") return - if fadan.zhuangtai != 2: + if fadan.Status != 2: logger.info(f"罚单 {fadan_id} 状态非已缴纳,不分红") return - fenhongzhe_id = fadan.shenqing_chufa or '' - shenfen_in_fadan = fadan.shenqingren_shenfen # 罚单中的申请人身份 - jine = fadan.fakuanjine + fenhongzhe_id = fadan.ApplicantID or '' + shenfen_in_fadan = fadan.ApplicantIdentity # 罚单中的申请人身份 + jine = fadan.FineAmount if not fenhongzhe_id or jine <= 0: logger.info(f"罚单 {fadan_id} 缺少申请处罚人或金额为0,不分红") return # 2. 直接用罚单身份的原始值查询费率(费率表 shenfen 与之含义一致) - rate_record = FadanFenhongLilv.objects.filter(shenfen=shenfen_in_fadan).first() - if not rate_record or rate_record.lilv <= 0: + rate_record = PenaltyBonusRate.objects.filter(Identity=shenfen_in_fadan).first() + if not rate_record or rate_record.Rate <= 0: logger.info(f"身份 {shenfen_in_fadan} 无有效分红费率,不分红") return - rate = rate_record.lilv + rate = rate_record.Rate # 3. 计算分红金额 amount = (jine * rate).quantize(Decimal('0.01')) @@ -115,25 +115,25 @@ def fadan_fenhong(fadan_id): # 5. 事务累加分红记录(同一用户+身份只保留一条记录) with transaction.atomic(): - record = FadanFenhong.objects.select_for_update().filter( - fenhongzhe_id=fenhongzhe_id, - shenfen=shenfen_in_fenhong # 使用映射后的身份值 + record = PenaltyBonus.objects.select_for_update().filter( + BeneficiaryID=fenhongzhe_id, + Identity=shenfen_in_fenhong # 使用映射后的身份值 ).first() if record: - record.zonge += amount - record.ketixian_fenhong += amount - record.fenhong_cishu += 1 - record.yingde_lilv = rate + record.TotalAmount += amount + record.WithdrawableAmount += amount + record.BonusCount += 1 + record.IndividualRate = rate record.save() else: - FadanFenhong.objects.create( - fenhongzhe_id=fenhongzhe_id, - shenfen=shenfen_in_fenhong, - zonge=amount, - ketixian_fenhong=amount, - fenhong_cishu=1, - yingde_lilv=rate, + PenaltyBonus.objects.create( + BeneficiaryID=fenhongzhe_id, + Identity=shenfen_in_fenhong, + TotalAmount=amount, + WithdrawableAmount=amount, + BonusCount=1, + IndividualRate=rate, ) logger.info(f"罚单 {fadan_id} 分红完成:用户 {fenhongzhe_id} 身份 {shenfen_in_fenhong} 金额 {amount}")