73 lines
2.3 KiB
Python
73 lines
2.3 KiB
Python
"""运输计划现场链接读模型"""
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.models.pl_models import PlTransportSiteLink
|
|
from app.schemas.pl.transport import TransportSiteLinkRead
|
|
from app.services.db_inventory_site_token import build_site_transport_url
|
|
|
|
|
|
def build_transport_site_link_read(
|
|
db: Session,
|
|
*,
|
|
plan_product_id: str,
|
|
product_name: str,
|
|
site_link_id: str,
|
|
plan_no: str,
|
|
business_type: str,
|
|
site_access_token: str | None = None,
|
|
) -> TransportSiteLinkRead:
|
|
token = (site_access_token or "").strip()
|
|
if not token and site_link_id:
|
|
row = (
|
|
db.query(PlTransportSiteLink)
|
|
.filter(
|
|
PlTransportSiteLink.id == site_link_id,
|
|
PlTransportSiteLink.del_flag == 0,
|
|
)
|
|
.first()
|
|
)
|
|
if row:
|
|
token = (row.site_access_token or "").strip()
|
|
site_url = build_site_transport_url(token) if token else None
|
|
return TransportSiteLinkRead(
|
|
plan_product_id=plan_product_id,
|
|
product_name=product_name,
|
|
site_link_id=site_link_id,
|
|
plan_no=plan_no,
|
|
business_type=business_type,
|
|
site_access_token=token or None,
|
|
site_url=site_url,
|
|
)
|
|
|
|
|
|
def build_transport_site_link_read_from_row(row: PlTransportSiteLink, product_name: str = "") -> TransportSiteLinkRead:
|
|
token = (row.site_access_token or "").strip()
|
|
return TransportSiteLinkRead(
|
|
plan_product_id=row.plan_product_id,
|
|
product_name=product_name or row.product or "",
|
|
site_link_id=row.id,
|
|
plan_no=row.plan_no or "",
|
|
business_type=row.business_type,
|
|
site_access_token=token or None,
|
|
site_url=build_site_transport_url(token) if token else None,
|
|
site_feedback_remark=row.site_feedback_remark,
|
|
site_feedback_images=_parse_feedback_images(row.site_feedback_images),
|
|
site_feedback_time=row.site_feedback_time,
|
|
)
|
|
|
|
|
|
def _parse_feedback_images(raw: str | None) -> list[str]:
|
|
if not raw:
|
|
return []
|
|
try:
|
|
parsed = json.loads(raw)
|
|
if isinstance(parsed, list):
|
|
return [str(item) for item in parsed if item]
|
|
except (TypeError, json.JSONDecodeError):
|
|
pass
|
|
return [part.strip() for part in raw.split(",") if part.strip()]
|