| Форум » Флуд » Общение » Поговорим о... |
| Поговорим о... |
Воскресенье, 2025-09-21, 23:04
# 196
123
Прикрепления:
uchet_raboty.zip
(55.1 Kb)
|
Понедельник, 2025-09-22, 23:19
# 197
123
Прикрепления:
uchet_raboty_v1_2_12.zip
(27.3 Kb)
|
Среда, 2025-10-01, 08:27
# 199
ПредпросмотрZIP.html:539 Ошибка загрузки данных: Error: Ошибка парсинга XML: This page contains the following errors:error on line 1 at column 1: Document is empty
Below is a rendering of the page up to the first error. at parseXMLData (ПредпросмотрZIP.html:576:23) at loadWellData (ПредпросмотрZIP.html:534:23) at async selectFile (ПредпросмотрZIP.html:489:13) loadWellData @ ПредпросмотрZIP.html:539 await in loadWellData selectFile @ ПредпросмотрZIP.html:489 (anonymous) @ ПредпросмотрZIP.html:465 |
Среда, 2025-10-01, 08:44
# 200
<!DOCTYPE html>
<html lang="ru"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Геологическая база данных скважин</title> <style> /* ... существующие стили ... */ .file-status { font-size: 0.7rem; margin-top: 3px; padding: 2px 5px; border-radius: 3px; display: inline-block; } .status-error { background-color: #e74c3c; color: white; } .status-success { background-color: #27ae60; color: white; } .status-warning { background-color: #f39c12; color: white; } </style> <!-- Подключаем шрифт GeoindexA --> <style> @font-face { font-family: 'GeoindexA'; src: local('GeoindexA'), url('https://fonts.cdnfonts.com/s/95293/GeoindexA.woff') format('woff'); font-weight: normal; font-style: normal; } </style> </head> <body> <div class="container"> <!-- Левая панель с файлами --> <div class="sidebar"> <h2>Список архивов</h2> <div class="folder-selector"> <div class="folder-path" id="folderPath">Выберите папку с архивами</div> <div class="folder-buttons"> <button class="btn" id="selectFolderBtn">Выбрать папку</button> <button class="btn" id="refreshBtn">Обновить</button> </div> </div> <div class="file-list-container"> <ul class="file-list" id="fileList"> <li class="file-item">Выберите папку с архивами</li> </ul> <div class="file-counter" id="fileCounter"></div> </div> </div> <!-- Основная панель с информацией о скважине --> <div class="main-content"> <div class="well-header"> <h1 id="wellName">Выберите скважину для просмотра</h1> <div id="wellLine" class="well-line"></div> <p id="wellDescription">Информация о скважине появится после выбора файла</p> </div> <div id="wellData"> <div class="loading"> <p>Выберите файл из списка для отображения данных</p> </div> </div> </div> </div> <script> // Глобальные переменные let currentFile = null; let xmlData = null; let currentDirectoryHandle = null; let fileStatusMap = new Map(); // Для хранения статусов файлов // Инициализация при загрузке страницы document.addEventListener('DOMContentLoaded', function() { document.getElementById('selectFolderBtn').addEventListener('click', selectFolder); document.getElementById('refreshBtn').addEventListener('click', refreshFileList); }); // Выбор папки async function selectFolder() { try { // Используем File System Access API для выбора папки if ('showDirectoryPicker' in window) { currentDirectoryHandle = await window.showDirectoryPicker(); // Пытаемся получить полный путь к папке let folderPath = currentDirectoryHandle.name; try { // В некоторых браузерах можно получить больше информации о пути if (currentDirectoryHandle.getParent) { const parent = await currentDirectoryHandle.getParent(); folderPath = parent.name + ' > ' + folderPath; } } catch (e) { console.log('Не удалось получить полный путь к папке'); } document.getElementById('folderPath').textContent = folderPath; await loadFileList(); } else { alert('Ваш браузер не поддерживает выбор папок. Пожалуйста, используйте современный браузер (Chrome 86+, Edge 86+).'); } } catch (error) { console.error('Ошибка выбора папки:', error); if (error.name !== 'AbortError') { alert('Ошибка при выборе папки: ' + error.message); } } } // Обновление списка файлов async function refreshFileList() { if (currentDirectoryHandle) { await loadFileList(); } else { alert('Сначала выберите папку'); } } // Загрузка списка файлов из директории async function loadFileList() { if (!currentDirectoryHandle) return; try { const fileList = document.getElementById('fileList'); fileList.innerHTML = '<li class="file-item">Загрузка...</li>'; const files = []; // Получаем список файлов в папке for await (const entry of currentDirectoryHandle.values()) { if (entry.kind === 'file') { const file = await entry.getFile(); // Проверяем, является ли файл архивом ZIP if (file.name.toLowerCase().endsWith('.zip')) { files.push({ name: file.name, handle: entry, size: file.size, lastModified: file.lastModified }); } } } // Сортируем файлы по дате изменения (новые сверху) files.sort((a, b) => b.lastModified - a.lastModified); fileList.innerHTML = ''; if (files.length === 0) { fileList.innerHTML = '<li class="file-item">В папке нет архивов ZIP</li>'; document.getElementById('fileCounter').textContent = 'Найдено архивов: 0'; return; } files.forEach((file, index) => { const listItem = document.createElement('li'); listItem.className = 'file-item'; const fileSize = (file.size / 1024).toFixed(1); const modDate = new Date(file.lastModified).toLocaleDateString(); // Получаем статус файла если он есть const fileStatus = fileStatusMap.get(file.name) || { status: 'unknown', message: '' }; let statusHtml = ''; if (fileStatus.status === 'error') { statusHtml = `<div class="file-status status-error">Ошибка: ${fileStatus.message}</div>`; } else if (fileStatus.status === 'success') { statusHtml = `<div class="file-status status-success">✓ Загружено</div>`; } else if (fileStatus.status === 'warning') { statusHtml = `<div class="file-status status-warning">⚠ Предупреждение</div>`; } listItem.innerHTML = ` <div class="file-number">${index + 1}</div> <div class="file-content"> <div>${file.name}</div> <div class="file-info">${fileSize} KB · ${modDate}</div> ${statusHtml} </div> `; listItem.addEventListener('click', () => selectFile(file, index + 1)); fileList.appendChild(listItem); }); // Обновляем счетчик файлов document.getElementById('fileCounter').textContent = `Найдено архивов: ${files.length}`; } catch (error) { console.error('Ошибка загрузки списка файлов:', error); document.getElementById('fileList').innerHTML = '<li class="file-item">Ошибка загрузки файлов</li>'; document.getElementById('fileCounter').textContent = 'Ошибка загрузки'; } } // Выбор файла async function selectFile(file, fileNumber) { // Сброс активного класса у всех элементов document.querySelectorAll('.file-item').forEach(item => { item.classList.remove('active'); }); // Добавление активного класса к выбранному элементу event.currentTarget.classList.add('active'); currentFile = file; await loadWellData(file, fileNumber); } // Проверка валидности XML function isValidXML(content) { if (!content || content.trim() === '') { return { valid: false, error: 'Файл пустой' }; } // Проверяем базовую структуру XML const trimmed = content.trim(); if (!trimmed.startsWith('<?xml') && !trimmed.startsWith('<')) { return { valid: false, error: 'Неверный формат XML' }; } try { const parser = new DOMParser(); const xmlDoc = parser.parseFromString(content, 'text/xml'); const parseError = xmlDoc.getElementsByTagName('parsererror')[0]; if (parseError) { return { valid: false, error: 'Ошибка парсинга XML: ' + parseError.textContent.substring(0, 100) + '...' }; } return { valid: true }; } catch (error) { return { valid: false, error: 'Ошибка парсинга: ' + error.message }; } } // Загрузка данных о скважине async function loadWellData(file, fileNumber) { const wellDataElement = document.getElementById('wellData'); wellDataElement.innerHTML = '<div class="loading"><p>Загрузка данных...</p></div>'; try { // Получаем файл из FileSystemFileHandle const fileObj = await file.handle.getFile(); // Проверяем размер файла if (fileObj.size === 0) { throw new Error('Архив пустой'); } // Читаем архив const arrayBuffer = await fileObj.arrayBuffer(); // Распаковываем архив const zip = await JSZip.loadAsync(arrayBuffer); // Определяем тип файла по имени let targetFile = null; let fileType = ''; let targetFileName = ''; // Ищем файлы в архиве по приоритету for (const filename in zip.files) { if (filename.startsWith('906~')) { targetFile = zip.files[filename]; fileType = 'all'; targetFileName = filename; break; } else if (filename.startsWith('911~')) { targetFile = zip.files[filename]; fileType = 'final'; targetFileName = filename; } else if (filename.startsWith('909~') && !targetFile) { targetFile = zip.files[filename]; fileType = 'primary'; targetFileName = filename; } } if (!targetFile) { throw new Error('В архиве не найден файл с данными (начинающийся с 906~, 909~ или 911~)'); } // Проверяем размер целевого файла if (targetFile.size === 0) { throw new Error(`Файл ${targetFileName} в архиве пустой`); } // Читаем XML данные const xmlContent = await targetFile.async('text'); // Проверяем валидность XML const xmlValidation = isValidXML(xmlContent); if (!xmlValidation.valid) { throw new Error(xmlValidation.error); } // Парсинг XML данных await parseXMLData(xmlContent, fileType); // Сохраняем успешный статус fileStatusMap.set(file.name, { status: 'success', message: 'Успешно загружено' }); // Отображение данных displayWellData(fileType, fileNumber); } catch (error) { console.error('Ошибка загрузки данных:', error); // Сохраняем статус ошибки fileStatusMap.set(file.name, { status: 'error', message: error.message.substring(0, 50) + (error.message.length > 50 ? '...' : '') }); wellDataElement.innerHTML = ` <div class="error"> <h3>Ошибка загрузки данных</h3> <p>${error.message}</p> <div style="margin-top: 15px; font-size: 0.9rem; color: #7f8c8d;"> <p><strong>Возможные причины:</strong></p> <ul style="text-align: left; margin: 10px 0;"> <li>Архив поврежден или пустой</li> <li>XML файл внутри архива поврежден</li> <li>Файл имеет неподдерживаемый формат</li> <li>Отсутствуют необходимые файлы данных</li> </ul> </div> </div> `; // Обновляем список файлов чтобы показать статус ошибки await loadFileList(); } } // Функция для форматирования даты function formatDate(dateString) { if (!dateString) return 'Не указано'; try { const date = new Date(dateString); if (isNaN(date.getTime())) return 'Неверный формат даты'; const day = date.getDate().toString().padStart(2, '0'); const month = (date.getMonth() + 1).toString().padStart(2, '0'); const year = date.getFullYear(); return `${day}.${month}.${year}`; } catch (error) { console.error('Ошибка форматирования даты:', error); return 'Ошибка формата'; } } // Парсинг XML данных async function parseXMLData(xmlContent, fileType) { // Создаем парсер XML const parser = new DOMParser(); const xmlDoc = parser.parseFromString(xmlContent, 'text/xml'); // Проверяем на ошибки парсинга const parseError = xmlDoc.getElementsByTagName('parsererror')[0]; if (parseError) { throw new Error('Ошибка парсинга XML: ' + parseError.textContent); } // Извлекаем данные о скважине const pointObserv = xmlDoc.getElementsByTagName('MR_DBA.POINT_OBSERV_POAA')[0]; const objectWork = xmlDoc.getElementsByTagName('MR_DBA.OBJECT_WORK_OBWA')[0]; const ground = xmlDoc.getElementsByTagName('MR_DBA.GROUND_GRNA')[0]; const pointObservType = xmlDoc.getElementsByTagName('MR_DBA.POINT_OBSERV_TYPE_PNOT')[0]; const lineCommon = xmlDoc.getElementsByTagName('MR_DBA.LINE_COMMON_LNCM')[0]; // Основная информация о скважине const wellName = pointObserv ? pointObserv.getElementsByTagName('NAME_FULL_POAA')[0]?.textContent : 'Не указано'; const object = objectWork ? objectWork.getElementsByTagName('NAME_FULL_OBWA')[0]?.textContent : 'Не указано'; const area = ground ? ground.getElementsByTagName('NAME_FULL_GRNA')[0]?.textContent : 'Не указано'; const wellType = pointObservType ? pointObservType.getElementsByTagName('NAME_SHORT_PNOT')[0]?.textContent : 'Не указано'; const lineNumber = lineCommon ? lineCommon.getElementsByTagName('NAME_FULL_LNCM')[0]?.textContent : 'Не указано'; // Дата привязки const topoTieDateElement = pointObserv ? pointObserv.getElementsByTagName('DATE_TOPOTIE_POAA')[0] : null; const topoTieDate = formatDate(topoTieDateElement?.textContent); // Даты документирования let docStartDate = 'Не указано'; let docEndDate = 'Не указано'; // Ищем даты документирования в PO_DOCUM_PODC const docNodes = xmlDoc.getElementsByTagName('MR_DBA.PO_DOCUM_PODC'); if (docNodes.length > 0) { const firstDoc = docNodes[0]; const startDateElement = firstDoc.getElementsByTagName('DATE_BEG_DOCUM_PODC')[0]; const endDateElement = firstDoc.getElementsByTagName('DATE_END_DOCUM_PODC')[0]; docStartDate = formatDate(startDateElement?.textContent); docEndDate = formatDate(endDateElement?.textContent); } // Даты бурения и бригада let drillingStartDate = 'Не указано'; let drillingEndDate = 'Не указано'; let drillingBrigade = 'Не указано'; // Ищем даты бурения и бригаду const drillingStartElement = pointObserv ? pointObserv.getElementsByTagName('DATE_DRIFTING_BEG_POAA')[0] : null; const drillingEndElement = pointObserv ? pointObserv.getElementsByTagName('DATE_DRIFTING_END_POAA')[0] : null; const brigadeElement = pointObserv ? pointObserv.getElementsByTagName('BRIGADE_POAA')[0] : null; drillingStartDate = formatDate(drillingStartElement?.textContent); drillingEndDate = formatDate(drillingEndElement?.textContent); // Получаем название бригады if (brigadeElement?.textContent) { const brigadeId = brigadeElement.textContent; // Ищем название бригады в OUR_DIVISION const divisionNodes = xmlDoc.getElementsByTagName('MR_DBA.OUR_DIVISION'); for (let i = 0; i < divisionNodes.length; i++) { const division = divisionNodes[i]; const divisionId = division.getElementsByTagName('ID_CONTRACTOR')[0]?.textContent; if (divisionId === brigadeId) { const brigadeName = division.getElementsByTagName('NAME_SHORT')[0]?.textContent; if (brigadeName) { drillingBrigade = brigadeName; break; } } } // Если не нашли название, используем ID if (drillingBrigade === 'Не указано') { drillingBrigade = `Бригада ${brigadeId}`; } } // ... остальной код парсинга остается без изменений ... // Сохраняем извлеченные данные xmlData = { wellName, object, area, wellType, wellNumber: wellName, lineNumber, topoTieDate, docStartDate, docEndDate, drillingStartDate, drillingEndDate, drillingBrigade, primaryDocumentation: [], finalDocumentation: [], assays: [] }; } // Отображение данных о скважине function displayWellData(fileType, fileNumber) { // ... код отображения данных без изменений ... } </script> <!-- Подключаем библиотеку JSZip для работы с архивами --> <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script> </body> </html> |
Среда, 2025-10-01, 09:42
# 203
2
Прикрепления:
0718347.zip
(8.4 Kb)
|
Среда, 2025-10-01, 10:35
# 204
Оооо
Прикрепления:
deepseek_html_20251001_8b9f6b_.html
(50.2 Kb)
|
Среда, 2025-10-01, 10:37
# 205
Ррр
Прикрепления:
novyj1.zip
(9.3 Kb)
|
Среда, 2025-10-01, 11:20
# 207
---
Прикрепления:
deepseek_html_20251001_8b9f6b_.zip
(9.9 Kb)
|
Среда, 2025-10-01, 11:34
# 208
Ооо
Прикрепления:
7411794.zip
(9.5 Kb)
|
Среда, 2025-10-01, 12:08
# 209
Ооо
Прикрепления:
8596837.zip
(10.6 Kb)
|
Среда, 2025-10-01, 12:16
# 210
<script>
// Функция для переключения вкладок function switchTab(tabName) { // Скрываем все вкладки document.querySelectorAll('.tab-content').forEach(tab => { tab.classList.remove('active'); }); // Убираем активный класс со всех вкладок document.querySelectorAll('.tab').forEach(tab => { tab.classList.remove('active'); }); // Показываем выбранную вкладку document.getElementById(tabName + 'Tab').classList.add('active'); document.querySelector(`[data-tab="${tabName}"]`).classList.add('active'); } </script> <!-- Подключаем библиотеку JSZip для работы с архивами --> <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script> </body> </html> |
| |||


