package io.dataease.service.message; import io.dataease.base.domain.*; import io.dataease.base.mapper.SysMsgChannelMapper; import io.dataease.base.mapper.SysMsgMapper; import io.dataease.base.mapper.SysMsgSettingMapper; import io.dataease.base.mapper.SysMsgTypeMapper; import io.dataease.base.mapper.ext.ExtSysMsgMapper; import io.dataease.commons.constants.SysMsgConstants; import io.dataease.commons.utils.AuthUtils; import io.dataease.commons.utils.CommonBeanFactory; import io.dataease.controller.sys.request.BatchSettingRequest; import io.dataease.controller.sys.request.MsgRequest; import io.dataease.controller.sys.request.MsgSettingRequest; import io.dataease.controller.sys.response.MsgGridDto; import io.dataease.controller.sys.response.SettingTreeNode; import io.dataease.controller.sys.response.SubscribeNode; import io.dataease.service.system.SystemParameterService; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @Service public class SysMsgService { private static int overDays = 30; @Resource private SysMsgMapper sysMsgMapper; @Resource private ExtSysMsgMapper extSysMsgMapper; @Resource private SysMsgTypeMapper sysMsgTypeMapper; @Resource private SysMsgChannelMapper sysMsgChannelMapper; @Resource private SysMsgSettingMapper sysMsgSettingMapper; @Autowired private SystemParameterService systemParameterService; /* public List query(Long userId, MsgRequest msgRequest) { String orderClause = " create_time desc"; SysMsgExample example = new SysMsgExample(); SysMsgExample.Criteria criteria = example.createCriteria(); criteria.andUserIdEqualTo(userId); List orders = msgRequest.getOrders(); if (CollectionUtils.isNotEmpty(orders)) { orderClause = String.join(", ", orders); } if (ObjectUtils.isNotEmpty(msgRequest.getType())) { criteria.andTypeIdEqualTo(msgRequest.getType()); } if (ObjectUtils.isNotEmpty(msgRequest.getStatus())) { criteria.andStatusEqualTo(msgRequest.getStatus()); } criteria.andCreateTimeGreaterThanOrEqualTo(overTime()); example.setOrderByClause(orderClause); List sysMsgs = sysMsgMapper.selectByExample(example); return sysMsgs; } */ public List queryGrid(Long userId, MsgRequest msgRequest, List typeIds, Long startTime) { String orderClause = " create_time desc"; SysMsgExample example = new SysMsgExample(); SysMsgExample.Criteria criteria = example.createCriteria(); criteria.andUserIdEqualTo(userId); List orders = msgRequest.getOrders(); if (CollectionUtils.isNotEmpty(orders)) { orderClause = String.join(", ", orders); } /*if (ObjectUtils.isNotEmpty(msgRequest.getType())) { SysMsgTypeExample sysMsgTypeExample = new SysMsgTypeExample(); sysMsgTypeExample.createCriteria().andPidEqualTo(msgRequest.getType()); List sysMsgTypes = sysMsgTypeMapper.selectByExample(sysMsgTypeExample); List typeIds = sysMsgTypes.stream().map(SysMsgType::getMsgTypeId).collect(Collectors.toList()); criteria.andTypeIdIn(typeIds); }*/ if (CollectionUtils.isNotEmpty(typeIds)){ criteria.andTypeIdIn(typeIds); } if (ObjectUtils.isNotEmpty(msgRequest.getStatus())) { criteria.andStatusEqualTo(msgRequest.getStatus()); } criteria.andCreateTimeGreaterThanOrEqualTo(startTime); /* criteria.andCreateTimeGreaterThanOrEqualTo(overTime()); */ example.setOrderByClause(orderClause); List msgGridDtos = extSysMsgMapper.queryGrid(example); return msgGridDtos; } public Long queryCount(Long userId) { SysMsgExample example = new SysMsgExample(); SysMsgExample.Criteria criteria = example.createCriteria(); criteria.andUserIdEqualTo(userId).andStatusEqualTo(false); criteria.andCreateTimeGreaterThanOrEqualTo(overTime()); return sysMsgMapper.countByExample(example); } public void setReaded(Long msgId) { SysMsg sysMsg = new SysMsg(); sysMsg.setMsgId(msgId); sysMsg.setStatus(true); sysMsg.setReadTime(System.currentTimeMillis()); sysMsgMapper.updateByPrimaryKeySelective(sysMsg); } public void setBatchReaded(List msgIds) { extSysMsgMapper.batchStatus(msgIds, System.currentTimeMillis()); } public void batchDelete(List msgIds) { extSysMsgMapper.batchDelete(msgIds); } public void save(SysMsg sysMsg) { sysMsgMapper.insert(sysMsg); } public List treeNodes() { SysMsgService proxy = CommonBeanFactory.getBean(SysMsgService.class); List sysMsgTypes = proxy.queryMsgTypes(); return buildTree(sysMsgTypes); } @Cacheable(SysMsgConstants.SYS_MSG_TYPE) public List queryMsgTypes() { SysMsgTypeExample example = new SysMsgTypeExample(); List sysMsgTypes = sysMsgTypeMapper.selectByExample(example); return sysMsgTypes; } private List buildTree(List lists){ List rootNodes = new ArrayList<>(); lists.forEach(node -> { SettingTreeNode settingTreeNode = convert(node); if (isParent(node)) { rootNodes.add(settingTreeNode); } lists.forEach(tNode -> { if (tNode.getPid() == settingTreeNode.getId()) { if (settingTreeNode.getChildren() == null) { settingTreeNode.setChildren(new ArrayList()); } settingTreeNode.getChildren().add(convert(tNode)); } }); }); return rootNodes; } private Boolean isParent(SysMsgType typeNode) { return typeNode.getPid() == 0L; } public SettingTreeNode convert(SysMsgType typeNode) { SettingTreeNode settingTreeNode = new SettingTreeNode(); settingTreeNode.setId(typeNode.getMsgTypeId()); settingTreeNode.setName(typeNode.getTypeName()); return settingTreeNode; } @Cacheable(SysMsgConstants.SYS_MSG_CHANNEL) public List channelList() { SysMsgChannelExample example = new SysMsgChannelExample(); return sysMsgChannelMapper.selectByExample(example); } public List settingList() { Long userId = AuthUtils.getUser().getUserId(); SysMsgSettingExample example = new SysMsgSettingExample(); example.createCriteria().andUserIdEqualTo(userId); List sysMsgSettings = sysMsgSettingMapper.selectByExample(example); sysMsgSettings = addDefault(sysMsgSettings); return sysMsgSettings; } public List defaultSettings() { SysMsgSetting sysMsgSetting1 = new SysMsgSetting(); sysMsgSetting1.setTypeId(2L); sysMsgSetting1.setChannelId(1L); sysMsgSetting1.setEnable(true); // sysMsgSetting1.setUserId(userId); SysMsgSetting sysMsgSetting2 = new SysMsgSetting(); sysMsgSetting2.setTypeId(6L); sysMsgSetting2.setChannelId(1L); sysMsgSetting2.setEnable(true); //sysMsgSetting2.setUserId(userId); List lists = new ArrayList<>(); lists.add(sysMsgSetting1); lists.add(sysMsgSetting2); return lists; } /** * 修改了订阅信息 需要清除缓存 * @param request * @param userId */ @Transactional @CacheEvict(value = SysMsgConstants.SYS_MSG_USER_SUBSCRIBE, key = "#userId") public void updateSetting(MsgSettingRequest request, Long userId) { Long typeId = request.getTypeId(); Long channelId = request.getChannelId(); // Long userId = AuthUtils.getUser().getUserId(); SysMsgSettingExample example = new SysMsgSettingExample(); example.createCriteria().andUserIdEqualTo(userId).andTypeIdEqualTo(typeId).andChannelIdEqualTo(channelId); List sysMsgSettings = sysMsgSettingMapper.selectByExample(example); if (CollectionUtils.isNotEmpty(sysMsgSettings)) { sysMsgSettings.forEach(setting -> { setting.setEnable(!setting.getEnable()); sysMsgSettingMapper.updateByPrimaryKeySelective(setting); }); return; } SysMsgSetting sysMsgSetting = new SysMsgSetting(); sysMsgSetting.setChannelId(channelId); sysMsgSetting.setTypeId(typeId); List defaultSettings = defaultSettings(); sysMsgSetting.setEnable(!defaultSettings.stream().anyMatch(setting -> setting.match(sysMsgSetting))); sysMsgSetting.setUserId(userId); sysMsgSettingMapper.insert(sysMsgSetting); } @Transactional @CacheEvict(value = SysMsgConstants.SYS_MSG_USER_SUBSCRIBE, key = "#userId") public void batchUpdate(BatchSettingRequest request, Long userId) { // 先删除 SysMsgSettingExample example = new SysMsgSettingExample(); example.createCriteria().andUserIdEqualTo(userId).andChannelIdEqualTo(request.getChannelId()).andTypeIdIn(request.getTypeIds()); sysMsgSettingMapper.deleteByExample(example); // 再写入 List settings = request.getTypeIds().stream().map(typeId -> { SysMsgSetting sysMsgSetting = new SysMsgSetting(); sysMsgSetting.setUserId(userId); sysMsgSetting.setTypeId(typeId); sysMsgSetting.setChannelId(request.getChannelId()); sysMsgSetting.setEnable(request.getEnable()); return sysMsgSetting; }).collect(Collectors.toList()); extSysMsgMapper.batchInsert(settings); } public void sendMsg(Long userId, Long typeId, Long channelId, String content, String param) { SysMsg sysMsg = new SysMsg(); sysMsg.setUserId(userId); sysMsg.setTypeId(typeId); sysMsg.setContent(content); sysMsg.setStatus(false); sysMsg.setCreateTime(System.currentTimeMillis()); sysMsg.setParam(param); save(sysMsg); } /** * 查询用户订阅的消息 并缓存 * @param userId * @return */ @Cacheable(value = SysMsgConstants.SYS_MSG_USER_SUBSCRIBE, key = "#userId") public List subscribes(Long userId) { SysMsgSettingExample example = new SysMsgSettingExample(); /*example.createCriteria().andUserIdEqualTo(userId).andEnableEqualTo(true);*/ example.createCriteria().andUserIdEqualTo(userId); List sysMsgSettings = sysMsgSettingMapper.selectByExample(example); // 添加默认订阅 sysMsgSettings = addDefault(sysMsgSettings); sysMsgSettings = sysMsgSettings.stream().filter(SysMsgSetting::getEnable).collect(Collectors.toList()); // sysMsgSettings.addAll(defaultSettings()); List resultLists = sysMsgSettings.stream().map(item -> { SubscribeNode subscribeNode = new SubscribeNode(); subscribeNode.setTypeId(item.getTypeId()); subscribeNode.setChannelId(item.getChannelId()); return subscribeNode; }).collect(Collectors.toList()); return resultLists; } public List addDefault(List sourceLists) { List defaultSettings = defaultSettings(); defaultSettings.forEach(setting -> { if (!sourceLists.stream().anyMatch(item -> item.match(setting))){ sourceLists.add(setting); } }); return sourceLists; } public void setAllRead() { SysMsg record = new SysMsg(); record.setStatus(true); SysMsgExample example = new SysMsgExample(); example.createCriteria().andUserIdEqualTo(AuthUtils.getUser().getUserId()).andStatusEqualTo(false); sysMsgMapper.updateByExampleSelective(record, example); } public Long overTime() { String msgTimeOut = systemParameterService.basicInfo().getMsgTimeOut(); if(StringUtils.isNotBlank(msgTimeOut)) { overDays = Integer.parseInt(msgTimeOut); } Long currentTime = System.currentTimeMillis(); long oneDayTime = 24 * 60 * 60 * 1000; long temp = overDays * oneDayTime; return currentTime - (currentTime + 8 * 60 * 60 * 1000) % oneDayTime - temp; } }