Browse Source

Merge remote-tracking branch 'origin/master'

zhongwei
Jone 2 years ago
parent
commit
b394406aea
  1. 9
      .gitignore
  2. 8
      hzims-service-api/message-api/pom.xml
  3. 11
      hzims-service-api/message-api/src/main/java/com/hnac/hzims/message/MessageConstants.java
  4. 5
      hzims-service-api/message-api/src/main/java/com/hnac/hzims/message/constants/XxlJobConstants.java
  5. 69
      hzims-service-api/message-api/src/main/java/com/hnac/hzims/message/entity/MessagePushRecordEntity.java
  6. 19
      hzims-service-api/message-api/src/main/java/com/hnac/hzims/message/entity/config/MessageTemplateEntity.java
  7. 84
      hzims-service/hzims-middle/pom.xml
  8. 34
      hzims-service/message/src/main/java/com/hnac/hzims/message/config/MessageFactory.java
  9. 60
      hzims-service/message/src/main/java/com/hnac/hzims/message/controller/MessagePushRecordController.java
  10. 66
      hzims-service/message/src/main/java/com/hnac/hzims/message/controller/MessageTemplateController.java
  11. 8
      hzims-service/message/src/main/java/com/hnac/hzims/message/mapper/MessagePushRecordMapper.java
  12. 179
      hzims-service/message/src/main/java/com/hnac/hzims/message/schedule/MessagePushSchedule.java
  13. 130
      hzims-service/message/src/main/java/com/hnac/hzims/message/schedule/MessagePushScheduleOld.java
  14. 35
      hzims-service/message/src/main/java/com/hnac/hzims/message/service/IMessagePushRecordService.java
  15. 3
      hzims-service/message/src/main/java/com/hnac/hzims/message/service/IMessageService.java
  16. 28
      hzims-service/message/src/main/java/com/hnac/hzims/message/service/IMessageTemplateService.java
  17. 6
      hzims-service/message/src/main/java/com/hnac/hzims/message/service/impl/MailMessageServiceImpl.java
  18. 55
      hzims-service/message/src/main/java/com/hnac/hzims/message/service/impl/MessagePushRecordServiceImpl.java
  19. 44
      hzims-service/message/src/main/java/com/hnac/hzims/message/service/impl/MessageTemplateServiceImpl.java
  20. 44
      hzims-service/message/src/main/java/com/hnac/hzims/message/service/impl/PushMessageServiceImpl.java
  21. 18
      hzims-service/message/src/main/java/com/hnac/hzims/message/service/impl/SmsMessageServiceImpl.java
  22. 6
      hzims-service/message/src/main/java/com/hnac/hzims/message/service/impl/WebsocketServiceImpl.java

9
.gitignore vendored

@ -0,0 +1,9 @@
*.idea
/hzims-biz-common/target
/hzims-service/*/target
/hzims-service-api/*/target
log

8
hzims-service-api/message-api/pom.xml

@ -16,9 +16,9 @@
<groupId>org.springblade</groupId>
<artifactId>blade-resource-api</artifactId>
</dependency>
<dependency>
<groupId>com.hnac.hzims</groupId>
<artifactId>hzims-biz-common</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.hnac.hzims</groupId>-->
<!-- <artifactId>hzims-biz-common</artifactId>-->
<!-- </dependency>-->
</dependencies>
</project>

11
hzims-service-api/message-api/src/main/java/com/hnac/hzims/message/MessageConstants.java

@ -62,4 +62,15 @@ public class MessageConstants {
}
}
/**====================================推送状态====================================**/
/**未推送**/
public final static Integer NOT_PUSH = 0;
/**推送成功**/
public final static Integer PUSH_SUCCESS = 1;
/**推送失败**/
public final static Integer PUSH_FAILED = 2;
/**已确认**/
public final static Integer CONFIRM = 3;
/**====================================推送状态====================================**/
}

5
hzims-service-api/message-api/src/main/java/com/hnac/hzims/message/constants/XxlJobConstants.java

@ -6,7 +6,10 @@ package com.hnac.hzims.message.constants;
*/
public interface XxlJobConstants {
/**消息中心消息按通知人分时段集中推送**/
/**消息中心短信消息按通知人分时段集中推送**/
String PUSH_SMS_MESSAGE_BY_NOTICE = "pushSmsMessageByNotice";
/**消息中心消息按通知人分时段集中推送**/
String PUSH_MESSAGE_BY_NOTICE = "pushMessageByNotice";
}

69
hzims-service-api/message-api/src/main/java/com/hnac/hzims/message/entity/MessagePushRecordEntity.java

@ -0,0 +1,69 @@
package com.hnac.hzims.message.entity;
import com.alibaba.fastjson.annotation.JSONField;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.hnac.hzims.message.entity.config.MessageTemplateEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.mp.support.QueryField;
import org.springblade.core.mp.support.SqlCondition;
import org.springblade.core.tool.utils.DateUtil;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
@Data
@ApiModel(value = "消息推送记录",description = "消息推送记录")
@TableName("hzims_message_push_record")
@EqualsAndHashCode
public class MessagePushRecordEntity extends MessageTemplateEntity {
@ApiModelProperty("业务任务ID")
@QueryField(condition = SqlCondition.EQUAL)
private Long taskId;
@ApiModelProperty("消息模板ID")
@QueryField(condition = SqlCondition.EQUAL)
private Long templateId;
@ApiModelProperty("资源编码")
@QueryField(condition = SqlCondition.EQUAL)
private String resourceCode;
@ApiModelProperty(value = "推送人")
@QueryField(condition = SqlCondition.LIKE)
private String pusher;
@ApiModelProperty(value = "推送账号:手机号,邮箱")
private String account;
@ApiModelProperty(value = "推送人名称")
@QueryField(condition = SqlCondition.LIKE)
private String pusherName;
@ApiModelProperty(value = "内容")
private String content;
@ApiModelProperty(value = "计划推送时间")
@JsonFormat(pattern = DateUtil.PATTERN_DATETIME)
@DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME)
private LocalDateTime planTime;
@ApiModelProperty(value = "实际推送时间")
@JsonFormat(pattern = DateUtil.PATTERN_DATETIME)
@DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME)
private LocalDateTime pushTime;
@ApiModelProperty(value = "响应时间")
@JsonFormat(pattern = DateUtil.PATTERN_DATETIME)
@DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME)
private LocalDateTime respondTime;
@ApiModelProperty(value = "响应说明")
private String respondRemark;
}

19
hzims-service-api/message-api/src/main/java/com/hnac/hzims/message/entity/config/MessageTemplateEntity.java

@ -1,19 +1,22 @@
package com.hnac.hzims.message.entity.config;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.mp.support.QueryField;
import org.springblade.core.mp.support.SqlCondition;
import org.springblade.core.tenant.mp.TenantEntity;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* @ClassName MessageTemplateEntity
* @description:
* @author: hx
* @create: 2023-04-06 14:55
* @Version 4.0
**/
public class MessageTemplateEntity {
@Data
@ApiModel("消息配置")
@TableName("hzims_message_template")
@EqualsAndHashCode(callSuper = false)
public class MessageTemplateEntity extends TenantEntity implements Serializable {
@ApiModelProperty(value = "消息类型")
@NotNull(message = "消息类型不能为空")

84
hzims-service/hzims-middle/pom.xml

@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.hnac.hzims</groupId>
<artifactId>hzims-service</artifactId>
<version>4.0.0-SNAPSHOT</version>
</parent>
<artifactId>hzims-middle</artifactId>
<name>middle</name>
<description>middle</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.6.13</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-common</artifactId>
<version>${bladex.projet.common.version}</version>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-core-boot</artifactId>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-starter-swagger</artifactId>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-core-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springblade</groupId>
<artifactId>blade-core-auto</artifactId>
<scope>provided</scope>
</dependency>
<!--生成代码-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
</dependency>
<!-- velocity 模板引擎, Mybatis Plus 代码生成器需要-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.2</version>
</dependency>
</dependencies>
<build>
<finalName>${project.name}-${project.version}</finalName>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<configuration>
<username>${docker.username}</username>
<password>${docker.password}</password>
<repository>${docker.registry.url}/${docker.namespace}/${project.artifactId}</repository>
<tag>${project.version}</tag>
<useMavenSettingsForAuth>true</useMavenSettingsForAuth>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
<skip>false</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>

34
hzims-service/message/src/main/java/com/hnac/hzims/message/config/MessageFactory.java

@ -0,0 +1,34 @@
package com.hnac.hzims.message.config;
import com.hnac.hzims.message.MessageConstants;
import com.hnac.hzims.message.service.IMessageService;
import org.springblade.core.tool.utils.SpringUtil;
public class MessageFactory {
/** @Author hx
* @Description 获取方法类型
* @Date 2023/4/4 14:22
* @Param [messageType] 消息类型
* @return com.hnac.hzims.message.service.IMessageService
**/
public static IMessageService getMessageSend(String messageType) {
if(MessageConstants.APP_PUSH.equals(messageType)) {
return SpringUtil.getBean("pushMessageService");
}
else if(MessageConstants.SMS_PUSH.equals(messageType)) {
return SpringUtil.getBean("smsMessageService");
}
else if(MessageConstants.MAIL_PUSH.equals(messageType)) {
return SpringUtil.getBean("mailMessageService");
}
else if(MessageConstants.WS_PUSH.equals(messageType)) {
return SpringUtil.getBean("websocketService");
}
else {
return null;
}
}
}

60
hzims-service/message/src/main/java/com/hnac/hzims/message/controller/MessagePushRecordController.java

@ -0,0 +1,60 @@
package com.hnac.hzims.message.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.hnac.hzims.message.entity.MessagePushRecordEntity;
import com.hnac.hzims.message.service.IMessagePushRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/message/record")
@Api(value = "消息推送记录",tags = "消息推送记录")
@AllArgsConstructor
public class MessagePushRecordController extends BladeController {
private final IMessagePushRecordService messagePushRecordService;
@PostMapping("/save")
@ApiOperation("保存消息推送")
@ApiOperationSupport(order = 1)
public R<Boolean> save(@RequestBody MessagePushRecordEntity request) {
return R.status(messagePushRecordService.save(request));
}
@PostMapping("/update")
@ApiOperation("更新消息推送记录")
@ApiOperationSupport(order = 2)
public R<Boolean> update(@RequestBody MessagePushRecordEntity request) {
return R.status(messagePushRecordService.updateById(request));
}
@GetMapping("/list")
@ApiOperation("查询消息推送记录列表")
@ApiOperationSupport(order = 3)
public R<List<MessagePushRecordEntity>> list(MessagePushRecordEntity request) {
return R.data(messagePushRecordService.list(request));
}
@GetMapping("/listPage")
@ApiOperation("分页查询消息推送记录列表")
@ApiOperationSupport(order = 4)
public R<IPage<MessagePushRecordEntity>> listPage(MessagePushRecordEntity request, Query query) {
return R.data(messagePushRecordService.listPage(request,query));
}
@GetMapping("/send/{id}")
@ApiOperation("推送消息记录")
@ApiOperationSupport(order = 4)
public R<Boolean> send(@PathVariable @ApiParam("消息记录ID") String id) {
return R.data(messagePushRecordService.send(id));
}
}

66
hzims-service/message/src/main/java/com/hnac/hzims/message/controller/MessageTemplateController.java

@ -0,0 +1,66 @@
package com.hnac.hzims.message.controller;
import com.aliyun.oss.ServiceException;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.hnac.hzims.message.entity.config.MessageTemplateEntity;
import com.hnac.hzims.message.service.IMessageTemplateService;
import groovy.util.logging.Slf4j;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@AllArgsConstructor
@RequestMapping("/message/template")
@Api(value = "消息模板管理",tags = "消息模板管理")
public class MessageTemplateController extends BladeController {
private final IMessageTemplateService messageTemplateService;
@PostMapping("/save")
@ApiOperation("保存消息模板")
@ApiOperationSupport(order = 1)
public R<Boolean> save(@RequestBody MessageTemplateEntity request) {
return R.status(messageTemplateService.save(request));
}
@GetMapping("/list")
@ApiOperation("查询列表")
@ApiOperationSupport(order = 2)
public R<List<MessageTemplateEntity>> list(MessageTemplateEntity request) {
return R.data(messageTemplateService.list(request));
}
@GetMapping("/listPage")
@ApiOperation("分页查询")
@ApiOperationSupport(order = 3)
public R<IPage<MessageTemplateEntity>> listPage(MessageTemplateEntity request, Query query) {
return R.data(messageTemplateService.listPage(request,query));
}
@DeleteMapping("/delete/{ids}")
@ApiOperation("删除消息模板")
@ApiOperationSupport(order = 4)
public R<Boolean> delete(@PathVariable String ids) {
return R.status(messageTemplateService.deleteLogic(Func.toLongList(",",ids)));
}
@PutMapping("/update")
@ApiOperation("修改消息模板")
@ApiOperationSupport(order = 5)
public R<Boolean> update(@RequestBody MessageTemplateEntity request) {
Assert.isTrue(Func.isNotEmpty(request.getId()),() -> {
throw new ServiceException("消息模板编辑时传入ID不能为空");
});
return R.status(messageTemplateService.updateById(request));
}
}

8
hzims-service/message/src/main/java/com/hnac/hzims/message/mapper/MessagePushRecordMapper.java

@ -0,0 +1,8 @@
package com.hnac.hzims.message.mapper;
import com.hnac.hzims.message.entity.MessagePushRecordEntity;
import org.springblade.core.datascope.mapper.UserDataScopeBaseMapper;
public interface MessagePushRecordMapper extends UserDataScopeBaseMapper<MessagePushRecordEntity> {
}

179
hzims-service/message/src/main/java/com/hnac/hzims/message/schedule/MessagePushSchedule.java

@ -1,135 +1,112 @@
package com.hnac.hzims.message.schedule;
import cn.hutool.core.map.MapUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.hnac.hzims.common.utils.DateUtil;
import com.hnac.hzims.message.configure.service.ISmsConfigService;
import com.hnac.hzims.message.constants.RedisKeyConstants;
import com.hnac.hzims.message.dto.PushMessageDTO;
import com.hnac.hzims.message.dto.SmsPushDto;
import com.hnac.hzims.message.entity.PushMessageEntity;
import com.hnac.hzims.message.entity.config.SmsConfigEntity;
import com.hnac.hzims.message.push.service.IPushService;
import com.hnac.hzims.message.service.IPushMessageService;
import com.hnac.hzims.message.MessageConstants;
import com.hnac.hzims.message.config.MessageFactory;
import com.hnac.hzims.message.entity.MessagePushRecordEntity;
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.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.extern.slf4j.Slf4j;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.CollectionUtil;
import org.springblade.core.tool.utils.Func;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springblade.core.tool.utils.ObjectUtil;
import org.springframework.stereotype.Component;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static com.hnac.hzims.message.constants.XxlJobConstants.*;
import static com.hnac.hzims.message.constants.XxlJobConstants.PUSH_MESSAGE_BY_NOTICE;
import static com.hnac.hzims.message.constants.XxlJobConstants.PUSH_SMS_MESSAGE_BY_NOTICE;
/**
* 消息中心定时推送任务调度
* @author hx
*/
* @ClassName MessagePushSchedule
* @description: 消息推送
* @author: hx
* @create: 2023-04-04 14:31
* @Version 4.0
**/
@Component
@AllArgsConstructor
@Slf4j
public class MessagePushSchedule {
@Autowired
private ISmsConfigService smsConfigService;
@Autowired
private IPushMessageService pushMessageService;
@Autowired
@Qualifier("smsPushService")
private IPushService pushService;
private final IMessageTemplateService templateService;
private final IMessagePushRecordService recordService;
public static final String MESSAGE_ID = "messageId";
/**
* 消息推送根据推送人分时段推送任务调度
* @param params 暂不支持参数参入执行调度任务
* @return
*/
@XxlJob(PUSH_SMS_MESSAGE_BY_NOTICE)
@XxlJob(PUSH_MESSAGE_BY_NOTICE)
public ReturnT pushSmsMessageByNotice(String params) {
List<SmsConfigEntity> list = smsConfigService.list();
list.stream().filter(e -> Func.isNotEmpty(e.getDuration()) && Func.isNotEmpty(e.getTimeUnit())).forEach(smsConfigEntity -> {
//查询出规定时段内的短信数量统一发送
// 获取配置的时间范围内的消息
LocalDateTime endTime = DateUtil.plus(LocalDateTime.now(), smsConfigEntity.getDuration(), smsConfigEntity.getTimeUnit());
PushMessageDTO pushMessageDTO = new PushMessageDTO();
pushMessageDTO.setStartTime(LocalDateTime.now());
pushMessageDTO.setEndTime(endTime);
pushMessageDTO.setBusinessKey(smsConfigEntity.getBusinessKey());
pushMessageDTO.setIsPush(false);
List<PushMessageEntity> pushMessageList = pushMessageService.list(pushMessageDTO);
XxlJobLogger.log("开始推送短信,推送条数为:"+pushMessageList.size());
// 获取推送消息内容体 根据用户拆分出多条短信推送
List<JSONObject> splitSmsList = this.transform(pushMessageList);
if(CollectionUtil.isEmpty(splitSmsList)) {
return;
}
this.push(splitSmsList,smsConfigEntity);
// 获取消息模板
List<MessageTemplateEntity> templateList = templateService.list();
LocalDateTime now = LocalDateTime.now();
templateList.forEach(template -> {
LocalDateTime endTime = DateUtil.plus(LocalDateTime.now(), template.getConcentratedDuration(), template.getConcentratedTimeUnit());
endTime = DateUtil.plus(endTime, template.getAdvanceDuration(), template.getAdvanceTimeUnit());
LambdaQueryWrapper<MessagePushRecordEntity> lqw = Wrappers.<MessagePushRecordEntity>lambdaQuery()
.eq(MessagePushRecordEntity::getStatus, MessageConstants.NOT_PUSH)
.ge(MessagePushRecordEntity::getPlanTime, now)
.le(MessagePushRecordEntity::getPlanTime, endTime);
List<MessagePushRecordEntity> list = recordService.list(lqw);
this.sendMessage(list);
});
return ReturnT.SUCCESS;
}
/**
* 推送短信
* @param splitSmsList 短信内容
* @param configEntity 短信配置
*/
private void push(List<JSONObject> splitSmsList,SmsConfigEntity configEntity) {
Map<String, List<JSONObject>> phoneMap = splitSmsList.stream().collect(Collectors.groupingBy(sms -> sms.getString("phones")));
phoneMap.forEach((phone,messages) -> {
String messageIds = messages.stream().map(message -> message.getString(MESSAGE_ID)).collect(Collectors.joining(","));
List<SmsPushDto> smsPushDtoList = JSONArray.parseArray(JSON.toJSONString(messages), SmsPushDto.class);
SmsPushDto templatePush = smsPushDtoList.get(0);
Map<String,String> params = new HashMap<>();
Arrays.stream(configEntity.getContentVariables().split(",")).forEachOrdered(contentVariable ->{
String value = smsPushDtoList.stream().map(SmsPushDto::getParams)
.map(pm -> MapUtil.getStr(pm,contentVariable)).collect(Collectors.joining(","));
params.put(contentVariable,value);
/** @Author hx
* @Description 消息集中推送
* @Date 2023/4/4 15:31
* @Param [list] 消息推送记录
* @return void
**/
private void sendMessage(List<MessagePushRecordEntity> list) {
Map<String, List<MessagePushRecordEntity>> collect = list.stream().collect(Collectors.groupingBy(MessagePushRecordEntity::getAccount));
String type = list.get(0).getType();
IMessageService service = MessageFactory.getMessageSend(type);
collect.forEach((account,records) -> {
MessagePushRecordEntity request = records.get(0);
// 完善推送内容
request.setContent(this.getPushContent(type,records));
Boolean flag = service.send(request);
List<Long> ids = records.stream().map(MessagePushRecordEntity::getId).collect(Collectors.toList());
// 更新消息推送状态
LambdaUpdateWrapper<MessagePushRecordEntity> lwq = Wrappers.<MessagePushRecordEntity>lambdaUpdate()
.set(MessagePushRecordEntity::getStatus, flag ? MessageConstants.PUSH_SUCCESS : MessageConstants.PUSH_FAILED)
.set(MessagePushRecordEntity::getPushTime,LocalDateTime.now())
.in(MessagePushRecordEntity::getId, ids);
recordService.update(lwq);
});
templatePush.setParams(params);
XxlJobLogger.log(">>>>>>>>>>开始推送消息,推送内容为:"+JSONObject.toJSONString(templatePush)+"<<<<<<<<<<");
LambdaUpdateWrapper<PushMessageEntity> pushLU = Wrappers.<PushMessageEntity>lambdaUpdate()
.set(PushMessageEntity::getIsPush, true)
.in(PushMessageEntity::getId, messageIds.split(","));
pushMessageService.update(pushLU);
R pushResult = pushService.send(templatePush);
LambdaUpdateWrapper<PushMessageEntity> successLU = Wrappers.lambdaUpdate();
if(pushResult.isSuccess()) {
successLU.set(PushMessageEntity::getIsSuccess,true);
}
else {
successLU.set(PushMessageEntity::getIsSuccess,false);
/** @Author hx
* @Description 获取群推送内容
* @Date 2023/4/4 16:06
* @Param [type, list]
* @return java.lang.String
**/
private String getPushContent(String type,List<MessagePushRecordEntity> list) {
if(MessageConstants.APP_NAME.equals(type)) {
return list.stream().map(MessagePushRecordEntity::getContent).collect(Collectors.joining("\r\n"));
}
successLU.in(PushMessageEntity::getId, messageIds.split(","));
pushMessageService.update(successLU);
else if(MessageConstants.SMS_PUSH.equals(type)) {
Map<String,String> params = new HashMap<>();
list.stream().map(MessagePushRecordEntity::getContent).forEachOrdered(record -> {
JSONObject param = JSONObject.parseObject(record);
param.forEach((k,v) -> {
params.put(k, params.containsKey(k) && Func.isNotEmpty(params.get(k)) ? params.get(k) + "," + v : (String) v);
});
});
return JSON.toJSONString(params);
}
/**
* 获取推送消息内容体 根据用户拆分出多条短信推送
* @param pushMessageList
* @return
*/
private List<JSONObject> transform(List<PushMessageEntity> pushMessageList) {
return pushMessageList.stream().map(m -> {
JSONObject object = JSONObject.parseObject(m.getMessageContent());
object.put(MESSAGE_ID,m.getId());
return object;
}).filter(object -> Func.isNotEmpty(object.getString("phones"))).collect(Collectors.toList());
return null;
}
}

130
hzims-service/message/src/main/java/com/hnac/hzims/message/schedule/MessagePushScheduleOld.java

@ -0,0 +1,130 @@
package com.hnac.hzims.message.schedule;
import cn.hutool.core.map.MapUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.hnac.hzims.common.utils.DateUtil;
import com.hnac.hzims.message.configure.service.ISmsConfigService;
import com.hnac.hzims.message.dto.PushMessageDTO;
import com.hnac.hzims.message.dto.SmsPushDto;
import com.hnac.hzims.message.entity.PushMessageEntity;
import com.hnac.hzims.message.entity.config.SmsConfigEntity;
import com.hnac.hzims.message.push.service.IPushService;
import com.hnac.hzims.message.service.IPushMessageService;
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.extern.slf4j.Slf4j;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.CollectionUtil;
import org.springblade.core.tool.utils.Func;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
import static com.hnac.hzims.message.constants.XxlJobConstants.*;
/**
* 消息中心定时推送任务调度
* @author hx
*/
@Component
@Slf4j
public class MessagePushScheduleOld {
@Autowired
private ISmsConfigService smsConfigService;
@Autowired
private IPushMessageService pushMessageService;
@Autowired
@Qualifier("smsPushService")
private IPushService pushService;
public static final String MESSAGE_ID = "messageId";
/**
* 消息推送根据推送人分时段推送任务调度
* @param params 暂不支持参数参入执行调度任务
* @return
*/
@XxlJob(PUSH_SMS_MESSAGE_BY_NOTICE)
public ReturnT pushSmsMessageByNotice(String params) {
List<SmsConfigEntity> list = smsConfigService.list();
list.stream().filter(e -> Func.isNotEmpty(e.getDuration()) && Func.isNotEmpty(e.getTimeUnit())).forEach(smsConfigEntity -> {
//查询出规定时段内的短信数量统一发送
// 获取配置的时间范围内的消息
LocalDateTime endTime = DateUtil.plus(LocalDateTime.now(), smsConfigEntity.getDuration(), smsConfigEntity.getTimeUnit());
PushMessageDTO pushMessageDTO = new PushMessageDTO();
pushMessageDTO.setStartTime(LocalDateTime.now());
pushMessageDTO.setEndTime(endTime);
pushMessageDTO.setBusinessKey(smsConfigEntity.getBusinessKey());
pushMessageDTO.setIsPush(false);
List<PushMessageEntity> pushMessageList = pushMessageService.list(pushMessageDTO);
XxlJobLogger.log("开始推送短信,推送条数为:"+pushMessageList.size());
// 获取推送消息内容体 根据用户拆分出多条短信推送
List<JSONObject> splitSmsList = this.transform(pushMessageList);
if(CollectionUtil.isEmpty(splitSmsList)) {
return;
}
this.push(splitSmsList,smsConfigEntity);
});
return ReturnT.SUCCESS;
}
/**
* 推送短信
* @param splitSmsList 短信内容
* @param configEntity 短信配置
*/
private void push(List<JSONObject> splitSmsList,SmsConfigEntity configEntity) {
Map<String, List<JSONObject>> phoneMap = splitSmsList.stream().collect(Collectors.groupingBy(sms -> sms.getString("phones")));
phoneMap.forEach((phone,messages) -> {
String messageIds = messages.stream().map(message -> message.getString(MESSAGE_ID)).collect(Collectors.joining(","));
List<SmsPushDto> smsPushDtoList = JSONArray.parseArray(JSON.toJSONString(messages), SmsPushDto.class);
SmsPushDto templatePush = smsPushDtoList.get(0);
Map<String,String> params = new HashMap<>();
Arrays.stream(configEntity.getContentVariables().split(",")).forEachOrdered(contentVariable ->{
String value = smsPushDtoList.stream().map(SmsPushDto::getParams)
.map(pm -> MapUtil.getStr(pm,contentVariable)).collect(Collectors.joining(","));
params.put(contentVariable,value);
});
templatePush.setParams(params);
XxlJobLogger.log(">>>>>>>>>>开始推送消息,推送内容为:"+JSONObject.toJSONString(templatePush)+"<<<<<<<<<<");
LambdaUpdateWrapper<PushMessageEntity> pushLU = Wrappers.<PushMessageEntity>lambdaUpdate()
.set(PushMessageEntity::getIsPush, true)
.in(PushMessageEntity::getId, messageIds.split(","));
pushMessageService.update(pushLU);
R pushResult = pushService.send(templatePush);
LambdaUpdateWrapper<PushMessageEntity> successLU = Wrappers.lambdaUpdate();
if(pushResult.isSuccess()) {
successLU.set(PushMessageEntity::getIsSuccess,true);
}
else {
successLU.set(PushMessageEntity::getIsSuccess,false);
}
successLU.in(PushMessageEntity::getId, messageIds.split(","));
pushMessageService.update(successLU);
});
}
/**
* 获取推送消息内容体 根据用户拆分出多条短信推送
* @param pushMessageList
* @return
*/
private List<JSONObject> transform(List<PushMessageEntity> pushMessageList) {
return pushMessageList.stream().map(m -> {
JSONObject object = JSONObject.parseObject(m.getMessageContent());
object.put(MESSAGE_ID,m.getId());
return object;
}).filter(object -> Func.isNotEmpty(object.getString("phones"))).collect(Collectors.toList());
}
}

35
hzims-service/message/src/main/java/com/hnac/hzims/message/service/IMessagePushRecordService.java

@ -0,0 +1,35 @@
package com.hnac.hzims.message.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hnac.hzims.message.entity.MessagePushRecordEntity;
import org.springblade.core.mp.base.BaseService;
import org.springblade.core.mp.support.Query;
import java.util.List;
public interface IMessagePushRecordService extends BaseService<MessagePushRecordEntity> {
/**
* 查询消息推送记录列表
* @param request 查询条件
* @return 消息记录列表
*/
List<MessagePushRecordEntity> list(MessagePushRecordEntity request);
/**
* 分页查询消息推送记录列表
* @param request 查询条件
* @param query 分页
* @return 消息记录列表
*/
IPage<MessagePushRecordEntity> listPage(MessagePushRecordEntity request, Query query);
/** @Author hx
* @Description 根据ID发送短信
* @Date 2023/4/4 17:37
* @Param ids 消息记录ID
* @return
**/
Boolean send(String id);
}

3
hzims-service/message/src/main/java/com/hnac/hzims/message/service/IMessageService.java

@ -2,6 +2,7 @@ package com.hnac.hzims.message.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hnac.hzims.message.dto.PushDto;
import com.hnac.hzims.message.entity.MessagePushRecordEntity;
import org.springblade.core.tool.api.R;
/**
@ -16,4 +17,6 @@ public interface IMessageService {
*/
<T extends PushDto> R<String> send(T pushObject);
Boolean send(MessagePushRecordEntity request);
}

28
hzims-service/message/src/main/java/com/hnac/hzims/message/service/IMessageTemplateService.java

@ -0,0 +1,28 @@
package com.hnac.hzims.message.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hnac.hzims.message.entity.config.MessageTemplateEntity;
import org.springblade.core.mp.base.BaseService;
import org.springblade.core.mp.support.Query;
import java.util.List;
public interface IMessageTemplateService extends BaseService<MessageTemplateEntity> {
/**
* 查询消息模板列表
* @param req 查询条件
* @return 消息模板列表
*/
List<MessageTemplateEntity> list(MessageTemplateEntity req);
/**
* 分页查询消息
* @param req 查询条件
* @param query 分页条件
* @return 消息模板分页查询结果
*/
IPage<MessageTemplateEntity> listPage(MessageTemplateEntity req, Query query);
}

6
hzims-service/message/src/main/java/com/hnac/hzims/message/service/impl/MailMessageServiceImpl.java

@ -3,6 +3,7 @@ package com.hnac.hzims.message.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.hnac.hzims.message.MessageConstants;
import com.hnac.hzims.message.entity.MessagePushRecordEntity;
import com.hnac.hzims.message.log.aspect.SaveLog;
import com.hnac.hzims.message.dto.MailPushDto;
import com.hnac.hzims.message.dto.PushDto;
@ -75,4 +76,9 @@ public class MailMessageServiceImpl implements IMessageService {
return R.success("发送成功!");
}
@Override
public Boolean send(MessagePushRecordEntity request) {
return null;
}
}

55
hzims-service/message/src/main/java/com/hnac/hzims/message/service/impl/MessagePushRecordServiceImpl.java

@ -0,0 +1,55 @@
package com.hnac.hzims.message.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.hnac.hzims.message.config.MessageFactory;
import com.hnac.hzims.message.entity.MessagePushRecordEntity;
import com.hnac.hzims.message.mapper.MessagePushRecordMapper;
import com.hnac.hzims.message.service.IMessagePushRecordService;
import com.hnac.hzims.message.service.IMessageService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.utils.Func;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@AllArgsConstructor
@Slf4j
public class MessagePushRecordServiceImpl extends BaseServiceImpl<MessagePushRecordMapper, MessagePushRecordEntity> implements IMessagePushRecordService {
@Override
public List<MessagePushRecordEntity> list(MessagePushRecordEntity request) {
return this.list(this.getQueryWrapper(request));
}
@Override
public IPage<MessagePushRecordEntity> listPage(MessagePushRecordEntity request, Query query) {
return this.page(Condition.getPage(query),this.getQueryWrapper(request));
}
@Override
public Boolean send(String id) {
MessagePushRecordEntity record = this.getById(id);
IMessageService messageSend = MessageFactory.getMessageSend(record.getType());
return messageSend.send(record);
}
/**
* 获取 QueryWrapper
* @param request 查询条件
* @return QueryWrapper
*/
private LambdaQueryWrapper<MessagePushRecordEntity> getQueryWrapper(MessagePushRecordEntity request) {
LambdaQueryWrapper<MessagePushRecordEntity> lambda = Condition.getQueryWrapper(request).lambda();
if(Func.isNotEmpty(request.getStatus())) {
lambda.eq(MessagePushRecordEntity::getStatus,request.getStatus());
}
return lambda;
}
}

44
hzims-service/message/src/main/java/com/hnac/hzims/message/service/impl/MessageTemplateServiceImpl.java

@ -0,0 +1,44 @@
package com.hnac.hzims.message.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hnac.hzims.common.utils.Condition;
import com.hnac.hzims.message.entity.config.MessageTemplateEntity;
import com.hnac.hzims.message.mapper.MessageTemplateMapper;
import com.hnac.hzims.message.service.IMessageTemplateService;
import groovy.util.logging.Slf4j;
import lombok.AllArgsConstructor;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.utils.Func;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@AllArgsConstructor
@Slf4j
public class MessageTemplateServiceImpl extends BaseServiceImpl<MessageTemplateMapper, MessageTemplateEntity> implements IMessageTemplateService {
@Override
public List<MessageTemplateEntity> list(MessageTemplateEntity req) {
return this.list(this.getQueryWrapper(req));
}
@Override
public IPage<MessageTemplateEntity> listPage(MessageTemplateEntity req, Query query) {
return this.page(Condition.getPage(query) , this.getQueryWrapper(req));
}
/**
* 根据查询条件获取消息模板QueryWrapper
* @param req 查询条件
* @return 消息模板QueryWrapper
*/
private LambdaQueryWrapper<MessageTemplateEntity> getQueryWrapper(MessageTemplateEntity req) {
LambdaQueryWrapper<MessageTemplateEntity> lambda = Condition.getQueryWrapper(req).lambda();
if(Func.isNotEmpty(req.getStatus())) {
lambda.eq(MessageTemplateEntity::getStatus,req.getStatus());
}
return lambda;
}
}

44
hzims-service/message/src/main/java/com/hnac/hzims/message/service/impl/PushMessageServiceImpl.java

@ -2,23 +2,32 @@ package com.hnac.hzims.message.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.hnac.hzims.message.MessageConstants;
import com.hnac.hzims.message.entity.MessagePushRecordEntity;
import com.hnac.hzims.message.log.aspect.SaveLog;
import com.hnac.hzims.message.dto.AppPushDto;
import com.hnac.hzims.message.dto.PushDto;
import com.hnac.hzims.message.service.IMessageService;
import com.hnac.hzinfo.core.push.enums.PlatformType;
import com.hnac.hzinfo.core.push.enums.PushAudienceType;
import com.hnac.hzinfo.core.push.model.PushAudience;
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 org.springblade.core.log.exception.ServiceException;
import org.springblade.core.log.logger.BladeLogger;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
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.stereotype.Service;
import org.springframework.util.Assert;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicReference;
@ -30,6 +39,7 @@ import java.util.concurrent.atomic.AtomicReference;
public class PushMessageServiceImpl implements IMessageService {
private final IPushClient pushClient;
private final BladeLogger logger;
@Override
@SaveLog(type = MessageConstants.APP_NAME)
@ -73,4 +83,38 @@ public class PushMessageServiceImpl implements IMessageService {
});
return R.success("推送成功");
}
@Override
public Boolean send(MessagePushRecordEntity request) {
PushInfoVO pushInfoVO = new PushInfoVO();
pushInfoVO.setTenantId(Func.isNotEmpty(AuthUtil.getTenantId()) ? AuthUtil.getTenantId() : request.getTenantId());
ArrayList<PlatformType> platformTypes = Lists.newArrayList(PlatformType.Android, PlatformType.IOS);
platformTypes.forEach(platformType -> {
PushPlatform platform = PushPlatform.newBuilder().addPlatformType(platformType).build();
R<PushResponse> response;
// 安卓推送
if(PlatformType.Android.equals(platformType)) {
PushAudience pushAudience = PushAudience.newBuilder().addPushAudienceType(PushAudienceType.TAG, Lists.newArrayList(request.getPusher())).build();
PushInfo pushInfo = new PushInfo("ops-push-android", request.getSubject(), request.getContent(),
"", null, platform, pushAudience);
pushInfoVO.setPushInfo(pushInfo);
response = pushClient.tenantPush(pushInfoVO);
}
// IOS推送
else if(PlatformType.IOS.equals(platformType)) {
PushAudience pushAudience = PushAudience.newBuilder().addPushAudienceType(PushAudienceType.TAG, Lists.newArrayList(request.getPusher())).build();
PushInfo pushInfo = new PushInfo("ops-push-ios", request.getSubject(), request.getContent(),
"", null, platform, pushAudience);
pushInfoVO.setPushInfo(pushInfo);
response = pushClient.tenantPush(pushInfoVO);
} else {
response = null;
}
Assert.isTrue(ObjectUtil.isNotEmpty(response) && response.isSuccess(),() -> {
logger.error("hzims-message:PushMessageServiceImpl:send", "请求参数为:"+JSON.toJSONString(pushInfoVO)+"错误信息为:"+response.getMsg());
throw new ServiceException(response.getMsg());
});
});
return true;
}
}

18
hzims-service/message/src/main/java/com/hnac/hzims/message/service/impl/SmsMessageServiceImpl.java

@ -2,7 +2,9 @@ package com.hnac.hzims.message.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.api.client.util.Value;
import com.hnac.hzims.message.MessageConstants;
import com.hnac.hzims.message.entity.MessagePushRecordEntity;
import com.hnac.hzims.message.log.aspect.SaveLog;
import com.hnac.hzims.message.dto.PushDto;
import com.hnac.hzims.message.dto.SmsPushDto;
@ -10,11 +12,13 @@ import com.hnac.hzims.message.service.IMessageService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.sms.model.SmsResponse;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springblade.resource.feign.ISmsClient;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
/**
* @author hx
@ -41,4 +45,18 @@ public class SmsMessageServiceImpl implements IMessageService {
}
return response;
}
@Override
public Boolean send(MessagePushRecordEntity request) {
R<SmsResponse> response = smsClient.sendMessage(
Func.isNotEmpty(AuthUtil.getTenantId()) ? AuthUtil.getTenantId() : request.getTenantId(),
request.getResourceCode(),
request.getContent(),
request.getAccount()
);
Assert.isTrue(response.isSuccess(),() -> {
throw new ServiceException(response.getMsg());
});
return response.getData().isSuccess();
}
}

6
hzims-service/message/src/main/java/com/hnac/hzims/message/service/impl/WebsocketServiceImpl.java

@ -3,6 +3,7 @@ package com.hnac.hzims.message.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.hnac.hzims.message.MessageConstants;
import com.hnac.hzims.message.entity.MessagePushRecordEntity;
import com.hnac.hzims.message.log.aspect.SaveLog;
import com.hnac.hzims.message.dto.PushDto;
import com.hnac.hzims.message.dto.WsPushDto;
@ -83,4 +84,9 @@ public class WebsocketServiceImpl implements IMessageService {
}
return R.success("推送成功");
}
@Override
public Boolean send(MessagePushRecordEntity request) {
return null;
}
}

Loading…
Cancel
Save