feat: 全模块公司隔离 + crossDomain权限码动态跨域控制
- get_current_company_filter: 新增_has_cross_domain_permission, 权限码替代硬编码 - 补全11个Service的get_current_company_filter调用(semi/product/service/outbound/bom/trans/scrap/summary) - base/search修复: search_material此前无隔离, 已补全 - get_current_company_filter兜底: JWT缺company_name时返回__NO_COMPANY__防止放行 - permission.py: _get_operator_company补全返回值, 修复权限页保存逻辑 - 新增crossDomain迁移脚本, element_type=element挂system_mgmt下
This commit is contained in:
@ -6,6 +6,7 @@ from app.models.inbound.buy import StockBuy
|
||||
from app.models.inbound.semi import StockSemi
|
||||
from app.models.inbound.product import StockProduct
|
||||
from app.models.base import MaterialBase
|
||||
from app.utils.decorators import get_current_company_filter
|
||||
from sqlalchemy import desc, func, nullslast, asc, or_, and_, case
|
||||
from sqlalchemy.orm import joinedload
|
||||
|
||||
@ -523,6 +524,35 @@ class TransService:
|
||||
.subquery()
|
||||
)
|
||||
|
||||
# ====================================================================
|
||||
# 【行级数据隔离】基于 JWT 多租户公司过滤
|
||||
# 通过 stock 表关联到 MaterialBase,确保只返回本公司借还记录
|
||||
# ====================================================================
|
||||
company_borrow_nos_subq = None
|
||||
company_limit = get_current_company_filter()
|
||||
if company_limit is not None:
|
||||
buy_nos = db.session.query(TransBorrow.borrow_no).join(
|
||||
StockBuy, and_(TransBorrow.stock_id == StockBuy.id,
|
||||
TransBorrow.source_table == 'stock_buy')
|
||||
).join(MaterialBase, StockBuy.base_id == MaterialBase.id).filter(
|
||||
MaterialBase.company_name == company_limit
|
||||
)
|
||||
semi_nos = db.session.query(TransBorrow.borrow_no).join(
|
||||
StockSemi, and_(TransBorrow.stock_id == StockSemi.id,
|
||||
TransBorrow.source_table == 'stock_semi')
|
||||
).join(MaterialBase, StockSemi.base_id == MaterialBase.id).filter(
|
||||
MaterialBase.company_name == company_limit
|
||||
)
|
||||
product_nos = db.session.query(TransBorrow.borrow_no).join(
|
||||
StockProduct, and_(TransBorrow.stock_id == StockProduct.id,
|
||||
TransBorrow.source_table == 'stock_product')
|
||||
).join(MaterialBase, StockProduct.base_id == MaterialBase.id).filter(
|
||||
MaterialBase.company_name == company_limit
|
||||
)
|
||||
company_borrow_nos_subq = buy_nos.union(
|
||||
semi_nos, product_nos
|
||||
).subquery()
|
||||
|
||||
# ====================================================================
|
||||
# 步骤 2:纯净列查询分页(SELECT 只有 order_subq.c.borrow_no 一列)
|
||||
# ====================================================================
|
||||
@ -534,6 +564,12 @@ class TransService:
|
||||
order_subq.c.borrow_no.in_(keyword_borrow_nos_subq)
|
||||
)
|
||||
|
||||
# 公司隔离过滤
|
||||
if company_borrow_nos_subq is not None:
|
||||
borrow_no_q = borrow_no_q.filter(
|
||||
order_subq.c.borrow_no.in_(company_borrow_nos_subq)
|
||||
)
|
||||
|
||||
# 状态过滤(按"单号聚合"判定)
|
||||
if status == 'borrowed':
|
||||
# 单号下至少一条未还
|
||||
|
||||
Reference in New Issue
Block a user