active-preview.js 6.8 KB

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