| app/pages/message/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| app/pages/task/detail.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| prd/任务详情联系人信息显示优化.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| prd/消息页面iOS日期格式修复.md | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| ruoyi-system/src/main/resources/mapper/system/VehicleInfoMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | 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">