kboss/b/user/get_user_and_role.dspy
2026-07-22 10:18:48 +08:00

91 lines
3.5 KiB
Plaintext

def _parse_page(ns, default_page=1, default_size=20, max_size=200):
try:
current_page = int(ns.get('current_page') or ns.get('page') or default_page)
except (TypeError, ValueError):
current_page = default_page
try:
page_size = int(ns.get('page_size') or default_size)
except (TypeError, ValueError):
page_size = default_size
current_page = max(1, current_page)
page_size = max(1, min(page_size, max_size))
return current_page, page_size, (current_page - 1) * page_size
async def get_user_and_role(ns={}):
"""获取机构下所有用户及用户对应的所有角色"""
orgid = ns.get('orgid')
if not orgid:
return {'status': False, 'msg': '缺少 orgid'}
current_page, page_size, offset = _parse_page(ns)
db = DBPools()
async with db.sqlorContext('kboss') as sor:
try:
where_sql = """
u.del_flg='0'
AND (
u.orgid=${orgid}$
OR o.parentid=${orgid}$
)
"""
if ns.get('username'):
where_sql += " AND u.username LIKE '%%%%%s%%%%'" % ns.get('username')
if ns.get('mobile'):
where_sql += " AND u.mobile LIKE '%%%%%s%%%%'" % ns.get('mobile')
count_rows = await sor.sqlExe(
"""
SELECT COUNT(*) AS total_count
FROM users u
LEFT JOIN organization o ON u.orgid = o.id AND o.del_flg='0'
WHERE %s
""" % where_sql,
{'orgid': orgid},
)
total_count = count_rows[0]['total_count'] if count_rows else 0
sql = """
SELECT u.*
FROM users u
LEFT JOIN organization o ON u.orgid = o.id AND o.del_flg='0'
LEFT JOIN (
SELECT userid, MAX(create_at) AS userrole_create_at
FROM userrole
WHERE del_flg='0'
GROUP BY userid
) ur_sort ON u.id = ur_sort.userid
WHERE %s
ORDER BY ur_sort.userrole_create_at DESC, u.create_at DESC
LIMIT %d OFFSET %d
""" % (where_sql, page_size, offset)
users = await sor.sqlExe(sql, {'orgid': orgid})
for user in users:
user['roles'] = []
userroles = await sor.R('userrole', {'userid': user['id']})
userroles = sorted(userroles, key=lambda item: item.get('create_at') or '', reverse=True)
for userrole in userroles:
if userrole.get('del_flg') == '1' or not userrole.get('roleid'):
continue
roles = await sor.R('role', {'id': userrole['roleid']})
if len(roles) >= 1 and roles[0].get('del_flg') != '1':
user['roles'].append({
'id': roles[0].get('id'),
'name': roles[0].get('role'),
})
return {
'status': True,
'msg': 'ok',
'data': {
'total_count': total_count,
'current_page': current_page,
'page_size': page_size,
'rows': users,
},
}
except Exception as e:
return {'status': False, 'msg': '获取用户角色失败, %s' % str(e)}
ret = await get_user_and_role(params_kw)
return ret