| | |
| | | package com.yeshi.fanli.service.impl.push;
|
| | |
|
| | | import java.util.ArrayList;
|
| | | import java.util.Arrays;
|
| | | import java.util.Calendar;
|
| | | import java.util.Date;
|
| | | import java.util.List;
|
| | |
|
| | | import javax.annotation.Resource;
|
| | |
|
| | | import org.springframework.scheduling.annotation.Async;
|
| | | import org.springframework.stereotype.Service;
|
| | | import org.springframework.transaction.annotation.Transactional;
|
| | |
|
| | | import com.yeshi.fanli.dao.mybatis.push.DeviceTokenIOSMapper;
|
| | | import com.yeshi.fanli.dao.mybatis.push.PushQueueRecordMapper;
|
| | | import com.yeshi.fanli.dto.push.PushTypeEnum;
|
| | | import com.yeshi.fanli.entity.bus.user.AccountMessage;
|
| | | import com.yeshi.fanli.entity.push.DeviceTokenIOS;
|
| | | import com.yeshi.fanli.entity.push.PushQueueRecord;
|
| | | import com.yeshi.fanli.entity.system.SystemZnx;
|
| | | import com.yeshi.fanli.entity.xinge.MessageInfo;
|
| | | import com.yeshi.fanli.entity.xinge.PushRecord;
|
| | | import com.yeshi.fanli.exception.push.PushException;
|
| | | import com.yeshi.fanli.log.PushLogHelper;
|
| | | import com.yeshi.fanli.service.inter.push.IOSPushService;
|
| | | import com.yeshi.fanli.service.inter.user.UserCustomSettingsService;
|
| | | import com.yeshi.fanli.util.CMQManager;
|
| | | import com.yeshi.fanli.util.Constant;
|
| | | import com.yeshi.fanli.util.StringUtil;
|
| | | import com.yeshi.fanli.util.push.IOSPushUtil;
|
| | |
|
| | | import net.sf.json.JSONObject;
|
| | |
|
| | | @Service
|
| | | public class IOSPushServiceImpl implements IOSPushService {
|
| | |
|
| | | @Resource
|
| | | private DeviceTokenIOSMapper deviceTokenIOSMapper;
|
| | |
|
| | | @Resource
|
| | | private PushQueueRecordMapper pushQueueRecordMapper;
|
| | |
|
| | | @Resource
|
| | | private UserCustomSettingsService userCustomSettingsService;
|
| | |
|
| | | @Async("pushExecutor")
|
| | | @Override
|
| | | public void pushGoods(Long uid, Long auctionId, String title, String content, String versionCodes)
|
| | | throws PushException {
|
| | |
|
| | | String url = "https://item.taobao.com/item.htm?id=" + auctionId;
|
| | | JSONObject json = new JSONObject();
|
| | | json.put("id", auctionId);
|
| | | json.put("type", "goodsdetail");
|
| | | json.put("miPushUrl", String.format("%s.ui.recommend.GoodsBrowserActivity",
|
| | | Constant.systemCommonConfig.getAndroidBaseactivityName()));
|
| | |
|
| | | MessageInfo info = new MessageInfo();
|
| | | info.setTitle(title);
|
| | | info.setContent(content);
|
| | | info.setDescription(content);
|
| | | info.setPackageName(Constant.systemCommonConfig.getAndroidPackageName());
|
| | | info.setActivty(String.format("%s.ui.recommend.GoodsBrowserActivity",
|
| | | Constant.systemCommonConfig.getAndroidBaseactivityName()));
|
| | |
|
| | | PushRecord pushRecord = new PushRecord();
|
| | | pushRecord.setState(1);
|
| | | pushRecord.setType(PushTypeEnum.goodsdetail.getCode()); // 都成功
|
| | | pushRecord.setUrl(url);
|
| | | pushRecord.setTitle(title);
|
| | | pushRecord.setAppName(Constant.systemCommonConfig.getProjectChineseName());
|
| | |
|
| | | if (uid == null || uid == 0) {
|
| | |
|
| | | addPushIOSQueue(info, url, PushTypeEnum.goodsdetail.getCode(), versionCodes);
|
| | |
|
| | | /*
|
| | | * // 查询IOS所有设备号 // TODO 需要全推 List<String> deviceTokenList =
|
| | | * getDeviceTokenList(1, 20000); // IOS 全推 ThreadUtil.run(new
|
| | | * Runnable() {
|
| | | * |
| | | * @Override public void run() { try {
|
| | | * IOSPushUtil.allPushIOS(deviceTokenList, info, url,
|
| | | * PushController.GOODS); } catch (Exception e) {
|
| | | * PushLogHelper.iosError(e);
|
| | | * |
| | | * } } });
|
| | | */
|
| | | } else {
|
| | | if (!validateNotDisturbSingle(uid)) {
|
| | | return; // 通知免打扰(20:00-24:00 / 00:00 -08:00)
|
| | | }
|
| | |
|
| | | // IOS 单推
|
| | | List<DeviceTokenIOS> deviceTokenIosList = getDeviceTokenListByUid(uid, versionCodes);
|
| | |
|
| | | List<String> deviceTokenList = new ArrayList<>();
|
| | | if (deviceTokenIosList != null)
|
| | | for (DeviceTokenIOS ios : deviceTokenIosList) {
|
| | | deviceTokenList.add(ios.getDeviceToken());
|
| | | }
|
| | |
|
| | | try {
|
| | | IOSPushUtil.allPushIOS(deviceTokenList, info, url, PushTypeEnum.goodsdetail.getCode());
|
| | | } catch (Exception e) {
|
| | | PushLogHelper.iosError(e);
|
| | | }
|
| | |
|
| | | }
|
| | | }
|
| | |
|
| | | @Async("pushExecutor")
|
| | | @Override
|
| | | public void pushUrl(Long uid, String url, String title, String content, String versionCodes) throws PushException {
|
| | | JSONObject json = new JSONObject();
|
| | | json.put("url", url);
|
| | | json.put("type", "url");
|
| | | json.put("webUrl", url);
|
| | | json.put("miPushUrl",
|
| | | String.format("%s.ui.BrowserActivity", Constant.systemCommonConfig.getAndroidBaseactivityName()));
|
| | |
|
| | | MessageInfo info = new MessageInfo();
|
| | | info.setTitle(title);
|
| | | info.setContent(content);
|
| | | info.setDescription(content);
|
| | | // 小米推送网页
|
| | | info.setPackageName(Constant.systemCommonConfig.getAndroidPackageName());
|
| | | info.setActivty(
|
| | | String.format("%s.ui.BrowserActivity", Constant.systemCommonConfig.getAndroidBaseactivityName()));
|
| | |
|
| | | PushRecord pushRecord = new PushRecord();
|
| | | // IOS 全推
|
| | | if (uid == null || uid == 0) {
|
| | | // TODO 需要全推
|
| | |
|
| | | addPushIOSQueue(info, url, PushTypeEnum.url.getCode(), versionCodes);
|
| | |
|
| | | /*
|
| | | * List<String> deviceTokenList = getDeviceTokenList(1, 1000);
|
| | | * ThreadUtil.run(new Runnable() {
|
| | | * |
| | | * @Override public void run() { try {
|
| | | * |
| | | * IOSPushUtil.allPushIOS(deviceTokenList, info, url,
|
| | | * PushController.URL);
|
| | | * |
| | | * } catch (Exception e) { PushLogHelper.iosError(e); } } });
|
| | | */
|
| | | } else {
|
| | | if (!validateNotDisturbSingle(uid)) {
|
| | | return; // 通知免打扰(20:00-24:00 / 00:00 -08:00)
|
| | | }
|
| | |
|
| | | List<DeviceTokenIOS> deviceTokenIosList = getDeviceTokenListByUid(uid, versionCodes);
|
| | | List<String> deviceTokenList = new ArrayList<>();
|
| | | if (deviceTokenIosList != null)
|
| | | for (DeviceTokenIOS ios : deviceTokenIosList) {
|
| | | deviceTokenList.add(ios.getDeviceToken());
|
| | | }
|
| | | try {
|
| | | IOSPushUtil.allPushIOS(deviceTokenList, info, url, PushTypeEnum.url.getCode());
|
| | | } catch (Exception e) {
|
| | | PushLogHelper.iosError(e);
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | @Async("pushExecutor")
|
| | | @Override
|
| | | public void pushZNX(Long uId, AccountMessage msg, SystemZnx systemZNX, String versionCodes) throws PushException {
|
| | | MessageInfo info = new MessageInfo();
|
| | | info.setPackageName(Constant.systemCommonConfig.getAndroidPackageName());
|
| | |
|
| | | JSONObject contentJson = new JSONObject();
|
| | | contentJson.put("isOpen", 0);
|
| | | contentJson.put("createTime", java.lang.System.currentTimeMillis());
|
| | |
|
| | | /* 无uid , 广播 数据插入系统表 */
|
| | | if (systemZNX != null) {
|
| | | info.setTitle(systemZNX.getTitle());
|
| | | info.setContent(systemZNX.getContent());
|
| | | contentJson.put("title", systemZNX.getTitle());
|
| | | contentJson.put("content", systemZNX.getContent());
|
| | | info.setDescription(systemZNX.getContent());
|
| | |
|
| | | // 小米开始全推
|
| | | long id = systemZNX.getId();
|
| | | contentJson.put("id", id);
|
| | |
|
| | | JSONObject json = new JSONObject();
|
| | | json.put("type", "ZNX");
|
| | | json.put("content", contentJson);
|
| | | json.put("miPushUrl", String.format("%s.ui.mine.AppMailDetailActivity",
|
| | | Constant.systemCommonConfig.getAndroidBaseactivityName()));
|
| | |
|
| | | PushRecord pushRecord = new PushRecord();
|
| | |
|
| | | // TODO 需要全推
|
| | |
|
| | | addPushIOSQueue(info, id + "", PushTypeEnum.ZNX.getCode(), versionCodes);
|
| | |
|
| | | /*
|
| | | * List<String> deviceTokenList = getDeviceTokenList(1, 1000);
|
| | | * |
| | | * ThreadUtil.run(new Runnable() {
|
| | | * |
| | | * @Override public void run() { try {
|
| | | * IOSPushUtil.allPushIOS(deviceTokenList, info, id + "",
|
| | | * PushController.ZNX); } catch (Exception e) {
|
| | | * PushLogHelper.iosError(e); }
|
| | | * |
| | | * } });
|
| | | */
|
| | | } else if (msg != null) {
|
| | |
|
| | | if (uId != null) {
|
| | | if (!validateNotDisturbSingle(uId)) {
|
| | | return; // 通知免打扰(20:00-24:00 / 00:00 -08:00)
|
| | | }
|
| | | }
|
| | |
|
| | | // 插入推送记录
|
| | | PushRecord pushRecord = new PushRecord();
|
| | | info.setTitle(msg.getTitle());
|
| | | info.setContent(msg.getContent());
|
| | | contentJson.put("title", msg.getTitle());
|
| | | contentJson.put("content", msg.getContent());
|
| | | info.setDescription(msg.getContent());
|
| | |
|
| | | info.setAlias(uId + "");
|
| | | info.setPackageName(Constant.systemCommonConfig.getAndroidPackageName());
|
| | | info.setActivty(
|
| | | String.format("%s.ui.BrowserActivity", Constant.systemCommonConfig.getAndroidBaseactivityName()));
|
| | |
|
| | | contentJson.put("id", msg.getId() + "");
|
| | |
|
| | | JSONObject json = new JSONObject();
|
| | | json.put("type", "ZNX");
|
| | | json.put("content", contentJson);
|
| | | json.put("miPushUrl", String.format("%s.ui.mine.AppMailDetailActivity",
|
| | | Constant.systemCommonConfig.getAndroidBaseactivityName()));
|
| | |
|
| | | List<DeviceTokenIOS> deviceTokenIosList = getDeviceTokenListByUid(msg.getUserInfo().getId(), versionCodes);
|
| | | List<String> deviceTokenList = new ArrayList<>();
|
| | | if (deviceTokenIosList != null)
|
| | | for (DeviceTokenIOS ios : deviceTokenIosList) {
|
| | | deviceTokenList.add(ios.getDeviceToken());
|
| | | }
|
| | |
|
| | | // IOS 单推
|
| | | try {
|
| | | IOSPushUtil.allPushIOS(deviceTokenList, info, "0", PushTypeEnum.ZNX.getCode());
|
| | | } catch (Exception e) {
|
| | | PushLogHelper.iosError(e);
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | @Transactional
|
| | | @Override
|
| | | public void addDeviceToken(Long uid, int version, String deviceToken, String device) {
|
| | | // 如果device为空就返回
|
| | | if (StringUtil.isNullOrEmpty(device) || StringUtil.isNullOrEmpty(deviceToken))
|
| | | return;
|
| | |
|
| | | // 判断device是否存在
|
| | | DeviceTokenIOS deviceTokenIos = deviceTokenIOSMapper.selectByDeviceForUpdate(device);
|
| | | if (deviceTokenIos == null) {
|
| | | deviceTokenIos = new DeviceTokenIOS();
|
| | | deviceTokenIos.setCreateTime(new Date());
|
| | | deviceTokenIos.setUpdateTime(new Date());
|
| | | deviceTokenIos.setDevice(device);
|
| | | deviceTokenIos.setDeviceToken(deviceToken);
|
| | | deviceTokenIos.setDeviceTokenMd5(StringUtil.Md5(deviceToken));
|
| | | deviceTokenIos.setUid(uid);
|
| | | deviceTokenIos.setVersion(version);
|
| | | deviceTokenIOSMapper.insertSelective(deviceTokenIos);
|
| | | } else {// 更新devicetoken
|
| | | DeviceTokenIOS updateDeviceTokenIOS = new DeviceTokenIOS();
|
| | | updateDeviceTokenIOS.setId(deviceTokenIos.getId());
|
| | | updateDeviceTokenIOS.setDeviceToken(deviceToken);
|
| | | updateDeviceTokenIOS.setDeviceTokenMd5(StringUtil.Md5(deviceToken));
|
| | | updateDeviceTokenIOS.setUid(uid);
|
| | | updateDeviceTokenIOS.setUpdateTime(new Date());
|
| | | deviceTokenIOSMapper.updateByPrimaryKeySelective(updateDeviceTokenIOS);
|
| | | }
|
| | |
|
| | | }
|
| | |
|
| | | @Override
|
| | | public List<DeviceTokenIOS> getDeviceTokenListByUid(Long uid, String versionCodes) throws PushException {
|
| | | return deviceTokenIOSMapper.selectByUid(uid, convertVersionType(versionCodes));
|
| | | }
|
| | |
|
| | | @Override
|
| | | public List<String> getDeviceTokenList(int page, int size) {
|
| | | List<DeviceTokenIOS> list = deviceTokenIOSMapper.selectList((long) ((page - 1) * size), size, null);
|
| | | List<String> tokenList = new ArrayList<>();
|
| | | for (DeviceTokenIOS ios : list)
|
| | | if (!StringUtil.isNullOrEmpty(ios.getDeviceToken()))
|
| | | tokenList.add(ios.getDeviceToken());
|
| | | return tokenList;
|
| | | }
|
| | |
|
| | | @Override
|
| | | public long getDeviceTokenCount() {
|
| | | return deviceTokenIOSMapper.selectCount();
|
| | | }
|
| | |
|
| | | @Override
|
| | | public void updateDeviceToken(DeviceTokenIOS deviceTokenIos) {
|
| | | if (deviceTokenIos != null) {
|
| | | deviceTokenIos.setUpdateTime(new Date());
|
| | | deviceTokenIOSMapper.updateByPrimaryKey(deviceTokenIos);
|
| | | }
|
| | | }
|
| | |
|
| | | @Override
|
| | | public DeviceTokenIOS getDeviceTokenByDeviceToken(String deviceToken) {
|
| | | return deviceTokenIOSMapper.selectByDeviceToken(deviceToken);
|
| | | }
|
| | |
|
| | | /**
|
| | | * 保存推送内容只队列中
|
| | | * |
| | | * @param json
|
| | | */
|
| | | @Transactional
|
| | | public void addPushIOSQueue(MessageInfo info, String url, int type, String versionCodes) throws PushException {
|
| | |
|
| | | if (Constant.IS_TEST)
|
| | | return;
|
| | |
|
| | | try {
|
| | |
|
| | | JSONObject json = IOSPushUtil.getJSONObject(info, url, type);
|
| | |
|
| | | // 总条目
|
| | | long tokenCount = getDeviceTokenCount();
|
| | |
|
| | | // 一个队列 1000 条
|
| | | long totalCount = 1000;
|
| | |
|
| | | // 每次执行条目
|
| | | int pushNum = 50;
|
| | |
|
| | | for (long i = 0; i < tokenCount + totalCount;) {
|
| | |
|
| | | PushQueueRecord pushQueueRecord = new PushQueueRecord();
|
| | | // 初始状态
|
| | | pushQueueRecord.setState(0);
|
| | | // 发送内容
|
| | | pushQueueRecord.setJsonContent(json.toString());
|
| | | // 创建时间
|
| | | pushQueueRecord.setCreatetime(new Date());
|
| | | // 每次推送数量
|
| | | pushQueueRecord.setPushNum(pushNum);
|
| | | // 推送端 IOS
|
| | | pushQueueRecord.setType(1);
|
| | | // 版本号
|
| | | pushQueueRecord.setVersions(versionCodes);
|
| | |
|
| | | if (tokenCount - i < totalCount) {
|
| | | // 起始游标
|
| | | pushQueueRecord.setStartCursor(i);
|
| | | // 结束游标
|
| | | pushQueueRecord.setEndCursor(tokenCount);
|
| | |
|
| | | // 存入数据库
|
| | | pushQueueRecordMapper.insert(pushQueueRecord);
|
| | |
|
| | | // 加入队列
|
| | | CMQManager.getInstance().addIOSPushMsg(pushQueueRecord);
|
| | |
|
| | | break;
|
| | |
|
| | | } else {
|
| | |
|
| | | // 起始游标
|
| | | pushQueueRecord.setStartCursor(i);
|
| | |
|
| | | long endCursor = (i + totalCount) - 1;
|
| | |
|
| | | // 结束游标
|
| | | pushQueueRecord.setEndCursor(endCursor);
|
| | |
|
| | | // 存入数据库
|
| | | pushQueueRecordMapper.insert(pushQueueRecord);
|
| | | // 加入队列
|
| | | CMQManager.getInstance().addIOSPushMsg(pushQueueRecord);
|
| | | }
|
| | |
|
| | | i += totalCount;
|
| | | }
|
| | |
|
| | | } catch (Exception e) {
|
| | | e.printStackTrace();
|
| | | }
|
| | |
|
| | | }
|
| | |
|
| | | /**
|
| | | * 队列执行推送操作
|
| | | */
|
| | | @Override
|
| | | public void readyPushIOS(PushQueueRecord pushQueueRecord) throws Exception {
|
| | |
|
| | | // 起始位置
|
| | | Long startCursor = pushQueueRecord.getStartCursor();
|
| | | // 结束位置
|
| | | Long endCursor = pushQueueRecord.getEndCursor();
|
| | |
|
| | | if (startCursor == null && endCursor == null) {
|
| | | return;
|
| | | }
|
| | |
|
| | | // 推送的版本号
|
| | | String versions = pushQueueRecord.getVersions();
|
| | | List<Integer> listCode = convertVersionType(versions);
|
| | |
|
| | | int total = (int) (endCursor - startCursor);
|
| | |
|
| | | // 每次推送总条数
|
| | | int moveNum = pushQueueRecord.getPushNum();
|
| | |
|
| | | int count = total / moveNum;
|
| | |
|
| | | if (total % moveNum > 0) {
|
| | | count += 1;
|
| | | }
|
| | |
|
| | | long recordCursor = startCursor;
|
| | |
|
| | | for (int i = 0; i < count; i++) {
|
| | |
|
| | | // 不足50个数据
|
| | | if (moveNum > total) {
|
| | | moveNum = (int) (endCursor - startCursor);
|
| | | List<DeviceTokenIOS> list = deviceTokenIOSMapper.selectList(startCursor, moveNum, listCode);
|
| | | recordCursor = endCursor;
|
| | |
|
| | | if (list != null) {
|
| | | executePushIOS(list, pushQueueRecord, recordCursor);
|
| | | PushLogHelper.iosInfo("推送游标:" + startCursor + "," + moveNum);
|
| | | }
|
| | |
|
| | | } else {
|
| | |
|
| | | if (recordCursor + moveNum > endCursor) {
|
| | | // System.out.println("recordCursorend:" +recordCursor);
|
| | | moveNum = (int) (endCursor - recordCursor);
|
| | | // System.out.println(moveNum);
|
| | | List<DeviceTokenIOS> list = deviceTokenIOSMapper.selectList(recordCursor, moveNum, listCode);
|
| | | if (list != null) {
|
| | | executePushIOS(list, pushQueueRecord, endCursor);
|
| | | PushLogHelper.iosInfo("推送游标:" + recordCursor + "," + moveNum);
|
| | | }
|
| | | recordCursor = endCursor;
|
| | |
|
| | | } else {
|
| | | List<DeviceTokenIOS> list = deviceTokenIOSMapper.selectList(recordCursor, moveNum, listCode);
|
| | | recordCursor = recordCursor + 50;
|
| | |
|
| | | if (list != null) {
|
| | | executePushIOS(list, pushQueueRecord, recordCursor - 1);
|
| | | PushLogHelper.iosInfo("推送游标:" + recordCursor + "," + moveNum);
|
| | | }
|
| | | }
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | public void executePushIOS(List<DeviceTokenIOS> list, PushQueueRecord pushQueueRecord, long recordCursor) {
|
| | |
|
| | | String jsonContent = pushQueueRecord.getJsonContent();
|
| | | JSONObject json = JSONObject.fromObject(jsonContent);
|
| | |
|
| | | List<String> tokenList = new ArrayList<>();
|
| | |
|
| | | boolean ispush = false;
|
| | | List<Long> listNotPushId = null;
|
| | |
|
| | | Calendar now = Calendar.getInstance();
|
| | | int hour = now.get(Calendar.HOUR_OF_DAY);
|
| | | // if (hour >= 8 && hour < 20) {
|
| | | // ispush = true; // 可推送
|
| | | // } else {
|
| | | // listNotPushId = validateNotDisturb();
|
| | | // }
|
| | | |
| | | ispush=true;//TODO 处理消息免打扰
|
| | |
|
| | | for (DeviceTokenIOS ios : list) {
|
| | |
|
| | | if (!StringUtil.isNullOrEmpty(ios.getDeviceToken())) {
|
| | | if (!ispush && listNotPushId != null && listNotPushId.size() > 0) {
|
| | | Long uid = ios.getUid();
|
| | | if (uid != null && listNotPushId.contains(uid)) {
|
| | | continue; // 通知免打扰(20:00-24:00 / 00:00 -08:00)
|
| | | }
|
| | | }
|
| | | tokenList.add(ios.getDeviceToken());
|
| | | }
|
| | | }
|
| | |
|
| | | if (tokenList.size() > 0) {
|
| | | // 执行推送
|
| | | try {
|
| | | IOSPushUtil.executePushIOS(tokenList, json);
|
| | | } catch (Exception e) {
|
| | | e.printStackTrace();
|
| | | }
|
| | | }
|
| | | pushQueueRecord.setState(1);
|
| | | pushQueueRecord.setEndtime(new Date());
|
| | | pushQueueRecord.setRecordCursor(recordCursor);
|
| | |
|
| | | // 更新数据库
|
| | | pushQueueRecordMapper.updateByPrimaryKeySelective(pushQueueRecord);
|
| | | }
|
| | |
|
| | | @Override
|
| | | public void unBindUidAndDevice(String device) {
|
| | | if (StringUtil.isNullOrEmpty(device))
|
| | | return;
|
| | | DeviceTokenIOS deviceTokenIOS = deviceTokenIOSMapper.selectByDevice(device);
|
| | | if (device != null) {
|
| | | deviceTokenIOS.setUpdateTime(new Date());
|
| | | deviceTokenIOS.setUid(null);
|
| | | deviceTokenIOSMapper.updateByPrimaryKey(deviceTokenIOS);
|
| | | }
|
| | | }
|
| | |
|
| | | @Async("pushExecutor")
|
| | | @Override
|
| | | public void pushWEEX(Long uid, String title, String content, String weexUrl, String versionCodes)
|
| | | throws PushException {
|
| | | MessageInfo info = new MessageInfo();
|
| | | info.setTitle(title);
|
| | | info.setContent(content);
|
| | | info.setDescription(content);
|
| | | // IOS 全推
|
| | | if (uid == null || uid == 0) {
|
| | | addPushIOSQueue(info, weexUrl, PushTypeEnum.weex.getCode(), versionCodes);
|
| | | } else {
|
| | | List<DeviceTokenIOS> deviceTokenIosList = getDeviceTokenListByUid(uid, versionCodes);
|
| | | List<String> deviceTokenList = new ArrayList<>();
|
| | | if (deviceTokenIosList != null)
|
| | | for (DeviceTokenIOS ios : deviceTokenIosList) {
|
| | | deviceTokenList.add(ios.getDeviceToken());
|
| | | }
|
| | | try {
|
| | | IOSPushUtil.allPushIOS(deviceTokenList, info, weexUrl, PushTypeEnum.weex.getCode());
|
| | | } catch (Exception e) {
|
| | | PushLogHelper.iosError(e);
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | @Async("pushExecutor")
|
| | | @Override
|
| | | public void pushBaiChuanUrl(Long uid, String title, String content, String url, String versionCodes)
|
| | | throws PushException {
|
| | | MessageInfo info = new MessageInfo();
|
| | | info.setTitle(title);
|
| | | info.setContent(content);
|
| | | info.setDescription(content);
|
| | | // IOS 全推
|
| | | if (uid == null || uid == 0) {
|
| | | addPushIOSQueue(info, url, PushTypeEnum.baichuan.getCode(), versionCodes);
|
| | | } else {
|
| | | List<DeviceTokenIOS> deviceTokenIosList = getDeviceTokenListByUid(uid, versionCodes);
|
| | | List<String> deviceTokenList = new ArrayList<>();
|
| | | if (deviceTokenIosList != null)
|
| | | for (DeviceTokenIOS ios : deviceTokenIosList) {
|
| | | deviceTokenList.add(ios.getDeviceToken());
|
| | | }
|
| | | try {
|
| | | IOSPushUtil.allPushIOS(deviceTokenList, info, url, PushTypeEnum.baichuan.getCode());
|
| | | } catch (Exception e) {
|
| | | PushLogHelper.iosError(e);
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | /**
|
| | | * 通知免打扰(20:00-8:00)
|
| | | */
|
| | | public List<Long> validateNotDisturb() {
|
| | | return userCustomSettingsService.getCancelNoticeUsers();
|
| | | }
|
| | |
|
| | | /**
|
| | | * 通知免打扰(20:00-8:00)
|
| | | */
|
| | | public boolean validateNotDisturbSingle(Long uid) {
|
| | | Calendar now = Calendar.getInstance();
|
| | | int hour = now.get(Calendar.HOUR_OF_DAY);
|
| | | boolean ispush;
|
| | | if (hour >= 8 && hour < 20) {
|
| | | ispush = true; // 可推送
|
| | | } else {
|
| | | // 自定义设置 通知免打扰(20:00-24:00 / 00:00 -08:00)
|
| | | ispush = userCustomSettingsService.validateCancelNoticeByUid(uid);
|
| | | }
|
| | |
|
| | | return ispush;
|
| | | }
|
| | |
|
| | | @Async("pushExecutor")
|
| | | @Override
|
| | | public void pushWelfareCenter(Long uid, String title, String content, String versionCodes) throws PushException {
|
| | | MessageInfo info = new MessageInfo();
|
| | | info.setTitle(title);
|
| | | info.setContent(content);
|
| | | info.setDescription(content);
|
| | | // IOS 全推
|
| | | if (uid == null || uid == 0) {
|
| | | addPushIOSQueue(info, "", PushTypeEnum.welfare.getCode(), versionCodes);
|
| | | } else {
|
| | | if (!validateNotDisturbSingle(uid)) {
|
| | | return;
|
| | | }
|
| | | List<DeviceTokenIOS> deviceTokenIosList = getDeviceTokenListByUid(uid, versionCodes);
|
| | | List<String> deviceTokenList = new ArrayList<>();
|
| | | if (deviceTokenIosList != null)
|
| | | for (DeviceTokenIOS ios : deviceTokenIosList) {
|
| | | deviceTokenList.add(ios.getDeviceToken());
|
| | | }
|
| | | try {
|
| | | IOSPushUtil.allPushIOS(deviceTokenList, info, "", PushTypeEnum.welfare.getCode());
|
| | | } catch (Exception e) {
|
| | | PushLogHelper.iosError(e);
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | private List<Integer> convertVersionType(String versionCodes) {
|
| | | List<Integer> listVersionCode = null;
|
| | |
|
| | | if (versionCodes != null && versionCodes.trim().length() > 0) {
|
| | | List<String> listVersion = Arrays.asList(versionCodes.split(","));
|
| | | if (listVersion != null && listVersion.size() > 0) {
|
| | |
|
| | | listVersionCode = new ArrayList<Integer>();
|
| | | // 转换成功整型
|
| | | for (String version : listVersion) {
|
| | | if (version != null && version.trim().length() > 0) {
|
| | | listVersionCode.add(Integer.parseInt(version));
|
| | | }
|
| | | }
|
| | | }
|
| | | }
|
| | | return listVersionCode;
|
| | | }
|
| | |
|
| | | @Override
|
| | | public void pushUserSignInNotification(Long uid, String title, String content, String versions)
|
| | | throws PushException {
|
| | | MessageInfo info = new MessageInfo();
|
| | | info.setTitle(title);
|
| | | info.setContent(content);
|
| | | info.setDescription(content);
|
| | | // IOS 全推
|
| | | if (uid == null || uid == 0) {
|
| | | addPushIOSQueue(info, "", PushTypeEnum.signin.getCode(), versions);
|
| | | } else {
|
| | | List<DeviceTokenIOS> deviceTokenIosList = getDeviceTokenListByUid(uid, versions);
|
| | | List<String> deviceTokenList = new ArrayList<>();
|
| | | if (deviceTokenIosList != null)
|
| | | for (DeviceTokenIOS ios : deviceTokenIosList) {
|
| | | deviceTokenList.add(ios.getDeviceToken());
|
| | | }
|
| | | try {
|
| | | IOSPushUtil.allPushIOS(deviceTokenList, info, "", PushTypeEnum.signin.getCode());
|
| | | } catch (Exception e) {
|
| | | PushLogHelper.iosError(e);
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | }
|
| | | package com.yeshi.fanli.service.impl.push; |
| | | |
| | | import com.yeshi.fanli.dao.mybatis.push.DeviceTokenIOSMapper; |
| | | import com.yeshi.fanli.dao.mybatis.push.PushQueueRecordMapper; |
| | | import com.yeshi.fanli.dto.push.PushTypeEnum; |
| | | import com.yeshi.fanli.entity.SystemEnum; |
| | | import com.yeshi.fanli.entity.bus.user.AccountMessage; |
| | | import com.yeshi.fanli.entity.config.SystemConfigKeyEnum; |
| | | import com.yeshi.fanli.entity.push.DeviceTokenIOS; |
| | | import com.yeshi.fanli.entity.push.PushQueueRecord; |
| | | import com.yeshi.fanli.entity.system.SystemZnx; |
| | | import com.yeshi.fanli.entity.xinge.MessageInfo; |
| | | import com.yeshi.fanli.entity.xinge.PushRecord; |
| | | import com.yeshi.fanli.exception.push.PushException; |
| | | import com.yeshi.fanli.log.PushLogHelper; |
| | | import com.yeshi.fanli.service.inter.config.SystemConfigService; |
| | | import com.yeshi.fanli.service.inter.push.IOSPushService; |
| | | 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.rabbit.RabbitmqManager; |
| | | import com.yeshi.fanli.util.push.IOSPushUtil; |
| | | import net.sf.json.JSONObject; |
| | | import org.springframework.scheduling.annotation.Async; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.util.*; |
| | | |
| | | @Service |
| | | public class IOSPushServiceImpl implements IOSPushService { |
| | | |
| | | @Resource |
| | | private DeviceTokenIOSMapper deviceTokenIOSMapper; |
| | | |
| | | @Resource |
| | | private PushQueueRecordMapper pushQueueRecordMapper; |
| | | |
| | | @Resource |
| | | private UserCustomSettingsService userCustomSettingsService; |
| | | |
| | | @Resource |
| | | private SystemConfigService systemConfigService; |
| | | |
| | | @Resource |
| | | private RabbitmqManager rabbitmqManager; |
| | | |
| | | |
| | | @Async("pushExecutor") |
| | | @Override |
| | | public void pushGoods(Long uid, String auctionId, String title, String content, String versionCodes, SystemEnum system) |
| | | throws PushException { |
| | | |
| | | String url = "https://item.taobao.com/item.htm?id=" + auctionId; |
| | | JSONObject json = new JSONObject(); |
| | | json.put("id", auctionId); |
| | | json.put("type", "goodsdetail"); |
| | | json.put("miPushUrl", String.format("%s.ui.recommend.GoodsBrowserActivity", |
| | | systemConfigService.getValueCache(SystemConfigKeyEnum.androidBaseActivityName,system))); |
| | | |
| | | MessageInfo info = new MessageInfo(); |
| | | info.setTitle(title); |
| | | info.setContent(content); |
| | | info.setDescription(content); |
| | | info.setPackageName(systemConfigService.getValueCache(SystemConfigKeyEnum.androidPackageNames,system)); |
| | | info.setActivty(String.format("%s.ui.recommend.GoodsBrowserActivity", |
| | | systemConfigService.getValueCache(SystemConfigKeyEnum.androidBaseActivityName,system))); |
| | | |
| | | PushRecord pushRecord = new PushRecord(); |
| | | pushRecord.setState(1); |
| | | pushRecord.setType(PushTypeEnum.goodsdetail.getCode()); // 都成功 |
| | | pushRecord.setUrl(url); |
| | | pushRecord.setTitle(title); |
| | | pushRecord.setAppName(Constant.systemCommonConfig.getProjectChineseName()); |
| | | |
| | | if (uid == null || uid == 0) { |
| | | |
| | | addPushIOSQueue(info, url, PushTypeEnum.goodsdetail.getCode(), versionCodes,system); |
| | | |
| | | /* |
| | | * // 查询IOS所有设备号 // TODO 需要全推 List<String> deviceTokenList = |
| | | * getDeviceTokenList(1, 20000); // IOS 全推 ThreadUtil.run(new |
| | | * Runnable() { |
| | | * |
| | | * @Override public void run() { try { |
| | | * IOSPushUtil.allPushIOS(deviceTokenList, info, url, |
| | | * PushController.GOODS); } catch (Exception e) { |
| | | * PushLogHelper.iosError(e); |
| | | * |
| | | * } } }); |
| | | */ |
| | | } else { |
| | | if (!validateNotDisturbSingle(uid)) { |
| | | return; // 通知免打扰(20:00-24:00 / 00:00 -08:00) |
| | | } |
| | | |
| | | // IOS 单推 |
| | | List<DeviceTokenIOS> deviceTokenIosList = getDeviceTokenListByUid(uid, versionCodes); |
| | | |
| | | List<String> deviceTokenList = new ArrayList<>(); |
| | | if (deviceTokenIosList != null) |
| | | for (DeviceTokenIOS ios : deviceTokenIosList) { |
| | | deviceTokenList.add(ios.getDeviceToken()); |
| | | } |
| | | |
| | | try { |
| | | IOSPushUtil.allPushIOS(deviceTokenList, info, url, PushTypeEnum.goodsdetail.getCode(),systemConfigService.getValueCache(SystemConfigKeyEnum.iosPushCertPwd,system)); |
| | | } catch (Exception e) { |
| | | PushLogHelper.iosError(e); |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | @Async("pushExecutor") |
| | | @Override |
| | | public void pushUrl(Long uid, String url, String title, String content, String versionCodes, SystemEnum system) throws PushException { |
| | | JSONObject json = new JSONObject(); |
| | | json.put("url", url); |
| | | json.put("type", "url"); |
| | | json.put("webUrl", url); |
| | | json.put("miPushUrl", |
| | | String.format("%s.ui.BrowserActivity",systemConfigService.getValueCache(SystemConfigKeyEnum.androidBaseActivityName,system))); |
| | | |
| | | MessageInfo info = new MessageInfo(); |
| | | info.setTitle(title); |
| | | info.setContent(content); |
| | | info.setDescription(content); |
| | | // 小米推送网页 |
| | | info.setPackageName(systemConfigService.getValueCache(SystemConfigKeyEnum.androidPackageNames,system)); |
| | | info.setActivty( |
| | | String.format("%s.ui.BrowserActivity", systemConfigService.getValueCache(SystemConfigKeyEnum.androidBaseActivityName,system))); |
| | | |
| | | PushRecord pushRecord = new PushRecord(); |
| | | // IOS 全推 |
| | | if (uid == null || uid == 0) { |
| | | // TODO 需要全推 |
| | | |
| | | addPushIOSQueue(info, url, PushTypeEnum.url.getCode(), versionCodes,system); |
| | | |
| | | /* |
| | | * List<String> deviceTokenList = getDeviceTokenList(1, 1000); |
| | | * ThreadUtil.run(new Runnable() { |
| | | * |
| | | * @Override public void run() { try { |
| | | * |
| | | * IOSPushUtil.allPushIOS(deviceTokenList, info, url, |
| | | * PushController.URL); |
| | | * |
| | | * } catch (Exception e) { PushLogHelper.iosError(e); } } }); |
| | | */ |
| | | } else { |
| | | if (!validateNotDisturbSingle(uid)) { |
| | | return; // 通知免打扰(20:00-24:00 / 00:00 -08:00) |
| | | } |
| | | |
| | | List<DeviceTokenIOS> deviceTokenIosList = getDeviceTokenListByUid(uid, versionCodes); |
| | | List<String> deviceTokenList = new ArrayList<>(); |
| | | if (deviceTokenIosList != null) |
| | | for (DeviceTokenIOS ios : deviceTokenIosList) { |
| | | deviceTokenList.add(ios.getDeviceToken()); |
| | | } |
| | | try { |
| | | IOSPushUtil.allPushIOS(deviceTokenList, info, url, PushTypeEnum.url.getCode(),systemConfigService.getValueCache(SystemConfigKeyEnum.iosPushCertPwd,system)); |
| | | } catch (Exception e) { |
| | | PushLogHelper.iosError(e); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Async("pushExecutor") |
| | | @Override |
| | | public void pushZNX(Long uId, AccountMessage msg, SystemZnx systemZNX, String versionCodes, SystemEnum system) throws PushException { |
| | | MessageInfo info = new MessageInfo(); |
| | | info.setPackageName(systemConfigService.getValueCache(SystemConfigKeyEnum.androidPackageNames,system)); |
| | | |
| | | JSONObject contentJson = new JSONObject(); |
| | | contentJson.put("isOpen", 0); |
| | | contentJson.put("createTime", java.lang.System.currentTimeMillis()); |
| | | |
| | | /* 无uid , 广播 数据插入系统表 */ |
| | | if (systemZNX != null) { |
| | | info.setTitle(systemZNX.getTitle()); |
| | | info.setContent(systemZNX.getContent()); |
| | | contentJson.put("title", systemZNX.getTitle()); |
| | | contentJson.put("content", systemZNX.getContent()); |
| | | info.setDescription(systemZNX.getContent()); |
| | | |
| | | // 小米开始全推 |
| | | long id = systemZNX.getId(); |
| | | contentJson.put("id", id); |
| | | |
| | | JSONObject json = new JSONObject(); |
| | | json.put("type", "ZNX"); |
| | | json.put("content", contentJson); |
| | | json.put("miPushUrl", String.format("%s.ui.mine.AppMailDetailActivity", |
| | | systemConfigService.getValueCache(SystemConfigKeyEnum.androidBaseActivityName,system))); |
| | | |
| | | PushRecord pushRecord = new PushRecord(); |
| | | |
| | | // TODO 需要全推 |
| | | |
| | | addPushIOSQueue(info, id + "", PushTypeEnum.ZNX.getCode(), versionCodes,system); |
| | | |
| | | /* |
| | | * List<String> deviceTokenList = getDeviceTokenList(1, 1000); |
| | | * |
| | | * ThreadUtil.run(new Runnable() { |
| | | * |
| | | * @Override public void run() { try { |
| | | * IOSPushUtil.allPushIOS(deviceTokenList, info, id + "", |
| | | * PushController.ZNX); } catch (Exception e) { |
| | | * PushLogHelper.iosError(e); } |
| | | * |
| | | * } }); |
| | | */ |
| | | } else if (msg != null) { |
| | | |
| | | if (uId != null) { |
| | | if (!validateNotDisturbSingle(uId)) { |
| | | return; // 通知免打扰(20:00-24:00 / 00:00 -08:00) |
| | | } |
| | | } |
| | | |
| | | // 插入推送记录 |
| | | PushRecord pushRecord = new PushRecord(); |
| | | info.setTitle(msg.getTitle()); |
| | | info.setContent(msg.getContent()); |
| | | contentJson.put("title", msg.getTitle()); |
| | | contentJson.put("content", msg.getContent()); |
| | | info.setDescription(msg.getContent()); |
| | | |
| | | info.setAlias(uId + ""); |
| | | info.setPackageName(systemConfigService.getValueCache(SystemConfigKeyEnum.androidPackageNames,system)); |
| | | info.setActivty( |
| | | String.format("%s.ui.BrowserActivity",systemConfigService.getValueCache(SystemConfigKeyEnum.androidBaseActivityName,system))); |
| | | |
| | | contentJson.put("id", msg.getId() + ""); |
| | | |
| | | JSONObject json = new JSONObject(); |
| | | json.put("type", "ZNX"); |
| | | json.put("content", contentJson); |
| | | json.put("miPushUrl", String.format("%s.ui.mine.AppMailDetailActivity", |
| | | systemConfigService.getValueCache(SystemConfigKeyEnum.androidBaseActivityName,system))); |
| | | |
| | | List<DeviceTokenIOS> deviceTokenIosList = getDeviceTokenListByUid(msg.getUserInfo().getId(), versionCodes); |
| | | List<String> deviceTokenList = new ArrayList<>(); |
| | | if (deviceTokenIosList != null) |
| | | for (DeviceTokenIOS ios : deviceTokenIosList) { |
| | | deviceTokenList.add(ios.getDeviceToken()); |
| | | } |
| | | |
| | | // IOS 单推 |
| | | try { |
| | | IOSPushUtil.allPushIOS(deviceTokenList, info, "0", PushTypeEnum.ZNX.getCode(),systemConfigService.getValueCache(SystemConfigKeyEnum.iosPushCertPwd,system)); |
| | | } catch (Exception e) { |
| | | PushLogHelper.iosError(e); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Transactional |
| | | @Override |
| | | public void addDeviceToken(Long uid, int version, String deviceToken, String device) { |
| | | // 如果device为空就返回 |
| | | if (StringUtil.isNullOrEmpty(device) || StringUtil.isNullOrEmpty(deviceToken)) |
| | | return; |
| | | |
| | | // 判断device是否存在 |
| | | DeviceTokenIOS deviceTokenIos = deviceTokenIOSMapper.selectByDeviceForUpdate(device); |
| | | if (deviceTokenIos == null) { |
| | | deviceTokenIos = new DeviceTokenIOS(); |
| | | deviceTokenIos.setCreateTime(new Date()); |
| | | deviceTokenIos.setUpdateTime(new Date()); |
| | | deviceTokenIos.setDevice(device); |
| | | deviceTokenIos.setDeviceToken(deviceToken); |
| | | deviceTokenIos.setDeviceTokenMd5(StringUtil.Md5(deviceToken)); |
| | | deviceTokenIos.setUid(uid); |
| | | deviceTokenIos.setVersion(version); |
| | | deviceTokenIOSMapper.insertSelective(deviceTokenIos); |
| | | } else {// 更新devicetoken |
| | | DeviceTokenIOS updateDeviceTokenIOS = new DeviceTokenIOS(); |
| | | updateDeviceTokenIOS.setId(deviceTokenIos.getId()); |
| | | updateDeviceTokenIOS.setDeviceToken(deviceToken); |
| | | updateDeviceTokenIOS.setDeviceTokenMd5(StringUtil.Md5(deviceToken)); |
| | | updateDeviceTokenIOS.setUid(uid); |
| | | updateDeviceTokenIOS.setUpdateTime(new Date()); |
| | | deviceTokenIOSMapper.updateByPrimaryKeySelective(updateDeviceTokenIOS); |
| | | } |
| | | |
| | | } |
| | | |
| | | @Override |
| | | public List<DeviceTokenIOS> getDeviceTokenListByUid(Long uid, String versionCodes) throws PushException { |
| | | return deviceTokenIOSMapper.selectByUid(uid, convertVersionType(versionCodes)); |
| | | } |
| | | |
| | | @Override |
| | | public List<String> getDeviceTokenList(int page, int size) { |
| | | List<DeviceTokenIOS> list = deviceTokenIOSMapper.selectList((long) ((page - 1) * size), size, null); |
| | | List<String> tokenList = new ArrayList<>(); |
| | | for (DeviceTokenIOS ios : list) |
| | | if (!StringUtil.isNullOrEmpty(ios.getDeviceToken())) |
| | | tokenList.add(ios.getDeviceToken()); |
| | | return tokenList; |
| | | } |
| | | |
| | | @Override |
| | | public long getDeviceTokenCount() { |
| | | return deviceTokenIOSMapper.selectCount(); |
| | | } |
| | | |
| | | @Override |
| | | public void updateDeviceToken(DeviceTokenIOS deviceTokenIos) { |
| | | if (deviceTokenIos != null) { |
| | | deviceTokenIos.setUpdateTime(new Date()); |
| | | deviceTokenIOSMapper.updateByPrimaryKey(deviceTokenIos); |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public DeviceTokenIOS getDeviceTokenByDeviceToken(String deviceToken) { |
| | | return deviceTokenIOSMapper.selectByDeviceToken(deviceToken); |
| | | } |
| | | |
| | | /** |
| | | * 保存推送内容只队列中 |
| | | */ |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public void addPushIOSQueue(MessageInfo info, String url, int type, String versionCodes,SystemEnum system) throws PushException { |
| | | |
| | | if (Constant.IS_TEST) |
| | | return; |
| | | |
| | | try { |
| | | |
| | | JSONObject json = IOSPushUtil.getJSONObject(info, url, type); |
| | | |
| | | // 总条目 |
| | | long tokenCount = getDeviceTokenCount(); |
| | | |
| | | // 一个队列 1000 条 |
| | | long totalCount = 1000; |
| | | |
| | | // 每次执行条目 |
| | | int pushNum = 50; |
| | | |
| | | for (long i = 0; i < tokenCount + totalCount; ) { |
| | | |
| | | PushQueueRecord pushQueueRecord = new PushQueueRecord(); |
| | | pushQueueRecord.setSystem(system); |
| | | // 初始状态 |
| | | pushQueueRecord.setState(0); |
| | | // 发送内容 |
| | | pushQueueRecord.setJsonContent(json.toString()); |
| | | // 创建时间 |
| | | pushQueueRecord.setCreatetime(new Date()); |
| | | // 每次推送数量 |
| | | pushQueueRecord.setPushNum(pushNum); |
| | | // 推送端 IOS |
| | | pushQueueRecord.setType(1); |
| | | // 版本号 |
| | | pushQueueRecord.setVersions(versionCodes); |
| | | |
| | | if (tokenCount - i < totalCount) { |
| | | // 起始游标 |
| | | pushQueueRecord.setStartCursor(i); |
| | | // 结束游标 |
| | | pushQueueRecord.setEndCursor(tokenCount); |
| | | |
| | | // 存入数据库 |
| | | pushQueueRecordMapper.insert(pushQueueRecord); |
| | | |
| | | // 加入队列 |
| | | rabbitmqManager.addIOSPushMsg(pushQueueRecord); |
| | | |
| | | break; |
| | | |
| | | } else { |
| | | |
| | | // 起始游标 |
| | | pushQueueRecord.setStartCursor(i); |
| | | |
| | | long endCursor = (i + totalCount) - 1; |
| | | |
| | | // 结束游标 |
| | | pushQueueRecord.setEndCursor(endCursor); |
| | | |
| | | // 存入数据库 |
| | | pushQueueRecordMapper.insert(pushQueueRecord); |
| | | // 加入队列 |
| | | rabbitmqManager.addIOSPushMsg(pushQueueRecord); |
| | | } |
| | | |
| | | i += totalCount; |
| | | } |
| | | |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | |
| | | } |
| | | |
| | | /** |
| | | * 队列执行推送操作 |
| | | */ |
| | | @Override |
| | | public void readyPushIOS(PushQueueRecord pushQueueRecord) throws Exception { |
| | | |
| | | // 起始位置 |
| | | Long startCursor = pushQueueRecord.getStartCursor(); |
| | | // 结束位置 |
| | | Long endCursor = pushQueueRecord.getEndCursor(); |
| | | |
| | | if (startCursor == null && endCursor == null) { |
| | | return; |
| | | } |
| | | |
| | | // 推送的版本号 |
| | | String versions = pushQueueRecord.getVersions(); |
| | | List<Integer> listCode = convertVersionType(versions); |
| | | |
| | | int total = (int) (endCursor - startCursor); |
| | | |
| | | // 每次推送总条数 |
| | | int moveNum = pushQueueRecord.getPushNum(); |
| | | |
| | | int count = total / moveNum; |
| | | |
| | | if (total % moveNum > 0) { |
| | | count += 1; |
| | | } |
| | | |
| | | long recordCursor = startCursor; |
| | | |
| | | for (int i = 0; i < count; i++) { |
| | | |
| | | // 不足50个数据 |
| | | if (moveNum > total) { |
| | | moveNum = (int) (endCursor - startCursor); |
| | | List<DeviceTokenIOS> list = deviceTokenIOSMapper.selectList(startCursor, moveNum, listCode); |
| | | recordCursor = endCursor; |
| | | |
| | | if (list != null) { |
| | | executePushIOS(list, pushQueueRecord, recordCursor,pushQueueRecord.getSystem()); |
| | | PushLogHelper.iosInfo("推送游标:" + startCursor + "," + moveNum); |
| | | } |
| | | |
| | | } else { |
| | | |
| | | if (recordCursor + moveNum > endCursor) { |
| | | // System.out.println("recordCursorend:" +recordCursor); |
| | | moveNum = (int) (endCursor - recordCursor); |
| | | // System.out.println(moveNum); |
| | | List<DeviceTokenIOS> list = deviceTokenIOSMapper.selectList(recordCursor, moveNum, listCode); |
| | | if (list != null) { |
| | | executePushIOS(list, pushQueueRecord, endCursor,pushQueueRecord.getSystem()); |
| | | PushLogHelper.iosInfo("推送游标:" + recordCursor + "," + moveNum); |
| | | } |
| | | recordCursor = endCursor; |
| | | |
| | | } else { |
| | | List<DeviceTokenIOS> list = deviceTokenIOSMapper.selectList(recordCursor, moveNum, listCode); |
| | | recordCursor = recordCursor + 50; |
| | | |
| | | if (list != null) { |
| | | executePushIOS(list, pushQueueRecord, recordCursor - 1,pushQueueRecord.getSystem()); |
| | | PushLogHelper.iosInfo("推送游标:" + recordCursor + "," + moveNum); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | public void executePushIOS(List<DeviceTokenIOS> list, PushQueueRecord pushQueueRecord, long recordCursor,SystemEnum system) { |
| | | |
| | | String jsonContent = pushQueueRecord.getJsonContent(); |
| | | JSONObject json = JSONObject.fromObject(jsonContent); |
| | | |
| | | List<String> tokenList = new ArrayList<>(); |
| | | |
| | | boolean ispush = false; |
| | | List<Long> listNotPushId = null; |
| | | |
| | | Calendar now = Calendar.getInstance(); |
| | | int hour = now.get(Calendar.HOUR_OF_DAY); |
| | | // if (hour >= 8 && hour < 20) { |
| | | // ispush = true; // 可推送 |
| | | // } else { |
| | | // listNotPushId = validateNotDisturb(); |
| | | // } |
| | | |
| | | ispush = true;//TODO 处理消息免打扰 |
| | | |
| | | for (DeviceTokenIOS ios : list) { |
| | | |
| | | if (!StringUtil.isNullOrEmpty(ios.getDeviceToken())) { |
| | | if (!ispush && listNotPushId != null && listNotPushId.size() > 0) { |
| | | Long uid = ios.getUid(); |
| | | if (uid != null && listNotPushId.contains(uid)) { |
| | | continue; // 通知免打扰(20:00-24:00 / 00:00 -08:00) |
| | | } |
| | | } |
| | | tokenList.add(ios.getDeviceToken()); |
| | | } |
| | | } |
| | | |
| | | if (tokenList.size() > 0) { |
| | | // 执行推送 |
| | | try { |
| | | IOSPushUtil.executePushIOS(tokenList, json,systemConfigService.getValueCache(SystemConfigKeyEnum.iosPushCertPwd,system)); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | pushQueueRecord.setState(1); |
| | | pushQueueRecord.setEndtime(new Date()); |
| | | pushQueueRecord.setRecordCursor(recordCursor); |
| | | |
| | | // 更新数据库 |
| | | pushQueueRecordMapper.updateByPrimaryKeySelective(pushQueueRecord); |
| | | } |
| | | |
| | | @Override |
| | | public void unBindUidAndDevice(String device) { |
| | | if (StringUtil.isNullOrEmpty(device)) |
| | | return; |
| | | DeviceTokenIOS deviceTokenIOS = deviceTokenIOSMapper.selectByDevice(device); |
| | | if (device != null) { |
| | | deviceTokenIOS.setUpdateTime(new Date()); |
| | | deviceTokenIOS.setUid(null); |
| | | deviceTokenIOSMapper.updateByPrimaryKey(deviceTokenIOS); |
| | | } |
| | | } |
| | | |
| | | @Async("pushExecutor") |
| | | @Override |
| | | public void pushWEEX(Long uid, String title, String content, String weexUrl, String versionCodes, SystemEnum system) |
| | | throws PushException { |
| | | MessageInfo info = new MessageInfo(); |
| | | info.setTitle(title); |
| | | info.setContent(content); |
| | | info.setDescription(content); |
| | | // IOS 全推 |
| | | if (uid == null || uid == 0) { |
| | | addPushIOSQueue(info, weexUrl, PushTypeEnum.weex.getCode(), versionCodes,system); |
| | | } else { |
| | | List<DeviceTokenIOS> deviceTokenIosList = getDeviceTokenListByUid(uid, versionCodes); |
| | | List<String> deviceTokenList = new ArrayList<>(); |
| | | if (deviceTokenIosList != null) |
| | | for (DeviceTokenIOS ios : deviceTokenIosList) { |
| | | deviceTokenList.add(ios.getDeviceToken()); |
| | | } |
| | | try { |
| | | IOSPushUtil.allPushIOS(deviceTokenList, info, weexUrl, PushTypeEnum.weex.getCode(),systemConfigService.getValueCache(SystemConfigKeyEnum.iosPushCertPwd,system)); |
| | | } catch (Exception e) { |
| | | PushLogHelper.iosError(e); |
| | | } |
| | | } |
| | | } |
| | | |
| | | @Async("pushExecutor") |
| | | @Override |
| | | public void pushBaiChuanUrl(Long uid, String title, String content, String url, String versionCodes, SystemEnum system) |
| | | throws PushException { |
| | | MessageInfo info = new MessageInfo(); |
| | | info.setTitle(title); |
| | | info.setContent(content); |
| | | info.setDescription(content); |
| | | // IOS 全推 |
| | | if (uid == null || uid == 0) { |
| | | addPushIOSQueue(info, url, PushTypeEnum.baichuan.getCode(), versionCodes,system); |
| | | } else { |
| | | List<DeviceTokenIOS> deviceTokenIosList = getDeviceTokenListByUid(uid, versionCodes); |
| | | List<String> deviceTokenList = new ArrayList<>(); |
| | | if (deviceTokenIosList != null) |
| | | for (DeviceTokenIOS ios : deviceTokenIosList) { |
| | | deviceTokenList.add(ios.getDeviceToken()); |
| | | } |
| | | try { |
| | | IOSPushUtil.allPushIOS(deviceTokenList, info, url, PushTypeEnum.baichuan.getCode(),systemConfigService.getValueCache(SystemConfigKeyEnum.iosPushCertPwd,system)); |
| | | } catch (Exception e) { |
| | | PushLogHelper.iosError(e); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 通知免打扰(20:00-8:00) |
| | | */ |
| | | public List<Long> validateNotDisturb() { |
| | | return userCustomSettingsService.getCancelNoticeUsers(); |
| | | } |
| | | |
| | | /** |
| | | * 通知免打扰(20:00-8:00) |
| | | */ |
| | | public boolean validateNotDisturbSingle(Long uid) { |
| | | Calendar now = Calendar.getInstance(); |
| | | int hour = now.get(Calendar.HOUR_OF_DAY); |
| | | boolean ispush; |
| | | if (hour >= 8 && hour < 20) { |
| | | ispush = true; // 可推送 |
| | | } else { |
| | | // 自定义设置 通知免打扰(20:00-24:00 / 00:00 -08:00) |
| | | ispush = userCustomSettingsService.validateCancelNoticeByUid(uid); |
| | | } |
| | | |
| | | return ispush; |
| | | } |
| | | |
| | | @Async("pushExecutor") |
| | | @Override |
| | | public void pushWelfareCenter(Long uid, String title, String content, String versionCodes, SystemEnum system) throws PushException { |
| | | MessageInfo info = new MessageInfo(); |
| | | info.setTitle(title); |
| | | info.setContent(content); |
| | | info.setDescription(content); |
| | | // IOS 全推 |
| | | if (uid == null || uid == 0) { |
| | | addPushIOSQueue(info, "", PushTypeEnum.welfare.getCode(), versionCodes,system); |
| | | } else { |
| | | if (!validateNotDisturbSingle(uid)) { |
| | | return; |
| | | } |
| | | List<DeviceTokenIOS> deviceTokenIosList = getDeviceTokenListByUid(uid, versionCodes); |
| | | List<String> deviceTokenList = new ArrayList<>(); |
| | | if (deviceTokenIosList != null) |
| | | for (DeviceTokenIOS ios : deviceTokenIosList) { |
| | | deviceTokenList.add(ios.getDeviceToken()); |
| | | } |
| | | try { |
| | | IOSPushUtil.allPushIOS(deviceTokenList, info, "", PushTypeEnum.welfare.getCode(),systemConfigService.getValueCache(SystemConfigKeyEnum.iosPushCertPwd,system)); |
| | | } catch (Exception e) { |
| | | PushLogHelper.iosError(e); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private List<Integer> convertVersionType(String versionCodes) { |
| | | List<Integer> listVersionCode = null; |
| | | |
| | | if (versionCodes != null && versionCodes.trim().length() > 0) { |
| | | List<String> listVersion = Arrays.asList(versionCodes.split(",")); |
| | | if (listVersion != null && listVersion.size() > 0) { |
| | | |
| | | listVersionCode = new ArrayList<Integer>(); |
| | | // 转换成功整型 |
| | | for (String version : listVersion) { |
| | | if (version != null && version.trim().length() > 0) { |
| | | listVersionCode.add(Integer.parseInt(version)); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | return listVersionCode; |
| | | } |
| | | |
| | | @Override |
| | | public void pushUserSignInNotification(Long uid, String title, String content, String versions, SystemEnum system) |
| | | throws PushException { |
| | | MessageInfo info = new MessageInfo(); |
| | | info.setTitle(title); |
| | | info.setContent(content); |
| | | info.setDescription(content); |
| | | // IOS 全推 |
| | | if (uid == null || uid == 0) { |
| | | addPushIOSQueue(info, "", PushTypeEnum.signin.getCode(), versions,system); |
| | | } else { |
| | | List<DeviceTokenIOS> deviceTokenIosList = getDeviceTokenListByUid(uid, versions); |
| | | List<String> deviceTokenList = new ArrayList<>(); |
| | | if (deviceTokenIosList != null) |
| | | for (DeviceTokenIOS ios : deviceTokenIosList) { |
| | | deviceTokenList.add(ios.getDeviceToken()); |
| | | } |
| | | try { |
| | | IOSPushUtil.allPushIOS(deviceTokenList, info, "", PushTypeEnum.signin.getCode(),systemConfigService.getValueCache(SystemConfigKeyEnum.iosPushCertPwd,system)); |
| | | } catch (Exception e) { |
| | | PushLogHelper.iosError(e); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |