import request from '@/utils/request' // ==================== 团课课程 ==================== export interface GroupCourse { id?: number courseName: string coachId?: number | string coachName?: string courseType?: number startTime: string endTime: string maxMembers?: number currentMembers?: number status?: string actualStartTime?: string actualEndTime?: string location?: string coverImage?: string description?: string storedValueAmount?: number qrCodePath?: string createBy?: string updateBy?: string createdAt?: string updatedAt?: string } export interface GroupCoursePageRequest { page: number size: number keyword?: string status?: string courseType?: number coachId?: number | string startTime?: string endTime?: string sortBy?: string sortOrder?: 'asc' | 'desc' } export interface PageResponse { content: T[] totalElements: number totalPages: number size: number number: number first: boolean last: boolean } export const groupCourseApi = { getAll: () => request.get('/groupCourse/list'), getPage: (params: GroupCoursePageRequest) => request.post>('/groupCourse/page', params), getById: (id: number) => request.get(`/groupCourse/${id}`), getDetailById: (id: number) => request.get(`/groupCourse/${id}/detail`), create: (data: GroupCourse) => request.post('/groupCourse', data), update: (id: number, data: GroupCourse) => request.put(`/groupCourse/${id}`, data), delete: (id: number) => request.delete(`/groupCourse/${id}`), cancel: (id: number) => request.post(`/groupCourse/${id}/cancel`), search: (params: any) => request.post('/groupCourse/search', params), checkCoachConflict: (params: { coachId: number | string startTime: string endTime: string excludeCourseId?: number | string }) => request.post<{ success: boolean hasConflict: boolean conflicts: GroupCourse[] }>('/groupCourse/check-coach-conflict', params), } // ==================== 团课类型 ==================== export interface GroupCourseType { id?: number typeName: string baseDifficulty?: number description?: string category?: string createBy?: string updateBy?: string createdAt?: string updatedAt?: string } export interface GroupCourseTypePageRequest { page: number size: number keyword?: string category?: string sort?: string order?: 'asc' | 'desc' } export interface CourseLabelPageRequest { page: number size: number keyword?: string sort?: string order?: 'asc' | 'desc' } export const groupCourseTypeApi = { getAll: () => request.get('/groupCourse/types'), search: (params: any) => request.get('/groupCourse/types/search', { params }), getCategories: () => request.get('/groupCourse/types/categories'), getByCategory: (category: string) => request.get(`/groupCourse/types/category/${encodeURIComponent(category)}`), getById: (id: number) => request.get(`/groupCourse/types/${id}`), getPage: (params: GroupCourseTypePageRequest) => request.post>('/groupCourse/types/page', params), create: (data: GroupCourseType) => request.post('/groupCourse/types', data), update: (id: number, data: GroupCourseType) => request.put(`/groupCourse/types/${id}`, data), delete: (id: number) => request.delete(`/groupCourse/types/${id}`), } // ==================== 团课标签 ==================== export interface CourseLabel { id?: number labelName: string color?: string description?: string createBy?: string updateBy?: string createdAt?: string updatedAt?: string } export const courseLabelApi = { getAll: () => request.get('/groupCourse/labels'), search: (params: any) => request.get('/groupCourse/labels/search', { params }), getById: (id: number) => request.get(`/groupCourse/labels/${id}`), getByTypeId: (typeId: number) => request.get(`/groupCourse/types/${typeId}/labels`), getPage: (params: CourseLabelPageRequest) => request.post>('/groupCourse/labels/page', params), create: (data: CourseLabel) => request.post('/groupCourse/labels', data), update: (id: number, data: CourseLabel) => request.put(`/groupCourse/labels/${id}`, data), delete: (id: number) => request.delete(`/groupCourse/labels/${id}`), addLabelsToType: (typeId: number, labelIds: number[]) => request.post(`/groupCourse/types/${typeId}/labels`, { labelIds }), removeLabelFromType: (typeId: number, labelId: number) => request.delete(`/groupCourse/types/${typeId}/labels/${labelId}`), clearLabelsFromType: (typeId: number) => request.delete(`/groupCourse/types/${typeId}/labels`), } // ==================== 团课推荐 ==================== export interface GroupCourseRecommend { id?: number courseId: number recommendTitle?: string recommendContent?: string recommendReason?: string priority?: number isActive?: boolean createBy?: string updateBy?: string createdAt?: string updatedAt?: string } export const groupCourseRecommendApi = { getAll: () => request.get('/groupCourse/recommend/list'), getActive: () => request.get('/groupCourse/recommend/active'), getById: (id: number) => request.get(`/groupCourse/recommend/${id}`), getByCourseId: (courseId: number) => request.get(`/groupCourse/recommend/course/${courseId}`), create: (data: GroupCourseRecommend) => request.post('/groupCourse/recommend', data), update: (id: number, data: GroupCourseRecommend) => request.put(`/groupCourse/recommend/${id}`, data), delete: (id: number) => request.delete(`/groupCourse/recommend/${id}`), enable: (id: number) => request.post(`/groupCourse/recommend/${id}/enable`), disable: (id: number) => request.post(`/groupCourse/recommend/${id}/disable`), } // ==================== 团课预约 ==================== export interface GroupCourseBooking { id?: number courseId: number memberId: number memberCardId: number bookingTime?: string status?: string cancelTime?: string courseName?: string courseStartTime?: string courseEndTime?: string location?: string createBy?: string updateBy?: string createdAt?: string updatedAt?: string } export const groupCourseBookingApi = { book: (data: GroupCourseBooking) => request.post('/groupCourse/book', data), cancel: (bookingId: number) => request.post(`/groupCourse/booking/${bookingId}/cancel`), getByMemberId: (memberId: number) => request.get(`/groupCourse/bookings/member/${memberId}`), getByCourseId: (courseId: number) => request.get(`/groupCourse/bookings/course/${courseId}`), getById: (bookingId: number) => request.get(`/groupCourse/bookings/${bookingId}`), }