wlzboy
2025-11-01 8b005a808d6ab8fae1480ed57bdfd68af2dafcd4
app/pages/message/index.vue
@@ -10,16 +10,16 @@
        <view 
          class="message-item" 
          v-for="message in sortedMessages" 
          :key="message.id"
          :key="message.messageId"
          @click="viewMessageDetail(message)"
        >
          <view class="message-main">
            <view class="message-title">
              <text class="title-text">{{ getMessageTypeText(message.type) }}</text>
              <view class="unread-dot" v-if="!message.read"></view>
              <text class="title-text">{{ getMessageTypeText(message.messageType) }}</text>
              <view class="unread-dot" v-if="message.isRead === '0'"></view>
            </view>
            <view class="message-content">{{ message.content }}</view>
            <view class="message-time">{{ message.time }}</view>
            <view class="message-content">{{ message.messageContent }}</view>
            <view class="message-time">{{ formatMessageTime(message.createTime) }}</view>
          </view>
        </view>
        
@@ -33,89 +33,130 @@
</template>
<script>
  import { getMyMessages, markAsRead } from '@/api/message'
  import { formatDateTime } from '@/utils/common'
  export default {
    data() {
      return {
        // 消息列表
        messages: [
          {
            id: 1,
            type: 'create', // 创建成功
            content: 'TD 1011 广州天河->广州东站,时间:13:20 任务创建成功',
            time: '2023-05-15 13:20',
            read: false,
            taskId: 1
          },
          {
            id: 2,
            type: 'push', // 任务推送
            content: 'TD1021 广州天河->广州东站,时间:13:20 出发,请及时处理',
            time: '2023-05-15 13:25',
            read: false,
            taskId: 2
          },
          {
            id: 3,
            type: 'status', // 任务状态变更
            content: 'TD1021 广州天河->广州东站,时间:13:20,任务正在转运中',
            time: '2023-05-15 14:30',
            read: true,
            taskId: 2
          },
          {
            id: 4,
            type: 'create', // 创建成功
            content: 'TD 1022 深圳南山->深圳福田,时间:15:10 任务创建成功',
            time: '2023-05-15 15:10',
            read: false,
            taskId: 3
          },
          {
            id: 5,
            type: 'push', // 任务推送
            content: 'TD1023 深圳南山->深圳福田,时间:16:00 出发,请及时处理',
            time: '2023-05-15 16:00',
            read: true,
            taskId: 4
          }
        ]
        messages: [],
        loading: false
      }
    },
    computed: {
      // 按未读/已读排序,未读的在前面
      sortedMessages() {
        return [...this.messages].sort((a, b) => {
          if (a.read === b.read) {
            // 相同状态按时间倒序
            return new Date(b.time) - new Date(a.time);
          if (a.isRead === b.isRead) {
            // 相同状态按时间倒序 - 使用兼容iOS的日期格式
            const timeA = a.createTime ? new Date(a.createTime.replace(/-/g, '/')) : new Date(0)
            const timeB = b.createTime ? new Date(b.createTime.replace(/-/g, '/')) : new Date(0)
            return timeB - timeA
          }
          // 未读的排在前面
          return a.read ? 1 : -1;
        });
          return a.isRead === '0' ? -1 : 1
        })
      }
    },
    onLoad() {
      this.loadMessages()
    },
    onShow() {
      // 每次显示页面时刷新消息
      this.loadMessages()
      // 更新TabBar徽标
      this.updateTabBarBadge()
    },
    onPullDownRefresh() {
      this.loadMessages().then(() => {
        uni.stopPullDownRefresh()
      })
    },
    methods: {
      // 加载消息列表
      async loadMessages() {
        try {
          this.loading = true
          const response = await getMyMessages()
          if (response.code === 200) {
            this.messages = response.data || []
          } else {
            this.$modal.showToast(response.msg || '加载消息失败')
          }
        } catch (error) {
          console.error('加载消息失败:', error)
          this.$modal.showToast('加载消息失败')
        } finally {
          this.loading = false
        }
      },
      // 获取消息类型文本
      getMessageTypeText(type) {
        const typeMap = {
          'create': '创建成功',
          'push': '任务推送',
          'status': '任务状态'
          'CREATE': '创建成功',
          'PUSH': '任务推送',
          'STATUS': '状态变更',
          'ASSIGN': '任务分配'
        }
        return typeMap[type] || '系统消息';
      },
      
      // 查看消息详情(跳转到任务详情)
      viewMessageDetail(message) {
        // 标记为已读
        message.read = true;
        // 跳转到任务详情页面
        if (message.taskId) {
          this.$tab.navigateTo(`/pages/task/detail?id=${message.taskId}`);
        } else {
          this.$modal.showToast('无法找到关联任务');
      async viewMessageDetail(message) {
        try {
          // 校验消息对象
          if (!message || !message.messageId) {
            console.error('消息数据异常:', message)
            this.$modal.showToast('消息数据异常')
            return
          }
          // 标记为已读
          if (message.isRead === '0') {
            await markAsRead(message.messageId)
            message.isRead = '1'
            // 更新徽标
            this.updateTabBarBadge()
          }
          // 跳转到任务详情页面
          if (message.taskId) {
            this.$tab.navigateTo(`/pages/task/detail?id=${message.taskId}`)
          } else {
            this.$modal.showToast('无法找到关联任务')
          }
        } catch (error) {
          console.error('标记消息已读失败:', error)
          // 即使标记失败,也允许跳转
          if (message && message.taskId) {
            this.$tab.navigateTo(`/pages/task/detail?id=${message.taskId}`)
          }
        }
      },
      // 更新TabBar徽标
      updateTabBarBadge() {
        const unreadCount = this.messages.filter(msg => msg.isRead === '0').length
        console.log('未读消息数量:', unreadCount)
        if (unreadCount > 0) {
          uni.setTabBarBadge({
            index: 3, // 消息页面在tabBar中的索引
            text: unreadCount > 99 ? '99+' : unreadCount.toString()
          })
        } else {
          uni.removeTabBarBadge({
            index: 3
          })
        }
      },
      // 格式化消息时间显示
      formatMessageTime(dateTime) {
        if (!dateTime) return ''
        return formatDateTime(dateTime, 'MM-DD HH:mm')
      }
    }
  }