Улучшено отображение сообщений об ошибках

This commit is contained in:
goodmice 2022-08-18 11:49:10 +05:00
parent 1fb4846dbe
commit 83d535c305
63 changed files with 320 additions and 286 deletions

View File

@ -51,7 +51,7 @@ export const ChangePassword = memo<ChangePasswordProps>(({ user, visible, onCanc
}, },
setShowLoader, setShowLoader,
`Не удалось сменить пароль пользователя ${userData.login}`, `Не удалось сменить пароль пользователя ${userData.login}`,
'Смена пароля пользователя' { actionName: 'Смена пароля пользователя' }
), [userData, onOk]) ), [userData, onOk])
return ( return (

View File

@ -2,7 +2,7 @@ import { memo, ReactNode } from 'react'
import { Link, LinkProps } from 'react-router-dom' import { Link, LinkProps } from 'react-router-dom'
import { FileWordOutlined } from '@ant-design/icons' import { FileWordOutlined } from '@ant-design/icons'
import { FileInfoDto } from '@api' import { FileInfoDto, WellDto } from '@api'
import { downloadFile } from './factory' import { downloadFile } from './factory'
import { getLinkToFile } from '@pages/FileDownload' import { getLinkToFile } from '@pages/FileDownload'
@ -13,6 +13,7 @@ export type DownloadLinkProps = LinkProps & {
file?: FileInfoDto file?: FileInfoDto
name?: string name?: string
icon?: ReactNode icon?: ReactNode
well?: WellDto
} }
export const DownloadLink = memo<DownloadLinkProps>(({ export const DownloadLink = memo<DownloadLinkProps>(({
@ -20,6 +21,7 @@ export const DownloadLink = memo<DownloadLinkProps>(({
file, file,
name, name,
icon = <FileWordOutlined />, icon = <FileWordOutlined />,
well,
...other ...other
}) => ( }) => (
<Link <Link
@ -30,7 +32,7 @@ export const DownloadLink = memo<DownloadLinkProps>(({
to={getLinkToFile(file)} to={getLinkToFile(file)}
onClick={(e) => { onClick={(e) => {
if (file) if (file)
downloadFile(file) downloadFile(file, well)
e.preventDefault() e.preventDefault()
return false return false
}} }}

View File

@ -39,7 +39,7 @@ export const makeTableAction = ({
}, },
setLoader, setLoader,
errorMsg, errorMsg,
actionName { actionName }
) )
) )

View File

@ -2,9 +2,10 @@ import { notification } from 'antd'
import { ArgsProps } from 'antd/lib/notification' import { ArgsProps } from 'antd/lib/notification'
import { Dispatch, ReactNode, SetStateAction } from 'react' import { Dispatch, ReactNode, SetStateAction } from 'react'
import { FunctionalValue, getFunctionalValue, isDev } from '@utils' import { WellView } from '@components/views'
import { getUserToken } from '@utils' import { getUserToken } from '@utils'
import { ApiError, FileInfoDto } from '@api' import { FunctionalValue, getFunctionalValue, isDev } from '@utils'
import { ApiError, FileInfoDto, WellDto } from '@api'
export type NotifyType = 'error' | 'warning' | 'info' export type NotifyType = 'error' | 'warning' | 'info'
@ -21,16 +22,24 @@ const notifyTypes: Record<NotifyType | 'defualt', ArgsProps & { instance: (args:
* @param notifyType для параметра типа. Допустимые значение 'error', 'warning', 'info' * @param notifyType для параметра типа. Допустимые значение 'error', 'warning', 'info'
* @param other прочие возможные аргументы уведомления * @param other прочие возможные аргументы уведомления
*/ */
export const notify = (body?: ReactNode, notifyType: NotifyType = 'info', other?: ArgsProps) => { export const notify = (body?: ReactNode, notifyType: NotifyType = 'info', well?: WellDto, other?: ArgsProps) => {
if (!body) return if (!body) return
const instance = notifyTypes[notifyType] ?? notifyTypes.defualt const instance = notifyTypes[notifyType] ?? notifyTypes.defualt
const message = (
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
<span>{instance.message}</span>
<WellView well={well} />
</div>
)
instance?.instance({ instance?.instance({
...instance,
description: body, description: body,
placement: 'bottomRight', placement: 'bottomRight',
duration: 10, duration: 10,
...instance, message,
...other ...other
}) })
} }
@ -46,15 +55,20 @@ export const copyToClipboard = (value: string, successText?: string, errorText?:
type asyncFunction = (...args: any) => Promise<any|void> type asyncFunction = (...args: any) => Promise<any|void>
const parseApiEror = (err: unknown, actionName?: string) => { type InvokeOptions = {
actionName?: string,
well?: WellDto,
}
const parseApiEror = (err: unknown, options?: InvokeOptions) => {
if (!(err instanceof ApiError)) return false if (!(err instanceof ApiError)) return false
switch (err.status) { switch (err.status) {
case 403: case 403:
if (actionName) if (options?.actionName)
notify(`Недостаточно прав для выполнения действия "${actionName}"`, 'error') notify(`Недостаточно прав для выполнения действия "${options.actionName}"`, 'error', options.well)
else else
notify('Недостаточно прав для выполнения действия', 'error') notify('Недостаточно прав для выполнения действия', 'error', options?.well)
return true return true
case 204: return true case 204: return true
default: return false default: return false
@ -65,7 +79,7 @@ export const invokeWebApiWrapperAsync = async (
funcAsync: asyncFunction, funcAsync: asyncFunction,
setShowLoader?: Dispatch<SetStateAction<boolean>>, setShowLoader?: Dispatch<SetStateAction<boolean>>,
errorNotifyText?: FunctionalValue<(err: unknown) => ReactNode>, errorNotifyText?: FunctionalValue<(err: unknown) => ReactNode>,
actionName?: string, options?: InvokeOptions,
) => { ) => {
setShowLoader?.(true) setShowLoader?.(true)
try{ try{
@ -73,8 +87,8 @@ export const invokeWebApiWrapperAsync = async (
} catch (ex) { } catch (ex) {
if(isDev()) if(isDev())
console.error(ex) console.error(ex)
if (!parseApiEror(ex, actionName)) if (!parseApiEror(ex, options))
notify(getFunctionalValue(errorNotifyText)(ex), 'error') notify(getFunctionalValue(errorNotifyText)(ex), 'error', options?.well)
} finally { } finally {
setShowLoader?.(false) setShowLoader?.(false)
} }
@ -119,12 +133,12 @@ export const upload = async (url: string, formData: FormData) => {
return response return response
} }
export const downloadFile = async (fileInfo: FileInfoDto) => { export const downloadFile = async (fileInfo: FileInfoDto, well?: WellDto) => {
try { try {
await download(`/api/well/${fileInfo.idWell}/files/${fileInfo.id}`) await download(`/api/well/${fileInfo.idWell}/files/${fileInfo.id}`)
return true return true
} catch (error) { } catch (error) {
notify(`Не удалось скачать файл "${fileInfo.name}" по скважине №${fileInfo.idWell}`, 'error') notify(`Не удалось скачать файл "${fileInfo.name}"`, 'error', well)
console.log(error) console.log(error)
return false return false
} }

View File

@ -9,9 +9,7 @@ export type WellIconColors = {
unknown?: string unknown?: string
} }
export interface WellIconProps { export type WellIconProps = React.SVGProps<SVGSVGElement> & {
width?: string | number
height?: string | number
online?: boolean online?: boolean
state?: WellIconState state?: WellIconState
colors?: WellIconColors colors?: WellIconColors

View File

@ -50,7 +50,7 @@ export const WellSelector = memo(({ value, onChange, treeData, treeLabels, ...ot
}, },
null, null,
'Не удалось загрузить список скважин', 'Не удалось загрузить список скважин',
'Получение списка скважин' { actionName: 'Получение списка скважин' }
) )
}, [treeData, treeLabels]) }, [treeData, treeLabels])

View File

@ -142,7 +142,7 @@ export const WellTreeSelector = memo(({ show, ...other }: TreeProps<TreeNodeData
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить список скважин`, `Не удалось загрузить список скважин`,
'Получить список скважин' { actionName: 'Получить список скважин' }
) )
}, []) }, [])

View File

@ -0,0 +1,59 @@
import { memo } from 'react'
import { Tooltip } from 'antd'
import { Grid, GridItem } from '@components/Grid'
import { WellIcon, WellIconState } from '@components/icons'
import { WellDto } from '@api'
import TelemetryView from './TelemetryView'
const wellState: Record<number, { enum: WellIconState, label: string }> = {
0: { enum: 'unknown', label: 'Неизвестно' },
1: { enum: 'active', label: 'В работе' },
2: { enum: 'inactive', label: 'Завершена' },
}
export type WellViewProps = {
well?: WellDto
}
export const WellView = memo<WellViewProps>(({ well }) => well ? (
<Tooltip title={(
<Grid style={{ columnGap: '8px' }}>
<GridItem row={1} col={1}>Название:</GridItem>
<GridItem row={1} col={2}>{well.caption ?? '---'}</GridItem>
<GridItem row={2} col={1}>Куст:</GridItem>
<GridItem row={2} col={2}>{well.cluster ?? '---'}</GridItem>
<GridItem row={3} col={1}>Месторождение:</GridItem>
<GridItem row={3} col={2}>{well.deposit ?? '---'}</GridItem>
<GridItem row={4} col={1}>Статус:</GridItem>
<GridItem row={4} col={2}>{wellState[well.idState || 0].label}</GridItem>
<GridItem row={5} col={1}>Широта:</GridItem>
<GridItem row={5} col={2}>{well.latitude ?? '---'}</GridItem>
<GridItem row={6} col={1}>Долгота:</GridItem>
<GridItem row={6} col={2}>{well.longitude ?? '---'}</GridItem>
<GridItem row={7} col={1}>Телеметрия:</GridItem>
<GridItem row={7} col={2}>
<TelemetryView telemetry={well.telemetry} />
</GridItem>
<GridItem row={8} col={1}>ID:</GridItem>
<GridItem row={8} col={2}>{well.id ?? '---'}</GridItem>
</Grid>
)}>
<span role={'img'} style={{ marginRight: 8, lineHeight: 0, verticalAlign: '-0.25em' }}>
<WellIcon state={wellState[well.idState || 0].enum} width={'1em'} height={'1em'} />
</span>
{well.caption}
</Tooltip>
) : (
<Tooltip title={'нет скважины'}>-</Tooltip>
))
export default WellView

View File

@ -11,3 +11,4 @@ export { CompanyView } from './CompanyView'
export { RoleView } from './RoleView' export { RoleView } from './RoleView'
export { UserView } from './UserView' export { UserView } from './UserView'
export { WirelineView } from './WirelineView' export { WirelineView } from './WirelineView'
export * from './WellView'

View File

@ -53,7 +53,7 @@ const ClusterController = memo(() => {
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить список кустов`, `Не удалось загрузить список кустов`,
'Получение списка кустов' { actionName: 'Получение списка кустов' }
), []) ), [])
useEffect(() => { useEffect(() => {
@ -65,7 +65,7 @@ const ClusterController = memo(() => {
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить список месторождений`, `Не удалось загрузить список месторождений`,
'Получение списка месторождений' { actionName: 'Получение списка месторождений' }
) )
}, []) }, [])

View File

@ -53,7 +53,7 @@ const CompanyController = memo(() => {
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить список типов компаний`, `Не удалось загрузить список типов компаний`,
'Получение списка типов команд' { actionName: 'Получение списка типов команд' }
) )
}, [updateTable]) }, [updateTable])
@ -65,7 +65,7 @@ const CompanyController = memo(() => {
updateTable, updateTable,
setShowLoader, setShowLoader,
`Не удалось обновить список компаний`, `Не удалось обновить список компаний`,
'Получение списка компаний' { actionName: 'Получение списка компаний' }
), ),
permission: 'AdminCompany.edit' permission: 'AdminCompany.edit'
} }

View File

@ -32,7 +32,7 @@ const CompanyTypeController = memo(() => {
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить список типов компаний`, `Не удалось загрузить список типов компаний`,
'Получение списка типов компаний' { actionName: 'Получение списка типов компаний' }
), []) ), [])
useEffect(() => { useEffect(() => {

View File

@ -35,7 +35,7 @@ const DepositController = memo(() => {
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить список месторождении`, `Не удалось загрузить список месторождении`,
'Получение списка месторождений' { actionName: 'Получение списка месторождений' }
), []) ), [])
useEffect(() => { useEffect(() => {

View File

@ -40,7 +40,7 @@ const PermissionController = memo(() => {
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить список прав`, `Не удалось загрузить список прав`,
'Получение списка прав' { actionName: 'Получение списка прав' }
), []) ), [])
useEffect(() => { useEffect(() => {

View File

@ -46,7 +46,7 @@ const RoleController = memo(() => {
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить список ролей`, `Не удалось загрузить список ролей`,
'Получение списка ролей' { actionName: 'Получение списка ролей' }
) )
}, [loadRoles]) }, [loadRoles])
@ -58,7 +58,7 @@ const RoleController = memo(() => {
loadRoles, loadRoles,
setShowLoader, setShowLoader,
`Не удалось загрузить список ролей`, `Не удалось загрузить список ролей`,
'Получение списка ролей', { actionName: 'Получение списка ролей' },
), ),
permission: 'AdminUserRole.edit' permission: 'AdminUserRole.edit'
} }

View File

@ -54,7 +54,7 @@ const TelemetryMerger = memo(() => {
}, },
setIsLoading, setIsLoading,
'Не удалось загрузить список телеметрий', 'Не удалось загрузить список телеметрий',
'Получение списка телеметрий', { actionName: 'Получение списка телеметрий' }
), []) ), [])
const mergeTelemetry = useCallback(() => invokeWebApiWrapperAsync( const mergeTelemetry = useCallback(() => invokeWebApiWrapperAsync(
@ -65,7 +65,7 @@ const TelemetryMerger = memo(() => {
}, },
setIsMerging, setIsMerging,
'Не удалось объединить телеметрии', 'Не удалось объединить телеметрии',
'Объединение телеметрий', { actionName: 'Объединение телеметрий' }
), [updateTelemetry, secondary, primary]) ), [updateTelemetry, secondary, primary])
useEffect(() => { useEffect(() => {

View File

@ -94,7 +94,7 @@ const TelemetryController = memo(() => {
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить список телеметрии скважин`, `Не удалось загрузить список телеметрии скважин`,
'Полученик списка телеметрии скважин' { actionName: 'Полученик списка телеметрии скважин' }
) )
}, []) }, [])

View File

@ -49,7 +49,8 @@ const UserController = memo(() => {
setFilteredUsers(filteredUsers) setFilteredUsers(filteredUsers)
}, },
setIsSearching, setIsSearching,
`Не удалось произвести поиск пользователей` `Не удалось произвести поиск пользователей`,
{ actionName: 'Поиск пользователей' }
) )
}, [users, searchValue]) }, [users, searchValue])
@ -88,7 +89,7 @@ const UserController = memo(() => {
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить список пользователей`, `Не удалось загрузить список пользователей`,
'Получение списка пользователей' { actionName: 'Получение списка пользователей' }
), []) ), [])
useEffect(() => { useEffect(() => {
@ -170,7 +171,7 @@ const UserController = memo(() => {
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить список компаний`, `Не удалось загрузить список компаний`,
'Получение списка компаний' { actionName: 'Получение списка компаний' }
) )
}, []) }, [])

View File

@ -38,7 +38,7 @@ const VisitLog = memo(() => {
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить список последних посещений пользователей`, `Не удалось загрузить список последних посещений пользователей`,
'Получение списка последних посещений' { actionName: 'Получение списка последних посещений' }
) )
}, []) }, [])

View File

@ -56,7 +56,7 @@ const WellController = memo(() => {
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить список скважин`, `Не удалось загрузить список скважин`,
'Получение списка скважин' { actionName: 'Получение списка скважин' }
), []) ), [])
const duplicateWell = useCallback((well) => { const duplicateWell = useCallback((well) => {
@ -116,7 +116,7 @@ const WellController = memo(() => {
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить список кустов`, `Не удалось загрузить список кустов`,
'Получение списка кустов' { actionName: 'Получение списка кустов' }
) )
}, [updateTable]) }, [updateTable])

View File

@ -103,8 +103,8 @@ const Statistics = memo(() => {
setSectionTypes(Object.entries(types)) setSectionTypes(Object.entries(types))
}, },
setIsPageLoading, setIsPageLoading,
`Не удалось получить типы секции для скважины "${well.caption}"`, `Не удалось получить типы секции`,
`Получение списка возможных секций`, { actionName: `Получение списка возможных секций`, well }
) )
}, [well]) }, [well])
@ -125,7 +125,8 @@ const Statistics = memo(() => {
]) ])
}, },
setIsPageLoading, setIsPageLoading,
'Не удалось установить необходимые столбцы' 'Не удалось установить необходимые столбцы',
{ actionName: 'Установка столбцов' }
) )
}, [sectionTypes, avgData, cmpSpeedRender]) }, [sectionTypes, avgData, cmpSpeedRender])
@ -152,6 +153,7 @@ const Statistics = memo(() => {
}, },
setIsAvgTableLoading, setIsAvgTableLoading,
'Не удалось загрузить данные для расчёта средних значений', 'Не удалось загрузить данные для расчёта средних значений',
{ actionName: 'Загрузка данных для расчёта средних значений' }
) )
}, [avgWells]) }, [avgWells])
@ -163,6 +165,7 @@ const Statistics = memo(() => {
}, },
setIsCmpTableLoading, setIsCmpTableLoading,
'Не удалось получить скважины для сравнения', 'Не удалось получить скважины для сравнения',
{ actionName: 'Загрузка скважин для сравнения' }
) )
}, [cmpWells]) }, [cmpWells])

View File

@ -28,8 +28,8 @@ export const NewParamsTable = memo(({ selectedWellsKeys }) => {
setParams(params) setParams(params)
}, },
setShowParamsLoader, setShowParamsLoader,
`Не удалось загрузить список режимов для скважины "${well.caption}"`, `Не удалось загрузить список режимов`,
'Получение списка режимов скважины' { actionName: 'Получение списка режимов скважины', well }
), [well]) ), [well])
const onParamsAddClick = useCallback(() => invokeWebApiWrapperAsync( const onParamsAddClick = useCallback(() => invokeWebApiWrapperAsync(
@ -38,8 +38,8 @@ export const NewParamsTable = memo(({ selectedWellsKeys }) => {
setIsParamsModalVisible(false) setIsParamsModalVisible(false)
}, },
setShowParamsLoader, setShowParamsLoader,
`Не удалось добавить режимы в список скважины "${well.caption}"`, `Не удалось добавить режимы в список`,
'Добавление режима скважины' { actionName: 'Добавление режима скважины', well }
), [well, params]) ), [well, params])
return ( return (

View File

@ -110,7 +110,8 @@ const WellCompositeSections = memo(({ statsWells, selectedSections }) => {
setWellOperations(operations) setWellOperations(operations)
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить операции по скважине "${selectedWell.caption}"`, `Не удалось загрузить операции`,
{ actionName: 'Загрузка операций', well: selectedWell }
) )
}, [selectedWell, isOpsModalVisible]) }, [selectedWell, isOpsModalVisible])
@ -134,8 +135,8 @@ const WellCompositeSections = memo(({ statsWells, selectedSections }) => {
setSelectedWellsKeys(keys) setSelectedWellsKeys(keys)
}, },
setShowLoader, setShowLoader,
`Не удалось сохранить изменения выбранных секций для композитной скважины "${well.caption}"`, `Не удалось сохранить изменения выбранных секций`,
'Изменение выбранных секций скважины' { actionName: 'Изменение выбранных секций', well }
) )
}, [well, selectedWellsKeys]) }, [well, selectedWellsKeys])

View File

@ -44,8 +44,8 @@ const WellCompositeEditor = memo(() => {
} }
}, },
setShowLoader, setShowLoader,
`Не удалось получить данные по скважине "${well.caption}"`, `Не удалось получить данные`,
'Получение списка скважин' { actionName: 'Получение списка скважин', well }
) )
}, [well]) }, [well])
@ -63,7 +63,7 @@ const WellCompositeEditor = memo(() => {
}, },
setShowTabLoader, setShowTabLoader,
'Не удалось загрузить статистику по скважинам/секциям', 'Не удалось загрузить статистику по скважинам/секциям',
'Получение статистики по скважинам/секциям' { actionName: 'Получение статистики по скважинам/секциям' }
) )
}, [selectedIdWells]) }, [selectedIdWells])

View File

@ -64,8 +64,8 @@ const ClusterWells = memo(({ statsWells }) => {
setWellOperations(operations.operations) setWellOperations(operations.operations)
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить операции по скважине "${selectedWell.caption}"`, `Не удалось загрузить операции`,
'Получение операций по скважине' { actionName: 'Получение операций по скважине', well: selectedWell}
) )
}, [selectedWell, isOpsModalVisible]) }, [selectedWell, isOpsModalVisible])

View File

@ -22,7 +22,7 @@ const Cluster = memo(() => {
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить данные по кусту "${idCluster}"`, `Не удалось загрузить данные по кусту "${idCluster}"`,
'Получение данных по кусту' { actionName: 'Получение данных по кусту' }
) )
}, [idCluster]) }, [idCluster])

View File

@ -58,7 +58,7 @@ const Deposit = memo(() => {
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить список кустов`, `Не удалось загрузить список кустов`,
'Получить список кустов' { actionName: 'Получить список кустов' }
) )
}, []) }, [])

View File

@ -16,21 +16,6 @@ const pageSize = 12
const { RangePicker } = DatePicker const { RangePicker } = DatePicker
const { Search } = Input const { Search } = Input
const columns = [
{
title: 'Документ',
key: 'document',
dataIndex: 'name',
render: (name, row) => (
<DownloadLink file={row} name={name} />
),
},
makeDateColumn('Дата загрузки', 'uploadDate'),
makeNumericColumn('Размер', 'size', null, null, formatBytes),
makeColumn('Автор', 'author', { render: item => <UserView user={item}/> }),
makeColumn('Компания', 'company', { render: (_, record) => <CompanyView company={record?.author?.company}/> })
]
export const DocumentsTemplate = ({ idCategory, well: givenWell, mimeTypes, headerChild, customColumns, beforeTable, onChange, tableName }) => { export const DocumentsTemplate = ({ idCategory, well: givenWell, mimeTypes, headerChild, customColumns, beforeTable, onChange, tableName }) => {
const [page, setPage] = useState(1) const [page, setPage] = useState(1)
const [filterDataRange, setFilterDataRange] = useState([]) const [filterDataRange, setFilterDataRange] = useState([])
@ -45,7 +30,21 @@ export const DocumentsTemplate = ({ idCategory, well: givenWell, mimeTypes, head
const uploadUrl = useMemo(() => `/api/well/${well.id}/files/?idCategory=${idCategory}`, [well, idCategory]) const uploadUrl = useMemo(() => `/api/well/${well.id}/files/?idCategory=${idCategory}`, [well, idCategory])
const mergedColumns = useMemo(() => [...columns, ...(customColumns ?? [])], [customColumns]) const mergedColumns = useMemo(() => [
{
title: 'Документ',
key: 'document',
dataIndex: 'name',
render: (name, row) => (
<DownloadLink file={row} name={name} well={well} />
),
},
makeDateColumn('Дата загрузки', 'uploadDate'),
makeNumericColumn('Размер', 'size', null, null, formatBytes),
makeColumn('Автор', 'author', { render: item => <UserView user={item}/> }),
makeColumn('Компания', 'company', { render: (_, record) => <CompanyView company={record?.author?.company}/> }),
...(customColumns ?? [])
], [well, customColumns])
const companies = useMemo(() => files.map(file => file?.author?.company?.caption).filter(Boolean).filter(unique), [files]) const companies = useMemo(() => files.map(file => file?.author?.company?.caption).filter(Boolean).filter(unique), [files])
const filenames = useMemo(() => files.map(file => file.name).filter(Boolean).filter(unique), [files]) const filenames = useMemo(() => files.map(file => file.name).filter(Boolean).filter(unique), [files])
@ -78,8 +77,8 @@ export const DocumentsTemplate = ({ idCategory, well: givenWell, mimeTypes, head
setPagination(newPagination) setPagination(newPagination)
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить файлы по скважине "${well.caption}"`, `Не удалось список файлов`,
'Загрузка файла по скважине' { actionName: 'Загрузка списка файлов', well }
) )
}, [filterCompanyName, filterDataRange, filterFileName, idCategory, well, page]) }, [filterCompanyName, filterDataRange, filterFileName, idCategory, well, page])

View File

@ -32,7 +32,8 @@ export const CategoryAdder = memo(({ categories, onUpdate, className, ...other }
}))) })))
}, },
setShowCatLoader, setShowCatLoader,
`Не удалось установить список доступных категорий для добавления` `Не удалось установить список доступных категорий для добавления`,
{ actionName: 'Установка списка доступных категорий для добавления' }
) )
}, [categories]) }, [categories])
@ -44,8 +45,8 @@ export const CategoryAdder = memo(({ categories, onUpdate, className, ...other }
onUpdate?.() onUpdate?.()
}, },
setShowLoader, setShowLoader,
`Не удалось добавить новые категорий программы бурения для скважины "${well.caption}"`, `Не удалось добавить новые категорий программы бурения`,
`Добавление категорий программы бурения` { actionName: 'Добавление категорий программы бурения', well }
), [onUpdate, well]) ), [onUpdate, well])
return ( return (

View File

@ -53,7 +53,8 @@ export const CategoryEditor = memo(({ visible, category, onClosed }) => {
setFilteredUsers(filteredUsers) setFilteredUsers(filteredUsers)
}, },
setIsSearching, setIsSearching,
`Не удалось произвести поиск пользователей` `Не удалось произвести поиск пользователей`,
{ actionName: 'Поиск пользователей' }
) )
}, [users, searchValue]) }, [users, searchValue])
@ -83,7 +84,8 @@ export const CategoryEditor = memo(({ visible, category, onClosed }) => {
setAllUsers(allUsers) setAllUsers(allUsers)
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить список доступных пользователей скважины "${well.caption}"` `Не удалось загрузить список доступных пользователей`,
{ actionName: 'Загрузка списка доступных пользователей', well }
) )
}, [well]) }, [well])
@ -124,9 +126,8 @@ export const CategoryEditor = memo(({ visible, category, onClosed }) => {
<> <>
Не удалось изменить статус пользователя Не удалось изменить статус пользователя
<UserView user={user} /> <UserView user={user} />
для скважины "{well.caption}"
</>, </>,
`Изменение статуса пользователя` { actionName: `Изменение статуса пользователя`, well }
), [users, well, category.idFileCategory]) ), [users, well, category.idFileCategory])
const userColumns = useMemo(() => [ const userColumns = useMemo(() => [

View File

@ -79,7 +79,8 @@ export const CategoryHistory = ({ idCategory, visible, onClose }) => {
setData(arrayOrDefault(paginatedHistory?.items)) setData(arrayOrDefault(paginatedHistory?.items))
}, },
setIsLoading, setIsLoading,
`Не удалось загрузить историю категорий "${idCategory}" скважины "${well.caption}"` `Не удалось загрузить историю категории "${idCategory}"`,
{ actionName: `Загрузка истории категории "${idCategory}"`, well }
) )
}, [well, idCategory, visible, range, companyName, fileName, page, pageSize]) }, [well, idCategory, visible, range, companyName, fileName, page, pageSize])

View File

@ -65,8 +65,8 @@ export const CategoryRender = memo(({ partData, onUpdate, onEdit, onHistory, set
await onUpdate?.() await onUpdate?.()
}, },
setIsLoading, setIsLoading,
`Не удалось ${approve ? 'согласовать' : 'отклонить'} документ для скважины "${well.caption}"!`, `Не удалось ${approve ? 'согласовать' : 'отклонить'} документ!`,
`${approve ? 'Согласование' : 'Отклонение'} документа "${title}" скважины "${well.caption}"` { actionName: `${approve ? 'Согласование' : 'Отклонение'} документа "${title}"`, well }
), [well, setIsLoading, file, permissionToApprove, title, onUpdate]) ), [well, setIsLoading, file, permissionToApprove, title, onUpdate])
const onRemoveClick = useCallback(() => invokeWebApiWrapperAsync( const onRemoveClick = useCallback(() => invokeWebApiWrapperAsync(
@ -75,8 +75,8 @@ export const CategoryRender = memo(({ partData, onUpdate, onEdit, onHistory, set
onUpdate?.() onUpdate?.()
}, },
setIsDeleting, setIsDeleting,
`Не удалось удалить категорию "${title}" для скважины "${well.caption}"`, `Не удалось удалить категорию "${title}"`,
`Удаление категории "${title}" скважины "${well.caption}"` { actionName: `Удаление категории "${title}"`, well }
), [well, idFileCategory, onUpdate, title]) ), [well, idFileCategory, onUpdate, title])
const onUploadComplete = useCallback(() => { const onUploadComplete = useCallback(() => {
@ -85,7 +85,7 @@ export const CategoryRender = memo(({ partData, onUpdate, onEdit, onHistory, set
}, [onUpdate, idFileCategory]) }, [onUpdate, idFileCategory])
const onUploadError = useCallback((e) => { const onUploadError = useCallback((e) => {
notify(e?.message ?? 'Ошибка загрузки файла', 'error') notify(e?.message ?? 'Ошибка загрузки файла', 'error', well)
setIsUploading(false) setIsUploading(false)
}, []) }, [])

View File

@ -76,7 +76,8 @@ const DrillingProgram = memo(() => {
})) }))
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить название скважины "${well.caption}"` `Не удалось загрузить категории программы бурения`,
{ actionName: 'Загрузка категорий программы бурения', well }
), [well]) ), [well])
useEffect(() => { useEffect(() => {
@ -105,7 +106,8 @@ const DrillingProgram = memo(() => {
await updateData() await updateData()
}, },
setShowLoader, setShowLoader,
`Не удалось сбросить ошибку формирования программы бурения для скважины ${well.caption}` `Не удалось сбросить ошибку формирования программы бурения`,
{ actionName: 'Сброс ошибки форматирования программы бурения', well }
), [well]) ), [well])
return ( return (

View File

@ -26,7 +26,7 @@ const FileDownload = memo(function FileDownload() {
async () => setWell(await WellService.get(idWell)), async () => setWell(await WellService.get(idWell)),
null, null,
'Не удалось получить информацию о скважине', 'Не удалось получить информацию о скважине',
'Получение данных о скважине', { actionName: 'Получение данных о скважине' }
) )
}, [idWell]) }, [idWell])
@ -43,7 +43,7 @@ const FileDownload = memo(function FileDownload() {
setIsError(true) setIsError(true)
return 'Не удалось получить информацию о файле' return 'Не удалось получить информацию о файле'
}, },
'Получение информации о файле' { actionName: 'Получение информации о файле' }
) )
}, [idWell, idFile]) }, [idWell, idFile])

View File

@ -27,7 +27,7 @@ const Login = memo(() => {
}, },
setShowLoader, setShowLoader,
(ex) => ex?.message ?? 'Ошибка входа', (ex) => ex?.message ?? 'Ошибка входа',
'Вход в систему' { actionName: 'Вход в систему' }
), [navigate, location]) ), [navigate, location])
return ( return (

View File

@ -60,8 +60,8 @@ export const MeasureTable = memo(({ group, updateMeasuresFunc, additionalButtons
updateMeasuresFunc() updateMeasuresFunc()
}, },
setShowLoader, setShowLoader,
`Не удалось удалить запись ${displayedValues.id} для скважины "${well.caption}"`, `Не удалось удалить запись ${displayedValues.id}`,
'Удаление записи для скважины' { actionName: 'Удаление записи для скважины', well }
), [well, displayedValues, updateMeasuresFunc]) ), [well, displayedValues, updateMeasuresFunc])
const editingDisabled = useMemo(() => disabled || !!displayedValues?.isDefaultData, [displayedValues?.isDefaultData]) const editingDisabled = useMemo(() => disabled || !!displayedValues?.isDefaultData, [displayedValues?.isDefaultData])
@ -95,8 +95,8 @@ export const MeasureTable = memo(({ group, updateMeasuresFunc, additionalButtons
updateMeasuresFunc() updateMeasuresFunc()
}, },
setShowLoader, setShowLoader,
`Не удалось добавить/изменить запись для скаважины "${well.caption}"`, `Не удалось добавить/изменить запись`,
'Добавление/изменение записи по скважине' { actionName: 'Добавление/изменение записи по скважине', well }
), [displayedValues, editingActionName, group.idCategory, well, measuresForm, updateMeasuresFunc]) ), [displayedValues, editingActionName, group.idCategory, well, measuresForm, updateMeasuresFunc])
return ( return (

View File

@ -69,8 +69,8 @@ const Measure = memo(() => {
}) })
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить последние данные по скважине ${well.caption}`, `Не удалось загрузить последние данные`,
'Получение последних данных телеметрий' { actionName: 'Получение последних данных телеметрий', well }
) )
}, [well, isMeasuresUpdating]) }, [well, isMeasuresUpdating])

View File

@ -62,7 +62,7 @@ export const Register = memo(() => {
}, },
setShowLoader, setShowLoader,
`Ошибка отправки заявки на регистрацию`, `Ошибка отправки заявки на регистрацию`,
'Отправка заявки на регистрацию' { actionName: 'Отправка заявки на регистрацию' }
), [navigate]) ), [navigate])
return ( return (

View File

@ -53,25 +53,25 @@ const table1Columns = [
const names = [ const names = [
['head', [ ['head', [
'wellName', 'clusterName', 'contractor', 'countLaunchesMSE', 'customer', 'bottomholeDepth', 'verticalDepth', 'wellName', 'clusterName', 'customer', 'contractor', 'reportDate', 'wellDepthIntervalStartDate', 'wellDepthIntervalFinishDate',
'firstDriller', 'secondDriller', 'zenithAngle', 'azimuthAngle', 'penetrationSAUB', 'penetrationSpinMaster', 'bottomholeDepth', 'verticalDepth', 'zenithAngle', 'azimuthAngle', 'firstDriller', 'secondDriller', 'workTimeSAUB',
'penetrationTorkMaster', 'secondDriller', 'wellDepthIntervalFinishDate', 'wellDepthIntervalStartDate', 'workTimeSpinMaster', 'workTimeTorkMaster', 'penetrationSAUB', 'penetrationSpinMaster', 'penetrationTorkMaster', 'countLaunchesMSE',
'workTimeSAUB', 'workTimeSpinMaster', 'workTimeTorkMaster', 'reportDate',
]], ]],
['bha', [ ['bha', [
'bhaDescription', 'extensionDrillingOneBegin', 'extensionDrillingOneFinish', 'sluiceBegin', 'sluiceFinish', 'bhaDescription', 'extensionDrillingOneBegin', 'extensionDrillingOneFinish', 'sluiceBegin', 'sluiceFinish',
'climbBegin', 'climbFinish', 'descentBegin', 'descentFinish', 'extensionDrillingTwoBegin', 'extensionDrillingTwoFinish', 'climbBegin', 'climbFinish', 'descentBegin', 'descentFinish', 'extensionDrillingTwoBegin', 'extensionDrillingTwoFinish',
]], ]],
['noDrilling', ['actualTimeBarrelPreparation', 'actualTimeExtension', 'standardTimeBarrelPreparation', 'standardTimeExtension']], ['noDrilling', ['standardTimeBarrelPreparation', 'standardTimeExtension', 'actualTimeBarrelPreparation', 'actualTimeExtension']],
['timeBalance', [ ['timeBalance', [
'drilling', 'flushing', 'building', 'elaboration', 'extension', 'repair', 'knbk', 'spo', 'pzr', 'pzr', 'pgr', 'gis', 'drilling', 'flushing', 'building', 'elaboration', 'extension', 'repair', 'knbk', 'spo', 'pzr',
'ozc', 'engineeringWorks', 'takingMeasure', 'cementing', 'simple', 'npv', 'pvo', 'pgr', 'gis', 'ozc', 'engineeringWorks', 'takingMeasure', 'cementing', 'simple', 'npv',
'elaborationBeforeBuilding', 'templatingBeforeBuilding', 'flushingBeforeBuilding', 'staticSurveying',
]], ]],
['saub', [ ['saub', [
'avgDiffDropRotor', 'avgDiffPressureSlide', 'declinesReasonsROP', 'deviationFromTVD', 'drillingTimeInRotor', 'rotorDrillingModes', 'slideDrillingModes', 'penetrationInRotor', 'numberDrillingHours', 'avgDiffDropRotor',
'declinesReasonsROP', 'extensionsCount', 'extensionsCount', 'penetrationInRotor', 'penetrationInSlide', 'penetrationInSlide', 'drillingTimeInRotor', 'avgDiffPressureSlide', 'sectionROPPlan', 'sectionDrillingTimeTotal',
'rotorDrillingModes', 'rotorSlidePercent', 'reductionTimeDrilling', 'increaseSpeedSection', 'increaseSpeedDay', 'sectionPenetrationTotal', 'extensionsCount', 'deviationFromTVD', 'declinesReasonsROP', 'increaseSpeedSection',
'sectionDrillingTimeTotal', 'sectionPenetrationTotal', 'sectionROPPlan', 'slideDrillingModes', 'mspSection' 'increaseSpeedDay', 'reductionTimeDrilling', 'rotorSlidePercent', 'mspSection',
]], ]],
['sign', ['drillingMaster', 'supervisor']], ['sign', ['drillingMaster', 'supervisor']],
] ]
@ -248,14 +248,21 @@ const table2Summary = () => (
</Summary.Row> </Summary.Row>
) )
const makeItem = (name, label) => ({ name, label }) const makeItem = (name, label, number, style) => ({ name, label, style, number })
const renderDescriptions = (items) => items.map(({ name, label }) => ( const renderDescriptions = (items) => (
<Descriptions.Item key={`${name}`} label={label}> <Descriptions bordered size={'small'} column={1}>
<Item name={name}> {items.map(({ name, label, style, number }) => {
<Input style={{ width: '100%' }} /> const Component = number ? InputNumber : Input
</Item> return (
</Descriptions.Item> <Descriptions.Item key={`${name}`} label={label}>
)) <Item name={name}>
<Component style={style ?? { width: '100%' }} />
</Item>
</Descriptions.Item>
)
})}
</Descriptions>
)
const tab1Items = [ const tab1Items = [
makeItem('wellName', 'Название скважины'), makeItem('wellName', 'Название скважины'),
@ -264,9 +271,14 @@ const tab1Items = [
makeItem('contractor', 'Подрядчик'), makeItem('contractor', 'Подрядчик'),
] ]
const tab2Items = [
makeItem('extensionDrillingTwoBegin', 'Бурение с наращиваниями в инт. 2763-2850м. Время начала'),
makeItem('extensionDrillingTwoFinish', 'Бурение с наращиваниями в инт. 2763-2850м. Время окончания'),
makeItem('bhaDescription', 'КНБК описание'),
]
const tab4Items = [ const tab4Items = [
makeItem('drilling', 'Бурение'), makeItem('drilling', 'Бурение'),
makeItem('sectionDrillingTimeTotal', 'Время бурения за секцию'),
makeItem('flushing', 'Промывка'), makeItem('flushing', 'Промывка'),
makeItem('building', 'Наращивание'), makeItem('building', 'Наращивание'),
makeItem('elaboration', 'Проработка'), makeItem('elaboration', 'Проработка'),
@ -286,6 +298,24 @@ const tab4Items = [
makeItem('npv', 'НПВ'), makeItem('npv', 'НПВ'),
] ]
const tab5Items1 = [
makeItem('sectionROPPlan', 'Плановая МСП за секцию', true),
makeItem('sectionDrillingTimeTotal', 'Время бурения за секцию', true),
makeItem('sectionPenetrationTotal', 'Проходка за секцию', true),
makeItem('extensionsCount', 'Кол-во наращиваний', true),
makeItem('deviationFromTVD', 'Отклонение от ГГД +/-, сут', true),
]
const tab5Items2 = [
makeItem('mspSection', 'МСП', false, {}),
makeItem('reductionTimeDrilling', 'Сокращение времени бурения за секцию, ч', false, {}),
makeItem('rotorSlidePercent', 'Ротор/Слайд %', false, {}),
makeItem('rotorDrillingModes', 'Режимы бурения в роторе'),
makeItem('slideDrillingModes', 'Режимы бурения в слайде'),
makeItem('increaseSpeedSection', 'Увеличение мех скорости за секцию %'),
makeItem('increaseSpeedDay', 'Увеличение мех скорости за сутки %'),
]
export const ReportEditor = memo(({ visible, data, onDone, onCancel, checkIsDateBusy }) => { export const ReportEditor = memo(({ visible, data, onDone, onCancel, checkIsDateBusy }) => {
const [form] = Form.useForm() const [form] = Form.useForm()
const [isInvalid, setIsInvalid] = useState(false) const [isInvalid, setIsInvalid] = useState(false)
@ -323,8 +353,8 @@ export const ReportEditor = memo(({ visible, data, onDone, onCancel, checkIsDate
form.resetFields() form.resetFields()
}, },
setIsLoading, setIsLoading,
`Не удалось сохранить суточный рапорт для скважины "${well.caption}"`, `Не удалось сохранить суточный рапорт`,
'Сохранение суточного рапорта' { actionName: 'Сохранение суточного рапорта', well }
), [data, onDone, well, form]) ), [data, onDone, well, form])
const onDateChange = useCallback((date) => invokeWebApiWrapperAsync( const onDateChange = useCallback((date) => invokeWebApiWrapperAsync(
@ -337,7 +367,7 @@ export const ReportEditor = memo(({ visible, data, onDone, onCancel, checkIsDate
}, },
setIsLoading, setIsLoading,
(e) => `Не удалось загрузить автозаполняемые данные для нового рапорта: ${e}`, (e) => `Не удалось загрузить автозаполняемые данные для нового рапорта: ${e}`,
'Получение автозаполняемых данных суточного рапорта' { actionName: 'Получение автозаполняемых данных суточного рапорта', well }
), [well, data, setFields, checkIsDateBusy]) ), [well, data, setFields, checkIsDateBusy])
return ( return (
@ -370,9 +400,7 @@ export const ReportEditor = memo(({ visible, data, onDone, onCancel, checkIsDate
</Item> </Item>
<Tabs defaultActiveKey={'1'}> <Tabs defaultActiveKey={'1'}>
<TabPane tab={'Заголовок'} key={'head'} forceRender> <TabPane tab={'Заголовок'} key={'head'} forceRender>
<Descriptions bordered size={'small'} column={1}> {renderDescriptions(tab1Items)}
{renderDescriptions(tab1Items)}
</Descriptions>
<Table <Table
bordered bordered
size={'small'} size={'small'}
@ -411,23 +439,7 @@ export const ReportEditor = memo(({ visible, data, onDone, onCancel, checkIsDate
dataSource={table10Data} dataSource={table10Data}
pagination={false} pagination={false}
/> />
<Descriptions bordered size={'small'} column={1}> {renderDescriptions(tab2Items)}
<Descriptions.Item label={'Бурение с наращиваниями в инт. 2763-2850м. Время начала'}>
<Item name={'extensionDrillingTwoBegin'}>
<Input style={{ width: '100%' }} />
</Item>
</Descriptions.Item>
<Descriptions.Item label={'Бурение с наращиваниями в инт. 2763-2850м. Время окончания'}>
<Item name={'extensionDrillingTwoFinish'}>
<Input style={{ width: '100%' }} />
</Item>
</Descriptions.Item>
<Descriptions.Item label={'КНБК описание'}>
<Item name={'bhaDescription'}>
<Input style={{ width: '100%' }} />
</Item>
</Descriptions.Item>
</Descriptions>
<Table <Table
bordered bordered
size={'small'} size={'small'}
@ -446,9 +458,7 @@ export const ReportEditor = memo(({ visible, data, onDone, onCancel, checkIsDate
/> />
</TabPane> </TabPane>
<TabPane tab={'Баланс времени'} key={'4'} forceRender> <TabPane tab={'Баланс времени'} key={'4'} forceRender>
<Descriptions bordered size={'small'} column={1}> {renderDescriptions(tab4Items)}
{renderDescriptions(tab4Items)}
</Descriptions>
</TabPane> </TabPane>
<TabPane tab={'блок Сауб'} key={'saub'} forceRender> <TabPane tab={'блок Сауб'} key={'saub'} forceRender>
<Table <Table
@ -465,76 +475,12 @@ export const ReportEditor = memo(({ visible, data, onDone, onCancel, checkIsDate
dataSource={table4Data} dataSource={table4Data}
pagination={false} pagination={false}
/> />
{renderDescriptions(tab5Items1)}
<Descriptions bordered size={'small'} column={1}>
<Descriptions.Item label={'Плановая МСП за секцию'}>
<Item name={'sectionROPPlan'}>
<InputNumber style={{ width: '100%' }} />
</Item>
</Descriptions.Item>
<Descriptions.Item label={'Время бурения за секцию'}>
<Item name={'sectionDrillingTimeTotal'}>
<InputNumber style={{ width: '100%' }} />
</Item>
</Descriptions.Item>
<Descriptions.Item label={'Проходка за секцию'}>
<Item name={'sectionPenetrationTotal'}>
<InputNumber style={{ width: '100%' }} />
</Item>
</Descriptions.Item>
<Descriptions.Item label={'Кол-во наращиваний'}>
<Item name={'extensionsCount'}>
<InputNumber style={{ width: '100%' }} />
</Item>
</Descriptions.Item>
<Descriptions.Item label={'Отклонение от ГГД +/-, сут'}>
<Item name={'deviationFromTVD'}>
<InputNumber style={{ width: '100%' }} />
</Item>
</Descriptions.Item>
</Descriptions>
<Item style={{ margin: '15px 0' }} name={'declinesReasonsROP'} label={'Примечание:'}> <Item style={{ margin: '15px 0' }} name={'declinesReasonsROP'} label={'Примечание:'}>
<Input.TextArea rows={4} /> <Input.TextArea rows={4} />
</Item> </Item>
{renderDescriptions(tab5Items2)}
<Descriptions bordered size={'small'} column={1}>
<Descriptions.Item label={'МСП'}>
<Item name={'mspSection'}>
<Input />
</Item>
</Descriptions.Item>
<Descriptions.Item label={'Сокращение времени бурения за секцию, ч'}>
<Item name={'reductionTimeDrilling'}>
<Input />
</Item>
</Descriptions.Item>
<Descriptions.Item label={'Ротор/Слайд %'}>
<Item name={'rotorSlidePercent'}>
<Input />
</Item>
</Descriptions.Item>
<Descriptions.Item label={'Режимы бурения в роторе'}>
<Item name={'rotorDrillingModes'}>
<Input style={{ width: '100%' }} />
</Item>
</Descriptions.Item>
<Descriptions.Item label={'Режимы бурения в слайде'}>
<Item name={'slideDrillingModes'}>
<Input style={{ width: '100%' }} />
</Item>
</Descriptions.Item>
<Descriptions.Item label={'Увеличение мех скорости за секцию %'}>
<Item name={'increaseSpeedSection'}>
<Input style={{ width: '100%' }} />
</Item>
</Descriptions.Item>
<Descriptions.Item label={'Увеличение мех скорости за сутки %'}>
<Item name={'increaseSpeedDay'}>
<Input style={{ width: '100%' }} />
</Item>
</Descriptions.Item>
</Descriptions>
</TabPane> </TabPane>
<TabPane tab={'Подписи'} key={'sign'} forceRender> <TabPane tab={'Подписи'} key={'sign'} forceRender>
<RawItem label={'ФИО Мастера буровой'} name={'drillingMaster'}> <RawItem label={'ФИО Мастера буровой'} name={'drillingMaster'}>

View File

@ -27,8 +27,8 @@ const DailyReport = memo(() => {
setData(data.map((row, i) => ({ ...row, reportDate: row.head.reportDate }))) setData(data.map((row, i) => ({ ...row, reportDate: row.head.reportDate })))
}, },
setIsLoading, setIsLoading,
`Не удалось загрузить список суточных рапортов для скважины "${well.caption}"`, `Не удалось загрузить список суточных рапортов`,
'Получение списка суточных рапортов', { actionName: 'Получение списка суточных рапортов', well }
), [well]) ), [well])
useEffect(() => { useEffect(() => {

View File

@ -70,8 +70,8 @@ export const Reports = memo(() => {
setReports(reports) setReports(reports)
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить список рапортов по скважине "${well.caption}"`, `Не удалось загрузить список рапортов`,
'Получение списка рапортов' { actionName: 'Получение списка рапортов', well }
) )
}, [well]) }, [well])

View File

@ -77,10 +77,8 @@ const DiagramReport = memo(() => {
}) })
}, },
setShowLoader, setShowLoader,
`Не удалось создать отчет по скважине "${well.caption}" c `Не удалось создать отчет c ${formatDate(filterDateRange[0])} по ${formatDate(filterDateRange[1])}`,
${formatDate(filterDateRange[0])} по { actionName: 'Создание отчёта по скважине', well }
${formatDate(filterDateRange[1])}`,
'Создание отчёта по скважине'
), [filterDateRange, format, well, step]) ), [filterDateRange, format, well, step])
const disabledDate = useCallback((current) => const disabledDate = useCallback((current) =>
@ -108,8 +106,8 @@ const DiagramReport = memo(() => {
]) ])
}, },
setShowLoader, setShowLoader,
`Не удалось получить диапозон дат рапортов для скважины "${well.caption}"`, `Не удалось получить диапозон дат рапортов`,
'Получение диапозона дат рапортов' { actionName: 'Получение диапозона дат рапортов', well }
) )
}, [well]) }, [well])
@ -130,7 +128,7 @@ const DiagramReport = memo(() => {
`Не удалось получить предварительные параметры отчета c `Не удалось получить предварительные параметры отчета c
${formatDate(filterDateRange[0])} по ${formatDate(filterDateRange[0])} по
${formatDate(filterDateRange[1])}`, ${formatDate(filterDateRange[1])}`,
'Получение размера рапортов' { actionName: 'Получение размера рапортов', well }
) )
}, [filterDateRange, step, format, well]) }, [filterDateRange, step, format, well])

View File

@ -175,8 +175,8 @@ const Archive = memo(() => {
setDateLimit(dates) setDateLimit(dates)
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить диапозон телеметрии для скважины "${well.caption}"`, `Не удалось загрузить диапозон телеметрии`,
'Загрузка диапозона телеметрии' { actionName: 'Загрузка диапозона телеметрии', well }
) )
}, [well]) }, [well])
@ -207,8 +207,8 @@ const Archive = memo(() => {
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить данные по скважине "${well.caption}" c ${formatDate(startDate)} по ${formatDate(+startDate + chartInterval)}`, `Не удалось загрузить данные c ${formatDate(startDate)} по ${formatDate(+startDate + chartInterval)}`,
'Загрузка телеметрий в диапозоне' { actionName: 'Загрузка телеметрий в диапозоне', well }
) )
}, [well, chartInterval, loaded, startDate]) }, [well, chartInterval, loaded, startDate])

View File

@ -136,7 +136,7 @@ const DashboardNNB = memo(({ enableEditing = false }) => {
}, },
setIsLoading, setIsLoading,
'Не удалось загрузить информацию о параметрах ННБ', 'Не удалось загрузить информацию о параметрах ННБ',
'Получение информации о параметрах ННБ' { actionName: 'Получение информации о параметрах ННБ' }
) )
}, []) }, [])
@ -159,8 +159,8 @@ const DashboardNNB = memo(({ enableEditing = false }) => {
handleData(await WitsRecord61Service.getLastData(well.id), '61') handleData(await WitsRecord61Service.getLastData(well.id), '61')
}, },
setIsLoading, setIsLoading,
`Не удалось загрузить последние данные по скважине ${well.caption}`, `Не удалось загрузить последние данные WITS`,
'Получение данных WITS', { actionName: 'Получение данных WITS', well }
) )
return Subscribe('hubs/telemetry', `well_${well.id}_wits`, return Subscribe('hubs/telemetry', `well_${well.id}_wits`,
{ methodName: 'ReceiveWitsRecord1', handler: (data) => handleData(data, '1') }, { methodName: 'ReceiveWitsRecord1', handler: (data) => handleData(data, '1') },

View File

@ -95,8 +95,8 @@ const Messages = memo(() => {
}) })
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить сообщения по скважине "${well.caption}"`, `Не удалось загрузить сообщения`,
'Полученик списка сообщений' { actionName: 'Полученик списка сообщений', well }
) )
}, [well, page, categories, range, searchString]) }, [well, page, categories, range, searchString])

View File

@ -33,8 +33,8 @@ export const DrillerSchedule = memo(({ drillers, loading, onChange }) => {
setSchedule(schedule) setSchedule(schedule)
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить расписания по скважине "${well.caption}"`, `Не удалось загрузить расписания`,
'Получение списка расписаний', { actionName: 'Получение списка расписаний', well }
), [well]) ), [well])
const onModalOpen = useCallback(() => { const onModalOpen = useCallback(() => {

View File

@ -29,8 +29,8 @@ export const TargetEditor = memo(({ loading, onChange }) => {
setTargets(targets) setTargets(targets)
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить цели для скважины "${well.caption}"`, `Не удалось загрузить цели`,
'Получение списка целей', { actionName: 'Получение списка целей', well }
), [well]) ), [well])
const onModalOpen = useCallback(() => setShowModal(true), []) const onModalOpen = useCallback(() => setShowModal(true), [])
@ -81,8 +81,8 @@ export const TargetEditor = memo(({ loading, onChange }) => {
]) ])
}, },
setShowLoader, setShowLoader,
`Не удалось получить список категорий целей для скважины "${well.caption}"`, `Не удалось получить список категорий целей`,
'Получение списка категорий целей' { actionName: 'Получение списка категорий целей', well }
) )
}, [well]) }, [well])

View File

@ -47,7 +47,7 @@ const Operations = memo(() => {
}, },
setDrillersLoader, setDrillersLoader,
'Не удалось загрузить список бурильщиков', 'Не удалось загрузить список бурильщиков',
'Получение списка бурильщиков' { actionName: 'Получение списка бурильщиков' }
), []) ), [])
const updateData = useCallback(async () => invokeWebApiWrapperAsync( const updateData = useCallback(async () => invokeWebApiWrapperAsync(
@ -57,8 +57,8 @@ const Operations = memo(() => {
setData(data) setData(data)
}, },
setIsLoading, setIsLoading,
`Не удалось загрузить список определённых операций по скважине "${well.caption}"`, `Не удалось загрузить список определённых операций`,
'Получение списка определённых операций', { actionName: 'Получение списка определённых операций', well }
), [well, dates, selectedCategory]) ), [well, dates, selectedCategory])
useEffect(() => { useEffect(() => {
@ -77,7 +77,8 @@ const Operations = memo(() => {
}))) })))
}, },
setIsLoading, setIsLoading,
'Не удалось загрзуить категории операций' 'Не удалось загрзуить категории операций',
{ actionName: 'Получение категорий операций' }
) )
}, []) }, [])
@ -92,8 +93,8 @@ const Operations = memo(() => {
} }
}, },
setIsLoading, setIsLoading,
`Не удалось загрузить диапазон доступных дат для скважины "${well.caption}"`, `Не удалось загрузить диапазон доступных дат`,
'Получение дапазона доступних дат', { actionName: 'Получение дапазона доступних дат', well }
) )
}, [well]) }, [well])

View File

@ -32,8 +32,8 @@ export const ActiveMessagesOnline = memo(({ well: givenWell }) => {
handleReceiveMessages(messages) handleReceiveMessages(messages)
}, },
setLoader, setLoader,
`Не удалось загрузить сообщения по скважине "${well.caption}"`, `Не удалось загрузить сообщения`,
'Получение списка сообщений' { actionName: 'Получение списка сообщений', well }
) )
return Subscribe('hubs/telemetry',`well_${well.id}`, { return Subscribe('hubs/telemetry',`well_${well.id}`, {
methodName: 'ReceiveMessages', methodName: 'ReceiveMessages',

View File

@ -72,8 +72,8 @@ export const SetpointSender = memo(({ onClose, visible, setpointNames }) => {
await onClose(true) await onClose(true)
}, },
setIsLoading, setIsLoading,
`Не удалось отправить уставки по скважине "${well.caption}"`, `Не удалось отправить уставки`,
`Рекомендация новыой уставки` { actionName: `Рекомендация новыой уставки`, well }
), [well, setpoints, comment, expirePeriod, onClose]) ), [well, setpoints, comment, expirePeriod, onClose])
return ( return (

View File

@ -35,8 +35,8 @@ export const Setpoints = memo(({ ...other }) => {
}))) })))
}, },
setIsLoading, setIsLoading,
`Не удалось загрузить список имён уставок по скважине "${well.caption}"`, `Не удалось загрузить список имён уставок`,
'Получение списка имён уставок' { actionName: 'Получение списка имён уставок', well }
) )
}, [well]) }, [well])
@ -60,8 +60,8 @@ export const Setpoints = memo(({ ...other }) => {
setSetpoints(setpoints) setSetpoints(setpoints)
}, },
setIsLoading, setIsLoading,
`Не удалось загрузить список для скважины "${well.caption}"`, `Не удалось загрузить список рекомендаций`,
'Получение списка рекомендаций' { actionName: 'Получение списка рекомендаций', well }
), [well]) ), [well])
const onOpenClick = useCallback(async () => { const onOpenClick = useCallback(async () => {

View File

@ -18,7 +18,8 @@ export const WirelineRunOut = memo(() => {
setTwro(twro) setTwro(twro)
}, },
setIsLoading, setIsLoading,
`Не удалось получить данные по талевому канату скважины "${well.caption}"` `Не удалось получить данные по талевому канату`,
{ actionName: 'Получение данных по талевому канату', well }
), [well]) ), [well])
const onTooltipVisibleChanged = useCallback((visible) => { const onTooltipVisibleChanged = useCallback((visible) => {

View File

@ -193,8 +193,8 @@ const TelemetryView = memo(() => {
handleDataSpin(dataSpin) handleDataSpin(dataSpin)
}, },
null, null,
`Не удалось получить данные по скважине "${well.caption}"`, `Не удалось получить данные`,
'Получение данных по скважине' { actionName: 'Получение данных по скважине', well }
) )
}, [well, chartInterval, handleDataSpin, handleDataSaub]) }, [well, chartInterval, handleDataSpin, handleDataSaub])
@ -215,8 +215,8 @@ const TelemetryView = memo(() => {
setRop(rop) setRop(rop)
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить данные по скважине "${well.caption}"`, `Не удалось загрузить данные`,
'Получение данных по скважине' { actionName: 'Получение данных по скважине', well }
) )
}, [well]) }, [well])

View File

@ -53,7 +53,8 @@ const Well = memo(() => {
setWell(newWell) setWell(newWell)
}, },
undefined, undefined,
`Не удалось изменить данные скважины "${well.caption}"` `Не удалось изменить данные скважины`,
{ actionName: 'Изменение данных скважины', well }
), [well]) ), [well])
return ( return (

View File

@ -7,7 +7,6 @@ import { EditableTable, makeNumericMinMax, makeNumericStartEnd } from '@componen
import { DrillFlowChartService } from '@api' import { DrillFlowChartService } from '@api'
import { arrayOrDefault } from '@utils' import { arrayOrDefault } from '@utils'
const columns = [ const columns = [
makeNumericStartEnd('Глубина, м', 'depth'), makeNumericStartEnd('Глубина, м', 'depth'),
makeNumericMinMax('Нагрузка, т', 'axialLoad'), makeNumericMinMax('Нагрузка, т', 'axialLoad'),
@ -29,8 +28,8 @@ export const DrillProcessFlow = memo(() => {
setFlows(arrayOrDefault(flows)) setFlows(arrayOrDefault(flows))
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить режимно-технологическую карту скважины "${well.caption}"`, `Не удалось загрузить режимно-технологическую карту`,
'Получение режимно-технологической карты скважины' { actionName: 'Получение режимно-технологической карты', well }
), [well]) ), [well])
useEffect(() => { useEffect(() => {
@ -52,7 +51,7 @@ export const DrillProcessFlow = memo(() => {
edit: { ...handlerProps, action: 'update', actionName: 'Редактирование месторождения', recordParser }, edit: { ...handlerProps, action: 'update', actionName: 'Редактирование месторождения', recordParser },
delete: { ...handlerProps, action: 'delete', actionName: 'Удаление месторождения', permission: 'DrillFlowChart.delete' }, delete: { ...handlerProps, action: 'delete', actionName: 'Удаление месторождения', permission: 'DrillFlowChart.delete' },
} }
}, [updateFlows, well.di]) }, [updateFlows, well.id])
return ( return (
<LoaderPortal show={showLoader}> <LoaderPortal show={showLoader}>

View File

@ -10,8 +10,9 @@ export const NetGraphExport = memo(({ well, ...other }) => {
const onExport = useCallback(() => invokeWebApiWrapperAsync( const onExport = useCallback(() => invokeWebApiWrapperAsync(
async () => await download(`/api/well/${well.id}/wellOperations/scheduleReport`), async () => await download(`/api/well/${well.id}/wellOperations/scheduleReport`),
setIsFileExporting, setIsFileExporting,
'Не удалось загрузить файл' 'Не удалось загрузить файл',
), [well.id]) { actionName: 'Загрузка файла', well }
), [well])
return ( return (
<div className={'tvd-input-group'}> <div className={'tvd-input-group'}>

View File

@ -9,7 +9,8 @@ export const StatExport = memo(({ well }) => {
const onExport = useCallback((isWell) => invokeWebApiWrapperAsync( const onExport = useCallback((isWell) => invokeWebApiWrapperAsync(
async () => await download(`/api/DetectedOperation/export?${isWell ? 'idWell' : 'idCluster'}=${isWell ? well.id : well.idCluster}`), async () => await download(`/api/DetectedOperation/export?${isWell ? 'idWell' : 'idCluster'}=${isWell ? well.id : well.idCluster}`),
setIsFileExporting, setIsFileExporting,
'Не удалось загрузить файл' 'Не удалось загрузить файл',
{ actionName: 'Загрузка файла', well }
), [well]) ), [well])
return ( return (

View File

@ -92,7 +92,8 @@ export const TLChart = memo(({
}).flat()) }).flat())
}, },
setIsLoading, setIsLoading,
`Не удалось загрузить список операций по скважине "${well.caption}"` `Не удалось загрузить список операций`,
{ actionName: 'Получение списка операций', well }
) )
}, [well]) }, [well])

View File

@ -84,7 +84,8 @@ export const TLPie = memo(({ well }) => {
setStats(stats) setStats(stats)
}, },
setIsLoading, setIsLoading,
`Не удалось загрузить статистику автоопределённых операций по скважине "${well.caption}"` `Не удалось загрузить статистику автоопределённых операций`,
{ actionName: 'Получение статистики автоопределённых операций', well }
) )
}, [well]) }, [well])

View File

@ -1,6 +1,6 @@
import { LineChartOutlined, LinkOutlined } from '@ant-design/icons' import { LineChartOutlined, LinkOutlined } from '@ant-design/icons'
import { memo, useState, useEffect, useMemo } from 'react' import { memo, useState, useEffect, useMemo } from 'react'
import { Switch, Segmented, Button } from 'antd' import { Switch, Segmented } from 'antd'
import { Link } from 'react-router-dom' import { Link } from 'react-router-dom'
import * as d3 from 'd3' import * as d3 from 'd3'
@ -20,18 +20,19 @@ import AdditionalTables from './AdditionalTables'
import '@styles/index.css' import '@styles/index.css'
import '@styles/tvd.less' import '@styles/tvd.less'
const operationsColors = [
'#1abc9c', '#16a085', '#2ecc71', '#27ae60', '#3498db',
'#2980b9', '#9b59b6', '#8e44ad', '#34495e', '#2c3e50',
'#f1c40f', '#f39c12', '#e67e22', '#d35400', '#e74c3c',
'#c0392b', '#ecf0f1', '#bdc3c7', '#95a5a6', '#7f8c8d',
]
export const makeGetColor = (types) => (type) => { export const makeGetColor = (types) => (type) => {
if (!type) return '#0008' if (!type) return '#0008'
const raw = [
'#1abc9c', '#16a085', '#2ecc71', '#27ae60', '#3498db',
'#2980b9', '#9b59b6', '#8e44ad', '#34495e', '#2c3e50',
'#f1c40f', '#f39c12', '#e67e22', '#d35400', '#e74c3c',
'#c0392b', '#ecf0f1', '#bdc3c7', '#95a5a6', '#7f8c8d',
]
if (!types || types.length <= 0) return raw[type] if (!types || types.length <= 0) return operationsColors[type]
const i = types.indexOf(type) const i = types.indexOf(type)
return i < 0 ? raw[type] : raw[i] return i < 0 ? operationsColors[type] : operationsColors[i]
} }
const Item = ({ label, children, ...other }) => (<div className={'tvd-input-group'} {...other}><span>{label}: </span>{children}</div>) const Item = ({ label, children, ...other }) => (<div className={'tvd-input-group'} {...other}><span>{label}: </span>{children}</div>)
@ -189,8 +190,8 @@ const Tvd = memo(({ well: givenWell, title, ...other }) => {
invokeWebApiWrapperAsync( invokeWebApiWrapperAsync(
async () => setOperations(await getOperations(well.id)), async () => setOperations(await getOperations(well.id)),
setIsLoading, setIsLoading,
`Не удалось загрузить операции по скважине "${well.caption}"`, `Не удалось загрузить операции`,
'Получение списка опервций по скважине' { actionName: 'Получение списка опервций по скважине', well }
) )
}, [well]) }, [well])

View File

@ -49,8 +49,8 @@ export const WellDrillParams = memo(() => {
setParams(params) setParams(params)
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить список режимов бурения скважины "${well.caption}"`, `Не удалось загрузить список режимов бурения`,
'Получение списка режимов бурения скважины' { actionName: 'Получение списка режимов бурения скважины', well }
), [well]) ), [well])
useEffect(() => { useEffect(() => {

View File

@ -80,8 +80,8 @@ const WellOperationsEditor = memo(({ idType, showNpt, ...other }) => {
setSectionTypes(sectionTypes.map(([id, label]) => ({ value: parseInt(id), label }))) setSectionTypes(sectionTypes.map(([id, label]) => ({ value: parseInt(id), label })))
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить список операций по скважине "${well.caption}"`, `Не удалось загрузить список операций`,
'Получение списка операций по скважине' { actionName: 'Получение списка операций по скважине', well }
) )
}, [well]) }, [well])
@ -98,8 +98,8 @@ const WellOperationsEditor = memo(({ idType, showNpt, ...other }) => {
setPaginationTotal(total) setPaginationTotal(total)
}, },
setShowLoader, setShowLoader,
`Не удалось загрузить список операций по скважине ${well.caption}`, `Не удалось загрузить список операций`,
'Получение списка операций по скважине' { actionName: 'Получение списка операций', well }
), [well, idType, pageNumAndPageSize]) ), [well, idType, pageNumAndPageSize])
useEffect(() => { useEffect(() => {

View File

@ -57,8 +57,8 @@ export const WellSectionsStat = memo(() => {
} }
}, },
setShowLoader, setShowLoader,
`Не удалось получить статистику по секциям скважины "${well.caption}"`, `Не удалось получить статистику по секциям`,
'Получение статистики по секциям скважины' { actionName: 'Получение статистики по секциям', well }
) )
}, [well]) }, [well])