Исправления по DailyReport

* Добавлена блокировка некорректных дат рапортов
 * Изменён формат запрашиваемой даты
 * Добавлен сброс полей после добавления рапорта
 * Изменено правило фильтрации отображаемых рапортов
This commit is contained in:
goodmice 2022-05-06 17:04:33 +05:00
parent b02fec42f2
commit 5f03b751ee
2 changed files with 32 additions and 14 deletions

View File

@ -16,9 +16,15 @@ const Item = memo(({ style, ...other }) => <RawItem style={{ margin: 0, ...style
const table1Columns = [
makeGroupColumn('Отчётный период', [
makeColumn('От (дата, время)', 'dateStart', { width: 200, render: (_, { disabled, onChange }) => (
makeColumn('От (дата, время)', 'dateStart', { width: 200, render: (_, { disabled, onChange, checkIsDateBusy }) => (
<Item name={'reportDate'}>
<DatePicker disabled={disabled} format={'DD.MM.YYYY'} style={{ width: '100%' }} onChange={onChange} />
<DatePicker
onChange={onChange}
disabled={disabled}
format={'DD.MM.YYYY'}
style={{ width: '100%' }}
disabledDate={checkIsDateBusy}
/>
</Item>
)}),
]),
@ -122,7 +128,7 @@ const table2Summary = () => (
</Summary.Row>
)
export const ReportEditor = memo(({ visible, data, onDone, onCancel }) => {
export const ReportEditor = memo(({ visible, data, onDone, onCancel, checkIsDateBusy }) => {
const [form] = Form.useForm()
const [isInvalid, setIsInvalid] = useState(false)
const [isLoading, setIsLoading] = useState(false)
@ -150,22 +156,25 @@ export const ReportEditor = memo(({ visible, data, onDone, onCancel }) => {
else
await DailyReportService.add(idWell, formData)
onDone?.(formData)
form.resetFields()
},
setIsLoading,
'Не удалось сохранить суточный рапорт',
'Сохранение суточного рапорта',
), [data, onDone, idWell])
), [data, onDone, idWell, form])
const onDateChange = useCallback((date) => invokeWebApiWrapperAsync(
async () => {
if (data) return
const newData = await DailyReportService.getOrGenerate(idWell, date.toISOString())
const newData = await DailyReportService.getOrGenerate(idWell, date.format('YYYY-MM-DD') + 'Z')
if (checkIsDateBusy(moment(newData.reportDate)))
throw 'Рапорт на данную дату уже существует'
setFields(newData)
},
setIsLoading,
'Не удалось загрузить автозаполняемые данные для нового рапорта',
'Получение автозаполняемых данных суточного рапорта',
), [idWell, data, setFields])
), [idWell, data, setFields, checkIsDateBusy])
return (
<Modal
@ -191,7 +200,12 @@ export const ReportEditor = memo(({ visible, data, onDone, onCancel }) => {
onChange={onFormChange}
>
<Item name={'reportDate'} label={'Дата рапорта'} rules={[{ required: true }]}>
<DatePicker disabled={!!data} format={'DD.MM.YYYY'} onChange={onDateChange} />
<DatePicker
disabled={!!data}
format={'DD.MM.YYYY'}
onChange={onDateChange}
disabledDate={checkIsDateBusy}
/>
</Item>
<Divider />
<Space direction={'vertical'} size={'middle'} style={{ width: '100%' }}>
@ -201,7 +215,7 @@ export const ReportEditor = memo(({ visible, data, onDone, onCancel }) => {
bordered
size={'small'}
columns={table1Columns}
dataSource={[{ key: '', disabled: !!data, onChange: onDateChange }]}
dataSource={[{ key: '', disabled: !!data, onChange: onDateChange, checkIsDateBusy }]}
pagination={false}
/>
<Item label={'Бурильщик 1 смена'} name={'firstDriller'}><Input /></Item>

View File

@ -1,11 +1,11 @@
import moment from 'moment'
import { Button, DatePicker } from 'antd'
import { Button } from 'antd'
import { FileExcelOutlined, EditOutlined, PlusOutlined } from '@ant-design/icons'
import { memo, useCallback, useContext, useEffect, useMemo, useState } from 'react'
import { IdWellContext } from '@asb/context'
import LoaderPortal from '@components/LoaderPortal'
import { Table, makeDateColumn, makeColumn } from '@components/Table'
import { DateRangeWrapper, Table, makeDateColumn, makeColumn } from '@components/Table'
import { download, invokeWebApiWrapperAsync } from '@components/factory'
import { DailyReportService } from '@api'
import { arrayOrDefault } from '@utils'
@ -33,8 +33,10 @@ export const DailyReport = memo(() => {
useEffect(updateTable, [updateTable])
const checkIsDateBusy = useCallback((current) => current.isAfter(moment(), 'day') || data.some((row) => moment(row.reportDate).isSame(current, 'day')), [data])
const columns = useMemo(() => [
makeDateColumn('Дата', 'reportDate', undefined, undefined, { width: 300 }),
makeDateColumn('Дата', 'reportDate', undefined, 'YYYY.MM.DD', { width: 300 }),
makeColumn('', '', { width: 200, render: (_, report) => (
<>
<Button
@ -58,7 +60,8 @@ export const DailyReport = memo(() => {
const filteredData = useMemo(() => {
if (!searchDate) return data
return data.filter((row) => moment.utc(row.reportDate).local().isBetween(...searchDate))
const endDate = moment(searchDate[1]).add(1, 'd')
return data.filter((row) => moment(row.reportDate).isBetween(searchDate[0], endDate, 'ms', '[)'))
}, [data, searchDate])
return (
@ -68,8 +71,8 @@ export const DailyReport = memo(() => {
<div>
<div>
<div>Диапозон дат отчёта</div>
<DatePicker.RangePicker
allowClear={false}
<DateRangeWrapper
showTime={false}
format={'DD.MM.YYYY'}
defaultValue={searchDate}
onCalendarChange={setSearchDate}
@ -102,6 +105,7 @@ export const DailyReport = memo(() => {
setIsEditorVisible(false)
updateTable()
}}
checkIsDateBusy={checkIsDateBusy}
/>
</>
)