diff --git a/src/components/CementFluid.jsx b/src/components/CementFluid.jsx new file mode 100644 index 0000000..45fa840 --- /dev/null +++ b/src/components/CementFluid.jsx @@ -0,0 +1,106 @@ +let date = new Date().toLocaleString() + +export function CementFluid() { + return (<> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ НаименованиеТемпература, °CПлотность, г/см³Усл. вязкость, секR300R600R3/R6ДНС, дПаПластич. вязкость, сПзСНС, дПаR3/R6 49СДНС 49С, дПаПластич. вязкость 49С, сПзСНС 49С, дПаМВТ, кг/м³Песок, %Фильтрация, см³/30минКорка, ммКТКрНЖесткость, мг/лХлориды, мг/лPfMfPmТвердая фаза раствора, %Смазка, %Карбонат кальция, кг/м³
План                           
Факт                           
+
 
+

{date}

+ + ) +} \ No newline at end of file diff --git a/src/components/Disposition.jsx b/src/components/Disposition.jsx new file mode 100644 index 0000000..b40e30b --- /dev/null +++ b/src/components/Disposition.jsx @@ -0,0 +1,19 @@ +let date = new Date().toLocaleString() + + +export default function Disposition() { + return ( + <> +

Распоряжение

+ +

+ Текст +

+ +

Ф.И.О.

+

Должность

+

Компания

+

{date}

+ + ) +} \ No newline at end of file diff --git a/src/components/Documents.jsx b/src/components/Documents.jsx new file mode 100644 index 0000000..b7cb274 --- /dev/null +++ b/src/components/Documents.jsx @@ -0,0 +1,230 @@ +import {Table, DatePicker, Form, Button, Upload, ConfigProvider} from 'antd' +import { UploadOutlined } from '@ant-design/icons' +import MenuDocuments from "./MenuDocuments" +import { FileService } from '../services/api' +import {useState, useEffect} from "react" +import {useParams} from 'react-router-dom' +import notify from './notify' +import LoaderPortal from './LoaderPortal' +import locale from "antd/lib/locale/ru_RU" +import moment from 'moment' + +const pageSize = 12 +const {RangePicker} = DatePicker; + + +export default function Documents({selectedFileCategory}) { + let {id} = useParams() + + const [page, setPage] = useState(1) + const [range, setRange] = useState([]) + const [pagination, setPagination] = useState(null) + const [files, setFiles] = useState([]) + const [selectedFiles, setSelectedFiles] = useState([]) + const [isTableUpdating, setTableUpdating] = useState(false) + + const [loader, setLoader] = useState(false) + const [form] = Form.useForm(); + + const handleFileNameCLick = async (event, row) => { + const element = event.target + + if(!element.href.length) { + try { + setLoader(true) + + await fetch(`/api/files/${id}/${row.id}`, { + headers: { + Authorization: 'Bearer ' + localStorage['token'] + } + }) + .then(async (response) => { + const blob = await response.blob(); + + let reader = new FileReader(); + reader.readAsDataURL(blob); + reader.onload = function (e) { + element.href = e.target.result + element.click() + }; + setLoader(false) + }); + } catch (error) { + notify(`Не удалось скачать файл ${row}`, 'error') + console.log(error) + } + } + } + + const columns = [ + { + title: 'Документ', + key: 'document', + dataIndex: 'name', + render: (name, row) => + handleFileNameCLick(ev, row)} download={name}>{name} + }, + { + title: 'Дата загрузки', + key: 'uploadDate', + dataIndex: 'uploadDate', + render: (item) => moment.utc(item).local().format('DD MMM YYYY, HH:mm:ss') + }, + { + title: 'Ф.И.О.', + key: 'userName', + dataIndex: 'userName', + } + ]; + + const submitFileFormProps = { + progress: { + strokeColor: { + '0%': '#108ee9', + '100%': '#87d068', + }, + strokeWidth: 3, + format: percent => `${parseFloat(percent.toFixed(2))}%`, + }, + onChange({ file, fileList }) { + if (file.status !== 'uploading') { + setSelectedFiles(fileList) + } + } + } + + const onChangeRange = (range) => { + setRange(range) + } + + const onFinish = (values, form) => { + var fileList = values.fileInput.fileList + + if (fileList.length > 0) + { + setLoader(true) + const formData = new FormData(); + + fileList.forEach(val => { + formData.append('files', val.originFileObj) + }) + + fetch(`/api/files/${id}/files?idCategory=${selectedFileCategory}&idUser=${localStorage['userId']}`, { + headers: { + Authorization: 'Bearer ' + localStorage['token'] + }, + method: 'POST', + body: formData + }) + .then(async (response) => { + setLoader(false) + form.resetFields() + setTableUpdating(true) + }); + } + } + + const onFinishFailed = (errorInfo) => { + notify(`Не удалось отправить файлы по скважине "${id}".`, 'error') + } + + useEffect(() => { + const GetDocuments = async () => { + setLoader(true) + + try { + let begin = null + let end = null + if (range?.length > 1) { + begin = range[0].toISOString() + end = range[1].toISOString() + } + + await FileService.getFilesInfo( + `${id}`, + (page - 1) * pageSize, + pageSize, + selectedFileCategory, + begin, + end + ).then((paginatedFiles) => { + setFiles(paginatedFiles?.items.map(f => { + return { + key: f.id, + begin: f.date, + ...f + } + })) + + setPagination({ + total: paginatedFiles?.count, + current: Math.floor(paginatedFiles?.skip / pageSize), + }) + + setTableUpdating(false) + setLoader(false) + } + ) + } catch (ex) { + notify(`Не удалось загрузить файлы по скважине "${id}"`, 'error') + console.log(ex) + } + } + GetDocuments() + }, [id, range,page, selectedFileCategory, isTableUpdating]) + + return ( +
+ +
+

Фильтр документов:

+ + + +
+ +
 
+
onFinish(values, form)} + onFinishFailed={onFinishFailed} + style={{width: '300px'}} + > + + + + + + + + +
+
 
+ setPage(page) + }} + rowKey={(record) => record.id} + /> + ); +} \ No newline at end of file diff --git a/src/components/MenuDocuments.jsx b/src/components/MenuDocuments.jsx new file mode 100644 index 0000000..8aa1ad9 --- /dev/null +++ b/src/components/MenuDocuments.jsx @@ -0,0 +1,50 @@ +import {Menu} from "antd"; +import {FolderOutlined} from "@ant-design/icons"; +import {Link} from "react-router-dom"; +import {useState} from "react" + + +export default function MenuDocuments() { + + const [selectedItem, setSelectedItem] = useState(1) + + const handleClick = e => { + setSelectedItem({ current: e.key }); + }; + + return( + <> + + }> + Растворный сервис + + }> + Цементирование + + }> + ННБ + + }> + ГТИ + + }> + Документы по скважине + + }> + Супервайзер + + }> + Мастер + + }> + Последние данные + + + ) +} diff --git a/src/components/NnbTable.jsx b/src/components/NnbTable.jsx new file mode 100644 index 0000000..978e7c6 --- /dev/null +++ b/src/components/NnbTable.jsx @@ -0,0 +1,250 @@ +let date = new Date().toLocaleString() + +export function NnbTable() { + return (<> +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Глубина по + стволу, мЗенитный + угол, градАзимут + магнитный, градАзимут + истинный, градАзимут + дирекц., градГлубина по + вертикали, мАбсолютная + отметка, мЛок. + смещение к северу, мЛок. + смещение к востоку, мОтклонение + от устья, мАзимут + смещения, градОтклонение + от устья, мПространст. + интенсивность, град/10 мУгол + установки отклон., градИнтенсив. + по зениту, град/10 мКомментарийРазница вертикальных глубин + между ХХХ (план) и ХХХ (факт)Расстояние в пространстве между + ХХХ (план) и ХХХ (факт)


















+
 
+

{date}

+ ) +} \ No newline at end of file diff --git a/src/components/Sludge.jsx b/src/components/Sludge.jsx new file mode 100644 index 0000000..4705892 --- /dev/null +++ b/src/components/Sludge.jsx @@ -0,0 +1,383 @@ +let date = new Date().toLocaleString() + +export function Sludge() { + return (<> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
N пробы + Глубина + отбора пробыЛитологияКраткое + описаниеЛБА + бурового раствора ЛБА + (шлама)Газопоказания + Мех. + скоростьПредварительное заключение о насыщении по ГК
Песчаник + (%) Алевролит + (%)Аргиллит + (%)Аргиллит + бит. (%)Уголь + (%)Песок + (%)Глина + (%)Известняк + (%)Цемент + (%)Сумма + УВ мах. (абс%) С1 + метан (отн%)С2 этан + (отн%)С3 + пропан (отн%)С4 + бутан (отн%)С5 + пентан (отн%)






















+
 
+

{date}

+ + ) +} \ No newline at end of file diff --git a/src/pages/FluidService.jsx b/src/pages/FluidService.jsx new file mode 100644 index 0000000..2022289 --- /dev/null +++ b/src/pages/FluidService.jsx @@ -0,0 +1,8 @@ +import Documents from "../components/Documents" + +export default function FluidService({selectedFileCategory}) { + + return( + + ) +} \ No newline at end of file diff --git a/src/pages/LastData.jsx b/src/pages/LastData.jsx new file mode 100644 index 0000000..a331594 --- /dev/null +++ b/src/pages/LastData.jsx @@ -0,0 +1,94 @@ +import {Button, Modal, Checkbox } from "antd"; +import {CementFluid} from "../components/CementFluid"; +import React, {useState} from "react"; +import {Sludge} from "../components/Sludge"; +import {NnbTable} from "../components/NnbTable" +import Disposition from "../components/Disposition"; +import MenuDocuments from "../components/MenuDocuments"; + + +export default function LastData() { + const [tableVisible, setTableVisible] = useState(false) + const [tableSludgeVisible, setTableSludgeVisible] = useState(false) + const [tableNNBVisible, setTableNNBVisible] = useState(false) + const [dispositionVisible, setDispositionVisible] = useState(false) + + return ( + <> +
+ +
+
 
+ + setTableVisible(false)} + onCancel={() => setTableVisible(false)} + width={1800} + okText='Ок' + cancelText='Отмена' + > + + + + setTableSludgeVisible(false)} + onCancel={() => setTableSludgeVisible(false)} + width={1600} + okText='Ок' + cancelText='Отмена' + > + + + + setTableNNBVisible(false)} + onCancel={() => setTableNNBVisible(false)} + width={1400} + okText='Ок' + cancelText='Отмена' + > + + + + setDispositionVisible(false)} + onCancel={() => setDispositionVisible(false)} + width={850} + okText='Ок' + cancelText='Отмена' + footer={[ + Принять распоряжение, + , + + ]} + > + + + ) +} \ No newline at end of file diff --git a/src/pages/Login.jsx b/src/pages/Login.jsx index a604aa6..8675561 100644 --- a/src/pages/Login.jsx +++ b/src/pages/Login.jsx @@ -17,6 +17,7 @@ const openNotificationError = (message, title) => { const setUser = (user) =>{ OpenAPI.TOKEN = user.token + localStorage['userId'] = user.id localStorage['token'] = user.token localStorage['login'] = user.login } diff --git a/src/pages/Messages.jsx b/src/pages/Messages.jsx index 0b410c6..2f9e92e 100644 --- a/src/pages/Messages.jsx +++ b/src/pages/Messages.jsx @@ -110,7 +110,7 @@ export default function Messages() { <>
-

Фильтр сообщений

+

Фильтр сообщений

record.id} /> - + ) } \ No newline at end of file diff --git a/src/services/api/index.ts b/src/services/api/index.ts index fae9c9d..18cdace 100644 --- a/src/services/api/index.ts +++ b/src/services/api/index.ts @@ -13,6 +13,7 @@ export type { DatesRangeDto } from './models/DatesRangeDto'; export type { DepositDto } from './models/DepositDto'; export type { EventDto } from './models/EventDto'; export type { FilePropertiesDto } from './models/FilePropertiesDto'; +export type { FilePropertiesDtoPaginationContainer } from './models/FilePropertiesDtoPaginationContainer'; export type { MessageDto } from './models/MessageDto'; export type { MessageDtoPaginationContainer } from './models/MessageDtoPaginationContainer'; export type { OperationDto } from './models/OperationDto'; diff --git a/src/services/api/models/FilePropertiesDtoPaginationContainer.ts b/src/services/api/models/FilePropertiesDtoPaginationContainer.ts new file mode 100644 index 0000000..b2226ef --- /dev/null +++ b/src/services/api/models/FilePropertiesDtoPaginationContainer.ts @@ -0,0 +1,12 @@ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ + +import type { FilePropertiesDto } from './FilePropertiesDto'; + +export type FilePropertiesDtoPaginationContainer = { + skip?: number; + take?: number; + count?: number; + items?: Array | null; +} \ No newline at end of file diff --git a/src/services/api/services/DataService.ts b/src/services/api/services/DataService.ts index 38d648a..fa8fc17 100644 --- a/src/services/api/services/DataService.ts +++ b/src/services/api/services/DataService.ts @@ -13,7 +13,7 @@ export class DataService { * @param wellId id скважины * @param begin дата начала выборки. По умолчанию: текущее время - intervalSec * @param intervalSec интервал времени даты начала выборки, секунды - * @param approxPointsCount жела��мое количество точек. Если в выборке точек будет больше, то выборка будет прорежена. + * @param approxPointsCount желаемое количество точек. Если в выборке точек будет больше, то выборка будет прорежена. * @returns DataSaubBaseDto Success * @throws ApiError */ diff --git a/src/services/api/services/FileService.ts b/src/services/api/services/FileService.ts index bcfade8..8200338 100644 --- a/src/services/api/services/FileService.ts +++ b/src/services/api/services/FileService.ts @@ -1,7 +1,7 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { FilePropertiesDto } from '../models/FilePropertiesDto'; +import type { FilePropertiesDtoPaginationContainer } from '../models/FilePropertiesDtoPaginationContainer'; import { request as __request } from '../core/request'; export class FileService { @@ -36,19 +36,31 @@ requestBody?: any, /** * Возвращает информацию о файлах для скважины в выбраной категории * @param wellId id скважины + * @param skip для пагинации кол-во записей пропустить + * @param take для пагинации кол-во записей взять * @param idCategory id категории файла - * @returns FilePropertiesDto Success + * @param begin дата начала + * @param end дата окончания + * @returns FilePropertiesDtoPaginationContainer Success * @throws ApiError */ public static async getFilesInfo( wellId: number, -idCategory?: number, -): Promise> { +skip: number, +take: number = 32, +idCategory: number, +begin?: string, +end?: string, +): Promise { const result = await __request({ method: 'GET', path: `/api/files/${wellId}/filesInfo`, query: { + 'skip': skip, + 'take': take, 'idCategory': idCategory, + 'begin': begin, + 'end': end, }, }); return result.body; @@ -57,22 +69,17 @@ idCategory?: number, /** * Возвращает файл с диска на сервере * @param wellId id скважины - * @param fileName * @param fileId id запрашиваемого файла * @returns string Success * @throws ApiError */ public static async getFile( wellId: number, -fileName: string, -fileId?: number, +fileId: number, ): Promise { const result = await __request({ method: 'GET', - path: `/api/files/${wellId}/${fileName}`, - query: { - 'fileId': fileId, - }, + path: `/api/files/${wellId}/${fileId}`, }); return result.body; } diff --git a/src/services/api/services/ReportService.ts b/src/services/api/services/ReportService.ts index bbc5764..e63a83e 100644 --- a/src/services/api/services/ReportService.ts +++ b/src/services/api/services/ReportService.ts @@ -86,7 +86,7 @@ end?: string, } /** - * Возвр��щает прогнозируемое количество страниц будущего отчета + * Возвращает прогнозируемое количество страниц будущего отчета * @param wellId id скважины * @param stepSeconds шаг интервала * @param format формат отчета (0-PDF, 1-LAS) diff --git a/src/styles/index.css b/src/styles/index.css index 8d31ab7..9a60f46 100644 --- a/src/styles/index.css +++ b/src/styles/index.css @@ -48,3 +48,11 @@ code { monospace; } +.linkDocuments { + color: #000; +} + +.linkDocuments:hover { + color: #c32828; +} + diff --git a/src/styles/message.css b/src/styles/message.css index fb003b0..cd0e395 100644 --- a/src/styles/message.css +++ b/src/styles/message.css @@ -33,7 +33,7 @@ margin: 0 0 5px 0; } -.filter-group__heading { +.filter-group-heading { margin: 5px auto; align-items: center; }