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

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,
`Не удалось сменить пароль пользователя ${userData.login}`,
'Смена пароля пользователя'
{ actionName: 'Смена пароля пользователя' }
), [userData, onOk])
return (

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -142,7 +142,7 @@ export const WellTreeSelector = memo(({ show, ...other }: TreeProps<TreeNodeData
},
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 { UserView } from './UserView'
export { WirelineView } from './WirelineView'
export * from './WellView'

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -16,21 +16,6 @@ const pageSize = 12
const { RangePicker } = DatePicker
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 }) => {
const [page, setPage] = useState(1)
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 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 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)
},
setShowLoader,
`Не удалось загрузить файлы по скважине "${well.caption}"`,
'Загрузка файла по скважине'
`Не удалось список файлов`,
{ actionName: 'Загрузка списка файлов', well }
)
}, [filterCompanyName, filterDataRange, filterFileName, idCategory, well, page])

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,6 +1,6 @@
import { LineChartOutlined, LinkOutlined } from '@ant-design/icons'
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 * as d3 from 'd3'
@ -20,18 +20,19 @@ import AdditionalTables from './AdditionalTables'
import '@styles/index.css'
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) => {
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)
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>)
@ -189,8 +190,8 @@ const Tvd = memo(({ well: givenWell, title, ...other }) => {
invokeWebApiWrapperAsync(
async () => setOperations(await getOperations(well.id)),
setIsLoading,
`Не удалось загрузить операции по скважине "${well.caption}"`,
'Получение списка опервций по скважине'
`Не удалось загрузить операции`,
{ actionName: 'Получение списка опервций по скважине', well }
)
}, [well])

View File

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

View File

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

View File

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