dvlyadmin_pro/backend/apps/lyTiktokUnion/views/dyBalanceRecordViews.py
2025-03-17 18:06:54 +08:00

131 lines
5.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from rest_framework.views import APIView
from apps.lyTiktokUnion.models import DYBalanceRecord
from utils.jsonResponse import SuccessResponse,ErrorResponse,DetailResponse
from utils.common import get_parameter_dic,formatdatetime
from django.db.models import Q,F,Sum,Count
from django.db import transaction
from rest_framework import serializers
from rest_framework_simplejwt.authentication import JWTAuthentication
from utils.serializers import CustomModelSerializer
from utils.viewset import CustomModelViewSet
from rest_framework.permissions import IsAuthenticated
from utils.pagination import CustomPagination
from apps.oauth.models import OAuthWXUser
from utils.weixinpay import WxAppPay
from mysystem.models import Users
import json
import django_filters
import logging
logger = logging.getLogger(__name__)
class DYBalanceRecordFilterset(django_filters.rest_framework.FilterSet):
#开始时间
beginAt = django_filters.DateTimeFilter(field_name='create_datetime', lookup_expr='gte') # 指定过滤的字段
#结束时间
endAt = django_filters.DateTimeFilter(field_name='create_datetime', lookup_expr='lte')
# 模糊搜索
order_no = django_filters.CharFilter(field_name='order_no', lookup_expr='icontains') # icontains表示该字段模糊搜索
# 模糊搜索
audit_status = django_filters.CharFilter(field_name='audit_status') # icontains表示该字段模糊搜索
class Meta:
model = DYBalanceRecord
fields = ['beginAt', 'endAt','order_no','audit_status']
class DYBalanceRecordSerializer(CustomModelSerializer):
"""
提现管理-序列化器
"""
userinfo = serializers.SerializerMethodField()
status_name = serializers.SerializerMethodField()
audit_status_name = serializers.SerializerMethodField()
def get_status_name(self,obj):
return obj.get_status_display()
def get_audit_status_name(self,obj):
return obj.get_audit_status_display()
def get_userinfo(self, obj):
if obj.creator_id:
creator = Users.objects.filter(id=obj.creator_id).first()
if creator:
return {
'id': creator.id,
'nickname': creator.nickname,
'avatar': creator.avatar,
'mobile': creator.mobile,
}
return {
'id': "",
'nickname': "",
'avatar': "",
'mobile': "",
}
class Meta:
model = DYBalanceRecord
read_only_fields = ["id"]
fields = '__all__'
class DYBalanceRecordViewSet(CustomModelViewSet):
"""
提现管理 接口
"""
queryset = DYBalanceRecord.objects.filter(type=1).order_by("-create_datetime")
serializer_class = DYBalanceRecordSerializer
filterset_class = DYBalanceRecordFilterset
search_fields = ("creator__nickname","creator__mobile")
def audit(self, request):
reqData = get_parameter_dic(request)
id = reqData.get('id',None)
action = reqData.get('action',None)
remark = reqData.get('audit_remarks',None)
# 按照原来的过滤查询
queryset = self.filter_queryset(self.get_queryset())
instance = queryset.filter(id=id,status=1).first()
if instance is not None:
user = instance.user
if action == "pass":
oldbalance = user.balance
newbalance = oldbalance - instance.money
# instance.status = 20
instance.audit_status = 20
instance.balance = newbalance
# instance.audit_remarks = remark
instance.save()
#给用户钱包余额扣钱
# user.balance = newbalance
# user.save()
# 开始提现
trade_no = instance.order_no # 商户订单号
amount = float(instance.money)*100 # '企业付款金额,单位为分'
# openid = OAuthWXUser.objects.filter(user=user).values_list('xcx_openid', flat=True).first()
openid = user.username
response = WxAppPay().cashout(trade_no,amount,openid)
content = json.loads(response.content)
if response.status_code == 200:
instance.status = 20
instance.trade_no = content['batch_id']
instance.save()
user.save()
else:
logger.error("微信小程序提现返回错误用户openid:%s,微信返回错误信息:%s" % (openid, response.text))
instance.status = 30
instance.save()
return DetailResponse(msg="已通过")
elif action == "deny":
instance.status = 30
instance.audit_status = 30
instance.audit_remarks = remark
instance.save()
return DetailResponse(msg="已拒绝")
else:
return ErrorResponse(msg="审核动作错误只能为pass或deny")
else:
return ErrorResponse(msg="未获取到需要审核的数据或已审核过")