91 lines
3.5 KiB
Plaintext
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
|