import { ref, reactive, computed, onMounted, onUnmounted } from 'vue' import { useI18n } from 'vue-i18n' import {activityApi} from '@/service/activity' import {customApi} from '@/service/custom' import Config from '@/config/index' import type { ActivityState, PagerInfo, AccountInfo } from '../types/activity' const { Code, Host80 } = Config // 国家列表 const countries = [ "DZ", "AO", "BJ", "BW", "BF", "CM", "CG", "CD", "CI", "DJ", "EG", "ET", "GA", "GM", "GH", "GN", "KE", "MG", "MW", "ML", "MR", "MA", "MZ", "NA", "NE", "NG", "RW", "SN", "SL", "SO", "ZA", "SS", "SD", "TZ", "TG", "TN", "UG", "ZM", "ZW", "LS", "BH", "IR", "IQ", "IL", "JO", "KW", "LB", "OM", "PS", "QA", "SA", "SY", "TR", "AE", "YE", "AR", "BO", "BR", "CL", "CO", "EC", "GY", "PY", "PE", "SR", "UY", "VE", "BZ", "CR", "SV", "GT", "HN", "NI", "PA", "AU", "CA", "AL", "AD", "AM", "AT", "AZ", "BY", "BE", "BA", "BG", "HR", "CY", "CZ", "DK", "EE", "FI", "FR", "GE", "DE", "GR", "HU", "IS", "IE", "IT", "XK", "LV", "LI", "LT", "LU", "MT", "MD", "MC", "ME", "NL", "MK", "NO", "PL", "PT", "RO", "RU", "SM", "RS", "SK", "SI", "ES", "SE", "CH", "UA", "VA" ] export function useActivityData() { const { t, locale } = useI18n() // ==================== 用户信息 ==================== const userInfo = computed(() => { try { return JSON.parse(uni.getStorageSync('user') || '{}') } catch { return { customInfo: {} } } }) const country = computed(() => userInfo.value.customInfo?.country || '') const myCid = computed(() => userInfo.value.customInfo?.cId || '') // ==================== 加载状态 ==================== const pictLoading = ref(false) const flag = ref(false) // ==================== 活动数据 ==================== const tableData = ref([]) const tableDataGive = ref([]) const singleData = ref({}) // 分页 const pagerInfo = ref({ row: 10, current: 1, pageTotal: 0, rowTotal: 0 }) // 账户列表 const loginOptions = ref([]) const loginOptions1 = ref([]) // ==================== 活动特定状态 ==================== const activityState = reactive({ tableDataNewYear24Flag: false, tableDataNewYear24: {}, choujiaClose: false, tableDataNoWorriesFlag: false, tableDataNoWorries: false, isRealizationNoWorries: 0, standard: true, tableData2Flag: false, tableData2: false, isTransform: 0, isRealization: 0, tableDataCptFlag: false, tableDataCpt: {}, tableData3FlagJYB: false, tableData3JYB: {}, isRealizationJxJYB: 0, tableData3Flag: false, tableData3: {}, isRealizationJx: 0, tableData3FlagVip: false, tableData3Vip: {}, isRealizationJxVip: 0, tableData4Flag: false, tableData4: {}, tableData4TwoFlag: false, tableData4Two: {}, monthlyGive: false, surplusGive: false, newTask: false, newTaskList: { endTime: '', tradeVolume: '', raffleNumber: '' }, LuckyDrawsNumber: '0', isCountDown: '', isCashBack: false, anshiClose: true, limitedStatus: null, activityShowsInfo: null, country: country.value, lang: locale.value, isGuoQin: false, isSupportedCountry: false }) // 交易大赛参数 const tableDataCptFlagCode = ref('') // 新年庆典数据 const NewYear24DataBalance = ref('') const NewYear24Data = ref({ balance: 0, income: 0 }) // 定时器 const interval = ref(null) // ==================== 计算属性 ==================== // 是否支持的国家 const isSupportedCountry = computed(() => { return countries.includes(country.value) }) // 国庆节判断 const isGuoQin = computed(() => { const startTime1 = '2024/10/01 00:00:00' const endTime1 = '2024/10/07 23:59:59' const timezone = 8 const offset_GMT = new Date().getTimezoneOffset() const nowDate = new Date().getTime() const now = new Date(nowDate + offset_GMT * 60 * 1000 + timezone * 60 * 60 * 1000).getTime() const end = new Date(endTime1).getTime() const start = new Date(startTime1).getTime() return now > start && now < end }) // ==================== 工具函数 ==================== // 获取当前时间(带时区) const getCurrentTime = (timezone: number = 2) => { const offset_GMT = new Date().getTimezoneOffset() const nowDate = new Date().getTime() return new Date(nowDate + offset_GMT * 60 * 1000 + timezone * 60 * 60 * 1000) } // 时间补0 const getzero = (time: number) => { return time > 9 ? time : '0' + time } // 时间格式转换 const timeConvert = (val: string) => { if (!val) return '' const datetime = new Date(val.replace(/-/g, '/')) const year = datetime.getFullYear() let month: any = datetime.getMonth() + 1 let date: any = datetime.getDate() if (month < 10) month = '0' + month if (date < 10) date = '0' + date return year + '年' + month + '月' + date + '日' } // 货币符号 const groupCurrency = (type: string) => { const map: Record = { 'GBP': ': £', 'USD': ': $', 'EUR': ': €', 'USC': ': ¢' } return map[type] || ': $' } // 账户类型名称 const groupTypeName = (type: string) => { const map: Record = { '1': 'AccountType.ClassicAccount', '2': 'AccountType.SeniorAccount', '3': 'AccountType.AgencyAccount', '5': 'AccountType.SpeedAccount', '6': 'AccountType.SpeedAccount', '7': 'AccountType.StandardAccount', '8': 'AccountType.CentAccount' } return map[type] ? t(map[type]) : '' } // 判断活动是否在有效期内 const overdue = (startTime: string, endTime: string) => { if (!startTime || !endTime) return false const startTime1 = startTime.replace(/-/g, '/').split(' ')[0] const endTime1 = endTime.replace(/-/g, '/').split(' ')[0] const now = getCurrentTime(2).getTime() const start = new Date(startTime1).getTime() const end = new Date(endTime1).getTime() return start < now && now < end } // 判断匠鑫活动是否报名结束 const timeExpireJx = (endTime: string) => { if (!endTime) return false const endTime1 = endTime.replace(/-/g, '/').split(' ')[0] const now = getCurrentTime(2).getTime() const end = new Date(endTime1).getTime() return now < end } // 判断是否在9月30日之后 const isAfterSeptember30 = () => { return true // 根据实际需求修改 } // ==================== API 请求函数 ==================== // 获取账户信息 const getDateList = async () => { try { const res = await customApi.DropdownlusActivityOptions({ platform: '' }) if (res.code == Code.StatusOK) { loginOptions1.value = res.data } else { uni.showToast({ title: res.msg, icon: 'none' }) } } catch (error) { console.error('获取账户信息失败', error) } } // 获取活动列表 const searchFunc = async (page: number = 1) => { if (flag.value) return flag.value = true pictLoading.value = true try { const res = await activityApi.ActivityExtensionIist({ hot: '', tag: 1, lang: ['cn', 'zhHant'].includes(locale.value) ? 'cn' : 'en', page: { current: page, row: pagerInfo.value.row } }) if (res.code == Code.StatusOK) { tableData.value = res.data pagerInfo.value.rowTotal = res.page.rowTotal pagerInfo.value.pageTotal = res.page.pageTotal } else { uni.showToast({ title: res.msg, icon: 'none' }) } } catch (error) { console.error('获取活动列表失败', error) } finally { pictLoading.value = false flag.value = false } } // 获取赠送活动列表 const searchFunc1 = async () => { pictLoading.value = true try { const res = await activityApi.ActivityExtensionGiveList({ page: { current: pagerInfo.value.current, row: pagerInfo.value.row } }) if (res.code == Code.StatusOK) { tableDataGive.value = res.data pagerInfo.value.rowTotal = res.page.rowTotal pagerInfo.value.pageTotal = res.page.pageTotal } else { uni.showToast({ title: res.msg, icon: 'none' }) } } catch (error) { console.error('获取赠送活动列表失败', error) } finally { pictLoading.value = false } } // 获取单个活动详情 const getSingle = async (id: string) => { try { const res = await activityApi.ActivitySingle({ id }) if (res.code == Code.StatusOK) { singleData.value = res.data } else { uni.showToast({ title: res.msg, icon: 'none' }) } } catch (error) { console.error('获取活动详情失败', error) } } // 获取赠送活动详情 const getSingle1 = async (id: string) => { try { const res = await activityApi.ActivityExtensionGiveSingle({ id }) if (res.code == Code.StatusOK) { singleData.value = res.data } else { uni.showToast({ title: res.msg, icon: 'none' }) } } catch (error) { console.error('获取赠送活动详情失败', error) } } // 2023迎新活动数据 const Activity23HundredInfo = async () => { try { const res = await activityApi.Activity23HundredInfo({}) if (res.code == Code.StatusOK) { activityState.tableData2 = res.data if (typeof activityState.tableData2 == 'object') { activityState.tableData2Flag = true const nowTime = getCurrentTime(2).getTime() const startTime = new Date(activityState.tableData2.activityStartTime.replace(/-/g, '/')).getTime() const endTime = new Date(activityState.tableData2.activityEndTime.replace(/-/g, '/')).getTime() if (nowTime < endTime && nowTime > startTime) { if (activityState.tableData2.status == 2 && activityState.tableData2.activityStatus == 0) { activityState.isTransform = 1 } else if (activityState.tableData2.status == 2 && (activityState.tableData2.activityStatus == 1 || (activityState.tableData2.balanceStatus != 2 && activityState.tableData2.creditStatus != 2))) { activityState.isTransform = 2 } else if (activityState.tableData2.status == 2 && activityState.tableData2.activityStatus == 3) { activityState.isTransform = 2 } } else { activityState.isTransform = 2 } if (activityState.tableData2.status == 2 && activityState.tableData2.activityStatus == 2) { activityState.isTransform = null if (activityState.tableData2.realizationStatus == 0) { activityState.isRealization = 1 } else if (activityState.tableData2.realizationStatus == 1 || (activityState.tableData2.realizationCreditStatus != 2 && activityState.tableData2.realizationBalanceStatus != 2)) { activityState.isRealization = 2 } else if (activityState.tableData2.realizationStatus == 3) { activityState.isRealization = 2 } } else { activityState.isRealization = null } } else { if (activityState.tableData2) { activityState.tableData2Flag = true } } } else { uni.showToast({ title: res.msg, icon: 'none' }) activityState.tableData2 = true } } catch (error) { console.error('获取2023迎新活动数据失败', error) } } // 2023匠鑫活动数据 const Activity23JiangxinInfo = async () => { try { const res = await activityApi.Activity23JiangxinInfo({}) if (res.code == Code.StatusOK) { activityState.tableData3 = res.data if (activityState.tableData3.show == 1) { activityState.tableData3Flag = true } else if (activityState.tableData3.show == 0) { activityState.tableData3Flag = false } else if (!activityState.tableData3.show) { activityState.tableData3Flag = true const nowTime = getCurrentTime(2).getTime() const endTime = activityState.tableData3.activityEndTime ? new Date(activityState.tableData3.activityEndTime.replace(/-/g, '/')).getTime() : null if (activityState.tableData3.status == 2 && activityState.tableData3.realizationStatus == 0 && endTime && nowTime > endTime) { activityState.isRealizationJx = 1 } else { activityState.isRealizationJx = 2 } } } else { uni.showToast({ title: res.msg, icon: 'none' }) } } catch (error) { console.error('获取2023匠鑫活动数据失败', error) } } // 2023匠鑫活动数据Vip const Activity23JiangxinInfoVip = async () => { try { const res = await activityApi.Activity23JiangxinInfoVip({}) if (res.code == Code.StatusOK) { activityState.tableData3Vip = res.data if (activityState.tableData3Vip.show == 1) { activityState.tableData3FlagVip = true } else if (activityState.tableData3Vip.show == 0) { activityState.tableData3FlagVip = false } else if (!activityState.tableData3Vip.show) { activityState.tableData3FlagVip = true const nowTime = getCurrentTime(2).getTime() const endTime = activityState.tableData3Vip.activityEndTime ? new Date(activityState.tableData3Vip.activityEndTime.replace(/-/g, '/')).getTime() : null if (activityState.tableData3Vip.status == 2 && activityState.tableData3Vip.realizationStatus == 0 && endTime && nowTime > endTime) { activityState.isRealizationJxVip = 1 } else { activityState.isRealizationJxVip = 2 } } } else { uni.showToast({ title: res.msg, icon: 'none' }) } } catch (error) { console.error('获取2023匠鑫活动数据Vip失败', error) } } // 2023年中赠金活动数据-10 const Activity24nianzhongInfo = async () => { try { const res = await activityApi.Activity23nianzhongInfo({}) if (res.code == Code.StatusOK) { activityState.tableData4 = res.data if (activityState.tableData4.show == 1) { activityState.tableData4Flag = true } else if (activityState.tableData4.show == 0) { activityState.tableData4Flag = false } } else { uni.showToast({ title: res.msg, icon: 'none' }) } } catch (error) { console.error('获取年中赠金活动数据失败', error) } } // 2023年中赠金活动数据-20 const Activity24nianzhongTwoInfo = async () => { try { const res = await activityApi.Activity23nianzhongTwoInfo({}) if (res.code == Code.StatusOK) { activityState.tableData4Two = res.data if (activityState.tableData4Two.show == 1) { activityState.tableData4TwoFlag = true } else if (activityState.tableData4Two.show == 0) { activityState.tableData4TwoFlag = false } } else { uni.showToast({ title: res.msg, icon: 'none' }) } } catch (error) { console.error('获取年中赠金活动数据-20失败', error) } } // 交易大赛数据-参数 const GetActivityCptCode = async () => { try { const res = await activityApi.ActivityCptinfoGetCode({}) if (res.code == Code.StatusOK) { tableDataCptFlagCode.value = res.data.code if (tableDataCptFlagCode.value) { await ActivityCptInfo(tableDataCptFlagCode.value) } } else { uni.showToast({ title: res.msg, icon: 'none' }) } } catch (error) { console.error('获取交易大赛参数失败', error) } } // 交易大赛数据 const ActivityCptInfo = async (code: string) => { try { const res = await activityApi.ActivityCptinfoCode({ infoCode: code }) if (res.code == Code.StatusOK) { activityState.tableDataCpt = res.data activityState.tableDataCptFlag = !!activityState.tableDataCpt } else { uni.showToast({ title: res.msg, icon: 'none' }) } } catch (error) { console.error('获取交易大赛数据失败', error) } } // 24精英杯活动 const Activity24JYBInfoVip = async () => { try { const res = await activityApi.Activity24JYBInfoVip({}) if (res.code == Code.StatusOK) { activityState.tableData3JYB = res.data if (activityState.tableData3JYB.show == 1) { activityState.tableData3FlagJYB = true } else if (activityState.tableData3JYB.show == 0) { activityState.tableData3FlagJYB = false } else if (!activityState.tableData3JYB.show) { activityState.tableData3FlagJYB = true const nowTime = getCurrentTime(2).getTime() const endTime = activityState.tableData3JYB.activityEndTime ? new Date(activityState.tableData3JYB.activityEndTime.replace(/-/g, '/')).getTime() : null if (activityState.tableData3JYB.status == 2 && activityState.tableData3JYB.realizationStatus == 0 && endTime && nowTime > endTime) { activityState.isRealizationJxJYB = 1 } else { activityState.isRealizationJxJYB = 2 } } } else { uni.showToast({ title: res.msg, icon: 'none' }) } } catch (error) { console.error('获取24精英杯活动数据失败', error) } } // 24无忧交易 const ActivityNoWorriesInfo = async () => { try { const res = await activityApi.ActivityNoWorriesInfo({}) if (res.code == Code.StatusOK) { activityState.tableDataNoWorries = res.data if (typeof activityState.tableDataNoWorries == 'object') { activityState.tableDataNoWorriesFlag = true const nowTime = getCurrentTime(2).getTime() const startTime = new Date(activityState.tableDataNoWorries.compensateTime.replace(/-/g, '/')).getTime() const endTime = new Date(activityState.tableDataNoWorries.revokeTime.replace(/-/g, '/')).getTime() if (nowTime < endTime && nowTime > startTime && (activityState.tableDataNoWorries.status == 0 || activityState.tableDataNoWorries.status == 3) && activityState.tableDataNoWorries.compensateStatus == 2 && activityState.tableDataNoWorries.activityStatus == 1) { activityState.isRealizationNoWorries = 1 } else { activityState.isRealizationNoWorries = null } } else { if (activityState.tableDataNoWorries) { activityState.tableDataNoWorriesFlag = true } } } else { uni.showToast({ title: res.msg, icon: 'none' }) } } catch (error) { console.error('获取无忧交易数据失败', error) } } // CWG 现金嘉年华-新任务 const ActivitYdepositRaffleAim = async () => { try { const res = await activityApi.ActivitYdepositRaffleAim({}) if (res.code == Code.StatusOK) { activityState.newTask = !!res.data if (res.data) { activityState.newTaskList = res.data } } else { uni.showToast({ title: res.msg, icon: 'none' }) } } catch (error) { console.error('获取新任务数据失败', error) } } // CWG 现金嘉年华-抽奖次数 const ActivitYdepositRaffleinfo = async () => { try { const res = await activityApi.ActivitYdepositRaffleinfo({}) if (res.code == Code.StatusOK) { activityState.LuckyDrawsNumber = res.data?.raffleResidueNumber || '0' } else { uni.showToast({ title: res.msg, icon: 'none' }) } } catch (error) { console.error('获取抽奖次数失败', error) } } // 抽奖活动是否到期 const isRaffleOpen = () => { const endTime1 = '2025/9/30 23:59:59' const startTime1 = '2025/7/1 00:00:00' const now = getCurrentTime(2).getTime() const end = new Date(endTime1).getTime() const start = new Date(startTime1).getTime() if (now < end && start < now) { activityState.choujiaClose = true ActivitYdepositRaffleAim() ActivitYdepositRaffleinfo() } } // 新年庆典是否到期 const isNewYear24Open = () => { const endTime1 = '2025/3/31 23:59:59' const startTime1 = '2025/1/1 00:00:00' const now = getCurrentTime(2).getTime() const end = new Date(endTime1).getTime() const start = new Date(startTime1).getTime() if (now < end && start < now) { ActivityNewYear24() } } // 新年庆典数据 const ActivityNewYear24 = async () => { try { const res = await activityApi.ActivityNewYear24({}) if (res.code == Code.StatusOK) { activityState.tableDataNewYear24 = res.data activityState.tableDataNewYear24Flag = !!activityState.tableDataNewYear24 } else { uni.showToast({ title: res.msg, icon: 'none' }) } } catch (error) { console.error('获取新年庆典数据失败', error) } } // 限时活动 const ActivityRequiteInfo = async () => { try { const res = await activityApi.ActivityRequiteInfo({}) if (res.code == Code.StatusOK) { activityState.limitedStatus = res.data } else { uni.showToast({ title: res.msg, icon: 'none' }) } } catch (error) { console.error('获取限时活动数据失败', error) } } // 获取活动显示信息 const getActivityShowsInfo = async () => { try { const res = await activityApi.ActivityShowsInfo() if (res.code == Code.StatusOK) { activityState.activityShowsInfo = res.data activityState.surplusGive = res.data.surplusGive || false activityState.monthlyGive = res.data.monthlyGive || false } else { uni.showToast({ title: res.msg, icon: 'none' }) activityState.surplusGive = false activityState.monthlyGive = false } } catch (error) { console.error('获取活动显示信息失败', error) activityState.surplusGive = false activityState.monthlyGive = false } } // 20赠金是否到期 const is20Open = () => { const endTime1 = '2023/04/30 23:59:59' const now = getCurrentTime(2).getTime() const end = new Date(endTime1).getTime() if (now > end) { activityState.anshiClose = false } } // 20赠金活动数据 const getActivityPercentageGiveInfo = async () => { try { const res = await activityApi.ActivityPercentageGiveInfo({}) if (res.code == Code.StatusOK) { // 处理20赠金活动数据 console.log('20赠金活动数据', res.data) } } catch (error) { console.error('获取20赠金活动数据失败', error) } } // 刷新所有活动数据 const refreshAllActivities = () => { is20Open() searchFunc() searchFunc1() Activity23HundredInfo() Activity23JiangxinInfoVip() Activity24nianzhongInfo() Activity24nianzhongTwoInfo() GetActivityCptCode() Activity24JYBInfoVip() ActivityNoWorriesInfo() isRaffleOpen() isNewYear24Open() ActivityRequiteInfo() getActivityShowsInfo() } // 分页处理 const handlePageChange = (page: number) => { pagerInfo.value.current = page searchFunc(page) searchFunc1() } // 清理定时器 onUnmounted(() => { if (interval.value) { clearInterval(interval.value) } }) return { // 状态 pictLoading, flag, tableData, tableDataGive, singleData, pagerInfo, loginOptions, loginOptions1, activityState, tableDataCptFlagCode, NewYear24DataBalance, NewYear24Data, // 计算属性 country, myCid, isSupportedCountry, isGuoQin, // 工具函数 getCurrentTime, getzero, timeConvert, groupCurrency, groupTypeName, overdue, timeExpireJx, isAfterSeptember30, // API函数 getDateList, searchFunc, searchFunc1, getSingle, getSingle1, Activity23HundredInfo, Activity23JiangxinInfo, Activity23JiangxinInfoVip, Activity24nianzhongInfo, Activity24nianzhongTwoInfo, GetActivityCptCode, ActivityCptInfo, Activity24JYBInfoVip, ActivityNoWorriesInfo, ActivitYdepositRaffleAim, ActivitYdepositRaffleinfo, isRaffleOpen, isNewYear24Open, ActivityNewYear24, ActivityRequiteInfo, getActivityShowsInfo, getActivityPercentageGiveInfo, refreshAllActivities, handlePageChange } }