select-activity.js 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. Page({
  2. data:{
  3. departureActivities:[], // 去程活动(目的地活动)
  4. returnActivities:[], // 返程活动(出发地活动)
  5. fromCity: '',
  6. toCity: '',
  7. selectedDate: '',
  8. selectedType: ''
  9. },
  10. onLoad(options){
  11. // 获取从首页传来的参数
  12. const { type, from, to, date } = options;
  13. this.setData({
  14. selectedType: type,
  15. fromCity: from,
  16. toCity: to,
  17. selectedDate: date
  18. });
  19. // 根据出发/到达城市自动匹配活动
  20. this.loadActivities(from, to, date);
  21. },
  22. loadActivities(from, to, date) {
  23. // 模拟根据城市匹配活动数据(包含不同日期的活动)
  24. let allActivities = [
  25. // 11月份活动
  26. {id:'1',name:'五月天演唱会',img:'/images/activity1.jpg',date:'2025-11-07 19:30',place:'上海体育馆',city:'上海市',venue:'上海体育馆'},
  27. {id:'3',name:'周杰伦演唱会',img:'/images/activity1.jpg',date:'2025-11-08 20:00',place:'北京工人体育馆',city:'北京市',venue:'北京工人体育馆'},
  28. {id:'7',name:'演唱会',img:'/images/activity1.jpg',date:'2025-11-09 20:00',place:'天津体育中心',city:'天津市',venue:'天津体育中心'},
  29. {id:'6',name:'体育赛事',img:'/images/activity2.jpg',date:'2025-11-10 19:00',place:'南京青奥体育公园',city:'南京市',venue:'南京青奥体育公园'},
  30. // 12月份活动
  31. {id:'2',name:'英雄联盟总决赛',img:'/images/activity2.jpg',date:'2025-12-01 14:00',place:'广州体育中心',city:'广州市',venue:'广州体育中心'},
  32. {id:'5',name:'音乐节',img:'/images/activity1.jpg',date:'2025-12-02 16:00',place:'杭州奥体中心',city:'杭州市',venue:'杭州奥体中心'},
  33. {id:'8',name:'音乐会',img:'/images/activity2.jpg',date:'2025-12-03 19:30',place:'重庆大剧院',city:'重庆市',venue:'重庆大剧院'},
  34. {id:'4',name:'王者荣耀世冠',img:'/images/activity2.jpg',date:'2025-12-20 15:00',place:'深圳湾体育中心',city:'深圳市',venue:'深圳湾体育中心'},
  35. // 跨月活动
  36. {id:'9',name:'新年音乐会',img:'/images/activity1.jpg',date:'2025-11-30 19:00',place:'上海大剧院',city:'上海市',venue:'上海大剧院'},
  37. {id:'10',name:'元旦晚会',img:'/images/activity2.jpg',date:'2025-12-31 20:00',place:'北京国家体育馆',city:'北京市',venue:'北京国家体育馆'}
  38. ];
  39. let activities = [];
  40. // 筛选到达地的活动(去程)
  41. const departureActivities = allActivities.filter(activity => {
  42. return this.isCityMatch(activity.city, to);
  43. }).map(activity => ({
  44. ...activity,
  45. tripType: 'departure',
  46. tripLabel: '去程',
  47. matchPoint: activity.venue // 去程:目的地点为活动场馆
  48. }));
  49. // 筛选出发地的活动(返程)
  50. const returnActivities = allActivities.filter(activity => {
  51. return this.isCityMatch(activity.city, from);
  52. }).map(activity => ({
  53. ...activity,
  54. tripType: 'return',
  55. tripLabel: '返程',
  56. matchPoint: activity.venue // 返程:出发地点为活动场馆
  57. }));
  58. // 根据出发日期筛选活动(误差两天内)
  59. const filteredDepartureActivities = this.filterActivitiesByDate(departureActivities, date);
  60. const filteredReturnActivities = this.filterActivitiesByDate(returnActivities, date);
  61. console.log('去程活动(目的地):', filteredDepartureActivities);
  62. console.log('返程活动(出发地):', filteredReturnActivities);
  63. this.setData({
  64. departureActivities: filteredDepartureActivities,
  65. returnActivities: filteredReturnActivities
  66. });
  67. },
  68. // 根据出发日期筛选活动(误差两天内)
  69. filterActivitiesByDate(activities, selectedDate) {
  70. if (!selectedDate || activities.length === 0) return activities;
  71. return activities.filter(activity => {
  72. if (!activity.date) return false;
  73. try {
  74. // 提取活动日期(格式:YYYY-MM-DD HH:mm)
  75. const activityDateStr = activity.date.split(' ')[0]; // 只取日期部分
  76. const activityDate = new Date(activityDateStr + 'T00:00:00'); // 添加时间确保正确解析
  77. const selectedDateObj = new Date(selectedDate + 'T00:00:00');
  78. // 检查日期是否有效
  79. if (isNaN(activityDate.getTime()) || isNaN(selectedDateObj.getTime())) {
  80. console.warn(`无效日期: 活动日期=${activityDateStr}, 选择日期=${selectedDate}`);
  81. return false;
  82. }
  83. // 计算日期差(天数)- 更准确的计算方法
  84. const timeDiff = Math.abs(activityDate.getTime() - selectedDateObj.getTime());
  85. const dayDiff = Math.floor(timeDiff / (1000 * 3600 * 24));
  86. console.log(`活动: ${activity.name}, 活动日期: ${activityDateStr}, 出发日期: ${selectedDate}, 天数差: ${dayDiff}`);
  87. // 只返回误差两天内的活动(当天=0, 前后1天=1, 前后2天=2)
  88. return dayDiff <= 2;
  89. } catch (error) {
  90. console.error('日期筛选出错:', error);
  91. return false;
  92. }
  93. });
  94. },
  95. // 城市匹配函数
  96. isCityMatch(activityCity, selectedDestination) {
  97. if (!activityCity || !selectedDestination) return false;
  98. // 去除市、区等后缀进行匹配
  99. const cleanActivityCity = this.cleanCityName(activityCity);
  100. const cleanSelectedCity = this.cleanCityName(selectedDestination);
  101. console.log(`匹配检查: 活动城市="${activityCity}" -> "${cleanActivityCity}", 选择目的地="${selectedDestination}" -> "${cleanSelectedCity}"`);
  102. // 多种匹配方式
  103. const isMatch = cleanActivityCity === cleanSelectedCity ||
  104. selectedDestination.includes(cleanActivityCity) ||
  105. cleanActivityCity.includes(cleanSelectedCity) ||
  106. activityCity === selectedDestination;
  107. console.log(`匹配结果: ${isMatch}`);
  108. return isMatch;
  109. },
  110. // 清理城市名称,提取主要城市名
  111. cleanCityName(cityName) {
  112. if (!cityName) return '';
  113. // 特殊城市映射
  114. const specialCities = {
  115. '北京市': '北京',
  116. '上海市': '上海',
  117. '天津市': '天津',
  118. '重庆市': '重庆'
  119. };
  120. // 检查特殊城市
  121. if (specialCities[cityName]) {
  122. return specialCities[cityName];
  123. }
  124. // 提取主要城市名(去除省、市、区等后缀)
  125. const patterns = [
  126. /^(.+?)省(.+?)市/, // 匹配 "xx省xx市" -> 取市名
  127. /^(.+?)市(.+?)区/, // 匹配 "xx市xx区" -> 取市名
  128. /^(.+?)市/, // 匹配 "xx市" -> 取主名
  129. /^(.+?)区/ // 匹配 "xx区" -> 取主名
  130. ];
  131. for (let pattern of patterns) {
  132. const match = cityName.match(pattern);
  133. if (match) {
  134. // 对于省市格式,取市名(第二个分组)
  135. if (pattern.source.includes('省') && match[2]) {
  136. return match[2].replace('市', '');
  137. }
  138. // 对于其他格式,取第一个分组
  139. return match[1];
  140. }
  141. }
  142. return cityName;
  143. },
  144. chooseActivity(e){
  145. const activityId = e.currentTarget.dataset.id;
  146. const tripType = e.currentTarget.dataset.type; // 从按钮获取行程类型
  147. // 根据行程类型查找活动
  148. let activity;
  149. if (tripType === 'departure') {
  150. activity = this.data.departureActivities.find(a => a.id === activityId);
  151. } else if (tripType === 'return') {
  152. activity = this.data.returnActivities.find(a => a.id === activityId);
  153. }
  154. if (!activity) return;
  155. // 根据活动类型设置出发地和目的地
  156. let actualFrom = this.data.fromCity;
  157. let actualTo = this.data.toCity;
  158. if (activity.tripType === 'departure') {
  159. // 去程:目的地为活动场馆所在地
  160. actualTo = activity.matchPoint;
  161. } else if (activity.tripType === 'return') {
  162. // 返程:出发地为活动场馆所在地
  163. actualFrom = activity.matchPoint;
  164. }
  165. wx.navigateTo({
  166. url: `/pages/schedule-list/schedule-list?activityId=${activityId}&type=${this.data.selectedType}&from=${encodeURIComponent(actualFrom)}&to=${encodeURIComponent(actualTo)}&date=${this.data.selectedDate}&activityName=${encodeURIComponent(activity.name)}&tripType=${activity.tripType}&tripLabel=${encodeURIComponent(activity.tripLabel)}&venue=${encodeURIComponent(activity.venue)}`
  167. });
  168. }
  169. });