diff --git a/src/pages/DrillingProgram.jsx b/src/pages/DrillingProgram.jsx index 823bebc..b19a8bf 100644 --- a/src/pages/DrillingProgram.jsx +++ b/src/pages/DrillingProgram.jsx @@ -1,168 +1,236 @@ -import { useEffect, useState } from 'react' -import { FileExcelOutlined } from '@ant-design/icons' -import { Popconfirm, Button, Tooltip, Typography } from 'antd' +import { memo, useState } from 'react' +import { Button, Tooltip, Layout } from 'antd' +import { CommentOutlined, FileWordOutlined, TableOutlined, UploadOutlined } from '@ant-design/icons' import { Flex } from '@components/Grid' +import { UserView } from '@components/views' import LoaderPortal from '@components/LoaderPortal' -import { MarkView, UserView } from '@components/views' -import { invokeWebApiWrapperAsync, download, formatBytes } from '@components/factory' -import { DrillingProgramService, WellService } from '@api' +import { invokeWebApiWrapperAsync } from '@components/factory' +import { arrayOrDefault, formatDate } from '@utils' +import { hasPermission } from '@utils/permissions' +import { DrillingProgramService } from '@api' -import DocumentsTemplate from '@pages/Documents/DocumentsTemplate' +const testCategories = [ + { + caption: 'Задание от геологов', + status: 1, + file: { + name: 'Документ 1.xlsx', + author: { login: 'Человек 9', company: { caption: 'Компания 9' } }, + size: '123 кБ', + uploadDate: '2022-01-01T00:00:00', + }, + lastApprove: '2022-01-01T00:00:00', + lastReject: '2022-01-01T00:00:00', + approved: [{ + user: { login: 'Человек 2', company: { caption: 'Компания 2' }}, + comment: 'Комментарий', + }], + undecided: [{ login: 'Человек 3', company: { caption: 'Компания 1' }}], + rejected: [], + }, { + caption: 'Профиль ствола скважины (ННБ)', + status: 1, + file: { + name: 'Документ 1.xlsx', + author: { login: 'Человек 9', company: { caption: 'Компания 9' }}, + size: '123 кБ', + uploadDate: '2022-01-01T00:00:00', + }, + lastApprove: '2022-01-01T00:00:00', + lastReject: '2022-01-01T00:00:00', + approved: [{ + user: { login: 'Человек 2', company: { caption: 'Компания 2' }}, + comment: 'Комментарий 3', + }], + undecided: [ + { login: 'Человек 3', company: { caption: 'Компания 1' }}, + { login: 'Человек 4', company: { caption: 'Компания 2' }}, + ], + rejected: [{ + user: { login: 'Человек 1', company: { caption: 'Компания 1' }}, + comment: 'Комментарий 2', + }], + }, { + caption: 'Технологические расчёты ННБ', + status: 0, + file: { + name: 'Документ 1.xlsx', + author: { login: 'Человек 9', company: { caption: 'Компания 9' }}, + size: '123 кБ', + uploadDate: '2022-01-01T00:00:00', + }, + lastApprove: '2022-01-01T00:00:00', + lastReject: '2022-01-01T00:00:00', + approved: [], + undecided: [ + { login: 'Человек 2', company: { caption: 'Компания 1' }}, + { login: 'Человек 3', company: { caption: 'Компания 1' }}, + { login: 'Человек 4', company: { caption: 'Компания 2' }}, + ], + rejected: [{ + user: { login: 'Человек 1', company: { caption: 'Компания 1' }}, + comment: 'Комментарий 2', + }], + }, { + caption: 'ГГД', + status: 0, + file: { + name: 'Документ 1.xlsx', + author: { login: 'Человек 9', company: { caption: 'Компания 9' }}, + size: '123 кБ', + uploadDate: '2022-01-01T00:00:00', + }, + lastApprove: '2022-01-01T00:00:00', + lastReject: '2022-01-01T00:00:00', + approved: [], + undecided: [ + { login: 'Человек 2', company: { caption: 'Компания 1' }}, + { login: 'Человек 3', company: { caption: 'Компания 1' }}, + { login: 'Человек 4', company: { caption: 'Компания 2' }}, + { login: 'Человек 2', company: { caption: 'Компания 1' }}, + { login: 'Человек 3', company: { caption: 'Компания 1' }}, + { login: 'Человек 4', company: { caption: 'Компания 2' }}, + ], + rejected: [{ + user: { login: 'Человек 1', company: { caption: 'Компания 1' }}, + comment: 'Комментарий 2', + }], + } +] -const idFileCategoryDrillingProgramItems = 13 -const { Text } = Typography +const testProgram = { + name: 'Документ 1.xlsx', + size: '123 кБ', + uploadDate: '2022-01-01T00:00:00', +} -export const DrillingProgram = ({ idWell }) => { - const [downloadButtonEnabled, selDownloadButtonEnabled] = useState(false) +export const DrillingProgram = memo(({ idWell }) => { const [showLoader, setShowLoader] = useState(false) - const [tooltip, setTooltip] = useState('нет файлов для формирования') - const [wellLabel, setWellLabel] = useState(`${idWell}`) - const [childKey, setChildKey] = useState() - const [lastUpdatedFile, setLastUpdatedFile] = useState() + const [categories, setCategories] = useState(testCategories) + const [program, setProgram] = useState(testProgram) - useEffect(() => invokeWebApiWrapperAsync( + const updateData = async () => await invokeWebApiWrapperAsync( async () => { - const well = await WellService.get(idWell) - setWellLabel(well.caption ?? `${idWell}`) + const categories = arrayOrDefault(await DrillingProgramService.getCategories(idWell)) + const program = await DrillingProgramService.getProgram(idWell) + setCategories(categories) + setProgram(program) }, setShowLoader, - `Не удалось загрузить название скважины "${idWell}"`, - 'Получить название скважины' - ), [idWell]) - - const downloadProgram = () => invokeWebApiWrapperAsync( - async () => await download(`/api/well/${idWell}/drillingProgram`), - setShowLoader, - `Не удалось загрузить программу бурения для скважины "${idWell}"`, - 'Получить программу бурения' + `Не удалось загрузить название скважины "${idWell}"` ) - const openProgramPreview = () => invokeWebApiWrapperAsync( - async() => { - const filWebUrl = await DrillingProgramService.getOrCreateSharedUrl(idWell) - if(filWebUrl && filWebUrl.length > 0) - window.open(filWebUrl, '_blank') - else - throw new Error('Сервер вернул плохую ссылку') + // useEffect(() => updateCategories(), [idWell]) + + const onApprove = (category) => () => invokeWebApiWrapperAsync( + async () => { + await DrillingProgramService.approve(idWell, category) + await updateData() }, setShowLoader, - 'Не удалось создать быстрый просмотр программы', - 'Создать быстрый просмотр программы' + `Не удалось согласовать документ для скважины "${idWell}"!` ) - const filesUpdated = (files) => { - if (!files || files.length === 0) { - setTooltip('Нет файлов для формирования программы') - selDownloadButtonEnabled(false) - return - } - - const isAllFilesAreExcel = files.every(fileInfo => fileInfo?.name.toLowerCase().endsWith('.xlsx')) - const isAnyFileMarked = files.some(file => file?.fileMarks.some(m => m?.idMarkType === 1 && !m?.isDeleted)) - - if (isAllFilesAreExcel && isAnyFileMarked) { - setTooltip('Программа доступна для скачивания') - selDownloadButtonEnabled(true) - } else { - setTooltip('Список файлов содержит недопустимые типы файлов') - } - const last = files.reduce((pre, cur) => pre.uploadDate > cur.uploadDate ? pre : cur) - setLastUpdatedFile(last) - } - - const customColumns = [ - { - title: 'Метки', - key: 'fileMarks', - render: (_, record) => renderMarksColumn(record?.id, record?.fileMarks) + const onReject = (category) => () => invokeWebApiWrapperAsync( + async () => { + await DrillingProgramService.reject(idWell, category) + await updateData() }, - ] - - const renderMarksColumn=(idFile, marks)=>{ - const validMarks = marks?.filter(m => !(m?.isDeleted)) - if(validMarks?.length) - return validMarks.map(mark => deleteMark(mark.id)}/>) - - return ( - addMarkToFile(idFile)}> - - - ) - } - - const addMarkToFile = async (idFile) => { - const mark = { - idFile: idFile, - idMarkType: 1, - isDeleted: false, - comment: '', - } - await DrillingProgramService.createFileMark(idWell, mark) - selDownloadButtonEnabled(true) - setChildKey(Date.now()) - } - - const deleteMark = async (idMark) => { - await DrillingProgramService.deleteFileMark(idWell, idMark) - setChildKey(Date.now()) - } - - const downloadButton = ( -
- Программа бурения - - - - - - - - - - -
+ setShowLoader, + `Не удалось согласовать документ для скважины "${idWell}"!` ) - const lastUpdatedFileView = lastUpdatedFile && - - Последнее изменние: -  '{lastUpdatedFile.name}' -  [{formatBytes(lastUpdatedFile.size)}] -  загружен: {new Date(lastUpdatedFile.uploadDate).toLocaleString()} -  автор: - - return ( - + + {program && ( +
+
Программа бурения
+ + +
Размер: {program.size}
+
Загружен: {formatDate(program.uploadDate)}
+
+
+ )} + + {categories.map((category) => category && ( +
+ +
{category.caption}
+
Согласованты
+
+ + + + +
Автор:
+
Размер: {category.file.size}
+
Загружен: {formatDate(category.file.uploadDate)}
+
+ + + + +
+ +
+ {category.undecided.map((user, i) => ( + + + + ))} +
+ + {category.status === 0 && hasPermission() && ( + + )} + + + Согласовано + {formatDate(category.lastApprove)} + +
+ {category.approved?.map(({ comment, user }, i) => ( +
+ + + + +
+ ))} +
+
+
+ + {category.status === 0 && hasPermission() && ( + + )} + + + Отклонено + {formatDate(category.lastReject)} + +
+ {category.rejected?.map(({ comment, user }, i) => ( +
+ + + + +
+ ))} +
+
+
+
+
+
+ ))} +
) -} +}) export default DrillingProgram