Files
shanxia2.0/backend/app/services/pl_vehicle_mine_vehicles.py
T
zlwuandCursor 7a4ecc34e0 fix(api): commit mineVehicles helper required by recharge withdraw
withdraw commit imported should_restrict_mine_vehicles before the helper was on the branch.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-29 12:15:57 +08:00

76 lines
2.5 KiB
Python

"""当前用户关联驾押人员所挂靠车辆的车牌集合;充值申请管理员放宽。"""
from __future__ import annotations
from typing import Optional, Set
from sqlalchemy.orm import Session
from app.models.models import SysRole, SysUserRole
from app.models.pl_models import PlVehicle, PlVehiclePersonnel
from app.services.pl_driver_plan_service import resolve_personnel_for_user
# 小程序 mineVehicles 下可看/选本租户全部车牌的角色(精确匹配 role_name)
_PL_RECHARGE_ADMIN_ROLE_NAMES = frozenset({"管理员", "超级管理员"})
def user_is_pl_recharge_admin(db: Session, tenant_no: str, user_id: str) -> bool:
uid = (user_id or "").strip()
tenant = (tenant_no or "").strip()
if not uid or not tenant:
return False
row = (
db.query(SysRole.id)
.join(SysUserRole, SysUserRole.role_id == SysRole.id)
.filter(
SysUserRole.user_id == uid,
SysUserRole.tenant_no == tenant,
SysUserRole.del_flag == 0,
SysRole.tenant_no == tenant,
SysRole.del_flag == 0,
SysRole.status == "1",
SysRole.role_name.in_(_PL_RECHARGE_ADMIN_ROLE_NAMES),
)
.first()
)
return row is not None
def should_restrict_mine_vehicles(
db: Session, tenant_no: str, user_id: str, *, mine_vehicles: bool
) -> bool:
"""mineVehicles 请求是否仍按挂靠车牌限制(管理员为 False)。"""
if not mine_vehicles:
return False
return not user_is_pl_recharge_admin(db, tenant_no, user_id)
def license_plates_for_user_personnel(
db: Session, tenant_no: str, user_id: str
) -> Set[str]:
personnel = resolve_personnel_for_user(db, tenant_no=tenant_no, user_id=user_id)
if not personnel:
return set()
rows = (
db.query(PlVehicle.license_plate)
.join(
PlVehiclePersonnel,
PlVehiclePersonnel.vehicle_id == PlVehicle.id,
)
.filter(
PlVehiclePersonnel.personnel_id == personnel.id,
PlVehiclePersonnel.tenant_no == tenant_no,
PlVehiclePersonnel.del_flag == 0,
PlVehicle.tenant_no == tenant_no,
PlVehicle.del_flag == 0,
)
.all()
)
return {str(r[0]).strip() for r in rows if r and r[0] and str(r[0]).strip()}
def resolve_personnel_id_for_user(
db: Session, tenant_no: str, user_id: str
) -> Optional[str]:
p = resolve_personnel_for_user(db, tenant_no=tenant_no, user_id=user_id)
return p.id if p else None