From 8f0958848d7188d0915ffe83e0691eb2192c174c Mon Sep 17 00:00:00 2001 From: Yu Sung Date: Mon, 22 Sep 2025 14:35:37 +0900 Subject: [PATCH] =?UTF-8?q?feat(calculate-ratio):=20=EC=A0=95=EC=82=B0=20?= =?UTF-8?q?=EB=B9=84=EC=9C=A8=20=EC=88=98=EC=A0=95/=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/calculate.js | 19 ++- src/views/Creator/CreatorSettlementRatio.vue | 117 +++++++++++++++++-- 2 files changed, 127 insertions(+), 9 deletions(-) diff --git a/src/api/calculate.js b/src/api/calculate.js index 96632c4..8cd7573 100644 --- a/src/api/calculate.js +++ b/src/api/calculate.js @@ -24,7 +24,7 @@ async function getCalculateCommunityPost(startDate, endDate, page, size) { } async function getSettlementRatio(page) { - return Vue.axios.get('/admin/calculate/ratio?page=' + (page - 1) + "&size=20'"); + return Vue.axios.get('/admin/calculate/ratio?page=' + (page - 1) + "&size=20"); } async function createCreatorSettlementRatio(creatorSettlementRatio) { @@ -57,6 +57,21 @@ async function getCalculateCommunityByCreator(startDate, endDate, page, size) { ) } +async function updateCreatorSettlementRatio(creatorSettlementRatio) { + const request = { + memberId: creatorSettlementRatio.creator_id, + subsidy: creatorSettlementRatio.subsidy, + liveSettlementRatio: creatorSettlementRatio.liveSettlementRatio, + contentSettlementRatio: creatorSettlementRatio.contentSettlementRatio, + communitySettlementRatio: creatorSettlementRatio.communitySettlementRatio + }; + return Vue.axios.post('/admin/calculate/ratio/update', request); +} + +async function deleteCreatorSettlementRatio(memberId) { + return Vue.axios.post('/admin/calculate/ratio/delete/' + memberId); +} + export { getCalculateLive, getCalculateContent, @@ -65,6 +80,8 @@ export { getCalculateCommunityPost, getSettlementRatio, createCreatorSettlementRatio, + updateCreatorSettlementRatio, + deleteCreatorSettlementRatio, getCalculateLiveByCreator, getCalculateContentByCreator, getCalculateCommunityByCreator diff --git a/src/views/Creator/CreatorSettlementRatio.vue b/src/views/Creator/CreatorSettlementRatio.vue index 56f0fc2..41fcf09 100644 --- a/src/views/Creator/CreatorSettlementRatio.vue +++ b/src/views/Creator/CreatorSettlementRatio.vue @@ -53,6 +53,24 @@ + @@ -73,13 +91,19 @@ persistent > - 크리에이터 정산비율 - + {{ is_edit ? '크리에이터 정산비율 수정' : '크리에이터 정산비율' }} + + + + - 등록하기 + {{ is_edit ? '수정하기' : '등록하기' }} @@ -142,6 +166,8 @@ export default { items: [], creator_settlement_ratio: {}, show_write_dialog: false, + is_edit: false, + editing_item_id: null, headers: [ { text: '닉네임', @@ -173,6 +199,12 @@ export default { sortable: false, value: 'communitySettlementRatio', }, + { + text: '관리', + align: 'center', + sortable: false, + value: 'actions', + }, ], } }, @@ -191,11 +223,16 @@ export default { }, showWriteDialog() { + this.is_edit = false + this.editing_item_id = null + this.creator_settlement_ratio = {} this.show_write_dialog = true }, cancel() { this.creator_settlement_ratio = {} + this.is_edit = false + this.editing_item_id = null this.show_write_dialog = false }, @@ -225,7 +262,11 @@ export default { return } - this.createCreatorSettlementRatio(); + if (this.is_edit) { + this.updateCreatorSettlementRatio(); + } else { + this.createCreatorSettlementRatio(); + } }, async createCreatorSettlementRatio() { @@ -253,6 +294,70 @@ export default { this.is_loading = false }, + async updateCreatorSettlementRatio() { + if (this.is_loading) return; + this.is_loading = true + try { + // 수정은 생성과 동일한 파라미터를 전송 (memberId 기준) + const payload = { ...this.creator_settlement_ratio } + const res = await api.updateCreatorSettlementRatio(payload) + if (res.status === 200 && res.data.success === true) { + this.cancel() + this.notifySuccess(res.data.message || '수정되었습니다.') + this.items = [] + await this.getSettlementRatio() + } else { + this.notifyError(res.data.message || '알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.') + } + } catch (e) { + this.notifyError('알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.') + } finally { + this.is_loading = false + } + }, + + openEdit(item) { + this.is_edit = true + this.editing_item_id = null + this.creator_settlement_ratio = { + creator_id: item.memberId, + subsidy: item.subsidy, + liveSettlementRatio: item.liveSettlementRatio, + contentSettlementRatio: item.contentSettlementRatio, + communitySettlementRatio: item.communitySettlementRatio, + } + this.show_write_dialog = true + }, + + async confirmDelete(item) { + try { + const ok = await this.$dialog.confirm({ text: '삭제하시겠습니까?', title: '확인', actions: { false: '취소', true: '삭제' } }) + if (!ok) return + } catch (e) { + // 일부 구현체는 confirm이 boolean이 아닌 경우가 있음 + } + this.deleteCreatorSettlementRatio(item) + }, + + async deleteCreatorSettlementRatio(item) { + if (this.is_loading) return; + this.is_loading = true + try { + const memberId = item.memberId + const res = await api.deleteCreatorSettlementRatio(memberId) + if (res.status === 200 && res.data.success === true) { + this.notifySuccess(res.data.message || '삭제되었습니다.') + this.items = this.items.filter(x => (x.memberId) !== memberId) + } else { + this.notifyError(res.data.message || '알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.') + } + } catch (e) { + this.notifyError('알 수 없는 오류가 발생했습니다. 다시 시도해 주세요.') + } finally { + this.is_loading = false + } + }, + async getSettlementRatio() { this.is_loading = true @@ -279,10 +384,6 @@ export default { }, async next() { - if (this.search_word.length < 2) { - this.search_word = '' - } - await this.getSettlementRatio() }, },