wlzboy
6 天以前 09e6dc3fb7266620fafb5e341808a8eb36e080a1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
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 "任务状态已更新";
        }
    }
}