pl_site_link_read.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. """运输计划现场链接读模型"""
  2. from __future__ import annotations
  3. import json
  4. from sqlalchemy.orm import Session
  5. from app.models.pl_models import PlTransportSiteLink
  6. from app.schemas.pl.transport import TransportSiteLinkRead
  7. from app.services.db_inventory_site_token import build_site_transport_url
  8. def build_transport_site_link_read(
  9. db: Session,
  10. *,
  11. plan_product_id: str,
  12. product_name: str,
  13. site_link_id: str,
  14. plan_no: str,
  15. business_type: str,
  16. site_access_token: str | None = None,
  17. ) -> TransportSiteLinkRead:
  18. token = (site_access_token or "").strip()
  19. if not token and site_link_id:
  20. row = (
  21. db.query(PlTransportSiteLink)
  22. .filter(
  23. PlTransportSiteLink.id == site_link_id,
  24. PlTransportSiteLink.del_flag == 0,
  25. )
  26. .first()
  27. )
  28. if row:
  29. token = (row.site_access_token or "").strip()
  30. site_url = build_site_transport_url(token) if token else None
  31. return TransportSiteLinkRead(
  32. plan_product_id=plan_product_id,
  33. product_name=product_name,
  34. site_link_id=site_link_id,
  35. plan_no=plan_no,
  36. business_type=business_type,
  37. site_access_token=token or None,
  38. site_url=site_url,
  39. )
  40. def build_transport_site_link_read_from_row(row: PlTransportSiteLink, product_name: str = "") -> TransportSiteLinkRead:
  41. token = (row.site_access_token or "").strip()
  42. return TransportSiteLinkRead(
  43. plan_product_id=row.plan_product_id,
  44. product_name=product_name or row.product or "",
  45. site_link_id=row.id,
  46. plan_no=row.plan_no or "",
  47. business_type=row.business_type,
  48. site_access_token=token or None,
  49. site_url=build_site_transport_url(token) if token else None,
  50. site_feedback_remark=row.site_feedback_remark,
  51. site_feedback_images=_parse_feedback_images(row.site_feedback_images),
  52. site_feedback_time=row.site_feedback_time,
  53. )
  54. def _parse_feedback_images(raw: str | None) -> list[str]:
  55. if not raw:
  56. return []
  57. try:
  58. parsed = json.loads(raw)
  59. if isinstance(parsed, list):
  60. return [str(item) for item in parsed if item]
  61. except (TypeError, json.JSONDecodeError):
  62. pass
  63. return [part.strip() for part in raw.split(",") if part.strip()]