Files
along_django/utils/dashou_register_service.py

115 lines
4.0 KiB
Python

"""
打手注册共用逻辑:邀请码解析、创建打手、管事邀请统计。
"""
import logging
from django.conf import settings
from django.db import transaction
from yonghu.models import UserDashou, UserGuanshi, UserMain
logger = logging.getLogger('yonghu.dashouzhuce')
def get_default_dashou_invite_code():
return getattr(settings, 'DASHOU_DEFAULT_INVITE_CODE', '').strip()
def mark_guanshi_qr_scanned(user_main, invite_code_raw):
"""
仅当请求明确带了管事邀请码(真实扫码)时,标记用户已扫过管事二维码。
空邀请码走默认码注册的不标记,避免误开隐藏商品。
已是打手/老用户同样必须写入,注册流程可跳过,标记不可跳过。
"""
if not user_main or not (invite_code_raw or '').strip():
return False
updated = UserMain.objects.filter(pk=user_main.pk).exclude(guanshi_saoma=1).update(guanshi_saoma=1)
user_main.guanshi_saoma = 1
if updated:
logger.info(
'扫管事码标记已写入 yonghuid=%s invite=%s',
getattr(user_main, 'yonghuid', ''),
(invite_code_raw or '')[:20],
)
return True
def resolve_guanshi_for_dashou_register(invite_code):
"""
根据邀请码查找管事;无邀请码时使用默认码;默认码查不到时按平台管事 yonghuid 回退。
返回 (guanshi_profile, error_message)
"""
code = (invite_code or '').strip()
default_code = get_default_dashou_invite_code()
if not code:
code = default_code
if not code:
return None, '邀请码不能为空'
if len(code) > 100:
return None, '邀请码长度超过限制'
guanshi = UserGuanshi.objects.select_related('user').filter(yaoqingma=code).first()
if guanshi:
return guanshi, None
if default_code and code == default_code:
fallback_uid = getattr(settings, 'DASHOU_DEFAULT_GUANSHI_YONGHUID', '').strip()
if fallback_uid:
guanshi = UserGuanshi.objects.select_related('user').filter(
user__yonghuid=fallback_uid,
).first()
if guanshi:
if guanshi.yaoqingma != code:
UserGuanshi.objects.filter(pk=guanshi.pk).update(yaoqingma=code)
guanshi.refresh_from_db()
logger.info('默认邀请码回退到平台管事 yonghuid=%s', fallback_uid)
return guanshi, None
return None, '邀请码无效或不存在'
def create_dashou_for_user(user_main, guanshi_profile):
"""为已登录用户创建打手身份,并更新管事邀请统计。返回 dashou_profile。"""
try:
return user_main.dashou_profile
except UserDashou.DoesNotExist:
pass
guanshi_yonghuid = guanshi_profile.user.yonghuid
with transaction.atomic():
dashou_profile = UserDashou.objects.create(
user=user_main,
nicheng='大手子',
chenghao='普通大手',
yaoqingren=guanshi_yonghuid,
jifen=5,
)
locked_guanshi = UserGuanshi.objects.select_for_update().get(pk=guanshi_profile.pk)
locked_guanshi.yaogingshuliang += 1
locked_guanshi.save(update_fields=['yaogingshuliang'])
try:
from decimal import Decimal
from houtai.utils import update_guanshi_daily_by_action
update_guanshi_daily_by_action(
yonghuid=guanshi_yonghuid,
action=1,
amount=Decimal('0.00'),
)
except Exception as stat_err:
logger.warning('管事每日统计更新失败(邀请打手):%s', stat_err)
return dashou_profile
def ensure_guanshi_profile_for_user(user_main):
"""扫码注册流程:若用户尚无管事身份则创建(已存在则跳过)。"""
if UserGuanshi.objects.filter(user=user_main).exists():
return UserGuanshi.objects.get(user=user_main)
from utils.yaoqingma_utils import chuangjianYaoqingma
return UserGuanshi.objects.create(
user=user_main,
yaoqingma=chuangjianYaoqingma(str(user_main.yonghuid)),
)