restapi 도 경로보기 가능, 출발지목적지 동시에 같은거 못하게, 자물쇠걸면 컬럼 수정 못함 tablelistcomponent

This commit is contained in:
leeheejin
2025-12-08 10:23:54 +09:00
parent 7a596cad3d
commit 8ec5c987de
11 changed files with 485 additions and 14 deletions

View File

@@ -365,7 +365,70 @@ export default function MapTestWidgetV2({ element }: MapTestWidgetV2Props) {
const mappedRows = applyColumnMapping(rows, source.columnMapping);
// 마커와 폴리곤으로 변환 (mapDisplayType + dataSource 전달)
return convertToMapData(mappedRows, source.name || source.id || "API", source.mapDisplayType, source);
const mapData = convertToMapData(mappedRows, source.name || source.id || "API", source.mapDisplayType, source);
// ✅ REST API 데이터를 vehicle_location_history에 자동 저장 (경로 보기용)
// - 모든 REST API 차량 위치 데이터는 자동으로 저장됨
if (mapData.markers.length > 0) {
try {
const authToken = typeof window !== "undefined" ? localStorage.getItem("authToken") || "" : "";
// 마커 데이터를 vehicle_location_history에 저장
for (const marker of mapData.markers) {
// user_id 추출 (마커 description에서 파싱)
let userId = "";
let vehicleId: number | undefined = undefined;
let vehicleName = "";
if (marker.description) {
try {
const parsed = JSON.parse(marker.description);
// 다양한 필드명 지원 (plate_no 우선 - 차량 번호판으로 경로 구분)
userId = parsed.plate_no || parsed.plateNo || parsed.car_number || parsed.carNumber ||
parsed.user_id || parsed.userId || parsed.driver_id || parsed.driverId ||
parsed.car_no || parsed.carNo || parsed.vehicle_no || parsed.vehicleNo ||
parsed.id || parsed.code || "";
vehicleId = parsed.vehicle_id || parsed.vehicleId || parsed.car_id || parsed.carId;
vehicleName = parsed.plate_no || parsed.plateNo || parsed.car_name || parsed.carName ||
parsed.vehicle_name || parsed.vehicleName || parsed.name || parsed.title || "";
} catch {
// 파싱 실패 시 무시
}
}
// user_id가 없으면 마커 이름이나 ID를 사용
if (!userId) {
userId = marker.name || marker.id || `marker_${Date.now()}`;
}
// vehicle_location_history에 저장
await fetch(getApiUrl("/api/dynamic-form/location-history"), {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${authToken}`,
},
credentials: "include",
body: JSON.stringify({
latitude: marker.lat,
longitude: marker.lng,
userId: userId,
vehicleId: vehicleId,
tripStatus: "api_tracking", // REST API에서 가져온 데이터 표시
departureName: source.name || "REST API",
destinationName: vehicleName || marker.name,
}),
});
console.log("📍 [saveToHistory] 저장 완료:", { userId, lat: marker.lat, lng: marker.lng });
}
} catch (saveError) {
console.error("❌ [saveToHistory] 저장 실패:", saveError);
// 저장 실패해도 마커 표시는 계속
}
}
return mapData;
};
// Database 데이터 로딩
@@ -1659,16 +1722,20 @@ export default function MapTestWidgetV2({ element }: MapTestWidgetV2Props) {
{(() => {
try {
const parsed = JSON.parse(marker.description || "{}");
const userId = parsed.user_id;
if (userId) {
// 다양한 필드명 지원 (plate_no 우선)
const visibleUserId = parsed.plate_no || parsed.plateNo || parsed.car_number || parsed.carNumber ||
parsed.user_id || parsed.userId || parsed.driver_id || parsed.driverId ||
parsed.car_no || parsed.carNo || parsed.vehicle_no || parsed.vehicleNo ||
parsed.id || parsed.code || marker.name;
if (visibleUserId) {
return (
<div className="mt-2 border-t pt-2">
<button
onClick={() => loadRoute(userId)}
onClick={() => loadRoute(visibleUserId)}
disabled={routeLoading}
className="w-full rounded bg-blue-500 px-2 py-1 text-xs text-white hover:bg-blue-600 disabled:opacity-50"
>
{routeLoading && selectedUserId === userId ? "로딩 중..." : "🛣️ 이동경로 보기"}
{routeLoading && selectedUserId === visibleUserId ? "로딩 중..." : "🛣️ 이동경로 보기"}
</button>
</div>
);