89 lines
3.2 KiB
TypeScript
89 lines
3.2 KiB
TypeScript
|
import React, { useState, useEffect } from 'react';
|
|||
|
import { Button, Card, Descriptions, Alert, App as AntdApp } from 'antd';
|
|||
|
import { useGet, usePost } from '../../hooks/useApi';
|
|||
|
|
|||
|
interface TransferStatus {
|
|||
|
id: number;
|
|||
|
year: number;
|
|||
|
completed_at: string;
|
|||
|
status: string;
|
|||
|
error_message?: string;
|
|||
|
}
|
|||
|
|
|||
|
const YearEndManagement: React.FC = () => {
|
|||
|
const [loading, setLoading] = useState(false);
|
|||
|
const [lastTransfer, setLastTransfer] = useState<TransferStatus | null>(null);
|
|||
|
const { message } = AntdApp.useApp();
|
|||
|
// Используем `useGet` для получения статуса
|
|||
|
const { data, error, execute: fetchStatus } = useGet<TransferStatus>('/year-end/status');
|
|||
|
|
|||
|
// Используем `usePost` для выполнения переноса
|
|||
|
const { execute: transferData } = usePost('/year-end/transfer');
|
|||
|
|
|||
|
// Обновляем состояние, когда `data` загружено
|
|||
|
useEffect(() => {
|
|||
|
if (data) setLastTransfer(data);
|
|||
|
}, [data]);
|
|||
|
|
|||
|
// Обработчик клика на кнопку переноса
|
|||
|
const handleTransfer = async () => {
|
|||
|
const currentYear = new Date().getFullYear();
|
|||
|
const confirm = window.confirm(
|
|||
|
`Вы уверены, что хотите выполнить перенос остатков за ${currentYear} год?`
|
|||
|
);
|
|||
|
|
|||
|
if (!confirm) return;
|
|||
|
|
|||
|
setLoading(true);
|
|||
|
try {
|
|||
|
await transferData(); // Выполняем POST-запрос
|
|||
|
message.success('Перенос остатков успешно выполнен');
|
|||
|
fetchStatus(); // Обновляем статус
|
|||
|
} catch {
|
|||
|
message.error('Ошибка при переносе остатков');
|
|||
|
} finally {
|
|||
|
setLoading(false);
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
return (
|
|||
|
<Card title="Управление переносом остатков">
|
|||
|
<Alert
|
|||
|
message="Внимание"
|
|||
|
description="Перенос остатков создаст новые категории для следующего года и перенесет все товары с ненулевым количеством."
|
|||
|
type="warning"
|
|||
|
showIcon
|
|||
|
style={{ marginBottom: 16 }}
|
|||
|
/>
|
|||
|
|
|||
|
{error && <Alert message="Ошибка" description={error} type="error" showIcon />}
|
|||
|
|
|||
|
{lastTransfer && (
|
|||
|
<Descriptions title="Последний перенос" bordered style={{ marginBottom: 16 }}>
|
|||
|
<Descriptions.Item label="Год">{lastTransfer.year}</Descriptions.Item>
|
|||
|
<Descriptions.Item label="Дата выполнения">
|
|||
|
{new Date(lastTransfer.completed_at).toLocaleString()}
|
|||
|
</Descriptions.Item>
|
|||
|
<Descriptions.Item label="Статус">{lastTransfer.status}</Descriptions.Item>
|
|||
|
{lastTransfer.error_message && (
|
|||
|
<Descriptions.Item label="Ошибка">
|
|||
|
{lastTransfer.error_message}
|
|||
|
</Descriptions.Item>
|
|||
|
)}
|
|||
|
</Descriptions>
|
|||
|
)}
|
|||
|
|
|||
|
<Button
|
|||
|
type="primary"
|
|||
|
onClick={handleTransfer}
|
|||
|
loading={loading}
|
|||
|
disabled={loading}
|
|||
|
>
|
|||
|
Выполнить перенос остатков
|
|||
|
</Button>
|
|||
|
</Card>
|
|||
|
);
|
|||
|
};
|
|||
|
|
|||
|
export default YearEndManagement;
|