Prechádzať zdrojové kódy

轮胎app推送集成

liyuan 9 hodín pred
rodič
commit
bda0e5e794

+ 45 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/push/dto/AppMsgPushDto.java

@@ -0,0 +1,45 @@
+package org.springblade.salesPart.push.dto;
+
+import lombok.Data;
+
+/**
+ * @author Rain
+ */
+@Data
+public class AppMsgPushDto {
+
+	/**
+	 * 请求id
+	 * 必须唯一
+	 */
+	private String requestId;
+
+	/**
+	 * 推送的id
+	 * 可为数组
+	 */
+	private String cId;
+
+	/**
+	 * 推送的标题
+	 */
+	private String title;
+
+	/**
+	 * 推送的内容
+	 */
+	private String content;
+
+	/**
+	 * 推送的附加信息
+	 */
+	private String payload;
+
+	/**
+	 * 是否是测试环境
+	 * true 为测试环境
+	 */
+	private boolean isDev;
+
+
+}

+ 90 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/push/entity/UserPushCid.java

@@ -0,0 +1,90 @@
+package org.springblade.salesPart.push.entity;
+
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * 用户推送设备信息实体类
+ * 对应数据库表:user_push_cid
+ *
+ * @author Rain
+ */
+@Data
+public class UserPushCid {
+
+	/**
+	 * 主键ID
+	 */
+	private Long id;
+
+	/**
+	 * 租户ID
+	 */
+	private String tenantId;
+
+	/**
+	 * 用户ID(可以是系统用户ID、OpenID等)
+	 */
+	private Long userId;
+
+	/**
+	 * 推送客户端ID(Client ID)
+	 */
+	@NotBlank(message = "推送客户端ID不能为空")
+	@NotNull(message = "推送客户端ID不能为空")
+	private String cid;
+
+	/**
+	 * 应用ID(可区分多个应用)
+	 */
+	private String appId;
+
+	/**
+	 * 平台:android/ios/web
+	 */
+	private String platform;
+
+	/**
+	 * 设备品牌:huawei/xiaomi/oppo/vivo等
+	 */
+	private String deviceBrand;
+
+	/**
+	 * 设备型号
+	 */
+	private String deviceModel;
+
+	/**
+	 * 操作系统版本
+	 */
+	private String osVersion;
+
+	/**
+	 * 应用版本号
+	 */
+	private String appVersion;
+
+	/**
+	 * 状态:1-有效,0-无效
+	 */
+	private Integer status;
+
+	/**
+	 * 最后活跃时间
+	 */
+	private Date lastActiveTime;
+
+	/**
+	 * 创建时间
+	 */
+	private Date createTime;
+
+	/**
+	 * 更新时间
+	 */
+	private Date updateTime;
+}

+ 2 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/enums/FinalMap.java

@@ -32,4 +32,6 @@ public class FinalMap {
 
 	public static final String GET_BY_ID = "getById";
 
+	public static final String APP_PUSH_URL = "https://push.echepei.com/pushAppMsg";
+
 }

+ 43 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/push/controller/UserPushCidController.java

@@ -0,0 +1,43 @@
+package org.springblade.salesPart.push.controller;
+
+import lombok.AllArgsConstructor;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.salesPart.push.dto.AppMsgPushDto;
+import org.springblade.salesPart.push.entity.UserPushCid;
+import org.springblade.salesPart.push.service.IUserPushCidService;
+import org.springblade.salesPart.util.PushUtil;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * @author Rain
+ */
+@RestController
+@RequestMapping("/app/push")
+@AllArgsConstructor
+public class UserPushCidController {
+
+	private final IUserPushCidService userPushCidService;
+
+	private final PushUtil pushUtil;
+
+
+
+	@PostMapping("/saveUserCid")
+	public R saveUserCid(@RequestBody @Valid UserPushCid userPush) {
+		return userPushCidService.saveUserCid(userPush);
+	}
+
+
+	@GetMapping("/testPush")
+	public R testPush() {
+		AppMsgPushDto pushDto = new AppMsgPushDto();
+		pushDto.setTitle("测试title--11");
+		pushDto.setContent("测试content--11");
+		return R.data(pushUtil.sendAppTitleMsgByOne(AuthUtil.getUserId(), pushDto));
+	}
+
+
+}

+ 10 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/push/mapper/UserPushCidMapper.java

@@ -0,0 +1,10 @@
+package org.springblade.salesPart.push.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.salesPart.push.entity.UserPushCid;
+
+/**
+ * @author Rain
+ */
+public interface UserPushCidMapper extends BaseMapper<UserPushCid> {
+}

+ 8 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/push/mapper/UserPushCidMapper.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--suppress ALL -->
+<mapper namespace="org.springblade.salesPart.push.mapper.UserPushCidMapper">
+
+
+
+</mapper>

+ 19 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/push/service/IUserPushCidService.java

@@ -0,0 +1,19 @@
+package org.springblade.salesPart.push.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.core.tool.api.R;
+import org.springblade.salesPart.push.entity.UserPushCid;
+
+/**
+ * @author Rain
+ */
+public interface IUserPushCidService extends IService<UserPushCid> {
+
+	/**
+	 * 保存用户推送设备信息
+	 *
+	 * @param userPush cid、platform、brand
+	 * @return 结果
+	 */
+	R saveUserCid(UserPushCid userPush);
+}

+ 45 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/push/service/impl/UserPushCidServiceImpl.java

@@ -0,0 +1,45 @@
+package org.springblade.salesPart.push.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.salesPart.push.entity.UserPushCid;
+import org.springblade.salesPart.push.mapper.UserPushCidMapper;
+import org.springblade.salesPart.push.service.IUserPushCidService;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ * @author Rain
+ */
+@Service
+public class UserPushCidServiceImpl extends ServiceImpl<UserPushCidMapper, UserPushCid> implements IUserPushCidService {
+
+
+
+	@Override
+	public R saveUserCid(UserPushCid userPush) {
+		UserPushCid srcUserPush = baseMapper.selectOne(new LambdaQueryWrapper<UserPushCid>().eq(UserPushCid::getCid, userPush.getCid()).last("limit 1"));
+		if (Objects.nonNull(srcUserPush)) {
+			userPush.setId(srcUserPush.getId());
+			baseMapper.updateById(userPush);
+			return R.success("操作成功");
+		}
+		BladeUser saveUser = AuthUtil.getUser();
+		UserPushCid update = new UserPushCid();
+		update.setUpdateTime(new Date());
+		update.setStatus(0);
+		// 没有区分平台及品牌,后续需要就添加
+		baseMapper.update(update, new LambdaQueryWrapper<UserPushCid>().eq(UserPushCid::getUserId, saveUser.getUserId()));
+		userPush.setUserId(saveUser.getUserId());
+		userPush.setTenantId(saveUser.getTenantId());
+		baseMapper.insert(userPush);
+		return R.success("操作成功");
+	}
+
+
+}

+ 110 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/util/PushUtil.java

@@ -0,0 +1,110 @@
+package org.springblade.salesPart.util;
+
+import cn.hutool.core.util.IdUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.springblade.core.tool.utils.CollectionUtil;
+import org.springblade.salesPart.enums.FinalMap;
+import org.springblade.salesPart.push.dto.AppMsgPushDto;
+import org.springblade.salesPart.push.entity.UserPushCid;
+import org.springblade.salesPart.push.mapper.UserPushCidMapper;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * @author Rain
+ */
+@Component
+@AllArgsConstructor
+@Slf4j
+public class PushUtil {
+
+	private final UserPushCidMapper userPushCidMapper;
+
+
+	/**
+	 * 发送单用户推送
+	 *
+	 * @param userId  用户系统id
+	 * @param pushDto 推送内容
+	 * @return 消息
+	 */
+	public String sendAppTitleMsgByOne(Long userId, AppMsgPushDto pushDto) {
+		if (Objects.isNull(userId) || Objects.isNull(pushDto)) {
+			return null;
+		}
+		UserPushCid userPush = userPushCidMapper.selectOne(new LambdaQueryWrapper<UserPushCid>().eq(UserPushCid::getUserId, userId).eq(UserPushCid::getStatus, 1).orderByDesc(UserPushCid::getLastActiveTime).last("limit 1"));
+		if (Objects.isNull(userPush)) {
+			log.error("用户id:{}没有推送id", userId);
+			return null;
+		}
+		pushDto.setCId(userPush.getCid());
+		pushDto.setRequestId(IdUtil.getSnowflakeNextIdStr());
+		try {
+			//创建一个获取连接客户端的工具
+			CloseableHttpClient httpClient = HttpClients.createDefault();
+			//创建Post请求
+			HttpPost httpPost = new HttpPost(FinalMap.APP_PUSH_URL);
+			//添加请求头
+			httpPost.addHeader("Content-Type", "application/json;charset=utf-8");
+			//封装请求参数,将map集合转换成json格式
+			StringEntity entity = new StringEntity(JSONObject.toJSONString(pushDto), "UTF-8");
+			//将封装的参数添加到Post请求中
+			httpPost.setEntity(entity);
+			//执行请求
+			CloseableHttpResponse response = httpClient.execute(httpPost);
+			//获取响应的实体
+			HttpEntity responseEntity = response.getEntity();
+			//转化成字符串
+			return EntityUtils.toString(responseEntity);
+		} catch (Exception e) {
+			return null;
+		}
+	}
+
+	public String sendAppTitleMsgByList(List<Long> userIds, AppMsgPushDto pushDto) {
+		if (CollectionUtil.isEmpty(userIds) || Objects.isNull(pushDto)) {
+			return null;
+		}
+		List<UserPushCid> userPushCidList = userPushCidMapper.selectList(new LambdaQueryWrapper<UserPushCid>().in(UserPushCid::getUserId, userIds).eq(UserPushCid::getStatus, 1));
+		if (CollectionUtil.isEmpty(userPushCidList)) {
+			return null;
+		}
+		pushDto.setCId(userPushCidList.stream().map(UserPushCid::getCid).collect(Collectors.joining(",")));
+		pushDto.setRequestId(IdUtil.getSnowflakeNextIdStr());
+		try {
+			//创建一个获取连接客户端的工具
+			CloseableHttpClient httpClient = HttpClients.createDefault();
+			//创建Post请求
+			HttpPost httpPost = new HttpPost(FinalMap.APP_PUSH_URL);
+			//添加请求头
+			httpPost.addHeader("Content-Type", "application/json;charset=utf-8");
+			//封装请求参数,将map集合转换成json格式
+			StringEntity entity = new StringEntity(JSONObject.toJSONString(pushDto), "UTF-8");
+			//将封装的参数添加到Post请求中
+			httpPost.setEntity(entity);
+			//执行请求
+			CloseableHttpResponse response = httpClient.execute(httpPost);
+			//获取响应的实体
+			HttpEntity responseEntity = response.getEntity();
+			//转化成字符串
+			return EntityUtils.toString(responseEntity);
+		} catch (Exception e) {
+			return null;
+		}
+	}
+
+
+}