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