之前保证金提现(leixing=5)在申请扣款时会封禁(zhanghaozhuangtai=0),驳回退款时会解封(zhanghaozhuangtai=1)。收款流程本身不会封禁,但若申请时已封禁,收款校验会拦掉。

This commit is contained in:
XingQue
2026-06-18 14:19:09 +08:00
parent ced84e8df7
commit 09dc5cebba
2 changed files with 84 additions and 63 deletions

View File

@@ -873,7 +873,6 @@ def refund_balance(user_main, leixing, jine):
elif leixing == 5:
dashou = UserDashou.objects.select_for_update().get(user=user_main)
dashou.yajin += jine
dashou.zhanghaozhuangtai = 1
dashou.save()
elif leixing == 6:
shangjia = UserShangjia.objects.select_for_update().get(user=user_main)
@@ -918,7 +917,6 @@ def deduct_balance(user_main, leixing, jine):
if dashou.yajin < jine:
raise ValueError('押金余额不足')
dashou.yajin -= jine
dashou.zhanghaozhuangtai = 0
dashou.save()
return dashou.nicheng or ''
if leixing == 6:

View File

@@ -3,7 +3,7 @@ import time
import random
import hashlib
import requests
from django.db import transaction
from django.db import transaction, IntegrityError
from django.conf import settings
from rest_framework.views import APIView
from rest_framework.response import Response
@@ -24,7 +24,7 @@ from rest_framework.permissions import AllowAny # 新增这行
from django.conf import settings
from django.utils import timezone
from django.db import transaction
from django.db import transaction, IntegrityError
from django.core.exceptions import ObjectDoesNotExist
from rest_framework.views import APIView
from rest_framework.response import Response
@@ -71,6 +71,63 @@ def huoquYonghuDaili(request):
return user_agent[:100] if user_agent else ''
def shengcheng_yonghu_id():
"""生成7位数字用户ID"""
for _ in range(10):
timestamp_part = str(int(time.time()))[-5:].zfill(5)
random_part = str(random.randint(0, 99)).zfill(2)
user_id = timestamp_part + random_part
if len(user_id) == 7 and user_id.isdigit():
if not UserMain.objects.filter(yonghuid=user_id).exists():
return user_id
raise Exception('生成用户ID失败')
def get_or_create_wechat_user(openid, user_type='normal'):
"""
按 openid 获取或创建微信用户,兼容并发注册导致的主键/唯一键冲突。
返回 (user_main, created)
"""
for attempt in range(3):
try:
with transaction.atomic():
user_main = UserMain.objects.select_for_update().filter(openid=openid).first()
if user_main:
if not user_main.yonghuid:
yonghuid = shengcheng_yonghu_id()
UserMain.objects.filter(pk=user_main.pk).update(yonghuid=yonghuid)
user_main.refresh_from_db()
return user_main, False
user_main = UserMain.objects.create(
openid=openid,
yonghuid=shengcheng_yonghu_id(),
user_type=user_type,
)
user_main.refresh_from_db()
return user_main, True
except IntegrityError:
if attempt == 2:
user_main = UserMain.objects.filter(openid=openid).first()
if user_main:
return user_main, False
raise
user_main = UserMain.objects.get(openid=openid)
return user_main, False
def update_wechat_user_login_info(user_main, ip, unionid=None):
"""更新登录信息,使用 update 避免 save() 误触发 INSERT。"""
update_fields = {
'ip': ip,
'last_login_time': timezone.now(),
}
if unionid and unionid != user_main.unionid:
update_fields['unionid'] = unionid
UserMain.objects.filter(pk=user_main.pk).update(**update_fields)
user_main.refresh_from_db()
@@ -112,20 +169,8 @@ class WechatMiniProgramLoginView(APIView):
kehuduan_ip = self.huoquKehuduanIP(request)
with transaction.atomic():
# 创建或获取用户
user_main, created = UserMain.objects.select_for_update().get_or_create(
openid=openid,
defaults={'yonghuid': self.shengchengYonghuID(), 'user_type': 'normal'}
)
# 🆕【新增】保存unionid
if unionid and unionid != user_main.unionid:
user_main.unionid = unionid
cunchu_ip = kehuduan_ip
user_main.ip = cunchu_ip
user_main.last_login_time = timezone.now()
user_main.save()
user_main, created = get_or_create_wechat_user(openid, user_type='normal')
update_wechat_user_login_info(user_main, kehuduan_ip, unionid=unionid or None)
if created:
UserBoss.objects.create(user=user_main, nickname='板板大人')
@@ -513,7 +558,7 @@ class WeixinOfficialCallbackView(APIView):
# yonghu/views.py
from rest_framework.parsers import MultiPartParser, FormParser,JSONParser
from rest_framework import permissions
from django.db import transaction
from django.db import transaction, IntegrityError
from rest_framework.response import Response
from rest_framework import status
from rest_framework.views import APIView
@@ -1597,7 +1642,7 @@ class GuanshiYaoqingDashouListView(APIView):
from rest_framework.views import APIView
from rest_framework import permissions, status
from rest_framework.response import Response
from django.db import transaction
from django.db import transaction, IntegrityError
from .models import UserMain, UserDashou, UserGuanshi, Tixianjilu
import os
import uuid
@@ -1811,7 +1856,7 @@ class ShoukuanXinxiShangchuanView(APIView):
from rest_framework.views import APIView
from rest_framework import permissions, status
from rest_framework.response import Response
from django.db import transaction
from django.db import transaction, IntegrityError
from django.db.models import F
import decimal
import traceback
@@ -1820,7 +1865,7 @@ from .models import UserMain, UserDashou, UserGuanshi, Tixianjilu
from rest_framework.views import APIView
from rest_framework import permissions, status
from rest_framework.response import Response
from django.db import transaction
from django.db import transaction, IntegrityError
from django.db.models import F
import decimal
import traceback
@@ -1979,8 +2024,6 @@ class TixianShenqingView(APIView):
if profile.yajin < jine:
return Response({'code': 53, 'msg': '押金余额不足'})
profile.yajin = F('yajin') - jine
# 押金提现后封禁打手账号
profile.zhanghaozhuangtai = 0 # 0表示禁用
profile.save()
nicheng = profile.nicheng or ''
elif leixing == 6:
@@ -2460,7 +2503,7 @@ from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework.permissions import IsAuthenticated
from django.db import transaction
from django.db import transaction, IntegrityError
from django.core.exceptions import ObjectDoesNotExist
import json
@@ -2926,7 +2969,7 @@ from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from rest_framework.parsers import JSONParser
from rest_framework import status
from django.db import transaction
from django.db import transaction, IntegrityError
import logging
# 获取日志器
@@ -4323,7 +4366,7 @@ class AdTongYiChuFa(APIView):
from django.utils import timezone
from datetime import timedelta
from decimal import Decimal
from django.db import transaction
from django.db import transaction, IntegrityError
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
@@ -5700,7 +5743,7 @@ from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework.permissions import IsAuthenticated
from django.db import transaction
from django.db import transaction, IntegrityError
from django.utils import timezone
from peizhi.models import Szjilu # 添加收支记录表导入
@@ -6609,20 +6652,8 @@ class WechatLoginAndDashouRegisterView(APIView):
# 4. 开始数据库事务(确保登录和注册的原子性)
with transaction.atomic():
# 4.1 创建或获取用户(登录逻辑)
user_main, created = UserMain.objects.select_for_update().get_or_create(
openid=openid,
defaults={
'yonghuid': self.shengchengYonghuID(),
'user_type': 'normal',
}
)
# 更新用户IP和最后登录时间
cunchu_ip = kehuduan_ip
user_main.ip = cunchu_ip
user_main.last_login_time = timezone.now()
user_main.save()
user_main, created = get_or_create_wechat_user(openid, user_type='normal')
update_wechat_user_login_info(user_main, kehuduan_ip)
if created:
# 新用户:创建老板扩展表
@@ -7650,7 +7681,7 @@ class DashouShensuView(APIView):
}, status=status.HTTP_400_BAD_REQUEST)
# 🔴🆕【关键】使用事务确保数据一致性
from django.db import transaction
from django.db import transaction, IntegrityError
with transaction.atomic():
# 1. 查询处罚记录
@@ -8842,7 +8873,7 @@ class KefuGetOrderDetailView(APIView):
import logging
from django.db import transaction
from django.db import transaction, IntegrityError
from django.core.exceptions import ObjectDoesNotExist
from rest_framework.views import APIView
from rest_framework.response import Response
@@ -9070,7 +9101,7 @@ import requests
import xmltodict
import time
from decimal import Decimal
from django.db import transaction
from django.db import transaction, IntegrityError
from django.conf import settings
from django.core.exceptions import ObjectDoesNotExist
from rest_framework.views import APIView
@@ -9626,7 +9657,7 @@ class KefuPlatformRefundView(APIView):
# dingdan/views.py
import logging
from django.db import transaction
from django.db import transaction, IntegrityError
from django.core.exceptions import ObjectDoesNotExist
from rest_framework.views import APIView
from rest_framework.response import Response
@@ -11489,7 +11520,7 @@ class KefuPunishmentDetailView(APIView):
from django.db import transaction
from django.db import transaction, IntegrityError
from decimal import Decimal
class KefuPunishmentActionView(APIView):
@@ -12050,7 +12081,7 @@ class KefuWithdrawDetailView(APIView):
import logging
import json
from decimal import Decimal
from django.db import transaction
from django.db import transaction, IntegrityError
from django.utils import timezone
from django.core.exceptions import ObjectDoesNotExist
from rest_framework.views import APIView
@@ -12395,7 +12426,7 @@ class KefuPunishView(APIView):
return Response({'code': 0, 'msg': '处罚成功'})
from django.db import transaction
from django.db import transaction, IntegrityError
from django.contrib.auth.hashers import make_password
class AdKftjView(APIView):
@@ -12641,7 +12672,7 @@ import time
from datetime import date
import requests
from django.db import transaction
from django.db import transaction, IntegrityError
from django.conf import settings
from rest_framework.views import APIView
from rest_framework import permissions, status
@@ -12669,7 +12700,7 @@ from datetime import date
import logging
import requests
from django.db import transaction
from django.db import transaction, IntegrityError
from django.conf import settings
from django.core.cache import cache
from django.utils import timezone
@@ -12700,7 +12731,7 @@ from datetime import date
import logging
import requests
from django.db import transaction
from django.db import transaction, IntegrityError
from django.conf import settings
from django.core.cache import cache
from django.utils import timezone
@@ -13542,16 +13573,8 @@ class WechatLoginAndGuanshiRegisterView(APIView):
kehuduan_ip = self._huoqu_kehuduan_ip(request)
with transaction.atomic():
user_main, created = UserMain.objects.select_for_update().get_or_create(
openid=openid,
defaults={
'yonghuid': self._shengcheng_yonghu_id(),
'user_type': 'normal',
}
)
user_main.ip = kehuduan_ip
user_main.last_login_time = timezone.now()
user_main.save()
user_main, created = get_or_create_wechat_user(openid, user_type='normal')
update_wechat_user_login_info(user_main, kehuduan_ip)
if created:
UserBoss.objects.create(user=user_main, nickname='微信用户')
@@ -13784,7 +13807,7 @@ class WechatLoginAndGuanshiRegisterView(APIView):
from django.db import transaction, models
from django.db import transaction, IntegrityError, models
class GuanshiRegisterView(APIView):
"""