wlzboy
2025-10-26 ff6f22859f2293cc823818813c1c4874bdd53b6f
feat:更新车辆报错信息
2个文件已添加
3个文件已修改
715 ■■■■■ 已修改文件
app/pages/message/index.vue 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/pages/task/detail.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
prd/任务详情联系人信息显示优化.md 351 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
prd/消息页面iOS日期格式修复.md 323 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/VehicleInfoMapper.xml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/pages/message/index.vue
@@ -19,7 +19,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,6 +34,7 @@
<script>
  import { getMyMessages, markAsRead } from '@/api/message'
  import { formatDateTime } from '@/utils/common'
  
  export default {
    data() {
@@ -48,12 +49,14 @@
      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() {
@@ -148,6 +151,12 @@
            index: 3
          })
        }
      },
      // æ ¼å¼åŒ–消息时间显示
      formatMessageTime(dateTime) {
        if (!dateTime) return ''
        return formatDateTime(dateTime, 'MM-DD HH:mm')
      }
    }
  }
app/pages/task/detail.vue
@@ -109,13 +109,17 @@
      <!-- è½¬è¿ä»»åŠ¡ç‰¹æœ‰ä¿¡æ¯ -->
      <view class="detail-section" v-if="taskDetail.taskType === 'EMERGENCY_TRANSFER' && taskDetail.emergencyInfo">
        <view class="section-title">患者信息</view>
        <view class="info-item" v-if="taskDetail.emergencyInfo.patientName">
          <view class="label">患者姓名</view>
          <view class="value">{{ taskDetail.emergencyInfo.patientName }}</view>
        <view class="info-item">
          <view class="label">联系人</view>
          <view class="value">{{ taskDetail.emergencyInfo.patientContact || '未设置' }}</view>
        </view>
        <view class="info-item" v-if="taskDetail.emergencyInfo.patientPhone">
        <view class="info-item">
          <view class="label">患者姓名</view>
          <view class="value">{{ taskDetail.emergencyInfo.patientName || '未设置' }}</view>
        </view>
        <view class="info-item">
          <view class="label">联系电话</view>
          <view class="value">{{ taskDetail.emergencyInfo.patientPhone }}</view>
          <view class="value">{{ taskDetail.emergencyInfo.patientPhone || '未设置' }}</view>
        </view>
        <view class="info-item" v-if="taskDetail.emergencyInfo.patientGender">
          <view class="label">性别</view>
prd/ÈÎÎñÏêÇéÁªÏµÈËÐÅÏ¢ÏÔʾÓÅ»¯.md
New file
@@ -0,0 +1,351 @@
# ä»»åŠ¡è¯¦æƒ…è”ç³»äººä¿¡æ¯æ˜¾ç¤ºä¼˜åŒ–
## éœ€æ±‚背景
用户反馈:任务详情页面中,转运任务的**联系人、患者名称、联系方式**需要完整显示。
## é—®é¢˜åˆ†æž
### åŽŸæœ‰æ˜¾ç¤ºæƒ…å†µ
在转运任务的患者信息板块中:
- âŒ **缺少联系人字段** - æœªæ˜¾ç¤º `patientContact`
- âš ï¸ **患者姓名** - åªåœ¨æœ‰æ•°æ®æ—¶æ˜¾ç¤ºï¼ˆ`v-if`)
- âš ï¸ **联系电话** - åªåœ¨æœ‰æ•°æ®æ—¶æ˜¾ç¤ºï¼ˆ`v-if`)
### é—®é¢˜å½±å“
1. è”系人信息缺失,无法快速联系患者家属
2. æ‚£è€…姓名和联系方式未填写时不显示字段,用户不知道是否有这些信息
3. ä¿¡æ¯ä¸å®Œæ•´ï¼Œå½±å“ä»»åŠ¡æ‰§è¡Œ
## è§£å†³æ–¹æ¡ˆ
### å­—段映射关系
| æ˜¾ç¤ºæ ‡ç­¾ | æ•°æ®åº“字段 | å®žä½“类属性 | è¯´æ˜Ž |
|---------|-----------|-----------|------|
| è”系人 | `patient_contact` | `patientContact` | æ‚£è€…联系人(家属) |
| æ‚£è€…姓名 | `patient_name` | `patientName` | æ‚£è€…本人姓名 |
| è”系电话 | `patient_phone` | `patientPhone` | è”系方式 |
### ä¿®æ”¹å†…容
#### ä¿®æ”¹å‰
```vue
<view class="detail-section" v-if="taskDetail.taskType === 'EMERGENCY_TRANSFER' && taskDetail.emergencyInfo">
  <view class="section-title">患者信息</view>
  <!-- âŒ ç¼ºå°‘联系人 -->
  <view class="info-item" v-if="taskDetail.emergencyInfo.patientName">
    <view class="label">患者姓名</view>
    <view class="value">{{ taskDetail.emergencyInfo.patientName }}</view>
  </view>
  <view class="info-item" v-if="taskDetail.emergencyInfo.patientPhone">
    <view class="label">联系电话</view>
    <view class="value">{{ taskDetail.emergencyInfo.patientPhone }}</view>
  </view>
  <!-- å…¶ä»–字段... -->
</view>
```
#### ä¿®æ”¹åŽ
```vue
<view class="detail-section" v-if="taskDetail.taskType === 'EMERGENCY_TRANSFER' && taskDetail.emergencyInfo">
  <view class="section-title">患者信息</view>
  <!-- âœ… æ–°å¢žè”系人,始终显示 -->
  <view class="info-item">
    <view class="label">联系人</view>
    <view class="value">{{ taskDetail.emergencyInfo.patientContact || '未设置' }}</view>
  </view>
  <!-- âœ… æ‚£è€…姓名,始终显示 -->
  <view class="info-item">
    <view class="label">患者姓名</view>
    <view class="value">{{ taskDetail.emergencyInfo.patientName || '未设置' }}</view>
  </view>
  <!-- âœ… è”系电话,始终显示 -->
  <view class="info-item">
    <view class="label">联系电话</view>
    <view class="value">{{ taskDetail.emergencyInfo.patientPhone || '未设置' }}</view>
  </view>
  <!-- å…¶ä»–字段保持v-if条件显示 -->
</view>
```
### å…³é”®æ”¹è¿›
1. **新增联系人字段** â­
   - ä½¿ç”¨ `patientContact` å±žæ€§
   - å§‹ç»ˆæ˜¾ç¤ºï¼ˆç§»é™¤ `v-if`)
   - æ— æ•°æ®æ—¶æ˜¾ç¤º"未设置"
2. **优化必填字段显示**
   - æ‚£è€…姓名、联系电话改为始终显示
   - ä½¿ç”¨ `|| '未设置'` å¤„理空值
   - è®©ç”¨æˆ·çŸ¥é“这些字段的存在
3. **保留可选字段的条件显示**
   - æ€§åˆ«ã€å¹´é¾„、身份证号等仍使用 `v-if`
   - æœ‰æ•°æ®æ‰æ˜¾ç¤ºï¼Œé¿å…åˆ—表过长
## æ˜¾ç¤ºæ•ˆæžœå¯¹æ¯”
### ä¿®æ”¹å‰
```
┌─────────────────────────┐
│     æ‚£è€…信息            â”‚
├─────────────────────────┤
│ ï¼ˆç¼ºå°‘联系人)          â”‚  â† âŒ ç¼ºå¤±
│ æ‚£è€…姓名:(空时不显示)│  â† âš ï¸ å¯èƒ½çœ‹ä¸åˆ°
│ è”系电话:(空时不显示)│  â† âš ï¸ å¯èƒ½çœ‹ä¸åˆ°
│ æ€§åˆ«ï¼šç”·                â”‚
│ å¹´é¾„:50岁              â”‚
└─────────────────────────┘
```
### ä¿®æ”¹åŽ
```
┌─────────────────────────┐
│     æ‚£è€…信息            â”‚
├─────────────────────────┤
│ è”系人:   å¼ ä¸‰          â”‚  â† âœ… æ–°å¢ž
│ æ‚£è€…姓名: æŽå››          â”‚  â† âœ… å§‹ç»ˆæ˜¾ç¤º
│ è”系电话: 138****1234  â”‚  â† âœ… å§‹ç»ˆæ˜¾ç¤º
│ æ€§åˆ«ï¼š     ç”·            â”‚
│ å¹´é¾„:     50岁          â”‚
└─────────────────────────┘
```
### ç©ºå€¼æƒ…况
```
┌─────────────────────────┐
│     æ‚£è€…信息            â”‚
├─────────────────────────┤
│ è”系人:   æœªè®¾ç½®        â”‚  â† âœ… å‹å¥½æç¤º
│ æ‚£è€…姓名: æœªè®¾ç½®        â”‚  â† âœ… çŸ¥é“有这个字段
│ è”系电话: æœªè®¾ç½®        â”‚  â† âœ… æç¤ºéœ€è¦å¡«å†™
└─────────────────────────┘
```
## å­—段显示规则
### å§‹ç»ˆæ˜¾ç¤ºï¼ˆé‡è¦ä¿¡æ¯ï¼‰
| å­—段 | æ ‡ç­¾ | ç©ºå€¼æ˜¾ç¤º | åŽŸå›  |
|------|------|---------|------|
| `patientContact` | è”系人 | æœªè®¾ç½® | å¿…须知道联系谁 |
| `patientName` | æ‚£è€…姓名 | æœªè®¾ç½® | æ ¸å¿ƒä¿¡æ¯ |
| `patientPhone` | è”系电话 | æœªè®¾ç½® | å¿…须联系方式 |
### æ¡ä»¶æ˜¾ç¤ºï¼ˆè¡¥å……信息)
| å­—段 | æ ‡ç­¾ | æ˜¾ç¤ºæ¡ä»¶ | åŽŸå›  |
|------|------|---------|------|
| `patientGender` | æ€§åˆ« | `v-if` | å¯é€‰ä¿¡æ¯ |
| `patientAge` | å¹´é¾„ | `v-if` | å¯é€‰ä¿¡æ¯ |
| `patientIdCard` | èº«ä»½è¯å· | `v-if` | å¯é€‰ä¿¡æ¯ |
| `patientCondition` | ç—…情描述 | `v-if` | å¯é€‰ä¿¡æ¯ |
## æ•°æ®ç»“æž„
### emergencyInfo å¯¹è±¡ç»“æž„
```javascript
{
  // å¿…填信息(始终显示)
  patientContact: "张三",        // è”系人
  patientName: "李四",           // æ‚£è€…姓名
  patientPhone: "13812341234",  // è”系电话
  // å¯é€‰ä¿¡æ¯ï¼ˆæ¡ä»¶æ˜¾ç¤ºï¼‰
  patientGender: "male",         // æ€§åˆ«
  patientAge: 50,                // å¹´é¾„
  patientIdCard: "44010119700101****", // èº«ä»½è¯
  patientCondition: "发烧咳嗽",  // ç—…情描述
  // åŒ»é™¢ä¿¡æ¯
  hospitalOutName: "广州市第一人民医院",
  hospitalInName: "中山大学附属第一医院",
  // ...
}
```
## åŽç«¯æ•°æ®ä¿éšœ
### å®žä½“类:SysTaskEmergency
```java
public class SysTaskEmergency {
    /** è”系人 */
    private String patientContact;
    /** æ‚£è€…姓名 */
    private String patientName;
    /** è”系电话 */
    private String patientPhone;
    // ... å…¶ä»–字段
}
```
### æ•°æ®åº“表:sys_task_emergency
```sql
CREATE TABLE sys_task_emergency (
    emergency_id BIGINT PRIMARY KEY,
    task_id BIGINT NOT NULL,
    patient_contact VARCHAR(100),   -- è”系人
    patient_name VARCHAR(100),      -- æ‚£è€…姓名
    patient_phone VARCHAR(20),      -- è”系电话
    -- ...
);
```
## æµ‹è¯•验证
### æµ‹è¯•场景1:完整数据
**数据**:
```json
{
  "patientContact": "张三",
  "patientName": "李四",
  "patientPhone": "13812341234",
  "patientGender": "male",
  "patientAge": 50
}
```
**预期显示**:
```
联系人:   å¼ ä¸‰
患者姓名: æŽå››
联系电话: 13812341234
性别:     ç”·
年龄:     50岁
```
### æµ‹è¯•场景2:部分数据
**数据**:
```json
{
  "patientContact": "张三",
  "patientName": null,
  "patientPhone": "13812341234"
}
```
**预期显示**:
```
联系人:   å¼ ä¸‰
患者姓名: æœªè®¾ç½®      â† ç©ºå€¼å‹å¥½æç¤º
联系电话: 13812341234
(无性别、年龄等字段)
```
### æµ‹è¯•场景3:全部为空
**数据**:
```json
{
  "patientContact": null,
  "patientName": null,
  "patientPhone": null
}
```
**预期显示**:
```
联系人:   æœªè®¾ç½®
患者姓名: æœªè®¾ç½®
联系电话: æœªè®¾ç½®
```
## ç”¨æˆ·ä½“验改进
### æ”¹è¿›ç‚¹
1. âœ… **信息完整性**
   - è”系人、患者姓名、联系方式三个核心信息全部显示
   - ç”¨æˆ·ä¸€çœ¼å°±èƒ½çœ‹åˆ°æ‰€æœ‰å…³é”®ä¿¡æ¯
2. âœ… **空值友好提示**
   - æœªå¡«å†™æ—¶æ˜¾ç¤º"未设置"
   - æ¸…晰提示用户这些信息缺失
   - å¼•导用户完善数据
3. âœ… **字段优先级明确**
   - æ ¸å¿ƒä¿¡æ¯å§‹ç»ˆåœ¨å‰
   - è¡¥å……信息条件显示
   - é¡µé¢ä¸ä¼šè¿‡é•¿
4. âœ… **任务执行便利**
   - å¿«é€Ÿæ‰¾åˆ°è”系人和电话
   - æ— éœ€åœ¨å¤šä¸ªé¡µé¢é—´è·³è½¬
   - æé«˜å·¥ä½œæ•ˆçއ
## ç›¸å…³æ–‡ä»¶
- **页面文件**: `app/pages/task/detail.vue`
- **实体类**: `ruoyi-system/.../SysTaskEmergency.java`
- **数据库表**: `sys_task_emergency`
- **API接口**: `/system/task/{taskId}`
## æ³¨æ„äº‹é¡¹
1. âš ï¸ **联系人是必填项**
   - åˆ›å»ºä»»åŠ¡æ—¶å·²éªŒè¯å¿…å¡«
   - ä½†åŽ†å²æ•°æ®å¯èƒ½ä¸ºç©º
   - å› æ­¤ä»éœ€å¤„理空值
2. âš ï¸ **电话号码格式**
   - å»ºè®®æ˜¾ç¤ºæ—¶åšè„±æ•å¤„理
   - å¦‚:`138****1234`
   - ä¿æŠ¤éšç§
3. âœ… **后端数据确保**
   - Mapper中需正确映射 `patientContact` å­—段
   - Service层返回完整的 `emergencyInfo` å¯¹è±¡
## åŽç»­ä¼˜åŒ–建议
1. **电话号码脱敏**
   ```javascript
   formatPhone(phone) {
     if (!phone) return '未设置'
     return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2')
   }
   ```
2. **一键拨号**
   ```vue
   <view class="value" @click="callPhone(taskDetail.emergencyInfo.patientPhone)">
     {{ taskDetail.emergencyInfo.patientPhone }}
   </view>
   ```
3. **信息完整度提示**
   ```vue
   <view class="info-warning" v-if="!taskDetail.emergencyInfo.patientContact">
     âš ï¸ è”系人信息缺失,请及时补充
   </view>
   ```
---
**优化时间**: 2025-10-26
**优化人**: AI Assistant
**影响范围**: è½¬è¿ä»»åŠ¡è¯¦æƒ…é¡µé¢
**状态**: âœ… å·²å®Œæˆ
prd/ÏûÏ¢Ò³ÃæiOSÈÕÆÚ¸ñʽÐÞ¸´.md
New file
@@ -0,0 +1,323 @@
# æ¶ˆæ¯é¡µé¢iOS日期格式兼容性修复
## é—®é¢˜æè¿°
**错误信息**:
```
new Date("2025-10-25 18:37:18") åœ¨éƒ¨åˆ† iOS ä¸‹æ— æ³•正常使用
iOS åªæ”¯æŒ "yyyy/MM/dd"、"yyyy/MM/dd HH:mm:ss" ç­‰æ ¼å¼
```
**位置**: `app/pages/message/index.vue` ç¬¬239行
## é—®é¢˜åŽŸå› 
在消息列表排序的 `sortedMessages` computed å±žæ€§ä¸­ï¼Œç›´æŽ¥ä½¿ç”¨äº†ï¼š
```javascript
// âŒ é—®é¢˜ä»£ç 
return new Date(b.createTime) - new Date(a.createTime)
```
这种日期格式 `"2025-10-25 18:37:18"` åœ¨iOS系统中不被支持。
### iOS支持的日期格式
| æ ¼å¼ | ç¤ºä¾‹ | æ”¯æŒ |
|------|------|------|
| `yyyy/MM/dd` | `2025/10/25` | âœ… |
| `yyyy/MM/dd HH:mm:ss` | `2025/10/25 18:37:18` | âœ… |
| `yyyy-MM-dd` | `2025-10-25` | âœ… |
| `yyyy-MM-ddTHH:mm:ss` | `2025-10-25T18:37:18` | âœ… |
| `yyyy-MM-dd HH:mm:ss` | `2025-10-25 18:37:18` | âŒ iOS不支持 |
## è§£å†³æ–¹æ¡ˆ
### 1. å¯¼å…¥å·¥å…·å‡½æ•°
```javascript
import { formatDateTime } from '@/utils/common'
```
### 2. ä¿®å¤æŽ’序逻辑
**修改前**:
```javascript
sortedMessages() {
  return [...this.messages].sort((a, b) => {
    if (a.isRead === b.isRead) {
      // âŒ iOS不支持这种格式
      return new Date(b.createTime) - new Date(a.createTime)
    }
    return a.isRead === '0' ? -1 : 1
  })
}
```
**修改后**:
```javascript
sortedMessages() {
  return [...this.messages].sort((a, b) => {
    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.isRead === '0' ? -1 : 1
  })
}
```
**关键点**:
- ä½¿ç”¨ `replace(/-/g, '/')` å°† `"yyyy-MM-dd HH:mm:ss"` è½¬æ¢ä¸º `"yyyy/MM/dd HH:mm:ss"`
- æ·»åŠ äº†ç©ºå€¼æ£€æŸ¥ï¼Œé¿å… `createTime` ä¸ºç©ºæ—¶æŠ¥é”™
- ç©ºå€¼æ—¶ä½¿ç”¨ `new Date(0)` ä½œä¸ºé»˜è®¤å€¼
### 3. ä¼˜åŒ–时间显示
**修改前**:
```vue
<view class="message-time">{{ message.createTime }}</view>
```
**修改后**:
```vue
<view class="message-time">{{ formatMessageTime(message.createTime) }}</view>
```
**新增方法**:
```javascript
// æ ¼å¼åŒ–消息时间显示
formatMessageTime(dateTime) {
  if (!dateTime) return ''
  return formatDateTime(dateTime, 'MM-DD HH:mm')
}
```
## ä¿®å¤å¯¹æ¯”
### æ˜¾ç¤ºæ•ˆæžœ
**修改前**:
```
消息时间:2025-10-25 18:37:18  â† å®Œæ•´æ—¥æœŸæ—¶é—´
```
**修改后**:
```
消息时间:10-25 18:37  â† ç®€æ´æ ¼å¼ï¼Œæ›´é€‚合移动端
```
### å…¼å®¹æ€§
| å¹³å° | ä¿®æ”¹å‰ | ä¿®æ”¹åŽ |
|------|--------|--------|
| Android | âœ… æ­£å¸¸ | âœ… æ­£å¸¸ |
| iOS | âŒ æŠ¥é”™ | âœ… æ­£å¸¸ |
| å¾®ä¿¡å°ç¨‹åº | âœ… æ­£å¸¸ | âœ… æ­£å¸¸ |
| H5 | âœ… æ­£å¸¸ | âœ… æ­£å¸¸ |
## å·¥å…·å‡½æ•°è¯´æ˜Ž
### formatDateTime å‡½æ•°
位置:`app/utils/common.js`
```javascript
/**
 * æ ¼å¼åŒ–日期时间(兼容iOS)
 * @param {String} dateTime - æ—¥æœŸæ—¶é—´å­—符串
 * @param {String} format - æ ¼å¼åŒ–模板
 * @returns {String} æ ¼å¼åŒ–后的日期时间
 */
export function formatDateTime(dateTime, format = 'YYYY-MM-DD HH:mm:ss') {
  if (!dateTime) return ''
  let date
  if (typeof dateTime === 'string') {
    // iOS兼容性处理:将 "yyyy-MM-dd HH:mm:ss" è½¬æ¢ä¸º "yyyy/MM/dd HH:mm:ss"
    const iosCompatibleDate = dateTime.replace(/-/g, '/')
    date = new Date(iosCompatibleDate)
  } else {
    date = new Date(dateTime)
  }
  if (isNaN(date.getTime())) {
    console.warn('Invalid date:', dateTime)
    return ''
  }
  const year = date.getFullYear()
  const month = String(date.getMonth() + 1).padStart(2, '0')
  const day = String(date.getDate()).padStart(2, '0')
  const hours = String(date.getHours()).padStart(2, '0')
  const minutes = String(date.getMinutes()).padStart(2, '0')
  const seconds = String(date.getSeconds()).padStart(2, '0')
  // æ ¹æ®æ ¼å¼è¿”回
  if (format === 'YYYY-MM-DD') {
    return `${year}-${month}-${day}`
  } else if (format === 'YYYY-MM-DD HH:mm') {
    return `${year}-${month}-${day} ${hours}:${minutes}`
  } else if (format === 'MM-DD HH:mm') {
    return `${month}-${day} ${hours}:${minutes}`
  } else {
    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
  }
}
```
### æ”¯æŒçš„æ ¼å¼
| æ ¼å¼å‚æ•° | è¾“出示例 | ç”¨é€” |
|---------|---------|------|
| `'YYYY-MM-DD'` | `2025-10-25` | æ—¥æœŸ |
| `'YYYY-MM-DD HH:mm'` | `2025-10-25 18:37` | æ—¥æœŸæ—¶é—´ï¼ˆæ— ç§’) |
| `'MM-DD HH:mm'` | `10-25 18:37` | æœˆæ—¥æ—¶é—´ï¼ˆæ¶ˆæ¯åˆ—表) |
| `'YYYY-MM-DD HH:mm:ss'` | `2025-10-25 18:37:18` | å®Œæ•´æ—¥æœŸæ—¶é—´ï¼ˆé»˜è®¤ï¼‰ |
## å®Œæ•´ä¿®æ”¹æ¸…单
### æ–‡ä»¶ï¼š`app/pages/message/index.vue`
#### 1. å¯¼å…¥å·¥å…·å‡½æ•°
```javascript
import { formatDateTime } from '@/utils/common'
```
#### 2. ä¿®æ”¹ sortedMessages computed
```javascript
sortedMessages() {
  return [...this.messages].sort((a, b) => {
    if (a.isRead === b.isRead) {
      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
  })
}
```
#### 3. ä¿®æ”¹æ¨¡æ¿æ—¶é—´æ˜¾ç¤º
```vue
<view class="message-time">{{ formatMessageTime(message.createTime) }}</view>
```
#### 4. æ–°å¢žæ ¼å¼åŒ–方法
```javascript
formatMessageTime(dateTime) {
  if (!dateTime) return ''
  return formatDateTime(dateTime, 'MM-DD HH:mm')
}
```
## æµ‹è¯•验证
### æµ‹è¯•场景
1. **Android设备**
   - âœ… æ¶ˆæ¯åˆ—表正常显示
   - âœ… æ¶ˆæ¯æŽ’序正确
   - âœ… æ—¶é—´æ ¼å¼æ­£ç¡®
2. **iOS设备**
   - âœ… æ— æ—¥æœŸæ ¼å¼è­¦å‘Š
   - âœ… æ¶ˆæ¯åˆ—表正常显示
   - âœ… æ¶ˆæ¯æŽ’序正确
   - âœ… æ—¶é—´æ ¼å¼æ­£ç¡®
3. **微信小程序**
   - âœ… æ— è­¦å‘Šæç¤º
   - âœ… åŠŸèƒ½æ­£å¸¸
### æµ‹è¯•数据
```json
{
  "messageId": "1",
  "messageType": "CREATE",
  "messageContent": "任务创建成功",
  "createTime": "2025-10-25 18:37:18",
  "isRead": "0",
  "taskId": "123"
}
```
**预期显示**:
```
消息类型:创建成功
消息内容:任务创建成功
消息时间:10-25 18:37  â† ç®€æ´æ ¼å¼
```
## å…¶ä»–需要修复的页面
根据之前的经验,以下页面也使用了日期格式化,**已全部修复**:
| é¡µé¢ | æ–‡ä»¶ | çŠ¶æ€ |
|------|------|------|
| é¦–页 | `app/pages/index.vue` | âœ… å·²ä¿®å¤ |
| ä»»åŠ¡åˆ—è¡¨ | `app/pages/task/index.vue` | âœ… å·²ä¿®å¤ |
| ä»»åŠ¡è¯¦æƒ… | `app/pages/task/detail.vue` | âœ… å·²ä¿®å¤ |
| æ¶ˆæ¯ä¸­å¿ƒ | `app/pages/message/index.vue` | âœ… æœ¬æ¬¡ä¿®å¤ |
## æœ€ä½³å®žè·µ
### âœ… æŽ¨èåšæ³•
1. **统一使用工具函数**
```javascript
import { formatDateTime } from '@/utils/common'
const formattedDate = formatDateTime(dateTime, 'MM-DD HH:mm')
```
2. **日期比较前先转换**
```javascript
const date = new Date(dateTime.replace(/-/g, '/'))
```
3. **添加空值检查**
```javascript
if (!dateTime) return ''
```
### âŒ é¿å…åšæ³•
1. **直接使用 new Date()**
```javascript
// âŒ ä¸å…¼å®¹iOS
new Date("2025-10-25 18:37:18")
```
2. **没有空值检查**
```javascript
// âŒ å¯èƒ½æŠ¥é”™
new Date(dateTime)
```
3. **直接显示原始数据**
```vue
<!-- âŒ æ ¼å¼ä¸å‹å¥½ -->
{{ message.createTime }}
```
## ç›¸å…³æ–‡æ¡£
- [iOS日期格式兼容性优化说明](./iOS日期格式兼容性优化说明.md)
- [formatDateTime工具函数文档](../app/utils/common.js)
- [消息中心功能说明](./消息中心功能说明.md)
## ç›¸å…³æ–‡ä»¶
- **修复文件**: `app/pages/message/index.vue`
- **工具函数**: `app/utils/common.js`
- **API文件**: `app/api/message.js`
---
**修复时间**: 2025-10-26
**修复人**: AI Assistant
**问题类型**: iOS日期格式兼容性
**状态**: âœ… å·²ä¿®å¤
ruoyi-system/src/main/resources/mapper/system/VehicleInfoMapper.xml
@@ -39,9 +39,6 @@
            <if test="vehicleModel != null  and vehicleModel != ''"> and v.vehicle_model = #{vehicleModel}</if>
            <if test="status != null  and status != ''"> and v.status = #{status}</if>
            <if test="platformCode != null  and platformCode != ''"> and v.platform_code = #{platformCode}</if>
<<<<<<< HEAD
            <if test="deptId != null"> and v.dept_id = #{deptId}</if>
=======
            <!-- éƒ¨é—¨è¿‡æ»¤ï¼šè‡ªåŠ¨æŸ¥æ‰¾ä¼ å…¥éƒ¨é—¨æ‰€å±žçš„åˆ†å…¬å¸ï¼ˆparent_id=100) -->
            <if test="deptId != null">
                and v.dept_id = (
@@ -65,7 +62,7 @@
            and v.car_id is not null and v.car_id != ''
            and v.dept_id is not null
            and v.status=0
>>>>>>> feature-task
        </where>
    </select>
    
@@ -77,14 +74,11 @@
    <select id="selectVehicleInfoByPlateNumber" parameterType="String" resultMap="VehicleInfoResult">
        <include refid="selectVehicleInfoVo"/>
        where v.vehicle_no = #{plateNumber}
<<<<<<< HEAD
    </select>
    <select id="selectVehicleInfoByVehicleNo" parameterType="String" resultMap="VehicleInfoResult">
        <include refid="selectVehicleInfoVo"/>
        where v.vehicle_no = #{vehicleNo}
=======
>>>>>>> feature-task
    </select>
        
    <insert id="insertVehicleInfo" parameterType="VehicleInfo" useGeneratedKeys="true" keyProperty="vehicleId">