# inventory-backend/app/api/v1/common/users.py from flask import jsonify from flask_jwt_extended import jwt_required from . import common_bp def active_user_options(): """ 在职人员名单(id + 姓名 + 账号)——「选择某人」类下拉框的**共用实现**。 ★ 为什么单独开一条中性路径,而不是复用 /transactions/borrow/users: 那条路径在语义上属于借库模块,出库补发、报废执行等处若直接复用, 后人读代码时会困惑「出库为什么在调借库的接口」。这里提供统一入口, 借库那条路径改为调本函数,实现只有一份。 ★ 公司隔离与业务台账同口径(get_current_company_filter): 否则 A 公司的人能在选择器里看到 B 公司人员。 ★ 只返回 id / 姓名 / 账号:不含邮箱、角色、部门 —— 仍是最小披露。 账号(username 里 '/' 之后那一段,如 'gaoxue')是**拼音**, 选择器靠它支持「输拼音找人」(输 gaoxue 匹配到高雪)—— 这是加它的唯一原因,不是要把登录名铺开。 ★ 姓名口径用 user_display_name('高雪/gaoxue' → '高雪'), 与出库/借库台账里存姓名的写法一致;否则同一人在台账里会出现两种写法。 """ from app.utils.decorators import get_current_company_filter from app.models.system import SysUser from app.services.trans_service import user_display_name company_limit = get_current_company_filter() query = SysUser.query.filter(SysUser.status == 'active') if company_limit is not None: # 与 borrow_service.get_request_list 一致:SysUser.department 即公司维度 query = query.filter(SysUser.department == company_limit) out = [] for u in query.order_by(SysUser.username).all(): raw = str(u.username or '') out.append({ 'id': u.id, 'name': user_display_name(u), 'account': raw.split('/')[-1] if '/' in raw else '', }) return out @common_bp.route('/active-users', methods=['GET']) @jwt_required() def get_active_users(): """ 在职人员名单,供借出 / 转交 / 归还 / 出库补发等多个页面的选择器共用。 ★ 无 permission_required,仅要求登录: 同一份名单要被多个页面共用,绑定其中任一权限码都会让其他页面 403; 且只暴露 id 与姓名(与 /auth/users/approvers 同一处理方式)。 """ return jsonify({'code': 200, 'msg': 'success', 'data': active_user_options()})