/** 
 | 
 * Copyright (c) 2019 人人开源 All rights reserved. 
 | 
 * 
 | 
 * https://www.renren.io 
 | 
 * 
 | 
 * 版权所有,侵权必究! 
 | 
 */ 
 | 
package com.zt.modules.message.service; 
 | 
  
 | 
import java.util.ArrayList; 
 | 
import java.util.Date; 
 | 
import java.util.List; 
 | 
import java.util.stream.Collectors; 
 | 
  
 | 
import org.apache.commons.lang3.StringUtils; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.stereotype.Service; 
 | 
import org.springframework.transaction.annotation.Transactional; 
 | 
  
 | 
import com.zt.common.db.query.QueryFilter; 
 | 
import com.zt.common.service.BaseService; 
 | 
import com.zt.core.context.UserContext; 
 | 
import com.zt.core.sys.service.ISysUserService; 
 | 
import com.zt.modules.message.dao.SysNoticeDao; 
 | 
import com.zt.modules.message.enums.NoticeReadStatus; 
 | 
import com.zt.modules.message.enums.NoticeStatus; 
 | 
import com.zt.modules.message.enums.ReceiverType; 
 | 
import com.zt.modules.message.model.SysNotice; 
 | 
import com.zt.modules.message.model.SysNoticeUser; 
 | 
import com.zt.modules.message.websocket.WebSocketServer; 
 | 
import com.zt.modules.message.websocket.data.MessageData; 
 | 
  
 | 
/** 
 | 
 * 通知管理 
 | 
 * 
 | 
 * @author hehz 
 | 
 */ 
 | 
@Service 
 | 
public class SysNoticeService extends BaseService<SysNoticeDao, SysNotice> { 
 | 
    @Autowired 
 | 
    private SysNoticeUserService sysNoticeUserService; 
 | 
    @Autowired 
 | 
    private ISysUserService sysUserService; 
 | 
    @Autowired 
 | 
    private WebSocketServer webSocketServer; 
 | 
  
 | 
    public List<SysNotice> page(QueryFilter queryFilter) { 
 | 
        return super.query(queryFilter); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 获取我的通知列表 
 | 
     */ 
 | 
    public List<SysNotice> getMyNoticePage(QueryFilter queryFilter) { 
 | 
        // 查询 
 | 
        List<SysNotice> list = baseDao.getMyNoticeList(UserContext.getUserId()); 
 | 
  
 | 
        return queryFilter.getPageList(list); 
 | 
    } 
 | 
  
 | 
    @Transactional(rollbackFor = Exception.class) 
 | 
    public void insert(SysNotice entity) { 
 | 
        // 更新发送者信息 
 | 
        if (entity.getStatus() == NoticeStatus.SEND.value()) { 
 | 
            entity.setSenderId(UserContext.getUser().getId()); 
 | 
            entity.setSendDate(new Date()); 
 | 
        } 
 | 
        entity.setReceiverIds(StringUtils.join(entity.getReceiverList(), ",")); 
 | 
        baseDao.insert(entity); 
 | 
  
 | 
        // 发送通知 
 | 
        sendNotice(entity); 
 | 
    } 
 | 
  
 | 
    @Transactional(rollbackFor = Exception.class) 
 | 
    public void update(SysNotice entity) { 
 | 
        // 更新发送者信息 
 | 
        if (entity.getStatus() == NoticeStatus.SEND.value()) { 
 | 
            entity.setSenderId(UserContext.getUser().getId()); 
 | 
            entity.setSendDate(new Date()); 
 | 
        } 
 | 
        entity.setReceiverIds(StringUtils.join(entity.getReceiverList(), ",")); 
 | 
        baseDao.updateById(entity); 
 | 
  
 | 
        // 发送通知 
 | 
        sendNotice(entity); 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 发送通知 
 | 
     */ 
 | 
    public void sendNotice(SysNotice notice) { 
 | 
        // 如果是草稿,在不发送通知 
 | 
        if (notice.getStatus() == NoticeStatus.DRAFT.value()) { 
 | 
            return; 
 | 
        } 
 | 
  
 | 
        List<Long> userIdList = new ArrayList<>(); 
 | 
  
 | 
        if (ReceiverType.DEPT.getValue().equals(notice.getReceiverType())) {// 部门 
 | 
            userIdList.addAll(sysUserService.getByDeptIds(notice.getReceiverList()).stream().map(user -> user.getId()) 
 | 
                    .collect(Collectors.toList())); 
 | 
        } else { // 选中用户 
 | 
            userIdList.addAll(notice.getReceiverList()); 
 | 
        } 
 | 
        if (userIdList.size() > 0) { 
 | 
            // 发送给用户 
 | 
            userIdList.forEach(userId -> { 
 | 
                SysNoticeUser noticeUser = new SysNoticeUser().setNoticeId(notice.getId()).setReceiverId(userId) 
 | 
                        .setStatus(NoticeReadStatus.UNREAD.value()); 
 | 
  
 | 
                sysNoticeUserService.insert(noticeUser); 
 | 
            }); 
 | 
  
 | 
            // 通过WebSocket,提示选中用户,有新通知 
 | 
            MessageData<String> message = new MessageData<String>().msg(notice.getTitle()); 
 | 
            webSocketServer.sendMessage(userIdList, message); 
 | 
        } 
 | 
    } 
 | 
} 
 |