From 17f32c613e6a48007b5f49ae03631fd83d5ae145 Mon Sep 17 00:00:00 2001
From: guoshilong <123456>
Date: Wed, 19 Jul 2023 11:20:00 +0800
Subject: [PATCH] 集成个推

---
 skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/resources/application-dev.yml                                 |    7 +
 skjcmanager/skjcmanager-service/skjcmanager-alerts/pom.xml                                                                |    6 
 skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/controller/PushController.java    |   11 +
 skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/utils/GeTuiUtils.java             |  268 ++++++++++++++++++++++++++++++++++++++
 skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/service/IPushService.java         |    7 +
 skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/config/GeTuiConfig.java           |   44 ++++++
 skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/service/impl/PushServiceImpl.java |   40 ++++-
 7 files changed, 372 insertions(+), 11 deletions(-)

diff --git a/skjcmanager/skjcmanager-service/skjcmanager-alerts/pom.xml b/skjcmanager/skjcmanager-service/skjcmanager-alerts/pom.xml
index 8b4bfc7..316ba29 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-alerts/pom.xml
+++ b/skjcmanager/skjcmanager-service/skjcmanager-alerts/pom.xml
@@ -38,6 +38,12 @@
             <groupId>org.springblade</groupId>
             <artifactId>blade-starter-excel</artifactId>
         </dependency>
+        <!--个推-->
+        <dependency>
+            <groupId>com.getui.push</groupId>
+            <artifactId>restful-sdk</artifactId>
+            <version>1.0.0.11</version>
+        </dependency>
         <dependency>
             <groupId>cn.gistack</groupId>
             <artifactId>skjcmanager-sm-api</artifactId>
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/config/GeTuiConfig.java b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/config/GeTuiConfig.java
new file mode 100644
index 0000000..530cdbf
--- /dev/null
+++ b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/config/GeTuiConfig.java
@@ -0,0 +1,44 @@
+package cn.gistack.alerts.push.config;
+
+import com.getui.push.v2.sdk.ApiHelper;
+import com.getui.push.v2.sdk.GtApiConfiguration;
+import com.getui.push.v2.sdk.api.PushApi;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class GeTuiConfig {
+	@Value("${getui.baseUrl}")
+	private String baseUrl;
+
+	@Value("${getui.appId}")
+	private String appId;
+
+	@Value("${getui.appKey}")
+	private String appKey;
+
+	@Value("${getui.appSecret}")
+	private String appSecret;
+
+	@Value("${getui.masterSecret}")
+	private String masterSecret;
+
+	@Bean(name = "myPushApi")
+	public PushApi pushApi() {
+		// 设置httpClient最大连接数,当并发较大时建议调大此参数。或者启动参数加上 -Dhttp.maxConnections=200
+		System.setProperty("http.maxConnections", "200");
+		GtApiConfiguration apiConfiguration = new GtApiConfiguration();
+		//填写应用配置
+		apiConfiguration.setAppId(appId);
+		apiConfiguration.setAppKey(appKey);
+		apiConfiguration.setMasterSecret(masterSecret);
+		// 接口调用前缀,请查看文档: 接口调用规范 -> 接口前缀, 可不填写appId
+		apiConfiguration.setDomain(baseUrl);
+
+		// 实例化ApiHelper对象,用于创建接口对象
+		ApiHelper apiHelper = ApiHelper.build(apiConfiguration);
+		// 创建对象,建议复用。目前有PushApi、StatisticApi、UserApi
+		return apiHelper.creatApi(PushApi.class);
+	}
+}
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/controller/PushController.java b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/controller/PushController.java
index 24ae508..ee5505b 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/controller/PushController.java
+++ b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/controller/PushController.java
@@ -56,4 +56,15 @@
 		return R.data(pushService.pushMessageOnLaunch(userId));
 	}
 
+	/**
+	 * 集成的个推sdk消息推送
+	 * @param pushVO
+	 * @return
+	 */
+	@PostMapping("/geTuiPushMessage")
+	public R geTuiPushMessage(PushVO pushVO){
+		return R.data(pushService.geTuiPushMessage(pushVO));
+	}
+
+
 }
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/service/IPushService.java b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/service/IPushService.java
index 023c503..7692fc3 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/service/IPushService.java
+++ b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/service/IPushService.java
@@ -49,4 +49,11 @@
 	 * @return
 	 */
 	Boolean pushMessageByUserId(PushVO pushVO);
+
+	/**
+	 * 个推推送消息
+	 * @param pushVO
+	 * @return
+	 */
+	Boolean geTuiPushMessage(PushVO pushVO);
 }
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/service/impl/PushServiceImpl.java b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/service/impl/PushServiceImpl.java
index 98a150c..260511c 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/service/impl/PushServiceImpl.java
+++ b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/service/impl/PushServiceImpl.java
@@ -1,6 +1,7 @@
 package cn.gistack.alerts.push.service.impl;
 
 import cn.gistack.alerts.push.service.IPushService;
+import cn.gistack.alerts.push.utils.GeTuiUtils;
 import cn.gistack.alerts.push.vo.PushVO;
 import cn.gistack.alerts.push.vo.UniCloudReturnRes;
 import cn.gistack.sm.message.entity.MessageRecord;
@@ -25,10 +26,11 @@
 
 	private BladeRedis bladeRedis;
 	private IMessageClient messageClient;
+	private GeTuiUtils geTuiUtils;
 
 	@Override
-	public Boolean saveCId(String userId,String cId) {
-		bladeRedis.set(PUSH_CLIENT_ID + userId,cId);
+	public Boolean saveCId(String userId, String cId) {
+		bladeRedis.set(PUSH_CLIENT_ID + userId, cId);
 		return Boolean.TRUE;
 	}
 
@@ -80,7 +82,7 @@
 	@Override
 	public Boolean pushMessageByUserId(PushVO pushVO) {
 
-		if (Func.isEmpty(pushVO.getUserId())){
+		if (Func.isEmpty(pushVO.getUserId())) {
 			throw new ServiceException("请填写用户id!");
 		}
 
@@ -92,33 +94,49 @@
 		return pushMessage(pushVO);
 	}
 
+	@Override
+	public Boolean geTuiPushMessage(PushVO pushVO) {
+
+		List<String> cIdList = new ArrayList<>();
+		cIdList.add(getClientIdByUserId(pushVO.getUserId()));
+		return geTuiUtils.pushMsg(cIdList, pushVO.getTitle(), pushVO.getContent());
+	}
+
 	/**
 	 * 根据用户id从redis中获取cid
+	 *
 	 * @param userId
 	 * @return
 	 */
-	public String getClientIdByUserId(String userId){
-		return bladeRedis.get(PUSH_CLIENT_ID+userId);
+	public String getClientIdByUserId(String userId) {
+
+		if (Func.isEmpty(userId)) {
+			throw new ServiceException("请填写用户id!");
+		}
+
+
+		return bladeRedis.get(PUSH_CLIENT_ID + userId);
 	}
 
 	/**
 	 * 消息推送
+	 *
 	 * @param pushVO
 	 * @return
 	 */
-	public Boolean pushMessage(PushVO pushVO){
+	public Boolean pushMessage(PushVO pushVO) {
 
 		RestTemplate template = new RestTemplate();
 		Map<String, Object> params = new LinkedHashMap<>();
 		//用户cId,可数组,可字符串
-		params.put("push_clientid",pushVO.getCIds());
+		params.put("push_clientid", pushVO.getCIds());
 		//标题
-		params.put("title",pushVO.getTitle());
+		params.put("title", pushVO.getTitle());
 		//内容
-		params.put("content",pushVO.getContent());
+		params.put("content", pushVO.getContent());
 //		UniCloudReturnRes uniCloudReturnRes = template.getForObject(UNI_CLOUD_PUSH_URL,UniCloudReturnRes.class,params);
-		UniCloudReturnRes uniCloudReturnRes = template.postForObject(UNI_CLOUD_PUSH_URL,params,UniCloudReturnRes.class);
-		return uniCloudReturnRes.getErrCode().equals(0)?true:false;
+		UniCloudReturnRes uniCloudReturnRes = template.postForObject(UNI_CLOUD_PUSH_URL, params, UniCloudReturnRes.class);
+		return uniCloudReturnRes.getErrCode().equals(0) ? true : false;
 
 	}
 }
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/utils/GeTuiUtils.java b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/utils/GeTuiUtils.java
new file mode 100644
index 0000000..6bd0ed4
--- /dev/null
+++ b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/push/utils/GeTuiUtils.java
@@ -0,0 +1,268 @@
+package cn.gistack.alerts.push.utils;
+
+import com.alibaba.csp.sentinel.util.IdUtil;
+import com.getui.push.v2.sdk.api.PushApi;
+import com.getui.push.v2.sdk.common.ApiResult;
+import com.getui.push.v2.sdk.dto.req.Audience;
+import com.getui.push.v2.sdk.dto.req.Settings;
+import com.getui.push.v2.sdk.dto.req.Strategy;
+import com.getui.push.v2.sdk.dto.req.message.PushBatchDTO;
+import com.getui.push.v2.sdk.dto.req.message.PushChannel;
+import com.getui.push.v2.sdk.dto.req.message.PushDTO;
+import com.getui.push.v2.sdk.dto.req.message.PushMessage;
+import com.getui.push.v2.sdk.dto.req.message.android.AndroidDTO;
+import com.getui.push.v2.sdk.dto.req.message.android.GTNotification;
+import com.getui.push.v2.sdk.dto.req.message.android.ThirdNotification;
+import com.getui.push.v2.sdk.dto.req.message.android.Ups;
+import com.getui.push.v2.sdk.dto.req.message.ios.Alert;
+import com.getui.push.v2.sdk.dto.req.message.ios.Aps;
+import com.getui.push.v2.sdk.dto.req.message.ios.IosDTO;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+@Slf4j
+@Component
+public class GeTuiUtils {
+
+	@Resource(name = "myPushApi")
+	private PushApi myPushApi;
+
+	/**
+	 * 单点推送(离线不推送)
+	 *
+	 * @param cid     目标
+	 * @param title   标题
+	 * @param content 内容
+	 */
+	public void pushMsg(String cid, String title, String content) {
+		//根据cid进行单推
+		PushDTO<Audience> pushDTO = new PushDTO<>();
+		// 设置推送参数
+		pushDTO.setRequestId(UUID.randomUUID().toString());
+		// 个推推送消息参数
+		PushMessage pushMessage = new PushMessage();
+		pushDTO.setPushMessage(pushMessage);
+		/** 带跳转url*/
+//        GTNotification notification = new GTNotification();
+//        pushMessage.setNotification(notification);
+//        notification.setTitle(title + new Date());
+//        notification.setBody(content);
+//        notification.setClickType("url");
+//        notification.setUrl("https://www.baidu.com");// 跳转地址
+		/** 不带跳转url*/
+		pushMessage.setTransmission(" {title:\"" + title + "\",content:\"" + content + "\",payload:\"自定义数据\"}");
+		pushDTO.setPushMessage(pushMessage);
+		// 设置接收人信息
+		Audience audience = new Audience();
+		pushDTO.setAudience(audience);
+		audience.addCid(cid);
+		// 进行cid单推
+		ApiResult<Map<String, Map<String, String>>> apiResult = myPushApi.pushToSingleByCid(pushDTO);
+		if (apiResult.isSuccess()) {
+			// success
+			System.out.println(apiResult.getData());
+		} else {
+			// failed
+			System.out.println("code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
+		}
+	}
+
+	/**
+	 * 推送给多个
+	 *
+	 * @param cids    目标集
+	 * @param title   标题
+	 * @param content 内容
+	 */
+	public Boolean pushMsg(List<String> cids, String title, String content) {
+		List<PushDTO<Audience>> list = new ArrayList<>(cids.size());
+		cids.forEach(cid -> {
+			PushDTO<Audience> pushDTO = new PushDTO<>();
+			// 唯一标识
+			pushDTO.setRequestId(UUID.randomUUID().toString());
+			// 消息内容
+			PushMessage pushMessage = new PushMessage();
+			pushMessage.setNetworkType(0);
+			// 透传消息内容
+//			pushMessage.setTransmission(" {title:\"" + title + "\",content:\"" + content + "\",payload:\"自定义数据\"}");
+
+			GTNotification gtNotification = new GTNotification();
+			pushMessage.setNotification(gtNotification);
+			gtNotification.setTitle(title);
+			gtNotification.setBody(content);
+			gtNotification.setClickType("none");
+
+
+			pushDTO.setPushMessage(pushMessage);
+			// 消息接受人
+			Audience audience = new Audience();
+			audience.addCid(cid);
+			pushDTO.setAudience(audience);
+			list.add(pushDTO);
+		});
+		PushBatchDTO pushBatchDTO = new PushBatchDTO();
+		pushBatchDTO.setAsync(true);
+		pushBatchDTO.setMsgList(list);
+		ApiResult<Map<String, Map<String, String>>> mapApiResult = myPushApi.pushBatchByCid(pushBatchDTO);
+		if (mapApiResult.isSuccess()) {
+			// success
+			System.out.println(mapApiResult.getData());
+		} else {
+			// failed
+			System.out.println("code:" + mapApiResult.getCode() + ", msg: " + mapApiResult.getMsg());
+		}
+
+		return mapApiResult.isSuccess();
+
+	}
+
+	/**
+	 * 消息推送(离线推送)
+	 *
+	 * @param cid     目标
+	 * @param title   标题
+	 * @param content 内容
+	 */
+	public void offlinePushMsg(String cid, String title, String content) {
+		//根据cid进行单推
+		PushDTO<Audience> pushDTO = new PushDTO<>();
+		// 设置推送参数
+		pushDTO.setRequestId(System.currentTimeMillis() + "");//requestid需要每次变化唯一
+		//配置推送条件
+		// 1: 表示该消息在用户在线时推送个推通道,用户离线时推送厂商通道;
+		// 2: 表示该消息只通过厂商通道策略下发,不考虑用户是否在线;
+		// 3: 表示该消息只通过个推通道下发,不考虑用户是否在线;
+		// 4: 表示该消息优先从厂商通道下发,若消息内容在厂商通道代发失败后会从个推通道下发。
+		Strategy strategy = new Strategy();
+		strategy.setDef(1);
+		Settings settings = new Settings();
+		settings.setStrategy(strategy);
+		pushDTO.setSettings(settings);
+		settings.setTtl(3600000);//消息有效期,走厂商消息需要设置该值
+		//推送苹果离线通知标题内容
+		Alert alert = new Alert();
+		alert.setTitle(title);//苹果离线通知栏标题
+		alert.setBody(content);//苹果离线通知栏内容
+		Aps aps = new Aps();
+		//1表示静默推送(无通知栏消息),静默推送时不需要填写其他参数。
+		//苹果建议1小时最多推送3条静默消息
+		aps.setContentAvailable(0);
+		aps.setSound("default");
+		aps.setAlert(alert);
+		IosDTO iosDTO = new IosDTO();
+		iosDTO.setAps(aps);
+		iosDTO.setType("notify");
+		PushChannel pushChannel = new PushChannel();
+		pushChannel.setIos(iosDTO);
+		//安卓离线厂商通道推送消息体
+		PushChannel pushChannel1 = new PushChannel();
+		AndroidDTO androidDTO = new AndroidDTO();
+		Ups ups = new Ups();
+		ThirdNotification notification1 = new ThirdNotification();
+		ups.setNotification(notification1);
+		notification1.setTitle(title);//安卓离线展示的标题
+		notification1.setBody(content);//安卓离线展示的内容
+		notification1.setClickType("intent");
+		notification1.setIntent("intent:#Intent;launchFlags=0x04000000;action=android.intent.action.oppopush;component=io.dcloud.HBuilder/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=测试标题;S.content=测试内容;S.payload=test;end");
+		//各厂商自有功能单项设置
+		//ups.addOption("HW", "/message/android/notification/badge/class", "io.dcloud.PandoraEntry ");
+		//ups.addOption("HW", "/message/android/notification/badge/add_num", 1);
+		//ups.addOption("HW", "/message/android/notification/importance", "HIGH");
+		//ups.addOption("VV","classification",1);
+		androidDTO.setUps(ups);
+		pushChannel1.setAndroid(androidDTO);
+		pushDTO.setPushChannel(pushChannel1);
+
+		// PushMessage在线走个推通道才会起作用的消息体
+		PushMessage pushMessage = new PushMessage();
+		pushDTO.setPushMessage(pushMessage);
+		pushMessage.setTransmission(" {title:\"" + title + "\",content:\"" + content + "\",payload:\"自定义数据\"}");
+		// 设置接收人信息
+		Audience audience = new Audience();
+		pushDTO.setAudience(audience);
+		audience.addCid(cid);// cid
+		// 进行cid单推
+		ApiResult<Map<String, Map<String, String>>> apiResult = myPushApi.pushToSingleByCid(pushDTO);
+		if (apiResult.isSuccess()) {
+			// success
+			System.out.println(apiResult.getData());
+		} else {
+			// failed
+			System.out.println("code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
+		}
+	}
+
+	/**
+	 * 官方api案例
+	 */
+	public void offlinePushMsg1() {
+		//根据cid进行单推
+		PushDTO<Audience> pushDTO = new PushDTO<Audience>();
+		// 设置推送参数
+		pushDTO.setRequestId(System.currentTimeMillis() + "");
+		/**** 设置个推通道参数 *****/
+		PushMessage pushMessage = new PushMessage();
+		pushDTO.setPushMessage(pushMessage);
+		GTNotification notification = new GTNotification();
+		pushMessage.setNotification(notification);
+		notification.setTitle("个title");
+		notification.setBody("个body");
+		notification.setClickType("url");
+		notification.setUrl("https://www.getui.com");
+		/**** 设置个推通道参数,更多参数请查看文档或对象源码 *****/
+
+		/**** 设置厂商相关参数 ****/
+		PushChannel pushChannel = new PushChannel();
+		pushDTO.setPushChannel(pushChannel);
+		/*配置安卓厂商参数*/
+		AndroidDTO androidDTO = new AndroidDTO();
+		pushChannel.setAndroid(androidDTO);
+		Ups ups = new Ups();
+		androidDTO.setUps(ups);
+		ThirdNotification thirdNotification = new ThirdNotification();
+		ups.setNotification(thirdNotification);
+		thirdNotification.setTitle("厂商title");
+		thirdNotification.setBody("厂商body");
+		thirdNotification.setClickType("url");
+		thirdNotification.setUrl("https://www.getui.com");
+		// 两条消息的notify_id相同,新的消息会覆盖老的消息,取值范围:0-2147483647
+		// thirdNotification.setNotifyId("11177");
+		/*配置安卓厂商参数结束,更多参数请查看文档或对象源码*/
+
+		/*设置ios厂商参数*/
+		IosDTO iosDTO = new IosDTO();
+		pushChannel.setIos(iosDTO);
+		// 相同的collapseId会覆盖之前的消息
+		iosDTO.setApnsCollapseId("xxx");
+		Aps aps = new Aps();
+		iosDTO.setAps(aps);
+		Alert alert = new Alert();
+		aps.setAlert(alert);
+		alert.setTitle("通知消息标题");
+		alert.setBody("通知消息内容");
+		/*设置ios厂商参数结束,更多参数请查看文档或对象源码*/
+
+		/*设置接收人信息*/
+		Audience audience = new Audience();
+		pushDTO.setAudience(audience);
+		audience.addCid("xxx");
+		/*设置接收人信息结束*/
+		/**** 设置厂商相关参数,更多参数请查看文档或对象源码 ****/
+
+		// 进行cid单推
+		ApiResult<Map<String, Map<String, String>>> apiResult = myPushApi.pushToSingleByCid(pushDTO);
+		if (apiResult.isSuccess()) {
+			// success
+			System.out.println(apiResult.getData());
+		} else {
+			// failed
+			System.out.println("code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
+		}
+	}
+}
diff --git a/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/resources/application-dev.yml b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/resources/application-dev.yml
index 815f19d..6641055 100644
--- a/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/resources/application-dev.yml
+++ b/skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/resources/application-dev.yml
@@ -47,3 +47,10 @@
           password: ${blade.datasource.dev.znwh.password}
   main:
     allow-circular-references: true
+getui:
+  appId: "zyUET0RTBHAzLyMhV7dY32"
+  appKey: "wuY8226sbu66P6tF9T0Fj5"
+  appSecret: "IN3UEIeUccAiYgcBTLcK3A"
+  masterSecret: "vlhKpASV66AJEfWnCgFsB2"
+  # Url前缀
+  baseUrl: "https://restapi.getui.com/v2/"

--
Gitblit v1.9.3