diff --git a/package.json b/package.json
index 576e207..0cbd60b 100644
--- a/package.json
+++ b/package.json
@@ -14,9 +14,11 @@
"chartjs-plugin-datalabels": "^2.0.0-rc.1",
"chartjs-plugin-zoom": "^1.1.1",
"craco-less": "^1.17.1",
+ "immutability-helper": "^3.1.1",
"moment": "^2.29.1",
"pigeon-maps": "^0.19.7",
"react": "^17.0.2",
+ "react-dnd-html5-backend": "^14.0.0",
"react-dom": "^17.0.2",
"react-router-dom": "^5.2.0",
"react-scripts": "4.0.3",
diff --git a/src/components/CementFluid.jsx b/src/components/CementFluid.jsx
new file mode 100644
index 0000000..e69de29
diff --git a/src/components/Documents.jsx b/src/components/Documents.jsx
index a29a7dc..f6f10b8 100644
--- a/src/components/Documents.jsx
+++ b/src/components/Documents.jsx
@@ -13,8 +13,8 @@ const pageSize = 12
const {RangePicker} = DatePicker;
-export default function Documents({selectedFileCategory}) {
- let {id} = useParams()
+export default function Documents({idWell, selectedFileCategory}) {
+ // let {id} = useParams()
const [page, setPage] = useState(1)
const [range, setRange] = useState([])
@@ -32,7 +32,7 @@ export default function Documents({selectedFileCategory}) {
try {
setLoader(true)
- await fetch(`/api/files/${id}/${row.id}`, {
+ await fetch(`/api/files/${idWell}/${row.id}`, {
headers: {
Authorization: 'Bearer ' + localStorage['token']
}
@@ -101,7 +101,7 @@ export default function Documents({selectedFileCategory}) {
}
await FileService.getFilesInfo(
- `${id}`,
+ `${idWell}`,
(page - 1) * pageSize,
pageSize,
selectedFileCategory,
@@ -126,12 +126,12 @@ export default function Documents({selectedFileCategory}) {
}
)
} catch (ex) {
- notify(`Не удалось загрузить файлы по скважине "${id}"`, 'error')
+ notify(`Не удалось загрузить файлы по скважине "${idWell}"`, 'error')
console.log(ex)
}
}
GetDocuments()
- }, [id, range, page, selectedFileCategory, isTableUpdating])
+ }, [idWell, range, page, selectedFileCategory, isTableUpdating])
return (
diff --git a/src/components/MessageFilter.jsx b/src/components/MessageFilter.jsx
new file mode 100644
index 0000000..7b326d8
--- /dev/null
+++ b/src/components/MessageFilter.jsx
@@ -0,0 +1,35 @@
+import React, { useMemo, useState } from "react";
+
+export default function MessageFilter() {
+ return (
+
+
+
+ )
+}
+
+function List({ words }) {
+ const [searchString, setSearchString] = useState("")
+
+ function handleChange(e) {
+ setSearchString(e.target.value)
+ }
+
+ const filteredWords = useMemo(() => {
+ if (!searchString) {
+ return words
+ }
+ return words.filter((w) => w.includes(searchString))
+ }, [searchString, words])
+
+ return (
+ <>
+
+
+ {filteredWords.map((word, i) => (
+ - {word}
+ ))}
+
+ >
+ )
+}
\ No newline at end of file
diff --git a/src/components/Nnb.jsx b/src/components/Nnb.jsx
new file mode 100644
index 0000000..e69de29
diff --git a/src/components/SludgeDiagram.jsx b/src/components/SludgeDiagram.jsx
new file mode 100644
index 0000000..f423d83
--- /dev/null
+++ b/src/components/SludgeDiagram.jsx
@@ -0,0 +1,350 @@
+import { useState } from 'react';
+import {Table, Input, Form, Popconfirm, Typography } from 'antd'
+
+const originData = [
+ {
+ key: '1', probeNumber: '', probeExtractionDepth: '', sandstone: '', siltstone: '', argillit: '', brokenArgillit: '', coal: '', sand: '', clay: '',
+ camstone: '', cement: '', summary: '', drillingMud: '', sludge: '', maxSum: '', methan: '', ethan: '', propan: '', butan: '', pentan: ''
+ }
+]
+
+const EditableCell = ({
+ editing,
+ dataIndex,
+ title,
+ inputType,
+ record,
+ index,
+ children,
+ ...restProps
+}) => {
+ return (
+
+
+ {editing ? (
+
+
+
+ ) : (
+ children
+ )}
+
+ |
+ );
+};
+
+export function SludgeDiagram() {
+ const [form] = Form.useForm();
+ const [data, setData] = useState(originData);
+ const [editingKey, setEditingKey] = useState('');
+
+ const isEditing = (row) => row.key === editingKey;
+
+ const columns = [
+ {
+ title: 'N пробы',
+ key: 'probeNumber',
+ dataIndex: 'probeNumber',
+ align: 'center',
+ className: 'yellow-background',
+ editable: true
+ },
+ {
+ title: 'Глубина отбора пробы',
+ key: 'probeExtractionDepth',
+ dataIndex: 'probeExtractionDepth',
+ align: 'center',
+ className: 'yellow-background',
+ editable: true
+ },
+ {
+ title: 'Литология',
+ key: 'lithology',
+ dataIndex: 'lithology',
+ align: 'center',
+ className: 'yellow-background',
+ editable: true,
+ children: [
+ {
+ title: 'Песчаник (%)',
+ key: 'sandstone',
+ dataIndex: 'sandstone',
+ align: 'center',
+ className: 'lightpurple-background',
+ editable: true
+ },
+ {
+ title: 'Алевролит (%)',
+ key: 'siltstone',
+ dataIndex: 'siltstone',
+ align: 'center',
+ className: 'lightpurple-background',
+ editable: true
+ },
+ {
+ title: 'Аргиллит (%)',
+ key: 'argillit',
+ dataIndex: 'argillit',
+ align: 'center',
+ className: 'lightpurple-background',
+ editable: true
+ },
+ {
+ title: 'Аргиллит бит. (%)',
+ key: 'brokenArgillit',
+ dataIndex: 'verticalDepth',
+ align: 'center',
+ className: 'lightpurple-background',
+ editable: true
+ },
+ {
+ title: 'Уголь (%)',
+ key: 'coal',
+ dataIndex: 'coal',
+ align: 'center',
+ className: 'lightpurple-background',
+ editable: true
+ },
+ {
+ title: 'Песок (%)',
+ key: 'sand',
+ dataIndex: 'sand',
+ align: 'center',
+ className: 'lightpurple-background',
+ editable: true
+ },
+ {
+ title: 'Глина (%)',
+ key: 'clay',
+ dataIndex: 'clay',
+ align: 'center',
+ className: 'lightpurple-background',
+ editable: true
+ },
+ {
+ title: 'Известняк (%)',
+ key: 'camstone',
+ dataIndex: 'camstone',
+ align: 'center',
+ className: 'lightpurple-background',
+ editable: true
+ },
+ {
+ title: 'Цемент (%)',
+ key: 'cement',
+ dataIndex: 'cement',
+ align: 'center',
+ className: 'lightpurple-background',
+ editable: true
+ }
+ ]
+ },
+
+ {
+ title: 'Краткое описание',
+ key: 'summary',
+ dataIndex: 'summary',
+ align: 'center',
+ className: 'yellow-background',
+ editable: true
+ },
+ {
+ title: 'ЛБА бурового раствора',
+ key: 'drillingMud',
+ dataIndex: 'drillingMud',
+ align: 'center',
+ className: 'lightgray-background',
+ editable: true
+ },
+ {
+ title: 'ЛБА (шлама)',
+ key: 'sludge',
+ dataIndex: 'sludge',
+ align: 'center',
+ className: 'lightorange-background',
+ editable: true
+ },
+ {
+ title: 'Газопоказания',
+ key: 'gasIndications',
+ dataIndex: 'gasIndications',
+ align: 'center',
+ className: 'yellow-background',
+ children: [
+ {
+ title: 'Сумма УВ мах. (абс%)',
+ key: 'maxSum',
+ dataIndex: 'maxSum',
+ align: 'center',
+ className: 'lightpurple-background',
+ editable: true
+ },
+ {
+ title: 'С1 метан (отн%)',
+ key: 'methane',
+ dataIndex: 'depthPlanFactDifference',
+ align: 'center',
+ className: 'lightpurple-background',
+ editable: true
+ },
+ {
+ title: 'С2 этан (отн%)',
+ key: 'ethan',
+ dataIndex: 'ethan',
+ align: 'center',
+ className: 'lightpurple-background',
+ editable: true
+ },
+ {
+ title: 'С3 пропан (отн%)',
+ key: 'propane',
+ dataIndex: 'propane',
+ align: 'center',
+ className: 'lightpurple-background',
+ editable: true
+ },
+ {
+ title: 'С4 бутан (отн%)',
+ key: 'butane',
+ dataIndex: 'butane',
+ align: 'center',
+ className: 'lightpurple-background',
+ editable: true
+ },
+ {
+ title: 'С5 пентан (отн%)',
+ key: 'pentane',
+ dataIndex: 'pentane',
+ align: 'center',
+ className: 'lightpurple-background',
+ editable: true
+ }
+ ]
+ },
+ {
+ title: 'Мех. скорость',
+ key: 'mechanicalSpeed',
+ dataIndex: 'mechanicalSpeed',
+ align: 'center',
+ className: 'yellow-background',
+ editable: true
+ },
+ {
+ title: 'Предварительное заключение о насыщении по ГК',
+ key: 'preliminaryConclusion',
+ dataIndex: 'preliminaryConclusion',
+ align: 'center',
+ className: 'lightorange-background',
+ editable: true
+ },
+ {
+ title: 'Действие',
+ dataIndex: 'action',
+ align: 'center',
+ width: 150,
+ className: 'small-font',
+ render: (_, row) => {
+ const editable = isEditing(row);
+ return editable ? (
+
+ save(row.key)}
+ style={{ marginRight: 8 }}
+ >
+ Сохранить
+
+ Отменить
редактирование?} onConfirm={cancel}>
+
Отменить
+
+
+ ) : (
+
edit(row)}>
+ Редактировать
+
+ );
+ },
+ }
+ ];
+
+ const mapColumns = (col) => {
+ if(col.children)
+ col.children = col.children.map(mapColumns)
+
+ if (!col.editable) {
+ return col;
+ }
+
+ return {
+ ...col,
+ onCell: (row) => ({
+ row,
+ dataIndex: col.dataIndex,
+ title: col.title,
+ editing: isEditing(row)
+ }),
+ };
+ }
+
+ const mergedColumns = columns.map(mapColumns);
+
+ const edit = (row) => {
+ form.setFieldsValue({
+ ...row
+ });
+ setEditingKey(row.key);
+ };
+
+ const cancel = () => {
+ setEditingKey('');
+ };
+
+ const save = async (key) => {
+ try {
+ const row = await form.validateFields();
+ const newData = [...data];
+ const index = newData.findIndex((item) => key === item.key);
+
+ if (index > -1) {
+ const item = newData[index];
+ newData.splice(index, 1, { ...item, ...row });
+ setData(newData);
+ setEditingKey('');
+ } else {
+ newData.push(row);
+ setData(newData);
+ setEditingKey('');
+ }
+ } catch (errInfo) {
+ console.log('Validate Failed:', errInfo);
+ }
+ };
+
+ return (<>
+
+ >
+ )
+}
\ No newline at end of file
diff --git a/src/components/SmboPlate.jsx b/src/components/SmboPlate.jsx
new file mode 100644
index 0000000..89643ae
--- /dev/null
+++ b/src/components/SmboPlate.jsx
@@ -0,0 +1,65 @@
+import {Modal} from 'antd'
+import '../styles/smbo.css'
+
+import {useState} from "react";
+
+export const SquareIndicator = ({state}) =>{
+ let bgColor = "#AAA"
+ switch (state){
+ case 1:
+ bgColor = "#1B1"
+ break;
+ case 2:
+ bgColor = "#DD1"
+ break;
+ case 3:
+ bgColor = "#D11"
+ break;
+ }
+ return (
)
+}
+
+export default function SmboPlate({title, state, operatingTime, units, children, captionValue}){
+ const [isModalVisible, setIsModalVisible] = useState(false)
+
+
+ const openModal = () => {
+ setIsModalVisible(!!children)
+ }
+
+ const closeModal = () => {
+ setIsModalVisible(false)
+ }
+
+ const plates_smbo_equip = (
+
+
{title}
+
+
+
наработка: {captionValue}
+
{operatingTime}
+
{units??'ч'}
+
+ )
+
+ return(<>
+ {plates_smbo_equip}
+
+
+
+ {children}
+
+
+ >)
+}
\ No newline at end of file
diff --git a/src/components/modalWindows/EquipmentDetails.jsx b/src/components/modalWindows/EquipmentDetails.jsx
new file mode 100644
index 0000000..c0e7946
--- /dev/null
+++ b/src/components/modalWindows/EquipmentDetails.jsx
@@ -0,0 +1,37 @@
+import {Row, Col} from 'antd'
+import '../../styles/equipment_details.css'
+import Documents from '../Documents'
+
+export default function EquipmentDetails({id, equipmentTimers, equipmentSensors}) {
+ let stateOfEquipmentDetails = equipmentTimers.map(timer => {
+ return(
+
{timer.label}: {timer.value} {timer.unit}
+ )
+ })
+
+ let indicatorsOfEquipmentDetail = equipmentSensors.map(sensor => {
+ return(
+
{sensor.label}: {sensor.value} {sensor.unit}
+ )
+ })
+
+ return (<>
+
+
+ Тест 1
+
+
+ {stateOfEquipmentDetails}
+
+
+
+
+
+
+
+
+ {indicatorsOfEquipmentDetail}
+
+
+ >)
+}
diff --git a/src/concept/dragNDrop/Draggable.jsx b/src/concept/dragNDrop/Draggable.jsx
new file mode 100644
index 0000000..76eaa5b
--- /dev/null
+++ b/src/concept/dragNDrop/Draggable.jsx
@@ -0,0 +1,18 @@
+import React from 'react'
+import {useDraggable} from '@dnd-kit/core'
+import {CSS} from '@dnd-kit/utilities'
+
+export function Draggable(props) {
+ const {attributes, listeners, setNodeRef, transform} = useDraggable({
+ id: 'draggable',
+ })
+ const style = {
+ transform: CSS.Translate.toString(transform),
+ }
+
+ return (
+
+ );
+}
\ No newline at end of file
diff --git a/src/concept/dragNDrop/Droppable.jsx b/src/concept/dragNDrop/Droppable.jsx
new file mode 100644
index 0000000..7a2ad46
--- /dev/null
+++ b/src/concept/dragNDrop/Droppable.jsx
@@ -0,0 +1,19 @@
+import React from 'react';
+import {useDroppable} from '@dnd-kit/core';
+
+export function Droppable(props) {
+ const {isOver, setNodeRef} = useDroppable({
+ id: 'droppable',
+ });
+ const style = {
+ color: isOver ? 'green' : undefined,
+ width: "100px",
+ height: "100px",
+ };
+
+ return (
+
+ {props.children}
+
+ );
+}
\ No newline at end of file
diff --git a/src/images/smbo/RigPlan2.png b/src/images/smbo/RigPlan2.png
new file mode 100644
index 0000000..03069a1
Binary files /dev/null and b/src/images/smbo/RigPlan2.png differ
diff --git a/src/images/smbo/TopDrive_Dummy.png b/src/images/smbo/TopDrive_Dummy.png
new file mode 100644
index 0000000..3d4d611
Binary files /dev/null and b/src/images/smbo/TopDrive_Dummy.png differ
diff --git a/src/pages/Messages.jsx b/src/pages/Messages.jsx
index 804ffd4..bec750f 100644
--- a/src/pages/Messages.jsx
+++ b/src/pages/Messages.jsx
@@ -1,6 +1,6 @@
import {Table, Select, DatePicker, ConfigProvider, Input} from 'antd';
import {MessageService} from '../services/api'
-import React, {useState, useEffect, useMemo} from 'react'
+import {useState, useEffect} from 'react'
import {useParams} from 'react-router-dom'
import LoaderPortal from '../components/LoaderPortal'
import '../styles/message.css'
@@ -53,7 +53,6 @@ const filterOptions = [
{label: 'Информация', value: 3},
]
-
// Данные для таблицы
export default function Messages() {
let {id} = useParams()
@@ -79,7 +78,7 @@ export default function Messages() {
}
setSearchString(message)
}
-
+
useEffect(() => {
const GetMessages = async () => {
setLoader(true)
diff --git a/src/pages/Smbo.jsx b/src/pages/Smbo.jsx
new file mode 100644
index 0000000..e6c91f3
--- /dev/null
+++ b/src/pages/Smbo.jsx
@@ -0,0 +1,616 @@
+import SmboPlate from '../components/SmboPlate'
+import '../styles/smbo.css'
+import EquipmentDetails from '../components/modalWindows/EquipmentDetails'
+import ActiveMessagesOnline from "../components/ActiveMessagesOnline"
+// import RigPlan from "../images/smbo/RigPlan2.png"
+
+const platesData = [
+ {
+ id: 1,
+ title: 'Теплогенератор',
+ placeHolderId: 1,
+ state: 1,
+ equipmentTimers: [
+ {label: 'Полная наработка', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка вне р/р', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО1', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО2', value: 1, unit: 'ч'},
+ ],
+ equipmentSensors: [
+ {label: 'Скорость вращения', value: 1, unit: 'Об/мин'},
+ {label: 'Крутящий момент', value: 1, unit: 'кН*м'},
+ {label: 'Общий уровень вибрации', value: 1, unit: 'мм/с'},
+ {label: 'Уровень масла в баке', value: 1, unit: 'м'},
+ {label: 'Т верхнего подшипника', value: 1, unit: '°C'},
+ {label: 'Т нижнего подшипника', value: 1, unit: '°C'},
+ {label: 'Состояние ПЧ1', value: 1, unit: ''},
+ {label: 'Состояние ПЧ2', value: 1, unit: ''},
+ ],
+ captionValue: 'У-У-У-у-у-у',
+ custom: 'Я не понял про это',
+ className: 'c1 r1'
+ },
+ // {
+ // id: 2,
+ // title: 'Емкости бурового раствора',
+ // placeHolderId: 2,
+ // state: 1,
+ // equipmentTimers: [
+ // {label: 'Полная наработка', value: 1, unit: 'ч'},
+ // {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ // {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ // {label: 'Наработка вне р/р', value: 1, unit: 'ч'},
+ // {label: 'Периодичность ТО1', value: 1, unit: 'ч'},
+ // {label: 'Периодичность ТО2', value: 1, unit: 'ч'},
+ // ],
+ // equipmentSensors: [
+ // {label: 'Скорость вращения', value: 1, unit: 'Об/мин'},
+ // {label: 'Крутящий момент', value: 1, unit: 'кН*м'},
+ // {label: 'Общий уровень вибрации', value: 1, unit: 'мм/с'},
+ // {label: 'Уровень масла в баке', value: 1, unit: 'м'},
+ // {label: 'Т верхнего подшипника', value: 1, unit: '°C'},
+ // {label: 'Т нижнего подшипника', value: 1, unit: '°C'},
+ // {label: 'Состояние ПЧ1', value: 1, unit: ''},
+ // {label: 'Состояние ПЧ2', value: 1, unit: ''},
+ // ],
+ // captionValue: 'У-У-У-у-у-у',
+ // custom: 'Я не понял про это',
+ // className: 'c2 r1'
+ // },
+ {
+ id: 3,
+ title: 'Подпорные насосы',
+ placeHolderId: 3,
+ state: 2,
+ equipmentTimers: [
+ {label: 'Полная наработка', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка вне р/р', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО1', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО2', value: 1, unit: 'ч'},
+ ],
+ equipmentSensors: [
+ {label: 'Скорость вращения', value: 1, unit: 'Об/мин'},
+ {label: 'Крутящий момент', value: 1, unit: 'кН*м'},
+ {label: 'Общий уровень вибрации', value: 1, unit: 'мм/с'},
+ {label: 'Уровень масла в баке', value: 1, unit: 'м'},
+ {label: 'Т верхнего подшипника', value: 1, unit: '°C'},
+ {label: 'Т нижнего подшипника', value: 1, unit: '°C'},
+ {label: 'Состояние ПЧ1', value: 1, unit: ''},
+ {label: 'Состояние ПЧ2', value: 1, unit: ''},
+ ],
+ captionValue: 'У-У-У-у-у-у',
+ custom: 'Я не понял про это',
+ className: 'c3 r1'
+ },
+ {
+ id: 4,
+ title: 'Буровой насос №1',
+ placeHolderId: 4,
+ state: 1,
+ equipmentTimers: [
+ {label: 'Полная наработка', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка вне р/р', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО1', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО2', value: 1, unit: 'ч'},
+ ],
+ equipmentSensors: [
+ {label: 'Скорость вращения', value: 1, unit: 'Об/мин'},
+ {label: 'Крутящий момент', value: 1, unit: 'кН*м'},
+ {label: 'Общий уровень вибрации', value: 1, unit: 'мм/с'},
+ {label: 'Уровень масла в баке', value: 1, unit: 'м'},
+ {label: 'Т верхнего подшипника', value: 1, unit: '°C'},
+ {label: 'Т нижнего подшипника', value: 1, unit: '°C'},
+ {label: 'Состояние ПЧ1', value: 1, unit: ''},
+ {label: 'Состояние ПЧ2', value: 1, unit: ''},
+ ],
+ captionValue: 'У-У-У-у-у-у',
+ custom: 'Я не понял про это',
+ className: 'c4 r1'
+ },
+ {
+ id: 5,
+ title: 'Буровой насос №2',
+ placeHolderId: 5,
+ state: 0,
+ equipmentTimers: [
+ {label: 'Полная наработка', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка вне р/р', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО1', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО2', value: 1, unit: 'ч'},
+ ],
+ equipmentSensors: [
+ {label: 'Скорость вращения', value: 1, unit: 'Об/мин'},
+ {label: 'Крутящий момент', value: 1, unit: 'кН*м'},
+ {label: 'Общий уровень вибрации', value: 1, unit: 'мм/с'},
+ {label: 'Уровень масла в баке', value: 1, unit: 'м'},
+ {label: 'Т верхнего подшипника', value: 1, unit: '°C'},
+ {label: 'Т нижнего подшипника', value: 1, unit: '°C'},
+ {label: 'Состояние ПЧ1', value: 1, unit: ''},
+ {label: 'Состояние ПЧ2', value: 1, unit: ''},
+ ],
+ captionValue: 'У-У-У-у-у-у',
+ custom: 'Я не понял про это',
+ className: 'c5 r1'
+ },
+ {
+ id: 6,
+ title: 'Талевый канат',
+ placeHolderId: 6,
+ state: 2,
+ equipmentTimers: [
+ {label: 'Полная наработка', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка вне р/р', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО1', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО2', value: 1, unit: 'ч'},
+ ],
+ equipmentSensors: [
+ {label: 'Скорость вращения', value: 1, unit: 'Об/мин'},
+ {label: 'Крутящий момент', value: 1, unit: 'кН*м'},
+ {label: 'Общий уровень вибрации', value: 1, unit: 'мм/с'},
+ {label: 'Уровень масла в баке', value: 1, unit: 'м'},
+ {label: 'Т верхнего подшипника', value: 1, unit: '°C'},
+ {label: 'Т нижнего подшипника', value: 1, unit: '°C'},
+ {label: 'Состояние ПЧ1', value: 1, unit: ''},
+ {label: 'Состояние ПЧ2', value: 1, unit: ''},
+ ],
+ captionValue: 'У-У-У-у-у-у',
+ custom: 'Я не понял про это',
+ className: 'c6 r1'
+ },
+ {
+ id: 7,
+ title: 'Станция управления ВСП',
+ placeHolderId: 7,
+ state: 3,
+ equipmentTimers: [
+ {label: 'Полная наработка', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка вне р/р', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО1', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО2', value: 1, unit: 'ч'},
+ ],
+ equipmentSensors: [
+ {label: 'Скорость вращения', value: 1, unit: 'Об/мин'},
+ {label: 'Крутящий момент', value: 1, unit: 'кН*м'},
+ {label: 'Общий уровень вибрации', value: 1, unit: 'мм/с'},
+ {label: 'Уровень масла в баке', value: 1, unit: 'м'},
+ {label: 'Т верхнего подшипника', value: 1, unit: '°C'},
+ {label: 'Т нижнего подшипника', value: 1, unit: '°C'},
+ {label: 'Состояние ПЧ1', value: 1, unit: ''},
+ {label: 'Состояние ПЧ2', value: 1, unit: ''},
+ ],
+ captionValue: 'У-У-У-у-у-у',
+ custom: 'Я не понял про это',
+ className: 'c1 r2'
+ },
+ {
+ id: 8,
+ title: 'Компрессорный блок',
+ placeHolderId: 8,
+ state: 3,
+ equipmentTimers: [
+ {label: 'Полная наработка', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка вне р/р', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО1', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО2', value: 1, unit: 'ч'},
+ ],
+ equipmentSensors: [
+ {label: 'Скорость вращения', value: 1, unit: 'Об/мин'},
+ {label: 'Крутящий момент', value: 1, unit: 'кН*м'},
+ {label: 'Общий уровень вибрации', value: 1, unit: 'мм/с'},
+ {label: 'Уровень масла в баке', value: 1, unit: 'м'},
+ {label: 'Т верхнего подшипника', value: 1, unit: '°C'},
+ {label: 'Т нижнего подшипника', value: 1, unit: '°C'},
+ {label: 'Состояние ПЧ1', value: 1, unit: ''},
+ {label: 'Состояние ПЧ2', value: 1, unit: ''},
+ ],
+ captionValue: 'У-У-У-у-у-у',
+ custom: 'Я не понял про это',
+ className: 'c6 r2'
+ },
+ {
+ id: 9,
+ title: 'Лебедка буровая',
+ placeHolderId: 9,
+ state: 1,
+ equipmentTimers: [
+ {label: 'Полная наработка', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка вне р/р', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО1', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО2', value: 1, unit: 'ч'},
+ ],
+ equipmentSensors: [
+ {label: 'Скорость вращения', value: 1, unit: 'Об/мин'},
+ {label: 'Крутящий момент', value: 1, unit: 'кН*м'},
+ {label: 'Общий уровень вибрации', value: 1, unit: 'мм/с'},
+ {label: 'Уровень масла в баке', value: 1, unit: 'м'},
+ {label: 'Т верхнего подшипника', value: 1, unit: '°C'},
+ {label: 'Т нижнего подшипника', value: 1, unit: '°C'},
+ {label: 'Состояние ПЧ1', value: 1, unit: ''},
+ {label: 'Состояние ПЧ2', value: 1, unit: ''},
+ ],
+ captionValue: 'У-У-У-у-у-у',
+ custom: 'Я не понял про это',
+ className: 'c1 r3'
+ },
+ {
+ id: 10,
+ title: 'Блок сопротивлений и КТУ',
+ placeHolderId: 10,
+ state: 1,
+ equipmentTimers: [
+ {label: 'Полная наработка', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка вне р/р', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО1', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО2', value: 1, unit: 'ч'},
+ ],
+ equipmentSensors: [
+ {label: 'Скорость вращения', value: 1, unit: 'Об/мин'},
+ {label: 'Крутящий момент', value: 1, unit: 'кН*м'},
+ {label: 'Общий уровень вибрации', value: 1, unit: 'мм/с'},
+ {label: 'Уровень масла в баке', value: 1, unit: 'м'},
+ {label: 'Т верхнего подшипника', value: 1, unit: '°C'},
+ {label: 'Т нижнего подшипника', value: 1, unit: '°C'},
+ {label: 'Состояние ПЧ1', value: 1, unit: ''},
+ {label: 'Состояние ПЧ2', value: 1, unit: ''},
+ ],
+ captionValue: 'У-У-У-у-у-у',
+ custom: 'Я не понял про это',
+ className: 'c6 r3'
+ },
+ {
+ id: 11,
+ title: 'Вспомогательная лебедка',
+ placeHolderId: 11,
+ state: 0,
+ equipmentTimers: [
+ {label: 'Полная наработка', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка вне р/р', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО1', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО2', value: 1, unit: 'ч'},
+ ],
+ equipmentSensors: [
+ {label: 'Скорость вращения', value: 1, unit: 'Об/мин'},
+ {label: 'Крутящий момент', value: 1, unit: 'кН*м'},
+ {label: 'Общий уровень вибрации', value: 1, unit: 'мм/с'},
+ {label: 'Уровень масла в баке', value: 1, unit: 'м'},
+ {label: 'Т верхнего подшипника', value: 1, unit: '°C'},
+ {label: 'Т нижнего подшипника', value: 1, unit: '°C'},
+ {label: 'Состояние ПЧ1', value: 1, unit: ''},
+ {label: 'Состояние ПЧ2', value: 1, unit: ''},
+ ],
+ captionValue: 'У-У-У-у-у-у',
+ custom: 'Я не понял про это',
+ className: 'c1 r4'
+ },
+ {
+ id: 12,
+ title: 'Блок НКУ',
+ placeHolderId: 12,
+ state: 1,
+ equipmentTimers: [
+ {label: 'Полная наработка', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка вне р/р', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО1', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО2', value: 1, unit: 'ч'},
+ ],
+ equipmentSensors: [
+ {label: 'Скорость вращения', value: 1, unit: 'Об/мин'},
+ {label: 'Крутящий момент', value: 1, unit: 'кН*м'},
+ {label: 'Общий уровень вибрации', value: 1, unit: 'мм/с'},
+ {label: 'Уровень масла в баке', value: 1, unit: 'м'},
+ {label: 'Т верхнего подшипника', value: 1, unit: '°C'},
+ {label: 'Т нижнего подшипника', value: 1, unit: '°C'},
+ {label: 'Состояние ПЧ1', value: 1, unit: ''},
+ {label: 'Состояние ПЧ2', value: 1, unit: ''},
+ ],
+ captionValue: 'У-У-У-у-у-у',
+ custom: 'Я не понял про это',
+ className: 'c6 r4'
+ },
+ {
+ id: 13,
+ title: 'Гидрорасцепитель',
+ placeHolderId: 13,
+ state: 1,
+ equipmentTimers: [
+ {label: 'Полная наработка', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка вне р/р', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО1', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО2', value: 1, unit: 'ч'},
+ ],
+ equipmentSensors: [
+ {label: 'Скорость вращения', value: 1, unit: 'Об/мин'},
+ {label: 'Крутящий момент', value: 1, unit: 'кН*м'},
+ {label: 'Общий уровень вибрации', value: 1, unit: 'мм/с'},
+ {label: 'Уровень масла в баке', value: 1, unit: 'м'},
+ {label: 'Т верхнего подшипника', value: 1, unit: '°C'},
+ {label: 'Т нижнего подшипника', value: 1, unit: '°C'},
+ {label: 'Состояние ПЧ1', value: 1, unit: ''},
+ {label: 'Состояние ПЧ2', value: 1, unit: ''},
+ ],
+ captionValue: 'У-У-У-у-у-у',
+ custom: 'Я не понял про это',
+ className: 'c1 r5'
+ },
+ {
+ id: 14,
+ title: 'Блок КРУ',
+ placeHolderId: 14,
+ state: 1,
+ equipmentTimers: [
+ {label: 'Полная наработка', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка вне р/р', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО1', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО2', value: 1, unit: 'ч'},
+ ],
+ equipmentSensors: [
+ {label: 'Скорость вращения', value: 1, unit: 'Об/мин'},
+ {label: 'Крутящий момент', value: 1, unit: 'кН*м'},
+ {label: 'Общий уровень вибрации', value: 1, unit: 'мм/с'},
+ {label: 'Уровень масла в баке', value: 1, unit: 'м'},
+ {label: 'Т верхнего подшипника', value: 1, unit: '°C'},
+ {label: 'Т нижнего подшипника', value: 1, unit: '°C'},
+ {label: 'Состояние ПЧ1', value: 1, unit: ''},
+ {label: 'Состояние ПЧ2', value: 1, unit: ''},
+ ],
+ captionValue: 'У-У-У-у-у-у',
+ custom: 'Я не понял про это',
+ className: 'c6 r5'
+ },
+ {
+ id: 15,
+ title: 'Привод ВСП',
+ placeHolderId: 15,
+ state: 2,
+ equipmentTimers: [
+ {label: 'Полная наработка', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка вне р/р', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО1', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО2', value: 1, unit: 'ч'},
+ ],
+ equipmentSensors: [
+ {label: 'Скорость вращения', value: 1, unit: 'Об/мин'},
+ {label: 'Крутящий момент', value: 1, unit: 'кН*м'},
+ {label: 'Общий уровень вибрации', value: 1, unit: 'мм/с'},
+ {label: 'Уровень масла в баке', value: 1, unit: 'м'},
+ {label: 'Т верхнего подшипника', value: 1, unit: '°C'},
+ {label: 'Т нижнего подшипника', value: 1, unit: '°C'},
+ {label: 'Состояние ПЧ1', value: 1, unit: ''},
+ {label: 'Состояние ПЧ2', value: 1, unit: ''},
+ ],
+ captionValue: 'У-У-У-у-у-у',
+ custom: 'Я не понял про это',
+ className: 'c1 r6'
+ },
+ {
+ id: 16,
+ title: 'Теплогенератор',
+ placeHolderId: 16,
+ state: 3,
+ equipmentTimers: [
+ {label: 'Полная наработка', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка вне р/р', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО1', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО2', value: 1, unit: 'ч'},
+ ],
+ equipmentSensors: [
+ {label: 'Скорость вращения', value: 1, unit: 'Об/мин'},
+ {label: 'Крутящий момент', value: 1, unit: 'кН*м'},
+ {label: 'Общий уровень вибрации', value: 1, unit: 'мм/с'},
+ {label: 'Уровень масла в баке', value: 1, unit: 'м'},
+ {label: 'Т верхнего подшипника', value: 1, unit: '°C'},
+ {label: 'Т нижнего подшипника', value: 1, unit: '°C'},
+ {label: 'Состояние ПЧ1', value: 1, unit: ''},
+ {label: 'Состояние ПЧ2', value: 1, unit: ''},
+ ],
+ captionValue: 'А вот тут, совсем не У-У-У-у-у-у',
+ custom: 'Я не понял про это',
+ className: 'c6 r6'
+ },
+ {
+ id: 17,
+ title: 'Теплогенератор',
+ placeHolderId: 17,
+ state: 1,
+ equipmentTimers: [
+ {label: 'Полная наработка', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка вне р/р', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО1', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО2', value: 1, unit: 'ч'},
+ ],
+ equipmentSensors: [
+ {label: 'Скорость вращения', value: 1, unit: 'Об/мин'},
+ {label: 'Крутящий момент', value: 1, unit: 'кН*м'},
+ {label: 'Общий уровень вибрации', value: 1, unit: 'мм/с'},
+ {label: 'Уровень масла в баке', value: 1, unit: 'м'},
+ {label: 'Т верхнего подшипника', value: 1, unit: '°C'},
+ {label: 'Т нижнего подшипника', value: 1, unit: '°C'},
+ {label: 'Состояние ПЧ1', value: 1, unit: ''},
+ {label: 'Состояние ПЧ2', value: 1, unit: ''},
+ ],
+ captionValue: 'У-У-У-у-у-у',
+ custom: 'Я не понял про это',
+ className: 'c1 r7'
+ },
+ {
+ id: 18,
+ title: 'Теплогенератор',
+ placeHolderId: 18,
+ state: 0,
+ equipmentTimers: [
+ {label: 'Полная наработка', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка вне р/р', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО1', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО2', value: 1, unit: 'ч'},
+ ],
+ equipmentSensors: [
+ {label: 'Скорость вращения', value: 1, unit: 'Об/мин'},
+ {label: 'Крутящий момент', value: 1, unit: 'кН*м'},
+ {label: 'Общий уровень вибрации', value: 1, unit: 'мм/с'},
+ {label: 'Уровень масла в баке', value: 1, unit: 'м'},
+ {label: 'Т верхнего подшипника', value: 1, unit: '°C'},
+ {label: 'Т нижнего подшипника', value: 1, unit: '°C'},
+ {label: 'Состояние ПЧ1', value: 1, unit: ''},
+ {label: 'Состояние ПЧ2', value: 1, unit: ''},
+ ],
+ captionValue: 'наработка',
+ custom: 'Я не понял про это',
+ className: 'c6 r7'
+ },
+ {
+ id: 19,
+ title: 'Теплогенератор',
+ placeHolderId: 19,
+ state: 0,
+ equipmentTimers: [
+ {label: 'Полная наработка', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка вне р/р', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО1', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО2', value: 1, unit: 'ч'},
+ ],
+ equipmentSensors: [
+ {label: 'Скорость вращения', value: 1, unit: 'Об/мин'},
+ {label: 'Крутящий момент', value: 1, unit: 'кН*м'},
+ {label: 'Общий уровень вибрации', value: 1, unit: 'мм/с'},
+ {label: 'Уровень масла в баке', value: 1, unit: 'м'},
+ {label: 'Т верхнего подшипника', value: 1, unit: '°C'},
+ {label: 'Т нижнего подшипника', value: 1, unit: '°C'},
+ {label: 'Состояние ПЧ1', value: 1, unit: ''},
+ {label: 'Состояние ПЧ2', value: 1, unit: ''},
+ ],
+ captionValue: 'У-У-У-у-у-у',
+ custom: 'Я не понял про это',
+ className: 'c1 r8'
+ },
+ {
+ id: 20,
+ title: 'Теплогенератор',
+ placeHolderId: 20,
+ state: 1,
+ equipmentTimers: [
+ {label: 'Полная наработка', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка после ТО1', value: 1, unit: 'ч'},
+ {label: 'Наработка вне р/р', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО1', value: 1, unit: 'ч'},
+ {label: 'Периодичность ТО2', value: 1, unit: 'ч'},
+ ],
+ equipmentSensors: [
+ {label: 'Скорость вращения', value: 1, unit: 'Об/мин'},
+ {label: 'Крутящий момент', value: 1, unit: 'кН*м'},
+ {label: 'Общий уровень вибрации', value: 1, unit: 'мм/с'},
+ {label: 'Уровень масла в баке', value: 1, unit: 'м'},
+ {label: 'Т верхнего подшипника', value: 1, unit: '°C'},
+ {label: 'Т нижнего подшипника', value: 1, unit: '°C'},
+ {label: 'Состояние ПЧ1', value: 1, unit: ''},
+ {label: 'Состояние ПЧ2', value: 1, unit: ''},
+ ],
+ captionValue: 'У-У-У-у-у-у',
+ custom: 'Я не понял про это',
+ className: 'c6 r8'
+ },
+]
+
+const placeholderIdDictionary = {
+ 1: {gridRowStart: 8, gridColumnStart: 1},
+ 2: {gridRowStart: 7, gridColumnStart: 1},
+ 3: {gridRowStart: 6, gridColumnStart: 1},
+ 4: {gridRowStart: 5, gridColumnStart: 1},
+ 5: {gridRowStart: 4, gridColumnStart: 1},
+ 6: {gridRowStart: 3, gridColumnStart: 1},
+ 7: {gridRowStart: 2, gridColumnStart: 1},
+ 8: {gridRowStart: 1, gridColumnStart: 1},
+ 9: {gridRowStart: 1, gridColumnStart: 2},
+ 10: {gridRowStart: 1, gridColumnStart: 3},
+ 11: {gridRowStart: 1, gridColumnStart: 4},
+ 12: {gridRowStart: 1, gridColumnStart: 5},
+ 13: {gridRowStart: 1, gridColumnStart: 6},
+ 14: {gridRowStart: 2, gridColumnStart: 6},
+ 15: {gridRowStart: 3, gridColumnStart: 6},
+ 16: {gridRowStart: 4, gridColumnStart: 6},
+ 17: {gridRowStart: 5, gridColumnStart: 6},
+ 18: {gridRowStart: 6, gridColumnStart: 6},
+ 19: {gridRowStart: 7, gridColumnStart: 6},
+ 20: {gridRowStart: 8, gridColumnStart: 6},
+}
+
+const plates = []
+
+for (let i = 1; i < 21; i++) {
+ const item = platesData.filter(item => item.placeHolderId === i)[0]
+ const plate = item ? (
+
+
+
+
+
+ ) : (
+
{i}
+ )
+ plates.push(plate)
+}
+
+export default function Smbo() {
+
+ return (<>
+
+ {plates}
+ {/*
*/}
+ {/*
*/}
+ {/*
*/}
+
+
+
+ >)
+}
\ No newline at end of file
diff --git a/src/pages/Well.jsx b/src/pages/Well.jsx
index ead68d1..588fb09 100644
--- a/src/pages/Well.jsx
+++ b/src/pages/Well.jsx
@@ -9,6 +9,7 @@ import WellAnalysis from "../pages/WellAnalysis";
import TelemetryView from "../pages/TelemetryView";
import MenuDocuments from "../components/MenuDocuments";
import WellStat from "./WellStat"
+import Smbo from "./Smbo"
const { Content } = Layout
@@ -77,6 +78,9 @@ export default function Well() {
Последние данные
+
}>
+ СМБО
+
@@ -106,6 +110,9 @@ export default function Well() {
+
+
+
diff --git a/src/styles/equipment_details.css b/src/styles/equipment_details.css
new file mode 100644
index 0000000..8ad648f
--- /dev/null
+++ b/src/styles/equipment_details.css
@@ -0,0 +1,3 @@
+span.right-text {
+ float: right;
+}
\ No newline at end of file
diff --git a/src/styles/smbo.css b/src/styles/smbo.css
new file mode 100644
index 0000000..5f6e5aa
--- /dev/null
+++ b/src/styles/smbo.css
@@ -0,0 +1,123 @@
+.smbo_container{
+ display: grid;
+ column-gap: 4px;
+ row-gap: 4px;
+ grid-template-columns: repeat(6, 1fr);
+ grid-template-rows: repeat(9, 1fr);
+ justify-items: stretch;
+ align-items: stretch;
+}
+
+.smbo_rig_plan{
+ grid-column-start: 2;
+ grid-row-start: 2;
+}
+
+.plate_container{
+ background-color: #00000010;
+ display: grid;
+ grid-template-columns: 3fr 1fr;
+ grid-template-rows: auto;
+ padding: 6px;
+ margin: 4px;
+ height: 100%;
+ width: 100%;
+}
+
+.plate_title{
+ grid-column: 1 / span 2;
+ grid-row: 1 / 1;
+ font-weight: bold;
+}
+
+.plate_state{
+ grid-column: 3 / span 1;
+ grid-row: 1 / span 1;
+}
+
+.plate_param{
+ grid-row: 2 / span 1;
+}
+
+.plate_param_title{
+ grid-column: 1 / span 1;
+}
+
+.plate_param_value{
+ grid-column: 2 / span 1;
+ font-weight: bold;
+ place-self: start end;
+ margin-right: 4px;
+}
+
+.plate_param_units{
+ grid-column: 3 / span 1;
+}
+
+.c1{ grid-column-start: 1; }
+.c2{ grid-column-start: 2; }
+.c3{ grid-column-start: 3; }
+.c4{ grid-column-start: 4; }
+.c5{ grid-column-start: 5; }
+.c6{ grid-column-start: 6; }
+.c7{ grid-column-start: 7; }
+.c8{ grid-column-start: 8; }
+
+.r1{ grid-row-start: 1; }
+.r2{ grid-row-start: 2; }
+.r3{ grid-row-start: 3; }
+.r4{ grid-row-start: 4; }
+.r5{ grid-row-start: 5; }
+.r6{ grid-row-start: 6; }
+.r7{ grid-row-start: 7; }
+.r8{ grid-row-start: 8; }
+
+.ce1{ grid-column-end: 1; }
+.ce2{ grid-column-end: 2; }
+.ce3{ grid-column-end: 3; }
+.ce4{ grid-column-end: 4; }
+.ce5{ grid-column-end: 5; }
+.ce6{ grid-column-end: 6; }
+.ce7{ grid-column-end: 7; }
+.ce8{ grid-column-end: 8; }
+
+.re1{ grid-row-end: 1; }
+.re2{ grid-row-end: 2; }
+.re3{ grid-row-end: 3; }
+.re4{ grid-row-end: 4; }
+.re5{ grid-row-end: 5; }
+.re6{ grid-row-end: 6; }
+.re7{ grid-row-end: 7; }
+.re8{ grid-row-end: 8; }
+
+.cspan-4{ grid-column-end: 4 start;}
+
+.rspan-6{ grid-row-end: 6 start;}
+
+.rspan-7{ grid-row-end: 7 start;}
+
+.center{
+ place-self: center stretch;
+}
+
+.pointer {
+ cursor: pointer;
+}
+
+.container__example {
+ display: flex;
+}
+
+.block__example {
+ width: 250px;
+ height: 120px;
+}
+
+.empty_place {
+ background-color: #505050;
+ text-align: center;
+ color: silver;
+ font-size: 75px;
+ margin-top: 5px;
+ align-items: center;
+}
\ No newline at end of file