feat(pl): wire stockRole into plan list, export, and facets

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
wuzilongandCursor committed 2026-10-14 23:29:00 +08:00
1 parent 63f19d2672
commit c4ee338c3a
1 file changed
+41 -3
+41 -3
View File
@@ -75,6 +75,7 @@ from app.schemas.pl.plan import (
)
from app.services.pl.plan_column_facet_context import strip_plan_facet_self_params
from app.services.pl_plan_contract_gap import (
apply_contract_gap_keyword_filter,
apply_contract_gap_type_filter,
list_plan_contract_gaps,
plan_has_contract_gap_exists,
@@ -132,6 +133,7 @@ from app.services.pl_plan_stop_service import (
)
from app.services.pl_customer_stop_pref_service import safe_upsert_prefs_from_plan_stops
from app.services.pl.plan_list_filters import (
apply_stock_role_filter,
build_plan_column_filters,
parse_single_stop_kind,
parse_stop_customer_keywords,
@@ -532,13 +534,18 @@ def _build_plan_facet_base_query(
PlPlan.tenant_no == tenant_no,
PlPlan.del_flag == 0,
)
contract_gap_only = _truthy_param(
_param_get(params, "contractGapOnly", "contract_gap_only")
)
q_kw = (_param_get(params, "q") or "")
if isinstance(q_kw, str):
q_kw = q_kw.strip()
else:
q_kw = str(q_kw).strip() if q_kw else ""
if q_kw:
if contract_gap_only:
query = apply_contract_gap_keyword_filter(query, tenant_no, q_kw)
elif q_kw:
q_lower = q_kw.lower()
query = query.filter(
or_(
@@ -562,7 +569,7 @@ def _build_plan_facet_base_query(
if _truthy_param(has_hazard):
query = query.filter(plan_has_hazard_product_exists(tenant_no))
if _truthy_param(_param_get(params, "contractGapOnly", "contract_gap_only")):
if contract_gap_only:
query = query.filter(
PlPlan.follow_status != "cancelled",
plan_has_contract_gap_exists(tenant_no),
@@ -573,7 +580,11 @@ def _build_plan_facet_base_query(
query = apply_contract_gap_type_filter(query, tenant_no, str(gap_type))
customer_keyword = _param_get(params, "customerKeyword", "customer_keyword")
if customer_keyword and str(customer_keyword).strip():
if contract_gap_only:
query = apply_contract_gap_keyword_filter(
query, tenant_no, str(customer_keyword or ""), include_plan_no=False
)
elif customer_keyword and str(customer_keyword).strip():
kw = str(customer_keyword).strip()
kw_lower = kw.lower()
query = query.filter(
@@ -587,6 +598,14 @@ def _build_plan_facet_base_query(
if column_filters:
query = query.filter(*column_filters)
stock_role = _param_get(params, "stockRole", "stock_role")
try:
query = apply_stock_role_filter(
query, stock_role=stock_role, tenant_no=tenant_no
)
except ValueError as exc:
raise HTTPException(status_code=400, detail=str(exc)) from exc
query = apply_pl_scope(query, PlPlan, user, db, tenant_no)
return query
@@ -795,6 +814,11 @@ def list_plans(
alias="includeArrangeCopyFlags",
description="1=计算复制给司机/现场/磅单标志(运输计划列表需要;默认关闭)",
),
stock_role: Optional[str] = Query(
default=None,
alias="stockRole",
description="inbound=送货段山峡/云栋;outbound=装货段山峡/云栋",
),
page: int = Query(default=1, ge=1),
page_size: int = Query(default=20, ge=1, le=500, alias="pageSize"),
db: Session = Depends(get_db),
@@ -858,6 +882,13 @@ def list_plans(
if column_filters:
query = query.filter(*column_filters)
try:
query = apply_stock_role_filter(
query, stock_role=stock_role, tenant_no=tenant_no
)
except ValueError as exc:
raise HTTPException(status_code=400, detail=str(exc)) from exc
query = apply_pl_scope(query, PlPlan, user, db, tenant_no)
# 统计总数
@@ -1167,6 +1198,7 @@ class PlanExportBody(BaseModel):
has_hazard_product: Optional[int] = Field(default=None, alias="hasHazardProduct")
cert_upload_status: Optional[str] = Field(default=None, alias="certUploadStatus")
hazard_cert_ready: Optional[int] = Field(default=None, alias="hazardCertReady")
stock_role: Optional[str] = Field(default=None, alias="stockRole")
ids: Optional[List[str]] = None
columns: Optional[List[str]] = None
export_format: Optional[str] = Field(
@@ -1214,6 +1246,12 @@ def export_plans(
)
if column_filters:
query = query.filter(*column_filters)
try:
query = apply_stock_role_filter(
query, stock_role=body.stock_role, tenant_no=tenant_no
)
except ValueError as exc:
raise HTTPException(status_code=400, detail=str(exc)) from exc
if body.ids:
query = query.filter(PlPlan.id.in_(body.ids))
query = apply_pl_scope(query, PlPlan, user, db, tenant_no)