From 864402b09de2ef649c36d1ba4cc37f4c26dd69e7 Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Sat, 11 Apr 2026 20:01:24 +0900 Subject: [PATCH 01/10] =?UTF-8?q?feat(member):=20=ED=9A=8C=EC=9B=90=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=8B=A4=EC=9D=B4=EC=96=BC=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=97=90=20AGENT(=EC=97=90=EC=9D=B4=EC=A0=84=ED=8A=B8?= =?UTF-8?q?)=20=ED=83=80=EC=9E=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 라디오 그룹에 `AGENT` 옵션(라벨: "에이전트") 추가 - `showPopupDialog`에서 서버값 '에이전트' → 내부값 'AGENT' 매핑 로직 추가 - `modify`의 변경 없음 판단 로직에 AGENT ↔ 에이전트 비교 조건 반영 --- src/views/Member/MemberList.vue | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/views/Member/MemberList.vue b/src/views/Member/MemberList.vue index 07dfac1..8bcd212 100644 --- a/src/views/Member/MemberList.vue +++ b/src/views/Member/MemberList.vue @@ -183,6 +183,10 @@ value="CREATOR" label="크리에이터" /> + Date: Sat, 11 Apr 2026 20:37:49 +0900 Subject: [PATCH 02/10] =?UTF-8?q?feat(agent):=20=EC=82=AC=EC=9D=B4?= =?UTF-8?q?=EB=93=9C=EB=B0=94=EC=97=90=20=E2=80=98=EC=97=90=EC=9D=B4?= =?UTF-8?q?=EC=A0=84=ED=8A=B8=20=EA=B4=80=EB=A6=AC=E2=80=99=20=EB=A9=94?= =?UTF-8?q?=EB=89=B4=20=EB=B0=8F=20=EB=9D=BC=EC=9A=B0=ED=8A=B8/=EA=B8=B0?= =?UTF-8?q?=EB=B3=B8=20=EB=B7=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - router: /agent/list, /agent/settlement-ratio 라우트 등록 - SideMenu: ‘크리에이터 관리’ 바로 아래 ‘에이전트 관리’ 섹션 동적 삽입 - views: AgentList.vue, AgentSettlementRatio.vue 스텁 추가 --- src/components/SideMenu.vue | 23 +++++++++++++++++++++++ src/router/index.js | 11 +++++++++++ src/views/Agent/AgentList.vue | 19 +++++++++++++++++++ src/views/Agent/AgentSettlementRatio.vue | 19 +++++++++++++++++++ 4 files changed, 72 insertions(+) create mode 100644 src/views/Agent/AgentList.vue create mode 100644 src/views/Agent/AgentSettlementRatio.vue diff --git a/src/components/SideMenu.vue b/src/components/SideMenu.vue index 2819df9..239b15b 100644 --- a/src/components/SideMenu.vue +++ b/src/components/SideMenu.vue @@ -150,6 +150,29 @@ export default { ] }) + // 에이전트 관리 메뉴를 '크리에이터 관리' 바로 아래에 추가 + try { + const insertAfterTitle = '크리에이터 관리' + const agentMenu = { + title: '에이전트 관리', + route: null, + items: [ + { title: '에이전트 리스트', route: '/agent/list', items: null }, + { title: '에이전트 정산 비율', route: '/agent/settlement-ratio', items: null }, + ] + } + + const idx = this.items.findIndex(m => m && m.title === insertAfterTitle) + if (idx >= 0) { + this.items.splice(idx + 1, 0, agentMenu) + } else { + // 기준 메뉴가 없으면 하단에 추가 + this.items.push(agentMenu) + } + } catch (e) { + // ignore + } + // 정산 관리 메뉴에 '채널 후원 정산' 추가 try { const calculateMenu = this.items.find(m => m && m.title === '정산 관리') diff --git a/src/router/index.js b/src/router/index.js index 307c7e3..4eaa859 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -50,6 +50,17 @@ const routes = [ name: 'CreatorReview', component: () => import(/* webpackChunkName: "counselor" */ '../views/Creator/CreatorSettlementRatio.vue') }, + // Agent Management + { + path: '/agent/list', + name: 'AgentList', + component: () => import(/* webpackChunkName: "agent" */ '../views/Agent/AgentList.vue') + }, + { + path: '/agent/settlement-ratio', + name: 'AgentSettlementRatio', + component: () => import(/* webpackChunkName: "agent" */ '../views/Agent/AgentSettlementRatio.vue') + }, { path: '/live/tags', name: 'LiveTags', diff --git a/src/views/Agent/AgentList.vue b/src/views/Agent/AgentList.vue new file mode 100644 index 0000000..09b22cd --- /dev/null +++ b/src/views/Agent/AgentList.vue @@ -0,0 +1,19 @@ + + + + + diff --git a/src/views/Agent/AgentSettlementRatio.vue b/src/views/Agent/AgentSettlementRatio.vue new file mode 100644 index 0000000..b6201f3 --- /dev/null +++ b/src/views/Agent/AgentSettlementRatio.vue @@ -0,0 +1,19 @@ + + + + + -- 2.49.1 From 2adb0d5daa62a5a5e4bd45cd7b0578debeb72df5 Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Sat, 11 Apr 2026 20:51:28 +0900 Subject: [PATCH 03/10] =?UTF-8?q?feat(agent):=20AgentList.vue=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=E2=80=94=20=EC=B4=9D=20=EC=97=90=EC=9D=B4=EC=A0=84?= =?UTF-8?q?=ED=8A=B8=20=EC=88=98,=20=EC=A0=95=EC=82=B0=20=ED=95=AD?= =?UTF-8?q?=EB=AA=A9=EB=B3=84=20=EA=B8=88=EC=95=A1,=20=ED=95=A9=EA=B3=84?= =?UTF-8?q?=20=ED=91=9C=EC=8B=9C=20=EB=B0=8F=20=EB=9D=BC=EC=9A=B0=ED=8C=85?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - api: /admin/partner/agent/list 연동을 위한 api/agent.js 추가(getAgentList) - router: 에이전트 상세 및 5종 정산 상세 라우트 추가(파라미터 agentId 사용) - AgentDetail.vue와 정산 상세 5개 뷰(플레이스홀더) 추가 - 숫자/통화 포맷 적용 및 클릭 가능한 스타일 클래스 추가 --- src/api/agent.js | 12 + src/router/index.js | 36 +++ .../Agent/AgentChannelDonationSettlement.vue | 37 +++ src/views/Agent/AgentCommunitySettlement.vue | 37 +++ .../Agent/AgentContentDonationSettlement.vue | 37 +++ src/views/Agent/AgentContentSettlement.vue | 37 +++ src/views/Agent/AgentDetail.vue | 37 +++ src/views/Agent/AgentList.vue | 221 +++++++++++++++++- src/views/Agent/AgentLiveSettlement.vue | 37 +++ 9 files changed, 483 insertions(+), 8 deletions(-) create mode 100644 src/api/agent.js create mode 100644 src/views/Agent/AgentChannelDonationSettlement.vue create mode 100644 src/views/Agent/AgentCommunitySettlement.vue create mode 100644 src/views/Agent/AgentContentDonationSettlement.vue create mode 100644 src/views/Agent/AgentContentSettlement.vue create mode 100644 src/views/Agent/AgentDetail.vue create mode 100644 src/views/Agent/AgentLiveSettlement.vue diff --git a/src/api/agent.js b/src/api/agent.js new file mode 100644 index 0000000..e6b1b5b --- /dev/null +++ b/src/api/agent.js @@ -0,0 +1,12 @@ +import Vue from 'vue' + +// 에이전트 리스트 조회 +// 서버 스펙에 페이지네이션이 없다면 단순 GET으로 사용 +// 추후 필요 시 params(page,size) 확장 가능 +async function getAgentList() { + return Vue.axios.get('/admin/partner/agent/list') +} + +export { + getAgentList +} diff --git a/src/router/index.js b/src/router/index.js index 4eaa859..4d6fddc 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -56,6 +56,42 @@ const routes = [ name: 'AgentList', component: () => import(/* webpackChunkName: "agent" */ '../views/Agent/AgentList.vue') }, + { + path: '/agent/:agentId', + name: 'AgentDetail', + props: true, + component: () => import(/* webpackChunkName: "agent" */ '../views/Agent/AgentDetail.vue') + }, + { + path: '/agent/:agentId/settlement/live', + name: 'AgentSettlementLive', + props: true, + component: () => import(/* webpackChunkName: "agent" */ '../views/Agent/AgentLiveSettlement.vue') + }, + { + path: '/agent/:agentId/settlement/content', + name: 'AgentSettlementContent', + props: true, + component: () => import(/* webpackChunkName: "agent" */ '../views/Agent/AgentContentSettlement.vue') + }, + { + path: '/agent/:agentId/settlement/community', + name: 'AgentSettlementCommunity', + props: true, + component: () => import(/* webpackChunkName: "agent" */ '../views/Agent/AgentCommunitySettlement.vue') + }, + { + path: '/agent/:agentId/settlement/content-donation', + name: 'AgentSettlementContentDonation', + props: true, + component: () => import(/* webpackChunkName: "agent" */ '../views/Agent/AgentContentDonationSettlement.vue') + }, + { + path: '/agent/:agentId/settlement/channel-donation', + name: 'AgentSettlementChannelDonation', + props: true, + component: () => import(/* webpackChunkName: "agent" */ '../views/Agent/AgentChannelDonationSettlement.vue') + }, { path: '/agent/settlement-ratio', name: 'AgentSettlementRatio', diff --git a/src/views/Agent/AgentChannelDonationSettlement.vue b/src/views/Agent/AgentChannelDonationSettlement.vue new file mode 100644 index 0000000..151ad27 --- /dev/null +++ b/src/views/Agent/AgentChannelDonationSettlement.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/src/views/Agent/AgentCommunitySettlement.vue b/src/views/Agent/AgentCommunitySettlement.vue new file mode 100644 index 0000000..524d50c --- /dev/null +++ b/src/views/Agent/AgentCommunitySettlement.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/src/views/Agent/AgentContentDonationSettlement.vue b/src/views/Agent/AgentContentDonationSettlement.vue new file mode 100644 index 0000000..8800d26 --- /dev/null +++ b/src/views/Agent/AgentContentDonationSettlement.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/src/views/Agent/AgentContentSettlement.vue b/src/views/Agent/AgentContentSettlement.vue new file mode 100644 index 0000000..4a64401 --- /dev/null +++ b/src/views/Agent/AgentContentSettlement.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/src/views/Agent/AgentDetail.vue b/src/views/Agent/AgentDetail.vue new file mode 100644 index 0000000..d5c20ca --- /dev/null +++ b/src/views/Agent/AgentDetail.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/src/views/Agent/AgentList.vue b/src/views/Agent/AgentList.vue index 09b22cd..b47325c 100644 --- a/src/views/Agent/AgentList.vue +++ b/src/views/Agent/AgentList.vue @@ -1,19 +1,224 @@ diff --git a/src/views/Agent/AgentLiveSettlement.vue b/src/views/Agent/AgentLiveSettlement.vue new file mode 100644 index 0000000..3d43e9c --- /dev/null +++ b/src/views/Agent/AgentLiveSettlement.vue @@ -0,0 +1,37 @@ + + + + + -- 2.49.1 From 49de52355216eb584b648c916bf54625ae6ec496 Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Sat, 11 Apr 2026 21:18:08 +0900 Subject: [PATCH 04/10] =?UTF-8?q?fix(router):=20/agent/settlement-ratio=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=EA=B0=80=20=EC=97=90=EC=9D=B4=EC=A0=84?= =?UTF-8?q?=ED=8A=B8=20=EC=83=81=EC=84=B8=EB=A1=9C=20=EC=9E=98=EB=AA=BB=20?= =?UTF-8?q?=EB=9D=BC=EC=9A=B0=ED=8C=85=EB=90=98=EB=8D=98=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 정적 경로(`/agent/settlement-ratio`)가 동적 경로(`/agent/:agentId`)보다 뒤에 있어 동적으로 매칭되던 라우팅 우선순위 문제를 해결했습니다. - router/index.js: 정적 경로를 동적 경로보다 앞에 배치 - 기능/로직 변경 없음, 라우팅 매칭 순서만 조정 --- src/router/index.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/router/index.js b/src/router/index.js index 4d6fddc..48b4e84 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -56,12 +56,6 @@ const routes = [ name: 'AgentList', component: () => import(/* webpackChunkName: "agent" */ '../views/Agent/AgentList.vue') }, - { - path: '/agent/:agentId', - name: 'AgentDetail', - props: true, - component: () => import(/* webpackChunkName: "agent" */ '../views/Agent/AgentDetail.vue') - }, { path: '/agent/:agentId/settlement/live', name: 'AgentSettlementLive', @@ -97,6 +91,12 @@ const routes = [ name: 'AgentSettlementRatio', component: () => import(/* webpackChunkName: "agent" */ '../views/Agent/AgentSettlementRatio.vue') }, + { + path: '/agent/:agentId', + name: 'AgentDetail', + props: true, + component: () => import(/* webpackChunkName: "agent" */ '../views/Agent/AgentDetail.vue') + }, { path: '/live/tags', name: 'LiveTags', -- 2.49.1 From 7608cefba11c5a760188d04b20b5515fd1a152c9 Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Sat, 11 Apr 2026 22:01:53 +0900 Subject: [PATCH 05/10] =?UTF-8?q?feat(agent):=20=EC=97=90=EC=9D=B4?= =?UTF-8?q?=EC=A0=84=ED=8A=B8=20=EC=A0=95=EC=82=B0=20=EB=B9=84=EC=9C=A8=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 에이전트 정산 비율 API 추가 (목록/등록/수정/닉네임 검색) - AgentSettlementRatio.vue 구현 — 목록 테이블, "에이전트 비율 추가" 버튼, 수정 버튼 및 등록/수정 공용 팝업 추가 - UX: 닉네임 검색(v-autocomplete), 숫자/범위(0~100) 검증, datetime-local 입력값 LocalDateTime 문자열 변환 처리 - 에러/로딩 상태 기본 처리 및 목록 새로고침 흐름 반영 --- src/api/agent.js | 40 ++- src/views/Agent/AgentSettlementRatio.vue | 336 ++++++++++++++++++++++- 2 files changed, 366 insertions(+), 10 deletions(-) diff --git a/src/api/agent.js b/src/api/agent.js index e6b1b5b..b14de7c 100644 --- a/src/api/agent.js +++ b/src/api/agent.js @@ -7,6 +7,42 @@ async function getAgentList() { return Vue.axios.get('/admin/partner/agent/list') } -export { - getAgentList +// 에이전트 정산 비율 목록 조회 +async function getAgentSettlementRatioList() { + return Vue.axios.get('/admin/partner/agent/ratio') +} + +// 에이전트 정산 비율 등록 +// payload: { memberId: number, settlementRatio: number, effectiveFrom: string(yyyy-MM-ddTHH:mm:ss) } +async function createAgentSettlementRatio(payload) { + return Vue.axios.post('/admin/partner/agent/ratio', payload) +} + +// 에이전트 정산 비율 수정 +// payload: { memberId: number, settlementRatio: number, effectiveFrom: string(yyyy-MM-ddTHH:mm:ss) } +async function updateAgentSettlementRatio(payload) { + return Vue.axios.post('/admin/partner/agent/ratio/update', payload) +} + +// 에이전트 닉네임 검색 +// 반환: [{ id, nickname }] +async function searchAgentByNickname(query) { + try { + const res = await Vue.axios.get('/admin/partner/agent/search-by-nickname', { + params: { nickname: query, search_word: query } + }) + if (res && Array.isArray(res.data)) return res.data + if (res && res.data && Array.isArray(res.data.data)) return res.data.data + return [] + } catch (e) { + return [] + } +} + +export { + getAgentList, + getAgentSettlementRatioList, + createAgentSettlementRatio, + updateAgentSettlementRatio, + searchAgentByNickname, } diff --git a/src/views/Agent/AgentSettlementRatio.vue b/src/views/Agent/AgentSettlementRatio.vue index b6201f3..d8c678a 100644 --- a/src/views/Agent/AgentSettlementRatio.vue +++ b/src/views/Agent/AgentSettlementRatio.vue @@ -1,19 +1,339 @@ -- 2.49.1 From c7a02ea4ccb88ff1158c46962ce682def03b0679 Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Sat, 11 Apr 2026 22:20:18 +0900 Subject: [PATCH 06/10] =?UTF-8?q?feat(agent):=20=EC=97=90=EC=9D=B4?= =?UTF-8?q?=EC=A0=84=ED=8A=B8=20=EC=83=81=EC=84=B8=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - api/agent.js에 소속 관리 API 추가 (조회/검색/소속/해제) 및 Pageable 0-based 처리 - AgentDetail.vue 구현 — 목록/페이지네이션/소속 추가(자정 00:00:00)/소속 해제(날짜+시간) - AgentList.vue에서 상세 진입 시 닉네임을 쿼리로 전달하여 상세에서 표시 - AgentDetail.vue에 간단한 스타일 클래스 추가 --- src/api/agent.js | 38 +++ src/views/Agent/AgentDetail.vue | 415 +++++++++++++++++++++++++++++++- src/views/Agent/AgentList.vue | 2 +- 3 files changed, 448 insertions(+), 7 deletions(-) diff --git a/src/api/agent.js b/src/api/agent.js index b14de7c..d1a19c4 100644 --- a/src/api/agent.js +++ b/src/api/agent.js @@ -39,10 +39,48 @@ async function searchAgentByNickname(query) { } } +// 에이전트 소속 크리에이터 목록 조회 +// GET /admin/partner/agent/{agentId}/creator/list +// params: { page, size } +async function getAgentAssignedCreatorList(agentId, page = 1, size = 20) { + // Spring Pageable은 일반적으로 0-based page index를 사용 + const zeroBasedPage = Math.max(0, Number(page || 1) - 1) + return Vue.axios.get(`/admin/partner/agent/${agentId}/creator/list`, { + params: { page: zeroBasedPage, size } + }) +} + +// 추가 가능한 크리에이터 검색 +// GET /admin/partner/agent/creator/search?search_word=... +async function searchAdminAgentAssignableCreators(search_word) { + return Vue.axios.get('/admin/partner/agent/creator/search', { + params: { search_word } + }) +} + +// 에이전트에 크리에이터 소속 시키기 +// POST /admin/partner/agent/assignment +// payload: { agentId, creatorId, assignedAt } // assignedAt: LocalDateTime string (yyyy-MM-ddTHH:mm:ss) +async function assignAgentCreator(payload) { + return Vue.axios.post('/admin/partner/agent/assignment', payload) +} + +// 크리에이터 소속 해제 +// POST /admin/partner/agent/assignment/remove +// payload: { creatorId, unassignedAt } // unassignedAt: LocalDateTime string +async function removeAgentCreator(payload) { + return Vue.axios.post('/admin/partner/agent/assignment/remove', payload) +} + export { getAgentList, getAgentSettlementRatioList, createAgentSettlementRatio, updateAgentSettlementRatio, searchAgentByNickname, + // 에이전트 상세 - 소속 크리에이터 관리 + getAgentAssignedCreatorList, + searchAdminAgentAssignableCreators, + assignAgentCreator, + removeAgentCreator, } diff --git a/src/views/Agent/AgentDetail.vue b/src/views/Agent/AgentDetail.vue index d5c20ca..fc62204 100644 --- a/src/views/Agent/AgentDetail.vue +++ b/src/views/Agent/AgentDetail.vue @@ -7,21 +7,262 @@ > mdi-arrow-left - 에이전트 상세 + {{ (agentNickname || '-') + ' 소속 크리에이터' }} + + 소속 추가 + + +
+ + -

에이전트 상세 페이지 (준비중)

-

Agent ID: {{ agentId }}

+ + + +
+
+ + + +
+ + + + + 크리에이터 소속 추가 + + + + + + + + + + + + 취소 + + + 추가 + + + + + + + + + 소속 해제 + +
+ 크리에이터: {{ unassignDialog.target && unassignDialog.target.creatorNickname || '-' }} +
+ + + + + + + + + + +
+ + + + 취소 + + + 해제 + + +
+
- - diff --git a/src/views/Agent/AgentList.vue b/src/views/Agent/AgentList.vue index b47325c..83d45b1 100644 --- a/src/views/Agent/AgentList.vue +++ b/src/views/Agent/AgentList.vue @@ -193,7 +193,7 @@ export default { ) }, goAgentDetail(item) { - this.$router.push({ name: 'AgentDetail', params: { agentId: item.agentId } }) + this.$router.push({ name: 'AgentDetail', params: { agentId: item.agentId }, query: { nickname: item.agentNickname } }) }, goSettlement(item, type) { const id = item.agentId -- 2.49.1 From d5a75cd29f4e4f154cb5c448cde7ff3017328c72 Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Sat, 11 Apr 2026 23:04:51 +0900 Subject: [PATCH 07/10] =?UTF-8?q?feat(agent,settlement):=20=ED=81=AC?= =?UTF-8?q?=EB=A6=AC=EC=97=90=EC=9D=B4=ED=84=B0=20=EA=B8=B0=EC=A4=80=20?= =?UTF-8?q?=EC=A0=95=EC=82=B0=20=EC=83=81=EC=84=B8=20API/=EB=B7=B0=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0=20=EB=B0=8F=20=ED=8E=98=EC=9D=B4=EC=A7=80?= =?UTF-8?q?=EB=84=A4=EC=9D=B4=EC=85=98/=EC=A0=95=EB=A0=AC=20=EC=9D=BC?= =?UTF-8?q?=EA=B4=80=EC=84=B1=20=ED=99=95=EB=B3=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - api/agent: 정산 상세 조회 API 다수 추가(라이브/콘텐츠/커뮤니티/콘텐츠·채널 후원) - 공통 파라미터 빌더 및 1→0 기반 페이지 변환 유틸 도입으로 Spring Pageable 규약 준수 - 정산 상세 뷰(라이브/콘텐츠/커뮤니티/콘텐츠 후원/채널 후원): 닉네임 표시, 페이지·정렬 파라미터 적용 - 로딩/에러/빈 결과 초기화 처리 강화, 합계 초기화로 실패 시 데이터 오해 방지 - AgentList: 정산 상세 라우팅 시 닉네임 query 전달로 상단 타이틀 표시 개선 --- src/api/agent.js | 59 ++++ .../Agent/AgentChannelDonationSettlement.vue | 235 ++++++++++++++- src/views/Agent/AgentCommunitySettlement.vue | 235 ++++++++++++++- .../Agent/AgentContentDonationSettlement.vue | 235 ++++++++++++++- src/views/Agent/AgentContentSettlement.vue | 235 ++++++++++++++- src/views/Agent/AgentList.vue | 2 +- src/views/Agent/AgentLiveSettlement.vue | 269 +++++++++++++++++- 7 files changed, 1225 insertions(+), 45 deletions(-) diff --git a/src/api/agent.js b/src/api/agent.js index d1a19c4..2faefda 100644 --- a/src/api/agent.js +++ b/src/api/agent.js @@ -1,5 +1,11 @@ import Vue from 'vue' +// 공통: 페이지 파라미터 변환(1-based UI → 0-based Spring Pageable) +function toZeroBased(page) { + const p = Number(page || 1) + return Math.max(0, p - 1) +} + // 에이전트 리스트 조회 // 서버 스펙에 페이지네이션이 없다면 단순 GET으로 사용 // 추후 필요 시 params(page,size) 확장 가능 @@ -72,6 +78,53 @@ async function removeAgentCreator(payload) { return Vue.axios.post('/admin/partner/agent/assignment/remove', payload) } +// ========================= +// 정산 상세 - 에이전트별(크리에이터 기준 집계) +// 공통 Request: startDateStr, endDateStr, Spring Pageable(page,size,sort) +// 공통 Response: ApiResponse +// { success, message, data: { totalCount, total:{...}, items:[...] } } + +function buildSettlementParams({ startDateStr, endDateStr, page = 1, size = 20, sort }) { + const params = { + startDateStr, + endDateStr, + page: toZeroBased(page), + size + } + if (sort) params.sort = sort + return params +} + +async function getAgentLiveSettlementByCreator(agentId, { startDateStr, endDateStr, page = 1, size = 20, sort } = {}) { + return Vue.axios.get(`/admin/partner/agent/${agentId}/calculate/live-by-creator`, { + params: buildSettlementParams({ startDateStr, endDateStr, page, size, sort }) + }) +} + +async function getAgentContentSettlementByCreator(agentId, { startDateStr, endDateStr, page = 1, size = 20, sort } = {}) { + return Vue.axios.get(`/admin/partner/agent/${agentId}/calculate/content-by-creator`, { + params: buildSettlementParams({ startDateStr, endDateStr, page, size, sort }) + }) +} + +async function getAgentCommunitySettlementByCreator(agentId, { startDateStr, endDateStr, page = 1, size = 20, sort } = {}) { + return Vue.axios.get(`/admin/partner/agent/${agentId}/calculate/community-by-creator`, { + params: buildSettlementParams({ startDateStr, endDateStr, page, size, sort }) + }) +} + +async function getAgentContentDonationSettlementByCreator(agentId, { startDateStr, endDateStr, page = 1, size = 20, sort } = {}) { + return Vue.axios.get(`/admin/partner/agent/${agentId}/calculate/content-donation-by-creator`, { + params: buildSettlementParams({ startDateStr, endDateStr, page, size, sort }) + }) +} + +async function getAgentChannelDonationSettlementByCreator(agentId, { startDateStr, endDateStr, page = 1, size = 20, sort } = {}) { + return Vue.axios.get(`/admin/partner/agent/${agentId}/calculate/channel-donation-by-creator`, { + params: buildSettlementParams({ startDateStr, endDateStr, page, size, sort }) + }) +} + export { getAgentList, getAgentSettlementRatioList, @@ -83,4 +136,10 @@ export { searchAdminAgentAssignableCreators, assignAgentCreator, removeAgentCreator, + // 에이전트 정산 상세 (크리에이터 기준) + getAgentLiveSettlementByCreator, + getAgentContentSettlementByCreator, + getAgentCommunitySettlementByCreator, + getAgentContentDonationSettlementByCreator, + getAgentChannelDonationSettlementByCreator, } diff --git a/src/views/Agent/AgentChannelDonationSettlement.vue b/src/views/Agent/AgentChannelDonationSettlement.vue index 151ad27..5118352 100644 --- a/src/views/Agent/AgentChannelDonationSettlement.vue +++ b/src/views/Agent/AgentChannelDonationSettlement.vue @@ -7,27 +7,244 @@ > mdi-arrow-left - 에이전트 정산 상세 - 채널 후원 + {{ displayNickname }} 정산 상세 - 채널 후원 + - - -

채널 후원 정산 상세 페이지 (준비중)

-

Agent ID: {{ agentId }}

+ + + + + + + + + + + + + + + + + 조회 + + + + + + + + + + + + + + + + + + +
+ +