diff --git a/pom.xml b/pom.xml index 1c35b6880..06dcbd73a 100644 --- a/pom.xml +++ b/pom.xml @@ -102,13 +102,6 @@ - - - - com.github.xiaoymin - knife4j-spring-boot-starter - 2.0.9 - com.github.xiaoymin knife4j-springdoc-ui @@ -411,7 +404,11 @@ ruoyi-goods ${revision} - + + org.dromara + ruoyi-common-rabbitmq + ${revision} + org.springframework.boot spring-boot-starter-amqp diff --git a/ruoyi-admin/src/main/java/org/dromara/app/AppMemberController.java b/ruoyi-admin/src/main/java/org/dromara/app/AppMemberController.java index 9bbd8e6ae..3c2c7582e 100644 --- a/ruoyi-admin/src/main/java/org/dromara/app/AppMemberController.java +++ b/ruoyi-admin/src/main/java/org/dromara/app/AppMemberController.java @@ -79,7 +79,7 @@ public class AppMemberController { if (loginUser == null) { throw new ServiceException("用户未登录"); } - return R.ok(convert.toVO(service.getById(loginUser.getUserId()))); + return R.ok(service.getMemberInfo(loginUser.getUserId())); } @Tag(name = "获取会员账户表详细信息") diff --git a/ruoyi-admin/src/main/java/org/dromara/app/AppOrderController.java b/ruoyi-admin/src/main/java/org/dromara/app/AppOrderController.java index 41c07c2a8..ab2ee4cae 100644 --- a/ruoyi-admin/src/main/java/org/dromara/app/AppOrderController.java +++ b/ruoyi-admin/src/main/java/org/dromara/app/AppOrderController.java @@ -65,7 +65,7 @@ public class AppOrderController { if (result != null) { // 订单创建成功,发送消息 - orderService.sendMessage(order); +// orderService.sendMessage(order); log.info("订单创建成功,消息已发送,订单ID: {}", order.getId()); } else { log.warn("订单创建失败: {}", "返回结果为null"); diff --git a/ruoyi-admin/src/main/java/org/dromara/app/AppVlogController.java b/ruoyi-admin/src/main/java/org/dromara/app/AppVlogController.java index 142e09dbc..962de1bd6 100644 --- a/ruoyi-admin/src/main/java/org/dromara/app/AppVlogController.java +++ b/ruoyi-admin/src/main/java/org/dromara/app/AppVlogController.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.fasterxml.jackson.databind.ObjectMapper; import com.wzj.soopin.content.domain.bo.*; import com.wzj.soopin.content.domain.po.MyLikedVlog; +import com.wzj.soopin.content.domain.po.Vlog; import com.wzj.soopin.content.domain.vo.IndexVlogVO; import com.wzj.soopin.content.service.VlogService; import com.wzj.soopin.content.service.VlogUploadService; @@ -45,6 +46,16 @@ public class AppVlogController { @Tag(name = "首页视频列表") @PostMapping("/indexList") public R> indexList(@RequestBody IndexListBO bo, @RequestBody Page page) { + + try{ + LoginUser loginUser = LoginHelper.getLoginUser(); + if (loginUser == null) { + throw new ServiceException("用户未登录"); + } + bo.setUserId(String.valueOf(loginUser.getUserId())); + }catch (Exception e){ + log.error("用户没登陆", e); + } Page pages = vlogService.getIndexVlogList(bo, page); return R.ok(pages); } @@ -100,6 +111,15 @@ public class AppVlogController { } @PostMapping("publish") public R publish(@RequestBody VlogBO vlogBO) throws Exception { + + + LoginUser loginUser = LoginHelper.getLoginUser(); + if (loginUser == null) { + throw new ServiceException("用户未登录"); + } + vlogBO.setVlogerId(String.valueOf(loginUser.getUserId())); + + String url = vlogBO.getUrl(); log.info("未审核视频地址:"+url); String fileName = url.substring(url.lastIndexOf("/") + 1); @@ -137,18 +157,20 @@ public class AppVlogController { } String userId = String.valueOf(loginUser.getUserId()); - String vlogerId = params.get("vlogerId"); String vlogId = params.get("vlogId"); - if (StringUtils.isBlank(vlogerId) || StringUtils.isBlank(vlogId)) { - throw new ServiceException("参数不完整"); - } + + //获取vlog + Vlog vlog = vlogService.getVlog(vlogId); + if(vlog==null){ + throw new ServiceException("视频不存在"); + } // 我点赞的视频,关联关系保存到数据库 vlogService.userLikeVlog(userId, vlogId); // 点赞后,视频和视频发布者的获赞都会 +1 - redis.increment(REDIS_VLOGER_BE_LIKED_COUNTS + ":" + vlogerId, 1); + redis.increment(REDIS_VLOGER_BE_LIKED_COUNTS + ":" + vlog.getMemberId(), 1); redis.increment(REDIS_VLOG_BE_LIKED_COUNTS + ":" + vlogId, 1); // 我点赞的视频,需要在redis中保存关联关系 @@ -179,17 +201,18 @@ public class AppVlogController { } String userId = String.valueOf(loginUser.getUserId()); - String vlogerId = params.get("vlogerId"); String vlogId = params.get("vlogId"); - if (StringUtils.isBlank(vlogerId) || StringUtils.isBlank(vlogId)) { - throw new ServiceException("参数不完整"); + //获取vlog + Vlog vlog = vlogService.getVlog(vlogId); + if(vlog==null){ + throw new ServiceException("视频不存在"); } // 我取消点赞的视频,关联关系删除 vlogService.userUnLikeVlog(userId, vlogId); - redis.decrement(REDIS_VLOGER_BE_LIKED_COUNTS + ":" + vlogerId, 1); + redis.decrement(REDIS_VLOGER_BE_LIKED_COUNTS + ":" + vlog.getMemberId(), 1); redis.decrement(REDIS_VLOG_BE_LIKED_COUNTS + ":" + vlogId, 1); redis.del(REDIS_USER_LIKE_VLOG + ":" + userId + ":" + vlogId); diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/IndexServiceImpl.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/IndexServiceImpl.java index b4ba988bb..92aaa0333 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/IndexServiceImpl.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/IndexServiceImpl.java @@ -74,18 +74,26 @@ public class IndexServiceImpl implements IndexService { private void addCompositeStatistics(Map result) { // 商品统计 Map productCounts = productMapper.countProduct(); - result.put("productCount", productCounts.get("count2")); - result.put("productAudit", productCounts.get("count1")); + if(productCounts!=null){ + result.put("productCount", productCounts.get("count2")); + result.put("productAudit", productCounts.get("count1")); + } + // 店铺统计 Map storeCounts = sysTenantMapper.countProduct(); - result.put("storeCount", storeCounts.get("count1")); - result.put("StoreAudit", storeCounts.get("count2")); + if(storeCounts!=null){ + result.put("storeCount", storeCounts.get("count1")); + result.put("StoreAudit", storeCounts.get("count2")); + } // 订单统计 Map orderCounts = orderMapper.countOrder(); - result.put("orderCount", orderCounts.get("count1")); - result.put("orderAudit", orderCounts.get("count2")); + if(orderCounts!=null){ + result.put("orderCount", orderCounts.get("count1")); + result.put("orderAudit", orderCounts.get("count2")); + } + } /** Top20排行榜 */ diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java index 5352b118f..c2723c880 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java @@ -31,4 +31,9 @@ public interface GlobalConstants { * 三方认证 redis key */ String SOCIAL_AUTH_CODE_KEY = GLOBAL_REDIS_KEY + "social_auth_codes:"; + + /** + * 会员 redis key + */ + String MEMBER_KEY = GLOBAL_REDIS_KEY + "member:"; } diff --git a/ruoyi-common/ruoyi-common-rabbitmq/pom.xml b/ruoyi-common/ruoyi-common-rabbitmq/pom.xml index ef0edd004..9c282078d 100644 --- a/ruoyi-common/ruoyi-common-rabbitmq/pom.xml +++ b/ruoyi-common/ruoyi-common-rabbitmq/pom.xml @@ -8,7 +8,6 @@ 4.0.0 ruoyi-common-rabbitmq - ruoyi-common-rabbitmq @@ -28,6 +27,13 @@ spring-boot-starter-amqp + + + com.fasterxml.jackson.core + jackson-databind + + + diff --git a/ruoyi-common/ruoyi-common-rabbitmq/src/main/java/org/dromara/common/rabbitmq/config/properties/RabbitMQConfig.java b/ruoyi-common/ruoyi-common-rabbitmq/src/main/java/org/dromara/common/rabbitmq/config/properties/RabbitMQConfig.java new file mode 100644 index 000000000..784369596 --- /dev/null +++ b/ruoyi-common/ruoyi-common-rabbitmq/src/main/java/org/dromara/common/rabbitmq/config/properties/RabbitMQConfig.java @@ -0,0 +1,55 @@ +package org.dromara.common.rabbitmq.config.properties; + + +import org.springframework.amqp.core.*; +import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; +import org.springframework.amqp.support.converter.MessageConverter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RabbitMQConfig { + + public static final String DIRECT_EXCHANGE_NAME = "ruoyi.direct.exchange"; + public static final String DIRECT_QUEUE_NAME = "ruoyi.direct.queue"; + public static final String DIRECT_ROUTING_KEY = "ruoyi.direct.routingkey"; + + public static final String TOPIC_EXCHANGE_NAME = "ruoyi.topic.exchange"; + public static final String TOPIC_QUEUE_NAME = "ruoyi.topic.queue"; + public static final String TOPIC_ROUTING_KEY = "ruoyi.topic.#"; + + @Bean + public DirectExchange directExchange() { + return new DirectExchange(DIRECT_EXCHANGE_NAME, true, false); + } + + @Bean + public TopicExchange topicExchange() { + return new TopicExchange(TOPIC_EXCHANGE_NAME, true, false); + } + + @Bean + public Queue directQueue() { + return new Queue(DIRECT_QUEUE_NAME, true); + } + + @Bean + public Queue topicQueue() { + return new Queue(TOPIC_QUEUE_NAME, true); + } + + @Bean + public Binding directBinding(Queue directQueue, DirectExchange directExchange) { + return BindingBuilder.bind(directQueue).to(directExchange).with(DIRECT_ROUTING_KEY); + } + + @Bean + public Binding topicBinding(Queue topicQueue, TopicExchange topicExchange) { + return BindingBuilder.bind(topicQueue).to(topicExchange).with(TOPIC_ROUTING_KEY); + } + + @Bean + public MessageConverter jsonMessageConverter() { + return new Jackson2JsonMessageConverter(); + } +} diff --git a/ruoyi-common/ruoyi-common-rabbitmq/src/main/java/org/dromara/common/rabbitmq/domain/BaseMessage.java b/ruoyi-common/ruoyi-common-rabbitmq/src/main/java/org/dromara/common/rabbitmq/domain/BaseMessage.java new file mode 100644 index 000000000..3ab3480e3 --- /dev/null +++ b/ruoyi-common/ruoyi-common-rabbitmq/src/main/java/org/dromara/common/rabbitmq/domain/BaseMessage.java @@ -0,0 +1,24 @@ +package org.dromara.common.rabbitmq.domain; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class BaseMessage { + private String messageId; + private String messageType; + private Object data; + private LocalDateTime time; + private String source; + + public BaseMessage() { + this.time = LocalDateTime.now(); + } + + public BaseMessage(String messageType, Object data) { + this(); + this.messageType = messageType; + this.data = data; + } +} diff --git a/ruoyi-common/ruoyi-common-rabbitmq/src/main/java/org/dromara/common/rabbitmq/utils/MqUtil.java b/ruoyi-common/ruoyi-common-rabbitmq/src/main/java/org/dromara/common/rabbitmq/utils/MqUtil.java new file mode 100644 index 000000000..ef92b31e1 --- /dev/null +++ b/ruoyi-common/ruoyi-common-rabbitmq/src/main/java/org/dromara/common/rabbitmq/utils/MqUtil.java @@ -0,0 +1,157 @@ +package org.dromara.common.rabbitmq.utils; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.json.utils.JsonUtils; +import org.dromara.common.rabbitmq.config.properties.RabbitMQConfig; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; +import org.springframework.amqp.AmqpException; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.MessageBuilder; +import org.springframework.amqp.core.MessageDeliveryMode; +import org.springframework.amqp.core.MessageProperties; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.amqp.support.converter.MessageConverter; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +@Slf4j +@Component +public class MqUtil implements ApplicationContextAware { + private static RabbitTemplate rabbitTemplate; + private static MessageConverter messageConverter; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + rabbitTemplate = applicationContext.getBean(RabbitTemplate.class); + messageConverter = applicationContext.getBean(MessageConverter.class); + } + + /** + * 发送消息到指定交换机和路由键 + */ + public static void sendMessage(String exchange, String routingKey, Object message) { + try { + rabbitTemplate.convertAndSend(exchange, routingKey, message); + log.debug("消息发送成功 - exchange: {}, routingKey: {}, message: {}", exchange, routingKey, message); + } catch (AmqpException e) { + log.error("消息发送失败 - exchange: {}, routingKey: {}, message: {}", exchange, routingKey, message, e); + throw new RuntimeException("消息发送失败", e); + } + } + + /** + * 发送消息到指定队列(使用默认交换机) + */ + public static void sendToQueue(String queueName, Object message) { + sendMessage("", queueName, message); + } + + /** + * 发送延迟消息 + */ + public static void sendDelayedMessage(String exchange, String routingKey, Object message, long delayMillis) { + try { + Message amqpMessage = messageConverter.toMessage(message, new MessageProperties()); + amqpMessage.getMessageProperties().setDelayLong(delayMillis); + amqpMessage.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT); + + rabbitTemplate.convertAndSend(exchange, routingKey, amqpMessage); + log.debug("延迟消息发送成功 - exchange: {}, routingKey: {}, delay: {}ms", exchange, routingKey, delayMillis); + } catch (AmqpException e) { + log.error("延迟消息发送失败", e); + throw new RuntimeException("延迟消息发送失败", e); + } + } + +// /** +// * 发送带有headers的消息 +// */ +// public static void sendMessageWithHeaders(String exchange, String routingKey, Object message, Map headers) { +// try { +// Message amqpMessage = messageConverter.toMessage(message, new MessageProperties()); +// if (headers != null) { +// headers.forEach((key, value) -> amqpMessage.getMessageProperties().setHeader(key, value)); +// } +// +// rabbitTemplate.convertAndSend(exchange, routingKey, amqpMessage); +// log.debug("带headers的消息发送成功 - exchange: {}, routingKey: {}", exchange, routingKey); +// } catch (AmqpException e) { +// log.error("带headers的消息发送失败", e); +// throw new RuntimeException("消息发送失败", e); +// } +// } + + /** + * 发送JSON格式的消息 + */ + public static void sendJsonMessage(String exchange, String routingKey, Object message) { + try { + Message amqpMessage = MessageBuilder.withBody(JsonUtils.toJsonString(message).getBytes()) + .setContentType(MessageProperties.CONTENT_TYPE_JSON) + .setDeliveryMode(MessageDeliveryMode.PERSISTENT) + .build(); + + rabbitTemplate.convertAndSend(exchange, routingKey, amqpMessage); + log.debug("JSON消息发送成功 - exchange: {}, routingKey: {}", exchange, routingKey); + } catch (AmqpException e) { + log.error("JSON消息发送失败", e); + throw new RuntimeException("JSON消息发送失败", e); + } + } + + /** + * 发送消息并等待确认(同步方式) + */ + public static boolean sendMessageWithConfirm(String exchange, String routingKey, Object message) { + try { + rabbitTemplate.invoke(operations -> { + operations.convertAndSend(exchange, routingKey, message); + // 等待确认 + return operations.waitForConfirms(5000); + }); + log.debug("消息发送并确认成功 - exchange: {}, routingKey: {}", exchange, routingKey); + return true; + } catch (Exception e) { + log.error("消息发送确认失败", e); + return false; + } + } + + /** + * 发送消息到预定义的直连交换机 + */ + public static void sendToDirectExchange(Object message) { + sendMessage("ruoyi.direct.exchange", "ruoyi.direct.routingkey", message); + } + + /** + * 发送消息到预定义的主题交换机 + */ + public static void sendToTopicExchange(String routingKey, Object message) { + sendMessage("ruoyi.topic.exchange", routingKey, message); + } + + /** + * 检查RabbitMQ连接状态 + */ + public static boolean isConnected() { + try { + rabbitTemplate.execute(channel -> { + // 简单的连接检查 + return channel.isOpen(); + }); + return true; + } catch (Exception e) { + log.warn("RabbitMQ连接检查失败", e); + return false; + } + } + + + +} diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/properties/RedissonProperties.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/rabbitmq/config/properties/RedissonProperties.java similarity index 97% rename from ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/properties/RedissonProperties.java rename to ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/rabbitmq/config/properties/RedissonProperties.java index ebec7861a..666c82be9 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/properties/RedissonProperties.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/rabbitmq/config/properties/RedissonProperties.java @@ -1,4 +1,4 @@ -package org.dromara.common.redis.config.properties; +package org.dromara.common.rabbitmq.config.properties; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfig.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfig.java index bd251d57e..485cdf12b 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfig.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/config/RedisConfig.java @@ -10,7 +10,7 @@ import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.redis.config.properties.RedissonProperties; +import org.dromara.common.rabbitmq.config.properties.RedissonProperties; import org.dromara.common.redis.handler.KeyPrefixHandler; import org.dromara.common.redis.handler.RedisExceptionHandler; import org.redisson.client.codec.StringCodec; diff --git a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java index 740e2a13b..68d73d220 100644 --- a/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java +++ b/ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/manager/PlusSpringCacheManager.java @@ -96,6 +96,7 @@ public class PlusSpringCacheManager implements CacheManager { if (names != null) { for (String name : names) { getCache(name); + } dynamic = false; } else { diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java index 3767fa2f1..0599897be 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java @@ -5,7 +5,7 @@ import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; import org.dromara.common.core.utils.reflect.ReflectUtils; import org.dromara.common.redis.config.RedisConfig; -import org.dromara.common.redis.config.properties.RedissonProperties; +import org.dromara.common.rabbitmq.config.properties.RedissonProperties; import org.dromara.common.tenant.core.TenantSaTokenDao; import org.dromara.common.tenant.handle.PlusTenantLineHandler; import org.dromara.common.tenant.handle.TenantKeyPrefixHandler; diff --git a/ruoyi-modules/ruoyi-content/pom.xml b/ruoyi-modules/ruoyi-content/pom.xml index 22e7eb083..0f33d4429 100644 --- a/ruoyi-modules/ruoyi-content/pom.xml +++ b/ruoyi-modules/ruoyi-content/pom.xml @@ -144,12 +144,7 @@ org.dromara ruoyi-member - - - - - - + com.squareup.okhttp3 okhttp @@ -161,12 +156,7 @@ spring-rabbit - - - - - - + @@ -178,10 +168,7 @@ org.dromara ruoyi-system - - org.dromara - ruoyi-im - + diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/base/BaseInfoProperties.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/base/BaseInfoProperties.java index 71c5649e0..322c0dc02 100644 --- a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/base/BaseInfoProperties.java +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/domain/base/BaseInfoProperties.java @@ -44,6 +44,10 @@ public class BaseInfoProperties { // 举报视频 public static final String REDIS_VIDEO_BLOCK = "redis_video_block"; + //已读视频 + public static final String REDIS_USER_READ_VLOG = "redis_user_read_vlog"; + // 已读评论 + public static final String REDIS_USER_READ_COMMENT = "redis_user_read_comment"; // 用户是否喜欢/点赞视频,取代数据库的关联关系,1:喜欢,0:不喜欢(默认) redis_user_like_vlog:{userId}:{vlogId} public static final String REDIS_USER_LIKE_VLOG = "redis_user_like_vlog"; diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/CommentServiceImpl.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/CommentServiceImpl.java index f7208aca0..0691f93de 100644 --- a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/CommentServiceImpl.java +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/CommentServiceImpl.java @@ -206,6 +206,7 @@ public class CommentServiceImpl extends BaseInfoProperties implements CommentSer wrapper.eq(Comment::getVlogId, bo.getVlogId()); } + wrapper.orderByDesc(Comment::getCreateTime); Page commentPage = commentMapper.selectPage(page, wrapper); // 转VO并加子评论数 diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java index b8504da91..e2be61c8d 100644 --- a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java @@ -19,6 +19,7 @@ import com.wzj.soopin.content.enums.YesOrNo; import com.wzj.soopin.content.mapper.CommentMapper; import com.wzj.soopin.content.mapper.MyLikedVlogMapper; import com.wzj.soopin.content.mapper.UsersMapper; +import com.wzj.soopin.member.domain.vo.MemberVO; import com.wzj.soopin.member.mapper.MemberMapper; import com.wzj.soopin.content.mapper.VlogMapper; import com.wzj.soopin.content.mapper.VlogMapperCustom; @@ -30,6 +31,7 @@ import com.wzj.soopin.content.utils.Sid; import com.wzj.soopin.content.utils.TencentCloudUtil; import com.wzj.soopin.member.service.IFansService; import com.wzj.soopin.content.convert.VlogConvert; +import com.wzj.soopin.member.service.IMemberService; import org.apache.commons.lang3.StringUtils; import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.exception.ServiceException; @@ -38,10 +40,6 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.dromara.system.service.ISysMessageService; -import org.dromara.system.service.ISysMessageTemplateService; -import org.dromara.system.domain.bo.SysMessageBo; -import org.dromara.system.domain.vo.SysMessageTemplateVo; import org.dromara.common.core.utils.MapstructUtils; import java.time.Instant; @@ -80,10 +78,7 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { @Autowired private MemberMapper memberMapper; @Autowired - private ISysMessageService sysMessageService; - @Autowired - private ISysMessageTemplateService templateService; - + private IMemberService memberService; @Transactional(rollbackFor = Exception.class) @Override public void updateVlogStatus(String fileId, Integer status, String reason) { @@ -100,23 +95,23 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { // 2. 选择模板(假设你有模板ID,实际可配置到常量或数据库) Long templateId = (status == 1) ? 1938491493736902658L : 1938491899007332353L; // 1001=审核通过模板,1002=驳回模板 - SysMessageTemplateVo template = templateService.selectTemplateById(templateId); - if (template == null) return; - - // 3. 参数替换 - String content = template.getTemplateContent() - .replace("${videoTitle}", vlog.getTitle() == null ? "" : vlog.getTitle()) - .replace("${reason}", reason == null ? "" : reason); - - // 4. 构造消息对象 - SysMessageBo messageBo = new SysMessageBo(); - messageBo.setTitle(template.getTitle()); - messageBo.setContent(content); - messageBo.setSenderId(1L); // 系统管理员 - // 可根据需要设置更多字段 - - // 5. 发送消息 - sysMessageService.sendMessageToUser(messageBo, Long.valueOf(uploaderId)); +// SysMessageTemplateVo template = templateService.selectTemplateById(templateId); +// if (template == null) return; +// +// // 3. 参数替换 +// String content = template.getTemplateContent() +// .replace("${videoTitle}", vlog.getTitle() == null ? "" : vlog.getTitle()) +// .replace("${reason}", reason == null ? "" : reason); +// +// // 4. 构造消息对象 +// SysMessageBo messageBo = new SysMessageBo(); +// messageBo.setTitle(template.getTitle()); +// messageBo.setContent(content); +// messageBo.setSenderId(1L); // 系统管理员 +// // 可根据需要设置更多字段 +// +// // 5. 发送消息 +// sysMessageService.sendMessageToUser(messageBo, Long.valueOf(uploaderId)); } @Transactional(rollbackFor = Exception.class) @@ -162,7 +157,7 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { if (StringUtils.isNotBlank(status)) { queryWrapper.eq(Vlog::getStatus, status); } - // Handle blocked videos + // 去掉黑名单的视频 if (StringUtils.isNotBlank(userId)) { String redisKey = REDIS_VIDEO_BLOCK + ":" + userId; if (redis.keyIsExist(redisKey)) { @@ -183,7 +178,7 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { } } } - // Handle blocked users + // 去掉黑名单的用户 if (StringUtils.isNotBlank(userId)) { String redisKey = REDIS_USER_BLOCK + ":" + userId; if (redis.keyIsExist(redisKey)) { @@ -196,7 +191,7 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { String memberId = (String) reportMap.get("MemberId"); blockUserList.add(memberId); } catch (JsonProcessingException e) { - e.printStackTrace(); + log.error(e.getMessage()); } } if (!blockUserList.isEmpty()) { @@ -204,6 +199,27 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { } } } + // 去掉已读的视频 + if (StringUtils.isNotBlank(userId)) { + String redisKey = REDIS_USER_READ_VLOG + ":" + userId; + if (redis.keyIsExist(redisKey)) { + List readVlogList = new ArrayList<>(); + ObjectMapper objectMapper = new ObjectMapper(); + List reports = redis.lrange(redisKey, 0, -1); + for (String report : reports) { + try { + Map reportMap = objectMapper.readValue(report, new TypeReference>() {}); + String memberId = (String) reportMap.get("MemberId"); + readVlogList.add(memberId); + } catch (JsonProcessingException e) { + log.error(e.getMessage()); + } + } + if (!readVlogList.isEmpty()) { + queryWrapper.notIn(Vlog::getMemberId, readVlogList); + } + } + } Page vlogPage = vlogMapper.selectPage(pageParam, queryWrapper); List vlogList = vlogPage.getRecords(); List voList = vlogList.stream().map(v -> { @@ -214,28 +230,15 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { } vo.setLikeCounts(getVlogBeLikedCounts(v.getId())); vo.setCommentsCounts(getVlogComment(v.getId())); + MemberVO m =memberService.getMemberInfo(vo.getMemberId()); + if (m != null) { + vo.setAvatar(m.getAvatar()); + vo.setNickname(m.getNickname()); + } return vo; }).collect(Collectors.toList()); - // 批量补充作者信息(头像/昵称) - if (!vlogList.isEmpty()) { - List memberIds = vlogList.stream() - .map(Vlog::getMemberId) - .filter(StringUtils::isNotBlank) - .distinct() - .collect(Collectors.toList()); - if (!memberIds.isEmpty()) { - List members = memberMapper.selectList(new LambdaQueryWrapper().in(Member::getId, memberIds)); - Map memberMap = members.stream().collect(Collectors.toMap(m -> String.valueOf(m.getId()), m -> m, (a, b) -> a)); - voList.forEach(vo -> { - Member m = memberMap.get(vo.getMemberId()); - if (m != null) { - vo.setAvatar(m.getAvatar()); - vo.setNickname(m.getNickname()); - } - }); - } - } + // 封装分页结果 Page gridResult = new Page(); @@ -397,23 +400,23 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { if (vlog != null) { String vlogerId = vlog.getMemberId(); if (!userId.equals(vlogerId)) { - Long templateId = 1938491299175723009L; - SysMessageTemplateVo template = templateService.selectTemplateById(templateId); - if (template != null) { - // 查询点赞用户昵称 - Member liker = memberMapper.selectById(userId); - String likerNickname = liker != null && liker.getNickname() != null ? liker.getNickname() : ""; - - String content = template.getTemplateContent() - .replace("${videoTitle}", vlog.getTitle() == null ? "" : vlog.getTitle()) - .replace("${liker}", userId) - .replace("${likerNickname}", likerNickname); - SysMessageBo messageBo = new SysMessageBo(); - messageBo.setTitle(template.getTitle()); - messageBo.setContent(content); - messageBo.setSenderId(Long.valueOf(userId)); - sysMessageService.sendMessageToUser(messageBo, Long.valueOf(vlogerId)); - } +// Long templateId = 1938491299175723009L; +// SysMessageTemplateVo template = templateService.selectTemplateById(templateId); +// if (template != null) { +// // 查询点赞用户昵称 +// Member liker = memberMapper.selectById(userId); +// String likerNickname = liker != null && liker.getNickname() != null ? liker.getNickname() : ""; +// +// String content = template.getTemplateContent() +// .replace("${videoTitle}", vlog.getTitle() == null ? "" : vlog.getTitle()) +// .replace("${liker}", userId) +// .replace("${likerNickname}", likerNickname); +// SysMessageBo messageBo = new SysMessageBo(); +// messageBo.setTitle(template.getTitle()); +// messageBo.setContent(content); +// messageBo.setSenderId(Long.valueOf(userId)); +// sysMessageService.sendMessageToUser(messageBo, Long.valueOf(vlogerId)); +// } } } } diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/task/VlogScheduledTask.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/task/VlogScheduledTask.java index aa64c0c3c..e472764bb 100644 --- a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/task/VlogScheduledTask.java +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/task/VlogScheduledTask.java @@ -1,5 +1,6 @@ package com.wzj.soopin.content.task; +import com.aizuda.snailjob.client.job.core.annotation.JobExecutor; import com.wzj.soopin.content.service.VlogService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -8,11 +9,12 @@ import org.springframework.stereotype.Component; /** * 视频相关定时任务 - * + * * @author wzj */ @Slf4j @Component +@JobExecutor(name = "vlogHotDataTask" ) public class VlogScheduledTask { @Autowired @@ -22,8 +24,7 @@ public class VlogScheduledTask { * 每天12点定时查询点赞最多的100条视频并存储到Redis * cron表达式:0 0 12 * * ? (每天12点执行) */ - @Scheduled(cron = "0 0 12 * * ?") - public void cacheTopLikedVlogs() { + public void jobExecute() { log.info("开始执行定时任务:查询点赞最多的100条视频并存储到Redis"); try { vlogService.cacheTopLikedVlogs(100); @@ -32,4 +33,4 @@ public class VlogScheduledTask { log.error("定时任务执行失败:缓存点赞最多视频到Redis时发生异常", e); } } -} \ No newline at end of file +} diff --git a/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/BrandMapper.xml b/ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/ISystemMessageUserService.xml similarity index 100% rename from ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/BrandMapper.xml rename to ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/ISystemMessageUserService.xml diff --git a/ruoyi-modules/ruoyi-im/pom.xml b/ruoyi-modules/ruoyi-im/pom.xml index 8ebfe72b0..99bea4121 100644 --- a/ruoyi-modules/ruoyi-im/pom.xml +++ b/ruoyi-modules/ruoyi-im/pom.xml @@ -19,7 +19,18 @@ org.dromara ruoyi-common-core - + + org.dromara + ruoyi-common-web + + + org.dromara + ruoyi-member + + + org.dromara + ruoyi-content + org.dromara ruoyi-common-doc @@ -34,6 +45,10 @@ org.dromara ruoyi-common-translation + + org.dromara + ruoyi-common-rabbitmq + diff --git a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/im/enums/MessageActionEnum.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/im/enums/MessageActionEnum.java new file mode 100644 index 000000000..2d3f08f1e --- /dev/null +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/im/enums/MessageActionEnum.java @@ -0,0 +1,48 @@ +package org.dromara.im.enums; + +public enum MessageActionEnum { + + NEW_FOUCS(1,"新的关注"), //新的关注 + SYSTEM_NOTIFY(2, "系统->通知"), // 系统->通知 + SYSTEM_REPORT(3, "系统->举报下架(视频,视频评论) 视频评论"), // 系统->举报下架(视频,视频评论) 视频评论 + SYSTEM_CHECK(4, "系统->审核结果(复审,驳回 ,通过)"), // 系统->审核结果(复审,驳回 ,通过) + SYSTEM_PUSH(5, "系统->推广类的"), //系统->推广类的 + INTERACTION_COMMENT(6, "互动->评论"), //互动->评论 + INTERACTION_AT(7, "互动->视频评论中的@"), //互动->视频评论中的@ + INTERACTION_LIKE(8, "互动->点赞"), //互动->点赞 + INTERACTION_REPLY(9, "互动->评论回复"), //互动->评论回复 + ORDER_RECHARGE(10, "订单->充值 online"), //订单->充值 online + ORDER_PAY(11, "订单->订单交易成功通知 online"), //订单->订单交易成功通知 online + ORDER_REFUND(12, "订单->退款结果通知"), //订单->退款结果通知 + GROUP_NOTIFY_CHECK(13, "群通知->进群申请 online"), //群通知->进群申请 online + GROUP_NOTIFY_ACCEPT(14, "群通知->进群审核审核通过 online"), // 群通知->进群审核审核通过 online + GROUP_NOTIFY_FAIL(15, "群通知->进群审核审核拒绝 online"), // 群通知->进群审核审核拒绝 online + GROUP_NOTIFY_LEAVE_UP(16, "群通知->群升级为达人群通知"), // 群通知->群升级为达人群通知 + GROUP_NOTIFY_LEAVE_DOWN(17, "群通知->群降级为普通群通知"); // 群通知->群降级为普通群通知 + + private int code; + private String account; + private String desc; + + MessageActionEnum(int code, String desc) { + this.code = code; + this.desc = desc; + } + + public int getCode() { + return code; + } + + public String getDesc() { + return desc; + } + + public static MessageActionEnum getByCode(int code) { + for (MessageActionEnum actionEnum : values()) { + if (actionEnum.getCode() == code) { + return actionEnum; + } + } + return null; + } +} diff --git a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/im/enums/MessageScopeEnum.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/im/enums/MessageScopeEnum.java new file mode 100644 index 000000000..98494c561 --- /dev/null +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/im/enums/MessageScopeEnum.java @@ -0,0 +1,36 @@ +package org.dromara.im.enums; + +public enum MessageScopeEnum { + /** + * 全部用户 + */ + ALL(1, "全部"), + /** + * 系统用户 + */ + USER(2, "用户"), + /** + * 会员 + */ + MEMBER(3, "会员"), + + /** + * 租户 + */ + TENANT(4, "租户"); + private int code; + private String desc; + + private MessageScopeEnum(int code, String desc) { + this.code = code; + this.desc = desc; + } + + public int getCode() { + return code; + } + + public String getDesc() { + return desc; + } +} diff --git a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/soopin/im/consumer/IMMessageConsumer.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/soopin/im/consumer/IMMessageConsumer.java new file mode 100644 index 000000000..43a473dd6 --- /dev/null +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/soopin/im/consumer/IMMessageConsumer.java @@ -0,0 +1,24 @@ +package org.dromara.soopin.im.consumer; +import com.rabbitmq.client.Channel; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.rabbitmq.config.properties.RabbitMQConfig; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +import java.io.IOException; +@Slf4j +@Component +public class IMMessageConsumer { + @RabbitListener(queues = RabbitMQConfig.TOPIC_QUEUE_NAME) + public void handleDirectMessage(String message, Channel channel, Message amqpMessage) throws IOException { + try { + log.info("接收到直连队列消息: {}", message); + // 业务处理逻辑 + channel.basicAck(amqpMessage.getMessageProperties().getDeliveryTag(), false); + } catch (Exception e) { + log.error("消息处理失败", e); + channel.basicNack(amqpMessage.getMessageProperties().getDeliveryTag(), false, true); + } + } +} diff --git a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/controller/SysMessageController.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/controller/SysMessageController.java index 8cc5b8afc..bd5aaa822 100644 --- a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/controller/SysMessageController.java +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/controller/SysMessageController.java @@ -1,37 +1,24 @@ package org.dromara.system.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -//import com.wzj.soopin.member.domain.po.Member; -//import com.wzj.soopin.member.mapper.MemberMapper; import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.common.core.utils.StringUtils; import org.dromara.common.idempotent.annotation.RepeatSubmit; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.web.core.BaseController; import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; import org.dromara.system.domain.SysMessage; import org.dromara.system.domain.bo.SysMessageBo; -import org.dromara.system.domain.vo.SysMessageTemplateVo; import org.dromara.system.domain.vo.SysMessageVo; -import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.service.ISysMessageService; -import org.dromara.system.service.ISysMessageTemplateService; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.dromara.system.service.ISysUserService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.ArrayList; -import java.util.List; - /** * 消息管理 * @@ -44,9 +31,6 @@ import java.util.List; public class SysMessageController extends BaseController { private final ISysMessageService messageService; - private final ISysUserService userService; - private final ISysMessageTemplateService templateService; -// private final MemberMapper umsMemberMapper; /** * 获取当前用户ID @@ -80,6 +64,7 @@ public class SysMessageController extends BaseController { return R.ok(messageService.selectMessageById(id)); } + /** * 发送消息 */ @@ -88,261 +73,17 @@ public class SysMessageController extends BaseController { @RepeatSubmit() @PostMapping("/send") public R send(@RequestBody SysMessageBo bo) { - // 设置发送者ID为当前登录用户ID - bo.setSenderId(getUserId()); - // 如果提供了模板ID,则从模板中获取标题和内容 Long templateId = bo.getTemplateId(); - if (templateId != null) { - SysMessageTemplateVo template = templateService.selectTemplateById(templateId); - if (template != null) { - // 使用模板的标题和内容 - bo.setTitle(template.getTitle()); - bo.setContent(template.getTemplateContent()); - } else { - return R.fail("未找到指定的消息模板"); - } + if(templateId == null){ + return R.fail("模板不能为空"); } - - // 验证消息内容是否为空 - if (StringUtils.isBlank(bo.getContent())) { - return R.fail("消息内容不能为空"); - } - - // 验证发送范围是否为空 - List sendScope = bo.getSendScope(); - if (sendScope == null || sendScope.isEmpty()) { - return R.fail("发送范围不能为空"); - } - - // 处理接收者 - List userIdStrings = new ArrayList<>(); - - // 根据logmess值处理不同类型的消息接收者 - Integer logmess = bo.getLogmess(); - if (logmess != null) { - // 获取发送范围作为主要处理对象 - if (sendScope == null || sendScope.isEmpty()) { - return R.fail("发送范围不能为空"); - } - - String scope = sendScope.get(0); // 获取第一个范围值 - - switch (logmess) { - case 1: // 指定角色 - // 当logmess=1时,sendScope接收的是角色ID或特殊标识 - if ("all".equals(scope)) { - // 全部会员用户(查ums_member表) -// List members = umsMemberMapper.selectList( -// new QueryWrapper().eq("status", 1) -// ); -// userIdStrings = members.stream().map(m -> String.valueOf(m.getId())).toList(); - } else if ("expert".equals(scope) || "merchant".equals(scope) || "user".equals(scope)) { - List users = userService.selectUserListByDept(null); - List userIds; - switch (scope) { - case "expert": - userIds = users.stream() - .filter(user -> "expert".equals(user.getUserType())) - .map(SysUserVo::getUserId) - .toList(); - break; - case "merchant": - userIds = users.stream() - .filter(user -> "merchant".equals(user.getUserType())) - .map(SysUserVo::getUserId) - .toList(); - break; - case "user": - userIds = users.stream() - .filter(user -> "user".equals(user.getUserType())) - .map(SysUserVo::getUserId) - .toList(); - break; - default: - userIds = List.of(); - } - userIdStrings = userIds.stream().map(String::valueOf).toList(); - } else if (StringUtils.isNotBlank(scope)) { - try { - // 尝试将scope解析为角色ID - Long roleId = Long.parseLong(scope); - List userIds = userService.selectUserIdsByRoleId(roleId); - if (userIds != null && !userIds.isEmpty()) { - userIdStrings = userIds.stream().map(String::valueOf).toList(); - } - } catch (NumberFormatException e) { - return R.fail("角色ID格式不正确"); - } - } - break; - case 2: // 指定用户 - // 当logmess=2时,sendScope接收的是用户ID数组 - if (sendScope != null && !sendScope.isEmpty()) { - userIdStrings = new ArrayList<>(); - for (String userId : sendScope) { - if (StringUtils.isNotBlank(userId)) { - userIdStrings.add(userId); - } - } - } else if (bo.getUserIds() != null && !bo.getUserIds().isEmpty()) { - // 如果没有指定scope但有userIds,使用userIds - userIdStrings = bo.getUserIds().stream().map(String::valueOf).toList(); - } - break; - case 3: // 指定群组/部门 - // 当logmess=3时,sendScope接收的是群组/部门ID - if (StringUtils.isNotBlank(scope)) { - try { - Long deptId = Long.parseLong(scope); - List users = userService.selectUserListByDept(deptId); - if (users != null && !users.isEmpty()) { - userIdStrings = users.stream() - .map(user -> String.valueOf(user.getUserId())) - .toList(); - } - } catch (NumberFormatException e) { - return R.fail("群组/部门ID格式不正确"); - } - } - break; - default: - return R.fail("不支持的消息类型"); - } - } else { - // 如果没有指定logmess,则使用原有的处理逻辑 - if (sendScope == null || sendScope.isEmpty()) { - return R.fail("发送范围不能为空"); - } - - String scope = sendScope.get(0); // 获取第一个范围值 - - // 如果是群发消息类型,则根据类型筛选用户 - if ("all".equals(scope) || "expert".equals(scope) || "merchant".equals(scope) || "user".equals(scope)) { - List users = userService.selectUserListByDept(null); - List userIds; - - switch (scope) { - case "all": - // 全部用户 - userIds = users.stream().map(SysUserVo::getUserId).toList(); - break; - case "expert": - // 达人 - userIds = users.stream() - .filter(user -> "expert".equals(user.getUserType())) - .map(SysUserVo::getUserId) - .toList(); - break; - case "merchant": - // 商户 - userIds = users.stream() - .filter(user -> "merchant".equals(user.getUserType())) - .map(SysUserVo::getUserId) - .toList(); - break; - case "user": - // 普通用户 - userIds = users.stream() - .filter(user -> "user".equals(user.getUserType())) - .map(SysUserVo::getUserId) - .toList(); - break; - default: - userIds = List.of(); - } - userIdStrings = userIds.stream().map(String::valueOf).toList(); - } else { - // 直接使用指定的接收者ID - if (bo.getUserIds() != null && !bo.getUserIds().isEmpty()) { - // 如果userIds不为空,使用它 - userIdStrings = bo.getUserIds().stream().map(String::valueOf).toList(); - } else if (sendScope != null && !sendScope.isEmpty()) { - // 如果userIds为空但sendScope不为空,将sendScope作为用户ID使用 - userIdStrings = sendScope; - } - } - } - - // 如果没有找到接收者,返回失败 - if (userIdStrings.isEmpty()) { - return R.fail("未找到消息接收者"); - } - - // 判断是否为定时消息,若是则注册SnailJob单次任务 -// if (bo.getScheduledTime() != null && bo.getScheduledTime().after(new java.util.Date())) { -// // 先保存消息,获取ID -// SysMessage entity = bo.toEntity(); -// entity.setStatus("0"); // 未发送 -// messageService.getBaseMapper().insert(entity); -// // 创建SnailJob单次任务 -// org.dromara.system.job.SnailJobApiUtil.createSingleJob(entity.getId(), entity.getScheduledTime()); -// // 关联用户 -// for (String userId : userIdStrings) { -// org.dromara.system.domain.SysMessageUser messageUser = new org.dromara.system.domain.SysMessageUser(); -// messageUser.setMessageId(entity.getId()); -// messageUser.setUserId(Long.valueOf(userId)); -// messageUser.setIsRead(false); -// // 这里假设有messageUserMapper可用,实际应通过service或mapper注入 -// // messageUserMapper.insert(messageUser); -// } -// return toAjax(1); -// } - - return toAjax(messageService.sendMessageToUsers(bo, userIdStrings)); + messageService.send(bo); + return R.ok(); } - /** - * 标记消息为已读 - */ -// @SaCheckPermission("system:message:mark") - @Log(title = "消息管理", businessType = BusinessType.UPDATE) - @PutMapping("/mark/{id}") - public R markAsRead(@NotNull(message = "消息ID不能为空") @PathVariable Long id) { - return toAjax(messageService.markAsRead(id, getUserId())); - } - /** - * 删除消息 - * - * @param ids 消息ID串 - */ -// @SaCheckPermission("system:message:remove") - @Log(title = "消息管理", businessType = BusinessType.DELETE) - @DeleteMapping("/{ids}") - public R remove(@NotEmpty(message = "消息ID不能为空") @PathVariable Long[] ids) { - return toAjax(messageService.deleteMessageByIds(ids)); - } - /** - * 获取未读消息列表 - */ -// @SaCheckPermission("system:message:list") - @Tag(name = "查询未读消息列表") - @PostMapping("/unread") - public R> unreadList(@RequestBody Page page) { - Page unreadPage = messageService.selectUnreadMessagesPage(getUserId(), page); - return R.ok(unreadPage); - } - /** - * 获取已读消息列表 - */ -// @SaCheckPermission("system:message:list") - @Tag(name = "查询已读消息列表") - @PostMapping("/read") - public R> readList(@RequestBody Page page) { - Page readPage = messageService.selectReadMessagesPage(getUserId(), page); - return R.ok(readPage); - } -// /** -// * 获取用户列表 -// */ -//// @SaCheckPermission("system:message:list") -// @GetMapping("/user/list") -// public R> getUserList(@RequestParam(required = false) String keyword) { -// // 无论是否有关键词,都查询 ums_member 表中的用户信息 -// return R.ok(userService.selectMemberUsers(keyword)); -// } } diff --git a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/controller/SysMessageTemplateController.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/controller/SysMessageTemplateController.java index 89c99602c..46425fe20 100644 --- a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/controller/SysMessageTemplateController.java +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/controller/SysMessageTemplateController.java @@ -17,6 +17,7 @@ import org.dromara.common.idempotent.annotation.RepeatSubmit; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.web.core.BaseController; +import org.dromara.system.converter.SysMessageTemplateConvert; import org.dromara.system.domain.SysMessageTemplate; import org.dromara.system.domain.bo.SysMessageTemplateBo; import org.dromara.system.domain.vo.SysMessageTemplateVo; @@ -39,6 +40,8 @@ public class SysMessageTemplateController extends BaseController { private final ISysMessageTemplateService templateService; + private final SysMessageTemplateConvert convert; + /** * 查询消息模板列表 */ @@ -63,7 +66,7 @@ public class SysMessageTemplateController extends BaseController { SysMessageTemplate template = templateService.getById(id); return R.ok(MapstructUtils.convert(template, SysMessageTemplateVo.class)); } - + /** * 根据名称查询消息模板列表(不分页) * @@ -88,7 +91,7 @@ public class SysMessageTemplateController extends BaseController { @RepeatSubmit() @PostMapping() public R add(@Validated(AddGroup.class) @RequestBody SysMessageTemplateBo bo) { - return toAjax(templateService.save(bo.toEntity())); + return toAjax(templateService.save(convert.toPo(bo))); } /** @@ -99,7 +102,7 @@ public class SysMessageTemplateController extends BaseController { @RepeatSubmit() @PutMapping() public R edit(@Validated(EditGroup.class) @RequestBody SysMessageTemplateBo bo) { - return toAjax(templateService.updateById(bo.toEntity())); + return toAjax(templateService.updateById(convert.toPo(bo))); } /** diff --git a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/controller/SysMessageUserController.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/controller/SysMessageUserController.java new file mode 100644 index 000000000..c5f4b016f --- /dev/null +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/controller/SysMessageUserController.java @@ -0,0 +1,86 @@ +package org.dromara.system.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.SysMessage; +import org.dromara.system.domain.vo.SysMessageVo; +import org.dromara.system.service.ISysMessageService; +import org.dromara.system.service.ISysMessageTemplateService; +import org.dromara.system.service.ISysUserService; +import org.dromara.system.service.impl.SystemMessageUserService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import static org.dromara.common.satoken.utils.LoginHelper.getUserId; + +/** + * 消息管理 + * + * @author ruoyi + */ +@Validated +@RestController +@RequiredArgsConstructor +@RequestMapping("/system/message/task") +public class SysMessageUserController extends BaseController { + + private final ISysMessageService messageService; + private final ISysUserService userService; + private final ISysMessageTemplateService templateService; + + private final SystemMessageUserService systemMessageTaskService; + + + + /** + * 获取未读消息列表 + */ +// @SaCheckPermission("system:message:list") + @Tag(name = "查询未读消息列表") + @PostMapping("/unread") + public R> unreadList(@RequestBody Page page) { + Page unreadPage = messageService.selectUnreadMessagesPage(getUserId(), page); + return R.ok(unreadPage); + } + + /** + * 获取已读消息列表 + */ +// @SaCheckPermission("system:message:list") + @Tag(name = "查询已读消息列表") + @PostMapping("/read") + public R> readList(@RequestBody Page page) { + Page readPage = messageService.selectReadMessagesPage(getUserId(), page); + return R.ok(readPage); + } + + /** + * 标记消息为已读 + */ +// @SaCheckPermission("system:message:mark") + @Log(title = "消息管理", businessType = BusinessType.UPDATE) + @PutMapping("/mark/{id}") + public R markAsRead(@NotNull(message = "消息ID不能为空") @PathVariable Long id) { + return toAjax(messageService.markAsRead(id, getUserId())); + } + + /** + * 删除消息 + * + * @param ids 消息ID串 + */ +// @SaCheckPermission("system:message:remove") + @Log(title = "消息管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "消息ID不能为空") @PathVariable Long[] ids) { + return toAjax(messageService.deleteMessageByIds(ids)); + } + +} diff --git a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/converter/SysMessageConvert.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/converter/SysMessageConvert.java index 11fe544f8..2ac4be07e 100644 --- a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/converter/SysMessageConvert.java +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/converter/SysMessageConvert.java @@ -1,11 +1,10 @@ package org.dromara.system.converter; +import org.dromara.common.web.core.BaseConverter; import org.dromara.system.domain.SysMessage; +import org.dromara.system.domain.bo.SysMessageBo; import org.dromara.system.domain.vo.SysMessageVo; import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; - -import java.util.List; /** * 消息对象转换器 @@ -13,27 +12,6 @@ import java.util.List; * @author ruoyi */ @Mapper(componentModel = "spring") -public interface SysMessageConvert { +public interface SysMessageConvert extends BaseConverter { - SysMessageConvert INSTANCE = Mappers.getMapper(SysMessageConvert.class); - - /** - * SysMessage转SysMessageVo - */ - SysMessageVo convert(SysMessage sysMessage); - - /** - * SysMessage列表转SysMessageVo列表 - */ - List convertList(List sysMessageList); - - /** - * SysMessageVo转SysMessage - */ - SysMessage convert(SysMessageVo sysMessageVo); - - /** - * SysMessageVo列表转SysMessage列表 - */ - List convertListVoToEntity(List sysMessageVoList); -} \ No newline at end of file +} diff --git a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/converter/SysMessageTemplateConvert.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/converter/SysMessageTemplateConvert.java new file mode 100644 index 000000000..5ac9c1fdc --- /dev/null +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/converter/SysMessageTemplateConvert.java @@ -0,0 +1,20 @@ +package org.dromara.system.converter; + +import org.dromara.common.web.core.BaseConverter; +import org.dromara.system.domain.SysMessage; +import org.dromara.system.domain.SysMessageTemplate; +import org.dromara.system.domain.bo.SysMessageBo; +import org.dromara.system.domain.bo.SysMessageTemplateBo; +import org.dromara.system.domain.vo.SysMessageTemplateVo; +import org.dromara.system.domain.vo.SysMessageVo; +import org.mapstruct.Mapper; + +/** + * 消息对象转换器 + * + * @author ruoyi + */ +@Mapper(componentModel = "spring") +public interface SysMessageTemplateConvert extends BaseConverter { + +} diff --git a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/domain/SysMessage.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/domain/SysMessage.java index 34627cf97..d47bbcd6c 100644 --- a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/domain/SysMessage.java +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/domain/SysMessage.java @@ -43,7 +43,7 @@ public class SysMessage extends BaseAudit { private String subType; /** 发送者ID */ - private Long senderId; + private String senderId; /** 定时发送时间 */ private Date scheduledTime; @@ -51,6 +51,9 @@ public class SysMessage extends BaseAudit { /** 状态(0未发送 1已发送) */ private String status; + /** 发送范围(1:全部用户, 2:按用户类型, 3:指定用户) */ + private Integer sendScope; + /** 扩展参数 */ @TableField(exist = false) private Map params = new HashMap<>(); @@ -62,4 +65,10 @@ public class SysMessage extends BaseAudit { /** 模板参数 */ @TableField(exist = false) private Map templateParams; + /** + * 模板ID + */ + private Long templateId; + + private String ext; } diff --git a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/domain/SysMessageTemplate.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/domain/SysMessageTemplate.java index aa26bea8f..fcd9ad467 100644 --- a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/domain/SysMessageTemplate.java +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/domain/SysMessageTemplate.java @@ -29,37 +29,39 @@ public class SysMessageTemplate extends BaseAudit { /** * 模板类型(0通知 1公告) */ - private String templateType; + private String type; private String title; -// /** -// * 模板编码 -// */ -// private String templateCode; + /** * 模板名称 */ - private String templateName; + private String name; /** * 模板内容 */ - private String templateContent; + private String content; -// /** -// * 模板参数 -// */ -// private String templateParams; + /** + * 扩展参数 + */ + private String ext; /** * 状态(0正常 1停用) */ private String status; -// -// /** -// * 备注 -// */ -// private String remark; + + /** + * 消息类型 + */ + private Integer action; + + /** + * 备注 + */ + private String description; } diff --git a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/domain/bo/SysMessageBo.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/domain/bo/SysMessageBo.java index 66b40aa5f..0be169556 100644 --- a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/domain/bo/SysMessageBo.java +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/domain/bo/SysMessageBo.java @@ -1,5 +1,6 @@ package org.dromara.system.domain.bo; +import cn.hutool.core.map.MapWrapper; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; import jakarta.validation.constraints.NotBlank; @@ -7,6 +8,7 @@ import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.Size; import lombok.Data; import lombok.EqualsAndHashCode; +import org.dromara.common.core.domain.BaseBO; import org.dromara.common.core.domain.model.BaseAudit; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; @@ -18,8 +20,12 @@ import com.fasterxml.jackson.annotation.JsonFormat; import java.time.LocalDateTime; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; + import com.baomidou.mybatisplus.annotation.TableField; +import org.dromara.system.domain.SysMessageTemplate; /** * 消息业务对象 @@ -29,12 +35,15 @@ import com.baomidou.mybatisplus.annotation.TableField; @Data @EqualsAndHashCode(callSuper = true) @ExcelIgnoreUnannotated -public class SysMessageBo extends BaseAudit { +public class SysMessageBo extends BaseBO { /** 主键ID */ @ExcelProperty(value = "消息ID") private Long id; + /** 发送者ID */ + private String senderId; + /** 消息标题 */ // @NotBlank(message = "消息标题不能为空", groups = { AddGroup.class, EditGroup.class }) @Size(min = 0, max = 100, message = "消息标题长度不能超过100个字符") @@ -46,39 +55,21 @@ public class SysMessageBo extends BaseAudit { @ExcelProperty(value = "消息内容") private String content; - /** 消息类型(AUTO自动/MANUAL手动) */ -// @NotBlank(message = "消息类型不能为空", groups = { AddGroup.class, EditGroup.class }) - @ExcelProperty(value = "消息类型") - private String msgType; - /** 触发条件 */ - @ExcelProperty(value = "触发条件") - private String subType; - - /** 发送者ID */ - @ExcelProperty(value = "发送者ID") - private Long senderId; - - /** 定时发送时间 */ - @ExcelProperty(value = "定时发送时间") - @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX", timezone = "Asia/Shanghai") - private Date scheduledTime; /** 发送范围(all:全部用户, userType:按用户类型, userIds:指定用户) */ @NotEmpty(message = "发送范围不能为空", groups = { AddGroup.class }) - private List sendScope; + private Integer sendScope; /** 接收用户ID列表 */ - private List userIds; + private List idList; + - /** 是否发送给所有用户 */ - private Boolean sendToAll; /** 扩展数据(JSON格式) */ private String extraData; - /** 消息类型标识 1=指定角色 2=指定用户 3=指定群 */ - private Integer logmess; + /** 模板ID */ private Long templateId; @@ -89,6 +80,42 @@ public class SysMessageBo extends BaseAudit { /** 备注 */ private String remark; + + private String templateType; + + + /** + * 是否发送给所有用户 + */ + private Boolean sendToAll; + + /** + * 消息类型标识 1=指定角色 2=指定用户 3=指定群 + */ + private Integer type; + + /** 定时发送时间 */ + @ExcelProperty(value = "定时发送时间") + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX", timezone = "Asia/Shanghai") + private Date scheduledTime; + + /** 触发条件 */ + @ExcelProperty(value = "触发条件") + private String subType; + + /** + * 模板ID + */ + private SysMessageTemplate template; + + + private Map templateParams=new HashMap<>(); + + /** 消息类型(AUTO自动/MANUAL手动) */ +// @NotBlank(message = "消息类型不能为空", groups = { AddGroup.class, EditGroup.class }) + @ExcelProperty(value = "消息类型") + private String msgType; + /** 创建时间-起始 */ @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone = "UTC") private LocalDateTime startTime; @@ -96,62 +123,20 @@ public class SysMessageBo extends BaseAudit { @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone = "UTC") private LocalDateTime sendTime; - /** 模板类型编号(如1=关注,2=取消关注等) */ - @TableField(exist = false) - private String templateType; - - /** 模板参数 */ - @TableField(exist = false) - private java.util.Map templateParams; - - public String getTemplateType() { - return templateType; - } - public void setTemplateType(String templateType) { - this.templateType = templateType; - } - public java.util.Map getTemplateParams() { - return templateParams; - } - public void setTemplateParams(java.util.Map templateParams) { - this.templateParams = templateParams; - } + /** + * 消息参数 + */ + private Map params; /** * 转换为查询条件 */ + @Override public LambdaQueryWrapper toWrapper() { LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw.like(StringUtils.isNotBlank(this.getTitle()), SysMessage::getTitle, this.getTitle()) .like(StringUtils.isNotBlank(this.getContent()), SysMessage::getContent, this.getContent()) - .eq(StringUtils.isNotBlank(this.getMsgType()), SysMessage::getMsgType, this.getMsgType()) - .eq(StringUtils.isNotBlank(this.getSubType()), SysMessage::getSubType, this.getSubType()) - .eq(this.getSenderId() != null, SysMessage::getSenderId, this.getSenderId()) - .ge(this.getStartTime() != null, SysMessage::getCreateTime, this.getStartTime()) - .le(this.getSendTime() != null, SysMessage::getCreateTime, this.getSendTime()) .orderByDesc(SysMessage::getCreateTime); return lqw; } - - /** - * 转换为实体对象 - */ - public SysMessage toEntity() { - SysMessage entity = new SysMessage(); - entity.setId(this.getId()); - entity.setTitle(this.getTitle()); - entity.setContent(this.getContent()); - entity.setMsgType(this.getMsgType()); - entity.setSubType(this.getSubType()); - entity.setSenderId(this.getSenderId()); - entity.setScheduledTime(this.getScheduledTime()); -// entity.setExtraData(this.getExtraData()); -// entity.setStatus(this.getStatus()); -// entity.setRemark(this.getRemark()); - entity.setCreateBy(this.getCreateBy()); - entity.setCreateTime(this.getCreateTime()); - entity.setUpdateBy(this.getUpdateBy()); - entity.setUpdateTime(this.getUpdateTime()); - return entity; - } } diff --git a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/domain/bo/SysMessageTemplateBo.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/domain/bo/SysMessageTemplateBo.java index d8d99011c..53b841e6d 100644 --- a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/domain/bo/SysMessageTemplateBo.java +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/domain/bo/SysMessageTemplateBo.java @@ -5,6 +5,7 @@ import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; +import org.dromara.common.core.domain.BaseBO; import org.dromara.common.core.domain.model.BaseAudit; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.validate.AddGroup; @@ -24,41 +25,40 @@ import jakarta.validation.constraints.Size; @Data @NoArgsConstructor @EqualsAndHashCode(callSuper = true) -@AutoMapper(target = SysMessageTemplate.class, reverseConvertGenerate = false) -public class SysMessageTemplateBo extends BaseAudit { +public class SysMessageTemplateBo extends BaseBO { /** * 模板ID */ - @NotNull(message = "模板ID不能为空", groups = { EditGroup.class }) + @NotNull(message = "模板ID不能为空", groups = {EditGroup.class}) private Long id; /** * 模板名称 */ - @NotBlank(message = "模板名称不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "模板名称不能为空", groups = {AddGroup.class, EditGroup.class}) @Size(max = 100, message = "模板名称长度不能超过{max}个字符") - private String templateName; + private String name; /** * 模板编码 */ // @NotBlank(message = "模板编码不能为空", groups = { AddGroup.class, EditGroup.class }) // @Size(max = 50, message = "模板编码长度不能超过{max}个字符") -// private String templateCode; + private String code; /** * 模板类型(SMS=短信 MAIL=邮件 WECHAT=微信 SYSTEM=系统消息) */ - @NotBlank(message = "模板类型不能为空", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "模板类型不能为空", groups = {AddGroup.class, EditGroup.class}) @Size(max = 20, message = "模板类型长度不能超过{max}个字符") - private String templateType; + private String type; /** * 模板内容 */ - @NotBlank(message = "模板内容不能为空", groups = { AddGroup.class, EditGroup.class }) - private String templateContent; + @NotBlank(message = "模板内容不能为空", groups = {AddGroup.class, EditGroup.class}) + private String content; /** * 状态(0正常 1停用) @@ -68,37 +68,24 @@ public class SysMessageTemplateBo extends BaseAudit { * 标题 */ private String title; -// /** -// * 备注 -// */ -// private String remark; - /** - * 将当前对象转换为查询条件 - */ + + private String ext; + + private String action; + + private String description; + + + @Override public LambdaQueryWrapper toWrapper() { - LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); - lqw.like(StringUtils.isNotBlank(templateName), SysMessageTemplate::getTemplateName, templateName) -// .like(StringUtils.isNotBlank(templateCode), SysMessageTemplate::getTemplateCode, templateCode) - .eq(StringUtils.isNotBlank(templateType), SysMessageTemplate::getTemplateType, templateType) + return super.toWrapper().eq(id != null, SysMessageTemplate::getId, id) + .eq(StringUtils.isNotBlank(type), SysMessageTemplate::getType, type) + .eq(StringUtils.isNotBlank(type), SysMessageTemplate::getType, type) + .eq(StringUtils.isNotBlank(name), SysMessageTemplate::getName, name) + .eq(StringUtils.isNotBlank(content), SysMessageTemplate::getContent, content) .eq(StringUtils.isNotBlank(status), SysMessageTemplate::getStatus, status) - .orderByDesc(SysMessageTemplate::getCreateTime); - return lqw; - } + .eq(StringUtils.isNotBlank(title), SysMessageTemplate::getTitle, title); - /** - * 转换为实体对象 - */ - public SysMessageTemplate toEntity() { - SysMessageTemplate entity = new SysMessageTemplate(); - entity.setId(id); - entity.setTemplateName(templateName); -// entity.setTemplateCode(templateCode); - entity.setTemplateType(templateType); - entity.setTemplateContent(templateContent); - entity.setStatus(status); - entity.setTitle(title); -// entity.setRemark(remark); - return entity; } } diff --git a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/domain/vo/SysMessageTemplateVo.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/domain/vo/SysMessageTemplateVo.java index e395443ec..8249170ae 100644 --- a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/domain/vo/SysMessageTemplateVo.java +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/domain/vo/SysMessageTemplateVo.java @@ -1,5 +1,6 @@ package org.dromara.system.domain.vo; +import com.baomidou.mybatisplus.annotation.TableId; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import lombok.EqualsAndHashCode; @@ -16,11 +17,7 @@ import java.util.Date; * @author ruoyi */ @Data -@AutoMapper(target = SysMessageTemplate.class) public class SysMessageTemplateVo implements Serializable { - - private static final long serialVersionUID = 1L; - /** * 模板ID */ @@ -29,17 +26,17 @@ public class SysMessageTemplateVo implements Serializable { /** * 模板类型(1通知 2公告 3消息) */ - private String templateType; + private String type; -// /** -// * 模板编码 -// */ -// private String templateCode; + /** + * 模板编码 + */ + private String code; /** * 模板名称 */ - private String templateName; + private String name; /** * 模板标题 @@ -49,12 +46,8 @@ public class SysMessageTemplateVo implements Serializable { /** * 模板内容 */ - private String templateContent; + private String content; -// /** -// * 模板参数 -// */ -// private String templateParams; /** * 状态(0正常 1停用) @@ -81,8 +74,21 @@ public class SysMessageTemplateVo implements Serializable { */ private Date updateTime; -// /** -// * 备注 -// */ -// private String remark; + /** + * 扩展参数 + */ + private String ext; + + + /** + * 消息类型 + */ + private Integer action; + + /** + * 备注 + */ + private String description; + + private String params; } diff --git a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/domain/vo/SysMessageVo.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/domain/vo/SysMessageVo.java index 6b2dca0ac..97f0ecc66 100644 --- a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/domain/vo/SysMessageVo.java +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/domain/vo/SysMessageVo.java @@ -38,6 +38,9 @@ public class SysMessageVo implements Serializable { /** 消息内容 */ @ExcelProperty(value = "消息内容") private String content; + /** 扩展参数 */ + @ExcelProperty(value = "扩展参数") + private String ext; /** 消息类型(AUTO自动/MANUAL手动) */ @ExcelProperty(value = "消息类型") @@ -49,7 +52,7 @@ public class SysMessageVo implements Serializable { /** 发送者ID */ @ExcelProperty(value = "发送者ID") - private Long senderId; + private String senderId; /** 发送者名称 */ @ExcelProperty(value = "发送者") @@ -59,9 +62,6 @@ public class SysMessageVo implements Serializable { @ExcelProperty(value = "定时发送时间") private Date scheduledTime; -// /** 状态(0正常 1停用) */ -// @ExcelProperty(value = "状态") -// private String status; /** 创建时间 */ @ExcelProperty(value = "创建时间") @@ -76,6 +76,7 @@ public class SysMessageVo implements Serializable { /** 更新者 */ private String updateBy; - /** 扩展参数 */ - private Map params = new HashMap<>(); + private SysMessageTemplateVo template; + + private Map params; } diff --git a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/event/MessageEventListener.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/event/MessageEventListener.java index 846f4a11c..9ab0ae719 100644 --- a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/event/MessageEventListener.java +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/event/MessageEventListener.java @@ -1,7 +1,10 @@ package org.dromara.system.event; +import cn.hutool.json.JSONObject; +import com.google.gson.JsonObject; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.StringUtils; import org.dromara.common.json.utils.JsonUtils; import org.dromara.system.consumer.MessageRocketMQConsumer; import org.dromara.system.domain.event.MessageEvent; @@ -58,7 +61,7 @@ public class MessageEventListener { boolean tencentIMSendSuccess = false; try { // 消息发送者可能是系统或管理员,这里使用固定的管理员账号作为发送者 - String fromUserId = "administrator"; + String fromUserId = event.getMessage().getSenderId(); String toUserId = userId; // 接收者是事件中的用户ID String content = event.getMessage().getContent(); // 只取content字段 @@ -78,14 +81,15 @@ public class MessageEventListener { // 扩展字段,可以在APP端获取 String ext = null; - if (event.getMessage().getParams() != null && !event.getMessage().getParams().isEmpty()) { - ext = JsonUtils.toJsonString(event.getMessage().getParams()); + if (StringUtils.isNotBlank(event.getMessage().getExt())) { + ext = JsonUtils.toJsonString(event.getMessage().getExt()); } + String templateParams = event.getMessage().getTemplate().getParams(); // 根据消息类型决定推送方式 - Map params = event.getMessage().getParams(); + JSONObject params = new JSONObject(templateParams); String pushType = null; - if (params != null && params.containsKey("pushType")) { + if (params != null && params.get("pushType")!=null) { pushType = String.valueOf(params.get("pushType")); } @@ -126,7 +130,7 @@ public class MessageEventListener { } } else { // 默认为单用户推送 - TencentIMServiceImpl.TencentIMResult imResult = tencentIMService.sendMessageToTencentIM(fromUserId, toUserId, content); + TencentIMServiceImpl.TencentIMResult imResult = tencentIMService.sendMessageToTencentIM(fromUserId, toUserId, content,ext); tencentIMSendSuccess = imResult.isSuccess(); if (tencentIMSendSuccess) { log.info("腾讯IM推送成功,userId={}, response={}", toUserId, imResult.getRawResponse()); diff --git a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/ISysMessageService.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/ISysMessageService.java index 524880ce2..fcca734e9 100644 --- a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/ISysMessageService.java +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/ISysMessageService.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.system.domain.SysMessage; +import org.dromara.system.domain.SysMessageTemplate; import org.dromara.system.domain.bo.SysMessageBo; import org.dromara.system.domain.vo.SysMessageVo; @@ -58,16 +59,17 @@ public interface ISysMessageService extends IService { * @param userIds 用户ID列表 (String类型) * @return 结果 */ - int sendMessageToUsers(SysMessageBo message, List userIds); + int sendMessageToUsers(SysMessage message, SysMessageTemplate template,List userIds); - /** - * 发送自动消息 - * - * @param message 消息信息 - * @param userIds 用户ID列表 - * @return 结果 - */ - int sendAutoMessage(SysMessageBo message, List userIds); +// /** +// * +// * 发送自动消息 +// * +// * @param message 消息信息 +// * @param userIds 用户ID列表 +// * @return 结果 +// */ +// int sendAutoMessage(SysMessageBo message, List userIds); /** * 标记消息为已读 @@ -173,4 +175,11 @@ public interface ISysMessageService extends IService { */ SysMessage selectEntityById(Long id); + /** + * 发送消息 + * @param bo + * @return + */ + boolean send(SysMessageBo bo); + } diff --git a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/ISysMessageTemplateService.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/ISysMessageTemplateService.java index 2e642cfbd..26903369d 100644 --- a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/ISysMessageTemplateService.java +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/ISysMessageTemplateService.java @@ -41,21 +41,6 @@ public interface ISysMessageTemplateService extends IService */ SysMessageTemplateVo selectTemplateById(Long id); - /** - * 新增消息模板 - * - * @param template 消息模板信息 - * @return 结果 - */ - int insertTemplate(SysMessageTemplateBo template); - - /** - * 修改消息模板 - * - * @param template 消息模板信息 - * @return 结果 - */ - int updateTemplate(SysMessageTemplateBo template); /** * 批量删除消息模板 @@ -72,7 +57,7 @@ public interface ISysMessageTemplateService extends IService * @return 结果 */ int deleteTemplateById(Long id); - + /** * 根据名称查询消息模板列表(不分页) * @@ -80,4 +65,5 @@ public interface ISysMessageTemplateService extends IService * @return 消息模板列表 */ List selectTemplateListByName(String name); + SysMessageTemplate selectByTemplateType(String templateType) ; } diff --git a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/ISystemMessageUserService.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/ISystemMessageUserService.java new file mode 100644 index 000000000..13723bf83 --- /dev/null +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/ISystemMessageUserService.java @@ -0,0 +1,6 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.bo.SysMessageBo; + +public interface ISystemMessageUserService { +} diff --git a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/ITencentIMService.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/ITencentIMService.java index 42b5dec4d..5c9f226be 100644 --- a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/ITencentIMService.java +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/ITencentIMService.java @@ -19,8 +19,7 @@ public interface ITencentIMService { * @param content 消息内容 * @return 是否发送成功 */ - TencentIMServiceImpl.TencentIMResult sendMessageToTencentIM(String fromUserId, String toUserId, String content); - + TencentIMServiceImpl.TencentIMResult sendMessageToTencentIM(String fromUserId, String toUserId, String content, String cloudCustomData); /** * 推送消息给全体用户 diff --git a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/impl/SysMessageServiceImpl.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/impl/SysMessageServiceImpl.java index bf8390bae..7515d88a0 100644 --- a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/impl/SysMessageServiceImpl.java +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/impl/SysMessageServiceImpl.java @@ -4,23 +4,35 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.wzj.soopin.content.domain.po.Vlog; +import com.wzj.soopin.content.service.VlogService; +import com.wzj.soopin.member.domain.po.Member; +import com.wzj.soopin.member.service.IMemberService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.text.StringSubstitutor; +import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.im.enums.MessageActionEnum; +import org.dromara.system.converter.SysMessageConvert; +import org.dromara.system.converter.SysMessageTemplateConvert; import org.dromara.system.domain.SysMessage; import org.dromara.system.domain.SysMessageTemplate; import org.dromara.system.domain.SysMessageUser; import org.dromara.system.domain.bo.SysMessageBo; import org.dromara.system.domain.event.MessageEvent; import org.dromara.system.domain.vo.SysMessageVo; +import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.mapper.SysMessageMapper; import org.dromara.system.mapper.SysMessageUserMapper; import org.dromara.system.service.ISysMessageService; +import org.dromara.system.service.ISysMessageTemplateService; +import org.dromara.system.service.ISysTenantService; +import org.dromara.system.service.ISysUserService; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -41,8 +53,13 @@ public class SysMessageServiceImpl extends ServiceImpl selectPageMessageList(SysMessageBo bo, PageQuery pageQuery) { @@ -89,26 +106,26 @@ public class SysMessageServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SysMessageUser::getMessageId, entity.getId()) - .eq(SysMessageUser::getUserId, userId); + .eq(SysMessageUser::getUserId, userId); int count = Math.toIntExact(messageUserMapper.selectCount(queryWrapper)); int rows = 0; if (count == 0) { @@ -132,13 +149,12 @@ public class SysMessageServiceImpl extends ServiceImpl userIds) { + public int sendMessageToUsers(SysMessage message, SysMessageTemplate template, List userIds) { if (userIds == null || userIds.isEmpty()) { return 0; } // 保存消息 - SysMessage entity = message.toEntity(); - Date scheduledTime = entity.getScheduledTime(); + Date scheduledTime = message.getScheduledTime(); // if (scheduledTime != null && scheduledTime.after(new Date())) { // entity.setStatus("0"); // 未发送 // messageMapper.insert(entity); @@ -191,8 +207,7 @@ public class SysMessageServiceImpl extends ServiceImpl validUserIds = new ArrayList<>(); @@ -211,7 +226,7 @@ public class SysMessageServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(SysMessageUser::getMessageId, entity.getId()) + queryWrapper.eq(SysMessageUser::getMessageId, message.getId()) .in(SysMessageUser::getUserId, validUserIds); List existingRecords = messageUserMapper.selectList(queryWrapper); Set existingUserIds = existingRecords.stream() @@ -222,7 +237,7 @@ public class SysMessageServiceImpl extends ServiceImpl 0) { - SysMessageVo messageVo = MapstructUtils.convert(entity, SysMessageVo.class); + + SysMessageVo messageVo = MapstructUtils.convert(message, SysMessageVo.class); + //获取模板信息,将模板的content作为参数传给消息 + messageVo.setTemplate(templateConvert.toVO(template)); for (Long userId : validUserIds) { + + messageVo.setContent(buildContent(template.getContent(), messageVo.getParams())); + messageVo.setExt(buildContent(template.getExt(), messageVo.getParams())); + eventPublisher.publishEvent(new MessageEvent(this, messageVo, userId)); } } @@ -250,12 +272,12 @@ public class SysMessageServiceImpl extends ServiceImpl userIds) { - message.setMsgType("AUTO"); - return sendMessageToUsers(message, userIds.stream().map(String::valueOf).collect(Collectors.toList())); - } +// @Override +// @Transactional(rollbackFor = Exception.class) +// public int sendAutoMessage(SysMessageBo message, List userIds) { +// message.setMsgType("AUTO"); +// return sendMessageToUsers(message, userIds.stream().map(String::valueOf).collect(Collectors.toList())); +// } @Override @Transactional(rollbackFor = Exception.class) @@ -295,8 +317,6 @@ public class SysMessageServiceImpl extends ServiceImpl lqw = new LambdaQueryWrapper<>(); lqw.eq(StringUtils.isNotBlank(message.getMsgType()), SysMessage::getMsgType, message.getMsgType()) .eq(StringUtils.isNotBlank(message.getSubType()), SysMessage::getSubType, message.getSubType()) - .eq(message.getSenderId() != null, SysMessage::getSenderId, message.getSenderId()) -// .eq(StringUtils.isNotBlank(message.getStatus()), SysMessage::getStatus, message.getStatus()) .orderByDesc(SysMessage::getCreateTime); return MapstructUtils.convert(messageMapper.selectList(lqw), SysMessageVo.class); } @@ -308,12 +328,12 @@ public class SysMessageServiceImpl extends ServiceImpl idList = new ArrayList<>(); + + switch (sendScope) { + case 1: // all + idList = processAllIds(bo.getIdList()); + + break; + case 2: // 指定用户 + idList = processUserIds(bo.getIdList()); + break; + case 3: // 指定会员 + idList = processMemberIds(bo.getIdList()); + break; + case 4: // 指定租户 + idList = processTenantIds(bo.getIdList()); + break; + default: + throw new ServiceException("不支持的消息类型"); + } + + // 如果没有找到接收者,返回失败 + if (idList.isEmpty()) { + throw new ServiceException("未找到消息接收者"); + } + + //构建发送者 + MessageActionEnum actionEnum = MessageActionEnum.getByCode(template.getAction()); + //根据用户名获取发送者 + bo.setSenderId(actionEnum.name()); + + SysMessage message = messageConvert.toPo(bo); + message.setStatus("1"); // 已发送 + message.setTitle(template.getTitle()); + message.setContent(template.getContent()); + message.setSendScope(sendScope); + message.setTemplateId(template.getId()); + + //构建content + + + //获取模板信息 + messageMapper.insert(message); + + // 判断是否为定时消息,若是则注册SnailJob单次任务 + if (bo.getScheduledTime() != null && bo.getScheduledTime().after(new java.util.Date())) { + + registSnailJob(bo, idList); + } else { + //推送消息 + sendMessageToUsers(message, template, idList); + } + return true; + } + + private String buildContent(String orgMsg, Map params) { + for (String key : params.keySet()) { + orgMsg = orgMsg.replaceAll("\\$\\{" + key + "\\}", params.get(key).toString()); + } + return orgMsg; + } + + private List processAllIds(List idList) { + return null; + } + + private List processUserIds(List idList) { + // 角色ID列表转换为用户ID列表 + return idList.stream().map(String::valueOf).toList(); + } + + private List processMemberIds(List idList) { + // 会员ID列表转换为用户ID列表 + return idList.stream().map(String::valueOf).toList(); + + } + + private List processTenantIds(List idList) { + // 租户ID列表转换为用户ID列表 + + List users = userService.selectUserByIds(idList, null); + return users.stream().map(SysUserVo::getUserId).map(String::valueOf).toList(); + } + + private boolean registSnailJob(SysMessageBo bo, List idList) { + // 先保存消息,获取ID + // 创建SnailJob单次任务 +// SnailJobApiUtil.createSingleJob(null, bo.getScheduledTime()); +// // 关联用户 +// for (String userId : idList) { +// org.dromara.system.domain.SysMessageUser messageUser = new org.dromara.system.domain.SysMessageUser(); +// messageUser.setMessageId(bo.getId()); +// messageUser.setUserId(Long.valueOf(userId)); +// messageUser.setIsRead(false); +// // 这里假设有messageUserMapper可用,实际应通过service或mapper注入 +// // messageUserMapper.insert(messageUser); +// } + return true; + } + + } diff --git a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/impl/SysMessageTemplateServiceImpl.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/impl/SysMessageTemplateServiceImpl.java index 5b0007d34..3bec61255 100644 --- a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/impl/SysMessageTemplateServiceImpl.java +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/impl/SysMessageTemplateServiceImpl.java @@ -31,12 +31,6 @@ public class SysMessageTemplateServiceImpl extends ServiceImpl selectTemplatePage(SysMessageTemplateBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); - lqw.eq(StringUtils.isNotBlank(bo.getTemplateType()), SysMessageTemplate::getTemplateType, bo.getTemplateType()) -// .eq(StringUtils.isNotBlank(bo.getStatus()), SysMessageTemplate::getStatus, bo.getStatus()) - .like(StringUtils.isNotBlank(bo.getTemplateName()), SysMessageTemplate::getTemplateName, bo.getTemplateName()) -// .like(StringUtils.isNotBlank(bo.getTemplateCode()), SysMessageTemplate::getTemplateCode, bo.getTemplateCode()) - .orderByDesc(SysMessageTemplate::getCreateTime); - Page page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()); Page resultPage = templateMapper.selectPage(page, lqw); List records = MapstructUtils.convert(resultPage.getRecords(), SysMessageTemplateVo.class); @@ -47,13 +41,7 @@ public class SysMessageTemplateServiceImpl extends ServiceImpl selectTemplateList(SysMessageTemplateBo bo) { - LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); - lqw.eq(StringUtils.isNotBlank(bo.getTemplateType()), SysMessageTemplate::getTemplateType, bo.getTemplateType()) -// .eq(StringUtils.isNotBlank(bo.getStatus()), SysMessageTemplate::getStatus, bo.getStatus()) - .like(StringUtils.isNotBlank(bo.getTemplateName()), SysMessageTemplate::getTemplateName, bo.getTemplateName()) -// .like(StringUtils.isNotBlank(bo.getTemplateCode()), SysMessageTemplate::getTemplateCode, bo.getTemplateCode()) - .orderByDesc(SysMessageTemplate::getCreateTime); - return MapstructUtils.convert(templateMapper.selectList(lqw), SysMessageTemplateVo.class); + return MapstructUtils.convert(templateMapper.selectList(bo.toWrapper()), SysMessageTemplateVo.class); } @Override @@ -61,16 +49,6 @@ public class SysMessageTemplateServiceImpl extends ServiceImpl selectTemplateListByName(String name) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); if (StringUtils.isNotBlank(name)) { - queryWrapper.like(SysMessageTemplate::getTemplateName, name); + queryWrapper.like(SysMessageTemplate::getName, name); } queryWrapper.orderByDesc(SysMessageTemplate::getCreateTime); return MapstructUtils.convert(templateMapper.selectList(queryWrapper), SysMessageTemplateVo.class); @@ -94,9 +72,10 @@ public class SysMessageTemplateServiceImpl extends ServiceImpl lqw = new LambdaQueryWrapper<>(); - lqw.eq(SysMessageTemplate::getTemplateType, templateType).eq(SysMessageTemplate::getStatus, 0); + lqw.eq(SysMessageTemplate::getType, templateType).eq(SysMessageTemplate::getStatus, 0); return templateMapper.selectOne(lqw); } } diff --git a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/impl/SystemMessageUserService.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/impl/SystemMessageUserService.java new file mode 100644 index 000000000..8bf655d6f --- /dev/null +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/impl/SystemMessageUserService.java @@ -0,0 +1,23 @@ +package org.dromara.system.service.impl; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.system.domain.SysMessageTemplate; +import org.dromara.system.domain.bo.SysMessageBo; +import org.dromara.system.domain.vo.SysUserVo; +import org.dromara.system.service.*; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +@RequiredArgsConstructor +@Slf4j +public class SystemMessageUserService implements ISystemMessageUserService { + + + + +} diff --git a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/impl/TencentIMServiceImpl.java b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/impl/TencentIMServiceImpl.java index 8671306c7..4be3abefa 100644 --- a/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/impl/TencentIMServiceImpl.java +++ b/ruoyi-modules/ruoyi-im/src/main/java/org/dromara/system/service/impl/TencentIMServiceImpl.java @@ -1,5 +1,6 @@ package org.dromara.system.service.impl; +import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import jakarta.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; @@ -170,7 +171,7 @@ public class TencentIMServiceImpl implements ITencentIMService { } @Override - public TencentIMResult sendMessageToTencentIM(String fromUserId, String toUserId, String content) { + public TencentIMResult sendMessageToTencentIM(String fromUserId, String toUserId, String msgBody,String cloudCustomData) { TencentIMResult result = new TencentIMResult(); try { String userSig = generateAdminUserSig(); @@ -182,17 +183,16 @@ public class TencentIMServiceImpl implements ITencentIMService { adminAccount, userSig, random); - Map msgContent = new HashMap<>(); - msgContent.put("Text", content); - Map msgBody = new HashMap<>(); - msgBody.put("MsgType", "TIMTextElem"); - msgBody.put("MsgContent", msgContent); - Map requestBody = new HashMap<>(); + + JSONArray jsonArray=new JSONArray(); + jsonArray.add(new JSONObject(msgBody)); + JSONObject requestBody = new JSONObject(); requestBody.put("SyncOtherMachine", 2); requestBody.put("From_Account", fromUserId); requestBody.put("To_Account", toUserId); requestBody.put("MsgRandom", Integer.parseInt(random)); - requestBody.put("MsgBody", new Object[]{msgBody}); + requestBody.put("MsgBody", jsonArray); + requestBody.put("CloudCustomData", cloudCustomData); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity> requestEntity = new HttpEntity<>(requestBody, headers); @@ -248,6 +248,7 @@ public class TencentIMServiceImpl implements ITencentIMService { requestBody.put("MsgRandom", Integer.parseInt(random)); requestBody.put("MsgBody", new Object[]{msgBody}); + requestBody.put("CloudCustomData", ext); // 设置离线推送信息 if (offlinePush) { Map offlinePushInfo = new HashMap<>(); diff --git a/ruoyi-modules/ruoyi-member/pom.xml b/ruoyi-modules/ruoyi-member/pom.xml index 2afe91c97..acc13c044 100644 --- a/ruoyi-modules/ruoyi-member/pom.xml +++ b/ruoyi-modules/ruoyi-member/pom.xml @@ -34,10 +34,7 @@ org.dromara ruoyi-common-translation - - org.dromara - ruoyi-im - + org.dromara diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/FansController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/FansController.java index 5344962f0..38163a1d4 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/FansController.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/FansController.java @@ -124,7 +124,7 @@ public class FansController { log.warn("IM回调Pair参数转换失败: {}", pair); continue; } - handleImFollow(fromId, java.util.Arrays.asList(toId)); + service.doFollow(fromId, toId); log.info("IM回调处理成功: fromId={}, vloggerId={}", fromId, toId); } else { log.warn("IM回调Pair参数不完整: {}", pair); diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/ImCallbackController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/ImCallbackController.java index b8042897a..b3cd9d563 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/ImCallbackController.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/ImCallbackController.java @@ -25,7 +25,6 @@ public class ImCallbackController { private static final Logger log = LoggerFactory.getLogger(ImCallbackController.class); // private static final String CALLBACK_TOKEN = "your_auth_token"; // - @Autowired private IMemberService memberService; @Autowired @@ -37,10 +36,10 @@ public class ImCallbackController { @PostMapping public R handleCallback( - @RequestParam(value = "Sign", required = false) String sign, - @RequestParam(value = "RequestTime", required = false) String requestTime, - @RequestParam(value = "CallbackCommand", required = false) String callbackCommand, - @RequestBody Map requestBody) { + @RequestParam(value = "Sign", required = false) String sign, + @RequestParam(value = "RequestTime", required = false) String requestTime, + @RequestParam(value = "CallbackCommand", required = false) String callbackCommand, + @RequestBody Map requestBody) { // // 1. 签名验证 // if (!verifySignature(CALLBACK_TOKEN, sign, requestTime)) { @@ -55,11 +54,11 @@ public class ImCallbackController { return R.fail(1002, "缺少CallbackCommand"); } switch (callbackCommand) { - case "Sns.CallbackFriendAdd": + case "Sns.CallbackFriendAdd"://好友添加 // 关注,直接调用 FansController 的 follow fansController.follow(requestBody, null, null); break; - case "Sns.CallbackFriendDelete": + case "Sns.CallbackFriendDelete"://好友删除 // 取关,直接调用 FansController 的 cancel fansController.cancel(requestBody, null, null); break; @@ -73,6 +72,12 @@ public class ImCallbackController { case "Sns.CallbackBlackListDelete": handleImCancelBlock(requestBody); break; + case "Follow.CallbackAfterFollowAdd"://关注 + fansController.follow(requestBody, null, null); + break; + case "Follow.CallbackAfterFollowDelete"://取关 + fansController.cancel(requestBody, null, null); + break; default: log.info("收到未知事件类型: {}, 参数: {}", callbackCommand, requestBody); break; @@ -81,7 +86,7 @@ public class ImCallbackController { } // 处理IM关注事件 - private void handleImFollow(MaprequestBody) { + private void handleImFollow(Map requestBody) { Object pairListObj = requestBody.get("PairList"); if (pairListObj instanceof List) { List pairList = (List) pairListObj; diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberAddressController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberAddressController.java index 97ab3fc0f..ce4ad7b1b 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberAddressController.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberAddressController.java @@ -7,7 +7,6 @@ import com.wzj.soopin.member.convert.MemberAddressConvert; import com.wzj.soopin.member.domain.bo.MemberAddressBO; import com.wzj.soopin.member.domain.po.MemberAddress; import com.wzj.soopin.member.domain.vo.MemberAddressVO; -import org.dromara.system.mapper.AddressMapper; import com.wzj.soopin.member.service.IMemberAddressService; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; @@ -15,10 +14,9 @@ import org.dromara.common.core.domain.R; import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; -import org.dromara.common.redis.redis.RedisService; import org.springframework.web.bind.annotation.*; -import java.util.*; +import java.util.List; /** * 会员收货地址Controller diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberController.java index 4ee3d0ca9..e22e28df1 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberController.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberController.java @@ -64,7 +64,7 @@ public class MemberController extends BaseController { @Tag(name ="获取会员信息详细信息") @GetMapping(value = "{id}") public R getInfo(@PathVariable("id") Long id) { - return R.ok(convert.toVO(service.getById(id))); + return R.ok(service.getMemberInfo(id)); } @Tag(name ="新增会员信息") diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/FansServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/FansServiceImpl.java index 8d227f3b5..f0a4c17d3 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/FansServiceImpl.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/FansServiceImpl.java @@ -5,25 +5,20 @@ 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.wzj.soopin.member.domain.po.Fans; +import com.wzj.soopin.member.domain.po.Member; import com.wzj.soopin.member.domain.vo.FansVO; import com.wzj.soopin.member.mapper.FansMapper; import com.wzj.soopin.member.service.IFansService; +import com.wzj.soopin.member.service.IMemberService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.CacheConstants; import org.dromara.common.core.enums.YesOrNo; import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.redis.config.RedisConfig; import org.dromara.common.redis.redis.RedisCache; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.dromara.system.service.ISysMessageService; -import org.dromara.system.service.ISysMessageTemplateService; -import org.dromara.system.domain.bo.SysMessageBo; -import org.dromara.system.domain.vo.SysMessageTemplateVo; -import com.wzj.soopin.member.domain.po.Member; -import com.wzj.soopin.member.service.IMemberService; -import org.springframework.beans.factory.annotation.Autowired; import java.util.HashMap; import java.util.Map; @@ -35,10 +30,7 @@ public class FansServiceImpl extends ServiceImpl implements IF private final RedisCache redisCache; - @Autowired - private ISysMessageService sysMessageService; - @Autowired - private ISysMessageTemplateService templateService; + @Autowired private IMemberService memberService; @@ -72,17 +64,17 @@ public class FansServiceImpl extends ServiceImpl implements IF Member vlogger = memberService.getById(vloggerId); if (follower != null && vlogger != null && !myId.equals(vloggerId)) { // 新版:使用模板类型编号和参数 - Map params = new HashMap<>(); - params.put("followerNickname", follower.getNickname() == null ? "" : follower.getNickname()); - params.put("vloggerNickname", vlogger.getNickname() == null ? "" : vlogger.getNickname()); - SysMessageBo messageBo = new SysMessageBo(); - // 关注类型编号 - messageBo.setTemplateType(org.dromara.system.domain.MessageTemplateType.FOLLOW); - messageBo.setTemplateParams(params); - messageBo.setSenderId(myId); - // 补充:设置消息标题,防止title为null - messageBo.setTitle("关注通知"); - sysMessageService.sendMessageToUser(messageBo, vloggerId); +// Map params = new HashMap<>(); +// params.put("followerNickname", follower.getNickname() == null ? "" : follower.getNickname()); +// params.put("vloggerNickname", vlogger.getNickname() == null ? "" : vlogger.getNickname()); +// SysMessageBo messageBo = new SysMessageBo(); +// // 关注类型编号 +// messageBo.setTemplateType(org.dromara.system.domain.MessageTemplateType.FOLLOW); +// messageBo.setTemplateParams(params); +// messageBo.setSenderId(myId); +// // 补充:设置消息标题,防止title为null +// messageBo.setTitle("关注通知"); +// sysMessageService.sendMessageToUser(messageBo, vloggerId); } } @@ -122,16 +114,16 @@ public class FansServiceImpl extends ServiceImpl implements IF Member vlogger = memberService.getById(vloggerId); if (follower != null && vlogger != null && !myId.equals(vloggerId)) { // 新版:使用模板类型编号和参数 - Map params = new HashMap<>(); - params.put("followerNickname", follower.getNickname() == null ? "" : follower.getNickname()); - params.put("vloggerNickname", vlogger.getNickname() == null ? "" : vlogger.getNickname()); - SysMessageBo messageBo = new SysMessageBo(); - messageBo.setTemplateType(org.dromara.system.domain.MessageTemplateType.UNFOLLOW); // 取关类型编号 - messageBo.setTemplateParams(params); - messageBo.setSenderId(myId); - // 补充:设置消息标题,防止title为null - messageBo.setTitle("取消关注通知"); - sysMessageService.sendMessageToUser(messageBo, vloggerId); +// Map params = new HashMap<>(); +// params.put("followerNickname", follower.getNickname() == null ? "" : follower.getNickname()); +// params.put("vloggerNickname", vlogger.getNickname() == null ? "" : vlogger.getNickname()); +// SysMessageBo messageBo = new SysMessageBo(); +// messageBo.setTemplateType(org.dromara.system.domain.MessageTemplateType.UNFOLLOW); // 取关类型编号 +// messageBo.setTemplateParams(params); +// messageBo.setSenderId(myId); +// // 补充:设置消息标题,防止title为null +// messageBo.setTitle("取消关注通知"); +// sysMessageService.sendMessageToUser(messageBo, vloggerId); } } @@ -145,7 +137,7 @@ public class FansServiceImpl extends ServiceImpl implements IF public boolean queryDoIFollowVloger(String myId, String vloggerId) { try { // Try to convert string IDs to Long if they are numeric - if (myId != null && vloggerId != null && + if (myId != null && vloggerId != null && myId.matches("\\d+") && vloggerId.matches("\\d+")) { Fans vlogger = queryFansRelationship(Long.valueOf(myId), Long.valueOf(vloggerId)); return vlogger != null; diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java index 2d9b2d074..a09b57c81 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java @@ -20,6 +20,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.CacheConstants; import org.dromara.common.core.constant.CachePrefix; +import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.constant.ResultCode; import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.exception.ServiceException; @@ -95,7 +96,7 @@ public class MemberServiceImpl extends ServiceImpl implemen return true; } - @CacheEvict(value = CacheConstants.MEMBER, key = "#id") + @CacheEvict(value = GlobalConstants.MEMBER_KEY, key = "#id") public int updateMark(MemberBO member) { UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.set("mark",member.getMark()) @@ -106,7 +107,7 @@ public class MemberServiceImpl extends ServiceImpl implemen - @CacheEvict(value = CacheConstants.MEMBER, key = "#id") + @CacheEvict(value = GlobalConstants.MEMBER_KEY, key = "#id") public Integer changeStatus(MemberBO bo) { UpdateWrapper wrapper = new UpdateWrapper<>(); wrapper.eq("id", bo.getId()); @@ -258,7 +259,7 @@ public class MemberServiceImpl extends ServiceImpl implemen @Override - @Cacheable (cacheNames = CacheConstants.MEMBER, key = "#id") + @Cacheable (cacheNames = GlobalConstants.MEMBER_KEY , key = "#id") public MemberVO getMemberInfo(Serializable id) { return memberConvert.toVO(getById(id)); } diff --git a/ruoyi-modules/ruoyi-order/pom.xml b/ruoyi-modules/ruoyi-order/pom.xml index 163235cd3..5d5fc062b 100644 --- a/ruoyi-modules/ruoyi-order/pom.xml +++ b/ruoyi-modules/ruoyi-order/pom.xml @@ -162,10 +162,7 @@ org.dromara ruoyi-content - - org.dromara - ruoyi-im - + com.github.wechatpay-apiv3 diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderController.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderController.java index 3bb8fc607..6ff5381bb 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderController.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/controller/OrderController.java @@ -79,7 +79,7 @@ public class OrderController extends BaseController { if (result != null) { // 订单创建成功,发送消息 - service.sendMessage(order); +// service.sendMessage(order); log.info("订单创建成功,消息已发送,订单ID: {}", order.getId()); } else { log.warn("订单创建失败: {}", "返回结果为null"); diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderServiceImpl.java index 7efa0f575..075fb97d8 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderServiceImpl.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/OrderServiceImpl.java @@ -1,17 +1,18 @@ package com.wzj.soopin.order.service.impl; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; 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.wzj.soopin.goods.domain.entity.Sku; import com.wzj.soopin.goods.mapper.SkuMapper; import com.wzj.soopin.member.domain.po.Member; -import com.wzj.soopin.member.mapper.*; +import com.wzj.soopin.member.mapper.MemberMapper; +import com.wzj.soopin.member.mapper.MemberWechatMapper; import com.wzj.soopin.order.domain.bo.OrderBo; import com.wzj.soopin.order.domain.entity.*; import com.wzj.soopin.order.domain.form.DeliverProductForm; @@ -30,11 +31,7 @@ import org.dromara.common.core.utils.SecurityUtils; import org.dromara.common.redis.redis.RedisService; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.system.domain.SysTenant; -import org.dromara.system.domain.bo.SysMessageBo; -import org.dromara.system.domain.vo.SysMessageTemplateVo; import org.dromara.system.mapper.SysTenantMapper; -import org.dromara.system.service.ISysMessageTemplateService; -import org.dromara.system.service.impl.SysMessageServiceImpl; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageImpl; @@ -63,8 +60,6 @@ public class OrderServiceImpl extends ServiceImpl implements private final OrderDeliveryHistoryMapper orderDeliveryHistoryMapper; private final VerificationCodeService verificationCodeService; private final SysTenantMapper sysTenantMapper; - private final ISysMessageTemplateService templateService; - private final SysMessageServiceImpl sysMessageService; private final MemberWechatMapper memberWechatMapper; private final WechatPaymentHistoryMapper wechatPaymentHistoryMapper; private final RedisService redisService; @@ -499,27 +494,27 @@ public class OrderServiceImpl extends ServiceImpl implements return baseMapper.selectOne(new LambdaQueryWrapper().eq(Order::getOrderSn,orderNo)); } - public void sendMessage(Order order) { - Long memberId = order.getMemberId(); - Long orderId = order.getId(); - // 订单创建成功模板ID - Long templateId =1940586928850100226L; - // 查询模板信息 - SysMessageTemplateVo template = templateService.selectTemplateById(templateId); - log.info("模板信息为: {}", template); - - if (template != null) { - Map params = new HashMap<>(); - params.put("orderSn", order.getOrderSn()); - params.put("productName", orderItemMapper.getName(orderId)); - SysMessageBo messageBo = new SysMessageBo(); - messageBo.setTemplateType(org.dromara.system.domain.MessageTemplateType.ORDER_NOTICE); - messageBo.setTemplateParams(params); - messageBo.setSenderId(memberId); - messageBo.setTitle(template.getTitle()); - sysMessageService.sendMessageToUser(messageBo, memberId); - } - } +// public void sendMessage(Order order) { +// Long memberId = order.getMemberId(); +// Long orderId = order.getId(); +// // 订单创建成功模板ID +// Long templateId =1940586928850100226L; +// // 查询模板信息 +// SysMessageTemplateVo template = templateService.selectTemplateById(templateId); +// log.info("模板信息为: {}", template); +// +// if (template != null) { +// Map params = new HashMap<>(); +// params.put("orderSn", order.getOrderSn()); +// params.put("productName", orderItemMapper.getName(orderId)); +// SysMessageBo messageBo = new SysMessageBo(); +// messageBo.setTemplateType(org.dromara.system.domain.MessageTemplateType.ORDER_NOTICE); +// messageBo.setTemplateParams(params); +// messageBo.setSenderId(memberId); +// messageBo.setTitle(template.getTitle()); +// sysMessageService.sendMessageToUser(messageBo, memberId); +// } +// } /** * 处理退款逻辑 diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/VerificationCodeServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/VerificationCodeServiceImpl.java index 5b3dbb303..19a0efe80 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/VerificationCodeServiceImpl.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/VerificationCodeServiceImpl.java @@ -15,10 +15,6 @@ import com.wzj.soopin.order.utils.StringUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.R; -import org.dromara.system.domain.bo.SysMessageBo; -import org.dromara.system.domain.vo.SysMessageTemplateVo; -import org.dromara.system.service.ISysMessageTemplateService; -import org.dromara.system.service.impl.SysMessageServiceImpl; import org.springframework.stereotype.Service; import java.time.LocalDateTime; @@ -40,8 +36,6 @@ public class VerificationCodeServiceImpl extends ServiceImpl params = new HashMap<>(); // params.put("productName", productName); params.put("verificationTime", formattedTime); - SysMessageBo messageBo = new SysMessageBo(); - // 核销成功类型编号 - messageBo.setTemplateType(org.dromara.system.domain.MessageTemplateType.VERIFY_SUCCESS); - messageBo.setTemplateParams(params); - messageBo.setSenderId(memberId); - // 补充:设置消息标题 - messageBo.setTitle("核销成功通知"); - sysMessageService.sendMessageToUser(messageBo, memberId); +// SysMessageBo messageBo = new SysMessageBo(); +// // 核销成功类型编号 +// messageBo.setTemplateType(org.dromara.system.domain.MessageTemplateType.VERIFY_SUCCESS); +// messageBo.setTemplateParams(params); +// messageBo.setSenderId(memberId); +// // 补充:设置消息标题 +// messageBo.setTitle("核销成功通知"); +// sysMessageService.sendMessageToUser(messageBo, memberId); } @Override @@ -253,13 +247,13 @@ public class VerificationCodeServiceImpl extends ServiceImpl params = new HashMap<>(); // params.put("productName", productName); params.put("reason", reason); - SysMessageBo messageBo = new SysMessageBo(); - // 核销失败类型编号 - messageBo.setTemplateType(org.dromara.system.domain.MessageTemplateType.VERIFY_FAIL); - messageBo.setTemplateParams(params); - messageBo.setSenderId(memberId); - // 补充:设置消息标题 - messageBo.setTitle("核销失败通知"); - sysMessageService.sendMessageToUser(messageBo, memberId); +// SysMessageBo messageBo = new SysMessageBo(); +// // 核销失败类型编号 +// messageBo.setTemplateType(org.dromara.system.domain.MessageTemplateType.VERIFY_FAIL); +// messageBo.setTemplateParams(params); +// messageBo.setSenderId(memberId); +// // 补充:设置消息标题 +// messageBo.setTitle("核销失败通知"); +// sysMessageService.sendMessageToUser(messageBo, memberId); } }