| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- """运输计划产品展示:标准名 / 别名拆分(与前端 applyAliasDisplayMeta 对齐)"""
- from __future__ import annotations
- from typing import Optional
- from sqlalchemy.orm import Session
- from app.models.crm_models import CrmProduct, CrmProductAlias
- def resolve_alias_from_saved_name(
- saved_product_name: Optional[str],
- standard_name: Optional[str],
- alias_options: list[str] | None,
- ) -> Optional[str]:
- """从已存 productName 反推别名;等于标准名或不在别名列表 → None。"""
- saved = (saved_product_name or "").strip()
- standard = (standard_name or "").strip()
- if not saved or saved == standard:
- return None
- if saved in (alias_options or []):
- return saved
- return None
- def load_crm_product_alias_maps(
- db: Session,
- *,
- tenant_no: str,
- product_ids: set[str] | list[str],
- ) -> tuple[dict[str, str], dict[str, list[str]]]:
- """批量加载 CRM 标准名与别名选项。返回 (standard_name_by_id, alias_options_by_id)。"""
- ids = [pid for pid in product_ids if (pid or "").strip()]
- if not ids:
- return {}, {}
- standard_by_id: dict[str, str] = {}
- rows = (
- db.query(CrmProduct.id, CrmProduct.product_name)
- .filter(
- CrmProduct.id.in_(ids),
- CrmProduct.tenant_no == tenant_no,
- CrmProduct.del_flag == 0,
- )
- .all()
- )
- for row in rows:
- name = (row.product_name or "").strip()
- if name:
- standard_by_id[row.id] = name
- alias_options_by_id: dict[str, list[str]] = {}
- alias_rows = (
- db.query(CrmProductAlias)
- .filter(
- CrmProductAlias.product_id.in_(ids),
- CrmProductAlias.tenant_no == tenant_no,
- CrmProductAlias.del_flag == 0,
- )
- .order_by(CrmProductAlias.order_num.asc(), CrmProductAlias.create_time.asc())
- .all()
- )
- for row in alias_rows:
- name = (row.alias_name or "").strip()
- if not name:
- continue
- bucket = alias_options_by_id.setdefault(row.product_id, [])
- if name not in bucket:
- bucket.append(name)
- return standard_by_id, alias_options_by_id
- def resolve_product_display_names(
- *,
- saved_product_name: Optional[str],
- product_id: Optional[str],
- standard_by_id: dict[str, str],
- alias_options_by_id: dict[str, list[str]],
- ) -> tuple[str, Optional[str]]:
- """
- 返回 (展示用产品名称, 别名)。
- 产品名称优先 CRM 标准名;别名仅在已存名命中别名列表时返回。
- """
- saved = (saved_product_name or "").strip()
- pid = (product_id or "").strip()
- standard = (standard_by_id.get(pid) or "").strip()
- alias_options = alias_options_by_id.get(pid) or []
- alias = resolve_alias_from_saved_name(saved, standard or None, alias_options)
- display_name = standard or saved
- return display_name, alias
- def apply_product_alias_display(
- item: dict,
- *,
- product_id: Optional[str],
- standard_by_id: dict[str, str],
- alias_options_by_id: dict[str, list[str]],
- saved_name_key: str = "productName",
- ) -> None:
- """就地写入 item 的 productName(标准名)与 aliasName。"""
- saved = item.get(saved_name_key) or item.get("product_name")
- display_name, alias = resolve_product_display_names(
- saved_product_name=saved,
- product_id=product_id,
- standard_by_id=standard_by_id,
- alias_options_by_id=alias_options_by_id,
- )
- item["productName"] = display_name
- item["aliasName"] = alias
|