todou-frontend/src/components/admin/YearEndManagement.tsx

89 lines
3.2 KiB
TypeScript
Raw Normal View History

2025-02-10 23:24:18 +01:00
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;