Browse Source

# 消息模块修改

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

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

@ -16,9 +16,9 @@
<groupId>org.springblade</groupId> <groupId>org.springblade</groupId>
<artifactId>blade-resource-api</artifactId> <artifactId>blade-resource-api</artifactId>
</dependency> </dependency>
<dependency> <!-- <dependency>-->
<groupId>com.hnac.hzims</groupId> <!-- <groupId>com.hnac.hzims</groupId>-->
<artifactId>hzims-biz-common</artifactId> <!-- <artifactId>hzims-biz-common</artifactId>-->
</dependency> <!-- </dependency>-->
</dependencies> </dependencies>
</project> </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 { public interface XxlJobConstants {
/**消息中心消息按通知人分时段集中推送**/ /**消息中心短信消息按通知人分时段集中推送**/
String PUSH_SMS_MESSAGE_BY_NOTICE = "pushSmsMessageByNotice"; 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; package com.hnac.hzims.message.entity.config;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.mp.support.QueryField; import org.springblade.core.mp.support.QueryField;
import org.springblade.core.mp.support.SqlCondition; import org.springblade.core.mp.support.SqlCondition;
import org.springblade.core.tenant.mp.TenantEntity;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.io.Serializable;
/** @Data
* @ClassName MessageTemplateEntity @ApiModel("消息配置")
* @description: @TableName("hzims_message_template")
* @author: hx @EqualsAndHashCode(callSuper = false)
* @create: 2023-04-06 14:55 public class MessageTemplateEntity extends TenantEntity implements Serializable {
* @Version 4.0
**/
public class MessageTemplateEntity {
@ApiModelProperty(value = "消息类型") @ApiModelProperty(value = "消息类型")
@NotNull(message = "消息类型不能为空") @NotNull(message = "消息类型不能为空")

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> {
}

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

@ -1,135 +1,112 @@
package com.hnac.hzims.message.schedule; package com.hnac.hzims.message.schedule;
import cn.hutool.core.map.MapUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; 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.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.hnac.hzims.common.utils.DateUtil; import com.hnac.hzims.common.utils.DateUtil;
import com.hnac.hzims.message.configure.service.ISmsConfigService; import com.hnac.hzims.message.MessageConstants;
import com.hnac.hzims.message.constants.RedisKeyConstants; import com.hnac.hzims.message.config.MessageFactory;
import com.hnac.hzims.message.dto.PushMessageDTO; import com.hnac.hzims.message.entity.MessagePushRecordEntity;
import com.hnac.hzims.message.dto.SmsPushDto; import com.hnac.hzims.message.entity.config.MessageTemplateEntity;
import com.hnac.hzims.message.entity.PushMessageEntity; import com.hnac.hzims.message.service.IMessagePushRecordService;
import com.hnac.hzims.message.entity.config.SmsConfigEntity; import com.hnac.hzims.message.service.IMessageService;
import com.hnac.hzims.message.push.service.IPushService; import com.hnac.hzims.message.service.IMessageTemplateService;
import com.hnac.hzims.message.service.IPushMessageService;
import com.xxl.job.core.biz.model.ReturnT; import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob; import com.xxl.job.core.handler.annotation.XxlJob;
import com.xxl.job.core.log.XxlJobLogger; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; 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.springblade.core.tool.utils.Func;
import org.springframework.beans.factory.annotation.Autowired; import org.springblade.core.tool.utils.ObjectUtil;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.ZoneOffset; import java.util.HashMap;
import java.util.*; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; 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;
/** /**
* 消息中心定时推送任务调度 * @ClassName MessagePushSchedule
* @author hx * @description: 消息推送
*/ * @author: hx
* @create: 2023-04-04 14:31
* @Version 4.0
**/
@Component @Component
@AllArgsConstructor
@Slf4j @Slf4j
public class MessagePushSchedule { public class MessagePushSchedule {
@Autowired private final IMessageTemplateService templateService;
private ISmsConfigService smsConfigService; private final IMessagePushRecordService recordService;
@Autowired
private IPushMessageService pushMessageService;
@Autowired
@Qualifier("smsPushService")
private IPushService pushService;
public static final String MESSAGE_ID = "messageId"; @XxlJob(PUSH_MESSAGE_BY_NOTICE)
/**
* 消息推送根据推送人分时段推送任务调度
* @param params 暂不支持参数参入执行调度任务
* @return
*/
@XxlJob(PUSH_SMS_MESSAGE_BY_NOTICE)
public ReturnT pushSmsMessageByNotice(String params) { public ReturnT pushSmsMessageByNotice(String params) {
List<SmsConfigEntity> list = smsConfigService.list(); // 获取消息模板
list.stream().filter(e -> Func.isNotEmpty(e.getDuration()) && Func.isNotEmpty(e.getTimeUnit())).forEach(smsConfigEntity -> { List<MessageTemplateEntity> templateList = templateService.list();
//查询出规定时段内的短信数量统一发送 LocalDateTime now = LocalDateTime.now();
// 获取配置的时间范围内的消息 templateList.forEach(template -> {
LocalDateTime endTime = DateUtil.plus(LocalDateTime.now(), smsConfigEntity.getDuration(), smsConfigEntity.getTimeUnit()); LocalDateTime endTime = DateUtil.plus(LocalDateTime.now(), template.getConcentratedDuration(), template.getConcentratedTimeUnit());
PushMessageDTO pushMessageDTO = new PushMessageDTO(); endTime = DateUtil.plus(endTime, template.getAdvanceDuration(), template.getAdvanceTimeUnit());
pushMessageDTO.setStartTime(LocalDateTime.now()); LambdaQueryWrapper<MessagePushRecordEntity> lqw = Wrappers.<MessagePushRecordEntity>lambdaQuery()
pushMessageDTO.setEndTime(endTime); .eq(MessagePushRecordEntity::getStatus, MessageConstants.NOT_PUSH)
pushMessageDTO.setBusinessKey(smsConfigEntity.getBusinessKey()); .ge(MessagePushRecordEntity::getPlanTime, now)
pushMessageDTO.setIsPush(false); .le(MessagePushRecordEntity::getPlanTime, endTime);
List<PushMessageEntity> pushMessageList = pushMessageService.list(pushMessageDTO); List<MessagePushRecordEntity> list = recordService.list(lqw);
XxlJobLogger.log("开始推送短信,推送条数为:"+pushMessageList.size()); this.sendMessage(list);
// 获取推送消息内容体 根据用户拆分出多条短信推送
List<JSONObject> splitSmsList = this.transform(pushMessageList);
if(CollectionUtil.isEmpty(splitSmsList)) {
return;
}
this.push(splitSmsList,smsConfigEntity);
}); });
return ReturnT.SUCCESS; return ReturnT.SUCCESS;
} }
/** /** @Author hx
* 推送短信 * @Description 消息集中推送
* @param splitSmsList 短信内容 * @Date 2023/4/4 15:31
* @param configEntity 短信配置 * @Param [list] 消息推送记录
*/ * @return void
private void push(List<JSONObject> splitSmsList,SmsConfigEntity configEntity) { **/
Map<String, List<JSONObject>> phoneMap = splitSmsList.stream().collect(Collectors.groupingBy(sms -> sms.getString("phones"))); private void sendMessage(List<MessagePushRecordEntity> list) {
phoneMap.forEach((phone,messages) -> { Map<String, List<MessagePushRecordEntity>> collect = list.stream().collect(Collectors.groupingBy(MessagePushRecordEntity::getAccount));
String messageIds = messages.stream().map(message -> message.getString(MESSAGE_ID)).collect(Collectors.joining(",")); String type = list.get(0).getType();
List<SmsPushDto> smsPushDtoList = JSONArray.parseArray(JSON.toJSONString(messages), SmsPushDto.class); IMessageService service = MessageFactory.getMessageSend(type);
SmsPushDto templatePush = smsPushDtoList.get(0); collect.forEach((account,records) -> {
Map<String,String> params = new HashMap<>(); MessagePushRecordEntity request = records.get(0);
Arrays.stream(configEntity.getContentVariables().split(",")).forEachOrdered(contentVariable ->{ // 完善推送内容
String value = smsPushDtoList.stream().map(SmsPushDto::getParams) request.setContent(this.getPushContent(type,records));
.map(pm -> MapUtil.getStr(pm,contentVariable)).collect(Collectors.joining(",")); Boolean flag = service.send(request);
params.put(contentVariable,value); List<Long> ids = records.stream().map(MessagePushRecordEntity::getId).collect(Collectors.toList());
}); // 更新消息推送状态
templatePush.setParams(params); LambdaUpdateWrapper<MessagePushRecordEntity> lwq = Wrappers.<MessagePushRecordEntity>lambdaUpdate()
XxlJobLogger.log(">>>>>>>>>>开始推送消息,推送内容为:"+JSONObject.toJSONString(templatePush)+"<<<<<<<<<<"); .set(MessagePushRecordEntity::getStatus, flag ? MessageConstants.PUSH_SUCCESS : MessageConstants.PUSH_FAILED)
LambdaUpdateWrapper<PushMessageEntity> pushLU = Wrappers.<PushMessageEntity>lambdaUpdate() .set(MessagePushRecordEntity::getPushTime,LocalDateTime.now())
.set(PushMessageEntity::getIsPush, true) .in(MessagePushRecordEntity::getId, ids);
.in(PushMessageEntity::getId, messageIds.split(",")); recordService.update(lwq);
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);
}); });
} }
/** /** @Author hx
* 获取推送消息内容体 根据用户拆分出多条短信推送 * @Description 获取群推送内容
* @param pushMessageList * @Date 2023/4/4 16:06
* @return * @Param [type, list]
*/ * @return java.lang.String
private List<JSONObject> transform(List<PushMessageEntity> pushMessageList) { **/
return pushMessageList.stream().map(m -> { private String getPushContent(String type,List<MessagePushRecordEntity> list) {
JSONObject object = JSONObject.parseObject(m.getMessageContent()); if(MessageConstants.APP_NAME.equals(type)) {
object.put(MESSAGE_ID,m.getId()); return list.stream().map(MessagePushRecordEntity::getContent).collect(Collectors.joining("\r\n"));
return object; }
}).filter(object -> Func.isNotEmpty(object.getString("phones"))).collect(Collectors.toList()); 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);
}
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.baomidou.mybatisplus.extension.service.IService;
import com.hnac.hzims.message.dto.PushDto; import com.hnac.hzims.message.dto.PushDto;
import com.hnac.hzims.message.entity.MessagePushRecordEntity;
import org.springblade.core.tool.api.R; import org.springblade.core.tool.api.R;
/** /**
@ -16,4 +17,6 @@ public interface IMessageService {
*/ */
<T extends PushDto> R<String> send(T pushObject); <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.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.hnac.hzims.message.MessageConstants; 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.log.aspect.SaveLog;
import com.hnac.hzims.message.dto.MailPushDto; import com.hnac.hzims.message.dto.MailPushDto;
import com.hnac.hzims.message.dto.PushDto; import com.hnac.hzims.message.dto.PushDto;
@ -75,4 +76,9 @@ public class MailMessageServiceImpl implements IMessageService {
return R.success("发送成功!"); 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.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.hnac.hzims.message.MessageConstants; 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.log.aspect.SaveLog;
import com.hnac.hzims.message.dto.AppPushDto; import com.hnac.hzims.message.dto.AppPushDto;
import com.hnac.hzims.message.dto.PushDto; import com.hnac.hzims.message.dto.PushDto;
import com.hnac.hzims.message.service.IMessageService; import com.hnac.hzims.message.service.IMessageService;
import com.hnac.hzinfo.core.push.enums.PlatformType; 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.PushAudience;
import com.hnac.hzinfo.core.push.model.PushInfo; import com.hnac.hzinfo.core.push.model.PushInfo;
import com.hnac.hzinfo.core.push.model.PushPlatform; import com.hnac.hzinfo.core.push.model.PushPlatform;
import com.hnac.hzinfo.core.push.model.PushResponse;
import lombok.AllArgsConstructor; 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.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R; import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springblade.core.tool.utils.ObjectUtil; import org.springblade.core.tool.utils.ObjectUtil;
import org.springblade.resource.feign.IPushClient; import org.springblade.resource.feign.IPushClient;
import org.springblade.resource.vo.PushInfoVO; import org.springblade.resource.vo.PushInfoVO;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
@ -30,6 +39,7 @@ import java.util.concurrent.atomic.AtomicReference;
public class PushMessageServiceImpl implements IMessageService { public class PushMessageServiceImpl implements IMessageService {
private final IPushClient pushClient; private final IPushClient pushClient;
private final BladeLogger logger;
@Override @Override
@SaveLog(type = MessageConstants.APP_NAME) @SaveLog(type = MessageConstants.APP_NAME)
@ -73,4 +83,38 @@ public class PushMessageServiceImpl implements IMessageService {
}); });
return R.success("推送成功"); 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.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.google.api.client.util.Value;
import com.hnac.hzims.message.MessageConstants; 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.log.aspect.SaveLog;
import com.hnac.hzims.message.dto.PushDto; import com.hnac.hzims.message.dto.PushDto;
import com.hnac.hzims.message.dto.SmsPushDto; import com.hnac.hzims.message.dto.SmsPushDto;
@ -10,11 +12,13 @@ import com.hnac.hzims.message.service.IMessageService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springblade.core.log.exception.ServiceException; 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.sms.model.SmsResponse;
import org.springblade.core.tool.api.R; import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.Func;
import org.springblade.resource.feign.ISmsClient; import org.springblade.resource.feign.ISmsClient;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
/** /**
* @author hx * @author hx
@ -41,4 +45,18 @@ public class SmsMessageServiceImpl implements IMessageService {
} }
return response; 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.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.hnac.hzims.message.MessageConstants; 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.log.aspect.SaveLog;
import com.hnac.hzims.message.dto.PushDto; import com.hnac.hzims.message.dto.PushDto;
import com.hnac.hzims.message.dto.WsPushDto; import com.hnac.hzims.message.dto.WsPushDto;
@ -83,4 +84,9 @@ public class WebsocketServiceImpl implements IMessageService {
} }
return R.success("推送成功"); return R.success("推送成功");
} }
@Override
public Boolean send(MessagePushRecordEntity request) {
return null;
}
} }

Loading…
Cancel
Save