Отзывы и предложения к софту от AleXStam
Поговорим о...
123
Прикрепления:
uchet_raboty.zip (55.1 Kb)
123
Прикрепления:
111123123123123123
Прикрепления:
321.zip (8.5 Kb)
Предпросмотр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
<!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>
Ttty
Прикрепления:
1111.zip (9.4 Kb)
2
2
Прикрепления:
0718347.zip (8.4 Kb)
Оооо
Прикрепления:
Ррр
Прикрепления:
novyj1.zip (9.3 Kb)
Рр
Прикрепления:
1_3.zip (10.4 Kb)
---
Прикрепления:
Ооо
Прикрепления:
7411794.zip (9.5 Kb)
Ооо
Прикрепления:
8596837.zip (10.6 Kb)
<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>
Поиск:
Новый ответ
Имя:
Текст сообщения: