Add Measure Editor

This commit is contained in:
Фролов 2021-08-30 16:40:56 +05:00
parent 7a7a4663c5
commit 30b5ac8eb3
8 changed files with 236 additions and 162 deletions

View File

@ -0,0 +1,95 @@
import { useState, useEffect } from 'react'
import moment from 'moment'
import { EditableTable, DatePickerWrapper } from '../../components/Table'
import LoaderPortal from '../../components/LoaderPortal'
import { invokeWebApiWrapperAsync } from '../../components/factory'
import { MeasureService } from '../../services/api'
const format='YYYY.MM.DD HH:mm'
const columnTimestamp = {
editable: true,
title: 'Время',
key:'timestamp',
dataindex:'timestamp',
input: <DatePickerWrapper/>,
width:'12em',
render: (text, record, idx) => record['timestamp'],
}
export const Editor = ({idWell, idCategory, columns, onUpdate}) => {
const [showLoader, setShowLoader] = useState(false)
const [history, setHistory] = useState([])
const update = () => invokeWebApiWrapperAsync(async()=>{
const data = await MeasureService.getHisory(idWell, idCategory)
const story = data?.map( i=> ({
id: i.id,
idWell: i.idWell,
idCategory: i.idCategory,
timestamp: moment.utc(i.timestamp).local().format(format),
...i.data}))
setHistory(story??[])
}
, setShowLoader
, "не удалось загрузить")
useEffect(update, [idWell, idCategory])
const onAdd = async (row) => {
const {id, idCategory: _idCategory, idWell : _idWell, timestamp, key, ...data} = row
const measure = {
id:0,
idWell: idWell,
idCategory: idCategory,
timestamp: timestamp?? moment(),
data,
}
await MeasureService.insert(idWell, measure)
if(onUpdate)
onUpdate()
else
update()
}
const onEdit = async (row) => {
if(!row?.id)
return
const {id, idCategory: _idCategory, idWell : _idWell, timestamp, ...data} = row
const measure = {
id: id,
idWell: idWell,
idCategory: idCategory,
timestamp: timestamp?? moment(),
data,
}
await MeasureService.update(idWell, measure)
if(onUpdate)
onUpdate()
else
update()
}
const onDelete = async (row) => {
if(!row?.id)
return
await MeasureService.markAsDelete(idWell, row.id)
if(onUpdate)
onUpdate()
else
update()
}
return <LoaderPortal show={showLoader}>
<EditableTable
bordered
dataSource = {history}
columns = {[columnTimestamp,...columns]}
onRowAdd = {onAdd}
onRowEdit = {onEdit}
onRowDelete = {onDelete}
size = 'small'
scroll={{ x: 400, y: 600 }}
/>
</LoaderPortal>
}

View File

@ -1,27 +1,54 @@
import { useState, useEffect } from 'react' import { useState, useEffect } from 'react'
import { Table } from 'antd' import { Table, Button, Modal } from 'antd'
import { HourglassOutlined } from '@ant-design/icons'
import LoaderPortal from '../../components/LoaderPortal' import LoaderPortal from '../../components/LoaderPortal'
import { invokeWebApiWrapperAsync } from '../../components/factory' import { invokeWebApiWrapperAsync } from '../../components/factory'
import { MeasureService } from '../../services/api' import { MeasureService } from '../../services/api'
import { Editor } from './Editor'
export const MeasureTable = ({idWell, idCategory, title, columns}) => { export const MeasureTable = ({idWell, idCategory, title, columns}) => {
const [showLoader, setShowLoader] = useState(false) const [showLoader, setShowLoader] = useState(false)
const [lastData, setLastData] = useState([]) const [showEditor, setShowEditor] = useState(false)
const [lastData, setLastData] = useState({})
useEffect(()=>invokeWebApiWrapperAsync(async()=>{ const update = ()=>invokeWebApiWrapperAsync(async()=>{
const data = await MeasureService.getLast(idWell, idCategory) const data = await MeasureService.getLast(idWell, idCategory)
setLastData(data) setLastData(data)
} }
, setShowLoader , setShowLoader
, "не удалось загрузить") , "не удалось загрузить")
, [idWell, idCategory])
useEffect(update, [idWell, idCategory])
const timestamp = lastData ? new Date(lastData?.timestamp).toLocaleString() : '-'
return <LoaderPortal show={showLoader}> return <LoaderPortal show={showLoader}>
<h3>{title}</h3> <h3>{title}</h3>
<span>дата: {lastData?.timestamp}</span> <span>Дата: {timestamp}</span>
&nbsp;
<Button
onClick={() => setShowEditor(true)}
icon={<HourglassOutlined/>}>История</Button>
<Table <Table
style={{marginTop:16}}
bordered
dataSource = {[lastData?.data]} dataSource = {[lastData?.data]}
columns = {columns} columns = {columns}
/> scroll={{ x: 400, y: 600 }}/>
<Modal
title={title}
centered
visible={showEditor}
onOk={() => setShowEditor(false)}
onCancel={() => setShowEditor(false)}
width="95%"
footer={null}
>
<Editor
idWell={idWell}
idCategory={idCategory}
columns = {columns}
onUpdate={update}/>
</Modal>
</LoaderPortal> </LoaderPortal>
} }

View File

@ -1,68 +0,0 @@
import {Button, Modal } from "antd";
import {DrillingFluid} from "../../components/modalWindows/DrillingFluid";
import {useState} from "react";
import {SludgeDiagram} from "../../components/modalWindows/MudDiagram";
import {Nnb} from "../../components/modalWindows/Nnb"
export default function LastData(/*{idWell}*/) {
const [tableVisible, setCementTableVisible] = useState(false)
const [tableSludgeVisible, setTableSludgeVisible] = useState(false)
const [tableNNBVisible, setTableNNBVisible] = useState(false)
return (
<>
<div>&nbsp;</div>
<Button type="primary" onClick={() => setCementTableVisible(true)}>
Последний замер бурового раствора
</Button>
<Modal
title='Последние показатели бурового раствора'
centered
visible={tableVisible}
onCancel={() => setCementTableVisible(false)}
width={2000}
footer={[
<Button key="back" onClick={() => setCementTableVisible(false)}>
Закрыть
</Button>
]}
>
<DrillingFluid/>
</Modal>
<Button type="primary" onClick={() => setTableSludgeVisible(true)} style={{marginLeft: "5px"}}>
Шламограмма
</Button>
<Modal
title='Шламограмма'
centered
visible={tableSludgeVisible}
onCancel={() => setTableSludgeVisible(false)}
width={2000}
footer={[
<Button key="back" onClick={() => setTableSludgeVisible(false)}>
Закрыть
</Button>
]}
>
<SludgeDiagram/>
</Modal>
<Button type="primary" onClick={() => setTableNNBVisible(true)} style={{marginLeft: "5px"}}>
ННБ
</Button>
<Modal
title='ННБ'
centered
visible={tableNNBVisible}
onCancel={() => setTableNNBVisible(false)}
width={2000}
footer={[
<Button key="back" onClick={() => setTableNNBVisible(false)}>
Закрыть
</Button>
]}
>
<Nnb/>
</Modal>
</>)
}

View File

@ -0,0 +1,31 @@
import {RegExpIsFloat} from '../../components/Table'
import {Input} from 'antd'
const {TextArea} = Input
export const v = (text) => <div
style={{
writingMode:'vertical-rl',
textOrientation: 'mixed',
verticalAlign: 'top',
}}>
{text}
</div>
export const numericColumnOptions = {
editable: true,
initialValue: 0,
width:'5em',
formItemRules: [
{
required: true,
message: `Введите число`,
pattern: RegExpIsFloat,
},
],
};
export const textColumnOptions = {
editable:true,
input:<TextArea/>,
width:'20em'}

View File

@ -1,44 +1,33 @@
import { makeColumn } from "../../components/Table"; import { makeColumn } from "../../components/Table";
import {v, numericColumnOptions, textColumnOptions} from './columnsCommon'
export const columnsDrillingFluid = [ export const columnsDrillingFluid = [
makeColumn("Наименование", "name"), makeColumn("Наименование", "name", textColumnOptions),
makeColumn("Температура, °C", "temperature"), makeColumn(v("Температура, °C"), "temperature",numericColumnOptions),
makeColumn("Плотность, г/см³", "density"), makeColumn(v("Плотность, г/см³"), "density",numericColumnOptions),
makeColumn("Усл. вязкость, сек", "conditionalViscosity"), makeColumn(v("Усл. вязкость, сек"), "conditionalViscosity",numericColumnOptions),
makeColumn("R300", "r300"), makeColumn(v("R300"), "r300",numericColumnOptions),
makeColumn("R600", "r600"), makeColumn(v("R600"), "r600",numericColumnOptions),
makeColumn("R3/R6", "r3r6"), makeColumn(v("R3/R6"), "r3r6",numericColumnOptions),
makeColumn("ДНС, дПа", "dnsDpa"), makeColumn(v("ДНС, дПа"), "dnsDpa",numericColumnOptions),
makeColumn("Пластич. вязкость, сПз", "plasticViscocity"), makeColumn(v("Пластич. вязкость, сПз"), "plasticViscocity",numericColumnOptions),
makeColumn("СНС, дПа", "snsDpa"), makeColumn(v("СНС, дПа"), "snsDpa",numericColumnOptions),
makeColumn("R3/R6 49С", "r3r649С"), makeColumn(v("R3/R6 49С"), "r3r649С",numericColumnOptions),
makeColumn("ДНС 49С, дПа", "dns49Cdpa"), makeColumn(v("ДНС 49С, дПа"), "dns49Cdpa",numericColumnOptions),
makeColumn("Пластич. вязкость 49С, сПз", "plasticViscocity49c"), makeColumn(v("Пластич. вязкость 49С, сПз"), "plasticViscocity49c",numericColumnOptions),
makeColumn("СНС 49С, дПа", "sns49Cdpa"), makeColumn(v("СНС 49С, дПа"), "sns49Cdpa",numericColumnOptions),
makeColumn("МВТ, кг/м³", "mbt"), makeColumn(v("МВТ, кг/м³"), "mbt",numericColumnOptions),
makeColumn("Песок, %", "sand"), makeColumn(v("Песок, %"), "sand",numericColumnOptions),
makeColumn("Фильтрация, см³/30мин", "filtering"), makeColumn(v("Фильтрация, см³/30мин"), "filtering",numericColumnOptions),
makeColumn("Корка, мм", "crust"), makeColumn(v("Корка, мм"), "crust",numericColumnOptions),
makeColumn("KTK", "ktk"), makeColumn(v("KTK"), "ktk",numericColumnOptions),
makeColumn("pH", "ph"), makeColumn(v("pH"), "ph",numericColumnOptions),
makeColumn("Жесткость, мг/л", "hardness"), makeColumn(v("Жесткость, мг/л"), "hardness",numericColumnOptions),
makeColumn("Хлориды, мг/л", "chlorides"), makeColumn(v("Хлориды, мг/л"), "chlorides",numericColumnOptions),
makeColumn("PF", "pf", { makeColumn(v("PF"), "pf",numericColumnOptions),
render: (text) => ( makeColumn(v("Mf"), "mf",numericColumnOptions),
<span style={{ marginLeft: "12px", marginRight: "12px" }}>{text}</span> makeColumn(v("Pm"), "pm",numericColumnOptions),
), makeColumn(v("Твердая фаза раствора, %"), "fluidSolidPhase",numericColumnOptions),
}), makeColumn(v("Смазка, %"), "grease",numericColumnOptions),
makeColumn("Mf", "mf", { makeColumn(v("Карбонат кальция, кг/м³"), "calciumCarbonate",numericColumnOptions),
render: (text) => (
<span style={{ marginLeft: "12px", marginRight: "12px" }}>{text}</span>
),
}),
makeColumn("Pm", "pm", {
render: (text) => (
<span style={{ marginLeft: "12px", marginRight: "12px" }}>{text}</span>
),
}),
makeColumn("Твердая фаза раствора, %", "fluidSolidPhase"),
makeColumn("Смазка, %", "grease"),
makeColumn("Карбонат кальция, кг/м³", "calciumCarbonate"),
]; ];

View File

@ -1,40 +1,39 @@
import {makeColumn} from '../../components/Table' import {makeColumn} from '../../components/Table'
import {v, numericColumnOptions, textColumnOptions} from './columnsCommon'
export const columnsMudDiagram = [ export const columnsMudDiagram = [
makeColumn('N пробы', 'probeNumber', { className: 'yellow-background'}), makeColumn(v('N пробы'), 'probeNumber', numericColumnOptions),
makeColumn('Глубина отбора пробы', 'probeExtractionDepth', { className: 'yellow-background'}), makeColumn(v('Глубина отбора пробы'), 'probeExtractionDepth', numericColumnOptions),
{ {
title: 'Литология', title: 'Литология',
key: 'lithology', key: 'lithology',
children: [ children: [
makeColumn('Песчаник (%)', 'sandstone', { className: 'lightpurple-background'}), makeColumn(v('Песчаник (%)'), 'sandstone', numericColumnOptions),
makeColumn('Алевролит (%)', 'siltstone', { className: 'lightpurple-background'}), makeColumn(v('Алевролит (%)'), 'siltstone', numericColumnOptions),
makeColumn('Аргиллит (%)', 'argillit', { className: 'lightpurple-background'}), makeColumn(v('Аргиллит (%)'), 'argillit', numericColumnOptions),
makeColumn('Аргиллит бит. (%)', 'brokenArgillit', { className: 'lightpurple-background'}), makeColumn(v('Аргиллит бит. (%)'), 'brokenArgillit', numericColumnOptions),
makeColumn('Уголь (%)', 'coal', { className: 'lightpurple-background'}), makeColumn(v('Уголь (%)'), 'coal', numericColumnOptions),
makeColumn('Песок (%)', 'sand', { className: 'lightpurple-background'}), makeColumn(v('Песок (%)'), 'sand', numericColumnOptions),
makeColumn('Глина (%)', 'clay', { className: 'lightpurple-background'}), makeColumn(v('Глина (%)'), 'clay', numericColumnOptions),
makeColumn('Известняк (%)', 'camstone', { className: 'lightpurple-background'}), makeColumn(v('Известняк (%)'), 'camstone', numericColumnOptions),
makeColumn('Цемент (%)', 'cement', { className: 'lightpurple-background'}) makeColumn(v('Цемент (%)'), 'cement', numericColumnOptions),
] ]
}, },
makeColumn('Краткое описание', 'summary', { className: 'yellow-background'}), makeColumn('Краткое описание', 'summary', textColumnOptions),
makeColumn('ЛБА бурового раствора', 'drillingMud', { className: 'lightgray-background'}), makeColumn(v('ЛБА бурового раствора'), 'drillingMud', numericColumnOptions),
makeColumn('ЛБА (шлама)', 'sludge', { className: 'lightorange-background'}), makeColumn(v('ЛБА (шлама)'), 'sludge', numericColumnOptions),
{ {
title: 'Газопоказания', title: 'Газопоказания',
key: 'gasIndications', key: 'gasIndications',
align: 'center',
className: 'yellow-background',
children: [ children: [
makeColumn('Сумма УВ мах. (абс%)', 'maxSum', { className: 'lightpurple-background'}), makeColumn(v('Сумма УВ мах. (абс%)'), 'maxSum', numericColumnOptions),
makeColumn('С1 метан (отн%)', 'methane', { className: 'lightpurple-background'}), makeColumn(v('С1 метан (отн%)'), 'methane', numericColumnOptions),
makeColumn('С2 этан (отн%)', 'ethane', { className: 'lightpurple-background'}), makeColumn(v('С2 этан (отн%)'), 'ethane', numericColumnOptions),
makeColumn('С3 пропан (отн%)', 'propane', { className: 'lightpurple-background'}), makeColumn(v('С3 пропан (отн%)'), 'propane', numericColumnOptions),
makeColumn('С4 бутан (отн%)', 'butane', { className: 'lightpurple-background'}), makeColumn(v('С4 бутан (отн%)'), 'butane', numericColumnOptions),
makeColumn('С5 пентан (отн%)', 'pentane', { className: 'lightpurple-background'}) makeColumn(v('С5 пентан (отн%)'), 'pentane', numericColumnOptions),
] ]
}, },
makeColumn('Мех. скорость', 'mechanicalSpeed', { className: 'yellow-background'}), makeColumn(v('Мех. скорость'), 'mechanicalSpeed', numericColumnOptions),
makeColumn('Предварительное заключение о насыщении по ГК', 'preliminaryConclusion', { className: 'lightorange-background'}), makeColumn('Предварительное заключение о насыщении по ГК', 'preliminaryConclusion', textColumnOptions),
]; ]

View File

@ -1,21 +1,22 @@
import { makeColumn } from '../../components/Table' import { makeColumn } from '../../components/Table'
import {v, numericColumnOptions, textColumnOptions} from './columnsCommon'
export const columnsNnb = [ export const columnsNnb = [
makeColumn('Глубина по стволу, м', 'depth'), makeColumn('Глубина по стволу, м', 'depth', textColumnOptions),
makeColumn('Зенитный угол, град', 'zenithAngle'), makeColumn(v('Зенитный угол, град'), 'zenithAngle', numericColumnOptions),
makeColumn('Азимут магнитный, град', 'magneticAzimuth'), makeColumn(v('Азимут магнитный, град'), 'magneticAzimuth', numericColumnOptions),
makeColumn('Азимут истинный, град', 'trueAzimuth'), makeColumn(v('Азимут истинный, град'), 'trueAzimuth', numericColumnOptions),
makeColumn('Азимут дирекц., град', 'directAzimuth'), makeColumn(v('Азимут дирекц., град'), 'directAzimuth', numericColumnOptions),
makeColumn('Глубина по вертикали, м', 'verticalDepth'), makeColumn(v('Глубина по вертикали, м'), 'verticalDepth', numericColumnOptions),
makeColumn('Абсолютная отметка, м', 'absoluteMark'), makeColumn(v('Абсолютная отметка, м'), 'absoluteMark', numericColumnOptions),
makeColumn('Лок. смещение к северу, м', 'localNorthOffset'), makeColumn(v('Лок. смещение к северу, м'), 'localNorthOffset', numericColumnOptions),
makeColumn('Лок. смещение к востоку, м', 'localEastOffset'), makeColumn(v('Лок. смещение к востоку, м'), 'localEastOffset', numericColumnOptions),
makeColumn('Отклонение от устья, м', 'outFallOffset'), makeColumn(v('Отклонение от устья, м'), 'outFallOffset', numericColumnOptions),
makeColumn('Азимут смещения, град', 'offsetAzimuth'), makeColumn(v('Азимут смещения, град'), 'offsetAzimuth', numericColumnOptions),
makeColumn('Пространст. интенсивность, град/10 м', 'areaIntensity'), makeColumn(v('Пространст. интенсивность, град/10 м'), 'areaIntensity', numericColumnOptions),
makeColumn('Угол установки отклон., град', 'offsetStopAngle'), makeColumn(v('Угол установки отклон., град'), 'offsetStopAngle', numericColumnOptions),
makeColumn('Интенсив. по зениту, град/10 м', 'zenithIntensity'), makeColumn(v('Интенсив. по зениту, град/10 м'), 'zenithIntensity', numericColumnOptions),
makeColumn('Комментарий', 'comment'), makeColumn(v('Комментарий'), 'comment', numericColumnOptions),
makeColumn('Разница вертикальных глубин между ХХХ (план) и ХХХ (факт)', 'depthPlanFactDifference'), makeColumn(v('Разница вертикальных глубин\nмежду планом и фактом'), 'depthPlanFactDifference', numericColumnOptions),
makeColumn('Расстояние в пространстве между ХХХ (план) и ХХХ (факт)', 'distancePlanFactDifference'), makeColumn(v('Расстояние в пространстве\nмежду планом и фактом'), 'distancePlanFactDifference', numericColumnOptions),
]; ];

View File

@ -1,6 +1,6 @@
import { columnsMudDiagram} from './columnsMudDiagram' import { columnsMudDiagram} from './columnsMudDiagram'
// import { columnsDrillingFluid} from './columnsDrillingFluid' import { columnsDrillingFluid} from './columnsDrillingFluid'
// import { columnsNnb } from './columnsNnb' import { columnsNnb } from './columnsNnb'
import { MeasureTable } from './MeasureTable' import { MeasureTable } from './MeasureTable'
export default function Measure({idWell}){ export default function Measure({idWell}){
@ -9,16 +9,16 @@ export default function Measure({idWell}){
idWell={idWell} idWell={idWell}
idCategory={1} idCategory={1}
title='Замер бурового раствора' title='Замер бурового раствора'
columns={columnsMudDiagram}/> columns={columnsDrillingFluid}/>
{/* <MeasureTable <MeasureTable
idWell={idWell} idWell={idWell}
idCategory={2} idCategory={2}
title='Шлабограмма' title='Шлабограмма'
columns={columnsDrillingFluid}/> columns={columnsMudDiagram}/>
<MeasureTable <MeasureTable
idWell={idWell} idWell={idWell}
idCategory={3} idCategory={3}
title='ННБ' title='ННБ'
columns={columnsNnb}/> */} columns={columnsNnb}/>
</> </>
} }