forked from ddrilling/asb_cloud_front
CF2-8: Создание формы отчетов
This commit is contained in:
parent
913aa023a3
commit
9443bdafc1
@ -32,7 +32,7 @@
|
|||||||
"react_test": "react-scripts test",
|
"react_test": "react-scripts test",
|
||||||
"eject": "react-scripts eject"
|
"eject": "react-scripts eject"
|
||||||
},
|
},
|
||||||
"proxy": "http://192.168.1.70:5000",
|
"proxy": "http://0.0.0.0:5000",
|
||||||
"eslintConfig": {
|
"eslintConfig": {
|
||||||
"extends": [
|
"extends": [
|
||||||
"react-app",
|
"react-app",
|
||||||
|
@ -1,107 +1,173 @@
|
|||||||
import React from "react";
|
import React, { useState, useEffect } from "react";
|
||||||
|
import { useParams } from 'react-router-dom';
|
||||||
import {
|
import {
|
||||||
|
Form,
|
||||||
DatePicker,
|
DatePicker,
|
||||||
Radio,
|
Radio,
|
||||||
ConfigProvider,
|
|
||||||
Button,
|
Button,
|
||||||
Select,
|
Select,
|
||||||
Checkbox,
|
Table
|
||||||
} from 'antd';
|
} from 'antd';
|
||||||
import 'moment/locale/ru';
|
import 'moment/locale/ru';
|
||||||
import locale from 'antd/lib/locale/ru_RU';
|
import locale from 'antd/lib/locale/ru_RU';
|
||||||
import moment from "moment";
|
import moment from "moment";
|
||||||
|
import { ReportService } from '../services/api'
|
||||||
|
|
||||||
const { RangePicker } = DatePicker;
|
const { RangePicker } = DatePicker;
|
||||||
const { Option } = Select;
|
const { Option } = Select;
|
||||||
|
|
||||||
|
const initialBegin = moment()
|
||||||
|
const initialEnd = moment()
|
||||||
|
const initialStep = 600
|
||||||
// Расширение файла для составленного рапорта
|
const initialFormat = 1
|
||||||
const ExceptionFileChecker = () => {
|
let reportDatesRange = {
|
||||||
const [value, setValue] = React.useState(1);
|
from: moment("0001-01-01T00:00:00"),
|
||||||
const onChange = e => {
|
to: moment("9999-12-31T23:59:59.9999999")
|
||||||
console.log('radio checked', e.target.value);
|
|
||||||
setValue(e.target.value);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (<Radio.Group onChange={onChange} value={value}>
|
|
||||||
<Radio value={1}>PDF</Radio>
|
|
||||||
<Radio value={2}>LAS</Radio>
|
|
||||||
</Radio.Group>
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Выбор периода времени
|
|
||||||
const PeriodOfTime = () => {
|
|
||||||
function disabledDate(current) {
|
|
||||||
return current && current < moment().subtract(3, 'days'); // Наверно, не надо)
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<ConfigProvider locale={locale}
|
|
||||||
disabledDate>
|
|
||||||
<RangePicker
|
|
||||||
showTime
|
|
||||||
disabledDate={disabledDate}
|
|
||||||
/>
|
|
||||||
</ConfigProvider>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Выбор содержимого
|
|
||||||
const ContentSelection = () => {
|
|
||||||
function onChange(e) {
|
|
||||||
console.log(`checked = ${e.target.checked}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (<>
|
|
||||||
<Checkbox onChange={onChange}>Графики</Checkbox>
|
|
||||||
<Checkbox onChange={onChange}>Сообщения</Checkbox>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Выбор шага графика
|
|
||||||
const GraphicStep = () => {
|
|
||||||
function handleChange(value) {
|
|
||||||
console.log(`selected ${value}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<Select defaultValue="1 minute"
|
|
||||||
style={{ width: 100 }}
|
|
||||||
onChange={handleChange}>
|
|
||||||
<Option value="1 minute">1 минута</Option>
|
|
||||||
<Option value="1 day">1 день</Option>
|
|
||||||
<Option value="1 week">1 неделя</Option>
|
|
||||||
</Select>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Экспорт рендера
|
// Экспорт рендера
|
||||||
export default function Report(props) {
|
export default function Report(props) {
|
||||||
|
|
||||||
|
const [rangeDate, setRangeDate] = useState([moment(), moment()])
|
||||||
|
const [step, setStep] = useState(initialStep)
|
||||||
|
const [format, setFormat] = useState(initialFormat)
|
||||||
|
const [approxPages, setPagesCount] = useState(0)
|
||||||
|
const [suitableReports, setSuitableReports] = useState([])
|
||||||
|
let wellId = useParams().id;
|
||||||
|
|
||||||
|
const columns = [
|
||||||
|
{
|
||||||
|
title: '',
|
||||||
|
dataIndex: 'reportFormat',
|
||||||
|
key: 'reportFormat',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Параметры отчета',
|
||||||
|
dataIndex: 'reportParams',
|
||||||
|
key: 'reportParams',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Название отчета',
|
||||||
|
dataIndex: 'reportName',
|
||||||
|
key: 'reportName',
|
||||||
|
render: name => <a>{name}</a>
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
let handleReportCreation = async (values) => {
|
||||||
|
let begin = rangeDate[0].toISOString()
|
||||||
|
let end = rangeDate[1].toISOString()
|
||||||
|
let taskId = await ReportService.createReport(wellId, values.step, values.format, begin, end)
|
||||||
|
};
|
||||||
|
|
||||||
|
function disabledDate(current) {
|
||||||
|
return reportDatesRange.From >= current || reportDatesRange.To <= current;
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(()=>{
|
||||||
|
async function getRepostSizeAsync() {
|
||||||
|
let begin = rangeDate[0].toISOString()
|
||||||
|
let end = rangeDate[1].toISOString()
|
||||||
|
let approxPagesResponse = await ReportService.getReportSize(wellId, step, format, begin, end)
|
||||||
|
setPagesCount(approxPagesResponse)
|
||||||
|
let suitableReportsResponse = await ReportService.getSuitableReportsNames(wellId, step, format, begin, end)
|
||||||
|
let suitableReports = suitableReportsResponse.map(value => {
|
||||||
|
return {
|
||||||
|
reportFormat: value.format,
|
||||||
|
reportParams: `Дата создания: ${value.date}, Данные от ${value.begin} до ${value.end}, Шаг: ${value.step}`,
|
||||||
|
reportName: value.name
|
||||||
|
}
|
||||||
|
})
|
||||||
|
setSuitableReports(suitableReports)
|
||||||
|
}
|
||||||
|
|
||||||
|
getRepostSizeAsync()
|
||||||
|
},[rangeDate, step, format])
|
||||||
|
|
||||||
|
useEffect(()=>{
|
||||||
|
async function getDatesRange() {
|
||||||
|
let response = await ReportService.getReportsDateRange(wellId)
|
||||||
|
reportDatesRange.from = moment(response.from)
|
||||||
|
reportDatesRange.to = moment(response.to)
|
||||||
|
}
|
||||||
|
|
||||||
|
getDatesRange()
|
||||||
|
},[])
|
||||||
|
|
||||||
return (<>
|
return (<>
|
||||||
<h2>Рапорт</h2>
|
<Form
|
||||||
<hr />
|
layout="vertical"
|
||||||
<h3>Выбор за период времени и расширение файла</h3>
|
name="reportForm"
|
||||||
<PeriodOfTime />
|
initialValues={{ remember: true }}
|
||||||
<h3>Шаг графиков</h3>
|
onFinish={handleReportCreation}
|
||||||
<GraphicStep />
|
style={{marginTop:'20px'}}
|
||||||
<h3>Содержимое отчёта</h3>
|
>
|
||||||
<ContentSelection />
|
<div style={{display: 'flex'}}>
|
||||||
<div></div>
|
<Form.Item
|
||||||
<ExceptionFileChecker />
|
label="Выбор за период времени и расширение файла"
|
||||||
<p>*Предполагаемое колличество страниц</p>
|
name="period"
|
||||||
<hr />
|
initialValue = { [initialBegin, initialEnd] }
|
||||||
<div>
|
>
|
||||||
<Button type="primary" className="submit_button">
|
<RangePicker
|
||||||
Получить рапорт
|
disabledDate={disabledDate}
|
||||||
|
allowClear={false}
|
||||||
|
onCalendarChange = { (dates, dateStrings, info) => {
|
||||||
|
setRangeDate([moment(dateStrings[0]), moment(dateStrings[1])])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
locale={locale}
|
||||||
|
showTime
|
||||||
|
/>
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
label="Шаг графиков"
|
||||||
|
name="step"
|
||||||
|
initialValue = {initialStep}
|
||||||
|
style={{marginLeft: '30px'}}
|
||||||
|
>
|
||||||
|
<Select
|
||||||
|
onChange={(value) => setStep(value)}
|
||||||
|
style={{ width: 100 }}
|
||||||
|
>
|
||||||
|
<Option value={600}>1 минута</Option>
|
||||||
|
<Option value={86400}>1 день</Option>
|
||||||
|
<Option value={604800}>1 неделя</Option>
|
||||||
|
</Select>
|
||||||
|
</Form.Item>
|
||||||
|
<Form.Item
|
||||||
|
label="Формат отчета"
|
||||||
|
name="format"
|
||||||
|
initialValue = {initialFormat}
|
||||||
|
onChange={(e) => setFormat(e.target.value)}
|
||||||
|
style={{marginLeft: '30px'}}
|
||||||
|
>
|
||||||
|
<Radio.Group>
|
||||||
|
<Radio.Button value={0}>PDF</Radio.Button>
|
||||||
|
<Radio.Button value={1}>LAS</Radio.Button>
|
||||||
|
</Radio.Group>
|
||||||
|
</Form.Item>
|
||||||
|
<Button
|
||||||
|
type="primary"
|
||||||
|
htmlType="submit"
|
||||||
|
className="submit_button"
|
||||||
|
style={{marginTop: '30px', marginLeft: '30px'}}>
|
||||||
|
<span>Получить рапорт</span>
|
||||||
|
<span style={{marginLeft: '5px'}}>
|
||||||
|
({approxPages} стр.)
|
||||||
|
</span>
|
||||||
|
<span style={{display: approxPages > 100 ? 'inline' : 'none' ,marginLeft: '5px'}}>
|
||||||
|
!!!
|
||||||
|
</span>
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
|
</Form>
|
||||||
|
<br/>
|
||||||
|
<p style={{marginBottom: '10px'}}>
|
||||||
|
Отчеты с аналогичными параметрами, доступные для скачивания:
|
||||||
|
</p> <br/>
|
||||||
|
|
||||||
|
<Table dataSource={suitableReports} columns={columns} />
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO ограничить датапикер по дате за 3 дня до
|
|
||||||
|
@ -10,10 +10,10 @@ export class ReportService {
|
|||||||
* Создает отчет по скважине с указанными параметрами
|
* Создает отчет по скважине с указанными параметрами
|
||||||
* @param wellId id скважины
|
* @param wellId id скважины
|
||||||
* @param stepSeconds шаг интервала
|
* @param stepSeconds шаг интервала
|
||||||
* @param format формат отчета (0-PDF, 1-LASS)
|
* @param format формат отчета (0-PDF, 1-LAS)
|
||||||
* @param begin дата начала интервала
|
* @param begin дата начала интервала
|
||||||
* @param end дата окончания интервала
|
* @param end дата окончания интервала
|
||||||
* @returns string Success
|
* @returns number Success
|
||||||
* @throws ApiError
|
* @throws ApiError
|
||||||
*/
|
*/
|
||||||
public static async createReport(
|
public static async createReport(
|
||||||
@ -22,7 +22,7 @@ stepSeconds?: number,
|
|||||||
format?: number,
|
format?: number,
|
||||||
begin?: string,
|
begin?: string,
|
||||||
end?: string,
|
end?: string,
|
||||||
): Promise<string> {
|
): Promise<number> {
|
||||||
const result = await __request({
|
const result = await __request({
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
path: `/api/well/${wellId}/report`,
|
path: `/api/well/${wellId}/report`,
|
||||||
@ -57,11 +57,42 @@ reportName?: string,
|
|||||||
return result.body;
|
return result.body;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Возвращает имена отчетов, хранящихся на диске,
|
||||||
|
* которые подходят под указанные параметры
|
||||||
|
* @param wellId id скважины
|
||||||
|
* @param stepSeconds шаг интервала
|
||||||
|
* @param format формат отчета (0-PDF, 1-LAS)
|
||||||
|
* @param begin дата начала интервала
|
||||||
|
* @param end дата окончания интервала
|
||||||
|
* @returns string Success
|
||||||
|
* @throws ApiError
|
||||||
|
*/
|
||||||
|
public static async getSuitableReportsNames(
|
||||||
|
wellId: number,
|
||||||
|
stepSeconds?: number,
|
||||||
|
format?: number,
|
||||||
|
begin?: string,
|
||||||
|
end?: string,
|
||||||
|
): Promise<Array<string>> {
|
||||||
|
const result = await __request({
|
||||||
|
method: 'GET',
|
||||||
|
path: `/api/well/${wellId}/suitableReports`,
|
||||||
|
query: {
|
||||||
|
'stepSeconds': stepSeconds,
|
||||||
|
'format': format,
|
||||||
|
'begin': begin,
|
||||||
|
'end': end,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
return result.body;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Возвращает прогнозируемое количество страниц будущего отчета
|
* Возвращает прогнозируемое количество страниц будущего отчета
|
||||||
* @param wellId id скважины
|
* @param wellId id скважины
|
||||||
* @param stepSeconds шаг интервала
|
* @param stepSeconds шаг интервала
|
||||||
* @param format формат отчета (0-PDF, 1-LASS)
|
* @param format формат отчета (0-PDF, 1-LAS)
|
||||||
* @param begin дата начала интервала
|
* @param begin дата начала интервала
|
||||||
* @param end дата окончания интервала
|
* @param end дата окончания интервала
|
||||||
* @returns string Success
|
* @returns string Success
|
||||||
|
@ -31,7 +31,7 @@ requestBody?: TelemetryInfoDto,
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Принимает данные от разных систем по скважине
|
* Принимает данные от разных систем по скважине
|
||||||
* @param uid Уникальный идентификатор отправителя
|
* @param uid Уникальный идентификатор <EFBFBD><EFBFBD>тправителя
|
||||||
* @param requestBody Данные
|
* @param requestBody Данные
|
||||||
* @returns any Success
|
* @returns any Success
|
||||||
* @throws ApiError
|
* @throws ApiError
|
||||||
|
Loading…
Reference in New Issue
Block a user