package com.yeshi.buwan.util.push;
|
|
import com.google.gson.Gson;
|
import com.google.gson.reflect.TypeToken;
|
import com.yeshi.buwan.domain.push.PushDeviceToken;
|
import com.yeshi.buwan.domain.system.DetailSystem;
|
import com.yeshi.buwan.domain.system.DetailSystemConfig;
|
import com.yeshi.buwan.dto.push.PushAppsDTO;
|
import com.yeshi.buwan.service.imp.DetailSystemConfigService;
|
import com.yeshi.buwan.service.inter.push.PushDeviceTokenService;
|
import org.yeshi.utils.StringUtil;
|
import org.yeshi.utils.push.entity.PushAppInfo;
|
import org.yeshi.utils.push.entity.PushMessage;
|
|
import javax.annotation.Resource;
|
import java.lang.reflect.Type;
|
import java.util.*;
|
|
public class PushManager {
|
|
|
@Resource
|
private DetailSystemConfigService configService;
|
|
@Resource
|
private PushDeviceTokenService pushDeviceTokenService;
|
|
|
private Map<PushDeviceToken.PushPlatform, List<String>> distributeTokens(List<PushDeviceToken> tokenList) {
|
Map<PushDeviceToken.PushPlatform, List<String>> map = new HashMap<>();
|
for (PushDeviceToken token : tokenList) {
|
if (map.get(token.getType()) == null)
|
map.put(token.getType(), new ArrayList<>());
|
map.get(token.getType()).add(token.getToken());
|
}
|
return map;
|
}
|
|
|
private List<PushAppInfo> getPushApps(String detailSystemId, String channelKey) {
|
DetailSystemConfig config = configService.getConfigByKey(channelKey, new DetailSystem(detailSystemId), 1);
|
Type type = new TypeToken<List<PushAppInfo>>() {
|
}.getType();
|
Gson gson = new Gson();
|
if (config != null && !StringUtil.isNullOrEmpty(config.getValue())) {
|
List<PushAppInfo> apps = gson.fromJson(config.getValue(), type);
|
return apps;
|
}
|
return null;
|
}
|
|
/**
|
* 获取推送的APP信息
|
*
|
* @param detailSystemId
|
* @return
|
*/
|
private Map<PushDeviceToken.PushPlatform, List<PushAppInfo>> getPushApps(String detailSystemId) {
|
PushAppsDTO dto = new PushAppsDTO();
|
dto.setXmInfos(getPushApps(detailSystemId, "push_apps_xm"));
|
dto.setHwInfos(getPushApps(detailSystemId, "push_apps_hw"));
|
dto.setOppoInfos(getPushApps(detailSystemId, "push_apps_oppo"));
|
dto.setVivoInfos(getPushApps(detailSystemId, "push_apps_vivo"));
|
dto.setMzInfos(getPushApps(detailSystemId, "push_apps_mz"));
|
Map<PushDeviceToken.PushPlatform, List<PushAppInfo>> appMap = new HashMap<>();
|
if (dto.getHwInfos() != null) {
|
appMap.put(PushDeviceToken.PushPlatform.hw, dto.getHwInfos());
|
}
|
|
if (dto.getXmInfos() != null) {
|
appMap.put(PushDeviceToken.PushPlatform.xm, dto.getXmInfos());
|
}
|
|
if (dto.getOppoInfos() != null) {
|
appMap.put(PushDeviceToken.PushPlatform.oppo, dto.getOppoInfos());
|
}
|
|
if (dto.getVivoInfos() != null) {
|
appMap.put(PushDeviceToken.PushPlatform.vivo, dto.getVivoInfos());
|
}
|
|
if (dto.getMzInfos() != null) {
|
appMap.put(PushDeviceToken.PushPlatform.mz, dto.getMzInfos());
|
}
|
|
|
return appMap;
|
}
|
|
/**
|
* 推送Android通知
|
*
|
* @param pushMessage
|
* @param loginUids 为空表示全推
|
* @param detailSystemId
|
* @param minVersion
|
* @throws Exception
|
*/
|
public void pushAndroidNotifycation(PushMessage pushMessage, List<String> loginUids, String detailSystemId, Integer minVersion) throws Exception {
|
//推送key
|
Map<PushDeviceToken.PushPlatform, List<PushAppInfo>> appsMap = getPushApps(detailSystemId);
|
|
//批量推送
|
if (loginUids != null && loginUids.size() > 0) {
|
//查询tokens
|
List<PushDeviceToken> tokenList = pushDeviceTokenService.listByLoginUids(loginUids);
|
Map<PushDeviceToken.PushPlatform, List<String>> map = distributeTokens(tokenList);
|
for (Iterator<PushDeviceToken.PushPlatform> its = map.keySet().iterator(); its.hasNext(); ) {
|
PushDeviceToken.PushPlatform platform = its.next();
|
if (appsMap.get(platform) != null)
|
//暂时推送第一应用,后续有多个应用需求再处理
|
pushAndroidNotifycation(pushMessage, appsMap.get(platform).get(0), map.get(platform), platform);
|
}
|
} else {
|
//广播
|
Date minTime = new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24L * 30);
|
//推送最近1个月的活跃
|
long count = pushDeviceTokenService.count(detailSystemId, minVersion, minTime);
|
//每次拉取2000个数据
|
int tp = (int) (count % 2000 == 0 ? count / 2000 : count / 2000 + 1);
|
for (int i = 0; i < tp; i++) {
|
List<PushDeviceToken> list = pushDeviceTokenService.list(detailSystemId, minVersion, minTime, i + 1, 2000);
|
Map<PushDeviceToken.PushPlatform, List<String>> map = distributeTokens(list);
|
for (Iterator<PushDeviceToken.PushPlatform> its = map.keySet().iterator(); its.hasNext(); ) {
|
PushDeviceToken.PushPlatform platform = its.next();
|
if (appsMap.get(platform) != null)
|
//暂时推送第一应用,后续有多个应用需求再处理
|
pushAndroidNotifycation(pushMessage, appsMap.get(platform).get(0), map.get(platform), platform);
|
}
|
}
|
}
|
|
}
|
|
|
/**
|
* 推送数据
|
*
|
* @param message
|
* @param appInfo
|
* @param tokens 一次最多500
|
* @param platform
|
* @throws Exception
|
*/
|
private void pushAndroidNotifycation(PushMessage message, PushAppInfo appInfo, List<String> tokens, PushDeviceToken.PushPlatform platform) throws Exception {
|
if (tokens == null || tokens.size() == 0)
|
return;
|
List<String> tempTokens = null;
|
List<String> leftTokens = null;
|
if (tokens.size() > 500) {
|
tempTokens = tokens.subList(0, 500);
|
leftTokens = tokens.subList(500, tokens.size());
|
} else {
|
tempTokens = tokens;
|
}
|
|
|
// if (platform == PushDeviceToken.PushPlatform.xm) {
|
// XiaoMiPushUtil.pushNotificationByRegIds(appInfo, message, tempTokens);
|
// } else if (platform == PushDeviceToken.PushPlatform.hw) {
|
// HuaWeiPushUtil.pushNotificationByTokens(appInfo, message, tempTokens);
|
// } else if (platform == PushDeviceToken.PushPlatform.oppo) {
|
// OppoPushUtil.pushNotificationAll(appInfo, message, tempTokens);
|
// } else if (platform == PushDeviceToken.PushPlatform.vivo) {
|
// VIVOPushUtil.pushNotificationByRegIds(appInfo, message, tempTokens);
|
// } else if (platform == PushDeviceToken.PushPlatform.mz) {
|
// MeiZuPushUtil.pushNotificationByPushId(appInfo, message, tempTokens);
|
// }
|
|
if (leftTokens != null && leftTokens.size() > 0) {
|
pushAndroidNotifycation(message, appInfo, leftTokens, platform);
|
}
|
|
}
|
|
|
}
|