Files
youlai-boot/src/main/java/com/youlai/system/service/impl/NoticeServiceImpl.java
Kylin 936fc24b2e feat: 开始管理用户是否读取了消息
目前出现了BUG。我修改代码后。前端websocket收不到消息了。
2024-08-29 17:39:10 +08:00

164 lines
5.6 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.youlai.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.google.gson.*;
import com.youlai.system.model.entity.NoticeStatus;
import com.youlai.system.model.entity.SysUser;
import com.youlai.system.security.util.SecurityUtils;
import com.youlai.system.service.NoticeStatusService;
import com.youlai.system.service.SysUserService;
import com.youlai.system.service.WebsocketService;
import jodd.util.StringUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.system.mapper.NoticeMapper;
import com.youlai.system.service.NoticeService;
import com.youlai.system.model.entity.Notice;
import com.youlai.system.model.form.NoticeForm;
import com.youlai.system.model.query.NoticeQuery;
import com.youlai.system.model.vo.NoticeVO;
import com.youlai.system.converter.NoticeConverter;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
/**
* 通知公告服务实现类
*
* @author youlaitech
* @since 2024-08-27 10:31
*/
@Service
@RequiredArgsConstructor
public class NoticeServiceImpl extends ServiceImpl<NoticeMapper, Notice> implements NoticeService {
private final NoticeConverter noticeConverter;
private final WebsocketService webSocketServer;
private final NoticeStatusService noticeStatusService;
private final SysUserService sysUserService;
private final Gson gson = new GsonBuilder()
.registerTypeAdapter(LocalDateTime.class, (JsonSerializer<LocalDateTime>) (localDateTime, type, jsonSerializationContext) ->
new JsonPrimitive(localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)))
.registerTypeAdapter(LocalDateTime.class, (JsonDeserializer<LocalDateTime>) (jsonElement, type, jsonDeserializationContext) ->
LocalDateTime.parse(jsonElement.getAsString(), DateTimeFormatter.ISO_LOCAL_DATE_TIME))
.create();
private void sendWebSocketMsg(Notice notice) {
if (notice.getSendStatus() > 0) {
String jsonNotice = gson.toJson(noticeConverter.toVO(notice));
webSocketServer.sendStringToFrontend(SecurityUtils.getUsername(), jsonNotice);
List<SysUser> list = sysUserService.list();
for (SysUser sysUser : list) {
NoticeStatus noticeStatus = noticeStatusService.getOne(new LambdaQueryWrapper<NoticeStatus>().eq(NoticeStatus::getUserId, sysUser.getId()).eq(NoticeStatus::getNoticeId, notice.getId()));
if (noticeStatus == null) {
noticeStatus = new NoticeStatus();
noticeStatus.setUserId(sysUser.getId());
noticeStatus.setNoticeId(notice.getId());
noticeStatus.setReadStatus(0L);
noticeStatusService.save(noticeStatus);
}
}
}
}
/**
* 获取通知公告分页列表
*
* @param queryParams 查询参数
* @return {@link IPage<NoticeVO>} 通知公告分页列表
*/
@Override
public IPage<NoticeVO> getNoticePage(NoticeQuery queryParams) {
Page<NoticeVO> pageVO = this.baseMapper.getNoticePage(
new Page<>(queryParams.getPageNum(), queryParams.getPageSize()),
queryParams
);
return pageVO;
}
/**
* 获取通知公告表单数据
*
* @param id 通知公告ID
* @return
*/
@Override
public NoticeForm getNoticeFormData(Long id) {
Notice entity = this.getById(id);
return noticeConverter.toForm(entity);
}
/**
* 新增通知公告
*
* @param formData 通知公告表单对象
* @return
*/
@Override
public boolean saveNotice(NoticeForm formData) {
Notice entity = noticeConverter.toEntity(formData);
entity.setCreateBy(SecurityUtils.getUserId());
entity.setReleaseBy(SecurityUtils.getUserId());
entity.setUpdateBy(SecurityUtils.getUserId());
entity.setIsDelete(0);
boolean result = this.save(entity);
if (result) {
sendWebSocketMsg(entity);
}
return result;
}
/**
* 更新通知公告
*
* @param id 通知公告ID
* @param formData 通知公告表单对象
* @return
*/
@Override
public boolean updateNotice(Long id, NoticeForm formData) {
Notice entity = noticeConverter.toEntity(formData);
entity.setUpdateBy(SecurityUtils.getUserId());
entity.setIsDelete(0);
boolean result = this.updateById(entity);
if (result) {
sendWebSocketMsg(entity);
}
return result;
}
/**
* 删除通知公告
*
* @param ids 通知公告ID多个以英文逗号(,)分割
* @return
*/
@Override
public boolean deleteNotices(String ids) {
Assert.isTrue(StrUtil.isNotBlank(ids), "删除的通知公告数据为空");
// 逻辑删除
List<Long> idList = Arrays.stream(ids.split(","))
.map(Long::parseLong)
.toList();
LambdaUpdateWrapper<Notice> wrapper = new LambdaUpdateWrapper<>();
wrapper.in(Notice::getId, idList).set(Notice::getIsDelete, 1);
return this.update(wrapper);
}
}