Merge remote-tracking branch 'origin/sub_laptop_1' into main_laptop_1
This commit is contained in:
@@ -1,11 +1,10 @@
|
||||
"""D01 예정노선 등록 API · 대시보드 「받은 예정노선」 (요구 345 · 요구서 3-1 · 2-2).
|
||||
"""D01 예정노선 등록 API · 대시보드 「받은 예정노선」 (요구 345 · 452 · 요구서 3-1 · 2-2).
|
||||
|
||||
화면은 이름 · 시작 연도 · 사업 지역 · 기준점(경위도) 보냄(요구서 389 3장 1 · 3 · 452 · PLAN 591-1) —
|
||||
끝 연도 = 시작 · 임도 종류 · 설계속도 없음(B 로 넘길 때 B05 기본) · 측점 없음(DB 칸 그대로).
|
||||
기준점 = D03 처음 자료 받는 기준 · 주소 = 서버가 VWorld 로 다시 찾아 저장(못 찾음 = 빈 값).
|
||||
"""
|
||||
|
||||
import json
|
||||
from typing import Any
|
||||
|
||||
import aiomysql
|
||||
@@ -79,9 +78,9 @@ async def post_plan_project(
|
||||
async def assigned_plan_routes(
|
||||
session: dict[str, Any] = Depends(require_company),
|
||||
) -> dict[str, Any]:
|
||||
"""우리 회사에 지정된 예정노선 조각(옛 = 연도) — 확정된 것(또는 이미 연결한 것) · 연결 상태 ·
|
||||
업데이트 · 조각 이름 · 길이(조각 행 · 옛 = 연도 행)."""
|
||||
from D04_PlanConfirm import D04_PlanConfirm_Repository as plan_repo
|
||||
"""우리 회사에 지정된 예정노선 조각 — 확정된 것(또는 이미 연결한 것) · 연결 상태 · 업데이트 ·
|
||||
조각 이름 · 길이 · 연도(설계 내용 파일 `plan_state` · 업체 줄은 조각 번호만)."""
|
||||
from D03_PlanAnalysis import D03_PlanAnalysis_Store as store
|
||||
from D04_PlanConfirm.D04_PlanConfirm_Link import update_available
|
||||
from D04_PlanConfirm.D04_PlanConfirm_Router import piece_label
|
||||
|
||||
@@ -90,44 +89,43 @@ async def assigned_plan_routes(
|
||||
connection.cursor(aiomysql.DictCursor) as cursor,
|
||||
):
|
||||
await cursor.execute(
|
||||
"""SELECT a.id AS assignee_id, a.project_id, p.name AS project_name, a.year,
|
||||
a.piece_id, c.length_m AS piece_length_m,
|
||||
"""SELECT a.id AS assignee_id, a.project_id, p.name AS project_name, a.piece_id,
|
||||
l.id AS linked_project_id, l.name AS linked_project_name,
|
||||
l.source_fingerprint, COALESCE(c.route_json, y.route_json) AS route_json,
|
||||
y.confirmed_at
|
||||
l.source_fingerprint
|
||||
FROM plan_route_assignees a
|
||||
JOIN projects p ON p.id = a.project_id AND p.deleted_at IS NULL
|
||||
LEFT JOIN plan_route_years y ON y.project_id = a.project_id AND y.year = a.year
|
||||
LEFT JOIN plan_route_pieces c
|
||||
ON c.project_id = a.project_id AND c.piece_id = a.piece_id
|
||||
LEFT JOIN projects l ON l.id = a.linked_project_id AND l.deleted_at IS NULL
|
||||
WHERE a.company_id = %s
|
||||
AND (y.confirmed_at IS NOT NULL OR l.id IS NOT NULL)
|
||||
ORDER BY p.name, a.year, a.piece_id""",
|
||||
ORDER BY p.name, a.piece_id""",
|
||||
(session.get("company_id"),),
|
||||
)
|
||||
rows = await cursor.fetchall()
|
||||
pieces: dict[tuple[str, str], dict[str, Any]] = {}
|
||||
for project_id in {r["project_id"] for r in rows if r.get("piece_id")}:
|
||||
for piece in await plan_repo.list_pieces(str(project_id)):
|
||||
pieces[(str(project_id), piece["piece_id"])] = piece
|
||||
for project_id in {str(r["project_id"]) for r in rows}:
|
||||
try:
|
||||
units = (await store.plan_state(project_id))["units"]
|
||||
except HTTPException: # 노선 파일이 틀린 프로젝트 = 건너뜀(목록 전체를 막지 않음)
|
||||
continue
|
||||
for unit in units:
|
||||
pieces[(project_id, unit["id"])] = unit
|
||||
routes = []
|
||||
for row in rows:
|
||||
route_json, fingerprint = row.pop("route_json"), row.pop("source_fingerprint")
|
||||
piece_length = row.pop("piece_length_m", None)
|
||||
confirmed = row["confirmed_at"] is not None
|
||||
body = json.loads(route_json) if isinstance(route_json, str | bytes) else route_json
|
||||
piece = pieces.get((str(row["project_id"]), row.get("piece_id")))
|
||||
fingerprint = row.pop("source_fingerprint")
|
||||
piece = pieces.get((str(row["project_id"]), row["piece_id"]))
|
||||
confirmed_at = piece and piece["confirmed_at"]
|
||||
if confirmed_at is None and row["linked_project_id"] is None:
|
||||
continue
|
||||
route = piece and {"planned": piece["planned"]}
|
||||
routes.append(
|
||||
{
|
||||
**row,
|
||||
"piece_id": row.get("piece_id"),
|
||||
"year": piece and piece["year"],
|
||||
"confirmed_at": confirmed_at,
|
||||
"piece_label": piece
|
||||
and piece_label(piece["line_name"], piece["from_m"], piece["to_m"]),
|
||||
"length_m": piece_length
|
||||
if piece_length is not None
|
||||
else (body or {}).get("length_m"),
|
||||
"update_available": update_available(route_json, fingerprint, confirmed),
|
||||
"length_m": piece and piece["length_m"],
|
||||
"update_available": update_available(route, fingerprint, bool(confirmed_at)),
|
||||
}
|
||||
)
|
||||
routes.sort(key=lambda r: (r["project_name"], r["year"] or 0, r["piece_id"]))
|
||||
return {"status": "success", "routes": routes}
|
||||
|
||||
Reference in New Issue
Block a user