Removed WellStats' filters config from Table to WellStats

This commit is contained in:
KharchenkoVV 2021-08-30 12:13:30 +05:00
parent e063fac9ad
commit f6e896d8f3
5 changed files with 93 additions and 95 deletions

View File

@ -74,17 +74,6 @@ export const makeColumnsPlanFact = (title:string|any, key:string|string[], colum
} }
} }
const maxPrefix = "isMax"
const minPrefix = "isMin"
export const makeFilterMinMaxFunction = (key: string | number) => (filterValue: string | number,
dataItem: any) =>
filterValue === "max"
? dataItem[maxPrefix + key]
: filterValue === "min"
? dataItem[minPrefix + key]
: false
export const makeFilterTextMatch = (key: string | number) => (filterValue: string | number, dataItem: any) => export const makeFilterTextMatch = (key: string | number) => (filterValue: string | number, dataItem: any) =>
dataItem[key] === filterValue dataItem[key] === filterValue
@ -118,20 +107,20 @@ export const makeTextColumn = (title: any, dataIndex: any, filters: any, sorter:
...other ...other
}) })
export const makeNumericColumn = (title: any, dataIndex: any, filters: any, width: string) => ({ export const makeNumericColumn = (title: any, dataIndex: any, filters: any, filterDelegate: (key: string | number) => any, width: string) => ({
title: title, title: title,
dataIndex: dataIndex, dataIndex: dataIndex,
key: dataIndex, key: dataIndex,
filters: filters, filters: filters,
onFilter: makeFilterMinMaxFunction(dataIndex), onFilter: filterDelegate ? filterDelegate(dataIndex) : null,
sorter: makeNumericSorter(dataIndex), sorter: makeNumericSorter(dataIndex),
width: width width: width
}) })
export const makeNumericColumnPlanFact = (title: any, dataIndex: any, filters: any, width: string) => export const makeNumericColumnPlanFact = (title: any, dataIndex: any, filters: any, filterDelegate: (key: string | number) => any, width: string) =>
makeGroupColumn( title, [ makeGroupColumn( title, [
makeNumericColumn('п', dataIndex + 'Plan', filters, width), makeNumericColumn('п', dataIndex + 'Plan', filters, filterDelegate, width),
makeNumericColumn('ф', dataIndex + 'Fact', filters, width), makeNumericColumn('ф', dataIndex + 'Fact', filters, filterDelegate, width),
]) ])
type PaginationContainer = { type PaginationContainer = {

View File

@ -6,7 +6,8 @@ import {
makeTextColumn, makeTextColumn,
makeNumericColumnPlanFact makeNumericColumnPlanFact
} from "../../components/Table"; } from "../../components/Table";
import { calcAndUpdateStatsBySections } from "./index"; import { calcAndUpdateStatsBySections, makeFilterMinMaxFunction } from "./functions";
const filtersMinMax = [ const filtersMinMax = [
{ {
@ -62,29 +63,33 @@ const ModalWindowButton = ({
const columns = [ const columns = [
makeTextColumn("скв №", "caption"), makeTextColumn("скв №", "caption"),
makeTextColumn("Секция", "sectionType", filtersSectionsType), makeTextColumn("Секция", "sectionType", filtersSectionsType),
makeNumericColumnPlanFact("Глубина", "sectionWellDepth", filtersMinMax), makeNumericColumnPlanFact("Глубина", "sectionWellDepth", filtersMinMax, makeFilterMinMaxFunction),
makeNumericColumnPlanFact( makeNumericColumnPlanFact(
"Продолжительность", "Продолжительность",
"sectionBuildDays", "sectionBuildDays",
filtersMinMax filtersMinMax,
makeFilterMinMaxFunction
), //Цикл строительства ), //Цикл строительства
makeNumericColumnPlanFact("МСП", "sectionRateOfPenetration", filtersMinMax), makeNumericColumnPlanFact("МСП", "sectionRateOfPenetration", filtersMinMax, makeFilterMinMaxFunction),
makeNumericColumnPlanFact( makeNumericColumnPlanFact(
"Рейсовая скорость", "Рейсовая скорость",
"sectionRouteSpeed", "sectionRouteSpeed",
filtersMinMax filtersMinMax,
makeFilterMinMaxFunction
), ),
makeNumericColumnPlanFact("Спуск КНБК", "sectionBhaDownSpeed", filtersMinMax), //Скорость спуска КНБК makeNumericColumnPlanFact("Спуск КНБК", "sectionBhaDownSpeed", filtersMinMax, makeFilterMinMaxFunction), //Скорость спуска КНБК
makeNumericColumnPlanFact("Подъем КНБК", "sectionBhaUpSpeed", filtersMinMax), //Скорость подъема КНБК makeNumericColumnPlanFact("Подъем КНБК", "sectionBhaUpSpeed", filtersMinMax, makeFilterMinMaxFunction), //Скорость подъема КНБК
makeNumericColumnPlanFact( makeNumericColumnPlanFact(
"Скорость спуска ОК", "Скорость спуска ОК",
"sectionCasingDownSpeed", "sectionCasingDownSpeed",
filtersMinMax filtersMinMax,
makeFilterMinMaxFunction
), ),
makeNumericColumnPlanFact( makeNumericColumnPlanFact(
"НПВ, сут", "НПВ, сут",
"nonProductiveTime", "nonProductiveTime",
filtersMinMax, filtersMinMax,
makeFilterMinMaxFunction,
"70px" "70px"
), ),
{ {
@ -143,26 +148,22 @@ export default function ClusterSections({ clusterData }) {
useEffect(() => { useEffect(() => {
let rows = []; let rows = [];
clusterData.statsWells?.forEach((el) => { clusterData.statsWells?.forEach((well) => {
el.sections.forEach((section) => { well.sections.forEach((section) => {
let row = { let row = {
key: el.caption + section.id, key: well.caption + section.id,
id: el.caption + section.id, id: well.caption + section.id,
caption: el.caption, caption: well.caption,
sectionType: section.caption, sectionType: section.caption,
sectionWellDepthPlan: section.plan.wellDepthEnd, sectionWellDepthPlan: section.plan.wellDepthEnd,
sectionWellDepthFact: section.fact.wellDepthEnd, sectionWellDepthFact: section.fact.wellDepthEnd,
sectionBuildDaysPlan: ( sectionBuildDaysPlan: (
Math.abs( (new Date(section.plan.end) - new Date(section.plan.start)) /
new Date(section.plan.start) - new Date(section.plan.end) (1000 * 60 * 60 * 24)
) /
(1000 * 60 * 60 * 24)
).toFixed(2), ).toFixed(2),
sectionBuildDaysFact: ( sectionBuildDaysFact: (
Math.abs( (new Date(section.fact.end) - new Date(section.fact.start)) /
new Date(section.fact.start) - new Date(section.fact.end) (1000 * 60 * 60 * 24)
) /
(1000 * 60 * 60 * 24)
).toFixed(2), ).toFixed(2),
sectionRateOfPenetrationPlan: section.plan.rop.toFixed(2), sectionRateOfPenetrationPlan: section.plan.rop.toFixed(2),
sectionRateOfPenetrationFact: section.fact.rop.toFixed(2), sectionRateOfPenetrationFact: section.fact.rop.toFixed(2),
@ -176,7 +177,7 @@ export default function ClusterSections({ clusterData }) {
sectionCasingDownSpeedFact: section.fact.casingDownSpeed.toFixed(2), sectionCasingDownSpeedFact: section.fact.casingDownSpeed.toFixed(2),
nonProductiveTimePlan: section.plan.nonProductiveHours.toFixed(2), nonProductiveTimePlan: section.plan.nonProductiveHours.toFixed(2),
nonProductiveTimeFact: section.fact.nonProductiveHours.toFixed(2), nonProductiveTimeFact: section.fact.nonProductiveHours.toFixed(2),
companies: el.companies, companies: well.companies,
}; };
rows.push(row); rows.push(row);

View File

@ -8,7 +8,7 @@ import {
makeNumericColumn, makeNumericColumn,
makeNumericColumnPlanFact makeNumericColumnPlanFact
} from "../../components/Table"; } from "../../components/Table";
import { calcAndUpdateStatsBySections } from "./index"; import { calcAndUpdateStatsBySections, makeFilterMinMaxFunction } from "./functions";
import { invokeWebApiWrapperAsync } from '../../components/factory'; import { invokeWebApiWrapperAsync } from '../../components/factory';
import { WellOperationStatService } from '../../services/api'; import { WellOperationStatService } from '../../services/api';
import ChartDepthToDay from '../../components/charts/ChartDepthToDay'; import ChartDepthToDay from '../../components/charts/ChartDepthToDay';
@ -91,29 +91,29 @@ export default function ClusterWells({ clusterData }) {
]); ]);
useEffect(() => { useEffect(() => {
let tableData = clusterData.statsWells?.map((el) => { let tableData = clusterData.statsWells?.map((well) => {
return { return {
key: el.id, key: well.id,
id: el.id, id: well.id,
caption: el.caption, caption: well.caption,
wellType: el.wellType, wellType: well.wellType,
factStart: new Date(el.total.fact.start).toLocaleString(), factStart: new Date(well.total.fact.start).toLocaleString(),
factEnd: new Date(el.total.fact.end).toLocaleString(), factEnd: new Date(well.total.fact.end).toLocaleString(),
periodPlan: ( periodPlan: (
new Date(el.total.plan.start) - new Date(el.total.plan.end) / (new Date(well.total.plan.end) - new Date(well.total.plan.start)) /
(1000 * 60 * 60 * 24) (1000 * 60 * 60 * 24)
).toFixed(2), ).toFixed(2),
periodFact: ( periodFact: (
new Date(el.total.fact.start) - new Date(el.total.fact.end) / (new Date(well.total.fact.end) - new Date(well.total.fact.start)) /
(1000 * 60 * 60 * 24) (1000 * 60 * 60 * 24)
).toFixed(2), ).toFixed(2),
rateOfPenetrationPlan: el.total.plan.rop.toFixed(2), rateOfPenetrationPlan: well.total.plan.rop.toFixed(2),
rateOfPenetrationFact: el.total.fact.rop.toFixed(2), rateOfPenetrationFact: well.total.fact.rop.toFixed(2),
routeSpeedPlan: el.total.plan.routeSpeed.toFixed(2), routeSpeedPlan: well.total.plan.routeSpeed.toFixed(2),
routeSpeedFact: el.total.fact.routeSpeed.toFixed(2), routeSpeedFact: well.total.fact.routeSpeed.toFixed(2),
notProductiveTimePlan: el.total.plan.nonProductiveHours.toFixed(2), notProductiveTimePlan: well.total.plan.nonProductiveHours.toFixed(2),
notProductiveTimeFact: el.total.fact.nonProductiveHours.toFixed(2), notProductiveTimeFact: well.total.fact.nonProductiveHours.toFixed(2),
companies: el.companies, companies: well.companies,
}; };
}); });
@ -129,10 +129,10 @@ export default function ClusterWells({ clusterData }) {
makeNumericColumn("начало", "factStart"), makeNumericColumn("начало", "factStart"),
makeNumericColumn("окончание", "factEnd"), makeNumericColumn("окончание", "factEnd"),
]), ]),
makeNumericColumnPlanFact("Продолжительность", "period", filtersMinMax), makeNumericColumnPlanFact("Продолжительность", "period", filtersMinMax, makeFilterMinMaxFunction),
makeNumericColumnPlanFact("МСП", "rateOfPenetration", filtersMinMax), makeNumericColumnPlanFact("МСП", "rateOfPenetration", filtersMinMax, makeFilterMinMaxFunction),
makeNumericColumnPlanFact("Рейсовая скорость", "routeSpeed", filtersMinMax), makeNumericColumnPlanFact("Рейсовая скорость", "routeSpeed", filtersMinMax, makeFilterMinMaxFunction),
makeNumericColumnPlanFact("НПВ, сут", "notProductiveTime", filtersMinMax), makeNumericColumnPlanFact("НПВ, сут", "notProductiveTime", filtersMinMax, makeFilterMinMaxFunction),
{ {
title: "График глубина-день", title: "График глубина-день",
render: (_, item) => <Button onClick={()=> { render: (_, item) => <Button onClick={()=> {

View File

@ -0,0 +1,44 @@
const maxPrefix = "isMax"
const minPrefix = "isMin"
export const makeFilterMinMaxFunction = (key) => (filterValue,
dataItem) =>
filterValue === "max"
? dataItem[maxPrefix + key]
: filterValue === "min"
? dataItem[minPrefix + key]
: false
export const calcAndUpdateStats = (data, keys) => {
let mins = {}
let maxs = {}
keys.forEach((key) => {
maxs[key] = Number.MIN_VALUE
mins[key] = Number.MAX_VALUE
})
data.forEach((item) => {
keys.forEach((key) => {
if (mins[key] > item[key]) mins[key] = item[key]
if (maxs[key] < item[key]) maxs[key] = item[key]
})
})
for (let i = 0; i < data.length; i++) {
keys.forEach((key) => {
data[i][maxPrefix + key] = data[i][key] === maxs[key]
data[i][minPrefix + key] = data[i][key] === mins[key]
})
}
}
export const calcAndUpdateStatsBySections = (data, keys) => {
const sectionTypes = new Set()
data.forEach((item) => sectionTypes.add(item.sectionType))
sectionTypes.forEach(sectionType => {
const filteredBySectionData = data.filter((item) => item.sectionType === sectionType)
calcAndUpdateStats(filteredBySectionData, keys)
})
}

View File

@ -9,42 +9,6 @@ import { WellOperationStatService } from "../../services/api";
const { Content } = Layout; const { Content } = Layout;
const maxPrefix = "isMax"
const minPrefix = "isMin"
export const calcAndUpdateStats = (data, keys) => {
let mins = {}
let maxs = {}
keys.forEach((key) => {
maxs[key] = Number.MIN_VALUE
mins[key] = Number.MAX_VALUE
})
data.forEach((item) => {
keys.forEach((key) => {
if (mins[key] > item[key]) mins[key] = item[key]
if (maxs[key] < item[key]) maxs[key] = item[key]
})
})
for (let i = 0; i < data.length; i++) {
keys.forEach((key) => {
data[i][maxPrefix + key] = data[i][key] === maxs[key]
data[i][minPrefix + key] = data[i][key] === mins[key]
})
}
}
export const calcAndUpdateStatsBySections = (data, keys) => {
const sectionTypes = new Set()
data.forEach((item) => sectionTypes.add(item.sectionType))
sectionTypes.forEach(sectionType => {
const filteredBySectionData = data.filter((item) => item.sectionType === sectionType)
calcAndUpdateStats(filteredBySectionData, keys)
})
}
export default function Cluster() { export default function Cluster() {
let { idClaster, tab } = useParams(); let { idClaster, tab } = useParams();