263 lines
12 KiB
Plaintext
263 lines
12 KiB
Plaintext
async def sync_cn_ai_user(userid=None, orgid=None, username=None, name=None, email=None):
|
||
import aiohttp
|
||
# 目标URL
|
||
url = "https://ai.atvoe.com/rbac/usersync"
|
||
# url = 'https://ai.atvoe.com/tmp/env.dspy'
|
||
|
||
# 请求头
|
||
headers = {
|
||
"Content-Type": "application/json",
|
||
"Authorization": "Bearer " + "2i68AZ81di_q5f8AySDrJ"
|
||
}
|
||
|
||
# 请求体数据
|
||
payload = {
|
||
"action": "single",
|
||
"dappid": "cndemo",
|
||
"user": {
|
||
"id": userid,
|
||
"orgid": orgid,
|
||
"username": username,
|
||
"name": name,
|
||
"email": email
|
||
}
|
||
}
|
||
|
||
try:
|
||
# 创建一个异步会话
|
||
result_sysnc = None
|
||
async with aiohttp.ClientSession() as session:
|
||
# 发送POST请求
|
||
async with session.post(url, headers=headers, data=json.dumps(payload)) as response:
|
||
# 打印响应状态码
|
||
print(f"状态码: {response.status}")
|
||
result_sysnc = await response.json()
|
||
|
||
if not result_sysnc.get('status') == 'success':
|
||
print(f"同步用户失败")
|
||
return {
|
||
'status': False
|
||
}
|
||
|
||
db = DBPools()
|
||
async with db.sqlorContext('kboss') as sor:
|
||
# user_api_keys表格 userid/opc_apikey
|
||
# 首先判断apikey是否存在
|
||
apikey = result_sysnc['data'][0].get('apikey')
|
||
records = await sor.R('user_api_keys', {'opc_apikey': apikey})
|
||
if records:
|
||
print(f"用户{payload['user']['id']}已存在")
|
||
return {
|
||
'status': False,
|
||
'msg': '用户opc_apikey已存在'
|
||
}
|
||
await sor.C('user_api_keys', {
|
||
'userid': userid,
|
||
'opc_apikey': apikey,
|
||
'expire_time': None,
|
||
})
|
||
|
||
return {
|
||
'status': True,
|
||
'msg': '用户同步成功'
|
||
}
|
||
|
||
except Exception as e:
|
||
print(f"同步用户失败: {e}")
|
||
return {
|
||
'status': False,
|
||
'msg': f"同步用户失败: {e}"
|
||
}
|
||
|
||
|
||
async def registerUser(ns):
|
||
"""
|
||
用户注册
|
||
"""
|
||
import re
|
||
db = DBPools()
|
||
async with db.sqlorContext('kboss') as sor:
|
||
if ns:
|
||
if ns.get('username'):
|
||
userns = {'username': ns['username']}
|
||
isuser = await sor.R('users', userns)
|
||
if len(isuser) >= 1:
|
||
return {'status': False, 'msg': '用户名已注册'}
|
||
|
||
if ns.get('email'):
|
||
useremai = {'email': ns['email']}
|
||
isuser = await sor.R('users', useremai)
|
||
if len(isuser) >= 1:
|
||
return {'status': False, 'msg': '该邮箱已注册'}
|
||
|
||
usermobile = {'mobile':ns['mobile']}
|
||
isuser = await sor.R('users', usermobile)
|
||
if len(isuser) >= 1:
|
||
return {'status': False, 'msg': '该手机号已注册'}
|
||
# 用户名没有 则用手机号作为用户名
|
||
if not ns.get('username'):
|
||
ns['username'] = ns['mobile']
|
||
|
||
if ns.get('password'):
|
||
# 至少8位,包含大小写字母、特殊字符、数字
|
||
if len(ns.get('password')) < 8 or not re.search(r'[a-zA-Z]', ns.get('password')) or not re.search(r'[0-9]', ns.get('password')) or not re.search(r'[!@#$%^&*()_+{}|:"<>?]', ns.get('password')):
|
||
return {'status': False, 'msg': '密码至少8位,包含大小写字母、特殊字符、数字'}
|
||
|
||
if not ns.get('codeid'):
|
||
return {'status': False, 'msg': '验证码ID不能为空'}
|
||
|
||
if ns.get('codeid'):
|
||
code = await sor.R('validatecode', {'id': ns.get('codeid'), 'vcode': ns.get('vcode')})
|
||
# 验证码五分钟内才有效 create_at是字符串 格式是"2025-11-05 16:00:19"
|
||
if code:
|
||
create_at = code[0]['create_at']
|
||
now = datetime.datetime.now()
|
||
create_at_dt = datetime.datetime.strptime(create_at, "%Y-%m-%d %H:%M:%S")
|
||
if (now - create_at_dt).seconds > 500:
|
||
return {'status': False, 'msg': '验证码过期'}
|
||
|
||
else:
|
||
return {'status': False, 'msg': '验证码不正确'}
|
||
|
||
#通过邀请码注册
|
||
if ns.get('invitecode'):
|
||
invitecodens = {}
|
||
invitecodens['invitecode'] = ns['invitecode']
|
||
reacss = await sor.R('invitecode', invitecodens)
|
||
if len(reacss) >= 1:
|
||
date = await get_business_date(sor=None)
|
||
if reacss[0]['expire_date'] < date:
|
||
return {'status': False, 'msg': '邀请码过期'}
|
||
try:
|
||
ns['id'] = uuid()
|
||
# ns['id'] = UUID()
|
||
orgid = ns['id']
|
||
ns['contactor_phone'] = ns.get('mobile')
|
||
usercode = await sor.R('users', {'id': reacss[0]['iusserid'], 'del_flg': '0'})
|
||
# 通过域名注册
|
||
if ns.get('domain_name'):
|
||
reseller = await sor.R('reseller', {'domain_name': ns.get('domain_name')})
|
||
if len(reseller) >= 1:
|
||
org = await sor.R('organization', {'id': reseller[0]['orgid'], 'del_flg': '0'})
|
||
ns['parentid'] = org[0]['id']
|
||
else:
|
||
ns['parentid'] = usercode[0]['orgid']
|
||
else:
|
||
ns['parentid'] = usercode[0]['orgid']
|
||
await sor.C('organization', ns)
|
||
ns['id'] = uuid()
|
||
# ns['id'] = UUID()
|
||
userid = ns['id']
|
||
ns['orgid'] = orgid
|
||
ns['password'] = password_encode(ns['password'])
|
||
await sor.C('users', ns)
|
||
listrole = ['管理员', '客户']
|
||
for i in listrole:
|
||
role = await sor.R('role', {'role': i, 'org_type': ns['org_type']})
|
||
await sor.C('userrole', {'id': uuid(), 'userid': userid, 'roleid': role[0]['id']})
|
||
ns['invite_code'] = ns['invitecode']
|
||
ns['customerid'] = orgid
|
||
ns['id'] = uuid()
|
||
# ns['id'] = UUID()
|
||
ns['salemanid'] = reacss[0]['iusserid']
|
||
await sor.C('customer', ns)
|
||
promoted_cutomerns = {}
|
||
promoted_cutomerns['id'] = uuid()
|
||
# promoted_cutomerns['id'] = UUID()
|
||
promoted_cutomerns['inviteid'] = reacss[0]['id']
|
||
promoted_cutomerns['customer'] = orgid
|
||
promoted_cutomerns['join_date'] = datetime.datetime.now()
|
||
await sor.C('promoted_cutomer', promoted_cutomerns)
|
||
promote_discount = await sor.R('promote_discount', {'promotingid': reacss[0]['promotingid']})
|
||
iusseriduser = await sor.R('users', {'id': reacss[0]['iusserid']})
|
||
dictns = {}
|
||
dictns['id'] = uuid()
|
||
dictns['offer_orgid'] = iusseriduser[0]['orgid']
|
||
dictns['bid_orgid'] = orgid
|
||
dictns['salemode'] = '0'
|
||
dictns['start_date'] = datetime.datetime.now()
|
||
dictns['end_date'] = '9999-12-31'
|
||
await sor.C('saleprotocol', dictns)
|
||
for i in promote_discount:
|
||
products = await sor.R('product', {'id': i['productid']})
|
||
product_salemode = {}
|
||
product_salemode['id'] = uuid()
|
||
product_salemode['protocolid'] = dictns['id']
|
||
product_salemode['providerid'] = products[0]['providerid']
|
||
product_salemode['productid'] = i['productid']
|
||
product_salemode['discount'] = i['discount']
|
||
await sor.C('product_salemode', product_salemode)
|
||
await openCustomerAccounts(sor, usercode[0]['orgid'], orgid)
|
||
return {'status': True, 'msg': '邀请码注册成功'}
|
||
except Exception as error:
|
||
raise error
|
||
else:
|
||
return {'status': False, 'msg': '邀请码不正确'}
|
||
else:
|
||
try:
|
||
# 用户orgid
|
||
ns['id'] = uuid()
|
||
org_id = ns['id']
|
||
ns['contactor_phone'] = ns.get('mobile')
|
||
# 通过域名注册
|
||
if ns.get('domain_name'):
|
||
# 通过域名查找分销商信息
|
||
reseller = await sor.R('reseller', {'domain_name': ns.get('domain_name')})
|
||
if len(reseller) >= 1:
|
||
# 分销商机构ID 即orgid
|
||
org = await sor.R('organization', {'id': reseller[0]['orgid'], 'del_flg': '0'})
|
||
else:
|
||
# 分销商不存在 则查找业主机构ID
|
||
org = await sor.R('organization', {'org_type': '0', 'del_flg': '0'})
|
||
else:
|
||
# 没有通过域名 则默认是获取业主机构ID
|
||
org = await sor.R('organization', {'org_type': '0', 'del_flg': '0'})
|
||
|
||
# 获取所在机构父级ID
|
||
ns['parentid'] = org[0]['id']
|
||
|
||
# 新增用户机构信息
|
||
ns_org = {
|
||
'id': ns['id'],
|
||
'orgname': ns['username'],
|
||
'parentid': ns['parentid'],
|
||
'org_type': ns['org_type'],
|
||
'contactor_phone': ns.get('mobile'),
|
||
}
|
||
await sor.C('organization', ns_org)
|
||
|
||
# 生成用户userid
|
||
ns['id'] = uuid()
|
||
userid = ns['id']
|
||
|
||
# 加密用户密码
|
||
if ns.get('password'):
|
||
ns['password'] = password_encode(ns['password'])
|
||
ns['orgid'] = org_id
|
||
|
||
# 新增用户信息
|
||
await sor.C('users', ns)
|
||
|
||
# 新增用户角色信息
|
||
listrole = ['管理员', '客户']
|
||
for i in listrole:
|
||
role = await sor.R('role', {'role': i, 'org_type': ns['org_type']})
|
||
await sor.C('userrole', {'id': uuid(), 'userid': userid, 'roleid': role[0]['id']})
|
||
|
||
# 新增客户信息并使用openCustomerAccounts为客户开账
|
||
ns['id'] = uuid()
|
||
ns['customerid'] = org_id
|
||
await sor.C('customer', ns)
|
||
await openCustomerAccounts(sor, org[0]['id'], org_id)
|
||
|
||
# 同步用户
|
||
await sync_cn_ai_user(userid=userid, orgid=ns_org['id'], username=ns['username'], name=ns['username'])
|
||
|
||
return {'status': True, 'msg': '注册成功'}
|
||
except Exception as error:
|
||
# raise error
|
||
return {'status': False, 'msg': '注册失败, %s' % str(error)}
|
||
|
||
|
||
ret = await registerUser(params_kw)
|
||
return ret |