2021-08-18 18:01:46 +05:00
|
|
|
|
import { useState, useEffect } from 'react'
|
2021-08-19 15:07:24 +05:00
|
|
|
|
import { Input, DatePicker, Select } from 'antd'
|
|
|
|
|
import moment from 'moment'
|
2021-08-19 17:51:56 +05:00
|
|
|
|
import { EditableTable } from "../../components/EditableTable"
|
|
|
|
|
import LoaderPortal from '../../components/LoaderPortal'
|
|
|
|
|
import { makeColumn, RegExpIsFloat, invokeWebApiWrapperAsync } from '../../components/factory'
|
|
|
|
|
import { WellOperationService} from '../../services/api'
|
|
|
|
|
import { dictionarySectionType, getNameById } from './dictionary'
|
2021-08-19 15:07:24 +05:00
|
|
|
|
|
|
|
|
|
const { Option } = Select
|
|
|
|
|
const { TextArea } = Input;
|
|
|
|
|
|
|
|
|
|
const basePageSize = 160;
|
|
|
|
|
const format='YYYY.MM.DD HH:mm'
|
2021-08-18 18:01:46 +05:00
|
|
|
|
|
|
|
|
|
const numericColumnOptions = {
|
|
|
|
|
editable: true,
|
|
|
|
|
initialValue: 0,
|
2021-08-19 15:07:24 +05:00
|
|
|
|
width:100,
|
2021-08-18 18:01:46 +05:00
|
|
|
|
formItemRules: [
|
|
|
|
|
{
|
|
|
|
|
required: true,
|
|
|
|
|
message: `Введите число`,
|
|
|
|
|
pattern: RegExpIsFloat,
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
};
|
|
|
|
|
|
2021-08-19 15:07:24 +05:00
|
|
|
|
const DatePickerWrapper = ({value, onChange, ...other}) => {
|
|
|
|
|
return <DatePicker
|
|
|
|
|
allowClear={false}
|
|
|
|
|
defaultValue={moment()}
|
|
|
|
|
value={moment.utc(value).local()}
|
|
|
|
|
format={format}
|
|
|
|
|
showTime
|
|
|
|
|
onChange={(date) => onChange(date)}
|
|
|
|
|
{...other}
|
|
|
|
|
/>
|
|
|
|
|
}
|
2021-08-18 18:01:46 +05:00
|
|
|
|
|
2021-08-19 17:51:56 +05:00
|
|
|
|
export const WellOperationsEditor = ({idWell, idType}) => {
|
2021-08-18 18:01:46 +05:00
|
|
|
|
const [pageNumAndPageSize, setPageNumAndPageSize] = useState({current:1, pageSize:basePageSize})
|
|
|
|
|
const [paginationTotal, setPaginationTotal] = useState(0)
|
2021-08-19 15:07:24 +05:00
|
|
|
|
const [dictionaryOperationCategory, setDictionaryOperationCategory] = useState([])
|
2021-08-18 18:01:46 +05:00
|
|
|
|
const [operations, setOperations] = useState([])
|
|
|
|
|
const [showLoader, setShowLoader] = useState(false)
|
2021-08-19 15:07:24 +05:00
|
|
|
|
|
|
|
|
|
useEffect(() => invokeWebApiWrapperAsync(
|
|
|
|
|
async () => {
|
|
|
|
|
const r = await WellOperationService.getCategories(idWell)
|
|
|
|
|
setDictionaryOperationCategory(r)
|
|
|
|
|
}),[idWell])
|
2021-08-18 18:01:46 +05:00
|
|
|
|
|
|
|
|
|
const updateOperations = () => invokeWebApiWrapperAsync(
|
|
|
|
|
async () => {
|
|
|
|
|
const skip = ((pageNumAndPageSize.current - 1) * pageNumAndPageSize.pageSize) || 0
|
|
|
|
|
const take = pageNumAndPageSize.pageSize
|
2021-08-19 15:07:24 +05:00
|
|
|
|
const paginatedOperations = await WellOperationService.getOperations(idWell, idType, undefined, undefined, undefined, undefined, skip, take )
|
|
|
|
|
const operations = paginatedOperations?.items ?? []
|
|
|
|
|
setOperations(operations)
|
2021-08-18 18:01:46 +05:00
|
|
|
|
const total = paginatedOperations.count?? paginatedOperations.items?.length ?? 0
|
|
|
|
|
setPaginationTotal(total)
|
|
|
|
|
},
|
|
|
|
|
setShowLoader,
|
|
|
|
|
'Не удалось загрузить список операций по скважине'
|
|
|
|
|
)
|
|
|
|
|
|
2021-08-19 15:07:24 +05:00
|
|
|
|
useEffect(updateOperations, [idWell, idType, pageNumAndPageSize])
|
2021-08-18 18:01:46 +05:00
|
|
|
|
|
2021-08-19 15:07:24 +05:00
|
|
|
|
const SelectorSectionType = <Select>
|
|
|
|
|
{dictionarySectionType.map(item =><Option
|
|
|
|
|
key={item.id}
|
|
|
|
|
value={item.id}>
|
|
|
|
|
{item.name}
|
|
|
|
|
</Option>)}
|
|
|
|
|
</Select>
|
2021-08-18 18:01:46 +05:00
|
|
|
|
|
2021-08-19 15:07:24 +05:00
|
|
|
|
const SelectorOperationCategory = <Select>
|
|
|
|
|
{dictionaryOperationCategory.map(item =><Option
|
|
|
|
|
key={item.id}
|
|
|
|
|
value={item.id}>
|
|
|
|
|
{item.name}
|
|
|
|
|
</Option>)}
|
|
|
|
|
</Select>
|
2021-08-18 18:01:46 +05:00
|
|
|
|
|
2021-08-19 15:07:24 +05:00
|
|
|
|
const columns = [
|
|
|
|
|
makeColumn('Конструкция секции','idWellSectionType', {
|
|
|
|
|
editable:true,
|
|
|
|
|
input:SelectorSectionType,
|
|
|
|
|
width:105,
|
|
|
|
|
render:(_, record)=>getNameById(dictionarySectionType, record.idWellSectionType)
|
|
|
|
|
}),
|
|
|
|
|
makeColumn('Операция','idCategory', {
|
|
|
|
|
editable:true,
|
|
|
|
|
input:SelectorOperationCategory,
|
|
|
|
|
width:200,
|
|
|
|
|
render:(_, record)=>getNameById(dictionaryOperationCategory, record.idCategory)
|
|
|
|
|
}),
|
|
|
|
|
makeColumn('Доп. инфо','categoryInfo', {editable:true, width:300, input:<TextArea/>}),
|
|
|
|
|
makeColumn('Глубина забоя','wellDepth', {...numericColumnOptions}),
|
|
|
|
|
makeColumn('Время начала','startDate', {
|
|
|
|
|
editable:true,
|
|
|
|
|
width:200,
|
|
|
|
|
input:<DatePickerWrapper/>,
|
|
|
|
|
render:(_, record) => moment.utc(record.startDate).local().format(format)
|
|
|
|
|
}),
|
|
|
|
|
makeColumn('Часы','durationHours', {...numericColumnOptions}),
|
|
|
|
|
makeColumn('Комментарий','comment', {editable:true, input:<TextArea/>}),
|
|
|
|
|
]
|
2021-08-18 18:01:46 +05:00
|
|
|
|
|
2021-08-19 15:07:24 +05:00
|
|
|
|
const onAdd = async (operation) => {
|
|
|
|
|
operation.idType = idType
|
|
|
|
|
await WellOperationService.insertRange(idWell, [operation])
|
|
|
|
|
updateOperations()
|
2021-08-18 18:01:46 +05:00
|
|
|
|
}
|
|
|
|
|
|
2021-08-19 15:07:24 +05:00
|
|
|
|
const onEdit= async (operation) => {
|
|
|
|
|
if(!operation.id)
|
|
|
|
|
return
|
|
|
|
|
operation.idType = idType
|
|
|
|
|
await WellOperationService.update(idWell, operation.id, operation)
|
|
|
|
|
updateOperations()
|
|
|
|
|
}
|
2021-08-18 18:01:46 +05:00
|
|
|
|
|
2021-08-19 15:07:24 +05:00
|
|
|
|
const onDelete= async (operation) => {
|
|
|
|
|
if(!operation.id)
|
|
|
|
|
return
|
|
|
|
|
await WellOperationService.delete(idWell, operation.id)
|
|
|
|
|
updateOperations()
|
2021-08-18 18:01:46 +05:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return <LoaderPortal show={showLoader}>
|
|
|
|
|
<EditableTable
|
2021-08-19 15:07:24 +05:00
|
|
|
|
size='small'
|
2021-08-18 18:01:46 +05:00
|
|
|
|
columns={columns}
|
|
|
|
|
dataSource={operations}
|
|
|
|
|
onRowAdd={onAdd}
|
|
|
|
|
onRowEdit={onEdit}
|
|
|
|
|
onRowDelete={onDelete}
|
|
|
|
|
pagination={{
|
|
|
|
|
current: pageNumAndPageSize.current,
|
|
|
|
|
pageSize: pageNumAndPageSize.pageSize,
|
|
|
|
|
showSizeChanger: false,
|
|
|
|
|
total: paginationTotal,
|
|
|
|
|
onChange: (page, pageSize) => setPageNumAndPageSize({current: page, pageSize: pageSize})
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
</LoaderPortal>
|
|
|
|
|
}
|