import { useState } from 'react'; import { Alert, Descriptions, Form, Input, InputNumber, Modal, Space, message } from 'antd'; import { ProCard } from '@ant-design/pro-components'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import type { ColDef } from '@ag-grid-community/core'; import dayjs from 'dayjs'; import PageContainer from '@/components/common/PageContainer'; import DataGrid from '@/components/common/DataGrid'; import PermissionButton from '@/components/common/PermissionButton'; import { commissionApi, StatuteConfigRow } from '@/api/commission'; import { GRAY, RADIUS, SHADOW } from '@/theme/tokens'; const COLS: ColDef[] = [ { field: 'entityType', headerName: '대상유형', width: 200 }, { field: 'expirationMonths', headerName: '시효(개월)', width: 130, type: 'numericColumn' }, { field: 'isActive', headerName: '활성', width: 80 }, ]; export default function StatuteConfig() { const qc = useQueryClient(); const [editTarget, setEditTarget] = useState(null); const [expireMonth, setExpireMonth] = useState(dayjs().format('YYYYMM')); const [expireResult, setExpireResult] = useState<{ expiredCount: number } | null>(null); const [form] = Form.useForm>(); const { data: configData, isLoading, isError } = useQuery({ queryKey: ['statuteConfig', 'list'], queryFn: () => commissionApi.statuteConfigs(), retry: false, }); const rows = configData?.list ?? []; const updateMutation = useMutation({ mutationFn: ({ configId, values }: { configId: number; values: Partial }) => commissionApi.statuteConfigUpdate(configId, values), onSuccess: () => { message.success('설정 수정 완료'); qc.invalidateQueries({ queryKey: ['statuteConfig', 'list'] }); setEditTarget(null); }, }); const expireMutation = useMutation({ mutationFn: (baseMonth: string) => commissionApi.statuteExpire(baseMonth), onSuccess: (result) => { setExpireResult(result); message.success(`만료 처리 완료 — ${result.expiredCount}건`); qc.invalidateQueries({ queryKey: ['statuteConfig', 'list'] }); }, }); const handleUpdate = async () => { const values = await form.validateFields(); updateMutation.mutate({ configId: editTarget!.configId, values }); }; const openEdit = (row: StatuteConfigRow) => { setEditTarget(row); form.setFieldsValue({ expirationMonths: row.expirationMonths, isActive: row.isActive, }); }; const handleExpire = () => Modal.confirm({ title: '만료 실행', content: `기준월 ${expireMonth} 기준으로 시효 만료된 채권을 WRITTEN_OFF 처리합니다. 계속하시겠습니까?`, okType: 'danger', onOk: () => expireMutation.mutateAsync(expireMonth), }); const cardStyle = { background: '#fff', borderRadius: RADIUS.lg, border: `1px solid ${GRAY[100]}`, boxShadow: SHADOW.sm }; return ( {isError && ( )} rows={rows} columns={[ ...COLS, { headerName: '액션', width: 100, pinned: 'right', cellRenderer: (p: { data: StatuteConfigRow }) => ( openEdit(p.data)} > 수정 ), }, ]} loading={isLoading} height={200} rowKey="configId" /> 기준월: setExpireMonth(e.target.value)} placeholder="YYYYMM" style={{ width: 120 }} /> 만료 실행 {expireResult && ( {expireResult.expiredCount}건이 WRITTEN_OFF 처리되었습니다. )} setEditTarget(null)} okText="저장" cancelText="취소" confirmLoading={updateMutation.isPending} >
); }