forked from ddrilling/asb_cloud_front
182 lines
6.2 KiB
JavaScript
182 lines
6.2 KiB
JavaScript
import { Link } from 'react-router-dom'
|
||
import { useState, useEffect } from 'react'
|
||
import { Tag, Button, Modal } from 'antd'
|
||
import { Table } from '../../components/Table'
|
||
import { LineChartOutlined, ProfileOutlined } from '@ant-design/icons'
|
||
import {
|
||
makeTextColumn,
|
||
makeGroupColumn,
|
||
makeColumn,
|
||
makeDateSorter,
|
||
makeNumericColumnPlanFact} from '../../components/Table'
|
||
import { calcAndUpdateStatsBySections, makeFilterMinMaxFunction } from './functions'
|
||
import { invokeWebApiWrapperAsync } from '../../components/factory'
|
||
import { Tvd } from '../WellOperations/Tvd'
|
||
import WellOperationsTable from './WellOperationsTable'
|
||
import { getOperations } from './functions'
|
||
import LoaderPortal from '../../components/LoaderPortal'
|
||
import PointerIcon from '../../components/PointerIcon'
|
||
|
||
const filtersMinMax = [
|
||
{ text: 'min', value: 'min' },
|
||
{ text: 'max', value: 'max' },
|
||
]
|
||
|
||
const filtersWellsType = []
|
||
const DAY_IN_MS = 1000 * 60 * 60 * 24
|
||
const ONLINE_DEADTIME = 600
|
||
|
||
export default function ClusterWells({statsWells}) {
|
||
|
||
const [selectedWellId, setSelectedWellId] = useState(0)
|
||
const [isTVDModalVisible, setIsTVDModalVisible] = useState(false)
|
||
const [isOpsModalVisible, setIsOpsModalVisible] = useState(false)
|
||
const [wellOperations, setWellOperations] = useState([])
|
||
const [tableData, setTableData] = useState([])
|
||
const [showLoader, setShowLoader] = useState(false)
|
||
|
||
useEffect(() => {
|
||
if (!isOpsModalVisible || selectedWellId <= 0) {
|
||
setWellOperations([])
|
||
return
|
||
}
|
||
invokeWebApiWrapperAsync(
|
||
async () => {
|
||
const operations = await getOperations(selectedWellId)
|
||
setWellOperations(operations.operations)
|
||
},
|
||
setShowLoader,
|
||
`Не удалось загрузить операции по скважине "${selectedWellId}"`,
|
||
)
|
||
}, [selectedWellId, isOpsModalVisible])
|
||
|
||
useEffect(() => {
|
||
let data = statsWells?.map((well) => {
|
||
if (!filtersWellsType.some((el) => el.text === well.wellType))
|
||
filtersWellsType.push({ text: well.wellType, value: well.wellType,})
|
||
|
||
return {
|
||
key: well.caption,
|
||
id: well.id,
|
||
caption: well.caption,
|
||
wellType: well.wellType,
|
||
factStart: well.total?.fact?.start,
|
||
factEnd: well.total?.fact?.end,
|
||
periodPlan: (new Date(well.total?.plan?.end) - new Date(well.total?.plan?.start)) / DAY_IN_MS,
|
||
periodFact: (new Date(well.total?.fact?.end) - new Date(well.total?.fact?.start)) / DAY_IN_MS,
|
||
rateOfPenetrationPlan: well.total?.plan?.rop,
|
||
rateOfPenetrationFact: well.total?.fact?.rop,
|
||
routeSpeedPlan: well.total?.plan?.routeSpeed,
|
||
routeSpeedFact: well.total?.fact?.routeSpeed,
|
||
notProductiveTimePlan: well.total?.plan?.nonProductiveHours,
|
||
notProductiveTimeFact: well.total?.fact?.nonProductiveHours,
|
||
companies: well.companies,
|
||
lastTelemetryDate: well.lastTelemetryDate,
|
||
idState: well.idState
|
||
}
|
||
})
|
||
|
||
calcAndUpdateStatsBySections(data ?? [], [
|
||
'factStart',
|
||
'factEnd',
|
||
'periodPlan',
|
||
'periodFact',
|
||
'rateOfPenetrationPlan',
|
||
'rateOfPenetrationFact',
|
||
'routeSpeedPlan',
|
||
'routeSpeedFact',
|
||
'notProductiveTime',
|
||
])
|
||
|
||
setTableData(data)
|
||
}, [statsWells])
|
||
|
||
const getDate = (str) => Number.isNaN(new Date(str).getTime()) ? '-' : new Date(str).toLocaleString()
|
||
|
||
const columns = [
|
||
makeTextColumn('скв №', 'caption', null, null,
|
||
(_, item) => (
|
||
<Link to={`/well/${item.id}`} style={{display: 'flex', alignItems: 'center'}}>
|
||
<PointerIcon
|
||
color={item.idState === 1 ? 'black' : 'gray'}
|
||
size={32}
|
||
online={item.lastTelemetryDate && ((new Date()).getTime() - Date.parse(item.lastTelemetryDate)) / 1000 < ONLINE_DEADTIME}
|
||
onlineColor={'currentColor'}
|
||
/>
|
||
{item.caption ?? '-'}
|
||
</Link>
|
||
)
|
||
),
|
||
makeTextColumn('Тип скв.', 'wellType', filtersWellsType, null, (text) => text ?? '-'),
|
||
makeGroupColumn('Фактические сроки', [
|
||
makeColumn('начало', 'factStart', { sorter: makeDateSorter('factStart'), render: getDate }),
|
||
makeColumn('окончание', 'factEnd', { sorter: makeDateSorter('factEnd'), render: getDate })
|
||
]),
|
||
makeNumericColumnPlanFact('Продолжительность', 'period', filtersMinMax, makeFilterMinMaxFunction),
|
||
makeNumericColumnPlanFact('МСП', 'rateOfPenetration', filtersMinMax, makeFilterMinMaxFunction),
|
||
makeNumericColumnPlanFact('Рейсовая скорость', 'routeSpeed', filtersMinMax, makeFilterMinMaxFunction),
|
||
makeNumericColumnPlanFact('НПВ, сут', 'notProductiveTime', filtersMinMax, makeFilterMinMaxFunction),
|
||
{
|
||
title: 'TVD',
|
||
key: 'tvd',
|
||
render: (value) => <Button onClick={()=> {
|
||
setSelectedWellId(value.id)
|
||
setIsTVDModalVisible(true)
|
||
}}><LineChartOutlined /></Button>,
|
||
align: 'center'
|
||
},
|
||
{
|
||
title: 'Операции',
|
||
key: 'operations',
|
||
render: (value) => <Button onClick={()=> {
|
||
setSelectedWellId(value.id)
|
||
setIsOpsModalVisible(true)
|
||
}}><ProfileOutlined /></Button>,
|
||
align: 'center'
|
||
},
|
||
{
|
||
title: 'Участники',
|
||
key: 'companies',
|
||
dataIndex: 'companies',
|
||
render: (item) => item?.map((company) => <Tag key={company.caption} color='blue'>{company.caption}</Tag>) ?? '-',
|
||
},
|
||
]
|
||
|
||
return (
|
||
<>
|
||
<Table
|
||
columns={columns}
|
||
dataSource={tableData}
|
||
size={'small'}
|
||
bordered
|
||
pagination={false}
|
||
rowKey={(record) => record.caption}
|
||
/>
|
||
|
||
<Modal
|
||
title={'TVD'}
|
||
centered
|
||
visible={isTVDModalVisible}
|
||
onCancel={() => setIsTVDModalVisible(false)}
|
||
width={1500}
|
||
footer={null}
|
||
>
|
||
<Tvd idWell={selectedWellId} />
|
||
</Modal>
|
||
|
||
<Modal
|
||
title={'Операции'}
|
||
centered
|
||
visible={isOpsModalVisible}
|
||
onCancel={() => setIsOpsModalVisible(false)}
|
||
width={1500}
|
||
footer={null}
|
||
>
|
||
<LoaderPortal show={showLoader}>
|
||
<WellOperationsTable wellOperations={wellOperations} />
|
||
</LoaderPortal>
|
||
</Modal>
|
||
</>
|
||
)
|
||
}
|