更新数字基座
build / build-push (push) Successful in 1m3s

This commit is contained in:
chenxing
2026-08-24 09:29:31 +08:00
parent 4ed43dbc05
commit a7539a4cf0
48 changed files with 2983 additions and 3 deletions
@@ -0,0 +1,118 @@
package com.yunhai.userhome.service.impl;
import com.yunhai.userhome.entity.UserMessage;
import com.yunhai.userhome.repository.UserMessageRepository;
import com.yunhai.userhome.service.IUserMessageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
/**
* 用户消息服务:行为对齐旧 UserHome UserMessageService(本地 user_message 表)。
* WS 推送态由前端轮询兜底,本服务不消费 Redis 缓存(旧工程依赖 Redis,新工程未引入)。
*/
@Service
public class UserMessageServiceImpl implements IUserMessageService {
@Autowired
private UserMessageRepository userMessageRepository;
@Override
public List<UserMessage> getUserMessageAppIds(Integer userId, Integer schId) {
return userMessageRepository.getUserMessageAppList(userId, schId);
}
@Override
public Page<UserMessage> findUserMessageByAppId(UserMessage userMessage, Pageable pageable) {
return userMessageRepository.findAll(select(userMessage), pageable);
}
@Override
public Page<UserMessage> findUserMessageByUserId(Integer userId, Pageable pageable) {
return userMessageRepository.findAll(select(userId, null), pageable);
}
@Override
public List<UserMessage> findUserMessageByUserId(Integer userId) {
// 旧版优先读 Redis 缓存,缓存缺失再查库;新工程无 Redis,直接查库(行为等价:返回该用户全部消息)
return userMessageRepository.findAll(select(userId, null), PageRequest.of(0, Integer.MAX_VALUE, Sort.by(Sort.Direction.DESC, "cDate"))).getContent();
}
@Override
public Boolean findUserMessageUnRead(Integer userId) {
return userMessageRepository.count(select(userId, false)) > 0;
}
@Override
public void updateRead(Integer userId, Integer appId) {
userMessageRepository.updateRead(userId, appId);
}
@Override
public void updateUserRead(Integer id, Integer userId) {
// 单条已读:前端按 id 移除本地列表后再调;服务端标记该条已读
userMessageRepository.updateReadById(id);
}
@Override
public void updateReadAll(Integer userId) {
userMessageRepository.updateReadAll(userId);
}
@Override
public Page<UserMessage> findUserMessageById(Integer userId, Integer page, Integer count) {
Sort sort = Sort.by(Sort.Direction.DESC, "id");
Pageable pageable = PageRequest.of(page - 1, count, sort);
return userMessageRepository.findAll(select(userId, null), pageable);
}
@Override
public void readMsgById(Integer msgId) {
userMessageRepository.updateReadById(msgId);
}
@Override
public void readMsgAll(Integer userId) {
userMessageRepository.updateReadAll(userId);
}
private Specification<UserMessage> select(UserMessage userMessage) {
return (Root<UserMessage> root, CriteriaQuery<?> query, CriteriaBuilder cb) -> {
List<Predicate> predicates = new ArrayList<>();
if (userMessage != null) {
if (userMessage.getUserId() != null) {
predicates.add(cb.equal(root.get("userId"), userMessage.getUserId()));
}
if (userMessage.getAppId() != null) {
predicates.add(cb.equal(root.get("appId"), userMessage.getAppId()));
}
}
return query.where(predicates.toArray(new Predicate[0])).getRestriction();
};
}
private Specification<UserMessage> select(Integer userId, Boolean isRead) {
return (Root<UserMessage> root, CriteriaQuery<?> query, CriteriaBuilder cb) -> {
List<Predicate> predicates = new ArrayList<>();
if (userId != null) {
predicates.add(cb.equal(root.get("userId"), userId));
}
if (isRead != null) {
predicates.add(cb.equal(root.get("isRead"), isRead));
}
return query.where(predicates.toArray(new Predicate[0])).getRestriction();
};
}
}