From f72fcf06045d8ccccdeee3338cb8b0e6a872e72d Mon Sep 17 00:00:00 2001 From: "focp212@naver.com" Date: Tue, 11 Nov 2025 10:22:43 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B1=B0=EB=9E=98=EB=82=B4=EC=97=AD=20?= =?UTF-8?q?=EC=97=91=EC=85=80=20=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/use-billing-excel-mutation.ts | 39 +++++++++++++++++++ ...se-cash-receipt-excel-download-mutation.ts | 2 +- .../api/use-escrow-download-excel-mutation.ts | 8 ++-- src/entities/transaction/model/types.ts | 22 ++++++++--- .../transaction/all-transaction/list-page.tsx | 1 + src/pages/transaction/billing/list-page.tsx | 30 +++++++++++++- .../transaction/cash-receipt/list-page.tsx | 31 ++++++++++++++- src/pages/transaction/escrow/list-page.tsx | 29 +++++++++++++- src/shared/api/api-url-transaction.ts | 4 ++ 9 files changed, 150 insertions(+), 16 deletions(-) create mode 100644 src/entities/transaction/api/use-billing-excel-mutation.ts diff --git a/src/entities/transaction/api/use-billing-excel-mutation.ts b/src/entities/transaction/api/use-billing-excel-mutation.ts new file mode 100644 index 0000000..4b5a2e9 --- /dev/null +++ b/src/entities/transaction/api/use-billing-excel-mutation.ts @@ -0,0 +1,39 @@ +import axios from 'axios'; +import { API_URL_TRANSACTION } from '@/shared/api/api-url-transaction'; +import { resultify } from '@/shared/lib/resultify'; +import { NiceAxiosError } from '@/shared/@types/error'; +import { + BillingExcelParams, + BillingExcelResponse +} from '../model/types'; +import { + useMutation, + UseMutationOptions +} from '@tanstack/react-query'; +import { getHeaderUserAgent } from '@/shared/constants/url'; + +export const billingExcel = (params: BillingExcelParams) => { + let headerOptions = { + menuId: 34, + apiType: 'DOWNLOAD' + }; + let options = { + headers: { + 'X-User-Agent': getHeaderUserAgent(headerOptions) + } + }; + return resultify( + axios.post(API_URL_TRANSACTION.billingExcel(), params, options), + ); +}; + +export const useBillingExcelMutation = (options?: UseMutationOptions) => { + const mutation = useMutation({ + ...options, + mutationFn: (params: BillingExcelParams) => billingExcel(params), + }); + + return { + ...mutation, + }; +}; diff --git a/src/entities/transaction/api/use-cash-receipt-excel-download-mutation.ts b/src/entities/transaction/api/use-cash-receipt-excel-download-mutation.ts index 5dae046..41149db 100644 --- a/src/entities/transaction/api/use-cash-receipt-excel-download-mutation.ts +++ b/src/entities/transaction/api/use-cash-receipt-excel-download-mutation.ts @@ -23,7 +23,7 @@ export const cashReceiptExcelDownload = (params: CashReceiptExcelDownloadParams) } }; return resultify( - axios.post(API_URL_TRANSACTION.cashReceiptReceiptDownload(), params, options), + axios.post(API_URL_TRANSACTION.cashReceiptExcelDownload(), params, options), ); }; diff --git a/src/entities/transaction/api/use-escrow-download-excel-mutation.ts b/src/entities/transaction/api/use-escrow-download-excel-mutation.ts index 0846c0a..1d1ff52 100644 --- a/src/entities/transaction/api/use-escrow-download-excel-mutation.ts +++ b/src/entities/transaction/api/use-escrow-download-excel-mutation.ts @@ -12,7 +12,7 @@ import { } from '@tanstack/react-query'; import { getHeaderUserAgent } from '@/shared/constants/url'; -export const escrowDownloadExcelList = (params: EscrowDownloadExcelParams) => { +export const escrowDownloadExcel = (params: EscrowDownloadExcelParams) => { let headerOptions = { menuId: 33, apiType: 'DOWNLOAD' @@ -23,14 +23,14 @@ export const escrowDownloadExcelList = (params: EscrowDownloadExcelParams) => { } }; return resultify( - axios.post(API_URL_TRANSACTION.escrowList(), params, options), + axios.post(API_URL_TRANSACTION.escrowDownloadExcel(), params, options), ); }; -export const useEscrowListMutation = (options?: UseMutationOptions) => { +export const useEscrowDownloadExcelMutation = (options?: UseMutationOptions) => { const mutation = useMutation({ ...options, - mutationFn: (params: EscrowDownloadExcelParams) => escrowDownloadExcelList(params), + mutationFn: (params: EscrowDownloadExcelParams) => escrowDownloadExcel(params), }); return { diff --git a/src/entities/transaction/model/types.ts b/src/entities/transaction/model/types.ts index a9b896b..e052529 100644 --- a/src/entities/transaction/model/types.ts +++ b/src/entities/transaction/model/types.ts @@ -302,7 +302,7 @@ export interface CashReceiptExcelDownloadParams { mid: string; startDate: string; endDate: string; - dateType: CashReceiptDateType; + dateType?: CashReceiptDateType; purposeType: CashReceiptPurposeType; transactionType: CashReceiptTransactionType; processResult: CashReceiptProcessResult; @@ -333,18 +333,30 @@ export interface EscrowDownloadExcelResponse {}; export interface BillingListParams { mid?: string; - searchType?: string; + searchType?: BillingSearchType; searchKeyword?: string; startDate?: string; endDate?: string; - requestStatus?: string; - processResult?: string; - paymentMethod?: string; + requestStatus?: BillingRequestStatus; + processResult?: BillingProcessResult; + paymentMethod?: BillingPaymentMethod; minAmount?: number; maxAmount?: number; page?: DefaultRequestPagination }; +export interface BillingExcelParams { + email: string; + mid: string; + searchType: BillingSearchType; + startDate: string; + endDate: string; + requestStatus: BillingRequestStatus, + processResult: BillingProcessResult, + paymentMethod: BillingPaymentMethod +}; +export interface BillingExcelResponse {}; + export interface AllTransactionDetailParams { serviceCode?: string; tid?: string; diff --git a/src/pages/transaction/all-transaction/list-page.tsx b/src/pages/transaction/all-transaction/list-page.tsx index e48cce0..7b29644 100644 --- a/src/pages/transaction/all-transaction/list-page.tsx +++ b/src/pages/transaction/all-transaction/list-page.tsx @@ -224,6 +224,7 @@ export const AllTransactionListPage = () => { }; transactionDownloadExcel(params).then((rs: TransactionDownloadExcelResponse) => { console.log(rs); + snackBar('이메일로 엑셀파일 요청이 완료되었습니다.'); }).catch((e: any) => { if(e.response?.data?.error?.message){ snackBar(e.response?.data?.error?.message); diff --git a/src/pages/transaction/billing/list-page.tsx b/src/pages/transaction/billing/list-page.tsx index 46a0219..788cbb8 100644 --- a/src/pages/transaction/billing/list-page.tsx +++ b/src/pages/transaction/billing/list-page.tsx @@ -15,7 +15,8 @@ import { ListItemProps, BillingListParams, BillingListResponse, - DetailData + DetailData, + BillingExcelParams } from '@/entities/transaction/model/types'; import { useBillingListMutation } from '@/entities/transaction/api/use-billing-list-mutation'; import { DEFAULT_PAGE_PARAM } from '@/entities/common/model/constant'; @@ -35,6 +36,7 @@ import { BillingDetail } from '@/entities/transaction/ui/detail/billing-detail'; import { showAlert } from '@/widgets/show-alert'; import { checkGrant } from '@/shared/lib/check-grant'; import { snackBar } from '@/shared/lib'; +import { useBillingExcelMutation } from '@/entities/transaction/api/use-billing-excel-mutation'; /* 빌링 34 */ const menuId = 34; @@ -72,6 +74,8 @@ export const BillingListPage = () => { useSetFooterMode(false); const { mutateAsync: billingList } = useBillingListMutation(); + const { mutateAsync: billingExcel } = useBillingExcelMutation(); + const onIntersect: IntersectionObserverCallback = (entries: Array) => { entries.forEach((entry: IntersectionObserverEntry) => { if(entry.isIntersecting){ @@ -179,7 +183,29 @@ export const BillingListPage = () => { selectedMode: DownloadSelectedMode, userEmail?: string ) => { - + if(selectedMode === DownloadSelectedMode.EMAIL + && !!userEmail + ){ + let params: BillingExcelParams = { + email: userEmail, + mid: mid, + searchType: searchType, + startDate: startDate, + endDate: endDate, + requestStatus: requestStatus, + processResult: processResult, + paymentMethod: paymentMethod + }; + billingExcel(params).then((rs) => { + console.log(rs); + snackBar('이메일로 엑셀파일 요청이 완료되었습니다.'); + }).catch((e: any) => { + if(e.response?.data?.error?.message){ + snackBar(e.response?.data?.error?.message); + return; + } + }); + } }; const setDetailData = (detailData: DetailData) => { diff --git a/src/pages/transaction/cash-receipt/list-page.tsx b/src/pages/transaction/cash-receipt/list-page.tsx index 287c625..3b278d2 100644 --- a/src/pages/transaction/cash-receipt/list-page.tsx +++ b/src/pages/transaction/cash-receipt/list-page.tsx @@ -16,7 +16,9 @@ import { CashReceiptSummaryParams, CashReceiptListResponse, CashReceiptSummaryResponse, - DetailData + DetailData, + CashReceiptExcelDownloadParams, + CashReceiptExcelDownloadResponse } from '@/entities/transaction/model/types'; import { useCashReceiptListMutation } from '@/entities/transaction/api/use-cash-receipt-list-mutation'; import { DEFAULT_PAGE_PARAM } from '@/entities/common/model/constant'; @@ -38,6 +40,7 @@ import { CashReceiptDetail } from '@/entities/transaction/ui/detail/cash-receit- import { checkGrant } from '@/shared/lib/check-grant'; import { showAlert } from '@/widgets/show-alert'; import { snackBar } from '@/shared/lib'; +import { useCashReceiptExcelDownloadMutation } from '@/entities/transaction/api/use-cash-receipt-excel-download-mutation'; /* 현금영수증 32 */ const menuId = 32; @@ -80,6 +83,8 @@ export const CashReceiptListPage = () => { const { mutateAsync: cashReceiptList } = useCashReceiptListMutation(); const { mutateAsync: cashReceiptSummary } = useCashReceiptSummaryMutation(); + const { mutateAsync: cashReceiptExcelDownload } = useCashReceiptExcelDownloadMutation(); + const onIntersect: IntersectionObserverCallback = (entries: Array) => { entries.forEach((entry: IntersectionObserverEntry) => { if(entry.isIntersecting){ @@ -176,7 +181,29 @@ export const CashReceiptListPage = () => { selectedMode: DownloadSelectedMode, userEmail?: string ) => { - + if(selectedMode === DownloadSelectedMode.EMAIL + && !!userEmail + ){ + let params: CashReceiptExcelDownloadParams = { + email: userEmail, + mid: mid, + startDate: startDate, + endDate: endDate, + purposeType: purposeType, + transactionType: transactionType, + processResult: processResult + }; + + cashReceiptExcelDownload(params).then((rs: CashReceiptExcelDownloadResponse) => { + console.log(rs); + snackBar('이메일로 엑셀파일 요청이 완료되었습니다.'); + }).catch((e: any) => { + if(e.response?.data?.error?.message){ + snackBar(e.response?.data?.error?.message); + return; + } + }); + } }; diff --git a/src/pages/transaction/escrow/list-page.tsx b/src/pages/transaction/escrow/list-page.tsx index 318accd..66d72c7 100644 --- a/src/pages/transaction/escrow/list-page.tsx +++ b/src/pages/transaction/escrow/list-page.tsx @@ -14,7 +14,9 @@ import { ListItemProps, EscrowListParams, EscrowListResponse, - DetailData + DetailData, + EscrowDownloadExcelParams, + EscrowDownloadExcelResponse } from '@/entities/transaction/model/types'; import { useEscrowListMutation } from '@/entities/transaction/api/use-escrow-list-mutation'; import { DEFAULT_PAGE_PARAM } from '@/entities/common/model/constant'; @@ -34,6 +36,7 @@ import { EscrowDetail } from '@/entities/transaction/ui/detail/escrow-detail'; import { checkGrant } from '@/shared/lib/check-grant'; import { showAlert } from '@/widgets/show-alert'; import { snackBar } from '@/shared/lib'; +import { useEscrowDownloadExcelMutation } from '@/entities/transaction/api/use-escrow-download-excel-mutation'; /* 에스크로 33 */ const menuId = 33; @@ -72,6 +75,8 @@ export const EscrowListPage = () => { useSetFooterMode(false); const { mutateAsync: escrowList } = useEscrowListMutation(); + const { mutateAsync: escrowDownloadExcel } = useEscrowDownloadExcelMutation(); + const onIntersect: IntersectionObserverCallback = (entries: Array) => { entries.forEach((entry: IntersectionObserverEntry) => { if(entry.isIntersecting){ @@ -162,7 +167,27 @@ export const EscrowListPage = () => { selectedMode: DownloadSelectedMode, userEmail?: string ) => { - + if(selectedMode === DownloadSelectedMode.EMAIL + && !!userEmail + ){ + let params: EscrowDownloadExcelParams = { + email: userEmail, + mid: mid, + startDate: startDate, + endDate: endDate, + deliveryStatus: deliveryStatus, + settlementStatus: settlementStatus + }; + escrowDownloadExcel(params).then((rs: EscrowDownloadExcelResponse) => { + console.log(rs); + snackBar('이메일로 엑셀파일 요청이 완료되었습니다.'); + }).catch((e: any) => { + if(e.response?.data?.error?.message){ + snackBar(e.response?.data?.error?.message); + return; + } + }); + } }; const setDetailData = (detailData: DetailData) => { diff --git a/src/shared/api/api-url-transaction.ts b/src/shared/api/api-url-transaction.ts index 7ea4863..0e9fa98 100644 --- a/src/shared/api/api-url-transaction.ts +++ b/src/shared/api/api-url-transaction.ts @@ -93,5 +93,9 @@ export const API_URL_TRANSACTION = { // POST: 빌링 결제 신청 return `${API_BASE_URL}/api/v1/${API_URL_KEY}/billing/charge`; }, + billingExcel: () => { + // POST: 빌링 거래내역 엑셀 다운로드 + return `${API_BASE_URL}/api/v1/${API_URL_KEY}/billing/excel`; + } }; \ No newline at end of file