active-preview.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. // 调用预约API
  2. const { museumApi } = require('../../../utils/api.js');
  3. const { urlImg } = require('../../../utils/util.js');
  4. Page({
  5. data: {
  6. activityList: [], // 活动列表
  7. openTime: '10:00', // 开馆时间
  8. closeTime: '18:00', // 闭馆时间
  9. stopCheckTime: '17:00', // 停止检票时间
  10. noticeContent: '', // 预约须知内容
  11. urlImg: urlImg
  12. },
  13. onLoad(options) {
  14. // 页面加载时的逻辑
  15. this.loadActivityList();
  16. this.loadNoticeContent();
  17. },
  18. onShow() {
  19. // 页面显示时的逻辑
  20. },
  21. // 检查活动是否已过期(按日期比较)
  22. isActivityExpired(activity) {
  23. if (!activity.endTime) return false;
  24. const today = new Date();
  25. const activityEndDate = new Date(activity.endTime);
  26. // 只比较日期,忽略具体时间
  27. const todayDateString = today.getFullYear() + '-' +
  28. String(today.getMonth() + 1).padStart(2, '0') + '-' +
  29. String(today.getDate()).padStart(2, '0');
  30. const endDateString = activityEndDate.getFullYear() + '-' +
  31. String(activityEndDate.getMonth() + 1).padStart(2, '0') + '-' +
  32. String(activityEndDate.getDate()).padStart(2, '0');
  33. // 如果活动结束日期小于今天,则认为已过期
  34. return endDateString < todayDateString;
  35. },
  36. // 加载活动列表
  37. loadActivityList() {
  38. museumApi.getSocialActivityList({
  39. pageSize: 100,
  40. status: 1,
  41. subscribe: 1
  42. })
  43. .then(response => {
  44. console.log('获取活动列表成功:', response);
  45. if (response && response.records) {
  46. // 过滤掉已过期的活动(结束日期小于今天)
  47. const validActivities = response.records.filter(activity => {
  48. const isExpired = this.isActivityExpired(activity);
  49. if (isExpired) {
  50. console.log('活动已过期,将被过滤:', activity.title || activity.name, activity.endTime);
  51. }
  52. return !isExpired;
  53. });
  54. console.log(`活动过滤结果: 总数${response.records.length},有效${validActivities.length},过期${response.records.length - validActivities.length}`);
  55. this.setData({
  56. activityList: validActivities
  57. });
  58. this.updateTimeInfoFromActivity(validActivities);
  59. }
  60. })
  61. .catch(error => {
  62. console.error('获取活动列表失败:', error);
  63. });
  64. },
  65. // 加载预约须知内容
  66. loadNoticeContent() {
  67. console.log('获取预约须知内容');
  68. // 调用API获取预约须知
  69. museumApi.getSlots()
  70. .then(res => {
  71. console.log('获取预约须知成功:', res);
  72. if (res) {
  73. this.setData({
  74. noticeContent: res.notice.rtf
  75. });
  76. } else {
  77. console.error('获取预约须知失败:', res.message || '未知错误');
  78. }
  79. })
  80. .catch(err => {
  81. console.error('获取预约须知异常:', err);
  82. });
  83. },
  84. // 从活动数据更新时间信息
  85. updateTimeInfoFromActivity(activityList) {
  86. // 获取当前日期的预约时段来更新时间信息
  87. const today = new Date();
  88. const dateString = today.getFullYear() + '-' +
  89. String(today.getMonth() + 1).padStart(2, '0') + '-' +
  90. String(today.getDate()).padStart(2, '0');
  91. museumApi.getSlotsByDate(dateString)
  92. .then(res => {
  93. if (res && res.length > 0) {
  94. this.updateTimeInfo(res);
  95. }
  96. })
  97. .catch(err => {
  98. console.error('获取预约时段异常:', err);
  99. });
  100. },
  101. // 判断时间段是否为下午(大于等于14:00)
  102. isAfternoonTime(timeStr) {
  103. // 时间格式如:"10:00-14:00" 或 "14:00-18:00"
  104. const startTime = timeStr.split('-')[0].trim();
  105. const hour = parseInt(startTime.split(':')[0]);
  106. return hour >= 14;
  107. },
  108. // 更新时间信息
  109. updateTimeInfo(data) {
  110. let openTime = '10:00';
  111. let closeTime = '18:00';
  112. let stopCheckTime = '17:00';
  113. if (data.length === 1) {
  114. // 只有一项数据,直接取time
  115. const timeRange = data[0].time;
  116. if (timeRange && timeRange.includes('-')) {
  117. const times = timeRange.split('-');
  118. openTime = times[0];
  119. closeTime = times[1];
  120. }
  121. } else if (data.length >= 2) {
  122. // 有两项或更多数据,根据时间段判断上午下午
  123. let morningData = null;
  124. let afternoonData = null;
  125. // 遍历数据,根据时间判断是上午还是下午
  126. data.forEach(item => {
  127. if (this.isAfternoonTime(item.time)) {
  128. afternoonData = item;
  129. } else {
  130. morningData = item;
  131. }
  132. });
  133. // 取上午时段的开始时间作为开馆时间
  134. if (morningData && morningData.time.includes('-')) {
  135. openTime = morningData.time.split('-')[0];
  136. }
  137. // 取下午时段的结束时间作为闭馆时间
  138. if (afternoonData && afternoonData.time.includes('-')) {
  139. closeTime = afternoonData.time.split('-')[1];
  140. }
  141. // 如果没有上午时段,用下午时段的开始时间作为开馆时间
  142. if (!morningData && afternoonData && afternoonData.time.includes('-')) {
  143. openTime = afternoonData.time.split('-')[0];
  144. }
  145. // 如果没有下午时段,用上午时段的结束时间作为闭馆时间
  146. if (!afternoonData && morningData && morningData.time.includes('-')) {
  147. closeTime = morningData.time.split('-')[1];
  148. }
  149. }
  150. // 计算停止检票时间(闭馆时间往前一个小时)
  151. stopCheckTime = this.calculateStopCheckTime(closeTime);
  152. this.setData({
  153. openTime: openTime,
  154. closeTime: closeTime,
  155. stopCheckTime: stopCheckTime
  156. });
  157. console.log('更新时间信息:', { openTime, closeTime, stopCheckTime });
  158. },
  159. // 计算停止检票时间(闭馆时间往前一个小时)
  160. calculateStopCheckTime(closeTime) {
  161. try {
  162. const [hours, minutes] = closeTime.split(':').map(Number);
  163. let stopHour = hours - 1;
  164. // 处理跨天的情况
  165. if (stopHour < 0) {
  166. stopHour = 23;
  167. }
  168. return String(stopHour).padStart(2, '0') + ':' + String(minutes).padStart(2, '0');
  169. } catch (error) {
  170. console.error('计算停止检票时间失败:', error);
  171. return '17:00'; // 默认值
  172. }
  173. },
  174. // 返回首页
  175. goBack() {
  176. wx.switchTab({
  177. url: '/pages/index/index'
  178. });
  179. },
  180. // 跳转到用户列表
  181. goUserList() {
  182. wx.navigateTo({
  183. url: '/pages/user/userList/index'
  184. });
  185. },
  186. // 跳转到活动页面
  187. goToActivePage(e) {
  188. const activityId = e.currentTarget.dataset.activityId;
  189. console.log('跳转到活动页面,activityId:', activityId);
  190. wx.navigateTo({
  191. url: `/pages/index/active-page/active-page?activityId=${activityId}&type=2`
  192. });
  193. },
  194. onShareAppMessage() {
  195. return {
  196. title: '克拉玛依博物馆 - 活动预约',
  197. path: '/pages/index/active-preview/active-preview'
  198. };
  199. }
  200. });