From fbc0c97b99cedc6244a0a2c68d077d595e92f357 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Fri, 8 Oct 2021 17:01:27 +0500 Subject: [PATCH] Update WellOperations and Tvd by new model --- src/pages/WellOperations/ChartTvD.jsx | 133 ++++++++++++++++++ src/pages/WellOperations/Tvd.jsx | 13 +- .../WellOperations/WellOperationsEditor.jsx | 29 +--- 3 files changed, 145 insertions(+), 30 deletions(-) create mode 100644 src/pages/WellOperations/ChartTvD.jsx diff --git a/src/pages/WellOperations/ChartTvD.jsx b/src/pages/WellOperations/ChartTvD.jsx new file mode 100644 index 0000000..499484f --- /dev/null +++ b/src/pages/WellOperations/ChartTvD.jsx @@ -0,0 +1,133 @@ +import {useEffect, useRef, useState} from 'react'; +import { + Chart, + TimeScale, + LinearScale, + Legend, + LineController, + PointElement, + LineElement +} from 'chart.js' +import 'chartjs-adapter-moment'; +import ChartDataLabels from 'chartjs-plugin-datalabels'; +import zoomPlugin from 'chartjs-plugin-zoom'; + +Chart.register(TimeScale, LinearScale, LineController, LineElement, PointElement, Legend, ChartDataLabels, zoomPlugin); + +const defaultOptions = { + responsive: true, + aspectRatio: 2.6, + interaction: { + intersect: false, + mode: 'index', + }, + scales: { + x:{ + display: true, + title: { + display: true + }, + type: 'time', + time: { + unit: 'hour', + displayFormats: { + 'hour': 'MM.DD' + } + }, + grid:{ + drawTicks: true, + }, + ticks: { + stepSize:3, + major:{enabled:true,}, + z: 1, + display : true, + textStrokeColor : "#fff", + textStrokeWidth : 2, + color:"#000", + } + }, + + y:{ + type:'linear', + position:'top', + reverse:true, + display: true, + title: { + display: false, + text: '' + }, + } + }, + parsing: { + xAxisKey: 'date', + yAxisKey: 'depth' + }, + elements:{ + point:{ + radius:1.7, + //backgroundColor:'#aaa', + //pointStyle:'triangle', + }, + }, + plugins:{ + legend:{ + display: true, + }, + datalabels: { + display: false, + }, + tooltip: { + enabled: true, + callbacks: { + label(tooltipItem) { + return tooltipItem.yLabel; + } + } + }, + } +} + +const makeDataset = (data, label, color, width=1.5, dash) => ({ + label: label, + data: data, + backgroundColor: color, + borderColor: color, + borderWidth: width, + borderDash: dash, +}) + +export default function ChartTvD({dataPlan, dataFact, dataPredict}) { + const chartRef = useRef(null) + const [chart, setChart] = useState() + + useEffect(() => { + let data = { + datasets: [ + makeDataset(dataFact, 'Факт', '#0A0'), + makeDataset(dataPredict, 'Прогноз', 'purple', 1, [7,3]), + makeDataset(dataPlan, 'План', '#C004', 4), + ] + } + + if((chartRef.current)&&(!chart)) { + let thisOptions = {} + Object.assign(thisOptions, defaultOptions) + + let newChart = new Chart(chartRef.current, { + type: 'line', + plugins: [ChartDataLabels], + options: thisOptions, + data: data + }) + setChart(newChart) + + return () => chart?.destroy() + } else { + chart.data = data + chart.update() + } + }, [chart, dataPlan, dataFact, dataPredict]) + + return () +} \ No newline at end of file diff --git a/src/pages/WellOperations/Tvd.jsx b/src/pages/WellOperations/Tvd.jsx index 14b574d..97922d2 100644 --- a/src/pages/WellOperations/Tvd.jsx +++ b/src/pages/WellOperations/Tvd.jsx @@ -1,4 +1,4 @@ -import ChartDepthToDay from '../../components/charts/ChartDepthToDay'; +import ChartTvD from './ChartTvD'; import { useState, useEffect } from 'react'; import { invokeWebApiWrapperAsync } from '../../components/factory'; import { getOperations } from '../Cluster/functions'; @@ -7,18 +7,15 @@ import { getOperations } from '../Cluster/functions'; export const Tvd = ({ idWell }) => { const [dataPlan, setDataPlan] = useState([]); const [dataFact, setDataFact] = useState([]); - const [dataForecast, setDataForecast] = useState([]); + const [dataPredict, setDataPredict] = useState([]); useEffect(() => { invokeWebApiWrapperAsync( async () => { const operations = await getOperations(idWell); - setDataPlan(operations.plan) - setDataFact(operations.fact) - - setDataForecast(operations.predict) + setDataPredict(operations.predict) }, null, `Не удалось загрузить операции по скважине "${idWell}"`, @@ -29,10 +26,10 @@ export const Tvd = ({ idWell }) => {

График Глубина-день

- + dataPredict={dataPredict} />
); diff --git a/src/pages/WellOperations/WellOperationsEditor.jsx b/src/pages/WellOperations/WellOperationsEditor.jsx index 8bacc16..1f07d86 100644 --- a/src/pages/WellOperations/WellOperationsEditor.jsx +++ b/src/pages/WellOperations/WellOperationsEditor.jsx @@ -6,10 +6,8 @@ import { DatePickerWrapper, SelectFromDictionary, makeColumn, - numericColumnOptions, - makeNumericSorter, makeDateSorter, - defaultNumericRender } from "../../components/Table" + makeNumericColumnOptions} from "../../components/Table" import LoaderPortal from '../../components/LoaderPortal' import { invokeWebApiWrapperAsync } from '../../components/factory' import { WellOperationService} from '../../services/api' @@ -20,20 +18,6 @@ const { TextArea } = Input; const basePageSize = 160; const format='YYYY.MM.DD HH:mm' -const numericSortColumnOptions = { - ...numericColumnOptions, - sorter: makeNumericSorter('wellDepth'), - render:(value) => -
- {value} -
-} - -const durationFormattedColumnOptions = { - ...numericColumnOptions, - render: defaultNumericRender -} - export const WellOperationsEditor = ({idWell, idType}) => { const [pageNumAndPageSize, setPageNumAndPageSize] = useState({current:1, pageSize:basePageSize}) const [paginationTotal, setPaginationTotal] = useState(0) @@ -81,19 +65,20 @@ export const WellOperationsEditor = ({idWell, idType}) => { render:(_, record)=>getByKeyOrReturnKey(dictionaryOperationCategory, record.idCategory) }), makeColumn('Доп. инфо','categoryInfo', {editable:true, width:300, input: