| New file |
| | |
| | | import request from '@/utils/request' |
| | | |
| | | // æ¥è¯¢å½åç¨æ·çæ¶æ¯å表 |
| | | export function getMyMessages() { |
| | | return request({ |
| | | url: '/system/message/my', |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | // æ¥è¯¢ç³»ç»æ¶æ¯å表 |
| | | export function listMessage(query) { |
| | | return request({ |
| | | url: '/system/message/list', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | | |
| | | // æ¥è¯¢ç³»ç»æ¶æ¯è¯¦ç» |
| | | export function getMessage(messageId) { |
| | | return request({ |
| | | url: '/system/message/' + messageId, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | // æ¥è¯¢æªè¯»æ¶æ¯æ°é |
| | | export function getUnreadCount() { |
| | | return request({ |
| | | url: '/system/message/unread/count', |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | | // æ°å¢ç³»ç»æ¶æ¯ |
| | | export function addMessage(data) { |
| | | return request({ |
| | | url: '/system/message', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // ä¿®æ¹ç³»ç»æ¶æ¯ |
| | | export function updateMessage(data) { |
| | | return request({ |
| | | url: '/system/message', |
| | | method: 'put', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // å é¤ç³»ç»æ¶æ¯ |
| | | export function delMessage(messageId) { |
| | | return request({ |
| | | url: '/system/message/' + messageId, |
| | | method: 'delete' |
| | | }) |
| | | } |
| | | |
| | | // æ è®°æ¶æ¯ä¸ºå·²è¯» |
| | | export function markAsRead(messageId) { |
| | | return request({ |
| | | url: '/system/message/read/' + messageId, |
| | | method: 'put' |
| | | }) |
| | | } |
| | | |
| | | // æ è®°æææ¶æ¯ä¸ºå·²è¯» |
| | | export function markAllAsRead() { |
| | | return request({ |
| | | url: '/system/message/read/all', |
| | | method: 'put' |
| | | }) |
| | | } |
| | |
| | | import { getMyTasks, changeTaskStatus } from '@/api/task' |
| | | import { getUserProfile } from '@/api/system/user' |
| | | import { getUserBoundVehicle } from '@/api/vehicle' |
| | | import { getUnreadCount } from '@/api/message' |
| | | |
| | | export default { |
| | | data() { |
| | |
| | | |
| | | // æ¶æ¯æ°æ® |
| | | messages: [], |
| | | unreadMessageCount: 0, |
| | | |
| | | // æ£å¨è¿è¡çä»»å¡å表 |
| | | taskList: [], |
| | |
| | | // å
å«å¾
å¤çãåºåä¸ãå·²å°è¾¾ãè¿ç¨ä¸çæææªå®æçç¶æ |
| | | return ['PENDING', 'DEPARTING', 'ARRIVED', 'RETURNING', 'IN_PROGRESS'].includes(task.taskStatus) |
| | | }); |
| | | }, |
| | | |
| | | // æªè¯»æ¶æ¯æ°é |
| | | unreadMessageCount() { |
| | | return this.messages.filter(message => !message.read).length; |
| | | } |
| | | }, |
| | | onLoad() { |
| | |
| | | this.loadUserVehicle() |
| | | // å è½½æ£å¨è¿è¡çä»»å¡ |
| | | this.loadRunningTasks() |
| | | // å è½½æªè¯»æ¶æ¯æ°é |
| | | this.loadUnreadMessageCount() |
| | | }, |
| | | onShow() { |
| | | // æ¯æ¬¡æ¾ç¤ºé¡µé¢æ¶å·æ°ä»»å¡å表åç»å®è½¦è¾ |
| | | // æ¯æ¬¡æ¾ç¤ºé¡µé¢æ¶å·æ°ä»»å¡å表ãç»å®è½¦è¾åæ¶æ¯æ°é |
| | | this.loadUserVehicle() |
| | | this.loadRunningTasks() |
| | | this.loadUnreadMessageCount() |
| | | }, |
| | | onPullDownRefresh() { |
| | | // 䏿巿° |
| | |
| | | }) |
| | | }, |
| | | |
| | | // å è½½æªè¯»æ¶æ¯æ°é |
| | | loadUnreadMessageCount() { |
| | | getUnreadCount().then(response => { |
| | | if (response.code === 200) { |
| | | this.unreadMessageCount = response.data || 0 |
| | | } |
| | | }).catch(error => { |
| | | console.error('è·åæªè¯»æ¶æ¯æ°é失败:', error) |
| | | }) |
| | | }, |
| | | |
| | | // å è½½ç¨æ·ä¿¡æ¯ï¼ä¿ç以å
¼å®¹ä¹åç代ç ï¼ |
| | | loadUserProfile() { |
| | | const userId = this.currentUser.userId |
| | |
| | | > |
| | | <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">{{ message.createTime }}</view> |
| | | </view> |
| | | </view> |
| | | |
| | |
| | | </template> |
| | | |
| | | <script> |
| | | import { getMyMessages, markAsRead } from '@/api/message' |
| | | |
| | | export default { |
| | | data() { |
| | | return { |
| | | // æ¶æ¯å表 |
| | | messages: [] |
| | | messages: [], |
| | | loading: false |
| | | } |
| | | }, |
| | | computed: { |
| | | // ææªè¯»/已读æåºï¼æªè¯»çå¨åé¢ |
| | | sortedMessages() { |
| | | return [...this.messages].sort((a, b) => { |
| | | if (a.read === b.read) { |
| | | if (a.isRead === b.isRead) { |
| | | // ç¸åç¶æææ¶é´ååº |
| | | return new Date(b.time) - new Date(a.time); |
| | | return new Date(b.createTime) - new Date(a.createTime); |
| | | } |
| | | // æªè¯»çæå¨åé¢ |
| | | return a.read ? 1 : -1; |
| | | return a.isRead === '0' ? -1 : 1; |
| | | }); |
| | | } |
| | | }, |
| | | onLoad() { |
| | | this.loadMessages() |
| | | }, |
| | | onShow() { |
| | | // æ¯æ¬¡æ¾ç¤ºé¡µé¢æ¶å·æ°æ¶æ¯ |
| | | this.loadMessages() |
| | | }, |
| | | 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.isRead === '0') { |
| | | await markAsRead(message.messageId) |
| | | message.isRead = '1' |
| | | } |
| | | |
| | | // 跳转å°ä»»å¡è¯¦æ
é¡µé¢ |
| | | if (message.taskId) { |
| | | this.$tab.navigateTo(`/pages/task/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}`) |
| | | } |
| | | } |
| | | } |
| | | } |
| New file |
| | |
| | | # äºä»¶é©±å¨æ¶æ¯æ¨éç³»ç» - å®ç°æ»ç» |
| | | |
| | | ## åè½æ¦è¿° |
| | | |
| | | éç¨Springäºä»¶é©±å¨æ¶æéææ¶æ¯æ¨éåè½,å®ç°ä¸å¡é»è¾ä¸æ¶æ¯æ¨éçå®å
¨è§£è¦,使å
¶ä»ç³»ç»å¯ä»¥è½»æ¾åå¸äºä»¶æ¥è§¦åæ¶æ¯æ¨éã |
| | | |
| | | ## æ¶æè®¾è®¡ |
| | | |
| | | ### è®¾è®¡æ¨¡å¼ |
| | | |
| | | éç¨**è§å¯è
模å¼**ï¼Observer Patternï¼çSpringäºä»¶æºå¶å®ç°ï¼ |
| | | |
| | | ``` |
| | | ä¸å¡ç³»ç» --åå¸--> äºä»¶ --çå¬--> æ¶æ¯çå¬å¨ --ä¿å--> æ¶æ¯åº |
| | | ``` |
| | | |
| | | ### æ ¸å¿ç»ä»¶ |
| | | |
| | | ```mermaid |
| | | graph LR |
| | | A[任塿å¡] -->|åå¸äºä»¶| B[ApplicationEventPublisher] |
| | | B --> C[TaskCreatedEvent] |
| | | B --> D[TaskAssignedEvent] |
| | | B --> E[TaskStatusChangedEvent] |
| | | C -->|çå¬| F[TaskMessageListener] |
| | | D -->|çå¬| F |
| | | E -->|çå¬| F |
| | | F -->|ä¿åæ¶æ¯| G[sys_message表] |
| | | ``` |
| | | |
| | | ## å®ç°å
容 |
| | | |
| | | ### 1. äºä»¶ç±»è®¾è®¡ |
| | | |
| | | #### 1.1 äºä»¶åºç±» |
| | | |
| | | **æä»¶**: `ruoyi-system/src/main/java/com/ruoyi/system/event/TaskEvent.java` |
| | | |
| | | ```java |
| | | public abstract class TaskEvent extends ApplicationEvent { |
| | | private Long taskId; // ä»»å¡ID |
| | | private String taskCode; // ä»»å¡ç¼å· |
| | | private Long operatorId; // æä½äººID |
| | | private String operatorName; // æä½äººå§å |
| | | } |
| | | ``` |
| | | |
| | | #### 1.2 ä»»å¡å建äºä»¶ |
| | | |
| | | **æä»¶**: `ruoyi-system/src/main/java/com/ruoyi/system/event/TaskCreatedEvent.java` |
| | | |
| | | ```java |
| | | public class TaskCreatedEvent extends TaskEvent { |
| | | private String taskType; // ä»»å¡ç±»å |
| | | private Long creatorId; // å建人ID |
| | | private String creatorName; // å建人å§å |
| | | } |
| | | ``` |
| | | |
| | | #### 1.3 ä»»å¡åé
äºä»¶ |
| | | |
| | | **æä»¶**: `ruoyi-system/src/main/java/com/ruoyi/system/event/TaskAssignedEvent.java` |
| | | |
| | | ```java |
| | | public class TaskAssignedEvent extends TaskEvent { |
| | | private List<Long> assigneeIds; // æ§è¡äººIDå表 |
| | | private List<String> assigneeNames; // æ§è¡äººå§åå表 |
| | | private Long assignerId; // åé
人ID |
| | | private String assignerName; // åé
人å§å |
| | | } |
| | | ``` |
| | | |
| | | #### 1.4 ä»»å¡ç¶æåæ´äºä»¶ |
| | | |
| | | **æä»¶**: `ruoyi-system/src/main/java/com/ruoyi/system/event/TaskStatusChangedEvent.java` |
| | | |
| | | ```java |
| | | public class TaskStatusChangedEvent extends TaskEvent { |
| | | private String oldStatus; // æ§ç¶æ |
| | | private String newStatus; // æ°ç¶æ |
| | | private String oldStatusDesc; // æ§ç¶ææè¿° |
| | | private String newStatusDesc; // æ°ç¶ææè¿° |
| | | private List<Long> assigneeIds; // æ§è¡äººIDå表 |
| | | private Long creatorId; // å建人ID |
| | | } |
| | | ``` |
| | | |
| | | ### 2. æ¶æ¯çå¬å¨ |
| | | |
| | | **æä»¶**: `ruoyi-system/src/main/java/com/ruoyi/system/listener/TaskMessageListener.java` |
| | | |
| | | #### 2.1 æ ¸å¿ç¹æ§ |
| | | |
| | | - â
**弿¥å¤ç**: ä½¿ç¨ `@Async` 注解,ä¸é»å¡ä¸»ä¸å¡ |
| | | - â
**äºä»¶çå¬**: ä½¿ç¨ `@EventListener` 注解çå¬äºä»¶ |
| | | - â
**èªå¨ä¿å**: çå¬å°äºä»¶åèªå¨ä¿åæ¶æ¯å°æ°æ®åº |
| | | - â
**容éå¤ç**: å¼å¸¸ä¸å½±å主ä¸å¡æµç¨ |
| | | |
| | | #### 2.2 çå¬å¨æ¹æ³ |
| | | |
| | | ```java |
| | | @Component |
| | | public class TaskMessageListener { |
| | | |
| | | // çå¬ä»»å¡å建äºä»¶ |
| | | @Async |
| | | @EventListener |
| | | public void handleTaskCreatedEvent(TaskCreatedEvent event) { |
| | | // ä¿åå建æåæ¶æ¯ |
| | | } |
| | | |
| | | // çå¬ä»»å¡åé
äºä»¶ |
| | | @Async |
| | | @EventListener |
| | | public void handleTaskAssignedEvent(TaskAssignedEvent event) { |
| | | // ç»æ¯ä¸ªæ§è¡äººåé任塿¨éæ¶æ¯ |
| | | } |
| | | |
| | | // çå¬ä»»å¡ç¶æåæ´äºä»¶ |
| | | @Async |
| | | @EventListener |
| | | public void handleTaskStatusChangedEvent(TaskStatusChangedEvent event) { |
| | | // ç»æ§è¡äººåå建人åéç¶æåæ´æ¶æ¯ |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 3. 弿¥é
ç½® |
| | | |
| | | **æä»¶**: `ruoyi-framework/src/main/java/com/ruoyi/framework/config/AsyncConfig.java` |
| | | |
| | | ```java |
| | | @Configuration |
| | | @EnableAsync |
| | | public class AsyncConfig { |
| | | |
| | | @Bean(name = "taskExecutor") |
| | | public Executor taskExecutor() { |
| | | ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); |
| | | executor.setCorePoolSize(5); // æ ¸å¿çº¿ç¨æ° |
| | | executor.setMaxPoolSize(10); // æå¤§çº¿ç¨æ° |
| | | executor.setQueueCapacity(100); // éå容é |
| | | executor.setThreadNamePrefix("async-task-"); |
| | | executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); |
| | | executor.initialize(); |
| | | return executor; |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 4. 任塿å¡éæ |
| | | |
| | | **æä»¶**: `ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java` |
| | | |
| | | #### 4.1 注å
¥äºä»¶åå¸å¨ |
| | | |
| | | ```java |
| | | @Autowired |
| | | private ApplicationEventPublisher eventPublisher; |
| | | ``` |
| | | |
| | | #### 4.2 åå¸äºä»¶ |
| | | |
| | | **åå»ºä»»å¡æ¶**: |
| | | ```java |
| | | // åå¸ä»»å¡å建äºä»¶ |
| | | eventPublisher.publishEvent(new TaskCreatedEvent( |
| | | this, taskId, taskCode, taskType, creatorId, creatorName |
| | | )); |
| | | |
| | | // åå¸ä»»å¡åé
äºä»¶ |
| | | eventPublisher.publishEvent(new TaskAssignedEvent( |
| | | this, taskId, taskCode, assigneeIds, assigneeNames, assignerId, assignerName |
| | | )); |
| | | ``` |
| | | |
| | | **åé
任塿¶**: |
| | | ```java |
| | | eventPublisher.publishEvent(new TaskAssignedEvent( |
| | | this, taskId, taskCode, assigneeIds, null, assignerId, assignerName |
| | | )); |
| | | ``` |
| | | |
| | | **ç¶æåæ´æ¶**: |
| | | ```java |
| | | eventPublisher.publishEvent(new TaskStatusChangedEvent( |
| | | this, taskId, taskCode, oldStatus, newStatus, |
| | | oldStatusDesc, newStatusDesc, assigneeIds, creatorId |
| | | )); |
| | | ``` |
| | | |
| | | ## æ¶æä¼å¿ |
| | | |
| | | ### 1. å®å
¨è§£è¦ |
| | | |
| | | | 对æ¯é¡¹ | ç´æ¥è°ç¨ | äºä»¶é©±å¨ | |
| | | |--------|---------|---------| |
| | | | è¦å度 | 强è¦å | å®å
¨è§£è¦ | |
| | | | ä¾èµå
³ç³» | éè¦æ³¨å
¥Service | åªéåå¸äºä»¶ | |
| | | | ä¿®æ¹å½±å | å½±åä¸å¡ä»£ç | ä¸å½±åä¸å¡ä»£ç | |
| | | | æ©å±æ§ | éä¿®æ¹ä¸å¡ä»£ç | åªéæ·»å çå¬å¨ | |
| | | |
| | | ### 2. 弿¥å¤ç |
| | | |
| | | ``` |
| | | 忥æ¹å¼ï¼ |
| | | ä¸å¡å¤ç â ä¿åæ¶æ¯ â è¿åç»æ |
| | | æ»èæ¶ = ä¸å¡èæ¶ + æ¶æ¯èæ¶ |
| | | |
| | | 弿¥æ¹å¼ï¼ |
| | | ä¸å¡å¤ç â è¿åç»æ |
| | | â |
| | | åå¸äºä»¶ â 弿¥ä¿åæ¶æ¯ï¼ä¸å½±å主æµç¨ï¼ |
| | | æ»èæ¶ â ä¸å¡èæ¶ |
| | | ``` |
| | | |
| | | ### 3. 髿©å±æ§ |
| | | |
| | | å
¶ä»ç³»ç»éè¦è§¦åæ¶æ¯æ¨éæ¶ï¼åªéï¼ |
| | | |
| | | ```java |
| | | // 1. åå¸äºä»¶ |
| | | eventPublisher.publishEvent(new TaskCreatedEvent(...)); |
| | | |
| | | // 2. æ éå
³å¿æ¶æ¯å¦ä½ä¿å |
| | | // 3. æ éä¿®æ¹ä»»ä½ç°æä»£ç |
| | | ``` |
| | | |
| | | ### 4. æç»´æ¤æ§ |
| | | |
| | | - **åä¸èè´£**: ä¸å¡æå¡åªè´è´£ä¸å¡é»è¾ï¼çå¬å¨åªè´è´£æ¶æ¯æ¨é |
| | | - **ç¬ç«æµè¯**: å¯ä»¥ç¬ç«æµè¯äºä»¶åå¸åçå¬ |
| | | - **æ¥å¿æ¸
æ°**: 弿¥çº¿ç¨æç¬ç«ç线ç¨åç§°åç¼ |
| | | |
| | | ## ä½¿ç¨æå |
| | | |
| | | ### å
¶ä»ç³»ç»å¦ä½ä½¿ç¨ |
| | | |
| | | #### åºæ¯1: 订åç³»ç»æ¨éæ¶æ¯ |
| | | |
| | | ```java |
| | | @Service |
| | | public class OrderServiceImpl { |
| | | |
| | | @Autowired |
| | | private ApplicationEventPublisher eventPublisher; |
| | | |
| | | public void createOrder(Order order) { |
| | | // 1. ä¸å¡é»è¾ |
| | | orderMapper.insert(order); |
| | | |
| | | // 2. åå¸äºä»¶ï¼æ¨éæ¶æ¯ï¼ |
| | | eventPublisher.publishEvent(new OrderCreatedEvent( |
| | | this, order.getOrderId(), order.getOrderNo(), order.getCreatorId() |
| | | )); |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | #### åºæ¯2: 审æ¹ç³»ç»æ¨éæ¶æ¯ |
| | | |
| | | ```java |
| | | @Service |
| | | public class ApprovalServiceImpl { |
| | | |
| | | @Autowired |
| | | private ApplicationEventPublisher eventPublisher; |
| | | |
| | | public void approveTask(Long taskId, String result) { |
| | | // 1. ä¸å¡é»è¾ |
| | | approvalMapper.updateStatus(taskId, result); |
| | | |
| | | // 2. åå¸äºä»¶ï¼æ¨éæ¶æ¯ï¼ |
| | | eventPublisher.publishEvent(new ApprovalCompletedEvent( |
| | | this, taskId, result, approverId, applicantId |
| | | )); |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### æ·»å æ°çäºä»¶ç±»å |
| | | |
| | | #### æ¥éª¤1: å建äºä»¶ç±» |
| | | |
| | | ```java |
| | | package com.ruoyi.system.event; |
| | | |
| | | public class OrderCreatedEvent extends ApplicationEvent { |
| | | private Long orderId; |
| | | private String orderNo; |
| | | private Long creatorId; |
| | | |
| | | public OrderCreatedEvent(Object source, Long orderId, String orderNo, Long creatorId) { |
| | | super(source); |
| | | this.orderId = orderId; |
| | | this.orderNo = orderNo; |
| | | this.creatorId = creatorId; |
| | | } |
| | | |
| | | // getters and setters |
| | | } |
| | | ``` |
| | | |
| | | #### æ¥éª¤2: æ·»å çå¬å¨æ¹æ³ |
| | | |
| | | ```java |
| | | @Component |
| | | public class OrderMessageListener { |
| | | |
| | | @Autowired |
| | | private SysMessageMapper sysMessageMapper; |
| | | |
| | | @Async |
| | | @EventListener |
| | | public void handleOrderCreatedEvent(OrderCreatedEvent event) { |
| | | // ä¿åæ¶æ¯ |
| | | SysMessage message = new SysMessage(); |
| | | message.setMessageType("ORDER_CREATE"); |
| | | message.setMessageTitle("订åå建æå"); |
| | | message.setMessageContent("æ¨ç订åå·²å建æå"); |
| | | // ... 设置å
¶ä»å段 |
| | | |
| | | sysMessageMapper.insertSysMessage(message); |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | #### æ¥éª¤3: åå¸äºä»¶ |
| | | |
| | | ```java |
| | | eventPublisher.publishEvent(new OrderCreatedEvent(this, orderId, orderNo, creatorId)); |
| | | ``` |
| | | |
| | | ## æ§è½ä¼å |
| | | |
| | | ### 1. çº¿ç¨æ± é
ç½®ä¼å |
| | | |
| | | æ ¹æ®å®é
è´è½½è°æ´çº¿ç¨æ± åæ°ï¼ |
| | | |
| | | ```java |
| | | // é«å¹¶ååºæ¯ |
| | | executor.setCorePoolSize(10); |
| | | executor.setMaxPoolSize(20); |
| | | executor.setQueueCapacity(200); |
| | | |
| | | // ä½å¹¶ååºæ¯ |
| | | executor.setCorePoolSize(3); |
| | | executor.setMaxPoolSize(5); |
| | | executor.setQueueCapacity(50); |
| | | ``` |
| | | |
| | | ### 2. æ¹éä¿åä¼å |
| | | |
| | | 妿忶æå¤§éæ¶æ¯ï¼å¯ä»¥æ¹éä¿åï¼ |
| | | |
| | | ```java |
| | | @Async |
| | | @EventListener |
| | | public void handleTaskAssignedEvent(TaskAssignedEvent event) { |
| | | List<SysMessage> messages = new ArrayList<>(); |
| | | |
| | | for (Long assigneeId : event.getAssigneeIds()) { |
| | | SysMessage message = new SysMessage(); |
| | | // ... è®¾ç½®åæ®µ |
| | | messages.add(message); |
| | | } |
| | | |
| | | // æ¹éæå
¥ |
| | | sysMessageMapper.batchInsert(messages); |
| | | } |
| | | ``` |
| | | |
| | | ### 3. æ¶æ¯å»é |
| | | |
| | | é¿å
éå¤åéæ¶æ¯ï¼ |
| | | |
| | | ```java |
| | | @Async |
| | | @EventListener |
| | | public void handleTaskStatusChangedEvent(TaskStatusChangedEvent event) { |
| | | // 使ç¨Setå»é |
| | | Set<Long> receiverIds = new HashSet<>(); |
| | | receiverIds.addAll(event.getAssigneeIds()); |
| | | receiverIds.add(event.getCreatorId()); |
| | | |
| | | for (Long receiverId : receiverIds) { |
| | | // ä¿åæ¶æ¯ |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ## çæ§ä¸è°è¯ |
| | | |
| | | ### 1. æ¥çäºä»¶æ¥å¿ |
| | | |
| | | ``` |
| | | 2025-10-25 14:30:15.123 [async-task-1] INFO TaskMessageListener - æ¶å°ä»»å¡å建äºä»¶ï¼ä»»å¡IDï¼1001ï¼ä»»å¡ç¼å·ï¼TASK-20251025-001 |
| | | 2025-10-25 14:30:15.234 [async-task-1] INFO TaskMessageListener - ä»»å¡åå»ºæ¶æ¯å·²ä¿åï¼æ¶æ¯IDï¼5001 |
| | | 2025-10-25 14:30:15.345 [async-task-2] INFO TaskMessageListener - æ¶å°ä»»å¡åé
äºä»¶ï¼ä»»å¡IDï¼1001ï¼æ§è¡äººæ°éï¼3 |
| | | 2025-10-25 14:30:15.456 [async-task-2] INFO TaskMessageListener - ä»»å¡åé
æ¶æ¯å·²ä¿åï¼æ¶æ¯IDï¼5002ï¼æ¥æ¶äººï¼å¼ ä¸ |
| | | ``` |
| | | |
| | | ### 2. çæ§çº¿ç¨æ± ç¶æ |
| | | |
| | | ```java |
| | | @Component |
| | | public class ThreadPoolMonitor { |
| | | |
| | | @Autowired |
| | | @Qualifier("taskExecutor") |
| | | private ThreadPoolTaskExecutor executor; |
| | | |
| | | @Scheduled(fixedDelay = 60000) // æ¯åé |
| | | public void monitor() { |
| | | log.info("çº¿ç¨æ± ç¶æ - æ´»è·çº¿ç¨ï¼{}ï¼éå大å°ï¼{}ï¼å®æä»»å¡ï¼{}", |
| | | executor.getActiveCount(), |
| | | executor.getThreadPoolExecutor().getQueue().size(), |
| | | executor.getThreadPoolExecutor().getCompletedTaskCount()); |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | ### 1. äºå¡è¾¹ç |
| | | |
| | | äºä»¶åå¸åºè¯¥å¨äºå¡æäº¤ä¹åï¼ |
| | | |
| | | ```java |
| | | @Transactional |
| | | public int insertSysTask(TaskCreateVO createVO) { |
| | | // 1. ä¿åä»»å¡ |
| | | int result = sysTaskMapper.insertSysTask(task); |
| | | |
| | | // 2. å¨äºå¡å
åå¸äºä»¶ï¼äºå¡æäº¤åæä¼è§¦åçå¬å¨ï¼ |
| | | if (result > 0) { |
| | | eventPublisher.publishEvent(new TaskCreatedEvent(...)); |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | ``` |
| | | |
| | | ### 2. å¼å¸¸å¤ç |
| | | |
| | | çå¬å¨ä¸çå¼å¸¸ä¸ä¼å½±å主ä¸å¡ï¼ |
| | | |
| | | ```java |
| | | @Async |
| | | @EventListener |
| | | public void handleTaskCreatedEvent(TaskCreatedEvent event) { |
| | | try { |
| | | // å¤çäºä»¶ |
| | | } catch (Exception e) { |
| | | log.error("å¤çä»»å¡å建äºä»¶å¤±è´¥", e); |
| | | // ä¸å䏿åºå¼å¸¸ |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 3. é¡ºåºæ§ |
| | | |
| | | 弿¥äºä»¶ä¸ä¿è¯æ§è¡é¡ºåºï¼ |
| | | |
| | | ```java |
| | | // è¿ä¸¤ä¸ªäºä»¶å¯è½ä»¥ä»»æé¡ºåºæ§è¡ |
| | | eventPublisher.publishEvent(event1); |
| | | eventPublisher.publishEvent(event2); |
| | | ``` |
| | | |
| | | å¦éä¿è¯é¡ºåºï¼ä½¿ç¨åæ¥çå¬å¨ï¼ |
| | | |
| | | ```java |
| | | @EventListener // ä¸ä½¿ç¨@Async |
| | | public void handleEvent(Event event) { |
| | | // 忥æ§è¡ï¼ä¿è¯é¡ºåº |
| | | } |
| | | ``` |
| | | |
| | | ## å¯¹æ¯æ»ç» |
| | | |
| | | | ç¹æ§ | ç´æ¥è°ç¨Service | äºä»¶é©±å¨ | |
| | | |------|---------------|---------| |
| | | | 代ç è¦å度 | é« | ä½ | |
| | | | æ§è½å½±å | 忥é»å¡ | 弿¥éé»å¡ | |
| | | | æ©å±æ§ | éä¿®æ¹ä»£ç | åªéæ·»å çå¬å¨ | |
| | | | 坿µè¯æ§ | 鿍¡æService | åªéåå¸äºä»¶ | |
| | | | å¯ç»´æ¤æ§ | ä¸å¡ä»£ç æ··æ | èè´£æ¸
æ°å离 | |
| | | | å¦ä¹ ææ¬ | ä½ | ä¸ | |
| | | | éç¨åºæ¯ | ç®åé¡¹ç® | 夿/大åé¡¹ç® | |
| | | |
| | | ## æ»ç» |
| | | |
| | | éè¿å¼å
¥Springäºä»¶é©±å¨æ¶æï¼æä»¬æåå®ç°äºï¼ |
| | | |
| | | 1. â
**ä¸å¡ä¸æ¶æ¯å®å
¨è§£è¦** - ä¸å¡ä»£ç åªéåå¸äºä»¶ |
| | | 2. â
**弿¥éé»å¡å¤ç** - ä¸å½±å主ä¸å¡æ§è½ |
| | | 3. â
**é«åº¦å¯æ©å±** - å
¶ä»ç³»ç»è½»æ¾éæ |
| | | 4. â
**èè´£æ¸
æ°** - çå¬å¨ä¸æ³¨æ¶æ¯æ¨é |
| | | 5. â
**æäºç»´æ¤** - ç¬ç«çäºä»¶åçå¬å¨ç®¡ç |
| | | |
| | | è¿ç§æ¶æç¹å«éå大å项ç®åéè¦é«æ©å±æ§çç³»ç»ï¼ |
| | | |
| | | --- |
| | | |
| | | **æ´æ°æ¶é´**: 2025-10-25 |
| | | **çæ¬**: v2.0 |
| | | **æ¶æ**: äºä»¶é©±å¨ |
| New file |
| | |
| | | # äºä»¶é©±å¨æ¶æ¯æ¨é - å¿«éå¼å§ |
| | | |
| | | ## æ ¸å¿æ¦å¿µ |
| | | |
| | | 使ç¨Springäºä»¶æºå¶å®ç°æ¶æ¯æ¨éï¼ä¸å¡ç³»ç»åªéåå¸äºä»¶ï¼æ¶æ¯çå¬å¨èªå¨ä¿åæ¶æ¯å°æ°æ®åºã |
| | | |
| | | ## å¿«éé¨ç½² |
| | | |
| | | ### 1. æ éé¢å¤é¨ç½² |
| | | |
| | | äºä»¶é©±å¨æ¶æå·²ç»éæå°ç°æç³»ç»ä¸ï¼éå¯å端æå¡å³å¯çæï¼ |
| | | |
| | | ```bash |
| | | # Windows |
| | | bin\run.bat |
| | | |
| | | # Linux |
| | | sh bin/run.sh |
| | | ``` |
| | | |
| | | ### 2. éªè¯é¨ç½² |
| | | |
| | | æ¥çå¯å¨æ¥å¿ï¼ç¡®è®¤ä»¥ä¸å
å®¹ï¼ |
| | | |
| | | ``` |
| | | ... AsyncConfig : Bean 'taskExecutor' created |
| | | ... TaskMessageListener : Bean created |
| | | ``` |
| | | |
| | | ## ä½¿ç¨æ¹å¼ |
| | | |
| | | ### æ¹å¼1: å¨ä»»å¡ç³»ç»ä¸ï¼å·²éæï¼ |
| | | |
| | | **ä»»å¡å建ãåé
ãç¶æåæ´æ¶èªå¨åå¸äºä»¶ï¼æ éé¢å¤ä»£ç ** |
| | | |
| | | ### æ¹å¼2: å¨å
¶ä»ç³»ç»ä¸ä½¿ç¨ |
| | | |
| | | #### æ¥éª¤1: 注å
¥äºä»¶åå¸å¨ |
| | | |
| | | ```java |
| | | @Service |
| | | public class YourService { |
| | | |
| | | @Autowired |
| | | private ApplicationEventPublisher eventPublisher; |
| | | |
| | | // ... |
| | | } |
| | | ``` |
| | | |
| | | #### æ¥éª¤2: åå¸äºä»¶ |
| | | |
| | | **示ä¾1: ä»»å¡åå»ºæ¶æ¨éæ¶æ¯** |
| | | |
| | | ```java |
| | | public void createTask(Task task) { |
| | | // 1. ä¸å¡é»è¾ |
| | | taskMapper.insert(task); |
| | | |
| | | // 2. åå¸äºä»¶ï¼è§¦åæ¶æ¯æ¨éï¼ |
| | | eventPublisher.publishEvent(new TaskCreatedEvent( |
| | | this, // source |
| | | task.getTaskId(), // ä»»å¡ID |
| | | task.getTaskCode(), // ä»»å¡ç¼å· |
| | | task.getTaskType(), // ä»»å¡ç±»å |
| | | task.getCreatorId(), // å建人ID |
| | | "å¼ ä¸" // å建人å§å |
| | | )); |
| | | } |
| | | ``` |
| | | |
| | | **示ä¾2: ä»»å¡åé
æ¶æ¨éæ¶æ¯** |
| | | |
| | | ```java |
| | | public void assignTask(Long taskId, List<Long> assigneeIds) { |
| | | // 1. ä¸å¡é»è¾ |
| | | taskMapper.updateAssignees(taskId, assigneeIds); |
| | | |
| | | // 2. åå¸äºä»¶ï¼è§¦åæ¶æ¯æ¨éï¼ |
| | | eventPublisher.publishEvent(new TaskAssignedEvent( |
| | | this, |
| | | taskId, |
| | | "TASK-001", |
| | | assigneeIds, // æ§è¡äººIDå表 |
| | | null, // å§åå表ï¼å¯éï¼çå¬å¨ä¼æ¥è¯¢ï¼ |
| | | currentUserId, // åé
人ID |
| | | "æå" // åé
人å§å |
| | | )); |
| | | } |
| | | ``` |
| | | |
| | | **示ä¾3: ç¶æåæ´æ¶æ¨éæ¶æ¯** |
| | | |
| | | ```java |
| | | public void changeStatus(Long taskId, String newStatus) { |
| | | Task task = taskMapper.selectById(taskId); |
| | | String oldStatus = task.getStatus(); |
| | | |
| | | // 1. ä¸å¡é»è¾ |
| | | taskMapper.updateStatus(taskId, newStatus); |
| | | |
| | | // 2. åå¸äºä»¶ï¼è§¦åæ¶æ¯æ¨éï¼ |
| | | eventPublisher.publishEvent(new TaskStatusChangedEvent( |
| | | this, |
| | | taskId, |
| | | task.getTaskCode(), |
| | | oldStatus, // æ§ç¶æ |
| | | newStatus, // æ°ç¶æ |
| | | "å¾
å¤ç", // æ§ç¶ææè¿° |
| | | "已宿", // æ°ç¶ææè¿° |
| | | task.getAssigneeIds(), // æ§è¡äººIDå表 |
| | | task.getCreatorId() // å建人ID |
| | | )); |
| | | } |
| | | ``` |
| | | |
| | | ## äºä»¶ç±»å |
| | | |
| | | | äºä»¶ç±» | ç¨é | æ¶æ¯ç±»å | |
| | | |--------|------|---------| |
| | | | TaskCreatedEvent | ä»»å¡å建 | CREATE | |
| | | | TaskAssignedEvent | ä»»å¡åé
| PUSH/ASSIGN | |
| | | | TaskStatusChangedEvent | ç¶æåæ´ | STATUS | |
| | | |
| | | ## æ©å±æ°äºä»¶ |
| | | |
| | | ### åºæ¯: 订åç³»ç»éè¦æ¨éæ¶æ¯ |
| | | |
| | | #### 1. å建订åäºä»¶ç±» |
| | | |
| | | ```java |
| | | package com.ruoyi.system.event; |
| | | |
| | | import org.springframework.context.ApplicationEvent; |
| | | |
| | | public class OrderCreatedEvent extends ApplicationEvent { |
| | | private Long orderId; |
| | | private String orderNo; |
| | | private Long customerId; |
| | | |
| | | public OrderCreatedEvent(Object source, Long orderId, String orderNo, Long customerId) { |
| | | super(source); |
| | | this.orderId = orderId; |
| | | this.orderNo = orderNo; |
| | | this.customerId = customerId; |
| | | } |
| | | |
| | | // getters... |
| | | } |
| | | ``` |
| | | |
| | | #### 2. å建çå¬å¨ï¼æå¨ç°æçå¬å¨ä¸æ·»å ï¼ |
| | | |
| | | ```java |
| | | @Component |
| | | public class OrderMessageListener { |
| | | |
| | | @Autowired |
| | | private SysMessageMapper sysMessageMapper; |
| | | |
| | | @Async |
| | | @EventListener |
| | | public void handleOrderCreatedEvent(OrderCreatedEvent event) { |
| | | SysMessage message = new SysMessage(); |
| | | message.setMessageType("ORDER_CREATE"); |
| | | message.setMessageTitle("订åå建æå"); |
| | | message.setMessageContent("æ¨ç订å" + event.getOrderNo() + "å·²å建"); |
| | | message.setReceiverId(event.getCustomerId()); |
| | | message.setIsRead("0"); |
| | | message.setCreateTime(DateUtils.getNowDate()); |
| | | message.setDelFlag("0"); |
| | | |
| | | sysMessageMapper.insertSysMessage(message); |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | #### 3. åå¸äºä»¶ |
| | | |
| | | ```java |
| | | @Service |
| | | public class OrderServiceImpl { |
| | | |
| | | @Autowired |
| | | private ApplicationEventPublisher eventPublisher; |
| | | |
| | | public void createOrder(Order order) { |
| | | orderMapper.insert(order); |
| | | |
| | | // åå¸äºä»¶ |
| | | eventPublisher.publishEvent(new OrderCreatedEvent( |
| | | this, order.getId(), order.getOrderNo(), order.getCustomerId() |
| | | )); |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ## æ ¸å¿ä¼å¿ |
| | | |
| | | ### 1. å®å
¨è§£è¦ |
| | | |
| | | ```java |
| | | // â æ§æ¹å¼ï¼éè¦æ³¨å
¥MessageService |
| | | @Autowired |
| | | private IMessageService messageService; |
| | | |
| | | public void createTask() { |
| | | // ... |
| | | messageService.pushMessage(...); // 强ä¾èµ |
| | | } |
| | | |
| | | // â
æ°æ¹å¼ï¼åªéåå¸äºä»¶ |
| | | @Autowired |
| | | private ApplicationEventPublisher eventPublisher; |
| | | |
| | | public void createTask() { |
| | | // ... |
| | | eventPublisher.publishEvent(event); // é¶ä¾èµ |
| | | } |
| | | ``` |
| | | |
| | | ### 2. 弿¥å¤ç |
| | | |
| | | ``` |
| | | ä¸å¡å¤ç 200ms â è¿åç»æ |
| | | âï¼ä¸é»å¡ï¼ |
| | | åå¸äºä»¶ â 弿¥ä¿åæ¶æ¯ 50ms |
| | | |
| | | æ»èæ¶ï¼200msï¼èé250msï¼ |
| | | ``` |
| | | |
| | | ### 3. è½»æ¾æ©å± |
| | | |
| | | æ·»å æ°çæ¶æ¯æ¨éåºæ¯ï¼åªéï¼ |
| | | 1. åå¸äºä»¶ â
|
| | | 2. æ éä¿®æ¹ä¸å¡ä»£ç â
|
| | | 3. æ ééæ°é¨ç½² â
|
| | | |
| | | ## çæ§åè°è¯ |
| | | |
| | | ### æ¥çäºä»¶æ¥å¿ |
| | | |
| | | ```bash |
| | | # æç´¢äºä»¶å叿¥å¿ |
| | | grep "publishEvent" logs/ruoyi-admin.log |
| | | |
| | | # æç´¢äºä»¶ç嬿¥å¿ |
| | | grep "TaskMessageListener" logs/ruoyi-admin.log |
| | | ``` |
| | | |
| | | ### æ¥å¿ç¤ºä¾ |
| | | |
| | | ``` |
| | | 2025-10-25 14:30:15 [main] INFO åå¸ä»»å¡å建äºä»¶ï¼ä»»å¡IDï¼1001 |
| | | 2025-10-25 14:30:15 [async-task-1] INFO æ¶å°ä»»å¡å建äºä»¶ï¼ä»»å¡IDï¼1001 |
| | | 2025-10-25 14:30:15 [async-task-1] INFO ä»»å¡åå»ºæ¶æ¯å·²ä¿åï¼æ¶æ¯IDï¼5001 |
| | | ``` |
| | | |
| | | ## 常è§é®é¢ |
| | | |
| | | ### Q1: äºä»¶åå¸åæ¶æ¯æ²¡æä¿åï¼ |
| | | |
| | | **åå **: å¯è½æ¯å¼æ¥çº¿ç¨æ± æ»¡äº |
| | | |
| | | **è§£å³**: |
| | | 1. æ¥çæ¥å¿æ¯å¦æå¼å¸¸ |
| | | 2. è°æ´çº¿ç¨æ± é
ç½®ï¼AsyncConfig.javaï¼ |
| | | 3. æ£æ¥æ°æ®åºè¿æ¥ |
| | | |
| | | ### Q2: å¦ä½ç¡®ä¿æ¶æ¯ä¸å®åéï¼ |
| | | |
| | | **æ¹æ¡1**: 使ç¨åæ¥çå¬å¨ï¼å»æ@Asyncï¼ |
| | | |
| | | ```java |
| | | @EventListener // ä¸ä½¿ç¨@Async |
| | | public void handleEvent(Event event) { |
| | | // 忥æ§è¡ï¼ç¡®ä¿æ¶æ¯ä¿å |
| | | } |
| | | ``` |
| | | |
| | | **æ¹æ¡2**: æ·»å éè¯æºå¶ |
| | | |
| | | ```java |
| | | @Async |
| | | @EventListener |
| | | @Retryable(maxAttempts = 3) |
| | | public void handleEvent(Event event) { |
| | | // 失败èªå¨éè¯3次 |
| | | } |
| | | ``` |
| | | |
| | | ### Q3: å¦ä½ç¦ç¨å¼æ¥å¤çï¼ |
| | | |
| | | ä¿®æ¹çå¬å¨ï¼å»æ `@Async` æ³¨è§£ï¼ |
| | | |
| | | ```java |
| | | // @Async // æ³¨éæ |
| | | @EventListener |
| | | public void handleEvent(Event event) { |
| | | // ç°å¨æ¯åæ¥æ§è¡ |
| | | } |
| | | ``` |
| | | |
| | | ## æ§è½ä¼å |
| | | |
| | | ### æ¹éå¤çæ¶æ¯ |
| | | |
| | | ```java |
| | | // æ¶éæ¶æ¯ï¼æ¹éä¿å |
| | | List<SysMessage> messages = new ArrayList<>(); |
| | | for (Long userId : userIds) { |
| | | SysMessage msg = new SysMessage(); |
| | | // ... |
| | | messages.add(msg); |
| | | } |
| | | sysMessageMapper.batchInsert(messages); // æ¹éæå
¥ |
| | | ``` |
| | | |
| | | ### è°æ´çº¿ç¨æ± |
| | | |
| | | æ ¹æ®å®é
è´è½½è°æ´ `AsyncConfig.java`: |
| | | |
| | | ```java |
| | | // é«å¹¶ååºæ¯ |
| | | executor.setCorePoolSize(10); |
| | | executor.setMaxPoolSize(20); |
| | | |
| | | // ä½å¹¶ååºæ¯ |
| | | executor.setCorePoolSize(3); |
| | | executor.setMaxPoolSize(5); |
| | | ``` |
| | | |
| | | ## å¯¹æ¯æ¹å¼ |
| | | |
| | | | ç¹æ§ | ç´æ¥è°ç¨ | äºä»¶é©±å¨ | |
| | | |------|---------|---------| |
| | | | 代ç è¦å | 强ä¾èµMessageService | é¶ä¾èµ | |
| | | | æ§è½ | 忥é»å¡ | 弿¥éé»å¡ | |
| | | | æ©å±æ§ | éä¿®æ¹ä»£ç | åªéæ·»å çå¬å¨ | |
| | | | æµè¯ | 鿍¡æService | åªéåå¸äºä»¶ | |
| | | |
| | | ## æä»¶æ¸
å |
| | | |
| | | ### æ°å¢æä»¶ |
| | | - `TaskEvent.java` - äºä»¶åºç±» |
| | | - `TaskCreatedEvent.java` - å建äºä»¶ |
| | | - `TaskAssignedEvent.java` - åé
äºä»¶ |
| | | - `TaskStatusChangedEvent.java` - ç¶æäºä»¶ |
| | | - `TaskMessageListener.java` - æ¶æ¯çå¬å¨ |
| | | - `AsyncConfig.java` - 弿¥é
ç½® |
| | | |
| | | ### ä¿®æ¹æä»¶ |
| | | - `SysTaskServiceImpl.java` - æ¹ä¸ºåå¸äºä»¶ |
| | | |
| | | ## ä¸ä¸æ¥ |
| | | |
| | | 1. ð é
è¯»è¯¦ç»ææ¡£ï¼`prd/äºä»¶é©±å¨æ¶æ¯æ¨é-å®ç°æ»ç».md` |
| | | 2. ð§ æ ¹æ®éè¦è°æ´çº¿ç¨æ± é
ç½® |
| | | 3. ð çæ§ç³»ç»è¿è¡æ¥å¿ |
| | | 4. ð å¨å
¶ä»ç³»ç»ä¸ä½¿ç¨äºä»¶æºå¶ |
| | | |
| | | --- |
| | | |
| | | **æ´æ°æ¶é´**: 2025-10-25 |
| | | **çæ¬**: v2.0 |
| | | **æ¨è使ç¨**: éåææéè¦æ¶æ¯æ¨éçåºæ¯ |
| New file |
| | |
| | | # ç³»ç»æ¶æ¯æ¨éåè½ - å¿«éå¼å§ |
| | | |
| | | ## åè½è¯´æ |
| | | |
| | | å®ç°äºå¨ä»»å¡å建ãç¶æåæ´ãåé
ç¨æ·æ¶èªå¨æ¨éæ¶æ¯ç»ç¸å
³äººåçåè½ã |
| | | |
| | | ## å¿«éé¨ç½² |
| | | |
| | | ### 1. æ§è¡æ°æ®åºèæ¬ |
| | | |
| | | ```bash |
| | | # è¿å
¥é¡¹ç®sqlç®å½ |
| | | cd d:\project\æ¥æè½¬è¿\code\Api\RuoYi-Vue-master\sql |
| | | |
| | | # æ§è¡æ¶æ¯è¡¨åå»ºèæ¬ |
| | | mysql -u root -p your_database < sys_message.sql |
| | | ``` |
| | | |
| | | æè
æå¨æ§è¡SQLï¼ |
| | | ```sql |
| | | -- å¨MySQL客æ·ç«¯ä¸æ§è¡ |
| | | source d:/project/æ¥æè½¬è¿/code/Api/RuoYi-Vue-master/sql/sys_message.sql; |
| | | ``` |
| | | |
| | | ### 2. éå¯å端æå¡ |
| | | |
| | | ```bash |
| | | # Windows |
| | | cd d:\project\æ¥æè½¬è¿\code\Api\RuoYi-Vue-master |
| | | bin\run.bat |
| | | |
| | | # Linux |
| | | cd /path/to/RuoYi-Vue-master |
| | | sh bin/run.sh |
| | | ``` |
| | | |
| | | ### 3. å端已èªå¨éæï¼æ éé¢å¤æä½ |
| | | |
| | | ## å¿«éæµè¯ |
| | | |
| | | ### æµè¯1ï¼åå»ºä»»å¡æ¶æ¯æ¨é |
| | | |
| | | 1. å¨å端å建ä¸ä¸ªä»»å¡ |
| | | 2. è¿å
¥"æ¶æ¯ä¸å¿"é¡µé¢ |
| | | 3. åºè¯¥çå°ä¸æ¡"å建æå"æ¶æ¯ |
| | | |
| | | ### æµè¯2ï¼ä»»å¡åé
æ¶æ¯æ¨é |
| | | |
| | | 1. åå»ºä»»å¡æ¶éæ©æ§è¡äººå |
| | | 2. æ§è¡äººåç»å½ç³»ç» |
| | | 3. è¿å
¥"æ¶æ¯ä¸å¿"é¡µé¢ |
| | | 4. åºè¯¥çå°ä¸æ¡"任塿¨é"æ¶æ¯ |
| | | |
| | | ### æµè¯3ï¼ç¶æåæ´æ¶æ¯æ¨é |
| | | |
| | | 1. å¨é¦é¡µç¹å»ä»»å¡ç"åºå"æé® |
| | | 2. ç¸å
³äººåï¼æ§è¡äºº+å建人ï¼è¿å
¥"æ¶æ¯ä¸å¿" |
| | | 3. åºè¯¥çå°ä¸æ¡"ç¶æåæ´"æ¶æ¯ |
| | | |
| | | ## æ¶æ¯ç±»å |
| | | |
| | | | ç±»å | åºæ¯ | æ¥æ¶äºº | å
容 | |
| | | |------|------|--------|------| |
| | | | å建æå | åå»ºä»»å¡ | å建人 | æ¨å建çä»»å¡å·²æåæäº¤ | |
| | | | 任塿¨é | åé
æ§è¡äºº | æ§è¡äºº | æ¨ææ°çä»»å¡ï¼è¯·åæ¶å¤ç | |
| | | | ç¶æåæ´ | æ´æ°ç¶æ | æ§è¡äºº+å建人 | ä»»å¡ç¶æåæ´ä¸ºï¼XXX | |
| | | |
| | | ## æ ¸å¿æä»¶ |
| | | |
| | | ### å端 |
| | | - `sql/sys_message.sql` - æ°æ®åºè¡¨ |
| | | - `SysMessage.java` - å®ä½ç±» |
| | | - `SysMessageMapper.java` - Mapperæ¥å£ |
| | | - `SysMessageMapper.xml` - MyBatisæ å° |
| | | - `ISysMessageService.java` - Serviceæ¥å£ |
| | | - `SysMessageServiceImpl.java` - Serviceå®ç° |
| | | - `SysMessageController.java` - Controller |
| | | - `SysTaskServiceImpl.java` - 任塿å¡ï¼å·²éææ¶æ¯æ¨éï¼ |
| | | |
| | | ### å端 |
| | | - `app/api/message.js` - APIæ¥å£ |
| | | - `app/pages/message/index.vue` - æ¶æ¯ä¸å¿é¡µé¢ |
| | | - `app/pages/index.vue` - é¦é¡µï¼æ¾ç¤ºæªè¯»æ°éï¼ |
| | | |
| | | ## 主è¦API |
| | | |
| | | ### å端æ¥å£ |
| | | |
| | | ``` |
| | | GET /system/message/my - è·åå½åç¨æ·æ¶æ¯å表 |
| | | GET /system/message/unread/count - è·åæªè¯»æ¶æ¯æ°é |
| | | PUT /system/message/read/{id} - æ è®°æ¶æ¯ä¸ºå·²è¯» |
| | | PUT /system/message/read/all - æ è®°æææ¶æ¯ä¸ºå·²è¯» |
| | | ``` |
| | | |
| | | ### å端è°ç¨ç¤ºä¾ |
| | | |
| | | ```javascript |
| | | import { getMyMessages, getUnreadCount, markAsRead } from '@/api/message' |
| | | |
| | | // è·åæ¶æ¯å表 |
| | | const messages = await getMyMessages() |
| | | |
| | | // è·åæªè¯»æ°é |
| | | const count = await getUnreadCount() |
| | | |
| | | // æ 记已读 |
| | | await markAsRead(messageId) |
| | | ``` |
| | | |
| | | ## æ¶æ¯æ¨éæ¶æº |
| | | |
| | | ### 1. å建任å¡ï¼insertSysTaskï¼ |
| | | ```java |
| | | // æ¨éå建æåæ¶æ¯ï¼ç»åå»ºäººï¼ |
| | | if (result > 0 && sysMessageService != null) { |
| | | sysMessageService.pushTaskCreateMessage(task); |
| | | } |
| | | |
| | | // æ¨éä»»å¡åé
æ¶æ¯ï¼ç»æ§è¡äººï¼ |
| | | if (result > 0 && createVO.getAssignees() != null && !createVO.getAssignees().isEmpty()) { |
| | | List<Long> assigneeIds = createVO.getAssignees().stream() |
| | | .map(assignee -> assignee.getUserId()) |
| | | .collect(Collectors.toList()); |
| | | sysMessageService.pushTaskAssignMessage(task, assigneeIds); |
| | | } |
| | | ``` |
| | | |
| | | ### 2. åé
ä»»å¡ï¼assignTaskï¼ |
| | | ```java |
| | | // æ¨éä»»å¡åé
æ¶æ¯ |
| | | if (result > 0 && sysMessageService != null) { |
| | | List<Long> assigneeIds = new ArrayList<>(); |
| | | assigneeIds.add(assigneeId); |
| | | sysMessageService.pushTaskAssignMessage(task, assigneeIds); |
| | | } |
| | | ``` |
| | | |
| | | ### 3. ç¶æåæ´ï¼changeTaskStatusWithLocationï¼ |
| | | ```java |
| | | // æ¨éä»»å¡ç¶æåæ´æ¶æ¯ |
| | | if (result > 0 && sysMessageService != null) { |
| | | sysMessageService.pushTaskStatusChangeMessage( |
| | | oldTask, |
| | | oldTaskStatus.getCode(), |
| | | newStatus.getCode() |
| | | ); |
| | | } |
| | | ``` |
| | | |
| | | ## 常è§é®é¢ |
| | | |
| | | ### Q1: æ¶æ¯æ²¡ææ¨éæä¹åï¼ |
| | | A: æ£æ¥ä»¥ä¸å ç¹ï¼ |
| | | 1. æ°æ®åºè¡¨æ¯å¦å建æå |
| | | 2. å端æå¡æ¯å¦éå¯ |
| | | 3. æ¥çå端æ¥å¿æ¯å¦æå¼å¸¸ |
| | | 4. 确认 `ISysMessageService` æ¯å¦æ³¨å
¥æå |
| | | |
| | | ### Q2: æ¶æ¯æ¨é失败ä¼å½±å主ä¸å¡åï¼ |
| | | A: ä¸ä¼ãæ¶æ¯æ¨éä½¿ç¨ `@Autowired(required = false)`ï¼ä¸ææå¼å¸¸é½è¢«æè·ï¼ä¸ä¼å½±åä»»å¡çå建ãåé
åç¶æåæ´ã |
| | | |
| | | ### Q3: å¦ä½æ¥çæ¶æ¯æ¨éæ¥å¿ï¼ |
| | | A: æ¥çå端æ¥å¿ï¼æç´¢å
³é®åï¼ |
| | | - "æ¨éä»»å¡å建æåæ¶æ¯" |
| | | - "æ¨éä»»å¡åé
æ¶æ¯" |
| | | - "æ¨éä»»å¡ç¶æåæ´æ¶æ¯" |
| | | |
| | | ### Q4: æªè¯»æ¶æ¯æ°é䏿´æ°æä¹åï¼ |
| | | A: |
| | | 1. 确认 `app/pages/index.vue` å·²æ´æ° |
| | | 2. 确认 `app/api/message.js` å·²å建 |
| | | 3. éæ°ç¼è¯å端ï¼`npm run build:h5` |
| | | |
| | | ## æ©å±å»ºè®® |
| | | |
| | | 1. **WebSocket宿¶æ¨é**ï¼éæWebSocketå®ç°æ¶æ¯å®æ¶æ¨é |
| | | 2. **æ¨ééç¥**ï¼éææå
æ¨éçç¬¬ä¸æ¹æ¨éæå¡ |
| | | 3. **æ¶æ¯æ¨¡æ¿**ï¼é
ç½®æ¶æ¯æ¨¡æ¿ï¼æ¯æåéæ¿æ¢ |
| | | 4. **æ¶æ¯åç»**ï¼å¢å æ¶æ¯åç»ï¼ç³»ç»éç¥ã任塿éçï¼ |
| | | |
| | | ## è¯¦ç»ææ¡£ |
| | | |
| | | 请æ¥ç宿´ææ¡£ï¼`prd/ç³»ç»æ¶æ¯æ¨éåè½å®ç°æ»ç».md` |
| | | |
| | | --- |
| | | |
| | | **æ´æ°æ¶é´**: 2025-10-25 |
| | | **çæ¬**: v1.0 |
| New file |
| | |
| | | # ç³»ç»æ¶æ¯æ¨éåè½ - æä»¶åæ´æ¸
å |
| | | |
| | | ## æ°å¢æä»¶ |
| | | |
| | | ### æ°æ®åºèæ¬ |
| | | - â
`sql/sys_message.sql` - æ¶æ¯è¡¨åå»ºèæ¬ |
| | | |
| | | ### å端 - å®ä½ç±» |
| | | - â
`ruoyi-system/src/main/java/com/ruoyi/system/domain/SysMessage.java` - æ¶æ¯å®ä½ç±» |
| | | |
| | | ### å端 - Mapperå± |
| | | - â
`ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMessageMapper.java` - Mapperæ¥å£ |
| | | - â
`ruoyi-system/src/main/resources/mapper/system/SysMessageMapper.xml` - MyBatisæ å°æä»¶ |
| | | |
| | | ### å端 - Serviceå± |
| | | - â
`ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMessageService.java` - Serviceæ¥å£ |
| | | - â
`ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMessageServiceImpl.java` - Serviceå®ç°ç±» |
| | | |
| | | ### å端 - Controllerå± |
| | | - â
`ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMessageController.java` - æ¶æ¯Controller |
| | | |
| | | ### å端 - API |
| | | - â
`app/api/message.js` - æ¶æ¯APIæ¥å£ |
| | | |
| | | ### ææ¡£ |
| | | - â
`prd/ç³»ç»æ¶æ¯æ¨éåè½å®ç°æ»ç».md` - 宿´å®ç°ææ¡£ |
| | | - â
`prd/ç³»ç»æ¶æ¯æ¨é-å¿«éå¼å§.md` - å¿«éå¼å§æå |
| | | - â
`prd/ç³»ç»æ¶æ¯æ¨é-æä»¶åæ´æ¸
å.md` - æ¬æä»¶ |
| | | |
| | | ## ä¿®æ¹æä»¶ |
| | | |
| | | ### å端 |
| | | - â
`ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java` |
| | | - 导å
¥ `ISysMessageService` |
| | | - 注å
¥ `ISysMessageService` æå¡ï¼required = falseï¼ |
| | | - å¨ `insertSysTask` æ¹æ³ä¸æ·»å å建æåæ¶æ¯æ¨é |
| | | - å¨ `insertSysTask` æ¹æ³ä¸æ·»å ä»»å¡åé
æ¶æ¯æ¨é |
| | | - å¨ `assignTask` æ¹æ³ä¸æ·»å ä»»å¡åé
æ¶æ¯æ¨é |
| | | - å¨ `changeTaskStatusWithLocation` æ¹æ³ä¸æ·»å ç¶æåæ´æ¶æ¯æ¨é |
| | | |
| | | ### å端 |
| | | - â
`app/pages/message/index.vue` |
| | | - 导å
¥ `message.js` API |
| | | - å®ç° `loadMessages` æ¹æ³å è½½æ¶æ¯å表 |
| | | - å®ç° `loadUnreadMessageCount` æ¹æ³å è½½æªè¯»æ°é |
| | | - ä¿®æ¹ `viewMessageDetail` æ¹æ³è°ç¨APIæ 记已读 |
| | | - æ·»å `onLoad` çå½å¨æå è½½æ°æ® |
| | | - æ·»å `onShow` çå½å¨æå·æ°æ°æ® |
| | | - æ·»å `onPullDownRefresh` æ¯æä¸æå·æ° |
| | | - ä¿®æ¹æ¶æ¯å段æ å°ï¼typeâmessageType, contentâmessageContentçï¼ |
| | | |
| | | - â
`app/pages/index.vue` |
| | | - 导å
¥ `message.js` APIä¸ç `getUnreadCount` |
| | | - æ·»å `unreadMessageCount` æ°æ®å段 |
| | | - æ·»å `loadUnreadMessageCount` æ¹æ³ |
| | | - å¨ `onLoad` ä¸è°ç¨ `loadUnreadMessageCount` |
| | | - å¨ `onShow` ä¸è°ç¨ `loadUnreadMessageCount` |
| | | - å é¤è®¡ç®å±æ§ä¸ç `unreadMessageCount`ï¼æ¹ä¸ºdataåæ®µï¼ |
| | | |
| | | ## åæ´ç»è®¡ |
| | | |
| | | ### æ°å¢æä»¶æ°é |
| | | - æ°æ®åºèæ¬: 1 |
| | | - Javaæä»¶: 6 |
| | | - JavaScriptæä»¶: 1 |
| | | - Vueæä»¶: 0ï¼å·²åå¨ï¼ä»
ä¿®æ¹ï¼ |
| | | - ææ¡£æä»¶: 3 |
| | | - **æ»è®¡**: 11个æ°å¢æä»¶ |
| | | |
| | | ### ä¿®æ¹æä»¶æ°é |
| | | - Javaæä»¶: 1 |
| | | - Vueæä»¶: 2 |
| | | - **æ»è®¡**: 3ä¸ªä¿®æ¹æä»¶ |
| | | |
| | | ### 代ç è¡æ°ç»è®¡ |
| | | - æ°å¢ä»£ç è¡: 约1400è¡ |
| | | - SQL: 27è¡ |
| | | - Java: 约900è¡ |
| | | - JavaScript: 77è¡ |
| | | - Vueä¿®æ¹: 约90è¡ |
| | | - ææ¡£: 约500è¡ |
| | | |
| | | ## åè½æ¨¡å |
| | | |
| | | ### 1. æ°æ®åºå±ï¼1个æä»¶ï¼ |
| | | - `sys_message` è¡¨ç»æ |
| | | |
| | | ### 2. å端å±ï¼7个æä»¶ï¼ |
| | | - å®ä½ç±»ï¼1ä¸ªï¼ |
| | | - Mapperæ¥å£ï¼1ä¸ªï¼ |
| | | - MyBatisæ å°ï¼1ä¸ªï¼ |
| | | - Serviceæ¥å£ï¼1ä¸ªï¼ |
| | | - Serviceå®ç°ï¼1ä¸ªï¼ |
| | | - Controllerï¼1ä¸ªï¼ |
| | | - 任塿å¡éæï¼1个修æ¹ï¼ |
| | | |
| | | ### 3. å端å±ï¼3个æä»¶ï¼ |
| | | - APIæ¥å£ï¼1个æ°å¢ï¼ |
| | | - æ¶æ¯ä¸å¿é¡µé¢ï¼1个修æ¹ï¼ |
| | | - é¦é¡µæªè¯»æ°éï¼1个修æ¹ï¼ |
| | | |
| | | ### 4. ææ¡£å±ï¼3个æä»¶ï¼ |
| | | - åè½å®ç°æ»ç» |
| | | - å¿«éå¼å§æå |
| | | - æä»¶åæ´æ¸
å |
| | | |
| | | ## ä¾èµå
³ç³» |
| | | |
| | | ### å端ä¾èµ |
| | | ``` |
| | | SysMessageController |
| | | â ä¾èµ |
| | | ISysMessageService (æ¥å£) |
| | | â å®ç° |
| | | SysMessageServiceImpl |
| | | â ä¾èµ |
| | | SysMessageMapper (æ¥å£) |
| | | â é
ç½® |
| | | SysMessageMapper.xml |
| | | â æä½ |
| | | sys_message (æ°æ®è¡¨) |
| | | ``` |
| | | |
| | | ### 任塿å¡éæ |
| | | ``` |
| | | SysTaskServiceImpl |
| | | â è°ç¨ |
| | | ISysMessageService.pushTaskCreateMessage() |
| | | ISysMessageService.pushTaskAssignMessage() |
| | | ISysMessageService.pushTaskStatusChangeMessage() |
| | | â æä½ |
| | | sys_message (æ°æ®è¡¨) |
| | | ``` |
| | | |
| | | ### å端ä¾èµ |
| | | ``` |
| | | index.vue / message/index.vue |
| | | â è°ç¨ |
| | | api/message.js |
| | | â è¯·æ± |
| | | å端 SysMessageController |
| | | â æ¥è¯¢ |
| | | sys_message (æ°æ®è¡¨) |
| | | ``` |
| | | |
| | | ## é¨ç½²æ£æ¥æ¸
å |
| | | |
| | | - [ ] 1. æ§è¡æ°æ®åºèæ¬ `sql/sys_message.sql` |
| | | - [ ] 2. 确认 `sys_message` 表å建æå |
| | | - [ ] 3. éæ°ç¼è¯åç«¯é¡¹ç® |
| | | - [ ] 4. éå¯å端æå¡ |
| | | - [ ] 5. æ¸
çæµè§å¨ç¼å |
| | | - [ ] 6. æµè¯åå»ºä»»å¡æ¶æ¯æ¨é |
| | | - [ ] 7. æµè¯ä»»å¡åé
æ¶æ¯æ¨é |
| | | - [ ] 8. æµè¯ç¶æåæ´æ¶æ¯æ¨é |
| | | - [ ] 9. æµè¯æ¶æ¯å表æ¥è¯¢ |
| | | - [ ] 10. æµè¯æ¶æ¯æ 记已读 |
| | | - [ ] 11. æµè¯æªè¯»æ¶æ¯æ°éæ¾ç¤º |
| | | |
| | | ## Gitæäº¤å»ºè®® |
| | | |
| | | ```bash |
| | | # æäº¤æ°æ®åºèæ¬ |
| | | git add sql/sys_message.sql |
| | | git commit -m "feat: æ·»å ç³»ç»æ¶æ¯è¡¨ç»æ" |
| | | |
| | | # æäº¤å端代ç |
| | | git add ruoyi-system/src/main/java/com/ruoyi/system/domain/SysMessage.java |
| | | git add ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMessageMapper.java |
| | | git add ruoyi-system/src/main/resources/mapper/system/SysMessageMapper.xml |
| | | git add ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMessageService.java |
| | | git add ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMessageServiceImpl.java |
| | | git add ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMessageController.java |
| | | git commit -m "feat: å®ç°ç³»ç»æ¶æ¯æ¨éå端æå¡" |
| | | |
| | | # æäº¤ä»»å¡æå¡éæ |
| | | git add ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java |
| | | git commit -m "feat: å¨ä»»å¡å建ãåé
ãç¶æåæ´æ¶éææ¶æ¯æ¨é" |
| | | |
| | | # æäº¤å端代ç |
| | | git add app/api/message.js |
| | | git add app/pages/message/index.vue |
| | | git add app/pages/index.vue |
| | | git commit -m "feat: å®ç°æ¶æ¯ä¸å¿å端页é¢åæªè¯»æ¶æ¯è®¡æ°" |
| | | |
| | | # æäº¤ææ¡£ |
| | | git add prd/ç³»ç»æ¶æ¯æ¨éåè½å®ç°æ»ç».md |
| | | git add prd/ç³»ç»æ¶æ¯æ¨é-å¿«éå¼å§.md |
| | | git add prd/ç³»ç»æ¶æ¯æ¨é-æä»¶åæ´æ¸
å.md |
| | | git commit -m "docs: æ·»å ç³»ç»æ¶æ¯æ¨éåè½ææ¡£" |
| | | |
| | | # æè
䏿¬¡æ§æäº¤ |
| | | git add . |
| | | git commit -m "feat: å®ç°ç³»ç»æ¶æ¯æ¨éåè½ |
| | | |
| | | - åå»ºä»»å¡æ¶æ¨éæ¶æ¯ç»åå»ºäººåæ§è¡äºº |
| | | - ä»»å¡åé
æ¶æ¨éæ¶æ¯ç»æ§è¡äºº |
| | | - ç¶æåæ´æ¶æ¨éæ¶æ¯ç»ç¸å
³äººå |
| | | - å®ç°æ¶æ¯ä¸å¿é¡µé¢ |
| | | - å®ç°æªè¯»æ¶æ¯æ°éæ¾ç¤º |
| | | - æ¯ææ¶æ¯å·²è¯»æ è®° |
| | | - å®ååè½ææ¡£" |
| | | ``` |
| | | |
| | | ## åæ»æ¹æ¡ |
| | | |
| | | 妿éè¦åæ»æ¤åè½ï¼ |
| | | |
| | | ### 1. æ°æ®åºåæ» |
| | | ```sql |
| | | DROP TABLE IF EXISTS `sys_message`; |
| | | ``` |
| | | |
| | | ### 2. 代ç åæ» |
| | | ```bash |
| | | # å 餿°å¢æä»¶ |
| | | git rm ruoyi-system/src/main/java/com/ruoyi/system/domain/SysMessage.java |
| | | git rm ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMessageMapper.java |
| | | git rm ruoyi-system/src/main/resources/mapper/system/SysMessageMapper.xml |
| | | git rm ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMessageService.java |
| | | git rm ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMessageServiceImpl.java |
| | | git rm ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMessageController.java |
| | | git rm app/api/message.js |
| | | |
| | | # æ¢å¤ä¿®æ¹çæä»¶ |
| | | git checkout ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java |
| | | git checkout app/pages/message/index.vue |
| | | git checkout app/pages/index.vue |
| | | |
| | | git commit -m "revert: åæ»ç³»ç»æ¶æ¯æ¨éåè½" |
| | | ``` |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. **æ°æ®åºå¤ä»½**ï¼æ§è¡SQLèæ¬å建议å¤ä»½æ°æ®åº |
| | | 2. **æå¡éå¯**ï¼å端修æ¹åå¿
é¡»é坿塿è½çæ |
| | | 3. **ç¼åæ¸
ç**ï¼å端修æ¹åéè¦æ¸
çæµè§å¨ç¼å |
| | | 4. **å
¼å®¹æ§æµè¯**ï¼é¨ç½²åéè¦å
¨é¢æµè¯å项åè½ |
| | | 5. **æ§è½çæ§**ï¼å
³æ³¨æ¶æ¯æ¨éå¯¹ç³»ç»æ§è½çå½±å |
| | | |
| | | --- |
| | | |
| | | **æ´æ°æ¶é´**: 2025-10-25 |
| | | **çæ¬**: v1.0 |
| | | **è´è´£äºº**: AI Assistant |
| New file |
| | |
| | | # ç³»ç»æ¶æ¯æ¨éåè½å®ç°æ»ç» |
| | | |
| | | ## åè½æ¦è¿° |
| | | |
| | | å®ç°äºå®æ´çç³»ç»æ¶æ¯æ¨éåè½ï¼å
æ¬å¨ä»»å¡å建ãä»»å¡åé
ç¨æ·ãä»»å¡ç¶æåæ´æ¶èªå¨æ¨éæ¶æ¯ç»ç¸å
³ç¨æ·ã |
| | | |
| | | ## å®ç°å
容 |
| | | |
| | | ### 1. æ°æ®åºè¡¨ç»æ |
| | | |
| | | **æä»¶ä½ç½®**: `sql/sys_message.sql` |
| | | |
| | | åå»ºäº `sys_message` 表ï¼å
å«ä»¥ä¸åæ®µï¼ |
| | | - `message_id`: æ¶æ¯IDï¼ä¸»é®ï¼ |
| | | - `message_type`: æ¶æ¯ç±»åï¼CREATE-å建æå, PUSH-任塿¨é, STATUS-ç¶æåæ´, ASSIGN-åé
ä»»å¡ï¼ |
| | | - `message_title`: æ¶æ¯æ é¢ |
| | | - `message_content`: æ¶æ¯å
容 |
| | | - `task_id`: å
³èä»»å¡ID |
| | | - `task_code`: ä»»å¡ç¼å· |
| | | - `receiver_id`: æ¥æ¶äººID |
| | | - `receiver_name`: æ¥æ¶äººå§å |
| | | - `sender_id`: åé人ID |
| | | - `sender_name`: åé人å§å |
| | | - `is_read`: æ¯å¦å·²è¯»ï¼0-æªè¯», 1-å·²è¯»ï¼ |
| | | - `read_time`: è¯»åæ¶é´ |
| | | - `create_time`: å建æ¶é´ |
| | | - `update_time`: æ´æ°æ¶é´ |
| | | - `del_flag`: å 餿 å¿ |
| | | |
| | | ### 2. å端å®ç° |
| | | |
| | | #### 2.1 å®ä½ç±» |
| | | |
| | | **æä»¶ä½ç½®**: `ruoyi-system/src/main/java/com/ruoyi/system/domain/SysMessage.java` |
| | | |
| | | - å
å«æææ°æ®åºå段çgetter/setter |
| | | - æ¯æExcelå¯¼åºæ³¨è§£ |
| | | - æ¥ææ ¼å¼å注解 |
| | | |
| | | #### 2.2 Mapperå± |
| | | |
| | | **æä»¶ä½ç½®**: |
| | | - `ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMessageMapper.java` |
| | | - `ruoyi-system/src/main/resources/mapper/system/SysMessageMapper.xml` |
| | | |
| | | æä¾çæ¹æ³ï¼ |
| | | - `selectSysMessageList`: æ¥è¯¢æ¶æ¯å表 |
| | | - `selectSysMessageListByReceiverId`: æ¥è¯¢ç¨æ·æ¶æ¯å表 |
| | | - `countUnreadMessageByReceiverId`: æ¥è¯¢æªè¯»æ¶æ¯æ°é |
| | | - `insertSysMessage`: æ°å¢æ¶æ¯ |
| | | - `updateSysMessage`: ä¿®æ¹æ¶æ¯ |
| | | - `deleteSysMessageByMessageIds`: æ¹éå 餿¶æ¯ |
| | | - `markMessageAsRead`: æ è®°æ¶æ¯ä¸ºå·²è¯» |
| | | - `markAllMessagesAsRead`: æ è®°æææ¶æ¯ä¸ºå·²è¯» |
| | | |
| | | #### 2.3 Serviceå± |
| | | |
| | | **æä»¶ä½ç½®**: |
| | | - `ruoyi-system/src/main/java/com/ruoyi/system/service/ISysMessageService.java` |
| | | - `ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMessageServiceImpl.java` |
| | | |
| | | æä¾çä¸å¡æ¹æ³ï¼ |
| | | - åºç¡CRUDæ¹æ³ |
| | | - `pushTaskCreateMessage`: æ¨éä»»å¡å建æåæ¶æ¯ |
| | | - `pushTaskAssignMessage`: æ¨éä»»å¡åé
æ¶æ¯ |
| | | - `pushTaskStatusChangeMessage`: æ¨éä»»å¡ç¶æåæ´æ¶æ¯ |
| | | |
| | | #### 2.4 Controllerå± |
| | | |
| | | **æä»¶ä½ç½®**: `ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMessageController.java` |
| | | |
| | | æä¾çAPIæ¥å£ï¼ |
| | | - `GET /system/message/list`: æ¥è¯¢æ¶æ¯å表 |
| | | - `GET /system/message/my`: æ¥è¯¢å½åç¨æ·æ¶æ¯å表 |
| | | - `GET /system/message/unread/count`: æ¥è¯¢æªè¯»æ¶æ¯æ°é |
| | | - `GET /system/message/{messageId}`: è·åæ¶æ¯è¯¦æ
|
| | | - `POST /system/message`: æ°å¢æ¶æ¯ |
| | | - `PUT /system/message`: ä¿®æ¹æ¶æ¯ |
| | | - `DELETE /system/message/{messageIds}`: å 餿¶æ¯ |
| | | - `PUT /system/message/read/{messageId}`: æ è®°æ¶æ¯ä¸ºå·²è¯» |
| | | - `PUT /system/message/read/all`: æ è®°æææ¶æ¯ä¸ºå·²è¯» |
| | | |
| | | #### 2.5 任塿å¡éæ |
| | | |
| | | **æä»¶ä½ç½®**: `ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java` |
| | | |
| | | å¨ä»¥ä¸åºæ¯èªå¨æ¨éæ¶æ¯ï¼ |
| | | |
| | | 1. **ä»»å¡å建æå** |
| | | - æ¶æºï¼`insertSysTask` æ¹æ³æ§è¡æåå |
| | | - æ¥æ¶äººï¼ä»»å¡å建人 |
| | | - æ¶æ¯ç±»åï¼CREATE |
| | | - æ¶æ¯å
容ï¼"æ¨å建çä»»å¡å·²æåæäº¤" |
| | | |
| | | 2. **ä»»å¡åé
ç¨æ·** |
| | | - æ¶æºï¼`insertSysTask` æ¹æ³ä¿åæ§è¡äººååã`assignTask` æ¹æ³æ§è¡å |
| | | - æ¥æ¶äººï¼æææ§è¡äººå |
| | | - æ¶æ¯ç±»åï¼PUSH/ASSIGN |
| | | - æ¶æ¯å
容ï¼"æ¨ææ°çä»»å¡ï¼è¯·åæ¶å¤ç" |
| | | |
| | | 3. **ä»»å¡ç¶æåæ´** |
| | | - æ¶æºï¼`changeTaskStatusWithLocation` æ¹æ³æ§è¡æåå |
| | | - æ¥æ¶äººï¼æææ§è¡äººå + å建人 |
| | | - æ¶æ¯ç±»åï¼STATUS |
| | | - æ¶æ¯å
å®¹ï¼æ ¹æ®ç¶æååå¨æçæ |
| | | - PENDING: "ä»»å¡ç¶æåæ´ä¸ºï¼å¾
å¤ç" |
| | | - DEPARTED: "ä»»å¡ç¶æåæ´ä¸ºï¼å·²åºå" |
| | | - ARRIVED: "ä»»å¡ç¶æåæ´ä¸ºï¼å·²å°è¾¾" |
| | | - RETURNING: "ä»»å¡ç¶æåæ´ä¸ºï¼è¿ç¨ä¸" |
| | | - COMPLETED: "ä»»å¡ç¶æåæ´ä¸ºï¼å·²å®æ" |
| | | - CANCELLED: "ä»»å¡ç¶æåæ´ä¸ºï¼å·²åæ¶" |
| | | |
| | | ### 3. å端å®ç° |
| | | |
| | | #### 3.1 APIæ¥å£ |
| | | |
| | | **æä»¶ä½ç½®**: `app/api/message.js` |
| | | |
| | | æä¾çæ¹æ³ï¼ |
| | | - `getMyMessages`: è·åå½åç¨æ·æ¶æ¯å表 |
| | | - `listMessage`: æ¥è¯¢æ¶æ¯å表 |
| | | - `getMessage`: è·åæ¶æ¯è¯¦æ
|
| | | - `getUnreadCount`: è·åæªè¯»æ¶æ¯æ°é |
| | | - `addMessage`: æ°å¢æ¶æ¯ |
| | | - `updateMessage`: ä¿®æ¹æ¶æ¯ |
| | | - `delMessage`: å 餿¶æ¯ |
| | | - `markAsRead`: æ è®°æ¶æ¯ä¸ºå·²è¯» |
| | | - `markAllAsRead`: æ è®°æææ¶æ¯ä¸ºå·²è¯» |
| | | |
| | | #### 3.2 æ¶æ¯ä¸å¿é¡µé¢ |
| | | |
| | | **æä»¶ä½ç½®**: `app/pages/message/index.vue` |
| | | |
| | | åè½ç¹æ§ï¼ |
| | | - èªå¨å è½½å½åç¨æ·çæ¶æ¯å表 |
| | | - æªè¯»æ¶æ¯æ¾ç¤ºçº¢ç¹æ è®° |
| | | - æªè¯»æ¶æ¯æå¨åé¢ |
| | | - æ¯æä¸æå·æ° |
| | | - ç¹å»æ¶æ¯èªå¨æ 记为已读并跳转å°ä»»å¡è¯¦æ
|
| | | - æ¶æ¯ç±»åæ¾ç¤ºï¼å建æåã任塿¨éãç¶æåæ´ãä»»å¡åé
ï¼ |
| | | |
| | | #### 3.3 é¦é¡µéæ |
| | | |
| | | **æä»¶ä½ç½®**: `app/pages/index.vue` |
| | | |
| | | åè½ç¹æ§ï¼ |
| | | - æ¶æ¯ä¸å¿å
¥å£ |
| | | - æ¾ç¤ºæªè¯»æ¶æ¯æ°éå¾½ç« |
| | | - 页颿¾ç¤ºæ¶èªå¨å·æ°æªè¯»æ¶æ¯æ°é |
| | | |
| | | ## æ¶æ¯ç±»å说æ |
| | | |
| | | | æ¶æ¯ç±»å | 代ç | 触ååºæ¯ | æ¥æ¶äºº | æ¶æ¯å
容 | |
| | | |---------|------|---------|--------|---------| |
| | | | å建æå | CREATE | ä»»å¡å建æå | å建人 | æ¨å建çä»»å¡å·²æåæäº¤ | |
| | | | 任塿¨é | PUSH | ä»»å¡åé
ç»æ§è¡äºº | æ§è¡äºº | æ¨ææ°çä»»å¡ï¼è¯·åæ¶å¤ç | |
| | | | ä»»å¡åé
| ASSIGN | éæ°åé
ä»»å¡ | æ°æ§è¡äºº | æ¨ææ°çä»»å¡ï¼è¯·åæ¶å¤ç | |
| | | | ç¶æåæ´ | STATUS | ä»»å¡ç¶æåæ´ | æ§è¡äºº+å建人 | ä»»å¡ç¶æåæ´ä¸ºï¼XXX | |
| | | |
| | | ## ä½¿ç¨æå |
| | | |
| | | ### é¨ç½²æ¥éª¤ |
| | | |
| | | 1. **æ§è¡æ°æ®åºèæ¬** |
| | | ```bash |
| | | mysql -u root -p your_database < sql/sys_message.sql |
| | | ``` |
| | | |
| | | 2. **éæ°ç¼è¯å端** |
| | | ```bash |
| | | cd ruoyi-admin |
| | | mvn clean package |
| | | ``` |
| | | |
| | | 3. **éå¯å端æå¡** |
| | | ```bash |
| | | # Windows |
| | | bin\run.bat |
| | | |
| | | # Linux |
| | | sh bin/run.sh |
| | | ``` |
| | | |
| | | 4. **å端æ éé¢å¤æä½**ï¼ä»£ç å·²èªå¨éæ |
| | | |
| | | ### æµè¯éªè¯ |
| | | |
| | | 1. **å建任å¡** |
| | | - å建任å¡åï¼åå»ºäººåºæ¶å°"å建æå"æ¶æ¯ |
| | | - æ§è¡äººåºæ¶å°"任塿¨é"æ¶æ¯ |
| | | |
| | | 2. **æ´æ°ä»»å¡ç¶æ** |
| | | - å¨å端ç¹å»"åºå"ã"å·²å°è¾¾"çæé® |
| | | - ç¸å
³äººååºæ¶å°"ç¶æåæ´"æ¶æ¯ |
| | | |
| | | 3. **åé
ä»»å¡** |
| | | - è°ç¨ä»»å¡åé
æ¥å£ |
| | | - æ°æ§è¡äººåºæ¶å°"ä»»å¡åé
"æ¶æ¯ |
| | | |
| | | 4. **æ¥çæ¶æ¯** |
| | | - è¿å
¥æ¶æ¯ä¸å¿é¡µé¢ |
| | | - æªè¯»æ¶æ¯æ¾ç¤ºçº¢ç¹ |
| | | - ç¹å»æ¶æ¯è·³è½¬å°ä»»å¡è¯¦æ
å¹¶æ 记为已读 |
| | | |
| | | ## ææ¯ç¹ç¹ |
| | | |
| | | ### 1. 弿¥æ¨é |
| | | - æ¶æ¯æ¨éä¸å½±å主ä¸å¡æµç¨ |
| | | - ä½¿ç¨ `@Autowired(required = false)` ç¡®ä¿æå¡å¯é |
| | | |
| | | ### 2. äºå¡å®å
¨ |
| | | - æ¶æ¯æ¨éå¨äºå¡æäº¤åæ§è¡ |
| | | - é¿å
äºå¡åæ»å¯¼è´çæ°æ®ä¸ä¸è´ |
| | | |
| | | ### 3. 容éå¤ç |
| | | - æ¶æ¯æ¨é失败ä¸å½±å主ä¸å¡ |
| | | - å®åçå¼å¸¸æè·åæ¥å¿è®°å½ |
| | | |
| | | ### 4. æ§è½ä¼å |
| | | - æ¹éæ¥è¯¢ç¨æ·ä¿¡æ¯ |
| | | - ç´¢å¼ä¼åï¼receiver_idãtask_idãis_readãcreate_timeï¼ |
| | | |
| | | ### 5. ç¨æ·ä½éª |
| | | - 宿¶æªè¯»æ¶æ¯è®¡æ° |
| | | - æ¶æ¯åç±»æ¾ç¤º |
| | | - æªè¯»æ¶æ¯ä¼å
æåº |
| | | - ä¸é®æ 记已读 |
| | | |
| | | ## æ©å±å»ºè®® |
| | | |
| | | ### 1. WebSocket宿¶æ¨é |
| | | å¯ä»¥éæWebSocketå®ç°å®æ¶æ¶æ¯æ¨éï¼èä¸éè¦ç¨æ·å·æ°é¡µé¢ï¼ |
| | | |
| | | ```java |
| | | @Service |
| | | public class WebSocketMessageService { |
| | | @Autowired |
| | | private SimpMessagingTemplate messagingTemplate; |
| | | |
| | | public void pushMessage(Long userId, SysMessage message) { |
| | | messagingTemplate.convertAndSendToUser( |
| | | userId.toString(), |
| | | "/queue/messages", |
| | | message |
| | | ); |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 2. æ¨ééç¥ |
| | | å¯ä»¥éæç¬¬ä¸æ¹æ¨éæå¡ï¼å¦æå
æ¨éã个æ¨çï¼å®ç°APPéç¥ï¼ |
| | | |
| | | ```java |
| | | public void sendPushNotification(Long userId, String title, String content) { |
| | | // è°ç¨æ¨éæå¡SDK |
| | | JPushClient.push(userId, title, content); |
| | | } |
| | | ``` |
| | | |
| | | ### 3. æ¶æ¯æ¨¡æ¿ |
| | | å¯ä»¥é
ç½®æ¶æ¯æ¨¡æ¿ï¼æ¯æåéæ¿æ¢ï¼ |
| | | |
| | | ```java |
| | | public class MessageTemplate { |
| | | private String type; |
| | | private String titleTemplate; |
| | | private String contentTemplate; |
| | | |
| | | public String render(Map<String, Object> params) { |
| | | // æ¨¡æ¿æ¸²æé»è¾ |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 4. æ¶æ¯åç» |
| | | å¯ä»¥å¢å æ¶æ¯åç»åè½ï¼ |
| | | |
| | | - ç³»ç»éç¥ |
| | | - 任塿é |
| | | - å®¡æ¹æ¶æ¯ |
| | | - å
¬åæ¶æ¯ |
| | | |
| | | ### 5. æ¶æ¯å·²è¯»åæ§ |
| | | å¯ä»¥è®°å½æ¶æ¯ç详ç»é
读记å½ï¼ |
| | | |
| | | ```sql |
| | | CREATE TABLE sys_message_read_log ( |
| | | log_id BIGINT PRIMARY KEY, |
| | | message_id BIGINT, |
| | | user_id BIGINT, |
| | | read_time DATETIME, |
| | | device_type VARCHAR(20) |
| | | ); |
| | | ``` |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. **æéæ§å¶**ï¼ç¡®ä¿ç¨æ·åªè½æ¥çèªå·±çæ¶æ¯ |
| | | 2. **æ°æ®æ¸
ç**ï¼å®ææ¸
çè¿æçå·²è¯»æ¶æ¯ |
| | | 3. **æ§è½çæ§**ï¼çæ§æ¶æ¯æ¨éçæ§è½ï¼é¿å
å¤§éæ¶æ¯æ¨éé ææ§è½é®é¢ |
| | | 4. **æ¥å¿è®°å½**ï¼å®æ´è®°å½æ¶æ¯æ¨éçæ¥å¿ï¼ä¾¿äºææ¥é®é¢ |
| | | |
| | | ## æ»ç» |
| | | |
| | | æ¬æ¬¡å®ç°äºå®æ´çç³»ç»æ¶æ¯æ¨éåè½ï¼æ¶µçäºä»»å¡å建ãåé
ãç¶æåæ´ä¸ä¸ªæ ¸å¿åºæ¯ãå端éç¨Serviceå±ç»ä¸ç®¡çæ¶æ¯æ¨éé»è¾ï¼å端æä¾åå¥½çæ¶æ¯ä¸å¿çé¢ãæ´ä¸ªç³»ç»è®¾è®¡åçï¼æäºæ©å±åç»´æ¤ã |
| New file |
| | |
| | | package com.ruoyi.web.controller.system; |
| | | |
| | | import java.util.List; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import org.springframework.security.access.prepost.PreAuthorize; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.web.bind.annotation.GetMapping; |
| | | import org.springframework.web.bind.annotation.PostMapping; |
| | | import org.springframework.web.bind.annotation.PutMapping; |
| | | import org.springframework.web.bind.annotation.DeleteMapping; |
| | | import org.springframework.web.bind.annotation.PathVariable; |
| | | import org.springframework.web.bind.annotation.RequestBody; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.RestController; |
| | | import com.ruoyi.common.annotation.Log; |
| | | import com.ruoyi.common.core.controller.BaseController; |
| | | import com.ruoyi.common.core.domain.AjaxResult; |
| | | import com.ruoyi.common.enums.BusinessType; |
| | | import com.ruoyi.system.domain.SysMessage; |
| | | import com.ruoyi.system.service.ISysMessageService; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.common.core.page.TableDataInfo; |
| | | import com.ruoyi.common.utils.SecurityUtils; |
| | | |
| | | /** |
| | | * ç³»ç»æ¶æ¯Controller |
| | | * |
| | | * @author ruoyi |
| | | * @date 2025-10-25 |
| | | */ |
| | | @RestController |
| | | @RequestMapping("/system/message") |
| | | public class SysMessageController extends BaseController { |
| | | |
| | | @Autowired |
| | | private ISysMessageService sysMessageService; |
| | | |
| | | /** |
| | | * æ¥è¯¢ç³»ç»æ¶æ¯å表 |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('system:message:list')") |
| | | @GetMapping("/list") |
| | | public TableDataInfo list(SysMessage sysMessage) { |
| | | startPage(); |
| | | List<SysMessage> list = sysMessageService.selectSysMessageList(sysMessage); |
| | | return getDataTable(list); |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢å½åç¨æ·çæ¶æ¯å表 |
| | | */ |
| | | @GetMapping("/my") |
| | | public AjaxResult myMessages() { |
| | | Long userId = SecurityUtils.getUserId(); |
| | | List<SysMessage> list = sysMessageService.selectSysMessageListByReceiverId(userId); |
| | | return AjaxResult.success(list); |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢å½åç¨æ·æªè¯»æ¶æ¯æ°é |
| | | */ |
| | | @GetMapping("/unread/count") |
| | | public AjaxResult unreadCount() { |
| | | Long userId = SecurityUtils.getUserId(); |
| | | int count = sysMessageService.countUnreadMessageByReceiverId(userId); |
| | | return AjaxResult.success(count); |
| | | } |
| | | |
| | | /** |
| | | * 导åºç³»ç»æ¶æ¯å表 |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('system:message:export')") |
| | | @Log(title = "ç³»ç»æ¶æ¯", businessType = BusinessType.EXPORT) |
| | | @PostMapping("/export") |
| | | public void export(HttpServletResponse response, SysMessage sysMessage) { |
| | | List<SysMessage> list = sysMessageService.selectSysMessageList(sysMessage); |
| | | ExcelUtil<SysMessage> util = new ExcelUtil<SysMessage>(SysMessage.class); |
| | | util.exportExcel(response, list, "ç³»ç»æ¶æ¯æ°æ®"); |
| | | } |
| | | |
| | | /** |
| | | * è·åç³»ç»æ¶æ¯è¯¦ç»ä¿¡æ¯ |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('system:message:query')") |
| | | @GetMapping(value = "/{messageId}") |
| | | public AjaxResult getInfo(@PathVariable("messageId") Long messageId) { |
| | | return AjaxResult.success(sysMessageService.selectSysMessageByMessageId(messageId)); |
| | | } |
| | | |
| | | /** |
| | | * æ°å¢ç³»ç»æ¶æ¯ |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('system:message:add')") |
| | | @Log(title = "ç³»ç»æ¶æ¯", businessType = BusinessType.INSERT) |
| | | @PostMapping |
| | | public AjaxResult add(@RequestBody SysMessage sysMessage) { |
| | | return toAjax(sysMessageService.insertSysMessage(sysMessage)); |
| | | } |
| | | |
| | | /** |
| | | * ä¿®æ¹ç³»ç»æ¶æ¯ |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('system:message:edit')") |
| | | @Log(title = "ç³»ç»æ¶æ¯", businessType = BusinessType.UPDATE) |
| | | @PutMapping |
| | | public AjaxResult edit(@RequestBody SysMessage sysMessage) { |
| | | return toAjax(sysMessageService.updateSysMessage(sysMessage)); |
| | | } |
| | | |
| | | /** |
| | | * å é¤ç³»ç»æ¶æ¯ |
| | | */ |
| | | @PreAuthorize("@ss.hasPermi('system:message:remove')") |
| | | @Log(title = "ç³»ç»æ¶æ¯", businessType = BusinessType.DELETE) |
| | | @DeleteMapping("/{messageIds}") |
| | | public AjaxResult remove(@PathVariable Long[] messageIds) { |
| | | return toAjax(sysMessageService.deleteSysMessageByMessageIds(messageIds)); |
| | | } |
| | | |
| | | /** |
| | | * æ è®°æ¶æ¯ä¸ºå·²è¯» |
| | | */ |
| | | @Log(title = "ç³»ç»æ¶æ¯", businessType = BusinessType.UPDATE) |
| | | @PutMapping("/read/{messageId}") |
| | | public AjaxResult markAsRead(@PathVariable Long messageId) { |
| | | return toAjax(sysMessageService.markMessageAsRead(messageId)); |
| | | } |
| | | |
| | | /** |
| | | * æ è®°æææ¶æ¯ä¸ºå·²è¯» |
| | | */ |
| | | @Log(title = "ç³»ç»æ¶æ¯", businessType = BusinessType.UPDATE) |
| | | @PutMapping("/read/all") |
| | | public AjaxResult markAllAsRead() { |
| | | Long userId = SecurityUtils.getUserId(); |
| | | return toAjax(sysMessageService.markAllMessagesAsRead(userId)); |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.framework.config; |
| | | |
| | | import java.util.concurrent.Executor; |
| | | import java.util.concurrent.ThreadPoolExecutor; |
| | | import org.springframework.context.annotation.Bean; |
| | | import org.springframework.context.annotation.Configuration; |
| | | import org.springframework.scheduling.annotation.EnableAsync; |
| | | import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; |
| | | |
| | | /** |
| | | * 弿¥ä»»å¡é
ç½® |
| | | * ç¨äºæ¯æ@Async注解ç弿¥æ¹æ³æ§è¡ |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @Configuration |
| | | @EnableAsync |
| | | public class AsyncConfig { |
| | | |
| | | /** |
| | | * èªå®ä¹å¼æ¥ä»»å¡çº¿ç¨æ± |
| | | */ |
| | | @Bean(name = "taskExecutor") |
| | | public Executor taskExecutor() { |
| | | ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); |
| | | // æ ¸å¿çº¿ç¨æ° |
| | | executor.setCorePoolSize(5); |
| | | // æå¤§çº¿ç¨æ° |
| | | executor.setMaxPoolSize(10); |
| | | // éå容é |
| | | executor.setQueueCapacity(100); |
| | | // 线ç¨åç§°åç¼ |
| | | executor.setThreadNamePrefix("async-task-"); |
| | | // æç»çç¥ï¼ç±è°ç¨çº¿ç¨æ§è¡ |
| | | executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); |
| | | // åå§å |
| | | executor.initialize(); |
| | | return executor; |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.domain; |
| | | |
| | | import java.util.Date; |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.ruoyi.common.annotation.Excel; |
| | | import com.ruoyi.common.core.domain.BaseEntity; |
| | | |
| | | /** |
| | | * ç³»ç»æ¶æ¯å¯¹è±¡ sys_message |
| | | * |
| | | * @author ruoyi |
| | | * @date 2025-10-25 |
| | | */ |
| | | public class SysMessage extends BaseEntity { |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** æ¶æ¯ID */ |
| | | private Long messageId; |
| | | |
| | | /** æ¶æ¯ç±»åï¼CREATE-å建æå,PUSH-任塿¨é,STATUS-ç¶æåæ´,ASSIGN-åé
ä»»å¡ */ |
| | | @Excel(name = "æ¶æ¯ç±»å") |
| | | private String messageType; |
| | | |
| | | /** æ¶æ¯æ é¢ */ |
| | | @Excel(name = "æ¶æ¯æ é¢") |
| | | private String messageTitle; |
| | | |
| | | /** æ¶æ¯å
容 */ |
| | | @Excel(name = "æ¶æ¯å
容") |
| | | private String messageContent; |
| | | |
| | | /** å
³èä»»å¡ID */ |
| | | private Long taskId; |
| | | |
| | | /** ä»»å¡ç¼å· */ |
| | | @Excel(name = "ä»»å¡ç¼å·") |
| | | private String taskCode; |
| | | |
| | | /** æ¥æ¶äººID */ |
| | | private Long receiverId; |
| | | |
| | | /** æ¥æ¶äººå§å */ |
| | | @Excel(name = "æ¥æ¶äººå§å") |
| | | private String receiverName; |
| | | |
| | | /** åé人ID */ |
| | | private Long senderId; |
| | | |
| | | /** åé人å§å */ |
| | | @Excel(name = "åé人å§å") |
| | | private String senderName; |
| | | |
| | | /** æ¯å¦å·²è¯»ï¼0-æªè¯»,1-已读 */ |
| | | @Excel(name = "æ¯å¦å·²è¯»", readConverterExp = "0=æªè¯»,1=已读") |
| | | private String isRead; |
| | | |
| | | /** è¯»åæ¶é´ */ |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private Date readTime; |
| | | |
| | | /** å 餿 å¿ */ |
| | | private String delFlag; |
| | | |
| | | public void setMessageId(Long messageId) { |
| | | this.messageId = messageId; |
| | | } |
| | | |
| | | public Long getMessageId() { |
| | | return messageId; |
| | | } |
| | | |
| | | public void setMessageType(String messageType) { |
| | | this.messageType = messageType; |
| | | } |
| | | |
| | | public String getMessageType() { |
| | | return messageType; |
| | | } |
| | | |
| | | public void setMessageTitle(String messageTitle) { |
| | | this.messageTitle = messageTitle; |
| | | } |
| | | |
| | | public String getMessageTitle() { |
| | | return messageTitle; |
| | | } |
| | | |
| | | public void setMessageContent(String messageContent) { |
| | | this.messageContent = messageContent; |
| | | } |
| | | |
| | | public String getMessageContent() { |
| | | return messageContent; |
| | | } |
| | | |
| | | public void setTaskId(Long taskId) { |
| | | this.taskId = taskId; |
| | | } |
| | | |
| | | public Long getTaskId() { |
| | | return taskId; |
| | | } |
| | | |
| | | public void setTaskCode(String taskCode) { |
| | | this.taskCode = taskCode; |
| | | } |
| | | |
| | | public String getTaskCode() { |
| | | return taskCode; |
| | | } |
| | | |
| | | public void setReceiverId(Long receiverId) { |
| | | this.receiverId = receiverId; |
| | | } |
| | | |
| | | public Long getReceiverId() { |
| | | return receiverId; |
| | | } |
| | | |
| | | public void setReceiverName(String receiverName) { |
| | | this.receiverName = receiverName; |
| | | } |
| | | |
| | | public String getReceiverName() { |
| | | return receiverName; |
| | | } |
| | | |
| | | public void setSenderId(Long senderId) { |
| | | this.senderId = senderId; |
| | | } |
| | | |
| | | public Long getSenderId() { |
| | | return senderId; |
| | | } |
| | | |
| | | public void setSenderName(String senderName) { |
| | | this.senderName = senderName; |
| | | } |
| | | |
| | | public String getSenderName() { |
| | | return senderName; |
| | | } |
| | | |
| | | public void setIsRead(String isRead) { |
| | | this.isRead = isRead; |
| | | } |
| | | |
| | | public String getIsRead() { |
| | | return isRead; |
| | | } |
| | | |
| | | public void setReadTime(Date readTime) { |
| | | this.readTime = readTime; |
| | | } |
| | | |
| | | public Date getReadTime() { |
| | | return readTime; |
| | | } |
| | | |
| | | public void setDelFlag(String delFlag) { |
| | | this.delFlag = delFlag; |
| | | } |
| | | |
| | | public String getDelFlag() { |
| | | return delFlag; |
| | | } |
| | | |
| | | @Override |
| | | public String toString() { |
| | | return "SysMessage{" + |
| | | "messageId=" + messageId + |
| | | ", messageType='" + messageType + '\'' + |
| | | ", messageTitle='" + messageTitle + '\'' + |
| | | ", messageContent='" + messageContent + '\'' + |
| | | ", taskId=" + taskId + |
| | | ", taskCode='" + taskCode + '\'' + |
| | | ", receiverId=" + receiverId + |
| | | ", receiverName='" + receiverName + '\'' + |
| | | ", senderId=" + senderId + |
| | | ", senderName='" + senderName + '\'' + |
| | | ", isRead='" + isRead + '\'' + |
| | | ", readTime=" + readTime + |
| | | ", delFlag='" + delFlag + '\'' + |
| | | '}'; |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.event; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * ä»»å¡åé
äºä»¶ |
| | | * |
| | | * @author ruoyi |
| | | * @date 2025-10-25 |
| | | */ |
| | | public class TaskAssignedEvent extends TaskEvent { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** æ§è¡äººIDå表 */ |
| | | private List<Long> assigneeIds; |
| | | |
| | | /** æ§è¡äººå§åå表 */ |
| | | private List<String> assigneeNames; |
| | | |
| | | /** åé
人ID */ |
| | | private Long assignerId; |
| | | |
| | | /** åé
人å§å */ |
| | | private String assignerName; |
| | | |
| | | public TaskAssignedEvent(Object source, Long taskId, String taskCode, |
| | | List<Long> assigneeIds, List<String> assigneeNames, |
| | | Long assignerId, String assignerName) { |
| | | super(source, taskId, taskCode, assignerId, assignerName); |
| | | this.assigneeIds = assigneeIds; |
| | | this.assigneeNames = assigneeNames; |
| | | this.assignerId = assignerId; |
| | | this.assignerName = assignerName; |
| | | } |
| | | |
| | | public List<Long> getAssigneeIds() { |
| | | return assigneeIds; |
| | | } |
| | | |
| | | public void setAssigneeIds(List<Long> assigneeIds) { |
| | | this.assigneeIds = assigneeIds; |
| | | } |
| | | |
| | | public List<String> getAssigneeNames() { |
| | | return assigneeNames; |
| | | } |
| | | |
| | | public void setAssigneeNames(List<String> assigneeNames) { |
| | | this.assigneeNames = assigneeNames; |
| | | } |
| | | |
| | | public Long getAssignerId() { |
| | | return assignerId; |
| | | } |
| | | |
| | | public void setAssignerId(Long assignerId) { |
| | | this.assignerId = assignerId; |
| | | } |
| | | |
| | | public String getAssignerName() { |
| | | return assignerName; |
| | | } |
| | | |
| | | public void setAssignerName(String assignerName) { |
| | | this.assignerName = assignerName; |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.event; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * ä»»å¡å建äºä»¶ |
| | | * |
| | | * @author ruoyi |
| | | * @date 2025-10-25 |
| | | */ |
| | | public class TaskCreatedEvent extends TaskEvent { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** ä»»å¡ç±»å */ |
| | | private String taskType; |
| | | |
| | | /** å建人ID */ |
| | | private Long creatorId; |
| | | |
| | | /** å建人å§å */ |
| | | private String creatorName; |
| | | |
| | | public TaskCreatedEvent(Object source, Long taskId, String taskCode, String taskType, |
| | | Long creatorId, String creatorName) { |
| | | super(source, taskId, taskCode, creatorId, creatorName); |
| | | this.taskType = taskType; |
| | | this.creatorId = creatorId; |
| | | this.creatorName = creatorName; |
| | | } |
| | | |
| | | public String getTaskType() { |
| | | return taskType; |
| | | } |
| | | |
| | | public void setTaskType(String taskType) { |
| | | this.taskType = taskType; |
| | | } |
| | | |
| | | public Long getCreatorId() { |
| | | return creatorId; |
| | | } |
| | | |
| | | public void setCreatorId(Long creatorId) { |
| | | this.creatorId = creatorId; |
| | | } |
| | | |
| | | public String getCreatorName() { |
| | | return creatorName; |
| | | } |
| | | |
| | | public void setCreatorName(String creatorName) { |
| | | this.creatorName = creatorName; |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.event; |
| | | |
| | | import org.springframework.context.ApplicationEvent; |
| | | |
| | | /** |
| | | * ä»»å¡äºä»¶åºç±» |
| | | * |
| | | * @author ruoyi |
| | | * @date 2025-10-25 |
| | | */ |
| | | public abstract class TaskEvent extends ApplicationEvent { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** ä»»å¡ID */ |
| | | private Long taskId; |
| | | |
| | | /** ä»»å¡ç¼å· */ |
| | | private String taskCode; |
| | | |
| | | /** æä½äººID */ |
| | | private Long operatorId; |
| | | |
| | | /** æä½äººå§å */ |
| | | private String operatorName; |
| | | |
| | | public TaskEvent(Object source, Long taskId, String taskCode) { |
| | | super(source); |
| | | this.taskId = taskId; |
| | | this.taskCode = taskCode; |
| | | } |
| | | |
| | | public TaskEvent(Object source, Long taskId, String taskCode, Long operatorId, String operatorName) { |
| | | super(source); |
| | | this.taskId = taskId; |
| | | this.taskCode = taskCode; |
| | | this.operatorId = operatorId; |
| | | this.operatorName = operatorName; |
| | | } |
| | | |
| | | public Long getTaskId() { |
| | | return taskId; |
| | | } |
| | | |
| | | public void setTaskId(Long taskId) { |
| | | this.taskId = taskId; |
| | | } |
| | | |
| | | public String getTaskCode() { |
| | | return taskCode; |
| | | } |
| | | |
| | | public void setTaskCode(String taskCode) { |
| | | this.taskCode = taskCode; |
| | | } |
| | | |
| | | public Long getOperatorId() { |
| | | return operatorId; |
| | | } |
| | | |
| | | public void setOperatorId(Long operatorId) { |
| | | this.operatorId = operatorId; |
| | | } |
| | | |
| | | public String getOperatorName() { |
| | | return operatorName; |
| | | } |
| | | |
| | | public void setOperatorName(String operatorName) { |
| | | this.operatorName = operatorName; |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.event; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * ä»»å¡ç¶æåæ´äºä»¶ |
| | | * |
| | | * @author ruoyi |
| | | * @date 2025-10-25 |
| | | */ |
| | | public class TaskStatusChangedEvent extends TaskEvent { |
| | | |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** æ§ç¶æ */ |
| | | private String oldStatus; |
| | | |
| | | /** æ°ç¶æ */ |
| | | private String newStatus; |
| | | |
| | | /** æ§ç¶ææè¿° */ |
| | | private String oldStatusDesc; |
| | | |
| | | /** æ°ç¶ææè¿° */ |
| | | private String newStatusDesc; |
| | | |
| | | /** æ§è¡äººIDå表 */ |
| | | private List<Long> assigneeIds; |
| | | |
| | | /** å建人ID */ |
| | | private Long creatorId; |
| | | |
| | | public TaskStatusChangedEvent(Object source, Long taskId, String taskCode, |
| | | String oldStatus, String newStatus, |
| | | String oldStatusDesc, String newStatusDesc, |
| | | List<Long> assigneeIds, Long creatorId) { |
| | | super(source, taskId, taskCode); |
| | | this.oldStatus = oldStatus; |
| | | this.newStatus = newStatus; |
| | | this.oldStatusDesc = oldStatusDesc; |
| | | this.newStatusDesc = newStatusDesc; |
| | | this.assigneeIds = assigneeIds; |
| | | this.creatorId = creatorId; |
| | | } |
| | | |
| | | public String getOldStatus() { |
| | | return oldStatus; |
| | | } |
| | | |
| | | public void setOldStatus(String oldStatus) { |
| | | this.oldStatus = oldStatus; |
| | | } |
| | | |
| | | public String getNewStatus() { |
| | | return newStatus; |
| | | } |
| | | |
| | | public void setNewStatus(String newStatus) { |
| | | this.newStatus = newStatus; |
| | | } |
| | | |
| | | public String getOldStatusDesc() { |
| | | return oldStatusDesc; |
| | | } |
| | | |
| | | public void setOldStatusDesc(String oldStatusDesc) { |
| | | this.oldStatusDesc = oldStatusDesc; |
| | | } |
| | | |
| | | public String getNewStatusDesc() { |
| | | return newStatusDesc; |
| | | } |
| | | |
| | | public void setNewStatusDesc(String newStatusDesc) { |
| | | this.newStatusDesc = newStatusDesc; |
| | | } |
| | | |
| | | public List<Long> getAssigneeIds() { |
| | | return assigneeIds; |
| | | } |
| | | |
| | | public void setAssigneeIds(List<Long> assigneeIds) { |
| | | this.assigneeIds = assigneeIds; |
| | | } |
| | | |
| | | public Long getCreatorId() { |
| | | return creatorId; |
| | | } |
| | | |
| | | public void setCreatorId(Long creatorId) { |
| | | this.creatorId = creatorId; |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.listener; |
| | | |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.context.event.EventListener; |
| | | import org.springframework.scheduling.annotation.Async; |
| | | import org.springframework.stereotype.Component; |
| | | import com.ruoyi.common.utils.DateUtils; |
| | | import com.ruoyi.system.domain.SysMessage; |
| | | import com.ruoyi.system.event.TaskCreatedEvent; |
| | | import com.ruoyi.system.event.TaskAssignedEvent; |
| | | import com.ruoyi.system.event.TaskStatusChangedEvent; |
| | | import com.ruoyi.system.mapper.SysMessageMapper; |
| | | import com.ruoyi.system.mapper.SysUserMapper; |
| | | import com.ruoyi.common.core.domain.entity.SysUser; |
| | | |
| | | /** |
| | | * 任塿¶æ¯çå¬å¨ |
| | | * çå¬ä»»å¡ç¸å
³äºä»¶å¹¶ä¿åæ¶æ¯å°æ¶æ¯åº |
| | | * |
| | | * @author ruoyi |
| | | * @date 2025-10-25 |
| | | */ |
| | | @Component |
| | | public class TaskMessageListener { |
| | | |
| | | private static final Logger log = LoggerFactory.getLogger(TaskMessageListener.class); |
| | | |
| | | @Autowired |
| | | private SysMessageMapper sysMessageMapper; |
| | | |
| | | @Autowired |
| | | private SysUserMapper sysUserMapper; |
| | | |
| | | /** |
| | | * çå¬ä»»å¡å建äºä»¶ |
| | | * |
| | | * @param event ä»»å¡å建äºä»¶ |
| | | */ |
| | | @Async |
| | | @EventListener |
| | | public void handleTaskCreatedEvent(TaskCreatedEvent event) { |
| | | try { |
| | | log.info("æ¶å°ä»»å¡å建äºä»¶ï¼ä»»å¡IDï¼{}ï¼ä»»å¡ç¼å·ï¼{}", event.getTaskId(), event.getTaskCode()); |
| | | |
| | | // è·ååå»ºäººä¿¡æ¯ |
| | | SysUser creator = sysUserMapper.selectUserById(event.getCreatorId()); |
| | | if (creator == null) { |
| | | log.warn("æ¾ä¸å°å建人信æ¯ï¼ç¨æ·IDï¼{}", event.getCreatorId()); |
| | | return; |
| | | } |
| | | |
| | | // åå»ºæ¶æ¯ |
| | | SysMessage message = new SysMessage(); |
| | | message.setMessageType("CREATE"); |
| | | message.setMessageTitle("ä»»å¡å建æå"); |
| | | message.setMessageContent("æ¨å建çä»»å¡å·²æåæäº¤"); |
| | | message.setTaskId(event.getTaskId()); |
| | | message.setTaskCode(event.getTaskCode()); |
| | | message.setReceiverId(event.getCreatorId()); |
| | | message.setReceiverName(creator.getNickName()); |
| | | message.setSenderId(event.getCreatorId()); |
| | | message.setSenderName("ç³»ç»"); |
| | | message.setIsRead("0"); |
| | | message.setCreateTime(DateUtils.getNowDate()); |
| | | message.setDelFlag("0"); |
| | | |
| | | // ä¿åæ¶æ¯ |
| | | sysMessageMapper.insertSysMessage(message); |
| | | log.info("ä»»å¡åå»ºæ¶æ¯å·²ä¿åï¼æ¶æ¯IDï¼{}", message.getMessageId()); |
| | | |
| | | } catch (Exception e) { |
| | | log.error("å¤çä»»å¡å建äºä»¶å¤±è´¥", e); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * çå¬ä»»å¡åé
äºä»¶ |
| | | * |
| | | * @param event ä»»å¡åé
äºä»¶ |
| | | */ |
| | | @Async |
| | | @EventListener |
| | | public void handleTaskAssignedEvent(TaskAssignedEvent event) { |
| | | try { |
| | | log.info("æ¶å°ä»»å¡åé
äºä»¶ï¼ä»»å¡IDï¼{}ï¼ä»»å¡ç¼å·ï¼{}ï¼æ§è¡äººæ°éï¼{}", |
| | | event.getTaskId(), event.getTaskCode(), |
| | | event.getAssigneeIds() != null ? event.getAssigneeIds().size() : 0); |
| | | |
| | | if (event.getAssigneeIds() == null || event.getAssigneeIds().isEmpty()) { |
| | | log.warn("æ§è¡äººIDåè¡¨ä¸ºç©ºï¼æ æ³æ¨éæ¶æ¯"); |
| | | return; |
| | | } |
| | | |
| | | // ç»æ¯ä¸ªæ§è¡äººåéæ¶æ¯ |
| | | for (int i = 0; i < event.getAssigneeIds().size(); i++) { |
| | | Long assigneeId = event.getAssigneeIds().get(i); |
| | | |
| | | // è·åæ§è¡äººä¿¡æ¯ |
| | | SysUser assignee = sysUserMapper.selectUserById(assigneeId); |
| | | if (assignee == null) { |
| | | log.warn("æ¾ä¸å°æ§è¡äººä¿¡æ¯ï¼ç¨æ·IDï¼{}", assigneeId); |
| | | continue; |
| | | } |
| | | |
| | | // åå»ºæ¶æ¯ |
| | | SysMessage message = new SysMessage(); |
| | | message.setMessageType("PUSH"); |
| | | message.setMessageTitle("任塿¨é"); |
| | | message.setMessageContent("æ¨ææ°çä»»å¡ï¼è¯·åæ¶å¤ç"); |
| | | message.setTaskId(event.getTaskId()); |
| | | message.setTaskCode(event.getTaskCode()); |
| | | message.setReceiverId(assigneeId); |
| | | message.setReceiverName(assignee.getNickName()); |
| | | message.setSenderId(event.getAssignerId()); |
| | | message.setSenderName(event.getAssignerName() != null ? event.getAssignerName() : "ç³»ç»"); |
| | | message.setIsRead("0"); |
| | | message.setCreateTime(DateUtils.getNowDate()); |
| | | message.setDelFlag("0"); |
| | | |
| | | // ä¿åæ¶æ¯ |
| | | sysMessageMapper.insertSysMessage(message); |
| | | log.info("ä»»å¡åé
æ¶æ¯å·²ä¿åï¼æ¶æ¯IDï¼{}ï¼æ¥æ¶äººï¼{}", message.getMessageId(), assignee.getNickName()); |
| | | } |
| | | |
| | | } catch (Exception e) { |
| | | log.error("å¤çä»»å¡åé
äºä»¶å¤±è´¥", e); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * çå¬ä»»å¡ç¶æåæ´äºä»¶ |
| | | * |
| | | * @param event ä»»å¡ç¶æåæ´äºä»¶ |
| | | */ |
| | | @Async |
| | | @EventListener |
| | | public void handleTaskStatusChangedEvent(TaskStatusChangedEvent event) { |
| | | try { |
| | | log.info("æ¶å°ä»»å¡ç¶æåæ´äºä»¶ï¼ä»»å¡IDï¼{}ï¼æ§ç¶æï¼{}ï¼æ°ç¶æï¼{}", |
| | | event.getTaskId(), event.getOldStatus(), event.getNewStatus()); |
| | | |
| | | // æå»ºç¶æåæ´å
容 |
| | | String statusContent = getStatusChangeContent(event.getNewStatus(), event.getNewStatusDesc()); |
| | | |
| | | // æ¶éææéè¦éç¥çç¨æ·IDï¼æ§è¡äºº+å建人ï¼å»éï¼ |
| | | java.util.Set<Long> receiverIds = new java.util.HashSet<>(); |
| | | |
| | | // æ·»å æ§è¡äºº |
| | | if (event.getAssigneeIds() != null) { |
| | | receiverIds.addAll(event.getAssigneeIds()); |
| | | } |
| | | |
| | | // æ·»å å建人ï¼å¦æä¸æ¯æ§è¡äººï¼ |
| | | if (event.getCreatorId() != null) { |
| | | receiverIds.add(event.getCreatorId()); |
| | | } |
| | | |
| | | // ç»æ¯ä¸ªç¨æ·åéæ¶æ¯ |
| | | for (Long receiverId : receiverIds) { |
| | | SysUser user = sysUserMapper.selectUserById(receiverId); |
| | | if (user == null) { |
| | | log.warn("æ¾ä¸å°ç¨æ·ä¿¡æ¯ï¼ç¨æ·IDï¼{}", receiverId); |
| | | continue; |
| | | } |
| | | |
| | | // åå»ºæ¶æ¯ |
| | | SysMessage message = new SysMessage(); |
| | | message.setMessageType("STATUS"); |
| | | message.setMessageTitle("ä»»å¡ç¶æåæ´"); |
| | | message.setMessageContent(statusContent); |
| | | message.setTaskId(event.getTaskId()); |
| | | message.setTaskCode(event.getTaskCode()); |
| | | message.setReceiverId(receiverId); |
| | | message.setReceiverName(user.getNickName()); |
| | | message.setSenderId(event.getCreatorId()); |
| | | message.setSenderName("ç³»ç»"); |
| | | message.setIsRead("0"); |
| | | message.setCreateTime(DateUtils.getNowDate()); |
| | | message.setDelFlag("0"); |
| | | |
| | | // ä¿åæ¶æ¯ |
| | | sysMessageMapper.insertSysMessage(message); |
| | | log.info("ä»»å¡ç¶æåæ´æ¶æ¯å·²ä¿åï¼æ¶æ¯IDï¼{}ï¼æ°ç¶æï¼{}ï¼æ¥æ¶äººï¼{}", |
| | | message.getMessageId(), event.getNewStatus(), user.getNickName()); |
| | | } |
| | | |
| | | } catch (Exception e) { |
| | | log.error("å¤çä»»å¡ç¶æåæ´äºä»¶å¤±è´¥", e); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®ç¶æè·åç¶æåæ´å
容 |
| | | * |
| | | * @param status ä»»å¡ç¶æ |
| | | * @param statusDesc ç¶ææè¿° |
| | | * @return ç¶æåæ´å
容 |
| | | */ |
| | | private String getStatusChangeContent(String status, String statusDesc) { |
| | | if (statusDesc != null && !statusDesc.isEmpty()) { |
| | | return "ä»»å¡ç¶æåæ´ä¸ºï¼" + statusDesc; |
| | | } |
| | | |
| | | switch (status) { |
| | | case "PENDING": |
| | | return "ä»»å¡ç¶æåæ´ä¸ºï¼å¾
å¤ç"; |
| | | case "DEPARTING": |
| | | case "DEPARTED": |
| | | return "ä»»å¡ç¶æåæ´ä¸ºï¼å·²åºå"; |
| | | case "ARRIVED": |
| | | return "ä»»å¡ç¶æåæ´ä¸ºï¼å·²å°è¾¾"; |
| | | case "RETURNING": |
| | | return "ä»»å¡ç¶æåæ´ä¸ºï¼è¿ç¨ä¸"; |
| | | case "COMPLETED": |
| | | return "ä»»å¡ç¶æåæ´ä¸ºï¼å·²å®æ"; |
| | | case "CANCELLED": |
| | | return "ä»»å¡ç¶æåæ´ä¸ºï¼å·²åæ¶"; |
| | | default: |
| | | return "ä»»å¡ç¶æå·²æ´æ°"; |
| | | } |
| | | } |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.mapper; |
| | | |
| | | import java.util.List; |
| | | import com.ruoyi.system.domain.SysMessage; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | | /** |
| | | * ç³»ç»æ¶æ¯Mapperæ¥å£ |
| | | * |
| | | * @author ruoyi |
| | | * @date 2025-10-25 |
| | | */ |
| | | public interface SysMessageMapper { |
| | | |
| | | /** |
| | | * æ¥è¯¢ç³»ç»æ¶æ¯ |
| | | * |
| | | * @param messageId ç³»ç»æ¶æ¯ä¸»é® |
| | | * @return ç³»ç»æ¶æ¯ |
| | | */ |
| | | public SysMessage selectSysMessageByMessageId(Long messageId); |
| | | |
| | | /** |
| | | * æ¥è¯¢ç³»ç»æ¶æ¯å表 |
| | | * |
| | | * @param sysMessage ç³»ç»æ¶æ¯ |
| | | * @return ç³»ç»æ¶æ¯éå |
| | | */ |
| | | public List<SysMessage> selectSysMessageList(SysMessage sysMessage); |
| | | |
| | | /** |
| | | * æ¥è¯¢ç¨æ·çæ¶æ¯å表 |
| | | * |
| | | * @param receiverId æ¥æ¶äººID |
| | | * @return ç³»ç»æ¶æ¯éå |
| | | */ |
| | | public List<SysMessage> selectSysMessageListByReceiverId(@Param("receiverId") Long receiverId); |
| | | |
| | | /** |
| | | * æ¥è¯¢ç¨æ·æªè¯»æ¶æ¯æ°é |
| | | * |
| | | * @param receiverId æ¥æ¶äººID |
| | | * @return æªè¯»æ¶æ¯æ°é |
| | | */ |
| | | public int countUnreadMessageByReceiverId(@Param("receiverId") Long receiverId); |
| | | |
| | | /** |
| | | * æ°å¢ç³»ç»æ¶æ¯ |
| | | * |
| | | * @param sysMessage ç³»ç»æ¶æ¯ |
| | | * @return ç»æ |
| | | */ |
| | | public int insertSysMessage(SysMessage sysMessage); |
| | | |
| | | /** |
| | | * ä¿®æ¹ç³»ç»æ¶æ¯ |
| | | * |
| | | * @param sysMessage ç³»ç»æ¶æ¯ |
| | | * @return ç»æ |
| | | */ |
| | | public int updateSysMessage(SysMessage sysMessage); |
| | | |
| | | /** |
| | | * å é¤ç³»ç»æ¶æ¯ |
| | | * |
| | | * @param messageId ç³»ç»æ¶æ¯ä¸»é® |
| | | * @return ç»æ |
| | | */ |
| | | public int deleteSysMessageByMessageId(Long messageId); |
| | | |
| | | /** |
| | | * æ¹éå é¤ç³»ç»æ¶æ¯ |
| | | * |
| | | * @param messageIds éè¦å é¤çæ°æ®ä¸»é®éå |
| | | * @return ç»æ |
| | | */ |
| | | public int deleteSysMessageByMessageIds(Long[] messageIds); |
| | | |
| | | /** |
| | | * æ è®°æ¶æ¯ä¸ºå·²è¯» |
| | | * |
| | | * @param messageId æ¶æ¯ID |
| | | * @return ç»æ |
| | | */ |
| | | public int markMessageAsRead(@Param("messageId") Long messageId); |
| | | |
| | | /** |
| | | * æ è®°ç¨æ·æææ¶æ¯ä¸ºå·²è¯» |
| | | * |
| | | * @param receiverId æ¥æ¶äººID |
| | | * @return ç»æ |
| | | */ |
| | | public int markAllMessagesAsRead(@Param("receiverId") Long receiverId); |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.service; |
| | | |
| | | import java.util.List; |
| | | import com.ruoyi.system.domain.SysMessage; |
| | | import com.ruoyi.system.domain.SysTask; |
| | | |
| | | /** |
| | | * ç³»ç»æ¶æ¯Serviceæ¥å£ |
| | | * |
| | | * @author ruoyi |
| | | * @date 2025-10-25 |
| | | */ |
| | | public interface ISysMessageService { |
| | | |
| | | /** |
| | | * æ¥è¯¢ç³»ç»æ¶æ¯ |
| | | * |
| | | * @param messageId ç³»ç»æ¶æ¯ä¸»é® |
| | | * @return ç³»ç»æ¶æ¯ |
| | | */ |
| | | public SysMessage selectSysMessageByMessageId(Long messageId); |
| | | |
| | | /** |
| | | * æ¥è¯¢ç³»ç»æ¶æ¯å表 |
| | | * |
| | | * @param sysMessage ç³»ç»æ¶æ¯ |
| | | * @return ç³»ç»æ¶æ¯éå |
| | | */ |
| | | public List<SysMessage> selectSysMessageList(SysMessage sysMessage); |
| | | |
| | | /** |
| | | * æ¥è¯¢ç¨æ·çæ¶æ¯å表 |
| | | * |
| | | * @param receiverId æ¥æ¶äººID |
| | | * @return ç³»ç»æ¶æ¯éå |
| | | */ |
| | | public List<SysMessage> selectSysMessageListByReceiverId(Long receiverId); |
| | | |
| | | /** |
| | | * æ¥è¯¢ç¨æ·æªè¯»æ¶æ¯æ°é |
| | | * |
| | | * @param receiverId æ¥æ¶äººID |
| | | * @return æªè¯»æ¶æ¯æ°é |
| | | */ |
| | | public int countUnreadMessageByReceiverId(Long receiverId); |
| | | |
| | | /** |
| | | * æ°å¢ç³»ç»æ¶æ¯ |
| | | * |
| | | * @param sysMessage ç³»ç»æ¶æ¯ |
| | | * @return ç»æ |
| | | */ |
| | | public int insertSysMessage(SysMessage sysMessage); |
| | | |
| | | /** |
| | | * ä¿®æ¹ç³»ç»æ¶æ¯ |
| | | * |
| | | * @param sysMessage ç³»ç»æ¶æ¯ |
| | | * @return ç»æ |
| | | */ |
| | | public int updateSysMessage(SysMessage sysMessage); |
| | | |
| | | /** |
| | | * æ¹éå é¤ç³»ç»æ¶æ¯ |
| | | * |
| | | * @param messageIds éè¦å é¤çç³»ç»æ¶æ¯ä¸»é®éå |
| | | * @return ç»æ |
| | | */ |
| | | public int deleteSysMessageByMessageIds(Long[] messageIds); |
| | | |
| | | /** |
| | | * å é¤ç³»ç»æ¶æ¯ä¿¡æ¯ |
| | | * |
| | | * @param messageId ç³»ç»æ¶æ¯ä¸»é® |
| | | * @return ç»æ |
| | | */ |
| | | public int deleteSysMessageByMessageId(Long messageId); |
| | | |
| | | /** |
| | | * æ è®°æ¶æ¯ä¸ºå·²è¯» |
| | | * |
| | | * @param messageId æ¶æ¯ID |
| | | * @return ç»æ |
| | | */ |
| | | public int markMessageAsRead(Long messageId); |
| | | |
| | | /** |
| | | * æ è®°ç¨æ·æææ¶æ¯ä¸ºå·²è¯» |
| | | * |
| | | * @param receiverId æ¥æ¶äººID |
| | | * @return ç»æ |
| | | */ |
| | | public int markAllMessagesAsRead(Long receiverId); |
| | | |
| | | // ========== æ¶æ¯æ¨éä¸å¡æ¹æ³ ========== |
| | | |
| | | /** |
| | | * æ¨éä»»å¡å建æåæ¶æ¯ï¼ç»åå»ºäººï¼ |
| | | * |
| | | * @param task ä»»å¡å¯¹è±¡ |
| | | */ |
| | | public void pushTaskCreateMessage(SysTask task); |
| | | |
| | | /** |
| | | * æ¨éä»»å¡åé
æ¶æ¯ï¼ç»æ§è¡äººï¼ |
| | | * |
| | | * @param task ä»»å¡å¯¹è±¡ |
| | | * @param assigneeIds æ§è¡äººIDå表 |
| | | */ |
| | | public void pushTaskAssignMessage(SysTask task, List<Long> assigneeIds); |
| | | |
| | | /** |
| | | * æ¨éä»»å¡ç¶æåæ´æ¶æ¯ï¼ç»ç¸å
³äººåï¼ |
| | | * |
| | | * @param task ä»»å¡å¯¹è±¡ |
| | | * @param oldStatus æ§ç¶æ |
| | | * @param newStatus æ°ç¶æ |
| | | */ |
| | | public void pushTaskStatusChangeMessage(SysTask task, String oldStatus, String newStatus); |
| | | } |
| New file |
| | |
| | | package com.ruoyi.system.service.impl; |
| | | |
| | | import java.util.Date; |
| | | import java.util.List; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import com.ruoyi.common.utils.DateUtils; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.system.mapper.SysMessageMapper; |
| | | import com.ruoyi.system.mapper.SysUserMapper; |
| | | import com.ruoyi.system.mapper.SysTaskAssigneeMapper; |
| | | import com.ruoyi.system.domain.SysMessage; |
| | | import com.ruoyi.system.domain.SysTask; |
| | | import com.ruoyi.system.domain.SysTaskAssignee; |
| | | import com.ruoyi.common.core.domain.entity.SysUser; |
| | | import com.ruoyi.system.service.ISysMessageService; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | |
| | | /** |
| | | * ç³»ç»æ¶æ¯Serviceä¸å¡å±å¤ç |
| | | * |
| | | * @author ruoyi |
| | | * @date 2025-10-25 |
| | | */ |
| | | @Service |
| | | public class SysMessageServiceImpl implements ISysMessageService { |
| | | |
| | | private static final Logger log = LoggerFactory.getLogger(SysMessageServiceImpl.class); |
| | | |
| | | @Autowired |
| | | private SysMessageMapper sysMessageMapper; |
| | | |
| | | @Autowired |
| | | private SysUserMapper sysUserMapper; |
| | | |
| | | @Autowired |
| | | private SysTaskAssigneeMapper sysTaskAssigneeMapper; |
| | | |
| | | /** |
| | | * æ¥è¯¢ç³»ç»æ¶æ¯ |
| | | * |
| | | * @param messageId ç³»ç»æ¶æ¯ä¸»é® |
| | | * @return ç³»ç»æ¶æ¯ |
| | | */ |
| | | @Override |
| | | public SysMessage selectSysMessageByMessageId(Long messageId) { |
| | | return sysMessageMapper.selectSysMessageByMessageId(messageId); |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢ç³»ç»æ¶æ¯å表 |
| | | * |
| | | * @param sysMessage ç³»ç»æ¶æ¯ |
| | | * @return ç³»ç»æ¶æ¯ |
| | | */ |
| | | @Override |
| | | public List<SysMessage> selectSysMessageList(SysMessage sysMessage) { |
| | | return sysMessageMapper.selectSysMessageList(sysMessage); |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢ç¨æ·çæ¶æ¯å表 |
| | | * |
| | | * @param receiverId æ¥æ¶äººID |
| | | * @return ç³»ç»æ¶æ¯éå |
| | | */ |
| | | @Override |
| | | public List<SysMessage> selectSysMessageListByReceiverId(Long receiverId) { |
| | | return sysMessageMapper.selectSysMessageListByReceiverId(receiverId); |
| | | } |
| | | |
| | | /** |
| | | * æ¥è¯¢ç¨æ·æªè¯»æ¶æ¯æ°é |
| | | * |
| | | * @param receiverId æ¥æ¶äººID |
| | | * @return æªè¯»æ¶æ¯æ°é |
| | | */ |
| | | @Override |
| | | public int countUnreadMessageByReceiverId(Long receiverId) { |
| | | return sysMessageMapper.countUnreadMessageByReceiverId(receiverId); |
| | | } |
| | | |
| | | /** |
| | | * æ°å¢ç³»ç»æ¶æ¯ |
| | | * |
| | | * @param sysMessage ç³»ç»æ¶æ¯ |
| | | * @return ç»æ |
| | | */ |
| | | @Override |
| | | public int insertSysMessage(SysMessage sysMessage) { |
| | | if (sysMessage.getCreateTime() == null) { |
| | | sysMessage.setCreateTime(DateUtils.getNowDate()); |
| | | } |
| | | if (sysMessage.getIsRead() == null) { |
| | | sysMessage.setIsRead("0"); |
| | | } |
| | | if (sysMessage.getDelFlag() == null) { |
| | | sysMessage.setDelFlag("0"); |
| | | } |
| | | return sysMessageMapper.insertSysMessage(sysMessage); |
| | | } |
| | | |
| | | /** |
| | | * ä¿®æ¹ç³»ç»æ¶æ¯ |
| | | * |
| | | * @param sysMessage ç³»ç»æ¶æ¯ |
| | | * @return ç»æ |
| | | */ |
| | | @Override |
| | | public int updateSysMessage(SysMessage sysMessage) { |
| | | sysMessage.setUpdateTime(DateUtils.getNowDate()); |
| | | return sysMessageMapper.updateSysMessage(sysMessage); |
| | | } |
| | | |
| | | /** |
| | | * æ¹éå é¤ç³»ç»æ¶æ¯ |
| | | * |
| | | * @param messageIds éè¦å é¤çç³»ç»æ¶æ¯ä¸»é® |
| | | * @return ç»æ |
| | | */ |
| | | @Override |
| | | public int deleteSysMessageByMessageIds(Long[] messageIds) { |
| | | return sysMessageMapper.deleteSysMessageByMessageIds(messageIds); |
| | | } |
| | | |
| | | /** |
| | | * å é¤ç³»ç»æ¶æ¯ä¿¡æ¯ |
| | | * |
| | | * @param messageId ç³»ç»æ¶æ¯ä¸»é® |
| | | * @return ç»æ |
| | | */ |
| | | @Override |
| | | public int deleteSysMessageByMessageId(Long messageId) { |
| | | return sysMessageMapper.deleteSysMessageByMessageId(messageId); |
| | | } |
| | | |
| | | /** |
| | | * æ è®°æ¶æ¯ä¸ºå·²è¯» |
| | | * |
| | | * @param messageId æ¶æ¯ID |
| | | * @return ç»æ |
| | | */ |
| | | @Override |
| | | public int markMessageAsRead(Long messageId) { |
| | | return sysMessageMapper.markMessageAsRead(messageId); |
| | | } |
| | | |
| | | /** |
| | | * æ è®°ç¨æ·æææ¶æ¯ä¸ºå·²è¯» |
| | | * |
| | | * @param receiverId æ¥æ¶äººID |
| | | * @return ç»æ |
| | | */ |
| | | @Override |
| | | public int markAllMessagesAsRead(Long receiverId) { |
| | | return sysMessageMapper.markAllMessagesAsRead(receiverId); |
| | | } |
| | | |
| | | // ========== æ¶æ¯æ¨éä¸å¡æ¹æ³ ========== |
| | | |
| | | /** |
| | | * æ¨éä»»å¡å建æåæ¶æ¯ï¼ç»åå»ºäººï¼ |
| | | * |
| | | * @param task ä»»å¡å¯¹è±¡ |
| | | */ |
| | | @Override |
| | | public void pushTaskCreateMessage(SysTask task) { |
| | | try { |
| | | if (task == null || task.getCreatorId() == null) { |
| | | log.warn("ä»»å¡å¯¹è±¡æå建人IDä¸ºç©ºï¼æ æ³æ¨éå建æåæ¶æ¯"); |
| | | return; |
| | | } |
| | | |
| | | // è·ååå»ºäººä¿¡æ¯ |
| | | SysUser creator = sysUserMapper.selectUserById(task.getCreatorId()); |
| | | if (creator == null) { |
| | | log.warn("æ¾ä¸å°å建人信æ¯ï¼ç¨æ·IDï¼{}", task.getCreatorId()); |
| | | return; |
| | | } |
| | | |
| | | SysMessage message = new SysMessage(); |
| | | message.setMessageType("CREATE"); |
| | | message.setMessageTitle("ä»»å¡å建æå"); |
| | | message.setMessageContent("æ¨å建çä»»å¡å·²æåæäº¤"); |
| | | message.setTaskId(task.getTaskId()); |
| | | message.setTaskCode(task.getTaskCode()); |
| | | message.setReceiverId(task.getCreatorId()); |
| | | message.setReceiverName(creator.getNickName()); |
| | | message.setSenderId(task.getCreatorId()); |
| | | message.setSenderName("ç³»ç»"); |
| | | |
| | | insertSysMessage(message); |
| | | log.info("æ¨éä»»å¡å建æåæ¶æ¯ï¼ä»»å¡ç¼å·ï¼{}ï¼æ¥æ¶äººï¼{}", task.getTaskCode(), creator.getNickName()); |
| | | } catch (Exception e) { |
| | | log.error("æ¨éä»»å¡å建æåæ¶æ¯å¤±è´¥", e); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ¨éä»»å¡åé
æ¶æ¯ï¼ç»æ§è¡äººï¼ |
| | | * |
| | | * @param task ä»»å¡å¯¹è±¡ |
| | | * @param assigneeIds æ§è¡äººIDå表 |
| | | */ |
| | | @Override |
| | | public void pushTaskAssignMessage(SysTask task, List<Long> assigneeIds) { |
| | | try { |
| | | if (task == null || assigneeIds == null || assigneeIds.isEmpty()) { |
| | | log.warn("ä»»å¡å¯¹è±¡ææ§è¡äººIDåè¡¨ä¸ºç©ºï¼æ æ³æ¨éä»»å¡åé
æ¶æ¯"); |
| | | return; |
| | | } |
| | | |
| | | // è·ååå»ºäººä¿¡æ¯ |
| | | SysUser creator = null; |
| | | if (task.getCreatorId() != null) { |
| | | creator = sysUserMapper.selectUserById(task.getCreatorId()); |
| | | } |
| | | |
| | | String senderName = (creator != null && StringUtils.isNotEmpty(creator.getNickName())) |
| | | ? creator.getNickName() : "ç³»ç»"; |
| | | |
| | | // ç»æ¯ä¸ªæ§è¡äººåéæ¶æ¯ |
| | | for (Long assigneeId : assigneeIds) { |
| | | SysUser assignee = sysUserMapper.selectUserById(assigneeId); |
| | | if (assignee == null) { |
| | | log.warn("æ¾ä¸å°æ§è¡äººä¿¡æ¯ï¼ç¨æ·IDï¼{}", assigneeId); |
| | | continue; |
| | | } |
| | | |
| | | SysMessage message = new SysMessage(); |
| | | message.setMessageType("PUSH"); |
| | | message.setMessageTitle("任塿¨é"); |
| | | message.setMessageContent("æ¨ææ°çä»»å¡ï¼è¯·åæ¶å¤ç"); |
| | | message.setTaskId(task.getTaskId()); |
| | | message.setTaskCode(task.getTaskCode()); |
| | | message.setReceiverId(assigneeId); |
| | | message.setReceiverName(assignee.getNickName()); |
| | | message.setSenderId(task.getCreatorId()); |
| | | message.setSenderName(senderName); |
| | | |
| | | insertSysMessage(message); |
| | | log.info("æ¨éä»»å¡åé
æ¶æ¯ï¼ä»»å¡ç¼å·ï¼{}ï¼æ¥æ¶äººï¼{}", task.getTaskCode(), assignee.getNickName()); |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("æ¨éä»»å¡åé
æ¶æ¯å¤±è´¥", e); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ¨éä»»å¡ç¶æåæ´æ¶æ¯ï¼ç»ç¸å
³äººåï¼ |
| | | * |
| | | * @param task ä»»å¡å¯¹è±¡ |
| | | * @param oldStatus æ§ç¶æ |
| | | * @param newStatus æ°ç¶æ |
| | | */ |
| | | @Override |
| | | public void pushTaskStatusChangeMessage(SysTask task, String oldStatus, String newStatus) { |
| | | try { |
| | | if (task == null || StringUtils.isEmpty(newStatus)) { |
| | | log.warn("ä»»å¡å¯¹è±¡ææ°ç¶æä¸ºç©ºï¼æ æ³æ¨éç¶æåæ´æ¶æ¯"); |
| | | return; |
| | | } |
| | | |
| | | // æå»ºç¶æåæ´å
容 |
| | | String statusContent = getStatusChangeContent(newStatus); |
| | | |
| | | // æ¥è¯¢ä»»å¡çæææ§è¡äºº |
| | | List<SysTaskAssignee> assignees = sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(task.getTaskId()); |
| | | |
| | | if (assignees != null && !assignees.isEmpty()) { |
| | | // ç»æ¯ä¸ªæ§è¡äººåéæ¶æ¯ |
| | | for (SysTaskAssignee assignee : assignees) { |
| | | SysUser user = sysUserMapper.selectUserById(assignee.getUserId()); |
| | | if (user == null) { |
| | | log.warn("æ¾ä¸å°æ§è¡äººä¿¡æ¯ï¼ç¨æ·IDï¼{}", assignee.getUserId()); |
| | | continue; |
| | | } |
| | | |
| | | SysMessage message = new SysMessage(); |
| | | message.setMessageType("STATUS"); |
| | | message.setMessageTitle("ä»»å¡ç¶æåæ´"); |
| | | message.setMessageContent(statusContent); |
| | | message.setTaskId(task.getTaskId()); |
| | | message.setTaskCode(task.getTaskCode()); |
| | | message.setReceiverId(assignee.getUserId()); |
| | | message.setReceiverName(user.getNickName()); |
| | | message.setSenderId(task.getCreatorId()); |
| | | message.setSenderName("ç³»ç»"); |
| | | |
| | | insertSysMessage(message); |
| | | log.info("æ¨éä»»å¡ç¶æåæ´æ¶æ¯ï¼ä»»å¡ç¼å·ï¼{}ï¼æ°ç¶æï¼{}ï¼æ¥æ¶äººï¼{}", |
| | | task.getTaskCode(), newStatus, user.getNickName()); |
| | | } |
| | | } |
| | | |
| | | // åæ¶ç»å建人åéæ¶æ¯ï¼å¦æåå»ºäººä¸æ¯æ§è¡äººï¼ |
| | | if (task.getCreatorId() != null) { |
| | | boolean isCreatorAlsoAssignee = assignees != null && assignees.stream() |
| | | .anyMatch(a -> a.getUserId().equals(task.getCreatorId())); |
| | | |
| | | if (!isCreatorAlsoAssignee) { |
| | | SysUser creator = sysUserMapper.selectUserById(task.getCreatorId()); |
| | | if (creator != null) { |
| | | SysMessage message = new SysMessage(); |
| | | message.setMessageType("STATUS"); |
| | | message.setMessageTitle("ä»»å¡ç¶æåæ´"); |
| | | message.setMessageContent(statusContent); |
| | | message.setTaskId(task.getTaskId()); |
| | | message.setTaskCode(task.getTaskCode()); |
| | | message.setReceiverId(task.getCreatorId()); |
| | | message.setReceiverName(creator.getNickName()); |
| | | message.setSenderId(task.getCreatorId()); |
| | | message.setSenderName("ç³»ç»"); |
| | | |
| | | insertSysMessage(message); |
| | | log.info("æ¨éä»»å¡ç¶æåæ´æ¶æ¯ç»å建人ï¼ä»»å¡ç¼å·ï¼{}ï¼æ°ç¶æï¼{}ï¼æ¥æ¶äººï¼{}", |
| | | task.getTaskCode(), newStatus, creator.getNickName()); |
| | | } |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | log.error("æ¨éä»»å¡ç¶æåæ´æ¶æ¯å¤±è´¥", e); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®ç¶æè·åç¶æåæ´å
容 |
| | | * |
| | | * @param status ä»»å¡ç¶æ |
| | | * @return ç¶æåæ´å
容 |
| | | */ |
| | | private String getStatusChangeContent(String status) { |
| | | switch (status) { |
| | | case "PENDING": |
| | | return "ä»»å¡ç¶æåæ´ä¸ºï¼å¾
å¤ç"; |
| | | case "DEPARTED": |
| | | return "ä»»å¡ç¶æåæ´ä¸ºï¼å·²åºå"; |
| | | case "ARRIVED": |
| | | return "ä»»å¡ç¶æåæ´ä¸ºï¼å·²å°è¾¾"; |
| | | case "RETURNING": |
| | | return "ä»»å¡ç¶æåæ´ä¸ºï¼è¿ç¨ä¸"; |
| | | case "COMPLETED": |
| | | return "ä»»å¡ç¶æåæ´ä¸ºï¼å·²å®æ"; |
| | | case "CANCELLED": |
| | | return "ä»»å¡ç¶æåæ´ä¸ºï¼å·²åæ¶"; |
| | | default: |
| | | return "ä»»å¡ç¶æå·²æ´æ°"; |
| | | } |
| | | } |
| | | } |
| | |
| | | import com.ruoyi.system.domain.VehicleInfo; |
| | | import com.ruoyi.system.service.ISysTaskService; |
| | | import com.ruoyi.system.service.ILegacySystemSyncService; |
| | | import com.ruoyi.system.event.TaskCreatedEvent; |
| | | import com.ruoyi.system.event.TaskAssignedEvent; |
| | | import com.ruoyi.system.event.TaskStatusChangedEvent; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.context.ApplicationEventPublisher; |
| | | |
| | | /** |
| | | * ä»»å¡ç®¡çServiceä¸å¡å±å¤ç |
| | |
| | | |
| | | @Autowired(required = false) |
| | | private ILegacySystemSyncService legacySystemSyncService; |
| | | |
| | | @Autowired |
| | | private ApplicationEventPublisher eventPublisher; |
| | | |
| | | /** |
| | | * æ¥è¯¢ä»»å¡ç®¡ç |
| | |
| | | "ä»»å¡ç±»åï¼" + createVO.getTaskType(), SecurityUtils.getUserId(), SecurityUtils.getUsername()); |
| | | } |
| | | |
| | | // åå¸ä»»å¡å建äºä»¶ |
| | | if (result > 0) { |
| | | eventPublisher.publishEvent(new TaskCreatedEvent( |
| | | this, |
| | | task.getTaskId(), |
| | | task.getTaskCode(), |
| | | task.getTaskType(), |
| | | task.getCreatorId(), |
| | | SecurityUtils.getUsername() |
| | | )); |
| | | } |
| | | |
| | | // åå¸ä»»å¡åé
äºä»¶ |
| | | if (result > 0 && createVO.getAssignees() != null && !createVO.getAssignees().isEmpty()) { |
| | | List<Long> assigneeIds = createVO.getAssignees().stream() |
| | | .map(assignee -> assignee.getUserId()) |
| | | .collect(Collectors.toList()); |
| | | List<String> assigneeNames = createVO.getAssignees().stream() |
| | | .map(assignee -> assignee.getUserName()) |
| | | .collect(Collectors.toList()); |
| | | |
| | | eventPublisher.publishEvent(new TaskAssignedEvent( |
| | | this, |
| | | task.getTaskId(), |
| | | task.getTaskCode(), |
| | | assigneeIds, |
| | | assigneeNames, |
| | | SecurityUtils.getUserId(), |
| | | SecurityUtils.getUsername() |
| | | )); |
| | | } |
| | | |
| | | // 弿¥åæ¥æ¥æè½¬è¿ä»»å¡å°æ§ç³»ç» |
| | | if (result > 0 && "EMERGENCY_TRANSFER".equals(createVO.getTaskType()) && legacySystemSyncService != null) { |
| | | final Long finalTaskId = task.getTaskId(); |
| | |
| | | @Override |
| | | @Transactional |
| | | public int assignTask(Long taskId, Long assigneeId, String remark) { |
| | | SysTask task = new SysTask(); |
| | | task.setTaskId(taskId); |
| | | task.setAssigneeId(assigneeId); |
| | | task.setUpdateBy(SecurityUtils.getUsername()); |
| | | task.setUpdateTime(DateUtils.getNowDate()); |
| | | SysTask task = sysTaskMapper.selectSysTaskByTaskId(taskId); |
| | | if (task == null) { |
| | | throw new RuntimeException("ä»»å¡ä¸åå¨"); |
| | | } |
| | | |
| | | int result = sysTaskMapper.assignTask(task); |
| | | SysTask updateTask = new SysTask(); |
| | | updateTask.setTaskId(taskId); |
| | | updateTask.setAssigneeId(assigneeId); |
| | | updateTask.setUpdateBy(SecurityUtils.getUsername()); |
| | | updateTask.setUpdateTime(DateUtils.getNowDate()); |
| | | |
| | | int result = sysTaskMapper.assignTask(updateTask); |
| | | |
| | | // è®°å½æä½æ¥å¿ |
| | | if (result > 0) { |
| | | recordTaskLog(taskId, "ASSIGN", "åé
ä»»å¡", null, |
| | | "åé
ç»ç¨æ·IDï¼" + assigneeId + "ï¼å¤æ³¨ï¼" + remark, |
| | | SecurityUtils.getUserId(), SecurityUtils.getUsername()); |
| | | } |
| | | |
| | | // åå¸ä»»å¡åé
äºä»¶ |
| | | if (result > 0) { |
| | | List<Long> assigneeIds = new ArrayList<>(); |
| | | assigneeIds.add(assigneeId); |
| | | |
| | | eventPublisher.publishEvent(new TaskAssignedEvent( |
| | | this, |
| | | task.getTaskId(), |
| | | task.getTaskCode(), |
| | | assigneeIds, |
| | | null, // å§åå表å¨çå¬å¨ä¸æ¥è¯¢ |
| | | SecurityUtils.getUserId(), |
| | | SecurityUtils.getUsername() |
| | | )); |
| | | } |
| | | |
| | | return result; |
| | |
| | | locationLog); |
| | | } |
| | | |
| | | // åå¸ä»»å¡ç¶æåæ´äºä»¶ |
| | | if (result > 0) { |
| | | // æ¥è¯¢ä»»å¡çæææ§è¡äºº |
| | | List<SysTaskAssignee> assignees = sysTaskAssigneeMapper.selectSysTaskAssigneeByTaskId(taskId); |
| | | List<Long> assigneeIds = null; |
| | | if (assignees != null && !assignees.isEmpty()) { |
| | | assigneeIds = assignees.stream() |
| | | .map(SysTaskAssignee::getUserId) |
| | | .collect(Collectors.toList()); |
| | | } |
| | | |
| | | eventPublisher.publishEvent(new TaskStatusChangedEvent( |
| | | this, |
| | | oldTask.getTaskId(), |
| | | oldTask.getTaskCode(), |
| | | oldTaskStatus.getCode(), |
| | | newStatus.getCode(), |
| | | oldTaskStatus.getInfo(), |
| | | newStatus.getInfo(), |
| | | assigneeIds, |
| | | oldTask.getCreatorId() |
| | | )); |
| | | } |
| | | |
| | | return result; |
| | | } |
| | | |
| New file |
| | |
| | | <?xml version="1.0" encoding="UTF-8" ?> |
| | | <!DOCTYPE mapper |
| | | PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
| | | "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.system.mapper.SysMessageMapper"> |
| | | |
| | | <resultMap type="SysMessage" id="SysMessageResult"> |
| | | <result property="messageId" column="message_id" /> |
| | | <result property="messageType" column="message_type" /> |
| | | <result property="messageTitle" column="message_title" /> |
| | | <result property="messageContent" column="message_content" /> |
| | | <result property="taskId" column="task_id" /> |
| | | <result property="taskCode" column="task_code" /> |
| | | <result property="receiverId" column="receiver_id" /> |
| | | <result property="receiverName" column="receiver_name" /> |
| | | <result property="senderId" column="sender_id" /> |
| | | <result property="senderName" column="sender_name" /> |
| | | <result property="isRead" column="is_read" /> |
| | | <result property="readTime" column="read_time" /> |
| | | <result property="createTime" column="create_time" /> |
| | | <result property="updateTime" column="update_time" /> |
| | | <result property="delFlag" column="del_flag" /> |
| | | </resultMap> |
| | | |
| | | <sql id="selectSysMessageVo"> |
| | | select message_id, message_type, message_title, message_content, task_id, task_code, |
| | | receiver_id, receiver_name, sender_id, sender_name, is_read, read_time, |
| | | create_time, update_time, del_flag |
| | | from sys_message |
| | | </sql> |
| | | |
| | | <select id="selectSysMessageList" parameterType="SysMessage" resultMap="SysMessageResult"> |
| | | <include refid="selectSysMessageVo"/> |
| | | <where> |
| | | del_flag = '0' |
| | | <if test="messageType != null and messageType != ''"> and message_type = #{messageType}</if> |
| | | <if test="receiverId != null "> and receiver_id = #{receiverId}</if> |
| | | <if test="taskId != null "> and task_id = #{taskId}</if> |
| | | <if test="isRead != null and isRead != ''"> and is_read = #{isRead}</if> |
| | | </where> |
| | | order by is_read asc, create_time desc |
| | | </select> |
| | | |
| | | <select id="selectSysMessageByMessageId" parameterType="Long" resultMap="SysMessageResult"> |
| | | <include refid="selectSysMessageVo"/> |
| | | where message_id = #{messageId} and del_flag = '0' |
| | | </select> |
| | | |
| | | <select id="selectSysMessageListByReceiverId" parameterType="Long" resultMap="SysMessageResult"> |
| | | <include refid="selectSysMessageVo"/> |
| | | where receiver_id = #{receiverId} and del_flag = '0' |
| | | order by is_read asc, create_time desc |
| | | </select> |
| | | |
| | | <select id="countUnreadMessageByReceiverId" parameterType="Long" resultType="int"> |
| | | select count(*) from sys_message |
| | | where receiver_id = #{receiverId} and is_read = '0' and del_flag = '0' |
| | | </select> |
| | | |
| | | <insert id="insertSysMessage" parameterType="SysMessage" useGeneratedKeys="true" keyProperty="messageId"> |
| | | insert into sys_message |
| | | <trim prefix="(" suffix=")" suffixOverrides=","> |
| | | <if test="messageType != null and messageType != ''">message_type,</if> |
| | | <if test="messageTitle != null and messageTitle != ''">message_title,</if> |
| | | <if test="messageContent != null and messageContent != ''">message_content,</if> |
| | | <if test="taskId != null">task_id,</if> |
| | | <if test="taskCode != null and taskCode != ''">task_code,</if> |
| | | <if test="receiverId != null">receiver_id,</if> |
| | | <if test="receiverName != null and receiverName != ''">receiver_name,</if> |
| | | <if test="senderId != null">sender_id,</if> |
| | | <if test="senderName != null and senderName != ''">sender_name,</if> |
| | | <if test="isRead != null">is_read,</if> |
| | | <if test="readTime != null">read_time,</if> |
| | | <if test="createTime != null">create_time,</if> |
| | | <if test="delFlag != null">del_flag,</if> |
| | | </trim> |
| | | <trim prefix="values (" suffix=")" suffixOverrides=","> |
| | | <if test="messageType != null and messageType != ''">#{messageType},</if> |
| | | <if test="messageTitle != null and messageTitle != ''">#{messageTitle},</if> |
| | | <if test="messageContent != null and messageContent != ''">#{messageContent},</if> |
| | | <if test="taskId != null">#{taskId},</if> |
| | | <if test="taskCode != null and taskCode != ''">#{taskCode},</if> |
| | | <if test="receiverId != null">#{receiverId},</if> |
| | | <if test="receiverName != null and receiverName != ''">#{receiverName},</if> |
| | | <if test="senderId != null">#{senderId},</if> |
| | | <if test="senderName != null and senderName != ''">#{senderName},</if> |
| | | <if test="isRead != null">#{isRead},</if> |
| | | <if test="readTime != null">#{readTime},</if> |
| | | <if test="createTime != null">#{createTime},</if> |
| | | <if test="delFlag != null">#{delFlag},</if> |
| | | </trim> |
| | | </insert> |
| | | |
| | | <update id="updateSysMessage" parameterType="SysMessage"> |
| | | update sys_message |
| | | <trim prefix="SET" suffixOverrides=","> |
| | | <if test="messageType != null and messageType != ''">message_type = #{messageType},</if> |
| | | <if test="messageTitle != null and messageTitle != ''">message_title = #{messageTitle},</if> |
| | | <if test="messageContent != null and messageContent != ''">message_content = #{messageContent},</if> |
| | | <if test="taskId != null">task_id = #{taskId},</if> |
| | | <if test="taskCode != null and taskCode != ''">task_code = #{taskCode},</if> |
| | | <if test="receiverId != null">receiver_id = #{receiverId},</if> |
| | | <if test="receiverName != null and receiverName != ''">receiver_name = #{receiverName},</if> |
| | | <if test="senderId != null">sender_id = #{senderId},</if> |
| | | <if test="senderName != null and senderName != ''">sender_name = #{senderName},</if> |
| | | <if test="isRead != null">is_read = #{isRead},</if> |
| | | <if test="readTime != null">read_time = #{readTime},</if> |
| | | <if test="updateTime != null">update_time = #{updateTime},</if> |
| | | <if test="delFlag != null">del_flag = #{delFlag},</if> |
| | | </trim> |
| | | where message_id = #{messageId} |
| | | </update> |
| | | |
| | | <delete id="deleteSysMessageByMessageId" parameterType="Long"> |
| | | update sys_message set del_flag = '1' where message_id = #{messageId} |
| | | </delete> |
| | | |
| | | <delete id="deleteSysMessageByMessageIds" parameterType="Long"> |
| | | update sys_message set del_flag = '1' where message_id in |
| | | <foreach item="messageId" collection="array" open="(" separator="," close=")"> |
| | | #{messageId} |
| | | </foreach> |
| | | </delete> |
| | | |
| | | <update id="markMessageAsRead" parameterType="Long"> |
| | | update sys_message |
| | | set is_read = '1', read_time = now() |
| | | where message_id = #{messageId} and del_flag = '0' |
| | | </update> |
| | | |
| | | <update id="markAllMessagesAsRead" parameterType="Long"> |
| | | update sys_message |
| | | set is_read = '1', read_time = now() |
| | | where receiver_id = #{receiverId} and is_read = '0' and del_flag = '0' |
| | | </update> |
| | | |
| | | </mapper> |
| New file |
| | |
| | | -- ---------------------------- |
| | | -- ç³»ç»æ¶æ¯è¡¨ |
| | | -- ---------------------------- |
| | | DROP TABLE IF EXISTS `sys_message`; |
| | | CREATE TABLE `sys_message` ( |
| | | `message_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'æ¶æ¯ID', |
| | | `message_type` varchar(20) NOT NULL COMMENT 'æ¶æ¯ç±»åï¼CREATE-å建æå,PUSH-任塿¨é,STATUS-ç¶æåæ´,ASSIGN-åé
ä»»å¡', |
| | | `message_title` varchar(100) NOT NULL COMMENT 'æ¶æ¯æ é¢', |
| | | `message_content` varchar(500) NOT NULL COMMENT 'æ¶æ¯å
容', |
| | | `task_id` bigint(20) DEFAULT NULL COMMENT 'å
³èä»»å¡ID', |
| | | `task_code` varchar(50) DEFAULT NULL COMMENT 'ä»»å¡ç¼å·', |
| | | `receiver_id` bigint(20) NOT NULL COMMENT 'æ¥æ¶äººID', |
| | | `receiver_name` varchar(50) DEFAULT NULL COMMENT 'æ¥æ¶äººå§å', |
| | | `sender_id` bigint(20) DEFAULT NULL COMMENT 'åé人ID', |
| | | `sender_name` varchar(50) DEFAULT NULL COMMENT 'åé人å§å', |
| | | `is_read` char(1) DEFAULT '0' COMMENT 'æ¯å¦å·²è¯»ï¼0-æªè¯»,1-已读', |
| | | `read_time` datetime DEFAULT NULL COMMENT 'è¯»åæ¶é´', |
| | | `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'å建æ¶é´', |
| | | `update_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ´æ°æ¶é´', |
| | | `del_flag` char(1) DEFAULT '0' COMMENT 'å 餿 å¿ï¼0-æ£å¸¸,1-å é¤', |
| | | PRIMARY KEY (`message_id`), |
| | | KEY `idx_receiver_id` (`receiver_id`), |
| | | KEY `idx_task_id` (`task_id`), |
| | | KEY `idx_create_time` (`create_time`), |
| | | KEY `idx_is_read` (`is_read`) |
| | | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ç³»ç»æ¶æ¯è¡¨'; |