обновление бизнес логики

This commit is contained in:
2026-02-05 21:23:20 +03:00
parent 44473a8d9d
commit 6caf1c9dbb
10 changed files with 111 additions and 2119 deletions

View File

@@ -173,7 +173,7 @@ const NavigationPage: React.FC = () => {
const urlFocusSensorId = searchParams.get('focusSensorId')
const objectId = currentObject.id || urlObjectId
const objectTitle = currentObject.title || urlObjectTitle
const [selectedModelPath, setSelectedModelPath] = useState<string>(urlModelPath || '')
const [selectedModelPath, setSelectedModelPath] = useState<string>('')
const handleModelLoaded = useCallback(() => {
@@ -191,12 +191,8 @@ const NavigationPage: React.FC = () => {
if (selectedModelPath) {
setIsModelReady(false);
setModelError(null);
// Сохраняем выбранную модель в URL для восстановления при возврате
const params = new URLSearchParams(searchParams.toString());
params.set('modelPath', selectedModelPath);
window.history.replaceState(null, '', `?${params.toString()}`);
}
}, [selectedModelPath, searchParams]);
}, [selectedModelPath]);
useEffect(() => {
if (urlObjectId && (!currentObject.id || currentObject.id !== urlObjectId)) {
@@ -204,12 +200,45 @@ const NavigationPage: React.FC = () => {
}
}, [urlObjectId, urlObjectTitle, currentObject.id, currentObject.title, setCurrentObject])
// Восстановление выбранной модели из URL при загрузке страницы
// Восстановление выбранной модели из URL при загрузке страницы (только если переход с focusSensorId)
useEffect(() => {
if (urlModelPath && !selectedModelPath) {
// Восстанавливаем modelPath только если есть focusSensorId (переход к конкретному датчику)
if (urlModelPath && urlFocusSensorId && !selectedModelPath) {
setSelectedModelPath(urlModelPath);
}
}, [urlModelPath, selectedModelPath])
}, [urlModelPath, urlFocusSensorId, selectedModelPath])
// Автоматическая загрузка модели с order=0 при пустом selectedModelPath
useEffect(() => {
const loadDefaultModel = async () => {
// Если модель уже выбрана или нет objectId - пропускаем
if (selectedModelPath || !objectId) return;
try {
console.log('[NavigationPage] Auto-loading model with order=0 for object:', objectId);
const response = await fetch(`/api/get-zones?object_id=${objectId}`);
const data = await response.json();
if (data.success && Array.isArray(data.data)) {
// Сортируем по order и берём первую
const sorted = data.data.slice().sort((a: any, b: any) => {
const oa = typeof a.order === 'number' ? a.order : 0;
const ob = typeof b.order === 'number' ? b.order : 0;
return oa - ob;
});
if (sorted.length > 0 && sorted[0].model_path) {
console.log('[NavigationPage] Auto-selected model with order=0:', sorted[0].model_path);
setSelectedModelPath(sorted[0].model_path);
}
}
} catch (error) {
console.error('[NavigationPage] Failed to load default model:', error);
}
};
loadDefaultModel();
}, [selectedModelPath, objectId])
useEffect(() => {
const loadDetectors = async () => {