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

89 lines
3.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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;