66 lines
2.7 KiB
TypeScript
66 lines
2.7 KiB
TypeScript
|
|
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>
|
||
|
|
);
|
||
|
|
}
|