/** * 赛事模型 */ export type EventStatus = 'upcoming' | 'registering' | 'closed' | 'ended' /** 动态报名表单字段配置 */ export interface EventFormField { /** 字段唯一标识 */ key: string /** 显示名称(后台可自定义) */ label: string /** 字段类型:text-文本 number-数字 idcard-身份证 phone-手机号 select-下拉选择 radio-单选 */ type: 'text' | 'number' | 'idcard' | 'phone' | 'select' | 'radio' /** 是否必填 1=必填 0=选填 */ required: number /** 选项列表(type=select/radio时有效) */ options?: string[] /** 占位提示文字 */ placeholder?: string /** 排序号 */ sort: number } export interface ShopEvent { id: number name: string description: string image?: string banner?: string eventDate: string location?: string maxParticipants: number entryFee: number /** 动态表单字段配置(JSON字符串或数组) */ formFields?: string | EventFormField[] status: number | EventStatus isHot: number tenantId?: number createTime: string paidCount: number } export interface ShopEventParam { page?: number limit?: number status?: number isHot?: number tenantId?: number } export interface EventRegisterParams { eventId: number /** 动态表单数据,key-value 形式 */ formData?: Record } export interface EventRegistration { id: number eventId: number userId: number /** 动态表单提交的数据 */ formData?: string | Record entryFee: number payStatus: number // 0=待缴费 1=已缴费 2=已取消 orderNo?: string paidAt?: string createTime: string eventName?: string } export interface RegistrationStatus { registered: boolean payStatus: number | null registrationId?: number } // 状态映射 export function getEventStatusLabel(status: number): { label: string; color: string } { const map: Record = { 0: { label: '未开始', color: 'text-blue-500' }, 1: { label: '报名中', color: 'text-green-500' }, 2: { label: '已截止', color: 'text-orange-400' }, 3: { label: '已结束', color: 'text-gray-400' }, } return map[status] ?? { label: '未知', color: 'text-gray-400' } } export function getPayStatusLabel(payStatus: number): { label: string; color: string } { const map: Record = { 0: { label: '待缴费', color: 'text-orange-500' }, 1: { label: '已缴费', color: 'text-green-500' }, 2: { label: '已取消', color: 'text-gray-400' }, } return map[payStatus] ?? { label: '未知', color: 'text-gray-400' } }