Commit 9a31da94 by giaogiao

异步系统推送

parent e1de3059
......@@ -22,6 +22,13 @@
</dependency>
<dependency>
<groupId>com.google.firebase</groupId>
<artifactId>firebase-admin</artifactId>
<version>6.4.0</version>
</dependency>
<!-- netty-->
<dependency>
<groupId>io.netty</groupId>
......
//package com.wecloud.im.controller;
//
//import com.wecloud.im.entity.ImApplication;
//import com.wecloud.im.param.ImApplicationPageParam;
//import com.wecloud.im.param.ImApplicationQueryVo;
//import com.wecloud.im.service.ImApplicationService;
//import io.geekidea.springbootplus.framework.common.api.ApiResult;
//import io.geekidea.springbootplus.framework.common.controller.BaseController;
//import io.geekidea.springbootplus.framework.core.pagination.Paging;
//import io.geekidea.springbootplus.framework.core.validator.groups.Add;
//import io.geekidea.springbootplus.framework.core.validator.groups.Update;
//import io.geekidea.springbootplus.framework.log.annotation.OperationLog;
//import io.geekidea.springbootplus.framework.log.enums.OperationLogType;
//import io.swagger.annotations.Api;
//import io.swagger.annotations.ApiOperation;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.validation.annotation.Validated;
//import org.springframework.web.bind.annotation.GetMapping;
//import org.springframework.web.bind.annotation.PathVariable;
//import org.springframework.web.bind.annotation.PostMapping;
//import org.springframework.web.bind.annotation.RequestBody;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//
///**
// * 第三方应用表 控制器
// *
// * @author wei
// * @since 2021-04-27
// */
//@Slf4j
//@RestController
//@RequestMapping("/imApplication")
//@Api(value = "第三方应用表API", tags = {"第三方应用表"})
//public class ImApplicationController extends BaseController {
//
// @Autowired
// private ImApplicationService imApplicationService;
//
// /**
// * 添加第三方应用表
// */
// @PostMapping("/add")
// @OperationLog(name = "添加第三方应用表", type = OperationLogType.ADD)
// @ApiOperation(value = "添加第三方应用表")
// public ApiResult<Boolean> addImApplication(@Validated(Add.class) @RequestBody ImApplication imApplication) throws Exception {
// boolean flag = imApplicationService.saveImApplication(imApplication);
// return ApiResult.result(flag);
// }
//
// /**
// * 修改第三方应用表
// */
// @PostMapping("/update")
// @OperationLog(name = "修改第三方应用表", type = OperationLogType.UPDATE)
// @ApiOperation(value = "修改第三方应用表")
// public ApiResult<Boolean> updateImApplication(@Validated(Update.class) @RequestBody ImApplication imApplication) throws Exception {
// boolean flag = imApplicationService.updateImApplication(imApplication);
// return ApiResult.result(flag);
// }
//
// /**
// * 删除第三方应用表
// */
// @PostMapping("/delete/{id}")
// @OperationLog(name = "删除第三方应用表", type = OperationLogType.DELETE)
// @ApiOperation(value = "删除第三方应用表")
// public ApiResult<Boolean> deleteImApplication(@PathVariable("id") Long id) throws Exception {
// boolean flag = imApplicationService.deleteImApplication(id);
// return ApiResult.result(flag);
// }
//
// /**
// * 获取第三方应用表详情
// */
// @GetMapping("/info/{id}")
// @OperationLog(name = "第三方应用表详情", type = OperationLogType.INFO)
// @ApiOperation(value = "第三方应用表详情")
// public ApiResult<ImApplicationQueryVo> getImApplication(@PathVariable("id") Long id) throws Exception {
// ImApplicationQueryVo imApplicationQueryVo = imApplicationService.getImApplicationById(id);
// return ApiResult.ok(imApplicationQueryVo);
// }
//
// /**
// * 第三方应用表分页列表
// */
// @PostMapping("/getPageList")
// @OperationLog(name = "第三方应用表分页列表", type = OperationLogType.PAGE)
// @ApiOperation(value = "第三方应用表分页列表")
// public ApiResult<Paging<ImApplicationQueryVo>> getImApplicationPageList(@Validated @RequestBody ImApplicationPageParam imApplicationPageParam) throws Exception {
// Paging<ImApplicationQueryVo> paging = imApplicationService.getImApplicationPageList(imApplicationPageParam);
// return ApiResult.ok(paging);
// }
//
//}
//
package com.wecloud.im.controller;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.param.ImApplicationPageParam;
import com.wecloud.im.param.ImApplicationQueryVo;
import com.wecloud.im.param.add.ImApplicationAdd;
import com.wecloud.im.service.ImApplicationService;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
import io.geekidea.springbootplus.framework.core.validator.groups.Add;
import io.geekidea.springbootplus.framework.core.validator.groups.Update;
import io.geekidea.springbootplus.framework.log.annotation.OperationLog;
import io.geekidea.springbootplus.framework.log.enums.OperationLogType;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* 第三方应用表 控制器
*
* @author wei
* @since 2021-04-27
*/
@Slf4j
@RestController
@RequestMapping("/imApplication")
@Api(value = "第三方应用表API", tags = {"第三方应用表"})
public class ImApplicationController extends BaseController {
public static final String ADMIN_PWD = "si0132g9ad4gd6xv8x888wd6g86aga731h6pzc1pzc68b7eln96s2360j0sjkh028sj131h0gjb";
@Autowired
private ImApplicationService imApplicationService;
/**
* 添加第三方应用表
*/
@PostMapping("/add")
@OperationLog(name = "添加第三方应用表", type = OperationLogType.ADD)
@ApiOperation(value = "添加第三方应用表")
public ApiResult<Boolean> addImApplication(@Validated(Add.class) @RequestBody ImApplicationAdd imApplicationAdd) throws Exception {
if (!imApplicationAdd.getAdminPwd().equals(ADMIN_PWD)) {
return ApiResult.fail();
}
ImApplication imApplication = new ImApplication();
BeanUtils.copyProperties(imApplicationAdd, imApplication);
boolean flag = imApplicationService.saveImApplication(imApplication);
return ApiResult.result(flag);
}
/**
* 修改第三方应用表
*/
@PostMapping("/update")
@OperationLog(name = "修改第三方应用表", type = OperationLogType.UPDATE)
@ApiOperation(value = "修改第三方应用表")
public ApiResult<Boolean> updateImApplication(@Validated(Update.class) @RequestBody ImApplicationAdd imApplicationAdd) throws Exception {
if (!imApplicationAdd.getAdminPwd().equals(ADMIN_PWD)) {
return ApiResult.fail();
}
ImApplication imApplication = new ImApplication();
boolean flag = imApplicationService.updateImApplication(imApplication);
return ApiResult.result(flag);
}
/**
* 删除第三方应用表
*/
@PostMapping("/delete")
@OperationLog(name = "删除第三方应用表", type = OperationLogType.DELETE)
@ApiOperation(value = "删除第三方应用表")
public ApiResult<Boolean> deleteImApplication(@RequestParam("id") Long id, @RequestParam("pwd") String pwd) throws Exception {
if (!pwd.equals(ADMIN_PWD)) {
return ApiResult.fail();
}
boolean flag = imApplicationService.deleteImApplication(id);
return ApiResult.result(flag);
}
/**
* 获取第三方应用表详情
*/
@GetMapping("/info/")
@OperationLog(name = "第三方应用表详情", type = OperationLogType.INFO)
@ApiOperation(value = "第三方应用表详情")
public ApiResult<ImApplicationQueryVo> getImApplication(@RequestParam("id") Long id, @RequestParam("pwd") String pwd) throws Exception {
if (!pwd.equals(ADMIN_PWD)) {
return null;
}
ImApplicationQueryVo imApplicationQueryVo = imApplicationService.getImApplicationById(id);
return ApiResult.ok(imApplicationQueryVo);
}
/**
* 第三方应用表分页列表
*/
@PostMapping("/getPageList")
@OperationLog(name = "第三方应用表分页列表", type = OperationLogType.PAGE)
@ApiOperation(value = "第三方应用表分页列表")
public ApiResult<Paging<ImApplicationQueryVo>> getImApplicationPageList(@Validated @RequestBody ImApplicationPageParam imApplicationPageParam) throws Exception {
if (!imApplicationPageParam.getPwd().equals(ADMIN_PWD)) {
return null;
}
Paging<ImApplicationQueryVo> paging = imApplicationService.getImApplicationPageList(imApplicationPageParam);
return ApiResult.ok(paging);
}
}
......@@ -45,15 +45,18 @@ public class ImApplication extends BaseEntity {
@ApiModelProperty("app名称")
private String appName;
@ApiModelProperty("ios推送证书")
private String iosPush;
@ApiModelProperty("ios推送通道,友盟:1;firebase:2; apns原生:3")
private Integer iosPushChannel;
@ApiModelProperty("安卓推送证书")
private String androidPush;
@ApiModelProperty("安卓推送通道,友盟:1;firebase:2; 信鸽3")
private Integer androidPushChannel;
@ApiModelProperty("友盟推送key")
private String umengKey;
@ApiModelProperty("友盟推送密钥")
private String umengSecret;
@ApiModelProperty("firebase推送密钥")
private String firebaseSecret;
}
......@@ -19,5 +19,7 @@ import lombok.experimental.Accessors;
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "第三方应用表分页参数")
public class ImApplicationPageParam extends BasePageOrderParam {
private String pwd;
private static final long serialVersionUID = 1L;
}
package com.wecloud.im.param.add;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.geekidea.springbootplus.framework.common.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
import java.util.Date;
/**
* 第三方应用表
*
* @author wei
* @since 2021-04-27
*/
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "ImApplicationAdd")
public class ImApplicationAdd extends BaseEntity {
private static final long serialVersionUID = 1L;
@NotNull(message = "应用appid不能为空")
@ApiModelProperty("应用appid")
@TableId(value = "id", type = IdType.INPUT)
private Long id;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("修改时间")
private Date updateTime;
@ApiModelProperty("key")
private String appKey;
@ApiModelProperty("密钥")
private String appSecret;
@ApiModelProperty("app名称")
private String appName;
@ApiModelProperty("ios推送通道,友盟:1;firebase:2; apns原生:3")
private Integer iosPushChannel;
@ApiModelProperty("安卓推送通道,友盟:1;firebase:2; 信鸽3")
private Integer androidPushChannel;
@ApiModelProperty("友盟推送key")
private String umengKey;
@ApiModelProperty("友盟推送密钥")
private String umengSecret;
@ApiModelProperty("firebase推送密钥")
private String firebaseSecret;
private String adminPwd;
}
package com.wecloud.im.tillo.app_ws.sender;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.push.PushUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
/**
* 异步系统推送
*/
@Component
@Slf4j
public class PushTask {
/**
* 异步系统推送
*
* @param imClientReceiver
* @param imClientSender
* @param imMessage
*/
@Async
public void push(ImClient imClientReceiver, ImClient imClientSender, ImMessage imMessage, ImApplication imApplication) {
log.debug("push " + imClientReceiver.getClientId());
// 校验参数
if (imClientReceiver.getValid() == null || imClientReceiver.getDeviceToken() == null || imClientReceiver.getDeviceType() == null) {
log.debug("push参数错误");
return;
}
// 设备不想收到推送提醒, 1想, 0不想
if (imClientReceiver.getValid() == 0) {
return;
}
// 设备类型1:ios; 2:android
if (imClientReceiver.getDeviceType() == 1) {
ios(imClientReceiver, imApplication);
} else {
android(imClientReceiver, imApplication);
}
}
private void android(ImClient imClientReceiver, ImApplication imApplication) {
// 安卓推送通道,友盟:1;firebase:2; 信鸽3
if (imApplication.getAndroidPushChannel() == 1) {
log.debug("友盟");
// 友盟推送
PushUtils pushUtils = new PushUtils(imApplication.getUmengKey(), imApplication.getUmengSecret());
// 安卓 单推
String deviceTokenIOS = imClientReceiver.getDeviceToken();
String titleIOS = "收到新消息";
String subtitle = "";
String body = "点击查看";
try {
pushUtils.sendIOSUnicast(deviceTokenIOS, titleIOS, subtitle, body);
} catch (Exception e) {
e.printStackTrace();
}
} else if (imApplication.getAndroidPushChannel() == 2) {
//firebase:2
log.debug("firebase");
} else if (imApplication.getAndroidPushChannel() == 3) {
// 信鸽3
log.debug("信鸽3");
} else {
log.debug("没有找到推送类型");
return;
}
}
private void ios(ImClient imClientReceiver, ImApplication imApplication) {
// ios推送通道,友盟:1;firebase:2; apns原生:3
if (imApplication.getIosPushChannel() == 1) {
log.debug("友盟");
// 友盟推送
PushUtils pushUtils = new PushUtils(imApplication.getUmengKey(), imApplication.getUmengSecret());
// 安卓单推
String deviceToken = imClientReceiver.getDeviceToken();
String unicastText = "Android unicast text";
String unicastTicker = "点击查看";
String title = "收到新消息";
try {
pushUtils.sendAndroidUnicast(deviceToken, unicastText, unicastTicker, title);
} catch (Exception e) {
e.printStackTrace();
}
} else if (imApplication.getIosPushChannel() == 2) {
//firebase:2
log.debug("firebase");
} else if (imApplication.getIosPushChannel() == 3) {
// apns原生:3
log.debug("apns原生");
} else {
log.debug("没有找到推送类型");
return;
}
}
}
......@@ -9,6 +9,7 @@ import com.wecloud.im.tillo.app_ws.service.WriteDataService;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.util.HashMap;
......@@ -53,6 +54,7 @@ public class WriteDataServiceImpl implements WriteDataService {
}
@Override
@Async
public void write(ResponseModel responseModel, String toAppKey, String toClientId) {
JsonMapper jsonMapper = new JsonMapper();
......
......@@ -9,7 +9,6 @@ import com.wecloud.im.entity.ImConversationMembers;
import com.wecloud.im.entity.ImInbox;
import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.entity.ImMessageOnlineSend;
import com.wecloud.im.push.PushUtils;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientService;
import com.wecloud.im.service.ImConversationMembersService;
......@@ -19,6 +18,7 @@ import com.wecloud.im.tillo.app_ws.annotation.ReceiveTypeAnnotation;
import com.wecloud.im.tillo.app_ws.enums.WsRequestCmdEnum;
import com.wecloud.im.tillo.app_ws.model.ResponseModel;
import com.wecloud.im.tillo.app_ws.model.request.ReceiveModel;
import com.wecloud.im.tillo.app_ws.sender.PushTask;
import com.wecloud.im.tillo.app_ws.service.MangerChannelService;
import com.wecloud.im.tillo.app_ws.service.WriteDataService;
import com.wecloud.im.tillo.app_ws.strategy.AbstractReceiveStrategy;
......@@ -61,6 +61,9 @@ public class ImConcreteReceiveStrategy extends AbstractReceiveStrategy {
@Autowired
private ImClientService imClientService;
@Autowired
private PushTask pushTask;
@Override
public void process(ReceiveModel receiveModel, String language, ChannelHandlerContext ctx, String data) {
......@@ -130,8 +133,7 @@ public class ImConcreteReceiveStrategy extends AbstractReceiveStrategy {
imMessageOnlineSend.setContent(receiveModel.getData());
imMessageOnlineSend.setConversationId(toConversationId);
// 友盟推送
PushUtils pushUtils = new PushUtils(imApplication.getUmengKey(), imApplication.getUmengSecret());
// 遍历发送
for (ImConversationMembers conversationMembers : membersList) {
......@@ -169,37 +171,8 @@ public class ImConcreteReceiveStrategy extends AbstractReceiveStrategy {
responseModel.setReqId(null);
writeDataService.write(responseModel, appKey, imClientReceiver.getClientId());
// 系统推送
// 设备不想收到推送提醒, 1想, 0不想
if (imClientReceiver.getValid() != null && imClientReceiver.getValid() != 0 && imClientReceiver.getDeviceToken() != null) {
// 设备类型1:ios; 2:android
if (imClientReceiver.getDeviceType() == 1) {
// ios 单推
String deviceTokenIOS = imClientReceiver.getDeviceToken();
String titleIOS = "收到新消息";
String subtitle = "";
String body = "点击查看";
try {
pushUtils.sendIOSUnicast(deviceTokenIOS, titleIOS, subtitle, body);
} catch (Exception e) {
e.printStackTrace();
}
} else {
// 安卓单推
String deviceToken = imClientReceiver.getDeviceToken();
String unicastText = "Android unicast text";
String unicastTicker = "点击查看";
String title = "收到新消息";
try {
pushUtils.sendAndroidUnicast(deviceToken, unicastText, unicastTicker, title);
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 异步推送
pushTask.push(imClientReceiver, imClientSender, imMessage, imApplication);
}
// 响应发送方消息id等信息
......@@ -209,7 +182,7 @@ public class ImConcreteReceiveStrategy extends AbstractReceiveStrategy {
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
HashMap<String, Long> stringHashMap = new HashMap<String, Long>();
HashMap<String, Long> stringHashMap = new HashMap<>();
stringHashMap.put("msgId", messageId);
responseModel.setData(stringHashMap);
......@@ -217,4 +190,6 @@ public class ImConcreteReceiveStrategy extends AbstractReceiveStrategy {
writeDataService.write(responseModel, appKey, clientUniId);
}
}
......@@ -5,7 +5,8 @@
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id
, create_time, update_time, app_key, app_secret, app_name, ios_push, android_push,umeng_key,umeng_secret
, create_time, update_time, app_key, app_secret, app_name, ios_push_channel, android_push_channel,umeng_key,umeng_secret,firebase_secret
</sql>
<select id="getImApplicationById" resultType="com.wecloud.im.param.ImApplicationQueryVo">
......
......@@ -37,7 +37,7 @@ public interface CommonConstant {
/**
* 数量最大为100
*/
Long MAX_PAGE_SIZE = 100L;
Long MAX_PAGE_SIZE = 1000L;
/**
......
......@@ -195,6 +195,8 @@ spring-boot-plus:
# - /actuator/**
- # 排除首页
- /,/index.html
# 应用相关
- /imApplication/**
# 多行字符串权限配置
filter-chain-definitions: |
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment