Files
ga-commission-system/ga-frontend/src/pages/settle/BatchRun.tsx
T

66 lines
2.7 KiB
TypeScript
Raw Normal View History

import { useState } from 'react';
import { Button, Card, DatePicker, Descriptions, message, Progress, Space } from 'antd';
import { useQuery } from '@tanstack/react-query';
import dayjs, { Dayjs } from 'dayjs';
import PageContainer from '@/components/common/PageContainer';
import CodeBadge from '@/components/common/CodeBadge';
import { batchApi } from '@/api/settle';
export default function BatchRun() {
const [settleMonth, setSettleMonth] = useState<Dayjs | null>(dayjs());
const { data: status, refetch } = useQuery({
queryKey: ['batch', 'status'],
queryFn: batchApi.status,
refetchInterval: (q) => {
const s = (q.state.data as any)?.status;
return s === 'STARTED' || s === 'RUNNING' ? 3000 : false;
},
});
const onRun = async () => {
if (!settleMonth) { message.warning('정산월을 선택하세요'); return; }
try {
await batchApi.run(settleMonth.format('YYYYMM'));
message.success('배치 실행 요청됨');
refetch();
} catch {
// 인터셉터에서 처리
}
};
return (
<PageContainer title="정산 배치 실행">
<Card style={{ marginBottom: 16 }}>
<Space>
<DatePicker picker="month" value={settleMonth} onChange={setSettleMonth} />
<Button type="primary" onClick={onRun}> </Button>
<Button onClick={() => refetch()}> </Button>
</Space>
</Card>
{status && (
<Card title="최근 배치 상태">
<Descriptions column={2} bordered size="small">
<Descriptions.Item label="작업명">{status.jobName}</Descriptions.Item>
<Descriptions.Item label="정산월">{status.settleMonth}</Descriptions.Item>
<Descriptions.Item label="상태"><CodeBadge groupCode="SETTLE_STATUS" value={status.status} /></Descriptions.Item>
<Descriptions.Item label="현재 Step">{status.currentStep ?? '-'}</Descriptions.Item>
<Descriptions.Item label="시작 시각">{status.startedAt ?? '-'}</Descriptions.Item>
<Descriptions.Item label="종료 시각">{status.finishedAt ?? '-'}</Descriptions.Item>
<Descriptions.Item label="소요 시간">{status.durationSec ? `${status.durationSec}` : '-'}</Descriptions.Item>
<Descriptions.Item label="에러">{status.errorMessage ?? '-'}</Descriptions.Item>
</Descriptions>
{(status.progressPct ?? 0) > 0 && (
<Progress
percent={status.progressPct}
status={status.status === 'FAILED' ? 'exception' : status.status === 'COMPLETED' ? 'success' : 'active'}
style={{ marginTop: 16 }}
/>
)}
</Card>
)}
</PageContainer>
);
}