187 lines
7.4 KiB
Python
187 lines
7.4 KiB
Python
"""rank.views.kaoheguan - auto-generated by split script."""
|
||
import json
|
||
import logging
|
||
from decimal import Decimal
|
||
from django.db import models, transaction
|
||
from django.db.models import F
|
||
from rest_framework.views import APIView
|
||
from rest_framework.response import Response
|
||
from rest_framework.permissions import IsAuthenticated
|
||
from ..utils import get_tag_fee, create_shenhe_jilu, validate_shenheguan
|
||
from ..models import (
|
||
YonghuChenghao, Chenghao, KaoheCishuFeiyong, KaoheJujueJilu,
|
||
KaoheguanBankuai, Bankuai, ShenheJilu, KaoheJiluFeiyong
|
||
)
|
||
from users.models import UserShenheguan, UserDashou
|
||
from users.business_models import User
|
||
from products.models import ShangpinLeixing
|
||
|
||
|
||
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
|
||
KAOHEGUAN_INVITE_CODE = 'KHG2026VIP'
|
||
|
||
|
||
class KaoheguanRegisterView(APIView):
|
||
"""
|
||
考核官注册接口
|
||
POST /dengji/khgzc
|
||
"""
|
||
permission_classes = [IsAuthenticated]
|
||
|
||
def post(self, request):
|
||
try:
|
||
yonghu = request.user
|
||
invite_code = request.data.get('inviteCode', '').strip()
|
||
|
||
if not invite_code:
|
||
return Response({'code': 400, 'msg': '邀请码不能为空'})
|
||
if invite_code != KAOHEGUAN_INVITE_CODE:
|
||
return Response({'code': 400, 'msg': '邀请码错误'})
|
||
|
||
kg = UserShenheguan.objects.filter(user=yonghu).first()
|
||
if kg:
|
||
if kg.zhuangtai == 1:
|
||
return Response({'code': 200, 'msg': '您已是考核官', 'data': self._build_data(kg)})
|
||
else:
|
||
return Response({'code': 400, 'msg': '账号已被封禁'})
|
||
|
||
with transaction.atomic():
|
||
kg = UserShenheguan.objects.create(
|
||
user=yonghu,
|
||
zhuangtai=1,
|
||
shenhe_zhuangtai=0,
|
||
shenhe_zongshu=0,
|
||
tongguo_zongshu=0,
|
||
yue=0.00,
|
||
zonge=0.00
|
||
)
|
||
return Response({'code': 200, 'msg': '注册成功', 'data': self._build_data(kg)})
|
||
|
||
except Exception as e:
|
||
logger.error(f"考核官注册失败: {e}", exc_info=True)
|
||
return Response({'code': 500, 'msg': '服务器内部错误'})
|
||
|
||
def _build_data(self, kg):
|
||
bankuai_qs = KaoheguanBankuai.objects.filter(kaoheguan_id=kg.user.UserUID).select_related('bankuai')
|
||
bankuai_list = [{'bankuai_id': b.bankuai.bankuai_id, 'mingcheng': b.bankuai.mingcheng} for b in bankuai_qs]
|
||
return {
|
||
'zhuangtai': kg.zhuangtai,
|
||
'shenhe_zongshu': kg.shenhe_zongshu,
|
||
'tongguo_zongshu': kg.tongguo_zongshu,
|
||
'yue': str(kg.yue),
|
||
'zonge': str(kg.zonge),
|
||
'shenhe_zhuangtai': kg.shenhe_zhuangtai,
|
||
'bankuai_list': bankuai_list,
|
||
'kaoheguanstatus': 1
|
||
}
|
||
|
||
|
||
class KaoheguanRefreshView(APIView):
|
||
"""
|
||
考核官数据刷新接口
|
||
POST /dengji/khgsx
|
||
"""
|
||
permission_classes = [IsAuthenticated]
|
||
|
||
def post(self, request):
|
||
try:
|
||
yonghu = request.user
|
||
kg = UserShenheguan.objects.filter(user=yonghu).first()
|
||
if not kg:
|
||
return Response({'code': 400, 'msg': '您还未注册考核官'})
|
||
|
||
if kg.zhuangtai != 1:
|
||
return Response({'code': 200, 'data': {'zhuangtai': kg.zhuangtai, 'kaoheguanstatus': 0}})
|
||
|
||
# 查询所属板块
|
||
bankuai_qs = KaoheguanBankuai.objects.filter(kaoheguan_id=kg.user.UserUID).select_related('bankuai')
|
||
bankuai_list = [{'bankuai_id': b.bankuai.bankuai_id, 'mingcheng': b.bankuai.mingcheng} for b in bankuai_qs]
|
||
|
||
# 统计待审核 / 审核中的记录数量
|
||
pending_count = ShenheJilu.objects.filter(
|
||
shenheguan_id=yonghu.UserUID,
|
||
zhuangtai=0 # 审核中
|
||
).count()
|
||
|
||
data = {
|
||
'zhuangtai': kg.zhuangtai,
|
||
'shenhe_zongshu': kg.shenhe_zongshu,
|
||
'tongguo_zongshu': kg.tongguo_zongshu,
|
||
'yue': str(kg.yue),
|
||
'zonge': str(kg.zonge),
|
||
'shenhe_zhuangtai': kg.shenhe_zhuangtai,
|
||
'bankuai_list': bankuai_list,
|
||
'kaoheguanstatus': 1,
|
||
'is_renzheng': kg.is_renzheng, # 🆕 是否认证
|
||
'pending_shenhe_count': pending_count # 🆕 审核中数量
|
||
}
|
||
return Response({'code': 200, 'data': data})
|
||
|
||
except Exception as e:
|
||
logger.error(f"考核官刷新失败: {e}", exc_info=True)
|
||
return Response({'code': 500, 'msg': '服务器内部错误'})
|
||
|
||
|
||
class KaoheFreeApplyView(APIView):
|
||
"""免费申请考核(首次/再次,费用为0时调用)"""
|
||
permission_classes = [IsAuthenticated]
|
||
|
||
def post(self, request):
|
||
try:
|
||
user = request.user
|
||
tag_id = request.data.get('tag_id')
|
||
game_nick = request.data.get('game_nick', '').strip()
|
||
remark = request.data.get('remark', '').strip()
|
||
reapply = request.data.get('reapply', False)
|
||
jilu_id = request.data.get('jilu_id') if reapply else None
|
||
shenheguan_id = request.data.get('shenheguan_id', '').strip() # 新增
|
||
|
||
if not tag_id or not game_nick:
|
||
return Response({'code': 400, 'msg': '标签ID和游戏昵称必填'})
|
||
|
||
# 校验费用是否为0
|
||
try:
|
||
chenghao = Chenghao.objects.get(id=tag_id)
|
||
except Chenghao.DoesNotExist:
|
||
return Response({'code': 400, 'msg': '标签不存在'})
|
||
|
||
# 计算本次次数
|
||
if reapply and jilu_id:
|
||
last_record = ShenheJilu.objects.filter(
|
||
jilu_id=jilu_id, shenqingren_id=user.UserUID, zhuangtai=2
|
||
).first()
|
||
if not last_record:
|
||
return Response({'code': 400, 'msg': '原记录不存在或状态不是未通过'})
|
||
new_cishu = last_record.cishu + 1
|
||
else:
|
||
max_cishu = ShenheJilu.objects.filter(
|
||
shenqingren_id=user.UserUID, chenghao=chenghao, zhuangtai__in=[1,2]
|
||
).aggregate(max=models.Max('cishu'))['max'] or 0
|
||
new_cishu = max_cishu + 1
|
||
|
||
fee = get_tag_fee(chenghao, new_cishu)
|
||
if fee > 0:
|
||
return Response({'code': 400, 'msg': '您有未通过的记录请查看并重考'})
|
||
|
||
# 新增:如果指定了考核官,进行合法性校验
|
||
if shenheguan_id:
|
||
valid, err = validate_shenheguan(shenheguan_id, chenghao.bankuai, fee, user)
|
||
if not valid:
|
||
return Response({'code': 400, 'msg': err})
|
||
|
||
# 调用公共创建逻辑
|
||
success, msg, record = create_shenhe_jilu(
|
||
user, tag_id, game_nick, remark, reapply, jilu_id,
|
||
shenheguan_id=shenheguan_id # 新增参数
|
||
)
|
||
if success:
|
||
return Response({'code': 0, 'msg': msg, 'data': {'jilu_id': record.jilu_id}})
|
||
else:
|
||
return Response({'code': 400, 'msg': msg})
|
||
except Exception as e:
|
||
return Response({'code': 500, 'msg': str(e)}, status=500)
|