pl_product_display.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. """运输计划产品展示:标准名 / 别名拆分(与前端 applyAliasDisplayMeta 对齐)"""
  2. from __future__ import annotations
  3. from typing import Optional
  4. from sqlalchemy.orm import Session
  5. from app.models.crm_models import CrmProduct, CrmProductAlias
  6. def resolve_alias_from_saved_name(
  7. saved_product_name: Optional[str],
  8. standard_name: Optional[str],
  9. alias_options: list[str] | None,
  10. ) -> Optional[str]:
  11. """从已存 productName 反推别名;等于标准名或不在别名列表 → None。"""
  12. saved = (saved_product_name or "").strip()
  13. standard = (standard_name or "").strip()
  14. if not saved or saved == standard:
  15. return None
  16. if saved in (alias_options or []):
  17. return saved
  18. return None
  19. def load_crm_product_alias_maps(
  20. db: Session,
  21. *,
  22. tenant_no: str,
  23. product_ids: set[str] | list[str],
  24. ) -> tuple[dict[str, str], dict[str, list[str]]]:
  25. """批量加载 CRM 标准名与别名选项。返回 (standard_name_by_id, alias_options_by_id)。"""
  26. ids = [pid for pid in product_ids if (pid or "").strip()]
  27. if not ids:
  28. return {}, {}
  29. standard_by_id: dict[str, str] = {}
  30. rows = (
  31. db.query(CrmProduct.id, CrmProduct.product_name)
  32. .filter(
  33. CrmProduct.id.in_(ids),
  34. CrmProduct.tenant_no == tenant_no,
  35. CrmProduct.del_flag == 0,
  36. )
  37. .all()
  38. )
  39. for row in rows:
  40. name = (row.product_name or "").strip()
  41. if name:
  42. standard_by_id[row.id] = name
  43. alias_options_by_id: dict[str, list[str]] = {}
  44. alias_rows = (
  45. db.query(CrmProductAlias)
  46. .filter(
  47. CrmProductAlias.product_id.in_(ids),
  48. CrmProductAlias.tenant_no == tenant_no,
  49. CrmProductAlias.del_flag == 0,
  50. )
  51. .order_by(CrmProductAlias.order_num.asc(), CrmProductAlias.create_time.asc())
  52. .all()
  53. )
  54. for row in alias_rows:
  55. name = (row.alias_name or "").strip()
  56. if not name:
  57. continue
  58. bucket = alias_options_by_id.setdefault(row.product_id, [])
  59. if name not in bucket:
  60. bucket.append(name)
  61. return standard_by_id, alias_options_by_id
  62. def resolve_product_display_names(
  63. *,
  64. saved_product_name: Optional[str],
  65. product_id: Optional[str],
  66. standard_by_id: dict[str, str],
  67. alias_options_by_id: dict[str, list[str]],
  68. ) -> tuple[str, Optional[str]]:
  69. """
  70. 返回 (展示用产品名称, 别名)。
  71. 产品名称优先 CRM 标准名;别名仅在已存名命中别名列表时返回。
  72. """
  73. saved = (saved_product_name or "").strip()
  74. pid = (product_id or "").strip()
  75. standard = (standard_by_id.get(pid) or "").strip()
  76. alias_options = alias_options_by_id.get(pid) or []
  77. alias = resolve_alias_from_saved_name(saved, standard or None, alias_options)
  78. display_name = standard or saved
  79. return display_name, alias
  80. def apply_product_alias_display(
  81. item: dict,
  82. *,
  83. product_id: Optional[str],
  84. standard_by_id: dict[str, str],
  85. alias_options_by_id: dict[str, list[str]],
  86. saved_name_key: str = "productName",
  87. ) -> None:
  88. """就地写入 item 的 productName(标准名)与 aliasName。"""
  89. saved = item.get(saved_name_key) or item.get("product_name")
  90. display_name, alias = resolve_product_display_names(
  91. saved_product_name=saved,
  92. product_id=product_id,
  93. standard_by_id=standard_by_id,
  94. alias_options_by_id=alias_options_by_id,
  95. )
  96. item["productName"] = display_name
  97. item["aliasName"] = alias