package com.yeshi.fanli.service.impl.push;
|
|
import com.yeshi.fanli.dto.push.PushBaseContent;
|
import com.yeshi.fanli.dto.push.PushContentDetailDTO;
|
import com.yeshi.fanli.dto.push.PushTypeEnum;
|
import com.yeshi.fanli.entity.AppVersionInfo;
|
import com.yeshi.fanli.entity.SystemEnum;
|
import com.yeshi.fanli.entity.bus.user.UserCustomSettings;
|
import com.yeshi.fanli.entity.bus.user.UserCustomSettings.UserSettingTypeEnum;
|
import com.yeshi.fanli.entity.config.SystemConfigKeyEnum;
|
import com.yeshi.fanli.entity.push.DeviceTokenHW;
|
import com.yeshi.fanli.exception.push.PushException;
|
import com.yeshi.fanli.log.LogHelper;
|
import com.yeshi.fanli.log.LogManager;
|
import com.yeshi.fanli.log.PushLogHelper;
|
import com.yeshi.fanli.service.inter.config.AppVersionService;
|
import com.yeshi.fanli.service.inter.config.SystemConfigService;
|
import com.yeshi.fanli.service.inter.push.DeviceTokenHWService;
|
import com.yeshi.fanli.service.inter.push.HWPushService;
|
import com.yeshi.fanli.service.inter.user.UserCustomSettingsService;
|
import com.yeshi.fanli.util.Constant;
|
import com.yeshi.fanli.util.StringUtil;
|
import com.yeshi.fanli.util.mq.cmq.PushCMQManager;
|
import com.yeshi.fanli.util.mq.rabbit.RabbitmqManager;
|
import com.yeshi.fanli.util.push.HWPushUtil;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.util.*;
|
|
@Service
|
public class HWPushServiceImpl implements HWPushService {
|
|
@Resource
|
private DeviceTokenHWService deviceTokenHWService;
|
|
@Resource
|
private AppVersionService appVersionService;
|
|
@Resource
|
private UserCustomSettingsService userCustomSettingsService;
|
|
@Resource
|
private SystemConfigService systemConfigService;
|
|
@Resource
|
private PushCMQManager pushCMQManager;
|
|
private List<Integer> getVersionCodeList(List<Integer> versionCodeList,SystemEnum system) {
|
List<Integer> versionList = new ArrayList<>();
|
if (versionCodeList == null) {// 全推
|
List<AppVersionInfo> appInfoList = appVersionService.listByPlatformAndMinVersionCode("android", 46, system);
|
if (appInfoList != null)
|
for (AppVersionInfo version : appInfoList) {
|
versionList.add(version.getVersionCode());
|
}
|
|
} else {// 按版本推送
|
for (Integer versionCode : versionCodeList) {
|
if (versionCode.intValue() >= 46) {
|
versionList.add(versionCode);
|
}
|
}
|
}
|
return versionList;
|
}
|
|
@Override
|
public void pushGoods(Long uid, String auctionId, PushBaseContent baseContent)
|
throws PushException {
|
addPushQueue(PushTypeEnum.goodsdetail, uid, null, null, auctionId, baseContent);
|
}
|
|
@Override
|
public void pushUrl(Long uid, String url, PushBaseContent baseContent)
|
throws PushException {
|
addPushQueue(PushTypeEnum.url, uid, null, url, null, baseContent);
|
}
|
|
@Override
|
public void pushZNX(Long uid, PushBaseContent baseContent) throws PushException {
|
addPushQueue(PushTypeEnum.ZNX, uid, null, null, null, baseContent);
|
}
|
|
@Override
|
public void pushWEEX(Long uid, String weexUrl, PushBaseContent baseContent)
|
throws PushException {
|
addPushQueue(PushTypeEnum.weex, uid, weexUrl, null, null, baseContent);
|
}
|
|
@Override
|
public void pushBaiChuanUrl(Long uid, String url, PushBaseContent baseContent)
|
throws PushException {
|
|
addPushQueue(PushTypeEnum.baichuan, uid, null, url, null, baseContent);
|
}
|
|
@Override
|
public void pushWelfareCenter(Long uid, PushBaseContent baseContent)
|
throws PushException {
|
addPushQueue(PushTypeEnum.welfare, uid, null, null, null, baseContent);
|
}
|
|
@Override
|
public void pushUserSignInNotification(Long uid, PushBaseContent baseContent)
|
throws PushException {
|
addPushQueue(PushTypeEnum.signin, uid, null, null, null, baseContent);
|
}
|
|
private List<DeviceTokenHW> filterDeviceToken(List<DeviceTokenHW> hwDeviceList, int hour) {
|
// TODO 暂时不处理消息免打扰
|
if (1 > 0)
|
return hwDeviceList;
|
// 处理消息免打扰
|
if (hour >= 20 || hour < 8) {
|
Set<Long> uidSets = new HashSet<>();
|
for (DeviceTokenHW dt : hwDeviceList)
|
if (dt.getUser() != null)
|
uidSets.add(dt.getUser().getId());
|
List<Long> uidList = new ArrayList<>();
|
uidList.addAll(uidSets);
|
List<UserCustomSettings> settingList = userCustomSettingsService.listByUidListAndTypeAndState(uidList,
|
UserSettingTypeEnum.cancelNotice.name(), UserCustomSettings.STATE_VALID);
|
uidSets.clear();
|
if (settingList != null) {
|
for (UserCustomSettings seeting : settingList)
|
uidSets.add(seeting.getUserInfo().getId());
|
}
|
if (uidSets.size() > 0)
|
for (int i = 0; i < hwDeviceList.size(); i++) {
|
if (hwDeviceList.get(i).getUser() != null
|
&& uidSets.contains(hwDeviceList.get(i).getUser().getId())) {
|
hwDeviceList.remove(i--);
|
}
|
}
|
}
|
return hwDeviceList;
|
}
|
|
//添加到推送队列
|
private void addPushQueue(PushTypeEnum type, Long uid, String url, String webUrl,
|
String goodsId, PushBaseContent content) {
|
//添加到推送队列
|
PushContentDetailDTO dto = new PushContentDetailDTO(type, uid, url, webUrl, goodsId, content);
|
pushCMQManager.addHWPush(dto);
|
}
|
|
/**
|
* @param dto
|
* @throws PushException
|
*/
|
public void push(PushContentDetailDTO dto) throws PushException {
|
LogHelper.pushHW("开始推送");
|
int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
|
List<Integer> newVersionList = getVersionCodeList(dto.getContent().getVersionCodeList(), dto.getContent().getSystem());
|
// 1.6.5后开始推送
|
for (int i = 0; i < newVersionList.size(); i++) {
|
if (newVersionList.get(i) < 47)
|
newVersionList.remove(i--);
|
}
|
|
if (dto.getUid() == null || dto.getUid() == 0) {
|
LogHelper.pushHW("全推");
|
//只推送近30天的活跃
|
Date minUpdateTime = new Date(System.currentTimeMillis() - Constant.PUSH_MIN_TIME);
|
long deviceCount = deviceTokenHWService.countDeviceToken(newVersionList, minUpdateTime);
|
int page = (int) (deviceCount % 100 == 0 ? deviceCount / 100 : deviceCount / 100 + 1);
|
for (int p = 1; p <= page; p++) {
|
List<DeviceTokenHW> hwDeviceList = deviceTokenHWService.getDeviceTokenList(p, 100, newVersionList, minUpdateTime);
|
hwDeviceList = filterDeviceToken(hwDeviceList, hour);
|
LogHelper.pushHW(String.format("全推:设备数%s", hwDeviceList.size()));
|
List<String> tokenList = new ArrayList<>();
|
for (DeviceTokenHW token : hwDeviceList)
|
tokenList.add(token.getDeviceToken());
|
try {
|
if (dto.getType() == PushTypeEnum.goodsdetail) {// 商品详情
|
if (dto.getGoodsId() == null)
|
throw new PushException(2, "参数不完整");
|
HWPushUtil.pushGoods(tokenList, dto.getContent().getTitle(), dto.getContent().getContent(), 1, dto.getGoodsId(),getAndroidBaseActivity( dto.getContent().getSystem()));
|
} else if (dto.getType() == PushTypeEnum.url) {// 链接
|
if (StringUtil.isNullOrEmpty(dto.getWebUrl()))
|
throw new PushException(2, "参数不完整");
|
HWPushUtil.pushUrl(tokenList, dto.getContent().getTitle(), dto.getContent().getContent(), dto.getWebUrl(),getAndroidBaseActivity(dto.getContent().getSystem()));
|
} else if (dto.getType() == PushTypeEnum.ZNX) {// 站内信
|
HWPushUtil.pushZNX(tokenList, dto.getContent().getTitle(), dto.getContent().getContent());
|
} else if (dto.getType() == PushTypeEnum.weex) {// weex
|
if (StringUtil.isNullOrEmpty(dto.getUrl()))
|
throw new PushException(2, "参数不完整");
|
HWPushUtil.pushWEEX(tokenList, dto.getContent().getTitle(), dto.getContent().getContent(), dto.getUrl(),getAndroidBaseActivity(dto.getContent().getSystem()));
|
} else if (dto.getType() == PushTypeEnum.baichuan) {// 百川链接
|
if (StringUtil.isNullOrEmpty(dto.getWebUrl()))
|
throw new PushException(2, "参数不完整");
|
HWPushUtil.pushBaiChuanUrl(tokenList, dto.getContent().getTitle(), dto.getContent().getContent(), dto.getWebUrl());
|
} else if (dto.getType() == PushTypeEnum.welfare) {// 福利中心
|
HWPushUtil.pushWelfareCenter(tokenList, dto.getContent().getTitle(), dto.getContent().getContent(),getAndroidBaseActivity(dto.getContent().getSystem()));
|
} else if (dto.getType() == PushTypeEnum.signin) {// 签到
|
HWPushUtil.pushUserSignInNotification(tokenList, dto.getContent().getTitle(), dto.getContent().getContent(),getAndroidBaseActivity(dto.getContent().getSystem()));
|
}
|
} catch (Exception e) {
|
PushLogHelper.hwError(e);
|
}
|
|
}
|
} else {
|
LogHelper.pushHW("单推");
|
// 华为单推
|
List<DeviceTokenHW> hwDeviceList = deviceTokenHWService.getDeviceTokenByUid(dto.getUid(), newVersionList);
|
List<String> tokenList = new ArrayList<>();
|
if (hwDeviceList != null) {
|
hwDeviceList = filterDeviceToken(hwDeviceList, hour);
|
for (DeviceTokenHW token : hwDeviceList)
|
tokenList.add(token.getDeviceToken());
|
}
|
|
LogHelper.pushHW(String.format("单推:设备数%s 用户:%s", hwDeviceList.size(), dto.getUid() + ""));
|
|
if (tokenList.size() == 0)
|
return;
|
|
try {
|
if (dto.getType() == PushTypeEnum.goodsdetail) {// 商品详情
|
if (dto.getGoodsId() == null)
|
throw new PushException(2, "参数不完整");
|
HWPushUtil.pushGoods(tokenList, dto.getContent().getTitle(), dto.getContent().getContent(), 1, dto.getGoodsId(),getAndroidBaseActivity(dto.getContent().getSystem()));
|
} else if (dto.getType() == PushTypeEnum.url) {// 链接
|
if (StringUtil.isNullOrEmpty(dto.getWebUrl()))
|
throw new PushException(2, "参数不完整");
|
HWPushUtil.pushUrl(tokenList, dto.getContent().getTitle(), dto.getContent().getContent(), dto.getWebUrl(),getAndroidBaseActivity(dto.getContent().getSystem()));
|
} else if (dto.getType() == PushTypeEnum.ZNX) {// 站内信
|
HWPushUtil.pushZNX(tokenList, dto.getContent().getTitle(), dto.getContent().getContent());
|
} else if (dto.getType() == PushTypeEnum.weex) {// weex
|
if (StringUtil.isNullOrEmpty(dto.getUrl()))
|
throw new PushException(2, "参数不完整");
|
HWPushUtil.pushWEEX(tokenList, dto.getContent().getTitle(), dto.getContent().getContent(), dto.getUrl(),getAndroidBaseActivity(dto.getContent().getSystem()));
|
} else if (dto.getType() == PushTypeEnum.baichuan) {// 百川链接
|
if (StringUtil.isNullOrEmpty(dto.getWebUrl()))
|
throw new PushException(2, "参数不完整");
|
HWPushUtil.pushBaiChuanUrl(tokenList, dto.getContent().getTitle(), dto.getContent().getContent(), dto.getWebUrl());
|
} else if (dto.getType() == PushTypeEnum.welfare) {// 福利中心
|
HWPushUtil.pushWelfareCenter(tokenList, dto.getContent().getTitle(), dto.getContent().getContent(),getAndroidBaseActivity(dto.getContent().getSystem()));
|
} else if (dto.getType() == PushTypeEnum.signin) {// 签到
|
HWPushUtil.pushUserSignInNotification(tokenList, dto.getContent().getTitle(), dto.getContent().getContent(),getAndroidBaseActivity(dto.getContent().getSystem()));
|
}
|
} catch (Exception e) {
|
PushLogHelper.hwError(e);
|
}
|
|
}
|
}
|
|
private String getAndroidBaseActivity(SystemEnum system) {
|
|
return systemConfigService.getValueCache(SystemConfigKeyEnum.androidBaseActivityName, system);
|
|
}
|
}
|