修复任职停用;星之界种子邀请链 seed_xzj_invite_data

This commit is contained in:
XingQue
2026-06-24 23:33:25 +08:00
parent 49482830f9
commit d56c85bca9
6 changed files with 349 additions and 20 deletions

View File

@@ -0,0 +1,75 @@
"""清理重复任职 + 可选为星之界创建组长邀请链。"""
import time
from django.core.management.base import BaseCommand, CommandError
from django.db import transaction
from jituan.constants import CLUB_ID_DEFAULT
from jituan.models import Club, ClubHuiyuanPrice
from jituan.services.admin_assignments import dedupe_active_assignments
from jituan.services.club_user import ensure_user_club_id
from users.business_models import User
from users.models import UserGuanshi, UserZuzhang
class Command(BaseCommand):
help = '清理重复 admin_assignment可选为 xzj 用户创建组长并输出邀请码'
def add_arguments(self, parser):
parser.add_argument('--dedupe-only', action='store_true', help='只清理重复有效任职')
parser.add_argument('--club-id', default='xzj', help='目标俱乐部')
parser.add_argument('--phone', type=str, default='', help='用户手机号(须已微信登录过)')
parser.add_argument('--make-zuzhang', action='store_true', help='将该用户设为 xzj 组长并生成邀请码')
def handle(self, *args, **options):
removed = dedupe_active_assignments()
self.stdout.write(self.style.SUCCESS(f'已停用重复任职 {removed}'))
if options.get('dedupe_only'):
return
club_id = (options.get('club_id') or 'xzj').strip()
if not Club.query.filter(club_id=club_id).exists():
raise CommandError(f'俱乐部 {club_id} 不存在')
price_cnt = ClubHuiyuanPrice.query.filter(club_id=club_id).count()
self.stdout.write(f'club_huiyuan_price({club_id}) 共 {price_cnt} 条(创建俱乐部时从 xq 复制,价相同需后台单独改)')
phone = (options.get('phone') or '').strip()
if options.get('make_zuzhang'):
if not phone:
raise CommandError('请指定 --phone')
user = User.query.filter(Phone=phone).first()
if not user:
raise CommandError(f'未找到手机号 {phone},请先在星之界小程序登录一次')
ensure_user_club_id(user, club_id)
user.ClubID = club_id
user.save(update_fields=['ClubID'])
if hasattr(user, 'ZuzhangProfile'):
z = user.ZuzhangProfile
self.stdout.write(self.style.SUCCESS(
f'已是组长,邀请码: {z.yaoqingma}(管事注册用组长码)'
))
return
yaoqingma = f'ZZ{int(time.time())}{str(user.UserUID)[-4:]}'
with transaction.atomic():
UserZuzhang.query.create(
user=user,
yaoqingma=yaoqingma,
zhuangtai=1,
)
self.stdout.write(self.style.SUCCESS(
f'已创建 xzj 组长 UserUID={user.UserUID},组长邀请码: {yaoqingma}\n'
f'管事注册: 小程序内 guanshizhuceinviteCode={yaoqingma}'
))
else:
self.stdout.write(
'查邀请码 SQL表名 User 大写):\n'
f"SELECT u.UserUID,u.Phone,z.yaoqingma FROM `User` u "
f"JOIN user_zuzhang z ON z.UserUUID=u.UserUUID WHERE u.ClubID='{club_id}';\n"
f"SELECT u.UserUID,u.Phone,g.yaoqingma FROM `User` u "
f"JOIN user_guanshi g ON g.UserUUID=u.UserUUID WHERE u.ClubID='{club_id}';\n"
'创建组长: python manage.py bootstrap_xzj_invite --phone 手机号 --make-zuzhang'
)

View File

@@ -0,0 +1,133 @@
"""星之界(xzj)邀请链种子数据:自动插入组长+管事(含邀请码),无需先登录小程序。"""
from django.core.management import call_command
from django.core.management.base import BaseCommand
from django.db import transaction
from jituan.models import Club, ClubHuiyuanPrice
from users.business_models import User
from users.models import UserBoss, UserGuanshi, UserZuzhang
from utils.invitationcode_utils import CreateInvitationCode
CLUB_ID = 'xzj'
WX_APPID = 'wxdefa454152e78a03'
# 固定种子账号(可重复执行,幂等)
SEED_ZUZHANG = {
'UserUID': '9900001',
'OpenID': 'xzj_seed_openid_zuzhang_v1',
'Phone': '19900000001',
'UserName': 'xzj_seed_zuzhang',
'nickname': '星之界种子组长',
}
SEED_GUANSHI = {
'UserUID': '9900002',
'OpenID': 'xzj_seed_openid_guanshi_v1',
'Phone': '19900000002',
'UserName': 'xzj_seed_guanshi',
'nickname': '星之界种子管事',
}
def _ensure_club():
if Club.query.filter(club_id=CLUB_ID).exists():
return
call_command(
'create_club',
CLUB_ID,
name='星之界电竞',
wx_appid=WX_APPID,
)
def _ensure_user(meta):
user = User.query.filter(UserUID=meta['UserUID']).first()
if not user:
user = User.query.filter(OpenID=meta['OpenID']).first()
if user:
if user.ClubID != CLUB_ID:
user.ClubID = CLUB_ID
user.save(update_fields=['ClubID'])
return user, False
user = User.query.create(
UserUID=meta['UserUID'],
UserName=meta['UserName'],
OpenID=meta['OpenID'],
Phone=meta['Phone'],
ClubID=CLUB_ID,
)
UserBoss.query.create(user=user, nickname=meta['nickname'])
return user, True
def _ensure_zuzhang(user):
if hasattr(user, 'ZuzhangProfile'):
return user.ZuzhangProfile, False
yaoqingma = CreateInvitationCode(str(user.UserUID))
z = UserZuzhang.query.create(
user=user,
yaoqingma=yaoqingma,
zhuangtai=1,
)
return z, True
def _ensure_guanshi(user, zuzhang_uid):
if hasattr(user, 'GuanshiProfile'):
return user.GuanshiProfile, False
yaoqingma = CreateInvitationCode(str(user.UserUID))
g = UserGuanshi.query.create(
user=user,
yaoqingma=yaoqingma,
yaoqingren=zuzhang_uid,
zhuangtai=1,
)
return g, True
class Command(BaseCommand):
help = '插入星之界种子组长+管事(含邀请码),一条命令即可邀请注册'
def add_arguments(self, parser):
parser.add_argument(
'--force-new-codes',
action='store_true',
help='已存在时重新生成邀请码(慎用)',
)
def handle(self, *args, **options):
with transaction.atomic():
_ensure_club()
zz_user, zz_new = _ensure_user(SEED_ZUZHANG)
zz_profile, zz_profile_new = _ensure_zuzhang(zz_user)
if options.get('force_new_codes') and not zz_profile_new:
zz_profile.yaoqingma = CreateInvitationCode(str(zz_user.UserUID))
zz_profile.save(update_fields=['yaoqingma'])
gs_user, gs_new = _ensure_user(SEED_GUANSHI)
gs_profile, gs_profile_new = _ensure_guanshi(gs_user, zz_user.UserUID)
if options.get('force_new_codes') and not gs_profile_new:
gs_profile.yaoqingma = CreateInvitationCode(str(gs_user.UserUID))
gs_profile.save(update_fields=['yaoqingma'])
price_cnt = ClubHuiyuanPrice.query.filter(club_id=CLUB_ID).count()
self.stdout.write(self.style.SUCCESS('=' * 60))
self.stdout.write(self.style.SUCCESS('星之界 xzj 邀请链种子数据已就绪'))
self.stdout.write(self.style.SUCCESS('=' * 60))
self.stdout.write(f'club_huiyuan_price 条数: {price_cnt}(与星阙相同则需后台 xzj 视图下单独改价)')
self.stdout.write('')
self.stdout.write('【组长】管事注册用这个邀请码guanshizhuce / zuzhangyqmzc:')
self.stdout.write(f' UserUID={zz_user.UserUID} Phone={SEED_ZUZHANG["Phone"]}')
self.stdout.write(f' 组长邀请码 inviteCode = {zz_profile.yaoqingma}')
self.stdout.write('')
self.stdout.write('【管事】打手注册用这个邀请码dashouzhuce:')
self.stdout.write(f' UserUID={gs_user.UserUID} Phone={SEED_GUANSHI["Phone"]}')
self.stdout.write(f' 管事邀请码 inviteCode = {gs_profile.yaoqingma}')
self.stdout.write('')
self.stdout.write('新建: 组长=%s 管事=%s' % (
'' if zz_new or zz_profile_new else '否(已存在)',
'' if gs_new or gs_profile_new else '否(已存在)',
))
self.stdout.write(self.style.SUCCESS('=' * 60))