pl_plan_site_link_service.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. """运输计划 · 现场链接读模型解析(安排运输 / 查看弹窗共用)"""
  2. from __future__ import annotations
  3. from sqlalchemy.orm import Session
  4. from app.models.pl_models import PlPlan, PlPlanProduct, PlTransport, PlTransportSiteLink
  5. from app.schemas.pl.transport import TransportSiteLinkRead
  6. from app.services.pl_dibang_bridge_service import plan_has_load_stop
  7. from app.services.pl_internal_customer import plan_requires_site_link
  8. from app.services.pl_io_order_service import build_io_order_site_url, get_active_io_order_for_plan
  9. from app.services.pl_site_link_read import build_transport_site_link_read_from_row
  10. from app.services.pl_transport_stop_feedback_service import build_transport_site_url
  11. def build_site_records_for_arranged_plan(
  12. db: Session,
  13. *,
  14. tenant_no: str,
  15. plan: PlPlan,
  16. transport: PlTransport,
  17. ) -> list[TransportSiteLinkRead]:
  18. """按当前计划装/送货客户判定,解析可复制的现场链接列表。"""
  19. if not plan_requires_site_link(db, tenant_no=tenant_no, plan=plan):
  20. return []
  21. site_rows = (
  22. db.query(PlTransportSiteLink)
  23. .filter(
  24. PlTransportSiteLink.tenant_no == tenant_no,
  25. PlTransportSiteLink.plan_id == plan.id,
  26. PlTransportSiteLink.transport_id == transport.id,
  27. PlTransportSiteLink.del_flag == 0,
  28. )
  29. .order_by(PlTransportSiteLink.create_time.asc())
  30. .all()
  31. )
  32. if site_rows:
  33. product_name_by_id = {
  34. item.id: item.product_name or ""
  35. for item in db.query(PlPlanProduct)
  36. .filter(PlPlanProduct.plan_id == plan.id, PlPlanProduct.del_flag == 0)
  37. .all()
  38. }
  39. return [
  40. build_transport_site_link_read_from_row(
  41. row,
  42. product_name=product_name_by_id.get(row.plan_product_id, row.product or ""),
  43. )
  44. for row in site_rows
  45. ]
  46. if plan_has_load_stop(db, tenant_no, plan.id):
  47. token = (transport.site_access_token or "").strip()
  48. if token:
  49. return [
  50. TransportSiteLinkRead(
  51. plan_product_id="",
  52. product_name=plan.plan_no or transport.transport_no,
  53. site_link_id=transport.id,
  54. plan_no=plan.plan_no or "",
  55. business_type="按段现场",
  56. site_access_token=token,
  57. site_url=build_transport_site_url(token),
  58. )
  59. ]
  60. active_io = get_active_io_order_for_plan(db, tenant_no, plan)
  61. if active_io:
  62. kind, header = active_io
  63. token = (header.site_access_token or "").strip()
  64. if token and header.status != "voided":
  65. return [
  66. TransportSiteLinkRead(
  67. plan_product_id="",
  68. product_name=header.order_no,
  69. site_link_id=header.id,
  70. plan_no=plan.plan_no or "",
  71. business_type="入库" if kind == "inbound" else "出库",
  72. site_access_token=token,
  73. site_url=build_io_order_site_url(kind, token),
  74. )
  75. ]
  76. return []