From de18086699f60cb78ba250a72fce2a2b50bcaa36 Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Wed, 22 Apr 2026 10:20:19 +0900 Subject: [PATCH] =?UTF-8?q?feat(calculate):=20=EC=98=A4=EB=A6=AC=EC=A7=80?= =?UTF-8?q?=EB=84=90=20=EC=8B=9C=EB=A6=AC=EC=A6=88=20=EC=A0=95=EC=82=B0=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Junie --- src/api/original_series_settlement.js | 37 ++ src/components/SideMenu.vue | 14 +- src/router/index.js | 5 + .../Calculate/OriginalSeriesSettlement.vue | 340 ++++++++++++++++++ 4 files changed, 394 insertions(+), 2 deletions(-) create mode 100644 src/api/original_series_settlement.js create mode 100644 src/views/Calculate/OriginalSeriesSettlement.vue diff --git a/src/api/original_series_settlement.js b/src/api/original_series_settlement.js new file mode 100644 index 0000000..6252810 --- /dev/null +++ b/src/api/original_series_settlement.js @@ -0,0 +1,37 @@ +import Vue from 'vue'; + +// 소지 유저 조회 +async function getOwners() { + return Vue.axios.get('/admin/calculate/original-series/owners'); +} + +// 정산 내역 조회 (page는 1부터 시작하는 UI 기준, 서버에는 0부터 전달) +async function getSettlementDetails({ startDate, endDate, creatorId, page = 1, size = 10 }) { + const params = new URLSearchParams(); + // 서버 파라미터 스펙 변경: start_date, end_date, creator_id + if (startDate) params.append('start_date', startDate); + if (endDate) params.append('end_date', endDate); + if (creatorId != null) params.append("creator_id", creatorId); + params.append('page', Math.max(0, (page || 1) - 1)); + params.append('size', size || 10); + + return Vue.axios.get(`/admin/calculate/original-series/settlement-details?${params.toString()}`); +} + +// 엑셀 다운로드 (xlsx 바이너리) +async function downloadSettlementExcel({ startDate, endDate }) { + const params = new URLSearchParams(); + // 서버 파라미터 스펙 변경: start_date, end_date + if (startDate) params.append('start_date', startDate); + if (endDate) params.append('end_date', endDate); + + return Vue.axios.get(`/admin/calculate/original-series/settlement-details/excel?${params.toString()}` , { + responseType: 'blob' + }); +} + +export { + getOwners, + getSettlementDetails, + downloadSettlementExcel, +}; diff --git a/src/components/SideMenu.vue b/src/components/SideMenu.vue index 239b15b..072efa5 100644 --- a/src/components/SideMenu.vue +++ b/src/components/SideMenu.vue @@ -173,9 +173,9 @@ export default { // ignore } - // 정산 관리 메뉴에 '채널 후원 정산' 추가 + // 정산현황 메뉴에 '채널 후원 정산' 추가 try { - const calculateMenu = this.items.find(m => m && m.title === '정산 관리') + const calculateMenu = this.items.find(m => m && m.title === '정산현황') if (calculateMenu) { if (!Array.isArray(calculateMenu.items)) { calculateMenu.items = calculateMenu.items ? [].concat(calculateMenu.items) : [] @@ -188,6 +188,16 @@ export default { items: null }) } + + // '오리지널 시리즈 정산' 추가 + const existsOriginal = calculateMenu.items.some(ci => ci && ci.route === '/calculate/original-series') + if (!existsOriginal) { + calculateMenu.items.push({ + title: '오리지널 시리즈 정산', + route: '/calculate/original-series', + items: null + }) + } } } catch (e) { // ignore diff --git a/src/router/index.js b/src/router/index.js index 48b4e84..335422d 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -51,6 +51,11 @@ const routes = [ component: () => import(/* webpackChunkName: "counselor" */ '../views/Creator/CreatorSettlementRatio.vue') }, // Agent Management + { + path: '/calculate/original-series', + name: 'OriginalSeriesSettlement', + component: () => import(/* webpackChunkName: "calculate" */ '../views/Calculate/OriginalSeriesSettlement.vue') + }, { path: '/agent/list', name: 'AgentList', diff --git a/src/views/Calculate/OriginalSeriesSettlement.vue b/src/views/Calculate/OriginalSeriesSettlement.vue new file mode 100644 index 0000000..cf7daf4 --- /dev/null +++ b/src/views/Calculate/OriginalSeriesSettlement.vue @@ -0,0 +1,340 @@ + + + + + -- 2.49.1