forked from ddrilling/asb_cloud_front
Улучшено отображение сообщений об ошибках
This commit is contained in:
parent
1fb4846dbe
commit
83d535c305
@ -51,7 +51,7 @@ export const ChangePassword = memo<ChangePasswordProps>(({ user, visible, onCanc
|
||||
},
|
||||
setShowLoader,
|
||||
`Не удалось сменить пароль пользователя ${userData.login}`,
|
||||
'Смена пароля пользователя'
|
||||
{ actionName: 'Смена пароля пользователя' }
|
||||
), [userData, onOk])
|
||||
|
||||
return (
|
||||
|
@ -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
|
||||
}}
|
||||
|
@ -39,7 +39,7 @@ export const makeTableAction = ({
|
||||
},
|
||||
setLoader,
|
||||
errorMsg,
|
||||
actionName
|
||||
{ actionName }
|
||||
)
|
||||
)
|
||||
|
||||
|
40
src/components/factory.ts → src/components/factory.tsx
Executable file → Normal file
40
src/components/factory.ts → src/components/factory.tsx
Executable file → Normal 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
|
||||
}
|
@ -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
|
||||
|
@ -50,7 +50,7 @@ export const WellSelector = memo(({ value, onChange, treeData, treeLabels, ...ot
|
||||
},
|
||||
null,
|
||||
'Не удалось загрузить список скважин',
|
||||
'Получение списка скважин'
|
||||
{ actionName: 'Получение списка скважин' }
|
||||
)
|
||||
}, [treeData, treeLabels])
|
||||
|
||||
|
@ -142,7 +142,7 @@ export const WellTreeSelector = memo(({ show, ...other }: TreeProps<TreeNodeData
|
||||
},
|
||||
setShowLoader,
|
||||
`Не удалось загрузить список скважин`,
|
||||
'Получить список скважин'
|
||||
{ actionName: 'Получить список скважин' }
|
||||
)
|
||||
}, [])
|
||||
|
||||
|
59
src/components/views/WellView.tsx
Normal file
59
src/components/views/WellView.tsx
Normal 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
|
@ -11,3 +11,4 @@ export { CompanyView } from './CompanyView'
|
||||
export { RoleView } from './RoleView'
|
||||
export { UserView } from './UserView'
|
||||
export { WirelineView } from './WirelineView'
|
||||
export * from './WellView'
|
||||
|
@ -53,7 +53,7 @@ const ClusterController = memo(() => {
|
||||
},
|
||||
setShowLoader,
|
||||
`Не удалось загрузить список кустов`,
|
||||
'Получение списка кустов'
|
||||
{ actionName: 'Получение списка кустов' }
|
||||
), [])
|
||||
|
||||
useEffect(() => {
|
||||
@ -65,7 +65,7 @@ const ClusterController = memo(() => {
|
||||
},
|
||||
setShowLoader,
|
||||
`Не удалось загрузить список месторождений`,
|
||||
'Получение списка месторождений'
|
||||
{ actionName: 'Получение списка месторождений' }
|
||||
)
|
||||
}, [])
|
||||
|
||||
|
@ -53,7 +53,7 @@ const CompanyController = memo(() => {
|
||||
},
|
||||
setShowLoader,
|
||||
`Не удалось загрузить список типов компаний`,
|
||||
'Получение списка типов команд'
|
||||
{ actionName: 'Получение списка типов команд' }
|
||||
)
|
||||
}, [updateTable])
|
||||
|
||||
@ -65,7 +65,7 @@ const CompanyController = memo(() => {
|
||||
updateTable,
|
||||
setShowLoader,
|
||||
`Не удалось обновить список компаний`,
|
||||
'Получение списка компаний'
|
||||
{ actionName: 'Получение списка компаний' }
|
||||
),
|
||||
permission: 'AdminCompany.edit'
|
||||
}
|
||||
|
@ -32,7 +32,7 @@ const CompanyTypeController = memo(() => {
|
||||
},
|
||||
setShowLoader,
|
||||
`Не удалось загрузить список типов компаний`,
|
||||
'Получение списка типов компаний'
|
||||
{ actionName: 'Получение списка типов компаний' }
|
||||
), [])
|
||||
|
||||
useEffect(() => {
|
||||
|
@ -35,7 +35,7 @@ const DepositController = memo(() => {
|
||||
},
|
||||
setShowLoader,
|
||||
`Не удалось загрузить список месторождении`,
|
||||
'Получение списка месторождений'
|
||||
{ actionName: 'Получение списка месторождений' }
|
||||
), [])
|
||||
|
||||
useEffect(() => {
|
||||
|
@ -40,7 +40,7 @@ const PermissionController = memo(() => {
|
||||
},
|
||||
setShowLoader,
|
||||
`Не удалось загрузить список прав`,
|
||||
'Получение списка прав'
|
||||
{ actionName: 'Получение списка прав' }
|
||||
), [])
|
||||
|
||||
useEffect(() => {
|
||||
|
@ -46,7 +46,7 @@ const RoleController = memo(() => {
|
||||
},
|
||||
setShowLoader,
|
||||
`Не удалось загрузить список ролей`,
|
||||
'Получение списка ролей'
|
||||
{ actionName: 'Получение списка ролей' }
|
||||
)
|
||||
}, [loadRoles])
|
||||
|
||||
@ -58,7 +58,7 @@ const RoleController = memo(() => {
|
||||
loadRoles,
|
||||
setShowLoader,
|
||||
`Не удалось загрузить список ролей`,
|
||||
'Получение списка ролей',
|
||||
{ actionName: 'Получение списка ролей' },
|
||||
),
|
||||
permission: 'AdminUserRole.edit'
|
||||
}
|
||||
|
@ -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(() => {
|
||||
|
@ -94,7 +94,7 @@ const TelemetryController = memo(() => {
|
||||
},
|
||||
setShowLoader,
|
||||
`Не удалось загрузить список телеметрии скважин`,
|
||||
'Полученик списка телеметрии скважин'
|
||||
{ actionName: 'Полученик списка телеметрии скважин' }
|
||||
)
|
||||
}, [])
|
||||
|
||||
|
@ -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: 'Получение списка компаний' }
|
||||
)
|
||||
}, [])
|
||||
|
||||
|
@ -38,7 +38,7 @@ const VisitLog = memo(() => {
|
||||
},
|
||||
setShowLoader,
|
||||
`Не удалось загрузить список последних посещений пользователей`,
|
||||
'Получение списка последних посещений'
|
||||
{ actionName: 'Получение списка последних посещений' }
|
||||
)
|
||||
}, [])
|
||||
|
||||
|
@ -56,7 +56,7 @@ const WellController = memo(() => {
|
||||
},
|
||||
setShowLoader,
|
||||
`Не удалось загрузить список скважин`,
|
||||
'Получение списка скважин'
|
||||
{ actionName: 'Получение списка скважин' }
|
||||
), [])
|
||||
|
||||
const duplicateWell = useCallback((well) => {
|
||||
@ -116,7 +116,7 @@ const WellController = memo(() => {
|
||||
},
|
||||
setShowLoader,
|
||||
`Не удалось загрузить список кустов`,
|
||||
'Получение списка кустов'
|
||||
{ actionName: 'Получение списка кустов' }
|
||||
)
|
||||
}, [updateTable])
|
||||
|
||||
|
@ -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])
|
||||
|
||||
|
@ -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 (
|
||||
|
@ -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])
|
||||
|
||||
|
@ -44,8 +44,8 @@ const WellCompositeEditor = memo(() => {
|
||||
}
|
||||
},
|
||||
setShowLoader,
|
||||
`Не удалось получить данные по скважине "${well.caption}"`,
|
||||
'Получение списка скважин'
|
||||
`Не удалось получить данные`,
|
||||
{ actionName: 'Получение списка скважин', well }
|
||||
)
|
||||
}, [well])
|
||||
|
||||
@ -63,7 +63,7 @@ const WellCompositeEditor = memo(() => {
|
||||
},
|
||||
setShowTabLoader,
|
||||
'Не удалось загрузить статистику по скважинам/секциям',
|
||||
'Получение статистики по скважинам/секциям'
|
||||
{ actionName: 'Получение статистики по скважинам/секциям' }
|
||||
)
|
||||
}, [selectedIdWells])
|
||||
|
||||
|
@ -64,8 +64,8 @@ const ClusterWells = memo(({ statsWells }) => {
|
||||
setWellOperations(operations.operations)
|
||||
},
|
||||
setShowLoader,
|
||||
`Не удалось загрузить операции по скважине "${selectedWell.caption}"`,
|
||||
'Получение операций по скважине'
|
||||
`Не удалось загрузить операции`,
|
||||
{ actionName: 'Получение операций по скважине', well: selectedWell}
|
||||
)
|
||||
}, [selectedWell, isOpsModalVisible])
|
||||
|
||||
|
@ -22,7 +22,7 @@ const Cluster = memo(() => {
|
||||
},
|
||||
setShowLoader,
|
||||
`Не удалось загрузить данные по кусту "${idCluster}"`,
|
||||
'Получение данных по кусту'
|
||||
{ actionName: 'Получение данных по кусту' }
|
||||
)
|
||||
}, [idCluster])
|
||||
|
||||
|
@ -58,7 +58,7 @@ const Deposit = memo(() => {
|
||||
},
|
||||
setShowLoader,
|
||||
`Не удалось загрузить список кустов`,
|
||||
'Получить список кустов'
|
||||
{ actionName: 'Получить список кустов' }
|
||||
)
|
||||
}, [])
|
||||
|
||||
|
@ -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])
|
||||
|
||||
|
@ -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 (
|
||||
|
@ -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(() => [
|
||||
|
@ -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])
|
||||
|
||||
|
@ -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)
|
||||
}, [])
|
||||
|
||||
|
@ -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 (
|
||||
|
@ -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])
|
||||
|
||||
|
@ -27,7 +27,7 @@ const Login = memo(() => {
|
||||
},
|
||||
setShowLoader,
|
||||
(ex) => ex?.message ?? 'Ошибка входа',
|
||||
'Вход в систему'
|
||||
{ actionName: 'Вход в систему' }
|
||||
), [navigate, location])
|
||||
|
||||
return (
|
||||
|
@ -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 (
|
||||
|
@ -69,8 +69,8 @@ const Measure = memo(() => {
|
||||
})
|
||||
},
|
||||
setShowLoader,
|
||||
`Не удалось загрузить последние данные по скважине ${well.caption}`,
|
||||
'Получение последних данных телеметрий'
|
||||
`Не удалось загрузить последние данные`,
|
||||
{ actionName: 'Получение последних данных телеметрий', well }
|
||||
)
|
||||
}, [well, isMeasuresUpdating])
|
||||
|
||||
|
@ -62,7 +62,7 @@ export const Register = memo(() => {
|
||||
},
|
||||
setShowLoader,
|
||||
`Ошибка отправки заявки на регистрацию`,
|
||||
'Отправка заявки на регистрацию'
|
||||
{ actionName: 'Отправка заявки на регистрацию' }
|
||||
), [navigate])
|
||||
|
||||
return (
|
||||
|
@ -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 }) => (
|
||||
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}>
|
||||
<Input style={{ width: '100%' }} />
|
||||
<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>
|
||||
<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>
|
||||
</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'}>
|
||||
|
@ -27,8 +27,8 @@ const DailyReport = memo(() => {
|
||||
setData(data.map((row, i) => ({ ...row, reportDate: row.head.reportDate })))
|
||||
},
|
||||
setIsLoading,
|
||||
`Не удалось загрузить список суточных рапортов для скважины "${well.caption}"`,
|
||||
'Получение списка суточных рапортов',
|
||||
`Не удалось загрузить список суточных рапортов`,
|
||||
{ actionName: 'Получение списка суточных рапортов', well }
|
||||
), [well])
|
||||
|
||||
useEffect(() => {
|
||||
|
@ -70,8 +70,8 @@ export const Reports = memo(() => {
|
||||
setReports(reports)
|
||||
},
|
||||
setShowLoader,
|
||||
`Не удалось загрузить список рапортов по скважине "${well.caption}"`,
|
||||
'Получение списка рапортов'
|
||||
`Не удалось загрузить список рапортов`,
|
||||
{ actionName: 'Получение списка рапортов', well }
|
||||
)
|
||||
}, [well])
|
||||
|
||||
|
@ -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])
|
||||
|
||||
|
@ -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])
|
||||
|
||||
|
@ -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') },
|
||||
|
@ -95,8 +95,8 @@ const Messages = memo(() => {
|
||||
})
|
||||
},
|
||||
setShowLoader,
|
||||
`Не удалось загрузить сообщения по скважине "${well.caption}"`,
|
||||
'Полученик списка сообщений'
|
||||
`Не удалось загрузить сообщения`,
|
||||
{ actionName: 'Полученик списка сообщений', well }
|
||||
)
|
||||
}, [well, page, categories, range, searchString])
|
||||
|
||||
|
@ -33,8 +33,8 @@ export const DrillerSchedule = memo(({ drillers, loading, onChange }) => {
|
||||
setSchedule(schedule)
|
||||
},
|
||||
setShowLoader,
|
||||
`Не удалось загрузить расписания по скважине "${well.caption}"`,
|
||||
'Получение списка расписаний',
|
||||
`Не удалось загрузить расписания`,
|
||||
{ actionName: 'Получение списка расписаний', well }
|
||||
), [well])
|
||||
|
||||
const onModalOpen = useCallback(() => {
|
||||
|
@ -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])
|
||||
|
||||
|
@ -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])
|
||||
|
||||
|
@ -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',
|
||||
|
@ -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 (
|
||||
|
@ -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 () => {
|
||||
|
@ -18,7 +18,8 @@ export const WirelineRunOut = memo(() => {
|
||||
setTwro(twro)
|
||||
},
|
||||
setIsLoading,
|
||||
`Не удалось получить данные по талевому канату скважины "${well.caption}"`
|
||||
`Не удалось получить данные по талевому канату`,
|
||||
{ actionName: 'Получение данных по талевому канату', well }
|
||||
), [well])
|
||||
|
||||
const onTooltipVisibleChanged = useCallback((visible) => {
|
||||
|
@ -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])
|
||||
|
||||
|
@ -53,7 +53,8 @@ const Well = memo(() => {
|
||||
setWell(newWell)
|
||||
},
|
||||
undefined,
|
||||
`Не удалось изменить данные скважины "${well.caption}"`
|
||||
`Не удалось изменить данные скважины`,
|
||||
{ actionName: 'Изменение данных скважины', well }
|
||||
), [well])
|
||||
|
||||
return (
|
||||
|
@ -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}>
|
||||
|
@ -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'}>
|
||||
|
@ -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 (
|
||||
|
@ -92,7 +92,8 @@ export const TLChart = memo(({
|
||||
}).flat())
|
||||
},
|
||||
setIsLoading,
|
||||
`Не удалось загрузить список операций по скважине "${well.caption}"`
|
||||
`Не удалось загрузить список операций`,
|
||||
{ actionName: 'Получение списка операций', well }
|
||||
)
|
||||
}, [well])
|
||||
|
||||
|
@ -84,7 +84,8 @@ export const TLPie = memo(({ well }) => {
|
||||
setStats(stats)
|
||||
},
|
||||
setIsLoading,
|
||||
`Не удалось загрузить статистику автоопределённых операций по скважине "${well.caption}"`
|
||||
`Не удалось загрузить статистику автоопределённых операций`,
|
||||
{ actionName: 'Получение статистики автоопределённых операций', well }
|
||||
)
|
||||
}, [well])
|
||||
|
||||
|
@ -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'
|
||||
|
||||
export const makeGetColor = (types) => (type) => {
|
||||
if (!type) return '#0008'
|
||||
const raw = [
|
||||
const operationsColors = [
|
||||
'#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]
|
||||
export const makeGetColor = (types) => (type) => {
|
||||
if (!type) return '#0008'
|
||||
|
||||
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])
|
||||
|
||||
|
@ -49,8 +49,8 @@ export const WellDrillParams = memo(() => {
|
||||
setParams(params)
|
||||
},
|
||||
setShowLoader,
|
||||
`Не удалось загрузить список режимов бурения скважины "${well.caption}"`,
|
||||
'Получение списка режимов бурения скважины'
|
||||
`Не удалось загрузить список режимов бурения`,
|
||||
{ actionName: 'Получение списка режимов бурения скважины', well }
|
||||
), [well])
|
||||
|
||||
useEffect(() => {
|
||||
|
@ -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(() => {
|
||||
|
@ -57,8 +57,8 @@ export const WellSectionsStat = memo(() => {
|
||||
}
|
||||
},
|
||||
setShowLoader,
|
||||
`Не удалось получить статистику по секциям скважины "${well.caption}"`,
|
||||
'Получение статистики по секциям скважины'
|
||||
`Не удалось получить статистику по секциям`,
|
||||
{ actionName: 'Получение статистики по секциям', well }
|
||||
)
|
||||
}, [well])
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user