From 88db96c374dfc92a70af005c47b1bf72ab5ac03c Mon Sep 17 00:00:00 2001 From: Zhou Weidong <502333560@qq.com> Date: Mon, 9 Nov 2026 10:27:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(commerce):=20=E6=96=B0=E5=A2=9E=E6=89=93?= =?UTF-8?q?=E8=B5=8F=E4=BB=BB=E5=8A=A1=E7=AE=A1=E7=90=86=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/admin/reward.ts | 93 +++ .../commerce/RewardTaskManagementView.vue | 616 ++++++++++++++++++ 2 files changed, 709 insertions(+) create mode 100644 src/api/admin/reward.ts create mode 100644 src/views/commerce/RewardTaskManagementView.vue diff --git a/src/api/admin/reward.ts b/src/api/admin/reward.ts new file mode 100644 index 0000000..75effc7 --- /dev/null +++ b/src/api/admin/reward.ts @@ -0,0 +1,93 @@ +// Author: fruit.com.cn + +import request from '@/axios' +import type { PageResult } from './types' + +export interface RewardTaskItem { + id: string + code: string + sectionCode: string + type: string + verifyMode: string + targetValue: number + rewardCoin: number + cycleType: string + cycleLimit: number + actionType: string + actionUrl: string + iconUrl: string + titleId: string + titleEn: string + titleZh: string + subtitleId: string + subtitleEn: string + subtitleZh: string + ctaId: string + ctaEn: string + ctaZh: string + sectionTitleId: string + sectionTitleEn: string + sectionTitleZh: string + configJson: string + sort: number + status: number + statusText: string + startAt?: string + endAt?: string +} + +export interface RewardTaskPageParams { + pageIndex?: number + pageSize?: number + keyword?: string + type?: string + sectionCode?: string + status?: number +} + +export type RewardTaskSaveData = Omit + +export interface RewardRuleDay { + dayIndex: number + rewardCoin: number +} + +export interface RewardGrantItem { + id: string + userId: string + taskId: string + cycleKey: string + amount: number + status: string + idempotentKey: string + coinLedgerId: string + source: string + operatorId: string + failureReason: string + grantedAt?: string + createdAt?: string +} + +export const pageRewardTasksApi = (params: RewardTaskPageParams) => + request.get>({ url: '/admin/rewards/tasks/page', params }) + +export const createRewardTaskApi = (data: RewardTaskSaveData) => + request.post({ url: '/admin/rewards/tasks', data }) + +export const updateRewardTaskApi = (id: string, data: RewardTaskSaveData) => + request.put({ url: `/admin/rewards/tasks/${id}`, data }) + +export const updateRewardTaskStatusApi = (id: string, status: number) => + request.put({ url: `/admin/rewards/tasks/${id}/status`, params: { status } }) + +export const getRewardRulesApi = () => + request.get({ url: '/admin/rewards/check-in/rules' }) + +export const saveRewardRulesApi = (days: RewardRuleDay[]) => + request.put({ url: '/admin/rewards/check-in/rules', data: { days } }) + +export const pageRewardGrantsApi = (params: Record) => + request.get>({ url: '/admin/rewards/grants/page', params }) + +export const manualRewardGrantApi = (data: Record) => + request.post({ url: '/admin/rewards/grants/manual', data }) diff --git a/src/views/commerce/RewardTaskManagementView.vue b/src/views/commerce/RewardTaskManagementView.vue new file mode 100644 index 0000000..2be1256 --- /dev/null +++ b/src/views/commerce/RewardTaskManagementView.vue @@ -0,0 +1,616 @@ + + + + + + +