From 0be8c21f5b181a11705b021b345b2bd13d1986a9 Mon Sep 17 00:00:00 2001 From: haungxing <1203316822@qq.com> Date: Thu, 10 Aug 2023 09:04:48 +0800 Subject: [PATCH] =?UTF-8?q?#=20=E7=9F=AD=E4=BF=A1=E5=8D=B3=E6=97=B6?= =?UTF-8?q?=E6=8E=A8=E9=80=81=E6=8E=A5=E5=8F=A3=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MessagePushRecordController.java | 7 +++ .../hnac/hzims/message/fegin/MessageClient.java | 18 +++++++ .../message/schedule/MessagePushSchedule.java | 55 +++++++++++++++++++++- .../message/service/IMessagePushRecordService.java | 13 +++++ .../service/impl/MessagePushRecordServiceImpl.java | 18 +++++++ .../service/impl/PushMessageServiceImpl.java | 25 ++++++---- .../message/src/main/resources/application.yml | 6 +++ 7 files changed, 132 insertions(+), 10 deletions(-) diff --git a/hzims-service/message/src/main/java/com/hnac/hzims/message/controller/MessagePushRecordController.java b/hzims-service/message/src/main/java/com/hnac/hzims/message/controller/MessagePushRecordController.java index 560bbcc..6565190 100644 --- a/hzims-service/message/src/main/java/com/hnac/hzims/message/controller/MessagePushRecordController.java +++ b/hzims-service/message/src/main/java/com/hnac/hzims/message/controller/MessagePushRecordController.java @@ -114,4 +114,11 @@ public class MessagePushRecordController extends BladeController { List personalUnreadMessage = messagePushRecordService.getPersonalAppUnreadMessage(); return R.data(personalUnreadMessage); } + + @PostMapping("/sendMessage") + @ApiOperation("消息推送") + @ApiOperationSupport(order = 10) + public R sendMessage(@RequestBody MessagePushRecordEntity request) { + return R.status(messagePushRecordService.saveAndSend(request)); + } } diff --git a/hzims-service/message/src/main/java/com/hnac/hzims/message/fegin/MessageClient.java b/hzims-service/message/src/main/java/com/hnac/hzims/message/fegin/MessageClient.java index 0660fdd..e8b8ff0 100644 --- a/hzims-service/message/src/main/java/com/hnac/hzims/message/fegin/MessageClient.java +++ b/hzims-service/message/src/main/java/com/hnac/hzims/message/fegin/MessageClient.java @@ -131,6 +131,7 @@ public class MessageClient extends BladeController implements IMessageClient{ record.setPlanTime(LocalDateTime.now()); record.setType(messageType); record.setCreateDept(record.getDeptId()); + record.setStatus(MessageConstants.NOT_PUSH); return record; }); }).collect(Collectors.toList()); @@ -148,4 +149,21 @@ public class MessageClient extends BladeController implements IMessageClient{ } } + @Override + @PostMapping(SEND_SMS_IMMEDIATELY_MSG) + public R sendSmsImmediatelyMsg(@RequestBody SmsImmediatelyPushDTO smsImmediatelyPushDTO) { + MessagePushRecordEntity record = BeanUtil.copy(smsImmediatelyPushDTO,MessagePushRecordEntity.class); + record.setMessageId(IdWorker.getId()); + String pusherName = Optional.ofNullable(smsImmediatelyPushDTO.getPusher()).map(Func::toLong).map(UserCache::getUser).map(User::getName).orElse(null); + record.setPusherName(pusherName); + record.setPushType(MessageConstants.IMMEDIATELY); + record.setPlanTime(LocalDateTime.now()); + record.setType(MessageConstants.SMS_PUSH); + record.setCreateDept(record.getDeptId()); + record.setUpdateUser(smsImmediatelyPushDTO.getCreateUser()); + record.setStatus(MessageConstants.NOT_PUSH); + record.setSmsParam(JSON.toJSONString(smsImmediatelyPushDTO.getParams())); + return R.data(recordService.sendSmsImmediatelyMsg(record)); + } + } diff --git a/hzims-service/message/src/main/java/com/hnac/hzims/message/schedule/MessagePushSchedule.java b/hzims-service/message/src/main/java/com/hnac/hzims/message/schedule/MessagePushSchedule.java index f727620..a73c13b 100644 --- a/hzims-service/message/src/main/java/com/hnac/hzims/message/schedule/MessagePushSchedule.java +++ b/hzims-service/message/src/main/java/com/hnac/hzims/message/schedule/MessagePushSchedule.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.google.common.collect.Lists; import com.hnac.hzims.common.utils.DateUtil; import com.hnac.hzims.message.MessageConstants; import com.hnac.hzims.message.config.MessageFactory; @@ -14,11 +15,18 @@ import com.hnac.hzims.message.entity.config.MessageTemplateEntity; import com.hnac.hzims.message.service.IMessagePushRecordService; import com.hnac.hzims.message.service.IMessageService; import com.hnac.hzims.message.service.IMessageTemplateService; +import com.hnac.hzims.message.service.impl.PushMessageServiceImpl; import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.handler.annotation.XxlJob; +import com.xxl.job.core.log.XxlJobLogger; import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.tool.utils.CollectionUtil; +import org.springblade.core.tool.utils.Func; +import org.springblade.core.tool.utils.SpringUtil; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import java.time.LocalDate; @@ -29,6 +37,7 @@ import java.util.*; import java.util.stream.Collectors; import static com.hnac.hzims.message.constants.XxlJobConstants.PUSH_MESSAGE_BY_NOTICE; +import static com.hnac.hzims.message.constants.XxlJobConstants.PUSH_APP_MESSAGE; /** * @ClassName MessagePushSchedule @@ -38,18 +47,21 @@ import static com.hnac.hzims.message.constants.XxlJobConstants.PUSH_MESSAGE_BY_N * @Version 4.0 **/ @Component -@AllArgsConstructor +@RequiredArgsConstructor @Slf4j public class MessagePushSchedule { private final IMessageTemplateService templateService; private final IMessagePushRecordService recordService; private final MessageStrategy messageStrategy; + private final RedisTemplate redisTemplate; + + @Value("${hzims.message.redis-key.app-push}") + private String appPushRedisKey; @XxlJob(PUSH_MESSAGE_BY_NOTICE) public ReturnT pushSmsMessageByNotice(String params) { // 获取消息模板 List templateList = templateService.list(); - LocalDateTime now = LocalDateTime.now(); templateList.forEach(template -> { LocalDateTime endTime = DateUtil.plus(LocalDateTime.now(), messageStrategy.getConcentrateDuration(), messageStrategy.getConcentrateUnit()); endTime = DateUtil.plus(endTime, template.getAdvanceDuration(), template.getAdvanceTimeUnit()); @@ -67,6 +79,45 @@ public class MessagePushSchedule { return ReturnT.SUCCESS; } + @XxlJob(PUSH_APP_MESSAGE) + public ReturnT pushAppMessage(String params) { + Set appPushKeys = redisTemplate.keys(appPushRedisKey + "*"); + PushMessageServiceImpl pushMessageService = SpringUtil.getBean(PushMessageServiceImpl.class); + appPushKeys.forEach(appPushKey -> { + // 从redis-key中拆分出消息推送人 + Long pusher = Optional.ofNullable(appPushKey.replace(appPushRedisKey+":","")).map(Func::toLong).orElse(null); + if(Func.isNotEmpty(pusher)) { + List records = (List) redisTemplate.opsForList().range(appPushKey,0,-1); + if(CollectionUtil.isNotEmpty(records)) { + Map> listMap = records.stream().filter(record -> Func.isNotEmpty(record.getSubject())) + .collect(Collectors.groupingBy(MessagePushRecordEntity::getSubject)); + listMap.forEach((subject,list) -> { + try { + boolean pushFlag = pushMessageService.sendByUsers( + subject, + list.stream().map(MessagePushRecordEntity::getContent).collect(Collectors.joining("\r\n")), + Lists.newArrayList(pusher.toString()), + "200000" + ); + if(pushFlag) { + XxlJobLogger.log("消息推送失败,subject为"+subject+";list为:"+JSON.toJSONString(list)); + } + LambdaUpdateWrapper updateWrapper = Wrappers.lambdaUpdate() + .set(MessagePushRecordEntity::getStatus, MessageConstants.PUSH_SUCCESS) + .in(MessagePushRecordEntity::getId, list.stream().map(MessagePushRecordEntity::getId).collect(Collectors.toList())); + recordService.update(updateWrapper); + } catch (Exception e) { + throw new RuntimeException(e); + } + }); + } + // redisTemplate.opsForList().remove(appPushKey,0,records); + } + }); + return ReturnT.SUCCESS; + } + + /** @Author hx * @Description 消息集中推送 * @Date 2023/4/4 15:31 diff --git a/hzims-service/message/src/main/java/com/hnac/hzims/message/service/IMessagePushRecordService.java b/hzims-service/message/src/main/java/com/hnac/hzims/message/service/IMessagePushRecordService.java index 94a1d31..bd70a32 100644 --- a/hzims-service/message/src/main/java/com/hnac/hzims/message/service/IMessagePushRecordService.java +++ b/hzims-service/message/src/main/java/com/hnac/hzims/message/service/IMessagePushRecordService.java @@ -102,8 +102,19 @@ public interface IMessagePushRecordService extends BaseService getPersonalAppUnreadMessage(); + /** + * App多人推送消息 + * @param request 消息内容 + * @param records 消息记录 + * @return 推送结果 + */ Boolean sendAppMsgByUsers(BusinessMessageDTO request,List records); + /** + * web多人推送消息 + * @param request 消息记录 + * @return 推送结果 + */ Boolean sendWsMsgByUsers(List request); @@ -113,4 +124,6 @@ public interface IMessagePushRecordService extends BaseService implements IMessagePushRecordService { private final MprNoAurhScopeMapper noAurhScopeMapper; + private final IMessageService smsMessageService; @Override public List list(MessagePushRecordEntity request) { @@ -290,6 +291,23 @@ public class MessagePushRecordServiceImpl extends BaseServiceImpllambdaUpdate() + .set(MessagePushRecordEntity::getStatus,MessageConstants.PUSH_SUCCESS) + .set(MessagePushRecordEntity::getPushTime,LocalDateTime.now()) + .eq(MessagePushRecordEntity::getId,record.getId()) + ); + } + } + return true; + } + /** * 推送成功失败统计 diff --git a/hzims-service/message/src/main/java/com/hnac/hzims/message/service/impl/PushMessageServiceImpl.java b/hzims-service/message/src/main/java/com/hnac/hzims/message/service/impl/PushMessageServiceImpl.java index 9c1d6be..fcc7621 100644 --- a/hzims-service/message/src/main/java/com/hnac/hzims/message/service/impl/PushMessageServiceImpl.java +++ b/hzims-service/message/src/main/java/com/hnac/hzims/message/service/impl/PushMessageServiceImpl.java @@ -16,6 +16,7 @@ import com.hnac.hzinfo.core.push.model.PushInfo; import com.hnac.hzinfo.core.push.model.PushPlatform; import com.hnac.hzinfo.core.push.model.PushResponse; import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.log.logger.BladeLogger; import org.springblade.core.secure.utils.AuthUtil; @@ -24,6 +25,8 @@ import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.ObjectUtil; import org.springblade.resource.feign.IPushClient; import org.springblade.resource.vo.PushInfoVO; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.util.Assert; @@ -38,12 +41,15 @@ import java.util.concurrent.atomic.AtomicReference; * @author hx */ @Service("pushMessageService") -@AllArgsConstructor +@RequiredArgsConstructor public class PushMessageServiceImpl implements IMessageService { private final IPushClient pushClient; private final BladeLogger logger; private final ExecutorService appMessagePushExecutor; + private final RedisTemplate redisTemplate; + @Value("${hzims.message.redis-key.app-push}") + private String appPushRedisKey; @Override @SaveLog(type = MessageConstants.APP_NAME) @@ -90,13 +96,16 @@ public class PushMessageServiceImpl implements IMessageService { @Override public boolean send(MessagePushRecordEntity request) { - String tenantId = Func.isNotEmpty(AuthUtil.getTenantId()) ? AuthUtil.getTenantId() : request.getTenantId(); - try { - return this.sendByUsers(request.getSubject(), request.getContent(), Func.toStrList(",",request.getPusher()),tenantId); - } - catch (Exception e) { - throw new ServiceException(e.getMessage()); - } + // App消息推送因腾讯云推送限制同一标签一段时间内无法推送多条消息,现将app推送改造成由redis定时推送 + Long pushResult = redisTemplate.opsForList().leftPush(appPushRedisKey.concat(":").concat(request.getPusher()), request); + return Func.isNotEmpty(pushResult); +// String tenantId = Func.isNotEmpty(AuthUtil.getTenantId()) ? AuthUtil.getTenantId() : request.getTenantId(); +// try { +// return this.sendByUsers(request.getSubject(), request.getContent(), Func.toStrList(",",request.getPusher()),tenantId); +// } +// catch (Exception e) { +// throw new ServiceException(e.getMessage()); +// } } /** diff --git a/hzims-service/message/src/main/resources/application.yml b/hzims-service/message/src/main/resources/application.yml index 3a53591..fbbaffb 100644 --- a/hzims-service/message/src/main/resources/application.yml +++ b/hzims-service/message/src/main/resources/application.yml @@ -34,3 +34,9 @@ spring: url: jdbc:mysql://175.6.40.67:5816/dev_hzims_message?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true username: root password: 123 + +hzims: + message: + redis-key: + # APP消息推送记录存入redis的key + app-push: hzims:message:appPush