From 08f95b2f159b56fa3bd4f4b348855989de8aa456 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期四, 18 十二月 2025 21:48:18 +0800
Subject: [PATCH] feat: vehicle

---
 app/pages/message/index.vue |  115 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 105 insertions(+), 10 deletions(-)

diff --git a/app/pages/message/index.vue b/app/pages/message/index.vue
index e3dd348..95e613f 100644
--- a/app/pages/message/index.vue
+++ b/app/pages/message/index.vue
@@ -2,6 +2,10 @@
   <view class="message-container">
     <view class="message-header">
       <view class="header-title">娑堟伅涓績</view>
+      <view class="subscribe-btn" v-if="!subscribed" @click="subscribeMessage">
+        <uni-icons type="bell" size="20" color="#007AFF"></uni-icons>
+        <text>璁㈤槄閫氱煡</text>
+      </view>
     </view>
     
     <scroll-view class="message-list-scroll" scroll-y="true">
@@ -10,7 +14,7 @@
         <view 
           class="message-item" 
           v-for="message in sortedMessages" 
-          :key="message.id"
+          :key="message.messageId"
           @click="viewMessageDetail(message)"
         >
           <view class="message-main">
@@ -19,7 +23,7 @@
               <view class="unread-dot" v-if="message.isRead === '0'"></view>
             </view>
             <view class="message-content">{{ message.messageContent }}</view>
-            <view class="message-time">{{ message.createTime }}</view>
+            <view class="message-time">{{ formatMessageTime(message.createTime) }}</view>
           </view>
         </view>
         
@@ -34,13 +38,16 @@
 
 <script>
   import { getMyMessages, markAsRead } from '@/api/message'
+  import { formatDateTime } from '@/utils/common'
+  import subscribeManager from '@/utils/subscribe'
   
   export default {
     data() {
       return {
         // 娑堟伅鍒楄〃
         messages: [],
-        loading: false
+        loading: false,
+        subscribed: false,
       }
     },
     computed: {
@@ -48,20 +55,26 @@
       sortedMessages() {
         return [...this.messages].sort((a, b) => {
           if (a.isRead === b.isRead) {
-            // 鐩稿悓鐘舵�佹寜鏃堕棿鍊掑簭
-            return new Date(b.createTime) - new Date(a.createTime);
+            // 鐩稿悓鐘舵�佹寜鏃堕棿鍊掑簭 - 浣跨敤鍏煎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.isRead === '0' ? -1 : 1;
-        });
+          return a.isRead === '0' ? -1 : 1
+        })
       }
     },
     onLoad() {
       this.loadMessages()
+      // 鑷姩璁㈤槄锛堝鏋滄湭璁㈤槄鍒欐樉绀虹‘璁ゅ脊绐楋級
+      this.autoSubscribeOnLaunch()
     },
     onShow() {
       // 姣忔鏄剧ず椤甸潰鏃跺埛鏂版秷鎭�
       this.loadMessages()
+      // 鏇存柊TabBar寰芥爣
+      this.updateTabBarBadge()
     },
     onPullDownRefresh() {
       this.loadMessages().then(() => {
@@ -69,6 +82,21 @@
       })
     },
     methods: {
+      // 鑷姩璁㈤槄锛堥〉闈㈠姞杞芥椂璋冪敤锛�
+      autoSubscribeOnLaunch() {
+        subscribeManager.autoSubscribe()
+          .then((result) => {
+            if (result.skipped) {
+              console.log('鐢ㄦ埛宸茶闃咃紝鏃犻渶閲嶅璁㈤槄')
+            } else if (result.success) {
+              console.log('鑷姩璁㈤槄鎴愬姛')
+            }
+          })
+          .catch((error) => {
+            console.log('鑷姩璁㈤槄鍙栨秷鎴栧け璐ワ細', error)
+          })
+      },
+
       // 鍔犺浇娑堟伅鍒楄〃
       async loadMessages() {
         try {
@@ -101,25 +129,74 @@
       // 鏌ョ湅娑堟伅璇︽儏锛堣烦杞埌浠诲姟璇︽儏锛�
       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}`)
+            this.$tab.navigateTo(`/pagesTask/detail?id=${message.taskId}`)
           } else {
             this.$modal.showToast('鏃犳硶鎵惧埌鍏宠仈浠诲姟')
           }
         } catch (error) {
           console.error('鏍囪娑堟伅宸茶澶辫触锛�', error)
           // 鍗充娇鏍囪澶辫触锛屼篃鍏佽璺宠浆
-          if (message.taskId) {
-            this.$tab.navigateTo(`/pages/task/detail?id=${message.taskId}`)
+          if (message && message.taskId) {
+            this.$tab.navigateTo(`/pagesTask/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, // 娑堟伅椤甸潰鍦╰abBar涓殑绱㈠紩
+            text: unreadCount > 99 ? '99+' : unreadCount.toString()
+          })
+        } else {
+          uni.removeTabBarBadge({
+            index: 3
+          })
+        }
+      },
+      
+      // 鏍煎紡鍖栨秷鎭椂闂存樉绀�
+      formatMessageTime(dateTime) {
+        if (!dateTime) return ''
+        return formatDateTime(dateTime, 'MM-DD HH:mm')
+      },
+      
+      // 璁㈤槄浠诲姟閫氱煡
+      subscribeMessage() {
+        subscribeManager.subscribeWithConfirm()
+          .then((result) => {
+            if (result.success) {
+              uni.showToast({
+                title: '璁㈤槄鎴愬姛锛屾偍灏嗘敹鍒颁换鍔¢�氱煡',
+                icon: 'success',
+                duration: 2000
+              })
+            }
+          })
+          .catch((error) => {
+            console.log('璁㈤槄澶辫触锛�', error)
+          })
       }
     }
   }
@@ -162,6 +239,24 @@
       font-size: 36rpx;
       font-weight: bold;
     }
+    
+    .subscribe-btn {
+      display: flex;
+      align-items: center;
+      padding: 10rpx 20rpx;
+      background-color: #f0f9ff;
+      border-radius: 30rpx;
+      
+      text {
+        margin-left: 8rpx;
+        font-size: 26rpx;
+        color: #007AFF;
+      }
+      
+      &:active {
+        opacity: 0.7;
+      }
+    }
   }
   
   .message-list-scroll {

--
Gitblit v1.9.1