合伙人运营小程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. const api = require('../../api/index.js');
  2. Page({
  3. data: {
  4. // 筛选状态
  5. activeFilter: 'all', // all/car/station/user
  6. activeStatus: 'unread', // unread/read/handled
  7. // 告警数量统计
  8. alertCount: {
  9. all: 0,
  10. car: 0,
  11. station: 0,
  12. user: 0
  13. },
  14. // 是否有未处理告警(控制底部批量操作栏显示)
  15. hasUnHandled: false,
  16. // 原始告警数据(实际项目从接口获取)
  17. alertData: [],
  18. // 筛选后的告警列表
  19. filteredAlerts: [],
  20. // ===== 新增分页相关数据 =====
  21. pageNum: 1, // 当前页码
  22. pageSize: 10, // 每页条数
  23. totalPages: 0, // 总数据量
  24. hasMore: true, // 是否还有更多数据
  25. isLoading: false // 是否正在加载(防止重复请求)
  26. },
  27. onLoad(options) {
  28. this.handleWsMessage()
  29. },
  30. onHide(){
  31. // 页面卸载时,取消订阅,这是至关重要的一步!
  32. wx.$off('wsMessage', this.handleWsMessage);
  33. },
  34. /**
  35. * 处理接收到的 WebSocket 消息
  36. * @param {Object} message 从 app.js 广播过来的消息对象
  37. */
  38. handleWsMessage(message) {
  39. console.log('Other Page 收到 WebSocket 消息:', message);
  40. // 根据消息类型进行不同的处理
  41. switch (message.api) {
  42. case '/alarm/selectalarm':
  43. // 在这里可以更新地图、刷新UI等
  44. this.initAlertData(true);
  45. break;
  46. }
  47. },
  48. onShow(){
  49. // 初始化告警数据(第一页)
  50. this.initAlertData(true);
  51. },
  52. /**
  53. * 下拉刷新:重新加载第一页告警数据
  54. */
  55. onPullDownRefresh() {
  56. // 重置分页状态,重新加载第一页
  57. this.initAlertData(true);
  58. wx.stopPullDownRefresh();
  59. },
  60. /**
  61. * 上拉加载更多:加载下一页数据
  62. */
  63. onReachBottom() {
  64. // 没有更多数据或正在加载时,不执行
  65. if (!this.data.hasMore || this.data.isLoading) return;
  66. // 加载下一页
  67. this.initAlertData(false);
  68. },
  69. /**
  70. * 初始化/加载告警数据(支持分页)
  71. * @param {Boolean} isRefresh 是否刷新(true=重新加载第一页,false=加载下一页)
  72. */
  73. initAlertData(isRefresh = true) {
  74. // 防止重复加载
  75. if (this.data.isLoading) return;
  76. // 设置加载状态
  77. this.setData({ isLoading: true });
  78. // 分页参数处理
  79. const pageNum = isRefresh ? 1 : this.data.pageNum + 1;
  80. const pageSize = this.data.pageSize;
  81. // 接口请求参数
  82. let activeStatus = ''
  83. if (this.data.activeStatus=='unread') {
  84. activeStatus = ''
  85. }else if(this.data.activeStatus=='read'){
  86. activeStatus = 0
  87. }else if(this.data.activeStatus=='handled'){
  88. activeStatus = 1
  89. }
  90. let data = {
  91. faultstatus: activeStatus,
  92. pageNum,
  93. pageSize
  94. };
  95. api.request(`/alarm/selectalarm`, 'post', data, { isPublic: false })
  96. .then((res) => {
  97. console.log('告警数据请求结果:', res);
  98. if (res.code === 200) {
  99. const { data: responseData } = res;
  100. const { data: list, totalPages } = responseData;
  101. // 数据处理:刷新=覆盖,加载更多=追加
  102. const newAlertData = isRefresh
  103. ? list
  104. : [...this.data.alertData, ...list];
  105. // 计算是否还有更多数据
  106. const hasMore = newAlertData.length < totalPages;
  107. console.log(newAlertData);
  108. console.log(pageNum);
  109. console.log(totalPages);
  110. console.log(hasMore);
  111. // 更新数据
  112. this.setData({
  113. alertData: newAlertData,
  114. pageNum:res.data.currentPage, // 更新当前页码
  115. totalPages:res.data.totalCount, // 更新总条数
  116. hasMore // 更新是否有更多数据
  117. });
  118. this.filterAlerts();
  119. }
  120. })
  121. .catch((err) => {
  122. console.error('告警数据请求失败:', err);
  123. wx.showToast({
  124. title: '数据加载失败',
  125. icon: 'none',
  126. duration: 1500
  127. });
  128. })
  129. .finally(() => {
  130. // 无论成功失败,都结束加载状态
  131. this.setData({ isLoading: false });
  132. });
  133. },
  134. /**
  135. * 统计各类型告警数量(角标显示)
  136. */
  137. calcAlertCount() {
  138. const { alertData } = this.data;
  139. // 过滤已处理的告警(角标只显示未处理的)
  140. const unHandledAlerts = alertData.filter(item => item.faultstatus != 0);
  141. // 统计数量
  142. const count = {
  143. all: unHandledAlerts.length,
  144. car: unHandledAlerts.filter(item => item.type === 'car').length,
  145. station: unHandledAlerts.filter(item => item.type === 'station').length,
  146. user: unHandledAlerts.filter(item => item.type === 'user').length
  147. };
  148. // 判断是否有未处理告警
  149. const hasUnHandled = unHandledAlerts.length > 0;
  150. this.setData({
  151. alertCount: count,
  152. hasUnHandled
  153. });
  154. },
  155. /**
  156. * 筛选告警列表(根据类型+状态)
  157. */
  158. filterAlerts() {
  159. const { alertData} = this.data;
  160. // 第一步:按类型筛选
  161. let filtered = alertData;
  162. // 更新筛选后的列表
  163. this.setData({ filteredAlerts: filtered });
  164. },
  165. /**
  166. * 切换告警类型筛选
  167. */
  168. switchFilter(e) {
  169. const type = e.currentTarget.dataset.type;
  170. this.setData({ activeFilter: type }, () => {
  171. this.filterAlerts();
  172. });
  173. },
  174. /**
  175. * 切换告警状态筛选
  176. */
  177. switchStatus(e) {
  178. const status = e.currentTarget.dataset.status;
  179. this.setData({
  180. activeStatus: status
  181. })
  182. this.initAlertData()
  183. },
  184. /**
  185. * 跳转告警详情页
  186. */
  187. toAlertDetail(e) {
  188. const alert = e.currentTarget.dataset.alert;
  189. console.log(alert);
  190. if (!alert.faultId) return;
  191. // 先标记为已读(未读状态下)
  192. if (alert.status === 'unread') {
  193. const { alertData } = this.data;
  194. const newAlerts = alertData.map(item => {
  195. if (item.id === alert.id) {
  196. return { ...item, status: 'read' };
  197. }
  198. return item;
  199. });
  200. this.setData({ alertData: newAlerts }, () => {
  201. this.calcAlertCount();
  202. this.filterAlerts();
  203. });
  204. }
  205. // 跳转详情页(替换为你的详情页路径)
  206. wx.navigateTo({
  207. url: `/pages/alert-detail/alert-detail?id=${alert.id}`
  208. });
  209. },
  210. /**
  211. * 重置分页状态(可选:筛选条件变更时调用)
  212. */
  213. resetPage() {
  214. this.setData({
  215. pageNum: 1,
  216. totalPages: 0,
  217. hasMore: true,
  218. alertData: []
  219. });
  220. }
  221. });
  222. //