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> distributeTokens(List tokenList) { Map> 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 getPushApps(String detailSystemId, String channelKey) { DetailSystemConfig config = configService.getConfigByKey(channelKey, new DetailSystem(detailSystemId), 1); Type type = new TypeToken>() { }.getType(); Gson gson = new Gson(); if (config != null && !StringUtil.isNullOrEmpty(config.getValue())) { List apps = gson.fromJson(config.getValue(), type); return apps; } return null; } /** * 获取推送的APP信息 * * @param detailSystemId * @return */ private Map> 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> 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 loginUids, String detailSystemId, Integer minVersion) throws Exception { //推送key Map> appsMap = getPushApps(detailSystemId); //批量推送 if (loginUids != null && loginUids.size() > 0) { //查询tokens List tokenList = pushDeviceTokenService.listByLoginUids(loginUids); Map> map = distributeTokens(tokenList); for (Iterator 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 list = pushDeviceTokenService.list(detailSystemId, minVersion, minTime, i + 1, 2000); Map> map = distributeTokens(list); for (Iterator 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 tokens, PushDeviceToken.PushPlatform platform) throws Exception { if (tokens == null || tokens.size() == 0) return; List tempTokens = null; List 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); } } }